commit c24bea26871edfc446065201340f2d584b481409 Author: liyuchen Date: Thu Apr 16 16:41:34 2026 +0800 Initial commit: JCDP 教育培训管理系统 v54 - 系统管理模块(用户/角色/组织/权限/日志) - 教育培训计划管理模块 - 教育培训实施模块 - 考试管理模块 - 调研问卷管理模块 - 外派培训管理模块 - 年度培训总结模块 - 学习资源管理模块 - 任职资格管理模块 - 即时通讯模块 - APP 版本管理 - 统计分析模块(FineReport) - 代码审查标准和报告(CODE_REVIEW_GUIDE.md, CODE_REVIEW_REPORT.md) - 项目开发指南(PROJECT_GUIDE.md) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..019408a --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# IDE and Tool files +.idea/ +.vscode/ +*.iml +*.iws +*.ipr +.project +.classpath +.settings/ + +# Build output +*.class +*.jar +*.war +*.ear +*.log +logs/ + +# Temporary files +*.tmp +*.bak +*.swp +*~ +.DS_Store +Thumbs.db + +# Tool scripts (not needed in repo) +sync_gitea.py +temp_create_token.ps1 +gitea_token.txt + +# WorkBuddy local files +.codebuddy/ +.workbuddy/ + +# Runtime files +*.properties.backup +*.xml.backup diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000..a179213 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Created-By: IntelliJ IDEA +Built-By: Administrator +Build-Jdk: 1.8.0_202 + diff --git a/WEB-INF/applicationContext.xml b/WEB-INF/applicationContext.xml new file mode 100644 index 0000000..99fcbf3 --- /dev/null +++ b/WEB-INF/applicationContext.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/classes/META-INF/education-train.kotlin_module b/WEB-INF/classes/META-INF/education-train.kotlin_module new file mode 100644 index 0000000..a49347a Binary files /dev/null and b/WEB-INF/classes/META-INF/education-train.kotlin_module differ diff --git a/WEB-INF/classes/WebDB.properties b/WEB-INF/classes/WebDB.properties new file mode 100644 index 0000000..8f60812 --- /dev/null +++ b/WEB-INF/classes/WebDB.properties @@ -0,0 +1,24 @@ +#���ݿ��������� +ormMappingPath=/WEB-INF/mapping +prefix.[dbtype,url,username,password,poolConfig...] + +jcdp.db.dbtype=mysql +jcdp.db.url=jdbc:mysql://10.55.68.235:3306/etms?useUnicode=true&characterEncoding=UTF-8&useSSL=false +#jcdp.db.url=jdbc:mysql://10.55.68.234:3306/etms?useUnicode=true&characterEncoding=UTF-8&useSSL=false +#jcdp.db.url=jdbc:mysql://172.19.68.188:3306/etms +#jcdp.db.url=jdbc:mysql://localhost:3306/etms?useSSL=false&useUnicode=true&characterEncoding=utf-8 +jcdp.db.username=root +jcdp.db.password=root +jcdp.db.poolConfig=config/dbPool.properties + +#app�������� +#JCDP���з�ʽ��debug-����ģʽ��release-����ģʽ +jcdp.runMode=release + +#��������������;���ָ� +mvc.controllerBasePackage=com.cetc54.jcdp.web.controller +mvc.viewBasePath=/ + +#Spring ���� +spring.profiles.active=default + diff --git a/WEB-INF/classes/com/cetc54/jcdp/conf/spring/AuthConfigurer.class b/WEB-INF/classes/com/cetc54/jcdp/conf/spring/AuthConfigurer.class new file mode 100644 index 0000000..f170225 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/conf/spring/AuthConfigurer.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/conf/spring/SysConfigurer.class b/WEB-INF/classes/com/cetc54/jcdp/conf/spring/SysConfigurer.class new file mode 100644 index 0000000..4e60ba8 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/conf/spring/SysConfigurer.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/conf/spring/SysParamConfigurer.class b/WEB-INF/classes/com/cetc54/jcdp/conf/spring/SysParamConfigurer.class new file mode 100644 index 0000000..3737819 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/conf/spring/SysParamConfigurer.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/ChatMonitor$1.class b/WEB-INF/classes/com/cetc54/jcdp/web/ChatMonitor$1.class new file mode 100644 index 0000000..3a5b3f2 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/ChatMonitor$1.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/ChatMonitor.class b/WEB-INF/classes/com/cetc54/jcdp/web/ChatMonitor.class new file mode 100644 index 0000000..113b3c4 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/ChatMonitor.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/InboxController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/InboxController.class new file mode 100644 index 0000000..4205ebd Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/InboxController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/IndexController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/IndexController.class new file mode 100644 index 0000000..b33658d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/IndexController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/SsoController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/SsoController.class new file mode 100644 index 0000000..76294fa Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/SsoController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/TaskController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/TaskController.class new file mode 100644 index 0000000..1743cbf Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/TaskController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/VersionController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/VersionController.class new file mode 100644 index 0000000..c4aa608 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/VersionController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/AppVersionController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/AppVersionController.class new file mode 100644 index 0000000..eb01f91 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/AppVersionController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatAppsController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatAppsController.class new file mode 100644 index 0000000..6be069b Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatAppsController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatController.class new file mode 100644 index 0000000..e9d20ef Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatGroupController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatGroupController.class new file mode 100644 index 0000000..794d0de Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/chat/ChatGroupController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/CategoryController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/CategoryController.class new file mode 100644 index 0000000..d5ada4b Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/CategoryController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/DictController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/DictController.class new file mode 100644 index 0000000..b96caee Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/DictController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/DictItemController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/DictItemController.class new file mode 100644 index 0000000..590c359 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/DictItemController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/SysParameterController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/SysParameterController.class new file mode 100644 index 0000000..ac2ca84 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/dict/SysParameterController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamController.class new file mode 100644 index 0000000..7dcbd8e Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamResultController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamResultController.class new file mode 100644 index 0000000..e7598f2 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamResultController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamScoreController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamScoreController.class new file mode 100644 index 0000000..37c6090 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExamScoreController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExampaperController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExampaperController.class new file mode 100644 index 0000000..4c4642f Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ExampaperController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/QuestionController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/QuestionController.class new file mode 100644 index 0000000..601b4af Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/QuestionController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ResearchExamController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ResearchExamController.class new file mode 100644 index 0000000..07f8c0a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ResearchExamController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ResearchExampaperController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ResearchExampaperController.class new file mode 100644 index 0000000..db34645 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/exam/ResearchExampaperController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/feedback/FeedbackController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/feedback/FeedbackController.class new file mode 100644 index 0000000..06efe35 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/feedback/FeedbackController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/groups/GroupsController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/groups/GroupsController.class new file mode 100644 index 0000000..f4346b2 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/groups/GroupsController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/log/LogController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/log/LogController.class new file mode 100644 index 0000000..bfdb4ae Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/log/LogController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/log/SessionController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/log/SessionController.class new file mode 100644 index 0000000..1148aa2 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/log/SessionController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/module/ModuleController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/module/ModuleController.class new file mode 100644 index 0000000..ea5617c Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/module/ModuleController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/personalcenter/MyLaunchController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/personalcenter/MyLaunchController.class new file mode 100644 index 0000000..346f3f1 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/personalcenter/MyLaunchController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/personalcenter/MyManageController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/personalcenter/MyManageController.class new file mode 100644 index 0000000..88de72f Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/personalcenter/MyManageController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/qualification/QualificationController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/qualification/QualificationController.class new file mode 100644 index 0000000..3f6a852 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/qualification/QualificationController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/qualification/QualificationJobController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/qualification/QualificationJobController.class new file mode 100644 index 0000000..5b694f0 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/qualification/QualificationJobController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/research/ResearchController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/research/ResearchController.class new file mode 100644 index 0000000..efddbc5 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/research/ResearchController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileAdminController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileAdminController.class new file mode 100644 index 0000000..f532a6a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileAdminController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileCheckController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileCheckController.class new file mode 100644 index 0000000..30493bf Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileCheckController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileController.class new file mode 100644 index 0000000..e792bce Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileLeaderController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileLeaderController.class new file mode 100644 index 0000000..cc0a9e3 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/resource/FileLeaderController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/role/RoleController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/role/RoleController.class new file mode 100644 index 0000000..5a01a40 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/role/RoleController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/toolkit/IconController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/toolkit/IconController.class new file mode 100644 index 0000000..0eaa5e8 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/toolkit/IconController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/CreateClassController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/CreateClassController.class new file mode 100644 index 0000000..ec3fa4d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/CreateClassController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/TrainFileController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/TrainFileController.class new file mode 100644 index 0000000..00fec39 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/TrainFileController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/TrainSpController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/TrainSpController.class new file mode 100644 index 0000000..90900ab Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/TrainSpController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanAdminController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanAdminController.class new file mode 100644 index 0000000..1620ab6 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanAdminController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanChangeController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanChangeController.class new file mode 100644 index 0000000..88c5573 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanChangeController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanController.class new file mode 100644 index 0000000..92644fb Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanGroupController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanGroupController.class new file mode 100644 index 0000000..327c75a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanGroupController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanLdSpController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanLdSpController.class new file mode 100644 index 0000000..cca57b9 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanLdSpController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanRLSpController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanRLSpController.class new file mode 100644 index 0000000..d88aca8 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanRLSpController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanYJGLYSpController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanYJGLYSpController.class new file mode 100644 index 0000000..470a4fe Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplan/GroupInPlanYJGLYSpController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGAdminController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGAdminController.class new file mode 100644 index 0000000..b9e7d09 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGAdminController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGDoneController.class new file mode 100644 index 0000000..36d85f9 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGLdSpController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGLdSpController.class new file mode 100644 index 0000000..16021fb Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanBGLdSpController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanGroupBGController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanGroupBGController.class new file mode 100644 index 0000000..bdc68d5 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupinplanbg/GroupInPlanGroupBGController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanBmLdController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanBmLdController.class new file mode 100644 index 0000000..7d88e49 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanBmLdController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanController.class new file mode 100644 index 0000000..4a122f4 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanDoneController.class new file mode 100644 index 0000000..09b747d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanRLController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanRLController.class new file mode 100644 index 0000000..baef996 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanRLController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanSJGLYController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanSJGLYController.class new file mode 100644 index 0000000..d1b8065 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanSJGLYController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanSLDController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanSLDController.class new file mode 100644 index 0000000..3f7bf1d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/groupoutplan/GroupOutPlanSLDController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstituteGroupController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstituteGroupController.class new file mode 100644 index 0000000..2e1e680 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstituteGroupController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstituteGroupLdController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstituteGroupLdController.class new file mode 100644 index 0000000..ac79ac6 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstituteGroupLdController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanChangeController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanChangeController.class new file mode 100644 index 0000000..eb20c86 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanChangeController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanController.class new file mode 100644 index 0000000..546fc7f Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanDoneController.class new file mode 100644 index 0000000..1f9c94c Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanFController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanFController.class new file mode 100644 index 0000000..ecceecf Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanFController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanQueryController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanQueryController.class new file mode 100644 index 0000000..cc45c21 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanQueryController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanReGroupController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanReGroupController.class new file mode 100644 index 0000000..fa055f3 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanReGroupController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanReSumController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanReSumController.class new file mode 100644 index 0000000..a3716dc Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanReSumController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanResearchController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanResearchController.class new file mode 100644 index 0000000..21dfdc8 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanResearchController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanSummaryController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanSummaryController.class new file mode 100644 index 0000000..51ddbe9 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplan/InstitutePlanSummaryController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGAdminController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGAdminController.class new file mode 100644 index 0000000..f2a5beb Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGAdminController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGController.class new file mode 100644 index 0000000..0ff5ea6 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGDoneController.class new file mode 100644 index 0000000..a472b71 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGLdSpController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGLdSpController.class new file mode 100644 index 0000000..26bc418 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/instituteplanbg/InstitutePlanFBGLdSpController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainController.class new file mode 100644 index 0000000..c859a92 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteController.class new file mode 100644 index 0000000..4d9e76e Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteDoneController.class new file mode 100644 index 0000000..f29ae98 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteLdController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteLdController.class new file mode 100644 index 0000000..fa91686 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteLdController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteSjController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteSjController.class new file mode 100644 index 0000000..ea31aa0 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDeleteSjController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDoneController.class new file mode 100644 index 0000000..79e1783 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainLdController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainLdController.class new file mode 100644 index 0000000..65c574c Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainLdController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjController.class new file mode 100644 index 0000000..ad7962a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjDoneController.class new file mode 100644 index 0000000..7d0d47b Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjLdController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjLdController.class new file mode 100644 index 0000000..a16c9bf Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjLdController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjSjController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjSjController.class new file mode 100644 index 0000000..8089d36 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainPxdjSjController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainRlController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainRlController.class new file mode 100644 index 0000000..f80ad67 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainRlController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainSjController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainSjController.class new file mode 100644 index 0000000..27aad47 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainSjController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainSldController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainSldController.class new file mode 100644 index 0000000..67e21b0 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainSldController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainZybController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainZybController.class new file mode 100644 index 0000000..0b34cdf Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainZybController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainZybLdController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainZybLdController.class new file mode 100644 index 0000000..a8fdb08 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/outtrain/OutTrainZybLdController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/AssessAuditInfoController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/AssessAuditInfoController.class new file mode 100644 index 0000000..a0c1ad7 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/AssessAuditInfoController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/CreateClassAuditController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/CreateClassAuditController.class new file mode 100644 index 0000000..f1a13b0 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/CreateClassAuditController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCertificateController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCertificateController.class new file mode 100644 index 0000000..dbd1418 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCertificateController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCheckReplaceStuController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCheckReplaceStuController.class new file mode 100644 index 0000000..ab91084 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCheckReplaceStuController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassFinishController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassFinishController.class new file mode 100644 index 0000000..70e6ecc Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassFinishController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassOpenerController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassOpenerController.class new file mode 100644 index 0000000..82a1979 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassOpenerController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassUserController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassUserController.class new file mode 100644 index 0000000..d50807c Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdClassUserController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCreateClassController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCreateClassController.class new file mode 100644 index 0000000..6b48562 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdCreateClassController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdMyCertificateController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdMyCertificateController.class new file mode 100644 index 0000000..9f4961e Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdMyCertificateController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdMyCourseController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdMyCourseController.class new file mode 100644 index 0000000..4af361b Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdMyCourseController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdOpenerConfirmController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdOpenerConfirmController.class new file mode 100644 index 0000000..e3c6dfe Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdOpenerConfirmController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdQueryTrainFlowController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdQueryTrainFlowController.class new file mode 100644 index 0000000..c6d5c65 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdQueryTrainFlowController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdQueryTrainTotalController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdQueryTrainTotalController.class new file mode 100644 index 0000000..bf0a1b7 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdQueryTrainTotalController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdReplaceStudentController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdReplaceStudentController.class new file mode 100644 index 0000000..e9a7a08 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PdReplaceStudentController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PlanToDoPgController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PlanToDoPgController.class new file mode 100644 index 0000000..3bedfea Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PlanToDoPgController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PlanToDoPgDtController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PlanToDoPgDtController.class new file mode 100644 index 0000000..7f76d84 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/PlanToDoPgDtController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/SuperiorUnitTrainController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/SuperiorUnitTrainController.class new file mode 100644 index 0000000..a5d63a7 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/SuperiorUnitTrainController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/UpTrainStaticController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/UpTrainStaticController.class new file mode 100644 index 0000000..53588bd Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/UpTrainStaticController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/UptrainController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/UptrainController.class new file mode 100644 index 0000000..c22bc8a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/UptrainController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/teacherInformationController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/teacherInformationController.class new file mode 100644 index 0000000..4b40933 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/plantodo/teacherInformationController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryController.class new file mode 100644 index 0000000..45d8d6a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupAdminController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupAdminController.class new file mode 100644 index 0000000..fa150d1 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupAdminController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupController.class new file mode 100644 index 0000000..a41ed19 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupDoneController.class new file mode 100644 index 0000000..5cb396b Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupLdSpController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupLdSpController.class new file mode 100644 index 0000000..94865e7 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryGroupLdSpController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstController.class new file mode 100644 index 0000000..a96e277 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupAdminController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupAdminController.class new file mode 100644 index 0000000..138a713 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupAdminController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupController.class new file mode 100644 index 0000000..19b6d41 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupDoneController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupDoneController.class new file mode 100644 index 0000000..a64dda7 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupDoneController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupLdSpController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupLdSpController.class new file mode 100644 index 0000000..8b11188 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/train/yearsummary/YearSummaryIstGroupLdSpController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/InitController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/InitController.class new file mode 100644 index 0000000..77df7fe Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/InitController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/StatusUpdateController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/StatusUpdateController.class new file mode 100644 index 0000000..21514f1 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/StatusUpdateController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TimingTaskController$1.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TimingTaskController$1.class new file mode 100644 index 0000000..a41ba46 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TimingTaskController$1.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TimingTaskController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TimingTaskController.class new file mode 100644 index 0000000..b1e46d6 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TimingTaskController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TrainWebController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TrainWebController.class new file mode 100644 index 0000000..f83aedd Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/trainweb/TrainWebController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/OrgController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/OrgController.class new file mode 100644 index 0000000..a3529cf Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/OrgController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/UserController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/UserController.class new file mode 100644 index 0000000..20945a2 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/UserController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/UserProfileController.class b/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/UserProfileController.class new file mode 100644 index 0000000..ffc7421 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/controller/user/UserProfileController.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/filter/AuthFilter$1.class b/WEB-INF/classes/com/cetc54/jcdp/web/filter/AuthFilter$1.class new file mode 100644 index 0000000..3cbd041 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/filter/AuthFilter$1.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/filter/AuthFilter.class b/WEB-INF/classes/com/cetc54/jcdp/web/filter/AuthFilter.class new file mode 100644 index 0000000..7a37849 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/filter/AuthFilter.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/filter/LogFilter.class b/WEB-INF/classes/com/cetc54/jcdp/web/filter/LogFilter.class new file mode 100644 index 0000000..f283eea Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/filter/LogFilter.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/filter/SessionListener.class b/WEB-INF/classes/com/cetc54/jcdp/web/filter/SessionListener.class new file mode 100644 index 0000000..bd9a3d3 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/filter/SessionListener.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/AppVersionServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/AppVersionServiceImpl.class new file mode 100644 index 0000000..ef7eae2 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/AppVersionServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatAppsServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatAppsServiceImpl.class new file mode 100644 index 0000000..1172adc Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatAppsServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatFriendsApplyServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatFriendsApplyServiceImpl.class new file mode 100644 index 0000000..f4dab80 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatFriendsApplyServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatFriendsServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatFriendsServiceImpl.class new file mode 100644 index 0000000..51675db Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatFriendsServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatGroupMembersServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatGroupMembersServiceImpl.class new file mode 100644 index 0000000..e1a0050 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatGroupMembersServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatGroupsServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatGroupsServiceImpl.class new file mode 100644 index 0000000..35d6c0d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatGroupsServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatServiceImpl.class new file mode 100644 index 0000000..60bb3e8 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/ChatServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/MqServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/MqServiceImpl.class new file mode 100644 index 0000000..a818880 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/chat/MqServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/CategoryServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/CategoryServiceImpl.class new file mode 100644 index 0000000..8a831fb Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/CategoryServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/DictItemServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/DictItemServiceImpl.class new file mode 100644 index 0000000..df74aa8 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/DictItemServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/DictServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/DictServiceImpl.class new file mode 100644 index 0000000..4ceb292 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/DictServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/SysParameterService.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/SysParameterService.class new file mode 100644 index 0000000..c74aa17 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/dict/SysParameterService.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExamServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExamServiceImpl.class new file mode 100644 index 0000000..e41d768 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExamServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperClassCourseServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperClassCourseServiceImpl.class new file mode 100644 index 0000000..8063344 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperClassCourseServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperServiceImpl.class new file mode 100644 index 0000000..2b59038 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampapereditServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampapereditServiceImpl.class new file mode 100644 index 0000000..0589ab4 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampapereditServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperlimitationServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperlimitationServiceImpl.class new file mode 100644 index 0000000..b38e6ac Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/ExampaperlimitationServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/QuestionServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/QuestionServiceImpl.class new file mode 100644 index 0000000..594442d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/exam/QuestionServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/feedback/FeedbackServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/feedback/FeedbackServiceImpl.class new file mode 100644 index 0000000..2541667 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/feedback/FeedbackServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/groups/GroupsServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/groups/GroupsServiceImpl.class new file mode 100644 index 0000000..6d45cb7 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/groups/GroupsServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/log/LogServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/log/LogServiceImpl.class new file mode 100644 index 0000000..b35b96f Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/log/LogServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/log/SessionServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/log/SessionServiceImpl.class new file mode 100644 index 0000000..c13eb92 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/log/SessionServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/message/MessageReceiverServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/message/MessageReceiverServiceImpl.class new file mode 100644 index 0000000..4cb9017 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/message/MessageReceiverServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/message/MessageServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/message/MessageServiceImpl.class new file mode 100644 index 0000000..82829bc Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/message/MessageServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ControllerService$1.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ControllerService$1.class new file mode 100644 index 0000000..1e865d9 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ControllerService$1.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ControllerService.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ControllerService.class new file mode 100644 index 0000000..273e6b5 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ControllerService.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ModuleServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ModuleServiceImpl.class new file mode 100644 index 0000000..93c54e2 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/module/ModuleServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/module/UserModuleServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/module/UserModuleServiceImpl.class new file mode 100644 index 0000000..d6e4192 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/module/UserModuleServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/personalcenter/MyLaunchServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/personalcenter/MyLaunchServiceImpl.class new file mode 100644 index 0000000..5bfdf36 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/personalcenter/MyLaunchServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/personalcenter/MyManageServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/personalcenter/MyManageServiceImpl.class new file mode 100644 index 0000000..021b56d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/personalcenter/MyManageServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/qualification/QualificationServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/qualification/QualificationServiceImpl.class new file mode 100644 index 0000000..a242c53 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/qualification/QualificationServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/qualification/QualificationjobServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/qualification/QualificationjobServiceImpl.class new file mode 100644 index 0000000..00a0356 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/qualification/QualificationjobServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchComboxServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchComboxServiceImpl.class new file mode 100644 index 0000000..cfad10a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchComboxServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchExamServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchExamServiceImpl.class new file mode 100644 index 0000000..683fd21 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchExamServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchServiceImpl.class new file mode 100644 index 0000000..6bc8da3 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/research/ResearchServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileAdminLeaderImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileAdminLeaderImpl.class new file mode 100644 index 0000000..f724148 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileAdminLeaderImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileImpl.class new file mode 100644 index 0000000..8f809d8 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileLimitationImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileLimitationImpl.class new file mode 100644 index 0000000..fe7dce9 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/FileLimitationImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/ShortcutService.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/ShortcutService.class new file mode 100644 index 0000000..1c18989 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/resource/ShortcutService.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/role/RoleModuleServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/role/RoleModuleServiceImpl.class new file mode 100644 index 0000000..d5268d1 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/role/RoleModuleServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/role/RoleServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/role/RoleServiceImpl.class new file mode 100644 index 0000000..42b965e Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/role/RoleServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/role/UserRoleServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/role/UserRoleServiceImpl.class new file mode 100644 index 0000000..4b16c7f Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/role/UserRoleServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/task/TaskOperServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/task/TaskOperServiceImpl.class new file mode 100644 index 0000000..352e00a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/task/TaskOperServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/task/TaskServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/task/TaskServiceImpl.class new file mode 100644 index 0000000..7e2cafc Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/task/TaskServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/toolkit/IconService.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/toolkit/IconService.class new file mode 100644 index 0000000..40f46bb Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/toolkit/IconService.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/ClassServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/ClassServiceImpl.class new file mode 100644 index 0000000..afc514e Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/ClassServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/TrainSpServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/TrainSpServiceImpl.class new file mode 100644 index 0000000..edfc301 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/TrainSpServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanGroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanGroupServiceImpl.class new file mode 100644 index 0000000..0167ceb Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanGroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanGroup_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanGroup_KcServiceImpl.class new file mode 100644 index 0000000..5fe6e4d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanGroup_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanServiceImpl.class new file mode 100644 index 0000000..1b02f85 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlanServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlan_GroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlan_GroupServiceImpl.class new file mode 100644 index 0000000..6d357dc Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplan/GroupInPlan_GroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplanbg/GroupInPlanGroupBgServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplanbg/GroupInPlanGroupBgServiceImpl.class new file mode 100644 index 0000000..284b9a9 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplanbg/GroupInPlanGroupBgServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplanbg/GroupInPlanGroupbg_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplanbg/GroupInPlanGroupbg_KcServiceImpl.class new file mode 100644 index 0000000..7393610 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupinplanbg/GroupInPlanGroupbg_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupoutplan/GroupOutPlanServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupoutplan/GroupOutPlanServiceImpl.class new file mode 100644 index 0000000..9e64ad6 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupoutplan/GroupOutPlanServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupoutplan/GroupOutPlan_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupoutplan/GroupOutPlan_KcServiceImpl.class new file mode 100644 index 0000000..66def39 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/groupoutplan/GroupOutPlan_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDyServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDyServiceImpl.class new file mode 100644 index 0000000..35d768a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDyServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_GroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_GroupServiceImpl.class new file mode 100644 index 0000000..2a36b19 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_GroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_KcServiceImpl.class new file mode 100644 index 0000000..fc0ae47 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_KcselServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_KcselServiceImpl.class new file mode 100644 index 0000000..b6b6548 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteDy_KcselServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteGroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteGroupServiceImpl.class new file mode 100644 index 0000000..e884661 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteGroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteGroup_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteGroup_KcServiceImpl.class new file mode 100644 index 0000000..9b12bcf Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstituteGroup_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanFServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanFServiceImpl.class new file mode 100644 index 0000000..743d9ee Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanFServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanF_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanF_KcServiceImpl.class new file mode 100644 index 0000000..b342185 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanF_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanServiceImpl.class new file mode 100644 index 0000000..8a58e6b Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanYServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanYServiceImpl.class new file mode 100644 index 0000000..7d0edc6 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanYServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanY_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanY_KcServiceImpl.class new file mode 100644 index 0000000..f75de57 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlanY_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlan_GroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlan_GroupServiceImpl.class new file mode 100644 index 0000000..6122784 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplan/InstitutePlan_GroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplanbg/InstitutePlanFBgServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplanbg/InstitutePlanFBgServiceImpl.class new file mode 100644 index 0000000..0c6bb5c Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplanbg/InstitutePlanFBgServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplanbg/InstitutePlanFbg_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplanbg/InstitutePlanFbg_KcServiceImpl.class new file mode 100644 index 0000000..c01ff9e Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/instituteplanbg/InstitutePlanFbg_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainDeleteServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainDeleteServiceImpl.class new file mode 100644 index 0000000..3c9249d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainDeleteServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainPxdjServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainPxdjServiceImpl.class new file mode 100644 index 0000000..ca9b725 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainPxdjServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainServiceImpl.class new file mode 100644 index 0000000..89eabe0 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainxyServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainxyServiceImpl.class new file mode 100644 index 0000000..aae3834 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/outtrain/OutTrainxyServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/CreateClass_GroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/CreateClass_GroupServiceImpl.class new file mode 100644 index 0000000..9413cf4 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/CreateClass_GroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/CreateClass_UserServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/CreateClass_UserServiceImpl.class new file mode 100644 index 0000000..d03960d Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/CreateClass_UserServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdBaseUserServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdBaseUserServiceImpl.class new file mode 100644 index 0000000..22832a0 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdBaseUserServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdCertificateServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdCertificateServiceImpl.class new file mode 100644 index 0000000..ed840ae Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdCertificateServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdClassFinishServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdClassFinishServiceImpl.class new file mode 100644 index 0000000..585c22e Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdClassFinishServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdClassOpenerServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdClassOpenerServiceImpl.class new file mode 100644 index 0000000..8cfea32 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdClassOpenerServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdCreateClassServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdCreateClassServiceImpl.class new file mode 100644 index 0000000..80f42b8 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdCreateClassServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdReplaceStudentServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdReplaceStudentServiceImpl.class new file mode 100644 index 0000000..0bf6149 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdReplaceStudentServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdTrainEvaluationInfoServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdTrainEvaluationInfoServiceImpl.class new file mode 100644 index 0000000..2870a14 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PdTrainEvaluationInfoServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgDtServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgDtServiceImpl.class new file mode 100644 index 0000000..2be900c Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgDtServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgDtdaServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgDtdaServiceImpl.class new file mode 100644 index 0000000..7e7f320 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgDtdaServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgServiceImpl.class new file mode 100644 index 0000000..ae70b56 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgwjServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgwjServiceImpl.class new file mode 100644 index 0000000..84acab9 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/PlanToDoPgwjServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/SuperiorUnitTrainServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/SuperiorUnitTrainServiceImpl.class new file mode 100644 index 0000000..673050c Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/SuperiorUnitTrainServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/SuperiorUnitTrainStudentServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/SuperiorUnitTrainStudentServiceImpl.class new file mode 100644 index 0000000..c478785 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/SuperiorUnitTrainStudentServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/UptrainPersonServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/UptrainPersonServiceImpl.class new file mode 100644 index 0000000..8701535 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/UptrainPersonServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/UptrainServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/UptrainServiceImpl.class new file mode 100644 index 0000000..5dd3776 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/plantodo/UptrainServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/trainkc/TrainKcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/trainkc/TrainKcServiceImpl.class new file mode 100644 index 0000000..d9a3c29 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/trainkc/TrainKcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryGroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryGroupServiceImpl.class new file mode 100644 index 0000000..844f79f Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryGroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryGroup_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryGroup_KcServiceImpl.class new file mode 100644 index 0000000..87f7f02 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryGroup_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstGroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstGroupServiceImpl.class new file mode 100644 index 0000000..29cde2a Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstGroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstGroup_KcServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstGroup_KcServiceImpl.class new file mode 100644 index 0000000..8727c28 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstGroup_KcServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstServiceImpl.class new file mode 100644 index 0000000..d906ef4 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIstServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIst_GroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIst_GroupServiceImpl.class new file mode 100644 index 0000000..7dee9e3 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryIst_GroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryServiceImpl.class new file mode 100644 index 0000000..1975dd2 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummaryServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummary_GroupServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummary_GroupServiceImpl.class new file mode 100644 index 0000000..5b1eee3 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/train/yearsummary/YearSummary_GroupServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/user/OrgServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/user/OrgServiceImpl.class new file mode 100644 index 0000000..7b22ba6 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/user/OrgServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserExtServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserExtServiceImpl.class new file mode 100644 index 0000000..10e77d1 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserExtServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserOrgServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserOrgServiceImpl.class new file mode 100644 index 0000000..7f5483b Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserOrgServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserServiceImpl.class new file mode 100644 index 0000000..e92e5f3 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/service/user/UserServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/services/ETMSServiceImpl.class b/WEB-INF/classes/com/cetc54/jcdp/web/services/ETMSServiceImpl.class new file mode 100644 index 0000000..7ed0732 Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/services/ETMSServiceImpl.class differ diff --git a/WEB-INF/classes/com/cetc54/jcdp/web/services/IETMSService.class b/WEB-INF/classes/com/cetc54/jcdp/web/services/IETMSService.class new file mode 100644 index 0000000..243405f Binary files /dev/null and b/WEB-INF/classes/com/cetc54/jcdp/web/services/IETMSService.class differ diff --git a/WEB-INF/classes/config/com.cetc54.mvc.properties b/WEB-INF/classes/config/com.cetc54.mvc.properties new file mode 100644 index 0000000..1934022 --- /dev/null +++ b/WEB-INF/classes/config/com.cetc54.mvc.properties @@ -0,0 +1,6 @@ +#控制器包名,“;”分隔 +mvc.controllerBasePackage=com.cetc54.jcdp.web.controller +#初始参数 key=value;key1=value1; +mvc.initparam=ormMappingPath=/WEB-INF/mapping; +#控制器包名,“;”分隔 +mvc.plugin=com.cetc54.jcdp.core.plugin.SystemPlugin;com.cetc54.jcdp.core.plugin.OrmMapping;com.cetc54.jcdp.core.helper.ControllerHelper; \ No newline at end of file diff --git a/WEB-INF/classes/config/dbPool.properties b/WEB-INF/classes/config/dbPool.properties new file mode 100644 index 0000000..896e97c --- /dev/null +++ b/WEB-INF/classes/config/dbPool.properties @@ -0,0 +1,35 @@ +filters=log4j,stat + +#最大连接池数量 +maxActive=5000 +#最小连接池数量 +minIdle=10 +#初始化时建立物理连接的个数 +initialSize=1 +#获取连接时最大等待时间,单位毫秒 +maxWait=60000 + +timeBetweenEvictionRunsMills=60000 +minEvictableIdleTimeMillis=300000 + +#在获得连接后检测其可用性 +# hsqldb - "select 1 from INFORMATION_SCHEMA.SYSTEM_USERS" +# Oracle - "select 1 from dual" +# DB2 - "select 1 from sysibm.sysdummy1" +# mysql - "select 1" +validationQuery=select 1 +testWhileldle=true +testOnBorrow=false +testOnReturn=false +#打开PSCache,并且指定每个连接上PSCache的大小 + +#如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。分库分表较多的数据库,建议配置为false。 +poolPreparedStatements=false +maxOpenPreparedStatements=20 + +#对于长时间不使用的连接强制关闭 +removeAbandoned=true +#超过30分钟开始关闭空闲连接 +removeAbandonedTimeout=1800 +#将当前关闭动作记录到日志 +logAbandoned=true \ No newline at end of file diff --git a/WEB-INF/classes/config/log4j.properties b/WEB-INF/classes/config/log4j.properties new file mode 100644 index 0000000..b9a4437 --- /dev/null +++ b/WEB-INF/classes/config/log4j.properties @@ -0,0 +1,29 @@ +log4j.rootCategory=TRACE,stdout,logfile + +log4j.logger.com.cetc54.framework=ERROR +log4j.logger.com.cetc54.jcdp=ERROR + +#数据库连接池设置 +log4j.logger.druid.sql=ERROR +log4j.logger.druid.sql.DataSource=ERROR +log4j.logger.druid.sql.Connection=ERROR +log4j.logger.druid.sql.Statement=ERROR +log4j.logger.druid.sql.ResultSet=ERROR + +log4j.logger.java.sql=ERROR,stdout + + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [Class:%C{1}->Thread:%t] %m %n + +#log4j.appender.logfile=org.apache.log4j.RollingFileAppender +#log4j.appender.logfile.MaxFileSize=10MB +#log4j.appender.logfile.MaxBackupIndex=100 +log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender +log4j.appender.logfile.DatePattern='.'yyyy-MM-dd'.log' +log4j.appender.logfile.encoding=UTF-8 +log4j.appender.logfile.layout=org.apache.log4j.PatternLayout +log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [Class:%C->Thread:%t] %m %n +log4j.appender.logfile.File=${workdir}logs/jcdp.log + diff --git a/WEB-INF/classes/config/log4j.release.properties b/WEB-INF/classes/config/log4j.release.properties new file mode 100644 index 0000000..e5595b4 --- /dev/null +++ b/WEB-INF/classes/config/log4j.release.properties @@ -0,0 +1,13 @@ +log4j.rootCategory=logfile + +log4j.logger.com.cetc54.framework=ERROR +log4j.logger.com.cetc54.jcdp=ERROR +log4j.logger.com.cetc54.app=ERROR + +log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender +log4j.appender.logfile.DatePattern='.'yyyy-MM-dd'.log' +log4j.appender.logfile.encoding=UTF-8 +log4j.appender.logfile.layout=org.apache.log4j.PatternLayout +log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p [Class:%C->Thread:%t] %m %n +log4j.appender.logfile.File=${workdir}logs/jcdp.log + diff --git a/WEB-INF/classes/db/etms.sql b/WEB-INF/classes/db/etms.sql new file mode 100644 index 0000000..9f15f9a --- /dev/null +++ b/WEB-INF/classes/db/etms.sql @@ -0,0 +1,7895 @@ +/* + Navicat Premium Data Transfer + + Source Server : edu + Source Server Type : MySQL + Source Server Version : 50717 + Source Host : 10.55.68.235:3306 + Source Schema : etms + + Target Server Type : MySQL + Target Server Version : 50717 + File Encoding : 65001 + + Date: 28/08/2019 17:01:37 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for act_app_appdef +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_appdef`; +CREATE TABLE `act_app_appdef` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REV_` int(11) NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `VERSION_` int(11) NOT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_APP_DEF_DPLY`(`DEPLOYMENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_APP_DEF_DPLY` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_app_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_app_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_databasechangelog`; +CREATE TABLE `act_app_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DATEEXECUTED` datetime(0) NULL, + `ORDEREXECUTED` int(11) NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_app_databasechangelog +-- ---------------------------- +INSERT INTO `act_app_databasechangelog` VALUES ('1', 'flowable', 'org/flowable/app/db/liquibase/flowable-app-db-changelog.xml', '2019-07-04 16:53:35', 1, 'EXECUTED', '8:496fc778bdf2ab13f2e1926d0e63e0a2', 'createTable tableName=ACT_APP_DEPLOYMENT; createTable tableName=ACT_APP_DEPLOYMENT_RESOURCE; addForeignKeyConstraint baseTableName=ACT_APP_DEPLOYMENT_RESOURCE, constraintName=ACT_FK_APP_RSRC_DPL, referencedTableName=ACT_APP_DEPLOYMENT; createIndex...', '', NULL, '3.6.1', NULL, NULL, '6986085155'); + +-- ---------------------------- +-- Table structure for act_app_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_deployment`; +CREATE TABLE `act_app_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(0) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_app_deployment_resource +-- ---------------------------- +DROP TABLE IF EXISTS `act_app_deployment_resource`; +CREATE TABLE `act_app_deployment_resource` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_APP_RSRC_DPL`(`DEPLOYMENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_APP_RSRC_DPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_app_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_casedef +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_casedef`; +CREATE TABLE `act_cmmn_casedef` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REV_` int(11) NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `VERSION_` int(11) NOT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `HAS_GRAPHICAL_NOTATION_` bit(1) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `HAS_START_FORM_KEY_` bit(1) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_CASE_DEF_DPLY`(`DEPLOYMENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_CASE_DEF_DPLY` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_cmmn_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_databasechangelog`; +CREATE TABLE `act_cmmn_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DATEEXECUTED` datetime(0) NULL, + `ORDEREXECUTED` int(11) NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_cmmn_databasechangelog +-- ---------------------------- +INSERT INTO `act_cmmn_databasechangelog` VALUES ('1', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2019-07-04 16:53:31', 1, 'EXECUTED', '8:8b4b922d90b05ff27483abefc9597aa6', 'createTable tableName=ACT_CMMN_DEPLOYMENT; createTable tableName=ACT_CMMN_DEPLOYMENT_RESOURCE; addForeignKeyConstraint baseTableName=ACT_CMMN_DEPLOYMENT_RESOURCE, constraintName=ACT_FK_CMMN_RSRC_DPL, referencedTableName=ACT_CMMN_DEPLOYMENT; create...', '', NULL, '3.6.1', NULL, NULL, '6986084965'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2019-07-04 16:53:31', 3, 'EXECUTED', '8:65e39b3d385706bb261cbeffe7533cbe', 'addColumn tableName=ACT_CMMN_CASEDEF; addColumn tableName=ACT_CMMN_DEPLOYMENT_RESOURCE; addColumn tableName=ACT_CMMN_RU_CASE_INST; addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST', '', NULL, '3.6.1', NULL, NULL, '6986084965'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('3', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2019-07-04 16:53:32', 5, 'EXECUTED', '8:c01f6e802b49436b4489040da3012359', 'addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_RU_CASE_INST; createIndex indexName=ACT_IDX_PLAN_ITEM_STAGE_INST, tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_RU_PLAN_ITEM_INST; addColumn tableNam...', '', NULL, '3.6.1', NULL, NULL, '6986084965'); +INSERT INTO `act_cmmn_databasechangelog` VALUES ('4', 'flowable', 'org/flowable/cmmn/db/liquibase/flowable-cmmn-db-changelog.xml', '2019-07-04 16:53:32', 7, 'EXECUTED', '8:e40d29cb79345b7fb5afd38a7f0ba8fc', 'createTable tableName=ACT_CMMN_HI_PLAN_ITEM_INST; addColumn tableName=ACT_CMMN_RU_MIL_INST; addColumn tableName=ACT_CMMN_HI_MIL_INST', '', NULL, '3.6.1', NULL, NULL, '6986084965'); + +-- ---------------------------- +-- Table structure for act_cmmn_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_deployment`; +CREATE TABLE `act_cmmn_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(0) NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_deployment_resource +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_deployment_resource`; +CREATE TABLE `act_cmmn_deployment_resource` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + `GENERATED_` bit(1) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_CMMN_RSRC_DPL`(`DEPLOYMENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_CMMN_RSRC_DPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_cmmn_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_hi_case_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_hi_case_inst`; +CREATE TABLE `act_cmmn_hi_case_inst` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REV_` int(11) NOT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `PARENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STATE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `START_TIME_` datetime(0) NULL DEFAULT NULL, + `END_TIME_` datetime(0) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CALLBACK_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CALLBACK_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_hi_mil_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_hi_mil_inst`; +CREATE TABLE `act_cmmn_hi_mil_inst` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REV_` int(11) NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TIME_STAMP_` datetime(0) NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_hi_plan_item_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_hi_plan_item_inst`; +CREATE TABLE `act_cmmn_hi_plan_item_inst` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REV_` int(11) NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STATE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STAGE_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `IS_STAGE_` bit(1) NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ITEM_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ITEM_DEFINITION_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CREATED_TIME_` datetime(0) NULL DEFAULT NULL, + `LAST_AVAILABLE_TIME_` datetime(0) NULL DEFAULT NULL, + `LAST_ENABLED_TIME_` datetime(0) NULL DEFAULT NULL, + `LAST_DISABLED_TIME_` datetime(0) NULL DEFAULT NULL, + `LAST_STARTED_TIME_` datetime(0) NULL DEFAULT NULL, + `LAST_SUSPENDED_TIME_` datetime(0) NULL DEFAULT NULL, + `COMPLETED_TIME_` datetime(0) NULL DEFAULT NULL, + `OCCURRED_TIME_` datetime(0) NULL DEFAULT NULL, + `TERMINATED_TIME_` datetime(0) NULL DEFAULT NULL, + `EXIT_TIME_` datetime(0) NULL DEFAULT NULL, + `ENDED_TIME_` datetime(0) NULL DEFAULT NULL, + `LAST_UPDATED_TIME_` datetime(0) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `REFERENCE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `REFERENCE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_ru_case_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_ru_case_inst`; +CREATE TABLE `act_cmmn_ru_case_inst` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REV_` int(11) NOT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `PARENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STATE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `START_TIME_` datetime(0) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CALLBACK_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CALLBACK_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + `LOCK_TIME_` datetime(0) NULL DEFAULT NULL, + `IS_COMPLETEABLE_` bit(1) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_CASE_INST_CASE_DEF`(`CASE_DEF_ID_`) USING BTREE, + INDEX `ACT_IDX_CASE_INST_PARENT`(`PARENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_CASE_INST_CASE_DEF` FOREIGN KEY (`CASE_DEF_ID_`) REFERENCES `act_cmmn_casedef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_ru_mil_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_ru_mil_inst`; +CREATE TABLE `act_cmmn_ru_mil_inst` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TIME_STAMP_` datetime(0) NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_MIL_CASE_DEF`(`CASE_DEF_ID_`) USING BTREE, + INDEX `ACT_IDX_MIL_CASE_INST`(`CASE_INST_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_MIL_CASE_DEF` FOREIGN KEY (`CASE_DEF_ID_`) REFERENCES `act_cmmn_casedef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MIL_CASE_INST` FOREIGN KEY (`CASE_INST_ID_`) REFERENCES `act_cmmn_ru_case_inst` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_ru_plan_item_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_ru_plan_item_inst`; +CREATE TABLE `act_cmmn_ru_plan_item_inst` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REV_` int(11) NOT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STAGE_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `IS_STAGE_` bit(1) NULL DEFAULT NULL, + `ELEMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `STATE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `START_TIME_` datetime(0) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `REFERENCE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `REFERENCE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '', + `ITEM_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ITEM_DEFINITION_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `IS_COMPLETEABLE_` bit(1) NULL DEFAULT NULL, + `IS_COUNT_ENABLED_` bit(1) NULL DEFAULT NULL, + `VAR_COUNT_` int(11) NULL DEFAULT NULL, + `SENTRY_PART_INST_COUNT_` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_PLAN_ITEM_CASE_DEF`(`CASE_DEF_ID_`) USING BTREE, + INDEX `ACT_IDX_PLAN_ITEM_CASE_INST`(`CASE_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_PLAN_ITEM_STAGE_INST`(`STAGE_INST_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_PLAN_ITEM_CASE_DEF` FOREIGN KEY (`CASE_DEF_ID_`) REFERENCES `act_cmmn_casedef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_PLAN_ITEM_CASE_INST` FOREIGN KEY (`CASE_INST_ID_`) REFERENCES `act_cmmn_ru_case_inst` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_cmmn_ru_sentry_part_inst +-- ---------------------------- +DROP TABLE IF EXISTS `act_cmmn_ru_sentry_part_inst`; +CREATE TABLE `act_cmmn_ru_sentry_part_inst` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `REV_` int(11) NOT NULL, + `CASE_DEF_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CASE_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `PLAN_ITEM_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ON_PART_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `IF_PART_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TIME_STAMP_` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_SENTRY_CASE_DEF`(`CASE_DEF_ID_`) USING BTREE, + INDEX `ACT_IDX_SENTRY_CASE_INST`(`CASE_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_SENTRY_PLAN_ITEM`(`PLAN_ITEM_INST_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_SENTRY_CASE_DEF` FOREIGN KEY (`CASE_DEF_ID_`) REFERENCES `act_cmmn_casedef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SENTRY_CASE_INST` FOREIGN KEY (`CASE_INST_ID_`) REFERENCES `act_cmmn_ru_case_inst` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SENTRY_PLAN_ITEM` FOREIGN KEY (`PLAN_ITEM_INST_ID_`) REFERENCES `act_cmmn_ru_plan_item_inst` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_co_content_item +-- ---------------------------- +DROP TABLE IF EXISTS `act_co_content_item`; +CREATE TABLE `act_co_content_item` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `MIME_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TASK_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTENT_STORE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTENT_STORE_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `FIELD_` varchar(400) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTENT_AVAILABLE_` bit(1) NULL DEFAULT b'0', + `CREATED_` timestamp(6) NULL DEFAULT NULL, + `CREATED_BY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LAST_MODIFIED_` timestamp(6) NULL DEFAULT NULL, + `LAST_MODIFIED_BY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTENT_SIZE_` bigint(20) NULL DEFAULT 0, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `idx_contitem_taskid`(`TASK_ID_`) USING BTREE, + INDEX `idx_contitem_procid`(`PROC_INST_ID_`) USING BTREE, + INDEX `idx_contitem_scope`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_co_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_co_databasechangelog`; +CREATE TABLE `act_co_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DATEEXECUTED` datetime(0) NULL, + `ORDEREXECUTED` int(11) NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_co_databasechangelog +-- ---------------------------- +INSERT INTO `act_co_databasechangelog` VALUES ('1', 'activiti', 'org/flowable/content/db/liquibase/flowable-content-db-changelog.xml', '2019-07-04 16:53:33', 1, 'EXECUTED', '8:7644d7165cfe799200a2abdd3419e8b6', 'createTable tableName=ACT_CO_CONTENT_ITEM; createIndex indexName=idx_contitem_taskid, tableName=ACT_CO_CONTENT_ITEM; createIndex indexName=idx_contitem_procid, tableName=ACT_CO_CONTENT_ITEM', '', NULL, '3.6.1', NULL, NULL, '6986085125'); +INSERT INTO `act_co_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/content/db/liquibase/flowable-content-db-changelog.xml', '2019-07-04 16:53:33', 3, 'EXECUTED', '8:fe7b11ac7dbbf9c43006b23bbab60bab', 'addColumn tableName=ACT_CO_CONTENT_ITEM; createIndex indexName=idx_contitem_scope, tableName=ACT_CO_CONTENT_ITEM', '', NULL, '3.6.1', NULL, NULL, '6986085125'); + +-- ---------------------------- +-- Table structure for act_dmn_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_databasechangelog`; +CREATE TABLE `act_dmn_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DATEEXECUTED` datetime(0) NULL, + `ORDEREXECUTED` int(11) NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_dmn_databasechangelog +-- ---------------------------- +INSERT INTO `act_dmn_databasechangelog` VALUES ('1', 'activiti', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2019-07-04 16:53:32', 1, 'EXECUTED', '8:c8701f1c71018b55029f450b2e9a10a1', 'createTable tableName=ACT_DMN_DEPLOYMENT; createTable tableName=ACT_DMN_DEPLOYMENT_RESOURCE; createTable tableName=ACT_DMN_DECISION_TABLE', '', NULL, '3.6.1', NULL, NULL, '6986085036'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2019-07-04 16:53:32', 3, 'EXECUTED', '8:47f94b27feb7df8a30d4e338c7bd5fb8', 'createTable tableName=ACT_DMN_HI_DECISION_EXECUTION', '', NULL, '3.6.1', NULL, NULL, '6986085036'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('3', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2019-07-04 16:53:32', 5, 'EXECUTED', '8:ac17eae89fbdccb6e08daf3c7797b579', 'addColumn tableName=ACT_DMN_HI_DECISION_EXECUTION', '', NULL, '3.6.1', NULL, NULL, '6986085036'); +INSERT INTO `act_dmn_databasechangelog` VALUES ('4', 'flowable', 'org/flowable/dmn/db/liquibase/flowable-dmn-db-changelog.xml', '2019-07-04 16:53:32', 7, 'EXECUTED', '8:f73aabc4529e7292c2942073d1cff6f9', 'dropColumn columnName=PARENT_DEPLOYMENT_ID_, tableName=ACT_DMN_DECISION_TABLE', '', NULL, '3.6.1', NULL, NULL, '6986085036'); + +-- ---------------------------- +-- Table structure for act_dmn_decision_table +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_decision_table`; +CREATE TABLE `act_dmn_decision_table` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `VERSION_` int(11) NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_dmn_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_deployment`; +CREATE TABLE `act_dmn_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(0) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_dmn_deployment_resource +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_deployment_resource`; +CREATE TABLE `act_dmn_deployment_resource` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_dmn_hi_decision_execution +-- ---------------------------- +DROP TABLE IF EXISTS `act_dmn_hi_decision_execution`; +CREATE TABLE `act_dmn_hi_decision_execution` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DECISION_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `START_TIME_` datetime(0) NULL DEFAULT NULL, + `END_TIME_` datetime(0) NULL DEFAULT NULL, + `INSTANCE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ACTIVITY_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `FAILED_` bit(1) NULL DEFAULT b'0', + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `EXECUTION_JSON_` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_evt_log +-- ---------------------------- +DROP TABLE IF EXISTS `act_evt_log`; +CREATE TABLE `act_evt_log` ( + `LOG_NR_` bigint(20) NOT NULL AUTO_INCREMENT, + `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DATA_` longblob NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + `IS_PROCESSED_` tinyint(4) NULL DEFAULT 0, + PRIMARY KEY (`LOG_NR_`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_fo_databasechangelog +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_databasechangelog`; +CREATE TABLE `act_fo_databasechangelog` ( + `ID` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `AUTHOR` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `FILENAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DATEEXECUTED` datetime(0) NULL, + `ORDEREXECUTED` int(11) NOT NULL, + `EXECTYPE` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `MD5SUM` varchar(35) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `COMMENTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TAG` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LIQUIBASE` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CONTEXTS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `LABELS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_fo_databasechangelog +-- ---------------------------- +INSERT INTO `act_fo_databasechangelog` VALUES ('1', 'activiti', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2019-07-04 16:53:33', 1, 'EXECUTED', '8:033ebf9380889aed7c453927ecc3250d', 'createTable tableName=ACT_FO_FORM_DEPLOYMENT; createTable tableName=ACT_FO_FORM_RESOURCE; createTable tableName=ACT_FO_FORM_DEFINITION; createTable tableName=ACT_FO_FORM_INSTANCE', '', NULL, '3.6.1', NULL, NULL, '6986085091'); +INSERT INTO `act_fo_databasechangelog` VALUES ('2', 'flowable', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2019-07-04 16:53:33', 3, 'EXECUTED', '8:986365ceb40445ce3b27a8e6b40f159b', 'addColumn tableName=ACT_FO_FORM_INSTANCE', '', NULL, '3.6.1', NULL, NULL, '6986085091'); +INSERT INTO `act_fo_databasechangelog` VALUES ('3', 'flowable', 'org/flowable/form/db/liquibase/flowable-form-db-changelog.xml', '2019-07-04 16:53:33', 5, 'EXECUTED', '8:abf482518ceb09830ef674e52c06bf15', 'dropColumn columnName=PARENT_DEPLOYMENT_ID_, tableName=ACT_FO_FORM_DEFINITION', '', NULL, '3.6.1', NULL, NULL, '6986085091'); + +-- ---------------------------- +-- Table structure for act_fo_form_definition +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_form_definition`; +CREATE TABLE `act_fo_form_definition` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `VERSION_` int(11) NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DESCRIPTION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_fo_form_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_form_deployment`; +CREATE TABLE `act_fo_form_deployment` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOY_TIME_` datetime(0) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_fo_form_instance +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_form_instance`; +CREATE TABLE `act_fo_form_instance` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `FORM_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `TASK_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `SUBMITTED_DATE_` datetime(0) NULL DEFAULT NULL, + `SUBMITTED_BY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `FORM_VALUES_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_fo_form_resource +-- ---------------------------- +DROP TABLE IF EXISTS `act_fo_form_resource`; +CREATE TABLE `act_fo_form_resource` ( + `ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `RESOURCE_BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_ge_bytearray +-- ---------------------------- +DROP TABLE IF EXISTS `act_ge_bytearray`; +CREATE TABLE `act_ge_bytearray` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `BYTES_` longblob NULL, + `GENERATED_` tinyint(4) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_BYTEARR_DEPL`(`DEPLOYMENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_BYTEARR_DEPL` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_ge_bytearray +-- ---------------------------- +INSERT INTO `act_ge_bytearray` VALUES ('10002', 1, 'BMJHW.bpmn20.xml', '10001', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E666C6F7761626C652E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D22424D4A485722206E616D653D22E983A8E997A8E7BAA7E8AEA1E58892E5A496E8AEA1E58892E588B6E5AE9A2220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D2273746172744576656E7431223E3C2F73746172744576656E743E0D0A202020203C656E644576656E742069643D227369642D38443743383533302D413843372D343141322D383734462D434437304144314646333846223E3C2F656E644576656E743E0D0A202020203C757365725461736B2069643D227369642D33413834303334412D434635452D343139432D384430342D30433537433939453435333722206E616D653D22E983A8E997A8E9A286E5AFBCE5AEA1E689B92220666C6F7761626C653A63616E64696461746547726F7570733D222F747261696E2F67726F75704F7574506C616E2F67726F7570737050616765223E3C2F757365725461736B3E0D0A202020203C6578636C7573697665476174657761792069643D227369642D43453233314535332D303745412D343035342D393941342D323830434639313439453734223E3C2F6578636C7573697665476174657761793E0D0A202020203C73657175656E6365466C6F772069643D227369642D42373436424431362D323638352D343342392D424231362D3335343734413436363043442220736F757263655265663D2273746172744576656E743122207461726765745265663D227369642D30413241303444302D324145412D344542322D413146322D433832394444323144354338223E3C2F73657175656E6365466C6F773E0D0A202020203C757365725461736B2069643D227369642D42393141303731362D433137392D344135442D424233382D35464144434438413739334122206E616D653D22E68980E7BAA7E59FB9E8AEADE7AEA1E79086E59198E5AEA1E6A0B82220666C6F7761626C653A63616E64696461746547726F7570733D222F747261696E2F67726F75704F7574506C616E2F61646D696E737050616765223E3C2F757365725461736B3E0D0A202020203C757365725461736B2069643D227369642D30413241303444302D324145412D344542322D413146322D43383239444432314435433822206E616D653D22E983A8E997A8E7AEA1E79086E59198E5A1ABE58699223E3C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D31383145413230352D363839312D343932452D384346352D4131373446313232413743332220736F757263655265663D227369642D30413241303444302D324145412D344542322D413146322D43383239444432314435433822207461726765745265663D227369642D33413834303334412D434635452D343139432D384430342D304335374339394534353337223E3C2F73657175656E6365466C6F773E0D0A202020203C757365725461736B2069643D227369642D44353241363432432D313931412D344338382D383637352D32353332443645303842373222206E616D653D22E983A8E997A8E4B8BBE7AEA1E68980E9A286E5AFBCE5AEA1E6A0B82220666C6F7761626C653A63616E64696461746547726F7570733D222F747261696E2F67726F75704F7574506C616E2F6C6561646572737050616765223E3C2F757365725461736B3E0D0A202020203C757365725461736B2069643D227369642D36374439304637432D353946312D344136302D393945332D43353937363545463244463722206E616D653D22E4BABAE58A9BE8B584E6BA90E983A8E9A286E5AFBCE5AEA1E6A0B82220666C6F7761626C653A63616E64696461746547726F7570733D222F747261696E2F67726F75704F7574506C616E2F6872737050616765223E3C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D35343338324134392D383233312D343234372D383734302D34373931353744343441373822206E616D653D22E9A9B3E59B9E2220736F757263655265663D227369642D33413834303334412D434635452D343139432D384430342D30433537433939453435333722207461726765745265663D227369642D30413241303444302D324145412D344542322D413146322D433832394444323144354338223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B7370726573756C743D3D2766616C7365277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D31313145313941382D444431332D343532332D423138432D33393444303042323333363622206E616D653D22E9A9B3E59B9E2220736F757263655265663D227369642D42393141303731362D433137392D344135442D424233382D35464144434438413739334122207461726765745265663D227369642D30413241303444302D324145412D344542322D413146322D433832394444323144354338223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B7370726573756C743D3D2766616C7365277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D35333930454430382D314630312D344242312D393037302D34333144454442303533364322206E616D653D22E9A9B3E59B9E2220736F757263655265663D227369642D44353241363432432D313931412D344338382D383637352D32353332443645303842373222207461726765745265663D227369642D30413241303444302D324145412D344542322D413146322D433832394444323144354338223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B7370726573756C743D3D2766616C7365277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D35303034363143432D343337432D343739372D413337422D34433742343737384341313222206E616D653D22E9A9B3E59B9E2220736F757263655265663D227369642D36374439304637432D353946312D344136302D393945332D43353937363545463244463722207461726765745265663D227369642D30413241303444302D324145412D344542322D413146322D433832394444323144354338223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B7370726573756C743D3D2766616C7365277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D46304536393546442D313335392D343746462D423037442D33363631453042454446344222206E616D653D22E9809AE8BF872220736F757263655265663D227369642D33413834303334412D434635452D343139432D384430342D30433537433939453435333722207461726765745265663D227369642D43453233314535332D303745412D343035342D393941342D323830434639313439453734223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B207370726573756C74203D3D2074727565207D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D33453543364433462D434133462D344343332D394133412D41363842433034463543454222206E616D653D22E9809AE8BF872220736F757263655265663D227369642D42393141303731362D433137392D344135442D424233382D35464144434438413739334122207461726765745265663D227369642D44353241363432432D313931412D344338382D383637352D323533324436453038423732223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B7370726573756C743D3D2774727565277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D44323637333033312D463636422D343936392D423130352D32304231384446453746314222206E616D653D22E9809AE8BF872220736F757263655265663D227369642D44353241363432432D313931412D344338382D383637352D32353332443645303842373222207461726765745265663D227369642D36374439304637432D353946312D344136302D393945332D433539373635454632444637223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B7370726573756C743D3D2774727565277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D37313742313934382D314236392D343930452D394344352D30434246393630343543334622206E616D653D22E9809AE8BF872220736F757263655265663D227369642D36374439304637432D353946312D344136302D393945332D43353937363545463244463722207461726765745265663D227369642D38443743383533302D413843372D343141322D383734462D434437304144314646333846223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B7370726573756C743D3D2774727565277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D37334632343743352D423242332D343230452D414234352D37303445463446343039343922206E616D653D22E7BB8FE6B58EE8B4A3E4BBBBE588B6E983A8E997A82220736F757263655265663D227369642D43453233314535332D303745412D343035342D393941342D32383043463931343945373422207461726765745265663D227369642D38443743383533302D413843372D343141322D383734462D434437304144314646333846223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B2067726F757074797065203D3D2031207D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D46393546434644422D434137302D343344382D383932422D43333435343132323034393322206E616D653D22E99D9EE7BB8FE6B58EE8B4A3E4BBBBE588B62220736F757263655265663D227369642D43453233314535332D303745412D343035342D393941342D32383043463931343945373422207461726765745265663D227369642D42393141303731362D433137392D344135442D424233382D354641444344384137393341223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B2067726F757074797065203C3E31207D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F424D4A4857223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D22424D4A4857222069643D2242504D4E506C616E655F424D4A4857223E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2273746172744576656E7431222069643D2242504D4E53686170655F73746172744576656E7431223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D2233302E302220793D223139302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D38443743383533302D413843372D343141322D383734462D434437304144314646333846222069643D2242504D4E53686170655F7369642D38443743383533302D413843372D343141322D383734462D434437304144314646333846223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D22313131392E333431353639363433323737342220793D2237352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D33413834303334412D434635452D343139432D384430342D304335374339394534353337222069643D2242504D4E53686170655F7369642D33413834303334412D434635452D343139432D384430342D304335374339394534353337223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223237302E302220793D223136352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D43453233314535332D303745412D343035342D393941342D323830434639313439453734222069643D2242504D4E53686170655F7369642D43453233314535332D303745412D343035342D393941342D323830434639313439453734223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223435302E302220793D223138352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D42393141303731362D433137392D344135442D424233382D354641444344384137393341222069643D2242504D4E53686170655F7369642D42393141303731362D433137392D344135442D424233382D354641444344384137393341223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223630302E302220793D223136352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D30413241303444302D324145412D344542322D413146322D433832394444323144354338222069643D2242504D4E53686170655F7369642D30413241303444302D324145412D344542322D413146322D433832394444323144354338223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D2239392E39393939393939393939393939392220783D223130372E32303136343639313331333637372220793D223136352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D44353241363432432D313931412D344338382D383637352D323533324436453038423732222069643D2242504D4E53686170655F7369642D44353241363432432D313931412D344338382D383637352D323533324436453038423732223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223735372E323031363530303532383035332220793D223136352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D36374439304637432D353946312D344136302D393945332D433539373635454632444637222069643D2242504D4E53686170655F7369642D36374439304637432D353946312D344136302D393945332D433539373635454632444637223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223930352E333439373938393736313830332220793D223136342E36303930353433353933303535223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D31313145313941382D444431332D343532332D423138432D333934443030423233333636222069643D2242504D4E456467655F7369642D31313145313941382D444431332D343532332D423138432D333934443030423233333636223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223635302E302220793D223234342E3935303030303030303030303032223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223635302E302220793D223332322E363333373533313231393532223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223135372E32303136343639313331333637362220793D223332322E363333373533313231393532223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223135372E32303136343639313331333637362220793D223234342E3935303030303030303030303032223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D44323637333033312D463636422D343936392D423130352D323042313844464537463142222069643D2242504D4E456467655F7369642D44323637333033312D463636422D343936392D423130352D323042313844464537463142223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223835372E313531363530303532383031362220793D223230342E3836383035353834363935363033223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223930352E333439373938393736313735332220793D223230342E3734303836363536383139363432223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46393546434644422D434137302D343344382D383932422D433334353431323230343933222069643D2242504D4E456467655F7369642D46393546434644422D434137302D343344382D383932422D433334353431323230343933223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223438392E343937363133303635333235372220793D223230352E3434363932373337343330313638223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223630302E302220793D223230352E3133393133363439303235303638223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37313742313934382D314236392D343930452D394344352D304342463936303435433346222069643D2242504D4E456467655F7369642D37313742313934382D314236392D343930452D394344352D304342463936303435433346223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D22313030352E323939373938393736313539382220793D223230342E36303930353433353933303535223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D22313133332E333431353639363433323737342220793D223230342E36303930353433353933303535223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D22313133332E333431353639363433323737342220793D223130322E3934393933323132353639393937223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D31383145413230352D363839312D343932452D384346352D413137344631323241374333222069643D2242504D4E456467655F7369642D31383145413230352D363839312D343932452D384346352D413137344631323241374333223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223230372E31353136343639313330333330362220793D223230352E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223237302E302220793D223230352E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35333930454430382D314630312D344242312D393037302D343331444544423035333643222069643D2242504D4E456467655F7369642D35333930454430382D314630312D344242312D393037302D343331444544423035333643223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223830372E323031363530303532383035332220793D223234342E3935303030303030303030303032223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223830372E323031363530303532383035332220793D223332322E36333337363131323234303734223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223135322E383132303735383436383838392220793D223332322E36333337363131323234303734223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223135322E383132303735383436383838392220793D223234342E3935303030303030303030303032223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D42373436424431362D323638352D343342392D424231362D333534373441343636304344222069643D2242504D4E456467655F7369642D42373436424431362D323638352D343342392D424231362D333534373441343636304344223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D2235392E39343939393534323839313135352220793D223230352E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223130372E32303136343639313331333637372220793D223230352E3030303030303030303030303036223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35343338324134392D383233312D343234372D383734302D343739313537443434413738222069643D2242504D4E456467655F7369642D35343338324134392D383233312D343234372D383734302D343739313537443434413738223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223332302E302220793D223234342E3935303030303030303030303032223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223332302E302220793D223332332E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223135372E32303136343639313331333637362220793D223332332E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223135372E32303136343639313331333637362220793D223234342E3935303030303030303030303032223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D46304536393546442D313335392D343746462D423037442D333636314530424544463442222069643D2242504D4E456467655F7369642D46304536393546442D313335392D343746462D423037442D333636314530424544463442223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223336392E393439393939393939393938392220793D223230352E3136353934363834333835333832223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223435302E34333333333333333333333333342220793D223230352E3433333333333333333333333334223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D33453543364433462D434133462D344343332D394133412D413638424330344635434542222069643D2242504D4E456467655F7369642D33453543364433462D434133462D344343332D394133412D413638424330344635434542223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223639392E393439393939393939393939392220793D223230352E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223735372E323031363530303532373937322220793D223230352E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37334632343743352D423242332D343230452D414234352D373034454634463430393439222069643D2242504D4E456467655F7369642D37334632343743352D423242332D343230452D414234352D373034454634463430393439223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223437302E352220793D223138352E3530303030303030303030303033223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223437302E352220793D2239342E3139393933353838393733333837223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D22313131392E333431353639363433323737342220793D2239342E3139393933353838393733333837223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35303034363143432D343337432D343739372D413337422D344337423437373843413132222069643D2242504D4E456467655F7369642D35303034363143432D343337432D343739372D413337422D344337423437373843413132223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223935352E333439373938393736313830332220793D223234342E3535393035343335393330353532223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223935352E333439373938393736313830332220793D223332372E3032333332363530323632353134223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223135312E373134373330353636383837352220793D223332372E3032333332363530323632353134223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223135312E373134373330353636383837352220793D223234342E3935303030303030303030303032223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E, 0); +INSERT INTO `act_ge_bytearray` VALUES ('10003', 1, 'BMJHW.BMJHW.png', '10001', 0x89504E470D0A1A0A0000000D4948445200000485000001510806000000EADB1D33000025CB4944415478DAEDDD0D9C5D75991FF0E05AEBB66E4BEBB6EB6EDDCA76B5DAD5AED5655B5B77B7E9D6ADD84544979B33676608D34813941749804A110C2FB2BC64DDAC71574D37D48DA260290D6C440209105E12B22014222E25C18049862413E2041232097939FBFCF33963AFE3BC67EECC9D39DFEFE7F37CEEC9CC9D6438F7779FF3BF0FE79E3B6D1A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023D4D6D6F6E62CCBCE696969B9256A63D49EA822AA27EAB9F8DEB2B8BD30DDCFDE0200000098E4F23C3F356A654B4BCBFE7208349CBA2F7EA6DDDE0300000098645A5A5A4E88BA730483A0FEEAC15AADF6567B130000006012C8B2AC25CFF317EB073C6D6D6DC535D75C53DC7BEFBDC5E6CD9B8B975F7EB9485E79E595A2B3B3B358B3664DB170E1C2E2F4D34FEF3B18DAE3AC2100000080269765D9C92D2D2D07EB874137DE7863D1D5D5550C477777F7D1FBA79FAB1F0EE5797EA6BD0B000000D084D21942F503A179F3E61D3D2B6834D2CF5D74D1457D0743CE18020000006826E5358476F60E70E6CF9FFFE3B7888D567A6BD9D5575FDDF7AD64EFB0B7010000009A44F909633F3E43E8580742F583A13E670C3D686F030000003481F4B1F3F5D7101AED5BC6067B2B59FD3586BC8D0C000000A009D49F25942E12DD0837DD7493B38500000000C6434B4BCB2D435DC3A7ADADEDCDBD17974E67F3ECDAB5AB2143A1F4A9647D3EAEFE048F100000004003D4BD5DEBA62CCBDED5DF7DE2EBE7F4DEEFFAEBAF2F1A69E1C285F543A10B3D42000000000D50FF71F065DDD2DADAFAAFFADCE796DEEFAF5EBDBAA143A1356BD6D4FF2ECB3D42000000000DD0CF50A8F7CCA19551BF55DE6763EFD7C7FA02D37D757676D6FF1E5B3C42000000000D30D050A8AEEE8CDAD7FBE7B1FA18FAC13E9EBEEEDFEEF108010000C0C43AAE56ABFDCCECD9B3FFD6873EF4A1BF1DDB3F7BFAE9A7FFDD534E39E5E762FBEFB7B6B6FE83993367BE31B6FF519EE7BFD0DEDEFE8BB1FD4FE245FD2FC7F7DE12DBBF9265D9AFC6F6DB62FBEDB1FD2FE27EEF6C6B6BFB97B1FDEEB8DF7BE27BBF11DBBF19DBFF26BEF76F67CC98F1FED8FEEDB8FD9DB89D1E5FFBDDD8FE40DCE73FC5F64971FFFF1CDB27C7F74E491F971EDB1F8BEDD3627B466CC7664B6BFA58F3D89E19DB1D51B3E2CF67C6EDECA8B362FB93E5B572CE8BEDF3637B5EBA864D6CFFB7D8BE38B62F89BA34B63F1BB797475D19DFFB5CDC5E1DB7D7C4D7AF8BED05B1FDF9D85E18DB5F88FA626CFF59DC7E396A716CFF79DCDE10F5D5B8DFD2B8FD7AD437D2F57BE2F65BE5DBB26E8DFB2D8BDBDBD3DBA562FB8E72107357F9895FF744DD17DBF7A74FE48A5A13F570D45F453D1AF5DDA8C7A39E889F5D1FB74F45FD75DCFFFFC5ED86A867A336453D1FB5396A6BD40B51DBA3BA8631143A52FFE7F150FFEF79EA0100004CE26140DCFEB3B87D6BBC60FDE7E9538E62FBD7D2056D63FBD7D3B54B62FBBD71FF1363FB5FC7F6FB62FBDFA5B7AD346A18105FFF44DC9E1D5F3B37B63F15DB7363FB82D8BE28B63F1DDBFF3DB63F13DB9745CD8F3F5F11B757357018705BDCFE65DC7E3BEA3BB1BD226EEF8E5A15F7BF376E57473D10F550D4DAA875518F8CC130E0C5A81F45ED8E9F79396EF7966784F4441D283F6DEA70DD60E050D4AB51FBCBFBED2D7F6E77F9F7BC58FEBDDBCB7F676BF9EF3E5FFE1EE9F7D950FE7E7F9D7EDFF2F77EA2FCEFF86EF9DFB5AEFCEF4CFFBD0F94C390FBD270A41C92DC958626E5F064791AA694FBF1D672BF7EABDCCFDF48FBBDDCFF5F4D8F47F9B82C4E8F53F9787D313D7EE9714C8F677A5CD3E39B1EE7F478A7C7BD7CFCE7A73C94B9B8240D8DD2F0280D91D230290D95D270290D99D2B029E52CE5ADCCDDAC94C394C794CB94CF94D394D794DB94DF94E394E794EB94EF94F394F794FB94FFF43C48CF87F4BC48CF8FF43C49CF97F279F31B69A896866B69C896866D69E896866F6908978671E5F3F02DE979999E9FE9799A9EAFE9793BC830E8BBE9F74ACFFBD8DEE34C210000A8E03060FAF4E9AF8DDBD7757474BCFEC31FFEF0DF89ED37C40B8FBF177F3E3EB6FF61BC68F8F9D34F3FFD1FC7F69B6201FF4BE9A38B63FB9FA68F126EC43020BEFEFBB1FDE1F8DA4762FBA3B1FD07B15D8BED2CB6F3D86E8BEDD363F38CD8FE2FB1FDF1A8FF1A7F9ED3886140DC2E8ADB3F8DFA526C7F256EFF47D492B8CFFF8CDBBF88FA5A6CDF18B7DF8CBA39B6FF57DCEF7FC7F6FF69D030E099F2FA1F3F887A2EEA87E9BA1C519D51DBA27644ED8CDA153FDB1DB72F952FF85E69D030E0B9F277D958FE6E4FC7CF7E3F6EBF17F564FC0EFF376E1F2BCF78F8ABF20C887426C4838D1806948FD197D263961EBBB8CF9FC4F61FC7F61FC5F6F5B17D6DD41F9667845C99CE1029CF14B9B411C38094E194E594E994EDD8FE50E4FC83F1E7DF8B3FFFC7C8FF7F88ED7F5F9E31F3FE74064D3A93269D5173ACC38034CC4B43BD34DC4B43BE34EC4BCFF1F45C4FCFF9F4DCBFFCF2CB5FA3154E6DFD0C839E4E394D8F7FDD7D5C530800A04AD20B81460D03867AAB407A01945E08A51744E985517A81945E28356A18308CB70AFC617AA1985E30A6178EE905647A21D9A861C030DE2AF058F942FAC9F4C2BA7C81FD7403870107CBEFF594F74D3FF352F977EC2AFFCE1DE5BFD159FE9B3F6CE030E0DBE5BEBB2DEDCBB44FD3BE4DFB38EDEB729F7F2D3D06E563B1243D368D1A06A44CA56CA58CA5ACA5CCA5ECA50CA62CA64CA66CA68CA6ACA6CCA6EC366A18909E73E9B9979E83E9B9989E93E9B9999EA3E9B99A9EB3E9B99B9EC3E9B99C9ED3E9B96D1800951F0A6D4CC3CBD407FAB98F4F1F0300C380FF3F0C68D47503463B0C68E0750346350C68E07503463B0C18EAAD02FBCBB3000ED55D3BE070A3860143BD55209D1D519E2591062477970393EF346A1830D45B05D2D923E92C92728074411A28A5C152A3860143BD55209D5D93CEB229076CEF4A03B73478330C00601443A1B48EE8A83F33A8AF720D75745073FDF5D7377428B470E1C2FAA1D0851E210018DF85C17087010DB96EC06887018DBA6EC06887018DBA6EC068870183BD55205D1F245D2F205D2F24BD552862709C67020054C360C3A05EE59A22AD0D8BD82E76EDDAD5908150777777116B93FAA1D0091E210018E7A190BD000040BDF28CE6A3C39A1B6FBCB12143A19B6EBAA97E20F4A0BD0E00E3CC50080080BECA339D8BDEB385C6FA82D3E9EF4B7F6FEFBF91CEB8B6D701609C190A010030C03AF1BEDEA1CDBC79F3C6ECE3E9D3C7D05F74D1453F7196D070DED606008CFDC1DE50080080FED68927941F32717478337FFEFC631E0CA581D0D5575F5D3F10DA93AE97686F03C0C41CEC0D850000E857FA008DDE8B4EF79E3134DAB792A59FEB738690B78D01C044321402006088F56247FD60285D0B285D7C3A7D7AD8703F652C5D54BAFE1A42A9B22CBBD8DE0580893DC81B0A010030A874C6505477FD50270D79AEBFFEFA62F5EAD547CF02EA7D6B597A8B58676767B166CD9A62D1A245454747C74F0C83D25BC6D2A0C95E05800966280400C030D78D27D47F54FD28EB41D7100280E639B81B0A01003092F5E369E570E8E0488641E9EC209F320600CD75503714020060C4DADADADE9CE7F9F9B19EBC25EAB9D83E5C0E807AA2B6442D8FBA309D61646F01401332140200E0586559F6BEDE3387F23C3FC91E018049C050080080639565D9B2BAB78A3D6A8F00C02460280400C031AE274FEC7B7DA12CCB4EB66700A0F90FE2864200001CCB7A72793F17967ED445A501A0F90FE2864200008C762D79E2409F4296E7F9A9F6100034F781DC50080080D1AE25EF1CE463E81FB68700A0B90FE4864200008C661D39E05942AE2D040093E3606E280400C068D691CB071B08F924320068FE83B9A1100000D69600E0C00D0000D69600E0C00D0000D69600E0C00D0000D69600E0C00D0000D69600E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B52500E0C00D0080B525003870030080B525003870030080B525003870030080B525003870030080B5250038700300606D696D09000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B02000EDC0000585B028003370000585B028003370000585B028003370000585B028003370000585B028003370000585B028003370000D696008003370000D696008003370000D696008003370000D696008003370000D696008003370000D696008003370000D696008003370000D696008003370000D696008003370000D696008003370000D696008003370053435114AFDDB469D32DEBD6AD3B7CCF3DF7142B57AE54E35CAB56AD2A1E78E08117A3DA25D2DAD25E4073D6986551C9A30337FAA4D227654EE6C645CAD2830F3E5874757515070E1C5013543B77EE2CEEBFFFFE97225BA739B25A5B82E6AC31CBA29247076EF449A54FCA9CCC355C1A2ECA52D364EAC0CA952B9F7664B5B604CD59639645258F0EDCE8934A9F9439996BB874B699C7B2792AF274D091D5DA1234678D5916953C3A70A34F2A7D52E664AEE1D2DBE13C8E4D95276B0B6B4BD09C35665954F2E8C08D3EA9F4499993B9E6C9D3DEDDDB8A4D8F7EB5F8FEAA2B8F56DA4E5F930179C2DA12CD59639645599447076EF4497D529F9439999BA279DAD3DD593C75D765C593775CF41395BE96BE2707F284B5259AB3C62C8BB2288F0EDCE893FAA43E2973323705F3B4E5FB7FF95359EAADADDF5F2E07F284B5259AB3C62C8BB2288F0EDCE893FAA43E2973323715F3F4F47DD70D98A7F43D399027AC2DD19C35665994457974E0469FD427F5499993B92998A7A7565E3E609ED2F7E4409EB0B64473D698655116E5D1811B7D529FD427654EE6E449E961585BA2396BCCB2288BF2E8C08D3EA94FEA9332277353214FE942E503E5297D4F0EE4096B4B34678D591665511E1DB8D127F5497D52E6646E0AE669E39A3F1D304FE97B72204F585BA2396BCCB2288BF2E8C08D3EA94FEA9332277353304FBB3AD7174FDD3DFFA7CF3A8BAFA5EFC9813C616D89E6AC31CBA22CCAA30337FAA43EA94FCA9CCC4DC13CA57AEEBB5FFBA93CA5AFC9803C616D89E6AC31CBA22CCAA30337FAA43EA94FCA9CCC4DD53CEDDF5F6C5CFBE59F3EEB2CBE96BE2707F284B5259AB3C62C8BB2288F0EDCE893FAA43E29733237C5F2B4A7BBB3D8B0E68B03BE1D317D2FDD4716E4096B4B34678D591665511E1DB8D127F5497D52E6646E2AE469FFFE62DBC67B8BEFADB864C02CF556BA4FBAAF81A33C616D89E6AC31CBA22CCAA30337FAA43EA94FCA9CCC4DE23C0D355834709427AC2DD19C35665994457974E076E0469FD427654EE6A6E050683883C5C1068E72A187616D89E6AC31CBA22CCAA30337FAA43EA94FCA9CCC4DC23C8D364BBD25177A18D69668CE1AB32CCAA23C4E75279507EE93EC0AC76C7D529F9439999B4A7952F284A1109AB3D29865511E19D807A2BAA31696B727DB25FAA4D227654EE6E449E961180AA1396BCCB2A8E4B11A03A1DE41503A5368A7C1903EA9F44999933979527A18864268CE1AB32C2A79ACCE4068A8AFA34F2A7D52E6644E9E941E86A1109AB3C62C8B4A1E27B9938618FCF47EDF3586F449A54FCA9CCCC993D2C330141A89A2285EBF7EFDFA394B972EBDFFDA6BAF7DE9BCF3CE3BD8D1D151A49DD2DEDE7EE4139FF8C481CF7CE6339BAEBBEEBA1BA3DEEE60AF346659944726602034D4C0C71943FAA4D227654EE6E449E961180A8D641874EBADB77EEDAAABAE3A78FEF9E7178B172F2ED6AD5B57747676163D3D3D45926EBBBABA8AC71E7BAC58BA7469F1A94F7DEAC8DCB9739F9F3D7BF6990EF64A63964579A4C13E306D6467008DF4FEE8934A9F943999932765AD47F58642EBD6AD9BF5B9CF7D6EFF45175D7474E073E8D0A162B89E78E289E2E28B2F3E3467CE9CA76BB5DA5B1DEC95C62C8BF248030742278FE2E7F6180CE9934A9F9439999327A5876128D4475114AFBDFDF6DBEF3DEBACB38AE5CB978F6818D4D78A152B8A59B366ED9B6A670D69CE1AB32C2A799CB403A1B1FA79F449A54FCA9CCCC9933C612834F50642AB57AF7EE4DC73CF2D366CD8508C85E79F7FBE38EBACB3F69D79E699673BD82B8D5916E5913130D445A5C7FBEF419F54FAA4CCC99C3CC9138642935F3A43280D84D23582C652FAFB66CF9EBD27CFF376077BA531CBA23C3206839CB17AEB973386F449A54FCA9CCCC993D2C330144AD7104A6F191BAB3384FA3B6368E6CC99DD799EBFC3C15E69CCB2288F1CC300A77720745CD419E5ED48F4FD39179FD627953E297332274F4A0FA3BA43A1F42963575E79E581740DA146BAE38E3BF6B5B5B53DEC60AF34665994474639103AB96EB073433A8495B7C31D0C0DF4730643FAA4D227654EE6E44959EB51CDA1D0B265CBBE913E65ECD5575F2D1AED939FFCE4F6C9FE3632CD59639645258F133A104ACE28073BC5080643F503A1DE9A59F77DD718D227953E297332274F6AD4799A3E7DFA6B1D790D85269D7496D055575D75307DECFC7878F2C9270F4CF6B3853467077A5954160AE366A0414D7F039EC10643FDDD7F493FF7778D217D52E993322773F2A44694A77899FBA6AD5BB73EBC66CD9AE2D24B2FBDC09ACF50685259BF7EFD9C7471E963F9E8F9919A356BD6F6D8A12734DBBEC8F37C65D46F69CE8642B2A82C14C63FCF830C844E1AC1A0A7BFC1D07007427D0743DE4AA64F2A7D52E6644E9ED4A079DABC79F3653D3D3D077B5FEBEEDFBFFFD59B6FBE79E3D9679FFD4E476B43A14961E9D2A5F72F59B2A4184F0B172E7C2276E885CDF820A74A4D3ACBB2F769CE8642B2A82C14C62FCFA31CCC0C35181AE940A8FEDFDF39CD1943FAA4D227654EE6E449F593A7BD7BF7BE7BC78E1DCF0FF49AF7B9E79EEBB9F6DA6BBFD2D1D1F17A476D43A1A616417D69DDBA75E33A145ABB76EDF3B1439737EB02B3AEEEEC6F82AF391B0AC9A2B25018FB3CF733101AEE4066A0C1D06B463910EAE51A43FAA4D227654EE6E449FD449ED2E557B66CD9F2F5C3870F1F19EA75EF9123470EAF58B1E2C5B973E77ED891DB50A8699D77DE7907B76DDB36AE43A1EDDBB777C50EDD320916983F9EE0D73769CDD95048169585C2D8E7799403A1C10643CF1CC340E8587F1FF44935C5FAA4CCC99C3CA9471E79A4D8BD7BF74B237DFDDBDDDDBDFFCB5FFEF23DF1D8FEBC23B8A150D3E9E8E8287A7A7AC6752894FEBDD8A13D936581593FC14FA7776ACE8642B2A82C14C63ECF6370664E7F83A1631908F51D0CB9C6903EA92ADC27654EE6E4A9DAD5D9D9592C5AB42865A318459E8EFEEC301E77D5E4356517551361320741736EAEA150D51B931C58284C85FAD8C73ED63BBC59788C87B5D7F47386D033E5D78FC5420B21C76CA54FCA9CCCC953B5EBB6DB6E2B66CF9EFDEDB56BD76E3B72E4C8B03EA969F7EEDDDF9C3367CE7D59962D6BC60F5B8269679C71C691F13E5368DFBE7DDB27D999428FC693F8E4DE4F25D09C9D29248BCA4261ECF33C6DE84F1B3B9633856E70A6903EA9F4499993B966C9DC78E5698063A2EF1FE36B8F3CCF4FBDE28A2BB6747777770DF256C4A7162F5EFCE7F1986E4CF777E4A6699D7BEEB907C6FB9A422FBCF0C23393E49A427D5FB04C1B8F83BDE66B28D42C599C6AD91CAF21A585C2E8F25C3780D933AD31D7141ACD60C835852ADE27BDA0F2824AE6646EB2E769B0AF55FDFBC7F2DAA356ABBDA1ADADED0BB7DE7A6BD7E1C387F7D55F2DE5D9679FFD4A7CEFA9784C177674741CEFA84D53BBECB2CB368EF7A78FDD75D75DDF69F24F1F7B381D080678C1322E4321CDD750A819B238D5B2399E67AE59288C3CCFFD0C62867B66CE401F3BDFDFA78F8D6430E4D3C7F4492FA8BCA09239999327791AF4B5473C8627CE9D3B77FDA64D9B3AF7EDDB77FF25975CF2ADF4B8A6AF3B5A33292C58B0604918D7A1D0FCF9F3EF8827C9854DB8C01CECFF5E1B0A190A552E8B8642160AE399E7010643430D64061A081D37C8F78733184A8FCF4E03217DD20B2A2FA8644EE6E4499E867AED911EC73CCFCF2F3F41EEFC11AE7960625D7AE9A5BF7ACE39E71C3E74E8D078CD847A5A5B5B7F3099AF9D6128642854952C1A0A59284CB0A1CED4196A20346D9483A1DEB7B079FFBF3EE905951754322773F2244FC37EED618DC7A4356FDEBC671F7BECB1F17AEBD88DD17C1FF442DC50C850C850A82A43210B856332D01943C31D088D7430D4FBEF1908E9935E307941257332274FF2E4B507D5F0F18F7FBC76C105171C1C87B385BA5B5B5B1FCFF3BCDD0B714321432143A1AA0D8518B574C650DFB7729D318281D06083A1997DFE1DD710D227BDA0F2824AE6644E9EE4C95A8FEA993367CEFAE5CB9737742294AE5F94CE129AECFF17C850C850C85048F6E471420643F5179FAE1FF00C6720346D889FF3B1F3FAA417545E50C99CCC4DC93C4DF3697663FE69763025A56BFCCC9A356BDF860D1B1A32105ABF7EFDEDF16F6CCBF3FC1D5E88FB487A2FC227EF5048F6E47102F57D2B591AE8CC9C36F28F99EFFB73271908E9935E50794125733267ADA7F4302AAFBDBDBD6DCE9C39AF7475758DE94068EBD6AD0FB5B6B6FE70B2BF6D4C73D6986551C963D30D868E557F6F4D439F54FAA4CCC99C3C296B3DAAA9ADAD6DD6ECD9B3F78CD51943E90CA13410CAB2EC62077BA531CBA23CD24483A1B11E30A14F2A7D52E6644E9EE40926BF2CCB5ADADBDB5FBAEDB6DBF61EC3C5A7BB3FFFF9CF7F35BD652CAAC3C15E69CCB2288F8CA1637DCB97B78CE9934A9F9439999327A587C140D235865A5B5BEF993367CEF6C71F7F7CDF0886413D77DF7DF74DEDEDED8FA68B4A4F856B0869CE1AB32C2A796CEAC1D048CFF47151697D52E993322773F2A4F43018E670E8B4341CEAE8E8E8BAF6DA6BBFFFD0430FFDB0B3B3735B4F4FCFD109D0BE7DFBB6BFF0C20BCFAC5AB5EADB975F7EF99D6D6D6D9BD230289D1D34D93F654C73D6986551C963D31BE95BC0BC654C9F54FAA4CCC99C3C293D0C46AAADADEDCD799E9FDFD2D2724BD473513D514579BB256A79D485E90C23077BA531CBA23CD28483A113A3F6449D6A97E9934A9F9439999327A587019AB3C62C8B4A1EA78693CA81CF49837C7FA781903EA9F44999933979527A18A0396BCCB2A8E471EA19E88C216F19D327953E297332274F4A0F0334678D5916953C566C306420E498AD3FE993322773F2A4E409D09C35665954F258B1C1D0420321F4497D52E6644E9E943C019AB3C62C8B4A1EAB255D43A898E663E71DB3F5497D52E6644E9E943C019AB3C62C8B4A1E2BE778BB007D529F9439999327254F80E6AC31CBA29247D027953E297332274F4A0F0334678D5916953C823EA9F44999933979527A18A0396BCCB2A8E411F449A54FCA9CCCC993B2D60334678D5916953C823EA9F4499993397952D67A80E6AC31CBA29247D027953E297332274FF264AD0768CE1AB32C2A79047D52E993322773F2244F8005A6D2986551C923E8934A9F943999932779022C3095C62C8BF208E893CA5048C99C3CC913E060AF3466599447409F5486424AE6E4499E00077BA531CBA23C02FAA43E29734AE6E4499E00CD5969CCB2288F803EA94FCA9C92397992274073561AB32CCA23A04FEA9332A7644E9EE409D09C95C62C8BF208E893FAA4CC294321254F80E6AC3466599447409FD427654E190A2979023467A531CBA23C02FAA43E29736A4A67EE9E7BEEF138364FF5449E0E3AB2029AB3C62C8B4A1E419F54FAA4CCC95CC33DF0C003DBBABABA3C964D509D9D9D37479E9E76640534678D5916953C823EA9F4499993B986BBF7DE7B3FB27AF5EADD3B76ECD8E7319DB8E162CAD2AA55AB7E18759A232B30E99B734F4F8FC62C8BCDB6689347409FD427654EE664AE1FF1DF70F2CA952B1F4D673DA5B7C34DC65AB66C5931597FF772BF3F6D9D074C89E6BC60C182A2A5A5A5B8EBAEBB3466596C8A7AE491478A458B164DE6C5823C823EA94FEA933227730C60C78E1D7F90F214AF414EB03700265896652FA7A150D4F6743B7DFAF4D7DB2B4C94A2285EFFA31FFDA83B14B367CFFEB63D02A04F2273C813000DD0DADABAA41C08D5D7A5F60C1365CB962D5F2F4A6BD7AEEDCCF3FC547B05409F44E6902700C6504747C7F12D2D2D87FA190AEDB57798087BF7EE7DF7E1C3878F1475AEBEFAEA2D29ABF60E803E89CC214F008C91969696BBFB19081DAD2CCBAEB087186FDBB76FDF54F4B17BF7EEED6D6D6D5FB07700F449640E7902600C44E3FDB52CCB8E0C34144A670BB9B610E369F3E6CD97150358B66C59BADED589F612A04FEA93C81CF204C0318AA6FBC42003A1A395E7F935F614E321D6026FDABF7FFFAB032D148E1C397260EEDCB9EBA74F9FFE5A7B0BD027F549640E790260946AB5DA69430D84CADA636F311EB66EDDFA7031844D9B366DC9F3FC7C7B0BD027F549640E790260945A5A5A760D7328E4DA428C8B356BD60CB54E287A7A7A56A74C767474785B23A04FEA93C81CF204C048B5B6B67E30CBB297A3E1BE3ACCC1904F22A3E13EFBD9CF9E3DD829C5699D70C925977CCBFF3D02F4497D1299439E0018432D2D2DB76559B63E6E4F2807411F8D7A8F3DC378BAF9E69B9F196895F0ECB3CF7E2532F9B0F79903FAA43E89CC214F008CA168C0ABA21E2AB70B7B848950ABD5DE1A0B829E7E2E3CF8545B5BDB533E9102D027F549640E7902608CA5A97CD45DE5B6A1101366C182055F8C85C1E1FA85C292254B6EC8B26CA1BD03A04F2273C8130063ACA5A5E5C968C4B796DB86424C9874CAF08A152BBA7A1709BB77EFFE666472634747C7F1F60E803E89CC214F008CB12CCB364633FE8BB46D28C4443BE79C737EB7BBBB7B7F54317BF6EC55799E9F6AAF00E893C81CF20440034423DE9265D9A2B46D28443358BC78F19D8B162D2A2297CBEC0D007D1299439E006890969696AEA8ABCA6D4321265C3A853865315D90D0DE00D0279139E40980068986BC3BCFF379E5B6A110CD924B5904D0279139E409800637E47D51B334672C1400F4499039E409A05A0DF9D52CCB3EA23963A100A04F82CC214F00159265D99168CABFAD3963A100A04F82CC214F001551ABD55E170DF9489EE7BFAE3963A100A04F82CC214F00153173E6CC3746433ED47BE57FCD190B05007D12640E7902A880D6D6D6B7A4A150D42F69CE582800E8932073C81340456459F6AE3414EAE8E8385E73C64201409F0499439E002A22CBB2F7A56B0AA56B0B69CE582800E8932073C8134045B4B6B67E300D8534672C1400F4499039E409A05ACDB835EAA0E68C8502803E0932873C0154489665E74643EED19CB15000D02741E69027806A35E3CBA25ED29CB15000D02741E69027806A35E33F8EDAA93963A100A04F82CC214F00D56AC637446DD59CB15000D02741E69027806A35E35BA29ED59CB15000D02741E69027800AC9F37C459665EB35672C1400F4499039E409A05ACD784DD43ACD190B05007D12640E7902A8902CCB9EC8F3FC1ECD190B05007D12640E7902A8903CCF37CC9831E376CD190B05007D12640E7902A85633DE9AE7F98D9A33160A00FA24C81CF20450AD66FC62D49734672C1400F4499039E409A05ACD786F9665D768CE582800E8932073C81340B59AF1AB519FD69CB15000D02741E6902780EA382ECBB223517334672C1400F4499039E409A0226AB5DA1BA2191FCCF3BC5D73C64201409F0499439E002AA2BDBDFD17A319F76459F631CD190B05007D12640E7902A888D6D6D6B76559F64A9EE72769CE582800E8932073C81340456459F6DE68C67B66CC98F13B9A33160A00FA24C81CF2045011691894E7F9CB5996FDA6E68C8502803E0932873C0154A711FF7E3A5328CFF3776ACE582800E8932073C81340751A7116B5B756ABFD8AE68C8502803E0932873C0154449EE7676659B62F6E7F4173C64201409F0499439E002A22CFF3F3A319BF7ACA29A7FC9CE68C8502803E0932873C0154A7115F9665D9915AADF6339A33160A00FA24C81CF20450115996FD5134E3439A33160A00FA24C81CF2045021799EDF10CD789FE68C8502803E0932873C0154AB11DF12F523CD190B05007D12640E7902A85623BE3BEA05CD190B05007D12640E7902A856237E38EA079A33160A00FA24C81CF20450AD46FC549665DFD39CB15000D02741E69027806A35E2E7A2D669CE582800E8932073C81340B51A7157D42ACD190B05007D12640E7902A85623DE9365D932CD190B05007D12640E7902A856233E9465D952CD190B05007D12640E7902A8885AADF6BA68C407B32CFB33CD190B05007D12640E7902A888993367BE311AF12B510B34672C1400F4499039E409A0225A5B5BDF926559779EE75768CE582800E8932073C81340456459F6AE68C43BA33EAD3963A100A04F82CC214F00159165D9FBA2116FCBF3FC5CCD190B05007D12640E7902A8883CCF7F2F1A7167D4C735672C1400F4499039E409A03A4DF8A3515BF2A03963A100A04F82CC214F00159165D9CC68C49BE3F6239A33160A00FA24C81CF2045011799E7F320D85D2DBC834672C1400F4499039E409A03A4DF8D359966D9D3163C6FB35672C1400F4499039E409A03A4DF8AA3CCF5F88DBF768CE582800E8932073C8134045E479FE27513B6AB5DADB35672C1400F4499039E409A03A4D7849D4AEA85FD69CB15000D02741E6902780EA34E16F6559F6F2CC9933DFA83963A100A04F82CC214F00159165D91DD1880FD46AB59FD59CB15000D02741E69027808AC8F3FCFED48895524A29A5941A6E594563280430359AF0E35996BDB7BFE6AC948527000086420053B7096F686D6D7D9B3D0100004CC0EB11432180096CC2DB6AB5DA9BEC09000060025E8F180A014C6013DE53ABD5DE604F00000013F07AC4500860821CE77A354A29A594524A29D78F04A8E860C82E00000000000000000000000000000000000000000000000000000000000000000000000000000080C1FD0DFBC59A87D1DD4C0B0000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('12502', 1, 'BMJHN.bpmn20.xml', '12501', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22687474703A2F2F7777772E666C6F7761626C652E6F72672F70726F63657373646566223E0D0A20203C70726F636573732069643D22424D4A484E22206E616D653D22E983A8E997A8E8AEA1E58892E58685E8AEA1E58892E588B6E5AE9A2220697345786563757461626C653D2274727565223E0D0A202020203C73746172744576656E742069643D2273746172744576656E7431223E3C2F73746172744576656E743E0D0A202020203C757365725461736B2069643D227369642D37353232393338312D463339322D343743412D393635352D42453541314339334544354222206E616D653D22E983A8E997A8E7AEA1E79086E59198E5A1ABE586992220666C6F7761626C653A61737369676E65653D2224494E49544941544F52223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A666F726D50726F70657274792069643D2267726F7570696422206E616D653D22E983A8E997A849442220747970653D22737472696E67222072657175697265643D2274727565223E3C2F666C6F7761626C653A666F726D50726F70657274793E0D0A20202020202020203C6D6F64656C65723A61637469766974692D69646D2D696E69746961746F7220786D6C6E733A6D6F64656C65723D22687474703A2F2F666C6F7761626C652E6F72672F6D6F64656C6572223E3C215B43444154415B747275655D5D3E3C2F6D6F64656C65723A61637469766974692D69646D2D696E69746961746F723E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C656E644576656E742069643D227369642D46443942393045432D383546392D343832312D383033462D353336334230423242324537223E3C2F656E644576656E743E0D0A202020203C73657175656E6365466C6F772069643D227369642D35444643434430332D394441362D343236302D393437342D4437383332363446383035372220736F757263655265663D2273746172744576656E743122207461726765745265663D227369642D37353232393338312D463339322D343743412D393635352D424535413143393345443542223E3C2F73657175656E6365466C6F773E0D0A202020203C6578636C7573697665476174657761792069643D227369642D39353442343939312D443632392D343234392D383439392D323435303643413944343833223E3C2F6578636C7573697665476174657761793E0D0A202020203C757365725461736B2069643D227369642D44433434413544302D363331442D343437362D413334392D31333832353438304533393822206E616D653D22E983A8E997A8E9A286E5AFBCE5AEA1E6A0B82220666C6F7761626C653A63616E64696461746547726F7570733D2267697031223E3C2F757365725461736B3E0D0A202020203C73657175656E6365466C6F772069643D227369642D42433445374133352D333732422D344542312D394334332D3233303442363032393743302220736F757263655265663D227369642D37353232393338312D463339322D343743412D393635352D42453541314339334544354222207461726765745265663D227369642D44433434413544302D363331442D343437362D413334392D313338323534383045333938223E3C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D35433544373134372D463838352D343639372D413833302D36453932433330343131393422206E616D653D22E9809AE8BF872220736F757263655265663D227369642D39353442343939312D443632392D343234392D383439392D32343530364341394434383322207461726765745265663D227369642D46443942393045432D383546392D343832312D383033462D353336334230423242324537223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B2073703D3D74727565207D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D38384332343535412D393539432D344143352D383546342D45454642323837353633394422206E616D653D22E9A9B3E59B9E2220736F757263655265663D227369642D39353442343939312D443632392D343234392D383439392D32343530364341394434383322207461726765745265663D227369642D37353232393338312D463339322D343743412D393635352D424535413143393345443542223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B2073703D3D66616C73657D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D227369642D37304546413042352D424136412D344546422D383846382D4545464236333032434134452220736F757263655265663D227369642D44433434413544302D363331442D343437362D413334392D31333832353438304533393822207461726765745265663D227369642D39353442343939312D443632392D343234392D383439392D323435303643413944343833223E3C2F73657175656E6365466C6F773E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F424D4A484E223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D22424D4A484E222069643D2242504D4E506C616E655F424D4A484E223E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2273746172744576656E7431222069643D2242504D4E53686170655F73746172744576656E7431223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223130302E302220793D223134352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D37353232393338312D463339322D343743412D393635352D424535413143393345443542222069643D2242504D4E53686170655F7369642D37353232393338312D463339322D343743412D393635352D424535413143393345443542223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223231302E302220793D223132302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D46443942393045432D383546392D343832312D383033462D353336334230423242324537222069643D2242504D4E53686170655F7369642D46443942393045432D383546392D343832312D383033462D353336334230423242324537223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223735302E302220793D223134362E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D39353442343939312D443632392D343234392D383439392D323435303643413944343833222069643D2242504D4E53686170655F7369642D39353442343939312D443632392D343234392D383439392D323435303643413944343833223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223538352E302220793D223134302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227369642D44433434413544302D363331442D343437362D413334392D313338323534383045333938222069643D2242504D4E53686170655F7369642D44433434413544302D363331442D343437362D413334392D313338323534383045333938223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223339372E302220793D223132302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35433544373134372D463838352D343639372D413833302D364539324333303431313934222069643D2242504D4E456467655F7369642D35433544373134372D463838352D343639372D413833302D364539324333303431313934223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223632342E353033393337333831343034322220793D223136302E3433393837333431373732313531223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223735302E303030303637303133363332382220793D223136302E30343430303632353133373932223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D42433445374133352D333732422D344542312D394334332D323330344236303239374330222069643D2242504D4E456467655F7369642D42433445374133352D333732422D344542312D394334332D323330344236303239374330223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223330392E393439393939393939393437332220793D223136302E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223339362E393939393939393939393731322220793D223136302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D37304546413042352D424136412D344546422D383846382D454546423633303243413445222069643D2242504D4E456467655F7369642D37304546413042352D424136412D344546422D383846382D454546423633303243413445223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223439362E39343939393939393939343634342220793D223136302E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223538352E302220793D223136302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D35444643434430332D394441362D343236302D393437342D443738333236344638303537222069643D2242504D4E456467655F7369642D35444643434430332D394441362D343236302D393437342D443738333236344638303537223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223132392E39343939393931333037363739362220793D223136302E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223230392E39393939393939393939383036372220793D223136302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D227369642D38384332343535412D393539432D344143352D383546342D454546423238373536333944222069643D2242504D4E456467655F7369642D38384332343535412D393539432D344143352D383546342D454546423238373536333944223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223630352E352220793D223134302E35223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223630352E352220793D2237372E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223236302E302220793D2237372E30223E3C2F6F6D6764693A776179706F696E743E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223236302E302220793D223132302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E, 0); +INSERT INTO `act_ge_bytearray` VALUES ('12503', 1, 'BMJHN.BMJHN.png', '12501', 0x89504E470D0A1A0A0000000D4948445200000314000000D20806000000D3DA86A500000F9A4944415478DAEDDDDF6F95F51D07F0CE70B1CBFD01BB30D992F90770E1C52EB8F0820B92712139D056DA54D2AA03C4321232252528B1684C13B7643161311816961083AC63022DB5FCB419830093106143547E59C62A565A6B9167CFB7E9718F8773DAF3AB879E735EAFE4936A4F4BC9C3A7CFF7FD39CFAF86060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FE6FF9F2E591524AA9B92B2B0D00353F50D80A00F6B10060B103B08F05008B1D807D2C0058EC00EC63ED6301B0D801601F0B00163B00FB5800B0D801D8C70280C50EC03E16002C7600D8C70260B103C03E16002C7600F6B10060B103B08F05008B1D807DACAD0080C50E00FB5800B0D801D8C70280C50EC03E16002C7600F6B10060B103C03E16008B1D00F6B10060B103B08F05008B1D807D2C0058EC00EC6301C06207807D2C0058EC00EC6301C06207601F0B00163B00FB5800B0D801601F0B80C50E00FB5800B0D801D8C70280C50EC03E16002C7600F6B10060B103C03E16803A5FD87AC3E2364B9DB4A5000C1400906D615B18D7E44C03452A955A624B0118280020D7E2F6FE0C03C5878B162D5A602B0118280020D7E2B630D740B162C58AA5B61080810200665BE0B25D4B71D2D10900030500E4B3C03D702D856B27000C140090B77880D8E3E804808102008A1D281E4F5C3BB1D8160130500040A10BDDD4B5148E4E00182800A098856EA1C50EC04001C0431045D182CB972FEF1E1A1AFAEED0A143515F5F5F555658ECAAF5EFDEDFDF1F1D3972E43F7135EB48BD5ECBA5D70D1400D4A010B08E1E3D1A0D0F0F47131313EA21D5AD5BB7A2C3870FDF8903D793BA52AFEB750C1400548DF06EAD80356F82D6445F5FDF055DA9D7F53A060A00AA4638F543C0993F1587AC495DA9D7F53A060A00AA4638AF59B8995721CBA2ADD7F53A060A006A2F647DFDE58DE8F2C9B7A3F3FD5BA62AFC77F89C602464E975A5D70D1400085933D6E8C8B5E8A3039BA2B3FB36FCA0C2E7C26BC29190A5D7955E3750002064E5ACCFCFFFE5818095AEABE77B8523214BAF2BBD6EA00040C8CA5D173ED896336485D78423214BAF2BBD6EA00040C8CA591FF56DCE19B2C26BC29190A5D7955E3750002064095942965ED7EB7A1D030500E50F59E14E37B94256784D3812B2F4BAD2EB060A0084AC9C75E9F8EF7386ACF09A702464E975A5D70D1400085939EBF6B573D14707BB1E3C0524FE5C784D3812B2F4BAD2EB060A0084AC19EB937FBCF340C80A9F138C842CBDAEF4BA810200216BE6FAE69BE8D2893F3C780A48FCB9F09A702464E975A5D70D14000859399F1C7CF1F8EF729E571E5EF30461214BAF2BBD6EA00040C87AE09DDA1B9706A27FEEFF6DCE8095AEF035E16BBD832B64E975A5D70D14000859B3BE53EB1D5C214BAFEB75BD6EA000809C212B9F776A677A07575812B2F4BAD2EB060A00EA3864151BB0D2252C09597A5DE9F59AB2787AA0586C53009057C85242965E577A9D694FC4351257CFF4C725360900429690A5D7955EA79061223D44842314B70C1500085942965E577A9D428789D93E0F8090A5842CBDAEF43A5316CF3234A45F774D0550795114FDF8DCB9731D3B76EC38DCDDDD7D67EDDAB593ADADAD51B8D8ABB9B9F9FEB3CF3E3BF1E28B2F5EDEB66DDBCEB87E618B095942167A5DAFF3508689D98605472A28BBA6A6A69FA652A9D5712EDC1DD7A5B84643468C6B3CAE4FE2D7F6C41F7F13BECED6AAD341E2DD77DF7DE7E5975F9E5CB76E5DF4D65B6F45434343D1B56BD7A2F1F1F128081F878787A353A74E45F1C0113DFFFCF3F75F78E1852BEDEDEDAB6C41214BC842AFEB75E6DC130D851D7928F4EB21AB152B562C8DAB2FAE89E901229FFA20FEFA665BAF4EC48343DB2BAFBCF2CD860D1BA686857BF7EE45F93A73E64CB471E3C67B1D1D1D17962D5BF6735B53C812B2D0EB7A9D391D269614F17DA3860A8A110F058FC643C1FE0286886C755446AC61F13CB060EFDEBD03CF3CF34CD4DBDB5BD0209169FFFEFD515B5BDB98A315429690855ED7EBCC9B61A25CDF4F1D4AA552CB1B1B1BFF9B1C0E9A9A9AA2575F7D351A1818883EFBECB3E8ABAFBE9ACA8177EFDE9D3AABE5F8F1E3514F4F4FF4D4534F650E15A38E56D4E830313838F8F7356BD644172F5E8CCAE1CA952B513C9C8CAD5AB5EAD7B6B0902564A1D7F53A6531DB05D895FE73A88F6162493C00DC4B0E123B77EE9C3AF53D1F232323535F1FBE2F3958C47FA6379E6B4938321186897C1B235FE1CF6B6F6F37850A5942167A5DAF53BE61A25CA72B3952413EC3C4F2E430D1D9D9397534A218E1FBC229F51943858C580BC23513E134A7721D99C876A462E5CA952371C33C666B0B5942167A5DAF5352F84F0F133F8AAB65FA632132BFCF85DAE414AE99489EE6D4D5D5F5FD694DC50AA7436DDDBA35F3F42719B19A85BB396DD9B265225C333197F6EDDB37D6D4D4F4A12D2E640959E875BD4ED1C3C492C450F0C7B08C4F7FCC77A8C8F57D860AB28A8789FEE49189528789E4509171A4E2A8AD5DC5F6ECD9F3A7F00FFAEDB7DF4673EDB9E79EBBE9B096902564A1D7F53A250D130DD34718A244E5335424878974AD4CBCEE9A0A7E20DC1A3679CD44B1A739CD74FA53F29A0A19B14A85A313E13913E1D6B09570F6ECD9094729842C210BBDAED7C95BAE909F6D389869A8C8F6F5DBB37CBD6B2A480E147DE9B01F2EA89E0BBB76ED7294A2DA852760870BB14BB93D6CA1DADADA6E86F3F16CFDECBFB871FD52C812B2F4BA5ED7EBF5D7EF330C138B0B1812B20D15F90E13994385D39FEAB827C393ADD3176287A308B76FDF9E935C18EEFE94714B5919B1DAECD8B1E3F0F6EDDBA34AEAE9E939131EC16EEB3F2871C8AF2F954A3D2E6409597A5DAFEBF5FAE9F72243FD6C4345A1C344F2E7DF72A4A27E7B32FEFCEAF4D7BDF6DA6B739D0D9303858C586DBABBBBEF0C0D0D5574A03871E2C495B8597A6DFDDCBFE0897A3FDB3B08429690A5D7955EAFBD7ECF324CE41BE6730D158F14394C641E213154D4614FC69FDB9D7E7D7070704EB36178F85DE2EF2223569BB56BD74EDEB871A3A203C5CD9B3787E366F9DCD6CFEB17FCFB771092BFE8429690A5D7955EAFBD7E2F72989869A8F8B88461A2D4BF0F55DE93F1FF5F4A7FBEDC1763670A4FD44EFC3D64C46AD3DADA1A8D8F8F5774A0083F2F6E96715B3FFF5FF0E43B08E1D0A4902564E975A5D76BAFDFCB704420DB5051CA30913954B8A6A28E7A32AEB1F4FF97EB56B133DD4236F1B365C46A6CA887218F465633949035BF4A4FEA75BDAECA55F1D2DC53E2D2FE489623131F4F7FBE143DFE7DEAB72A9D0D25F42AD3D2D272BFD24728C6C6C66E9A3E0B7EC7E0642A955AB268D1A2054E03F1AEAD5E577ABD36FBBD61F6BB3A957284A29087DF3942A1271784A7573B42415ED6AC593351E96B28AE5FBFFEB1F3E3F2FE05CF5C6C1A2A11B2722C4635F3BA90A5D76BB5F70D14D5DDEF89F03EDA3037D750143354B886A24E7BD23514E46DD3A64D972A7D97A703070EFCCD15FCB3FE827F189E4E9963B1A9C84031D3E7AAFD75214BAFD76AEF1B28AABBDF4B382290EBD6B0D9EEF254C850E12E4F75DC93EEF244DE5E7FFDF5ED957E0E455757D73EF718CEF90B3ED3BB56060A03855E375018286AB8DF8B3C3230DB73260A7DA276DAC206CFA1A8EB9EF41C0AF2F6D24B2FFD6CF5EAD5DF55F049D9E38D8D8DFFF614C4D218280C147A5DEF1B28EAC26C4708F27D685DA14345FAB4ABA5FE09EA577852769CD7262BF1A4ECE6E6E6FB9E945DE53A3B3BFF75EAD4A94A9DEEB4336E94A3B6BA81C2408181C240415E721DA928F409D8F90E15E99F6798A0213C97221DF477EEDC3927D970D7AE5DC9A3133262B57AFAE9A797AD5FBF7EB2024729461A1B1B4FC7CDD96CAB1B280C1418280C14E42D1CA9C83CFDA8A5A1F0E74C641B2A5666FC1CD74C901C2896A6C37E384A51EE8BB3C39F1767C3FB8907EBC988D5ACA3A3E35C6F6FEF9C4E13E17A8D307916780E29060A03855E3750182878F096B2C9E1A09087D6E5FA3EB78625AB38BB7D900EFC9D9D9D65BB856CB855ECFAF5EBEF258F4EC888D5DF2C8FB6B5B58D5DBC78714E868973E7CEED8D7FC68D78F27CCCD6AE8E81A2C16D6385AC3A1D28F4B65E9FC7324F7F0AC3C0CA86C26F059BF97DA53EFF821ACF8871DD4A07FFAEAEAE92878A304C6CDDBA3579DDC4A88C58239A9B9B9B3A3A3AEE0E0F0F977598B87AF5EAB1C6C6C64F1DC6AADE90A5842CBDAEF4FABC1D2A4A95ED742AF881542AB53C7D8176FA4845B1A73F85EFCB3832E154A75AD3D4D4D4D6DEDE3E5AAE2315E1C8441826E246DC68EB0A5942167A5DAF33AF860A0FAD236F71F06F4D0E15E19A8A70A176B84B53BE77730A176027AF99082523D6F014DADCDC7CE7BDF7DEFBBA840BB547DE78E38DB7C3694EA1016D55214BC842AFEB75CAAAD4D3949CE644511931AE91E44010068BF09C8AF0F0BB70F4217D3A5438AD293C013B3CB4EECD37DF8C5A5A5ABECB783AF7A88C58FB53E8A3F10479A8A3A3E3E6E9D3A7C70A79CEC4C1830777C503C9C970718DF3E1842C210BBDAED799F3A1A2D0230C2EC0A6A48C98BC9D6C912523D659D33C19068BD6D6D6E1EEEEEEF3C78E1DFB349E366F8C8F8F4F4D0F63636337AF5FBFFE717F7FFF5F376FDEFC7E3CA55E0E4D12264E57EA0B5942167A5DAF33E70A3D6DC9694E942D234E0F1693850C1232621D0B4F4B8C9B665DDC04BBE3FA24AEF1E9C6081F3F8FAB373C2ADDD30D852C210BBDAED799B743C5C2064FC0464604842C214BAF2BBD4E168BA78785C533BC7ECB300180902564E975A5D7C925D7910AA73901206409597A5DE9758A1A2A0C1300085942965E577A9DA2868A1EC30400429690A5D7F5985EA718E19A89A8C1AD610110B2842CBDAEC7F43A45FA894D0080902564E9753DA6D70100214BC842AFEB750040C85242965ED7EB008090A5842CBDAEF43A0008594AC8D2EB4AAF0300429690855ED7EB0080902564A1D7F53A00206429214BAF2BBD0E00429612B2F4BAD2EB0080902564E975A5D70100214BC842AFEB750040C85242965ED7EB008090A5842CBDAEF43A0008594AC8D2EB4AAF0300429690855ED7EB0040651C3A7448B8993F351E87AC495DA9D7F53A0050358E1C397263787858C0990775EDDAB53FC721EB82AED4EB7A1D00A81A030303BF1A1C1CFCF28B2FBE1813741EDEBBB52160F5F7F77F1AD793BA52AFEB7500A0AAC40BFB92BEBEBE93E11484705EB3AA7885ED7E41C0D2EB7A1D000000000000000000000000000000000000000000000000000000002AE87F87CC06A322512A280000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('15002', 1, '1.bpmn20.xml', '15001', 0x3C3F786D6C2076657273696F6E3D27312E302720656E636F64696E673D275554462D38273F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22636F6D2E6A736974652E6D6F64756C65732E6F612E6C65617665223E0D0A20203C70726F636573732069643D226C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0D0A202020203C646F63756D656E746174696F6E3EE8AFB7E58187E6B581E7A88BE6BC94E7A4BA3C2F646F63756D656E746174696F6E3E0D0A202020203C73746172744576656E742069643D2273746172746576656E743122206E616D653D22E58F91E8B5B7E6B581E7A88B2220666C6F7761626C653A696E69746961746F723D226170706C795573657249642220666C6F7761626C653A666F726D4B65793D222F6F612F6C656176652F666F726D222F3E0D0A202020203C757365725461736B2069643D22646570744C6561646572417564697422206E616D653D22E983A8E997A8E9A286E5AFBCE5AEA1E689B92220666C6F7761626C653A63616E64696461746547726F7570733D2264657074222F3E0D0A202020203C6578636C7573697665476174657761792069643D226578636C7573697665676174657761793522206E616D653D224578636C75736976652047617465776179222F3E0D0A202020203C757365725461736B2069643D226D6F646966794170706C7922206E616D653D22E8B083E695B4E794B3E8AFB72220666C6F7761626C653A61737369676E65653D22247B6170706C795573657249647D223E0D0A2020202020203C657874656E73696F6E456C656D656E74733E0D0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D22636F6D706C657465222064656C656761746545787072657373696F6E3D22247B6C656176654D6F6469667950726F636573736F727D222F3E0D0A20202020202020203C6D6F64656C65723A696E69746961746F722D63616E2D636F6D706C65746520786D6C6E733A6D6F64656C65723D22687474703A2F2F666C6F7761626C652E6F72672F6D6F64656C6572223E3C215B43444154415B66616C73655D5D3E3C2F6D6F64656C65723A696E69746961746F722D63616E2D636F6D706C6574653E0D0A2020202020203C2F657874656E73696F6E456C656D656E74733E0D0A202020203C2F757365725461736B3E0D0A202020203C757365725461736B2069643D226872417564697422206E616D653D22E4BABAE4BA8BE5AEA1E689B92220666C6F7761626C653A63616E64696461746547726F7570733D226872222F3E0D0A202020203C6578636C7573697665476174657761792069643D226578636C7573697665676174657761793622206E616D653D224578636C75736976652047617465776179222F3E0D0A202020203C656E644576656E742069643D22656E646576656E743122206E616D653D22456E64222F3E0D0A202020203C6578636C7573697665476174657761792069643D226578636C7573697665676174657761793722206E616D653D224578636C75736976652047617465776179222F3E0D0A202020203C73657175656E6365466C6F772069643D22666C6F77362220736F757263655265663D226872417564697422207461726765745265663D226578636C75736976656761746577617936222F3E0D0A202020203C73657175656E6365466C6F772069643D22666C6F77332220736F757263655265663D22646570744C6561646572417564697422207461726765745265663D226578636C75736976656761746577617935222F3E0D0A202020203C73657175656E6365466C6F772069643D22666C6F77322220736F757263655265663D2273746172746576656E743122207461726765745265663D22646570744C65616465724175646974222F3E0D0A202020203C73657175656E6365466C6F772069643D22666C6F773422206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D226578636C7573697665676174657761793522207461726765745265663D226D6F646966794170706C79223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B216175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D22666C6F7731312220736F757263655265663D226D6F646966794170706C7922207461726765745265663D226578636C75736976656761746577617937222F3E0D0A202020203C73657175656E6365466C6F772069643D22666C6F77313222206E616D653D22E7BB93E69D9FE6B581E7A88B2220736F757263655265663D226578636C7573697665676174657761793722207461726765745265663D22656E646576656E7431223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B216175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D22666C6F77313022206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D226578636C7573697665676174657761793722207461726765745265663D22646570744C65616465724175646974223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D22666C6F773922206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D226578636C7573697665676174657761793622207461726765745265663D226D6F646966794170706C79223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B216175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D22666C6F773722206E616D653D22E5908CE6848F2220736F757263655265663D226578636C7573697665676174657761793622207461726765745265663D22656E646576656E7431223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A202020203C73657175656E6365466C6F772069643D22666C6F773522206E616D653D22E5908CE6848F2220736F757263655265663D226578636C7573697665676174657761793522207461726765745265663D2268724175646974223E0D0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A202020203C2F73657175656E6365466C6F773E0D0A20203C2F70726F636573733E0D0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F6C65617665223E0D0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D226C65617665222069643D2242504D4E506C616E655F6C65617665223E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2273746172746576656E7431222069643D2242504D4E53686170655F73746172746576656E7431223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223136352E302220793D2239322E35222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22646570744C65616465724175646974222069643D2242504D4E53686170655F646570744C65616465724175646974223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2235352E30222077696474683D223130352E302220783D223235312E313131313130373834303632332220793D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226578636C75736976656761746577617935222069643D2242504D4E53686170655F6578636C75736976656761746577617935223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223431372E373737373736393630313535382220793D2238372E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226D6F646966794170706C79222069643D2242504D4E53686170655F6D6F646966794170706C79223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2235352E30222077696474683D223130352E30303030303030303030303030362220783D223338352E323737373736393630313535382220793D223139302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2268724175646974222069643D2242504D4E53686170655F68724175646974223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2235352E30222077696474683D223130352E302220783D223534372E343037343036323038323238342220793D2238302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226578636C75736976656761746577617936222069643D2242504D4E53686170655F6578636C75736976656761746577617936223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731342E303734303732333834333231392220793D2238372E35222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E646576656E7431222069643D2242504D4E53686170655F656E646576656E7431223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223930302E3732323232303039363430352220793D223238332E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226578636C75736976656761746577617937222069643D2242504D4E53686170655F6578636C75736976656761746577617937223E0D0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223431372E373737373736393630313535382220793D223237372E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7732222069643D2242504D4E456467655F666C6F7732223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223139342E393439393938383034303735332220793D223130372E35222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223235312E313131313130373834303632332220793D223130372E35222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7733222069643D2242504D4E456467655F666C6F7733223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223335362E303631313130373834303536372220793D223130372E3330343334373832353337313535222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223431372E38353230333433383631363731332220793D223130372E3037343037313738323434383034222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7734222069643D2242504D4E456467655F666C6F7734223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223433372E373737373736393630313535382220793D223132362E39343039383130313236353832222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223433372E37373737373639363031353538352220793D223139302E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7735222069643D2242504D4E456467655F666C6F7735223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223435372E36363033343931363536353337372220793D223130372E3036313333353638363737353634222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223534372E3430373430363230383232352220793D223130372E3333383039323531383137393738222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7736222069643D2242504D4E456467655F666C6F7736223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223635322E333537343036323038323238332220793D223130372E35222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223731342E303734303732333834333231392220793D223130372E35222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F773130222069643D2242504D4E456467655F666C6F773130223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223431372E373737373736393630313535382220793D223239372E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223330332E302220793D223239372E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223330332E35323234323731363130343533362220793D223133342E3935222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7737222069643D2242504D4E456467655F666C6F7737223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223735332E383539313239303335383532392220793D223130372E3333343634333235393638303332222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223931342E302220793D223130362E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223931342E363638393136333439363730372220793D223238332E30303030303330333739303231222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F773131222069643D2242504D4E456467655F666C6F773131223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223433372E37373737373639363031353538352220793D223234342E3935303030303030303030303032222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223433372E373737373736393630313535382220793D223237372E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F773132222069643D2242504D4E456467655F666C6F773132223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223435372E37323536383539363030313032352220793D223239372E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223930302E3732323232303039363430352220793D223239372E30222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7739222069643D2242504D4E456467655F666C6F7739223E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223733342E303630353532333237343835342220793D223132372E3433363531333734333330353634222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223733342E302220793D223231372E30222F3E0D0A20202020202020203C6F6D6764693A776179706F696E7420783D223439302E323237373736393630313439322220793D223231372E34313133383430393632363836222F3E0D0A2020202020203C2F62706D6E64693A42504D4E456467653E0D0A202020203C2F62706D6E64693A42504D4E506C616E653E0D0A20203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E, 0); +INSERT INTO `act_ge_bytearray` VALUES ('15003', 1, '1.leave.png', '15001', 0x89504E470D0A1A0A0000000D49484452000003AA000001470806000000A839B16B000027164944415478DAEDDD0D9C5C75792FF0D5CBBDBDEDED8B56ADB552C5B742B5D5D662A5BE9428D8061B30A5CC9E3DB3C96E00090A4991F052B4A6A15AA48A8855ABA8A056A9A1521B6BA468360921312625A2A0D00868A2E01A931083060C21C0DCE79FCEDA339B7DCDEECECCCE7CBF9FCFF339B8B321F8E4E439CF6FCFBC7474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004DAD52A91CB665CB96EB366EDCF8E8AA55AB2A7D7D7DAA096AE5CA9595B56BD7DE1735C7598AF9643E994F00405B494BE0BA75EB2A3B76ECA8ECDBB74F3551EDDCB9B372D34D37FD3896C2539CA9984F6682F90400B48D74A7C212D8D4CBE0BEBEBEBECDCE54CC27653E01006D233D9DCEC2D5DC158BE07E672AE693329F0080B6915E6F64D96AFA45B0E24CC57C52E6130060111C540FDCBFADB265D3C72B77AC7CDB814AFF9CBE6651B30882F9643E0100D47D11DCB3BBBF72FB9716576EBBFE829A4A5F4B8F59D62C82D3C013B4C07C52E6931905002DB408DE7BC7E70F5A0207EAFB772CB7AC59049BDDCCA84AF588F9A4CC27330A005A6111DC7CE33B875D04D36396358B60133B3E6A77D415D5E32C2D319F94F9644601400B2C82B7F75D3CEC22981EB3AC59049B7C011C58FCD2DD8A9D1641F349994F66140058049545B01916C0D1BE8EF9A4CC27330A00A6D32298DE4573B845303D6659B308369999A32C7A038F7B3D98F9A4CC27330A80FAE8EEEE3EFCECB3CF7ECB39E79CB3E1B4D34EDB3E67CE9C7D5D5D5D9572B9FCF0BC79F376F4F6F6DE10FFFBFCF47DBA35B645F0EEF51F1876114C8F59D62C824DB8008EB6E0B96B613E29F3C98C0260EA2D5CB8B07BD1A245DF8EE3BE2BAFBCF2D18D1B3756FAFBFB2B7BF7EEAD24E9B863C78ECA2DB7DC52F9C8473EB2EB8C33CED81521F6CB799ECFB1088EBC88ECEAFF46E5F6154B0E7E5A5D7C2D3D6659B3083689E33BC6771762BCDF8FF9A4CC27330A80B1993F7FFE73CE3DF7DC6F9D77DE79FB53087DE491472A63F5B5AF7DED81B3CE3AEBDE08ABEB4BA5D2732D82C3D7D6AF7EF2A045307DCDA266116CB20570D621FCBA3D1641F349994F6614009366F1E2C58BCE38E38C87972F5F3EAE803AD8B265CBEEEDEEEEDED98E7757C7B4083EF450E5EEAF7CE8E0A7D5C5D7D26396358BE0345D0027EBD7633E994F985100FCB72BAFBCF2AD0B162C78F4AEBBEEAA4C86AD5BB73ED8DBDBFBC308ABAFB708FE4FEDD9DD5FB96BFDFB877D0D587A2C7D8F85CD22D820A3BD2949BDFF3D984FE613661440BBBAECB2CB9644487D2CBDE674326DDFBEFDA19E9E9E6DED746775D845F0A1872ADBEE5E5DF9E617DF32EC123850E97BD2F7BA7B61116CD00238594F8973D7C27C52E6931905C02187D4179E79E69993762775B02D5BB6DC572E97B747583DAA5D17C1D1EE52B87B61116C0283DF64E47151BDD5E3780CFE75DEBCC47C52E6931905C0F85D74D1453F48AF499D4AD75E7BEDD7BBBABAD6B5EB223896BB1423DDBDB0BC5904EBB400CE2A2C72574755AAC7B12E82C3FD3A8BA0F9A4CC27330A80B1BBFCF2CBCF0F8F3DFCF0C395A9366FDEBCBBDAE129C0432D8287BA040E94E5CD2258C70530E9AD2E7295712C82C50570A07A0A8F7B3D98F9A4CC27330A80B159BC78F1EEF41134F570F3CD37DFD90E7755C7FAF10FCA22D804865BCC865AE8465A0487FAFEAB86F87EAF07339F94F964460130B2152B561CB770E1C2097D0CCD78F5F4F4DC1361F5088BA0B2084E9E3CCFFBA25E71880BE0CC712C76432D82635D00072F829E62D78073C07C329FA6614835A300DACD95575EB9ECAAABAEAAD4D3A5975EBA3682EAF9164165119C3CF177AA922A9DA359961D33865F32D6456CB44570BC0B60F1F7DFD9E1AE45DDCF01F3C97C9A263F4833A300DAD9DBDFFEF66D1B376EAC6B505DBB76ED3762995A6E115416C1C93F370B75C3088BE1789FDA36DC22F8F8435C0007783D5803CE01F3C97C9A463F4833A300DAD5C2850B1FDEB66D5B5D836AFC7EF7C605EB5E8BA0B2084EE9B9F9B3C570D0397AA8AFBF1A6A11BC73020BE044FF7B38C473C07C329F5AEC07696614402BEAEDED7D6CEFDEBD750DAAF1FB3D1017A9BD164165119CFA73B3B8181E71C4116F9AE0C235D42238910570F022E8F560537C0EA4BB59E693F9D4C43F489B390D66D4E34AA5D2FF9A3F7FFEFF8EE3FF99376FDEFF8DE3CFCF9D3BF7FF9D74D249BFD4DDDDFDCBF1B52794CBE527F6F4F43C291E7B4A3CF66B71FCF53973E63C2D8E4F8FFFEFBF19C767A4F7EB88E3B3E2EFE573E2FB9F17C7DF4A9F371FC7DF8EE30BE2DFF5BB717C613CF67BF1BDBF1FC73F88C75E12C73F4C7F97E3B13FEAECEC7C793CF6CA38FE711C67C4F155713C2E1E7B4D7CCF9FC471661C4F88AFFD59FCF389713C298EB3E3F8E771FC8B78AC14C7CE3876C5318F63773C36378E3D719C17C753E3787AD41951F3A3DE105F7B631CCF8E6F5F18C7BF8CE39BE2786E1CCF8BC72E88E38571BC288E6F8EE35FC7638BE3F83771BC38BEF6B7717C7BD42551EF88FAFB78EC9D71BC2C1EBB3C8EEF89E37BE3F80F51EF8FC7FE318E1F8CE39571FC701C3F1AC7ABE37B3E16C74FC4F19FE2F8A9A87F8EFA74D4B551FF12755DD467A3FE2DEA7351FF9E9ECD17BFFEFA38FE471CBF18C72FA573308EABE2B83A8E6BE278537AD3CFA8F5515F89DA18F59F519BA26E89FA5AD4AD51B7457D33BEFF8E38FE571CBF15C7F486A177477D276A4BD477A3BE976ECE44F547FD20EA8751DBA37646ED8AFA51D4FD513F8EDA13F560D44FA31E8ADA17B53FEAD1A8C7D2DF19573ADA6EB16984E9FA97CD22D83A35863FCB96AA934F3EF9C0B276E491474EF4EFDEE387B84B7167F5EB137145FA77B5DB9F4B23CA7C12549BF1DA797CA8CE932B9A754655FF5B53607824EAE16A90D85B0D160F4458F9490A1CB107ECAE0690FBA2765483C9B66A50F97ED43DD500B3B51A68BE1D755735E86C4EC127EAF6F8F7A4974ADD16C7AF5703D257A36EAE06A70DD520F5E5A8B5D58075633570AD8C5A918258EA6D0A66515F887FCFE753608BE3B214E0E2F8AFF1FD9F49C12E8E4B53D08BE33571FC6435007EBC1A08AF8AFA480A8A511F4AC131EA03F1EBDF9702651C536FDE13C777C7F7BF2B05CF385E9A82681CFF2E8E6FAB06D425D5C0FAD6A8B7A4201BC7BF4AC136BD77493CB62805DE389E9302701C17C46367A5601CC73353508EE3EBE3785A0AD0F1CFBD2950A78F3D8CAF9553D08E639682771C4F89C74E4E813C8EAF4B013D8EB322E4BF3605F738FE690AF211EC8F8FEF7F750AF8713C3605FEF4C393F8FE97A51F04C4F1A5E90703713C3ABEFFC5E90706717C51FA01421C7FA7542A3D3FFD60218E47A61F34C4F1B9F1FDCF4E3F8088E333D30F24BABBBB0F8F5FF71BE90715F1EB9E9A7E7011C727C763BF9A7EA011C75F493FE088E32F9E78E289BF907EF071C20927FC5CFA41C88C19330EBBF8E28BD3B9FBB874EE4DE0872DE08EEA38EEA85A049545B03E8BE0A674714E17BB8ED1DF417322772BAEEE7047753A9C039EF1E107694D5BC71E7B6CC58C826167FCA3D5D00AEDC16B545B6F111CE6023D6D1E175427EDDCAC3927072D5C7B3AA6E6F55F87B2087AFD579DCF81660EAAED327FCCA711CF51330A86FE7BB47F886B3AB42EEFFADB7A8BE0504BD7E045AD991FB7084EF8DCDC905E7F34CAC56CBC770786FB7887A1DE51733C8BA077D46CC039D0EC41B51DE68FA03AEC0FD2CC2818FEEFD1C3E9B5D13A41DBF039AAADB7080AAA6DBB088EB6F80DB7088EB6808DF61984A37D86E1708EEEF019850D3907045541B5C97F906646C1D07F8FF6A5D7ADEA046D63C58A15C72D5CB8B0F2C8238FD42DA8F6F4F4A4371138C22228A80AAA0D37DADD82D116C08E435C04079EDA37DB1F41FD09AA82EA34F8419A190507FF3DDA9BDE655A27682B8B172FDE7DCB2DB7D425A4DE7CF3CDE91DEDD65904055541B5690C77D762AC0BE07817C181DFCF0228A80AAAE6931905630FAA3F4DEF08AC13B495CB2FBFFCFCF0583DEEAA9E7AEAA99BD3DB885B04055541B5A9A4BB16839FE2D6DB31FECF201C6A11EC19F4FB78BD97A02AA89A4F66148C3FA83E903EAF5727683B175E78E10F972F5F3EA521F5DA6BAF4D9F03B6AE1DDEB14C501554A7E922587CF392E242379605B063945FE7E31DCC2741D57C32A3E0D083EA9EF459AB3A41DBB9ECB2CB5E78E699673E7AD75D774D4948DDB265CB7DE572797B9EE74759047D3C4D878FA76956839F629716B89E8EF17F9CC3E05F37D1CF6FA58D826A878FA7319FCC28182AA8FEB8BBBBFB977582760DAB4B162C58F0D88E1D3B2635A46EDFBEFDA19E9E9E6DEDF094DFE9B0082A8BE03817C1891AEA297B984FCA7C32A3607C41F5FE52A9F42B3A413B87D57745589DB43BAB5BB76E7DB0B7B7777B96651759049545B0ED16C1C95E28319FCC27CC28DA35A8FEA85C2E3F5127686B8B172F5E74FAE9A7EF4FAF599DC81B2C2D5BB6ECDEEEEEEE9DF1176B9E45505904A79D893E15CE53E9CC27653E99513079417557A954FA559DA0EDCD9F3FFF39E79E7BEEDDE79D77DE23B7DE7AEBB8026A7CFF9E050B16DC532E97BFD22EAF49B5085A045B7C111CEFDD066F4A623E29F3C98C82C90DAAF7F5F4F43C4927A0EAECB3CFEE5DB468D177CE3AEBAC87AFBAEAAACAA64D9B2ADBB66DABECDDBBF740284DC7F49AD614663FF6B18FED3EE38C3376CD9D3BF73FD35DD47678775F8BA045B00D8CF7A9719E4A673E29F3C98C82C90FAA3B4AA5D253740206E9EEEE3E3CC2EAE273CE3967C3A9A79E9ADEC1777FFC85A9C4F1E19E9E9EFB7A7B7B57C4FF3E3FEA08DDB2085A04DB76113C3A6A4FD46C2D339F94F96446C1A406D5ED73E7CEFD359D002C8216416ACDAC2E783347787CA705D07C52E6931905531254B7954AA55FD709C0226811E460C3DDB5F0543AF349994F66144C6D50FDC19C39739EA6138045D022C8D816410BA0F9A4CC27330AA63EA87EBF542A3D5D27008BA04590D117C12B2C80E693329FCC28A84B504D1FFB78B84E0016418B20234BAFF7AAA43755D30AF349994FCD38A3AAF3C947D0D02A41F57BA552E9193A0158042D828CEE0982AAF9A4CCA7265EECF591563A9FBF5B2E979FA9138045D0228845D07C52E693F904CD723E6F29954ACFD209C0226811C422683E29F3C97C8266399FBF532E979FAD138045D0228845D07C52E693F904CD723E7F3BCBB2E7E8043021AB56ADB26C3577ED8D4570BF33D522683E29F3C97C8269723EDF552E979FA713C084AC5DBB76DB8E1D3B2C5C4D5AFDFDFDD7C622B8D9996A11349F94F9643EC134399FEFCCB2ECB774029890D5AB57BF6ECD9A35F76FDFBEFDA716AFE6BA539196C0952B577E2FEA1467AA45D07C3217CC27F309A6C9F9BC39CFF3A3740298B0583466F5F5F56D4A4FE14AAF379ACEB574E9D2039F9739DDFF7F54FF2C365B022D82E653EBCCA7162AF3C97C8291CEE7FFCAB2ECB77502A076382E4F17FC1933661CA61B580401F309EA7E3EDF9EE7F90B7402A02ACBB2636238EE4F17FC18903375048B20603E41DDCFE76FC64EF63B3A01F03F417559BAD8576B938E601104CC27A8FBF97C5B9EE72FD40980FF1E8A470FDC4D1DA808AEB374068B20603E415DCFE75B63077B914E0074FCCF6B5307D526AF55C52208984F503F1152BF5E2E977F4F270017F821EEA60E549EE7B375088B20603E41DDCEE75B22ACBE58270003B1ABEB86A1426AB536E8101641C07C82BA9DCF5F2D97CB7FA01340BB0FC361EFA67AAD2A1641C07C82BA9FCF37C7EEF5129D00DA7D182E1F29A47A07602C8280F904753D9FFFB35C2EFFA14E0014CC9B37EF095996EDD6092C8280F9040D399F37A4CFB6D709808272B9FCC418903FD2092C8280F9040D399FBF92E7F91FE90440414F4FCF936240DEA713580401F3091A723E7FB9B3B3F3E53A015090E7F9936340EED4092C8280F9040D399FD7C53EF60A9D0028983B77EEAFC580DCAE13580401F3091A723EAF8D7AA54E0014E479FED4188E3FD4092C8280F9040D399FD7C43E76AC4E0014CC9933E76931207FA013580401F3091A723EDF18354327000A4AA5D2D363387E5F27B00802E61334E47C5E95E7F9AB7502A0A0BBBBFBF01890F7EA041641C07C82869CCF2BA38ED309808252A9F48C188EDFD3092C8280F9040D399F57E479FE1A9D00282897CBCF8C01F95D9DC02208984FD090F3F94B5996FD894E0014944AA567C580DCA213580401F3091A723EDF90E7F94C9D0028C8B2EC393120BFAD13580401F3091A723EFF47EC6327E8044041A9547A6E0CC8BB75028B20603E41FD4548BDBE5C2EBF5627006A87E36FC505FF4E9DC02208984FD090F37979EC63B37402A0A0542A1D99E7F9B774028B20603E41FD4548FD7CEC6227EA0440ED70FCEDB8E0FF974E601104CC2768C8F9FCB9D8C75EA7130005A552E9F9799EDFA113580401F309EA2F42EAB2D8C566EB0440ED70FC9DB8E07F5327B00802E61334E47CFE6CEC6327EB0440419EE72F8C01799B4E601104CC27A8BF08A9FF1AFBD85FE80440ED707C515CF06FD5092C8280F904F51721F533B18F957402A0F662FFFB515FD3092C8280F9040D399FFF25C26AA74E00146459F6E21890B7E8041641C07C82869CCFD746653A01503B1C8F8EDAA413580401F3091A723E7F3A0F3A01509065D94B6240DEAC13580401F3091A723EFF73545927006A87E34BA336EA041641C07C82869CCF9FCAF37C8E4E0014C460FCA318905FD1092C8280F9040D399F3F19355727006A87E3CBA2D6EB041641C07C82869CCF9FC8F3BC5727000A6230BE2206E43A9DC02208984FD090F3F9E351F37402A07638BE326AAD4E601104CC2768C8F97C75D4693A015090E7F9B1311CD7E8041641C07C82869CCF57459DAE1300059D9D9DAF8AB0BA5A27B00802E613D45F96651F8D5DECF53A01501083F1D571C15FA513580401F3091A723E7F386ABE4E00147476761E1F61B54F27B00802E613D45F966557C62E76A64E0014C4607C4D5CF057E8041641C07C82869CCF1F8CB0FA469D00282897CB7F1AC3F18B3AD1F617C9E569F11BA536E91420A8C2E48A3DEC1FF33C3F4B27000A6230CE8C0BFE0D3AD1F64BDFD151FB470AAA71219DA55380A00A937E3EBF3FAEB10B7402A0A05C2EBF3686E3F53A41FA81C5084175C38C19330ED325405085C9157BD8FBF23C5FA81300B5C371567ADAA74E50BDAB3A64508D0BE86C1D020455987C718D7D6FEC63E7E80440ED703C3186E3E77582EAF237D46B5537B99B0A08AA3035620FBB22F6B137E90440ED707C5D5CF03FA7135497BF835EABEAB5A980A00A532742EAE571AD5DA41300B5C371760CC7653AC180743EB89B0A08AA50B7EBEEBB631F3B4F27006A87E3C971C1FFAC4E5038278E29BC3675A68E00822A4CE9F97C59D4F93A01503B1C4F89BA4E2718745E1C78ADAABBA980A00A532BCBB277E6797EA14E00D40EC7520CC7CFE8048396C0A32D8280A00A75399FFF3EEAAF7402A076386651D7EAC4C4542A95C3B66CD972DDC68D1B1F5DB56A55A5AFAF4F3541AD5CB9B2B276EDDAFBA2E6384B415085263D9FDF91E7F99B7502A020CBB2AE188E4B75626252485DB76E5D65C78E1D957DFBF6A926AA9D3B77566EBAE9A61F47683DC5990A822A34E1F97C49D45B7402A0763896A3FE59272626DD4915529B3AACEEEBEBEBDBEC4C0541159AF07C7E7BD45B7502A020CBB2EE3CCFAFD18989494FF715089BBB22A8EE77A682A00A4D783EBF2D6AB14E00D40EC7B9519FD4898949AF8714069B3EA85A6C415085663C9F2F8E5AA2130005799EF7C670FC844ED427A83E70FFB6CA964D1FAFDCB1F26D072AFD73FA9A2029A802822A6D7B3E2F49615527006A87E3BCA88FEBC4D407D53DBBFB2BB77F6971E5B6EB2FA8A9F4B5F4983029A802822AED27CBB2BFC9F3FC6F7502A0F6627F5AD4D53A31F541F5DE3B3E7F50481DA8EFDFB15C981454014195F63C9FDF9ADE504927006A87E3E95157E9C4D407D5CD37BE73D8A09A1E132605554050A5FD6459F6D7799EFF9D4E00D45EECCF88FA884E4C7D50BDBDEFE261836A7A4C981454014195F61321F5CD714EBF4327006A2FF6F3A33EAC1382AAA00A08AA507F59965D1461F5529D00A8BDD8BF21EA433A31F54135BDCBEF7041353D264C0AAA80A04AFB89907A6184D577EA0440ED703C2B86E33FEAC4D407D5BBD77F60D8A09A1E132605554050A5FDC41E7641EC63EFD20980DA8BFDD9511FD089A90FAABBFABF51B97DC592839FF61B5F4B8F0993822A20A8D27E22A49E1761F5DD3A01503B1C17C6707C9F4E4C7D504DB5F5AB9F3C28A8A6AF0992822A20A8D29E620F5B14FBD8E53A01507BB1FFCBA87FD0893A04D5871EAADCFD950F1DFCB4DFF85A7A4C981454014195B63C9FCF8D7A8F4E0014E479FEA62CCBAED089A90DAA7B76F757EE5AFFFE615FA39A1E4BDF23500AAA80A04A7B893DEC9CD8C7DEAB1300B5C3D1D34DA632A83EF45065DBDDAB2BDFFCE25B860DA90395BE277DAFBBAB822A20A8D256E7B367B7010CE605FC53175447BB8BEAEEAAA00A08AA107BD88238A7DFAF1300B5C3D15BA24F51501DCB5DD491EEAE0A97822A20A8D216E7B34F600018CC874C4F5D503DD4903A50C2A5A00A08AAB4BED8C3DE18E7F4077502A076385E1461F5529D98FCA0AA0455405085319CCF6F88FA904E001444487D730CC777E884A0DAEE4135FE1E1C9D65D932673308AA50E7F3797ED4877502A02016F3BF8EB0FA773A21A8B66B504D01356A79D47ECB2F08AAD080F3F98CA88FE80440ED705C1CF5369D1054DB2DA80E0EA803E56C064115EA29CFF3D76759F6519D002888C1F8373120FF562704D57609AA71CE1F939EE23B38A00AAA20A84283CEE7D3A2AED60980DAE17871D4129D10545BBD962E5D5A19EA0EAAA00A822A34529665A7E679FE319D0028487753D35D559D10545BBD460AA74AA9E957AE3CB4D02ED61BE7F4277402A02006E3DBA3DEAA13826ABB3CF5B7B3B3F3F838E737587E0168065996F54458FD279D00A80DAA97A477FED589D60DAAF19F3764D5EBF1667D33A5580A66C6F9BF4E5005A091E27A3427AE3F9FD20980DAA0FA8EF459AA3AD1DA4175A4AF4DF5E3CDFEF134D53BACEB0455001A21CBB2EED8C5AED10980DAA0FAF7517FA513826ABB06D501D53BAC1B9CCD00D4535C7FF2B8FE7C5A27000AB22C7B67CCC70B7542506DF7A00A000DDAC5BA62175BAA1300055D5D5D97459DAF1382AAA00A000DD9C5B2A86B7502A020CBB277E7797E9E4E08AA822A003464172BC52EF6199D0028E8EAEA7A4FD4B93A21A80AAA00D0905DEC94A8EB7402A020CFF3F76659768E4EB47650EDF0F134822A004D29F6B09323A87E5627000A6230FE43D45FEA44EB065525A802D0D4BBD89F47FD9B4E00D40EC7F76759B640270455411500EA2FF6B0D7C53EF6399D00A80DAA1F883A5B2704554115001AB28B9D14F5EF3A01503B1C3F9865D91B754250155401A0FE620F9B15FBD8729D00A80DAA1F8A7A834E08AA822A00346417FBB3A82FE80440ED70FC70D47C9D1054055500A8BF72B9FCDA2CCBAED7098082188C1FCDF3FCF53A21A80AAA00507FB187CDECEAEABA4127000A62305E1575BA4E08AA822A00D45FB95CFED32CCBBEA8130005799E7F2C86E3A93A21A80AAA00D0905DEC355D5D5D2B7402A02006E3C7A3E6E984A02AA80240FD7576761E1F61B54F27000A6230FE5396653D3A21A80AAA00D0905DECD55D5D5DAB7402A02006E3A76240CED1094155500580FAEBECEC7C55EC62AB7502A02006E335599675EB84A02AA802404376B163BBBABAD6E80440410CC64FC780CC754250155401A0FE3A3B3BFF3856B19B7402A02006E3D22CCBBA744250155401A0FEBABABA5E19B54E27006A87E3BF4458EDD4898959B56A9530D8DCB53782EA7E672A00CDA6B3B3F3E5B18F7D5927000A22A47E26CBB2924E4CCCDAB56BB7EDD8B143206CD2EAEFEFBF3682EA66672A00CD2642EACBA2D6EB04404184D47F8DB0FA173A3131AB57AF7EDD9A356BEEDFBE7DFB4F05C3E6BA939A42EACA952BBF17758A33158026DCC58E89A0BA4127000A6230FE5BD49FEBC4C445109AD5D7D7B7293DC534BD1E72BA579C179516F8FF91FE2C360BA90034F12EF6D2A88D3A01509065D9B23CCF67EB04435C38BDF910004CFD2EF692B8E6DEAC1300B561E4DFA34ED20904550068C8F5F6E8A84D3A01509065D9E7F33C3F5127105401A021BBD88BE39A7B8B4E00D486912F44FD994E20A8024043AEB7BF1FF5359D0028C8B2ECFA72B9FC5A9D4050058086EC622F8A6BEEAD3A01501B466EC8F37CA64E20A80240FDC51EF6C2B8E6DEA61300B561E44B5996FD894E20A80240FD757777FF6EEC62DFD00980DA30B222CFF3D7E804822A00D45FEC612F886BEEED3A01501B4656461DA71308AA00507FA552E9F91156EFD00980DA30B22A86E3AB7502411500EA2FF6B0A3E29ABB5927006AC3C88D51337402411500EAAF542A1D1961F55B3A01501083F1A6CECECE3FD609045500A8BF72B9FCBCB8E6DEA51300B561646DD42B7502411500EAAF542A3D37AEB977EB04406D18F9726767E7CB7502411500EAAF5C2E3F3BAEB9DFD10980DA30B23EEA653A81A00A00F5572A959E15D7DC2D3A01501B46366459768C4E20A8024043AEB747446DD50980DAE1B831EAA53A81A00A00F5572A959E11D7DCEFE904406D18B939CBB297E804822A0034E47AFB9B51F7E80440ED70FC6AB95CFE039D40500580FA2B954A4F8F6BEEF77502A0368CDC9265D98B75024115001A72BDFD8DA87E9D00288890FAF572B9FC7B3A81A00A00F5572A957E3DAEB9DB7402A0368CDC1A61F5453AD1F6E7C1F2144C47A94D3A0500932BCFF3A7C635F6873A01501021F51BDDDDDDBFAB136D1F548F8EDA3F52508D7365964E01C0E42A954A4F89EBEC0E9D00A80D28B7E779FE029D20CE851B4608AA1B66CC9871982E01C0E48A3DECC9719DDDA91300B5C3F18E52A9F47C9DA07A5775C8A01AE7C96C1D0280C9D7D3D3F3A4B8D6DEA71300B5E164738490A37482EAF930D46B5537B99B0A0053A35C2E3F31AEB53FD209808208A9DF2A954A47EA04D5A07AD06B55BD361500A6CEBC79F39E10D7DADD3A01501B4CEE2A97CBCFD30906C4C57299BBA9003065BB9777DA0718C3B0BCBB542A3D57272804D5630AAF4D9DA9230030A9BB9777DA0718C3B0FC4EB95C7EB64E30E8BC38F0D35E775301604AAEB3DE691F609441B935EA089DA0E8B8E38E7B55BA58EA04004CC9FEE59DF601461994DF2D97CBCFD4090AD2D37D2BC71E7BACA00A0053B78379A77D801186E43D51BFA913541D1F95DE79F08AEAD16B6400606A7630EFB40F30C290BCB7BBBBFB709DA01052072E92E9CEEA4E611500A68677DA07183EA8F647FD864E08A91D43DF411DEEEB00C0C483AA77DA071826A8FE60CE9C394FD389B6367394303AF0B80B28004CFE2EF685A8C7DC4D05A81D8E3FCCF3FCA93AD1F62175B410EACE2A004C507AB95596650B62FFBA2E7D967DD49EC2537FB7569F0A7CBE976501826A57D78E52A9F4149D684BC7778CEF4EE978BF1F0008E92367A2FA62EFDA3BC2E7A70EAE1BE3D7CCD13DA05D83EACE18824FD689B60DA9B30EE1D7ED115601604C7BD61151378C239C0E55EB4AA5D273751368B701BA2B86DFAFEA84905AC75F0F002D2FCBB2AE7443A0183ABBBBBB2B975E7A6965F5EAD5957BEEB9A7F2939FFCA4923CF8E08395FEFEFECAFAF5EB2B575C714565EEDCB9356135CFF307DC5D05DA2DA8FEA85C2E3F5127DAC6686F9C54EF7F0F00B462489D55FC8CD41450AFB9E69ACA8E1D3B2A63B17BF7EE03DF9F7EDDA0C0FA7ADD05DA25A8DE5F2A957E4527DA2AA44ED6D376DD59058083436A5731A42E5AB4E8C0DDD343917EDD05175C3038ACBAB30AB4BE18763F39E9A4937E49275ADEE037427A5C546FF5381E837F9D37580280AAEA6B527FF674DF254B96FCECE9BD872A3D2DF8924B2E19FC34E0A3741B68F581BAA7542AFDA24EB445489D55089B574755AAC7B186D5E17E9DB00A001D076E00F415EFA44E34A416C3EAA03BABEB741B68F5A0FAE089279EF80B3AD1362135E9AD86CDCA38C26A31A40E544FE171AF5905A0DD43EAECE26B520FF5E9BE233D0DB8F89A554F01065A3DA8FEB4542AFDBC4EB4A4E1C2E350A173A4B03AD4F75F35C4F77BCD2A00ED1C547F763735BD11D25458BA74A9BBAA40DB04D5874E38E1849FD389960DA933C7113E870AAB630DA983C3AAA70103D0522134EA15C33DDEDDDD7DF8C01B28A5BB9EBB76ED9A92A09ADE0D78D047D71CE14F0768D5A0BAAF542AFD1F9D6829630D8BA385D5F186D4E2EFBFB3C39D55005A675F1A78BA6D5F9665C70C7E3CBEB660E07BDEF5AE7755A652FA9CD542503DDF9F0ED0AA8377FF8C19330ED389960BA9630D89C385D5C71F62481DE035AB00B45C502DD40DC53BACF1BFAF1B786CCD9A35531A54D7AF5F5FFCEF58EE4F0768D5C1FBE8C5175FFC789D68CB903A5258BD73022175A2FF3D00D0EC41F567775853608D7FBE7BE06B93FD264A83F5F7F717FF1BEEF5A703B4EAE07DEC100208CD67A27730870AAB1309A983C3AAD7AC02D07241B5508F0CFCF3647D24CD481F5553F87DF7FAD301DA75F0AA6954133C1DD29DF5C17752EFAC7E7D22AE48FF2E7F3E4A29A5DAA1EA6112AFFD0030A5467B97DFD18C7447752C9FB33A1C77540168E51FEC6FCAB26C56D41E77540160F850B8A7636A5EA37A2861D56B540168D5A07A20A00EBC21A5D7A802C0D8C2E158EF600EF7113443BDEBEF78C2AA77FD05A01583EA863CCF670FFEC404EFFA0B00630FABA385C4D13E2775B4CF591DCED11D3E471580D60AAA35775007F339AA003036A3DDD11C2DA4761C62581D78FAF16C7F0400B48BEEEEEEC3D367D3A7F018FF5CD9B56BD79484D4DDBB7757E6CE9D5B0CAA47E83E00D3CD707756C71A52C71B56077E3F211580B6933E537520405E73CD35531254972E5D5A0CA9EB741D80E92ADD591DFC34DCDE8EF17F4EEA5061B567D0EFE335A900B473509D3D1022D35DD5C97E53A5F4EF4BFFDE81DF237EBF39BA0EC0740FABC537582A86CEB184D48E517E9D8FA001808E03AF65BD7120489E7BEEB98F4DD647D5A48FA4B9E0820B6AEEA60EF77A5900984E063F0D3885CC9E8EF17FE4CCE05F37D1CF6F0580560AAA4744ED1C08944B962C99F0E7AAA6907AC925971443EA9E3CCF8FD26D005A35AC4ED4504F2B0680B6966559D7C01B2B0DDC593DD4A701A75F37E84EAAA7FC0220ACD631F40240CB884039AF1856D36B4BD31B2CA577ED1DEBBBFBA6374E2ABE26355584E08B7417805635D1A7EB7ABA2F008C22DD598DDA5D0C9A2978A6CF595DB366CD81BBA5034F0B4E4FEFEDEFEFAFAC5FBFBEF2BEF7BDAF326FDEBC9A809A9EEE9BC2AFAE02D02E6175BC7744BD7112008C517ACD6AF1636B0EB1D6794D2A00ED64BC4FDFF5745F0038B4C07A4A35B0EE1F4F404D7751BDBB2F00C2EAF08E8EDA13355BCB00E0D07477771F1E81F54D1140AF8BDA1AB5B71A4AD3F1DEA8E551E7A73BB1BA0540BB9B590DA13347787CA7900A0000403D0D7767D5D37D010000689AB02AA4020000D03461F50A211500008066915E935AE9F011340000003491276801000000000000000000000000000000000000000000000000000000000000309AFF0F9CF6767038E3CF810000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('17502', 1, '请假流程.bpmn20.xml', '17501', 0x3C3F786D6C2076657273696F6E3D27312E302720656E636F64696E673D275554462D38273F3E0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E63652220786D6C6E733A7873643D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612220786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F44492220786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44492220747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F585061746822207461726765744E616D6573706163653D22636F6D2E6A736974652E6D6F64756C65732E6F612E6C65617665223E0A20203C70726F636573732069643D226C6561766522206E616D653D22E8AFB7E58187E6B581E7A88B2220697345786563757461626C653D2274727565223E0A202020203C646F63756D656E746174696F6E3EE8AFB7E58187E6B581E7A88BE6BC94E7A4BA3C2F646F63756D656E746174696F6E3E0A202020203C73746172744576656E742069643D2273746172746576656E743122206E616D653D22E58F91E8B5B7E6B581E7A88B2220666C6F7761626C653A696E69746961746F723D226170706C795573657249642220666C6F7761626C653A666F726D4B65793D222F6F612F6C656176652F666F726D222F3E0A202020203C757365725461736B2069643D22646570744C6561646572417564697422206E616D653D22E983A8E997A8E9A286E5AFBCE5AEA1E689B92220666C6F7761626C653A63616E64696461746547726F7570733D2264657074222F3E0A202020203C6578636C7573697665476174657761792069643D226578636C7573697665676174657761793522206E616D653D224578636C75736976652047617465776179222F3E0A202020203C757365725461736B2069643D226D6F646966794170706C7922206E616D653D22E8B083E695B4E794B3E8AFB72220666C6F7761626C653A61737369676E65653D22247B6170706C795573657249647D223E0A2020202020203C657874656E73696F6E456C656D656E74733E0A20202020202020203C666C6F7761626C653A7461736B4C697374656E6572206576656E743D22636F6D706C657465222064656C656761746545787072657373696F6E3D22247B6C656176654D6F6469667950726F636573736F727D222F3E0A20202020202020203C6D6F64656C65723A696E69746961746F722D63616E2D636F6D706C65746520786D6C6E733A6D6F64656C65723D22687474703A2F2F666C6F7761626C652E6F72672F6D6F64656C6572223E3C215B43444154415B66616C73655D5D3E3C2F6D6F64656C65723A696E69746961746F722D63616E2D636F6D706C6574653E0A2020202020203C2F657874656E73696F6E456C656D656E74733E0A202020203C2F757365725461736B3E0A202020203C757365725461736B2069643D226872417564697422206E616D653D22E4BABAE4BA8BE5AEA1E689B92220666C6F7761626C653A63616E64696461746547726F7570733D226872222F3E0A202020203C6578636C7573697665476174657761792069643D226578636C7573697665676174657761793622206E616D653D224578636C75736976652047617465776179222F3E0A202020203C656E644576656E742069643D22656E646576656E743122206E616D653D22456E64222F3E0A202020203C6578636C7573697665476174657761792069643D226578636C7573697665676174657761793722206E616D653D224578636C75736976652047617465776179222F3E0A202020203C73657175656E6365466C6F772069643D22666C6F77362220736F757263655265663D226872417564697422207461726765745265663D226578636C75736976656761746577617936222F3E0A202020203C73657175656E6365466C6F772069643D22666C6F77332220736F757263655265663D22646570744C6561646572417564697422207461726765745265663D226578636C75736976656761746577617935222F3E0A202020203C73657175656E6365466C6F772069643D22666C6F77322220736F757263655265663D2273746172746576656E743122207461726765745265663D22646570744C65616465724175646974222F3E0A202020203C73657175656E6365466C6F772069643D22666C6F773422206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D226578636C7573697665676174657761793522207461726765745265663D226D6F646966794170706C79223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B216175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D22666C6F7731312220736F757263655265663D226D6F646966794170706C7922207461726765745265663D226578636C75736976656761746577617937222F3E0A202020203C73657175656E6365466C6F772069643D22666C6F77313222206E616D653D22E7BB93E69D9FE6B581E7A88B2220736F757263655265663D226578636C7573697665676174657761793722207461726765745265663D22656E646576656E7431223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B216175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D22666C6F77313022206E616D653D22E9878DE696B0E794B3E8AFB72220736F757263655265663D226578636C7573697665676174657761793722207461726765745265663D22646570744C65616465724175646974223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D22666C6F773922206E616D653D22E4B88DE5908CE6848F2220736F757263655265663D226578636C7573697665676174657761793622207461726765745265663D226D6F646966794170706C79223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B216175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D22666C6F773722206E616D653D22E5908CE6848F2220736F757263655265663D226578636C7573697665676174657761793622207461726765745265663D22656E646576656E7431223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A202020203C73657175656E6365466C6F772069643D22666C6F773522206E616D653D22E5908CE6848F2220736F757263655265663D226578636C7573697665676174657761793522207461726765745265663D2268724175646974223E0A2020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6175646974506173737D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0A202020203C2F73657175656E6365466C6F773E0A20203C2F70726F636573733E0A20203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F6C65617665223E0A202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D226C65617665222069643D2242504D4E506C616E655F6C65617665223E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2273746172746576656E7431222069643D2242504D4E53686170655F73746172746576656E7431223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223136352E302220793D2239322E35222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22646570744C65616465724175646974222069643D2242504D4E53686170655F646570744C65616465724175646974223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2235352E30222077696474683D223130352E302220783D223235312E313131313130373834303632332220793D2238302E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226578636C75736976656761746577617935222069643D2242504D4E53686170655F6578636C75736976656761746577617935223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223431372E373737373736393630313535382220793D2238372E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226D6F646966794170706C79222069643D2242504D4E53686170655F6D6F646966794170706C79223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2235352E30222077696474683D223130352E30303030303030303030303030362220783D223338352E323737373736393630313535382220793D223139302E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2268724175646974222069643D2242504D4E53686170655F68724175646974223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2235352E30222077696474683D223130352E302220783D223534372E343037343036323038323238342220793D2238302E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226578636C75736976656761746577617936222069643D2242504D4E53686170655F6578636C75736976656761746577617936223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223731342E303734303732333834333231392220793D2238372E35222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E646576656E7431222069643D2242504D4E53686170655F656E646576656E7431223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223930302E3732323232303039363430352220793D223238332E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226578636C75736976656761746577617937222069643D2242504D4E53686170655F6578636C75736976656761746577617937223E0A20202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223431372E373737373736393630313535382220793D223237372E30222F3E0A2020202020203C2F62706D6E64693A42504D4E53686170653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7732222069643D2242504D4E456467655F666C6F7732223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223139342E393439393938383034303735332220793D223130372E35222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223235312E313131313130373834303632332220793D223130372E35222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7733222069643D2242504D4E456467655F666C6F7733223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223335362E303631313130373834303536372220793D223130372E3330343334373832353337313535222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431372E38353230333433383631363731332220793D223130372E3037343037313738323434383034222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7734222069643D2242504D4E456467655F666C6F7734223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433372E373737373736393630313535382220793D223132362E39343039383130313236353832222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433372E37373737373639363031353538352220793D223139302E30222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7735222069643D2242504D4E456467655F666C6F7735223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223435372E36363033343931363536353337372220793D223130372E3036313333353638363737353634222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223534372E3430373430363230383232352220793D223130372E3333383039323531383137393738222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7736222069643D2242504D4E456467655F666C6F7736223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223635322E333537343036323038323238332220793D223130372E35222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223731342E303734303732333834333231392220793D223130372E35222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F773130222069643D2242504D4E456467655F666C6F773130223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223431372E373737373736393630313535382220793D223239372E30222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330332E302220793D223239372E30222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223330332E35323234323731363130343533362220793D223133342E3935222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7737222069643D2242504D4E456467655F666C6F7737223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223735332E383539313239303335383532392220793D223130372E3333343634333235393638303332222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223931342E302220793D223130362E30222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223931342E363638393136333439363730372220793D223238332E30303030303330333739303231222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F773131222069643D2242504D4E456467655F666C6F773131223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433372E37373737373639363031353538352220793D223234342E3935303030303030303030303032222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223433372E373737373736393630313535382220793D223237372E30222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F773132222069643D2242504D4E456467655F666C6F773132223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223435372E37323536383539363030313032352220793D223239372E30222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223930302E3732323232303039363430352220793D223239372E30222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A2020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7739222069643D2242504D4E456467655F666C6F7739223E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733342E303630353532333237343835342220793D223132372E3433363531333734333330353634222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223733342E302220793D223231372E30222F3E0A20202020202020203C6F6D6764693A776179706F696E7420783D223439302E323237373736393630313439322220793D223231372E34313133383430393632363836222F3E0A2020202020203C2F62706D6E64693A42504D4E456467653E0A202020203C2F62706D6E64693A42504D4E506C616E653E0A20203C2F62706D6E64693A42504D4E4469616772616D3E0A3C2F646566696E6974696F6E733E, 0); +INSERT INTO `act_ge_bytearray` VALUES ('17503', 1, '请假流程.leave.png', '17501', 0x89504E470D0A1A0A0000000D49484452000003AA000001470806000000A839B16B000027164944415478DAEDDD0D9C5C75792FF0D5CBBDBDEDED8B56ADB552C5B742B5D5D662A5BE9428D8061B30A5CC9E3DB3C96E00090A4991F052B4A6A15AA48A8855ABA8A056A9A1521B6BA468360921312625A2A0D00868A2E01A931083060C21C0DCE79FCEDA339B7DCDEECECCCE7CBF9FCFF339B8B321F8E4E439CF6FCFBC7474000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004DAD52A91CB665CB96EB366EDCF8E8AA55AB2A7D7D7DAA096AE5CA9595B56BD7DE1735C7598AF9643E994F00405B494BE0BA75EB2A3B76ECA8ECDBB74F3551EDDCB9B372D34D37FD3896C2539CA9984F6682F90400B48D74A7C212D8D4CBE0BEBEBEBECDCE54CC27653E01006D233D9DCEC2D5DC158BE07E672AE693329F0080B6915E6F64D96AFA45B0E24CC57C52E6130060111C540FDCBFADB265D3C72B77AC7CDB814AFF9CBE6651B30882F9643E0100D47D11DCB3BBBF72FB9716576EBBFE829A4A5F4B8F59D62C82D3C013B4C07C52E6931905002DB408DE7BC7E70F5A0207EAFB772CB7AC59049BDDCCA84AF588F9A4CC27330A005A6111DC7CE33B875D04D36396358B60133B3E6A77D415D5E32C2D319F94F9644601400B2C82B7F75D3CEC22981EB3AC59049B7C011C58FCD2DD8A9D1641F349994F66140058049545B01916C0D1BE8EF9A4CC27330A00A6D32298DE4573B845303D6659B308369999A32C7A038F7B3D98F9A4CC27330A80FAE8EEEE3EFCECB3CF7ECB39E79CB3E1B4D34EDB3E67CE9C7D5D5D5D9572B9FCF0BC79F376F4F6F6DE10FFFBFCF47DBA35B645F0EEF51F1876114C8F59D62C824DB8008EB6E0B96B613E29F3C98C0260EA2D5CB8B07BD1A245DF8EE3BE2BAFBCF2D18D1B3756FAFBFB2B7BF7EEAD24E9B863C78ECA2DB7DC52F9C8473EB2EB8C33CED81521F6CB799ECFB1088EBC88ECEAFF46E5F6154B0E7E5A5D7C2D3D6659B3083689E33BC6771762BCDF8FF9A4CC27330A80B1993F7FFE73CE3DF7DC6F9D77DE79FB53087DE491472A63F5B5AF7DED81B3CE3AEBDE08ABEB4BA5D2732D82C3D7D6AF7EF2A045307DCDA266116CB20570D621FCBA3D1641F349994F6614009366F1E2C58BCE38E38C87972F5F3EAE803AD8B265CBEEEDEEEEDED98E7757C7B4083EF450E5EEAF7CE8E0A7D5C5D7D26396358BE0345D0027EBD7633E994F985100FCB72BAFBCF2AD0B162C78F4AEBBEEAA4C86AD5BB73ED8DBDBFBC308ABAFB708FE4FEDD9DD5FB96BFDFB877D0D587A2C7D8F85CD22D820A3BD2949BDFF3D984FE613661440BBBAECB2CB9644487D2CBDE674326DDFBEFDA19E9E9E6DED746775D845F0A1872ADBEE5E5DF9E617DF32EC123850E97BD2F7BA7B61116CD00238594F8973D7C27C52E6931905C02187D4179E79E69993762775B02D5BB6DC572E97B747583DAA5D17C1D1EE52B87B61116C0283DF64E47151BDD5E3780CFE75DEBCC47C52E6931905C0F85D74D1453F48AF499D4AD75E7BEDD7BBBABAD6B5EB223896BB1423DDBDB0BC5904EBB400CE2A2C72574755AAC7B12E82C3FD3A8BA0F9A4CC27330A80B1BBFCF2CBCF0F8F3DFCF0C395A9366FDEBCBBDAE129C0432D8287BA040E94E5CD2258C70530E9AD2E7295712C82C50570A07A0A8F7B3D98F9A4CC27330A80B159BC78F1EEF41134F570F3CD37DFD90E7755C7FAF10FCA22D804865BCC865AE8465A0487FAFEAB86F87EAF07339F94F964460130B2152B561CB770E1C2097D0CCD78F5F4F4DC1361F5088BA0B2084E9E3CCFFBA25E71880BE0CC712C76432D82635D00072F829E62D78073C07C329FA6614835A300DACD95575EB9ECAAABAEAAD4D3A5975EBA3682EAF9164165119C3CF177AA922A9DA359961D33865F32D6456CB44570BC0B60F1F7DFD9E1AE45DDCF01F3C97C9A263F4833A300DAD9DBDFFEF66D1B376EAC6B505DBB76ED3762995A6E115416C1C93F370B75C3088BE1789FDA36DC22F8F8435C0007783D5803CE01F3C97C9A463F4833A300DAD5C2850B1FDEB66D5B5D836AFC7EF7C605EB5E8BA0B2084EE9B9F9B3C570D0397AA8AFBF1A6A11BC73020BE044FF7B38C473C07C329F5AEC07696614402BEAEDED7D6CEFDEBD750DAAF1FB3D1017A9BD164165119CFA73B3B8181E71C4116F9AE0C235D42238910570F022E8F560537C0EA4BB59E693F9D4C43F489B390D66D4E34AA5D2FF9A3F7FFEFF8EE3FF99376FDEFF8DE3CFCF9D3BF7FF9D74D249BFD4DDDDFDCBF1B52794CBE527F6F4F43C291E7B4A3CF66B71FCF53973E63C2D8E4F8FFFEFBF19C767A4F7EB88E3B3E2EFE573E2FB9F17C7DF4A9F371FC7DF8EE30BE2DFF5BB717C613CF67BF1BDBF1FC73F88C75E12C73F4C7F97E3B13FEAECEC7C793CF6CA38FE711C67C4F155713C2E1E7B4D7CCF9FC471661C4F88AFFD59FCF389713C298EB3E3F8E771FC8B78AC14C7CE3876C5318F63773C36378E3D719C17C753E3787AD41951F3A3DE105F7B631CCF8E6F5F18C7BF8CE39BE2786E1CCF8BC72E88E38571BC288E6F8EE35FC7638BE3F83771BC38BEF6B7717C7BD42551EF88FAFB78EC9D71BC2C1EBB3C8EEF89E37BE3F80F51EF8FC7FE318E1F8CE39571FC701C3F1AC7ABE37B3E16C74FC4F19FE2F8A9A87F8EFA74D4B551FF12755DD467A3FE2DEA7351FF9E9ECD17BFFEFA38FE471CBF18C72FA573308EABE2B83A8E6BE278537AD3CFA8F5515F89DA18F59F519BA26E89FA5AD4AD51B7457D33BEFF8E38FE571CBF15C7F486A177477D276A4BD477A3BE976ECE44F547FD20EA8751DBA37646ED8AFA51D4FD513F8EDA13F560D44FA31E8ADA17B53FEAD1A8C7D2DF19573ADA6EB16984E9FA97CD22D83A35863FCB96AA934F3EF9C0B276E491474EF4EFDEE387B84B7167F5EB137145FA77B5DB9F4B23CA7C12549BF1DA797CA8CE932B9A754655FF5B53607824EAE16A90D85B0D160F4458F9490A1CB107ECAE0690FBA2765483C9B66A50F97ED43DD500B3B51A68BE1D755735E86C4EC127EAF6F8F7A4974ADD16C7AF5703D257A36EAE06A70DD520F5E5A8B5D58075633570AD8C5A918258EA6D0A66515F887FCFE753608BE3B214E0E2F8AFF1FD9F49C12E8E4B53D08BE33571FC6435007EBC1A08AF8AFA480A8A511F4AC131EA03F1EBDF9702651C536FDE13C777C7F7BF2B05CF385E9A82681CFF2E8E6FAB06D425D5C0FAD6A8B7A4201BC7BF4AC136BD77493CB62805DE389E9302701C17C46367A5601CC73353508EE3EBE3785A0AD0F1CFBD2950A78F3D8CAF9553D08E639682771C4F89C74E4E813C8EAF4B013D8EB322E4BF3605F738FE690AF211EC8F8FEF7F750AF8713C3605FEF4C393F8FE97A51F04C4F1A5E90703713C3ABEFFC5E90706717C51FA01421C7FA7542A3D3FFD60218E47A61F34C4F1B9F1FDCF4E3F8088E333D30F24BABBBB0F8F5FF71BE90715F1EB9E9A7E7011C727C763BF9A7EA011C75F493FE088E32F9E78E289BF907EF071C20927FC5CFA41C88C19330EBBF8E28BD3B9FBB874EE4DE0872DE08EEA38EEA85A049545B03E8BE0A674714E17BB8ED1DF417322772BAEEE7047753A9C039EF1E107694D5BC71E7B6CC58C826167FCA3D5D00AEDC16B545B6F111CE6023D6D1E175427EDDCAC3927072D5C7B3AA6E6F55F87B2087AFD579DCF81660EAAED327FCCA711CF51330A86FE7BB47F886B3AB42EEFFADB7A8BE0504BD7E045AD991FB7084EF8DCDC905E7F34CAC56CBC770786FB7887A1DE51733C8BA077D46CC039D0EC41B51DE68FA03AEC0FD2CC2818FEEFD1C3E9B5D13A41DBF039AAADB7080AAA6DBB088EB6F80DB7088EB6808DF61984A37D86E1708EEEF019850D3907045541B5C97F906646C1D07F8FF6A5D7ADEA046D63C58A15C72D5CB8B0F2C8238FD42DA8F6F4F4A4371138C22228A80AAA0D37DADD82D116C08E435C04079EDA37DB1F41FD09AA82EA34F8419A190507FF3DDA9BDE655A27682B8B172FDE7DCB2DB7D425A4DE7CF3CDE91DEDD65904055541B5690C77D762AC0BE07817C181DFCF0228A80AAAE6931905630FAA3F4DEF08AC13B495CB2FBFFCFCF0583DEEAA9E7AEAA99BD3DB885B04055541B5A9A4BB16839FE2D6DB31FECF201C6A11EC19F4FB78BD97A02AA89A4F66148C3FA83E903EAF5727683B175E78E10F972F5F3EA521F5DA6BAF4D9F03B6AE1DDEB14C501554A7E922587CF392E242379605B063945FE7E31DCC2741D57C32A3E0D083EA9EF459AB3A41DBB9ECB2CB5E78E699673E7AD75D774D4948DDB265CB7DE572797B9EE74759047D3C4D878FA76956839F629716B89E8EF17F9CC3E05F37D1CF6FA58D826A878FA7319FCC28182AA8FEB8BBBBFB977582760DAB4B162C58F0D88E1D3B2635A46EDFBEFDA19E9E9E6DEDF094DFE9B0082A8BE03817C1891AEA297B984FCA7C32A3607C41F5FE52A9F42B3A413B87D57745589DB43BAB5BB76E7DB0B7B7777B96651759049545B0ED16C1C95E28319FCC27CC28DA35A8FEA85C2E3F5127686B8B172F5E74FAE9A7EF4FAF599DC81B2C2D5BB6ECDEEEEEEE9DF1176B9E45505904A79D893E15CE53E9CC27653E99513079417557A954FA559DA0EDCD9F3FFF39E79E7BEEDDE79D77DE23B7DE7AEBB8026A7CFF9E050B16DC532E97BFD22EAF49B5085A045B7C111CEFDD066F4A623E29F3C98C82C90DAAF7F5F4F43C4927A0EAECB3CFEE5DB468D177CE3AEBAC87AFBAEAAACAA64D9B2ADBB66DABECDDBBF740284DC7F49AD614663FF6B18FED3EE38C3376CD9D3BF73FD35DD47678775F8BA045B00D8CF7A9719E4A673E29F3C98C82C90FAA3B4AA5D253740206E9EEEE3E3CC2EAE273CE3967C3A9A79E9ADEC1777FFC85A9C4F1E19E9E9EFB7A7B7B57C4FF3E3FEA08DDB2085A04DB76113C3A6A4FD46C2D339F94F96446C1A406D5ED73E7CEFD359D002C8216416ACDAC2E783347787CA705D07C52E6931905531254B7954AA55FD709C0226811E460C3DDB5F0543AF349994F66144C6D50FDC19C39739EA6138045D022C8D816410BA0F9A4CC27330AA63EA87EBF542A3D5D27008BA04590D117C12B2C80E693329FCC28A84B504D1FFB78B84E0016418B20234BAFF7AAA43755D30AF349994FCD38A3AAF3C947D0D02A41F57BA552E9193A0158042D828CEE0982AAF9A4CCA7265EECF591563A9FBF5B2E979FA9138045D0228845D07C52E693F904CD723E6F29954ACFD209C0226811C422683E29F3C97C8266399FBF532E979FAD138045D0228845D07C52E693F904CD723E7F3BCBB2E7E8043021AB56ADB26C3577ED8D4570BF33D522683E29F3C97C8269723EDF552E979FA713C084AC5DBB76DB8E1D3B2C5C4D5AFDFDFDD7C622B8D9996A11349F94F9643EC134399FEFCCB2ECB774029890D5AB57BF6ECD9A35F76FDFBEFDA716AFE6BA539196C0952B577E2FEA1467AA45D07C3217CC27F309A6C9F9BC39CFF3A3740298B0583466F5F5F56D4A4FE14AAF379ACEB574E9D2039F9739DDFF7F54FF2C365B022D82E653EBCCA7162AF3C97C8291CEE7FFCAB2ECB77502A076382E4F17FC1933661CA61B580401F309EA7E3EDF9EE7F90B7402A02ACBB2636238EE4F17FC18903375048B20603E41DDCFE76FC64EF63B3A01F03F417559BAD8576B938E601104CC27A8FBF97C5B9EE72FD40980FF1E8A470FDC4D1DA808AEB374068B20603E415DCFE75B63077B914E0074FCCF6B5307D526AF55C52208984F503F1152BF5E2E977F4F270017F821EEA60E549EE7B375088B20603E41DDCEE75B22ACBE58270003B1ABEB86A1426AB536E8101641C07C82BA9DCF5F2D97CB7FA01340BB0FC361EFA67AAD2A1641C07C82BA9FCF37C7EEF5129D00DA7D182E1F29A47A07602C8280F904753D9FFFB35C2EFFA14E0014CC9B37EF095996EDD6092C8280F9040D399F37A4CFB6D709808272B9FCC418903FD2092C8280F9040D399FBF92E7F91FE90440414F4FCF936240DEA713580401F3091A723E7FB9B3B3F3E53A015090E7F9936340EED4092C8280F9040D399FD7C53EF60A9D0028983B77EEAFC580DCAE13580401F3091A723EAF8D7AA54E0014E479FED4188E3FD4092C8280F9040D399FD7C43E76AC4E0014CC9933E76931207FA013580401F3091A723EDF18354327000A4AA5D2D363387E5F27B00802E61334E47C5E95E7F9AB7502A0A0BBBBFBF01890F7EA041641C07C82869CCF2BA38ED309808252A9F48C188EDFD3092C8280F9040D399F57E479FE1A9D00282897CBCF8C01F95D9DC02208984FD090F3F94B5996FD894E0014944AA567C580DCA213580401F3091A723EDF90E7F94C9D0028C8B2EC393120BFAD13580401F3091A723EFF47EC6327E8044041A9547A6E0CC8BB75028B20603E41FD4548BDBE5C2EBF5627006A87E36FC505FF4E9DC02208984FD090F37979EC63B37402A0A0542A1D99E7F9B774028B20603E41FD4548FD7CEC6227EA0440ED70FCEDB8E0FF974E601104CC2768C8F9FCB9D8C75EA7130005A552E9F9799EDFA113580401F309EA2F42EAB2D8C566EB0440ED70FC9DB8E07F5327B00802E61334E47CFE6CEC6327EB0440419EE72F8C01799B4E601104CC27A8BF08A9FF1AFBD85FE80440ED707C515CF06FD5092C8280F904F51721F533B18F957402A0F662FFFB515FD3092C8280F9040D399FFF25C26AA74E00146459F6E21890B7E8041641C07C82869CCFD746653A01503B1C8F8EDAA413580401F3091A723E7F3A0F3A01509065D94B6240DEAC13580401F3091A723EFF73545927006A87E34BA336EA041641C07C82869CCF9FCAF37C8E4E0014C460FCA318905FD1092C8280F9040D399F3F19355727006A87E3CBA2D6EB041641C07C82869CCF9FC8F3BC5727000A6230BE2206E43A9DC02208984FD090F3F9E351F37402A07638BE326AAD4E601104CC2768C8F97C75D4693A015090E7F9B1311CD7E8041641C07C82869CCF57459DAE1300059D9D9DAF8AB0BA5A27B00802E613D45F96651F8D5DECF53A01501083F1D571C15FA513580401F3091A723E7F386ABE4E00147476761E1F61B54F27B00802E613D45F966557C62E76A64E0014C4607C4D5CF057E8041641C07C82869CCF1F8CB0FA469D00282897CB7F1AC3F18B3AD1F617C9E569F11BA536E91420A8C2E48A3DEC1FF33C3F4B27000A6230CE8C0BFE0D3AD1F64BDFD151FB470AAA71219DA55380A00A937E3EBF3FAEB10B7402A0A05C2EBF3686E3F53A41FA81C5084175C38C19330ED325405085C9157BD8FBF23C5FA81300B5C371567ADAA74E50BDAB3A64508D0BE86C1D020455987C718D7D6FEC63E7E80440ED703C3186E3E77582EAF237D46B5537B99B0A08AA3035620FBB22F6B137E90440ED707C5D5CF03FA7135497BF835EABEAB5A980A00A532742EAE571AD5DA41300B5C371760CC7653AC180743EB89B0A08AA50B7EBEEBB631F3B4F27006A87E3C971C1FFAC4E5038278E29BC3675A68E00822A4CE9F97C59D4F93A01503B1C4F89BA4E2718745E1C78ADAABBA980A00A532BCBB277E6797EA14E00D40EC7520CC7CFE8048396C0A32D8280A00A75399FFF3EEAAF7402A076386651D7EAC4C4542A95C3B66CD972DDC68D1B1F5DB56A55A5AFAF4F3541AD5CB9B2B276EDDAFBA2E6384B415085263D9FDF91E7F99B7502A020CBB2AE188E4B75626252485DB76E5D65C78E1D957DFBF6A926AA9D3B77566EBAE9A61F47683DC5990A822A34E1F97C49D45B7402A0763896A3FE59272626DD4915529B3AACEEEBEBEBDBEC4C0541159AF07C7E7BD45B7502A020CBB2EE3CCFAFD18989494FF715089BBB22A8EE77A682A00A4D783EBF2D6AB14E00D40EC7B9519FD4898949AF8714069B3EA85A6C415085663C9F2F8E5AA2130005799EF7C670FC844ED427A83E70FFB6CA964D1FAFDCB1F26D072AFD73FA9A2029A802822A6D7B3E2F49615527006A87E3BCA88FEBC4D407D53DBBFB2BB77F6971E5B6EB2FA8A9F4B5F4983029A802822AED27CBB2BFC9F3FC6F7502A0F6627F5AD4D53A31F541F5DE3B3E7F50481DA8EFDFB15C981454014195F63C9FDF9ADE504927006A87E3E95157E9C4D407D5CD37BE73D8A09A1E132605554050A5FD6459F6D7799EFF9D4E00D45EECCF88FA884E4C7D50BDBDEFE261836A7A4C981454014195F61321F5CD714EBF4327006A2FF6F3A33EAC1382AAA00A08AA507F59965D1461F5529D00A8BDD8BF21EA433A31F54135BDCBEF7041353D264C0AAA80A04AFB89907A6184D577EA0440ED703C2B86E33FEAC4D407D5BBD77F60D8A09A1E132605554050A5FDC41E7641EC63EFD20980DA8BFDD9511FD089A90FAABBFABF51B97DC592839FF61B5F4B8F0993822A20A8D27E22A49E1761F5DD3A01503B1C17C6707C9F4E4C7D504DB5F5AB9F3C28A8A6AF0992822A20A8D29E620F5B14FBD8E53A01507BB1FFCBA87FD0893A04D5871EAADCFD950F1DFCB4DFF85A7A4C981454014195B63C9FCF8D7A8F4E0014E479FEA62CCBAED089A90DAA7B76F757EE5AFFFE615FA39A1E4BDF23500AAA80A04A7B893DEC9CD8C7DEAB1300B5C3D1D34DA632A83EF45065DBDDAB2BDFFCE25B860DA90395BE277DAFBBAB822A20A8D256E7B367B7010CE605FC53175447BB8BEAEEAAA00A08AA107BD88238A7DFAF1300B5C3D15BA24F51501DCB5DD491EEAE0A97822A20A8D216E7B34F600018CC874C4F5D503DD4903A50C2A5A00A08AAB4BED8C3DE18E7F4077502A076385E1461F5529D98FCA0AA0455405085319CCF6F88FA904E001444487D730CC777E884A0DAEE4135FE1E1C9D65D932673308AA50E7F3797ED4877502A02016F3BF8EB0FA773A21A8B66B504D01356A79D47ECB2F08AAD080F3F98CA88FE80440ED705C1CF5369D1054DB2DA80E0EA803E56C064115EA29CFF3D76759F6519D002888C1F8373120FF562704D57609AA71CE1F939EE23B38A00AAA20A84283CEE7D3A2AED60980DAE17871D4129D10545BBD962E5D5A19EA0EAAA00A822A34529665A7E679FE319D0028487753D35D559D10545BBD460AA74AA9E957AE3CB4D02ED61BE7F4277402A02006E3DBA3DEAA13826ABB3CF5B7B3B3F3F838E737587E0168065996F54458FD279D00A80DAA97A477FED589D60DAAF19F3764D5EBF1667D33A5580A66C6F9BF4E5005A091E27A3427AE3F9FD20980DAA0FA8EF459AA3AD1DA4175A4AF4DF5E3CDFEF134D53BACEB0455001A21CBB2EED8C5AED10980DAA0FAF7517FA513826ABB06D501D53BAC1B9CCD00D4535C7FF2B8FE7C5A27000AB22C7B67CCC70B7542506DF7A00A000DDAC5BA62175BAA1300055D5D5D97459DAF1382AAA00A000DD9C5B2A86B7502A020CBB277E7797E9E4E08AA822A003464172BC52EF6199D0028E8EAEA7A4FD4B93A21A80AAA00D0905DEC94A8EB7402A020CFF3F76659768E4EB47650EDF0F134822A004D29F6B09323A87E5627000A6230FE43D45FEA44EB065525A802D0D4BBD89F47FD9B4E00D40EC7F76759B640270455411500EA2FF6B0D7C53EF6399D00A80DAA1F883A5B2704554115001AB28B9D14F5EF3A01503B1C3F9865D91B754250155401A0FE620F9B15FBD8729D00A80DAA1F8A7A834E08AA822A00346417FBB3A82FE80440ED70FC70D47C9D1054055500A8BF72B9FCDA2CCBAED7098082188C1FCDF3FCF53A21A80AAA00507FB187CDECEAEABA4127000A62305E1575BA4E08AA822A00D45FB95CFED32CCBBEA8130005799E7F2C86E3A93A21A80AAA00D0905DEC355D5D5D2B7402A02006E3C7A3E6E984A02AA80240FD7576761E1F61B54F27000A6230FE5396653D3A21A80AAA00D0905DECD55D5D5DAB7402A02006E3A76240CED1094155500580FAEBECEC7C55EC62AB7502A02006E335599675EB84A02AA802404376B163BBBABAD6E80440410CC64FC780CC754250155401A0FE3A3B3BFF3856B19B7402A02006E3D22CCBBA744250155401A0FEBABABA5E19B54E27006A87E3BF4458EDD4898959B56A9530D8DCB53782EA7E672A00CDA6B3B3F3E5B18F7D5927000A22A47E26CBB2924E4CCCDAB56BB7EDD8B143206CD2EAEFEFBF3682EA66672A00CD2642EACBA2D6EB04404184D47F8DB0FA173A3131AB57AF7EDD9A356BEEDFBE7DFB4F05C3E6BA939A42EACA952BBF17758A33158026DCC58E89A0BA4127000A6230FE5BD49FEBC4C445109AD5D7D7B7293DC534BD1E72BA579C179516F8FF91FE2C360BA90034F12EF6D2A88D3A01509065D9B23CCF67EB04435C38BDF910004CFD2EF692B8E6DEAC1300B561E4DFA34ED20904550068C8F5F6E8A84D3A01509065D9E7F33C3F5127105401A021BBD88BE39A7B8B4E00D486912F44FD994E20A8024043AEB7BF1FF5359D0028C8B2ECFA72B9FC5A9D4050058086EC622F8A6BEEAD3A01501B466EC8F37CA64E20A80240FDC51EF6C2B8E6DEA61300B561E44B5996FD894E20A80240FD757777FF6EEC62DFD00980DA30B222CFF3D7E804822A00D45FEC612F886BEEED3A01501B4656461DA71308AA00507FA552E9F91156EFD00980DA30B22A86E3AB7502411500EA2FF6B0A3E29ABB5927006AC3C88D51337402411500EAAF542A1D1961F55B3A01501083F1A6CECECE3FD609045500A8BF72B9FCBCB8E6DEA51300B561646DD42B7502411500EAAF542A3D37AEB977EB04406D18F9726767E7CB7502411500EAAF5C2E3F3BAEB9DFD10980DA30B23EEA653A81A00A00F5572A959E15D7DC2D3A01501B46366459768C4E20A8024043AEB747446DD50980DAE1B831EAA53A81A00A00F5572A959E11D7DCEFE904406D18B939CBB297E804822A0034E47AFB9B51F7E80440ED70FC6AB95CFE039D40500580FA2B954A4F8F6BEEF77502A0368CDC9265D98B75024115001A72BDFD8DA87E9D00288890FAF572B9FC7B3A81A00A00F5572A957E3DAEB9DB7402A0368CDC1A61F5453AD1F6E7C1F2144C47A94D3A0500932BCFF3A7C635F6873A01501021F51BDDDDDDBFAB136D1F548F8EDA3F52508D7365964E01C0E42A954A4F89EBEC0E9D00A80D28B7E779FE029D20CE851B4608AA1B66CC9871982E01C0E48A3DECC9719DDDA91300B5C3F18E52A9F47C9DA07A5775C8A01AE7C96C1D0280C9D7D3D3F3A4B8D6DEA71300B5E164738490A37482EAF930D46B5537B99B0A0053A35C2E3F31AEB53FD209808208A9DF2A954A47EA04D5A07AD06B55BD361500A6CEBC79F39E10D7DADD3A01501B4CEE2A97CBCFD30906C4C57299BBA9003065BB9777DA0718C3B0BCBB542A3D57272804D5630AAF4D9DA9230030A9BB9777DA0718C3B0FC4EB95C7EB64E30E8BC38F0D35E775301604AAEB3DE691F609441B935EA089DA0E8B8E38E7B55BA58EA04004CC9FEE59DF601461994DF2D97CBCFD4090AD2D37D2BC71E7BACA00A0053B78379A77D801186E43D51BFA913541D1F95DE79F08AEAD16B6400606A7630EFB40F30C290BCB7BBBBFB709DA01052072E92E9CEEA4E611500A68677DA07183EA8F647FD864E08A91D43DF411DEEEB00C0C483AA77DA071826A8FE60CE9C394FD389B6367394303AF0B80B28004CFE2EF685A8C7DC4D05A81D8E3FCCF3FCA93AD1F62175B410EACE2A004C507AB95596650B62FFBA2E7D967DD49EC2537FB7569F0A7CBE976501826A57D78E52A9F4149D684BC7778CEF4EE978BF1F0008E92367A2FA62EFDA3BC2E7A70EAE1BE3D7CCD13DA05D83EACE18824FD689B60DA9B30EE1D7ED115601604C7BD61151378C239C0E55EB4AA5D273751368B701BA2B86DFAFEA84905AC75F0F002D2FCBB2AE7443A0183ABBBBBB2B975E7A6965F5EAD5957BEEB9A7F2939FFCA4923CF8E08395FEFEFECAFAF5EB2B575C714565EEDCB9356135CFF307DC5D05DA2DA8FEA85C2E3F5127DAC6686F9C54EF7F0F00B462489D55FC8CD41450AFB9E69ACA8E1D3B2A63B17BF7EE03DF9F7EDDA0C0FA7ADD05DA25A8DE5F2A957E4527DA2AA44ED6D376DD59058083436A5731A42E5AB4E8C0DDD343917EDD05175C3038ACBAB30AB4BE18763F39E9A4937E49275ADEE037427A5C546FF5381E837F9D37580280AAEA6B527FF674DF254B96FCECE9BD872A3D2DF8924B2E19FC34E0A3741B68F581BAA7542AFDA24EB445489D55089B574755AAC7B186D5E17E9DB00A001D076E00F415EFA44E34A416C3EAA03BABEB741B68F5A0FAE089279EF80B3AD1362135E9AD86CDCA38C26A31A40E544FE171AF5905A0DD43EAECE26B520FF5E9BE233D0DB8F89A554F01065A3DA8FEB4542AFDBC4EB4A4E1C2E350A173A4B03AD4F75F35C4F77BCD2A00ED1C547F763735BD11D25458BA74A9BBAA40DB04D5874E38E1849FD389960DA933C7113E870AAB630DA983C3AAA70103D0522134EA15C33DDEDDDD7DF8C01B28A5BB9EBB76ED9A92A09ADE0D78D047D71CE14F0768D5A0BAAF542AFD1F9D6829630D8BA385D5F186D4E2EFBFB3C39D55005A675F1A78BA6D5F9665C70C7E3CBEB660E07BDEF5AE7755A652FA9CD542503DDF9F0ED0AA8377FF8C19330ED389960BA9630D89C385D5C71F62481DE035AB00B45C502DD40DC53BACF1BFAF1B786CCD9A35531A54D7AF5F5FFCEF58EE4F0768D5C1FBE8C5175FFC789D68CB903A5258BD73022175A2FF3D00D0EC41F567775853608D7FBE7BE06B93FD264A83F5F7F717FF1BEEF5A703B4EAE07DEC100208CD67A27730870AAB1309A983C3AAD7AC02D07241B5508F0CFCF3647D24CD481F5553F87DF7FAD301DA75F0AA6954133C1DD29DF5C17752EFAC7E7D22AE48FF2E7F3E4A29A5DAA1EA6112AFFD0030A5467B97DFD18C7447752C9FB33A1C77540168E51FEC6FCAB26C56D41E77540160F850B8A7636A5EA37A2861D56B540168D5A07A20A00EBC21A5D7A802C0D8C2E158EF600EF7113443BDEBEF78C2AA77FD05A01583EA863CCF670FFEC404EFFA0B00630FABA385C4D13E2775B4CF591DCED11D3E471580D60AAA35775007F339AA003036A3DDD11C2DA4761C62581D78FAF16C7F0400B48BEEEEEEC3D367D3A7F018FF5CD9B56BD79484D4DDBB7757E6CE9D5B0CAA47E83E00D3CD707756C71A52C71B56077E3F211580B6933E537520405E73CD35531254972E5D5A0CA9EB741D80E92ADD591DFC34DCDE8EF17F4EEA5061B567D0EFE335A900B473509D3D1022D35DD5C97E53A5F4EF4BFFDE81DF237EBF39BA0EC0740FABC537582A86CEB184D48E517E9D8FA001808E03AF65BD7120489E7BEEB98F4DD647D5A48FA4B9E0820B6AEEA60EF77A5900984E063F0D3885CC9E8EF17FE4CCE05F37D1CF6F0580560AAA4744ED1C08944B962C99F0E7AAA6907AC925971443EA9E3CCF8FD26D005A35AC4ED4504F2B0680B6966559D7C01B2B0DDC593DD4A701A75F37E84EAAA7FC0220ACD631F40240CB884039AF1856D36B4BD31B2CA577ED1DEBBBFBA6374E2ABE26355584E08B7417805635D1A7EB7ABA2F008C22DD598DDA5D0C9A2978A6CF595DB366CD81BBA5034F0B4E4FEFEDEFEFAFAC5FBFBEF2BEF7BDAF326FDEBC9A809A9EEE9BC2AFAE02D02E6175BC7744BD7112008C517ACD6AF1636B0EB1D6794D2A00ED64BC4FDFF5745F0038B4C07A4A35B0EE1F4F404D7751BDBB2F00C2EAF08E8EDA13355BCB00E0D07477771F1E81F54D1140AF8BDA1AB5B71A4AD3F1DEA8E551E7A73BB1BA0540BB9B590DA13347787CA7900A0000403D0D7767D5D37D010000689AB02AA4020000D03461F50A211500008066915E935AE9F011340000003491276801000000000000000000000000000000000000000000000000000000000000309AFF0F9CF6767038E3CF810000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('2', 1, 'Expense.bpmn20.xml', '1', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E6365220D0A20202020202020202020202020786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4449220D0A20202020202020202020202020786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F4449220D0A20202020202020202020202020747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F5850617468220D0A202020202020202020202020207461726765744E616D6573706163653D22687474703A2F2F7777772E666C6F7761626C652E6F72672F70726F63657373646566223E0D0A202020203C70726F636573732069643D22457870656E736522206E616D653D22457870656E736550726F636573732220697345786563757461626C653D2274727565223E0D0A20202020202020203C646F63756D656E746174696F6E3EE68AA5E99480E6B581E7A88B3C2F646F63756D656E746174696F6E3E0D0A20202020202020203C73746172744576656E742069643D22737461727422206E616D653D22E5BC80E5A78B223E3C2F73746172744576656E743E0D0A20202020202020203C757365725461736B2069643D2266696C6C5461736B22206E616D653D22E587BAE5B7AEE68AA5E994802220666C6F7761626C653A61737369676E65653D22247B7461736B557365727D222020666C6F7761626C653A63616E64696461746547726F7570733D227475223E0D0A2020202020202020202020203C657874656E73696F6E456C656D656E74733E0D0A202020202020202020202020202020203C6D6F64656C65723A696E69746961746F722D63616E2D636F6D706C65746520786D6C6E733A6D6F64656C65723D22687474703A2F2F666C6F7761626C652E6F72672F6D6F64656C6572223E0D0A20202020202020202020202020202020202020203C215B43444154415B66616C73655D5D3E3C2F6D6F64656C65723A696E69746961746F722D63616E2D636F6D706C6574653E0D0A2020202020202020202020203C2F657874656E73696F6E456C656D656E74733E0D0A20202020202020203C2F757365725461736B3E0D0A20202020202020203C6578636C7573697665476174657761792069643D226A756467655461736B223E3C2F6578636C7573697665476174657761793E0D0A20202020202020203C212D2D3C757365725461736B2069643D226469726563746F7254616B22206E616D653D22E7BB8FE79086E5AEA1E689B9223E2D2D3E0D0A2020202020202020202020203C212D2D3C657874656E73696F6E456C656D656E74733E2D2D3E0D0A202020202020202020202020202020203C212D2D3C666C6F7761626C653A7461736B4C697374656E6572206576656E743D22637265617465222D2D3E0D0A2020202020202020202020202020202020202020202020202020202020202020202020202020203C212D2D636C6173733D22636F6D2E6578616D706C652E657870656E73656578742E4D616E616765725461736B48616E646C6572223E3C2F666C6F7761626C653A7461736B4C697374656E65723E2D2D3E0D0A2020202020202020202020203C212D2D3C2F657874656E73696F6E456C656D656E74733E2D2D3E0D0A20202020202020203C212D2D3C2F757365725461736B3E2D2D3E0D0A20202020202020203C757365725461736B2069643D226469726563746F7254616B22206E616D653D22E7BB8FE79086E5AEA1E689B92220666C6F7761626C653A61737369676E65653D22247B656D706C6F7965657D222020666C6F7761626C653A63616E64696461746547726F7570733D226A6C222F3E0D0A20202020202020203C757365725461736B2069643D22626F73735461736B22206E616D653D22E88081E69DBFE5AEA1E689B92220666C6F7761626C653A61737369676E65653D22247B656D706C6F7965657D222020666C6F7761626C653A63616E64696461746547726F7570733D226C62222F3E0D0A20202020202020203C212D2D3C757365725461736B2069643D22626F73735461736B22206E616D653D22E88081E69DBFE5AEA1E689B9223E2D2D3E0D0A2020202020202020202020203C212D2D3C657874656E73696F6E456C656D656E74733E2D2D3E0D0A202020202020202020202020202020203C212D2D3C666C6F7761626C653A7461736B4C697374656E6572206576656E743D22637265617465222D2D3E0D0A2020202020202020202020202020202020202020202020202020202020202020202020202020203C212D2D636C6173733D22636F6D2E6578616D706C652E657870656E73656578742E426F73735461736B48616E646C6572223E3C2F666C6F7761626C653A7461736B4C697374656E65723E2D2D3E0D0A2020202020202020202020203C212D2D3C2F657874656E73696F6E456C656D656E74733E2D2D3E0D0A20202020202020203C212D2D3C2F757365725461736B3E2D2D3E0D0A20202020202020203C656E644576656E742069643D22656E6422206E616D653D22E7BB93E69D9F223E3C2F656E644576656E743E0D0A20202020202020203C73657175656E6365466C6F772069643D226469726563746F724E6F7450617373466C6F7722206E616D653D22E9A9B3E59B9E2220736F757263655265663D226469726563746F7254616B22207461726765745265663D2266696C6C5461736B223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6F7574636F6D653D3D27E9A9B3E59B9E277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D22626F73734E6F7450617373466C6F7722206E616D653D22E9A9B3E59B9E2220736F757263655265663D22626F73735461736B22207461726765745265663D2266696C6C5461736B223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6F7574636F6D653D3D27E9A9B3E59B9E277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D22666C6F77312220736F757263655265663D22737461727422207461726765745265663D2266696C6C5461736B223E3C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D22666C6F77322220736F757263655265663D2266696C6C5461736B22207461726765745265663D226A756467655461736B223E3C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D226A756467654D6F726522206E616D653D22E5A4A7E4BA8E353030E585832220736F757263655265663D226A756467655461736B22207461726765745265663D22626F73735461736B223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6D6F6E6579203E203530307D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D22626F737350617373466C6F7722206E616D653D22E9809AE8BF872220736F757263655265663D22626F73735461736B22207461726765745265663D22656E64223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6F7574636F6D653D3D27E9809AE8BF87277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D226469726563746F7250617373466C6F7722206E616D653D22E9809AE8BF872220736F757263655265663D226469726563746F7254616B22207461726765745265663D22656E64223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6F7574636F6D653D3D27E9809AE8BF87277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D226A756467654C65737322206E616D653D22E5B08FE4BA8E353030E585832220736F757263655265663D226A756467655461736B22207461726765745265663D226469726563746F7254616B223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6D6F6E6579203C3D203530307D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A202020203C2F70726F636573733E0D0A202020203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F457870656E7365223E0D0A20202020202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D22457870656E7365222069643D2242504D4E506C616E655F457870656E7365223E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223238352E302220793D223133352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2266696C6C5461736B222069643D2242504D4E53686170655F66696C6C5461736B223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223430352E302220793D223131302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226A756467655461736B222069643D2242504D4E53686170655F6A756467655461736B223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223538352E302220793D223133302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226469726563746F7254616B222069643D2242504D4E53686170655F6469726563746F7254616B223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223733352E302220793D223131302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22626F73735461736B222069643D2242504D4E53686170655F626F73735461736B223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223535352E302220793D223235352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223737312E302220793D223238312E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7731222069643D2242504D4E456467655F666C6F7731223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223331352E302220793D223135302E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223430352E302220793D223135302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7732222069643D2242504D4E456467655F666C6F7732223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223530352E302220793D223135302E3136363131323935363831303632223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223538352E343333333333333333333333332220793D223135302E3433333333333333333333333334223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D226A756467654C657373222069643D2242504D4E456467655F6A756467654C657373223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223632342E353533303732363235363938332220793D223135302E3434363932373337343330313638223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223733352E302220793D223135302E31333932373537363630313637223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D226469726563746F724E6F7450617373466C6F77222069643D2242504D4E456467655F6469726563746F724E6F7450617373466C6F77223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223738352E302220793D223131302E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223738352E302220793D2233372E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223435352E302220793D2233372E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223435352E302220793D223131302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22626F737350617373466C6F77222069643D2242504D4E456467655F626F737350617373466C6F77223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223635352E302220793D223239352E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223737312E302220793D223239352E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D226A756467654D6F7265222069643D2242504D4E456467655F6A756467654D6F7265223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223630352E343334303237373737373737382220793D223136392E3536353937323232323232323233223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223630352E313338343038333034343938332220793D223235352E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D226469726563746F7250617373466C6F77222069643D2242504D4E456467655F6469726563746F7250617373466C6F77223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223738352E302220793D223139302E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223738352E302220793D223238312E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22626F73734E6F7450617373466C6F77222069643D2242504D4E456467655F626F73734E6F7450617373466C6F77223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223535352E302220793D223239352E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223435352E302220793D223239352E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223435352E302220793D223139302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A20202020202020203C2F62706D6E64693A42504D4E506C616E653E0D0A202020203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E, 0); +INSERT INTO `act_ge_bytearray` VALUES ('2502', 1, 'Expense2.bpmn20.xml', '2501', 0x3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554462D38223F3E0D0A3C646566696E6974696F6E7320786D6C6E733D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4D4F44454C2220786D6C6E733A7873693D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D612D696E7374616E6365220D0A20202020202020202020202020786D6C6E733A666C6F7761626C653D22687474703A2F2F666C6F7761626C652E6F72672F62706D6E2220786D6C6E733A62706D6E64693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F42504D4E2F32303130303532342F4449220D0A20202020202020202020202020786D6C6E733A6F6D6764633D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F44432220786D6C6E733A6F6D6764693D22687474703A2F2F7777772E6F6D672E6F72672F737065632F44442F32303130303532342F4449220D0A20202020202020202020202020747970654C616E67756167653D22687474703A2F2F7777772E77332E6F72672F323030312F584D4C536368656D61222065787072657373696F6E4C616E67756167653D22687474703A2F2F7777772E77332E6F72672F313939392F5850617468220D0A202020202020202020202020207461726765744E616D6573706163653D22687474703A2F2F7777772E666C6F7761626C652E6F72672F70726F63657373646566223E0D0A202020203C70726F636573732069643D22457870656E736522206E616D653D22457870656E736550726F636573732220697345786563757461626C653D2274727565223E0D0A20202020202020203C646F63756D656E746174696F6E3EE68AA5E99480E6B581E7A88B3C2F646F63756D656E746174696F6E3E0D0A20202020202020203C73746172744576656E742069643D22737461727422206E616D653D22E5BC80E5A78B223E3C2F73746172744576656E743E0D0A20202020202020203C757365725461736B2069643D2266696C6C5461736B22206E616D653D22E587BAE5B7AEE68AA5E994802220666C6F7761626C653A61737369676E65653D22247B7461736B557365727D222020666C6F7761626C653A63616E64696461746547726F7570733D227475223E0D0A2020202020202020202020203C657874656E73696F6E456C656D656E74733E0D0A202020202020202020202020202020203C6D6F64656C65723A696E69746961746F722D63616E2D636F6D706C65746520786D6C6E733A6D6F64656C65723D22687474703A2F2F666C6F7761626C652E6F72672F6D6F64656C6572223E0D0A20202020202020202020202020202020202020203C215B43444154415B66616C73655D5D3E3C2F6D6F64656C65723A696E69746961746F722D63616E2D636F6D706C6574653E0D0A2020202020202020202020203C2F657874656E73696F6E456C656D656E74733E0D0A20202020202020203C2F757365725461736B3E0D0A20202020202020203C6578636C7573697665476174657761792069643D226A756467655461736B223E3C2F6578636C7573697665476174657761793E0D0A20202020202020203C212D2D3C757365725461736B2069643D226469726563746F7254616B22206E616D653D22E7BB8FE79086E5AEA1E689B9223E2D2D3E0D0A2020202020202020202020203C212D2D3C657874656E73696F6E456C656D656E74733E2D2D3E0D0A202020202020202020202020202020203C212D2D3C666C6F7761626C653A7461736B4C697374656E6572206576656E743D22637265617465222D2D3E0D0A2020202020202020202020202020202020202020202020202020202020202020202020202020203C212D2D636C6173733D22636F6D2E6578616D706C652E657870656E73656578742E4D616E616765725461736B48616E646C6572223E3C2F666C6F7761626C653A7461736B4C697374656E65723E2D2D3E0D0A2020202020202020202020203C212D2D3C2F657874656E73696F6E456C656D656E74733E2D2D3E0D0A20202020202020203C212D2D3C2F757365725461736B3E2D2D3E0D0A20202020202020203C757365725461736B2069643D226469726563746F7254616B22206E616D653D22E7BB8FE79086E5AEA1E689B92220666C6F7761626C653A61737369676E65653D22247B656D706C6F7965657D222020666C6F7761626C653A63616E64696461746547726F7570733D226A6C222F3E0D0A20202020202020203C757365725461736B2069643D22626F73735461736B22206E616D653D22E88081E69DBFE5AEA1E689B92220666C6F7761626C653A61737369676E65653D22247B656D706C6F7965657D222020666C6F7761626C653A63616E64696461746547726F7570733D226C62222F3E0D0A20202020202020203C212D2D3C757365725461736B2069643D22626F73735461736B22206E616D653D22E88081E69DBFE5AEA1E689B9223E2D2D3E0D0A2020202020202020202020203C212D2D3C657874656E73696F6E456C656D656E74733E2D2D3E0D0A202020202020202020202020202020203C212D2D3C666C6F7761626C653A7461736B4C697374656E6572206576656E743D22637265617465222D2D3E0D0A2020202020202020202020202020202020202020202020202020202020202020202020202020203C212D2D636C6173733D22636F6D2E6578616D706C652E657870656E73656578742E426F73735461736B48616E646C6572223E3C2F666C6F7761626C653A7461736B4C697374656E65723E2D2D3E0D0A2020202020202020202020203C212D2D3C2F657874656E73696F6E456C656D656E74733E2D2D3E0D0A20202020202020203C212D2D3C2F757365725461736B3E2D2D3E0D0A20202020202020203C656E644576656E742069643D22656E6422206E616D653D22E7BB93E69D9F223E3C2F656E644576656E743E0D0A20202020202020203C73657175656E6365466C6F772069643D226469726563746F724E6F7450617373466C6F7722206E616D653D22E9A9B3E59B9E2220736F757263655265663D226469726563746F7254616B22207461726765745265663D2266696C6C5461736B223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6F7574636F6D653D3D27E9A9B3E59B9E277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D22626F73734E6F7450617373466C6F7722206E616D653D22E9A9B3E59B9E2220736F757263655265663D22626F73735461736B22207461726765745265663D2266696C6C5461736B223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6F7574636F6D653D3D27E9A9B3E59B9E277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D22666C6F77312220736F757263655265663D22737461727422207461726765745265663D2266696C6C5461736B223E3C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D22666C6F77322220736F757263655265663D2266696C6C5461736B22207461726765745265663D226A756467655461736B223E3C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D226A756467654D6F726522206E616D653D22E5A4A7E4BA8E353030E585832220736F757263655265663D226A756467655461736B22207461726765745265663D22626F73735461736B223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6D6F6E6579203E203530307D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D22626F737350617373466C6F7722206E616D653D22E9809AE8BF872220736F757263655265663D22626F73735461736B22207461726765745265663D22656E64223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6F7574636F6D653D3D27E9809AE8BF87277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D226469726563746F7250617373466C6F7722206E616D653D22E9809AE8BF872220736F757263655265663D226469726563746F7254616B22207461726765745265663D22656E64223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6F7574636F6D653D3D27E9809AE8BF87277D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A20202020202020203C73657175656E6365466C6F772069643D226A756467654C65737322206E616D653D22E5B08FE4BA8E353030E585832220736F757263655265663D226A756467655461736B22207461726765745265663D226469726563746F7254616B223E0D0A2020202020202020202020203C636F6E646974696F6E45787072657373696F6E207873693A747970653D2274466F726D616C45787072657373696F6E223E3C215B43444154415B247B6D6F6E6579203C3D203530307D5D5D3E3C2F636F6E646974696F6E45787072657373696F6E3E0D0A20202020202020203C2F73657175656E6365466C6F773E0D0A202020203C2F70726F636573733E0D0A202020203C62706D6E64693A42504D4E4469616772616D2069643D2242504D4E4469616772616D5F457870656E7365223E0D0A20202020202020203C62706D6E64693A42504D4E506C616E652062706D6E456C656D656E743D22457870656E7365222069643D2242504D4E506C616E655F457870656E7365223E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D227374617274222069643D2242504D4E53686170655F7374617274223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2233302E30222077696474683D2233302E302220783D223238352E302220793D223133352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D2266696C6C5461736B222069643D2242504D4E53686170655F66696C6C5461736B223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223430352E302220793D223131302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226A756467655461736B222069643D2242504D4E53686170655F6A756467655461736B223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2234302E30222077696474683D2234302E302220783D223538352E302220793D223133302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D226469726563746F7254616B222069643D2242504D4E53686170655F6469726563746F7254616B223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223733352E302220793D223131302E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22626F73735461736B222069643D2242504D4E53686170655F626F73735461736B223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2238302E30222077696474683D223130302E302220783D223535352E302220793D223235352E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E53686170652062706D6E456C656D656E743D22656E64222069643D2242504D4E53686170655F656E64223E0D0A202020202020202020202020202020203C6F6D6764633A426F756E6473206865696768743D2232382E30222077696474683D2232382E302220783D223737312E302220793D223238312E30223E3C2F6F6D6764633A426F756E64733E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E53686170653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7731222069643D2242504D4E456467655F666C6F7731223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223331352E302220793D223135302E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223430352E302220793D223135302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22666C6F7732222069643D2242504D4E456467655F666C6F7732223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223530352E302220793D223135302E3136363131323935363831303632223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223538352E343333333333333333333333332220793D223135302E3433333333333333333333333334223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D226A756467654C657373222069643D2242504D4E456467655F6A756467654C657373223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223632342E353533303732363235363938332220793D223135302E3434363932373337343330313638223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223733352E302220793D223135302E31333932373537363630313637223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D226469726563746F724E6F7450617373466C6F77222069643D2242504D4E456467655F6469726563746F724E6F7450617373466C6F77223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223738352E302220793D223131302E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223738352E302220793D2233372E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223435352E302220793D2233372E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223435352E302220793D223131302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22626F737350617373466C6F77222069643D2242504D4E456467655F626F737350617373466C6F77223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223635352E302220793D223239352E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223737312E302220793D223239352E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D226A756467654D6F7265222069643D2242504D4E456467655F6A756467654D6F7265223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223630352E343334303237373737373737382220793D223136392E3536353937323232323232323233223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223630352E313338343038333034343938332220793D223235352E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D226469726563746F7250617373466C6F77222069643D2242504D4E456467655F6469726563746F7250617373466C6F77223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223738352E302220793D223139302E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223738352E302220793D223238312E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A2020202020202020202020203C62706D6E64693A42504D4E456467652062706D6E456C656D656E743D22626F73734E6F7450617373466C6F77222069643D2242504D4E456467655F626F73734E6F7450617373466C6F77223E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223535352E302220793D223239352E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223435352E302220793D223239352E30223E3C2F6F6D6764693A776179706F696E743E0D0A202020202020202020202020202020203C6F6D6764693A776179706F696E7420783D223435352E302220793D223139302E30223E3C2F6F6D6764693A776179706F696E743E0D0A2020202020202020202020203C2F62706D6E64693A42504D4E456467653E0D0A20202020202020203C2F62706D6E64693A42504D4E506C616E653E0D0A202020203C2F62706D6E64693A42504D4E4469616772616D3E0D0A3C2F646566696E6974696F6E733E, 0); +INSERT INTO `act_ge_bytearray` VALUES ('2503', 1, 'Expense2.Expense.png', '2501', 0x89504E470D0A1A0A0000000D494844520000034D00000159080600000044DBC48800001BCC4944415478DAEDDD4D6C94F79D07706FC521873DE4B0871E7240DA481B690FBD70C8A107ABEA8103AB466DAC613C6E18D1C86E1B926212A4888690A645254515AA5329414B55A5650B55849CD46171624378292F0A4D94502214604D8299604C899D42FC12B09F7DFED4934EEC19DBE337C6F37C3ED24F10CF18D07FFEF9CDEFEBE7656A6A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000806459B97265A494526AF2F26E0100090F4D5601409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100409F04000C0300E89300806100409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100409FB40A00601800409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100409F04000C0300E89300806100409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100409F04000C0300E89300806100409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100007D1200300C00E89300806100409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C0024D1952B57BED3D2D212C5BD72A9D50000A10980025114DDF5C9279FF4C5A2C6C6C6D7AC0800084D0014E8EEEEFE7D34E6D8B163B9743AFD80550100A10980D88D1B37BE363232321A15D8BC797377369BBDDBEA0080D00490783D3D3D5DD138FDFDFD3D994CE65756070084268044BB78F1E2C6A884D6D6D69EB86F2EB34A0050BD01A92D84A429EAA49502922ACE455F1D1A1AFABC54681A1D1D1D6E6E6E3E555B5BBBC46A01407586A66571DD9C2C34A552A915560A48AA4B972E1D8FA6D0D5D5D59D4EA7D75A2D00A8DEE0B46F92D074DC4F4F81243B7AF4E85499291A1C1C3C187A66369BBDCB8A01407586A665A54293DBE90249F7F4D34F3F32D9E97921336DD8B0E18F8E340140F507A762D7369D749409A0A666F7EEDD1F944A4CE7CF9F7FD15179004846689A706D936B9900FEA1AEAEEEDE381C0D16B909C4E94C2673DADDF3002021E290D4EA281340715BB76E7D3E0E492385A169C78E1DBF897BE736AB0300C9094DF7175CCBB4DC8A00FC53F841527B7B7B6FC107DBFE21EE97E7B2D9ECDD56070012247F6D93A34C0013AD59B3E61B7D7D7D4371458D8D8D9D6E960300C90C4DB7EFA46725008ADBBE7DFBBE96969670DD67ABD50080324551B4A4ABABEBE513274E8CECDFBF3FEAE8E858941542D362FDB777767646870F1FFE5B5C0D7624E893F3517BF7EEBDDD27F7ECD9A34F0240B9C22070E4C891A8B7B7371A1E1E5677A8AE5EBD1A1D3A74E8D3783078D0AE047D723E2A97CBE993003013E127A70253C50C04C31D1D1D67EC4AD027953E09400509A79A7823AE9C8A87819B7625E8934A9F04A0828473C5BD0957D430E08616A04F2A7D1280C5380CDCE8BF1C759DFC6DF47EE7B3B72BFC3E7CCD1BB86100F4497D529F0420F1C3C0F5BE5C74FAF58DD17B7BD77FA9C2D7C263DEC40D03A04FEA93FA2400891E06BADFFFD38441205F97DE6FF3266E18007D529FD4270148F63070E6CDE74A0E03E1316FE28601D027F5497D1280440F03A73B9E29390C84C7BC891B06409FD427F549000C038601C300E893FAA43E098061A07885BB40951A06C263DEC40D03A04FEA93FA2400891E06CE1DFD75C961203CE64DDC3000FAA43EA94F0290E861E05AEE5474FA8D4D134F3989BF161EF3266E18007D529FD4270148F43010EAC25F7E376118085FF3066E18007D529FD42701300C0C0D45E78EBD30F19493F86BE1316FE28601D027F5497D1280C40E03E193ECCF1E7DBEE4B9FAE1319F766F18007D529FD4270148DE303034145D3E7720FA6BFB86928340BEC273C273FD34D53000FAA43EA94F0290886160AA9F9AFA69AA6100F4497D529F0420D1C3C0747E6A3AD94F53BDA91B06AAC8DD96007D529F04C03030E10D69A68340BEBCA91B06AAC4F2B8A2B15FD127F5497D1200C380320C50E09B71F5C5B56DECD71596449F54FA240086016518E0CB81291F94C291A6AB82933EA9F449000C03CA30C0C4C034D5D7D127953E0980614019061263F914C128FFB86B9CF449A54F02942F8AA2BB4E9D3AD5F4D24B2F1DDAB265CBA78F3DF6D8CD6C361BAD5CB9326A686818FDC10F7E30FCE31FFFB8EBB9E79EDB19D77F5831C380320C5468609A2A1039E2A44F2A7D12A0FCB0B467CF9EDFFDF4A73FBDB976EDDA68FBF6EDD1891327A25C2E170D0E0E4641F8B5B7B7377AFBEDB7A33854453FFAD18F469B9B9B3F6C6C6C7CD80A1A069461A0027CB3A6BC2348E53E1F7D52E9934052C5E168F5CF7EF6B3A1F5EBD7DF0E44B76EDD8AA6EBDD77DF8D9E7CF2C95B4D4D4D67EAEAEAEEB59A86016518B8C38169C50CBEEFBAE0A44F2A7D12A0A838F32C79F5D5570F7CFFFBDF8FDADADACA0A4BE3B5B7B747AB57AF1E70D4C930A00C038B2830CDD5F7A34F2A7D12A8D6C074F0E0C1B71E7DF4D1E8ECD9B3D15CF8F0C30FA338800D3CFCF0C38F5861C38061C030B040A6BAE9C342FF39E8934A9F04AA4538C2140253B846692E853FAFB1B1F17A3A9D6EB0CA8601C3000B1498E6EAD43A479CF449A54F02FC43B886299C92375747988A1D717AE8A187FAE2E0749FD5360C18069827E36FE2F02F71AD1AFBB51CE3BFCFCD21F449A54F024917EE92F7ECB3CF0E876B98E6D3DEBD7B073299CC712B6E18300C308F81694541F0F94D687163BF4E373895FA3EC1499F54FA249064ADADADFF13EE92F7F9E79F47F3ED873FFC618FD3F40C038601E6393005ABC6824F5446702A0C4CF97AA8E071D738E9934A9F0492281C650A9FC3146E2BBE10DE7BEFBD61479B0C038601E650A920532C004D169C8A3D7F4791E7BBC6499F54FA249034A74E9D6A0A377F98CDADC5CBB57AF5EA9E952B572EB5FA33974EA73BE2FABA61C03090A4FD3C49605A5E46102A169CA61B98C60727A7EAE9934A9F0492E0A5975E3AB463C78E68216DDBB6EDDD38343D61F5672E5EBF2854180A52A9D4FD8601C34012F6F30C83CB54C1A9DCC054F8F75FAD71C4499F54FA2450FDB66CD9F2E98913271634341D3B76ECC3F88DACCDEACF7E1828A87DC57EA26A18300C54D37E2E1298A61B584A05A7AFCC3030E5B9C6499F54FA2490048F3DF6D8CDCB972F2F6868EAE9E9E98DDFBCBAADFE9C0E035FFC44B57028300C1806AA693FCF30304D169C3E9845609AEDBF077D52E993C06291CD66A3C1C1C1050D4DE1EF8BDFB806ADFEDC0F03853F510DA7A318060C03D5B49F6B667F64A758709A4D601A1F9C5CE3A44F2A7D12A8D637953B611A6F666A0ECA305059654FCEBCBEFDED6FE7C3CDB659B6BDAF1439C2F4C1D8D767639BD7499F54421350A556AD5A35BAD0479A0606067A1C699AB79FA09E4CA5522B6A6B6B9784E719060C03D5B49F6BA6BE5BDE6C8E3495F301B88E34E9934A9F0492E4D1471F1D5EE86B9A3EFEF8E30F5CD334E7C3C0F8E1B2A612878112C3EA823D6E1858DCFBB920A05CAF999F6B9A66129C5CD3A44FEA93FA2450ED366EDC786EA1EF9EF7FAEBAFFFAFBBE7CDD930703C9D4E3F5062B8ACC86160B2AFCDF7E38681C5BD9F8B0495E91ED929755BF16277CF2B2738B97B9E3EA94FEA9340126CDDBA75C7427F4ED3A64D9BF6FA9CA6590F0393FD24DE306018A8CAFD5C22384D1558A6FA1CA6E97E00EE78CB6A7C4E933EA94FEA9340323CF5D453FFBE66CD9A915BB76E2DD8CDF3EAEBEBFF2F7E335B6AF5E79F61C03050E5A63AD233DD0FAE2D3738E54F117CC04BA04FEA93FA249010EBD6AD3BFFF6DB6F2FD4A9793BE3C074C4AA1B060C03CC9152479CA61B98CA0D4EF9BF4F60D227F5497D124892EF7DEF7B758F3FFEF8CD0538DAD4575F5FFF4E3A9D6EB0EA8601C30073281C711A7FAADCAA9AF23F87A958707A68DCDFE31A267D529FD42781A46A6A6A3AD5D6D636AF89295C3F158E329579DD028601C300D30D4E853787280C40E57C706DA9EF735B717D529FD42781A40BD718AD5EBD7AE0ECD9B3F312984E9D3AF56AFC775C4EA7D3F759ED640F03356EA5CBFC197FAA5E083C0FD5947F1BF1F1DF37DBCF87429FD427F549A05A343434649A9A9A3EEBEDED9DD3C074E9D2A53FD7D7D77FE4B43CC3800F6D340CDC81E0345BC54EFD439F54FA249064994C66756363E3F5B93AE2148E3085C0944AA59EB4BA8601C38061609105271F5CAB4F2A7D12A0B838E0AC6C6868F8F495575EB9318B9B43F4FDF297BFFC6D38252FAEAC55350C28C3C0029BED29754EC9D327953E0930B9708D537D7DFDFEA6A6A69E77DE7967A09CCF617AE38D3776C5A1EB64B8E9836B980C03CA305001C1A9DC23456EFAA04F2A7D12A0ACF0F460084FD96CB677CB962DEFFFF9CF7FFE2897CB5D1E1C1CBC9D900606067A3EFEF8E30F3A3B3B5F7BE69967F6653299AE1096C2D12577C9330C28C3400528F7143BA7E4E9934A9F049899380CDD934EA7D7C661E8E5B82EC435185734F66B775C6D713D118E50592DC380320C2CD2E0B42CAEEB353EB8569F54FA24008601651848A0E5638168F9248F5F1598F449A54F026018508681242B75C4C92979FAA4D22701300C28C300250292C0A44FEA4FFA240086016FC286014A04A76D0213FAA43E098061C09BB06180E296879BD9D4B8ADB83EA94FEA93001806BC091B06286E2C34A14FEA4FFA240086016FC286018426F4497D12000C0386018426F4497D12000C0386018426F4497D12000C0386018426F4497D12000C0386018426F449A54F026018508601A1097D52E99300180694614068429F54FA240086016518109AD027953E0980614019068426F449A54F0260185086018426F4497D12000C0386018426F4497D12000C0386018426F4497D12000C0386018426F4497D12000C0386018426F449A54F026018300C18068426F449A54F025051F6EFDFEF4DB8726A301E066EDA954213FAA4D22701A820870F1FBEDCDBDBEB8DB8022A97CBED8E87813376A5D0843EA9F449002AC8810307BE75F0E0C1FE2B57AE0C7843BE733F390D83406767E747713D68570A4DE893F31438F4490098A9F80D68454747C7C970CA4338577CB1D5AE5DBBA230DC2EC67FFB5885753F6310109AD027E7ABDE7AEBADA8A5A5256A6D6DD5270120A1836D5B186E6B6B6B97580D8426F8B2288AEEFAE4934FFA62516363E36B5604001226954ADD1F0FB637C3709B4EA7975B118426F8B2EEEEEEDF47638E1D3B968B7BE50356050092159A5AC3603B5627AD084213FCD38D1B37BE363232321A15D8BC797377369BBDDBEA00403206DA65F9A34CF98A43D40A2B83D004FFD0D3D3D3158DD3DFDFDF93C9647E6575002019036D5B6160CA1F6D726D134213D4D45CBC78716354426B6B6B4FF8C193550280EA1E66271C65CA97F3F5119A48BA38177D756868E8F352A169747474B8B9B9F9941F320140750FB3FB8A05A6B13A6E85109A48B24B972E1D8FA6D0D5D5D59D4EA7D75A2D00A8CE41B6E45126D7362134414DCDD1A347A7CA4CD1E0E0E0C1B0C7B3D9EC5D560C00AA6F906D9B2C30B9931E421349F7F4D34F3F32D9E97921336DD8B0E18F8E340180E116EC2B126BF7EEDD1F944A4CE7CF9F7F319CCAEC9A260030DC827D4562D5D5D5DD1B87A3C1223781389DC9644EBB7B1E00186EC1BE22F1B66EDDFA7C1C92460A43D38E1D3B7E934AA5B6591D0030DC827D45E285D3EFDADBDB7B0B3ED8F60FF1BE3E97CD66EFB63A0060B805FB0A626BD6ACF9465F5FDF505C51636363A7CFB20300C32DD85730CEF6EDDBF7B5B4B4848F6368B51A0060B805FB0AC609A7E385FD1C6E0E613500C0700BF615D8CF00806100FB0AEC6700C030807D05F633006018C0BE02FB1900300C605F81FD0C001806B0AFC07E06000C03D857603F03008601B0AFB09F0100C300D857D8CF00806100EC2BB09F0100C300F615D8CF00806100FB0AEC6700C030807D05F633006018C0BE02FB1900300C605F81FD0C001806B0AFC07E06000C03D857603F03008601B0AFB09F0100C300D857D8CF00806100EC2BB09F0100C300F615D8CF00806100FB0AEC6700C030807D05F633006018C0BE02FB1900300C605F81FD0C001806B0AFC07E06000C03605F613F03008601B0AFB09F0100C300D857603F038061C030807D05F633006018C0BE02FB1900300C605F81FD0C001806B0AFC07E06000C03D857603F03008601EC2BB09F0100C300F615D8CF00806100EC2BEC6700C03000F615F63300601880F2F7505BD84753D4492B853E0900180648EA1E5A16D7CDC942532A955A61A5D0270100C30049DE47FB26094DC76B6B6B975825F44900C0304092F7D1B252A1299D4E3F6085D0270100C300F652F16B9B4E3ACA843E09001806A0A6F8B54DAE65429F04000C0350200E49AD8E32A14F02008601281D9AEE2FB89669B915419F04000C0330714FDDBEB6C95126F44900C03000C5F7D432FB0A7D1200300C302FA2285AD2D5D5F5F289132746F6EFDF1F757474A805AECECECEE8F0E1C37F8BABC18E449F04000C03152604A623478E44BDBDBDD1F0F0B0BA4375F5EAD5E8D0A1439FC601EA41BB127D12000C0386810A128E30094C15139C863B3A3ACED895E893006018300C5490704A9EC052391587A69B7625FA240018060C0315245C5323AC545468F2FF07FA240018060C038B3134DDE8BF1C759DFC6DF47EE7B3B72BFC3E7C4DD0119AD0270100C340E243D3F5BE5C74FAF58DD17B7BD77FA9C2D7C263C28ED0843E09001806121D9ABADFFFD384C094AF4BEFB7093B4213FA240060184876683AF3E673254353784CD8119AD0270100C340A243D3E98E674A86A6F098B02334A14F02008601A14968129AD0270100C380D054BCC2DDF24A85A6F098B02334A14F020086814487A673477F5D323485C7841DA1097D1200300C243A345DCB9D8A4EBFB169E2A979F1D7C263C28ED0843E09001806121D9A425DF8CBEF2684A6F035414768429F04000C0342D3D05074EED80B134FCD8BBF161E13768426F44900C03090D8D074BD2F179D3DFA7CC96B9AC263E139028FD0C48C7B625BE88B53D4492B0500421395169A8686A2CBE70E447F6DDF503230E52B3C273CD75127A18919F5C46571DD9C2C34A552A915560A0084262A28344D7574C95127A18939EF8BFB26094DC76B6B6B97582500109AA8A0D0349DA34B931D75127E8426CAEE8BCB4A85A6743AFD80150200A1890A0B4D330D4CF9127E842666D41B8B5DDB74D2512600109AA8C0D0A48426EE486F9C706D936B99004068426852421305E290D4EA2813002034094D4A68A27468BABFE05AA6E556040084268426253431B147DEBEB6C9512600109A109A94D0442C93C9DC934AA5D6C4BDF1E5B8CEC5F5D9D8D1A6C1B82E8C9DB2F744789ED50200A109A14968129A1223DC4A3CAE8EB88627FB60DB71F566FCFC06AB070042134293D04435F7C0A571F0692F232815AB23757575F75A4D00109A109A8426AA4A2A955A595F5FFF496100CA6432D1CF7FFEF3E8C08103D1C58B17A3BFFFFDEF51F0D9679F45B95C2E3A7AF468B46DDBB6E8BBDFFDEEF8E074DD512700109A109A8426AA2930AD8843CEADC2B0B473E7CEA8B7B7379A8EBEBEBEDBCF0FDF57189EE23FF361AB0B0042134293D0C4620F4C2B0B03D3BA75EB6E1F559A89F07DEBD7AF1F1F9C1C710200A109A1496862D1F6BCA585A7E46DDAB4E98B53F0662A9CBAB779F3E6F1A7EADD67B50140684268129A5874E2C0D459788469B681A930388D3BE274C46A0380D084D02434B1A884DB8A175EC334D353F2263B55AFF01A27A7E90180D0C40CD4D6D62E119AAA27344DF57A5271A1A9231F68C24D1CE6C3AE5DBB1C6D0200A189998867A9AF5EBA74E978B85DF1534F3DF578A9615B685A1CA169BAAF270B1786E2FAFA64CFC96432F7E46FFE108E065DBB766D5E4253B8ABDEB8DB912FF50A0180D0C4142E5EBCB8717070F0667EA81A1A1AFA7CF7EEDDE71E79E491FF149A165F682AE7F564E1FAD8D8E9701DA954EAFE62CF89BFBE26FFBC5FFCE217D17C0A9FE354109A9EF00A0180D04409376EDCF8DA952B573E2C35585DB8706170CB962D2F66B3D9BB84A6CA0F4D33793D59D8D05450FBC61F798ABFF672FEF183070FCE6B680A47200BFE2D6D5E2100109A18279E99EEEAEEEEFEFDC8C8C8E854C3D5E8E8E8487B7BFBDF9A9B9BFF4B68AACCD0349BD7933B169ABE38F2940F4FF17F9FCB7F7DAE6F00315E2E972BFC77747B85004068A2C0952B57BED3DFDFFFE90CAE83187AE18517F6B7B5B5092B15546FBDF556349BD7331ED8FFCDFF15772E34151E798A6B20FFDF73759BF1C96E3F5EF0770F7A8500A0FA870D5546B5B4B4DCBE107C26178F87EF0D7F46F829B5C072E72BBC0E73F17AAACAAB8550F8F779A701002810EED0D5D8D8F8DAB163C72E8F8E8EDE9ACE70D5DFDFFF87A6A6A63753A9546B4C60A9A07AE59557A2D9BC9EEE9C76C77FF873327E1D5684BB1BC6BFBFEE4813004005091FA2F9939FFCA4BBAFAFAF7792EB5F4E6FDFBEFDBFC3B516E1F9E1FB2AED9AA6F89F54B416EAF14AB911C44C5F4FEE5868FA222C153CC7354D000095A6AEAEEE5F3399CCAFF6ECD9D33B3232325030530D9E3F7FFEC5F8B1D3F160B72D9BCDDE9DFF9E4A0C4D937D6DBE1FAFA4BBE7CDE4F564C143D3F110588B7D6E96BBE7010054F640B7ACB9B9F9545757576E6060E0D0860D1BFE1886BBF0F5F1CF159A2A3734CDE4F564C1FE1F9B7064693C9FD3040050E1C230974EA7D78EDD06796DA9E14E68AAFCD054CEEB49E508D71BC6AFD7CDF09AC5BF8FAE5DBB362F8129DC04A4A1A161B420342DB5FA00006586A7C91E179A1647689AEEEB4965099FDB940F333B77EE9C97D0B46BD7AEC2A34C47AC3A00C01C139A16576862D185A607F281261C6D9AEB1B42843FAFBEBE7EB4E0C3751BAC3A0080D02434B1A8C461E6CD7CA859B76EDD9CDD7E3CDC66FCF1C71FBF557894C9914800808484A61AB71CA7BA42D3D2B8AEE6C3CDA64D9B661D9C4260DABC7973E1754CD7D3E9F47D561B002001A129E9253455A7542AB5327F5388FC11A7999EAA17BE6FDC1126A7E50100084D42138B5F1C6EB285C1295CE3146E0E11EE7E37DDBBE4859B3E145EC3142A0E644F5A5D0000A14968A22A84234E71F515869E109EC2E738850FC00D4791F2A7EE8553F072B9DCED0FAE6D69698956AD5A3552F87DE194BC10C4AC2A0080D024345155C2354E85B7229F611D710D130080D0243451EDE1E9C1B1F074B39CB0148E2EB94B1E0080D024349118994CE69E383CAD8DC3D0CB715D886B702C20855FBBE36A8BEB897084CA6A0100084D4293D00400004293129A000040685242130000084D4A68020000A149094D0000203429A1090000109A842600004068129A000000A149680200008426A1090000109A94D00400004293129A000040685242130000084D4A68020000A149094D000080D024340100004293D0040000084D421300002034094D000080D02434D9950000203429A10900001687FDFBF70B2B9553837168BA695702004005397CF8F0E5DEDE5E81A5022A97CBED8E43D319BB1200002AC8810307BE75F0E0C1FE2B57AE0C082E77EE0853084C9D9D9D1FC5F5A05D09000015261ED4577474749C0CA786856B6AD4825758F733021300000000000000000000000000000000000000000000000000000000009018FF0F79D8CBFA07A59C910000000049454E44AE426082, 1); +INSERT INTO `act_ge_bytearray` VALUES ('3', 1, 'Expense.Expense.png', '1', 0x89504E470D0A1A0A0000000D494844520000034D00000159080600000044DBC48800001BCC4944415478DAEDDD4D6C94F79D07706FC521873DE4B0871E7240DA481B690FBD70C8A107ABEA8103AB466DAC613C6E18D1C86E1B926212A4888690A645254515AA5329414B55A5650B55849CD46171624378292F0A4D94502214604D8299604C899D42FC12B09F7DFED4934EEC19DBE337C6F37C3ED24F10CF18D07FFEF9CDEFEBE7656A6A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000806459B97265A494526AF2F26E0100090F4D5601409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100409F04000C0300E89300806100409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100409FB40A00601800409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100409F04000C0300E89300806100409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100409F04000C0300E89300806100409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C00E89300806100007D1200300C00E89300806100409F04000C0300FA2400601800D0270100C300803E0900180600F44900C03000A04F02008601007D1200300C0024D1952B57BED3D2D212C5BD72A9D50000A10980025114DDF5C9279FF4C5A2C6C6C6D7AC0800084D0014E8EEEEFE7D34E6D8B163B9743AFD80550100A10980D88D1B37BE363232321A15D8BC797377369BBDDBEA0080D00490783D3D3D5DD138FDFDFD3D994CE65756070084268044BB78F1E2C6A884D6D6D69EB86F2EB34A0050BD01A92D84A429EAA49502922ACE455F1D1A1AFABC54681A1D1D1D6E6E6E3E555B5BBBC46A01407586A66571DD9C2C34A552A915560A48AA4B972E1D8FA6D0D5D5D59D4EA7D75A2D00A8DEE0B46F92D074DC4F4F81243B7AF4E85499291A1C1C3C187A66369BBDCB8A01407586A665A54293DBE90249F7F4D34F3F32D9E97921336DD8B0E18F8E340140F507A762D7369D749409A0A666F7EEDD1F944A4CE7CF9F7FD15179004846689A706D936B9900FEA1AEAEEEDE381C0D16B909C4E94C2673DADDF3002021E290D4EA281340715BB76E7D3E0E492385A169C78E1DBF897BE736AB0300C9094DF7175CCBB4DC8A00FC53F841527B7B7B6FC107DBFE21EE97E7B2D9ECDD56070012247F6D93A34C0013AD59B3E61B7D7D7D4371458D8D8D9D6E960300C90C4DB7EFA46725008ADBBE7DFBBE96969670DD67ABD50080324551B4A4ABABEBE513274E8CECDFBF3FEAE8E858941542D362FDB777767646870F1FFE5B5C0D7624E893F3517BF7EEBDDD27F7ECD9A34F0240B9C22070E4C891A8B7B7371A1E1E5677A8AE5EBD1A1D3A74E8D3783078D0AE047D723E2A97CBE993003013E127A70253C50C04C31D1D1D67EC4AD027953E09400509A79A7823AE9C8A87819B7625E8934A9F04A0828473C5BD0957D430E08616A04F2A7D1280C5380CDCE8BF1C759DFC6DF47EE7B3B72BFC3E7CCD1BB86100F4497D529F0420F1C3C0F5BE5C74FAF58DD17B7BD77FA9C2D7C263DEC40D03A04FEA93FA2400891E06BADFFFD38441205F97DE6FF3266E18007D529FD4270148F63070E6CDE74A0E03E1316FE28601D027F5497D1280440F03A73B9E29390C84C7BC891B06409FD427F549000C038601C300E893FAA43E098061A07885BB40951A06C263DEC40D03A04FEA93FA2400891E06CE1DFD75C961203CE64DDC3000FAA43EA94F0290E861E05AEE5474FA8D4D134F3989BF161EF3266E18007D529FD4270148F43010EAC25F7E376118085FF3066E18007D529FD42701300C0C0D45E78EBD30F19493F86BE1316FE28601D027F5497D1280C40E03E193ECCF1E7DBEE4B9FAE1319F766F18007D529FD4270148DE303034145D3E7720FA6BFB86928340BEC273C273FD34D53000FAA43EA94F0290886160AA9F9AFA69AA6100F4497D529F0420D1C3C0747E6A3AD94F53BDA91B06AAC8DD96007D529F04C03030E10D69A68340BEBCA91B06AAC4F2B8A2B15FD127F5497D1200C380320C50E09B71F5C5B56DECD71596449F54FA240086016518E0CB81291F94C291A6AB82933EA9F449000C03CA30C0C4C034D5D7D127953E0980614019061263F914C128FFB86B9CF449A54F02942F8AA2BB4E9D3AD5F4D24B2F1DDAB265CBA78F3DF6D8CD6C361BAD5CB9326A686818FDC10F7E30FCE31FFFB8EBB9E79EDB19D77F5831C380320C5468609A2A1039E2A44F2A7D12A0FCB0B467CF9EDFFDF4A73FBDB976EDDA68FBF6EDD1891327A25C2E170D0E0E4641F8B5B7B7377AFBEDB7A33854453FFAD18F469B9B9B3F6C6C6C7CD80A1A069461A0027CB3A6BC2348E53E1F7D52E9934052C5E168F5CF7EF6B3A1F5EBD7DF0E44B76EDD8AA6EBDD77DF8D9E7CF2C95B4D4D4D67EAEAEAEEB59A86016518B8C38169C50CBEEFBAE0A44F2A7D12A0A838F32C79F5D5570F7CFFFBDF8FDADADACA0A4BE3B5B7B747AB57AF1E70D4C930A00C038B2830CDD5F7A34F2A7D12A8D6C074F0E0C1B71E7DF4D1E8ECD9B3D15CF8F0C30FA338800D3CFCF0C38F5861C38061C030B040A6BAE9C342FF39E8934A9F04AA4538C2140253B846692E853FAFB1B1F17A3A9D6EB0CA8601C3000B1498E6EAD43A479CF449A54F02FC43B886299C92375747988A1D717AE8A187FAE2E0749FD5360C18069827E36FE2F02F71AD1AFBB51CE3BFCFCD21F449A54F024917EE92F7ECB3CF0E876B98E6D3DEBD7B073299CC712B6E18300C308F81694541F0F94D687163BF4E373895FA3EC1499F54FA249064ADADADFF13EE92F7F9E79F47F3ED873FFC618FD3F40C038601E6393005ABC6824F5446702A0C4CF97AA8E071D738E9934A9F0492281C650A9FC3146E2BBE10DE7BEFBD61479B0C038601E650A920532C004D169C8A3D7F4791E7BBC6499F54FA249034A74E9D6A0A377F98CDADC5CBB57AF5EA9E952B572EB5FA33974EA73BE2FABA61C03090A4FD3C49605A5E46102A169CA61B98C60727A7EAE9934A9F0492E0A5975E3AB463C78E68216DDBB6EDDD38343D61F5672E5EBF2854180A52A9D4FD8601C34012F6F30C83CB54C1A9DCC054F8F75FAD71C4499F54FA2450FDB66CD9F2E98913271634341D3B76ECC3F88DACCDEACF7E1828A87DC57EA26A18300C54D37E2E1298A61B584A05A7AFCC3030E5B9C6499F54FA2490048F3DF6D8CDCB972F2F6868EAE9E9E98DDFBCBAADFE9C0E035FFC44B57028300C1806AA693FCF30304D169C3E9845609AEDBF077D52E993C06291CD66A3C1C1C1050D4DE1EF8BDFB806ADFEDC0F03853F510DA7A318060C03D5B49F6B667F64A758709A4D601A1F9C5CE3A44F2A7D12A8D637953B611A6F666A0ECA305059654FCEBCBEFDED6FE7C3CDB659B6BDAF1439C2F4C1D8D767639BD7499F54421350A556AD5A35BAD0479A0606067A1C699AB79FA09E4CA5522B6A6B6B9784E719060C03D5B49F6BA6BE5BDE6C8E3495F301B88E34E9934A9F0492E4D1471F1D5EE86B9A3EFEF8E30F5CD334E7C3C0F8E1B2A612878112C3EA823D6E1858DCFBB920A05CAF999F6B9A66129C5CD3A44FEA93FA2450ED366EDC786EA1EF9EF7FAEBAFFFAFBBE7CDD930703C9D4E3F5062B8ACC86160B2AFCDF7E38681C5BD9F8B0495E91ED929755BF16277CF2B2738B97B9E3EA94FEA9340126CDDBA75C7427F4ED3A64D9BF6FA9CA6590F0393FD24DE306018A8CAFD5C22384D1558A6FA1CA6E97E00EE78CB6A7C4E933EA94FEA9340323CF5D453FFBE66CD9A915BB76E2DD8CDF3EAEBEBFF2F7E335B6AF5E79F61C03050E5A63AD233DD0FAE2D3738E54F117CC04BA04FEA93FA249010EBD6AD3BFFF6DB6F2FD4A9793BE3C074C4AA1B060C03CC9152479CA61B98CA0D4EF9BF4F60D227F5497D124892EF7DEF7B758F3FFEF8CD0538DAD4575F5FFF4E3A9D6EB0EA8601C30073281C711A7FAADCAA9AF23F87A958707A68DCDFE31A267D529FD42781A46A6A6A3AD5D6D636AF89295C3F158E329579DD028601C300D30D4E853787280C40E57C706DA9EF735B717D529FD42781A40BD718AD5EBD7AE0ECD9B3F312984E9D3AF56AFC775C4EA7D3F759ED640F03356EA5CBFC197FAA5E083C0FD5947F1BF1F1DF37DBCF87429FD427F549A05A343434649A9A9A3EEBEDED9DD3C074E9D2A53FD7D7D77FE4B43CC3800F6D340CDC81E0345BC54EFD439F54FA249064994C66756363E3F5B93AE2148E3085C0944AA59EB4BA8601C38061609105271F5CAB4F2A7D12A0B838E0AC6C6868F8F495575EB9318B9B43F4FDF297BFFC6D38252FAEAC55350C28C3C0029BED29754EC9D327953E0930B9708D537D7DFDFEA6A6A69E77DE7967A09CCF617AE38D3776C5A1EB64B8E9836B980C03CA305001C1A9DC23456EFAA04F2A7D12A0ACF0F460084FD96CB677CB962DEFFFF9CF7FFE2897CB5D1E1C1CBC9D900606067A3EFEF8E30F3A3B3B5F7BE69967F6653299AE1096C2D12577C9330C28C3400528F7143BA7E4E9934A9F049899380CDD934EA7D7C661E8E5B82EC435185734F66B775C6D713D118E50592DC380320C2CD2E0B42CAEEB353EB8569F54FA24008601651848A0E5638168F9248F5F1598F449A54F026018508681242B75C4C92979FAA4D22701300C28C300250292C0A44FEA4FFA240086016FC286014A04A76D0213FAA43E098061C09BB06180E296879BD9D4B8ADB83EA94FEA93001806BC091B06286E2C34A14FEA4FFA240086016FC286018426F4497D12000C0386018426F4497D12000C0386018426F4497D12000C0386018426F4497D12000C0386018426F449A54F026018508601A1097D52E99300180694614068429F54FA240086016518109AD027953E0980614019068426F449A54F0260185086018426F4497D12000C0386018426F4497D12000C0386018426F4497D12000C0386018426F4497D12000C0386018426F449A54F026018300C18068426F449A54F025051F6EFDFEF4DB8726A301E066EDA954213FAA4D22701A820870F1FBEDCDBDBEB8DB8022A97CBED8E87813376A5D0843EA9F449002AC8810307BE75F0E0C1FE2B57AE0C7843BE733F390D83406767E747713D68570A4DE893F31438F4490098A9F80D68454747C7C970CA4338577CB1D5AE5DBBA230DC2EC67FFB5885753F6310109AD027E7ABDE7AEBADA8A5A5256A6D6DD5270120A1836D5B186E6B6B6B97580D8426F8B2288AEEFAE4934FFA62516363E36B5604001226954ADD1F0FB637C3709B4EA7975B118426F8B2EEEEEEDF47638E1D3B968B7BE50356050092159A5AC3603B5627AD084213FCD38D1B37BE363232321A15D8BC797377369BBDDBEA00403206DA65F9A34CF98A43D40A2B83D004FFD0D3D3D3158DD3DFDFDF93C9647E6575002019036D5B6160CA1F6D726D134213D4D45CBC78716354426B6B6B4FF8C193550280EA1E66271C65CA97F3F5119A48BA38177D756868E8F352A169747474B8B9B9F9941F320140750FB3FB8A05A6B13A6E85109A48B24B972E1D8FA6D0D5D5D59D4EA7D75A2D00A8CE41B6E45126D7362134414DCDD1A347A7CA4CD1E0E0E0C1B0C7B3D9EC5D560C00AA6F906D9B2C30B9931E421349F7F4D34F3F32D9E97921336DD8B0E18F8E340180E116EC2B126BF7EEDD1F944A4CE7CF9F7F319CCAEC9A260030DC827D4562D5D5D5DD1B87A3C1223781389DC9644EBB7B1E00186EC1BE22F1B66EDDFA7C1C92460A43D38E1D3B7E934AA5B6591D0030DC827D45E285D3EFDADBDB7B0B3ED8F60FF1BE3E97CD66EFB63A0060B805FB0A626BD6ACF9465F5FDF505C51636363A7CFB20300C32DD85730CEF6EDDBF7B5B4B4848F6368B51A0060B805FB0AC609A7E385FD1C6E0E613500C0700BF615D8CF00806100FB0AEC6700C030807D05F633006018C0BE02FB1900300C605F81FD0C001806B0AFC07E06000C03D857603F03008601B0AFB09F0100C300D857D8CF00806100EC2BB09F0100C300F615D8CF00806100FB0AEC6700C030807D05F633006018C0BE02FB1900300C605F81FD0C001806B0AFC07E06000C03D857603F03008601B0AFB09F0100C300D857D8CF00806100EC2BB09F0100C300F615D8CF00806100FB0AEC6700C030807D05F633006018C0BE02FB1900300C605F81FD0C001806B0AFC07E06000C03605F613F03008601B0AFB09F0100C300D857603F038061C030807D05F633006018C0BE02FB1900300C605F81FD0C001806B0AFC07E06000C03D857603F03008601EC2BB09F0100C300F615D8CF00806100EC2BEC6700C03000F615F63300601880F2F7505BD84753D4492B853E0900180648EA1E5A16D7CDC942532A955A61A5D0270100C30049DE47FB26094DC76B6B6B975825F44900C0304092F7D1B252A1299D4E3F6085D0270100C300F652F16B9B4E3ACA843E09001806A0A6F8B54DAE65429F04000C0350200E49AD8E32A14F02008601281D9AEE2FB89669B915419F04000C0330714FDDBEB6C95126F44900C03000C5F7D432FB0A7D1200300C302FA2285AD2D5D5F5F289132746F6EFDF1F757474A805AECECECEE8F0E1C37F8BABC18E449F04000C03152604A623478E44BDBDBDD1F0F0B0BA4375F5EAD5E8D0A1439FC601EA41BB127D12000C0386810A128E30094C15139C863B3A3ACED895E893006018300C5490704A9EC052391587A69B7625FA240018060C0315245C5323AC545468F2FF07FA240018060C038B3134DDE8BF1C759DFC6DF47EE7B3B72BFC3E7C4DD0119AD0270100C340E243D3F5BE5C74FAF58DD17B7BD77FA9C2D7C263C28ED0843E09001806121D9ABADFFFD384C094AF4BEFB7093B4213FA240060184876683AF3E673254353784CD8119AD0270100C340A243D3E98E674A86A6F098B02334A14F02008601A14968129AD0270100C380D054BCC2DDF24A85A6F098B02334A14F020086814487A673477F5D323485C7841DA1097D1200300C243A345DCB9D8A4EBFB169E2A979F1D7C263C28ED0843E09001806121D9A425DF8CBEF2684A6F035414768429F04000C0342D3D05074EED80B134FCD8BBF161E13768426F44900C03090D8D074BD2F179D3DFA7CC96B9AC263E139028FD0C48C7B625BE88B53D4492B0500421395169A8686A2CBE70E447F6DDF503230E52B3C273CD75127A18919F5C46571DD9C2C34A552A915560A0084262A28344D7574C95127A18939EF8BFB26094DC76B6B6B97582500109AA8A0D0349DA34B931D75127E8426CAEE8BCB4A85A6743AFD80150200A1890A0B4D330D4CF9127E842666D41B8B5DDB74D2512600109AA8C0D0A48426EE486F9C706D936B99004068426852421305E290D4EA2813002034094D4A68A27468BABFE05AA6E556040084268426253431B147DEBEB6C9512600109A109A94D0442C93C9DC934AA5D6C4BDF1E5B8CEC5F5D9D8D1A6C1B82E8C9DB2F744789ED50200A109A14968129A1223DC4A3CAE8EB88627FB60DB71F566FCFC06AB070042134293D04435F7C0A571F0692F232815AB23757575F75A4D00109A109A8426AA4A2A955A595F5FFF496100CA6432D1CF7FFEF3E8C08103D1C58B17A3BFFFFDEF51F0D9679F45B95C2E3A7AF468B46DDBB6E8BBDFFDEEF8E074DD512700109A109A8426AA2930AD8843CEADC2B0B473E7CEA8B7B7379A8EBEBEBEDBCF0FDF57189EE23FF361AB0B0042134293D0C4620F4C2B0B03D3BA75EB6E1F559A89F07DEBD7AF1F1F9C1C710200A109A1496862D1F6BCA585A7E46DDAB4E98B53F0662A9CBAB779F3E6F1A7EADD67B50140684268129A5874E2C0D459788469B681A930388D3BE274C46A0380D084D02434B1A884DB8A175EC334D353F2263B55AFF01A27A7E90180D0C40CD4D6D62E119AAA27344DF57A5271A1A9231F68C24D1CE6C3AE5DBB1C6D0200A189998867A9AF5EBA74E978B85DF1534F3DF578A9615B685A1CA169BAAF270B1786E2FAFA64CFC96432F7E46FFE108E065DBB766D5E4253B8ABDEB8DB912FF50A0180D0C4142E5EBCB8717070F0667EA81A1A1AFA7CF7EEDDE71E79E491FF149A165F682AE7F564E1FAD8D8E9701DA954EAFE62CF89BFBE26FFBC5FFCE217D17C0A9FE354109A9EF00A0180D04409376EDCF8DA952B573E2C35585DB8706170CB962D2F66B3D9BB84A6CA0F4D33793D59D8D05450FBC61F798ABFF672FEF183070FCE6B680A47200BFE2D6D5E2100109A18279E99EEEAEEEEFEFDC8C8C8E854C3D5E8E8E8487B7BFBDF9A9B9BFF4B68AACCD0349BD7933B169ABE38F2940F4FF17F9FCB7F7DAE6F00315E2E972BFC77747B85004068A2C0952B57BED3DFDFFFE90CAE83187AE18517F6B7B5B5092B15546FBDF556349BD7331ED8FFCDFF15772E34151E798A6B20FFDF73759BF1C96E3F5EF0770F7A8500A0FA870D5546B5B4B4DCBE107C26178F87EF0D7F46F829B5C072E72BBC0E73F17AAACAAB8550F8F779A701002810EED0D5D8D8F8DAB163C72E8F8E8EDE9ACE70D5DFDFFF87A6A6A63753A9546B4C60A9A07AE59557A2D9BC9EEE9C76C77FF873327E1D5684BB1BC6BFBFEE4813004005091FA2F9939FFCA4BBAFAFAF7792EB5F4E6FDFBEFDBFC3B516E1F9E1FB2AED9AA6F89F54B416EAF14AB911C44C5F4FEE5868FA222C153CC7354D000095A6AEAEEE5F3399CCAFF6ECD9D33B3232325030530D9E3F7FFEC5F8B1D3F160B72D9BCDDE9DFF9E4A0C4D937D6DBE1FAFA4BBE7CDE4F564C143D3F110588B7D6E96BBE7010054F640B7ACB9B9F9545757576E6060E0D0860D1BFE1886BBF0F5F1CF159A2A3734CDE4F564C1FE1F9B7064693C9FD3040050E1C230974EA7D78EDD06796DA9E14E68AAFCD054CEEB49E508D71BC6AFD7CDF09AC5BF8FAE5DBB362F8129DC04A4A1A161B420342DB5FA00006586A7C91E179A1647689AEEEB4965099FDB940F333B77EE9C97D0B46BD7AEC2A34C47AC3A00C01C139A16576862D185A607F281261C6D9AEB1B42843FAFBEBE7EB4E0C3751BAC3A0080D02434B1A8C461E6CD7CA859B76EDD9CDD7E3CDC66FCF1C71FBF557894C9914800808484A61AB71CA7BA42D3D2B8AEE6C3CDA64D9B661D9C4260DABC7973E1754CD7D3E9F47D561B002001A129E9253455A7542AB5327F5388FC11A7999EAA17BE6FDC1126A7E50100084D42138B5F1C6EB285C1295CE3146E0E11EE7E37DDBBE4859B3E145EC3142A0E644F5A5D0000A14968A22A84234E71F515869E109EC2E738850FC00D4791F2A7EE8553F072B9DCED0FAE6D69698956AD5A3552F87DE194BC10C4AC2A0080D024345155C2354E85B7229F611D710D130080D0243451EDE1E9C1B1F074B39CB0148E2EB94B1E0080D024349118994CE69E383CAD8DC3D0CB715D886B702C20855FBBE36A8BEB897084CA6A0100084D4293D00400004293129A000040685242130000084D4A68020000A149094D0000203429A1090000109A842600004068129A000000A149680200008426A1090000109A94D00400004293129A000040685242130000084D4A68020000A149094D000080D024340100004293D0040000084D421300002034094D000080D02434D9950000203429A10900001687FDFBF70B2B9553837168BA695702004005397CF8F0E5DEDE5E81A5022A97CBED8E43D319BB1200002AC8810307BE75F0E0C1FE2B57AE0C082E77EE0853084C9D9D9D1FC5F5A05D09000015261ED4577474749C0CA786856B6AD4825758F733021300000000000000000000000000000000000000000000000000000000009018FF0F79D8CBFA07A59C910000000049454E44AE426082, 1); + +-- ---------------------------- +-- Table structure for act_ge_property +-- ---------------------------- +DROP TABLE IF EXISTS `act_ge_property`; +CREATE TABLE `act_ge_property` ( + `NAME_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VALUE_` varchar(300) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REV_` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`NAME_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_ge_property +-- ---------------------------- +INSERT INTO `act_ge_property` VALUES ('cfg.execution-related-entities-count', 'true', 1); +INSERT INTO `act_ge_property` VALUES ('cfg.task-related-entities-count', 'true', 1); +INSERT INTO `act_ge_property` VALUES ('common.schema.version', '6.4.1.3', 1); +INSERT INTO `act_ge_property` VALUES ('entitylink.schema.version', '6.4.1.3', 1); +INSERT INTO `act_ge_property` VALUES ('identitylink.schema.version', '6.4.1.3', 1); +INSERT INTO `act_ge_property` VALUES ('job.schema.version', '6.4.1.3', 1); +INSERT INTO `act_ge_property` VALUES ('next.dbid', '20001', 9); +INSERT INTO `act_ge_property` VALUES ('schema.history', 'upgrade(6.3.1.0->6.4.1.3)', 2); +INSERT INTO `act_ge_property` VALUES ('schema.version', '6.4.1.3', 2); +INSERT INTO `act_ge_property` VALUES ('task.schema.version', '6.4.1.3', 1); +INSERT INTO `act_ge_property` VALUES ('variable.schema.version', '6.4.1.3', 1); + +-- ---------------------------- +-- Table structure for act_hi_actinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_actinst`; +CREATE TABLE `act_hi_actinst` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT 1, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint(20) NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_START`(`START_TIME_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_END`(`END_TIME_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_PROCINST`(`PROC_INST_ID_`, `ACT_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_ACT_INST_EXEC`(`EXECUTION_ID_`, `ACT_ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_hi_actinst +-- ---------------------------- +INSERT INTO `act_hi_actinst` VALUES ('10', 1, 'Expense:1:4', '5', '9', 'start', NULL, NULL, '开始', 'startEvent', NULL, '2019-07-04 17:29:05.326', '2019-07-04 17:29:05.334', 8, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('11', 1, 'Expense:1:4', '5', '9', 'flow1', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:29:05.346', '2019-07-04 17:29:05.346', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('12', 2, 'Expense:1:4', '5', '9', 'fillTask', '13', NULL, '出差报销', 'userTask', '123', '2019-07-04 17:29:05.346', '2019-07-04 17:31:46.271', 160925, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('12509', 1, 'BMJHN:1:12504', '12505', '12508', 'startEvent1', NULL, NULL, NULL, 'startEvent', NULL, '2019-08-14 08:39:06.468', '2019-08-14 08:39:06.492', 24, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('12510', 1, 'BMJHN:1:12504', '12505', '12508', 'sid-5DFCCD03-9DA6-4260-9474-D783264F8057', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-08-14 08:39:06.515', '2019-08-14 08:39:06.515', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('12511', 1, 'BMJHN:1:12504', '12505', '12508', 'sid-75229381-F392-47CA-9655-BE5A1C93ED5B', '12512', NULL, '部门管理员填写', 'userTask', '$INITIATOR', '2019-08-14 08:39:06.515', NULL, NULL, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('19', 1, 'Expense:1:4', '5', '9', 'flow2', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:31:46.276', '2019-07-04 17:31:46.276', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('20', 1, 'Expense:1:4', '5', '9', 'judgeTask', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2019-07-04 17:31:46.278', '2019-07-04 17:31:46.296', 18, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('21', 1, 'Expense:1:4', '5', '9', 'judgeLess', NULL, NULL, '小于500元', 'sequenceFlow', NULL, '2019-07-04 17:31:46.296', '2019-07-04 17:31:46.296', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('22', 1, 'Expense:1:4', '5', '9', 'directorTak', '23', NULL, '经理审批', 'userTask', '123', '2019-07-04 17:31:46.302', NULL, NULL, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2510', 1, 'Expense:2:2504', '2505', '2509', 'start', NULL, NULL, '开始', 'startEvent', NULL, '2019-07-04 17:40:04.421', '2019-07-04 17:40:04.429', 8, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2511', 1, 'Expense:2:2504', '2505', '2509', 'flow1', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:40:04.433', '2019-07-04 17:40:04.433', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2512', 2, 'Expense:2:2504', '2505', '2509', 'fillTask', '2513', NULL, '出差报销', 'userTask', '123', '2019-07-04 17:40:04.433', '2019-07-04 17:42:34.431', 149998, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2519', 1, 'Expense:2:2504', '2505', '2509', 'flow2', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:42:34.437', '2019-07-04 17:42:34.437', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2520', 1, 'Expense:2:2504', '2505', '2509', 'judgeTask', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2019-07-04 17:42:34.439', '2019-07-04 17:42:34.463', 24, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2521', 1, 'Expense:2:2504', '2505', '2509', 'judgeLess', NULL, NULL, '小于500元', 'sequenceFlow', NULL, '2019-07-04 17:42:34.463', '2019-07-04 17:42:34.463', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2522', 1, 'Expense:2:2504', '2505', '2509', 'directorTak', '2523', NULL, '经理审批', 'userTask', '123', '2019-07-04 17:42:34.465', NULL, NULL, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2531', 1, 'Expense:2:2504', '2526', '2530', 'start', NULL, NULL, '开始', 'startEvent', NULL, '2019-07-04 17:51:49.347', '2019-07-04 17:51:49.348', 1, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2532', 1, 'Expense:2:2504', '2526', '2530', 'flow1', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:51:49.348', '2019-07-04 17:51:49.348', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2533', 2, 'Expense:2:2504', '2526', '2530', 'fillTask', '2534', NULL, '出差报销', 'userTask', '123', '2019-07-04 17:51:49.348', '2019-07-04 17:52:12.683', 23335, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2541', 1, 'Expense:2:2504', '2526', '2530', 'flow2', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:52:12.686', '2019-07-04 17:52:12.686', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2542', 1, 'Expense:2:2504', '2526', '2530', 'judgeTask', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2019-07-04 17:52:12.687', '2019-07-04 17:52:12.687', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2543', 1, 'Expense:2:2504', '2526', '2530', 'judgeMore', NULL, NULL, '大于500元', 'sequenceFlow', NULL, '2019-07-04 17:52:12.688', '2019-07-04 17:52:12.688', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('2544', 1, 'Expense:2:2504', '2526', '2530', 'bossTask', '2545', NULL, '老板审批', 'userTask', '123', '2019-07-04 17:52:12.690', NULL, NULL, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('5006', 1, 'Expense:2:2504', '5001', '5005', 'start', NULL, NULL, '开始', 'startEvent', NULL, '2019-07-17 16:35:47.984', '2019-07-17 16:35:47.998', 14, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('5007', 1, 'Expense:2:2504', '5001', '5005', 'flow1', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-17 16:35:48.005', '2019-07-17 16:35:48.005', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('5008', 2, 'Expense:2:2504', '5001', '5005', 'fillTask', '5009', NULL, '出差报销', 'userTask', '123', '2019-07-17 16:35:48.005', '2019-07-17 16:38:04.636', 136631, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('5015', 1, 'Expense:2:2504', '5001', '5005', 'flow2', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-17 16:38:04.652', '2019-07-17 16:38:04.652', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('5016', 1, 'Expense:2:2504', '5001', '5005', 'judgeTask', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2019-07-17 16:38:04.654', '2019-07-17 16:38:04.684', 30, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('5017', 1, 'Expense:2:2504', '5001', '5005', 'judgeLess', NULL, NULL, '小于500元', 'sequenceFlow', NULL, '2019-07-17 16:38:04.684', '2019-07-17 16:38:04.684', 0, NULL, ''); +INSERT INTO `act_hi_actinst` VALUES ('5018', 1, 'Expense:2:2504', '5001', '5005', 'directorTak', '5019', NULL, '经理审批', 'userTask', '123', '2019-07-17 16:38:04.687', NULL, NULL, NULL, ''); + +-- ---------------------------- +-- Table structure for act_hi_attachment +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_attachment`; +CREATE TABLE `act_hi_attachment` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `URL_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CONTENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_hi_comment +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_comment`; +CREATE TABLE `act_hi_comment` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TIME_` datetime(3) NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACTION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `MESSAGE_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `FULL_MSG_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_hi_detail +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_detail`; +CREATE TABLE `act_hi_detail` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VAR_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TIME_` datetime(3) NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint(20) NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_PROC_INST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_ACT_INST`(`ACT_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_TIME`(`TIME_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_NAME`(`NAME_`) USING BTREE, + INDEX `ACT_IDX_HI_DETAIL_TASK_ID`(`TASK_ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_hi_entitylink +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_entitylink`; +CREATE TABLE `act_hi_entitylink` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `LINK_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REF_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REF_SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REF_SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HIERARCHY_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_ENT_LNK_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`, `LINK_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_ENT_LNK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`, `LINK_TYPE_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_hi_identitylink +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_identitylink`; +CREATE TABLE `act_hi_identitylink` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_USER`(`USER_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_TASK`(`TASK_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_IDENT_LNK_PROCINST`(`PROC_INST_ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_hi_identitylink +-- ---------------------------- +INSERT INTO `act_hi_identitylink` VALUES ('12506', NULL, 'starter', 'Y11037', NULL, '2019-08-14 08:39:06.442', '12505', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('12513', NULL, 'assignee', '$INITIATOR', '12512', '2019-08-14 08:39:06.794', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('12514', NULL, 'participant', '$INITIATOR', NULL, '2019-08-14 08:39:06.796', '12505', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('14', NULL, 'assignee', '123', '13', '2019-07-04 17:29:05.418', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('15', NULL, 'participant', '123', NULL, '2019-07-04 17:29:05.419', '5', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('16', 'tu', 'candidate', NULL, '13', '2019-07-04 17:29:05.419', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('24', NULL, 'assignee', '123', '23', '2019-07-04 17:31:46.303', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('25', 'jl', 'candidate', NULL, '23', '2019-07-04 17:31:46.307', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2506', NULL, 'starter', '123', NULL, '2019-07-04 17:40:04.415', '2505', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2514', NULL, 'assignee', '123', '2513', '2019-07-04 17:40:04.494', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2515', NULL, 'participant', '123', NULL, '2019-07-04 17:40:04.495', '2505', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2516', 'tu', 'candidate', NULL, '2513', '2019-07-04 17:40:04.495', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2524', NULL, 'assignee', '123', '2523', '2019-07-04 17:42:34.466', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2525', 'jl', 'candidate', NULL, '2523', '2019-07-04 17:42:34.470', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2527', NULL, 'starter', '123', NULL, '2019-07-04 17:51:49.347', '2526', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2535', NULL, 'assignee', '123', '2534', '2019-07-04 17:51:49.349', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2536', NULL, 'participant', '123', NULL, '2019-07-04 17:51:49.349', '2526', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2537', 'tu', 'candidate', NULL, '2534', '2019-07-04 17:51:49.349', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2540', NULL, 'participant', '123', NULL, '2019-07-04 17:52:12.665', '2526', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2546', NULL, 'assignee', '123', '2545', '2019-07-04 17:52:12.690', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('2547', 'lb', 'candidate', NULL, '2545', '2019-07-04 17:52:12.690', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('5002', NULL, 'starter', '123', NULL, '2019-07-17 16:35:47.974', '5001', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('5010', NULL, 'assignee', '123', '5009', '2019-07-17 16:35:48.117', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('5011', NULL, 'participant', '123', NULL, '2019-07-17 16:35:48.118', '5001', NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('5012', 'tu', 'candidate', NULL, '5009', '2019-07-17 16:35:48.118', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('5020', NULL, 'assignee', '123', '5019', '2019-07-17 16:38:04.688', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('5021', 'jl', 'candidate', NULL, '5019', '2019-07-17 16:38:04.690', NULL, NULL, NULL, NULL); +INSERT INTO `act_hi_identitylink` VALUES ('6', NULL, 'starter', '123', NULL, '2019-07-04 17:29:05.320', '5', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for act_hi_procinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_procinst`; +CREATE TABLE `act_hi_procinst` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT 1, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `START_TIME_` datetime(3) NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint(20) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `END_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUPER_PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CALLBACK_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CALLBACK_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `PROC_INST_ID_`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_PRO_INST_END`(`END_TIME_`) USING BTREE, + INDEX `ACT_IDX_HI_PRO_I_BUSKEY`(`BUSINESS_KEY_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_hi_procinst +-- ---------------------------- +INSERT INTO `act_hi_procinst` VALUES ('12505', 1, '12505', NULL, 'BMJHN:1:12504', '2019-08-14 08:39:06.412', NULL, NULL, 'Y11037', 'startEvent1', NULL, NULL, NULL, '', NULL, NULL, NULL); +INSERT INTO `act_hi_procinst` VALUES ('2505', 1, '2505', NULL, 'Expense:2:2504', '2019-07-04 17:40:04.410', NULL, NULL, '123', 'start', NULL, NULL, NULL, '', NULL, NULL, NULL); +INSERT INTO `act_hi_procinst` VALUES ('2526', 1, '2526', NULL, 'Expense:2:2504', '2019-07-04 17:51:49.347', NULL, NULL, '123', 'start', NULL, NULL, NULL, '', NULL, NULL, NULL); +INSERT INTO `act_hi_procinst` VALUES ('5', 1, '5', NULL, 'Expense:1:4', '2019-07-04 17:29:05.316', NULL, NULL, '123', 'start', NULL, NULL, NULL, '', NULL, NULL, NULL); +INSERT INTO `act_hi_procinst` VALUES ('5001', 1, '5001', NULL, 'Expense:2:2504', '2019-07-17 16:35:47.852', NULL, NULL, '123', 'start', NULL, NULL, NULL, '', NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for act_hi_taskinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_taskinst`; +CREATE TABLE `act_hi_taskinst` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT 1, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NULL, + `CLAIM_TIME_` datetime(3) NULL DEFAULT NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint(20) NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PRIORITY_` int(11) NULL DEFAULT NULL, + `DUE_DATE_` datetime(3) NULL DEFAULT NULL, + `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_TASK_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_TASK_SUB_SCOPE`(`SUB_SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_TASK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_TASK_INST_PROCINST`(`PROC_INST_ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_hi_taskinst +-- ---------------------------- +INSERT INTO `act_hi_taskinst` VALUES ('12512', 1, 'BMJHN:1:12504', NULL, 'sid-75229381-F392-47CA-9655-BE5A1C93ED5B', '12505', '12508', NULL, NULL, NULL, NULL, '部门管理员填写', NULL, NULL, NULL, '$INITIATOR', '2019-08-14 08:39:06.516', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '', '2019-08-14 08:39:06.786'); +INSERT INTO `act_hi_taskinst` VALUES ('13', 2, 'Expense:1:4', NULL, 'fillTask', '5', '9', NULL, NULL, NULL, NULL, '出差报销', NULL, NULL, NULL, '123', '2019-07-04 17:29:05.346', NULL, '2019-07-04 17:31:46.251', 160905, NULL, 50, NULL, NULL, NULL, '', '2019-07-04 17:31:46.251'); +INSERT INTO `act_hi_taskinst` VALUES ('23', 1, 'Expense:1:4', NULL, 'directorTak', '5', '9', NULL, NULL, NULL, NULL, '经理审批', NULL, NULL, NULL, '123', '2019-07-04 17:31:46.302', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '', '2019-07-04 17:31:46.303'); +INSERT INTO `act_hi_taskinst` VALUES ('2513', 2, 'Expense:2:2504', NULL, 'fillTask', '2505', '2509', NULL, NULL, NULL, NULL, '出差报销', NULL, NULL, NULL, '123', '2019-07-04 17:40:04.433', NULL, '2019-07-04 17:42:34.423', 149990, NULL, 50, NULL, NULL, NULL, '', '2019-07-04 17:42:34.423'); +INSERT INTO `act_hi_taskinst` VALUES ('2523', 1, 'Expense:2:2504', NULL, 'directorTak', '2505', '2509', NULL, NULL, NULL, NULL, '经理审批', NULL, NULL, NULL, '123', '2019-07-04 17:42:34.465', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '', '2019-07-04 17:42:34.466'); +INSERT INTO `act_hi_taskinst` VALUES ('2534', 2, 'Expense:2:2504', NULL, 'fillTask', '2526', '2530', NULL, NULL, NULL, NULL, '出差报销', NULL, NULL, NULL, '123', '2019-07-04 17:51:49.348', NULL, '2019-07-04 17:52:12.677', 23329, NULL, 50, NULL, NULL, NULL, '', '2019-07-04 17:52:12.677'); +INSERT INTO `act_hi_taskinst` VALUES ('2545', 1, 'Expense:2:2504', NULL, 'bossTask', '2526', '2530', NULL, NULL, NULL, NULL, '老板审批', NULL, NULL, NULL, '123', '2019-07-04 17:52:12.690', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '', '2019-07-04 17:52:12.690'); +INSERT INTO `act_hi_taskinst` VALUES ('5009', 2, 'Expense:2:2504', NULL, 'fillTask', '5001', '5005', NULL, NULL, NULL, NULL, '出差报销', NULL, NULL, NULL, '123', '2019-07-17 16:35:48.005', NULL, '2019-07-17 16:38:04.571', 136566, NULL, 50, NULL, NULL, NULL, '', '2019-07-17 16:38:04.571'); +INSERT INTO `act_hi_taskinst` VALUES ('5019', 1, 'Expense:2:2504', NULL, 'directorTak', '5001', '5005', NULL, NULL, NULL, NULL, '经理审批', NULL, NULL, NULL, '123', '2019-07-17 16:38:04.687', NULL, NULL, NULL, NULL, 50, NULL, NULL, NULL, '', '2019-07-17 16:38:04.688'); + +-- ---------------------------- +-- Table structure for act_hi_tsk_log +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_tsk_log`; +CREATE TABLE `act_hi_tsk_log` ( + `ID_` bigint(20) NOT NULL AUTO_INCREMENT, + `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `TIME_STAMP_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DATA_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_hi_varinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_hi_varinst`; +CREATE TABLE `act_hi_varinst` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT 1, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VAR_TYPE_` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint(20) NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `LAST_UPDATED_TIME_` datetime(3) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_NAME_TYPE`(`NAME_`, `VAR_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_VAR_SCOPE_ID_TYPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_VAR_SUB_ID_TYPE`(`SUB_SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_PROC_INST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_TASK_ID`(`TASK_ID_`) USING BTREE, + INDEX `ACT_IDX_HI_PROCVAR_EXE`(`EXECUTION_ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_hi_varinst +-- ---------------------------- +INSERT INTO `act_hi_varinst` VALUES ('12507', 0, '12505', '12505', NULL, 'groupid', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '1647c07823b14295915ecd6f08d4b78e', NULL, '2019-08-14 08:39:06.467', '2019-08-14 08:39:06.467'); +INSERT INTO `act_hi_varinst` VALUES ('17', 0, '5', '5', NULL, 'employee', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL, '2019-07-04 17:31:46.241', '2019-07-04 17:31:46.241'); +INSERT INTO `act_hi_varinst` VALUES ('18', 0, '5', '5', NULL, 'outcome', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '通过', NULL, '2019-07-04 17:31:46.242', '2019-07-04 17:31:46.242'); +INSERT INTO `act_hi_varinst` VALUES ('2507', 0, '2505', '2505', NULL, 'money', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '2', NULL, '2019-07-04 17:40:04.420', '2019-07-04 17:40:04.420'); +INSERT INTO `act_hi_varinst` VALUES ('2508', 0, '2505', '2505', NULL, 'taskUser', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL, '2019-07-04 17:40:04.420', '2019-07-04 17:40:04.420'); +INSERT INTO `act_hi_varinst` VALUES ('2517', 0, '2505', '2505', NULL, 'employee', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL, '2019-07-04 17:42:34.411', '2019-07-04 17:42:34.411'); +INSERT INTO `act_hi_varinst` VALUES ('2518', 0, '2505', '2505', NULL, 'outcome', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '通过', NULL, '2019-07-04 17:42:34.411', '2019-07-04 17:42:34.411'); +INSERT INTO `act_hi_varinst` VALUES ('2528', 0, '2526', '2526', NULL, 'money', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '600', NULL, '2019-07-04 17:51:49.347', '2019-07-04 17:51:49.347'); +INSERT INTO `act_hi_varinst` VALUES ('2529', 0, '2526', '2526', NULL, 'taskUser', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL, '2019-07-04 17:51:49.347', '2019-07-04 17:51:49.347'); +INSERT INTO `act_hi_varinst` VALUES ('2538', 0, '2526', '2526', NULL, 'employee', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL, '2019-07-04 17:52:12.663', '2019-07-04 17:52:12.663'); +INSERT INTO `act_hi_varinst` VALUES ('2539', 0, '2526', '2526', NULL, 'outcome', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '通过', NULL, '2019-07-04 17:52:12.663', '2019-07-04 17:52:12.663'); +INSERT INTO `act_hi_varinst` VALUES ('5003', 0, '5001', '5001', NULL, 'money', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL, '2019-07-17 16:35:47.983', '2019-07-17 16:35:47.983'); +INSERT INTO `act_hi_varinst` VALUES ('5004', 0, '5001', '5001', NULL, 'taskUser', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL, '2019-07-17 16:35:47.983', '2019-07-17 16:35:47.983'); +INSERT INTO `act_hi_varinst` VALUES ('5013', 0, '5001', '5001', NULL, 'employee', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL, '2019-07-17 16:38:04.542', '2019-07-17 16:38:04.542'); +INSERT INTO `act_hi_varinst` VALUES ('5014', 0, '5001', '5001', NULL, 'outcome', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '通过', NULL, '2019-07-17 16:38:04.542', '2019-07-17 16:38:04.542'); +INSERT INTO `act_hi_varinst` VALUES ('7', 0, '5', '5', NULL, 'money', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL, '2019-07-04 17:29:05.325', '2019-07-04 17:29:05.325'); +INSERT INTO `act_hi_varinst` VALUES ('8', 0, '5', '5', NULL, 'taskUser', 'string', NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL, '2019-07-04 17:29:05.325', '2019-07-04 17:29:05.325'); + +-- ---------------------------- +-- Table structure for act_id_bytearray +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_bytearray`; +CREATE TABLE `act_id_bytearray` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `BYTES_` longblob NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_id_group +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_group`; +CREATE TABLE `act_id_group` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_id_info +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_info`; +CREATE TABLE `act_id_info` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `VALUE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PASSWORD_` longblob NULL, + `PARENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_id_membership +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_membership`; +CREATE TABLE `act_id_membership` ( + `USER_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `GROUP_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`USER_ID_`, `GROUP_ID_`) USING BTREE, + INDEX `ACT_FK_MEMB_GROUP`(`GROUP_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_MEMB_GROUP` FOREIGN KEY (`GROUP_ID_`) REFERENCES `act_id_group` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MEMB_USER` FOREIGN KEY (`USER_ID_`) REFERENCES `act_id_user` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_id_priv +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_priv`; +CREATE TABLE `act_id_priv` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_UNIQ_PRIV_NAME`(`NAME_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_id_priv_mapping +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_priv_mapping`; +CREATE TABLE `act_id_priv_mapping` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PRIV_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_PRIV_MAPPING`(`PRIV_ID_`) USING BTREE, + INDEX `ACT_IDX_PRIV_USER`(`USER_ID_`) USING BTREE, + INDEX `ACT_IDX_PRIV_GROUP`(`GROUP_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_PRIV_MAPPING` FOREIGN KEY (`PRIV_ID_`) REFERENCES `act_id_priv` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_id_property +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_property`; +CREATE TABLE `act_id_property` ( + `NAME_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VALUE_` varchar(300) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REV_` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`NAME_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_id_property +-- ---------------------------- +INSERT INTO `act_id_property` VALUES ('schema.version', '6.4.1.3', 1); + +-- ---------------------------- +-- Table structure for act_id_token +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_token`; +CREATE TABLE `act_id_token` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TOKEN_VALUE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TOKEN_DATE_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + `IP_ADDRESS_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `USER_AGENT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TOKEN_DATA_` varchar(2000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_id_user +-- ---------------------------- +DROP TABLE IF EXISTS `act_id_user`; +CREATE TABLE `act_id_user` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `FIRST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `LAST_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EMAIL_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PWD_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PICTURE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `DISPLAY_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_procdef_info +-- ---------------------------- +DROP TABLE IF EXISTS `act_procdef_info`; +CREATE TABLE `act_procdef_info` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `INFO_JSON_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_UNIQ_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, + INDEX `ACT_IDX_INFO_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, + INDEX `ACT_FK_INFO_JSON_BA`(`INFO_JSON_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_INFO_JSON_BA` FOREIGN KEY (`INFO_JSON_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_INFO_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_re_deployment +-- ---------------------------- +DROP TABLE IF EXISTS `act_re_deployment`; +CREATE TABLE `act_re_deployment` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL, + `DERIVED_FROM_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DERIVED_FROM_ROOT_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PARENT_DEPLOYMENT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ENGINE_VERSION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_re_deployment +-- ---------------------------- +INSERT INTO `act_re_deployment` VALUES ('1', '报销流程', '报销流程', 'Expense', '', '2019-07-04 17:28:55.230', NULL, NULL, NULL, NULL); +INSERT INTO `act_re_deployment` VALUES ('10001', '部门级计划外计划制定', '教育培训', 'BMJHW', '', '2019-07-24 16:26:43.539', NULL, NULL, NULL, NULL); +INSERT INTO `act_re_deployment` VALUES ('12501', '部门计划内计划制定', '教育培训', 'BMJHN', '', '2019-08-14 08:38:09.672', NULL, NULL, NULL, NULL); +INSERT INTO `act_re_deployment` VALUES ('15001', '1', '1', '1', '', '2019-08-16 10:47:50.870', NULL, NULL, NULL, NULL); +INSERT INTO `act_re_deployment` VALUES ('17501', NULL, NULL, NULL, '', '2019-08-16 11:19:34.280', NULL, NULL, NULL, NULL); +INSERT INTO `act_re_deployment` VALUES ('2501', '报销流程', '报销流程', 'Expense2', '', '2019-07-04 17:38:26.925', NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for act_re_model +-- ---------------------------- +DROP TABLE IF EXISTS `act_re_model`; +CREATE TABLE `act_re_model` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `LAST_UPDATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `VERSION_` int(11) NULL DEFAULT NULL, + `META_INFO_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EDITOR_SOURCE_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EDITOR_SOURCE_EXTRA_VALUE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_FK_MODEL_SOURCE`(`EDITOR_SOURCE_VALUE_ID_`) USING BTREE, + INDEX `ACT_FK_MODEL_SOURCE_EXTRA`(`EDITOR_SOURCE_EXTRA_VALUE_ID_`) USING BTREE, + INDEX `ACT_FK_MODEL_DEPLOYMENT`(`DEPLOYMENT_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_MODEL_DEPLOYMENT` FOREIGN KEY (`DEPLOYMENT_ID_`) REFERENCES `act_re_deployment` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MODEL_SOURCE` FOREIGN KEY (`EDITOR_SOURCE_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_MODEL_SOURCE_EXTRA` FOREIGN KEY (`EDITOR_SOURCE_EXTRA_VALUE_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_re_procdef +-- ---------------------------- +DROP TABLE IF EXISTS `act_re_procdef`; +CREATE TABLE `act_re_procdef` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `VERSION_` int(11) NOT NULL, + `DEPLOYMENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DGRM_RESOURCE_NAME_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HAS_START_FORM_KEY_` tinyint(4) NULL DEFAULT NULL, + `HAS_GRAPHICAL_NOTATION_` tinyint(4) NULL DEFAULT NULL, + `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `ENGINE_VERSION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DERIVED_FROM_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DERIVED_FROM_ROOT_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DERIVED_VERSION_` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`ID_`) USING BTREE, + UNIQUE INDEX `ACT_UNIQ_PROCDEF`(`KEY_`, `VERSION_`, `DERIVED_VERSION_`, `TENANT_ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_re_procdef +-- ---------------------------- +INSERT INTO `act_re_procdef` VALUES ('BMJHN:1:12504', 1, 'http://www.flowable.org/processdef', '部门计划内计划制定', 'BMJHN', 1, '12501', 'BMJHN.bpmn20.xml', 'BMJHN.BMJHN.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('BMJHW:1:10004', 1, 'http://www.flowable.org/processdef', '部门级计划外计划制定', 'BMJHW', 1, '10001', 'BMJHW.bpmn20.xml', 'BMJHW.BMJHW.png', NULL, 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('Expense:1:4', 1, 'http://www.flowable.org/processdef', 'ExpenseProcess', 'Expense', 1, '1', 'Expense.bpmn20.xml', 'Expense.Expense.png', '报销流程', 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('Expense:2:2504', 1, 'http://www.flowable.org/processdef', 'ExpenseProcess', 'Expense', 2, '2501', 'Expense2.bpmn20.xml', 'Expense2.Expense.png', '报销流程', 0, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('leave:1:15004', 1, 'com.jsite.modules.oa.leave', '请假流程', 'leave', 1, '15001', '1.bpmn20.xml', '1.leave.png', '请假流程演示', 1, 1, 1, '', NULL, NULL, NULL, 0); +INSERT INTO `act_re_procdef` VALUES ('leave:2:17504', 2, 'Eductation', '请假流程', 'leave', 2, '17501', '请假流程.bpmn20.xml', '请假流程.leave.png', '请假流程演示', 1, 1, 1, '', NULL, NULL, NULL, 0); + +-- ---------------------------- +-- Table structure for act_ru_actinst +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_actinst`; +CREATE TABLE `act_ru_actinst` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT 1, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CALL_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NULL, + `END_TIME_` datetime(3) NULL DEFAULT NULL, + `DURATION_` bigint(20) NULL DEFAULT NULL, + `DELETE_REASON_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_START`(`START_TIME_`) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_END`(`END_TIME_`) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_PROC`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_PROC_ACT`(`PROC_INST_ID_`, `ACT_ID_`) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_EXEC`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_IDX_RU_ACTI_EXEC_ACT`(`EXECUTION_ID_`, `ACT_ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_ru_actinst +-- ---------------------------- +INSERT INTO `act_ru_actinst` VALUES ('10', 1, 'Expense:1:4', '5', '9', 'start', NULL, NULL, '开始', 'startEvent', NULL, '2019-07-04 17:29:05.326', '2019-07-04 17:29:05.334', 8, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('11', 1, 'Expense:1:4', '5', '9', 'flow1', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:29:05.346', '2019-07-04 17:29:05.346', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('12', 2, 'Expense:1:4', '5', '9', 'fillTask', '13', NULL, '出差报销', 'userTask', '123', '2019-07-04 17:29:05.346', '2019-07-04 17:31:46.271', 160925, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('12509', 1, 'BMJHN:1:12504', '12505', '12508', 'startEvent1', NULL, NULL, NULL, 'startEvent', NULL, '2019-08-14 08:39:06.468', '2019-08-14 08:39:06.492', 24, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('12510', 1, 'BMJHN:1:12504', '12505', '12508', 'sid-5DFCCD03-9DA6-4260-9474-D783264F8057', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-08-14 08:39:06.515', '2019-08-14 08:39:06.515', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('12511', 1, 'BMJHN:1:12504', '12505', '12508', 'sid-75229381-F392-47CA-9655-BE5A1C93ED5B', '12512', NULL, '部门管理员填写', 'userTask', '$INITIATOR', '2019-08-14 08:39:06.515', NULL, NULL, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('19', 1, 'Expense:1:4', '5', '9', 'flow2', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:31:46.276', '2019-07-04 17:31:46.276', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('20', 1, 'Expense:1:4', '5', '9', 'judgeTask', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2019-07-04 17:31:46.278', '2019-07-04 17:31:46.296', 18, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('21', 1, 'Expense:1:4', '5', '9', 'judgeLess', NULL, NULL, '小于500元', 'sequenceFlow', NULL, '2019-07-04 17:31:46.296', '2019-07-04 17:31:46.296', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('22', 1, 'Expense:1:4', '5', '9', 'directorTak', '23', NULL, '经理审批', 'userTask', '123', '2019-07-04 17:31:46.302', NULL, NULL, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2510', 1, 'Expense:2:2504', '2505', '2509', 'start', NULL, NULL, '开始', 'startEvent', NULL, '2019-07-04 17:40:04.421', '2019-07-04 17:40:04.429', 8, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2511', 1, 'Expense:2:2504', '2505', '2509', 'flow1', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:40:04.433', '2019-07-04 17:40:04.433', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2512', 2, 'Expense:2:2504', '2505', '2509', 'fillTask', '2513', NULL, '出差报销', 'userTask', '123', '2019-07-04 17:40:04.433', '2019-07-04 17:42:34.431', 149998, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2519', 1, 'Expense:2:2504', '2505', '2509', 'flow2', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:42:34.437', '2019-07-04 17:42:34.437', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2520', 1, 'Expense:2:2504', '2505', '2509', 'judgeTask', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2019-07-04 17:42:34.439', '2019-07-04 17:42:34.463', 24, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2521', 1, 'Expense:2:2504', '2505', '2509', 'judgeLess', NULL, NULL, '小于500元', 'sequenceFlow', NULL, '2019-07-04 17:42:34.463', '2019-07-04 17:42:34.463', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2522', 1, 'Expense:2:2504', '2505', '2509', 'directorTak', '2523', NULL, '经理审批', 'userTask', '123', '2019-07-04 17:42:34.465', NULL, NULL, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2531', 1, 'Expense:2:2504', '2526', '2530', 'start', NULL, NULL, '开始', 'startEvent', NULL, '2019-07-04 17:51:49.347', '2019-07-04 17:51:49.348', 1, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2532', 1, 'Expense:2:2504', '2526', '2530', 'flow1', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:51:49.348', '2019-07-04 17:51:49.348', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2533', 2, 'Expense:2:2504', '2526', '2530', 'fillTask', '2534', NULL, '出差报销', 'userTask', '123', '2019-07-04 17:51:49.348', '2019-07-04 17:52:12.683', 23335, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2541', 1, 'Expense:2:2504', '2526', '2530', 'flow2', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-04 17:52:12.686', '2019-07-04 17:52:12.686', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2542', 1, 'Expense:2:2504', '2526', '2530', 'judgeTask', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2019-07-04 17:52:12.687', '2019-07-04 17:52:12.687', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2543', 1, 'Expense:2:2504', '2526', '2530', 'judgeMore', NULL, NULL, '大于500元', 'sequenceFlow', NULL, '2019-07-04 17:52:12.688', '2019-07-04 17:52:12.688', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('2544', 1, 'Expense:2:2504', '2526', '2530', 'bossTask', '2545', NULL, '老板审批', 'userTask', '123', '2019-07-04 17:52:12.690', NULL, NULL, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('5006', 1, 'Expense:2:2504', '5001', '5005', 'start', NULL, NULL, '开始', 'startEvent', NULL, '2019-07-17 16:35:47.984', '2019-07-17 16:35:47.998', 14, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('5007', 1, 'Expense:2:2504', '5001', '5005', 'flow1', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-17 16:35:48.005', '2019-07-17 16:35:48.005', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('5008', 2, 'Expense:2:2504', '5001', '5005', 'fillTask', '5009', NULL, '出差报销', 'userTask', '123', '2019-07-17 16:35:48.005', '2019-07-17 16:38:04.636', 136631, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('5015', 1, 'Expense:2:2504', '5001', '5005', 'flow2', NULL, NULL, NULL, 'sequenceFlow', NULL, '2019-07-17 16:38:04.652', '2019-07-17 16:38:04.652', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('5016', 1, 'Expense:2:2504', '5001', '5005', 'judgeTask', NULL, NULL, NULL, 'exclusiveGateway', NULL, '2019-07-17 16:38:04.654', '2019-07-17 16:38:04.684', 30, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('5017', 1, 'Expense:2:2504', '5001', '5005', 'judgeLess', NULL, NULL, '小于500元', 'sequenceFlow', NULL, '2019-07-17 16:38:04.684', '2019-07-17 16:38:04.684', 0, NULL, ''); +INSERT INTO `act_ru_actinst` VALUES ('5018', 1, 'Expense:2:2504', '5001', '5005', 'directorTak', '5019', NULL, '经理审批', 'userTask', '123', '2019-07-17 16:38:04.687', NULL, NULL, NULL, ''); + +-- ---------------------------- +-- Table structure for act_ru_deadletter_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_deadletter_job`; +CREATE TABLE `act_ru_deadletter_job` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_DEADLETTER_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_`) USING BTREE, + INDEX `ACT_IDX_DEADLETTER_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_`) USING BTREE, + INDEX `ACT_IDX_DJOB_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_DJOB_SUB_SCOPE`(`SUB_SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_DJOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_FK_DEADLETTER_JOB_EXECUTION`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_FK_DEADLETTER_JOB_PROCESS_INSTANCE`(`PROCESS_INSTANCE_ID_`) USING BTREE, + INDEX `ACT_FK_DEADLETTER_JOB_PROC_DEF`(`PROC_DEF_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_DEADLETTER_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_ru_entitylink +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_entitylink`; +CREATE TABLE `act_ru_entitylink` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `CREATE_TIME_` datetime(3) NULL DEFAULT NULL, + `LINK_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REF_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REF_SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `REF_SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HIERARCHY_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_ENT_LNK_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`, `LINK_TYPE_`) USING BTREE, + INDEX `ACT_IDX_ENT_LNK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`, `LINK_TYPE_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_ru_event_subscr +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_event_subscr`; +CREATE TABLE `act_ru_event_subscr` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `EVENT_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EVENT_NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACTIVITY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CONFIGURATION_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATED_` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_EVENT_SUBSCR_CONFIG_`(`CONFIGURATION_`) USING BTREE, + INDEX `ACT_FK_EVENT_EXEC`(`EXECUTION_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_EVENT_EXEC` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_ru_execution +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_execution`; +CREATE TABLE `act_ru_execution` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `BUSINESS_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PARENT_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUPER_EXEC_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ROOT_PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `IS_ACTIVE_` tinyint(4) NULL DEFAULT NULL, + `IS_CONCURRENT_` tinyint(4) NULL DEFAULT NULL, + `IS_SCOPE_` tinyint(4) NULL DEFAULT NULL, + `IS_EVENT_SCOPE_` tinyint(4) NULL DEFAULT NULL, + `IS_MI_ROOT_` tinyint(4) NULL DEFAULT NULL, + `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, + `CACHED_ENT_STATE_` int(11) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_ACT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `START_TIME_` datetime(3) NULL DEFAULT NULL, + `START_USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, + `IS_COUNT_ENABLED_` tinyint(4) NULL DEFAULT NULL, + `EVT_SUBSCR_COUNT_` int(11) NULL DEFAULT NULL, + `TASK_COUNT_` int(11) NULL DEFAULT NULL, + `JOB_COUNT_` int(11) NULL DEFAULT NULL, + `TIMER_JOB_COUNT_` int(11) NULL DEFAULT NULL, + `SUSP_JOB_COUNT_` int(11) NULL DEFAULT NULL, + `DEADLETTER_JOB_COUNT_` int(11) NULL DEFAULT NULL, + `VAR_COUNT_` int(11) NULL DEFAULT NULL, + `ID_LINK_COUNT_` int(11) NULL DEFAULT NULL, + `CALLBACK_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CALLBACK_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_EXEC_BUSKEY`(`BUSINESS_KEY_`) USING BTREE, + INDEX `ACT_IDC_EXEC_ROOT`(`ROOT_PROC_INST_ID_`) USING BTREE, + INDEX `ACT_FK_EXE_PROCINST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_FK_EXE_PARENT`(`PARENT_ID_`) USING BTREE, + INDEX `ACT_FK_EXE_SUPER`(`SUPER_EXEC_`) USING BTREE, + INDEX `ACT_FK_EXE_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, + CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_ru_execution +-- ---------------------------- +INSERT INTO `act_ru_execution` VALUES ('12505', 1, '12505', NULL, NULL, 'BMJHN:1:12504', NULL, '12505', NULL, 1, 0, 1, 0, 0, 1, NULL, '', NULL, 'startEvent1', '2019-08-14 08:39:06.412', 'Y11037', NULL, 1, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('12508', 1, '12505', NULL, '12505', 'BMJHN:1:12504', NULL, '12505', 'sid-75229381-F392-47CA-9655-BE5A1C93ED5B', 1, 0, 0, 0, 0, 1, NULL, '', NULL, NULL, '2019-08-14 08:39:06.467', NULL, NULL, 1, 0, 1, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('2505', 1, '2505', NULL, NULL, 'Expense:2:2504', NULL, '2505', NULL, 1, 0, 1, 0, 0, 1, NULL, '', NULL, 'start', '2019-07-04 17:40:04.410', '123', NULL, 1, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('2509', 2, '2505', NULL, '2505', 'Expense:2:2504', NULL, '2505', 'directorTak', 1, 0, 0, 0, 0, 1, NULL, '', NULL, NULL, '2019-07-04 17:40:04.420', NULL, NULL, 1, 0, 1, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('2526', 1, '2526', NULL, NULL, 'Expense:2:2504', NULL, '2526', NULL, 1, 0, 1, 0, 0, 1, NULL, '', NULL, 'start', '2019-07-04 17:51:49.347', '123', NULL, 1, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('2530', 2, '2526', NULL, '2526', 'Expense:2:2504', NULL, '2526', 'bossTask', 1, 0, 0, 0, 0, 1, NULL, '', NULL, NULL, '2019-07-04 17:51:49.347', NULL, NULL, 1, 0, 1, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('5', 1, '5', NULL, NULL, 'Expense:1:4', NULL, '5', NULL, 1, 0, 1, 0, 0, 1, NULL, '', NULL, 'start', '2019-07-04 17:29:05.316', '123', NULL, 1, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('5001', 1, '5001', NULL, NULL, 'Expense:2:2504', NULL, '5001', NULL, 1, 0, 1, 0, 0, 1, NULL, '', NULL, 'start', '2019-07-17 16:35:47.852', '123', NULL, 1, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('5005', 2, '5001', NULL, '5001', 'Expense:2:2504', NULL, '5001', 'directorTak', 1, 0, 0, 0, 0, 1, NULL, '', NULL, NULL, '2019-07-17 16:35:47.984', NULL, NULL, 1, 0, 1, 0, 0, 0, 0, 0, 0, NULL, NULL); +INSERT INTO `act_ru_execution` VALUES ('9', 2, '5', NULL, '5', 'Expense:1:4', NULL, '5', 'directorTak', 1, 0, 0, 0, 0, 1, NULL, '', NULL, NULL, '2019-07-04 17:29:05.326', NULL, NULL, 1, 0, 1, 0, 0, 0, 0, 0, 0, NULL, NULL); + +-- ---------------------------- +-- Table structure for act_ru_history_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_history_job`; +CREATE TABLE `act_ru_history_job` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `RETRIES_` int(11) NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ADV_HANDLER_CFG_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_ru_identitylink +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_identitylink`; +CREATE TABLE `act_ru_identitylink` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `GROUP_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `USER_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_USER`(`USER_ID_`) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_GROUP`(`GROUP_ID_`) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_IDENT_LNK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_ATHRZ_PROCEDEF`(`PROC_DEF_ID_`) USING BTREE, + INDEX `ACT_FK_TSKASS_TASK`(`TASK_ID_`) USING BTREE, + INDEX `ACT_FK_IDL_PROCINST`(`PROC_INST_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_ATHRZ_PROCEDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_IDL_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TSKASS_TASK` FOREIGN KEY (`TASK_ID_`) REFERENCES `act_ru_task` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_ru_identitylink +-- ---------------------------- +INSERT INTO `act_ru_identitylink` VALUES ('12506', 1, NULL, 'starter', 'Y11037', NULL, '12505', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('12514', 1, NULL, 'participant', '$INITIATOR', NULL, '12505', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('15', 1, NULL, 'participant', '123', NULL, '5', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('25', 1, 'jl', 'candidate', NULL, '23', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('2506', 1, NULL, 'starter', '123', NULL, '2505', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('2515', 1, NULL, 'participant', '123', NULL, '2505', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('2525', 1, 'jl', 'candidate', NULL, '2523', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('2527', 1, NULL, 'starter', '123', NULL, '2526', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('2536', 1, NULL, 'participant', '123', NULL, '2526', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('2540', 1, NULL, 'participant', '123', NULL, '2526', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('2547', 1, 'lb', 'candidate', NULL, '2545', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('5002', 1, NULL, 'starter', '123', NULL, '5001', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('5011', 1, NULL, 'participant', '123', NULL, '5001', NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('5021', 1, 'jl', 'candidate', NULL, '5019', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `act_ru_identitylink` VALUES ('6', 1, NULL, 'starter', '123', NULL, '5', NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for act_ru_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_job`; +CREATE TABLE `act_ru_job` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `RETRIES_` int(11) NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_`) USING BTREE, + INDEX `ACT_IDX_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_`) USING BTREE, + INDEX `ACT_IDX_JOB_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_JOB_SUB_SCOPE`(`SUB_SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_JOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_FK_JOB_EXECUTION`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_FK_JOB_PROCESS_INSTANCE`(`PROCESS_INSTANCE_ID_`) USING BTREE, + INDEX `ACT_FK_JOB_PROC_DEF`(`PROC_DEF_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_ru_suspended_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_suspended_job`; +CREATE TABLE `act_ru_suspended_job` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `RETRIES_` int(11) NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_SUSPENDED_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_`) USING BTREE, + INDEX `ACT_IDX_SUSPENDED_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_`) USING BTREE, + INDEX `ACT_IDX_SJOB_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_SJOB_SUB_SCOPE`(`SUB_SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_SJOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_FK_SUSPENDED_JOB_EXECUTION`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_FK_SUSPENDED_JOB_PROCESS_INSTANCE`(`PROCESS_INSTANCE_ID_`) USING BTREE, + INDEX `ACT_FK_SUSPENDED_JOB_PROC_DEF`(`PROC_DEF_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_SUSPENDED_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_ru_task +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_task`; +CREATE TABLE `act_ru_task` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PARENT_TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DESCRIPTION_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_DEF_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `ASSIGNEE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DELEGATION_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PRIORITY_` int(11) NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `DUE_DATE_` datetime(3) NULL DEFAULT NULL, + `CATEGORY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUSPENSION_STATE_` int(11) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + `FORM_KEY_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CLAIM_TIME_` datetime(3) NULL DEFAULT NULL, + `IS_COUNT_ENABLED_` tinyint(4) NULL DEFAULT NULL, + `VAR_COUNT_` int(11) NULL DEFAULT NULL, + `ID_LINK_COUNT_` int(11) NULL DEFAULT NULL, + `SUB_TASK_COUNT_` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_TASK_CREATE`(`CREATE_TIME_`) USING BTREE, + INDEX `ACT_IDX_TASK_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_TASK_SUB_SCOPE`(`SUB_SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_TASK_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_FK_TASK_EXE`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_FK_TASK_PROCINST`(`PROC_INST_ID_`) USING BTREE, + INDEX `ACT_FK_TASK_PROCDEF`(`PROC_DEF_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_ru_task +-- ---------------------------- +INSERT INTO `act_ru_task` VALUES ('12512', 1, '12508', '12505', 'BMJHN:1:12504', NULL, NULL, NULL, NULL, NULL, '部门管理员填写', NULL, NULL, 'sid-75229381-F392-47CA-9655-BE5A1C93ED5B', NULL, '$INITIATOR', NULL, 50, '2019-08-14 08:39:06.516', NULL, NULL, 1, '', NULL, NULL, 1, 0, 0, 0); +INSERT INTO `act_ru_task` VALUES ('23', 1, '9', '5', 'Expense:1:4', NULL, NULL, NULL, NULL, NULL, '经理审批', NULL, NULL, 'directorTak', NULL, '123', NULL, 50, '2019-07-04 17:31:46.302', NULL, NULL, 1, '', NULL, NULL, 1, 0, 1, 0); +INSERT INTO `act_ru_task` VALUES ('2523', 1, '2509', '2505', 'Expense:2:2504', NULL, NULL, NULL, NULL, NULL, '经理审批', NULL, NULL, 'directorTak', NULL, '123', NULL, 50, '2019-07-04 17:42:34.465', NULL, NULL, 1, '', NULL, NULL, 1, 0, 1, 0); +INSERT INTO `act_ru_task` VALUES ('2545', 1, '2530', '2526', 'Expense:2:2504', NULL, NULL, NULL, NULL, NULL, '老板审批', NULL, NULL, 'bossTask', NULL, '123', NULL, 50, '2019-07-04 17:52:12.690', NULL, NULL, 1, '', NULL, NULL, 1, 0, 1, 0); +INSERT INTO `act_ru_task` VALUES ('5019', 1, '5005', '5001', 'Expense:2:2504', NULL, NULL, NULL, NULL, NULL, '经理审批', NULL, NULL, 'directorTak', NULL, '123', NULL, 50, '2019-07-17 16:38:04.687', NULL, NULL, 1, '', NULL, NULL, 1, 0, 1, 0); + +-- ---------------------------- +-- Table structure for act_ru_timer_job +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_timer_job`; +CREATE TABLE `act_ru_timer_job` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `LOCK_EXP_TIME_` timestamp(3) NULL DEFAULT NULL, + `LOCK_OWNER_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCLUSIVE_` tinyint(1) NULL DEFAULT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROCESS_INSTANCE_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_DEF_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_DEFINITION_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `RETRIES_` int(11) NULL DEFAULT NULL, + `EXCEPTION_STACK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `EXCEPTION_MSG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DUEDATE_` timestamp(3) NULL DEFAULT NULL, + `REPEAT_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `HANDLER_CFG_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CUSTOM_VALUES_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, + `TENANT_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT '', + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_TIMER_JOB_EXCEPTION_STACK_ID`(`EXCEPTION_STACK_ID_`) USING BTREE, + INDEX `ACT_IDX_TIMER_JOB_CUSTOM_VALUES_ID`(`CUSTOM_VALUES_ID_`) USING BTREE, + INDEX `ACT_IDX_TJOB_SCOPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_TJOB_SUB_SCOPE`(`SUB_SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_TJOB_SCOPE_DEF`(`SCOPE_DEFINITION_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_FK_TIMER_JOB_EXECUTION`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_FK_TIMER_JOB_PROCESS_INSTANCE`(`PROCESS_INSTANCE_ID_`) USING BTREE, + INDEX `ACT_FK_TIMER_JOB_PROC_DEF`(`PROC_DEF_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_TIMER_JOB_CUSTOM_VALUES` FOREIGN KEY (`CUSTOM_VALUES_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TIMER_JOB_EXCEPTION` FOREIGN KEY (`EXCEPTION_STACK_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TIMER_JOB_EXECUTION` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TIMER_JOB_PROCESS_INSTANCE` FOREIGN KEY (`PROCESS_INSTANCE_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_TIMER_JOB_PROC_DEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for act_ru_variable +-- ---------------------------- +DROP TABLE IF EXISTS `act_ru_variable`; +CREATE TABLE `act_ru_variable` ( + `ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `REV_` int(11) NULL DEFAULT NULL, + `TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `NAME_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `EXECUTION_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TASK_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SUB_SCOPE_ID_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `SCOPE_TYPE_` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `BYTEARRAY_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `DOUBLE_` double NULL DEFAULT NULL, + `LONG_` bigint(20) NULL DEFAULT NULL, + `TEXT_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + `TEXT2_` varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL, + PRIMARY KEY (`ID_`) USING BTREE, + INDEX `ACT_IDX_RU_VAR_SCOPE_ID_TYPE`(`SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_IDX_RU_VAR_SUB_ID_TYPE`(`SUB_SCOPE_ID_`, `SCOPE_TYPE_`) USING BTREE, + INDEX `ACT_FK_VAR_BYTEARRAY`(`BYTEARRAY_ID_`) USING BTREE, + INDEX `ACT_IDX_VARIABLE_TASK_ID`(`TASK_ID_`) USING BTREE, + INDEX `ACT_FK_VAR_EXE`(`EXECUTION_ID_`) USING BTREE, + INDEX `ACT_FK_VAR_PROCINST`(`PROC_INST_ID_`) USING BTREE, + CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `act_ge_bytearray` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT, + CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE RESTRICT ON UPDATE RESTRICT +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of act_ru_variable +-- ---------------------------- +INSERT INTO `act_ru_variable` VALUES ('12507', 1, 'string', 'groupid', '12505', '12505', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1647c07823b14295915ecd6f08d4b78e', NULL); +INSERT INTO `act_ru_variable` VALUES ('17', 1, 'string', 'employee', '5', '5', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL); +INSERT INTO `act_ru_variable` VALUES ('18', 1, 'string', 'outcome', '5', '5', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '通过', NULL); +INSERT INTO `act_ru_variable` VALUES ('2507', 1, 'string', 'money', '2505', '2505', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '2', NULL); +INSERT INTO `act_ru_variable` VALUES ('2508', 1, 'string', 'taskUser', '2505', '2505', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL); +INSERT INTO `act_ru_variable` VALUES ('2517', 1, 'string', 'employee', '2505', '2505', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL); +INSERT INTO `act_ru_variable` VALUES ('2518', 1, 'string', 'outcome', '2505', '2505', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '通过', NULL); +INSERT INTO `act_ru_variable` VALUES ('2528', 1, 'string', 'money', '2526', '2526', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '600', NULL); +INSERT INTO `act_ru_variable` VALUES ('2529', 1, 'string', 'taskUser', '2526', '2526', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL); +INSERT INTO `act_ru_variable` VALUES ('2538', 1, 'string', 'employee', '2526', '2526', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL); +INSERT INTO `act_ru_variable` VALUES ('2539', 1, 'string', 'outcome', '2526', '2526', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '通过', NULL); +INSERT INTO `act_ru_variable` VALUES ('5003', 1, 'string', 'money', '5001', '5001', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL); +INSERT INTO `act_ru_variable` VALUES ('5004', 1, 'string', 'taskUser', '5001', '5001', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL); +INSERT INTO `act_ru_variable` VALUES ('5013', 1, 'string', 'employee', '5001', '5001', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL); +INSERT INTO `act_ru_variable` VALUES ('5014', 1, 'string', 'outcome', '5001', '5001', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '通过', NULL); +INSERT INTO `act_ru_variable` VALUES ('7', 1, 'string', 'money', '5', '5', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '1', NULL); +INSERT INTO `act_ru_variable` VALUES ('8', 1, 'string', 'taskUser', '5', '5', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '123', NULL); + +-- ---------------------------- +-- Table structure for et_exam_examination +-- ---------------------------- +DROP TABLE IF EXISTS `et_exam_examination`; +CREATE TABLE `et_exam_examination` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `planid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '关联的培训计划id', + `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '考试名称', + `starttime` datetime(6) NULL DEFAULT NULL COMMENT '考试开始时间', + `endtime` datetime(6) NULL DEFAULT NULL COMMENT '考试关闭时间', + `duration` int(8) NULL DEFAULT NULL COMMENT '在线考试用时(分钟)', + `isonline` int(1) NULL DEFAULT NULL COMMENT '是否在线考试', + `leader` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '负责人', + `leaderid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '负责人id', + `shouldJoin` int(8) NULL DEFAULT NULL COMMENT '应参与考试人数', + `realJoin` int(8) NULL DEFAULT NULL COMMENT '实际参加考试人数', + `creattime` datetime(6) NULL DEFAULT NULL COMMENT '考试创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for et_exam_exampaper +-- ---------------------------- +DROP TABLE IF EXISTS `et_exam_exampaper`; +CREATE TABLE `et_exam_exampaper` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `examid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '考试id', + `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '试卷名称', + `totalpoints` int(8) NULL DEFAULT NULL COMMENT '试卷总分', + `category` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属知识点(1项目管理,2质量.......)', + `categoryid` int(8) NULL DEFAULT NULL COMMENT '所属知识点编码(1项目管理,2质量.......)', + `description` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '试卷描述', + `passpoint` int(8) NULL DEFAULT NULL COMMENT '及格分数', + `creatperson` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '试卷创建人', + `creatpersonid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '试卷创建人id', + `edittime` datetime(6) NULL DEFAULT NULL COMMENT '最后编辑试卷时间', + `sum1` int(8) NULL DEFAULT NULL COMMENT '单选题数量', + `sum2` int(8) NULL DEFAULT NULL COMMENT '多选题数量', + `sum3` int(8) NULL DEFAULT NULL COMMENT '判断题数量', + `sum4` int(8) NULL DEFAULT NULL COMMENT '问答题数量', + `state` int(8) NULL DEFAULT NULL COMMENT '是否可编辑', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for et_exam_exampaper_question +-- ---------------------------- +DROP TABLE IF EXISTS `et_exam_exampaper_question`; +CREATE TABLE `et_exam_exampaper_question` ( + `id` int(11) NOT NULL, + `examid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '考试id', + `questionid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '试题id', + `score` int(8) NULL DEFAULT NULL COMMENT '分值', + `isMust` int(1) NULL DEFAULT NULL COMMENT '是否必答题', + `num` int(8) NULL DEFAULT NULL COMMENT '题目序号', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for et_exam_question +-- ---------------------------- +DROP TABLE IF EXISTS `et_exam_question`; +CREATE TABLE `et_exam_question` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `type` int(8) NULL DEFAULT NULL COMMENT '题型(1单选2多选3判断4问答)', + `subject` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '题目', + `category` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属知识点(1项目管理2质量.......)', + `categoryid` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属知识点id', + `description` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '试题解析', + `answer` varchar(600) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '答案', + `optionA` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '选项A', + `optionB` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '选项B', + `optionC` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '选项C', + `optionD` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '选项D', + `optionE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '选项E', + `optionF` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '选项F', + `edittime` datetime(6) NULL DEFAULT NULL COMMENT '最后编辑时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for et_exam_score +-- ---------------------------- +DROP TABLE IF EXISTS `et_exam_score`; +CREATE TABLE `et_exam_score` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `examid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '考试id', + `userid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '考生id', + `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '考生姓名', + `score` int(8) NULL DEFAULT NULL COMMENT '考试得分', + `haspassed` int(1) NULL DEFAULT NULL COMMENT '是否及格', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Table structure for et_groups +-- ---------------------------- +DROP TABLE IF EXISTS `et_groups`; +CREATE TABLE `et_groups` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `orgname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `creater_time` datetime(0) NULL DEFAULT NULL, + `reamrk` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of et_groups +-- ---------------------------- +INSERT INTO `et_groups` VALUES ('cf2140bf162949a581866b5bb2633914', '1', '超级管理员', '中国电科54所', '2019-05-29 09:45:34', '1'); +INSERT INTO `et_groups` VALUES ('2cbc36a1827c4dc18dbade7ffd1aba4a', '123123', '超级管理员', '中国电科54所', '2019-06-21 18:10:35', '123'); +INSERT INTO `et_groups` VALUES ('2a189c3f1f174797bc2c93ce60655523', '用户', '超级管理员', '中国电科54所', '2019-08-13 11:35:30', ''); +INSERT INTO `et_groups` VALUES ('bc7e2748a8aa43bf808f2c0c7df0a641', '保密', '超级管理员', '中国电科54所', '2019-08-13 11:53:47', ''); +INSERT INTO `et_groups` VALUES ('630c427989854f56b278c290e3d3bb23', '隔行', '超级管理员', '中国电科54所', '2019-08-13 11:55:12', ''); +INSERT INTO `et_groups` VALUES ('fdecdd7235294dd8a4fdd8c6acb479a2', '以后', '超级管理员', '中国电科54所', '2019-08-14 08:41:25', ''); + +-- ---------------------------- +-- Table structure for et_research +-- ---------------------------- +DROP TABLE IF EXISTS `et_research`; +CREATE TABLE `et_research` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `wjmc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `wjsm` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `orgname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `creater_time` datetime(0) NULL DEFAULT NULL, + `state` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of et_research +-- ---------------------------- +INSERT INTO `et_research` VALUES ('780841c10b3742518e52e1c2dbb56c9a', '设计调研', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `et_research` VALUES ('0d2b6d4eeddf4066ae5cb69f46dab779', '质量培训', '质量培训', '', '超级管理员', '中国电科54所', '2019-08-20 15:59:06', NULL); +INSERT INTO `et_research` VALUES ('76fcaca1ec554105b699d266bf887e77', '保密培训', '保密培训', '', '超级管理员', '中国电科54所', '2019-08-22 10:50:12', NULL); +INSERT INTO `et_research` VALUES ('4e4dd1cab6f742b0a39a7b37614a90b2', '入职调研', NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for et_research_exam +-- ---------------------------- +DROP TABLE IF EXISTS `et_research_exam`; +CREATE TABLE `et_research_exam` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `tm` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `qtype` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `bd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a9` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a10` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a11` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `order` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of et_research_exam +-- ---------------------------- +INSERT INTO `et_research_exam` VALUES ('1', '调研', '1', '0', '是', '是', '是', '是', '是', '是', '是', '是', '是', '是', '是', '1'); + +-- ---------------------------- +-- Table structure for et_resource_file +-- ---------------------------- +DROP TABLE IF EXISTS `et_resource_file`; +CREATE TABLE `et_resource_file` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `filename` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名', + `fileurl` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件url', + `uploadtime` datetime(0) NULL DEFAULT NULL COMMENT '上传时间', + `description` varchar(600) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件描述', + `category` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件分类', + `categoryid` int(11) NULL DEFAULT NULL COMMENT '分类id', + `filesize` double NULL DEFAULT NULL COMMENT '文件大小', + `fileextention` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '扩展名', + `title` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件标题', + `provider` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '提供者', + `providerid` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '提供者id', + `sumok` int(11) NULL DEFAULT NULL COMMENT '好评数量', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of et_resource_file +-- ---------------------------- +INSERT INTO `et_resource_file` VALUES ('7ec7177efa974e59bd4230e0eced5df4', '20190506_王伯岩老师课程录屏.mp4', 'files\\22e7f5234d2841cdba7e181045f975ae.mp4', '2019-07-01 16:27:17', '视频测试', '职场进阶', 2, 225140914, 'flv', '视频测试', '信息中心', NULL, 5); +INSERT INTO `et_resource_file` VALUES ('fe448dff9f204f10af51f4043c626771', 'pom.xml', 'files\\2a2c4ae94254491a83f6288b91801075.xml', '2019-07-01 15:00:18', '11112', '企业管理', 1, 843, 'xml', '11112', '11112', NULL, 9); + +-- ---------------------------- +-- Table structure for et_statistic_department_training +-- ---------------------------- +DROP TABLE IF EXISTS `et_statistic_department_training`; +CREATE TABLE `et_statistic_department_training` ( + `id` int(8) NOT NULL AUTO_INCREMENT, + `department` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `course_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `train_target` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `entry_years` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `course_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `course_content` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `internal_lecturer_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `internal_lecturer_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `internal_lecturer_specialist_ornot` tinyint(255) NULL DEFAULT NULL, + `external_lecturer_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `external_lecturer_department` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `train_time` date NULL DEFAULT NULL, + `train_mode` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `train_number` int(8) NULL DEFAULT NULL, + `plan_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `train_scope` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `execution` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `result` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `exam_grade` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `note` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of et_statistic_department_training +-- ---------------------------- +INSERT INTO `et_statistic_department_training` VALUES (1, '遥感', '管理', '', NULL, NULL, NULL, '张三', NULL, NULL, NULL, NULL, '2019-08-12', NULL, NULL, '计划内', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `et_statistic_department_training` VALUES (2, '卫通', '技术', NULL, NULL, NULL, NULL, '张三', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '计划内', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `et_statistic_department_training` VALUES (3, '导航', '技能', NULL, NULL, NULL, NULL, '李志', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '计划外', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `et_statistic_department_training` VALUES (4, '遥感', '营销', NULL, NULL, NULL, NULL, '王伟', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '计划内', NULL, NULL, NULL, NULL, NULL); +INSERT INTO `et_statistic_department_training` VALUES (5, '卫通', '管理', NULL, NULL, NULL, NULL, '李志', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '计划外', NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for et_train_groupinplan +-- ---------------------------- +DROP TABLE IF EXISTS `et_train_groupinplan`; +CREATE TABLE `et_train_groupinplan` ( + `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `startDate` datetime(0) NULL DEFAULT NULL, + `endDate` datetime(0) NULL DEFAULT NULL, + `status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `traintype` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0', + `addtime` datetime(0) NULL DEFAULT NULL, + `addusername` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `addusercode` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of et_train_groupinplan +-- ---------------------------- +INSERT INTO `et_train_groupinplan` VALUES ('6e864ead802b410381f5d85adef6f028', '2019年度部门级计划制定1', '2019-07-23 16:38:50', '2019-07-26 16:38:52', '1', '0', NULL, NULL, NULL); +INSERT INTO `et_train_groupinplan` VALUES ('83e1002c67b744eaa9ec7595884fedec', '1', '2019-08-06 18:05:47', '2019-08-06 18:05:49', '0', '0', '2019-08-07 16:29:17', '宁志全', 'Y11037'); + +-- ---------------------------- +-- Table structure for et_train_groupinplan_group +-- ---------------------------- +DROP TABLE IF EXISTS `et_train_groupinplan_group`; +CREATE TABLE `et_train_groupinplan_group` ( + `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `gppid` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `groupname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `groupid` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `addtime` datetime(0) NULL DEFAULT NULL, + `addusername` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `addusercode` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of et_train_groupinplan_group +-- ---------------------------- +INSERT INTO `et_train_groupinplan_group` VALUES ('1', '6e864ead802b410381f5d85adef6f028', '遥控', '1', NULL, NULL, NULL); +INSERT INTO `et_train_groupinplan_group` VALUES ('2', '6e864ead802b410381f5d85adef6f028', '卫通', '2', NULL, NULL, NULL); +INSERT INTO `et_train_groupinplan_group` VALUES ('020c295b2f4c4322b3409f80dd64a9ee', '83e1002c67b744eaa9ec7595884fedec', '遥控', '1', '2019-08-07 16:29:26', '宁志全', 'Y11037'); + +-- ---------------------------- +-- Table structure for et_train_tk +-- ---------------------------- +DROP TABLE IF EXISTS `et_train_tk`; +CREATE TABLE `et_train_tk` ( + `id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `tm` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `qtype` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `bd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a9` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a10` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `a11` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `order` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of et_train_tk +-- ---------------------------- +INSERT INTO `et_train_tk` VALUES ('1', '您对培训讲师最基本的要求是?', '0', '1', 'PPT演示文稿制作精致', '授课形式丰富', '互动性强', '合理安排授课时间', '幽默风趣会调动气氛', '', '', '', '', '', '', '1'); +INSERT INTO `et_train_tk` VALUES ('2', '您认为最有效的培训方式是?', '1', '0', '文稿制作精致', '互动性强', '时间', '调动气氛', '其它', '', '', '', '', '', '', '2'); +INSERT INTO `et_train_tk` VALUES ('3', '您认为最有效的培训方式是?', '0', '0', '文稿制作精致', '互动性强', '时间', '调动气氛', '其它', '', '', '', '', '', '', '3'); +INSERT INTO `et_train_tk` VALUES ('4', '填写段落说明-后10题为选择题', '3', '-1', '', '', '', '', '', '', '', '', '', '', '', '4'); +INSERT INTO `et_train_tk` VALUES ('5', '您认为最有效的培训方式是?', '2', '0', '', '', '', '', '', '', '', '', '', '', '', '5'); +INSERT INTO `et_train_tk` VALUES ('6', '您认为最有效的培训方式是', '1', '1', 'PPT', '授课', '合理安排', '幽默', '其它', '', '', '', '', '', '', '6'); + +-- ---------------------------- +-- Table structure for jcdp_chat_apps +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_chat_apps`; +CREATE TABLE `jcdp_chat_apps` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `APPNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '应用名称', + `APPCATEGORY` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类', + `INTRODUCTION` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '介绍', + `APPURL` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '应用主页', + `APPIMAGE` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT 'APP图标', + `LOGINURL` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '登录地址', + `CLIENTWEBBROWSER` decimal(1, 0) NULL DEFAULT NULL COMMENT '浏览器类型 0-IE 1-Chrome 2-系统默认', + `WINWIDTH` decimal(4, 0) NULL DEFAULT NULL COMMENT '浏览器宽度', + `WINHEIGHT` decimal(4, 0) NULL DEFAULT NULL COMMENT '浏览器高度', + `ORDERVALUE` decimal(4, 0) NULL DEFAULT NULL COMMENT '排序号', + `CREATETIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `SHORTCUT` decimal(1, 0) NULL DEFAULT NULL COMMENT '快捷方式类型', + `APPID` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'APP唯一标示', + `FULLSCREEN` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否全屏', + `ELEMENTLOGINNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名输入框标识', + `ELEMENTLOGINPWD` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码输入框标识', + `ELEMENTLOGINBUTTON` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录按钮标识', + `OWNTYPE` decimal(1, 0) NULL DEFAULT NULL COMMENT '所属类型:0-个人 1-公共', + `CREATEUSER` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建者标识', + `LOGINELEMENTTYPE` decimal(1, 0) NULL DEFAULT NULL COMMENT '登录界面元素类型', + `LOGINPAGESCRIPT` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '登录页面注入脚本', + `MAINPAGESCRIPT` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '主页面注入脚本', + `MIANPAGEPARAMS` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + `APPENABLED` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否可用', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_chat_apps +-- ---------------------------- +INSERT INTO `jcdp_chat_apps` VALUES ('037dfda4d5984a71b23bde0359dac14', '写邮件', '协同办公', NULL, 'http://10.55.8.21/MailMng/SWriteLetter.aspx?cmd=new', 'http://10.55.12.110/asset/image/apps/mailnew.png', 'http://isms.cetc54.com/ens/login.aspx', 0, 800, 600, 3, NULL, 0, 'CETC54_Ens', 0, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, 'function onSended() {\r\n Ext.MessageBox.show({\r\n title: \"系统提示\",\r\n msg: \"邮件发送成功,是否推送消息?\",\r\n buttons: Ext.MessageBox.OKCANCEL,\r\n icon: Ext.MessageBox.QUESTION,\r\n fn: function (btn) {\r\n if (btn == \"ok\") {\r\n try {\r\n var usercodes = [];\r\n var tolist = document.getElementsByName(\"toList\");\r\n var cclist = document.getElementsByName(\"ccList\");\r\n for (var i = 0; i < tolist.length; i++) {\r\n var n = tolist[i].value.split(\"(\")[1];\r\n usercodes.push(n.substring(0, n.length - 1));\r\n }\r\n for (var i = 0; i < cclist.length; i++) {\r\n var n = cclist[i].value.split(\"(\")[1];\r\n usercodes.push(n.substring(0, n.length - 1));\r\n }\r\n var appId = \"3930ab98da0a4e82aab182482313557\";\r\n var appName = \"安全邮件\";\r\n var content = document.getElementById(\"RegionPanel1_topRegion_editForm_FormRow5_subject\").value;\r\n\r\n window.external.SendMq(usercodes.join(\",\"), appId, appName, content);\r\n window.external.CloseBrowser();\r\n } catch (e) {\r\n Ext.MessageBox.show({\r\n title: \"系统提示\",\r\n msg: \"您的软件版本不支持推送消息!\",\r\n buttons: Ext.MessageBox.OK,\r\n icon: Ext.MessageBox.INFO\r\n });\r\n }\r\n }else{\r\n window.external.CloseBrowser();\r\n }\r\n }\r\n });\r\n}\r\nonMailSended = onSended;', NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('097b93c473474a8fb505dd6f6ef0cda2', '室FTP', '专业部应用', '', 'http://10.55.148.42:88/default.aspx', NULL, NULL, 1, 500, 400, 9999, '2018-01-10 09:53:27', NULL, NULL, 1, NULL, NULL, NULL, 0, '83bedd208c9a46eda1ce4e47705b3b73', NULL, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('1aa9313e83bc42de93663528627243d', '内导外申请', '协同办公', NULL, 'http://xxjh.cetc54.com/Web/MailInfoList.aspx', 'http://10.55.12.110/asset/image/apps/nw.png', 'http://isms.cetc54.com/ens/login.aspx', 0, 980, 600, 4, NULL, 0, 'CETC54_Ens', 0, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('1c85d30bff54420c9878247ff54867e', '所网论坛', '54所门户', NULL, 'http://bbs.cetc54.com/', NULL, 'http://bbs.cetc54.com/', 0, 1024, 768, 3, NULL, 0, 'CETC54_BBS', 0, NULL, NULL, NULL, 1, NULL, 0, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('3892169eda9444e9ac875b871496ea58', '知识平台', '专业部应用', '', 'http://10.55.148.39:8082/', NULL, NULL, 1, 500, 400, 9999, '2018-01-10 09:49:41', NULL, NULL, 1, NULL, NULL, NULL, 0, '83bedd208c9a46eda1ce4e47705b3b73', NULL, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('3930ab98da0a4e82aab182482313557', '我的邮件', '协同办公', NULL, 'http://10.55.8.21/Default.aspx', 'http://10.55.12.110/asset/image/apps/semail.png', 'http://isms.cetc54.com/ens/login.aspx', 0, 800, 600, 2, NULL, 0, 'CETC54_Ens', 0, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('730f36f66c15494ebfbbdd7d048b3127', '内部信息管理平台', '专业部应用', '', 'http://10.55.148.39:1234/ens/login.aspx', NULL, NULL, 1, 500, 400, 9999, '2018-01-10 09:56:55', NULL, NULL, 1, NULL, NULL, NULL, 0, '83bedd208c9a46eda1ce4e47705b3b73', NULL, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('79c16ac130bb410eb98d521ed14c2a2', '所内公告', '54所门户', NULL, 'http://www.cetc54.com/NewsList.aspx?ClassID=10', NULL, NULL, 0, 1040, 768, 2, NULL, 0, 'CETC54_NEWS', 0, NULL, NULL, NULL, 1, NULL, 0, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('7cd8b8f56966432b9541285bfc79755', '个人日历', '协同项目', NULL, 'http://10.55.6.16:810/CETC54Platform.ashx', 'http://10.55.12.110/asset/image/apps/cal.png', 'http://isms.cetc54.com/ens', 0, NULL, NULL, 5, NULL, 0, 'CETC54_Ens', 1, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, NULL, 'p=7&u=%eimp.username%', 1); +INSERT INTO `jcdp_chat_apps` VALUES ('9a8a0a0b27754a73962c221ee3d2c43', '外导内列表', '协同办公', NULL, 'http://xxjh.cetc54.com/Web/MailReceiveListForPerson.aspx', 'http://10.55.12.110/asset/image/apps/wn.png', 'http://isms.cetc54.com/ens/login.aspx', 0, 1000, 600, 11, NULL, 0, 'CETC54_Ens', 0, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('9e1161a94836445bbdbf6ddc6516af6', '我的任务', '协同项目', NULL, 'http://10.55.6.16:810/CETC54Platform.ashx', 'http://10.55.12.110/asset/image/apps/task.png', 'http://isms.cetc54.com/ens', 0, NULL, NULL, 9, NULL, 0, 'CETC54_Ens', 1, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, NULL, 'p=2&u=%eimp.username%', 1); +INSERT INTO `jcdp_chat_apps` VALUES ('a6ecc3eaa7524007b2880fc5c74ef2d', 'PDM', '协同项目', NULL, 'http://pdm.cetc54.com/Windchill/app/', NULL, 'http://pdmlogin.cetc54.com:8099/sso/login', 1, NULL, NULL, 13, NULL, 0, 'CETC54_PDM', 1, 'username', 'password', 'btnsubmit', 1, NULL, 0, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('ba7e1baa65524afc8df3c58f7e0fe3e1', '部门FTP', '专业部应用', '', 'ftp://10.55.148.63/', NULL, NULL, 1, 500, 400, 9999, '2018-01-10 09:54:15', NULL, NULL, 1, NULL, NULL, NULL, 0, '83bedd208c9a46eda1ce4e47705b3b73', NULL, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('c024f0a1db424695811a33c00f5436e', '我的日志', '协同项目', NULL, 'http://10.55.6.16:810/CETC54Platform.ashx', 'http://10.55.12.110/asset/image/apps/rizhi.png', 'http://isms.cetc54.com/ens', 0, NULL, NULL, 6, NULL, 0, 'CETC54_Ens', 1, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, NULL, 'p=3&u=%eimp.username%', 1); +INSERT INTO `jcdp_chat_apps` VALUES ('c366b72c968b46f8b7d4592ff4535fb', '我的项目', '协同项目', NULL, 'http://10.55.6.16:810/CETC54Platform.ashx', 'http://10.55.12.110/asset/image/apps/project.png', 'http://isms.cetc54.com/ens', 0, NULL, NULL, 8, NULL, 0, 'CETC54_Ens', 1, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, NULL, 'p=12&u=%eimp.username%', 1); +INSERT INTO `jcdp_chat_apps` VALUES ('c73c51eea7a846249c111f1da466370', '所网主页', '54所门户', NULL, 'http://www.cetc54.com/', 'http://10.55.12.110/asset/image/apps/zhuye.png', NULL, 0, NULL, NULL, 1, NULL, 0, 'CETC54_Index', 1, NULL, NULL, NULL, 1, NULL, 0, NULL, NULL, NULL, 1); +INSERT INTO `jcdp_chat_apps` VALUES ('fe24c4ac34444902a2129ec1dbf9ed4', '门户首页', '协同办公', NULL, 'http://isms.cetc54.com/ens/mainform.aspx', 'http://10.55.12.110/asset/image/apps/ens.png', 'http://isms.cetc54.com/ens/login.aspx', 0, NULL, NULL, 1, NULL, 0, 'CETC54_Ens', 1, 'txtUser', 'txtPass', 'lbtnLogin', 1, NULL, 0, NULL, '$(\'.icon_switch\').closest(\'a\').hide();', NULL, 1); + +-- ---------------------------- +-- Table structure for jcdp_chat_apps_my +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_chat_apps_my`; +CREATE TABLE `jcdp_chat_apps_my` ( + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `APPID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_chat_apps_my +-- ---------------------------- +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', '79c16ac130bb410eb98d521ed14c2a2'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', '037dfda4d5984a71b23bde0359dac14'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', '1c85d30bff54420c9878247ff54867e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', 'c366b72c968b46f8b7d4592ff4535fb'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', '9e1161a94836445bbdbf6ddc6516af6'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', 'a6ecc3eaa7524007b2880fc5c74ef2d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5e0b157de9ae4c2495f3918e7625431a', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5e0b157de9ae4c2495f3918e7625431a', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5e0b157de9ae4c2495f3918e7625431a', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5e0b157de9ae4c2495f3918e7625431a', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('3930ab98da0a4e82aab1824823135576', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('3930ab98da0a4e82aab1824823135576', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('3930ab98da0a4e82aab1824823135576', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('3930ab98da0a4e82aab1824823135576', '037dfda4d5984a71b23bde0359dac14'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('3930ab98da0a4e82aab1824823135576', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('3930ab98da0a4e82aab1824823135576', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('3930ab98da0a4e82aab1824823135576', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('25f0fd10490349b9941f8325c1fc8488', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('25f0fd10490349b9941f8325c1fc8488', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('25f0fd10490349b9941f8325c1fc8488', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('25f0fd10490349b9941f8325c1fc8488', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('25f0fd10490349b9941f8325c1fc8488', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('25f0fd10490349b9941f8325c1fc8488', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('25f0fd10490349b9941f8325c1fc8488', '9e1161a94836445bbdbf6ddc6516af6'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', '037dfda4d5984a71b23bde0359dac14'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', '79c16ac130bb410eb98d521ed14c2a2'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', '1c85d30bff54420c9878247ff54867e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', 'c366b72c968b46f8b7d4592ff4535fb'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', '9e1161a94836445bbdbf6ddc6516af6'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', 'a6ecc3eaa7524007b2880fc5c74ef2d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', '1c85d30bff54420c9878247ff54867e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', '79c16ac130bb410eb98d521ed14c2a2'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', '037dfda4d5984a71b23bde0359dac14'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', 'c366b72c968b46f8b7d4592ff4535fb'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', '9e1161a94836445bbdbf6ddc6516af6'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('521d08563ab74b8188599be180575bcb', 'a6ecc3eaa7524007b2880fc5c74ef2d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('1d8094115f5c4c6ab8c38c414a65d6f4', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('1d8094115f5c4c6ab8c38c414a65d6f4', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('a6fefe02f64446cb855941af41aa67a9', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '037dfda4d5984a71b23bde0359dac14'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '79c16ac130bb410eb98d521ed14c2a2'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '1c85d30bff54420c9878247ff54867e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', 'c366b72c968b46f8b7d4592ff4535fb'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '9e1161a94836445bbdbf6ddc6516af6'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', 'a6ecc3eaa7524007b2880fc5c74ef2d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', '037dfda4d5984a71b23bde0359dac14'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', '79c16ac130bb410eb98d521ed14c2a2'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('d9074901d5934613ae09ebb1835f3b1e', '1c85d30bff54420c9878247ff54867e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5676921ac94b4633a614892676567bfb', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5676921ac94b4633a614892676567bfb', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5676921ac94b4633a614892676567bfb', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5676921ac94b4633a614892676567bfb', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5676921ac94b4633a614892676567bfb', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('5676921ac94b4633a614892676567bfb', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', '79c16ac130bb410eb98d521ed14c2a2'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', '037dfda4d5984a71b23bde0359dac14'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', '1c85d30bff54420c9878247ff54867e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', 'c366b72c968b46f8b7d4592ff4535fb'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', '9e1161a94836445bbdbf6ddc6516af6'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', 'a6ecc3eaa7524007b2880fc5c74ef2d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('1df48ce2f70e46a19eccb6b88b64a4bb', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', 'c73c51eea7a846249c111f1da466370'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', 'fe24c4ac34444902a2129ec1dbf9ed4'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '3930ab98da0a4e82aab182482313557'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '79c16ac130bb410eb98d521ed14c2a2'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '037dfda4d5984a71b23bde0359dac14'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '1c85d30bff54420c9878247ff54867e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '1aa9313e83bc42de93663528627243d'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '7cd8b8f56966432b9541285bfc79755'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', 'c024f0a1db424695811a33c00f5436e'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', 'c366b72c968b46f8b7d4592ff4535fb'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '9e1161a94836445bbdbf6ddc6516af6'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '9a8a0a0b27754a73962c221ee3d2c43'); +INSERT INTO `jcdp_chat_apps_my` VALUES ('2798eeaa5ed445749f80f71ef202cffa', 'a6ecc3eaa7524007b2880fc5c74ef2d'); + +-- ---------------------------- +-- Table structure for jcdp_chat_friends +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_chat_friends`; +CREATE TABLE `jcdp_chat_friends` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户ID', + `FRIENDID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '好友ID', + `CATENAME` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '好友类别', + `REMARK` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_chat_friends +-- ---------------------------- +INSERT INTO `jcdp_chat_friends` VALUES ('79fcc09d74724adbad2c52c18d2045ea', '7dcd4e266b8147ee8bf0195fcec6f6be', '1df48ce2f70e46a19eccb6b88b64a4bb', '', ''); +INSERT INTO `jcdp_chat_friends` VALUES ('fd65703429294e3ca045f1322a7fd51b', '1df48ce2f70e46a19eccb6b88b64a4bb', '7dcd4e266b8147ee8bf0195fcec6f6be', '哈哈', '嘿嘿'); + +-- ---------------------------- +-- Table structure for jcdp_chat_friends_apply +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_chat_friends_apply`; +CREATE TABLE `jcdp_chat_friends_apply` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `APPLYERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '申请人ID', + `RECEIVERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人ID', + `REMARK` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `ISAGREE` tinyint(1) NULL DEFAULT NULL COMMENT '是否同意', + `APPLYTIME` datetime(0) NULL DEFAULT NULL, + `AGREETIME` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_chat_friends_apply +-- ---------------------------- +INSERT INTO `jcdp_chat_friends_apply` VALUES ('59b3edf470a6422ba33c6146b349c370', '1df48ce2f70e46a19eccb6b88b64a4bb', '7dcd4e266b8147ee8bf0195fcec6f6be', '我是 靳晓松', 1, '2018-01-17 15:36:41', '2018-01-17 15:38:21'); +INSERT INTO `jcdp_chat_friends_apply` VALUES ('a1dda329f56b43b6b22df008bcd0acd2', 'a6fefe02f64446cb855941af41aa67a9', '200c68d821984e73a4b6e1b86eedaabe', '我是 韩燕', 0, '2018-01-09 14:41:06', NULL); + +-- ---------------------------- +-- Table structure for jcdp_chat_groupmembers +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_chat_groupmembers`; +CREATE TABLE `jcdp_chat_groupmembers` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `GROUPID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '群组ID', + `ISMANAGER` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否为管理员', + `MSGHINTSETTING` decimal(1, 0) NULL DEFAULT NULL COMMENT '群设置', + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户ID', + `JOINTIME` datetime(0) NULL DEFAULT NULL COMMENT '加入时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_chat_groupmembers +-- ---------------------------- +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0171a6ab3d67416c8135e2f3ef058f5e', 'f51164faec604310aa1aacec90248688', 1, 0, '8778b7b776c242f98b6ad46087adb2e4', '2017-05-22 11:23:56'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('018928f5b86c4132863a633d9afc5f51', '9c48c437c9bd4c029338863c75d98324', 0, 0, '1d8094115f5c4c6ab8c38c414a65d6f4', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('04cbb53e6a864612a92abd6fc9660c75', 'a594c655ed8648a794efc56f2e4c8331', 0, 0, '8778b7b776c242f98b6ad46087adb2e4', '2017-05-22 17:11:52'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('059ed45a9966458d90f5a378201d9254', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'c90b3e7907094c3cb399f6270c5d3e2d', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('05d61cbc52894de68a8c04817ab25fdf', '9c48c437c9bd4c029338863c75d98324', 0, 0, '48e5269d5fb0450ab24708c9ba20aac9', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('061b85b8c0f042fc91e366943286e947', '9c48c437c9bd4c029338863c75d98324', 0, 0, '5f632069a0164b479e53f093ee83c0d6', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('07d5ffbe486e4dee9a7fec95db710b1f', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'fa5507f1eeac49f091aa877a94244548', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('091bd1e307c34322a0cb9a9728e0aaa6', '9c48c437c9bd4c029338863c75d98324', 0, 0, '6c583d1f10a241ad90b0a11898a670ca', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0981f167165c45ceb3780214fa81e114', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, '3930ab98da0a4e82aab1824823135576', '2017-05-18 20:01:41'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0996d696b6844876935fe1d947fae7e1', '9c48c437c9bd4c029338863c75d98324', 0, 0, '9a8a0a0b27754a73962c221ee73d2c43', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0a4f81e1628d40739ab46fa01e9197f1', '9c48c437c9bd4c029338863c75d98324', 0, 0, '2d96e3863dc74b23878314d5eee59d9a', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0a76bedb9c004f218831452007d32f0b', '9c48c437c9bd4c029338863c75d98324', 0, 0, '66486ff6f3db4d38a07f17717f23f12c', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0ac6b1bc48db499b845251f248100a8c', 'a594c655ed8648a794efc56f2e4c8331', 2, 0, '606844d489f841939e330acdb5b2601e', '2017-05-22 05:11:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0b8998acf28b45adb70e46f81e5867c9', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '61f00a225f644f37bf83c0673ea81845', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0cc27e9f767549c09b1d65f5a38f5147', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e9088f3abdb340409f55380f6a673475', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0cd2ffe7bc2a49cbac6d79ccbcb599d7', '9c48c437c9bd4c029338863c75d98324', 2, 0, 'e07451595e8740ff9e8928006a382895', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0e0939999d1741c28121c795309d4029', 'cb919038dbaf418bb04c66f5ccf83071', 0, 0, '3d30a7e3e08b4ca59a4783197b809a79', '2017-05-19 09:15:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0edfab5e8b5c4fd2bef25dda5c8175b2', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'b497ab9b01c74a93b6ee7f079a356070', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('0fce506216254647be839af26f7ff00b', '9c48c437c9bd4c029338863c75d98324', 0, 0, '606844d489f841939e330acdb5b2601e', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('10279f7fec0341f6aada458a2c176263', '9c48c437c9bd4c029338863c75d98324', 0, 0, '9e1161a94836445bbdbf6ddc6516af6a', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('138af6e74a084303beb7c7f56d37906a', '9c48c437c9bd4c029338863c75d98324', 0, 0, '93c2a1ec4940431caab0eb93fc079b12', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('14d6eac5025c4db6893270834a5b7ab5', 'f51164faec604310aa1aacec90248688', 1, 0, '606844d489f841939e330acdb5b2601e', '2017-05-22 11:23:56'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('1526fdb4adaa45d4bc6c5c5927b6a814', '9c48c437c9bd4c029338863c75d98324', 0, 0, '1aa9313e83bc42de93663528627243d3', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('15a9c998dc8541b0ac782b7a8a8ffb05', 'f51164faec604310aa1aacec90248688', 1, 0, '32a36e78b5fd44649ae1b9b4a3b174e3', '2017-05-22 11:23:56'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('15e72e6dae794837b754a921809f8df7', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '6e40a2254a86454ba9a69a4a4b1d44d6', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('16421cbe455443edb8d1e8b241796cea', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'ac6ff95774e8486a8cf49a8651676fc5', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('16b6b4b15b3549449b36cbf480138e9d', '9c48c437c9bd4c029338863c75d98324', 0, 0, '03b37ba8d14a45cdae3100eacaec52a9', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('1866a87420d44721840230ba5ac820de', '9c48c437c9bd4c029338863c75d98324', 0, 0, '82bb85dfa7dc4330893ac38fda2ae74d', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('1a6d54a76bab4a25b470ddffcced7d06', 'e557e871655a487a8156d13d7464d139', 0, 0, '3260d140b17744e5b4ecb80ac658d300', '2017-05-22 17:12:17'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('1dbad48a9da14bf384f8f5dfe8291d50', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'd6deedb76ca2475e84bda50105852171', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('1dbb10c196a44c33a3dd42b76d18d695', '4dad7ff7b8a34bdc81d67b859d2981d2', 0, 0, 'a6fefe02f64446cb855941af41aa67a9', '2017-05-19 10:53:23'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('20f6dafbc40941fbbe5f91bf91edc024', '9c48c437c9bd4c029338863c75d98324', 0, 0, '3f29e5b0069f4dca982a7af45fcc7946', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('21dc24e2a8ea40219fccf2f4c6e297e7', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'b497ab9b01c74a93b6ee7f079a356070', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('220dd4dde2084aa5bc7ddcd1d839b972', '9c48c437c9bd4c029338863c75d98324', 0, 0, '6a26f0722eaf42df86d7c27a62e7b02d', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('22695016d03647ed9e47f6d2b82f925f', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'e9688858640e4868b4dfdab1d3d30ec3', '2017-05-19 10:17:34'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('23af73db45a04943b3171357a67bcf45', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'f4d6d95a49ad414eb567000b8dea9fe4', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('24479a80f9f74993b15e8c7fbdaafefb', 'e557e871655a487a8156d13d7464d139', 2, 0, '664afc7c3f924e669ae697a932594531', '2017-05-22 05:12:00'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('270d6ebcc52749ea9541f495528196ad', '9c48c437c9bd4c029338863c75d98324', 0, 0, '959f8e645e3c45ec88edbc073b5b42dd', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('28329be552f34d248a1b67c5e381ed38', '9c48c437c9bd4c029338863c75d98324', 0, 0, '2ba55257e6884d52b6a8220f2f782733', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('28f5d51b872b4f948c2af9a494143db7', '8f2354f77fff4063a75113e993a7bc97', 0, 0, '3930ab98da0a4e82aab1824823135576', '2017-05-19 10:03:48'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('2913f4995aea46b5ba9ddecb2de2bf90', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'a7b957c9525b44cbb0f7cb097e6786d2', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('2a0862abab91484d93f6e364fbbeca5f', 'cb919038dbaf418bb04c66f5ccf83071', 0, 0, '1cb2fb93db774202bdd2532fa57d9bff', '2017-05-19 09:15:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('2cfa0c67c97a4132abbbfdf21047d7a8', '1748ca8580f34681a21b7e4bfda0b4ba', 1, 0, '7cef8587cddc4f03a1e7176e0a8ee340', '2017-05-19 10:57:04'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('2e2dac875a4945bbb44b06ab192dbe95', '9c48c437c9bd4c029338863c75d98324', 0, 0, '61f00a225f644f37bf83c0673ea81845', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('2f93e750247f4f67a7198f8bcd8ccdef', 'cb919038dbaf418bb04c66f5ccf83071', 2, 0, '5676921ac94b4633a614892676567bfb', '2017-05-19 09:06:54'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('304ab082c80d47c3aff586bc43f6515b', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'edf3e838b0fb49e2bcde0707fa255f2a', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('30bba11d309f4e888b2be270fc24c72c', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'f7d3f7b9a7c046a38e02d035eae7835b', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('32f7d9e9f67d4165851daf14b8c34827', '9c48c437c9bd4c029338863c75d98324', 0, 0, '082538db933e477598aa3e87ec2b21e8', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('33c06d99fbf54466b9a37804b99ed553', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'c2649ae0bb9148f98c62f1a5b5f01652', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('383bd9463dba4eba97f99a92fde351ba', '9c48c437c9bd4c029338863c75d98324', 0, 0, '920c7fb30bd44be8bd4581e7882f6dfd', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('388e7a37d13844ff8f1440accd2b08d9', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'a555574326ec46f7acf25d1e84b51425', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('38992273d0e047a7a87a957e1a0de6ea', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'f2e2329423e44966ae29d3fc8f3083ee', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('38f80f1a38524d349ea69d27ae2103e7', '9c48c437c9bd4c029338863c75d98324', 0, 0, '1c85d30bff54420c9878247ff54867e0', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('39aac390a5b7499b89579863ed736026', '76a96bccedfb4d7eae804736c0b69ac3', 2, 0, 'b304903b0f0a451bb44685a898508369', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('39cfbe6d568648e290f75eed52bb3c6f', '9c48c437c9bd4c029338863c75d98324', 0, 0, '211dd03b8a304b57a77d457d6beae1f9', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('3c2f4223f52d42deb24f9ca9cc391163', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '32a36e78b5fd44649ae1b9b4a3b174e3', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('3cd2f4026e964c56a76a202202ec07f1', '9c48c437c9bd4c029338863c75d98324', 0, 0, '6e40a2254a86454ba9a69a4a4b1d44d6', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('3fed9de981534be18c949c3e767eb61e', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'af2d89d248c4440ea5f83966337ebb8d', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('41eacfc49efb49639a63c0fc78c06123', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, 'c2649ae0bb9148f98c62f1a5b5f01652', '2017-05-18 20:01:41'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('422adb556bea45edb77a5c863fe0e303', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'c024f0a1db424695811a33c00f5436ee', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('43179905a5f448dbabfd9469b2e6104e', 'b531432b98d84385a275794fe268b5de', 0, 0, 'b497ab9b01c74a93b6ee7f079a356070', '2018-01-09 02:37:25'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('43bfd08058a145668a18e8514df41b89', '0dfa95945ed54b0a8b5fc18c441e1115', 2, 0, '94fe339e071e4979a89fa29265507eed', '2017-05-22 03:08:06'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('4659b488c4774f778d520bf394982e1a', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '5f632069a0164b479e53f093ee83c0d6', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('467d9d268b644fc898481c45155d0c2b', 'e557e871655a487a8156d13d7464d139', 0, 0, '6f9333baa5db42d4911644a30833c0f6', '2017-05-22 17:12:17'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('48a1cf35fdc94c96a9ff5a1c7d48e8c9', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'f475e0eef09c4c1ba2c2b06f503ca4c2', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('492f9da021de483b8e1dfedb20d8b649', '9c48c437c9bd4c029338863c75d98324', 0, 0, '097879d75fc54dc285aff704d8734a21', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('4a75313dd9f944a381d259bc9a436bd0', '9c48c437c9bd4c029338863c75d98324', 0, 0, '76da5a1769f6438cbd7580a4632de45e', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('4c8acee16515475abe47dd5e8be3f2a5', '9c48c437c9bd4c029338863c75d98324', 0, 0, '9e8760cffee345d9ad44c9f4c65becc4', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('4d8c9455e94f4042a2663fae4aaea2e8', '9c48c437c9bd4c029338863c75d98324', 0, 0, '0dbcd8427607493281ff3e4a6ae68cf2', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('4f97029602da48e1b2c57571d408756e', '9c48c437c9bd4c029338863c75d98324', 0, 0, '8fe110723d5b48bfb7ae79bc98e4317d', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('4fcf98465a9940758d84c0f85b00ece9', '9c48c437c9bd4c029338863c75d98324', 0, 0, '4d4183bb9d3a42e5870fbc58c1022e75', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('514987ef25af43ca9fe8dd6d9df932a3', '9c48c437c9bd4c029338863c75d98324', 0, 0, '6e3931a0a8794f30bae7e63b86259643', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('51dc2b35efb944dba31328fb02fae0d5', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'c90b3e7907094c3cb399f6270c5d3e2d', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('5323ea68f5e1475c81e608c7a8b5a9d0', '9c48c437c9bd4c029338863c75d98324', 0, 0, '8778b7b776c242f98b6ad46087adb2e4', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('550d481245e246dfbcf7d9c5a0c88fc4', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '3d30a7e3e08b4ca59a4783197b809a79', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('55a849407ea7438da182646a939a3b42', '9c48c437c9bd4c029338863c75d98324', 0, 0, '07c1963549914dac88e8ba6092ba3393', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('565c870ae56d420eaa586abdf575865d', 'b531432b98d84385a275794fe268b5de', 0, 0, '6e40a2254a86454ba9a69a4a4b1d44d6', '2018-01-09 14:29:49'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('56abd7b064644265a30a525a63310705', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, 'fb90ee122f6c47269d77942b56a4783c', '2017-05-18 20:01:41'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('574776be21924a95b7770002c37f78e6', '4dad7ff7b8a34bdc81d67b859d2981d2', 2, 0, '96cc863bca2c436a85cd52db7c1df9d7', '2017-05-19 10:53:23'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('58367ae2523648c6b1f41dbfd315b84b', 'f51164faec604310aa1aacec90248688', 0, 0, 'ffcd6c7df3444a8f8b9eb2c6b8d80ca4', '2017-05-22 11:23:56'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('585e9908211d49eb9d485ec26c588e1c', '9c48c437c9bd4c029338863c75d98324', 0, 0, '94fe339e071e4979a89fa29265507eed', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('5a4b2b3a59e0432aa8ad53b4800c6c93', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e2b1245a95c041b4b650e215c1943bbe', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('5b35d67ffadc46f88b088c2eae9b3267', '9c48c437c9bd4c029338863c75d98324', 0, 0, '988c90d28f124c029544716f0f6f0c8f', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('5b63d89bf5754b6492e003d341096419', '62862e14149841a6b0d32ed1f176974d', 2, 0, '0980b8836368476297e98155c859f632', '2017-05-22 11:36:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('5daf2ba7c4fe4e7ca5778ec796a5ea04', '9c48c437c9bd4c029338863c75d98324', 0, 0, '2798eeaa5ed445749f80f71ef202cffa', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('5ee09c9462e543c09895e21cdd4db339', 'f51164faec604310aa1aacec90248688', 2, 0, '521d08563ab74b8188599be180575bcb', '2017-05-22 11:33:21'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('5ef43b75835549df9941f0229348e19a', 'cb919038dbaf418bb04c66f5ccf83071', 0, 0, '5e0b157de9ae4c2495f3918e7625431a', '2017-05-19 09:15:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('629b6b27c79a4c58aad878d8f050a652', '9c48c437c9bd4c029338863c75d98324', 0, 0, '82a04b4689d84862be5c4b600b099fc1', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('65693ce2aa6f4ba88269c4ab9570202a', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'd69c39dc65b24904838f2e9f604f2feb', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('68613d44a0cd41ee9cfcd18be74608f7', '9c48c437c9bd4c029338863c75d98324', 0, 0, '22c61d3c9fd04fa18803c8ce98bb0cd9', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('6bea5942115b4520bd15367dc7d695a4', '9c48c437c9bd4c029338863c75d98324', 0, 0, '8b78be4bc56d46fba2ff5150e739b4b9', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('6c6588d368cd40c5b0a07224b248b925', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, '7dcd4e266b8147ee8bf0195fcec6f6be', '2018-01-17 15:47:17'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('6c9b58e0c8344c278bf2a90c3811ed68', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'd9074901d5934613ae09ebb1835f3b1e', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('6cc177e6a1c2484495367db10d7715ba', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'c366b72c968b46f8b7d4592ff4535fbb', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('6cea141702a845dc94573cee3110ea8a', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '109e2fea45ed4d4e8d377dafddb43fcd', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('6fff083de3d54103b055515069cecc8e', '9c48c437c9bd4c029338863c75d98324', 0, 0, '8c491f940f844e6f8bf23fb874177cb5', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('70de39e93e924334b946480f254d6a86', '76a96bccedfb4d7eae804736c0b69ac3', 0, 1, '2798eeaa5ed445749f80f71ef202cffa', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('7210512fa4444209adaad4393852f35b', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'd4049848d5474e5cadc6398a5ac1887b', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('72a3b402a7cc4f6f9cbc03e1eca3c395', '9c48c437c9bd4c029338863c75d98324', 0, 0, '1cacf210910640a58c2f3fe190122711', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('73f2adff00a54e3b9c82a6235076e08d', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e9688858640e4868b4dfdab1d3d30ec3', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('73fc380bdf584400bc726348fe0acc4a', '9c48c437c9bd4c029338863c75d98324', 0, 0, '9e7c4e8d04d54d63b4db362be239babd', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('749c49748aa74ceba672aeebc4a7c485', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '83bedd208c9a46eda1ce4e47705b3b73', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('75ccaee721704e1b85db4e9950bd81d9', '9c48c437c9bd4c029338863c75d98324', 0, 0, '378892771606469ebe86c370b3c4f8eb', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('75f92efffeb3440db737150e369ef669', '9c48c437c9bd4c029338863c75d98324', 0, 0, '1cb2fb93db774202bdd2532fa57d9bff', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('776923176f3f42adb4cab217d1c4735e', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'db7e500f67dc4ac2adb356974ef92309', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('78f32329969c4dc7b24e419126dfc049', '9c48c437c9bd4c029338863c75d98324', 0, 0, '6d74ae8842b74e239efd63bb95f053e3', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('790da56db1544514bc914506afe4eac6', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'be5eed01ec694ac1b72539887bec1235', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('79a7c7d01a77487c8afac0d41ccea03e', '9c48c437c9bd4c029338863c75d98324', 1, 0, '1df48ce2f70e46a19eccb6b88b64a4bb', '2017-05-22 10:38:05'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('7da45801a30141949139aa76d6b0ec02', '9c48c437c9bd4c029338863c75d98324', 0, 0, '32a36e78b5fd44649ae1b9b4a3b174e3', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('7dc527ebb89946fd880638fc0c0c529c', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'f776853f84844e2f8d35039c43886d61', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('7def69364ad64a17b071afefb0c511cb', '9c48c437c9bd4c029338863c75d98324', 0, 0, '3930ab98da0a4e82aab1824823135576', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('7edd0a50f89d400494df8d633e61ead6', '9c48c437c9bd4c029338863c75d98324', 0, 0, '948dab550b93428096610e31eace1478', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('7eed535ce65e440587383d2e6777527a', '9c48c437c9bd4c029338863c75d98324', 0, 0, '480eabb80700486185121285d855541d', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('802912809b934bcc8c8064b0173c8c88', 'e557e871655a487a8156d13d7464d139', 0, 0, 'f776853f84844e2f8d35039c43886d61', '2017-05-22 17:12:17'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('80a3c046a7d64807bb4353a8f8faeaf3', 'c79d55a5ffb349f894146536ffb44711', 2, 0, 'c2649ae0bb9148f98c62f1a5b5f01652', '2017-05-22 03:07:12'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('80bc2d18f46c4e1b8a05613662133bd9', '9c48c437c9bd4c029338863c75d98324', 0, 0, '5676921ac94b4633a614892676567bfb', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('824f3ee67a5748c4817d76e5aa821871', 'b531432b98d84385a275794fe268b5de', 0, 0, 'd69c39dc65b24904838f2e9f604f2feb', '2018-01-09 14:29:49'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('83e122a1602e4ac28ef50a296fc23f76', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '18a377035a944468a62b11caf31f9d72', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('8424c5f477ea4e7b8966646ce24b8ceb', 'cb919038dbaf418bb04c66f5ccf83071', 0, 0, '44e74bb07b4b4fceb9ba9ed135ea5e7d', '2017-05-19 09:15:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('84e516e21dbc4ae88851002db94a9773', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'eba152f716114424a37e5c8e11d8d995', '2018-01-09 14:10:24'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('8646a1ee1bf6426291c8a2cdc24a3ca3', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '5619c0acad764d84989e69bc5c57b461', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('867e505cce0d4a2eb104c2be65d9210c', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'd69c39dc65b24904838f2e9f604f2feb', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('873290983d4c45af9b1a385b32bf055f', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'c73c51eea7a846249c111f1da4663707', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('88c9eb0fb4db41c3a0fb2794533274bd', '9c48c437c9bd4c029338863c75d98324', 0, 0, '1db1801a29f344b780f018cbffc9b3f1', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('8980c5c0a3134d7e84146983d04f57ad', 'cb919038dbaf418bb04c66f5ccf83071', 0, 0, '521d08563ab74b8188599be180575bcb', '2017-05-19 09:15:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('89f835c115374b41972630879c1644cc', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'd1732f1b2c7744d8ad71702649d6713b', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('8b3e8fe0f36f475cb00403448bf13e02', 'c79d55a5ffb349f894146536ffb44711', 0, 0, '53fc929cf08947c393d6a132b71c8c59', '2017-05-22 15:04:57'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('8bb283c656f243dc977c7a696211092b', '9c48c437c9bd4c029338863c75d98324', 0, 0, '6f9333baa5db42d4911644a30833c0f6', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('8e5fafec0a4b4ca5b0720c5cada10aeb', 'e557e871655a487a8156d13d7464d139', 0, 0, '82bb85dfa7dc4330893ac38fda2ae74d', '2017-05-22 17:12:17'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('8fbd19936e234765b9f4f04c53eb865d', '9c48c437c9bd4c029338863c75d98324', 0, 0, '25f0fd10490349b9941f8325c1fc8488', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('92ed291eb268484ab3e5d8af833040bc', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e1644e16aaa943f7b0c18174613bc08c', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('946200d577604da2a993d09e11832f57', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'c219eb3b489e49a5af65dbc7f42754c8', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('97ee1ea1b70e4d059c893e835467123c', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e37515101bd340f2a5920840f1acfd0e', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('993ce458e3314593b1dc72b9f2523f87', '9c48c437c9bd4c029338863c75d98324', 0, 0, '53fc929cf08947c393d6a132b71c8c59', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('997e4ea8d8be4d9687972c7229d9b2ae', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'd9074901d5934613ae09ebb1835f3b1e', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('99c9d2ec34ea437ca3f24997849988df', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'd6f4cda74d444a1184de8a4b28dc19ff', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('9a57f11153804c15b1ebe98932573de3', '9c48c437c9bd4c029338863c75d98324', 0, 0, '561fa58b43ec443f8420e9637e4d38c0', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('9ad576ad97c34e378b2e42034dbfe85f', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, '9158ec943e6d49bb9c0df8b6c3666a28', '2017-05-18 20:01:41'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('9b26700917384a3691e688531d8252eb', '9c48c437c9bd4c029338863c75d98324', 0, 0, '298ff55340ff47b188c9766f75eb159b', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('9b31e00f53014c9ba97c72fd0034b754', '9c48c437c9bd4c029338863c75d98324', 0, 0, '295c09c5e4074f0e9ebd2dc5cc463667', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('9b53659550a04bb7920691162c5333b8', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, 'eba152f716114424a37e5c8e11d8d995', '2018-01-09 14:10:07'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('9bc3e6c808b04f949db851f18fda1972', 'b531432b98d84385a275794fe268b5de', 0, 0, '1d8094115f5c4c6ab8c38c414a65d6f4', '2018-01-09 14:29:49'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('9fe7db4f71d045bfa0eef1782515f7c8', '1748ca8580f34681a21b7e4bfda0b4ba', 2, 1, 'a6fefe02f64446cb855941af41aa67a9', '2017-05-19 11:04:03'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a095c2f427524ea8bf17048e36cfeb0e', '9c48c437c9bd4c029338863c75d98324', 0, 0, '0980b8836368476297e98155c859f632', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a0cd57ac8c074a8aa05a99f5293b2a2f', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '340fe94b0464472e88cc0fe7065170dc', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a2c89256ac744214b3f2e79e8cba352c', '9c48c437c9bd4c029338863c75d98324', 0, 0, '77f0e9ced74e438783a96cbdab22c1ec', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a36274c646d643afabea4cd56516d9fa', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'e1644e16aaa943f7b0c18174613bc08c', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a4cd73c5baad48acb22dce658c3c8690', '9c48c437c9bd4c029338863c75d98324', 0, 0, '96cc863bca2c436a85cd52db7c1df9d7', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a576722b667b44558ab2bf21d3d78e10', '9c48c437c9bd4c029338863c75d98324', 0, 0, '5e0b157de9ae4c2495f3918e7625431a', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a7f3e392f0fb4a94970288b6310b4b67', '4dad7ff7b8a34bdc81d67b859d2981d2', 0, 0, 'd9074901d5934613ae09ebb1835f3b1e', '2017-05-19 10:53:23'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a9613929bf2243b79f66bda5e247de35', 'cb919038dbaf418bb04c66f5ccf83071', 0, 0, '61f00a225f644f37bf83c0673ea81845', '2017-05-19 09:15:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('a9a586a58dff41469bff6559e1eb3d2c', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '9158ec943e6d49bb9c0df8b6c3666a28', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ab5864ef4c4f4a639e320e87597c22c1', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '66486ff6f3db4d38a07f17717f23f12c', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ac8904a9f1a3464fa666d5335d638952', '9c48c437c9bd4c029338863c75d98324', 0, 0, '869474428b3e4408a1351e16978a37f8', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('aca68a9d10a7400788cd40cc714203f7', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, '32a36e78b5fd44649ae1b9b4a3b174e3', '2017-05-18 20:01:41'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('b98eb722af834116aedb7c03a2478ea7', 'b531432b98d84385a275794fe268b5de', 0, 0, '18a377035a944468a62b11caf31f9d72', '2018-01-09 14:29:49'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ba2248ddaa1d4889b879a67e0f17bf01', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'd829117c300c4882888ce059fef71373', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('bac7ed882f0c4d60ba6e3bbf7d56eb5a', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'c5bb8e6cdd44483bbda150ee48767c10', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('bc192a2421894e93a14115f06955dc18', 'e557e871655a487a8156d13d7464d139', 1, 0, 'c219eb3b489e49a5af65dbc7f42754c8', '2017-05-22 17:12:17'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('bc2d419949034c31bc352145837dcf71', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'a6fefe02f64446cb855941af41aa67a9', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('bd3f6ab9ef8e48c5b07be96e07e08a8e', '4dad7ff7b8a34bdc81d67b859d2981d2', 0, 0, '83bedd208c9a46eda1ce4e47705b3b73', '2017-05-19 10:53:23'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('bde6ff43c3e74d9a869a486874b531dc', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'a34e39f40e2044aeb66f0330f5ed75ea', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('bdeef4e6851847aaab5ed8096ecb3fa1', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'fb90ee122f6c47269d77942b56a4783c', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('be5486ee664949f383922b6493fb8b6b', '9c48c437c9bd4c029338863c75d98324', 0, 0, '7cd8b8f56966432b9541285bfc797555', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('bfb02802c7ca4ec485086eca575e4111', 'b531432b98d84385a275794fe268b5de', 2, 0, 'e1644e16aaa943f7b0c18174613bc08c', '2018-01-09 14:29:49'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c0d7a8ba9ce84882851dfa93fbdf17cd', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '5e0b157de9ae4c2495f3918e7625431a', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c212687c6a2848c98832e0ea323420ce', '9c48c437c9bd4c029338863c75d98324', 0, 0, '8293a6507d974027bcd8a54a5b90abb5', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c22a11247df24f549409f90af8a34f6b', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'b304903b0f0a451bb44685a898508369', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c22e2207444041de9b3a9f0f86982bba', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e557263fefef4350ae585e6738402cb7', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c23be65968db4613becc587b6895993f', 'e557e871655a487a8156d13d7464d139', 1, 0, '606844d489f841939e330acdb5b2601e', '2017-05-22 17:12:17'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c37151972860437ea254aca8f3fa86ab', '9c48c437c9bd4c029338863c75d98324', 0, 0, '3260d140b17744e5b4ecb80ac658d300', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c39e9a30a15f4165be9e52dfabc656e0', '76a96bccedfb4d7eae804736c0b69ac3', 1, 0, '1df48ce2f70e46a19eccb6b88b64a4bb', '2017-05-19 10:16:24'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c79beb58c3ea4c3388d6c0211c6211b0', '9c48c437c9bd4c029338863c75d98324', 0, 0, '109e2fea45ed4d4e8d377dafddb43fcd', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('c9371fb0e93f47d4a0340dacf7ff8b46', '9c48c437c9bd4c029338863c75d98324', 0, 0, '986d2627c90742f8aa78d8815cd5cab9', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ca153578d4cf4a508b3b8df62da4833c', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '7cd8b8f56966432b9541285bfc797555', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cb919038dbaf418bb04c66f5ccf83071', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, '09f0e91f6a61479889570ef76bfdac96', '2018-01-17 15:23:22'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cbb2fb8d56574ae9a21ec53024fa9554', '4dad7ff7b8a34bdc81d67b859d2981d2', 0, 0, '109e2fea45ed4d4e8d377dafddb43fcd', '2017-05-19 10:53:23'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cbd0253f09a24ecc94ac70d53c24950a', '9c48c437c9bd4c029338863c75d98324', 0, 0, '18a377035a944468a62b11caf31f9d72', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cbe2832c7bde4560bc8b595aca0f930c', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e0899eb126d2488b92bb59e80e897aec', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cbe8fcc3b227412eb74d997d06e700b4', 'b531432b98d84385a275794fe268b5de', 0, 0, '1aa9313e83bc42de93663528627243d3', '2018-01-09 14:29:49'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cc38390659fb4d71868439ee90f6a7bb', '9c48c437c9bd4c029338863c75d98324', 0, 0, '44e74bb07b4b4fceb9ba9ed135ea5e7d', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cd04201f1b84444b8efa5266ebf3be40', '9c48c437c9bd4c029338863c75d98324', 0, 0, '037dfda4d5984a71b23bde0359dac140', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cd1fb8c510ef4f39aef92b1e2ba39d62', '2a11a0e470a64b3d93527616ab3cd17d', 2, 0, '1df48ce2f70e46a19eccb6b88b64a4bb', '2017-05-18 07:34:38'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ce8863c9234f4e9b856b2aa3d9de5c7f', '9c48c437c9bd4c029338863c75d98324', 0, 0, '169e0e9038cd4d3d8c0bb7bb1a890dd3', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cededad199ba41d9b9f44528a98578ed', '9c48c437c9bd4c029338863c75d98324', 0, 0, '5619c0acad764d84989e69bc5c57b461', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('cfd06744baa649a5a029c06a7d45c949', 'fb233c1f1f4840239d6f82af2edc01f4', 2, 0, 'e1644e16aaa943f7b0c18174613bc08c', '2017-05-19 10:36:45'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d0a7bfeb9faa4c89a502984da3e1af7d', '9c48c437c9bd4c029338863c75d98324', 0, 0, '5b0037df0e3b4bfaa89c36d74e5c7a81', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d0d1f9ae58cf4b03aa3f3ba9d8b5f3ab', '9c48c437c9bd4c029338863c75d98324', 0, 0, '2e25ac5da040436088cafb6f29cd8e8f', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d13942d238854f47827ef3641e0823a5', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'c918b6b3166141a6b95b457d12097001', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d1499f96fd2b4db89f55051ef54086b0', '9c48c437c9bd4c029338863c75d98324', 0, 0, '5cbf662ecc09469e9060f2f20eb9309b', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d2f1af228ff946a1b5b31be1fd715990', '9c48c437c9bd4c029338863c75d98324', 0, 0, '7b2f37d2eac24ee990972baefd7dda4f', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d34af7af089a43499f39b0eddef775fe', '1748ca8580f34681a21b7e4bfda0b4ba', 1, 0, '83bedd208c9a46eda1ce4e47705b3b73', '2017-05-19 10:55:47'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d433231198194f03ba8a96ad208bf3dc', 'b531432b98d84385a275794fe268b5de', 0, 0, '5f632069a0164b479e53f093ee83c0d6', '2018-01-09 14:29:49'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d4c926c46e444be6876b2c61ce3f0141', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'fb90ee122f6c47269d77942b56a4783c', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d6a12b1943634ca882202e9b3c5895a1', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'c2649ae0bb9148f98c62f1a5b5f01652', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d703b953e2ef495bb5771241aa8963aa', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e6d0e46cea0847f79a9e3328bd4b1504', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d7569bf235aa493b8c5203b11323e9d6', '4dad7ff7b8a34bdc81d67b859d2981d2', 1, 0, '7cef8587cddc4f03a1e7176e0a8ee340', '2017-05-19 10:54:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d76c68f3fe054222ae2ba4cde03aef74', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '3930ab98da0a4e82aab1824823135576', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d7b73cf855234e089b880b5e52b65c07', '9c48c437c9bd4c029338863c75d98324', 0, 0, '539a551045944c28a9945d0f6cc550c2', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('d8bfaf0a9fb74af7aa579f209f762aeb', '9c48c437c9bd4c029338863c75d98324', 0, 0, '19adff3370f84af196cc73474e2a6d0c', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('da8c66d0aca1432f89d4f1c412d4fd92', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'df4b354ad6a143f0a1c86ad0f5cf8e51', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('daae57675ff048b2b333dc45c8aed74f', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '1aa9313e83bc42de93663528627243d3', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('dc7de60f51a846419ffb9920923838d3', 'f51164faec604310aa1aacec90248688', 0, 0, '5eaafabf2d4a4856999f9e684d327ead', '2017-05-22 11:23:56'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('dd0477d496b04d96907e29a14d1769b0', 'c79d55a5ffb349f894146536ffb44711', 0, 0, 'f776853f84844e2f8d35039c43886d61', '2017-05-22 15:04:57'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('dd3ca6eda16f48ca9bb198f1012c5dd3', '9c48c437c9bd4c029338863c75d98324', 0, 0, '52fd81d5f3c641b9b3e3c058efee0357', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ddb9fd6e57d042389eef73a0b5254d3b', '9c48c437c9bd4c029338863c75d98324', 0, 0, '1384281140ca4b219bf98ee235f3aba1', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e0a3370f67db47d18329c213afd4b051', '9c48c437c9bd4c029338863c75d98324', 0, 0, '340fe94b0464472e88cc0fe7065170dc', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e191e31fb06e4b1cb66e813ebc455849', '9c48c437c9bd4c029338863c75d98324', 0, 0, '521d08563ab74b8188599be180575bcb', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e1a69adec0ba4d408a05bf63fa511d1e', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '1d8094115f5c4c6ab8c38c414a65d6f4', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e2d565fdb236454da1f25a89e85b6aec', '9c48c437c9bd4c029338863c75d98324', 0, 0, '541163ddcaec4751b6d6e86207cc48c1', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e36c83f3be7f4275994f74a3cda10b3c', '9c48c437c9bd4c029338863c75d98324', 0, 0, '3a089a897e294c67829ca12ef72a4d03', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e3f5a1934f4e4e319a8e6b40279a1cc3', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '25f0fd10490349b9941f8325c1fc8488', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e41f85a8166c48e9833b9e9b4e58fcf7', '9c48c437c9bd4c029338863c75d98324', 0, 0, '3d30a7e3e08b4ca59a4783197b809a79', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e586a739247147b69d04cff5ceb0a891', '9c48c437c9bd4c029338863c75d98324', 0, 0, '9158ec943e6d49bb9c0df8b6c3666a28', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e6663e3eb2394e7c9534eaa585f29e28', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '96cc863bca2c436a85cd52db7c1df9d7', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e67f8be2eb9f4e199285d27ff8cd87ec', 'b531432b98d84385a275794fe268b5de', 0, 0, '25f0fd10490349b9941f8325c1fc8488', '2018-01-09 14:29:49'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e8998377b7ed40a99a2bfa9f1d58108b', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'a6ecc3eaa7524007b2880fc5c74ef2d4', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e8feb5df8ce4496893ecec60114bff18', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'ffcd6c7df3444a8f8b9eb2c6b8d80ca4', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e94ccc15b80c4b308b29b23b01bf1bad', '8f2354f77fff4063a75113e993a7bc97', 0, 0, 'c2649ae0bb9148f98c62f1a5b5f01652', '2017-05-19 10:03:48'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('e9d0914cf7be454c83083472dbdbf078', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '521d08563ab74b8188599be180575bcb', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('eb365ed161d046bba462d7ae652bd89d', '9c48c437c9bd4c029338863c75d98324', 0, 0, '7cef8587cddc4f03a1e7176e0a8ee340', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ec60d289da1c4e75a09e36afc5606bad', '9c48c437c9bd4c029338863c75d98324', 0, 0, '720cb5a0c9b04aad85ecce4731055bee', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('eca0c47bb10f46c7bb995d6ff690d7bc', '9c48c437c9bd4c029338863c75d98324', 0, 0, '5f822f0ca21a4b43bcd4a04dc9faa902', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ed02ec727e1d4c1eb84fbb58e5ddc4ee', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, '66486ff6f3db4d38a07f17717f23f12c', '2017-05-18 20:01:41'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ed8d90260032478fa25f9ae123c1d3e0', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '5676921ac94b4633a614892676567bfb', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('ef6a93b2f2264e7081a66fee0053b0da', '2a11a0e470a64b3d93527616ab3cd17d', 1, 0, '5619c0acad764d84989e69bc5c57b461', '2017-05-18 19:34:39'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('efe739f94b784dd0a21b7a20f7a57d2d', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '44e74bb07b4b4fceb9ba9ed135ea5e7d', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('f047241c0b844fae937eca1a74060df0', '9c48c437c9bd4c029338863c75d98324', 0, 0, '5eaafabf2d4a4856999f9e684d327ead', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('f08b34486b1f4539ab31001133d99bbf', '9c48c437c9bd4c029338863c75d98324', 0, 0, '9c4ec5025ba140808e9fe44f3cc848ff', '2017-05-22 10:37:26'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('f0b45febc65d4fbdbc5cb428d9c42ecf', '8f2354f77fff4063a75113e993a7bc97', 2, 0, '2798eeaa5ed445749f80f71ef202cffa', '2017-05-19 10:05:03'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('f4a880d78da54d0dab4acbcc93e2af88', '9c48c437c9bd4c029338863c75d98324', 0, 0, '4b0adf9a1ca244b985b51b732e8b58a6', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('f4aa6337a89d4a4ca3efee88acd321d4', '76a96bccedfb4d7eae804736c0b69ac3', 0, 1, '1cb2fb93db774202bdd2532fa57d9bff', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('f5be4f8222f34aecb7513ae083e024bf', '9c48c437c9bd4c029338863c75d98324', 0, 0, '79c16ac130bb410eb98d521ed14c2a2f', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('f6caa03641614f85ae13668b1fc921e4', '9c48c437c9bd4c029338863c75d98324', 0, 0, 'e8bf416fc9804a6abb39cbfe6c1698f7', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('f70d9f8f87db407394f28dbd8a790cf1', '2a11a0e470a64b3d93527616ab3cd17d', 0, 0, '2798eeaa5ed445749f80f71ef202cffa', '2017-05-18 20:01:41'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('fae87962c20f448d9395a31c55fde4ba', '9c48c437c9bd4c029338863c75d98324', 0, 0, '664afc7c3f924e669ae697a932594531', '2017-05-22 10:37:28'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('fb8b732a098e4725ab928d64228194b6', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, 'a6fefe02f64446cb855941af41aa67a9', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('fd5a0bd4190c4d12a9eab622abcea5c9', '9c48c437c9bd4c029338863c75d98324', 0, 0, '83bedd208c9a46eda1ce4e47705b3b73', '2017-05-22 10:37:29'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('fdade113e1384c74b24cd39a09eb7471', '76a96bccedfb4d7eae804736c0b69ac3', 0, 0, '7cef8587cddc4f03a1e7176e0a8ee340', '2017-05-19 10:15:16'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('fe72a313975a4aed98f6ef1ca4dcb180', '9c48c437c9bd4c029338863c75d98324', 0, 0, '94ec3b277d104816933ac089423b5bbf', '2017-05-22 10:37:27'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('fec5bd1ed45c4616a0ce21ecaae0f529', 'cb919038dbaf418bb04c66f5ccf83071', 0, 0, '340fe94b0464472e88cc0fe7065170dc', '2017-05-19 09:15:15'); +INSERT INTO `jcdp_chat_groupmembers` VALUES ('fff93a49bf5d474580cbb02c958ffb04', 'cb919038dbaf418bb04c66f5ccf83071', 0, 0, 'c90b3e7907094c3cb399f6270c5d3e2d', '2017-05-19 09:15:15'); + +-- ---------------------------- +-- Table structure for jcdp_chat_groups +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_chat_groups`; +CREATE TABLE `jcdp_chat_groups` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '唯一标识', + `GROUPNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '群组名称', + `INTRODUCTION` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '介绍', + `NOTICE` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '群公告', + `CREATORID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人ID', + `OWNERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '拥有者ID', + `CREATETIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `JOINSETTING` decimal(1, 0) NULL DEFAULT NULL, + `CREATORNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建者名称', + `OWNERNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '拥有者名称', + `GROUPIMG` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '群组头像' +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_chat_groups +-- ---------------------------- +INSERT INTO `jcdp_chat_groups` VALUES ('fb233c1f1f4840239d6f82af2edc01f4', '软件室二组', NULL, NULL, 'e1644e16aaa943f7b0c18174613bc08c', 'e1644e16aaa943f7b0c18174613bc08c', '2017-05-19 10:36:45', 1, '陈鹤(W06523)', '陈鹤(W06523)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('4dad7ff7b8a34bdc81d67b859d2981d2', '综合组', NULL, NULL, '7cef8587cddc4f03a1e7176e0a8ee340', '96cc863bca2c436a85cd52db7c1df9d7', '2017-05-19 10:54:15', 2, '李荣荣(W07646)', '王瑶(Y05185)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('1748ca8580f34681a21b7e4bfda0b4ba', '嗨起来', '7777777', '77777777\n要有意义有意义', 'a6fefe02f64446cb855941af41aa67a9', 'a6fefe02f64446cb855941af41aa67a9', '2017-05-19 10:57:42', 0, '韩燕(P16107)', '韩燕(P16107)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('f51164faec604310aa1aacec90248688', '春天来了,运动-锻炼-减肥', NULL, '中午吃啥?这么弄', '521d08563ab74b8188599be180575bcb', '521d08563ab74b8188599be180575bcb', '2017-05-22 11:33:21', 1, '马成(W07675)', '马成(W07675)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('62862e14149841a6b0d32ed1f176974d', '工作学习群', NULL, NULL, '0980b8836368476297e98155c859f632', '0980b8836368476297e98155c859f632', '2017-05-22 11:36:15', 1, '孙颉(Y12001)', '孙颉(Y12001)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('9c48c437c9bd4c029338863c75d98324', '集成电路部', 'ERC内部交流群', '软件偶尔出现接收到一个人多条重复信息时,需要重新登录。后续修复。', '1df48ce2f70e46a19eccb6b88b64a4bb', 'e07451595e8740ff9e8928006a382895', '2017-05-22 10:38:05', 1, '靳晓松(Y08066)', '李燕茹(Y09024)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('c79d55a5ffb349f894146536ffb44711', '吃喝玩乐', NULL, NULL, 'c2649ae0bb9148f98c62f1a5b5f01652', 'c2649ae0bb9148f98c62f1a5b5f01652', '2017-05-22 03:07:12', 1, '刘聪(W07427)', '刘聪(W07427)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('0dfa95945ed54b0a8b5fc18c441e1115', '总体室测试组', NULL, NULL, '94fe339e071e4979a89fa29265507eed', '94fe339e071e4979a89fa29265507eed', '2017-05-22 03:08:06', 1, '戴强(W06405)', '戴强(W06405)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('e557e871655a487a8156d13d7464d139', '逻辑二组', NULL, NULL, '664afc7c3f924e669ae697a932594531', '664afc7c3f924e669ae697a932594531', '2017-05-22 05:12:00', 1, '魏璇(W07492)', '魏璇(W07492)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('a594c655ed8648a794efc56f2e4c8331', '游泳', NULL, NULL, '606844d489f841939e330acdb5b2601e', '606844d489f841939e330acdb5b2601e', '2017-05-22 05:11:16', 1, '尚云骅(W07676)', '尚云骅(W07676)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('2a11a0e470a64b3d93527616ab3cd17d', 'JAVA技术组', 'JAVA组内交流群', NULL, '1df48ce2f70e46a19eccb6b88b64a4bb', '1df48ce2f70e46a19eccb6b88b64a4bb', '2017-05-18 07:34:38', 1, '靳晓松(Y08066)', '靳晓松(Y08066)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('cb919038dbaf418bb04c66f5ccf83071', '制造信息化组', '制造信息化组', '这是一个并没有神马用的群', '5676921ac94b4633a614892676567bfb', '5676921ac94b4633a614892676567bfb', '2017-05-19 09:06:54', 1, '赵简(P12189)', '赵简(P12189)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('8f2354f77fff4063a75113e993a7bc97', '智慧特区小分队', NULL, NULL, '2798eeaa5ed445749f80f71ef202cffa', '2798eeaa5ed445749f80f71ef202cffa', '2017-05-19 10:05:03', 0, '宁志全(Y11037)', '宁志全(Y11037)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('76a96bccedfb4d7eae804736c0b69ac3', '软件室', '软件室交流群', '欢迎大家加入软件室交流群。', '1df48ce2f70e46a19eccb6b88b64a4bb', 'b304903b0f0a451bb44685a898508369', '2017-05-19 10:16:24', 1, '靳晓松(Y08066)', '牛立栋(Y06216)', NULL); +INSERT INTO `jcdp_chat_groups` VALUES ('b531432b98d84385a275794fe268b5de', '管理信息化组', '', NULL, 'b497ab9b01c74a93b6ee7f079a356070', 'e1644e16aaa943f7b0c18174613bc08c', '2018-01-09 02:37:25', 1, '辛长平(Y10027)', '陈鹤', ''); + +-- ---------------------------- +-- Table structure for jcdp_chat_userstatus +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_chat_userstatus`; +CREATE TABLE `jcdp_chat_userstatus` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户ID', + `USERSTATUS` decimal(1, 0) NULL DEFAULT NULL COMMENT '用户状态', + `USERCODE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户代码', + `LASTLOGTIME` datetime(0) NULL DEFAULT NULL COMMENT '上次登录时间', + `LOGINCOUNT` decimal(20, 0) NULL DEFAULT NULL COMMENT '登录次数', + `LASTUSERSTATUS` decimal(1, 0) NULL DEFAULT NULL COMMENT '上次在线状态', + `HEARTBEAT` datetime(0) NULL DEFAULT NULL COMMENT '上次心跳时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_chat_userstatus +-- ---------------------------- +INSERT INTO `jcdp_chat_userstatus` VALUES ('046582a5d50d41b782b1a205f8e7ac79', 'c2649ae0bb9148f98c62f1a5b5f01652', 0, 'W07427', '2018-01-10 16:54:25', 6, NULL, '2018-01-10 18:35:09'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('0d59f1a4086e4ec28a0e907aadfd1060', '83bedd208c9a46eda1ce4e47705b3b73', 0, 'P16106', '2018-01-10 16:03:04', 9, NULL, '2018-01-10 17:29:34'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('1ad48a05a41e4d6484c6b86038f2d4c4', '5676921ac94b4633a614892676567bfb', 0, 'P12189', '2018-01-10 18:13:09', 6, NULL, '2018-01-10 18:19:12'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('250f73e25be04012a1aa8af0c9fced60', 'a6fefe02f64446cb855941af41aa67a9', 0, 'P16107', '2018-01-10 17:15:55', 6, NULL, '2018-01-10 17:24:35'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('3d230046d0234c62b268115a3cc3ffaf', 'd69c39dc65b24904838f2e9f604f2feb', 0, 'P12082', '2018-01-10 16:03:04', 12, NULL, '2018-01-10 16:26:24'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('548229100dfb4e2d82d498be44b63adc', '44e74bb07b4b4fceb9ba9ed135ea5e7d', 0, 'W06893', '2018-01-10 16:02:59', 7, NULL, '2018-01-10 17:35:14'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('59e463cdbea64ee0b03314cb87acbf6e', '1df48ce2f70e46a19eccb6b88b64a4bb', 0, 'Y08066', '2018-01-17 19:02:23', 306, NULL, '2018-01-17 18:55:44'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('601ca84ef5294b0480175e9f56897a42', '1cb2fb93db774202bdd2532fa57d9bff', 0, 'P13160', '2018-01-10 14:06:57', 4, NULL, '2018-01-10 15:43:40'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('61ce068dbedd4817a0e3cae5163b01df', '2798eeaa5ed445749f80f71ef202cffa', 0, 'Y11037', '2018-01-10 18:12:23', 4, NULL, '2018-01-10 18:35:03'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('659c1715f8ee4495b7a36bd2d6f9a5a0', '3930ab98da0a4e82aab1824823135576', 0, 'P12188', '2018-01-10 11:32:27', 5, NULL, '2018-01-10 14:56:34'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('671742c20ecf4047812558367f8cacbc', 'e9688858640e4868b4dfdab1d3d30ec3', 0, 'W02030', '2018-01-10 11:32:31', 3, NULL, '2018-01-10 12:07:11'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('6e23091b4ec54f3fb02032307276e641', '25f0fd10490349b9941f8325c1fc8488', 0, 'Y08204', '2018-01-10 16:15:27', 5, NULL, '2018-01-10 17:58:16'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('853e6070a4b04715b88cd28e1c977b40', '1d8094115f5c4c6ab8c38c414a65d6f4', 0, 'W07248', '2018-01-09 15:32:50', 5, NULL, '2018-01-09 17:23:38'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('9d2263c8220448f8ac045c25e68e043f', '521d08563ab74b8188599be180575bcb', 0, 'W07675', '2018-01-10 16:04:43', 5, NULL, '2018-01-10 18:35:09'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('a91f22dee4e1420baeca4c114b6f8eec', '6e40a2254a86454ba9a69a4a4b1d44d6', 0, 'W06458', '2018-01-10 16:03:02', 7, NULL, '2018-01-10 17:48:12'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('bd417d1ff95b4adfbdcbf10875ac8709', '5e0b157de9ae4c2495f3918e7625431a', 0, 'W07249', '2018-01-10 16:03:01', 6, NULL, '2018-01-10 17:53:25'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('bdbbce66d4d540209aa0610d88eb6839', 'd9074901d5934613ae09ebb1835f3b1e', 0, 'Y11014', '2018-01-10 16:57:29', 5, NULL, '2018-01-10 18:21:09'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('dfe6b0c0792344da97731abccedd288f', '7dcd4e266b8147ee8bf0195fcec6f6be', 0, 'W04028', '2018-01-17 15:38:17', 2, NULL, '2018-01-17 15:38:17'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('e02934645b4e49648c7d70a13e1533f3', '340fe94b0464472e88cc0fe7065170dc', 0, 'W06555', '2018-01-10 16:03:04', 5, NULL, '2018-01-10 17:23:14'); +INSERT INTO `jcdp_chat_userstatus` VALUES ('fd14990633e84af0a0f35dcd7ef12fe8', 'b497ab9b01c74a93b6ee7f079a356070', 0, 'Y10027', '2018-01-10 16:03:02', 6, NULL, '2018-01-10 17:53:07'); + +-- ---------------------------- +-- Table structure for jcdp_chat_version +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_chat_version`; +CREATE TABLE `jcdp_chat_version` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `VERSIONNUMBER` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '版本', + `FILEURL` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '文件路径', + `ISLASTVERSION` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否为最新版本', + `ISUPDATEPKG` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否为更新包', + `PKGTYPE` decimal(1, 0) NULL DEFAULT NULL COMMENT '包类型', + `NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称', + `REMARK` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注', + `PUBLISHDATE` datetime(0) NULL DEFAULT NULL COMMENT '发布时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_chat_version +-- ---------------------------- +INSERT INTO `jcdp_chat_version` VALUES ('1a9009322576432791aec7d5a3d9f7e1', '1.0.0.9', '1.0.0.9', 1, 1, 0, 'EIMP升级包', 'bug修复', '2017-05-21 10:15:31'); +INSERT INTO `jcdp_chat_version` VALUES ('466b5f7da94644cf9ba408a32533820f', '1.0.0.6', '1.0.0.6', 0, 1, 0, 'EIMP升级包', '1.同一电脑只运行一个实例运行;\n2.增加登录、注销等待提示;\r\n3.增加数据服务检测,如果session失效则自动登录。', '2017-05-04 09:35:25'); +INSERT INTO `jcdp_chat_version` VALUES ('6A380D609A7D2F037C4C123EAC16B971', '1.0.0.7', '1.0.0.7', 0, 1, 0, 'EIMP升级包', '1.修复登录时一直处于加载状态的问题;\r\n2.修复生成多个session问题;\r\n3.增加部门内部群发功能:在我的部门,可以复选组织或人员(点击单选,按住Ctrl+鼠标左键复选),进行临时群发。', '2017-05-06 11:07:45'); +INSERT INTO `jcdp_chat_version` VALUES ('79a4d6853a7f47b2a449d08fd8c4271a', '2.0.0.0', 'EIMP2.0.zip', 1, 0, 1, 'windows安装包', '

全新设计的UI

', '2018-01-09 11:27:05'); +INSERT INTO `jcdp_chat_version` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '1.0.0.8', '1.0.0.8', 0, 1, 0, 'EIMP升级包', '1.修复群发界面中用户状态未同步问题。\r\n2.增加网络侦测,网络中断后自动切换至离线状态。\r\n3.增加群组功能,其中群组搜索、主动加群功能暂未实现、群组中人员搜索功能未实现。\r\n4.代码大量重构,修复右下角提示信息不同步问题。', '2017-05-18 19:14:49'); +INSERT INTO `jcdp_chat_version` VALUES ('c90b3e7907094c3cb399f6270c5d3e2d', '1.0.0.5', '1.0.0.5', 0, 1, 0, 'EIMP升级包', '注:1.0.0.1版本需要重新下载安装!!!!\r\n1.修复系统设置无效问题;\r\n2.修复我的部门人员状态不同步问题;\r\n3.更新升级程序', '2017-04-25 10:29:29'); + +-- ---------------------------- +-- Table structure for jcdp_msg_content +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_msg_content`; +CREATE TABLE `jcdp_msg_content` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `MSGCONTENT` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '消息内容', + `SENDTIME` datetime(0) NULL DEFAULT NULL COMMENT '发送时间', + `SENDERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发送人ID', + `SENDERCODE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '发送人代码', + `MSGTITLE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息标题', + `MSGTYPE` int(1) NULL DEFAULT NULL COMMENT '消息类型', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_msg_content +-- ---------------------------- +INSERT INTO `jcdp_msg_content` VALUES ('2ba55257e6884d52b6a8220f2f782733', '测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3', '2017-07-20 10:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测测试标题3测试标题3测试标题3测试标题3试标题3', 0); +INSERT INTO `jcdp_msg_content` VALUES ('2d96e3863dc74b23878314d5eee59d9a', '测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3', '2017-07-20 12:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题4测试标题3测试标题3测试标题3测试标题3测试标题3', 0); +INSERT INTO `jcdp_msg_content` VALUES ('4eba8edbc79b41fd8c9b7ab7f0a1fbdd', '测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3', '2017-07-18 10:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题1测试标题3测试标题3测试标题3', 0); +INSERT INTO `jcdp_msg_content` VALUES ('664afc7c3f924e669ae697a932594531', '测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3', '2017-07-19 10:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题测试标题3测试标题3测试标题3', 0); +INSERT INTO `jcdp_msg_content` VALUES ('6a26f0722eaf42df86d7c27a62e7b02d', '测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3测试内容3', '2017-07-20 10:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题测试标题3测试标题3测试标题3', 0); +INSERT INTO `jcdp_msg_content` VALUES ('6c583d1f10a241ad90b0a11898a670ca', '测试内容4', '2017-07-20 12:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题4测试标题3测试标题3', 0); +INSERT INTO `jcdp_msg_content` VALUES ('6e3931a0a8794f30bae7e63b86259643', '测试内容2', '2017-07-19 10:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题2', 0); +INSERT INTO `jcdp_msg_content` VALUES ('6e40a2254a86454ba9a69a4a4b1d44d6', '测试内容3', '2017-07-20 10:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题3', 0); +INSERT INTO `jcdp_msg_content` VALUES ('6f9333baa5db42d4911644a30833c0f6', '测试内容4', '2017-07-20 12:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题4', 0); +INSERT INTO `jcdp_msg_content` VALUES ('76da5a1769f6438cbd7580a4632de45e', '测试内容2', '2016-07-19 10:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '测试标题2', 0); + +-- ---------------------------- +-- Table structure for jcdp_msg_receivers +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_msg_receivers`; +CREATE TABLE `jcdp_msg_receivers` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `RECEIVERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人ID', + `RECEIVERCODE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接收人Code', + `MSGSTATUS` int(1) NULL DEFAULT NULL COMMENT '消息状态', + `READTIME` datetime(0) NULL DEFAULT NULL COMMENT '读取时间', + `MSGID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '消息ID', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_msg_receivers +-- ---------------------------- +INSERT INTO `jcdp_msg_receivers` VALUES ('19adff3370f84af196cc73474e2a6d0c', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 1, '2017-08-04 09:04:15', '4eba8edbc79b41fd8c9b7ab7f0a1fbdd'); +INSERT INTO `jcdp_msg_receivers` VALUES ('2ba55257e6884d52b6a8220f2f782733', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 1, '2017-08-04 08:38:06', '2ba55257e6884d52b6a8220f2f782733'); +INSERT INTO `jcdp_msg_receivers` VALUES ('2d96e3863dc74b23878314d5eee59d9a', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 1, '2017-08-04 08:38:04', '2d96e3863dc74b23878314d5eee59d9a'); +INSERT INTO `jcdp_msg_receivers` VALUES ('664afc7c3f924e669ae697a932594531', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 1, '2017-08-09 16:51:19', '664afc7c3f924e669ae697a932594531'); +INSERT INTO `jcdp_msg_receivers` VALUES ('6a26f0722eaf42df86d7c27a62e7b02d', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 1, '2017-08-04 08:38:10', '6a26f0722eaf42df86d7c27a62e7b02d'); +INSERT INTO `jcdp_msg_receivers` VALUES ('6c583d1f10a241ad90b0a11898a670ca', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 1, '2017-08-07 08:39:09', '6c583d1f10a241ad90b0a11898a670ca'); +INSERT INTO `jcdp_msg_receivers` VALUES ('6e3931a0a8794f30bae7e63b86259643', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 0, '2017-08-02 14:53:45', '6e3931a0a8794f30bae7e63b86259643'); +INSERT INTO `jcdp_msg_receivers` VALUES ('6e40a2254a86454ba9a69a4a4b1d44d6', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 1, '2017-08-09 16:51:07', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_msg_receivers` VALUES ('6f9333baa5db42d4911644a30833c0f6', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 1, '2017-08-04 09:04:13', '6f9333baa5db42d4911644a30833c0f6'); +INSERT INTO `jcdp_msg_receivers` VALUES ('76da5a1769f6438cbd7580a4632de45e', 'fe24c4ac34444902a2129ec1debf9ed4', 'admin', 0, '2017-08-02 14:53:42', '76da5a1769f6438cbd7580a4632de45e'); + +-- ---------------------------- +-- Table structure for jcdp_sys_category +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_category`; +CREATE TABLE `jcdp_sys_category` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类名称', + `ICONNAME` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标', + `PID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `CODE` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类树编号', + `SEQ` int(3) NOT NULL COMMENT '分类序号', + `CATEGORYTYPE` int(1) NULL DEFAULT 0 COMMENT '类别', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '分类科目' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_category +-- ---------------------------- +INSERT INTO `jcdp_sys_category` VALUES ('07daaf9bba7f49fd8d9e16727e4e5222', '业务参数', 'small_business.png', 'e0c42af9cd5f4affb0b1710e8a3e0fb6', 'p.003', 3, 1); +INSERT INTO `jcdp_sys_category` VALUES ('6b7f066c07f24006b7d21b1f785dd098', '平台配置', 'subdomains.png', '76040df23e0948e995a64c45f9b63a9c', 'd.001', 1, 0); +INSERT INTO `jcdp_sys_category` VALUES ('76040df23e0948e995a64c45f9b63a9c', '字典参数', 'book_key.png', 'root', 'd', 2, 0); +INSERT INTO `jcdp_sys_category` VALUES ('78c7c9df2c17432c9e3ad07456637e62', '全局参数', 'globe_model.png', '76040df23e0948e995a64c45f9b63a9c', 'd.003', 3, 0); +INSERT INTO `jcdp_sys_category` VALUES ('9d0fb8dc70f3452d8c98ce4cc3213c36', '应用安装包', '', 'd100b7f965304d46b7822b309dca622e', 'd.002.001', 1, 0); +INSERT INTO `jcdp_sys_category` VALUES ('9f8cac9e3b73407a8106f37268e70ae9', '首页设置', 'document_index.png', 'c1b5c67d77f9469da130f71d5d1d8f02', 'p.002.002', 2, 0); +INSERT INTO `jcdp_sys_category` VALUES ('ac52e67a184e4302b157a008dbe9f11a', '图标集', 'picture.png', 'c1b5c67d77f9469da130f71d5d1d8f02', 'p.002.003', 3, 0); +INSERT INTO `jcdp_sys_category` VALUES ('c1b5c67d77f9469da130f71d5d1d8f02', '系统参数', 'setting_tools.png', 'e0c42af9cd5f4affb0b1710e8a3e0fb6', 'p.002', 2, 0); +INSERT INTO `jcdp_sys_category` VALUES ('cd537001b4454282aa83db0a49b852dc', '用户管理', 'user.png', 'c1b5c67d77f9469da130f71d5d1d8f02', 'p.002.001', 1, 0); +INSERT INTO `jcdp_sys_category` VALUES ('d100b7f965304d46b7822b309dca622e', '系统管理', 'setting_tools.png', '76040df23e0948e995a64c45f9b63a9c', 'd.002', 2, 0); +INSERT INTO `jcdp_sys_category` VALUES ('db42a5ecae054732bad470ab4a565822', '平台参数', 'subdomains.png', 'e0c42af9cd5f4affb0b1710e8a3e0fb6', 'p.001', 1, 0); +INSERT INTO `jcdp_sys_category` VALUES ('e0c42af9cd5f4affb0b1710e8a3e0fb6', '键值参数', 'table_key.png', 'root', 'p', 1, 0); + +-- ---------------------------- +-- Table structure for jcdp_sys_dict +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_dict`; +CREATE TABLE `jcdp_sys_dict` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '参数名称', + `KEYKEY` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '参数值', + `NOTE` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '说明', + `CATEGORY` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属分类', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '字典参数' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_dict +-- ---------------------------- +INSERT INTO `jcdp_sys_dict` VALUES ('13bd478c63e649d396dd08789dfebd98', '模块类型', 'moduletype', NULL, 'd100b7f965304d46b7822b309dca622e'); +INSERT INTO `jcdp_sys_dict` VALUES ('2dab66bce35542a8b806d91077f2fe45', '组织类型', 'orgtype', '组织与权限-组织架构', 'd100b7f965304d46b7822b309dca622e'); +INSERT INTO `jcdp_sys_dict` VALUES ('4442f325c1394e9cad6831ffc05df9b7', '是否布尔值', 'istrue', NULL, '78c7c9df2c17432c9e3ad07456637e62'); +INSERT INTO `jcdp_sys_dict` VALUES ('50a9575594e24629b91f63db246b9f9a', '性别', 'sex', NULL, '78c7c9df2c17432c9e3ad07456637e62'); +INSERT INTO `jcdp_sys_dict` VALUES ('547a48cf41c04121a973dee53a690846', '角色授权类型', 'rolepermissiontype', NULL, 'd100b7f965304d46b7822b309dca622e'); +INSERT INTO `jcdp_sys_dict` VALUES ('5587adfd6ab04057b58722a10899eedf', '题型', 'exam_question_type', '', '78c7c9df2c17432c9e3ad07456637e62'); +INSERT INTO `jcdp_sys_dict` VALUES ('5b3253e4e34e4aa499337c2d10f1c4ad', '资料分类', 'file_cate', '', '78c7c9df2c17432c9e3ad07456637e62'); +INSERT INTO `jcdp_sys_dict` VALUES ('67a7f78561d54d708e5373c44604893a', '用户类型', 'usertype', NULL, 'd100b7f965304d46b7822b309dca622e'); +INSERT INTO `jcdp_sys_dict` VALUES ('854f99d670914902a804d3b2f2edc9ea', '前端样式', 'WebUI', '', '6b7f066c07f24006b7d21b1f785dd098'); +INSERT INTO `jcdp_sys_dict` VALUES ('8d8f5a08b3ab4bd489fdaf9919ec0734', '会话状态', 'sessionstate', NULL, 'd100b7f965304d46b7822b309dca622e'); +INSERT INTO `jcdp_sys_dict` VALUES ('981fbcaada804304b5f960b745b0068f', '试题所属知识点', 'exam_question_cate', '', '78c7c9df2c17432c9e3ad07456637e62'); +INSERT INTO `jcdp_sys_dict` VALUES ('c08eb0f2afce4fa9826e6678dff9dac7', '角色类型', 'roletype', NULL, 'd100b7f965304d46b7822b309dca622e'); +INSERT INTO `jcdp_sys_dict` VALUES ('e14c8b8bc1be49b09e70781c992324f4', '用户状态', 'userstate', NULL, 'd100b7f965304d46b7822b309dca622e'); +INSERT INTO `jcdp_sys_dict` VALUES ('fb6ee02f5b33418d8ec09847bf35c8ee', '启用状态', 'isenable', NULL, '78c7c9df2c17432c9e3ad07456637e62'); +INSERT INTO `jcdp_sys_dict` VALUES ('ff301d7317fd4801b460e3e001a8301e', '是否更新包', 'isupdatepkg', '', '9d0fb8dc70f3452d8c98ce4cc3213c36'); + +-- ---------------------------- +-- Table structure for jcdp_sys_dict_item +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_dict_item`; +CREATE TABLE `jcdp_sys_dict_item` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '项名称', + `VALUE` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '项目值', + `STATUS` decimal(2, 0) NOT NULL COMMENT '状态', + `DICTID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '字典项' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_dict_item +-- ---------------------------- +INSERT INTO `jcdp_sys_dict_item` VALUES ('018408116eb949afbd3678e6ea1935ba', '女', '2', 1, '50a9575594e24629b91f63db246b9f9a'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('0463bffe1a144c13805a81a05df81e27', '停用', '2', 1, 'e14c8b8bc1be49b09e70781c992324f4'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('1e783569239c451db864852909f46285', '问答题', '4', 1, '5587adfd6ab04057b58722a10899eedf'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('23b6e7031da748178754bddae591dea6', '是', '1', 1, '4442f325c1394e9cad6831ffc05df9b7'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('2823910fbbf34adfab7ac54620d092fd', 'IT生活', '3', 1, '5b3253e4e34e4aa499337c2d10f1c4ad'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('2b4b00d4097f460daee5d5a1474dba2f', 'Smart响应式UI', 'smart', 1, '854f99d670914902a804d3b2f2edc9ea'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('2bd21cd097d0423388fee5d6a55355d6', '工作组', '2', 1, '2dab66bce35542a8b806d91077f2fe45'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('32814b5e5476482d8eafbf64bbe34613', '职场进阶', '2', 1, '5b3253e4e34e4aa499337c2d10f1c4ad'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('32bc62037084477884d74ea7aa02a395', '启用', '1', 1, 'fb6ee02f5b33418d8ec09847bf35c8ee'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('3633f0efad1b4109837e1d5cba690aa4', '未知', '0', 1, '50a9575594e24629b91f63db246b9f9a'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('375c4cdc3d4a45c6870497e07b6eef24', '停用', '0', 1, 'fb6ee02f5b33418d8ec09847bf35c8ee'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('3c992a945c21433a99cde2417c630dc6', '否', '0', 1, '4442f325c1394e9cad6831ffc05df9b7'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('3cb9b8fb68434df8af96ae2f57209b35', '管理员锁定', '3', 1, 'e14c8b8bc1be49b09e70781c992324f4'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('3f380a65e3344b119ffe117ac41abdbb', '系统锁定', '4', 1, 'e14c8b8bc1be49b09e70781c992324f4'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('429ea943ab69433d8f2e1401663e7dc7', '行政部门', '1', 1, '2dab66bce35542a8b806d91077f2fe45'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('52e7d4033a6447269a8c927fd5e8c157', '普通用户', '1', 1, '67a7f78561d54d708e5373c44604893a'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('5703cdf8dd0e47a08d0735d0049dfab6', 'Action页面', '2', 1, '13bd478c63e649d396dd08789dfebd98'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('59a79f9c4e574c2389a8b0494e886b1f', '在线', '1', 1, '8d8f5a08b3ab4bd489fdaf9919ec0734'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('5a9bfbe5cbd24244bfaca552978ebc81', '多选题', '2', 1, '5587adfd6ab04057b58722a10899eedf'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('606b425174014ce3b1d34c578442a80f', '判断题', '3', 1, '5587adfd6ab04057b58722a10899eedf'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('63e696764555412c8726ac1363fed035', '自定义角色', '2', 1, 'c08eb0f2afce4fa9826e6678dff9dac7'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('7c0e171f83e246049dfe114960d74484', '安装包', '0', 1, 'ff301d7317fd4801b460e3e001a8301e'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('7efcc6f5ad5c40bc9d2599f98edda540', '生活休闲', '4', 1, '5b3253e4e34e4aa499337c2d10f1c4ad'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('7f21722c44fb491bba70ec7a4cc6d7e4', 'Action', '4', 1, '13bd478c63e649d396dd08789dfebd98'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('8403e4be247847ed8168d055ada59b2d', '党组织', '4', 1, '2dab66bce35542a8b806d91077f2fe45'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('86aa6ee1e7aa4f17a36920e831b9c20e', '传统样式', 'cetc54', 1, '854f99d670914902a804d3b2f2edc9ea'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('8d307afecc33489baaa733ef89ea5a28', '其他', '9', 1, '2dab66bce35542a8b806d91077f2fe45'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('8f1e7f93c0514d778d8d18a3197cfe31', '更新包', '1', 1, 'ff301d7317fd4801b460e3e001a8301e'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('96407128a74d4370ad29134bd893c15a', '财会考试', '3', 1, '981fbcaada804304b5f960b745b0068f'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('a2882bc714c64e6cb74a8fb8b46af322', '系统外模块', '6', 1, '13bd478c63e649d396dd08789dfebd98'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('a91da8b537e545c48e9c37d7e13af009', '目录', '0', 1, '13bd478c63e649d396dd08789dfebd98'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('c52ffd8e68284a478260fea576e52431', '新增用户默认角色', '0', 1, 'c08eb0f2afce4fa9826e6678dff9dac7'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('c6246ba9af9f4b24ac64c1db26e80b9e', '文化历史', '5', 1, '5b3253e4e34e4aa499337c2d10f1c4ad'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('cec6f2eb20614aedbeaef0a726a861c3', '男', '1', 1, '50a9575594e24629b91f63db246b9f9a'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('d221a86d7f2c4fc78edeb9e2e0531681', 'Action数据', '3', 1, '13bd478c63e649d396dd08789dfebd98'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('d2b334e9da3549e08fae65a834d3a526', '项目组', '3', 1, '2dab66bce35542a8b806d91077f2fe45'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('dc70115adddb4a80a6c2e123ccce679a', '业务角色', '0', 1, '547a48cf41c04121a973dee53a690846'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('e3db2028550e487a9ed46cb1a11b3c7c', '超级管理员', '2', 1, '67a7f78561d54d708e5373c44604893a'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('e762ce5488304df797a5439d89b2a6b0', '正常', '1', 1, 'e14c8b8bc1be49b09e70781c992324f4'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('ec2eb20799e74561946053d01cde2691', '单选题', '1', 1, '5587adfd6ab04057b58722a10899eedf'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('ec3a1f6202534feda1ecc8abaf5f4010', '项目管理', '1', 1, '981fbcaada804304b5f960b745b0068f'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('f0bb9e4da77e4e6281dded48352e8270', '普通角色', '1', 1, 'c08eb0f2afce4fa9826e6678dff9dac7'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('fa6727939d8a41c08f7081767e210d6f', '质量管理', '2', 1, '981fbcaada804304b5f960b745b0068f'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('fa8923dca9034f56821856653e4a468a', '仅用于授权', '1', 1, '547a48cf41c04121a973dee53a690846'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('fe0b990e90c54a3e9755032c965f6fbc', '企业管理', '1', 1, '5b3253e4e34e4aa499337c2d10f1c4ad'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('fe1df7f9c12a4dfbaf9685c4204f6f62', 'Action扩展权限', '5', 1, '13bd478c63e649d396dd08789dfebd98'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('ff46732b821a4ba3a52f5843559e932c', '控制器', '1', 1, '13bd478c63e649d396dd08789dfebd98'); +INSERT INTO `jcdp_sys_dict_item` VALUES ('ff6ba0ad9c03419f84be793d984165ad', '离线', '0', 1, '8d8f5a08b3ab4bd489fdaf9919ec0734'); + +-- ---------------------------- +-- Table structure for jcdp_sys_feedback +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_feedback`; +CREATE TABLE `jcdp_sys_feedback` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `DEVICEINFO` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `USERCODE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `USERNAME` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `IMGS` json NULL, + `PROBLEM` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '问题描述', + `CONTACT` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系方式', + `STARS` int(11) NULL DEFAULT NULL COMMENT '评分 1-5星', + `SESSIONID` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ADDTIME` datetime(0) NULL DEFAULT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_feedback +-- ---------------------------- +INSERT INTO `jcdp_sys_feedback` VALUES ('adasd', '{\"app_version\":\"1.6\",\"appid\":\"com.cetc54.moa\",\"imei\":\"b1b40089914e63ab\",\"md\":\"MI 6\",\"net\":\"6\",\"os\":\"7.1.1\",\"p\":\"a\",\"plus_version\":\"1.9.9.35689\"}', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '超级管理员', '[\"https://120.77.211.40:8443/feedback/feedback/getPic?path=V0VCLUlORlx1cGxvYWRGaWxlcy91c2VyQXZhdGFycy8yMDE3MDkyODE1MjcxNF9mZDBiYWU0MmY3OTc0YmE2OWNmMzM3NTgwMTc4NTc1OC5wbmc=\", \"https://120.77.211.40:8443/feedback/feedback/getPic?path=V0VCLUlORlx1cGxvYWRGaWxlcy91c2VyQXZhdGFycy8yMDE3MDkyODE1MjcxNF8wN2QwNTYwYjUwZjM0MTcyYjFjMGU3MDg3ZmUyOTlkZS5wbmc=\"]', 'sadfasfd', '123', 4, 'AE143E112111CD7AA2730BACB4D4FEA2', '2017-10-31 16:08:13'); + +-- ---------------------------- +-- Table structure for jcdp_sys_log +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_log`; +CREATE TABLE `jcdp_sys_log` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `LOGINNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录名', + `USERNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户姓名', + `ACTIONURL` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '操作路径', + `ACTION` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '操作内容', + `REMARK` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '备注', + `SPENDTIME` decimal(10, 3) NULL DEFAULT NULL COMMENT '用时', + `CREATETIME` datetime(0) NULL DEFAULT NULL COMMENT '操作时间', + `SESSIONID` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '会话ID', + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户唯一标识', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_log +-- ---------------------------- +INSERT INTO `jcdp_sys_log` VALUES ('0027e4d8915f43ca96e50a537235233d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:f4d3ceac356e40dab2ebbafe6781d225', 0.014, '2019-06-01 17:58:43', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('00e01734fbdf4e57967806725e0afc13', 'admin', '超级管理员', '/train/groupInPlan/delete', '部门计划制定管理/基础操作-删除部门计划内培训计划', 'ids:fa8bc1008e7546b7be3586809d6cf61a', 0.015, '2019-07-25 10:21:41', 'D887FDE8463C322B0F78A872664752F0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('01682fa5d4dd4d148376e209f03813f5', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 13.709, '2019-08-16 16:08:50', '4AAA1D5F74E86B261CE01589FBDEC16C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('01a7644eb24b4ceeaf3acc61a9f4945b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.037, '2019-06-01 18:03:31', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('01d060d8d1384c6fab3f85817d2baa1b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:8627dd1a93624929b949e149a070155c', 0.009, '2019-06-02 09:26:21', 'DBDA233F2A2DBC336B3010A1D6057963', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('01e7fbe4e8d040048101c6d5e9ad3195', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:ab22561a46a347a187b59720864699dc', 11.006, '2019-08-19 09:53:29', '1E8B7D3FBCBE57F6CB68278FC4ECF7AB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('02423d12fdac458eb174d94b1700296f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:add6b862fd0a4720b799661245d56427', 0.072, '2019-06-13 15:49:43', 'B9BE0CB34FCAD1412D85F9009675EEDF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('02840d6cf5144cf58ad64b172b8bde0d', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:456', 54.314, '2019-08-20 16:21:10', 'C12D57528509CADB2483B9D6D3ACD748', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0440431d10434f56865962fe4a7ff148', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:409da7903ba14106b0bab9d83074e152', 0.020, '2019-06-01 17:21:00', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0504c04c674744588d8a431a7a28d7b6', 'admin', '超级管理员', '/role/role/savePermission', '角色信息/设置功能权限-保存功能权限', NULL, 0.063, '2017-07-13 09:16:05', '2B282A8D53169971E17ACC00D29CA5D5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('050c9a17343949b5ab59e66e37b79552', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.051, '2019-08-07 18:01:35', '3551CFFFCCE4EBF54CB135DC43DFD489', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('05209d3ec9e346b6818ce709c6b7b08f', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:730c56507349498681744913990a1e4f', 0.045, '2019-08-19 11:00:21', 'A8EB0AF4CD36762F192435615981AA6D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('058a825db3dd4e4a929e19a919cc464d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:f4d3ceac356e40dab2ebbafe6781d225', 0.044, '2019-06-13 20:31:13', 'AB17CD653307F29B087B06C313C10D72', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('05a24ba3613f4b5ca2bcac73c6c73354', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e82dd62b272e4cc3ac89a2f2957c84ae', 0.006, '2019-06-02 10:51:55', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0671cc737c4f4a08b644eb149e4e73a0', 'admin', '超级管理员', '/research/research/deleteExam', '调研管理/调研管理-删除', 'ids:ed243cec08fe4a2e99dcda7cfbc80b21', 14.025, '2019-08-19 08:22:21', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('06844bdc85fd4ebe84094cb71ecc760b', 'admin', '超级管理员', '/research/research/deleteExam', '调研管理/调研管理-删除', 'ids:d983fd789f7b4f499ba5c464d2ca5736', 5.427, '2019-08-19 08:23:53', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0718c47aba97488c8653dffa5b57797f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:4b1fa6cbeb144bac9ab69ac820b94ac5', 0.014, '2019-07-03 09:46:19', 'E8804766D2A892ED432B762C84E6D61D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0750d17acddf49038317817bb1c29f03', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.065, '2019-06-04 10:31:42', '77C4A6F85B5E07722AE3E53B8CBD0E2A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('07c6ad7bbfe5485a9416132aad3e35f6', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:2a189c3f1f174797bc2c93ce60655523', 49.722, '2019-08-13 11:35:36', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('091518591cbd43ad8e1e1df88f6fe843', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.032, '2019-07-04 17:10:33', 'E1EA7BDBF9F1D678BCE0573A350EA5C7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('096039e36ee94270bfb6b1599122cc73', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.021, '2019-05-29 17:55:31', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0964c294c1a74f9e86bcf9cad2cf713e', 'admin', '超级管理员', '/role/role/save', '角色信息/基础操作-编辑角色信息', 'ID:6c72a8da1fe246e9a92c2185b5317630', 0.041, '2017-07-25 11:46:43', '417611B82CBB2C08859162B31AFDC5D0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('09addf307b5a4eebb9795cc02a8271f0', 'admin', '超级管理员', '/train/groupInPlan/delete', '部门计划制定管理/基础操作-删除部门培训计划', 'ids:8ecbb88833f54e9cb34c549616c35dc4,661c67b0892b41acb2b0d5e42db4de68,633658f9091a4eb8ac301ae586a3b667,3877e362ae564a18bd4a748d346037a0', 0.038, '2019-06-24 10:08:52', 'E05B58CD7DE256FE4A56FB232B703FEF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('09e0cb3e55fc470aadcf94b71e038bbe', 'admin', '超级管理员', '/exam/question/delete', '试题库管理/试题库管理-删除试题', NULL, 0.094, '2019-07-12 15:01:38', 'A2EFC3F54743C96B06FD08200F306367', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0a4d8ab55d6743ecb294b54eb789ffce', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:cf2140bf162949a581866b5bb2633914', 0.029, '2019-05-29 09:45:34', 'B7695F52CEA85AD4210EC9C8B63EB251', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0a4dec61d4954f4cb8161cc6700daf1e', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:4d59b47f837f4751a542e72fdd10456e,2e70dee96dcf44eea47a6f28a7f8f177', 0.034, '2019-08-19 16:43:56', '956F2F05B0588B44030D973CA24DBD55', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0a7634f2a7c549f7a3293cd0e512ab77', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:dd47694e61cf45bc82984245a4d3348b', 0.037, '2019-06-05 08:49:25', 'A7996926BDC7B76079E0629CF7BFDA01', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0a77391310b245a9bc57c1c5e9890e6f', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:1', 9.632, '2019-08-16 10:57:53', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0a8b46022c994522ae56be07ddda2ebc', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:6c3128d8e98549d4a26bc27f65aa1cb4', 0.032, '2019-06-02 10:39:07', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0a96193e72bf423384e378803c7518e7', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:128ab5989d27461e9fddeb9fae200991', 0.033, '2019-07-02 20:15:13', 'AAA1399AD505C24D5F016A90A641B1FB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0abe8d3f27e5433b90a99a02c8f94521', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.044, '2017-09-16 16:57:22', '37CF15BB0D2B191DE2790096F8B16388', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0aea98956526461881dd964a0e52a0d0', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', NULL, 0.005, '2017-07-04 08:43:01', 'B09EC7BC65DE9407ED212E99A55401DD', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('0b5cec5129c34e0e977a465f611913de', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.055, '2019-07-24 17:28:12', '4CF1CB810EF34A5EE7427610F8B7781E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0b7c0cc08ac94776831ce6cc55a5c6a0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.009, '2019-06-01 17:58:14', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0b7dda24227b4f5082f020ac426e47a7', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e84381fd49f54ae487e241f152e808d0', 0.028, '2019-05-29 17:52:13', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0b8f968ae2b34199bc241e1f82931911', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', 'ID:282f17fefa574435bde4529b96a6e5fc', 0.027, '2017-07-06 08:51:42', 'C82A93F9A16DDC2E1FAA7953265FEAEA', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('0d4237542ccc41fb93b21e1ef86f30f2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.027, '2019-07-03 20:36:02', '2BB836E8EBE147B397B9612FF43B22D3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0d43a34c73ac46189d994c41835208b5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0d54f933349143e99d2717203fa30886', 0.052, '2019-06-01 17:26:09', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0d663cc628e64a10bdb8990d99478780', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.060, '2019-06-01 18:09:25', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0d901ef1e9a24b64a19d01909d363c84', 'admin', '超级管理员', '/research/research/delete', '调研管理/发起活动并制作调查问卷-删除', 'ids:feb18ef7860e420b86a39a17f30cb869', 0.046, '2019-08-23 17:46:42', '9BE953803B2C74236197926EF14F1BE4', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0db0db6597964d068432d1b40739f8c7', 'admin', '超级管理员', '/research/research/deleteExam', '调研管理/调研管理-删除', 'ids:1', 22.306, '2019-08-16 17:16:33', 'FA4093C7263F2BE657E4530B0F3DA450', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0e96d8b9afd041cbb865723fad249d9e', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"9d0fb8dc70f3452d8c98ce4cc3213c36\",\"id\":\"ff301d7317fd4801b460e3e001a8301e\",\"keykey\":\"isupdatepkg\",\"name\":\"是否更新包\",\"note\":\"\"}', 0.031, '2018-01-09 11:16:17', '107ED3C76D8C7B4DEB592481F209ADD7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0ed204f4456b4678b85053b2ea69a795', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e57053ece8c2420e87170a0de30a04eb', 1.082, '2019-06-13 08:55:35', 'D2F73B15624386C0F751F860C0B64CD1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0ed9b74b357541da89dcd5102d86081b', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:d1382a04d6f14f538253be519b991c14', 0.014, '2019-05-30 21:02:44', 'D200C72D6A9BEB3D074926D19F04900C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0edc49f27ac8429381be1c97a0e6e1b0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:83ab57c8a3cf44a89c200ccfd16ed911', 0.036, '2019-08-06 10:15:43', '07CCAF7C4DBDA4D6F0B9E7B722DB99AE', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0f021a3d21894e6c948541c62f7169d2', 'admin', '超级管理员', '/research/research/saveActive', '调研管理/调研活动类别-编辑', 'ID:d62afd544b1143698e8cacd15a927b6f', 0.018, '2019-08-19 11:04:25', 'A8EB0AF4CD36762F192435615981AA6D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0f1fde24616641a5968c3700a7bfd9d9', 'Y11037', '宁志全', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0c89626a5005469fb3cb96dabf94cf08', 0.011, '2019-08-07 08:46:14', '8324451D8040470BD9221A7AE5830CA1', '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_log` VALUES ('0f7db64d861e487baa689d6c879f4573', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.381, '2019-07-04 11:15:02', '15DB6C4D7DDC3BD1FB010FBC49F115CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('0fceb860789848d68c3b8907fdd21b69', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.007, '2019-06-01 18:07:09', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('10444fd15faf45af8b996b6c8e6f48c0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a20da32d88a64c2c96b4b05d1e63f9e1', 0.034, '2019-07-03 10:02:02', 'E8804766D2A892ED432B762C84E6D61D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('10604f08b2b54c9f84286457ee9a6120', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:W06893', 0.055, '2017-08-01 10:56:13', '7DB2A1739FC74E3FC7AFF2FFE1F71750', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('110d28d5b5db450c8b83f928d3fbf332', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:0c6712865c87490cb2557d1c30a6cc7b', 0.015, '2019-08-19 16:44:28', '956F2F05B0588B44030D973CA24DBD55', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('113a949b41da4ff2a1c737fa4a358bd8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:510998e99c924665806c0e20bbbcc2b2', 0.007, '2019-06-02 10:51:41', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1202ac84182344c49071f1dbfbb41d76', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:0f4f16835d4849be8af547497fc7f112', 0.032, '2019-08-20 15:53:57', 'BE931B334E08359D4C65648940ED2AB0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('12b9d15585d946cd87be61e8603ea4f0', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:f10bbb4bed56493c98a3d79938cb5471', 0.011, '2019-05-29 08:31:01', 'AB454954F9023667A2657B18ED8950F6', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1312850c30af4b71879b6a73e682c713', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:a4ad30251d6f4c7e84af9f0a7e4831ab', 23.177, '2019-07-25 16:26:31', '1D33FA6B4179BEDE888FDE7BEF00B322', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('132a4b5d4dee4f6b8c1738b1d0435d1f', 'admin', '超级管理员', '/role/role/delete', '角色信息/基础操作-删除角色', 'ids:2fb9b0ec768c46b9aa525f11d20b447a', 0.053, '2019-08-07 16:41:08', '759D243B757123E5010EE86670E31591', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('139c7ee27ae048e79cbbdc7e2d89d3ed', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.028, '2019-06-13 21:11:13', 'AB17CD653307F29B087B06C313C10D72', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('145737e9cf3941fd9012c3418deab1a7', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:83ab57c8a3cf44a89c200ccfd16ed911', 0.029, '2019-08-09 11:55:07', '477DBD8E71FE6BA4EEE3A42389F63A7E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1471d17e27f740beb307fcb06bd55da0', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:8ecbb88833f54e9cb34c549616c35dc4', 4.970, '2019-05-31 20:02:03', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('14a97b6ef40848d99d5167328a168bae', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', NULL, 0.007, '2017-07-04 08:59:30', 'B09EC7BC65DE9407ED212E99A55401DD', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('14ab09fcc05e4ad180cbb37b94adc5cc', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y08066', 0.016, '2018-01-09 10:53:12', '908CA1C270373C3B26004513B6DD2ACB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('14d76fea63204c5ab6c4791e516fd758', 'admin', '超级管理员', '/exam/question/save', '试题库管理/试题库管理-编辑试题', NULL, 82.681, '2019-06-17 16:18:05', 'FE64322DE59A3E4F83AF5AE4303675B1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('15a8790be65c4945b0562c56736394ab', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:30bc2dc45eda4ceba18dfc6fd33140ca', 0.041, '2019-06-01 17:44:50', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('15ed050f94894286ab6616db29269966', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:d1382a04d6f14f538253be519b991c14', 12.194, '2019-05-30 21:03:32', 'D200C72D6A9BEB3D074926D19F04900C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('164cd64771a246518275668bff01315a', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:ed1ddc939b354c8f9cd13bf68ff343a9', 0.079, '2019-06-01 08:18:19', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1668a1534b5f47e282cdf50f045217b2', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.197, '2017-09-26 15:16:49', '4BFC0114057EFCC510AEAB2B4F9E9002', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('16b9126c9b424c53a1a98402bd2da011', 'admin', '超级管理员', '/role/role/save', '角色信息/基础操作-编辑角色信息', 'ID:d2b6702c7f844850b7e067b7165477d2', 0.049, '2017-08-10 11:08:31', '61D1442BF0A648088451ACD37483C17A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('17046edf3beb41588b11b09ab5d70992', 'admin', '超级管理员', '/user/user/delete', '用户信息/基础操作-删除用户', 'ids:211dd03b8a304b57a77d457d6beae1f9', 0.036, '2017-07-25 15:50:41', '99A87F35FF7639A15DF4C3E594011F6F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('177f402728c0449fa41d683df7a189ee', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.024, '2019-05-29 17:44:39', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1815b274b20b4960a31f6101896c72c9', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.108, '2019-05-29 18:00:18', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('183f9d18048c42b6a5532abbe4653c5e', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 0.001, '2019-08-16 11:13:13', 'CA15CD1ED6E0E2831CAB8CBD9D7802DB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('194858dd529c414c9cf4fde91dbdd477', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:6b1f0f8743064eb7a5ce4b3cc753bc7f', 0.023, '2019-08-20 15:46:45', 'CC1A35BAF61F3BD6EDBB67378438C1B9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1a1558deee764a9fb22091bfc2ae8b3b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:c1b8a2264b0740b7a88724c6744651d5', 0.014, '2019-06-02 10:39:24', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1aba1473fab04014aacd563c4de56bba', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:730c56507349498681744913990a1e4f', 0.040, '2019-08-19 08:27:55', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1b667d302b5d4d8888bed642c13d6716', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:1b8ce1ffaf584de1b2052e97047041f6', 0.011, '2019-06-01 17:45:14', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1bb2a82ef91943aab6a75db2a4e5bed6', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:1', 4.475, '2019-08-16 11:06:28', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1c7334b5c292479e9c6712a43e85945d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:5652c5d72dcd474fa831dd32385ea9c1', 0.021, '2019-06-01 17:44:20', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1cfbee92984942e2809bce5d4c67f93d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:be9bff7b9be04526913be68d98980dff', 0.028, '2019-05-29 11:01:33', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1cfec26485fe4074b9bbd285cb1b8a24', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y07616', 0.059, '2017-07-25 15:50:32', '99A87F35FF7639A15DF4C3E594011F6F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1d17e29fad3f4aefbe19fcf09e4fcf0d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.006, '2019-05-29 18:50:54', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1dae742eb0de497fbadb0d279054b6ac', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"6b7f066c07f24006b7d21b1f785dd098\",\"id\":\"\",\"keykey\":\"WebUI\",\"name\":\"WebUI\",\"note\":\"\"}', 0.037, '2017-07-13 19:17:44', 'E4582C20257D5B2576C384260F581213', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1e19a9dd8f9447e59f8ec48c63542c91', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.013, '2017-09-26 15:19:13', 'E0A70FA2EDC1A265AD7059817A6010FE', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1e458406352e40b7a23bd817b688a412', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:32cc72dda23b4c3c8aab3238ddb23993', 0.020, '2019-07-02 10:47:09', 'A8B2722965054B94F1BBA25924F838FA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1eed1b1796e84236a2b114559a706ad5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.025, '2019-05-29 17:53:55', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('1fa35eb3f2ce411d97851b4407c6302f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:64913bf0934441fdb20a8a4f70a5f9d9', 0.068, '2017-07-27 20:12:05', 'EB93EDB381630277C140702FBC45AD70', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2023584830b64216b5a0d93f0ab5d878', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:ed243cec08fe4a2e99dcda7cfbc80b21', 6.768, '2019-08-16 11:03:13', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('202c9a9cbeee4df28f5adee0241ec401', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:6bb1c4692c8845ebb435fc945f13fe77', 0.050, '2019-07-02 20:15:21', 'AAA1399AD505C24D5F016A90A641B1FB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('202f7000ee9049238b2e174653339d3e', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 16.725, '2019-08-16 17:28:27', 'FA4093C7263F2BE657E4530B0F3DA450', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('210d1b643fa649228a35d6c6f1161bbb', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:8ecbb88833f54e9cb34c549616c35dc4', 10.334, '2019-05-31 20:02:20', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('212c9be8fdcd4a92946f69186027ef15', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y07616', 0.041, '2017-08-03 11:51:50', 'A7A0359FD1B9A492D06A301908FF97E2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('213b38bdcbc7424387de1ab94ba66341', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:94b9adc653324b2387f5ad1ac2298b30', 0.019, '2019-07-03 11:43:53', '729178F9BE466B7FC9BF9495C4DFBCA3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('219101c0e1a5435a8af34d013dfd392c', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:ebfd6227aaf0413496b41de7348928e6', 0.027, '2019-06-02 10:39:31', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('21f41d9bc5834944aeb43d27b7e4d493', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.005, '2019-05-29 18:50:33', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('221625488ef649f593889b5739414b01', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:6e864ead802b410381f5d85adef6f028', 7.528, '2019-07-25 16:39:03', '1CC9EC31BF8F079ECBF01F2090526259', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('221dea189dc7499ea26438b985970ab4', 'admin', '超级管理员', '/role/role/delete', '角色信息/基础操作-删除角色', 'ids:8d2b1e441cfb4e298085dc8d201f5679', 0.021, '2019-08-07 16:41:12', '759D243B757123E5010EE86670E31591', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('222129c70e194f4387cc7c0b6be9876c', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:633658f9091a4eb8ac301ae586a3b667', 0.005, '2019-05-31 20:08:00', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2252cb703dfc4c99a75a53c6434d09d4', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:fdecdd7235294dd8a4fdd8c6acb479a2', 0.030, '2019-08-14 08:41:25', '9C45D891FF7F17B93A1538E0D807FB0E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('22cb8547d1be4bdfb8f51244688c3b48', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.028, '2019-05-29 18:39:37', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('233693fef196483eab1c3f454dfd82a8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a1d904ec1f87468a8b1b0df371c48a53', 0.007, '2019-05-29 18:48:22', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2337444bd4fa444085cb5e6f613e775b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:685125c92da74b0499ea591a48f6562f', 0.016, '2019-06-02 10:51:34', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('236a120c5c604536bede0511d8269f21', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.021, '2019-05-29 18:49:45', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('23891ebf7fea4e288f15b195578783e4', 'admin', '超级管理员', '/chat/appVersion/delete', 'APP安装包管理/基础操作-删除应用', NULL, 0.016, '2018-01-09 11:12:06', '107ED3C76D8C7B4DEB592481F209ADD7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('23f4009ba57b4800875fe8d380f39f84', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:5d05c8586b124e43a6e95df5f58152e5', 0.020, '2019-07-04 10:01:48', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('246ccdfc7a62445fb40a4aa0e24cd301', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:975338ae351a4a19af2032fc360af687', 0.013, '2019-05-29 18:49:05', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2598fd1c7fb942c786aeb3cd774d7216', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:d2f27429a34c4607989c81c015783017', 0.103, '2019-06-01 11:25:42', '1D4C60E8B37F2DC65080C198DEC521F6', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('25e1cceb8fa248968adc7e178b021301', 'admin', '超级管理员', '/research/research/save', '调研管理/基础操作-编辑调研管理', 'ID:730c56507349498681744913990a1e4f', 0.005, '2019-08-16 09:39:25', '056EC9397FA1AF01BB89ADF79940A8B9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('26bbbd44197d454eb632d3546f64ffe2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.017, '2019-05-29 17:59:07', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('272d7f01f6d148f6828a0690ae431d99', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.024, '2019-05-29 10:56:02', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('27e59be9ed034ce6849e98c507a01982', 'admin', '超级管理员', '/train/groupInPlan/delete', '部门计划制定管理/基础操作-删除部门计划内培训计划', 'ids:ccb23c95e0684637909d4539b7d06866', 0.063, '2019-07-25 16:31:04', '1D33FA6B4179BEDE888FDE7BEF00B322', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('27e7cf017ee7464eb35f2facffe47969', 'admin', '超级管理员', '/user/org/save', '组织架构/基础操作-编辑组织', 'ID:69e48e5a606a420188cc2d06df2f94af', 0.015, '2018-01-09 15:44:53', '30A1D359E1336A18E0812CD5186317F1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('28acc2c9a2fd4d52846fc3fd5fcc678a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.007, '2019-06-01 17:54:02', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2ae741b3c8714d3fb1ca48b024f7d650', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:99487e38de02493696da6304919e3fdb', 0.255, '2017-09-16 15:47:54', '644B5D1919C70B531FC6FADFA367D1BF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2b111b310ee34abba89dd4fadbf25932', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.029, '2019-05-29 18:59:49', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2b667b86fb514b19833d98532f6cda18', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.028, '2019-05-29 11:00:16', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2c0892baa86949d6834027eb74614ece', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:0f4f16835d4849be8af547497fc7f112', 0.038, '2019-08-20 16:06:43', 'C3D76523508ADF2489E23D19BB0374B1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2cc6ff505bda4d54bf3a503bacbe7470', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:a19b29bab5f94d4b8765143abd1b4c9b', 0.031, '2019-08-13 09:03:32', 'D7833D25A0145610566113E1BA5BA809', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2cd6afdb71bd47e7bc680ac148654cdf', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:630c427989854f56b278c290e3d3bb23', 83.264, '2019-08-13 11:55:29', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2d9c3a2297d94d08a0c89e77cc65fb6b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.042, '2019-06-01 18:06:49', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2e01a09ee6024e51883ff6e62e1636d6', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.018, '2017-09-16 16:45:11', '81B70B6BDDB9F69C17650DF01AE27A89', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2e41b79db8694aa9b09f3aba3d14aa5e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e82dd62b272e4cc3ac89a2f2957c84ae', 0.040, '2019-07-04 10:28:01', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2e8bf6795d7f4f47b9a5f73933d8554c', 'admin', '超级管理员', '/role/role/cancelUsersFromRole', '角色信息/设置角色用户-删除用户', NULL, 0.023, '2019-08-07 16:41:43', '759D243B757123E5010EE86670E31591', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2ec3a13dff2a410cb57b170443abbd78', 'admin', '超级管理员', '/exam/question/delete', '试题库管理/试题库管理-删除试题', NULL, 117.655, '2019-07-12 15:10:13', 'D51727F1AD46B3883F9990901A42E573', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('2f7c9527535e425cac75b2a012f4c8fe', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:b2e133b0d1284578bb1dbcf903968382', 0.006, '2019-06-01 17:35:32', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('300d0d299d98426c80e44a3a3a7b27f0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:d8cf20704ca3456fadc5df18b9e2f56a', 0.010, '2019-07-02 10:47:05', 'A8B2722965054B94F1BBA25924F838FA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3034a8a4a67b470fbda4f9e665eac35a', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', NULL, 0.006, '2017-07-04 09:02:21', '9E719C8559473436CAFCA61A6509EB71', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('306968278fa5491c834d32569bafab3c', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:d983fd789f7b4f499ba5c464d2ca5736', 0.005, '2019-08-16 11:05:43', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('31641e3c6c8243839ea31fa62899b899', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', 'ID:d0cf88ca0b96430a860301fd6472f523', 0.014, '2017-07-04 08:42:50', 'B09EC7BC65DE9407ED212E99A55401DD', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('31a4e58f730a411abae78b8d1d89cbcc', 'admin', '超级管理员', '/user/user/delete', '用户信息/删除', 'ids:554f5a2eb2584541a99423f250fb1e12', 0.042, '2017-07-11 11:36:17', '2B5BEE353F13094DFAEE10B3FAF63770', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('333be10d96f946cb8bd05c2db9156108', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"78c7c9df2c17432c9e3ad07456637e62\",\"id\":\"5587adfd6ab04057b58722a10899eedf\",\"keykey\":\"exam_question_type\",\"name\":\"题型\",\"note\":\"\"}', 0.044, '2019-06-04 16:19:53', '77C4A6F85B5E07722AE3E53B8CBD0E2A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('34304e812d7547e9afc20044917c363a', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"78c7c9df2c17432c9e3ad07456637e62\",\"id\":\"981fbcaada804304b5f960b745b0068f\",\"keykey\":\"exam_question_cate\",\"name\":\"试题所属知识点\",\"note\":\"\"}', 0.799, '2019-06-04 16:17:35', '77C4A6F85B5E07722AE3E53B8CBD0E2A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3454daa4123f4ef38ca09ad52b3c5e8b', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', NULL, 0.012, '2017-07-05 16:55:32', '4FB352C47AC8EADEC89AE80AA90838FD', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('3492fb94c91a4483bfc65c67f7acd53a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:685125c92da74b0499ea591a48f6562f', 0.018, '2019-07-04 10:01:54', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('35209cca8abc45b99379f6fa9454adee', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:W08011', 0.015, '2017-12-22 11:54:30', 'F971F662FCB59210C5FDF2BA0B50BF01', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('35ac465775b946309204c8e38822bd9a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.008, '2019-05-29 19:00:08', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('35e3dadcdf78481fba0edea159f2b7ed', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 6.193, '2017-09-26 15:19:25', 'E0A70FA2EDC1A265AD7059817A6010FE', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('36b9c3af7f85404397553dcd956878ea', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e57053ece8c2420e87170a0de30a04eb', 0.038, '2019-06-13 20:29:45', 'AB17CD653307F29B087B06C313C10D72', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('378d57179e564eedb281f5f8f687fa3b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.029, '2019-07-22 15:47:15', 'DBB2574D851C95E90B13E3F5AF0187F9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3806aabe8bd14dbdae857c60e1182870', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:004e01c7a9e24a45aa30fc4182cc910a', 0.023, '2019-06-01 17:54:37', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('387826f8dfec49d9a4ca1ea7454b18ac', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.152, '2017-09-26 10:22:59', 'C638AA6A04833E6DCC5F6C7D240D81A2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3882b847300d46cf87d7b638c437dd4c', 'admin', '超级管理员', '/role/role/delete', '角色信息/基础操作-删除角色', 'ids:d0cf88ca0b96430a860301fd6472f523,4ee4d7b7210a4dbbb6702d5148999a27', 0.063, '2017-07-17 16:57:23', '86F4B699F54A4CF6C6B95C93C69B9DE3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('388bf829c24a4387adf814a26d160230', 'admin', '超级管理员', '/research/research/deleteExam', '调研管理/调研管理-删除', 'ids:c07501a18e41462a8fd4af43ca983a59', 5.319, '2019-08-19 08:25:49', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('38e3369861e941ddbd983ff659eea52a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:77a1ac3000c14c3a85462353a78291f7', 0.011, '2019-06-01 18:12:25', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3a29361f4af64b5887b394388bf02a2b', 'admin', '超级管理员', '/role/role/savePermission', '角色信息/设置功能权限-保存功能权限', NULL, 0.075, '2017-07-12 17:34:33', 'C974C6B83B4A7EEF1DBADA12FC9ED3E9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3a41cf25657d4de88d91c3d4d7baaa9f', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', 'ID:6c72a8da1fe246e9a92c2185b5317630', 0.011, '2017-06-30 09:55:44', 'E23B3CCF94B9D2D4B3245E1B03FC2C06', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('3b2d45b0150c4a0ba93adeb4eea292cb', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:0d2b6d4eeddf4066ae5cb69f46dab779', 20.187, '2019-08-20 15:59:10', 'BE931B334E08359D4C65648940ED2AB0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3bef1789c74040e397ef2187f0c4d785', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.292, '2019-07-04 11:06:18', '3FD58D4A564F6C44B490F155A6AC4246', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3c414819a550482a93331386597f94f3', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0813b19ea7aa4df385ea0e23ae0feff9', 0.020, '2019-06-02 10:19:11', '91F0AD74375870E23BE9792BF71296AA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3c7952b80ac24159b1b85cfd30ec185a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:77a1ac3000c14c3a85462353a78291f7', 0.030, '2019-06-01 18:11:23', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3cb001f6c46a4dac945321ca886c1c2e', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:c07501a18e41462a8fd4af43ca983a59', 15.412, '2019-08-16 11:02:29', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3cc793d388be4177a2cbc7b2c71edcce', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:2e7aacfee36743e9bd9da751c12959a6', 0.037, '2019-06-02 10:18:19', '91F0AD74375870E23BE9792BF71296AA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3eaca3ee2c1d46738763bfde9078554f', 'admin', '超级管理员', '/research/research/deleteActive', '调研管理/调研活动类别-删除', 'ids:d62afd544b1143698e8cacd15a927b6f', 0.008, '2019-08-23 17:51:43', '9BE953803B2C74236197926EF14F1BE4', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3ee8af7c7d0144ca8b58289f3d5740b4', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0c89626a5005469fb3cb96dabf94cf08', 0.035, '2019-08-07 16:09:29', '834C8F974104810844BFF3604182492E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3f68990e99f2484a8fa688939c53b5a6', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:5652c5d72dcd474fa831dd32385ea9c1', 0.008, '2019-06-01 17:45:03', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('3fad0354af85445fa3d6ef0f317749c2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.037, '2019-06-01 18:04:22', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('40448f64472b45a6ad676b388340b361', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a5c69216801440958961c3055d144082', 0.012, '2019-07-04 10:28:14', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('41742ab095fd46259fa7cb0f77fe70d2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:b04f1bb494e1458989e4cfc9f58a3051', 0.031, '2019-06-01 17:43:37', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4325886815c54eb6aa86892817c5b238', 'admin', '超级管理员', '/role/role/selectUsersToRole', '角色信息/设置角色用户-添加用户', NULL, 0.008, '2019-08-07 08:26:35', '7EBF077315CDED286364032FED72C26C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('43cfc4de772b48bb8c10a9c1cfc51892', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:f6fec52be83a4ffaaaf23d141a26ebc9', 0.018, '2019-06-01 17:35:40', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('43d73af763c34289851aee61d08ceaed', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e40528451cca424ea7760eb4bf2ef4a6', 0.067, '2017-09-25 15:13:54', 'C079563A94D7ADC40E7531FB387AB484', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('44633467a3b44837a47f47b7e55eba66', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 16.348, '2019-08-19 08:12:09', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('452e36f78ede468c8a652b42e25958b3', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:feb18ef7860e420b86a39a17f30cb869', 0.004, '2019-08-22 11:01:15', 'FB2C930842CB6211F740A2D6B4CC689F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('45c477c544d44768804d36eaddf7051e', 'admin', '超级管理员', '/role/role/savePermission', '角色信息/设置功能权限-保存功能权限', NULL, 0.043, '2017-07-12 17:40:08', '5E5F8F6DAE371FC825F6C3C5EB612BC7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4622b4c7cbba4c44882aacc844e9e0ee', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y08066', 0.164, '2018-01-02 16:09:18', '565DF4917F9393C3C043BB2694EF9FCF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('46cc4c8767204e8594c25f7c8c4c5cd7', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0733453a1eb74e2a8de63def8d92d41c', 0.054, '2019-07-22 15:48:05', 'DBB2574D851C95E90B13E3F5AF0187F9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4742a2d28b074064aaec0a7d81da79bd', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', NULL, 0.017, '2017-07-04 08:42:43', 'B09EC7BC65DE9407ED212E99A55401DD', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('47bf244ed72743ecbf6d8fc88cf28f19', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.055, '2019-05-29 17:46:26', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('495a6aacb70f4a0c8f97b824042f1bfa', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', 'feedback.contact,feedback.stars,feedback.problem,', 0.043, '2017-09-27 09:26:50', 'AE143E112111CD7AA2730BACB4D4FEA2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4a5e1de2bddf46a2911679dda1a5e086', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:1', 29.081, '2019-08-16 10:11:19', '0944E5CB497B7D863F0E5ABC3C2D7D4A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4a689eb5981b4c1facfe5bc59d9724d2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:51b630f64d8941599a7f31ded5a13da7', 0.058, '2019-06-13 21:27:17', '1D805886BE8E401D4CFD0ADDAAC83A71', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4a7e7389161c4959886c8be032466b9b', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:c5e159fdecd7475986e64664b857402b', 0.047, '2019-07-16 11:49:59', '32AB8268DA196281CAD63D4A874FB104', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4afccbe5ebd14e84aefcf0d4ee1a4e68', 'admin', '超级管理员', '/research/research/deleteExam', '调研管理/调研管理-删除', 'ids:c57a1548c9fa479aa05c19fdc733d55d', 4.709, '2019-08-19 08:25:33', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4bef212613d242658b7ee7d8a448a8ef', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:54e5b401f7584fa38114f7d29251a41e', 38.594, '2019-06-24 10:10:42', 'E05B58CD7DE256FE4A56FB232B703FEF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4c067044869f4efa90da4069ceb9148e', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"78c7c9df2c17432c9e3ad07456637e62\",\"id\":\"5b3253e4e34e4aa499337c2d10f1c4ad\",\"keykey\":\"file_cate\",\"name\":\"资料分类\",\"note\":\"\"}', 1.117, '2019-07-01 10:06:02', '6BC6335044B21AA367942CCB00C0F186', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4c1248fcab184b85a1978cde0151880d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.034, '2019-06-01 18:13:29', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4c53e4cece83495a96b6331f49bfbaff', 'admin', '超级管理员', '/research/research/saveActive', '调研管理/调研活动类别-编辑', 'ID:780841c10b3742518e52e1c2dbb56c9a', 0.023, '2019-08-19 16:28:05', '956F2F05B0588B44030D973CA24DBD55', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4c70ef3fd9764950bb77254e72a04f2e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e82dd62b272e4cc3ac89a2f2957c84ae', 0.042, '2019-07-04 10:02:20', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4c7421d9f7d749a6a706f9c74de3df02', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.016, '2019-05-29 11:01:12', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4c92472282514e1cac78f343d7a3508b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.008, '2019-05-29 18:46:04', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4cd8c2ecd57543a0a8abdb5f561d08d3', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y07616', 0.041, '2017-08-03 18:58:07', 'AD664FA227E8A57AE06E9489AD66E634', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4d455881e64d4972b31dc1b6a20ac883', 'Y11037', '宁志全', '/role/role/delete', '角色信息/基础操作-删除角色', NULL, 0.020, '2019-08-07 16:40:50', '7562674DDC97D76538657536D0C7D4AF', '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_log` VALUES ('4ed94db2b34446fb9165971723e4978d', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:6e864ead802b410381f5d85adef6f028', 6.084, '2019-07-25 17:00:19', '43EA0E0D70D2C90D7D06E525366FC369', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('4edc93579f7349f4b86e1eea0363668c', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.034, '2019-06-01 18:12:14', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('504e6a7c2e364277b2608f66272a330d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.030, '2019-05-29 17:50:53', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('50a08ec3b88f48ee8479b42d0c876192', 'admin', '超级管理员', '/exam/question/save', '试题库管理/试题库管理-编辑试题', NULL, 46.546, '2019-06-17 16:09:29', 'FE64322DE59A3E4F83AF5AE4303675B1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('50a2cf94693342b8a194c5b0bf3b20e8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.024, '2019-05-29 11:02:24', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('511762b6113b4016860ac729d334cd4b', 'admin', '超级管理员', '/user/user/delete', '用户信息/基础操作-删除用户', 'ids:7d4337f3454d43af99339600bf1faa4e', 0.039, '2017-07-17 15:40:19', '73BEFD48F82400A031438FA09B824DB1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('518c5c9f864840dfa15af600c76b3113', 'admin', '超级管理员', '/flowable/processDeploy/save', '流程部署/保存流程信息', NULL, 9.767, '2019-07-24 16:26:49', 'CDB2599A4139F44E19BEB12CA8F155DB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5203e035c23245f28f809b20afce1810', 'admin', '超级管理员', '/role/role/save', '角色信息/保存', 'ID:6c72a8da1fe246e9a92c2185b5317630', 0.015, '2017-06-30 09:31:40', '1E13928A6CF195D49350E0750723AA7C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('521c1cbeb5a740219e12527697b9aaf8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.050, '2019-07-15 11:30:55', '9DB32B5E3151B87C430C08974F4A8855', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('522f6ba67dbf4dddbefe4f4ce2e4db15', 'admin', '超级管理员', '/flowable/flowableTask/expenseSp', '任务查询/流程审批信息', NULL, 0.523, '2019-07-17 16:38:05', 'C8EDB6F1ED1A9E1E7A868080B842D02C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('52327a8ff2eb4948b17892d1d06a7e18', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:3c56334a371246308fa839ad2d71de87', 0.027, '2019-06-01 17:45:44', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('52340d2f5bf94456931821816a3d58ba', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.017, '2019-05-29 18:48:51', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5279baa84a374345bc17883867c824e6', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:3134140f7bff4ae9ac16ccb0d7204b09', 6.714, '2019-08-13 11:06:09', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('530aa1ceda594ecebbeab6bc74af3776', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:1', 31.861, '2019-08-16 11:08:52', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5356d9d0cdf448f3adfa6e45d677d457', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.016, '2019-06-01 18:09:58', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5441e57ddf86493b8563038423842298', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:07d83d8001a54e3e9f5f9b0b3a31d2cd', 5.953, '2019-08-19 08:30:03', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('55eb79c597164168aeb0cd393f3378cf', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:3437127ed560445fbe7951f85dd36e8f', 0.012, '2019-07-04 10:01:39', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('55fc3b7915104b2c8ae32c671ec3ce3e', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:ec9f3fab4f434f3887c424ff70bcb012', 34.064, '2019-08-20 17:35:37', 'C12D57528509CADB2483B9D6D3ACD748', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('56ddb2b8d7b748ff9feee31d87f22a5f', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:c0de412db2e44d9b9e5616692fc202d8', 3.497, '2019-08-20 17:47:52', 'C12D57528509CADB2483B9D6D3ACD748', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('571c5bda2abc45a19bb84ff839586232', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:a4ad30251d6f4c7e84af9f0a7e4831ab', 13.196, '2019-07-25 16:32:25', '1D33FA6B4179BEDE888FDE7BEF00B322', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5791deae303d4e6d867c34de90fa3ff8', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', NULL, 0.007, '2017-07-05 16:55:38', '4FB352C47AC8EADEC89AE80AA90838FD', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('58e7270dcc0149968e4ea74c8ab6ccce', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y08066', 0.039, '2017-08-03 11:55:28', 'DDAE7C263564A118A71C560BF4DF60EB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('596b1cf5d10143b08522b30f81ff5662', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a8bb00e603d447b684eff2a26618f800', 0.012, '2019-06-01 08:50:16', '15C23DAF61B4C402E6A0815FFA01BAEF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('59e638cb938245a39618f74bfa0c99fe', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', NULL, 0.008, '2017-07-04 09:00:14', 'B09EC7BC65DE9407ED212E99A55401DD', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('59e7ee859d474011b430ab9e8b27a3fd', 'Y11037', '宁志全', '/train/groupInPlan/save', '部门计划内制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:83e1002c67b744eaa9ec7595884fedec', 9.150, '2019-08-07 16:29:26', '6BA6DA34EB5895C7E60CDE579EC4A5F2', '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_log` VALUES ('5a1ce818770942ffaab6d4900bad0d98', 'admin', '超级管理员', '/role/role/changeStatus', '角色信息/更改角色状态', '启用角色', 0.047, '2017-07-12 08:51:06', '00B694D4BD54D1F31143C35FD8E8AA70', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5a4e98fd09c64724a4cc8b93518a8b29', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0182e3bbc4044b479250bd870275f8b1', 0.047, '2019-06-25 16:42:03', '0270591B99B75B6FE4BE4DC1871F7B9C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5a7067e7ab844bb4b9f2128773618b13', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.028, '2017-09-16 16:44:06', '81B70B6BDDB9F69C17650DF01AE27A89', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5ae4328de85e4a4ea3ab08f54ed0d4a8', 'admin', '超级管理员', '/role/role/delete', '角色信息/删除', 'ids:ed9f9f87ad434056ae2ff2e2fec0bba0', 3.049, '2017-07-04 11:08:59', '15591562878D11F78831200F051BC97C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5bcc04b9d71244c18fe700441942ba74', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:1075ec0b161b417a802850baa3e327bb', 0.025, '2019-07-04 10:01:33', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5c4d3c85704c433c997e4bf5f2f0c927', 'admin', '超级管理员', '/exam/question/delete', '试题库管理/试题库管理-删除试题', NULL, 0.109, '2019-06-24 16:03:51', '5A9CAD26FCC9C2C2A6DCF3D75D6A53F7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5cd2cc0b7c6b4f159a842317e821026e', 'admin', '超级管理员', '/role/role/savePermission', '角色信息/设置功能权限-保存功能权限', NULL, 0.018, '2019-08-07 16:18:37', '48057D7670F34053810BD0E4A6A52FD1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5d555a166a9245c58651aab8f56568cf', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:d3413c6c860041099d5592787f4038ea', 0.163, '2019-06-14 10:24:33', '39F7192736EB545DE4920385CCB5C5B2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5e376740ed154fd490fea12589ef2280', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.032, '2019-05-29 18:50:45', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5f4432f43b8c47c4b91fe2cf68fcfa02', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e311bca4eeba42a79ebc3f0f3cfbe419', 0.007, '2019-06-02 10:19:21', '91F0AD74375870E23BE9792BF71296AA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('5fab715eb6fc4f0ba53170d8dfa717f2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.034, '2019-06-01 18:07:45', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6023ca1128f04126a85fb6c342da1b66', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a8bb00e603d447b684eff2a26618f800', 0.026, '2019-06-01 17:35:15', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6137ce42b4b446079396cd5a3063041c', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:39e2af5d600b48ba89a89f8a6dfb150f', 26.253, '2019-08-13 11:32:05', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('61e8717c18c945929c1a69e0807d3feb', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a5c69216801440958961c3055d144082', 0.034, '2019-07-04 10:02:32', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('620089b96e1146a68c9137b260cc0bd2', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:1', 23.286, '2019-08-19 09:54:10', '1E8B7D3FBCBE57F6CB68278FC4ECF7AB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('620b3d168ab648bbb81e197ec5a285f5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.065, '2019-07-04 11:26:09', '15DB6C4D7DDC3BD1FB010FBC49F115CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('628527c9257e482cb3eba78aec9bd0e6', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:6051224faf5146969ff3d75a30e99ff0', 0.022, '2019-05-27 17:56:40', 'EC2B8BB9F0EBBB1DEF32B27DF083C77F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6360b9761d284e99b0a1a75eb9c45ea5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.051, '2019-05-29 17:48:04', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6376fd8328d5458c87ba2e0216e89cc7', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.012, '2019-05-29 17:52:29', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('63d87d1d86864134b42265d3705fc5cb', 'Y08066', '靳晓松', '/role/role/delete', '角色信息/删除', NULL, 0.014, '2017-07-04 11:20:05', 'F8BDAF901F920580A32C1C978D38E7B3', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('63da8b6cab5941948d1c98737ee254da', 'Y11037', '宁志全', '/module/module/delete', '功能模块/基础操作-删除模块', 'ids:cb092655ee154c9ca0840701a4fdeddc', 0.025, '2019-08-07 16:30:46', '6BA6DA34EB5895C7E60CDE579EC4A5F2', '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_log` VALUES ('63ecb0ab6b604a5ab0aad8f863acf8d4', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 9.862, '2019-08-16 11:16:06', '69BECB08E8F018D2FC1C1C6B96F4E0DC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('64a37af5823e4d3b98c37c7d2f15ddf6', 'admin', '超级管理员', '/role/role/cancelUsersFromRole', '角色信息/设置角色用户-删除用户', NULL, 0.007, '2019-08-07 16:41:41', '759D243B757123E5010EE86670E31591', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('65e77ff5322c4df386ab3202804ecf5a', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', NULL, 0.006, '2017-07-04 11:48:07', 'F8BDAF901F920580A32C1C978D38E7B3', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('672493b9b0eb431898560c4b3cc96257', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', NULL, 0.018, '2017-07-06 20:00:15', 'E064B64C1D29A972E75FDEB8EC9816FF', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('679e657eed1642038e26702c8faf318f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:f4d3ceac356e40dab2ebbafe6781d225', 0.054, '2019-06-13 08:55:44', 'D2F73B15624386C0F751F860C0B64CD1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('67d434c79df74213bcfb2cef1a9f111e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.018, '2019-05-29 18:59:58', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('67f17763cd704cf6b95f7eba1650ec5a', 'admin', '超级管理员', '/module/module/delete', '功能模块/基础操作-删除模块', 'ids:0c89626a5005469fb3cb96dabf94cf08', 0.060, '2019-08-07 16:11:17', '834C8F974104810844BFF3604182492E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6a02bbbcb4bb45bba185720a5a2699db', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.030, '2019-05-29 18:43:43', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6aa43164f4ba4332920815cb543c2a91', 'admin', '超级管理员', '/user/org/save', '组织架构/基础操作-编辑组织', 'ID:24b09331aba242068c5d9abe64a5fbb1', 0.000, '2018-01-09 15:45:31', '30A1D359E1336A18E0812CD5186317F1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6b405d6181a545518ec0e838950296b0', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:f10bbb4bed56493c98a3d79938cb5471', 0.006, '2019-05-27 17:56:44', 'EC2B8BB9F0EBBB1DEF32B27DF083C77F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6b75ac6a3ce24ef4829c5405b21920d7', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:dd47694e61cf45bc82984245a4d3348b', 0.069, '2019-06-05 08:50:50', '06D0527ACDEFC6180614AEA45DE35896', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6bb535e4ca0145758f5fea3027ad21f4', 'Y11037', '宁志全', '/role/role/savePermission', '角色信息/设置功能权限-保存功能权限', NULL, 0.019, '2019-08-07 16:39:17', '7562674DDC97D76538657536D0C7D4AF', '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_log` VALUES ('6bc979c36f0949e3a346abbe72e9baf6', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:2cbc36a1827c4dc18dbade7ffd1aba4a', 0.007, '2019-06-21 18:10:41', '83732FA1FD5A063F1A639CFBF9740F1A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6beca41b4c9c4a6793ae8400e02f7f6a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:21add52d344f40d2aa7087d5dcfaf0b4', 0.017, '2019-07-04 10:02:26', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6c0df03ba14b4affbac5cfd00c5293ee', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.019, '2019-05-29 17:51:04', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6c9b13e55877413fbc530b6a8b60fa4a', 'admin', '超级管理员', '/flowable/processDeploy/save', '流程部署/保存流程信息', NULL, 3.556, '2019-07-04 17:28:59', 'ADB13A1540FFB2814355F209A5412EDF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6d12fedf15e648c1800ba311a1ec779c', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:35c77553371141c08354e76821e14e1a', 0.007, '2019-06-01 17:45:23', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6dc63ec4aa264960b07040da334cc626', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:409da7903ba14106b0bab9d83074e152', 0.018, '2019-05-29 11:02:39', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6f029913a86d4d598187a87e0e4f333f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:28c3a95347024c4fb1b6395887a09409', 0.019, '2019-06-02 10:37:58', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('6f5f6e864a2b4366b562da8550f23221', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.052, '2019-07-04 11:16:11', '15DB6C4D7DDC3BD1FB010FBC49F115CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('709b590526f5421e9bf850b128d939c2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.163, '2017-09-16 15:46:51', '644B5D1919C70B531FC6FADFA367D1BF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('70d89f82518542eb8f6999b19fd0a997', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:9f65cf6479e64916bf27bfd3e2a652a6', 0.067, '2019-08-07 18:02:51', '3551CFFFCCE4EBF54CB135DC43DFD489', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('70f5da8cceb94b16a3d5bb205a04a4d2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.009, '2019-06-01 17:23:33', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('713cabd8a079468b84315a0d79bc4852', 'admin', '超级管理员', '/user/org/save', '组织架构/基础操作-编辑组织', 'ID:e5a1527bd7b44f00887da4a253b3756a', 0.000, '2018-01-09 15:44:40', '30A1D359E1336A18E0812CD5186317F1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('716c04e364754155b4caca4cd4831e32', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:128ab5989d27461e9fddeb9fae200991', 0.027, '2019-07-02 19:45:20', 'C1EB3C2409DCA7F6B46F037414A4744D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('71c01d97d725437090e64715252cd855', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a20da32d88a64c2c96b4b05d1e63f9e1', 0.018, '2019-07-03 09:50:08', 'E8804766D2A892ED432B762C84E6D61D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('71cca7d5a9cf4d87917444dbea3986f3', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.029, '2019-05-29 17:49:05', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('71d19e8427bf467bb065c03b0112a6ac', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:add6b862fd0a4720b799661245d56427', 0.083, '2019-06-05 10:11:50', '06D0527ACDEFC6180614AEA45DE35896', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('71e1bda93b794c6982f10f98530f0f37', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y08165', 0.290, '2018-01-04 16:49:59', '3095EC79816B5CACBB5EB540FC21E609', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7273aeb688d545f39a0d9467c14349fe', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:21add52d344f40d2aa7087d5dcfaf0b4', 0.008, '2019-07-04 10:28:08', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('72c8f8a52ffd4170a6ada3bc890329de', 'admin', '超级管理员', '/research/research/saveActive', '调研管理/调研活动类别-编辑', 'ID:698ffd5751764430bbec8294270941f9', 0.006, '2019-08-20 16:25:45', 'C12D57528509CADB2483B9D6D3ACD748', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('73274f0e67de44569920477e7e68b3f6', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:8f05403762e24703b3807d00bd600598', 17.737, '2019-07-25 10:36:11', 'D887FDE8463C322B0F78A872664752F0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('73285970d7224cad94f12b36d8b206dc', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:76ccbd8e2c7c4ffb8709396dc5059526', 0.028, '2019-07-04 11:15:19', '15DB6C4D7DDC3BD1FB010FBC49F115CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7383a0a84a994c448338242fca92e94b', 'Y08066', '靳晓松', '/role/role/delete', '角色信息/删除', NULL, 0.004, '2017-07-04 11:48:03', 'F8BDAF901F920580A32C1C978D38E7B3', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('73d109512fc84e538b0ae8db70095080', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:W06555', 0.000, '2018-01-09 14:37:44', 'FA6204A347AB8D4B204D175CC9D64D5D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7522763573eb437d81b5041b65092d62', 'admin', '超级管理员', '/exam/question/save', '试题库管理/试题库管理-编辑试题', NULL, 11.809, '2019-06-17 16:13:28', 'FE64322DE59A3E4F83AF5AE4303675B1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('755709c5e9fb4c2596e0956a4ccc1948', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:ed1ddc939b354c8f9cd13bf68ff343a9', 23.331, '2019-05-31 19:59:40', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('759147b422b945dc927a3f93c520e4c4', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:409da7903ba14106b0bab9d83074e152', 7.630, '2019-05-29 14:52:50', 'D5F0EFB391FD98E56491CD4B0145EF57', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('763d9304b8e94e0f9b48521782607fe0', 'Y08066', '靳晓松', '/role/role/delete', '角色信息/删除', NULL, 0.010, '2017-07-04 11:48:00', 'F8BDAF901F920580A32C1C978D38E7B3', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('76727a63302e48ceb70ddb135cd629cf', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.011, '2019-06-01 18:10:37', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('76d025872a7942da99dee5f8ef5531e9', 'Y08066', '靳晓松', '/role/role/delete', '角色信息/删除', NULL, 0.004, '2017-07-04 11:25:51', 'F8BDAF901F920580A32C1C978D38E7B3', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('76fff387eb1a4f9cb0121709c2eed853', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:8ecbb88833f54e9cb34c549616c35dc4', 53.184, '2019-05-31 20:01:19', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('774743af87bb4cad8145f72934fc0aed', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e57053ece8c2420e87170a0de30a04eb', 0.009, '2019-06-01 17:58:35', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('779f5d0c7d2a4e669b1e79b1954a054d', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:7d9e13d38c0d43348dd53684d8c3b072', 0.025, '2019-08-13 10:17:24', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('79041d567f7c4e13a16abfd18e8b8ca3', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.017, '2019-07-03 10:15:31', 'E8804766D2A892ED432B762C84E6D61D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('795b11e22d314f1a9710e4202d71d076', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:071282f2fb9a4f4faf4604dd6383e1ab', 0.009, '2019-08-13 11:28:10', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('799ab965b83948da8f8a1745bbd42faf', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:fa8bc1008e7546b7be3586809d6cf61a', 7.148, '2019-06-24 10:51:13', '99E2BD43028FC12CB339476D20775F6A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7a9683320f7f4771b6d8975ea08de5f5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:510998e99c924665806c0e20bbbcc2b2', 0.011, '2019-06-02 10:51:48', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7b4efc36f0ee43df9ac8b7f69263edf6', 'admin', '超级管理员', '/train/groupInPlan/delete', '部门计划制定管理/基础操作-删除部门计划内培训计划', 'ids:b721a1e27e0e4537beb86806f5ccc329', 0.016, '2019-08-06 18:05:42', 'BC7F17AD80C1F9B632BEB4080DEEB49F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7c2bd8b5b8804839bf0d4c77e6044cfb', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.041, '2019-06-01 18:05:14', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7d051ddaae19456cb531933cf3d00e7f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:d3413c6c860041099d5592787f4038ea', 0.021, '2019-06-13 20:37:16', 'AB17CD653307F29B087B06C313C10D72', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7d1d2eede55d421b9750a73079fbbe9e', 'admin', '超级管理员', '/module/module/delete', '功能模块/基础操作-删除模块', 'ids:4740ec0ab5fb4f509ef7fd6086e84096', 0.069, '2017-07-12 10:22:42', '4F2F54FC5BFBFE568FC4D07FF78FB6D9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7e0721431bfe492f8e683c97a58663e0', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:07d83d8001a54e3e9f5f9b0b3a31d2cd', 0.027, '2019-08-19 16:30:12', '956F2F05B0588B44030D973CA24DBD55', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7e91d8d6df4f486a94382a6f10adf92e', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:a19b29bab5f94d4b8765143abd1b4c9b', 0.031, '2019-08-13 09:03:17', 'D7833D25A0145610566113E1BA5BA809', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7e9a235f37f74b1f9b2b0455422f3355', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:847723e4606548c6ad6be266877d66e9', 0.028, '2019-06-02 10:21:59', '91F0AD74375870E23BE9792BF71296AA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7ebfee7e97584a14a7845ee230fa032b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:8627dd1a93624929b949e149a070155c', 0.013, '2019-06-02 09:25:58', 'DBDA233F2A2DBC336B3010A1D6057963', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7ef980738378460c99a10eaef1cf428a', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:cd7611757ab746e097a10338e9683a41', 9.114, '2019-06-24 10:12:19', 'F69A9F5C295343D8303535530DF4BB29', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7f07a60e8d4d4756a5f78d4a37121e84', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.005, '2019-05-29 18:52:12', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7f675f1705f646dcb90fb6c2be401726', 'admin', '超级管理员', '/flowable/flowableTask/expenseSp', '任务查询/流程审批信息', NULL, 0.251, '2019-07-04 17:42:35', '7F89531D132142B3BB026E1D0879A6C8', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('7f97b0791c884b65bf2e143d1ccb4a5c', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:598d184617594c97bd008df4bd0681f5', 0.039, '2019-06-05 08:27:26', '85CA23568A2749F36D661EC95E6D332D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('80e6b5941b17492f9d1360b9bd223419', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', 'ID:6c72a8da1fe246e9a92c2185b5317630', 0.005, '2017-06-30 09:32:48', 'EA33336AE527DE92CAF10003155ACC5A', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('81d8075b67ac4d5ea13167d28b598fe1', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.034, '2019-05-29 17:53:22', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('82d7e859d4464a71826952f35fd3c602', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:c1b8a2264b0740b7a88724c6744651d5', 0.017, '2019-07-03 11:44:19', '729178F9BE466B7FC9BF9495C4DFBCA3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('833cbf00f3724e04803e0d2a2891f72b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:598d184617594c97bd008df4bd0681f5', 0.105, '2019-07-04 17:09:32', 'E1EA7BDBF9F1D678BCE0573A350EA5C7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8347338f6fdf460c9408b05b09ce5013', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.006, '2019-05-29 18:50:04', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('834db79e1242459d86e5dfc569b4d4ee', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a69485e310244d39aa6359147077487c', 0.036, '2019-08-12 15:18:56', '229C94B4D3A609D4B1B1C13ADB98F6E6', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8369fb761ccc4f4ea7772e957a606ae9', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.016, '2019-05-29 18:44:27', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('838ad2021a6e4ead81047325a5c286d6', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.020, '2019-05-29 11:01:56', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('83e98b84adb54358b3fba7c86b8e541a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:957f8a1c05c746829405b4b08a9d454b', 0.020, '2019-06-01 17:21:25', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('84588586abe841c9a9cd9bf26f7f49d2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.017, '2019-06-01 18:13:05', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('84e8ae87a142440482ab8cc2f7b82d53', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:598d184617594c97bd008df4bd0681f5', 0.044, '2019-07-04 17:31:31', 'ADB13A1540FFB2814355F209A5412EDF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8544428d336a483bb9dd41c33712938b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e40528451cca424ea7760eb4bf2ef4a6', 0.031, '2017-09-16 15:44:06', '02BE1A3EA4D32B594A56FCBC8285D278', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('87b6e3c7e8184a9681e07d0cdfde2351', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:93093b73a7be4daf837e7f88dd51495a', 0.031, '2019-05-29 17:48:16', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('87ee8b52587e4f28b4d41679bc0ef732', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:fc1fbc52b36b4e5b96e3875948970ed6', 0.028, '2019-06-02 09:12:17', 'DBDA233F2A2DBC336B3010A1D6057963', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('884a06ad3d54456faa045413bc9a46e3', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0182e3bbc4044b479250bd870275f8b1', 0.047, '2019-06-26 16:40:47', '0DF1C32A7E5E164FA6C7DB7D662046F2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('88653bc93a854d8bb2e84ab4f7efd3cd', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 8.256, '2019-08-16 14:42:44', 'C1964AE0843A6FCA9FFD4B73BB54CF6B', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8936afd4d3e84bdca94a18fd154acad8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:51b630f64d8941599a7f31ded5a13da7', 0.964, '2019-06-14 10:24:26', '39F7192736EB545DE4920385CCB5C5B2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8951959033444a34b8ec1c9c7f01c14f', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:535', 0.014, '2019-08-20 16:07:47', 'C3D76523508ADF2489E23D19BB0374B1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('899b7038435346c486f68334b9fd6312', 'admin', '超级管理员', '/role/role/savePermission', '角色信息/设置功能权限-保存功能权限', NULL, 0.013, '2019-08-07 16:37:08', 'B8E077556CBBD0C3A8D7CE74C352E1C3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8a7be9e4eea44d4dbdf61501f626c5d8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:3437127ed560445fbe7951f85dd36e8f', 0.020, '2019-06-02 10:51:20', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8c2829f3ede44cd68885f25e2d6b13b9', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:W07427', 0.015, '2018-01-09 14:35:39', 'FA6204A347AB8D4B204D175CC9D64D5D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8df97ea9b7804455aff2ae0173acb098', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.015, '2019-05-29 18:44:02', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8e4ce362d3054d989222cdbfc4830846', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:f4d3ceac356e40dab2ebbafe6781d225', 1.123, '2019-06-13 11:16:58', '911FDBCE304FD4808F392642D00D5F50', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('8f1e3a8d88204fa989b24e0b8f28baf5', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:b9cc624316224293b445a1a238507552', 39.586, '2019-08-16 09:20:51', '056EC9397FA1AF01BB89ADF79940A8B9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('903cd8eed2a24d62a7cd7c7355afa8bd', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0fdffe5648e64e0699f9ecb3094f7e6a', 0.017, '2019-06-01 17:26:16', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('90da36227104461cb00d5a166296335c', 'admin', '超级管理员', '/role/role/save', '角色信息/保存', 'ID:fa971e1c34874555bae063814682b52c', 0.011, '2017-07-04 11:18:34', '2EA9661458AA0A6EF1CE8E1DD698EC2B', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('91d377311c314f819d76678743a76192', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a4e1d5973bc24782b45d379f36a2ff74', 0.018, '2019-08-07 16:36:53', 'B8E077556CBBD0C3A8D7CE74C352E1C3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('92258cee5d4847679f77f621dbc748ff', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:P12189', 0.000, '2018-01-09 15:42:35', '209A960FA43F3DE63E819E751ECD4BA8', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9387d73092104c848b79277286ece94e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.030, '2019-05-29 17:54:46', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9401060c120e4dd08fefe665bc5c1338', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.016, '2018-01-09 11:11:12', '107ED3C76D8C7B4DEB592481F209ADD7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9548f29b1c854af380a2337655e13769', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:ec9f3fab4f434f3887c424ff70bcb012', 0.039, '2019-08-20 17:01:43', 'C12D57528509CADB2483B9D6D3ACD748', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('95602da306ec462c9c7be671f2431e6c', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.012, '2019-05-29 18:50:23', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('958d973a421743feaba576ea1b65343c', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:7d9e13d38c0d43348dd53684d8c3b072', 0.044, '2019-08-13 10:17:49', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9643ad3c6bd5409988b591ece47b6ada', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:beb8c920fd7248e8b904712146163f4a', 0.187, '2019-08-16 15:18:33', 'C1964AE0843A6FCA9FFD4B73BB54CF6B', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('964be5aae15d4efc9c30d23cd69c6a3c', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:6051224faf5146969ff3d75a30e99ff0', 0.020, '2019-05-27 17:56:34', 'EC2B8BB9F0EBBB1DEF32B27DF083C77F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('970f3cced1fc4a26b38d70908d13c954', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:dd47694e61cf45bc82984245a4d3348b', 0.024, '2019-07-04 17:10:03', 'E1EA7BDBF9F1D678BCE0573A350EA5C7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9751bb766e884fe58906d1c82220743d', 'admin', '超级管理员', '/role/role/save', '角色信息/基础操作-编辑角色信息', 'ID:2e7dc18e84a142b6883fad9142087f16', 0.017, '2019-08-07 08:26:18', '7EBF077315CDED286364032FED72C26C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('978efdcb683d46c59e51dc599886d565', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:128ab5989d27461e9fddeb9fae200991', 0.053, '2019-07-02 20:15:57', 'AAA1399AD505C24D5F016A90A641B1FB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('983dbbde72bb482faf315f5c5c1e4d88', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 2.511, '2019-08-19 08:12:19', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9898b6bbd15049dda653810e4e57c99a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:c1b8a2264b0740b7a88724c6744651d5', 0.033, '2019-07-03 20:20:12', '2BB836E8EBE147B397B9612FF43B22D3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('993b304a4a164d8497e24658be4d966e', 'admin', '超级管理员', '/module/module/delete', '功能模块/基础操作-删除模块', 'ids:0733453a1eb74e2a8de63def8d92d41c', 0.105, '2019-07-24 16:26:06', 'CDB2599A4139F44E19BEB12CA8F155DB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('99a35e46558b44f5a741a621fa58bda8', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:0c6712865c87490cb2557d1c30a6cc7b', 0.050, '2019-08-20 15:07:25', 'CC1A35BAF61F3BD6EDBB67378438C1B9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('99e3457225824b2e99e9e19e578dfa56', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y08066', 0.050, '2017-08-03 11:55:35', 'DDAE7C263564A118A71C560BF4DF60EB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9a2213a9ef954d77a247e0d2ed369b3c', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', 'feedback.contact,sub:123feedback.stars,sub:4feedback.problem,sub:sadfasfd', 0.017, '2017-09-27 09:34:10', 'AE143E112111CD7AA2730BACB4D4FEA2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9b4b8b7ad72743c8be4b57c5e7171b24', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:f406acbfde644e8893943f5129417a6b', 0.009, '2019-07-04 11:26:16', '15DB6C4D7DDC3BD1FB010FBC49F115CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9c2ad23e720b4e548a3a956b86b46096', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.017, '2019-05-27 16:54:15', '5CD4432D6066D3D30675B8F9EB83DC1D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9ca96a38019844739216d011bb4fa6a2', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:6e864ead802b410381f5d85adef6f028', 10.298, '2019-07-25 17:00:07', '43EA0E0D70D2C90D7D06E525366FC369', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9cb51276a4d243c5ae8103b1c339a245', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"6b7f066c07f24006b7d21b1f785dd098\",\"id\":\"854f99d670914902a804d3b2f2edc9ea\",\"keykey\":\"WebUI\",\"name\":\"前端样式\",\"note\":\"\"}', 0.039, '2017-07-13 17:23:30', '7077DD195226FC81601D50217C029FA2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9cc17861fd7b451fb5878e0b52a584da', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:071282f2fb9a4f4faf4604dd6383e1ab', 25.723, '2019-08-13 11:12:11', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9cefc9e4246b4c81a102a82012d6d606', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:698ffd5751764430bbec8294270941f9', 0.018, '2019-08-20 18:17:53', 'C12D57528509CADB2483B9D6D3ACD748', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9d96ef10e8e447abba9481f774423d38', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:409da7903ba14106b0bab9d83074e152', 0.029, '2019-05-29 17:42:47', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9db8599d576a4cc09057573e2e243650', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.024, '2019-05-29 18:41:30', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('9f08e2a95c0c4b9587184f939ffdcd10', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"6b7f066c07f24006b7d21b1f785dd098\",\"id\":\"5d4c3d5cf12e49f5ac65f13abd32d9e0\",\"keykey\":\"mail\",\"name\":\"发送邮件配置\",\"note\":\"发送邮件配置\\r\\nhost:发送服务器地址\\r\\nname:发送账号\\r\\npassword:发送账号密码\\r\\nfrom:发送人信息\"}', 6.418, '2017-07-17 09:54:14', '00E813E51BB2B85757FB8C4BFCBEAEBA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a05dd7acc952427f9828ba1356e5e426', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.014, '2019-05-29 17:55:10', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a0af26c5206c49388897ac123698ee07', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a1d904ec1f87468a8b1b0df371c48a53', 0.014, '2019-05-29 18:46:34', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a138945164164b5f845c37674eb8ebb2', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:b721a1e27e0e4537beb86806f5ccc329', 35.995, '2019-08-06 18:05:39', 'BC7F17AD80C1F9B632BEB4080DEEB49F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a163ba0254a849c39a83a835ff204378', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:W06893', 0.038, '2017-08-01 10:56:18', '7DB2A1739FC74E3FC7AFF2FFE1F71750', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a179700ed0f545b49639c38f019550b1', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:f95565aac05e405f9353e94da23ede07', 47.589, '2019-08-13 10:34:58', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a2ba32d591f643be8dfa72775b599169', 'admin', '超级管理员', '/user/org/save', '组织架构/基础操作-编辑组织', 'ID:53ededeca0f54b719b517f39f10fcac8', 0.042, '2017-07-25 11:46:28', '417611B82CBB2C08859162B31AFDC5D0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a2ce673a728a4342a355ad856b58be53', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y07616', 0.037, '2017-08-03 18:56:34', 'AD664FA227E8A57AE06E9489AD66E634', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a31fb01d9ef9451ba1b8304c9bea839e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:f59561891aa444e6bde702869708f8b8', 0.017, '2019-06-01 17:26:24', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a3446eba047844da92112cce10c17b17', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.011, '2017-09-16 15:43:54', '02BE1A3EA4D32B594A56FCBC8285D278', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a3a072fd3c6b4225b1b44cd8ee09b9dc', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', NULL, 0.008, '2017-07-05 16:57:02', '4FB352C47AC8EADEC89AE80AA90838FD', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('a4778f332816427b9104e595ce1a5e92', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:f10bbb4bed56493c98a3d79938cb5471', 0.012, '2019-05-27 17:57:47', 'EC2B8BB9F0EBBB1DEF32B27DF083C77F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a56326b253094d1f929c9bd3f9fa7abc', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.031, '2019-08-07 16:31:55', '3FCF8CA564BB8F6E44184C8F2FE04BB2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a572e3dbd7844403bff9fcb4c13f10bb', 'admin', '超级管理员', '/module/module/delete', '功能模块/基础操作-删除模块', 'ids:1e5b9b03180346b792ec5024a58c11e6', 0.078, '2019-07-16 08:34:16', '32AB8268DA196281CAD63D4A874FB104', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a5855d90cc014e55a757a419342446c0', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"6b7f066c07f24006b7d21b1f785dd098\",\"id\":\"\",\"keykey\":\"WebUI\",\"name\":\"WebUI\",\"note\":\"\"}', 0.034, '2017-07-13 17:22:29', '7077DD195226FC81601D50217C029FA2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a5df310f0e764c9d89381eea130f5f7b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:8abb6a681dfe4040b8a6a94584f53933', 0.005, '2019-05-29 18:49:10', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a68859cee94e4f65949061a9c5cc0bbc', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:35067a1b3e4343b483d10a00f079a0c8', 0.015, '2019-06-01 17:43:07', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a828eb54b8c94f3bb9534b43017dcf01', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 0.002, '2019-08-16 11:13:52', 'CA15CD1ED6E0E2831CAB8CBD9D7802DB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a82ff0f8767d4d0ea117b1fe1cb9b86d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.011, '2019-06-01 17:59:02', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a84c0ac8e027425bb171f403c8de5b9a', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:1', 0.006, '2019-08-16 10:11:26', '0944E5CB497B7D863F0E5ABC3C2D7D4A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a8be652aecc141aabb8f73588bdf312b', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:dc1ef7cbce0148609767a83de6fd1ba4', 61.089, '2019-08-13 10:29:32', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a8e5e9d7fe6d4a0b9ec920f4d279d618', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:3134140f7bff4ae9ac16ccb0d7204b09', 19.916, '2019-08-13 11:33:26', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a917f5caa71448ae862c159232b2fe9f', 'admin', '超级管理员', '/research/research/saveActive', '调研管理/调研活动类别-编辑', 'ID:bb099f0fb39c414797a2af543782dbe7', 13.126, '2019-08-19 11:01:06', 'A8EB0AF4CD36762F192435615981AA6D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a922b721082a4f8da2108de7b5886458', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:9520c2f6a43846bc928b57de4bae4f36', 0.022, '2019-06-01 17:21:08', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a9310ae3a01b41a78df11012e5876b94', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:39e2af5d600b48ba89a89f8a6dfb150f', 414.367, '2019-08-13 11:11:45', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a9ac6522e32442aeb8c123581347d794', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.014, '2019-07-03 20:36:43', '2BB836E8EBE147B397B9612FF43B22D3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a9c6aeda241e495da9e697f5eff035ab', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.050, '2019-05-30 20:59:41', '344E54811875AF0B3D08D85715AC6F78', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('a9d203a48b934c6786d89523be213c84', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 2.941, '2019-08-16 11:24:12', '5814CE473E43738ABA24C29AB6A2D857', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('aa3ddff55390404ea01abb718ce1058a', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:W04028', 0.036, '2018-01-17 15:38:14', 'DC364672F4281C3621B5AA1572CA8030', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('aaa26458ee5047e2bd1b45188146d6f1', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:f95565aac05e405f9353e94da23ede07', 6.581, '2019-08-13 10:33:35', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('aab5148f4ede4ba1ab20fd9d1ba4876c', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.056, '2019-06-04 10:30:19', '77C4A6F85B5E07722AE3E53B8CBD0E2A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ab1da48b65784e899014c5b5ba2c4f5d', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:a4ad30251d6f4c7e84af9f0a7e4831ab', 4.377, '2019-07-25 10:37:33', 'D887FDE8463C322B0F78A872664752F0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ab5b3cb0c00c46238c42d787fc2f6475', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0fdffe5648e64e0699f9ecb3094f7e6a', 0.028, '2019-06-01 17:32:22', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ab92cb7fb1eb4a139374541cb2af10d5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.057, '2019-05-29 10:54:49', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('abbb1cd423dc46fc9f15f0efe6a9a16a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.018, '2019-05-29 17:59:39', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ac422f02d2374a6487d5e5793599bb49', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:c0de412db2e44d9b9e5616692fc202d8', 0.007, '2019-08-20 16:22:17', 'C12D57528509CADB2483B9D6D3ACD748', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('aca10f4275044b978f2ceea7b734876d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0fdffe5648e64e0699f9ecb3094f7e6a', 0.019, '2019-06-01 17:30:30', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ad95fe81fbbb4c80b50c5a09bd24b0a6', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:6b3516ef3bc4442885c6cf3a322237d0', 0.040, '2019-06-02 09:12:27', 'DBDA233F2A2DBC336B3010A1D6057963', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ae665221cc594472b5c4d51c4b623dac', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.022, '2019-06-01 17:52:55', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('aef5b263e4a2444a983842918335409a', 'admin', '超级管理员', '/user/user/delete', '用户信息/基础操作-删除用户', 'ids:539a551045944c28a9945d0f6cc550c2', 0.048, '2017-08-01 10:55:56', '7DB2A1739FC74E3FC7AFF2FFE1F71750', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('af2b8a39c8274d57a3bc90a3e76fee59', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.014, '2019-05-29 18:41:16', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('afb7ecd848644ddea0ad2b1952eb110b', 'admin', '超级管理员', '/role/role/save', '角色信息/保存', 'ID:d0cf88ca0b96430a860301fd6472f523', 0.048, '2017-07-12 08:49:45', '7148AD04B011418EE0561EBF1BACD662', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b000e7a1a2b64baf9469923345ac9aa7', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:ebfd6227aaf0413496b41de7348928e6', 0.118, '2019-07-03 20:03:29', 'B783CFF2E1FCDC263A07FA12699124C0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b049b0a15c204307bc8533b88e1a0f1d', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:ceshi', 0.243, '2017-07-17 15:39:49', '73BEFD48F82400A031438FA09B824DB1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b07c239508d64665a05ecf81e9d43c22', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:99487e38de02493696da6304919e3fdb', 0.237, '2017-09-16 15:47:16', '644B5D1919C70B531FC6FADFA367D1BF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b0df79bf13c745729cafc4682ebb0689', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:94b9adc653324b2387f5ad1ac2298b30', 0.011, '2019-06-02 10:39:16', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b0f96cff68584b20aa612ae889c8afcc', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:f10bbb4bed56493c98a3d79938cb5471', 0.011, '2019-05-27 17:59:06', 'EC2B8BB9F0EBBB1DEF32B27DF083C77F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b1a97608fe404a1b9440c8ac91e12eb4', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 6.705, '2019-08-19 09:51:01', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b1b05a4c4a40408fbd31082550031675', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:bc7e2748a8aa43bf808f2c0c7df0a641', 19.679, '2019-08-13 11:53:49', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b1b8f24314ac43c6a23112641af7a7a5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.398, '2019-06-18 10:56:48', '1E28B969F5DED1011E378F5EFC0D7FB1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b1f49e9f45e540fab0c32b6d0b2e5fc9', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:ebfd6227aaf0413496b41de7348928e6', 0.026, '2019-07-03 11:44:11', '729178F9BE466B7FC9BF9495C4DFBCA3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b22873817eb046cfa70d783de1ecdcf3', 'admin', '超级管理员', '/role/role/savePermission', '角色信息/设置功能权限-保存功能权限', NULL, 0.025, '2019-08-07 08:26:25', '7EBF077315CDED286364032FED72C26C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b2a4ad61333a47e586c5e8fec8eb3879', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:847723e4606548c6ad6be266877d66e9', 0.023, '2019-05-29 18:46:19', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b2ed5255148b4ddeaa11f3e9e5c252f7', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:83e1002c67b744eaa9ec7595884fedec', 143.672, '2019-08-06 18:08:18', 'BC7F17AD80C1F9B632BEB4080DEEB49F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b2f90dba2cbf462296eafa6a9ddec0b4', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.013, '2019-05-29 18:47:51', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b3294960fe4a4ea7bc1318051f872b07', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:3877e362ae564a18bd4a748d346037a0', 6.118, '2019-05-31 16:18:38', '480F9FA70439841FE27D6C4AE0528DE9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b3790f8885d246abb603a2c9c0051cf5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.007, '2019-05-29 18:47:31', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b38ffc8eb3224d2683cf778d4f6ccbd4', 'Y08066', '靳晓松', '/role/role/delete', '角色信息/删除', NULL, 0.035, '2017-07-05 16:55:27', '4FB352C47AC8EADEC89AE80AA90838FD', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('b437c4eb83f34ac794e040def3a3b4a6', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.034, '2019-05-29 17:51:15', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b45f301f6e0247df9f32b11fec5a44a6', 'admin', '超级管理员', '/exam/question/delete', '试题库管理/试题库管理-删除试题', NULL, 0.000, '2019-07-12 15:02:02', 'A2EFC3F54743C96B06FD08200F306367', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b4fa33f1d6014704ad4bb6df56ef44b8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.048, '2019-07-02 10:38:19', 'A8B2722965054B94F1BBA25924F838FA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b5058a459a2f40ce9e0a88cfd17e55c8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.032, '2019-05-27 16:58:51', '95FFE8716C2D655EC89DCC760E844B08', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b53c802080644d418f1ad6013a8fad3e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.021, '2019-06-01 17:58:30', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b58de57c98b54bfb9abaadb671f69b2c', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y08066', 0.058, '2017-08-03 18:56:08', 'AD664FA227E8A57AE06E9489AD66E634', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b6099fdb5c8f49af962ff4dc21d1c7f3', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:6b3516ef3bc4442885c6cf3a322237d0', 0.117, '2019-06-02 09:13:55', 'DBDA233F2A2DBC336B3010A1D6057963', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b71659db6d854093831101ef63d46b7f', 'admin', '超级管理员', '/train/groupInPlan/delete', '部门计划制定管理/基础操作-删除部门计划内培训计划', 'ids:8f05403762e24703b3807d00bd600598', 0.037, '2019-07-25 10:37:19', 'D887FDE8463C322B0F78A872664752F0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b7a6a3bf4aee4fbd9fe748d446a18f24', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.011, '2019-07-03 11:43:28', '729178F9BE466B7FC9BF9495C4DFBCA3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b841166aaa954129be039199457f8782', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 5.447, '2019-08-16 17:16:46', 'FA4093C7263F2BE657E4530B0F3DA450', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b876a23d850a4c21bf40d0a3c8b56f47', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:76fcaca1ec554105b699d266bf887e77', 0.039, '2019-08-22 10:50:12', 'FB2C930842CB6211F740A2D6B4CC689F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('b8ee7d5e1caf40e98ae941970b23d7cd', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.028, '2019-05-29 17:52:48', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ba844cdeddd245369aeeccc7bd1b75d7', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', NULL, 0.004, '2017-07-06 08:55:17', 'C82A93F9A16DDC2E1FAA7953265FEAEA', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('ba8e4b32228e402e8067ebb6b6ad2383', 'admin', '超级管理员', '/research/research/saveActive', '调研管理/调研活动类别-编辑', 'ID:4e4dd1cab6f742b0a39a7b37614a90b2', 0.007, '2019-08-22 11:00:46', 'FB2C930842CB6211F740A2D6B4CC689F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('badd80d1c5f1499883b0f637178fd499', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:ed1ddc939b354c8f9cd13bf68ff343a9', 5.998, '2019-05-31 20:05:43', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bb11ef07da3d4e728565e424eca97a5a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a69485e310244d39aa6359147077487c', 0.036, '2019-08-07 16:18:12', '834C8F974104810844BFF3604182492E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bb4ac0d014a940b0a70917206ab2c249', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:b4fa7e982d8f4c95ba7798ddef9a1a2d', 0.010, '2019-05-30 21:01:01', '344E54811875AF0B3D08D85715AC6F78', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bc1ea92e06344f8e961e6e101c0ee4ac', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:2e7aacfee36743e9bd9da751c12959a6', 1.974, '2019-07-26 17:32:11', '3FA8BDFEA04D027C6E99D6ED5243B4B1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bc8edd40e27245ac86b937af144231e0', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:dc1ef7cbce0148609767a83de6fd1ba4', 119.895, '2019-08-13 10:39:23', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bcbee34c2211495ebe2a3051e26b1bfd', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.049, '2019-06-01 18:12:41', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bd7f031bb930452a9c96e33d4e4db96c', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.012, '2019-06-01 18:05:39', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bdacd7ba99f246989f8c3a35a9d09ef5', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:d1382a04d6f14f538253be519b991c14', 2.841, '2019-05-30 21:05:02', 'D200C72D6A9BEB3D074926D19F04900C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('be291b8715dd4d4f9e97f86891930ad1', 'admin', '超级管理员', '/train/groupInPlan/delete', '部门计划制定管理/基础操作-删除部门培训计划', 'ids:ed1ddc939b354c8f9cd13bf68ff343a9,d1382a04d6f14f538253be519b991c14,b4fa7e982d8f4c95ba7798ddef9a1a2d', 0.645, '2019-06-01 08:25:11', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('be66f445db9241afb7c340e2bac4a01f', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:ccb23c95e0684637909d4539b7d06866', 178.914, '2019-07-25 16:29:44', '1D33FA6B4179BEDE888FDE7BEF00B322', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bfc4c0035fdf4db188b77db9289718c9', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:2cbc36a1827c4dc18dbade7ffd1aba4a', 0.022, '2019-06-21 18:10:35', '83732FA1FD5A063F1A639CFBF9740F1A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('bfde2dfde225462eab4e71f6f14bcd47', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 23.085, '2017-09-26 15:19:05', 'E0A70FA2EDC1A265AD7059817A6010FE', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c0aae3decf8043c0a48a93430b07d57f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:35067a1b3e4343b483d10a00f079a0c8', 0.052, '2019-06-01 09:14:44', 'E8606997733B98C3DD1CEB61B4B60DAA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c3895d3b18ee49a2b22dd269768269d0', 'Y08066', '靳晓松', '/role/role/delete', '角色信息/删除', NULL, 0.011, '2017-07-04 11:19:54', 'F8BDAF901F920580A32C1C978D38E7B3', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('c45dec3ab84d4200b4277686525c056b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:bdd9a50334a046aaa817000712a074f4', 0.014, '2019-06-01 17:26:32', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c4950cd2562245228e3c0b90c346e4bc', 'admin', '超级管理员', '/role/role/save', '角色信息/基础操作-编辑角色信息', 'ID:2fb9b0ec768c46b9aa525f11d20b447a', 0.027, '2017-08-10 11:10:38', '61D1442BF0A648088451ACD37483C17A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c4c397efb6294a0497512753b6c8342c', 'admin', '超级管理员', '/module/module/save', '功能模块/保存', 'ID:4daeb9e341c7491c8087bfa04ab071b1', 0.048, '2017-07-12 10:05:50', '76C68E0B887BB460A6AB7073929802B7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c501e35fab7b441587bafce66a5f54c8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:d3413c6c860041099d5592787f4038ea', 0.015, '2019-06-13 21:10:54', 'AB17CD653307F29B087B06C313C10D72', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c5636d3d42514db4bcba61b0321122af', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:28c3a95347024c4fb1b6395887a09409', 0.032, '2019-06-02 10:38:06', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c59f0092616948a1b93816ef5b191392', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.005, '2019-05-29 18:47:19', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c5b9e92f72784866a93748e533399ac0', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:1147232aa6774461892e3ae80d67dfe1', 75.388, '2019-08-13 11:30:25', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c62030bbfa7a4405a53154c55f0566aa', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:6c3128d8e98549d4a26bc27f65aa1cb4', 0.035, '2019-07-03 17:32:26', 'B783CFF2E1FCDC263A07FA12699124C0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c791aa7247e34cf69b1ba773d9d31467', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', NULL, 0.006, '2017-07-13 17:23:47', '7077DD195226FC81601D50217C029FA2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c7a4eba5aa7d4f1d9cb8e6b9f824e2c7', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 12.854, '2019-08-19 09:51:35', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c7a5aaa8be88407a8fe64504317de73d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:769c4df7d2ad451dab6df0283c7e9474', 0.016, '2018-01-09 11:11:48', '107ED3C76D8C7B4DEB592481F209ADD7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c8c27021d4194768a4cc7564a2692bdb', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.015, '2019-05-29 18:42:12', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c8e73bc8307d4a958ae65588cfa9a64b', 'admin', '超级管理员', '/groups/groups/delete', '用户组管理/基础操作-删除用户组', 'ids:b9cc624316224293b445a1a238507552', 0.008, '2019-08-16 15:27:34', 'C1964AE0843A6FCA9FFD4B73BB54CF6B', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('c979e2fcf0424dc4a10bdc738459388f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.100, '2019-08-07 16:11:32', '834C8F974104810844BFF3604182492E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ca1873853f264f3c9aaf2d1eee1e5cde', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:6113d204c79f4ddc82a9280165f9cf81', 0.009, '2019-06-01 17:35:24', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ca1a7db952e7463cb9b6be53e99dfd8d', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 27.051, '2019-08-19 09:50:46', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ca8e02fc20b645e5a7d13f6868e02776', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.007, '2019-05-29 18:51:06', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cafd0127c1f948cf9b678c8835776315', 'admin', '超级管理员', '/user/user/save', '用户信息/保存', '登录账号:Y00000', 0.053, '2017-07-11 11:35:48', '2B5BEE353F13094DFAEE10B3FAF63770', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cb6902c6370d44a7ae204bdeb355144c', 'admin', '超级管理员', '/research/research/save', '调研管理/基础操作-编辑调研管理', 'ID:4d59b47f837f4751a542e72fdd10456e', 0.004, '2019-08-16 09:40:18', '056EC9397FA1AF01BB89ADF79940A8B9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cb6916aaf7cb4bd188af594b7b8e68de', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:W02030', 0.006, '2018-01-10 10:25:37', '6764DC9E2F63CB399BC73552C7534EB8', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cc86a8b51be645e1b9f674e021337947', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:8757a06e1b304e4a992fd928cdefb958', 0.004, '2019-07-25 10:21:54', 'D887FDE8463C322B0F78A872664752F0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cd8b027fcd754fa9a90af99d42c55767', 'admin', '超级管理员', '/chat/appVersion/save', 'APP安装包管理/基础操作-编辑应用', NULL, 0.016, '2018-01-09 11:19:16', '107ED3C76D8C7B4DEB592481F209ADD7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ce2c147f5d884e24afb15dcded14a50c', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.041, '2019-07-23 17:50:03', 'CEC00C70EC2B788E89B22D0079A61622', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cecbf9a5ae6c4f8696c20f30378476ec', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:51b630f64d8941599a7f31ded5a13da7', 0.475, '2019-06-13 21:27:48', '1D805886BE8E401D4CFD0ADDAAC83A71', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cf1a2d0572a2465baa7feffb83725048', 'admin', '超级管理员', '/role/role/delete', '角色信息/基础操作-删除角色', 'ids:d2b6702c7f844850b7e067b7165477d2', 0.054, '2017-08-10 11:08:50', '61D1442BF0A648088451ACD37483C17A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cf3716821c23453f8c7cd8aff4400e51', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.045, '2019-07-03 20:35:38', '2BB836E8EBE147B397B9612FF43B22D3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('cfd5563ae2a545c5afc31aa8522f4326', 'admin', '超级管理员', '/role/role/delete', '角色信息/删除', 'ids:282f17fefa574435bde4529b96a6e5fc', 0.066, '2017-07-07 10:21:35', '19090208E62B449F905EAA7565EB8A11', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d03204ca5e35435abc8b96368820873f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:1075ec0b161b417a802850baa3e327bb', 0.009, '2019-06-02 10:51:13', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d05855622d524dbcaf2b501239bd6eb2', 'admin', '超级管理员', '/research/research/save', '调研管理/基础操作-编辑调研管理', 'ID:c57a1548c9fa479aa05c19fdc733d55d', 7.358, '2019-08-16 09:51:32', 'A8C51A77898F010FC1F46915F29297FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d09b5210455d48b1ae9fcd0675930e05', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:be9bff7b9be04526913be68d98980dff', 0.034, '2019-06-02 10:38:18', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d0a0c1c9ccf041d68187b8d9676b2995', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.061, '2019-07-04 10:55:24', 'FAF0629D61821E26501775DD2D8D8B40', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d0e91510538a40eba351ba19b5b3105a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.014, '2019-05-29 18:54:37', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d0f25b58a5c2441da465750f33e672ee', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0d54f933349143e99d2717203fa30886', 4.791, '2019-05-31 08:36:25', '480F9FA70439841FE27D6C4AE0528DE9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d26bbafb11a14c43ba05d6b30b3aa88f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:6bb1c4692c8845ebb435fc945f13fe77', 0.024, '2019-07-02 20:16:09', 'AAA1399AD505C24D5F016A90A641B1FB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d272a7b51c8a433ab4bcf01bedca45d2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.066, '2019-07-04 11:05:48', '3FD58D4A564F6C44B490F155A6AC4246', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d4099061a9ae46ae9e1a61d862b757d8', 'admin', '超级管理员', '/role/role/delete', '角色信息/删除', 'ids:fa971e1c34874555bae063814682b52c', 0.042, '2017-07-04 11:19:07', '2EA9661458AA0A6EF1CE8E1DD698EC2B', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d4452f7455404102baa015b6847ab6f8', 'admin', '超级管理员', '/research/research/saveActive', '调研管理/调研活动类别-编辑', NULL, 5.441, '2019-08-19 10:15:15', '2B7CE432E6EB29287C3C4E402130639B', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d528c0742dae481883ea73f33e738a05', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:32cc72dda23b4c3c8aab3238ddb23993', 0.020, '2019-07-02 10:46:26', 'A8B2722965054B94F1BBA25924F838FA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d56cffef46d04c9e8feef48f16159418', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', 'feedback.contact,sub:123|feedback.stars,sub:4|feedback.problem,sub:sadfasfd|', 0.008, '2017-09-27 09:34:58', 'AE143E112111CD7AA2730BACB4D4FEA2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d630f83d69ba4ee9b32015e46a4f9e47', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', 'ID:', 0.021, '2017-06-30 17:48:16', 'F604A203A9E3DEE1247E0914CC5A2D74', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('d6429d7841f84d00937ba0ffc3a4a6eb', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:ab22561a46a347a187b59720864699dc', 0.016, '2019-08-19 08:42:26', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d6c09f86be6349219c788ba11964d126', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:1b8ce1ffaf584de1b2052e97047041f6', 0.040, '2019-06-01 09:31:40', '5DFC06FB1749FECC257D941090E8E9C4', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d750dbe4afd3442794bb721e53b5c0c4', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y08066', 0.031, '2018-01-09 10:58:31', '908CA1C270373C3B26004513B6DD2ACB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d774a5335c0b42d5a11a2de7a105db22', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:21add52d344f40d2aa7087d5dcfaf0b4', 0.014, '2019-06-02 10:52:02', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d78337c8646f4ec19ab9d1a6887c2b60', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.045, '2019-05-29 18:43:03', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('d7b4e928e3f4464eb0b293c53d35015e', 'admin', '超级管理员', '/train/groupInPlan/delete', '部门计划制定管理/基础操作-删除部门培训计划', 'ids:c5e159fdecd7475986e64664b857402b', 0.016, '2019-07-16 11:50:09', '32AB8268DA196281CAD63D4A874FB104', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('da0efaa4f8db434d9ff05a032ad878f6', 'admin', '超级管理员', '/flowable/flowableTask/expenseSp', '任务查询/流程审批信息', NULL, 0.364, '2019-07-04 17:31:47', 'ADB13A1540FFB2814355F209A5412EDF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('da6456cdac3d49df8a6928d10660260c', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.013, '2017-09-16 16:44:38', '81B70B6BDDB9F69C17650DF01AE27A89', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('daa2392f8ceb4fff84b78c6ba3f481f1', 'admin', '超级管理员', '/flowable/processDeploy/save', '流程部署/保存流程信息', NULL, 1.891, '2019-07-04 17:38:29', '7F89531D132142B3BB026E1D0879A6C8', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('dab92c8f6d6746a59290bb51ea45bf53', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e40528451cca424ea7760eb4bf2ef4a6', 0.021, '2017-09-16 15:44:54', '02BE1A3EA4D32B594A56FCBC8285D278', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('daf3da166f2843f5b0e790512d581b0e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:832545802f1c470393c17958775c8a09', 0.021, '2019-06-01 17:43:48', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('dc26786e5ada48ffa0b7b264e53100b7', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.017, '2019-05-29 18:49:53', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('dc371012d19c461dbc67da49a841fd7e', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 249.173, '2019-08-16 18:04:07', 'FA4093C7263F2BE657E4530B0F3DA450', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('dc730a851cb1444ab807dac43a96373a', 'admin', '超级管理员', '/exam/question/delete', '试题库管理/试题库管理-删除试题', NULL, 0.067, '2019-06-18 08:50:29', '2F809411F2803D9D9D935FB5F2289C9C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('dca0b7ff93d942ab8284b2aa6d6ecf94', 'admin', '超级管理员', '/research/research/deleteActive', '调研管理/调研活动类别-删除', 'ids:bb099f0fb39c414797a2af543782dbe7', 3.786, '2019-08-19 11:01:53', 'A8EB0AF4CD36762F192435615981AA6D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('dd1fd6793af7423cb72f798e76729f0a', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', 'asdad', 0.031, '2017-09-26 17:15:17', 'E5A82279FCCBE1A569F0E46D8D866AF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('dd4e6fec2b7b4ea4b5d13bc6ea39077c', 'admin', '超级管理员', '/role/role/selectUsersToRole', '角色信息/设置角色用户-添加用户', NULL, 0.017, '2019-08-07 16:41:57', '759D243B757123E5010EE86670E31591', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ddb576420525474fb26fa9b50576b4a0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:45f33ac771c347a8b358e6c93e2fdecc', 0.028, '2019-05-30 20:57:21', '344E54811875AF0B3D08D85715AC6F78', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('dde31834372d4e168ed950e553f14501', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:409da7903ba14106b0bab9d83074e152', 0.032, '2019-05-29 12:06:21', '2341158D095C62846B397CEB2225454F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('df20551a9664477199fe1ef9020e54ec', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:9f65cf6479e64916bf27bfd3e2a652a6', 0.046, '2019-08-09 11:55:29', '477DBD8E71FE6BA4EEE3A42389F63A7E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('df2e072d0063460c9556f91cdc37bde6', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:f59561891aa444e6bde702869708f8b8', 0.034, '2019-06-01 17:32:29', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('df95cd0554114e519c67e70b3595e206', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.035, '2019-05-29 17:58:13', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e04bc8c3da884c56a41af2e63853d67a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.043, '2019-05-29 10:55:24', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e0d1a4fa55bc4cf5b24139e09f486af1', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:3df773b762d54053bf6e9f3b53a0184c', 0.021, '2019-06-02 10:18:29', '91F0AD74375870E23BE9792BF71296AA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e15308d106a54cffb6b15939a80342cf', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 14.981, '2019-08-16 16:29:00', 'BF5E88AAE85A0B0F6156A35437E38A54', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e156d6f37afc4a47b7088cb8d1f94831', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:28c3a95347024c4fb1b6395887a09409', 0.012, '2019-05-29 10:58:28', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e272d5e4684c451f8e02abcc76ef315b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.160, '2019-07-03 11:43:06', '729178F9BE466B7FC9BF9495C4DFBCA3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e3141b96fe0446588c3ea21f91f60bb3', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.027, '2019-05-29 18:47:40', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e3a5e2ced22240a6bddbf76f237eb1c9', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.012, '2019-05-29 17:49:44', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e3af3ffe6dcf4a6194fafb2c43f3d364', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.022, '2019-06-01 17:57:43', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e4137e8982424c7c9bb510c68bc5ebbc', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:a5c69216801440958961c3055d144082', 0.021, '2019-06-02 10:52:10', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e47dd735c51f40929af400be3af4b9d7', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.341, '2017-09-26 09:34:05', 'A183D3A6FA9ED293B05437280402C844', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e4aea1de798644fcadfa66cab0efaec3', 'admin', '超级管理员', '/train/groupInPlan/delete', '部门计划制定管理/基础操作-删除部门计划内培训计划', 'ids:a4ad30251d6f4c7e84af9f0a7e4831ab', 0.027, '2019-07-25 16:39:07', '1CC9EC31BF8F079ECBF01F2090526259', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e4caf445df53450ba41f111b454dc1b6', 'admin', '超级管理员', '/role/role/save', '角色信息/保存', 'ID:', 0.032, '2017-06-30 17:23:59', 'D080DF6C3B6588CDF5EE80FBE6F9C35A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e504f0901c7945bf854aa364cb02e56f', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 0.132, '2017-09-26 10:43:01', 'CC456E9944BCAFC2739BB44A35C73BC1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e548ba48882444e8bf4a7b40e721ca29', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:5d05c8586b124e43a6e95df5f58152e5', 0.013, '2019-06-02 10:51:27', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e54db6743e014f238fd794d0ec0522c7', 'admin', '超级管理员', '/role/role/savePermission', '角色信息/设置功能权限-保存功能权限', NULL, 0.017, '2019-08-07 16:41:28', '759D243B757123E5010EE86670E31591', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e5b32d56bc0a401fa378a475f4bf902e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.019, '2019-07-02 10:46:53', 'A8B2722965054B94F1BBA25924F838FA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e5f18349172d4b59993b2e130e53ad98', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:409da7903ba14106b0bab9d83074e152', 0.040, '2019-05-29 14:46:29', '31D97EDC2F063470D4528BE77E62EF84', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e68f525d666e467cb833260f8370b6ee', 'Y08066', '靳晓松', '/role/role/save', '角色信息/保存', 'ID:', 0.031, '2017-07-04 08:24:05', 'F0CECDD649CA95486F6D37D536932E16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('e6ca6981b1684dc4b5d48ea32247b1ba', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:beb8c920fd7248e8b904712146163f4a', 292.770, '2019-08-16 09:26:34', '056EC9397FA1AF01BB89ADF79940A8B9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e6f56ba3906b4addb4a9bc3e69a5176c', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研管理-删除', 'ids:1', 11.202, '2019-08-16 11:09:37', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e7f1b97666cc46efbcb47d79c3f84ce2', 'admin', '超级管理员', '/feedback/feedback/save', '问题反馈/问题反馈-编辑信息', NULL, 42.038, '2017-09-26 11:36:45', 'CC456E9944BCAFC2739BB44A35C73BC1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e89614bb1720465a86c17fe92349932a', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:858225136e72414b803c2d9dec47c1fa', 0.047, '2019-06-01 15:56:55', 'CF589AA48E9A2A5CDDBFF7F043B0457E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e8bc5122c0844dfe99c14402179e8831', 'admin', '超级管理员', '/user/org/save', '组织架构/基础操作-编辑组织', 'ID:9859c597de5544e69973b6ff0c57013b', 0.045, '2017-07-25 11:46:31', '417611B82CBB2C08859162B31AFDC5D0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e8e7718725394d6b9904e058bf3ce54d', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:661c67b0892b41acb2b0d5e42db4de68', 0.147, '2019-05-31 19:57:46', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e8f855e5ac7f42f5a887e4ae5ccff53f', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:f10bbb4bed56493c98a3d79938cb5471', 0.016, '2019-05-29 08:30:57', 'AB454954F9023667A2657B18ED8950F6', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('e98d5c825d4245cc93b6c97461a6ae6b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.019, '2019-07-04 17:10:54', 'E1EA7BDBF9F1D678BCE0573A350EA5C7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ea14f6fd1bf641419f7db22abd483de8', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.046, '2019-05-29 10:55:38', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ea1da65107a041b29cf7bf4c6387aadb', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.013, '2019-05-29 18:40:28', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('eaf78588eb474996bd563ede9287db4a', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 48.987, '2019-08-16 11:32:00', '14F8AF1AA67542E6F21AD65E00B32556', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('eb0a9970e7d4497fb61a6ae145689fb3', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.029, '2019-05-29 17:49:16', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('eb245c1ec1f748fc92c20e06d461367d', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:633658f9091a4eb8ac301ae586a3b667', 0.005, '2019-05-31 20:07:54', '08F06DEC8A3CFD751FE305A507D3D6CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('eb40558a4db44a51a6e2d2c00cb81897', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:128ab5989d27461e9fddeb9fae200991', 0.029, '2019-07-02 19:45:07', 'C1EB3C2409DCA7F6B46F037414A4744D', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('eca05ffbd952439ab80c554101f1b8bc', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:07d83d8001a54e3e9f5f9b0b3a31d2cd', 0.011, '2019-08-16 11:04:21', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ecf238cbe72b4ddeb7d2611bc352b885', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', 'ID:6c72a8da1fe246e9a92c2185b5317630', 0.008, '2017-06-30 09:33:20', '031EA3DE366AC2428F6320DEDA9BA2EE', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('ecfb19183e70433799c3d0d199df6dc4', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0733453a1eb74e2a8de63def8d92d41c', 0.022, '2019-07-22 15:49:13', 'DBB2574D851C95E90B13E3F5AF0187F9', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ed24067244754154a91406bad7e1fba0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:4bbb6d872e654640b22bf354901ef5ae', 0.058, '2019-07-04 10:01:19', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ed3680d302cb4465a6bf8ec6953866aa', 'admin', '超级管理员', '/user/org/save', '组织架构/基础操作-编辑组织', 'ID:96f6400cb8c44f69af01ae24ddb94441', 0.000, '2018-01-09 15:45:01', '30A1D359E1336A18E0812CD5186317F1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ed863a9c08ec4e7dafcccab8dacd7f88', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.018, '2019-05-29 18:40:06', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ee4908f1f1f2458b9a34a7a1f74e9c58', 'admin', '超级管理员', '/user/org/save', '组织架构/基础操作-编辑组织', 'ID:23bbc6c7403740119b17d8d8cd5d3d41', 0.040, '2017-07-18 10:17:57', '6B1D4B38000592B06C18CCCBF79B3095', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ef990bba385340daab3983c75195a0fe', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:d65260af0fef45899a8c824c7c56389c', 0.033, '2019-06-01 17:17:36', '954B0C00FDCA0D4BE56E83F09379B87C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('efcf8cbecd0340739353fe06774fefa3', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.011, '2019-05-29 18:43:28', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('efd0310af4cf4eebabe8092a40744ad5', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:7089064a6769448e9c20843b5eae33f8', 0.037, '2019-07-04 17:09:43', 'E1EA7BDBF9F1D678BCE0573A350EA5C7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f07c0df86218440c8e0ca8023694b81c', 'admin', '超级管理员', '/flowable/flowableTask/expenseSp', '任务查询/流程审批信息', NULL, 0.178, '2019-07-04 17:52:13', '7F89531D132142B3BB026E1D0879A6C8', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f09e770e9a684ee3a1c2096cc6b98ec0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.035, '2019-06-24 19:34:34', 'AA0675CFE881FA4E494740693EAD7416', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f1070f1475f442b0b6b3f97ab8ab6ed6', 'Y08066', '靳晓松', '/role/role/delete', '角色信息/删除', 'ids:ba0d2348873c4d9c8447bbcd536c8edf', 0.016, '2017-07-04 11:25:47', 'F8BDAF901F920580A32C1C978D38E7B3', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('f1efc05202e742a6971d5568aaede736', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.053, '2019-07-04 10:00:42', '7FFDF26366833879996E025169DAA3C1', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f21171c68f1441ca98ff9a30f7bf509e', 'Y07617', '程靖', '/role/role/save', '角色信息/保存', NULL, 0.006, '2017-07-04 08:42:55', 'B09EC7BC65DE9407ED212E99A55401DD', '9c4ec5025ba140808e9fe44f3cc848ff'); +INSERT INTO `jcdp_sys_log` VALUES ('f301550a3022465095b8256c6535df08', 'admin', '超级管理员', '/role/role/save', '角色信息/保存', 'ID:ed9f9f87ad434056ae2ff2e2fec0bba0', 0.013, '2017-07-04 11:05:00', '04FD2F1E9353F8942A1DC011736E0EE0', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f3915bc715d74fe5925e86fc4a5752bd', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.038, '2019-05-29 18:57:03', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f396f5cd09604f9e9a342e54f8cec2bf', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:ab22561a46a347a187b59720864699dc', 0.023, '2019-08-19 08:49:28', '030E31A91E61E3EED8B811CC646182FD', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f4cd726fb428468497eac13b1649f618', 'admin', '超级管理员', '/chat/appVersion/save', 'APP安装包管理/基础操作-编辑应用', NULL, 0.015, '2018-01-09 14:00:09', 'FA9F3BF870B14C04D9F429CBBD0A0258', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f4d33573bb9240d583a3f8f7af23d7df', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.032, '2019-05-29 10:59:33', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f4e0ef96c2d14e95af0b01c31fc5e04d', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:3ca66b200282492cb191d81d372b5317', 0.019, '2019-06-24 10:08:47', 'E05B58CD7DE256FE4A56FB232B703FEF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f5009301f2294d829250768471146b02', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:409da7903ba14106b0bab9d83074e152', 0.057, '2019-05-29 17:42:42', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f52589916c77457b9a0023513c174626', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:d1382a04d6f14f538253be519b991c14', 0.019, '2019-05-30 21:02:48', 'D200C72D6A9BEB3D074926D19F04900C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f58de12acc684e3487b40156babe2cae', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:d1382a04d6f14f538253be519b991c14', 23.938, '2019-05-30 21:04:04', 'D200C72D6A9BEB3D074926D19F04900C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f5d7a6eb77484c258f9e1a068d715e58', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:583727a894d84c2fbb87344c412dbda8', 0.076, '2019-07-04 17:11:04', 'E1EA7BDBF9F1D678BCE0573A350EA5C7', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f657598798d243f690f37a84928506c3', 'admin', '超级管理员', '/groups/groups/save', '用户组管理/基础操作-编辑用户组信息', 'ID:1147232aa6774461892e3ae80d67dfe1', 0.460, '2019-08-13 11:11:59', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f6974be8def248aabe89aa087b815fe4', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.031, '2019-05-29 10:55:51', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f6fc0fe384ee474994311fc1e69f4b9d', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:6c3128d8e98549d4a26bc27f65aa1cb4', 0.052, '2019-07-03 11:44:04', '729178F9BE466B7FC9BF9495C4DFBCA3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f724853e5b6c4ca3854a0da2e7b9f31d', 'admin', '超级管理员', '/dict/dict/save', '字典参数/基础操作-编辑', '{\"category\":\"6b7f066c07f24006b7d21b1f785dd098\",\"id\":\"854f99d670914902a804d3b2f2edc9ea\",\"keykey\":\"WebUI\",\"name\":\"前端样式\",\"note\":\"\"}', 0.047, '2017-07-13 17:22:42', '7077DD195226FC81601D50217C029FA2', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f7979d04bd8c44689ff060983e323194', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.017, '2019-05-29 18:45:00', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f8f1946bd417439db637ebf90e95453a', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门计划内培训计划信息', 'ID:b721a1e27e0e4537beb86806f5ccc329', 0.017, '2019-08-06 18:04:28', 'BC7F17AD80C1F9B632BEB4080DEEB49F', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f98ab75104764b7c95b4273980b5630b', 'admin', '超级管理员', '/research/research/delete', '调研管理/调研活动类别-删除', NULL, 19.045, '2019-08-16 11:12:23', 'CA15CD1ED6E0E2831CAB8CBD9D7802DB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('f9f1bb5fabd24c5fbcba8b646574f395', 'admin', '超级管理员', '/research/research/deleteExam', '调研管理/调研管理-删除', 'ids:1', 20.270, '2019-08-16 17:15:13', 'FA4093C7263F2BE657E4530B0F3DA450', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fa311233b0d646a79b73c07f0b18e4b0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:d8cf20704ca3456fadc5df18b9e2f56a', 0.022, '2019-07-02 10:46:34', 'A8B2722965054B94F1BBA25924F838FA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fa8a26fb564c4ab6a64cf2e8d47ee48a', 'admin', '超级管理员', '/train/groupInPlan/save', '部门计划制定管理/基础操作-编辑部门培训计划信息', 'ID:f18ffc313c8e480eacbbb69a7b59eb18', 14.712, '2019-06-24 10:40:05', '99E2BD43028FC12CB339476D20775F6A', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fab59b1824c042d297b225e04bd9e9fa', 'Y08066', '靳晓松', '/role/role/delete', '角色信息/删除', NULL, 0.013, '2017-07-04 11:20:19', 'F8BDAF901F920580A32C1C978D38E7B3', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_log` VALUES ('fad5b71f03b146a79cd645d41c177d44', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.052, '2019-07-03 20:34:08', '2BB836E8EBE147B397B9612FF43B22D3', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('faf78848d34f4399b28eb38cf60104fc', 'admin', '超级管理员', '/user/user/save', '用户信息/基础操作-编辑用户信息', '登录账号:Y07616', 0.038, '2017-08-03 11:55:15', 'DDAE7C263564A118A71C560BF4DF60EB', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fbb8f2a372c44b80b514415d85d1bd4b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.023, '2019-05-29 17:53:03', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fbbbd086296e4aa9a72b3adf33cb1173', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.063, '2019-07-04 11:25:50', '15DB6C4D7DDC3BD1FB010FBC49F115CC', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fbbd5c789ca04d948b56e1299774e521', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:d65260af0fef45899a8c824c7c56389c', 0.233, '2019-06-01 17:00:02', '000CAF3DD5C0DBD587952DF64FE00CC6', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fc2d7d50a42e4776afe2f1ba7315c3f4', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:e311bca4eeba42a79ebc3f0f3cfbe419', 0.053, '2019-06-02 10:18:54', '91F0AD74375870E23BE9792BF71296AA', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fd0c9caac14342e9a4eb3f301b83ddc2', 'admin', '超级管理员', '/research/research/save', '调研管理/调研管理-编辑', 'ID:2e70dee96dcf44eea47a6f28a7f8f177', 0.003, '2019-08-16 11:04:41', 'DEB100E2A6572361FF471958C6EF5CF5', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fd236a421eb5483b85acb12a2482be2b', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:0182e3bbc4044b479250bd870275f8b1', 0.422, '2019-06-25 16:41:53', '0270591B99B75B6FE4BE4DC1871F7B9C', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fd7019166c0043908473503ca8609fed', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:b121de0f81a748beb1bc66b202479255', 0.053, '2019-06-01 08:35:44', '15C23DAF61B4C402E6A0815FFA01BAEF', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fd7c01f172c04f9994e8c090fbaea34f', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:7089064a6769448e9c20843b5eae33f8', 0.021, '2019-06-05 08:43:37', '8A57DC4423D835B9D0732D487D39262E', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('fdfda82d653844f8af5498f1add3a6a2', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:4bbb6d872e654640b22bf354901ef5ae', 0.028, '2019-06-02 10:51:06', 'F86DD1B85F24F964CC44BE9BEC549A25', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ff3cc82cc0f24e45aebe41902b37454e', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.023, '2019-05-29 10:59:46', '1BC5FC904BEA220B2B376BB40D587649', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ff751ab7470c48b2bc054a6e068e59a0', 'admin', '超级管理员', '/module/module/save', '功能模块/基础操作-编辑模块', 'ID:', 0.027, '2019-05-29 17:55:55', '9A0D1140D1D5D9826E95207320294768', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_log` VALUES ('ffe6910307964c0b95493f66ebc8c72d', 'admin', '超级管理员', '/user/org/save', '组织架构/基础操作-编辑组织', 'ID:23bbc6c7403740119b17d8d8cd5d3d41', 0.016, '2018-01-09 15:44:22', '30A1D359E1336A18E0812CD5186317F1', 'fe24c4ac34444902a2129ec1debf9ed4'); + +-- ---------------------------- +-- Table structure for jcdp_sys_module +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_module`; +CREATE TABLE `jcdp_sys_module` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `CASCADE_ID` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '节点语义ID', + `NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '功能模块名称', + `HREF` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '主页面URL', + `HOTKEY` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '热键', + `PARENT_ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父节点流水号', + `IS_LEAF` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否叶子节点', + `IS_AUTO_EXPAND` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否自动展开', + `ICON_NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点图标文件名称', + `STATUS` decimal(1, 0) NULL DEFAULT NULL COMMENT '当前状态', + `PARENT_NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父节点名称', + `VECTOR` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '矢量图标', + `SORT_NO` decimal(5, 0) NULL DEFAULT NULL COMMENT '排序号', + `MODULETYPE` decimal(1, 0) NULL DEFAULT NULL COMMENT '模块类型', + `ACTIONVALUE` decimal(20, 0) NULL DEFAULT NULL COMMENT '权限值', + `DISPLAY` decimal(1, 0) NOT NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_module +-- ---------------------------- +INSERT INTO `jcdp_sys_module` VALUES ('004e01c7a9e24a45aa30fc4182cc910a', '|root|ba85127869a3419cbc279cf959967547|004e01c7a9e24a45aa30fc4182cc910a|', '证书管理', '/train/plantodo/certificateindex', NULL, 'ba85127869a3419cbc279cf959967547', 0, 0, '', 1, '教育培训计划实施', NULL, 7, 1, 232, 1); +INSERT INTO `jcdp_sys_module` VALUES ('00f9800eb9884bc392a17c1ff78e6ac4', '|root|be9bff7b9be04526913be68d98980dff|a1d904ec1f87468a8b1b0df371c48a53|00f9800eb9884bc392a17c1ff78e6ac4|', '页面权限', NULL, NULL, 'a1d904ec1f87468a8b1b0df371c48a53', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 0, 0); +INSERT INTO `jcdp_sys_module` VALUES ('0182e3bbc4044b479250bd870275f8b1', '|root|40aa8106fa8f48ab97507b221606732f|0182e3bbc4044b479250bd870275f8b1|', '资料分类管理', '/resource/file', NULL, '40aa8106fa8f48ab97507b221606732f', 0, 0, '', 1, '学习资料管理', NULL, 1, 0, 218, 1); +INSERT INTO `jcdp_sys_module` VALUES ('023c068bb5cc41eda1ea3af100ec0aee', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|4daeb9e341c7491c8087bfa04ab071b1|285b1b61e465418d8a09a896ae4b98e5|023c068bb5cc41eda1ea3af100ec0aee|', '基础操作-编辑', '/dict/dict/save', NULL, '285b1b61e465418d8a09a896ae4b98e5', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 20, 0); +INSERT INTO `jcdp_sys_module` VALUES ('02a1f6a6ed0f41f98221b886032fd79f', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|db720fda636847ac9dd7927a30f42538|02a1f6a6ed0f41f98221b886032fd79f|', '页面权限', NULL, NULL, 'db720fda636847ac9dd7927a30f42538', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 9, 0); +INSERT INTO `jcdp_sys_module` VALUES ('02d034df6d6047bf81cdaa630dba3d57', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|06959fba43e54a98a5902bc90cede514|e3b370a851ec440391f8c4531b66f7ed|02d034df6d6047bf81cdaa630dba3d57|', '日志列表', '/log/log/list', NULL, 'e3b370a851ec440391f8c4531b66f7ed', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 81, 0); +INSERT INTO `jcdp_sys_module` VALUES ('0622f813f97a44a4be1b7a145b3ad11d', '|root|510998e99c924665806c0e20bbbcc2b2|0622f813f97a44a4be1b7a145b3ad11d|', '经济责任制单位外派培训', '', NULL, '510998e99c924665806c0e20bbbcc2b2', 0, 0, '', 1, '所外派培训', NULL, 2, 0, 272, 1); +INSERT INTO `jcdp_sys_module` VALUES ('06959fba43e54a98a5902bc90cede514', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|06959fba43e54a98a5902bc90cede514|', '操作日志', '/log/log', NULL, 'b5573ec04afe4602b4b17775ac300267', 0, 0, 'hand_property.png', 1, '监控与审计', NULL, 1, 1, 78, 1); +INSERT INTO `jcdp_sys_module` VALUES ('074cf1c8ba7641feb4cd37bc5cbd3abf', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|074cf1c8ba7641feb4cd37bc5cbd3abf|', '部门领导审批', '/train/groupInPlan/groupindex?pg=3', NULL, 'e84381fd49f54ae487e241f152e808d0', 0, 0, '', 1, '部门级计划内计划制定', NULL, 3, 1, 240, 1); +INSERT INTO `jcdp_sys_module` VALUES ('0813b19ea7aa4df385ea0e23ae0feff9', '|root|ba85127869a3419cbc279cf959967547|0813b19ea7aa4df385ea0e23ae0feff9|', '效果评估', '/train/plantodo/createclassindex?pg=6', NULL, 'ba85127869a3419cbc279cf959967547', 0, 0, '', 1, '教育培训计划实施', NULL, 5, 1, 198, 1); +INSERT INTO `jcdp_sys_module` VALUES ('08182cd54f1549baa052b56421ddb6d4', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|08182cd54f1549baa052b56421ddb6d4|', '已生成所级培训计划', '/train/institutePlan/instituteindex', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 9, 1, 264, 1); +INSERT INTO `jcdp_sys_module` VALUES ('08573a697db342149a26e5b20ce03975', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|08573a697db342149a26e5b20ce03975|', '设置功能权限-保存功能权限', '/role/role/savePermission', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 122, 0); +INSERT INTO `jcdp_sys_module` VALUES ('09d56400d8a547d2a2b4acd220659878', '|root|b56cfe82381e4519b873e345022785a3|09d56400d8a547d2a2b4acd220659878|', '试卷库', '/exam/exampaper', NULL, 'b56cfe82381e4519b873e345022785a3', 0, 0, '', 1, '考试管理', NULL, 2, 1, 260, 1); +INSERT INTO `jcdp_sys_module` VALUES ('0d8e0be0771e4dfca4c10a5d5b7d258a', '|root|28c3a95347024c4fb1b6395887a09409|0d8e0be0771e4dfca4c10a5d5b7d258a|', '流程管理', NULL, NULL, '28c3a95347024c4fb1b6395887a09409', 0, 1, 'folder_page.png', 1, '系统管理', NULL, 4, 0, 3, 1); +INSERT INTO `jcdp_sys_module` VALUES ('0dec6b66eff04079a62ce323f28c6d82', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|7d6279051f5e4d3ba6de1e13b71e405b|0dec6b66eff04079a62ce323f28c6d82|', '基础操作-更新模块信息', '/module/module/updateAllModule', NULL, '7d6279051f5e4d3ba6de1e13b71e405b', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 39, 0); +INSERT INTO `jcdp_sys_module` VALUES ('1075ec0b161b417a802850baa3e327bb', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|1075ec0b161b417a802850baa3e327bb|', '部门领导审核', '/train/outtrain/?pg=2', NULL, 'b9c62e8e49994504804bb3707b865dd0', 0, 0, '', 1, '非经济责任制单位外派培训', NULL, 2, 1, 210, 1); +INSERT INTO `jcdp_sys_module` VALUES ('108ab8db661c425ea5a4249b9d4728b5', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|', '用户信息', '/user/user', NULL, 'd1db8883db7f4bc2a03253a2c94aa0bf', 0, 0, 'user.png', 1, '权限管理', NULL, 3, 1, 62, 1); +INSERT INTO `jcdp_sys_module` VALUES ('10eba428e3b24f7a90e68b3ca587020e', '|root|975338ae351a4a19af2032fc360af687|10eba428e3b24f7a90e68b3ca587020e|', '流程部署', '/flowable/processdeploy', NULL, '975338ae351a4a19af2032fc360af687', 0, 0, '', 1, '任务管理', NULL, 5, 1, 280, 1); +INSERT INTO `jcdp_sys_module` VALUES ('112458d1867f43b4ab93450054eb67e2', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|edf9044b8ab74e99b53a3f7df0dff0b3|112458d1867f43b4ab93450054eb67e2|', '编辑', '/train/groupInPlan/editPage', NULL, 'edf9044b8ab74e99b53a3f7df0dff0b3', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 294, 0); +INSERT INTO `jcdp_sys_module` VALUES ('128ab5989d27461e9fddeb9fae200991', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|128ab5989d27461e9fddeb9fae200991|', '所级培训管理员发起调研', '/train/institutePlan/researchindex?pg=6', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 6, 1, 247, 1); +INSERT INTO `jcdp_sys_module` VALUES ('12a2c30b9eda4a98a8be1d24dc5cecef', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|12a2c30b9eda4a98a8be1d24dc5cecef|', '页面权限', NULL, NULL, '61f47b38b6b74740af8a6cd44ca5d654', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 23, 0); +INSERT INTO `jcdp_sys_module` VALUES ('17cb1a4f18d64521873256ddddbc1d07', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|17cb1a4f18d64521873256ddddbc1d07|', '数据权限', NULL, NULL, 'a69485e310244d39aa6359147077487c', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 286, 0); +INSERT INTO `jcdp_sys_module` VALUES ('18806dca123047ff92baa512e0b9a4e8', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|68d13963526748ab82a99116f190a996|18806dca123047ff92baa512e0b9a4e8|', '1.个人角色', '/role/role/list', NULL, '68d13963526748ab82a99116f190a996', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 1, 0); +INSERT INTO `jcdp_sys_module` VALUES ('18b7bf0dce2a4b9eae619ca25695392c', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|df9a01cd017f40ee89630f6d2e8bdb24|18b7bf0dce2a4b9eae619ca25695392c|', '列表', '/dict/category/list', NULL, 'df9a01cd017f40ee89630f6d2e8bdb24', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 25, 0); +INSERT INTO `jcdp_sys_module` VALUES ('1a50ab664a0b4314a8230fe3b887f47b', '|root|975338ae351a4a19af2032fc360af687|583727a894d84c2fbb87344c412dbda8|1a50ab664a0b4314a8230fe3b887f47b|', '我的证书', '', NULL, '583727a894d84c2fbb87344c412dbda8', 0, 0, '', 1, '个人中心', NULL, 3, 0, 165, 1); +INSERT INTO `jcdp_sys_module` VALUES ('1addcf39f9e347608881a3138f42ba08', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|17cb1a4f18d64521873256ddddbc1d07|1addcf39f9e347608881a3138f42ba08|', '获取对象', '/train/groupInPlan/getById', NULL, '17cb1a4f18d64521873256ddddbc1d07', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 295, 0); +INSERT INTO `jcdp_sys_module` VALUES ('1b4580ed574c4758ab419dcf9cb6a849', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|1b4580ed574c4758ab419dcf9cb6a849|', '页面权限', NULL, NULL, '4e678e835de1411ea5c2e29763eb2d6e', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 30, 0); +INSERT INTO `jcdp_sys_module` VALUES ('1b8ce1ffaf584de1b2052e97047041f6', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|1b8ce1ffaf584de1b2052e97047041f6|', '部门培训管理员填写', '/train/institutePlan/groupindex?pg=2', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 2, 0, 184, 1); +INSERT INTO `jcdp_sys_module` VALUES ('1d22330fe3b148acb2c1ad157fc20bc1', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|4daeb9e341c7491c8087bfa04ab071b1|285b1b61e465418d8a09a896ae4b98e5|1d22330fe3b148acb2c1ad157fc20bc1|', '基础操作-删除', '/dict/dict/delete', NULL, '285b1b61e465418d8a09a896ae4b98e5', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 18, 0); +INSERT INTO `jcdp_sys_module` VALUES ('1f2cdd5358df4f7fad4beff81c515b20', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|1f2cdd5358df4f7fad4beff81c515b20|', '基础操作-用户列表', '/user/user/list', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 131, 0); +INSERT INTO `jcdp_sys_module` VALUES ('20c40af7e47e41acb89c62a645b8380c', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|49c6c9345d94413c8bd1e049ffacc65b|20c40af7e47e41acb89c62a645b8380c|', '1.所属部门', '/user/org/list', NULL, '49c6c9345d94413c8bd1e049ffacc65b', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 1, 0); +INSERT INTO `jcdp_sys_module` VALUES ('2128fb4ae5f949b3ba8da371de78ecb0', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|2128fb4ae5f949b3ba8da371de78ecb0|', '页面权限', NULL, NULL, 'de1834427ca54f4e80337f73ccc5359a', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 85, 0); +INSERT INTO `jcdp_sys_module` VALUES ('214fe2aeb48a4878a3e0ee9237d53930', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|db720fda636847ac9dd7927a30f42538|e9097e65fde94905a6be071344f0d3c7|214fe2aeb48a4878a3e0ee9237d53930|', '基础操作-编辑', '/dict/sysParameter/save', NULL, 'e9097e65fde94905a6be071344f0d3c7', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 11, 0); +INSERT INTO `jcdp_sys_module` VALUES ('21add52d344f40d2aa7087d5dcfaf0b4', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|21add52d344f40d2aa7087d5dcfaf0b4|', '部门领导审核', '/train/outtrain/registerindex?pg=7', NULL, 'b9c62e8e49994504804bb3707b865dd0', 0, 0, '', 1, '非经济责任制单位外派培训', NULL, 7, 1, 215, 1); +INSERT INTO `jcdp_sys_module` VALUES ('23294a1242994c27b1f51aef9d1e2a82', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|12a2c30b9eda4a98a8be1d24dc5cecef|23294a1242994c27b1f51aef9d1e2a82|', '分类科目-主界面', '/dict/category/index', NULL, '12a2c30b9eda4a98a8be1d24dc5cecef', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 27, 0); +INSERT INTO `jcdp_sys_module` VALUES ('2546fe263a5c4d0cae6e29de60adc646', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|49c6c9345d94413c8bd1e049ffacc65b|2546fe263a5c4d0cae6e29de60adc646|', '3.全部部门', '/user/org/list', NULL, '49c6c9345d94413c8bd1e049ffacc65b', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 4, 0); +INSERT INTO `jcdp_sys_module` VALUES ('26986f46d8ab42d193b59fbc51eed8bd', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|df9a01cd017f40ee89630f6d2e8bdb24|26986f46d8ab42d193b59fbc51eed8bd|', '基础操作-删除', '/dict/category/delete', NULL, 'df9a01cd017f40ee89630f6d2e8bdb24', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 26, 0); +INSERT INTO `jcdp_sys_module` VALUES ('270c3b2296194e9faf9857c128450c5f', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|270c3b2296194e9faf9857c128450c5f|', '设置角色用户-修改角色授权', '/role/role/updateRoleUsersRoleType', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 141, 0); +INSERT INTO `jcdp_sys_module` VALUES ('272fe7c8d5f44963abbd96d9b7e14499', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|df9a01cd017f40ee89630f6d2e8bdb24|18b7bf0dce2a4b9eae619ca25695392c|272fe7c8d5f44963abbd96d9b7e14499|', '1.系统缺省', '/dict/category/list', NULL, '18b7bf0dce2a4b9eae619ca25695392c', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 1, 0); +INSERT INTO `jcdp_sys_module` VALUES ('285b1b61e465418d8a09a896ae4b98e5', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|4daeb9e341c7491c8087bfa04ab071b1|285b1b61e465418d8a09a896ae4b98e5|', '数据权限', NULL, NULL, '4daeb9e341c7491c8087bfa04ab071b1', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 17, 0); +INSERT INTO `jcdp_sys_module` VALUES ('28bc7c65e2f4408f9aec535a23a6322b', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|28bc7c65e2f4408f9aec535a23a6322b|', '设置角色用户-未授权用户列表', '/role/role/getNoRoleUserList', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 118, 0); +INSERT INTO `jcdp_sys_module` VALUES ('28c3a95347024c4fb1b6395887a09409', '|root|28c3a95347024c4fb1b6395887a09409|', '系统管理', '', NULL, 'root', 0, 0, 'setting_tools.png', 1, 'JAVA快速开发平台系统', NULL, 999, 0, 5, 1); +INSERT INTO `jcdp_sys_module` VALUES ('2ac27abe882f4787b9012e38271ad391', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|17cb1a4f18d64521873256ddddbc1d07|2ac27abe882f4787b9012e38271ad391|', '部门计划内培训管理员填写', '/train/groupInPlan/groupindex', NULL, '17cb1a4f18d64521873256ddddbc1d07', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 296, 1); +INSERT INTO `jcdp_sys_module` VALUES ('2e7aacfee36743e9bd9da751c12959a6', '|root|ba85127869a3419cbc279cf959967547|2e7aacfee36743e9bd9da751c12959a6|', '上传资料或选择历史资料', '/train/plantodo/createclassindex?pg=4', NULL, 'ba85127869a3419cbc279cf959967547', 0, 0, '', 1, '教育培训计划实施', NULL, 3, 1, 196, 1); +INSERT INTO `jcdp_sys_module` VALUES ('2ecbb2a862f44624a4712bcf007865d5', '|root|40aa8106fa8f48ab97507b221606732f|2ecbb2a862f44624a4712bcf007865d5|', '部门领导审批', '', NULL, '40aa8106fa8f48ab97507b221606732f', 0, 0, '', 1, '学习资料管理', NULL, 3, 0, 222, 1); +INSERT INTO `jcdp_sys_module` VALUES ('2f9ce56b79654b328b91a3acb7c0a075', '|root|b56cfe82381e4519b873e345022785a3|ca92e783d77b4251bdc7e38653f79217|3440e3ff8358450fbfb130d4728a9402|2f9ce56b79654b328b91a3acb7c0a075|', '试题库管理-编辑试题', '/exam/question/save', '', '3440e3ff8358450fbfb130d4728a9402', 0, 0, 'menu_item.png', 1, '', '', 0, 4, 255, 0); +INSERT INTO `jcdp_sys_module` VALUES ('303d9b4e61644115bfc81d8b2eaa0cf9', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|bb6a1c9e864c423e8912f67ab4dd48b6|303d9b4e61644115bfc81d8b2eaa0cf9|', '页面权限', NULL, NULL, 'bb6a1c9e864c423e8912f67ab4dd48b6', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 95, 0); +INSERT INTO `jcdp_sys_module` VALUES ('32cc72dda23b4c3c8aab3238ddb23993', '|root|93093b73a7be4daf837e7f88dd51495a|6ea8b3fec144445c9984fc33b17f7b35|32cc72dda23b4c3c8aab3238ddb23993|', '人力资源部领导审核', '/train/groupOutPlan?pg=5', NULL, '6ea8b3fec144445c9984fc33b17f7b35', 0, 0, '', 1, '部门级计划外计划制定', NULL, 5, 1, 243, 1); +INSERT INTO `jcdp_sys_module` VALUES ('331aeb92e0334b18bb256d4642dc3fd4', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|769c4df7d2ad451dab6df0283c7e9474|331aeb92e0334b18bb256d4642dc3fd4|', '数据权限', NULL, NULL, '769c4df7d2ad451dab6df0283c7e9474', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 155, 0); +INSERT INTO `jcdp_sys_module` VALUES ('337a85c2c9374c3bad7732fe11ac27d2', '|root|be9bff7b9be04526913be68d98980dff|a1d904ec1f87468a8b1b0df371c48a53|337a85c2c9374c3bad7732fe11ac27d2|', '数据权限', NULL, NULL, 'a1d904ec1f87468a8b1b0df371c48a53', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 0, 0); +INSERT INTO `jcdp_sys_module` VALUES ('337ee293377d4daea74d6e7910af3d04', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|8ebdc167d094494baebb958327cbf9ec|337ee293377d4daea74d6e7910af3d04|', '组织架构-主界面', '/user/org/index', NULL, '8ebdc167d094494baebb958327cbf9ec', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 109, 0); +INSERT INTO `jcdp_sys_module` VALUES ('33c5ee9d475d48448cf1a30a74fc06e3', '|root|847723e4606548c6ad6be266877d66e9|70f9ccd396d54f6aab3847573d73aadf|33c5ee9d475d48448cf1a30a74fc06e3|', '所级管理员确认', '/train/yearsummary/institutegroupindex?pg=4', NULL, '70f9ccd396d54f6aab3847573d73aadf', 0, 0, '', 1, '所级年度培训效果总结', NULL, 4, 0, 270, 1); +INSERT INTO `jcdp_sys_module` VALUES ('3437127ed560445fbe7951f85dd36e8f', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|3437127ed560445fbe7951f85dd36e8f|', '所级培训管理员审核', '/train/outtrain/?pg=3', NULL, 'b9c62e8e49994504804bb3707b865dd0', 0, 0, '', 1, '非经济责任制单位外派培训', NULL, 3, 1, 211, 1); +INSERT INTO `jcdp_sys_module` VALUES ('3440e3ff8358450fbfb130d4728a9402', '|root|b56cfe82381e4519b873e345022785a3|ca92e783d77b4251bdc7e38653f79217|3440e3ff8358450fbfb130d4728a9402|', '数据权限', '', '', 'ca92e783d77b4251bdc7e38653f79217', 0, 0, 'database.png', 1, '', '', 0, 3, 254, 0); +INSERT INTO `jcdp_sys_module` VALUES ('34758dd4870b475e9ad755d90617ae6c', '|root|40aa8106fa8f48ab97507b221606732f|34758dd4870b475e9ad755d90617ae6c|', '部门培训管理员', '', NULL, '40aa8106fa8f48ab97507b221606732f', 0, 0, '', 1, '学习资料管理', NULL, 2, 0, 221, 1); +INSERT INTO `jcdp_sys_module` VALUES ('3595c4d009ce498591e40130c214d7f9', '|root|ba85127869a3419cbc279cf959967547|3595c4d009ce498591e40130c214d7f9|', '报名', '', NULL, 'ba85127869a3419cbc279cf959967547', 0, 0, '', 1, '教育培训计划实施', NULL, 2, 0, 193, 1); +INSERT INTO `jcdp_sys_module` VALUES ('3794f20618b04861a61885028756fa4c', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|2128fb4ae5f949b3ba8da371de78ecb0|3794f20618b04861a61885028756fa4c|', '会话日志-主界面', '/log/session/index', NULL, '2128fb4ae5f949b3ba8da371de78ecb0', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 87, 0); +INSERT INTO `jcdp_sys_module` VALUES ('39fbd45f6da740a8815f483781a56567', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|df9a01cd017f40ee89630f6d2e8bdb24|39fbd45f6da740a8815f483781a56567|', '基础操作-编辑', '/dict/category/save', NULL, 'df9a01cd017f40ee89630f6d2e8bdb24', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 28, 0); +INSERT INTO `jcdp_sys_module` VALUES ('3b566f494c244193a5a943ec73378e66', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|68d13963526748ab82a99116f190a996|3b566f494c244193a5a943ec73378e66|', '2.部门角色', '/role/role/list', NULL, '68d13963526748ab82a99116f190a996', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 2, 0); +INSERT INTO `jcdp_sys_module` VALUES ('3c1811fd49ba471f87c8172dfa6e813b', '|root|510998e99c924665806c0e20bbbcc2b2|76ccbd8e2c7c4ffb8709396dc5059526|3c1811fd49ba471f87c8172dfa6e813b|', '部门领导审批', '/train/outtrain/deleteindex?pg=7', NULL, '76ccbd8e2c7c4ffb8709396dc5059526', 0, 0, '', 1, '外派培训计划删除', NULL, 2, 0, 277, 1); +INSERT INTO `jcdp_sys_module` VALUES ('3df773b762d54053bf6e9f3b53a0184c', '|root|ba85127869a3419cbc279cf959967547|3df773b762d54053bf6e9f3b53a0184c|', '学员签到/在线学习', '/train/plantodo/createclassindex?pg=5', NULL, 'ba85127869a3419cbc279cf959967547', 0, 0, '', 1, '教育培训计划实施', NULL, 4, 1, 197, 1); +INSERT INTO `jcdp_sys_module` VALUES ('3e353b0736064f4b83e0489a7e69fd7e', '|root|975338ae351a4a19af2032fc360af687|3e353b0736064f4b83e0489a7e69fd7e|', '所网主页', 'http://www.cetc54.com', NULL, '975338ae351a4a19af2032fc360af687', 0, 0, '', 1, '任务管理', NULL, 9, 0, 282, 1); +INSERT INTO `jcdp_sys_module` VALUES ('408d00a441b2442a9b74781db1f77f3e', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|408d00a441b2442a9b74781db1f77f3e|', '已生成计划', '/train/groupInPlan/?pg=5', NULL, 'e84381fd49f54ae487e241f152e808d0', 0, 0, '', 1, '部门级计划内计划制定', NULL, 5, 1, 262, 1); +INSERT INTO `jcdp_sys_module` VALUES ('40aa8106fa8f48ab97507b221606732f', '|root|40aa8106fa8f48ab97507b221606732f|', '学习资料管理', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 7, 0, 217, 1); +INSERT INTO `jcdp_sys_module` VALUES ('4269c094e4cc437ba9db9dd71428d547', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|06959fba43e54a98a5902bc90cede514|e3b370a851ec440391f8c4531b66f7ed|02d034df6d6047bf81cdaa630dba3d57|4269c094e4cc437ba9db9dd71428d547|', '2.部门', '/log/log/list', NULL, '02d034df6d6047bf81cdaa630dba3d57', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 2, 0); +INSERT INTO `jcdp_sys_module` VALUES ('42d41ce2c35a46328d58820ca96f0278', '|root|975338ae351a4a19af2032fc360af687|42d41ce2c35a46328d58820ca96f0278|', '所有用户流程待办', '/flowable/flowabletask/allindex', NULL, '975338ae351a4a19af2032fc360af687', 0, 0, '', 1, '任务管理', NULL, 4, 1, 279, 1); +INSERT INTO `jcdp_sys_module` VALUES ('438fff99f2da4a038b9426f5378da08f', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|17cb1a4f18d64521873256ddddbc1d07|438fff99f2da4a038b9426f5378da08f|', '基础操作-删除部门计划内培训计划', '/train/groupInPlan/delete', NULL, '17cb1a4f18d64521873256ddddbc1d07', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 291, 0); +INSERT INTO `jcdp_sys_module` VALUES ('43e6ad421517412ab4f6ac701b9b5609', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|43e6ad421517412ab4f6ac701b9b5609|', '设置功能权限-保存权限', '/user/user/savePermission', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 128, 0); +INSERT INTO `jcdp_sys_module` VALUES ('45597a11d3e34d0d8e7ed3f15ff12aac', '|root|be9bff7b9be04526913be68d98980dff|a1d904ec1f87468a8b1b0df371c48a53|337a85c2c9374c3bad7732fe11ac27d2|45597a11d3e34d0d8e7ed3f15ff12aac|', '基础操作-编辑用户组信息', '/groups/groups/save', NULL, '337a85c2c9374c3bad7732fe11ac27d2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 227, 0); +INSERT INTO `jcdp_sys_module` VALUES ('46d7f093459f41bdb5efe6f1fc28a5f3', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|46d7f093459f41bdb5efe6f1fc28a5f3|', '数据权限', NULL, NULL, 'de1834427ca54f4e80337f73ccc5359a', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 86, 0); +INSERT INTO `jcdp_sys_module` VALUES ('49c6c9345d94413c8bd1e049ffacc65b', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|49c6c9345d94413c8bd1e049ffacc65b|', '组织架构列表-分页', '/user/org/list', NULL, '5883140a317e41e5a5557473e2bb90dd', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 107, 0); +INSERT INTO `jcdp_sys_module` VALUES ('4adfa326338b4ad6afd99a845e92b0f8', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|4adfa326338b4ad6afd99a845e92b0f8|', '组织架构列表-全部', '/user/org/getListAll', NULL, '5883140a317e41e5a5557473e2bb90dd', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 106, 0); +INSERT INTO `jcdp_sys_module` VALUES ('4b1fa6cbeb144bac9ab69ac820b94ac5', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|4b1fa6cbeb144bac9ab69ac820b94ac5|', '部门接收调研表选择', '/train/institutePlan/groupresearchindex?pg=7', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 7, 1, 249, 1); +INSERT INTO `jcdp_sys_module` VALUES ('4b22bbb5fd7243c99b175b1a98734674', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|769c4df7d2ad451dab6df0283c7e9474|331aeb92e0334b18bb256d4642dc3fd4|4b22bbb5fd7243c99b175b1a98734674|', '基础操作-删除应用', '/chat/appVersion/delete', NULL, '331aeb92e0334b18bb256d4642dc3fd4', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 225, 0); +INSERT INTO `jcdp_sys_module` VALUES ('4bbb6d872e654640b22bf354901ef5ae', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|4bbb6d872e654640b22bf354901ef5ae|', '申请人拟制申请', '/train/outtrain/?pg=1', NULL, 'b9c62e8e49994504804bb3707b865dd0', 0, 0, '', 1, '非经济责任制单位外派培训', NULL, 1, 1, 209, 1); +INSERT INTO `jcdp_sys_module` VALUES ('4daeb9e341c7491c8087bfa04ab071b1', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|4daeb9e341c7491c8087bfa04ab071b1|', '字典参数', '/dict/dict', NULL, 'df9969475d47473c93d7d83f23f430ef', 0, 0, 'book_key.png', 1, '参数与字典', NULL, 2, 1, 15, 1); +INSERT INTO `jcdp_sys_module` VALUES ('4e678e835de1411ea5c2e29763eb2d6e', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|', '功能模块', '/module/module', NULL, '64913bf0934441fdb20a8a4f70a5f9d9', 0, 0, 'module.png', 1, '资源管理', NULL, 1, 1, 29, 1); +INSERT INTO `jcdp_sys_module` VALUES ('5028cac620cd41e2a1fd1a2c40adc0eb', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|46d7f093459f41bdb5efe6f1fc28a5f3|5028cac620cd41e2a1fd1a2c40adc0eb|', '会话列表', '/log/session/list', NULL, '46d7f093459f41bdb5efe6f1fc28a5f3', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 88, 0); +INSERT INTO `jcdp_sys_module` VALUES ('510998e99c924665806c0e20bbbcc2b2', '|root|510998e99c924665806c0e20bbbcc2b2|', '所外派培训', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 6, 0, 208, 1); +INSERT INTO `jcdp_sys_module` VALUES ('51199725c7df42d7abfe915e4f9da0f3', '|root|847723e4606548c6ad6be266877d66e9|70f9ccd396d54f6aab3847573d73aadf|51199725c7df42d7abfe915e4f9da0f3|', '部门培训管理员填写', '/train/yearsummary/institutegroupindex?pg=2', NULL, '70f9ccd396d54f6aab3847573d73aadf', 0, 0, '', 1, '所级年度培训效果总结', NULL, 2, 1, 268, 1); +INSERT INTO `jcdp_sys_module` VALUES ('51b630f64d8941599a7f31ded5a13da7', '|root|8abb6a681dfe4040b8a6a94584f53933|51b630f64d8941599a7f31ded5a13da7|', '用户答题', '/research/research/examindex?pg=4', NULL, '8abb6a681dfe4040b8a6a94584f53933', 0, 0, '', 1, '调研管理', NULL, 4, 1, 259, 1); +INSERT INTO `jcdp_sys_module` VALUES ('53071dc8b9354a9d949e45d86391b95e', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|edf9044b8ab74e99b53a3f7df0dff0b3|53071dc8b9354a9d949e45d86391b95e|', '编辑', '/train/groupInPlan/editgroupPage', NULL, 'edf9044b8ab74e99b53a3f7df0dff0b3', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 288, 0); +INSERT INTO `jcdp_sys_module` VALUES ('53becd7c5a67467d91652aa787eadbeb', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|4daeb9e341c7491c8087bfa04ab071b1|d593b004d5354918b79a43d8e8c21f42|53becd7c5a67467d91652aa787eadbeb|', '字典参数-主界面', '/dict/dict/index', NULL, 'd593b004d5354918b79a43d8e8c21f42', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 19, 0); +INSERT INTO `jcdp_sys_module` VALUES ('5428df64d25a4dd89a1e8b5e9456d137', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|5428df64d25a4dd89a1e8b5e9456d137|', '部门领导审核', '/train/institutePlan/groupindex?pg=3', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 3, 1, 245, 1); +INSERT INTO `jcdp_sys_module` VALUES ('5472d2febccd4b8ca6b3533ecf0bc020', '|root|b56cfe82381e4519b873e345022785a3|ca92e783d77b4251bdc7e38653f79217|3440e3ff8358450fbfb130d4728a9402|5472d2febccd4b8ca6b3533ecf0bc020|', '试题库管理-试题库列表', '/exam/question/list', '', '3440e3ff8358450fbfb130d4728a9402', 0, 0, 'menu_item.png', 1, '', '', 0, 4, 256, 0); +INSERT INTO `jcdp_sys_module` VALUES ('547ae350699047c187c6a490b2ba8b19', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|edf9044b8ab74e99b53a3f7df0dff0b3|547ae350699047c187c6a490b2ba8b19|', '部门计划内制定首页', '/train/groupInPlan/index', NULL, 'edf9044b8ab74e99b53a3f7df0dff0b3', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 293, 0); +INSERT INTO `jcdp_sys_module` VALUES ('56631f2c5c2949cebb10ae7c5eedebd4', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|56631f2c5c2949cebb10ae7c5eedebd4|', '页面权限', NULL, NULL, '108ab8db661c425ea5a4249b9d4728b5', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 63, 0); +INSERT INTO `jcdp_sys_module` VALUES ('583727a894d84c2fbb87344c412dbda8', '|root|975338ae351a4a19af2032fc360af687|583727a894d84c2fbb87344c412dbda8|', '个人中心', '', NULL, '975338ae351a4a19af2032fc360af687', 0, 0, '', 1, '任务管理', NULL, 6, 0, 162, 1); +INSERT INTO `jcdp_sys_module` VALUES ('5883140a317e41e5a5557473e2bb90dd', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|', '数据权限', NULL, NULL, '88f67ce8cef64c4bb65774c61514132e', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 42, 0); +INSERT INTO `jcdp_sys_module` VALUES ('58daa804c575466793b68f97e57ff460', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|58daa804c575466793b68f97e57ff460|', '设置用户角色-添加角色', '/user/user/selectRolesToUser', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 143, 0); +INSERT INTO `jcdp_sys_module` VALUES ('598d184617594c97bd008df4bd0681f5', '|root|975338ae351a4a19af2032fc360af687|598d184617594c97bd008df4bd0681f5|', '待办工作', '/flowable/flowabletask/userindex', NULL, '975338ae351a4a19af2032fc360af687', 0, 0, '', 1, '任务管理', NULL, 1, 1, 159, 1); +INSERT INTO `jcdp_sys_module` VALUES ('5d05c8586b124e43a6e95df5f58152e5', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|5d05c8586b124e43a6e95df5f58152e5|', '部门主管所领导审核', '/train/outtrain/?pg=4', NULL, 'b9c62e8e49994504804bb3707b865dd0', 0, 0, '', 1, '非经济责任制单位外派培训', NULL, 4, 1, 212, 1); +INSERT INTO `jcdp_sys_module` VALUES ('5da971848eaf4da88cda0cb375a37646', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|5da971848eaf4da88cda0cb375a37646|', '基础操作-编辑用户信息', '/user/user/save', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 129, 0); +INSERT INTO `jcdp_sys_module` VALUES ('5e3b6352b74944298e4c77efd04a0a68', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|17cb1a4f18d64521873256ddddbc1d07|5e3b6352b74944298e4c77efd04a0a68|', '基础操作-部门计划内培训计划列表下发部门', '/train/groupInPlan/grouplist', NULL, '17cb1a4f18d64521873256ddddbc1d07', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 287, 0); +INSERT INTO `jcdp_sys_module` VALUES ('6085faef90184f33a889b6a517768710', '|root|847723e4606548c6ad6be266877d66e9|70f9ccd396d54f6aab3847573d73aadf|6085faef90184f33a889b6a517768710|', '所级培训管理员发起', '/train/yearsummary/instituteindex?pg=1', NULL, '70f9ccd396d54f6aab3847573d73aadf', 0, 0, '', 1, '所级年度培训效果总结', NULL, 1, 1, 267, 1); +INSERT INTO `jcdp_sys_module` VALUES ('61f47b38b6b74740af8a6cd44ca5d654', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|', '分类科目', '/dict/category', NULL, 'df9969475d47473c93d7d83f23f430ef', 0, 0, 'category.png', 1, '参数与字典', NULL, 3, 1, 22, 1); +INSERT INTO `jcdp_sys_module` VALUES ('6293a532916143ae83412963c790fefd', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|769c4df7d2ad451dab6df0283c7e9474|331aeb92e0334b18bb256d4642dc3fd4|6293a532916143ae83412963c790fefd|', 'APP安装包管理-应用列表', '/chat/appVersion/getAppList', NULL, '331aeb92e0334b18bb256d4642dc3fd4', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 224, 0); +INSERT INTO `jcdp_sys_module` VALUES ('63e0dd2b4ef54cf39736bbf0c5bacd79', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|', '数据权限', NULL, NULL, '108ab8db661c425ea5a4249b9d4728b5', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 64, 0); +INSERT INTO `jcdp_sys_module` VALUES ('64913bf0934441fdb20a8a4f70a5f9d9', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|', '资源管理', '', NULL, '28c3a95347024c4fb1b6395887a09409', 0, 1, 'resources.png', 1, '系统管理', NULL, 2, 0, 1, 1); +INSERT INTO `jcdp_sys_module` VALUES ('65c6c8641ea9425389384efe5a09d143', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|bb6a1c9e864c423e8912f67ab4dd48b6|303d9b4e61644115bfc81d8b2eaa0cf9|65c6c8641ea9425389384efe5a09d143|', '首页', '/toolkit/icon/index', NULL, '303d9b4e61644115bfc81d8b2eaa0cf9', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 97, 0); +INSERT INTO `jcdp_sys_module` VALUES ('6766160015bf4595b1e2f40f6cec5de9', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|06959fba43e54a98a5902bc90cede514|a296e916d1e64d6a8031d91c60ad6138|6766160015bf4595b1e2f40f6cec5de9|', '操作日志-主界面', '/log/log/index', NULL, 'a296e916d1e64d6a8031d91c60ad6138', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 82, 0); +INSERT INTO `jcdp_sys_module` VALUES ('685125c92da74b0499ea591a48f6562f', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|685125c92da74b0499ea591a48f6562f|', '人力资源部领导审核', '/train/outtrain/?pg=5', NULL, 'b9c62e8e49994504804bb3707b865dd0', 0, 0, '', 1, '非经济责任制单位外派培训', NULL, 5, 1, 213, 1); +INSERT INTO `jcdp_sys_module` VALUES ('68d13963526748ab82a99116f190a996', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|68d13963526748ab82a99116f190a996|', '基础操作-角色列表', '/role/role/list', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 117, 0); +INSERT INTO `jcdp_sys_module` VALUES ('6b3516ef3bc4442885c6cf3a322237d0', '|root|ba85127869a3419cbc279cf959967547|3595c4d009ce498591e40130c214d7f9|6b3516ef3bc4442885c6cf3a322237d0|', '录入名单', '/train/plantodo/createclassindex?pg=2', NULL, '3595c4d009ce498591e40130c214d7f9', 0, 0, '', 1, '报名', NULL, 1, 1, 194, 1); +INSERT INTO `jcdp_sys_module` VALUES ('6bb1c4692c8845ebb435fc945f13fe77', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|6bb1c4692c8845ebb435fc945f13fe77|', '所级管理员生成培训计划表', '/train/institutePlan?pg=5', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 5, 1, 248, 1); +INSERT INTO `jcdp_sys_module` VALUES ('6c3128d8e98549d4a26bc27f65aa1cb4', '|root|847723e4606548c6ad6be266877d66e9|6de03605d78248f5bdbfe413d00a63ee|6c3128d8e98549d4a26bc27f65aa1cb4|', '部门培训管理员填写', '/train/yearsummary/groupindex?pg=2', NULL, '6de03605d78248f5bdbfe413d00a63ee', 0, 0, '', 1, '部门年度培训', NULL, 2, 1, 205, 1); +INSERT INTO `jcdp_sys_module` VALUES ('6de03605d78248f5bdbfe413d00a63ee', '|root|847723e4606548c6ad6be266877d66e9|6de03605d78248f5bdbfe413d00a63ee|', '部门年度培训', '', NULL, '847723e4606548c6ad6be266877d66e9', 0, 0, '', 1, '年度教育培训总结', NULL, 1, 0, 265, 1); +INSERT INTO `jcdp_sys_module` VALUES ('6ea8b3fec144445c9984fc33b17f7b35', '|root|93093b73a7be4daf837e7f88dd51495a|6ea8b3fec144445c9984fc33b17f7b35|', '部门级计划外计划制定', '', NULL, '93093b73a7be4daf837e7f88dd51495a', 0, 0, '', 1, '教育培训计划制定', NULL, 2, 0, 178, 1); +INSERT INTO `jcdp_sys_module` VALUES ('7089064a6769448e9c20843b5eae33f8', '|root|975338ae351a4a19af2032fc360af687|7089064a6769448e9c20843b5eae33f8|', '我发起的工作', '/flowable/processhistory/userstartindex', NULL, '975338ae351a4a19af2032fc360af687', 0, 0, '', 1, '任务管理', NULL, 2, 1, 160, 1); +INSERT INTO `jcdp_sys_module` VALUES ('70ec94d589864a49a5eaac0ef2f309e2', '|root|93093b73a7be4daf837e7f88dd51495a|6ea8b3fec144445c9984fc33b17f7b35|70ec94d589864a49a5eaac0ef2f309e2|', '部门领导审核', '/train/groupOutPlan?pg=2', NULL, '6ea8b3fec144445c9984fc33b17f7b35', 0, 0, '', 1, '部门级计划外计划制定', NULL, 2, 1, 241, 1); +INSERT INTO `jcdp_sys_module` VALUES ('70f9ccd396d54f6aab3847573d73aadf', '|root|847723e4606548c6ad6be266877d66e9|70f9ccd396d54f6aab3847573d73aadf|', '所级年度培训效果总结', '', NULL, '847723e4606548c6ad6be266877d66e9', 0, 0, '', 1, '年度教育培训总结', NULL, 2, 0, 266, 1); +INSERT INTO `jcdp_sys_module` VALUES ('710b01e080644ddd95472a057cd5cbdd', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|769c4df7d2ad451dab6df0283c7e9474|c4f98f4109eb40438835d8df647cf051|710b01e080644ddd95472a057cd5cbdd|', 'APP安装包管理-首页', '/chat/appVersion/index', NULL, 'c4f98f4109eb40438835d8df647cf051', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 223, 0); +INSERT INTO `jcdp_sys_module` VALUES ('71da1890c9914724916bfc18cf06c02d', '|root|847723e4606548c6ad6be266877d66e9|70f9ccd396d54f6aab3847573d73aadf|71da1890c9914724916bfc18cf06c02d|', '部门领导审核', '/train/yearsummary/institutegroupindex?pg=3', NULL, '70f9ccd396d54f6aab3847573d73aadf', 0, 0, '', 1, '所级年度培训效果总结', NULL, 3, 1, 269, 1); +INSERT INTO `jcdp_sys_module` VALUES ('7418fce4712e45b78611d502c1165ead', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|', '开发工具箱', NULL, NULL, '28c3a95347024c4fb1b6395887a09409', 0, 1, 'toolbox.png', 1, '系统管理', NULL, 6, 0, 7, 1); +INSERT INTO `jcdp_sys_module` VALUES ('7568756167d744788a44798f8234c798', '|root|93093b73a7be4daf837e7f88dd51495a|6ea8b3fec144445c9984fc33b17f7b35|7568756167d744788a44798f8234c798|', '所级管理员审核', '/train/groupOutPlan?pg=3', NULL, '6ea8b3fec144445c9984fc33b17f7b35', 0, 0, '', 1, '部门级计划外计划制定', NULL, 3, 1, 263, 1); +INSERT INTO `jcdp_sys_module` VALUES ('761a47c6ad854abd8fdd2ab64f534211', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|761a47c6ad854abd8fdd2ab64f534211|', '所级培训管理员发起', '/train/institutePlan?pg=1', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 1, 1, 244, 1); +INSERT INTO `jcdp_sys_module` VALUES ('7657c5b7b9634c56a22439ef82f24541', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|7d6279051f5e4d3ba6de1e13b71e405b|7657c5b7b9634c56a22439ef82f24541|', '基础操作-编辑模块', '/module/module/save', NULL, '7d6279051f5e4d3ba6de1e13b71e405b', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 36, 0); +INSERT INTO `jcdp_sys_module` VALUES ('769c4df7d2ad451dab6df0283c7e9474', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|769c4df7d2ad451dab6df0283c7e9474|', '应用管理', '/chat/appVersion', NULL, '7418fce4712e45b78611d502c1165ead', 0, 0, '', 1, '开发工具箱', NULL, 22, 1, 153, 1); +INSERT INTO `jcdp_sys_module` VALUES ('76ccbd8e2c7c4ffb8709396dc5059526', '|root|510998e99c924665806c0e20bbbcc2b2|76ccbd8e2c7c4ffb8709396dc5059526|', '外派培训计划删除', '', NULL, '510998e99c924665806c0e20bbbcc2b2', 0, 0, '', 1, '所外派培训', NULL, 3, 0, 275, 1); +INSERT INTO `jcdp_sys_module` VALUES ('77a1ac3000c14c3a85462353a78291f7', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|77a1ac3000c14c3a85462353a78291f7|', '所级培训管理员接收汇总表', '/train/institutePlan?pg=4', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 4, 1, 246, 1); +INSERT INTO `jcdp_sys_module` VALUES ('78ae899f82cc492db767ba5169790b05', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|4adfa326338b4ad6afd99a845e92b0f8|78ae899f82cc492db767ba5169790b05|', '2.行政部门', '/user/org/getListAll', NULL, '4adfa326338b4ad6afd99a845e92b0f8', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 2, 0); +INSERT INTO `jcdp_sys_module` VALUES ('78d0df7fc59d4fa58c9f3c96da6b8f9a', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|7d6279051f5e4d3ba6de1e13b71e405b|78d0df7fc59d4fa58c9f3c96da6b8f9a|', '基础操作-编辑模块-获取控制器列表', '/module/module/controllerList', NULL, '7d6279051f5e4d3ba6de1e13b71e405b', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 38, 0); +INSERT INTO `jcdp_sys_module` VALUES ('7c58c8e3ac7b47cda08ad2781986959a', '|root|975338ae351a4a19af2032fc360af687|583727a894d84c2fbb87344c412dbda8|7c58c8e3ac7b47cda08ad2781986959a|', '我的课程', '', NULL, '583727a894d84c2fbb87344c412dbda8', 0, 0, '', 1, '个人中心', NULL, 1, 0, 163, 1); +INSERT INTO `jcdp_sys_module` VALUES ('7d6279051f5e4d3ba6de1e13b71e405b', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|7d6279051f5e4d3ba6de1e13b71e405b|', '数据权限', NULL, NULL, '4e678e835de1411ea5c2e29763eb2d6e', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 31, 0); +INSERT INTO `jcdp_sys_module` VALUES ('7de90c9ac21746e4940d3d846b38432f', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|1b4580ed574c4758ab419dcf9cb6a849|7de90c9ac21746e4940d3d846b38432f|', '功能模块-主界面', '/module/module/index', NULL, '1b4580ed574c4758ab419dcf9cb6a849', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 34, 0); +INSERT INTO `jcdp_sys_module` VALUES ('7f5c69d9c3984230907d03d9adc05af0', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|7f5c69d9c3984230907d03d9adc05af0|', '设置用户角色-删除角色', '/user/user/cancelRolesFromUser', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 142, 0); +INSERT INTO `jcdp_sys_module` VALUES ('8086a8bd35b748e2b196d84297e1aefa', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|7d6279051f5e4d3ba6de1e13b71e405b|8086a8bd35b748e2b196d84297e1aefa|', '模块列表-左侧模块树', '/module/module/getModuleList', NULL, '7d6279051f5e4d3ba6de1e13b71e405b', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 35, 0); +INSERT INTO `jcdp_sys_module` VALUES ('83a233cc973b466bbb9a989729be95ed', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|83a233cc973b466bbb9a989729be95ed|', '设置角色用户-删除用户', '/role/role/cancelUsersFromRole', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 111, 0); +INSERT INTO `jcdp_sys_module` VALUES ('83ab57c8a3cf44a89c200ccfd16ed911', '|root|cec4c4c04f9f48faa62966522c6adb55|83ab57c8a3cf44a89c200ccfd16ed911|', '信息查询', '/ReportServer?reportlet=test123.cpt', NULL, 'cec4c4c04f9f48faa62966522c6adb55', 0, 0, '', 1, '统计分析', NULL, 1, 1, 261, 1); +INSERT INTO `jcdp_sys_module` VALUES ('847723e4606548c6ad6be266877d66e9', '|root|847723e4606548c6ad6be266877d66e9|', '年度教育培训总结', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 5, 0, 203, 1); +INSERT INTO `jcdp_sys_module` VALUES ('852cf5f154a44493960de8e2a3d581cd', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|06959fba43e54a98a5902bc90cede514|e3b370a851ec440391f8c4531b66f7ed|02d034df6d6047bf81cdaa630dba3d57|852cf5f154a44493960de8e2a3d581cd|', '1.个人', '/log/log/list', NULL, '02d034df6d6047bf81cdaa630dba3d57', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 1, 0); +INSERT INTO `jcdp_sys_module` VALUES ('8627dd1a93624929b949e149a070155c', '|root|ba85127869a3419cbc279cf959967547|3595c4d009ce498591e40130c214d7f9|8627dd1a93624929b949e149a070155c|', '分配给部门管理员', '/train/plantodo/createclassindex?pg=3', NULL, '3595c4d009ce498591e40130c214d7f9', 0, 0, '', 1, '报名', NULL, 2, 1, 195, 1); +INSERT INTO `jcdp_sys_module` VALUES ('86a6e27bab024c0d8cd5e761c1ff8511', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|68d13963526748ab82a99116f190a996|86a6e27bab024c0d8cd5e761c1ff8511|', '3.全部角色', '/role/role/list', NULL, '68d13963526748ab82a99116f190a996', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 4, 0); +INSERT INTO `jcdp_sys_module` VALUES ('86eea90b1954457a84b9e25b037863a5', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|86eea90b1954457a84b9e25b037863a5|', '设置功能权限-功能列表', '/user/user/getPermissionList', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 130, 0); +INSERT INTO `jcdp_sys_module` VALUES ('871f99bb6ffb4278aad2164c807e30a4', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|4adfa326338b4ad6afd99a845e92b0f8|871f99bb6ffb4278aad2164c807e30a4|', '1.所属部门', '/user/org/getListAll', NULL, '4adfa326338b4ad6afd99a845e92b0f8', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 1, 0); +INSERT INTO `jcdp_sys_module` VALUES ('88a0e04e60ab478a912cdc81ffac2ef4', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|88a0e04e60ab478a912cdc81ffac2ef4|', '所级管理员确认', '/train/groupInPlan/?pg=4', NULL, 'e84381fd49f54ae487e241f152e808d0', 0, 0, '', 1, '部门级计划内计划制定', NULL, 4, 1, 238, 1); +INSERT INTO `jcdp_sys_module` VALUES ('88f67ce8cef64c4bb65774c61514132e', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|', '组织架构', '/user/org', NULL, 'd1db8883db7f4bc2a03253a2c94aa0bf', 0, 0, 'chart_organisation.png', 1, '权限管理', NULL, 1, 1, 40, 1); +INSERT INTO `jcdp_sys_module` VALUES ('8abb6a681dfe4040b8a6a94584f53933', '|root|8abb6a681dfe4040b8a6a94584f53933|', '调研管理', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 2, 0, 166, 1); +INSERT INTO `jcdp_sys_module` VALUES ('8e52603e76ea4a44b5be78e4e12eb20e', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|8e52603e76ea4a44b5be78e4e12eb20e|', '基础操作-删除角色', '/role/role/delete', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 110, 0); +INSERT INTO `jcdp_sys_module` VALUES ('8ebdc167d094494baebb958327cbf9ec', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|8ebdc167d094494baebb958327cbf9ec|', '页面权限', NULL, NULL, '88f67ce8cef64c4bb65774c61514132e', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 41, 0); +INSERT INTO `jcdp_sys_module` VALUES ('9222725dbe164cb897a1e985e17b1aa6', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|46d7f093459f41bdb5efe6f1fc28a5f3|5028cac620cd41e2a1fd1a2c40adc0eb|9222725dbe164cb897a1e985e17b1aa6|', '1.个人', '/log/session/list', NULL, '5028cac620cd41e2a1fd1a2c40adc0eb', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 1, 0); +INSERT INTO `jcdp_sys_module` VALUES ('924b573db7ef4a2fb5f002224ff90b18', '|root|40aa8106fa8f48ab97507b221606732f|924b573db7ef4a2fb5f002224ff90b18|', '个人上传', '', NULL, '40aa8106fa8f48ab97507b221606732f', 0, 0, '', 1, '学习资料管理', NULL, 2, 0, 220, 1); +INSERT INTO `jcdp_sys_module` VALUES ('93093b73a7be4daf837e7f88dd51495a', '|root|93093b73a7be4daf837e7f88dd51495a|', '教育培训计划制定', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 3, 0, 171, 1); +INSERT INTO `jcdp_sys_module` VALUES ('945bfe5578b041a0bdbc3cd0340072e5', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|46d7f093459f41bdb5efe6f1fc28a5f3|5028cac620cd41e2a1fd1a2c40adc0eb|945bfe5578b041a0bdbc3cd0340072e5|', '2.部门', '/log/session/list', NULL, '5028cac620cd41e2a1fd1a2c40adc0eb', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 2, 0); +INSERT INTO `jcdp_sys_module` VALUES ('94b9adc653324b2387f5ad1ac2298b30', '|root|847723e4606548c6ad6be266877d66e9|6de03605d78248f5bdbfe413d00a63ee|94b9adc653324b2387f5ad1ac2298b30|', '所级培训管理员发起', '/train/yearsummary?pg=1', NULL, '6de03605d78248f5bdbfe413d00a63ee', 0, 0, '', 1, '部门年度培训', NULL, 1, 1, 204, 1); +INSERT INTO `jcdp_sys_module` VALUES ('96d9bdc992cd400a9d43029f1d1521c8', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|edf9044b8ab74e99b53a3f7df0dff0b3|96d9bdc992cd400a9d43029f1d1521c8|', '计划内部门领导审批', '/train/groupInPlan/groupspPage', NULL, 'edf9044b8ab74e99b53a3f7df0dff0b3', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 297, 0); +INSERT INTO `jcdp_sys_module` VALUES ('975338ae351a4a19af2032fc360af687', '|root|975338ae351a4a19af2032fc360af687|', '任务管理', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 1, 0, 158, 1); +INSERT INTO `jcdp_sys_module` VALUES ('9778d30cc1c6499b91931ad49828eb54', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|769c4df7d2ad451dab6df0283c7e9474|331aeb92e0334b18bb256d4642dc3fd4|9778d30cc1c6499b91931ad49828eb54|', '基础操作-编辑应用', '/chat/appVersion/save', NULL, '331aeb92e0334b18bb256d4642dc3fd4', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 226, 0); +INSERT INTO `jcdp_sys_module` VALUES ('98b9d87dd25b4a4e879ca18023f51024', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|98b9d87dd25b4a4e879ca18023f51024|', '基础操作-删除用户', '/user/user/delete', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 127, 0); +INSERT INTO `jcdp_sys_module` VALUES ('9a929187a64e4c358b880665fec3bd6b', '|root|510998e99c924665806c0e20bbbcc2b2|0622f813f97a44a4be1b7a145b3ad11d|9a929187a64e4c358b880665fec3bd6b|', '部门领导审批', '/train/outtrain/zybindex?pg=7', NULL, '0622f813f97a44a4be1b7a145b3ad11d', 0, 0, '', 1, '经济责任制单位外派培训', NULL, 2, 1, 274, 1); +INSERT INTO `jcdp_sys_module` VALUES ('9bff6b4871b74c5690a613511fd8893c', '|root|ba85127869a3419cbc279cf959967547|c8c9d34b2f9f497f9ccb294a7c438d05|9bff6b4871b74c5690a613511fd8893c|', '创建试卷', '', NULL, 'c8c9d34b2f9f497f9ccb294a7c438d05', 0, 0, '', 1, '考试管理', NULL, 2, 0, 201, 1); +INSERT INTO `jcdp_sys_module` VALUES ('9e8ce7db475242b2858d53e5951af220', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|db720fda636847ac9dd7927a30f42538|02a1f6a6ed0f41f98221b886032fd79f|9e8ce7db475242b2858d53e5951af220|', '键值参数-主界面', '/dict/sysParameter/index', NULL, '02a1f6a6ed0f41f98221b886032fd79f', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 12, 0); +INSERT INTO `jcdp_sys_module` VALUES ('9ebfa9041f584595920df4b2fe303e94', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|bb6a1c9e864c423e8912f67ab4dd48b6|9ebfa9041f584595920df4b2fe303e94|', '数据权限', NULL, NULL, 'bb6a1c9e864c423e8912f67ab4dd48b6', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 96, 0); +INSERT INTO `jcdp_sys_module` VALUES ('9f65cf6479e64916bf27bfd3e2a652a6', '|root|cec4c4c04f9f48faa62966522c6adb55|9f65cf6479e64916bf27bfd3e2a652a6|', '权限管理', '/ReportServer?reportlet=statistic.cpt', NULL, 'cec4c4c04f9f48faa62966522c6adb55', 0, 0, '', 1, '统计分析', NULL, 2, 1, 299, 1); +INSERT INTO `jcdp_sys_module` VALUES ('a1070f9d416147e9bdb9074300658bc7', '|root|be9bff7b9be04526913be68d98980dff|a1d904ec1f87468a8b1b0df371c48a53|337a85c2c9374c3bad7732fe11ac27d2|a1070f9d416147e9bdb9074300658bc7|', '基础操作-用户组列表', '/groups/groups/list', NULL, '337a85c2c9374c3bad7732fe11ac27d2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 229, 0); +INSERT INTO `jcdp_sys_module` VALUES ('a1d904ec1f87468a8b1b0df371c48a53', '|root|be9bff7b9be04526913be68d98980dff|a1d904ec1f87468a8b1b0df371c48a53|', '用户组管理', '/groups/groups', NULL, 'be9bff7b9be04526913be68d98980dff', 0, 0, '', 1, '用户组管理', NULL, 1, 1, 157, 1); +INSERT INTO `jcdp_sys_module` VALUES ('a20da32d88a64c2c96b4b05d1e63f9e1', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|a20da32d88a64c2c96b4b05d1e63f9e1|', '所级管理员处理调研结果', '/train/institutePlan?pg=8', NULL, 'afac33df41284889b13d597ed0ef023e', 0, 0, '', 1, '所级计划制定', NULL, 8, 1, 250, 1); +INSERT INTO `jcdp_sys_module` VALUES ('a296e916d1e64d6a8031d91c60ad6138', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|06959fba43e54a98a5902bc90cede514|a296e916d1e64d6a8031d91c60ad6138|', '页面权限', NULL, NULL, '06959fba43e54a98a5902bc90cede514', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 79, 0); +INSERT INTO `jcdp_sys_module` VALUES ('a4e1d5973bc24782b45d379f36a2ff74', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a4e1d5973bc24782b45d379f36a2ff74|', '部门管理员填写', '/train/groupInPlan/groupindex?pg=2', NULL, 'e84381fd49f54ae487e241f152e808d0', 0, 0, '', 1, '部门级计划内计划制定', NULL, 2, 1, 298, 1); +INSERT INTO `jcdp_sys_module` VALUES ('a5c69216801440958961c3055d144082', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|a5c69216801440958961c3055d144082|', '所级培训管理员审核', '/train/outtrain/registerindex?pg=8', NULL, 'b9c62e8e49994504804bb3707b865dd0', 0, 0, '', 1, '非经济责任制单位外派培训', NULL, 8, 1, 216, 1); +INSERT INTO `jcdp_sys_module` VALUES ('a5ded6ccb87941e4b60e5b681d49d044', '|root|975338ae351a4a19af2032fc360af687|a5ded6ccb87941e4b60e5b681d49d044|', '个人工作台', '/trainweb/trainweb/webindex', NULL, '975338ae351a4a19af2032fc360af687', 0, 0, '', 1, '任务管理', NULL, 0, 1, 283, 1); +INSERT INTO `jcdp_sys_module` VALUES ('a69485e310244d39aa6359147077487c', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|', '部门计划内制定管理', '/train/groupInPlan', NULL, 'e84381fd49f54ae487e241f152e808d0', 0, 0, '', 1, '部门级计划内计划制定', NULL, 1, 1, 284, 1); +INSERT INTO `jcdp_sys_module` VALUES ('a7557f7a357d4d0c81ac07219250003a', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|17cb1a4f18d64521873256ddddbc1d07|a7557f7a357d4d0c81ac07219250003a|', '基础操作-编辑部门计划内培训计划信息', '/train/groupInPlan/save', NULL, '17cb1a4f18d64521873256ddddbc1d07', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 290, 0); +INSERT INTO `jcdp_sys_module` VALUES ('a7c9859b798a40c58f6b7429a8c926c2', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|', '数据权限', NULL, NULL, 'fca7520f7cda4daa9ebcebaa8b52c54a', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 50, 0); +INSERT INTO `jcdp_sys_module` VALUES ('a8bb00e603d447b684eff2a26618f800', '|root|93093b73a7be4daf837e7f88dd51495a|6ea8b3fec144445c9984fc33b17f7b35|a8bb00e603d447b684eff2a26618f800|', '部门管理员申请', '/train/groupOutPlan?pg=1', NULL, '6ea8b3fec144445c9984fc33b17f7b35', 0, 0, '', 1, '部门级计划外计划制定', NULL, 1, 0, 179, 1); +INSERT INTO `jcdp_sys_module` VALUES ('accc5ce5744348bfbd78901e344dc77d', '|root|510998e99c924665806c0e20bbbcc2b2|0622f813f97a44a4be1b7a145b3ad11d|accc5ce5744348bfbd78901e344dc77d|', '部门管理员录入', '/train/outtrain/zybindex?pg=6', NULL, '0622f813f97a44a4be1b7a145b3ad11d', 0, 0, '', 1, '经济责任制单位外派培训', NULL, 1, 1, 273, 1); +INSERT INTO `jcdp_sys_module` VALUES ('ad80fdd816eb4a9d85963a8cae2ed532', '|root|b56cfe82381e4519b873e345022785a3|ca92e783d77b4251bdc7e38653f79217|3440e3ff8358450fbfb130d4728a9402|ad80fdd816eb4a9d85963a8cae2ed532|', '试题库管理-删除试题', '/exam/question/delete', '', '3440e3ff8358450fbfb130d4728a9402', 0, 0, 'menu_item.png', 1, '', '', 0, 4, 257, 0); +INSERT INTO `jcdp_sys_module` VALUES ('add6b862fd0a4720b799661245d56427', '|root|8abb6a681dfe4040b8a6a94584f53933|add6b862fd0a4720b799661245d56427|', '调研活动类别', '/research/research/?pg=1', NULL, '8abb6a681dfe4040b8a6a94584f53933', 0, 0, '', 1, '调研管理', NULL, 1, 1, 233, 1); +INSERT INTO `jcdp_sys_module` VALUES ('aed0bb230ea6486eafc4c3ae698f66fb', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|aed0bb230ea6486eafc4c3ae698f66fb|', '设置角色用户-已授权用户列表', '/role/role/getRoleUsers', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 114, 0); +INSERT INTO `jcdp_sys_module` VALUES ('afac33df41284889b13d597ed0ef023e', '|root|93093b73a7be4daf837e7f88dd51495a|afac33df41284889b13d597ed0ef023e|', '所级计划制定', '', NULL, '93093b73a7be4daf837e7f88dd51495a', 0, 0, '', 1, '教育培训计划制定', NULL, 2, 0, 173, 1); +INSERT INTO `jcdp_sys_module` VALUES ('b071c8c30d9c4474a6a40ccd815d9ac6', '|root|510998e99c924665806c0e20bbbcc2b2|76ccbd8e2c7c4ffb8709396dc5059526|b071c8c30d9c4474a6a40ccd815d9ac6|', '部门管理员申请', '/train/outtrain/deleteindex?pg=6', NULL, '76ccbd8e2c7c4ffb8709396dc5059526', 0, 0, '', 1, '外派培训计划删除', NULL, 1, 1, 276, 1); +INSERT INTO `jcdp_sys_module` VALUES ('b1d15f08b7c944adb8ef945114fc5b03', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|df9a01cd017f40ee89630f6d2e8bdb24|18b7bf0dce2a4b9eae619ca25695392c|b1d15f08b7c944adb8ef945114fc5b03|', '2.业务应用', '/dict/category/list', NULL, '18b7bf0dce2a4b9eae619ca25695392c', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 2, 0); +INSERT INTO `jcdp_sys_module` VALUES ('b29bc87b64684369961bca2e05a352dc', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|b29bc87b64684369961bca2e05a352dc|', '基础操作-停用/启用角色', '/role/role/changeStatus', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 119, 0); +INSERT INTO `jcdp_sys_module` VALUES ('b5573ec04afe4602b4b17775ac300267', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|', '监控与审计', NULL, NULL, '28c3a95347024c4fb1b6395887a09409', 0, 1, 'folder_find.png', 1, '系统管理', NULL, 5, 0, 4, 1); +INSERT INTO `jcdp_sys_module` VALUES ('b558d48befab4a5f90ed8f0ad84a0df0', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|db720fda636847ac9dd7927a30f42538|e9097e65fde94905a6be071344f0d3c7|b558d48befab4a5f90ed8f0ad84a0df0|', '列表', '/dict/sysParameter/list', NULL, 'e9097e65fde94905a6be071344f0d3c7', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 13, 0); +INSERT INTO `jcdp_sys_module` VALUES ('b56cfe82381e4519b873e345022785a3', '|root|b56cfe82381e4519b873e345022785a3|', '考试管理', '', '', 'root', 0, 0, '', 1, '教育培训管理系统', '', 10, 0, 251, 1); +INSERT INTO `jcdp_sys_module` VALUES ('b60ba9716e234d16a88ef8b6d735f172', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|4adfa326338b4ad6afd99a845e92b0f8|b60ba9716e234d16a88ef8b6d735f172|', '3.全部部门', '/user/org/getListAll', NULL, '4adfa326338b4ad6afd99a845e92b0f8', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 4, 0); +INSERT INTO `jcdp_sys_module` VALUES ('b9c62e8e49994504804bb3707b865dd0', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|', '非经济责任制单位外派培训', '', NULL, '510998e99c924665806c0e20bbbcc2b2', 0, 0, '', 1, '所外派培训', NULL, 1, 0, 271, 1); +INSERT INTO `jcdp_sys_module` VALUES ('ba85127869a3419cbc279cf959967547', '|root|ba85127869a3419cbc279cf959967547|', '教育培训计划实施', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 4, 0, 191, 1); +INSERT INTO `jcdp_sys_module` VALUES ('bb503cab929644a0b6c590ff53570e1b', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|bb503cab929644a0b6c590ff53570e1b|', '设置功能权限-功能列表', '/role/role/getPermissionList', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 112, 0); +INSERT INTO `jcdp_sys_module` VALUES ('bb6a1c9e864c423e8912f67ab4dd48b6', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|bb6a1c9e864c423e8912f67ab4dd48b6|', '图标集', '/toolkit/icon', NULL, '7418fce4712e45b78611d502c1165ead', 0, 0, 'picture.png', 1, '开发工具箱', NULL, 3, 1, 94, 1); +INSERT INTO `jcdp_sys_module` VALUES ('bcb4e79e837347e1be6c6fe3ea87e353', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|56631f2c5c2949cebb10ae7c5eedebd4|bcb4e79e837347e1be6c6fe3ea87e353|', '用户信息-主界面', '/user/user/index', NULL, '56631f2c5c2949cebb10ae7c5eedebd4', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 132, 0); +INSERT INTO `jcdp_sys_module` VALUES ('be9bff7b9be04526913be68d98980dff', '|root|be9bff7b9be04526913be68d98980dff|', '用户组管理', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 998, 0, 156, 1); +INSERT INTO `jcdp_sys_module` VALUES ('c1b8a2264b0740b7a88724c6744651d5', '|root|847723e4606548c6ad6be266877d66e9|6de03605d78248f5bdbfe413d00a63ee|c1b8a2264b0740b7a88724c6744651d5|', '所级培训管理员确认', '/train/yearsummary/groupindex?pg=4', NULL, '6de03605d78248f5bdbfe413d00a63ee', 0, 0, '', 1, '部门年度培训', NULL, 4, 1, 207, 1); +INSERT INTO `jcdp_sys_module` VALUES ('c4ea837f86e14dd9ac69c19124eb60c5', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|c4ea837f86e14dd9ac69c19124eb60c5|', '基础操作-编辑组织', '/user/org/save', NULL, '5883140a317e41e5a5557473e2bb90dd', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 105, 0); +INSERT INTO `jcdp_sys_module` VALUES ('c4f98f4109eb40438835d8df647cf051', '|root|28c3a95347024c4fb1b6395887a09409|7418fce4712e45b78611d502c1165ead|769c4df7d2ad451dab6df0283c7e9474|c4f98f4109eb40438835d8df647cf051|', '页面权限', NULL, NULL, '769c4df7d2ad451dab6df0283c7e9474', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 154, 0); +INSERT INTO `jcdp_sys_module` VALUES ('c61c15d69627421ea8b6726c235d2dfb', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|46d7f093459f41bdb5efe6f1fc28a5f3|5028cac620cd41e2a1fd1a2c40adc0eb|c61c15d69627421ea8b6726c235d2dfb|', '3.全部', '/log/session/list', NULL, '5028cac620cd41e2a1fd1a2c40adc0eb', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 4, 0); +INSERT INTO `jcdp_sys_module` VALUES ('c8c9d34b2f9f497f9ccb294a7c438d05', '|root|ba85127869a3419cbc279cf959967547|c8c9d34b2f9f497f9ccb294a7c438d05|', '考试管理', '', NULL, 'ba85127869a3419cbc279cf959967547', 0, 0, '', 1, '教育培训计划实施', NULL, 6, 0, 199, 1); +INSERT INTO `jcdp_sys_module` VALUES ('ca61ae5903dd4a3c95254dbb7bf09c8e', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|49c6c9345d94413c8bd1e049ffacc65b|ca61ae5903dd4a3c95254dbb7bf09c8e|', '2.行政部门', '/user/org/list', NULL, '49c6c9345d94413c8bd1e049ffacc65b', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 2, 0); +INSERT INTO `jcdp_sys_module` VALUES ('ca92e783d77b4251bdc7e38653f79217', '|root|b56cfe82381e4519b873e345022785a3|ca92e783d77b4251bdc7e38653f79217|', '试题库', '/exam/question', '', 'b56cfe82381e4519b873e345022785a3', 0, 0, '', 1, '考试管理', '', 1, 1, 252, 1); +INSERT INTO `jcdp_sys_module` VALUES ('cd4eea87f1a34c26bb86dd57ca78b9b9', '|root|b56cfe82381e4519b873e345022785a3|ca92e783d77b4251bdc7e38653f79217|cd4eea87f1a34c26bb86dd57ca78b9b9|', '页面权限', '', '', 'ca92e783d77b4251bdc7e38653f79217', 0, 0, 'page.png', 1, '', '', 0, 2, 253, 0); +INSERT INTO `jcdp_sys_module` VALUES ('ce3ac9f1da044105a2e65de27ab72339', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|ce3ac9f1da044105a2e65de27ab72339|', '基础操作-批量修改所属组织', '/user/user/batchOrg', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 126, 0); +INSERT INTO `jcdp_sys_module` VALUES ('ce88b23553e9456e86111036a6db553a', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|06959fba43e54a98a5902bc90cede514|e3b370a851ec440391f8c4531b66f7ed|02d034df6d6047bf81cdaa630dba3d57|ce88b23553e9456e86111036a6db553a|', '3.全部', '/log/log/list', NULL, '02d034df6d6047bf81cdaa630dba3d57', 0, 0, 'textfield_key.png', 1, NULL, NULL, 0, 5, 4, 0); +INSERT INTO `jcdp_sys_module` VALUES ('cebc4adf0a2b4e69a29aaa9ff9a9e8de', '|root|975338ae351a4a19af2032fc360af687|583727a894d84c2fbb87344c412dbda8|cebc4adf0a2b4e69a29aaa9ff9a9e8de|', '我的成绩', '', NULL, '583727a894d84c2fbb87344c412dbda8', 0, 0, '', 1, '个人中心', NULL, 2, 0, 164, 1); +INSERT INTO `jcdp_sys_module` VALUES ('cec4c4c04f9f48faa62966522c6adb55', '|root|cec4c4c04f9f48faa62966522c6adb55|', '统计分析', '', NULL, 'root', 0, 0, '', 1, '教育培训管理系统', NULL, 8, 0, 219, 1); +INSERT INTO `jcdp_sys_module` VALUES ('cf1f1e45f6554a02a0709665287b4a2b', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|edf9044b8ab74e99b53a3f7df0dff0b3|cf1f1e45f6554a02a0709665287b4a2b|', '所级管理员确认', '/train/groupInPlan/adminspPage', NULL, 'edf9044b8ab74e99b53a3f7df0dff0b3', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 292, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d0fc63aea5564b76841a1a78d5c14a25', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|db720fda636847ac9dd7927a30f42538|e9097e65fde94905a6be071344f0d3c7|d0fc63aea5564b76841a1a78d5c14a25|', '基础操作-删除', '/dict/sysParameter/delete', NULL, 'e9097e65fde94905a6be071344f0d3c7', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 14, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d110fd16011744d8b4dfa15932a791de', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|dec9f52c25c84b6ebe36af37cc8d7494|d110fd16011744d8b4dfa15932a791de|', '角色信息-主界面', '/role/role/index', NULL, 'dec9f52c25c84b6ebe36af37cc8d7494', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 113, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d1db8883db7f4bc2a03253a2c94aa0bf', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|', '权限管理', NULL, NULL, '28c3a95347024c4fb1b6395887a09409', 0, 1, 'folder_user.png', 1, '系统管理', NULL, 3, 0, 2, 1); +INSERT INTO `jcdp_sys_module` VALUES ('d2fac4b866b94769bf540a6236bd34b7', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|d2fac4b866b94769bf540a6236bd34b7|', '基础操作-编辑角色信息', '/role/role/save', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 115, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d315cc1a38d44e77a20dbae88d03e945', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|d315cc1a38d44e77a20dbae88d03e945|', '基础操作-用户锁定/停用&解锁/启用', '/user/user/changeStatus', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 124, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d31f00a7fb0449bebee1848050cd5bba', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|88f67ce8cef64c4bb65774c61514132e|5883140a317e41e5a5557473e2bb90dd|d31f00a7fb0449bebee1848050cd5bba|', '基础操作-删除组织', '/user/org/delete', NULL, '5883140a317e41e5a5557473e2bb90dd', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 108, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d3413c6c860041099d5592787f4038ea', '|root|8abb6a681dfe4040b8a6a94584f53933|d3413c6c860041099d5592787f4038ea|', '查看汇总结果', '/research/research/examindex?pg=5', NULL, '8abb6a681dfe4040b8a6a94584f53933', 0, 0, '', 1, '调研管理', NULL, 5, 1, 236, 1); +INSERT INTO `jcdp_sys_module` VALUES ('d593b004d5354918b79a43d8e8c21f42', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|4daeb9e341c7491c8087bfa04ab071b1|d593b004d5354918b79a43d8e8c21f42|', '页面权限', NULL, NULL, '4daeb9e341c7491c8087bfa04ab071b1', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 16, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d80b369fb5f64113b81e2bafc08e599a', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|d80b369fb5f64113b81e2bafc08e599a|', '基础操作-密码重置', '/user/user/resetPassword', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 123, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d8197f3927d6422d86d505acb0f832cc', '|root|be9bff7b9be04526913be68d98980dff|a1d904ec1f87468a8b1b0df371c48a53|337a85c2c9374c3bad7732fe11ac27d2|d8197f3927d6422d86d505acb0f832cc|', '基础操作-删除用户组', '/groups/groups/delete', NULL, '337a85c2c9374c3bad7732fe11ac27d2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 228, 0); +INSERT INTO `jcdp_sys_module` VALUES ('d8cf20704ca3456fadc5df18b9e2f56a', '|root|93093b73a7be4daf837e7f88dd51495a|6ea8b3fec144445c9984fc33b17f7b35|d8cf20704ca3456fadc5df18b9e2f56a|', '主管所领导审核', '/train/groupOutPlan?pg=4', NULL, '6ea8b3fec144445c9984fc33b17f7b35', 0, 0, '', 1, '部门级计划外计划制定', NULL, 4, 1, 242, 1); +INSERT INTO `jcdp_sys_module` VALUES ('da33bf1180894660a253eaccfedb4a8a', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|da33bf1180894660a253eaccfedb4a8a|', '设置用户角色-未授权角色列表', '/user/user/getNoUserRoleList', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 133, 0); +INSERT INTO `jcdp_sys_module` VALUES ('db720fda636847ac9dd7927a30f42538', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|db720fda636847ac9dd7927a30f42538|', '键值参数', '/dict/sysParameter', NULL, 'df9969475d47473c93d7d83f23f430ef', 0, 0, 'table_key.png', 1, '参数与字典', NULL, 1, 1, 8, 1); +INSERT INTO `jcdp_sys_module` VALUES ('dbaad780561c45aa8e182a154bb4ada0', '|root|b56cfe82381e4519b873e345022785a3|ca92e783d77b4251bdc7e38653f79217|cd4eea87f1a34c26bb86dd57ca78b9b9|dbaad780561c45aa8e182a154bb4ada0|', '试题库管理——编辑页面', '/exam/question/editPage', '', 'cd4eea87f1a34c26bb86dd57ca78b9b9', 0, 0, 'menu_item.png', 1, '', '', 0, 4, 258, 0); +INSERT INTO `jcdp_sys_module` VALUES ('dd47694e61cf45bc82984245a4d3348b', '|root|975338ae351a4a19af2032fc360af687|dd47694e61cf45bc82984245a4d3348b|', '我经办的工作', '/flowable/processhistory/userdoneindex', NULL, '975338ae351a4a19af2032fc360af687', 0, 0, '', 1, '任务管理', NULL, 3, 1, 161, 1); +INSERT INTO `jcdp_sys_module` VALUES ('de1834427ca54f4e80337f73ccc5359a', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|', '会话日志', '/log/session', NULL, 'b5573ec04afe4602b4b17775ac300267', 0, 0, 'user_goth.png', 1, '监控与审计', NULL, 2, 1, 84, 1); +INSERT INTO `jcdp_sys_module` VALUES ('de48c7ae4d0448ddb64b38e20bf25918', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de48c7ae4d0448ddb64b38e20bf25918|', '数据库连接池', './druid', NULL, 'b5573ec04afe4602b4b17775ac300267', 0, 0, 'database_lightning.png', 1, '监控与审计', NULL, 3, 6, 83, 1); +INSERT INTO `jcdp_sys_module` VALUES ('dec9f52c25c84b6ebe36af37cc8d7494', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|dec9f52c25c84b6ebe36af37cc8d7494|', '页面权限', NULL, NULL, 'fca7520f7cda4daa9ebcebaa8b52c54a', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 49, 0); +INSERT INTO `jcdp_sys_module` VALUES ('df9969475d47473c93d7d83f23f430ef', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|', '参数与字典', NULL, NULL, '28c3a95347024c4fb1b6395887a09409', 0, 1, 'folder_key.png', 1, '系统管理', NULL, 1, 0, 6, 1); +INSERT INTO `jcdp_sys_module` VALUES ('df9a01cd017f40ee89630f6d2e8bdb24', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|61f47b38b6b74740af8a6cd44ca5d654|df9a01cd017f40ee89630f6d2e8bdb24|', '数据权限', NULL, NULL, '61f47b38b6b74740af8a6cd44ca5d654', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 24, 0); +INSERT INTO `jcdp_sys_module` VALUES ('e311bca4eeba42a79ebc3f0f3cfbe419', '|root|ba85127869a3419cbc279cf959967547|c8c9d34b2f9f497f9ccb294a7c438d05|e311bca4eeba42a79ebc3f0f3cfbe419|', '创建考试', '/train/plantodo/createclassindex?pg=7', NULL, 'c8c9d34b2f9f497f9ccb294a7c438d05', 0, 0, '', 1, '考试管理', NULL, 1, 1, 200, 1); +INSERT INTO `jcdp_sys_module` VALUES ('e3b370a851ec440391f8c4531b66f7ed', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|06959fba43e54a98a5902bc90cede514|e3b370a851ec440391f8c4531b66f7ed|', '数据权限', NULL, NULL, '06959fba43e54a98a5902bc90cede514', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 80, 0); +INSERT INTO `jcdp_sys_module` VALUES ('e40528451cca424ea7760eb4bf2ef4a6', '|root|28c3a95347024c4fb1b6395887a09409|e40528451cca424ea7760eb4bf2ef4a6|', '问题反馈', '', NULL, '28c3a95347024c4fb1b6395887a09409', 0, 1, 'bug_error.png', 1, '系统管理', NULL, 7, 0, 145, 1); +INSERT INTO `jcdp_sys_module` VALUES ('e57053ece8c2420e87170a0de30a04eb', '|root|8abb6a681dfe4040b8a6a94584f53933|e57053ece8c2420e87170a0de30a04eb|', '发起活动并制作调查问卷', '/research/research/examindex?pg=2', NULL, '8abb6a681dfe4040b8a6a94584f53933', 0, 0, '', 1, '调研管理', NULL, 2, 1, 234, 1); +INSERT INTO `jcdp_sys_module` VALUES ('e6293d8e15ba4d84b86896d60eed6806', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|7d6279051f5e4d3ba6de1e13b71e405b|e6293d8e15ba4d84b86896d60eed6806|', '基础操作-编辑模块-控制器下的页面与数据信息', '/module/module/getCActionTreeJson', NULL, '7d6279051f5e4d3ba6de1e13b71e405b', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 33, 0); +INSERT INTO `jcdp_sys_module` VALUES ('e82dd62b272e4cc3ac89a2f2957c84ae', '|root|510998e99c924665806c0e20bbbcc2b2|b9c62e8e49994504804bb3707b865dd0|e82dd62b272e4cc3ac89a2f2957c84ae|', '登记培训情况', '/train/outtrain/registerindex?pg=6', NULL, 'b9c62e8e49994504804bb3707b865dd0', 0, 0, '', 1, '非经济责任制单位外派培训', NULL, 6, 1, 214, 1); +INSERT INTO `jcdp_sys_module` VALUES ('e84381fd49f54ae487e241f152e808d0', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|', '部门级计划内计划制定', '', NULL, '93093b73a7be4daf837e7f88dd51495a', 0, 0, '', 1, '教育培训计划制定', NULL, 1, 0, 172, 1); +INSERT INTO `jcdp_sys_module` VALUES ('e9097e65fde94905a6be071344f0d3c7', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|db720fda636847ac9dd7927a30f42538|e9097e65fde94905a6be071344f0d3c7|', '数据权限', NULL, NULL, 'db720fda636847ac9dd7927a30f42538', 0, 0, 'database.png', 1, NULL, NULL, 0, 3, 10, 0); +INSERT INTO `jcdp_sys_module` VALUES ('ebfd6227aaf0413496b41de7348928e6', '|root|847723e4606548c6ad6be266877d66e9|6de03605d78248f5bdbfe413d00a63ee|ebfd6227aaf0413496b41de7348928e6|', '部门领导审核', '/train/yearsummary/groupindex?pg=3', NULL, '6de03605d78248f5bdbfe413d00a63ee', 0, 0, '', 1, '部门年度培训', NULL, 3, 1, 206, 1); +INSERT INTO `jcdp_sys_module` VALUES ('ec80d7ef508c4f6aa1b661f3af33315f', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|7d6279051f5e4d3ba6de1e13b71e405b|ec80d7ef508c4f6aa1b661f3af33315f|', '模块列表-右侧分页列表', '/module/module/list', NULL, '7d6279051f5e4d3ba6de1e13b71e405b', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 37, 0); +INSERT INTO `jcdp_sys_module` VALUES ('ed67012b86944125962f4bfc0cacae77', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|a7c9859b798a40c58f6b7429a8c926c2|ed67012b86944125962f4bfc0cacae77|', '设置角色用户-添加用户', '/role/role/selectUsersToRole', NULL, 'a7c9859b798a40c58f6b7429a8c926c2', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 116, 0); +INSERT INTO `jcdp_sys_module` VALUES ('edf9044b8ab74e99b53a3f7df0dff0b3', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|edf9044b8ab74e99b53a3f7df0dff0b3|', '页面权限', NULL, NULL, 'a69485e310244d39aa6359147077487c', 0, 0, 'page.png', 1, NULL, NULL, 0, 2, 285, 0); +INSERT INTO `jcdp_sys_module` VALUES ('ef55cf5948514c6a98098be116a14195', '|root|93093b73a7be4daf837e7f88dd51495a|e84381fd49f54ae487e241f152e808d0|a69485e310244d39aa6359147077487c|17cb1a4f18d64521873256ddddbc1d07|ef55cf5948514c6a98098be116a14195|', '基础操作-部门计划内培训计划列表', '/train/groupInPlan/list', NULL, '17cb1a4f18d64521873256ddddbc1d07', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 289, 0); +INSERT INTO `jcdp_sys_module` VALUES ('f02354e59cdf42eabd363c07fbbf8d50', '|root|28c3a95347024c4fb1b6395887a09409|df9969475d47473c93d7d83f23f430ef|4daeb9e341c7491c8087bfa04ab071b1|285b1b61e465418d8a09a896ae4b98e5|f02354e59cdf42eabd363c07fbbf8d50|', '列表', '/dict/dict/list', NULL, '285b1b61e465418d8a09a896ae4b98e5', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 21, 0); +INSERT INTO `jcdp_sys_module` VALUES ('f406acbfde644e8893943f5129417a6b', '|root|510998e99c924665806c0e20bbbcc2b2|76ccbd8e2c7c4ffb8709396dc5059526|f406acbfde644e8893943f5129417a6b|', '所级管理员审批', '/train/outtrain/deleteindex?pg=8', NULL, '76ccbd8e2c7c4ffb8709396dc5059526', 0, 0, '', 1, '外派培训计划删除', NULL, 3, 1, 278, 1); +INSERT INTO `jcdp_sys_module` VALUES ('f4d3ceac356e40dab2ebbafe6781d225', '|root|8abb6a681dfe4040b8a6a94584f53933|f4d3ceac356e40dab2ebbafe6781d225|', '指定调研范围并发放问卷', '/research/research/examindex?pg=3', NULL, '8abb6a681dfe4040b8a6a94584f53933', 0, 0, '', 1, '调研管理', NULL, 3, 1, 235, 1); +INSERT INTO `jcdp_sys_module` VALUES ('f7d31996b4a0475da3f2e910d88e5654', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|108ab8db661c425ea5a4249b9d4728b5|63e0dd2b4ef54cf39736bbf0c5bacd79|f7d31996b4a0475da3f2e910d88e5654|', '设置用户角色-已授权角色列表', '/user/user/getUserRoles', NULL, '63e0dd2b4ef54cf39736bbf0c5bacd79', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 125, 0); +INSERT INTO `jcdp_sys_module` VALUES ('fa40c359b05a4610846853fcfe2b9209', '|root|28c3a95347024c4fb1b6395887a09409|64913bf0934441fdb20a8a4f70a5f9d9|4e678e835de1411ea5c2e29763eb2d6e|7d6279051f5e4d3ba6de1e13b71e405b|fa40c359b05a4610846853fcfe2b9209|', '基础操作-删除模块', '/module/module/delete', NULL, '7d6279051f5e4d3ba6de1e13b71e405b', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 32, 0); +INSERT INTO `jcdp_sys_module` VALUES ('fc1fbc52b36b4e5b96e3875948970ed6', '|root|ba85127869a3419cbc279cf959967547|fc1fbc52b36b4e5b96e3875948970ed6|', '创建班级', '/train/plantodo/createclassindex?pg=1', NULL, 'ba85127869a3419cbc279cf959967547', 0, 0, '', 1, '教育培训计划实施', NULL, 1, 1, 231, 1); +INSERT INTO `jcdp_sys_module` VALUES ('fca7520f7cda4daa9ebcebaa8b52c54a', '|root|28c3a95347024c4fb1b6395887a09409|d1db8883db7f4bc2a03253a2c94aa0bf|fca7520f7cda4daa9ebcebaa8b52c54a|', '角色信息', '/role/role', NULL, 'd1db8883db7f4bc2a03253a2c94aa0bf', 0, 0, 'role.png', 1, '权限管理', NULL, 2, 1, 48, 1); +INSERT INTO `jcdp_sys_module` VALUES ('ffdc5d687a86463792762f889a3efc32', '|root|28c3a95347024c4fb1b6395887a09409|b5573ec04afe4602b4b17775ac300267|de1834427ca54f4e80337f73ccc5359a|46d7f093459f41bdb5efe6f1fc28a5f3|ffdc5d687a86463792762f889a3efc32|', '基础操作-强制下线', '/log/session/offineUser', NULL, '46d7f093459f41bdb5efe6f1fc28a5f3', 0, 0, 'menu_item.png', 1, NULL, NULL, 0, 4, 230, 0); + +-- ---------------------------- +-- Table structure for jcdp_sys_org +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_org`; +CREATE TABLE `jcdp_sys_org` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `CASCADE_ID` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '节点语义ID', + `NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '功能模块名称', + `HOTKEY` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '热键', + `PARENT_ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父节点流水号', + `IS_LEAF` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否叶子节点', + `IS_AUTO_EXPAND` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否自动展开', + `ICON_NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '节点图标文件名称', + `STATUS` decimal(1, 0) NULL DEFAULT NULL COMMENT '当前状态', + `PARENT_NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父节点名称', + `VECTOR` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '矢量图标', + `SORT_NO` decimal(65, 0) NULL DEFAULT NULL COMMENT '排序号', + `CODE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '组织编码', + `ORGTYPE` decimal(1, 0) NULL DEFAULT NULL COMMENT '组织类型', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_org +-- ---------------------------- +INSERT INTO `jcdp_sys_org` VALUES ('00abc5089d2f4891a83ce81dc8ef57e4', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|00abc5089d2f4891a83ce81dc8ef57e4|', '办公室', NULL, '24b09331aba242068c5d9abe64a5fbb1', 0, 0, NULL, 1, '专用集成电路与应用软件专业部', NULL, 20, '1234', 2); +INSERT INTO `jcdp_sys_org` VALUES ('056d928db141405fb73b7bd635dcbdf1', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|056d928db141405fb73b7bd635dcbdf1|', '信息电子化组', NULL, 'e5a1527bd7b44f00887da4a253b3756a', 1, 0, '', 1, 'XXZX', NULL, 30, '0540012006', 2); +INSERT INTO `jcdp_sys_org` VALUES ('0c749f875b684957a119e11f3175f0ee', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|0c749f875b684957a119e11f3175f0ee|', '应用支持组', NULL, 'e5a1527bd7b44f00887da4a253b3756a', 1, 0, '', 1, 'XXZX', NULL, 15, '0540012003', 2); +INSERT INTO `jcdp_sys_org` VALUES ('1647c07823b14295915ecd6f08d4b78e', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|a39fe42cea154b0380ef0e733846cb81|1647c07823b14295915ecd6f08d4b78e|', 'JAVA技术组', NULL, 'a39fe42cea154b0380ef0e733846cb81', 0, 0, '', 1, '软件室', NULL, 53, '53', 2); +INSERT INTO `jcdp_sys_org` VALUES ('23bbc6c7403740119b17d8d8cd5d3d41', '|root|23bbc6c7403740119b17d8d8cd5d3d41|', '中国电科54所', NULL, 'root', 0, 1, '', 1, '组织架构树', NULL, 1, '001', 1); +INSERT INTO `jcdp_sys_org` VALUES ('24b09331aba242068c5d9abe64a5fbb1', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|', '专用集成电路与应用软件专业部', NULL, '23bbc6c7403740119b17d8d8cd5d3d41', 0, 0, '', 1, 'CENC', NULL, 50, '001011015', 1); +INSERT INTO `jcdp_sys_org` VALUES ('2a6bd512230c477399a8e8cf145d9d0c', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|2a6bd512230c477399a8e8cf145d9d0c|', '逻辑三组', NULL, '8b5cba8e51f74397b7b23361dbe5b0fd', 1, 0, NULL, 1, '集成电路室', NULL, 43, '43', 2); +INSERT INTO `jcdp_sys_org` VALUES ('34c58fd9c04044338fec6008988c1977', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|34c58fd9c04044338fec6008988c1977|', '期刊编辑组', NULL, 'e5a1527bd7b44f00887da4a253b3756a', 0, 0, '', 1, 'XXZX', NULL, 35, '0540012007', 2); +INSERT INTO `jcdp_sys_org` VALUES ('3d3c1b1a1fee459ca75abaae480cfe72', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|3d3c1b1a1fee459ca75abaae480cfe72|', '物理二组', NULL, '8b5cba8e51f74397b7b23361dbe5b0fd', 0, 0, NULL, 1, '集成电路室', NULL, 45, '45', 2); +INSERT INTO `jcdp_sys_org` VALUES ('40d497304211449ab7ed7b56c2fe2d5b', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|a39fe42cea154b0380ef0e733846cb81|40d497304211449ab7ed7b56c2fe2d5b|', '综合组', NULL, 'a39fe42cea154b0380ef0e733846cb81', 0, 0, NULL, 1, '软件室', NULL, 54, '54', 2); +INSERT INTO `jcdp_sys_org` VALUES ('4eaabee195fb48daab6547fd75479583', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|4eaabee195fb48daab6547fd75479583|', '网络管理组', NULL, 'e5a1527bd7b44f00887da4a253b3756a', 0, 0, '', 1, 'XXZX', NULL, 13, '0540012002', 2); +INSERT INTO `jcdp_sys_org` VALUES ('53ededeca0f54b719b517f39f10fcac8', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|00abc5089d2f4891a83ce81dc8ef57e4|53ededeca0f54b719b517f39f10fcac8|', '管理组', NULL, '00abc5089d2f4891a83ce81dc8ef57e4', 0, 0, NULL, 1, '办公室', NULL, 21, '11', 2); +INSERT INTO `jcdp_sys_org` VALUES ('544a21a31a654c22bc8cc91c8dc0e220', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|56b34b5ed9a8482facf3d35cf5c4952c|544a21a31a654c22bc8cc91c8dc0e220|', '市场组', NULL, '56b34b5ed9a8482facf3d35cf5c4952c', 0, 0, NULL, 1, '总体室', NULL, 35, '35', 2); +INSERT INTO `jcdp_sys_org` VALUES ('56b34b5ed9a8482facf3d35cf5c4952c', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|56b34b5ed9a8482facf3d35cf5c4952c|', '总体室', NULL, '24b09331aba242068c5d9abe64a5fbb1', 0, 0, NULL, 1, '专用集成电路与应用软件专业部', NULL, 30, '30', 2); +INSERT INTO `jcdp_sys_org` VALUES ('570a92184f7a4045b05eeb10dcef7103', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|570a92184f7a4045b05eeb10dcef7103|', '档案管理组', NULL, 'e5a1527bd7b44f00887da4a253b3756a', 1, 0, '', 1, 'XXZX', NULL, 40, '0540012008', 2); +INSERT INTO `jcdp_sys_org` VALUES ('59402cbd3d564de69a6781670686c163', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|59402cbd3d564de69a6781670686c163|', '民品', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 35, '0540010006', 2); +INSERT INTO `jcdp_sys_org` VALUES ('5f49d06f887b48af8cfd40f3195c67f1', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|a39fe42cea154b0380ef0e733846cb81|5f49d06f887b48af8cfd40f3195c67f1|', '管理信息化组', NULL, 'a39fe42cea154b0380ef0e733846cb81', 0, 0, NULL, 1, '软件室', NULL, 51, '51', 2); +INSERT INTO `jcdp_sys_org` VALUES ('61375f93a5044ec8a1560ee4cddda4ca', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|56b34b5ed9a8482facf3d35cf5c4952c|61375f93a5044ec8a1560ee4cddda4ca|', '测试组', NULL, '56b34b5ed9a8482facf3d35cf5c4952c', 0, 0, NULL, 1, '总体室', NULL, 34, '34', 2); +INSERT INTO `jcdp_sys_org` VALUES ('68edbd63311648968843f845d86affad', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|68edbd63311648968843f845d86affad|', 'ZF', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 10, '0540010001', 2); +INSERT INTO `jcdp_sys_org` VALUES ('69e48e5a606a420188cc2d06df2f94af', '|root|23bbc6c7403740119b17d8d8cd5d3d41|69e48e5a606a420188cc2d06df2f94af|', '所领导', NULL, '23bbc6c7403740119b17d8d8cd5d3d41', 0, 0, '', 1, 'CENC', NULL, 1, '001001', 1); +INSERT INTO `jcdp_sys_org` VALUES ('84f53e6ffae74272bb9342f2a7bb83eb', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|84f53e6ffae74272bb9342f2a7bb83eb|', 'LW', NULL, 'ba19d8195c2b4056ba7314064d4603af', 0, 0, '', 1, 'JHB', NULL, 15, '0540010002', 2); +INSERT INTO `jcdp_sys_org` VALUES ('88cbf0f1aae14e5c813e5062d611f20c', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|88cbf0f1aae14e5c813e5062d611f20c|', '售后', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 50, '0540010009', 2); +INSERT INTO `jcdp_sys_org` VALUES ('8ae002b416a2485d8173a7b68414c0a8', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|56b34b5ed9a8482facf3d35cf5c4952c|8ae002b416a2485d8173a7b68414c0a8|', '二组', NULL, '56b34b5ed9a8482facf3d35cf5c4952c', 0, 0, NULL, 1, '总体室', NULL, 32, '32', 2); +INSERT INTO `jcdp_sys_org` VALUES ('8b5cba8e51f74397b7b23361dbe5b0fd', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|', '集成电路室', NULL, '24b09331aba242068c5d9abe64a5fbb1', 0, 0, NULL, 1, '专用集成电路与应用软件专业部', NULL, 40, '40', 2); +INSERT INTO `jcdp_sys_org` VALUES ('96f6400cb8c44f69af01ae24ddb94441', '|root|23bbc6c7403740119b17d8d8cd5d3d41|69e48e5a606a420188cc2d06df2f94af|96f6400cb8c44f69af01ae24ddb94441|', '办公室', NULL, '69e48e5a606a420188cc2d06df2f94af', 0, 1, '', 1, 'LD', NULL, 10, '0002', 2); +INSERT INTO `jcdp_sys_org` VALUES ('97647359d99c4282b501ff21a2b8e07c', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|a39fe42cea154b0380ef0e733846cb81|97647359d99c4282b501ff21a2b8e07c|', '制造信息化组', NULL, 'a39fe42cea154b0380ef0e733846cb81', 0, 0, NULL, 1, '软件室', NULL, 52, '52', 2); +INSERT INTO `jcdp_sys_org` VALUES ('9859c597de5544e69973b6ff0c57013b', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|00abc5089d2f4891a83ce81dc8ef57e4|9859c597de5544e69973b6ff0c57013b|', '技术组', NULL, '00abc5089d2f4891a83ce81dc8ef57e4', 0, 0, NULL, 1, '办公室', NULL, 22, '12', 2); +INSERT INTO `jcdp_sys_org` VALUES ('9cab7973526d4d7bad31a06158ed850c', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|9cab7973526d4d7bad31a06158ed850c|', '物理一组', NULL, '8b5cba8e51f74397b7b23361dbe5b0fd', 0, 0, NULL, 1, '集成电路室', NULL, 44, '44', 2); +INSERT INTO `jcdp_sys_org` VALUES ('9e31f6f3535045989fad4f182ed7251d', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|9e31f6f3535045989fad4f182ed7251d|', '逻辑二组', NULL, '8b5cba8e51f74397b7b23361dbe5b0fd', 1, 0, NULL, 1, '集成电路室', NULL, 42, '42', 2); +INSERT INTO `jcdp_sys_org` VALUES ('a39fe42cea154b0380ef0e733846cb81', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|a39fe42cea154b0380ef0e733846cb81|', '软件室', NULL, '24b09331aba242068c5d9abe64a5fbb1', 0, 0, NULL, 1, '专用集成电路与应用软件专业部', NULL, 50, '11', 2); +INSERT INTO `jcdp_sys_org` VALUES ('a61c1ddeb3af411f8366f39757c57738', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|a61c1ddeb3af411f8366f39757c57738|', '中心办', NULL, 'e5a1527bd7b44f00887da4a253b3756a', 0, 0, '', 1, 'XXZX', NULL, 10, '0540012001', 2); +INSERT INTO `jcdp_sys_org` VALUES ('a67a6394173c4a75a91b380e2bbdc882', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|a67a6394173c4a75a91b380e2bbdc882|', '会务', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 60, '0540010011', 2); +INSERT INTO `jcdp_sys_org` VALUES ('b20a642c3f00409daa21ea67b33d21bc', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|b20a642c3f00409daa21ea67b33d21bc|', '生产', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 45, '0540010008', 2); +INSERT INTO `jcdp_sys_org` VALUES ('ba19d8195c2b4056ba7314064d4603af', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|', '调度与经济运行部', NULL, '23bbc6c7403740119b17d8d8cd5d3d41', 0, 0, '', 1, 'CENC', NULL, 20, '001003005', 1); +INSERT INTO `jcdp_sys_org` VALUES ('bd0fed43a10b4b0d80ea6ac7711172c9', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|bd0fed43a10b4b0d80ea6ac7711172c9|', '系统二组', NULL, '8b5cba8e51f74397b7b23361dbe5b0fd', 1, 0, NULL, 1, '集成电路室', NULL, 47, '47', 2); +INSERT INTO `jcdp_sys_org` VALUES ('bde6afaf2bae4cb0aa6f3816c60f06f6', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|bde6afaf2bae4cb0aa6f3816c60f06f6|', '逻辑一组', NULL, '8b5cba8e51f74397b7b23361dbe5b0fd', 1, 0, NULL, 1, '集成电路室', NULL, 41, '41', 2); +INSERT INTO `jcdp_sys_org` VALUES ('c956703711334bc3ae405fd0fbe4cea1', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|c956703711334bc3ae405fd0fbe4cea1|', 'TJ', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 30, '0540010005', 2); +INSERT INTO `jcdp_sys_org` VALUES ('ca098c0b5c704403b9fe4038358d4a46', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|ca098c0b5c704403b9fe4038358d4a46|', '文献管理组', NULL, 'e5a1527bd7b44f00887da4a253b3756a', 1, 0, '', 1, 'XXZX', NULL, 20, '0540012004', 2); +INSERT INTO `jcdp_sys_org` VALUES ('cdbf0aa146cf46c6b6b6b289d125d357', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|cdbf0aa146cf46c6b6b6b289d125d357|', 'KH', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 20, '0540010003', 2); +INSERT INTO `jcdp_sys_org` VALUES ('e0d83701ce704a938cb7f063d9d7e6d2', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|e0d83701ce704a938cb7f063d9d7e6d2|', '系统一组', NULL, '8b5cba8e51f74397b7b23361dbe5b0fd', 0, 0, NULL, 1, '集成电路室', NULL, 46, '46', 2); +INSERT INTO `jcdp_sys_org` VALUES ('e145d300aaf346e3a062014e29499f0d', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|e145d300aaf346e3a062014e29499f0d|', '部办', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 55, '0540010010', 2); +INSERT INTO `jcdp_sys_org` VALUES ('e2f603dda6c048359a70b759d4749648', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|56b34b5ed9a8482facf3d35cf5c4952c|e2f603dda6c048359a70b759d4749648|', '三组', NULL, '56b34b5ed9a8482facf3d35cf5c4952c', 0, 0, NULL, 1, '总体室', NULL, 33, '33', 2); +INSERT INTO `jcdp_sys_org` VALUES ('e3ebd748b2f54cb2add12fcf229d40b7', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|56b34b5ed9a8482facf3d35cf5c4952c|e3ebd748b2f54cb2add12fcf229d40b7|', '一组', NULL, '56b34b5ed9a8482facf3d35cf5c4952c', 0, 0, NULL, 1, '总体室', NULL, 31, '31', 2); +INSERT INTO `jcdp_sys_org` VALUES ('e5a1527bd7b44f00887da4a253b3756a', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|', '信息中心', NULL, '23bbc6c7403740119b17d8d8cd5d3d41', 0, 0, '', 1, 'CENC', NULL, 10, '001009009', 1); +INSERT INTO `jcdp_sys_org` VALUES ('ebf9f22f742d4167833707dfa83c7418', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|ebf9f22f742d4167833707dfa83c7418|', 'HJ', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 25, '0540010004', 2); +INSERT INTO `jcdp_sys_org` VALUES ('ec0a8a5204b847ab8a8125f7249c7bce', '|root|23bbc6c7403740119b17d8d8cd5d3d41|e5a1527bd7b44f00887da4a253b3756a|ec0a8a5204b847ab8a8125f7249c7bce|', '情报研究组', NULL, 'e5a1527bd7b44f00887da4a253b3756a', 1, 0, '', 1, 'XXZX', NULL, 25, '0540012005', 2); +INSERT INTO `jcdp_sys_org` VALUES ('fb27b413d03d4fc18eb714fc811268ab', '|root|23bbc6c7403740119b17d8d8cd5d3d41|24b09331aba242068c5d9abe64a5fbb1|8b5cba8e51f74397b7b23361dbe5b0fd|fb27b413d03d4fc18eb714fc811268ab|', '未分组', NULL, '8b5cba8e51f74397b7b23361dbe5b0fd', 1, 0, '', 1, '集成电路室', NULL, 50, '000-1', 9); +INSERT INTO `jcdp_sys_org` VALUES ('ff3ddb335f5949cc81037cc8158319e5', '|root|23bbc6c7403740119b17d8d8cd5d3d41|ba19d8195c2b4056ba7314064d4603af|ff3ddb335f5949cc81037cc8158319e5|', '运行', NULL, 'ba19d8195c2b4056ba7314064d4603af', 1, 0, '', 1, 'JHB', NULL, 40, '0540010007', 2); + +-- ---------------------------- +-- Table structure for jcdp_sys_parameter +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_parameter`; +CREATE TABLE `jcdp_sys_parameter` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NAME` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `KEYKEY` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `VALUE` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + `CATEGORY` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `NOTE` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL, + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_parameter +-- ---------------------------- +INSERT INTO `jcdp_sys_parameter` VALUES ('0b857396a13b4f8da127adb5f45ccd3d', '用户密码重置默认密码', 'user_default_password', 'QWE123456asd', 'cd537001b4454282aa83db0a49b852dc', NULL); +INSERT INTO `jcdp_sys_parameter` VALUES ('0d46e40308004bc98e6f2add51f2553d', '平台远程地址', 'jcdpPlatformUrl', 'http://10.2.98.33:8080/jcdp', 'db42a5ecae054732bad470ab4a565822', '注意:该地址为生成应用的JCDP平台地址,该配置项可以获取版本差异,进行项目更新(未来规划功能)'); +INSERT INTO `jcdp_sys_parameter` VALUES ('184c747d96894fd2af0734c23b9e7e80', '会话失效提示', 'sessionInvalidMsg', '会话已失效,请重新登录!', 'c1b5c67d77f9469da130f71d5d1d8f02', ''); +INSERT INTO `jcdp_sys_parameter` VALUES ('1efa0782adc94ee2bf026149c3f00c77', '是否随机设置用户密码', 'user_default_password_random', 'true', 'cd537001b4454282aa83db0a49b852dc', 'false-使用默认密码(使用user_default_password参数);true-使用随机密码'); +INSERT INTO `jcdp_sys_parameter` VALUES ('2db17879d69742638dd757b8719311a7', '技术支持', 'jcdp.app.techSupport', '中国电子科技集团公司第五十四研究所', 'db42a5ecae054732bad470ab4a565822', ''); +INSERT INTO `jcdp_sys_parameter` VALUES ('3526a08503744e3a8dbeada42d7e48ae', '静态文件地址', 'assetUrl', 'local', 'db42a5ecae054732bad470ab4a565822', 'local-使用本地服务器\r\n远程服务器(例如:http://10.2.98.33:4545/jcdp)'); +INSERT INTO `jcdp_sys_parameter` VALUES ('3dc3b549f6854c7d91a8dd936781ec46', '版权信息', 'jcdp.app.copyright', 'Copyright © 2015-2017 中国电子科技集团公司第五十四研究所', 'db42a5ecae054732bad470ab4a565822', ''); +INSERT INTO `jcdp_sys_parameter` VALUES ('4177232a5b244e9797bc47ff7d9d5c2d', '删除用户类型', 'user_delete_flag', '0', 'cd537001b4454282aa83db0a49b852dc', '0:不从数据库删除用户信息;\r\n1:删除用户及相关信息。'); +INSERT INTO `jcdp_sys_parameter` VALUES ('43a420e05f5b4159a562d0ce1fa1e4bb', '密码重置邮件模板', 'resetpassword_temp', '${username}:
\r\n 欢迎您使用${sysname}
\r\n您的密码已重置,重置后的账号信息如下:
\r\n用户名:${loginname}
\r\n密码:${password}
', 'cd537001b4454282aa83db0a49b852dc', 'freemarker模板:\r\nrootUrl:网站地址\r\nloginname:登录账号\r\nusername:姓名\r\npassword:密码\r\nsysname:系统名称'); +INSERT INTO `jcdp_sys_parameter` VALUES ('45b89ec7bb74495a83c1ad7041d27807', '系统运行模式', 'jcdpRunMode', 'debug', 'db42a5ecae054732bad470ab4a565822', 'debug-调试模式,release-发布模式\n注意:改变运行模式,只改变服务层(service)、应用层运行模式(controller),若想改变框架层运行模式,请修改jcdp.properties'); +INSERT INTO `jcdp_sys_parameter` VALUES ('526295e82cc4433a9de59015ed6cdd35', 'RabbitMQ配置', 'rabbitmq', '{\r\nservers:\r\n[\r\n{server:\"10.55.12.109:5672\"}\r\n],\r\nusername:\"chatuser\",\r\npassword:\"comerc@cetc54.com\"\r\n}', 'db42a5ecae054732bad470ab4a565822', 'RabbitMQ消息队列配置\r\n{\r\n servers:[{server:\"\"}],//服务器列表\r\n username:\"admin\",//用户名\r\n passwrod:\"admin\"//密码\r\n}'); +INSERT INTO `jcdp_sys_parameter` VALUES ('52e951402a5e4f51adb13806a64cf6ad', '16X16图标路径', 'Icon16Path', '/icon/Icon16', 'ac52e67a184e4302b157a008dbe9f11a', '相对静态文件路径'); +INSERT INTO `jcdp_sys_parameter` VALUES ('58008d2b65394dd090d98d937324cab4', '页面风格', 'pageStyle', '{Firefox:\"cetc54\",MSIE:\"cetc54\"}', 'db42a5ecae054732bad470ab4a565822', 'cetc54-传统风格,适配IE低版本;\r\nsmart-响应式布局,适配现代浏览器。'); +INSERT INTO `jcdp_sys_parameter` VALUES ('6c9486464aaa4107b1e5b61a957838cc', '用户头像上传目录', 'jcdp.uploadFile.userImg', 'userAvatars', 'db42a5ecae054732bad470ab4a565822', '该路径在jcdp.uploadFileRoot之下'); +INSERT INTO `jcdp_sys_parameter` VALUES ('7c62d02179be4107adeab84bfc1e5a88', '服务器端口', 'jcdp.serverPort', '{enable:false,http:80,https:443}', 'db42a5ecae054732bad470ab4a565822', '{\r\nenable:true,-----是否启用端口配置\r\nhttp:80,----http服务端口\r\nhttps:43----https服务端口\r\n}'); +INSERT INTO `jcdp_sys_parameter` VALUES ('80d6ddf63dc94a268bde7e28ac7e9b4c', '新增用户发送邮件模板', 'addUserEmail_temp', '${username}:
\r\n 欢迎您使用${sysname}
\r\n你的账号信息:
\r\n用户名:${loginname}
\r\n密码:${password}
', 'cd537001b4454282aa83db0a49b852dc', 'freemarker模板:\r\nrootUrl:网站地址\r\nloginname:登录账号\r\nusername:姓名\r\npassword:密码\r\nsysname:系统名称'); +INSERT INTO `jcdp_sys_parameter` VALUES ('815a6e000a1a451089c76b905428ed67', '系统标题-英文', 'jcdp.app.title_en', 'Education Train Management System', 'db42a5ecae054732bad470ab4a565822', ''); +INSERT INTO `jcdp_sys_parameter` VALUES ('8e62fb61781041c5829e901089388e8c', '数据没有权限提示', 'data_noPermission', '没有访问【{actionDisplayname}】的权限。', 'c1b5c67d77f9469da130f71d5d1d8f02', '可选参数:\r\n{actionDisplayName}-aciton中文名\r\n{actionPath}-action路径'); +INSERT INTO `jcdp_sys_parameter` VALUES ('98e6707cf0b3464da58c695095e8c174', '页面没有权限提示', 'page_noPermission', '没有访问【{actionDisplayname}】的权限。', 'c1b5c67d77f9469da130f71d5d1d8f02', '可选参数:\r\n{actionDisplayName}-aciton中文名\r\n{actionPath}-action路径'); +INSERT INTO `jcdp_sys_parameter` VALUES ('9feb1a3ec9c64522907a27ffd89403af', '系统标题-中文', 'jcdp.app.title_cn', '教育培训管理系统', 'db42a5ecae054732bad470ab4a565822', ''); +INSERT INTO `jcdp_sys_parameter` VALUES ('a61e8f859b874e2f85762a70ff47c2f9', '新增用户是否发送邮件', 'addUserEmailNotice', 'true', 'cd537001b4454282aa83db0a49b852dc', 'false-不发送;true-发送(请在【平台参数】中配置【发送邮件配置】)'); +INSERT INTO `jcdp_sys_parameter` VALUES ('a85fd75bf5e64b90ad8fb61e17b2bf02', '业务系统自定义显示', 'portalCustomUrl', 'index/portal_custom', '9f8cac9e3b73407a8106f37268e70ae9', '业务系统可以自定义的区域页面链接\r\n默认:index/portal_custom'); +INSERT INTO `jcdp_sys_parameter` VALUES ('aa7a71c7d27f463e9fb469cc8b32bf79', '上传文件存储位置', 'jcdp.uploadFileRoot', 'WEB-INF\\uploadFiles', 'db42a5ecae054732bad470ab4a565822', '默认值:uploadFiles'); +INSERT INTO `jcdp_sys_parameter` VALUES ('b108353acebf4fc3950bb1c242267925', '平台版本', 'jcdp.version', '1.1', 'db42a5ecae054732bad470ab4a565822', ''); +INSERT INTO `jcdp_sys_parameter` VALUES ('bf4a2fd2dd6b4f299df12f9349d95656', '密码重置是否发送邮件', 'resetpassword_mail', 'false', 'cd537001b4454282aa83db0a49b852dc', 'false-不发送;true-发送(请在【平台参数】中配置【发送邮件配置】)'); +INSERT INTO `jcdp_sys_parameter` VALUES ('c0ffcd670aac43beb2361d361d90723a', '快捷导航系统默认JSON', 'shortcutJson', '[{\"bg\":\"bg-color-blue\",\"href\":\"./inbox\",\"icon\":\"fa-inbox\",\"id\":\"4dbf4801f6c74c05b07629d037c072ba\",\"title\":\"消息\"},{\"bg\":\"bg-color-purple\",\"href\":\"./user/userprofile\",\"icon\":\"fa-user\",\"id\":\"b0a68ab9eb434f77843ed1e6a02eb2d1\",\"title\":\"个人信息\"}]', 'db42a5ecae054732bad470ab4a565822', '默认值:[{\"bg\":\"bg-color-blue\",\"href\":\"./inbox\",\"icon\":\"fa-envelope\",\"id\":\"4dbf4801f6c74c05b07629d037c072ba\",\"title\":\"消息\"},{\"bg\":\"bg-color-pinkDark\",\"href\":\"./user/userprofile\",\"icon\":\"fa-user\",\"id\":\"b0a68ab9eb434f77843ed1e6a02eb2d1\",\"title\":\"个人信息\"}]'); +INSERT INTO `jcdp_sys_parameter` VALUES ('c6fd17e514a0422695492e8a9cbbe5a0', '应用logo', 'jcdp.logo.png', '', 'db42a5ecae054732bad470ab4a565822', '应用图标\r\n*为空则使用默认logo'); +INSERT INTO `jcdp_sys_parameter` VALUES ('d315d1045dd4417681ddd7befe402ee0', '应用ico', 'jcdp.logo.ico', '', 'db42a5ecae054732bad470ab4a565822', '应用ico会显示在网址前面和标签页\r\n*为空则使用默认ico'); +INSERT INTO `jcdp_sys_parameter` VALUES ('d5874f7516d4431ba19585db137fd73f', '首页选中是否刷新', 'portalUpdateOnOpen', 'true', '9f8cac9e3b73407a8106f37268e70ae9', 'true-打开时刷新 false-永不刷新'); +INSERT INTO `jcdp_sys_parameter` VALUES ('dc53e73e4ee047158e5a5613deb17fe3', '32X32图标路径', 'Icon32Path', '/icon/Icon32', 'ac52e67a184e4302b157a008dbe9f11a', '相对静态文件路径'); +INSERT INTO `jcdp_sys_parameter` VALUES ('ddc8afea829140cd89b66c379a780842', '联系管理员', 'contact_admin', '请联系管理员(电话:88888)', 'c1b5c67d77f9469da130f71d5d1d8f02', NULL); +INSERT INTO `jcdp_sys_parameter` VALUES ('e9552dbdd23546b58f2f1bcebf5488a6', '发送邮件配置', 'sendEmailConfig', '{\r\nhost:\'smtp.cetc54.com\',\r\nusername:\'Y08066@cetc54.com\',\r\npassword:\'cetc54@123456\'\r\n}', 'db42a5ecae054732bad470ab4a565822', ''); +INSERT INTO `jcdp_sys_parameter` VALUES ('ee49e548da0a4165a7ffdd6a8ba5c2f4', '图标样式文件名称', 'IconCSSName', 'icon.css', 'ac52e67a184e4302b157a008dbe9f11a', '可以通过修改该值改变icon样式'); +INSERT INTO `jcdp_sys_parameter` VALUES ('f0794cf8add246ce89012b5698d1fbb0', '首页地址', 'portalUrl', 'index/portal', '9f8cac9e3b73407a8106f37268e70ae9', NULL); + +-- ---------------------------- +-- Table structure for jcdp_sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_role`; +CREATE TABLE `jcdp_sys_role` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `NAME` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色名称', + `ROLETYPE` decimal(1, 0) NULL DEFAULT NULL COMMENT '角色类型', + `STATUS` decimal(1, 0) NULL DEFAULT NULL COMMENT '当前状态', + `REAMRK` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `CREATER_ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人ID', + `CREATER_ORGID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人所属部门ID', + `CREATER_ORG_CASCADEID` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '创建人所属部门节点语义ID', + `CREATER_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_role +-- ---------------------------- +INSERT INTO `jcdp_sys_role` VALUES ('2e7dc18e84a142b6883fad9142087f16', '教育培训系统管理员', 1, 1, '', 'fe24c4ac34444902a2129ec1debf9ed4', '23bbc6c7403740119b17d8d8cd5d3d41', '|root|23bbc6c7403740119b17d8d8cd5d3d41|', '2019-08-07 08:26:18'); +INSERT INTO `jcdp_sys_role` VALUES ('6c72a8da1fe246e9a92c2185b5317630', '部门管理员', 1, 1, '', 'fe24c4ac34444902a2129ec1debf9ed4', '23bbc6c7403740119b17d8d8cd5d3d41', '|root|23bbc6c7403740119b17d8d8cd5d3d41|', '2017-06-08 15:25:55'); + +-- ---------------------------- +-- Table structure for jcdp_sys_role_module +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_role_module`; +CREATE TABLE `jcdp_sys_role_module` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `ROLEID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色ID', + `ACTIONVALUE` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Action权限值', + `ACTIONOP_JSON` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '扩展权限Json', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_role_module +-- ---------------------------- +INSERT INTO `jcdp_sys_role_module` VALUES ('012424e2591c4c838c832e5904e0d631', '6c72a8da1fe246e9a92c2185b5317630', '9y3fk0afzh78msgeqr355u62ydcsbp90n3iovf9583n47v4ge9u3z0ph85', '[{\"action\":\"/dict/category/list\",\"value\":2},{\"action\":\"/user/org/getListAll\",\"value\":2},{\"action\":\"/user/org/list\",\"value\":2},{\"action\":\"/role/role/list\",\"value\":2},{\"action\":\"/log/log/list\",\"value\":2},{\"action\":\"/log/session/list\",\"value\":2}]'); +INSERT INTO `jcdp_sys_role_module` VALUES ('7d4597d55fa64b6794075d94230d0160', 'fb52cfd860864f018bd1b19d24e941d1', 'qxz0aoipohhd4zuv5jyyv45mav', '[]'); +INSERT INTO `jcdp_sys_role_module` VALUES ('825572d82ee04e3099a02510f76c0a85', '2e7dc18e84a142b6883fad9142087f16', 'jw6rkjs8hexkdmq6tgx7hu2wi48hdf6epcnqhnc8gqf62jozgvb3s9vjzz', '[{\"action\":\"/dict/category/list\",\"value\":3},{\"action\":\"/user/org/getListAll\",\"value\":7},{\"action\":\"/user/org/list\",\"value\":7},{\"action\":\"/role/role/list\",\"value\":7},{\"action\":\"/log/log/list\",\"value\":7},{\"action\":\"/log/session/list\",\"value\":7}]'); + +-- ---------------------------- +-- Table structure for jcdp_sys_session +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_session`; +CREATE TABLE `jcdp_sys_session` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `SESSIONID` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '会话ID', + `LOGINNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录账户', + `USERNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户姓名', + `IPADDRESS` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户端IP', + `CLIENTTYPE` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '客户端类型', + `OWNER` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '服务器节点', + `CREATETIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `SESSIONSTATE` decimal(1, 0) NULL DEFAULT NULL COMMENT '会话状态', + `INVALIDTIME` datetime(0) NULL DEFAULT NULL COMMENT '失效时间', + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户ID', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_session +-- ---------------------------- +INSERT INTO `jcdp_sys_session` VALUES ('0024a92087bc4d2ea4ffd1ab4f1389e7', '78E66204BF2D15DD7F8AF3EDB4D6C689', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-21 08:02:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('00304b3e13c3413382fa4e126513a908', '76DF2134E7504A6F3E7DB7528307E01E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:08:03', 0, '2018-01-17 18:15:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('00457f96acb049a185fe58aa3c9d9a47', 'CC1A35BAF61F3BD6EDBB67378438C1B9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-20 14:50:57', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('017cea2f879240a99c31f21886ebab57', '942DE0D557582858AB56884F036CE66B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:58:53', 0, '2018-01-10 16:59:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('01b0037b0bf242868a87a772e9fbbb7e', '62EDB10D8BB2E0E705C8F0B0E7CECA3A', 'W02030', '杨卫东', '10.55.148.68', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:31', 0, '2018-01-10 12:08:21', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('0202e29d39344ac8a5a71203526b6517', '298D85FF5C75B9D8C4A51A9C72E1F04A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:33:57', 0, '2018-01-16 17:46:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('0390c823c88b450e8ab2172963dc6fbd', 'A8B2722965054B94F1BBA25924F838FA', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-02 09:18:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('03dc98c5a6b04715ab3bab905c0f7478', '8A1F1D2E5FE24DDC45FBC0C00F7CD1BA', 'P12188', '赵星', '10.55.148.147', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:27', 0, '2018-01-10 14:58:22', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('03f12af2e8874b17a15a6f396fc59c78', '6CB63EB0595F02E7024622AE47636EA8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 08:38:27', 0, '2018-01-17 08:49:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('03fd81b73694409d94fc38a16458a71f', '1AD62B306A4DE40160BDD00595D38C04', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-04 07:55:10', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('051044b652314b27a8dfb31ea02a2dc3', 'D2F73B15624386C0F751F860C0B64CD1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-13 08:15:17', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('051fa89a5c0647c1bf655f8d1e3178f0', '5AE2E7841933479E19F9ABC7B08AF50B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:33:28', 0, '2018-01-10 16:36:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('0556fc3676c54e8fb50f1dcf0a3b76f9', 'F42A15DADB3E94218DF27EDE3CA2F366', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 11:39:28', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('05943b46c5964d2fb5fed81745d33e16', '8560EA78597ED51926F765FDD27115E3', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:10:35', 0, '2018-01-10 16:13:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('05bb2c4cf35841789a1c86979f33c1e9', '81011E0ADC8214C5450389F32B22D42C', 'Y11037', '宁志全', '10.55.148.146', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:28', 0, '2018-01-10 15:45:23', '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('06a3546e34484e14ba17730ab0855d77', '84B1D6805FE059516F524A33F3DD42C0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-23 11:53:09', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('06a6ec1068be45c38c4ef05d5a7f9e73', '7F89531D132142B3BB026E1D0879A6C8', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-04 17:37:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('06c848cc0b564aa9aa3fbe461b263268', '5969DCCD28830D4950C3950943AFE9F7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-27 14:28:39', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('06f56650aba44960bd0f7f350da6128e', '80995BF111F673B8C20D62015AA7094E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 18:00:40', 0, '2018-01-16 18:09:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('07301d75eee84614866bb5374c52fa95', '084FDA5EAE09FA7F31232F2CB038F1B4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-06 11:54:15', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0787879906394a4db85c1bf11019348f', '6A5748F2373816A41C34015F4EE27D81', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:34:03', 0, '2018-01-16 19:34:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('07c6a191e35e4774b5163389681f4419', '968E6ABFDC679B980757AC7A54D73090', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:42:41', 0, '2018-01-10 09:14:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('07fad5bb0939420c8c69bbf8c7714327', '8A8DD266CD80FB7A5145C64DD7297A65', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-18 16:24:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('081c09c683a942929a741ae672168957', 'D71422D6CCA9A5FB674B75CCC2A8CA1A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-16 11:53:17', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('08bb62b2ce31402e8e489326f3530006', 'B09A4DD07F322A254A56CE11AB38A3F7', 'P13160', '郑雨昊', '10.55.148.134', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:01:58', 0, '2018-01-10 11:26:21', '1cb2fb93db774202bdd2532fa57d9bff'); +INSERT INTO `jcdp_sys_session` VALUES ('08e9a6c6b91e4e40981609ca20216bcb', '0D17CF83901B17ABD1F4E8B55CD7D128', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 10:20:45', 0, '2018-01-10 11:03:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('09281c1dcf294887853119aabfefaeb8', 'B3156428F4A2345983DD228AC6D79CBA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:38:38', 0, '2018-01-17 15:49:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('095b8c174fe449a1843057a3f3634db4', '5B1A60421065E43E57D5623C93786083', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'localhost:8080', '2018-01-16 19:21:30', 0, '2018-01-16 20:09:50', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('09898fd30bfb4c74a4d2c4c19b549882', '5233F78491CA1C1B6A8614393765AE6B', 'W07427', '刘聪', '10.55.148.148', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:49:17', 0, '2018-01-09 17:19:47', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('098e7ce8b5ce4a96bf169d3289ca74da', '9D7B9FA5E166EE53BBD6E6CEB8919E69', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:39:25', 0, '2018-01-16 17:46:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('09c8fe04ef20490e8c2d606857f2d17d', '93BF686C185FD3FFE630505A7BAE189C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 10:59:19', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('09d1460a041f46b7a73f1afb41b0a5dc', 'A2EC3AC7D74DCAB58ED855FA60CC9019', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 09:56:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0a058bba88e74ba7a9c1f31caf048bdc', '32A2C7FA2B34B40E9F2F860F83E851E7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-04 14:42:38', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0a6a40bb2005479a8b41aa5351230929', 'B0DA3B49865470F9BA2EE07E676D13EC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-17 16:49:47', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0aa4d4888ea14bc2941a5d2d34a028ca', 'C011AFC3A9D5FD1340297545F9842F62', 'W07427', '刘聪', '10.55.148.148', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:54:25', 1, NULL, 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('0b51dbc4fb4448879aa8ac32cb9ff1ca', 'C8EDB6F1ED1A9E1E7A868080B842D02C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-17 16:07:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0be71a6e701743cfa762cb5b001564f6', 'E9E60D43F2A4A09F446CC7DEC0D7B626', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:10:23', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('0c54c33c681f43b6af992d241e1789b3', '58150B69F15C4C733D40B042A6DCF18A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-26 09:26:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0d20bae860f044c6946648967d611e23', 'FB2C930842CB6211F740A2D6B4CC689F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-22 09:49:31', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0da82e4c17c54e6485aa4cd5be9e93b2', '2FBFE73A53986464A82364844014A4EC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-30 08:15:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0daae835626c41ab98b57f772b3bbf04', 'BC3A555BE40697C4A6A9D80B3FF7A190', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 18:23:17', 0, '2018-01-09 18:33:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('0dbfee1422874c848b875e59bda79243', 'B8E077556CBBD0C3A8D7CE74C352E1C3', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:36:28', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0e0ef6510954487a9f9462e9053d23ef', 'CAAD781574078357194F7D98F8EC6043', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-26 19:08:03', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0e312ac90498430898603c9f47431695', '99E2BD43028FC12CB339476D20775F6A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 10:16:38', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0e38c728cfc8488597646fb0cc0dfcce', '6F1280BA8B6BB4ACC0CAB512C6A1C9C8', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'localhost:8080', '2018-01-16 11:08:18', 0, '2018-01-16 12:16:55', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0f06fe68fbe6448fa0818767e74f5f12', '5814CE473E43738ABA24C29AB6A2D857', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 11:23:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0f96f9a61e6241d59530dd4ff9e89a75', 'EA85C9F8A3B2A73A6E4443ED7008A724', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:11:36', 0, '2018-01-17 15:35:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('0fb82a987de1417cbe26789adac983f3', 'C3D76523508ADF2489E23D19BB0374B1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-20 16:02:12', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('0ffbadc085f94ced8b9b654380d904d9', '9DEBC83EB90C790EDE66F024F82EC55F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-17 09:16:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1043fca179514e0a8da804c5e38c8a2f', 'DCE467452575C9D161E706DEA185DD60', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:52:45', 0, '2018-01-17 15:59:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('106d122ea3824b5c9aff488a1381d1ad', '1CB90064D9BD7E43EBE9DE4133D03B5F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-19 08:11:05', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('107d5c8c7cfa4e31871ae4da2429bc7a', '729178F9BE466B7FC9BF9495C4DFBCA3', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-03 10:16:28', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1099620103d240638b5ca3ef35fbe457', '1CEC57899F8D3252BEC9A7987920F8BB', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 19:01:07', 0, '2018-01-09 19:06:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('10d7c9261af043cfb3a6aa1abaeb48a0', '9812E8A351A5870874825C4C1D7A46F9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:03:40', 0, '2018-01-17 10:16:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('10dc2ab9a30c4ec1815f2cf77b74665e', '83732FA1FD5A063F1A639CFBF9740F1A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; aff-kingsoft-ciba)', 'localhost:8080', '2019-06-21 18:10:08', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1113e50c794e444496b91c357665fcd4', '721D9EB8BE6A04D5C18ED56D9D636D7B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:20:12', 0, '2018-01-10 15:25:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1138b2017fb84cb092898e48d7ff321d', '0944E5CB497B7D863F0E5ABC3C2D7D4A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 10:07:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('11453c56e5044060af9f2c4e6340df8f', 'CEAADBDB983976E45E6832FC4FB8D1C6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-14 11:36:21', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('114aec21fddf4cbe81057e11376ee1f8', '080C4B9A2239A016CA752D9F66057011', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:07:35', 0, '2018-01-17 16:12:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('11b570bdab774664997163007b178ab3', 'E2FF28B0F83DCF9A92DA8E53892DBD47', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:55:07', 0, '2018-01-10 15:45:23', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('123dc8962ae04e27a098996789359b9c', 'DC81BCDF84D97FFCA6E8FB5C2E535A66', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 14:58:19', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('12994046c7a340e38e25a1359cb36f50', 'BFE512AA81690602FE20B9D4D6BF0043', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 08:25:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('12a98d16e8804796a86960c340e91882', '49CB500831A602858B595C6B3D0D8F54', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)', 'localhost:8080', '2019-07-05 09:22:09', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('130e4bec3b9d487daeecd06f8520f25d', 'C03DAAE88B3D3BB293770FD900F90F94', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-14 15:22:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('132534c6033f463da010ddcb77502930', 'E9B4F9E9307153E06E28941A4C1B55EC', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 18:08:59', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('135b8f56766f444caca00cc443cfc8b9', '9648F4FED5B5C875FF1E59CADEB2757F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-22 08:24:39', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('138bc16f4d8c46c4812b716d57996da5', '5CAB397F80DC2F35519F534FC450ACBD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:53:13', 0, '2018-01-17 11:01:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('13fbb3bab8b743219f54249f4707e217', 'D2D174B5A79BDEAEDF0A93A2C7BC3CA0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 08:23:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('140031dcb4844ba9865c92c3329647a8', '8A493271A31FF4752BE17A23FE7CD598', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:11:41', 0, '2018-01-10 16:13:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('142a6e37569a4907b185dba2334a4318', 'AE557A8462022851173D3A54A5C35D35', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:38:33', 0, '2018-01-09 17:44:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1475f0c3f371400abf671598c38ee2fe', '83344FF6BE0624A294EE5DC31B1A394D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:28:29', 0, '2018-01-10 15:30:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('147a52a8185240c3aaab637d6cd20d7b', 'D2018F3D01F31FCDE1B6DC87C6B42862', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 14:50:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('14e736bdfc114a5694affe40deda8ac7', '3319B5D2F79F2296A92CD3439B99927D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:17:40', 0, '2018-01-09 17:24:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('14edce603714414abb8df81ba6223bb7', 'B11E208CF6CBEFA249C0608A00F67E93', 'P16107', '韩燕', '10.55.148.207', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:29', 0, '2018-01-10 11:32:30', 'a6fefe02f64446cb855941af41aa67a9'); +INSERT INTO `jcdp_sys_session` VALUES ('15006fc90b6b4adda3da421d7b48173c', '18989DDB7B2F2BE325553FE1C054802B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:04:09', 0, '2018-01-10 14:35:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1505ec527f7b4a1d9abc3aff0a0fbdcf', 'EB20DC8CE5CABB672DA4DFD3D2702E81', 'Y11037', '宁志全', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 08:58:24', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('15297cb666824a9ab2f9826ca4cad49c', 'E17D11A6B70740A496B4562F8C23265D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 11:30:05', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1534c7eafa134143a4b2503596ed0d22', '4574A2840415A8211DFEE9EC9B36EED6', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 10:44:15', 0, '2018-01-10 10:59:29', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('15778ac415224363818d8f19820930ba', '27CC585108794B41265CA4DEBB6276D4', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:39:16', 0, '2018-01-10 15:45:23', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('158eb7cef0eb4c8ab448004541547049', '1146342ADADC8993DF58E2717D642684', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:14:07', 0, '2018-01-10 14:45:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('15ceeca83e6341c58210af4bcffbe70f', 'A622548B10251C359FCA8146783268BF', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:02:29', 0, '2018-01-10 14:33:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1677cb0e499e4f9481c0bd56045c6063', '4BC98C024FE85F3EE94FC716A20B192A', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:43:29', 0, '2018-01-10 09:14:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('16e6625fae3c4892a33cdf0a1c762e23', 'A57149904D827193A3C5DD4FA4645687', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:33:45', 0, '2018-01-17 10:36:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('177335a565a741cea134e88de523c7ee', 'E2008D30BB14FAEFEAE072CCB1F968A4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-03 08:39:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1837c1ab65d44ac7ba92b8221fc35bce', 'F2D71EA54B268DDA9E57B8B5888EDD32', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 09:56:55', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1845439696bf4ce4905b7cbfe836b9f1', '15DB6C4D7DDC3BD1FB010FBC49F115CC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-04 11:14:14', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('18b313b923574563bae855447c036d45', '4D9ACD6E9D551F5B53B0AB3B693D0CF2', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:08:30', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('18c718052d0043b4bd90e9ca432e75f3', 'D3FAAC708BEC1FBC3B0426EC1168FE5A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 08:58:12', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('190b837785ab425b85e477c447cfe435', 'DAD6B5B9CA505D5A966CA67398D9F82F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 17:32:22', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1a4490fe20e54d73bf1b79921fb6b9c4', '62AD77295F5D85B8F26137FFF22544DB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-11 08:39:26', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1a5efb140a4c49d0ad68e17747494f91', '000CAF3DD5C0DBD587952DF64FE00CC6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 16:59:18', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1a86e4cb18bc4c029f78e809aab98dc8', 'D200C72D6A9BEB3D074926D19F04900C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-30 21:02:25', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1a9e56ecd7b34ea2ab77579e6200d12e', '8A02A76F683B9C52BDD592B1CB4AA9EA', 'W06893', '张立奎', '10.55.148.128', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:04:39', 0, '2018-01-10 15:45:23', '44e74bb07b4b4fceb9ba9ed135ea5e7d'); +INSERT INTO `jcdp_sys_session` VALUES ('1ac1aec080bc483e961b331ab954481d', '5D21532CBC7DB2D9384E9EE1C4FC9E3E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-14 16:16:08', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1adaedc9ead74821b838b8846e8101d6', 'FA6204A347AB8D4B204D175CC9D64D5D', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 14:35:25', 0, '2018-01-09 15:02:44', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1ae5d0798bd04e8cac023979a54ac218', '74218AB17DB2BD931123C5C70556B2A3', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:13:39', 0, '2018-01-10 14:43:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1b0adbf6e27244448121746970bcdf03', 'AB17CD653307F29B087B06C313C10D72', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-13 20:18:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1b31d26fb75842bc887d1fb753d79464', '22FC40E57802372430536D27CD9A65C0', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:56:19', 0, '2018-01-09 15:08:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1beefc213f654094b57e284f2542b22a', 'E551A939CEA0FDE3FD3776F64AFC4337', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 19:01:13', 0, '2018-01-17 19:04:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1c9e034c93524179b08e86689217f001', '477DBD8E71FE6BA4EEE3A42389F63A7E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-09 10:58:31', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1e8c741332054e0fb8cb3916ba007c97', '4BA677AF32BEA65336AFF134A1C1C1CD', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:10:06', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1ef5fbdd27e24a199f5813a5f4c1ff00', '78E4DA667B9D96D96A827DDF12975D1D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 09:57:48', 0, '2018-01-17 10:16:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('1f246540aef040ada03a81c86484ab3c', 'B287ABE38CA82309271E0718EF361C4B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-03 09:19:17', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1f85eef510604995a6f4208a47978a21', 'F71789D56A5CEE8BC6ABDE58DE16943C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:18:14', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1f890ca247124e4a92190e9e79bfac57', '5A93F86654E163649E174DD28F3AF213', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-15 17:44:53', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('1fa7db57d7224b088601636db0dbcb0c', '33ECFD043ACE60259A01B633F04AEF2A', 'Y10027', '辛长平', '10.55.148.140', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:27', 0, '2018-01-10 12:26:21', 'b497ab9b01c74a93b6ee7f079a356070'); +INSERT INTO `jcdp_sys_session` VALUES ('201d36fba485404a9fd949cb64e25fe3', '49E667D0A3A255E18486CA4F7DB2FB0F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:31:43', 0, '2018-01-16 20:01:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('207f563cd3734a438e92546d6bfaf722', '1241CD1366420609B09C1C97D54C8A4F', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:50:32', 0, '2018-01-09 16:53:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('20b2cec4a9e34555bd2dfa3672a15dc6', '39F7192736EB545DE4920385CCB5C5B2', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-14 08:24:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('20db22fb3e0644a896a2860599889644', '696B6C27A3930BA3F38E6900348FD9A3', 'P12188', '赵星', '10.55.148.147', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:24:22', 0, '2018-01-09 14:55:21', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('2165ec1bbcd64ce7beab05790297d905', '62AA73C8122AD9F3A3AD321C8C35CED5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-18 16:31:55', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('227bef16b9d2486a9634b4bf59b1cd81', '1E28B969F5DED1011E378F5EFC0D7FB1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-18 09:09:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('23f2ec22fbee4cca8c82af82b09ee80a', '513471684B3AC70C35B469FC178C9176', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 14:36:03', 0, '2018-01-17 14:41:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('241407e1333246a4a2f8b8ee111668b9', '9513467130B3628BB29D6C72D9E28A24', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:18:04', 0, '2018-01-09 17:24:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('243c305901d14554a717eae316a0b1b5', 'DE8194A72C8CF03BE91EFED519A4DDF4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-03 17:04:53', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('245d0f136b4f4b20a923caf93eea87f1', 'DDE805C05B3515140EDC00E8FBBA79A6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:12:20', 0, '2018-01-16 19:15:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('249ddddc2bf141bab8702356f1cc8880', 'B178A12A74DAC4E6BE21DF23D879F2B9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-25 17:22:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('24b9d10bfc8c4e73a8ea039a49331789', 'DBC204DA939B368149DFCFBFE40BF358', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:37:56', 0, '2018-01-16 20:03:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('254e5a999ad547b7aef3b3fbae5826d3', 'C26A098CC3AFA059C8F9703B58DB6E5D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:37:15', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('25ab453f8a624a24936fc0b3c9ef75c9', '1020B4234405FC5747FDB791D6DD2063', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-14 18:05:05', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('25d44e8a8f9a42928225f18840a59cfe', 'E2870555C7FBC18BEEC39A587C3EDF86', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:15:59', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('262ffb19f70a45b8b5efd7b5aee6536d', '96A3163BC77FDD1DA5884A34D5927D18', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:58:14', 0, '2018-01-17 11:01:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('2672c6861c1641ee9cd7bbbca94ea52b', 'ACBAFD701933A4897D951C417BEC0EA6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 15:20:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('26b070c38326490da45a00a25b46d71d', '787A5383E19889D5A496DA1C7694C6FA', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-12 10:39:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('26cc37a9608549cb90bdcadd52ef3934', 'B042570314E6B52DF88D2C5A0A0241DC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:02:02', 0, '2018-01-17 18:03:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('272cfbf7d0ea4a88aed316d376de510f', 'E4D541D8FE8198391396C66BCCF51D56', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:55:01', 0, '2018-01-10 14:26:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('274d7c843055469abc1e3cdda5cbc575', 'D8717917448EC1CE1D2B9512D54F2D9C', 'P12189', '赵简', '10.55.148.133', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 18:13:09', 0, '2018-01-10 18:20:24', '5676921ac94b4633a614892676567bfb'); +INSERT INTO `jcdp_sys_session` VALUES ('277cb8212b4a4e22acf046c917d5eb08', '9E05039FA8F9BF9FFE73272A63A73F1D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-23 08:43:38', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('27a12dcdce1a4a8594368cf6eaecb8b3', 'EB0839CFB2B7D55E9D624DA4738AB002', 'Y10027', '辛长平', '10.55.148.140', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:57:29', 0, '2018-01-10 15:45:23', 'b497ab9b01c74a93b6ee7f079a356070'); +INSERT INTO `jcdp_sys_session` VALUES ('283432f6e05f4bb2aa3ca5eda28828be', '1A1E51998C2C663D062E5D228AD1B2C4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-13 15:33:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('287c7e48512d4c278a9bd2f05555e660', 'B91BC75B37D8F8EEAA49AC0A59C6CFC5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 10:46:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('28f8e0df90ce43f9b0c6b8138eeb99dc', 'BF2FE5353F12C54FEBC2BC024EC42AE7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 18:32:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2938328d77db4551931f4c68be17ec99', 'B50D9ECA85D2BDE2862E740FBE2464AE', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-17 09:13:02', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('297283ee5acd475c8b8931da7bc8fe83', '40A5047C8651B3B91AB76376A53FE093', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-05 08:44:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2a3604029cad403fa6938a689b4970c3', '0AA8A8EFCD041BBD547B611A516E6D9E', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:57:52', 0, '2018-01-09 16:59:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('2a3a614e44a04db3bd1b8924f7c893e3', 'B783CFF2E1FCDC263A07FA12699124C0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-03 17:31:55', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2a573c09058f446fbbe9feb4510894c1', '120E4262CF53CC68226DCAAD0D846D6F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-14 10:34:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2ad4adcff30742e3b4e6b517b9d83956', 'C2B50E0D5147CD857874318EF497ED51', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-26 17:38:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2aed772e96db453c86ef18ffc1f454a3', '05A0E10118423EDEA64BE781CCFE8BC8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 08:11:11', 0, '2018-01-17 08:15:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('2bb4a2e23f364575aaafb42f50a8b4a4', '8A3C906152487B73FC8008640CD122D3', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:01', 0, '2018-01-10 16:03:02', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('2bbe027c973f432285447b1fd6a2fa88', 'A9E368777FA70D1999F8F27AC7E5D600', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 08:51:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2c97106d529b4de4a0ddb410b69fb7e5', '3C4EE071A06DD9D40D9B63A6C037A670', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-17 09:01:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2ca52d8bf4e647b993c5c68e611653c9', '906DC3AF832BB651359B202521E03EDD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:09:41', 0, '2018-01-17 18:15:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('2cdb161703aa4bec95a269269d1fdace', 'EC3176984338ABECFE9179EE9C329560', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:29:31', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2d806b26445743528cc2beed3fb6455a', 'DFB34D1601BB94F1A22C50DC5B2D2F55', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; aff-kingsoft-ciba)', '10.55.12.110:80', '2018-01-09 14:31:12', 0, '2018-01-09 14:31:43', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('2ebf622fe98b48b5bb6e482e22d963a3', '2D167A8F3E5D9BFFF4A0328223F9F856', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-08 11:45:58', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2ec8f87b0cbd42fc91e9eb4ff9e43156', 'C5EFD4056852A9A325224B33893F6C3B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)', 'localhost:8080', '2019-07-05 09:31:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2f066cb321674c2ea51dca797328d119', '7C362F019D55E509FC4BCCA4A043026B', 'P16107', '韩燕', '10.55.148.207', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:30', 0, '2018-01-10 15:45:23', 'a6fefe02f64446cb855941af41aa67a9'); +INSERT INTO `jcdp_sys_session` VALUES ('2f1e190f7a1d4972a89df6e822294995', 'F875FACA27439F4E974721419897E934', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-10 08:33:26', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('2f277b02e6ae49a1b72086efaa1b1dca', '6F911684A4A55C98D8E5967A3FEE559C', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:25:55', 0, '2018-01-10 14:56:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('2f77e5c68afd4fb5a14373eb13d3426d', '5B7E0969B0E8AD3D5A1A4D16199A8E77', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:36:23', 0, '2018-01-10 16:40:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('2fa2e0e65ea24f37b2300a940eede051', 'B8351306897B28A349145F077C3B8AFE', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 09:58:19', 0, '2018-01-10 11:26:21', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('3001b204cfae46a7af199df1d133bef6', '386CF7A2A5DD128661A3A595016B3488', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-26 09:21:36', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('30e29134a8b64d5cb6a7a4d766db42d6', '1A2CA65331E80EE77EC90330724DC575', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 07:58:56', 0, '2018-01-10 08:00:20', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('313714cc83434bbab57338a0a6466d3b', '13BA86628A69FA30E14C55243001CAB2', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-21 08:30:26', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('31425667771e451fa11956a2ffbb8ebb', 'F554035B85B20BFA8FA25706DA5ABD29', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:48:34', 0, '2018-01-09 17:52:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('31462b0b28014080a129dccf7665d1b3', '24FF882E5607A011F5A5885CBD4CCE50', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-22 16:29:55', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('315d31f4c8bd4668b829a1e407009546', '8F447EB344EFB83D5CBCF549B8CE266F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 08:19:00', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('31690eea58e647e2bb199ac8270fd11b', '328D15961EB39C2C0E6C57B2965854F9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:37:12', 0, '2018-01-17 16:39:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3206cbc6cd074b989cc728ce7990496d', 'EF3B395CA32286688819FA47046A4E63', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-19 15:56:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('321f4eb6ca55463383c517def2631929', '6BC6335044B21AA367942CCB00C0F186', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-01 08:37:30', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('322e90c25c84411fb0e5e3d12ffc0532', '9BE953803B2C74236197926EF14F1BE4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-23 14:45:12', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('32c639a279b54772aa7d066fa96275f7', 'F86DD1B85F24F964CC44BE9BEC549A25', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-02 10:37:19', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('32e46d82965748caad39b97d82184e10', '5B3A390310C5C619A10C360B19FE7517', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-24 12:35:34', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('331f0ac4973f4d8dbc7de1fad6a9ad76', '04C88080C71D8175F860849C56BBBE40', 'Y10027', '辛长平', '10.55.148.140', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:28:50', 0, '2018-01-09 17:16:19', 'b497ab9b01c74a93b6ee7f079a356070'); +INSERT INTO `jcdp_sys_session` VALUES ('336590a772654ed09d94185d2bde586f', '3A3C3E1E2737D1BC0CA663ADE7F44D74', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:33:05', 0, '2018-01-10 09:04:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('339313ea69eb4053bcceb2451c26c169', '764A27975561BFC6984D3569028AE5C7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 20:04:34', 0, '2018-01-16 20:14:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('33d108130bc4439b89f7aec23214ee70', '6D28DB29EA66A7E893147850BDD38743', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 18:43:22', 0, '2018-01-16 18:57:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('34303d6705ec41e798120b01f90f6eb9', 'EB9C9B48EE0F050BDA1B6D5343D4DC37', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-06 14:53:36', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('34635e7af0dc4362ae24d6c90b2c2b2e', 'E404750256144C4C551AB1F486283EA6', 'W07249', '李维佳', '10.55.148.130', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:29', 0, '2018-01-10 11:32:34', '5e0b157de9ae4c2495f3918e7625431a'); +INSERT INTO `jcdp_sys_session` VALUES ('347e53f608ff401eb3bb5650a99d18f8', '040E76F783F14FDDD8728D2D7B1A9481', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-09 09:49:37', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('34bae5614eaf4e83b7f1321d1c92841d', '7350FCA47EAC0A9C8A685B50DEB9EAEA', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:38:13', 0, '2018-01-10 15:02:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3502b0c3a6b5493eb37052216ebe89c5', '2F270F48271BFD379F0E4FF8CA90D689', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:19:00', 0, '2018-01-09 17:24:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('350a65adcdf7429abc4dc8f428714a35', '6C7AD53F56B8875AC27F1ECB8A12F540', 'Y11037', '宁志全', '10.55.148.146', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:25:22', 0, '2018-01-10 11:26:21', '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('350cf819afb44362a362f9da58dc8e5f', '2341158D095C62846B397CEB2225454F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-29 12:05:59', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('351c9f56344b41a88258fe5d2ea300a2', 'B715E6BE724719F714B9F280A7020EC3', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:15:19', 0, '2018-01-10 14:46:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3523c0b18e3a40b78632992302d17289', '4D868DFE479497835D5B90707B24371D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-26 09:28:40', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('356dac7aebee4e67884d70b727aa54e4', 'E8804766D2A892ED432B762C84E6D61D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-03 09:45:38', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3570a1c6f19a456ba3bd67651db6618b', 'CBD12F79230EA4586153A35F5C96BC8C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 08:28:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('357cb1ad147140b99c754b729ca5748f', '33FE937956526084683E0D74376866C7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 09:56:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3598fb24c78740028b990876a2508917', 'C12D57528509CADB2483B9D6D3ACD748', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-20 16:10:07', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('360dc2a919944e3fb23729d1fd0c1f3c', '502D36E356194C29C54FB1B59A527283', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-18 08:18:17', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3613e75f53334cd2888499a76385e728', '07F2B1FD7D8063ED41BAB79FEB4860FB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-25 09:02:05', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('36f45787b2af48368390940341b780a9', '459AA9BD226BB028C30EBEA21404548C', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 15:46:26', 0, '2018-01-09 15:47:52', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('372494de52e246aaa97d7bb34f2d11eb', 'C621BD648BF21A5F5C21FDDE9DA9FC37', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)', 'localhost:8080', '2019-07-05 14:40:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3763280e2e8649a2a2b01b9497b6fd77', 'F63864C162AFF799EE1A22B3E31C59DD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-17 09:26:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('377809eab8d740feb97f32509d19f16b', 'E49BD391D98E079E1C738ED7EA25011D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:35:49', 0, '2018-01-09 16:39:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3794cf20e5544c4c9fefaf5edc1d881e', '0DF1C32A7E5E164FA6C7DB7D662046F2', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-26 16:39:32', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('37d7648a9885464e8de201e5f6381cb4', 'A7996926BDC7B76079E0629CF7BFDA01', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 08:45:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('37eafc454959414eb36094f5fedf8b2d', '8B547B1DDB74E981E1638F8023A05A6B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:48:42', 0, '2018-01-17 16:52:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3831cdbc556e4229a56aa38c87b61a6b', '92BC7C8F3D7694AC32B2F13333816C46', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-20 11:33:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('389448319c964c65a2ebe38f2a0a1393', '302CC84326C753F700449DE1E6A4C390', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:39:20', 0, '2018-01-09 16:41:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('389c364d85244e7da245eb6de4b5120e', '3AC7056D1ABDE95A8AA9A81E814A8A47', 'P12188', '赵星', '10.55.148.147', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:20:13', 0, '2018-01-09 14:54:18', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('38c7c6899263410998e38072a5011456', '611AD976D187A449EF5776A02ADD38B6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-13 08:07:49', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('38e610bb42f54fcbba54fe2a984da874', 'A044830E3302FFCB48B1D3B62D4B472E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:19:17', 0, '2018-01-16 19:20:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('39727da965e44228842198f9d9f351b0', '48057D7670F34053810BD0E4A6A52FD1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:18:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3a8d2b231aa94e74b24dc31192631d46', 'D5F1145ED2754D75E4303D310177B0F2', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:25:35', 0, '2018-01-09 17:30:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3aace7056aad4cd9b0e17c8de8d6cbec', '5C6A95E79BCA5C44194B14C885D09A02', 'W07248', '贾怀玺', '10.55.148.142', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:31:08', 0, '2018-01-09 14:32:05', '1d8094115f5c4c6ab8c38c414a65d6f4'); +INSERT INTO `jcdp_sys_session` VALUES ('3abde795b6f44dae87e79a19fc9ddcc0', '7F88CD9841A9F1AD28EBC8B349E2FE70', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:13:57', 0, '2018-01-16 17:20:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3accc0952dce4cf7bf965a651257750a', 'C40A2EF9042D3FFDAB2CEF8C49644A8D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:12:30', 0, '2018-01-10 15:12:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3ad6e30b5e924aa0880c774027dcfe6c', '4D64C2BF47FD2CB9FF7341C94BB59052', 'Y08204', '王利培', '10.55.148.137', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:08:03', 0, '2018-01-10 11:24:21', '25f0fd10490349b9941f8325c1fc8488'); +INSERT INTO `jcdp_sys_session` VALUES ('3aebd56e7b36433e8b2a634b6e61e6e1', '9A0D1140D1D5D9826E95207320294768', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-29 17:42:27', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3cc875c7017e4feeb632919f43dc011f', 'B89163A0EEEA83ECF621EC87FA83D502', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:57:59', 0, '2018-01-10 14:29:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3cf90581753a445cae662b6c889c0165', '2712D97743BFFE9CFDC4D45C22679D45', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:23:50', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3cf95f08bf9b443b84aabded3918e3ed', 'B9BE0CB34FCAD1412D85F9009675EEDF', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-13 15:11:27', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3d2a811058fb45ac8d56e6acde2c6bec', 'B7A5A719C4E5BE24CF7276F33ADC8EC4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-28 08:09:37', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3d616beaad3a4e46b5ed8156d76cf488', '155D17F81FE41830F4C4C86FCB681C0A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-10 19:37:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3d7ab49ffecb4b71a122a5aa1773ca45', '4AAA1D5F74E86B261CE01589FBDEC16C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 16:07:53', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3e4512731c064070b20f1847a9023658', '236C7214784A92E2703B191CE1B185D0', 'Y11014', '程英涛', '10.55.148.151', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:30', 0, '2018-01-10 12:31:21', 'd9074901d5934613ae09ebb1835f3b1e'); +INSERT INTO `jcdp_sys_session` VALUES ('3e6f34f5b45646d7a5d95b0b7fcfae6f', '9C45D891FF7F17B93A1538E0D807FB0E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-14 08:23:34', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3ed4c7b8223c4848b0b5765b75ea3b77', '9C22BFF38B03F74A0EAA30B07B30B8B4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 18:07:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3ed9b6b26f20405db1f1bb259cdfca36', '3FD58D4A564F6C44B490F155A6AC4246', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-04 11:04:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('3f2e31b9931b4916bf1db7332dd25ff6', 'C1418CB827384D691C4F917CBF310BAD', 'P12189', '赵简', '10.55.148.133', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:01', 0, '2018-01-10 18:20:24', '5676921ac94b4633a614892676567bfb'); +INSERT INTO `jcdp_sys_session` VALUES ('3f7019be3d694ed8b413f149c4cd57ca', '93BF494B0C6B7BD89B10648BAA0FEECE', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:40:41', 0, '2018-01-10 15:02:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('3f7b6d5af1e34211acebdf53e335b8e1', '733A8AF0B38350D0A1C673FEE33B3897', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:27:16', 0, '2018-01-09 14:27:41', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('3f81ca82501c46da95948d81880a6232', 'BD775339CCD896FC493B4FF64E13E8E0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-17 11:36:02', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4073e9ae2e06452ab2e264fe4f58f196', 'FA9F3BF870B14C04D9F429CBBD0A0258', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 13:59:58', 0, '2018-01-09 14:00:47', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('40e6a069c4484a10acb0269c28d969c2', '5AABDBB735E784CF6C6A87FE18DC10B6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-08 09:03:52', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('41b277a055664e05aca70cf393e0259b', '1EC0391338E4115EE9211A71DB525D23', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:52:43', 0, '2018-01-10 12:23:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('41f122d8d7dd454484ff032eac0ed714', '02C61FCF7AB0CB35D6BF96819C55654C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:27:13', 0, '2018-01-17 18:28:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('421425a0a2254c50b15e179b37e3e664', '209A960FA43F3DE63E819E751ECD4BA8', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 15:42:07', 0, '2018-01-09 15:42:40', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4237cf9e908046849362ba59245e8ab8', 'E05B58CD7DE256FE4A56FB232B703FEF', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 09:51:57', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('42655e546e7b4738a3f305bcc9ec8d7d', '7A7B7D4908E94D4B52EA8ED241E48DEB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:26:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('42a85621ceb144468d201b5fb3aa6820', 'D300B7B26B63C1C35EF88DEBA0EC1DA7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:15:14', 0, '2018-01-16 17:20:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('430b74dcff644cebac478ebc3911e8cd', 'B2BF094E6E26810752B027AEF9607FBB', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:32:53', 0, '2018-01-10 16:36:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('437650f107114d2eb9beeff79f26becc', '3DA699CE7DC21352F056B5134EB03C78', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-14 15:42:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('442fa4de44e34441ab3053570eee7207', '9DAD27E3FFBB78F5C276C66971F7A165', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:44:37', 0, '2018-01-10 08:45:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('4456b2c5612045d6bcf7d2acb9e44abe', '6F4436BE9FBD4C3D42872ADDBEA405E0', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:43:51', 0, '2018-01-09 16:45:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('448c6fa1030b4a588f54f06015bab6c8', '9E237BBB4195CA482E1F284E0AE72E01', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:29:32', 0, '2018-01-17 10:36:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('451ff400c19941158fbf8b537d4b6f2c', '76EE05E5FA03618ED91B9C977BF8685D', 'W04028', '武楠', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:38:17', 0, '2018-01-17 15:38:25', '7dcd4e266b8147ee8bf0195fcec6f6be'); +INSERT INTO `jcdp_sys_session` VALUES ('45dcfccc22524e5d8a6794b5b5d41e44', 'C1EB3C2409DCA7F6B46F037414A4744D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-02 19:44:34', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('45f5086cd39f41c4bda9ea162ebf1077', 'ABE4E5AAA75B009EBB274426F8544395', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:01:03', 0, '2018-01-10 14:32:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('462fe029cb37475c828781601b57736e', 'BBB800A582E149D0E6D069AF7D340DA7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:19:04', 0, '2018-01-17 18:28:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('466e451e93694fe4baab43bdec150695', '1E2D36E5AAC29848F2E2EC5B15103D5B', 'W06893', '张立奎', '10.55.148.128', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:36:31', 0, '2018-01-10 12:48:21', '44e74bb07b4b4fceb9ba9ed135ea5e7d'); +INSERT INTO `jcdp_sys_session` VALUES ('46d06e8d73564a11b6e3d5ab8376b8e6', '5D21532CBC7DB2D9384E9EE1C4FC9E3E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-14 16:20:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('472f26620d53469d9d3fc06e318fdfd9', 'F9875219FFF50EF140461AD6E980908E', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:11:00', 0, '2018-01-10 16:13:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('472f5cbce7c14038b18312042d8ab135', '77C4A6F85B5E07722AE3E53B8CBD0E2A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-04 10:16:56', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4797c13763184f90bfd32122e0a65e20', '5DC67CAFD75E92D711586FAA7DB4F414', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 09:32:03', 0, '2018-01-17 09:41:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('47a73ce14ddc43ceae53cffb4b16383b', 'D7833D25A0145610566113E1BA5BA809', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-13 08:14:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('47e2d2739c00436fb75d632b06c0d3b8', '4A7A45AA8920ECA37AE972C3060CF9D7', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:45:48', 0, '2018-01-09 16:35:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('48c9b8270a354f2499e3ce14dd496ad7', 'E39276D23AF19FE5D0B6498AAEE3D2FD', 'W07674', '高晨朝', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:43:22', 1, NULL, '32a36e78b5fd44649ae1b9b4a3b174e3'); +INSERT INTO `jcdp_sys_session` VALUES ('48df5b3b20514a0d9e0c63f8e6751672', 'E01C445994530D6F29209F98A197A83E', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 09:42:05', 0, '2018-01-10 09:58:18', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('49584af6218640a2a7ea0e3c5cba14b1', '30A1D359E1336A18E0812CD5186317F1', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 15:44:05', 0, '2018-01-09 15:45:36', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('49fcdcb6c4064187bc5bef947b2361f4', 'DBE14198A10549457E824A0AF6A4CDD2', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 18:12:19', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4a6ecdcae47f46c9bbd68db5ba1a4b1f', '647182DA4BFCCD9DA5D9D38484866143', 'W06893', '张立奎', '10.55.148.128', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:05:46', 0, '2018-01-10 11:26:21', '44e74bb07b4b4fceb9ba9ed135ea5e7d'); +INSERT INTO `jcdp_sys_session` VALUES ('4b3347e1704b4507962b2d5e197e13fa', '08F06DEC8A3CFD751FE305A507D3D6CC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 08:16:21', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4c1d888ab9de4f3fa6c09eab14446886', '246D5B100B81265143D546F962D1E676', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:38:22', 0, '2018-01-10 18:08:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('4c598458b3ab411d9af04bf79a00f54a', '98B34A3E346BD657FE236CC8EC6D9DB2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 18:47:46', 0, '2018-01-16 18:57:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('4c6afc648d79457285cd85a89758b667', 'A74A6AD8935F64BBE8EA0580565EC032', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:48:15', 0, '2018-01-10 16:51:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('4c847dbba8c743719ac41f5aff73d3f5', '3E3797D69F6A40F4D2EB852599880C1A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:25:50', 0, '2018-01-16 17:46:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('4cd8620d97d54523977f13aefba354a9', 'BC900AE603352E38F3F913BD54005B29', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:27:56', 0, '2018-01-16 17:46:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('4ce358fad47a4a48bd479cc9f4a83e7c', '030E31A91E61E3EED8B811CC646182FD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 08:10:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4d4050df6483482ea805916224d1c7a1', '57A4CA67A5D14FA686CE187303BD6390', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:39:57', 0, '2018-01-10 18:10:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('4d469a8bcc594a4ca8036b36d731906f', 'BD775339CCD896FC493B4FF64E13E8E0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-17 11:35:10', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4d81c7bc455143f5972810da7b33ecba', 'FD101678BFD8AD42FF62907CECA9CA2A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 09:56:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4e5c49bc3e124d88bb061e3462f3e006', '9E0AF3CF10AEB3166C87584728251650', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-09 11:59:15', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4e67cfebb728451a91f4c9a796639c1f', 'A8EB0AF4CD36762F192435615981AA6D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 10:58:30', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4e9f502998af4673a73cb98b5f8e75de', '07BEEAEDDA359DBFC7B09042AB3FA064', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-07 18:14:23', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4efbe8c4d0d545e18a188574bf609ffa', 'D09625582E5553331FC8A98AEB658787', 'P16107', '韩燕', '10.55.148.207', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:25:20', 0, '2018-01-09 17:23:19', 'a6fefe02f64446cb855941af41aa67a9'); +INSERT INTO `jcdp_sys_session` VALUES ('4f11c8840e5b4a44a22404f7a8b54f95', 'E447835763DEF2AC8143352408CB81A1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:50:32', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('4f62c00a05414c549a73fb12b9b0fdab', '6EA25334050C8342505DB54EEB1A753B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:43:49', 0, '2018-01-10 16:51:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('4fcd37939099407fa9642da99a30fc61', '4B20BAFD5974EA0D7241CDF6E51B2D62', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:20:07', 0, '2018-01-17 10:24:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5037afd15af5475cad3f97e1e86955a7', '8EB5D1A05A210D44953F4259148009B1', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:53:12', 0, '2018-01-10 12:23:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('50e5c88d539d4dbaa08197c63036ad19', 'D5DA8C4CA7E63851BAE47B7CD1825113', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-06 15:53:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('515c5890aa5f47e4bafcdfbc0af123d2', 'AA1EBFF011600F460F28608C11BFD843', 'W06555', '王晓明', '10.55.148.231', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:37:24', 0, '2018-01-09 14:46:18', '340fe94b0464472e88cc0fe7065170dc'); +INSERT INTO `jcdp_sys_session` VALUES ('517a9fbdb29c44ffaf07aa4983a45995', '6378F4575F4260D114D4727B345C7D9B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:40:37', 0, '2018-01-17 16:43:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('522955bcc75f4f8a80ebfa33c9e8fb27', 'E8CE6734ABD2917188DFF6B984F10860', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:36:25', 0, '2018-01-17 15:36:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('52a929e05cd04cfeb795d442d5b2c9d0', 'B4416BAC42879E730F8E6098A99410D4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; aff-kingsoft-ciba)', 'localhost:8080', '2019-06-25 15:12:04', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5318ae38a7ff41088c656afb90b8a6b8', '942C2BAD83637D2A618BB48A665B7430', 'P16107', '韩燕', '10.55.148.207', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:15:55', 0, '2018-01-10 17:26:24', 'a6fefe02f64446cb855941af41aa67a9'); +INSERT INTO `jcdp_sys_session` VALUES ('5361ddd936834ab2b2dae9874fa333d3', '899FF80905715C081E9187F6833BB9EE', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-05 11:22:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('53762d1ff2234a5ba6cd8cc6f6bc98cd', '8BD51E48E446C9D2E4203551A01A9362', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-22 08:18:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('538ac0657e784100bef15cb64f861bf3', '56283D11EC29109C471F89F94C27D540', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:20:16', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54038823ac3445179c2e38e0c897b049', '9384BF900AB8231BE2D77B8ED42BBA6C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:05:24', 0, '2017-11-29 10:27:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5418c360770641f6b91f208af6d57fab', 'CB9AD5D6C66F309FF6047D17311ECCF8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 15:27:25', 0, '2017-11-07 15:29:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5427f073d68b482fb5b0333130791280', 'DB2A7648E1DCBF461D0A3653D4E20E3F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 16:06:37', 0, '2017-12-26 16:15:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('542ce9232e344e60a1340de02418cf39', '7475E7BE0316EC7BF28438B04B328DE3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:41:19', 0, '2017-11-23 16:11:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('543828641f8b4325b3269a295938e37f', '5542D0EDBF82835658BE7CC8EBCA2827', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 15:17:21', 0, '2017-12-20 15:22:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5446cc4774f74e729a167aaa4d29d7e5', '3265528C0CCC2F871CE9249A2D659C24', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 15:04:37', 0, '2017-11-28 15:20:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5454b250e759473d91de24188d6284c4', '12F5027BA1BF4AF8CD5CA399765566A3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:54:38', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54573d71147a4273b487fe5b9b65b7f9', 'A3E4AAA7E71A0DE8DBC762BD44F86BA5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:03', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54580d406c6545539c10e8cdbc8c324b', '7CADAD39A1891F6793D685EF4E0E88DB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:17:40', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54588a17463c4e00b9dbc0ef45b80c1e', 'EAB4639C91C9FC760A5141162C1C3B37', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:00:29', 0, '2017-12-23 11:13:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54625ce6259642ea85aac8a511cca41c', 'CC5071DDAF247306685F73663292039C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 16:26:08', 0, '2018-01-03 16:44:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5490b85846734ffd812419782f57a12f', 'B9A0E9CA7134AF8F92ABBB1D0A7D522E', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:46:34', 0, '2018-01-10 12:17:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54979386686d447ca9d07a53010411de', '39448C3996D34FAD09647AA14194B465', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:11', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('549ff3519b0c44faa15186c2b6536f05', 'D6018896123BFFD6F33BFCCE932EB392', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:41:23', 0, '2017-11-23 16:11:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54bf06848fe94eb7a17ed1e2fda527ac', '24FFE3B07108D5875D5BCC2466519D9F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:45:37', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54d47a6b9701432e894a755bdfa47946', 'EBABA02FBC1A8CC24A7C3940EE6181FF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:46', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('54e2fc18495249d88f4e7fc45ba38e97', 'D30281829B406AA35BC48B4977B9D542', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 15:28:57', 0, '2018-01-03 16:08:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('55089215908e41ec9805f98c4aa2d9aa', '4B49C52A7B9C5D0866E503DFAFFCB132', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 17:36:18', 0, '2017-12-29 18:15:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('551020aad7ba4d74aeddd927ee1e1080', 'C28E18E2331937D78648E8CDE64FABB8', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-25 08:59:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5522b9f048db4cfe8be1b8aaf8c5406b', '3AB536DD0A915C3D18A7C51DC2D141BE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 15:35:41', 0, '2017-11-25 15:53:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('552c9729115a4a3cba6b8ba1c3fd8634', '44B1BB184503EB3573F661DE8CFDFFD0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:16:38', 0, '2017-11-24 17:20:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('554294c82aa94b77ad0856298428092d', '3D0F49E813DE3BB600AF748D9C3C7CB8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:11', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5551e49504244ac4bdbb87473d4e8d83', '652A8E56443E9DD62DCE8E0429639035', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:14', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5552854c3abc4e2ca7b76098684369e7', 'D92E86F2DB0816CD5D2F283B3CE71741', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 14:25:05', 0, '2017-12-18 18:08:02', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('555490b97663414ca09e6b316087f596', 'EF4FF412A709C408B5B64608AFB5C04E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 10:40:32', 0, '2017-12-27 10:54:49', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('555ab681a11f49849cd90302c9f6f8db', '42AAAE97B433C1067142238BBE6760B6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:11:52', 0, '2017-12-22 18:12:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('556a011297da4a449cfb1864f7d74084', 'CC0FB08998F7CF706041D32D0912D5CA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:37:39', 0, '2017-11-23 10:39:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5578bbaafb7a4591bd6b04d64c83f56c', '57B30C419CCCCF50201C7C928B4054D5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 16:57:06', 0, '2017-11-29 17:07:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('558094ce559749aab67dded4e5bfcbbd', 'B87CF1EB9CA8528A08868917B6DD144B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 08:49:11', 0, '2017-11-22 09:31:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5596646dcf574e0ca9c79ba3832efb66', '33BED3DDBA5182211779955ADBB479A5', 'P13160', '郑雨昊', '10.55.148.134', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:06:57', 0, '2018-01-10 15:45:23', '1cb2fb93db774202bdd2532fa57d9bff'); +INSERT INTO `jcdp_sys_session` VALUES ('55a183f1f67d42f2b8a18e0a656a35aa', '846A988928857634A161EDB656D513A0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 15:00:26', 0, '2017-12-15 15:03:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('55a7affc6e9541358766ed19bab5f012', 'EDC23D81DBBD00058779B783FF59F42A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:18', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('55c3ca6cafee4eae985745c1a9e96dd1', '15C23DAF61B4C402E6A0815FFA01BAEF', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 08:35:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('55e1fc1eaf5a4eeebfb603cd9c48911c', 'CB9BA283A217E08B1E7B8C4C59DB6D63', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:49:15', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('55e5c960313f4c7d82e032730c4220f0', '30C47EE85C85A3F69F2228822F72D44E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 14:53:31', 0, '2017-11-16 14:55:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5618e2f61d7e49beae7168771f94a37d', 'CB38CFFAA03A7328868DBC08F8BC4A01', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 10:44:46', 0, '2017-12-09 10:45:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('564598010f9c489d937d4b1052fa1bc0', '7A24EF9BC35C52B9B167706B5BD0C70D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:19:21', 0, '2017-11-06 17:38:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('565dbff35df5409b9cfa5072dee6217f', 'BCF1F853AD781794A840B49E45F72823', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:58', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('56a769b852374994b26c36e4e540e376', '7CE579F8D6FC395A92A9D78D4E3B409B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:07:01', 0, '2017-11-18 11:09:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('56b31aab9463413b83d25540ecfc5679', '323773BE9B376E9D5543287ADAA7D7C1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-21 17:05:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('56c5c617186c4f1b9f7c8c3c3c272f21', 'B0DAEE21F5015A0A3D70BCD0D88E2E53', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:15:40', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('56d39709d77f4eba81658b8ab67f167b', '091D972EBED598AEE479D1A238FEF7C4', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:11:57', 0, '2017-12-28 19:13:09', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('56d51d660d714874aae274fc466c5089', '4E2B18334D76576736AB7C7553FEBA0E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:15:52', 0, '2017-11-06 16:18:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('56d87e985a7949a195ea818fb365077b', 'E5A82279FCCBE1A569F0E46D8D866AF5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-26 17:15:05', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('56e423627fe042f4a76edd436dcb1a69', '821F2F9CA3E0465695B76CFAA72E088F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:23:46', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('573c86cab19b4797b285cec733f167b1', '0D9FB8C4A85A87B43DA7BCDD8DB057F5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 17:00:08', 0, '2017-11-21 17:17:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('57446b5d6601492fa9fe7700f7fbda05', '245B40BD70F956E2D97435D2248AD82F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:04:13', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5747572634ce4d728f5405f880778034', '2FB137510B3D497A51C8B6C0DB1D52E7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 18:49:03', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('575b60fcdc584d5d922b6fcf5d2dcc1d', '6CB8DB349080177940FB971953526160', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 17:45:42', 0, '2017-11-16 17:50:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5781b9b1ded54ce28840d77ed9469c8d', 'EAB5DFB2411C72A43197A3C93EC7166D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:11', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('57895c9297d047c280f88b4a3ac66e12', 'EC06018586670D89DCA22D629D6B7694', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:57', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('57afe1303b754dc79bd6a481ec23d9b1', '85246266A85961FED269EB4463635367', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:34', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('57b503727066475a844906a36886acca', 'E560B3750F64D141AA6ED1C90076DEE1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 15:32:07', 0, '2017-12-28 15:33:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('57c06e112ef9446bb21280c971fd5938', '624E5D6568894741632D687D99E8E8D1', 'P16086', '杨天玥', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 18:19:32', 0, '2017-11-27 18:50:15', 'fb90ee122f6c47269d77942b56a4783c'); +INSERT INTO `jcdp_sys_session` VALUES ('57daa0cb9f6b4975ad76fd33c205cb8e', '85CA23568A2749F36D661EC95E6D332D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-04 17:51:07', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('57dc7e464d464ff5b4dc0f8a51bea760', '60EE10AEE17A766747B7FF6FA4EEE10D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 11:18:01', 0, '2017-12-09 11:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('57e8a5da6b204ef1adc91a35a0c3934f', 'D0528112859EEEDC8CC3A8828007E2B8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:20', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('57ea7658768841ab8ddfa12fde9ff904', '309565F000E3B8A943E98F1004D1DCC0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:12', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('580928cb5e684af5abb6997ae6471c1a', 'AFE6287913B3ADE6E3A86A10E371DAE7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:52:40', 0, '2017-11-23 15:23:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('581d51d3708c47d999a9f29b79770951', 'A376A523388979FD37F4EA2815BF255C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 14:49:44', 0, '2017-12-18 15:23:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('58250735b7af4c7c9f518d42d5613161', 'F87F4BB37ECAFC7301C30DB9FFD7E429', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 17:31:41', 0, '2017-12-18 17:37:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('58304defff464683a4241b717d92fed2', '98BE054C4D2D3CF7D87B955CCBE8113B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 12:04:19', 0, '2017-12-17 12:28:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('583a8d84d2dc43ea95ee7002612aa831', '9DB4A7BB24D9969F18F1370DCB1CE28E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 14:47:39', 0, '2017-12-13 14:51:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('584f7688e4964f1eaa9fc035152f332f', 'DB4B16A99C6D95E337AEA2DE8C68FE61', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:01:52', 0, '2017-11-07 14:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('585a492dd267422fad691f15bbde2944', 'CF1B876C1991AF3E4E7D4ECCF94868C1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 09:00:13', 0, '2017-11-18 09:12:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5867b9422d4f4986b11ce7646365e9f5', '44243623EED846909AD5BEA6BC37FCAD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 09:15:34', 0, '2017-11-10 09:21:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('58741394732343b99ac88a66e5da06b9', 'D332480824B28BD3BCD960321FD49A92', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 17:33:18', 0, '2017-12-18 17:37:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5886eec57c2b4384959508dc4e4a9aa9', 'F9CF97B1308B4950820AC146B52F0274', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:33:00', 0, '2017-12-26 14:34:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5899b30cf36a4df1a7b84466670abf83', '0E777D9762C1350A2A6278EF146184F0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:23', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('58a04a76230746dca95754a33866c070', '3C152B4D57C265B87448547909DECC92', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:50:27', 0, '2017-11-23 15:20:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('58c26ab6df094f0cb569f658dabd2ccd', '6B3A01E423B876CF6B5D8A997640EC18', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:19:17', 0, '2017-11-17 17:29:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('58c8d58a5fe94a4f87738c139d8cee2f', 'C9B231C2E3486B79819333A03FCADB54', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:54:38', 0, '2017-12-28 19:07:07', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('58c8efec4ca548198a703861674beb70', '03667F1299F1424E1D7F5995C4D73FF7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 16:55:50', 0, '2017-11-17 16:57:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('58d4b74d9ae241ad9a899060d9aedf80', '4EB06D944411B0722EB8C6FA354AA5C8', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 18:50:07', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('58da113450974c99895d57b008a432df', '81698244A1E012E9C81B5DD1FC53894D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:37:17', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('58eb0ddacff4499bab1b37df7aa1233e', '32D5A09FFA015788030ACB7F377D17AE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:37:33', 0, '2017-12-18 10:42:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('59058dbe626e4ec5af2c5597425f0f53', 'C6E115A177651B09A55B5D802F8731B0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 11:55:34', 0, '2017-12-11 12:03:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('592ce934fd354dac9426b82670cbfa11', 'F9872EC3141D4C97858960DC967BD3FB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:52', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('593502202bab43bbb25b767da27cd7a1', '65CA5C68B417594A9B1F0BD98B8FC863', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)', 'localhost:8080', '2019-07-03 10:40:41', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('59439431f64e4e1f9e8e81c7577c3b8e', '49121705FA8745A4CE1B8CB4B6FDEA2C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 16:44:05', 0, '2017-12-22 16:51:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5952d6d972214ebc9d73b2faafb04f43', 'E86CEA5A1B73CE98C726A221EC329C03', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 17:40:48', 0, '2018-01-02 18:16:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5956701abe1b461abaad40d0eef2906b', '7F06D66CE97C991F9E0DA0BD111B2116', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:05:25', 0, '2017-11-17 17:12:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('595888befe92491cbf7295e29a4234df', '62BAA169115FF9EA5B8B9C516F07CF0E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 09:34:39', 0, '2017-12-23 09:34:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5965dcaf1d224eb08fc138d2a8ecd054', 'F93C4612B2C2AEA312059FE896257EAC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 18:30:01', 0, '2017-11-22 18:34:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5967a65fddbf474898da8b89d6bc060e', '5F33E8B12109BC201D63482347112A2C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:06:08', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('596f35e32c5f4ec3a59ae7afb24014b2', '30866DADE4088E28290E586844618D7C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:20:05', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('59709a04663f4f389ebbe9146e3d81f6', 'FE35B6B3A8DB9A2373F579A0CE98AA9B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 14:32:23', 0, '2017-12-22 15:02:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('59775548867d405db1a819fed02e66d5', 'BCABF56E786C7D650B1BCAD1C2EBDA8F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:23:39', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('597a39818ea04bb5be4b0fea269e08b3', '1D73AAFD1C930629257E581D802F3493', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-27 08:12:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('59850f92ec694d2d90433c8439c6fc21', '32C98631751427C758250957EA4BCE70', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 15:16:04', 0, '2017-11-22 15:18:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5988b972d2964afd8c44bfa37c7f7644', '856FD9197B1F7AB94FE9DE1D04874A5C', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:38:54', 0, '2017-12-28 15:08:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('59ac5952cae6494a9b64b22b588b1a09', '3675577463BFC86CDB46BC8F95863B71', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 11:54:49', 0, '2017-11-29 12:04:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('59b0b61ac524489fa36c96339134952e', 'C7759FA3F82B03E211F94E0F64FF58DD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:32', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('59caadfb5831475886d184e760e47fb6', 'EDF97CFDF62D333A29A832CA96F8BF2B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 12:16:01', 0, '2017-12-09 12:18:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('59cfc88f38be4a739def7f57272dffe1', '3846020C3B91E42705C0E15714AFE099', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:15:39', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('59d14d8c3d6b4c1ebe9511ac8407e37d', 'BCFC3CFDD9D709894C20F10640EE0BF7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 10:47:24', 0, '2017-12-09 10:48:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('59def13a564d444e910b5e79d949a839', '5D3E4F6600C48E0024C1B157B449D6D6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:50:28', 0, '2017-12-25 09:51:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a02729b26ac413284aec6503bf1125f', '96D2C63323586B40A12AE8EA1E5BC859', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:07:57', 0, '2018-01-10 10:19:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a0ddebe36d64ec985419e0452d8963d', '5DB3FBDE11F0CEC5C5BEDA33BFFB0BA4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:15:21', 0, '2017-11-24 16:17:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a154e2396e04ced8eb8137f87e94329', 'D40FA5476CC5F7F272CFBCEA522E92AF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:00:13', 0, '2017-12-28 19:00:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a22b33d271f4548872bc212c9e81424', '6510DC028ECEE8DFDED170CDAF64ACFF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 16:03:16', 0, '2017-12-26 16:15:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a254adb841c4034a47a50312b0a589a', '22F6C2001202F3E777403FAA5DDB5D06', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:43', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a2c86b4a0a34e089072c56045648e5b', 'E90EB7B7030D89C1C4EDC7001BE70DCB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 17:04:04', 0, '2018-01-03 17:38:28', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a3b775925d143ec8b29414cfddd0baa', '0EE348B7DA8FD13E562E7F14B8B2CB18', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:05:06', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a3f650a7bfd4b30ad7dc30a226a6e6f', '725855450ABFF92061FA0A5F3BC7DEC3', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36', 'localhost:8080', '2017-10-31 16:04:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5a4af80bc4624e6aa9e5c4293905acb4', '06A519D6E616B8D67AFEDF04EE42095A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:06', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a85832ab0614c20b541dfd13afe62c1', '3BBD5C5D07730C4DD19FBA9617B1F7E7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 11:13:38', 0, '2017-12-20 11:31:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a8ea0b3f456442998e2522e018de012', '29448C93C030E977D1ACC9B06BE5FBB2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:12', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a948af1ecea48a9a8d268a6108266e4', 'E61A8E6972BD506343BD0862282F4ED0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:15:40', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a971d5d676f41429a37491c7a3a66ad', 'AA6B37B79E763E790C3393EA1BF90129', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 15:48:53', 0, '2017-11-25 15:53:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5a997e671fc74dc5906e6524ea0b43ad', '7FF6E29D82AD1F4682662F4261AD6268', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-18 16:33:23', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5a9c7d6a952146529f272104a4771c1a', '2374ADAF5CA9849A06810E468095F9FB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', 'localhost:8080', '2018-01-02 19:06:30', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5aad1c62e3bf4b13b85308c4315aaf7e', '4A7982511CA50B9E1B9B5EF928469699', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-10-17 11:41:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5ab476908a51446cbca7e0535ea316c1', 'FE56BE1533DBC654428AE605DC2C64AF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 16:07:12', 0, '2017-12-15 16:08:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5ad709a0092d444caf95d60988d40035', '8C0CAC04A8D538CA6AF994F754FC01F7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-12 10:52:31', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5b00d2eed4c64cfeacf0bb37764bf93e', '17E8208BB5B59AE9D87C33915632D1E0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:40:13', 0, '2017-11-08 14:41:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5b0aed58bbd94070904d6324d936893d', '32BEA65B032CB134E83D6BD2F309AEF1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 19:24:55', 0, '2017-11-10 19:26:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5b2a694c41694109ad45339393db4759', 'A6A527DA5C66AEAF45257806C089347B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 11:11:43', 0, '2017-12-29 11:49:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5b3175873e4f48aea7e87268d70c217e', '50630B943D1E2C9CB532C03F84643E7B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:24:44', 0, '2017-11-06 18:28:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5b38eae9b5c5465eb4d501fa7e3decf3', 'B7695F52CEA85AD4210EC9C8B63EB251', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-29 09:45:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5b407d372c9d4d29977e05d29976d001', '4511283D05F00EE4A2635FABA55F6A5B', 'Y08066', '靳晓松', '10.211.55.2', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', '10.211.55.5:8080', '2017-11-10 09:24:59', 0, '2017-11-10 10:05:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5b54f14ad6584b7f822879c736e53191', '9FD06CD26B99FE1F0FD8918A409E8AB1', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:35:55', 0, '2017-12-28 15:07:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5b58e38936ca4cfebd9e0c0321bc304c', '056EC9397FA1AF01BB89ADF79940A8B9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 08:05:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5b6cae9e953a401296a40b38eddc4e8c', '139B7AA602DA931E0CD1432D1BFCD2CE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 14:29:30', 0, '2017-12-14 14:32:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5b7d3c6f938847b7a6d5a1923a95ee87', 'FE64322DE59A3E4F83AF5AE4303675B1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-17 09:37:41', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5bbde8ea38e14752bc7376f9405479af', '1757B3C3DBF0DFC8B30316089050B0FD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-06 14:58:52', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5bbf43cf7a9e4965850cd808e371fd86', 'C6C74D869D0DBC804AABEC2DC638D1FC', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:28:23', 0, '2017-12-29 08:59:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5bc0e99b91b34c4987b3c9658beb1c71', '9EAD87CC5C593A0A27902DC87B0A7B5C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:37:18', 0, '2017-11-17 14:48:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5bcd94e1f2de40ac9d68498a6a616890', '7E87F182901AED79CBF018FAEC729F35', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:28:13', 0, '2017-12-23 10:29:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5bd9ec0bb1dd45e1a345649ef8acacb8', '14E0B9F2F347EBF1D2D5A782254E4062', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 09:39:32', 0, '2018-01-03 10:13:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5bda024ab9b04954b9b8da3e2a8984b2', 'D5552C78E50820BDE91E9D7EF1FC9894', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 15:15:09', 0, '2017-11-24 15:22:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5be4ec3ddc0c403684582d898105b894', '50757472A885E23057BF6A223E889312', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 11:18:21', 0, '2017-12-11 11:42:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5beac60b9e164100b3b8db7184280494', '10F451BDBAE393EEA16821ADB468F0A4', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 09:58:20', 0, '2018-01-10 10:53:07', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('5bf8da8b839d405996173216eeb76992', '1A92B85D37235C1870F8ED174D7E53BF', 'P12188', '赵星', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 10:02:30', 0, '2018-01-05 10:37:18', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('5bfb108033f847f8a9e61b80f7433f22', '5B1C1D2E244C488CE42026C30021FC9C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:06:29', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5c0198db0f83467a9f528d44578bcabd', 'B5DAA50D540944D40D0344DFB85C8D6B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 19:44:27', 0, '2017-11-16 20:06:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5c3f7d030cbd491ea54eacc6b44f7e39', '3808A863DA43422C2EC1B5FCAB87393D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:12:50', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5c4b1a56dff14e20b8e652b4185a68da', '857744385D0BA963AD71B4DCD62A2EBD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-03 10:41:19', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5c6bdc06d83c4710848512dd2cb23512', '5D3EC4F19CD179145A080DD030C0BBEE', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:10:43', 0, '2018-01-02 11:49:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5c6ca9980656450392343f77648a328b', '1804EBEE9AF5066AA2499B0D9E603A3A', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:56:51', 0, '2018-01-10 16:58:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5c734d3461774fa8991221dea0ead7ba', '2CB0D8D3A2AC917E92E0789F30F61DF0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:21:02', 0, '2017-12-26 14:52:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5c96031ea43948faa1cc5b0e5a1d3fdc', '19A0EE3C481EF3C00A433AE89ED78A22', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 15:47:00', 0, '2017-12-13 15:52:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5cb45acecaa74e309872c9c0036e5a14', '530F469355545C47D9DDFB7A5D319982', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:06:06', 0, '2018-01-17 18:15:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5cba825dbee04c2280ae95d313ded54f', 'F9E6E93FF7FED76D23AAA25A6A2BBBBE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 19:53:37', 0, '2017-12-21 19:59:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5cf0006a845c4a2d93c86d13cd3eb688', 'EDFB0FB07201B388BDABF11EBFC76C6D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 14:46:05', 0, '2017-12-14 14:48:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5cf97ffc64674d07b61364fff0a2769d', 'F4FF40A143CA07449D6EFF6F29752E97', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 08:52:23', 0, '2017-11-18 09:12:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5cfab732f1484108858c5d1654d33512', 'FF9588C6898CA0E972DF56045EA28C2B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 11:23:35', 0, '2017-12-20 11:31:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5cfcabb4ab9b406ba0cbda43c29eaf65', '81D86D6B5929AE036A00BEE689565E76', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:34:43', 0, '2017-12-27 16:35:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5cfd3623d9a9450cb69f02ffda882ee2', 'E999DCFA2613A9B2B5581A583399C4E4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 15:01:34', 0, '2017-11-24 15:22:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5d064801738444b696349207263b3d9b', '105786E43C74F89EBF22AB97908C03EC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:04:46', 0, '2017-12-23 10:06:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5d14d16695534f139362cc5d65715a8a', 'EA797C6118CAB7A471E7F71756055CF8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 10:55:52', 0, '2017-11-16 11:00:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5d192bfbcd5048d39bc08fb5cf0c0a6e', '9903751A3FE395A9855C1C3578A90F4F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:45', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5d2f24d04c524c56b411ea9074821fa2', 'AE2F6ACE89CFDC8FFF9BC11C6AB4D7DC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 10:33:06', 0, '2018-01-03 11:07:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5d602d4509494168b338e7bbfa454bb0', '05B9588F4ACD1D159595155459834629', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 16:35:52', 0, '2017-12-25 17:05:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5d77d9e9b91d47a9b4515db60bf3b6ae', 'F48FE316ACAA668129F5D28CD6380D97', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:52:58', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5d9900e7e6ea414b94b96f7a59a41048', '71413994B6512B0EF0808C6BDD3D8860', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 16:10:36', 0, '2017-11-22 16:13:55', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('5da96fb3b34c40f793b67b9c82f597bf', 'ED8B94F3145ACA09B6F2D985589108FD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 14:27:27', 0, '2017-11-18 14:33:53', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5db1a7aa8eac47e4974409942209616a', 'BB2E5088D5B2802AB9D0A22E23DABCDD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 20:19:44', 0, '2017-11-10 20:22:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5dbf5608e32547e69bbd6b5df16cb2e6', '9BE6CD8FEDA2C750A742AE757E44A9EC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:03:13', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5dc6fc4e56b94c9884273736ab223c8f', '9FDB9DF4C8805D6A951E0C2E20A9A6CC', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 15:44:04', 0, '2017-11-22 16:04:55', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('5dde99ef09cf4651aa830eb5c16fd760', 'FE0C1C17009FA52BACF96A27960CEAE8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 16:18:47', 0, '2018-01-04 16:23:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5de06c492e4348e19180a9f46416b6dd', '984679693666AFE667139B21AE1AFB89', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:35:41', 0, '2017-12-26 14:58:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5debfd7bc2ba4690a4034767a9329698', 'B7A221F7F1F39CBB664206BC6A9ACAF7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 11:39:52', 0, '2017-12-24 11:41:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5dee2b22c3c646d5833973711202a807', 'E5BC162B16732766F73301D6D814F723', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:36', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5df2ab558e6d4f89b51b7152deb2d116', 'DFEDEF96FE9B8EAC5A32F7A78C8CB640', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:15:48', 0, '2017-12-22 18:15:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5df875b2b3274276bc6fc29e7fb0acfa', '71709BD2FACACE9B57662177C645C4DB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 17:07:36', 0, '2017-12-15 17:10:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e0614a5f5bd4e438fbd854c50ac1e9e', '7931DC8FE7BAC64A3B0AB6B1B1A57026', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 09:05:46', 0, '2017-11-28 09:10:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e1af2db9bee4e559fc2388f59d4a1f6', 'ACF6880DFB14970ED4DAE4C9B662D9E2', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:57:44', 0, '2017-12-28 11:39:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5e261889b71b48249740ea273c5478e1', '61F6EA972A18B5C0290AA8D5AC6ED541', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:13', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e291ae9514d489b9a64dc39aa301fed', '44F6731AE7BA42F8FDA1BC791C09D441', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 11:47:05', 0, '2017-12-20 11:53:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e3fb1541767448e9cec92df3d946255', '8325F4D8EF95737FFDDD5679DD8DBD09', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:53', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e56f016629241d69f438d497c26e4de', '7AB911F29193EF56DDA63944E4DFA6D2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:29:51', 0, '2017-11-24 16:43:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e5b439c1eb647aca6e927e57e28248b', 'F28ECF878D5A6E46F7E7B24AAD69F6D9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-26 17:25:32', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5e62794805a34b848312b3545ff5a284', 'CFFC573C5E01BBAA9C19303524481313', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:30:36', 0, '2018-01-02 10:01:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('5e6329d5fdde46f2b0feb32dadc2c76d', '389BB7560FAB0117C41E9511DDD124E7', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 11:42:54', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e692d9b5b97463a991c0251b1352bdd', 'D29A80AA2A31F4DF2136E77F621B6ABE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 08:34:51', 0, '2017-11-18 08:38:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e6e559f3bfc4d599fde10a9329149be', 'C8DD950EC4F519C8AEC172543A378404', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:01:47', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5e865386b32741dd86695839b78facdf', '1DDDE9F771C75D82B4081F9D4E51403B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 15:17:51', 0, '2017-11-25 15:18:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5ea254767cd8428589a2ab12c15dd9fd', '24767C8A2D6A925B94B2666E064E5F0F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 18:40:23', 0, '2017-11-08 19:11:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5eb4d6585b8848fb97fd14a788099106', '3035B867ECFE07BF7C91AB133494FE9B', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 13:54:35', 0, '2017-12-14 16:53:56', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('5ebb9e352aeb47c5a7738f79698418cd', 'C1BA24E5AF57196EC4FB07B4974016D3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:19:01', 0, '2017-11-23 10:20:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5edfae0b566f46f4afd3c008129aa0ca', '344E54811875AF0B3D08D85715AC6F78', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-30 20:56:49', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5ee3bb3d55de4546b0a1aaca508d3ad2', 'E4B2CA1ECC5BB86F16C9C8849137FC75', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 09:22:04', 0, '2017-11-18 09:55:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5ee583d3b92249a4bf28103553b507b4', '4E81E8AD3FF373F845FF4DECA2589460', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 16:23:56', 0, '2017-12-19 16:27:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f1da24e4ede483f91c5e4fd59870cc7', 'A56988F51001C52D08809A5F875B9AEA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 11:58:24', 0, '2017-12-12 12:29:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f5397c9dc9b4ab582a6d33659245f05', 'B085DE632B90F5D60A78D1C45594C963', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:08', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f5f5504479a478f8bb741186a8c6e64', '6CD09922274D7DE7D1E388061AB2FE61', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-24 10:27:12', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5f63d89168bc4b7d8a87e07f97a15674', 'E2809623D2AE7DD5721114533D011A5C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:02', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f676148efd7408ea88d5ba9c8558950', '3B63CE82690482474FC9AC1247E1A5F5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 15:23:52', 0, '2017-12-23 15:45:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f6ec3563e3a446fb37a0f1100090028', 'FA433F28C5C6694082D269A26456A1A4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:55', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f7385d91aea4a8e9df590c429f187a9', '3CDA9A8F699CACE900B3DCB7DBA32E84', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:06', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f769e31bdee4035b1d0b72337e3b4ab', 'D5A6416557ACA3AABC27C8F435026384', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 10:29:53', 0, '2017-12-11 10:32:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f908e88f0fe4ae29a60d5a570378906', '287B066C6BDFF24B885030F490D79B9B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:43:30', 0, '2018-01-02 10:51:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5f9fe71baf91443c9e3f8cbd7f7a8abc', '23989D2BA6CF8E4DBD07368A18EF1C74', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 11:14:46', 0, '2017-12-17 11:15:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5fb25bb1a5ff425ea83dcd2c3b5a9a16', '680543F228EDF796DEE05D1BC966FC93', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:51:53', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5fcd858f9fab4bfd87d529ded9f7788d', '068CA795E9810B0E940129689E234D3D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 08:45:11', 0, '2017-12-09 08:46:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5fcea47f8a6c40a98f027d699c27181e', '25D25B805AFB6BE7E98F56CAAC97D9BF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:20', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5fd0fad48cea48f4ae5ad116f0cbf79c', 'DF94AC3D9F84D87CD65EC897EAD38C1C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 16:29:37', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('5fd10eef364740b8a13bf5a10424559d', 'EEB2F3ADDF787C67D779E3909840E67E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:19:36', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('5fd289502eca4744bbf46c9a4423b067', 'D910E0887FF7DEA246A1C6273E443EA1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 14:42:24', 0, '2017-11-24 14:47:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('601bb0ec55f442ef8e5eea918f113375', '06D0527ACDEFC6180614AEA45DE35896', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 16:52:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('603226cbdfd04bc3ae3d55db540e5662', '725FD0A4633DC70A40A47AC91746DC38', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 17:49:42', 0, '2017-12-20 17:52:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6073f27a57424862b2bc62995f306a16', 'DA9E0ED550BF5FC256AE7EF08231F430', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:00:59', 0, '2017-11-23 15:31:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('607520eb5c7345feb6f7e662cb14187e', 'A6473A4FA12E236CACF54265B2AD1839', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:31', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('60a9b8774eaf49e5aa1bfdc28436da4d', 'D3F7522E6A7B32B1A098E5C2C2F4D83D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:03:05', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('60ace1d26db24ff58c9dd6151774e11f', '917AF1F3F6CA7327D8DAF645F510F8D0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 15:28:47', 0, '2017-12-20 16:00:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('60b74f315d4740028f491a16a8ad6bc4', '270B32B0B6DD208B938AE220CE122737', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:33:29', 0, '2017-12-26 15:05:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('60c0c8ff9dcc4dc0a6df478d54f8bd79', 'FAAFA4DA700738985CEE42994D075D4F', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:19:27', 0, '2018-01-10 16:24:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('60e1c668fd874a4f950f3594b5c090c1', '04DB0E1109157F7C67BB798EAD6C9467', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 09:49:18', 0, '2018-01-17 09:53:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('60ecff15f3ff4ee7a01682d51220658f', '11E4DB0A8064133F95E5156178312A35', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 20:04:02', 0, '2017-11-17 20:06:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('60fb1a72c5744a48b9baf3d7c120c862', 'C32A01898A2A2D725A5DB8279D6F87FD', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 10:55:13', 0, '2017-12-20 11:31:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6102d920b50848ae8373c0d4009d6b41', '309B46BEFE0C92AFC05BE55F88E478A8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:29:18', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6104af94bb274a748a844f883506962e', 'D3DA22B4719F3ACB5D765B777FDF4017', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-24 11:31:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6116b3188fa647459f8dea9e3cad345a', '28AEFCEEA65083C42791DE79D59220B9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 10:36:55', 0, '2018-01-03 11:08:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('611f121b362049bb93eac3f0bb2c1084', 'B5FC4D3987B074CE49636F377D721F73', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:09:28', 0, '2017-12-12 19:11:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('612fba9f27274806a0828c7dc34cb6a8', '31566B0F0A9EEA2F8E8150CEC816979B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-02 11:01:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('612fcc7c680f4884834c2a6085115304', '368E3A31BBF18D35C2BA55882557E024', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:25:07', 0, '2017-12-23 10:26:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61301d81f1844909ab148939cb3293fe', 'A016AE2B750466303E3E381083403AA9', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 18:15:42', 0, '2018-01-09 18:18:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61467ad2b70d40f7aa5681e61126fb92', '67170C36E3CE00A1032973244B48E2B5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 14:57:23', 0, '2017-12-13 14:59:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61571e9409dd454ba59720169505ba0b', 'B2938B34A5D4DEA5A65D840F9F4CC5F9', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 09:18:32', 0, '2017-12-24 09:20:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6158ad8f946c498db1a620cd57d181b5', '1A1D311408164FB3D5D67DB37C41DD1A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 15:01:08', 0, '2017-12-25 15:12:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6159f0ce247649829d5d7f6f128e23cc', '5A8A0E298DB24028EDE35880E625DB92', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 15:30:06', 0, '2017-12-19 15:30:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6162183963d84bc5b1de21990796db06', '34F2DA41EDD3DC03ACC6A2B8CB70282A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:46', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6179bc4e2344490bbdfd5001994df428', 'AA0675CFE881FA4E494740693EAD7416', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 19:33:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('618b581001744545999903be31e4d5bd', '301197EC44426CBAD84D6B9E5340B121', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:20:31', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('619ce5a6a9ef455ca96d03a2aa86f733', 'FEE6478DF15B19031431746F28AD2EE3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 19:51:24', 0, '2017-11-17 19:53:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61aa62e343ac4848b8e2450f0121bf10', 'D494DA34690A6CC62D49AACDE0A5C662', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:24:06', 0, '2017-11-24 17:55:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61b3e352d79347a9aebf722f6203ec97', '1DB7B32D278BD08DB1AE20D249D1FD65', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 20:04:25', 0, '2017-11-16 20:06:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61b4cc9e2b2448cca7bb8557166dae6a', '300EBB28CCB42863438E1EC170897F30', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:53:30', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61c651cd55aa45f4ae4a5e01dabd8c2f', 'D28CC51994CD73A336A38738CEACA1F5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:11', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61ca8882973a45e1b6495feba30b2356', '8433B28B3FB07EA2780B327D986DB5F4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 14:17:01', 0, '2017-12-18 14:20:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61d5cc4c5e3a49a9bf82ab871177cd00', '5FB4CB996EEE1A0DFC5280746EE15F1D', 'W07249', '李维佳', '10.55.148.130', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:01', 0, '2018-01-10 17:55:24', '5e0b157de9ae4c2495f3918e7625431a'); +INSERT INTO `jcdp_sys_session` VALUES ('61e08668c7d64add815b2926d30bf237', '4D112F0D685B47836FA775FB3BA9DEB5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 16:41:48', 0, '2017-12-11 16:46:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('61f4c46d258f4ec29432a14dd95c34bf', '4E54ECC7D120F33362F1B965270F4636', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:18:13', 0, '2017-11-06 18:20:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('62004145f16042afaaa934b2e5cbfae6', '79E42625EACDA318F807692BACF3E91F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:12', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('620b951851244c2f9f3a2fe9361ce873', '144EF74844F4C382EFA28CFF7582A137', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 21:38:32', 0, '2017-12-13 21:41:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('621c49d62d634afc8ec891690beff1df', 'ECA68BFB9DE04344C4A847E87D99EA63', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:31:56', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('622ac9afd4f94e73bed4f67d54b3d4c9', '5601437392DFBE7855ECC62076E68425', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 19:55:24', 0, '2017-12-13 20:02:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('62557c97ee964dbc90b28bda4a217def', '45E453FF6DC4A2632944E13F69EE8B61', 'P12189', '赵简', '10.55.148.133', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:43:46', 0, '2018-01-09 16:15:49', '5676921ac94b4633a614892676567bfb'); +INSERT INTO `jcdp_sys_session` VALUES ('626ed297ad6a416988f54a90ab560cd7', 'F8BE7BBF728584C52963372E1C48E78E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:23', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('627297a3adc8413d8b5872b562e36e89', '3EBE9F04C76E0EBECB1EB0D40F64FACE', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'localhost:8080', '2018-01-16 10:30:29', 0, '2018-01-16 10:37:28', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6290047087af46f58ddb39c213d4486c', 'EF1DA10F84CC4C98D8F194512AE8BDE6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 14:18:07', 0, '2017-11-29 14:20:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('62a18f0b4ef34af2bc1f37015a1522c1', '72E55AC816D3037EFF9DEB9BD4205800', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 09:23:33', 0, '2017-12-26 09:54:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('62c1407c96014bf5a311804059d4bd10', 'CA6BFB091C62D169F16EACB5F3AC3046', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-13 15:56:02', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('62f8df1041ab4e4da013736b389f1eea', 'E3C00E30E8FE3A1AA41858AC8C68E20B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 10:30:31', 0, '2018-01-03 11:03:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('62fb38d8e34d4f71ad13b769fbfefe5a', 'F03FC3650C570CC5883B6E939F6A3DFC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:38:11', 0, '2018-01-02 11:39:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6323b65f6fbc4f96a91458b3d5f8aa19', 'B78A62C4029ABD171FC3EC8BDD6436B7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 20:09:51', 0, '2017-12-21 20:12:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('63286f767ad145bf9b621bb8777f7474', 'CC25347376E0FA2B1D264EBD9F3E683B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:50:20', 0, '2017-12-25 09:51:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('632fd65ead784c60b0bb921b588c32c1', '6A717AE872B05994AD3EB70D5CF99A39', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:04:33', 0, '2017-12-28 16:05:40', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('635a3d7171684a71981749a1451146d8', '5AE86CC8E4B914BDE55E52E3AD328CCD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:52:28', 0, '2017-11-24 17:00:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6366dfe9cac24a00b5ec7e3ec644bb54', 'A46F7EDF255714D7D29CB5DCBF3CEFD6', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 17:27:31', 0, '2017-11-27 18:04:05', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('637b0bf5e3e34c638ced477dd245eeae', 'D83760C7CBD1C19E540B3C55A5E0C6E6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 14:52:35', 0, '2017-11-24 14:54:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6386c33a707e4581a6c3e63abd5d9320', 'BFC7EE0B383E2B88981FD90635BDDEDA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:43:24', 0, '2017-12-13 16:47:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('63bece88cb434effbad310a360f1b635', '3E8DC4E9F7F5B97C19CBEA10344E8C9E', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 16:24:36', 0, '2017-11-22 16:27:01', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('63c121f11a5c4b26a4e9f010a8fc63fd', '483BB2A8CCE80CDCFBBE1162894124B7', 'P16107', '韩燕', '10.55.148.207', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:00', 0, '2018-01-10 17:15:55', 'a6fefe02f64446cb855941af41aa67a9'); +INSERT INTO `jcdp_sys_session` VALUES ('63fbc558f4244020b5c6c028cdef8097', 'C5DFB1FD6C76FC092DD86BDC03140216', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 16:29:00', 0, '2017-11-21 16:30:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('640ec94869f546bc9d65ce9671e36dcf', '4D32AD1AB35BD8DB27EEB3A01BFC207A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:28:24', 0, '2017-12-26 15:03:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('641acdfad4554f34a1676015cf868ab2', '5701235B948825B69A343921A7F766D2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 12:01:50', 0, '2017-11-18 12:03:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6421ae1c46d04b37b8c1ee4361cfa268', '9EFB8D6C09B4C31D562F0F1BB5FE6AC6', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:23:34', 0, '2017-12-28 10:23:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('642342d2cb444213866c4bf6100d6de2', '1B0E0179DA6F002CFC8D6D87D325A8CF', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 17:50:16', 0, '2017-11-27 18:23:10', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('642f08ce49d24087be48be6e8f409a61', '159730D2F65248E2E5A796E76E95C018', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:29:18', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('643a634b4b9f4db5b1b983bc18b229fd', 'B85B264C5C5E774A78A6A47D8F242D93', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 10:19:00', 0, '2018-01-04 10:45:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('643ee2a1df7a45bea20c0fe7394ac99b', 'A0A4DB1953E29AC471180E3871A369FF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 15:53:58', 0, '2017-12-25 16:12:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6454ba18afa14d909c201023c884d257', '531F0C1A9873720375FD5AE2A9E6A2C1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:04:25', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('64573af6be4c44de9a53741af1396847', '3970DFC068F558050AE91E7FAEF87205', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:53:28', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('646b0f624d6c4b15aa3ac5746bf9ab1b', '1FC140B287A7DE823B6ECDD33AB593A2', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:32:59', 0, '2018-01-02 11:11:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6483a9797b974be38bd8d64be4b938a4', '3F310270C793F2FECC616F182BB1227A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 14:34:02', 0, '2017-12-22 15:10:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('649a70a812c9447dbda84cd862f60747', 'AE276578396A850B2A0E430E0D0695B6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:12:13', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('64a3547079094dcbb2168187e8cf1e29', '0393A794EDA8C02564DAF36E13ACA603', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:56:45', 0, '2017-11-23 15:27:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('64acdcf6af5f4104aa89ba463e1cb4ab', '4F7C1BF136655A6298474BC7E0D48851', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:01:55', 0, '2017-12-25 09:06:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('64afbdec106b4476a7df7578cb3f10a9', 'BC5936613A5A2D180DF059A6C8132EC3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 15:27:13', 0, '2017-11-21 15:32:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('64c83f2475384c699c73df820fa829d2', 'E07DCCD236723343227720DBAE28D044', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:21:39', 0, '2017-12-25 09:25:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('64cc36fc7c664a2da43577543c4207b8', 'DE72C81D7C32841D96D39491930B51AA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 11:36:05', 0, '2017-11-29 11:48:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('64dc14ccf71e4ec5bcc8be2663de1e97', '03299B9EAE9E7B92A45C165B9BCEE6DB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:37', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65177f906fb84c68a07269db63c8391b', '5B83CDE98FA8994D3F28F3A1B8750583', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 18:20:58', 0, '2018-01-09 18:37:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('651d4229fc1849e38e8ef354687829ff', '802B65305934BE05769C3FAF3AAAF3A0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 09:03:44', 0, '2017-12-19 09:18:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65297a9c6be4441293494ad0cc7e5ed7', '85FB23FEA661834A890E5736918D79F1', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:22:34', 0, '2018-01-10 15:25:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('652ca5f8a58a4557acef5b58b767a767', '0CDFFB00F4D7A774F1CC5E8A32C1EC67', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 19:51:18', 0, '2017-12-29 20:05:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65308c4b621245b88184c8e049205ba8', '4C791F4E0E56FDD90630D661B9BE452F', 'W07427', '刘聪', '10.55.148.148', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:45:25', 0, '2018-01-10 16:51:23', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('65579ea45bbb49c5aec6ca8800bcf0bb', '2538C98378DE66BA4DE9AAF6DD1D215A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:01', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('655a0ef9cdd14a10bf864eceda767a2e', 'D1D48EC12D6D5DFAFF8CC73770E1AEAE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 20:30:28', 0, '2018-01-03 08:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65677e5ace55481f9bf1e1745785367d', 'D2E370CA22D7334ED828F4E803A2AF62', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:40:41', 0, '2017-11-22 17:42:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('657006c312e34cacb22b8df517630c40', 'B1FB6955A1737A76DE9B599AD439CFFE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:25:53', 0, '2017-11-06 16:28:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65920ef0a46a4b9497ae3f5759092242', 'F4060BD90497C976D24980A594103B67', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-27 07:54:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('659338303e324005b229f7673ac8f174', '6FE44FD5A981BFA606B8046F694CE505', 'W07249', '李维佳', '10.55.148.130', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:11:06', 0, '2018-01-09 17:53:20', '5e0b157de9ae4c2495f3918e7625431a'); +INSERT INTO `jcdp_sys_session` VALUES ('6597efb6d18d4373a966678734d01bbb', '9AB466DC4796BCAB3C3C10DCA407E6C5', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 09:41:19', 0, '2017-12-26 10:36:41', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('659ba906d5ee49e1a94659f796732f93', '06D0527ACDEFC6180614AEA45DE35896', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 11:46:00', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('659d0132598e4399a84fde1503be9959', '1AAB8BCA39D546CA9F923DD16579207D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-20 16:58:44', 0, '2017-09-20 17:32:00', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('65b3a3f631a2408794166acde35938f9', '00F4F64AAB5DB69CA322479A6273FEA6', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 18:53:17', 0, '2018-01-09 18:56:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65df2e28406b4e9e94bf1dad891955b8', '575BEC93B2724664CE3BD4208F540944', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:14', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65eaeb1691bf40e891d7f00b60c36874', 'AAD851249D4EF05508958E401764E75D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:20:04', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65f078e2744d4c5ea9542416645c82aa', 'DF5B6FD2642FE29DF40474C769A9320F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 15:18:27', 0, '2017-12-13 15:20:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65f279178d5f4f1099a2996bf239f05b', '358942D20A0808B9E80D9F6E3A8D81E1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 20:05:30', 0, '2017-12-29 20:07:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('65f9c640047148ea9b4159c76f38324e', '9F3CE88B872B910143324F7E1EA69FD5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-04 10:29:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('66064a46d6664d308421741b30cfa5bd', '29843FCC4CFDFEAE9F9802FDFA679D63', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 16:21:40', 0, '2017-12-26 17:03:43', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('660e2c3d306e4972bafeeea6f3f5347c', 'FD35217A07CEDEDD4B61310F283F7AA2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 15:25:08', 0, '2017-12-23 15:45:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('66227e5761664d0cbd4854a41788c69e', '911FDBCE304FD4808F392642D00D5F50', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-13 08:56:56', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('665d9e473eda4f35ac21336d4a41b39f', '3551CFFFCCE4EBF54CB135DC43DFD489', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-07 11:25:56', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('666a50501aac4f5086e3506d1ac8cc72', '3C3A2011126FC1D1BAE863058B5AE4D7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:20', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('668ebe8df6d94d0ca5904dcc53695b49', '7EBF077315CDED286364032FED72C26C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 08:25:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('66a7ac9102974f9494fa8522bd146295', 'A37BAD26EDEC39D5C7B49CC2024D8C0A', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 18:33:22', 0, '2018-01-09 18:37:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('66da6456a80148059c27716597119c06', '316E2BAA5FD439B4A26169477BBECEDC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 10:28:58', 0, '2017-11-22 10:32:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('66daf6c38c204d3bbbcfb6a57b78edc6', '2B3F7F78BF92C8A91492071CA3545CD9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-16 19:22:47', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('66e2d94a70914f1a8e31f063db4a3a59', 'E066D30F17FDEC767B3D7D412193CD0E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 20:03:11', 0, '2018-01-04 20:03:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('66e36b4c791c472584d63eb994379dfe', '9026029CEA99692637621FF3A50E8C67', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-18 08:26:40', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('66eca82011da46a39f69f023e76d1149', '54A86F4A9C9711EEC56356DE22D77A8F', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:29', 0, '2018-01-10 11:32:30', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('66ed623405e841c997fa78c5ee1840f2', '92AA6915BA314DE54AC98271D2AF7583', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-09 15:36:41', 0, '2017-12-09 16:32:50', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('66fcdd35841247ca9f7a1e9e48167dff', '22657A3E5B9A3F2FB5CD85542413C6F7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:12', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('670e0e5e963846e98c607025b8ba709d', 'EBDFF0DCB5A7E6A4034E9F2A853908EF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 12:06:37', 0, '2017-12-17 12:28:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('671c2bb7baf34e39b4c283a6f5f59262', 'E21FF00B9D0667463DA23B2B3BC44070', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 11:07:03', 0, '2017-11-22 11:08:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67203741bd2944aba219ab42ddaa250f', '22EDC627F685B7DE9EE88AD87D4B4719', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 09:03:27', 0, '2017-11-17 09:05:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('672dfd8be6e246d89663261858c084d9', '959661F2DA6DB7401CE420A76D291AEF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:26:03', 0, '2017-12-22 18:26:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('674d4b75bc614f8f8819a140a6f80063', '89F9F14F4FBFD7FAF30B6307BDAA52AA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:34', 0, '2017-11-23 15:33:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67a78bf141874d16842001e4696d605c', 'E8139628645BE6E80C92148037B408CC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:10', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67abb115d8394fa3bd481f1290dd799d', '5425E1338E3E188EA8A381007807D468', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 17:39:20', 0, '2017-11-29 18:30:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67b40a4540834689a0482c167918f1c5', 'C36006CBF1ACD7477E06E3273EA52695', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 11:54:43', 0, '2017-12-22 12:36:10', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('67ba36b5b768406a8c8bd9c8600830af', '92D5A58EA46D3A334217199EA1846046', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:37:14', 0, '2018-01-16 20:03:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67c646eaa064490d8877689e3a67e646', 'F759D8E84C6E0D80D31DAB88A3621DB6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:47:37', 0, '2017-11-25 13:19:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67dd27a11adc43ed83d62af10aaa077f', 'D963628B7AC5F4B8E6D4CBDCC3316A44', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 11:34:51', 0, '2017-11-16 11:37:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67e3d4b8b30342a3be9660b17b271219', '1D0A29B2A653AAE85D4AA177ACBB1088', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 17:19:13', 0, '2017-12-25 17:49:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('67e6d9607f994cb4b7374bb5eb65c825', '013D2A195E4B372732E5053F46CAE8B5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:53:38', 0, '2017-11-06 17:54:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67ed605d9e554685b74625ad4dcbd046', '9C0D1CB1121198544BC7773D07FD076E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:19:29', 0, '2017-11-06 18:20:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('67eff92f0d784bc3889903b1e6780a9e', '5228E662015FE95B21CB3E93165994BD', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:14:30', 0, '2018-01-09 15:16:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('681ab08f91a74fd6b1e490865dddf6dd', '2FA2AC678D9EEA92A74985105DB3EFE9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 16:14:03', 0, '2017-11-09 16:16:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('681b5398e9f04494a43b9bec0aba7ea1', 'AB185B68726DFB752DDF9A875FA01E5A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 15:12:39', 0, '2017-12-11 15:16:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('682832918e7c41269ad9f6899cf642d5', '2E9DD042A08B8FD6088C96128B7DFD89', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 11:52:01', 0, '2017-12-12 12:27:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('683d6f57ba4a461191936d870d067006', 'DDF3FA9AD28840C45590B490FB05EFF0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:58:55', 0, '2017-12-26 16:15:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('683e3ae932974b94847f269f7fc84974', '5564B163F9333E9E095D3190F1374305', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:57:00', 0, '2017-12-28 10:28:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6853a38a4bff49218ac14a2cdeeb9bc3', '8BEC2BB028F0B47F5E8095A7D356E2E2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:22:31', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('685f0b63828d432cb3a732e2f5aafc8a', 'FFC07973D1ED1B8AC7852ECDAD3AD98C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:01', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('686d1d5c1c2f4b17aebc4b054cf272b0', '3DA14DA9EA61934B69949AC58987091C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:15:50', 0, '2017-11-06 16:18:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('689463cd5d884c87a78e9f3e8d03bc97', 'F05FB0D62B75D558FCA121C62ED85E1B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 16:56:01', 0, '2017-12-18 17:29:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6898f51f0bbd48ed9c4d7ebea8b3fe46', '41C48520EBD01272BEF6B5D545A54D12', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:38', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('68d144f1d0fc4497a368a3a27fd7a9bb', '99FA6E39BED6F59A147FB51811C04B9F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:46:43', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('68d676dc03c144ce9699e9f21eb55ac8', '7DCF9D493D0C23671CF642B1EA8AF4D4', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:13:26', 1, NULL, 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('69123ea728bc4ee9a4bc3e82f7f4464d', '9775AC852CDD326AEA39446D37851356', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:25:07', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6956df9b349e4d4da6b28810b9f07289', '960095C9338B6F65E3A4382E11C32D07', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 11:05:43', 0, '2017-11-24 11:08:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('695c68cab5784fd082bc7ba420677fe8', '7FB6CE047FF80923E0F58151E35BAB97', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:25:05', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6962e6ffb8c64e3c94d94756329cb5fa', '76DFE4E2D51DCB0DAB0B22BB08E20B03', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-17 08:54:21', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('697529fc847f4074a5371c08426d2986', '8406005C651CA3EBC7E3473F2F8859E6', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:08:06', 0, '2018-01-02 10:10:04', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('697874c420d74601a2165542b4c5da1c', '3FA8BDFEA04D027C6E99D6ED5243B4B1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-26 15:53:39', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('698327429c4d42e99ce8417dc2ca1afe', '587F949DF7F99B9C64ED931DB3287A5E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 16:39:38', 0, '2017-11-29 17:27:28', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('69b11d1773b3491ab2d87942c0812bec', 'A252EF05BF15F156CEDA2A0358DB53AE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:20:02', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('69bc86cdd35c4951a271b14eff3bb98f', '9483D967DDFC25CBE90E31582DCAA6B0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 09:01:35', 0, '2017-11-17 09:05:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6a06cf7e593d44b7abdfea072dbcc852', 'B9FE4F6369A67A120918A71997C0B76D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 11:09:20', 0, '2017-12-11 11:42:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6a23e6560f0f494384caf8745b0c089e', '2E3E4A367F9CB4C938F6EFA9C1E7C87D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:04:39', 0, '2017-12-13 16:09:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6a3233de388f412892aa0d5b683ee830', 'FAFE28F702490E4484B90292BC6C5D06', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 09:07:14', 0, '2017-12-27 09:56:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6a3ea58b033145df9579619ab1bd7c71', '2F1169F0CC47F01721B8ACFCDD7E6C9E', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:42:38', 0, '2017-12-22 18:55:12', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('6a4cb0b4a9244f26900014b634ae17fc', '7BA131145DA2833DCDCACCBF6D325E96', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 08:21:09', 0, '2017-12-26 08:21:25', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6a6088094d60477da111542d2eed4b70', 'D3DA22B4719F3ACB5D765B777FDF4017', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-24 11:11:00', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6a6d59e9ca0b421ea078ffef80c39717', 'DF05E5B288B973BC31E8CA01CCC07B99', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 08:55:43', 0, '2017-12-28 08:56:56', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6a700384925e43a6b73c32ca259e7aa6', 'D8F05DF1848A6D6A5C4F83D6CDE2F3AB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:23', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6a7297ddf3d2456db6a92f6993d37e81', 'E0A5B4E17BDCB8818D605EC97719BBDC', 'admin', '超级管理员', '121.28.24.199', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36', '39.106.113.161:443', '2017-12-22 14:03:45', 0, '2017-12-22 14:34:56', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6a75d79713af4cec97189b39c6210a76', '1988892187C129D68D8F18D9E0C0465B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 16:34:03', 0, '2017-12-25 16:35:50', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6a8bc4fd86e4447b844fc218d7456f72', '195F1BB4971912A8475F358AD69932B8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:20:05', 0, '2017-12-22 17:24:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6aaa7ecc1aa748bfbd80f4137f6d7571', 'BD00E7BA73655A61B0CC9D3352273001', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:52:20', 0, '2017-11-23 15:23:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6adefb58bc52402f9e4d560053883c09', '7B8C3219E0B3696811DF6011CA7F0F0E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 16:02:34', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6ae21c15bd6749348940a918e8a44ba1', '56CCA85DC24EBFE7802375B936CF22B7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 15:40:14', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b1543b1b8954942ac45fbc2962b7fda', '44065914203F954C0CFF386EED54E205', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 11:07:13', 0, '2017-12-09 11:08:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b159c2f41e94fdda2f0cbe40f4dedde', 'B17DC3D5AB6733478E4CD109201A2749', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:56', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b1ec69dca9543dfa7408913d40af1ef', 'AA14B1ED04D8BCBA333096CD9DFF81AC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 18:05:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6b2c5910f7204c5c9073a5e3ecc1e92d', '9E0D796D674CDC87B521E389065A812F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 16:36:19', 0, '2017-12-11 16:40:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b2e16c3928f41c1a10bdf5ad1edc751', '8C52FCC6F937BDE2D50127DA80F34CAD', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:21:25', 0, '2018-01-09 17:24:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b31912876af483c92a41d73392c5675', '145EEC16EEEDF8F669FF2BA6C755B21F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 16:31:40', 0, '2017-11-16 16:35:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b3bc06580424a49a4607f05b099de9c', '183ACE0D96F54D9DADE835E97DAB02CF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 16:47:44', 0, '2017-12-18 16:52:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b5d9d78e9144836b87bf825cea8c8b5', '08F06DEC8A3CFD751FE305A507D3D6CC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-31 19:43:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6b5ea2fc608e4b559a61ebc58b970838', 'AD2008A0B40866B4703685CEA446E701', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 08:36:02', 0, '2018-01-17 08:49:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b67210ab17e4ee9a23bef67a015e55b', '17A4411BAB7DE3ECBE9B8F23D24F3BB2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:56:07', 0, '2018-01-02 10:57:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b69291b9a044d059306415a7285a2ca', '10DA59276EEB1E4796D02576D87B1D3F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:24', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b6afb7ff02c40ed821049aad63211b0', '9B76B7D99CB411DA5766DCC6FB09BD34', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:53:25', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b76049db26a4fbca8286fb4c3ec5bec', 'A618BBA0C2AE84118BC93E99E134AF1A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 08:55:30', 0, '2017-12-09 08:57:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6b7d9e557f9f4833855d494e261678dd', 'B20FC2DA049A4BA7AD35605D0AFEF515', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:56:13', 0, '2017-11-29 10:59:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6ba1ffa25cb2461f8e85ee3e67e07589', 'DE9F0630C872D999824A17CE46911500', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 18:25:46', 0, '2017-12-26 19:10:44', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6ba88c5070b14bbfa83fcb1fd9db5405', '7B72290EE6B18AE42A53A0AF890377B2', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-05 09:18:32', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6bd7347792c644e5b63860a38f59d07e', '508A85C72559EC91870158EBA44D3662', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:48', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6bd9e0d60a274d0986f1048fac818c54', 'F734EF51F3419CFC0BF1485FD3840B98', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:02', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6bdd86310e404bde934b832095f328ff', '61CA3CFD0C0300A80E9A8224D392557A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:15:13', 0, '2017-11-06 18:16:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6be898c521154a7b913a3d5517b3f792', '14723FDC09B3A0B7CDF30627A16B3A1A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:56:41', 0, '2017-12-26 16:15:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c0644f9b8054ec492d6890be6b85e77', '98AE640BFD96E76EDC2DB6BD886F3DDC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:01:27', 0, '2017-12-23 11:01:28', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c16f1e384a149a9b0768f3204acf05d', '9DB32B5E3151B87C430C08974F4A8855', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 11:23:57', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6c1b3ba728074d6c950c5e7cf0b0aa4a', '809F07A604237842C49B7B90F4D77936', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:50:59', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c33f2118879417db2a71acc9ca700e9', 'E1712F5C34A593ED82CDF991CDE24820', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 10:35:08', 0, '2017-12-12 10:37:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c47bfaa476341d1ac0eafecb5fedba2', '5B8FAC24F4C448B730DC0C7CE38ED238', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:27:05', 0, '2017-12-28 17:34:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6c4a543011e347a9b05459b55a47d2a9', '799DB041A215EF3CDA5573153072A12D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 18:42:58', 0, '2018-01-16 18:57:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c4d4efe83e34c4c8de538648b9fea19', 'A71C75D6C0DCA04F0995B1CD516473DA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 20:07:44', 0, '2017-12-21 20:12:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c5d8697b49c4cbd856f7b24427203f4', '836E470B4BE097F091369BEAAEFF07EB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 14:23:45', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c7d4c7b1b3c423b8d7a345a6ec05bf6', '674149F51DEF5102BBAC9FE263471545', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 14:56:42', 0, '2017-12-29 17:02:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c7ecf13a80948c095d438d25ec3537c', '564C703129351713593A373A8D8CAC2E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:31:18', 0, '2018-01-02 10:02:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6c817f2b48b74430b0db1b90fd0be12d', '3BD07188D5CEAE52FB309008F679F931', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 17:32:11', 0, '2017-12-18 17:37:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c88d690d13043a9be5e094552070ffb', '7E5665BD6AC6E0F70AD1E12C25AB8578', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:18:57', 0, '2017-12-22 18:19:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6c97693d674345e7a9bc4a6658f9b8e3', '3A29DB667A8A6C4391E85F0AFE57E971', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:01:43', 0, '2017-12-28 11:02:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6ca8b9dfd2cf4052a6db9bdd0e5d395b', 'FE92DF7817554856FD81BE3069D0C1AC', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 17:13:51', 0, '2017-12-27 17:45:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6ca99ddf7be24e959f110a90e9ef223a', '16E4F86E33C3366C70531BE18E419A1B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:04:58', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6cd88ee3c7bc489baf466d035544377d', '5D2ED85039FC262019A7E8176DAD8E6D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:36:49', 0, '2018-01-10 09:08:44', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6ce56297b3d9463b89a8f4d638bc2cf5', '1B867BCE72CA2CC3F9C03F7289758068', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:33:35', 0, '2017-12-28 14:34:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6cfbd74276d34a4a8ce3d616ee106d3b', '6DA64C42A3624BCFB1DE85D70C91504C', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:46:47', 0, '2018-01-10 14:53:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6d42459bf4cd43c4b12702159a9fcb1c', 'E5B239792B81661E6C00534C662FF49C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-26 08:45:04', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6d5867bd826e48ecab80b78f1508648a', '13C2255A686E3E832222AB30D22A9444', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:44:27', 0, '2017-12-28 20:01:08', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('6d609221ba8242d9acaf809a63c46bbf', '9868F475615A52512B37562E1E37B275', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:11:58', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6d66af62fd7c4ec6a40ba672c70790f7', 'FB7ED9A578FC9FECA199F13A52CCE0E6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 11:28:45', 0, '2017-12-20 11:31:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6d69627574424fd9b89fe3f0642725a9', '086CCE60650C1989B568FDB1AD6920B5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:01:27', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6d6978252ce0490caab059e480440d28', '20CE4E6067674F57DCDB3E6B041658EE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:09:07', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6d6b20619ad84a04bdda14bcde05fa2f', '43B0B452666CAD0B05F14C2E63F56CED', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'localhost:8080', '2017-08-09 18:57:12', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6d6feb9ed6fb4a67b1d8acca8c819f2b', 'F58A9FFD72F5D59E8DF8D796AABE63FD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 19:24:26', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6d94db01a4a44471a0ebdf80b880e3e4', 'D26873BC663328052A5EBA56CCCDEDA5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 08:43:18', 0, '2017-11-18 09:12:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6db5f5e8f9c042e2bf720cfb6118c7e8', '0D4E6CD8C8E9F1CC15DB914D73F3018E', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:02:36', 0, '2017-12-12 19:03:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6dc91d290f124cc186509db257288a0a', '2032FF1C82C2F3C69F61ECF96CDC063D', 'W07248', '贾怀玺', '10.55.148.142', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:32:11', 0, '2018-01-09 15:30:19', '1d8094115f5c4c6ab8c38c414a65d6f4'); +INSERT INTO `jcdp_sys_session` VALUES ('6de95d0f94c6474f8b9016f17a927fb0', 'A9322C2D19B7563BB9247E425B107AC4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:58:40', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6df07773d8ab4d6b8356b96dbd1b0005', '8C0823EEE5A76C9143E940F22CC5F50F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:38:55', 0, '2017-12-25 09:40:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6dff7e5367d24c6889c3c8506cd66b36', '5C946860D5615231FEEE0F06939F352E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 15:20:16', 0, '2017-11-24 15:22:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6e13265705524bab930b1a3c683abf65', '923F09EC3009E03A7DCBE81D7F46362C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-12 17:39:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6e2587a1e3f84d8fa9fbeb2c8801645e', 'C2F9CF6DBE699B8F6A1995731A068CC0', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 15:34:25', 0, '2017-12-25 17:38:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('6e3093f954c641f79ede3b6765d9abff', 'DAE181D396E66441D7CBFE8153AE3A64', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 08:55:41', 0, '2017-12-25 08:57:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6e4967d04af746009cf734b8a06a88d6', 'D6AD06C80945D9EF99D27EC99AB4B3FF', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:07:00', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6e62f689d6cb4c588a7862b24d97a199', 'F9080A67313E19820F19838FA3AD5A10', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:58:43', 0, '2018-01-10 16:58:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6e756df2c756464a9aab0e8b26867a1b', '38FEF56A682FD0DDB585B68B1213715E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 09:14:13', 0, '2017-12-26 09:47:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6eae09834b264d86852b0c543495682c', 'C61E898F7774E18FAD7E0FE60B1762C5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', 'localhost:8080', '2018-01-02 19:17:56', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6eb9a6904a944c1189b1bbd8e12dbd99', '8BC2BE49DDC2B7276F0C5AEE88249370', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 16:51:54', 0, '2017-11-22 16:53:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6ec1f441e1b247fcb194d88fbe9e36a5', '7BFDF456052F4A6DECE676B8B3C176C4', 'W06893', '张立奎', '10.55.148.128', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 11:46:39', 0, '2018-01-09 12:53:57', '44e74bb07b4b4fceb9ba9ed135ea5e7d'); +INSERT INTO `jcdp_sys_session` VALUES ('6ed65a2d8bf64abc96f4ec7e0d4c3251', 'B754B7F1CED02EF1A747A53FEC59529F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 10:46:30', 0, '2017-11-17 10:53:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6ed9cab62f5c4509b008368d0f5c12e3', 'C57E4BBB8FA1D036F05B80B2CA7F126B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:27:31', 0, '2017-12-28 14:28:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6eee9842cf82477586e444b74393126a', '3C10937D5BD9CDFC21C4F10754737E62', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:29:11', 0, '2017-12-28 12:00:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6f024b299d1a48a68e3de9fbfe51e6e1', 'BB19457586A14CE846DA5F0511372C4E', 'Y08066', '靳晓松', '10.211.55.2', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5', '10.211.55.5:8080', '2017-11-10 09:10:56', 0, '2017-11-10 09:21:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6f039426e2894854bd7b29f7b6dee119', 'C1A9987B06C51710BED72442963D9865', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 15:10:05', 0, '2017-11-07 15:12:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6f19199b7520473d9d9ec3fdd9e83346', 'A753CEFDC5EFE1B9BBFCAF043F5F5519', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:01:46', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6f40211c0de54d6f971058dc1bf9fea8', '0113A284669EF85C2AA5F1B7D82B80D9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 10:39:33', 0, '2017-11-16 10:43:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6f51ffa87e0b4604bdc70a78313f2811', 'EE79048D9031B6305BFEF59F41D58A17', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:55:55', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6f88a5b197ac46479d5a3f9825a7aa86', '08898FD456116DEA1B4620AE159879A4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 15:18:30', 0, '2017-11-24 15:22:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6fc129c5e84943a1850d6e1695268715', '002196243AD9EE9DB2CAE8EF34063A50', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:56:55', 0, '2017-11-23 15:27:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('6fd1feab0a64464fb64a8f542e90bc0f', '956F2F05B0588B44030D973CA24DBD55', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 16:27:00', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('6fd3bb26f8a24b6996557dbcb8430190', '13E22D1C6D0EDC56168687470DB9B0FA', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:50:30', 0, '2017-12-28 09:51:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('6fdae22b27e54b2b95c3b36acba68765', '350AB991F0D3EB02C0256F43DE8F39D3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:55:56', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7017a29dfd484669bfacb60a05f63b39', 'F84D92842AB463E8FF6D068553AF16D7', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 19:54:25', 0, '2018-01-04 20:23:06', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('701d28f3f16540e698e700b9a0aa0151', '843BF546539AED0EDFB61FB96BBDEBD6', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:58:58', 0, '2017-12-26 16:00:35', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('703874d3a15c45ba8eda1f937c453a5d', '777E38AFB9D7D0DFC5F2177F33BB8139', 'Y06216', '牛立栋', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 14:41:16', 0, '2017-11-27 15:18:37', 'b304903b0f0a451bb44685a898508369'); +INSERT INTO `jcdp_sys_session` VALUES ('7041615b06584031b0f98f170b51cb5f', '141BEFC50A5CE8AB3055E42C29183410', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:30:58', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70435e71b26e418da5ed537629eafd82', 'E0DA6DB553403BBC131B516B168D7F57', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 18:25:44', 0, '2017-12-19 18:29:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7052c7ed21f44accae0f98a7e7ebfc99', '158E65F3C728A39FE32429EECF9EC4D6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 11:32:59', 0, '2017-12-24 11:41:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('705850df9a7f408187bc21f594a16420', '00CEE843461473AE9C7F7E554033C0B1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:00', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70693b8d81c34b8c8aed2ede14c8f365', '1CC9EC31BF8F079ECBF01F2090526259', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-25 16:38:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7076d9f6203448668dc02f13ddc34894', '8B63D995102B3AAD1966470B3BDD1E8B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 11:10:50', 0, '2017-12-29 11:42:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('70814c12c424404d8b5f0acf9b097304', 'D53124D478C21700C809D3F71D4A0548', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 13:28:19', 0, '2017-12-14 13:29:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7083671ae9b74761acd39199255c47ef', 'AE0A7D74490BCA24060DCF60DFAFDF50', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 18:23:29', 0, '2017-11-21 18:28:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7094cfe4d664480c8a2f8ed707da423a', '4E8C2CBBD5B224F0D3D0AD2DB529AA2C', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-13 08:34:18', 0, '2017-12-13 10:04:22', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('70b07526b04749e9a790b927f6e8fbd0', 'AAEB3C7CE133445E660750D8B9F788C0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 16:20:06', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70b0f042ae1a4ff1b72e6e85e542b2a2', 'DB7E9676D7A8C0B294CD3E699413766A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:24:37', 0, '2017-11-25 10:26:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70d3ae91101d4286a3e91e337a650aef', '98D4662D45AC08008F32B20393FB6811', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-11 10:32:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('70e5cc9484114045b3c4d808ebf589f4', '6D8DE97059ED3435757F231C4DEC1998', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:28:54', 0, '2017-12-13 16:31:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70ecb750c1d44490ad40f6dead311096', '7FD22041FDAA5E6D56475C73DDFF041F', 'Y08066', '靳晓松', '106.117.98.0', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-08 21:48:25', 0, '2017-12-08 21:50:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70f082b0feba4d7f887f470af2e830c3', 'EE73159CA1439F6819AF790247ECD8B6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:40:14', 0, '2017-12-12 14:42:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70f22a081dc54dd5b0578e56f9ea7007', '180EE079020C8BC15BD94409C55B15A6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:55:56', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70fafe12c53b4df490564b0fba0889dc', '9F772B81D9FB6B00D648CDBC18557D3C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:22:29', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('70fb2b7d0f2d4f72bcdca70c6f80f3d6', '2CE4CEB9E689738CED1DA4BD44E174E1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 17:30:21', 0, '2017-11-18 18:27:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('71307f560a1e4e4ab7aecd5422fac2e9', '70E6B34871E4E30645852EE36C169EA7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 10:53:08', 0, '2017-12-09 10:54:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7135d4d05e6e4dd0800fa65453f9e0d6', 'B59692A4D8FF2B2A595AFC8D4EA8BD18', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:07', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7151b99873e2433fa0fdb7d040e170d2', 'C5AFD6D30C74935032E3FBDF3FAE5F8C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:37:24', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7178c1413ec7492f9756720d39cbf861', '6DD57AB46C75FC4B98F4F4C4001303A9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 09:05:54', 0, '2017-11-23 09:19:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('718eddc35e5440878dacf398f16f8a29', 'AC6BB459A34447A80FE7D78DB276B9B4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 17:02:46', 0, '2017-12-13 17:06:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('719efbb6c6da4867812ed1e6c1ce89ba', '2E53EDC19E5090189D0E175DA2C3C06E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:55:47', 0, '2017-11-23 15:26:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('719fd29099c34f0ba60f407b2274db10', 'A8C49781DC99B49E345EC228C87DA225', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:29:58', 0, '2017-11-07 14:36:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('71cc71c520074015ad8771ad96262799', '3E94976E11979E64A12BA45F5073F771', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:41:33', 0, '2017-12-28 10:12:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('71d6464b255743c1a1d753de7aae2cb0', '0AC3D3AF00E82E30209DA95ABEB31D5D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 15:00:14', 0, '2017-12-28 15:31:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('71d8f85617c24a76b23c9ed38537e4de', '6F13D710EDD070ECD0466DE18BCD3F75', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 15:00:08', 0, '2017-12-13 15:03:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('71fb0dfc5af446ce823da4e0d7b1e2a9', '8CE5A9239B1F4B83A805E00C745C21A4', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:07:45', 0, '2017-12-23 11:08:18', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('7218820058584c248fe02655bf9dedbc', '99BF6BFD76D24A8C89CB9BDAF7514034', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 19:05:20', 0, '2017-11-22 19:07:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('723d7aca0cbd40adba9c25b693f02ed3', 'EF5079F813C0AD9E688A68B7397AF7D1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:05', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('724b1c3b51de408c8fe6c0eab57bebf5', 'DA6261E07DF8C5AD8D3B04D0F8AA9B41', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:31:40', 0, '2018-01-02 11:35:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('724bcf47dd4f4d489a3d609f87771064', 'F70691A5715374B11D7EFCD9005B5FC4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:08:45', 0, '2018-01-17 18:15:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('72643db6848d4fe79008d34291324083', 'AF1FD15D51E521D921D11120A0D47D5B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 19:44:48', 0, '2018-01-03 19:48:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('727bd5184b0340b293132fbfe9b34b38', '1C9C9A803C69BEF14AFBCF8226441733', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 11:45:55', 0, '2017-11-29 11:48:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('727f70977978491faab3ae615b47a7cd', 'C0CFD81B2904DEC7FCCF116F96429F0F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:32:36', 0, '2018-01-02 11:35:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7280b6e468a04d63a046367312b3e3be', '540658A6AB2655E6ECABEDF30B8CF22B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:40:05', 0, '2017-11-08 14:41:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('72b3c3985c61420c826d759d84a1bd4b', 'D698FBA36A39645EC8715C744E2A68F5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-20 09:48:14', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('72b64c6f56004b1d8cbaf4b2ad72a0ea', '1B3BED748BFDE88593E75BBA92555431', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:18:12', 0, '2017-12-23 11:18:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('72b838a8c7e0427493004c47326b64fe', '0BCB20763E656BD169A7AA8904C75D9E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:29:49', 0, '2017-12-22 18:29:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('72ce83e2686a46d29ea2b9136121be15', '8F43A4BFBD5DF427B8805F7F5A7C3B3C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:30:56', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('72e7ca3eba9d495ba2c8804578028c21', '21A9DECEE7DC098D5FFCDBA7DB87D02F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-02 15:33:37', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('72e8924ca41c40f3926332e9c9e99d2e', 'F070D4BE26037F20BDD6C02AC20FB66E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:15:51', 0, '2017-11-23 10:20:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('72f929805d044701a6570a24b9b77ba2', '3263678FE097177512FE1859D8C71F3C', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 18:30:36', 1, NULL, 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('7302ee25336744f4a64965a1907ee532', '9114BE9988DD0BFEAA692B11440F9C87', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:30:44', 0, '2017-12-26 14:32:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('730f7078705b4022be9b6124210c4457', '026ABDA7CB20BA80DBD209509395F57B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:45:04', 0, '2017-12-22 17:47:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7324499484f845a6a85a80886e00fb9e', '2533EC2AA33D1F985348DA2FD7937F33', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:09', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7331386775c84d5298e937e1eb8be632', 'E12978548391A7046F5ACA7ED2E74694', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 19:26:26', 0, '2017-11-17 19:28:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('73366b197b414d4ea81f2f9bb51871b5', '91B8DF432193E4872DE10F5518BA21C8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 11:35:33', 0, '2017-11-28 11:46:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7359b8533425480cbd4ff439e7a79239', '634F011BEC19651B62FB9257AA003D0F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 16:16:06', 0, '2017-12-15 16:19:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('735a6364c5b3486895fcfd2baf669cd9', '925E4C9095324A5BE5E5D2D129AC6923', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:05:54', 0, '2017-11-24 16:09:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('735a7239446a43d8a7c16f4d7744af03', 'CB0660050926BEA2363B8DE260A22C45', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:37:53', 0, '2017-12-23 10:37:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7361b536e85943e186859abc6f9f23ae', '3DC80F5A38D5A977C353246100B125DA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 15:58:52', 0, '2017-12-13 16:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('73a92c0473d246f287265ba4474dcb4e', '27880AE5F06133E261FAF3F9DCD090F5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:28:45', 0, '2018-01-16 17:46:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('73c8387bb7044e2f8f9c61e2724a3ea9', '133938A636CBDA88FD159195E66E6163', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:16:16', 0, '2018-01-10 16:17:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('73d3ec790a55410aadbec8c40bcbc6b6', '3C54FC9B3F3AB0CE4703112E84194B09', 'P12189', '赵简', '10.55.148.133', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:27', 0, '2018-01-10 15:45:23', '5676921ac94b4633a614892676567bfb'); +INSERT INTO `jcdp_sys_session` VALUES ('73d5270cc3d84271a38dc1fc6c5b9e33', '7DB3CC8A73256E212A9979E71634BFFD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-25 08:04:30', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('73dc214ed7c4419880e78e55bf4044e4', '41F4635808CE1EE3699AA38693E504CC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:21:34', 0, '2017-11-23 10:23:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('73f61649bb40421fb9142135c31c9280', '4B09D0111C9DE38DBD30CD3A84D3842E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 17:56:05', 0, '2017-11-08 17:58:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('73fb09176235431891aa3c99a39fb46d', '06ADEE73AB52664176A5F931A47CB597', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 11:37:24', 0, '2017-12-24 11:41:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('73ff52007a9f4966869aaae1b140b44d', '68271147C68BB58E3FF8665D02F913E3', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:53:46', 0, '2017-12-28 10:24:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('74164edaba594bd2bd1a0d0275b09890', 'FC2D9DA93ABA94C6DD6070C8A7C95E6C', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 07:54:56', 0, '2018-01-10 07:56:20', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('741f3e5ed1644233956ce9b1081db341', '675EBA3366C8AA311F56FE5FAC9B4217', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:56:28', 0, '2017-12-28 10:26:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('743954599df5490e83855f37e5e05b38', 'EA32DE4E40660B93341A0E76DAAB2069', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 16:25:58', 0, '2017-11-21 16:28:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('743c4075bfb24c8b8fa3b59bc7b86d86', '88F30C52533640FDDC639C665FEA1F39', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:19:07', 0, '2017-11-06 18:20:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('745db598c3a442f688e793abb4c67aaa', 'CDA75497C09076DF4DB2A65C83A61B98', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 17:04:20', 0, '2017-11-16 17:07:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('746005b400134cf2814c000edb5f107f', '89B65FE06CE22BDEC6C78D1D8110CB07', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 11:19:18', 0, '2017-11-25 11:21:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('746dd68e9e014bb0948e8dc7a8874352', 'E9EE3EB04A67760CA426C18457F8537E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:28:00', 0, '2017-12-22 18:28:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74708711d9ab426e896df8ba5352c73f', 'D52329535237AD8A856C9EABCC823EA2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 17:09:42', 0, '2017-12-25 17:14:35', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74756b59dc7846938ef09a947508d3fe', 'BDBA3F2DE689A4575016E0A872499CB4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 13:57:03', 0, '2017-12-11 14:06:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('747c1879fcc84578bca9b4a91697d095', '8F0087C332158DE6B999055A8739BE5D', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:04', 0, '2018-01-10 17:31:24', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('748fae8def314c44b4edd479886e40f3', '8663BF14BC0849E29A8E1F86FB591012', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 10:37:52', 0, '2017-12-12 10:40:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7494e436efd94f32865633780ea6e8c3', 'C5D1408981B20495B9663604FF3EF8E9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 20:18:08', 0, '2017-11-17 20:19:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('749ff73cc83441498132f2eef329f040', '4A01223163B37CC82C229A03C4810D86', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 10:42:47', 0, '2017-11-17 10:45:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74a9676da2aa426b889729190ba90dc3', '30D3F489E5695A6939EB2CB27CFA252C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:52:24', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74df79b8cbe8446ebff5a84052227d0c', '8771361274A2C826341F9830E0924583', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:18:31', 0, '2018-01-10 08:48:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74dfb2f9ccd54e36856aabbeed0a2e5a', '332749806350D79E86F6D321C3AE0539', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 09:28:28', 0, '2018-01-17 09:41:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74e1bf9e576d44c7812d871fe95f20bc', '31B0FE4EEFECA6AED4E63E4563E948C9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:18', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74e21ae45e4742bdbc655b4fdb743fe7', '30012D7180B8504BB3307F9B2D6D2453', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 15:11:00', 0, '2017-12-12 15:15:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74e7181d73b24b53a34c4b5167dcb6a5', '812AD6686B568BC832CBDAC6835D9E84', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:24', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74e88dde48524df1ac05b8a70944091e', 'E4858E96968391B808C1B79704B9C616', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 09:19:05', 0, '2017-11-17 09:20:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('74ef86825785431dbfe6ccb8a010f637', '1F6F8601C90ED2175ED682FD6B823BB6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 16:30:05', 0, '2017-11-27 09:19:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7506dac0d6fa4656a56855468d71e421', 'AB7D28360A294DC83D6C50C9BFD6DB8E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:01:20', 0, '2017-11-07 14:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('752798ab9db34b0eb517d5671bd440fc', 'BBDDDDBAE5474C715F04F0594A5617C6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-09-20 16:58:12', 0, '2017-09-20 17:29:00', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('752e5eb3a39f431a9b43966518b11609', '7E26539BC8765E2B91C2CBCCADFE8FF3', 'W07249', '李维佳', '10.55.148.130', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:34', 0, '2018-01-10 12:43:21', '5e0b157de9ae4c2495f3918e7625431a'); +INSERT INTO `jcdp_sys_session` VALUES ('7535241954f644ecad334824a3afa905', 'C848C6AA41E254F08F1C68336C06E400', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:54:50', 0, '2018-01-10 16:56:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('754176c06a2e4f5fa23dff8205e59432', '5BB4FFCD23CB3E67AD68CB2674C5F293', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 16:06:16', 0, '2017-11-25 16:08:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7565097a46f04b6e8b9ca947df7f508b', 'E26737D969C7BC8BC3063D41409A998E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 09:29:48', 0, '2018-01-03 10:02:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('75680da328bb4aea862811c8e49f14d2', 'CC13FBCBA0B972E4358EBA0E3084B58F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 15:57:02', 0, '2017-12-19 16:00:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7582da65692e43ef98df6a4e821574df', '91EC5D3B8587A3F74FEEB19485820229', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 10:21:23', 0, '2017-11-21 11:14:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('75d66baabe334667b233e0e8bd09cbc4', 'F53EE7BCE11F98EC4B6AC014C2540396', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 09:22:47', 0, '2017-11-10 09:24:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('75e0db562f88450582b46837cd786944', 'C7CEC4CC4824858BE41EBB7306A7487E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 16:00:41', 0, '2017-11-16 16:13:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('75eb06f757614f87bbe25b89404310ca', '3173ED3964B850E04D30DFFBE56D3FF6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:22:21', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('761f3eb94f054eb7b8b0f693ae2baf7b', '789C67CE21296AFA5263B220F84A4317', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 21:40:07', 0, '2017-12-13 21:41:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7621334b00e34681ae26cdd3ea1635ce', 'BD105DDC569FFAA8EAB28CC1993B5B48', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 18:12:55', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('762bd342c08c46ceb1b239e2786cec23', '71C666638B598AB2DEC69CF5082B31F6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 19:33:32', 0, '2017-11-25 08:55:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7633d8033140444ca9c94a9189851148', '8C9EA774577CBACB9BF0CB1592C62A85', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 14:32:46', 0, '2018-01-05 14:33:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7641c4613f384f95a60c1602a847ee81', '85BC6E87AD2376BE3E4F4419F2AA7C2A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:07:06', 0, '2017-12-28 18:07:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('767561edd0e449ff8981ca7d2c3f4d34', 'A52DC6CC0ECE662F27C3D329D6A4F35B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:04:46', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('768a2b771ccf445a86113d48d4d908ea', '7BEBC046CCB414963EF7B0282B223EF9', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:35:31', 0, '2018-01-09 17:37:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('768ec3ab1b704cd5becb032ae4017a9f', 'B5F7FB57C6307B84157DD25DC68DC2FF', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 15:56:14', 0, '2017-12-29 15:58:13', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7693362704204effbe3b9c826d070309', 'DEC2EBA2979D816DA06A4A7B82B441A8', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 11:50:41', 0, '2017-12-27 11:56:49', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('76a54195dbf349ce99abcc6102a5501f', 'D156D52122C903151741CD8A07D47B4E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 10:32:28', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('76a97616d81d4ea99d201b4aef777276', '73F0DDCCCBCE805071678B0BD4A5462D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 11:46:47', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('76bc108920eb4b09910e9dddda337ae5', '226A4DA770819B20A697F490D8DDC3D8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 09:57:07', 0, '2017-11-17 10:03:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('76fe32e1b5ed417aa9ff85e3e38c9cfe', '258D61D20BAA245809F24D5DD24BAB61', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:35:54', 0, '2017-11-22 17:39:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('77015c62e5cf408696f45351ee4d5644', 'E6B0CD075F93EE25FD24709091B78621', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:33', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('77060281cf194caeb4b01f530244f3dc', '944446E91FFD6E872081DC779C31F74E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 14:43:43', 0, '2018-01-17 14:48:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('770eb5ebc92b4ca795e1e5a4cf614776', '15834CE27B461E16B2C53E35C3C1FD3D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-19 16:24:58', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7730f1ee3eb240a7a3507215f7ddddbb', 'C15ABD9925A2D5D5EA5529F429FD7A39', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:49:25', 0, '2018-01-09 17:52:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('77402886b7444223823501ff54a7ec68', '56F5E5D31BD538447A645114AD29831D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:13:18', 0, '2018-01-10 15:25:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('776697ad7d02461d88dd2fdc5df01a45', 'F9B4A17E3F01E40006212BA3D42F8D0A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:42', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('77685b57a4e54e879531c29680c80a38', '95FFE8716C2D655EC89DCC760E844B08', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 16:58:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('776ec0b42eb44164a8f271c01a953c60', 'C669C3469E02E2CB13020FDD90B6A3F7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-26 08:24:51', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('77773f22375f4dfb92ab6ab13cbcf8b2', 'E378977F65E78C393DC13A54CA8ABDC4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 15:18:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('777a1fc32cb745228df3ae7d9c34a2c1', '8F607101A24739A91209F453A3CCE540', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:10', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('778b9a3eb3cc4f8dab7524642cc28973', '37D3D3A5BFC3C1CCC717CC745F813C6C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 13:31:29', 0, '2017-11-25 13:35:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7794c12ca2fa4504afb266dc5c2b231c', '68213F2E3A12C74F6E5F57A2E1B2D0F0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:39', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7795065626474d5e81643dca7f346a6a', '1A6AC9BF5C8F511D091198B6D973849C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-12 18:41:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('77a820bf573b41cc81aa131eab47c28e', '93AD1C3B325B600784E19C120574569E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 11:22:11', 0, '2017-11-25 11:27:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('77bc899290b143e0a4e5128b4bd2ef6a', '36BDAF39EE24F840B1C9011E92D61CDC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 11:25:16', 0, '2017-12-09 11:26:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('77e0e1790dfc4cb09d56fab039a6a36d', '28627D32C280AAFE4542B0A7DA00C330', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 14:24:11', 0, '2017-11-21 14:31:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('78065a519a5442f282481724c8f4bedd', 'FCD579412698E10E65FA63FDD9A15B51', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 08:20:45', 0, '2018-01-02 08:22:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('78085a9ab4334587ad7db0634902c5a0', 'BDD5C6B0429D81A52C084A5B8AF98519', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 16:54:38', 0, '2017-12-11 17:08:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7822375e350d4856b1ba467189da98ea', '03A308EF7BE24DA0FCA222195A668434', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 13:24:07', 0, '2017-12-14 13:25:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7827b212cc2c46d78ef86b7a548eb7a4', '5076B09C0AB8434F0C7F9C68A4BF10AB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-20 15:33:05', 0, '2017-11-20 15:43:45', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('782cfae77c9f436a834fb7f49efdf123', 'EA81A3983576E14D8F9C1050C60E5D31', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:30:35', 0, '2017-12-27 16:31:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('784344e1b7dc4b41bfdf0409b0d75cf9', '50FF7F3CA8FC944F77EE3E7077294B2A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:22:30', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('784b64ad63144d598508872766b04574', '84451FAE72F6BAED091DDF4C8B3F178D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:17', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('788b980a314a4f829270885cdc2e6873', '76A7BAFDB210739FBB25CD901E4E3918', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 11:04:53', 0, '2017-12-12 11:08:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('789365fb461f465ab6270e9c9be0fa68', '9D1A44D6A6C197C80248E6F30E18B285', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 14:50:49', 0, '2017-11-24 14:52:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('789a9ba125be457ca6bb7fe918e57256', 'DE6B8636A3B80EF3353BAEEA69B18A15', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:03:26', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('78b295e58a8b4b6a8a6b4c84568be3d6', 'DEBCF21AFE0752F8BD49383E06B6C9AD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 20:24:21', 0, '2017-11-10 20:27:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('78c1f11388244662aab5dfa253698817', '697834162CDC61F9E5276BC9653AD034', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:50:48', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('78fbaa1c4d284990a8c4adeab0a9441a', '721DE4C779E052E4046B9042FAD8671A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-21 14:39:21', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('79144793080e45bca0ae6983e2aa19e2', '6D7357A0A4978A9226770030324B3B4A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:34:28', 0, '2017-11-18 11:36:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('792277ce6161434bba4567959f21e89b', 'DE9BE82D04917F7A33A9DE40715B5A07', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:27:15', 0, '2017-12-27 16:00:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('79385a4f80084c3eadf974dfc38d8f54', '7BFED422B4273F70ABBA2ABABC81EED1', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 18:02:54', 0, '2018-01-09 18:09:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('796eb99775b042689752bef7644a0fc9', '1DF948B921CA7B363EEE4003FC535438', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 10:37:49', 0, '2017-12-11 10:39:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('796f0f9bb83a4144b49eeb808510f849', '6FD4F816BD395AE84599E9B79D286C97', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 18:30:32', 0, '2017-11-21 19:01:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('797b22ee556e4bd5abaec8e28bf8753d', 'E9D470566DBE533AD9493059FC724F38', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:11:00', 0, '2018-01-10 14:41:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('79870ae910cd4f6eb8f6dcc81dd9035b', 'D293941B169D06CA25A90E9550566E77', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-10 16:44:09', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('79a4af821b5041228b2c18808f50ce1a', '35BC2E4D63B01CF43D679A0918F12981', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 12:09:00', 0, '2017-12-17 12:28:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('79ad3328cf28444c9c8ba1eca60faed3', 'DDD9924DCB6D02E8349ED82E7F358CC1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:19:03', 0, '2017-11-23 18:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('79c00b16e49249b989b11aba05cffe67', 'C4C39AC81D8ECE5E9694E5BC9BBDA85C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-09-25 15:11:05', 0, '2017-09-25 15:41:39', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('79c36078f6fa497692c137fecffaf2bf', '51B39A72625B7AB8CA07548A1F21A8D4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:56:46', 0, '2017-11-06 17:58:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('79ca27cb36ef4cfeb1b9c730d472eeb2', '3B535AF444B921AB60615DC5E1B1536E', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:30:12', 0, '2018-01-09 15:00:51', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('79d81ed6646b42ec893738abc215b2ab', '49C54CD861F4361FEEFD58D8ED291032', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 15:09:55', 0, '2017-12-28 15:11:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('79dc95f4c9c142aca4c8bdcf65a33a1c', '78A489C1EB12045F63721D8FD4E39CD1', 'P12188', '赵星', '10.55.148.147', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:28:24', 0, '2018-01-10 11:26:21', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('79eedded1db34d14931396f7cd09268b', '6CEE3621C772070B9BE0907DE11A1C40', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:22:58', 0, '2018-01-17 16:25:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('79fb28f1c2d94496aaa6fc4268b6b431', 'E6B9EB0C47F5C42244130A45624B0EDE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 16:13:29', 0, '2017-11-09 16:16:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('79fcac18a3a0427ba7f1819b645bac0f', '1367378C1F5F4261AC7E8D0423F241CC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 19:30:32', 0, '2017-11-10 19:36:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7a076ce85c694efea4170eba9c34fa2e', 'BD54B665D1C53EEA7ACB50C0CB6BC8CB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:27:34', 0, '2017-11-17 11:34:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7a0a90ca7bdc48f1a5af1e1bbe8dcd0b', 'B0FFEB4FCF20B635326A63B4B1ECB526', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-10-17 10:10:34', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7a170577dc3f46c4ad793e69f1a1096b', 'AB08ABD49D955F59F2B41F54BF726EA5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:32:58', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7a19af6670d346c0b8112b580ab2a814', '17DD8F4DC49170797FF08379DE6F02E4', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 17:00:37', 0, '2017-12-15 17:24:49', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('7a1a06c7ca0249a98e792b6642f79d25', '8F21857D804DCCAE816C0B6C50CAE98A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:32:04', 0, '2017-12-27 15:32:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7a1a44db4ec3436f8fed880d7f70026f', '8D7D31D9291353DD0F9FC8216038E75B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:52:58', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7a1da201f32e4e30b823188d26293187', 'E2A2EE051CBEBF90D5816DF5B3358FF0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 16:35:46', 0, '2018-01-04 16:38:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7a1ee50abd324327b91050ab42e56a18', 'EFDB3040B44663CDF2FB659EDC2FD149', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-01 15:56:28', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7a2e3f7713504430aea3727c42df65ef', '6FE324A7B431465B53CC641421F2ABF7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:18:33', 0, '2017-11-06 18:20:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7a7687b7ce2841b494d64e96ee2890ee', '70A9ADE369EA1244EC4FDEE0F296E99B', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:26:20', 0, '2017-12-28 19:57:07', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('7a954135143b4ee288001d5e68ad877f', '538C7EDBC2F2CD375FF4640D1B15FF2E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-18 16:56:37', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7a96b91d2b9c451cac9f832d5d5226b8', '05B82A0782A06DF346EA8C25AA8A0099', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:09:49', 0, '2018-01-10 14:40:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7abab5f075e7402e81dcf7dcde053fbd', 'D70C6D144E830446CAF1B245A5792320', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 15:46:26', 0, '2017-12-25 16:02:23', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7b0c902e5dde48b896d8d7e9011504cb', '4C82DB031310115E2AE457F6BF781808', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:43:13', 0, '2017-12-26 15:54:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7b21eec4b12f4b03b69b90799c2816e4', '2D167A8F3E5D9BFFF4A0328223F9F856', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-08 17:54:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7b2efa12adfe4e589b700ea25f47356e', '88655063DE6DF90C547880EA262AE7BD', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 11:36:33', 0, '2017-12-27 11:36:52', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7b3eb3801f7d42449ea68b1876dff1ad', 'A048CE405518BC24AB069F5F565DF8AA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:09:22', 0, '2017-11-06 17:11:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7b59e584d5be45c9a998af3978e6d458', '962CF16477F512D2FF48D90455A7069E', 'W06555', '王晓明', '10.55.148.231', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:04', 0, '2018-01-10 17:24:23', '340fe94b0464472e88cc0fe7065170dc'); +INSERT INTO `jcdp_sys_session` VALUES ('7b6cb8eddd6845f7b2d92b9ed2e06e09', '414054FC121EF3D1455B9968019DA7B2', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 20:29:40', 0, '2017-12-12 20:32:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7b82cb0952654c6993701bf98a7c21ca', 'E66FB74F12C50A78615E7EA1957A3BF8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:53:38', 0, '2017-11-22 18:34:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7b84909f2c2e473d996123ef1c06df53', '9771DD02DF05A24BC3854C86E2D42F7B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:01:50', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7b96e88ab5374b1081f39a1b9709333b', 'AFB6D52CE9084542E5386162FB6421FB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:29:12', 0, '2017-11-06 17:38:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7b99fd48e4ef449a9127b495f0bbfe0f', '891AE25A637F1D308EAE048538C6FF3F', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:21:21', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7b9e162d8a1d4f50acde4d568e5792f2', '0A3B4EAA92E5E709FFD0A24AC2A62F7E', 'W07675', '马成', '10.55.148.200', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:28', 0, '2018-01-10 15:45:23', '521d08563ab74b8188599be180575bcb'); +INSERT INTO `jcdp_sys_session` VALUES ('7b9f9dd5000a457da527a23b1e2338ca', '9895C6D3DB5E385917D6D94E405DFC89', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:36', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7ba28b08ad0644c1ae8019ce22d87575', 'A4571DE77470D7DF82D12B24784692A7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:58:31', 0, '2017-11-24 17:00:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7ba5775f28c342d0a734d8a76aaaea4a', 'B59A8ED78AE16DB49E72CF0EA7FFE6AA', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-03 16:33:04', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7bb5c77dcc4a4ecfa1dc8cdd713afac0', '9E0AF3CF10AEB3166C87584728251650', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-09 11:59:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7bc22c585f4e4d37b65b4ae8160564bb', '2695550D222B93B8E53896120B79329F', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 20:33:38', 0, '2017-12-13 20:56:22', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('7bc3cb8e8667408f82bcc5993c47fb00', 'B1EED01365D4819A1CDE7E99FBD172EC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:18:44', 0, '2018-01-16 17:20:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7bc5b59db8fc42d49fba05a474a08225', '72303E03824D7D87504A889B47CE99FB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:48:33', 0, '2017-11-23 15:19:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7bd7cad0b9f3470696424e7d3fbbc1ac', '69EF65E935ACD3A883026AD46A3358AF', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:53:37', 0, '2017-12-27 16:26:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7bf0dce4e39f4429b4ef30622ecd3d8b', 'BA1D8F26D37131764DDECBF615BCB924', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:29:47', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7bf4c436ef684825afa8a4d6ea6444af', 'FAF0629D61821E26501775DD2D8D8B40', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-04 10:32:51', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7c05527e869241cf86cb82b532e4f4c3', '460A5EA4D600E3FEFE0A6BE99CFDD546', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-06 17:01:23', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7c07148dfce3407fa132bd7a5743c167', '9EFF80EABD521BEE2E5F1AC24A7CDF7F', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:28:49', 0, '2018-01-10 16:32:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7c1bb8ab0bdd4d4f9158b4ec202fef41', '5223C75EF24D553A5FF0F456AE89C2AF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 15:40:44', 0, '2017-11-09 15:45:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7c1ce83f52c246eba30c1c21c6a9b353', 'AFEF3870A370A87BB5F69A1D178EF5E9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 08:24:11', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7c246a8bba7342d69b4644d62f0ee247', '2CDE49463C2171F08E81A12B5C023242', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 09:51:26', 0, '2017-12-17 09:55:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7c3c26051e2640c6a3d779c6d18af09a', '8AC38898F6409951433ED7F352D17F48', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 16:31:48', 0, '2017-12-29 17:03:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7c48ee93f3614d47b73b58c03d8043ea', '61D1442BF0A648088451ACD37483C17A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0', 'localhost:8080', '2017-08-10 10:59:57', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7c78150aad284e5586865c0cbe0f7bf9', '40A37F45121FC2F38353D2D96F24882C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:04:33', 0, '2017-12-23 10:06:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7c7b033e56cf46329433dfc00d1d506d', '112C9492162BC3439DAC61FA109CC0E6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:29', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7c95b13528f44d5da3b3534e6e36dfb6', '62DA9C3555C08185C2C6B18EEC13BF0D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:25:54', 0, '2018-01-02 11:57:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7ca1840ef9054b4b890cd164c3414a11', '2543E828A8B21F05FCAD0C6A47E90AE4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:47', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7cc98e5dfc494b83be8122d08dba8f96', 'A8C51A77898F010FC1F46915F29297FD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 09:51:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7cd33f19d8cc4b8a9709b99118c33ecc', 'C1964AE0843A6FCA9FFD4B73BB54CF6B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 11:49:40', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7cd7f1c69b5f42d7859b57bcab7d7f2e', '8F7694263FC548A62BD22CB686565F20', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:24:34', 0, '2017-12-13 16:26:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7cdf4ccce45049b5972aa9fde8d2e6d0', 'FB3B836FFAE060ED5BCE344699B4DAD4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:03:03', 0, '2017-12-22 18:04:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7ce54f2ba7404d5b8d23f2580ed0c518', 'E982F4ADF256DC466CFE19E818A982D7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', 'localhost:8080', '2017-11-23 14:06:10', 0, '2017-11-23 14:24:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7cfc723bab684d26a7ee2e9ca3d0cca3', 'FAAF24FE71A68958F424FFA394726D9B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:54:38', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d03811913dd4f67ae3ae44ae8d0c417', '54906B69A8961409DFC1BEB5F12FEFDF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:22:41', 0, '2017-11-25 09:30:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d2d1685061449779c4fac0aeb24ac03', '70E6F5AB7FACB6FE81A64636E5C50613', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:35:33', 0, '2017-12-18 10:42:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d396aa9d3344b6da108a45470060845', 'F56E05198CD2562A2ECF419F0B1840D9', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 17:11:34', 0, '2017-12-19 17:12:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d46ded480fb4db0ab17f58c0ec8de16', '95F349D5962C2CEC7EAF4CA54D645E95', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:29:41', 0, '2017-11-06 17:38:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d4ca07ce7bd43a1adaabcaf00619619', 'BF630EF33BB36AB5B9745CA0D410C44E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 17:06:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7d5f3a6ff3924f86a1e2f5cdcdfa5b4b', 'B491D0C49EAB4732448A63EA2646528D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:52:47', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d6151117c2c442f829949f1d5ac3c75', 'DF32A5C8714C3F4C61F5E39B061F7574', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:13:56', 0, '2017-11-23 18:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d66bb68e77e4f9aa0343a76f636dc2f', 'E95374752E22788B4FE3CE1909ABD8DD', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 19:40:17', 0, '2018-01-04 19:46:13', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('7d7716a753234d48bf3c7c5956c31ff4', '2200B05903C6BACDA027DC89785D2DAE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 14:22:20', 0, '2017-11-18 14:26:53', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d7c6f822bcb4be5921504b7dd04ce44', '10F67ECE20D5FBC65408D2D9C80F268F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:19:02', 0, '2017-11-23 18:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d7f237cbb5043b4b8d667446cf76f58', '555E49196410D2721E16BC6274785BAD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 08:18:41', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7d83e3ce3a84436e9ac4bc6a1807da03', '13533EF1CD3D1E4A9DA6D3BADD0F4848', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:22', 0, '2017-11-23 12:04:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7d91c28598bc4dc3b5b44654361c8c2f', 'AC547FD4F2CAB22973EC25F31BF1FCD5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 12:08:24', 0, '2017-11-18 12:11:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7dbdd74d70ab4a63a528d86e94811969', 'BA7C673B10D20C0DDC0071CC6EEE0CE0', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 20:16:35', 0, '2017-12-28 20:18:01', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('7dc231c720be49f0945fe153d7465190', '8C8E1ACFE85E80CC7F1960D25DAF6019', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:51', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7e024ce899d14c248eb6df7c9288d50b', '487ACB31CDFBFC92B05DBD304C7A0155', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 14:13:09', 0, '2017-11-27 14:13:35', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7e13f1428b59475ab3f80828a8c08f39', '065659957402C928A895231DCC3A8B64', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:52:11', 0, '2018-01-02 12:24:43', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7e232a2fe2d8429a9d8b0160abb32b56', '091CF57757741FD2FA3FB0F7A0817E9B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:38:42', 0, '2017-11-24 19:33:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7e3e3b9f53f84218b8c3a028a2d4dee9', 'C69C0B55A2D3D6F206406BE473F81793', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:25:40', 0, '2017-11-23 10:28:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7e61405e6e424e3b9eff627ccfd379f9', 'C272A4676D9F4FF1D7F16F955FDE2000', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 10:39:19', 0, '2018-01-05 10:48:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7e6df54d970f4d739815e81947f1da8a', '41BC72E8C4B2C8E14B846BADD8D75FC1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 20:54:24', 0, '2017-11-18 08:31:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7e8202dd29ff4f2aa7a2be408d70970d', 'ECE3DCE2F17F2679BD409909E93200C2', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:18:22', 0, '2017-12-27 16:26:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7e86d32edb7a47a2b8617c2b1e76f5ee', 'EEC1B25B41985A1E7E354679828E93BB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0', 'localhost:8080', '2017-08-10 10:51:36', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7e8f9a34fa2943909ff93f61f2e820cc', 'B6D3432D0B3706E65406D13E8200C194', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 09:48:02', 0, '2017-11-29 10:02:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7ea20ddc92ac4fa48d79c60011ccf31c', '1FAC298244D5B45942C722BCB02946BE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:00', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7eb5dd51e6ef4de399c0442dc2c7e84a', 'CEF96153741336DD311037F56FFC7DE2', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:00:08', 0, '2017-12-26 15:05:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('7ec2e517fef64aebbdc3b065fa8196fb', 'F1B0E19ACF60A733C9773397A6166EBE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 17:12:38', 0, '2017-12-26 17:28:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7eed80117e5e4490ae4e384a8a936ddc', '2E4EB8AD673FA0B8E1A07D868DFD2FFE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:36:10', 0, '2018-01-17 18:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7f0b643695ba43dc9d27dbc0c4f539e5', 'A96308EF765E5E0355BEA79DF45CE517', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:04:33', 0, '2017-12-28 16:05:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7f14a1c964e54ed694e6b1ba5eafd2cb', '81A0AF37FB0DC50DC9F5244EF4976297', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:44', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7f26ee5432a0411aaf19564345166a8a', 'CA75A0D3E50DC5ED936413F355B856F1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:49:02', 0, '2018-01-17 11:01:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7f296691a3274f2496f24c09a1643ae1', '90328A7B7D7B948CAAA1507AF6639FFF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:30:56', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7f2e9e8d70c54defbea2172bbdcc76c3', '7A1FAE8F9621F7ABBAB1C3637C0EEB4F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-13 09:37:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7f2f2fb5d08f405587c1e92e0fba69bb', 'BBAB457FDABC02CC58A2A9AC7F96EF4F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:49:52', 0, '2017-12-25 09:50:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7f5c0c4e935d4635bf1f3eb9691b7779', 'B456AE9BB6E89826CE172A08985D2577', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-12 09:16:31', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('7fa4a42bf1f041f58ee9eacc0d1828dc', '55E1D3AB0DA8547EA0CEFD96D5C6B22B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:21:51', 0, '2018-01-10 16:24:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7faef8bab0c04f108492977127f79256', 'A3EFA717BE49A0C524FA8D777F5F8925', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:24', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7fc52147ac8d4b63a27145de155771ad', 'AA51D742BA100A63D547B48B67280F47', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:34:10', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7fc6d5bfddd845dcbef3fe6a23c42a4e', '570F98B2A84E0046A9021196855FB138', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:05:58', 0, '2018-01-17 10:16:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7fef68ef3e8a46389adf4a95420e6b66', '334904AE0662DE0E64B2E9CFC2C6CAF8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:48:25', 0, '2017-11-06 17:49:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('7ff23969cd42422a89da1d6e51d19148', 'AC55381FDF589CF832C01CED80D5218F', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:12:20', 0, '2018-01-10 15:12:27', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('801a3dbc57a64df48bb194aca26a642b', 'B22405EE70E14E610AB5C4ED20472D8B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:56:13', 0, '2018-01-16 18:09:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('801fcc084c8d456db949539ee362d72f', '1FAFDA354488690FC513D908A74956A1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 10:50:59', 0, '2018-01-03 11:10:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8030a9618b7546259915b792463d672f', '70220D34694A5CE7ED01246968BE52B6', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 21:12:46', 0, '2017-12-13 22:54:27', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('80342ac071084f92ada8b3ca69edcc1a', 'C8C82C7AEA4D8DAE7DCE362A38204F90', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:45:52', 0, '2017-12-28 10:46:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('803ecf1d8537434789f5038ab5da6d16', '48A53A821BE5441610CB898FF06AE9C8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 17:37:41', 0, '2017-11-08 17:48:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8047e5e9e08a421bb48f3de3b22b10ab', 'A961059CF838DF8F61C49FF730C9CA29', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 17:31:41', 0, '2018-01-17 17:35:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('807ba7e8cc3944ef887d8723dd5fb0ae', '294B48E1A3E362A4CC75EC28A3176937', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-16 12:07:07', 0, '2017-12-16 12:09:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8093cef73f9c41368c7f50b0c96270fd', 'F7BCD7823E37D54ACDCC664B4CB7F8B1', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 16:01:41', 0, '2017-12-26 17:42:15', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('80ae4402ebf840958ce021cdcebc878a', '23CBD2EEAE36EADB84872D1730BDDAA4', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:03:40', 0, '2018-01-10 14:34:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('80c2be5afe4f4ca5a791791bc31a4d7c', '23D491FF2CCCA9FC362B16EFCCC67258', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 11:37:37', 0, '2017-12-27 11:56:49', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('811ae2276670411e99c07b4e5ab07730', '8C407D843F2B8BA0ACFBD422D1CA0CB9', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:32:32', 0, '2018-01-10 09:03:27', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8120baee3e1c4531968d5bdba5f69ba6', '3FCF8CA564BB8F6E44184C8F2FE04BB2', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:31:30', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8133fbc223c348c885422dff043c89c4', '62369B15D079348F1051E985258C5986', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:29:56', 0, '2017-11-07 14:36:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('815af06ada4a4fdaaee9c5bef794c331', '61E44C8B075F9CCC1FE31386F76558AB', 'W02030', '杨卫东', '10.55.148.68', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 10:29:36', 0, '2018-01-10 10:38:48', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('815c529e2a6449b0adef1108e8f06dec', '9DEDD9CC215A558ABF20F7789638DED8', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:32:53', 0, '2017-12-27 16:10:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('81604f912f2a43bfad65e3c1ab99175d', '7C01AEB1C9E8555A1772226F33355CA1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:32:55', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8190ab33b3534bfabe6f96ed7e3607de', 'F46DD9E16CF0C3D252056AF7696269A5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 09:56:06', 0, '2017-12-23 09:59:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8197da35c6de482787c7874f4ea68d1e', '0571967DCF414B0E31D158E9B608097F', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:52:49', 0, '2017-12-28 12:23:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('81b6d3c054b245528ae8a1c01d32f28c', 'F470D84B30D1EEC8B16D8E9B30FC558E', 'Y08204', '王利培', '10.55.148.137', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:03:48', 0, '2018-01-10 15:45:23', '25f0fd10490349b9941f8325c1fc8488'); +INSERT INTO `jcdp_sys_session` VALUES ('81c91a7f3e8e44bf9a6988856e6ad157', '18928A87AC9F5B14540FEF4FF581BF92', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:19:05', 0, '2017-11-06 18:20:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('81d09e8bfd844558ba9d2199b1e31391', 'DC19C5B8520F4590DE38F556E687AF3D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 15:30:41', 0, '2017-11-18 15:53:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8200a0ac70ec4e6381bc703e0731ef1f', 'FCC8D9888E4FB99DB390841DB0B07907', 'W07427', '刘聪', '10.55.148.148', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:36:43', 0, '2018-01-09 16:49:11', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('82084b8a2c41497f9c8abe1a9065fba8', '8A98E35B4D784D9D1FC0807E7BC51859', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 20:24:30', 0, '2017-11-10 20:27:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('82112056ba004555b8470d42e7d54cf6', 'FBC4DB57D5D56F8C80BB2D803A9B9FCE', 'W07675', '马成', '10.55.148.200', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:04:43', 1, NULL, '521d08563ab74b8188599be180575bcb'); +INSERT INTO `jcdp_sys_session` VALUES ('82248468f3f3400ca3cc6b12f363823a', 'CEC75980C1CB7A309B5459691D198986', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:01:51', 0, '2017-11-07 14:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8243624f388b4ea288b7e6ae69492b7b', '45685125B0D4E03D68C72F4EBCA735EF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 09:16:15', 0, '2017-12-23 09:16:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8255462173c3468b8db30f6c8dcbbb0b', '9D94CF909995FBB6FC64D25BC44E98BF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:31:59', 0, '2017-12-23 11:33:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8275127a5a26471ba520d3acaff969d9', '0A1DABF02954746F5D404C0551668F4D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 09:17:24', 0, '2017-11-18 09:50:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8275637340fd4124b65ea05c4ed37f22', 'CEF873ED7764AC2369FD75EB826B7910', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 16:11:41', 0, '2018-01-02 16:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('827b56ff58694519bac5bd4de0e4c04b', 'CDE17FC30A9F8F472083A9E9C4426C1D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-02 07:57:14', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('82863bd9f13549808c0aaa536e920466', 'E3997EBFE9E9C8BB4D55730B70A4A66F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:20:10', 0, '2017-12-28 18:20:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('82b08fca292e46e0a108b40dd836eeaf', '60E964B80605544B7D8A05D9ED25E1A0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:13:56', 0, '2017-11-08 19:17:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('82b96a669d08444ab08dc2fd41f4a085', '51BF8CD09749160DADA4EA4CA6E8FD19', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-12 08:18:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('82e5578de915450d97201e21affe213e', '1B97493D03836F746051B7D9922399DB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:54:43', 0, '2017-11-17 17:58:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('82f8041fec614537be1ba5d8e164c5b9', '00071340490D406685F13D9FCCE17FAD', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 14:52:07', 1, NULL, 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('82f943fcbfe54338817b395fcd4e7ddf', '0A6AD104107B06D15DDB25278B2D4112', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:22:33', 0, '2018-01-17 18:28:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8300534fa1b44e2db33faec9bc2559ee', '4BF0E18F60B9FB429669CA8994308ACD', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 14:30:48', 0, '2017-12-14 17:38:23', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('8304c03b2f164026b47c79d00af6febf', 'AAD250062EE7DE36AB3858A7A676E39B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:08', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8309f5b36b7b4e5494d586112dbbd7ed', 'BF08763AE06D21102F1BC2C60DEDC68C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:29:28', 0, '2017-11-09 11:31:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('833142dc497844c4a7a1ff5ddac10444', 'AB2066797D0CD3BD010727A1D83CE64C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:49:58', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('83382b907b13474084557d761c70fa86', '9D6C58FADA18918EDD752D081B5EEE7F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:13:51', 0, '2017-11-06 16:15:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8361d1170fbf4c889336e26b19f3040e', '32FD99DE13E22D6A96B245DAE0DAF30F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:15:56', 0, '2018-01-16 17:20:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('836448eba339405eb67335c976261b6c', '0FCC55F5FD2079CBDD4BFCFF866E62FF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:11:35', 0, '2017-11-29 10:27:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8388305c483d442d84e5e05fc7a618a2', '1A0CAC8132BAB8BC2E4E94D28EF6473B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:51', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('83a39f5dcfc54e58b428fd1597b9a4a1', '5FD33A70A2A37F0810ED8702C5C507F8', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 10:58:53', 0, '2018-01-10 11:26:21', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('83a925c817b74421bf65e74ab38e7d3f', '6439ED3009FC45296BB73380046C40CB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 12:22:55', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('83abede709b6411a9b21c8db85a553cc', 'E284573B3695E4CFCCFC482673AD6BE4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:47:02', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('83b1a9df045a4d30879c73e9d3b2fc3d', '88558787D1B9907DAFAE5F2BE7BC64A1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:00:45', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('83b71e41c9564c88bbe7c9bea723a531', '587966D38887C70EBF8924F702FF8F4C', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 16:10:29', 0, '2017-12-22 18:14:12', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('83df766455a4433b9d784bd777386a48', '269871B47AA916ABE68517B79FDA766C', 'admin', '超级管理员', '10.211.55.2', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', '10.211.55.5:8080', '2017-11-10 09:07:09', 0, '2017-11-10 09:07:16', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('83e747881770464ca9dccf345698fe39', '82761CE65F3992E826E1B1A834A61870', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 15:05:18', 0, '2017-11-16 15:15:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8402fcdb787e43eeba0d52b587d973e6', '045E62F0D53BD19D956A6BA62DCF2CB4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 11:37:52', 0, '2017-12-11 11:42:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8405f59430ba48ebba92f54f8603caaa', '70016B27F5B1105F264DDEC0DA43E422', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 10:46:08', 0, '2017-12-11 10:58:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8406004ba1024e37acaecf1b5b5afbf3', '4026CFC075514A7629497F8F8A7DAEA0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 14:12:43', 0, '2017-11-16 14:15:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('84227daddd804c3bb94ce68522ab3f2e', '2D03E5EA385F7F8AB7451BD5E51E711A', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:59:01', 0, '2018-01-09 18:00:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('842bfcb8dc98420a8876c28028272ac0', '44643BA721EEC273BEF55A4EE011A3DB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 10:03:45', 0, '2017-11-18 10:19:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('843c5861ff5f48479ce99e9636f7a2f6', '8643B2500B709A03D3048312129FED6F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 14:41:43', 0, '2017-11-25 14:42:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('843f5a3263d4411cbe94181782287348', 'B6FE7BC2533DB0FDEC34231442F6B41B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:59:11', 0, '2018-01-10 17:02:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('846769d8bbc942c99d0801dc6d15208b', '1390EFADF20FB882BEEC29F3E109EBCE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 17:21:48', 0, '2018-01-17 17:27:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('847c69a07c744a2294923545a3ab8da6', '835785D9D4FB7CCCC3731A6B1C59C197', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 16:13:53', 0, '2017-11-25 16:16:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('848eb8a765ce4ee1a0e61cae1140cb0f', 'AA705974796F84C0B9F9ECBF89802FCA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:34:10', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('84a415c241454ac3a7f48cd99990423d', 'AF3D96F1EA3F423A17A81861CF79D4EA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:41', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('84ab38fb35af41aa822e130600ae2d05', '174999626D319B6F467286112A492867', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:13:05', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('84af4cf61e994d31bf2d2034d8a4976d', '85D9CA992324E3C9AE2620A019F4D88A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 15:00:08', 0, '2017-11-17 15:03:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('84cdadac2eb947d1860a3cf141269615', 'E5D9C28AC00BA626FF98EE175E28D779', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 19:13:07', 0, '2017-11-16 19:43:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8504f1c20c7841c8bb821f603feda7e7', '089EEB3A69813B7C607ABF1DCC274698', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', 'localhost:8080', '2018-01-02 20:05:08', 0, '2018-01-02 20:30:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('85560f543d0d4f58b3974d72eb409131', 'F5B1E445CB460FE88E4C8395FB6989A3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 17:25:41', 0, '2017-12-19 17:28:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('856bda38837b4d2cb14deedfec6a096f', '2909CC6630EC57FA381EDDFFFF10DBFA', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:19:52', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('856fac788981468cbd62e087273c7344', 'A04B982D1F6811D40E8427FD2F148941', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:54', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('856fbdf6e4574f4db59a5e83a6588bcb', '98509A52690ED6949F7B93CA77E83ED1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 11:40:44', 0, '2018-01-05 11:45:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('85a067b4a0274917984ba14e5c97f4fa', '569274F0FDF509FED0FB0D0D4A02DEEC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:25:19', 0, '2017-11-17 11:34:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('85b23e13a23b48a8ab4e9955ce15017b', '5CDD863C5D4F00D4DB0CF29FE1916021', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:40:36', 0, '2017-11-24 19:33:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('85ca34855c504ec19862e534d63540f4', 'DDDC46667874E53463AD486EE81BAD8A', 'Y06216', '牛立栋', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 14:33:08', 0, '2017-11-27 15:06:36', 'b304903b0f0a451bb44685a898508369'); +INSERT INTO `jcdp_sys_session` VALUES ('85cc58c43c03469fb5a8cbb888d4a247', '7812F91EEF37311C040336025B7D39B8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:56', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8627c566e5f3430db61594aaffeb141c', '0F30FB090389F2338C68D9DEAD36B7C3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:49', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('863c6a88797540269be112c8f17cdb76', '26A6A18CED040721D8C9F7955177C7CA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:16:21', 0, '2017-12-12 14:18:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('863f51cf8406467b8a3e45b8dcf56a8f', '48B4FD52916EAF310335A55B8D87FA5E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:09:28', 0, '2018-01-02 11:10:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('865dfb17d29c4388b97d1b8c2eebed1e', 'BD32AE29D86FFAA54BD8F6AEDB5902C2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 19:18:29', 0, '2017-12-20 19:30:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8666e9f6f3754f2aaf8db62d6ac76bcf', '688A01333CE857FF374AFCDC76861558', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:56:20', 0, '2018-01-10 14:27:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8668793d657e4fc6a0dfbcf38f3f1dbf', 'B42EFB8EBDB74D1C8C3B1CBC4B9189F8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 19:22:29', 0, '2017-11-23 08:24:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8668de772c1341d4952affa7ff3c076a', 'ADB13A1540FFB2814355F209A5412EDF', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-04 17:27:38', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('866b4e85bf78445b83cf87367243915d', '8DB360DA489A2C32C9F0A333891C1628', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 18:36:24', 0, '2017-11-22 18:40:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('867953ffee724724bba4e038453519e6', 'F8E354830DD2CC883BF33C95739F6989', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 08:37:41', 0, '2017-12-27 08:38:48', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('86947ad34c7b40cb9859ba7cd0135e96', '8B1F57445BAD70ECEDFE29E943EC4957', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 16:41:00', 0, '2017-12-19 16:46:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('86a091afe51a46a6aca4ceaec801d4c5', '53F63C8C108CE2D1AEC9B22F7D81B1AD', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:42:04', 0, '2017-12-28 11:43:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('86b9e1af0c1c42bbb827001304a14635', 'B68DF85E17C0B14D5487140ADEE0B5A6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 17:38:55', 0, '2017-11-08 17:48:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('86bb441c63bc419c9bb28083f475992c', 'E11E8E5CAAA20B9D31650423C8511B73', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 17:50:42', 0, '2017-12-26 17:50:44', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('86c62f77c6af4d418304e4930626e7be', '338F62BF6779906D8DA3B51CB84FB960', 'admin', '超级管理员', '106.117.98.0', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', '39.106.113.161:80', '2017-12-08 21:24:08', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('86d284a3a81246b9bc37557305cbf742', '0C77566869B6B7E291D3B0A596FD7738', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 19:40:26', 0, '2017-12-19 19:48:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('86d83bb02b634b8ba20c2393b992bf3e', '6B425B9F18FBE7C9D0E01E083A1FCBA8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 11:19:13', 0, '2017-12-20 11:31:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('86fc3a5722bb4f1bbc51e2b352719f5c', 'E3BFA8D910E136172A9A6B98A30928A7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:53:29', 0, '2018-01-17 15:59:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('86fc4d6e5d3b404995664bde04954bed', 'ED61880250A87F2BCD4B2CB05D6A088F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 09:05:32', 0, '2017-12-19 09:18:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87128696d971450fa19745fe4399a209', 'EF572586534AF0CAF0C15423C8D9EB9D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:10', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87238fb565b14a7b8b1e1fa1f891c065', 'B7F8834238BCD7B1DBED5E03A72E1E0F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:06:33', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('876589af579640a5bb6594b52ebc8854', 'D45C6D061BD3059CF2B078D11F29B4F0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:19:23', 0, '2017-11-06 18:20:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8767de4943ff4d3780f069e692ba6be7', 'E80D7211A68B121E70FA5732367EABB4', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:40:19', 0, '2018-01-09 17:44:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('877103284cbb4589837dbdf5b49d2c05', '2B6BD6B533A4F45C952ACD482A3703A9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:14:44', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8773f47e71a546e3af9b00ab1edf6368', '8253599AD1FA4D4A6FCF32FEDDEA3CAB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 19:20:33', 0, '2017-12-20 19:30:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87a415c74ba44c6e8f3bf60851f03ec5', '557CA36175816634D593B9E18A0FA22D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:33:17', 0, '2017-11-24 16:43:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87c56a93713241d4b0aba6edf8ae9d9e', '316F10BA12942287A59754F3307B19D9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:21:56', 0, '2017-11-17 17:29:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87ccca8f42084130ac8ba085b4ddd6ba', '2A862373F424AAB7A8403C9EF3F662FC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:53:46', 0, '2017-11-29 10:59:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87d00424dd3b490f881fea591009535f', 'ED552C74E41E6FF42310718A9C3B0C25', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 11:01:38', 0, '2018-01-17 11:11:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87d2689cdc23457699794c1ab55bfdc8', 'A4F40786E81C7C6DFD4511FFB0DF3A54', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:39:44', 0, '2017-11-08 14:41:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87e75ecb305f49199bf03410f796676b', 'A39F8D077FAEAB73D01BAE5448D5E1EB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 15:59:01', 0, '2017-11-29 16:23:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('87f4b0846d384d9d8b5a5586a55dc2bd', '528204BA28E7DE9E151632E8B89515B4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 15:44:42', 0, '2017-11-16 15:51:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8819a2120ba94e6ea8bede52bab14c3d', 'F21BDB9F10B2590E056C9B303333DDDB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:19:34', 0, '2017-11-23 18:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8825480ee434434db4afdfb1e37ab6ed', '6E1E7A6819B4C794BC5E24B43ECF5EF3', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 17:29:52', 0, '2017-11-29 17:31:52', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('884b97230dea46afaff22caefdb3f6ac', 'FFB43E68502074B8971AE80E76CEF2DF', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:09:49', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('88544d7b215d4f0e8a21f8108f7a0d72', '8BA12B5DD24E1C681089FCD354B21CC7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-20 10:57:36', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8862b6a0778241c9acf44567eb9243d8', '977E1E0CD35C8486716EE999AE9212E3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:51:25', 0, '2017-12-23 10:53:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8863fe2a8b0f4a99966026ca7860069b', '2C59DA624F22827CBAF74833790DFABE', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:45:09', 0, '2017-12-27 16:46:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('88740cc5a9d1484e991f8ebd684cad80', '5E888A978935A93AD5A90AB5566A6E2B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'localhost:8080', '2018-04-27 09:29:57', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8882f8f961b14a76afe5219033392906', '05985355B7FAB6166C5038A3C27093A6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:37:58', 0, '2017-12-28 18:38:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('88b2fdedec5c40059e49ec9869f8b73f', 'F77FF6C3E8BE0A55256B79E0EC58FC7D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 16:37:56', 0, '2017-11-16 16:56:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('88b7762f5fd64f859862301b87eb4daf', 'D887FDE8463C322B0F78A872664752F0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-25 10:20:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('88d86cd94bc6427395f8427bd4ee4b58', 'D6372D16A92675FC7B75C8D815CCF852', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-19 08:07:41', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('88d9dbfb47a54905b08ffd72ecf24fef', 'FBCAFDE345CE7B02B764611CFCD80F06', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:25:50', 0, '2017-12-27 15:56:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8948ab8c8bd248569434792c45da9f6b', '7071B25DAC3F585F006EF570B08066CD', 'Y06216', '牛立栋', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 14:48:57', 0, '2017-11-27 14:50:20', 'b304903b0f0a451bb44685a898508369'); +INSERT INTO `jcdp_sys_session` VALUES ('8965d4a15dbd4b168cf30cd25a92353d', '2969E0B13C1B83D6672AB89F6A6037F2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 11:14:09', 0, '2017-12-11 11:42:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('896a3b8f09d74d37a33807c71ce5328b', '33D8373951A7E154D38B1B5A9A311F32', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0', 'localhost:8080', '2017-08-22 15:14:23', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8979201543a64c7e928031e4a11c94e9', '07CB9F9D08AEB1809E90D996DC9AF97E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:56', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('897c5065ee0c4e5ca86998810afb5721', 'B5F7C13E1C85FE0236C215024FE5349F', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:26:52', 0, '2017-12-28 11:58:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('898be395469642518d28046908521df5', 'B18A88CBFB2EAD7B3068679383D3E421', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 14:49:36', 0, '2017-12-25 14:55:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('89a0059d5199434d9fe690da90a7a69c', '3C395511FF5C2DDFC8832B88FD77E0CA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:30:30', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('89bfe12c69184a919dd1f9b16fbc3705', '6E814F68C07D7F9EE05EB3F6AE44ACA6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 17:26:29', 0, '2017-12-25 17:29:35', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('89ce693b8864455fb4939e2bc2b26204', '262D4D7966318B275D5EC59C037CCF52', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 15:12:34', 0, '2017-12-12 15:15:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('89e21c491d0a42beb9c55237911fe31b', '4CD79AACC980682DA996E9C7EC7E3993', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 16:39:47', 0, '2018-01-16 16:40:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('89fd34c9928f4109856e43db7e3cc373', '66C214B11F9DCEEBE4B119414A845E0C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:43:58', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8a05916dcdd94da0a694b2ea9b03edd6', 'B1EDAEB73477380CB5A1A61633895BD3', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:47:48', 0, '2017-12-27 15:47:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8a19bef802f04d1baf0fbed78754e5af', '57671D064AACE6467638084A1672D0B3', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:58:33', 0, '2018-01-10 17:02:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8a2e0954f27e4fd2a556781661bc53df', '80D3B02CDC51832ED771E7637C3CF904', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:53:40', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8a40dcc735d44c28b2401cda109083a9', 'AB6441ADFAB8FC663934680CDA59679C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:21:43', 0, '2017-12-22 17:24:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8a68ce8cc4cb4a8894bb1262f22cb6b1', '3958B508ED259030F45E43A571D0F7D0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 16:17:55', 0, '2017-12-09 16:20:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8a6d9e601aa543d6aae1ad8555f19f24', 'DA1A71DE83CA91C04DD50B97A6182215', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 14:48:04', 0, '2017-12-29 15:37:13', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8a866229efb54d63b0b8ea2d2f1c69f2', '6BD19494FE33CF21074CB1CC6ACC97B3', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 18:48:35', 0, '2018-01-04 18:57:13', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('8a8dcfb38c9f4eda8111e6f8e52329b1', '750902A9A4A00D6AC907DFFA0A129C01', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 16:39:47', 0, '2018-01-04 16:47:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8ac4511b476c4c0d898914e436661555', 'C3A1924A90A0FFA8AF683D2ACA508629', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-19 16:40:31', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8ac4a71d27654e768c7cd5c7f4eaabf5', '122008D4A7096133543A61F5CA2B0412', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:08:32', 0, '2017-11-17 14:10:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8aca65b9e2234d2999172cf9983cfa7a', '28C58DE020FAA9AFE56CFC8B11018512', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 11:29:49', 0, '2017-11-24 11:58:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8ad44470c3a143dd816317e9355d96e2', 'A4062FE743E879AFC025E0F22F606526', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 10:44:55', 0, '2017-12-14 12:58:32', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('8ad5df75ec7140d1a50378c98909b9e8', 'B2404B02AED43E232C6879E2AA699457', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 16:20:13', 0, '2017-12-26 16:51:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8ada4017c8d94509bcfdd6d25a7f6ccf', 'B5A4A324648B591E42B8791D6C51C911', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:24:18', 0, '2018-01-17 16:25:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8aefdf0cf7c84b34b3a2c5f661eb2baa', '8CE3D20A4AED488B3A7BEAC84F9B4ADE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:44:53', 0, '2017-11-09 12:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8af5c73b3d704289b08d5f19fe46f7ba', '0053AC656E91594CB7C3365A66F98160', 'Y11014', '程英涛', '10.55.148.151', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:57:29', 0, '2018-01-10 18:22:24', 'd9074901d5934613ae09ebb1835f3b1e'); +INSERT INTO `jcdp_sys_session` VALUES ('8afacf388d894177b148601aedecce99', '4DB0F55EE5F239619C0CA1A9464BF691', 'Y08066', '靳晓松', '10.211.55.2', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', '10.211.55.5:8080', '2017-11-10 20:27:08', 0, '2017-11-10 20:27:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b002be9691d4fde9cf5333ab433c1e2', '99303FE7FCE5CFDB31E76959D9DA13B4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-10-31 16:03:52', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8b05154b3fb546fdb7084fbe1393741f', 'A34C6E16CB0411A5A880E4E9B4A7893B', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:48:13', 0, '2017-12-12 20:00:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b07cb171b0c435b8f307f7399505ea6', 'C9ECF3FA155C9118B59BB5C2E728113F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 19:37:43', 0, '2017-11-17 19:53:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b1a17b8339b4755a83b45f58c84d8de', 'CA700CC08F985695A3E57D2916BA6FBB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:13:05', 0, '2017-11-17 14:14:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b1b3aaef6574112ae524d633b6efe6d', '6519899410B0DAEE2D8A6855AA07A86A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 16:02:07', 0, '2017-11-09 16:16:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b643b8880714da59d65ebcb2e366715', '6558CB15B471F0DB06EE46762B0E3BF6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-21 08:27:47', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8b69fa4961c0469cb271607a97c88d60', '5A1BFF630D5A61520D75B07359BC196F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:08', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b75312f157e4fbfbd2a82b5576b689b', '0F8D2F463D224E300BBB5459142F32D8', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 11:53:53', 0, '2017-12-17 12:27:52', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('8b75fc1f7c044e3c9ecf916f26925740', '09FF66AFA93DF916F04A5130DE2645E2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:25:03', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b8ba867d826493087c2187288148548', '7B99E1EBC3B86896BC513556EDF6D4F0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 19:07:05', 0, '2017-12-20 19:30:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b8bbc7943594992bbf9d3353ca2d5e2', 'DFF1D2776957E420E3D5B178E6A6528E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 12:01:10', 0, '2017-12-11 12:03:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8b9568136270431ea90a88476869951d', 'D5D7BC711275D092A6889ECD1A8F2380', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:41', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8bc1406588624c1ea11fb60b528c34c8', '301F1AD5F656E30B9CB86EE8125DA88D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 15:35:56', 0, '2017-11-21 15:37:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8bd788eabfae480f962dc0b4be6726f9', '2F568EC088AD530C5D4DF935A9B7F8DB', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:30:33', 0, '2018-01-10 16:32:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8bdb687fef944351a7c32a7afeed5581', '0B4643C15DF3D4C23CA7FBC80DF3E836', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:01', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8be2a69a1aa14786b28a413657ac872e', 'AD2CCBEE40AD1CDFB260A7DBD70A4586', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:02:35', 0, '2017-12-25 09:02:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8beb3e2fe09f46fa9093905e80a06909', 'A4495223F86B649E581CE9FA18F8441A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:35', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8becd79dbe7846818e22a1ca07686047', '5F77FDF4E11E06C360DA307160D44199', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-16 16:13:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8beff5e498e14bb2bb760da9405d800b', '9F74301CF39F9E734C860CA9703CB4E9', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 17:12:24', 0, '2017-12-28 17:18:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8c00b97533b24cabafecc8511394630d', '5F068310444CE9951BBB03048FC2BC8E', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:02:58', 0, '2018-01-02 09:20:53', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('8c21f97ad6cc44889d699eefcdca98c9', '450B8F2C5BE9011D53B5976EB8768413', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 09:00:47', 0, '2018-01-03 09:06:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8c31dbf11b0f43df92c5642d73d5de90', '4590B26F4E991A481469A629E72E2A23', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:23', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8c32ce7631234048a2a2a09de451902a', 'C37FA33674DDCD6BA341074EC0DBD8A5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-14 09:01:16', 0, '2017-11-14 09:03:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8c32f61d8d3e4f6690bd3979dd9fb2e8', '3F660CD1005473CFB852658DCEBB0BD3', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:55:19', 0, '2018-01-10 14:26:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8c4890cb94644c88868730e2da43f29f', '94E110895318DEEB398343FBD829DC6E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-26 08:57:56', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8c5e46a6d5e140c4a2b9482d6d5f5515', 'A26643D1CA97A8E2B9A1237A71A8A7DE', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:53:50', 0, '2018-01-10 15:02:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8c763331475f471691704f8ba3b48560', '929E1527D777E2868FD620E9973E7C0A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 12:16:30', 0, '2017-12-17 12:28:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8ca0a269f4e04666bd4864ef2db5348e', 'DF0A1A5A3776683AA9F679B7E9830AC4', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:28:54', 0, '2018-01-09 14:29:42', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('8ccef97426c34870b005621152c2caa2', '04C2D8C0733F7011C097A8D56127F88A', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:16:57', 0, '2018-01-10 14:47:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8cd37d0ae85d492b8f71a9b122e88de3', '7444F84F541D0292060F5C602D3EDCBB', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:28:29', 0, '2018-01-09 17:30:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8cd5aeb02f1146a3b698f738a1f052be', '2FFD6C0FE4B96B0530F95DCA074535E2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', 'localhost:8080', '2017-11-06 16:08:01', 0, '2017-11-06 16:09:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8cec5f0b9c6a4356881c8fc131aba04a', '97A6AF13FAA4C5F218CB83D8B96FE0BE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:38', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8cfe67be2b764f41bd5c2f6191996476', '13B8B7FC0CA446703D7CDCC553E88E40', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 09:07:09', 0, '2017-11-23 09:19:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d0d0f4636574f55b951f3ce6384f63d', 'BDEDE299E129E0EC82346CE9B9E89397', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 18:56:24', 0, '2017-12-19 19:10:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d29c5994cc04463906b68a8c90fc013', '65F0A26D1A54CB7C113808CB22719FCD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:53:26', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d2b79e6df904b0b8390445fd271734b', '76EF3B6DEBE59211A7DE31AE9C1B4E90', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 09:52:45', 0, '2017-11-17 09:56:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d46c03d46874afab60fa647ce351169', '49900D39F8C74AAE918E353D67E4D1A0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 14:46:13', 0, '2018-01-03 14:52:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d4ca410f4e547d293ccf5ccd0f237b0', 'B1700E4DD8E45EBB1EFEE824A6B3C156', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:21', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d4eeb8711d5428c8ff0833b70894e5a', 'C0F810D23F7918F662D8B9BAAF44A23E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 17:08:53', 0, '2018-01-02 17:25:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d4f78e3e6b54a3d85cdac0dcea9803d', 'C6069C031511EBF962282AC07519D41D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:15', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d50cb566bbc43e79ef37ab5c1922fd8', '77D8A61699E7E27C6A5EB2EFDF4958B1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-02 11:57:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8d5d1cf1d92748aeb61e414e9b83699c', '610975612CEF5D3EF9DC07C7C01C7EFA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:19:35', 0, '2018-01-17 16:25:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d6bcefaa25944d5b90a4e13e1572c03', '8FBB514C7F38F5A671493EA5A99C1C03', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:52:32', 0, '2017-11-23 15:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8d7212db0c3d46ebac7abdbda3b75b18', 'D5F0EFB391FD98E56491CD4B0145EF57', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-29 14:52:04', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8d77d4405fb846fa9c19ee00c4195f27', '43EB7BB263C096126E035DFB9D2DA849', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 17:20:00', 0, '2017-11-27 17:52:01', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('8d786c3984d44d3fb50404a07330efb1', '1B21A452D508D4C070D2B98C9EB9D81E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:36:12', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8d7e6e5ca77648e6a9de35edb40b06f7', 'DF400577FB15ABBCEE6E853E6160F021', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:06:33', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8dc5783c2c3a44cb974a3aab9077b721', 'C806C29047459BDEC0E9DD863C96C2E6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:48', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8dcb9a4e11b14e4fa7fcfaf1597a220d', 'E031F16E2E67594D94F19A8E12748996', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:23:36', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8dd42cdeb59c462984dc450f7fa46c04', 'A91FA2AD0BD0CDC04C05BE7AAB586860', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:09:14', 0, '2017-12-22 18:09:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8de586490a86422ba78d41b802b8aa0d', 'E477FB47003B6A07C529FC13554C5202', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 16:25:31', 0, '2017-11-07 16:27:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8de9b124550a42bc941c5d98fdc7d479', 'BD5D3A7F2E48AB4AE83D602D82387CC3', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 15:03:20', 0, '2017-12-23 15:45:53', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8dec3d3fb5a94597b8f65dc58348ca5b', '777B08086C7286C913652D2F2D10DCBE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:03:33', 0, '2017-12-18 10:05:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8dee3615f5674b64ac8c650864748a26', '778751FB5AF4FCA453D732CCF0575F2A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-17 09:15:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8e03f45267974679af2f16bc9a860d02', '31D97EDC2F063470D4528BE77E62EF84', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-29 14:46:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8e0997e3735549369bf4592a6be295ad', '06D71E921332FED101DB0B74D889E6F0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:50:42', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8e65193233a84b87affdb1add22be1f9', '1A76EDB40B1A143596B9B1509B6D89BC', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:18:27', 0, '2017-12-12 19:21:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8e78f58ed208472abb5841db3fee6d40', '9B83EFBFE9BB4B22BD0E15C733C35D7E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 15:27:08', 0, '2017-11-24 15:34:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8e87a9d8afae41dd86d456f665cfc9b4', 'A631A56475F17D495FE36E4D1B4ACAE0', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 17:42:06', 0, '2017-12-25 18:14:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8ec2d547525741ecbb8a8fdd754ba5dd', 'C761F879D818D68739F70F4D1BDD25CB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:18', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8eccfa1d94bc4bef9be07353ecb4cef1', '54E5CF111CF2CD67B0913F9372C71144', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:39:49', 0, '2017-11-08 14:41:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8ecf9abb81974a13948586b46039616d', '7BCE9D0F1DB4031689D6A80A22A2D058', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:21:06', 0, '2017-11-06 18:23:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8f0ac91c9abf4b008947958e7c52b572', 'C087F2DE1447B5AAF34D697FBFAF2BAC', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 15:29:37', 0, '2017-11-22 15:39:55', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('8f4d29122b414e71a48e0624914d14bc', '9AF7A8A6BBCD1AE9792D518A6FFE36E3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:04', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8f554600e3d94f608d8c6e5b9e3b63f0', '2902EE6F70D3A076338905FE03472297', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 17:32:47', 0, '2017-11-21 17:39:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8f581cb36ef7444db8322f525b40a8a9', '51D099CE6AFA79BFB17766B320CF3AFB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 14:42:10', 0, '2017-11-25 14:42:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8f650403d0104c78a648b55d795cda3b', '6C69A9D26133E9FD47FE17E074E21EFA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 16:09:54', 0, '2017-12-09 16:12:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8f722bdccafc4ab29355d2c239875ad3', 'F799F4C147C6BC55AB463F3AB994F126', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:48:26', 0, '2017-12-29 09:25:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8fb2273d1cf144fc9e79ebd0e2a82fba', '2AC52081E829BE5735F7BACC310E5558', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 18:58:20', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8fb25ef93b3041eab8937ac9c510e73b', '06D0527ACDEFC6180614AEA45DE35896', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 16:52:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('8fb4468cfccd4618b2c9b64c0a093044', 'F3CC9BB2F286D2F36398385F60F1620E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:06:50', 0, '2017-12-28 16:39:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8fb447eb823a4d138d6ecae92d9aa06d', 'E85D380F45F5E1C2CD30864E2EF93BE1', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:16:33', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8fca021d15e14917bfc1e0d424fd2015', 'BAD642CC377296D2B61DB995A31AF32F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:16:11', 0, '2017-11-23 10:20:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8fca8b3ed1644c45833f2a8ff40660ac', '938BDCBBEF8BE43419E9874FDC95353F', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 19:10:09', 0, '2018-01-04 19:19:13', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('8fce35c5e61c45ac9a159aa629c9ce00', '0708D6B055E7C9FC8A7EFC3DCB48FFD4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 15:59:51', 0, '2018-01-05 16:04:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8fdb686cc81a438eb900df91f48dcfdc', 'CD136B17FB85084359421ACD482452D2', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 18:54:17', 0, '2017-12-12 18:55:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8ff17b6677af47a9aa1cf72353885ff9', 'C1F1580C8400ACF54539317461E51EFE', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 14:06:56', 0, '2017-12-22 16:50:12', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('8ff32e0a8788418aad98c8263de58882', 'CA163A871909B63F49E63213D7920B16', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 10:15:39', 0, '2017-11-18 10:19:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('8ff4f216185e4c80ab433d1e1dd14cd8', '12D024775C210209D5B15FCF9A46B76E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:36:01', 0, '2017-11-23 14:46:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('900925e3537e492286a039c2576e85fc', 'F7A62A5780D586AE9A3AE24D8C85E328', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:20', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('900f97ff6357497ca1156a237232bd95', '552F4DF349EE219DAB5ABDCC096FB485', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 14:43:17', 0, '2017-11-21 14:46:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9019af854718420e8304986eee649960', '31A4D58C3172B03A081C6539B118F18C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 19:05:09', 0, '2017-12-19 19:10:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('901b27df26f044369205ad297073f99f', '11F6BEBCF6350D23BA4B0A6968F1A1CA', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 08:46:25', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9029a5a6dc894ca0bd455232e0945025', 'CB179A33786E96B131ABAD1017748C58', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:37:09', 0, '2017-11-23 14:46:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('903a15c6924441ea9dfd070bd6fa2cad', '1EE1D6666DB13A38ABFDDC1BAF202CD3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:15:00', 0, '2017-11-06 18:16:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('906e9cebf9f949b69b6d486406be30a8', '97E011A4AB8113B979F491C9314B07CA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:01:37', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9091e9cbaf354a48a531d9d54424e32d', 'B05CAC9CA9077DF0135CA8300E3E7EB8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:17:19', 0, '2017-11-29 10:27:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('90ba346dab164899a1105741b85d2934', '51BF50594B574BC1188A4916801478C0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 19:38:02', 0, '2017-11-16 19:43:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('90bedb07a5474c298a856d800e62ec3c', '0CE49377C0DEB80B3CAB69E9AB666DF4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:49:34', 0, '2017-11-29 10:53:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('90cdb5123bcd487abdb927030c4d2614', 'DFF0E47DB212593E9C9BD2DB7780F575', 'Y06216', '牛立栋', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 14:15:41', 0, '2017-11-27 14:47:30', 'b304903b0f0a451bb44685a898508369'); +INSERT INTO `jcdp_sys_session` VALUES ('90e002d2b77848a784fc7929b6d1d79a', '9AC57A2D0F49AD139BF2034081891EAA', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 08:32:27', 0, '2017-12-26 09:09:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('90f0733550444edb8cef4cdc6089a859', '26E0F531DFCE5BCF9E254CFA79BCDD43', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 16:56:47', 0, '2017-12-20 16:58:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9129413ecdf749e18cf13fb6e913c909', '6EFC7C899BEADC7DD9125AD4506DFC8E', 'Y10027', '辛长平', '10.55.148.140', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:08:28', 0, '2018-01-10 11:26:21', 'b497ab9b01c74a93b6ee7f079a356070'); +INSERT INTO `jcdp_sys_session` VALUES ('9135d25b65614459b04188beaa3f7d89', 'E175FC37E49C10C20949EA14C8C9038A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 19:29:43', 0, '2017-12-27 19:30:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('913d25d3e0824f7ab607bc047d2bf4bd', 'C5FC2EE203BF0794B0E35DE64BF2B815', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:51', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9145ace3ea9b453f8dcd52d0bc72f052', 'C4461934171E2EC21054E7AAFC5D92A0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 10:31:28', 0, '2017-12-13 10:35:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('91750bb11f7f44f1bccbdb9962ea5348', '4F92E3C1C53F02834546CCAF33A13364', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:03', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('91805c406b3942dd980c87d34772abc9', '6B29786080E4A8BBD7C7E39C69FE2CBD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:37', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('918215f40e484978b24d6f98338871d2', 'E393A00FDA5671DF4F17C89B6849E3F0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 09:43:09', 0, '2018-01-03 10:19:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9192130a364d4ef8913151831f167d53', '9EA4D5EE57CC445573F77D808C4A1322', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 16:16:05', 0, '2017-12-15 16:16:16', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('91c815a9673b4c0c98b8b6957d553cc9', '7AEC8E594E946E83594B08FD53EAC7A8', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 16:14:21', 0, '2017-11-22 16:53:58', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('91c9b8df0b904fca8c599fa2edd46a61', '846DC7F7A505291B670ABD189850A8CE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:02', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('91e0c87f689f4f12ba500b3cee5a2309', '59C1FFB1EA6510CA8057D4F7FF6D2300', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:07:18', 0, '2018-01-17 18:15:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('91e20fca55bd40b8b0a68bf8cd73076e', '729CC18E8118EF896701FC8EC10B7DEE', 'Y11014', '程英涛', '10.55.148.151', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:53:37', 0, '2018-01-09 18:12:20', 'd9074901d5934613ae09ebb1835f3b1e'); +INSERT INTO `jcdp_sys_session` VALUES ('920caf1d0f92455c8122a67b38b0078a', '3461C0E9BC065BC3B123FCC3E4B1725B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 18:51:23', 0, '2018-01-09 18:56:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92107895ca1b45388f7d6a43d5bdf81e', '99EC00E0490AD5340374F190F3ECA4BB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:35', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('925b2c61cdfd4e0ba7c8b54529aef7b6', '992F9A548F991312E804E16C47C33641', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 14:13:50', 0, '2017-11-27 14:14:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('926dfcb717224fed91954946db0457b5', 'D7CDD8259EB1FA103C8832EE3939E77A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 11:14:19', 0, '2017-12-17 11:14:44', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('929066c4a4a942608b74a2b5f484cf3e', '3894F911B7CC9D1A899785EA4C8E4D76', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 10:58:12', 0, '2018-01-09 11:01:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92a5123a736441cc8719f8dc1ca91abd', 'D3D14DC4005B95DD1E8F8722F2E82474', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 11:14:09', 0, '2017-12-17 11:45:59', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('92a9e990db3a474989cc2c448ef738b1', '91DCAF3EDDD8426450D3B2B0627114C7', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 15:46:24', 0, '2018-01-05 15:59:44', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('92ae8ccdf197400fb5dd7a243d1adbe0', '66103E9CE767307CCE374204FD041693', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 18:31:39', 0, '2017-11-21 19:10:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92c5b477e02942f8b4eb4651d1972b13', 'CF61889026AAC66D72EBF6ADFE3938A8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:11', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92c69fadd1ca4123a68efb97f9239286', '1567922639D7A5D829BE566F57CEFB72', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-14 11:31:44', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('92c72269d9394bd2b55fdf42d7313504', '9BAB2767D47BBCE1BA0F6B12663D8CBE', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-13 14:23:00', 0, '2017-12-13 14:31:14', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('92d5a4e22a944685927c28949b217c9a', '4031E01FFC1F031EBEC5A7A8ED4702C1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 16:40:21', 0, '2017-12-11 16:46:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92dd978ad32f4bdbae2048260267f246', '2CA0710E8FAF42A2E074B06A521B4101', 'W05179', '刘林海', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 15:00:37', 0, '2017-11-22 15:02:54', 'c918b6b3166141a6b95b457d12097001'); +INSERT INTO `jcdp_sys_session` VALUES ('92e0e5d18d444a13a6022675e77fd8d1', '18D8BF7281CF089C7711575E68249EDF', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:34:49', 0, '2018-01-09 17:37:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92e45908120242bbb7508677074868dc', '71F2BF855BB570BAF8DC20646190F92A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:45', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92e4f79a46ef48b3bff63f57fa8afcec', '2042D9A8C25AD11BE53FF3A65997871F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:47:52', 0, '2017-11-29 10:53:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92f022f895794f83a3edd7afcd6f0a85', '986159EE60D2B857C02978E4530BEA1B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 15:30:56', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('92f5e9cda3b341c59245f75adaddebf5', 'C845F2375A0AA9E1133B3331A7AFDBC7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:24:37', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('930d7c1314234f8796a58a99b94ed28a', 'DACEDE457CAC57972FF9EC2A33E8CA65', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 08:59:06', 0, '2017-12-28 08:59:18', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9312eb47a75a4f818ea18f7a65a6c8b0', '28C80A521A8ECE07EF383145CFD3CA3C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 15:04:40', 0, '2017-12-15 15:10:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('93221afda69b445ba7625ee94c051799', '02719E2F7E3A5E899449E8F602A10DCB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 16:25:31', 0, '2017-11-17 16:47:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9341c75d4e4147c193aad2a8f7974ce7', '16F8573E246593FA3032B7D32E2633CA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:17:14', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('934842440ed647069ab0846db5c0e13b', 'FA267325D4BDF42FFDE9FF4C14382DF0', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 20:31:31', 0, '2017-12-13 20:32:47', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('934db503500940d7a126e658c5971dcb', 'DC53194F130A876373AF7AA5C20883EB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-07 11:08:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9381fcc5db3540408a66f478dda9c70b', '1D4C60E8B37F2DC65080C198DEC521F6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 11:24:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('93861ce50e114dd392114941278a81c6', 'C5C8C1064C257B1437B42BD0D7705B70', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 09:04:27', 0, '2017-12-29 09:04:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9399ea4c25044ad88729b68287ccc69c', 'C0B528581F92676BFDFC3A964F5DE2FE', 'P12188', '赵星', '10.55.148.147', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:24:58', 0, '2018-01-09 14:28:20', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('93b5e46e10bc4a11831b58ed99a8bc3b', '26C9DA5CBB66B26C8730191A4E461B98', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 15:15:32', 0, '2017-11-17 15:26:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('93b74b8fea3a4e6495dbabeb65e7980b', '28C74D123EF07867985E79B7C4785F39', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:24:33', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('93c14cf53c6e4f2abfd491513764120b', '1E8B7D3FBCBE57F6CB68278FC4ECF7AB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 09:53:10', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('93c361ab13b7445e873af4dc1f796fdb', '972880C4A322DE6F32A23A43B378CBB1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 15:14:11', 0, '2017-11-17 15:26:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('93de7321f48f44249924daa2fa8a64ad', 'B95688681765F8851E1677E07F7417BA', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:55:26', 0, '2017-12-28 10:26:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('93df0039a2fe49979d8da0c87a45bbac', 'E6FCD6F143F1CF5417073F8DCDF913B5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-18 10:59:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('93e0419a1073422193bca9acd2602366', '93173171C900E25C25262EF488908917', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:09:36', 0, '2017-11-17 17:12:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('93ed06f62b2b4c0fbd6a83ad9f2b7537', '611FC1088FF0613F02880BC8469DBC9D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 10:10:51', 0, '2017-12-25 10:41:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('93f9d9040e974af3bc1e5c28b3d55f47', '3D8256BEC80E6EBF59AC32372518A58A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:23:01', 0, '2017-11-06 16:24:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('93fa52695e19425ca4593139d2dc72a0', '5EACAA71DD1E9D3573A246A2A4D65A65', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:29:17', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('93fbcfd830b845bca25a2a1bc2e42f40', '25D125E598EEE0E02AAF483F0A8C669C', 'Y11037', '宁志全', '10.55.148.146', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:04', 0, '2018-01-10 18:00:24', '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('9426fea7cc224b68a703f8558150436d', 'D094345DDC5548E2DE502D3E3FD1A2E2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:20:01', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('942c24b879e3468497c782423d6710b3', '229C94B4D3A609D4B1B1C13ADB98F6E6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-12 15:18:25', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('942c7d6de3484956961436d3d9e39d78', '48974DCC5371EC44F0151E17C25CDE9F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 15:32:07', 0, '2017-11-09 15:45:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('943b87ca2df4494e8b3c9c48485b4b3f', '4CEAAA9949086B7AD0F182726A1C9F11', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:41:34', 0, '2017-12-26 15:54:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('94527c7868904884a82e4ebafce53587', 'AEBF2FFF2B3C1C3BCC0FD7D25943A057', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:35', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9462879324204162806741805059ca4c', 'C92F437A387F357CF88DD465E75332A7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 15:47:06', 0, '2017-11-25 15:53:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('947807809db543d59036ef7563a04b98', '24D229822AC5B5B875E6556603FB3836', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:24:37', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('947897683f6c4190be751e622a08d800', '034CBA2ABADD3B3368B907DB02881F94', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:36:06', 0, '2017-12-28 18:36:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('948f8e75230248a98cee9595a75fcf8b', '70B8CC3D7E7AD4428056DC681DB8C0C4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 11:58:27', 0, '2017-11-25 12:00:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('949c7a050e214adab5f9afbdbe32ecbf', '283E735DD576A4E989EAF145DAE05E91', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 20:01:45', 0, '2017-12-21 20:04:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('94ce557175f5407ba810b650c87db30b', 'B70E0215B2EBF35046628D8FE4B2E2D9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 15:48:06', 0, '2017-11-24 15:51:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('94cf7af24f504463a9167bbdaca7e098', 'B1A46775F245E52A958500B6A4196A0A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 19:42:17', 0, '2017-11-10 20:07:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('94e6f989c70940f693463db8a730d6ad', '001F428308C6729E215354C836725817', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:57:28', 0, '2017-11-09 12:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('94fdd4a41a724d5393be96048583167d', '1F093990EE883F4821E65BC7C8152945', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:37', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('95409e9d19eb4e728e4fdf08a9983ead', '3F62FC8DD8F8F2116A10BF53106E9465', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 17:43:38', 0, '2017-11-16 17:50:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('954acdc592754eb0a42e024fb100a8ba', 'EDD5D415D7DE1CBC0BFF35531664731C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-08 08:54:39', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('954e84c4d71a49bba5adab1610671d9e', '7C2D502632E3283962069B63939964B0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 14:47:39', 0, '2017-12-18 15:18:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('95576a8e9351481cba2b11dd89135d46', '5C5941447A464AC8F4599575CFF1051B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:51:54', 0, '2017-11-25 09:53:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('95603d6f792e442e86054d4ed5e669b7', '5428BAD0955E7BDF61C6E0D8D71D0E81', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 12:10:19', 0, '2017-11-18 12:11:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('956eab86d47840218da6f1b0a5d3e3fc', 'EA7E06060AD227B1CD3702337D0DD3EC', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:21:08', 0, '2018-01-09 17:24:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9572d2c4c67146b588af86ccfd1d5768', '5087F6AB77B2161F74CD34784F00E8D6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:40:17', 0, '2017-11-07 14:42:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('95adc544071943c5928d05a8f49ac201', '4FF0D4D065976583CA867512391AFDD4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 15:10:06', 0, '2017-11-27 15:40:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('95c175dff4074bd6b7d57c7a79c05902', '09F029923495C7D1605C670FDC4EA3CE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 19:35:43', 0, '2017-12-13 19:39:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('95d211385be24b6cbd1e719ae2973144', '5B238F670C3F4200C2AB18F1E5B9ADCC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:43:07', 0, '2017-11-17 14:48:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('95e79ed4249f4b2c81019e42e7c86fd4', '3C196D8A166DFDBFC707B3A7EB9380BF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 16:49:12', 0, '2017-12-26 16:52:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('95f310c1785e41598f5e95fbbb30334c', 'CC6AEE0625CD50E7C5F6563F0B775A18', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 17:09:04', 0, '2017-12-27 17:42:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('95fac80e2fb8439db7ac3bc62815cf0f', '759D243B757123E5010EE86670E31591', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:40:56', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9635f7f270e44cf48bd8be59fb785dbb', '1291DF506BFDC9B7DF9467188DEA4677', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 14:28:45', 0, '2017-12-11 14:38:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('969d0ebc928146d1bd3de70f0e487efd', 'C8EE1F37E26327E9ACA78278E3445C26', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:11:42', 0, '2017-12-13 16:13:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('96b7b7d5af6d457c8e2c665735d2a6c3', '395E7CAA8B0DD7DCC0FFB37A71C94045', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-18 08:42:58', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('96ba71c468b04437bb8cbaafbeb8e41f', 'B9F554BB4A280D3A3A20F98D4FA9DBF0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:53:31', 0, '2017-11-06 17:54:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('96cb403c04834e4381603539476b3154', '26F266253FD9527191A0A5FE4982E5A6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:05:13', 0, '2017-12-28 19:05:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('96e28dd1970b415fb0bf40d6d1b306f9', '51AC86DCDE10B4A23D9D8CC45ED11BB4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 11:16:34', 0, '2017-11-22 12:05:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('96ecc2446a194963b41b759fdab6700d', 'CFBA85D0DA4E8B572D487DE043A5A6E1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 09:00:30', 0, '2017-12-13 09:03:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('96ed7b0e0c0e4a7298904df88384a654', '3C20519AF99AF22EACDF744BD0E27AE4', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:26:14', 0, '2018-01-02 10:01:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9705f0a5f2974d05975739fefc33987d', '3DCB46A8A3AA4A0399D6434F95924F80', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 08:51:40', 0, '2018-01-02 08:52:33', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('97063a53586241ebb0e5fb4dc9795fc7', 'F66F091CA134FE54D5EEA990033760AA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:51:58', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9718c4824c864ed7a2cfb9080ccf7139', 'AF99FFA19327A1CB9EA70C0EC40CEAD4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:17', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('97359840547b4a7abea6e5139f78ba1a', '67F872088BA5ECCB4CBF1BA3CDEDC2D4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 15:39:49', 0, '2017-12-09 16:09:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9749607cc9e3494fb9ffa96fe636d76a', '79FA6E31214A53F7A8A3693A88326D89', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:42:04', 0, '2017-12-25 09:42:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('974ac2b10d404632bc5efc64ddabea78', '4419861A77C2D43ADADE646380367396', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 09:59:53', 0, '2017-11-22 10:04:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9751cb5491f646629e213a702ec1663e', 'F2577751EB821923A3249B3B1ED7EB66', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 19:31:01', 0, '2017-12-27 19:31:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('975c6c47067c43b4a594b3efd6ac522f', '4A77549A08129861C71A52ACCA12206B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:01', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('975cf84d4f084d75b935c8f26645ade2', 'BFDB3271597194D1F199BDB99D4EB527', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:24:55', 0, '2018-01-10 08:56:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('976cfda05bca46d89dfe0235b734e360', '2164F158B715F9B74EF21A24E677402B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 19:35:57', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('977bbac3fa284be787d729e40abede4b', 'D59E3ACEAFD70F9A1ADB2EC90BF26520', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 17:45:57', 0, '2017-12-29 17:48:14', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('977f9a0bb20f491ca018f53fded9da75', '80DD2704D467B964E56A17B765369EA7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 15:59:51', 0, '2017-11-24 16:01:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('978fd91ea67c4317b6fea91d399bdfff', 'B5C84D7A149821E857DFCF4F692001BC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:19', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('979dbd59784d4c9fa64bcc5e6c35f1b7', '9BD9612B55E533A83C5679318A591C34', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:52:55', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('97acc99ad88646e6af6eb81f8976b12a', 'FC611D9F9E48FC8B4E99F920C70DC314', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 16:46:26', 0, '2017-12-18 16:52:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('98155dafaf2149c0a6b0cdf6e27aa3e9', 'E9A4831917945C506814CA10EB74F21A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0', 'localhost:8080', '2017-09-16 15:42:08', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('98370412736441459af3608013cde64c', 'A7FCEB43DD02AAB71682ACBB0910C98A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 16:47:04', 0, '2017-12-29 17:14:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9842e4c737894914808a4767b3343592', 'A74900881AAA6EC87AC6D12C5EBE0703', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 14:19:34', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9844baca94564bcea7794994ca36a301', 'C8DF9DF1E0FC9B4E1AC07DE723AA1F83', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:12:30', 0, '2018-01-10 14:42:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('984bb3c73fcc40f18d944fca72c0f0ee', '61E19E38778274EE233EDB4B99ACB38D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:23:23', 0, '2018-01-02 09:56:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('98591454d11e4f08b5582c3853204ace', '03931FDCCB21645EC6F55D56A35B1132', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-10-16 17:05:47', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('985f316c1d0c4bd2b54dc77554cd937e', '275D3DDDF4093C1552CA4C8D4A24B979', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 11:19:49', 0, '2018-01-09 12:13:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9863c0edeb014af4847791350e51c544', '81DC85B9FA7621440ABA9646017E8614', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 20:40:07', 0, '2017-12-13 20:57:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9877e2bb2f874819a423aa48668b1b30', '4968A028093AA0734ED9918FFE7F6C49', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:17:13', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('987ccc492feb4559a9ea5b04cf7a13a8', 'B5688D1D52AC98FC2E7E99A659CE3CC7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 10:30:56', 0, '2017-11-16 10:31:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('987f53b49f2d431c9265343942e0bb2f', '86DFEA3C3E99D8E9C22F592022D33B94', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:32:36', 0, '2018-01-09 17:22:19', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('9880c55285bc49e48241f00c574ad606', 'CD80309F8431E050024A7D52724D3D81', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 09:57:59', 0, '2017-12-27 10:33:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9885b861d6f14d3aaf9b5801b8eab298', '81B70B6BDDB9F69C17650DF01AE27A89', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-16 16:43:19', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('988badea1a114c9a9ccb71a887cf34a2', '5328B034651981D9072C51ED1A08686F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 19:31:32', 0, '2017-12-29 19:37:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('98a63f21dda84fa496294e8cd877bd6b', 'E97BF694EBA5975D41F98222C3F9FB3D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:06', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('98a7631e68a64e91943e6ea9eb02eee1', 'DD54BDF6545B192E447072233FDB6A98', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:14:50', 0, '2017-12-27 16:26:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('98bac901d0e743d08e3c9cd990675996', '776CC437C5C106C2E0E7EA4C49454D87', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:55:09', 0, '2018-01-17 15:59:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('98c1dd59c6f849e4a3342a41a1b09ade', '95B5EFBB5D25C07D321426210638A0B7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 17:20:03', 0, '2017-12-19 17:24:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('98d3cfd5cac04481acddfc8dde38190f', 'FD9C0D2889E0B728E0CE4AD5DD29B808', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 08:17:34', 0, '2017-12-28 08:45:09', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('98d468fde2dc451cbab5c158dd8df72a', '1750B4EBFFDE1BA47A4FDB13DF59EE6D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 09:44:35', 0, '2017-11-28 10:00:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('98daf43b84f04e51b012f224cbbf42c9', '67366F330025D3F76E2299B7B94AF096', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:09:01', 0, '2017-12-23 11:39:56', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('98e58c0ad11d4dd2a6e5d121e78a46b6', '8AFA62273CD92AB03A7FECCF3414687C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 16:27:36', 0, '2017-11-27 09:19:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('98f0b39117c54d7d98cf870bb8f027a5', '3032E5A3133142C5085B8C69E0B95636', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 19:09:35', 0, '2018-01-09 19:17:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9913ecaf43554f92a87f39dbb98ab55a', '6124570F264EFC6BAD6876772DF30C8F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:48:49', 0, '2017-11-23 15:19:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('99179e022cc04648b5633193a193510a', '87C204562E4F94265F017142AE9287FC', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:53:39', 0, '2017-12-28 12:26:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('991c402844b44594bd86e15151ac5f7d', '6BD0C3B6CF4C28F490371D21DCAFCA36', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:43', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('991c48cf36bc480a835d020c1a50e327', '76D47EE85245E4D88151AEB6AE592D95', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 11:14:16', 0, '2017-11-25 11:17:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('993ac20a9aba49c6a022a06bf5f7f8d4', 'E662C022785C0B29B0372D9813A4B4AF', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:27:53', 0, '2018-01-10 15:00:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('993c8e5b36374c4ea9f94853ab577193', '65281D89E045174474E4A8FA8762C309', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:47:25', 0, '2017-12-28 10:48:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('997739aceb0a4a09ab0c3a8d01e90b22', '3A80B9D59FC57F62DDD8C2BD537E1A03', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 14:52:21', 0, '2018-01-03 15:30:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('997ce78a65ee4efc850ce78080e2876c', 'FE0E768F3851810A3E0CBEF36ADF42A8', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 14:56:00', 0, '2017-12-27 14:58:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('998cb3bb68944f5c9b007104fe80ef68', 'CD1D23E1573899D0B48F4B4D4109FB7E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 11:56:41', 0, '2017-12-29 12:03:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('998f8067726044eab0734abe9a5b0371', '37370352992D5D4FE58B06D9C50F7E06', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 09:57:10', 0, '2017-12-17 10:01:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('99cf0c135d4741eab1586cc575bb009b', '1F1E9916420B1B07BE62AF1153DB4E02', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:07:15', 0, '2017-12-28 19:07:26', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('99dd9c9fae03480da523a7ac63bb95c2', 'E1A5653DF6C386FDC86FAE92A65C6ADE', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-16 08:12:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('99e84f5e83914f9cb341a059e9850b8d', '4A147E3D4A9DB31A8A3DF8D7B9FB33E4', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:26:37', 0, '2018-01-02 11:59:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('99eb48ddf8b2415c8344664bb2108da9', '9A326AA4B9957CF3ABA50A6715A6C24E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:42:51', 0, '2017-12-26 14:58:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('99f4f16c07354687ac67bcb3688a524b', '03B29B0E7B5FAA26A4BDA20E32CAE5FD', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:13:14', 0, '2018-01-10 14:43:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9a073095bf6545e1af657244ffc9803b', '43CB4D5A0AAEB523A1E3619AC5C5BE65', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:56:01', 0, '2017-11-25 11:10:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9a3bec2f63d54465b21f545f815a60f3', 'DE7C2A8B7CB6D31641C7407D0948B9F0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 15:22:27', 0, '2017-12-19 15:27:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9a478d9188a44649bf116e86986d78d6', 'D1BFCE10A8D09258071DD364D983D2C6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:51:10', 0, '2017-11-18 11:59:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9a878c1e6b5f4e3ba2f8707e54667cfd', 'DE3358B9CD9445CDDB21280723558DAA', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:57:04', 0, '2017-12-23 10:58:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('9a89e384bd5847b8a6877c4e723b4fc7', '9008E929AE804D8D15FC28FC6A41A7AF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:34:11', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9aafb32d92744f8c8a0b59f2faa63c54', 'FF471A4898A1DAD2A3C0E88488B06573', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 08:50:24', 0, '2017-12-09 08:51:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9aca2a90dc1040db93a565c1fa0b0ab9', 'C73C3602CB9B131F0BBD110A700C9DFD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:54', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b01a0d6fa7d4802b7d4a5711a4e5402', '1E2C344BA557914EC0DFED90A9B38D1F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:26:21', 0, '2017-11-24 19:33:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b1b0e5f63a2433f9b78db9a934bfe64', '5338F6EC5E5D7F45C43739C7EC88D1BA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 15:12:33', 0, '2017-11-29 15:18:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b22cfabacca4c61a90b0075807449d3', 'C60347B3D2B6755D10CC06F5894C768F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 15:59:15', 0, '2017-11-16 16:13:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b2764265d5046fe9124af17cc4731eb', 'C5FD5458973173716B8849A68914AB2A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 17:20:28', 0, '2017-11-18 18:00:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b2930090345489c9892fa28ef7f9f15', '7880B8710BA98C8FD511C88F0128389C', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 08:56:00', 0, '2017-12-26 09:28:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9b451cd5ca5745fba660c9fa7e4cc32c', '3EB0F670885891821F552F84F4A968CC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:25', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b5b780e09c74d6aa4b2b332be1a70b9', '3B9FF7206746351E1162251577D9FF90', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-02 15:46:30', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9b6cf9ff2adc4e418f58f1d25db2d050', '0304E7AF63C01505354677F53B7AA160', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 15:40:30', 0, '2017-12-13 15:42:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b7bd0cee2bc437cb1054409f54edb18', 'ED272E35E087B912C62AA8BD09565FA8', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-25 16:26:26', 0, '2017-09-25 17:32:40', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9b86aa1e6b114f94a2df69c25d9d95cb', '030A60B48FA2A6974D86F1BF9858C1B6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 10:43:40', 0, '2017-12-24 10:58:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b876002c232458e85589d5ea12f9409', 'E85C20A2E062985B4E877E565D790C0A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:43:44', 0, '2017-12-26 15:14:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b907ffe6ed144459315035ae5bb14cc', '4AA00CA0D3E88C88446A3852CCB6B451', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:53:25', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b939d86024d40479f3c15279c6fe68e', '11D02A91A454F58E8F3E5A67DD59E1AB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 10:24:24', 0, '2017-12-13 10:35:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9b9dac310ded49a49e1f7df077d46566', 'C754D2FFB2614B790F587E6E7DB6F336', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:27:59', 0, '2017-12-26 15:54:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9bb4010778484eb5afcb909e67d96654', '6B84FAD6CCC6783815BEC911DE33FB9C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:15:40', 0, '2018-01-02 11:18:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9bb4edd98c014565be487b52e1bbb200', 'F57F539B3199E78908883793206E5CD4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 17:52:55', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9bc264e194444f1798676fd54af046a7', 'DA0F41CAD2A4524FDB47217B8BCC7F38', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:26', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9bd9c6f91b4d4a2c8a4411bd9c98ea54', '939F682C99F8A53A6FDA8AEC2462359B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:05:04', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9bde5470d15c48de9b6b54bb18c93161', '46FF15E52C24B89FFC993C893CB81ADD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:48', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9befcaa7b8124b3b980fe72f4d275dfa', '15132BC671D9974470627BF3488FFB8F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 11:17:11', 0, '2017-11-27 11:19:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9bf4050473214bd69936fbda7f88728d', '7AE3989830EF2AB54F45F91EF31610BE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:44', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9c176548fff040239a5bba03c941ce8c', '37981055368C33ED3F31B6DF446AE0AB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:42:08', 0, '2018-01-17 19:04:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9c367274ba8e4f1d9cc1704e73e2bef1', 'FF4DDF5DBB16F5064F57B5F0C744B320', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 15:21:21', 0, '2017-11-18 15:53:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9c435a95dbd9433098761b37529dfeab', 'F303F6C59BD38ADEF60C90A6EA03B9D9', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 19:25:14', 0, '2017-12-19 19:38:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9c51bcd58ed546d1a3f1ed9654b5ae45', '34D9593D5CA8D771C93D46627898F3C4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 10:08:50', 0, '2018-01-04 10:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9c753fa8562e40be8a94c8eb8f3835bc', 'EAC0C3203AFDB8B93D933EBFEFA2626F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:25:04', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9c79e087d2d34adabe5c7357bd946891', '78577DAD84C07444BB826041D1D3311D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:18:34', 0, '2017-12-27 15:49:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9c9d75917ea24189b8ffb80f03f2d7bf', '7A6B57097F7CA66539D4C1D618AF6662', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:45:57', 0, '2017-11-09 12:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9ca1ed3065f443f683fa87d60749a908', '59D664B2EEDA9E0A09E69E06F59ECF47', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 15:14:03', 0, '2017-12-28 15:15:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9ca4e93d7f644d88963103998f314588', '2BDB6CB14448178C9CED31FEB76978E3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 19:16:04', 0, '2017-12-19 19:38:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9caa93364f9a46a4b45ec71c42a6eaa8', 'B3295476E9BB9A0B43B898AB2F4D8190', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:15:51', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9cab7adbaaa4410a993c0a55118bab33', '596B1B12C4B1D38E6FDF7CA9E6F0756B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 11:26:00', 0, '2018-01-03 11:50:35', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9cb7f516cd934062a0ffc92ff41a224e', '9615DC5A8CA11EA19B78B8659884E93F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 09:05:46', 0, '2017-12-09 09:06:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9cfc87fe2b494630afeed70dc073b743', '5C856008D8F53156DEDA2CD343D2A87F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 09:50:27', 0, '2017-12-17 09:55:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9cffe84168574eefb94b9a568850feaa', '0AF53979CBCF13D994230C3890F38C7E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 17:09:47', 0, '2017-11-16 17:18:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9d08f58d247346ebba072f123b0dbf42', '3FC5BF30BFA5F2083B4DD7D992433BC9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:33', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9d7b6c81be7c4d37b335382f24bde74b', 'F5983E7CBE06D3B6BB216C2DBB8BDA39', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:11', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9d8f1fb43ed44ffba37968eb762b6a2e', 'D82DA9A06B4AEE0157962DC86DC8991D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 16:19:21', 0, '2017-11-21 16:25:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9d9051aadf39491185b3397b2ed7c8f6', 'B486FA6FF5EC9A765C43353A8BF759D5', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:55:47', 0, '2017-12-12 20:00:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9d9ae4b3007048ccaae5221b6c41a364', '7CC3A1F1A78D3D7AA530EC233016F355', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:43', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9d9d9985f57b47b0976af0384a875e39', '71F9FCAA9A5518503CF8F3BFC44C51C1', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:28:46', 0, '2017-12-29 09:19:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9d9dfd7a2c754ceca4038372510ac66b', '1016AC4F84198FA5D1D2D68CD6FA54B7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 20:06:27', 0, '2018-01-04 20:06:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9d9f5feb0a1a41fb80cfa9f62839297a', '5C487C42C5F491212381EA89B7F32BB0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 08:47:02', 0, '2017-11-18 09:12:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9da843a30e2d4588a600471e54768578', 'B76BD4528C6428568313981B0E5E74B5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:26', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9db71786d84e42d2be7b49cdff133cc1', '57C118A16B58B5F4E25E178CEDA42825', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:28:13', 0, '2018-01-17 10:36:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9dc808c79d9246b581abf2693abf0399', '8CE336C2EF8FFD822ECB5912269AB6E4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 16:43:12', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9dc9ff787a434c2cbb3e3b016d6b5835', '3AEA0EDB791B8268C99F53E067A0172C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 15:26:53', 0, '2017-11-18 15:53:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9ddc7d3cefaa4a099b6e8d05f77ef2fe', 'BCC5E8D077327FBFFE5FF318479D2116', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-11 09:35:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9de25304221746b1ae3e661902a35e4c', '03198859C5527D9830D2E4A06B4FB708', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 17:09:01', 0, '2017-12-29 17:14:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9de4d394e0ae458eb03828ee77629a3d', '016D063FD1A9C1C5778872815DBEC033', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:01:41', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9df07e6d59404f34bef915147ddec945', '984A797638D1769AFE15902D3426FDCD', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 17:22:33', 0, '2017-11-27 17:55:02', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('9df0eb9034ec4bf9a8d2f035f83acbe3', '7978EBEE5ACBAB0562FCEDB3C5C27C85', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 20:03:36', 0, '2018-01-04 20:04:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9dfdc732ec5944bbb37954e885731323', '54661D8C12A7C6F5965140992B09B8C7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 16:14:51', 0, '2017-11-27 16:49:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9e01a0657a8845fcb866126f2940fb74', '54230F883DB2162B9660E8F0997BABB0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:02:17', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9e179baccc3d4d5aa53ec05e481e7e5e', '1EC26CA752BD10DBFA3D303E84B5CC63', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:07', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9e1ec9c47ff1410c8d370486d1de965e', 'A64E41BBDB0C407A2257F8F7B31DCAA6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:53:45', 0, '2017-11-23 15:26:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9e31ed11bcfb414b9e9fb3d7615ee1b6', '3214E1F0D9F78FB130EAB5B41253BD7B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 08:50:30', 0, '2017-12-28 08:51:56', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9e3527de6ea24addbb22d81bf76c14d4', '63F2B28B285E978D67522ACD7AD34C44', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:39', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9e58340fad8b46c38b54f1eda2242ef2', '627FDC6EF71D2A9DE108F68105BB05E3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 18:12:17', 0, '2018-01-04 19:45:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9e9630f2630b4d78bb4cf4ca96f55c03', '54C764A7733A60F2AA2E34E9E3D6EE8D', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:10:00', 0, '2017-12-23 11:10:14', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('9ec9785218694e7c8efe0c241a4db6b1', 'B1E30685B25E42854391F9CA1C2F2B55', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 20:36:02', 0, '2018-01-03 08:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9eca322d46b44ff282b9a0fc3b916900', '65373BBCAB4EDDF6A143CE7AEE530A45', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:14:46', 0, '2018-01-10 16:17:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9ed4867319ff43f39c689adc454a763a', '20FC35F22E9ED0ED886048B8B47A4402', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 10:48:01', 0, '2017-12-17 10:50:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9efa0aeae3584e37a13e309c31e6a1f5', 'D03191674A2C7DDBF2A9DCAF286EBD37', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 16:35:34', 0, '2017-11-16 16:56:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9efce0ae46b14ba4b165ec9ccef508fd', '3DA90980295F2ACF9450B74AD0225890', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:02:45', 0, '2018-01-09 14:56:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9f16af0f8329461eb7290e0f8e0b5591', '683DA66224C651D2FE712D3E7526716F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:59:31', 0, '2018-01-02 12:06:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9f22ebadb0c84b9ba26c0e301516df8e', '108CD8B63E7C3C916A6246BA5624127A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:12:17', 0, '2017-11-24 16:17:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9f22ee5781a64c2d9517690aabdd3218', 'A88E5F81B68958FF2986EB6D72EE9C46', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:18', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9f2dc340c63c49ad8df22677ef5795a9', '77B516EE76412C3E7991A10AC1806DDE', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 18:54:44', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('9f419b6c2d694d9a8e9b19eb99592b29', '1DDC5A20849E3892BB953A11498509DE', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:36:49', 0, '2018-01-02 12:08:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('9f8cbdefbdc540eaa6bc14213892ed91', '3BE6C3A6613F090EF44563314C79A1BE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 15:04:27', 0, '2018-01-02 15:35:45', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9fa467185ece4cf0859e6a7b27100762', '2E4C9A0B1A3EA3FEE097A5AD207BAE88', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:19:33', 0, '2017-11-23 18:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9faa9369381d4a4387c85590e5dff826', 'A552F73EA9292F21F928CA219A0D9A0C', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:05:43', 0, '2017-12-28 16:12:24', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('9fabdef35c7640918dee7036de94ae51', 'BBDF40C074F2FDDEBA98E078A4286AA3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 11:39:11', 0, '2017-12-13 11:55:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('9fb82fceaed54ab890d855e4b02b1a4e', '3DB8334AD2493E4490D7CD99866300E3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 10:37:43', 0, '2017-11-17 10:45:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a00a2efeccfd44ad8d01ae892011b2a9', 'FC15278F3079206244BFCBCC3767797A', 'W02030', '杨卫东', '10.55.148.68', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 10:38:49', 0, '2018-01-10 11:26:21', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('a00afef457434d4aaddabe886a3457c3', '3BDDC54A913E7111D5FA81CD3ED98792', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:13:10', 0, '2017-12-28 19:17:07', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('a01fe7eaa04843de846a704480c51e73', '6E9278DE4D9560E13C1D9F7EB4425058', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 16:25:22', 0, '2017-11-07 16:27:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a028e549c3294ce1914e4d33130d8132', '42079B86CDCDCB0ABF9C6ADEE3135A1E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:41', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a032f06bca89418eaa312ac412726f8d', '072C5C46FB04F052B1BD2AB6AE76081F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 14:20:54', 0, '2017-12-13 14:28:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a038487ba94f4d38907f0c73c97500ec', 'A048EF838DD133F809575027EAFBFA0D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:34:13', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a03d1f88f99f48e6966346298e64b7e9', '69BECB08E8F018D2FC1C1C6B96F4E0DC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 11:15:26', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a054631f47cb4fb5be9459c6b092f9da', '454DE7950C926EAC6E4693FBFEBE8C6E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:06', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a059c2bdbc9a44e2b29f7154178a6ab0', '85BB43A93EE6AEF835D51F8B9D7EA567', 'W07248', '贾怀玺', '10.55.148.142', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:29:16', 0, '2018-01-09 15:00:37', '1d8094115f5c4c6ab8c38c414a65d6f4'); +INSERT INTO `jcdp_sys_session` VALUES ('a05b213ec3d14fd08f947dca09178e87', '3142757BC4E54FF82A585D99869C75E8', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:47:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a06a07db937949a599ab51ee5270fbe0', '17041D868013B7D347BF9722532AC618', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:40:15', 0, '2017-11-25 12:43:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a06f4cf60012460da5ba0e13e481919d', '57D3AF510B7B7430B0C392A9B222284E', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:48:38', 0, '2018-01-10 16:51:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a073e9d2fd1b424b92a2192372becc24', '4F9D319E64081373F6BFA4C460B31A49', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:59', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a094476517374a5f81ccb75e5990fac5', 'FD35BAA50E47AB1116D09C992B92BD90', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:42:01', 0, '2017-11-08 19:44:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a0b7d5ce53f64d4d87489cc6a32104ed', 'ADB25FCA4C2535D689ACC3B46E0D620D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:49', 0, '2017-11-23 11:22:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a0b990fb6f6243a2baa162c63d17a6ee', 'FD2C448668999E6FEA1137B380CB4D21', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-13 19:05:46', 0, '2017-11-13 19:07:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a0c6592bb51b4327a8756531cc84cd42', '7B14145D467FA98D858CF68C9CD91D6E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 10:02:41', 0, '2017-12-13 10:14:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a0d7f4d8dd1d47859a4592ce7a22add5', '58497506E19B566883418E8C2ED6E095', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 08:55:29', 0, '2018-01-02 08:55:39', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a0e79e77e36c4ec79cefecfab623bbc8', 'AB454954F9023667A2657B18ED8950F6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-29 08:30:49', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a106d064824644fb96ae8bd727dcd815', 'E2265C33E68DE5B779B3417FE598271B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:16:34', 0, '2018-01-02 11:18:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a11863f8fd424d3692fb5fddb31cb998', '30ACA42B125D3FBFE67A0AAE62384CF2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 12:01:38', 0, '2018-01-02 12:06:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a1215b000e7c421aad9cc7d4bbc12cf7', 'E23746BB59C02DC7736B3ECEB067ACCE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 20:13:01', 0, '2017-11-17 20:19:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a1368359652b4ac6813fb6d11e7567c1', 'F22CC27190D303DF5A58EC5615F61F49', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:57:03', 0, '2017-12-23 10:58:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('a13e2d10e7524d96a1ed242d56e7a643', '12EA5BB826B2018CB6FBA9B61E803B68', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:18:29', 0, '2018-01-17 10:24:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a14255a256f64c7b8242621a386ca49b', 'D7018902B08ED80F54D4A3DE06E18F1E', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 09:59:40', 0, '2017-12-17 11:08:23', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('a143d5917c82437189dff1309bd07730', '4DF9D1BEC632E9FC80CB62AE6485260F', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:01:01', 0, '2017-12-28 10:50:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a15044b2d88d4c3f9caefa2256167c70', 'EC71A520D593F269D5B05A24965C1B68', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:01:21', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a15d2d93977344d9aae1be911a6eaec0', '25A9BFD73DFC378D76A839FC7747A292', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:48:15', 0, '2017-11-17 11:52:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a16348820a5c444d916e7b9a00cad6f4', '293297A15820B8C5FF7D219F903B5C56', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 17:35:29', 0, '2017-11-08 17:37:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a179e369ff254986b798588981f86b9d', '43EA0E0D70D2C90D7D06E525366FC369', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-25 16:58:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a18e23e4f92a440ea945c3e8a16ff483', '0E6775AE101F3F59F31230E3D72C91CD', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 16:42:43', 0, '2017-12-19 16:46:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a1b0ae1d11aa4a1fb6613182fa038841', 'CCF16F445A8F6D77414C988ADA97D550', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:20:57', 0, '2018-01-10 11:26:21', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('a1b2c1911312478ca9c094020e5415ae', 'D9531166611EFBAB905AECC40D105510', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 15:08:06', 0, '2017-11-29 15:18:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a1d39b0928e14e5db061ca83392f417f', 'F33F53C8485CBAC7D4C277C5034A9F94', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:57:22', 0, '2018-01-10 14:28:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a1d746f12dc54870a32ab18b57089524', '7CF4A9537F9BC7B6BF9AFC4B8FACBB08', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-13 18:49:32', 0, '2017-11-13 18:58:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a2161ddad3324b4eba5ea60af8f58ecc', 'A789799E049E99C77558FD5C42319325', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:13', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a2343cf1983e417ba21998ffc290a198', '63391B3BD6BE28188D5D01059218FBE9', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 17:12:43', 0, '2017-12-28 18:09:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a23bccd6b9244114b4c8562d6fb15938', 'CBF272586CFA201BB71D0037E27609C8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 19:12:22', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a23fedd0a7a3467e8e7a7e309234720a', '9B11008E5B7671B2F8FFE03C97772FD7', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:49:43', 0, '2017-12-28 11:24:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a279810fe7dc41f6aacee649bbf184c8', 'A1B21640E2506E1CB98B354BE0C5384A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 17:18:17', 0, '2017-12-27 17:29:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a28ee6714c3e42c1a47692bb086b9888', '4B8366EA26B87666ECEF1F678B32ADFE', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:20:03', 0, '2017-12-26 14:21:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a2afefb083f1487e8690ae36d7a4b0f8', 'CED29B8245BE16384646F50D7AFC7AA6', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:25:08', 1, NULL, 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a2c62b566a504458b8f2106e33516164', 'A8DCC65CB818EC79D6883F9272897D52', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:39:32', 0, '2017-12-23 10:39:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a2c66ff3fbbe441ea41765804c893890', '7FB24B912B08649DB167496506709BE5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 10:01:25', 0, '2017-11-22 10:04:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a2e9720f783e420494602979bfe5dca6', 'A899119B17F32B4F3D38CCBDAD888093', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:15:00', 0, '2017-11-08 19:17:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a2ee793f896b4a6e945f1fd6d56a17f2', 'B50402399369D4F25D145D5269B37A50', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 10:12:04', 0, '2018-01-04 10:13:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a2ef1b0bf92c4baab0d260aa8ce8f0ad', '2EE3442AE772B5BE1DD96F1DFBA8ED86', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:16', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a2fda244e1c844f2a6fbfd18dfb35a91', 'DDC2D67C7A516848B0F2AD9195AC69E4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:42', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a3167cdb47d542a89bb4da2429c70a75', '0597174DF1C8E27A547AB33A8AF211CB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:30:27', 0, '2017-12-18 10:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a33ced9e72874e39b935fff392f6e433', '34E0D1F7FB47DF27CF313EF5A3E57977', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:31:14', 0, '2017-11-22 17:33:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a366556458634189b9b9fad40a6137ae', 'B54F41E93F5E1C0ADF3A8F627FB3E09E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:13', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a375441efee944daa307c1f21355dd22', '642E7F6A6DFA2A38DC6E2350E5C43BB7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:46:13', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a37ceb57197e4c15981ad938d668e9b3', '56A35D45DD23614D05346CAF7DDC336F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 14:40:38', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a3bab3dc6dfe4527b799df5593a36772', '932DEAF3252C17891F9182DF7716601B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 14:36:06', 0, '2017-12-25 14:46:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a3cc6a048cfe4200b3ea299d919a8301', '3714542691BE79420785EEC39D5A09A0', 'Y08204', '王利培', '10.55.148.137', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:23:15', 0, '2018-01-09 16:29:19', '25f0fd10490349b9941f8325c1fc8488'); +INSERT INTO `jcdp_sys_session` VALUES ('a3d5f7bd91e14412a2eb44ea7f007745', '4F2E6698085AB7DDE95720EE03FA5FC3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:03:24', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a3da41f608aa4c02b9ddbfd95c598cbe', 'E9A7DFB66E4CC7BDF86EA17EF69612C1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:45:08', 0, '2018-01-02 10:51:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a4555e70dc0141be9f369563fca89000', '02BE1A3EA4D32B594A56FCBC8285D278', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-16 15:42:52', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a469f580d4174416890dea7ad006e424', '2BD201959E0D21F27AF0350A59FD2E16', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:48:39', 0, '2017-11-23 18:51:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a47eef95385645e88e5f76bb34f7a9d7', '19F41202926C2AA453C12D70C1A19E83', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 15:00:05', 0, '2018-01-03 15:35:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a4abbf8325e343f7a0d121b4cfcfe521', 'E027E84E0E4CCDE7C2AC3BE5D7F9E8B3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 15:42:45', 0, '2017-12-23 15:45:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a4ed28608cf84a91ad4b13155c5e075e', 'BE931B334E08359D4C65648940ED2AB0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-20 15:50:12', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a4fd806d5846450cb4da70d0257609cc', '517A781FE75DC739788AD92C3AFDABBE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:04', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a5090ef7dc5a483bae522dde937cfc91', '3D77BB43EBE34E110058D390E8D05B57', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 09:43:01', 0, '2018-01-17 09:46:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a5328a73aefd436fa7639570fd1610a0', '0FF47E28BB52DDA52BE78AAB1C818268', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:54', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a55ea73309284ab7bf70756b7a64f95a', '334776B71571C56D027A5C3C0705B124', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 17:05:09', 0, '2017-12-27 17:16:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a571e30470e84986aca32315130b13a8', 'F2DC3242820BAD4D36763E868ED3E6BC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:15:48', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a578120dc99143bba6668d2b88101b8c', 'C196A91FD148B26FD2BFFF94139CC4DB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 15:38:04', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a579afc177e049478e98716f2a62c342', '6AFE33764FC05487445CF85649C4584B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:14', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a58049078b5d4538b5821aadc51b4815', 'D7F20056F11F9D2E9E5449F15AAA7B1A', 'W07427', '刘聪', '10.55.148.148', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:50:40', 0, '2018-01-10 11:26:21', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('a5955de1f49849cd84fd9137884758a2', 'C59A3AC560371B626AABA1A5F6602B5E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:54:42', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a59833e7ce0e4507843baa6ca0e3fb29', '640813A8D8ED31A98C0E36DA868A223D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 11:06:37', 0, '2017-12-12 11:08:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a59d11071d1840d690c62685fd8ae760', '9BAD2F6D69AF536770382FAF47F5A7AB', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:53:51', 0, '2018-01-10 14:58:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a5ac2d3803b7484d9aec7abf731080f4', '6BB38712F289A2E096E1E151D4B79B7B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 10:42:11', 0, '2017-11-17 10:45:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a5b7e1097f79467683bc88fec0af592e', 'E9625B3770600BC5293C0421DE4F3A73', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:21', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a5d740cc14e249ee98dc34123dc0f455', '49830435B51BEFF76D4E474513E6D905', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-24 14:55:14', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a5de03bd78da4985805cf84877d4d560', 'C9185C4047C4E81AD7AB04BFEB3BC180', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 16:18:44', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a5fbeef54e3c4484897996c732de1f4d', '5C4F8A04A3B9F5F9DD978D2505F9EC3F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 11:45:15', 0, '2017-12-24 11:49:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a60c4345d1984c4cac203a294816b825', '815606683154DB267F604CAE0CA1907F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:17:56', 0, '2017-11-24 17:20:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a61c68e2021a4e5eb5374c0a0d095da1', '73B609B7E5364AF605B87E9B1DBDEEEF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:01:43', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a621802de6bd446ab2041a28e5af78ae', 'A7AB3B67BFF82574E246FB8451C17504', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:41:31', 0, '2017-11-23 16:11:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a62da36dbe794ea3b202f7b7e508138e', '56DB67D8B2F1497C7374D3F4943B72C9', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 12:03:08', 0, '2017-12-22 12:06:09', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('a63b863060a84d0fa5f74d217ba4e7e0', '23D9314F655F97A88D75E22B912C477D', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:12:02', 0, '2017-12-12 19:15:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a6438f7054ea45b794caf0282c513c01', '2991BEC35CAE70E0E2E11E8EC5FABD5F', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:22:31', 0, '2017-12-26 14:22:47', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a65772f3337942b2aeb7463ff5b94b86', '1C2BB169CEDEEFAF51C7B421B3AC9B91', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 15:38:34', 0, '2017-11-08 15:52:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a657b651a4a742ee96193e0f36b5d80c', '7E876B00248242CF8D759282BC873DA6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:23:34', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a670381ed6c74752bc7493f2239e2fd6', '0FCFE66AAA46767AAD12CC587CFD3A9E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:29:51', 0, '2017-12-28 11:19:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a67f4873299d4702adf198e842dd48d7', 'CB8A6FED80B60698816E8E9EC0DC4159', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:52:48', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a680bcca42bf4b73b5c99a9d66fa4ede', '72D1029BB8DD0915673B70F2CD9570FD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-08 10:52:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a6881bc5f9f847079b532a735117e670', '03349F1AF2D2EF3DCC7ABF7252E1B97D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:45:04', 0, '2018-01-16 20:03:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a68d67fce1a1448a96bff9808b104b8d', '7282CCB0CA8617FA5FC8F31E5071860A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:40:02', 0, '2017-12-22 17:43:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a69396cbb1c248d1b90b04d6cb6d8c7a', '7297DB4DBC57AE65470B49B0DBE177F6', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:49:43', 0, '2018-01-10 09:21:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a69ab30ec9d247fcad3820e220a69ae7', '88041B47EE269E62D58D1EE8DD3D0BA7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:45:04', 0, '2017-12-28 14:46:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a6ac57f63b894cdeb4eba23d11b3e01f', '32CAF70947018D426961A0601DE3FB25', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:37', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a6bdf2b78864485f9a4adf2a107b7c5b', 'C84871DAB4C1EF66A5647B61CB4CB07D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:22:21', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a6c1139dca9444f7a79479252d4d6e90', '6E7F1D3989A918E64C7524A83B13783B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:22:32', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a6cf9f3435cf4f03b1870779760b062b', '8058BEAB3A7F469866684CC127A02195', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 15:29:11', 0, '2017-12-19 15:33:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a6d9f86d4cd44c83bf7831e2a7d60915', 'C1B2CD6FB5947F94899BD22E8A00982D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:53:17', 0, '2017-11-06 17:54:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a6ffc32750af4d8e8b53eda403a968c3', '0423281D9ADEE2A7451817E5C6FFA2DD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-16 16:55:39', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a7389b05a4a142b2ae163fb5a9f6bd92', '9FD29AF966B25428A1AB9EDE118ECAEC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 14:48:28', 0, '2017-12-25 14:55:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a7432abc616b41c7a15cbd190093715e', 'E5A425648ECEF955C53FCA87198949DC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-09 08:24:27', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a75584984eff4f7f807663bc429a87fc', 'E20A65DDEC3AF5DCCA5B0E2A034839A4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:09', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a7642682a6fe432f9b901e2b0328b0e9', '972BF467CE37BAE8A75F4FE96CE89E23', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 16:43:21', 0, '2017-11-16 16:56:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a77125fd0f8e4f2399bd6a33d1942803', 'A268D4910E39912F21F68A0D43A37126', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:40:52', 0, '2017-12-29 08:49:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a7852ae63c0541b3ab1cbcd847e1deb7', 'D7C269C88D7815836F8602260043DDFD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:15:20', 0, '2017-11-06 18:16:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a79d15921e314659a4f6031ee3c8d117', '3AF4DB24B72258102499E67BEA37F339', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:47:52', 0, '2017-12-28 10:19:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('a7b3354e38fd40dea72951aaa8fece50', '261E008C48D49A66F77BD62AC94647B1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:24:23', 0, '2017-11-17 17:29:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a7c770e5ed4249b18a7cc758b7142e53', 'EE8123D3211CED7DED9C8CDE2511E36B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 16:32:24', 0, '2018-01-04 16:35:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a7d5e245db1440da821fc2a52fd51c59', 'BD1A13F3ADB8739AFDEFE67F8A3ED7E5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-20 16:41:17', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a7e23d40a3094d2d95471799fdde905e', 'CA5AF858BFC4B33AE323A3E10F05C8F9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:54:39', 0, '2017-11-09 12:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a7f5dcf132044dc0b2df0bec604422d6', '96160B5C26D26C6A1FEBE79B910A5574', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 10:45:52', 0, '2018-01-09 10:46:03', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a7f64b3ebfa24cbfabbd98ed891b404a', '2E13323851B4A013379352584A4B26BD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 16:25:33', 0, '2017-11-07 16:27:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a7fa68dd6fbf429eb1ef033331200334', '5474438B210198B87998676885AFBC4F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:47:10', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a824c864cde44c238239e0ee76d94ac3', '2842AF8814D10E19AF7A14E048D245C5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 11:19:04', 0, '2017-11-16 11:20:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a833c1d11e31488ea960144eaf9a3853', '8B327A6726DE39DFCC85D0E4348446BA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:01:32', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a837e9019b6f4b1fa93d2be9d886faa5', 'DBDFF3F20B2D67CA7136D1847CE9BA7D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 15:54:50', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a84597e951ed4ad5aecad8c3aec86478', 'D763532D24A757F2050F0A6509446B9D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 18:41:29', 0, '2018-01-09 18:42:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a88b3351ed9249a7a81105ba8eb7a8fc', 'BF956E331A302035E28792FD379B45DA', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-25 08:40:22', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a88b8bbc8e76445a9b030c3652bfa027', '5259F279257EFD2BDE3DB21EE9076621', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:01:55', 0, '2017-11-07 14:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a8d0ca2d248f4fc890c26c8af679b7be', '3063A5CE37555A6138F48D22FECF579F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:05:27', 0, '2018-01-17 15:10:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a8db2ef572dd48719b67367fa260920b', 'B94ED380EAA09CA397526E55AA06B491', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:41', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a8e1782236a24365ba40ce6dc8304edc', 'C07BECBA49B4AEFFA4F6412C4E14681E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 18:38:30', 0, '2017-11-22 18:40:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a8e2cf039b0046f5aac8cb5a7916222f', 'DBDA233F2A2DBC336B3010A1D6057963', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-02 08:54:08', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a8e4f50cc7754c1dbdea529438a7d48d', '6FBFDE76A02EF9411DE1FFAF238BE7AA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:15:23', 0, '2017-11-18 11:16:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a8e74995cedf4890930867f4963c52b3', '64B25CECBB617BB51B06044C1FA7A230', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 17:25:10', 0, '2018-01-03 17:52:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a912f879226f47f29824ff30dbaf97ca', '9812644A9A2DF1093FBBE9105BC0E8B9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:29:46', 0, '2017-11-25 12:43:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a934ad45c69f4849bbeed1fe6b29df8f', 'AD99B7816F41FE9F22BF2C9407FC32AC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 15:24:03', 0, '2017-12-28 15:26:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a955a7fa77fd4de8b25aa936ab02e5ee', 'DD10E9D728D00CD052DE08FE961227E2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 16:22:22', 0, '2017-11-27 16:53:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a9729f5107354677a7d206ac3b5a5e64', 'D393C602F471CF89BFCA04ECDA8B4962', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:01:48', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a98d3cb0efe0473486c067ff000ca955', 'F793ADC5CBB960F979D80340DCAEC1F1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 16:18:25', 0, '2017-11-18 17:06:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a9a5f1927b364e8692e728cd3338e5a5', 'E45AFF4DC166D365C699F362ACE01CC5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:07', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a9b05917d5644123812b020618c2fc7c', '5D56F4F8EE1D425FC1591605F67EF24C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 14:01:32', 0, '2017-11-25 14:02:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a9b417aa6b344c008bb45741704a2c0b', '8324451D8040470BD9221A7AE5830CA1', 'Y11037', '宁志全', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 08:26:56', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('a9d009d594af485bbdd2c5480b438f22', '480F9FA70439841FE27D6C4AE0528DE9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-31 08:36:05', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('a9e81dcd392743dcab63986077bedf1e', '5918F320739C391FECFB8F6B1EE5F260', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 11:23:05', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('a9ff4eb0c29a49a3a9294450dbe152fe', '73A1A3E54CD7BB191EDDB6C6B127B318', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 15:50:55', 0, '2017-12-19 15:52:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa2be0f6cc4f45fba11a18ab7969a2ba', '6B7C6BBF3E4087F64D49171AF8A06825', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 17:35:16', 0, '2017-12-20 17:36:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa3681419ba64a2c9a621c29a98a36e7', '834C8F974104810844BFF3604182492E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:09:02', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('aa4200bed91a40d38d81bcc19a4eafbd', 'C89F8041B132DACDB876FA11861FAA15', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:35:00', 0, '2017-12-12 14:42:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa4af383ce9b49739936eb42200e452e', '1E33F9E30EBE865885F1043B885DB679', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:42', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa623a5525954b90a8b81fc52e19d442', '612E36D6B476DEC26E67568C0757CF75', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 08:45:36', 0, '2018-01-03 09:06:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa72db94d5174acf8c12f730bae5bd2f', 'A701924579F36ECC79E94AF54252E0ED', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:38:06', 0, '2017-11-09 11:42:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa8b84494dd54234911e90d3da87b96b', '94DB97D84CD8F78DA7CE04E25CF33C4C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:50:17', 0, '2017-12-27 16:52:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa8c0dd31018470d9d666bd7076bb75b', 'A34E49E0C1BE2C0A86A5CE6E5ACDB032', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 16:25:23', 0, '2017-11-07 16:27:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa98caf0feef4c7f959cca821963b3c3', 'FFB56CA8B0BE1AEADDDB1DC73E7B5B31', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:35:43', 0, '2017-12-23 11:59:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aa9c8d341324417dba0951ce77d61b0e', 'B07977ADCD4572E3B95A8EC9A830A682', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:21:22', 0, '2017-11-29 10:27:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aaaf7714bc2543bd98b9cd4ad52322af', '29A5EBBE51B9C7A3BAD0B09CEB8EFCAE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:51:35', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aad922cf60d946ff90415966be823d41', 'FB067A8D69C6A596237B921299C5DF4F', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 14:32:38', 0, '2017-12-13 14:37:13', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('aae84874ac784659bbf2808a53f4c27a', '20BE8781B331885FC0CC0EA717FD56B0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-14 16:08:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('aaf39f08e6c1479b97dae96653659630', '568B0A34507A3C460E34AA11C07DD574', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 11:52:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ab020c1995d34d5f94c2543c73cd6baf', '37BDCD6D4ABAABB60C611EF15AC01D1B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:51:16', 0, '2018-01-10 18:22:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab101e3df4524b979aec08896b621fa8', 'A5C3ED2BF0C656746B5F0C7C801CD4ED', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 14:48:04', 0, '2017-11-28 15:20:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab1a284521424365bddec718b1ff6f7d', '723FC5DD9462BDB1BA0CC26965A75FC7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:54:25', 0, '2017-12-27 17:16:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab378bc50e3a4ced8c4ba4f9c0629f18', '0BDA128A92D43DC3350D8C554DCF6E9F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:35', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab44e1cd2d384e3b8f265c205f55998a', 'CA52FA89E942AFF198DCD9A1F82A4605', 'admin', '超级管理员', '10.211.55.2', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', '10.211.55.5:8080', '2017-11-09 09:12:54', 0, '2017-11-09 09:43:24', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ab654618c3fe481f97e2e7ec7c357c41', 'A9067BB733030224DF1EA99F21842379', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 09:02:25', 0, '2017-12-19 09:18:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab68746acf914636bb687bdbb9e00805', '5C1D4265243AE994ACA50A13F2D3FBA3', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-01 10:58:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ab6ae1e47f8c4c6cbf3254939f571dde', '9E63F5294F09257FE828DA48F3105CD3', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 18:47:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ab7be7b07fc9424c997b9ec5680a5b3b', 'B54E9AFC4212D3B4AD86BD7CBC508656', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 18:22:58', 0, '2017-11-18 18:27:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab838cfe1abd4984af9d98c6c7a9c70e', '1D1122DCA1DD403E79C20FE1AB547E08', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 09:31:49', 0, '2017-12-19 09:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab8b92a39c7e470581c5eac0fd6f111d', '39B741A9F481CAA607853B724A7E2C58', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:35', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab8bc6205d4c43aba56100d6fe1fb2e3', '0FF75B7793D5555A7BE53EF8CA6DFC5B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 11:16:44', 0, '2017-11-24 11:26:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab8da2accdba41cd8d4418188afaf070', '7C1483E6246769DC2B9D0C934620D44D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:25:02', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab93b746ab7c450d9a9e52554953882a', 'F332DB062CDD17463B8DFF0C1CF9ED9E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:52:06', 0, '2017-12-28 10:22:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ab9c2fafb3e646d79210863e25137215', '4797DEE68C9A7624E7BD92EC4AFCD0DB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:43:16', 0, '2017-11-23 16:45:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ab9d095c0c4e4a61b9c050a63b73b318', '89CC6C9FD09CB1FA23C4085912767C65', 'P12188', '赵星', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-26 10:08:03', 0, '2017-09-26 10:08:15', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('ab9f7caeabef46908f8d49821e1af592', '4C52C835F1CDECBAA3BA8D835DA849AF', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:03:18', 0, '2018-01-02 09:04:16', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('abb70423645d458aa2a8b28cdf3429fa', '5EEDABD4947D33E021D2AE5F5417E66A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-23 08:16:23', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('abbe07b31f5541bbba0bccde626b3b9f', 'F90C80BBD475D20679D3870354A8F6F6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 19:57:38', 0, '2018-01-03 20:12:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('abc5ebfd546e4f4d8bc2316d761469d8', '21A2158842947050FFF5E13F81363E3E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 14:30:19', 0, '2017-12-18 15:16:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ac01deed2e704488a0e638453a605ff0', '8DA69E856DF31AFDF33023BD8B2E1099', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 14:55:10', 0, '2017-11-22 14:56:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ac07e38a556d4e5289d705739ae1f9cb', '9FCCC0DF93B6B51399DDFCAA4D5C7574', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 17:36:32', 0, '2017-12-25 18:11:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ac170017a204483086d090a0731586d2', '6764DC9E2F63CB399BC73552C7534EB8', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-10 10:24:50', 0, '2018-01-10 10:56:16', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ac18a2b2549b4c1b9f77bedc814eb44d', 'AFD33A58C86020D7291B3AA4969478AE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:31:59', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ac22a110e1de4c5a9f7fb516397ac866', '3FCAC598225424BFC87AC06B97A6EF0E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 11:37:56', 0, '2017-12-18 11:47:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ac2a930cda564534a7980adaf3c86c17', '9C587B1CF6600568271BA7FF14E01B1F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 20:06:14', 0, '2017-12-21 20:12:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ac3547c450714ed682f3656173053266', '06204346317E7608E9D09D9A2BBD26C8', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 14:57:29', 0, '2017-12-27 14:58:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ac3d24bb124a4ba3b37770001eb24b31', '6B1971A7BB4B0307BE0F4F112AED6837', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-17 11:45:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ac4c594c58b34b44ad146ab3f8c4887c', '62A8C0472486F3D47749E0AEA7B1C49B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:57:59', 0, '2018-01-17 15:59:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ac4c77b412a14ea298aac501892d7082', '15930C577ED149F5106FEE3048388F33', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:52:43', 0, '2018-01-17 19:04:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ac73fc1db8c84360a6446a21d85d8dd4', '62648BF82A990102514B978D945B9E9F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 14:06:38', 0, '2017-12-25 14:08:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('acad0a22ec604458956de222212ffe8a', '27C7DB7B95B92704D9E48FD0FC85D087', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:05:13', 0, '2017-11-24 17:16:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('acccc9f250c34f03a9efac3dde216a81', '0ABD65889BA08EDAB9ADB68DC624FEC5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:09', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('acd7a3c13ddd4d14807b7519d940b7f0', 'A2EFC3F54743C96B06FD08200F306367', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-12 14:55:11', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('acd9be43d83e4c67b8934c56de963809', '55B8ABED550D46A75482E2D25F214A70', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:50', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('acdd922c36494dae8e91223bcda9160b', 'A96DE0EECD3068E0349F38B7E094DE09', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 14:45:27', 0, '2017-11-25 14:45:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('acedfc9158b541509bbb7b919a95cf96', '9BC54ABC28AD9E5CDFE5F16A369C007E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:29:29', 0, '2017-11-25 10:36:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('acf8a2de7a3240239c180fb6f6f6cca3', 'E86307FFD6047CB79DDDF764F1042F7D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:09:24', 0, '2017-11-25 12:41:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad0845432cbd4bc8a64a0593e3b039be', '8E3550B248E4BF0698AB1870F49D1412', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 16:44:32', 0, '2017-11-21 17:16:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad19d9aa5c844e3ab32ad82fade0819b', '612A3EABFE2E5FD9082D0DCF2DE3ED49', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 09:17:23', 0, '2018-01-03 09:52:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad23a5b9bd7c46dc978f02af0de8698b', 'B39795AF7DCAB40B833B76627AD548AF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 19:26:33', 0, '2017-11-10 19:28:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad380a61d551490e8642100374f4a56f', 'D0DB110484470F1326A29ACFE23A4F9F', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:58:30', 0, '2018-01-10 14:59:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad49e35baf894ca9baffe3225e68733b', 'FE681D29C2DDA9B9B46412BD6C49FE75', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:15:40', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad4e1a776c2a46abb953dc98655068d2', '71D172DA691D309C8F69484E0979D709', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:48:20', 0, '2017-11-06 17:49:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad56a2b205fb48f78513c6b6f07b9b50', '722AADAE3A764336C0DB116DD3C0D321', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:02:48', 0, '2017-11-06 17:04:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad5b900fe98040aba3fa896c18981875', 'D61ACFB3938D208A56B61ECB5006DF67', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:05', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ad6b4e1f1143429eade56905fec483fa', '7874245AFEACFA003D6246BDBE66E616', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:01:41', 0, '2017-12-23 11:03:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('adb58444b678466190e4e3863b652978', 'DC364672F4281C3621B5AA1572CA8030', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'localhost:8080', '2018-01-17 15:38:00', 0, '2018-01-17 16:08:15', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('adc736aac70046698b9f4962fa85420e', '5DDB4CE7BF0282E7F7BC86C69AC74179', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 18:12:56', 0, '2018-01-04 18:26:13', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('ade4f872679c4b959236ef6dcd302a71', 'FE41A29F66778287C3FD7EB76D07946B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:16:42', 0, '2018-01-16 19:20:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ade5efab14004ce69e7fc359a99b6610', 'F3A1301EFE06A273ED41742C494733DA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:20:37', 0, '2017-12-28 18:20:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ade702fd8b744cb78cb0e7f4546c4d6a', 'B79DBC8E21A1D14ACDDE1AFC9AAEF96B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:52', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('adf49f58fc30479e95fb09430ad28f38', '696348F00F7210E04A4A375728AB65E5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:39', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('adf6c2f7c1cb4d63922a4a3bbaa57a22', '8DDFB4D17340ED666D2A1B06F2BD5E6D', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-11 16:01:30', 0, '2017-12-11 17:16:53', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('ae028a168afb432ebf0ffec1b4fd242e', '603CDC751A0723C8DF793898D2AA89A2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 16:57:38', 0, '2018-01-02 17:06:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae075cd75412490daa6800c9cf881776', '2B7CE432E6EB29287C3C4E402130639B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-19 10:14:21', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ae0c011b35b849119948b881f81943ca', '72431FA014CD00D39A2F73DDB86941CF', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:02:12', 0, '2018-01-02 11:39:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ae27f16989f94211ac87eda11f3b21f0', '55030E48B46F2A36AA8FED29BC7667C6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 08:39:12', 0, '2017-12-27 09:20:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae31978e51e54c998157efa6955c2aad', 'C7171A084B7006BD10A345EDD8F80AD0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 20:23:44', 0, '2018-01-04 20:34:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae32e79502534d2fba85d065f2fcbefa', '38EC3DFCAB6690F2ED54BD181DFEC5FE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 10:51:16', 0, '2017-11-22 10:58:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae3d8e1b7deb4418835ce365e839220b', '51D4FBDE5669A071AE5451054397EB01', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:23:43', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae4780ce2cb540fcbf08c3878885c4c3', 'D520A6548AEAB5AFB960184D45BD505E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:23:57', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ae52aee4df654f8b9f4f4cc832673aa4', '4CF1CB810EF34A5EE7427610F8B7781E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-24 17:27:03', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ae5788bc8a324aa88b957d51c694843b', '3CE34FDD9530C2A6F10CBBC85A990342', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:53:22', 0, '2017-11-23 17:57:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae5b65c47f1a403da037f148532d01d1', '4E0C2C39CB75995C37B3CFA4CF0AA760', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:20:52', 0, '2017-12-29 08:21:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ae8444d82ef44275be1f2ac8232614c6', '97DF16C9F3B17F2696E30AC41DC54C11', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:52:55', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae88cace59384e5d9942363313995495', '48185B9DCB467A12160BD0B94D628FDB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:07', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae8f2e7734954d7e92289a557b0fb1a6', 'BEF9CCF50CFC51DCB82C84F3F26CEACB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 17:05:33', 0, '2017-12-11 17:08:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ae8f874ae494461fba5eedc0a9961d50', '138582E333FEBA935D0C0A5AA5436996', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-10-17 10:07:38', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('aeb133d99c384edea9e5256fdb0c272e', '1EC8E64C73DD174862C46E7D32AFE6DA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:05:57', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aebdc77bb54d43e8a327994960b9fe71', '9BDAD58CEDB91B9BE3C73F66F2307A42', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 09:47:43', 0, '2017-11-18 09:56:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aecc42c9a75641359f09b995095dc510', 'EABE6EB7BF616640D09B7C0A32616B33', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 18:21:33', 0, '2017-12-19 18:29:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aece139315494fd9a83e46a47683acdc', 'F702B67C989AED64102C3FD65F1F8AEE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:29', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aecfb7531e8a4692b34df4ca0ac15972', 'E68BC76D5668EA50A3E3C3422036E12D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:19:13', 0, '2017-11-23 18:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aed3e26e2d8c493e838ff55a5270e576', '2E00F93C4A1DC88B5CFC861787346C73', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; aff-kingsoft-ciba)', '10.55.12.110:80', '2018-01-09 14:29:39', 0, '2018-01-09 14:30:56', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('aee0d4b8143849469e459ff656e9d4c6', '9672B3AD716AC2AE3F1CCAE57E9AF0E8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:21', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aef891cdbe4d43538ac065b9c0c6577a', '93C13DEF3396178852E1CC1FA320DA8F', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 14:22:27', 0, '2017-12-20 18:03:16', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('af011a57755a4ee981c0d2e2dcb68086', '333FE53E2FF780457BA8841DF57C406B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 11:10:15', 0, '2017-12-17 11:13:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('af15b92e2ae949ac8ea21ca04760263c', '046D2BF8FF427F96E98FBC0E5E78E6EC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:30:34', 0, '2018-01-16 20:01:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('af2e5b78ad4f4b18a46ac21443f29d1f', '5025F88B86E37FBD5DBDFAE4C25928F1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:10:03', 0, '2017-12-23 10:11:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('af37570a4cc54fc7bf656fe4907cbefb', '3284E9D149C25DA8E45D4F2D4EE90B81', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 15:00:41', 0, '2017-11-18 15:03:53', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('af7c5da029c4432da5070265359b8ca6', 'A69BE0E37A59CF85AD0F8BBB66E12EC3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 09:03:29', 0, '2018-01-04 10:24:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('af87646943384593867b36aae7d538a2', '1AF3B13F041C0237FFFB96A0C73A9866', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-24 16:06:10', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('af932eb5a8cc40ecb0b748785d31753a', '7B970DC7F21DE09DB93773313E429C65', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:25:02', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('af9e08f32a95409ba53adbdc13e2d044', 'E3A414B3400E5CD67428122C3E19F0AE', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:16:07', 0, '2017-12-27 15:46:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('afa0e8e579144f3da512ea4cadbe3043', '07F96B46E9BF3AF44EA961F07B69A646', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 14:00:58', 0, '2017-12-20 14:04:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('afa2b6434ef3448889bb2e42c09be124', '48943F8B83D4974C502E0DF3FA69BF65', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:05:28', 0, '2017-12-13 16:09:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('afb65777f5c54e4184548320315be086', 'A14E9B1969EA645A947EEE4E0B099027', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:18:54', 0, '2018-01-02 11:56:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('afc9df7b1efb4b4282bce5f486ab3a03', '97CB9B20D7897C5B1AA4AA40A2192D68', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:55:56', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('afd403675e904336949f6f36c020111d', '315F727C730D915E19F817379BB01DF3', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-17 16:22:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('afd506f738e348edae78f62d68c2f215', '349FC2CA0119C089DFE8FFBE054F982B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 15:53:35', 0, '2017-11-27 16:25:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('afde653ff2594512be73b456ab8a19aa', '411B87E757D6A739AECA4A50A07942F8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 16:25:17', 0, '2017-11-16 16:31:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('afe9ca3ab8144c20a2bc9c80d1f9b3f3', 'A3E43E5C578F02C900042DBF2B4ACCC6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 15:24:19', 0, '2017-11-21 15:26:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('afe9e7664c594629b279fc1bc5b06411', '5AB5CD5EECC3843BA4A3434EDC5A8EBD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 12:02:10', 0, '2018-01-05 12:09:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('afea6d3c5e8d40178ba60d6667c51284', '83F4A9D5AAE7DE94FFAE316A073F7B29', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:51', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('aff4c36acc34468d9d4f154e4080975a', '12B353FD36B6EA8687E5527E55A006AD', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:02:40', 0, '2017-12-22 17:38:12', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('aff52460fe5340208b9189612791a826', '14BD8163863DFC7BD14D592C6F5D1931', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:19:09', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('affb351363854d05a909c1e4a21de075', '4C8AF261EF8BF78462C7EB80D3880376', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 16:05:22', 0, '2017-11-25 16:08:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b02021d68bbf408cba5bf34a111d1198', '1BF2E461F8A34266898FE9AC86A30CB6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 14:49:05', 0, '2018-01-17 14:56:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b028011bd9364c28ba99ee5fd082dc8d', '3AFDAF9E017CEAF6256469FAF1B2F706', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 16:48:25', 0, '2018-01-02 16:50:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b041fb73b8ac4de4b7fb3e80ac37a3e8', '860EDD8D505373400563789754FCD87D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:35:09', 0, '2017-11-23 10:39:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b04f9dfb83244460b475581925c9e013', 'D4AB9AA15AF0162D19213671BC18A412', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:46:45', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b08016af8422431e8591fffad6c4ce8a', '6FCD5B5709AD1F63EAD8CACA845AE1EE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:17:38', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b0898331ed8141bdbcb9b6996a26af77', '2AC307BDE06AA5EC93F4B9A681406B88', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-14 09:23:35', 0, '2017-11-14 09:25:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b0b67671dedd4cb89ba448b2d04c2bb1', '2919765A61E3FFE295069E8D206F5C72', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 15:42:04', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b0c96dbdbb73431291cf4bb481107538', '3CCDDAEA2275D415D4643B213FD8CDF9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 14:38:17', 0, '2018-01-05 14:43:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b0da6baee6f74969818688518d597929', '000C3B2ECD35BCCEE425F338011B1D11', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 09:58:37', 0, '2017-11-28 10:00:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b0df1276178d4647bce4bd6d66fe9e74', 'E0465475200845F7032B98F59ABCCD50', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:31:45', 0, '2017-11-25 09:43:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b0eee8f379d94dfab520881e78b2a78a', 'E3ADEBBF3ED686D0F572256241177808', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:12:20', 0, '2018-01-16 19:15:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b0f3e4c3a46e4a76970028462edaebf1', 'CEB0E84698C57D8BAE1240C41B16872C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 10:02:21', 0, '2017-12-25 10:08:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b0fa6dce586a48dead019dc7b38f7a84', 'EFC6515C4E637CB963283BAECC009A72', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:26:29', 0, '2017-11-23 11:56:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b1082cd9f46649ef8240fac23575081b', 'CC5982F34CE76B5694B6F70F1270EED6', 'P12188', '赵星', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0', 'localhost:8080', '2017-08-23 15:21:23', 1, NULL, '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('b10a6e9f91774d0d91a34e0cad0d0021', 'A380E64641287E951DAB5654D39D4DCB', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:36:32', 0, '2017-12-28 10:09:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b1170e97ee724d48a536a9c6817144c6', '616E1477D78F6D9B273E3699F493BC84', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 10:20:48', 0, '2017-11-28 10:24:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b12383e29c6e458383622d390f02186f', 'D2A8D30506B3D75D9E4A8F5015915FC1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 16:20:31', 0, '2017-12-15 16:27:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b137e5e9dc5d45b69de56880223c5ab1', 'D13E7D81FBE452DB61EFB042900F3972', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:49:14', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b13e281fa1b64162bfdeca71d88209c0', '4DB0F55EE5F239619C0CA1A9464BF691', 'Y08066', '靳晓松', '10.211.55.2', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36', '10.211.55.5:8080', '2017-11-10 20:27:10', 0, '2017-11-10 20:27:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b14c0c8895104220b2f299488b91b92c', 'FA16AA46BAB85FA94628CBC8CE7FA295', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 09:25:49', 0, '2017-11-18 09:56:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b14ede7eff9248eb998f8a64a4fa7ad9', '4956504DA7DC12FD89430EACB726EB12', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 17:21:26', 0, '2018-01-03 17:52:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b156d62f60a445f6ac2bcbfbcc670337', '9AA1543BB0DAFA52FDD43C5FE01FFC29', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:25:08', 0, '2018-01-09 17:30:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b15b2214f8604c9a9ced72338b31616c', 'E2377C16D1B1B35EEE561E1075AB0922', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 12:01:24', 0, '2017-11-16 12:07:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b15f3d2e740e462b9141cbded5498eaa', '38D324A54305EE3FFBF36FE7B8832B74', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:06', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b16e7f7ff8ff4ffaab579f364539f8ca', '678845EB9E1F7032999F5C6F1DE37F4E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 11:56:29', 0, '2017-12-11 12:03:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b18b4843ee0a4c48823e4ceac6a1ed1c', '3FBAC8C8B745C004A3823A061749D240', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 08:56:48', 0, '2017-11-25 09:04:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b1a8193c202542b29cf3bdf620415f1f', 'FC510F0C961EFA943FFA3ADA3E770642', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 16:18:25', 0, '2017-12-20 16:23:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b1bd1843124b45b1850d12cfff4e8d8a', '00D544800A0096E9BD7764E93B6BAA67', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:22', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b1d565198a2f47419c48cceeda965d0a', '20FAEFCF5CBDE205224BF4E3CD057C6E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:54:36', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b2390aaa7bf744059e1b13e9299b3fb7', '212D492484A0B8E06D3789DA41C362F3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:52:15', 0, '2017-12-22 18:04:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b26a0ed483764b7c9ed3abccb6713722', '746F24E4CEAAED61E8BE4435EB1DED10', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:34:10', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b27ee5b4cb8447d284a67f60bb3705d9', 'EE0D4D2F6BC570354AA9B75C39F7BC68', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-02 11:01:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b2865a799c4f4989ad94ebd928928e01', 'F83502A4505078940EFACE10F2BA40E9', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:12:14', 0, '2017-12-26 14:13:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b295dc2907c94ea194a16d6ab2d16fbc', '55C5C5D91A27D2050FF357229CAC9848', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 16:37:01', 0, '2017-12-25 17:44:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b2a84f4c705c490f81c0ecdbabbe1b53', 'AD6B0660858BB7D2808EDCF7F4CDF276', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 10:26:37', 0, '2017-12-17 10:50:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b2ab5027a8764610bd25d47d879c10a4', 'B24DEDE5F582043607AB27950E612950', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:00', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b2eec121ede242f2b7c64061e351e6b2', '4447D9245D504081184EC3CAF4780746', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 14:37:21', 0, '2017-12-13 20:27:26', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('b2f16abdb57d43338700012f507f9dfb', 'B3A13C41CEA32C2EAB952E204235E42B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 14:24:30', 0, '2017-11-18 14:26:53', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b3029b8faaef40e18efaff506e71c51c', '7158A85F26FCFAEE4B2516996B68A5B5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 11:48:04', 0, '2017-11-25 11:49:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b31ab5946fd34863951a126a5ce387ed', '68D879F784FB35B80D86163B89D15DFC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 17:30:13', 0, '2017-12-18 17:37:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b32ccf59f7994ed6b91152e15b00a1c7', '39F1E0BC30709397569FA37E64841D10', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 08:43:40', 0, '2018-01-17 08:49:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b3453127ca5340509cd482f13dae39f8', '2C98618028761E67A472C051B78D9ADA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 10:51:39', 0, '2017-12-12 11:03:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b35bf3b95dc148d0a5e503c82f42164f', 'EE6523A02FA6D34F348E4B542DF3181F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 10:34:15', 0, '2017-12-11 10:36:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b366cd847cb34c3cb8e6ff628ea484b4', 'E810BEF844BE570DA88659C3FCB92807', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:37', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b37a3c0278d3438b9a511ba0630a308d', 'D1BBB1B8B45FE709DEE4C5EB7D77BE0B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:54', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b39ae6f056d84aca9ff7125d8a245cd0', '5AAE69A11B661CD32DCA9ECB2C7CCBF8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 19:53:11', 0, '2017-12-13 20:02:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b3a13d828dc844f7b78b7c10116247a8', '2E8B68A2C3895286F7D02CE73B885D5E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:23:20', 0, '2017-12-28 09:53:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b3a378a141f14b9b9c459d5b3c73823a', 'E1C88A1622969AD8806AAF102487D949', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 19:25:17', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b3b9b503fc714c87aa29c2ea969794b3', '3A4D2D9D9CB1EEBEA87A4B9C498F3CBC', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:05:18', 0, '2018-01-02 09:11:43', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b3c698bcfd9946568330c8acbdcdcffb', '26923314924D66215A782F8779451538', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-26 10:56:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b3d02082a8114bbe9934fc81318c0bf8', '30CD37339C495F02E432DC202C1B8FE5', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:20:43', 0, '2018-01-10 16:24:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b3d86dc8cac4467faa9f2d804e71c5c7', '4C4264EB62CCFD193F81E21DD59AD02A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:58:11', 0, '2018-01-02 11:00:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b3e7af74681b43ad9176640d5c55d38e', 'B364D77BE8578982D3305614BB80EBE1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:17', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b3f7ca9e35e8436188d5452ba09bf4bc', '4BDA0C4C68CEB9244838E9096B57ECF0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 13:59:43', 0, '2017-11-29 14:03:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b40db37b75114c7a9b21ed770f00b4b1', '750F55381343034734FC129F4AE4D1A9', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 11:09:44', 0, '2017-12-17 11:12:12', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('b40fd2251a834a3a9ed19bb833d53079', '14F95B8030377060F6302526CB16C919', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 14:52:36', 0, '2017-11-24 14:54:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b4150e4adbf74f12884c74a2d4c001c7', '8715CA9ED89E5083972258AF3E081F45', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 12:00:25', 0, '2017-11-16 12:07:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b416e7d885fa430baa71ea47480ca2b8', '74247A25A1E9E18F93F1DCBEAF3E3294', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:08:33', 0, '2018-01-02 11:41:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b42e70594aed4a758682b4a38af34b94', '82FCC707C50504C9F851078F17E31ECE', 'W07675', '马成', '10.55.148.200', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:27:20', 0, '2018-01-09 15:17:29', '521d08563ab74b8188599be180575bcb'); +INSERT INTO `jcdp_sys_session` VALUES ('b42fb2e1f811475cbf02a8f6b6beabe8', '9449F0309870E8E371E5D1A4E61B1D75', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:36', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b466fa2d40bb4fcfa791599796eb5621', '34D625D0333EB17C11756B1EC04DABFD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:38', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b4979f2afe614c6aab325b28cf773640', '844967FEF42FC9AB26F763898F1AA14E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 18:34:02', 0, '2017-12-19 19:06:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b49dbd79b72d4ec892a730c7d2de35ba', '442FEA40703DB82D1C4C5730179075BD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:46:20', 0, '2017-11-17 11:52:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b49e6d318c9045c4971c35da3f67a036', 'DDC9CBD4E3B39B72BD127A7516CDC634', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-04 10:11:17', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b4a26ba29c734e959516cb7b780ae9fc', '02D43D7D7747233E200CBE9A795124D6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:01:48', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b4b0897639c849169f6718c58c0634b5', '8661CDF44241BA50B143C421BF935E74', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 17:27:19', 0, '2018-01-17 17:35:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b4b0b9671b5149619e6a322808365d3d', '2E19F0F4826059BF218057174E6DA1B9', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:34:08', 0, '2017-12-18 10:42:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b4c2147e32df4b66a85e92451762aeec', 'B1B2E87ACB469FBC17DFCBBFCC56841C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:34:11', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b4f9b868628c488caaf55d72114769ad', 'A35059A4434A0FFB12A5ADBA07FB57F8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:39:59', 0, '2017-11-08 14:41:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b5081d91981648fa905ec2b421981012', '2D08B4F5C9A4E35AD03014FB245F8FB4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 09:35:48', 0, '2018-01-03 10:09:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b50c55c7571442ebacf81673ffd5e6fb', '0DBE73538FBF2FE22060B54F3C673087', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:05:14', 0, '2017-12-28 16:36:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b5205f9825e4402eab94efb67904e580', 'AA576E40D978BC6C60A7EFC57A1BDC8A', 'Y08204', '王利培', '10.55.148.137', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:55:45', 0, '2018-01-09 18:10:20', '25f0fd10490349b9941f8325c1fc8488'); +INSERT INTO `jcdp_sys_session` VALUES ('b53483f850d042ebb4b3f735407d7fc6', '7CA5117EAC3CC997E2FC7944DEA78B1C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:22:16', 0, '2017-11-06 18:23:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b57550226f484f6885af1f76b8ee5cf4', '0498E0964A924C232C516ACC5E2B5FF6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-03 20:38:37', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b57b78f199e84d23a198d38a0c510c6f', '67341A3251495B03D6561E71A65AB41E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:00', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b59130b04d3c43fc8647163f2fd1d450', 'CF30FADAFC187F1165A1743505C63C7F', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:27:08', 0, '2018-01-09 15:29:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b5a27e38f92e4ca3b951499c65da7daf', '40BA3590963E2DEAB4DBA7AB91B0DA04', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 09:13:31', 0, '2017-11-28 09:26:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b5a800ef412143e79fd2287ff8951738', '515420B4BE9936E95E0AA6539D4F9A8E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 17:53:38', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b5ad44068f2b48efb27688fb6c26d1aa', 'F9CBEC581A511F42EE59F563EAEFCAF0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:24', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b5c7e819b5c24f799599d7ed6f68f5c6', 'DBB3D80F614F05888C1BDD896BC7713A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:21:38', 0, '2017-11-06 18:23:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b5cdf7b28ec54a6eb0cb83b0c57c0800', '118F3E17861FA1B2F0BD2F280A699ED3', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:17:22', 0, '2018-01-10 14:48:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b5ce9907362b48eaba5291267cc9a114', '6ACA00100339889421AE35884D3588B1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:29:43', 0, '2017-11-06 17:38:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b627ff5c4ec94ca9a07b36b2159d4803', 'BDC8CD1BB3872A5007796E7E178BB6FF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 15:41:30', 0, '2017-11-21 15:43:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b62f87f00d4d44a3ac97c03d83a77f68', 'E9CF8AC69739806567FD5D2F49BCB587', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 17:08:52', 0, '2017-11-18 17:12:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b6386b52ecca4f1aa327598e26fdc974', '0437BB963B36925DA5A2A491278FAB08', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:07:29', 0, '2017-12-18 10:16:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b645faa20fbd4570b09afe64aeaf566c', '9E98831F8165B9E8D68A7EFE54D4100A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:43', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b649a5a322724941b59cef7d53076ef6', '6C9BFC83AD08B92C4BF53B3DDC9E81D4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 14:59:32', 0, '2017-11-25 14:59:44', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b6517f991760462f8a1133e6a20996d8', 'E2B7AA7B9203FEA0BE490D08991C51F5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-09 10:07:27', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b67a9caa93c8497aaab71256b540fdbc', '2F72FC476549B1A255A6154D33E22FC9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:38', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b6836efee7754f308f080bbf103e7265', '0B31D45B73A5720F532A41B0050C6E33', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:31:33', 0, '2017-11-09 11:37:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b6859713d61544f0a3f46ea12e7467ef', '4A71EA7876140AB9290C525F613D6721', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:11:37', 0, '2017-11-25 12:43:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b6880e330bcd4bd8899aeb3b16edea52', '48F50C68332D7DFBE50C1D8E3B2E4FB6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:40', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b69ac4433bb54144a9e12543824c827b', 'CA85D1459A4144E7F2037185CF09A9B0', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 17:20:35', 0, '2017-12-27 17:56:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b6a3dbbb15514b15855f1abcba9288ff', '0A5F5F2A72444D335A93D366F933206B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:53', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b6aced5346794d269df0b4f8e0bce10f', 'CA15CD1ED6E0E2831CAB8CBD9D7802DB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 11:11:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b6ae9199528f44a38971556bbc1aa837', '3A2AF0C35A0CDD9950EF8B0C49534DE5', 'P13160', '郑雨昊', '10.55.148.134', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:32:58', 0, '2018-01-09 17:54:20', '1cb2fb93db774202bdd2532fa57d9bff'); +INSERT INTO `jcdp_sys_session` VALUES ('b6b1e0ef1d854c3ab071eded04f3ce6e', '6B05DAD506285422AB9748624197412C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:39', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b6dedc188e624da3958f969bd5fab16b', '757522EDF4571535F1E8C5F577A44C86', 'Y08066', '靳晓松', '124.236.130.140', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-10 09:11:54', 0, '2017-12-10 09:13:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b6f940c0c89c40d9b5bad29f60961bdc', '183F0D1BEDEA2E0A4A78626119F0ADF2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 15:43:40', 0, '2017-11-21 15:46:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b70d426d7af04e4b96b5c9c46fac9f31', 'C492CBE26B9D43172B918174B34FCB37', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:26:23', 0, '2018-01-02 11:35:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b717b0fa00304eb9870fe2260c92cc67', 'ABB8F5D3396888F9A9A801B9912DD2B8', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-10-16 15:47:32', 0, '2017-10-16 16:33:43', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b72bcd2e298842cc84ce8139eb5bf347', 'DFC2D44DF868734D7D4EFB46D738D1A7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:32:56', 0, '2017-12-26 16:15:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b72eb25b2bd94a17a732c70a5d6ffb64', '62553063A94769111F37137DDA06052B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 15:31:09', 0, '2017-12-19 15:33:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b73f39225a48406aaeb4fb9aac877586', '0AC58063DACE1627D05FBAD827ABB9DA', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:27:49', 0, '2018-01-10 16:32:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b741ab1aa4e64d14b678cad1294027eb', 'FECCD6F3482DA283E783639C97A838F8', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-06 08:42:49', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b768ee835aeb496ebbd16c2f2d1542a6', '289F3CA5B74D515D1B0C824977F0D316', 'W07248', '贾怀玺', '10.55.148.142', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:32:09', 0, '2018-01-09 15:02:44', '1d8094115f5c4c6ab8c38c414a65d6f4'); +INSERT INTO `jcdp_sys_session` VALUES ('b780d375eea046bbbc59ade44fddd64a', '1D401902EC5D4D9DAD353DB540A65EFE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:11:01', 0, '2017-12-23 11:13:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b78b756ce3d74bd2a08301b497dafccf', '500C39B8CDEC95192F337F457AEB03FB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:18:49', 0, '2017-12-25 09:25:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b79769ef7a0c4464b81c35767530aa24', '69933240D6D08A185EDD840EB6BE5CCF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:05', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b7b0c6b666a14f58a53f5c8ac9496865', '64D6CB7D2CEBC4748E3B3501F3952578', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 20:02:17', 0, '2018-01-16 20:03:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b7b979c7b527478493c098fd6e6d7f1f', 'A7756A34860BCC4F3AD1D87402C14496', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:04:18', 0, '2017-12-23 10:06:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b7cdf9861f1040c086ce1e4a4a9ca91f', 'A2ACD1ADF567836D1518F2855C24A0EB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-09-20 16:58:25', 0, '2017-09-20 17:29:00', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b7cfa5547c5646509f3a80868ed3558d', '40FE9697CDB021FA649656D505A99408', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:44:58', 0, '2018-01-17 19:04:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b7f0fd5fd4c5457887acb850c2b07f15', '22845719D808CBFC145F23DD81270DF0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:38:01', 0, '2017-11-23 10:39:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b81ae6497ec946fea58639e8ce64e31b', '8DB55CC11B7EFE8D7707C1B14B08AF32', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:39:46', 0, '2017-11-08 14:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b82d9e76728b49d0ae5d2c4a773e0b4f', '85FE1D047202ACD354F32C364D82C287', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 15:32:30', 0, '2017-11-22 15:39:55', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('b846b22488b743a1813bf225d6b2d646', '903908A149677925820238A363607C27', 'Y11014', '程英涛', '10.55.148.151', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:14:54', 0, '2018-01-10 15:39:23', 'd9074901d5934613ae09ebb1835f3b1e'); +INSERT INTO `jcdp_sys_session` VALUES ('b84ebd6947e84c95865158d020d315af', 'BC81E5D936E2FE8765A96DD2B845F24F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 18:30:44', 0, '2017-12-20 18:54:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b854e350f7ed43ccbecee92376db4a80', '97D9974EDB9AE4D18770EEB039D9E7C6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:07:44', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b8757662cf59481fbe29a8fa7ae971a0', '72095A2B527E82F556CCAB8559E197BB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 18:57:22', 0, '2017-11-22 18:59:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b8a21baaf9064dce952a73f9f3f6d190', '4EAE79AD5F15947619DFDED629D794F7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-05 10:10:41', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b8a3fd383b0044f7b1a013cdfd64d45e', 'D8A32B67573436F6DE181E5EA8CFFBD0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 08:49:11', 0, '2017-12-09 08:51:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b8c22f77b3a54f768a2a94dbd4650f34', 'EF9BAB1677DB860CDC7828B044EFCAF6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 11:40:02', 0, '2017-11-29 11:48:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b8c8c2bbf0b34da3aa12092e5577a417', '4CD52B6A91F5E3DF8AA680371BBBE8A5', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 09:20:17', 0, '2017-12-26 09:53:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('b8f3d76dedcd4d26bc98d443d634abe9', '33ECEAA84F0D8BBFB0D96EB2EC488553', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-26 16:41:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b910cca8da6341d19bf0c08e86c204e2', '1C2A2B866BA8772DE466C9FF3D31D2C4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:38:08', 0, '2017-11-23 10:39:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b9128430409c4301b97d483417a163f6', 'A03693933348F9A9DDF94E7E9F5A93FF', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:45:46', 0, '2018-01-09 16:16:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b91db53131e841dc8fef88927808646a', '5CD4432D6066D3D30675B8F9EB83DC1D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 16:53:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b921b383764149ec9e7c71eca144ac83', '3B6A0B4AF478FE0A0B1FBFDD72D6050C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:01:11', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b94302e61a6d4b2e88090b8bdc715327', '0FE8C465AE62C6F47F055DE7A635C93B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:27', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b944a773b23b43d5ab606846e23e7afe', '1D4C60E8B37F2DC65080C198DEC521F6', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 14:23:40', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('b9515030e386488281503a94f65f7c71', 'ED7F7A73EA853069679DE74AB425196C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:38', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b953cb2e0db84b18a6c115fb38370650', '29172EDF5AECB001D43617E66C72F040', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:35:06', 0, '2017-11-24 19:33:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b960a73fbec741298ad0acfe7177a63e', '4023ADF7A1F058281727BCCC43DAD6B7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 20:15:34', 0, '2017-11-10 20:18:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b979d79bc6934121b162cdadeb35da1e', 'CCFBC7B86AF1E10880DF5FDC7F2B2297', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 20:02:21', 0, '2017-11-28 08:32:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b98d62e277f748e9ab30665a68ccc1f5', 'EF5888B8EE303CD3126BD88F670A9F2B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 17:17:55', 0, '2018-01-04 17:26:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b99c2e205fce4bacaae83e1c2d791945', 'D7EC0D566988503B41182042E2A28599', 'W06555', '王晓明', '10.55.148.231', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 07:54:30', 0, '2018-01-10 11:21:21', '340fe94b0464472e88cc0fe7065170dc'); +INSERT INTO `jcdp_sys_session` VALUES ('b99cac773b9542b794197b322b7e4d3f', '7C8C79F63AC3B69A033FC35A9E6A6BF1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:52:18', 0, '2017-11-09 12:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b9a6d1a81fbb439a9060c3f8e26ae4cd', '3CE7562291DB4DFE3A0AC67D13CAA49D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 09:32:29', 0, '2017-12-09 09:32:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b9a7998524f546cd84c8bdf3bb5d7747', '8E72CAE074A42397275CEA3A916BBFB3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 19:12:46', 0, '2017-11-10 19:14:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b9f2df5f69c946918611157c41696a86', 'D974CBBAF0B6D7513166D5C69962CD9E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:22', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b9f4e0f26fd2494dba6f40ad089a036f', '0D1ADE673564A84AC15AB238EA430D6E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 17:09:06', 0, '2017-12-12 17:14:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('b9f55606457c4233b99872a0183345f5', '10EF8A6BC298A105554A18F28C89D72E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:55', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ba0b9ee21df7479687b17f828e2e8d25', '3986A78DE128AF1885DFC5B1CA0768D8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 17:22:05', 0, '2017-12-19 17:24:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ba1b976a43e14d5d83efec277aeb18a8', '99436FDB816F6822D1D1D8669ECA9FC3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:43:23', 0, '2017-11-22 17:44:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ba28e4aea9e74baba2ee3d7f7c0c7435', 'DB3D7E1F06FF8A2F4B849DD8BC7F3241', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:08:43', 0, '2017-12-12 14:14:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ba28fce9f2d140faa49cd4f94aa89e5d', 'B533ECBB59EC39CB57123871F16BB15A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:53:30', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ba61f8f3a3604c1289645dbbda4282bf', 'BFA7DCC726275973E86DF608328E2BFF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:37:50', 0, '2017-11-23 10:39:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ba6a0c8cec014d68b4f6a0938e467937', '047822E6C11120B4E17A08C78B5D5D11', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 11:53:12', 0, '2017-11-29 12:04:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ba7583278ecc47f68291aae74707faf1', '6D9E42A24A4F46A62EF2002F8FD3688D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 17:04:05', 0, '2017-11-18 17:06:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ba78e68d35a745f58344c1b1c0583fb4', '7B1A0D9CDC6D5968CED7D3FACE21DCC6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:17:51', 0, '2018-01-17 18:28:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('baa08e346329467ea89d227074d47155', '24ADF58519D320635D5625A964BAF1D5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:29:38', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('baabedb9c79b42bebce57406ce9f3040', '243C835A91EBB0F9A2680D17615680B6', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 17:21:26', 0, '2017-12-25 18:06:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('bab49030ddd04f8c94d3f0af6ceb1c49', 'C7179DBBE082345A96D42BD544DF56C7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 16:07:00', 0, '2017-12-09 16:09:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bae1979420f64accacfe7657d5d7aec5', '4690B1D652515CF358DCDF042654E74C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:11', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bb04fe2691ab483290bd8b4e0fbc50f4', '5B6F4414ABC2DD09C0ABF106A23A54D1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 09:29:51', 0, '2017-11-28 10:00:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bb0d893c455b4804b2abc89708507ed8', '0067538333F8EB3D6C3A3E9F55D1D982', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:53:30', 0, '2017-12-13 16:56:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bb461ccde0dd4df396b297fee5bf0ddb', '49A8363B6480182A56CD19587D178A62', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:17:51', 0, '2017-12-26 14:19:22', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('bb463b2a995c44a78446f47d2b593505', '0C827BBBB8B0DC79A971BF69F7316CD6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 14:14:16', 0, '2018-01-02 14:35:44', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bb56e537496e4f7eb35cacb1deefe587', 'A5BAB1407709788DE7CD8651A552FFCD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:36', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bb72e623913b4e549ebb4cde86d67cda', 'B508DDCD3A35BE161A8ED9E499D2702D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 20:56:21', 0, '2017-11-18 08:31:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bb772609935241edb431eee05832025a', '4A4A828831618283443E55012F8031BE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:00:57', 0, '2017-11-23 15:31:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bb9174bfcd0a41e8aa01e06150810499', 'B3D1A753F3B00F9D1EF665D8697E7992', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 09:26:44', 0, '2017-12-27 09:58:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('bbac2e9fb9364ac08ac89bc7b40af42b', 'CC99C64D74CC3D7FF3F20D24ABBC05F8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:49:46', 0, '2017-11-25 13:26:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bbc611c4cadf41719e15b0d9f48320cb', '7C30A4E40D401D6BF58CCABF7F3E6625', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 15:30:41', 0, '2017-11-21 15:32:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bbd03380788e4c12bedd04381f56f869', '6ED2ABE2EEF88C7491AC08CE97B82E74', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-24 16:20:25', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bbd7e2a865704012b62b6fb22c4e5876', 'D38DE92CAE332B7866A8AC407D9CF09B', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:58:56', 0, '2017-12-23 11:00:01', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('bbdd5c96fb8144d58fd053a6035aa395', '096091033AB6E4DB6970F06B8A8E6352', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 17:37:38', 0, '2017-11-21 17:39:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bbf8c2fe3dd44c2c9538208a1db5b992', 'E4B1BFF7FC1E86395B0C90E80C7CCED7', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:21:15', 0, '2018-01-10 08:53:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bbff00fde50d45eaa971baedb3654df8', 'FCAEE6524DB3E8DC27D2F78E6272896D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:48:34', 0, '2017-11-07 14:55:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc0069cd821a438d85edf336c23a4911', '8A6ECADD9066E3C608FAF2F5A40E3A85', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 10:44:27', 0, '2017-11-17 10:45:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc084b3531344850ba93d673a9fefb44', 'C20C43B836E49DBA87CA66715DEE7E7D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 19:14:48', 0, '2017-11-16 19:43:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc0919f86ac4481ca76f9e211a6ff9b7', '7B8E6D89B49A446C54B7C0C7DCA607CC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 12:00:44', 0, '2017-12-17 12:03:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc1d03ea1de64455a63de733f1e33642', '677594A3F129EC00F161F9826C9536FD', 'Y11037', '宁志全', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-12 11:00:11', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('bc37038848ba498dbdb8b9eb917f34ca', 'B7FCEC8C7438DD34CF0A8A250909C7FC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:24', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc45012c70f0465daab71e01344e7696', '4EC519050A77D592F436106455E785A7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:40:14', 0, '2017-11-08 14:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc55ae2010d74834a4164fa067445c38', 'FCC50DC84FED3ED650692939AE07CF96', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 10:43:15', 0, '2017-12-15 10:56:14', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('bc5d26d1110043649b19b853453cc77b', '50C4A57F9608603710D114EE4AE19B2F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 16:54:08', 0, '2017-12-20 16:58:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc60478a77294522847f6f4c3b46cdf1', '7239DE5BC2C4B35C944E1CD15BEB3D8C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 20:24:59', 0, '2018-01-03 20:30:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc721863159e4bffa12658bcee61a9d6', 'FA6AB818D341491D1C451B708D48937A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:34:11', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bc8247991d1949729146d6bc3532e488', 'E493A116B5AC5C452E50EEB451CFD3EC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 10:56:17', 0, '2017-11-24 11:00:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bcaafab8b0c34de792ab76649d33d52e', '45AD47F83445EBAD06F47C082A8EFA45', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0', 'localhost:8080', '2017-08-10 10:47:49', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bcbc3bb5e6464f2faec56fc27fe1217f', '480F9FA70439841FE27D6C4AE0528DE9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-31 11:42:05', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bcbd237134494e3a80e1ab75cd92ccb2', '01942F92CE7C70922B1D4085E2A1B41F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 14:58:16', 0, '2017-11-18 14:59:53', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bcc0213ea2e340a49f86b7ad7ae2a357', '06D0527ACDEFC6180614AEA45DE35896', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 16:52:54', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bcd1e957bfed4edc864af84b7bf06099', 'C8F0296C35719C08A3CA655A17013F88', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:30:05', 0, '2018-01-02 10:30:15', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('bcd4b61d396a48869368ac6177980ff3', 'B15F2125472A67F1E3587E36B60AE57B', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:43:31', 0, '2018-01-10 14:44:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bcdaf4a0f650400981632202e080dbd4', '48C76680EAE987F9D890E91776F67E9A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 15:21:03', 0, '2017-11-28 15:55:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bce71b68f74948908fe492ecc67100d3', '8F90948B2D13110EE32304AF3A7F536A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-16 11:26:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bd1a825deb5842a1b796dac10b8dd05f', 'C41495E59ABB53D6BA14C7C537C155CC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 16:33:39', 0, '2017-12-19 16:36:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bd3c13b914f24ec19230d3763df9387e', 'DE8587718B28F57C6FA8DDFD64932907', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 19:30:31', 0, '2017-12-27 19:32:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bd7496525047436294fb68b9c51e353e', '4DD0EB0610C4949E53292BACE55D3D00', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-09-20 16:58:21', 0, '2017-09-20 17:29:00', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bd76aaba83bc4eefaacc56108548b473', '8C31B78ADF2D57551AAFBEBD8FD643A8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:21', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bd83b4896cc54c0d90fa85cabcb9b6ee', '2D6C520A6C0DB96116F7EC135BBB344C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:17:47', 0, '2017-12-28 19:18:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bd9d0b8afaa14294a86e471f51bf3ffe', 'C8EA96C7439A0AF426D085F8A2FF77B5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 15:34:59', 0, '2017-12-22 16:10:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bdae3c1dc35341bd87ccbd7bd285c30b', 'A4D4CC18E6D6C84CB7DF73EE8FA1794A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:30', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bdc2b29f36d940e58345f32e02c8acd7', '41A5D71E1674F1B56213EF7D190F383F', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 11:20:20', 0, '2018-01-09 11:20:42', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bdc67a28132b45548b53d0d872dffee0', '343247F42FC4CD01C943D2327DC15A6A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 10:20:10', 0, '2017-12-24 10:24:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bdcc120b37e74ac38c0b6a767cfb59d5', '2BA380E1DBE77D9CC7A963DD3DB7F539', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:12:10', 0, '2018-01-16 19:12:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bdcdb48976584d56a2fe00a562e1a661', '57E2CEE9791D99A91A9A2D03BD9735F4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:55:29', 0, '2017-11-23 15:25:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bdde4d6283024c508191a8b5a2e4235d', '2F25A8AA93EE744CB460FCBAFA56D7AE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 15:48:58', 0, '2017-11-27 16:22:53', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bdf1805ce64146928627b871e199a449', '49B0DB72A698690889DC8F46D4EBE4D3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:50', 0, '2017-11-23 12:04:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('be196e6c36124de1a33667b7a0b2e82e', '5E22B80A01B2B27CBE003638FA880C79', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:22', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('be204a26ef79494499c1301242e46f1d', '1757B3C3DBF0DFC8B30316089050B0FD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-06 15:59:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('be45b7328c0a488cb836c8531fe8a1b5', '91F0AD74375870E23BE9792BF71296AA', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-02 09:28:09', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('be4b67e55d80421aa7406a46d547e834', '01C4F241DD09BECE374BBB1E16304A94', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:01', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('be50a118698a4c19866efbdf19f962e7', '6DBA0ECE0498FF6BADB1F041BDCCED66', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:38', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('be6b3fcc3aa04bccb776ddb685d0ec19', '7F649F3FCC7BCA08ADF157A2BA20677A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 11:39:03', 0, '2017-11-24 11:58:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('be75372be1a74b3faef0a4fc2ed6d629', 'F180DC0FB7363FA1FBC85BA1D84DE83A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:40', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('be8e84cbb7324a1a9cdcb0cd6d038b91', 'F91D6574036540863CEC29B2987501E1', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 18:30:01', 0, '2018-01-04 18:32:13', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('beaf35dcd2f443bca829bb652018c060', 'D906421E5D98BBB71DB7B9AA0AFEA6C8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:55:55', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bef6eedd7e214589a02fed374a6ecf77', 'C5E76F80F5CDB4E4C65360BE810AD193', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:31:01', 0, '2018-01-10 16:32:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('befacfc2fe2546b2b234b2ed34de6e76', 'E960689229E46C6356ED9AF6291E3BBF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:56:05', 0, '2017-12-12 15:04:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('befc0b1a9574405fa65e1ec80f589cf7', '3505D71EF7F577FA3374FE292A224DED', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 16:11:21', 0, '2017-11-25 16:13:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bf002b8145014af8a274f2ed49a79721', '89D2C6080280A19C43F56D89AA2CD2B6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 09:12:19', 0, '2017-11-29 09:17:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bf05546bc1d94f02bc22717ac1a9c12b', '1AD0A15ED4683A5EC0292C441717786D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:37:19', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bf0783ba9bc84a55b158f9e95fa31c04', 'EB86748476B86514CA4E2701D205B578', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:25:43', 0, '2017-11-06 16:28:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bf2324cf323d42b3a587bfef562d1661', 'AE920A72EDA580453431A475DEB9121C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-28 09:08:59', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bf27190edf944fb4a262dfdd80f28287', 'D29A8BF649C5142A390604DC07A75789', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:13:36', 0, '2017-12-22 18:43:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bf50662fdb9a488ca37c043c22a851aa', '2D29F7BF8CB9FCD3CA359D1B078F1CEF', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-10 19:33:25', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('bf5cd3504e1f4e159d16e27712dcb31e', '2EA74F99738EDEEE2A27938158F30733', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:52:05', 0, '2017-11-23 18:59:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bf5e7ed6ed3e456489accec5990f8deb', '15465F0FC00025BAEDDA4EC9AAFB0FA0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 17:14:36', 0, '2018-01-03 17:51:28', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bf6d761572714c9eabe6a8bca772ccda', '3E4B09F67FADC4A9E363F745C0A1CD65', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:27', 0, '2018-01-10 12:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bfa029b855a449be8fd78e68fdb9a77e', 'D188813F6D69B8340DAE9ED6EAF7EBA6', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:03:44', 0, '2017-12-12 19:09:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bfabf197b1d9423bb92f74b115c08736', 'AD142BFBDC28A77B9730CA70B36D17E7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:29:45', 0, '2017-11-29 10:53:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bfad96ecfed14c45b4fcf83f24ae5f98', '3836DC7088EDE2E1DE161BD4C6A03C66', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 17:18:32', 0, '2017-12-19 17:24:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bfd6361550be466c9d51dc36024b6435', 'D1D3E5E9091AA058E23F8D584BDA2E2E', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:13:02', 0, '2018-01-10 15:25:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('bff33e3d095444e3a1e3c365963ee22e', 'DC00C264C83A32EED09D5EF7E861239D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 17:00:53', 0, '2017-12-15 17:03:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c00b788baf734b7b97fbf31cc402024e', 'EA85A4847984403B796D72C43E695388', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:58:17', 0, '2018-01-09 18:00:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c03dbbf9eb044eaea47ff45c2adc5d4a', 'A7021ABEA4227FC273EFC48140CE56FC', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:42:49', 0, '2018-01-10 18:21:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c059356ced6f46b8add4096599c0f843', '8256C4F86395267BAAC55BF28915EDC6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 08:49:03', 0, '2017-11-23 09:02:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c065a7c13f704f5c9c10582aa43047a2', '74B093F1D275E822BDA2EA5A9394B365', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 11:42:27', 0, '2018-01-05 11:45:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c0cd8cb70fa14ce28b433f40c679ac40', '517A77DD7D525969DA2CE23A749FC623', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 14:47:21', 0, '2017-11-16 14:50:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c1025151f78b47f5baf37a0da828180b', '9ED637B758C41B9CDD4F9FD3DF621347', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 16:55:08', 0, '2017-12-18 17:26:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c13b3d8b0cc747489e6e7a208e428fed', '94665956EE8B88DD41E152547CE3F06E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:42:11', 0, '2017-11-25 11:10:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c14e5b34bdc74be88c2f3dbe0dedbbd4', '3B27B7E1AC82F072B136DD439D3289CC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:51', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c15abcfc1f234d27baa0e5190173ef52', '874235BC14EB58799F494FC1818589E8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:35:51', 0, '2017-11-09 11:37:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c16ba08ba95445299294f57cb094d8c2', '780F96F4F7AA6D2DE5E431BDAFF6907D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 19:37:44', 0, '2017-12-29 19:43:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c18a4450b2454b80bb6964f81653c96e', '88E1EC9B0B6ED79B8395FDC2C3025C3C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:01:48', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c18dd2054ce8440881d3a6c2eded05c5', '54C1721F3BF05E60F5A5155E58FEE24A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:48:34', 0, '2017-11-24 19:33:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c1908f275ac242f7a4f8210bf111f226', '9721406438657662939A9640A46E12F6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 16:37:43', 0, '2017-11-17 16:47:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c19b3fb53d614e6c98b032558714bdda', 'ADD8AAD7CA75E0422C301CF468BA0A03', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-13 08:39:08', 0, '2017-12-13 12:22:23', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('c19c280636be43e994f1f411b96cbfd3', '79D0A4695CC87EB6A7C975358E4E1F06', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:27:32', 0, '2017-12-26 14:28:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c1a1536001304e22ba29e5d49265383c', '417F455421998BF6D3D5CF3757E6552B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 15:17:35', 0, '2017-11-07 15:29:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c1a225b8e9874bf4b1d528c94d28552c', '32FEA34A7A284D4CED4213725E5137FB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:22:07', 0, '2017-11-24 17:54:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c1a7eb2ee9bd45488261ed7e2dda2acb', 'C85CE06EC4F0961F8BFCDDF4C0C5BC18', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:30:12', 0, '2017-12-26 15:32:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c1bf22357f804b1fb4772d156e66ded0', '074D0B6660BDF006FFC35BA62C03CED3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:19', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c1ca5c395330401da9461c612b5ac0d6', '44686AD77B1283C6E088A037ED500064', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 15:44:55', 0, '2017-11-21 15:46:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c1d592db81d548cebb7f15fc0b3d1fd8', '9C7A991536681394F1FD60AC03E42F46', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 09:46:12', 0, '2017-12-09 09:47:56', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('c1dc2ea92fd14d48bbe411eddb6e7553', '99E71768D3B099DF7F28C3AA5D8D9280', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-08 17:20:10', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c1f3bfb5b269482caf104332088a339e', 'C817D1F2D42AC31C04866AEA1A0F5DD1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:05', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c20816b87ac34a59b63c731be2a832cf', '63F32EBA413473CB1935069CE5F29803', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 15:34:51', 0, '2017-11-29 15:48:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c2145d26a00442fdb0844d2a01f12b7e', 'AA0640787F559FFD74EB9C48A7858332', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 16:57:43', 0, '2017-11-16 17:02:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c234fa7f4fc1411ca4b47b3b60673b11', '123356F51225A00D1568D2D6A10F62E2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:32:08', 0, '2017-12-28 18:32:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c23ecdb4af8d465e8ad68700feebf368', '5A9CAD26FCC9C2C2A6DCF3D75D6A53F7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-24 15:48:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c24c3379411e46b5bcaf57bc9b964c5c', '0026FB3296F4CBA52F471AC748BDCCAD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:53:41', 0, '2017-11-06 17:54:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c27d79051c3048159317fe4e2bf94942', 'A84B74CAAA4157E0812A5AA3C33719A4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 14:07:14', 0, '2017-11-18 14:09:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c28dde55e2244ae3a35b515533f2b04b', '86C70406AF0A7EBD571BBCA895F13607', 'Y11037', '宁志全', '10.55.148.146', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 18:12:23', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('c2a42090d4f74ddda4ba5b970f552a8e', '0E769543DD7E2B15232E68C5CEB6A9C2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 10:39:16', 0, '2017-12-20 10:44:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c2a76a86a03b436eb39e749cac774b94', '98819C9DF9AFFF375BE664539AD77409', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 15:53:08', 0, '2018-01-05 15:54:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c2bb1b82270b419fab33f6c1ed73e669', '401113B1E7519A69C0BADBADDD5F6194', 'Y11037', '宁志全', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-12 15:17:52', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('c2c136106b8845a0a5d23335677afae5', '0C34F41BB0F3F0DC1E861C0C8730499B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 10:43:11', 0, '2017-12-29 11:41:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c2c16293444349ed8990b81c26e08d83', '904172F27AA0B451EFA2EDA4B55706A9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:29:10', 0, '2017-11-06 17:38:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c2c24ab90baa40cead1bd907ac7f279b', '9CBCE2C1810A2B2470F55ACD53756299', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:20:52', 0, '2017-12-22 18:20:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c2d0fbc0a2b2445f9d943eee316a1a86', '21880DA4449D7551ECB29595B939CFEC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 12:04:20', 0, '2017-12-09 12:07:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c2e240fb085841daa8683cf0e3ef85de', 'CB3482954030CDC7C5A6DDAF71E1FD7D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:25:17', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c2ea3bec95da474596a724aea3bbad71', '4F5D8D15482383C405F4A626C6EBDE98', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-10-17 11:00:19', 0, '2017-10-17 11:30:50', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c2ed9c5222554f0caca9167c88d3082e', '7BF9620EFDBDAB5559B57CA19A804166', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-20 17:35:11', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c2ee3d32dc02441f8fd59013cd473118', '9592A44FFFCC0B68EC7C7D481924D348', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:50', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c2ef61234c844adfb6d6468075d0521c', '8752EF0F99A949C31884BA68236C688B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:12', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c30451032c1344499927a275e696c5c8', 'D334C2C64BFA647B1760E3B60EC4F832', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 11:54:51', 0, '2017-12-27 11:56:49', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c31b54121e0648099109385fea64f409', '62AD77295F5D85B8F26137FFF22544DB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-11 11:01:35', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c32f689ec53e4a2f9f85d4f5d6c76384', 'FDD15F24544E2E594F4F3432C5779B7D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 10:57:47', 0, '2017-12-17 11:00:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c3accc4cddb444468eb18d0b4063c962', '233618C617ADB035D1A245A855BE543C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 10:22:47', 0, '2018-01-05 10:48:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c3c4af11a55442a49f55dac6cf836b16', '0270591B99B75B6FE4BE4DC1871F7B9C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-25 08:21:53', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c3ef417305e648f799ab73a26336292c', 'AD572C5DE15726449266498AD935EFF4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:27', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c3f7a2fdaecf4ef6a67a3e8a4fad2af0', '0A75A293ED7CBC8AAE7BDAD0A0BB59EC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:44', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c40b586e443e4594b8fb0918074b460a', 'B707B05BECD87C17EEB18B64155D3DBA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 19:16:46', 0, '2017-12-20 19:30:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c40dcf5f982648e0a0b2ed8a63e1e40d', '099CF5CCBBE8305BC7A1D1B240F77AAC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:01:28', 0, '2017-12-23 11:01:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c4130636482d49d7a6a43041fa4d21bb', 'B83E6A7BABE49C426F19820D2109E6F1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:28:59', 0, '2017-12-22 18:29:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c4287c380dca4ebca463295ab1f45137', '34B78CE90BCA76AF7B610A172ED17713', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 15:04:52', 0, '2018-01-03 15:42:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c42af443ed3042ca9f798d1697bf3ebc', 'C8EB10912D4AC69CD49749583B47D9D2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 15:21:33', 0, '2017-11-21 15:26:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c47163ffd9924ed387cf2eebd66b70e8', 'A43BB34C4BE101283089718E8C3C55C5', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 11:48:04', 0, '2017-12-22 12:25:10', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('c4a3991afde74a7b9a426ea10701b444', 'D793B061F4BEF938F7B0CDCFA22D7507', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 19:32:19', 0, '2017-11-10 19:36:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c4a67a22d6f14b66bb65501b2058f33d', 'F5DACC64AC9728A0B5ABD2D650E4C864', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 16:55:32', 0, '2017-12-20 16:58:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c4aa93db1c83415fa156eeae5b78eb39', '3693679F6A52971638AEC899BF9D15FC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:18:19', 0, '2017-11-25 12:43:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c4c7c07baa524b9ca070d74406e36e6e', '285FEDE110B15058A02E2BFE0E7AF7E5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 11:26:39', 0, '2017-12-12 11:29:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c4e105124c554289a40991c6751e5f15', 'A9CADA80C7895D160BB70D9130D5ECDD', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 17:40:56', 0, '2017-11-27 18:18:09', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('c4f90fb17be043fcb91d9f1fd65bc23d', '2E61F28DC38A92F98FF5EE217E2F4205', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:14', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c501899df48243779fe86fcd49a1901f', '2BB836E8EBE147B397B9612FF43B22D3', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-03 20:05:26', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c50823c6c31e47428bfc0def3ba35928', 'F3CB88A5400B8BC31CDE2BD804CDC872', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:29:37', 0, '2018-01-09 15:36:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c50b09a89cbb4e40a369773badb581c0', '480310C6A4EB4287A28D1F49FE97E91B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 16:17:14', 0, '2017-12-19 16:27:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c51329df7eef4d10acba4b131c2ecada', '9BF9E02375270601B49E77BA3A5AA9B5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:11:52', 0, '2017-11-25 09:14:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5154463bc06433d8a36477873900c1b', 'DBC45092AEE35EBFA353929C59AD3E6D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:53:59', 0, '2018-01-09 17:57:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c521118baefa45f6a00f962bc71b15eb', '98CD3F301431ACF3544AFA84F8AF9906', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:45', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c53c85b2f2604ee8addb0b18cd1f8405', '5BCB02AE59549E64F17D84727B5FCE84', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:59:39', 0, '2018-01-10 15:02:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c53cad1017c74062af6c4f18e6b2c263', '13387EF070EFD40DC09230286C1F1BE6', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:14:13', 0, '2017-12-22 18:14:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5585f17c4454ab78bcfeba885457dc6', 'A757381F54CACD9CB3E391DCE093E957', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:32:26', 0, '2017-12-28 15:05:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c57ec2aad3a3487e876524787b94095f', 'C8DABE30CB7F6DBC40D23C2F17985C5D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 08:40:22', 0, '2017-12-26 09:15:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c57ececc70624d56b81744ee323425e4', '98102679D50ACABD1BEC65C81BB6FB9A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:05:11', 0, '2017-11-25 12:38:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c595cc40462a4d7baa0161f7baca1dff', '7FFDF26366833879996E025169DAA3C1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-04 09:43:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c5973870e90c41718b0f6cf3b0019378', '0470BD99523904E2193DF06C3AC3C5CD', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:34:51', 0, '2018-01-02 10:18:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c59a52dbf3b54b028721b8ae5b867402', 'F2EC0640093CD2DFBC3DD93672A4AF59', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:15', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c59f2c57ca044134bfd8402baa0a30d6', 'AF4AC547A5B2427FD7DFF118F952B4FD', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:58:10', 0, '2018-01-10 15:02:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5a3899ffa9b41909d7a0303ef92b677', '4F7FED928FD92649E194B7DFA1325894', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 16:54:59', 0, '2017-12-14 17:01:02', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('c5a4e1af52254c718ef96ca5b6653797', '3564A52D885832B35061C28A2A9DB5DF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 15:00:10', 0, '2017-11-25 15:00:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5a8d61342a14b5ca8fc3c8151bd0495', 'C7DD84DE26B2CB8F2945DFC558A4A20E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:19:47', 0, '2018-01-17 18:28:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5ace43102fc4c499c2bf437a8835805', 'E33D10BDDFB290B81479512E2260FDEA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:23:03', 0, '2017-11-17 11:24:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5ad08ca5d8e4e36b5e8ba90fc39644a', '42255FE53DE10599B32BA40A2D88F6E1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:44:20', 0, '2017-12-23 10:44:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5b8a24e61c549d4a94863432a4e263b', '52261BD80A66E943ACF9CD1EDDF2BF97', 'Y11037', '宁志全', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:35:49', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('c5bd70b315ce47ed8fc3031acabbf0d8', '0AB452870E1A8620D9C9FAF24A090014', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:48:22', 0, '2017-11-06 17:49:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5cc2e33fa834324acf403faf3718305', 'F85DA337D2D5EEB3A3CE7928718F6F75', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 17:20:07', 0, '2017-12-25 17:51:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c5cec8941ccd477bae756ea9ac810834', 'E8AC6A9873B67FFD8A0B22DFAAA592D0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:47:22', 0, '2018-01-02 11:49:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5e6a90bcd0942169ca75d1468385f3c', 'A878F0D1AE3851623CBD5F3CD49072D5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:10', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c5f0aab95ca446acada1f3b63909af37', '568B99A7ABFF365EE52CA60E12930DE1', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:11:48', 0, '2017-12-26 14:17:51', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('c60411d219974bbb93591e99f0f5c0ad', 'F527107ADC087CF25E49C93B6B4790A8', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:27:54', 0, '2018-01-09 15:29:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c60fb9824e8f4501afd6bb57e4b723d8', 'FA25D960117B4B0DF520564EB4589413', 'Y11014', '程英涛', '10.55.148.151', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:02:04', 0, '2018-01-10 11:26:21', 'd9074901d5934613ae09ebb1835f3b1e'); +INSERT INTO `jcdp_sys_session` VALUES ('c61cf3bec93746fdbefaf7f49833aa02', '3071BFFE346D324F78DA01847094C91D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:48:22', 0, '2017-11-06 17:49:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c65309f480fb4599838133e6549d82f7', 'ABC19D7BBDED9E71C2C9626C3EF780F4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:05', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c67ba5409d1241fd886e6f6879a596b8', '45B5C66B800074A952F3B309FFFDB392', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:15:04', 0, '2018-01-10 14:46:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c685439a1edb424db0953eedee968f1e', '3410764C9FCEF56F861C20E6AF06384F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:39:44', 0, '2017-11-23 18:44:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c688cd6c25074248aaea59348d02f9da', 'E1E65994AF55E1F6B6E752C4FA7CD2EE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 18:14:01', 0, '2017-12-20 18:26:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c6abcd8e7eed437aa9859ffec67cbe7b', 'DEB100E2A6572361FF471958C6EF5CF5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 10:57:31', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c6cca45f324e41fca982065618f0afc7', '75D8447181F267F7BA5BED58BA39EDBE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:57:54', 0, '2017-11-18 11:59:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c6d320d9ab0a40058ab1b9a4b842cbff', '6BDC74CAE3AF44F7D123AA2DF9149FBC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:29:51', 0, '2018-01-02 09:38:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c6f17659f55b499391b6682923d6748e', '837395BAFEA17562FF643D9D643C0B29', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:41:32', 0, '2017-11-23 16:11:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c6fa46f39deb4f3faee0013a4054d762', 'A215CA943F85701206A734562FFD997C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-13 18:57:11', 0, '2017-11-13 18:58:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c6fa8e6831ba4463824949e9be710161', 'C16A501BD9A7CC7916D4CA512BDD36FE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 16:17:35', 0, '2017-11-21 16:25:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c713fbb8df01485dabf315be79e02492', 'EEBEEDB816B0DF165D6814F3E5084D1A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:04:34', 0, '2018-01-17 10:16:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c71c0c2fbc6940d88085e735e2055714', '5EE3275F7998F04B6584C67E040953CC', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:41:22', 0, '2018-01-09 17:44:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c71d98cc50ef48d89cdcf0c17e8222c6', '1FA47BB7D2376F541AC839B0D85DBE05', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 17:14:52', 0, '2017-11-21 17:17:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c744688cdc214931ab8facfc447ad01c', '480F5CF2A065FD7C69A1725EAAD8832E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:21:39', 0, '2017-12-28 16:22:06', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c74a8cbe53e9480fba3fbb29aeb2bb35', '560A8D7C9B61057F3C9F2F608F2113FC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 14:56:45', 0, '2017-12-13 14:57:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c75bbe4d2b6d4d95b9e782d1a6169ea4', 'D48AB319082E1225471374E4E46700D9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:26', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c75f5059d81b411093e343973503e4c2', 'D693779E5CCDDA562DD205FCB2B12193', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:13:07', 0, '2018-01-10 15:13:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c767ebb5f9114e288f3a89695db8f9da', '2242075B17A503DB798F5A299B9C4492', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 15:31:19', 0, '2017-12-22 15:34:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c76c01ac74bd463c8dee4383b8250607', '177C246A695558EBA73FAFEA91751230', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:46:40', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c77a03a6045c4f95b42f4b1e1513ae38', 'CF06AE54665BC28449B41A99D21F30A9', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 14:35:09', 0, '2017-12-27 14:35:27', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c77ea4c7b2ce410bad2ebcddfcd6436e', '8A57DC4423D835B9D0732D487D39262E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 08:29:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c7886cccbe0c437fbebd08fd7ab6ab74', 'E36754B6D9A08F04B19017DAF289C0C1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:19:54', 0, '2017-12-22 18:20:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c79c8fdea02f4ec7a139cac06d0a6bfb', '2D1611AE31F3127D88190D9EE227467C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 16:59:27', 0, '2017-11-27 17:01:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c79ed90f68064783873b1434fec6a36a', '1F3DBC7A24E03AA53B84EBC80E684499', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 15:13:05', 0, '2017-12-20 15:22:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c7a232671e8b4bd08f1b4789e7ef1256', '9F8A7DB4237F0B6EF5F9C3C6F16A9391', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 17:03:50', 0, '2017-12-11 17:08:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c7a7659a2b1f465884d2601bc0660a4f', 'F3385C82014DE1B85D72E29F82E92181', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:43:09', 0, '2017-12-28 09:43:25', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c7b9993efd0e46ff8e26066bde85e617', '3FF095778734B38C827DF337ABF736CD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:50:40', 0, '2018-01-17 16:52:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c7bf54c7805a414c8055b5ae6cc419a0', 'A66CAE40F2B6DB93BD888E92595A8CBE', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:18:58', 0, '2018-01-10 15:25:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c7d6317943f347ceb5ea998902e83c0f', 'A2F2F324CDAD996858025280FBE4FCA6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:12:18', 0, '2017-11-17 11:17:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c7e183668c0f4c8c93a00d2b6b65866e', '0E0A57786695A75562C23E8211A82968', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 12:14:33', 0, '2017-12-14 12:21:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c7e1970e97f344f48ffaee66532b647c', '5FA640BD3E7929FAEE4C4F6630C556D2', 'W06555', '王晓明', '10.55.148.231', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:59:57', 0, '2018-01-10 15:45:23', '340fe94b0464472e88cc0fe7065170dc'); +INSERT INTO `jcdp_sys_session` VALUES ('c7f2f966573a4e0d84147ad2dac5710c', '124E0DB78F8CF7DB7EF7111251F391CC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:53:30', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c7f8ed9b9529458d9617805ed222a5a1', 'C3612763F2827C07E603DCFEA09E3835', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:27:35', 0, '2018-01-10 17:37:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c80943b83be14450835b74fac76d2479', '4C0A938BA64EE177A8920E23F4261B67', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:32:56', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c820429cf36c4e7fb61ed03fecc3f679', '966BD2C6AB6A031DCB30F4A1EEC5CC5E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:35', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c84d6c7741fc4f649ac1c3553a599a2e', '0D980350D0A646942FBAC7B16900DB98', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:22:10', 0, '2018-01-10 14:52:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c8742bb4dd00444a9192e664058d48df', '8746E291D40595FD21A5796F2FB714DD', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:53:17', 0, '2018-01-10 14:23:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c8ab9621cb35499eafb905c02079cd75', '583F33F174DC763D41BCE64B0912AE13', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:09:14', 0, '2017-11-17 11:17:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c8ce2c630cd64013ad75a1a278820d55', '5208B4B84E957D6A43EFCC591CFE546D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:15:01', 0, '2017-12-28 09:22:36', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('c8d1fc1f77c740c5859a45aabc44a1d2', '2EC233B3E6F183CC65722964D3EB9004', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:13', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c8e4d0dcb6914b368f8eb1b7843d05db', '13C11158752D32803A39758E9BD00749', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0', 'localhost:8080', '2017-08-22 15:43:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('c8e7d00c47de4822bff132ed401953b4', '1AA2C62FC112FF7293A4CC179920E9B5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 18:02:43', 0, '2018-01-16 18:09:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c8e853158c1447eaa977d7a5efb2b467', '5428050246E8B59B96E35C218B84066A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 11:14:48', 0, '2017-12-09 11:16:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c90b4e51e6524b21a677c35355bf5fa5', '0C874D656A30621C1EEBA20A9F897FD8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:48:04', 0, '2017-11-23 15:21:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c91375e36bbb4fc6885cb4a708ef696b', 'D9E0E2FD6FA77EF678C5B8A2963F9ED1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:19:50', 0, '2017-11-08 19:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c92446505fbc45c78d0276746f67f335', '3CF0A88878FAEF8FFD2A9E2C8B85EEF4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 16:42:01', 0, '2017-11-17 16:47:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c93ad1e2baa44b688e4160a88b3bdd48', 'CF4AA5E33EAD6DE19F88368E2AE11ABA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:42:10', 0, '2017-11-18 11:49:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c980921bebe5443dbd1c23ba49324a0c', 'B0D6495AB948254F3563A39930269C8E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:50:26', 0, '2018-01-02 11:58:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c997d8363c1d475ba1c457ed2f7439b5', '9CB6CFDB339B8821A894EE515A5A559C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:29:13', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c9cdc3d7eb724a24bf78a3eb18e97956', 'C0C6A86EDE2D9503C78613D276D2D7CB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:28:50', 0, '2018-01-16 19:59:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c9d58107537b46249035f150e07f8d43', 'EA99A8ABEC74CA7113A15B228CB85639', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:15:59', 0, '2017-11-17 17:18:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('c9f16104af2a4837a90d450ef8f9264e', '224FAE2327CD2B7B9455B19435596FE7', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:49:20', 0, '2018-01-10 16:51:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ca1588cd0f434e9ca9a71ef3ed4a58bb', '9CD35BEA1A82B9558F14A2A0819A658A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:09', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ca2d9a66c1094ebe9564cadef1769b31', '25997CD1C9431BF47A16EF99940322E2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:08:19', 0, '2018-01-16 19:15:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ca3357d7b40e45d7855f3d3b10d022cb', 'EC892161977CE1C96CD133BF5CB21353', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:17:39', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ca41a56d1743426394472b1a2253216b', '5E320F13453DDE8505D802F144D1D644', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-11 10:27:26', 0, '2017-12-11 17:30:11', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('ca4211c29e294cb6a2fb2bd53967be28', '454F5B5C589D1CABD2EF7848E588FC98', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-12 14:39:46', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ca5f2235c25d4000892b822f272f5cf0', 'F20C9249BAF4FF3B25D359844302641D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 11:34:50', 0, '2017-11-25 11:36:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ca6e54e54d854cbaae4d69723f1f2111', '5B3769847510645F4925B273AEA931AC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 13:30:37', 0, '2017-11-18 13:32:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ca9473d1ce724413b83e29a4236cdd24', 'E10847E7E90AC671025B51F688D39AB0', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:55:32', 0, '2017-12-29 09:26:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ca95d111941d45c99dec15db7318bbe7', 'B441CE9A92BE21D0DCB8FDA1BBFE9F6F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:42:49', 0, '2018-01-17 19:04:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('caa94a32d8bb4edab210ca29081e0f22', 'D96A11ACACFAB0E33D6BA6162C628F70', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 18:45:45', 0, '2017-12-19 19:10:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('caaeca54c1ae415e92ca159392e9a98c', 'CBB5AD64A91C33BF7DEAED8BEDAFCA2D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:50', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cab5ce9a829443e682a7ffff6f9dc65e', '164894A1BA102215CC2A386C3365C8AE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 16:22:10', 0, '2017-12-09 16:23:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cabe6b6449984510b8a08d045a86839b', '84697D292761EB3CD77CF451D02A0231', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:15:32', 0, '2017-11-25 10:18:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cac165f9197f4a4aa59a49aeee92fe8d', 'E7B2188DB7EFBFA356DE3338BEB72122', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 19:31:45', 0, '2017-12-27 19:32:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('caddee2559cb406a838eb39b847784fa', 'D51727F1AD46B3883F9990901A42E573', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-12 15:05:52', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cb00ba36c68e40c49fa255ab4626ac14', '48963065FFBA7B5BAE0BE4C8D4167C38', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 20:43:04', 0, '2018-01-03 08:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cb06515f64ff436fab978af095639ea0', '3E223C252BFA5453D66C1E155D5B337A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:48:02', 0, '2017-11-07 14:55:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cb10774912d94b088b112ebba07a8b4f', '908CA1C270373C3B26004513B6DD2ACB', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 10:52:05', 0, '2018-01-09 11:29:33', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cb241f79d67b423a8b013d72d5dcb6c4', '4E02D2C388CBC211E669B34C3CB1CCC1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:20', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cb2f74c556464abc88ff5c934b25f7d7', '1C1791913978980A5D07CDF72411132B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-24 08:09:36', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cb40283a9b684f338d74e24af173d25e', '36267E1814CE6C26AEE345B0D946EFAA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 09:56:51', 0, '2017-12-23 09:59:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cb4abaa6573a4d0ea837c72b7ff2d038', 'B6AEB7DDF04FC98CFDDEF3F957F632D9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:56:39', 0, '2017-11-06 17:58:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cb66277f8fdd4d48b1769912878813a2', '26F5D035F17D439238CC09A75E8245D1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:01', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cb675e55467a4368ab1522c404c0d5c2', '4B89CC5D5BFAAA1291912E36BD0D5F9A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 14:27:33', 0, '2017-12-11 14:38:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cba3bc1157fe45fe9d51e91150fa53c4', '692343F6257741A4AABE1324A3899F8A', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:45:05', 0, '2017-12-12 19:46:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cbb0938e8d3241319e1d7ad0eede576a', '15476B4139E657868BE65FC3D89E779C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-23 08:15:20', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cbb1c982a6ef401397c0fefda5a7e72b', 'F4CB7758DEDD6252F7923E855AC62640', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 15:38:04', 0, '2018-01-03 16:44:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cbb8a4c6b2604b6a96a1f8fdca0b1dee', '02B75C410733062C7D840573DFD1E7FD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 15:26:11', 0, '2017-11-09 15:30:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cbd3a8f428eb4f9789c62ed9ed824b85', '43669906818C02B873EBA789B0F30271', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 09:53:09', 0, '2017-12-17 09:55:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cbd4f8bbc9154174b6cd76c53c263cb2', '5AC4C6413AA2944CAEE2FA7736D3FFA2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:03:43', 0, '2017-12-22 17:06:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cbdded3dbcfa40f3b2e803ac8a077cbf', 'E64D0EE8BB81151BCEB6E0AF69D6E85A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:25', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cbdf4b1ee39c4b0d8b382c6df4b4b0fa', 'B694E97E3EA872523C7A9C1E22573499', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 20:14:48', 0, '2017-12-21 20:28:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cc02a822b3e849d981805ff9bc84dba0', 'A2580E4080B9563033B573213AD57444', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:37', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cc15c5f866d5433dbb7658749757fdee', '3569971FC5EDDEA9BF54240DE56D35C2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:17', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cc328c08a2774d5db3627d7c7eab7373', '392B8748B720E011A06AC951696CB977', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:47:09', 0, '2017-11-09 12:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cc35672257b84d0493507e42f6f26e30', '4B5517C6E58C02EA94FCE565CBB8E6EB', 'P12188', '赵星', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 09:57:28', 0, '2018-01-05 10:01:59', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('cc3bd9e859584e82841c658884717e84', '62D77B53B36C416B9CF4276535F2ED37', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-17 08:59:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cc7397eae83040128a686994f7f6a440', '1D805886BE8E401D4CFD0ADDAAC83A71', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-13 21:26:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cca1952504e14fdd9f09d5bc9101d8c1', 'BE783DA4625D79B6B6D6A2139F4DC90E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:54:19', 0, '2017-12-28 11:27:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('cca4bf2cdd8348ed992e102265de2e8c', '66B8B3C1D3AF03894CC20E88EC5A0F18', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:19:35', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ccbbb430552b43b8bca983306f8d0d70', '1790E4E5FBFB46D8ED7E4EBE15972B3F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:20', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ccce41f2cd65467eaf9f536055fbbedd', '32E760E40D98CDFC8155D990C34FF857', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:32:57', 0, '2017-12-29 08:40:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ccdef9fc0df7438596de0ab4e58f2e92', '2A3DD2C5E63C6C5FF56109D1E8B4F57A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:53:57', 0, '2017-11-25 10:01:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ccf485af50d9489990d784e7741b82e0', '3E0B82A645CCF6F9832B6AFB38773E07', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:48:17', 0, '2017-12-28 11:49:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ccf6a653125e4a70ab8b31229e4eada4', '887FB9CA70AF27909DA1413ED8AECDB4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 16:02:48', 0, '2017-11-27 16:37:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd01febaef2c42be889cb8169b601c16', '6FCE7FC17ADB3FC991119CA49B96A93E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:41:18', 0, '2017-11-24 16:43:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd093067b17a4744be23a3da1d8d60b5', '889A9B8C952B2673E3C0F2144019D54F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-12 11:37:33', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cd0f90d94f09447ba5246ae0186d662f', 'DBB2574D851C95E90B13E3F5AF0187F9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-22 15:38:01', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cd2222a5630d4cb1b33952c4908f3a66', 'F7256F6BC5DF86B918B2F70A143BE7B4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 20:19:17', 0, '2018-01-05 08:56:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd22243451aa45a5ae2207f4199e63dc', '0BB9837EA33C3FE297578AEECA9DB1B2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 11:42:18', 0, '2017-11-27 14:08:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd6738288d75483a8a04b1cea1d8beb3', '2984DDA2A7C0C682011450CD4B86B5EA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:29:13', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd693d397ee5472cba54b769ff314d68', 'BA4AB40865876CA86613124F8CBF663E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 13:59:24', 0, '2017-11-07 14:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd79583375ee4ebe9a5148d0818e98f1', 'A406C33A889106F28992834322DF4124', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 14:27:02', 0, '2017-11-21 14:31:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd85018de15d484ea97b002983a86ed9', 'AA5B57FA757A8E8D61AE21804E28BACE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:03:15', 0, '2017-11-24 17:16:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd885d04e44247ff9067b0c9d52f0666', 'AAD79BF4FD13BA85AC5FC0446A257C86', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 16:40:45', 0, '2017-11-16 16:56:05', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cd8878b712054262bb6a086421a653f5', 'D36862B0914AA38268D0013EC8321276', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:17:00', 0, '2017-11-25 10:18:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cde56ee35e024d69849af5f53035c307', 'A95EE8F1F247DEFB9BB70F198B79D078', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:29:36', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cde7a09770b24320b8e8d7bb6bde543b', 'A91DE7FB4BCFDDA4146BF4AF85895AD0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 15:27:14', 0, '2017-12-26 15:32:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cdee4f7c1c054a82b096205af108ce45', '3CC54E3E8FBCD44F2C5A0454FEAEAADF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:40', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cdf061afbed24c96b80987b7ab69da97', 'CFF6477F7778B59BD2027DAC935EE7FC', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:04', 0, '2018-01-10 16:28:23', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('cdff5dcba7dc4fbaab15ad2235956687', '5F26E62BCFB55CF0EB36793E83744179', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:16:16', 0, '2018-01-10 14:47:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ce3103129ae54dfe982f8e2e0deb0342', '8FEF36756ED73C49AC5D350A9BC56E9D', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 11:48:28', 0, '2017-12-09 12:19:58', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('ce361713d7f84a13a530e1d636b395e7', 'A1FBB942FD46267547C86025E58C3058', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-12 11:39:36', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ce4877ad00d144c0833a8b8b4e0b54ca', 'AAA1399AD505C24D5F016A90A641B1FB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-02 19:58:03', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ce5eed94f38c4940bbf49c4d7fb5751c', 'B3566DB3B3601B03FB39936EDA8AB210', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 10:22:07', 0, '2017-11-17 10:25:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ce64dcef856e41bc8f8507c8ee679ec6', '2DC8F6FAA4CCC2545EB96AD52F2C436D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:05:15', 0, '2018-01-10 14:36:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ce6818d366c9493fb27a3094640677ca', '013B6960894791777DEB48FC12C95B27', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:03:48', 0, '2017-12-12 19:09:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ce77595142e4479ca189455d82b48319', 'EA2A0A86812239E5520EDD01400EAB55', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 17:15:19', 0, '2017-12-27 17:50:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ce9a2cf4c39c488294b85f8550c64f9f', '01151C7E58E1EF888786697F42FC4D0C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:41', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cea892f2b3154eedb80949c740281967', '376AFCC2CFA388BB86F62D774B01790D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:13', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ceb8916d18fc4d5380b5ae1c3a003819', 'FF321568886004CFCD0537A2902988FB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:03:23', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cec4c72288114381908669ab7e1462af', '4C825854F0FE12DD608561218AD47689', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:13:12', 0, '2017-12-28 14:29:54', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('ced2f231018a49919346257368dfdb7a', 'A8F4A3FF74A16F748393C24B48ECE8BE', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'localhost:8080', '2018-01-17 18:32:55', 0, '2018-01-17 19:04:16', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cef9f28107ff4a99aaa9e5c22dac4a56', '68EC92E708C2AADB14398F7180ED05BB', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:22:30', 1, NULL, 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('cf11119a221940b5810270d7dbab269d', 'A981BA3E0DA5B62543EB891BD926021B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:38:38', 0, '2017-12-26 14:58:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('cf11e1f1382b481faee444efcbd306e3', 'A3C161789840B83BFF2E7B392F4CF50C', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:11:51', 0, '2017-12-28 09:13:56', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('cf306c2e776f424da393bff433489847', '866F8D629DDE6F7F5E22573490D3D476', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:44:53', 0, '2017-11-25 09:50:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cf3bf5e1a22745528811c43241ef9b8b', '69F34ADECEF5AF3943EC9457299DA492', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:05:36', 0, '2017-12-28 19:07:07', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('cf3c8e27fb8a488ca7747fb11a36766d', 'F4BF427EFFBCF0C95E9D40EC58822D31', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:34:22', 0, '2018-01-10 09:05:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cf479715332f4c8c93ddcc7ad3dc4d09', '696E34EA72517A9725F8753081EA2B7D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 09:33:58', 0, '2018-01-05 09:37:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cf53496ad8b64c5fb7156aa0ee47da29', 'F1B847F8A9C6D35D54C1B6535B6DE955', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:16', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cf5aa092b5ce4737920133d31afd7412', 'D1C3D117FD505DE355FF1A9F31A1CDE4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:48:33', 0, '2017-11-07 14:55:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cf60a20afdc64027a01542b9476aa985', '1089439147957AC4FAA88A00825995D4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 10:22:48', 0, '2018-01-05 10:48:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cf719061671342698cb40892ae433d57', '1E27816511B1AED9CE50F515B5448B4F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-02 11:52:04', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cfb2dc6ec2584009a34aa79716d98041', 'A78BF4AEE7907801CAE04E492FE63917', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 08:17:57', 0, '2017-12-27 08:24:43', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('cfd825855db54a4dad6676e9dae1b8bd', 'EFD2E08BACEBAC9DC44127405602B2FA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 15:57:33', 0, '2017-11-08 16:00:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('cff2156fe80d4c11919cfb1084010fb2', '06D0527ACDEFC6180614AEA45DE35896', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 08:50:25', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('cff31cc0fda34f6fabfec3699601e822', 'CE0F5C1A37E02C6D6444D3A2DD032EC1', 'Y10027', '辛长平', '10.55.148.140', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:20:40', 0, '2018-01-09 14:28:18', 'b497ab9b01c74a93b6ee7f079a356070'); +INSERT INTO `jcdp_sys_session` VALUES ('cffad0986f3d43398a8d37aa835bb292', '45B064AD01BFD66388AA8B580D7E9A78', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:19', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d000f86950ab4c53bd08106b4c223940', 'C8B57F83C5AB837B07AF44820282DD81', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:43', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d00d5e0a77a5488b9bf377f133eb5daf', 'D4E4989B47F4944BD71069AE19A806AE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 14:18:32', 0, '2017-12-11 14:24:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d01b2396c7e84bce91300cb6a393f87e', 'EED6DCF391C777C8CC72B87833202012', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 16:12:22', 0, '2017-11-17 16:14:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d023f865c3c44f108ebb7b2eb25ae082', 'A485F0924CD49B87151281D52CE1F85D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:13:15', 0, '2017-12-23 10:14:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0291c2ca25d42a3834289de4cdb85ea', 'B105E2CAF7DDD7DCB898E43ED95235EF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:06:29', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d03943fee81243bd982b51d7570b6d2b', 'FB71603920F0B44B6E2F5002B49E0B84', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 18:01:04', 0, '2017-12-20 18:11:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0425458981540dfb26c7f61847831c8', 'C27FD20B3D39594647ED62F8F9E020E2', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:24:53', 0, '2018-01-10 16:26:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0530a3970f74982ba8fdc92dab29623', '361ADFD12C73838A9D9785F1D624F416', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 20:33:30', 0, '2018-01-03 08:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0617b07b6b841d884c6bdc0ac7469e5', '248FC730F47832CA827FBE62D13D86E4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 11:56:14', 0, '2017-11-29 12:04:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d07a6c2859fb4738a72dcef54b6fc9a1', '052F0251D286CB04E5A8551DCAB174CA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 17:12:05', 0, '2018-01-03 17:44:28', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0a74923a8b94439a44425241ca4f783', '472F7BC1EA372ECEF7207A3219E98806', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:24:24', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0ac9c44e7074bfc87bdbb813026e98b', 'B23D44C6730196A21F632B91982E7C64', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 14:44:58', 0, '2017-11-25 14:45:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0db4b593c9543eb981699497b46dd15', '52E22F25A4242067F2466E568E01E044', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:18:55', 0, '2017-11-06 18:20:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0e433675052450ab89728534b5c55ec', '893841FF3822E5B4294B26FD2174D428', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-16 11:59:50', 0, '2017-12-16 12:09:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0e6109c29c24c5581b7e082846cf170', '17835487ED84EFF0AAEE8170DA8E66F5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 11:28:48', 0, '2017-12-09 11:32:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d0ef8bb80d414ff3b54a9e5941a5c645', 'CB2593A4BC3AE0D3CB5FFFE2CD8BF11E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:48:17', 0, '2018-01-02 10:26:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d0f6da83ee9f48e490acbbebc4e2bbc3', '2170113AB470666AECF340D190D6768E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 10:02:07', 0, '2017-12-25 10:02:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d118947673bc426aaccedf181ddda129', 'CE41BF5A4A9882A299FA02F419764FAE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 11:13:08', 0, '2017-12-22 11:20:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d15e2704b9ca4332aa14be7e24c202d3', '2D096253529B53DEA699B8D87A06A445', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-20 14:11:19', 0, '2017-11-20 14:12:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d17a294d2b6748fab7274a9c11a37d67', 'A2B04AAD15284F9C58A3CF9BCD67C6B4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 18:59:44', 0, '2017-12-21 19:09:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d19a551e43aa4537966b8f464684b7c5', 'D3DA429085EF1FE2AA3836618BE8C662', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:50:50', 0, '2018-01-09 17:52:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d1a67790a55d49bdb87a2fbdf7040f83', 'D0DDE63F38D4ACBDFD846EA3C5E9BAAD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 08:47:27', 0, '2017-11-28 09:01:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d1c302df450f4ee3a70c0fa39835503b', '39FED67EB765166A8391B3B8A1D01314', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:00', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d1e2a236965c4bd8a671e762966d0956', '65EB5C9BCCE92E01682204FD8F13FD93', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:40', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d1f4830d75ed44daabc470de59939b78', '7BE4C31D2D581D6212EA6F26F99AF055', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 19:02:23', 0, '2018-01-17 19:04:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d211ae9ac60a4c68b02841950c65955c', '0A6B6448B9398C19825E83B030B39D94', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 19:13:38', 0, '2017-11-08 19:17:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d215df6bd9714019bd43fa476b74360c', 'FF11A6B99CC452969D8CE5475CB500F4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:13:23', 0, '2017-11-06 16:18:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d2309f557a214c949a5113ecd0d20a01', '807D67711E046FA4FD68BA779ECA404B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:55:47', 0, '2017-11-23 15:26:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d24ab2474acf40709d0fe30e35a3249e', 'EAF379F0644D9B6F980230BCF309EE34', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:17:41', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d254473c640d4190952a7a028483388a', '4DBF912C81CC6F4A03F6DA2039BCECEA', 'W06893', '张立奎', '10.55.148.128', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:02:59', 0, '2018-01-10 17:36:24', '44e74bb07b4b4fceb9ba9ed135ea5e7d'); +INSERT INTO `jcdp_sys_session` VALUES ('d259a3445f5d4327b6b7de354cbc740d', 'F4BB93162D0576EA6A911F6395845AF2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 10:17:59', 0, '2017-12-24 10:24:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d27426468be24021b12b1a63e9338329', 'D30F102C7F55175271CA041D5E13CB45', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 09:59:18', 0, '2017-12-12 10:03:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d284398a71e64fdb997e348514f501e9', '0B93D6556CFBA6C1AEC42CC4845AF79E', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:00:03', 0, '2017-12-23 11:01:27', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('d2974acdb9a4408f97a1ea64930985d2', '9BC8C073A90DD2E3FCD11D5A5B03A67B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-06 08:43:09', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d2ab9ce1219e440386bde204e5ac67c5', 'F992984D9117CD530133B1C983996D90', 'W06893', '张立奎', '10.55.148.128', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:03:32', 0, '2018-01-09 19:47:20', '44e74bb07b4b4fceb9ba9ed135ea5e7d'); +INSERT INTO `jcdp_sys_session` VALUES ('d2af2630f11b4f7990d13582c4d755fa', 'B880BD26A8252F96A0ED9420D24029A5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:50:34', 0, '2017-11-17 14:57:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d2b71a7aa5504832a4f2371ef6106d72', 'A59A1F00231C1F3BA45ABF597A993AA4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:05:57', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d2c1742f9ebc43709fe40e3a5992a171', '6CCE856C70CBA113B2598F3AD6E95733', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:20', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d2d8de4ffd1f419a9dfc6d3c48b1ff77', 'C9DBA468BFE0100346622CD6C7F3A136', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:19:35', 0, '2017-12-27 15:55:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d2e015aa748d4d9d976c5793791d3ddb', '39D179870C1D93580153A7AF2568B80D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 19:06:05', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d2e69b45ec1844fca4c2893f0b08439a', '6C16F9EEE307AC4F809376215ACE840C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 20:06:42', 0, '2018-01-04 20:19:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d30246a607d44031ad08a7321c757635', 'EAD1FD7DF6D1AFC815CCCD247D674024', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-02 10:52:59', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d318e3f30e2040989541c28c653e86d0', '5C5EF19F2D1F1133A646A097D0F284C5', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 15:21:33', 0, '2017-12-28 16:02:44', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d338f03a52564a73ba12e052ed79feb5', 'A0078034199A52433CB80B108EB4E9F7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 14:35:40', 0, '2017-11-24 14:38:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d355c8ae838045328d8d63ddca73ec81', '0E5BDD874FDB9E9941B17BB4D43C4AE7', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:41:08', 0, '2018-01-10 18:12:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d36d36a08bb849eaad135fefe48e8da7', 'B42866AAE714F6834AA94E5CEEB76D9A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:52', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d38d3be12c4849a4b55d610bc8fdd6d2', 'ADB6A0DDED003E1263134FEDAE41DA42', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:06', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d39146a03e47403aaf2bf28617f8ad2a', 'EF48840A944911E00D1A6A4927E767FC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:12', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d3d051b176054c61ba9483bc359957a9', 'C8C34FA4011EBC6485EA5CA33DDE47DD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 09:22:51', 0, '2017-11-17 09:56:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d3ec7e0a4c594d9b9541199ad6bb2a61', 'DCD65B938C80C342AC05CDB0A2DA8B42', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:55:08', 0, '2018-01-09 17:57:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d3fb1884eda74359b554cb453549993e', '9849C8A02191FCFA5C06CFCCFCA8D5C9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-20 08:22:17', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d417e2382adb4ab0b19e2dcf9bb2bf66', '758E3245C4B00BD0AA3143FA57380711', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:18:30', 0, '2017-11-07 14:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d41d99f4f7ad4f36a1c13a4fd9431f49', '34B84AFB99229C4D04683BB0B140DBBD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:50', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4215f346dfb45b0897fa94cd8e28e39', 'CB2DCCB66FEB6E7A5459236F578164C5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 16:53:24', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d432ef20d9144956abe26d831ffb1207', '1DF27EC133DB828610A3E1DB17BC9E6D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 15:05:16', 0, '2017-12-20 15:08:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d442eff882db4f23af2cd03f8343376e', 'B406A007734EEB73E534A8C099761AD6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:21', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4431d0602524e6eb5da8876a51e0999', '532D57E24EDB6FE1974C8C3E995583F6', 'Y08066', '靳晓松', '106.117.98.0', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-08 21:59:43', 0, '2017-12-08 22:00:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d45be1dfabe840cab229eb72c21a2cd7', '249FBEFA12EE348AE8546B48E4F1FF1B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-20 14:38:09', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d45df505573d40528220d32874b01f68', '254C23759B45E284155AADB8D431404F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:27:59', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d468128ca46446f1acb991dbe0123a43', '16AAD311B0ED8BC42E43F9C49224491F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:14', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d488603867a44c33ad8be4b29baf7efd', 'BE47E6044DD68BDB27EF905FC6A0D8F9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:43', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4908d5288fe4496a9c8f49c698d9f27', 'D29A5EA7CA8FA04416ED5AEFEA9B8DA8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:57:55', 0, '2017-11-25 10:01:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4a3ee2cf6ac47a4862e88e7bb23ccac', '34A5E1EF301FA927B4F89EC5A77DE904', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 15:12:54', 0, '2017-11-07 15:15:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4a80eba407d4b498a491a9ed3d2c874', '50009E9C1C2B94BF4671D07BAE7881E3', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:01:14', 0, '2018-01-09 17:03:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4bef6879c444294946fb55006fdc922', '3B16500A919410BC3B260A32F8D7C681', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:57:21', 0, '2018-01-17 11:01:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4d40a07eb8a40a6b0591b966d15b582', '4AD63033CCB88249ADBD01938EA7C818', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-24 08:48:32', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d4df5a9a4f554de8a5e78a73f8aa8714', '2E6B1CC76FB8AD306B3EB5AC18CA5334', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 09:21:36', 0, '2017-11-17 09:22:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4e727e0bf3e482384185d4ceb99227c', '1D60B15135452D30C3F7C67700F49111', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 19:43:07', 0, '2017-12-19 19:48:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d4f033737ecd43cc939a5c9c246e9846', 'EC625A4F41DB904781C1821C6D954FE0', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:01:50', 0, '2017-12-23 11:03:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('d4f1353568a844b48f14066e1450bc05', 'DFCFDBDD0A2CA1B1D5A3964EA9DE6E86', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:39:06', 0, '2017-12-12 14:42:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d503f914581341c1be4fcbf94224a062', 'CA76045FB4CDF3971B4C6E9886F150A9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:29:38', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d519346c30324ddaadc039b0b785cfe2', '1AE92A34006F0385AE8853A24EBBB3FE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 19:10:25', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d527dc27cc80440caa65805cb6d3f7e6', 'C9800E7B91E781A5C55AEBCA48F0767C', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:17:43', 0, '2018-01-10 14:48:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d52e65d5b2dc43d4a178c2a1f0bc8df9', '1BC05A8DC0426658EDE40B78B8B4B6F3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:27:05', 0, '2017-12-28 18:27:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d53478ace045499a869e60935c051fa4', 'BD0BD1728F9A7654A7835AB7A7CCB9B4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:26:39', 0, '2018-01-16 19:28:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d536a8989fbe44129fcbd26b8831ba2b', '9C86A946828D4AEFA1A08F460674A7F9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 14:17:24', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d544cf21b51341008ecbf627599267ce', 'DDB582FB2A6DBC92FA2FAB575766257B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-15 09:56:58', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d5718bff3c37456eaa312ae5edbe3573', 'ECF8EA291538149863A8904D2799FDD7', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:48:42', 0, '2017-12-27 16:22:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d5719e7e96554bf98c3197aae5ff2316', '1282BCD084DBBCA395DFC8FFD3A7A470', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:17:48', 0, '2017-12-28 19:48:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d5781199a6e744079024385c8a5dc9a8', 'C73E5202F9244F899ADB0C9EF5E93D8C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 10:27:46', 0, '2017-12-11 10:29:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d57d0be8d9014d8eb76554a20fb09f8f', '346963806D7BB5A51D9AF96E1610AA12', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:01:40', 0, '2017-11-06 17:04:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d5951fbfcc9e43429dbea0b7a3bce48d', '9F1E0AA368F693FFA67E46FE6486580D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:15:28', 0, '2018-01-02 10:20:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d5a0a3111d8b406ebe76a7c1e8cf4f3c', '5BDA1BCF018A620876F955110C70DFF7', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 16:26:42', 0, '2017-12-29 16:57:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d5ae83997f8d4ccf8aabed1a0ce3b743', 'A61637EEC63D8A1E58716CADC7405D88', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:01:42', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d5bb35e7be8e44c7936c561eef4e4e8a', 'EEC472FEBE9A7257E47733C252AD3F49', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:44:19', 0, '2017-12-28 11:45:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d5cee3596c50446a8759964c7b07c189', '75DD0820F870B4A9FE7DEC04449CDE42', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:19', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d5e18870dd4b4348b0cc25321d7e958b', '5572735FA449F52AE5BF7EBA1ACEE5EA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 08:51:27', 0, '2018-01-17 08:58:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d5f078d21a63409b8139255d548627b0', 'DDEF0FD7120C235214923A138639F038', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:53:49', 0, '2017-11-23 17:57:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d5f861cdaa3e42a2b1bf801a942398c6', 'F875FACA27439F4E974721419897E934', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-10 11:15:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d61064b2858b4c9392c561fe91bf46a8', '267F3B1513ACEF0BC30B6C8AC235068B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 15:17:30', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d6297b11d8d5485f93de2ae0af661d7a', 'D283B25729BD7A9AB32067C76B108AF5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:25:59', 0, '2017-12-28 19:26:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d6347bce119d457dad4048a7dda98e39', 'CD3AEFBAE312210C5DF2FF49710437AB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:54:59', 0, '2017-12-28 14:56:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d6435de9f42a474a9440f3796651f3dd', '690C9A9E5A14FE6552220BBD059ECB2A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-03 08:03:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d647bdef71b14e0593dd699c20903a61', '1D33FA6B4179BEDE888FDE7BEF00B322', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-25 16:24:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d689140f6aed45bcb19e08b163ab7561', '66EFC8D814C2680644C501490F2BCB7B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:38:06', 0, '2017-11-18 11:40:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d694e78fe34d469ba805c7614cdeb640', '651B840F9841F57ECA2EB9DE6C1083B4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:04:13', 0, '2018-01-17 18:15:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d6b4fb31d4f44dcb99871a41ba2225d8', '0402C1E535862EA0CB29867E7A802BB0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-09 08:28:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d6d123b144a04e59bc8956aa4353d30a', 'D7E1E542326B5352EE59375D3D9037A4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 18:02:11', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('d6ec7f20a941490cbfe2e57073d437c0', 'A8FBF04DCD0E3DE033D50CDA79B2665A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:14', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d712da9614b04e8e86fb57a38e83c924', 'CCB75181BA0CC329E6BEB13E80F8BEA6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:01:23', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d71322f6a3ca492da34c76be5a00855e', 'AD19F2106DEA789570A6329C96F24802', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 15:14:01', 0, '2017-12-19 15:15:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d729d95fe4864273986276480ea4bbfe', '48FD0DADC79EC90595598D7111BB188D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:47:27', 0, '2017-12-25 09:47:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d72e67f91f424b6b9f784594e4341e77', 'FF54E9DDFFDE225DDB232C0E50DC1B22', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 10:41:15', 0, '2017-11-16 10:43:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d7332dc5e572490685ba48a14540bdb0', '4271E7908F523A31B38190BF700C6510', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 19:22:22', 0, '2018-01-16 19:25:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d7395754041647ba8579aa6a755c0223', '91B412433BDC5DBFA6D5B230A6938CCD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:25:07', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d73ebed39e6042e387ae95b5be804a3d', '2BCD5A8AA57CD1128CBFE4A46074D36F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 10:56:50', 0, '2017-12-09 10:58:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d7586053f25e4effb673083fba499714', 'BB1BF350996B5FDD860D628733E49B49', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:04:41', 0, '2017-11-23 14:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d775e3ffeae84cfca855bd57db9e287b', '1C24294503F34940B212921D493B7194', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:02:44', 0, '2018-01-17 15:04:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d785f58d3c974f2a83af58f3fb36c2e6', '5B7C9FB61DCF8C319B2FE452807153CD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:52:53', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d796729f707b4609b1cdcc3e09a14a60', '8A0037248441F3B2C1B05EEB18988A89', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:36:58', 0, '2017-12-12 14:42:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d7a01fcf77c14e4ebfbadf0a514658ef', '9A4F8836B14914D5E405B6A693BBBE92', 'P12188', '赵星', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0', 'localhost:8080', '2017-08-22 15:14:13', 0, '2017-08-22 15:14:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('d7abe8c752f04163a4870eed541051bd', 'BFEB2467736A4007A5C81DED6480F5FA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:50', 0, '2017-11-23 12:04:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d7c06cb648064dba813fabbe9f2e9c69', '48BF339A48ECF189199CE741A47C076D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:16:53', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d7cb361dd57540a28f0f195409e10f6d', 'A69E68CF304F55F9AF048E3D1607FAF4', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:01:01', 0, '2018-01-09 17:49:20', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('d7e400886cfd4f918602be687f808de8', '5AB17F9F887F40DD1EAA97CA14C9F4A5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 14:24:28', 0, '2017-12-18 14:28:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d8053d6a46e549e6bb357c750c061f81', '11D6E1DC22FEF6BA5F5A25F650569056', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:52:29', 0, '2017-12-27 15:52:48', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d8072f7f13184490ac90c06a7af61378', 'DA7D8F11B7898C9BA95895B3E4DF76AC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:44:29', 0, '2017-11-06 17:49:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d80f3cf9dc7b491cb0fe37cee2231d38', '01AC001665080E3F4B453A1A6FF4EE2C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 17:18:24', 0, '2017-11-21 17:39:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d82349720804498e8d4de9b66845b877', 'DE81A5455904851A65B1527411DA6B71', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 17:01:25', 0, '2017-12-20 17:04:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d8258fed2370432db57aa923e353ebc1', 'DBC0703D9BC9C806D1E1EF2451A33A85', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:28', 0, '2017-11-23 16:34:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d828a01cc7c248bf882b233658a13dc4', '595A44F246D645EEBA381EFB1588FD8E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 17:26:28', 0, '2018-01-04 17:35:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d82b729f78b548fcbfb1b08a8ee7d6c2', 'EFB6D6953F5DD41A5376C71489571CE1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 15:30:16', 0, '2017-12-13 15:40:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d84096af4f8f430288813cd478de58fe', '2D5BD7421D12DC223AD2FC7BD0C8FB8B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:51', 0, '2017-11-23 12:04:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d8459b656f744d41a43902b95b353c73', '36FC7D88EF9EA8AAF2434A7EE982C113', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:26:44', 0, '2017-12-28 10:27:06', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d8512b0010124db68783b424c719f8d3', '092160E06D016FBDEC656C1AAC5AA280', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 09:05:14', 0, '2017-12-29 10:13:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d87829a96ea3452aa084fd4dd7a6db0a', 'BE1E59B51978404DAC42D3D5287D5688', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 10:44:10', 0, '2017-12-27 10:54:49', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d881932abb53418a8407b5d3714a90fa', '63D89BB671B48554FC601A343167EE84', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 17:48:05', 0, '2017-12-29 18:20:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d88cb7570aca4119bf7fd84f48961692', '395B276EDF84455B87B3214A8C065F5F', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:09:39', 0, '2017-12-28 11:53:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d89232ad47ba489d940ef9c56a3b8b95', '754319ED19C7345E5F4D9D3C89A1C249', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:20:28', 0, '2017-12-13 16:22:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d8a6ba315233483db774588f7c1b0573', 'DA5ACC8BCF0106B99267BE31FBBA463F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 20:01:13', 0, '2017-12-21 20:04:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d8d0fdb9222646c1a508f491b912a536', '4880E0F7C47E672CBED71ABB1C4BE125', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 10:58:49', 0, '2017-12-17 11:00:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d8d176e7f7f54849bc667a749ab4c93b', '7C4770A3D25CB26C85EFC23629B195F4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:32:58', 0, '2017-11-17 14:48:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d8f1192d31b34e8b800ca94655f34d4c', '4867D1D942EC14031CFDDB22207CE106', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 21:37:42', 0, '2017-12-13 21:41:27', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d8f3143f8a9c4017b1dceba53b2a6683', 'E340E5B8D1F4637F3DCD37EF26259F66', 'P12188', '赵星', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-09-27 09:18:23', 1, NULL, '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('d900041edd304ba581e221122c8427eb', '252A45D9189089FD094C39CBD134E724', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:01', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d9192dc53e3c4999a2936cf72b2329fa', '5A90ACB9C066CBD108B0FB8499AFCE2E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 19:54:58', 0, '2017-12-29 20:05:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d94a5778fe0243bdb3a57392263ff293', '6AA495F2CC7704807D8BF503A2DFEFFF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 20:09:06', 0, '2017-12-29 20:25:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d95b6cd288724f4f8fce09a5d4b10ff3', '325C9F7E7EE6AA7E7FDD59B080E38AB2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 09:58:47', 0, '2018-01-17 10:16:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d9bfa127fde94c808ffaba582cd507af', 'B962CC2A8871CD45FDDBA811021B0BF4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:23', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d9c88719679e4b73976c7ec0c3907b8b', '00DA701082A301100E83C8A3AF9D67C4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 09:14:05', 0, '2017-12-18 09:18:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('d9e26ea6ed1246b9a7f66e0b3b071e61', '7C7439E5B89B702A6806565AF0C478EF', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 09:52:52', 0, '2017-12-27 10:27:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('d9e5facec3d04fd9839fbe6189c8df89', 'BE656C64C0071951E8D3D682D2B9B011', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 11:12:01', 0, '2017-12-20 11:31:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('da070eb9ad7e4c9d946a156d4885d811', 'B762CF9DD9ED9135C83E5BE7E69D5B09', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 14:40:43', 0, '2017-12-15 14:58:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('da25ff3332e344cf92640f4427629126', 'F207EC1415DA45BA861FB7554EAD783A', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)', 'localhost:8080', '2019-06-10 08:56:38', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('da2dec66f35c4a9387920f57d0ee14ac', '358AAB8EEFD64B172524DAE9D4DDA90B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-14 16:14:34', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('da373d48306c42ec8486c7cf97da221e', 'B76A834FBFFF65D8759BC2A50769F761', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-10 10:15:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('da385a91ed8844ef87e1b9cffb73700b', 'E1DB11C8E9418546286EB84B1230192D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:55', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('da642e3eaf034e76808777f5e9b64a6d', '7DF16DEF70900280B954E40C1B8D5FD7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:02', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('da7015efb201408790651522c70323e0', '644B5D1919C70B531FC6FADFA367D1BF', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-16 15:46:23', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('da71c7bcd9d04f3b8538a1f72aa503ec', 'F691728138802451FCE6CC1A46BE8291', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-18 11:52:56', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('da8403d7dc404c3a8d696912b0b593db', '9352FEDDBF5906E75D0CECE8B3768C6A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:57:52', 0, '2018-01-16 18:09:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('da8a760593044b8cb5367e0bb17b6687', 'D71F5312E6AE0826B8FDE71F76F70795', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 09:27:02', 0, '2017-12-26 10:11:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('dabec3f12f2646e6ae61e71358f0bea1', '94596D81E5D3072EBE699569FA1A6937', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:02:57', 0, '2017-11-17 11:08:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dac005182d114daa8a560aa0f7e753d6', 'E60995D99299855CF3A7A8188FF8D362', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:34:31', 0, '2017-11-25 10:36:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dac670f4eddf4745b8c211c043d4457c', 'C0D09F70F5A0910CC59E4FBC04C724E4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:17', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dad68ac5f3dc4cedbf499a8ea3b269dd', '4DB80F1E0FFC1DE909FA887ADC9F4973', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:43:06', 0, '2017-12-23 10:43:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dadf9c0e667444d6b819c05156cb955b', 'B078711764EE72F711F0272A5A8E9CA0', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 08:37:19', 0, '2018-01-02 08:38:43', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('dae882b3ae1e477bade80c3262c9394f', 'F321C0081F2DEC8DFA46C97F0CD16862', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 08:27:14', 0, '2017-12-14 11:09:01', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('db0857f08e3b40ac8fea1570ff29850c', '240439A53F814350359ADC8779487131', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:34:59', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('db0998ca80df44eca5a7f7ca7c010c0b', '249BE119CAC6420BFA6771BBBD3224E3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:57:30', 0, '2017-12-26 15:14:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('db15b17475104eedbdd7857c2778f535', '793E3BCACFD58C3ACEFC6E4CAA8CE4FD', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 13:53:04', 0, '2018-01-10 15:02:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('db230f0bd1fb43e0a05a3d7b7e4f3cc5', '4558BBEB580811B3E3C3C7E430262006', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:10:31', 0, '2017-11-06 16:13:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('db31d9eec44246c8b9605aac1b7427d0', '8389187572B2ED9F9BE3EBF59C34D2E1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 11:14:49', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('db55b0ac02ca4f1099daee07feabfbbb', '292CD86D0F028EE0DAD0B8B4EE21A82E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:01:52', 0, '2017-11-24 17:16:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('db6c4c746b59493d8e37c8a5503b63cc', '200DEF14EEB0D1ED7106B96499FC75DC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:34:46', 0, '2017-11-23 10:39:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('db76f293b108456babec561d622500ad', 'D7D85E228855C495B4D8F461F3102A08', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 16:33:38', 0, '2017-12-29 17:08:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('db8a83ef7ec8412f9dc67fbf0a7226dd', 'D55BD72E3D7254D802AB2A9278B1C188', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 17:33:38', 0, '2017-12-28 17:38:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dbba96c7ccac43c5b57c01955f875905', '6881B049AB9910EC723BE1D390A1DDBD', 'Y08066', '靳晓松', '106.117.100.62', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 19:22:24', 0, '2017-12-12 19:46:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dbd916880f6744ffa81af91a0c286bf9', 'A4EE6BDBFF421395681804DA7F4F3A75', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:20:53', 0, '2017-11-25 10:26:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dbe796374e0842bda2074831d4d7a9fd', '50C24648E5568F0E3567EECC7F1824F8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 20:18:14', 0, '2017-12-28 20:25:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dbe7c7216dc54837876329efee94599b', 'C3A4CD6D2CE2A2537A4C426F5997239A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:30:26', 0, '2017-12-28 11:31:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc01bdd225794baa9089115adb6c065c', '4CC198412EE9D4D7C6B596BD8B078154', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 11:45:32', 0, '2017-12-22 11:59:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc026387296e412583dc765f60828c11', 'A4CFF3CE37428688A44C4A8E033E000C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:04:22', 0, '2017-12-22 18:06:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc1d56294a384197ab78f3bce09965d5', '1E1BC26A5D943D8CD58FF8DD0E3D664B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 17:28:58', 0, '2018-01-04 17:35:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc1d9b985a4245a198751064e1867975', '0C9D326C3DA167C12FF670673522A974', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:46:56', 0, '2018-01-10 12:17:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc384ab6539c4da3926db16e5c407c48', '4C318C40C34A09AC88936A354FDE40FE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 09:02:36', 0, '2018-01-05 09:08:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc3d47abe6854419ae752bf561f69ee3', 'ECA2C060590027477FB59C77F10FE010', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 16:24:29', 0, '2017-11-27 16:27:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc4e2bdf8d734f0ba9d969498239a029', 'ACAFCBFF43560E089260642D9DA6E2C6', 'P16106', '彭树蓓', '10.55.148.206', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:22:05', 0, '2018-01-09 17:25:19', '83bedd208c9a46eda1ce4e47705b3b73'); +INSERT INTO `jcdp_sys_session` VALUES ('dc527599f3394732add9b8f585980b6b', '1B4450D646F9F3EA2058744109364E11', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:14:14', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc590726125b41a6a4222a2add40a0c7', '4C68A6BCDD2EC8075B61B693291904F4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:04', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc5e37139316445e89c82c2b2d2677fa', 'F72B72E8639E71F4C3095A042D2951D4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:13:06', 0, '2018-01-02 10:20:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc745a3ecb68444bb5d50a7cf477d074', 'B75FE1CC9F60E9317596DB528EC2154D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:47:04', 0, '2017-11-22 17:48:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dc7b1d4ce1bd4febb06c28e2461eabd9', '7482CD6BD40E26575F13814B68D43633', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 10:35:06', 0, '2017-12-17 10:50:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dd114b3b9d2a4aacb08b37ec478bfd7f', '40EF7D2B658B5F3DA5C533B636E3F00F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:18', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dd23f28683dd48a899efd5e606601ff2', '6F8687689DE067FFCCCB864BB207F059', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 11:53:34', 0, '2017-12-17 12:03:00', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dd26fd7cda22407abef94b601582701e', 'E6311BBA97488F490306291A2F03DDD0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0', 'localhost:8080', '2017-09-26 15:09:27', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('dd6c69bc28c8470398338a91e8c5bcbd', '01CAC2FADCC72B8E37901D9EFC62EA31', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 08:59:43', 0, '2017-12-28 09:00:56', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('dd7defc2141a458489b7b007ded331b7', '651916A8C15F522FD3E88D55A12FA6F8', 'W07675', '马成', '10.55.148.200', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:47:46', 0, '2018-01-09 15:21:42', '521d08563ab74b8188599be180575bcb'); +INSERT INTO `jcdp_sys_session` VALUES ('dd9afd97363249d78f899a117376bdc3', '82E76E8CA87797AF0103EFE0CE84A1F9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-02 17:47:27', 0, '2018-01-02 18:23:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dd9faa1e3b4f4928a1d45fc302bd7b94', '33EC8DC0D3A032C743BA4A348B0B1FE4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 16:39:30', 0, '2017-12-14 16:46:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dda70afd06cd417386d81e7a7cd80353', 'F8EA7814DBD63613619E84200B894A88', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 16:20:36', 0, '2017-11-27 16:51:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ddc21bec2e1d4441bed874977185c2e5', '1AF572B9B6FFEDF0FDA2CF9131FC34FD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 18:36:10', 0, '2017-11-08 19:17:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ddcefbc91fcc4c6ab41c72fd23d95f97', '1F9F165F52F592E7DA2BFCF5411C2ABB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:29:13', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ddd9a7812af742e4b1f92fc779386f00', 'CFB2D7928176073AAACB8245C830374E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 19:06:07', 0, '2017-11-23 19:09:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dde18d64c872437ca036a7b544e385f3', '14F8AF1AA67542E6F21AD65E00B32556', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 11:29:49', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('de033f27147048b2b13745a2e60f2fd0', 'D1237E45BD71C5C04AE4A6CE3DB0CD43', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 09:41:43', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('de09c05024da49dcbb7466cb0d20353d', 'D3F025448E7D2F510CFDC19024A6D6E9', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:37:22', 0, '2018-01-02 12:09:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('de318297323a47659ebf77fa14e0dd02', '04D5375B23DBDC48EA15E58D4B887BE6', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:00:01', 0, '2017-12-27 15:39:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('de47d3114117444ea249081d63b7e37a', 'E16A35471BEB58D71598088C78AABFB6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 13:28:28', 0, '2017-11-25 13:35:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('de5f7ef283f54f73825653f98d86bdbd', '1A7D82D41957EFAF4D39E33DDE6AD0DB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:33:45', 0, '2017-11-25 09:43:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('de739136ce4f4930ba077e03781d6f25', '61D2BBE21B5A3082DB803FF5BC8A079B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:37:29', 0, '2017-12-27 16:38:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('de7d0aa8520749a0995180564ed443c6', 'C65C1C3F17B2871F797FEB38DAAC98D4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 15:43:03', 0, '2017-11-27 16:16:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('de7f6042a4904f939277899bb69569b0', 'D8C23A0784DE52CCAED256BA8066921C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 09:02:59', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('de90c5d0b5e44de7b18ab06aad5f6150', '916AF54353EB9ABBC70DE926E06650D9', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:15:19', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dea13af7a4f2407a8970bde5625fbe01', '6D4BD5ABA261B3550CC0F708B02430D2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 08:59:02', 0, '2017-11-18 09:12:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dea35e28341d4128ad22a150b75ca937', '1BC5FC904BEA220B2B376BB40D587649', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-29 10:53:52', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('deb83aba0ef5407fb11250eb518a5555', 'C34E2D991557948ACA67EA2F6F737FFE', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:26:20', 0, '2017-12-28 19:26:35', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('debe6c84e10845da85161deb67a5cf84', '3CC8EC93A6DF0AC3A0D51E73385C13E3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 09:13:02', 0, '2018-01-05 09:31:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df1dc46544334895881638073fac7c18', 'CAAC79D00B7DEB3092CE61D5409E4876', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:09:24', 0, '2018-01-17 10:16:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df236389bd954ffd82c8f6c7cfda953a', 'F18C4DD73CC4E5DF2152323BB86E5EF2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:46:27', 0, '2017-11-09 12:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df40cb2812274f1cb8dfadfeab8503b5', 'AE9D93CD703A76D68D5CC409A22CFD54', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 16:27:46', 0, '2017-12-13 16:31:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df4bdc54082549b48f0b6a30764cc7b7', '58B291B6EBAF75F32543E3A9B2EE6123', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 17:53:00', 0, '2017-12-29 18:25:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df627dc522a44afb9e08613be539554e', 'E37BB769D9D3EF420D91DE77F2EDD772', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)', 'localhost:8080', '2019-06-20 16:54:17', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('df6a14b64a1b4a21858bdae51af92831', 'B209A593B9FFBA28DBA9FD23BE57D055', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:09:57', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df73b1b1fe5844fba04fb52f890b0234', 'E366C663AE4ECC6789A86AC9190AE5E0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-22 14:35:15', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('df7a4adac68e4341824d6c12617b978b', '76572EE5CFF4E1158E9F3FF29E462110', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-25 17:06:00', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('df8599940a9a4e318118d587dbadeb67', 'C8AE3000DF282E53D441B67C8722CD5F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:04:43', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df8babe18b51486d917aa0d1c432d493', 'EEEBABC37682AD07D9D3886A301C4F8C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:12:13', 0, '2017-11-22 17:28:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df90db2f1e0d4d3b8ec825747eda89ca', 'B5EBA06596B00A2C4DD7851FCCF5A808', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:09:54', 0, '2017-11-06 17:11:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df9598622367467185f86a34881418b5', '8D49E029E8F73F7F16E8ED7962308E68', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 20:24:32', 0, '2017-11-10 20:27:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df9a5b2244b94140b22412a03ad7ae8b', 'B4DC18875B2CFE45D5C75CCA971A1568', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:16:05', 0, '2018-01-10 15:25:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('df9eb0dd186543e38ac35c3d9f3f4809', '787E163F5475D9933BAF41C5E89F4F0C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 19:55:22', 0, '2017-11-17 19:57:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dfa1113198a946b2aede0da55c37466a', '3693D7C0045B9A4FE0EF1D92E06359D6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 17:11:51', 0, '2017-11-21 17:17:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dfa2bfbabac647f284f5f0dc73283efd', '960937F5E58EB312ABD76EE1F9073466', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 16:33:02', 0, '2017-11-21 16:40:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dfa83e79775643d1968b33a2358be3eb', '6DCD69A58086C874B389EB1C3525E45F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 09:55:41', 0, '2018-01-05 09:56:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dfd16414f3af40c6b2fcf8caeac45839', '6BFCA899DE22471433AE600CD2D7BFCA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 15:48:31', 0, '2017-11-18 15:53:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('dfddf07bf9a34e27b3879409f50f7a4e', '16C398F80C7CE9BC87B40F958B4C550F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:36:37', 0, '2017-11-23 18:44:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e00f19bbef684c6e83d68769bf9b383a', '832A13856C29131B2BAFED7B18851288', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:18:10', 0, '2017-11-23 10:20:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e024aed14e4b4f16b7895df0c606542c', 'BC7F17AD80C1F9B632BEB4080DEEB49F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-06 18:03:53', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e0323571d11d45da8af972d6b6eb3efa', 'A82D02A6EFB4229AEDD189321A71C4D2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 16:31:24', 0, '2017-12-25 16:34:35', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e05fb11cd75449c59ed46eb9ce6671f4', 'A999D0F6DBEF58CE247A6950B5C95A53', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:01:49', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e068bd4ceacb403ca198734ba674a23e', '136914A93441336D55BDAF03A3ECE74A', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 09:39:25', 0, '2017-12-18 10:08:16', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('e086097e64ce4b1e92def91147977907', '0885B6E654DF0232B40255164C0740EF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:08:09', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e0af612f66574317b3fc3eb7e822c25f', '8028049D775B8FB156813242A5F1041F', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:22:13', 0, '2017-12-28 10:53:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e0c2dff19cfe44e6915dc3bef782e56f', 'CE33A5989A76A5FE0D67181EA58CEC70', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:32:59', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e0dfc6bbc5664c2e99e915f7e10c5810', '7776A257B7FA3FCB893159CA1459058A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 20:15:53', 0, '2018-01-03 20:19:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e0f476e8140a40c19ab6f0783bcb7002', '0E7194CC86B940416602231555D3C691', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 15:19:24', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e0f6faa1f42047b1ad1322de32a2e100', '6EB1E92FEDACE408037E2AC5B44B9632', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:26:49', 0, '2018-01-10 17:37:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e106865e96eb41e7aeb9aa1d90c2d0fc', '9E0AF3CF10AEB3166C87584728251650', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-09 11:59:16', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e1323da4fd8d47388cfc912aac7f8c8a', 'A42FC069FF2549BE49731B626D518E01', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-23 08:17:25', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e152f6cdd2a24863b498d48afacc929e', '06597F3DAA9A8A3828F43592AAC498B1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 13:43:06', 0, '2017-12-14 13:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e166481878db47bbadb79252bbad85b8', 'E34F2E37ED3F58DA3AA4575DFB5D85E0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 08:50:37', 0, '2018-01-04 08:56:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e16d045cc71a473091e6e6cd22b1d4e9', '464E2D34776AA25A7E191EA63A4BC691', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 18:05:39', 0, '2017-11-21 18:28:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e180830d4b35468ca6caf7b6f2e20180', 'C3BB79004B98CBB5470C1BA04426C5EE', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:02:46', 0, '2018-01-10 14:33:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e195db0a813e4627a6b31c2168fc48e0', 'F7539DA43F79AB1E37C44E7AD706AC1A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 19:30:33', 0, '2017-12-29 19:37:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e197b3d6d36e4d4cbdb1ea19e8f10145', '05C98C5EDEC0ED7E6693F1D20027E7B2', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 10:08:56', 0, '2017-12-12 10:11:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e1a4f50ad6654079855f6ddd252fe935', 'C38B6C8E309E3EB1E1BACE32B0AAD01E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-17 15:35:02', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e1aa240d0e8842b99b99616cb620d9a8', '44178A40DF1D95F5C63A2876474D64CF', 'W07248', '贾怀玺', '10.55.148.142', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:32:50', 0, '2018-01-09 17:23:56', '1d8094115f5c4c6ab8c38c414a65d6f4'); +INSERT INTO `jcdp_sys_session` VALUES ('e1bd29a4ab0142699ffa78d46cab6f2e', '6CB593F37FA76480E8C7E7D0BA7F51C3', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:59:36', 0, '2017-12-28 18:59:50', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('e1c1513401484dc8b58a265ecb056a34', '45D6FCF1DFDFDC4197CB7240AF8F4B6A', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:38:55', 0, '2018-01-10 18:09:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e1e1290f6b3b45b7a9fdba2b2134d4c1', 'D24E85D81BC5F7ADFD1A4FB82E6F96BD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:00', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e1e9cae8de624639ae18505d6c721ece', 'E0642146B0E328F3AAACC1C5B1140B35', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 10:48:26', 0, '2017-12-12 11:03:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e1f3d7313dcf45809aad4504757cdf03', '8DA0DF1D0ED949BAA0FBE96275541636', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 12:04:44', 0, '2017-12-13 12:07:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e1fb30a47b514b3d88d37a5e315630af', 'D8A2FA0D79204F6834F1A629F3544C58', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:19', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e21ba5fa79864e5abceed8484f1e19d9', '6A529B19956B0B8CA9511CF4B55DFC45', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:19:11', 0, '2017-11-23 18:22:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e2325d0e60714425adee6157d172278d', '772E8F33B8FD18F674942E6D40A92155', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 18:19:27', 0, '2017-11-06 18:20:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e245fc19c05e449f9cd0c0984a5e22ec', '77894D5D956E7C723A631C490A82ADBB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 14:48:02', 0, '2017-11-25 14:50:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e250d5aec9bd4d8c8380b5e3fc05879b', '104B7798978F85E185511B47F3811EE7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 15:04:08', 0, '2017-11-24 15:22:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e26b7b6c32694b0bafdce0448f58fb32', 'FAA42D4358C32DA16C4F8E4940480585', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:01:35', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e27abda77c494543b71152a1358a218f', '3D434CA87BBF0D2E639FF4C72704C4BF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:28:31', 0, '2017-11-18 11:36:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e298d3850c52444fbc3a4e221909643e', 'D67B480D31FCAAA7F6B9D0129B2A2F95', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:20:20', 0, '2018-01-10 15:45:23', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('e2a085d483e7415fa3281b33907bccb2', '630EE4C850240B0848E68922C5A76E2F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:53', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e2a47ac04fee4dc4b7f562437e944944', 'FD8977519DA38BC11F317CF041E90F7C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:10:30', 0, '2017-12-22 18:40:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e2b540bc7b194b52b0a85a13dc50b42f', '75B1D0682E99857CF319D687C35CEE2E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 11:49:31', 0, '2017-11-22 12:08:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e2c51cae38df4903b463bc7c897c971a', '5BB1495E6961FED5C739C8250429EC81', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:06:35', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e2c8bb3d4a6042c18db6597fbe148cd1', '92CECE8A7D5E6A20285BF3666EB80916', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 14:33:16', 0, '2018-01-17 14:35:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e2d8a2bc25124bdca0ae93a5dce25c25', 'B5469A3905F6B10932F8D4A3A31C60BB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:36:20', 0, '2017-12-26 15:13:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e2fa0ea49fde49bcbae50466353fdaec', '02634BF357164EBC839C1E55F7C1633A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 18:21:32', 0, '2018-01-17 18:28:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e300038de09d48b0880a34bfc9bdfcb6', '2F809411F2803D9D9D935FB5F2289C9C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-18 08:44:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e302bd2dcf234aafb97667ab5b60a96d', '107ED3C76D8C7B4DEB592481F209ADD7', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 11:10:14', 0, '2018-01-09 11:19:20', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e31d3070ffe54aa096335714b259ec71', 'F4375C381A37A9C5612AE411C8DF9B39', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 09:26:45', 0, '2017-12-09 09:27:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e3297a2cbcfa4cf1912a5d95dfa1878a', '757B3218F2AFD8FB61A724E93E082D63', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 09:57:40', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e32b3c21b4ae4ae5a7816ef9e6020087', '250EC0DB69AC12CC23F234CBD9E167B2', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 08:54:41', 0, '2018-01-02 09:01:43', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e32ed20e91d64c90b4df38fd0532c184', '9D424212EB888428B35D8A365FF08E92', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 20:12:05', 0, '2017-12-29 20:25:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e3308bc45f2646398c4c79dc309a515a', '56D786B27A9489D51E73FA04E71260DA', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 10:52:00', 0, '2017-12-17 11:00:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e33f7bfc7be740b49631b538b448ebc3', '439FA3448EC77F9C2B7047CDF54B6D2A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:45', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e36411d301c94300bee74cd01538f61c', '91B8784AB8126AC511BCB56CA1C44005', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:01:46', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e36c372def854a5cbf7092933522e41b', '219B91AB6D619E03F85B815541DA30D5', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 09:24:40', 0, '2017-12-26 09:56:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e3778eb173a4479da7ead73f5d4f81e5', '4CF5D43FA17ACBA1C34EBA36C8118D3D', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:40:51', 0, '2018-01-09 17:44:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e382bd64b274487f9d199e22196523b3', '5A2BF107366F19BBAB5AAF2CEB2DF874', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 21:32:24', 0, '2017-12-13 21:34:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e38714a88a1b4d0a918fafdfc806ccc9', 'D1C3497069B0E7C443CB45A567DC6628', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:10:12', 0, '2018-01-02 10:10:22', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e388951bcebb4e4daadcaad9cb1c30e3', '081C93E0582BD0CABCFAAC7F5FD453BF', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:21:45', 0, '2018-01-10 17:25:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e393ef4111f8400a8a0c9a13eb56ad06', 'C78B83EA86F9FCDA5160A733CA803E26', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:02', 0, '2018-01-10 17:49:24', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('e3a64d58346748f8a66ec8d371c72850', 'C631451E803E2D79B352D94B2CDF6992', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:37:22', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e3b71dffdbb24710ad44f9e56f1295d1', '4FD6C8CB8EA79E7D4C41B1B933BB5772', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0', 'localhost:8080', '2017-08-11 08:27:49', 0, '2017-08-11 16:29:13', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e3bd2293e4fd4840b5ef453fbba45abb', '954B0C00FDCA0D4BE56E83F09379B87C', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 17:11:15', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e3c48e3bdab54183a1d8a2489edfe208', '5FC801692BFA49CB1DE719BB58982DDD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 14:37:36', 0, '2018-01-17 14:41:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e3c70b4316fe406481c300350ac6a836', '80597B0D111B2C675AF87E687EDAEE3C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 10:14:07', 0, '2017-12-24 10:24:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e3d4cadc35b44b61b9ad51c88e5a03b2', '3EE793ABF57FA83365092ABF79A40414', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:40:11', 0, '2017-11-08 14:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e3d77fa7061041cf8867aab549ad241a', '15D18F2D5FC99726ED95FAC4156A1403', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:46:42', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e3f4b642eb31452eb6f3082447e814d5', '7DE898754AD870BC6F4CD5A2AD162905', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 07:49:49', 0, '2018-01-10 07:55:38', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('e40ef817940e4115bab35d1ce70022c1', 'B70E69D96E0FF66E9A8442F623FD7EAA', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:20:20', 0, '2018-01-09 14:27:01', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('e40fb5dbe6494db9bee305b8d9234bdc', '3E183D190E0714889F2615D37DFE510C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:01:47', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e418a62dde6344839f0ef46d998a17f4', '7E93386B6EBAAA21313AA74B31EAAD1F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:17:13', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e4333db0214747a7aba231f8b29073c5', '1B240A13F9148FCC22B22B49E19F5185', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 20:16:22', 0, '2017-12-29 20:25:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e43d8fd6eae54fe29c9b772bce48fe82', 'C32C7D3DC9AA0F7E1BF43B5502415A72', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 16:01:56', 0, '2017-12-26 16:35:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e466cce9e42941ada2b7cca05c1ba446', '5595B65F9067A9192D7349A8BA09C9BD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 13:53:14', 0, '2017-11-18 13:55:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e466ffef09cf47be9dde50becd0c1e40', '0E1EB924C88D9DFF289989F36C2521D7', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 17:14:50', 0, '2017-12-19 17:16:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e47c13f4b0f44aab94f7647fb6ea1c1f', '35951A22A62928D1290215EB23FFB53A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:42', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e4820762c42a45edb06afb28c3fc2e08', '2290D97F92BC6E1D22307FD61EC30806', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 14:04:26', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e48d4fd823b94fd3ab1120bf5f3145ab', 'CAAD3C7C0B1988B7534D913CCCEEE672', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 17:19:18', 0, '2017-12-25 17:22:35', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e4bc1df8217d490780369c0b8164db5f', '68341BC8D9A67551BD97808F25DF9BBA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:46:44', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e4bcebf887dc417e8cd019266e70f0cd', '51BD482E51390CE7DA75EEAA944638E3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:29:07', 0, '2017-11-06 17:38:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e4d202005c6442569541f767b42237f6', 'C52CD6740D82361CFCA39FAC60896C0F', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 12:00:03', 0, '2017-12-23 12:31:18', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e4d955519cfb4db8973ecbda0f8d766b', '68564355147B2496913D673876416297', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 15:50:41', 0, '2017-11-09 16:16:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e500872091114601ad086bb32d17051c', 'BCA578F55578D484572B81A82FC05348', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 08:41:36', 0, '2017-11-23 08:44:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e539641dea654e58b38ef5da786284f4', '7D2301F1951203375B5F3331F4751ACD', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 09:57:37', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e53965a5ac3c4f25888a8fc6fb228649', '7DB20B60F891D1626D4B575B49AD0358', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:27:13', 0, '2017-11-25 10:36:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e541845912f04411966fec4d14a5ca5f', '09C4C1570C3C7494A637B2D4F25308B4', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:40:30', 0, '2018-01-02 11:18:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e558984f980346fabd305473935e32a4', '96AF474FE2422DE4BE424DA348B29CC5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 14:14:43', 0, '2018-01-05 14:19:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e55944ea6974478db984b2d82430f6aa', 'E6F18A7BEC497958FE59A1C395C0DD53', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:47:16', 0, '2018-01-10 16:51:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e55e78c264994e2e9f8db7dcb009c04f', 'ACA0CBFFBBA74AEC6E097E1AB2306466', 'admin', '超级管理员', '106.117.98.0', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', '39.106.113.161:80', '2017-12-08 21:38:47', 0, '2017-12-08 21:38:52', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e565ca2ce5ca4c45ac0415078c023189', '66E6AFB61A3FCE3D95B04B29F9FC54E3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 12:02:37', 0, '2017-12-09 12:07:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e570f48f2d80476f8fd6745c46636912', '76C80D1E67659BB751F7E868B0B592E0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:08:31', 0, '2017-11-17 17:12:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e586ebed13db46f9a56ccf3dd7cb5eef', '4D6E6D4A019784D48CCD6144B4BBD648', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 10:44:56', 0, '2017-12-20 10:48:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e5a4368822fe4cfd8a8ec1c08f89fa1c', '2754C3C5CC546BC4F60399F92CEFA54E', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:53:54', 0, '2018-01-10 12:24:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e5c4a0194c1d42288af21a8f84e15a49', 'A03CAFDE2A099EA0672DEE391E53D92F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:16', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e5d1a20a81634c47a004647ae1ef81dd', '8B126B5FE4C60AA251F72BE4E15BF3E5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-22 16:44:53', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e60201bf283c476caf4f5362047a8da0', 'D328F2D15E3F49A8BA62CFABB487D7B2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:07', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e61eec4b45624aa9ab5bd74586d3bc1e', '6A9E9E0C8FAEBF74993B77C439F42AC8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 14:51:59', 0, '2017-12-25 14:55:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e61fc9b7d29346e99605223d0a28bace', 'CC7F5ABD1BE998034B46C993B07ADD35', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:00:29', 0, '2017-12-28 19:11:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e633e04174be4a64920190e21e06ebe3', 'C99C03F7921E9961EFAD39BE38EB6B5C', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:26:30', 0, '2018-01-09 17:30:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e644197229604e679361ef903e08a3db', '21A02B1155EE22F21564DE48B71F35B3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:40:10', 0, '2017-11-08 14:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e64a4fa3005b45feaf601aec6c095fdd', '1C91C2BC3268F410DBC9CE4DD73CEC6C', 'Y06216', '牛立栋', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 17:02:41', 1, NULL, 'b304903b0f0a451bb44685a898508369'); +INSERT INTO `jcdp_sys_session` VALUES ('e65beb68c53141bd9ac07556e24f140e', '0F53496BC02B8E67665DDDEFC3735013', 'admin', '超级管理员', '10.55.148.143', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', '10.55.12.110:80', '2018-01-09 14:01:03', 0, '2018-01-09 14:02:11', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e68ccd2a4e494b4d8d247ed7d73dc6fd', '2C7722E8FF2C7AFD7B0845E65C062263', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 15:55:55', 0, '2017-12-20 15:58:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e6948b8fe21d4df78b9901f737260f61', 'A7B135223C577267476C67D858B0685B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:29:35', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e6a5741401bd4ef2b599fb245db31d5b', 'A78B3C64865A4C6199F342E8ACFCB08A', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 08:53:33', 0, '2017-12-26 10:36:41', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('e6b930ba4c6340b5b6354fe7cdf6d9e3', '130158ED3FA73B79166B062E228B9F4B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 14:56:08', 0, '2017-11-28 15:20:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e6c2ae15fbf14baaadfb3f8f2c5bed72', '55490BB59E58133C8B46268ECFECC204', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 16:14:42', 0, '2017-12-09 16:17:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e6d69e108d474885aca6c9655f50c99d', 'D7280986A4F7695A34BE641DA9D4AF64', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 08:38:44', 0, '2017-11-23 08:44:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e6daa8b2e07448a8880915cd90161abb', '341A1FC84E2D9457C99A4C59E2431E71', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-21 09:37:35', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e6e8e37d078043398a51ad5aa036ba16', 'D53DC0627920D1C996FC6A2A89A6B367', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 10:44:26', 0, '2017-11-21 11:18:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e6f1429fe4cf418abb5152767c1dfd68', '11BB6BAE8323E71882F60AEEE9A67F73', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:53', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e7019e40a521482ba62bf5bbb1ca4ed8', 'E8606997733B98C3DD1CEB61B4B60DAA', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 09:14:08', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e709b616ee9a443a87e0b634185de79d', 'A7AEBA8B80A24101FD1ADD8284E4E686', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-20 10:27:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e71e67e21f6d44a6a4b9c2269b753332', '0F3869BCBC61AF23F60FB1A80DF5DCC6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 09:20:29', 0, '2017-11-18 09:52:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e77e18fd10f142499a7481a29f84db40', '1D102A01EA7081E96BA38EB381BB7EFC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 18:14:46', 0, '2017-11-22 18:34:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e78ce5cb8ab14fe69d4419e03194f4a8', '7EDB9834CB3A8B7B3B74CB595FDD145F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 10:33:28', 0, '2017-11-25 10:36:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e78d948209eb478396ba6a342e822f06', '907046B01D633E573E776CE66B9D9376', 'P12189', '赵简', '10.55.148.133', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 16:15:58', 0, '2018-01-09 18:30:20', '5676921ac94b4633a614892676567bfb'); +INSERT INTO `jcdp_sys_session` VALUES ('e79464a0a4874513b40b55ba27cf9d27', 'AA5A979A22F8E326A3533F6D084A4EA6', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:07:37', 0, '2017-12-27 16:26:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e79c52df1d784bb681bf0c2696a261b7', 'BA3951CD0DCB9BFF89C396E1E76395C5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:16', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e79ec22862a1405fb40989085ba68bb9', '014418ED5FA86897A0BDADA4A60C4A36', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-24 10:10:19', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e7ac2e909a80410e9255e6f2ebd9c6e8', 'AF4FE3AE36F21346C3559BBCFC7CBE9F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-02 11:03:36', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e7adce473c4f4e70b88fde2f94ae4f57', 'BF9814CF03EE871005585AFDA207CC2C', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 09:01:23', 0, '2017-12-19 09:18:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e7b1306c663e4fdc95f4792b0d743bed', '2C7590B1BA85E0B5EC93AA7380E944A9', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:16:21', 0, '2018-01-10 11:26:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e7ba817cab514664882f09f9ca465472', 'AA5428E213C303DF2C1BCE95DD5939F6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:37:20', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e7bdebeeda3f4465b160a9ef15550b4a', '5FBC8DFC3BB8E91C4B2E50D104E78E03', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:53:28', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e7e0fb7339a34adb9489d6826d64cf93', '1783C47E6954BDA90BB687FA0D8274A3', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 11:52:58', 0, '2017-12-20 12:26:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('e7f091f1a5fe45df98f67ba9bf0f3b53', '2043AEBFC515596A3091ED5D778850C5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:32:58', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e7f7009307f2459780ff3a8621377288', '95C7113B567A27655EE620F4EABBDEDF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:11:55', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e80ed204c1a1439ca152907c8ee41589', '030DE1AA09D67678EEC5DEC144044A66', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 20:06:06', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e8101e7dbe26449ab30abedd2a40fa69', '0AE7F2852F2C7C2D0B6C94F004024FB1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:17:53', 0, '2017-11-22 17:28:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e81358f28011465599553086da019888', '9DE2035B025121257CE1ADEC835DCC72', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:58:56', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e827ccbb77404d42842b3b5d3e939383', '103E9E6619D3CC98817910FC24F38BEE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 16:46:05', 0, '2017-11-21 17:17:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e8381dc467b945cba932ef6d470bc0a5', '22AA5DEA49868D344CE22972C9400932', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 10:33:16', 0, '2017-12-09 10:36:51', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('e83f609936914e06933cbd80636fa449', '71BE20E86155C0930F7147953D3B4F7B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:08:34', 0, '2017-11-23 10:20:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e854ada12aca4229a4c1fa9347c99eb1', '576E9866AF5E7EE6C27860B46844CC56', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 09:34:47', 0, '2017-11-28 10:00:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e8583b59637245ee944f612030aea002', 'CDB2599A4139F44E19BEB12CA8F155DB', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-24 16:25:43', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e89aa94239df4ddd9641f44d1c850ace', '95BDD8E86EB0E8CC81333B987EA097DB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:20', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e8c7df6238144218a87ab665b3b75238', 'CF226FAF6D739AED5E8140B709763A90', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:28:11', 0, '2018-01-10 17:37:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e8cf686ca61841a68631512d3cd7a7dd', '53A61F977F4BE4C984D2D25C639C43FA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:34:23', 0, '2017-11-17 14:48:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e8e79e561808456884c1258248d312f5', '666DCCC2547D95EED7E5854BCE20622D', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:00:28', 0, '2017-12-28 18:01:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e8ea189fbd6e4d12a497730b43c77bb5', '7CC0C970F9D2CEB9C9210FDF6ABE007A', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:33:51', 0, '2017-12-28 10:06:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e8f8c0b7152c4f9cbba4a26dbf29c7a6', '8FC37C1D06382AC9B1259DE21C1B6F6A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 11:02:32', 0, '2017-12-09 11:03:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e900059d802b4f9ab6e18faaa39dad41', '37905035FBA7FC1692A074669E7C5DD2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 16:25:30', 0, '2017-11-07 16:27:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e90ed293f31843d2be79f99d8b3cc9bd', 'F69A9F5C295343D8303535530DF4BB29', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-24 10:11:34', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('e913d22c57a946899214f649abdbfb8a', '14DCC29159CE918210C96983135785F0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:26:57', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e91d66b3eee24646ad6b457e55e37dac', '01A42D898E8764356ACD5E99EA8EDBD4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:15:14', 0, '2017-11-17 14:19:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e91d9e4d994a4edebb430df08a614cb3', '639B3CFC5A8912B72BFCBB343380DCC0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:13', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e9255ad43ec644cbac4e0832db5edc7d', '2584E7D7974331FBD4CD691AD1100207', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:01:17', 0, '2018-01-17 10:16:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e93e8db082fc4fa1944963be4e46538f', '4767C14DDECE58BD3A2846CF18DD1765', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:48:31', 0, '2017-11-07 14:55:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e9424c3765ee48c0a11a1ea5f35185dc', '6F743A0925E76A5166DFE6820C37C3B7', 'Y10027', '辛长平', '10.55.148.140', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:03:02', 0, '2018-01-10 17:54:24', 'b497ab9b01c74a93b6ee7f079a356070'); +INSERT INTO `jcdp_sys_session` VALUES ('e9517390fb4b4cab973691163600c47b', '9C3F757125BE6CDC3D062228BE4F771B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 19:04:20', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e964a2186db340c684557371aa3e9267', 'DB0009E04E9E1A46DD52507A0AD98E49', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:00:57', 0, '2017-11-23 15:31:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e96ee1af7fda4f008b628bfd83c7fa12', '2499BFF3201088EFBD8F202C93BAD317', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 18:07:11', 0, '2017-11-23 18:11:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e9ac4bd1728f41ca98e8551f188d667d', 'BD09D129C126288C7D6DD47A5AE42E59', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:50:08', 0, '2017-11-24 17:00:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e9d1a8f3b1934feca2e93f6746ab2576', 'DA9FC3D7A52FB36DAD3E5E72B6D04645', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:49:16', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e9e65105985b4666ad79f055f0a44416', '37B8BDFEFF11BA37C50F35022F393717', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 15:40:48', 0, '2017-12-27 16:12:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('e9f2576b0999485d85ba9133e26f1f2d', '60CCD21CE67CA76DBAB45BD1E617BA3E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 10:38:24', 0, '2018-01-03 11:10:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('e9f85e4a9714489faddbde4f62faf9de', 'F2B4C04EB25979E7369298000DCEB777', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:09:37', 0, '2017-12-28 16:40:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ea092cf9543040949047ec5b802193f2', '534B1D40F5C977D4A71A0BAE15CBED06', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:28', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ea0df01a5e7845adb683c1b50281f50f', '1AC96F26F3CB236598DF97B2B0297689', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:38', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ea1c560324e74cc099356f81ae35ce6a', '4C5333B533B064F5A41276F4B1B06CBC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-17 10:23:50', 0, '2017-12-17 10:50:59', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ea4177f4622c4c6fb4018a3e82e20747', '2C33F2C48EAB2B19FE27F42FDEFDCF4E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 09:55:17', 0, '2017-11-22 10:04:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ea43080e86644c49a7d3c71d89404d68', '410B8EDDC48D95343EB643FEB151198D', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 18:51:47', 0, '2018-01-04 18:57:13', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('ea499a77191348e7bd3a51e85e3dd510', '032E0ABA99FFA85F97102FC50DEE304E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; aff-kingsoft-ciba)', 'localhost:8080', '2019-06-24 15:49:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ea4b8b7a9ee04590a23d140057af7166', '966A232D5CC68B5D16D86270BE506E43', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:45', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ea5797afe848436598814eccfcdfdc3d', 'C75C7E463E58EF431E3FE6E2A26AA527', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:36', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ea9427d674004c4a8de7f96e0e4ec6ff', '0A361031560C83CF014091D703F33D0D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 08:39:02', 0, '2017-11-22 08:40:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ea9c49e073f14f62b16b00210925c66a', '60B7B4FCF1E9A38A01A0C57050F7971C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:29:52', 0, '2017-11-07 14:36:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ea9efb52621d44a2a0006af2ff2d96fa', '46D4C1A41474EC9A547623633D2914B5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-05 08:07:59', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ea9f56ca52564ab684d4270b2773e5bc', '81A5043E0A85C09CEBD377BF42CF74E5', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:45:48', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eaa9a1cc66474863a26e9c4b9fc099f2', 'B516CA2CD406AF1CA3994EC150F1C77B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:44:37', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ead7eaa377bf431ca5b74e6724d0c037', '24587F4BD546C2BA50129DBAF6988A30', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 17:51:14', 0, '2017-11-06 17:52:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eafaf538c79d4d3fa103f4430cce9994', '2F38C5064E172B2C90233D7B65E84305', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 11:11:40', 0, '2017-11-25 11:17:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eb0536170fe3438c9c622df96e2c1a4d', '5C5CD6AB2E362750C101E5B5E1BDC6D4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:26', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eb196ae2b49f4ad68b823532d3d8ce4d', '6BA6DA34EB5895C7E60CDE579EC4A5F2', 'Y11037', '宁志全', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:18:47', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('eb2a56154b924099a3465cebeab45cf7', '44E66DD31059B64341778B9CDDC60511', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 14:08:48', 0, '2017-12-25 14:23:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eb3307a9ea3f4582adc7be9d38005e5c', '7D9FE174E748FE131930A4DF625BD619', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 17:26:48', 0, '2017-12-28 17:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eb3cd45260994bda97f69be8e17af526', 'A6371E0FAA3C4FF3628E41B6DF468387', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 15:53:02', 0, '2017-11-09 16:16:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eb4b3851d85b482a8c9544e5853117a1', '449056D4C8F9CB06371393EA1D910670', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 18:32:28', 0, '2017-12-19 19:04:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eb5da0c3a73a45978ca185e4ed06c703', '16303C95DB8FDBA2A5132B50EBA8FB2D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:15:56', 1, NULL, 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('eb60af5a4742454ab0fa6dc44e90d9cf', '44A5245D09BD6CFA315A2FAFB3610B0F', 'Y08204', '王利培', '10.55.148.137', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:15:27', 0, '2018-01-10 17:59:24', '25f0fd10490349b9941f8325c1fc8488'); +INSERT INTO `jcdp_sys_session` VALUES ('eb862c9f9b5b4610b32661c65d70e60e', 'DF63DE47023C59A17619594FF9669D6C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 13:36:29', 0, '2017-11-25 13:48:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eb96057612c944fda39b9c08b2095f8b', 'ACD710C27C6052CF77950CEF5E2C9505', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:35', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ebc2990a300a48d9b4e36e7f7e8914c1', '32AB8268DA196281CAD63D4A874FB104', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-16 08:21:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ebeca48a1fbd485b95a59b58cc4b880e', 'E9C95B65CD9A03FBD2806A3794D12A3E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:10:35', 0, '2017-12-28 16:41:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ebee629b4d344c40941470dfe0933822', '4422AE8633C91A515B395159FA5A9802', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:15', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ebfa4f6d92d24edea633e040aa9646f5', 'B5A2CD83CC1F9441425A2824283B8E72', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:01:12', 0, '2017-11-25 09:04:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ebfc9c8bf0964239a399cbae05236593', 'FC0456E48FD7D69523C8ACB097E0B05E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 16:58:48', 0, '2017-12-18 17:37:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ec2ad353dcd34724b35dd79a3f95ca14', '88F541151B864D94BD6D7BB76BB3D0F0', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-09 10:12:02', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ec38825efeb4489f8b58775de5e9208f', 'D9B4BA61C67BFA6E4B25E6EEB35E254F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 16:53:53', 0, '2017-11-18 17:06:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ec705dc478c0472e84eb17cf0738b6de', 'A183D3A6FA9ED293B05437280402C844', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-26 09:33:52', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ec742bb18a6f45abb04f3039fbdd9652', 'A2DB1725527E3B5454F1588DE2BDEF3F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:24:08', 0, '2017-12-25 09:25:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ec7b8a7ad9994eb89cb93f1fdab64c46', '8DE5B0327F954BAE5E5E6C248B3F4B1F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-04 15:16:51', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ec9657ca0bca483eb245b75c4d6b4eb5', '0F590E23457B409E7EAB81F9B1B3A9C7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 10:35:53', 0, '2017-11-16 10:39:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ece0f99ffa8a447bb53af4afd9bdea74', 'FF5E62BAAEA084634055DE7D65BB1569', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 12:09:40', 0, '2017-12-09 12:18:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ece217792fd44fe8b368377e412db5c4', '7562674DDC97D76538657536D0C7D4AF', 'Y11037', '宁志全', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-07 16:37:31', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('ecea9dbfd8004a01a8355c79005bc555', '4D2507C87F495C44EE34404A202361FA', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-05 10:22:30', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ecef98f1e3da449f9e40a41b697efdea', '934D307761730F4F9A7D5FB1E18E0C3F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:01:26', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ecfd5abf48f9479d9a50f1db8704a443', 'F4DEAE3F2856746DE664A72992CFF510', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 14:29:34', 0, '2017-12-20 14:36:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ed0c6f5739804177bf2d295a7f8aab8b', '76BDDDF0AB87BB920FAF06339E42EA0F', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:57:44', 0, '2017-12-28 19:07:07', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('ed30f986c40f4ec280a70f390de8be96', '3621427819D2339FE39ADF815A6B24A0', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:00:52', 0, '2017-12-28 11:02:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ed379fe9ae064f0394761189c4f6b09f', '27A8FA1A720BFA2216D6E1C0CAA9302F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:32:39', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ed41e354833e4d6a95b5a4f018b6ef69', 'BF5E88AAE85A0B0F6156A35437E38A54', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 16:28:21', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ed50cb43d2d84c18aeb69752f4237dec', '564E08FD0CEFD83C1AC12F21DA88C490', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:05:35', 0, '2017-12-12 14:08:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ed58c0f86ea844baa357cb01a4d3e36b', 'E86C0DE57E29D05FD868F797DE347D93', 'W06893', '张立奎', '10.55.148.128', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 13:54:43', 1, NULL, '44e74bb07b4b4fceb9ba9ed135ea5e7d'); +INSERT INTO `jcdp_sys_session` VALUES ('ed6ba391cb654d2d94be976fd7ea9c9d', '38A1D821B09D102A3986EB604170191F', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:53:18', 0, '2017-12-23 10:53:53', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ed8633fcd4024a53bfeb2d7e0957774a', 'ACC10BB88D2176AE00C9FCC503F80549', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 11:59:58', 0, '2017-11-22 12:08:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ed8807e5cb844814a8b0f689c06851b1', '529A89F705473F76C27E87FD8D2B9F35', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:22', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('edadfab4f09945df887954b4313e5ae6', 'EF326701807B484890249B5BB79A863B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:19:08', 0, '2018-01-02 10:59:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('edb171e4b7ef47fd82fc6a6d4fbcfe48', '43CA4E35B15F8D2CB36343EE9776A6DE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:41', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('edd8a46367e9422d8e5acb52cc992bc8', '9FFC48A0364C5CC48E65C5699686B95F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 11:52:49', 0, '2018-01-17 11:56:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eddd544230a84a0cba037d15f368ab13', '3E568254659A7BC0A46252E7F614F62F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 10:04:12', 0, '2017-11-17 10:08:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('edee0751334e4e3791fff8e187bcc778', '3BCC34E4873B3BF577D0D99A8E831573', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 08:38:48', 0, '2018-01-03 09:06:08', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('edef3f5d876a450bb43c94c9406dd2e8', '58A6789AF61C5D4EC8CDA6CC0640803A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 16:45:20', 0, '2017-12-29 17:14:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('edf441f86e7949089d0dfcf1fb391616', '123836BD37C6B87ADA2D18B21D3F3C54', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 15:16:12', 0, '2017-12-15 15:19:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('edf543a6dc14473a883d63eddb1eaca7', '41122DB54B59E3CBDCDF59A5EDF45A50', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 10:07:57', 0, '2017-12-09 10:14:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ee1d50d6c0c844f18a52dafc288f07c0', '7FE597E5222E091F3E460C715B25D358', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:54:32', 0, '2017-12-28 10:25:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ee26f98a2b0a4832babd93f9ec6e2e67', '1BC46D3B7EA44DF3B3117BE02D4FEA9B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:44', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ee41d05e0d90444ead3bafe13ecdb379', '308E44970B9553105F4AE12A8EF2BB4B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:51', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ee488a7dae2e4cfbb5a171ab0da38011', '8B8A6F6A2CE4DD87F605A82BBD8D3A00', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 15:26:22', 0, '2017-12-20 15:57:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ee5fd2187c2e4adcad8b2fae9b5917b7', '523F4C6105AD8E90B11DB673E4286724', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:25:07', 0, '2017-11-17 17:29:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ee92c32875694b58aba2ab8f35ad5697', '7DB7F867748FAD9D9ED6B3DAC498CEA3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:25:59', 0, '2017-11-09 11:29:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eea745b2366f4e0db93a348c3e4e95e2', '3F5B0361E57C6D48988ECBA936D4C816', 'W07427', '刘聪', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 10:45:46', 0, '2017-12-28 12:26:57', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('eea880d8bdca45e5a7eec25a1cf61c91', 'E54AB65BEEBCD82F14B3678078992FDA', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:28:34', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eeb6e0819510460eaa80a003d9abff4f', '98A2B53E6BFD09D059105D0ED61B9AC6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:55:53', 0, '2017-11-23 16:14:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eebcd9f3e3d04e76a4a374d7ba6460b0', '8469A7606AB8BDD066054BB897681975', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 07:55:46', 0, '2018-01-10 09:20:20', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('eebe43db90c74942a7cc9475914df364', '37F8E1C4812D7A1C89995702CA979F43', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 11:13:06', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eeca370978d74a89ae79fd8aa20cc415', '67F02770DB51622A447EF1C7C30A244A', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:27:49', 0, '2018-01-09 14:28:45', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('eee4c59a92cd479cb15a6cfd86382403', 'F25A99EFFB2D6DF10241AAA9F76C8F51', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:23:21', 0, '2017-12-28 14:24:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eef536d9593d4f28a219e94bfc90b702', '9B102DC0A7E917CE233C335AFE6AD258', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:35:03', 0, '2017-11-23 12:05:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eef59305b98a444cbd58f724b9ee36a0', '3F42186E59462297D2394D9C35A28379', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 10:32:17', 0, '2017-11-29 10:53:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ef1cfba4862447a18c66a240d2ae77bd', '30C9602B534DE08C3CE614F7EDC7CA35', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:49:07', 0, '2017-11-09 12:00:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ef1da96272864d82844f6a90873981a1', '440EFDCAB2C19AA9ED533613AEF10DFC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 11:57:45', 0, '2017-11-16 11:59:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ef20777797dd475a8c22d04eaef6b439', 'E9F49F2381E403BC146AE045675C8D15', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-13 19:15:16', 0, '2017-11-13 19:16:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ef243f5aec094b41bcc831b87498e0af', 'B63C14AA1C23AC203BC4AFD3E3EF8917', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 16:34:51', 0, '2017-11-24 16:43:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ef3f98ff2f964c878db1ee81c2ea3581', '5DFC06FB1749FECC257D941090E8E9C4', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 09:29:33', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ef43524576384b19a3c478b10894e2df', 'CCAE1ABA3EDCB0404E4E93C2848AD85C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:49:52', 0, '2018-01-17 11:01:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ef4ba326e3a34dc3ac7dd1bbc5af18e6', '85575469448BB129AC5F8917D4736F4F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-18 12:41:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ef63d3e14ae54ab9a96f1ea734afe3c4', '6904D07F79E32B91705B2D1BC6851121', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-06 11:33:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('ef69c6c39abe46248e24387791850a79', 'CEC00C70EC2B788E89B22D0079A61622', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-23 17:40:55', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('efa54728fd44498db98e8e992d720c61', 'C7D777F23750CAF64157233536E0003D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:07:58', 0, '2017-12-23 11:49:18', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('efb48e1d8753403d9d7315fb6187f581', '923D1A67E0D374E489F271D147FC5A59', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-18 16:53:56', 0, '2017-12-18 16:55:01', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('efc57326d2af47aebcf4cb6ee12890d7', '5C1E77C7FD1C938F3A704B6D9663E3E1', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:06:37', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('eff270a3fc6241b2bef0febf6794bdaf', '5952956850F566AACE04FBC4285AB234', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:15:54', 0, '2017-11-22 17:28:46', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f00143caf4854bdebd6e5cf740e26b7c', '7E6768006521610B289C1DDEF0F609C4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:15', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f001d78f417749a3878f29a79a6c2571', '3C33D46271AA18DB9FF43C3F53A715DE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:59:11', 0, '2018-01-17 11:01:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f023a2d6958f4be484a0c10243cbe2fd', 'DB8BEB4C088C0F143605F3A682B0A753', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:41:00', 0, '2017-11-17 11:52:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f0322090484a498cb2062e2958ea5597', '506852BF79978A720FFF256D8D177CAA', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 15:02:09', 0, '2017-12-28 15:51:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f032fed8c6a8429184f4bfa8ba41a761', '6548F65806A18B09ED781DE60EA54921', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 11:19:24', 0, '2017-12-11 11:42:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f042a70bdeaf45aca6612612ff5cdca2', '2797475B104E4DC2E2A27F7532D29E58', 'Y08066', '靳晓松', '106.117.98.0', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-08 21:43:05', 0, '2017-12-08 21:44:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f044818a2f9741ceaa46f3629970dba4', '5F79F6DF751C1947916386507DF2AD39', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 16:17:36', 0, '2017-12-26 16:50:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f054b85df2ca403fbb4737db29e2b3de', '083C8EC07E81A0825BB5A1FED1171327', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:45:58', 0, '2017-12-26 15:14:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f07660105cc14aa4b1f82b64ff24b370', 'A948B4A0D8658986538F28D41A20D8CF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:07:42', 0, '2017-12-28 19:11:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f083e5583cf74662af217a5783c17bfb', '74B681585AB181804AA8E3C3650BEE63', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-21 18:53:29', 0, '2017-12-21 19:09:04', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f092ac085d244bb38398237258d8fd19', '6FFAA4E6962B1BF148F9AC25FC9B0965', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36', 'localhost:8080', '2018-01-17 09:19:03', 0, '2018-01-17 10:38:52', 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f0bd93c80343459bae90b2adcdc5cf8a', '3F48926BE9696CEF0088B5E1605B40BB', 'Y11037', '宁志全', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 15:17:23', 1, NULL, '2798eeaa5ed445749f80f71ef202cffa'); +INSERT INTO `jcdp_sys_session` VALUES ('f0c1ddffff3f416d9eace05361fd1173', '69AFE6FFEF4AC54B3DD5C6A7004D47B9', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 15:55:14', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f0f1167187cb44fdad0bb0d0c44c5ca7', 'A416755430BDB1232788B2D94301B4C4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 19:11:18', 0, '2017-11-21 19:12:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f0f8251872004368b695b75cd869c3f7', 'EA1E5697308301146142E97A41775DE7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:05:06', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f10749eebc0e46bdb0c6101f95e862d6', 'E5EAFC8E4C03E45641562B0E1571FC04', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:17:41', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f11e598dd3fc42f7bb543a75b7e4d9fc', 'CF589AA48E9A2A5CDDBFF7F043B0457E', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-01 15:56:19', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f12304c3e5aa4b6b918fe8f833c7feec', 'AF5293D27C32834A31B669B2DB3B5971', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:16', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f12f8c5947c448c79e1238439a5efa53', 'C4FAB3235480D51AA0533D5FDB631AFE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 17:07:55', 0, '2017-11-22 17:10:45', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f137ad9b03b94203a424d3be32a98add', 'C7E7AC60B7984C9AF6F00D3C3F10BEEF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 17:49:12', 0, '2017-12-19 17:51:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f1477c81dc81486589372405f0da2682', '713D23FEBA6378E4E86488DCE640149C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 09:42:34', 0, '2017-11-29 09:45:30', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f14b0b63c12c474691adb08e014f0fd9', '7129E88945F80E5394829C6BE22EE517', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 19:18:08', 0, '2017-11-22 19:18:36', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f172d26d2145475baade44b9822897e7', '9E388DD8842C17BEC501054EBDDC0CC8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:10:00', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f189ca8b10384f5d99d1702c9f54f533', 'CEF8034247308A699041C8DB8FEF0DF4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:01:42', 0, '2018-01-17 10:16:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f18ab60e0fa34cd3b0488c5ea3d9c4a8', 'B88A8AB2E4D0ACA56C473B1C8F051ECC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:49:57', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f1a4d52021be4f71b23d58b80b528d28', 'E5C036F849F466F16D07520DBE5C4C4F', 'W02030', '杨卫东', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 15:57:01', 0, '2017-11-22 16:04:55', 'e9688858640e4868b4dfdab1d3d30ec3'); +INSERT INTO `jcdp_sys_session` VALUES ('f1ac0180dc014ec1bd96f0bdad87a483', 'EF1F42D2AA51256B346035BFFDF4D790', 'W04028', '武楠', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 15:38:17', 0, '2018-01-17 16:09:15', '7dcd4e266b8147ee8bf0195fcec6f6be'); +INSERT INTO `jcdp_sys_session` VALUES ('f1c4c19be13b4c66b4900e845041208e', '2319CC867463F0A869F682428D3963D6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 16:47:42', 0, '2017-11-17 16:51:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f1f69709c2db4f0cac0f6345182e05e1', '37E39BAB11EB6BB9603FF245B78A6C74', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 18:03:28', 0, '2018-01-16 18:09:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f211d175173f4f189de0ddd1e98d891d', 'DC78C2F9B44601CD954B67011EE783B5', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 09:43:09', 0, '2017-12-29 10:26:11', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f21809729a2942b1ab2fbe5d38474a5b', '5F598487F41701697A46280050BBFB50', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:32:12', 0, '2018-01-02 10:05:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f2194163ae68491986af76aea09fdc0e', '1F3022F05316A8EE7612B07351F1771E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:55:46', 0, '2017-12-29 09:35:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f22c38f7c7ce4eeabf6c69a5ac0b93a1', '3139C29F9EFDB60183F30AFE8E1F6609', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:05:16', 0, '2017-12-18 10:07:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f2617769e7604ee39b4f8e5c3fbca498', 'F77F29E8EFAE06FFB3AE60FA3E82A4EE', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:39:45', 0, '2017-11-08 14:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f282cf568c524288a08ca478f700ee4b', '27031A66C7FB80CB38F4C57B1705649E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 10:09:01', 0, '2017-12-23 10:11:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f284ab9639e94a7fbe2798661f2dcdbb', '8BB1CE693DA41309622DE2FD75AE2E22', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:05', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f29eb43c074d499ab28ecb690328f2a5', '856FB5B5F978CC353A12CADAEA05BB2B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 11:08:55', 0, '2017-11-22 11:10:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f29f94916bb64c48b4b8db58ab185da2', '77095BA9BAB41A4E59C2C6058874D622', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 11:25:01', 0, '2017-12-23 11:30:19', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f2a9a3745b5f4f1f83a8e7d13b8ef76b', '5DD63441F617C27FC74C3692F5BD0630', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 15:41:23', 0, '2018-01-05 15:45:45', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f2bc7bb82cff42be8dbd577702c2503a', '93A2D4EA1810EE69370DED535BB9E42A', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:24:27', 0, '2017-12-27 16:26:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f2be8e9a140147e885f849cc337a05a1', 'C2AC3A34EEDA90F85D970716545697F5', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-10-17 10:09:45', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f2c0efa964984016bcef7974a1b67a68', '40544B07AB318B26D64E4B01D3783E20', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:12:34', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f2c2ca848d6345d99d4615050d55aa89', 'F954EF1E3D89FE42E7CBEC6D0547B92E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:38:00', 0, '2017-12-25 09:40:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f2c53b5071fb427c84f4baffaeee1fda', '715330921977046AA9B86242B21D3FBF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-09 11:24:38', 0, '2017-11-09 11:29:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f2f6ce3b7b944703af364063a1fce98d', '66233E6C324027C4D8391D0B6C029ED3', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 12:05:14', 0, '2017-11-22 12:08:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f2fd33771eae4d1d9790725be5c7b4f4', '923FF3283499E77885BCD38B733AC8E0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 08:56:18', 0, '2018-01-17 08:58:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f327eea952ba4bb1a634240007a23b88', '13F710E15B910A1255025194052FACDF', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:53:58', 0, '2017-12-22 18:04:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f3413e36af4b48ac8a59231c60bfbbbc', '300C5FEA7F0817BD8E9CC42946EFEB2F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 17:20:46', 0, '2017-11-17 17:29:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f3491c998eef4b7e882ce61a884dec58', '877AE8E5933E629BD56BFB01A303B89E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 18:04:31', 0, '2018-01-16 18:09:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f39690f60f7a45dcb7d462ce970ebd59', '5835637AD965A9E7022B9F6F1DF9A3FB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:58:22', 0, '2017-11-06 17:04:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f39b7ceb7a0843a389d673d3eb335441', 'E9DFE38935E7AEE29310D5D7D9116FAC', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 10:53:42', 0, '2017-11-17 10:55:40', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f3aab667eb564041b50de85999dd34fb', 'BD53CD186F8E50B7CC0797253C3FE773', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-05 11:32:28', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f3ab22475ab442fcbe3f40c4d0a811f7', '7A5B3D7FDB8D1D587A76D88359E510AF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 12:22:07', 0, '2017-11-25 12:43:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f3d344dfddfb43019d90f9dfbca245e7', '6C70F679297CCC0824E2C71AB495F0A7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:05:03', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f3ec74c8baa04650a9e8dbc70449fb54', 'FAD4ACD280F0232C86ABD98F15ED1E19', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 09:32:33', 0, '2018-01-03 10:06:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f3ee912f180e4ba79e0209a36f1b2a63', '93943B7F1C8069E0E4AD6C3B0DBFDE26', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 21:42:02', 0, '2017-12-13 21:44:27', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f409cd5c4ee34a559fa8e4240fc8f8aa', '197834A667DE6C4FE8B456A0633A261A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 11:59:10', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f424549227914c89ade648d2478f6938', '71840B0DB12B731811606D846BDFDD88', 'W07427', '刘聪', '10.55.148.148', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:47:44', 0, '2018-01-10 16:51:23', 'c2649ae0bb9148f98c62f1a5b5f01652'); +INSERT INTO `jcdp_sys_session` VALUES ('f43272ba0ad24f37a5819148d21eb604', '07CCAF7C4DBDA4D6F0B9E7B722DB99AE', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-08-06 10:14:06', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f4340ca0baa4467885dc10b7a048a8ec', 'DDD094F1A65295A1B78C7817BC79D550', 'admin', '超级管理员', '10.55.68.90', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-20 08:51:40', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f4369b05ef5743c8a45c4a7f3e00b9d5', '7EC7FC8898D4F8A9EFA74EC5302CC80E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 14:22:12', 0, '2018-01-05 14:24:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f43aefabe8304ff3ba53a92f913d75ad', '70207676A49DF4F8527957FBFF4C5ED0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:21:55', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f44da59f60bd496e9750cc7cab370b73', 'FA4093C7263F2BE657E4530B0F3DA450', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-08-16 16:40:29', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f4552da608b745109ec146da1df9f417', '9B2CBA8A5719A0EA6F6DAD6F92F26846', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:04:28', 0, '2018-01-17 10:04:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f45f50d6339b4a3c97c8f5dd3e0ffa02', '0FCC396371C6F8E2BCA1AA91F18039C4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:36:55', 0, '2018-01-02 11:39:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f47098ea918c455299572b423565e99f', '6B4E2EBDC3E16768CB6A17117DD8369E', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:35:53', 0, '2017-12-27 16:38:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f4727358bfd84348bc004ea330237acf', '334DAE2839C8F19A9779AA36BF32C2F8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:18', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f48fe233cede4babb99b379d26c42338', '03D3582F41E0D3E76BFCCF6772C3C841', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:17:16', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f49e6d1dc4d34766bdd4169e178b3f51', '024C24317698EAB60BDEF0231841DE40', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:01', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f4ac45349194405e8a6f2375350e7fe2', '8A43AA491FD995BE3E6735890CF8CF5C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 17:39:57', 0, '2017-11-21 17:59:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f4bffcd5e3dc45afaa0b7671b07e5d17', '6C89F01CE194ED50FAF45E9700978851', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:47:48', 0, '2017-11-24 17:48:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f4c00d2ea233461eb6f9e464f9b6fcf3', '71EA94E0939D6C0CC68029313B0AC1CD', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 15:57:26', 0, '2017-12-28 17:12:17', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('f4efc5f1c6274678ae5aa2e6adf54962', 'EA96715086687085BFCEB53EA636A79B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0', 'localhost:8080', '2017-08-10 14:43:03', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f4fd5ad8c09f424aa635e5f4441e068b', '02A52966D6832D587E816A7B100954E1', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-19 08:21:32', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f5018e9b64ee451ab90ec82f5b6b5f75', '80944B3B35571165C25A1F8834A8949E', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:18:20', 0, '2018-01-10 16:24:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f52a660888d0486ab67671f34536a534', '7B75F94E83CE18CA95A381127EB0182A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 16:17:29', 0, '2017-12-15 16:19:42', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f53e7114931f40909d0aae805f9cc0af', '7B38A36E86C0460E7221693A164FCFE8', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 19:07:33', 0, '2018-01-09 19:17:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f5412ad4d6524ff8af56afd1061562f7', 'C09790529976D9EC350FCC2210BBD3BF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 15:56:17', 0, '2017-11-08 16:00:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f548a7b95e3940fb8b6cbaa41ff3ac7b', '51B2EEB0CA091FA049B2CCEE15883117', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 15:09:24', 0, '2017-12-19 15:11:09', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f55c4436b76c452483345549e6a89509', '6552562A64E34FDB4805F5890774357F', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 16:53:56', 0, '2017-11-22 16:55:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f570139cf20e4c4189b87144e97bc2fb', 'A4FCFD624F2F904E519E557333C67103', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 17:26:26', 0, '2017-12-22 17:28:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f57ee88de79b4da4bf28e730bf70190f', 'BB915C525E41B81F823CFA166FB033D2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 12:06:06', 0, '2017-11-23 14:01:26', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f594b572823146919aa66d67b4866bac', '1662EEAB0025BD9BBA789574D453457B', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:07:53', 0, '2017-12-18 10:16:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f5cfb17e5745465cb75cfe63b0dfa9da', '7C8171C75EB8D0C439D25F59B0AEC439', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:20:09', 0, '2017-11-25 09:30:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f5d1e0bcf43b4a5b99a0c66c5c970b95', '4104CD805F790A1988B6F9B84A88C271', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 15:12:44', 0, '2017-11-17 15:26:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f5e9bd157c9746498019b46b81917be7', '79924313828C3B8359D58A144568A0BD', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-25 09:06:05', 0, '2017-11-25 09:14:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f5ef945de2994c87b2e3b021d007adc1', '06117D25D963D1B702E0A6DE0FD316FB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 11:26:00', 0, '2017-12-11 11:42:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f614a892045a41b981eb1a81e729a5eb', '0F080E7DFC49418A36069915CCEFBB20', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:20:03', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f620daf5fec140f9b48ee9c28bb0ce55', '47242BDB2F64E743EA06249E4AEF2522', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 11:20:48', 0, '2017-12-12 11:23:14', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f62c760e108146a6b519e494f27b97bd', '51DFB558DE56682078187476AEA45C79', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 14:41:30', 0, '2017-12-15 16:15:01', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('f64ad4dc5327439f90aaf97ea2f0ec1a', '7E9A4AE32CE1DE00C07068CA2865163C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:34:12', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f65e678628f142328c2bd3705d591b96', '1A00409B433C1EED2B460813F067767B', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 08:24:37', 0, '2017-12-29 08:58:07', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f679801324124fcab412a7ea8dfebbc8', '7270C8B8619FDCA6F2D68462D1837B79', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-24 17:46:38', 0, '2017-11-24 19:33:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f68a4138f30a427c9795b26e1ea35c17', 'C425E82CA6BCE5C4E27E2B24B795EC85', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 12:01:08', 0, '2017-12-29 12:03:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f69774c5d4e64743a13d370333aeee3e', '10C9B6C1FE7C74ABB4BAF55BDF6896D5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 11:59:55', 0, '2017-12-13 12:03:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f69b11b344374b04bb19ca60f4fb537a', '8668F19782F5AAF64925EA45EA96B18A', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 19:33:09', 0, '2018-01-04 19:35:13', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('f6a29176ecae4877b9fb6952537e47ef', '7E0F712371A57EAAD8AD7328562C7F3A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:49', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f6c171c7335b4b339e5e21363bc02c0a', '589158DDDFB53C00E24401F837E5F5D6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 17:31:19', 0, '2017-11-21 17:39:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f6d4d34a89314637ab9a6b9a0575348b', '93FA3402327B9C5135CB0315278B8ABE', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 17:24:19', 0, '2017-12-28 17:24:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f6e10d14651141bc9e3ace25782c9813', '9E24AD0EF723E6C052720E3E14588C8C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:05', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f6e283cbca4d442f90c7e99940d1eddf', 'ED966AE4F52858D0BF3BFBB8933BB80A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:39', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f6f657adb81045c2a77e670e4cada0b6', 'A09C90327BDD91B340FAD1FA047850BB', 'Y10047', '张锐', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 10:03:17', 0, '2017-12-09 10:33:11', '5619c0acad764d84989e69bc5c57b461'); +INSERT INTO `jcdp_sys_session` VALUES ('f71901f51fc6432cb7c33918c7bb85f0', 'BAAA577B83D0C70E1A3AB080CB82E223', 'W07249', '李维佳', '10.55.148.130', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:01:12', 0, '2018-01-10 15:45:23', '5e0b157de9ae4c2495f3918e7625431a'); +INSERT INTO `jcdp_sys_session` VALUES ('f71eb9451c13425584c8b6ce5c680451', '8DAC04420BABE84A1D90B675906A1068', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 15:41:32', 0, '2017-12-20 15:47:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7343c71b9814165a3d00be5240d1e35', 'DE7EC66541B587E3FB2C34101AED6FDB', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:41:18', 0, '2018-01-02 12:19:08', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f73adaa3f6aa4143b44b5190beae9d1a', 'A740FEDEBA2869614BC0BFBEBF30E101', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 16:51:14', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f7495bb2d7bc484596c28d1daf559e4a', '6BCA83340645B168E2ACAA7CE75ACA78', 'W07249', '李维佳', '10.55.148.130', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 07:47:18', 0, '2018-01-10 11:26:21', '5e0b157de9ae4c2495f3918e7625431a'); +INSERT INTO `jcdp_sys_session` VALUES ('f7528cbe9c3342b0a18aaaaa97ca5229', '1FF40733543291B311F8EBF47F536796', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:59:21', 0, '2017-11-23 11:22:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f75c455d9dbc4103ae6fddb62aa58e0e', '41460EC36F07ACD10BBB8A2BCAD628D4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 17:56:35', 0, '2017-12-26 18:25:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f76943a89259481c8bb318af51c6a2a9', '37FC18FEB245D4CE195F34354B5B180E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:36:08', 0, '2017-11-17 11:52:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f76aa402f9ef4f37b69c4fac7c9a144f', '4A3B94A0D046870014F64218978B5EBA', 'P12082', '屈春安', '10.55.148.141', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:45:55', 0, '2018-01-10 12:32:21', 'd69c39dc65b24904838f2e9f604f2feb'); +INSERT INTO `jcdp_sys_session` VALUES ('f77361451da5449a9031bbe0e30e1d2f', '92C193B95D6385EDB77F328599BC9CE2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 17:35:09', 0, '2017-11-29 18:09:31', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f783c2103cc748c59917bb81ef3d4b36', '3C14919DB20C8CFB9D04A7E9CC9EF3C8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:58:26', 0, '2017-12-27 17:16:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f787945465844c078ea2146a09ecfacf', '5BB5891A6EB1D9420BBA68B0ECF6B204', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:16', 0, '2017-11-23 14:32:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7933e88dc864578b178d46e70dc02ce', '0C73976378DAC185BF1F7D188C6CC392', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-18 10:08:23', 0, '2017-12-18 12:34:08', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('f7b3348120924662b475ed5a3720f58c', '9AEEE192D51ED75CA34C1853B9E18971', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:59:06', 0, '2017-11-17 15:03:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7c5bd9ab1eb48919334683631bf9ec0', '1FBD435F1240AAA9BED2D3F478E0DB5D', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:00:32', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7cc3cfee09641e28cd32b37e5a4d29c', '4357026168E74E629AF6A8DAF34300E8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 11:59:23', 0, '2017-12-12 13:58:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7ccf462211349278753136d9e59c089', '18F9FD4D92103062033446B7691C36BB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:02:37', 0, '2017-11-23 14:33:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7cf01bf051e4e28b93cf0300b301185', '817CD48CA2B16A31CB92CA3F5B79358E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 10:34:41', 0, '2017-11-16 10:39:02', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7d003b75d1c42559b369d96a29f43cd', 'F73F60434E7B2EFB44447116AC5BDB03', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 10:58:42', 0, '2018-01-09 11:01:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7dbef7a62584a81a5ec7393f44a34e1', 'AF71F9ED1EC5FD21F7D1724B40BA6839', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 16:25:28', 0, '2017-12-27 16:26:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f7e0e0d0d5af4ab1ba028f57730394ec', '67B4E0B0E476C36DEB5CEEE4591A5251', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 08:44:07', 0, '2017-11-18 09:12:29', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7e9d36f9379481ca979b8839adffbab', '15B2A8A8826955725FCCAB44BB9C9F5F', 'W07675', '马成', '10.55.148.200', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:51:58', 0, '2018-01-10 11:26:21', '521d08563ab74b8188599be180575bcb'); +INSERT INTO `jcdp_sys_session` VALUES ('f7ed2e1d3f5b4c139abf313f015d4f53', '115CA9A95E358F7EE873CAA90B38A657', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 14:20:56', 0, '2018-01-10 14:51:21', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f801494e697644b0a8097be4d6e4d2c1', 'AC229F1313CB73D549CE5355DFB4A1D2', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 18:14:57', 0, '2018-01-04 18:26:13', 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('f8194c6489ef41458dcb3fb70c2874f8', 'D82024D386D4957AB007A79C5D321DF0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:49:56', 0, '2017-11-23 17:09:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f824d8faa48c4ad28b5858ae2f1f898a', '18B9705EC586D645545D30C2DCBE6573', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 17:29:58', 0, '2017-12-19 17:34:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f8259ba568ee410fb325e421bb2423a8', '0703F000EA0D353528C0271EA6470BCB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-04 20:02:54', 0, '2018-01-04 20:03:10', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f83bd97943e04d3bb35f93b2ce06ce81', 'EC2B8BB9F0EBBB1DEF32B27DF083C77F', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 17:50:53', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f8413f508a1d496686df1c8ff0bae7e9', 'FB4111E0B8040E97317F08B39F1A86C4', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:35:22', 0, '2017-11-23 16:12:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f8422557043e48abb98cd07c80db8ef3', '21F4681739821C158DD1E395300D8410', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 08:39:42', 0, '2018-01-17 08:49:03', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f84bfa994ece4de8881d92fdf2a0fdcf', '1D7E1FFC393DBB000C775DB31EEFFEE6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 14:43:55', 0, '2017-11-17 14:48:38', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f85ea9bde3704337b657c9f2842ef322', '933AA67D279DEF2F8BF70E37E24830E6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 11:30:15', 0, '2017-11-18 11:36:50', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f86b705ccb1748f2a580c3f95c038625', '95032D0F0B2D627C5843E9F6A4246C8C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 13:59:40', 0, '2017-11-07 14:19:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f887a282693b4506b16d4d42f87d0954', 'F68502AD2A9E963242CE916CD25C4440', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:21:11', 0, '2018-01-16 17:22:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f8a7b773620b4b749f1a4b3e1e54f9e9', '449E17BA4C138588620E90E25CB303A7', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:44', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f8bb09cafb194ddda707fb1b63455505', '2E3C022E9C8D6FD173312A4145F09F60', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 08:37:13', 0, '2017-12-26 08:37:46', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f8d20bcfe44b459e9db52b83c06a0d88', '44AC00D96C3CED947522828B7926EBB3', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 10:44:54', 0, '2017-12-27 10:54:49', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f8ece791afee464bb83e4d85028503fe', '7770EF7ED293592B40849F41A4372097', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:46:03', 0, '2018-01-10 09:18:13', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f9104a42dd27414f8931dd2b59637fa0', '6FAF6D805CBB757D1829B214784EB57A', 'Y08165', '赵志', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 09:01:56', 1, NULL, 'beefed50d1fa4e258842b5e46acf136b'); +INSERT INTO `jcdp_sys_session` VALUES ('f91492e6e5b34804b5a4d7f7dafdc42c', 'D61937348F8D73864306E95984B30105', 'Y08066', '靳晓松', '106.117.98.0', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-08 21:38:38', 0, '2017-12-08 21:42:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f925af64a0674b339f79c58581b51ed3', '0FE2423D17DDF6A76124F7163B830D34', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:30:05', 0, '2018-01-02 10:42:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f92f3e612ad243bba5175bf282b787e5', '0441ACAF379A74D1F0398EC98AD153DD', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:45:57', 0, '2018-01-10 16:51:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f93c1e17401244af8b26556e0ce1bfae', '38BE2F5F81380B43C2FD8FC368A32FB9', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 14:48:47', 0, '2017-11-23 15:19:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f943d652b2a04f91a4f0293e02a37a49', 'FFB3D178A3C6C06849AB06F412E78165', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 11:29:10', 0, '2017-11-17 11:34:41', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f95c2da13b504d38b31606260500b236', '07FD403015F7217666195DE37737D532', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 11:29:59', 0, '2017-12-24 11:31:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f96b8c2899d440c6a4f231f173fbafa9', '9FB401EEFE26E9C58F314A1037806408', 'P13160', '郑雨昊', '10.55.148.134', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:29', 0, '2018-01-10 12:16:21', '1cb2fb93db774202bdd2532fa57d9bff'); +INSERT INTO `jcdp_sys_session` VALUES ('f96dbdf788a64e2ab5a66fc692e9d369', '3685D9A5EE2A1639255C2468913351ED', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:24:31', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f97c6c2532e54bebb20842122c0c2811', '87037D58E8DB9E4DADE01C6799B67ADF', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-05-27 15:17:58', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('f97d7e6402bf435e8d5715fecdd940f4', '3303B2023FCAC1EA5DF31A19897D5A8E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:35:29', 0, '2017-12-28 11:39:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f9bb43ba3f2d42a9a94d7599e3eef7bc', '232215022115A6D38BB3E27AF053E0E5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 09:47:55', 0, '2017-12-25 09:51:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f9bf8f3a4747414183c518a3912f964e', '7E6F488561878868F074CC780A957FCB', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 16:02:46', 0, '2017-12-28 16:03:24', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('f9c053de47fe4e7ead01367e2b5540ad', '6E22E56F0D89839988C9EED43F0F5850', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:01:52', 0, '2017-11-23 15:32:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f9d54e17b1bd4d898b95d389ea4a0076', 'ADBB07C44C1CDD779CFCEC7028EE2BD8', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 11:16:48', 0, '2017-12-28 11:17:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f9ddce246dc447c38557ea569058fb48', '7D01724309693EE9BDDC554FE976AE86', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-14 14:09:22', 0, '2017-12-14 14:10:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('f9f95fc2e18f48c984198c8d84fe588e', 'AB3D09D357FAA62DE5EF0CCE23DF1B59', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-28 09:09:04', 0, '2017-11-28 09:10:16', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa0ccca80dca4a84ba9815705c04b73b', '0E7C5EC025C53C8005AAA701638B8475', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 15:14:23', 0, '2017-11-07 15:15:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa1033ea275d4d5680676be0d0ea79c2', '69FCA89EE2F35702A339D9C799FD5A08', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 14:49:19', 0, '2017-12-26 14:58:42', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('fa19f7182c9543b6a513cf1776426114', 'C2EDC52C8F55AD98BBEFE72950B231CB', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 19:02:32', 0, '2017-12-20 19:05:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa3a839a63d347b890180c19a79fca92', '47C143C8C3D12228B2E01538AF5AEDBF', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-05 14:35:11', 0, '2018-01-05 14:36:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa3b69f48b5e431ebff65b997d5664fa', 'E1EA7BDBF9F1D678BCE0573A350EA5C7', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-07-04 17:05:42', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('fa41eb0b9db74d6d88251d7f1123fcd4', '7D6FDA6A40E28CF06E9CD48AEBBAC6B5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 15:11:28', 0, '2017-12-13 15:13:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa4519fe0d474bd4bb713b3341f98097', '73873865663E19BC4FFFE5D4476461E6', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:44:15', 0, '2018-01-10 08:44:28', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa48107d490a45eda08f9934de96e4d0', 'DAC0489BFD0752629EC7E6FCCDF60233', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:12:57', 0, '2017-11-06 16:18:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa5858a2734d481c8d56ab79383bc9a0', 'E04A7847162DFB5DA04B63C71BD30B50', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-21 16:13:11', 0, '2017-11-21 16:17:33', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa626e816cc8434685fdacb81f79088b', 'E6E972A6F7B8910E3C47A2C7C0EB9041', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-22 16:40:58', 0, '2017-11-22 16:44:55', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa6879a02f234520bcd1667bf9da0726', 'A5863F47E15B93EC34FB4F8B27849801', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 09:03:35', 0, '2017-12-27 09:37:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('fa707f354b224204b6e6d4c158f3810f', '1B756BA839FE3C3153208039648E21F1', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-15 16:16:22', 0, '2017-12-15 16:16:58', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('fa76a95a766b48bb935ca42f30789eed', '0BDCE0F9C1B6A21D9DD66FDB2761867A', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 18:38:24', 0, '2017-12-28 18:40:07', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('fa7e6cc74d18471bbad7e374dd4e1d90', 'F8EC3F221CA5F4BE37389451CC10FD55', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 20:33:56', 0, '2018-01-03 20:39:37', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fa9f879907d049d9af932806ba38ea64', 'DCF70DABE815F1A54DC5C907E021F375', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-25 10:13:30', 0, '2017-12-25 14:01:34', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fab0349121824e3983cb1c66a884867b', '64254655864BC2A93865FD6A4865ACC8', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 15:36:30', 0, '2018-01-09 15:45:45', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('faeccb6b0ebe4dda9b0e4ee6cbad3cf1', 'A88DD8C8E9294B56E13101312CEF5A56', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:40:00', 0, '2017-11-08 14:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb07739607424980a3cfe67ba3d02616', 'CDA4E3A354EEAB91A7011B6A3BACC5AA', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 08:47:55', 0, '2017-12-28 08:49:56', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('fb0aa1d391c04b76b7bf118f007ed820', '8505C225131A23AA89CCC0EE172F89C6', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 14:11:28', 0, '2017-11-18 14:14:58', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb1d87ffff2e41f3b3b1ced139b4f7fe', 'F47A66566474FADE361ABAFA081CFFF5', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-23 09:57:34', 0, '2017-12-23 09:59:17', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb1ddfd2e7704c6a8f128e642af4eef3', '1BC0E3B477D2CBF88F5871A8C24B8361', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-19 19:34:35', 0, '2017-12-19 19:38:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb3ac26191db45669a22bc633c8ba72d', 'F9A0AA46FD7D260052DDBC09835E63A1', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 11:56:23', 0, '2017-12-13 12:07:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb40393779d74017a25ef061ff25a85d', 'AF589FE99758FAA9DED402AC570F3289', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-11 10:40:18', 0, '2017-12-11 10:42:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb446ee5113c4115b9db7ebd457c2a8f', '136BD1F282E27A46F4DAA59D17725B11', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-09 16:23:08', 0, '2017-12-09 16:25:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb505b8ec92b48f799c50aaedf3a35fd', 'BA96C68EE10B51256BDFBEFF9227A074', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-16 17:32:15', 0, '2018-01-16 17:46:48', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb6056c1fc2f44cca5af75fa4ddfd0f0', '7DBA8D29C5F298C185394D3F2899FF75', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 08:31:56', 0, '2017-11-23 08:44:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb69df7691734c0d83e392ba5d214510', '7907687D95BE2AF3F7352DF00D07B854', 'P12188', '赵星', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0', 'localhost:8080', '2017-08-23 16:23:16', 1, NULL, '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('fb83447f9785436b9f983a1f9e28c786', 'D0B0A5F9A97ED2229BA1A9C339094657', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 15:26:46', 0, '2018-01-10 15:30:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb8b553c3b6540e1854d96889e207620', '7C52DA0814F074433A619F2CA61F4B69', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', 'localhost:8080', '2018-01-02 19:52:09', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fb8c3adb0c174171a1f21c27cf0a8eaf', 'E9D66851CC2B74039FE09AFB836B0F3B', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-02 15:21:58', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('fbcbc23eba4b4de5853ae8c0343b28b8', '2361C4F3ACFBECC638CB4EFAB536CDC8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-17 09:16:47', 0, '2017-11-17 09:20:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fbd1ab13fd7d42779843b2732de835ad', 'ACE60B3FFB48906B127FA77D922AAF6A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-22 18:07:51', 0, '2017-12-22 18:09:12', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fbe712831fcd4f71bc0a30dadd74e922', '50A7FED89F44E96B0BD2B2D4E0079948', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-07 14:43:15', 0, '2017-11-07 14:55:49', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fbeea0430b7d4540a4a6fa923859caf4', '62DFB78014953C0F40EA811DD60E9ECB', 'W06555', '王晓明', '10.55.148.231', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 14:52:08', 0, '2018-01-09 17:29:20', '340fe94b0464472e88cc0fe7065170dc'); +INSERT INTO `jcdp_sys_session` VALUES ('fbf719243a3f48c3a2ba6f71a3dfd3ba', '1DB665D18680EF06F76DF9427AF1FD04', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-06-24 08:45:47', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('fc06569dfe3e445d9a93193006715ff8', 'F614BB5AFE17E248F750A24627CEE4E8', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 10:53:10', 0, '2017-11-23 10:56:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fc120c72cf9c4e0e84ee52a1bcc69f5b', '55A95FAC3883233A50783E491CFD73DB', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:30:21', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fc154a4cb9d94213b77dcd81b908c471', '0BED6CB8C259816E3B2FE9EC4C41BCE9', 'P12189', '赵简', '10.55.148.133', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:15:27', 0, '2018-01-10 11:26:21', '5676921ac94b4633a614892676567bfb'); +INSERT INTO `jcdp_sys_session` VALUES ('fc1eb52ac8844f2e9673728bd21fe538', '640E8D2B4F090B490C32BBD5B1A9B8CC', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-16 16:38:48', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('fc26a9a1607140c08ba456087b9b4f3a', 'A98C105D7367AB2AEAB1E890E1EC5489', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:32:59', 0, '2017-11-23 17:40:06', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fc33e8d8b40f4350bf9b5b68956a0c8a', '869F19EFC0BA9AAED0EFFE9E6F3DC47D', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 09:22:44', 0, '2017-12-28 09:22:48', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('fc39643b296e42ed85e9af274d0dccca', '852A3B1C6C2A8BFD409112ACD9A81728', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 17:28:13', 0, '2017-11-23 17:40:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fc7789d930b4494aac62b86e3c7a6195', 'AB4EBC80C74F3833D7FF032FA44CAD72', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 14:23:51', 0, '2017-12-12 14:25:15', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fc79c82d96e748ddb52901aaa6139cea', 'AE143E112111CD7AA2730BACB4D4FEA2', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 'localhost:8080', '2017-09-27 09:19:50', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('fc7c02c909d64b6ea06fcbc1bdfdc32f', '0E551788A0228594EB0E8453B5F41B92', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 15:11:00', 0, '2017-12-20 15:22:18', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fca5cb61f46a4243bcd9628bc0847264', '85CA23568A2749F36D661EC95E6D332D', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0', 'localhost:8080', '2019-06-05 08:27:13', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('fcc5c0ba9b9c4350803663ec18f61673', '476F3484F8BF67AE5843CEB8F69AB802', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:15:40', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fcef75b4c9db4c28acf9e5aca748585a', 'EB73A74D4D7D1C96F0E8834F99912A79', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 15:08:19', 0, '2017-11-16 15:15:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fd1219f53c08400a8d524ab5f38b9a53', 'FABDFC4373D24DC790EDE74C990F239C', 'P12188', '赵星', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:05:37', 0, '2017-12-28 19:07:07', '3930ab98da0a4e82aab1824823135576'); +INSERT INTO `jcdp_sys_session` VALUES ('fd2b27227f3c415ba9f50e514b743127', 'BAF9147232FAFF46769CAFE645B8C18E', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:09:28', 0, '2018-01-10 16:13:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fd3a77b90afe42229f5cd27380c16f7d', 'E7A90841029A85CA964AAA510E708510', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 19:07:42', 0, '2017-12-28 19:11:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fd661162f56646b089d8f52793db2b50', 'A39F816DC00E5EE694D3A8B2711D9C60', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 16:22:31', 0, '2017-11-23 16:34:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fd7d0b71d7344eceaabd443018ca9895', 'C488ACC90D76C7BF36690D2285B7C1F3', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-29 18:00:07', 0, '2017-12-29 18:31:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fd8e0c73af204ca688420922c572da66', 'C2BC398F56595D8744F278314CCC804A', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 11:01:40', 0, '2018-01-02 11:02:43', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fda0926a156745649b291416d6abf0ec', '8DF9396B442F2919CA2B06190534D5FC', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-13 14:22:10', 0, '2017-12-13 14:28:24', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fda258f6c006455f8d05c7d33b1c2b84', '0653721E597910720CD55599DE5A1174', 'P16086', '杨天玥', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-27 18:15:14', 0, '2017-11-27 18:19:13', 'fb90ee122f6c47269d77942b56a4783c'); +INSERT INTO `jcdp_sys_session` VALUES ('fdcc1ac0ce854763910a401589c66eb9', '125FAD4EAE7C20D8A2F191E36747CC64', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 08:54:17', 0, '2017-12-28 08:56:56', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('fdcd87f6268b4d0fb9f44ff00b82ab8b', 'DA79350B471C48BE72BCDB9186E1B7A0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-17 10:55:38', 0, '2018-01-17 11:01:22', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fdd1b35f5c3c4b01a09865ae5c04a72e', 'D953A463F9595B9398CD4028E8736FD0', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-16 11:42:03', 0, '2017-11-16 11:47:54', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fdd485fb95e04c8bb05fde8ff31f30da', '648230A97227A11A1FBCAA88A0AB1681', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)', 'localhost:8080', '2019-06-20 17:01:03', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('fde1bc3b4ced411396733a364f600a11', '103C1ECFFB6F926D79620FD2148B2270', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-09 17:42:49', 0, '2018-01-09 17:44:20', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fe209477c23a4a94a132ea5b9a6d2a74', '1F0342912E5157A0DF8487FA409C5155', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-18 17:01:27', 0, '2017-11-18 17:06:52', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fe257e73f79f43c9bf8b0c6894b77b5c', '6A2B04894AEFE2012A0AC9FB7B3B3DE4', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:80', '2017-12-12 11:48:48', 0, '2017-12-12 12:21:51', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fe357df9ee7b44d0a7bff01c932bd9fd', 'C58ADD8C60D3BACDBD0F0CBA2A1E75FE', 'admin', '超级管理员', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'localhost:8080', '2019-07-15 17:07:51', 1, NULL, 'fe24c4ac34444902a2129ec1debf9ed4'); +INSERT INTO `jcdp_sys_session` VALUES ('fe58eb978e6246dea00ba2874180a410', 'D4E39BF1F84D2FD653A9202018487D7A', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:22', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fe5de6eebc064eb4a5829502bda2dc22', '10474B6CE637B72D8049B1DE5CDD0B28', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-27 14:40:36', 0, '2017-12-27 14:58:51', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('fe8c551da00d46c6b035ab3d9e6fd00d', 'E6D10B4231EFBE629C4A0AB6F70DC2A2', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2018-01-03 18:45:32', 1, NULL, '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('febcd97e378b4ec3a34358c264c31353', 'B04E513171864C718F8046792BD7291E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:16:13', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('febf560274644fbdab244654295de21a', '0CC601754915718DCB4D232EEDEE1B6B', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-08 14:40:17', 0, '2017-11-08 14:41:39', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fec921f3ed1e4b588419840dd8c82e04', '553346E4DDED4B61F85543D0999BEB42', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-10 09:21:22', 0, '2017-11-10 09:24:11', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fecd841460c84fc5afd3ed79aa4f7b7b', '543A284657BF96FDCA36BB2DCDDE7268', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 09:23:47', 0, '2017-11-23 10:07:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ff0192cd044445b880604661a96a8225', '943449112DE7EE63D37118E262B35719', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-28 14:31:49', 0, '2017-12-28 15:02:58', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ff0e527ec2cd41319f5821a939161f4b', 'ED086840ED63E88D7D4AD17BC133205E', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-20 18:40:41', 0, '2017-12-20 18:54:56', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ff396f8ff9dd4911a1ea529aabd08932', '790A2B73BC7259BF838E18747235AB32', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 17:52:11', 0, '2018-01-10 18:11:28', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ff3f4692b4f14b2690424b558a8c06da', '7B7A961F9EB452243CA4FAC387A5C478', 'W06458', '孔祥艳', '10.55.148.139', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 11:32:30', 0, '2018-01-10 13:26:22', '6e40a2254a86454ba9a69a4a4b1d44d6'); +INSERT INTO `jcdp_sys_session` VALUES ('ff65e77448fe4a7c9a40e60e8a97de12', '09929604C9646F4E22020E53BF0F6667', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 16:46:34', 0, '2018-01-10 16:51:23', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ff6cf10edc144334a18384526f0bed1e', 'C050439DA3404FEAEC2124A71A6B7F5C', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 14:04:50', 0, '2017-11-29 14:20:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ff6f706e5bb3414b97113573cdb82a00', '79BD6792904B3FE8238B0FC9C6DA9227', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-06 16:31:50', 0, '2017-11-06 16:43:47', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ff76c52a7fd84e0d8757b7a955d4698f', 'B11FF31589C6432A976D37AC5C7F1A45', 'Y08066', '靳晓松', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-24 11:42:16', 0, '2017-12-24 11:49:25', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ff7cf1bfd60942f2955acbd56ab6e2d2', 'C452CCFCA709D21D055DB1B94601388A', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2017-12-26 09:16:36', 0, '2017-12-26 09:50:57', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ff9ff83046094687aa084af0dd5e6653', '3CFE6CE46AB24D5E7BE46AE496FAD92A', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 10:11:15', 0, '2018-01-02 10:11:17', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ffa686cdb2b64f948e44ad65eb110584', '9B1B43827046205B2EB46EFE9F2BFEE5', 'P16107', '韩燕', '10.55.148.207', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:04:30', 0, '2018-01-10 11:26:21', 'a6fefe02f64446cb855941af41aa67a9'); +INSERT INTO `jcdp_sys_session` VALUES ('ffb362a95b864fed9e6190ca4390dbce', '8A63E46D0BA6C7E7DE873C4F4FF2211C', 'W08011', '刘丹', '121.28.24.199', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '39.106.113.161:443', '2018-01-02 09:21:40', 0, '2018-01-02 09:22:10', 'eba152f716114424a37e5c8e11d8d995'); +INSERT INTO `jcdp_sys_session` VALUES ('ffb435f1b68a4d699226a33989d756b9', 'F335631F494DAAAF54C0BB34673A63C3', 'Y08066', '靳晓松', '10.55.148.143', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', '10.55.12.110:80', '2018-01-10 08:40:07', 0, '2018-01-10 09:12:57', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('ffd32282f3f0497cb9e2f853b6e0305d', 'B7F7D236E227F4C38EE6F3691F26F570', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-23 15:15:42', 0, '2017-11-23 15:33:07', '1df48ce2f70e46a19eccb6b88b64a4bb'); +INSERT INTO `jcdp_sys_session` VALUES ('fff61f5214654848a682501419dfb469', 'C142528D1A7F4826D37A1AD37018B15E', 'Y08066', '靳晓松', '0:0:0:0:0:0:0:1', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)', 'localhost:8080', '2017-11-29 14:01:37', 0, '2017-11-29 14:03:32', '1df48ce2f70e46a19eccb6b88b64a4bb'); + +-- ---------------------------- +-- Table structure for jcdp_sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_user`; +CREATE TABLE `jcdp_sys_user` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `LOGINNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录名', + `USERNAME` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名', + `PASSWORD` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码', + `SEX` decimal(1, 0) NULL DEFAULT NULL COMMENT '性别', + `STATUS` decimal(1, 0) NULL DEFAULT NULL COMMENT '用户状态', + `USERTYPE` decimal(1, 0) NULL DEFAULT NULL COMMENT '用户类型', + `DELETE_FLAG` decimal(1, 0) NULL DEFAULT NULL COMMENT '逻辑删除标识', + `USERCODE` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户编码', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_user +-- ---------------------------- +INSERT INTO `jcdp_sys_user` VALUES ('02c73f13986a4926ae2df7835eade578', 'W04729', '葛燕', '1b2baf8137ee5892011da34958387680', 0, 1, 1, 0, 'W04729'); +INSERT INTO `jcdp_sys_user` VALUES ('037dfda4d5984a71b23bde0359dac140', 'Y07616', '王德鑫', 'ba3b4d4238a41da356ed27b0a960f462', 1, 1, 1, 0, 'Y07616'); +INSERT INTO `jcdp_sys_user` VALUES ('03b37ba8d14a45cdae3100eacaec52a9', 'Y11041', '石立志', '5ca7baec7c1f1b421a83af3c0862efc6', 1, 1, 1, 0, 'Y11041'); +INSERT INTO `jcdp_sys_user` VALUES ('045802b3d88d4c998b3757a65d0149b7', 'W00872', '秦建存', '853ff924fdd15a6b536b4f2f05a7c0a3', 1, 1, 1, 0, 'W00872'); +INSERT INTO `jcdp_sys_user` VALUES ('0526d560648a43998b846f42e85baa2d', 'W06854', '贾琨钰', 'f887ee7cda4232ea10964930bc4320cf', 0, 1, 1, 0, 'W06854'); +INSERT INTO `jcdp_sys_user` VALUES ('068768e1eb764837bc4d98f0216b94e7', 'W06080', '陈建伟', 'c97590ff821700c7657f359ef8359194', 0, 1, 1, 0, 'W06080'); +INSERT INTO `jcdp_sys_user` VALUES ('07b75922b82149ab899bee340a47970a', 'W08014', '张宗森', '408f5bd3afa0e164d0df17364a8f28d8', 1, 1, 1, 0, 'W08014'); +INSERT INTO `jcdp_sys_user` VALUES ('07c1963549914dac88e8ba6092ba3393', 'Y11029', '赵晓龙', 'dadf3ebd195a62a33d2ab4ae23e24f7f', 1, 1, 1, 0, 'Y11029'); +INSERT INTO `jcdp_sys_user` VALUES ('082538db933e477598aa3e87ec2b21e8', 'Y13014', '岳红维', 'ad1f9d1003cc2f898183db4f93a09bad', 2, 1, 1, 0, 'Y13014'); +INSERT INTO `jcdp_sys_user` VALUES ('08392ef87499474a82a8954c7ced7390', 'W06857', '张晓帅', '12f10017886786f35c06f25d2716116d', 1, 1, 1, 0, 'W06857'); +INSERT INTO `jcdp_sys_user` VALUES ('097879d75fc54dc285aff704d8734a21', 'Y05018', '张勇', '6fed17d0ada8a65423382b6e8b33b512', 1, 1, 1, 0, 'Y05018'); +INSERT INTO `jcdp_sys_user` VALUES ('0980b8836368476297e98155c859f632', 'Y12001', '孙颉', 'c13f8df6fd005f8e359b082eb3bc849a', 1, 1, 1, 0, 'Y12001'); +INSERT INTO `jcdp_sys_user` VALUES ('09f0e91f6a61479889570ef76bfdac96', 'W01240', '张帆', '2493f2d2cc518cb273e0c4232c06d2a4', 0, 1, 1, 0, 'W01240'); +INSERT INTO `jcdp_sys_user` VALUES ('0bf7f79407994e7b8eb08aece0dda10f', 'W01795', '刘海英', 'cc784a73301400db4784e15a3189bf8d', 0, 1, 1, 0, 'W01795'); +INSERT INTO `jcdp_sys_user` VALUES ('0c75b6943be44c0c94c58d474b798431', 'T15004', '郑名源', '29cf05d53c04fd4c8ea6208678fe9134', 1, 1, 1, 0, 'T15004'); +INSERT INTO `jcdp_sys_user` VALUES ('0ce0a3ff742745cca27435b4384abb31', 'W02032', '温永兴', 'e86f9de329e8eb3ed760bbe85cd72fa7', 0, 1, 1, 0, 'W02032'); +INSERT INTO `jcdp_sys_user` VALUES ('0dbcd8427607493281ff3e4a6ae68cf2', 'W05576', '曹纯', 'f141a43c46039b5872f88a6b0590d100', 2, 1, 1, 0, 'W05576'); +INSERT INTO `jcdp_sys_user` VALUES ('109e2fea45ed4d4e8d377dafddb43fcd', 'Y10060', '刘萍', '985d3363e0bc067ac99f54cd856b008b', 2, 1, 1, 0, 'Y10060'); +INSERT INTO `jcdp_sys_user` VALUES ('1384281140ca4b219bf98ee235f3aba1', 'Y10051', '田爱国', '185752c448a9ee384c7df308df0365a9', 1, 1, 1, 0, 'Y10051'); +INSERT INTO `jcdp_sys_user` VALUES ('1427218e39e144eea7aecc6d1a85e3df', 'Y05014', '展雪梅', '7b9114ed0bf7354106a40076981a673b', 0, 1, 1, 0, 'Y05014'); +INSERT INTO `jcdp_sys_user` VALUES ('14a6ffda63e8453eb7e661c23a671ca6', 'Y16045', '郝如初', '5d9506454be97712f9c9270f93ae1645', 0, 1, 1, 0, 'Y16045'); +INSERT INTO `jcdp_sys_user` VALUES ('15500c6b69df47e9a60fb42ebf7b467b', 'W04212', '王光明', 'f56f8b9a256f27f3a375f9e5a978b3b5', 1, 1, 1, 0, 'W04212'); +INSERT INTO `jcdp_sys_user` VALUES ('169e0e9038cd4d3d8c0bb7bb1a890dd3', 'Y07080', '杨婷', 'b905ee814d709f7a01df9aec27d7b866', 2, 1, 1, 0, 'Y07080'); +INSERT INTO `jcdp_sys_user` VALUES ('17cd6f91e3f948778a23909248a6ef2a', 'W01329', '赵军', '1b0ffe729cf67b464db3d54575398c62', 0, 1, 1, 0, 'W01329'); +INSERT INTO `jcdp_sys_user` VALUES ('18a377035a944468a62b11caf31f9d72', 'W06831', '赵艳丽', 'e15610b52ab63e04e71a7b4592c40df9', 2, 1, 1, 0, 'W06831'); +INSERT INTO `jcdp_sys_user` VALUES ('18b6c5584638426683267b6fd4cd78b2', 'Y16063', '李梦信', '584721999dccfc12ee9ce071f7194e66', 0, 1, 1, 0, 'Y16063'); +INSERT INTO `jcdp_sys_user` VALUES ('19adff3370f84af196cc73474e2a6d0c', 'Y13028', '王旭东', '09967a37b16d09302b16a2573fa8fcda', 1, 1, 1, 0, 'Y13028'); +INSERT INTO `jcdp_sys_user` VALUES ('1a2b2892052641a6b656e79216433ba9', 'Y13077', '吴琼', 'a4c2f4284993629e9c1c31e910fca54b', 0, 1, 1, 0, 'Y13077'); +INSERT INTO `jcdp_sys_user` VALUES ('1aa9313e83bc42de93663528627243d3', 'W07820', '马骥', '590abd44a4fa5f6302bd75678b61ced2', 1, 1, 1, 0, 'W07820'); +INSERT INTO `jcdp_sys_user` VALUES ('1c85d30bff54420c9878247ff54867e0', 'W07584', '范鹏飞', '39349a155b499ac167c212998dd85932', 1, 1, 1, 0, 'W07584'); +INSERT INTO `jcdp_sys_user` VALUES ('1ca20f3aacd64aa595d51489838fed03', 'W05508', '徐铂韬', '61870191fff78e48a7580108afc6ee8c', 0, 1, 1, 0, 'W05508'); +INSERT INTO `jcdp_sys_user` VALUES ('1cacf210910640a58c2f3fe190122711', 'W06878', '王鑫华', 'b69bfd2af3bab05c1b9741dbc7b4f2d9', 1, 1, 1, 0, 'W06878'); +INSERT INTO `jcdp_sys_user` VALUES ('1cb2fb93db774202bdd2532fa57d9bff', 'P13160', '郑雨昊', '35ec5f2c0f1dc26f4a19d1dc19f34854', 1, 1, 1, 0, 'P13160'); +INSERT INTO `jcdp_sys_user` VALUES ('1d8094115f5c4c6ab8c38c414a65d6f4', 'W07248', '贾怀玺', '5835eaab9d6aa143f83f183f11c1eb33', 1, 1, 1, 0, 'W07248'); +INSERT INTO `jcdp_sys_user` VALUES ('1db1801a29f344b780f018cbffc9b3f1', 'W06869', '付长英', '8ebd5ec62fe0baae58e6ddc03f92fbe7', 2, 1, 1, 0, 'W06869'); +INSERT INTO `jcdp_sys_user` VALUES ('1dce74df53b44ecfbe89edc802914bf8', 'W08013', '刘丙亚', '1b6f362573386a6e80de9511f55bf807', 0, 1, 1, 0, 'W08013'); +INSERT INTO `jcdp_sys_user` VALUES ('1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '靳晓松', '561248cd014be410b087f5623731f6f9', 1, 1, 1, 0, 'Y08066'); +INSERT INTO `jcdp_sys_user` VALUES ('1e89fb25e0734ae1bf339efdac68c85f', 'W06626', '武建亮', 'd19d82b1eb2d8248436067a229b995c0', 0, 1, 1, 0, 'W06626'); +INSERT INTO `jcdp_sys_user` VALUES ('1eac9b5fdd784b00b1e2037e8d8d6a22', 'W02022', '侯玉梅', '81f6b4d26112823f49d3922df6042f8b', 0, 1, 1, 0, 'W02022'); +INSERT INTO `jcdp_sys_user` VALUES ('200c68d821984e73a4b6e1b86eedaabe', 'W04892', '张桂华', 'eb4eef054b3df3bd11e0395e818d7ae9', 1, 1, 1, 0, 'W04892'); +INSERT INTO `jcdp_sys_user` VALUES ('211dd03b8a304b57a77d457d6beae1f9', 'W06017', '常迎辉', 'cc3d513b54a0390750a0453d21fe6e2d', 1, 1, 1, 0, 'W06017'); +INSERT INTO `jcdp_sys_user` VALUES ('219b6fbea83345e7b810a402c41f8df1', 'Y07659', '郝云丰', '027373fdbae53897058c957021778612', 0, 1, 1, 0, 'Y07659'); +INSERT INTO `jcdp_sys_user` VALUES ('21f9e4d6815848999f53f468997b00b9', 'W03930', '陈岩', '5289058ebf9b0c30e5dce1255119adc7', 0, 1, 1, 0, 'W03930'); +INSERT INTO `jcdp_sys_user` VALUES ('22c61d3c9fd04fa18803c8ce98bb0cd9', 'W06349', '李哲', '8c2a9ed3dd5d17ff0cf55db4202797e8', 1, 1, 1, 0, 'W06349'); +INSERT INTO `jcdp_sys_user` VALUES ('248b0fb582e546ff88ec325ee26fc535', 'W06793', '薛玉玲', '21c9ea50ad2f403e7ad2ddff3c30e67e', 0, 1, 1, 0, 'W06793'); +INSERT INTO `jcdp_sys_user` VALUES ('256a9ff4c8f24612ad68a65a0db8f973', 'W05089', '吴蔚', 'a8d5b73bc36e6ed4ec17f1cf78cf74e6', 0, 1, 1, 0, 'W05089'); +INSERT INTO `jcdp_sys_user` VALUES ('25f0fd10490349b9941f8325c1fc8488', 'Y08204', '王利培', 'df791e17a719de0b7a7e21b530e55785', 1, 1, 1, 0, 'Y08204'); +INSERT INTO `jcdp_sys_user` VALUES ('2798eeaa5ed445749f80f71ef202cffa', 'Y11037', '宁志全', '21232f297a57a5a743894a0e4a801fc3', 1, 1, 1, 0, 'Y11037'); +INSERT INTO `jcdp_sys_user` VALUES ('2867095e1fb14f37ae3d801c75c4eee3', 'Y12046', '付凯', '08089177ef01f8f8cd4c893f65c505d2', 0, 1, 1, 0, 'Y12046'); +INSERT INTO `jcdp_sys_user` VALUES ('28fb5f2bc277490ab8d3b8dabebb2c0e', 'T15006', '闵洁', 'ab905e433045527670e74c9c388bdaf1', 1, 1, 1, 0, 'T15006'); +INSERT INTO `jcdp_sys_user` VALUES ('2947b126a1714adba1b3666cf3b015c5', 'T15003', '杨新', 'f1f3f3ed06b7749713df3026c5f45a96', 1, 1, 1, 0, 'T15003'); +INSERT INTO `jcdp_sys_user` VALUES ('295c09c5e4074f0e9ebd2dc5cc463667', 'Y06217', '沈贵元', 'ec969b78564ccb67ddfce3b7dc24520a', 1, 1, 1, 0, 'Y06217'); +INSERT INTO `jcdp_sys_user` VALUES ('298ff55340ff47b188c9766f75eb159b', 'W06401', '杨振学', '5d2082b7081d956d1f564ddb4fc66287', 1, 1, 1, 0, 'W06401'); +INSERT INTO `jcdp_sys_user` VALUES ('2ba55257e6884d52b6a8220f2f782733', 'W07185', '刘长龙', '615ec6e7843c0c3bf167296954315d07', 1, 1, 1, 0, 'W07185'); +INSERT INTO `jcdp_sys_user` VALUES ('2d83ceb498df4e77b290a6edf9a37021', 'W04686', '高勇峰', '79607c00ea5f503514f902a278515327', 0, 1, 1, 0, 'W04686'); +INSERT INTO `jcdp_sys_user` VALUES ('2d96e3863dc74b23878314d5eee59d9a', 'W05602', '许仕龙', '4406aeb0920a6a2a47cee1b276f316ce', 1, 1, 1, 0, 'W05602'); +INSERT INTO `jcdp_sys_user` VALUES ('2e22bd54a0fe4c40a140ab2d0e99f233', 'W06789', '禹树雄', '7c7777a71d96d29631b41bcb701558b0', 0, 1, 1, 0, 'W06789'); +INSERT INTO `jcdp_sys_user` VALUES ('2e25ac5da040436088cafb6f29cd8e8f', 'Y15103', '赵松', '4f7c0e9f2b5c649b235ca2d262ddafa8', 1, 1, 1, 0, 'Y15103'); +INSERT INTO `jcdp_sys_user` VALUES ('30eac268f9b743d6b347dbfd8304cd70', 'Y15001', '杨茗帧', '26a2d3a5e0dc0f0bf5d36e4ed189277f', 0, 1, 1, 0, 'Y15001'); +INSERT INTO `jcdp_sys_user` VALUES ('3260d140b17744e5b4ecb80ac658d300', 'W07064', '张卜方', '0d04a2cba3f380c388dfaa9c79f62f4d', 1, 1, 1, 0, 'W07064'); +INSERT INTO `jcdp_sys_user` VALUES ('32a36e78b5fd44649ae1b9b4a3b174e3', 'W07674', '高晨朝', '21232f297a57a5a743894a0e4a801fc3', 1, 1, 1, 0, 'W07674'); +INSERT INTO `jcdp_sys_user` VALUES ('33382ef814e849b4a761a576455ef907', 'W02352', '邢壮', '0f1f4825a52997d3ea56602a81d507b8', 1, 1, 1, 0, 'W02352'); +INSERT INTO `jcdp_sys_user` VALUES ('340fe94b0464472e88cc0fe7065170dc', 'W06555', '王晓明', '002348c4f8156119ee3b66d40845667f', 2, 1, 1, 0, 'W06555'); +INSERT INTO `jcdp_sys_user` VALUES ('378892771606469ebe86c370b3c4f8eb', 'W07632', '王健', 'efcd2e17f3eec0e67193d62dda2b2f40', 1, 1, 1, 0, 'W07632'); +INSERT INTO `jcdp_sys_user` VALUES ('37be4e7e24564c5e9f0afdf76975c6e0', 'W06931', '杨少东', '7e84050e4bd97d30d3c1193275f1e9b7', 0, 1, 1, 0, 'W06931'); +INSERT INTO `jcdp_sys_user` VALUES ('37c330f585a5411db6958ec3d034032f', 'W05483', '常明山', '1a83582792c832824a3fd296b9da961f', 0, 1, 1, 0, 'W05483'); +INSERT INTO `jcdp_sys_user` VALUES ('3916b39fbb2d449e9768b73a001a5ae2', 'W02005', '康峰', '95383a09d08b6d4872d353b4789ae161', 0, 1, 1, 0, 'W02005'); +INSERT INTO `jcdp_sys_user` VALUES ('3930ab98da0a4e82aab1824823135576', 'P12188', '赵星', '21232f297a57a5a743894a0e4a801fc3', 1, 1, 1, 0, 'P12188'); +INSERT INTO `jcdp_sys_user` VALUES ('3a089a897e294c67829ca12ef72a4d03', 'W02771', '杜克明', 'c86c4724db178c3620183fc5f70a2421', 1, 1, 1, 0, 'W02771'); +INSERT INTO `jcdp_sys_user` VALUES ('3cbb96bb46294815a302d8e6793cde3b', 'W04933', '王铁锰', 'd706ced809e4a093473182083f81288a', 1, 1, 1, 0, 'W04933'); +INSERT INTO `jcdp_sys_user` VALUES ('3d30a7e3e08b4ca59a4783197b809a79', 'Y10058', '曾宇', '71d6323aa9cb5d7e7c01520cb3c56646', 1, 1, 1, 0, 'Y10058'); +INSERT INTO `jcdp_sys_user` VALUES ('3ea7ec4286744d628ebd00e6c9b779e9', 'W06087', '邓正', 'e8b581dd5055ff4783faf15bdce5b92b', 0, 1, 1, 0, 'W06087'); +INSERT INTO `jcdp_sys_user` VALUES ('3f29e5b0069f4dca982a7af45fcc7946', 'W07804', '车继鹏', '744be42acfe5c8ad343b3467b9f48695', 1, 1, 1, 0, 'W07804'); +INSERT INTO `jcdp_sys_user` VALUES ('40153ec910b345a7b5176d6297f29c03', 'W05437', '王景忠', '692dcee8db26082af64ac392ff291283', 0, 1, 1, 0, 'W05437'); +INSERT INTO `jcdp_sys_user` VALUES ('42903568050447b08e9967dbd291506c', 'Y06213', '田建辉', '1035e72afe96a7846ffc5b67105cec03', 0, 1, 1, 0, 'Y06213'); +INSERT INTO `jcdp_sys_user` VALUES ('4374c25a897842d08d2b0ae653eb6344', 'W06785', '李荣伟', '2962ff3d3348142812f9ffd482594116', 0, 1, 1, 0, 'W06785'); +INSERT INTO `jcdp_sys_user` VALUES ('43af99fb531d44e68a1bd20ff153aa69', 'W03442', '王桂红', 'de9beb3b18423a626d353179ec7e3a16', 0, 1, 1, 0, 'W03442'); +INSERT INTO `jcdp_sys_user` VALUES ('43ba14c407114632ba0d396e3c9b5c2a', 'W00476', '侯典龙', '396cc8052d636ddc870fefc7ce590c16', 1, 1, 1, 0, 'W00476'); +INSERT INTO `jcdp_sys_user` VALUES ('44e2c6b6eef64c48997ad59fc6428e10', 'W00860', '封金珠', 'd497e91e7e15f3a97c3e0b4d72d98b58', 0, 1, 1, 0, 'W00860'); +INSERT INTO `jcdp_sys_user` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', 'W06893', '张立奎', 'f6c31ed8a00e446e8f0ad00c51056a5a', 1, 1, 1, 0, 'W06893'); +INSERT INTO `jcdp_sys_user` VALUES ('46b350b728e64cab9af6594d31c36f0e', 'W03094', '孟伟', '304ece45b44f91fe1ca0bcb8ae80ad53', 0, 1, 1, 0, 'W03094'); +INSERT INTO `jcdp_sys_user` VALUES ('46b8e24c27ee44b899dff5f6b00cbc26', 'W04614', '梁立童', '6550363cd4cd4c77a5abe151afb0783c', 0, 1, 1, 0, 'W04614'); +INSERT INTO `jcdp_sys_user` VALUES ('480eabb80700486185121285d855541d', 'W06581', '季晓燕', '9fd71408a66601e19d9fb9480ac9bfdf', 2, 1, 1, 0, 'W06581'); +INSERT INTO `jcdp_sys_user` VALUES ('482984ac4e1f4226b2a48c781266a150', 'W04938', '董晖', 'bf47da9a44d151cd6991277be2514e06', 0, 1, 1, 0, 'W04938'); +INSERT INTO `jcdp_sys_user` VALUES ('48e5269d5fb0450ab24708c9ba20aac9', 'W07119', '侯耀伟', '67d687eadce893d200975a02ca58701e', 1, 1, 1, 0, 'W07119'); +INSERT INTO `jcdp_sys_user` VALUES ('4b0adf9a1ca244b985b51b732e8b58a6', 'W07585', '冯昊轩', '2e420ebf657643ce35c46cc97d8face6', 1, 1, 1, 0, 'W07585'); +INSERT INTO `jcdp_sys_user` VALUES ('4b26ac8b7aee4a02bc8c8548a4affa6e', 'W01984', '秦淑娟', '8ec29442d1c2319e53642c4454c317e0', 0, 1, 1, 0, 'W01984'); +INSERT INTO `jcdp_sys_user` VALUES ('4b789c8f37a840fd865a486c72fea11d', 'Y06171', '吴涛', '0a57c27ca754e3c0d3deaf11ae7408c8', 0, 1, 1, 0, 'Y06171'); +INSERT INTO `jcdp_sys_user` VALUES ('4d00aa9c7df84dac86e0e5aef5d34885', 'W06703', '詹晋玮', '3f27a33e7c14f853cf027632a1197199', 0, 1, 1, 0, 'W06703'); +INSERT INTO `jcdp_sys_user` VALUES ('4d4183bb9d3a42e5870fbc58c1022e75', 'Y09026', '陈丹熠', 'ab24dd706c26b65699768691010ed205', 2, 1, 1, 0, 'Y09026'); +INSERT INTO `jcdp_sys_user` VALUES ('4d616085794541b1a12ea3dbef6c41bf', 'W04169', '何成红', '73b68dee429fede51be6ff7df7b78c2b', 0, 1, 1, 0, 'W04169'); +INSERT INTO `jcdp_sys_user` VALUES ('4ebe0869262f4407871646184af75fd6', 'W06649', '张东娜', '9b66f662fe232a9c50d49856487fc49d', 0, 1, 1, 0, 'W06649'); +INSERT INTO `jcdp_sys_user` VALUES ('4f2eac222b164c338c6913a8e96bc7d5', 'W00393', '刘季平', '36195daff3fa43b8c54e257eb608e9c6', 0, 1, 1, 0, 'W00393'); +INSERT INTO `jcdp_sys_user` VALUES ('4f412ec3e8fb41ef84c743fb8dd95f2c', 'W06622', '马梦奇', '390efddcd252fabf5bc145e63680153c', 0, 1, 1, 0, 'W06622'); +INSERT INTO `jcdp_sys_user` VALUES ('5114bbde00c24617841113ed12908114', 'P10410', '王迟', '6bba59a0629069f284f9254d79e251ec', 0, 1, 1, 0, 'P10410'); +INSERT INTO `jcdp_sys_user` VALUES ('521d08563ab74b8188599be180575bcb', 'W07675', '马成', '0cfda38cf3ffb886bdac27d215507825', 1, 1, 1, 0, 'W07675'); +INSERT INTO `jcdp_sys_user` VALUES ('52bd5b59504c4cceb8b397654bc647a6', 'Y17092', '李鸿亮', 'bbac0637d0cb4e3db7f2a91e17446247', 0, 1, 1, 0, 'Y17092'); +INSERT INTO `jcdp_sys_user` VALUES ('52fd81d5f3c641b9b3e3c058efee0357', 'W07807', '李云鹏', '53cdc5bcd5d766e7d1df93f7c36b4ca0', 1, 1, 1, 0, 'W07807'); +INSERT INTO `jcdp_sys_user` VALUES ('532a80316d0141e0990f123b0068317c', 'W01070', '李斌', '2a40e82c47e6b381d3b9d2f496e81b08', 1, 1, 1, 0, 'W01070'); +INSERT INTO `jcdp_sys_user` VALUES ('539a551045944c28a9945d0f6cc550c2', 'W07805', '陈天富', 'fdf44d26cac4435f80525134b1bc954d', 1, 1, 1, 0, 'W07805'); +INSERT INTO `jcdp_sys_user` VALUES ('53fc929cf08947c393d6a132b71c8c59', 'W07247', '赵月明', 'c2c685e8d3647eea0825f9c24a3c034e', 1, 1, 1, 0, 'W07247'); +INSERT INTO `jcdp_sys_user` VALUES ('541163ddcaec4751b6d6e86207cc48c1', 'W06691', '赵培', 'a5d71c09409251ab1e5fa4f4d61a97f4', 1, 1, 1, 0, 'W06691'); +INSERT INTO `jcdp_sys_user` VALUES ('545b2a2ca2a04583b6dc0dddc8c8ab29', 'W06816', '郭伟鹏', 'fc0222ae3d43cb2431310c0d350bafc5', 0, 1, 1, 0, 'W06816'); +INSERT INTO `jcdp_sys_user` VALUES ('5619c0acad764d84989e69bc5c57b461', 'Y10047', '张锐', '21232f297a57a5a743894a0e4a801fc3', 1, 1, 1, 0, 'Y10047'); +INSERT INTO `jcdp_sys_user` VALUES ('561fa58b43ec443f8420e9637e4d38c0', 'Y14043', '王志浩', '64d36c45e13b82eeaaad3197a64e3526', 1, 1, 1, 0, 'Y14043'); +INSERT INTO `jcdp_sys_user` VALUES ('5676921ac94b4633a614892676567bfb', 'P12189', '赵简', 'bf5dcfe525b46bb0639ecd2128736895', 1, 1, 1, 0, 'P12189'); +INSERT INTO `jcdp_sys_user` VALUES ('57e5a30a134f47c0b76178ac345d5465', 'Y06682', '杨玲娟', 'e1f6005de8f96ff8fb4402dc2857cc7a', 0, 1, 1, 0, 'Y06682'); +INSERT INTO `jcdp_sys_user` VALUES ('597971047f3541dc94171b6f5d114c29', 'W01844', '高金东', '96a665a86cff2b119c0a0238538acda4', 1, 1, 1, 0, 'W01844'); +INSERT INTO `jcdp_sys_user` VALUES ('5b0037df0e3b4bfaa89c36d74e5c7a81', 'P09014', '赵红彩', '030d297c37704943d762c0dcc176f835', 2, 1, 1, 0, 'P09014'); +INSERT INTO `jcdp_sys_user` VALUES ('5b6c06080d5a4b86b9673fd373011ae4', 'W06814', '仇治学', 'a7f7298e3952fa2b17aa9d5cc271f86b', 0, 1, 1, 0, 'W06814'); +INSERT INTO `jcdp_sys_user` VALUES ('5baafe72ad534503bb27e43860a1b4cb', 'W02350', '屈永欣', '325d32d655ca26afc0f6e12c5d1e2d53', 0, 1, 1, 0, 'W02350'); +INSERT INTO `jcdp_sys_user` VALUES ('5cbf662ecc09469e9060f2f20eb9309b', 'Y10029', '马迅', '7302b9f7d22d7cfbc861521ca256f3e5', 1, 1, 1, 0, 'Y10029'); +INSERT INTO `jcdp_sys_user` VALUES ('5cc8029e3d9e46cc83e434b412b72b52', 'Y08109', '张丽茹', '026b8a40edb0a3f3b0b66aca2aa8641f', 0, 1, 1, 0, 'Y08109'); +INSERT INTO `jcdp_sys_user` VALUES ('5dd57a31f31d44f1875035ee6b9582e2', 'W04663', '黄玉兰', 'f4f074fdf7012d409a966a81c6607c8b', 0, 1, 1, 0, 'W04663'); +INSERT INTO `jcdp_sys_user` VALUES ('5e0b157de9ae4c2495f3918e7625431a', 'W07249', '李维佳', '4e84920024a3b4c03a9c3bfb4fd6611b', 1, 1, 1, 0, 'W07249'); +INSERT INTO `jcdp_sys_user` VALUES ('5eaafabf2d4a4856999f9e684d327ead', 'W07679', '张德悦', '4b78ae5d01af45c4024f038d1c2111df', 2, 1, 1, 0, 'W07679'); +INSERT INTO `jcdp_sys_user` VALUES ('5f632069a0164b479e53f093ee83c0d6', 'Y11016', '刘东', 'cb0ca911a303da9dd38b1a02356e8317', 1, 1, 1, 0, 'Y11016'); +INSERT INTO `jcdp_sys_user` VALUES ('5f822f0ca21a4b43bcd4a04dc9faa902', 'W06677', '曾明', 'c36627aa05ac17d32e38ec101ae717dc', 1, 1, 1, 0, 'W06677'); +INSERT INTO `jcdp_sys_user` VALUES ('5fa4285cfc9e4f5d975c979814a5dbec', 'W07940', '王君从', '9c6bfe1af2b11aeab5bc6c99cdc7773b', 0, 1, 1, 0, 'W07940'); +INSERT INTO `jcdp_sys_user` VALUES ('602751b6aefd48b38b1bd07e9fa64f31', 'W04431', '梁钰', '134dea160ab32e4db0b0ca035bcf31ed', 0, 1, 1, 0, 'W04431'); +INSERT INTO `jcdp_sys_user` VALUES ('606844d489f841939e330acdb5b2601e', 'W07676', '尚云骅', '6b8ffb46e43670f2ce737e3c689f3f11', 1, 1, 1, 0, 'W07676'); +INSERT INTO `jcdp_sys_user` VALUES ('61f00a225f644f37bf83c0673ea81845', 'W06537', '续鹏', '6bd14e1356af4dc6c6a11c72ca3f297b', 1, 1, 1, 0, 'W06537'); +INSERT INTO `jcdp_sys_user` VALUES ('63229c9686214b1ea1c133f9abf4cb4d', 'W01981', '王枫', '4a6a75a656bf0bca85e0c91ba25fb8fa', 1, 1, 1, 0, 'W01981'); +INSERT INTO `jcdp_sys_user` VALUES ('65367901d2f144cb8a7fd93f4356c64f', 'Y10076', '吴鹏', 'df7be7b77c2d6b8ebab126309c91c7a5', 0, 1, 1, 0, 'Y10076'); +INSERT INTO `jcdp_sys_user` VALUES ('66486ff6f3db4d38a07f17717f23f12c', 'W07457', '袁旭', '1afcc1cc237f99f6b21176536c59aab0', 1, 1, 1, 0, 'W07457'); +INSERT INTO `jcdp_sys_user` VALUES ('664afc7c3f924e669ae697a932594531', 'W07492', '魏璇', '1271e605d7b8b38b290498cfc2ba3a0d', 1, 1, 1, 0, 'W07492'); +INSERT INTO `jcdp_sys_user` VALUES ('675eadcb6ae64a548036a4ef986b64cc', 'Y15002', '常秀丽', '58f3b90404a68bc9cd83557f5da8ff7b', 0, 1, 1, 0, 'Y15002'); +INSERT INTO `jcdp_sys_user` VALUES ('6a26f0722eaf42df86d7c27a62e7b02d', 'W07467', '王欢', '81ee42711ec4c16ed5baf5b5008e2517', 2, 1, 1, 0, 'W07467'); +INSERT INTO `jcdp_sys_user` VALUES ('6c583d1f10a241ad90b0a11898a670ca', 'Y11043', '王家城', '9f67c7697e365288b298f58e43d39c42', 1, 1, 1, 0, 'Y11043'); +INSERT INTO `jcdp_sys_user` VALUES ('6d18ae59a8244307aa1ac210e3fc41d5', 'W06105', '刘瑞', 'd598696b045403baccbe57908040b087', 0, 1, 1, 0, 'W06105'); +INSERT INTO `jcdp_sys_user` VALUES ('6d74ae8842b74e239efd63bb95f053e3', 'W06634', '曲明', '4980d917ee939c82f579cb69d6bb9c0c', 1, 1, 1, 0, 'W06634'); +INSERT INTO `jcdp_sys_user` VALUES ('6d8f2916ccc044c3957e2ff4cafbf98b', 'P13151', '李伟', 'e769727dc93fb372fac4572e8196a86f', 0, 1, 1, 0, 'P13151'); +INSERT INTO `jcdp_sys_user` VALUES ('6e3931a0a8794f30bae7e63b86259643', 'Y10033', '武晋', '7c9736b501ab1a8dda494171da88701d', 1, 1, 1, 0, 'Y10033'); +INSERT INTO `jcdp_sys_user` VALUES ('6e40a2254a86454ba9a69a4a4b1d44d6', 'W06458', '孔祥艳', 'beaf7bd3fba0380e1b7336fcbee532de', 2, 1, 1, 0, 'W06458'); +INSERT INTO `jcdp_sys_user` VALUES ('6f9333baa5db42d4911644a30833c0f6', 'W06400', '孙雪晶', 'b75b3ac27eddb4f5e79733c51194cbd6', 2, 1, 1, 0, 'W06400'); +INSERT INTO `jcdp_sys_user` VALUES ('71950c802ebe45859170eb8fc67a7c76', 'Y16062', '苏珊', 'cf39c9b238c797d63b8ff0bb53552fa5', 0, 1, 1, 0, 'Y16062'); +INSERT INTO `jcdp_sys_user` VALUES ('720cb5a0c9b04aad85ecce4731055bee', 'W04420', '沈珍梅', '053ae58123f49915103ed78a68c081dd', 2, 1, 1, 0, 'W04420'); +INSERT INTO `jcdp_sys_user` VALUES ('76da5a1769f6438cbd7580a4632de45e', 'Y02049', '胡美玲', '87b26e55ccd64a107045c6f8d88b0e2d', 2, 1, 1, 0, 'Y02049'); +INSERT INTO `jcdp_sys_user` VALUES ('77b130a7a09b4409a198c688fbad7e68', 'W01453', '王新永', 'c712aa07a49d5df84ee75e0e2b4661d9', 1, 1, 1, 0, 'W01453'); +INSERT INTO `jcdp_sys_user` VALUES ('77f0e9ced74e438783a96cbdab22c1ec', 'W06404', '崔海龙', '23c7a9147dfe923b6f97a4b165219735', 1, 1, 1, 0, 'W06404'); +INSERT INTO `jcdp_sys_user` VALUES ('7828fb0827dd4ab08481600b66492c3e', 'W03303', '杨建民', '61712eeddf756ae5a08468c6479647e0', 0, 1, 1, 0, 'W03303'); +INSERT INTO `jcdp_sys_user` VALUES ('79c16ac130bb410eb98d521ed14c2a2f', 'W06058', '周永川', '6caecae5f12ca639083ed9b8765e3790', 1, 1, 1, 0, 'W06058'); +INSERT INTO `jcdp_sys_user` VALUES ('7b2f37d2eac24ee990972baefd7dda4f', 'W06403', '杨兆青', 'd525b1e08d0206815600a548f4084fb9', 1, 1, 1, 0, 'W06403'); +INSERT INTO `jcdp_sys_user` VALUES ('7b37646871b445189b446fd8ee369094', 'W05359', '汪洋', '60cba5b924b9b9ecd81eb86e6985e916', 1, 1, 1, 0, 'W05359'); +INSERT INTO `jcdp_sys_user` VALUES ('7ca89aa7ac7747b8ba498307b426de48', 'Y04128', '贾志红', '9d703764be0e5b7e4faed9374a83fc89', 1, 1, 1, 0, 'Y04128'); +INSERT INTO `jcdp_sys_user` VALUES ('7cd8b8f56966432b9541285bfc797555', 'Y13030', '任男', '3320b469e46d5571824c728560fd856c', 1, 1, 1, 0, 'Y13030 '); +INSERT INTO `jcdp_sys_user` VALUES ('7cef8587cddc4f03a1e7176e0a8ee340', 'W07646', '李荣荣', '87024b36c65481e9829b6df9ddf663e1', 2, 1, 1, 0, 'W07646'); +INSERT INTO `jcdp_sys_user` VALUES ('7dcd4e266b8147ee8bf0195fcec6f6be', 'W04028', '武楠', 'fbd3a0e51cdaa10b330b464fbe3d89bc', 2, 1, 1, 0, 'W04028'); +INSERT INTO `jcdp_sys_user` VALUES ('7f288bfcbbb44390a92daf5712088d17', 'Y08041', '吕坤', '24f8d89f42c762b98ffc8657a1d1e266', 0, 1, 1, 0, 'Y08041'); +INSERT INTO `jcdp_sys_user` VALUES ('7fa657de2e134704b1e62b5581343656', 'W01509', '师本慧', 'd41adc1c4a9d54fd50de9ad6d4863f76', 1, 1, 1, 0, 'W01509'); +INSERT INTO `jcdp_sys_user` VALUES ('80c7c582c2674022878e838a459145d4', 'Y13036', '徐宁宁', 'ae2423e156a9aef76e096fab80a71fb8', 0, 1, 1, 0, 'Y13036'); +INSERT INTO `jcdp_sys_user` VALUES ('8180b37adc664b72a571d6e4001602fe', 'W07010', '梁晓纯', 'a5ba2840033c43562dbba778c01ea959', 0, 1, 1, 0, 'W07010'); +INSERT INTO `jcdp_sys_user` VALUES ('81f3563afdee4cffb07ddf27d0538cfb', 'W00142', '郑军', 'acc02f61195f242e6e69b8073b3ae396', 1, 1, 1, 0, 'W00142'); +INSERT INTO `jcdp_sys_user` VALUES ('8293a6507d974027bcd8a54a5b90abb5', 'Y14038', '刘鹏', 'd2be68b4e67d47cb232f0df464c276f3', 1, 1, 1, 0, 'Y14038'); +INSERT INTO `jcdp_sys_user` VALUES ('82a04b4689d84862be5c4b600b099fc1', 'W06061', '廖春连', 'e4c4e4f6fc2d0bd5481cb800fc1cac61', 1, 1, 1, 0, 'W06061'); +INSERT INTO `jcdp_sys_user` VALUES ('82bb85dfa7dc4330893ac38fda2ae74d', 'W07246', '刘海龙', '0274e080e74926fa0ad151cd461d765f', 1, 1, 1, 0, 'W07246'); +INSERT INTO `jcdp_sys_user` VALUES ('83b9caffe40948618028f7ec4a95ad3a', 'W08037', '阮贝娜', '63381e525601e3c53ecf1c648a64060e', 0, 1, 1, 0, 'W08037'); +INSERT INTO `jcdp_sys_user` VALUES ('83bb22a54cc4492e8fa3043a21a001ec', 'W07481', '董思洋', 'e5cad6e469e7d9fc46c48cf132a98a24', 0, 1, 1, 0, 'W07481'); +INSERT INTO `jcdp_sys_user` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', 'P16106', '彭树蓓', '538317d2d7552f2ab2314eaa9dc7ff73', 1, 1, 1, 0, 'P16106'); +INSERT INTO `jcdp_sys_user` VALUES ('84337ce99ca24ba886bad2cc59f048b9', 'W04563', '于开勇', '90c6870b48aa911baf2f80fc6169f478', 1, 1, 1, 0, 'W04563'); +INSERT INTO `jcdp_sys_user` VALUES ('84ac0ac6d4464f73a11f7e5405041cd4', 'W08012', '魏伟', 'ba0637639175ee8bca91024a8524e4be', 1, 1, 1, 0, 'W08012'); +INSERT INTO `jcdp_sys_user` VALUES ('8527c0ae4cba4e6ba511442194cdcdfa', 'W06914', '田英', '4a57750e28a1f4721a1c9fcf866fc5f2', 0, 1, 1, 0, 'W06914'); +INSERT INTO `jcdp_sys_user` VALUES ('869474428b3e4408a1351e16978a37f8', 'Y08152', '张永超', 'cfa92d1a3cc48ce90482ad4eaae9e898', 1, 1, 1, 0, 'Y08152'); +INSERT INTO `jcdp_sys_user` VALUES ('8778b7b776c242f98b6ad46087adb2e4', 'W07677', '陈泽', 'b2246e1c0bfe3ca30bd59f3df8ddbc03', 1, 1, 1, 0, 'W07677'); +INSERT INTO `jcdp_sys_user` VALUES ('87b8438ee06b403f9fa476679df9dc15', 'Y05046', '解建伟', 'a01830f2f62a8281024b0f0c64b13782', 0, 1, 1, 0, 'Y05046'); +INSERT INTO `jcdp_sys_user` VALUES ('8a80a7acc3824e15be6a6ed1f94689a7', 'W01309', '郭建业', '51e2584bba8e736f1d0dbe96ba237279', 1, 1, 1, 0, 'W01309'); +INSERT INTO `jcdp_sys_user` VALUES ('8b42a3b49bcc4464ae7e076ff75a1cd5', 'W02013', '房丽', 'd7fa539d5db1c79d27e59c32eae19ad9', 0, 1, 1, 0, 'W02013'); +INSERT INTO `jcdp_sys_user` VALUES ('8b78be4bc56d46fba2ff5150e739b4b9', 'Y11009', '孙铮', '2a8d350cc5300fe2d5ce722c29228065', 1, 1, 1, 0, 'Y11009'); +INSERT INTO `jcdp_sys_user` VALUES ('8c491f940f844e6f8bf23fb874177cb5', 'W07806', '刘子奕', 'd818e87e73e571a89b79691ba9992932', 2, 1, 1, 0, 'W07806'); +INSERT INTO `jcdp_sys_user` VALUES ('8d228913013c464a8a5018ec42e6f0f5', 'W06010', '王静', '2ff9ef3148204bd88f43a831e0910343', 0, 1, 1, 0, 'W06010'); +INSERT INTO `jcdp_sys_user` VALUES ('8d3fcea68419434786f412eb517888fd', 'W06076', '权治', '8bc6448b18996ca6bfbdc956bc878174', 0, 1, 1, 0, 'W06076'); +INSERT INTO `jcdp_sys_user` VALUES ('8f79a13cec6a4826a394237736828768', 'W04811', '张程', '21decf7f1556f0dec8cd2000ce187f91', 0, 1, 1, 0, 'W04811'); +INSERT INTO `jcdp_sys_user` VALUES ('8fb6ef3a9fb243889e37884e6245928a', 'Y08195', '钟静', 'de96229adc889e6fe8d241bf33c7d250', 0, 1, 1, 0, 'Y08195'); +INSERT INTO `jcdp_sys_user` VALUES ('8fe110723d5b48bfb7ae79bc98e4317d', 'W07245', '杜越', '12f10017886786f35c06f25d2716116d', 1, 1, 1, 0, 'W07245'); +INSERT INTO `jcdp_sys_user` VALUES ('90334c20002644a4be3ac0125d97784a', 'W05428', '李荷', 'd1d18e00d565de3f9226c09a7d26a0f3', 0, 1, 1, 0, 'W05428'); +INSERT INTO `jcdp_sys_user` VALUES ('9158ec943e6d49bb9c0df8b6c3666a28', 'Y12006', '龚兴兴', '441c27a93d8bdef87bd90a34cc1fdfb7', 2, 1, 1, 0, 'Y12006'); +INSERT INTO `jcdp_sys_user` VALUES ('920c7fb30bd44be8bd4581e7882f6dfd', 'W06865', '张宏科', '55f69a08fa0a3672d78839fc06f11e12', 1, 1, 1, 0, 'W06865'); +INSERT INTO `jcdp_sys_user` VALUES ('9212486aec5346d396b182eca2043eb9', 'Y12004', '孟建', '2fc1900afc58f946efa0d903d55ddc8b', 0, 1, 1, 0, 'Y12004'); +INSERT INTO `jcdp_sys_user` VALUES ('928ff182e1594a74899d82144156af09', 'W01153', '陈若平', 'a2599b7eb27e99aa6082ab561eb8a9b2', 0, 1, 1, 0, 'W01153'); +INSERT INTO `jcdp_sys_user` VALUES ('93c2a1ec4940431caab0eb93fc079b12', 'W05556', '杨松芳', '273cfbb565b504ca7895f01665a41b9d', 2, 1, 1, 0, 'W05556'); +INSERT INTO `jcdp_sys_user` VALUES ('948dab550b93428096610e31eace1478', 'W07190', '魏恒', 'a80eefbc463a853934d0d09aebde172f', 1, 1, 1, 0, 'W07190'); +INSERT INTO `jcdp_sys_user` VALUES ('94ec3b277d104816933ac089423b5bbf', 'Y09036', '甘伟', 'c5a7b004292954a1c6daabaad9a0f2e6', 1, 1, 1, 0, 'Y09036'); +INSERT INTO `jcdp_sys_user` VALUES ('94fe339e071e4979a89fa29265507eed', 'W06405', '戴强', 'ff9c45156099e3f20f75f7673703e241', 1, 1, 1, 0, 'W06405'); +INSERT INTO `jcdp_sys_user` VALUES ('959f8e645e3c45ec88edbc073b5b42dd', 'W04260', '刘立新', '15dea94a8ca5c0a618adc3ceaafe206d', 2, 1, 1, 0, 'W04260'); +INSERT INTO `jcdp_sys_user` VALUES ('96cc863bca2c436a85cd52db7c1df9d7', 'Y05185', '王瑶', 'fa6c1b58953e696849852c3d899557ae', 2, 1, 1, 0, 'Y05185'); +INSERT INTO `jcdp_sys_user` VALUES ('979808dea33d4ac5b18e5f280535db56', 'W04810', '黄小军', 'dd40a3fb128ec49d84d6932cebc2934f', 0, 1, 1, 0, 'W04810'); +INSERT INTO `jcdp_sys_user` VALUES ('97d009ed87664304a713241fffb5b47e', 'Y13008', '周玉锁', 'a7cd7251268cd7370538f4d45d8e1adc', 0, 1, 1, 0, 'Y13008'); +INSERT INTO `jcdp_sys_user` VALUES ('97d45832f7df41089b2b11da5534e36c', 'P17020', '李晓雄', '474f175e8b952194b796439d0f54eea6', 1, 1, 1, 0, 'P17020'); +INSERT INTO `jcdp_sys_user` VALUES ('986d2627c90742f8aa78d8815cd5cab9', 'Y07360', '程理丽', '19a0b25c3a72e00d25fede498e621e13', 2, 1, 1, 0, 'Y07360'); +INSERT INTO `jcdp_sys_user` VALUES ('988c90d28f124c029544716f0f6f0c8f', 'W06832', '王湛', 'f8412053634c77f56025ac0ac53bd30a', 1, 1, 1, 0, 'W06832'); +INSERT INTO `jcdp_sys_user` VALUES ('98a2763769f9479ea6092c100a000202', 'Y07598', '白新月', '3339b529ba1d0789efcab2e15e4be6b0', 0, 1, 1, 0, 'Y07598'); +INSERT INTO `jcdp_sys_user` VALUES ('9a8a0a0b27754a73962c221ee73d2c43', 'Y11030', '张亚洲', 'f66cf05ef5464e2e4689a33dba69d397', 1, 1, 1, 0, 'Y11030'); +INSERT INTO `jcdp_sys_user` VALUES ('9c227190e0404d1ab84cb65dfddca512', 'W07913', '王尧', 'cf84308a9a936d31d6641ec403154711', 1, 1, 1, 0, 'W07913'); +INSERT INTO `jcdp_sys_user` VALUES ('9c4ec5025ba140808e9fe44f3cc848ff', 'Y07617', '程靖', '48b42354229cf390c0acc5694ac81685', 1, 1, 1, 0, 'Y07617'); +INSERT INTO `jcdp_sys_user` VALUES ('9d211f337d3d4dd2b614b6032ab350fb', 'W06696', '朱二涛', '99fb77e4136eee5b2b36b191da057b32', 0, 1, 1, 0, 'W06696'); +INSERT INTO `jcdp_sys_user` VALUES ('9d68b5cbf62b4a6fbf394e5bed9daff5', 'W04425', '马朝红', 'c35d300c930462dbab5a90a5c93bc164', 0, 1, 1, 0, 'W04425'); +INSERT INTO `jcdp_sys_user` VALUES ('9e1161a94836445bbdbf6ddc6516af6a', 'W06678', '白杏杏', 'abc217d8fa7e5c3fd05592d15136d5bc', 2, 1, 1, 0, 'W06678'); +INSERT INTO `jcdp_sys_user` VALUES ('9e7c4e8d04d54d63b4db362be239babd', 'W07120', '于磊磊', '6bd14e1356af4dc6c6a11c72ca3f297b', 1, 1, 1, 0, 'W07120'); +INSERT INTO `jcdp_sys_user` VALUES ('9e8760cffee345d9ad44c9f4c65becc4', 'W04583', '田素雷', 'd18d804757f1634918e1886c9e5d85c8', 2, 1, 1, 0, 'W04583'); +INSERT INTO `jcdp_sys_user` VALUES ('9f6637e1501e445ba660b9c93685c5e7', 'Y10075', '辛静', '82b6e08180ff36dd8ba376f2122f1683', 2, 1, 1, 0, 'Y10075'); +INSERT INTO `jcdp_sys_user` VALUES ('9ff2aa808d514934b0406495dff1fb50', 'Y15089', '段佳林', '9d78373a41b4ce66ccbea73923edc7e0', 0, 1, 1, 0, 'Y15089'); +INSERT INTO `jcdp_sys_user` VALUES ('a1836fd02e4041bf9e5f68dfa5614a8e', 'Y07460', '李艳龙', '12e8c79a3bf19f83bbecc6315b1cc504', 0, 1, 1, 0, 'Y07460'); +INSERT INTO `jcdp_sys_user` VALUES ('a34e39f40e2044aeb66f0330f5ed75ea', 'Y14033', '郑杰良', 'a8190f7bb0c3313ac1cf57981c82533d', 1, 1, 1, 0, 'Y14033'); +INSERT INTO `jcdp_sys_user` VALUES ('a413500114674efe89dad1c0043579af', 'Y08034', '刘佳', '00ceeba1429f0a6c251cb84dc4d7e8af', 0, 1, 1, 0, 'Y08034'); +INSERT INTO `jcdp_sys_user` VALUES ('a4e32bfdbeb249e9b9ba0ac23cd4b481', 'W04040', '文运丰', '2d962f92bba3decb328c007d0576ca89', 1, 1, 1, 0, 'W04040'); +INSERT INTO `jcdp_sys_user` VALUES ('a555574326ec46f7acf25d1e84b51425', 'Y07358', '李秋月', '08266c3dc4f9389de85ac3a6691225d5', 2, 1, 1, 0, 'Y07358'); +INSERT INTO `jcdp_sys_user` VALUES ('a61380ae2aac42f5b91af6b41ea21215', 'W06078', '李文明', 'cd345968ced7c50b2a00708d04c86bed', 0, 1, 1, 0, 'W06078'); +INSERT INTO `jcdp_sys_user` VALUES ('a6ecc3eaa7524007b2880fc5c74ef2d4', 'W07063', '闫启政', '68f85f379de36fc7ac4cf2a9a5111ee4', 1, 1, 1, 0, 'W07063'); +INSERT INTO `jcdp_sys_user` VALUES ('a6fefe02f64446cb855941af41aa67a9', 'P16107', '韩燕', '21232f297a57a5a743894a0e4a801fc3', 0, 1, 1, 0, 'P16107'); +INSERT INTO `jcdp_sys_user` VALUES ('a715d3f5714c46eea6f50935a5968f3f', 'W04728', '王煜', '13c129649c622e80d0a9d1eb1d0ac1eb', 0, 1, 1, 0, 'W04728'); +INSERT INTO `jcdp_sys_user` VALUES ('a7b957c9525b44cbb0f7cb097e6786d2', 'W06256', '张磊', '8a0a4e3a634114af1311bd1113b9000e', 1, 1, 1, 0, 'W06256'); +INSERT INTO `jcdp_sys_user` VALUES ('a9c54ea2d15d42a59a50e0260beb7e6a', 'W07865', '原普', '72120f4032d9e037784421a651fd570b', 1, 1, 1, 0, 'W07865'); +INSERT INTO `jcdp_sys_user` VALUES ('aba32ba9db004261ab548e3d4be0b506', 'Y13063', '井玥明', 'e6c8dc5a9b99a3c3872250424390381b', 0, 1, 1, 0, 'Y13063'); +INSERT INTO `jcdp_sys_user` VALUES ('ac37a0be81fb4e25a3ec6d370aeb59ec', 'W03253', '田青', '1e47a08c11d3ed0fbf6b672e03d289f2', 0, 1, 1, 0, 'W03253'); +INSERT INTO `jcdp_sys_user` VALUES ('ac6ff95774e8486a8cf49a8651676fc5', 'Y15079', '翟越', 'c42b582078a7fbd4466bfbd667d0f409', 1, 1, 1, 0, 'Y15079'); +INSERT INTO `jcdp_sys_user` VALUES ('ae67c4a6b5f840ab8945e979ca3aa8c0', 'W05159', '田庆春', '195e3151d3e53750b2efab31266e9f72', 0, 1, 1, 0, 'W05159'); +INSERT INTO `jcdp_sys_user` VALUES ('af2d89d248c4440ea5f83966337ebb8d', 'Y06031', '申利娟', '1bde32ef90f1123dcd3eafde43d03409', 2, 1, 1, 0, 'Y06031'); +INSERT INTO `jcdp_sys_user` VALUES ('b09b967714c2445d9646ffd8847afaaf', 'W06082', '王旭宁', '5d2a8401ff3d917573a83867d322a5c4', 0, 1, 1, 0, 'W06082'); +INSERT INTO `jcdp_sys_user` VALUES ('b0ea8b581b2645e2957bfa4431929607', 'W04896', '唐宁', 'd27f2174bfe2c34d5abb0b9f8d1fc7f3', 0, 1, 1, 0, 'W04896'); +INSERT INTO `jcdp_sys_user` VALUES ('b146eae053244eafb38ec2f6a2bf4075', 'W03236', '张俊卿', '5bfbe4686e0e944ad5eef7a1ed1f8ce3', 0, 1, 1, 0, 'W03236'); +INSERT INTO `jcdp_sys_user` VALUES ('b170bb9d3e5c4a22a1d74bc652d47165', 'W06021', '季娇若', 'faafe1c8aea895d98c6ba41734d4da7d', 0, 1, 1, 0, 'W06021'); +INSERT INTO `jcdp_sys_user` VALUES ('b2995efaa0ca42b097896913834af331', 'W08036', '崔紫云', '23f9271e879769d74ee83c89ec226ff8', 0, 1, 1, 0, 'W08036'); +INSERT INTO `jcdp_sys_user` VALUES ('b2e2a2ccd8db4b5e937a126306f53d93', 'W01887', '王东文', 'fe2edb05acf1aff6cefdee320481a7de', 0, 1, 1, 0, 'W01887'); +INSERT INTO `jcdp_sys_user` VALUES ('b2f6bfa580d14b799ab2956d6c6e71a1', 'Y05187', '齐婧', 'd91ad5abbb1bd84cb9724f1c51be00a7', 0, 1, 1, 0, 'Y05187'); +INSERT INTO `jcdp_sys_user` VALUES ('b304903b0f0a451bb44685a898508369', 'Y06216', '牛立栋', '9afa3dedc8928b312bcdce8287900522', 1, 1, 1, 0, 'Y06216'); +INSERT INTO `jcdp_sys_user` VALUES ('b3cd06296f044f1ab5e7fc730b64f5ce', 'W01006', '涂天杰', '46dcdd1c9048f2debe8924609df37fd3', 1, 1, 1, 0, 'W01006'); +INSERT INTO `jcdp_sys_user` VALUES ('b41e827302054d49a2b6017ec45f186a', 'W08035', '郑歆楚', '785e278baaf8379595d5fa3f44dbd18e', 0, 1, 1, 0, 'W08035'); +INSERT INTO `jcdp_sys_user` VALUES ('b497ab9b01c74a93b6ee7f079a356070', 'Y10027', '辛长平', 'ee0bd0b69a6162c9f0b01596b9a85014', 2, 1, 1, 0, 'Y10027'); +INSERT INTO `jcdp_sys_user` VALUES ('b5476fbcc39f43108da6d6896ce607b2', 'Y10078', '周友平', '3fdd91a236b3084f8ad43f9d39db2f9f', 0, 1, 1, 0, 'Y10078'); +INSERT INTO `jcdp_sys_user` VALUES ('b7bb532db0e34631a34a61384f9c5b8e', 'W05076', '郑熠', '1cf7f045a214267c2fd745136c10a06c', 0, 1, 1, 0, 'W05076'); +INSERT INTO `jcdp_sys_user` VALUES ('bc2ca8f58ff845aab2fdd6560a0a3b34', 'W07570', '毕雅玮', '14f3c220f20315f73b51b06f998867b7', 0, 1, 1, 0, 'W07570'); +INSERT INTO `jcdp_sys_user` VALUES ('be388be5d7994bf6a8a321f2c85328f3', 'W07837', '冯向明', 'c7eb57dafb316a92ee5c7928b1b8f00e', 0, 1, 1, 0, 'W07837'); +INSERT INTO `jcdp_sys_user` VALUES ('be5eed01ec694ac1b72539887bec1235', 'Y11044', '赵建欣', '50a5546a57d4a2148fc2b11d6be39f8d', 1, 1, 1, 0, 'Y11044'); +INSERT INTO `jcdp_sys_user` VALUES ('beefed50d1fa4e258842b5e46acf136b', 'Y08165', '赵志', '5dd5c73c0f44156719cc24c534564808', 1, 1, 1, 0, 'Y08165'); +INSERT INTO `jcdp_sys_user` VALUES ('c024f0a1db424695811a33c00f5436ee', 'W06322', '吕杰', '87f33dd79fc746423308f67520748ada', 1, 1, 1, 0, 'W06322'); +INSERT INTO `jcdp_sys_user` VALUES ('c219eb3b489e49a5af65dbc7f42754c8', 'Y06218', '刘淑涛', '2994c868a471113efc4a38413960d9b0', 1, 1, 1, 0, 'Y06218'); +INSERT INTO `jcdp_sys_user` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', 'W07427', '刘聪', '860ba264d60ee00641c5fb532ed72e94', 1, 1, 1, 0, 'W07427'); +INSERT INTO `jcdp_sys_user` VALUES ('c366b72c968b46f8b7d4592ff4535fbb', 'W07867', '武唯康', '75e6a7f0cfc892ded5dacb86754a7db7', 2, 1, 1, 0, 'W07867'); +INSERT INTO `jcdp_sys_user` VALUES ('c44689a1f02a41a5b40958c41cd12354', 'W04582', '赵承志', 'ba666b6046a14efefcc604adcf828071', 0, 1, 1, 0, 'W04582'); +INSERT INTO `jcdp_sys_user` VALUES ('c453b86641384536928cbdd3bb8d28fd', 'W07866', '薛勇健', '53f7f0af04a0f106ed94524ab751077c', 1, 1, 1, 0, 'W07866'); +INSERT INTO `jcdp_sys_user` VALUES ('c5bb8e6cdd44483bbda150ee48767c10', 'W07471', '焦龙涛', '989f090904f8d71be5f00b142675fe07', 1, 1, 1, 0, 'W07471'); +INSERT INTO `jcdp_sys_user` VALUES ('c737c65323c34f809ef527dc2d09eae1', 'W01974', '于湛军', '6e9a0b1c67a6f0aa47840a637be3f86d', 0, 1, 1, 0, 'W01974'); +INSERT INTO `jcdp_sys_user` VALUES ('c73c51eea7a846249c111f1da4663707', 'Y13038', '孙宇凯', '55f58d3e6b1a7832a194bbb0bf53d256', 1, 1, 1, 0, 'Y13038'); +INSERT INTO `jcdp_sys_user` VALUES ('c876b1db8f4c46ed9269f5617b1f831a', 'W06420', '耿向羽', '37caee1ce305d9d0fb76e355836f7e3b', 0, 1, 1, 0, 'W06420'); +INSERT INTO `jcdp_sys_user` VALUES ('c90b3e7907094c3cb399f6270c5d3e2d', 'Y11032', '谢浩亮', '483fdbac334adf8de6c66f902e56aee6', 1, 1, 1, 0, 'Y11032'); +INSERT INTO `jcdp_sys_user` VALUES ('c918b6b3166141a6b95b457d12097001', 'W05179', '刘林海', 'c742d46c947bea017e92b3a1b6f8d8d5', 1, 1, 1, 0, 'W05179'); +INSERT INTO `jcdp_sys_user` VALUES ('cb403adab4a64e46832282b4ba2493a0', 'W06998', '赵思卓', '4431f8b229129db01ad04747e173e9c0', 0, 1, 1, 0, 'W06998'); +INSERT INTO `jcdp_sys_user` VALUES ('cbdf46b590834d6caf745338a29345f7', 'W05521', '殷云志', 'a2d099fdd9c886e54d4e06cbaa4684dd', 0, 1, 1, 0, 'W05521'); +INSERT INTO `jcdp_sys_user` VALUES ('cc9f956277e64231bfbb6bdf1568b4d2', 'W04730', '于静', 'cbdfacf36f6b91df717d9ad9127f2824', 0, 1, 1, 0, 'W04730'); +INSERT INTO `jcdp_sys_user` VALUES ('ce71b122485c4baab6c94138820ff8ac', 'W02745', '邵力', '7892421f80d736d32b4587ca8a7c1c2b', 0, 1, 1, 0, 'W02745'); +INSERT INTO `jcdp_sys_user` VALUES ('d020e7d106aa4ff2bb5f7742c0548fd6', 'W07386', '杨光', '7e9a1e6ede4dc11dcc5dd61c9dff9ae3', 0, 1, 1, 0, 'W07386'); +INSERT INTO `jcdp_sys_user` VALUES ('d072905f90904ad882af0465c061ea5f', 'Y08183', '皮飞飞', 'da969f2c2903b85dc9365ce985222e7e', 0, 1, 1, 0, 'Y08183'); +INSERT INTO `jcdp_sys_user` VALUES ('d1148ce1866a482b94885e36cff209f8', 'Y09023', '杨玉英', 'ec243f6f5b92338711d08704f0828d8f', 0, 1, 1, 0, 'Y09023'); +INSERT INTO `jcdp_sys_user` VALUES ('d13b635568934d91b9a019e7b94a7cc8', 'Y09005', '胡晓彦', 'c46009fb5fe7c027ff48256d63080fb5', 0, 1, 1, 0, 'Y09005'); +INSERT INTO `jcdp_sys_user` VALUES ('d1732f1b2c7744d8ad71702649d6713b', 'P11218', '崔隽', '0d070ab3937beee5fecaf47263376806', 1, 1, 1, 0, 'P11218'); +INSERT INTO `jcdp_sys_user` VALUES ('d31aa2be282d4e578b01106563ec2fdc', 'Y05635', '薄祥', 'c4d4a3e6e5d43488854e31836bcffcf6', 0, 1, 1, 0, 'Y05635'); +INSERT INTO `jcdp_sys_user` VALUES ('d32fc5be4abc4ba4a78e558457720f1d', 'W02880', '庞士军', 'b729ecebff4ab5a11fef9230b1b05413', 0, 1, 1, 0, 'W02880'); +INSERT INTO `jcdp_sys_user` VALUES ('d4049848d5474e5cadc6398a5ac1887b', 'W06685', '张晓峰', '295ce68f91216514814c52c6056ec4fc', 1, 1, 1, 0, 'W06685'); +INSERT INTO `jcdp_sys_user` VALUES ('d5c5415454c041eb8efbacdda1b3e170', 'Y17093', '王铁一', 'b23b3b317f6890575af759e12e8af399', 0, 1, 1, 0, 'Y17093'); +INSERT INTO `jcdp_sys_user` VALUES ('d69c39dc65b24904838f2e9f604f2feb', 'P12082', '屈春安', '1ede2307cc47ad88415902b9974fb16e', 1, 1, 1, 0, 'P12082'); +INSERT INTO `jcdp_sys_user` VALUES ('d6deedb76ca2475e84bda50105852171', 'W07821', '马健', '636498c5230324f9d1e6b0f3eb38e456', 1, 1, 1, 0, 'W07821'); +INSERT INTO `jcdp_sys_user` VALUES ('d6f4cda74d444a1184de8a4b28dc19ff', 'Y02063', '曹燕', 'f044fbd2ad8eb84f50e7a291a0099666', 2, 1, 1, 0, 'Y02063'); +INSERT INTO `jcdp_sys_user` VALUES ('d709410eeef548b094432c9eb1deb433', 'Y13027', '张帆', '2597052c7cd98fe0a4e3e265f2c87007', 0, 1, 1, 0, 'Y13027'); +INSERT INTO `jcdp_sys_user` VALUES ('d72ca767bba44529a40901fa9a264b83', 'W06433', '程金胜', 'a4e26ec8a6dc0d56d40c6509aeefdf34', 0, 1, 1, 0, 'W06433'); +INSERT INTO `jcdp_sys_user` VALUES ('d829117c300c4882888ce059fef71373', 'P14030', '靳恒立', '8cabf1b2ef85173c70d00ecf8d0f45b3', 1, 1, 1, 0, 'P14030'); +INSERT INTO `jcdp_sys_user` VALUES ('d8c3299891414920ac34ad80d8571aa3', 'Y17101', '张浩岩', '280b2691c1573f8435e0211d74de9987', 1, 1, 1, 0, 'Y17101'); +INSERT INTO `jcdp_sys_user` VALUES ('d9074901d5934613ae09ebb1835f3b1e', 'Y11014', '程英涛', '8b54ee7bac728e4b59e18fc4c81cabae', 1, 1, 1, 0, 'Y11014'); +INSERT INTO `jcdp_sys_user` VALUES ('d9c9ee6f80ee444a885d733c4e68e952', 'W03971', '丁雪丽', '7740214df0956554c55ab06bbfccfdee', 0, 1, 1, 0, 'W03971'); +INSERT INTO `jcdp_sys_user` VALUES ('da79e028e4e746c4a69b8d759d89c1af', 'Y05111', '安宁', '5223da8064cc0e46d904dbfa4410f9b7', 0, 1, 1, 0, 'Y05111'); +INSERT INTO `jcdp_sys_user` VALUES ('dab0e15f4915474cabcb105cc4a1bb90', 'W04237', '于金华', 'd5c21059f26aa5d0e75573dd812449d6', 0, 1, 1, 0, 'W04237'); +INSERT INTO `jcdp_sys_user` VALUES ('db7e500f67dc4ac2adb356974ef92309', 'Y16038', '付亚飞', 'd546e67f04e518173946b956a4b340dd', 1, 1, 1, 0, 'Y16038'); +INSERT INTO `jcdp_sys_user` VALUES ('dcae3f9a502846d48704ca53efa402e0', 'W06091', '安辉', '1a4663788de3dc6d4d740a77431e96bb', 0, 1, 1, 0, 'W06091'); +INSERT INTO `jcdp_sys_user` VALUES ('df138bd0e9284ed9b7117e0eaa1a4d27', 'W06439', '柴伟杰', '2186c351952f61ddfce2b0b5f822f2ff', 1, 1, 1, 0, 'W06439'); +INSERT INTO `jcdp_sys_user` VALUES ('df4b354ad6a143f0a1c86ad0f5cf8e51', 'W07658', '吴迪', '230c7ac9a99961ba284b913f22533dc4', 1, 1, 1, 0, 'W07658'); +INSERT INTO `jcdp_sys_user` VALUES ('dfe7792b24964e168d70a58499aba9cc', 'Y07364', '徐起航', '9691f219c5c0b08940a2ee6a7537ef8c', 0, 1, 1, 0, 'Y07364'); +INSERT INTO `jcdp_sys_user` VALUES ('e07451595e8740ff9e8928006a382895', 'Y09024', '李燕茹', 'aa69ee5851d0245b30bc9628a09a9289', 2, 1, 1, 0, 'Y09024'); +INSERT INTO `jcdp_sys_user` VALUES ('e0899eb126d2488b92bb59e80e897aec', 'W06833', '高婷', '6474f09c74d0b32a96fed0f2018faa1f', 2, 1, 1, 0, 'W06833'); +INSERT INTO `jcdp_sys_user` VALUES ('e1644e16aaa943f7b0c18174613bc08c', 'W06523', '陈鹤', 'cd4dc7134ced782fba9b54e4174d0fc6', 2, 1, 1, 0, 'W06523'); +INSERT INTO `jcdp_sys_user` VALUES ('e2b1245a95c041b4b650e215c1943bbe', 'W07312', '杨格亮', '4775f01d442a8e358382d473a2c9cd42', 1, 1, 1, 0, 'W07312'); +INSERT INTO `jcdp_sys_user` VALUES ('e343e533e6df4698bb18bb80d0ca7410', 'W07856', '原普', 'c37b37e5f62460e1118d74a98e8bfd66', 1, 1, 1, 0, 'W07856'); +INSERT INTO `jcdp_sys_user` VALUES ('e37515101bd340f2a5920840f1acfd0e', 'W07271', '刘伟', '05dd7fe8314f11d3f677fab5540c4f8a', 1, 1, 1, 0, 'W07271'); +INSERT INTO `jcdp_sys_user` VALUES ('e437aa3f7a324855a4ba66e251ff31d7', 'W06267', '代刚', '62b58725104be99237df3c7291d90938', 1, 1, 1, 0, 'W06267'); +INSERT INTO `jcdp_sys_user` VALUES ('e47162f0dee14b7b967f0b8e5e57c649', 'W00107', '赵玉', '3dadaaae646030bb73698c42180cf18a', 2, 1, 1, 0, 'W00107'); +INSERT INTO `jcdp_sys_user` VALUES ('e557263fefef4350ae585e6738402cb7', 'Y14044', '王哲钒', '8cbca0c8fe09dd0d91c9b5915ce3e122', 1, 1, 1, 0, 'Y14044'); +INSERT INTO `jcdp_sys_user` VALUES ('e6d0e46cea0847f79a9e3328bd4b1504', 'P12215', '陈谦', 'cbf435bc2c11ea1680893629d2c65fd5', 1, 1, 1, 0, 'P12215'); +INSERT INTO `jcdp_sys_user` VALUES ('e7b4ef5c6aa045a18a63b3f5dde08140', 'W05391', '颜洁', '16bd70d0635665a9a18adbea5945fc4b', 0, 1, 1, 0, 'W05391'); +INSERT INTO `jcdp_sys_user` VALUES ('e89dd0bd237b4e6eb9984581b0765e1d', 'W04388', '延河', '5c0a75a4812610701b88bf00aba7d046', 0, 1, 1, 0, 'W04388'); +INSERT INTO `jcdp_sys_user` VALUES ('e8bf416fc9804a6abb39cbfe6c1698f7', 'W07279', '赵思棋', '005f7b2eaf1b1e1255739aaf7beeb3f1', 1, 1, 1, 0, 'W07279'); +INSERT INTO `jcdp_sys_user` VALUES ('e9088f3abdb340409f55380f6a673475', 'W05067', '王明', 'cc2851bcbe0ffd7a2af558bdc1bca4be', 1, 1, 1, 0, 'W05067'); +INSERT INTO `jcdp_sys_user` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', 'W02030', '杨卫东', 'fd9875b11a89554ab5439cf12e5cd2f4', 1, 1, 1, 0, 'W02030'); +INSERT INTO `jcdp_sys_user` VALUES ('eaf75d0763344e008f181426a2542873', 'W06520', '杨豪', '40372aaaf56681d9a1e16d7084bd43f4', 1, 1, 1, 0, 'W06520'); +INSERT INTO `jcdp_sys_user` VALUES ('eba152f716114424a37e5c8e11d8d995', 'W08011', '刘丹', 'c96b486ef1bab8ba836dce67b832f87f', 2, 1, 1, 0, 'W08011'); +INSERT INTO `jcdp_sys_user` VALUES ('ed93fa03c3b742ad8837a474d2218197', 'Y12028', '胡丛阳', '96b6e65e776526ab6df7ed36e146b55d', 0, 1, 1, 0, 'Y12028'); +INSERT INTO `jcdp_sys_user` VALUES ('edf3e838b0fb49e2bcde0707fa255f2a', 'W07871', '张俊杰', 'c68e3c7a42a7be79e9ce08d39f37ed2f', 1, 1, 1, 0, 'W07871'); +INSERT INTO `jcdp_sys_user` VALUES ('f05f2405bf034eaaa4f94e160f91de8b', 'W04917', '刘军泰', '56c38cb8df5d4288c5222142bac833b7', 0, 1, 1, 0, 'W04917'); +INSERT INTO `jcdp_sys_user` VALUES ('f2e2329423e44966ae29d3fc8f3083ee', 'W04359', '温晓伶', 'fef6b8d11373bea86a29ac48e889055c', 2, 1, 1, 0, 'W04359'); +INSERT INTO `jcdp_sys_user` VALUES ('f475e0eef09c4c1ba2c2b06f503ca4c2', 'W06253', '陈明辉', 'b70caaf837b5de31f7e612f093433415', 1, 1, 1, 0, 'W06253'); +INSERT INTO `jcdp_sys_user` VALUES ('f4d6d95a49ad414eb567000b8dea9fe4', 'Y04135', '孟理', 'f5f3268f00670e91bc53a944cf7dcd24', 1, 1, 1, 0, 'Y04135'); +INSERT INTO `jcdp_sys_user` VALUES ('f5c4fa8d664844ab964ea5381991a2ce', 'W01181', '高晓滨', '6b73f135218d7944bf29370ac924fd3c', 1, 1, 1, 0, 'W01181'); +INSERT INTO `jcdp_sys_user` VALUES ('f776853f84844e2f8d35039c43886d61', 'W07419', '刘扬', '83318e60f604c58654878c481e89b680', 1, 1, 1, 0, 'W07419'); +INSERT INTO `jcdp_sys_user` VALUES ('f77ca757cbbd486b8a159788f20ba986', 'LiSi01', '李四', 'e10adc3949ba59abbe56e057f20f883e', 2, 1, 1, 0, 'LiSi01'); +INSERT INTO `jcdp_sys_user` VALUES ('f7d3f7b9a7c046a38e02d035eae7835b', 'Y13048', '冯航', 'af3f78bf077be837ef96bd71fb925351', 1, 1, 1, 0, 'Y13048'); +INSERT INTO `jcdp_sys_user` VALUES ('fa213aafc1d44610bd4e7ff549e1cdf7', 'W04913', '张永江', 'e2f5cbfb969e9e7bce5ecf564117c340', 0, 1, 1, 0, 'W04913'); +INSERT INTO `jcdp_sys_user` VALUES ('fa5507f1eeac49f091aa877a94244548', 'W07486', '郝亚男', '83f2dff8df25cb7337905c751967352e', 2, 1, 1, 0, 'W07486'); +INSERT INTO `jcdp_sys_user` VALUES ('fb90ee122f6c47269d77942b56a4783c', 'P16086', '杨天玥', '96096c501da5a5bc4a93dd6e4681111e', 2, 1, 1, 0, 'P16086'); +INSERT INTO `jcdp_sys_user` VALUES ('fc8d6db364ff4e9c8e53c05d9698b699', 'W04052', '纪学军', '3fc3d9af20db659b4bdbc509cfd150cf', 1, 1, 1, 0, 'W04052'); +INSERT INTO `jcdp_sys_user` VALUES ('fc974f2a79904981aa51588f400f1583', 'W03852', '宋广怡', 'f3b5c30b5f306ba6f21434c3dd4e0731', 0, 1, 1, 0, 'W03852'); +INSERT INTO `jcdp_sys_user` VALUES ('fe24c4ac34444902a2129ec1debf9ed4', 'admin', '超级管理员', '21232f297a57a5a743894a0e4a801fc3', 1, 1, 2, 0, NULL); +INSERT INTO `jcdp_sys_user` VALUES ('ffa8b735df944927ab7685e67b3b3e95', 'W02577', '朱海江', '42684d38c01f30fbe623ed7e36f4d9cd', 1, 1, 1, 0, 'W02577'); +INSERT INTO `jcdp_sys_user` VALUES ('ffcd6c7df3444a8f8b9eb2c6b8d80ca4', 'W07678', '王楠', '7b4fdb69c1534d65e8f8459816cb1dac', 2, 1, 1, 0, 'W07678'); + +-- ---------------------------- +-- Table structure for jcdp_sys_user_ext +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_user_ext`; +CREATE TABLE `jcdp_sys_user_ext` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `EMAIL` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱', + `MOBILE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '移动电话', + `PHONE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '固定电话', + `ADDRESS` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '联系地址', + `ZIP` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮编', + `IDNO` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证号', + `BIRTHDAY` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生日', + `REMARK` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注', + `DYNAMIC_FIELD` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '动态扩展字段', + `AVATARS` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '头像图标', + `AVATARNAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `USERIMG` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '照片', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_user_ext +-- ---------------------------- +INSERT INTO `jcdp_sys_user_ext` VALUES ('02c73f13986a4926ae2df7835eade578', '', '13643382395', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('037dfda4d5984a71b23bde0359dac140', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('03b37ba8d14a45cdae3100eacaec52a9', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('045802b3d88d4c998b3757a65d0149b7', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('0526d560648a43998b846f42e85baa2d', '', '13180098325', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('05daab960ff8450d9cbe84cd3c7dd260', '123', '123', '123', '河北省石家庄市中山西路', '050081', NULL, NULL, 'sds', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('068768e1eb764837bc4d98f0216b94e7', '', '13633219219', '4462', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('07b75922b82149ab899bee340a47970a', '', '15931102653', '8464', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('07c1963549914dac88e8ba6092ba3393', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('082538db933e477598aa3e87ec2b21e8', 'yuehw@cetc54.com', '15130145015', '4101', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('08392ef87499474a82a8954c7ced7390', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('097879d75fc54dc285aff704d8734a21', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('0980b8836368476297e98155c859f632', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('09f0e91f6a61479889570ef76bfdac96', '', '13102879675', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('0bf7f79407994e7b8eb08aece0dda10f', '', '13032636582', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('0c75b6943be44c0c94c58d474b798431', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('0ce0a3ff742745cca27435b4384abb31', '', '13623219827', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('0dbcd8427607493281ff3e4a6ae68cf2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('109e2fea45ed4d4e8d377dafddb43fcd', NULL, '13623217372', '8472', NULL, NULL, NULL, NULL, '8472', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1384281140ca4b219bf98ee235f3aba1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1427218e39e144eea7aecc6d1a85e3df', '', '13930408966', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('14a6ffda63e8453eb7e661c23a671ca6', '', '18231107586', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('15500c6b69df47e9a60fb42ebf7b467b', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('169e0e9038cd4d3d8c0bb7bb1a890dd3', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('17cd6f91e3f948778a23909248a6ef2a', '', '13784372078', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('18a377035a944468a62b11caf31f9d72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('18b6c5584638426683267b6fd4cd78b2', '', '18032068993', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('19adff3370f84af196cc73474e2a6d0c', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1a2b2892052641a6b656e79216433ba9', '', '15932479899', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1aa9313e83bc42de93663528627243d3', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1c85d30bff54420c9878247ff54867e0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1ca20f3aacd64aa595d51489838fed03', '', '13633211868', '8504', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1cacf210910640a58c2f3fe190122711', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1cb2fb93db774202bdd2532fa57d9bff', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1d8094115f5c4c6ab8c38c414a65d6f4', '123', '123', '123', '河北省石家庄市中山西路', '050081', NULL, NULL, '8471', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1db1801a29f344b780f018cbffc9b3f1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1dce74df53b44ecfbe89edc802914bf8', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066@cetc54.com', '13780306726', '8559', '', '', '', NULL, '每天进步一点点!', NULL, 'http://localhost:8080/jcdp/index/getFile?type=avatars&url=20180117153130476_AnZhuangRuanJian.png', '20180117153130476_AnZhuangRuanJian.png', 'http://localhost:8080/jcdp/index/getFile?type=avatars&url=20180117151157651_joos2.jpg'); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1e89fb25e0734ae1bf339efdac68c85f', '', '13933866220', '8525', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('1eac9b5fdd784b00b1e2037e8d8d6a22', '', '13483131054', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('200c68d821984e73a4b6e1b86eedaabe', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('211dd03b8a304b57a77d457d6beae1f9', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('219b6fbea83345e7b810a402c41f8df1', '', '15933116217', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('21f9e4d6815848999f53f468997b00b9', '', '13603117574', '8527', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2230bf8c4d5146608aa6399080c1f8c4', NULL, '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('22c61d3c9fd04fa18803c8ce98bb0cd9', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('248b0fb582e546ff88ec325ee26fc535', '', '15831937809', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('256a9ff4c8f24612ad68a65a0db8f973', '', '13832137020', '4197', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('25f0fd10490349b9941f8325c1fc8488', '', '', '', '', '', NULL, NULL, '猥琐发育,别浪!', NULL, '', NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2798eeaa5ed445749f80f71ef202cffa', '', '', '', '河北省石家庄市中山西路', '050081', '', NULL, '全心全意', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2867095e1fb14f37ae3d801c75c4eee3', '', '13932136880', '4621', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('28fb5f2bc277490ab8d3b8dabebb2c0e', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2947b126a1714adba1b3666cf3b015c5', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('295c09c5e4074f0e9ebd2dc5cc463667', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('298ff55340ff47b188c9766f75eb159b', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2ba55257e6884d52b6a8220f2f782733', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2d83ceb498df4e77b290a6edf9a37021', '', '15032743518', '8529', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2d96e3863dc74b23878314d5eee59d9a', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2e22bd54a0fe4c40a140ab2d0e99f233', '', '18633836753', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('2e25ac5da040436088cafb6f29cd8e8f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('30eac268f9b743d6b347dbfd8304cd70', '', '18332390912', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('3260d140b17744e5b4ecb80ac658d300', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('32a36e78b5fd44649ae1b9b4a3b174e3', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('33382ef814e849b4a761a576455ef907', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('340fe94b0464472e88cc0fe7065170dc', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('342911785e9f4c5eb5ed96c13a495fb1', '396105640@qq.com', '18831109139', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('378892771606469ebe86c370b3c4f8eb', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '派上用场', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('37be4e7e24564c5e9f0afdf76975c6e0', '', '13722459870', '8814', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('37c330f585a5411db6958ec3d034032f', '', '13111599293', '8232', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('3916b39fbb2d449e9768b73a001a5ae2', '', '13582813119', '4192', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('3930ab98da0a4e82aab1824823135576', '', '', '', '', '', '', NULL, '终于有电话了', NULL, NULL, NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('3a089a897e294c67829ca12ef72a4d03', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('3cbb96bb46294815a302d8e6793cde3b', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('3d30a7e3e08b4ca59a4783197b809a79', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('3ea7ec4286744d628ebd00e6c9b779e9', '', '18630176092', '4163', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('3f29e5b0069f4dca982a7af45fcc7946', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('40153ec910b345a7b5176d6297f29c03', '', '13393231638', '4624', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('42903568050447b08e9967dbd291506c', '', '18931178956', '4624', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4374c25a897842d08d2b0ae653eb6344', '', '15831939092', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('43af99fb531d44e68a1bd20ff153aa69', '', '13831182318', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('43ba14c407114632ba0d396e3c9b5c2a', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('44d905a1dcd94399a4804082166ff54d', '123', '123', '123', '河北省石家庄市中山西路', '050081', NULL, NULL, 'sds', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('44e2c6b6eef64c48997ad59fc6428e10', '', '13831182795', '4462', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('44e74bb07b4b4fceb9ba9ed135ea5e7d', NULL, '15833112362', '8470', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('46b350b728e64cab9af6594d31c36f0e', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('46b8e24c27ee44b899dff5f6b00cbc26', '', '13785145968', '8336', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('480eabb80700486185121285d855541d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('482984ac4e1f4226b2a48c781266a150', '', '13931857307', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('48e5269d5fb0450ab24708c9ba20aac9', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4b0adf9a1ca244b985b51b732e8b58a6', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4b26ac8b7aee4a02bc8c8548a4affa6e', '', '13833173100', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4b789c8f37a840fd865a486c72fea11d', '', '13081066163', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4d00aa9c7df84dac86e0e5aef5d34885', '', '15833900873', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4d4183bb9d3a42e5870fbc58c1022e75', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4d616085794541b1a12ea3dbef6c41bf', '', '13931850001', '4243', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4ebe0869262f4407871646184af75fd6', '', '15131643312', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4f2eac222b164c338c6913a8e96bc7d5', '', '13931850911', '8918', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('4f412ec3e8fb41ef84c743fb8dd95f2c', '', '15103110078', '4374', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5114bbde00c24617841113ed12908114', '', '13754513196', '4455', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('521d08563ab74b8188599be180575bcb', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('52bd5b59504c4cceb8b397654bc647a6', '', '18712726670', '4477', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('52fd81d5f3c641b9b3e3c058efee0357', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('532a80316d0141e0990f123b0068317c', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('539a551045944c28a9945d0f6cc550c2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('53fc929cf08947c393d6a132b71c8c59', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('541163ddcaec4751b6d6e86207cc48c1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('545b2a2ca2a04583b6dc0dddc8c8ab29', '', '13613212837', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5619c0acad764d84989e69bc5c57b461', '', '', '110', '河北省石家庄市中山西路', '050081', '', NULL, '我是张锐!', NULL, NULL, NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('561fa58b43ec443f8420e9637e4d38c0', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5676921ac94b4633a614892676567bfb', 'P12189@CETC54.COM', '13933157950', '8469', '', '', '', NULL, '啊我饿一屋鱼哎诶喂熬偶油', NULL, '', NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('57e5a30a134f47c0b76178ac345d5465', '', '13933840108', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('597971047f3541dc94171b6f5d114c29', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5b0037df0e3b4bfaa89c36d74e5c7a81', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5b6c06080d5a4b86b9673fd373011ae4', '', '15933113203', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5baafe72ad534503bb27e43860a1b4cb', '', '15100112182', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5cbf662ecc09469e9060f2f20eb9309b', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5cc8029e3d9e46cc83e434b412b72b52', '', '13703293045', '4963', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5dd57a31f31d44f1875035ee6b9582e2', '', '13932101109', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5e0b157de9ae4c2495f3918e7625431a', 'vegalee@qq.com', '18032108900', '8470', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5eaafabf2d4a4856999f9e684d327ead', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5f632069a0164b479e53f093ee83c0d6', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5f822f0ca21a4b43bcd4a04dc9faa902', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('5fa4285cfc9e4f5d975c979814a5dbec', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('602751b6aefd48b38b1bd07e9fa64f31', '', '13933109811', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('606844d489f841939e330acdb5b2601e', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('61f00a225f644f37bf83c0673ea81845', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('63229c9686214b1ea1c133f9abf4cb4d', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('65367901d2f144cb8a7fd93f4356c64f', '', '15531111306', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('66486ff6f3db4d38a07f17717f23f12c', NULL, '15710303991', '8559', NULL, NULL, NULL, NULL, '好好学习,天天向上!15710303991', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('664afc7c3f924e669ae697a932594531', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('675eadcb6ae64a548036a4ef986b64cc', '', '18333108768', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('6a26f0722eaf42df86d7c27a62e7b02d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('6c583d1f10a241ad90b0a11898a670ca', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('6d18ae59a8244307aa1ac210e3fc41d5', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('6d74ae8842b74e239efd63bb95f053e3', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('6d8f2916ccc044c3957e2ff4cafbf98b', '', '18033765311', '4455', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('6e3931a0a8794f30bae7e63b86259643', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('6e40a2254a86454ba9a69a4a4b1d44d6', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('6f9333baa5db42d4911644a30833c0f6', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('71950c802ebe45859170eb8fc67a7c76', '', '15032187205', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('720cb5a0c9b04aad85ecce4731055bee', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('76da5a1769f6438cbd7580a4632de45e', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('77b130a7a09b4409a198c688fbad7e68', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('77f0e9ced74e438783a96cbdab22c1ec', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7828fb0827dd4ab08481600b66492c3e', '', '13832156899', '8530', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('79c16ac130bb410eb98d521ed14c2a2f', '13722799531@163.com', '13722799531', '0311-86928466', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7ab800df83fe439c840bf14658c30543', '396105640@qq.com', '13503330837', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7b2f37d2eac24ee990972baefd7dda4f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7b37646871b445189b446fd8ee369094', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7ca89aa7ac7747b8ba498307b426de48', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7cd8b8f56966432b9541285bfc797555', NULL, NULL, NULL, NULL, NULL, NULL, NULL, '任生已经如此的艰难....', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7cef8587cddc4f03a1e7176e0a8ee340', NULL, '17732187274', '8472', NULL, NULL, NULL, NULL, '鹅妹子嘤。', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7dcd4e266b8147ee8bf0195fcec6f6be', 'wunan@cti.ac.cn', '13011555511', '86928076', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7e2c277885da44e5b253ca57f775ee94', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7f288bfcbbb44390a92daf5712088d17', '', '18632178825', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('7fa657de2e134704b1e62b5581343656', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('80c7c582c2674022878e838a459145d4', '', '18632173892', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8180b37adc664b72a571d6e4001602fe', '', '13739700370', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('81da281af6944739a40802460762eff3', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('81f3563afdee4cffb07ddf27d0538cfb', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8293a6507d974027bcd8a54a5b90abb5', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('82a04b4689d84862be5c4b600b099fc1', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('82bb85dfa7dc4330893ac38fda2ae74d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('83b9caffe40948618028f7ec4a95ad3a', '', '15030189132', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('83bb22a54cc4492e8fa3043a21a001ec', '', '17732150947', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('83bedd208c9a46eda1ce4e47705b3b73', 'p16106@cetc54.com', '17603202982', '8472', '', '', NULL, NULL, '喂!啊?伐木累啊。。。', NULL, 'http://10.55.148.42:88/filedownload.aspx?path=EIM.Update\\EIM_Alpha\\Emotions\\6.gif', NULL, 'http://10.55.148.42:88/filedownload.aspx?path=EIM.Update\\EIM_Alpha\\Emotions\\6.gif'); +INSERT INTO `jcdp_sys_user_ext` VALUES ('84337ce99ca24ba886bad2cc59f048b9', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('84ac0ac6d4464f73a11f7e5405041cd4', '', '17732187353', '8648', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('84d6e483e21b4027985203b26dedb769', '123', '123', '123', '河北省石家庄市中山西路', '050081', NULL, NULL, 'sds', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8527c0ae4cba4e6ba511442194cdcdfa', '', '15931682197', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('869474428b3e4408a1351e16978a37f8', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8708083ae3d14e80867604d47e5d215d', '', '13663115286', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8778b7b776c242f98b6ad46087adb2e4', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('87b8438ee06b403f9fa476679df9dc15', '', '13784397287', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('882581da99a3447187c073271f763b30', '123', '123', '123', '河北省石家庄市中山西路', '050081', NULL, NULL, 'sds', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8a80a7acc3824e15be6a6ed1f94689a7', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8b42a3b49bcc4464ae7e076ff75a1cd5', '', '13663115286', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8b78be4bc56d46fba2ff5150e739b4b9', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8c491f940f844e6f8bf23fb874177cb5', NULL, '17732872852', '4101', NULL, NULL, NULL, NULL, '不完美也要精彩!', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8d228913013c464a8a5018ec42e6f0f5', '', '13400412469', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8d3fcea68419434786f412eb517888fd', '', '15931195051', '8787', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8f79a13cec6a4826a394237736828768', '', '13315150130', '4164', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8fb6ef3a9fb243889e37884e6245928a', '', '13722786094', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('8fe110723d5b48bfb7ae79bc98e4317d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('90334c20002644a4be3ac0125d97784a', '', '13673237575', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9158ec943e6d49bb9c0df8b6c3666a28', 'test@test.com', '15932218735', '123', 'aaa', 'sdsd', '123', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('920c7fb30bd44be8bd4581e7882f6dfd', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9212486aec5346d396b182eca2043eb9', '', '15533660970', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('928ff182e1594a74899d82144156af09', '', '13582199391', '8528', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('93c2a1ec4940431caab0eb93fc079b12', NULL, '13931151096', '86928463', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('948dab550b93428096610e31eace1478', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('94ec3b277d104816933ac089423b5bbf', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('94fe339e071e4979a89fa29265507eed', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('959f8e645e3c45ec88edbc073b5b42dd', NULL, '13731164611', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('96cc863bca2c436a85cd52db7c1df9d7', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('979808dea33d4ac5b18e5f280535db56', '', '13930169955', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('97d009ed87664304a713241fffb5b47e', '', '15133169100', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('97d45832f7df41089b2b11da5534e36c', '', '18733101830', '8466', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('986d2627c90742f8aa78d8815cd5cab9', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('988c90d28f124c029544716f0f6f0c8f', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('98a2763769f9479ea6092c100a000202', '', '13933181575', '4455', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9a8a0a0b27754a73962c221ee73d2c43', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9c227190e0404d1ab84cb65dfddca512', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9c4ec5025ba140808e9fe44f3cc848ff', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9d211f337d3d4dd2b614b6032ab350fb', '', '15030157221', '4119', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9d68b5cbf62b4a6fbf394e5bed9daff5', '', '13931165617', '8077', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9e1161a94836445bbdbf6ddc6516af6a', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9e7c4e8d04d54d63b4db362be239babd', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9e8760cffee345d9ad44c9f4c65becc4', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9f6637e1501e445ba660b9c93685c5e7', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('9ff2aa808d514934b0406495dff1fb50', '', '15130653786', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a1836fd02e4041bf9e5f68dfa5614a8e', '', '15832199859', '4119', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a34e39f40e2044aeb66f0330f5ed75ea', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a413500114674efe89dad1c0043579af', '', '13731100220', '8132', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a4e32bfdbeb249e9b9ba0ac23cd4b481', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a555574326ec46f7acf25d1e84b51425', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a61380ae2aac42f5b91af6b41ea21215', '', '18032288833', '4578', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a6ecc3eaa7524007b2880fc5c74ef2d4', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a6fefe02f64446cb855941af41aa67a9', '233dgh3@163.com', '15532163277', '8475', '', '', NULL, NULL, '8472', NULL, '', NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a715d3f5714c46eea6f50935a5968f3f', '', '13930160099', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a7b957c9525b44cbb0f7cb097e6786d2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('a9c54ea2d15d42a59a50e0260beb7e6a', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('aba32ba9db004261ab548e3d4be0b506', '', '15511668022', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('aba77d8c82e84642abe02526a378f431', '396105640@qq.com', '13503330837', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('ac37a0be81fb4e25a3ec6d370aeb59ec', '', '17798099491', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('ac6ff95774e8486a8cf49a8651676fc5', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('ae67c4a6b5f840ab8945e979ca3aa8c0', '', '13931874725', '4624', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('af2d89d248c4440ea5f83966337ebb8d', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b09b967714c2445d9646ffd8847afaaf', '', '13832391687', '4546', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b0ea8b581b2645e2957bfa4431929607', '', '13473971407', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b146eae053244eafb38ec2f6a2bf4075', '', '13930152088', '8526', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b170bb9d3e5c4a22a1d74bc652d47165', '', '17798091776', '8531', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b2995efaa0ca42b097896913834af331', '', '18931842372', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b2e2a2ccd8db4b5e937a126306f53d93', '', '13703397487', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b2f6bfa580d14b799ab2956d6c6e71a1', '', '13582178987', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b304903b0f0a451bb44685a898508369', '66369160@qq.com', '15932660183', '8794', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b3cd06296f044f1ab5e7fc730b64f5ce', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b41e827302054d49a2b6017ec45f186a', '', '13021887898', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b497ab9b01c74a93b6ee7f079a356070', '', '', '', '', '', NULL, NULL, '', NULL, 'http://10.55.148.39:8888/y10027/t.jpg', NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b5476fbcc39f43108da6d6896ce607b2', '', '15833977487', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('b7bb532db0e34631a34a61384f9c5b8e', '', '13582813096', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('bc2ca8f58ff845aab2fdd6560a0a3b34', '', '18831190639', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('be388be5d7994bf6a8a321f2c85328f3', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('be5eed01ec694ac1b72539887bec1235', 'Y11044@CETC54.com', '15031192529', '8560', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('beefed50d1fa4e258842b5e46acf136b', '', '13623312144', '4625', '', '', '', NULL, '测试', NULL, NULL, NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c024f0a1db424695811a33c00f5436ee', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c219eb3b489e49a5af65dbc7f42754c8', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c2649ae0bb9148f98c62f1a5b5f01652', '', '', '', '', '', '', NULL, '编辑个性签名', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c366b72c968b46f8b7d4592ff4535fbb', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c44689a1f02a41a5b40958c41cd12354', '', '13930162260', '8784', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c453b86641384536928cbdd3bb8d28fd', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c5bb8e6cdd44483bbda150ee48767c10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c737c65323c34f809ef527dc2d09eae1', '', '13903218854', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c73c51eea7a846249c111f1da4663707', NULL, '18032130026', '4101', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c876b1db8f4c46ed9269f5617b1f831a', '', '15130151623', '8526', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c90b3e7907094c3cb399f6270c5d3e2d', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('c918b6b3166141a6b95b457d12097001', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('cb403adab4a64e46832282b4ba2493a0', '', '18203116622', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('cbdf46b590834d6caf745338a29345f7', '', '13930149627', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('cc9f956277e64231bfbb6bdf1568b4d2', '', '13933073076', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('ce71b122485c4baab6c94138820ff8ac', '', '13673188888', '8784', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d020e7d106aa4ff2bb5f7742c0548fd6', '', '13373429690', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d072905f90904ad882af0465c061ea5f', '', '13630835923', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d1148ce1866a482b94885e36cff209f8', '', '15130156926', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d13b635568934d91b9a019e7b94a7cc8', '', '13730113971', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d1732f1b2c7744d8ad71702649d6713b', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d31aa2be282d4e578b01106563ec2fdc', '', '15531115855', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d32fc5be4abc4ba4a78e558457720f1d', '', '13931873533', '4625', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d4049848d5474e5cadc6398a5ac1887b', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d5c5415454c041eb8efbacdda1b3e170', '', '18133836871', '4477', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d69c39dc65b24904838f2e9f604f2feb', 'quca@cti.ac.cn', '18633495817', '86928558', '', '', NULL, NULL, '生命不止眼前的苟且,还有诗和远方的田野', NULL, 'http://10.55.148.39:8888/p12082/001.gif', NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d6deedb76ca2475e84bda50105852171', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d6f4cda74d444a1184de8a4b28dc19ff', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d709410eeef548b094432c9eb1deb433', '', '18651678916', '4963', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d72ca767bba44529a40901fa9a264b83', '', '13503205270', '8786', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d829117c300c4882888ce059fef71373', 'queshihenhaoji@163.com', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d8c3299891414920ac34ad80d8571aa3', '308695276@qq.com', '13833132920', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d9074901d5934613ae09ebb1835f3b1e', 'chengyingtao@gmail.com', '13393113705', '0311-86928472', '', '', '', NULL, '8472', NULL, '', NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('d9c9ee6f80ee444a885d733c4e68e952', '', '15932478081', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('da79e028e4e746c4a69b8d759d89c1af', '', '13803368066', '4455', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('dab0e15f4915474cabcb105cc4a1bb90', '', '13111500628', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('db7e500f67dc4ac2adb356974ef92309', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('dcae3f9a502846d48704ca53efa402e0', '', '18603262750', '8336', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('df138bd0e9284ed9b7117e0eaa1a4d27', '13503311357@126.com', '13503311357', '8525', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('df4b354ad6a143f0a1c86ad0f5cf8e51', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('dfe7792b24964e168d70a58499aba9cc', '', '13503335092', '8530', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e07451595e8740ff9e8928006a382895', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e0899eb126d2488b92bb59e80e897aec', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e1644e16aaa943f7b0c18174613bc08c', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e2b1245a95c041b4b650e215c1943bbe', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e343e533e6df4698bb18bb80d0ca7410', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e37515101bd340f2a5920840f1acfd0e', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e437aa3f7a324855a4ba66e251ff31d7', '', '13832346377', '8509', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e47162f0dee14b7b967f0b8e5e57c649', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e557263fefef4350ae585e6738402cb7', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e59a4c64fbd44fb89ab82a0c8331bba2', '123', '123', '123', '河北省石家庄市中山西路', '050081', NULL, NULL, 'sds', NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e6d0e46cea0847f79a9e3328bd4b1504', '18232129969@139.com', '18232129969', '8467', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e7b4ef5c6aa045a18a63b3f5dde08140', '', '13582325897', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e89dd0bd237b4e6eb9984581b0765e1d', '', '13582199392', '4578', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e8bf416fc9804a6abb39cbfe6c1698f7', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e9088f3abdb340409f55380f6a673475', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('e9688858640e4868b4dfdab1d3d30ec3', 'ywd64@163.com', '13513213188', '4081', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('eaf75d0763344e008f181426a2542873', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('eba152f716114424a37e5c8e11d8d995', '986165900@qq.com', '17732192893', '', '', '', '', NULL, '不说话', NULL, NULL, NULL, ''); +INSERT INTO `jcdp_sys_user_ext` VALUES ('ed93fa03c3b742ad8837a474d2218197', '', '13932188790', '4477', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('edf3e838b0fb49e2bcde0707fa255f2a', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f05f2405bf034eaaa4f94e160f91de8b', '', '13831106606', '3711', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f2e2329423e44966ae29d3fc8f3083ee', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f475e0eef09c4c1ba2c2b06f503ca4c2', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f4d6d95a49ad414eb567000b8dea9fe4', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f5c4fa8d664844ab964ea5381991a2ce', '396105640@qq.com', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f776853f84844e2f8d35039c43886d61', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f77ca757cbbd486b8a159788f20ba986', NULL, '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f7d3f7b9a7c046a38e02d035eae7835b', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('f7da92cf0aa044b88be724c6f6e85cca', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('fa213aafc1d44610bd4e7ff549e1cdf7', '', '13673182908', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('fa5507f1eeac49f091aa877a94244548', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('fb90ee122f6c47269d77942b56a4783c', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('fc8d6db364ff4e9c8e53c05d9698b699', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('fc974f2a79904981aa51588f400f1583', '', '13932156990', '4106', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('fe24c4ac34444902a2129ec1debf9ed4', '123', '123', '123', '河北省石家庄市中山西路', '050081', NULL, NULL, 'sds', NULL, 'http://localhost:8080/jcdp/WEB-INF\\uploadFiles/userAvatars/20180117100820_joos2.jpg', 'joos2.jpg', 'http://localhost:8080/jcdp/WEB-INF\\uploadFiles/userAvatars/20180117100820_joos2.jpg'); +INSERT INTO `jcdp_sys_user_ext` VALUES ('ffa8b735df944927ab7685e67b3b3e95', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `jcdp_sys_user_ext` VALUES ('ffcd6c7df3444a8f8b9eb2c6b8d80ca4', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- ---------------------------- +-- Table structure for jcdp_sys_user_module +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_user_module`; +CREATE TABLE `jcdp_sys_user_module` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户ID', + `ACTIONVALUE` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'Action权限值', + `ACTIONOP_JSON` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '扩展权限Json', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_user_module +-- ---------------------------- +INSERT INTO `jcdp_sys_user_module` VALUES ('41da290574684afe9f0d2cfb48c52595', '3930ab98da0a4e82aab1824823135576', 'sue55gimgu3gd8kwzox', '[{\"action\":\"/log/session/list\",\"value\":1}]'); +INSERT INTO `jcdp_sys_user_module` VALUES ('920408c7544e48ca813b4dbe8107a4aa', '1df48ce2f70e46a19eccb6b88b64a4bb', 'pz3m56tsfde022b5', '[]'); +INSERT INTO `jcdp_sys_user_module` VALUES ('df818920fda9413381425750ba6f2085', '5619c0acad764d84989e69bc5c57b461', '1b5g9iu7xdrtp2ztubmvyv65ookh', '[]'); + +-- ---------------------------- +-- Table structure for jcdp_sys_user_org +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_user_org`; +CREATE TABLE `jcdp_sys_user_org` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ORGID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `IS_DEFAULT_ORG` decimal(1, 0) NULL DEFAULT NULL COMMENT '是否为默认ORG', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_user_org +-- ---------------------------- +INSERT INTO `jcdp_sys_user_org` VALUES ('00306a5093f4405ab599a24976cab7e5', 'a6ecc3eaa7524007b2880fc5c74ef2d4', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('00649058a5224f2e9cbf9f01e9d0fa9d', '986d2627c90742f8aa78d8815cd5cab9', '8ae002b416a2485d8173a7b68414c0a8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('013b240e04384940bb432115b8cd18e6', '948dab550b93428096610e31eace1478', 'e2f603dda6c048359a70b759d4749648', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('01513990902c4e57af1111e26f406c95', '8d3fcea68419434786f412eb517888fd', '68edbd63311648968843f845d86affad', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('01a98b74037443b58d915c4bd1bf2020', '869474428b3e4408a1351e16978a37f8', '2a6bd512230c477399a8e8cf145d9d0c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('0218a3b497014f8f820f0122e6dbe85c', '5eaafabf2d4a4856999f9e684d327ead', '2a6bd512230c477399a8e8cf145d9d0c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('0401bb5278644c2e9dfc0143618cf72a', 'fc8d6db364ff4e9c8e53c05d9698b699', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('04219c446ca441dca7bdd66be59c6c31', '19adff3370f84af196cc73474e2a6d0c', '3d3c1b1a1fee459ca75abaae480cfe72', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('04336bafcc444906a514c6b954d973a4', 'c366b72c968b46f8b7d4592ff4535fbb', 'e2f603dda6c048359a70b759d4749648', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('04b07383bb0747de89c2ee48d27c1f45', '84d6e483e21b4027985203b26dedb769', 'f0cfdcea33f849cabc1b830dbd9f91bf', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('05620601f6294075b1e3b2aedf29bd12', 'c024f0a1db424695811a33c00f5436ee', 'e3ebd748b2f54cb2add12fcf229d40b7', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('05f62d78d36342448b5e37923111d28d', 'e8bf416fc9804a6abb39cbfe6c1698f7', '3d3c1b1a1fee459ca75abaae480cfe72', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('0ae1eb2e6426483aa407f8b4779b6604', '9c227190e0404d1ab84cb65dfddca512', 'fb27b413d03d4fc18eb714fc811268ab', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('0b62d581c4524f359a84c0f1ff37e709', '1aa9313e83bc42de93663528627243d3', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('0c5fae69bd184dcbba662bf2120d5e11', '83b9caffe40948618028f7ec4a95ad3a', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('0d0f8b79dab24a1096874439304b2785', '6f9333baa5db42d4911644a30833c0f6', '9e31f6f3535045989fad4f182ed7251d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('0d28fffd76a64c31aadc70669afa6b9f', 'e2b1245a95c041b4b650e215c1943bbe', '3d3c1b1a1fee459ca75abaae480cfe72', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('0ffbd733984e4af99c5d067cc7e74aa0', '4f412ec3e8fb41ef84c743fb8dd95f2c', '59402cbd3d564de69a6781670686c163', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('112e6630115546df95c932ddd7d2e9db', '9158ec943e6d49bb9c0df8b6c3666a28', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('14b657ad5d6b4698aed1752c6ee16ab8', 'd5c5415454c041eb8efbacdda1b3e170', 'a67a6394173c4a75a91b380e2bbdc882', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('14d73e52b8044f8c8959de1bc96f0892', 'd69c39dc65b24904838f2e9f604f2feb', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('15ef77cc16ee4c84a54ea9a3bb17c970', '3cbb96bb46294815a302d8e6793cde3b', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('176955854c704066b06ed7be04cf1b9b', '4d00aa9c7df84dac86e0e5aef5d34885', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('18d11899baed40f6b7666de2fb6c2db4', '2e22bd54a0fe4c40a140ab2d0e99f233', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('19717369ed6b43ddb30e2a0f3d4b7139', '037dfda4d5984a71b23bde0359dac140', 'e3ebd748b2f54cb2add12fcf229d40b7', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('19a2a87bc2504e36b3ef200e00cafc71', '30eac268f9b743d6b347dbfd8304cd70', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1a85da5487b142fe8c730e7438ff5ccb', '9ff2aa808d514934b0406495dff1fb50', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1aba110910414560a0a5dfd669e7eb92', '6c583d1f10a241ad90b0a11898a670ca', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1b6bc4d033ab438e81cd61b49b4fbff7', '9212486aec5346d396b182eca2043eb9', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1ba75ff98148462ab9d0652caf35c4ce', '57e5a30a134f47c0b76178ac345d5465', 'ca098c0b5c704403b9fe4038358d4a46', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1c501742d18b48d5910d7f0921c5aca7', '8f79a13cec6a4826a394237736828768', 'ff3ddb335f5949cc81037cc8158319e5', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1cfead7c9f7947c7b9878a61ac0bce97', '3916b39fbb2d449e9768b73a001a5ae2', 'a61c1ddeb3af411f8366f39757c57738', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1d55052bc1f14e12938c8e5015cc592c', '25f0fd10490349b9941f8325c1fc8488', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1d65535471224b06ad99db0b847b3e6f', 'a1836fd02e4041bf9e5f68dfa5614a8e', 'ebf9f22f742d4167833707dfa83c7418', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1dd8cdadfedb45b49321ab3da52fdadc', 'fb90ee122f6c47269d77942b56a4783c', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1ddba23ed23946a588310e2ea66b9418', '2d96e3863dc74b23878314d5eee59d9a', '24b09331aba242068c5d9abe64a5fbb1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1e029c06ebad4c4b9ae2ef3ac1ac369b', '541163ddcaec4751b6d6e86207cc48c1', '2a6bd512230c477399a8e8cf145d9d0c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1e54def8177e4d8a96c628c08981a7d9', '6d18ae59a8244307aa1ac210e3fc41d5', '84f53e6ffae74272bb9342f2a7bb83eb', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1e658e1fa9034a0285bb8308a85591ed', 'b09b967714c2445d9646ffd8847afaaf', 'c956703711334bc3ae405fd0fbe4cea1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('1ff234a8de9541f794f8bc8282ec7d57', '96cc863bca2c436a85cd52db7c1df9d7', '40d497304211449ab7ed7b56c2fe2d5b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2060a74d7d39417da34359e891de77c5', 'cbdf46b590834d6caf745338a29345f7', '34c58fd9c04044338fec6008988c1977', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('210cb62ed17f4b3ba6fe4b00893b4959', '3ea7ec4286744d628ebd00e6c9b779e9', 'ff3ddb335f5949cc81037cc8158319e5', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('219cb37af6b248aabb3068ef1ab1e4fd', '979808dea33d4ac5b18e5f280535db56', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('222890191ac54764a559cfa04311754b', 'dab0e15f4915474cabcb105cc4a1bb90', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('24c98dd101444fd692975bebd5d17d6a', '8fb6ef3a9fb243889e37884e6245928a', 'ca098c0b5c704403b9fe4038358d4a46', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('27371f0408f64fec80a6ed4ae8e39cc8', '959f8e645e3c45ec88edbc073b5b42dd', '24b09331aba242068c5d9abe64a5fbb1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('27c7bb6f1b014d9a9fece65d6209db27', 'e9088f3abdb340409f55380f6a673475', 'e2f603dda6c048359a70b759d4749648', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('292924c62ed74eb38d772c8b8ca34032', '15500c6b69df47e9a60fb42ebf7b467b', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2953aa8373614aa88d4928f2daaae20d', '606844d489f841939e330acdb5b2601e', '9e31f6f3535045989fad4f182ed7251d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2981239d66a94fdc921b6a94c56618c1', 'a6fefe02f64446cb855941af41aa67a9', '40d497304211449ab7ed7b56c2fe2d5b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2a8d99ed7d8d413fb63758499b574725', '675eadcb6ae64a548036a4ef986b64cc', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2d03daca595744189b4554269778965b', '9c4ec5025ba140808e9fe44f3cc848ff', '9859c597de5544e69973b6ff0c57013b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2dbe712b525441d09637ee546df45bfe', 'a413500114674efe89dad1c0043579af', 'e145d300aaf346e3a062014e29499f0d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2dc4230a899b45879d156cc49cdb312d', '43af99fb531d44e68a1bd20ff153aa69', '34c58fd9c04044338fec6008988c1977', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2df13432565646ba9e46c748b4581863', 'd829117c300c4882888ce059fef71373', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2e31b457603046748df02141ff994b46', '14a6ffda63e8453eb7e661c23a671ca6', '34c58fd9c04044338fec6008988c1977', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2e84967f7b1f4180bc09fe860f532119', 'df138bd0e9284ed9b7117e0eaa1a4d27', 'c956703711334bc3ae405fd0fbe4cea1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2efe49b983c3454ab22b24c336e8c8f1', '76da5a1769f6438cbd7580a4632de45e', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2faaf8a0f3164ad59c4f9e3e41e19420', '7b37646871b445189b446fd8ee369094', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('2fc047069a604785a3d3cb68e8538f9d', 'e47162f0dee14b7b967f0b8e5e57c649', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('310bdd34eda5437f8e93b9b79da31075', '65367901d2f144cb8a7fd93f4356c64f', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('31f94b72b36f4d5caf982201218c37b7', 'a715d3f5714c46eea6f50935a5968f3f', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3280f7fba6114ce6bec58e9b21d1fced', 'fa5507f1eeac49f091aa877a94244548', 'e2f603dda6c048359a70b759d4749648', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('329fe178732443529f6f61a33484eaa1', 'f475e0eef09c4c1ba2c2b06f503ca4c2', '3d3c1b1a1fee459ca75abaae480cfe72', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('341e1f8666c54c22b6cd8367c371ecdf', '928ff182e1594a74899d82144156af09', 'ebf9f22f742d4167833707dfa83c7418', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('34c4e148e4b349ab9e7bf3e28c01dee8', '3930ab98da0a4e82aab1824823135576', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('354af6e6f73d4079807cdda86623ad89', 'd9c9ee6f80ee444a885d733c4e68e952', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('362948e6c2b54361ac47828e1d5b135d', 'd1148ce1866a482b94885e36cff209f8', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('366b9174b9174ca8a1511b350c0cba09', '340fe94b0464472e88cc0fe7065170dc', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('36b87483cca445b7b582e365e2bbb420', '1cb2fb93db774202bdd2532fa57d9bff', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3788b6feeacf41d09a31bfe34aaf4b5f', 'e0899eb126d2488b92bb59e80e897aec', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3ab0aafee4e347e1820e59a2ef1d684f', '48e5269d5fb0450ab24708c9ba20aac9', '8ae002b416a2485d8173a7b68414c0a8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3b56ab25c6db4f63baeebcf969aa2ef3', '61f00a225f644f37bf83c0673ea81845', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3b6c74ff37954864ba0a7e594c60caa1', 'd31aa2be282d4e578b01106563ec2fdc', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3bc2c4c37c1c40bb84dc50ce14d002d0', '28fb5f2bc277490ab8d3b8dabebb2c0e', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3c4cb1ba0e9a4574a7295068076e59d0', '71950c802ebe45859170eb8fc67a7c76', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3c686c2e1aa548c099c816b03ffe9d61', '3f29e5b0069f4dca982a7af45fcc7946', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3dbdfa4b8c3a4969a01999a03e2ae12d', 'ed93fa03c3b742ad8837a474d2218197', 'a67a6394173c4a75a91b380e2bbdc882', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3e402fe97e4449f4bbb0356d4a452204', '8180b37adc664b72a571d6e4001602fe', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('3e6119d86b574f7b88d229a7d3368bd5', 'c5bb8e6cdd44483bbda150ee48767c10', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4021f5d67c934e47a5b4a1939f0f1fe9', 'ffcd6c7df3444a8f8b9eb2c6b8d80ca4', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('40831a8efb0f4b82beee7898fb5dbda1', '9e7c4e8d04d54d63b4db362be239babd', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('418a111211714fc08029304602146761', '3a089a897e294c67829ca12ef72a4d03', 'e2f603dda6c048359a70b759d4749648', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('41923222912d451eb89460dd46da3e20', '0dbcd8427607493281ff3e4a6ae68cf2', 'e3ebd748b2f54cb2add12fcf229d40b7', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4318cb6927fc4a53be72f9066b7ccae0', '42903568050447b08e9967dbd291506c', '88cbf0f1aae14e5c813e5062d611f20c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('43c116e3d673434c9f1b931c3840d957', '5baafe72ad534503bb27e43860a1b4cb', '34c58fd9c04044338fec6008988c1977', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('444bdd530e2048aaa2879dc93d4c3e48', 'd709410eeef548b094432c9eb1deb433', 'a61c1ddeb3af411f8366f39757c57738', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('46137880d8504af09ada8420ebe722cf', 'd6f4cda74d444a1184de8a4b28dc19ff', '9859c597de5544e69973b6ff0c57013b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('463a4eaf87074b54a3342b374aba1e5c', 'e9688858640e4868b4dfdab1d3d30ec3', '24b09331aba242068c5d9abe64a5fbb1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('47964322d82a4d358a3ae8bd8d39ee82', '2d83ceb498df4e77b290a6edf9a37021', 'cdbf0aa146cf46c6b6b6b289d125d357', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('486714ebe54140fb8ba0c60f9b38dd6f', '87b8438ee06b403f9fa476679df9dc15', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('48ecd1ca6b0c4911935a39e63af87409', 'a61380ae2aac42f5b91af6b41ea21215', '84f53e6ffae74272bb9342f2a7bb83eb', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('49638531784440a1a4a3b1cbacdb8bfc', 'bc2ca8f58ff845aab2fdd6560a0a3b34', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('49d2e244eeee4a83b53320d465c7bacb', 'f4d6d95a49ad414eb567000b8dea9fe4', '53ededeca0f54b719b517f39f10fcac8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('49ede34d619a42be9ce99ee828488bea', '97d45832f7df41089b2b11da5534e36c', 'fb27b413d03d4fc18eb714fc811268ab', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4a359c2db71b4dad9d8ee1f069d56a07', 'b41e827302054d49a2b6017ec45f186a', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4a68c96efd634a8ba0a31c720d47a84b', '94fe339e071e4979a89fa29265507eed', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4c9943ca560f446d907947cdc80c45c1', '1eac9b5fdd784b00b1e2037e8d8d6a22', '056d928db141405fb73b7bd635dcbdf1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4ddc32f7eaaa4e7d851dcbdb5d838ff2', '17cd6f91e3f948778a23909248a6ef2a', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4e31fb556dd34bc0a506e15e0bb02b30', '80c7c582c2674022878e838a459145d4', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4e63e1ebd26748a4b32bb673743797a2', '1db1801a29f344b780f018cbffc9b3f1', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4fac1ae221b74da1a7a2ffbecd21439b', '63229c9686214b1ea1c133f9abf4cb4d', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('4fdf9ae3dbbd48e5bb30043b7127b282', '83bedd208c9a46eda1ce4e47705b3b73', '40d497304211449ab7ed7b56c2fe2d5b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('50027c7d19fa4d3c817512d15a14875a', '03b37ba8d14a45cdae3100eacaec52a9', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('50aae66cd0ba43fc92b1c141f2ec955c', '7dcd4e266b8147ee8bf0195fcec6f6be', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('51c686db1ab544ee9205d2c2df96e4f7', '40153ec910b345a7b5176d6297f29c03', '88cbf0f1aae14e5c813e5062d611f20c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('53c7e176c9254e7bbe0e116ee4d24381', 'fa213aafc1d44610bd4e7ff549e1cdf7', '056d928db141405fb73b7bd635dcbdf1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('546dacb7167844a5a70df6b97e8530ac', '532a80316d0141e0990f123b0068317c', '24b09331aba242068c5d9abe64a5fbb1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('557b2db8787546de929c833ed27c1695', 'df4b354ad6a143f0a1c86ad0f5cf8e51', '3d3c1b1a1fee459ca75abaae480cfe72', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('55968867f46949879446739c2fd4e7fe', 'b5476fbcc39f43108da6d6896ce607b2', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('561662b31a724f87b39a95321701e627', '5cbf662ecc09469e9060f2f20eb9309b', 'e0d83701ce704a938cb7f063d9d7e6d2', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('56243f870c5342dda43223ada764f49e', '8a80a7acc3824e15be6a6ed1f94689a7', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('56339510971b4e6d867178388930f76d', '1c85d30bff54420c9878247ff54867e0', '3d3c1b1a1fee459ca75abaae480cfe72', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5699519d8b444fe5a4f37f84dcb97fb5', '7e2c277885da44e5b253ca57f775ee94', '5f49d06f887b48af8cfd40f3195c67f1', 0); +INSERT INTO `jcdp_sys_user_org` VALUES ('578b5c737e0c4853adfc9b60886476d4', '84ac0ac6d4464f73a11f7e5405041cd4', 'fb27b413d03d4fc18eb714fc811268ab', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('57b0138fa62e481086efd730f3e44ef5', 'd1732f1b2c7744d8ad71702649d6713b', 'e0d83701ce704a938cb7f063d9d7e6d2', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('59d59dee7e0b40118e661e5f0a199c04', 'e89dd0bd237b4e6eb9984581b0765e1d', '84f53e6ffae74272bb9342f2a7bb83eb', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5ad7974564b0456fae3e250e97e6a61e', '05daab960ff8450d9cbe84cd3c7dd260', 'fd0760fc51274080a3f073aa9dda715b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5b679fc5514e48e18eef939b2f89adf5', '6d8f2916ccc044c3957e2ff4cafbf98b', 'a67a6394173c4a75a91b380e2bbdc882', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5b68f4d3d30b46dcbb6fe4a0873b5309', 'd072905f90904ad882af0465c061ea5f', 'ca098c0b5c704403b9fe4038358d4a46', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5bd963237b0c4d88a9580f7959962c40', '298ff55340ff47b188c9766f75eb159b', '2a6bd512230c477399a8e8cf145d9d0c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5cc53e4698814701870c1af5c00510d2', '08392ef87499474a82a8954c7ced7390', '8ae002b416a2485d8173a7b68414c0a8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5eccfb5accf84563a145039289a7aab5', '539a551045944c28a9945d0f6cc550c2', 'e0d83701ce704a938cb7f063d9d7e6d2', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5f443133d9c54a9590ff20b502cec9ff', '9e1161a94836445bbdbf6ddc6516af6a', 'e3ebd748b2f54cb2add12fcf229d40b7', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('5fa20cad756f4c6eb2787b4de211c3e7', '5fa4285cfc9e4f5d975c979814a5dbec', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6239dd347b6643dfb2951bc71578ff07', '200c68d821984e73a4b6e1b86eedaabe', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6338e2881b804f928fe3cf81dcee51e8', '6d74ae8842b74e239efd63bb95f053e3', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('63b4265b7dc7444b82f8ced737b975c0', '82a04b4689d84862be5c4b600b099fc1', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('63b70f52c88241838f30896ac5431769', 'a9c54ea2d15d42a59a50e0260beb7e6a', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('641142e1fc5d4229986dc7b540693a3d', '1dce74df53b44ecfbe89edc802914bf8', 'fb27b413d03d4fc18eb714fc811268ab', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6600b08de6d74754b66f379d89f40904', 'e7b4ef5c6aa045a18a63b3f5dde08140', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6611040761cd4b989abcdd4cf6276170', '720cb5a0c9b04aad85ecce4731055bee', '24b09331aba242068c5d9abe64a5fbb1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('663f1fd6e1924c2887321afb8c2d16d3', '602751b6aefd48b38b1bd07e9fa64f31', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('665199284f5b462db7e47f650ebe109b', 'ac6ff95774e8486a8cf49a8651676fc5', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6688c02fd98a42f294f9d226075413a1', '52fd81d5f3c641b9b3e3c058efee0357', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('67406ca047ee4bb9b09bc4d84d82ff95', 'b2e2a2ccd8db4b5e937a126306f53d93', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6ab7055f516a49a9ab188690e3bcf775', '97d009ed87664304a713241fffb5b47e', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6cc768a8c1884e0fbb7b763076dccb67', '082538db933e477598aa3e87ec2b21e8', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6e995529c3c84bc5b058f72fcb691a83', '561fa58b43ec443f8420e9637e4d38c0', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('6f91d007facd47279963725a75830b0f', 'ae67c4a6b5f840ab8945e979ca3aa8c0', '88cbf0f1aae14e5c813e5062d611f20c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7179aac558514bf69fa17480d591a84f', '79c16ac130bb410eb98d521ed14c2a2f', 'e0d83701ce704a938cb7f063d9d7e6d2', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('722bec87f0a1413992e5004043961190', 'e343e533e6df4698bb18bb80d0ca7410', 'root', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('73887acc01e9426aae768c964de8e1ad', '9d211f337d3d4dd2b614b6032ab350fb', 'ebf9f22f742d4167833707dfa83c7418', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('73adfc521e094babbe7143a4665c8765', 'd020e7d106aa4ff2bb5f7742c0548fd6', '056d928db141405fb73b7bd635dcbdf1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('74742eaafc1044a5b271b3ff7162aba4', 'e59a4c64fbd44fb89ab82a0c8331bba2', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('748093ec614344e0928cc1ff18e5c985', 'ffa8b735df944927ab7685e67b3b3e95', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('751a28739b424922aed5542dcc7738c8', 'c918b6b3166141a6b95b457d12097001', '24b09331aba242068c5d9abe64a5fbb1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('75d1404ec487465d8cc22b8571225339', 'c737c65323c34f809ef527dc2d09eae1', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('76204c68280143a1a663741f0a003817', 'b3cd06296f044f1ab5e7fc730b64f5ce', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('767c77c283174514b6cc961e95996fc1', '66486ff6f3db4d38a07f17717f23f12c', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('77671f19e9384924ab5eeba6bb5037f0', '545b2a2ca2a04583b6dc0dddc8c8ab29', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('785da4e3dcce47ef931de929c577b84e', 'e07451595e8740ff9e8928006a382895', '53ededeca0f54b719b517f39f10fcac8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('78e51af5846e40ac812449c00f9773d6', '33382ef814e849b4a761a576455ef907', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7904fefded0a488ca771bfaeee1edca0', 'c44689a1f02a41a5b40958c41cd12354', '59402cbd3d564de69a6781670686c163', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7bdc793c322d4e71a74893ad6022197c', '5114bbde00c24617841113ed12908114', 'a67a6394173c4a75a91b380e2bbdc882', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7c826e3b92d04e389403d588db35f93f', '18a377035a944468a62b11caf31f9d72', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7d0a02e3bf4d4530bf08cc09dccad915', '43ba14c407114632ba0d396e3c9b5c2a', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7d35d97156cf49719f3d335de6d6217b', '097879d75fc54dc285aff704d8734a21', '8b5cba8e51f74397b7b23361dbe5b0fd', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7e3450ee6bab4fa5a8088b324fb46cf0', '84337ce99ca24ba886bad2cc59f048b9', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7f026074e3054d93a8a6d2f8a1102781', '664afc7c3f924e669ae697a932594531', '9e31f6f3535045989fad4f182ed7251d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7f02ae2e9d0144b3ad7bae4641bcc827', '0526d560648a43998b846f42e85baa2d', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7f0807b6695c4f88a23ff009cd10b3b4', '342911785e9f4c5eb5ed96c13a495fb1', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7f373c063e154d848732b128d8e03db6', '18b6c5584638426683267b6fd4cd78b2', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('7f96818fe80045f9b2909be11844879a', 'cb403adab4a64e46832282b4ba2493a0', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('809c510b21e54819b4c837ed80fb195f', '521d08563ab74b8188599be180575bcb', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('8203ae6946824ae1a5b8d98251b314bd', 'af2d89d248c4440ea5f83966337ebb8d', '53ededeca0f54b719b517f39f10fcac8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('8210b181a3dd4873b961d33fcea371c2', '53fc929cf08947c393d6a132b71c8c59', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('82a854e799ec41569b3159eb7cd93f8f', 'b146eae053244eafb38ec2f6a2bf4075', '68edbd63311648968843f845d86affad', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('82bb1e40a21d48b8a95498d46ebef308', '5676921ac94b4633a614892676567bfb', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('83bc9b1212ad42f0adb570a3d2812c33', '219b6fbea83345e7b810a402c41f8df1', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('849ef4aa0456472dbdebea488383724c', '07b75922b82149ab899bee340a47970a', 'fb27b413d03d4fc18eb714fc811268ab', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('85581bac21a74b68ab8678fcffc4ab96', '98a2763769f9479ea6092c100a000202', 'a67a6394173c4a75a91b380e2bbdc882', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('8648e62a0098421685aed06bcb8b6371', 'b304903b0f0a451bb44685a898508369', 'a39fe42cea154b0380ef0e733846cb81', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('86b1ee362b9b4ae7acdff8cb86880bd6', '1427218e39e144eea7aecc6d1a85e3df', '34c58fd9c04044338fec6008988c1977', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('86d607aa079746b9909d9e672862b412', '597971047f3541dc94171b6f5d114c29', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('87005565bd254dde89ad203073c452bf', '7ca89aa7ac7747b8ba498307b426de48', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('87fb6c37afb04f7cb8a4cf36b4bc0ffe', '5f822f0ca21a4b43bcd4a04dc9faa902', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('881558cc102a4464a3bf173e82e8a621', '5dd57a31f31d44f1875035ee6b9582e2', '34c58fd9c04044338fec6008988c1977', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('883dbdf21de54334a5d386f51e07422d', '46b8e24c27ee44b899dff5f6b00cbc26', '88cbf0f1aae14e5c813e5062d611f20c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('88a70ef9cf2c4f58a0169d27f4a8b55f', '6e40a2254a86454ba9a69a4a4b1d44d6', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('8932ad39bd654b36ac9687eb81bb288a', 'b2f6bfa580d14b799ab2956d6c6e71a1', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('89dbead4a66c46719dc65e1650d39e97', '8c491f940f844e6f8bf23fb874177cb5', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('89e99bbf8f66496e95ded538f177a653', '482984ac4e1f4226b2a48c781266a150', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('89f8105aaaeb49bc82e9132bfe2a4d5a', '81f3563afdee4cffb07ddf27d0538cfb', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('8bbf72ffb0d04d03b66362df97702ea9', 'beefed50d1fa4e258842b5e46acf136b', 'b20a642c3f00409daa21ea67b33d21bc', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('8d7529600c184b159ce5ed5cd2ae1a85', '378892771606469ebe86c370b3c4f8eb', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('8eda6d55f70d4b4cb9b835ef8062701c', '2867095e1fb14f37ae3d801c75c4eee3', 'b20a642c3f00409daa21ea67b33d21bc', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('8f1300303b9b464d956c7642d0056089', 'f2e2329423e44966ae29d3fc8f3083ee', '53ededeca0f54b719b517f39f10fcac8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('90432e7fdce343f8b9f9894d52acbec6', '6e3931a0a8794f30bae7e63b86259643', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('9070f677f27e452194208ca7997ecf1f', 'd72ca767bba44529a40901fa9a264b83', 'b20a642c3f00409daa21ea67b33d21bc', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('911b0f2e42834321adcd6bad82cd0503', '8778b7b776c242f98b6ad46087adb2e4', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('919d543e9e004fb1b548bd5d0b07a9fa', 'a7b957c9525b44cbb0f7cb097e6786d2', '2a6bd512230c477399a8e8cf145d9d0c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('9296f674ad6f42be9337cbbf991f00a7', '4b0adf9a1ca244b985b51b732e8b58a6', 'e2f603dda6c048359a70b759d4749648', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('930603c374b9493c950a0365eac83c8e', '248b0fb582e546ff88ec325ee26fc535', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('931c7fb5dab24708b70e6282df30f524', 'f05f2405bf034eaaa4f94e160f91de8b', 'b20a642c3f00409daa21ea67b33d21bc', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('937f9e5e0ec44702b5e155db54427abb', '8b42a3b49bcc4464ae7e076ff75a1cd5', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('95342a4234fa411383aecc8f9ccdc335', '068768e1eb764837bc4d98f0216b94e7', 'cdbf0aa146cf46c6b6b6b289d125d357', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('9605f7075e044cf291cb1d9b194603c1', '5e0b157de9ae4c2495f3918e7625431a', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('964a190f65ae43a294e63c875406957f', '77f0e9ced74e438783a96cbdab22c1ec', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('9690be3e53584380a45d6ab8cad7c44f', '920c7fb30bd44be8bd4581e7882f6dfd', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('97b9ac905289410da778bb7b7831384e', '90334c20002644a4be3ac0125d97784a', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('995c952e5299481487cba1a73ee8e720', '0980b8836368476297e98155c859f632', '8ae002b416a2485d8173a7b68414c0a8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('9a7a11c9e32d4d33bebedaf28db4a0f8', '7fa657de2e134704b1e62b5581343656', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('9b1d4b847a154201988a8a50d1d3d3fe', '94ec3b277d104816933ac089423b5bbf', '544a21a31a654c22bc8cc91c8dc0e220', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('a2cd34579e4448da9d8a9a71d9a18b64', 'ac37a0be81fb4e25a3ec6d370aeb59ec', '056d928db141405fb73b7bd635dcbdf1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('a421a5dc403145ea94d850b3dbf4bcef', '44e2c6b6eef64c48997ad59fc6428e10', 'cdbf0aa146cf46c6b6b6b289d125d357', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('a523bb445eee444fbb7c24d66a171fd3', '7e2c277885da44e5b253ca57f775ee94', 'a39fe42cea154b0380ef0e733846cb81', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('a6b5ff9ee8f949feae3e301874d6e4ae', '0bf7f79407994e7b8eb08aece0dda10f', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('a73e8db75a5f4c9dbe05980f5999b284', 'dcae3f9a502846d48704ca53efa402e0', '88cbf0f1aae14e5c813e5062d611f20c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('a8b668ec164a4978b9cbbfc5d6e14452', '7b2f37d2eac24ee990972baefd7dda4f', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('a908a4edb3b240bbb19f18c26981070a', 'd13b635568934d91b9a019e7b94a7cc8', '34c58fd9c04044338fec6008988c1977', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('aa14b9e58eb14d9ea512d94c06756d17', 'cc9f956277e64231bfbb6bdf1568b4d2', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('abc700bb05c84a1b981ef4998e643a6b', '2ba55257e6884d52b6a8220f2f782733', 'e2f603dda6c048359a70b759d4749648', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('abeae7aff9454d23bb078248dae7b85e', '8527c0ae4cba4e6ba511442194cdcdfa', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('ad5c7d5799444d8c8fc0af182dfc2898', '3260d140b17744e5b4ecb80ac658d300', '9e31f6f3535045989fad4f182ed7251d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('ae08f559eed449a6adf48b5374c57d9a', 'be5eed01ec694ac1b72539887bec1235', 'e0d83701ce704a938cb7f063d9d7e6d2', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('aefea614d47649f5badb5e5edebe9e28', '5b0037df0e3b4bfaa89c36d74e5c7a81', '53ededeca0f54b719b517f39f10fcac8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('af091421c65b4fb781ad692530d59970', '988c90d28f124c029544716f0f6f0c8f', '9cab7973526d4d7bad31a06158ed850c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('af32ecb2bcd0418ab03bc534bf7fa827', '9f6637e1501e445ba660b9c93685c5e7', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b0902cb3037142b69ac4a2bff5f8a873', 'b497ab9b01c74a93b6ee7f079a356070', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b138fab007dd4b3d9e42981cd0636b9a', 'e557263fefef4350ae585e6738402cb7', '544a21a31a654c22bc8cc91c8dc0e220', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b2a559e807b9416fb462a1b408f7212a', '37be4e7e24564c5e9f0afdf76975c6e0', 'ff3ddb335f5949cc81037cc8158319e5', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b2aa695226064fa08a4083bab8efc887', '8fe110723d5b48bfb7ae79bc98e4317d', 'e3ebd748b2f54cb2add12fcf229d40b7', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b2c24ff44e8443cbbf3ae55a3b3fb9b3', '52bd5b59504c4cceb8b397654bc647a6', 'a67a6394173c4a75a91b380e2bbdc882', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b2ca042d4f1e4913b520867dfdf4c35c', 'c453b86641384536928cbdd3bb8d28fd', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b4a0f5280d924c4f90d2cd1e0c04a6d8', '256a9ff4c8f24612ad68a65a0db8f973', 'a61c1ddeb3af411f8366f39757c57738', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b549931189bd4ed09fbc0aafd235302c', 'f77ca757cbbd486b8a159788f20ba986', '73de1d1caeec4087a7da00f288e27527', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b573fd0f66a94a61aeb30e370c46e7b8', 'dfe7792b24964e168d70a58499aba9cc', 'e145d300aaf346e3a062014e29499f0d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b63ef0749e3c481e8fa54a5e062b688e', '44d905a1dcd94399a4804082166ff54d', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b790c2b1197f4c0a96810f994fc898d2', '21f9e4d6815848999f53f468997b00b9', 'ebf9f22f742d4167833707dfa83c7418', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b8727cd7e2414483bda7f74d0bfc0307', 'fe24c4ac34444902a2129ec1debf9ed4', '23bbc6c7403740119b17d8d8cd5d3d41', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b8e7067366a74f74b716b9f3a1ed2b6f', '82bb85dfa7dc4330893ac38fda2ae74d', '9e31f6f3535045989fad4f182ed7251d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b9672535d6dc4cb1a936d7963c685bf4', '07c1963549914dac88e8ba6092ba3393', 'e0d83701ce704a938cb7f063d9d7e6d2', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('b97a2310a58145d3bcb277a933a09a8d', '7cd8b8f56966432b9541285bfc797555', '9859c597de5544e69973b6ff0c57013b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('ba2ba6d0621a4d8f8c59ce4a66f87956', '77b130a7a09b4409a198c688fbad7e68', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('bab9a4c2893c49448555130149b29ee5', 'b0ea8b581b2645e2957bfa4431929607', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('bac06641c4534c3ca63047002ea7afc2', '1e89fb25e0734ae1bf339efdac68c85f', 'c956703711334bc3ae405fd0fbe4cea1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('badb236358d84765bf9b5128c6e1007a', '1df48ce2f70e46a19eccb6b88b64a4bb', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('bb2955b3a9b749948f3ef97f9ecddfba', '4d4183bb9d3a42e5870fbc58c1022e75', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('bbd789fc036d4d13a02459828d3e6d8f', '4f2eac222b164c338c6913a8e96bc7d5', 'cdbf0aa146cf46c6b6b6b289d125d357', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('bd3351f6418e476190c26dc097fe5d02', '169e0e9038cd4d3d8c0bb7bb1a890dd3', '8ae002b416a2485d8173a7b68414c0a8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('be6ffee3a0984a3a8c958b5a5af705c8', '7f288bfcbbb44390a92daf5712088d17', '34c58fd9c04044338fec6008988c1977', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('bee3c0501fdf4c87a92d557be1c51d58', 'aba77d8c82e84642abe02526a378f431', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('bfc1c0d96fa34340b46940496d259a25', 'eba152f716114424a37e5c8e11d8d995', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('bfd467697e6e46ce86cb5bd9a6a4edc5', 'e6d0e46cea0847f79a9e3328bd4b1504', 'e0d83701ce704a938cb7f063d9d7e6d2', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c17520625db14ebea4f86f74e6ff851f', 'd4049848d5474e5cadc6398a5ac1887b', 'e3ebd748b2f54cb2add12fcf229d40b7', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c1b6437901164c0b8588ad3ce9233752', '8b78be4bc56d46fba2ff5150e739b4b9', '53ededeca0f54b719b517f39f10fcac8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c1ce0ea26b634927b5a3054b053bd2d8', '3d30a7e3e08b4ca59a4783197b809a79', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c2c8d3a7cb8044a99db687f0be1aa7fe', 'db7e500f67dc4ac2adb356974ef92309', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c323783822554d738e9b7c6b90b937ec', '109e2fea45ed4d4e8d377dafddb43fcd', '40d497304211449ab7ed7b56c2fe2d5b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c32e9787b0a1494fbdc6c33bd96a3531', '4b789c8f37a840fd865a486c72fea11d', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c3339a5b848d4266bad67c8d33e3b6ec', '9a8a0a0b27754a73962c221ee73d2c43', '544a21a31a654c22bc8cc91c8dc0e220', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c48ca997998f4fd88963777e442891bf', 'f7da92cf0aa044b88be724c6f6e85cca', 'root', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c588ab0c265f4f3185896f585c8e5489', 'a34e39f40e2044aeb66f0330f5ed75ea', '2a6bd512230c477399a8e8cf145d9d0c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c7883e584ff5496fa10bbc917198155c', 'c2649ae0bb9148f98c62f1a5b5f01652', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c798d7e31c7d4cf99f98b59eaa2235a8', 'f776853f84844e2f8d35039c43886d61', '9e31f6f3535045989fad4f182ed7251d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c7bbdb1bf62d43df9bda082333be44fc', 'e1644e16aaa943f7b0c18174613bc08c', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c97391365986470b8f4c9a2ec276141f', 'b2995efaa0ca42b097896913834af331', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c98468fa6a7e4b9696a22eb124223beb', 'c90b3e7907094c3cb399f6270c5d3e2d', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('c9c80bcd66c44e8db1f6dce366d84719', '32a36e78b5fd44649ae1b9b4a3b174e3', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('ca761ef988864adda04706a61e53872c', '295c09c5e4074f0e9ebd2dc5cc463667', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('cd45c25209464b01a24666fc4c995c2f', '5cc8029e3d9e46cc83e434b412b72b52', 'a61c1ddeb3af411f8366f39757c57738', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('cd81a3cdf9844239918c4b47a28d8c3b', '1cacf210910640a58c2f3fe190122711', '3d3c1b1a1fee459ca75abaae480cfe72', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('ce0bd9f4b8ee45e8bc83cc7edeb724c5', '81da281af6944739a40802460762eff3', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('ce91ea04576d4308b2cb92142396e4f7', 'e37515101bd340f2a5920840f1acfd0e', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('cf16209baede4ebc8f9f8a2e569246ac', '2e25ac5da040436088cafb6f29cd8e8f', '544a21a31a654c22bc8cc91c8dc0e220', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d05160f181494bcb89799a1d6649fedd', '9e8760cffee345d9ad44c9f4c65becc4', '8b5cba8e51f74397b7b23361dbe5b0fd', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d06d65b4121840e786eccc4dc2df6418', '4374c25a897842d08d2b0ae653eb6344', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d078d91c230b4adc962fa08e3fe59a24', '37c330f585a5411db6958ec3d034032f', 'a61c1ddeb3af411f8366f39757c57738', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d21a47aaa23c4313b03edbe2efb5e7da', 'be388be5d7994bf6a8a321f2c85328f3', 'fb27b413d03d4fc18eb714fc811268ab', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d246d676225148e5bada75934eddbe77', '045802b3d88d4c998b3757a65d0149b7', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d2696e79c65849bd8747ed7be942ea6f', 'd32fc5be4abc4ba4a78e558457720f1d', 'b20a642c3f00409daa21ea67b33d21bc', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d29816b7d6b64d4084eab3765f0da354', 'fc974f2a79904981aa51588f400f1583', 'ba19d8195c2b4056ba7314064d4603af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d2a1396dd10e4641bf5434ecb0cded53', '1ca20f3aacd64aa595d51489838fed03', '84f53e6ffae74272bb9342f2a7bb83eb', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d3bbd9fbb8734e40bbbf6c89951296a5', '46b350b728e64cab9af6594d31c36f0e', '570a92184f7a4045b05eeb10dcef7103', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d3c0f1f8abaf4ae89c9623b4c95e593e', '4ebe0869262f4407871646184af75fd6', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d4b10db6c9774e40b2f553182dc52639', 'ce71b122485c4baab6c94138820ff8ac', '59402cbd3d564de69a6781670686c163', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d59fb6e46cc7430ead9d39078b94f2a0', 'da79e028e4e746c4a69b8d759d89c1af', 'a67a6394173c4a75a91b380e2bbdc882', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d5a1fa818ece49a8b0641ffbbfa83746', '5f632069a0164b479e53f093ee83c0d6', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d5a6029eb1644f028925657c7f46f9f3', '7ab800df83fe439c840bf14658c30543', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d6e7ddc3650f43a7a2c65175df15d987', '4d616085794541b1a12ea3dbef6c41bf', 'ff3ddb335f5949cc81037cc8158319e5', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d77a33117a1f4985a7c81455fc86041b', 'a555574326ec46f7acf25d1e84b51425', '53ededeca0f54b719b517f39f10fcac8', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d81d746002cb482393757224431c71ad', '22c61d3c9fd04fa18803c8ce98bb0cd9', 'e3ebd748b2f54cb2add12fcf229d40b7', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d8a658ada52e46d181df4ce02d9cbb8b', '4b26ac8b7aee4a02bc8c8548a4affa6e', 'ca098c0b5c704403b9fe4038358d4a46', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d94caa33667145c6915c52edd808db36', '0c75b6943be44c0c94c58d474b798431', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d9d1303ef78f4b388951e651e8c6c87a', '2230bf8c4d5146608aa6399080c1f8c4', '73de1d1caeec4087a7da00f288e27527', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('d9e03956f3134781bd61ac72c43de36e', '5619c0acad764d84989e69bc5c57b461', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('da5116847b6c4b0babdecfb4829ef6b6', 'c73c51eea7a846249c111f1da4663707', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('dac65ab179994678a68f46a704e02942', '7828fb0827dd4ab08481600b66492c3e', 'e145d300aaf346e3a062014e29499f0d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('dae94ddb7b0b4f0d8e6b1d3556b8a889', 'f7d3f7b9a7c046a38e02d035eae7835b', 'bd0fed43a10b4b0d80ea6ac7711172c9', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('db94ee91227b46bdb150d4937d5795aa', 'eaf75d0763344e008f181426a2542873', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('dd7d42b7c75c410e86361ea9105fbb3d', '1a2b2892052641a6b656e79216433ba9', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('dde079ee3abe4abe8b648bbf199ce1e6', '44e74bb07b4b4fceb9ba9ed135ea5e7d', '97647359d99c4282b501ff21a2b8e07c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('df87b8c108a646deb3d2b74431679fc2', 'd9074901d5934613ae09ebb1835f3b1e', '40d497304211449ab7ed7b56c2fe2d5b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('dfefe1639b7b4f0bb220660d5827f33a', 'c876b1db8f4c46ed9269f5617b1f831a', '68edbd63311648968843f845d86affad', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e0af65a1b65647aaa105f741eff18215', '7cef8587cddc4f03a1e7176e0a8ee340', '40d497304211449ab7ed7b56c2fe2d5b', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e1226e23a7f344e39ac20029b32cd486', 'e437aa3f7a324855a4ba66e251ff31d7', '84f53e6ffae74272bb9342f2a7bb83eb', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e1f9b8b5c63a4231867eb2023e3c9a97', '02c73f13986a4926ae2df7835eade578', '056d928db141405fb73b7bd635dcbdf1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e2facda6c47e4831bae46a5f912f21e6', 'a4e32bfdbeb249e9b9ba0ac23cd4b481', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e2ff3123848c4e6d90280b77f3cb776f', '211dd03b8a304b57a77d457d6beae1f9', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e36b7d0374314865906f651c0620a185', 'b7bb532db0e34631a34a61384f9c5b8e', '4eaabee195fb48daab6547fd75479583', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e4ea4d589dd14babaeb575cd378070cf', '09f0e91f6a61479889570ef76bfdac96', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e5de80e6b7d94e50a2e758ea852b70d9', '1384281140ca4b219bf98ee235f3aba1', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e7108020257e455da375f94624657b4a', '480eabb80700486185121285d855541d', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e7832842ea474277b6fbdbd2684e8342', '93c2a1ec4940431caab0eb93fc079b12', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e89de7d4b757450291fc0a8c90062f4a', '0ce0a3ff742745cca27435b4384abb31', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('e9da68d4cfee41909bc5a8383fb86309', '8d228913013c464a8a5018ec42e6f0f5', 'ec0a8a5204b847ab8a8125f7249c7bce', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('eaa97a4b03cb4efabe069221719e344b', '9d68b5cbf62b4a6fbf394e5bed9daff5', 'a61c1ddeb3af411f8366f39757c57738', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('eb3046f4587741d8a34c0fca00996376', 'edf3e838b0fb49e2bcde0707fa255f2a', 'bde6afaf2bae4cb0aa6f3816c60f06f6', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('ecb9fd0247e24278bcb60777a4914d8f', '2947b126a1714adba1b3666cf3b015c5', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('edc6d472a78a4390b3df2a831900f4f3', '6a26f0722eaf42df86d7c27a62e7b02d', '2a6bd512230c477399a8e8cf145d9d0c', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('efbe8d61a9fc4be196ef9d9aa83cb92a', '882581da99a3447187c073271f763b30', '1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('f2561bf19996405e84676dd588b691f8', 'd6deedb76ca2475e84bda50105852171', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('f2b4b7c7255449adbbb376fa90cb9b3d', '8293a6507d974027bcd8a54a5b90abb5', '61375f93a5044ec8a1560ee4cddda4ca', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('f41289fbcffe47f19477179de2c610be', '1d8094115f5c4c6ab8c38c414a65d6f4', '5f49d06f887b48af8cfd40f3195c67f1', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('f48585ec90604e3d8504a02eb404cc2c', 'f5c4fa8d664844ab964ea5381991a2ce', '69e48e5a606a420188cc2d06df2f94af', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('f57ef8d5629740b09b7a925cf2806c46', 'd8c3299891414920ac34ad80d8571aa3', '96f6400cb8c44f69af01ae24ddb94441', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('f5d8ecf4dba94018bb88fdf389f64386', 'b170bb9d3e5c4a22a1d74bc652d47165', 'e145d300aaf346e3a062014e29499f0d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('f632de1176af4c93865407189ecf1257', '2798eeaa5ed445749f80f71ef202cffa', '1647c07823b14295915ecd6f08d4b78e', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('f9cd94806bce44549a6294aec5f93a96', '8708083ae3d14e80867604d47e5d215d', 'root', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('fc5b3411f0d44f00b0bdfa61c55b33dc', 'aba32ba9db004261ab548e3d4be0b506', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('fcc1542c235841cdb0c4d995b6726278', '83bb22a54cc4492e8fa3043a21a001ec', '0c749f875b684957a119e11f3175f0ee', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('fd4f4a950e104e2d9f9fd70085d65cc3', 'c219eb3b489e49a5af65dbc7f42754c8', '9e31f6f3535045989fad4f182ed7251d', 1); +INSERT INTO `jcdp_sys_user_org` VALUES ('ffdba4a50a5844eca8c829c20893e8cf', '5b6c06080d5a4b86b9673fd373011ae4', '4eaabee195fb48daab6547fd75479583', 1); + +-- ---------------------------- +-- Table structure for jcdp_sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_sys_user_role`; +CREATE TABLE `jcdp_sys_user_role` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `USERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ROLEID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `ROLETYPE` decimal(1, 0) NULL DEFAULT NULL COMMENT '角色类型', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_sys_user_role +-- ---------------------------- +INSERT INTO `jcdp_sys_user_role` VALUES ('6a35fa6f1a584bf4b03ded7d1003b084', '2798eeaa5ed445749f80f71ef202cffa', '2e7dc18e84a142b6883fad9142087f16', 0); +INSERT INTO `jcdp_sys_user_role` VALUES ('8c74f99b66504cc1ac796b67cbfd783f', '32a36e78b5fd44649ae1b9b4a3b174e3', '6c72a8da1fe246e9a92c2185b5317630', 0); +INSERT INTO `jcdp_sys_user_role` VALUES ('a8b819b4aeaa4a88891f81ed56b5303e', '44d905a1dcd94399a4804082166ff54d', 'fb52cfd860864f018bd1b19d24e941d1', 0); +INSERT INTO `jcdp_sys_user_role` VALUES ('b16f0ef145b74601a6ffc601b6ff6ad4', '5619c0acad764d84989e69bc5c57b461', 'fb52cfd860864f018bd1b19d24e941d1', 0); +INSERT INTO `jcdp_sys_user_role` VALUES ('c2000eddc7ef47eb865f8324b39c26f0', '1df48ce2f70e46a19eccb6b88b64a4bb', 'fb52cfd860864f018bd1b19d24e941d1', 0); + +-- ---------------------------- +-- Table structure for jcdp_task_list +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_task_list`; +CREATE TABLE `jcdp_task_list` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `APPLYERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '申请人ID', + `APPLYERCODE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '申请人编码', + `APPLYTIME` datetime(0) NULL DEFAULT NULL COMMENT '申请时间', + `APPLYTITLE` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务标题', + `APPLYLINK` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务链接', + `ISFINISH` int(1) NULL DEFAULT NULL COMMENT '是否完成', + `FINISHTIME` datetime(0) NULL DEFAULT NULL COMMENT '完成时间', + `TASKSTATUS` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务状态', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_task_list +-- ---------------------------- +INSERT INTO `jcdp_task_list` VALUES ('0980b8836368476297e98155c859f632', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '2017-06-01 11:18:31', '请假申请', 'log/session', 0, NULL, '组长审批'); +INSERT INTO `jcdp_task_list` VALUES ('3a089a897e294c67829ca12ef72a4d03', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '2016-02-01 11:18:31', '休假申请', 'log/session', 0, NULL, '领导审批'); +INSERT INTO `jcdp_task_list` VALUES ('594c3cc2741a484fb91b2ea5f11d44a7', '3930ab98da0a4e82aab1824823135576', 'w0101', '2017-08-22 15:15:12', '请假申请', '/vacate/index', 0, NULL, NULL); +INSERT INTO `jcdp_task_list` VALUES ('720cb5a0c9b04aad85ecce4731055bee', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '2017-06-01 11:18:31', '出差申请', 'log/session', 0, NULL, '组长审批'); +INSERT INTO `jcdp_task_list` VALUES ('76da5a1769f6438cbd7580a4632de45e', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '2017-07-26 11:18:31', '出差申请', 'log/session', 1, '2017-07-27 10:15:03', '领导审批'); +INSERT INTO `jcdp_task_list` VALUES ('77f0e9ced74e438783a96cbdab22c1ec', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '2016-02-01 11:18:31', '请假申请', 'log/session', 0, NULL, '组长审批'); +INSERT INTO `jcdp_task_list` VALUES ('79c16ac130bb410eb98d521ed14c2a2f', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '2017-07-26 11:18:31', '出差申请', 'log/session', 1, '2017-07-27 10:15:03', '领导审批'); +INSERT INTO `jcdp_task_list` VALUES ('7b2f37d2eac24ee990972baefd7dda4f', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '2016-02-01 11:18:31', '请假申请', 'log/session', 0, NULL, '组长审批组长审批'); +INSERT INTO `jcdp_task_list` VALUES ('7cd8b8f56966432b9541285bfc797555', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '2017-07-26 11:18:31', '出差申请', 'log/session', 1, '2017-07-27 10:15:03', '领导审批'); +INSERT INTO `jcdp_task_list` VALUES ('959f8e645e3c45ec88edbc073b5b42dd', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '2016-02-01 11:18:31', '出差申请', 'log/session', 0, NULL, '组长审批'); +INSERT INTO `jcdp_task_list` VALUES ('9e8760cffee345d9ad44c9f4c65becc4', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '2017-06-01 11:18:31', '休假申请', 'log/session', 0, NULL, '领导审批'); +INSERT INTO `jcdp_task_list` VALUES ('bdf9cf12a6114c12b1ada3453dd8ca74', '3930ab98da0a4e82aab1824823135576', 'w0101', '2017-08-22 15:14:29', '请假申请', '/vacate/index', 0, NULL, NULL); +INSERT INTO `jcdp_task_list` VALUES ('c918b6b3166141a6b95b457d12097001', '1df48ce2f70e46a19eccb6b88b64a4bb', 'Y08066', '2017-06-01 11:18:31', '请假申请', 'log/session', 0, NULL, '组长审批'); +INSERT INTO `jcdp_task_list` VALUES ('e3e23021b78343bea98893f1b0f69ebb', '3930ab98da0a4e82aab1824823135576', 'w0101', '2017-08-22 15:15:52', '请假申请', '/vacate/index', 0, NULL, NULL); +INSERT INTO `jcdp_task_list` VALUES ('e9088f3abdb340409f55380f6a673475', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '2017-07-26 11:18:31', '出差申请', 'log/session', 1, '2017-07-27 10:15:03', '领导审批'); +INSERT INTO `jcdp_task_list` VALUES ('f2e2329423e44966ae29d3fc8f3083ee', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '2016-02-01 11:18:31', '请假申请', 'log/session', 0, NULL, '组长审批'); + +-- ---------------------------- +-- Table structure for jcdp_task_operlist +-- ---------------------------- +DROP TABLE IF EXISTS `jcdp_task_operlist`; +CREATE TABLE `jcdp_task_operlist` ( + `ID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '唯一标识', + `TASKID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务ID', + `TASKUSERID` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务执行人ID', + `TASKUSERCODE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '任务执行人编码', + `TASKSTATUS` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '所属状态', + `ISFINISH` int(1) NULL DEFAULT NULL COMMENT '是否完成', + `FINISHTIME` datetime(0) NULL DEFAULT NULL COMMENT '完成时间', + PRIMARY KEY (`ID`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of jcdp_task_operlist +-- ---------------------------- +INSERT INTO `jcdp_task_operlist` VALUES ('211dd03b8a304b57a77d457d6beae1f9', 'f2e2329423e44966ae29d3fc8f3083ee', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '组长审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('22c61d3c9fd04fa18803c8ce98bb0cd9', '0980b8836368476297e98155c859f632', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '组长审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('2d96e3863dc74b23878314d5eee59d9', '959f8e645e3c45ec88edbc073b5b42dd', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '组长审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('2d96e3863dc74b23878314d5eee59d9a', '3a089a897e294c67829ca12ef72a4d03', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '领导审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('76da5a1769f6438cbd7580a4632de45e', '76da5a1769f6438cbd7580a4632de45e', '5619c0acad764d84989e69bc5c57b461', 'Y10047', '组长审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('77f0e9ced74e438783a96cbdab22c1ec', '7b2f37d2eac24ee990972baefd7dda4f', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '组长审批组长审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('79c16ac130bb410eb98d521ed14c2a2', '7b2f37d2eac24ee990972baefd7dda4f', '76da5a1769f6438cbd7580a4632de45e', 'Y02049', '组长审批组长审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('79c16ac130bb410eb98d521ed14c2a2f', '720cb5a0c9b04aad85ecce4731055bee', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '组长审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('7b2f37d2eac24ee990972baefd7dda4f', '7b2f37d2eac24ee990972baefd7dda4f', '77f0e9ced74e438783a96cbdab22c1ec', 'W06404', '组长审批组长审批', 1, '2017-07-28 11:46:41'); +INSERT INTO `jcdp_task_operlist` VALUES ('7cd8b8f56966432b9541285bfc797555', '7cd8b8f56966432b9541285bfc797555', '79c16ac130bb410eb98d521ed14c2a2f', 'W06058', '组长审批', 0, NULL); +INSERT INTO `jcdp_task_operlist` VALUES ('82a04b4689d84862be5c4b600b099fc1', '9e8760cffee345d9ad44c9f4c65becc4', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '组长审批', 1, '2017-07-26 15:54:24'); +INSERT INTO `jcdp_task_operlist` VALUES ('a7b957c9525b44cbb0f7cb097e6786d2', 'c918b6b3166141a6b95b457d12097001', '5619c0acad764d84989e69bc5c57b461', 'Y10047', '组长审批', 1, '2017-07-26 15:54:27'); +INSERT INTO `jcdp_task_operlist` VALUES ('f475e0eef09c4c1ba2c2b06f503ca4c2', 'e9088f3abdb340409f55380f6a673475', 'fe24c4ac34444902a2129ec1debf9ed4', 'Y08066', '组长审批', 1, '2017-07-26 15:54:30'); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/WEB-INF/classes/ens.properties b/WEB-INF/classes/ens.properties new file mode 100644 index 0000000..34861ab --- /dev/null +++ b/WEB-INF/classes/ens.properties @@ -0,0 +1,36 @@ +#\u95E8\u6237\u4F1A\u8BDD\u540C\u6B65\u9875\u9762\u5730\u5740 +ens.login.url = http://localhost:19624/login.aspx +#ens.login.url = http://10.55.68.235:11235/ENS/login.aspx + +#\u5355\u70B9\u767B\u5F55\u65F6pk\u9A8C\u8BC1\u670D\u52A1\u5730\u5740 +ens.pk.url = http://localhost:19624/Service/SsoPassKeyValidateService.asmx +#ens.pk.url = http://10.55.68.235:11235/ENS/Service/SsoPassKeyValidateService.asmx + + +#\u83B7\u53D6\u7528\u6237\u76F8\u5173\u4FE1\u606F +#ens.baseservice.url = http://10.55.24.64:9999/dist/cxf/base?wsdl +ens.baseservice.url = http://localhost:16058/Service.asmx +#ens.baseservice.url = http://10.55.68.235:11235/BaseService/Service.asmx + +#\u83B7\u53D6\u6743\u9650\u76F8\u5173\u4FE1\u606F +#ens.powerservice.url = http://10.55.24.64:9999/dist/cxf/power?wsdl +ens.powerservice.url = http://localhost:8671/Service/PowerBasicService.asmx +#ens.powerservice.url = http://10.55.68.235:11235/EAIpower/Service/PowerBasicService.asmx + + +#\u83B7\u53D6applicationname\u76F8\u5173\u4FE1\u606F +applicationname = ETMS + +##\u95E8\u6237\u4F1A\u8BDD\u540C\u6B65\u9875\u9762\u5730\u5740 +#ens.login.url = http://10.55.68.242:8300/Ens/login.aspx +# +##\u5355\u70B9\u767B\u5F55\u65F6pk\u9A8C\u8BC1\u670D\u52A1\u5730\u5740 +#ens.pk.url = http://10.55.68.242:8300/Ens/Service/SsoPassKeyValidateService.asmx +# +# +##\u83B7\u53D6\u7528\u6237\u76F8\u5173\u4FE1\u606F +#ens.baseservice.url = http://10.55.68.242:8300/BaseService/Service.asmx +# +# +##\u83B7\u53D6\u6743\u9650\u76F8\u5173\u4FE1\u606F +#ens.powerservice.url = http://10.55.68.242:8300/EAIPower/Service/PowerBasicService.asmx diff --git a/WEB-INF/classes/jcdp.properties b/WEB-INF/classes/jcdp.properties new file mode 100644 index 0000000..35d4990 --- /dev/null +++ b/WEB-INF/classes/jcdp.properties @@ -0,0 +1,42 @@ +#\uFFFD\uFFFD\uFFFD\u077F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD +ormMappingPath=/WEB-INF/mapping +prefix.[dbtype,url,username,password,poolConfig...] + +jcdp.db.dbtype=mysql +jcdp.db.username=root +jcdp.db.password=root +jcdp.db.poolConfig=config/dbPool.properties +jcdp.db.url=jdbc:mysql://10.55.68.235:3306/etms?useSSL=false&useUnicode=true&characterEncoding=utf-8 +#jcdp.db.url=jdbc:mysql://10.55.12.83:3306/etms?useSSL=false&useUnicode=true&characterEncoding=utf-8 + + +#jcdp.db.url=jdbc:mysql://localhost:3306/etms?useSSL=false&useUnicode=true&characterEncoding=utf-8 +#jcdp.db.url=jdbc:mysql://10.55.68.234:3306/etms?useSSL=false&useUnicode=true&characterEncoding=utf-8 +#jcdp.db.url=jdbc:mysql://10.55.68.235:3306/etms20240611?useSSL=false&useUnicode=true&characterEncoding=utf-8 +#jcdp.db.url=jdbc:mysql://10.55.12.83:3306/etms?useSSL=false&useUnicode=true&characterEncoding=utf-8 + + +#jcdp.db.url=jdbc:mysql://172.19.68.188:3306/etms +#jcdp.db.url=jdbc:mysql://localhost:3306/etms?useSSL=false&useUnicode=true&characterEncoding=utf-8 + + +#app\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD + +#JCDP\uFFFD\uFFFD\uFFFD\u0437\uFFFD\u02BD\uFFFD\uFFFDdebug-\uFFFD\uFFFD\uFFFD\uFFFD\u0123\u02BD\uFFFD\uFFFDrelease-\uFFFD\uFFFD\uFFFD\uFFFD\u0123\u02BD +jcdp.runMode=release + +#\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD;\uFFFD\uFFFD\uFFFD\u05B8\uFFFD +mvc.controllerBasePackage=com.cetc54.jcdp.web.controller +mvc.viewBasePath=/ + +#Spring \uFFFD\uFFFD\uFFFD\uFFFD +spring.profiles.active=default + +etms.serviceName=\u6559\u80B2\u57F9\u8BAD\u7BA1\u7406\u7CFB\u7EDF + +sems.serviceUrl=http://10.55.12.172:6666/FSTHLWebService.asmx + +logging.file.path=myLog + +#\uFFFD\uFFFD\uFFFD\uFFFD\u6C7E\uFFFD\uFFFD54 34 +software.version=54 \ No newline at end of file diff --git a/WEB-INF/classes/lib/jcdp-ens-1.1.jar b/WEB-INF/classes/lib/jcdp-ens-1.1.jar new file mode 100644 index 0000000..fc27caf Binary files /dev/null and b/WEB-INF/classes/lib/jcdp-ens-1.1.jar differ diff --git a/WEB-INF/classes/powerconfig/34/ETMS.BusinessType.xml b/WEB-INF/classes/powerconfig/34/ETMS.BusinessType.xml new file mode 100644 index 0000000..7c46e3d --- /dev/null +++ b/WEB-INF/classes/powerconfig/34/ETMS.BusinessType.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/classes/powerconfig/34/ETMS.PageList.xml b/WEB-INF/classes/powerconfig/34/ETMS.PageList.xml new file mode 100644 index 0000000..93a9e67 --- /dev/null +++ b/WEB-INF/classes/powerconfig/34/ETMS.PageList.xml @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/classes/powerconfig/34/ETMS.PermissionList.xml b/WEB-INF/classes/powerconfig/34/ETMS.PermissionList.xml new file mode 100644 index 0000000..6f79be0 --- /dev/null +++ b/WEB-INF/classes/powerconfig/34/ETMS.PermissionList.xml @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/lib/Excel4J-3.0.0-Alpha.jar b/WEB-INF/lib/Excel4J-3.0.0-Alpha.jar new file mode 100644 index 0000000..4dcc67c Binary files /dev/null and b/WEB-INF/lib/Excel4J-3.0.0-Alpha.jar differ diff --git a/WEB-INF/lib/activation-1.1.jar b/WEB-INF/lib/activation-1.1.jar new file mode 100644 index 0000000..53f82a1 Binary files /dev/null and b/WEB-INF/lib/activation-1.1.jar differ diff --git a/WEB-INF/lib/amqp-client-5.1.1.jar b/WEB-INF/lib/amqp-client-5.1.1.jar new file mode 100644 index 0000000..ee558e5 Binary files /dev/null and b/WEB-INF/lib/amqp-client-5.1.1.jar differ diff --git a/WEB-INF/lib/aopalliance-1.0.jar b/WEB-INF/lib/aopalliance-1.0.jar new file mode 100644 index 0000000..578b1a0 Binary files /dev/null and b/WEB-INF/lib/aopalliance-1.0.jar differ diff --git a/WEB-INF/lib/asm-5.0.4.jar b/WEB-INF/lib/asm-5.0.4.jar new file mode 100644 index 0000000..cdb283d Binary files /dev/null and b/WEB-INF/lib/asm-5.0.4.jar differ diff --git a/WEB-INF/lib/aspectjweaver-1.8.9.jar b/WEB-INF/lib/aspectjweaver-1.8.9.jar new file mode 100644 index 0000000..87f5c8f Binary files /dev/null and b/WEB-INF/lib/aspectjweaver-1.8.9.jar differ diff --git a/WEB-INF/lib/cglib-nodep-2.2.jar b/WEB-INF/lib/cglib-nodep-2.2.jar new file mode 100644 index 0000000..ed07cb5 Binary files /dev/null and b/WEB-INF/lib/cglib-nodep-2.2.jar differ diff --git a/WEB-INF/lib/com.cetc54.mvc-1.1.jar b/WEB-INF/lib/com.cetc54.mvc-1.1.jar new file mode 100644 index 0000000..6947436 Binary files /dev/null and b/WEB-INF/lib/com.cetc54.mvc-1.1.jar differ diff --git a/WEB-INF/lib/com.cetc54.orm-1.0.jar b/WEB-INF/lib/com.cetc54.orm-1.0.jar new file mode 100644 index 0000000..9ce7789 Binary files /dev/null and b/WEB-INF/lib/com.cetc54.orm-1.0.jar differ diff --git a/WEB-INF/lib/com.cetc54.util-1.2.jar b/WEB-INF/lib/com.cetc54.util-1.2.jar new file mode 100644 index 0000000..f2256db Binary files /dev/null and b/WEB-INF/lib/com.cetc54.util-1.2.jar differ diff --git a/WEB-INF/lib/commons-codec-1.10.jar b/WEB-INF/lib/commons-codec-1.10.jar new file mode 100644 index 0000000..1d7417c Binary files /dev/null and b/WEB-INF/lib/commons-codec-1.10.jar differ diff --git a/WEB-INF/lib/commons-codec-1.9.jar b/WEB-INF/lib/commons-codec-1.9.jar new file mode 100644 index 0000000..ef35f1c Binary files /dev/null and b/WEB-INF/lib/commons-codec-1.9.jar differ diff --git a/WEB-INF/lib/commons-collections-3.2.1.jar b/WEB-INF/lib/commons-collections-3.2.1.jar new file mode 100644 index 0000000..c35fa1f Binary files /dev/null and b/WEB-INF/lib/commons-collections-3.2.1.jar differ diff --git a/WEB-INF/lib/commons-collections4-4.1.jar b/WEB-INF/lib/commons-collections4-4.1.jar new file mode 100644 index 0000000..43a9413 Binary files /dev/null and b/WEB-INF/lib/commons-collections4-4.1.jar differ diff --git a/WEB-INF/lib/commons-discovery-0.2.jar b/WEB-INF/lib/commons-discovery-0.2.jar new file mode 100644 index 0000000..b885548 Binary files /dev/null and b/WEB-INF/lib/commons-discovery-0.2.jar differ diff --git a/WEB-INF/lib/commons-fileupload-1.3.1.jar b/WEB-INF/lib/commons-fileupload-1.3.1.jar new file mode 100644 index 0000000..af0cda2 Binary files /dev/null and b/WEB-INF/lib/commons-fileupload-1.3.1.jar differ diff --git a/WEB-INF/lib/commons-httpclient-3.1.jar b/WEB-INF/lib/commons-httpclient-3.1.jar new file mode 100644 index 0000000..7c59774 Binary files /dev/null and b/WEB-INF/lib/commons-httpclient-3.1.jar differ diff --git a/WEB-INF/lib/commons-io-2.2.jar b/WEB-INF/lib/commons-io-2.2.jar new file mode 100644 index 0000000..84ca565 Binary files /dev/null and b/WEB-INF/lib/commons-io-2.2.jar differ diff --git a/WEB-INF/lib/commons-io-2.5.jar b/WEB-INF/lib/commons-io-2.5.jar new file mode 100644 index 0000000..107b061 Binary files /dev/null and b/WEB-INF/lib/commons-io-2.5.jar differ diff --git a/WEB-INF/lib/commons-lang3-3.1.jar b/WEB-INF/lib/commons-lang3-3.1.jar new file mode 100644 index 0000000..a85e539 Binary files /dev/null and b/WEB-INF/lib/commons-lang3-3.1.jar differ diff --git a/WEB-INF/lib/commons-logging-1.2.jar b/WEB-INF/lib/commons-logging-1.2.jar new file mode 100644 index 0000000..93a3b9f Binary files /dev/null and b/WEB-INF/lib/commons-logging-1.2.jar differ diff --git a/WEB-INF/lib/curvesapi-1.04.jar b/WEB-INF/lib/curvesapi-1.04.jar new file mode 100644 index 0000000..f097d0b Binary files /dev/null and b/WEB-INF/lib/curvesapi-1.04.jar differ diff --git a/WEB-INF/lib/cxf-core-3.1.7.jar b/WEB-INF/lib/cxf-core-3.1.7.jar new file mode 100644 index 0000000..c65007e Binary files /dev/null and b/WEB-INF/lib/cxf-core-3.1.7.jar differ diff --git a/WEB-INF/lib/cxf-rt-bindings-soap-3.1.7.jar b/WEB-INF/lib/cxf-rt-bindings-soap-3.1.7.jar new file mode 100644 index 0000000..2d07ba3 Binary files /dev/null and b/WEB-INF/lib/cxf-rt-bindings-soap-3.1.7.jar differ diff --git a/WEB-INF/lib/cxf-rt-bindings-xml-3.1.7.jar b/WEB-INF/lib/cxf-rt-bindings-xml-3.1.7.jar new file mode 100644 index 0000000..993e884 Binary files /dev/null and b/WEB-INF/lib/cxf-rt-bindings-xml-3.1.7.jar differ diff --git a/WEB-INF/lib/cxf-rt-databinding-jaxb-3.1.7.jar b/WEB-INF/lib/cxf-rt-databinding-jaxb-3.1.7.jar new file mode 100644 index 0000000..11656f6 Binary files /dev/null and b/WEB-INF/lib/cxf-rt-databinding-jaxb-3.1.7.jar differ diff --git a/WEB-INF/lib/cxf-rt-frontend-jaxws-3.1.7.jar b/WEB-INF/lib/cxf-rt-frontend-jaxws-3.1.7.jar new file mode 100644 index 0000000..c88db4e Binary files /dev/null and b/WEB-INF/lib/cxf-rt-frontend-jaxws-3.1.7.jar differ diff --git a/WEB-INF/lib/cxf-rt-frontend-simple-3.1.7.jar b/WEB-INF/lib/cxf-rt-frontend-simple-3.1.7.jar new file mode 100644 index 0000000..774a94c Binary files /dev/null and b/WEB-INF/lib/cxf-rt-frontend-simple-3.1.7.jar differ diff --git a/WEB-INF/lib/cxf-rt-transports-http-3.1.7.jar b/WEB-INF/lib/cxf-rt-transports-http-3.1.7.jar new file mode 100644 index 0000000..84bd15f Binary files /dev/null and b/WEB-INF/lib/cxf-rt-transports-http-3.1.7.jar differ diff --git a/WEB-INF/lib/cxf-rt-ws-addr-3.1.7.jar b/WEB-INF/lib/cxf-rt-ws-addr-3.1.7.jar new file mode 100644 index 0000000..4e12337 Binary files /dev/null and b/WEB-INF/lib/cxf-rt-ws-addr-3.1.7.jar differ diff --git a/WEB-INF/lib/cxf-rt-ws-policy-3.0.2.jar b/WEB-INF/lib/cxf-rt-ws-policy-3.0.2.jar new file mode 100644 index 0000000..9ca1b84 Binary files /dev/null and b/WEB-INF/lib/cxf-rt-ws-policy-3.0.2.jar differ diff --git a/WEB-INF/lib/cxf-rt-wsdl-3.1.7.jar b/WEB-INF/lib/cxf-rt-wsdl-3.1.7.jar new file mode 100644 index 0000000..17433da Binary files /dev/null and b/WEB-INF/lib/cxf-rt-wsdl-3.1.7.jar differ diff --git a/WEB-INF/lib/dom4j-1.6.1.jar b/WEB-INF/lib/dom4j-1.6.1.jar new file mode 100644 index 0000000..c8c4dbb Binary files /dev/null and b/WEB-INF/lib/dom4j-1.6.1.jar differ diff --git a/WEB-INF/lib/druid-1.1.1.jar b/WEB-INF/lib/druid-1.1.1.jar new file mode 100644 index 0000000..1de77f6 Binary files /dev/null and b/WEB-INF/lib/druid-1.1.1.jar differ diff --git a/WEB-INF/lib/education-exam-api-1.0.jar b/WEB-INF/lib/education-exam-api-1.0.jar new file mode 100644 index 0000000..165f4f6 Binary files /dev/null and b/WEB-INF/lib/education-exam-api-1.0.jar differ diff --git a/WEB-INF/lib/education-groups-api-1.0.jar b/WEB-INF/lib/education-groups-api-1.0.jar new file mode 100644 index 0000000..3949589 Binary files /dev/null and b/WEB-INF/lib/education-groups-api-1.0.jar differ diff --git a/WEB-INF/lib/education-qualification-api-1.0.jar b/WEB-INF/lib/education-qualification-api-1.0.jar new file mode 100644 index 0000000..264e060 Binary files /dev/null and b/WEB-INF/lib/education-qualification-api-1.0.jar differ diff --git a/WEB-INF/lib/education-resource-api-1.0.jar b/WEB-INF/lib/education-resource-api-1.0.jar new file mode 100644 index 0000000..ed52b11 Binary files /dev/null and b/WEB-INF/lib/education-resource-api-1.0.jar differ diff --git a/WEB-INF/lib/education-train-api-1.0.jar b/WEB-INF/lib/education-train-api-1.0.jar new file mode 100644 index 0000000..af94fd9 Binary files /dev/null and b/WEB-INF/lib/education-train-api-1.0.jar differ diff --git a/WEB-INF/lib/fastjson-1.1.40.jar b/WEB-INF/lib/fastjson-1.1.40.jar new file mode 100644 index 0000000..5e099b9 Binary files /dev/null and b/WEB-INF/lib/fastjson-1.1.40.jar differ diff --git a/WEB-INF/lib/fr-chart-8.0.jar b/WEB-INF/lib/fr-chart-8.0.jar new file mode 100644 index 0000000..b8195a6 Binary files /dev/null and b/WEB-INF/lib/fr-chart-8.0.jar differ diff --git a/WEB-INF/lib/fr-core-8.0.jar b/WEB-INF/lib/fr-core-8.0.jar new file mode 100644 index 0000000..e31710b Binary files /dev/null and b/WEB-INF/lib/fr-core-8.0.jar differ diff --git a/WEB-INF/lib/fr-performance-8.0.jar b/WEB-INF/lib/fr-performance-8.0.jar new file mode 100644 index 0000000..ae48753 Binary files /dev/null and b/WEB-INF/lib/fr-performance-8.0.jar differ diff --git a/WEB-INF/lib/fr-platform-8.0.jar b/WEB-INF/lib/fr-platform-8.0.jar new file mode 100644 index 0000000..90cbc59 Binary files /dev/null and b/WEB-INF/lib/fr-platform-8.0.jar differ diff --git a/WEB-INF/lib/fr-report-8.0.jar b/WEB-INF/lib/fr-report-8.0.jar new file mode 100644 index 0000000..4702a27 Binary files /dev/null and b/WEB-INF/lib/fr-report-8.0.jar differ diff --git a/WEB-INF/lib/fr-third-8.0.jar b/WEB-INF/lib/fr-third-8.0.jar new file mode 100644 index 0000000..8064ca0 Binary files /dev/null and b/WEB-INF/lib/fr-third-8.0.jar differ diff --git a/WEB-INF/lib/freemarker-2.3.19.jar b/WEB-INF/lib/freemarker-2.3.19.jar new file mode 100644 index 0000000..b13671d Binary files /dev/null and b/WEB-INF/lib/freemarker-2.3.19.jar differ diff --git a/WEB-INF/lib/hamcrest-all-1.3.jar b/WEB-INF/lib/hamcrest-all-1.3.jar new file mode 100644 index 0000000..6f62ba0 Binary files /dev/null and b/WEB-INF/lib/hamcrest-all-1.3.jar differ diff --git a/WEB-INF/lib/hamcrest-core-1.3.jar b/WEB-INF/lib/hamcrest-core-1.3.jar new file mode 100644 index 0000000..9d5fe16 Binary files /dev/null and b/WEB-INF/lib/hamcrest-core-1.3.jar differ diff --git a/WEB-INF/lib/javax.servlet.jsp-api-2.3.1.jar b/WEB-INF/lib/javax.servlet.jsp-api-2.3.1.jar new file mode 100644 index 0000000..7451620 Binary files /dev/null and b/WEB-INF/lib/javax.servlet.jsp-api-2.3.1.jar differ diff --git a/WEB-INF/lib/jaxb-core-2.2.11.jar b/WEB-INF/lib/jaxb-core-2.2.11.jar new file mode 100644 index 0000000..f3c8412 Binary files /dev/null and b/WEB-INF/lib/jaxb-core-2.2.11.jar differ diff --git a/WEB-INF/lib/jaxb-impl-2.2.11.jar b/WEB-INF/lib/jaxb-impl-2.2.11.jar new file mode 100644 index 0000000..a5c5b23 Binary files /dev/null and b/WEB-INF/lib/jaxb-impl-2.2.11.jar differ diff --git a/WEB-INF/lib/jcdp-chat-1.0.jar b/WEB-INF/lib/jcdp-chat-1.0.jar new file mode 100644 index 0000000..61fe9af Binary files /dev/null and b/WEB-INF/lib/jcdp-chat-1.0.jar differ diff --git a/WEB-INF/lib/jcdp-chat-api-1.0.jar b/WEB-INF/lib/jcdp-chat-api-1.0.jar new file mode 100644 index 0000000..93b55f5 Binary files /dev/null and b/WEB-INF/lib/jcdp-chat-api-1.0.jar differ diff --git a/WEB-INF/lib/jcdp-core-1.1.jar b/WEB-INF/lib/jcdp-core-1.1.jar new file mode 100644 index 0000000..1976dd1 Binary files /dev/null and b/WEB-INF/lib/jcdp-core-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-ens-1.2.jar b/WEB-INF/lib/jcdp-ens-1.2.jar new file mode 100644 index 0000000..abb05dc Binary files /dev/null and b/WEB-INF/lib/jcdp-ens-1.2.jar differ diff --git a/WEB-INF/lib/jcdp-ens-1.4.jar b/WEB-INF/lib/jcdp-ens-1.4.jar new file mode 100644 index 0000000..712a7c4 Binary files /dev/null and b/WEB-INF/lib/jcdp-ens-1.4.jar differ diff --git a/WEB-INF/lib/jcdp-web-1.1.jar b/WEB-INF/lib/jcdp-web-1.1.jar new file mode 100644 index 0000000..64b2f35 Binary files /dev/null and b/WEB-INF/lib/jcdp-web-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-web-module-1.1.jar b/WEB-INF/lib/jcdp-web-module-1.1.jar new file mode 100644 index 0000000..4754240 Binary files /dev/null and b/WEB-INF/lib/jcdp-web-module-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-web-module-api-1.1.jar b/WEB-INF/lib/jcdp-web-module-api-1.1.jar new file mode 100644 index 0000000..488d66d Binary files /dev/null and b/WEB-INF/lib/jcdp-web-module-api-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-web-parameter-1.1.jar b/WEB-INF/lib/jcdp-web-parameter-1.1.jar new file mode 100644 index 0000000..12694b0 Binary files /dev/null and b/WEB-INF/lib/jcdp-web-parameter-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-web-parameter-api-1.1.jar b/WEB-INF/lib/jcdp-web-parameter-api-1.1.jar new file mode 100644 index 0000000..01cbe28 Binary files /dev/null and b/WEB-INF/lib/jcdp-web-parameter-api-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-web-sys-1.1.jar b/WEB-INF/lib/jcdp-web-sys-1.1.jar new file mode 100644 index 0000000..9c183e1 Binary files /dev/null and b/WEB-INF/lib/jcdp-web-sys-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-web-sys-api-1.1.jar b/WEB-INF/lib/jcdp-web-sys-api-1.1.jar new file mode 100644 index 0000000..da10923 Binary files /dev/null and b/WEB-INF/lib/jcdp-web-sys-api-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-web-user-1.1.jar b/WEB-INF/lib/jcdp-web-user-1.1.jar new file mode 100644 index 0000000..abba544 Binary files /dev/null and b/WEB-INF/lib/jcdp-web-user-1.1.jar differ diff --git a/WEB-INF/lib/jcdp-web-user-api-1.1.jar b/WEB-INF/lib/jcdp-web-user-api-1.1.jar new file mode 100644 index 0000000..e092e8d Binary files /dev/null and b/WEB-INF/lib/jcdp-web-user-api-1.1.jar differ diff --git a/WEB-INF/lib/jstl-1.2.jar b/WEB-INF/lib/jstl-1.2.jar new file mode 100644 index 0000000..0fd275e Binary files /dev/null and b/WEB-INF/lib/jstl-1.2.jar differ diff --git a/WEB-INF/lib/junit-4.11.jar b/WEB-INF/lib/junit-4.11.jar new file mode 100644 index 0000000..aaf7444 Binary files /dev/null and b/WEB-INF/lib/junit-4.11.jar differ diff --git a/WEB-INF/lib/log4j-1.2.16.jar b/WEB-INF/lib/log4j-1.2.16.jar new file mode 100644 index 0000000..5429a90 Binary files /dev/null and b/WEB-INF/lib/log4j-1.2.16.jar differ diff --git a/WEB-INF/lib/mail-1.4.1.jar b/WEB-INF/lib/mail-1.4.1.jar new file mode 100644 index 0000000..1d15e79 Binary files /dev/null and b/WEB-INF/lib/mail-1.4.1.jar differ diff --git a/WEB-INF/lib/mysql-connector-java-5.1.42.jar b/WEB-INF/lib/mysql-connector-java-5.1.42.jar new file mode 100644 index 0000000..cf242a7 Binary files /dev/null and b/WEB-INF/lib/mysql-connector-java-5.1.42.jar differ diff --git a/WEB-INF/lib/neethi-3.0.3.jar b/WEB-INF/lib/neethi-3.0.3.jar new file mode 100644 index 0000000..38b77ff Binary files /dev/null and b/WEB-INF/lib/neethi-3.0.3.jar differ diff --git a/WEB-INF/lib/org.apache.axis-1.jar b/WEB-INF/lib/org.apache.axis-1.jar new file mode 100644 index 0000000..20b09a5 Binary files /dev/null and b/WEB-INF/lib/org.apache.axis-1.jar differ diff --git a/WEB-INF/lib/paranamer-1.3.jar b/WEB-INF/lib/paranamer-1.3.jar new file mode 100644 index 0000000..9cb7c61 Binary files /dev/null and b/WEB-INF/lib/paranamer-1.3.jar differ diff --git a/WEB-INF/lib/poi-3.17.jar b/WEB-INF/lib/poi-3.17.jar new file mode 100644 index 0000000..353ce76 Binary files /dev/null and b/WEB-INF/lib/poi-3.17.jar differ diff --git a/WEB-INF/lib/poi-ooxml-3.17.jar b/WEB-INF/lib/poi-ooxml-3.17.jar new file mode 100644 index 0000000..68086e8 Binary files /dev/null and b/WEB-INF/lib/poi-ooxml-3.17.jar differ diff --git a/WEB-INF/lib/poi-ooxml-schemas-3.17.jar b/WEB-INF/lib/poi-ooxml-schemas-3.17.jar new file mode 100644 index 0000000..2e9b3e7 Binary files /dev/null and b/WEB-INF/lib/poi-ooxml-schemas-3.17.jar differ diff --git a/WEB-INF/lib/rpc-1.0.jar b/WEB-INF/lib/rpc-1.0.jar new file mode 100644 index 0000000..a2c13d9 Binary files /dev/null and b/WEB-INF/lib/rpc-1.0.jar differ diff --git a/WEB-INF/lib/slf4j-api-1.6.1.jar b/WEB-INF/lib/slf4j-api-1.6.1.jar new file mode 100644 index 0000000..f1f4fdd Binary files /dev/null and b/WEB-INF/lib/slf4j-api-1.6.1.jar differ diff --git a/WEB-INF/lib/slf4j-api-1.7.25.jar b/WEB-INF/lib/slf4j-api-1.7.25.jar new file mode 100644 index 0000000..0143c09 Binary files /dev/null and b/WEB-INF/lib/slf4j-api-1.7.25.jar differ diff --git a/WEB-INF/lib/slf4j-log4j12-1.6.1.jar b/WEB-INF/lib/slf4j-log4j12-1.6.1.jar new file mode 100644 index 0000000..6411599 Binary files /dev/null and b/WEB-INF/lib/slf4j-log4j12-1.6.1.jar differ diff --git a/WEB-INF/lib/spring-aop-4.3.0.RELEASE.jar b/WEB-INF/lib/spring-aop-4.3.0.RELEASE.jar new file mode 100644 index 0000000..089e78f Binary files /dev/null and b/WEB-INF/lib/spring-aop-4.3.0.RELEASE.jar differ diff --git a/WEB-INF/lib/spring-beans-4.3.0.RELEASE.jar b/WEB-INF/lib/spring-beans-4.3.0.RELEASE.jar new file mode 100644 index 0000000..617d90d Binary files /dev/null and b/WEB-INF/lib/spring-beans-4.3.0.RELEASE.jar differ diff --git a/WEB-INF/lib/spring-context-4.3.0.RELEASE.jar b/WEB-INF/lib/spring-context-4.3.0.RELEASE.jar new file mode 100644 index 0000000..13baf5e Binary files /dev/null and b/WEB-INF/lib/spring-context-4.3.0.RELEASE.jar differ diff --git a/WEB-INF/lib/spring-core-4.3.0.RELEASE.jar b/WEB-INF/lib/spring-core-4.3.0.RELEASE.jar new file mode 100644 index 0000000..635b08f Binary files /dev/null and b/WEB-INF/lib/spring-core-4.3.0.RELEASE.jar differ diff --git a/WEB-INF/lib/spring-expression-4.3.0.RELEASE.jar b/WEB-INF/lib/spring-expression-4.3.0.RELEASE.jar new file mode 100644 index 0000000..9a13132 Binary files /dev/null and b/WEB-INF/lib/spring-expression-4.3.0.RELEASE.jar differ diff --git a/WEB-INF/lib/spring-jdbc-4.3.0.RELEASE.jar b/WEB-INF/lib/spring-jdbc-4.3.0.RELEASE.jar new file mode 100644 index 0000000..75508eb Binary files /dev/null and b/WEB-INF/lib/spring-jdbc-4.3.0.RELEASE.jar differ diff --git a/WEB-INF/lib/spring-tx-4.3.0.RELEASE.jar b/WEB-INF/lib/spring-tx-4.3.0.RELEASE.jar new file mode 100644 index 0000000..90b7ac0 Binary files /dev/null and b/WEB-INF/lib/spring-tx-4.3.0.RELEASE.jar differ diff --git a/WEB-INF/lib/spring-web-4.3.0.RELEASE.jar b/WEB-INF/lib/spring-web-4.3.0.RELEASE.jar new file mode 100644 index 0000000..17109f2 Binary files /dev/null and b/WEB-INF/lib/spring-web-4.3.0.RELEASE.jar differ diff --git a/WEB-INF/lib/stax-api-1.0-2.jar b/WEB-INF/lib/stax-api-1.0-2.jar new file mode 100644 index 0000000..015169d Binary files /dev/null and b/WEB-INF/lib/stax-api-1.0-2.jar differ diff --git a/WEB-INF/lib/stax-api-1.0.1.jar b/WEB-INF/lib/stax-api-1.0.1.jar new file mode 100644 index 0000000..d9a1665 Binary files /dev/null and b/WEB-INF/lib/stax-api-1.0.1.jar differ diff --git a/WEB-INF/lib/stax2-api-3.1.4.jar b/WEB-INF/lib/stax2-api-3.1.4.jar new file mode 100644 index 0000000..dded036 Binary files /dev/null and b/WEB-INF/lib/stax2-api-3.1.4.jar differ diff --git a/WEB-INF/lib/woodstox-core-asl-4.4.1.jar b/WEB-INF/lib/woodstox-core-asl-4.4.1.jar new file mode 100644 index 0000000..d8b4e8c Binary files /dev/null and b/WEB-INF/lib/woodstox-core-asl-4.4.1.jar differ diff --git a/WEB-INF/lib/wsdl4j-1.6.1.jar b/WEB-INF/lib/wsdl4j-1.6.1.jar new file mode 100644 index 0000000..67a35fc Binary files /dev/null and b/WEB-INF/lib/wsdl4j-1.6.1.jar differ diff --git a/WEB-INF/lib/xml-apis-1.0.b2.jar b/WEB-INF/lib/xml-apis-1.0.b2.jar new file mode 100644 index 0000000..ad33a5a Binary files /dev/null and b/WEB-INF/lib/xml-apis-1.0.b2.jar differ diff --git a/WEB-INF/lib/xml-resolver-1.2.jar b/WEB-INF/lib/xml-resolver-1.2.jar new file mode 100644 index 0000000..e535bdc Binary files /dev/null and b/WEB-INF/lib/xml-resolver-1.2.jar differ diff --git a/WEB-INF/lib/xmlbeans-2.6.0.jar b/WEB-INF/lib/xmlbeans-2.6.0.jar new file mode 100644 index 0000000..d1b6627 Binary files /dev/null and b/WEB-INF/lib/xmlbeans-2.6.0.jar differ diff --git a/WEB-INF/lib/xmlpull-1.1.3.1.jar b/WEB-INF/lib/xmlpull-1.1.3.1.jar new file mode 100644 index 0000000..cbc149d Binary files /dev/null and b/WEB-INF/lib/xmlpull-1.1.3.1.jar differ diff --git a/WEB-INF/lib/xmlschema-core-2.2.1.jar b/WEB-INF/lib/xmlschema-core-2.2.1.jar new file mode 100644 index 0000000..cab69fd Binary files /dev/null and b/WEB-INF/lib/xmlschema-core-2.2.1.jar differ diff --git a/WEB-INF/lib/xpp3_min-1.1.4c.jar b/WEB-INF/lib/xpp3_min-1.1.4c.jar new file mode 100644 index 0000000..813a9a8 Binary files /dev/null and b/WEB-INF/lib/xpp3_min-1.1.4c.jar differ diff --git a/WEB-INF/lib/xstream-1.4.4.jar b/WEB-INF/lib/xstream-1.4.4.jar new file mode 100644 index 0000000..dcedd5a Binary files /dev/null and b/WEB-INF/lib/xstream-1.4.4.jar differ diff --git a/WEB-INF/mapping/category.map.xml b/WEB-INF/mapping/category.map.xml new file mode 100644 index 0000000..c202a14 --- /dev/null +++ b/WEB-INF/mapping/category.map.xml @@ -0,0 +1,24 @@ + + + id + <@p p="AND ((pid='root' or CATEGORYTYPE=?)) ">categorytype + <@p p="AND %s" f="%S LIKE ?">code + <@p p="AND %s" s=" OR" f="UPPER(%S) LIKE ?">name + order by seq + ]]> + + pid + ]]> + + + code + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/chat.map.xml b/WEB-INF/mapping/chat.map.xml new file mode 100644 index 0000000..ccfde51 --- /dev/null +++ b/WEB-INF/mapping/chat.map.xml @@ -0,0 +1,141 @@ + + + id + <@p p=" AND %s">parent_id + <@p p=" AND (%s)" s=" OR" f="%S LIKE ?">name order by SORT_NO asc + ]]> + + orgid + 'user' as subtype, + 'false' as isParent, + USR.USERCODE, + ext.avatars, + ext.remark, + ifnull(userstatus.userstatus,0) as userstatus +FROM + JCDP_SYS_USER USR +LEFT JOIN JCDP_SYS_USER_EXT EXT ON USR.ID = EXT.ID left join JCDP_CHAT_USERSTATUS userstatus on userstatus.userid=USR.id +WHERE + USR.DELETE_FLAG = 0 and usr.status<>2 AND + USR.ID IN ( + SELECT + USR1. ID + FROM + JCDP_SYS_USER_ORG uorg + LEFT JOIN JCDP_SYS_USER usr1 ON USR1. ID = UORG.userid + LEFT JOIN JCDP_SYS_ORG org ON org. ID = uorg.orgid + WHERE usr1.USERTYPE<>2 + <@p p=" AND %s" f="ORG.ID=?">orgid + <@p p=" AND %s" f="ORG.%S LIKE ?">cascade_id + ) order by userstatus desc,CONVERT (name USING gbk) ASC + ]]> + 2 + <@p p=" AND %s" f="ORG.CASCADE_ID like ?">orgid + ) + ]]> + + 0 AND + USR.USERID IN ( + SELECT + USR1. ID + FROM + JCDP_SYS_USER_ORG uorg + LEFT JOIN JCDP_SYS_USER usr1 ON USR1. ID = UORG.userid + LEFT JOIN JCDP_SYS_ORG org ON org. ID = uorg.orgid + WHERE usr1.USERTYPE<>2 + <@p p=" AND %s" f="ORG.CASCADE_ID like ?">orgid + ) + ]]> + userid + ]]> + userid + ]]> + 0 <@p p=" AND %s" f="userid<>?">userid + ]]> + userid + <@p p=" AND %s">sessionstate + ]]> + + userid + ]]> + 0 +AND TIMESTAMPDIFF(SECOND,HEARTBEAT,NOW()) ><@p p="?">second + ]]> + 0 +AND TIMESTAMPDIFF(SECOND,HEARTBEAT,NOW()) ><@p p="?">second + ]]> + userid + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/chatApps.map.xml b/WEB-INF/mapping/chatApps.map.xml new file mode 100644 index 0000000..29529b5 --- /dev/null +++ b/WEB-INF/mapping/chatApps.map.xml @@ -0,0 +1,55 @@ + + + userid +) b ON a.ID = b.appid +where a.APPENABLED=1 and ((a.OWNTYPE=0 <@p p=" and %s" f="a.createuser=?">createuser) or (a.OWNTYPE=1 and b.userid is not null)) +ORDER BY a.ORDERVALUE ASC + ]]> + userid +) b ON a.ID = b.appid +LEFT JOIN ( + SELECT + COUNT(userid) AS installCount, + appid + FROM + jcdp_chat_apps_my + GROUP BY + APPID +) c ON c.appid = a.id where a.APPENABLED=1 and a.ownType=1 +ORDER BY a.ORDERVALUE ASC + ]]> + userid,appid) + VALUES(<@p f="?">userid,appid) + ]]> + userid + <@p p=" and %s" f="appid=?">appid + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/chatFriends.map.xml b/WEB-INF/mapping/chatFriends.map.xml new file mode 100644 index 0000000..73db4b8 --- /dev/null +++ b/WEB-INF/mapping/chatFriends.map.xml @@ -0,0 +1,169 @@ + + + applyerid + <@p p=" AND %s">receiverid + <@p p=" AND %s">isagree + order by APPLYTIME desc + ]]> + + applyerid + <@p p=" AND %s">receiverid + <@p p=" AND %s">isagree + order by APPLYTIME desc + ]]> + + username +<@p p=" or %s" f="lower(us.%S) LIKE ?">usercode +<@p p=" or %s)" f="lower(ext.%S) LIKE ?">remark +AND us.id NOT IN ( + SELECT + FRIENDID + FROM + jcdp_chat_friends + WHERE + <@p p=" %s">userid +) +AND us.id NOT IN ( + SELECT + u.id + FROM + jcdp_sys_user u + LEFT JOIN jcdp_sys_user_org uo ON uo.USERID = u.id + LEFT JOIN jcdp_sys_org org ON org.id = uo.ORGID + WHERE + <#list cascades as con> + org.CASCADE_ID LIKE '${con}%' + <#if con_has_next> + or + + +) + ]]> + + userid +<@p p=" AND %s">friendid + ]]> + + userid +AND u.DELETE_FLAG = 0 +AND u. STATUS = 1 order by userstatus desc,CONVERT (name USING gbk) ASC + ]]> + + userid +<@p p=" AND %s">friendid + ]]> + + applyerid +<@p p=" AND %s" f="RECEIVERID= ?">receiverid + ) +OR ( +<@p p="%s" f="APPLYERID= ?">applyerid1 +<@p p=" AND %s" f="RECEIVERID= ?">receiverid1 +) + ]]> + + 0 +AND ( + u.id IN ( + SELECT + fs.USERID + FROM + jcdp_chat_friends fs + WHERE + <@p p="%s" f="fs.friendid = ?">userid + ) + OR u.id IN ( + SELECT + ua.id + FROM + jcdp_sys_user ua + LEFT JOIN jcdp_sys_user_org uo ON uo.USERID = ua.id + LEFT JOIN jcdp_sys_org org ON org.id = uo.ORGID + WHERE + <#list cascades as con> + org.CASCADE_ID LIKE '${con}%' + <#if con_has_next> + or + + + ) +) <@p p=" and %s" f="u.id!= ?">userid1 + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/chatGroup.map.xml b/WEB-INF/mapping/chatGroup.map.xml new file mode 100644 index 0000000..0f58409 --- /dev/null +++ b/WEB-INF/mapping/chatGroup.map.xml @@ -0,0 +1,120 @@ + + + id + ]]> + + groupid + ]]> + + memberid + ]]> + + 0 + <@p p=" and GM.GROUPID=?">groupid + ]]> + + groupid and us.USERSTATUS>0 + ]]> + + userid + <@p p=" and gr.id=?">id + order by CONVERT (gr.groupname USING gbk) + ]]> + + userid + <@p p=" and gr.id=?">id + order by GR.CREATETIME desc + ]]> + + groupid + ]]> + + groupid + <@p p=" and userid=?">userid + <@p p=" and id=?">id + ]]> + + ismanager where <@p p=" id=?">id + ]]> + + ismanager where +<@p p=" userid=?">userid +<@p p=" and groupid=?">groupid + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/chatVersion.map.xml b/WEB-INF/mapping/chatVersion.map.xml new file mode 100644 index 0000000..a921b63 --- /dev/null +++ b/WEB-INF/mapping/chatVersion.map.xml @@ -0,0 +1,33 @@ + + + pkgtype + <@p p=" AND %s">isupdatepkg + ]]> + + pkgtype + <@p p=" AND %s">isupdatepkg + ]]> + + pkgtype + <@p p=" AND %s">isupdatepkg + ]]> + + pkgtype + <@p p=" AND %s">isupdatepkg + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/dict.map.xml b/WEB-INF/mapping/dict.map.xml new file mode 100644 index 0000000..7f660ae --- /dev/null +++ b/WEB-INF/mapping/dict.map.xml @@ -0,0 +1,24 @@ + + + id + <@p p="AND %s" f="JSD.%S = ?">category + <@p p="AND (%s)" s=" OR" f="JSD.%S LIKE ?">name,keykey + ]]> + + keykey + <@p p="AND %s" f="%S<>?">id + ]]> + + + id) + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/dictItem.map.xml b/WEB-INF/mapping/dictItem.map.xml new file mode 100644 index 0000000..dea8bd7 --- /dev/null +++ b/WEB-INF/mapping/dictItem.map.xml @@ -0,0 +1,40 @@ + + + + id + <@p p=" AND %s">dictId + <@p p=" AND %s">status + <@p p="AND (%s)" s=" OR" f="UPPER(%S) LIKE ?">name,value + ]]> + + name,value + <@p p="AND %s" f="%S = ?">dictid + <@p p="AND %s" f="%S<>?">id + ]]> + + + keykey + <@p p="AND %s" f="ITEM.%S=?">status + ORDER BY ITEM.VALUE ASC + ]]> + + + dictId) + ]]> + + + id) + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_exam_editexampaper.map.xml b/WEB-INF/mapping/et_exam_editexampaper.map.xml new file mode 100644 index 0000000..7924772 --- /dev/null +++ b/WEB-INF/mapping/et_exam_editexampaper.map.xml @@ -0,0 +1,159 @@ + + + edit_id + order by num asc + ]]> + + edit_id and type_num=1) q_count1, + (select count(type_num) q_count + from et_exam_exampaper_and_editexampaper + inner join et_exam_editexampaper + on et_exam_exampaper_and_editexampaper.id = et_exam_editexampaper.edit_id + where <@p>edit_id and type_num=2) q_count2, + (select count(type_num) q_count + from et_exam_exampaper_and_editexampaper + inner join et_exam_editexampaper + on et_exam_exampaper_and_editexampaper.id = et_exam_editexampaper.edit_id + where <@p>edit_id and type_num=3) q_count3, + (select count(type_num) q_count + from et_exam_exampaper_and_editexampaper + inner join et_exam_editexampaper + on et_exam_exampaper_and_editexampaper.id = et_exam_editexampaper.edit_id + where <@p>edit_id and type_num=4) q_count4, + (select count(type_num) q_count + from et_exam_exampaper_and_editexampaper + inner join et_exam_editexampaper + on et_exam_exampaper_and_editexampaper.id = et_exam_editexampaper.edit_id + where <@p>edit_id and type_num=5) q_count5 + ]]> + + id) as edit_id,num,subject,type,type_num,ismust,score,optionA,optionB,optionC,optionD,optionE,optionF,isParagraph,answer + from et_exam_editexampaper + where <@p>edit_id + ]]> + + categoryid and type = '1') singlenumcheck, + (select count(*) from et_exam_question where <@p>categoryid and type = '2') multiplenumcheck, + (select count(*) from et_exam_question where <@p>categoryid and type = '3') judgementnumcheck, + (select count(*) from et_exam_question where <@p>categoryid and type = '4') blanknumcheck, + (select count(*) from et_exam_question where <@p>categoryid and type = '5') essaynumcheck + ]]> + + edit_id + ]]> + + id) as edit_id,subject,question_type,type,1 as ismust,optionA,optionB,optionC,optionD,optionE,optionF,0 as isParagraph,answer + from et_exam_question where <@p>categoryid + and type = 1 + <@p p=" and %s">card + order by rand() limit <@p p=" ? ">singleNum) + union + (select md5(uuid()) as id,(select id from et_exam_exampaper_and_editexampaper where <@p>id) as edit_id,subject,question_type,type,1 as ismust,optionA,optionB,optionC,optionD,optionE,optionF,0 as isParagraph,answer + from et_exam_question where <@p>categoryid + and type = 2 + <@p p=" and %s">card + order by rand() limit <@p p=" ? ">multipleNum) + union + (select md5(uuid()) as id,(select id from et_exam_exampaper_and_editexampaper where <@p>id) as edit_id,subject,question_type,type,1 as ismust,optionA,optionB,optionC,optionD,optionE,optionF,0 as isParagraph,answer + from et_exam_question where <@p>categoryid + and type = 3 + <@p p=" and %s">card + order by rand() limit <@p p=" ? ">judgementNum) + union + (select md5(uuid()) as id,(select id from et_exam_exampaper_and_editexampaper where <@p>id) as edit_id,subject,question_type,type,1 as ismust,optionA,optionB,optionC,optionD,optionE,optionF,0 as isParagraph,answer + from et_exam_question where <@p>categoryid + and type = 4 + <@p p=" and %s">card + order by rand() limit <@p p=" ? ">blankNum) + union + (select md5(uuid()) as id,(select id from et_exam_exampaper_and_editexampaper where <@p>id) as edit_id,subject,question_type,type,1 as ismust,optionA,optionB,optionC,optionD,optionE,optionF,0 as isParagraph,answer + from et_exam_question where <@p>categoryid + and type = 5 + <@p p=" and %s">card + order by rand() limit <@p p=" ? ">essayNum) + ) a,(select @i:=0) z + ]]> + + id order by type_num) j, + (select @i:=0) z + set a.num = j.i + where a.id=j.id and <@p p =" edit_id = ? ">id + ]]> + + id + ]]> + + edit_id + ]]> + + + edit_id) as sum + from et_exam_editexampaper where + <@p>edit_id + <@p p="and type_num in(%s)" f="?">type_num + ]]> + + newnum + where <@p>edit_id + <@p p=" and %s">num + ]]> + + num + where <@p>id + ]]> + + newnum + where + <@p>edit_id + <@p p=" and num = ?">oldnum + ]]> + + num + where <@p>id + ]]> + + edit_id + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_exam_exampaper_and_editexampaper.map.xml b/WEB-INF/mapping/et_exam_exampaper_and_editexampaper.map.xml new file mode 100644 index 0000000..e824077 --- /dev/null +++ b/WEB-INF/mapping/et_exam_exampaper_and_editexampaper.map.xml @@ -0,0 +1,53 @@ + + + pg + <@p p=" and %s">card + <@p p=" and (name like ? ">name + <@p p=" or category like ? ">category + <@p p=" or createdepartment like ? )">createdepartment + + ]]> + + userCard and exam_id = exampaper.id)) = 1,"已答","未答")) as userstate + from et_exam_exampaper_and_editexampaper as exampaper + inner join et_exam_limitation as limitation + on exampaper.id = limitation.exam_id + left join et_exam_limitation_course as course + on limitation.user_id = course.course_id + left join et_exam_limitation_class as class + on limitation.user_id = class.class_id + where 1=0 + <@p p=" or %s">pg + <@p p=" and %s">state + <@p p=" and (user_id IN(%s)" f="?">user_id + <@p p=" or %s">course_person_id + <@p p=" or %s)">class_person_id + <@p p=" and (name like ? ">name + <@p p=" or category like ? )">category + group by id + ]]> + + name + ]]> + + + + + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_exam_limitation.map.xml b/WEB-INF/mapping/et_exam_limitation.map.xml new file mode 100644 index 0000000..a185134 --- /dev/null +++ b/WEB-INF/mapping/et_exam_limitation.map.xml @@ -0,0 +1,167 @@ + + + exam_id + + ]]> + + exam_id + + ]]> + + exam_id + ]]> + + exam + <@p p="and %s">exam_id + ]]> + + exam_id_ + <@p p=" , %s">exam + where <@p>exam_id + ]]> + + temporary_id as exam_id,'3' as limitation + from et_exam_usertest + where <@p>exam_id + group by user_id + having sum(user_score) < <@p p=" ? ">passpoints + union all + select md5(uuid()) as id,b.username as user,b.usercode as user_id,'临时试卷' as exam,<@p p=" ? ">temporary_id as exam_id,'3' as limitation + from et_train_baseuser b + where b.usercode not in (select user_id from et_exam_usertest where <@p>exam_id group by user_id) + ]]> + + temporary_id as exam_id,'3' as limitation + from et_exam_usertest + where <@p>exam_id + group by user_id + having sum(user_score) < <@p p=" ? ">passpoints + union all + select md5(uuid()) as id,user,user_id,'临时试卷' as exam,<@p p=" ? ">temporary_id as exam_id,'3' as limitation + from ( + select e.id as exam_id,b.username as user,b.usercode as user_id from et_exam_exampaper_and_editexampaper e,et_train_baseuser b + where e.limitation = '1' + ) c + inner join et_exam_exampaper_and_editexampaper e + on c.exam_id = e.id + where (select count(1) as num from et_exam_usertest u where u.exam_id = c.exam_id and u.user_id = c.user_id) = 0 + and e.state = '已关闭' and e.pg = '1' and <@p p=" e.id = ? ">exam_id + ]]> + + temporary_id as exam_id,'3' as limitation + from et_exam_usertest + where <@p>exam_id + group by user_id + having sum(user_score) < <@p p=" ? ">passpoints + union all + select md5(uuid()) as id,user,user_id,'临时试卷' as exam,<@p p=" ? ">temporary_id as exam_id,'3' as limitation + from ( + select l.exam_id as exam_id,b.username as user,b.usercode as user_id from et_exam_limitation l,et_train_baseuser b + where l.limitation = '2' and l.user_id = b.orgcode and <@p>exam_id + ) c + inner join et_exam_exampaper_and_editexampaper e + on c.exam_id = e.id + where c.user_id not in (select user_id from et_exam_usertest where <@p>exam_id group by user_id) + and e.state = '已关闭' and e.pg = '1' and <@p p=" e.id = ? ">exam_id + ]]> + + temporary_id as exam_id,'3' as limitation + from et_exam_usertest + where <@p>exam_id + group by user_id + having sum(user_score) < <@p p=" ? ">passpoints + union all + select md5(uuid()) as id,user,user_id,'临时试卷' as exam,<@p p=" ? ">temporary_id as exam_id,'3' as limitation + from et_exam_limitation c + inner join et_exam_exampaper_and_editexampaper e + on c.exam_id = e.id + where c.user_id not in (select user_id from et_exam_usertest where <@p>exam_id group by user_id) + and e.state = '已关闭' and e.pg = '1' and <@p p=" e.id = ? ">exam_id + ]]> + + temporary_id as exam_id,'3' as limitation + from et_exam_usertest + where <@p>exam_id + group by user_id + having sum(user_score) < <@p p=" ? ">passpoints + union all + select md5(uuid()) as id,username as user,usercode as user_id,'临时试卷' as exam,<@p p=" ? ">temporary_id as exam_id,'3' as limitation + from v_class_user v + where v.usercode not in (select user_id from et_exam_usertest where <@p>exam_id group by user_id) + and classid in (select user_id from et_exam_limitation where <@p>exam_id) + ]]> + + temporary_id as exam_id,'3' as limitation + from et_exam_usertest + where <@p>exam_id + group by user_id + having sum(user_score) < <@p p=" ? ">passpoints + union all + select md5(uuid()) as id,username as user,usercode as user_id,'临时试卷' as exam,<@p p=" ? ">temporary_id as exam_id,'3' as limitation + from v_class_user v + where v.usercode not in (select user_id from et_exam_usertest where <@p>exam_id group by user_id) + and courseid in (select user_id from et_exam_limitation where <@p>exam_id) + ]]> + + edit_id and <@p p=" a.id = ? ">id + ]]> + + temporary_id as exam_id,'3' as limitation + from et_exam_usertest + where <@p>exam_id + group by user_id + having sum(user_score) < <@p p=" ? ">passpoints + union all + select md5(uuid()) as id,class_person,class_person_id,'临时试卷' as exam,<@p p=" ? ">temporary_id as exam_id,'3' as limitation + from et_exam_limitation_class c + inner join et_exam_exampaper_and_editexampaper a + on c.exam_id = a.id + where c.class_person_id not in (select user_id from et_exam_usertest where <@p>exam_id group by user_id) + and a.state = '已关闭' and a.pg = '1' and <@p p=" a.id = ? ">exam_id + ]]> + + temporary_id as exam_id,'3' as limitation + from et_exam_usertest + where <@p>exam_id + group by user_id + having sum(user_score) < <@p p=" ? ">passpoints + union all + select md5(uuid()) as id,course_person,course_person_id,'临时试卷' as exam,<@p p=" ? ">temporary_id as exam_id,'3' as limitation + from et_exam_limitation_course c + inner join et_exam_exampaper_and_editexampaper a + on c.exam_id = a.id + where c.course_person_id not in (select user_id from et_exam_usertest where <@p>exam_id group by user_id) + and a.state = '已关闭' and a.pg = '1' and <@p p=" a.id = ? ">exam_id + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_exam_question.map.xml b/WEB-INF/mapping/et_exam_question.map.xml new file mode 100644 index 0000000..92bfcf6 --- /dev/null +++ b/WEB-INF/mapping/et_exam_question.map.xml @@ -0,0 +1,21 @@ + + + card + <@p p=" and (question_type like ? ">question_type + <@p p=" or subject like ? ">subject + <@p p=" or category like ? )">category + ]]> + + id + ]]> + + id + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_exam_usertest.map.xml b/WEB-INF/mapping/et_exam_usertest.map.xml new file mode 100644 index 0000000..fbefb57 --- /dev/null +++ b/WEB-INF/mapping/et_exam_usertest.map.xml @@ -0,0 +1,287 @@ + + + edit_id + ]]> + + exam_id + <@p p=" and (name like ? ">name + <@p p=" or department like ? ">department + <@p p=" or user like ? )">user + group by user_id + ) examresult + ]]> + + edit_id + <@p p=" and et_exam_exampaper_and_editexampaper.name like ? ">name + <@p p=" or user like ? ">user + group by user_id + ]]> + + name + <@p p=" and %s">pg + <@p p=" and %s">card + <@p p=" and %s">createdepartment + order by convert(name using gbk) + ]]> + + edit_id + <@p p=" and %s">user_id + order by et_exam_editexampaper.num asc + ]]> + + user_id + <@p p=" and name like ? ">name + group by exam_id + ]]> + + user_id + <@p p=" and %s">exam_id + ]]> + + + + exam_id)) = 1,"已答","未答")) as userstate + from et_exam_limitation as limitation + left join et_exam_usertest as usertest + on limitation.exam_id = usertest.exam_id + where <@p p=" limitation.exam_id = ?">exam_id + group by limitation.user_id + ]]> + + exam_id)) = 1,"已答","未答")) as userstate + from et_exam_limitation_class as class + left join et_exam_usertest as usertest + on class.exam_id = usertest.exam_id + where <@p p=" class.exam_id = ?">exam_id + group by class.class_person_id + ]]> + + exam_id)) = 1,"已答","未答")) as userstate + from et_exam_limitation_course as course + left join et_exam_usertest as usertest + on course.exam_id = usertest.exam_id + where <@p p=" course.exam_id = ?">exam_id + group by course.course_person_id + ]]> + + exam_id + ]]> + + exam_id group by user_id) + union all + select md5(uuid()) as id,user,user_id,department,'已答' as userstate,round(sum(user_score),2) user_score + from et_exam_usertest + where <@p>exam_id + group by user_id + ]]> + + exam_id)) = 1,"已答","未答")) as userstate + from (select e.id as exam_id,b.username,b.usercode from et_exam_exampaper_and_editexampaper e,et_train_baseuser b + where <@p p=" e.id = ? ">exam_id) as baseuser + left join et_exam_usertest as usertest + on baseuser.exam_id = usertest.exam_id + where <@p p=" baseuser.exam_id = ? ">exam_id + group by baseuser.usercode + ]]> + + exam_id group by user_id) + and <@p p="orgcode in (%s)" f="?">user_id + union all + select md5(uuid()) as id,user,user_id,department,'已答' as userstate,round(sum(user_score),2) user_score + from et_exam_usertest + where <@p>exam_id + group by user_id + ]]> + + exam_id)) = 1,"已答","未答")) as userstate + from (select l.exam_id,b.username,b.usercode from et_exam_limitation l,et_train_baseuser b + where <@p p=" l.exam_id = ? ">exam_id + and b.orgcode = any (select user_id from et_exam_limitation + where <@p>exam_id) group by b.usercode) as baseuser + left join et_exam_usertest as usertest + on baseuser.exam_id = usertest.exam_id + where <@p p=" baseuser.exam_id = ? ">exam_id + group by baseuser.usercode + ]]> + + exam_id group by user_id) + and <@p p=" l.exam_id = ? ">exam_id + group by user_id + union all + select md5(uuid()) as id,user,user_id,department,'已答' as userstate,round(sum(user_score),2) user_score + from et_exam_usertest + where <@p>exam_id + group by user_id + ]]> + + + + exam_id)) = 1,"已答","未答")) as userstate + from et_exam_limitation as limitation + left join et_exam_usertest as usertest + on limitation.exam_id = usertest.exam_id + where <@p p=" limitation.exam_id = ?">exam_id + group by limitation.user_id + ]]> + + exam_id group by user_id) + and <@p p=" class.exam_id = ?">exam_id + group by class.class_person_id + union all + select md5(uuid()) as id,user,user_id,department,'已答' as userstate,round(sum(user_score),2) user_score + from et_exam_usertest + where <@p>exam_id + group by user_id + ]]> + + exam_id)) = 1,"已答","未答")) as userstate + from et_exam_limitation_class as class + left join et_exam_usertest as usertest + on class.exam_id = usertest.exam_id + where <@p p=" class.exam_id = ?">exam_id + group by class.class_person_id + ]]> + + exam_id group by user_id) + and <@p p=" course.exam_id = ?">exam_id + group by course.course_person_id + union all + select md5(uuid()) as id,user,user_id,department,'已答' as userstate,round(sum(user_score),2) user_score + from et_exam_usertest + where <@p>exam_id + group by user_id + ]]> + + exam_id)) = 1,"已答","未答")) as userstate + from et_exam_limitation_course as course + left join et_exam_usertest as usertest + on course.exam_id = usertest.exam_id + where <@p p=" course.exam_id = ?">exam_id + group by course.course_person_id + ]]> + + exam_id + ]]> + + exam_id + and (type = '单选题' or type = '多选题' or type = '判断题') + and (mark_teacher = '' or mark_teacher is NULL) + ]]> \ No newline at end of file diff --git a/WEB-INF/mapping/et_groups.map.xml b/WEB-INF/mapping/et_groups.map.xml new file mode 100644 index 0000000..6c4b78d --- /dev/null +++ b/WEB-INF/mapping/et_groups.map.xml @@ -0,0 +1,9 @@ + + + id + <@p p="AND (%s)" s=" OR" f="UPPER(%S) LIKE ?">name,username + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_hcm_interface.map.xml b/WEB-INF/mapping/et_hcm_interface.map.xml new file mode 100644 index 0000000..ccce020 --- /dev/null +++ b/WEB-INF/mapping/et_hcm_interface.map.xml @@ -0,0 +1,84 @@ + + + + + = (select ifnull(max(end_time),'2000-01-01 00:00:00') end_time from et_hcm_push_time where is_success = '1') and id is not null and status = '2' + order by finish_time desc + ]]> + + ccid + group by ccid + ]]> + + internal_training as PXXS + ,case jhly when 'bmn' then <@p p=" ? ">department_level when 'bmw' then <@p p=" ? ">department_level when 'sj' then <@p p=" ? ">institute_level else '' end as PXBLX + ,case bjlb when '技术' then <@p p=" ? ">technology when '技能' then <@p p=" ? ">technical_ability when '管理' then <@p p=" ? ">management when '营销' then <@p p=" ? ">marketing else '' end as KCXL + ,KCMC,BJMC,addgroupname as ZBDW,'中电科网络通信研究院' as PXDD,ifnull(teacher,'') as SKR,ifnull(teacher_code,'') as GZH,ifnull(teacher_department,'') as SKRDW,starttime as KSSJ,endtime as JSSJ,ifnull(price,0) as PXFY + ,ifnull(pxxsh,0) as PXXST,case sfkh when '是' then <@p p=" ? ">is_exam when '否' then <@p p=" ? ">not_exam else '' end as KHBZ + from et_train_pd_cc + where status = '2' <@p p="and id in (%s)" f="?">id + order by finish_time desc + ]]> + + internal_training as PXXS + ,case jhly when 'bmn' then <@p p=" ? ">department_level when 'bmw' then <@p p=" ? ">department_level when 'sj' then <@p p=" ? ">institute_level else '' end as PXBLX + ,case bjlb when '技术' then <@p p=" ? ">technology when '技能' then <@p p=" ? ">technical_ability when '管理' then <@p p=" ? ">management when '营销' then <@p p=" ? ">marketing else '' end as KCXL + ,KCMC,BJMC,c.addgroupname as ZBDW,'中电科网络通信研究院' as PXDD,ifnull(teacher,'') as SKR,ifnull(teacher_department,'') as SKRDW,ifnull(teacher_code,'') as GZH,starttime as KSSJ,endtime as JSSJ,ifnull(price,0) as PXFY + ,ifnull(realperiod,0) as PXXST,ifnull(score,0) as KHCJ,ifnull(code,'') as ZSBH,'' as 'BZ1','' as 'BZ2' + from et_train_pd_cc c + inner join et_train_pd_cc_user u on c.id = u.ccid + left join (select code,class_id,usercode from et_train_pd_zs where <@p p="class_id in (%s)" f="?">id) z on c.id = z.class_id and u.usercode = z.usercode + left join et_exam_limitation_class cl on c.id = cl.class_id and u.usercode = cl.class_person_id + where status = '2' <@p p="and c.id in (%s)" f="?">id + order by finish_time desc + ]]> + + = (select ifnull(max(end_time),'2000-01-01 00:00:00') end_time from et_hcm_push_time where is_success = '1') and o.id is not null + group by o.id + ]]> + + external_training as PXXS, case jhly when 'bmn' then <@p p=" ? ">department_level when 'bmw' then <@p p=" ? ">department_level when 'sj' then <@p p=" ? ">institute_level else '' end as PXBLX + ,case kcxl when '技术' then <@p p=" ? ">technology when '技能' then <@p p=" ? ">technical_ability when '管理' then <@p p=" ? ">management when '营销' then <@p p=" ? ">marketing else '' end as KCXL + ,KCMC,'' as BJMC,ifnull(ZBDW,'') ZBDW,ifnull(PXDD,'') PXDD,'' as SKR,'' as GZH,pxstarttime as KSSJ,pxendtime as JSSJ,ifnull(PXFY,0) PXFY,'' as PXXST,'' as KHBZ + ,(select count(*) from et_train_ot_xy x where x.otid = o.id) as CXRS + from et_train_ot o + inner join et_train_kc_all a on o.wpid = a.id + where o.status = '5' <@p p="and o.id in (%s)" f="?">id + ]]> + + external_training as PXXS + ,<@p p=" ? ">external_training as PXXS, case jhly when 'bmn' then <@p p=" ? ">department_level when 'bmw' then <@p p=" ? ">department_level when 'sj' then <@p p=" ? ">institute_level else '' end as PXBLX + ,case kcxl when '技术' then <@p p=" ? ">technology when '技能' then <@p p=" ? ">technical_ability when '管理' then <@p p=" ? ">management when '营销' then <@p p=" ? ">marketing else '' end as KCXL + ,KCMC,'' as BJMC,ifnull(ZBDW,'') ZBDW,ifnull(PXDD,'') PXDD,'' as SKR,'' as GZH,pxstarttime as KSSJ,pxendtime as JSSJ,ifnull(PXFY,0)PXFY,'' as PXXST,'' as KHCJ,'' as ZSBH,'' as 'BZ1','' as 'BZ2' + ,(select count(*) from et_train_ot_xy x where x.otid = o.id) as CXRS + from et_train_ot o + inner join et_train_ot_xy x on o.id = x.otid + inner join et_train_kc_all a on o.wpid = a.id + where o.status = '5' <@p p="and o.id in (%s)" f="?">id + ]]> + + = (select ifnull(max(end_time),'2000-01-01 00:00:00') end_time from et_hcm_push_time where is_success = '1') and class_id is not null + group by class_id + order by addtime desc + ]]> + + id,<@p p=" ? ">end_time,<@p p=" ? ">is_success,<@p p=" ? ">error_information,<@p p=" ? ">add_time) + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_mylaunch.map.xml b/WEB-INF/mapping/et_mylaunch.map.xml new file mode 100644 index 0000000..759013f --- /dev/null +++ b/WEB-INF/mapping/et_mylaunch.map.xml @@ -0,0 +1,12 @@ + + + + limitation + <@p p=" or limitation = ? ">limitation2 + <@p p=" and taskname like ? ">taskname + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_qualification.map.xml b/WEB-INF/mapping/et_qualification.map.xml new file mode 100644 index 0000000..f291384 --- /dev/null +++ b/WEB-INF/mapping/et_qualification.map.xml @@ -0,0 +1,9 @@ + + + key + <@p p="or zsname like ?">key + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_qualificationjob.map.xml b/WEB-INF/mapping/et_qualificationjob.map.xml new file mode 100644 index 0000000..2fc3d80 --- /dev/null +++ b/WEB-INF/mapping/et_qualificationjob.map.xml @@ -0,0 +1,10 @@ + + + key + <@p p="or zsmc like ?">key + <@p p="or level like ?">key + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_research.map.xml b/WEB-INF/mapping/et_research.map.xml new file mode 100644 index 0000000..890c034 --- /dev/null +++ b/WEB-INF/mapping/et_research.map.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_research_exam.map.xml b/WEB-INF/mapping/et_research_exam.map.xml new file mode 100644 index 0000000..12ea4d8 --- /dev/null +++ b/WEB-INF/mapping/et_research_exam.map.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_resource_file.map.xml b/WEB-INF/mapping/et_resource_file.map.xml new file mode 100644 index 0000000..67e2166 --- /dev/null +++ b/WEB-INF/mapping/et_resource_file.map.xml @@ -0,0 +1,189 @@ + + + pg + <@p p=" and ((user_id IN(%s)" f="?">user_id + <@p p=" and %s)">state + <@p p=" or %s)">providerid + <@p p="and (title like ?">key + <@p p="or category like ?">key + <@p p="or providerdepartname like ?)">key + group by file.id + + ]]> + + + state + <@p p="and %s">pg + <@p p="and (title like ?">key + <@p p="or category like ?)">key + + ]]> + + + id + ) + ]]> + + id + ) + ]]> + + id + ) + ]]> + + + limitation_id as limitation_id,<@p p=" ? ">file_id as file_id,coursename,courseid,username,usercode + from v_class_user + where <@p>courseid + ]]> + + limitation_id as limitation_id,<@p p=" ? ">file_id as file_id,classname,classid,username,usercode + from (SELECT + `et_train_pd_cc`.`id` AS `classid`, + `et_train_pd_cc`.`bjmc` AS `classname`, + `et_train_pd_cc`.`kcmcid` AS `courseid`, + `et_train_pd_cc`.`kcmc` AS `coursename`, + `et_train_pd_cc_user`.`usercode` AS `usercode`, + `et_train_pd_cc_user`.`username` AS `username`, + `et_train_pd_cc_user`.`groupid` AS `userdeptid`, + `et_train_pd_cc_user`.`groupname` AS `userdeptname` +FROM + ( `et_train_pd_cc` LEFT JOIN `et_train_pd_cc_user` ON ( ( `et_train_pd_cc`.`id` = `et_train_pd_cc_user`.`ccid` ) ) ) + where 1=1 + <@p p="AND `et_train_pd_cc`.`id` = ?">classid + )a + + ]]> + + pg + <@p p=" and %s ">providerid + or id in + (select a.file_id from et_resource_limitation a left join et_resource_limitation_class b on a.id = b.limitation_id where 1=1 <@p p="AND b.class_person_id = ?">class_person_id) + or id in + (select a.file_id from et_resource_limitation a left join et_resource_limitation_course b on a.id = b.limitation_id where 1=1 <@p p="AND b.course_person_id = ?">course_person_id) + <@p p="and (title like ?">key + <@p p="or category like ?">key + <@p p="or providerdepartname like ?)">key + ]]> + + pg + <@p p=" and (%s">class_person_id + <@p p=" or %s">course_person_id + <@p p=" or %s)">providerid + <@p p="and (title like ?">key + <@p p="or category like ?">key + <@p p="or providerdepartname like ?)">key + group by file.id + + ]]> + + + state + <@p p=" and %s ">pg + <@p p=" and %s ">providerdepartid + <@p p="and providerdepartid in(%s)" f="?">groupidarray + <@p p="and (title like ?">key + <@p p="or category like ?">key + <@p p="or providerdepartname like ?)">key + ]]> + + file_id + ]]> + + id + ]]> + + pg + <@p p="and (title like ?">key + <@p p="or category like ?">key + <@p p="or providerdepartname like ?)">key + + ]]> + + id + ]]> + + + + user_id + ]]> + + ccid + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_resource_limitation.map.xml b/WEB-INF/mapping/et_resource_limitation.map.xml new file mode 100644 index 0000000..fa37dd1 --- /dev/null +++ b/WEB-INF/mapping/et_resource_limitation.map.xml @@ -0,0 +1,57 @@ + + + file_id + + ]]> + + + file_id + ]]> + + file_id + ]]> + + file_id + <@p p="limitation_id in (%s)" f="?">limitation_id + ]]> + + file_id + <@p p="limitation_id in (%s)" f="?">limitation_id + ]]> + + file_id_ + <@p p=" , %s">file + where <@p>file_id + ]]> + + file + <@p p="and %s">file_id + ]]> + + file_id_ + where <@p>file_id + ]]> + + file_id_ + where <@p>file_id + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_groupinplan.map.xml b/WEB-INF/mapping/et_train_groupinplan.map.xml new file mode 100644 index 0000000..0dfd7c7 --- /dev/null +++ b/WEB-INF/mapping/et_train_groupinplan.map.xml @@ -0,0 +1,86 @@ + + + + id + <@p p=" AND %s" f="%S LIKE ?">name + ]]> + + gppid + order by etsort asc + ]]> + gppid) + ]]> + + + + id + <@p p="and ( etg.name like ?">name + <@p p="or etgg.addgroupname like ? )">addgroupname + <@p p="and etgg.status = ?">status + <@p p="and etgg.addgroupid = ?">groupid + <@p p="and etgg.addgroupid in(%s)" f="?">groupidarray + <@p p="and etgg.addusercode = ?">addusercode + ]]> + + gipgid + order by etsort asc + ]]> + + gipgid + group by id + order by etsort asc + ]]> + + gipgid) + ]]> + + + + groupid +or gipgroup.groupid='0') and <@p f="?">groupid + not in(select addgroupid from et_train_gipgroup gipg where gipg.gppid=gip.id ) + ]]> + + + + department_id + <@p p="and (%s)">role_id + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_groupinplan_bg.map.xml b/WEB-INF/mapping/et_train_groupinplan_bg.map.xml new file mode 100644 index 0000000..54cb8d2 --- /dev/null +++ b/WEB-INF/mapping/et_train_groupinplan_bg.map.xml @@ -0,0 +1,44 @@ + + + + id + <@p p="and addgroupname like ?">addgroupname + <@p p="and status = ?">status + <@p p="and addgroupid = ?">addgroupid + <@p p="and addgroupid in(%s)" f="?">groupidarray + <@p p="and addusercode = ?">addusercode + ]]> + + bgid + <@p p="AND (%s)">lx + order by etsort asc + ]]> + + + bgid) + ]]> + + + bgid) and lx='2') a +left join et_train_gip_bg_kc b on(b.lx='1' and a.oldid=b.oldid and b.bgid IN(<@p f="?">bgid)) +order by a.lx ,a.etsort + ]]> + + + gipgid + order by addtime desc + limit 1 + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_groupoutplan.map.xml b/WEB-INF/mapping/et_train_groupoutplan.map.xml new file mode 100644 index 0000000..b042bc9 --- /dev/null +++ b/WEB-INF/mapping/et_train_groupoutplan.map.xml @@ -0,0 +1,28 @@ + + + + + id + <@p p="AND (%s)">name + <@p p="AND (%s)">status + <@p p="and addgroupid = ?">groupid + <@p p="and addgroupid in(%s)" f="?">groupidarray + <@p p="and UPPER(sld) = ?">sld + <@p p="and addusercode = ?">addusercode + <@p p="and sqdw like ?">sqdw + ]]> + + gopid + order by etsort asc + ]]> + gopid) + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_instituteplan.map.xml b/WEB-INF/mapping/et_train_instituteplan.map.xml new file mode 100644 index 0000000..f14c799 --- /dev/null +++ b/WEB-INF/mapping/et_train_instituteplan.map.xml @@ -0,0 +1,184 @@ + + + + + id + <@p p=" AND %s" f="%S LIKE ?">name + ]]> + + ipid + ]]> + ipid) + ]]> + + + + + id + <@p p="and etg.name like ?">name + <@p p="and etgg.status = ?">status + <@p p="and etgg.addgroupid = ?">groupid + <@p p="and etgg.addgroupid in(%s)" f="?">groupidarray + ]]> + + ipgid + order by etsort asc + ]]> + ipgid) + ]]> + + + + + + id + <@p p=" AND %s" f="%S LIKE ?">name + <@p p="AND (%s)">status + ]]> + + dyid + ]]> + dyid) + ]]> + + + + + ipid + order by kc.addtime asc + ]]> + + dyid) + ]]> + + + ipid + <@p p="AND dy.id IN(%s)" f="?">dyid + order by dy.id asc) a left join et_train_ipdy_kc dykc on(a.dyid=dykc.dyid and a.id=dykc.kcid) + order by a.kcxlid asc + + ]]> + + dyid + order by kc.kcxlid asc + + ]]> + + + dyid) + <@p p=" AND %s" f="addusercode=?">usercode + ]]> + + + + dyid + order by dy.id asc) a left join et_train_ipdy_kc_sel dykc on(a.dyid=dykc.dyid and a.id=dykc.kcid) + group by a.id order by a.kcxlid asc + + ]]> + + + + + id + <@p p=" AND %s" f="%S LIKE ?">name + ]]> + + ipyid + ]]> + + + + + id + <@p p="AND (%s)">jhmc + <@p p="AND (%s)">status + ]]> + + ipfid + <@p p="AND (%s)">groupid + order by etsort asc + ]]> + ipfid) + <@p p="AND groupid IN(%s)" f="?">groupid + ]]> + + + + + name +<@p p="and (ipgroup.groupid= ?">groupid +or ipgroup.groupid='0') and <@p f="?">groupid + not in(select addgroupid from et_train_ipdy_kc_sel ipsel where ipsel.dyid=ipdy.id) + ]]> + + + dyid +<@p p="and (ipgroup.groupid= ?">groupid + or ipgroup.groupid='0') + ]]> + + ipid +<@p p="and (ipgroup.groupid= ?">groupid +or ipgroup.groupid='0') and <@p f="?">groupid + not in(select addgroupid from et_train_ipgroup ipg where ipg.ipid=ip.id ) + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_instituteplan_bg.map.xml b/WEB-INF/mapping/et_train_instituteplan_bg.map.xml new file mode 100644 index 0000000..3d54c2a --- /dev/null +++ b/WEB-INF/mapping/et_train_instituteplan_bg.map.xml @@ -0,0 +1,30 @@ + + + + id + <@p p="and addgroupname like ?">addgroupname + <@p p="and status = ?">status + <@p p="and addgroupid = ?">addgroupid + <@p p="and addgroupid in(%s)" f="?">groupidarray + <@p p="and addusercode = ?">addusercode + <@p p="and sld = ?">sld + ]]> + + bgid + <@p p="AND (%s)">lx + order by etsort asc + ]]> + + ipfid + order by addtime desc + limit 1 + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_kc.map.xml b/WEB-INF/mapping/et_train_kc.map.xml new file mode 100644 index 0000000..cf2f098 --- /dev/null +++ b/WEB-INF/mapping/et_train_kc.map.xml @@ -0,0 +1,324 @@ + + + groupid + <@p p="AND (%s)">sfwp + <@p p="AND (jhly='sj' or groupid=%s)" f="?">filter1 + <@p p="AND groupid=%s" f="?">filter2 + <@p p="AND 1=%s" f="?">filter3 + <@p p="and id in (%s)" f="?">idarr + order by nd desc + ]]> + + + + + + filter1 + <@p p="AND groupid=%s" f="?">filter2 + <@p p="AND 1=%s" f="?">filter3 + <@p p="or jhly=%s" f="?">jhly + order by convert(kcmc using gbk) + ]]> + + + filter1 + <@p p="AND groupid=%s" f="?">filter2 + <@p p="AND 1=%s" f="?">filter3 + order by convert(kcmc using gbk) + ]]> + + + sfwp + <@p p=" AND (%s)">groupid + <@p p=" AND (%s)">nd + <@p p=" and jhly IN(%s)" f="?">jhlyarr + order by nd desc + ]]> + + + sfwp + <@p p=" AND (%s)">groupid + <@p p=" AND (%s)">nd + <@p p=" AND (%s)">jhly + and id not in(SELECT + a.kcmcid + FROM + et_train_pd_cc a + LEFT JOIN et_train_pd_cc_pg b ON a.id = b.ccid + LEFT JOIN et_train_pd_cc_pgwjyxx c ON c.pgID = b.id + WHERE + + IF( + et_train_kc_all.nd >= 2023, + c.`status` = 2, + IF + ( c.`status` IS NOT NULL, c.`status` = 2, b.`status` = 1 ) + )) + ]]> + + + + + + + + + + + + + nd and <@p>groupid and jhly = 'bmn' and sfwp = '否') year_inplan_unout_num, + + ( SELECT + count( * ) + FROM + et_train_kc_all + WHERE + <@p>nd + and <@p>groupid + AND jhly = 'bmn' + AND sfwp = '否' + AND id IN ( + SELECT + a.kcmcid + FROM + et_train_pd_cc a + LEFT JOIN et_train_pd_cc_pg b ON a.id = b.ccid + LEFT JOIN et_train_pd_cc_pgwjyxx c ON c.pgID = b.id + WHERE + 1 = 1 + AND + IF + ( + et_train_kc_all.nd >= 2023, + c.`status` = 2, + IF + ( c.`status` IS NOT NULL, c.`status` = 2, b.`status` = 1 ) + ) + ) + ) inplan_unout_num, + + + (select count(*) from et_train_pd_cc_user where istrain = '1' and ccid in (select a.id from et_train_pd_cc a LEFT JOIN et_train_pd_cc_pg b ON a.id = b.ccid LEFT JOIN et_train_pd_cc_pgwjyxx c ON c.pgID = b.id LEFT JOIN et_train_kc_all d ON a.kcmcid=d.id where <@p p=" a.addgroupid = %s " f=" ? ">groupid and IF + ( + d.nd >= 2023, + c.`status` = 2, + IF + ( c.`status` IS NOT NULL, c.`status` = 2, b.`status` = 1 ) + ) + <@p p="AND d.nd = ?">nd + <@p p="AND d.groupid = ?">groupid + AND d.jhly = 'bmn' + AND d.sfwp = '否' + )) inplan_unout_person, + + + ( SELECT + sum( a.pxxsh ) + FROM + et_train_pd_cc a + LEFT JOIN et_train_pd_cc_pg b ON a.id = b.ccid + LEFT JOIN et_train_pd_cc_pgwjyxx c ON c.pgID = b.id + LEFT JOIN et_train_kc_all d ON a.kcmcid = d.id + WHERE + <@p p=" a.addgroupid = %s " f=" ? ">groupid + AND + IF + ( + d.nd >= 2023, + c.`status` = 2, + IF + ( c.`status` IS NOT NULL, c.`status` = 2, b.`status` = 1 ) + ) + <@p p="AND d.nd = ?">nd + <@p p="AND d.groupid = ?">groupid + AND d.jhly = 'bmn' + AND d.sfwp = '否' + ) inplan_unout_hour, + + (SELECT count(*) FROM et_train_ot WHERE <@p p=" addgroupid = %s " f=" ? ">groupid and `status`='5' and delstatus="0" and not exists (select 1 from et_train_ot_pxdj b where et_train_ot.id = b.otid and b.`status`!="4") AND EXISTS ( SELECT 1 FROM et_train_ot_pxdj b WHERE et_train_ot.id = b.otid AND b.`status` = "4" )AND wpid IN ( SELECT id FROM et_train_kc_all WHERE <@p>nd and <@p>groupid AND jhly = 'bmn' AND sfwp = '是' ) )inplan_out_num, + (select count(*) from et_train_ot_xy where otid in (select id from et_train_ot where <@p p=" addgroupid = %s " f=" ? ">groupid and `status`='5' and delstatus="0" and not exists (select 1 from et_train_ot_pxdj b where et_train_ot.id = b.otid and b.`status`!="4") AND EXISTS ( SELECT 1 FROM et_train_ot_pxdj b WHERE et_train_ot.id = b.otid AND b.`status` = "4" )and wpid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmn' and sfwp = '是'))) inplan_out_person, + + ( SELECT + count( * ) + FROM + et_train_kc_all + WHERE + <@p>nd + and <@p>groupid + AND jhly = 'bmw' + AND sfwp = '否' + AND id IN ( + SELECT + a.kcmcid + FROM + et_train_pd_cc a + LEFT JOIN et_train_pd_cc_pg b ON a.id = b.ccid + LEFT JOIN et_train_pd_cc_pgwjyxx c ON c.pgID = b.id + WHERE + 1 = 1 + AND + IF + ( + et_train_kc_all.nd >= 2023, + c.`status` = 2, + IF + ( c.`status` IS NOT NULL, c.`status` = 2, b.`status` = 1 ) + ) + ) + )outplan_unout_num, + (select count(*) from et_train_pd_cc_user where istrain = '1' and ccid in (select a.id from et_train_pd_cc a LEFT JOIN et_train_pd_cc_pg b ON a.id = b.ccid LEFT JOIN et_train_pd_cc_pgwjyxx c ON c.pgID = b.id LEFT JOIN et_train_kc_all d ON a.kcmcid=d.id where <@p p=" a.addgroupid = %s " f=" ? ">groupid and IF + ( + d.nd >= 2023, + c.`status` = 2, + IF + ( c.`status` IS NOT NULL, c.`status` = 2, b.`status` = 1 ) + ) + <@p p="AND d.nd = ?">nd + <@p p="AND d.groupid = ?">groupid + AND d.jhly = 'bmw' + AND d.sfwp = '否' + )) outplan_unout_person, + ( SELECT + sum( a.pxxsh ) + FROM + et_train_pd_cc a + LEFT JOIN et_train_pd_cc_pg b ON a.id = b.ccid + LEFT JOIN et_train_pd_cc_pgwjyxx c ON c.pgID = b.id + LEFT JOIN et_train_kc_all d ON a.kcmcid = d.id + WHERE + <@p p=" a.addgroupid = %s " f=" ? ">groupid + AND + IF + ( + d.nd >= 2023, + c.`status` = 2, + IF + ( c.`status` IS NOT NULL, c.`status` = 2, b.`status` = 1 ) + ) + <@p p="AND d.nd = ?">nd + <@p p="AND d.groupid = ?">groupid + AND d.jhly = 'bmw' + AND d.sfwp = '否' + ) outplan_unout_hour, + + (SELECT count(*) FROM et_train_ot WHERE <@p p=" addgroupid = %s " f=" ? ">groupid and `status`='5' and delstatus="0" and not exists (select 1 from et_train_ot_pxdj b where et_train_ot.id = b.otid and b.`status`!="4") AND EXISTS ( SELECT 1 FROM et_train_ot_pxdj b WHERE et_train_ot.id = b.otid AND b.`status` = "4" )AND wpid IN ( SELECT id FROM et_train_kc_all WHERE <@p>nd and <@p>groupid AND jhly = 'bmw' AND sfwp = '是' ) )outplan_out_num, + (select count(*) from et_train_ot_xy where otid in (select id from et_train_ot where <@p p=" addgroupid = %s " f=" ? ">groupid and `status`='5' and delstatus="0" and not exists (select 1 from et_train_ot_pxdj b where et_train_ot.id = b.otid and b.`status`!="4") AND EXISTS ( SELECT 1 FROM et_train_ot_pxdj b WHERE et_train_ot.id = b.otid AND b.`status` = "4" ) and wpid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmw' and sfwp = '是'))) outplan_out_person + ]]> + + + + nd and <@p>groupid and jhly = 'bmn' and sfwp = '否') year_inplan_unout_num, + (select count(*) from (select * from et_train_pd_cc where <@p p=" addgroupid = %s " f=" ? ">groupid and status = '2' and kcmcid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmn' and sfwp = '否') group by kcmcid ) e) inplan_unout_num, + (select count(*) from et_train_pd_cc_user where istrain = '1' and ccid in (select id from et_train_pd_cc where <@p p=" addgroupid = %s " f=" ? ">groupid and status = '2' and kcmcid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmn' and sfwp = '否'))) inplan_unout_person, + (select sum(pxxsh) from et_train_pd_cc where <@p p=" addgroupid = %s " f=" ? ">groupid and status = '2' and kcmcid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmn' and sfwp = '否')) inplan_unout_hour, + (select count(*) from (select * from et_train_ot where <@p p=" addgroupid = %s " f=" ? ">groupid and wpid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmn' and sfwp = '是') group by wpid) d) inplan_out_num, + (select count(*) from et_train_ot_xy where otid in (select id from et_train_ot where <@p p=" addgroupid = %s " f=" ? ">groupid and wpid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmn' and sfwp = '是'))) inplan_out_person, + (select count(*) from et_train_pd_cc where <@p p=" addgroupid = %s " f=" ? ">groupid and status = '2' and kcmcid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmw' and sfwp = '否')) outplan_unout_num, + (select count(*) from et_train_pd_cc_user where istrain = '1' and ccid in (select id from et_train_pd_cc where <@p p=" addgroupid = %s " f=" ? ">groupid and status = '2' and kcmcid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmw' and sfwp = '否'))) outplan_unout_person, + (select sum(pxxsh) from et_train_pd_cc where <@p p=" addgroupid = %s " f=" ? ">groupid and status = '2' and kcmcid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmw' and sfwp = '否')) outplan_unout_hour, + (select count(*) from (select * from et_train_ot where <@p p=" addgroupid = %s " f=" ? ">groupid and wpid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmw' and sfwp = '是') group by wpid) c) outplan_out_num, + (select count(*) from et_train_ot where <@p p=" addgroupid = %s " f=" ? ">groupid and wpid in (select id from et_train_kc_all where <@p>nd and <@p>groupid and jhly = 'bmw' and sfwp = '是')) outplan_out_person + ]]> + + + groupid + <@p p=" AND (%s)">nd and jhly='bmn' and sfwp='否')a, + (select count(*) wwc from et_train_kc where 1=1 + <@p p=" AND (%s)">groupid + <@p p=" AND (%s)">ndand jhly='bmn' and sfwp='否' and id not in(select kcmcid from et_train_pd_cc where kcmcid is not null group by kcmcid )) b, + (select count(*) bmw from et_train_kc where 1=1 + <@p p=" AND (%s)">groupid + <@p p=" AND (%s)">nd and jhly='bmw' and sfwp='否' and id in(select kcmcid from et_train_pd_cc where kcmcid is not null group by kcmcid )) c, + (select count(*) wp from et_train_kc where 1=1 + <@p p=" AND (%s)">groupid + <@p p=" AND (%s)">nd and sfwp='是' ) d + + ]]> + + + + + + + + + + + + + + + + + + + 0 and datediff(enddate,curdate()) > 0 and state <> '已撤销' + ]]> + + + = 0 and state <> '已撤销' + ]]> + + + '已撤销' + ]]> + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_outtrain.map.xml b/WEB-INF/mapping/et_train_outtrain.map.xml new file mode 100644 index 0000000..3df0ffc --- /dev/null +++ b/WEB-INF/mapping/et_train_outtrain.map.xml @@ -0,0 +1,127 @@ + + + id + <@p p=" AND (%s)" s=" or" f="%S LIKE ?">pxmc,kcmc,addgroupname + <@p p="AND (%s)">dwxz + <@p p="AND (%s)">status + <@p p="AND (%s)">delstatus + <@p p="and UPPER(sld) = ?">sld + <@p p="and addgroupid = ?">groupid + <@p p="and addgroupid in(%s)" f="?">groupidarray + <@p p="and addusercode = ?">addusercode + <@p p="and pxstarttime >= ?">startdate1 + <@p p="and pxstarttime <= ?">startdate2 + <@p p="and pxendtime >= ?">enddate1 + <@p p="and pxendtime <= ?">enddate2 + ]]> + + usercode ) and ot.pxdjfw='1' +and UPPER(<@p f="?">usercode) not in (select UPPER(pxdj.addusercode) from et_train_ot_pxdj pxdj where ot.id=pxdj.otid) + or 1=<@p f="?">sfgly and ot.pxdjfw='0' and UPPER(ot.addusercode) =UPPER(<@p f="?">usercode) + and UPPER(<@p f="?">usercode) not in (select pxdj.addusercode from et_train_ot_pxdj pxdj where ot.id=pxdj.otid)) + group by ot.id order by ot.addtime desc + ]]> + + usercode and pxdjfw='0' and delstatus=0 and status=5 + and <@p f="?">usercode not in (select pxdj.addusercode from et_train_ot_pxdj pxdj where ot.id=pxdj.otid) + union + select ot.* from et_train_ot ot,et_train_ot_xy xy + where ot.id = xy.otid and <@p p=" xy.usercode= %s" f="?">usercode and pxdjfw='1' and delstatus=0 and status=5 + and <@p f="?">usercode not in (select pxdj.addusercode from et_train_ot_pxdj pxdj where ot.id=pxdj.otid) + ]]> + + pxmc + <@p p="AND otdel.ID IN(%s)" f="?">id + <@p p="AND otdel.status =%s" f="?">status + <@p p="AND otdel.addgroupid =%s" f="?">groupid + <@p p="and otdel.addgroupid in(%s)" f="?">groupidarray + <@p p="AND otdel.addusercode =%s" f="?">addusercode + ]]> + otid + order by etsort asc + ]]> + otid) + ]]> + + + id + ]]> + id + ]]> + id + <@p p="and ot.pxmc like ?">pxmc + and (('0'=<@p f="?">sfsp + and 1=1 + <@p p="AND UPPER(pxdj.addusercode) =UPPER(%s)" f="?">usercode + or '1'=<@p f="?">sfgly + <@p p="AND pxdj.addgroupid =%s" f="?">groupid + and 1=1 ) or (1=1 + <@p p="AND UPPER(pxdj.addusercode) =UPPER(%s)" f="?">usercode + <@p p="AND pxdj.addgroupid =%s" f="?">groupid + <@p p="AND pxdj.status =%s" f="?">status + and '1'=<@p f="?))">sfsp + ]]> + + usercode + <@p p="and pxdj.status = %s" f="?">status + <@p p="and pxdj.addgroupid = %s" f="?">groupid + <@p p="and pxdj.addgroupid in(%s)" f="?">groupidarray + <@p p="and ot.pxmc like ?">pxmc + <@p p="or pxdj.addgroupname like ?">addgroupname + ]]> + + + otid + and ot.pxdjfw='1' + order by xy.etsort asc) +union +(select pxdj.id,ot.addusername username,ot.addusercode,pxdj.status from et_train_ot ot +left join et_train_ot_pxdj pxdj on(ot.id=pxdj.otid and ot.addusercode = pxdj.addusercode) where 1=1 + <@p p="AND ot.id IN(%s)" f="?">otid + and ot.pxdjfw='0') + ]]> + + + id + ]]> + + + delstatus + <@p p="and addgroupid = ?">addgroupid + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_pd.map.xml b/WEB-INF/mapping/et_train_pd.map.xml new file mode 100644 index 0000000..5bfb5e3 --- /dev/null +++ b/WEB-INF/mapping/et_train_pd.map.xml @@ -0,0 +1,519 @@ + + + id + <@p p="AND (%s)" s=" OR" f="%S LIKE ?">kcmc,bjmc,addgroupname + <@p p="AND %s">addusercode + <@p p="AND %s">kcmcid + <@p p="AND %s">addgroupid + <@p p="AND %s">status + <@p p="AND status in (%s)" f="?">audit_status + + ]]> + spusercode + GROUP BY cc.id + + ]]> + + addusercode + <@p p="and (kcmc like ? ">kcmc + <@p p="or bjmc like ? ">bjmc + <@p p="or addgroupname like ? )">addgroupname + ]]> + + ccid + ]]> + + ccid) + ]]> + + + + ccid + <@p p="AND %s">groupid + <@p p="AND %s">addgroupid + <@p p="and (username like ? ">key + <@p p="or usercode like ? )">key + order by num + ]]> + + ccid) + ]]> + + + + id + <@p p="AND (%s)" s=" OR" f="%S LIKE ?">pgwjmc,addgroupname,ccname + <@p p="AND addgroupid=%s" f="?">filter2 + <@p p="AND 1=%s" f="?">filter3 + <@p p="AND addusercode = %s" f="?">addusercode + ]]> + + pgid + order by tmsort + ]]> + + pgid) + ]]> + + + id + <@p p="AND (%s)" s=" OR" f="UPPER(%S) LIKE ?">username + <@p p="AND %s" f="%S LIKE ?">coursename + <@p p="AND addorgid=%s" f="?">filter2 + <@p p="AND 1=%s" f="?">filter3 + <@p p="AND UPPER(%s)">usercode + <@p p="AND %s">paperid + <@p p="AND paperid in (%s)" f="?">exam_ids + <@p p=" and (coursename like ? ">key + <@p p=" or username like ? ">key + <@p p=" or usercode like ? )">key + <@p p=" and coursename=%s" f="?">course_name + <@p p=" and zs_type=%s" f="?">zs_type + ]]> + + ids) + ]]> + + + ids) + ]]> + + + groupid + <@p p="AND (%s)" s="OR" f="%S LIKE ?">kcmc,bjmc,groupname + <@p p="AND 1=%s" f="?">filter + ) t + ]]> + + groupid) + <@p p="AND (%s)" s="OR" f="%S LIKE ?">kcmc,bjmc + <@p p="AND 1=%s" f="?">filter + ]]> + + groupid) + ]]> + + ccid + and groupid=<@p f="?">groupid + ]]> + + ccid + and groupid=<@p f="?">groupid + ]]> + + id) + and groupid=<@p f="?">groupid + ]]> + + id) + <@p f = "and groupid = ?">groupid + ]]> + + id) + and groupid=<@p f="?">groupid + ]]> + + + id + ]]> + + id + ]]> + + id + ]]> + + + addusercode + <@p p="AND %s">addgroupid + <@p p=" and bjmc like ? ">bjmc + <@p p="limit ?">limit + ]]> + + id) + ]]> + + + id) + ]]> + + + id) + ]]> + + + + ccid) +and p.id in (<@p f="?">id) + ]]> + + + + + usercode +<@p p="AND %s" f="%S LIKE ?">pg.pgwjmc + ]]> + + id + ]]> + + + exam_id + group by exam_id, + name, + user_id, + user + <@p p="having sum(user_score)>= %s" f="?">scoreabove ) a + group by user_id + order by user_score desc + ]]> + + createdepartment + order by convert(name using gbk) + ]]> + + codeprefix + and code like <@p f="?">codelike + ]]> + + limitation + ]]> + usercode +<@p p="AND (%s)" s="OR" f="%S LIKE ?">kcmc,bjmc +order by issee desc,addtime desc + ]]> + usercode +<@p p="AND (%s)" s="OR" f="%S LIKE ?">kcmc,bjmc +order by issee desc,addtime desc + ]]> + usercode) +<@p p="AND (%s)" s="OR" f="%S LIKE ?">c.kcmc,c.bjmc +order by u.issee desc,u.addtime desc + ]]> + + id and UPPER(usercode)=UPPER(<@p f="?">usercode) + ]]> + + id + <@p p="AND uid = ?">uid + <@p p="AND usercode = ?">usercode + ]]> + + + + + + + + usercode + ]]> + + usercode + ]]> + + classid and <@p>paperid + order by userstate desc + ]]> + + user_id and file <> '临时文件' + ]]> + + id + ]]> + + + + ccid + ]]> + + ccid and usercode=<@p f="?">usercode + ]]> + + + + + + + + realperiod where <@p>ccid + ]]> + + + classid and <@p>usercode and isanswer = '0' + group by paperid + ]]> + + class_id and <@p p="class_person_id = %s " f="?">usercode + union + select exam_id,name from et_exam_limitation_course co inner join et_exam_exampaper_and_editexampaper a on co.exam_id = a.id + where <@p>course_id and <@p p="course_person_id = %s " f="?">usercode + ) paper + where exam_id not in + (select exam_id from et_exam_usertest where + exam_id in + ( + select exam_id from et_exam_limitation_class + where <@p>class_id and <@p p="class_person_id = %s " f="?">usercode group by exam_id + union + select exam_id from et_exam_limitation_course + where <@p>course_id and <@p p="course_person_id = %s " f="?">usercode group by exam_id + ) and <@p p="user_id = %s " f="?">usercode group by exam_id + ) + + ]]> + + bjmc + ]]> + + name + <@p p=" and %s">addorgid + <@p p=" and %s">addusercode + <@p p=" and %s">zs_type + group by coursename + order by convert(coursename using gbk) + ]]> + + usercode and <@p>username + ]]> + + username + <@p p=" or usercode like ? ">usercode + limit 20 + ]]> + + teacher,teacher_code,teacher_department + group by c.id + ]]> + + id + ]]> + + + + deptcode + <@p p="AND status in (%s)" f="?">status + ]]> + + upid + <@p p="AND name like ?">name + ]]> + + + kcmc + <@p p="AND (%s)" s=" OR" f="UPPER(%S) LIKE ?">name,code + GROUP BY a.id + ]]> + + pgID + + ]]> + classid + + ]]> + id + ) a left join et_train_pd_cc_user b on a.id = b.ccid + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_pd_classopener.map.xml b/WEB-INF/mapping/et_train_pd_classopener.map.xml new file mode 100644 index 0000000..120fed2 --- /dev/null +++ b/WEB-INF/mapping/et_train_pd_classopener.map.xml @@ -0,0 +1,24 @@ + + + card + <@p p=" and %s">person_id + <@p p=" and %s">confirm + <@p p=" and course_name like ? ">course_name + ]]> + card + <@p p=" and %s">person_id + <@p p=" and %s">confirm + <@p p=" and course_name like ? ">course_name + ]]> + + usercode + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_pd_replacestudent.map.xml b/WEB-INF/mapping/et_train_pd_replacestudent.map.xml new file mode 100644 index 0000000..9ebe668 --- /dev/null +++ b/WEB-INF/mapping/et_train_pd_replacestudent.map.xml @@ -0,0 +1,30 @@ + + + card + <@p p="AND status = ?">status + <@p p=" and %s">createdepartment_id + <@p p=" and course like ? ">course + <@p p=" and %s">id + ]]> + + coursearr + <@p p="and %s">course + ]]> + + addusercode + <@p p="and course like ? ">course + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_pd_superiorunittrain.map.xml b/WEB-INF/mapping/et_train_pd_superiorunittrain.map.xml new file mode 100644 index 0000000..8ac6b43 --- /dev/null +++ b/WEB-INF/mapping/et_train_pd_superiorunittrain.map.xml @@ -0,0 +1,15 @@ + + + course_name + ]]> + + course_id + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_plantodo_class.map.xml b/WEB-INF/mapping/et_train_plantodo_class.map.xml new file mode 100644 index 0000000..06b10d6 --- /dev/null +++ b/WEB-INF/mapping/et_train_plantodo_class.map.xml @@ -0,0 +1,17 @@ + + + coursename,classname + ]]> + + ID + ]]> + + classid + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_sp.map.xml b/WEB-INF/mapping/et_train_sp.map.xml new file mode 100644 index 0000000..2735d17 --- /dev/null +++ b/WEB-INF/mapping/et_train_sp.map.xml @@ -0,0 +1,99 @@ + + + id + <@p p="AND (%s)">tname + <@p p="AND (%s)">tid + ]]> + + status + where 1=1 + <@p p="AND ID IN(%s)" f="?">tid + ]]> + + spusercode + union all + select gop.id,kc.kcmc as name,'部门计划外制定' as application,sqdw,sqr,sqtime,lxtel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_gop gop + inner join et_train_gop_kc kc on gop.id = kc.gopid + inner join et_train_sp sp + on gop.id = sp.tid + where <@p>spusercode + union all + select ipgroup.id,ip.name as name,'院级计划制定' as application,ipgroup.addgroupname,ipgroup.addusername,ipgroup.addtime,'无' as tel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_ipgroup ipgroup + inner join et_train_sp sp + on ipgroup.id = sp.tid + inner join et_train_ip ip + on ip.id = ipgroup.ipid + where <@p>spusercode + union all + select bg.id,gip.name as name,'部门计划变更' as application,bg.addgroupname,bg.addusername,bg.addtime,'无' as tel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_gip_bg bg + inner join et_train_sp sp + on bg.id = sp.tid + inner join et_train_gipgroup gipgroup + on bg.gipgid = gipgroup.id + inner join et_train_gip gip + on gip.id = gipgroup.gppid + where <@p>spusercode + union all + select bg.id,ipf.jhmc as name ,'院级计划变更' as application,bg.addgroupname,bg.addusername,bg.addtime,'无' as tel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_ipf_bg bg + inner join et_train_sp sp + on bg.id = sp.tid + inner join et_train_ipf ipf + on ipf.id = bg.ipfid + where <@p>spusercode + union all + select ysgroup.id,ys.name as name ,'部门年度总结' as application,ysgroup.addgroupname,ysgroup.addusername,ysgroup.addtime,'无' as tel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_ysgroup ysgroup + inner join et_train_sp sp + on ysgroup.id = sp.tid + inner join et_train_ys ys + on ys.id = ysgroup.ysid + where <@p>spusercode + union all + select g.id,y.name as name,'院级年度总结' as application,g.addgroupname,g.addusername,g.addtime,'无' as tel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_ysistgroup g + inner join et_train_sp sp + on g.id = sp.tid + inner join et_train_ysist y + on y.id = g.ysid + where <@p>spusercode + union all + select ot.id,ot.pxmc as name,'外派培训' as application,ot.addgroupname,ot.addusername,ot.addtime,ot.lxdh as tel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_ot ot + inner join et_train_sp sp + on ot.id = sp.tid + where <@p>spusercode + union all + select p.id,o.pxmc as name,'外派登记' as application,p.addgroupname,p.addusername,p.addtime,'无' as tel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_ot_pxdj p + inner join et_train_sp sp + on p.id = sp.tid + inner join et_train_ot o + on o.id = p.otid + where <@p>spusercode + union all + select d.id,o.pxmc as name,'外派培训删除' as application,d.addgroupname,d.addusername,d.addtime,'无' as tel,sp.spusername,sp.spdate,sp.yj,sp.spresult,sp.tname,sp.tid + from et_train_ot_del d + inner join et_train_sp sp + on d.id = sp.tid + inner join et_train_ot o + on o.id = d.otid + where <@p>spusercode + + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_statusupdate.xml b/WEB-INF/mapping/et_train_statusupdate.xml new file mode 100644 index 0000000..454610f --- /dev/null +++ b/WEB-INF/mapping/et_train_statusupdate.xml @@ -0,0 +1,16 @@ + + + curentdate + ]]> + + + + curentdate + ]]> + + + \ No newline at end of file diff --git a/WEB-INF/mapping/et_train_yearsummary.map.xml b/WEB-INF/mapping/et_train_yearsummary.map.xml new file mode 100644 index 0000000..c371fff --- /dev/null +++ b/WEB-INF/mapping/et_train_yearsummary.map.xml @@ -0,0 +1,123 @@ + + + + + id + <@p p=" AND %s" f="%S LIKE ?">name + ]]> + + ysid + order by etsort asc + ]]> + ysid) + ]]> + + + + id + <@p p="and ys.name like ?">name + <@p p="or ysgg.addgroupname like ?">addgroupname + <@p p="and ysgg.status = ?">status + <@p p="and ysgg.addgroupid = ?">groupid + <@p p="and ysgg.addgroupid in(%s)" f="?">groupidarray + <@p p="and ysgg.addusercode = ?">usercode + ]]> + + ysgid + order by etsort asc + ]]> + ysgid) + ]]> + + + + + id + <@p p=" AND %s" f="%S LIKE ?">name + ]]> + + ysid + order by etsort asc + ]]> + ysid) + ]]> + + + + id + <@p p="and ys.name like ?">name + <@p p="or ysgg.addgroupname like ?">addgroupname + <@p p="and ysgg.status = ?">status + <@p p="and ysgg.addgroupid = ?">groupid + <@p p="and addgroupid in(%s)" f="?">groupidarray + <@p p="and ysgg.addusercode = ?">usercode + ]]> + + ysgid + order by etsort asc + ]]> + ysgid) + ]]> + + + + groupid +or ysgroup.groupid='0') and <@p f="?">groupid + not in(select addgroupid from et_train_ysgroup ysg where ysg.ysid=ys.id ) + ]]> + + + groupid +or ysgroup.groupid='0') and <@p f="?">groupid + not in(select addgroupid from et_train_ysistgroup ysg where ysg.ysid=ys.id ) + ]]> + + ysid and groupid = '0' + ]]> + + ysid + and groupid not in (select addgroupid from et_train_ysgroup where <@p>ysid and status = '3') + union all + select addgroupname,'已填报' detail from et_train_ysgroup where <@p>ysid and status = '3' + ]]> + + ysid and status = '3') + union all + select addgroupname,'已填报' detail from et_train_ysgroup where <@p>ysid and status = '3' + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_feedback.map.xml b/WEB-INF/mapping/jcdp_sys_feedback.map.xml new file mode 100644 index 0000000..53d1f9f --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_feedback.map.xml @@ -0,0 +1,11 @@ + + + id + <@p p=" AND (%s)" f="%S LIKE ?">username + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_log.map.xml b/WEB-INF/mapping/jcdp_sys_log.map.xml new file mode 100644 index 0000000..84cd202 --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_log.map.xml @@ -0,0 +1,40 @@ + + + cascade_id + <@p p=" AND SLOG.loginname=?">loginname1 + <@p p=" AND (%s)" s=" OR " f="SLOG.%S LIKE ?">sessionid,loginname,username + ]]> + + receiverid +<@p p=" AND list.MSGSTATUS=?">msgstatus +<@p p=" AND list.MSGTYPE=?">msgtype + <@p p=" AND (%s)" s=" OR " f="list.%S LIKE ?">msgtitle,msgcontent,username,usercode + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_message.map.xml b/WEB-INF/mapping/jcdp_sys_message.map.xml new file mode 100644 index 0000000..ffa1209 --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_message.map.xml @@ -0,0 +1,40 @@ + + + receiverid +<@p p=" AND list.MSGSTATUS=?">msgstatus +<@p p=" AND list.MSGTYPE=?">msgtype + <@p p=" AND (%s)" s=" OR " f="list.%S LIKE ?">msgtitle,msgcontent,username,usercode + ]]> + receiverid +<@p p=" AND rece.MSGSTATUS=?">msgstatus +<@p p=" AND cont.MSGTYPE=?">msgtype + ]]> + msgid + ]]> + msgstatus,readtime WHERE ID IN(<@p f="?">id) + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_module.map.xml b/WEB-INF/mapping/jcdp_sys_module.map.xml new file mode 100644 index 0000000..a953bd9 --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_module.map.xml @@ -0,0 +1,92 @@ + + + id + <@p p=" AND %s">parent_id + <@p p=" AND MODULETYPE in (%s)" f="?">moduletype + <@p p=" AND %s" f="%S LIKE ?">cascade_id + <@p p=" AND (%s)" s=" OR" f="%S LIKE ?">name,href + ]]> + + moduletype + ]]> + + id + <@p p=" AND %s">parent_id,name,href + <@p p=" AND MODULETYPE in (%s)" f="?">moduletype + ]]> + + id + <@p p=" AND %s">parent_id,name,href + <@p p=" AND MODULETYPE in (%s)" f="?">moduletype + ]]> + + cascade_id + <@p p=" AND %s" f="cascade_id <> ?">cascade_id1 + ]]> + + id) + ) + ]]> + + 5 + ]]> + + moduletype + order by sort_no asc + ]]> + + id + <@p p=" AND %s">parent_id + <@p p=" AND MODULETYPE in (%s)" f="?">moduletype + <@p p=" AND %s" f="%S LIKE ?">cascade_id + <@p p=" AND (%s)" s=" OR" f="%S LIKE ?">name,href + ORDER BY SORT_NO ASC,MODULETYPE ASC,NAME asc,ACTIONVALUE asc + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_org.map.xml b/WEB-INF/mapping/jcdp_sys_org.map.xml new file mode 100644 index 0000000..63b36ec --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_org.map.xml @@ -0,0 +1,79 @@ + + + id + <@p p=" AND %s">parent_id + <@p p=" AND %s" f="cascade_id LIKE ?">cascade_id + <@p p=" AND (%s)" s=" OR" f="%S LIKE ?">name + ]]> + + cascade_id + <@p p=" AND %s" f="cascade_id <> ?">cascade_id1 + order by sort_no asc + ]]> + + id) + ) + ]]> + + userid + <@p p=" AND %s" f="UO.%S=?">is_default_org + ORDER BY UO.IS_DEFAULT_ORG DESC + ]]> + + id +AND( + SELECT + a.ct + FROM + ( + SELECT + count(*) AS ct + FROM + JCDP_SYS_ORG JSO + WHERE + <@p f="JSO.%S=?">parent_id + ) a +) = 0 + ]]> + id) order by CASCADE_ID desc + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_role.map.xml b/WEB-INF/mapping/jcdp_sys_role.map.xml new file mode 100644 index 0000000..30af5db --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_role.map.xml @@ -0,0 +1,67 @@ + + + id + <@p p=" AND (%s)" s=" OR" f="%S LIKE ?">name,username,loginname + <@p p=" AND (ROLETYPE=2 and %s)" f="rol.%S=?">creater_id + <@p p=" AND (ROLETYPE=2 and %s)" f="org.%S like ?">cascade_id + ]]> + + status + WHERE id in(<@p f="?">id) + ]]> + + 2 and USR.ID NOT IN (SELECT USERID FROM JCDP_SYS_USER_ROLE WHERE <@p>roleid) + <@p p=" AND %s" f="ORG.ID=?">orgid + <@p p=" AND %s" f="ORG.%S LIKE ?">cascade_id + <@p p=" AND (%s)" s=" OR " f="USR.%S LIKE ?">loginname,username + ) + ]]> + + roleid + <@p p=" AND (%s)" s=" OR " f="USR.%S LIKE ?">loginname,username + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_role_module.map.xml b/WEB-INF/mapping/jcdp_sys_role_module.map.xml new file mode 100644 index 0000000..1cdc8d7 --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_role_module.map.xml @@ -0,0 +1,12 @@ + + + roleid + ]]> + + roleid + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_session.map.xml b/WEB-INF/mapping/jcdp_sys_session.map.xml new file mode 100644 index 0000000..445139d --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_session.map.xml @@ -0,0 +1,21 @@ + + + sessionstate,invalidtime WHERE <@p>sessionid + ]]> + cascade_id + <@p p=" AND sessloginname=?">loginname1 + <@p p=" AND %s">sessionstate + <@p p=" AND (%s)" s=" OR " f="sess.%S LIKE ?">loginname,username + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_task.map.xml b/WEB-INF/mapping/jcdp_sys_task.map.xml new file mode 100644 index 0000000..80383d8 --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_task.map.xml @@ -0,0 +1,60 @@ + + + applyFinish +<@p p=" AND oper.ISFINISH=?">taskFinish +<@p p=" AND oper.%S">taskuserid + <@p p=" AND (%s)" s=" OR " f="%S LIKE ?">username,usercode,applytitle + ]]> + applyerid + <@p p=" AND %S">isfinish + <@p p=" AND (%s)" s=" OR " f="%S LIKE ?">applytitle + ]]> + taskid +<@p p=" AND oper.%S">taskstatus + ]]> + taskid +<@p p=" AND op.%S">taskuserid + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_user.map.xml b/WEB-INF/mapping/jcdp_sys_user.map.xml new file mode 100644 index 0000000..274444a --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_user.map.xml @@ -0,0 +1,197 @@ + + + 2 + <@p p=" AND %s" f="USR1.ID=?">userid + <@p p=" AND %s" f="ORG.ID=?">orgid + <@p p=" AND %s" f="ORG.%S LIKE ?">cascade_id + <@p p=" AND (%s)" s=" OR " f="USR1.%S LIKE ?">loginname,username + ) + ]]> + id) + ]]> + userid ORDER BY UO.IS_DEFAULT_ORG DESC + ]]> + + userid + ]]> + userid + ]]> + userid ORDER BY UO.IS_DEFAULT_ORG DESC + ]]> + + userid + ]]> + loginname + <@p p=" or ext.MOBILE=?)">mobile + <@p p=" AND usr.%s">password + and DELETE_FLAG=0 + ]]> + + status + WHERE id in(<@p f="?">id) + ]]> + + password + WHERE id in(<@p f="?">id) + ]]> + + userid + ) + <@p p=" AND (%s)" s=" OR " f="rol.%S LIKE ?">name + <@p p=" AND (ROL.ROLETYPE in(0,1) or (ROL.ROLETYPE=2 and %s))" f="rol.%S=?">creater_id + <@p p=" AND (ROL.ROLETYPE in(0,1) or (ROL.ROLETYPE=2 and %s))" f="org.%S like ?">cascade_id + ]]> + + userid + <@p p=" AND (%s)" s=" OR " f="RO.%S LIKE ?">name + ]]> + userid + ) + UNION ALL + ( + SELECT + ACTIONVALUE, + ACTIONOP_JSON + FROM + JCDP_SYS_ROLE_MODULE RM + LEFT JOIN JCDP_SYS_USER_ROLE UR ON UR.ROLEID = RM.ROLEID + LEFT JOIN JCDP_SYS_ROLE ROLE ON ROLE.ID=UR.ROLEID + WHERE ROLE.STATUS=1 + <@p p=" and %s" f="UR.USERID=?">userid1 + ) + ]]> + + delete_flag WHERE ID IN(<@p f="?">id) + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_user_module.map.xml b/WEB-INF/mapping/jcdp_sys_user_module.map.xml new file mode 100644 index 0000000..5f80b81 --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_user_module.map.xml @@ -0,0 +1,7 @@ + + + userid + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_user_org.map.xml b/WEB-INF/mapping/jcdp_sys_user_org.map.xml new file mode 100644 index 0000000..a0862bd --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_user_org.map.xml @@ -0,0 +1,15 @@ + + + userid) + ]]> + + userId + ]]> + + userId,orgId + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_sys_user_role.map.xml b/WEB-INF/mapping/jcdp_sys_user_role.map.xml new file mode 100644 index 0000000..0201747 --- /dev/null +++ b/WEB-INF/mapping/jcdp_sys_user_role.map.xml @@ -0,0 +1,23 @@ + + + roleid + <@p p=" AND USERID in (%s)" f="?">userid + ]]> + + userid + <@p p=" AND ROLEID in (%s)" f="?">roleid + ]]> + + userid) + ]]> + + roletype WHERE id IN(<@p f="?">id) + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/jcdp_task.map.xml b/WEB-INF/mapping/jcdp_task.map.xml new file mode 100644 index 0000000..afbea86 --- /dev/null +++ b/WEB-INF/mapping/jcdp_task.map.xml @@ -0,0 +1,12 @@ + + + taskuserid + order by jtl.applytime asc + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/parameter.map.xml b/WEB-INF/mapping/parameter.map.xml new file mode 100644 index 0000000..a02a044 --- /dev/null +++ b/WEB-INF/mapping/parameter.map.xml @@ -0,0 +1,34 @@ + + + id + <@p p="AND %s" f="JSP.%S = ?">category +<@p p="AND (%s)" s=" OR" f="UPPER(JSP.%S) LIKE ?">name,keykey + ]]> + + + + keykey + <@p p="AND %s" f="JSP.%S<>?">id + ]]> + + + name,value,note) + VALUES(<@p f="?">id,keykey,value,name,value,note) + ]]> + + + id) + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/pd_query.map.xml b/WEB-INF/mapping/pd_query.map.xml new file mode 100644 index 0000000..a5d79da --- /dev/null +++ b/WEB-INF/mapping/pd_query.map.xml @@ -0,0 +1,247 @@ + + + 0 then "未完成" else "完成" end) coursefinish, + (case cc.jhly when "bmn" then "部门级计划内" when "bmw" then "部门级计划外" when "sj" then "院级" end) jhly, + cc.bjmc, + (case when cc.realteacher is not null and cc.realteacher!="" then "完成" else "未完成" end) classfinish, + cc.bjlb, + cc.addgroupname, + uc.jhrs, + cc.starttime, + cc.endtime, + cc.sfbfzs, + cc.pxxsh, + cc.pxxs, + cc.sfkh, + (case cc.sfkh when "是" then cc.khlx when "否" then "无" end) khlx, + (case cc.sfkh when "是" then cc.khfs when "否" then "无" end) khfs, + cc.teacher, + cc.realteacher, + cc.teacher_code, + cc.teacher_department, + cc.price, + (case cc.status when -1 then "被驳回" when 0 then "未开班" when 1 then "已下发" when 2 then "已开班" when 3 then "待审核" end) ccstatus, + pg.pgwjmc, + (case pg.status when 0 then "未发布" when 1 then "已发布" end) pgstatus, + ecc.name, + ecc.startdate, + ecc.enddate, + ecc.state, + fcc.title, + fcc.uploadtime + from et_train_pd_cc cc left join et_train_pd_cc_pg pg on cc.id=pg.ccid + left join et_train_pd_cc_pgwjyxx yxx on pg.id = yxx.pgID + left join (select kcmcid,count(*) nofinishcount from et_train_pd_cc where realteacher is null or realteacher="" group by kcmcid) tab1 on tab1.kcmcid=cc.kcmcid + left join (select exam.name,exam.startdate,exam.enddate,exam.state,class.class_id as c_id from et_exam_exampaper_and_editexampaper exam + inner join et_exam_limitation_class class on exam.id = class.exam_id group by exam.id + union all + select exam.name,exam.startdate,exam.enddate,exam.state,course.course_id as c_id from et_exam_exampaper_and_editexampaper exam + inner join et_exam_limitation_course course on exam.id = course.exam_id group by exam.id + ) ecc on ecc.c_id = cc.id or ecc.c_id = cc.kcmcid + left join ( + SELECT + file.title, + file.uploadtime, + course.course_id AS f_id +FROM + et_resource_file file + inner JOIN (select a.file_id,b.course_id from et_resource_limitation a left join et_resource_limitation_course b on a.id=b.limitation_id GROUP BY b.course_id) course on course.file_id = file.id + union all +SELECT + file.title, + file.uploadtime, + class.class_id AS f_id +FROM + et_resource_file file + inner JOIN (select a.file_id,b.class_id from et_resource_limitation a left join et_resource_limitation_class b on a.id=b.limitation_id GROUP BY b.class_id) class on class.file_id = file.id + ) fcc on fcc.f_id = cc.id or fcc.f_id = cc.kcmcid + left join (select cc.id,count(*) jhrs FROM et_train_pd_cc cc left join et_train_pd_cc_user ccu on cc.id = ccu.ccid group by cc.id) uc on cc.id = uc.id + where 1=1 + <@p p=" and cc.addgroupid = %s" f="?">addgroupid + <@p p=" and cc.addusercode = %s" f="?">addusercode + <@p p=" and (kcmc like ?">kcmc + <@p p=" or bjmc like ?">bjmc + <@p p=" or cc.addgroupname like ?">addgroupname + <@p p=" or cc.teacher like ?">teacher + <@p p=" or cc.realteacher like ?">realteacher + <@p p=" or cc.teacher_code like ?">teacher_code + <@p p=" or starttime like binary ?">starttime + <@p p=" or endtime like binary ? )">endtime + ) a + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + addgroupid + <@p p=" and cc.addusercode = %s" f="?">addusercode + <@p p="AND (%s)" s="OR" f="%S LIKE ?">kcmc,bjmc,addgroupname + <@p p="and starttime >= ?">startdate1 + <@p p="and starttime <= ?">startdate2 + <@p p="and endtime >= ?">enddate1 + <@p p="and endtime <= ?">enddate2 + order by convert(starttime using gbk) desc + ]]> + + addgroupid + <@p p=" and cc.addusercode = %s" f="?">addusercode + <@p p="AND (%s)" s="OR" f="%S LIKE ?">kcmc,bjmc + ]]> + + addgroupid +<@p p=" and tab1.addusercode = %s" f="?">addusercode +<@p p="AND (%s)" s="OR" f="%S LIKE ?">kcmc,bjmc +group by kcmcid,ccid,uid) tab11 +group by kcmcid,ccid +order by kcmc,bjmc + ]]> + \ No newline at end of file diff --git a/WEB-INF/mapping/user_info.map.xml b/WEB-INF/mapping/user_info.map.xml new file mode 100644 index 0000000..880fffd --- /dev/null +++ b/WEB-INF/mapping/user_info.map.xml @@ -0,0 +1,29 @@ + + + id + <@p p="AND (%s)" s=" OR" f="UPPER(%S) LIKE ?">username,note + ]]> + + + id + <@p p="AND (%s)" s=" OR" f="UPPER(%S) LIKE ?">username,note + ]]> + + id]]> + + username,status,note + WHERE <@p>id + ]]> + + + username,status,note) + VALUES(<@p f="?">id,username,status,note) + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/v_class_user.map.xml b/WEB-INF/mapping/v_class_user.map.xml new file mode 100644 index 0000000..ae1c907 --- /dev/null +++ b/WEB-INF/mapping/v_class_user.map.xml @@ -0,0 +1,87 @@ + + + + addgroupid + + <@p p=" or jhly = (%s)" f="?">jhly + order by convert(classname using gbk) + ) as a where 1=1 + <@p p="AND classname like ?">classname + ]]> + + addusercode + <@p p="AND classname like ?">classname + order by convert(classname using gbk) + ]]> + + groupid + <@p p=" or jhly = (%s)" f="?">jhly + ) as a where 1=1 + <@p p="AND coursename like ?">coursename + ]]> + + person_id + order by convert(coursename using gbk) + ]]> + + limitation_id as limitation_id,<@p p=" ? ">exam_id as exam_id,coursename,courseid,username,usercode + from v_class_user + where <@p>courseid + ]]> + + limitation_id as limitation_id,<@p p=" ? ">exam_id as exam_id,classname,classid,username,usercode + from (SELECT + `et_train_pd_cc`.`id` AS `classid`, + `et_train_pd_cc`.`bjmc` AS `classname`, + `et_train_pd_cc`.`kcmcid` AS `courseid`, + `et_train_pd_cc`.`kcmc` AS `coursename`, + `et_train_pd_cc_user`.`usercode` AS `usercode`, + `et_train_pd_cc_user`.`username` AS `username`, + `et_train_pd_cc_user`.`groupid` AS `userdeptid`, + `et_train_pd_cc_user`.`groupname` AS `userdeptname` +FROM + ( `et_train_pd_cc` LEFT JOIN `et_train_pd_cc_user` ON ( ( `et_train_pd_cc`.`id` = `et_train_pd_cc_user`.`ccid` ) ) ) + where 1=1 + <@p p="AND `et_train_pd_cc`.`id` = ?">classid + )a + ]]> + + exam_id + ]]> + + exam_id + <@p p="limitation_id in (%s)" f="?">limitation_id + ]]> + + exam_id + <@p p="limitation_id in (%s)" f="?">limitation_id + ]]> + + exam_id_ + where <@p>exam_id + ]]> + + exam_id_ + where <@p>exam_id + ]]> + + \ No newline at end of file diff --git a/WEB-INF/mapping/说明.txt b/WEB-INF/mapping/说明.txt new file mode 100644 index 0000000..e713dfd --- /dev/null +++ b/WEB-INF/mapping/说明.txt @@ -0,0 +1,58 @@ +SQL语句的构建基于FreeMarker模板,即在语句中可以使用FreeMarker支持的所有标签,如<#if>、<#list>以及${expr}等 + +标签格式: + + + 在分页查询时,sqlIdCount中的语句将作为查询所有记录数的语句 + 例: + name,loginname + ]]> + name,loginname + ]]> + 例中的sqlIdCount会在执行sqlId的过程中自动执行,这可在某些复杂语句中提高查询性能 + +自定义标签说明: + 标签:<@p [p="prefix %s"] [s="separator"] [f="format"]>field1,field2,...

+ 作用:检测所传参数中是否包含所列字段field1,field2,...,对检测出的每个字段生成相应的表达式 + 标签参数[p="prefix %s"]:默认为空,表示若所传参数中包含列出的字段,则对处理完成的语句进行格式化,其中%s表示处理完成的语句 + 标签参数[s="separator"]:默认为",",表示各表达式之间的分隔符 + 标签参数[f="format"]:默认为"%S = ?",表达式的格式化字符串,其中%s或%S(大写)表示当前字段的名称,若字符串中包含?,则会将对应参数值添加到语句参数列表 + + 特殊用法1:若所传参数为Collectionname,age

WHERE <@p>id

,传入以下参数: + List param = new ArrayList(); + param.add(new Object[]{"Jack", 27, 1}); + param.add(new Object[]{"Rose", 25, 2}); + data.put("name", param); + data.put("age", param); + data.put("id", param); + 则执行的语句为: + UPDATE TABLE1 SET NAME = ?, AGE = ? WHERE ID = ? + 执行结果为更新两条数据 + + 特殊用法2:若所传参数为Object[],则针对每个数组值生成一次表达式,如: + 对于语句:DELETE FROM TABLE1 WHERE ID IN(<@p f="?">id),传入以下参数: + Object[] param = new Object[]{1, 2, 3}; + data.put("id", param); + 则执行的语句为: + DELETE FROM TABLE1 WHERE ID IN(?, ?, ?) + 执行结果为删除id为1,2,3的数据 + + 示例1:<@p>id + 1.所传参数(HashMap):{},结果:"",语句参数列表:[] + 2.所传参数(HashMap):{id=>37},结果:"ID = ?",语句参数列表:[37] + + 示例2:<@p p="AND (%s)" s=" OR" f="UPPER(%S) LIKE ?">title,content + 1.所传参数(HashMap):{title=>"标题"},结果:"AND UPPER(TITLE) LIKE ?",语句参数列表:["标题"] + 2.所传参数(HashMap):{title=>"标题",content=>"内容"},结果:"AND (UPPER(TITLE) LIKE ? OR UPPER(CONTENT) LIKE ?)",语句参数列表:["标题","内容"] \ No newline at end of file diff --git a/WEB-INF/performance/performanceAnalyze.db b/WEB-INF/performance/performanceAnalyze.db new file mode 100644 index 0000000..47685db Binary files /dev/null and b/WEB-INF/performance/performanceAnalyze.db differ diff --git a/WEB-INF/product_improvement/funcmsg202503.txt b/WEB-INF/product_improvement/funcmsg202503.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202504.txt b/WEB-INF/product_improvement/funcmsg202504.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202505.txt b/WEB-INF/product_improvement/funcmsg202505.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202506.txt b/WEB-INF/product_improvement/funcmsg202506.txt new file mode 100644 index 0000000..6d075ca --- /dev/null +++ b/WEB-INF/product_improvement/funcmsg202506.txt @@ -0,0 +1,4 @@ +315823103,2025-06-24 15:28:40 +315823103,2025-06-26 10:12:32 +315823103,2025-06-26 14:54:32 +315823103,2025-06-26 15:06:32 diff --git a/WEB-INF/product_improvement/funcmsg202507.txt b/WEB-INF/product_improvement/funcmsg202507.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202508.txt b/WEB-INF/product_improvement/funcmsg202508.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202509.txt b/WEB-INF/product_improvement/funcmsg202509.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202510.txt b/WEB-INF/product_improvement/funcmsg202510.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202511.txt b/WEB-INF/product_improvement/funcmsg202511.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202512.txt b/WEB-INF/product_improvement/funcmsg202512.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/funcmsg202601.txt b/WEB-INF/product_improvement/funcmsg202601.txt new file mode 100644 index 0000000..c6d31c2 --- /dev/null +++ b/WEB-INF/product_improvement/funcmsg202601.txt @@ -0,0 +1 @@ +315823103,2026-01-09 08:14:58 diff --git a/WEB-INF/product_improvement/funcmsg202603.txt b/WEB-INF/product_improvement/funcmsg202603.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202503.txt b/WEB-INF/product_improvement/tempmsg202503.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202504.txt b/WEB-INF/product_improvement/tempmsg202504.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202505.txt b/WEB-INF/product_improvement/tempmsg202505.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202506.txt b/WEB-INF/product_improvement/tempmsg202506.txt new file mode 100644 index 0000000..ac8e11d --- /dev/null +++ b/WEB-INF/product_improvement/tempmsg202506.txt @@ -0,0 +1,6 @@ +userTest.cpt,δ¼û,0,2025-06-24 15:26:42 +pgtj.cpt,δ¼û,0,2025-06-26 10:10:33 +pgtj.cpt,δ¼û,0,2025-06-26 10:10:51 +pgtj.cpt,δ¼û,0,2025-06-26 10:11:26 +pgtj.cpt,δ¼û,0,2025-06-26 14:53:41 +pgtj.cpt,δ¼û,0,2025-06-26 15:05:29 diff --git a/WEB-INF/product_improvement/tempmsg202507.txt b/WEB-INF/product_improvement/tempmsg202507.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202508.txt b/WEB-INF/product_improvement/tempmsg202508.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202509.txt b/WEB-INF/product_improvement/tempmsg202509.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202510.txt b/WEB-INF/product_improvement/tempmsg202510.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202511.txt b/WEB-INF/product_improvement/tempmsg202511.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202512.txt b/WEB-INF/product_improvement/tempmsg202512.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202601.txt b/WEB-INF/product_improvement/tempmsg202601.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/product_improvement/tempmsg202603.txt b/WEB-INF/product_improvement/tempmsg202603.txt new file mode 100644 index 0000000..e69de29 diff --git a/WEB-INF/reportlets/WorkBook3.cpt b/WEB-INF/reportlets/WorkBook3.cpt new file mode 100644 index 0000000..d030cd6 --- /dev/null +++ b/WEB-INF/reportlets/WorkBook3.cpt @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
diff --git a/WEB-INF/reportlets/courseName.cpt b/WEB-INF/reportlets/courseName.cpt new file mode 100644 index 0000000..8cbff89 --- /dev/null +++ b/WEB-INF/reportlets/courseName.cpt @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/detailClass.cpt b/WEB-INF/reportlets/detailClass.cpt new file mode 100644 index 0000000..7bdaf4f --- /dev/null +++ b/WEB-INF/reportlets/detailClass.cpt @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/detailCourse.cpt b/WEB-INF/reportlets/detailCourse.cpt new file mode 100644 index 0000000..e9adb16 --- /dev/null +++ b/WEB-INF/reportlets/detailCourse.cpt @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/detailDepartment.cpt b/WEB-INF/reportlets/detailDepartment.cpt new file mode 100644 index 0000000..3dde4ed --- /dev/null +++ b/WEB-INF/reportlets/detailDepartment.cpt @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/detailInstitution.cpt b/WEB-INF/reportlets/detailInstitution.cpt new file mode 100644 index 0000000..9014a17 --- /dev/null +++ b/WEB-INF/reportlets/detailInstitution.cpt @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/detailPerson.cpt b/WEB-INF/reportlets/detailPerson.cpt new file mode 100644 index 0000000..0fe1c16 --- /dev/null +++ b/WEB-INF/reportlets/detailPerson.cpt @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/exam.cpt b/WEB-INF/reportlets/exam.cpt new file mode 100644 index 0000000..def98c9 --- /dev/null +++ b/WEB-INF/reportlets/exam.cpt @@ -0,0 +1,939 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/examResult.cpt b/WEB-INF/reportlets/examResult.cpt new file mode 100644 index 0000000..b2e509c --- /dev/null +++ b/WEB-INF/reportlets/examResult.cpt @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/examdetail.cpt b/WEB-INF/reportlets/examdetail.cpt new file mode 100644 index 0000000..b02369e --- /dev/null +++ b/WEB-INF/reportlets/examdetail.cpt @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/groupinplan_kc.cpt b/WEB-INF/reportlets/groupinplan_kc.cpt new file mode 100644 index 0000000..680b7db --- /dev/null +++ b/WEB-INF/reportlets/groupinplan_kc.cpt @@ -0,0 +1,370 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/groupoutplan_kc.cpt b/WEB-INF/reportlets/groupoutplan_kc.cpt new file mode 100644 index 0000000..5114f12 --- /dev/null +++ b/WEB-INF/reportlets/groupoutplan_kc.cpt @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/instituteplan_kc.cpt b/WEB-INF/reportlets/instituteplan_kc.cpt new file mode 100644 index 0000000..f11a1ad --- /dev/null +++ b/WEB-INF/reportlets/instituteplan_kc.cpt @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/instituteplan_sj_kc.cpt b/WEB-INF/reportlets/instituteplan_sj_kc.cpt new file mode 100644 index 0000000..3f1ed91 --- /dev/null +++ b/WEB-INF/reportlets/instituteplan_sj_kc.cpt @@ -0,0 +1,325 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/pgdetail.cpt b/WEB-INF/reportlets/pgdetail.cpt new file mode 100644 index 0000000..6412634 --- /dev/null +++ b/WEB-INF/reportlets/pgdetail.cpt @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/pgtj.cpt b/WEB-INF/reportlets/pgtj.cpt new file mode 100644 index 0000000..b312ecf --- /dev/null +++ b/WEB-INF/reportlets/pgtj.cpt @@ -0,0 +1,498 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/planCollection.cpt b/WEB-INF/reportlets/planCollection.cpt new file mode 100644 index 0000000..160c996 --- /dev/null +++ b/WEB-INF/reportlets/planCollection.cpt @@ -0,0 +1,435 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/queryTrainFlow.cpt b/WEB-INF/reportlets/queryTrainFlow.cpt new file mode 100644 index 0000000..9becaef --- /dev/null +++ b/WEB-INF/reportlets/queryTrainFlow.cpt @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + +0 then "未完成" else "完成" end) coursefinish, + (case cc.jhly when "bmn" then "部门级计划内" when "bmw" then "部门级计划外" when "sj" then "院级" end) jhly, + cc.bjmc, + (case when cc.realteacher is not null and cc.realteacher!="" then "完成" else "未完成" end) classfinish, + cc.bjlb, + cc.addgroupname, + uc.jhrs, + cc.starttime, + cc.endtime, + cc.sfbfzs, + cc.pxxsh, + cc.pxxs, + cc.sfkh, + (case cc.sfkh when "是" then cc.khlx when "否" then "无" end) khlx, + (case cc.sfkh when "是" then cc.khfs when "否" then "无" end) khfs, + cc.teacher, + cc.realteacher, + cc.teacher_code, + cc.teacher_department, + cc.price, + (case cc.status when -1 then "被驳回" when 0 then "未开班" when 1 then "已下发" when 2 then "已开班" when 3 then "待审核" end) ccstatus, + pg.pgwjmc, + (case pg.status when 0 then "未发布" when 1 then "已发布" end) pgstatus, + ecc.name, + ecc.startdate, + ecc.enddate, + ecc.state, + fcc.title, + fcc.uploadtime + from et_train_pd_cc cc left join et_train_pd_cc_pg pg on cc.id=pg.ccid + left join et_train_pd_cc_pgwjyxx yxx on pg.id = yxx.pgID + left join (select kcmcid,count(*) nofinishcount from et_train_pd_cc where realteacher is null or realteacher="" group by kcmcid) tab1 on tab1.kcmcid=cc.kcmcid + left join (select exam.name,exam.startdate,exam.enddate,exam.state,class.class_id as c_id from et_exam_exampaper_and_editexampaper exam + inner join et_exam_limitation_class class on exam.id = class.exam_id group by exam.id + union all + select exam.name,exam.startdate,exam.enddate,exam.state,course.course_id as c_id from et_exam_exampaper_and_editexampaper exam + inner join et_exam_limitation_course course on exam.id = course.exam_id group by exam.id + ) ecc on ecc.c_id = cc.id or ecc.c_id = cc.kcmcid + left join ( + SELECT + file.title, + file.uploadtime, + course.course_id AS f_id +FROM + et_resource_file file + inner JOIN (select a.file_id,b.course_id from et_resource_limitation a left join et_resource_limitation_course b on a.id=b.limitation_id GROUP BY b.course_id) course on course.file_id = file.id + union all +SELECT + file.title, + file.uploadtime, + class.class_id AS f_id +FROM + et_resource_file file + inner JOIN (select a.file_id,b.class_id from et_resource_limitation a left join et_resource_limitation_class b on a.id=b.limitation_id GROUP BY b.class_id) class on class.file_id = file.id + ) fcc on fcc.f_id = cc.id or fcc.f_id = cc.kcmcid + left join (select cc.id,count(*) jhrs FROM et_train_pd_cc cc left join et_train_pd_cc_user ccu on cc.id = ccu.ccid group by cc.id) uc on cc.id = uc.id + where 1=1 + ${IF(len(searchkey)=0,""," and (kcmc like '%"+searchkey+"%' or bjmc like '%"+searchkey+"%' or cc.addgroupname like '%"+searchkey+"%' or cc.teacher like '%"+searchkey+"%' or cc.realteacher like '%"+searchkey+"%' or cc.teacher_code like '%"+searchkey+"%' or starttime like '%"+searchkey+"%' or endtime like '%"+searchkey+"%')")} + order by starttime desc + ) a + ]]> + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/research.cpt b/WEB-INF/reportlets/research.cpt new file mode 100644 index 0000000..5642c6e --- /dev/null +++ b/WEB-INF/reportlets/research.cpt @@ -0,0 +1,573 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/statistic.cpt b/WEB-INF/reportlets/statistic.cpt new file mode 100644 index 0000000..b0cdca0 --- /dev/null +++ b/WEB-INF/reportlets/statistic.cpt @@ -0,0 +1,1438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/teacherInformation.cpt b/WEB-INF/reportlets/teacherInformation.cpt new file mode 100644 index 0000000..ad55870 --- /dev/null +++ b/WEB-INF/reportlets/teacherInformation.cpt @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/test.cpt b/WEB-INF/reportlets/test.cpt new file mode 100644 index 0000000..2c32c02 --- /dev/null +++ b/WEB-INF/reportlets/test.cpt @@ -0,0 +1,44 @@ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
diff --git a/WEB-INF/reportlets/test123.cpt b/WEB-INF/reportlets/test123.cpt new file mode 100644 index 0000000..b0cdca0 --- /dev/null +++ b/WEB-INF/reportlets/test123.cpt @@ -0,0 +1,1438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/train_ks_result.cpt b/WEB-INF/reportlets/train_ks_result.cpt new file mode 100644 index 0000000..b30dee0 --- /dev/null +++ b/WEB-INF/reportlets/train_ks_result.cpt @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/train_tk.cpt b/WEB-INF/reportlets/train_tk.cpt new file mode 100644 index 0000000..e619578 --- /dev/null +++ b/WEB-INF/reportlets/train_tk.cpt @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/userTest.cpt b/WEB-INF/reportlets/userTest.cpt new file mode 100644 index 0000000..16c6401 --- /dev/null +++ b/WEB-INF/reportlets/userTest.cpt @@ -0,0 +1,1329 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/wjdc_ndzj_bm.cpt b/WEB-INF/reportlets/wjdc_ndzj_bm.cpt new file mode 100644 index 0000000..3e67bb7 --- /dev/null +++ b/WEB-INF/reportlets/wjdc_ndzj_bm.cpt @@ -0,0 +1,623 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/wjdc_ndzj_sj_dw.cpt b/WEB-INF/reportlets/wjdc_ndzj_sj_dw.cpt new file mode 100644 index 0000000..60513e0 --- /dev/null +++ b/WEB-INF/reportlets/wjdc_ndzj_sj_dw.cpt @@ -0,0 +1,490 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/wjdc_ndzj_sj_pg.cpt b/WEB-INF/reportlets/wjdc_ndzj_sj_pg.cpt new file mode 100644 index 0000000..20806df --- /dev/null +++ b/WEB-INF/reportlets/wjdc_ndzj_sj_pg.cpt @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "" and paperid in (select id from et_train_pd_cc_pg where ccid in (select id from et_train_pd_cc where kcmcid = '${C3}') +)]]> + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/wppxdj.cpt b/WEB-INF/reportlets/wppxdj.cpt new file mode 100644 index 0000000..ece7daa --- /dev/null +++ b/WEB-INF/reportlets/wppxdj.cpt @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/wppxsq.cpt b/WEB-INF/reportlets/wppxsq.cpt new file mode 100644 index 0000000..114abc9 --- /dev/null +++ b/WEB-INF/reportlets/wppxsq.cpt @@ -0,0 +1,957 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +=1500 or sp.ywstatus='4' and ot.pxfy<1500) or sp.spdate>='2021-08-01' and ( sp.ywstatus='3' and ot.pxfy>=5000 or sp.ywstatus='4' and ot.pxfy<5000)) order by sp.spdate desc limit 0,1]]> + + + + + + + + + + + + + + + +=1500 or sp.spdate>='2021-08-01' and ot.pxfy>=5000) order by sp.spdate desc limit 0,1]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/wppxsq0.cpt b/WEB-INF/reportlets/wppxsq0.cpt new file mode 100644 index 0000000..022494e --- /dev/null +++ b/WEB-INF/reportlets/wppxsq0.cpt @@ -0,0 +1,867 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/wppxsq_all.cpt b/WEB-INF/reportlets/wppxsq_all.cpt new file mode 100644 index 0000000..55a05e5 --- /dev/null +++ b/WEB-INF/reportlets/wppxsq_all.cpt @@ -0,0 +1,479 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/yearSummary.cpt b/WEB-INF/reportlets/yearSummary.cpt new file mode 100644 index 0000000..564df76 --- /dev/null +++ b/WEB-INF/reportlets/yearSummary.cpt @@ -0,0 +1,293 @@ + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/zs.cpt b/WEB-INF/reportlets/zs.cpt new file mode 100644 index 0000000..85eab33 --- /dev/null +++ b/WEB-INF/reportlets/zs.cpt @@ -0,0 +1,4454 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +9'_ +YKs5G\+??k)OIdIPgK;Emd9>S*^I1-G5Ed,r.I[`,B"2+fF$Oo#bVV)$M&M$jS>7EB*MHrI/ +.p!ir4Bge_RESr^?,OE:!S^me_7tJ-)Y@[.Jg(3<90^d/bkBpAj4?5b\]AQ_$C$\UIS_d)Kd8 +P:p@@jS\FjY`=qD!GT5a/OEqp<\hW#.l1B\thZGi>r:AK+ES:EjRf2F@!m18.`=MpK]ACX]Aam +*QL,f44Xmq/a+P[e1"Lqr9[7=`a.jO)F:Lme>H]ApqC2!lMZ,11?I_G@[d"eLSX&G4nsZTkpt +&B%Ij>]Ab4.]A%,AdS+42"EWK'sFY5)o`%>As/IVoSBJ'_pMsPW +fPDX8?:Hq>rp":\Qu?Q5ZJ5pNZ;E]A/Tu.K]A@BlPjAhZVusfAhd413o:K4qOZ!2?JH6Rq$')T +HJ=2t?!Ntl>7.3lLfC!F)`i7G_&E]A,q)T&\;gQm\]Aj133%Mh(gW=e^7=SICH+%cfGCYHqT\q +mc)UqmZuWGL?<"%lML*f,IM0PL&*p2_X6)2%ee-+e:':+VVmZ_#V:JZXp$.bK.rr@JJ79HL_ +k\XnQVe/cF-]A4s3\\o944XPF1=8%.!RqMR;>f@N$.YH3=:!4rV:FD*P/Z;Vup_MEgjN/HGmr +r>ULipN#M>@:Wcghtq-(f39p:BF0,Ja]A>o\hnSpt3mk@n,t0s +-IHuCSNBR8Cj0K0+N,%Uih#e_mTR]A,UX/G&S-[V'N-_-6K'5&b4_"EqCiLGR7k2QKcF]AQeHc +hG&<`jb]AShQuTiZu2/TB8\iF=!&AIdeB!8c#M!T5=*lgIBMYiPA.b`l#.>A*QJ6*?!0=>lgW +BI.D+%fmk28-Q"!pb?T-GlQp+BL0DXRQ9OD<@g;p\Xp#2k;aM?3^Ht2(\[in]AI$[#%JT%n;o/iZ56o_.kD?6_%ZE[ +%]AgLZnMSm!a*Uq"?u-W5UI6&;B(ZHREU,pj2^[G;NI]Ao2cH"J/-IuC5RQ!'bi?KUh49Apd8^u-c*Is9=V:^]A8Q!Eoo'-,POl\PI9. +U7Yi4JoD+B(]AB7==Zf#t%Vi'g_Cs%-kb:='jP\4Q\lp[a=M_cp1q5=-P]AGe-/\'6iP2^Xc^> +dTa`i[\Ugn*7O*H+3Ysia0VANI38(aIf86sT/Ep*o\tc,'Yh>5f^-Ne`nekGTrYV=(N"Z%U\g +V6\lL`Qak=cWDiUr%r$@B#0;aZ4=$:?YH!3`;dS"hE26YiLFKlsq.8_u>h!4?d*jXfPk*u4V +DpnhtR-NLh/Pk2=DnVc%H`\W%<>0X\=+mk%8D:p?O'fBdDr8]APouZE!A#ceA:,UYAUdNa7or +m1K]A8NWD^Mj@%@h&KQ7hKIbh%lgd7,Ct^$D'LcG:Y89 +*VW1@FpJhSTu&O9=`L;bHZ$rba>bn`5H@LZt\-3c"'@'c.f\J!'km7FhO;:V(O9U*@cW86`SLHf@A9;rl&eBOba*)gCNhA_T^)36.5#tLQbGVj!G:;`A[(e +`h]AEPH:/MMCCo_b,<27jQ5LhDX(M$h%;\Y>>TmE\ONbkrs7E$?23d$a@5mRQK$V7b%;iomuC +l(U.>$_Z3SZmgH'?O_"GWUnL(3cmP&#$(V6.V<08Yn%tj;&/MZ^b;Gm+ckd!$ic+\l]A]AdC*3 +/s[OT<;bnK!SL'S4]Am($I9Q&MW>A-ag4Xg&*Fck64#@4m0N^"EK'+J;h>l>lsu/u0,pV@S@9 +U;i?K?%abS)0>a-0!>o?@C4&0OGU>cV:&,0Cm8N"di%/i5ZC^iV/FW9C%EVaT1jUEDUl^EB. +1cMq'M2_BCEtXaloVYgJ^lR:?CJ'S)MF.5?57HBV:s&VHJ7u79LG5IJK-iqR%P?BlI?h0mY/ +c*0D]A\H,hBk^%+eo#([I`[t^-a?f#;`ful17.)Y$p]A+ +*o;8T3\8G)/C_Q.\8SHK"2es7YEI?0PCi +eq@?<"-&lGf"NFoMFTop_oV`V0I=c6"5NUR*a9#I_8-Z%P[QCgaoe+;d/EbuUd`a:_2,GW.! +3]A7Hk%3luHgKkIK_I_4l[\N/;$Oo8hJ\/NNWl$`>4:`3Oc"Dgkmoc?s/*l.O-)tP_l;*N.^U`X9K4?\.-4>KGZ%f1l-q;"ZPJ/)1nB +T>MnE0Vp#;iKpM#U#bDbb$bg%iqrd'EL9,olk9o3c+9TVfMntk62E<:%F($Ql@b3m?8s!Lnr +_!^)brX@Df.!CbWqC2>o]AKVn9.i;C\%^\G$?1n/.M2-748CMh;kI5+NXpTmRAX:Tsg'YOL$6 +@*=(qqrYK0Ueh$6leg%C9DOIUclhV"c?MR1_g+&X2o_'0L'B"c14o3s;MFbh42?E8@7s96ZT +I`$jrU`ZP;mLfOI_p='Z*%I&qE9H_O2$G@6b3E;G>Wh5Ou$,ahMC5TJ5^=fYgk.XW_mO8C8f +rgr7n6Hm58%\V)/g>[?9-^)L_Ic>cLG%YQ)$QY#F[,BdAa6E@g@]A=j<7i/$1L +knM!8C,a+E"nVE#X6;N]AmId[tOLLdY-8&p/0>@3!n2prS*h^^TYDZahW-NfUSIXaRO,1(9:# +dbA]Ad.N<"6)rEe5>^WUf$X1s1#2Q39\-N`V#.\\u.As]A?HD7@lr#3^3-mBg`<%ueg2*E%l+@ +k5%hPl2jlmG.hE;8Fm!(i2`0,0]AiJ))TGK[C9HJ&Wm6>&Gc"$k6L3h"u<@>NW7qj=+93:V)` +=3h#8Rk=[jk*7)!`2XNEQ?`VM#3cmo#MtWmJaCL*F/:CN<7#Hl'hGoTD@cJ`:C6(, +W&e>D#D"'!4)Otmje#Q1 +0.IMLir'h+[c&XS6W3cf)nr6h0af/!g'DIS= +=^C!I)1dD=.U[A.hVoJ-_huJj2kuTupDF:U;dki*4\9b_"M/$&sUSb088-^8;RgK7,..&+im +!bZ#Q$HfABq-[6!d\3t%pK2iG=]A.$M]A`>_LSEj!AHD2enY#=R028JN"@cX!^#&Aj.WF- +aEb12>GGQ'nL/>C.)YI&/RK]A+>Rrc>!q:AW-JapI[86+=l*K"`p1*q8KE>*Blu9-H^H"\PR^ +!J8&a.B\kOGh1I\Z:KhV+i'WW]AcM4$lsbFC@AU:%;o@0V9XVoB.WNjGnhW)8R#WbKUTUu^;^.?'MMa]A0eofrp//qdIqlp*:[Br:CN-)X&Ng!ibb\l-RG"83VL(Gf +38\dHgql#D/fK;M,7GAC(6*(HWC0JTPn(cVWn>Wu#91k4>]A`hX^n0./V]A0!Snj@ooZ +8Mh)-="'g%iP\N-#PK1L%K6_!o#cO.;5\nRcJ0+r3lX.hE]A8%U#lhiP0AMb*i%?fV@lEt;35IKp1i;Tt!bo(^"*dp;)5&o(!T9,X,f7p[EFdMfMpdG*Q2'o`+Yh[IN4ZJ(9/.*X6'AraA[\Pqc:nA'Y#p@FLP/1/Nb5umW+ +2>VOfJnQek8HrE<=o:RJ3fh1!a?DdN:P:bYs9=:OY3*>f9Z:HD#* +LVK'%X-X%0)g=9_hlc^s^eZ?EdCQ#_Y![q):(LKcmCHNKiX,lD%/K5(DfU*Y-2aDt+Ad]AasI'C;*%$Y6.c%=Lit,R_29JbZ^$K7JA +U$b6IjKrkkH!q[tP0AJ&JTY&'>Dhd`iTQLc,B1&)Jm- +im!S2#`g0o3EAWe`4nkJOr=i'TK8ZkjYP;(]AV;gTES;*l0/j-V(h'9eC1Qc-#;#1-HjWLGfY +X)i;ke!'Er#b1ZZ$C-6sIcSS&oW5:T-.s;TC^'2X8VAXpn_,KRFfpT=BrN%W4t0PZ.\qph?@ +%R"_!O*T^gQ6,X7Ro?9:(iBr]Ae%=AAjPH&jPJqJKiW-A-,i-eF+OjRV9)oXh2q>meFqiEi!. +.Xc'Jdil]A>,I<(Qj*k]A!s0?,2u`2MJ,CgX-L_g@IG=Ld"ZBR_J_-;ZEc>q-Wp/O"'+MuY*8H +XI=:Z['84`>:=sV3N*i7tY#-H%I8p(j2]A:pY/Bau/mVRNGO/gNN0r`f2mMtj1A[S9ntj8hY. +m7R.@Qq\eE0qPt"n!*mp1-csnA3T_/X,:lM&pA>="f,#%u^d2>DFj;L#"86FL*[\=gNdT: +UpcYDMhkQ0!&=m]A#6uOD6P92ro\4\2Cs`o$<%=f,EQ%5#I?GjfbpigS_`u/U8KN_f[f7>diD=Sd$Ar6a+JAgeO?Ps$8&k:q@F +?u_$)R[QB=f<3;^JQg(-GR2il=S7A9A(f="`ou?UoYqI]Akf1.`R#@l=Kjf6-[jNE^^Rqq'%? +5;o.L>iKfQG,B9#,mE.kBerDcTG*df@c.fORol0oFn+mN.+)Al]A\gF0F.17&u&&AE9)S)oj< +.,_\pT"Pjg`QUZ`cO0b.3*pnn+[AYIG#8Ard?pprQGN-#"?WOcLEk\]AHE5q(XHV2#$1#uh>3 +.I3E("g'[(R'P`i]A!<4I!TLjqGYXp`ql`&S:h.ta:Yc[Lo==iN,dO%NS+6QM]AF\l>LQP%/Bo +0Ni>cl3B*D%98.QN$%,*?e+5"Jc`qCC7d_0JGG2=ELc"D.Ybt'3Js-bRoejgBH)Hb,(6^9(]A4m5FqM_dCHU +rYpSS^"WTOjM>$))SsKrEln/@TdJ,@V%DJV@IT'>*nk%"qE0/"U@%D=7?pYGtq8P#?#bM??N_6 +gE5uPc5r=B[c,tl*J[D4Eoq5"PN$T2ok(&:Se2X\qD592ET36@]AiD4nY<17J-b&NA:F6p=E' +Mr?aY/p)c^?/G>")0jA3hrb&]AfgiIkK?-m'?pAU=@FlODpfAc`GINX467W%O&,ML\:o..e1IW-KX)crmc4WYaB(0;u1Ird\ ++@b#b?DV/-[F4iR,h6T3l[]Au$hSQ#5ERD5;kF:)FM<.]A2`$,-.USV-^N`VA1@2O`R()5rt"_ +KODK'NKKGNQaN[:st`L]AE0<`.$sA/(u0i>+@odiFfqL[Cbk5TZWH[]A/n7*GRreRPb4?oZJ/a +Vt?1)K-/>]AJ/AXaS1RTj>LmZV#R,Z33d4JX1cjU!07#BR%ggk<.3m"!9+o-JJE*&K&,oQ^D7 +[I)/%981R,:>F4YC"1q'IfS<*R8q,K=/d^*4Qfg;A8lLn2(`,7mA$g.c=)@AA2d2jjRS/5)g +XFUL\%1(&[BC*U7!Q5s.bVpaAus-;E>0^l^2=O3`L/1 +,o!OB66Wi"!c\5ZnG#F?DJBIN*.gToeB$DeO\_6>CS?f*p5@\it_nm`F$3K0upX/H4C0U7md +HTu1@!:EoOJ9>iX2lXocB;2,P]A12cH;edt\-Ca%m0"6=\D^()i$i2>%Rp9>9gtl(&CK#(Nts +kaankpJL&`_,EU_mL!p-3A_+S]Ab0pVH$hE;=DuY48?X^8n!9C.u%)2Y5 +?#;'_JPFAKa'+t"e,5_SB4e7!hY3p6FO?PHa[$`9/I'>$j[9o,2l$\"Q,)jf3&H#2!naQjjn +g$LQSdo:rBCApVJ`<.qngtA!d_*VRrX18qTnE`U/Sq8+9%FBP3<7a0"[f=I9S;87iLJFrKU/ +N]Ai-pGO"llMj2jr59QR_\G/Bl(8(5t-,+^AVe]AsRreg?KUcRU?3/%op;UcP,[[=uIlkp*HU3 +0#``lYb_iqF]Au-V=F]ANaI=i5k>-pO:qfapIh_o!Vj?5/!=Dq6H]AlAA$.\lu4I0'g8S<+a +Y=QY$[p0$_5Y?@LFuA-o;cBhDmtHL^;T*hP+Z^[]A6mq+/mA9e@@Qaa=IN>0@^'oRNOTVQl*q +l\B.d^W/hkO`:5%3Fr))\6=PK/8[)TC"Yq$W*]A(%@o.rRO^JciG:b3-0&F4]AREX!fbMlUf2n +d>ND<,>"8M,+'g*]Adm:9#V'-eBH+n?M+8:_s[S3Oht49PUM-UpTh@`Lmu@7?K!#Tmu=683D5 +p2B<,QD,jb?9Ro^\6V$4--h"s#WYFNRfp@MZ:qX!jc59K+_(NFYE(^&W]A)H[64^(DXKZJ,D=<]Ar_#>T*n?NM`c`u +XMG=B;^7*T>nt-ih.L5+Qa5]A4^f9mi=36qJF@tm%mr4=BO6+l_;bf-%[sf.%PGpY2gFrB/K3 +Vt6BOT_WWoITaShnr7?t:?(l,2TG6Vm^:-d:WZA3gakm?I_F7KP;*@EFH>P)U=YSd'p7/j(X +*>fc4'D=e.r9]Aic5&q'mV"@@ZOUX.B,8TkPQnT#P;rX'9A5V(6cq;e#5*ekmnHo@/;'K:M!r +Yt;N$i=km4Y5tqNU,&qPb%4MJD33`Sh==X[\YODr/i`s9NdmTbgbf0'_C]A!pZQZS;!iNii9& +b8s)n"j\H1]A2LKU?A3"af]A1f6j,Dc35\2g]AC3*GiM?RIqd=m\>$kWO7_j\YT2"\tnB;875kK +]AK]A_8BMbYWOZI"D)OY"uiPYq<<<$[+npEaj7d%QF&p1@QpHQ#;hB6>e8DnV"mT60H33 +^\/r+VJr9<,rpYi;5Z&?q6EK[DJc3g%'2+kI^?Mti@u*^cj2L)a=@G[+@]A8,`S2C'3n\@QfW +AH2GZC,Xr!T\n5%7YE@$N[)j00r)PWN%O(6."!mn!)'uXbeD#.[1?%^fD$s>T/j&ST3!5Ncl +79-:J)iW#^"%`AkUln/me96qEfqb)S1a'o3\K]A@R\Sltu?d)V`Nl>3f77c>'o_f,M$,r3Lst +7og*-l`1'9\l0R@]A61FeJmF_$nLr4YZCnF_]AWFI_)VD`;U9q<\*P@7H!PIk-BjA&alWrl1jm +tV('Z,8h"jk2@.,sOBa)&Qb[=q!T\pt^q9,0aPd:"8VJ=MJbs,I7'NG)p/Ih00#LikI(N-tj +]A;9_bEjDXp2B;jJRYpXga)\3qDR8>A.?7!VS\oM9Zr:dN+`(cna8%ZNg)AaFS1ip.Y]A(0 +u8:Xk,`Qr1,URF;%^a)9hW-@GAD2m"-P)#.Sg43\Y<0(9,[HA7lc3)-9$8?AKTrU\rtbK33< +\[2BNQr-]Alo7p'*R"%Wj1XnQjnN(E+hQ8"PS]A#ra91$K`)d\Xn[]A`HF/AYgL:Md07-W +j[2<]A-\WXBVJ)=Pb*"km_)S^K.b:8uZ_UEKtfE-+2;>`n2=4Vl7`%^p(BZ*T;r&nSUXKkFEp +/[_(1C>kH+0NDS/fh[!J3OI%r(!S"aKmr'Xg`)"&b85D?WkhC3b?stFAfFEI`]ALs#eF^%._4 +K@hHkPD2s0t:gk@2Hc_:LoB0l0^kbPB+=`J!?Nk07,X==7geQ!3j2LP5PlhA:!"&3oq(GIpSa,T>AR,+a$&It4b<-5]AG^lsPc0#Kt%)DmYR8'pB2mD5K$ +;etpk\/pJ^ek?k3`!O6?`,@9P4(U&KNT',kQMa",Yft!%G)$,66+b7=+C7sN%lhWLf)1qqFV +f)6&Ral["c>o?/Enq:R.JO;dJ4?mr*Xd]AU,Wg(k*J,7UoC=G.fJ0NEac4%l%F'(2Gdq6Y[l2 +,bAmB"`>,A+mWj=*VbMG:W(:#0#t_/:GeM7Oe^]AR[,ff9`3#$`l8hV1fBcD`:R.:RZR.:87P +pMf<>g8\]AI[IX`@3?GbT8lql]Aj*CC5M%'keKuDqi5S&@&=9LgTNeAj0Tqf;QktYqVf6A`2eYBpgg5Z8&+gVouCa:NlC$l5\BfQYfM\dZ*Yk'[`Y9(g5f>U't%`.0' +!PrEAYW0KODIt%"TW8I`KmdM`knJ@r2JVK%?hE9F#r-f$0O_=9K7;1R^D.a0eP%hf6eYOO*O +rMnc(lP.`H@Na?]A.tauWETt((673@LTR#W5BH+4@@K"_bSFm(B"/n!N4@Us>9_re1Zr>dC(/ +HTA:-V!%4BQKd,OsERPcH3a%sqi[bb+Bab:VSXk]Ak3:,RuIC>#]Ap%Qo*dB*qXp3Ynu.>I4:% +4IjkYVNNW:RT6N@0k@5l)+PljaJ@.eSL\B?U_J*Pk'bP7-=saTA;EZ`nI"I`Wi9U7g/KSA/kca\Sq/ZmDhS;AF7UP/64oYIsrD&_FRO +_NnEuK^5i5W*ZpsC\C6bo$bBt*6nufbH<85+ +MWPJ,(qFrRlWV&e-damIOhG+\dX5A\5YtL/]A?)2.u^!_KP^li5=fSFnq9)a3BZ4GI*;YOk?! +@Ta>".tD%RrT3@iP\7ROTk/8DBpl&h0h*hlg+1olNH:p1O@(!$^l(dRB:fO5s=L,.Wse_!IT2`fp!<';7'o-cUL:8r^f.[7?BI+d,IVP:qh79_b@/L +fPO+/N37)r(-_P;#_;k70'h_:j=E(2H/,BO$p5c5UFhPur%X2<8c8Z=bK$US6rON2i8Gj=BC +@e_8_HrnQ20HBECA7&;g[P24X`1r%NqJT_A:L0eWOT^_.IQ`UiqfN/sg;QL4r@hd;Y-uj`bg +/PA88/qGS3B;_M3D(LUH(_D^;gN>k(0D\u-"riJ,L/h-e%WWt#"0?QM'T$+nB\EY6& +2Ve:JI9E+'Y"$V(W^7K_/:L/Y!36e2S:VSis#$9,d<[/YE;281Tl@Ff2etgr`98%fRYu]As8o +p7T>&f3TamtKHs)'o\C>XG;t"_Kq0'K@4&[uX +phFiqPZRb(uDJ3Knfog60n+VE\'((2\,XY&LUTpXZ2MEG/r>gEG/KUSVC`+*i(GZ(;9, +@!oI:j57k?rP4OM^*h<+d`^WgEr#'H4)Z]A@dN*eL@enB),RA<^T^.k>Zd\jQr^,Z`;hEHpG3H(.X)@=nlsGa85SqTA*Z6jVO +-G0;lE_W%qaVjoXSt.ugOdL-I_o^iX+YPfk3`54'jTMI;^BqOf!"DUQcG.7UY(Z3\0V6r261 +(B9HSdNkM$"hH"jcihcKpboO\UYq/+#PHFYoBD/MCZ3L?C1LUFg5J/*aredua,&No,.tc9OQ +U5EQVYLm#CV5?O4[L`<1!b?dS]A"6mFG8mp#sA,7uc7_;>:OVOGcLH'EpjE.M_lL^6@q[Gc>t +rM`2YHlMIt)Un*1#K'[$D`V=tT""$qZTd@FX7LgM1qZ\G8)/bGu7$%-]Ap +YOR^CNKjaX*2Xc`VQE0?MRnEhIABoX2*I(I?_e!+;Eo#TB'&Zlf22:=C?(SN.lZflQI@V3f/ +1.C!iYS]Aa;B%TarIRdSNYhEc@A-+[U@U8&RHV1kJ?9i5S166kB8>6t,GW^0n>Qb(hE0Pm=P#Fcl%M*<=ILbm=SPjJO%5CtN@Lh-Jg`,"49UFE>4BkD9+^;^Hk\U0!iZgffGSRB3 +inKeOIn\=f$MIW$;<7@** +qX9tTq6$t7cDtVH*aI"0&(*92o4keC/QNiA7Vhb^)"?q=>MPjJ>QNcc52!d(^\R4FB><^fKM +tX#+tV[0;ZC=!E+kp#.gS1dc^UM#0*^X`pT+`-r5m.n0^54M`=5,_IJ3B_Gg-'N26?RAYC`^%MDC]A:r?&/QG`5<4>Q+pjGhQg@'SMAL +ClUbKC*lH2>HI\jANffFND7+,g;"V$(sug]A#@(8E;'E$^NfQpRA.TPFp)_nairPXjIO +5au-;mF0a`$;.oY:J`GeVP4V[kB@#B6F!^XEB=g52dEa@Mu6`^2Q1WF'4sfo:*\= +XplZE1GHG5GqgKM5l$>pdR-QN6_rL*ZN//&,t`8fkD(k/A,1t8rBm-Ao)= +=UJ"lT`FL[?t@"GNGE<-4,IPj.EBIgsb$Od]A-);cV.K"UR`TgHYA^3MWD^$Gu9&sm.jRHFTeo9>mAD-9t'^ft`ELpF9i4e@DQ0 +^N<`T<3HfP-J,N0 +a53&o(M0A^WnR;%iOK]ApX=`+c"W&Ha-"R?JISY$GYs"tUZk:D4ptlU18W:IIUs)a,lFP-M3O +A'Ra=fXb'=2l!fmU(+D%i^uFO=;+NP-;7gWs+h9ma%5S&g +jd4;/6#(02E73NepTYNU,J"Ill:BF('(om4l"ID/IRi&5qJQqBYfM$qK'IXe.d/as44YA8Ke +6cR0/d@E;sVrE;`h3d^L0L0o`8W6m)`X]AdTI)bo$oJ(tm-dr^H-`Be;RDV@+P>W0j)$!1**Q +2g"D#C_+*MJ6AP%LgD<`IS+mq/i2m$p?"!_%4]A?a^[%5qnD`QBZq)!XU9'BlX!WK^bdMhiS7 +'qp38D<+%#1_Fa.e>0]AO:PLk'(8mI%FfWl=R+XWk,'S\:F!CfR-t\kPou7#Z\I/^:*EahF0> +`,[.':'MSh<^WHhCbB#\PoqO?G1Z+eRiV[>8Z/)o`aAI&?0O::Cka_00UbXnDAp2a&EJ)842 +%\rN.A[86-Q8-><%'p.[[aJ2X4Z$8=_02JGenp<(*kU&K>31<]Au'^4dOU=^\4&iU@0ET>T>u +^Nq5f4]AXOd5(AY.@"*^5$9TBa'h"q!Fn2$+4.*R`ekt:d[5LtcPZ"B(6@HWtG]Ad-Wueh(WqA +`_[R+_GtHoRtPS0i15:feLT#_F-f8N]A/%aj%qG+SDM_,ge'EuY]AU48KNn$'41@RP57joF0!J +b">t,qQA7$/ILTZ!l3tQ$;^j!nkgj8Q?$>rgsC%1&i$jKP*OCS:LIaao-o"c@S:DLt!"9)U: +^UK&X%f&!K:dZi^;Pb!GObhr9ol06s1J):d^/!_4*(,;k@&In]Aq,H_4\5:.$k?O4\'lBt5m; +N-Q2o`.>]Ag=\:j&',lZHOrSr4l=:%U,=2eR2?hPjke!@cj?t$)LlR9KH:n8,AX/"`-F'M*cb +P2:;+,H!8W!3h&LSHnPahNj*5*K=mWqBi)n`]A^B($aa9H?nhaDA8m-\t*[j;5eRJ[qm.B-9% +X8n80\`o.F#Shl1;QBR"hD[![Z,qZpIMHg2Hh=mYt6CfPc&,>nJqE%je.:!K +kQ.F_e,jH?d5NA8LC]A93ZVQ+Y\ebX+WcDH@qC3e$kFjdum.RK`/)eopA>s15C0g!:qX%g;L#4h.jjpD?AS#oRia#:TZi5GbM6Z5mQLc^3' +!#r^DTWN)\,*/'-5?5e0.Pk23B@Xjtqo6(:/Ah0Mm%d5DgiBaF6:Ks?4nE$W8'eK.4c]Ak:iZ +Mh.5WLc%5>Kk^/NV_hsrq8nlADoE"+X>f0mr!6U) +47f"lb3nT6#@"Km%-+cR2G<6K@7MV\4K*G5s=3C3LIL9f!(#ACo\0-U,_n.`PjT-R!K/;g@A +k_!'CMKIdlFQHc0!)'#!XtYCg\\8X#mF0'pg@X9P`E1T=-m,M,JZUQpX[&YtaceN::iOTj>! +Rgt2C"goPu'WpL7I*O6%h0Ml/%).2+$eqj+X+Uhu?a*PLnuc?2pR[=E-XFfTRD,iN,Z;SY(_ +H:#tq\C\&b,E@X\Brb^8A94lW8GqCPkg1nbKh>8Ee[pb_[^N3]A4" +@]A%`H\NL`A9k#1Iq(Z]AFtQ!GRoZu"13!s!.^13?Wn\_E:W%I5.#C/p>ApsLL\M@BNkeg8 +^oP-P8]Ab5$1h,1'.mm0[n66/p:^^H@1fZWQ2?U4pC[XY^W`5f&cOaYsZeOb>^7dq*$\(,-d& +EcNU?4g0!L)cIm+q$)PZ0e,p>>e*9^\2cegeX2OA6Imj&3WF`Rb^%*PI^qb8U65Yuqn=?TgI +.b7AKf'YRu+'2bNO_B#uu.k/H*%tNQIllB]AGE>i-=J!76.GKO%)D]AKhC7-Zq0"(hCeN:qc8A +=2]Aqcp[J6RmUBM\&`ALkdG$PDOE@qOu))puTpS3CHSQ'>31*2I_)APf`7J^)EpTAW?2 +O_Z.9=;o8Lh5R'9*j96Q,XiHC?o2ljW(cc'+VMu-N8'D#\d&#]A;#&/1=@D,H:Og_0"_8:>ar +@5\'JA1S/l>Km_0T^*"7\k5k8"pId9Er*a??*Vb!^5RcT#T?<9-r.Cm`9=fuV)0WZi."&p.1AhJIL5qOPf2-"Cdqa?8q/PciM9>Zf;kFb=Ocb*P!F;nHAp%E\.0< +,R2jb`cojPXi/A7bfp;(Y/lcdO-SQ2^`B/$Ha>$l.t/j!-V)>ko8s\Jc*/`_tPrhY%:0=NI/ +\+`#0'g_)=SQB,jODUtm*8WoL]A8B24459)1>-\Hjf9-7la;=%`T2OTQ4\3odi4nUbnfC&Zr[ +4A!.ERobRjUo-Cg)dpl]AZrDD+OBZOPl@I,#.MgR^LSFqbG(X"04YIiJ2pQ3!\CWTL#[8/3aH +2F=ZEh.1>&%!u@jY2Z4!CJfT3Lq52$WWapi_$4Fjn!=d9Y\?bTl5?m5k?m\L<15R)M<9! +_<5Khnl7016nO^_076%S.H+tsRn$uY=`Ne+'%GJ]AoT.;b?<2egi?!]A)69lrLC@_+ea.1o_7B +BQjp9mObgHFE?T\?TVW"1pD.X'>/BogHpnfF8\ZrqY0NT^l6kZCXl3O['A-+8f.h".uJ]AhpF +=^]A5Km7!F&QU+*#saDMn)Noofc%q"$-"Urcm>b*C!d""*.BF%+68)kBF?o(lYF;YJXCU>3Sj +-d2I[8q`d@G17]AS"Y_/e4"!Tf0]A1"hrsHD^1CNEc/Z)N!(V]A0>@UEtpN*o:RALXR1L>!%;3n +H,dphkSKRG-"3#FuUse"H9,,:AJ('>o:47\r5`r_Z>nP6Eq;(ngC634ESupMYCTha19Dq92t +J[EC1F%WlHCL\r(>>#StH=/?9+S*&kNS$l5_U^M8Wn#Z1kX1mV;.SuabYS?;R?i0Q-4RXFF1 +&#S%L2@s3"!)oP@s',bW^[++b*F$!dh5XR#/e41ZcIV0PI78nr:uZ$,JQ+7]A3?btS6fK7&WQ +`OCK%*#=)V:J5%iL_G,c$B/dII_A,j*CmTZ0r%IT#T6aWo:\7"!'$Q7Zr1b,7_,j-&mLRKsXUiW+&j +r"Aq+G1(tX;C9fl;j^ckc_I4lb)Z3I$C\n&B/.3`TG[>mQ*J*I5^1Z7Z(0\]A>g6`C0D#QLf=aFE25Aq;S)Q8t2djV^_"l:]AX5G.]AjLgION*K0T +_<=TY`XfKJdr0NRCU)NtrtRa;\l`H;;Beu$!(?O'G7+04%=J-q$kHbJh$\oBO0gbYg"AZ+FZ +?tCo&_Ps:\\)YHnaI(0Nc"K&FqRoTP]A)ok0fM#YpL(Y[N(l.noF?Nhh1Hi`GSPHGo#37Nrg$ +[b*%3,gkE,8&uFEV;5YV`ikOCWH'M#CCOfcqaA8H&(;huUd]A-T*"n=Xb*(XBfjY>q(od&o:h +jtK1JEe1_MXGthW,kW!aTI=l$PJ$7eI46[4B1`j2s^cO)gQ,%rXgjt/B8h\.Gg!*eLU8]A +.+2*/1`a-o&]A&UlTV>!J6kJLPB2oK.W[s(pq.4^Cf63cq=UBg(<*X +i3[IC7Xb1J0*-/C\7a7)!'d8d]A8Kln$1ne%8;"2>MROGhg[pW5CN;_7j9M[n4%9X3>.7TgK3 +fg&c2:A6uVOl>5[gSkN*h0pZ6QB.1jAnY8[5WB&SRs+2@YZQ1QZkn,Ms.+6I;mEA]AUXmL(`F +a5'.EhRoGJ!fWCl)[LRZCrC5KOD3Y/eQ77YaNJkneUR!V)HZ-JoiA%)IrM%3akO +;ZYs,LI;X2*G45&i*HX>9DiBlOACiig-4]Au9"^aEE&YR*R?l.Sc8+?_pUmW(,EVcbe[V+VqgT"t2N$bGNVE<1>m +OfNnp_Aa->M@/[utp\lXJki4YE1WpjP,_RY@H`VYS^*Y$$[LMkNl +r9`PlK&)C:_YVPO`E4[$DS;tNW2]AmBiFKpo]ACO'SZ4ac!U4AB73`H4'00Q5R/h*sJJB,<>0< +n452`gnS<(mSnhFJG1:`>[QC#S;s0q-ji-;1!=I;5"5;N/>n0`:$9K:*Z6$4`m1(AFu>e/,( +RYpasPX@;72bhN`EKG!/2hjdnZIlOd]AB,1N,hV&]A?qc3Fker]A=27Ho-'AL1<=<8=Q![II1pC +JPa65a/,%2J)!^SJjJW8E=Kb2/gkncYuQ\A4$nYD5o<[42gn#k=-b=-TbMEX6g'l"IsOn?_f +]A9(XaE9WT=KH8]A_d"`oSI!ceNM1kpMZtJ?g+o$C6DEMlDg*G$>tj<'2cR<^h-9B"Uk=ACb:/I,fcY_CT +'4E_IU&>9>g%,Vf.LFF3mIusKDen]ArTV4,.#M8_@5RRQ-kTE-o^U+kodG4\eT!KPfimAFfNh +PlTo%3mlH#7'QqtcZ^&fC-EaY$)pM7A1i8YpZ?a>_4gcO4hm?F?Sa,*ZMh_.]AT:haJc*Zu#J +p[>=[,9?%`drM4*?@(KZ/1i^q^0@%H,oNSA\Bio90l;hcX^1&bHDj'AIt_4cQR.uj`_t)X$T +f$5,/Un3'ian@?95:YhY`4V:L\q->?/97iud( +M5#_^tdcE[%)HBA]A!!MK@(rfl'/gL161kuio=&0qFr8Z#CYgfio02fK@FW`$RjVJ&*;'NErfc/ikrt?Yl7u/A(nnG#L4&n;k*:pTU_F7]A%#N_BmYOQ_WPm7]An&jmAiY2=A:5)0 +nC,L*s]AmZpq;n9MaoHNJ'd>C/[7N,>hl0uhO<1[D!oS7ML@TO5Le$#ZO=)<1UTEWe"7Tu!UN +_>QNit%fq7^3!1bHZCB]A[a&?1QdOBnR5_'AmoiLjs&&J_GZl"r$0*UCPGkCQ9s\*`3MJ(oM)/#K#% +f;O4q`dm;7Q#Y<>B2k9/CLlUZ4sMMjbGSAHaA:%G092M&uAdNK\S'NWYr!LD8rEM/(!(Ok?o +:cjC9hV)RYHT7W-YV1uiefd$5V]ARsutTm)4/9dt4?qZr$J+hXAG +[SkF>55bG>]Aa(n)8=$*mhb,2.UiFH+AsYS@4juPWeQ#b;=fJfTRJB`DX[Qp*[FSM+&:m+1!' +_"DTQCP`gGSHE`h8O:j"`NXoRDJ4,43A +K'%t'"N,Q5/On-6Hp.Vre'B[9F+0(g3DDbSB^T>J#D5uNKQ:L>EU+8`4goX>d4;).CYU=@:A +5VQi!ui$6QS?JoJ,J_0G+"0h:m6QVr.tI0$]A[9bgUVA2?WKiT.(MQG&Lbt-3(EZDQWnPlmW(iZ\1e$DJmZPb34$ZMa14%c\>Q0$8"r +pPC7s54<_jn>p:?F*\&X0UA5U/g&$Q"DW&mhYF'b3/qRkVf-2nFU22ST.kcL@]A`02m!h?5.g +sY25TcT3pL:oo6/E#ot;DjC#_Z=komF_^4>1(S>>a+@QBEOcch/+@Ijd3E5Zr!WLNQ\'95@% +33($TQX@=X^p"N53mOVI<&%i:+27'-64([mKqXn;=AM.',.=+nJI6O?_,AVihh91g2drI1cR +g'iab?jPT<&9iPIB5H:N+AV-TuRCHuC<`&b@9@GjNoTT1BV:n%Ks&a"G%8s@CYA`XZ +(%a:O6_$DkI*'/e2(fNMI@H_\=F(J8_hJ`"/b+_orOVnd2`,2"jA^AFZJSQ.faIdP(EUoL:J +hZ,(M;tE^2`0%=&3WIE(kFfG1\tj?aWL[ao%pD]AKY'!"F=#LPNMiWoE79-NNhS$!B!9@ +RC-=:OHu3=30;4_VN-"&riOl.WI0DFa?nU# +k"cn!t?3N_8`dt5J8o=<"]A]A9J87ZUlnk!=uI&gFemS]A.n8I>]AO%)%\s'j@*pCri^(3[X^/%3 +SG3P.-(?SpQ@/CP^]Ai<,jmtcriSZl95k#_R`q<,%AKD(`H7YdX$P-Nsa!@b`?NpXlXOp0I0OVJ]AlRoKFrrtkE[IA9pDmk%GlG9$sKZ.8(`& +K0#qUa%-@Rn@XZ4-%(Sb`&VAPTF%M\PHEnX$gtIh`rR^5oTJp>k+]A/SkiXR2>43Lfeq$6]AuM +5]AOI)Y&CiVYsd5et]AGJX-9X.ik7;Y>b?sI#uo#pq$m9kS?cJ=[$eaG**3fH6m5t+jamJ$,N8 +?&n)8B@:A=<&%qtCD32S&Ho1dAE;k"N;]Ap4CiH7f!?cR)6(/I"$APNG"+S9GqAf%oLrqq9oh +Vrt18Vj$[K@2G(cX>1jEc"tj0ZhM\*gSt@6X'>4iD/-\WljZ1h +JHn4&rhUT[/7dT]Aca-OV=$nCX"&GpC+jDp3EXb<5KYoo[<9"gQ%nW2(JF +XBnn##ZI)(mE2AO?)PUNpjXJ0Uq(1X3Q/]AV\3SiM#DmPubQfIY0%bmQaqf@$*5'#P0"hELf: +#IYn]Ai`?(Ec8QEF@Y5gD),jm$fX\>n9;EAJtY/B:BKZOn'1*ohjDm,_rSElY/gI/gfaC:1"0 +^ZF>M1[iYP*:YC2^rHbP!ppmm'@N`EEeVPD_'DmWQAl*7(f:Q]Al^k0"Ufk(S'9A$3@:b>PY4 +\5gs#ie$j'*O(`'O;!*&bjB+/jB36r\$)B@b1V%m;>42#DLI`X[0'1+?"s0%26W!-g2s=V'D +"Pr@(b/,F,OiqH?-O>A[H3WA2.d3=cS7$W[@DnIWsI_R2%O*o+NDb>Eq#7X2A((TrJ!lku+S +F2Uu'dE4W2_=867V-YbP+>BFcpol7#Gn>c;+hq91dSXl.C;p<@0;9DC;(u.RY12`jdN0"eh,iJi@UdAnFab+TeUa>.l#, +5+@=f6t4RSVJH:9@Gbdc*4Kg.YALM-`$;.?aHG4s!$,OuLE">cjHo3)-`,N8!j"$e-P>30Q[ +8X]A6j>Y-iFUCK;p.UXj9rbsp)u>Ek";-;?h-]A_TW)ZZ&4g)4C%ZesAKN:0% +?Ii+1MaZ^K+\Pt/[(*.VVA)8MuA10B")NO6If\16@QM7\ipR'&h%*5pA50Uf&NAP<=j/)g6kbCGt#2 +]A$2Yg4?HM@+`0@2+7-!o=W3=Hn!S$p?3m+iD(.HBsL%EnT>+ql_U7$p4X]AcrH[l +`1:_C-2cpr&?KGBYmCh$^fX=!uuDpt<1@q7'e;hNi!_&;`]A0S:7g4Z4(4dD6BDt]A]Aj&Ag-Wd +#(mf9EdIE\BXa#*>D;Ka;Lb7j:U[(Zbfr??8-MQb]As8'$*at1Qg:8a1(KNB*qSTUc8FY#BMp +XrYP:T+&M;uc%=rbl,g/EW."[4n54:1)I^=+mdp;S$ +#L5ici]AFc4-dReHmU+lI`UW$Bc-LU[J,%Fir2&`4$d4/mcDT!:YMS(6EfWJ_mElU,X.Oi!gp +u`rqBGr^0Cj;LqCd&;jS#KY1>hdT-YK>Ar$?i;Pkt*EK^Hn1o_1N3Z^8&\HMB&`El[qHQ0HQ +r\n(a7_:9'?i]ACKs-g-9bpb.c#:XP^d(I.nhrc2DVH_2X4Y?oVHq>PegP5=_qq"DDuq=FO`@ +I3$pb9-1@G'6Qo54H=99o"Y)B>NEMkP$'E5CFk`4aKGb4?ebk*V_jKFhHIcmN71tmFgC2k;) +i*Hf3AUrTQ+QMsPhMIeXJ'runYZl[Sl!g5*Eq?]ApWNr&OTKC\m?uAg">L+anZOs0tu]AhE#jF +]A"dTt/LKf/]A>4Die(`L5UBAQ7&)<-a+,1:"?(X@3/7ur'=4'ecEsIJW0;"XA@diVAj94B/e1 +T$64!,Xg5Ensi;W#2D5FI/A4S?IA7:L>p8p +.=?>O#f5>qSdU/@*Td`A.FV<2hotODuTJQ.Ml/k-GOq(IGIPG4%t.YVqUXlY\^hK>7>jCrkN*oA54-bV@S_mDr +-ZH^>B6Er7!Ql8;D@QgKqN$IbL'WY(jdVs7!:st%jG.%(USkAX@R8$EYP6RogZ'*091+0s`:i\Gpt]AiLpbM@0 +IIcF-b2Ko"q-2:pGIp"=iRuC6@lumD^OA\),t@i9EKiW_k!S/,Y4_5#bboBX@GpsNps,eUa, +g%7qr,#&M=]AW>]A:V3(?!Lo(Ig`u>S_j0E#-o?_\>$en!*?5Z-Dr-b +=-I;,CjQTh@o#gOcD;sW`C:7Z5Ne=Ol#+rX]AI6._IGj0_SZ>jo"^]A2CTr'g#:2#@3bq)`]A:nEV94*`iY7?Uue;hiT.)7N[FW%^"\G>\-i_LQ')Y&(A'nH'K +/7^pA/j@ShH:*FfU>K7;MGL%L-\p/WURI+klfjP[b`sA;r1I8VqmB#11E#m%MR)(,pV224o0 +3>$EG4]AN/p:F%k7sgpWJD"*#(mh2aSe`5'HbhGKpXga0Xr`T7cJ0r&2@M.h!IVhl4KZ_lM1% +Es7u$\j3(dO]AAIum5'^jgr:9"/1]APaeZX4aj+2(53T,dh!bL)ApDsfj']A)UjXc@,#:\(;-3, +Fuh%cTN@o?#Oq)Sij?oH4*sr*^;GCHXVBsneC_GnG)S5j0N*A]Am9CkpAD>YjkItj%g^H^n&X +IeK-,QR\G(N]A2a2_:rp\>&o+tJ(T'lQ!a8GM9jlssp482F0T(*LKEHD.7:RRfg+J3:\jW$P# +rs7lJP#ffQSpN\M]A"%M#akaRpk:b,0rRL]A(WThA0EmF.2GJ8?^Jkg@<.a,c2JhqbqjIIcIhn\^.%QS5<)qSC)8a,eR +8hP3!Hj!WuU0S[TtB*ZEqN3Ih%Hr +qW=+pOhG\C[s,b4LKXlToAZ^HeZ0Ak1?f,n)#'j4SO@)I.Q^(nbI6Hlu1cZS)`>:l_dNpDr- +SQ+ZF(`EdI9:WGUh9jjRkO04/"uG[^LEO`:9q'nMqq5O@1m(FZR7#S0:k?ST2n']A5FYumUktS-cVGWG+Hp"dIJ*Le!D>uoZ(A[Yna-%eY?4VIF +n"^&e%7PO:EJ?)H9jpdYFiT0Eeh#3pETLS&+?,QH=5gM(XFMO@TdktcC`O]A%qe\0>X!YOJ+) +7ebEo"XSiq/]AmZKPToSB$4#7nm9]A_ +nh\4I7FG0Kn=]AFPALVFi/FGJ!lmbU&&q%pp00DA4k]AL+C.HU)t(moMQSs6"kprV775Vsr6?p +WnnX$lVrmQ@o3>/rRpnr%[qNq/1 +rIJ,Mn:s5Y4Q$2#LYG!I +8o]Ab>J+9(=#D)qBWYaH]A4)tX&1+C>)h]AbUq84H<=Tf?T2CHs5WRX-LjE,I>p.33'm&_=qrY2 +Oq(tZil*c-q41 +ssLP;I'o7-\Ms0J.gM/=Tk$iS$3+eIE]A`;6;[Nh9CKSt>sdJ^n\ZKMP)9flXTgNeUG%cWMnJ +S+Z-W?dEVB32^KfA#nj-5eL&dibTG0mUiV\#NC+gQ!%*T]A +G;Ml'@rB3Ce/lH%Z"3PM;H0if]A"MDd]Ag\:1Ou5Zl*ePpF5%Ai[CNl;NX90XIm:bT>DV019LO +Sm`CQQmn]ANlFA2J$Qf1_`-RWu)H:b"KKV*%sQZe8`o)Q=&Q.G@tV2O%1lCO&$[ib<;;nTZ6q +D>mb$`qAG>W3+(``1#6PDh1RDF#=[g2HQa:EnonY-Bl/-*,[@J9[7HAJVBh:TuCi+=O15IW. +`4CgN,KaPq$s.hC]A$j:UfXI+8&%tPq"DQ'<+tTP@AM;0t:([G1NAPc'b^TJ@G: +81`9Y9PK+r,aM&X0HE'Yl!Q\idA#:,]Ae-\C'l+t:jBb1o,JZVX(_IEJ2^Yq6RRWn&NYY1@kCP8JWYKh@LO/`A#2D.Mtm]A4f/1a%7@RYnO0ESo;84V8FD1$X +uLWS21O$C+`,R:.98SMK+e*cujDmf1&*AU^EAl]AoiROY!pLQ0#HgpN1=MXjo3"H<0I@G!RnUJqP52(Mr/N-4Qa?5:-;KpgEP7IO8f'- +2CbV%:A&k+ccJP]AAN_NMkKHVTnd,dNk9%Mg1tqj0bWEcUIhLZ6HOj0?2FfW#%^n4)0hd2]AI^ +`M5ngrV*%$qf;$`p[h;Jrj_93ui+gDZ3EV0/mG50Vrsdd7@ab0RF%'J:b#(M%9t[LKs]AMWVP]A>c$NVlDGupU3W*'ik+Js6)lGmeg +KZ7fm2M!`L$2W^65T,./Ess4p)j_3QjIHZOY7-`_fg]A2):_0Xf[d9!cbg/s]A8"63Hd8dEZY; +2`=9R8D]A17$4]A3>]Aj>2R%AiA3Cb]A)!jdh.%3PkBhE=#,48,D,>FV?U\;(2\k&m)\f,J)W+Qc +SA3*h.PI3:`l,@V!@9=$4[8XJQ;f6F7B=:nL,H]A!q?fdP&m.q'Q2O0Okr>.g$6amA&JOec5n +J%J%>Uf9`85BM,+h)S]AXs__u7+9S[aXXAKAZNUD^ae7^,XK:LE;!k@QKhX"ciKh`'?p8?)\86BrCYoAp#i[U0?&tV`&HdSFUu<2H.#=*Uf,cbEMbX0 +SRT%VaC@sFpQoiTNR1nsh`n4&YMd,tlVr1WOD>*0"e\fSE7?F>P3 +l"U+>p3rAA=7Bj`ORi6is]AL3Sg8GW?3.;od2q`+dL!Aoio2g'o$!69I$Vk0kojqp3`Jrl +TJ0.o4]A!r"h,[^:4'2L(p9N>E*gWP'WNo28(daM`4B>i&04B+^B@7RbA5m`()2^]A;20Z6/^u +u6D`*`7.0Br#(<_GWWI5q>g_tA:AEq5+C[29a6R;js>:AJ[$jWqlrZG<=lYC&]ALaT9/^]ACQn +F!e@k!+QgM#0EP#V6j&\)qa.t+@m')lSKAA@,0X'X,oOJpK']Ao)!62oP[Q2FEd-i6/Dq4`m;=J#rF!'Tg.%D5Vg3-K +89b@J\#r3&=LD[d]Aq:SNBmVOXB@L;1U@^n9gK))]AeZWV4WPW#S9pun$,W;X6>S\sjmbU"uF) +_ki,2au7T@r^/<7b*u_A8NY%>jO@2l,!.,Ms\'e:a_'gn=S91iNY+O8p@]A1%gd)/g!9M/]A-t +gF;)!LSBb>)?('-X6-.sJ/@I_!.%>pd8p-7P'9Yfp$UHn=S(a*\&?^O#\=f7I80^u) +0aU1d1tHt.7_0GR9_V;jFC'o>$3M$L8,dld7E>[s5adn[o]Aed9>N+73'OH^)hLB'?Dab(C3Y +WhRP)C!QMW'IKbMV)X+[s6ZiXa/#V6Gc;fr['1i[?3I%o\%5fUDgX^*(M$(.1@2ADrEJ,]A2k +J+j\B:ckfRN[W9`%(*8!fkDP4?/EQOjndg3'b:ZG<8"3U?-u'a& +rT"i0h0bcSGkR/+00MsYJlGIM +JrKQjJPeblnL?g99ioQLpY/n]AJAY91iR.)MXY`^nq=X(T8D]Aq!gq1g`Yp=2)jf.'b`F+..=k +cYZ/Wds?.9.lW?"Hl<:&I_m2`4NIi+c7p''eRmR6jhH4"o=q@`D=ptXs8u(KSG=iUW4@\i;R>T3A\>Fs_h&o#,oq82-SV&4fnUNsNb3rSK91=3($(; +oe9nh/Hu<4Z?Xfhjj+ATBmH@&$7d'%caD?FL`uHBY-I6>od$#pFR2.H>m12fe3i:B7%)YIE1 +HClhX`0Z(-:CrK>f]AF$`3(?IQANgZ>^5ieXtrE'_?gG2P5`3H*26F,L0PK_^#AGkB[;IH7oj +-Nl#&?GdYGfWR^uj2mnWS6ha!gnnkZbtLg%53"Xtqb7lko\?%lc4A$m6H\%8C&L$VZ2:U,Qg +sA+n;H%KB"Q`?)GaVX1Y_SZdr=`]AQs>@blfC.W;MMG5Z6r:`1bOs8 +,O3,1@3,YmDcu=;MF8.o\1^AsUKW+:hH#`10hY7N2hV5)ec(&b+_cB^_C^?DG?!$4-+cQ0?- +"Z(2>KC[l3m8Z2Xj_B'2dES1"Sr[M=rc/W*of-(&h*+\^@:]AXiS&Ku(,VPn/s"4H?\uaV\mD +ESqo(b*j>*6O9]AmRs+mLe/bSQ#_Dc+!#j^onJk%E@Y_;Tjn3aX)N20qWt`*3Vo6QfZEcS0.:ddr.Rhnfltkd?EEMXT'Q: +sCqB8rS-ElWS/6tQQFgeeGHQrjLOA5Pd#NXeDpAFHl]ACejFaZmOS$%.Y9BXh3R6_4EE(2/\Z +)s\`b&9#Q]AFIDQFncEN8U0V7V\uc3(b_#D\BA>@q+&jPt77NRpMm$_Qt5CHV=I*dDQ4X_.lV +KBO%)'iM1"pe`"XG[>9o:_MG\ms!X2C-efne>e>GpEo=:ecD?JB?n*QI]A$e*&Pn0Ebti\DVAT54^@9Ug!Z?\a/r-Fmp5d;2=& +W-A1&t90fEI"?Bepd>[FmrMQcDka#0&)Uu'`;Go`JG1al7J7mKo% +X7g#$ph(P9HKf8l;Ya)<]A8AX`/+du-/C4#le)Q_.`lWZkc1F'K6j6K.#iQ_L*-s99SY#lZ"^ ++0Mc!Q93(XEn$0H*3E,1kmG$C_cE=Gi*)E*6'+t$lYY?kJ:m'TfLrN;:&8+"2K +PjD-4tCRdK'l8E["CQ7]AWLj1>ol04,E^'j\.3=od>@Z>Wc,ELD#&;]A9!n0MhFPXR1"8'D?k/ +=*i[+G`K1n8R's$$DS=/EIV6f=#FHF_pe'uJb1V=$JC-uEgl,O='gd(R+mLEUCk7!K;nM^C+ +r%9<[L4N22J=o9<&WfoHYiMV#Ohn*PCB"YEl66PE-(q/?oML=8*q3_Si@b\76F=)6,-8&\kM +XE,8GA(oU2X:)tCq\[S5%RN!3mT\6mC/Unt"s)te(Y^W,&0q@e!S#ZP,C#XLCdd1(,`B=Uk` +B8`.DrCX5]AMWd,K7]A_>j,+Pm*)R5D$l4f?!r.o3Ctb`,`+6=I8W#5HrRXEl,%d)hgrq&mYFc +0=?n$gK[Yo-R?O(C[-KL,2/_aXPAJeo$kU\!3F=c^`,t"8M+iOuuKm8.@79ic"D`U9@G*2feb_6@\*^hfk?a8qglR(lO1/&\mr,3+]AF6s"pPl5CR!is0e8Se.Va`ZY84 +m'YHIAgW`f?YV,D;FXr`Gp"R_h7_FWC="BQcACSUnT1Ze*Wr]ApfB(P,12;e>VbZts=!8!Mm\ +WDg/+Knh`GhbHRF>DPE6lf%`eneI?`m'>$[%.P;PJ1K*MtLV1eS/TcNj@D':.@<_bI^";=0]A +BYEj![;e*gX/G2^MurIh(I7@Hr*"FNJn>U\UVb[Mh0e*m+2-iUt=lB):h_<]AYFD]Al+JT0X7I +@r&:LQlkUeL=KO30.*aaQjP4Y*r3[:=p`5m53efVioo[5pa%'aliZI.LX!]A7>oIq0^B\eh72 +`L?>KErBYc2PNJ,oZ6_=>(c!9euAdU4df5]A.@e??Iu=K(#B1U0e#"LXf'G*tt=n%Q:$7@C&q +X7-VV!;si,S&[M%Y$dIo:etSCnl<,._&`6JAcmbkH9B(W^W]A8<1R%"SSb>EK*\dn&,Z.Q[*- +FF-N@<^LE8p,,O+;NIKi[Z@dg`Csa?NgQYf37+[l0Sb1!4r+R=bi; +_-"Toc!!+9n,(*Lt"g +s&)62F(ml(gheQ;Ef0MDIf*\tl?coVRfF@E"ND["jId*4m#;gQ_lSgO&!#`90%il_BMfb$Z@ +i0sN4JNBjDYo-p2XG=W:+)Y:rq%dD[r7\QlTR!N)\ZHKM3eOl0qo%`_*_W\8?t.?2cF]AUAN: +F'A>9DC(*3"J+!6PBJg5sY_fGn=?05p1.-bqhlNJtq0uJdh7_l/uK$nsKQ_B +DuS%[TisJ[qeWUWa7l9`[jAal#6Z8kJ0,9>hRnb$BrhJZ&-6F:Bg+$le5MES@Uj0BfJimFl$ +nr2D5MYJk:DPDnKpo(jU +\.:m3Lb`2&FX8MhnOW$(Y^l/o;P:)eFdX`;&/VlaE4_UX6[lP2-%`n4Vm]ADBC"qd$+3$si,N +\']A)_Tdl#G*`:Z8E^*i9stGe4b!C`:qX-N#!i339PmkuBOIXPbbCIt6 +UZ]Ab9>]A/]A68Z&8eD7;gRQ5dd8u6m7OBY:)6b/1_V?,%C8?;:kNtI+X?*E++ItNaNElOn4e2A +0PZ?*UMn(kVpm-7bF)0ZmS/F@%&@)@Y(5$%+LNmSGR@5HEtQ:!-]AVrc-UOYO[$4:2?.M!\e$ +)?4c(q.$LZO%Vi:I"ppjM'X(0u='YauIP!%:4<=Uth"OaN`P(BG\mZ]A#o>DT>kFIbbSu +CN,tH;;QE*J0WN?kHO"$o[L"sLkTQM`^Bb4Mhnm3in*1%44qpc"$&=BU/T_>9jG3B>@E".-r +)^S46JM>p=?kd]A%,Ji#FO9I-.mBF?b*bmlgU2(?mm3N'GEIEbf;aHYM1Cr +)KMj:+bGDK!]A&[8U[^=Wk'<:/hQ#(]At.C@8)!j[L#eT"8["LukQd-?(lKKM&Fm4R)N;'UcFh +^ZRk%]AD3=l@=&.^K:aaR%..&5n9>=*Ro5>Jk2S9jIfQ@;Na`;$YA6`A +BJ5092*[3nela\ED\NeRf5(rc\$2r:mL[$u&>C&bgXt&*-tn_9p@NOL1\6&91l2nXcK\D-sG +9SPBKSJds!WX-"qjlcN$.^;Xm^jhEfgn#tZPrEF5RfWAo&R#@:=nRaqDKdl(LR\nZ9"i+4;4 +\+na]A;8-PfuliB\H=&a(iP._67WhZI/,bH`FHsGhZ!$e)R5+,=D1Y+no.s$#N.7;4Af[8e7[ +,A3^$OM,fY]AuP5>An4CG$%F(I4u9N>45p8('E),qtmAnTSTR'6$f2!>GGmEp0O:.L5=3aYQ- +N,mDaoog6d-Ak2SnG:8*5O:<_'AZ\,GZ&'\bbn("=P4b$4qad%=+hIGIbl=[EUQmn4A5fS4r +K0?"hV/N6AEE'J"W]A!kC-6s8W@%>$aQ,I5p2a!?g^r.J3/8k9FkA'8\Y=:*k$uZAmQI2^5_H +4(aMuVh4e3==-J8?7Q1F_>+,[d]Ab7,t7gM@?i3)A\qE4&/H!G(jPU@Q-U;*p!56oGR\!Fo35 +j7DZ$HZR>5G^8JD`>h$Y^[cZ/R:m,O_V;:frQHu*tJ*3\n!AUFdOSfR`^V)N\D>nqjhIK)+" +u@h&9J5m%r]AmT[/Wt,bi"Dcm^!@N'3('f0U>"Wo'd#(PbENiUHBH& +9.='[9GYhQN'Y.MpsB^Tk%4720L+D'#i9KK^\-hVL'(@pMV+qjAj+:k:Cm2]AdjK6.FIC?5`m +EO/kD+cYPA.S0W2T$X*I9*f&As0\Hc2m^U$\=K6`V=h@O-q(mVTNS0S-jp&,L0UK/TX,-Z+> +l/aK(A+,Q]A#jQ9:Ej5?spL&jU`it/s:sd:_GB,NbZ[mf95>$mWGFrL1n$/Y +SinCqI8.re=Xgk?(X3@U#qS;?)O0;cX)[p3hYk0>H\A-b(GHR$QD1puG[\,F+WZZ2B3c7Pn\f)'uD_D>m?e'2mkjSPT=s +TogAfGIB1bsZs+!fg[Fa#Zg!-"@Toh +!lEs6nf2O-Xj`2us;IA^3HL5mbea%?'emL8)bu@\SqKonnRg!3&[pQY'XY*b!rGTr55sp$30 +#"S.WTl_hpCp&DnOa_K[U)a#[i>-`5#Ns>Lh@?N<2j('e+J,DH`]AD$9g01Z)F6keMeRYfjoV +L_FFl9H&F/@:'A0I##X#_j%gF%o;@="91;S9#2!L@HrSgF\)Y/Pn3KEH(ZSJV+62XcgOH%a? +B`e'9.ja.uE&Z8[n!IZU5@N592EhJW-rZp(<2_E'H8=`oR[$8r9KD5B_s$gkVXk\iC;&X"3E +tlc^Xim=D6,]A4*UgV)NVf7.JD6NQ"nJW`2A&7g:`J-*0o&-slhWU_IYTB11dh3&:/+8`YL0B +d#X5:4(%g!s8a,5%mXb%U#0DDMB>#Iar(\(irW7&?TDf=n_q"j18Eb*D/]A7aQDP-kCTT$a9Ep\e4m4RH"&=_fbAfT2K8]Amq3#8clgLE1&LWE12mY74J<4H5b8f? +M@6V\il`>iV3'm)-:*OREWN=[,:?(]AJs2BUNXK04%U,lEYrlo0I.8[51*-0V&Yu(ln,s +DqqAV>b2q64naV\\Vg:N&p>qhFrJYG#X$+"ETheP^kgQ6+'ch=$@=J@X41>d9 +o,u9?nn?Mj%U8-V*"go6=jJ4NTWR_VgN?tE$%Ne`J58Zp[4RK>B"580RDA:"HL%4D +?Fh`*/]A_I7%NI<4`%ffR*W\$X.\]Atg2;l8[:1iB8Vo7&2q=F!bMN+,s-n6bZP6d1_VC';,U7 +tO6e.ItG_dq0Ss0V5a6_E!G`?!2 +)jk^K-3l&jYj!'9KQb\A_DI\BQMI,t2FZS,i*$#I!a`5W7j7qoqruDDR4/:?;7b:b?9H82(@ +mo+\m-a:7E;W9@`e;2Qb(\5Hogf?l+UV:,uD$+kd_2ejdag_of/)E%.Zf72:s1_;<6!-A:Z% +JYPDpa*k8Lc_(7J-C1'N+b?Aef,pEa#9Khm6RZ,DL$kcXu&]A2Z5[Z:CtDp0gO,\k$mlqag5D +qdpq(2pXRpM[jJ=UC^\sR]A!Ud?VPZeg6iPK4d_C"!%*'*)(Wd27(SdN$1?HXqA?;-#ffgI,, +b=6I!rRD=*1d6$j.#1i]AO7T4W-soXN9?E:0)fR.j!MRFnMNmnr1NX&LjUs$PmZSmp0X,s@E& +=+-?lkuA$b8V*/cfE$8eB-W3l`3q;2^9A2-eYR).\Doq)qb('WmBa"+HlK>fqX%0`%`o#&iV +V68AgfV^EBpWg5T8mF)W$7-uoGIKqb;N(2^?GH^6<3Y)lW7/b#LEBWUOJ*2L%KD:OSr=?I2O +M9uB$]A8j0QhUYlQjfC66p4RiT/,Ye-f?h5mm39HP=?`8o7?]A3G5?C`(`jajg2:0X90"qCE&NO4`!@rh(2;VM9W6[mWdWVA>BHQ98PfUG`Y^s85[apX9H +t\K9K=>LG.Yog9/cKKrNL;[u2K- +XfB'0'?@e@:1ZffXh?4N7!KcksaB`qC!DnVE%u1%#?VkbUj=F>Q10I'JCn46;;n8@AelW,F;MLFsemtdW"'A?X[ +/fN(nIMO+3*RlUQ)]A?-diC:,;,2T&5V,'b:p#WZRaWK=aQ5UnK*l%fjC5_>(']A%r[A8er%@S +d\fU=CBEX88S]Au1GLA\jq9<<2$LK`L--/[E00"&^dXgJAqk.:?To`%1p*mX@?2uR&&psX%,P +S[L7O]ALcPG!W(d:hJ>0JqRTKSp,@:XPN$/Lf#?(,ii?I0n(d00,=GqGZ,B[InON-Oa=@0[0q +4epCk4N(4_?3o!mESFa<.qVJpjbX.\;ma)e@DckhB$.)$C#d00ct-XuoN\moFsD&pMp)K>Os +)V0-;AuPeL@AIeW\m/KphV['[-E90&$aFBP)+Om;9#d!`O4tkQob=Zh`@=)M,`'rI6)9>> +.Mlb?JG`,S'<-Bfk?1lf]AQ03I+f+L%oJEp)/*>OHS?U^);lhg%8oQ/T]A\A<+`fh5qF]AD:C+1 +TRUmsd'.QF!0.$p_ABi&WMI:%kJPMd(YLW^9ko4f^K(j$^9n?F+cY]A:U(#"AVr?rrnVT+Fas +#dmLofmHI'6fo#m/\!\AHo?^C$;_Ya!!NcDGgXo+LEP$&3[XhhoDb:E*;(%HSo"f"8]AD.fEAp!\/^@gl/.2R27*n4[`@2Em?c.BM!)h'L02-B: +6hnGUP@PdaE7G-3e&^jV(,V$(_[+FPBWoAQqNV;8gqu75_EGA\M!kbC5&oYL);,9%_DA7PcQ/5+j5/\EYZ#fG7,j:VDcD]AdDh:$OL3f?DGRRi#I"-rp[*3!JGX_6p3f_OUKT.!"]Au +RVV)HCMm#AJ=Df:OM$Jf1)>jjLqK.cbrcQGd7Cc>Hc5TIjOL_"scg_)NVf.L'\(l@3>o'f[h.j@Om:Nib!kuM@l!iG3=tkhGVb1D@GK?;XE4pRgI\YaL'Dd?I,h +9_Kj;tO#`I3T19*elJU-gj0#HZsX!oj'g;>iEfWtgX!^-nr&N!$I9+2TMS]ATS$K:q5C7;Cqq +6Qi#l:+c=3*:LXn@J0#"X`66D/VGp/b"7^PET45Qrs4@=f9DJ^AqN:I@Ydp25Oa`ZOZ4>.>( +619[TT4AD-]A(7,j0g,Xnp%sWb7c1#.V+HkC9*(pKM]A=)$>6:"C(iWn-umFl;8Fh;ID@KroPQ1F\foL-/O3%L@B@,63Q65(J*SY6e +<7JF#Oi-6jmLjJF']A(k6X+u0"g6i:K2D_ki.lac(Ur.R1gc'o4e%qS4shnI^R]Af6A/XfJF[" +\N/MP$o888VGUl5UQrT.G\ET%e>\eS3ZJ8:0_!O=0:u`a'ANdlrQEE9T/bH7d +`n!"l[d&JXicXQ0`QGe&ngAX9Y0%t[FQa-C'7KHG8:n9(Xe.N"GYZE'Q@'':07S! +=U4[uY;@=[=))M,lc_g-O?FHrP+Tug.?BPEBU6i,%+HGi%?lj>$+%o&]AQgAZ+'29W\R-"&FM +A%QT&QaaA#3Fp!q:)Me0If/]A\/NW5NP3E=@\b1$Q5X,Q&oDg!Snp6hl24rn.fKG;G:N*$eZA +k:VI..0[` +tXLI=U4KEQ9^!Ki/aK*)l/FJW->XU!Pp/Y!NW2EV7]A69fFmU.3($jtf504]A[)lh^8Eeu-"`Ur`H.>WC!I+KXRCp^HhB"G+r>sLIR!G2^XJ!;"HbGldK&Z.V*KFmbDQ,=)[Dgm_ +og[^6D9Q;`8[k3%IrWbk^PW`c5/I:q58D2;>fs19du\P)%Z?.9-Qhu7m++.V`c.jcqaCY8E]A +FQ]An,;)Bg5JN*\1a.uH`tgn-f[BY>j?I:@FOa3),?JrFZ"fg.gm(uq)`Y1"pm>9-^+P'lhR? +!HHs1(b6_U_&FXm6^c8R%aEkY/c=Z?h5+Ts&Z]AhZh-Ne>!V4HXDl$pbXcaSH?@O:XJ]A&CW^c +f_eH[8*VtY@l>K0FfNk]AA8)_hs$AEpLLf`8VB.s#:,kcLalfFu +;ui8E5i9pOnON%6>DRXh5+D;C#A$Ku&)+f>C]A^kT<<@XLI+1#``MbDpEm&?F*>P5JkO +?,&!k+W^Z>8bh)5c!L+\5X+$B]Aicg!Mn9!;>W4/5R_C*19I]AJW+KYfnXh,>F%28M<>VCUR;H +9N3iBZii>nY#ks7_nubr/b$G]ABNF*1?qqu)=T6snn'ZaD6q=H;X%.3PE&!L!-auXLR]A,2$4n +k>*]A]A?*:KG@:Z2TYjC9u]Ae@oNGMrB%lHh#r>ib/!,TE>%b_[GQSB;k_f`$eA6MRuK*XLcS1^GKQ?a>1CcT;);esCFTf/$Fj"E90)!5CScJ'?1b`po1I)Z+"_Z$8qd)p,\ +_7cB?4#-#HGBlPi(%F]AposY2qfEnVbGQF\P/,n+r8AOk&lkVJ-2KN%F8*kQMWM9t"hM%e8-C]Ainb.2 +mPR7YH/6jpqGg"W\d^iVsF.LeRl^VX?M.]A@Etf0F<]APhb]A'0glBLrViH!Z@`LbeRH3u6J__J +BKOr75nG^s&rPqY_+a.=^c&Y& +Q\\e-'cu..I)L]A7-)Y!"!.V'`27!q4kG%r^%IjL=`TK/fn[T-=LL?5t0QARZG;PcjjY-c2I\ +To>2J"(=iN:\[aYk7'(lS3/Ate0G%`C#t6V'0,h%VN_nY#LMVG?]AdM\JKFHE]Aq/>-:ge:%=X +:eA;-n4*>8a=i!fZ_dY>,P:Dh1J3+>"D!!H..#D@+0X?#8fmo(tJJ),m#2H/7ciHS8e;B(TQ +If)X?,JJucSrX%jkr9`Vrr$:^QQig-l#%pTmR-82[gO&T3M`tn5>2j,0A`pGj,inJ/ce +fQdpk[fX-s:1^g@(fWF@V\Oe<);K>id>]A]A"ASTViXR9FPn+YP@)%i%--:o`&t*-GZp(B6i-^ +&BuGGJEF[u![\N_#Fc?&@*B<"q($K<8'ihD#JfEd$^!E3C<.]A.#=+HV7A639;54mNJ0*'u5;-U]AnaiO?W!eEBSK.@7D:!I!T'J4KV0o&"m +CLP^kQ.ZV>O:-o*hVU#pZ\?jkJ?k/gs`4_+A:&ikT#:\\5EsIU.TS(#*HYitJ)hg +,E"`B#Y5%R\gH_:8;o_,EIgWu=fe#8Gs08ZP(Umng45JS20lc8I1;D=m1T,.)6)+ +R?$UL_&Gi]Aa:!D3e0Cflf6.S:,G6%J$1EI8U8cRB^4S@Z"V/Jm@QoB-@G +=f'$,tS=pk3Gp$))*Z@ZgG/ZVf"Wn^%&p'R"r2]A=5D+Vk_N3/`[QTN3_N?[$i":ie9b`Wp9' +mA\\bj.kiGZ]AgV<;TH@!j:OK?W'DR1&E,jdEn-KC&k1fQ'M4_o0!OY0%mdq\lMC)W*AJapJ, +fC"R$*7ceiXEW3jYXfQIB*s+FPF['"j29s*!>MQ*n$Gao +V>/$gT"+%j&NUsmR#7N5'5+!6X2P3cG3]Alo`o@/K?X]A2:!.P7`@/oYs@e'RJjnrq"aWr2$Z! +)gH2&Sl1gNTs&)"]ACN=W%8LpMp>*`ET68O&#+]AF\F$o^CNc8_I1TN/c4!!6I-D+4o\1SN/QYn[-Q^thSS+5FA(34]AWb5J-nGR/:V +V^]AZX-EOBh5Gd2p/tfP?(FO\&TWrq<1Oo&O''J*nXsV +VuO$DTm-=hKSn/1\IaT2CEA0as06F6aqN:/_N/Y#Gk'P7>F4@o8(BS`EF*43?)k!Ijnrduq9s.lj:Q&gbSEV`N44d6q +V;-=N1eS@gBVl1:cWe@`LFjTUY(r8TejUeU=j9:>`##Meo30bnt_;'V7ciC;i;uhFZE*l<`\ +!F..!4t6B@#ui,2(Yt83EOA$Ep7XaiBm+2P!*Rr'2CDp<\h'l)J^BN)%_N5U/\(E/p+;"9QgtH%p;=dpG^$67bQ@8hL__BqQtb)K8Sq`T6S'MUEk+38>DL +$cd@G=$'hTEd_N(O[PXdI9Y0?eaeW)fq;66Vo`30mpTf!FUM2LRbQ2n>HQ@\1hmbUGq!V,r=8d%Z)(ZIs^!;([:*8_:8DF7C]AFcR'A+aZI71!o1/`C9^cp +75t9Js56.IMAGlGhd$rgqRuA2'&DI)>?.+gZ?pf0lb'Ts3RcItRFpTEj81@2F\L[DKbi`JnS5 +0ls#JJbeqb+f7nrhbm#[,MQ_MD?sMS!Q5%W@^]AddG!Z^(c;dk"a> +R96Gf@N#Yi1eZK4ilF)mnGoisb.FG*E&JW\B4seZ4N'g +as+XZgN@,iWg4P9:N!"TjIsmJt=3f_EE<\[h:LZI>*f0&\%_t+k#uH-S5 +7XLGp^@[%S+1!ebVEksf/1ZEdEBT)PM8%ZD?El:im+qn=2#)/5'K^@NT=gEkalR#SRsKn8nK +qp=45"%J9j@p3==PS!49jW^3hZnNYXmh)Ki]A4kh(SWVd>HjoFCr:b_q51;>BKK.=ikc#-N>J +AdTLa"Na:uh)A#9!su[%0YqB[X_YplfEA\XLn,/N+0@f':mbh]A5JGUM8@$"@6]Ae6sFgT2o0H +"&"QDqS,bn!Yta+s+?qP`5^WtZA.4o8gEsY-,oAN[QqV<;%\+p1cPCSun[2??V$g]Ac*/bC8B +FF=;U#B41#8NubSZD/tb\$6k+.V51*S2+XK]A3,1_=0CCC:iSZ4%GhAQXd&SUh)E![0ica*X% +$QR8'r&gf@g./e09\@1VY^'QXa_$3UUiK%lbqV.g[^aQa:adk2N_;Rqt,]A*hsO>G:LR?=Vi9 +Ja`Df7%8_&f8<]Ar'pNomQ_C\u7ib*_:&K`VL"I-X.+7Moc%*4:6PV_@+.LLf^>l[^n,&:?!& ++Qt(#l-Sc5ufS67RD4#^BpV4LFQ=2kPeA?7TXu%^r+Qm>E`1@q;k$P)1u&*6<@KG+;-q$]AHt +n!;,p:0lS$&q0;?l^_,@#329WoATr#u"lP"%JrKgLJN2TV3.GtY"(#4aA."1GC,,is:HRrY> +)51H(Kg#]AC?^Y_ZbsJ:n&/!s)Pp?6!0UPE;6a!0Ye]A)8,l]Aa1&r>s_LnL35eB +@tD;Vl)L(6HRi476KX9=P)N^KJ^?HQe20,`l.%P\:<)/;sd.dY<.dZ4E +O7$_&C;$!N/" +DN:d1CjQKQ%Gah6sZm35fM6[/Y'Y7[;7d\3jZBHZNW#$U8)d-_BK2T\^K;*fPP3UocXWleFP +,N^"&$Eh6plR,UNjjQtcpk-2,"=fiHRCm;TIk?FjB'4=t[\#ds=#nsYgqR,Tf` +PrCU/jJ729q7$n`+r\[--%g1QM^+:EFW6RTn$%Wud#`\1^`j-KW_Vhn`Uf*LMZ1m7Vl1+Db) +Ig"<%d69F]A&\ZSjOH&]AN#T;j86L3>.kE<#FQNP!M"]A,D/[dkNI:^&IYuO`-lLs3JIMb@6bTo +U#NmdpIDPYcPCfk;lmkLlnJ8%.$RhP3QV;JWb6u^pcMs,9rV\0^sqfJ9?7[H1<`brP:H5caq +"cV`TtO7\!G`5qG,pqJad&G_e_#]AgJ6II_:ttX`TWN2/ +W2&.\TF>,q(Zi+DiNoFU:1u&EX/($U42gRl4HD]A=1Z`9MJUqMEE0lpYKb3U<$D[cu=U06SKe]A%tKtsJJ#W'#BjfO,so=:Z +A]A%!I>KN5fg[?(GIPMEpGhY1dFNnK?/aO>#cTaJkY0;0D0S8'W7(h++f/N,]A;"R:9e1MVF?Y +N[S&B9Y0`GHLsX95LU\DdEBX +XO)#!E':S$hSl+"P5X2TX.(/sD +aLEL43[Rr0aSWgI(ARc)b)$Pi(n\6dGjgYibZ1tuHnlog%gC8_"cf5C95W1tW8"U$U7`r>j]A +ps/J.@EMkYF8=V!UmO^aQ"&D`qH$S4S"b-t(;cEomE3qIoV@[?Lklb.\F>QJ&?kWPgGb5SX: +e&/Z32#EUI_+Wq_s>%,!"l\5-0!=dV>Wapc4pL=i+HIV]A$U",4NNSkqUjV4/`3=KcG"*"3Fc +i@B>U''C$h&=5L/?uR4B?4sS_Y2oh*H5E+./9*2"@M\&sMu0dI_U#Oqeu"/f"NOVpOjOA^7]A +BSDi="7]AP)1!uoj)1Wd/#'1fGK.OiOY:m]Au8s*sFl@IN';/f#gLA=/G#&Ttb(XOBpLE=VK)C +fO%K>q=R[F?d=*]AtK"GLaP$rtr3-^U6PXn,>$s#*u?#l8sc(fg +/AFp>uaUG]AGCkP+nZ#qJUl7s'ZI^WTV*$r%rY9\7nmq+0jku`?-Y(Y&i*gio_,BM^"93*p0+ +blQt=O+mH-;\.QLDqa<,tiBcI$'n@!!8t)>I+"HqM6l'S"`oqZMfqE<6^Z%k<"?%+;_>smM[.c +5H=dgA*Y9m!nJ=!MRipeR@V)QD0#b2Qmh#K;;AT"8Z`1dgi*L>d-!)8t-!GdR!nK^gTVH6r_ +[8L\d6P75NEW#WXVFe!=LFS$gL?&\3-&0E,C-k+.OAhhXR"I\"\/QEOgpD\ZR0)b;S0&j!PL +JHOqJthA>fPT\fG9AQ;[MF5f,6qLoVuK+Z$M5l4k?`[,34!"F]A[g"X4C +6ic0t(XaGUG-`[?X?1Xn7O`GT*XId8iok4QGYXX_#doWO\<0DGn`F@L +&lbX[`02Y@R4/IH[Sg>YM/0B$YI\r5F4a8dsFu8_<21;Wb(nRD!qQTPZ.)H-F)I;,@^%=.bK8f2d60:.C1khc[ +\e7eQd5>Qkd@'=[4I\H#&R#*#)ul$(5G1c-(A?9/*YO=>L0.kp&_Q/`bhaP-X4'`60BZZ1M9 +5T;9K(;ZAllWkoiGYd-(1;&),r&/u9)sC"ZN-C/^sl.@8L]A?"=?N'"%QdW*INi7;cZNR?P_W +[3XqA/Wn'+6M8di&(PXc<:gM[5q@`8`lpi:Z:_O'e7Ub^mFi(9g%`3^>_2cu[g:Ra#RL%Jg5T!E_ +Z$cRIcgOi_?@^@'f7`UB2]A/U=]AO7-149PGcG`m#g+ES-K"itbQbTM[E[p]AQp]Ak@\HjJ/)il= +TodS0bu<71g&ZmNmj[O/KB[g#1)ATnKT*4:G,aDm;Xl+dhdg%dh0Y_j1p_#W8rW@?(@gSK.) +m'4JmbdmbTulFkM3&,Cab";kFoYMh>VUn!U@9091@Dr5>RI:A2mu.O_/4Z(oP"?*&Xl=,5E\ +WHb3m0GtIHM,t'"@'Y$^H`09H@\L4m.FHM'4Nra`r0W3-MqR^SrY@JO>KhAhHs!RC&_*S&"/ +hGHhV*8Q$haH[a,bZ:$ifrC$+Q%mNnRE=rh=)+c#M:Lk^!^d-5^^;8' +Fk-W,V.pKfF5_c8t':4:%#F?3RbTpbkM^W!'*@HEH<":=9Kiohi(qUa#Y;.-0lCf@'Ui7C4H +(K199^]AI6&ff&!fTmpZ8Yc^H(nR(IgU8UV?!69R4]A-fP-"U +64h`"bkPL(ADF`o*AFB3&,O+rhAKrGBp"rJp.P$"ZjI(Z&/20.kLrh<`/!!Mp@Xkj3GC=jPL +3hnAKL7LW/MYXV@*V#`3NEe2`BGP)@\*TU;:/Do&m)d$HM\!IXAX,rq#e"'=AqB<3p,23pBO +`H;MF/g3)PdPh-mm_oe?)^YZ1B4.E"KOq".3nYFG[:f2F')j@O/`]AM*K/M>)uMgkIKbP(JI@c +@^NjrUaUaKA1'M3OYD=frcUoS(VjMUf7t:@?m!- +UX7(h@+F2_O>i0)p^&^4fPK'861XsO'_;@dZ!OKlZ=u!a0J]AK]A[:uk25`qXVRcQ;2=[H`$OM +4!R[[$:deS3XR!S,/qMN1]AX,`d#Wo6NRWC0MfMP(DC)K3/uCTT?EfG<+p4L(Z0D@=r7r*KF/ +@0R^:!X-M\(9%%SmAL_/`W=WV0'mpOeFt3ugf>Ci7$*NZMN)%Bk*u'gSgUNL;@)\Y"+>6RF?hrPGuDRM5NE]Ae\HCXM6\'N$Is3fg!pSVAb[4tS +^663W]Aj4CRDEW45m,LU^4_888*E,R9ilf8f*fD2YrLKeF#".)mZ?Li;h6\0fm`hOa3?q_)Ru3Q^%6Sp;F`gtN]AlqOVg"d#Pu=Z&=MK( +I'>OF\7e0eBmMY]A$I-&b9n'E7%O)!Z7h9\9UXMUN!"/&D=/J-ZW.+#9@We!H([93W +h_4OQ6O*fp@jgqS]AFYmoJlU'.@RgE9+n'0<;VB%/CBE1i\HHtJ#Aj]A%)CJZ<%FB +:.F2t6?7dB!ol#-EDqtshP'0E-/&mi6o-'Xl3"Pc\C]A=A:sHNB@TF)e[VBZ,s1qff%V8*,Y]A +HKl33%[%R]A^2\,T\`8%_+5VG6FSgCTpqBW]AN\Y8E`RMG$a['4RBB%k9@-@U_pr,6m9YmfRO@ +mN@cP_e^3paDSe1KoU/@gF)/I&q-'T:("+^l5,Q7&),V:8A;&9Aa-WeF8=TVEto;MP-2n:C=)ViA(!74#^.:Z +=Q).LXEJnjO.@khrP^=8rf_i'I,aZfUXVu/,jnusb*geY9BNs:iu'OpWEN.i`jTfgk/0L>)F +j`*r`q3*:g7VlQ=HRP6/*2bE.;lc0$]AZHbMhWUdGXI1r_CN![$jarG]A@[UENlcnmCC*udFbe +skD->Dc1]AEChG#AH'W+Vt\"6(_I^$<#ffQKJt<@[e<.Kcp;N8fYMg=;WLf9-P +Bj]A"rZN+/]AM:*Iitt3K5;#5Wt@7(sPH^VaF,06>1Q'-CS'kC'sa]A-fVRNSr1LO*g:1en]A1aX +3JaIV"4iaq]A@&(BQWZ0PBSBsE<5m#q\8)j9>%T0:S$`%eV0H +J5pnWh7'?GT'uXqnAD(icoK`-R^)+']AB)c?biJUh +hF^1]A(:XjI-Al6^r!05Sf&Xg]Ap#(bI4)kbDe8P75e^2*(lX:W>bp4B@@.=`ck\k+apJA-?p\H! +URc\(N<491]AOsgFdi-^q*B;5oph`0q^``K;OS"!XcmpCr#J%;9i&XgQ``aZN9^]ANp!^)I*[# +=\n+m/==Fp/7/*R9Z0=%n8[EZbDU9)mb7ZL")WthR?)m +kf,S3m+5`)2uG-HF8'ANpR,VJ>:o&f_-1O,jqr9M/od)0]AX`P>P.eARp$DO]AnU!4+G($(SZjGl42p:%(#m*[s(<]AD2,^4EbWKKHt4kmQ]AJ*ZB7&G5ATcIFT +"Np[jA>D4"tT)7Th"PgbX=_9AQW`37ACdL7\,'=d7.52fa<@;f#Jd70`B_+'XK`k4%!%"Yn4 +).o6UY]ARFlAuJeN1V^,`6]An6.#%kW_&5LR4%9K3!0>cK$0*dD,`';;LVAU1ZZ6ai>0s+KX[Z +b_=.08eCG@D#NAcIn/V#,8oY6U>CNH2VE&"4Y91=G9PQuI0@QnDb)3D3Eau1TaW&/;a+JC0X0>/bJSM6r:Q9&[[&WFaU0RA;,-<(gW8\.XV^egjdtLhRbhhQI\Mq:*C:iGKeZa +*4Vd^c%,YR[/a2Vd@M+7MQ/!&9rN\A>be-fEG&HTC6"W@URgDAjt;S7iQ+icbrW+0SgL#*!d +Jum!hl`7O#5lPAVtUZFWf\IT@&&`q$tB!L]A:MEBB<.:a-Bf(0:s*$( +PqX+6N2C)(Z9e:sJBh3@^n.?A7]AMP-FLY`^Tps/oK3njYe[*D#Pp#Fn?:DG"Fpo)5XXY;O#`.FfotpDOVFbX8DTPfk^qWA16AMF.H/;-=W]A1"_D3[rs3HQuqI32Ur^b3 +@X$T*%0S*I;4-q!]A.^Ie)5ph77!$qg@2'.d[JW"MC5Drbik]A'fpi&-L^t`l,eYc'd?S1 +X"3PP$*B)>VjMm&kJR?VQdNpkjVSEtj<-['AdZ`t65[F`3iPmV3=L&3Ed*?WA:OM^BAVnX(< +qf3&'!%,4G%3`WW>W:k5Lm:9u0V?@YZZH)U_jf7-(MC%GpF&)Y^9N+Z#r)*Rb?UG]AA,F8qr3 +]AlIS,6_!E.@G`7m+,o5cBgfe&At&>MH.+.:nC6&!\+K&o-ZEVBq[mWhC1mOp)NS!M)1qpTi8 +FOcG5NW]Ap1sSA%5 +jX]A%0FUnpcV)N5nbX#1l]AN(,"g@.j*fBRS8dUpSXqRlV]A&k:?F#b6M]A8ZBFqPBB!URi=bcSR +b\7tY^T[!P-hK6jlN63F0D]A0ZI1gO\*9)Wbug>:J_YiC)P(fth,W*oR..mm6sV`+,K531A"G +5bBmXg=c96j!"J!!04k(j(HEW>'\nab4uI[3+gEQ<,:T#]Ap*Hd99!sXD8p&[Ne(!$<\.h$A5 +Oph:!e(8;F7Eo2?@4j-7!g`5,Z:>0KPQ5J5g2dbuu`*b6a!.Atr>lUm+SWoeN1&EHZGMYQK: +!-"D;rDW:d@FgG76gtBOJ(FORm#PX2j3<"3siXe3m*!SB//#ImXeNsTe!NiA'ndoh>Tt;t)3 +jtQ5h5C=Ae]As154s?!pM3udtWt\d_C=&n^j]Aje`c^Z$<090/lYu)3Z8@=i#D+j[-?9ai;X4K +tZG>(bHEm82@G((A)/eqUq-$,7P(S0TSP._9u]Ap(*),uMa_A[AXh52N7#TOW[bD%Id(k6;A< +U\PbmIPdMuSZlOjY4#fM9dZ#W!Tko[!@i3t/--Du-9H4)#?&"YF!4.gosg4iJD[+d@gm^&qVpOZWfUR=t]A]AqH0>$2HntTk'gHiTCmjZWEqd^d\Xg +>u0flLV5(LoS((u!dt2t<8IYC,A +f3[)e(9NrJK="W$S-6%-7lY)?*5^7>V/)EQVC0>.![$T;UTn>j=CLWf+&J3@u[Hk]A.8>LGG7 +\n0SV^cdPWZH,GP#KNd)._R")=\J]AcdL-gJW@7*o.gX;"\m6')?^`L;>m;rJ_=jplT)FLT54 +(FP(:mM?MEq(7er.tmb.7.fh$3s+*]A+anYUZ$"l>"?mI7RT\*p:*7$+GL:n3j9RF+&8]AhiJ? +Ha(a5P7i+'$\Z"u7EPHBc$$X(5,iFMb1Q+FHi40X+M]A$6E9PA-)#H;AKm_\JV)G,]AHS^s'.1?c +))XV3NkEeW6u9I(jD[ua(eXsL@TB7:r%2llh\apK/hXMMd%/j)ok3t&LD!)%o>a"346RsC]A0 +]AEEEe\iromL@`oOC#5YZQ"s*d-N[tRQB"e;Dj(Ye&k&c!kh($b%,ILI7DPPek)>BK;:CP+3` +PW/4B+g`d+#35EOtcb*JNu3]ADPcrNH@677LIAQEH/]Ar%;1mU;]Aku-fqVo5$E7@,@)NQ@BD\G +nfuqRQ/s0(.+5V&Hair.\^RbP;91hgsZRdOH"`T5>&cG)e>2#`X'Y"7!0rMQL.E6\A)GC%]AH +m/h7d/K[B:*Zs68L4&=S!dgGoZ/MZ0D=ikdV!cqqEjQFQ,^YrqRp[:q8<6Uc6ZP"ZG"QDO8a +"[fmjK)BGKAWQ!keS0M<5o.Gi@$KJ$uV#eGbF&KS4!MuXCuSC_Jnij0]AunE1A[['jI,a9@VM*ku@]AVWgWXd,_KHi0n +L?d:o9W5*+8GXP4=&V@$:-Q4dAo4^_&pn+,:8i/N'=`FKC>:sN[tC3;EQK&,V<(Q$eLAQ1@1 +_=:N&M&Pjt"?`57"1!j5:s#'p.58qOgDR@M+[gJg7)"nFb8.h0&6BVTBot-U:X9S^7ibGXBh +DmQ(^]A?9VX$e84Z&,N#b64L"ClR+8VN.p`JtHsNQ=aI*"\lW]A`<#\61$CtbSlj.k"d`IX#J2 +k`#1T:2ePl17NYuj3'.==F!T8r+$=4+=AR>I5RC*SXY&H\f"9E"@=2pg3VF.m+,D-L`4QJrD +2E)s9kI=tEq9V373J$L/0<"h]A.P==!9gpQc/fdu[C$709Yic=jAlTjFF&Qr[7>SbdqR$W!75 +-g1gSP.9m\5I%PS@]AaT;H!Y;8M-5qFjA52]A:B40b$ubk&->K*$/e)_m]A0,.7@_CPV%mRKpe) +HV+%@6^i82BrT?,NaS:`tP^oaTsnq]ALFa9No-CLkDN4%n>LYV17rcgj5AXh5#HY*C? +=B&l"&uIB3>Rq6(I-\,2nFhKp3= +Tb,)8,UJYCc<9G-r=d01!'rV[HNT8bPNc&,]AZ`.!#<(WW['?(Y\#%u0-;!ql`oH81m^5k8_$/I(U3cfZSB[dQ5-ha4rPUZ +$Sa>0HuD>X-@U%3@IG!AORnpKQ"@gVWp/'<-dGRh*FM]AIp^t9.Y'Bk\^H.9+J2V`*kLX-N$S8Zhe_#/n-CFEJ5.q35$Q6d6V1HI$RP1Z1h:V6XrPN[3'G>70K72ijnG3p: +KNINpt7)-(5Qcb+Z#9@+B/?Ti]AM=O@LjH%e[@%m7DM(UGMfE#F, +(S_tW_Oi6qt/1!0:gn43q=3VB$mbl +LL"!0#"*__hL[qjlCd%";XT^%oA[tL=@ZaFT%t7WA.,uID0%eAB!VL"DH&EWo_HkC_g2;-5h +s,N>q:,got?j@J[p!LnfhnA?@=#IpM/jUj+$p[s14W4&;TPLs5[[Ncn$D-3""HWoe6]A>!kR/ +@RA%f;9#KS$qc`=6C(-b7jE/]A=QkgCE(^@S*3A]Asn.d-k84I&!UQg>$ZNWEN3")[8G5l`jA\ +!Cu/[a$1SeO:^RNcm0WAqt2kV$Z[nos\^!7M=A21VBBLXSOC[++`mI%p1BD6t]A00j+HIm`bGar5"e>_%$9PTZ2L. +Z]Ac4chplF#t?QM5WlD[7AARLm./5WBULWFGBbeefrJC]A2;qbL%/t;P?TPON_^X>5nO(FP61g +]AA;n:h6"q__1AP/^T:'d@7lkdT9UmKiBD;W%Ma+P0;44RcO;PH0'3fr895h'$H`;ZThd'e<% +tT$--7R#F04Z[ih.n!>)EI:I!ehUc?8S)oQ(Rps2ZSH82,Q]A/FuCcr2'%c@Co/1I0VWG+RN:Z?Oh1(S1aCISbYb/*7pC3%T;0Z%be8CEV"T6 +KE'O-qkFD;RR!WHBenWQHhM]Arlc;Q$Sl)j5q*OcVgeLK@KeA>rQuYj@1 +N86gakWSAKCASq+Zid$9lP:6]A+gq[[:Ed3)"F&; +@+P0O^WVQ.Q1SKK&/n!<,nnDmY$/Ef&'b9YBc!Lu`R#W/?"gl\67eNd/&:DDQ,4,4KkRJW<# +?L;8X[N2-*_#LXhs0KQ#93_QEkE_c[q=PQ9gsE=V[!E%S5\P?Xh*\>*^Z4%p0,Nk6Gih-CFI +2V&BF@n_t*-kUSq+'fWR]AOdGHaVZ:okCd[F:>R-0,pOSnG=DFfT3(I+:!)^7NZBt_O"%B/.& +f:;^r?5QlN[`b]Akn]A&M.B5+sJ",18[+3e`GELWo8Ql(ZpitJ@.5S)N+#='LQ1'e48g!2UBmO60k=BS-HEca!;;OZ+AnO;PIc`qM;C,:!m)XT=#@X;BaJJCPor@bQGQ +$+2pmmg?b3LU@kjP&5%Lmnur/GZ#C+LrMPS2u1`O`JU_-\`4fS4TO:L-q503$#,+HF!70HGg +4l3`Kf@,Qps^`M^]Ak_CH(/\sP/]ANd/*tVp1bZ)Q@^7B[`YY3FtNjpR.(lm,X9^<"A=DmbcZG +o$Pt#)c#sOeb)"9p$U?XdjNmN5!JHTOsXJ\bP&KSI(p1tb^rGVk?Lfrrb=0;Z-9lr2ur]A=B5 +2C`=f0_)lt.tkW]Ae[q[(YhR^6B_,NfNO6O6tbp[`m8aWZ5hDRBp$>ro"CcR[@Y=_&^ajTo^J +Fe:_GE>r"UL,[)nCin9U@!%(V-4]A?%mAA=mt\IRj]AV7Yagn+f$4:aHRQC\+PPa7+7u=fJ:W, +WRW6/WCfnZn_oXqAlck?5bCL[#.+i+\A!NVE+#l]A#Z`W49VFEQ(R2'*?[aV^d)'D(#!E+e", +&MFlNLN_k=p#mO,RkG`^o3=WDM +I/u!jLpa??7_6m`'H%QEp&!=f#;`/_o/WP.Z!g*I3L-&5F-%]AAOq[n8(Cn!- +Q(HO\.&Us<1as\h$4-;gq?"H'GkE=NGgID(s3eUHM-`?PJE#]A+sXO@b62fDW[_0bM[('g\q! +muo,!ds#u$kq/6Z#4\/ehY+GoYnUo4eOt2?rhmtW9rj!.#3aiB2"P!lOk3KqF)VmGrHbD1nE +qP-"\sl7rnN#Hi6KJW&!k)kB2Xq_rN'aG9[0Po7V9[D5:_e[ru6ogc%ec<>h?3U`HK$LrkX& +NLRWhqTQI&l.'9P?JM&%:`K/:&QPaD&kU1"W<$[f.S[;R%>o,17YY&=`a@=&\EA&0f$&OS4n +[25msasdX-R%L*OtA*V.Wp#e&p@X?RrXor;CD,2@K&hhe3_aTi7G?g:j>j724gf8O0Nl<^qJ@)]A5?"HB7bFi[D-d/pJu\)?6OLQ<7:HhC#S]A5B'WW;m +rid8jsPWPKAo^uN0_BUR(4&- +sX.J=WYY(\HU1,P!L4N.NP'8$>%Fd7P(t$;R=h8g! +@1'oNe"KB^6<\W%i.1]Ad:s`@c-h?D9#pkHTd:lCbb&^YtX\Q=GXBsE2DTR+=Q^\Xe'&oan`@m`oSKPiKTh\Z<2:^f)esEXsVrm###d[6"BF +R[Tcm0Fmbu?GAq94Uf&M0F33!i,7LdY9[INMeCNJ7DR,)mP-LL92pH,Iqc;4c3mk2B7hE:s4&b7ZL@.C`;?laILkF'"<`u +$g]A4)M^tX[!Cl,g0F!8Kk%O=uluSg07bTPe,4^j"6#IcPW=fi*">FWj#iTeha5`O"UKiLZ<-=&j-E +iG:/sEmKRa`LhW(p>dHJrU52B^`E9pV*bu$0FO4W%=fHQI#=m7A9jEuoUY9`UR1NT>,5+XSa +B#:7_>$?l_m68B*M(Q'!-ED:t6/;PjR2>.b3:=F-Y<;)XR5f)ag$+V!gYa)s\'>jV7AKF6`4 +[RaWYS/1M=?f'tqoJg@&$JdmpbJ["(:P!Z=UO+`Yn;77486WJCPV:Zh)j8]Amph4+,8X7:GcD +b!R3k:`,gQL;S*CI>3D8iL1pF[>uQFhNmpNX&9[1LQDGh&E'lJRFdoqd?]ALF)r4hV_A+\9>]A +t79$2l'%Xf=[N)eW>UQ!\uLJe\M#p9!hY_/Do;?9ZW_aRb\@;IH3:=BY&S1n^p1<*C!(U[a& +A@-.<;A1>'CD..bIC1&O=*b;1UaJFsh0WRG*aR?K.Xp$_ +k#B7]AeSPEfYL%;Lc-cH_s!OQo7N1gnH.]A-!g+B=ZFN2C6_=f(MJBrc?S15;@)OpkRSW%eU@@ +*K+)3nQAc1e^B8G##T.+iD8mF%,[YK?)Th*egLc7MT4o1.)d$Jf-uZ,9psqkg7^L=[e)qBbk +i#.b6X,KnPf_:?60NB+gi6]AR==G<8_`ebpO-dkY;4]A@t6\LH*Tn?,1C7S<$K_^[<`.S8Va;X +]A3q/@Pl1LTa)6;&:X>WI;Eiorh0SM?US$kidLG>RY';/K8?D-s\mbsWdJfr)L-_ +rZuL&/=\eq;DuAl&EUHX/clcJ$C9p2AXM@HJ?uqk1@$C-.Tum\a=>]AEOVJ2!4)^<#![YQ$56 +^:KK6^fR<6+O#5_s'.W6^=McW`gsp79,@S0*]AO[BJ]A9%dmY5>EBPY(p>aVqb1^mc1WVF3CX* +52:m$df&(!!m&I7\cbgfnc32:B2]A>!"mtPLf^YKdK-ZBE"\t_f5<8.^6+@*0&+< +!d6&"l%\!YCYALPe)D/Xu/W*>,*JV")g:gKKH2mu,"6in.0QoDRNW63+Kr*(=NXgI@=C_H#A +XSPVW\&"mI/FsNgTJ9c5"0g&Yhn.Rj?+\p!\]A9mA4;UfFT]A!CYV"KD[_-'Gi'P3N3:/lKI%P +18m?6\h=ud51!YhR)%08N2MaBe2.g)R%NB(dX\^!^!oV$@m.:=:kOT*aOV&O*I6;98I=CU7S +[&%Jqtl%5>iRs1m)$=1589f+kW[A>4ZC%&EU)ZECTW;3Z4m=LUXj`F\aTLK1`b2]ADuR69=@1 +Dbs+k5tC6Q1?nsJ0mYCX%DFJACI6`o9m?s%Dj&kqHR, +rXi=4Hn(uoB:NWEuBlEIk1Earc5nJ3Vf:U7R8IY`U"*9Slc`@?DqU)(e=LI$;;+'M]Aloak/uJ)& +`i!m2paK9%3AmZD" +L);O^@0OO9MS;O,MT,q]AKY&?n-//J[N]A^\4kBR6cK=-fUk\'$9F8PB!N^q1dO/rnL>atb+PN +cH2G=(/d6b=nW1%mn`ZN(2g-4,&\u(S9T%$XZcY$AA)#L=40lB$gf;pB3?h2C1X* +11i8]ADaqW1a7E$VUBUe"Ler&>%);3):"-)RJ_:u4o@7rkJhl!=4q_N85(Vt)eK!Bq#-Iq?Zs +f=ZoI\p2NXhZjd)d#t/11OHE1-?kEX;StD4$mu_(pQ-O\T$\CV9^AaE(W'Z]A.PSCUHWo8l1; +jAT!8?qH?cn79@>K]AbPmk+sfpS;?JXRP<DRb?OH +*?W_'$?/4VoS_tGf:0mGqUtl!=2$Ae'j$MfZcphQlep%JQG"3[h@+S6.+P%9\(gT*-7"`T%L +OD"1:+/)$E5sl]A%i#H"5IZn.N-R8iHE$/dD2"fLTE8Fj,7^Zi7&QOOP%+q2/3f^3OsA*FSeN +`)k4FhgDj9)7kbHQ5h+YW.Pc1RI#hRFW;S%= +*qjLXs@+c.SAJPL&"=td-H">g=soBBNP'5ou2#Q01ISBrPb20WSas1!+ru@VkT;T)roR;ar\ +9W%c*t17i&:fFP<+t(`k^<2p3car@nKb5G5tu4BdX50]AnP%UIgPdSBH_qhIRTW,Qqtu5Y85K +p-$=!ce=4trd:TajjkTTp-3tU!M)1QYTa="2Jij@ND.l%Lki4rp,UO4g44,NI+ +Q+9?$U#6P)_#hG&VR_Tl-S`!%B#%`0tr +0,#\;F3I2go3Zl@8Fh:^/9>3PbfD^2kuabGN62[Q +q*SS`\aX3:7U!:/ePq=0OPK=k1dC8ONGDfcckN344o=&khVe/9.M6]A:)F@fnXOOPG@>% +=5:5SGYB0q'@BcAe6T,j^JG'6j37Wt'H=n\i\r>O!_\%P^ODCHjjYSa+)S'Dm[4qH\TU*1)_ +Ho*9X&ELZ%p&s%MgH2ID!O+3jLZJ-uWh,GpRVJ>?t0l^)R4UPudTl3Rea<"lf+8$Vg-,*.]AM +"Jnp[/e]AXgdlP]A#JbatCVFo,72DV[4U?,Is6Z50QeB=i*7)]AQ>G4Y\h:R0 +4c_;Cem\stlXm+a35D7*8SMd!8"5Q'^MJ)*^_d?q"iUSf/[%-Tbj%ghZ>;p9X;n!u?ZMSgo=rE8]ADs_>_!ec6-P$;-!/m>(YLP_I5Ek6\KW6qp60`;Kt\5@DrdBQL/N*^` +BZYC.[D`0!1%V9t[-@XCn4]AOJr6S..$,$ +A>!:>=?(08)A6ZmIV,W\n-0o8!NiOI[,=c-R\]A,9VO+B88p;<,pc2eE+-242S#RV/]AL_n\k_ +ft#iOkSe?QXthLBm*+^1:d7$Sq#N2DV`st9H_::qFuEYhhY+8l@56;k*N+,MA5;i!j)4PV/@ +2rM%GV7hm@G+`eoVrnT'Va)30e5-gT8RTP@B.8n_`#3n*>Kc`.DD3UUFkS"ii*[7Q0`c@B5D +1Vo+hebN1T#WH`f;X*fAJ09a2OUe^buASd]AW^[d*MV]ARG1:/$.FVpbY?j^@l%UQ5VFV5dK&\ +rfuIJr3lWg+bKa:MJS3ahG=drr[NU"AQc'AdN&iA$0Msj(EJaQd)6]AqE4#<0$I*INm:8I5#m +>5ku-u]A4S7d<*dE@@$Fr`[oEMps]A7TOGbe2RZ3\TjXZ:59F`-7PbDA6;f6j.k"4XRH$Qhh0) +c&?K^]A)fi(peCcgFX#=Jhb/u@=@MVX]A!8>h`Y-?0>`0ZIW'AB,Z)0CH>'9ZM%2H_G$%]ATtE\9n;T +i#)IjPaE8#skH,1b.i^c?M)Zk.=u0s@#<5 +`u"r.ThaeWnNlDA_%#60L,`uEfUqOC_^0nC3NoHoF4?7[pr%(*`*(Vhb=V,S]ANp4&(=jQBQ+ +bd&d]A]A:E\`6\#&tYqXs90QZk +]AuirMFhaj^l^?:@^9M[oS83l.q[C/"t4iVH'O+9Q2@V;rbKmhnY`.Y.1'nWafa_ilrbS;fOH +"iYpUO$L!Yfl]AdVDe9R.+@HI9[H?Q$"me`XRC\.HX\UCf0EE#0WY9*/7g32@2p2=6Ms3t!3S +Xn;U&=D!6f+$FiA5n[C/bP#=WFDKk"tpO>moR#rpE +s$f.=$Nd@qR"h7E"hF/u5[hmp5hbi#fMI+3IE.m:q-ESr>.48,[t@G"+a +&bVXsZB]AWmb-?$W$7'HO]AA3IFY>"C"sn%9MPbU'1)$._+8h$tT_5tYUG;.5L#7*?CQ.2)u_^ +sdDhpVUSN%<[?t@L[N+]AIIGXX]A"NqqM&j.G +If,/0;Y8be!.)D01=^3u/8$*H#Z7**4Pc\h^"_XXMt')%r@$_)*-/@bNF+/X.4-mW^2">pa; +R.nm^@;/E\C@+_&#*?;BslCSmn05YfAR`%B1>.Rk+O#nHJ-o*.;;\.`D6dsEf`*C:ndp9nb6 +gDoYYB)[FD6HZfN9IIke$dQn]A&jeZEtQ$,1c)g\N.B]AB3nO0=N-qJW,1*Z+)25'VOQ$;l.dm +JI]Abi]AE:j8d&0PZWF/NnT*+)Zgdl7cJj;q:(f3JP^X)hKuuI2rL,%+W5o6/cciKgPL:IcAZ` +56&15akl9aBB+3-T9tno\5tlM]ADLq.B90JKfE7OM\3%fj' +82l?j$]A#cq_V?^!7"@R/NuQ"q'IGlZWfFU@_^SIbeH3urX\[Lq/HCPoqRnAH-HFQNVoW#pR& +"#2*^HaNk?)G[&9f=Ia&B[IbPq`%(:_/KTX%Db_X!).M=B'SF#Q)/8VBrdt;HPZ)kdR%]AK/7 +tU3>V2l&M%FqJ.2,%$'ojWck'k2Jc`YeJ&f]A;bqI8H5=0.:u/Ju/k?4<6136e=5JX[1H(@EB +9c5c6="5fdZ/sjcOFFsC_-2:GG6s1,NaT.\:W+BZsa;#$8)+;::9i_D6?7t=^"6O:6YY-o%Y +Q+YkAY4\eRV3u#:Mn>W;0R&bs0Fr]Adm*YhJ*a(^nt5is0Dkn*nE%\3rSRY,?i8icrQ>`LbQ$ +Ti+8GMiI/&b@hRYb8p4?UIGNs8"=-2%$[c0FA*V>h]A:h5\AgQe=&F^D")dHJFuRNcQ[q(h9! +L(Ohg;f*\p?pl$-`]Au1\*H_]A4NB*e5o?/[=g1TWf@KJR9C[OUpIC$;ahM-TTAL-iRkHNVrN8 +Sh(`ku[4VRV!Sa(4^$LDD8:_!)8-]AnZgPd)`U$^5PNc]A?M$of>WUbbK#Y)N`;7lR/EbUN3\. +B#Q8,m)rh*h1rF'\HD:beC+"+rLR!p\Fb]A2AJ+B4Lrn5=n??9eGgP'27rlodsq'*Tp!8D7Qi +cjh1DV_HC@U0f![bU8ElUm@4=N\Uo^X_Tu5i'P-)/[oWFH(hfi1sbIp2S +<,s`i:V:D,%CfL>=Fe\5kc0`U>,8;sa[OK17SU4DWPC?hWS6'(hcs6 +k@0IT^m8C:L.UpUJT;\la3h&n9+MDcq/e::TN5W7;`.L[Oqc`ncD)'4mH@<1KRfkL-LDEk"f +S/[1kW1(=7q-EWG#a('jRk')?m_H4+=L:=TDH`lIe(r0qon4eq2mo?j5#?7@%I7Q_uep1i\f +Q]A^I\M$jYgp++Y.%$E\BDO_(b*Oji9RUj6uk85PP?VRqhZDDhbUoR +LOSIas1u>)q9FKh^\g3+2E,1_Oo3`nkj#91"nAA)5@ +jf=srnm_0pO1rn^@\+ShXJ[S^#:iPGhm.Bn]A=RVI(l&C-RAqt(LcV$]A@)I\h`ET8;C*?ZaFd +]AgMRD_)-;Bs[Be=^?RgWN4O*m>uLfJD^-E=u6L0sBJ>CoBgk%3qHFen&/$#q^Y@Qj>1egsPgQ1gt.U6e$e6i0s\'O +?`G1UNKb9`%]A_6rf+)nfi!1*s14t-mYTus7oIiq9e+!%@DJuH#drmMNjG6m&:@t5=lm_32q" +;Hae6A0Q+GSMo5'-^l_?^eFIU[Re:D1:`n%*n..7?I@]Ap2&!D,JV,Ab]A,,MU$RbI$18)%s@q +u1uiWi"(NSpk_Kq.I$hHXQ9PPJ-SD>>@B09HI>LqZ-BUS``37JR6-9+&Wo/Hb7Y%[0MPR:ZTI%0e#/f3[p7WpifeIUGYe1r9`HkT4A`qJ6KX +iXV=HRd*%PE_^1h;^O&\,@UBIaW4$Y%t5))ELOLFSZ(ZBk-kWrgp">%p"oh%0GL[m'`7ht-7 +(HLnUno=$j[\f8,M#M+Q*:hu:77O@>/fa#k\Dr#a9?17WUf=^78hYPfArl/l(kX-Hg=5uj_a +&)0:`F72bkQSD42bCCL`g`]A3qt=b[rp=(kPug*?d$l)*hFAd#D[3`Kf4jD6(\+@BUc+\e;&1<>R0Z"-DZql8g>Zh?:ol^Gc=/%^ +(uo:HL<5#bU;Un4]A*mc5n0>W_o(\eHGP(@qb6;==QWCptdXB=_^)VF+?2E(Of&AY9R% +I`4-Xg_M8[JhH"'rJ?`78s(8p/4e(M?l(g68V?S\7aZ,gm8Cd(=0WNOB:e5 +:XY',eIif,p;Gfb(?)uZg/^LTHrf/G]A$&lq=_.)NSX'V\>5C`Bh^SrPT)nD?,MeDa$:$[L5c +]A;Q4+90]A+XMK,LN#t%]AD$ukTeDkYY((KI\A=tAmi<).oEV^,`Kf9HGO=i7VY35,@c2o#'WDgLd]As587GGtaiYl>7_14sk,o1k-WnW*s6>sM\+b?lhtoq$s5)A?ihc*lcZb"_YND$h1@[U-b +YJ>rhu2-8^%DgFs5G^0Hsc./A=)$8-*DCP^g%Pdq-#?Mb!Val:j1>m%4D2JrBL2EQbNC*YC+ +kZ4nK1JoY)CM"kh_Bs#kl3]A70%cJ+Q6\kQh..p]A'lHs2b(dqF?%r7t0A<]A^>BqJ'2V7qlXl7 +epmJPILd@dbJ3huJ)t&8dP(XK0E0hsr)P1aQ\u0p\D/c:E_TR'%his7))9L4d(<-XF`u[J!: +b\GGM_i;QbVW^YPm$R^%u#QH[?,J(\;@jSTd,&=neM5qWE>(-f=X;LHkObT3`sr[7nuI,[1B +.l&jQeIl]A]AC4q):[Vi:c@\Y'e#W+4]AKS'f%[[$FO`,q`tCNo%m@pe*ba?._MY]A"BDa>R)@7g +sFZQ\NcQLKn0.M]Ae.7d`."A:3YTsJi[e;'*.K(lK/"t;W8GZmeb^)&o+U]AholaDo>cWAj8UK +UEEK!kW%qH!+pq"TLMl)<JD\f^LfUU9O*+Yc_p.X55_%^ro-jR ++gmb,6f<+Xe4uMKNj\tm[XdGQ#`.j+o +AhgW\8o"ADCr(G.!PUp4?a+NY_`1df_=TA1_lg\L/'&pWpM"48kR)9t;rHY]A]Auj4lFK!X%L36_$Qh8i\b]A0P/9sPp#_@Pka-)[ +VsL1(:ngQ4@._N+F^$;Y:TA):?a#%p2\a[%grO(fO)%q"bP0k\9`:?#h6e`bV]A+cETm6>'9Q +Qm?Fl^lo#=F>::Xa9E,QfOq71Wu!gs#XQq@otk)o*raLSJ,a`,q2OilbF@AYD%GO7Gu^e(qP +3/&,KeeFN`YhgC-F1R*5(YJYB\6+?Llq@psupgrfr!3M3#`]AQK.(;^aY)EVTK=UKr%\L=!WJ +oH,Bp^$lR!!g.#p:)Z?.4q3?/Plbi2ecG0,M=2"Mphu.F`';uK`bC&2ohtq7DHf]AIan]Abuum +H]A5da*p_QC*D4^?0DD8rBhYNsCI@WuD>F=H"S42n4)'2Sf:Qs7K%#e%aqthpjRKpiD +;D"KAVp*T+^.X@@jBo^DhDNN[ZYhgbOX^[7;ir+GKu+!b\+Jm=`(EM/Y'Vn(Y`?$?@DMC@[t*^%7L"ID`\RnP2@-@Ph9^#:%i+5mC$&J,BPds7 +1)Qkb%h/ci25)q;?2ip2>?>,C^mj31FDuZ-:K?U=$DE(/OUZ+edE988`O>4*/9<#LcsHhklE +=U^q&nkZ.p4'@R9"N"NiFUT7Es#GEN;2*uP/c,iN.#kYe*k&u'^L%NX&YZ8!74#%;&)ZQ\C# +;k%EEV_f.Cc?/-;9@tCdMpR!Xch@moLlFk).ga$+7**8Z;`*JMQLDC%-+.OWkpNrXOO@2i>G +Ad!;GG#b3nV^NXqua^`pA`WDA&T2bs)#j`L%NhT'bMRE9+$&k%?Tm\$ffnI@3hZn]At8*XTb_M-rG.Y+6,tK@Au4lfOP[?;OM5l@ +SVG^1NYRWqU`h7[#;CnsqnQn#=>KIK%@/rq+rPr:TgYrSfor]AV)64e[\=+4hGDoH1=t=]ABZj +i^@s#4rRU`2r5KbdhtG]A4O.suf2[h0qOI`'LUGqIuSN*(HL\,p^!AbMgj3N04Vn?hKdl`/-f +]AQ#KUE5Who+tb-Cj/`nI8s_'(U(Mq1);0ThnJKQ2qP_Ak*p9OpY7PHI.7-5$<3Fc7=un7:&< +Gg8Qj+*#:"+.62WBcr6lBn03c)^ko[+B6G1qpa$LBJMq]AR"n^oE]A5Q:B/U\/2p9,eelB$DOR +0!(L0T<(+F>F\Q'd&/g1_K8nu\1$2@H3LT9Xi0+hIerMWh0$bDGCK.DYMK2[YCHM:lb;le47 +<%G2t"3Kl>%;q8s`N/<>QB/eC@oRn\nR9Elj;B?2]AIM0"HA_3B(5`H#7P0I`C[\Z9#:g#_">'dT'Dt!((ZFrC$$;5]A3]Aorqh*/U +mah@N#>DgJK?"Mp*Sr`"lL:V,)0K(=XmO$H:C`mS2UHb2m'34=<:F_GgmpKc@3%(XVoCLOiZZsc;XK7*$ +@\S5&NrM"*9Bnj&SVE$BOL4Zo!>)JqD,Qa$[3cD4DAlVfPYO&CbNh]AETs3,/cKNO'a]A(4$Et +m$:P'@0BOc<"d(>qq>aX&4_(9pSJV,22cA(S2E"%dr$5Ib')dBWh!`C,-Kk@/PeDhYO@fI+N +CiHjE*M-(-ZPk0IQq'J]A4TB4rH22_R>4Zen^\*=(j!fioJuPaEO7'P?0.UgHD<8G$,!tlI<@ +*t_SpSl_qMUd\Q8MXfY:-P&b+fc;k%pUs`jrm3S+C.@K!k?!EbgF8`+=7#.P"d#-r.#Q`+@" +V1P$hXC=t511R7n=bNd!n%ZiJ3erP&Yd@lkHJ(Q]A)(JsMoULUY4TQ;;W+>g)^`4Dq3e/OZa- +Th$L-m3G2r7K1IV6?0"[LA*UkBhC!TX`^eM;CXpb6kOePg#LlPFl3PPsk]AeJU;f>H%&'QhYk&SJgDnh23 +UAj-d%9N,j,Lab)FEVilKLLMh +^pSkAtNF/c7-.4tNlnJ,DFHDK<6/Ik1A=`i^X[eT`Wnai$ZSbQgrKM*?lm3_e]ArBJ@%ngR%( ++cs`+,j)`a'No*cT+Z!'#p(V33&R]AiM2?gu +!dDDs@+U?tZo&r\qE``\6U^Q6^S+g_^[:KFpp\mrHYBfd7`kFV`rcjZB=gP.^94Z=DYPG=;<@CEg"d=Z).jnE=2s^RVW>!?"EDS +*l0g2<-nR.Rg]AfgdUO.j(56',>J,>EO5Q8:ls89ZNs7l1-rTTY5]AjQLT +1Ps3WQ&aTUYhE(_240)AlNQdeHV;h,m9d+2aX"Vq@2omq9P*dp[$B$f^R1tf2o/)mCDE3^&$ +G)If5c3Q.9s!.g`kXR[Q.K^ZjsE6O,g.d<4He40)F]A^sl=^7=,tj#rd:sqPdH2@+*MV(6dQl +LUrms7o9@i'Ebm5'hjpB6>rlG3e[EnV.CbP&/rp+6;A'#+Vmsfb-,G*85>gg`GEac8/=KP3e9g_U:L,7u,jKVKG/Ed& +?oW\Jfbk:Wl%52.>0;9MQXV@m=,=_G3Wc%ZOo=[OIhmEd4)ma8bWdg('l`P!(1WlFa\pjP$t +e#H!Yr3h`jNh'BQ/sEd1Zl%@;R6,s]Ae1q%bm1%XMW;dud'$;(`^m/@X0N2@?^l(>lQ&Lu$1g +p&C;AR7R\:JEtGs"NLVt'=+%hNTSrsV$,PeG6WQH_cq;+TZA*_2Z(o>GNt8CK[in0cbHYHWW)NK4f`9+nGT]A2FM/1d-(Lu+E;Qe:fA+[/$r5C,6jV`7/("i& +754]A!Ln5^H0:H'AR0f%q&tC9Xr=IH.'+i?4n$&&9:%J`Z@+6WTrE9iE$LVVdsi[\IR2GQMjH +%ESX&m3"2Bs)_$#=m#lKl`O-IYrr:JBB"FP;Q_$?Jo%pd$Fp=@BDfsfaaP<]A\_.i"+0p$b=+ +`J%$-lH5"TkK^'u3c27h4=9)'kFG[<1ZtjZ\[-AKY$/A6o[(/h$_-;AABueY.3aQi*9cE#3a +e<,eY%&#lY-7ohuEQ6@uikJa+pknge*/nHH[unUKujOf3^o$AU(.lbD2S\mbIg3L[XP/@kTt +C[tb??J]AYa\t]A`-b.>Hj+XGU +F4*sar=n!mhEA]A_9o+@X3%;"A:]A)a&a>.+>7S99@@(8)TfNb4.$m/$\$cN?*R-e1\>rE.%(o +id*7:]A5SK$/U0mW8Q=_)%tIC8Ob1K4'D)fV1H>ue7b9S8$$bB_G[@O?QBq(I=hH30%mZ2b\; +rBIQJ"q9W?0-U.H#qN*c>;6d,XUW+GEL5W)!/F\Y!"$VK]ACSgYMeT)lpXcK.2,OHFWXh4sKG +mZT/a->=XJ&NZSW(XA5\M?l2T`HpZn'pqbHB')pol[1rh@=o0>)j[#BTp0>g!\E@e-m9lm!n[=pG'1-]AQl;a]A,: +#d(Bi1#W8hqbPuW72n?>Y'qE1?X`j9GpF`N6eFB#LB"W+sJ>@*4a.&$bL=X:#Nb/u!A^7`#9 +YLc*lNiWWdRL.ZDo$7K='BfFsB\7;uWCQ%69@GGA`?u(??r9Kg"PQ@f]A0V=,AVWT&KJ\&m@1 +XqYpMr2GSNsQG5\l&8!.7<'JiNAK"cD&"W^d2JUI3RLp'(W9(/_XMe"tH*<4$c(I-JViU8", +1>M4Go5g&PElB)>7<#.F;YKY;:3qp9uDV7D9YSd&5d8VqVeD>T@_Du\[McMH;P*_I,aRASiN +.m%AKmF9_M$S[gA1S9$,%s5pMjukW<$HPLXuM1JpA*mC&Z[f.II=@)<>FZBX03jhYHP"t339 +JkM#HJ1Me:;V?8d"V7=Keqm]A"=UdG_+Jnri"L=YmD0=a!i-p2X<,_l>s(Qe?*T1ou/fV;0km +P(H$;o[:UN\W(Z2S?k=./*fi8qB@L484UDgh7N9!B9j6f7*=*T2uN?pNtpj@<*.>AIpRKH9('C&Gc6(K'd(N`.pL#[sBTKs'S +4cMh-I$47!e"9"Q>?f"m_]AR7Q.goRUOhK^n'N+d%5ALqZ&=hT8+4;ZtT/ps`7Cg@Nhq56f/. +&\o3_0pkK,rEO[iN[M6?l,?%41F`BkM1(36D'"8'IMt@R^2#ThmV`F7=GFG7gf\-Qe4b%p!? +"#[??rJ4.I$.rBq;4SH2\m+cB=^gqh*s5S(;`k#+0#@G]A9dgBL+p<,432&EX4fF%8k1leIT1 +`TRif[^6(n*Z'j:5'oC(RV6D02_h.\T<*M3pmZ%Gc!$0SBY=/.^8j8i*S:%o3Ha?lm?jTV=5 +29%lgG_ZBd;turIDe^-^;)Ee./fK/qX\nW%)FX:8L.;R#UY:!.Y&@6pXeAT=Yr>(A+Dc&\l@ +=^R(&a&NZX'_k\0I?,\i_9Nqie9Z$tthKFfl^bIR2FQe&FIF>F_]AqJ_9?G-;>9'5QMMMY0D9 +Uc>d>&cq]A3c*)(jTGPD/08 ++E>"fZb9s4>5%hY.I5HTiUg/GPT$KJ@)DoWC,1!3:MIrbB`fkJKJ`?k=S$g,e:&+AEIcIt5@Q`B?(3S@Qehf):`OS$&q[1Wt92)uECbFD6Sif>DLk4-Dh0oA_J +Aj*s5qJ5"s/s_9[C[LaRm'OGI5CBDAp?^eo>REHJ.qTkdI8VJaU6,n#hDf0)]AHWK,c[5K`Vh +KfLU,N'25fg^o%(&NN_g]A+?!lS7!bsqE*qm"O$4eF>2AgRtl'Nf(sV=Z*4p4]Ag>Xn$bq08nV +9f5rES.o@?tE+^U<[Kgu&ASqtm%J2Y#+t1KK_Sh0dm,0;Me?C$F`su!p$IGDO:dprh=d3V(< +?ZRPCn2)sE/29#SjE6(G#ONqO\01)>WH[8#D`'`i%@@o=:e2#"R^!I?O?/@f">GT3&>gEODD +4!f6Kj?IV,>Q<79rc\h&I]A:YJ<.e30@.c,[fYZ_5QZ7$o*\51'k;ds4iB*J#4 +;$4/]ABf"0Z'7$K(,j;S(o]A'8E1$GrIZm-slmg,?k@>iMs514Uf5@M7K0]ApfDppuON9aki";&Bf"eQDSj)1dcld4D6oCOYClR3h4ZuEWU>+mJt70qO#+cd[t61A +8*A@FPbB"Ha1_T%Mjp\WkDf##"e07<3)jn6$(3A\rtXdt$PKb!miZN$Fa]A+-u,eZ'i1=K;9Ui.`3mF +>8pelGe9'gM32T@f$lK=ddri$]A@H?SUES*:7e`O%H&VA!FHS") +YsaH56aL???FctjE,#^I5^VC(tN$B-=X*'72%:dErFR%':@<7oUI*K,YBqtl^:2AB\5S\KF. +ao-QR/phe41G'%3]A[4q;\2uh@WJo,nLRKB_J>>!LSg^X+\u0Z$A)A-aT^X5^?+>_ES^(-co; +.-F$6p#J1?#qm:,qcFlsPV/-<3B7[&U>?ND!g +_H9BNF^rRgp,_M+a9G:t6?OWRB*l&erb)mf;Y(F$cI7W)kO7$eu,FO?!\>re;VG_L__qS8-G +^.L!cGAp)]A0@2nIN[`-Va=_]A@+VCV48W5WV'mm<4)O8fhR4)0o7Y)[[Q1_eYZfRU$%hh@=N^ +$L&5<5,rtDo#Tj8^pP?.'M/4Q+B^gT'[R13YJDfqX49YnSsXWNLG[X%P7<7pN`N?$i`[I?;*1aELQJtX2h[lVcG9SX4\8s(kr%g)Mc:iDd@P0KZQ%$Gr]AfV0C+2i'8G$. +^3-0;HQ&a2':2g-DK[80^b6dkkE<)_c@BoKZt-RTZ5t`t.ZQd!!]AH:@k&fSY`jFV!8O"JsRB +LAqFJEKGi8>L'M1QADC\I_&-Mm&MXrBn0[L"gfF[)LnYQbHNH9g;6)S=#_33LU9kk7`JnJng +E4dHc(RO!CF8bDfXP?q=^h$`qW]ATV4_r6pIp@3fH&Lr;c>IBuXsc>SoRPTWJj)N7b:Z!Yo9X +poL/jQlC8bGoVtQjk(,]A-W/8D7JGKI_uWq'.k>e]A4aA\$JSDnWP2(/#4DUc:7]Abq2KI$l,ickeaOuh.&Xn+j411Kb@f/'XI)p`^? +TbUVilmlIWo/EN%AH:eQ!>RR9BWgW&,.lX-!IJW3De^%&`+YJ6QkHN9aGPTLZflgiLePAJ&7 +p/Y?Y.M +tt1rMP[bKacckRc/tcsA7?A5SH&iu0Ah +R.P^a,nMW#=9Y]A7aVfLU2V2FGO*hGo&PYqA1%\r+[NiJG5o_;EiUt:0d#1=[M:IQk"AX[[._ +$BYGgkR8NB2#k3jJ#h:;>9LF=AYp!G_grVcW0U.cO6GBCSM4Ltktp;:'104OL9G0P\E";1(i +k0-,_s%p*OLD+1Y(2asOZ8Pr%L&I'C]A$K"3sd!):V6Z:@H`?Y5^DI$mFE\^%4[/H8VNkVnZj +`:p%5%<_i)a&+Ri96kbG(OT_e(@LO_0prKNq^#QkWEo7i$6+A1)Pao4qgeB;8!UK0T74<+Bg +cS!q+A;mSf<(Qd[FHh-r9V,@TJ?1(oFgKIrU0`2k%DF*NaG24BDV,;q@:qn_YAC54jf2I.eG +1No?R]A`*nIK0.rfdiU-H6P\NSPT/P@Zj]A'^kVOH0`FdJQ_WX<1"3=%pf"c;pOcG(d+"RZL3? +A)T=E[rh6p4$hIoOQ7_,`N3#o504IkkO-0II,LR,4K:NmU*N7+s6NTAp6S>99^S&2lZi2!AS +Y)VR""fH!-"3&o??cpZ=N\E15(^k";U47>tXT6I9rI7W(B4V[4'@XVTS>A +q;'ibDt?b-0)"Z9:1=.DY![=$r-ntM<#`?h#1I6S>[p+cPcbTDjAm-P5W.8#DShFgY[mj@2r +f^J73/]AbVMEDp:Hf!\9p]A_D-r=]AmOr.r'r_$S.*IWs36+9h%;&0402rH!]Ap5qRW-4_GqCX'X +HDp]A_K@dZI0Un=hfIU!Rt2iU;D$*a]AKr'$,f0%BL"]A>6#T(`,G@OsYBfB/(C8e8l>$duF$IG +).U&[*#a+u*5C"$gkFI%pq9.+[iV1'%[ +?ubiK=cYPMEJ1?ODDG^hgTo("Vu$ZH%!qQYJ0k]AMm'"!4 +ddUpoITIW\G!p[KJod@l6FDUT"'[N%(3[cuOB)Hr.rW"n-T=;J9Yi)545-TIY[d:(u2dSsq?(Jj$Rpm7dSNHlIeJA=NAZuJGO? +$5'/FEc1`\Jm&8HGU,68(aU?k:%#;:`7BM)_a3^BfDb/kbCm1_Z2*-qi0";.>jAoS?l1K2*o +D*hG2DFS7"E!LqXPq@U@+.N4>\=Eu!&C3_IK)./$"K%P_%=q=p9R;L27EIj\+F'7l(K?6lTu +e:le6r;#\k*N3k_mer8&#&fO]A@%?%;()70>sW+fWl(T&;W`j$7Zq'6fi<8KWN)3:MMsP;^jc +.^9''&E;I9@+oT?AD4>Ae]Ag:JaD4oK=e>MX$+`NKE%8iVboYDPsLX'EI2OhaC[SJ3_af*Bk* +:l3b'NtVA[)*L)c?F$g1TG$I0Pe#PkHpV!K^\Fj+fX&OcinhuM?o1$""3g1UebA:*jCY6l\B +i;"7<[N%^1>+oYc=.,J1YFBE%GJ!s7763Hp"#(dp,(AjU*+8DQ)PF):_9s+O*,SE<`[mJr2t +mirN5&s+It9lp/BlP8!WZQBPckYUCcYqhuCi\i\C(SQ3hF/u.e*JS#cc3^tA;Wl>k`?8=JnM +J[9'F51);Wup#T3-mNct*G\g+>'92%Z2]AUneP/Y[]AbmS"MB.celh-hG>#?`?!Z24i-bA3[%: +@H)saq`D--rOQ^.9XqPOG5^(%tRVo_=%LPg5`&XJ'fGDK`X@8-A'nuI-gii#":UZT+(D(mVp!hmO +\Xq@ei^3L=U3%@t3:V72IcB_d"mJS?GcC8^_nS>U`ji/7RE:]A&Jgj7E +cn%AVmDgpdupY:&W^#/Y22fJXM*OBukG$RO*D0=+j\)72VTDdhp^]A!V6Sp]AP$O$*@,'9@SAR +pVdl0tW0:^:K3qKC8HAWQ>9?,Vc>rXt)22'OY$nbJ&q^BX&:1&qd857Xc<\;Ue%L[;eF:-lI +tMfit7oI6gI1SJG&f@RoAp_Us3S9CcI;gqml#^pbcpDH9$^i4(;"(kE;3D+\aQ85:J@p&Ift +3b"<,#Mc4JV4prnnoMb):q=q)%*]A(s?VuMgA:fGUs784@&L$bFRP??rC7?pSCWA:mSJo9*'_qmGi/&)+&@W^?FQM +>]A@3bPGmjiDB$DHLHR.e^Lk&]A[HWV+PIKjbP7KR\0H(:1Nf3pR2kVXTl=jg(IGH]A3REuBhWR +E((QgKRoNft'6L>#11O1n-s\4M%5Hh&l=VhPrfSn"g8KmR)@BY]A\q88?\r)+(@N8nF;MUon%d13ghK[8(_=,h@UESfq&V7$4G-EZI2cJZL +3BRe*[e_5Gq<0,mpu$nLdD(afI5\Ma,n,LqA#hBg:SQh8Dp\qenDKu%qU@:hm^W/=`T1Xc26bQ7nB[ +C=0==2fu/Nr)jB/F;NNcr#d\qj]Aqne&AF(.8f8$b3,%#:>YAFPUhifjWE.<,U'CHG4H?]A]AK.]A)JMat$\1_kQM5rn"]A/gmO^^JY_JuB]AR/bg"9+j\Pk+lu +T@ZqJWcQ`FZS9k1>ii4h(F%9/"$V/%=;Q`QIMM\84a382ujs(Go+A&GWDTl^^Ql7T"e&&;j6 +iE$sdcEB+;SKb(E>6!N*IIWY&6b472j[^)d?kdjbqJ%5:Vi@%N#>$"^p4*/u@'?:E,j5CR>? +NPF\lODAZoBL+3AB'8c2,n?R>a.KYL_8I[js?N/_K4GQkXi_cFN`("=nhXD_LfFTqV%>nZEC +e*;I]A?CZ\cKr\%h\A_>:H+M[7crHN3s:CY'?GR^HtRii:[C2dC\=h'#OKbpp=Rl"m,mOl"%t +n7[d7$(X[^D%2AE**ii]A"IP\oP;D3PI2E+mM)aJk5^Q"8:2XQ1jm9k$U6=M7/^7b^[>R>!HI +Z+I*.6r"QP\9*cDrM"0.X/o?+TEU&*O[1c'G1#T;X,gl_#"c&!f4"U1O?XTHoSi#8r+f1meh +O!KBR&&/,9L`J.G!%YF6uE#H5k2VA;Zijf4d^k()uSH_.\]A`9ks0duf(I3b'%0XZNt+fB"(P +/o$qW,)@)B#B31/"3*$f=UE*NkVk>e[$]Ad&67_F(8C=++#&TWeXqLEW)g*j8i=l +`u_9h_'5MQCWI4\k!4Do^F$XJ'u=e-<0G=uj=JU9Kk+E663o'.H8h[F2=L740G*8K)LIqRZt +""C^-b3Lekp9j8E[$>P'T5sFnHH +T"$,;-UMlO^2JR]Aun*=[dkD%R`+ThCh1FLElK*:VZ7r5-QCD`]A7RZ*f84Tk) +igg>R+GQ4Y8b4\:YXqOZt6t@@FLFrm.Ij=?rg]A84\?B=f+lj>j\(O8&"ZpWiE79@sdKq-Ug( +0$]A86V9ct!0%;(#dRPAf]An_rUaW2$+Ij4fnl9GG:d%>6?f8Y7@tRnn7ug.2^a*+Ya[hU5N8M +On.P-('l9#b8gDt1H01#>=^_;P#U9VMOJ,&E*L<@Nh +L$-a^^Zim6k#R^I(?ZIqc!:;:>1$ssO1bJOF1GFVk:KhUnMs72C+?4kF7Z`Dk#I]AZ7UNBA0u +4XQdeoNdbEa\*>!qW"C:=@55qdeaf)riNjOg240]A[`DQ'Vd-Qd0:r0?AM,iJ7-nhFZWh]A;u. +n9?^[\hPnG[DR_;`HcDSel327oo4DRa0]Af5eP3j>%(I=r +h"PX`YV7T.WZZ65I*p2\qWLf(i$tWpESglM,^E.Qo"em;]AUmc +u+nj$)"-:3g)+"]ArV3GpE[13tG9M.PCaHHJ4;XmR!=/T3h0L=cV1s1<*M8!l^A1Xg"C"'G581C?*b;=.mOE-f?h(9<-V +hhn\?F)q=TO+^.JJj-\/hGM:S*bICm7:KVNTn$?cK"F6@-"7`2&p\tu`AS* +(G2;X!__(H0R#CkXFMeHaY'.7#$_7$Qo^?d#*Dc2VVpJ3` +t.[.N0T2!O^S:@1:(qX*M:eZFQ4]A"Pdq?Jf-JlL/]AdBS<37p@.tibTYp,Q#E!4XArhD7D[.^1dPTFd_n,eJGC!I+a,JX +"RXrc%R[6elS/KBANC6RuP"90Z=\`o2I9Rp6CuEM@7^DRWHAHQX51;-/1AmWuL=Cn*(\XmJc +hH?QjB\>?+s7^k8`V$lH"\GtKY]A2MXJ!`L&.MPYs1d-o.m)e-HiAZlhTMN +OPP,"1@rAgU3h+Y>QQ%i/?O\=o+,C@]A*[Yj(h9kMnM()qT=ImiU5\V#jVbh!TC";i]A\lr:+l +KXjRlR5.LX/ssYDi^96k`N4#P-JQE[rqX2273*W<=j5L?1[j-KCi55JV`5NG6mtojU4u"E3X +#O3>`A71)/hd&]A:nF`4fX:BQXOFVn6d!5u8s,[g->rKT9!8EqGH'21k2D/*S1,5IQTgG@C)[ +"=6m_5q=CUQ]A8Ls%cK;OgDoWX`S.21%csGWY>:3;USS,Y)'6,>3t'B0b=T3(8i%?hEk7o19U +1G)UhgAJ0JS]AZR#m&6Nua`=guJ$@e`mHG"^E(Y1&)EE+QqN--Ni+1H+@e`qlP4RO0tVF5-ie +qhl6'\Mje`Z\"iEAn[='s$j5;lT@I`+6ipDm>OV/#`eQVg6+b<"ma/!?gllcI+L-m)InmlY: +Z1ZJkiaZ?`egDWk,?T]AhUcMm%0sO4/OMUVdkK`=BJdD.+cA'g2RFL\hf\4WI]Aua8d&LtIRL6 +Z#V[gH6pd6BBq$Z4:U7.eXP]A?NW=XRng>"LWM_'7$P@&?21p;Bemi_aj7ImX,HcQgWTF-/`? +_)qEO9P6%1M;86]AZSgh;NXQ?/]As'8h4UH+dOJlg7Rr!BQ5(]AdBgO?DJTDL(iJI(fcY2Za,(c +$hbkMYV7Efl/6Y_=d'@SXjG@(I.UFql-M-#b6c%aL[>RIU.<<[0ru-2K\@,B-GTikN+o(JT& +69,jqX?dSSEX&eZb?t3q$8h7jCFV)XjS@5n5>tp:Kgr8k<4`B#ZGn#LjJQ+BC&VI4G^V'=5k4Wb,[V)^Cff(LmIa$n9.\oZV,@`h*_kLS +6aPSQ-K4@W*nUS2URouiV3`PgOZ0 +D(NiQ>r7&fm,F`m>^c8i%mEP)gqRpnX3ZZZAD)R3g=!8c=2.Ge0!t>3%2;B=EVZF@]A/:qa?X +cIG;bH5:FqcZWHSQ@u-WV'Zq7Sm\&9FN6foVh_Kn9D4>ta>(D(Mk%Q.r%Mh$<[%AW(@Y5j2m +U^hEW-NFb,V)J5rRSf&CO_DJX,UdSiTbYXo0d4ab[W!^*qn'+Xq(5#rS=@WOA-De0" +otQ:rdr)8_ulkrI4hAmUCjthDW&@n;`cq +@+)X4TZ5Z.@]Algu;s-@kfSYtqaP@$F0t&)'5]A2< +3gPg*bW*0k)hE;UR^nK*2eR'a,SK*pe%kHjkpUiZNjsbb!k6lZL'X=.3WbmcrS#J"56B/oE3 +lhBrad-hEgrO<1O8$7ec-8d]AV'*ANN;hX>p*]A"GDDVNN)$Wlm",8IW?QA#*MnJiVHHV-kAqA +B]A:)DV4D&E8S-?V\mmf?p"UbMc!E +]AblqU^?E]A:uZ;7F%IEo!/"LZMbO6:ZZGoS/-]A$K>ZZ.L-C3;/&dFCK.IA-7&Zf0PdtTL7MHt +$_hRVn&:ji^r+(n&V4.kKV!6k#Z>q:6'66>C%ZW7GY]AG>f*\8AI,>)@iW+kDhaAB.[#lC?\h +g"@RRX=mi4h\tZ:d"1%n_1$L>IQR^qkH&thsge#]A=1KkT@.qm:NX!Ka+h3d*\\)t&9IU![05 +n-S'(1WNXiLc<to)B0N05N+Q#7b`t9F'"tri9P)P2_cU+j$*K5n%\=s=O7PHLXIS +Tas\2`PgrrKb6&*[(no+W^WJ`PjZB?AW&"PWgmf+Fgt3&:)/D^p&;hk5dFuS)'J<&,:PQ)#2 +C6!bK^:i7UNb7X9uPg#6673@qAeIEe#oHb/Y$c`-G=TVeBOH0='%W\NN_5??W`/IrOR0#oO&^l78p]A?$6]AH]A9qbO^der*&);h'@=6?G`O:Vj +S*kQc4r"GIfWhQQ0Q1i7eXWZ1MNWR$qf^#3?J5F0n`(_:WNDWH:cl.hqN;63FkNisWUCU%:@ +2!dN2+cu[m',-tG!^6eYYb6mT1WX.*#?D>= +25K5)'gB(QqWJ2p!'\>XiN/_;c>J.He(\K58b:Yr6&H=I,jm$>#$([l05kLknI_Kl6+]AtO`5Ts>rtX=CJRmR)Z?R@8]A4"Z#eeN?I7XIq!-[In@$("$>Y\G-n2)4 +iUeMu:>6Jt&WEdFDOUhRKf1t(D\oqd&EP\J!Zo"`EZrjP_I89!ItBp6GF,%QIK(ktK;3i1Yr +1F"5cG$kO!G&b01>eH`'+`GAZ-Q[^r'oSt6dD%g7." +1k*M\bJeA\J#kdt`,5/=r-_:fTpuHf[[4'!B8A62CemW\M=iJ/"kD6j!!<7G07KGZr$3@=L6 +S%E?:Rl=&@8:ds-kE.8sHIT;(jM]A*LTnoD5,gsOj4o&'KGl[-?g#OS'4(,o5/jjSFgka]A!)= +u\`2HU_X1R)*VkoWaAB +9!DaU[^K*`UG_58=tA@NMf7@#=,$AOmUc!Z3pR6e!1?,YFP"Pp!>)WAL=BI0A,(A_OPXbb%c +C97&k&ORo+Thqsfq\r.0LRo>'W_-PGVu&1$C>.#kWNZdE\mPAb@\BghE-op_gaB=R5_u*3 +d*q;<4`X/PO/EG5`eH=O![X_rECE<.p$sM238N5Y8lB4=I+hOV\9AS(]A2/18Jr@J7uT%N^eA +"Y&'en[Htk`&(R[#L)@"*^qBgYpq]AJWTic3<8.2-MBg.=(l1WVQl8Fd]AeGW/(b35WX)fGL;$6DhI*\U.#7V#B+CC*2n4DKdKiB]A;&kJLAl7u3t[YSg2%$P&(*j;h6$DJ3Jo +%6c]AIp46"J_ZOo:=p!O\Y +l(4mq;B$IF3pn)JbYbX'=:[>Ek\$q8s)W3a2_u#l1rJhDdS]AB7GJ]A +dVdd5S^n3tCm6k%rXi#,UiN4"dU`q:,/Q`p8iYQBAA+>.+#,ALpVr*5P$-K2Zcd"+Re=Ke>J +YH6?Ir!@r>pY\M]A1oIc>06)QocO.eJ4F.bFP)D#Q5-nPQo8U!&G\ad"W[(a2pYi#ZcL'C3JB +bTe>>1n-42H[MSG%rP(<[^eKKH,>(.-<8?4/&Hqt2,<^`VW9fd\d_dOi/6'p5Ej[frMNlh<9 +Y?!.0-X7eb#ZeaKe"G>S7kLQ\S4a8Pb"jsCC>RE'O$KdQlZ>]A++.\ICPh(=:HXm[AqJek+rb +q.F<3p6Idu5KaOa'qdH;Q1E_P*<-"iYA5C2S5k)C;g4`,1o0k=7ShQaJ(ruS@Y1uY_^fX@W% +hp.l`8)PG-lFfr`eN?=ZDUXZ6<obYBQe@rBqiebV20!Ad +Z\b?(pF']A$X/WG!?F`p`#7Kl4:.&rd3,#GCn'QcP#D@md1sq!+&$T]A+XYWkq"b7sGk6QXR7d +oI;7K\m,O3+(5Xc5Q1ffj2]A6HMjqcJ'Sf;'YjXrePXaZ\Oa/">?o=&7a\>?OB23o +)@PGJb@&\fLVRIj*[4VEd#%nMC&c0;%!<_8?"@C9-K]AQQ4hh,=P6c*l%_f5@%5q\"HJiT=a+ +"MoPYj9bT"?7PcqZW)HEL%.nbN1e28tUQZoCY679"qEUJ5J]A,%J,4t4lp[9KH?<(0Toqe"dX +k'2;T$?TXg&(c^@%*%kgX?GERFR[c_cg();O6Qf>M'Da=2AKt\konIF5")e'/\#uQ. +C4;OhO(N?,lSd]A@#>"eX4(MO3_^*B-g79YmZj-1?8AF)8OHK`62"Tngi.*(-W:VLYST65]AQ/ +,6`jaM1\=^OCWNn5@m()d*/mW_Ir5OZ@?@:R?/'hMNe50I;be:0RC//'JW'Nl#';3_FKDUGT +!!2nN>IT"WT'tJ1Xh2=?mCVhslcqT+q=Pibn[2T(\o_Y'`C3G^TA<=J?^-&XV(;#Ej\'fIji +]A.i/uUBP>YnAT0Y>!&]A]A-NGYIJ,^\`YSOZ@'cWMcQpH>@2U1WiLP#+_)$p%$3mkb#B?$Wq6H +`pd2Hab@OMLY$/B!rc"O2.htkXqFkXFacWL/-)Ga\A^s5g[+c1BV +_'&R/#t?_B3&'a\*q$=8maX*i5dY;3Lj[fnZWi_kdK7D`)jW\l-UtC@j@\@^>9T_(,'T0GhM +m/<)lo3p"!>h"Y"2k(pjmikJQuYNpPF:+in\+I)>YB0qhOn`o'W\N@lqt:T;<2:*oeH"]AauY +jP`^U0bBW[4BRlaEYi;Y#8RKcGtF)^EmlJcJ4P-`_SOQ>-Rq;<(QIq\:]A%(HP%_KLA4UN$R8 +-]A]A/e=Jh'In3jdNb;=$2T=A?cI#L]A1HDMVc5ZDr'p^C[Ta$ZJ5/p+&j"ub[!pBWKG6O3cZZY +]AP^m/4>K6.X*`B]Ae+Fpln%2c['@WC,)**Z`orlg,k@V.2Hp[P\USHj=tT/i=HRGpur88%6Zl +`&`>8"smbps,_:trGu/^A^sunA'#:q@@p +u@a(l_PNH[n+VU=@G!r&)>*q`Wl[Z@l+Le2sYnRK2?%C@/M)(,iFD'uf0Eqd$Pm/6@D^\eBA +e]AD4_P:^!$%XU#Ln7P-maBkPEJnPPh*\K%q-pnV/nZmt4SL]Aq'8XZAJCBWbmAZeKXUVVq`*7 +Fr>J@gMJBFo>;I4A(VKEtK"=HT.m6>e*5,V5[&eJG^NZM4h_$8duVphFD/09UkX^@2n-+p\p +5_*Jd4HV]AAH6N!GMpmMK"7_+ZO&Er18#\l)IHK"k\E5`=UrZ%I")MM77Vi-TCVhH2eM@,c$Yl^(["9DDc!8Q` +VXC%7WEfeNJHh&*afdWF8V!H@3g/'m"$KT)4VdAR::Tcsr'XXpDki=rY`a6'WXSXfk-aJ)=QBI+O\D*M0iBaC`kuDA%kA!e7' +5\86:"Us&:u5cUE\G&JKGf$ckafO(n)69XKmI5r?k##Jp.R>&(/<@#%VABOP=,fq='kh<%TI +<'8(^'pQ(h.Wpac1&,-`Vl\>6m4md(kpS9!N\*,Hmg!/Qqgq?I876BKaWm'M@WkKP%l9%'U4 +8VpTcXK*M&5"sh76_qV<6+kaJok,E#0kL?h:sojhdK&E]ANrPflhc$\B#ATR)4t&)@=iBiU\E +h5!dEfmS#UJkmYFDR4a>(7ag9$"qb;i[-T4"fH7Xm]Aj@bH!p3/u(-9XR+9 +=ru&@*oZV'2N=cYM;[8)C*OE8Lo1u"1hk?r.Lc*M@^I+Pm@e*H+^mp +Di]A\NY<2mlW_sf>nS62r[nn8LAR0;QC?]A_7?C7'Ij`%k0k$2H8(S"L=H%6oR[:LXAV+&AV1Z)QK[^Z'+bHW;0h48beIJ_9tN`I;;:;g927FrR-Wn=bV5 +s2fKL$2(Q$j'9@jp/2^#X#tW-KHnCX:Uf`N'XF`$p@Jni!6W$JBIptaRbN#!II8d!pXe_C1; +bQPMdJ/%uf]A`8Wr]AK-_i,jaLS9-dF9G.(97f[IN +ijE;1g31s]Apq(]AS8T2Rc?a#!p[JKX[_0Ak0=+5a;.`; +M"4')GT0-Nh;BLRWU1?8Q485NRdn^X6M+J&G$&.F3T+kJca^cS"i<1;HKco>Rg_1,V,'@?l(Sn&GnQZY3i`r5)f;IZY"!<-8LYND'+J60 +oN^'?:hS.l3sCl^<"snH-m#+@LDUOQ&27jZXtkN!3>Zek$rp=PU0J!;MMO1HLaUd_%qp[\;! +;$s?Ap)C-Yo3o&_38?8?]Au,$hUi_\TD(dK5siWlc:\&Di(8<:Z>E8fgF%*[klYtqF/l9c4Y` +6e9Us5$s\XCTG&(%1!EA0o;JtcQp%rGU6?JdC#Mn._m8P%U+oBb,#M0JkpLg&ZfRr8>`cXlLbD?cO$Q?Z!ecj3I\b%/nPN2oNH4h_7(L'J7``)jaq$_,?(TL7.3KL>!Z/2 +)ps`CISqi=8[X6YF:A59+u4rM5e-:;A$5/5<$L(8/a%?6&NTpTLOQdeCqT4e-%B;pl$Zgr55 +iGaRY\i2XUZKiU0=.B#,>Sacbd8j(!2#hKt*jk'q8Ypef3.MJ39Pmo4&f0Il@O+cm'MhI]Aj8 +K@RW*qBQU!'5fEJ3#'!r:HX!8[8)V"CkIZR"?JL/5!-I$G]ASeOX%V))7QjtJII>%C +CH]AT6?&/0!`WfB6Bm&^tUBcXdWs1WLT;o'VUYA!=g3#=H8Bc!J7K#W^h%$cN6@:!EHF4/rLe^*,gP(<*%>BG6WUQ=.]A8=(ZGI3C=[fgQF.15*oj*dg9+5aVs^th# +tB(%^al++Q("*]A>,]A(_riY%D!sM_2sJL4%&Wi7rl1?l`aN-oiV`4iGXpI%8#%Pf&+C8gqncK +WFISR-#42ca-.bXcLcO[q#&@T6,8"KE!V9qr[T:A^1mu85X/#F>+jQ"0MZ7"$A8[2r,u72.q +^mYl14Y!H@4L/)&%_?6T\;bIMRriX@&V=(WrHU]AmP1Y1[5,ZAClB$#+oY(oPf_l$:,gU@str +-U:DOS#6MZ?JPQ!SXTOE,]AJ;]Ad*a'@9Rgid&i4[W7M2?pS\ds%5< +c9g7A&@)-r*RXPJT)3IN`[>3UG,6F6ep,c3\fRK+e5:5gmDUGLEIf?sHY;U-?\i/P[h$F^j5 +7+_FC[;A3RSKr50(I0*b"g2mIQf5@hX9m.bdEkC'pm%/AVg(c^N5G:3QOoUs?>#$KCE$OZ=4 +7Qbj;3$U]A0HCDe#kMIcGX=q<"i`]A>^#NGKYf$1s.-4+m.a2WQ2_`"Vc!I4*0i +o5%j,]An_mfem.dmT(KZ9.DC>]A3`[du";!QJjrf'H,Y!u`BG935Qto/M&Np'V+b\$:_XL>P51 +9gl:QDG(AdU8.6p_u8$!4-Pnf#rYb!oWH:doAk[ca;s3*3Mrl$I_E'3!]A\naeE(IX@W0ADkh +#%A!B>%NRd0D/XDiN.`2ebtrW4AIY*XVtY"Kl:203"&>WCB(1/K`*1tLX5E(aI"sr7ruis]AI +l9F=(CU,Q/h:3t$CpI>8#to9G'L7YN+S_uT`%:&BhS\I@qQ:`LH< +9s?,YOuD9b9io+Idb.TK;"b=1KKT@6!0#r5kDooEo'?,&#>3\V+VeO"`R@NU[#ODDfHj<;3s_8.6Ocul04#g3n&*Z>BslG?q/67!hI_@8Kb$r"DIQ6CAaLdaXeR$0]A +8SK'tUTKea2Uh?E#8K6'FY]At_[^+qE_\hh$/YN=OfEbi2!82"@s%akjFL4Z*4&,-IS9W76?? +BXrRV+o8LG:&EJ#QTU)kG#DInSN`/4%&c'XN +d,"e<#G'rc8(:_Xrj0&dNIPXHsVT+\mHd>M^#!??VP-E$&Qdq:!-ZI"L3+YO@L5UHLnS8r0b +fOlfF-rd()_:-eSM)QVL7C<\'9*[sE"a*%SiUT!&)`PmF/Q.gjAhGDb8C;s;^d7>98aA,e^a +J1W%9u73(*iX=pAW7J,;(:V4(hFK!mBgTi%k%YTJFVu2Pf7S8nNXei)gk7-WkZ6dYjlDJ;1A +&$F;FjEnKtL'r/-n6;/p;)rdloh$fDqJ8cP[AO.&-!/?'K;S&r(V_KIn=sdEVF +ktlJTUH;U=T*9pHQ,k3pLqb?Y\kY`)065Z4%9H&rGJNA@fM3&a4a=s+55Q*Ht:[o,]AHO*634 +9L&CKgKe(m8?*5d.'&)cmI3eIHo_ePi_6"c7?SLu=-KPlR:^c`G,GFgc>g^cl0Hj6]AuI$h]AT +4kQGMlnf3['=^i.3\[dNlPkobOhlIh`f2m?O_ud\7DVZS*/ag(&b&*D?Y@a&q#k;J=SJa!,5 +dt^G)U!sDZ5s=H$Yn+C]AJ=jMn(Qn><7$B%9b-DRWiqZ+Vk/o%C`H,F3.<-DK?!,$Ek)A;up4 +Dbl\>:V/h\+M1YCnFY1O6G)$s15?PIM%TP&Ae9nLIYoD)!M=R<`M7J8E"\_a&acDO;jKKZ6! +>(knLd?\ZW(4I9;G-]A3j".j[&tL-dE_2n-0#"'1N?W5;@\JJCl4_K3 +f-639aodGX[1!L_6b4'5[h;i>aAjYk3]A1%Z8fZCa#+IYcsHu0@(lll8<[gJE@,/Z/Dn45q3H +T+n:0$.9$M%;4oT^IfbSu0ndhJk3bDbnR_W_=M0GR5"(fjKM"L"m0\%WBX73e#U?igO'tV]AO +$HsKlt]A0cT-]AG:aGXAE#S#.u_9I:rr"P#,\SlJq(->lL#d]AIhTYCJ6U&P6C53U\I+c+uB@/q +aamH?]Adrf&f9@"knFLWtcN;k.pLePtt$8uH,^Yrm5,k[MF1@d\>RO.Buc[C8q+Ko*>R\9DcE +'\,tFhu'XkZR$@Y9Nk0(7h<$L3RE.a0/<3#6=a\gn,8Wj^Q@4:12H7mX[lV/W@,jJ[Nd"HE\ +^S8cNNZUJm,dSQ3:Jf6?XRA5.;gNFSX^he7?pD(iMLIhf%$;T/thTE*pCq9R,q-mZt+Ab@ju +3Sr`M\a8?$Vn,2QmAO2TKHR.Nn3UL8K`K`Hq1kh&JRdgf8U3M9>K#iIe+r?!81"))P'*RDoQ +F!iUZe=(iVeLVLPO'nbD8Is\g*g6Eph6bi`Do=WR&>jmos5j+bHlf8bCV33QL$5\ROU.Va9g +jMnV_cb:.hfl1f#tp#3f')HJ(l?HOo`XOercH;98g6ni"TAGn=B!,m$./E\E$#H(@@F_auR\ +-lA!X2^c%OEB36LTWl"po[$*fKZm3'g.:#PVmi+WUHnX;rYuFc6dc$$7L6=XTIk_5,m=sDj< +Jt9/_$CaXU)f[$sJOB3QZna&S`o)%j<_]A`/&:m[M.W6+K@:%[02UMK?8p`SEX@$+0g#'"na4 +KcK2M2""p3Q!.iqEm083ZA2:]APLP=/r)t%8+7!S>3Mnt2kfYhAH>fE+C!69`-cnCB#"I)dM* +6ULb:t[&ELVsHV.eLY7G6Y'f5o&>'4Wdp*A[=Lj168hrO+Bn<4;XEfS#n"sDA%aMGCefcDa/ +KOE2Jh18Q,&eucbF(_R84l,X+X-c(fu-*>b&e5=po:M#\jJM%pJ +)U(8F@>EtcW>N"BE']A`sFW="o5o%3@%Z]A:s]Atq7]A&pk6eA>;q\mLt]Aob7moG:S2'7s5^$,`8 +"@jO*;T!Aa!kL5&ki*kb54XRn?/f0(X-3%mnnLoS8#Z&FqH1J0H3AQqC!jHrc]A(6\:iY\LR\XANqOB'W'u8Akbs +V]AZNocAp;4"R]AB5">0Z^\4'j\'.++IaS7$B\mld)Mf[Mg%3[i/&KBkP%j'$&;Vf;l0>JZ*/4 +6e&W#m8sr^t+VM)uB3V?]At+imb\=&@)t/5p)_f6j42]A_F29J?Fa*n;'DmGd"#t&VA\4k^C]A6f_1H2'/h>^_P`f&]Ar/mG`Ig*@"OpokTqM@ +0KZj'SF?]AtfCZn;pX_*Jt?.,N7Su>V]AcZrV$o^b_2[^Dj +2")@.RW;tAfoh6SasJf7Td2T2*fuoN_;\"/mRn'VbNS]A16OKHO>?,rT8,>G]AKQbK]ACKr'TAe +ul(=IF4PDf3sEFs?+@SMc*]Aoa0R%jlQi5qb=L\?`$ZoV23WL2SD)s]AV3^gg>>L>=c +d"OT"+KX;m+]AfrV5Bc1&JSc#S5h.eYUD5V5EhT/_Yil#LP"bL'Y_.cfT*8]AFmm-qgT':.%>' +]A!U%M4r3n]Ar)?Ca1mP-bmaX>1qja$C97$PDSGX+3 +$H\f*1]A"enG')TIuFKu<4B5Qk94/X3/LMs4oCcAm!jI\o,03IdSM4OCO3qP7A_**mU6#P.>r +P9VlD<"*!)ZKic>;ISfBV@cB)!bc2uk8hQ38.)Ub#dtg5,[`trSu[C%44$#@W7&duIY[\=Gl +Uf'&5=C9b3;QF]Ah1)3*!4M6'Zq2+s!Z(Y'*fgR+a_3M +_=J>T3[8rATND<2d7irS25#bmJAqMLiR176lL_J\m]A<[$b+)a6f/_AnR19mRPZ,e8O7OJ]A3Qhi#9UYLg +'K,)kT=+VJO'FVAFL_[T'$)g-BNkgF=KT`C2`'P>_6akdt"4^B0DBT0_mYh3W5`rZq-6CE_L +ihr!X]A.Y-5dD>[BT*3tjj:=ULe_&223sX'EiCh.2^6j!cQ4R^O@??/`# +Y?\MW51pN:^e!Y9FH"2/@F,,6VH9q$k*k..)9>RDf!4S\uY-\L+]AI'';sXnOcL*Sbd0!P1iV@!Si]A\;e;@f^,[8+On%Lih]Amd2X'CM65K$5X.>,: +AZ!McTghHdfW7cDG,qTk)?lX5'tBNpk?(f)!SCZ#*2DRd^.5_P&uO3ZS4sk2)GS-j4BFO%j_ +*E.++P3hoiRO473+<,iM18>q]AP_8=/m$2#!3uP?=hc0.Bgbmc[%keeP`hl3,rT]AN,@0]AEkIq +uraB`sEQ^*S2F'UZ%orjok1\P3m-M)AZ!,E$e!%)cXKSg"30P_1"@6I,AE`jPT1)Zs)&mX<1 +I18iPN*F:WR)A&ke2Rf"Gd:&0tp[$P!n`V\Z5\"Z"YP_#98@^`NFR[NKFb%0tAj*hXgf`;@^ +cO'+Qf6:ETarVKW_fZ3CZf`kEY.?T5+%6#=t#:Mk3bVN:M2TPZUn0(^>)OQgGEJFZ\33ee+W +ZOEWXAB4Id%XZu/3".&+J;cFK]A6[C#YGM[X&-kJCL7CQ5V2u)qpDf\aESRn5d$>\t1?r&6?PjlhcAhMbI`4(nh +[%kN",EM_rT8dV.8uq/cgQ2?NC^i<;]AW[pU2hND3^p`aR^.#"_?'IAJ.YmaclqW^N/;7e)"@ +_Xp&MTiXQPLa9%%*>pGj="p`\WR]A+0)N,\8D0k1Xp# +p/!)l$R8CIkJR@D>Ug/(JCFA5&0PKCDM(6+!EVC#- +*,$5%L*i#LJ!s9oOMNN-Z6KhY&hnf_G)ugr7irrD7d7[Ab.GrT9=.2!(1.J(N]A!ai3[qf"%eGXCg*Ho*`NPW$l0$ +?]A#R_Z5rh6jU/[$<7qL!53Mc>$YJR(,@+WCK60&@.O +U_-/T3>%*5;ESXIZH?!FJTY"$18D/F`ut:g?We'cZiNX$IPNm]A^3*Z\$FE +Oj*S\E1U`G&jWhBDg2]A^-@@+N1alOeX9->Wp1J"HfI-J#L#0?/@Ee9Tcf+l(4Y5BQ'J^(G'A +!WC#8_s6R6_tZ^"@F/kRTN$tFN[?l^?[e5D\4^0-e.d3*ugB>J0Yu2FL15XrI"At +EkXp3DlW4\3>SQ^tiQ*tQ1amO0@Q"C%UEB86bfGdZk_'oE0*;r-E7qG:EOZu)59KDn'ZVTKV +o:Kp7kni#d3#rLcEl1\UqnX!`S9rOE\,Ap"Z%qe]AqttNLpuAEXP_6AKVXMl_0:hdHc[P$*TD +RDV,f0m8^$ad]APnX/_\`[4:_>./;Ib@@I]Abh4_^Adf/H/).T^DsfXLKAumr%C;3bdL!;-j0% +?b:gQeCZc"O?C7Aaq+n0jX,hYlMG(^"0s<4S9n29;00T.+,7coHAS?J$._G&;C/cdW7@&r%r +S)N#:C[6uXuj@Ig%T#7qXJ\m]A'\'C&hcqU23m#TKJ##fVIug@Ic4A+B?#/`GiS(i/f/WDl'F +WhEnBGUd/1o_pKi.0GM91A\%_jl:OV6kA8AK#n%Sh^J,A+L.dl#q;rY34ML4d*90UGdd(i*- +]AKd5OeHrZihfR&$p\j5\X2SU-XT\ejH'uV=J,G'tiOK*cRt#]An+s-^\kW5YP +>hbD`R"^"S&F(2!L63!W6<0AK"Whe1/u3VF +Y/^*@7=U"%RCtu^Z_i@i!oij&FRoXUCLO;/Bt1_cN?Q4"9&9B?VlkoS@[k;OLLG!KmlLG0`W +;5XPA@t>,BTsLIZ/Z;j9VOm+K#+GKdBQ2;<2n3]A:Xh*O8G##&P\i%W[$MoSFfV]An]A('%hrN) +<]AQ]AXHNgt#,Q=dG=;fY;XNS'P55#(Q[AhGDE3E?KWaAcQ'p!UqNn$HC>g"XY?e<_RfWspJ=e +%Zu_RVFgO*MCVZ[[D#)>2L,(=uC/RJ$_ZbFkUsgL*J3I%o=*9)NdW +F:of-3Lfr@tiQDF2#S`?Y"[so*!8nj=oJ(Qi2t"JK_si6o,7Kj)J7Ul&8oijZWqXFT6p`mh* +'squTu;QEYC,ZY;7\3-5DKGlaQ#X9+X7U+a$LF9nu8#6AQ-[CUm,*0+=3d#qs6@@j/)WH+NFZS1b%8?cY@!HrHLl!gHLNjtjCN5@A[ +&pN!kS=-q=Xc:kA?]A#-Uq+VaCafikFOh_WaC341HtB;o?J?tkSkT_=u!3M%EemN_9Zbt^]A$9 +JKj2]A#l.b+*d'U+Vpg]A@iqRu@kp%HJlU**l,PVF'o^A?Q%n$qsi"_c&hHEEQj#0o3!knr]AHpKmtdK6cWlfajqP'gqg5: +kRUSdHo#5Q`L@TkEE>O)]Acb@#%_GQ@lJ$'a,*s0/0=a\D]AEc-Ro/RSTH]A1haIUK@*f]A/N#DFe3A-L'YR)V/MQ8JW_d4F2mM*c-GVEMuK`5u,M]A7O]AOF*b#S +,>Yd;`kk7[]A7X;)5BO+,5ZrI%m@S8F'$Mk;N5oaZP+eR>!!=5,pLMG,=BK^HC!aJon$h%`jn +.Z/uD_5`r$=17)>B+\LYs2id7#RH-a<4!.V+SPQ<$!4V@?YE)4LO''7lmK&+'Np/idY?/pfY;=d^8!\MmcCbqFQirC\e+.5CeTX"X +@dA`(2\ZAX5(le>oXNuYEm=3gj:Q^h)L]Aj0hehK.6/hp83!fDY3-YCH3q'&XO,g) +RObSorq^F$ZAQS?=k%NW8+,8Tm11hai4O,\FO_+H7-<_mc9G)+IA:%LSsqq4S1j6^rl3MZ+' +MoRWjeI0LS_#ZT$;&S]Ak2BUP`.X0VE_ZgWf^4-TAKF_G:r^bX091cf6?$6aVbJ@I<*ZCDL6K +SYATM[-h(X7XuE*VcUAXtATDa_>qO0?]A(!A=gPtd-If@gnn%S[Z>Aq.NN]AV0kA^g5J_VUiq0 +"L28YJ'S_l1$K25@bRMc<6cKKl_Ic^(+V$G7=t%(6T +P[,)H[hE#K1Fd:g"nbDi0SX$VB0TK=m1KShK"jmM'7j:sd=P]Am^K,\>Z_%1m0\AW3TJS[_GA +3@c$''pikiHB-cQSrSku]AZuU1p7s:.`'s?%(dJn[*JLU3aaYVKZf,LQaKnZA=`E)dIO6I(Pcn9VE\/`JE;Q/]A\"Xj\4f>:]A8J?Ae +qsAI)5%bg_Af[B+,RK[q!'kOo=T?c5+N2+nak*,i\O@oZ?u>H=+:14G.T#p-ld2TiH,%:A$a +:k71ZgY\L5!i/TS6(&+74-S)9#)r*(7lpt +W4$P"9oBNPE!hcJ,UFnp"E=9Y=e5OND@SkaNANp["(Sr8uUt?Rem`]A)/V]ADS,/200SpF0<`- +6bN<#>KO4\2.gCI#S4a5a+/(qe`oT-3STe(=FrTja'cQa&"ObY"epq: +^1hn&"jLCYCZUrdnM2$2O[@U@T0)^ADFq7@S$XP=hE\%tAZ7uo3YhMRAC1>&3"ifKR]AqMY?/ +Qr_]Au&sH0bX!_*HVUV^Km/iRSFE_JR]A"B,3Mu^0I(4OL%W_I5PUX8fr?+HMD4i0muH:J&VU" +oe(h14l\G@D7=_6:I\25=_ukuYd2_lS^6A3iO^=1daT4&EH2KHjnJYo,u(:s1\2fjdfBj6l: +Bc;-)(orXbNoe/ut_>su2j!T.bL/.qHbO&c]A[lTi_fJ>g;UR8,!;B`eB_K&B_>s'Z8\mk0*^ +IN705?hK!P4cY&?Y`V^+eMc]A?6iq)B>U'i^Qsos@tBc;LBP0bf2p[[CqGdt)=/;'Z=e$]A^D_ +4$;o/834+;PND;a3mg$I#9?OutFi7r&#Na%A89@Gc&_gmqQq,(NoI9rhfQ*D:aOAJB2)H`GP +j;]A=!-RQfD+@-@f!/V!B8ap1)5_F[?e!NNd+>0@Q7-jmaK+oW#_:/&\gnIs\N(-I%Z-14H`e +)Q*U3*=MijSY.ge%f[4lC/ZX?AkJ)H:X`ga>Yj*6uDu[rPf1@ +CW4aJB;LeCR1JCpr([bQ.@s06'SKC@I"ahGK\MF7LufBp'&EpHFYh/W=/0>-jbbc%+U\fCjR +jL4F.^%96Nr9UT2[s=O)9KG1Y8l5(5q&k9ne5!uEkZM_63F]A7\DSGqDhnJl%.N)6'0j=7A,Q +"*[o'rFQj,.NM=,$tVXQsYC1UEc?E+*Wj[eBfphe"`)lIAunm.7dl8M)R=*'8JNYP4u(qN4r +dQofGrIsGbEjg<4P(BBHq/^G_4LI2(Ci,UL`O3/-CO-f_d^QM6l_e?VfQ/Ba[UQLZ9/W<)^h +TRD4PjpEa/2joQ!M>q%8ha!)FEh`RTOEJU'GQOS7^_)PZ: +LoTV\SAI5l&K"g[%Fk-.eKINqJWbIK%/^a5g?AFYW!%k9E1VbkOlhiJG99m@rNRCG,&$-3NX +)af%@[a]AFpgKiLV-SS=M$\*@@KcXme*o4g8CQAKNcT50^UEPJ>VN$b=F67,f*qMT@No%9pf+ +riAA3>Q3S#C7"hRC)e#rZ`l`@W6)'FgC2`gMTSBA91Ubj9l3:n!5CP)st"@\>Y_T1FP%I;Du +&3+0=e)k?#^ChnTCp/5`jPYIZ:!ckE`)>.RNl7C,.JUL^ti.NLJCl9TuRl4VhNlA=)9lmrRj +LGh"(:i8hh'#.i)dS'B9bD-M%R,hkT_'K#[3Sr5r9AW,*do$2NTA'34+bb+qh/A4Ii +A/P?4Ep:1?<"qX?O"-IQ)e[E#YYs_iOVn6*=`2Ro&[t,Ub4@4j=P>S+K5 +K6JNQcPkct=K2u\_T%Y5Y5gE^qri=DADILB9aGjs2\<=C[B1\DSumK:C"5mt[d^2=c?0c-iV +hV/u[Zf;L69IC#^>?1=qUsTNF%UCj8bVCL,:,,]ARZbQoW:3B/iX!JZ\@rQI@Nd-O=C"Ci:Mo +`S@mL@>Gl$gj#jPCaJZ2?#-`b94DmB7W[PTZWu4buo@qJmQmO;5d`RYG!Q?SZ7%!q=Q!mWPQ`2G(jkA(cGA^G-<9o6$%mD]AHb0+@WXUoLg__1E+P\5G#\ +2N6-%BR_c26U127pX>&./;&q1K+G?]A$#e/.^;,g;U\.FhruQ-O3Q+4qG!&_pU8H78 +"IHgEr*agO5LE382rmWq&B_*&f_Vo$_[+Wdql/e&?$(?_d*;ZZKqHYpU*4O_(Boo+/B^+a+^ +\psIL&#LV^QRh`6*c:U]ACRHr86Lk!t0oZN?HIO,$8_O2jHluJF@XqA[Z85QuCs=Zr<5XhhOA +ugI>Q>nBRm@Cd7!f$L8=:r?(]A4$NXC-`3BL,b@^uu7.":(&PLWBU%9WI%0CkHhCOf=.Q)JB: +Z,Z"p-^Vj'F(j7p4m2T@#1;*ds:/NILm?id@BgD4":C(7C&Y9PaTK0np_ShXjC<'/OJ-'=?L +LNfT,umlBcE!u*C(Y=MPe3_r<(\Tg-)M'I1;"H>nT;e0n]A!=%q,0!]A[@>E_V(COS?H=McH$: +s0.MUCKHpM'f]A4eBqV,8!"jWnlH7^HrU\7A6q8u_]A\65?7TI=9P<,Gm3kt1+=Ff +-^*.&H@id-!P,"62!4B)jf2dh[*2'd@Wf7mdiOMsr8E_rjHGWL+"E[O$1@?e^$.jQrp0-eMm +ZGM@X9a:mf_.kb&c2^_l-(3%*N"'%Y&k/nDM,*Y7/E;8CCn^f"2OAcVCsb7AjrM=_T-QQXDe +ai&L*>0Y3>bB;loK)feKB*)W"&E'TgBGn92h-u,QW(78tT.q)"7d&1e#ST=eq3!_TIBIk>!J +*#U9a,`U`%Cc4"C%)F*Z5H$m%f$u11(mgEpD=-$MB_L]Ak>ut*5u4bZYRrsA29-/O)q8a:e>) +[`Nl(l/>cT>9cbr/<8>WKegjSd8m<5I79(m)Uk!"6AFg0K&3&,GiY@D"R?-Cu87RrL*pFOY0 +/8ODoRLG#-=C"/KY<:RVjn-Yp6h&+e'\_Om(J/X\Ykun$1?> +;G2J<#&dstRb6[N^X$_uc,hE;mOdTbV;>5D\$J,#1]Ar17PP65Iu*9g`m:)A*kk_>$\K`N.8[ +>Dgnb%$kPT(@kQHBWf;HHc_c4kMD!-O4lD0$AG8&Q/V((XVGP,_TqiU-lUoV[JqJ'*+J/$P# +SH3d[rIfQY4B!aBL:8^tjG[l>=d2&,"Z(cch'/r?U\m*"5Y"h\kf6-X.9a=7Q9FSS`SNH$9= +&XY*d]AM]AD*fZ<2r^/.WIK%sjV7C))i2<8CP!d#XKn@0e2H@l7[T.U]A0E,QQ&D7A9]A2OVg%q' +k?(J:&m\FZWlcGZ6TTQ*N/]A:ka.rW\PHm(Ap@_9X%p?"-3]A_Bf<(1i1LOopg?'\Xk3%XE_rn +M:Jr']Aea61$2WIY[?cWZgb>9^iaqVHl5hoI@3C4,agLOLbL(b/djN'pn(H,D>jG9lHnjNHb[ +U_bSF3nfX%W(a;S27a1a'_+SS(UW3$EsSBUVN`M7fhA1kq:(5`opo`oqOl7C'dnY?WO*LLdU +eDdrTaWJ-/1W)FSJQA#NXtECDT$n32@_e!0nH3"F@O>6.\iaV"L35ZT6cQK'B^J`SOK]A7TP" +!3e7'4*XN:n#Bd4JFcI5b('?j2\_6JrIVHZ=TjNeAK>Si;-8a"$ePg-F*Ti-\br8tT,a2AL[ +m$[$qKpZB%okT/hXM871%X;T6S6'e)Of*P!D5rFF+qaI8Sbqb0[ptn'SMgeo'R +/@>AZt@Ni?WZ@q,t>b.jjj,VZD8g^AIpncDc%IOj\,@R5"@DBifbK#$kV3o:;F=u6?1Y#sAP +Rc9NO`hm*G3iTg*cWaTc40J!.[DEKoiRN,O(?iX9LneJE6l%!m7OdPc0a?$4W+_S\>p%DiM) +)?M9\<1W**]A(?_I(8pGfX_84t0'X0EN6&S#k)L-\'D/AMDTblS$\3,]A*i4D8*SZKlNd2oRls`,+QYpV+"]An-q]A#JZ;(SmH&U"VK3k3h0j>;q;E< +$GrAq2dZ^Om*Cf5t*R +:u\_oD\XTq;Di:s6b*FFiC374aQ1>N;dK9TE%_I^Nn9]AcT1l0Y.FPZDd7PdVG/uWY*\Z(f.: +-DYMZ[9s8M1gHqp9VH\FeDde3L&q*?t[5'ZjQcf\.VG2:MB6tAHZW2t>;hJAb@KV`*i(2DMtUs1U4T5SQWp2AHeA0h3b>#+FM\r*L&h0@a*2 +d8aJnY\AWIq^*mb`=qu\se1sXmf$u"L<=!AL-rJI\@^%XrpCC4r!Ni+r"_B2TfVT%UFB/$pe +^MUQSD*_qK@@$;er'9%?Aes\MN#B:fopd?=reR+q-Che`Pn$hZ=q7j(>1G=4DS9dMV#9NEio +R^bH60G\hr.W:fS>0=+@Ei?053:k`N8ROF,Ji91PO:bJPCj`+pBB&^6 +ouXI^6S:32RiOSqlaEhKOEEof[_KV4&SXoWlC +opBi@VTSTHl::m/E\og\!]AMpMOVi?A#aUd3__OmMhq5k]A(l\65[+M]AtB6ca?]Aqg]AUh%E]AHoi,I=S!@/E9,3_WCJ#.%0f0qq)]A +CL",3jpQcB./Ss_lfK\^u;c4Kbp +AlnA5QVmWoOP`?gNP0G!rlp\j7B*S]AJ!l1ns]A#>`I>Bi[l&D11K#='g(MQFi1DhgOss2ui]AG +r6^#jK0Qm:ddP]A.3KN!Dp0"$`5QB@8oS(V@HKQ6N$k;hlrn'U[(F3<_="dMoI*FBh1[t4Eh/5)kG86`Y4^ +cD"nff(M/*.'6lHg7YQ)d;P*,hd"!T53N_WqqRX-qCdM:-0HnOc +&9]AnH`b3Z+6'`%U#Iqug1nboeDQ-u)_HM(rj%j7G"!gb#N2as>oo\TJ5Bau%bt7mKHqB9qTE +fhe[b@td=MRTg^LG"tc3i8-")HM#Ua='mhG%P3\6ms&:,lM*V+'lI*Y'%tmVLR(]A+E6M!Tir +2:"(\F/bolSi)8VS5NF/,.be%)cG%XA]AgUPjH#p0NAuX]Ac2=go5P>k;G=p$\ahk^-!;)X[`G +Y7)Z>g5:T;t]A974f9XiH,G!<5pG&$+5Tt"Tpg]A:pO/I2ot#& +7hI0^hQ`GND`Hc?M57E.j&_j8AQP%kS7n*FpEV,(DR>[E:.g?Tr"u"PbC(,DD;=fklfq'h3]A +d5-m`*?E]A)"5oU6@M>%F[YMU.Yn^rOAUe78>:dPA=!kkD'jJohDD)I$U&?%-aSVegTEG`L2e +C>EPk"%nfDer&bC>4JjtQHXEOWE=2ph$-..^#!L),qc5"rDlXa^lJYaK^oe*kdc;`%_80IX" +B^Mp;GNPIeNC!AI;`:rU7Jmo(/lE:cZ,M?[Uh#7ioBO7eW%,5B>cnf8gCO4T32CK-tsPl1jo +'cqD\J[JdM"XD:HPYOeIr^2h,65u]Ao2B/R*e!PRVk3*8H:Y2LHu/#k2dY1LB +?*_*hXK0m&!fl!/be,poM\Q8CF-l,VClZ"$dV$h:[Yak[NAe%NI6gacjtD2A-qPXZC_O'Sd<_7h7I4)Eo4i.N5TrHFLXCfJe7^D#9#o:mYM#pJ:e"N +4H,-FUARCFrLO$#2eO4@H0+Mg.+`NOAXdWT8-&7$N,k3%,PN*3ZWe8iL,T!L=eocp*OAKM-XG:icsr[hca[eCgr$;f=NGBhcMQF5VT!Q,qHPrFE\, +OL_S1+OW(JSc:r^.`E%g:Y!P^-&$`4U:J9*jmGPeM#cLn0@h]A2-e'p=$R\'p^NJtO@r,;&XS9;Hu!Zekg*?m0PICdTc/:UZjL#LHK!X,&hJQUl]Aa= +]A%IV[2^j3F'$J0"iBX@VGTH38"nn)j(UM--A+8@S@19/j''JXZH,8^rYTm:hkQ7.[G9:N<N]A5jCoqg +8IIW5p$Y-8Z)Pjm69bA' +ZVU#EnO?J#`nI^,BK=W*9tq,6h#I*8DuT^U55N]AK:Y,b_b`)M_cfEp9#CYP?1o55>+Ari[F@X,k>c5 +QB1sq6ThonV9@$J\V,@&,jJ&5:DSRr8i_6qP,/.gQ2=+a8bjOjRLpLI/;1h^\:Cn#6c"Spge +jc#mZTAB+"t`b\\c+J<3,IH4>h72rp_9]A<2oZ_NQ@FE!mUZ:^oB?E!\9h/<=3'-?clN!g6+% +4*9fKL[NOA+)a]AW@ZeHGCb$rlB<*7(>%ou^`eO2l\->?N8CZ=&5g@`#fG61W_o#CQ828`OK!$HRe1K3gWcRQ)h#66M%,O9Trsh^W3`E)fo48dj%`5dd5 +q@VS4;CJY"6-\PXYP.oiT\A1&1mpu6Rl, +WRZcc)J5&FC\%b5''"6ce!Fd>$I0rEY]A;CaL=A4d([+@Nc'GOGh1s<,O&fS+PC[rf?fen%\j +gs82hBs.@$omm$@4&,c6qrS?B/e_bc8_]ASi8&,u6/IcrHbiWC;#_#$@g_*@hJ:G0-q:EW(s% +rdM8:C"LMf_l'[;d5;"'&+87rGlO@"q4mu\a8aI-IeKE66"5.Ep@UncBeC-eTCU_I]A`1c'p@ +Yj5E[7Vf'?E5pEOY8AGW=ci=lkGBrNP1G9d\pm-5#]AG)]A;[17Xo>F8Ju8s#V&TuWC0`oE\&D +1MFRCF)LCUN/BX%S.:aU"7Z67m2CG18&`B(s2GJS;$%4.qlasH$H,sWUjo"m +G/?lM0$%rJMnKPC3]A%0u#i:7o$4H&$:h]Ab'=tue_*pKOc +6k+$B`Vh.D8%VO:$:Bpc7jbd7A4_U7H/5#`&e$^7i=(L[$UdFf<&_?>`kHTA."Md5$\nZV]AGhI=!.P6:+ZU7ft!2"p*s_\ +T-OU<(@n&+oiH_"s82*kbUWp+7KHH1'1S'8h0tr$4nH/PQi@e:??<,LLJ#p^L$O5M\r=7H$O +&"e,cr<\)cNL^r`^"A3aQ)B[==G'JD/:+gid1$2Q>P"9V3:2YIA:(D!s=KsIX1,oT,"B"!]A5 +VR/8Kkb,Pe1QjPE9;#Ei(u/h.DKJ8r2$BVWl#4K7kp?u; +XXagp*^R06N6`XiICjZLHc@EH_Oi5% +.G?EES1HghBfKp(5Zc\kHM$Ps7E`ArnqhM$:k^E3<,bSYC,Vl8)JRQ[fYM0k<`RJ8%Jd1iLOGrsW6cQA4%"@]ADu/HQJ.G;!o=!]AU+;i +KV]A*6Od,5rq"O>+J78#LO-*nn#A(/std5a?'>ZsN^ouQ0ScbK-R3tkm<4]A.)_"M)hh**YDUe +!;kdC^O]Ao(9t"O*SN`"pj`Kkq/=,aRQYY8XhVn6g`ILROPm:'HaQntk'"N8 +AipnECkCTJ]ACR-tK>ltd@r]A9?0gi^^5k43-8/H<[1CMh;6oTMZlr/Pp%_.BZ+J4cqqZ$VH!( +fRE<991n;KU@cR`".Lb)rjL(`\@G?R@J)R6.jgK^b3U6S>?Rd3(9cRIPTRI1.S&'s7&Z!!nZ +.[BFtuds5+aH42LH.Ve>-Z,4iNAGoN3LiQsHr/]ALJX./-%(WNsQsV:gs +8>=]A^j*Ad1-qN.jM#+d.Wm(%[#!h(FHmfF^Yd>IT97NG)S(^Yb!`"9mO!+!]A+CbWH]APt\.A4 +ZAI!A[[p'cK%UEILc^@BmeEml@n=:N=aCa,[H\t)i7L2"Y`;`SF9#B?Olpb5'aAON(/@X3Bf +N/QpHZ:.RoEu`M/6/YeeGDX_kLG +3E92`AhI,ak3S:18d]A:rg^cU>aRj8O'g,M_mSj(>/Mk<3F@4E:"QqsI#n'rh]A1:s/hNJ1AD'8 +X1539KK45;-oUjBR,K8T6?S`rL/>p?V)!)q>7coS^$pZru[3= +>$Sm>]AY0L+M5#KI-oF%6I.^%j>G*O[Q>!e<5[bGIge+p"_h30LTnE&ugi\cj+qFOF849#`J<[ua2(Z69l$e^tMrj[cFU]A)%<-rpdc +%h:_i!faH(e=6Uk!)-I^"qTM2(g&(d4hljalNlXrs]A*Gk`q,o00;/P'(<8bkN:Xn*n\hY_,- +AfSPN`?dZml-Sa;kq9BM:Yn,k=j$J"b97Y(3h*#b$>dF%Rp08fF!bo)N6M=6R/K14@)J?0)Y +&D_-IaA+m&+siufkKg$bN_;R?SYQ#E&,*C"LQk==)B<4IG_C_2a#6pXbLhjO!dJ7/\IUmR-B;4 +,r`\&?D)i)BN/XXC^Gi&D]Am$IsMP'.K/%[Y[QYpJs"gi8KG=?[3s-4L=(%XTA#[1ECKh9KM@ +V@s1f+@CAsm4(fqqPt]A90_m+lrl@&&C?WoX&F&^C +bF=+EPn&?7h.+L(0aY2+kq56bZ#nPF]AYbb!==?.,TaL$kCM.7'`U2SELsElUS1,1*N`:Dmsk +G5[8lF1;P54WWZBp!@[%sR0Xb;2P[*XX(#=Bb\FVog3!F6._HO]Aos%q6sY) +W'#%35bj.=\/W&E=#K<9A"1?A'gp?Yl-D(fXIO_WVT!%.K1?X1C2*0EiML3!hQgb[lSZ0F2B +%K.b+3>?1X*NPqfhpe]AU51MqiF%8X6"1k;!P01,[SR!bcJK,dt39nmAd!WfF'$lB7#Z&mnRS +6r#*)H!eta>PIh#BD1DF83#\B&@j.SI."YpBE4-mcCG0Tg$N`R!3,UQ&_9PL3fNkrH[K=g#e?q]AABQ*6i\/FD2s6\7DnSdPL@[H +I11#*RM8WNZN``[8sW^WoZjl6roW>Uc[ +K@a('iS^[HS1;tlHg/Y4F]AE +928ZRZks1UL?m,7GH<$fngTL.3Uj-m%df+@bl>_?X+cQGnu\TbE/i##H]A&h208fYUHmIB5oB +!F4Pdr@09&O+pgE+$DA8[\e)4kV!>Ct":'0M4]A)`6(FJG)0t7IQ6Qf\r>AR2bM_S*$iZ,IZj!FtOiDXfMCO^e.kt=Qb`.>Wj@Zj_OOlS-*]A]A_JE-]AMr%-na;3hOT^9?JST5[ +c!FY"O#)0d&!]A/GT>J"=E3j^B/95\QiYl-]A;D:Iap4CNiYM<9uAk$M^#MG]A&]AAQ_OQa$Q=uj +BA0eljRT30dE_kbh.`X.(--FhNr&6*_g+i^[LUun>">5`!T2+.#DYb&+S7tQ#rqJD;g+Fbj> +S2sF0m))$\C5atF8BH,"jAM\N9[jei%kE0fuX0KBGi_k!RmcEgX6k)[>3fOFTr'3:AA.G9B^ +PsQKPE1(R0s$Gp9.9&Kc*(H<;B_M&E>:h@OYi325/R.sgnpBGnl8d5@--@JNMjJpY%o[uO7/ +AnM6qZqJN9:HYnhF/NecFM.@`dccNg-7gS%1-%2JF/YZ9#?M^CLJKfaOgr_@/]ALZp:G1c'fp +C/2B0,7TaP-$&[Ud-*KCJW8:sGsC4-W;@l@hXUDiT*:KnMN+[&2mOFMu_4AK?]AX"8d8%*^/# +uBA3%#';)$PK-r +jkImhCr$oe(MX8UVH/]AAt1k!=S..tR%tZO54iaH1nW`\;6l$&&S-Ec:V]AQkcl6URTrLa(aG4 +4;@ersAcIX9e91(ds+55NX05R[D'0*V^Kn?E`-l4^V"7$#t!3F!b=i*+O%TuK(.T4\kJE1bh +#l3GqJB9?n/5sb"/G2F5O]A5"NWW_3_]AihHpAA]A]A9-QoWKSWSK\:p&Y[Er.&[P^qV`JFJ.A[L +/,;Wosos"1$'[ZC+&,l1HL;Yu4#"R"P]A)5qj"8cQd5213@?Am9ZtIN35E2r^=!"I"-/]Aj?+& +.*Bp)[)YJbMZE=OBPM]AE1X_9J$F1L[UO$"lAl>i\*Doa42q?e.qku9:-biT$kb/sUE!(+#"E +/E<-LN63t*/Fg\D^DL.lfGW-Jaa[J.5* +jB:^k1gANc`EF="l`(sHAD;!Q.ab:^'P44+b_4[>Sds +AfrS-.tC@`"I-sq:8kHML?t#kENmd)Gb\<&9sGjR6QZrPnm^L,(UL7J$!"RKT]A6Z2W1jP1=bPVb$faE;%RDLq11>;K\h`3hdLA:HHPN'",=%dp[K9se +\i@`6a1qfUY,^N\\ubc]ARl4SDV*#k!<"@2pVlbo$VJL&jhmWt`*AI7HdZ=S!Z/8eco"V9X2K +Jlr4uHFoB!B0dk:ZtWlBc5iVkS\bd#?G[XmnG]A9Q59"JQ4('L&q-lR*cCg.Hi[I&>r$e%`a\e1JTb:"0c +[Q#[MYe>&+fk=1M;"cs2!9GVSMhFkh&X]A2>n0J1e=E\/Z.P%%9r]A*.tX[4ED+SkHlEqHL:c#0A:]AB%.jbQ59S4UTb" +/+]AUpc*.Vo5b*Zjqm6Kl+GOo.Gn#Mn*mimHR:6d1s-ff)-V:79^XDMFP6d(]AmLS%C@8DidDC +MEA7/d^k(-,28)Z[5a9kD)g.S>MS1'C/RaNEiiR%B!ZQ=T1A4k>PfuC>@dR2p);66f0q'/T\ +or,MX5Q>ieI#nZ=)&?HA<9H]A-QJ-L/jrr9[s>H0"&-_>R$)#/Z]A!C-3]Al+imr4$Js=$9$#Bc +fW>$AhKnDBXOiBgIV@'!>U!U\4beZoO_722l0RYn5_^Hm!YZ@DdhNBW1H8,[<;+nY(o8_jMu +,eQX)(cpd>BQf5UE'MFRN&['sPt&_4@ZcDT[jE#<3*YR_^#CS;C:B_C1(=PK2n!KY9jg[*"WN@o5^,P*# +,N5DrNNV/1>:_Z5q$S&[hQC9(_uimT4AXD8_m&ka)to.4!P&i6AIYTI>EreX,s0.`dN8 +rJ#MgTX/gIE_2@=Um!LF3q[pc*!1,uUJ@>WM,[d"&-1GWmi(JQ7;\A?Li33JXCF@lSsFNOju +2+(SJ1e]AH``n3g"[$BFV]A"FeX6fMLG%EB+!:+)m$J`n9eK2T+VY8P:j7cIB]ALPc:lBc,[aiX +/X7RP'e'>>c]AZM=+b$K:PVbVI3[2pgmiDJeaRW6(HYCMJ6nb'Er=J?9jd+64ah]ATe$:[Gnf1 +ulNPB9!qdKoC'ZJ +hkCN4/5l]Ab$Z/L6?rTZ.:B\=-lZ*;F\*.X_#7.08ku*K0?-TEb^lEWI`fSplPmtgd1o0gY.S +'^YRjXNNR7`?FIZSG#")^MBkf'Xp$sl1haQO2c7bLe@3r>fSZREN;MN@iB+pDLUtr')-`=g3 +bKX5!t6Z'[O]AH(`89=n8Y7DLqIj+Kj$Fs2dl:1USXK>4=p +0P:3G';?!:'RV3eE:f%!NZZ +#eCHD5N#=[?P+hU\/="N]ASp2,*LeKrAZ5gX_fsTnXXL!_Ds99B_um:uXQLceV0r]AUkNUP/Rd +1&+pjr#*r?;9[h%`C%I4:O&BASGh*(*/]A/a>_^=HV'LD7Y66r&>A\TN9^NR0;H&#t<3.'/fG\pF9t.&&CaA9e[N%drH'BF;F9kB+bT-\,3=5Uo:`h&^)^i[ZJr0beO`1d1^kW\3?4W6DpqmYT&XCNH!OA +:B5,i_t9nQUR-=WumUQc386Hr!Q0ejD%S!4VmQJV5k"06eBZr>@Ae/+LE9U_8po2E*^Oe?:) +YqdoI4`4IB4hNl@0afO(7pKrd>-XGg,pVB)%iGb+3"i2pmi[L. +gcEaD&flSL=1#=s"cn:6)drZ$&#ORtud'rd]A96s/Sqb`_NTG*f\I+m!.lGL"r`:C*pRUXg_^ +6$WflVZt)4?ApCP +&>.($3cf)l6=W5q2DC9a>dJ[J:3/MD&P'n/#<';HlO"k12pe-TPlI`Ko?rN%?+Rqo*#Vs*$7 +6ZHlUL39XI\IVr&m@pd!Yk.*qN"/HbZ@3o%k3B18j4G.N7K7Xb_CMkC]AlOc@Nr8SR7]A4$Bf) +6$FUW0*-fe4>NsMR7+mVU;p_((c.#C#C:bkEc0[;Z!*-i/6p1C#t8lde[^M#r(cJV_'#[(LM +6=W1Fc)G.:PsueNi^f3bKT<#r)hm,iU\=U-[\aE=Ylr'I&ij?1ib!JJ&bd*Fg%?*$?M +M'YnJ"NYZHob>r1V*b:@B$DYj,?@:mJ=-KKW%a57EP@;oGnKK52+?aD]A"oeRipS*:&]A&d?$! +<#6;KNFnH!]AFA0;q.ZG;;q2D=muF>6?sU@43l1+=%%,NA$Ej_5NE8Vge+]A9aMo1lP%eSTYdC +>gpL`j_'9Cn/**GFE/E8S3pDb11^U*!D'`(l#c)$Q +Qj@iR8Fu'n6RWK6V$]A<*L/X,!eaR-C;2%.Njh`5]ASE$Z2(X=RMO-Sdlp@/9KK&^ +0O>B4\@iFm#;GT!?"H\)*MBGS&[)DVq%C7$(5F7!?%GRICcLJ_EUf#//?QmSqKk+<@CIBSb% +^<9W:k[BZUoek8sRZg.\C%aZ\u1^V>Hdi6M5YSe5Ig[oDnD'XoU&4BJSkq8 +R7/]A.pHoB6NVegmtbJR88cNZ781W[;\TXW`5SO_FsY">L+H/*[DfAIp=S&0S%Y_W]AF#484H7 +d)+7k":4!*X=<3iQEDVf7mjk^S0Dt:s6+NJH8RS@P1W'P/HkA`3!5E]AoN4O_Q< +><0l#?oN/d:?g\4k-n=;PB4:6Q#pJC0SuPTrF(Wd_bJcQ!Hj!5sHcYS*IP^F*.b5#g')N)B3V:15^!=/U.uCN"q@=hl;XLF"f8n)Xi)Jd%_ph-M5b/(h. +CDWgom+d5+[/f8a'-3;;-LF?O_),>_CQp>b3R9k$_TJ`<3SFeNfuA08r`/JT)HQI6CL>]ADbH +EU>__\8L+DFE;!U^LKqDGEUtACc_n/1TW4rKLFBImPW52XBII/D=VcPd<]A)]A,@Qj$S=Jl.$g +p1>$:YML@R*f]AHskk<\[U($An@EjN3d17lL&-9Pb'*'S>,OnC^A@nVOe6;On0*Dg<,2o;*d]A +pVAmMd%>%MRC;2aXVP4:YU)NWjYFKKDk20L5]A;JXlh9d1ufpi,L_Y&=_\\HAC>FoHSBgJo5B +F!:AbBaFiE#YT\6]A&-hYNOZQoN-tPd9TEKK9pgeJp9m'np-[+r:r:o.1P=P#8I@6A"(Opk6$LWLj +N.e26i0mNXVb3HgWJlkDOI!h>Om]Aq7qIae4L+fV$5pL8d;9+uDK3]AkO$M*G7NMdYD9aaWm=A +c5,Pqi!CPR6C2=>jit9h,4VCN.Og-_)#%6r_.(#"]A'd!0J$N$O/ZU6KkI(ctP_[]AJ7q.OKq0 +D`VNoK^_l#1$Pa"Cd5D"F"ls>&i]AsA_KgZLqi2uo#co3Hf619?k5rk\-l3E9,AQ%ua$t,)SK +b0IDD.F+gJ&.'eWj3KMp'iQJ+h^?iMZk&,.o$Re&es7HP>!S=1mGZ;L:1>p$YaO2.m_PbWe& +6b,Bn`f&k3n'.?]ARmO@+gLG6]A3U&;Ic91csR9n6cG>`]Ai0r5o#-8!u0X,;IPM.>_)/FY\^O9 +R75VimK$u7oH4nO+^q8CHlg')eo6-R"mST1F9B%HcQ,oqo"[hU>2gldW,X+s1o&Rr,[Qg,2n\A#2'$.BIE*k>* +b&^WEH*jnnomoZ&!kjb..R]A1NnPD\$F-P,R7kW>NQnZ[@[\ApAUhl`bf +GJEkBh4#/BhJLi+M8^sMK/88'#4[n/&1e +#RpW0Yg7?0<-D[+I5_@@Q,#b!!$GL,*h?4@1qCK'd7^PEZo]A_C6oL#;-pV\q. +-37$?YnN^bPngc@d\.%)4$\b&"1BU%f'5YG`:J$NcJ=.9BW;jeQK0*q_,/\*CMI4`b`"<_mX +PEc'2[5;@S2Dr+o;a+DK%I8g*b6MC)*gFVZZ"S_TBO]A!q[aLtbJ\Ql#-b42JpLTD@q7)=WVm +blsgA0B(k6p)GD3pd5Y.-BOB<*14;FJtE6HS*FaA#GV_#,cd--ChM6.UGn>-3fL3N1Y4;NOU +;?Z_mQ_SZhC+jM&:a0C($5W"oPK)HnP68t[nVVZEs*NrsSL0EFa366;(&OjTWF6/d#l(86^<`K<$U7$I-9kV%"u[)c(XhCrL=jjX6:^>\3-UcDTS?:D+g4Cd7Lk`D#=).\Ymf\M +,Z.DI"is"9%l4>c<%cT,N-%&[[6,k,JY*@:&; +XcQ;?sRh,m8@dBP@q;%,MI6&_]A-/qhTBKWrb0sCsW3N%C3CoHp\uA+_IKL:$%S`7X9E$fY=o +rjM$&c^!j0uQjt[@"$#/^>`:d%m/ +D(;W>-]Aab)Yq_n@RUG/!V7gPWfiRro"4;4NS"rWqU\X76Tb&Ek',+1%(HS\!I924OZr`#WZY +!WBW:GL1?hm1rq<-aJ,)pSac=h3gtqo[X=s +c)?LrbFjo>*:d<5U;G_TJtO;W%!a.Z6c\0s\E*a?*#M>?5Y<]A5Voi>`h7.7$;aC'of@=&?iiqE:62<[(M6KIGIl&^Q=G+Q +AG_bol;N"E"3lA'=!rU![qmIouXJ(n\J2??4)$'k'>G6nZlX^ZT.L1k*o@iYLZmrdc%ldb?8 +D7>"7uSDGj4VQ/HlJbDbl27M#eVLgj^:&+tT*98"u7!C/%tmh@9pH"Rh,@$?DL`&'l8>nN_@ +?1\+Ed7+*B:=)k!NLSk8PjVUbO-K),OFF/&OVGC7+X>a!Ai!Bu'M1)-X[ +7hNWlP%8oD?]A4mJ7Z..-Vl(hlO:814[).&90RBf@s-(,o(mD]AhpI`:^gO@un&`7q:Qp%B2je +NPDi"AP>/P4r>j!q!Rd9@SkCBKMp5gjNP#QGG_[XUW7KC?Tj<2/]A'>Btd")5n+@tm!)q(5eK +G8BV`AP53X(mj\:j\k_udL/q-/X$b[Va9=9$In\LW<,]AEs_!Z<2BZ]A?-'ON:iSTL88UZjsk]A +oSk).MVeHJi?X&>-t@dF;A:ba=pL%>`$tI$QYSV9Wqpm$gDm_-H +P!u1)=%rQJ`7Dqo\?_%DQ[tmotD!gZ`C`Pa1/Z&bY5D]Arc+XR>FIFT,Bi?DA69^Cc(4uAtsX +*fmP!$,ZYjM>@L4d4U(Rr-8*AH^k%'f_qQ@_."nT=Ire83]AY[HCRuG_f?3K.d +]AtPjH?>d'Bd18Lk8lVq)!QDG2g7!d+5+-,+sTenV#bDCc_WQG`Y01P`'-FlN#SE&AlC.Y"Xq +sPP>'*(N!NmINjckK,1t?H]A]Ao]AB0n?u5:I,L1qD-jUB73$cc$2NO+DP\a7SX.-uTIXiVI +/FTBJ0Ea*q0hS+;-2sX20]AG&G+H$5-8>=ZP_dnCV6psg]A!*XLP3[)j3g44>C@@Wl]A5jF9^eU$eF(@m1lhTI2Fj-cS06;HC/6$a.Pjfm=Pfk]ACcrIb%J\5q<7/7hg?$UW5uW#S'g/7AKbfe;DT@P2iW' +"o0Aj6(:"t5E:@q!Vn0P$PcR8`fR<7`B +HI'=^..>d\nGc54me0^3rG*3OChKE15BSoo:'F*ElfHXcT(8l%'oK37TO(3YV06,*dmq=M#-&/5D1BJ(`D"i0d:uQ47"%$!!O^+Y1_28`qW;RUie)9.=sgZO'B@KEN,bf)]A +iZXM;PA;XC=?T@NJ?mZIYbRg@mg6r9H#/&Q8-ti:e/$h>oBb2oVs+(,U<$IIg?d,qe;OM +$EYpKRZ\91l*$M!(0S=_p:=Hgm;$%@1HG).!&P+9sC3>56h8=uq#I`L.2/M25ot:N%2_[sVU +8[XW'N/iQ6hM8h"Q3_P9$LfTH=-!<8ug(a`H;"3Of]As'"-FdXq1_3]AWb@Lc"T1d\'3Z3b*ZC +CTn=P%2aD']A\b0%Kr?i6]AN>_hilhtNo/Nld.fk/bEX"K<:")\'arn#cS*hjPsoUJO+od9Eo\d> +&g&GN-HG3!c_A`=m1b4Nko!sb0aJ\G6E,53<2IAR\'LcEZ@)8Gb"P3uZ+J/WnA2RSn`NQ@0r^lCFr:U=:^+pj-=>]AF8>-jSE1Q5iY4C +NADdJ#i#3-t)=T4CnYf:74ZlOW9l"O7KJ=KT?amZPV1URC1kJ.!K8O#-FJdMJTJVQn)&Wa,8 +5UQ6G=W%XkRghuE!tTiTO$t'&o#(!r7]A9:c-TB(iZ'H-4jhlWe7dSL'Jbr+HBP1Kko +^HTh(tk"[u,NK>X5eeTqFiHc]AuimPth_SM.Q*OjsWer.Nt7A6tY),bq6i8^$*e]A2_FW4P<-$ +h6'-iSk.M#cO"h&3$%.=H;g6[Bok.NEH'69iY($V@?2rRZ*5aL:a&#dPc^?,(&(:==5>n!VL +>L<;4BRZ>)g-FNl=T5oLRhS(?E2MFK]AoHke>(YX@K%iquq+BD4&ZN[G0N%[I;$epk`.i^od> +@AJ8Jd@Hr"R1qgfr@Ll?V<4M0uBGnKRLX+5[)_Ih+5qMR2![;iA?a6LIp*HMM!/oJ<)I:'Z` +5I37'G");'kJ6YH>5&5`,ML8rkY%0[?&_BK4ND=&4T7'/eij@,7sF0JH6Mj/H`QgX!?P>V^6 +rR#c8h@8CW%gYPc>,l.6.82Spaj0K1gsJER.H&En9J5g;K\YV8Er'"^ITqQod`DK>6,SQJ/U +lV4">KHU<4`,'&ge5`/Zp`;AY0e +Qg9p;Fa?(aKC']A"+ENG?fu`D$4rKE3(%,0fRZ7d%dorc##.)<(EtVC<)A%aKgDi_5=Y>QZ)Z +@+GWOp4Vc1]Anb@ugRJeHrc5u1]ArI;:EGESN\*ci%rf +-ZYP<%f%+Xh]AkFB7.tRbJ@mt9O1+>a<6Ug=\h#Y$'&9N#q\SE2LAN:,-_.&Scnr8?leX_uR$]AH^!=+3TPI'#uRakUNL +t'0a=/i)\)(XqhMd6f;-G.[j[O6CnA4oU>DdZ4B7SK>B*b"EW^uM*,.9Q[3_h2ds7!U(Z+O]A +]AEisLXR2KUbaXj^P'M&:0>G +b*e#Q'5FK6LEc,7d@;)"Nb2<<-nJ4dhT=$H@QM=hs2cD[uVtL0pT\F>FH]Ar8J%W#?Y:$11[r +".PRP'R0,imG_.05RfFmlt'E3dE_5aM$7TRtaCab=bO-0(7LOJ+UPGrZ1Z^WuVR9f ++s,PmM\09W0@^u)\k[,aah!jMF`,uPr"$+r-iu@k_Z?POFE8F<_tiL>-h+'S`7s\m`c2o]A0, +.-m?V=u`u5CJjH56X,=ZYHHHjR-5EkRE[#-n<-h_AccV;!;B%s.UdUQE#+':RHFLgj*45q]Al +cKodhMfOM&=!Y9tfse.1ZS.k!(t>#nejboL=^FpL>!Y':)htr*m$E?'8bUUTjeTr5jr9RrA*W"BseAplB>\]A3k38bD%:AHP*B^7S +\XYf1.c7W*qf8FZ(Mq"6i8Vmh!.DZj#Sl3sn9iZlXcbC0`?S'd2SFFu7s(NF^kW.MY1'<6rf +0oAD^,K6)S[RAF$pNpnBC_jUuAcn+rg_@mj+D(^1Lbos-WHGe/Fk$'9OnVl9dr=U^L:er!"G +d)f%MbBoJ]A^5eW4^dKF/i!57^Wj,AE5VH6tLF$R6cAsrd\45Wtn@1.^ed0W!AcfK4U$B7((]A +(Fosi5+MYQu@/[.L,(MDf=IpZ +q_&:GaAu6[]AKpX:UmO-;^8'NLJJrDf.*Yt\QD$98k+27QT:NBVkV"`h^p4AX2r5sD0:bOML! +g+qqE-@:WN3AXdBB@h6s_abES;5J9eSboEW&VO2mJUq;%(]AHm56M_tjl)"3u^FA\@cqoY?T4 +0'Z`2E(oo%f4O1Vm!*ZrYOfRq]A2kupo6[rbcR';4=S2Wklogs[40PaCs7^uRQ=X3 +6WH5E!9f@(XF;'>NV0kZ1A`p)!'KF,qcS:5[F_k%[5VIKG^eO/G +IPigQCYjPgOJVRCO_T&jn7/,X,.S$/Jsc\r_W;Y`pA9-2:BIXRiU+N?e<+$*lB98K_8l.DZ9 +jFS&HhN?_-;W3&K(8NY=5MP.V[S7q[QOQcah]A&q-k>a@TX._&^2n]A<1WKg20F;78adh>^p%. +.6)3"f5)(+4RF%Ud@;M>W_@Q2boeQ0&@aKk7CK#W#^%q$EX\a/OmLO&Ysft>?\,@i[kgrpLMEH4WC,< +.;^F_(bn(q4lma[-n8ONOPq<9YEV4:\/j0n/BG"WNk@a9"G=8o?=@Z[9TIrE'mrpciC8Vu,9 +Psl.kmh&6l;p8R3]AFJbNt1aN2/q3M`6)1OKi>dpAnZ/]A]Adg:6*ZYCG]A4+JN8%SOl%Cu.0)'= +;V/Pq4[YSsJI#93A)2_4:MbJTbDr+;mUF*?Fj^&%,7,(g!bEi*f]Al\3\t0f2&!1H0ce^0$14 +`qP*54):rro":Fb#4+eQ)T?5=)lk6ZQ\Fd/3`V&-$]A1f(eo)H!r^4N8h$rd2NG>.f9^da;0' +i>cIdk"5/1(mbfqW"2T$V`t[NtAJ'KNe+K4b"3j.^_>.YX59m!4T(VQ$I`0[;Us[>$<@VfW5aeump7KrtT^B#Z&- +Okq/u$6dm=P#.!2eEZ&)pV=5JNo>j9&6pbH7%_m\WD89C?\A`&]Al[c,YnfPjO^L^#4q?TC)c +=3V(*X[T!.K#O'e,!W!m:ZUAX!D60nt\JO8q-"W3[*"k7Y;'oWULKfO]A-r7hEe=d5+b/m5-B\.dr$j0Q[(A_6"oW+uMD)TgOo96+;]Aft=jQCp@fQ^]AI5NW\f*ZC/#?`[J]APjjgrSeJ@fNa" +:.KM#\W^b_*:\,JWY0IIl-i$LXKh`h7E4\9GA +pB?W]AmnC+oaVCe#gN6S**]AdtR9R!&Qg;82"K=7^sQ7A-H,hWeaH4Td, +3p!0)IS[nAUr9s[fY!S*aqNmD]AGIQSL#[fOG]Ah!Lg07R$W?$!&oSa4:5RBT`lXAIU5RXrgmW?a%+7X*d$c.bRh1tKeQW"%D)iL!f,`]A;a26^$B$IM>l'>0[[-g1<8k=%BqQJN-YQ' ++(kFT*\1&stK9SlhHg]Am]An#TDV&,S,(q!hPmIKTs->!X\l@]AmLM4f[lA7;\QCaL=0teAELH@ +g5^5A(Ig'3bg0<&b#bSSam.372ci)7,Qi?3VP.g2eqkG02nPpnpa;)_0H#&")^dF+l>1%:hP*IOgLqI/>n@`OlLa!]A#`SE +%`olpEX1NZg!):"R.A%XS8j1r6>"8qC;#F]A-:oW2\L_kgb97Zb)jP,Zt:M7oWLROk@eV[Ds" +^>"kSP>"S.oRf3HWjo$R]A.&f4liORfp*X1/<%FZXo_,Jt([8819EZ?u2H?gf=BQEH!btu!+g +03"Q+MFa"8RARa=(UJLUY[LIC/fEAD`V[e_CIcST=`1XmruN0*-cgu50ZU8(Zf1HG3!=R5.. +ei%<'4oen,+m>h:a5EhZE&gg$'^Q/pfaEiYEg9.):#fAlDLl,c;nl'G<86,!5gi;R^h+/Zh)LSgFXPLeoPtD8lC6H=uPC0Q(fqM>3[BS.V't\MMCtpM!pqW` +U9C6H.od]A!:Q/dgRWEHf(qf*\E,^6-HoTeHFBhj!L$NfJ>N"l[c)D:&dA%NSn) +Xnu`hmC$W\jpPWmc,Y$1;ucU%KPQ^tKJPkYRPI?TNU'aZKbjf"MtCd4VK[n2:hkZtj>?]AS8e +I$<(;i8+^qJ_%+ic[o0gbR;;qYU>*tn67W4>:qs4m,FmP,&o[C8#t)-Cqi,-Bk4ZF.W7_`7& +-,*9PT!n,D6Y2`Y-$@phaA8^._B-$]A'\h[i.(_rEcU/QATiE3C@9p$nQ4VVccYXEf#d +dZhX\nCX7(),]A/P^sZ^+@VmbD)J0'i>OiH@)-RQ]AHL*Ze9ZM.WaFFYJ)kj6m-F%Pr0IH"N.! +H$WlEdcUC20m+I!#b=soos:.lpPZApFhQ-cY=(aYiJ!-:dE^h=a+]A`5`30&YloK8kh-JnZI/ +1`/s.nTPqUmZ#.anjp*CG!7^2t^F>d^TVR\=Q8i"h6MVLmA.U`1ems'!JJg2jK'Xb_[dE;-7 +^T,G5L-uT\>Frhj!pCf/N9.g6$FhXO?>IG@uD8[AZBgY#bpJ< +YqJWagp+k5*S*ZKKZI]AU9(uVgb8PXShmGC;[l6;o[O3:/*kZ,*E_fI0_Y2'&!Cg#=s+:5'JL +?q,n?11qC*:dsT&9&hB=H%Al^'t@%rF_]AWkrbCDOK!U7T[@a-?c!C +2F9Eo;Q8g]AuOu9gEW#kAM@I^MBaBNX^,^-m +MBqe%Cu65ra/HULE]AC?>K`5hQ0HfT7cc$<>@38h/@:nsahB.I6L:G0/uBiUNU51a0c`KWk$k +1^8`BFu]At[WD`/;[H"aAk:jSm3p\_e=jX]AG#C;S#`MjYP;:h=X+sUi)f%N7Vg4Ru>El+^']Aj +LM"RX\F2(F[Ef3R[;u-`WU5u;f$_P-:2P@FO$EGqo3D!9K6tXK\dKRm3.('f]A6=XY5)[kJBC +*,/E;LlAggYKH)^AGfQ.ln&\G^4U4Hmrld'rc=ILG]AF@!ds\O[`Od#*Km>>(2c0 +\?(r"]Ab6=\E*rE(TGsugcJZjLP(X6"E`+0!]Al1NOr3s5^e"F6*Y4^K/)5&tX?l]A>0no[,]Ab6'Pk+QU\b_cNd5pNneN-W\0s'VL*]AC2& +;]A@dq'_9@uWlW`l9g-Agf-pg@*im![V1$[VNqbPmPUY&6W7TkU]AI.E&i+LWbeNs>\,^1b'RIUt9&d;:k8%HO<2U6qn^/.< +do8!)3(.6UFS]AM%D53?f5;Q'LW`;tQq/S7CW1BIT.EB+lr?]AT.]AHslj>l:_D?$PC*L@RT(>S +<.>L^?&*?i0io +pHKAI41]AR,>Nk"uM_f^:LTqZfMoZe8a:Vr:L=YaQ(;tpU$2lKWUD*4iHVM0q-05K7$-88BWY +OAj^IT9Hc6.D7-qqfnV)&CZ]A01\G25UlU6inMY8$2fCoBs\3q4W<)R-6RGX4L]AbM$!#Nm\"T +D#e-I!;gUEpYnp#R&er''17aL;=!s@/$!)E4Z%:H@BHfW4$-cb)oYD$CN-Y7c$GB,@>!EuM`7Xce&)rPi)C@Srja`2b!jS6fVX,tImlSM.V+$Uf\f?&e/3RbLBA=s$*F3r\[ +39iRK>p+]A[W=BWQgIb22S4\=Un!&ULO$NqL3UUT215J6)OZ:Hr\.)DrC=ha"6MMh,0?.mKjY +bdrhB$"oFO>,aON9;tSJn<$(=0:g3s]A'0!$2-&5P-,I$t[MnED\ZjAAR(PW'5I5bi;J_=o@j +6pr8I#pS3_%duD?CnU>"d.^p'`L&q_b0,*<([TDKOb,(+Ra[iI0X;4_(rG^o_nBNX[2Y1l^A +a'-amcqhe@e(NF/A>IsH33VIngKWVe7uPcbAoXl<6Nq#/ +#H/Jmm0:An\:sL/G2*!s.)&Y8`7fmji?XXom3$e:SO[A4/P@;cYS_#hbCUW6G#11p3C5H&8? +>HD#p(4B7@GCaQ]AYX?)KU33U]AT6g=96_MDPA#3P,t-3+E!ku/+WtS]A>leHJj\]AHddPAk>^]A) +7EcrSm3^"`$Q"4_K+#M#^-ZKg3[1okn"DAHZ2,Me>^J^b*B5fr^6mfF-V_n4#XB>^,A/OQQ' +%Vc0YC79)b.8/#J +oLOADH2JHHM_e98`MmA8R0F2)USF6;o()!O4H&4or)dI_pK,Aj9uOW`Zd7k3m66j"'F:Eka\ +S?e/Q`p:&M#qGVA.c/e32H]A+)USNsfOCIImEToI.ar:okRak_sMFgI6j(:'it7P:0if#jEZc ++m>egqL@9Q3rA6g4$!2qiStuik/,%*0eM>Bi\t4aIee]AO2F6W +(7HWau/\%GM\X8/D\u`7D0X"Xq +gd1->N[8!7UiRMij+de9$VBN)&.t`:Q+]AmL=Sj=(8D\9_EWNJ'P7Sl5/!6"al'_c(GV7kNA& +BjAG+B#8`H&JPr.Md5"$k[]A&oc=s;6J_7lPaTML?#SHF[oO!c0e7kRbAA%cmkl+7.Fg3N^F/ +ac(aLNk8V!50EcB_&;/CVX["[=4KI)"#IuskAnZ1?!]Aem+^ +:OC\f:Q+s@]AsOD?,^6&OqaZFTR=H,/L$8Q1>pM!*6#C(l6CU=,tPP4&*.i%=j8pKIM)6H!?i +`2Z,OWkVUkq%.#HojRNXi=CmGgoc]A;0bP^OO_r^gHj8mhbtph\K0QS"/ru@r:tMms0?FH_1< +D>>ZR-_h-Lr)-`&E@PW89E;rpAV*^\B!.5<8`.gR6Yhikaa4M35D +L//;8[D$J.Fh9bLj-$aNZ#HghB-`Qi01iW<,"F)Z/3^4:iQ",Xf9c,l3^R\l3ia +Ml7C788SDY`t8JRY3]A8mFu>EW>H+U]A/*Tf`'Cu;A-EMjNeNL)F5\&mM`/bj0fihL2Xr +A;7]Ad>jTn@+(3Hod1R_QqncA]A7)W(TYG$6IBcM4`f`Jm';nCSJJLji9b1emYK<`%SL7F;"rZoVRVgM*.5h4]Abbn-1:[&UQb:) +9-//#s_3^T.&.mWUIZJ%d]Ane@o]A6,MTQ.*q,+"QZkgoe!$]A19BXE1BPOUgMqCd$.AdM[(Q+d +tUaKu.\8>U1>h&)KQbKoK2N@UG*u3Qm(s9$#JJ!87rG3s+HreE3m044#>LCg_l,HV?I*cZ4g +'\,)#Ei<7M;[CMeDNc+Hi)(ZYC?ILO-[>iFb\5jW+$Lg.eI!!C&`*bb,LScjP3GsjAfIQJZ +Tfg5@-/Fq%WCuN4D!r'dn-%p75GB]A:^KI^#5#qJnIK'%UKGS5h,iBnc9OCikL24&'4.N+_=0EH7=C8_5EQjbrn1Hb&Ve@K5bTPHl@J^XkN\_?aP]A7?VhA1`XT+1L** +6hs^_E_Ukf1kl%G+OWjg1he7/BB"(Im[(r^fl7.`ip3ac01toseTq+4Aj3Z1gqIL2cRUYtor +IW_qQF^Kbp*&=E.<7F.CM@R4Z&6,XDa(.n'+T2-Ur9GB.N5qEZnSfB!]A$9[8sM^A4XTLGGA- +K]ACK,d]AR]Afd*<4uLWh8Ht.U)gJ*cJ*gb>HCB1L?*'3o&DV)fM(LjiG`mb\6ZkDrSa2=E*4O* +t&Rl1uo^,qsr,f5OlBtmd?`Z0Fg0_S_YuQki.4$$kuZ@25O!(8fb3kK0!I+lYZPnXd(psm#? +@^b,T[s8^8KAh19;rI?g`rD*Cjm9B!%9'V(K(ioIBlB9RiqOURB$p:tXpg$X(lpCjC8QS`#3 +W31!K^8F%=6T/0DjCiE\ehNC,aNYmoa[KU9IOM^iK1!]Am"e]A=rs6)ko]AVgY=+ln_?o]ABs,Eq_Qf +q[8I+s7L$RJ,Jc`:@KO5YVbk?^5uTIp,G/qF>Q(#0Jdj@9r5=O/*$(2LYMVuo^&Y]AWEML;]AX +*l@=>QEukAuB3*k^n77gF5N\rLmV=#Bdtb]A_h'p?%MAp\hnU_SF@m?Kbp:IUd1:*a76e)Oc- +J-l#oLRNHA_PH!7*Dgq44:Zm1VO':\oJt?C`HfhmkC/bn0oJNgUf+22Io]AGSmij(MpUJa#&: +/d;r2gB4i1fR49Po;(iFpbH5Ki([S2rc#ma*kbkTm5ILXJOKBPq/h!$CImV#t>,79)pU$);' +kU>s5?\"C[^FS8bGC+]A4kZ'@jJj;fnOE`0uV8nHM;YaN6a6P^HJr +7_sb(873:W^P+H\g=1Uiru?;[/*`b87QPd^3JFc!GA!Pk\cTcK&Pr@3`;#il@Lllk#`p$EEk +8>,\/a(/$uK[r_g+q!G.:5_F=/iNO% +A4M%O$n9k^(a3a8ZjjII=tBkm&$Z/qp8$VUZc%Wt6iJ?Y2G3536$3m]AHUZrl4cgg% +WWi-TCB%q]A=nqS)2i3_fr314KHal$mn[C.b9CnVTD`?P_[[W8$E,B)sm&!WR-]AW6CGdCuWJK +`TjX'W'h?7Ft&l%G82qljf!H\8s)5F*_FLQ6ahRU%KZ'":rM;YjqbeWXV9346.XroA"kSO1f +CK9*aF8&LIcahufjUT'sQrN37fr>-!TqrKW`15=SR[MeqncJqg7Y#o#+0Gnf]AWKC'a[?mpom +l?E:*TEdrUq2B`a%4Vb<[SR+C%o\]AnN,i0*OaX@N8gJgtH)Jgq!!DF([/3;nD[.R!_[OA\oOSjq!8 +5!UWTqkFLubhJ@U>@YTSeV*LS#GZoFV-DQU'OX"LM>IA%pXE':ZkHq"KFT0cZDB0E"?rk&WT +O_XKctEbgbhdD?sR/kj^?@EY3h1\-cHu+#5,U +HK_0u!W^Uo<.mf*@f0C66NAJ4^Zk>K8c]A%+%b5KlRj-MsF,";Z&?_:imRIpmBZ?(ZPUb40Z>@. +PQ\Y3i=*rnT57rVQ%GcMcVSMdO6gJpY2^O[;s^Q]A0X.HS:krQ:6u=*NCTf=rb!OD9!*9_o:A +KieM6o*8#1!4nC]A.4.i:_n;iq65i;2q=)WM/ht">Q4;"eBoBK@-d=f&o):Y''GY8Tik8Ch5N +F]AZZ+Ld\7nW +lr$hF[A9cP5@s1>,;A4RHpV^*L_has2Y>fF+O4Q!hQ>?GR(f@jh)6pH/diIS2<2K0E::&s'E +(P>kmk1rorV; +;>e7iZ/EUrG1k-m7,4'Ti"eV?J7FmRrSf(sYLCGuK=-C]AnH7U.S_]A\r3<\38XB[*4_#CU(l!B*9$i(3ij&[;E$h- +CT*@6ccA!l)0$eSfSY$FYF6"L]AXq+P.iC*VX.oq*Q^)?/dn92)X^%jc5n5-56n#Emh(P:Eq5Hh[b +%Es"K<3tIc+j]A2#9A)F4^h:UJf$PKO$M7oNq*m>@MUL:@rCtQj0-g-'.1S_.uf>D7@[9)G*E +9F)qGHlX8?^ietm0Kd]AHaA/A&.!HHe.K@IfQJPciKpGbGIXSICprh"_YuSs'h&?3l]AmBM(,(%"(JshNS3u#iXdO68#=]Ak0f/ +V8d*Fd+/kn7uo.h:Y$)4r]Asi/g;."!3RTPocf*^@^Gm:-4-kn.buo!96r/RZqsKM\e80%['lFAY5:F).eMD// +l6TW_Wt>nO67fC=#tC5UJ;PP>oRb[p(C;nnlHfZ+W[sjaF>KA27Ek37FtT0?XOK+>]A@=idsN +tM4!:9o +&'=b'oG0;jL>EnEVn6\m':/H*qV"/5$,RokHF01dTroY4#Uuh0C7=\NKm?%QPpl."YEH'=LTSm%K+#a+)XLek>8Sp +_bUAZ"5B'1;q7C@[M4dr77C!nr3<[g:l1[6#IF4aX#*HBGilPY8F#P+mC;ZtT9MI"\8sH&ID +U2]AD\#07$%OYnekF5k.J.Rq4=o+LV"ml1+Zf`,t9"&9*MbE092eMO;VJ=2#iNHV44T"t)H]Am +/hM65(\,YkhhL3D_!K9J[-^g^nsF^qenE"Lf/(b;0F1c%Y.__9;.a\)8;F)@V<9/b,o%b6>i +*uj!.q33h>YF,%]AgiLluC%s*\R#>eJ/55`N/$k"P',K@TZ54"[BD\<5pOXdYe! +n7Y>)0r4bg;R2GdP]AfPs$[`^/rVh^KY[W5jdLIG33U;p=-gY8-*NCRM/QQ!>5=m#%8YkP9HI +;05]Ar[4RL"8+a5fqn4`/l*GFJCG+KH0:$O4r+nF:]AeO)k9;ZF!Q049$Y#6>XD2_9fA>+'Z]Ae +5>W,DJ1R$e=QRpOG2X`-nA[7J1ajgWD#\1]A47arj[(kt;0TNTH&3G;`ONb?XYST,;(`Jc3=, +dK?t2#g:IZWKQ:*-@B:mtk>H-\H<"43 +(Wu^)@^[6P1X""M)k:SAp(>+`l,H*nt!WlEVO#96lbQ$VHXB$uXE/uS&f+.N.m>Ll-b.#.\A +F`NGBK$:GNVUB2S+t^Sd]A7$Xe)Rk"_/ZrX-JTcBjn9&LJ"KHsM^LV88S&IYL6+^X#EetHXfCF_?1,MU(cbBsK]AP]A#+1ZA"3AFjJU4s/V(- +P"EoRGFu1]Aj1%KqqE1]Are&&#h7e`SrC&&8qE++lhsTt]A5%d]ArO3sEH7&0$Isl>9^7\*Ca7;s>G2G^&L`U@s"sU[G)#DA[]A5u%ClsU3&)LQDMF)jc=;,L3.HN"p? +]A*;AI"[2UX1U]A%4Tu#m@rXKN\CqqEM6"d'R"[!S^=W_rb8]Adn3?4Jm$lENO;Y]ASWh]A]AWnJWj +I-Dm*M5ku*.0sL"=%WjQ7m>mTZi\d'p^n"Oe3UVV#?5@?n@=k")UQ;Pi6@dF]ANI7hGYZm+b$ +Zp"#jR8u*![A&MaEB'CYd3ie[`rp_3(q9fUj$aI.O^_&:=?"AbIC[^E28C`qG%oX_Kg0.-EB-/TZ.9@tVDTm`F+T+noI2f +HP[CR&DBm,(Y"An&N9?^f^WtZbNoORqKcg4&_pAS(:a%B]Ae]AgftJicRA8l1O4"ErV^&DFr0. +0L/=/-QIbq*>I.>-!]A=kTIHiNJ:^/.b1ena>X.\u\NNnin,aFu1%-8^^8(Ybc)#j"YhhKH"+ +h4?ZMenFRU*5'hMFU'2qJ.Zbk;fA.p[OWQ3m;QGB[WKc*=%9/m%4?pF;(oOcr9m)Cl'PsVO'Q^_+k8lQpUV`/_g-U/leeh1\s&s`dJC[)k>=qlaR0>+acK)D'PguTdoG +f\db/Z?PWF'SW#(l15W/9%EqWYG-\V[h%-t:cJ-s9msb8BaZoc+@;@GO27PgKY$FSh0$P8C[`Enr9' +:@Vg@\osAS1#X0;9EWjl:39mtK6XbjeHf0[qKha>k^2dVV?Z&&*DCNsY6^Ec*\;fY0D)*H'[ +kng?M7Z)tE=A8>t0/@iI"1"nkDpYF'"7n:`YgQNj,:]A=CU*SsiFn_g\rpWVph_/S:"80+M%-9=[QW*u1hK9p"oe2_)"*OLi^HcOdZ\!6DdKt +B@/k]A-ZuA2A7:V&W3A/P-q$O%;daU.kP7PDXF*qiYVnU8AAmeeuufl:B^c@1,u1_RXFp!^WH +cJ1@)/1]AnK/K@5!d\;kIU.7ooV12sY^ksBZ%%cL*V-pSHfoi16:i^-K;qtY7G1YU_sTV)pnBF/u-Ne:\J@oOK`&0$_LO!\L"cP'D +$Em$lohXL\eiY;_5L-U3`T;oNU5K?>prr1E_!STLSF&b*;(,7"N4EemJi3j8$ +'O#LTQB=U.btQuQ-;m6_>g4 +d+XXBVeH*j+A-A@iJ&G$`!6GMF?M:%:47:Ofnno/Ri_ +HgJ%3cTq)@2$RA`O;(-XPPI-l;ROEL]Ak"Krmpk"F&+gmP0Sc%0c8JnjK&p-o!.,\7I^dJic+ +T?($\ZCN/U.]A\I!:-K%Q#'R<#7U5lAM3^THct>^Q]Ac[PXR8Jlo/$J""L +fel3-B9+`\dP??m=9jBqUIPi-ZM^sV$1o*mD8J<[ko436a^H"WGfkukn?)@p07&0aUF2(\he +'33tk!)^IM+nZrf,)=oM7!4>#tn<)3V$K$'B/A;J]AfkTs>]A;MUhY]A\mQr*s!#_W:p?^X(&n. +1,ij^]Am\Kh'`I$t?S26L0:DKem*8cq\<7B)(O%dTEt]AKK,IsS?rV;<#rYN21n&?DsiH[12N8 +9a3p%73?E%-,Ph?b_N_L/l(Cd30O9[CZ,s,E>T^8T`1O?DA_hHmmpk:4j]AMsON5BI^A/Sf/O +CqL9.DMq=Aq+nrsl=4bDj@Wssl4e1;p9.`q07U@2059'ClhjilX[l5,JZRWf)<\:o#I,0X*( +^[G6X&U2.eS_Af#E8)DbN0VY4t0p.SDf"'Z,ed&&W17d_Y@8%JS8LoQ/jhUkkq4XU2fg^b4e!"M;<'r>*VW&Nb:c2)s7 +g9(H-D,h7PjjM<:\oKE*m*nJmIg52J:.XmZHp4n +%:_)[k\\C49tb24Z]Afh;=)[[]Ac^!9'W@;4Dq!Umk)b",qURX4B*;d[)s2I=O.>_Q4Mf1sl*/"%TeW"E9GH4AV>+qI7t]AI)Fe!q82gRLG +DoT>P[$?D0J1E+rlo&**ItI#fS:,_eW9O@<'lj'bb4j^ma-4#?eFlt';ur3D#n)0#e9Z+>B, +`$hKkU-uMu(M$/L['tP%;TJ`5+[ZW;[]A[92nt#JU:4g<`"N'HOB./r1JqQQEp!-#"fkTmrg3 +DELN?GHlo)#..\(Qbq.Y?3qr4Jr+gKQ%erio4"]A9HAImT*74[#h2\VLT;N3gJ[,RRk.&E`-H +J;iR#)7NJBN_2,FN:7#DL[NZ\fE$skmi;VcsCWU/;b8>2:Dn +VKA!Jm!2f855/>S<,5r,7PqE@IT\L2q;/jq$[t-%!XYLQC\<-+i,03'm.N;-M,e?e*L=Bq7A +p4c9P8XFf4-R?^9o1S'//-b]AHX"h]A!SLSaIfU(.5uX$erM9k3C+a^qokp19b:$J+D>I:R7lp +ZQo4@7!a'ZR5m$!h^g*LFuLZ#S#'qYi;R5KqnqfT"nutTjg(JeaBm2aQ>I.HQ?(qlDKjouqp +^h5ZD"]A"7;[J6mEsX8]A2?5^a*-Ubp1E1K%_k1IHs)gVIeTJL]A?"UnP[@aeotPra+l4>("k?B +,Y#0t?TgR@ZG$P43-&XQ!Z3m<4O+h3re-4?:++UY9T)e*Z]Ank?9ce1Y?R\AJ"UP%:BHZj5t: +HUA=T5ai*-L,n"m&IlB-C;A@/fEk$BT_6)&]ALi#$H*62&12FA>&\IV% +O[4RLW-9%?!);Se;HAU;[C%L9!RaL'1^:>S6&!fX(9.)*k[8VcIb'pth/3m)Vl&`(&%F9POG +3S+"\EdQHR.l+GDg0t)ilM!K\f]A%/<_XLd"%/H5\&+LE2XK$tiTC\QC^$6./,Qin8AIH +4ii@ffEu9DfFjTB)(?VE[Vm,*_>4$!mS,j2N.a!b8*SZ_4\,7u^%)&NCLT=ggqIW*O*1W7NI9_n +ZX#4p_Ac-d?URt-%]A2aVk/PF_I;+1iD(Hb[cNGSM(5?.d";V&+0=D*mSo:b!4aZhnkPt0A_7 +`bjn]Aei8"AQ9o=NQ +/-`]AS'iIW9T,&SX5>\.&C>7GL(U$PcD;Xf1Jq6e67amLFE5oM#rffop'g/Z]A1VDa7f21N_sMWN<)CYq\4GlSV4&D8rnB$$'AMO(je@f1H"# +WoW1-1_aX)lD-AJGX)U.+dR[^7g8X7-6>8%/#H)-KnQ#9?J0t5XdP=8qSL6Khu;-0"o$a0:,@(' +q"Eh>`mR^lEGoDL0KtR)/`tXHNWriZ?9PROr^4%dB4->K`5G1U2"*Sf(@meglQ'(m2&p%,\" +?Jp-Rf*_\DBF)AV#3`?WB_cR8!=Zkpr73Ht.i#3UY%cg]A7JZ:-#AEGTM"FEEa``pD.pRr@)4\`F> +/ZH/G"<[BcNhc#lr]A2-?uAcp$aae-JFY\&^q>/HD"p)WY=u.4H-sn_2MYVb55feGH?a(K-l-&YL=_='iBh@qS2eb2CqmRNAnG:Qr +`J6!+ReN%.i1FMjl;WUdJh-P1pjj'318Y6"Q/mSp-2c2qdO>WY^EtZ:s*V"N6VsJ$I+PW\(B +18T5>%MBLd5`rVVEXWh#71(K@SVD]A"%B;4\O0$EC6\2,ilW#ddE.30f%/pdiH!8l73e +i^1D@6O:u.(%Anj-F\p__Sk"TYYNi%apdYqEkS-=.PFqr7Es]Ak;s<9V=rF>Ss,^&Dc]A3O1$E +#j[CN>d]A2>C"TP+G^P41/)6Y'@eCiD)[=F%\W&qiBqWQCL#J=n2kq\TAaaM4kVkIat+;?$!O +m8Y-V%,`7qY`a,_cHn8$Ip#FaY!XZ8%:k=jZ$Do+!-[9X;HR0tIj15gXaOhX6\bM^BGX')E7 +6s7'G;`['aiijR-%T(T<1U'Q9eIoodYs'>7AF,WqJ^>'COWj\I7omOEem7aDEi4j@fH1MM27Ha[hgn>tkE/B,+D! +8i=q`SoFI#h-]A]A?Y!j`dESFVfkqL,-nNgbs.5]Ahp5;No[bQfNPL6j7t4t+^]An6_t<)D +["L3j)BW`5fQlcoJK7g(EZ"]AV9^`RS%h18YBPU<%mt;G+G:#/M<:TmeEO*/Lt,9+?mNe.=;- +H0)Sa:FZ&BeU0*Ebf)JYY58?-ge6F +@qI.hcUb:3(#CN +Joh=Yt9.0('jn?&UZ$UbATu.8MmXX^^39=A'c#\HB.o4Y9W=l8+,ZK^[&%6B)CQ;EY51pENcXsUP +*\DG=Hi;VNfDbX.q>Rh=jdiZ-bf37gFC90!aC=m2UJO&+gDkNL0KLsR*h!pJ++;t$n*_f&6o +Geoqci/]AFD$$@P!a`d>3*9j0Y"U,a3<@T`i8#lfjt!F/0%bc+)J-?&!\>cjiHlhr7L.FhaKA +,gf_%eAojbtHYRe8CqsG*r[=#`>2GYgN%^/]AZae]A!c8Mm6RPq!>)u<^^9iP&Z +llkW,*)P`om/!f@3-#&0Ul@OmQg=Y9C*c;1aGWN1>*3jr3`_<6Eb$V'pjM,VQ/O1a!3!lUbO +^6**#uG=I^Cc\l=F4TlpVLZf\=',)a7HoF>*MeUN_l3>hqXR#uF9W7U"P*`&3,ii<$q[b/'t>9lKpq\[Z!LegU2'E&0a?P]AC/*AasYV0E`s9OBf'a_@'_nB +f%=-BBM2-VrQOo!/O4$D,+QcE#`#2bqU;n<;*HZgY#2BL*pAqIkmIB.eNGk$\f(-_b.YlAE^ +H>okPgV]AH,8iU?9I*cp\&#_!V_?I=;d$*BdVUtP5IWD2J7TH_JU4=7UAWkF.L>Ok6atA,eomS.l +?N]Ai4*/p`27)/2aQ*/PtE=bMpk]A1O:Whd00!$F-)0ooQ-g@N0dWrUnB0$p/u+CUZBR#/1Y7h +fa7/prba6r;TI3jt\eP:>mTi+U_9MM&"bO*g3CC?P:1nGk)L\?0M/]A"/'7p\*L)';PiPC?c' +eFiW.M=,o'[:D80,GYE).%!2sIrODRZ%`@?&QOi]A^#'#[(cmiZIOu@;\Xu6SN@B&_G'C1K%H +i^LRfd(4+!_En-j"C\/EZTu1db;`O#;]A$7PTHC]A]AD*#reaEPI-]A8fW30!%rosqWW)mQ<-T[3 +(%$..Pk4k2araa.sYKi2RR2BB=uo?;f5FCDS]A^"n.IBKn<_\Z^JXkN)2%]A,XI^bjS78`g5ct +(T0/=8)&dQd\kdSi:P4]A-=/f,mfjteq:1=Q>3:'VGrB`LB<^27\8?-NLO4s7p/HLE'XB[-Vi +ms3CuW*r:I`3Us7b+\%)3U=G#sE)cLj>8=-Dr?[^I7b:CSWK_Z@gQ[_@_!NN:[UMhp$RL>kK(;md?*JQb5m`pZLqU`lh`ggk'l^BmcWClbM +HMEd0aV\X)"+#gZ9WIeU>EOgiB3o2h@D>q*1r1c<\Th9OGZWu0_u?]A=DiL/o(Z<=cNb_;/>T +m2m(umqse&TGc>]A!.Y&@6pXd%A_V#rbF)HbH>j^)4kNk3mKHAfF0i%l72A@Zh`RKZr71'&FL +tP`0;bJ[L#p^rj1tIXO9Yr"ff<@uh5 +.K1,n2^3GkX8u0&C6!*$lV`%;=N7&:1NuSa34HBZhj#6hJ'SBWheg:MRAgh#>*tclfAIVq\e +EJ2.VOo,^1Dj.f@Ch8Rp^ia:7e.f&6.Ec)7 +>F5P2X.1MZgh.6\Y(7VBd-g6(G:!E;;J-&)=8sM6!WcZ+jiX1t/r8[:/m\9/f8WI!o2sLl8) +@VqTul5SplGU))B+@N3pem;(UA2hm;?CuBf?hXL?XO'^UBK^6;^5jc=PgW85-0gGs&mcY`5Qc.$(Iok5Gn!)O%!uBC]AToNl+YO;+u]A-9/,D"_W&DW$6Lg +(1_bpP:t??%A#/cdd!<<\+m]A%b'7)bj!h"'5ciA_S[j3%-b<7W7l!q`GZ.@d!@V=q29Al]AY@ +=Cj%ctEXA.6GNPLc$cM/lt9[[cc/G`qeq]AER&2oN3al`T^ZHqKH,O!0tjeeg`agC+sYg3M0n +V5?8H3B]AJGcd9p`j=TXl5&j(HGES=Gk6&X9[ZsX@.L.)Bf88?!>jCB54u4*-8s1@e9-Pl_aW +%m`e`YDLF\_ac$5RLmnEfN'9MTd\Fk>e^RMOLT9mN-"B$F\IK8kcRDYKe",S3ZNVrV8/(HF, +\E=uW$q'fU8/%QG@HB>LZF/*m5m@Nou9qQ1\,k.+iSF.Zr=&)MA&Z]A3R]At]AkSfKWJ^+q`OgtO +kSNU0=Ic+\M:2V]ACC*f^BcO#NC8K.Dpj17*q8F3/I%i,<,m^D#BE]A#"@=c6A;IWce\I[;tQ4 +A_U$,\2\K<5'%X0fpN[^mXL[1>P'6s%JMg@LV]AD;WAdV62WiFLbJBn8M1r5,bj]A!>jW@]A\PQ +ggQ!?o]A!A2EH<`(+9X+8pXk#+"]Ab6-j*Dlr'a5e +U3=I%7%MUS@N/ZfIVMpj4cTGu+8ROf+;6r"H9PZ[3+eFlj(.j`lc`NY'..O@/8q$tH;0nY?5 +9/2h5I*iM?pk-%q'rat6TfbY#OMQ&0T,r`[d7lgRQsb/ad1%N@:31;)GWp:<#nY\Wf$AQHW? +]A#lcuC#a`q9<39=/%Rqsm"Y:`dR%KW`.K>t>;C8Vo#gWRls8LKpWRU!@i#1.>`jWsPR60j@q +lso(/c3)a:[m@Hr)1HDq.^@'(:oOGX6+,rM>h%d@l(W=TWn"GQ;@4%="aXm@?0)Js==/$.Ye +f'7<7Kt._:K?DL?V`W"O[JlF%RF'k)p*@9j=-Tr?-S"3(tSJ4T@`4DG-PiR7;,;_+"T.Q,Fr +S&X=_&Af^VhFT7b.;Bgb>N`N'Y]AHI5IVirs!bAMtj.ij<$LfBkoHHgoXURB)+.+GtH)034E* +rP0$o]AjreP:R+alaubhCVp/*=tN[VUh_$#57GdG7lP&/_55,ba%NV.23,PMrU$G* +I?lFKU3kS2i;Va"f''/eZ2VP&^HVMU582f]A\\IQZG&DN?8+$M(0<&kh%8OJ<'bfEEqb7RtcPG\R?C>i@8Takqj+X7Y3Ls1+(Jp.?;MeSD^Pi!UbV1%TlGKWU6U='EYBm6P]AEMjlWO9&nQbF)K%qe'aG54H&uEb5#bAOd +!EC$.P(I2;Ki[V?+h\Y+a.,NE5@Kl"JP4uIV))oXf8gMkRdMc.W7pO\56Qf3W-t"d?P?%OEI +\M3bh_Mtq0KBZGk]A27Hdnah_'&;oGJ?:E4<5b06t?1:c5V_iro+;4&k=om#J9t0)3,O"J1LPgR=&:)<@\2Qct-=`abQE&dC"!o: +;?>g3'=H-ntlK\HQ!B]Ag1R9\*ZF)+8aEV=fIinljc:IB9`-J\peUK&oVN#3Z3uK.1Sq36,Mo +dUq1B3edDgGBe+I$0cp'p>&3Shqp!f"X751_s(oc)BDCT6AH0d2\AugpbTAB0*j%%5Gi+u/M +p+r!]Am4_DaR9N)GCFKaPV^ETZup9@l,E%,j61 +/,IN!*(;J55bAAuoAhtHh1A:DtTLRjjPBE_fmeg)426N!4a6)!?'6Nr/mS +F'd['$a6>6T%[1Q"LFocjKmA!,f2m%IF]Ajg#G#.,V!log@GNO3oAM2*r_kY>EP)Q.ti&^P;&4_.mnLF&t';Ve^iYN?p.'E#@.!^e[-!MZ +Xm%MnB24\=%IPd\]AYAS0;LAf5Ob3ZF#>\O$KCnC-o9oLd:[!@7_Vs"o0!^#40E"]A4mFKE2;q +.;HCsEaPRH-flu@B)BPD26E$%+h@Ndr.X$Z8tqimch11gd10O3b)bdoE3^GB73@C^kHo`O+rt!m* +(e$2lKNh24Gk)OSHuH\\gTgce;B)>OC1B"o"per7$gT4hS3]Apr"B>dJRZ9\Cug1g=>3 +Vbf'YLeR,LVN]AF.M[q[/5Q")$dOdd8+&!hmk7BLG?4IYqh*5/rpJ +C1S/9Xu[hn^@nXH`^;TPadjh*WF4YFUTk/.8TIgo-s4L0_Z['#f![[-9VUmM;ogM8Gj:>TeG +5\glJL2a!V[!$KS).Y/U2kJ-5N-7.O<`#bZ(F[e)q56UcC.KjpK^8@HAI6%d`3gth!a32%TJ7S$E +P)JF[IkW[+_5^%h.SdnbS56q94\I<(]A#c2-+LjP7'\F-9uElr=E_,&?X@/4@*#a!sA7@*C.RF/&R"`JK*+k6FK.:ODIlG*bK +G,]A&)4#7_R-L`98NYs&Q@2Zbt99E2B?.1D*M9 +-E.@lOcY!1G++%M$F5)VHOZim9Vi*?^OZ2lM?C_:$66h-#?[P'2oj=FDF#t%&&#FAk06j(Le +ZuG\4a65N/alG;E494ppEOC?etk;;C-Ae?F_+r.Q;&CQj&*uiMl5NIE+*C*AGFPZlA+?Jk1]A +P$BY.9D`",B7^=utaLoa@T^O(F<(T_L*]A_MH//\#.,S33kE^OCWW@Cp\S;IAnS%t6kWM.TCY +,hH6i>n8#!QY-Idb?/"2YcJ)_Fk'Im\BsRsrl>V_U!o(_f/DHOX+PR#GO`.*Zb,jMFj6pUJf +Wp$it_i)4f&:DI'.)YIBPkiH7Xmh)Q0JC(W1Ij..iJO1OtNk;XChR2P)a`67_tm4S(i(&@.b +;",8#J\ONlBRt?Za57r]A/X&%S$Y[0)'d*rb4Ani.KpoO=s/b[.eLJCCKl;f8k5D_M +!=FuK#?]A4:ZX\j3.j,(cjYb=tE>%:de]A4l4:pH+@:L[HX!MaT.Qgl:KQ#S"A;XEcpJ2AMD); +2;q3cVc2(4Ms@G,h8R?[SblE`s# +7\ZkJ$N\]A@3U5n>'^]AhCbW4#J146F18.$6RK(lrusH#Ap\:F,4/r"H?Ru,n +RnNcpKO5o";]AJ4GdC9=_E0MsI#)q@XSB\Uh_/1-P=_!_-aiSrA.[pQlJo(1N1;EVHI2pf#p0 +mMS,SqND2L0mpkK=U[Nq6*#4ns`FY._.(A\7_)cTf;^iu^BM(VXAar634t_^ +H1T'fLg0$NTQO=-XemB-Eg^IKh(BT\6N76,u.RAk>U@6mg'Xh1+k(Z&=pq!$0>%l:Hci]A:`VZ/:UOoa]A0gr:H48$L_]AY*8O(a\N4)j,Q[I +Qoj`'X>p0J1#pM%e%5^5DQ?2Jd=3Tk.5Tp8Z6N*PW*qtVDkINef-NV%fTB5tVo#OhBD\H^5^ +E7mGupqaF;eQNi_87=f(%Q@3EgDFtGDDk;R=4"Kbf$]A<.Qi?o\>[TJ'3O^gDVQdas%B^1gp% +e%2e3uF42>Sr64MT\GCujn8Z9*WTVGZF%)*&0Zk4U_LhE7EVrht"I=$>E0l[P=`K\L.YnG:pbhfjkA1WPE;# +Ese.L%33urUdO)]AXbIi;X/W%oXn`81(SHKC.,TuHR+;o"aAi)[4`+Wh6CCk +M%)^;54>YK9;IYNIe7\+>Q8mDU";Hqb9+''59'$CMmkq)rgHN)`8`,^WWR<_9""AEL?cuSpb +:,nN`NOiG"$T>/.Yu^:fqN(NdPGL<._95:/lAp6EIME+`:/dMnE2G]AJPl+F[OWT_KM[!13_$ +RS"dG_Rn+^A:kR$GKOgS/o:gWT]AnW7)f#Yg/2jtbOW%I?hJM0hhUUPN?4n?XcSqsQtN=.57) +N^9gf'Q;!bh&-VThiT$L$,(nV%-LN%&cIFW(4dmZe3<.p>dJKM448^]ANh.'pVCR"r8[mBs-K +1D,_&d#$Te]ABO,RR+m%-sO+TTZVnhq$lJrTE$aKCLKBnnT\\&DVt7m*CiIsIb4USP(S0Rs[G +otA_Qe\&Z09IpE6m^LGghlhO7p=CrmAr!h7q[R4md:M>9H5>h[c=uNEcc6 +2n+#94A7TuZ+q`Y!R7Qd_tY&U3T:GeP8!"_nU2%2?sH:_ft2d="N;EDCQ"FuBF9PkLb_hp +'(dF10I3)EDA@W[Y<6CjjVFVQUn,lt*+mPOK3o/8IV;<4ee`AGP#r/[kl*K]AT*T4I7a0pLSr +m%0V=(X@),?U10/8g?/8=<2gsbBHDcq3s!mgP+^O*m9"uPs_&SrN3G.JXH&E7")hV- +f$m7fo'C%8B(GbmUQsNtl/)-Npgl/lh[?hARGH-\AF/N[eU4T,kM\o9GJi-kBV\YuL4,T[Cu +!PJiK^sK^uFn(d`LY"akFVelY#NN"37I#M,7T/W';6S]Ar\$Y#GLB@:Qp?`\Yp?\H:q^;9R^>XA6e0GoA8"Kf*jS=S4GjE(joUgsEQ@\^2 +2F%u*k*S9St1PTOYaLg\_PS-DEE37"b@gS)cA2kXg(4#rK8pK1gV9A(-!*k2=MUsg\?k*E!'$'#a$6/@CQ +"^2mSeaW861L^ROJhI,$I3KCaQ$1hQq&Rus,en[@Bu-:=ghJ=J(-b)N-PYs#fL[PmCk?1]A-0 +$SnB25VNi]A>gJaihCYeMb2D`^D$@-0=K@UAmd=ZUY5!M2ro=p&g-ueRm-gZ]AM$"Qr49?1=ui +bIrUj[Qec"qRq63Y)JFgN/)iH!WM*e:_X8H'2GjjAa.icQoUor3[DbQ`"ks>fBG=EK[OS4jF +pc'V?4_oGFf6KKQPUn*JgMg]AhP+Xc[T!`=qbV?_h71Ao\>f]A,+.6iTEua#\>:k!%A-af%16> +I7R>:!,pcUTr"*V!>AZ>&Aau2R]Ap>^,`g,V4W5-e%,MXYJek6BlA.XYCAN<(i*J91Y_4o +0;%Ybc5;LH*U5a]A:Rs["3+d4B9 +hOlUm=eWd]Ap^*dS20;ZG)j]A>)TI8gltale"bm4MIE(2cRoX01b.e[oN%2-0=pq@S[mo0ZR7M,=85-IBR$Sq8F>r +4([[qAT_]ARtR\rm!?a_:+pL?TaP?lY-8CVf,ll([A18&;ZR\lp383iPj2;8`':aaM4-X/K'6 +p)V=g1FSUOt@!)T63(Kh&j;8E2Gl1[c,20t`$agEFF9-s#A$]AErkKOlSEffh9U)2^ljCN\sQ +"]A^kD;B3(qC8@T:pIJFT$40]A&ToaVIGSH'e=7!ttKIHl*cFkH1p":D:(c;j73(sm*h2qEcH; +7#;gn??N;_GSh!Vj&pE_Y0,7J6[%gkoeN\M(&n#`I65jq^q`-"B\P7u7p:B1&%*m\2UC-1!*)-r4`WIGAB@V@EC0K=Y--bWld.E]AkJ]ABprH7V!YEkc0'jmSJ(Ll-/rR6hB5#3/p[Y$ +**KC+TNn`p&%Mf6(:7a;X/oR=#`ZF`*qjt)k?`t%_2dqn#C`aKt6;#Pt'IWsV*+!4U(YGPd. +rN4Mi607m7E3Qr^V<8DQrBMSCs[-_h<.,1[? +W6?Bf("q7r7oY,7Tt*"7NS0(`%B@uW*?b`qZ`.jCnLfKu`/C]A)Ycu.L\*o]AILn>*6La:2^EM +6of24;ae/3h$b7]AEUKWR;?a7A5Q;6'_@uABXY:gR7_Z=0)&FJ8 +FlW.^d$b5kOW\5&RPhY6RHG)7#=ucq.c]A0Rd]ASp +\Ym4XJI6;,r+kg%sc/TJ9]A0lU:#359iIcKtg:$gE\k;prQYfP<1cU +a!/L_rUSA8`q]A%O[BR+oP7"E-G6`sDd1JT`HNnGmkS1=CIYc"C$1g!oZE(c_!?mEP1#uX1XL\t(=h6t*%=-d`a]A3 +0o7eA0l,I6qks;Tt+9J1KKOfF'.(SlDBl6S.LA(9KjT=E#f%X,O-$kHLF`e'?q']A?ZYC\N14 +-/,GKo)02kX]AJc0$8El)6+,5Yk4FnkfG4=&aPJ7_hH79")_%\*:k'FYPfu`g;#uO,OOSmn@E +Df^9A5tU,0K7LnjKUK-f!P+dXQeTPPe-L8*q0g[Ae9b2Z&'l"mV8=!2:f==OoSH:M90Qd4Xl +T3QCg2CX9Z=%`afY)f66./>6.Fd2@4h02Am\1cN_X':?8X72co>)@?TVU9s:X>IPjX"bO>pqMh_,(H)]Ac=H +`I@Bo2q=57;2Q:.NfdOcrd?M[XEsndEE;Kkt6ULt)3Nf@dD[*A,p.;^t6;gS]A`1mMd.A),,7 +>b[f,cd!nJ`7Y;,#fKg>tp-VgIGW#gCLb@$d6MkmIj9G^7PAe-ia5ET0JAh9t.1fnGMM7g2& +&T>jh3Ps4<&'6PBR$d,P'&8G+AFRWt%N?*Bgcm4D)aifX0/?7m/<`D5]A`4Nk[`QTl\(>@9!n +PDs&*rdEoW>WCEOX5md,[?KNp1NAio#8:l/(WSU!__7'_L3LWA[`/NHCPu+EStna>@un>TL6 +e]AA(M$3T'l5"U.ooDPtS,o^\6).slq$,TD!pN,Q.k-@B!uJMJS!drJ%P[n"o +!%[8]AFL-dVt[l"[Q4rY&t=o`@==/(7PX82,TUQoeN;>TTuK/f4V+* +\RMLBLJhPe.'>=1nqW!ZauY;7X+K9TK\NZ7Pq@d140\@3e>fiX>,'S%MJk4G[fMHp(+qYA96^Eh$ATrcU#:cb,*AAX4'kgO6bDXoI +-(S"lg8;e!Y#PbW$L0d$5@+V/-/FD?.[f5V/U'IbEu_[aKd!spJ^mXgSfq)U4$?!EF=\8aam +@J.W7'6^TiD3A=Xa=k1,b0a!6CdtgPrD,Ql4:;@b]At"+IMN\=Kmn:8.\L#;EHE)1$#$C9;:@ +SL6<-iJ%7G>J.7s*h3!>mW_*KcDG>gMYJaDC07mX_LU\:RRbHQ:$go[H6LE6AW,bSB1pnD+e_Qru]A8;o1P8<\FTW_h[_dFY#`/V+GhBjMNgMd'FY;/n_Wq\:ODQDmk4 +(BmqQ&G=hgsuJSIFQ:*#ijU*coj1S8o07,5;]AqXE)YY($%dHtDHrj0&e[)q.Tsm:;qacgHjD +qo/QQ:j@9FFQqW<`/F-E]ACYe`Vk,u?*D:7Q'Mio4HY`Gu8Lf,?#^.!llPJ0h^T[Zd=iT%,"o +!BgP`6Za_./nBKq9G]A[dO]A/@gREi3h!PXQ"jl*7=+jNQr=.V"-P9q:!ZApbc->in_A0E=-XO+l6c<^Bg$"RH42p +N@XA]Ae44NGTcD)"jTK$,=K"_JRF')I_7Jslrd8/Dl91sS^f_^)8\I/S6cV/gUlISZJ)qbKlG +mD?.:Z4jGGg.CX1$5l,XJM$9mUnG6&"k&[!(FV;$]ApYMQBb_$Z8iKjR0toa80C&fDSMAYZ":*Z"B4MB;3a)@4"'qS;*tpC#0^:Be^XouF''pCbE/# +!Otg@qNjic_d3Yd?@Y*AWK]AXm=;U7-(m2:Gk^uQuceT]ACb@\Qm%A\oPUN^S%D(<52UaYj>n? +mRKp9#Xd;cO;',B\N\&iLQKn=Uf`2n`,g]A;B37&BK1Oe!;\?1"SG?0Jq45=R(hQMBNCX3CpB +f"Oo!Lrb-M3=V]ATfG2btP0a=L+obO+-CMl$[PMcP8lmCW/QP"!kqZZu3\+"Vm7H)I%bSfL"# +T%oqZhB%-NqXW%bgQrjtT5BS$3*@5XX\=Hca!*%_#;[ST6dH23kE!'h>>%9,r+,7?@.E!<]AX +S87pQ#UJL0V'aBOHpmMFR=u%(UT9p$ftAroA%gc&5d#@,^pPPKBNsGL$]A.>>DF^rc[M+^GVa +`(?-j"g[Tu;$h!chj25UYDSa"i.D0s)]A[a)Al=H&+SX)mMb0.X_0?r5(UF&r,?O1Y,)eU),1T'`b6C9J(kY\2`1GQ,ln8U#[LYD6LsC +q<%AK[Flb,M*#,ZGCUkNeK +K6tZ;F=<6SNJa@Qn2dON'Q%"X-d%LknJJrI&m\RI@bIfM#6m#Vo`ke:ZMo#uJ'1Ss965XA&B +G#NF*7$/IH]AmE(_t"l>4Ad.)#0oY;PTfq>fksG>bPW-$"87)AmJO-go:1=GD'?#fls-)'N)- +9N<]Adb7Pga">jJVU!rS-ndLGtLZ_;)Y'lu7%0R0E>[a`lj!%7BQ=F$nE;^.bV&YJ,EGs5JK< +FfnY8Q,3dbXd)L6)EHTe%(\65Xs2+V$R?'DC(A+ +[rBuP>Jnq]A=]A$P!:42d30O6iR$H89nb.;ZhFT:s'#&HkK(;6pD;o?sFJ\%8+H7E0oslbU3j:;:dh2&3qDqZPq=QV<73f +d82LWS"X8.<]A`O9s:6;F3C/;UN_P!tu5,rgL*:ESq$P$&%D +#`Dk-5j4MR*4>0-%]AYJ#6u_*'P<[5\(3ZSd4n5Q'ZEs%72_*6u8kD_G\reoQV9m;+>^^M1dd +A:O1pf]AoJB@.E9/qj%,1DGN,-3XG1k2R:GFm,Vi&^/HW&GLd;f`oirN3M([=SJt^XIWp5(Bl +%X8o^5f>Q%_^&aS)-!-?;*:e:N%JR(9qGQV4l%:EKde^X]A&n%`,Gh)*Fkh1>$KLhWrC9c$9j +XM5,&0iHMs\L;tO^J#]Aa2i=)t"Vug5cYObh?"376)kC*+nK2^f'm5m1#MB[6.5c-'+J]A)M,cU9cY2(i/kH$@p.AmZo3U&lrK71Jn +R;&;)j-BXPBqi2H83P*uO#/,D8Z2H0PamIO6GOJ"o(LF]A]A2?0<9!Bo9J)rE52Fr? +Z"Z1gGuGY/l.ug9oM=3EbFIpdH'fnlY#7%5@N3QrfX342c4K\[N$>foM,IpNJs9)]A.U`BRAQA[<+NR\@k$_I(D9qH1/)Xb/@<> +.)%Ic.A]A9)bm1@q\9,6eo^$"#F)g=#(O,oPK[?(LbW`>_Ul +?VF!L4#pLTkZ!S=Ue\fH*bF44G6MD*Z<1-aBRPF><^'eMsB+`BejW]An$qOTTp3W&9:&18e*^ +X%m]AkT#2Pnb73ieIk.BeU!7g]AXWs&5$q2N`tQ--c%*W[BO'7*/2UAtY)pIj;8`hi&s?FB-^l +tthJi-4%TG6Zf+GKoG5J":IlY_2WYO4`374&fFWDm"E.2RVe^Fce:*iIKIZWBu_L1fXN,+si +CNO1N\QW,hcs8J,8!^M0W=+C6BV9U#@..U>4r!ue0he4M&+LkcEYa*[N55L<5<2CBQ,_QEI* +Ss"*f`i?C;n_t,'5VX9.@$Es"KHuL;,ak'p5BiFW&#`Cd<15:"i^!P>pLC71K9M$>H*,]Abj( +k]An8r%\"=:[rU?n,TOp82_eGj>E)rjZ%LAf4Lg'Vi[KM/f%kQ>k((Oj+dGS]A*gL, +/$"Go(p2NlN[Wk,AT)JalDI-8o/jNe#Hq'LPEJ%Tqh3kNI'M7[`kCq7k_U:Rae8O@]A.$kCm- +ka>=tM-7/+-)l"D;j]A^YdslC3RpD]AU0*V`3Hr4.`(sSf$=VR@&L'W.)*haF3?s^HDP>n*7@[ +?F1-I^O5RI?7X]AeH>=%s+qFc`;o4SDADI +?ga=+`3]A>K;!0u7ui!ZhP_KSbP'D<@o2q_c<@n`X4'[J2&]Af@!lf_b'\ZF@g7_iEJCliPV4[ +f;&%(A#G*o2HN,UQlmnW9"SDZ/5ZSds32#C1DlB@c>YMW+=JUm1iEM.7B8O?d;"^6cd$-,eUTLu"FK``+7,!Pu;("2EGC\*aEU;jVV,'j.k@NZ/:I:/,L +D"_6S^b4ZW(6P4qL+Pc5B(oL,DE(1k>#F.R*%/$VcR62_Js]A6F8YI7:+SeZq/4`@YH5lrW[V +782mu0[LM4S[3M.42m$:^L\$SqCqY7G2 +#2%JftG8jlHJ:lFsgWE2J0#K?&S'?G'2rlPAY>(NZ@Mc'B/XfY9)>U,l__#LZT@\u'V+[&R90VL +llGO?/PP2[+.Gh\P:h:6h6eQdXa]AAK,]A#9kV=S9/@V`_a#KBTY5:%s/O$H$&:&omDV.03D+: +e6l?-XS^aFcMID1<696KfdULrTqPpY!4&[M!VLbU8GuAjP=7(&/Y-NrP<:-WZInHMC7nqJ0q +/&Q^l:sT8+G;0e_sK(72r\-ap(E0m.\)F,9A`a5Cica?FS:p7ak@K$;a'a9LEssh0=$j_/@Y +3.J;oBs(f]A(CZIqIWg_UF)8#pfg8i9INQ%HNf,!/:92jfgZ'hM6C8'I,1/nSKfA\._bL?!Vm +ESH'BQl6J4u2bhNQcp#f^7VR+h6"$c=Z&?@12=E-@0JI74B7b.">RF#'A&-GKVshO1dMU(bZ +nHLKEV]A-:_^?gg>R0Curd0NMk[HqY1TgEm?k\OAEW9rn&F,+a7Wd"B.;r(:r%>\u?J,_1PE8 +!OTrp/cMad`,Qhm)G1!H)Fm&>*c:t6L\q8J@iWN=`-6!.+X64iH1caJH*$6BM(0/eZM%kb=;jabQ;diq%uG<0R;BXBlOAL=M4V&)*N4^[!9PCc6gN6+"S\k1g2W7 +JR9?Fd7rC`X9inqsU[Cp]AJCNfU&]A@-.<'+7l)./+b0\4u/_O)ZbW:R)BPN>M+uV=.;&fVtKC$>,NAG5YJX%9*,oUATm(!!_O;#YpO(TPJAkHh8m$`G8C$^B$m=b`S +I:/JnEN,(%P^G3F"K%_-cijnHCqi-,9oY'TU,1hJ=eNe$lr$.2FqP-h'%!Oo8Nn_0,k5'E$Q +LO#e#G95:6(#:N\YNX5%LSSc$A5VC8R\;93KL"b1Y(bjlt!:0VN6>,9ODQ^@8VXp;Z"6%6`F +;*LV0Ie^Cf$Qa,T'ilpr:fZ^+/*\f9J[38%RjA`FSm1kZ@>PsRFD? +iNB1G9O[ZS_,MReuH1)S=T"bBB%lR/mZe93YrPf,.1)m^:UU,nT&REQ$r@/r9/6BW`.'1,pN +4bUUeX7]AslnIK/>#QuHhoF8a0$2SR7BWPhJD\UXZA_ddm0n:M9J+J*tkC^ +Ig]AfP29No:dQp[+<:;+$i\(9eT6=$m& +'$=6d:ECMQTf4oEfd+U8U_H:ViT!&P\0s=!PEmAF9C,1hK&DRR'lD,i^fm\O_'836S +c7+rM1'!3+"FVm^n+Z`fDq52V8NMm3^Nj6hesDijC9^BDl$Xc4rT:1FY9r!K:pd7U;T><`UW +JqJg3R.i=%GIOonRU\rcR>QURB^E_`;7pPe7a#:-8bGUrZ?U^6c#<'T`t0kgE+;VbA4^_D1h +=3)CZ'J!t(oUj$?$I<+8*06kLR"X$J +qFE30Rk7&C+tr"/fniR1KJ*LM5Y=!S<[%V1'Alk1]A$nuGj/&Y$!5_tFN%Q4``>10HeScQh@b +.&+Lm8L(f:/U06f4.sMD2mD6$A]A&n6fBtM_kVap'k;*>(b9&HD']AS*TCRb8^&'s/!5@^a9f\>3i@9s4Qe34PJuORA&gI@TIu&U';Z$Bfp! +81Nmg@YT/Be^Hu1caC@Qnn19MdWOTmQIP>kE$FhH3B:P*fd+N$Qs8-6tTZ]AReKfE]AiJf9j$^ +oZFL#ahsPs@Jjh-?X;(6)8@=hpY%J93a!RF+Fe1X]AGkf8+lUP%0==no&4ul/NY*AZ=0 +11(J0CM('j)9CF/Ak:U(TJGN\?PaG;;QI/e]AfBq"*c3KaEg/k=CU_"6<-T"2GmoP,of6JaRl]AG*' +)[I>Z(/O[HL5!A@7Z_YT?r3B +p>o0D-@f=6T&joDZ"hS?p3"b5#*-,UCk/UMBW^\imMYp%g"b]A(GhbBPDMWook.QrGc?>D/s- +3J*cRAl#(V6p"t5oO0)mRik/DFA6ursC3b=5G<%)WBl^]A@cAPP"9#E-jCU+X>TdVQlQZ&DjN +<(Ub'c]AWVTm'+q[fgn>#Fm=N$-Eo;$)<1Gn3Q1tsN1e';V'.!Dg3:d'i9!cSUkIHkmHW +iNK"Z9Ya:EZ@6:*!Z#J^[[@H.*'Pt9ZKEMVM&rK6e/)k4-US%,dq#Z0mYT`Au2or(\0mt1upusL1(ih!T +U^6VM)Bmng$rDpuiq3G=j^cT;Y(k2?sb+5\4oLWb(iWE4-t4ck$kT'b1HHQu8UV8rL\`28nS +!Ps!AB]A7Y,\nY?I(4o[Zif:TlKr'3%*'OD(>U9;BRj3CP[;74Z0@IjRmUqDJ_XGaH;e@sKVS +!X8M*1hYk0-''(5Z/lFo4h_QF4CJr`[TXo><=f<5b>P)8:iYeOt)2c`\^Cabt$g=^#.Hj#A' +=hMt#M2^iQti/KK<>0>BSsna\ecZoL:VpuYG&J$$Am55*7YAfc>H0KBc6T@b-4T&*Ra7#ss< +He4NV/pc#bj:-(_D9lf,R<1PV8H"#7NsbGN[0:iE(ch([h:qiP0ke/I8R2pbi9$*[Z:-RFub'&DtK^kl)iBs4Pf+?1tZ(_bJUp+#>c;FtB%'(lpg=`SeQ`@:$arZiTgLfVckEfGn'_0c$)mK4s" +gnri3"9`]AMc8l7H!%BgaU8*IC'RkkoqGo):'AViPWTDVM)_DbH%pIHKbmu/G(=_Zf +C;ol5_d\PhO0jdO]A"=f2&]A=bMYlm0P,QW?0W.17@3p3oEGHh%,gTJNM[dY&+ +u1c^GPT3VU-\4(6rU623Z_r,qpEr^qu?ZA(>M +"=qWdCEiOSL*r:n\3W!2qNnP2!T=3ni)Q#o2'D`.ZZh-;kkKC(V,p"Zac^ZJ;(UYuao*Muc_ +9JR5@4XfJ+og5CC4PlTV]A.s;b&_gM-IQI/ogVWJU-%)pO54nWF5HV\LdRf3G\DR7o&'l^k=f +.]A^^OGl9fY6VO1^I"MRk$knj_CX>5,061YP,pqboHSS*[_TC@Gm"#jYkYVq%jLj!F#O(bP+c16LBrjL)N?uILtO3*?4J*/r;uBI:@:hrA=jPIFo`b1,X[]AJ=eqg7 +<=-b/lsBKCle#;D_c*%N9DC,AMChN,7ont-"7iCNnV?,do;Eo7#=SYW&D_G:\3lT28s&$>qA +4+X+3!ANuAh"DL9]A[Pa-"O?8YEr*PS4.TGg@-`FU;%5`YR'K5.cV[X3R.E$_3urf(M@s%*6X +%jf.j&>8/\?(8tO'e3=T\/hRK9Q)/#FZBM6X"s)c%:p9q]A0j81WJ#$:n96alVGX3uR5gH;*_ +VbB[2,^qnBG)>=r.:\34tl$#Q(Qg;hj*6=RhP-hS)I^(ZGHgJXJ80q_TTkc8P1?)71#6U9)) +SD/JGXU-a0/)g,rl/*c+d27d?0c[#KOibWsd1`0]A5BsgUU#J^8gr80\$RN+LtRX"JH^G!?Ig +rVr;A#ChEcZU[k6aL8a,;18lZgDkESdMmKWT`SAbX-^5p7+Z;(W\@`rCH$`4^QjCFh6O4e60/;NJd+V))b7/rnseW'7qEP]AR`heJ(2JV-#a7)L&;4L(?=nPJ/ +9=Y7g,?>=ba5:2S6KP(IBljn\11*\.G9dF218-g;!Dl:YR"^",dIlo"ca:LjDr#.sK9PZ[d( +I[In)T["UU]AK4k=EVJh.d$S!!iBAl_?0,Tq%/$I&h&&^@0Ki7UmP.s;^Y_>[pF3CI1_#^mRY +,2kYcM%fTfIGCtQ6BiqYj;JQ,CH#$f8d0]AMX7BM^0hn5"3>TDl=ul +mjB-O=+LHC4ud%A;I3tdBW,qa)QK;q-g +)bV/:6('==gslZ>>rmQ7=.$)DnCWJD0aQ37&mHFbuKUgs0=@i2f^,l(g,HM(5sL.h'?6O+(ic'.JD.RQWm$@T8 +n#ZLqJ:<%jRk)U42CS,iD;IHD_.8F@ID8["/@KOVk%dh0hQH&I`TfiXRq6KJ5a$WJJ +Xl$1"2FHRR!JQK0N8:46`Qh4QZB;XERU4?"8;FO/#ICPP+&"qXZ_R)Lh8qhAc2)[&)!K\+3\ +sK&_]Ai*P!<,Nm.1S%'9V*lOcn6XYA:SUlP8":mP4i>(p8eRK$g9g;oUeJF%Y>HqD7cRd`q98J +/*(in(fn0E1=lZM)M4.*j/ou!bG]ADh&%4=/9<\D'[#a)oDBh*f;6i\f(d_BY +_q:,-jh:5.C#F/\ZL+jIlP"Ub(jcr_/U*[,>#0RqiVc"=D2%/i/obC\bX\.s'TDe52-P+Kt2 +C#9_@s:+0Xj:&YG4GlBdB3)Dl*8D17WNYJFEt0`4Y>j7eTs!A$\sq$q,/tT8&A)iqa_p")Dd)aR^ZT1%gJ]AP1`F-`X_!V/*NmBXZ)!6gg5_B!iBC%XVYh +J]AZP'!DkIV61H!NjJVsYBN"]A&.1g7B<&0II!S#QC:OuAkg=Ct5jJO_%,M,c+n4/H&NkTQj/G +,KGsKQ8X.9-dCmQ"iUKBq4#3>M:HhM(K:tQn<'*,P0MjQf9n^n(8ULBUT]A\a+"q&BQ-)6P"V +RI[hNX/^ig`)?@,YpU%.4!d\nlAn*KYs*4uRlY)*D96+8%N6WNIBf)@[bC+2=&Pp!KO]AH==& +1Fm;KeeP:Yp9l3%GRT2...#)->kR`+\FYo!i=?!q%Uq*p+ZcYs>"]Ahlr6`/1h):9%A]Af.G1/ +\LlEb>=J"A!\`_+LZ+aE*>b)&P10a(8:8;)fI.P0M:L6.t*j)UU5Fd#k:%`2#EH4kb*JE!F% +Mi]Ac7UEJtpPp$/d\iS:=t6(+5)nopS(YfLD(=4J+_._6R0gId5\Y#q-h.8]AKFGj4\D#T/8.86,# +(3.EBBdufEdNpkFo&P=IT=jIL%-q6amj0ert<6`roJ(''6''?2faiM/0L(MHlAo5,ln<*Unt +%L$!`[jnJ$h',&MErY43f`l80deK[^..o\,O/W=Gfa;J&"P]A[e@:DlV!R7TosH3hKJ&#m3Ch +]A@6D/Ot]Am5pj0;@'Fecbds[MBDi_-P(F<\A_O^e:Gtju"rm>$u2AA\QE(YHT?KsPt/5!qo-A +(j7+GdBNi)W1+a2qBR.hXA0HH'hP`1W9a-oZ7&&:J"AJnBu?0,giVq:(^CE:DjpHn)\3g:=1 +i1f=j6qs2bqgW&4+aPDodhn=t":*s$YpSLG*Rqn;QajQ);dA5RS;cljUH>UL;RpBi4 +^0D6"&%oWm]A=#?/@_HJ +SCPHs62K.S'.$uN5G`'QT^B_u!dCk!#_%XK-;qL&Xkp*Sb(sjBTNZk5!(+<`fiLq)&X*0ZV_ +c@^ae3=JFsp!e_il#:;[n;!$Cj]Ag92;V&Sto;hU89(P4@rI#"8*+'O2>;D$lB`m`4_M/TA$, +`j)s53>ZIDYL&q0"-fN4K.*m[KPqA&%mb5JRHi%eaED3pU!\X9[a5JdnKuL<\',.iNC69&l= +KBlf@Z6UV.b.s]Abag^Nd]AM6!! +)tHs)-5CMVGXHtSBm&X%ctd$LJ]A=[-U9]ABDej*5e`>#[Eq_G!S\Cg\e.iS'HH2C4]AU,/aql? +.`+6d&c8]AA8U>%:G\-DeD/k!bALkF +.3AHa)mF_:d[:CU+WAQ8U\'6I(c=\]A<_h/@I%6#(f._*OYTh71\!PR0lW)6/4_tF>i.l*MhW +=ZU#.jg97kD*EIN"4rFp?RQS20N45mhLnle!kDOO1lM1oT-%srq=s9s'r1$Z_t5Q8IU#g04- +0()o^6.=)0mcC)2\lB%;u)%96U@6%8*F4rup,fYmb'!$Yg&U^#p@J;/BJ9VV)in=q#"!CcHJ +,)Gkd.25VG[J)K;a+B'd/YP7Y%g1iM9\u[F$"_IUr.4e0q6>HA_g-gaANrZ*TT(`]ATh:+AX_ +X"gUD$>bT`Y_7D[#9-]As%l.&pC/7cC.VbPOtASWuke;SW0TaRV"s5(p!3V`*&Sp)1/LJKPB> +Cn,eoOXstb?_o#sMWKI1/HE/,?f`e@:YgS?Eb+EPZe.D77+sN5(1$f\&;!h,Mq[ITP9? +`MaIFcO!:td[hG,aG1>G7L1U3V$,hQYq0g0Erc)M[&9r9EI==3m2)Ie3!a-\2?Z_8cKL88*9 +,]A!^BTX$p'$O6=QD=(aS]A@OW*G(8FqiL>%g@C=Z_"nk-H7]ApfoQ/I-n)pY5%g:(JQ-UVPI1I +VIX[[6uJZ3]AekLFIK2Y;)W]AA[(.m\imHW\eC!iW629bDqP"P)7h58@?dIX0Ep_gea"JJrqpY +"MNY#DHBhGgmX"%Vq:;mSok7'&'##^1Y3E-WDC#J.4V +(("\PJeZk8/h[Ot!7Z*,VoWLc[]AhsG6dtOr[iY^_!%oCHK>Q,]A]A03GqM&@rihjm^B:G-os>$ +?nd8q+'rnB(d#6<(Ou>,ioHQ%fehVoD.Xcb_"$N:sRrXs,]AR8;+?g/e8 +BH+LPba&6Y8mq2EY65N%:7rBNR:?!N(YQc*>I(kfWN*1'[sFp]AV2dPRKhK8Or'D`@ZYF!7JW +55H?29lb=EOICYZC?GW,=WCa\/%@%6D%.(s/FK^U5:8gc1"aSc,rDhkBJ-cL:A?R_+Q/^)k; +D+U!jYaSTL^g+J?1'!Fb\)sWAnnGSOD7elckQEbe$gupOnn0='SkRu9o^0-f[IENhj)hb/b]A +_^JaQD41q!c,lf[8K!G]AViDOfao.q0Y//N*TcE]AhCAb\U#]A+b,;6SZn[/4o:pna-65`+_NDo +*2B0%;'oRfH;qYtHPrZ"t;YILnGF""+h<@o0JbFF?3q;S9pp7ToPMPfg>(1>Voq24pr%EPEo +C7=#FW7?Ge*-/if7qWcNMh;"8q^9GPY\g[n?4Qqdi]Aqp5_u%OINEri!l.s8(qLj&)?-I +g:N4`B0)%>s%7LLkp?X&@4RmY1e>^0VIHO]A`!p#\MZ(9."fPu><)QH-$oVc;X4cl2u37UZnF +7%#\R64($XBo(q#*jBk;g06_Pu%9"8d1*GI>/U#,PdM'\"ko>abLe4hO\%+,/0c);uH%ob*! +sI[Os262Z"QPlEUi6c:n-JLbV#r5R"0KkfVo07CcQ]AIf51sSA'CIqNHE`*.(jNhG1/tL?GI9hS)PKD-rR7Q.,]AnTk +>`gZ^p\c3?Mrl/5reV/s]A4cCW1D%;R#qFTpD_/W447]AjF0AlYSkMb%Mr9!2997f:5g +JD`mT$^@DdO7a4>A!u_]Aj2#'1Z^sL(8F*6$>5AA+oi,":^;`"/U"R@qe.>o@*?p>;j!415E? +:%f-Ag]A1j,Lacc"?n6MbXVrJarPg9d(H#0[ +MaIh=2NP\D]A1lm\2=[6*(f8MNQgY_#7.MR]Ad.,))BR? +.H,LI90Y_jRp39?5r]A:LJl,%>ST5r[1UmGNu;Yp7VbJh@NO4>>nV?Q$TbQdoXlH:UGu&_afU +f,u[9]A)4eq9h5`Z?QhR=T0*a+qFuXGPO4<&_IE6a\H0m73753PpgM@`Bc2<6pDlA!43?>#IY +1@emTr_$<:hPq>l*WPt!ZHa;IOgd./dA+&?MPrGSD]Ala +_@VCap/1Fh6u"b@%jKmg&TF>1J("oOr_!*n`4.A"f[j<\7V$LFoejRp#VlF/(DOLL1s3:[W( +kXt:\I9lJ@lCW0)L`uDpGrQh=PT+u!/hgYDLgOnlK=`>Inqp9;n"o!BhkY#/]ACKL0u^"n5%N +\*NCWcA/LhBP?D$r+Zr/#fmTK`^]AR8Pr9tOd_pD5:W,F\3Ns$]As_6sPYmmS"*N5sVAGZ1L+P +iQ*Jat`kj[QD,SReA1/5giHt&/_gE!]AR4J\4[V*c]A^Uu"@aIiM<>S-28uH2\9NiV*:LgKBbO +58>`k2Ne(%qpK]A[6]AW^f%B)4$b"5nPa3]A,5un=,I,o+FWEO9f"$M90qaE +B[Q9-=$jeMe"AL/;Q^%8:sT<0]AihZ%EY_-`8#7uh6=AN!RM(;&UhPP)o.l1*-km,?*GmAK>@ +2AXuNaF;epf*eQOoXL%,CbIH;@mP)&14m5UOT""GVY@niSHp0b?C@Fe'^S2q/(nl&Z<&JCRe +:bH[b#5[69EAKmp94;[o[$_,IP8ug6g4QY([\4-GK=eq>M0LpV460cQCd\**?$u`]A'?:KUc:q6KPPH) +g1c=6bT(MU4]AR>U4[91AA9KeU`HqZaS'NO'O@k'C$ORbA790.I#3JPU)"*j>Z^H4EOY/SMhp'+@s#2um+ua&G/fOu&\Zl"2_-CrarJp(OG +g)\QN+K>]AID30\kCems#+M[aq=6WKVAr1_JHA'dC)/6pe_OlG +hWCp<<=%b5C8gX&A`VWgLr"CnE7SYJ,FtnEB2Tnl0l/g!g!!?+hc_;%(G%h0W+8/k +mQabmZD:Ju:*R4]Ald*nlUqmU94pMq.?]A@1#DB4?_jA^:CSHT +ql#n,1:,]A9nh6#R>BTT!M?n1m&1R*>id5a-dkeJK+\henq-*401@BUDP8Z>8VQdoaa,L+uIq0??S0=)aYg#a6US=/Z1/4>:("#plt8JLBV=nc^5AG8:OH`ZU3\ah4WW:e%W +"6/mC:bUCCQsr57(6JY4-V(V9Q1WYM9a=D_3YBua?WAB*gt4GW\f.M%3A^19$ +n":7d$dL%WEU`F-W/-853Tp?>.DaW(Y&5"E8]Ac=3H8(TuFm0'a`=7)bO;V4%/XroU0:49s1S +)=R?t]A#!?)&hM[\\gi:;E7*!;["'W%g)%#_Tg3ZQb^7gNnk!NbT*(B?_5.O62oTQgd)#$qsk6 +Z@`P"a"c-596V9Qj;=J>cC.aY`j3)qbFVZor3@=,ubBX_4*1OLpJg#j>#BC[`#=9h:lE=tC;e+g8JjLa_n2`k+1!eur55AY +9K+[KQLt&hM.+OCtMtWrB6`-pSEZTrNNBrf1gCD!J^6>1\rKmlf%/*,@S&C[hG9V6=U,RQEl +1RS`ZhOMS'c;]A?8cL@=V!%FoJQG>^/WF#Ym[3o'%+g5S>.pYcA=\Z,2Ip5@8s,JGq^BibX') +k1>)]A5uH3PJa_#r+L@nIq:6P\sn^%=\)3)%P>2g6\hL_pi(N;XH9uk(GFOO,223]Abo[\UMn/ +WQr`\B%rOeG!R!NVc4at%E8F36!HPYq:q,mK$o5K/)q.O\/e,T:C=Xu`oV;j8GrB4BI]A+*9j-[++/f8YrN06t6'MLO\Sc=&adE(W8jbUqdDDZ +Ql0WZ:drBP"PCr$nBrdVWm+3bdAoTH?2(++)rY'IuW`4[E=1DIA3G<>-o +o.<.haB&'$.Z?8mI*s2@`&lZ`:KEd&sZD%-fJbFj`^&<:aRE*rP9:n`R<]Au8lE[$?Th<#KNL ++30"@f4j5%M9bl*XjU1g!+EoKK-d:@\KiehZEC4g0&p%FS)W:Bd3c[PD%g@S-BTfP2V)bMWs +;X0T$KnNPZRcp&KDK!>#Ii`?N[!$kPkI6je:[1tR[-pnM;%#cC#&/EL7\h[@*t^q;:DXeS/9 +kf7jAHm#oNhB:]A"5C;.Bgq+6+0S/kbuWhW+Z#cQ&Z$e;WJ(cgSZk!6!.o)[Y?WtiQX/hgGfout +b`=q;*%Q2ZD[la!h0sNq6WIAp'bJ0AoSt25WtL)(W+mlFHE3!F`75f'Pu7^MLHqPD5Z!E3Ft9uPR-HT2I.(&1\M#Sq[%!<*:"UU +(.C/Km^o>:[YI[jYiQ1o27i$2qo41G[-m^pUsrYMPu,bTnN:feVV0a:DP-3p6<#^\[cCB:gFb`u +]Aa$YD^`q8!g)NCJ.a^GVp7#>$5)L+.doZChnL*=\:P$l"2f:$6Nki-eZjDA8Al@MMJXl%E3O +/m'/*b#(h270XtJj/5n4"ZEXK>mcF)_nb-40J%:jQ>@^O#m[P(+Hh.n4e*l#4E+XSE[C]AItT +.Gu7N,1(8en-!%j`adgSau(jqn#^kRKJSecJU"!ojV4hm^D*1KrM;&.mZmW5-9g_pD^Zjo%1:WfmELS4 +Z5F2Wm,(@-gAg.X^]A@%aQM?AU!P5Q!e_Z]Af`^)sOH'7J2*(V>"&d4PX4,p#,ZpiTmg3s=P1m +OQOft"+f..opoC>53e`?X]Ak"U+D6BVZ1mo0R05Em%jfb.ipmO<&3=4@Um:af +iQf:#VR"U1q[hO2ei"CC=;CKZ#8X`LdX.Il<6h1>4's2l*%h*+_8Pb^mK?SkCiT("!($F8Qk +QH_>UHUB9=2c0Q&j%HMS+O0Fq?+\i'RBmj=b;@;//1G-b-N3\Y+A7]A,d]A/V;q(CbFtu^Fgb;qf"+ +l)C<_@BKmQ2TNUn9cYZ<%a/rt/o2&]Atg#%=p92!"1&6JqjFE+,eJZ#g!Roo2tp6_ +Ou7MZ-m/2`2^9\g=73GN`-jmDCo3"Hg7)lpkPtpOG_[;t(PeE$:VK +UL";"Q#BC:7?s?@X`.NNH0^%cKD4o%J;?L>I+`Z9bQ1EhP)dk1)4cA/*@CD?k\qb3/6Zq#Bt>J>C+XQ/GiL6sSH$lWY[[B(PG;Y$WT%3I,sV,+Q.ajYD +jCZjMX(gS#)enJa>VqW^H0;9DDogJR9QTCS+q"D23\3A`k9Y\+;Dne!9(:8gV_c'?;S6`NYb +u28QVWN>-Dj9PK>gm`+Y'"k'1st1obn1/U`?on!Ia4\>;#N![&P=%22$FHA_=H1H:@J728cF +1BboS`aFCWtFBnqj8j10^G2"V391;5,GFj'*d1$0jW3N@,?amD(ZPCsR[W;mJJXg3p6)ZWf]A +Wt=h.Fl)K`6)8S-Y2ZL\9eEaO?7*">Oen%)&OR+0/.R[ri[D+3kgenCW"r/j0$'%K>q(5_(l +a^AQ'a%*2&Ak@JWbol9^ubuO,,;a;UjU#@k!s%h\4H[-M@fN&?.eg`gY^aU2"W=]AO,+-FoWu +,O5+WQ^lec]A37gld&.YN>LjEpd^'bt+)#m>*\G,ZaY$*K/RKeKo35JMc@qE-AEr`_o>KEkd@ +dWl'K%+Qm!iY'YdZ:(e0-+G7&?.IH[i]Al"Xkd;L^\]AQ*]AV?1,Hd0]A2Z9iB8'dluKM8eaB9Bo +$*$XP8aLW..$<'a4CO/)ii=aa\2QO,2_-fEWsbHhBJ0t,#?S$?(p6K6PID1H2-l"Ksq[QccX +4P1,(#AVAaIe$9]Ap[?W*QJ[/akM:?cc9hE!C,*H-ZnV>7F1g>NLA&YpClZ6reFI7+N!8rdjC +EaU-#pM#b=3+7Rt^W/a&9)3p+>#F"nu>Za3c+K@h&(IlM5HD=ic9&Z(oKGp1Rr"G-GkH4aaJ +2bChCNrL"JrAtFLa2=\8K%NB"e*.G:O3L\W-S+u94jQuBUK25g'qQC[imFk]A^Is:?Y[8jQk? +K`:rFtPC/JN-liJpXcR/Hp<;/eH?i\kjpO/eEVfJ`Lb,J_*7siig:"fkGf'PO?Q+aLGW<`"@ +Dnam4h_AZ%Eu#A'P8,=9hUTQPd>TS1qZ(@GR=MnfS)j?jY^27X(Li&TAe'\*<).HssjG1a(M +BPWQe0l.^sH1BX"NtIRZKO:uM!b,r3Yef@[l7ulS)PeQ.ELc;3ql"oM(Q(ar-XkA/%SA8kQ+ +n3lf5W2e\q#kM(%,e=H@RoHg$=dSD+^jI[q\7pp<+gTib82/bUXui%(nK\VH);3eBV&Lk;,F +^G^7a4@U("3N-^,$1,(.5PI,W6:(I+,<=-YWRO,cqD!omnQP^Ll*0d,$>)m)32?GQ +j[qd^/qQ"q2iCFUI(+nVE(;>R22V9ED +&BMk\f^kHJDLop4pT)QeQA5pbF"lq77Pbp:kAY1gia+oLiI?PXtX43=80s7,FMdWBAJC&,^]A +$gr`4l.537@;gFFZ6f8lL +!\2[[;sh1U3FUEq3bm_YRi=e1.B"C>"fYl/gm%mF4uhIQ75qiV(bl.imq4.]A3['?[_^ueD*U +YmCc:[pkLIlkIP[P*PV-U[*LS+34>[ +%9B(PH'l4Vqe)>*/$,e7Z'Id9%o5QU`t=CDV>818;[C@cu;*<9h$,3O%Uou#CX"2B+>2#M$u +ui'J9PO!?b]A#dK<9sTX5#X*N5S3CPbA'=%?5J?T_ma5!H3[&OsO1V:FC2BmF]A1GSf5]AL\nYlV*)kmUg3d:l"7f +-IA$Il0hfac9@d2T^CA6ZA!O5`u^\NUE,RJZC#lOL+OJ\r\skf6>6G_I8drCA-`[J,5eX:EJ +ZMB>4BD01rilkE3['_G"K_rbu^'ICcaL4g[->TQn+p)l=]AMM+H,%A`keh+jc'/*NeKMI-5+'GC]A38acZ?m76*V67u2$1=5lVt^W61j%7i!UN]Au<\=oX;-5ThN-uJPOIB]Af21MF4?i04GB:ul8,.1C:]Arj;P?S4Hu'IoR^ +M!o*^FJ).(ABW.]AC(.dWO6Z.b)D2bANn`V`Bp;[j"I+NOV,9]ALEY:KWAVnWq8NINo3"A"f, +BZU8M.@lq9e__CnC]AF_WI2#%XDEoUAp6-^bM<'SBOS.Oen-O-WG4%oHZV)dR*S0=/ulm,.%`IKk@8.U=Rl-3W89S4F_GtLf^Ofei'K7M +B<>?"EdZ^l=X%fjcR&_/W)1Gg"n"+/9bJPtC(2$7[qrt65iP5BTrgSZYgu&&&p\(g7*& +d?N=nAA!_*-Z]AG0?pirN^%YYm/Mp)1Hppg]A8MHc_5liN)']AnVk2a%7,J,tQ)oG$-VL.Z$t.I +n%J9#g'"ts#]AH)d2_!hp1hOoUm"9TC6Q'-bq28nQG;L;Pi5GQ^hpSs>IeeA]AqLBY$2X!DBoE +RR_QdU&\G2PA7g52H4@*gU_`%9OBrTY5XXNG&Z(RWt&6,\YJE\%SN%(Yog=PSbme\ABGjNrQ +-uQR\\>EW]A2BA9a9!"Ka3IO`?/2P(838Qa:J]A8[ni9mRKXpLErn8lrCVkaq#WpGhrfO6[PLBVlrN9`IM*Z:ns[;^S)3:(+$FM+O7?;!K]Ac*'c=j-?1SWJ@)d:Q;HiHk]AkVX[eDg3u]A=:P +Jr[VhTAtU;9:2&j,QThX4;%LVKl4g(jJ!\h/67!mT8;*jkh$4K3,He9;ZPVc?0rd)2g24Nn_ +:1M]A^\$V%;1/Ta +;M^fS.i;VSWs3XF`?(!2%98-cW0n4hV,g33M:R>p&OLcEZ$4CfbqW'iW +5\Mp3dnl(!1LpM6lr6Xp3.IU.`I2qj#p@UDr,B1P3?T'l$kLn0:V:/!;WomV>-oA(28hk(Z;MYR.CSDONK@G+qVkFlEDbHncfM\`$b"9[\aX7A^ +N3hNQ6\Zu^PZfNMA'Z`:G>plPr]AIF>H+BjA[FsU=S=F,Y:60/a"-Uqj&).:qKD49KS*d^4;5 +pZ:'P9\^!]Al37L>j([1'h5"2Zq)Ke.PfGl@3'B-k]AC_4)qDT*'m7I5Z5ur2EY#emP:]Ard`3D:]A`-q=[6XW?W98[s- +.R#`i8+JM#pup8iAh=WE<(`dXKW'^1=cRk97@A'B;>.i?sd?69f,VHpN?)CQco1I9J`H^TgZ +8Q6([1^@tYCktjHpeg0X#?Xm("pk=pTF/;oFB0pKo2\jge9S]A,# +lBq+'\0>l)SH#H\>KTGC)R'!Me$qF).Pqt+5!a41eFak.okD)n#J(3)1<0JE_',lLXSY,YOU +)Vo'1pd)N36*^Q^*QRS.b229[A4'WXn20tHVK\tU'_DhLj(T2)eeTc/'$'0ik&!a9Q4C.0*V +!aW%E-7`mMUk$kf,N:Xce]A)kW!jag?Q/5]AZ4tg&X^\>pD=(eF?F!IH(5+[2tc00Wdd1`dj;0Mt +E/2-UIL_>^QK$A$Q(^u0els-eR[2Ni=(IX!,1. +gb&3YB'3Rl):$rRGCuURqVulc,V6Scc-PrfuSrY4"^!J#&'i$B9-kQgCX[_L?TY3@R:5FCoq +'.3eBsFmuI,>*V9@(qqqu!2t3oFTpg)/U;dQW3alBuVGBW+gbVr1$dZSe+)Mh&V^< +1>=om-XA+INVaDsJ#BT>LhE2+Jc$(e/Q^Pe7S*)I)nqWd&pFNi3rVb%n\D&;X*ebp_5Asl8d +$=t<9.o*Q'J6iHDqZ"ui3'E8H7#@)qS).W$cf&c!aKQA6#E=E\`2#Q29X]Ao:4c-A*iF_4d.W:DVr5pP#;0PRLYV0AR%'mX_19$TUC'K(tibGCg* +Xr`3:DFLp=$+RTJ'cg7R,@iJ=/@$_@S_lt">!Q<+RZq9G+&Mt1;i'/*'qblgb&9Pib&t46r2 +4]AJEGrLfSIQ-ccR>RJ$N#B3SiVa=[lK\EjQ"R`p5.KB6KPr8lfZlIF-qTniqk.@6XusW:^Lj5'c."M%f7+e +H7gqDEUJok[L2WM2qm8isU1>L*tUs!;idr#m#8WBNaX(:[^^c\L5&dTZSDFKL2*^N04#ieVi +h$g?b#9M=hUAcIM:'[m0mapr-0`qrZ83eEU;:SBpQ)DpD'o02Ba*\5NcRDG@j%m&_&O;7hCM +)dDQll\k$s]A21..b(]AV9^q%)f_"Z)tK=fSRkSIeqUD==+g6IT$GfXjBq5#BBPsR3r8VXOUUM +;iSfNXB;c]A16d@V,=KkH'&s$I96r=EsM?)*)#MG&R?$fC?,d00fH&l\j\hc6&Q-]AR"qT\PGakHrK&1HduOR0 +"L$[7GV%2c&UWFY"^.Ljm.\GuZG19:;71YW#@Oilk1QbW:VBbak`V14P`D]A9M?'ICMu`]Ar3S +iU`h**,,r$$'c-RrHlk!#?[lcDs3J^LD4'lXL5Re.q^j5C5V1W_1r+oV(b8rGI5JLs1I2Ce0 +OT]ApTs,oXZq(SL`'a8= +&D6Y#jTX+iOLCGVC*DEN$&N1J\ZE.-R/gbe'MSOP>?0;g@@$8O`%@\"SHmPcc(GAaS<[YSbO +c(uZDUKf_)CtVmrk:^8[rMj!_0;j!U7ZJ8)k?d#9IWd*F^OEOLF^<.UNqYo!1XH*m?g#0%`/ +m%oWW=4"i+2!'.mrOb7PS2jdnoG%[0)-WLAeN_=aN(6nhth?F?Ct\mIYX`]AhjrZLF>tS6IO. +1qP.`=Lt,<8"Q@Lail4ij]AOQR\M5Y>rfK?67;4ughCst2RI(8fTcX%f\d">O96!R\rFq,pQN +#IOhV\q!EAA1(Jg;]A%d`B#5!7pr(R\RX:M-iGMNtB"Wd=GHlr0jQ&ri-*]AS`mGh*?JN3N'Q9Ri9J#EAF)h4A69Kr@ +\NA)KY!XTJ=XNWnhbo@!TQSb_]A;(a*ATVfVi#;Yu+iZF"S\HWUHij,2HX!Pa_RE/?)`&@aC3 +5'4n\RV@LQe6ts1(I\4'`*fYn3f:nK$8/D"8lAsOUk8)imm223e[6LS;Z",>Qc6cHbU]AoB+n +OY!U;k_Gt^\DMWC4,j!f;!OR[br3pT3-U7,(HiIC"7Bm-79m`RG+$gXNauaPGNBnjDZK9MRK +"Nc;d#L[%<6t=E(ar's,PICQJn&9$M_AYT%plDUBlq;Rp7` +L6rb64P6,@hO8i(5<#/sg.cCdejG46pV'aYnG2XaIt$q85?i*9$Z3_.ps+LqQb;p=6M9?DH- +sdhZeZ%O1/B]A^5c,+@[@ddM;\&c(B-t`1IXqLiI:#DO(<>!MO*Ngc< +&Po>T__!%b*p@HE-c6)]Aa(:Hu:,)h\5IC,?;ohKrc\^4!r#,[e5Y72GHeZO2`Q1hje)PNIAU +cEQ[J.u@<>>N0)JVd"6k+MWA>Z/mPOQ;>g5`0eYUf4@Z>Sl3.n$sT)R/n6b:]ABl3fA=M7V0k +gV5Ns&9(t<(pn'4Q=H;:%RP7^bnZK5qm,\!jLP;5@O,F]A$I8Vre4]AunGBh!^kV0>Zj@+slr^ +o10*U4BJfG7@Nj0Nr7ehMYo#*oie3VhkP*No2ojtl5QePV:DL7PRd7Bm>_8q[sB_B*4YQG," +=Z*4Eu9L$**J_"sn+PTAP(odJhdfk/hM=h)JQ-IX1CO>\&?WmGjt02k/j2)X6`[[8>!""q`Qq?RmGgKimV^-PJZ0> +b6(iWmp-3iR6eUNtZ^PVfo'+3r<64a;QUBYZ]AKQ)Q.N^ +l\R6=ZB$*Pm*2jW?MqPR)5VnG7lq1o"!:q/(l$gqrI^0>JSZ7X76]A*KpND-NTU<\L#qgXk8P +]AIUeW;@#3H0n%re!>-:844A"s11 +`PXdW5BoD&f!S"#I;,45Wktn!^q@:\9f*k[\tB#p>;a56U_.\^2iD;fRE@0,4`ZUV1bR]A0a8 +Iac]AU!9M&2g*GR@*gSEdZ=ui5-7g%`7JZJXHmNP(.I40YQO\Psd??KCU9F7RH3V-al?>*F2M +B\>W6#)quce5j)5]A?gc_6XF"fCJ%..,Zd0n^29=[Ic0RC*Kh'usPHeU&,[:6TAqudqB59dVlAM"^^- +i9`NW15oV;j9$beU4l5%fB;0R`3Qtj`kq5G\LVsm.nNaLYGbFQ1.);?#N,,=5H'SpUadD(WV +iUq+oWuG&]A+DO$.a9\i`=p1-dddCr7;]A8-e@r%3i)Z9,uJ\ +10@0l9s=_9),s),XjF(`F%1YH;AgoH_I5C7[:d4E_20$&B]AYUqlpc]AjrqFR1(l"OFm_oC+:?- +B"7pj#F?(jC`5\_6"1/CAq"`^dGr.9C4Bl&; +rWD)+?d"W8Yi!dh5PaQL!q!VQV+W\Y!9rq,6md/%WUfGSH1N3Ws+5G`JcO"o01>p.C=phWu% +:N(,m#3..`,MBF&iQR[W(p4re8*5Gm702"Z4mN8fN#B^!>T0gK'2fK=t4jc`=@e-*HWkGW=]A +^:QO?kg4M%+S1;\u_WiM4ZEh8X7]A:nYtkr;4\n!J64@t..%emO*f^:rlggcQ..-X)9N?Mac/ +saU-L?g&eiGRX9A',28#gQ*YO%r:'M&Y=:F`UA;*3]AC*n?OtIY(\Y=qU#X\.2]AG,FpI:`DQ_lg/Cb)-\g# +JMr1eX7[R`4+9=sb6G>>Lb/#$o[.q4K4uc!Y(s$?Y1/0.\\:3S^VLe&gf>4M4`G`U/ClZf,. +QR7N&oQhC.Ab/qL#*'iQ!pu8VA-^2H+cQ>X.(=EGW8'>u.;^:m0mriI1j,qAXs6Fm":/H(*D +JjBONaH,%1\H-pdH.3.rc`?b5AOhGjg8lgKtN+2_mDP-MR/ar,`C/#"OEo:1i*BcX2O;@>6" +j[BLTl@WL0^b",%Ja*r!16^2Th]A;1plbb9G94"![gR)POJ,KHVin#78WFA4mkB9uS20D,<5Z +?!37?M*.nGjg.7?F&E@^e:sH7TtE1<^&2]AE+H6>[JXAi4Fd>27Ruh(s$"BqW8Cdn*99+$,i+IoVV$BT/e1-@8Ag7I,WImU6i?/9t`O>s3??aQQ[ON +PTjTECTm&r6L]Ab#uH=4L-\l!,&l:ShRk6o^Tl1:_-)/c$?"& +7X#pQbD5K0Ptq$`r5n,Wo:q_EjcpWX(7mWJSsui'mOga'p3>TAcKLbhFM+$be?bRdH6j@l4g +/Bl\!QehVON9M24$SSrUTNjo6iaql^f@I_>WL?T1c%[d<[+.L`Rk:#Ph''>"U[kKmL@7D%o( +`c-XK.f#Wcof8igfdg+o#gCqJ[9@JYhZaSVIhYXTuZF+fSZZ#m2Q\O;_(T+ZcQX12*NX.jOTbkdR&Kud9"g%,^!?FUKDipHB&Q@a#8,pZrrVif +)b/3):#RV@LQ\94H;UIFUY;^?t9da^G06ktY$?lAfqT'0E/$[>0nJ\JBjaZu$@gFmM#=k.8U +H!IpoF;9&`p"j>ahgt.Yq"KUedR'UA+j +27*%L/+Sc;)\)GA'kYi%/IDH'27,@d@#Y7PhFL,5,N+;e\I^Xs)>%c/3LR$++[]A2;ghuUFal +pjRg'K&5Uua"KPZ\lsqXkh04ihX*s8m2)P+Piu4L2%>p)/lJ4RSVN*I7Pnslm,VI/'q+DU!D +LKi[c_YW-Uh.:!D>%(%"1&/q1jMXkmRq]A/Jbkl)oF>!`^Ai7U8`m*[\!KO/RHgIt@t04H8Qk +3B]AMWJJAp?CI'@k!K6ghM;mO/&,5PC[3aR%2J^A;I:hIk#MT0sK-c;0L]A-`;_!p;tr'T?Q3m +nmHL6dr'8Zg!05MLQ]A<>$a4\sV0c,g>p= +nt,1)J7PP3m#8K)>Pc:j$]Aa\@'!Gnkj.Kok8UtIBXaH?J1`k>MNMUq>-lLTDmg?1(ZOmmdAC +aIp&`cF3S0rD%At4>q!)f(/J`=X)mPmQff/#gk5UVpGGoM]AE:t4bj@Af(qtq7VP(loL[L7f# +(Yn_1mGXgLI>s)ZT6j=RF6'$3f1W'0@\JqaB&B>p,%lT)(;]AhpGC"u**/&$m69Nf+7>5rZ&l +&m8@$X7A'&qcFL7!R,=N*jZ=q@671b\GP@go7i?P!/e#A1djGK*o\g&L4-*pJWnC2UN9U$-) +9L2'6T0[i'11.,\*8/[9+TEk"9?pl3gV#L4T;_$&(e)!_(o/oFWB@2cVBITPFqS$1V3(\C1, +a<3@(ruU("Ehj(86c%QQTprY^cO/#;i,<>1YaCk7E""!*Q9J<5!Pb%XAI5WM)p6TN]A"J=aM# +m5Pb]AV%0 +;P!?Wb6)?OC7m=.^p66H@tL;fpPp9GA;W9j+c+m`=,Ms!>ka:Q76H!c5VZp?H&6IYKojrgct +YUIou^Do>9JWkd)qNVhR7!e\d5fcimP9Ie*;)dnfCTg?%D^YT`bAWs6Cgn^X+TZXV"hCobHm:pGCK1_=L?YB>#6EIMV +0^gKnH0HrQEIgl[uaPtB=R7d*HKk>6+b]A*eGEd#Ti'!Y:GR6O=mDEo_l[rB%XS^M]A?:%d(*U +m!ko:gN=r+):I0Lf0$SNdD;o!P*7\F&B$#Q4@F0C0>@hTQi=truYh@_;31TAIH7[r7:aWhUn +F)4:[QkcWIVl=i"uIXjlVU(n-lKN6P%X";>f(A/%?R"!m.n[l1I9\u<(1['4jR`F>Nk]A(b!. +ce2rLl@8U^U5a^XkaC3od)VR8okX@TXj,+t\5jfK0-0W,,_kVqaS3:%'?9;A.stW9CA4Q3aS +EI(<(Z1tSIEn_cci?WCXJqIVK"H=>rS"R.*;TQ4ueH<>3;.Q-N$]Aq$k_GrCC&ljVoV.djZ(k +G(=!r/J*WCcXRTJO*LGk&=KQ-I+%]A>cjuSZ(*ID2Q)oGM8>-;S4URKGP1WS?jg626DWqCni8 +U6Ph8=?;&4Pl4dZkcQZU8ugNI@7q_N +DQArh1hsPK%$1:PGD^@(%Q&OYqHp/."T!d90GM!\lrqaHtrV +0OcE(c;ib1$7H]Aa]A24MX576I!7N`^9IP2T3cpA44c@U=S=_!\?OI%['TElfr6eIFgp1LgRVr +grlR"n7plJZQH`KMpNj!$'@H@$:k_6M\j0;_:oAm,6m%8MH9\nP%@la#TWV36 +m*7Dc:/nVP$k/eFhAT1Wb9>4')TUN9$nYF2"23dJSEb0F$'*g#``WNr_VkEoa_YjJa*O&En$ +;DCri$$WL<@!s>#ZHPA$Z$o.H4?scG-^r?Yd%qsK=C.jAHIo0#WW"'ankfigHm^Yq"*ibL3T +K?sJ$ILN`qoQZu?T"R/XbB7Q&+'=l$:m/FH$[s,,3F$0&ArP@<9oZVG-q.R9JQW'UL@QI +]A7`,`-3=uMh^3%A(9DR8a@h&dQjLY(@Dl%Y(>>Erac1nTWW`FPs4(>,3LL7M4'I^HM)n+52c +I-SuBX%]Am37JC08m_#!XHi2.fgk=FjpE"g0pXeli'N>m8qcB=^/RPO4D:r6@"k?AO/&Ao$OW +eD]AOH?GX@#jf*_70WN,cR)e.,6M>!2F+'&B&_*SfX%3QW1X`E+f1bcj_B.(_%@9\`;LasV(KJjB893k5d=d%,#%srKJNK?o/8BY[FosQJ5f/%$8[)=usj_s +n:BR`+L)lX@nqCV0n\$>PhKt49"kBs)<5_lh(2Bd/MJEb`c"61U@!@]A_3h^Z0m:jm,Qp0qd1WC2r.(\) +nrCaX^pLe+g<408mMWH\D(%`K)8QW-,Ekff,pH&%u3p'Kp8i>/L5@;\'Njkp!RdI[/pM-bcO\+;@ +>rQ;S[;-Dq47/==mnchlc',,8h+Dm$qr";XYRRKW0Zuk#X2FY$Ei,'NjMb8MAZHmLpIrS-8c +*7n6J\32A\rQ6:bMfbX(*05<^'L2!*mJT]Aogq+(nC)!UO]A^'t5%?0=n(5o!I5$R-fpn5-D6l&Gma'MA[ZjAf1#>X)sem]AkKYd^@Uh<>HWllmf2#-WX<,1,f@,?Z^n5[9QW8HN";Gsi +h//g#VnTq*/`#!+A*)T,!DtgF.L*F"BSW;"MCPZs!99*JCi$86L[*jR6KooV?8_#9b6S(@Ms +Sl^gTss/^7P2te+!&]AlYpKuN]AXN0fui=9o$##/s6&+Bqn67GT!`n;C-EZIig6K@fXAYne>6k +Jb,=$GljhjCO6?MFi*J$IA'p3N3g,;jaVMM4*hOF&=D80oKucT0lf??u=2ICe`L*Y3:r@ +Q8VFZ#k8q'j-l2]A`7(I*Ld#hrQ.iaB/FM]AJKX]AP-dR`h:8?=#j\rmX>bP#V3EC>.,8js9o^W +!UapS^hln4uL_9Q%dp49\&c.X=4LfOm5:kR.ak=/(36g.:JJ>PDS8>7a>d/b8f>*5)o/XeKB +/!Ud;PX3(cG!3'2c!!)4$T0\(4PkdR7Y>Ka44Fl;TL+.BDLV"gU76t>LCo7d;igNGItc +->u:3#VJF^7k6/>niYV1DWo^UQ]AFaR=X6!"9X8noo7X8e3R3;7FqL%gHa0i$]A-5Ji%45!fNf +Ns!rfgl#)BkhAId3&>i_*&l&gNbg6^Zq%FeOm.p_7aJ_]A+mWYc/uEeZ%4$AZPYXG;X%*n-$, +"&!Ye5!%/.aR]AE;3u5@NAJWtjK?l&-4NBIeCT2`'KnPJYt6qGr%s,GW@(/@9.(=&&H7adUrc +DVMQp1a.o5T1D#-^@Yu<,2H2'%!8Cu-GLVls< +`;$77_1EdJcN6N\o1i;$cm#Bs&-ZF"2ID^B%J*9q)%84^)[!BiCh2.U),_C/nKMh8""UU%8- +DAl0nrEV/MW("+f_kd]A:qk1tY/gWr.c).pTFB8BnF*L-=0RHoY7:*1D&[D#!EoIMDS>b@W"B +_0p\(l1ET"$=J'.GumI:3Z;.*gmP[e3UpcZc4+@SUm"hAm+Al7G,:Xg'pBF\b1B;<=!k6Nd, +87#bkeDOW)Bop[QP]AKn1MO?QVGVel.$,>pHC[/II7m1p!E6[bK#C=oD.%^:?C]At&O +_q!4i-qR'u9e4q),*A>/K8sF7YEd#:[gq=1t612]A]A%0]AaW?4nn#1`MobZ_87/s$0n:p&`!M2 +p*k1i2$`hf$j@!f%\8_M$q^=B]A>H*e,5$`[B;Ri>QR!MA3DS=K@A/KDcfRFXW8dk@Pe +YprQe)=pe-6K0Ks\I^;WHpDl-"*2h4SJG)"4icl-_=dq<'37pX['KT0.:>G_A:6._NdVXS4p +rEVJulHIN=2blgl"E0Kd@C]As&pI6IYG=hm3%<>-JWr.GP'eWF;&l!>hB%`BsgJt7i"k)h9eP +VbdgZL6=1_V8@ksbP\jA5'C%Wfj=Ul^R/A8g&j]As^V:ig&<"SaTNu_9Jglgl)-q8"mFGW%D2ka#+JnD23MW%35b,"D@+AVMJ*XUhX6]AGqPKS:i>ZrR;e +CYg_.YkU]Aj8r/Xn+sj,0gQ=/QTM4q26c0RmD+WkXUNNMCf)<''0jNml+9k2G_]A4"\!R)ZQ_q +,IYN/((gup/?GEXsUA'9;1j0MQ;Mr6+O=%nsquF?)FDmV$C]AW[SRIUG>OV73G7EJp43Lm+Vh!kdUmVV0]A[umpK"UM+?bnqQh&753SeQeAL#rM8l!(T +ml6kYG2_C]A_51ktanc'?=[P[#(O,:KoN*5#K(@gb8d#;0Sd3T`&[H3i+A/qSan+tfNKn-B5b/ +&"Z%<$K*$AL4B\4GnZa*Vg3Q.\*`$:<=pn`;c2q_V4G+%;QcrNo(nf+YGT6#-e__"IV'uA\e +.$bba$Lps_,S_8=3\0]ABS98\i;nrN#]A'nO;DOJ?,,dJe^iNMm?KBD)D=[>,) +-fG^O[NXls%cgMrHU^nB%`243$"=qZ(D.[%Nk*+rYb6g$Oq8 +cRrq&J-m@$q(gk\S+%>TCXZF,4`:+J")%lAP9('^2p#bop24!mM>AQZgC]AS5("M3F_35N=+B +?-1j.NJpQ_\6#6AnAH#uom#1G^HU%CAq!"R)jh\mk5FudGT!$D;%_'p-]A:&7uk3UG$TBo67= +F:%?;m`"TJfsfjI"-=J<_bTr.=(%'Tk:uOD;+bB%OP5$ZG]Aj/\qZH5 +D7GeU_9Z8e-%H'Jp.3luHP>E_4eg&C-Qmb7TP0@&`.c,)n9*>PkhdC$Y$P%3@CJ(nmV@5p?4ErGBXm,+7CG +^4rBH_;$`sTYO*]Agd"22LUHMZdhom-/-fLUh&9%F\A<.%KR%%$s,`B7b<(dbDY`7#nf)#Qgj +NCI266Yg\k?<7Xg4F4\Ac;TkKp_CbG>LOme+Md*6FcnS8YMT:62ES;!ImCK"E. +L$1:PCf;OoZ\5u;RBSto+BT%%Md^,#`\^N8^rZ`:n+3KrQ()A$Nqe?N_:p>Wl/pQ\O9/g7?%>l#CAhKR-$UT]A.=:T936 +8(/";r:[haf.SA\/%p>YD3WeO>iK:-;P7Sm3Qr7M"gdJQBjYYdO;QQ%tf?W^[&BZM*4eXZU +#Z\'&)qSD".J,#(K(0"kABc@@5>9[cKTVWl/6-pW8SXCbb7(jV6Olca$e\Wcn1:!@K)$1L0o +c;X/?INNYGiHNX19PmI9M5)1Z`c-`*LqrqI>JcW@35/SBpb3$d!K:;ncg7uG$;Ht#0RY1&t8ht-W]AR.1Ba?^JqXYi23E^RHnIs3&7dgg2aGfQK^ +q"MD]A!c=]AWJ$JS3&c2[?V)!+gkAtALE"oOO)=.;s$<$Q6:m@a:8mpf(+WdjP:u%.l!P*TKsB ++a[EJ5.'Up9,sOTdrTR>HCHBG'#GXIF"\Lpf6Up`=]AcGVBQgPN*Z-gK8#Ebac.g7q8(R3gXGIl)^PNO8EF4KX>U/-:3bMrHdl.jacGM_e#,JA +IU]A!jEgnE^&G=1rA"M4I7X&%n>C4C-37mHC0<',%ci'r]AH6tNjF3;\Oj.#X +T9O*tD"g!g1G-YMPqqc-,IG.irqtN7=&Z*6B)6bmmFC#n3Olc23r+$sbJ3C-]Am'20rf[ll;p +N$MKl!KVg1oC8>-;HR.fq1(j)g$nU!NTJ>]AnP8J2CC7\ue+\oZ^-1'Un[i3Yb"s+?K7-m,DQ +k=QFOFLFT]A1&9Bj(1jt(ZD<=N[GLlCGaqAYH:NA:8WL@b.bGX91:mdKE(=\9h6ZGNA)'`9b' +LkB*N+BcjV\pOoK0nkUH-kcCfjTrcnW\S:N#\6KmTF-J# +:5&%N7b,ajH4u%f+9Gq"RibQB>0nhC%4LqCkhO`Ea<65r]A:t)u%9F.[RA-CZ#6kU]ANOkVEHJ>jOI(U>4'S$/DJeSp1"dqpDRX@NJrbEOo@CobCh<%f?iL\k= +rnP'a`Z&%opHUX0;"ac9jG>V-,G!P:UuS3k>Ja*Hr'@bV7ZrJ?[6@XhOsnO[#Fm*PTM_$eNr +)Kco2q+QSlV^K%X`02X",CgLVlL\D2MG]AC7Wl=Ef,BEqj0fqT7I7kCq!FgT;PN9Eq@8XFKoj +`$bRJ$LYs4X&#?Lc"aL^WH:69L3hn&OltDt%:gH$4$=I>1+sT$q;-"s+TgF4S8@h1jC$5p9h +c!#opK"Gd&/"@;%")A9c\/9h]AXJ+dA[YF-,EOH"F!jPCe-qH"IA4]AZPnV$nXbsZ5f?'R/dP3 +Ba1V[8I=8D10i4PADcDM)42D/1^r"l=2`[e42E&YlZM6Db[c.*L3gKXmRTY1O)Lp2?/H-1gOeFAS4]ALgQKY8/(pps3=,Y-.kEb!H*pKsb>?c.!UT@pb=9sT.IkLG=9mGZZ9- +8Fo(f#]AoWk47?Ee>t4_(7"l9qq!_Y5Qs+)+O0';.hGM`b0\QmdcfX6ZO\F +9k(m\'#N]A$S[aePQ:'UYo^S;d8+"0>%B[u\HZCE&R]Ab3GM#;&#dp=2D-3'Qm!i5L>pJ,Aicj +^Ijn06=dMq.;2ofU!/A$Z'ZDrT8KUBi$;q1\"YV=L>E28u>ibB/2r[=,*;SGr,$)G.#(*gdg +m_GhoFQ"UX^*/?MKScXmgg:l#Mi:TPtd"A=.fKfrE=1; +Eq[>m00X?YS*mM!*?8oj^$PGs\Rqi!(e!NI$a$]Ad_;-"&HNL,NI0nJVhdo-sglkkgZVb'"KD +_nmPdu\314-4\ThJ5!OY<%X/Jj&/]AfA@>>0tPR/W!Rqk9;EA(LZ?U6'iJJQ-ij.R64t9*((S +R&(p(75SIZ:DP+Y9feE,gW3C?r7mKR31BP--`u$Sr4QU<@CA@KXU%BR?L<:mc5\jED)MIRN5rtJ$ku'kT@"Zfe@ +usQQH%)\Q4rU(jCYWak&"M$+EpR[:+&.fH5<,e#3hiY!Mm=Ml(pBl17'0.$R\%R.Nr-Aa^D! +h+7cr>XdiNBB&p/VIjJFm3$`(fTaI>.3Ps'AY[qQ$@koNBE-q.eAq/_*e8)&,VuQ`<[FJ8=Y +k@q>#>Y1@*S:j=XDbKX*g.i&X!CB@[S"Y1D4jV,mNZ.HEG9tT<#%a" +[]AaF+cX-)T:o7abSZHE11kLV:8:Gf`Q4fdJ.]AfgtaKD/Jk#hVo21Ea2=FS8YN?02Eeh>D8!1 +\\"ILp/`QMJ+n_*\\m"k?nnm*Rf^cPr9r%F'Lnb +8?f?\,'Ei6>`hXTVY[UI5t;l@ir!8Uq]ApKsWK<=^Tmg^k=pj[7C'eYP(-oJ:Wk:=R79_Au@B +kJLl1#6717Ci.>T2^8FH\UI +LmFAN/XR8Sbmtk,>*MVl'2q*&:;+79.';:'@Edrtm1K*:>?"_^`XQ=d+q"C_o?m*;9fuNVeQ +oBT3/fUd1".Y"qHbqNn3RF\VDD'`:6=M7L#O(tTl>l1<13VG#i/!U7)(1R!7fuPUrF[qsu5`0P,&AaM8/hH-S2WR>lDFh8b0[G_*o +!L6:t-chJN"j7.k"d)gN13Nh0ab#"25.e!iQ!d5-OD/qI"qL726uXARC*"I`_XY8f&u6U*%Z +V/QitB,(:Y]Ai0B(cF1d)-,6K*OCbnLiIVBYd]Am$Hggr\fJs/[e@M4J3ViFP;9)iJUfu=b6b. +;14n^Vj`>2]A_k"+M+-70Z7WU0):6?Era%`;+[b4"oK=Y[ec(N+o-o^DpEMR'*U63hI4$3i>1 +4FtLP9f]AW(gtDbY]ArNpB_bg3^d/oN"c/VBnlNWJ+;a;g2=)u8*"*_R(=j%]A"i[Wu#qi"i^ee +Qb"co/$0j;(!R3J7TV9a3MrnPR5HeB7cS9015GraBKF=s.SlFOBT0%-CEO]A8Jp-ZnP0`ZNPd\XeU_PIK`39S1 +O]A_N0C2W13pd/9KGK$WH8Q7T7e7McL7o!qY5OiiLmha*^u[jf?rE>/#Q4J@_$;1D8i#7BeZJYE +3GSVWVD/Jhrah9_.ads[nh7^XdtX!pl>"&pmo +:SqUOCKoo/>$gc(_lfsGfX+@CCTm%ue5:,o[\tam@NUR]A/Ku44+#04F)Q4)b:m`/tDS/r-4< +?U@.X=?Z64O(9"2Z;Gc:1N+8s#k2DNrtKVMOEsF--17`Na&DM?Z()\H,7GadXKskc0tFSt8) +MW.Udi%"Mq.DS62^Ing'e>BGdCM39Xdg('@LRg_m&D$l+D30Q[+:cq8H$Gi:X7o[Arjc/A;G +,TF7NuT\!laRCu[ZNG)gkEO'BkG(.S(8I`1F8+qJ'[d^7Arp[XM7:sdT:_?/ +(0Z4lNsX.d-ZGrpgIO7I>>__48+\(q*O0`VoifPAl ++m)7stcuF%ers><1M)JHW]AA2tI=c0&a>sZcL41o>&-,)2I\<0u3 +n0KaMgk"H>5;>1[\pj2"`fPQ_>V) +\Ob"^BUqK9Ql:oeJ'(eWJ$2Np0l%%iKjqlLF!j[Ncpml2DAk,(cJF]AJ;JTT9KLZ#[rn7L1Za +6Z%GPRTb9:Emll@eas_"JUQ/9SF8Du5I$=U(>0)nI&^:C*&O^OOE5<-VpNe/9[42Qa?kGqKk +5^^50)mGs9>CS)(OQ_H=T4H@@Oi#0&e\QYr]Ap8k#r.E)7i?7lR>H)(X@_W`+k)1<$]AlHP!&B +)dIpmBB8gBTS[5eP6kWnJ+ZY&M-coPr>+:b)M.3eu%7^oop1RXMI[Tm5?!>J>m!0R_4@g&Gf +@kmn_Z.QBNO,Oa-/+4$2:9ICbDt#c#A*4*Q2[X_[$o;XKGT3d.6pj"ho1fc6eJBkjcMf%07u +\52!m%J_T5-)q$606]AL+!S1CuB_fGK=-"Ipf!uYE>0EDf#,RjoYVjme(\chKqI[:/9AmHW,. +g*8+Y@iYRI-Xhrb20bat5DsYe45+$a4hd8B%FPL?65@&nZLZ+q67>sR +"hcheD*kDCZU.u^M]Aeb3^&F.*"P)q<]At@i:[5oPgT.^)WRTVPakFqoKu_4a1WSeh]Aja$LH#g +L,Z84GEoZ_$nMuDIeJ!JqERp)V!hFp\fVa=S,m(7?7AuR>t^#9Gt:rV3WiKS"]A1ERJ+A\+U" +-Kh_MM&t"\Q^#S<)--6$Zn=K3cJMi>24\tuXpkmSM_efpbNN3QZ1;\D7\UjCVblIe@1LAFV- +9[(YSA:4?pPMH4d5(O:O@Dc+iU6u^0732T*7`86h*V0Kogci.N9C!Qtc5)?$Qp.i,k"d5/(' +KVe>qpJh"Ip=aAJF2pe2EZKY'1Ya:743XG/(l4Ug.:dpL90TGuq[#T_fJ.=)nKX$b5_%qfX]A +#`W65:"VirL`Eg_o]A:cV$RiqV'lsLCBtUVM);K;@J@lmBl4q&oe[BgWAt*$Q6iqVN%_[c=ep +[3cDQFIK0-QNVY^/_'>a[)-#TmXG^NHl@*]A`4'6"@SBZXZfFd5RK,[qrFk1b:A%Wt';=)2M. +9.Vhnd>S\b'!*B9,Ih7Hm45+ZL]A^!&32Ri+V^Qsb&4^[E>*k>qJuZKE&#&_*fI'2;kWKfHHQ'3LEPY[k]AR`0"oi +jMIGql`=J92=atn7k")Y]A74[Q4+gVo'(e'Q^^e=\a@i@bO;$MoP7Tge&9`cbM$ +MK7]AUsfB\$]A3ml!mrpU8Lp)8R2oj9;h6G1e"@i?/am')0'q7sdp?#sjbFEgap@"K.UqS0U?h +f\">o5YhV$M,@U6.q>l(MNWl;PQ?>Q@uMInj5nt#Po8VR8B5A1GJb&o(6Qe(@6mmRoKf-D0* +=a7&,Mc,BMsdnmZ<=\o%CFS2h2i&97W++]Ab7;(19K8b&;JR@@8K4BFpbW7Qm%15QSs:;o[_/ +r5]A`/3i'A\fM!18"+EsEG3?XK#aVs71Oo3&k>0DBUAa38oASfGk;kO"pK"F^QgemS%e]AQg]AS#U'(\XW-J'iZKhk8M +mF"9K*-Och9%:10CnbXZ^ed@<:9q,`S`%BjpOV%s=]A*KW9!E.53U2YC^e5Lk?2Pb>k!@9&k4 +).3B''R5Qd13lG&A.saEl\D7Xa0!j*+6Isp-ldFDU'+)+"+l+_-H+Mf<=PQnGAVLS]A;ai5RWLh9FdJApT'4m.]A"T;T.[d2`=f$)9Wu]A ++urc'L'u_#F'U%rWdWK+G,IYT=[:IMh#&gS"\,d4EO6t/"=O_TV.1(.MkDMk=-1a23H=I$3a +F5]AP9MkUqa1lU72Ua%Z%5$DDVo;I-:(F;pQ2ZW;m`nD;5FE/A*`OqFJ^dH>'P_%f;)N1'6mL +J1#Uc:Eg#ILXeN03<^E,]A55]ASheIKdS7[b"P,!I>]AI+% +0`%r)0XFaLsNG+3lIlVa_fBObnJaci8%bi'Hu4:kF$H\F8/)ps,AUS$d8^'%tqhS8@4Q>d:Rr5!kIJN6^L^=#&jQCSEd,R?^#*VVMOCtQ8kW8^7uhZ4dp>0V4 +l(*M8Z*CAjIQWpmO^U1mk1b=5)9C!j=cS[N8BPH"#$^.*bc[)Gq1Y)b;V??0C@S:s1Ws/X!Y)!,W)=13+O)ER;V6*cXtLu^4!cD)XXY_hb[SiOm&Et_8f@k\oHGtOVY?cIpM,@9\**i]AH1oN=:s7FsGE'K>/A*3# +tgcOc6aW!/*/=h$?icFXd%Q8Qe4BAb_S_">D[TG$gc@%I+t3LF_Ug&Rq0e6opr&X)ahpa=uc ++@?ODa)(k6#\RVY:i07e7K@%>qJ*E[EoM85;D`X]A+9(fkgM_-pX"Q[6j2&T3k'6V]AT.+-=So +/?q5C8dQ>n/JO%rEo0omEg1ECuY_`Gs3QB&ff"GVC'u8VN3.cD*c"l?e/q$LsnLhP_.UI&^& +P._04FFrEU&]A5A>Dhf:&Kb=C=K<:jiUn9Qj4]AQU`gi&6IpCj^GPp@.`A-Fgh\pfk3E%o.R0F +8(`M/Ml`dE8Pmp=dN^(hgpf15H&lr%[p"=R!8T"%Xu+_;pl&!#Ou["BD+Ut^@m[Ng +OkaT),Vr!4$*`HS>B84"WRd_jN?JEqJ;/bp"Bl0lc@S4b6+/!]ASLOjJ/lB8_IlaH6fhei2Dm +V.%-=&.tPq)t]AuUUb%[ +'6&T9W%J1(9/VY-B!W$3*Rk:*NqJh+/p$E>bgT9k#@aNH=4M#A43"-Q<-5(\LM3nVHG\ +h4e`KC\$Bf*Qd!ptDKtNeVMiA$Ze22"::eS&X5EIRP\&lsR'MS'oSabmgLT(^/:#*TSZTE[2!A.DbjVhQ3M'D1ec4E^O/b6W9W(Q,&^5K^>730P.,l=`J8THfnjOJ%r%Lq4Bn0:\3r +.hl'9f&\#N4@2&jT3MNY1UU7@;^o)cNLd&:gu4s]AD[LN7oZLTQB4p$il-[QOF1SpohHDpf]Ab +K;U]AIK7$[au0S9:'GC-FgP-:*EK[6m]APWRcQlq]AT>8!-Vb>ALNV@7Li"X,Im:FR9lP=C>cjO +!(DGnHW0G#PSS_^mA-]A=`i*EL1jlEP%S_1bNi:W$(#@F!;/1-C#A0H!ZjnQZ]AREn)M#<#Vtr +1iLQopV7'LW=<[Vjm("Tl!jlhNgBq@mLiG):ZL8VUHGF<+Q[dL_Ho6eEusVjNIUoZ3Q0'&#+ +1lnn>.^2K%lkFhZ:*Qm0op'mA)&jMA1n%^Qm9fgE([pG#K<`F^[PML@E(?6Ed9j9*%sJ`9P/ +Pu3.8!&erWDa>gOh@r/5o('/CDAjaNic3_^eH#^Cn,^9_)5[-t9GqWPDsEm%4$lkaXadGnbB +sr=a?n8*"r.D3#?9c+k:2]At8UA3mUhFF@O6D,="I.7^,u8+_i&M_5AAGG89m8BRA);([pcI? +.\WF$B@t]A`8<(k7E80/r/$eTO9^,^ADEqQ0>#rP^23iEG-]A&rH[#g``Tbt4g'%I1_f?Ido'd +'s04*A[ku)k\C4cf!e&(mm_@lh>O,ZZDBPfA(0ceP7\'-MMHk3kaHeU#d.m=c-/;c7s4a6]A5 +AH_dT>GE?0A(Ep#sP-;%F6Z(o$eZDUK1J.uY?60Nf\=sF\#W#U0i"p>'W\IQ83!!/d%!3hN= +7&4ou!h`\Yi83]AUpLiUtEZ_Y)o0kKcBkDo"pA?7W]A23*]ARs) +YPGNQ^Su+W`&4bCK64>]Ap@UN`_D$-<)?fZqC;6kTX%/Ea,K+us$grT?(D>31-!'jTE#@s0ka +\CoRI+qG6N29EbHXcU%O073]A:-E5LN#e^QLHqE +"Bd`CVn\V`>6RIhYZ"S>hR-3oJVQ3MTa0d6]A*-)ljjX.WF(]AFV*Gl2Oh/e;2_h"6J.W8S)%:b67`3X^khnXT2T%cjeL$0$0L: +S;7eRb\ZjaP__-UW;"pI"i'gSb6_I/0ShYYGWJs1g5Td%=G?,(R[Jb^UUF72$qiT!$"n;l`C +*Ye>!?[hZfq==<.I49XY#]AHh +QtM^tUmCgVJ:^$1?FR\F">7A4)IU_=Fq=NJ6-l(b,0,knCcc/X#6>=.]A`^iG*4oaTL=*o3T\QqZKrOiN7FM@oG^)1 +$aig,+FMF.=S>Q6jgp$p&>BC%)C[70isol/E#QGscW5#7TmAT/L.6lUU-bi83Sij@LP`?YB%N33G&D;Ehg\?2 +$^>e7%&;q=2&_a?#3NGj2;bTmnbWs@@9k<=bN]AlK%ur_8H=!DLQ)L;3CoWF'kl>@[!/E\9bUI/+isVuc[Seu?I!GlI.sOG +[o-WrFHYG6[Z:()Oi[@Lb0e)Tj/'fInTld0DM=*#R92(b?;+[9/e4)]Ah26>Pbs`nf&$NVF&& +J4E=<>DT0bPp\1#G`suE9an'g>FSL/7YdTe.3,u"pKs1K +eo]A8SiO7#./pc%V`!'NTa^[l3eaW1NqjqkZ.Q3;F-G\5BIHc&mrenu7,F^(Ts\8WqH'!)pW6 +'Y8P(KA*Hp%K8%WAC<]A2ou[UOT;@Mc3Ldt;n;-u"]AYs:3UZ(PNh(Jem6ErP#:5\PnsK2@F5, +A?#Ddq_C,VEq`CDJ+08"rV#GRAW+pQGP$^cqXm!PMK3;Lk0LnSsPV^k=">2i.YOWee7b@Sc^ +o*GG<()=#O]AX$rYNMf +sE?jXa&PllBXL'n8Z3AL'4A$4:u)5&D/qE15UAl9Wt^;lpS*J'5]Aln(eR%=d?soQmp6@iGVR +f"Ta0S9q5_e&8ubHpdAD8:)@%!FXIk:ri.Efks.;3Onae>JpoemT-+#]Am7:U5?SA$oWkISqKhel9ks.Irp4i_o52OZbfA\B_+ +Hgh9gu/T,I7l*ZBD3b^G9[csFG**(SfqR6Y-]A5^qP".Xtp9=e;8npee-iTqrEM6+@#[m[ +;1"]AFtQ0@Oltt-bTrhmBOl&A:h@7Ce8cC($-=?--NKZF2pt:/#P0P1jNL#6)dC8+8[XUJl*P +>OYflBYVS^2.>BJ$#\RWFjrffT6&(@=a8%9CJO55UA.f3lVgKG(LD]A4LY2F$5_CW,$XRjoYc +[=]Ah*\^MFT9^9#WaIZtX,0F-[6Ss;i:8CdM#cIig/*Jk&J`=ub2\>_*(OPTaj;W$Mo_C1aeM +=kG!01cb?O>Xc<&<:9G:@km+\02/AJ^!p[m=ZGB[;;;!IK;bK9AKfD1=4\Ph[$BCj)J$1?&S +\71.jQcHNL%3KLq3Vhb#Fs_T=b=>d%X?4AWmeUer!JL0?,.W':]Air_7q,B'^:L"t6S@f!sK/ +ZGX.T9+*&n_q0PR6cZ55m;ks6OEJ6FIN_K%2>_;s,Ok>AJ:eh)T_/0=gTMdI7+k0^IIg@V>^ +[@0seZ`J,62^4N?fGE +%EZub(cjIb9-d,(7>h]A@%b5C7ttY-`s$-l,t/5R9Of=TRCniPCa;`EU:39rZ]Ab6)1)6&r:oq +^G%YCE1J4p$bj#Q&X:pl0s*t%h<7#$o16hdEUO]A\8k(j0Fe#,L-2);K%ne?qes4!_a8*bBqZ +Ps#i%7O\g#25+6fY_:)NA/*D:"hpE*\YugVUL??A$)3Q[i1NSK;.=T;[faM5cFC-lk`)PF8" +FN6HHV.SbVd>*9GnoZ0=*6d6^IsV?Sa0_]AWVWt\OTVIYuX.>%snoGeqBoZD"lKG.lo.VL":E +%3)6_:ZB$gm#,.5_=;OMJk:C,;JAfYEZ7]A5c&:F$!+l>]Aem=,#uX"Q]A'i/Y0 +`M+0Y[W0UsI5Gg[AU]AU2<,,XM2'LB[h5_#7(WOK?#JUdCC@F3IiLl-i;OT@bC^k.juXOp]A=! +"LPD-Tm9?Om5Sk!V-c"hG@oa/rhdk(WQp*GO-8r\R8]A>AQfE)-@C1$eH"]Anf8n]A$5UZqgB]Ag +Q8_s5#\q?_)LjU8RYE:c8,01\HtT\Rs$i'>B.QF\Ji&.iNT#1mFNSkN#18B +q=N(kVE=-:A@E37`G@ALKu4^^[;rQY8FA-+b^BE[rq)uWjgj]AO,s-p/2AOkHfi`Rqi\)AX-6 +C055+_\YkJT4DQVK1Djqj^C;sP;P^^a?Y<%DJ7(esSMbs\q[d5"MM[=Q!36C+hG:@gUC[:;J +cnP*.J:(jE<+SK16G#I89b(Gq6K]A3CcJT+jhOSC?l1F!Tr![\jU'(Zr*nL!kc;'BM#J4^;sZ +5=Q0cCeAKa0?LPG\((#-_3_]A*6ur@LZH,l=DK&u]A(Rh#bM3dHQ#A=DoXA9i([Ef&WG$p<5@e +Q4%OFC%/?#lS$Z5aEWKXM_G$T?-R_Y[[@LND2MDUEImWmPQ$0$Y:O\RQ9=*"TY^K<,aFMV&e +`Fr\'"i6`q?V@M8'0B/?BpW7_Xqs85C;GBg^nT)F2AMBN8#9ZKJ16Psi%@N566\peN^0\^ed +#P#(q9,gA9h+cUThDQ3XSVo.Yc=[b]A+Ct;+"f)M>!%(LERU(<\%2\d)P-o6@S!:#e%+*/mIN +&0J5TJj(Latqru1g-/TCbT%cQUYGKf,)fDo$[&aso38FVs%ZuL_B]AM46Zm7*Dd$Xo#*c*l0! +R!L/f,&*R_7e5P,%;eXhJ:Z:B6XCK]Au9imc?EVZqtPBu4"J^Bm;=uD$/rR60 +/nCDRVl'hu_$g@^Usj7)S^+aGF)4`taHbpM7qa1^#aqTe"O]AC!u@ENPJ1o;TgM@4iR`=#P1M +8A&*K\BT'l@"%Xg]Auo#71OKtk?9;ILYe=fg#3FY&ZNnNLNt9#&m(;0Qr45rK?MF$2Vq]AZV`a +u/MY')s\j&UNZOr\A:3p8QZ[WB?=]ATF7H66&Ps/]ApZm)K;E/RR,e\Mh*4jaIi?_LY0n4TE?m +bc'L@M#=t[72hK78Z6cHGaCCE.)3XIP:h?5%VeCSd^a$dlJoCoV/f.r?S32-L+cqr)^&\:)k +(f6IJKp^Wq'9G1L`Ap6L7L3ciF]A5nVc/^8"qCfo7tP'BFU;&=Hr4I:%R0HN^`h)Db?>E^93- +%<0j-8CW^'QA,Son/^6m>'R#m+Bpd6n4K)S:BcR=FLWp]A)!"2`UdGC?!l-B\b9$q"G-ef/<@ +6!aoSGKCP7Qq[_N_28[Yrf9M>]A%ch/^BS(&\3NbEXQt%:bO[>P%.FmkRGZ +2C[jL_e@L@,,n4!ZRa&P7Q)M>&m"SSq#b7,>e:lYG*Zr&Ie>C('VR8R:N;d7g[s:*$uUmGj" +]A.-6CI#[,a@FiaPk\_C1#a2suCOr-nj8au&M&Z6V.e#ZSS7_\cEPc"lABf$Kip]A'jBbF<:0\ +]ANBWGOsd'$1>@a_aZ1nSXgt7Dnl3&G-KE"e!40CG2PA2R^9kfbJSE]Ad!'NXi,6/1OOu8ZWO^ +nWrXRg\]A,RST3u&:Vm-N]AfL26u"%1ckP+\JT&^A?&oUfddIUiBluZkr +FL^)NV,eXdZhhq;c-JW0H2NphE39BclelGt@]AJ+a_aDs:>u)25OF-ApgD]A]A&j2.d-W_e*XF& +*0)P5#'FM1?)C#RJau!DknJ629NJl3fIokpeWDJPHYSDm38.RfUnO72>%VJeJHQ:T^#*0gU7 +I[\Cjr+e]A4U+d@1INX&brK>VL/]ANc"+G6Zc^`MASA#?4)]A,4Yq[8jg,IEF$I!&S&h@CWs,;# +Z$46b%AZ`oS1dDP1g`^/2s:TGdirr#:W#jmlh\!Y6NNTSbgA`rITH +KX^`tZH9m&_P;k_$n)k>UBVE]AUU-am\^#;\ou'U8W9S.&(UcqD4^f@"P9$@1SsG% +CXieq`L(/ft>j0F7/']A-8%]A[fc[jWM5al#ibElFpI4P"^&?c:e=XCOnt=71$<2iK#]AK(['OL +-C[>luipa_&alLr\MnfsW/qYsdA2Y`D$T?Ad6**I&&3))r9TB5/)p-u\4^H.MBmXn/eamjXA +NkV4?NdoXhn(smkDr@bdOqF)_5$5F`oZV`.1rkG2n,[!45Vk8WpQg+YqG.%V0oq;#o->Sg%]A +8=T;WIP!llVqm(CX':QH2i4jbuS9oQH+NV7NDj>Z,61-(_(/(d8Xdb\S+OU]A;>,5N;65 +qknZ$7>"+%Y>RI5Kq".do>=]A&t'jg*-d=6eF'PRE:X^%'hVpUqBi,Q"L3+Nbg\8,B[n0.-!2 +pl7:!2Td2&$U0rm!:T'C31dQ(+W>9p1BR<+SQH)jGQ]AJp%!^8K-2ae;^:meAS3SS7 +:015:6FIDLHRaME,bl!?d>3a*O7B(]A&4W+O9FN_e>>H*!Gel<2SNq0;4[5F8f\EMd6YKEp72 +3#1;^@&gX210GDG8s;[W=^,)UdJm +GE2l#Ri2pZ=@?`(+8W52=#WfL&%H"gK9_LH=L\gOJnUg7>nJNf"P;.\dI!nIAH[h/3Eg?Rip +Ut8@fqt06i788q64/EJutHKgu<;Ii,e[fgcY"0rs:*^_#DQBiXTZhiq">PEC(3gXhfnebl\t +*0Yij&1'Zf3C7d?imQ'#qq>GS733;N"QcF=MotASM`T[5a+SY[$p;Xt-e(76q;g"Rhkj`!=@ +.eVaC>m99DQhW7$JB6shfjssPjHMMfrtVR@Q#\Jhsc$+gtgjAlaR8hJe`%N@Nh3Tr9h/PFQ- +1Vm]An'N2i87-MUBoM+91bVH,_E^EsLI#cQ6oI9i\H(V#:cYYG<2[EV5q2Jq!]Ai5F,eWKmJ`G#V['[PVrj@6*9b=&S +sn"XS#nH^F)"F%O064g&0+A>h`qo\8_:FQGr*<^S*/$[+X[Rghio=6P1,+JTb%nplV3S=sc: +`MjpVagu"-A*+Mf;A$p2FiIa-n&1!H]Abs!i_!Nu'-a+6"e]A5dFUouFeTg5Jk5[sqmi#O$eIBJE; +OaA@iM2W@e,MfbHARK.#*n,O=o3q-ZBTj*1UpU7ElXZ59@a?i7Ish_CmFFohFp7u5]ACc5XVh +5ura\E\OaQm;"NS\f"]Ag,&Ka'k9n/t$If>jn&44#:q)/^pd-ErY9'^F3s#[SQT=J,%c/E*"q +a_a7D`qp+1f0n*8^"P0/o[5Iuc=3[&:#sg#NCpMNhenhC%-YqgS1)_-=RrA)EF=1?)Iu"c%]A +[Ec]A/:8dQ+eOV5PV6S-nuqBc%!$9N%[X*%T&&:pHsl>Z)H@Zq5$WTN4uZc-?>Ma;+'tCBq=O +DS?i8Rt[OCr%_&Z6DAfEV;P5#O/hh$6(?B*%ta*F`1RPTq^Fh/'&j0(NHnLJn4Bod7NeApp8 +.b%%oB-bhnc5eME)#E*4Dh+uf1o.Cb$2PnBZcLZ6TKVE;@._gX!$a.\8L+%]AS@cEYW0"!#%! +`o)-7UfR4HOVS`.p#qop(Vb@W)WK9:-.8W0;TP.\kr5[Da7i;_F7nY-5r*'>CXs059*Mb2Un +@!a>e5dt?.%0I,6q.+;UWKsJ%tJG0_6)!3_\*:]Ai/<6NC\?N#9U[mXq1l$>R?dliK\,kM"2mF3!pq05_B!VKS_#_P8YrqaCTuq*YMZOEH!\4 +3%4UFad/1nf7hsC`,RbC6+%0H"=S%Ai_psc:6Xp65u[Ilj1,"%9=qc5/R\\Q0F1?<.0NtYg8 +=u!UEoBCAV?]A+:ZjC&ju6VkIJL,NpVb`kqI$cE$et2RjCl"@4hB:5=a^( +RHduf]A9,3ZOOmRak9o%Mt,N-758sP8O"%58"RGm%er:QqN?)Ue]Aoiaq!6).JBOkd#SX^l*)E +&rukPDR#&p?hk/PB(W?G(.([oAY"3\WO@k>^CaGqU()e]A2g1@oAo]AhIsp.R?!h_W:sCjj[O6 +BMjYZgV8!&(ohepQ")iOMh2Fq'5B[mobpj@7aPe%&YeX6OulPg2h\G%$6!i$N-K)0Y,VaNh9 +*NCr/JX-kS.ImX8*[`)=.?8c.6f]AOBJW3O'V6QH_"Q&=,Ac7sH+tpSRm(6B#0rBs_-_&GX1F +^ZjdHD`\Kp>B-!JGkORcu4B+'B;RR,qP8o?klN2*jbDU:H+I4f72M>_"1Diu5jNjNM-q_5Dh +/)V.-7^SYEr.4B">,#Lbo`b7;1ns%6*Vk>O`Trr,1+'ReQkG\Is;C7cB0aB0/lni0aDOFb5bF&R\%YtoY0g,m"X&38Ic7"[ +XST61H.di$9Pf7*/S6t7EsrMt13X;bpa05B`b]AaFZPMCFu!Q,kX$f+ +8XfO[bsj[AI(D.\0?'Xqah(53;,7Y/;rgg?c@M9K9#dS9dI?$>qR6lCia?2OBpgW'p=%ON>[ +d6sjBk-]AgfqBQgk]Afc2WKp713'T!-G'(hF7S(&?I8u+Zfsk9U,)0AsRTt:eGk#ApGOQq$fM(aMPV5g1-O8DLo9#erq +-ij>8,Yt42?3U-#QH*kIF)m[G4sO[:Xg +WP0ITHPEk]Aii(&(X9f\]AEYN@V%$D4@0;hTehKMEU[iL%autq`?&Q":go*Y)OaFcL^e0Or\ur +M;j7LOau=pI?H,8%[BXLUM%;$R*&gDET9K3VXC&/cf@3qi@kD54=AUl.:?<:lCRuqUqMs$e* +1-h:92LFla_YF\MD#=@oL`]A$''WrJ`h6iG5Ri[r\hWP,E$rkg!t,L0"tPq08n_b!42I+LD#!97TFG1q+[DPnE +/>Fk`PPOhl)oo##W3Z?`.Zn>-#\F2)s9mu`?[CJEo_1*WkhJ#'6c0`c4.J[f57^:n(0Z]ARRQ"KA,kaT\[97b +r[<"(?ujZ#dd30*&k.NLm&:(IU=/FJFEC]Al:"nB]A(BJb0r/qP^[DCQ:[*SU__k7-nWDek%(F +6HDJD20M67U_Eiu!'i$Q79Gi**NE9L(;Lno!SX5\%8M!pT]A6=s3,DqeZ4a,RWl*;a:\RFi)_ +Q2gEL_/'9M9c0gA\tIX>(GfK6Il%OMBB+URjjAW*=k$Hji,`>[UQ!;`+(0>SOTQZ'i@+N:mp2_FSK.kU'36'_8hSP&d\KqFY" +cu5@hfgmO/%dRB/HXsYRlX:='>!P@>YgIegf+-O3FSi1%5paToJYfT>Z!fN7\?JJ3?Dg"dAHm5#8>ZN+01s:V3PDaQ%`N,S/Ym[F[_f]Ab>cJ +K*!/cq5)S8p&[a;\+tMfjG5Jg^.:5$Q(5_igNFo$OYX9/sn@#VYO8d0*q2`22394BjU;;aV[U\AuJ/%hBI9,Pp!hCO@]A7ni(Z +L$TiV>*'C>?JKVT\@<]A/l8e1-PUn@9'.jd"UH9i'3^:s:\)L#CO5jm,e2eDiWq*e6t8Y(QPW +"t=Xh&i;*PW3C8c"[iQV72c@S559`&5CuBR:gF8[r#3tVMWAn_k!Z1>Rlul-Yt)a@:TIX6[# +<)T=K@P)![EVt1iaRqAuKDG$WG`NCD*"j5c.(,O(t9C*0e!a*\4HTTnEN;Dn0`PGsK:T9W]AU +JL`rE!K]A@;ICl,Bo"9KTHKoEWp#^oOh,V!H5&r&72*/m@q%KVs?LW)>QIN>7!^g:VA+9b-4W +3-o/=i:OHjL4T=r0V;i+ul@B*nd1<-Lt^(#mKm]A7`Rs%,iDG-c[_LXcFK"IA@r0J&-gYrUf, +n$A3;p?KI]AlbTPqUFD;oqSJZ*W+c4EB.ijR +'n)n]AK),Zhr.0L"OE2X$SigfF;YuUs;d,QbiL$5H=pqNZNRVOSc94m5.^fLD&BhK6Fhl)]A<1 +5CmeJ=R;^Xng`\o?X%I*,"JZI=QJF^rh_(Aaj>p'Z+hiG,PRXh0Eakl_[Ur9OMi)VK& +e,2`T5'+\mQGn2N&dbEYrCL87frK"*:?J&&oGRME'!"nNYL;X?`g*5ejI2&5aROIZsekcgi< +5=h\.CUP]ANb)=NC-qf-m8MrO8PUr=KHd;)2Ra9XUd:d6i'fu&kioUR5,)._VLh>c<(,OljAj +r*.VD9`GfcYPLW]Ap"B+EW4rK8^J"Os>7B0h6p(B_LPO8;bn+`Sc8C[pp`;HAltOF-S!e&e1*^,MK]A-q4VaQ2L[+7I*q#Q:H&BT$*DnemD@F.UOLi96`9p'U- +9)J1FHCMdeW"-ij9AbPA^c0tj'JVkVQJ)(;;p"<)n7V1ns%3hd'"-uD+?N>eKUo`^\9D/RAo +o%ro,kda^,1spXduf50BK#Y,di[=Wi4([J/[0H>g-Z:";#`C+b]AC`N=BpPYG+ta\"2BCKafd0R=/Cn$O=1LS?L_On(XH64uLLB83_b^o+,bdR+aoPH,hKe.` +K^)\+l!8B&[G,h/"`8-La-G:efT-#e9MSD=#-KE+(9fj<')fA=Tl:'f'0[YL2:S4m5mep)nWdQ4Q#?toB@[o]AF%=kogsJMNk*Js>1Q%$C]A["&TP$ +Xl1^0#oQV;?TeouUDA[IbfZY(/+.MNH8A0,B[f,_4h_R`!%fMGD#b9TA]AaE[u,K,X,nQ,emH1i +M4ndQX0o*R[.^4aZtUgd,%;j??`G%'2nPd(/.$%djUe.rpg$dn&#D)XHeL-0E.J&h/i-A-Q9 +R$?eKq:CaVOSdnc=uIU_\^[aXb53)k^Snqi`D(Fn*[r8Q?XV%%feem/fp470MUmf/2Qrc[G[ +PUnpb=fiB7]AST%.FtqfrEd^#j[^!(8r5$gjJ)-Z?dR]A&H6$q_T`7jRB+SUknpEd=V^A.-h=. +c.YRbU&.Im-_NCoa-\\%M&tTd\;cK"KiSahJQ$O*G?Wf%ClQlj,KeqR(1C:'e'_iZ;*SSc?[#;m1mMB$aM=HQ'iNO@52s>l: +%fr$B?H^@63pdP#3+(0KtgaoeR_X%!qVnW=,uEo:j`K!dJ5MiGiib.`AVqCUk#^o@7:mp/EY +O:gS,A4a@uc<+X+a(IK]AChFf;#p#\]AbX)@?6kf5%`gFX%4Dnj84gV$kY*j9sRV?OZdW*JJPG +q:[Bi@S"k6QA&?RW.-lP<.T80G=%>QARQNXCK&m>$5HXj7V!A: +NN>#c;3i-ltmK?*,HlQCECcAK5"r*,o&1O;$S>)Y`jMuj%%IWH_e`esOR3W->-KdQFW$^Y>3 +l-Hh+9$H`ouuOVL3:"MS^0,Jf$X>7iS_uWG@)W)elo%T/!oYH17sA6U7kgKm.QlC_+It&FrN +p9sCC7n``Q6buI%b5q&)FC9m,[uaetAV\T'j=CZS49p@.`q830FN]AqW7C2B-s +H$N5ob-5SZ('1^irA74:-`JR7IXk`J;cs7MG=*t!-#k0g +AMSJ,DXREWKtJs0\OP3WTAuhGe&(pH+YVf/F,R2`6(AD':'21p2oDU'h+dDu-=qJp$_S./(8Fs[l_X5S7)MIeP$Nll(oX2Fhs +ntugJ*.g[iZJ:M<&-o3WjLtlL.[,9inZ'L1T6k4*4FS63=hu^%sKBCbl%,El+P>R3`:oi.oo8oHb30rH]A;2P.D`^\PZnb5HQAp,o +kN?n>G/+%Kfq3_A4`#>F]A%59niSnVZRY>?";p(q7M/"s3Pfn7%Z%q^MYA$'Fm&#qccN^_1gb +'jS\I/W9K;]A-&A5*E\b(uKC8MmI3%9a"(.$Yp>]A)f2A[0[>VA&u=4*CH8cTbYpF0uV)(R$qs +9^SP6]A57uFfc.m3Y-H5=oA48&m-^.L*]An(!^H>r)Pa/'C"]AoS%P0Tl1E$L$X1-&#!oRWRpb/n`lrftGlK/6h[#;n +t0[R7'LmV!#arg?',^YJ'ts;A(\E,2$e@ABQ5R?5^GM\aK(u1@f-'8mQm +OE:Worg;jQ9$P3NhqB*Tq5#D4Y%O7C]ArXa[)95[qD$-2X0;uiMBLg?'-MA=uf +?=!\_GYpl,[/=Nic75PQ*=G"M]AhJEMrS@7%ucp\='n7j#f)jG]Ae'!%D'tJY'VZjj,!-,W,e- +J9(-Xh&QnUBT"?(t+:d:."!MP=A,lYr#!l+t.a`//;aD^0N3?iAKIoKYmBO*57kG*k?dP5d& +gm^$@n2_6EhJeuFG6?,o-FiNhceG?F`b+]A;ki;^?ItCJaVjD%_^A??%El32e['FfLC,pUE>> +KrS++LP;musMJe#e"&6FdiGPc^]ASN^>)P%ck6^-R'q@GIQ1qHR=RrMah#/hk&N]A]AHKKV:AUJ^8(;IqEJru7Li:]AWbn'-d*I$e)EbUu[cJ,9/Pg +M(#;'7l@;@-]A +.;_j!N^#7)[`'(f.]A,dc`SZMflG`^R\^e8@6rcP/_OWs;7'D#D+4RG233*S)'[SGI]A7W?>DHHZ7X;TYl(G">]A.Vq%lkX(,IZY?egC95j0/7:mA-?pr0(j4B5W^fB;n +jE='WV!0N-La9D246%GfX%4(;#%+!`$l'_8G^F&!nHtZ)KgMMl%HQFS;h>Sj,2*t,`m/DE4e +iTI`*ol^!.)h4BIo9/nIGrWJDkM\phg/;6b69(@*:fJ#("&B]A]A2!8(ab0q&JS(-%pGH$;jmS +i[oo\cNkbGd:G^18`Jl1#Q91!X6@15R=K%RBS?8ut9K[Xoq"+0VGKZ\4:,,m)VW8oOlte*mn +$Ui\'+&.1S3s>KRO1.QGZeJqa%#o2]A6N2/Sc6?#+i#UoLW,p:/GCd0MI74f=!;= +Pj!)X,X@5gZG,)6Q@+3%ffHal(+8@tBYhhr`e\2$(Z/Z6ag?Y6Hbk-!ndpAcssCAN;/;h:Pn +R4$`,2Ce"DhF)Wn]A]Ac=H +q!a-KrSs!]AA7)60/)#Vb=It`jZ7GDB(q&97#`u@R9!lb.[LM5G$\5^9IaR[!X^%gG#201f]A[ +HftF/2..F,oTA9[;B,sQ4O,!/TI`U0fe=)"S>gFrWh8j!A+=G_BrLR2D(HojdSZbhO^DG#TF3"nH,Y7Y-%N^lF(YZ>XA)_0fuV'a4rSe +sUWD"0er>gO5c1"T>H"j%SrEXnqAJh_30$):79J9W@2X?!RN3OoY^peE^(]A346VA0.8/1c,G +nXU&>W&0p\VOK.lj:5(?u:R2/-?Ub*dt!h6eQTZjO%-hCrAUkS8l\$.7[#^m'KZHk.21M=i-mMfgu-JQ(ChijA*X5 +N@7/B=>iI/nIRd)gZqiJb$8+/,;g(1a;`&l7a:.-+Bp^h(XsTajIiK$PC5o>X?Y(J:P"a,ST +J?GF\e0?CEY8W%mpn9[ZF5K_IYZNa=^jW@8WlLRJ<"P,DF7A*Err#OU$Y-E%Q#JauM +=OWH11il:CTfR^ET'Y420>^jW-`&/R(*c+!WHXJH(R5#!;k7D]AYBP;k;A=gQ!%C!t#Wn+=i3 +UpH$$]A27*+JGKB%W>Mi_rGg9j$C^Cnq\7b+\oXG8'nD=.VO2#/.odQ3s1TrjVoUpuUsOrqLi +8(LJ&4WZs>2la^013rS?%dIi>oH27/tp[.D!2DS?j]A>t'"PkUXuoCWisZDVfEVmqonmW^5\; +rGBZ8#,c8?H%@VoebP;MpT+>ViDuVk.XTgmIM^?H4S5JGl$F(S#a6BP:o*;<%i1=@//m;i5q +>Ndk@;BpquKJ52.Ugm^8rGEPI,DXppl2?:=<'O6^s)m2+Gn_'\8_a337ZJoL"\]A4\a/>#Is9@2?!V9Gg&lb@AB\jTMu]AQ#gdXHjO`18Qo)`VU +5eQ[N*>/.&+j?lH!N[`96Y1(@St]A9%`hm@SY;fYVm]AZ=Qcb*X;MBL7^+[d-hbSA&S`Z>L/GX +<5JP%H+FRYfGRHS5^6ujaG+G_s6'aJipFKa)SL[fJekcNH%YD_Z(:,ch^Kk`$.6-dTD9%7qn +4RIfi%FSADk79GR'TfH%rO)R0:$T$S-??/SO`&rJqO:Xo?riflr\#eO2eABm^(HT]A^/;&nndaTB$D'2m\V0EhbK:(?=9!I7UZtep# +a`EjUduX+RH0lZV=ZrpWjfLlE2irMSY/Be:kA^YYQ,>_Ysdp6%A.V!O= +aQ$)P.34YjNnQQ]An3S&kWrM^;<[G@KoVUuAs;GU5de1Q_dcheI*R"@I$b#8`3SaW@]AB/so*h +.=1R/Zp0[G2(9Z+t]A\jO8o'[lo37uQOhu&r)::9OkU]A;eX>0lm6gpOd21uItFnh$71=V.p]A1dXgqE2-dl+iEOOZmob_c^NHWL]ApK +/[/A"2P5I^3I_7q/lp;GBs^K[CGK^u]AR9:tH]A9\.HhRFL55j@<]At&^K5*qb0qQj8-cN&/:ng +qt?/N\NS?DbPV(9`W-DSBnUL/rIibB\FDJlaKc^rksm.DA)8s1?5p`u0?H;k:tj2FJpdqRh6SW@.^i6ESi=A2)bO)4lI7j +ONgrKs-8''h8^XMN(_JT"[EqXWA+HE"\\qTTMQjAmFF8(RA@E;B?)#J6ujC\4TJCZ?AXCF^:iVo"47uUQiUT?@Bk/G?bB?) +BVj4,-cCLTS%:>ES7tLCh$GF4o(iBjKm^4Vm/'p]AR;tYf&oF1KBc +,(T5Z+4G9J@PocbhM28Tj#m8P!0k^Qgd%\:0n3mWOdap-4)bYUGrU&I(,i8:Rk<@!h\3mr8h +acU*UK^V6DrDR+(b=.8'/tO2JIA%&K=QDe_T)Smha8#c@E+9'E(\%9HNlX^C>_VL/\2UUs[[ +/0u\IQ4\6C^_)s>FOH>u@LGQgdL8r-$o)<#_GD)?C]ALmTXODj&T>lD(J"B*0=gD1@RruAKpd +OVdT?f9;dE-bGelOC]Afc2+r&!@pRNpSZs$BtQ]AU0nIbL:Gq6eiK,3aI,"$N%5F(a+[XnV`]AD +L6/mWV(-3',-,eSqe/)]AN3==@>\I:h-N_>Ok(#FM1QVC>V!A;![9`)`!U<,AW&g>%[5#4i!^ +Ujoq%6HI/Ek5q0.I_q?$dMM0U2OcFJr.8CgfHEW+8@Cc#-Irb1q_.nb#YujlTo@1js#`3P9A +685K\sKTB>)m?$D0N2uAcKchJe16V+p3?,3P+ftjpJ4beneFj<<,d4RQlK +gM%Ffds7OSaO:]AG2C+E2I_joU?,C_D\9&,qSignW_.=`L0BUXsMMVEr!NacPJ]AHFmlHL&-^) +MRB#Pj$&KkP-q2BuMQf$X[Pd6q/P`8%Z!(Hh]AKIX0KUk0q"NJRHQjM>FiY*"+[S39$2mQ._Q]Ak1q,WM^VtT +$Y&"JBa?8FjrS0Cfm_7HM>IrrU;DK1OS'qkq_se[>Rip;aXN2[7t&/_aY7WSgS*P+uE'7k:b +Q8^U1V\R5%^QF_03FVW5QFBfuB05&)fhR32@AqZFLIQ.0K>J,P0\2M1+t//@F/,Rji5Z6t3s +#*tka(n;Q1,]AMZ%PChUILlX@"M<)CgLl\qMkqV,opK/!lQl7&*CZR?Ogo(bn58HSY!"i)Uis +B&[CK&Xks+Y#*SG2+*NWj^Qgj;$S(s$:I4Fb0:0J2'6_;aG,!S4IEgha4NNt]AZm" +J?alDd%T+or#Ag$5E+X,''L]AsO0C"9)_8tLb[XIk/iZAfO5ljt_F,5E@"KNcJhR +6JUg+:Z)]AhKrNm+i?EKD#RJiLc%'f+3Jrcta93*V5K=kq=GiC6_#a23A@bb=fS3hm]AF=@)eEn/>cu#h$n_(r.=2`I$]AW?O!B"l]Al#JT4(=bTi5On#2s't(I/SV4PN$?aXHLOItULhb('1ub&4jD`]A8K]AG4k']AdqTlb8N,g^oN- +OF^Nf*P]AR'JF:CfCp0rQuOIO1Q"h0KQuqrO^te\:sHhllB/4Yu3HOBlFlM`k8aki:7L"R`cHg:4Tt/?)iL)[^7>_"/#h0Eh^,I_&pFr9$ +#Z8Nu!B*!N)S/?XV9PDJoTTbqs*4,ll5!.Y&@6pXe*Ac=PLGFT +6tJf";d_CT^o2hr-$7D@U;K"-qu"kSE:&U7c9HL-J?UE;`@*h2:sQnrF8FDR!05%m:sT!S\$ +dMB9ObB^G:[u4csi(c"X;&nk9_.5XZCKc8Z6!F$iD?oUZMRLa<>>TPuG:*ZW\MfK\o;!]As0? +rqe=^ps#G\JZeMHiW&Ds%IIZnkiNhHEsGVhQfoTt=jW[Ae"W'4ETY\&HJ910+66'h;A"6W"T +'dqunFLEDM2PN^b'kRWCgC;3"IB[f"Y?Y5+HH/YXI35ds(YOSb:\5Ybe%$6r!B[k;@XFJM'd +)KV(0#6(P+b^5cr1r.^!JrI$o!`p^\0`&,(j.qt`sFh%W7$L`$?9S_BI86:EFC\Ab%W]Am0"fjK9`X +GP[1.j_%$[0T`?p=L<\d2%a\u0K/L9$Tqf`e"3An7(7^9Qf^i<#;UioZ$=tnaZ2KHP06"NOh +d#U4(Z9WR_bkj9>PhpgYl^qIO2(ZFDd7\c_nQj(VpjcGR/8'#a-Yu +^=-)ZSs5rCo5BT#R2nfkR_E;qUdpq3JG8a'W[bd/o%Ktr#M3d(VXEN)rE +noL<)c[5$K3'08H`6]AriR!*gHgYfU;%W;g!ZX5->P(WFIqVuQ/:,3bn\*KSk89\DN>"P.-b5 +s&Ie&6P%1W?tj+btu+\(G7PWaOh#E(&Y63('L)i\9GhP7=1A;]A^giR7Z*BY/e#LM``OWg`n@ +YcC3N$\48tbcDEA9qRBW-f(8"#=DdR]A7:u$mPfiXjMc@V_fpmenCPI^Jb:ru@5i'1&;aFG19 +iG01OmfRi;O0V_A9I't:N6[F%@^7S0OiT.N&YaC`FZ]A#25aO`JKP=0;ig'0TrN.Fh=Oqc#R4 +h[b%TE2XLjL4ZWguiS3[h?$taCjRUI3@!9as3f5t^dkQ'3(0-9R-p&Y"D!3EZs/W8'&M?F+` ++(:*:6gnUrMb@"4jH39u2V\^KoPV(,V9CI7j/@np_7O,s"Lb(>qG^<>0INkY`QuZK7$4CaGc +3))b:Qi&4F3IrVl:o8"Z2=NU^tEi3RF,aoCKTZgu<5&V\H\se'p"2_VpN]A8`N]ADMmnqG8pZB +:nD_[PG'[E"QZa^!cNRNd3u:NKauMtObjL/?M9,:WIP)#N^\OFWep"Rob#P1X'N*h`*Ag&SZ +J-Y9Mg$Ts6[=R%CB=Mq"\Es2"p/\"ePNP6@JXu84-/?^"psP9n>(F-B)4O1`B6ni-_2,u4F' +nB?rjaEmTudpk3dCB5P`e.Xo%@$ZMOCWpV,6>HRcKXS7XYB2YWnPH2cb"Z]AFD/r4;XfS#rkA +qUCX]A^m)[jI;Rud"'atCc$.JZE.97_rOZq?mNj$7FGXYb1L+LmNLC5No;4Ztg7=2gZJ:GAWB +RDl?To=!5*;mYm5Ih+DLKs4pTDhHDdU0Vm4Ss0;Ye:mEO`&d%WL%3KBA(N(]AdAM=FgQuD\e" +N#*Re)3NTM,9<\N>!8L_[a?0PT`r[doI"S[*g^3M-`H1_UaQ)e\0)NpA=uhu@(d61uj9",T+ +%]A>j=R;-Ij\PrAK/0&YjjbY^Oc_WQ0er^rm-\k3.5F"NE0aabZd0hs!6qLW#,b$6%*fHgJ9W +gO^gB4&:>k`^p:I-m",IZ.,g`V1DDP%JS^4b'BkW7?p=[!2%SK`nR>bpLt`c(76"0& +j/H66-kqlKnBSS[7j9<=9iiG^>P"2tJm!Chj>Y-(=r:]A +N!RS$'mXPSng]AYp\Qq$eAp5ZY$0K3+UUlE5Q8J-@n7G!7K +DuG0?08p',8fYA(+]A]ANkHJ0Sb6nj;1GrC#*F1R&6.8;J?(]Ac8lF@,cKP@EC,*aki^YA +.!3ZZ*n.7K,m$+r_GLV+u8G=cMqQ5Nr^jU,8+m+^W)4CW7XkDI@YO9N3Gn1LCM+E!W/0kd_+ +6di\r/sMT>#k>GD(N41]A3UaV:Pk6kYnfl^*^5B^sHLaq'kH67]A\c'%,pRPWi<6k>8^Ccn7@) +BIJ__W)XYFHE";YZa63pE[8Nd#(5k*?DH;WririF+h;Q_\#LgZDA'#CB?<,PIha=sE+]Ahf0) +tZ)Ngcq/G>QB^V3mV^m%^',@m5$S +))gr_b4T!g$&X#/DVe1>ua>^ot'o\&HhYu3Yb>M#Y8H([f,I)h28lg@mY)!1n/-W[n*Shm*?PNV1`Xh`!'?FhZ,OH!oo*h!o1%"5`jNBPX-7)q6 +lpK;*Q'N.H55,Y9tNIjW,ptE1A]A.H,t]Aka&AEe9q6[eo(_&SI(*2a?c)E9O'=p?^*:VO]AL;7 +/(3E#j-0muIMgm067BfN6NLbNd5f3,!.+Ol#9o5M`'7&;kLZo,r.8EU]ARdt2ABZ%\H$+NbdR +tYFj3iGb<[2=#$'^(;[2T^Z,1*B`jb[uJB^ccAWI(cdI=41&/:7AJc\/D?.#GbQBd*9$/+&? +1X5Vm&(,nF3">B(IT +mfd%Qced>2.k/lUZQ@L#O?=]AA& +t*+<0')7olQL+0H7Vq#M!\Y8dA7B;6HoDH[>B9=p'AW@/(?>'%M>a$2ZfudcR]A-1e/b%L,E@ +X#M&bKr9J/gWmuHum8o@n"CIi>:@km^pT''^+HGS2A."@kq;hKho0u3?"=r3>MYWo=aU+o'h +ZOPb,rR>BmD$&SE16[,UX=d@rO*u0&?Lm@-3d)PB$52@aBuqg!L" +qefV?HJaC),eN>Z:'f$]AXpV%g$03iMD\N]AWGaeX+UoG?s<%'f?gpOE3=InMM?RS^sd"*8+4` +iu,G6qOI-Xr*U,TaG>fDH9GA-M@m2LotHIDOAJs+5EKB$Z\?L*]AA=9&-MLSEu&pPdh=a/npY +V/TQ50>Yt93o>bdg\)(mLdSCGXCApO=8SI+%\Uui]As8GRoX(nTa(-Vf_lF1,d]AnYE(nAOVoj*(NVenOL@!F<7=_IP/&%jjQAft@R*K-b@g>gLH@"p4L]AeIM/CWF\O +=%Z_TJOc=YVCM9J/BBH\nA%K0[Q\,/D(!X'u5=*3b[.8(;9p`eZ[7ZokWnPl8H\rL+s^k6>t +AVilM33.Uq"1"B?Gc@lKGgC_qlom4@+t_$/U:0L3>3fS7r0X`L^nlne(;P]A>=(jMJAATq=BW +2&X;ue]A&V.lFE>`PkRihB5JTn$2ue&Fh/#eQ;V"/6h_1r]Ag:8SF:&"G"rC"4&kBbLif_TsYd +c>bTrUk6N]ArF)'.1YA<;7HCCTs?`Gafqt9"g^n=G_A$;:[s+OE.m"MRi>8;bD_@"s(b'9mf% +k`PFtq\X5)>6-j[(BbhL(%7;@'iHLa"OI.>:_W0A-pn2X9Rji#_!F+t=R.GpZ\O,hmSE +GAATTG\G9:8^*Mg.hbj5YRT+`8W5S:=4HX9r6,t7+h%Gj4RKTMP8B]AmJO)NpL`ii*gliDK*P +Ao'Fl&MrRmfbIfF3Dp#@]ATpihqua^GdK[B#53Ich4Dr,s6r^%\Y>X]AI?lWN#Q5"u+7 +P(uBuH57AeBYmEQh6T+h:sn`^qsAUDrIEkgqA+<\RbFfrYKP`Q]AZ!@G\g-B;qN?rV$TRY]AJ#l29"4hTFIDSA)EBSk'Tj_KBb@O;ffZ?F%ndqn[N-KZ"ua;$ +Fp_4oAgm_PYIhdhJo$o83U&^3,Y9\m%-/PGUF:,%c!9,_-&So!u?cVdKRo(-\uia!a'*p4/M +45>[A(ILk([]A$q\T\<>gC&inurPOm7@.ifpb/M6Ko5&a_j5T$dSb[l#nIUt!k&?OLZb?j*\6 +^9]AL>lqXO0!cS[U`6/hF3k\4-O,>,gXT7dXALiL1W>_4:9$1*h<84fO$^X_X4=Cg]AkdedJ<= +u?F!FFB!fG#4mk?Eg^93?C4&P$;E@g7b/`)HkF*pD%n:kmV_GHiG'NPmd+Bhnf1>#VN_j0g; +6iWs48a:j(c/;L3\=m21*9cC^A9*3Zhf7_CVYWh@9ikU_tWmCi5S'hS`?A*JC=OTQOdVAjBZ +!^@N!32^X/@pF7=(t^\]AQr$ZH^oG8NN@,.IsPW*l +KErJN%8=E`QMS6s94?qo\U`bDV0l'8Z6>4)ndPq^25(Q5Q@f7m3]A38NMU +h:ssO0FJKTk?5#te_1P'bI`O`]A9r'"\Z-;'Pr]A//f=lg?`;4g!6K]A\2bs6/IaB8nh\m7-2f> +@qR2TIF/05QB^fUN<]A"/N1fQlFf7V:HS]AM5$he1mQMHuJc"kr0_[d7G=mku.JA;'TR);RT6m +G!fWMmOU^#uLqm*72>A$auDIm;b_p]AG#Z^:>DcV0IX=OphBIJC,jHaU0bs7h8=3/.&"r**mGj()U, +eJ;aQ#0@4ctN7H.G)PP9*d-o%M]A>`7&uj=0C8uZgT?us)1W1o"nRN2<[RZaF;@X=nsZ]A^[t1 +_o_CtH4qO@'ja?K\_X>A%R6Y7%3OjlR5jY*)2L2GNZ$m&/o7V;pnk`I#@k3iZ)3[l5i:4YV" +)>(6lFq/'ZL-m_lpc8VULH\/'RIkF1KG(6S1:*O;,L'>Tj2`A!8N,kj:q^:0\-\YXG\*/g39 +reVb_,?J9>g8r)R2\PdKL8"u$7!ABUsMi-7R]A%*Y\h#ehH'^H1Z,PQpn(R%beSnSMaMhQ35u +WWUU6qu^..XFoRKZ+jYl62'hLX*P'fccWJ1ej0.-&^:A=Yr-Lf!3"eXor8i!TWO3#(sdGB&\ +5L"=%?Q/lfh>1<3ACSCrrr8;P.HLA&cmtg"AfHBiIR91^`;PX@s7T&ujnV)uJpAOkH/>'Z%n +QV=A;'k'P#I>W9R*Vn*4G?gW%kp*4!:MKh5uR!Q!`R%t_d +k(-_[su]ANka'^N7qS*rhqX)(p6QZ2U<)9qoao4@9d[e9?K<0;Tjm8l$]A`k$8Y1j9oh#W",/G ++daTAVf$0qNg."ZTVt$BS&us9PZULk2SAboKk2#YMo/t-H1E6IG6.+t^]A)'As68I":UHH!Y< +Vp'P>=BdN:F$PpRXSjS=PK/$`eXRj;1%fH<3aHZ^"DK)jST*MZSuJ'FC:G4`KI=ZIq'%fsfm +$1&%H%RG3(90-q5UJ9tUQ)B6+J\_4ucfF1'e/E(1Q:7A)!^\Cp6^57O25-f$FnESu!^$G:1^ +]A!8h%tAVUXS2*Hr8\t"k4ZTdVR0qa5B*rKMhiX.,LZ^)7B;s>#8gnD?.7;+P^/i4h@[&_TN@ +^R)cqAkZR'">kUkYf3&UG:WA!sbs&DZn"p'dJR(%R?9JYVc]AVQ*<64k4/#gYS1X1XIWKE:;[ +kt>\O#no(VY?B$@ep5('G[c24pFNVWT&]A/;hi*rK;E@M^lWtIuZpTYRaDJ9_KX*[)d!'62^TV&_D:`c"\Y+5,'([U21a>*3`UL(PZ$Ni +@l#@-4CP+L]AE'JTobae4:`(4-h@e'0("m$7Y>DWMiDT(s]AE>T1%:fS+3ke?37*TKi0E:DJiq +]A.AilQA0O-eA*6D'X;-]Ag9ENC`3.aIo30[7/;HOW2ogoYma]AFXIOPerVV$Yk!1I9cI;&ZhA? +"WjHEf]Ab,Y:r%^qjFH%(hg8@QSHRk7D3\"rmeAB+1,1dAF!j5R[mJN*O\*nGORN#0'[$)bie +=>\ZCp=H_$__mJ=HaqfHq#;[p>A\_B%0?H5f%kpMc`)m244L39Stbk\"*k;.AXj3<(TQrZ8FOm?)mQqE@E%mf:T +Th'lpW(s$P6Lb.d'1`n3i(YEZq"'<8iZ;XgiMf,Kk.>@.rD27"tq"6ZG,"CquS'6TTM'/.!(n! +,WKh,n[cR4IJX0\U7/u@-kj>c13\H5"Lp,cANE^E%#)ZGquhr:H"FmuK'@I'bI$R\"Qg'N:t +;GGB7pkTPoGIV8jd:oSiE0M+WaUe2HGT=nj,m?TXH3bWUr^dXq:oIB.Lb!O?PA40JjeSUB%I +_k[<5X2RP-%oj==;n/n$a>%VWWr;,f$4;gk)@=Qpu[as\%K$_LsL,%t:X-tBr\N_"?Yhn]AtK +><9e92S/\=VN$;FX[$,)n^V\l@:D.6Ef"Rmaa#1SVkq#8c8i$?Aj6),Snbf;=geh4mU]AP6*? +!&ldk/(n9;XkE3ctM[;F![@7M/XE902d_g:BJ=-k:"HiVrpgCV@fSF9G@B:_9Xh.aVKp=cLh +i#ZP9Z9M!6I]AE[MNu]A\tYHQfqS@"acGIc=mFt:k6Y7=`6[uPrbf;JT$H+.fTCg71AXA/Q6\3 +"A**L0'W6H:e@#tt`nMlfS<`c\&&0cB[1@>HWALpp%m:F:Ie6,*dQ>44CNi(1Fa$3K6;a1$; +2=7@5C9An>Op&g4N.W&D0%>k8-h3^[i1'[+2b0WsT7I%[-)TiU\1lKT4D8';qo??#BZUGY7\ +_gP5ZX3!!C]A_.<6>83jV8,M-@Dcmjk/Ysu\1+^G>V*4N_]A$9"]A7N,VhCa'(=d_+Z-CN3ARa# +r>8stUC&'CE/h3OI6m,+;gL;dF!qKUN4EcapUahp:V`]A9@bjg2/Zb`R@Tlr]ARaI_.smD"";uF%'kN[rGK,\65WNFF +Up:#PXWFW.4<'s%Rb5`?@(0IJC_"aeM_n7(P?tgN?"')FAdip>k5&O1Qdc%bhu`B/rU3_I*C +/,;aAg6#Q1rC_d3'm'o4VgW]AU,hn_a70uUW=1u7M"X**BPpS_T>Q@SnfRK*2C?X>nleEp?8; +>ZHbKra5O)q;'GQ*W.$s,hU"k2AQ'mB`G`1V?:EVf^`Ss8!=k(5Z^]A4u#3NR\.7kscl4qk6ESluNY1O/ek7U'mH;(04'bu58Pm76Ym8T.lVT$t#`sLf1V- +WFG3(OC%hmH61,mNh"4jU)d-J.YE\`Ye28u5"tiHGi1_i='LPEFcch-8jL%_9C(+:oDo(:`:0qjWpC:OB,_4L-+G#^QOC^"qY2u(EI9>lab0JOe +%u_Y^8$=*&eJHoDSL?>%tb^X^,K^]AWkP$(CDTiaK+l2.?)sNmO_GbuZaW^m:Ra#c@Z^q[I^d +pB[OT(l2"B6J(,8Jj(*)VLf)hsA0'a%9HC?:+#PF!ple7Ik^j!RTOOTBr?0EfVNmr"?.T`)r +hI_U.)6F]AX[o8Wi1!C0"!N]AX8SaNoob>`A&93%CmIIeHP.I\qeDAp(AlBO7GlsLK#NIDSBG_ +EN+_R7m%V]Ah&sd\)MBjaO[fnk,if3o`tQaO=1dIJ+$+*iP8sk/52hn&$7sPO9['/1:]A9hWUkn`FEadfNSl#=E?+mepE+Q1bBK?&%`C"-%8g+dWS7&QfL)MKJ/4T\;*a9,o>9R^A2ZT?]A&qNLrUq8ogd?iTPPJ +,O`@p.]A9kj.>"@b3_[mqTV4RV98,DS&^;0'%f5L%gE?3AQX^/]A"%9P.[7fC!d"DKi2j1Jdc92#2F(IZmfoo6N@@^9&Ff +IF*V^\[6I9HuJ.HVp,5&0NTcH04S*Es#Xs!tF!)liTT]ApRaE#QMa-K7:ZNj`0%GcDm.n5XEM +5Qf&Zk$eA4f60+20X/(_GgpRgXoZ%O$ZH)j,&T=I&Ec?k%STpB;.-HZ=a77Yo>!&VJNRZrj# +5Q4iHBKK(R`UJH4ej2BLeJF"Hdq6%2fo_"BeeQW\i!7+(%4XUYFU&.-WiF)=qHtpguCqRHLu +A2jQ;*AJ'^X>FK%O=_YnF-10DdinLrcffG$Ia'rJ'9,U`*`TB$Yn6!L(XgLM:/Trj"PqaCN4#5%-IY5jrS$)k+[?\2L1['D5sXp>mBCVNu;=2t31(CO +!]A&99`g5c:LD5)mBhC:@%NKVW#0)Q"F0Efd^nec6lT#)qL4@IDG;`%fT9CRQ9]A?3>hO +.R6r_[AUWbbnYNkRm]AK&fW>e2jHn'36\2c(Y+>oP`C`+^E,+W0!$_-Aehs3Oh?kf:;Qg(AnG +cEW2)qQWFB"aU<4F"ZWI5_[+9ec>3K?nb*cGL1,J+DfeQf%^QI.mD5`#-_AaLm!"g"D]A6^]A! +;YI1bGpKe?"FT!N99qjF(Y;OlhMh_S(+`1s= +S/3l[t3pU18cb`RA*%MkU\>q=>5]AC+W(kr1cfL"C2^o=;q4,$L%#bI2f86p`in"d?cN.[S,h +IXO01i*ps-bY1O;tVUK/kiL&ZaACI64#1Nj4n3'_%,WqJS<)m#826^PW$5SRfJ/rG+Fp[YZRjXf0kfW\si\eGt]Ad +a"^3)g;9Hk7"(aJ43f3U4(aETihUG*,Q)*Ea4=\u\V]A@_\K>)BbV/"s17#olHg2%4qmR^7DN +b\L!=&k9n!h\d#JlpVumNL*`G/@[YrWH?G+11>JZ7\rD$t*,jB1cZ%M:ED)kb^=,&'nML&rA +Nfh`ct(YFO^JEA*+fE4R5cN1k7[JjQ]Aus*EVda+>hgc,d.XtCO!0(!$G"sKhG>CCmhWc]A.nP.?No35"GnpGf496lj2\XQ)Uqr>Hin&F[kC%L?3c[LrmUVf9&l;I<&=0K@9Csp$Y +Up`LheQtDOS]A+aQMEa]A^;AN[C\DOGeQ?\_7lfIDmJbpPhgU"D-WJOPK4f:94SFo"P='Hf=*B +V^@07GpqI+`oHAaf#m?!uOMU"F3e^3U-1ou1i6!k?#AnNT-bms>%Yg_I0G#IrglSQTK99Y3$ +aSIA>O+hn4Gao&H.Uh8pX0#DV&n,RG.R2'tRO\4RMC!BR0@EIFMlm_`"DP"%QP%5_Q(9.ZBZ +Hjj[?3l6nHT.]ARb=c+@\BeI4^eeTtq=P7e +238h(caA[n@E=h,4m09UWO,5A=uoQJ@,#[!?*Wsga<+ot=f8\HBnSd0d(o#/gGk(SR+TF;;< +%!SoArA^Ub[HBr>Kc?;gt-FbiK1pE6W19 +h=:#6\8BLbT=$#^RQfN9lJ_*j"5a(QV_Q[AdQMY?YGI'u_4(E^#P7qsY4ZSI/BkJD+Lq`ne_ +d]A8\=g-b(E+?oe*F&4]AGG+JaND9,h@]A,a@CVM?B@hbQ-Q-9`NB/a+-L$!0M3Y($di!?ofio- +4@%hGf@F`/fCYpK;VCtK1=CR`5#2*cc0H&DN=+g!C1;a%rMcd,]AoKZ!O9`JO+Ao!^:"i<03 +b)@X5L802"QO?PNX9Ga/:')g2=]A;u]A%.eR;PD43U*Pq(KmAig^12:1).rUkXD[+HZ@8P#;kq +oU?SSG?6K<9iSFE[NGo&<%SpYeJ9FY:lHc4h(Pr&3=cgkAnnA"g^pbA\apGVF*=E%19e^b4U +Y@q8PkH4@ +-dpCL'-BU?g5Q,mOFP=M0q:GZ;pP1o$^&W5hI..7dChA.+AGEP_B$6-A\rea#&XN8r/F+NVJ +aZ9Z2N;G1FKsT%Df9;6JDS,%]AUr++O_69'E]AB6u('8S-[(-:T;ML[J\Z'X4oi7ZV$j?4X!"c +"0glGX^098P[Gc;al"?Xm>,6NHJA@IVXSg\&8)7riJ6Ht!sbKr+8+N?6K6^N/u(-"AlgEK-,O#NY=&2t$OLu +gh#5&d=ASd%c>n*_),b%!0'I;RE/n;&Oe_-9'&L`OH87Z"0u7*@n-D@O[m?"NWW#Q)Q^a1Xt/)>N%T11'#O$r!jIaa+Y3m`df+h +;[sK6#Ef#?XdT]ASc^B8"^g/=Pl`^mU;E5S!+8u<;/dARM"InT-1A:B@.C&)"\>2+>DZo^K.[ +q^S&E?5s&h'XliE$LoP3!npXEf8l-1bO4iN_AU\6QQ*UF*Y=Mui%%)Y!ieH,2c('4W6d#k1M +@G&u)A"Wr7%mLO\mkq."0mMu39=n?OYQ>bB3I_F,WaD=U1:inc=ph9*I4H?48;6LE* +[-mj-DlHR:=d5#JS2WSoRVdX_DcdHg^!Ub& +jJ.mHU,5W2Z(]A\QKcZ9WK!=MO]A3c&^8CLCC-bCdbaE;OU\_(2#68u!7p;A.tr4ARM?'"YNJR +>-;pcSZ_I[nIP3Ncf.=XREU@ZF(kaDGW5PWPhUOic3fuAMg^%Ane6?\"]AL&6I]A]AT5G47a>B4 +"*eh-4%P8D2D6.i0)@bF^rq5p7)^$5u>"k-JG=:J&WV]A&N4-)6'/3l8Lfqg/o)dMsN&T;lF^ +>M\0/7c(9FbQjI)Y`(N>^\?pka5F#UB7q7M4RFEmXM]AKX/ +/*gW3=$R"oUb1W7[59<#c]A)(qm?iT]A;@.(O\C9;pSc"!2=NRt7.BUr`qaICLrF;_"/Scci)F/OCP'jInMKm*e(\9geTGa9((9Nn_9V'59NKNZI[PP7]A8N32\^n0!Q:l%P +;:.5`eQ'C#fjg58Rn41VCb`XSdoEWSWA0]ALJ=/jhok79"k4.CT_@i2;K#=d`ZFK@eJC`%-SP +U5IH5i(eBj'J-)76@Lbb:YMU^);reQ#uc@'gB\XnU8X9T1kP`;c@/htlH"tlAh'^@$+L-2"( +675FUSY$(9>!?aY_t/T*FhW$@UhV=>M'7G\ZOh6NLi790guRD,k7\^']Adi\OpCiXtk)kAAS, +L4pt3)rd`UpN=Ff"]AHE# +e-;Jel(A'#%'K`:%`9LmD7'\3IBeSeRiK`qBR@'c_)7"Q!MBPGZ+plX0n!=3CKb6\dkcN4N= +fIYj&[m/As"lc>_^7/*a3$^,4umK`+e#T7SQYr!mMabO-N6VZ^c>QKIqr*;F';i'mWp!?%@, +Vl;\)V.VoqQR5c(EL0\(dH&pGAAcZ!=H&!ie"Y%k"ILI"IPgIkq73$F&_%T,KD7K@_jf#%k4"`fEU[FD?R*]A^(t(9bDl`VYTh^*q[.ZVbDM;'k/d\Tcr-\T4A/ +;hMFt8uVP\=I4^`s!9G;otA00=6oo*If"ubRe_9?`HF-oFeg8mttUs'+--emNpJc9o(O/I0+ +OkMf!9[N1aRo&3]AOi5i@]A\nVkfltT/Tall$9]A5'GmfN0JJ:EOFGaGJ)!0k^C>V*5QDn\f`6b +m:rl$W+fr^)#1^ILBDM1=g0_ +USB%d3%Jp[R1Ae[Y.qK$;@EJgUHCO\\JL(K8k)O!Zo@VOsQ/VQ1\MfBn4gB=1%GO4]Ak,G(*% +b`QX[3'dBo)ABur8HQ#[uBhANGeF2$^T5Q8:h!qfa#$jnf6!rD2NS[a8hkn/eUGC>q/B*XU7 +b"),tF/B/r\_ZA([7`JP(iJ62JUAWSsdruTURjSbt!Kk3[BVP#3R>_"9BmjoK,2@[Noo[U`o?f6E$\!= +RB&.b1JC9%J!SYcNWsi%jng--7R!;Iseka^]A9u?"Z1IAM,28bMX*T*"O\B2dgh8QL>YA,Im( +DW12L[4M]A9gV.1#'G1b+/_Xt"l=VJgm46k2C7Y*Q#eF8k^$5pF`M@p9= +*&E&/t3Z\a.8):N>,tV>2;XOIPdE4`ar:'joCE#bOfbc3^7nMiIQ-eHE2M2Epn[Q2BBYi&;P +,T,QOd:%Bp7feUH["&:_2qXBF=\\i>,38jg,*i;3r%i"NJtN)tV3L/,'u$,jkU!NEo^.I2!' +DZP9(2KRdaraeO'_B=VfRuD9P1OV$i5'mBn=trm*)9`)p'?AF>#<,;gHhQf_UJ>]A.n/Kg+/- +(F5lXqd/:`[Ye(UgVH4\HEC-)%V`:V5)X".0(ERsESb?31Q:5VNq=3\B1d@%#'f#kWcV`"1h +)X(D-%rU^uS*5IP8FkFLk"e]AZ0\h/"*H&0G/p9=VQ=cnpl,aOh0o#t1'h:72.1LM=+VQ3U*% +=CJVKl4@O8lI&pi&Mq6Rmk_C2u9(+!#IQtVQT8`li>qJ^hL-7M5cId?%@:?jNlln//''.S.5 +r?:'@J6]A3/NMPL?KLeVN0i?('WngP1[UKH2XM:m5q#JF$Ad'+%lnmk?6,WDYAo@pu!0YpndS +^fZQcop!2V(DR?8_9gn$+MY`/?C1[I9#PB!T2k,P_r'h9#2d0"Ua[92_1to9b1CR*t +L;]A43r!oKc*#;XNg!,.mDZ^h3X-X,K[X7rhTsDnP1G9Os/fT[(MEidJ7>Sk.]A]Ar:;?X_Kk8& +^#PF_f?[i9!msY/H-U7Xi\Gip8oDta2[E8L\o=Hu8]A*ZAei,RDZf-MMmNRsDTjl:6TZf<&*bB'MXkI,bW>6M"A"pJO +LGXRacl9DRZ%pm^/)H2mbdr*Vb.b?F;tbPgCS@d^NOq3mlY6*[!tLNU2"JUM=B51Lq:2,G5k +*NU7=Ndj@R292HY1snqMM;+NJO,$G(;gMBK)W`aMlVdgXM@>7C4DJuGCZ/cHK?9"G\[Yt-OX='J62VSpB(f +;#?u/Fi>\2N![e;4X9df"*+.&%Be8n\]Ag$1=qdA(MHnu%FX96^M7Z'=J@H8tp4^BZRb&7a?WGuIDS1BQDOtL$A-d%Fs33+KAH$J<`/Y&U%_;[g#McT[ +6XACtZZ3_aAFut&XUD9\@_f=a+GGmDMqje7m]A]AoX-QURRDX12c]A8+:?]A1T))YCSPj,J5Y5o: +S+iK79^*0EV9idgd?&Z5g;GU#2a<<,(.V[qa-0=O."DSbb5%a]A(Z9e(*\u:ha;N3.'iR65fG +^m-tZ-/M74H$bd&m"X(_2^:oDBke57sp#iSCmT0DS_Ouo>N+J,)Q7 +&#=hn%po\A*TdoG$C8q_.-+&p6GjH0p_/3-gH^%,Je`H54bL1FnsHkqRY +Xo.[ji5GnB$%_5(SK);H?PpA[)c$!)=J<2#Imb$L]AT[;6tFP]Am:']A%]A0UQ&$3Rl]A60.iB`;U +!C6M:V$e?[-=@!s`L/G(1"0BuL$N("gCb5u0kIF`J=#'+=Lnu,Bjbo^q=XW"rBtF-`R5Touc=X\-dQAqK$8n=dqQ4WsEntAUP^o.\M+i$d"9G5m#neRfigA^s+/1@%O9Q1Eip<+.g! +d=]AlCr$jqb*bW$&tfZCiFLHWMI5e%kFCZsnSu\hB7bq5Fi^GUo("i2GnIl]AQ6c\C_24PkScK +W7)u[Rhr`EU*SdptV@UBsT!#4>B!UcWJi3R[>n9C`@\.Se"Pr[c"L\\cjAkGX70V45Barp02 +rj^R1s2sF0r4?OcEp;(fB@+3=Ui,=qM(=4kgWI;jKN7.7ctfQ*!aW%IlAI3$'9`;PE0KE?>Lde&H5[\Y08`2b#JMbjdg]Ale:4(nDJKmfS]ABhP +XG2)3)qHK9-B1l0sNE;VdQngo-A/P@j$sR,4ph!nO?=?8&g`XR$E3+[+;[`dMbP@VD7I1-'n +OqN+q">V$SuFZp:P!6c+@P/'(r-Z4/VKC%9]A+:&o.gV[fC;=+[U7qHppa546ok`!0%oFTD7^nNomr-EM"ulWA,:E_e?-ZV'Qg +`2A@"o^tS&.i`J;HPr4om(LQr@H@p#;JIY32?p$#QLQ.U\s9`UrEgSOFI)u<7_(L(XX`>tIM +W.'Cc5M$f@B.DX#jm6S/BiH7_6&j4FSom8/]AZNJ[5>Q4r]ARSas3eimE@Moi1:#6Bpm"Z"FOT +d&d+YX2IW%:N]AmV9@h;Ne*2Qit*l2ZWMIplKR"0>5\=1IRC]A*KP$)2ttO*L1/O<*5/m;V;lq +Ne20HnSNf"qfmq!C1LnqRSN#4U"iD92.Ht4"JV1dQAG3OkhU%>9Nok!Vci4Y<]A?c\IH1ZpR: +j-i+aq[#c6oF%7'bsPV,OY<^$u.Q;YBV=M9TM'(Y`[P\A*J8BO'hh9GNUd3D]A1[*G4K(#U]A- +rMKV>-SI^`M)M:/^6 +ij3KA\C=Ge;q$q70h`"m_'45f-Y2EV_UrlERY.tmA!8_Ai+`0 +$;5UfP7^`3rD%llSiX"TQ3n"AfWROF^mDQdC0'1TBjSFn[]AWT',EH"Zc(dt9`Xnq>6(l$\.R!,7ppOc!inIQWp +=RZ#$Vj%uoNW=cdpBA($?/#\b`Y5V-`u$V?RO@,hr&_hq`1iGgL>2,aQiY>ii\@fIX;ho&LOE&@`HK7D3a0R48TB +CfdB4*P2@7%_J-A9jTsX@aM[*_;K"c&fbd*^sc/i54$e7Hso&)=o8E("TZ5YIEJG%DO+CB(+ +K#?J0#)c4(&X3&)>)1(q28:FY;R'Sh#FS(gCNE^tj#bAP;P.@FVsT=3bd^`m3r +qJZIi]Aj*p"i[KfWe1POrDK%@lV6l;.R<`%-.bKFtIeebE3JpVog#'s-=$8G=g$!",a6NMMic%F@=1; +1dbp-K,`hhGK1Ld)Y+\^NB?c^i^^4SM_gP(dI2r2]Ai2bhY7(qY7sXp>rG-G;0H&=/Y2bG?Cc +*fVq+6gr1,"ZakJaS+!WY45:3K%9j_/m`aXVr0P3I^&WBpME1rYT.f1TpOc"4F!mUWBkkq'd +uuhj?i=SWq82AT``I)&i+UQKIeJ(m]A6O=ETC4Y2s2D0Jr;9'(`rPOBNUFE8J9u[I=q5E[YdQok-;O(a@(f\"-$Nk2'*V(LABq23!Uc0c8LZJqdRam2-uGL&cPNWk +ZWf'6@-,mV`D:KOk6Z%qc$iYNI$g89(U-$(2/<5th(>oh"TJNDA+HrPLkBT0du\=tPtqF,P0 +Z[t%E(1unIU44Y5$6kB<3Im)95.AnNgV:+POVB^bi:MF]AGO$d43\oI;CVH&[+HI5WM+m?30e +FnDNtLiAHMF#O=d$LuqM`)s&rp-K-(e!#YGQC/]A,NCD(DB\R'CT*S<7YBgCN?adXLnI]A_fd/S*ti>WDG"7?6W#JMI,1k9qV=iI@_S$g0$:(bMHn`=5GiYf +#GnS!H8?fXnDVVT*!)cDi,TgE*feM1Ab%YFb_6Lm5I7=ihu3#3Bnd0%a*Gf..F4i@68=dK\9 +UnJ!F#CO"'Y]A#)-XDmG)EE2:6+OTg4^`#t-V&n"GY +!TNI@f#;K+ogN9I!Ed3N`;Zio=]A%M!X>1 +<]AmQXC!g`J,[;D`%3KVH\)?GN8=!:,PC'I@@YR$90)E.@fUHd1_\-I]AfdPaZ6gA.V"ClAC4t +555r/EUilQs7kjqrsIn;F0c%[2kIe(3E%CQ$VQ0cQoe$@7LLQ+7H"p\2ZYtaT^os!T)M8sSK +u1t>5s8o`*&/`ZF^[?9kCl#/6AeN@1P)a6">>,[7U^!0Niq'B/>2E[,DbcAMp@0+P"jWaK#" +)CNuh@8S*6n`Fu#-&TAMI$d--%5\E-bl3Na2"8uXhKr-<(J--O-@lGa/lRH#(VP"4uQN.mgk +.ebE:4S)>J>*JiqOshHOT;uO?PYBBQs'dh_8CeQnL:+Pp1I/)fM/p7h)JdS8JhuNP#`:d*N+ +E>Ac!TNFVtC,Vd255'dQ*Wa/Z:Mn6t\7l;sW=f\u2i;\3AVIsd?:%87&<"YaY0"[Kc;P-A=[IQQlS/k?3Ll1f[XeOI1?joJU%CEBNW4JEDAui8Z/Da3D1IM`=clGL1`mr@*-@`.p]AiCD+E'?]AH/2V +poY$@N@?UHk%,`p$;iE%idg<"q2MKRsG9([TC)\7pL?).?ZD'A?OLpI+(')`;j'Zmtq[+eO(FBA^?cW'@AZsYnuP5#MXn$pt)j>!_P +?jk0m<3fIVpF>>Rii&K(SidmA_U#R@[uK@>ZeI+KjaldV0"NrHK9KnUQ3K`4E.P6$AAY`cs$)JE@K +Hi%8&b7:LfZUn6Qb!_L7_(2VWF()`,n`.GUn\2"id':>!)'Q['@"hHSYiM(lp0^Vb.+VfHnI +&b2n1@m1Qrq#,+@_bI7?p]A6e]A.8j=D296+&B7m=*'+@4]Ae(7#N^2G+f;DDnotaB@S\5"$LHkT)pl>E!V:l!\_kn;#S-g@ZP1U9Bl!b)0#lgD09j>> +KH>MRTR!q/kH5qg1DqA*)]AC+CQD)tOY/f+3kJ:!BrL1=_@3?aRrArW^4\?q[i>;D:D)7'l4H +qu)l,QKGEU\8q/LEA++h3.\njb./K(q/?kQGMl.8-C(q9`P79!9J`U.fLdC!G6n:o"bk&*68 +:5M?b30']A]A=B_LI>naX$S&!RqsE$$tS[=lo^i!G(t>r%8H]As+35:=Et57Mo*Lh^j@qH2Wc0& ++2!;W_27YRq2R"uh,/1]A3+d,Q@e$69J3a87PpV,-O.)'N<#V\03nJ,Rl>/_hMLLuh#F5^8!u +HVE*=Gn?&n_4%i<6sT@%i,,!\=Y\M9p0m21rg8f(jJn^d#`9$,_L;Y@jScm3H)mPETCbY^dl2f+:cTX[XMWq.gT+TDPL1 +u[1=rU5T!B&j<<7oZ?Cauc,!Lo9h`"g:1dP6>E!` +Xt%>L,7>QIQ95M6l$a[`]AjEj>?G$K>)j;>G^n?.-'l\>=e-=n7emS`eNme,.?pY71CNoq(j- +((R`g#``XQHQpiE85+dK&9F2p5+4dA76kES/M\^KJ)m9F'AUb2^kPd).@So\2(=JIc6t")!Z +>(Z,P6O=K22[&YoNk'@KnAD+s:9.B0;!X(_fV>@'7i;hHf%/?t2A1o\Oi/SN`q<>CDls9_,e +S/Z!\;T,CZGY*`65/]A,/+CP42INtu^0a?oMZrk[WW:MQ!\Y+PY"dW9g^!\.8n'jn+1hjHX43 +7PGq]Aa<>g/[?n12'.eK+j^<&-[E$aHmqORkpB#RB= +lmio#9-c$73Dn'`8Ig9K]A:MTBdRcBb!k-&,s*r2Jqb(tj8/'d.H/JR@Hcqg#LLcUnf"/FrQ0 +Qe#R9?LVlNdUp=pJSOXgQ6gI3,>iiG`CIk2+#IB.u;MR%&M9('-CH?Xn[P:''Im`ZDr(M8:;9ckF[nJ +E'oN4[kdatC/0mtuJph1gk:LB\u4M:.7Xl>Q5KC&mDmWO/TY9OTEA(j<2N\"ei+!>SO)r&6m +c4?DN+1=rOr^72:FpoFG$mPFRLRI'4al&T._]A,Vh51uS5bf*sJ$b"gt2D,NsoH?H)&'8UW(# +Tl0+qgfCL`M#e#Ug1.T*t!TTQ/U4[%&3 +?m6$LM\)!p`Ruq/qIn!*+1M&O_b:Z,WQ3`lV=#Kc&2S(+;ko9 +bs@Qm'oZa.FcAQaYJ3'))NRUrM7!ou;LgBH8dAdVJ8AlI)l`KK9p_S+K77!=]A/@K7cQD<)1Z!g3/j$\!\PaOA5mB2@IYRMA(i)o%?Hshqe@Y2cl&^ +96"KH%Q^f]A3M(\j.".%TT;p_;fN/$W4uYh$0Xl"7.G( +GNA)H9D2CB:IF;gR1q#5T53^g5,o437&),+jJZQQrF9+DFUOPpkYRJ&9l9c-Lh.99ZJ@XpJO1blS;+E&RWCD+eO8e +J7C"Tq;>[dnk*u@>KfTng]A?_C_uSR)G!IhgK,P4NBQ,)hmJ!Z;kU.$a1n/(&P9!`'e^\i`Cc +#/4jiTWD,u_cF%O_<2*OZ.^8q9+;)Z`rUu$Jg206La,4sicLjkHI;l +/it?$)Y*F\FGqOn@m^Mdoa!7!Zh,_PVpK\T/%!asL7Wug8r#"5j,!g9>9c"&o!!EEM5>qaL1 +Zf`@`ZFIU'l4'FrqH%mpW)2&,.G%nd:0EQpBVl=rQ\ak4utkLcBf480^4%7GIn0qneF9a)XQ1 +6]A7R53"WK]A3S,*BIdQMu,GJ@CG]AcMgn7`gF3%pra8Vhf4u%)J_#LE1HJjR;t`'kuTPdQpL4S ++jCu%O;Gn$Khr=6EGk0@6$"-!gKP/V0[%)I&G[Fa#3Ln<#h=d6Y/VTW7Z1 +Sq!oU6Fj/0L229GRulR$'M`$5OWTV/>ggKtIMM_=o4oK1^iC"BKVf->c$JIb#e#2k6AJt'j&&L`UZ^#N4YAfW[JA.]A(")TL9rNes]AmMFZJi*N`;B+HPB_ +?(!S&6JjXSUd_o\8^%BhK(MUpC5UZON,?>i0,=r*6p\&fd^7trrPdp:c*6"RbN.R.WeE:]A6B +!@ZWX:\dfsnU4GJW`-qQe^4+;+Ei#^I`#PfI$T2%RgLEnE`'g8_`?_%Ec2n$NeCjl2YN\qYP>oe$W]A@@24HePM#[25UlW9C??fGA;&"b6*#-Z"/%g=O3\!n]A>o$M?g?S?:Ulh,XKGg0j+?QWZm^Ur6IWPm2NIq`\W5AA<'CG?`reLONMTkA8+8 +!!MDjKBn,J-dp?h,l>MjRZoJ#Y4(r!dW,fme6@?"RlBT`aSlQn]ATVTn17Z1A+$ta*t]AAQ#5M +>;fls8TFn8L)SY=9b]AS<,k@St7dF(\"2=&68jR/Q.$d#VOta,_R2B"<6?\+W%+U$H +uI-*)c!00bKcCGs]AGYBY51C19#qgbCJNWBcKH#_'DA#X)gHFQ-j(b` +TTMYqq2(GLJhiEKQCe@AK5as'W:W>Z[.#+q96r^()(qGl&)T=fY>:F_=(EuiNPg`]A!s:t?HJ%7KjgNM$0/B(/&oI2>Jpg3BF ++0&?b@uG>cRT6"4Ap?!:D1<4<:P$$gZ]A9K_%FRJ-_rqm4;+XKHKjJ$a; +el'&!5"T%P\trZ"8eit=Kigl@7[7MYSBIq3,Td>.ku`QP/Z&1spT9k^4eAT%l^t&VhV,]A&T*#%q\Pl##4AOfZ +A2k-[\QGupDE4)B3"4Mco!a8/C*Nf[YGsVhr8bN:B;"+`#g2@)jW_GdsD'ekPf>F!UG;_"LRN20 +_"@@T2X(mnnQ$I#e.a)UXZP0LFX]Ai3KYZO&;1Q;F35KJ7k5.=r):L!9t(GXW5aRVG.0MVPNi +6j&`++A5()k#qK/[UUJpnPgAGKFS9?5U4WAc&QQu1sHbgEiB29VC5/ET/W5k_f0k7CKVFrT76Qj`1q\Mjm2QF+*0qJm9HC1QPqsgqm),?/U:KDqeNs +jqfD>MYf!(?8/Rk_Vm]Ah=6\Lrac%g72\%DV+XoDaZ45AHD%PE>qTO"n9%C]AUjcW#pd8(Z""Y +CYc^hi9i[QT>(G9YGS%jJl]Aq^APO8F*E86S.'D(a8WHj^3FVp`J=G-%S&JA1kcQr5U6%?$R& +*DX<<".PgqOQ7mmG(LR,`s*Jpi\OtEsD:V/B#b8f`G+Tk$Ok1p)KMN#ZDE"t48?jO?.9%47Y +OdaR]AJG=a8$/_sL?m=sSJN>cE9T`AN.2TZG49cAp8^OheoE$@!\;Cn=&?&OXa@IkJ7L8-Ag_ +*sq-'UB.>*Xer-K>)W;o"oj:V'/t@^).li;hi8F?nSQ;.\3!^]A>JFb+Yd4j9hYutZpYs<[`6[:Qm/E)8l.nh"4Isi9o@#=\q9_j*>NkePeF=AW@rSYum9a(gO*mG03_3 +&?6)taE606*2Ne_[\TY6kGtJ1&fC\+$5._H/akR2>t-&A*IC016Td=!HkS'Z&B.fg((d%mFA5-/- +1T#\Zb?PSbn(a/C*l*$?q1ped8@=@`N<_Ps-Mi$t-)9u0D7"h4naOZ95!!sD"(#c+V2ChXG= +Rh,9T7A;;bU+e%3\"(Qj`k4!"RpcAm-:oUOK+lHC;o%mA!6mf^"$-F+PaEJ'JXN6c!a#L/PC +ZThJ5%3U+dN;pb0V7BAV.^Kn._cC&3mucQjcnGd=?J$.\MIj+B7o"6-8:!\d4="aMS8@'S2L +5bom#Tk6$2ql\^B$J,Z"*\a^UcIJbAhr*bl5bY2m.W-;5nFnAj5>fr1mT##7R:Eg2X%kMiA( +)#W8VbC9+h%Geq,Ic;Vk5V[c_#G4\P6XVgs"F+McELLZ^qEfn3hEUGZt^LZ%)$,E8#=:(\J1 +[cbqbK:F0>&PaQ&n``-)"W(Z>VVXCg9/dZ<4#[9mbK2;(h*DKY-GI"1P\$QT&g@IMA+aPTd@ +J%f5"\,4;7m;-u.h*Y::rTE7*G%g*ru6go\q07*_N3WX4[0WAo +n\K+:92B^)=CC^qN"lJqZG(MoJU;@h.j$6+FieQsKbB/d//8'knL4QBk0<<>/;qTnXaN"ZI@ +nc15?S>KUmHknk4iVu\":b@t6,G$I@CdNJr6(=/NX1+im6^RK +J`XZin&VDV4$,4T`G.J$U)2:S_X$CIB;-6a53GkpV +YO!J7IV8(;%D15M5cfS3e`LCEfg!^\2Prk(f5U6hSS#fD^)Tq;!WWjT"3;4HSk*AVFRrC&fS +Q$iip#c]ADIH"`i*qi2dDs2R#.c&R9P\^bR&aUm8qGp$.'b`ShJNe88*0(rhQ!=,O`aYKU@ql0VM`8@ +Qg_5;[Nju_^Aep0Kr__(?C07LOp2Zgn/>m10`P67?s`(i;M#9;qpE#$F\4BUK++?3E&?6ClI +ZWZU59#U;'!bm-QSo+ss^Sc:2V]ANeD%JL!n)H;iUO`NT/\OKsS6%gM)M7PmaLN*g"HkegKu$fpJ^@F4F.:?B6%B8+'FMor,Q09 +`G#if`),b:Ieq/n6l:a!81d4h53=WZs&JJD*').-sXLuP,EWbB&JQUUZQaHJ1HYnqDJ6Bf05 +Ncs73@[pHS8+l9e#G1d?BCJ;AP6I:li$ZMOW)j3<75(dPj.OlQ/>n:+e_BDYgJ-pd-78BjL0 +^M+,0,OM_HLSkMNCFGn9!GAn:[uqa&IoheJ^X6_*5Q1J[jJQt\+(bP[LRG:@7.iLV5VJgJ>G ++(_%**u]A5d\/rm:&[oLYFBK!/Vi,(u+a)]Aj$\m[S\*5mkerG4D=ZjTO`h,@=HZXTjbF2!?'G +T/AS.=]ARMX+FeIs^o_,Mq1D)018GMm$NVtpR-XXb;qFBWH*X)THAUjjNYlG+* +B_BuA4'1B[e3^c9n*I.j3IePic_ngQJX=OWB5Zl?Nlo>B$4dt@QGj8dQq$0\RZh#J%)r@(koIs.dg:567$rW0`_dj/ar@c-lYH,dNcT6!s`d='QX3@fT+i$qr +tkd!au2nmHbp1DC2u@pU:oee'.3H4?l4$=rs]AW_]Atm[6eQ=`B-)p0>Rs*^7X6+aH,T(p//Pjb^Vb3b +NJ>ioUAo/YY/F6.,/VCDbW4PBs%Od#;:?+S=oUF!&??^2?>20PX#JpT2c,bZoNPY03WhV_P, +a+Y+kmh^$cK9G..t\lQQcBWZIhgG5feE";UXRGP$8TbT@(E[%8g""d+0%c/XA:;aRCea$6#l +.%/\3+=E?*PG@.5$U/[^P`+"F4mP$;++l+X)627QuM.B2Rg^="d4?f*2smG?lhHXV;C">r%=PqYZ=;C/pF`cTh1Prq)RA3\%g +'&^J\c=0GP`*buRYoS_o)ZY*SiU)opTa)A?6'E."13'CiF536.ci*O/L4b$3kJ',KQahE'%R +X+_a\@<+,]AImPtWb86Pl)Ak*Q?i!e4uqS/^IE"8Q`moof@7.ir0nqmls)N!_nS4/Sir?6hb' +dooS]A'G.NG(R'MjacdplA8Na=/IDh[5Hiq$gJq-,@k;ac\M?g3p?W.qALjTYGGnWA-=Tj1k+ +V0mE_h->dQVagGN$XJ?o7'=dJ(jtcD=?J[E-:>fGYoC;oU?C7lOVN=\8']A79-i2A_Ai>7h%% +UF_f-kW1^H1mo&N:W2`+,'We..88co"9j^:n\5?q/]AW_JS'8bGJL_kt +Rd;Ut*CudA0GfdIEH%i(beE@OEi&gD6cU"8f=%ASYpGl(/d"N?YAr[@ZH[P[Sb1+)6-Hp>'-I(:NoINC, +XaTkZTUhU@ORC,+o/\djSbRqab8&eu`BkHm]Af6U_3cqDA@2_@_PblTWG#Si!e79Y=&g[Ah*= +f$HrXUG%iEclIg8ui-$YP/X&Mlp\]AP\'X/ +9$#lFPY1&EG<4mBP59R\>6`q;p48^A@VCB4$%SIeY&`rOpZU52fh]A$@Vg=b9&$bpVb2ho5&6)>iqsp;OqjrQc-AHrYLg!;tn2hn8,?J,&ToZ]A?gR9Ft]A$ +M(rCii*[g3?[nKRs*`n)+2Zo_%8Qbt+%c:dkK*UKOaHid(XM%5163KPJ,/3iUCT-k*Yb20JR +H=95COUNiVVW`Vo`:p^A6abgrj?XLC[jTIRubN)Z'8blQ:Vdq#9$;T70HuHNJZgiQmVk^I0. +@FS3QMoWO<#5Q-]ADoe@HCos\9umXL:(163K.KB9`@m[O-X:Jq]AWa.L`%q3PHAJ&EqRL49+.8 +,Vm%ZkIfY0_OMKeb@rK+$\%5I@C--l.("P6MGt[;np'@IH9R`@h0X9r:%VOB:m-b5(qMus7B +7^QX>WR?g""Fa"?5B"K1b[-/(pQHB`aH..d(&qT5N-_dDC6IRY4RjX3_Oo(.orQd7>RIs:M5 +rV5CX+>?+*-$T"ZptIHr:OYmKG]ANHLBA(n_0#%?4qr66&j'Ss=]AGGqeo@4B/?2sD"r6`hL5M +f$qrWVVDL!)Z.S9XfbLk(NanmhI8n$1Zi8&&GO$SS*crTa!L:HtR\^AoYPe,Akk5KD<4YJ*9 +Hj=``K)?-4@"gf;?oYY%/,`/.C`"Dt,Id#X4A0J\a('hb`WQ'Ga&P)Qb,@#q"'V>:2)V&eaK +u:TD/GbFb^]A"(/oS\EJo@_.q5$DQ)]Ag2%!?[N'+6Q*K0mF=.&Tf]A>Em)T"&#JZdVqXN\!?\/ +%Ho?XX=(LMTI6)*IK,\R=YBGMn-/E5o,T:d43Jo1q+9e'C4+p#07D*.@IgL]A?qkONHNIr;Q&@cej-JdIRnJN4E2AKDBtFqW6n +D55FEmB-7*A0>Dl-d9g4-o!b7koq,T>p@5=.rqZ2U0;&72K;1(`IIlQuO$<=`l9HY%IepO/J +,[?\&,mT[&Hk5"%J?@Rq%/nBX?!bO;&%l&SX?nu# +jppoc>8qC@H*s53kB +c)70ss6q\VrqQZS*p=u$ro#o.N:Rn<`%=B. +p/$RsOTQq>>5b/^,2Uk#i-b@)H&qTa +'s5/aif;g@RCpRl">@-fn:%21EP3Y]AK54;Jd.Z2='.E.`r@91q=VpA?mff%ok:s>HBQl''[* +tb\_:MP3p?qm>FEL9(!.jg#d?)82$ZES"FAL]AmJ`*SjMW?jC,C0Es`&oOJDck`)l3HAE%c!k +-c2rHo:/qZ2"WDF69BGMRha=Z.iR8*?jH/84POgD&kh"7T^T:+9T=j(Vpm(@2/1mfQ`Y*;F$ +X.JYHfq'_=RjRoY7m`c8;B/`fQGK;LJLdK`c#I%XHEsXe7]AisBk8fhVpK^iN[Tmf.WE5$Vh; +U[=63]A:3<->Wb.ih9kQib^7JR^NYo!4Z2d4S4UCM'![iTdFK"/fq7o9QEmidFTl)W]A!Do\2& +::WtK(%RsGqW7t1_l\Gb9=EJA8X/=8]A;U&TqNcI'sc^HcFrL(_a]A]ArNuK1]A,modU:om&A(dX +L9?8._VE3>Fo"gc)t-S"]Ao=UY2gJU\4[kh#%o`/O#hI5<>L3:etjN+=&#SBjBF+GBff%C=h! +b#+[GD;"phB,o@&S/QSK;T\=Ku=7lY&\m_@naSgD5I1V"@N]AA4H("X4=ifPkYpkuH!>8ToY, +[2hUc?qBTT.sOnpM*H)+1Em6L\_6:2=DATo(-2Kjm@bnsudEm8ZijLceu'F/ +4N%GqOR)YD*d[LD2lBiPt\-WZUR-YA]A)T1Q1PNmNi7V/n8oRAM'YWJ"!!P +:0g"W%@&!!eAM-/Y:HFZbrYkV*VX4fDB]A-g9ro7L0@2B2^HPe`S&=:,o$nL=De\K3V?A@X*bEC0#TF>AKKlrP#lM."N$toi:F3p4 +Vtqb7ASc8,R?ONY&V"Dbd*p@O%NpO=s=)5BH_[3'LkT\X#I7o>sl8M>e@e1u)I86?GR[T+>aAtm0c`)$k+LtS=IP7L20]A,liH\/tm_AS(b\B/;f,W+;Ja`8hhQ!'?IVgtiDt +K3P8[f@;aK*ob +u-T2tgIe?V%dp,'>!r;q_9jPMgrBQQS<7!=LVHQU-W#W>J'7s]A0W5M"*lCO'.VF!eO7\qcDd +1_d@PqlG.Wnd:nYnVh-bQ]A]A&N]AJM)UpF.#ud/1%[@H+esMjZp*&e3i8/p5k5=IPIUUtbr(i"c#1cuDH;j&s +6Bh)CSXGZa>7V_hRU.+BoNF'o.DKmjK9;D+!qaaF(oR\n+*Wi7QSB,S2&$f'C#>oC*;U\ab>e&&/VKe1W'J!mc +\@iqW%]A31Y_]AE="?r9+PP/HA*")1U.U,4u +[0149lK(o)6sa58g4>kK99dG.iT:`B+rW_;9]AWR`YmC5If15>fM##E7cr8l>dI4[4@Th5J'` +>*[OH?Dp"c4Eq""/Qo'K:UsAo@=[)J\7IJ'g[m3'cC9bZ2\L2+3N3%SEu^P=[X=;X4/`:2uV +^^4m!Ri)<]A:Fi7NGI,]A&K!YmMer-$eWfp!p#3]A/L/I3^O=PtdTcTg>G9mDHW5LCL:u87Ee&Y +NL%Z2R9Sl`$rft=tsl,U4q&4q3.-[-9(P=/X\7.EZUE7jIU_qX=@&i?=Pk\DO-LJCcDZ=GT) +1*DH1a7B%3s[GJ!fs\,Z3+1&[0j^5r5Ri4dqu\t/]AY&@qu`\H1AF9m\Y^bXW\'47f9-e^GUA +%Ds8H&aSP]A:37tL4?F^I.YfZLf>f\r+aR9i& +UI(\0g:]AI*=%9prF25iLtCuk$?,GY!f* +LCQTCQZ-#PF9:!88b7^`FYM(oZ:T]A4n&=Vuu[XNTiIJ(B27N'[qe#:9WQ6NsDJV@::MZJ`N= +jBQq,0-dfS/Kkdj;BZ2$9^#0n`OZsuP4%SOXBN'2'Z+h9*ga&<7AGqu$V?"?88.j"[B>i-_< +j]ALi&f@0K(X)]AC(Vlu$0[a%,!dJ5Y"5sBTl963Nc(d^>8;pZmP<:hVMb9%9]Aci]AOfN"33<__0tj`]AJ6e2<[%gQ\).+bJT%96rK+HJS.,,!E<`JYi!\OcNkQ) +fCA-lsaS[E23VKa";)8`tcV&->(,NI"=AU'_+s9E$=r+&p&joq91^hS4d3tn1[g"E<2UuiWp +i`O:bHP*>u[?69,16=DKK/K%AUS!igkA%4[%]ALQ^RF'F$Suh'cSNTmfWaia1gK_F)ZP;m6UK +B_!!3N%(4+jJ]A/eq%ALdaL4Kkr)de$I@5;;fmt@"KsXq&G]AZ]A?L$lO[.[rp9kQPBA@U9lW1_ +$ICa;so4!&lmMN67&"0j=JbQV&k,/fXXTh;61-Mk]ACfW/Kj& +q(q?7AL@86E1/'7=#2eAtrukS&o$O"qB>mJP34).(RNs4#4j30<<&sPpnO,Wm2>&.kMLLCK; +H*e)KS32Gm5g.]A#7WI9ts,iNWB+Od6#nP@r3'-6E6UW1j?.E1d7QI1%h3()Kbg>pFOYm@_sS:?F' +1A9V4:W0Q7e2_AB;p5WJ`]A5jAJW@l:aBeoX%N?#gpi]ALHfkqrpUOcnZLKdT>(Dej03T]A(15" +nk7>9sjm;6T7FeD2V(,i@3'%i=c2B;'Ye`t+dimE9''V"DWOuqj)I#(qh/Z2tYi#A6>p95@E +-E;pJE`'4[+"JCpR=/_`SG"UF-P2=Z\F^",p5A(G,d6:.XXsE/mrg(Aq+'p&bHql5S1L:"hf +3T'256Aq&1XcD1Jq/@"?l.U(*u,D4cGi%"0k]AR3,f_5,H +%\Q+XEDMdsep'a05H\&D<9)DeqOgS;o[#iWeL@@?no&="&*Ua)3%(>6Qob8sC.t*092l)!0+ +D`+[6\2l0W$f<0:-_4U?r!n!h=22o)9MZV-X')4IhCe%uC;(uKR'@m6\!.utSJB51d@*F]AU/ +-cJ.8n.C6'%6le"(+=jUB]AL*VLt>a\_Eu?e-%%Irif+h^DRtgPG?d2e%W]AXW7"gfeeOpPrhK +pK(tH!Za[*J8bqbq'jeQ;bm\/jNQ3lsI!]AL_d>C9^fk%]A7,N_KjZq8$FsHE +Z7sH(8aM@ePtGpW^Y9a.U-B_QS[+GP/Na]AF#7q#hC8 +bVfUSqR3'"W8s#*$Ig.B +QJV$;Rm95NAZ0!X*$JP'5:]A?\T5&(PJc\_SSG!_7-2@n#QCY2k!3OkI"EWIP +:iT6]A7tqFgIcamM).m"=*+B=e=R/gbHmJ5=*&(5FLCl0E\(HKA@jD+0[sZ:lZ"3RFQ1P*F:: +Bb7rYHN'gPGM?B8Em +iH*@h.a5PR[<;/9<9ak1\KR^>f97shHI1G,>)1B"/Pj*+Mfu$XcW6@[Aocn]Aa_fQB/rrlE<_ +/qd=rq1,dp==:a+2"E!?!*0Up&XjMK<]AC_!B'u.i:$@)J0@q#A8mLNL9WeJdVKh[]AoBr2RTt +%k4FY(N4%jNKEIrSU;/FpIK9N@!PcMd[91MBoh1tl@KkL@i[WRa$j:aE5(*Xi_3tE7@//fjq +=P;#f1g$eeU^TsU'E%1J;FoD,=8cmq+GBfo[Q<2(/2FV4pB;#>7f]AtLl]A@/T=3ZNr;?aZTKDlHQY(V49_u%]AA0H8g@8h[@TPV?:oq)kbXk<]A\$@fNRXG)qi7sC4=W-)FI2'(L!B"*JG +]ApJiOAGndQF7^?V@AH?]A[a; +H!2c&U!\PW2/VL:&9RK^H$%U1Jct$B6;J6VT"P/8=%B>k6U@[.Rn6N +M&XMjBU3lcdZdS`qbuEJW+uZ=`#!G#=3Y3s'ag^nhKMsRV-J,iEg/oG'.L +;)17IQ=O"*E+e8 +n[?:YWZ>4LFa6)lokhkc@TR>)Yjf1f+0=`cY56==l/jQoeIdu)L=EW!1)F6j9UuKB2V:Pf06 +g*8feIdoCU13B>oZj53e$F6L*ZaUpf:P582gDbT=Vj8fu+WF2EkqadaYgrauFcti+]A.6A]A#( +n674LA@D.UK4)tqtC73DUali(O1f_qjXtN6YXK<, +aF3MPlS+i1XI/G6GW6emQ,A6L]Am2RdCI.'^:<9#e$BDRmHdL_]A)^Qi:I@2^PQ2^E+Ujn([-1 +h`tG--m!-cZ?ZQ)Wc2Pn"UdW>aBfJLqh#YNHT?(u8.+mj;bY)aojlWE76E%_<-To6lO'I8;e +U6k\Z*F[!PWk,>2uTZ<'o04AYOT?7"0brA^b`A3`BJY&C-q""l_ih2'$Ce1b(bjW!lo5+6"S +-E7fjGQYsDmZoKsS<'Y!ZG8ghB8[PXWbDM!=*_]A+7TM'jnRQ1Qr;d@:mO[HP'-8Z0(L%PdV6 +PjEtHl/b4TaUM97k\MHZ%\#^6QP+OEeM6:S;[+u^+#50*umIbZ*)gjTf=Sri.1Aj.q8c=A&E8-=SXAth&,_'!`jdp:-a(]AJ"bDu`@&.^jQG +/joQ$XFhCV5YZ;2]A!^$D3kUN>4coQhl9T;`t240V'$FrF=Wu8Li +TDsrV:,*G9Oc4>=N1R4k%8LCJ19JJol-904Y7gj*)CAduA5>rH:1:!b!B!rhu`L0$,Td4K9Q +B&2"N6p8baRZE3oi\eu$&(s5Rnm:6p(N5;l'8l(0B[1FIT/kEl0,U$L8jL/!@1l,*Y?2Ej)+ +1<:E9R3Fl:b[A^'uLgnT!gKq1&KI"ng?*L]A!Oj2ERgq$#pIr,.sLmm1Moc9dLf/F9h(c^6KF +"lk`JNj$WQubq*VcYKd&hMo9XA,]A\`S_,A7@%e8;Y[PsN/J)0Rq0Tk?s1H5SV]AfRA?5-aQup +s'+Eq=H6HunpLFW3Gc+iDV#g9a>Y=*Zf,db6f2oJL;_5ApCT(EfpJ-87Gkb^&Ud@M!gIW[c( +7,l(G.+_Cob*mRH="5mC5n;ci*6m:1#n2Z/s+hRqXpH,o3A55FO]Ab45aUF'/G\rR6Q(C-8oX +#J?$>aTisl;BhWj/X3o%i<`oR@8Q:(%mj,)smZp";+g6=R`aR>TS\G;7/g`jD(7idG=[U9`' +%O5*MT1Om\A')]A6H=Us\Wgo6P,ji^3jg"fQum#q7jJ#1kX$%![nl8AbaJKqu +uT#)MD`:J;$W\%j(/ZUXh5uVANBDu1D.>9i`Ib9bBf2)?NQd&kSHlR9T@a'Si(@+:!J#EL%Bg:K#<*pCDo=j0`21@J/D:GWm9/g4WmQK\hMXf:hm$aZ)bRkd)/Zk:]AaP)97.i\%lbfHT+HB1N[cX(?c><1p3("^c_c +--Y9#kquq`cPBNiT+XDYHSC^F;6iLt(QfruH_fo:+H;V.@N[c=P/E736`THIqi[S#L7eD,3s(dH`*01T+Ef+) +Gg,.MMje``"MX<:C3qlR8AR]A0t-ip(V\M-TLbc>DB1]Am)llPgC]Ah=\Kg`_!Sh@Uh4+=5nMtI +,6Y5i;/l"IC9TdNmRg02007bh4SQiOjldGjS(ei@aID.jiQfgk+Os#9;-A`\+['*kALe^JEFXk`9` +J)6K.#:X_Y;G +&Th0`523OO/g"k<4H]AknGtmQ>)&t+FI8$/GP$8b!Nqpfg4F&?;I28]AmT0U46tBj=XYWpgL]AU +8"WWdu-[Sj7fWm$=YT,OkYq)&*+^$bCBr`EninI=#B,6UGOfk/\fq-<'"2'L_%Ga"o![mn)n:mNMK^gG@?4;Ha)&D\+j/W$-.n(Ls:U.FVBSt.ODS]A19ZQFDn#)bi(&W$NOp3r+-blT=70f)+;4O+kSq`Gh* +J9(#XuqTI,p.*!$q-V9'#!^B%f]AoiFn1bT5&cAG2B8C'f3g+drrhh4?=J4\7p:N"4m^3":oU +dkXor+hQO]Aq_^kVr0jGDT(47g#"AD.@S!YZ#"4iTd]A`TufXCfA5.QSC42MEknNA.Q5/MAGFR +YpgsX(o5BF1=jT$Hm.aC.`VQ1?DEY&iIB'Kc)("7`&]A866:uJ"2@$8=+aLZ%i\+q"2D,_[+% +uWVUBE;i:FLXLUc!&Ynm:Af`F-6NEN^pD4L@cjH6%>ZlV)=JE-$%VDG8]A@o+[cGl)1[rXUj> +_'sb3REoC4E7jc""]AI+/_PH9a<._&L-9Q0kBK7(o_l:f>cuL5gV@qfk=A?(9IVpt0nG*oU2^ +2s@$KB$>U?0:V)`]A`J+m\OId.1pJ0>oK?D&96H!gg?b]AL4/2,au@cbW@[7)tEYq6kupf[)T! +%.]A0.sefY3V)3U\WfDUS`R\1g@8F2m!CaXTgNge=EeiO^L3mTK-Zj2!bT,*'@iBk`Z$Cg+MHSNLXF^ig3/s*i+ +JBm:T_3#5(>.OTVa#s0*(<3?7I9V([(rj#^q67!e4h<$Dd&;-(tlO +R1)^CL`Xt%p$krl!&!In##E8liIg*2lO&Q#Y9l&E\d1:RPJr9YIt3*.GI!ETWsNi3,D!F.V>D%CE-rXt1jgum`;HbIh23uRc2?MX*AjD6j +@OiSQiIHUXn^UaA7E8TQU>4$(*j\D`0l*Pkc46uXAmC'K/N,Q05J:$kb(&9k7=R58m]A\F@/I(G.O,0KCKVVWUQO]Ajse38]AtYm2n-+gqW<%ZojI14@HF^m68$ZfPQ?onWk6q,G'4 +!gK79Ja@Em("0t23aTC`i#XpNG]AMkcq4g$?,o[dCS)9O:(69'Ho7(^5=&_1=UTOeCLfY7@1V +Kcg$aQAi$"k7YAX[ +=7>%i?n7qJfT\VmiFP,>/A4s(Nr6-CW[6@2`C6uJAJ4KF.\.k +i"Ifbb'^`]A-d4DN^TSQL@/7WKM*r%#52LLn3B'6iWCcfE6j?5ahGV3SP]AL8#?V4k_ +"M0CYfT/d@GYCp&'tE#=S.E[6>kODK7bE%c'o&u(s8KE&D0>:&6^9Fndpo.qBW.HNY'e#.eM +@SJ3,k>>Z@QD+$RhE%//Ku2Cse#.fs&Zo\#1lVFVjBWETF%&:Zc.C/QX)K16a&MS]A/T!E'Bf +./EZ6X@G#V7ka\I;h4aU:^'P1J*TFMd'V^n0OMU;`ZI<*#KqnUK1S8-/JU;e2k(8O'ZEBk(T +CGX;s.,Z#gfb78f9Tj2(H[TRLYY?(/%OK"^M1cUVp%SH@RJs%q)E9HrUhbRDnGVrW)\%3Xhb +AW(gKugBtfL>l;b%0Ank+RJ#lD0tj0#FKTT8`nc/QM-IZa_fGh)+a0AB)K70f$jMbA?pubuB +W8gH_j1ZfW*/2.*I"Or*<2g=K`]A=h(;1u2:+'o:8K))(49R#:hgdNkn:qYD!$VH@&3(T@S+c +om6'"92QieZ:FerR!:bucdmmpNRHu:a"B[?U3Y;E8_Ehbc +"fq^55WG^.6_Fl&]A/ms9V,G<2)#.((Qs,L(&6^M%?&i)*\Umf=DTV&$D-$s=@dSd1*E1S1&. +(!Z`U(JXRa:CH+)D,(pZW4[_fLg4J2'0$5Z%IW(Q +?%&8OSD`u)_JW/j7q6X4EFWNn-`1ek\j-Be"K&LOc/Z-?]APpO1omoe.$@-kjK^hCf_1;,EEi.&pXbg@]AAT?@O?lU@TH%U#*s +jS>tdcLC^c.=mQuZ(AjWcSO5N?*_[b?8IFq'NNX0tl,B'S8abR]AlojW;nKB_eG2K\s@Hf*`\ +HZ6_Eqk&u-g_\0(AD1n/>hDNMh$!N\F19P27cK8@H@n'>^i-0AbN>]A[b@?HA\ +q%NWNG9nqKPMk[j1Bci*>^G +=3o4EtT`lP$\15Al"2f0hT8E]AlIPdrnCG)S7"R;tZ)WU#aJa(m/`QjNZ--H7t:/@.ah.dg_X +4/6_\Km7^eXC8D%f,?^d`o+$9C-Jt=e/$:9<+jnTYja5M!"`Z.kRfifloYHf$E5`/k\^MRVZ +r0Y("/S#F&I59VG`Q0;:S!IZ3@"f"/fpM9ge3^D'4fij\QEF&tB2k)k'JV*ePi=`9#(3>egq +A_1@sWQOpq:]ACc5'&Yc!&'6+]AU0q0o5"b%7B(X/%)c;,aA'a&$ri#TAlWBfj=`h]A;,oeMS,; +og2"DV=UL-."UF$9nhfhBLVI&VS_%Ci1[L;'lu[O*n4^PQDH4?=4j<2f?+?* +ck)St`/cHra[aRWT45F;o)tmW\]AoT4S!VGi.qTZh\RS(i;0pHJP%9]A5t9Yah$@ST3am[L^VRXo&M +flY[obSP!9Kn:cktXTcn!NNtDGQX'/`f2JnNQlo8`)"p>\d(i1XQ&.^;U\3D(u02?_^(/T/= +3SS^U9dT8>SI/f`&Pn-#nh.0)G;@U7q/D3%=YYl%U/5b$$\+X +=)e(`k\d^$F5\KT^iJL+N`BG.ZfJ;;Ad"eNj1)o@FdT8ut((F^"BEn5/sY`IVXq*>?R)&;NR +SidhA-4u9BUegJ5VXs^$urN^:]A8:>)E&#I%4Ott+jHFR"$*#!M.&-^4ENOI688Il:^OG"jl(_C#G_FVOZPlgmf),;c9k*b,Y?=0s+_^^J09*to#/\=mEs +CoX1MnCV:M>OL.\#YcePipMj^,!mbn/_%$%9b'G9cqB#"<,mMT>C*1)4l+!-9Fl8S +VTr,=Q:KhnC5^*O[Rk%UdY:OE]AT1"l6ofq-3KA#2]ACL(!$mKJ,R"ZIV_ot;4^J@%RGB.&psU +`'?j8\7k-4(P'O@BhiP+F+=OT5UaGZ?hnC;7\\5WC\NGH9il-u.JHfH[quc=1*^kW5?[;>;T +8@i,L[-ZK%lQ=LVr:fTb5ND"r +bnWVU-[PU/hfB4\\)LXerTuiJ:I#,/R=9CQpNsST00u)ZJ,%XZpA4?LYA_/T-3Wbo4#9Vf1CkK4C_*b/I53uVRpfG1)W +)dBLq!ZWkCqUW3j>Qo2;>0M^cr7g[jb;\>V)+Foo55Xd$jBu]AJ2GN@04CWdo +.Pt@OiL*!eFGnrmKU^S8/MCeGuq0/X,UnZqS=0K@D.+(#EF?k1WmpSmd%.\2^kA\us?/!iNV +Msfijnbd%oE?mg,E>d`E"&ULU(;Ahh31@eP4uB0+f]A(e0OjGO!ogeeK]A:ag1X=+_9=*5D(=" +AY[TQ"D0]APX73nm[iH$V14>e^1L*:1T)YKuQs/(LD4i![R\SC)M#e^ijJgWOg?Cf"ZVh'\Ck +Y:c"2Wg(b^pFGk9.>WV%&iuT4=;4*c!(!M +3'D/E-c%@T?>"`mtH$@"XSIWG)kcR6[TO.incBc!46B9D'[0 +4$6$hVd5aXe3A"?+q5,GlH[V5I=dG:[Z1]ASXVMM_ZYskD(]A@ItSnsFLb)]AJi,)AdZDU*.W +^SJoTL\?K>[6LLfbA[s9QSHVMjg9)?;OR9'(GEi-CB>1*QNlFT(iYb]A?8V3l_ek8+XVLqg&5 ++-XF6m5I]AmB:f^'sCb*0rj3iT0"KGMtqJs1l8YB*@%$o(@\uMn75F_dCZm\A:4"/\'p8Af3eRJm/ +*t03iroGcX)!gq;Z<(6%*:`_Okib*0u8Z8R.pHL:#64M/RQTE8gDThp^EE0:r.,J,d"/]A-"L +NOEr/)$="W;[`02+(ecC]A2='r3BF+Il"SWSDQUTWXq$H0rs6f%J\lf%$GZ:(;\-EN;g)BW:. +!?un75C_/DS:"#QPS6S=(ZT30T4SU%GR@-8_ij=,d$d54M+#`e-Z:5UBL&rYT@,'8,`5'Ig4 +`SIXF&;@J.sDbRZ%G)+LU3=t`pW1l2X=X2s5r3H +IP8J3fBM[,FS+^N^YGEq_@uuTX9$qi'\5u&>>&U8;+.9Aa^[`?LsCnN7)T1j68Z\R6'I9ta)]AJ,l3SdAgB7=WB +D"-qKJR_p7XcfGh2%hK1U=GIgl=ZACm1efFIYfm"+=9c@l+m*M!?/1s8MIlXEkOmbsKb>j\V +.CuXIH*b`;.UF[=6CorY7BM;gmt5>d:O^bU+'cRKRltTD=asGLkj>UV#e_LZ1tDjVe;/"iM= +1l3+-Z+-RJYq?jkZCJ#%k^;nFEtLkeaD)U6#(nT6m6Wr9a[__9L/9(Z52J\UKYOcM^sflIU% +Ugn>s!r3^0d&5SsiFg$?bS8DIU$\,T[rH77cLqn_>i@Wt\INX8HDdSSph7WLhI#"#N;h?$/> +L7>qbc*L'00MbcWOCK*c*`9lU#YnVSOgd-)[IhB^n>VZ%kh.jIiussVSM^fG'Q3fj;(5nrI. +\"-7[3m3*_`\E(pXfAO+ej6,Khu&060l;F(?,!goqq]AfWn(SX3-C +kZdP^(a_,p=@8&-cbD/e3^*,MFbOY)K]AS>qMW+/YTae*nrq55febt(I.k0I/`-]AGCSWF[m*+ +;1S(SUa$Yiu*Hu(,2QF,'a/A17Wks'"f/;1q6I(V7ZMjdIX)G_8*H0fL+\)k9*>/jfOEp0WL +O]A3a2h1da4I?*5]AQ.Y8/C@+>/sLV546pRcLm3=MABi+_s0[[Y +RS9fu^+"7Td7cBhO_q,3$&Qn0U#K=DV6!CMB!:6%O4RtY;@E&[OM8B&Aj!'Tq/UgaDkX46PL +$uaChc+(Mk=/02Zkf`M+>:qE=QQ4&#>=#YNGN"1m]AQq6t`o$p+2+>"lC-6;X:'341'daEbP#S[4s%mNlGu3ob?JghFG33bQ:b]A?0/Ui5< +)eMZu+fpfN2\0SYJE^u;)MVnnBJ3BRk7P%TKPEq1o@c*8*A"fjU@\^S7Fjrjp[:O0p0M\ss@ +]A;[8;`s+dc$Mq6JM'EJG0]AZ*Q]A+Qn]A2?:f==mr_G:33)q]A?G&pgEHoVrd1+]A_JXQ:**Xc@/5 +Q\TkCJlA[\%!X^UaI+*NUXirp +haR8e\Bb:@+.J`juhSIF?.&[cu7ZtpeK?r!g5)%04`&FBErQ%++b*1c>" +e'_-$KF=Kf1%`&]AAiJGGNWK:9e[nnB@Dl7A"'hGG=@e@n;bk\?'.DoGM\oc=qJ:sR0:?Vi5Z +.("V&kZh4g)%:U9E\>@cCY(WceO!8t1U4BWQ,.V-n%EbhG'''Ped$^A<.6M^6W3VQ.,[mGX6VbP]AMeb^R#8\.iO0!@u4 +.X/^.!E!U.:JJQB[Z:!0I+jPAh^2'DaFn6CBKT"+\f0GVF;f@2pFHu/15t[4RTk:`JuCu@B`V@&M)`B0ekP[aLM1t>P]A3/ +IT9K/VHBbX?Pst*[IImk*EV.#$f6SmioDl3OO:W_e;7YDI]A%.)>"[n;LC,'!&ijuX0PBBD)p +b(*n&%F1/2kRU!$A_[F\'-$2HNAu(^*T)"PPDSX;i6%Nt))&7URF`7mQdJ:@^j7P:9QN0dD_ +6AHR5P3J,,7n5F>M49]AN]AdH5Cfr4MM+:,nM +'[c?F]A-fti(ame\f#mRlg#)Dfg^j: +IE&rL0]A3R+=3kd3_o.1cWn^n%e)O\_Z`8#7@^_,`T_XeP&T8i:dE2CBN0Y>5oE&6D_TV6BoE +\l"&&Ei"2X7_nb)]ADO.=9`b@,3@M!,dtrorjq]A3QG(Y&`l +l^`u(TAt#,uMt0g2idj.MXaJ13 +b!3J#OH09j"QQ$/[ZRtfeL:'mT5afs7_gn7slKpI%/B>a/J%1cPZ?4+ln>q]AQ7:\;%*BQX.' +YX26jp=TuHph#l=[gQi4]AC8st^017fO:c,O1CH_bJR]ATkP-issRrskU&ME;BPIWWB4+l5!D\ +G;>X?>(\`m#h>_]AdrR-ol:6=PckSH_ffR+6Qn)5XS,JefoF]A4WL%90kt'Wq[ZmQi^qJ!a<="7'YUM%1e0[E@g\VOqrDXbpioG\J5@kI\8Z4J!Dq_bUPqhb5hUulMC3&)]AE,An^)/qif&Y]A[5 +dS+*YT;72l.L'Y,j2Jka9.u/l]AE4*RZTGH7R/WcM_2^>`-W7EDf^hQk!#MhhIPc,ZN5BNB1) +._c>^(uK=T+Iq"="';nDDO1)d+h@GNj6#DYAe$dN,u,e6FL=Vmgf6^hZS0!" +VZ7jN6>.6Shn"GFl'"cTIsM2P%YVW6Q=?_PlHG86gn)9BT-H@%geYB=3@p2["?m<>i4I:E +CRGQ08G9i'pk.u\ooVPL*"ktN/I2HaCXOOm/n:7VOV%+N;]An7^JPfm:Hj2j0racs4-NQ2Qc9 +aYh!>n>$!+Efk\-;+B[S&h^#g6"sKAqr(e,mE'Ie2Ck]A%AMfK01J4_+PQ+7-\#aAmqRSN+]Am8h;3;[JEe!e;5_"F^KeW.GmT31UM1OU +NA^a`s(4Qkfk`gG^in4W3#dAOkPq_Ki>5\_C,+TBqecghr1BojLd;aAutV!!i+j.4F'oh"]Aj +LnbUEd@C_rkZOBO/'7eigcrraK3ZpMfcjJX(JJ;lC*3j&BMnoeoab.h^gas_m.YB[h+?EV=+ +nf0i;KP>d;(SoXm)hM\>=N,Hkbo@e-*%m$DE"(YapX?Pi%]AT#Wm_heZ\.UV)m#=\9THiq#lt +eO0uCBHM+u63Nh/W`?kN&aZ5Km,cB$#/.Ub-;!=[_CV\@7^AceB8A'&ZtBIV"q!Rj>F]A20N2 +2!J?!8Pt=NB"SMQ-b'3ipie>Z0S+N_B'eG07rT"NQgn'o5h"rPdB1WM_#ha(H'/#:Ik2?8f/ +gA;Fq)LDY2?"k=Z.c;GC5O(o/1+#LcbtK"Q9 +5/IC]A1]ApfD/0?fbgm#H(SmR)qQ\g(TNm;h`FhL7Oi$g9h7g=Mf&/fO: +eT[pdfbB`,'lk51_)FUo\Me>KHhHO2cH+*%H5?-N[hCj*e@R6JJK9:c"#/R"1lI1$JTUZ4:r +pVn&6FqN:_4V&+U3pdb%TR<*2sU0,KVnu:^Bde%U4IqFUsmMaG%hjJ\qBVE*RH8Wu-4+NUDV +ZoJ[j=*cTe0s-b1q\-/>/WUiTP/P9SD4.p_XCIfs`.Phqggi`]ANK5P'OMBX>87B9N.>qm"I. +$dp+T`F&qcHUsC>R/Ua63kk2!"1T-_M^05dg4[]A!=Bs:/"li037%N%46iIY+si1p^T&i^!&p +!T0R(9qrEZt8j,Qpn^<33q%Y]A,^+kQg"iJ7Q7!tK8<6LVu$$)AYNc(h#U[QCj,pPH:^aNF)HjuY#_%Rk.!:`%bXe3LD;4EXc"%!`j9(m58=O?/P)5%GA(2=->\iFk%=$(Ue7s7d0 +j8)PV*J@G3EG4j5(f0%qIA&Ek5O(?lq?6o**nU'(d34R?U9)R<@lsNpQJKb#V7#"b#Z:f)BQ +Rn&tuqGs8D]AT;+Jdk7X(1Ne?26m.]AQ9>qiuDj*m1eb%+J@QBI@Ig@!uAAqDMdChkSL[B3Ka@ +_%W'O3t`/ZFS+4XkXd7('1eUFGGDDPj!8_)U)>:AB5#[g/u43fY?@q<.iI?N?FYIKW%JTS5! +1?QHM5E%Ba'Wdp#/!N25PjA2J+nfgSWOZk$5jr5aN.p?UaVD#jLWi;W4FaN\m4!q%4Sd=78C#gld>4f"Z5pf9%gN>rKKBm:`R[+)l +#nJ_,spRP6`CgnJGC4UgJg-kO:Y!b_Z'GS/S0#W7pVgYl3qR*-<%8P_5th)2^.4QG=kg9&]A! +UFt2fV1S/TD2\R,/]AncT#M`l"dNY((HCP@[?Y4K+J=R"BP1F?XUBU)8JG[?:qu4+1-QBtmF# +YV"Urn;1SP07k(#Z4qbP\pK)D6-up^Gsf0!*Xn+>C1p_V(YU)UaO<`ET8TmFb8J'ELKb'+L]A +JJ0%f/c(m+TT,!KTbbkBdJOtuTn&M]A^ +F`\!ha'R+?T,-J^oX?k@W?uLSd(kAD/q:mUH"5,sQaJ+)`rk*GD.Rm0VXQ,&9%HQ\p!9Mb]A9Af26WV/+,]A0JBsa +ljX^isO05EW<=kqef\poC7fV<%rQ(,m1ZP42.^m\VkhjF!s=6p&$O&Ftbr3m]AbOg2nPgb!`X +)dEkQG4Q(eflVT@C2"4UUqXLA]Af?IG8JL +*Sm9;lt%kiLR6ht=-Lo7DqG-HgQuj*'daMSUF#miS%GhW]A`/ad2iH`Z68Vh:)NTFAq6YiFm* +[DW@5@0TmA_q2Cc8+`UCmc2FGTBVP:pIlHVPE,;os?4W/nNYgHddXh!COg\j`*Ea+f'#/l^c\__ +!Tm5iOCr.#uD2J2J.IOh0,7;A^+iU6g1">..JYL;u=>&pY,3)oVF(pCq$47m8oBpESTCdtq#3'\b#T.]A]A".@[b8P5a-Qba=b:_pUCVF +mgT^>0'Ea#Sj)\jPg$Hj:Y-G7<3&s0c;;k_G'hkTXo03E<)G_J6RWc2P47*;:GRVM*o<+3gh +JXbG,NLC+1UE>ElTVJOIG^%a0-+QGHspp`T8^d,`V=%,K[U]AGd/?%j.H)%J^36AR=56ienhW +7NTq-%Q>c+prAJ"_<7b90SU95dPaM.EQ?<#P6T;3TE:-j,Np)@`b%t3AtL(7Eh(JV0P%i&,f +nUh'lb8ApFNZ,semfbGo9lp#V?$F^5c:<.6f?6W8dG+D_Zcn.\-L1mdL$g\%R4]AhMe,m52X# +T^@YHJH7#ET>GkZOljj\B/ZU(I1"[C\tj7Uj:bi[OrO8(&\X%`#QrZ'f:0W48h(@0Y@W_4`Z +T>4Gqp0CDrr"\pMi?7hBOr-I2q'GT7V@0F1b*'t%"3`6WdgG-i&$WE%L!.XP/ +9`kR(fE"bj$$>'OIbH7!dP*FFMakn'Y6Gp489:s`1r/&jPoa'S'c(hQI\n"e"gYHkQ9#,B"R +ZS"u^?[l!E%'E!hq`o-I-npNqg3Y_YcZ=[GHr#7khD3:UAt_"qf\CpqNh+T&%h@0&,gK1?Kg +jAu_n>I44Zo^6a(":+^2n*9WFo7$!G!FWI&%O)WY;[Ck-4P#5aGRiTQ,#7_FYDbrQ?KXI^5B +13eluDncY\mLCG,[CPAKImk0d#1:EWl+Zn%SnY"lJQ\)WOLQR-A^?6`>PA5RL!Z(,/$6-*:L +BV&H5c!jP1NX-"D`"B3O_Qg[Uc8Hoj3#C!Cf.'\iTnBNT`(3C)fbsI9\9srksjel.7h/:!5, +IW:4'!`Q5R$oH]AsMdM9G9Z=DHVeY4?"d]AZ#AP&,IT*aAP>"4)J;L +HYi$"I0@pXmD@>CJ>86rMrt:FSq&#eEJa![*.pQ'^HJ*A;E4sC*I%g@/!V[Rs>9m;PL_Bt&Q +k$i/B9W_ir<7-Fs#`O;,16j45pZp(kr?HshM47547nU=0%Npt&NPNhY+Fq6o;A`M6*XZH:4. +udS5V.aD?,+<<6MiUX"+O,<`M^\N0;562YLW($ljgK:t6gf=\D8_qlWVZ8PQcQF3KYu\3.V6X%%06r*c)kgLsm5e;NcB +O$@TTLCnEnCOAsc)"9hII;b<.jj4rUpIiHZ0G4p&"']AQi5Jq-:*GB,;Yfr!V]A+TN\BA&jKVeef]AkPH$N5;*\et(op_@s[BdnaciEt4l:<:2 +9[*$^f^dhkJf:*6r6HDq2N)c!4)]A1>g-mB21/n'%UlunlScIQopH!/F.+-_D[hcloS>(L'kf +!c.ffmj2I64P4bi0.&`ZSC':Y:<]A`!U>G%T?!/pF6G98[tK +1N1Y;cN7"E1rpHpT+"QEj/?kAt5Zb(![p%l.@d"!$0`]AXi#L4#Bj0&We?$HPZ07F[+0#s`+X +fVHtXk[:ZtJb_r7Q;.sq?D[#^$qb3t@Ae_GV9,Ib#.Pr9ccVoGL7lV +)-0S5`4@o$e:qM`&?ndu4A76Y,!pesh(dY84o_P^7d8%mh^%QGPMa$G+-L:M))KAP&JkoUme +qKNug868h<Qr^=[^Q.U;\@nG+d1?$G`6/o@ +Jr:SBQ0U#!IpZ>qu +dEQa7eoC9B4;B*"^t7IgTgofM7(J9f/Al>tJE^$^9r*:J#FJql;Hl,Oj#Li%,'D";>[a+SHU +lG8t/">Jnlcf1%`cbe@UCq%TY!',ZH3\n5Ds9Hk+[@p(?E*KGJjU]A-fG*MoG7B=BKE^R!c[b +>O)Ll(dp?nE_(&m?uN'1Wd<93V/rG2]AK3m?j6%TrhK9CO(;,hr`@,-,&h*4d`?@4i!@WpQH* +RM_6,mJ*;-snfBMn_*\!+$P,:qMY*laUdF?4K-e!Y,c1<.&A7:Z4Yb\_B'$iaU?$IMD"Cc+p +bpsBA,`#.d>/W&X*I0>r+rER.agt/jL<2o\?UTo6EHp)os2[aH8:JV2O^GYs%aC6#]A%I(CF^ ++#Fmp<\Sq:"`mHY`e.3R+Q&._%_@LhT/<\6IM\FgGs$<#V6V(LqDBO!^mEQ/ia?bL1!DQ:X@ +Kq4\mlB^1;1NKW"Zk0D'LLY.eQ&Ur22DJM`rE,8nc=N;`sIl-)tC@(d(4+P*e905n3aJ'8LS +S\Q9TV=?n:ZP)]AWDjVnn@;28fWX[%ZHX'I&!($*,^Wgcksmq0a:\je2LLAXE26)o'q+D7U9Yp0[3LWXQ:k`"oGR-7LIE_9aU3'Mj&=G*s=G\3Ca,E#-$dtVF4`0&2!2e1G47?5#o +$)@I%KerUl4E(:,3:,!!WatW?IK]AROm'@M+;=H6,$3R=+)*h!dcjR:+J9]AcR:P:OP^JI\N3M +%($rosK)eRoG`d#X$JMh*9Ta&A1n`C7 +T0*Mh">iulA0ES=:UD:-D9R<)No5qga0oeU#/k(0YI*AC6JJ=P(>2EUQXS7a;WbQe-:MBU#k +H*I0BA0*4mWO99U':.9lJI"<"'7irEJeDR7*&MF4VW32[0&dY +T_8g^SUpC4BkRf@QR"W[#%>D^E#6mb2aDokETpb&Patn\FSf%S:8-8/AJl/(=@#?9shBP.[0 +"0m$d$2T$nj&?[OG=+(,m>+Qm#JRoW=g"5s+ei3684r=d'20f$3?"rW42#q^!0.E(e=Ig;q[Z3_p5tH&"u5?op]ARd^!'u&m-GhH/OS02ZGL67P/Q$ +9NZo4M^FTFf_M'm[=SZo@99P;MDAm:RAmN1(OPFriQ;]A!PFsl]Aj1a+`mX#(n?^!e%5EcgjDgBfCol;'3")m_nXH2\WI33r<'dgc`^kVj6< +"Z8Z4/-YWZkF)JG[pldJ=,_qjATL\k^^R-2F/7*pMoWc0eik9nN4E^[eaUZ@E^r6BK^6T<[j +b/HRto%$/_6W,&=d=ZgqCNTQ4krmP[pmBm0HJ^4!CA$PN-Z;SC=i<_l1]A,?Yc9Jf0H]A[&I3M +(mWEdT^e_iA?OE6;M$,(6lVT5&ZJ!8?.!&XVI(]AjED.I +kbBmS>r=:i.k0HiQ!Up^`,P&Ld\-/'!F1QhuQ5ET[44h_iK(0IMp3IOb)jHMm,ugW.G7-_U9 +TAWG>Im8jc5-9eK1FnK*=`mYIIpCFU*%qCNieRA?*oq0"u=O1>+(A(Dca8OIWGiF'Z@Aej-? +5"bGDtrs2K!WKNPl$A[=\5d@eEHG[;''iVM3=]A>f+7Zo:oBe\+D#[Ph5Bb +dokd`EWs0]A]ABp^?ZRQe\KX[D*e84FTS/Nt)#CWJDU>a1k+SdUuNpDqA-@`-A6VIXgpKO8\C2 +P4'cHI1J0Hob0SQ)<^t?dt`CA/hdGUn^R#D]A*t>PKt;+pnDI +UVHZIaHS`HF0.p&eqQ_1LnN@JibG=X3q#Yl4aOpB3_DCiL7G&2Kp9C]ApHYp[M2-.CT(;sPh"HT8K29/3cP7r'G56` +bP&@Id$2,<5S/O_dTER)VPkm6a3ZT6]A5do)A+qZ]A-RG\WZ)<12,1CgS1Fu'D[IWIr8R'J_?V +W"o?,sgtZca5TeS#C29\s9M2QI`:it^X6.>_1h1/uB3T@rXX>"4;ltLJ[jUn@3IJI+Yj_Sh; +sOA.*b]AK`@+oM`CKJ(mhhtK\o%tDKBs1f&6*Vk-^hj! +$/?.,tgZj`J>GNR[TjYpht8^,J*[-u8/pD7%^f9q-GT\Y]AlqcIiHc&)6Wi>[7#^0/oHF'eQu +?d6=aI-Q&CbrtsjTUhWjSo/V?MH.:X@=bHac$V/jSlD'SE_q\aoWq]AP0"uS;8o($FikLGAlT +HeD%]ArZ8\C5j*@nhBHYNA"8@dB':Pm\VB53_q,Vgf3naGXY(HbJ3.ajRcm`k/WugYCN;Ig^Y +GGVK$^WlV-f&*IiYZ2aIq3.JW.hMsb#5.f+qOp\>9>+W+Gs%d"t8tNW_,%Qmp0kN.Q_1aJr-=eHGjj$]AB&!/hN8EO^[-N3a +q%h)u4>#@\Vsn$_H!C8krJ',5`Rk('EbJ1QI%BBST,DR=B(#Z,J&[_+/Lap$_lCCtF#7X8ls +uVG\+K+Gj5IIa07H[j4KQ1\?LGkMLHc3S5+,OP?KsLA^UeFHZ%nj=mdi)r.B>\'@t1(_?V]A, +FR[Z&)qgUXEo?V>8o6[qUV[EI?QQ,i#T)Ytm^#_fTB*$Jf*"?-H%4>+<_uX+SV32 +LM4)G00'Ac:i5i_Ir^753KtHh`GB*rVi:sI87SI.CXB]A)hgjUltkhuI_:Y)i:iM%Dl9&5s1Q +&kmsF+^f@g+V0/D.nZb0,(/0Eko+CbA+.1o=.aCqorkOdd?"+7o#oAJO&Z&Gq= +RP`Pf*04[alsQr8/Uf8,iM!_r>U,a?TS^T@`C)QhN`!Wn[3;hLB*dI#+)5r6Y?+DsOJhr7`1 +UkPUa^\-iR;r@_OM@,3"LJ<9OS@T7"E"9LkTGT[$E)Ce49)A&ZmLA]AN8@$>_KWTV1:$p`b8l +K>Iu.A7%J~ +]]> + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + +
diff --git a/WEB-INF/reportlets/评估结果统计.cpt b/WEB-INF/reportlets/评估结果统计.cpt new file mode 100644 index 0000000..b312ecf --- /dev/null +++ b/WEB-INF/reportlets/评估结果统计.cpt @@ -0,0 +1,498 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
+
+ + + + +
+
+ +
+ + + + + + + + + + + + + + + + + +
diff --git a/WEB-INF/resources/chartPreStyle.xml b/WEB-INF/resources/chartPreStyle.xml new file mode 100644 index 0000000..6579af6 --- /dev/null +++ b/WEB-INF/resources/chartPreStyle.xml @@ -0,0 +1,499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WEB-INF/resources/chartmap/map.xml b/WEB-INF/resources/chartmap/map.xml new file mode 100644 index 0000000..c1fed5f --- /dev/null +++ b/WEB-INF/resources/chartmap/map.xml @@ -0,0 +1,38791 @@ + + + + + + + +nkRaSQB'9l';eg"6N8M0qcn$1=S'WS9.*a23-UXs>Bsm5;N +-8cmUI91;.'Jtl1@;1GAO?iIS0BDETV)-`dNRt=5$h:[bJ&;:#C9gQ^=I5Cn2Jh"PPrS6i)B +=^OTeqsP_fZHlflu&o6'?F5GVOp?cjdXFH>,b'l$@_M?L1W!So5:UGG3rQX*&0>4?Z@Q7JN# +^!ke"'/Cj0s)F)*ORg=Xg#0oV+#$]AF$7rI7nS(X%Zb&Smc +hcQ*tcq6]A/-T!'bpuL!BeRJaP6`AO]A/0QV^KVG>5W45`\cU+03[@u!Uq,Vp+qB/4nK9r9Bm& +nlXaVi^;-sT9jVGDcACD=HI)off)J2IM`59-qtW^S6sS>n;9/;SoDS-6Y)i>Hkt=@*2+l=?5 +D8P!^1Vf(q@3WV_R`Kmp!a?g92*/q03>[0\dCBg[tj^QnL;PTUe@fhLf6S-^WGn3B!mBPe@ntuWX^(;1iifBrFKTf> +N?d9.hFp86!ir>K`MsT6XG/QK+6o@4D0F^PWR.Ai;YXhp=8)OkD +5#rB>XN05uF66A(?)LP*[j3]AIl>+l?[(D?smm@!iA,5'o5#2&.l@c)!LIK+hk&blq[1K6 +sSRu-SOj1D^&jqlAWY-4Ppi&$`\AdOc129NG49?)R&Mi9Zk79XCb>Z*a0Y4bK5mg&>TM>UqjhNT^*1q3+27!J`^2T3e%4=QVk^Dl0/-NM@SBOPaVJH=ZQkG@Vr8S9h!R$ +Fr)dj+?#Qs)1t;9aciY_`=1,\fOVd-$g`6)Fj!1FG(UJ$L;:k@P)$E$<9drO2&KR*W_^DI(@ +H!C`edISG82GPg3,)n*f'.>0o?&8*qReNFLqsHf.\l!pgsKSjo]AIR@FGgZm#p;'&=A/1&K)m +7YU)2DsO[Jn/IGnD>1rO9;Mo0IGkuDG;%rQZepR")Y#OJOAGIPcFMn4E(OpV@OYGMg8o`(=6 +:hc\/Nr,S'NP\DrI%>XN?bMLA+KdRgbbPaTsi>fR:Tdn8CMJbc1&KDJfkk#,rX-pe#=2q@n5 +pAi%u'+`$c+\\lKo=tmqC^F3'[dd9j@pbA@8H8JPEQW!(JZ#"hX>OE5\NS,eIj-,Xl6p[Q7V +i9BpFQ"8er\_,c^fO#ueMJ*N^(W8KE0$KABg\ca5-O%!F^js>r]AQNG]AWHkdl0hMT@K(+5_@$ +9PJq&p&>dF@98k'%Me9p]A]Acp-aZ@@5R+'\&ag#I6%RU/28A'R[u1^VQ58%6[^>Y(n8!\OmL# +h)LeL%iJ*"4=WDWaoJQ+\>=_!m6C!XI4TOeG)sb!m&-D(./Y^RgQ\W%^e,OtDS2#:Su6Bgk\ +*bnoNb8#nrVm$ZLDis)_If__1P`n6nIc\0?i&laGQ*f8:qUZs-f8W#&^k;tUbf[Sb" ++Jq\habX[[me^Vl;6\;/BO*F;V'q;$H[-K>sCL61WMu2s21&Qj^4b\[UDqc?L-Qr\n69NT;F +h3\/H]Ao:_@4(qQnB.[WYogROSp:fB2JtY)6R9kk9E%^R'1B"gTWVCAD2A)l"4>pqTt9TA^n/ +q@BJ2U_dUT+$d$s4#GiKf6+-[a<&JdCrS?F]A"C/c"(J.Uqs*a5:EqeAeBU%Oruo>8:Iur?(T +;BCs6Tb?b&Z[D:Mr57V^R33_UR@>]AT9<7b7g\ckV0m\io[9srV6Uh@-l*-W%E,+P6Wo1M,Y[ +%_NXX23[Rjd*''lBcuMhWde/)=jq22h1#c==iGBQ&YdJgIA5/E4BB0#XWFXZ:/D4qXs,7#Z8qDXAUgVf`4(&1XK]AEbm(LKMoWD:q +6ZC:r?+d7YSs/?Hf6o-XfF.Eu+XU8!>]AMB#?\8f4&D:;L>%BDpa9hT$/&.a'EnSN-`:Z^^)LIdl,^bVYQLZ620X$D$'!=EJc5sOIWPPmp5TB*> +:7uJL9)n*D+M/a8]A(U3rY"0u:F!,aH)7aS[^IfMk0`00JKO-9G;r.:oF31FN.(Hg^k^IbfP? +7;3rt;7#pU<4LqE>%-Q^He&(4SHA@`QDMESA7%=ZNGpEeI1>.5,@O%,A*(I1ZON+.lb;nFTT38q\^@(..IBZ.;X`CE2bfeI)\I4=okIqeJccN%&'lhFBEfkqsZ+"+7eNu`FfajAc)r;ubOPr<-.]AGM(L +2m(e)%]AX*h!e+4m'R1@VIAZ3T^sr!fVP$jWl7r95#+ +g]ATL4LNuY'Fe&kl:A6^)O+:5,(YHPRe]A=Tt31XOS42DP_b-OKI'^pCBQZ+@E5^":O&[F,tu'i=f7j0LSq@&W)c;Ck +o47bE3m.R).RDk./HYjZ6A#b?Eo[%7R02AZ%oEFUsXCL@tLTK +VjDtu`H6c=@A@dK3i)oL@^EcXT[F#qPDf$&Y0NA>c??k*g)DdQ`m[P.Z%g.YG[7f^M/f-5N* +fP@VG#^]AlO;FR5Bf/kU4mgOOW32fWH[0siWM9H0n,HPBGKssmJ4$.M""8D#=UM/$u75?>3.M +)=d0B:S"M2;_>2:(=hLG=d7;#?H\B@b_k@WeoI$f3=2F2bZ+jf0>=P4Y%6U9uiS=&f+O1@ +X/)6j189YgC)mA<8HqJ:GsUZUr8AYC6"rhln&X;L_H\rAJ3>9FTJi,N/ +*4URPs@o5T;L)lTN;q84OTRrGPp=5Rh#0F)"`QG9/qTKt1S(q'N&pRc!+?H2_MrbJ0"<+`nm +g>7:VDdp$%L,JRF0V3+Xq?to(tkht&PKB(MEY2f%!j(/sKa,VOM(9sZUrsbZ^I?cQbGk +Zo(i<[K^]AZ6O0"m]AM;jHp,4JCeYpr34ob]A?PEO)\:5(]Au#5tH"ZL28(b)aCWS0 +1U\:Ck,oOAW-Pf$Ban%oShmRceb8bh-W@Nq*Embq&<1j$B5=^EH*&IH'UNQcHdf&+CClkYCM +T8P2Cq?0@QKT0OE^Fb9fN#EjXX$ +g?F^o!M_Ysc4It9WZkDL\hQs,#pOrsL7icXI1jjNu#)fZB7hY[CYE3dN,[ +1+c]Aq=g'cA%"tF6++6's25jpN!6ri4jX=g7UG.qf)4$7Wm:"L\U"&Ok#J +YnuM[iC<-P8>)5J(2>2]AuCFs`>d?#6A=(UT=4d*G<"[dp/q]A;m?`*hTMSDOAY3c"5.Q.l"lC +dr=$%<>d'E'e>2NV?jP#C=CGC96MdZ9f=;Lu[(Wi/ES26omGFq2q04b)Itls9VTCfgd"I+f[ +?rLY^N%2u8_M.r]A +;!^"3*+)Wt,cP=$'f@CbfP;"r"%jDn#$3HggebjQ]AN^^?9&+Rf*WC#=Wo^YfI4&c0;=YK)HT +[Le?9gaArc(n'/c+&%`e)JCT-cBs6,Ynsd<#cBhSCeAf+kin(a!1AD.KV;SSjQZmM;i6VFI:V6WSCK;=e\p&mX"&ef@ +'4hKaJNfl'uP3oKY81T(Yi,OE4jGr0B>E/5`=36ED1\)ku>r'sndNf!&nXkl&2*&*gQj:n=D +r?deZ:"&b,hY"kXY]AXY[Q?Sq^_"?BHUjA(8_gsG)6]A)!]A7[n4dYjr?6cn1D'#%*KUZ +@]AE/5rHh3?AmKZR`(EU(BkAQGC'SCFWC@/`g@[30]AAk9Fi\lXU&= +hE]AEBo/*HOF1rZS)b0>A70["[TZ/Rc?c5XYE7!sl:?A9ARK$JH!_dGI(AFj5?D_aaVA\3TIH +-nO#^^jRq[OuPWl4Vg3&hE'0ib0qmd)@ZL$hJ\:MYfYf +M!)aRt/s1O-_3054Q"r)`p_[)W&2RA\WqB'AfUWmpFrhr^TAk=J$14l(O*:p\[C074`F^p4V +!q5%8Eq8!\2Qn1gE@"OEVa9J,5[?!Z#;L$_!QR,YYa8O"dqs?T288a=cM(mi(GCcg%94,+!_>mBfLNItRCojX\g77QUgoI&s5O^'g&+u4\]Ao2`LWCCbuLAD,TfF-B0]A +4_#?ig&n!1%G(;JQ&Y@h;.BkN+Q59)po65*LuuH'o.\/g2-YY!S5&"CO$P,BEVHgF)O`i[e6 +rNhub(_.R5q0":KIm^m;9-:&\4,)sj==&g^t85=pN4Id/Td)ceAWnVHRl]AetmKpQ*d*^60/Z +G7S[0_T*TN>[:=9TiW9pKH<]A4Z^E)OJMf)LD@H5)mm,)Cd*67G;F."SLf:M4Y5ijPi-Wi9\L +IKfiVTB$iG,;`b4FNiBiK$<55;g3hjuN+asPD1`!WJIa&\pRRG)*,#-.N4S +?>lBL\gJ;S13<$g"1?#l+P(QP)Hq,dXmT38L8b"@OI0"tSHD81S8_ug7n_2mQcVRQsit-`grC(i>W/a&,;>Pi;IQ),D*"[/ +Ip0.qCl(^n_H^Jfr\b7h.:)o0\tk"Wilbt2MB.6AO3%INXDA&!uh.7*Q]Ab*FWrVZ-gBDHV8BB5@lVq= +74I<&WL(eU%I5QA>VHnjI.[-MqB@j4KVfs.@WTOjmE]A%UBFl'SA^00[Nm$HMV+/2OrV\@@ej +"P$lW)OX;]A7Y]A%c"l/s='2b+,Slr*V9j*f^!NRA71@Dc]A75]A$e_GcJIl:"ibRG=1E1X2Kr%N +ZsIM5=/K)'IOq/9,,Fc6P/P%kT_q2He(Df@;m0FRHK,@mOk37r9lgFh4A?XU-0Mgd1=RYNOB +V$U0>9GOD)>N=S5hgkOQT_$67^q96Gq9`!"^jrEYjqlcc>4c8*,?F$%"5&dq*]A@']AD3u`L_F +d+-M.Z!Yp\TWIR:+]AAH,)+p[s'*BIE'-CO+NVe)Gc5"05K$#eDlU(9V]A]A*C\ZjA.k/^5d>a9 +QjX'%@q)OQEE,r7J]A-jG%Jbh!"foGZ>eYb*cDGiuYP^&ET_@/n@WqO.I$Ipt-6-RpM. +T,592p@Y<'G+VkbiEsS1Y7VO"]A%('MS2cO[_Sn)G_^i"#YR0]Ar\/!HeO_!/bW!XIW'/sApe) +M:b\pN[HO*n@K_W[bGbKAqH$:q;ecVMY'\.(jQ:.76`j)-\h8+,5/\`"L)>!5;/as9Vc.98r +a2"PT7-M$hRM@`$'DA%,DO(+bX),]A*4Bq^[$(LqLah@7R@5SPpO@K2Y.lZc]A[D1mMrm;I,+S +ESSF/jb8lF=!Dk;:+/?]AZ4!^XlRdYf4.M.0%:u=b<9q%c+tdoXRr>@b%AkFU%Ao\2 +;X\V)@"!ie.?HHhBaY3&Ro2(`;>p"OcSX>t,tIbTkX<`nkbKjmZ$cU2,8t+kO[l`O;c@"/Y/ +\2_c>,\\b,F\LZ&]A+Q_nYbS(mt1orqHT$)iP(/V4O_0`4X\I)j4ZtV#5LghMIo=+`XUihA<> +Ho-'hc:;SGuQERXF-A[u2W8WimSX/k['tp!$Z_Ua;\-:ummS!0/]A]A4^G=3bK^:drJXU%cJ6K +Oka!@46Q(H]ABNsr-3?6\T3W0E-8XBDr/3X^Xan<#2\mpcqknJmqtp8s@:UuZ(^s +s$\C:CnZH%%6H\6:9F@i@8=I3Q?B#_HXV5RWPa-dinlDJ/7Hmt;Fh_HL/muTkj74mGAIL$$+ +VXXE<;rS.\U7AAAmidJb\^1%#Z;L3%Rc+s"S0"%[Z"$/8AXE1R'j%Eig)[?fSid?"`mn+f_B +TuFW[bm/\9d82O2T5pf4\nlG\Z/;H9[56^]Ag^4kO3T%=+AS>s78#&>L$G>0 +AS+h>??,N!n\,V)t+r@/`MmeX@/1LJA,@utg9k=$1^_>i-1i_D/XGn#Tcu0`@)qh)nfA@&(M +LHM=)RIBAmleYa4-RZ'N?moD@Gp&oi!4lFA&c'irO%i4UI=k&--Uj3Yc24$^)$LTiYqEF&1? +UHM7Gh-s&bH;cDc6J;)L>H\=g+fcK7_n.]A^_dd";r$BXT5G^[ZQ?Mur"4T.Yd.*AD +F*K_6;Y98UK>_mP#L.P0PB\uCM2J[D)<3*oK!l>##.unEPgp=^QG8%M"*3&-fK)?S2q\&l/4 +Q*'Gkg::WO[``7R;e?ibGVGh#;\4-9T'W,U)WIb(]AL\>fq!b17p]AXb&mS`lG5a3CMr1JFf<= +RR-$OD_ho8m^[!']AGEQPlGMTQ89=_N,hSXUmcB1r^Q?p=T-)bl.g1B_J'V +2kQ]Ab3.+\j^\eq[/oF$[s;`s_iVi0]A_We'*Z`Msgn\,usR#R1k=?c(Bf<^_o1@,_^3s.7SFG +([>,QpS''MqE*%;O(MO).]A +ADf8CE]AZ:-J+SAEGG2u`947*Yhdc?q14^Vk8djp5P`,7Kn]ACb&28naqX*6P +?*E]AGWa_8iE>*OHNO9_&eYTA#0G\oN.7C#Rb)2^dXa +q^-'gd.W#lWfg(1dNoODYQ7T/K-s`=I80OBo+fBVpK.YT\WT_+D,\"b'KDW9WM67J9UhHTQmQE,Y>d/dLE^P-n]A&:f>FbDEE:-j12\h@X1HuM"F_ +\(@8ZS8lE9X*aT?C7BMZ=@8?DNoCOcj3$X.KSsD;>qlgYA]AP/S+J +=]ARVV-AF\C/HSl_pe3H$I`>XSLo34(Ue%LjpSF-o!n`X`@+G?i[DmHoIJCVRQ:b%A!ZWf`+gH<*)1lh,jV>6ruiM_I +CT[R\K02`U/8j7\`p.ji`9B=TXkGDZ[I99l=0MH]AV)MdN-ade7;8CU<7!6(CN97=NR>q("3ubf#WD`M&2q]AU= +?,M-\)MLT?WmQOOb^OATYu5C\q>`rnpnhoG656Bq9OHE7K\26=?PX%EN%R=G%6o2s2'iJ:l& +BiR+b/Lji"r*]A[ljps`9V'3[/[oSqC3:&S$S-r"L!5b7YL<=J[mJ?),\-m1@gIq,ic*`C891\$+frebUQ_>b)gIP.86VlI^Q,f'5s_ +JB3NO5GjR(HK+lXJ'MgAaaWa_W;e@:p,X;&s6#kSm-@,Y'lC$\IT;bhh=C$AH2U&Tccb03eb +#ePm0D;[UD=aLUlQLi-#_-.,Eus5>%Y#R>)UH<+`_AV^JJL*IPOX\qOiMP<$9 +anD.7MHqoLG`h2"dK><>8d.H]Ahc.,cT5ukFc5oNEXni6P%VfA=oNp;0D3mMN*/fG]ANXs$Da5 +!MmD7%]A'>51HfD@O[p"qF^M-Ft23aDe:$gpZ+d%%j5B8Xp[tlpE\nh0`uMJN,P_kV#1)*.QI +BJ10S<+M]A5g5qj`bHT>\AoLVf-`Ssh1^q;kS&J5f[dV37QU;%=U`YcH1XDCP\NfcJJ)^uO\ +D0nNd"PK"64m6r8bZ$W-B2jf14-G5u)CV5_[=-Wh&2mNP?g5D#O2;B/U[a.`oh0i?2NA("![ +h0@WB=!iH.\Al6gho#u`nW/Dh%:KUN&k&JHldk07B78ZU\UDNDW/#Rce]AMY:H"+gDKeXc7A$ +,+8XhM#Q/#.>oLegHSQNt[oK&tcZQW`eX3o7,aCs'Yb"A^+2/'bJ`+[s]A$p&r14nNP+:)l?.Y8:JI%A4K.Sei)$MHPa +LO<<"3RuG69=2?`G0Um-t;.#lgon+m!q`=#-\HM0VOJge1G0;ht#rCH+rq_hIE/QUU:+9[3& +o&Z-QfuU68c?f9%^"]AQ>m?QfqUjKN2jT-OS963uO0_g +5"GP_69J-XHi&m>CHQEJ0$%_j6+_/E8(`#Et3M*b!i?WfqN +i;6EHss1h"`f`M]A8:b*njZG;[,l('Cae!jBLU]AZHu:U[$9ce?T1NHpq;ucbQRLQLkpi*deHHb$%4q-$pKud22Us_5*]A0pHr6i^oV`Rc!@W:)?K8( +a)#=hWh4T9I]A[S4#TrBAE`a=#?dRmc("nLPn\fgXjP02rEs1RnYNUP0\Z1\NGB7\f3g3oZ#< +L/ERYGY0Uu"Aj2MM=ZC=:4-rg(6FB;K:bKfBULrT;=+r4V^^O7Ig6*$u1G%+8U;M^_h*C +CaMoa7N_Z*i4MdR&?r(N?E(,b-;G_[9G:is!ggG^TuJ%LJ32-E-QPHEnt*;na[8U;$d3AJA, +?,Yu4+QQgnr&"nY*HA7,B[(KFu+Iu:TO0Q,q)(@laVk`8mad(q2M>Yd_`":e<^Rr;==T]A.ETKJKP62K#NU_[d7NZT22);QI]A+3uqGsrU;QK$+c1BAeRW/AJoYp) +)[/@2dbiFs_^033;dK(q2:Y&TA:)AQmL3_"R(I!%YPIDD$^BJBr$2F(gO"MDII>+$cNn[\Y6csi>H+2Mc"P'dJr(`]AJ(J*fG5?s>ZZ[`\eJj6L#MR6KDmPb +>"UO]AjL=70(L)(R&SDp6#Ch36X)g^hC-3,D$STHO=8e*Xk0_:dW[Ak8H7<"L2=[*;+2/gLi4 +/f?$5@:%\j1F;T)mssA`3EAoWO8fq5P'!WWj<2!?jQoQtqfjLtA<'M#qI_n8R/3$0rk(12mZ +OUYRXE!cI?1"-/aDOc:Rs%0"&,2(pZdJHol\k'\S5`m4tMD2pMfCc'0AKEK<:MG1>aNo[?_a +fF:]A6:Pl;;rDde'lGMfrXR:Vp;>(D6.0(?Y&5;dB]Ak(f@m0npDK-@E7C;X6@A,FB'?[oE[;c,&T +$7O4,m;iime-kbVjQ@5ZW>mn`\#qmsNPG6t% +[2]A#s;A"NMnGDbb-+\*`"q[8LnRiX`L;WuVn%pd>pMlWj.*Z@1'DB,0TfN0k\ECrHfFT'l)a +:+SiT@5e'@i:[i%p%$!>57AcKY=Y8a<7eal^0LD[j-gdE<^g@Q]AM$/W2`:1ghJp\[Sf`SZ`! +S7oEd^Y321r^8nPnOn`'?'6/%HQ"f8PkoL`kY`fO\T:iVn6UAcV8&]AUE*++A=8Gog^4uek6oqOri5"LRDd?fECc>kXF)gu(2cMVNc7gn(HN1^29L]A+kU.d#Nr\CMZllcGd,"nm[.okI +ZM!0BEI#k\V@#L)W)ln,UMQ>hXBopTY$mKig"p;AW6EMjt5*\[2%;FU*5O&f!2V`B;6d_F6L +Gb5r_UMT2#4\0=qcmFeo#p$MS_=d:>_P3YtPasn*mr>QkfNJh%8rK[pGC6j(b]As[:Z;Wq9WK +nR\,scuWXKWnH.L+?tf84PT +AL2ksV"_oSC3fP*ZOdtMZZ>'n"RfARt:<(jFep\[LP5[/Y3#8!rOaYYU:F?gB`&NTK=\_b6f +[kbM9>oH!>d$[IHk5&33ou4.XhP-]Ajc_n0[MCpIf^4o2Rn@&aji(jNE$!=X6WiOA91R%JOg_ +S`nLYN^"k1P&2H/+T0UW;/P5eHN"6c(b.eF\&GM6YMg5%*"&(+"6F3.5:Ta%u0oI&6U,%_K+ +c0tE0iDp7IE+3(Yf&O6`^7jK3gji(Qm;Orh`fSb/eKr?@T)XC\C&#)i\jGcn)2Mq)I(T"jYI +!H=!3/.JMb#/@@2VZMmXRl,I?@2dMG(?^rKnaaDhL&NUFBYtSKP_f,*0bWfFT^)8'(ShleK$ +)8pj4C"(J\kIrIXM,i<(FApGkciO2_>C`jel*NIFUf[\R_?nfE2FU=6\!:KLpc#;8Ja40Chu +Lo@EPI7_,*cmlB)NjXFK#5LV+0BYhAqk!3"YuU-Q`uDpZnbEXu)VA@MVaPk +&oClr+E672I(8WTrbr6'1sJTo^Ua8ubS)B7"-PsjF4aN&VT +'R;CLh7O6t/-q;]AOiLiSX86e^.H'tDc;.eO@#PnG,HM31%"CCk``kJZ%W(Pcpm!?9@l?ltF& +J8jj`X[L+OLM`\?"`LWbl/]A$>c,^H7h&Fn+jKCi:-_]A]A"t2NQ3?S%>MoWe\O!<(=I`/j?QrS +imo7U(!J<[p1gC5UG5e54_<+0jj5%9BK,?\f4c/?hNb^J%qcN]A6Op8+YZNh'n-" +(Wk,gL,[,^:=j_OjB_=ioiYJh3W3T+5]A@q=c_'G4c;_=9*Wh%f*QFAomqTkNR`)Qa,M;2,P4 +SZKq&;^IVk$F0LHl!En:#^Vi99BRSAE/\Ea"=W\e(qR+13:eanl_&V4^rc +af,["ru2I-N6!hAiYZqogN6+;G!>S.KU59BX8/YBK^\3/s"mkO^^XQr\TkElZSPYc:=snWiB +,gk<_;/"Pso)n"QDOSMr![5=.o\d-#;1;8GAn,oCc9ji/S2-X>!]AqGZ[d2c#;#,G4,beZ(nU +oZnU0#6I^&,&&(SQogMI5etkiH99Kno8j!'U@5lXkgjdsBX:]A*-a"qliGK-[nl+AQeGG1M&4 +f+8K\+M1BHr9UhHOhj]A7]A';D3q&p[8==^hl%?WJPo9d>D=uVXD8@!'MoX^uZGkAipPu"fKdE&)a,eIrG9oueASdI*EPTf0QR"b.J[9kbma3Rq +r+:KcGn?f-LY&,3I_-)CK1!/B0,G%DdnE%_ron(CYKN9t+i;`mjj5Nr>:Y.,%mi6HBs$e#mU +\b!as=WmKsWkc!8$?BoC'?1(`iUh#\nqf"4^JhbF^YK(Hq7[*Huo]Ak=ApXm)emkjnq2[^_8& +;iAD20-A]AL;kEN#NWB]Ai$^rq2?N4l'IEh128-;_'/OV;Dd"j[9#gLKCMV-E#>)1-l!)\hLJU%t?U<"VNN?58m9F[,jh9lgE& +STk!F`giTK0%e\',`sSEHSuO/.ib5/p?]A7h&bAo[Bk-M1uIliL9>J6)U:Z5"'?ObiC+O>`#?#kZ:A(4elTM47SD)!3foelVUZdBh.(N: +#l'7+pATiEZaI7H3l9J6"p)QmV&)hmYjl4.Z`9diM2q]AVRTOBS09?k;R,H0(n"$#X]A5Jt>!o +njjrFlp+B`k9R5e.YV$4V?2acceXM0F'VjMu\*1#1l"NmIa2OPea]Aq_=93*gV$6eQuf-ALXU +4L]AP\'@6<)nT8(_]A]A\$8<'Z+Ra)[EYCnbrl&Q-t1KU\7mR(4&HEUf\n$Vjt"01*q`q0Ik/aB +Ki112?r*cLUUK[/!Z"!dSoCuVqgqEaRW?.gd%'6q]AKVC;YO3,D3b<;37fBGCTE:?BV6.gX5]A)\cR +%\/B$d]A6.Vc:rEqMW$(ABL+*2KQ0CHt!XsQ;+'mRYttFuqbqha%f)[`c2^H&U%4\n)&'CJN"]A_qO1 +D8-\k.#JV)ApPUV`Dk;ie]A7(d\kFM2EOUm-K1LV3;+s4?dAlm:WehDo*3Oa&6e_=\7pTCqK; +FY$1:"jN6bFO_-(OtG6#:^+)a!X_t!\^A*3Ejoj2+o]A$CGW[ai?+WZJG/!qRlKn]As%".,V7) +jpa`VN)]AP;pSh4(Q4c\njM@2u^T +[8\BL48<_=-l'o'HarS$8DL`\M!b8a4T0d!k]Ai)FCC=cW$)TIo`6pRi8o/3.Vge'BL/cFTa($3QAeKVPQS+(,6+g0`6n)_"cf0'.E3,J]AaAHXMo.Qc@ +fpP_L:Elt+P@4lc;c#>&)p_D8YOgSlX`Ja^g:gMk]A61mPja"nrH3(Mp;K+;'$&&2Y>!MMd98 +Kt[Fs9)/b[((-1g'<)RDm)G[d0.d!U3pSt-=B%,LasE,eNOs'.`Zo_c[:j+9"\C#cQet;nUS +Yh=bop=D>N069F.O_]Ac&'gU*IqaZU!LlJ"_1?Bh]Aqfo8l9>tq$72BptHD!jpUq+>$W-94YC* +4S-nDuZ%RH%m@l/kj2oul>'7n9d$Qt0?FngVpUrlQUJW$pRU`KI/%$h-29cifKcGk"Ig.H1f +5Qk"?62eW*'kukg?*@S46?aD-WnE9d>Rml]AT!).]AtiMBc42DTh,M+;LsE*egk\G[$98W/n6* +m#i5^;]A9ad`L`Q/G!FO-g*/sE_ZpH:dNpHqsQ2"Zns6JRiEpY\.`4Oi*t`=$$97"TN3,/S-: +_ttIm0`m3r4VEQj9.h)TcG3.+asMMCMo8"6K`YIY7S3f\kN52*^C]AAU)?)b3Ul6n]A#3mn8g6 +E/?o7ZY@h("VLs/R/#rtVo5Y'b)DOerIj4+(IE/Tcd1L9J3OV[er/ +RC8r')Y90;/?L+bV2g;;]AQ:^`0\MY>R8q4B&5c0ek$_NXTB1FgJOsf8CBG)W`W,\,Xf@Qll9 +[6c]A/"/qHHfYI>FB9FnJ9I]Ajq?;qjdZ3ZC]A?Qj*B0b#*ibMMl&#b%C'T1)'5Z'SHSbKK5B%o +@0?68kGR=9HQ1Zf0m,^Qqqr09F` +n`.GtI(h^lejA/""B5kW1TKI3ot2kg<6,[`@$AZ2U\Wb%bV,sC06IO$(i:t;R<^%aWq]ANUOg +j_)[X4-r%\UH+j,dh77HR^+RDT<7Dlc:2J\(FHa="0Obb!Bj3(j?*XQ&n_nD]AT/0+J1uV$_Y +)_KL'_"\S'SU5qqGO=:tBamPuDB%"!#T8HukhTaH,nuk$bkL*)k6Mn]A$Ehji3lU-@7%.B-V`a>92TC:5&Jb5Xr +Ha[i)l`!K:5,7FO*D:cM^pC?;_(24&dRnm63Y>5n13@RGE./M%>cWWnJBAEeO-V=`fTj+f[; +!X_Us[+g7==Ol1j.1,t,q]A=P`nG_8='QP@-Gj9%X(4f5LbjLO>64!qLf:&^2P*k?(ggH*OUY?k"6p3jqLlBb/bW)?`hgO,@$5O[/XklB"uX:3J-b9T +TCPUR10)le]AFTMV=]A(saS"#_E$99nDL-@\n#e[FXfd5.]AnH$4QlO26>l!AAE#u,aAOM(h=,A +=UXm3:Zk"@Rp[iTn&M"5F>'F.GKQWG[)#NJcd)5nJ&+%i=lhm$n]ARBA:U1g)L*RkH_N+Wd66 +l4aYq+t7o'H"jk"0JO`k=K5&$I8=j,P1?WuRYMDOOX'aW*;*o=n=(JJoD?.cB$c;pb2GkSB5 +:,(E*MfG;>R>Zc=2eU"GU"E*Qe;'Sd#rQHHVpM48)hd7DgNi3-OH]AjsJt$I';s6N%&qsc2m* +'mA`*6C#^p'd7ulD20#dnYGG2B.'3h_L'0*gKgsKD+sg8=Q0o`7p,?JRP5Ug^SFDV0]A%8)mW +qo^5T>>amkp1N]AdC4<>W-/HB2*2U\9re5p&e/@e+KqEFMhk%,'Yab&N6hUD,;ah3^HZ9#do;=\2rEW"LXb1u;R,7,-&;bT9bh5LRn.^]AQ]A4r\p2X!L#$.%1a7@JlN6K(M36,"FN;GK9lfK&7%H41):4OJ#Ckp;4nn\EF7bt&V +J0b_a:/$R+/j'L:W5[]Ajjpc^oGqZX'&SItg+4i)YZH5l_U(,gm\ +Se^JET;.U(pb_?,:`Oq6_9]Ag3^,!fiGb^mh!9@omqQ1jeYImq[;h9!lRrAU;5Y6Fn@LHdVt4 +'V;F^2db-.toQiEs`VbaG^-mUlP-ua]Au"W9;)/C8&QLF5A4-7%DgfJ1@JXbT3J*q1X08F^Gc +7-[s9."NiPI9(X&U^X=-DF#Eml!n?O9aEp?*@AXfJdU!WB!8@D]AffL6[!E2`=8_b'$Fh?o>C=K.$ehQ:dbmA +8Nt=-49E?UqckXK&_2R6g8dIZ$O]AK9^Y#EHto'KGK.TiUDP7G,6#AI,?::D;AT#;91jeR`l'<965;2>>$+?lS2l:gOg[(q6J ++VanroZtmn7'tKcsj0L!8$h[hfr]AP:DEi)J*u8SF2KI7?mU\/c;KW3"/92D'B\).<2jRA6Br!#dZ]ACpm0\j3k\'+-Eta1kfn;Xq9kJP;\"O5Q +A,m)8DIh,e!AZ,[mO4D-24-"D\&Vc=Ij>7m9#WLaOeKHQIIY4lYhC^bBuYSFIj?#gqW)sh.@ +,]A;/_mK+ZE.2(ae$X,0F]A3,/-*CS/t0:NS;Bq6C6p:p"(e@,J%qY)1$toCjt8f>:PP%6-0Ed +QKS[b?AO'9P[p`R#p#opM,puN'IsYCQ%6GI#KNcHG\tEV]Ag*#@>njt:TX.+o>''<8J%lc@kU +)=#XFr';&M.#RCD&4N\KUS$3*3u.7mAU.fD&&aN8NkX:$W4*Si*E%L"f5KKr@sl=.:U\5)Xn +Oieg0<*.@^)nX.(F-l$"*Kj'M*hHk->?f>kimO2acT6r*`ZY4msSqYLB8j(c@YNL3!F3 +\hPBoJomkf_":=l=OZ^Ni)K*2".R:XIkSNZZX,gBh>9mq[!M1%9pmTD9FeNCJ*\:7lsKVs'U +E!>2sdmWm#be&4sk``s#mAMA3n_f,f/hFGG+"2gqp$f +0lR3ISp5YZJlqo^FN:,_6I[b>W%VpO_3>JU5(rH$m]ArN8:"c&=mO%)T]AM'X([k92gtq!BkAKLu1c&`C&%b82_aMM_X6p2S6$q7X9.@Nd +]AM0HT02fTj0a[UuG"aC=oo$[-/K;4-8f<5@r)d +fq=Cb#ApBji8&9-rXCTiTs$CWQQn8j,V]AZGfgu\RNu;GPYAL]Al',)eUkMl>`dW.ApOiB*c$< +02_.-&<"qIImr#tY,GZ)AR5$*`nY>'P0Bj.!G,7(dZ/K0M`X$Xg2nCOLeV+f5*o(pTmKZ5qg +FhkjS!=.Z5#O6gDJ]A4'LE+/-VRQRMRqmj"QN_;n]Ag\-Uk%5`j]Aeu63K7B]A=;EZ+2A@Nlo]AqX +a([,0;Xk[_1Id:8JK[J@/gWPE_to47fTi3Zs`Sqs\bHhA')'[s$-R-:*#MnIr,03@t7YEms* +\Od)7N*0j8LBi5#MFUnnAc$opQO&!:Y+%UBP&CPHTr5*!Oll0Q83M3%Cd,bD +MX=&a)I:%RP[UQ`BdS+t)acWHhE- +ite05Gk#2jjYr-D7B\#n#\':E/`s/&R`Gk?HTR:N5\L-ALaFE>\4 +LB^V8*(1(iOnki6cm7`9UPQo0D1DaLldQ!%NUlIIn<-Jt6\RIK?Y:cfNLP8qpcrU^h:72Jd8 +j!gMoZpEjpqdY$=4bTu9O?3%G`uS\hXk:hDIqj)4X.gN97K#IK9Qt0Gc.&SmYDY#n%np2;Yc +P`rA$00`4\K9D&2u%^Z4qk>[5n2MMt:;ZAR8p,8Vtic*qBeEYp:s%/k(:2=sL\mG-m,9BbF: +V1DMVGcHTNr?XF>,;(#AZ(,H(ioBJ<*r2697M\&SLofY791JJ1Yd,2n_APX5.Bj"at4A(Wb44aaKTAbcothb#&uHRs* +d3T@<^&9\a!qi-)Spb2:l;*6uj+[1ReI_=-SMRJ3_*Xr-C2#UJ"=[)Q\(ApWa3beZ=9l4sG& +%?&@B<1+K)DB%F7^8AM8KP_B2AcA_'oieY4r^KP#%-=!1X6EG4_I:X(O+C,ih[)m)3Wg"V=& ++#u31UC!peWnpCX+5$PP8',]As:PHUt8NE6]Ah[_VkkXE0Q!j#R]AKd.u_-E%"bl"?hj*]AsMU#6Sj.+'#j$e:/Y@D@K0mVEJ\qoY9IWsZORIn? +2cJSRN=J=Td&I4W9@u2$BB?2;$26if'cFS=hV(VJ<^H?c/'g=74fZ:>Doc;W$s8kFiCC1ctQ +)MerGt1=WPI$:[B\ER569AlpT7O#uDf:D)$pQi2H%KKr(PQjiWogWX3XSfD0OiHmhPZCuOZs +F=ubj@V1K,A5Tk3('S+R2BYe&ok'1!QY98GQuB@[`n0MnA=QP8>5Rk<&IA=l4l-gPH\ugW4= +Z\'>b,SQ#K^rhA:n\=[0X6Dj(::e_Ul9+>dnms[iga1Z +s^iHuYflc>]AmggPTqbj56TPn$g1HZ+B3p_NE588$ZH%tXM/RS8;U7$.,RP\T0:$IseH!tQ^B +^`Q^a'bZC'QO&oZ\d!.+D"J(^NW'398N\6\XhZPo\UskLdM/A8*HlY260h;9UtG:!`7u[e[P +NO@S&!RiNe.]A*K=urC_*?<\OCDWcIHaJ(HTd)Fisc,2$,KK3PDAaC/ai4"T-7ESH$.WFpoj. +oMcn(T:##:XC>,E-D/%K:Ge!V85EB^f4+Al!c[M@p_d"6qhH5^PBW)0\oCOCW>*:5>FZd:=E +Z%mf??ZoHp&F?oUDdD"N0%LMiiiDn(*aa]AFC')'cCJ#'&pt/hXZTAS&2?UFPr#PkU?\('#fr +S8?lQcOH%(AJ;Bi-iR)LhqSBG%UZ@llorX$Q)D]AXds0:4:W*>Ye.-iei.V["j*MusNe0m"df +:Dp,.j_W!n"u=8^M2Z]AWQ:"obc2mOqu`Q$[L1;k.Xpg9Ef'BIrauVQe'eN0V/`U-]AZpeF/:I +t#N/1Gs=V$1`J_tI2PsWkkD52h'^`F9Hr9Y\(-rI^QR+.b`qPo.f8TY"0D?S[iF\iMrE=a8cnhEpm=/CO8`?7c'!!eLY4"poi7)KJ.:\3F +LiIWj)K2HKqthPcS6P4^[mr<-lo^6J$(s*Tbn43";*46-S,a?:;IhThOC9$%@NMeC2G?,FiW]A/bqca9,=73m^4r%0tA&qL`jFq'n$3!Q]AaZnuCD>[JIUT/)bBX +@Cj'fk#sf.kJ25R%+5YQV%4hlMgV[+>4B0=5K]Ae.h4B%p_Oi9t+ntBrLfT26Q`ZFd0GZc?W7 +g5I)j40:)d-Vd*"T(LO)85q5PHTZ:S.rQ#XYcB+kT`H5l0IGg-*.p./0MJIQBS0F>___X$!j.aEMGVMt\aRX5VB?o7%RolbMs%Z7 +2g!B'K^7\Y'!%T15+^p5iE67qj%7+!cU7Tt3>'Zi5\,VoY:H^Z:8tU78OCKMP-a8MqVciPZ@ +kV1+Q.A"kRr*4Y"4d*gf-Xf^ohPq57-4',B+iX'@MeLBAI$I'*ih8P0"2>X,BgtoN^W3FHp7 +n-`b3VaRaQ]AKk[l5U)OTZ +FscAQB_fnWPG\ioQ&`*UNWn^cInf^KuRq4cKK7k7-T7p>Kr/C$F<*B+: +-O#4XbC0p3DilU?5F\c&jnWLgr)IJ'_!cm'[ueH#/5M^idhMsRR[noW,4W(biaO<)O^=WG05 +Gd9PJ?D/RrCDQ\NoSk72m1^R`++QZ=@s$\;naom=5mQSt>?o-uCaQhU/Jh0mR/-$S0/!GY-J +/Voh:Hgd@Y"or85EE>%>bUrY6Mt4f-G2;+4PAPc?^]A3YE1\Ar)ls.WF>Q.[E2;'$-"qIACu8 +C3.b3Ue,uQ9pcBjeJ5+!.WSKF_EqoP"#MDel7oD@mFS:nh#BiN'd:9Ga"GL\&&$;P;]ALu^f* +93`>8Jn+dT8BBrBi +80Q..32'Od]A#1oJGdlKs"#C'2u_PNppY?q&k--iSpO(n;W?f\CjDd6.F*T>R41TEr\r#8$,j +optbj[!nj9n/sd7X`A$Nrmg0(UD%IbaXXFa+.HBM)Y`\I,:XG5C)]A:(R54)3kURGGoJ<\(JD +u7h[T:'B\#R#d3e$i7*9`i&b.9$f>5'u':!I#u4F1nrP(DCXPBuOSUf"._ccu;Q-%;OZ&jL= +O!:1%Kmgnu6C'u!bnc/a_!f-ucpWOJ5_lgpfU/]A1:.(\,eDuh[g4`Je'@=dW+W*A8Z9f9N4` +JFdl3#,T#Eu3+=7qhl*K&qa004)BAEkL991J'[Ph!iV^ZV#Z;Ue1:AI!b5(ml&kt#b7@K>G9 +5=]AHqlic(.9l%VHSD5Wu$lnI`d4A0>]Aa6?Ob,V(c^dCMI@Wgkbf!*"M!)F[Aet?='?pN?c`+ +=Pfe0.nE*_W7H`1?5^Mjd/Er]As3+.MY4*CmaT_\j$0/%^EH(O^E**2^8l0fU5@>/CffNR@?K +fJ,j.iUlL1gHF!e/k^Af5('4(fYW8B-9A'^p6oIr/G/9SCN/Z1l1tV>`(=h.h+]A?!Ulak+*( +r+`-9lAhj-,E#VJ_/$m7Fq4C>BFi[V3ne3S=Jm`MA"2&9YRHFu]Ag,U&hP^]A2aFM9lj)8&D69 +m_skG%1IG,kCoR#6f=.="=i-SnC-B:KPQ$:^`+j#B"_sKnG@AfVEHWrqnEiW^(pfBV3$53j? +UZ@0Z\d-(!rdGj\Yo7E'84'WInS$`h.RcCY[%.+aR/"bjs4qG%:,@jJ_`29S+6%ZRfj*"uHX +VNiMgfuD"5=cV-'@>)I'=S\tj?>'LQ`=,.RSE+ioZt(m.^FV^?SGi$?OT:l4*(iJ>`6OjZh]A_Bk&jVkXO2Rk(nj_b(R^&Y/+^=QZ"mUN\;33E +>%j`?F$N-a%B980&JSqna+Hd!?KG5RH%eY?kb'/VDfNG*!3TrtsPCISXe%W5KR=EV+F2T'tM +d8T^a$?nr+_L)_elfe/Yk3m-)J1E_&B9\H0.^\p?*I%QO$[`e[72?soL,Urk!-UoRJD*Yf%, +)Grk39V-Rn5?!e,W[A>$qAgm8:JIN'5aZ_nui3W?]ARiQ8V1!BB$JuRbU^485 +2f%s8Ib-2uYE\a?\Jc$blsQpHKI`5b&+tqils,i0_HqHE-X#<1$'+;*aBk9@uVR7dsucH@;N +qPLRjSl^nhf*rm6UbUo2 +Bhat-R_>o;U/(7OK0U##3Y[HoQegm+hta@p[0$7A=C7giVXSQNrI+L)q\BRG:#d4jOk=h!c! +?`jk=:c0T16c7!a;*_O_ZoQPs=S-1q]ACYP.q6d.OI\+4,Lf.ccW_l(hDW/IXE:n\0LcU#Ofo +ROn/Pm1s@]AqNQe94OObpQL!WZdp#k6bs;S\^(#JR_+St'6BGs^rL!,ch@,a_suIR'^k0^^!]AO'F_Hl>r:;ZM3/V=?(V5"J;$.Fi[SgM +on2qqk?5>Br0H?e(M8"F(X\g#'4H%g*deh']Aps773stlB*,m!)c^#E1@:$p&$:)n'Acl@qt" +3edJ?fW20QsPg/7A[?sW,Lb,u1sI9Bq76LFg`H1[Y!(&\uO!CbS:UCbIDTdEbUrU!f!7'u,i +s$l_Q!*3lIne1Xor>QL3YEbt&4.di).J*qq9#A99#Fgi?oQ&t,6B? +7_m1ea/=Bd_pgpi5(S>N%mp,cGM8X]AKC*MTki?>X7OBRpQ/=`)@//b+gpZ!e@pB)hhln)26( +Q$(_Ri,?7s3?:\2)"=8dUBusIdb_YI2=36_3U7m7(e +#0TP0Wr^4p>%1r?Oa%]Ar$_e"I^&<1Rmg--b$V4M)]AG!X(l_;I)/2[=aZ>KnT:Guo?_+ECm06 +YY;PFCGjjtD8Y]A1mo"S!?a25eeJpZ'tpQ"B1EHc$dm%n=!!N^)(W=6u[*!$S\]ANf;Z*_sq$7 +1(QFKJd'1!*,IIMrN_IdC$*P8:,#V8T#mB@+UR33aO(:fG-qrMM1\R(M'Z<5]AtO?jZmkdg[1 +2I-<:6T8dlI0-rh>Io#8mgRF;70jHs+lmUDb3CY8M:;BmNft-D8GXQ(fb;[i==?ZA!1BI[oc +EEIIus#;(bO+g)Ld>A=QdI/b+!0"0cA%UfT9H54,<7!)-$$VgpgkKqi6J2!!A0Q.9]Aad@T<:dLIb5]A;[7e&j6TB0i:QF'[ +k_*/o2"qd$;\);r2MjroXb*WESQ#*#uo5uqK,QCLc_M:1&hSc`44-W#/W\B7Q?c+90uf[VP0 +.ZF3/gn/Q)m[!1Ma*#+\-L9ql=G>nc.i&I3ig)7)Z^2oH?%!sJf_IRlD.9?lMJi44PKg/%M( +)=>:%t9hnX$!2beHqcL1\rf5)]A;)kFQTu8!rrZD]A!:c\VcmPYQ7Y]AqiHM.)ojQ/[Z[rtB@B: +-_k-a4hOJ)QC"cZq5"%kEjFQD&QL,Z`jGM!6m9\B!EjY]AZr;$;DEr]ALC);u*Lfp4dCC1q;+K +jdItJ^BmRH/*NmIQ=^;n_7[3'Z3\u"3luT@odC.$3P(]ALhRIWG?GU\5B=[8*C0OW7qOcY)B" +CcrElTh?8RcA?)s5>_g>D/C[%j@"K4mJ_C1&B-a\a46_#L/Dj:$ ++(*OK;PESrsJS^n +eVC?.OmD@4@!r:2Jo^a]ALC!:>i&niNHq$K4`En-4/aLNZ=]AaTqAN%H#YBFGM^e8A9:R^SjYF +DpDha-a(-1-%qJ/#0\IMkBIhPYN)3P4K]AA>k\.KH_;:Z(^;Q&k8Tn[r5E4mO$n_iqh>S3!sY +Q1nIE;++e<1c.%:7Wtm!Hg'8WpkN5(C-IlQFX4D;h;.#begHM"[BND1$RYC(PtaQ:]Ad +jgu_WiFq=R8gSRk6K8F9Ztn9\VoWEu`t_M/^YdCpc:'h*2\3;F84CY]A%4DOEF#*7oAK,=5pHhjSAXK]A?[X1%cD6?[tcj4 +eYMrdgCrG(qTFENl;dM,I#hI-U5TY]A@.\'NjM;G+53)EMJn^98l=HF)`?)RhKWL1`,>e6@cr +VD]A;2-t@o>dC^ImK*3.[%/JcB!KX%-GLAg(UcAq8RR7p4C%$abd`SPp\dlp9@#eW#R'20]A2nd# +@kUjFVP2L0/jm:oq!b&838`=)?.MkCGoiXc%53V''\@e3m51)MM(i6?phW# +ln*G+h/<6Drs,'gXn&B)OGFnPYE"WETm,+&f5"Ykg5dcn%.95HDF-On:8jD/6:^eV")tGn79 +j$N-)8OO%M%8Q$16+20iU5M7!GUmOoZ/C!GZBZH8[,Lo0YKbWDa*%p^MOVX+$<+1L7QgnM"m +>T=3B3(mW('_jqA%?R't@#6&gZ1]A")ZY9"bE9Uq=V",@f\%6)?gPFuQgT)PLs)I6';'(KV@F +lQ7p)"I"lq-q>kTB`$D+r,0Na\,]ArX]AJe^VX<;6nouMG[IEItZ[(=.3;J>Ar>ic2SM:"j.<) +geRICgAR<#Nn]AW7#[OhF>[f=P5q)g.k3#da'k*Kg+2+NuR(II7(b$X@NFo?sH% +$"-;Ok!YiET&lR)8LNq_3XoST02,Teb:>1+=$$ET#1:Gn;Vr*eOe2D;99$pD'^j# +h?Ml50`:*bVZ!AF#&&i=J8O\L4WTR'GPKJJ^nJ+ND`%M3V5H:qq=SL$1h/n*Eb]A0I_IDj4.R +XHn!:-?uTJI6snW`3XQhU_.7^=mtnef0T0gE.X1S\pU(15&b[UqHHX!L350E'4 +'kt.n<.@8ccHC:[jA?>?[INNdQE-1P"'1&N^a1AU"BAbX5-c2*X*BE%1dH&HoH7i/Hud1>ec +tfma130!\APjmXKcKMi*5,LLJBsob90H__ +13tQd`8OYR2`"V/H`aC9H.V.m[rN(j,?47E.L^17>-6!Al'Wo5t*7'aO2B\HH:2/kQ,ZCF,eF\p3a`EB$pH5Mu&"j1t%.K!r5PNO$]A2BMp3pZ>k0GA"2i +&&5LQ2F5i_mD#=D&#!]A5V:pT43NjT\.:JU2W?6RkWT=.olIKKTmrD'>o`#+^q:BPMYj/SOSR +\1gkC^=WN)RSP5U2,B;i*#'$K1kPI<>X5`Hfn:j>]A_>FOoT53OX.a'=hDK#V9f]AHcDT5`M.T +9kGQFe8E/ualu?'(L-]Ad^7QW@qcd+4f>pl*d9n+TS_D39d7YiN\u8]A*,t8O+bG-uH=V-!1-_ +cf#BKj@OlN,YqrOGDlke!]A)#+M[rnfeE+"AHdFf-?qL'N3G2chUsI0SA_^"g\t8Y;ZY+?Y"* +Bir8EY>2Np8O(UeN)-U%b)1<;?<`O1V_aRnM%(9P57c3Mt"uq$9Ki$H6P,W(i^m/ugQnjU0n +q2nU1gtH>F2D?<[ja=SN-%.Lk0_ioj*N,>AXp1]AiBF(9KnWc%Y\_,is+=`#XGgsVL7b3eQQ&,XIDV-L57Zn6mciT9c\8#(#CbDJ-?NY`[]AU"P2Yq+D$@XsLSXaHm4m`GP7G3 +uRG7KT#dc+]AkQ]AmEeR#;8Oh17mbN)?EDM?3QAqQe=)(IGjp`S.W>+`OaL1p72AQiAV9f2CKF +!-EaMA?;b::A^\V0V":GWb25oO`(a=fZ8mN>;Wr(#'pG +u97EiIm[RAfoZ8)?_AhT3RdBpEP).u>HR0HB#a,[uU3qFMZ^Gj9'+_(R>25%`$\SsbOgk?okc>]AVu_4/+K@XAc>Y;2jGiGf2VS$dSVteSHTU#BgCVaID7U+M#263KcsZC-6,L)kWp>nFeQg8j%DDd$ +(s;8YW27q6UB&lBRP.PtMq^/H`sOHI1j&E3-0%D:MOZ+PYhe +@RmmeE_nAY:i$28DtQd_Q+aUN#5;T1YY4IV2V@gnY7g_LQuh-H0qqJle18!OkJUD7u\a%15Z +0j[:n\msDq9d^fbX(_jtFgk5Xg+12%r%4b<5"rQIP:HI'T_hM6%DFTl#(i`ZUA%kSpDG,g@c9ZS>#NjTS6aSC +sE8A<%]A4l/s9N;>%^e6HL,-hikF>il*'SbYq==9L>!tlmlCd'0)scT67E&D\?)lg7rgd;6=` +H^#qac&ds9CCLL-qcD?#]AYR/^'SX4U*+SU"H2=ttcSc07aa29+f(_iW=W=m?dTeH%?H7LW15 +[LN]A)f(h\JpicfUQ^lB)'+5=c:6'uXZRD4fG6ro9A_Vc]A8SHJ`+%sbQ:CnG$@u^FK>,rc]A7t +#Vebn*Cj=Ht@c1kf5murbQrN7N4%R0g8gt\V77pW)as#0-jB6;^MqtL<'ZiDZ@Y.E0J-8OV# +o=X:V-)\CbV?Im33XR(ZBD6AaY>H.hh0[H>P.YsmN/uA^U:hS?NK8FX3\ps5]A\0u\=!Assl0 +^m.Yj)B*jUCNrBmMRK?9cO6XZH_fJmF6i!W6L%mgZPoPgpJnmZhk'8_;''ZJ`&l#hoG!FK&N +lUl9NDfA?l1$c2uCrMTNOKSHrd;r_rNIEr +iYPla\bQYhKf&7n]AJ_c@NFZ(FQbSDia86GK1/dm^;TpsZb7Wj,=7mO38@:s&M1IOMHIj_KEb +mn?!OUZid\32nD]A(%?bhZu'/@>(-XgdAC''@pDBD:i%-F.<7l8;(d7*qkK(#g%C&E-R&9&HX +[5jKD&@^0+;#%_b)Vag;Q4N-@Jb0j\h25=KoU2LYQYAKe2aegO\?DQEEq/`pWL1Pf9!s?&In +i]Ao/">Ca0l;0!khPp9gIA/;bq$.F[>USa\6J4!hEGDFM%en>,P$\sij*^gI^>mqn.7C`)ij+ +[:@PJ4I76[n44=jm'0dS&BIaGQ59eOc)5AH3!k>OPh"52k%"EOoKseLLT$^h#6!Jt8$jXVp, +8r9u3;0u"j3,qSM#js'MP`oS`gqEPabW_kRRW7`;lOFTHF"acAs.tg0WN_jj<8?#\VWcH"5: +_GdS9!I"8qF0rR9utcEiggX]AM1pFJ0%KLrC0HYnl*0"8?^/@QZuLdq0MC8K3+:A?h0'(BWsj +lQ6D\2rb60,^&4bSp0U:gSqk7!k@^eNFS`:>D[&!2>-X_599so?PrD:M#;sl\E +YJ\Bb3[g&c"Q9%fD5W(IT[;b)&.1aBSA9EdM3Qf5$&r92O"!< +hIBVhIZW^43(ck%M1e3r<;=1LgLY?M[S:="Z!?oWeHuh/*c%,bMI]AS)nBP@:cV9e+`Pb)(T> +;-JLq/5L$^SQdc:O$7LBLCJNf[-)QJ+-;2j+M=d<"D3 +%cVkk#:NGoJ]AJ_n\i"2LjSm4=I9Ik95:*)'3'&tSMO6\0CN@(4d1Hl9nf)V>&NiOAjmABBAZ +PLG++Oml^0'5&I&j-sMfebK[A8-e+S!NN&/q(98BeHF+ClQgd9o_qn=/N6VpSRae>eJF$V0h +ahKGjPpY$qT,c2Na,=IB#TdFLR-9R'7QFb=(&^Z"?0lo.Lb\C$1-qBL0Qsg5?=6e2"R9n1.P +DYV;Ij$N$i]Aq1`NQ(FkAn\F8*tnZ(Rjh/HhADf=7=s%!MPm7`[X[ER6"he)-YXE:A5bI0XK) +RTB<7+jr>7p#n:J<1?:B9.f/d2s#O*0tb)er&^+:7od$(^s+:rVP1b'[(J6WNArHPCp)lqc(Mo`V$uRUnAcl??#bLdA[/j +An_5N@RrYtbslZb;*p&)lR4fTQ0=b.8#-6]Ah@@6s/Kn.[k+ZRoJfur[AWUJO>F,UQMfYe +La&,LLmW1?m)R27<5d,9`,$]AV#D?.:,r*qUTJCKs20247h]A5f]A8dVGsHT! +)T'-<]Aq!'`JXfAHVPEP>1:Gto\9>7+#Z[jTi4q"ML"$:'M;l:d!m@>`[HKBqdOXgPC7!.E,E +^N:abt+_F?dh47+:SXQ-0fVKq0BHD5nq!PM.2YBJ'Vkt8QOb.W^\8JF0gR\es=s8 +qg0hYQGdGc(iYTsHdiDpIhSKmS=>IFiq@r[dn*DgM>dV`WHf#!#fH_h^$&/f`0@i5YfUUI?o ++U,@O]A4tTLk+I><'$]A[KN/)`a[c02gqVS*@8K#O3b>>M7u1G%i;eQ>GcgQoXaK?$g3g0M`<: +^nu!4N5CY02@;s-J?.A>]Adr?-DGHiU-$JFd.i(l;8iu\F"(c"dI;S@I413hhe +Y.[/,h$Q:7Nb"q +M,VR$i'/U1]Ao*OI!/Jks\":4Cc?\]ADYuUfmQ@)m9k79KWHEK%=e'>!9If?.Ml^Z&`>NHc"$3 +I.bfl_D0cLr\=T8`kjrl4?/]AR +(+G-IEAKEe;n1m/KKi)Q/`DC1bki8QiF?6(gmj[SXEVo6ZTG1onNd!Fl6DE;B,fr>Ni,i4+s +(.$^Q+gCfI\UM=oq(X/59`!!.2s5,Qr^:DG'p7585Yg"%8%]AOUsIXZ).u66u5>DB0Vd0i>_o-]AI>(JZDfa)fGAPFp +)%59]AR`C?t.@8Zmb^C_+=rWMY)`75_3:Zq55eX+&Qh]AV9.Tol*U6^s#p"(D64Z(pQ,.DLKY3;[r:kV,Z+Lnc&U~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +G74m&*>/i+.1N!oa9+f/F:BNZKS6.alHif=8;VGF-rPZTfp +h/Q^[M*G?\cDKpV(.>Fg&hU._HtF]A@Boq&TD57P$]A3oG\fT]A9J\.hl/aGmH,;)QUF6c ++"_t*,6_bZ&4BK6cuO[:0D<+-=D$k@jH8Kg]A.#_\]AK!^RJe3!"%!T19;(&qV7;R/;@tipQX= +qtj#W83B!#\VnuPo@kGl2Z)rlH2dR9bgPoW#U4WWjit5skBjo?MRVpnH$J[N[fr>j%_\1#L$ +RhKZm),j."9h+>O^m>L-,P-6]AJ:lIqPY81#ficN@dqBMc:!E=mJ'F3ln2pddJ'sfl()!1 +/9aRHP?3uX1pne&/Fo^>qmDEl"mYd^TA]AO:I[/0b7"lQ9Fh@MId#^?TInn!8Ir$)K?Q)1Rqi +HqC3'pbrXT='c)N't!?n^:30N5c_EuZ1f@o/(`)=/7i"ZOAiV4K1MYSHe1s>!Eht.G%FU)u? +ituX*rFDHCKqRC]AdQVGf4fdFM8O&Y:G^EdhV4cF9+IiNS\H2YQE(cb$jKF232D\-4-*5^0Lk +'JEkNU)[.fW:onUa'1jY$B':OfJQ=#*,3Y@=XARC4@M3p=J2q^2a[cJX4i)&)dr2ca\7bSQ4 +!'Mg.o3[ZHGkuYK[6dRUZ=-%T$rO+(X=&[[[fjo`iLU\HDVE5M-'cc=9NI(mC/W;,.+uV$n, +ZSlJo]AiV'jL'.DATc9WCs(hiLNEGAR(Y-'ba'&a'Z3=f1.]AsttqnTmu",/ +'8:j16$;ZJoFfo;%)Joi]A?W2n^E2'Sc4/;lGhPqU\>%J*rlJ_J=!mg[6h0J\FcQ]AiG+,camR#RSB;t!:=U[#H6"eimBNM\!*c77p/nU/[Ulsld*`Rct8dq!eXBj`+Fj-iWO=_+ddiY^n2/Atq1*# +fjOr/A;@bZ(QtHS8QeSX-.8k6%@o'MfoJ:J]AS:9MC%]Ak*J76q0_/EQS6N+VMm=.:XB( +=/m:'/34["fJiIWmG39cn]Ar)uHph:K8!kIY_-b_ii*I3>H"aPK9"[1c(k93s.-X>(0,k$?^! +A:VsMW[=9jke=Qm>jsA%oVB&>)E*:b2pe`++ZiTF0lsf_=imGNJ3$p'1.=6k!_O^'c?"D2ib?2o:mPOl343CrX!4 +eK2Jp2&20$I/9!0C&R+fJZ+Ld:e2jYSBu'O?.?G73G\gP@J"Yi]A6XQj[VhSdZ3G2("AplFM? +e8bd\o>-aHQpP0sX1q2,_rB*p/;Z/`MM!1G^gM?joY0]A!h\F><]Asq7rqa#CTOd'l>=R7PSX_ +uoC<[9-0N!_hodP]A1cI5VV@ckG)T_gHlXaq7E6g`(M866eqMEQ;^IJ^LSG@(/MYYe04S,:8h +e&3O[e7>h?Z8"FW+1Otq:#ujQJ)O2c0+gXH,W4nJ7Kjfk(q&C_lW:LN_6(t8E-/9JZSA5E8% +Rsd_'m_%G3utp'VQ(\@3*:X3.k?VrQR_WN#Gtm9[ESjNj^uB.X;@-cCOL/[4>4Vdj1MJ%Egg +<*$:@^(]AQqM65QeoGW`]A4D/m,o1Jfeb_dJ\)Hm=b[(3fTSjg+m;M:gM3t$E:lV3UN3Af0A#G +mK+)r.K_10!]AFg&QC<1@.=3rhhfp7==kQ_\3'B:FtOu7D/%-F<#@5Xll01:eQuB7_;68-l2> +/,(1m7YFeR&W9FBsEcK<`DnN"LZc(9!\W%6q.^q]AOY +WqeLbPVFRaG`PhNje31S>aQ!fm;P=pZ0F6@.$m/Y-S%RF\\ +]A578)]A#il0RlG=D(AU(65;Y@Dh\,l6#p+UB-JC<]AXMCBchFB"fi/cMWZo$tDR+!0(LRZ^VJI +B!NbrUI]ABjg)lX'pW;YR;"@dh=]AnlH/k[<0K&mLP>,t\>60V_e,_*eAT^n4%^nXsh9pOVTmIrK@gj"h$`#Rh-#qo +VTcBB>OV.NH(on'o8\h6F(16+W!M6*[/94N^daIN@W;baCT9LYk&W/PUh]A?@s'X@%@+S]AARcq$2(cL3lAQCeh6Sua^>D#d.MZ.mjPm#?!0]A-nR&a7 +b;<9;O$HY1?\'Y23qUkMcXp4Aoj;4rd9XD90ggVY6B-/Q<*(!7C!4aFEFO[+Ma+kt4grpJUS +mAqCl)YrbiHXso)q/\ea*<2t;cf[Iar:1''qcpeXdDk,Q`VMT%N!1QAE[X2jSD8%DT_8?sq3 +e62C=B.XhCqP`<_Kg@TdcrmiYCJ%;fp%58#5VV0=pL6/:lIo"!+*mU0[MJNBS#%:oZ5;EN1,m\!c.:Q9KVrC)LL&c[I<_38,??+U5l1,(mDS8(Jr:9KEqA&D +CQ,T'j\D1`7$6!1Lr5uGY9h-2J7MY5';hbT':6HpGTd9s8J;\ZSG@M9#gXVG[[f^*G/3H^K: +Jgf@4@aMCS)c!;Fr0s"*o5k7-S.*F913G`4B=3,1VUTaYgU`gMV/_Gf]AsMh.1#FU/=8>JJk& +5ILrJEq3[OH-6ADi(Chp!!$/HVS7jeo(]A@j_&ZV-7[eQ>[*.Bsg=fnX53^HUaNG"*P/^u;d+ +[L=ibTC`+K'Lin$0oSB#$6Ag`=1CT]AG-DB4kklhNs8#D2e1E6.\Q<4I"#C]AtSOX&(P23)S1s +;4-E^@;Eg$sS+j_9Se&J7 +#J(UpBNDE`H5:cM@Yi.0kmbQSYNN&l>!aHs&,c&'k@6$1/O0^;W:R8NZLG"O&!5G3lG2%!NA +J%IA1KI%]Af7V7="="lN'_Ba'b=h4oYU+kgR"-@=-B\puh#oL9mJu;YF8)/?mpnQhroDh.XYl/r4`oda2u;E3lcTc'ZAE +)XAba2Rc%8;k4]AdiC0h\3EC"=XdM[)!I'-$SM-?f4>L[=AUI/&OEo&<02Z[R$#jo+8Rq)FKb +fgDV+4'EL_LTJ+-&?$dbf:d*I463G?h"3BDh8I=?5hDGo8nIZl>gPL>FEO(]AK8Vd:]AUdWS.k +"GIue)EFlLmP7G;9A[<MB="T"_P[UCV/>e401]A^L%*q_iH5]A495!+=CA"Ri8K92\fHmDk<-SJA\ +^qQBZD5HVUPWpkSt4gTCCfbhRiuC'k`04&N=k_%?TscTr2`!MSSkl&q"!N.uj0CSM(kQ__As +0^"i$2JCM>E2kmC#(K8OoUn%SG/T[*R.`<5A.8Q@d9r>(#X#m^q2Wb06nT<_Ae^Zn)F'Xot5 +"r&p?:ncGkKb9Aiu%n3SA(P7ZWa.$I+,]AY?)CRfc1JK%b0%l2\L4"oQ]Aeb$Y/T9`1Xg:kr7Q +q,Xfjqpj%]AMH77AMh\'Xrk#,D?a"$-8pg)4s-5i$;^"9crUl3dA?CM%XJ26AFM.0b"rU!\g/ +T;UupT'/c96\.\2S6,%5]Aib`7MPd8JS!(^SDf-=+Q;?=;e;l6,V3`W_#N+2]A#83bM-C@1"mZ +6Zem)R7?R[=lRB]AHg>G]A/'=pf?4!rm8Y,,lO4EbB(/BQH4R[<0)8g:JX2l\Z:dUI#D+gI?7P +'/(iFtDjd^4?5Toi6RY,tD-2!\bX]A>M+o9834A:]A60'EjeKQTE +Fr)Qj"gM,FIu3c]Aan^+1T[q!XC4X2tA.Uo+?>Hh'%_K+l4LE>W[P#6l)u8>>&*!!?Bg68?]A4 +K6;\;J;]AW!ra>Y5l0n\9/laXsefB^`":D"iim+fM_KAT*&P+\4Sl3-1qjBL$?oZ[LcYP?H?j +kBjGCmjW.g'hkdm4@ZJ;dUE#.j-8-`c$rrBR."F,dXNJl\Sg!'op1+L1gsr<'d/C[bFcD[&I +Q_S>YO5\*]A?;*)IH!Q8tM)ffurkCj?h+TRlVB`FPG<2;9RB-nu'im!Naledr#q6#Dof[MIb+ +85_9DVqOU$e+[3pEs2OpSf!<@]A/qgo$A1O-67ELs"!/aH,pl1JBNUROJ$SQ;=o`l8ih"m[FK +a@`RMkmecnWM*5X5rIq`',WpoA3)9@7+UDX+.*sm1E_.hu0TNCFA.'uJD8(D5Z$aZV'UUn<> +["(\lYb;2M(i)28m,?nH]AA[X"7#\.7SL`5eujA2%9DEBJ4u&I/(\[tZtuOm +Z]A>75!GX?8:48R@sKkTRs+P]Ad:pMI*nMaH)"jK,Agr4@-1/KIhueV>m+!@D3Q5/+R%1:BTDE +\d;#!F4(d'$@JF4q<5d+7pZPD!@qP#)mXABLDLT6^r^\Ncj?r'j[YWhH^ +F[dc[6rg/Z0\N6@S)9d=867c$sX'Zm(liR#-nCkU\/siB@e-N,gHYT/P248RhGC/!h*TKA`mfQ.Lqm)CN=-'M2ZB)#E\@-6jk>Z$Zm&<&Es<0ckBY+C\XM8+X"39h5 +R^X\d\NX'dBS2UjB)!U;NlSh',!@C8sg)t%+Q&D,\-.F7+jI2_Kn!&cGFtkhoPJ ++G"H'E#YZf& +Zb/<_pX?!!2)R6n@0?d9qj>0o)/N\iE_uf.3*#%rTr=)_@(_$3ek1,?p+YqJ$r._HM-CJd=D +&;`4)Vk/Ap\l2!oZ%9(O4?1nT+i-9WX,&?ggeD?(utc'VU4QHWTX]A5."'n`i0dN'.-E(+;@9*d^ba]A.f!q`(gj:L$Aq6L\?u5c(( +!03"8?aV.,XnC%;q6cf)X%i4:9F`"0Fc1&_'ZZST\aDL0P)<&80A9)0(C ++l>Kqd=gI)"N@*;9A?XN.q>>Sj9>L0C2fuiN2CHT\Z"5:L-pY/(38qLIVF4*oX%e+4hn#/fh +^)2O&t+`pR3$r/j@t"fL4mR7>]AN1Ic4M=opUp^(c16]A,Eh'H(CX3\sq`p7 +p+b='hqXI:LcaDgt?:O>Im6';3(NB]ARV)VG#eji,AaG@M[Hm2*InnE,[sXG>`VaG +K/o0Kc.0t\KO4mfV-"XY@5b9>caTkA?rKWX\&]AGYl1HuUECH4-A^BRJdKKj%7Tmr3j;EQ!3X +iid*c?bV%+A%f2>#Ai7(`1ir>e7,h[o(W$OK&2 +Ms8"Y$!L[\0ZofL +Lm4+\<*2$G\]Al(EOktM?'oet"q7++]AreWO8kp`/XB(Od%3d2hV"s5)'c9p%RG\7`NlRKPi-B=7[=Q=nOWo$W_[MrgoZh^QHn2G%0Je&j:'>h\o/#@Df0Bp?S-$ +&rM@X)-*]A*-Wf[=ns,/7sNOfJLmNqDhT>t):d[cnKY/gZKlGNCI_EO7h_T=4NRM!`URLtm^[ +?Q:-qMEnYbhMsR$YRN9M@*BO:.C*EAS#)6278q6`=(lHJ<#W>jYn%##H\GHT:/cbek_7gF+a +OHr_Mu80Ni$O/2JY^GWi;$1&rtjEII+LROs*@pFIml!Wb:4T5@1>Vkeg%=`@$rk.QLfei\@C +R^%?/5P(O?PVV%LgpG#37*9-]Aggk7[\'&Vl:U8ij[473\E'=>mOn/qgMK)F::uqB6WLUS:=k +V?VAnQP0ST!O[$e&_s*9)r!p2pBrN`VR.5"]Alg:qr(8lA5M<]A3^Ong3>@o8k=24 +Gq5dL\fj*MFkGnp9JT^Tpu%TS"%KH*rrq%JP<+(3An3@BNV:Nn?(CtR2:f'i'>RP)pU]A?Dr_@RSYbYnc_Jhkggu+iA+AU;JVD'L +;%G5SXDiY46[_N1C!h^unm=HO*&@25&s-geeD1MutUS^Xu5C_#`3Pie$YTF1Q+R70>\:(c2S +H8%b]AseYEc='!3X!->f> +(mbk!aFMM<3cAc1@>q_7USI(5p;khRd9\^9]AX]A+(LBjN`?:Kn.oL]AlWJsdV%uLja9!V6pW)g +7h0!Yl',.;E2)mkUbeTIA*aqXnT[r?! +E28.;]AT)[-5K%$!hlI\1)gmYSq+KG0s1%"]A+X8m5(7H]AL5I@5T#p@$+&i;6+8klg/,iSj=\P +tec)hB^+kcgMtbbbA;G!3\W&"t'E@7TZrrp3cb-.<2I1a:H#Cbm;2;0)VEW1(4$2-C-=4gl= +E.@Us?Z.)-*iPXCt+YSI84e:2Esgl\I5Ni@mA:cn$C!VWFNg"b=12O'>dC!q)DZdVGYAZq$q +BVnFIYFd3^nnh<(!$Z'#QX(l?i%KRd,2[^"17!=C!]A@\qI6tJoE$3$T5gFoB7MUi2*?6&@ln +n1GmVnr,?5L]A3fiK/\S$/\F)cc`ZJI$bk-qlb*T?[B!$D9KV3"j3jXN7.kER-p%4YE2b@]AWG +r]AllBN.$9CmIOMa))'sg,U1L,RRGDW#WOfd6HD7VH$:b]Arr.S^^nOIE(@A4HWoLXoO@,#?_K +k>n)mK^H:L)CLD/[P[]Ad*$XK!7c:=[l;<*AhI90XH*UN]ADf6KP',N]A^9uq +)*@uAGSBa$ocF?%t[=+T1khj+qA9lnMMBGG)F34o;GiE4bq8)5pu;Jkio[tnP>N+Tq:`0`tW +\"u4i.n&FY?gDT1f@,?CSARaLRi!O_Kb*r-UJX>p>EkHe,W@:d;dX()PYk(fsi!qO,Jn>MeG0QJJC.n'0!)(^QQQ%_*,n77$Kn?U_EA#MNU:a(U3#K37MgKjQS2^fY`La[lQIA]AQ`5eJJ3%lgd8CAZV#$9DBc59Cg"6pLC^:^UdEB1(`%ELpf0iVWtt?6i,WdR%:f" +p@'`4sUoN_K1U'$D>\-A<,AJJ0*FEh;YLfbbgUa;;rCUhXUAkF;cmJGLo+,)$cqGh(3b5=+r +C\K@;$$'eNIS!YX2hm"%+Nq/c=/17@"CXC^W2")4<`D_M$<%M]Ab:&S3*Ym*^tW0[.QpH76g\ +`.;Ti"TT_LSAnV%*If'f_4rMuZl5D*Rc2^>=85egl6(+?;dF:WA95Pg3$qY+pEU\\[.#orY5 +)DX`kCU"Xr<93)*q[*E(d0aZ)h`,n9D^e,2b=FIPm(n%Rk61Qu`S$S&3giF5" +aMfARPQ+qdDDqtUGYpa?fr8S5mIFfTg99%OlQ)[/(D>GHCS//sQ>b5WPF8!'!-?&_M0^$8pl +X=;JP3RuW0]A=Hc40MHIX@I8DZ_omoBV[=dTCgEZ7A8WYC/K4ghlaeuCq(bR+j[=oY[\tU!4> +T5-M2c?7AbAK,&r1b"YM/7:D)orYeIqVmCZp^EQf)>n +YAaUBI]A*YrAP`5D=H>)1Uj//h%1Uo^/_Kk/q-hb_p`L6]AAsMdRkot)]AY7N&&D>q.Sef.?D#m +P>m9l(>g3IdIiI8Uh;[uOKRiD4?k0E.*4C+^O>#",mrj%np^QGps%n@j@4rhO?DU$5:hd%T3unRDG-$ +u$!^PoGjbarM!M!#$^j(*\sr?.%(>jk5*$q`*BIFG=tA=4@2 +pFDpGU;@J^&LHPJ#f(Nq*@aN%F19&Pn9l[sIAUe&2iBYP]A;qg`nfg%1F*%5X9=P(Xo##?k;X +Xm?tLcClm'0>D.ZO;fed44>moHe)O.1A?=8'VAna@B.PfE;U:WB38SkTTR@h';_JH)ut]AW@X +4jG%Ml@-8'>hmk:sZ%-*l$kT#cRK?/aN1XUH]Ad +c11jNfph9C3(h*cL;F*DJ/Qn^kh`'aVd(/P#6n=[AsHLi?s1G2/llR@0<5SLt9V)%^)%3jN2 +%1nE_-,DU]A.>4LI>hF\&"1eCs$"e/b$P/M8C7Gd+F^ +!\^\$.kP6]AZ),t:?g>V$E8UWlr+t>;)VCB2#U3_)Ml*sLWK__/`$$cj0VX#+lhS>f0-8Fcf/ +eF(:I:&2?S +H/98,??&P?D1Mjnkq6At/c0#5-AX?mT3Ab4*l'PNOhLZ6o+kq>4h;Ka#\1_1'c[fV!1CYal. +`>eK&*d`E7E,s#FoNHh]AejMFn<\(_cK"F(8&s?J2\&p'm;:4FAMDh1^4-9c[;:X\LY3dFD;N +DFao>TrEiVkso6:$p-Wk-Ne3sQI.E0D=#k==&Ak2FoH(VX9VTWSDVk^VHb(8Z1 +2AjWM^@@rFqU&,[\_GbjHh)P:(?jU8"f$UQ,+6fd]A3'3ac#;3.G?0:)ZMZO*Lh^i'de-Oop+ +@ZohVSpUtK#J>K]AflM8XTVaLM574Z5`$32?0E>>bVdCc?ZS_83eI+QFWK]Ae=Ek?0lkRU/Qb. +q.m&iDQhVO#eHHUT?T%s$;%t,;VE+D!t>rgA1DG[g)Oi*Njn=>b7'nrZF'$TV3_KL)Im'UtN +G'E-(W68pc`c*ufLb!&X&o8=c/^%sWo)]Ak[Kc#614a'lB"BU''.ob^EdGcu)()Rc6i%kYUpR +*Sf)hXrMLX'^%=6>W^X[#(Uc$QJJ)eEU\Rs.h +uFFJdC,YdCMG4"KFT:ra[t&ImsrifYV'!]Af#MSoJ*6#u*H8_a#;>&1Qi/<,^RW%L16 +>jEmI*gj`3lkUI!W\h:"s]A2KZjV?#hg)ZY))8bOIIPB)W3$cpQ9c3BG`((r0N)S9ui8(g72\ +90b3)7iq&22&.D!mm=H"A3t@=n==j/k[R!WI9;#kaob@Y4?M=97TnB3A2Bj$#_e&qZT#Mmb_AI(6Ru)aoUij)/1XO2B +aNG7Ei(J"WpF&]AU\g&)6i'8fM!AUYN>6j/0ZDLU_93aLBPr.$9#8KS? +/;gc#SU'7Su!olS>-o4%_Rkis]A3:\%g``#d,%X[dJ"U-4F4A!s>CS]AdE-SUrHd?Q83Vh*NM$ +sd%[6\?VRmdb/nTTsGKce&dFQlF4T;F&L@Am>fpm[`LP5TZ``0c +[Z&074IOel+ogM[bRf0U=lDO9 +-(oAWm&bdCV`"_dSTWjdCe:sjJTk82@mu\u\ma+t!@j5d+Zu<(:iY"%k&Yh#Bu?4f.]A=ha9X +2A?q,o[h6W,I`T_lZ^?5BbmPCaI[BqB\oP%>h?L-hmXrT@>=MQq-;$~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + +[L?pO>O6h:Km%&FAAaaoSF)Ln?Vsj*OrH +gXh*ZdK4hOjQ>omXTGj8F:R$@AML7RMH\P(\LAk4'[-4VAA_4RfCCE<5j$jf`SQ8OrnS*\0H +/n:GR9di,#VGjhG31A*gfFtGB+OVWa())!gQaAs.,)RiO&Wo9=.)-,8]AdmL#m^P=Vkoh49XG +4rq\P5)%h6Qa=4%ZTg/%sO#US$Qt7[%7emeGJ)cr$IQUrT)OF$?ljOT%CHShbjqsCijN.KQc +BGpUr1]A]As(*1_2L=Tn(^PrZ%=+,S3a(PLfOK)`V[qk,fH]A-6/"ejbO[O#ZHt +#Rk*Rq3f7I*iksI5,cm,1[7g:XO?in1YcdDAR]APZPld`&"m*lhpc-4CDr/N\T1+/[jDW`K6f +,4FF9`4HMdU)jl.Pa:V66]AOsg_ScXcrKIUq*]Asi0Sdh1Yb^ltB>]AH:R+btPSHRD7!@f%Z*?> +0r&"_UUe8-T`*!L]A$D)/cZRj]AR*pqk>fqmE;uk2Oe['m[lY,]AV(E(MNY4%$a#i>ZaR?k)]AYD +ot(es=8Gi%6VZ:l:Y\_3.`k5ai6NJ8`9'2cQLT2?bp$ut`_QWXj&0XP0,(Hb[d->aWMP<,&> +M!82XE+?e+Ok/.:';KXNcMdb@gXE(rH!Y3a2B*O(@SM(Ega^MIVDCUF@7[k&5Q.=2KHq;*JsUYL%l(T-+pQo8/R@>V>(]Aj(CbOl$LULt)rMG:=.T/$# +-!j5YlZGNo<%]A`%k2*+Qnr10IPn:WX@"1okOAepe]ACFu.uRb8SSEb[,p]A&GiN<`T0!(3%fJS +OXQsMZ;8kEH%-DbYe5nOfaZTriB2BbX*6VuBD=c+ocU#[&A +K"Ucoc8iZ7Y0'#W6>VQ!7+*&:.7#\Gj2NK,PdPY&J;AZ6n=6(6t3Z2@;d;)$V7Y?D@6C5X5Y +f^O6:CX"Z0\iuANogQS3u50*%=NR,pr1r.u4@4d+jDQOg0J7BagdRf&oWK<0`/,o_tE,SR$S +o_.HAG*!W-`[C\2c8mcbJV5m/UDPoJV*gnTpqD#UogC:%ENj:]AHiA\O)c8ANfB'Zrn,mA0d\ +d3)RIQU:T,ZI`UnDQ.YQS]AedZ@b=d=K(EV2Y'(DI3F\1IA.,p+kXNoB[]A207#X)e2=O5(38a +mHa)=F.;MlX;Zk<:pe3FhDl2^[9g^PZEplY=UbNKT>>`_7t`U.nk3Zb:32#g4r)qa%d25?BD\. +8uFAtRk!kA2I6GAT>B7::%KRVI?=qBcXa$HR+O4rr%3T%ph1%5EEW"[ +'[o9NK0!<@4cBX5qJY)aa*2(+qm<^=]At`nF34\dh#`g+%:IFZ6N_u<^8N'Bn1(TU:7FL<7Q/ +U_$S#b5_tUM;Ref%-IlBQ>&*;7[[;hkcMs]AltCs/noC@_7ZjD^"_?TLSK9s$LmX4BY83&CTX +\#O8'P_=^sS"#lun>1f0d[$YuS/g^8hmjE]A.^XrVe"r_Ipoo9EJ[=]Aj1@G'qT<]AYQFl*D^(6 +al1/d?mP7VN%2GIg#Z/c.%@()'-P/b8'4[T$4aG@g_-ma%=ah;,Q7"/=M=nCepFD/F,3B+
IR=cl?/)1+($!"l1:VgGadN]Act*l>e2_ +Jr%7#+I6@CuUZiWAoXa(^2B(dM7WNqYj`VN?eKn#dgL*.U.G9I/-[Xe$CrTH1/oQs46RdI:C +Ue;b`7I238*#,=`F!Nel6/[7`908W8_Fhr!<5]AtR]Anko4AIIGJJs&OD@n?RQoO\,\9H<`Bo! +e^;c1(n6s0%8OY;IrV]AW^rM''9sXV!jo +G]AM!J&1JL'Q46QD4gKWAhlLG-Agqn2CT+8\WQE7\G2d=WFQrfUXMr3D2uDh;`KuiDY9R"j3967#au1pLo^ih3k909^\ +ItJBIdb"siS)5$`'tWhk:RF(e:Go!s,+BQY2f0[f&Ei9I- +XuN\8fX1SM-+G?3e'#N1T83FGdWHuS8XK#aRop:Wc,ALO)1%GmmsAe3^M@1MR7nXOp8UP]A;l)QDH_+>ML;m-Qh&`.:MrHFaT4#);-2)#lAhWMu*75=q +E>SC)+\Wc@bk%WGP]AjkFt.O0SF$OXBG4m*Ylf&Cmor;HNegQ!^u#dXa0FbZWB,GU=_4\T`Er +!*EQj[+26K2&;k3aRci_9T4(-6;+.L:$FNWQ[.Mla6*i0bM>Fhmn0ip%.3BUJ]A+e\&XYoNER +\`kjIP^UV/99LK'2CmLjMN2OS/30,1b%\+c%T9hh`':[N,IiJrG=bIn9d=]AnV_rgWOA\dekjE!L-&Jomc4:N.Bb?fIo/CF']AVH6ImqTR^;Hd`kROVsYRpCpDo^9`rt +,4Al11P$(p9!dZJ3JD#rQ"I)RG_PZj`0HlsBK@&[[T'$U\?=O.C-(*r.]A*.L-\`T/N_NXG02 +f(9W9CH1U+?]AoZW3Eq0C=?8AMX+Wf'6E:dLK,]AoWD?ndu-JpeF2575bC(Rd%kL#;bIJC6OMn +K47c/V",/K_-tPf\3nR\i$Th1-`dQNfQOG0A5i:PdBcW([9[O*jEluBP<,\T.X]A]AhHiN.o^Y +eFm;G1_DT_W6*JY.U&cdd23OE^.4H]A73AO8D8$ +]ASe#OYk['1:uhS//tD7u(h,`P@;IFUcA]A[rBSWW[f>^-H='*FWQ,TNu]A..b5W`EmVZp6c5%* +.W;Eb835)`AHC2oa^X)eQ+%As)`24L9d'hU]ANgi;C)U\5Mm!6gh)/lsbcZGtb2@=594@NSg( +.NNa9<`]A^.<%7i]A*ubYs4=H@_>omSqGE:n)-;TAUH.4jR]A<`LC':;I@gRtra?`V%Igbmk1bt +s,41S!YcA>`]A:i1&$AEk("HIlf(nJ.m-ok<+kkh!"Z=Z1Li:HO1R2$bNrVn&3P)1qX:@qU/d ++N+2.)a(N!rQ/)d`;2<)j/Q\V";0$9A)frXY6FU0M)I:-^D8XPTrE)]A75Tbh6K/O +`QI45.^OXJ4;:7T>]AG^;cBU+V)QfZ,2`;2AH="XDuXL)`Lfj864,ZpGs"3c9&_MX +81N^bESr3p6Gf>2Tld(r^h\VUT^.qter@5'5]A276<)pfc#=MmWL@gYI#j"/OsY:"^0WjP5d*Hlu +WR)]AtD!?Vkg+Qm-,jjK?`*.`>78oNoEPZ6B:)#(65=gV2a%JYh`W`a%qqg$N_MldcFm$EV^7 +5hFo3kT065&7g\-7#J%NFp\aUjK.9WEfO:kc)^l;[$iM'mSOE54Ta,p!)7k%^_V*q`"nLU1, +bcKmr9#X3f'5T8#P9a3e7_h;\`D-9Bi&DqL6qnCT4["cs7<*)"o=-u%1g25/_YLsJN0a@X3B0".qkkl) +d=.gS8I$ZG)!F=[b8f^-W4)#/Qe_kIkt^MH`hGV"5#51l'Kqp*V%J#n"\O*E@s3$=o?.JRnr +@e@]AUJDJS(#0Kh0mJX(]AN$rl`KkM7n;YdjQ1AVs5pdm5KMeCfB1p>D_nXPjh)+i)?=;7"6A( +EG@C0Aoa58VR5MC"&$rY/;Wr$acrS]AJaoW>r*X[F@'RjGUinrJNM9^-T%^t?-+U*E?+Gps6a +'2KC'n7pP+aCFq^./(Mrl"lg]A7j3M-?h1n/JWeERJud=Me$bZ4M9DIAQ_JZ1HY]A;m.ontY@!n8 +2?o+6's;@F)#6Gq8nOoo5>i_tY_9Bj-kN4f&NS^Ub^,r>lJE^lm_e&e#,E?!fHhfj*9$6b[?bL09=]A5QXER$qDKd]A`'I,X+.fDEE(:6^Ih]APp&=#dA +o&Fp2oZtS/PY!HW7&FY-YD@(o]AIenFg/,kKK,.Bm/3;9ZfXd_XMr5`!PNbE%TSfijRCRuh/M6JO8![>?ilKdNrI*R4c;lRc^DqP@^_p^8@C9j?#,\H%Ma +@/\U20g7ZLJ^7H%TGBk#dTh%V]A!U(A*GNpb>HM"CG*nD[&,oE)0)!CXUkOX^AmN"4k)-arrU +Ab@3[,Cd5KH6XehWH^b3h.`<V`42PdZB$,K,2=YVGq=D#7]AXkm2(bre?2]Aq@2ZZTNNh_+oMD58"@Gbg"JSS*oUZ +G@qCri4&8Y,\^kp,Yd[;a%K!70\J,cu0d3k#C[r3iIt*l6M"9F)>V^1eGjKHW]A12TF!.J`U9 +0>?=4BK?2l4bU-1OAEe$,8A1D)9E\3Gbr!0&klD/AoAepFAh3>^u)#i9#VI7l:/0$K7#-1QP +cM&#SnUDfaM[;B?qS]A?;`%>4qWaP*.Pc%,S1F3idXZh?KH*2:^753fB/]AWiq]A_Jpa%n@fL=B +b[,BB*2]ADKJF`d%NjtJ/6'1UX0O@/0;&Q^$DmU-a"$7LSc9o +QUB9!-bpG`g9CW(Z5jS5&5jRrE?7kUW/p!KLLckDM:HFGcqs=,Rr;9kS"l4*^Z2[PqN(0Rm6 +'a6d]ACK]A9I6o/\3GP:F=ni*9=85#PZM6`A9Q(_bKs:i2/baE"T"]Aq&+9>JVYG!JlgVq`An0" +&KO&3]AL6NF(Bhmr/10_XiT(mY[%:2e1D#Fr@@j-Ia^YO6R!sqZd)-NkUc3pO--m.\d$dlrs= +Wi5[k"1&DSVqV;R+h&Ssj#>ZA4Y81RN(0DX%l9<`AMB]AoXe6'&BBdZ=pSC0D +g6JId$El@I`-A*2ZrZURX\2Y;+MEL![4NfNPAKM40DIQOHLr('#Wp2EsF`-8$q-aS::h'rmm +/2&SGA-Bh!-V\+u2dCt=GTK!CemFb>,(VD'*Y:_eR>E/r*]A#>P4+gKnY^MfL +[2^MN77]AP?bUnjQ;"t2l9a(OG/pDVUSHl'do7965M2:Vnp2T!m0^e%^=TR:m20TM+U?)rh\- +[%7f&["MVhaN]A"15eNSWp_JA-Ta='$JTdKr3[#`4V9?c?Sf)tblE$L-'k<[D;i`Eq?TJ<'AX +F'$q#:ZD.lm*`\ApZG5%".!?&5>*h`H'X.46Y_cZJ0_j;n`dV9CX%1.'se$m+8>?m--[UZ8( +^;342Y$F7$_$1oA?ape[fih`/O%/rRK_PYLZ`VIJq:DNgp$uG^qa8n$&7$a&Sh.?S6T3R4>% +ZIJE_n5(-`uo/M09a\1p*@6'aJMcH0U%.=rXs83]AAnJF%Hd5D0E3R/V[=$*M9EtN,)CB_ +`W)(J(rf_62YWTI/ECLIP5MUBb1b)Mi]A]Ae1np3XF[,&^$(\eBi'4Z-E-/uJL);YF"(t;!.(a +#StLokN]A%;84Ni^8FZ'mt%hQU^s'+`QK3>mgjl57X@J]ARNcY1"eKFBpk;Q"HWJHtuilg#ooX2tfc!e]A9#_f1[&*denh#5f +Mb)ZGufZoo25C$"B!15A;+`p:R&=,uT/ZLCFF,-nbjQX3.TXmY!&maA3e07O$F)?T8=hPb(S +pDBS_&lEJZX*5(J-jsmSUo7sM!jUnMjp$KlJk1ddaF;WT:-37U[E@ViGb=c=3:iP5E/JI^jQ +6=tSI/DX6ulS>cHR"c*O"@mD.>Q#096"6'>LQ5l??3[ +;aIrlS._qgFB9q/fiW`E&jjukEiu"fZ!B4=qiogJ9K@eBYlOqc""Prgu`l=Y5HW)?K24aZD=H6f`"K/s16V5K[D0g +7f_?,)!EcQq)m:*_SAMLG89:#G7k@&8f*rs0@P"Z^`fr*Y`!hK*mYQ\25\+sSo<^a=.hC[AB"]A&+GB\7jb2udGU.!4\Z*3P6`1etPVA`FEB?L!9#p"C"F(I&fO,@>ag4sTldtP0t\ +=-f`A[6J*g8[D!i&%)Z(XB-B#D9\qm]A7B6[oAmHSPTNNN`rSC_cTQ1I/qEhd,+-^BX@M0pK? +-mULk)s+.nO$$?+Xdn;*Yj`(`2of_C)/+gsi>q-eZ+:M893p.2F)T5,Xf2m_YNs')%FK__d9 +(*(aMQ,*00:69^BJ%ha(,q!m"pOScsDqN7=?k/gP/dN'@6*bqDjNXJ`hpbV80FbK%8d-XEoo +SCquBo>I/DcjP#e%ouob5pCiC;FpFHND>PIsK5Z`3FMRa#CH32 +eZ;Dfnca@qheB*,X!hq;0!MV'U2a$b)Na=HViY9JeJp;+FT]ARQuu+[?*oI11?Id@.B\E2RA#I"BNU*-tZMLgAAeQX/f$&MYYce4$S"JAdD*N)OWCe$,A`V[ +2&ea!9BZX]AL_FHP^U7%WafE^#`EiiH%"\W-bZ5/j,d(DfINC40Pe6DJj9d&PkD3FIq[[3tJN +.2o5%['u.7/6V^CT=G5c9IX]AbR\DK,V`jtt7P/Q?X6,tH1+kbU^7EAde#c.5NS#_*t:1^)=\ +4boGBML@S.O=ipp+-]A(Tojp?^6b)o`eqK*4()I8,Ti!U!.K8JASED["8]An$L8h-M10A:#)+7 +`?d4K`WT=(`809Bq[=k,4C0F12_Or)C9!B?\te^FZ\_1(%]A%;%Pn&t +aEo'W-,kP-0(lQU*"h.:l+.pndps?S5jK%0G01grf,ES!l;T6KU.]A#V=81D')&r;f"0emZES +1j#+!M8d%fHnMq>tT^:%Ph5`q0=#&T%Oi;/[jhOE\Y6'5@<"Zc)7rCs17s6A8DKDn%*? +ASS"$$VAa!$G'9@/"&&j(S%+N<@\&Aa;&?A?O,TqmtJKRg1)Mn!5R+WcSmSqW6QC#NGl`M!A +#kH[AX&m^C/E3>?Gei.^G$F$/^70-tqABDXDVLhJOqHs#bf(E@T'2)+F$^kQ+N*e%QJkm-@P:5tDR/ +&!I=JQ2SQ*"=(OD_a._b)_,]APN!B*gG>M9r=a&6Vc_$>SMQ3hcU@qY=ptS&6.,GA@i<^!-!G +q3#qRQh1W)6:tEnNrd3X/:!Ip!k]AJelh_^/f;k,`_%/gWj?^"0d4Ba@iY9oR68HsKNZ_G=l4 +L5H?UO]A)YL#\(&'s,bXomD!n72ehgK1Bl>)(B2[]Ap?%J^HE4Fhe"XBJ*l4R_7t5t?;^>E&H1 +t'Q'U8SGrFQN0!+\kB^.5':R'.:KN=J/Q6Q/1"q1lOdk\BY)n%)-!ZMphc=aWB)3S2Y=<0Bk +r@K!cLBlJq^)e%%\S$o:8Ff:[:AC-U_V1459A#9O#meNMqXnVC&Uiq(W+)-e"WS2E"OpW,bhY),-^5)HHU^G;MGl-\ +gENp]A6CH=QUHLd_q_\[lT?1r,6$DZP6gjqUJk!@eRV&N;#`$G"\ni-\QX*B(>i)ueh[<5g,>!;\U*I$Cq3(R<0mE)pC&EhJ5 +^[?Q67iqA]A8?YN,+5gITj>mkBZ1Cd^'T2nY1>[:@e#asg$Q!V>ldU?>!@"s*!kH6gk8P +)J2Sn_qPHt^*uVRjf%N'JKkXHoYhrom_#PUMgBUJ,L$MhnUUtCgr[T`)ZNF"Va8niEqlY76Bomms60. +_iB[8Op8!7(e5PuT"gTb:oPrEcXlI&8DheYl;fWnDe$6(Fu^dDTT+8c,T:P;BW^:&;+_T^6J +J:mfJhP)X=Rm#;T>((Gfkgqb7;`Pdn)jfRm)`#Auh'L^;hh8YT4Hti>E[Gmlbr*&.V$/E)fI +Tq?P(&.6s/>%[WiCAN-2=sSIHa-DqDnid^.+9Mqs?/_)U6k,4[JY/6'd`+7RK>Tfn80E's2r4oHb.SGN%fhS&X2e'S(*4i^P:Uk7)CA!*-*$POkC +suXe`9$iOP9!3+=`5Si,]AIH#I>eM$q@7 +t,!jS%FO9bTgVW3>/RA.$^&;p'd([oQAV1RK+gm?0Jc/+m`HS]A?DNFdhtI6kRUA5R=Mb2*JR1.CG.in)dT66:t-Ik +RS3La4*gc"U8cO@f1;dkRUc?Xc&TcrEXEAo_k1HGr?=XG>).2a`a+pmX00Aa4F)[Fnp[#oUQ +NW#kWA>4Pj!!/e:5#Ihh>Go)ML.o?Cb)neY6H<"5obPAt'&l4]AK,4f.8`N0\quokFXXHeQs- +kst!I%k(nmRd^lFlD)5a7$^rc0KhJf]A@!P=qdj';&Nm@E"h`P]ACpC'B(DYVE:>B41j"o2%o! +eciZ6OCo`/Tb9bs#@>V0n(PqFL((n/9N*MI.&p7r,W$nNAFUj9=n.rR$+b+`jp"W[e$kR;** +YrNsn@qX@^7lSibU*]AFQPRSu=jMYkn^Y_"iUhN.in/sINA2/8fZpR!&HdpH0[IK0sMVer +"kgl[:?l=HNNS;6=0J@Je;rD-('MUeQ]Aoq?C.b6(8<#uT@ubT7<9TTi=6^sVI-\6CAJqGDGD +jJ"2_e8FsqjX&LtFH'f+2/j[^aN"d4M-YSB*,G:#pg+X*Oj`sl-@I7D4PXpnPWIA:]A7T0t"< +e_La7o!(sahs@GGlN:MP!F9od)j3+/7%^UWRIDd&rA.Z:i)m@@Jbo?!g=hUMhN#`?(,!.]A8i +?HtfjBXePZ3ZT[7I+%",N9T`6S*#^G'7f0,qlG%e0s0ce+UkP0MI,?EP"tW-P>78iTEQ#mpE +R':;-/TYG"ROpqEfk&q)R!^E<**HoXNbRqPbECD5=i>IR1&Z74TMU4FqHO(Ic=:`Wnl;R@)> +4Q`.G#St#>LGB&cGo&>[gc-XWqXr\bc1sVT6IJZo_bqbFg`/bG*CMINL2?NXX%BWBDfG`/M4M$*n4%,c=;]AiO7&_RTk,>j&$16$ +obaV*P'^CgQbTEQUZF?[BnjXcM=/fnJAN/V@kij\/]A=W!`b'Z%h-n3P1%MP>]A$[HF%i;VA\: +RTH@V<2XNYX%$5NtQ-po7&L@/CO!K0K:a?B0/lWWUf;(Jo(E8k_n34i1BjMa?J+7C,AU=LZ[ +[Bo;=1t1bUiBfsiI_J7?,U+b;@)`9rgshYDHN.tj1mlmcFo]At"=9h]AeaYIm*iK]A*!'l&6+/s +4h%VRYr`J13q8H$,h^nD&]AO&TJ(VO]A+(L5M5.&5;$2\mjhW&8ZH&RF:jY^a18V]A6[eh(FocO +C9k1u%C>8+(eQaF\33`?i9A:Dg:IV*@pg +\GR0trWG8:+C:aa=6SXMZfM7BF^^N2*jt*-',NTD,(5NRXO+0A$fi]AS\4dX2-_QIfiA=\;>]Am,^. +.OCEXa"Du-[-*fLQl)O"W*_ns:3!al."BBS*kSlpWVUp!#W-AjdP36d0[MdscOVoJelL#_BrA/e&JFD#F%#L0DWMSun*B9q6oBcF#&+'jL708Kfjs*W8BT-QpM%K3"2(Sfgt\J +ZW4J>.ee\H$%FC-aQ)/1GgX0!$@k8:-,$JZ`RL^5_AVI'I'\mgOMc`5EFSf +^r;uc@(`kcI,']Agmoa7Q=DE3A"(gh*bFc/\E-(Qek73]AFG:BS+0!"ccXbeG,VlWp/he[WjOR +/m:@6'`-G,.^_<+6\^6)LIStg\;;on:MtTT9%8^&HFB7B;XL(GiRLc +G;d%218KAq`Ha4Zn)DE#k"$B;\3(6+'aMk%O,f4%B6pnUV0V!jcC/uNZ#?5e51TL'i>a&Kgm +h90$d2!5I2@1Wj']A89c1AsE-`Et<[HS`o[uo3X)?N_[aISJeTj<.q ++,`!!lLlRkU:"TL(>(-8?!YNjRf*KWWe)j9/h/Ybf0u%>Rs# +@+O&D_D)aJW;KLY4^9anPiN2N&nIX8-s1q30MI&m'#6b,NFZ@-Ao%@m\7tf^b"?=&^e#j4D`30H:!FRQBlU-H6*8=:4IK +^;/,KOf?`0Y['f(G8R*#>$cl5VT$Wp:^[ga:"/mOkW*kt$Q'5)Gmej\/]AOG"]A97#sWP76 +Zb'tKKFjCQdu_>+Om^#3DdjoSfP]AA>,h;_>$gb0,C]AZ!S932e2P=\:+,%K%6*6X^&+fT#CUg +'S]A*Mf&=^UXZg%1U]A'@.Ick+Ua(:K%r=\3a+]A>Ql+]Am/>q_-UDQs%<83.Bf6"9mJqRq_qmn9 +nAFOZ-\e!lbc10bb)s=YlE`R@+J@LhH-RMTnk=2:6>44qq?us+pfoV1(iOOp9TM)CV$hWJ%PCNZ +j$5:'(5U'IX):AU]A(2+P7e +"qA<371Oj`XoDSk3DPLW;c=F_)nADYtlD0SDQ;>nEpl)hd$;'t0Ie'"A[P*\lVTVIXahE4$# +i;2EP0\_r'=WS?\A"T +"N(/o65%1,/6Pqa? +(1,T+<.)*a@VPPYW5RXEddr)CVed&+R/l4nhUF%5$JCBZ&&$ +VtDgb#I':di(Ln[DE]A$QIXi_WPYgIo?J>GA%r$I:F?c[@C=fqSl!;g>>%,K-5I@4BCke[SdS +>_CVN2l=*(OQ@6<$q^cc%\#b/LF,+6i?HR(YNcNptMl625Yc./:I%/t@,MSbboOKoX9Jre\= +*qSs)^b7iR,_C87Ik*kRntlBr%F)]AIiSiCD"k?umK*rRI\K+D0Pt3?Y/sBFGg?MJu)``.qLh +CS<$b'csU8<\+7SP/ +U8nmIKUj$\=U6n'`%6.4_i8$&T`8Uk`jY]A#Ma^,jX[6(9L'/&Bp$E_+::?P>me[80j?q%P%! +'^1YE3@]A&[+]Ap+qgS^Z)md_RXqKa5bB">Ek;6EWu3.B3U(=j0nEAStI7jK\j(,Ro2T47QdoY +Ej>#hKK#7shaZ0$BRSQXO9EIuP5B:)mm$r"kQs+F,(GIpto) +ig61YP#ZKH&+RR>"->mk@BS`m>2#bhhQMOO(>.UcYn_Rf/&jTkFaaWg=j?C[]Ag=j3LfO5CMk +tmH\%3\E[l'ojZ7>h`?m0BJfR\TnUgpiA*mDfS4fc:1<*u>M:$+R%g'G?T$s-jsmT&9a,JdP +:\ea9$7oXhY/?XA]AH>:;e^H;93O!gAY=H/4";V:7hbPQ\qH!W4rGppj>oE[nR/m?Fh`TEhUp +EQg/_j5:;#E[BFN(eF4c:"A&>P#8'tC?=BI\^YG9F#fJhV7VO\.O9T?;3C(GRfqW<1i`G5`g +cP))O7AVVmE&ED8g'[r2J"ml,O@XD<-co.+rWuEoJ>]A3>h>(p\6&)DqVZhN\j.s8t3j6h$n# +O)mG!8H"S6HBIcZUt\d`f2*Xp7j&MWUZ>d@#).>`$:pO[m>[u\[h`>ah'sJ +UU.9S2Ln'XTe`D^fY`41m"L&1nRXTpTo9cMaI6c=sA7j0n:!OR*Sr\hd/P+ul6pcYMoLmVT"b1PE +`g8lm\Wi/J9U0*Q]ABm'O4j2bD7(JhCUGhlRj639*Y9_/.rn*u^+^5#')g?A37NPEL#ff?0Wc +gq\WNDG^(4Y4h$:8S(US<<*D=7EXg.?gq^&cn0kNX= +ncEi@0:mLq237[q);EEh$7a`qb66n]Al'Ae$5ZA(HI4^&-qBd^'KXl?W_si3'&n=-0"GcWs-DEk +T7t[9OB8)Lu.et[e@KsuMQQjl^g?J.hC;ppV+EU'M7]A&=om9#[YPYf&+Q&]A!s6j7'&/?S\+iicodB-<4J``0W;YeO +@sn@o`-6Y:g#Jl(jIBIV"sfCdJA>r!GjDehZq.V7R$p+]A$gIB@2Ap\ReU9Fhs5T/a3h-JZrJ +9f^2&7$Lp1F[7`mVf\^:Y/lHW*r=m&e`EOSTPQ2&'pFGf@V-[9!XhT)EYK$=4J#`XMq/k0rR +T%4HN`OuuJ")X30pB[59):dlf97<*f\eKcQC[p4_a>TQZ1K-m5&V4j_^ZmQAk(dW\*c2ej"N +t[XQdI7Op_^A;@Cm!^]AolY.2CL=_#:)=:FQ6HepaE-?H#2->kFHp":gVP!_C2=DCocP#8[*n +ei\BMp[<;f,p!;-']A]ASXQ+U>#,M>fGs5hX/O$ON=YlpG5:@2FQgBa7E+`aoSCF.,f!IrE*el +,s=HJ%&1GaWpQ%^W]A9,'6eLmIjag+0Kg1Kj++XY7LiRnO;MrbG6)W)4Kh0G`/NX>/VmBH"Xr +g#O,DeSOrn7S;!6.Mg(akqIJ\reX<>!U*G$udm(Gu5Pa$KO%Dl5aO)CAc9t2;2OF4sR@ToI8 +mh3?[3u!<=]AbcOdWZ\A"`j?tYcs=bD05a%"WB9aitP'b69$qan<0XC(l\U0CS&ItP?R3!MFa +oU&(-6B1/FV#IFrN[D""&mWX+%PPQNto_S.Gk.1.=MH=]ATFEL(!9TcFV.dq*I"V!l_THQUM> +NX-GbF)PHs5!!,%X`W@)ZnFFGI1pmaGThcUi_aV9_V2ecR=bA1eM<3,(+5?5grhV.`l:Jd`+ +-DRHtR)io-fW$c]A<$u97XD+I:BB2/mJU>a7&@+SoWT+B=TD+;d;(IYUcu$k7Lhl9Q=WZ*&^. +S%\J5IWue#8)DQqC`ET(=.gafhDB='7XO96EoqiBVi9/E$G)q#I0ha4M2X^!5G;>(G0?A_b' +EJe-1YJ++fJin&JjredY)HN]ACl^m7Qk@f8@?'N6M"ABa+#LB`ir%15&la>R>n?D_]A=G3*'63 +cOc3A(eT>PW%!.%Inj-J6:Bl#-UX,uW.a)]A!,1N`&*`$hbBGUEBXpb_stYC"U_n&_NEH*tj' +T&h7dcCoB/YIL8\:[;3u?1h'V@:Pm']AZT.YqUGe]A7_FYTf"H)H!%1k&Ln]AnXnLA3`+7RlN +"n]AR8bN#)l<<%Mb>h;)P*g5Sl[aai0QSpgJGi&GR]A('@Sqq:/lg4,`Eki.)/lOs005+!-2UA_,A5_B[?Af6lfFU%g*(EcSHu9iY +3*qe9M5ijZk,j!gF5k78t.%r%UuHWK=njY]A'b.1it:Nd.lo?/G-HTC/9R]A3Mc!;@eP>4L!ZPW&W#I4e\]A#Z>0B6nU]A +9-hL:8$GnV=eMTIFJjNbYB5LqH-_9:!'<]AKFE'3E,IeLs9T&_;@fSnMoO_Bk-4p0.V$?63+]A +/;U#Uo$2JsP5[p0l#6tGAD>C)AS#cJs+h*5Z_+gRYKF&31J#'j7*QQJiWto\b1+X4-1jU>of +QM,Yge)WU@?0a;!UoR-5m.5i/ROFM_j9rfCJ1iBgG=h$R+X4a/pP[[n0UD7bsoekIA2umd@( +aUF>rh62@o`:!VpfUU7SC)GiO^4q;g0nl@is-I_r\/'GX*BWL"`=-90b$[08HT+_k@$:;:FN +M=5^0aS%Ts>1F]A^-ZBS`bSM'3UII5JpOFr/)^U/??[g3X+HRKAAW.aA@ +P;@]A!J_agJRKAer+99C7nO;99MCPp;;!VK*`LLl3B4S:Z[.Bm>KJVSS=H(cq:kGc>UEE6#cS +A3cq-*k"nStHJU6L@[T>D-M'nIDEV0_:5\Wo?r+/Mk,d[?_TQhR/UfE[a4%ds_CgnQ]A]A2K8( +SEm?T?>=![c,O=4Hjp9o+%:.rj+Q@f&(hFTZ%MF2OJe,flI1=XElsA-IkqAR$G+\10&aP\Mp +cP*Y4Et_`Cta9O]A-^Q7RKE$T\3s%4c)0EY99u5QaZ[KALJ!8qD*1BG)]Ap:WV1M,4DE +AO\Uq")/.j[ljHqEaa[Ui:"U(fq4nbpNe-P'o:D5Tl?FIaZ5ML9hTBWfp#(1V'ij,rG+47_8 +!d5\Da>5_bljo0T<8pBqjgH1IIYO\Se4)S5_>L313Ujh9Z*c"UjT5J[[bFY&P=5H&rPKkH]A& +1?9JOn_Jp]A6D$]ACe1VBY7KHCiA$firhCCO8)$Z/Xs3i;LNP]A".$Qf?LZ#WqRF4n+:>9,l?b>#YKj09U'Ek!YWXbYTb9q`dg+/DP#PP&HrCc4oaiFN09[V`ATn?a +*U>p3=D1L?+AO +YA;PaKl<@RpM^3q."SC;5(q5D_\Dm7k\-nPEU?+lBdm5_:8(sO1W;>TCK^dL3:`D=.1=60qe +`cloOQZ:KCTkdZe%_6(nc!%D&N-T)t5!`S7jb#^J'=$=NdR"BEO925NPOD[P>kSg`$D4g98J&(K_n,#;pH(KB/3B +&DIqQ9:W4lW)n6\#0SfC.R5X^Jh)iREY29>O@h78(`*MtKs^r;O\/=$/p;8pcl'qWZ,D#LAG +fc;hBY,%b9*HN,7/*@l:gZEds=k%NZK53^r`_2LMKCK_3kH"i#*,%G-a?L<[QMR`01f\3Kd7 +79O/o=pr@Iita9LI`>Z^Vg'uU9QnSd:Mtl>kA3HVsnGqPEHBoLlY4+`C34@-3@bi0)OqKl+9 +Eq3RRJRJFI(?/Ps@N$r\mIm'+TQQ&62&Y$UP7gV"mb +Z2m,&]AY$?P5k=^7>t`E%E*#%@(X4Jregd58,)rWUB>ZT\.NQJ^dA]AlH"77.-2P85UUA'U=_j +tH*B164A=lbek@!ht+j-ufF>Nlb))B'O6%f6.]AI"X0s!7J@htftL>f_cC5k+arAKUIjWd%ag62Eb#4?DX$]AmS(-B`S/qiZ +,qk)MBo$;KNkL)d2NSpQ""U%2h&j;f2Gc1H+Tl7!6:+)m(*=/Ug^SQnEQoW*8:EEG6; +mgHEASCjp"1@9`KJGZ(UTRWh*`1bWEH9fHm8PJFg9HB[D$-g"m"Ot.OrNlu@UNcD&pK)TY2b +JGQStS^>*,H+_%k8P;)VS7V=5i)\B;Mf%WAJ'H/6gYsUj>$^61gk:5X8."mRF&4RWOf-/p)_ +Z<Pc`/[ObK:(c^!]Aa@K9?c'9AOde_SLomohMi#Fnr3Gh:Ndj^hp(4)4$0"V/^#4DU]AjjqSmW*Au#-A2j5$rP^g#VaIn`b/\!1b4u +VlN4!Uid]AiV^+=V9W6"[a*O!W,WF=TORF*Y(Hd5$P@u62` +"2K&ZE$@TZYJ*B]A?GqDP"dr9.3COKZQqq=b?'> +@grS[Afu*P#>PEce\e)2cJ3;bP=qF^F!./D*u'cbFF\roV(saG:pC[04!s?N%%LJUBNWoMe" +FM_Y5>@g:L?`_uJWg*4=m-543PpBa9rA!N/hm'!\8()OXQ'!"*'=FpcHdk3'u8#Kh.HC/s!p(,*9pJHc+%:1,0k`c: +[RO.MpaE#nC2U[jQ40T1]A\"Q#Jp5M%E_k>s*B!;3$p> +bY0n!4IJ6\[la17]A'^+mtQTq)PVdR\j`%NVl/AtbHgqL0O#Sn@J3b+3WnM&C@JY?,lI>Y#2R +2UD`]Aa>I,"--#I9=H]AfL->\tU98;X[#)#Y9G;0;+5-XELPP&!"o#6Q-jmD2-4`.BPb&cJGW6 +Q0Cm;[I$AI29`Er+pP97*3G7"dJdS6=s18aalZN^sQ'8+hk_TG(r +8M1CLVhVT.g"d%B/j9b?cu3O"n/.f_ +=jl=-(c9?Z5lU/koE[&#(H0\73c%,K_!F_K'\Pc*haj:UD>#EF#>N6*ELG1Z&N,b]A^DJ/Za6NI0o +p&@*oZ#__YKfmbSdaRE58r6Ub,> +5C>sr_Y"h$OIU-/Wq*mS8dQ0A)8MF@91)ta_H7P>$]A +?+ljCSR=Nljel$UGlnJ:=-N9[t^jG#I9E3_BfRB5>D0!1L:JMC4F]APoiE!dr*!1'p5Mk +=)%]AdnVaesfKc7o.fSC,Hb7<$6`Vaueb5D1g1>t2>QLV&fT1QrH]A8W-?0.S!K!-"<4<`N/m8l>9u?OnV)/ZHB'o%R]AZa@>`MK(QlP"iHu1WFuI/DQo<$#BOr7r6BE6 +52t/U)9l86(AOI!!*jrQ.+uX)C-Y-fE&\.8:r0gJS%b&.nN%o_6^WK6Ob8^d__Qa$"i-I8!s +&MJ$3hlm//am:-E51.cNAn=TP[CtP+gE#V0d.[;njPlCJJRC7@)T(g\cCPXpJKF&B>di4P.p +E-G`ke^aeI6@Nr%4<3aL+f+n:;6_\O?J36K1D*Zq7?7HBAkB&8Z-NnDZeE,oPFSb+\P+La_7 +X\bk85p+>6fFT!Q+`!uRV!]AdXgYdP>t2#(ak5QlED8n2%L'(3Re"*SQ'@PN*DQ\5[&=!e=ZM +/Umknm/+oD**!B@`5).72sIQ%X2,$C=i#(Nbk$Z@-gpY``V$h6dT`Z-(I8kjkT0+XZGW)i6o +AlsnGMOoDTDI+1uV%EVo&e.p21R:34/sOr5OeTiLXS30$TV/^@>W9Z&Dt7erALt":O^sN.h$ +]AniIu>YD3mO(@>iCH>b(_g6A)(6*:AF70E>*2E#F5L2@>87oDW\(Ap-3ZJ3b&/T7 +=m")%&@C?)m9Yg@F",6GO;\!G[B#nDG9oRGXJH2r]A"bM]AWbc%840f52R.'KB`)<'7,fi*@E54^rKgk!f +S!;\!flPk1sOlh8A/HSWu'EH//dN*(g?$orc+K-\1\8&hk\gW@`Y$%kE_p?2N*a,QUBbLRA. +Qg\j1#5lEf+ee+[O[9$(b$H-)m/MM(`SCmd7NN9EDefZ\h[7l>)2?%Mkfqj4P`'eV:!iQIW: +pX_ka%k)FS+U/lgH@/t%uEYTm?[d."7UID.[3icX/GqACVa:DQs9&0/a-LU3b +h9!rRF+$.JKD\\_GGjH:pJX#3Nm;fiPTrPa8n7o6S\ipI;>JJfXj"9)"iDQ)Hup?fHH?+'2r +Mqui"iNo/M'"'PP24YbX"oQ(b]A6n]A+L[4S,&cmH"hH[jIp0.jV\Bao?+?M@54"7;&0KkX,J` +X_>[^Pn]A:hK2S'Am/5nplQiKt^4(q9CtuM)kJn`i^9*%NdZl6QUFtmJ6GKp'S.^i3E5hI-nm +B-'e<]ALDB;d;.d`&O#YZVRKj77IY+XH<\gM'5B:a`JS$74$e&O!C7]A2$N_\RCs7E==$d9"[D +Lk?.,]A\r5'Ps:89Q#J@R%/gW4b58PI-l'k?Wrc_ROecm#QhM"9&+Os[NXKr"&c^_2a0l2&/, +^5B4jEi_-Q.G"_Ep=TtBeg-tA(H\EXh-q4kjTH;36R87W^rf>H +IMu.nj6-Nf:JXDp)c_QF3?0$mO7/*7G$`\DQV<9sOkuh1"Idqhf^-dIaBTp8VW1p;XKK"!k;EICL&]AVDcG9'oa#qDs+5EnKd^Uu>-u2f!kB2`@fl,Cb +@>7d_O+N=F`(o;K>lHXnr`<*EfLfP@Z#F1@_OMbb9QZ35Pl(u:u2$AVNBbs+p,+\,;L1tp8_ +k=r/RV;6uHo1S*qC=iP\leRJqf40segW7KoOQ:DS_J'8(i9`Di3XKO\S9g9rW&eg< +b+1=]A9HcFT>1'c(\k.:5db3R7JF.jq(Etbo7MFpLB2=IeEFQ_e1k:2mK',5,/le?_:q/DV[J +BQDP&o&'[q'=`!Q/=_UYFG)kFh;bY/o=[`2o883qV";W>743K,tF%Ee5o< +#',q#O(c-(EOhLct#")=CrO>R1Cj/"KUhD5.-b[VTVtonGi#\=O4*h\liUgqW^cG&.&=n-Yu?jG2 +BtV%\LmcC3`U=+af?@4S6h=SL`.%co4T:\P.&jZY[RRp:NmgXci27l[]AJ\SFl=r`9j4OKa"^ +1Q*?e5@WRs&s4"IXVK,[QZX6I\2Jt/f(H.]A^SSn*">\W7RI,d<^=7hR!R+He(n(;j&bCc2Po +8M-R8,3[sJ@g1;##)P81^Sm3fVO.+JDUG'r(4TffAu7Bf.aP+K@$Sud6Dl5m-:P.YPTijP^ +r>`4!Me[DSa@#4[c2mE?PL?rn;3k/JI.\nKC7B3A'jeQd#tEhfuR5"1+[$%FFM1%d'K#NCJu +sa;UG6AK+sGH?Yd)J_mAuR[VC!HWg^P)@oMYI(V6tSIl0Nqa5ci>4_=:X+^i`jo)&`WF94IP +@E\>rdo-mfpc`Ck*DK491JZpU?NuIWeF)OMM`((VD`,ML]AR>DeITj$D%7B\&)2XlKs(J*P%/ +/EU]A)@C]A\D2q!?sWTE6[gJ`^]A9I+n_WJmEK]A4VaO:>Uc/4.lVn=Zk.GpED!/ijlO9S`r5++) +ap`?O`8%1Gg"5`';c-Z(gp4e#kBDfWb3fk%LrChC9likI^J*(gb*_LK.AjHp\^uC9^#.iJYm +UItUr*'a5km"cSUeHH8VT)q?'E]AlJ;r>)PO"2N;AS%=)M=A>K\l)_s%Vu$(G#*>7.cuRNZMR +;p&<6=J[KlJ>MC>d5P#GVVW$cj"ms^I;"uu.f?1O0hK2%a7rG!`h/h6X'MOWiGq&TJFLXnS& +9_EPnMD!`7=-U!H7?Mk5h3rF)pPQ0etG-)pLLBH.I&gqhiA"@QlW$DlX"U(t@f&(I@L9G`7b.ZS'W=j7C6pT6iR8j_Q>qpAeMIdN7GD_cd,` +,ODL#lRuBSS+#+NQn/)fQ6An:UlF?SgWL +qB]AkmErV-qujgOLnDGs9IpG\5+-Zf_fp?NM+2D"Cf@#+/cti`k.3KpLFkg"Goo!6E*fM'u+lL;AE8al+^5XT0Pp7XpQ90/V(#%+u-";ab&YA1[b[k3:lV>C^b8aUj`B=ii3oCB +bE6K-`F$0%,9(?9*h.k-C7QY85KK"6kmTBKp!K:s=%oNK7f*V_4oZuh2DWGj]Ash(@FVQ+@Jn:^( +kZ%e>o2N=CN^Q[/OpD-\*4m"4?L^3R:dfnniDS@;kb'JYY6pVB9Ak,f\!cadQ +uMbrl`em/5-!>"j2\/Q1Jq-LDG=4#K6`EA?,9dDKVJJo\B8^V@%59Y#7)k?(EhZl4^7Ks6sp +UTcn-q]AYXXBPj+)toP;[Ih4G5Gd(Q_0GFX,d=]A\\6^bpIYgYb]A."!bDK*g/8PNU`Lt($=(*C +UMF%8R4\.f/;KR(_D.iO_Zf'^>=cR`8u6je=!C^?R&h+ns8)V,nBM=f#$4TPPNPdi=]ADiq/^ +;$MC),b%*9`HtVBQN_(Dfpi'd8q@g%n/a^!s!c;13rKE+6s\Y]AC8TPhN*o!L +1D`E'@!:I=jSG99Jl9ua1maQRg5Rl-2VN_).0lW$RHeXe0PXbY"/fF=J8r_[]A1d'8a^!TOUm +]A1HAu.Rf[s2!ZBXqRE.M1KD,qFEBQf5r:\*;a@nFo:'*mZ__0:S/G(0a>l4E5G.DlTb@=li^ ++i2kjlmM+.pecCm53UNCobjhh(afTsT`5LIkP:D9;Kb[:W?]ALY;&,"0Tr&TKlK=#B9fLLo%q +--lqT[,W7s2FtH?6i>]AXNY4cd=ejgk6r(aa\L8qKQ%([q"S%aaKM9'uZ/mopC>hI"& +O=\Y&FiXg7NTf_\:^b/VKTYhTCRcfg%^'rd4YX:I)^"aK!5R,Fm5$ +Eb5NWOS9!7S&BPkIf@M:;IsZ=Ndg=+/[#R.?*0^=EZ[LUlN&2e=?J(aDqq,&Fo(^Q@?dV_0i +_.ZW.q*$C(`j'8(Z8bf`A-mXZ9NdgmjpRlC22bq/k9oaM*.??#um>]An;$o51W\H&kr.'LQ$2 +6d*$Ls$3!]AW.,BhaW>lQ9PX4b&fTgh7]A9E0[JkT9TFHeVM&ocq%Pb!ZB"D>#cN/CY>\ +3*58CL(/(6PR21uA@c/?Ac+./Z+R`><]AVMf.E5Vb]AmApE>uoNS2XHA3%9J<.=;)"ceotb8A. +5H'T=LMdrhFt"+FJe%FQRbgfV0]A?_S+l$TfS/ip]A>lcA]AU+i13\C2Wf74s=[laVf`40:IR?; +/0IeR*D>:F;`@F^EKQe%T]A^c)WZ,!\O<)B,OX-Fdtj!bsn\C;GTN*ZJ$:%YZ`^AJ-gj8Lu]AS +)%_kPo6_fYSE@1RL`#30Nkcj[ +f?I]AS;>Vu^r>*f3rQ0#*,b(!D+-!*B$JJ+'V6gr1n&[?c]A@F'Xg_nM6g@TkD/qWo#BkV7:WV)pl&M.BFcO^$AR@b^4N_T_/c +=lTF<0BJ7\dUjU3"Srn&hU5&dc=\$!`J,Yh6+.2ZOXiHBMU6U3NoDn+N]A-,!et#>=U%WB;p@ +eM0=#bG.NYV4PY`bXF=EL@+90SgTb-?pqQ6Y=*?Qul3H(sgUe?Z%Am)lK`hXekWLFt,Z>2G_ +'\i?$&M9h0e/:[`0Srd5`\DQYl5U37^jeS%?Fk`^VR/5%'81@n^>bgPuEYP40_d*Z$"&4_4<0#50KU +qr/hAN@c?bA*M%N/i)O1RiL@caS.LhqGh;$[+h;Fa\,8Q/%&T9EL]A<:1^>V,%R7]A]AAg^UR%2 +\[X#:Y*d7R]A-Y1isRcA]AMhQ,B>W5H9bA?Y.!h;-J=>R(K= +Qt#\Yf\q=Daje>HZ*^E]AUaTMmmGgCQeS:GQ9FLU*MNXL["m7leV3mfNiFgo1iq#Ync-3?P>m +RMfp<:@jUFek\/]ACBjTr)lHD^#ld6_L[Kn>R0n2f5$XAF.N=-2$P +8\<(ur,f6jAO0C\YedWIe8.r2iu5XV(XXHi@Nkni3gkeb\,/ToeSU9a4R8%d5]ALRL]AV&[o\$ +V`6NU,)r+ABMVVH,oZ<7CYD\=#f`U"^_lgh9?RQKMh4UD51h_L+8thB.HF>%p1rJ4BGhBb6$ +TV&EM3:Brg:s;$[[iABgpWW!R>=IB;ZW[RnLWeh$Oqc#sB6QWW+N1V/1f<`=FK&>4:[]A1LP2 +@H5@F+nI>lV[aUcL.8^\]A^\XeRf8jNP$6T7dh"@]A6b>Y*W+fY4=)(V]As%bk$Q27^G".h=534 +DTD=3RD)>Tl*9-Et8g+iX9>0PX<]A;AM,T77je67rEE"h3<+hX4p>0j]AIfW5G4=!"n[^Pokm= +H2MiFB2<=C+9-iWk;m,lu+m$:nG +Q/rbA#Hm'iH9DcLD.tOIqgOc!A;5V9nE[^G^)!?&R_"6\2^:nS)$%I:]Ab +`8WY*780dW1#s0Jsg2n,L<10$-;]AOjrGN2[;K(mUgO0Gu#aFE^UL@#Qt4/s2KYR$JYY*Ic'MR0h*QVnq!q?,;q\H]AN"2l-!NGN4Y*S:2qicgIHj +TGCB.&i*LORngr#q-UTfi;%-(JP"?DF"SROUbI/(:`Tse"om8iTNokZ>fU"HI,hH%Z="Pqcj +3Na3Ko#;1$3DH*(+ZlZ/Eu3O-`QT>]A%p0'o,+Z'&dBqAYdk^)BZ-`,-j("f"E%d)mk-&0,h6 +=Q5):QWu)%S^.^0qgIR>LK>pkL8HE\"L:1O0.0+:GBW_#CKACi1-AI6(FV52G]AX/-#n[VhSe +!7]A;uGhr<4\C4;e!6q_8smSV7NIJ+V$`./uiTZA,V@tI=EaC0b!=!C]AH-9.GKCGY(a]A:3$WE +H`DI-uPF'&_=(9@"RZ`@:?^7PdPk$t' +iS$k;4`'EYb'?IU><0:PDAp9@Ychj(_\!G?/2]AhMPM@1R`Qa7T"j+MB^'GP#"4r>42-;uA3& +ZG*"u?;j#=#Hp?F);3fMDPtZ19?!eX_t@a#[F&P^atb(d^t&&Lq!2fA#12XGc6K"Q3IAJU]AN +\/`CZgI)W/ernmuh#V+6aLX9b[N)*6NWP1(Ub$Qr"`9qCerm./<0m#b+&R2B,IEIWuqCm]Aqd +"YG?NmeC,_uN>W0\9h7s*QlW)pqAKSu*\*<8S"0kYhpFfohqp*uT<1ET.WM0jtUAImfB'sYff64/7qOm`nX0VYS,^SSt +/XM\%-rq4IE20\U_k!Z.&t7rR]A;]A@gJRWSPnRR40-aXK3Z99^JUK*(TEoC*?qF,6:+"q7E%+aa'YXI'oE/f\3A[!Q_4B5flP63EpEZ=nHbo#DmM@JX^uEZm1^p +Nfb-UXUS\tjL=p'@`]AR+,MaOU/[!<)MMpO17=Rt^go.C#\+-oMPsDgGXbBs@u^Y)5'7H_NPH +B35*0$chhS)r?p*7KWuC'JIIY$D/=&X;_gob:DkHoH$PqdmM"X"WY3DfA\CpbBT +G8;4V`6o%'rQ1*^!4n89"5CFc$GRiZD#d:ZrsQ(T$uf:FmD+heWHLI-Y'HV-oqr\KBFtQCu` +D41i,Q\r@X'r$3Au-%H.WdI4`".V$<+n$AEsh\2MDOhQ/A8"9\[[(WJ/4Xd^mdq?O1A\e'c8992RC!FZ;#34g:ih@@@CA0NLB5t:jLR#NrT +2GeFZ;pcme1Dcubkifus7;<_'6qa8/7C +j;>%miTp_4R=Jf.6C/dL(J2KV2.l)IQ;.Bc.SeP*H[-8@YM9MJ=GAR$3,[3FgcM.=a1MdBbd +2m6!-7h'/#+3AHpHuE]A.pg^lUFG=s%$ObU$:3i690oj8\-PM/g75I*mS!a``I+>9==\Jp`Xj +K2J0'\>1-[fT\8ook.Bsef3VU&U@b>#!^CdlUMXjQMf/M3`K(UN?RqQ#(6%bD2a3mg%?3;QkbAVB9$W#@R(m/*(]A/u6p/)?Uo/Z#7oKCN\>n8)cmuj@);,Ash7)^k$`a.]AoRmbDGj':*da[``1qJ0_!E=GKoNqQ*N3MebDrA9PPU4pYro;$0ZPf*.piT ++u8CN0?)!M&'-^XHd0GiEc5TY9Y5:@m4\^d)r%e3 +:@uG1r3d:iI,*3>5OYmN(m02E;MDs1>1M81iBgs?QC@tN)Us_e5<;gPA?YU0Z5j7T.kKJW^a +k/i,3us%2I=h3FG"@]AcF/1ugTAutZGaA:O*m4q]A.6Q/^u=%nPC/t^cq-c)_FI\:]AiXAZQGkJ +:^-&1O4Sc[a'nJLi.37J7]A\+*KkN'i6q+Q^YE27DEdZg9BW@H?CAjKK]A.=kQBUEk6BB@8_`F +pSg),3hf3+os/)@q0:A5AG+TDu0*]AQ\KY0_%X6$K)>0ZV\R.Pp!K%krdCQQ_fKM]A;k&81)1H +prV)]A?pRe'VG]A#ZNb3D2;T,%b9:h]AM&3Kn#j%kFO4>(Dn0h$Jk5T$#K<0GY-,e>`C!7lLAj"US0&2Nk;?Ut2308nosQUB +]Aq\$7P'+:u*H$ad!KEZ.*-*6EpWJ\!l#oGci$5kWB$:XJ_MI"(c"HhKpbU&G7RY-Ye6ihB\QqEl2Z@?C?ngSU&>Kdqm5CUr3HX[<.c4.8 +3"ig&'6F5,&L#qG6?Rr#6tGoQq+Ut#7Dk_I6d2?YmNp,o^qcli^B]Adf;#BBXQ@O"XTmmGbg# +<8%lmJZphMLgG<(V02&jQ2rZOIEIe)P+P`Tu;"G!EL$"@I +Won^%+L6"=aI)/*>BaOR\O(SpW3!*MBUo;($;!/:Ph+]A>PrV\]AFW0q*0q2JHr@\VWCmqVb4< +VT(;GU6rbQ*&Te8+2i!qL-oYmrUPh";b&=`9nkH1bj(#Tm]A@*oCB$9]ACiV_9QqD0`:l2eE?Y +dr=:8Z&H=lJ]A@W$Yd[7=ES&,eUL7L_@MNOf"1h_`p[2)`j1lJNWLBkE>-(GX$Rn_Q#P&;s/m,D`:N!/:D[D^KbI]A4\Noq?N`[r0QiVZ<@pj7P% +2hW.T]Ai#,bc>EXF9?Y\DtGZ03O4NQSaiOHON%mVUkre]A"^VL,KoWhebt5Ok\TVjJUmeu?[QV +AW8p^Ya4(Tlk-K(8LVVL%g-?t.8G+2(*VDB*pQth[*jM57/iUPgXo?Gfb"b-FH[I?9@TiQ/Q +nGn@7PGY3(NEYS*N""[Yi+(?P*gO%k_OpJn*qZUl@t[sY8AuAXBF<@jWT04?YrGC3+L +-WYSia=D`LfYr%b;c0LD9=f3V09'G>H:UFoI.SpZ8YGSfe]AU59SF3h+9%Rg/[iCk8%3nSi0D*+&A+@*]A +=UmlgT!Tfa`/qg:rmi)nCS9([B/e0@'=VG0RP'$dm:Y,RDRdRWpUu/)P+`7?AGr]A$H6?149o +T1=c2<%`sGe[dVFR1p@ce5cFW&BHGEaFGs1>#OHSV_bsHs$U)r!;9;+oW]AQcroRelpGL(?6m)L9-bu,% +q7H2"S:e.=%YR;;!#"2`F'us1D$>mm`jOQ$-Tt[.VqfWm,8K#qLF;cC6m6'j@ujkGJ)nbdmn +(I:$X``I5FVHB@Z)8U0XD_LAa-.g[JJ6I7$lae',#6g?V=4D*'0KS)5Jg\?KY!n:b?/q:`A1 +0'GH>j1G2QW7_c?1WQW@Q_UtOIIY7]AQPYW)]ABQd^.'4`R%L,2qtk5@1f$U9)lD&3W&C1%h=" +3=:g!7V5uY-RLWtdu9Yq94CRB9V"4)]AJle)2KH_RcEEk9PV*pF=j.g!"Hq^8X\#OT:,Q:4Qu +rZdjG'ISpS)U1;D^Mf72.)YV,2]A#YT^nJ1Ugqkq7ns??L[ufS/3@JuL(UK=;]AX5W$F%19MWP +V-R:hu"O4j+T'GTd+l[?'2m&r``5d&8]AT0eM*rN>No%=5N-(ePLncY21bVd;jTuPO&Ki!_S8 +?p]AA\MPN[PfEY,upq,rk=B]A7nY_.N\EuOFd_rFImT4ebl8_ubNn +E#Hi&!R:3@3*m?TYo0.-[5<#\u%Dh`a\Dud%AHALDIMJdBH.$E.$U9t2i^#i>J^Ve0E_#geR +S6oI2.gY^Ve/7]A%ZlD)/n'.^\cH!RQ2YOIrG:p@()DA79EN"5,f+&B&e@#,'H7l)e +h1!Iqf]AV*F&S!I?EVN./8/sbhnOX0Fn9%oIEZgbVWm[s?65]AMcUr-V)jI@5A7,\7]AqE[;#(o +ZZ91p[&9f!k5T8-\G$/X0JGSNJ%cusC%K0XXWQ!prjcG6:qm%Tuu!KPKp3<>i^6$:m=;c9r- +2ChS`ctFeQN2?c_=rTmKDHd"(ZfMJ)_a6\CLVZe=YH' +k-bCHhIeiPGq&?Fj/s)\O;3hjGr,t#*k0`?=`l;Fj[PU7i;6Dcb&nR(4[%!Oh*XCEeg1s+iI +e9se3,cMUm'_:dGh@]A47@o*Zd]AG;`R'q?>%Oi/=\?@#7pIQi_12NUC`UBE'IaR^CW*FAHF5XRA/FIfnrF[bZ6-J55VG`1&aB'>(AcS2E!Gor?!3j=+H +-<[jN/Ih0aE_>07H97Nuu.!d:I'SUmqBn$W6XGkcd;f3P49g[$Ef3R@[Y5cC`5eiX+qS53 +(IZCUl/PIha9b\hAr>E-jL48+#\&,+\R),qLV6oAa'4Ld-'T_R/chm,Lu>dZD?BlXUEk_2*P +;1/%DU-MX,6P4dK<-`qP8i_79IEQ=Yr$aNr2a\rWB"3M2E^+\Vh3Ci!R8hfrJL>tc0nP +p'!/K\$5:cd[U)\W:KDGWHbUUOp*sE%d,2R8iI)asP`=AV\gAmR3dS=E3OQ*`B%",uS2/FT8!@H_fjNr*gQc;cCEjN#rAV$!=KE%tO>27QhR>n_ +#i".ieGo%hd`J=D%[p+UL#'CiQqsYd#5a)HN[%P*>>>n&LWT^t8(E'eBHQkmjCER_RZRfN]A, +L>#6fL6kWABH-W.(P%-JsX^?F^\+p97GjX08[b,.63TolN!-5[$KgosV.FUScS(O=2@$gs#c +@J!/sM2H6Al^PC@+@1s;e=pa5*F17J@+bA$s-Xl1J)UJu+r_K,0\*JFiljnF^fl:RSq5tbl5K0+l2`KdjmA3>p^Y%\hk(sRGl?B4s]Aml^4^]A2D.e<@os)_ASY@/3DIC,EOH +.4NB&,7\CBX(Bcg#XE@\KB)\-0NGM,Q^@^JBj`$[6!7@D,rG+*meQ).OfI53_%/B%ppnP[a2 +m1<4auGb)JMV!ajiNejU-;Bb6Ab1-RZe$)hAXP(=Bti>Wa5o^#:7ARVO[X#l_aZ[QrLub#MI +HL6ejfdXJ=H@]A["?QL`nrbOl1Rm#IilAdj>D;Z/>9-tmg0o?_bboQ]AF1&mc"NbqdN`,k[k7+ +deq'7A%sq!bDu^?!Z9G^o%P]A8Ik;ec5d95IY&h?F#75J7q@Z%BCfA)np9S0o5r/Mr,c.ccaU +\>>H0\E=rel-eN(RSjHV8-HcY?@b/ke5CH4TQ3lqu(/R!$R58@i,YYmK7cLL+k:H_?T3l:H% +]AP`oT4IKq!TD7:Ba!b",X\^scK.$RB0C5pG_6(/dcS0ffqP>1b]A,ZVQ)6e`qm<:>L]AE#AM]A4 +-6J]A[B%Q-;aZ(PLEO^#aQXY42Sq4hs^tH_#F<(PgqOK&CtOKb(6%^U8.]AcJZTLlY;B15TQXF +/9-P\cW,$6aZ$ne.^T=9cE_<>"#3s5>E!#32.2ibq!Q[@3YOpJ?Rb$i.^jZ$Xjbcd8n0pV5-`;7\5:g!]A,$jZqBSIB*) +q>!=r52/XgDJK)U[&1JNkP:3[55s[0f\"iL\V13f?+Vo*D=l<%io6]AW"$/J:pL:ERf:Hes:X +AYDj\<-,tG2c;'1/UE-B5hc_eXc?1iua*FD%QRaG +"#7b*Sr:^O4lL*m"34RZW1M>FEe8a]Ag51L+1BqHAk!K3o:rU`^`hc_m9-\@E?K4l3G8:p4(I +5$#M-iE06C1PZe+m"ogLW!GbMHr@4bnYS$b1)1W+24\&6IL&\3:T-;(?V%p2$$Y91CU-)9MA +,:Oq*Xc%g*R9(+e@RXEOCN1;;d67o*=_*V&+_m#9pS9tT['(JpdE[ED%8[ioX/k;Rso4i\\! +D&I`tcrZ$1.7.gFE)*-)G'eT)^X?ifi-l*.'%I<.^@H4sX[9s$D"\7p57g:mY@FM&5PWK>;)fP)cAegPOr5lYF +W3b+>kMt>Ib%U[-?#+mm<;kRG\#tXd(^kg]A6ge!Vo8QB[JHO>cYcAa[V-BmifTF^uD9$D"1n ++UsHF<#"iYr]A2sTCi6.lp?nk8Z&;@(,-YKEH,t_U,7TN=;/lk>eL*N6p7q40q#9jVIUi'k3) +k%f0`R->dfcXT2PR:UKLk(h?Tq8ND=]A\'a_H3hdrss^Lb/&@(JDS"Zq+&'39W_9nPp\_S7B- +-d`YFoRmgA@_=r(87;/'WV9&u\:,nRp$8gS-ni-XFM#n\N2p!5N(YSS9t4OdKQ8.)F%6\!F, +'$<8q9KeHF58#IR*,Bha-o&I0fNXeA)GB^C;- +smt!`c",>_ZHZHfm8PSWl^bjd0=dPkL[L+OZBW_]Alh.R=G]AX,"^,Q_cF4!4qu**mX=0'0?Tj +_9#>C0%@sSpVj#*MoN>g["gOm7':s^'i_m$KTF8Z,fmQ5*)"WJ@T(rstr,U&:@'8eNg>gRXH +!drW%YNhR]A$F$f<&,QINK;*kS[h8-!n9Bj2p]Au7`eg;'X[d2:sBn[IG^$nh-1Ulr&fC!g/!1 +dV?Im$(*(+P!*VV;_p<%U`TKVi!$?sGX@HZrlr@&H=B:uAIroO68n]Au`/jF8;2H!t1V47`hl +lD#/Rg3DALQNIaquo4+1EB9-!6Gckk5_YX.JXH@C7XVetg$tGOZ(cEk)ppsSr1]Ad!XPo`9]AK +m554^S",#NA6l76.E#?J"-Hh9$SBb\PI:"@caDemu%&AoXb66 +QV9mZY"[Y5P&%q%37SRnu09bKj-V3bq5thA:di+7QoScg#/N#@MiPkfg^>"5=`=`0)1ZGD`s +"i4LOs@BdXeGUtjlm$33L&^5^^s4rgO$P(2M7WTsl.dHhb4JZeP!7LA>,E +P8bddl-fI1jsLG<8I#ZsWMPY.9!K1Le@WAG#UM:;V58.GpR0[eb_+u/ +]Au9YGYa^\.0\/CqE,S?qr;cIljf&Vs>&Lfj,9bWWbq3JK-nY/27X*?7.@MC'?rX^P6:p^#TM +rec/2W;=LWm!TW(s#;;F]AbC,0bhcI[A'n,_!raFdh+$J0Bi#3,FqEnJ=SFf($%XpcjIk3E/P +;j\D*#mIBS/6+>7]AViM?(FFoPbnVfAUV)=kKh;.h&jVfN;Umh1 +c.B'U8II?M5%X]A^*BH-Yar9Na4S0pXQWLi7-*O`c6I5cJcJ$l+L?K[dS'r5V$Dca\t7K)T@r +=.i0cPDo)#!p[6@UX7rV]A)Pas1NdU!mthbI:V+<JR=C#k"K:S/r/* +8mBC$'tm\7RT"2Pb:l`Hk*rX0Z?o[8[t6^<23P6?:d_t2rr-'=Vh=uJg<.Q$NR1lfS +XOOI4t2Ilh;nNU_OK+RW9c#WOTA"_B]AH/@k=EWU"iml+2pEl +.=rEiFSm4]A'3IG(_CkHlAm$I4qr;p;es$48-s^Se8"qcl%;B_c.$aS`GXH":MRTq/:LVF=?, +pjn!I.l4I!T,u#F`&"c37\o-8MBYp,<>93Zp;IUhrXu:W.(l))=Of=aW7sNqUI(F5g(M'/P& +lHLfts_f_gOo.jXC6K)\7mjS=XqXK5dO2&e50h!O+H;/mqq]AR3 +63Q,kL.Hh\rN._5Wt:;/[$1GUpL35Z@JT))DninYDO"X("n9^G%S"P:t:f<[T.5q?n&]AS$h* +(>Mp\hmrKb`HJis^eu14&&WNVU]Ap,JS^frHC/VVND@R+B+*NAhH!s'f;St#$]Ai@ +FpnP.h,V1tfD.`8Tb&:8(/oo++A4Uc''5b@>f0f1tl*kmhFu2"^'SG<=ZL.,*lBMgB:W5S?Cp/NcW7p$ocJ"Rr,g8p+R3'V +SYHLU6kb?Ef,$Q_p,2V]AsCQ/:rS$f>"`cp";OKsPfdS^*tc99cX[k$l$SF\$Q-"UpJf?gq'AD1 +,8aF78O,IC9sFEDWUT4a/q*6eX@Z?:9i@9AO%s!!p'4!1EYWN_k5n)$@Sj'l?MM]Ab[9H+ZW! +76&+*L07,ZcpY&`@M`ln9saSuS&k6@7#%]A+ +s:t`_DFaukPDi#,']A;12b?#E;.90WV-aN:Ne4/J:1meV(0N?#u*<_1*L?XibC2%M,sL(]APZl!7,Gk#B??Z%YpaIM7q7G%rWE16t +fk#V]AIXT,O_seW&l_J<$TUH1#2/upYk0==#Rqa6A/Y(7Y_8YZ[?W9 +0tSf+V5?`9>F>Jp?,SQArAN[[(@lWqY=oTtMumpfB2-(GB-q\1>25+gUf@%GdeL'8DhnLQ7n6mnf_Gh,Uf2Q*1gF>BH'p,P< +p4;EEa(DM&UZ-AZUTQcWdng4,5+X\6Sq1$,jLH":F&eH5Wqr./]AVjq#0dYit> +R@Tmu#fN?O)AJJU)'(LK--_g9BtD)[(SsVK,OVb((93/Nfr+Hnortl,5u7+,4YoGp)@;e$qW +[4<,_G+^6GV`c,aD-TI)q*Zs5DS^(DO%]ArlN,.-]AOl.Io4/nk"Pf$$Y3UcoKtSH1sn^KJf=+ +!\CR!QLZVV\`MKC;.tDs!cudan2paV^"cfi2I5p7C*d!`#L%M)>P6tcF6g#!S6e:>%`2++of +,]A6dHkM.$*FT,Z'(NtU./f+G=6FIQd,Qe@j_hss=1t!R1HAP-mZE70 +9S0d%Us6cN]As&ZneJR*ai8dC^A8VW+.D$lC%8nF+<0^:s=D,D+A>/+J`G*\6V-2NJs;OEL8L +n^kQ'PbfF+R:ab*N.(Qp8HVGRNg=$O>W%#QP$sJCEPb#a0M\2DSP2dajWk<"mcs(H\Y/ol2d +0Kk<`m)N29Fn!E&?_=.Ngj`kM:mbPkF'%*n^ii#bMSuicb8/6[tiF`n"sTnK+5I:2'GuCKk$ +&$hJi.AQ\5GaFP,5ad%$O)!6mf+C9=jD8NnL.HKB-3,_hm]AY>mhPIn'1""#B?O,f@A8#LfJ- +bReJ!q\VBVdibJ7n'O92h?nU'>knr_\aZ#/H=;8RJYsJ&(m^[9UFNI0p^bs8Y5H;+[.@\WnE +kTfcO(jr.QKOCgm!PW>*G\WZec@kt(B+,%`sbM/%2JCb/8nmfGN(=,2-J;5%'dH$]AdBS3C!]A +b\B(I)]AK_&lrb1>$IG.:O>g>f=%r@l#2d=_I5dUimp[gF78HX`aQcir@eN[H?_5I52eBF.q* +0<*poM.4o(3/L0He/CHO2d)quA:;O'[4=*kE!Y[cs5<39DN(=eJ%hmU%s*<%@uG@JXJd@g-U +U9G^-a:HI:a^9j<=OHP-gRDBDG3L>hU0hH-OIcBu1L*Fk.m#k@S=8^oN='EN]A)&iKjLKpAS" +pSP8%KD'h1\g4?UiPC'5MH!nfQHQUf#I_r/DNQ!W*UhmT6[P^ih#'M82dqJ8Q-Rs5l.6Yag> +%W#\eneLW2Mi/embiMSRRj,ho0+e1V8@Z`:=:m3Y"+:+Ei>%j.fE8!::BJ@Jpr,$oT&9ZEce +2tMfu2o]A!1k\?/eSSLC_Xbg1*s)f>^4JFSBPq?,$VO_9P#oUA8bX`(R92?c!;E(-Q$4+.'74 +e[HF(52UZiRfiPLbOSm.>A_p528#l*ba>SnnkEd5uN9GBVsn?1/=WLPCPZ,7`Mr0mB-"+*NT +k[NfU*D.be$_5X5"12FJ)Yg&M*9"W)%f?O]A/XEQ2[_?>-7:CU +)U,]AY/pirPI'b9!W0'h:%FGLY'#YH*r[R6Y,HC09L`@KZ>p3F8aI#Z^??5^==9fJ5;ia^Lp+J$Ni2jsIOj!a1PUld8p%c$=jRFn-7ai`b%>Y40X +Pk*^OE^nXRtsCP8IDOM=aqTKha?'i9Lor<%k@`CE>\2E?SCE,(:tkFab8]APCOML$G\PD +-,(iVlOrcd/7Lhqh5tg)m'#=RuoCsY;s0!@8?q[Z:!hDROX(2$b;2G0Y*eNUD6t\Q)nlnpi3 +fuh1k1C1^>%$;RQfh[9eFt?S@-cplg4\jDN?BYpPZQ'p%&/G&(_uH1`JQe351.@:;I(,64DV +ol@JYX>Aoq&e&.9:P,XOEWVD8@-0aeB',d!M52> +gnS+&`_M6]A$E0-\5ZQ_Ma#;L?@^I,XSF!ZoZst&g]AB\A>Z6%QYVVB?H5o\(ru;jW;`67R"Cc +kjQ#Z^?MP@B/#q`Ypk0B(Pcdn08>p7O;;YQj/ad3&<<)kP'6K'/kX1^7KPl!Gj%P$8e-=?H0 ++P\f8%0d$\Y[WQ0h,'.4ZEc2_*0CR)gc)Ef%Sh'lNWZCnmAlYK)59tS\Vng*3lRe')CCX&WH +uH.0I$lmrNUUlB(Tr7'2CDCB6K?hH_/FO":54F0AuR4Q`d&nG-IlFI]A(nR?3N'^dWV;on,O8 +K>C,@IKGV==fNj&!Pt!4,P`.jqGk,u&W%g<:&a&,Dja8ck*q3s6T(XTEoZ''hX6kiXN?UeH. +JeY:c5RbL^m[X5W"\Wj@r-9!X)i`K8,PENr%EQW +3_FC.:VaIisA2_)'Q\UIFU=MP"B*eS82Y9:2Vt&W%9p-1f?/iQEeo['LD,H44_i*'hB/U_)4 +Y=N?=[^;gVbW$N/W]AP-f91tWVM`*:[Ckj?Fn#,i#!^ZU<\'i*i +[8+E09!JW"WZhQsVSr@(Go^WabaT;`=EQrBJN=WB\6mBY\1]Ada$naMH;%pqZ*?,hU/%U0g). +4k13O*<_iF)"a.XZB_Ojj@c)r\Q[!o\,X+:ON`sJg&K2ROLrLi;l7PD^:T;oo.#(Vr:bVt!j +g$A2dunQ0`-+sM'NCi7^Se#bCUY.BRs4,?\jGjL%)F1X\Sa&]A/aa9o))Q59bVeO.p?g*-hj6 +?*Z>&;53"QLg?77Ac.JLp2BhTO66A_V+KqCQ"a4]AoinoAftnoKA9,R\l_iekcjrnm$5D86]A$ +`hPOcG]AJ95Y)W`mVLeO1mFG5+tooSU&N'_Q;UCYVG\I(Z4CMAMP),3 +?FcfnHiug"H/cHko7pF0Y*#[+1D*PhK%cF/s/E$.FgOUhSd+BSD1;22M#pQ[:#R]A8ADXJ=L#uKt@A_MM[ +0/8Tr%o=>@fs"!aA_dq.r?9GkBri!"919Q)L_OZ0?/;cL?0Yu??YnX3MJK]AsY'dmV1Mp=-Xon^mO47jV%9$K@JplKB +K:Ak%2q2Jjh3]A=TQkg0F=@`8O&H$S#r+Z_]A2WB*F%43MQann:$9V:7rKJF]A=aF&]A +S1fg3K)4ck5#UNi6S`:J`jd,Rq!1hiOqAWMjLXh%U.Gq\>Cc\P7(JMY#mS8"NW2:Bm`Z]A5cF +?c6p-XEp494C.FPYPaq+5hmW!"JQblTLI$mf8[I_e?Pgq(:s(A]A\1$P1#b<-XVP^5;2j@f^@ +j*2^.%#n,86^N@M'@e')/E4K4+*6)#D^TC6.n`_bt57<8 +A9=a[iJD`[O?Ti:t2&?"l2>[66(okPl$Ph3ImAUSkpn'?fZ:Lk)>"X?.ELDRcA#(1gIh4T(G +/)8J)b)0g#/1;p&&BELkQqWt8]AQ(UX6m/IuS"*!!(ZAD'?Ci,L&9&s(9`0&2Zo`*]A#7SJhrmjH)Dm'DJB?Q`Mnd?dHnGodq_,NQ0V'OXhIK$B!4HoiC.HC +Y,^Hj_I>a)E27!h'^*KV4bL +s(bjK6YeDofH%dc@WBnrDe'.s"#m\hnIbaIcnBn]A'EnD;a-m?=83t>jdpsqQC.g4E,ltj):Q +VMH`T>q5iaBf*lPqpj9J+]A#/;4!#rHY%`&lGS.XmfnS>7r&nF/kHX/oE:(bR6i8.!WMr!]AcCCMOks.#T>e2,da1LuER=LmB^r5 +W%hEl9U:uS!0&"qi<_Ffe6^H9]Ad2MfdZlrX+-:.(YY'B=PQ>U\8'=f>A2nrG<+ZJ=D)%(lMW +bDKnO-93_4NPq/aHd43P7Kge@t5n-t>=VcPUrZcC4,R0g#d\_RDA(UCm5CRWY`rXmD\"J%^m +CdR3]A(;@ac_"+A-/eoe"nKY"KQkX.J)o'b'C*nBZNL&,C!eWE1=P5e[b)LuJ8DQ8/"sLPUEW +:-o-Kq#42`?c!3=lglb0FBM$XCJHY;LGV?Ti:sj9*e@4Ti2-p@=Hs20/T:YF>KO->o#qS%P: +2c_^]ArlntomNtrn:&>O\5NW%q+drNH;SO##'I5EQNpt,S1 +,GPai(9Hh*Y8?JC)<$m->C&#RZ+=PXU*V=8N%qu1B+Rtp#.PksT;HV@?eV9^-EJm)U?Ug0hY +3]AiD/:L%&HsUR#R+2to\bkl67ZR1g#%0-u]A14rOJjO(I/2pbFh\5^E"SQBjoS=HiEc]A6G??9 +Q:-hJrFbK[Ru(&UVp8D)t)FOU]AlcINDJ%M]AT7@=k#(aiEH,uLb,o.Gqm[ +n8*pL:2Hd9DMpNn&E=3!g.dB+mQgbR=Po_"LK +Z&=e^T_62nJ+.0;gk^:N*&%tbm@\ub'`;Q:)i6?&L2CerQcA+UFJs2'Yh_9eQUIN(_o+;,al +u[ibkfIqP[K0Xa0d5X?Kh"D!f1X<01n/X^*a>mR\1%d0B^shVgLpR9BTtC +1t-oFa$rI/R!XEo^3J:@WeefSdI'0e:p(6H81!W5N8S@+'_DWZV!ZENPkmCi4,Co\W44XZ +:%`!5t3&LCsS!eTT.7K7edu&lLee6gAm_+JOBUJA\1'+D$[lOqgKWIJs-Dq-+DcpMk[f9fdN +@22BsMn+S*q$?]AsP7>dS@6VjmBqr97''l]AVXaV+"_*nZX$jQsG%9j+GiUpK?%CYh-h0>+t)@ +K/\Y+[SI\J[FOb)\^n(Ohq6&rf0'-N(^+Oe^T(R[ELc/B]AeiQl`u?_TMdO,bn\$"ZVKAthPq +.!FmJU@g!]A4g/iqn`hFn<"eu6grkKD77T#GQu;:d*KY'rpj7_`lDX]ALJ\T$9ULk[L^&I)`]AL +FW^U0Oh2`/kQrfIN/%9p[QKNlZD?i--;)f_`ktaST]A!L>pII]AsQ""rYikH9W.Vap +`\5qWW6FLFOtW>XPlR-6s5rVLflA@X/Ue%*q5X%/4G6W,Cc'R_2aJ&2Zaa-,2?mBg!0A(G/@ +]A3%!(4D\kXMJR3h7Yd%N;Up2i1qjP!/f/hFh%onAdW5=d;a&gQme+,Rs1R"cer.]Ap3sGJ%/H +:15H1Qd^LuBc\%(9kJ?H;(EP[f7*7s&ip+O:iC#'3W'S&nEeM'2&6X.:?'@ll3PlYTUV^5;j +0]AY(nXCB,FY:1/^YpQ48`I*Hh>BD^/+Jom8>D'LOsSu9qDW$"r@sbJ +1[hq^0#\F-*]A+/(J-tgqe^hVE=]AFA)+Ei40o4H[TqRZ,;jJ#ck8mfHM/OH';bqasC1t.AK2+ +u9X=fEFDlTbgXf>Q1lA=G-peTnpkoY4QHV2ii[7nm>Y)^KO<#j"p\G+PI,rKOPNml$V'[(k+nbZIMM.!H5FIF&'sUS0r?0:?%:GN^?WXD9a)OG\Mo4Bj#7 +*0@R[a3F0)c/QHR$:(qjVaMMPZgkn:b2m]A-.d"1=rMamlAe$NGC[D,GpfZYcDTJk+F#eTfG1Hq7"^I>:APLfmHcl.2u1QG%Z+bN) +RL%J^Yk\nj)s303,nj5]AI7+'98RlT=>ld/OjmLg#uai(($L;<YJ)K++XN(=3T +cmGaoIOtb:G-HMGTh;aY>\16k^=nkOA7(GP/a=F6(um,u6T-aEcZCYbmhEgOcNU4ITTPbetG5jQ0B4 +]At']A_/_P?R6POn0^Kll6$XYN8Tcu`Bm%QLuL5s^riKEB(cke?ALthKIn<$F>L3.G0)gBbFRs +cF/QDf-dN_^:#nI)#Js-(FfPYL-.-ldMG"'MY#5\@rl7Fj[%W#c<,2RXTFUnMK_pNq1`+*k&sQV"n5;[H.==pXT3W#d81""o$$N0o[Fnq +;#nnO2P7dc,#%I?sOIqO^e]A<6,/"M-Xu8nBlAO;GHoMN4E(5]Ae&;G-g8mQkP6G$M;X;(nP5S +B'QggMmkm_1(6``!g.baKTi.eTpH0Vg<5m\,J8P`-S#)]AECG*4=!"0V +95L/MnV)[NVWm:C0t\n+e>BRp?lu")W5N%YCMR6/*hH+F$8'po!jujQ]A2S\&mfE-mK5BeNk. +=`To6m*n`Po9"Q]AHE;H/>o/73Ar6!7EAR'+;>7q2h'#iPKXt?=jIBl[2]A/"hVX"9s;[5J,am +VD?-83f*dR:/QBla_s1K+==@cTaVd=)!9Y.WOJU2tq0F5W@oogUFA_lWmJk]AD3Y8mkP +PpTQ.!Tg.N4%nmNq_B'K@\/+2+#D;Z5R)@oQq]ARNud6pf:_N,H%J=8i]AdC`#BgX&!C[l&^Y+ +"uP2(%j3/iNL2K*)a%hrrd%jD`TNlG>>[H#pKP!+pcGY2o#?0/SaL=)pl0CX:b4&G,O99(h, +sM6g0.Xc&OEdVPd7=A695;`qQ&oI$k,u3Rj=XR"Np)YLT;i!YSdbhjJZICElO/Tiq>lCp$Z^ +s*$0-gdj(<#O;VcHC>_=qL9IYL"+Sh?`t6iQ,j68[9gkbkN]Ac4L8W`.IF,TZ\Y(gE5a#hVc( +,tjAhfEmE2kA/qLG;Iu:\,b7#CUfd?7G_q<)Hub;+KO8oK7Z\]A;:djeJI=4q4;+))\kdC@2G +0I-)H%\J`#=GhVcqga:R7V4#P`TJr_)W?:Qo1%dqL?PS +qaa(Q67rW%MPM)Z1DG7q(UBg'0VXpe]A7gD&1jLb9^Z>G?ip`qc-o9OCe1[WJV1`K_El.P\$\ +M&+37HH_l9p+,A`Xjhi`=M?epS`GU%2FrcLDMkS+o1L8F?K#c'I\)7*!m14uRoJ%5"Y1<_&Z +m]A_7kFh)LI(V)cIM(5o,%oWf>PTqk_@M%Lb>=H@O'&%+0!0_b]AUe7VX94A8&DAE^]A.Tu*khj +Gp'5`"OfTjLE,,,6ds@^u99?"'=d3bT,>Zm.]AWiG6YDV5'1i%M*DJj@ll,eb^mHkL\e2>WeX +P1\@SG'8jNmHUsrBi,iNKES+aEVU0,mZ18$j<(Ck&fo>+Rr,$PXaDOfXU"7h#jgI]A%/77SRilI? +N]A#jt0"E-L=4Ba'ZkAtNr3G=`s?F%a+%'Ri!PFA*#>*^1=n"R"5sb=1AHmN +^K8r+r8;Vd#l_ej1q%LUK,Eog3Gpn">fuu`j%,h4MPAOWG([odP(8H@"p+PMf)tIh+#ff9>d +n_1i3keF5dYu=[oRo:3RbK;*h*TrR__V(O+J!g&3s:8h/dC?BQX-a$D#iZ5/:&-&DMaH8\DF +Jn+.!rJSP."4gaC7l$QCH+3U/\CH:$Qa_4-FShp]A>63*gMjQ0;rRSt!;OqjWne9)uWOPhDrT +=.1f@L\sB&0D%N\mNQ_nAL90kruH +%6c"8M*nim0+n3SdWfQnfddPgFHp(DDc\k"_JM+W_7G#Th+%@BGdj$1T'Ha9:PEK`%QD_m)8 +=ca2#KKI%j2>1l^BN[B>&to[9a#FI[CaM4K8uWl8n4r(N_-2QPlO!F'X&R>>X..3C+OZK'Sp +grTDR(LL(_=O5&*AON0tZ*+cYcmn]A*ot2bOKI^A/]A_8fb]A\aXPV\ac_^<#ihBGLYXd%EAh5; +X1'AM2u>qaW^,o>((GrT)ZrY9@&?KllCcV(n#;@Yj^u!Q/kf1[.#a%U(pg>AGd`[iEFW;n.. +Mg!GOJ5K(nh.+"i:q!fK89emMT8'Fq6-B:V[Z/R5VIWeGM7mW1&e+*bSa`k!)3@HdDn@I`/Y +5lS%9lf]A?%L63TH#-IXlE6"Nu=,,UPZ@_Df@]Ac6pc2/>UO*;95_X+Y4kWLu_`SL@;$38[oJE +`5\,9pZI+-'GIMeH9eqO=^a`h1)riL2\FY1D`2'T!a`b2\j+uV]AP5a^[LLSqqfsUK^g+nmfe +CX9(sbH[k.a^N*r:/g1`[WZbr.#).8]A)>jf%!-P9;T@]AGHm49Yf26VhAai[FHkG$G66iR.Np!Ni^C:qI+@CZIC&i;GhkbQEe +5\=XNcZ\2tdH;=b^'Kg?IOVN1,BDhM[.*YW>jK*bG(!/2=ie=*Zm@V'GT7LBM*e'\Q3B-c(S +2:[Kj?&T9+,]Atm*2qKleT4HWIO*J3Dc4_De.mLK8#FTtd25>\7GgHgoV(d!le%-8#eX8K"/gF?9.kRdd ++iqBqd(Bt9B2f8h'tmRN&c:2#2CRGdbeBbn:BZ- +A@'"5r!bHi&(>Z%?]ALn.ScU(_Ul^=@:JA'1r9g=@,;;b`TmR_8[E$>.>e4)IJ,]AA&Q2Qnp/F +QF&VX^rJGJh\%UhmHUd/DKFc.W^XNKVg(gCUg3L2Ed?T+=+2nnl1FD0WtS<8sQD8U!,gPQio +YFk(\K%h3o99+-0\p6"/3SGfX_7fSE31#I;5l\ed=h$_pP@:m:S0k2Fe/15#rKP*i#ak7&3? +;!*%U>)E-fp/?%:b]ALn,5X#,q^X%\6W'k:/<$%#7dW,]A]AgCYX3-#A]Aa.VD(I.4@1k2tJlep;L:9Wo2VFTaN/To5AL--DXD +Q&f)&L">0uWfr?aQ$Fq:(CY4S;U7@G8s1m'niPnE0S9El1%kI +Lqt:*"ofTUIZG[`i7N&%p;OO6>5K-R5c`9XOchrd8;!m9\@u68J]AnQ@Sr-XF>UDh5d3k>.B. +3gs[ACZ-i$4_757ccrm`.ahN5SlsAk,6N&=4JXnaWTY]A81EinIa!WiD>[?`Wd591Ve!KPKeTpln9\=(D_1\8!Ra +I>!m7V+s]A]AjNV&PSL(6JFFf)[Y41.\rlms<%$DKA,ak\EKnZ-um]AP&o+ZiMfI9I7u!uO+OlC +P_=cbB1-H_G-g$!h)=p?]A/B\-dg;#JpV7#p!";/p&P`q4M$EOb/_!/_-)2\Qu*%IG`p.+WU_ +7;4_3<)^m1H):@>N3VZ\=2Y3-SV"[a+V8H!<-*k/1Y?nmLm:(/Z:he-rrj,0*dQ.bej91Mup +mLjOLU*(d]A%(Z(.Vcmm+Yl\kIK7eeE.,X[,Y[fCHi@H"%B]A +kUfL?Fm&AP^r()J&'"Bcr_di'7/B/NRt!s!ob:BX-ZEge'5.Zga-r98()fhgZb5=Yg,`5\[6+088[b8@47jTla,akW+gG=>0]A2Zpo&;$K,^cC +!X#VZ#NBQXhFK!6N/U2QO.$If(c-s^oQa5V^/tR_TZaZp%$]AKJ-06-gcka(g9"d^*$en5a8- +/$U%YSqgBr<"S2@YN=&(Z+$>4&,/%Phr9rQ,p1k1I;rfE9.[b/:) +\P?5>EM">u%,:r-Hn)(m"CsHfG:J&*K2nTO_N><)Bol,&h7)c?N4CR]A-<&T=KlB?cd?'b8/Nq+G&/p:5:U/t,uhE=ap1>Ab +2:[ORMKF]A]API(7raN]ANKr(2of+ODp[958kH8u#$d.3$O?kMbVb>U4n3/2pCW:8@:?4JkW;tZ +)guUBk712j4Oc%HSC61QM`'AiBOgg(X]AZ#-%cUr-Rkkts4/@t\e=a38q!(D8qQ#ds+cj^B>V +-NbXiNC[hm0<=Z[OO_U(61^lReRh'rnit]AtH>slVI.0@25&mD>XLBl'A'o%JNeEa<^ONYp^.GF +eDJ\mL\S,)P^^f0HTMBU'QP9S\n@T1H7NZU]AjoiBbK/pG]Ajn0+R9T'VYd!UX(5r,%;]AmC%s2 +]Aa[_qG4Pfd[RtMM66C+'JG1oLTmH8P;Vqo#p[m4B$^I\NBF]A-7HXg7TZA2`tfMackG++^?%r +2OksiH@P8Gf2T=ON>GUoMhWf[JrQ3j6f7RER$8l(q4-I?Y<^M$4EZi%l+.qGMT8`M`ZL[SDn +$8qfEYgEP'RkUUIlIoPB^qiC1M"pN\Xkfi-5Om^6-49 +lOam6,KFV`5<_dQ)hW+38p!jNUcr(ZG"`:,aRQ/Obo86 +[[1K]A7h(.68KFjON=85?*Ed7+G'"`pj)NKJ.k#g4>,]AYG]A8I`9C0=fMh=qgjZ+75lT+\0%r*&galB_!1"#`NaTn+hp^&<[9#]Alo*\44Sd09$c#V]A/!^jf$(Tm+_*c95Qe_U2W01 +"Q%H7\1tG9ZMp'55A\#DV-o!:qoug%#-[""pl#/-@q:Ke&3-a71;JXCf463`iIMJ1O6AbTb2 +s.#n9>Bf/(USrNP(V+SV2"*]A_>/"R=3(CIg20]AZ_GDXFko9A#p +o2Cd5*9&\$,cZ.s7`Wbqjig7D/1_Luh]A9?@f:n:7k<"JuiFScE_/6@_gEFp]AcTpG(/Kt6KhL +^?2Hh?GY&%)*q@>JbNRm)>apI"$0Dhu$W.isM^^Q +DFaIoi*L^"VC(('TqP:q?R!*+pZ2&5\A_\-'1GWJ5;?+qj7)Fu*"S"o'j>V=oO+(mlX19^E8 +`%1`)F;#1,uWM'%1cNQXX/Npm^M@#oT--b@eD@(Va6^V(#@^%iW27E:Y6%CE?`GRZ`:#J!Ep)8g+hQ`V=C`8E58ZBFd +DY.1ikYNhgZ:1/u^[CLVd5&&YYHF1E8DHLNbt!eZZHoP^@#/<@0LgR=iQ1ijF5h'MMjotT&G +od\0Icg3daFH#>DQ-]AVIdj-j"H&?M[q`;gH;&l(MI]A"ORo-Z?ZL4IG^jUdm%":Z><]AG=-jS^ +kGoBlp<]ADW]A(,R'EIH\T[kW*&a.#"J`4hiGLjkr"r?nA#M-9&e/T2l]ADtJpr(T$#_1"g5L1V +IdCesKh#'$mA^,&^+IYEg8_@iV@!(R&%8)rd,A.4$nr[aS*STF!%2J#Q9/IFdep3?fmMor^B +?dsO*hdG3Y'Vk[0.m7HQaN/X1,[V"&X[\&"2[P.I=)B9`5'H#Inq^qa)V?$+uI'i;t+@I2tc +Z-,Ja,Yr:$O[?>09+*LT:K&qY(rjh&g6P]AcOH5K+@f1nX^^_TF]AD3OhmU>QdbAU +fgr&$:R>/*QlN&D=W?n/'kqiG_O#P3`J,,^;kq-']A'/Qd?iYn$Mj1"hO$6K-'PMl9sbbZ@s7Z>.W5id<;WcL- +>QEM3C@!;SL?o)laBN8&t&l6I!\.>g\J*[:D!I&orTfcpfm@qf2:a;ao:G8o(,_(YpZ"']A0V +S_^qT7tT]A$K8[7SPj6[VYog%m1agL"c]A;E4R\`rpK:uS,\mH$hjln.6[4nLWW^L:WmdU]ALY3CA@6lQdDA@(L0+g(Ckc0q62P_.LdT?So>L,"ju +EN?bg'B>q]A3EB>K\rT9lHit"?iVG;$cen9PFlKgD8`F5;ph!Ma3?.t+fK'=8]AqIN.Bl%Um79 +Tg[AV7HD$2OrP4YA?>@5`I,LPLYc7GEo8KkYQB%Sfb.D(In&B58UJ4#*LTZS/U:$E*fJ5C4l +IG2QiW08K3.21,B6#^tn@2"dl!#V7`?P6n9I +MuEp>9P?.#nq-/ai4-`r9qtC.-Ke?3'\L=aURq9ZGp=Adeh6*a-p*T4mZeBJ`ri;0YZ4B'IW +Cb.-Vd1>/%/8Uibj-gX1+=e.0.]A5"YV/mpEF5.b,.Nq1q#KVl4uiCMQ[^H[4L+;6EJ7,bdp1`*/qm-Q+s]A4H[W2 +B*s!^UM4La_0gg.]A;,o_c%dN71A2T78Z7bbBc>RVObIQ=C(.q9*;%)!7m5WdT^pF)-3-H-<8SpD6.HXV#=#E&m'-!]A"LY'J'V67J +pU-E'V'Q$6`l836oo?\HN20u#Q*Q\cJ$C"u:]Ak67>6I_f6(ssae(iHkZp/fonDAkR"D)6DP+ +$05iFFVs_5^:>RHF_-`XCprCuKaK.l/Xqf0Pp>V=Nn,C*;.c?TB^2=@Km6n>EOMad00Zr(ro +(5L)`Ya.)'JEj!B28'\M7e?hL6Af<_3U1s9&Y,eT253]A9)FSWJU(A[q_9-gd>guH=:kjRud7 +qa_?[M;3u(n(><9^mOm@Y>5.?pe!O@cK[jp;3>t[URc@5 +*Yakte<:B:T&r+qbB"u=m`P('E1Hh;Yl-qc*638Qs)\IcMXUA9dL$bY:[?E=[>U57oPIepFO +\TtXZ0'QU8j+0)eR'3k1T8n-"6GpKK]Ao_`g_rWfOSe[.^qK8tiLTnh$SaU&D$R\`R):Z.'[F +LR)pEWI#s$o!nU,_`rG\LsZQ'up;H0,l+>))!imIpn1CIp7$D0@=4ilFGsnMh/Ch2NKFL5+0 +2J8)B(6^W$71GimVIufi-_rcV`FWDVt/"j$WP^-NApU7c5]A&-<6Z<=5\GnAY5APch:AC]As1>nt_Bd +_R^f>1WcehT]AlR2gFoTa:Hl>R&G!DauKO8M2LMFpLAAX@beV]A\Vp+Rr,pgbR44mO;fNdjN"\ +VQs]A$?nKUJ2X<4(Do:uBf8AsL"?F5e&$ZJ#JQHpMI920Z2iR/:+LS!sNH+O@n]AC[>494ES2K +N?+1FW8-N1mDqL%c-KT#$/`j2MQ3E*? +#p%YJAh=.Y1*.V)6GfZ/GV5%i;#rOY#s2 +85hC8QK86@"JWkm'epD3K/IVI,5g.^?D8Y+!38_+XdbWt:F]A?37Gt=6-alrZhF=@,^8#kU:j +Q!8GUFT[$n_5s'.]A$_,2*ol&O)YLCsI3nd9_g1*9(]Aq57Xlm5%F14-&%E%uVZXo6b)%h85F4 +"h:I0(iMQpi-;1Ue*i=lrFNg9Le]Au;`Oer2Na,>&LKNfJ2nd:-"'60NZ_cG9UkG_UJQ:fI'U +u7b(`NdlTQ$@f?tS/-3-5h[/%gBU!A=B0Dlu6'HfSUS4!dS1Zhn3LP@NBSCJM/^n(.Yn?]A/A +W0%"pp`#9ZiH+@1;$8QJlo2]A?=8;M]AK3#:f<'1.f"O4oO/X1$Z=Dbm7SKdoaqC>'Q5jh\R1L +eBp+ +U*k@]A1nn^^UGPVD\YH5KBpL6dsP*ff"[?P'TJB?PLG'oYIKBF3]AQ$S=C`5HRRmo(7r16[dAV +DYX_flX`qi@RlKo7J-g\?rc3M--DZ*lhmeKF%UX#*a!YYXSY(@mB5>V*f*lo"6lLCXs7-T#c +hpdJRePpMqjmHYnH278+m*;;>$o +t[hgb+'TQ6lEUc7P3YW4Dm"(:o?9>E/To/>3bgtLGQ+D*>2h3G!A4A,'^u+Qki#VBrE"8e+/ +\)8_Vn=:LNAiLC/e7bSo!W[U&C8r@.D*%fQAqISI!Urg]AZ7Cg1,q87^:nHd-bdM=2O7^)uqEME-!/H=SqQU:Fpl#;.-GNI +E/3Oi?1K"ZpS^C9FJ5L:*Mlp4Z%-(Di2qEqm'HgmT5Z^^kSM-eGW.JWA&g="h-WREk6gm\a+ +oF(8/:lrZ?(Nbp$cJsRcrlgi1^bY&260PaI6bu +FHG'C3e@kBLes*3`7npORmEF=+,2;h<9Lu5cHb/N=5l6N:Q[hX8^Nb#I.JQD=8=XI4f]An:\]AVSmj96`lMcHnl-euo>3*E0//p6oY6*MWp<=NW)6loYH.(GKtr\eC +5Q1KV&E!`UE=a!iIPFKhRaPG>=o/5YP%9'Ed_/QOo[hb^PQjQ<@E<\r1`c"nR[5 +*;_s`CLF=bh`jTgMSuSm'GM8Q7-mO?gf4,cr`GV0&(.IaU/F<"`N4c(^%crFr_n"`D%5%Y#]A +H)`Gu>**(iO',IbYI&8`+K[n/HoDCeMkjo@fCs(1&:_aDdu@kC\O#%oYMHTY]AtH8l`WT.6[% +G^P@Vk[#u&JFmL9QIK$6N0USo[`4ks*URk%a:X9-\S<'mT_]AdoTG6'bAk%]A?IF=M`fD=)K!Q +S/Je[_kpIFC/.i]A6>EJnJ,-/,9&5EPB:Dm" +77q!>XX.ldRN@\]A3DQZB;G<"m=A88#S8e&JLK^/gZjkl\Lk0&f%o`\bHG@tABZBE +,9tZ[C21Nu@oN/=YLCk.GRBg/*?H(8q.+JpKcRkY>>Xcc=A?.gQ@>C[XhLrXgY(@@?NrD3Sj +G+B^e*jO;FQre$Vt2g@NRpu5>*s6lm",YGA!^A"2o-8rpjKZb:e,5ln(0DRtd2\A%">SP:Lj +DSb(\>Gsk+Y/Z`)mb)Vk1k%@n)IFin]AdE0p>o\uNj@@,.M^28G;['E_/tk(:@_7s(3 +Z*_Hae[^;qrNV;N#Fo`=[_5Q#MgJL0_8"E11KjJ:E`M6tVY;T:';4G9rh$!E>rg+]A]A +>L)BUpGSLI4?)"#"6PJ%ifHJO)Kjn/3;CRLgM)7GKM.U@UgG5nKpRd6j6l87,!4eKB=O/9uO@,n=N4&MUM7)dG)T'smKLXf+gR.;QZhKpjNLoMR^VM?^;B/UIZZ5;1<& +Qqbh+g9mn9t6l[C!?L-2@?0CGEAf?GLmGmh#QB5,oPuHF_ah;(;dp34ZRWa57<)3DT_pc+!O +`:E1'7Xn$D8/CqD>X^$5-h<5Pm +)t_Kir?PC5;BgRf>E#\iU:-G$LZZUXFDjs\E+:-m2JPsGC0=CB&"TSlfU'[".fL]A'nu@-eNIV`-Rn,E5Ka\0E&@qLgkgFCs;eJ<9N4i<8V]Ar0AS#/YS-NM +G;mmX);k!,,&i9T]A6g[2cm>.[`ZjZT7D^@*R%27=]AO(@"S,%PE,)2Q)k5m&>q3PTJ^&h9_B3 +-n9QVuK0Ddd*cCb.c#Jha5-J:23EcqI,,Q4oH+/gB)+TC:rLg]A9((Pa"opo)0.WbgWp03M2h +3Ukf$(.XZEc=%o]Ai/QCKA,0#=')+0+jU_Wpog'`PLs +C.5PpY_h#_JTdbW`mfsJm*.2mAVEO@1E:F!$lPI5>IIQ*2SMCdl/Mn*RA*S8;YI +`UNfTFsJ&*IR(`*V&rTGNL'ZctdE4_Rg%6&3C+%5s&c5j#5+Eg_,RM7,jJ)plk;Za<9N[nAn +J@$7Kei#W(/;-7PG'9_J/uh`"4XQde,#WkhUS3asBXGuQu'$:/PmK35j4-A/K(kbaJLYH)A' +A=?R]AF<-mMAJF=JXg)_+0uEi+3_J2Ga@YS2OqbCRAklf>aQBj#O\4fkE'QiaFGs(ch"&K]A1r192*X"]AsNU6bIU'.NG4I))H97q^'Y#iD1E>&S_ +-DEHPo5'tANX":VuEH,^P`RgaTFh;u9Lb7E+]A(_gPZOT`%;/s=m//2+2fViWB9c9FiRH[MJO +.KehZWHZ>iRdW@%%-?N(u)aRlW@CsV"ge_j\Hm=O5-e,4r9 +/^I3#&$t0h3EC9Hk.KUN=7(?ek4a5H,8:&4+KHdNoIL[]AFUh4s&jFam,&>h8$?bJT)G'rug\PYsET&obM +S@:?hF-4_1]A!^to5;88i0juP$cJ&d"o@KJM)F^.TWZDq6Z!bU2FYJ(1b-CYMI(WM5ue&TS`Y +mnutUiqfXN_36R"db2Imf@seFC-cUTO`NK:R;#C3X8\QGTerR1/)"N=ZQ8c&cjB6&)c/"Wli +JS5IoF;.tr?4(]Ar#lN!/Y_^iZN,$CD^a$QC``pT:F'Wnjs +j=``AXtFiikRglKCN'I)C6_[!S_T3lVQ_rm_e\X24---U)Q&1#6.)E\$sBdl\D7&M +_S*1]AF":ZNQ.Q)Mo#JZ?C>$V&3k=5[7QaC4b=&[!U<638Q1?E$]AYMek@u8,EK,1]As.i'" +NFl#t=iJG(cj"C^$$47-4[Y6n=?NM*1,UpHUiHBHClFMHi%0N-G$nIUo:P't>L)ho"[+V(( +Qt=^*[427M(ElT)DVkc'!DamnoA40l..EMOTb+aiSoku9+E)!fZF5(oN[/O_p]AgqKn^SbsS6KZU3='TSk;pJa:G)&lAM+#e; +DQ``m/OK+R!fdJ=!3V9EV7nXZeaZ&\\;Ln4VKnEIj74:fb6n[CAn-kE +bN%m,;5obUTFTnGj`)n3399gPG.iKCo4b)Ug(UQ!fhr;]A=',>1P`?>:ccY.[^Zc5aQ7#9$Pj +BM@k+#bH0_3"+VA`0KdK:a0H8RKNk&n\rpin+_@,f1W:6;K;l!qEcOWp>P>2CK5bEBmsUOEL +6.nSCMhB)LlNI>!Wa3UB7GCtK"Q$EU2Sp;4/RDORn=-AIU3^*Uh$K:R3#fM`'0"e>&5ZVuFl +IYeapP%a`Qf\ipa-_E`))ug%LHBJhR_;duVl,;QP(A-eF;Zc'OP6d_)[32=21^J-m(jo.^:l +RpItXYl'4EaXP#$WZ(AZn)#]Ai"+7+`D#FFr1^RfNXB;[tqGR7``#.0-'er0;1lnoWN[;1b[e +,<5OerEin6'kEMqETe44=!DQo;+7je2I_QcBj]AMu[Ro?:L@EjEroi>%j:o&/AZo@Q5:5OS!a +2\N=p<"AamZ#H5Vr^/!J/mGAhEu#c-?;(IUD7R.'/0aa%YpEMrW'>)R2(6/6@F14*$uTM>ts +E9XS.dpB*gVMcVZ4b-!ZoLmN5E<,aI(Y"bF469n@drG,e>k-jm\YD\fn +>;7*n7!(G@NBoEN*Jh>@JdUf0t/d!M9Q%hH6]Al.$)9%MmV$+X+N>:Tr#cI8T9jQ#:\ +"YYMZ56%P#`X?be<9cW0H?&nLk)n!-WMH5*P%YUH7RjKIJ"`R\R"3udn"!e`=#I=Ri1+i$X( +WDngHC9iaVQlD,&*AHf$CD,qM!uk+&Fc"XoHOe0me6_h(A]A]A)4r5[0t(#b;(1$h92!TAiWWg +#]A0H:;C>oSEdCipq$tc>b.5#s>mH!URU/*gS24817-E>g8]AVs5`rQe-SR*E/Xh\Oc:n%ED1T +Y%*W]A`p+`rq\beYe@i8qj0/W59&0:+<]AUI!P\4fW.bZ0)'PX?3qFAqNgTl]AUP,Y1Zr'Hdi`, +QgA%C^NBk5L0Oqn(WtL +NOgmN[-E5K@*!GW(D94]A[cMfphBW!CEk[#CM-0GBdqIncb)!'81uB\,Ti9Z&'$rWG(m8]Ae:3 +hSeGI.'=hJmq/KJDN`OheO.YWeNC%pbd`]AX5W0R:38XhoH,6Y1fpOas,+M>n6t3e4gpeJ#8]Am`bPE6$ +G*m[plr;GQksm$81=+YG.&CbG3,b>SJG,dF:kXsdWOaBdrZCb:(ijjk5tT?Ru?.Wi_IG]AhbS +%ilDZ#%UJ>rLm:72ZO^IC4bflqk!H9p3+l)AB6h(&.=-PpdCSVtUYK!Qq<=3-&8>&8?iq!Le +gBVbY=!(fGACX3hGJbL,&3NBjQh7u+Y!m^52Y?3oCf9H2T`IrLWet/PIA?OS0YdMG-rrp2H]AN.9P3I%pm/,?_QLu1UW5k)*!ofcV?^J4:m1uA<7h(Sm![jaT$gCNV(+T/l2$%2R]A]ABBmd2hB`KZ +ZOPXM(_oT`KIQskN`A%fCTd[=Q^40a'bpV4()60YEIckf1]AK,0Gl*qZDE,HFB9/E^lipPm7V +'JIpkiQJcZc7rUquHjK\=I;f;T*]AT>)VgoIWo@QX@.JB_G;<*V]A0B.P/m7;T]Aq76kCU9)ZEM +h"D\-@8(83^RG^(2U3/eoSSL6gCFh/\+AeEj-b[S[8M6NG0<]Ar5r2'(Zg$9JWV\n]AqE,6r@( +4rC&K3-LppH7ZLX[n/pWBO`ZcX@k7mNfGHiX*#3"`JBPW%V_NA%Q"4G3XJ'BhF]Ag%:JP6>Ck +'$^k]AVrPm8@sDk1?lT)VnF7p(@Pe4XB1HaPV=)f(M"<3(?6S@GBPIe(lcUC8P-,pqM!-N(Ij*,Nlm8$<+3kf+JZ)[F(/cUpr=i]AEc +Omt?*g\XB&jLuG#&iUQH9ifMk!SQ+puhMP#<#8KP,S=:!R'[*J7[kP1WA?Ct>q6/f>8/3,X* +7B74I"W+&225&5St;NrH*.bY1k>@0aMQ?pESnA@XuPn=g@l[g@_374B<#"jSbs(J+uf2hL-V +CJJ]Am&\"A;4c:-`$FZa7!1O0>_jjX:1(E]AdPD"ck,!6,Qi*V\%Yi45pF3f`Vrr$NbADc!`#= +]Aa/n)h\=p!d3\a''uoC,an"S?iR"gLn\tjX#;'2Mj;C#g!4T_#2m$N)<#bn"ee?[TrkSg.+) +&J4mcUY1q01D8*Y^p3[C*D(Sc/#4JFc*N>BmH\@]AD,\hffRmfHt-NQ'8c9Xhlo_A3+CTq&6aV5(5UPgXsrB.)F)cY_PhnS +*CbS+j1i:U+JFd.1IO'C>7]A.fB7Ks@o5G@'T!SG?IihsS4)T66A!a@A2R>0Y"kiAF7?TZ1F0 +Mk#5!9rBSFGnh:n$S*J(4M;g;Ejt13HO>2%mcARJO`Y@DK?;_W![0MnEP)I>q +6Vaq_^h6UW.RM_GF&f_alaCh!a4IL;5WItV=&%XO\8;2Y!@Z*UXNsrBNi0-kuZ_O8CM;11-+ +*Y]A57CsGQ7-HnA7a8'g3aHM:uT?+_IM<+:RM<\`Un-T@WFK2QH*S\;)-A!bc^aJ9Vk7]AVgdX +R@295;g/q&@>H4O-q2H#p2pn%SEcfEM2D7a<>EEuCS+h?DU%i8FM`oW&h+5:o+n1focX-MY7sm`rZat +iPk&t-3p+#n3l$>H`!,6-+84c?7.TRudCkMa=s7%BG.L(P?JXrsXY#Lmc0=J,LUF-d(d7[e' +V&o7j2Kkk_lcMGH4rAe5ojddhp1ZIblf'3m=M%TC\4RZ*RCPuTL`Qk6!A<0b5@`uDUkYq?'o +@-DP>^B\m81VDp?I!2!N7pKA,)+;(rVQ=@VMZ'C1^B'fAq3Tba>q"?`!FR`,+-?NV3dO< +G0[e;b-F/n/t/!cMX2:1.cbY]AMTc6a6eRp@NgX1oZc9&GQ"M(6.Zp6MOqZH6GI+ean>7)7On +DW'hH[F]Altg(a/:LBHBuG!`l_7[a*1DT +RFd)U8C)fiuf$WN23no@:P=(fX_pWf&e%'pl[>V +CaH4)J4cj>l;RrXQP1eWf]AOmWG_89[WE55'ToKZ:BRXgMXk%jhMT&ceWgYI+DaE"F]Ar(*]A-" +q*EpDg!(filRcQF?flt&PDkN)N#_&HU"/V-sT`C%$YPdt1#o4+NJpP'JCI]A"!FA]Atpo.:/dd +C4.iY%IpH;90oUTe:_[/SXg&_Pp:hOdHqlNX"Pk7*ng*$(fY:7=+mcQ[a:A)t(C&;c(L$[l) +6*PVBp<:S^gMd6P2phpqZh43TLZQh"=-`F@6.C_B24\!:!8@eEpJ-7bMO)%rtNaY=Wh(]AooD +>?BlRLR$.c4haXnp6?j@DX_0?eiNjB4f.`#&273V77`r_#+`jTO=VE+?Us"N[X-NQDZ?h0$^ +Z7fl%%7bab5F*dZr#b6sS:q"?1s-+1ffD2dT/cXrS%g-bI'1!RPG\"5leB&FDXgV-FJ>;V:P +9\1U>hWZh`Q7E&i&Mgd9Kr)W,/jot/.=p)d5VIq3@SV>V9'Ogsa'WIGm1:F0k=>np!:;?$=EO#V#chO?PIqR"*mt +s,GsP$>$#m"\<4bSo3tEd>>)PhD?.;(FWNBX^rM,6GTk:S)ig>?G"[ +(tq`cW2.AkV;.LUBd(Vj)t@^s1u5"R/7_B^%;NF^+V*QfNZB3&CET+r.m9DjTrVN'ao&s)u+TrYM1%b +;5B4B_cXiFSak[oi_j[-WQlo[G@IDu01-E[;RQ^R:WC-*0.=*OAorVQ>m*8p&'VPg>[$S(pN +.79N-.NU,1EoS@i^6b%QhG<#9DAITu3Egk;\Z;t5ZA&UD_4A38TF@/jjo6('(Y(^f:WfI* +-@;e>Yr-0"?4nn0fUP81RgjI'.T7ZY,.5'KnouhJ,)u17p$i;#>Pad!PA*06^,+H(F6@qsVH +Es@fm[q4.2Pj+\0=>[93-E(e5G=Z$7U$3@,dJ\WmhY0 +t]AmDN2n[A'H6SeURmU&I$*Xe@k=``";Hj$jrK-=Z+@(.,I:)ZC`5#9T&P*[p%b4GVLRXk:^n +;@OOD55dfH4dGbZ;)/Z2SY1ni.?W#,b-eo^DHbdSi^-ohGIo(riic:O7AN7Z'5OqYS6UdcOW +3dr'fUmt!4lT2]A8SqFc*qriW:i5gqa/in&I4EXNu=8?or*gT,*3,K0aJ7(e>j%3/0PJC&/A# +7Zt9Tn\tX>TCIu'tZ\6&C53OsXaWF'+$r/P"u&\(k6Sg7<+F@"$hs1d(4jtChL9C'Ct87Z]ARR._O9&nYg5''&::tT#'%aXH16ni?H(Omi$W@SS;2DQ(:q!&#`/*Vlsua"&r+q;@/F:1I@NqA^AZn5&Vr?hq)0T +nMO/l6Pm)j_K*@Xi1(.d8AE?M87CpMcWrZFX0M]A:T7f +@QGMp^8cggb^Ri.T_P*;tR'JU%pP[;($G:.i +s3E>`5MZ2U35/M74LR=D&aM;EpPXqb+5"QRq!hnLT5nX/Nbr)ArEb8\X3U)KgAMNQ6,#C@am +k!$kJesT&,VWB_8!b83pU92&[^T7_AoIXW-Z3@TIapF2%h:gQ`Sqd?ooQNI$ +I<3]AdB`jrMFH_.rJ![ARScK9k8kndd:pRja<#fc@Ca_"[9[._^h45;<5K:q)[:!?LekR]AAWH +\VIMTMpkl?phhk1!%W15\-rJ^IlI;T*T4`V,hEc\.(Jcs%^Eich-TL<9mIcWX+a.mU%m*7Me +R`egWVU!b]ASna#4'[/9'KVq\[`lB$^&mdh16.a%Q<3$O;^-XJ1R3*F-hnE9J1/,/XdU(ZL:nbsG?k\`js*@(SWl_YgC'-9tH\DB^E!t1%Lq`C&:Z'9^tjee +e+W_N2QEs.&g#V*VGAimVP;r@^%*UTZE8=s*i@c![JXIm:hF>b"jN71/*MFEb$OOY!E2AmXhgR[BqulMsk8 +F8QqJi)-sS[PD,mm$Nc"8B\Z7=bbO8>6<-Yi.9AKMG]A:1f9+(qf_@+^5i@t0D/0!N0[oO#mM +uSm)8GA+Mj-+Xn$7a/^K@affE\f"N0l0@cc4JW4jY;Y[^X0CL*\d-=H[d,6q#J$L) +2-VW[jmdLQs5!TaYJkL)SE_q.l-3YqkVRFT9KS5GKXEiJ#31DrJm(h>3;#"s7uZ +PErZTt59P(DfFrRf,Cf^BORGp,L]AB/P,a7.!eTnW==k7^'ikmDGcLG47R$NC/7>0gd-'dmnB +62bLmZ!>QnM$K[:`,iHR +p35(<`Nd60lH1cP00FuR>5qoZX#$.``CB4ksF'$l'R-Pdu#,X.QZCq*%tYe4rc:q.A:)E7sh +iaNgT;665Bc16-H3]AoGq7N:KKHWKp'>Tt#b;d-LEk+6`aJ%"\AQb6=B.[5qC!O%AcL@MRoA= +LYUJ%;>0ukAOh_B7oQ=6RR$cB>1tb$OI4@W[KL.P73sB4#shfo +s0;?[s$K2eUXVQR9.pgk9_4oY#8!uGZ$D$$!b`skmPt^?FUXSa,]AS&L^huYZ!-bN+K5ti&Xi +UGjnuOedeUGbqLGWf(B7hkH8.-W[mpAgh1)iSmJ67(`0!hCCh%!<[ENUpn)+`uMjF*7Fa@VA +KWYI'^3?`i7Q__VWnsk$mqDs^gI1I2-^mD^5+'u0KK1iOL6$K^PgcYG$?rBB)b-o-#rq!%UU +,1Q#M"'B/$^8T4Pd(hZ6H,YqJDl`.fG[PU`6qX\QdpJlc-raC856c_5Y^3XeIqbUi&6c>7WUk$qBa$*):K<<()\-5Y/9kT@C.L"C-8N[=RV:ZIWl +Q?s?b:Jr$cn=s='*AS`G#k'2r`m"N)U%U)rQe'oj.nNmc8oS^J5h,fT+9mothL,>d"pB)K'& +jp3/G(c3Accn0GLek,; +jEAAS0T[6SgP;tQY@kiMTlf]An[TZ#.mqlPj#SMY9\(5&J).X]Au;VT7*<5SXY7bJMd(pifQ#=495B4>QnLZIZj +RX3,R;T3R0g3^M-m-^(*jl=E<*7KbQbF't@GO5m=tqCq>#q]AKN;Npo\^$DVL?PX5:kbppZJbF)DA#LPAW"+[3>RNJ;12a&R +eOb[3Z^=7,4O.WHM&7W6]AjLY/u9fW?K*`l\an'"MelNV3Pir^5H_TfVP +V>_g!\I`SO*_QYhcbbhZfG,.Z0u?^#_193Ea]A#l,i!;Kmhe/@B@?qSIkG\T^Q^BT79c@qb\p +LkTSrnBhI\-l2tLG[tO`-'gP(W"`!>n-c_Z_A"khh+'&<)duCgf03e21WLgSms75l8,X*$-K +)UD9.?@^cZJbLk!UUM;&*5rWm7CSs\U:[RH#a>uD.Fa(@!4NA%u1T;e5/IRYE@soE1U,If+s'DV'1`.Pph2N +g%A4^,feu![q`l=>]AK*moj8dW0NNYi?@4&haq&2D=$*>WGTs!#FZ'f0Vq2SrZMh0s9C:#!B, +4Cf5P6(:3Opq,$\qb+4-2)9.b+UI+jAP'>,TI_JG8k.Z3Ar*A(5i*`C+A=pf18aOqQX-kO*m +R6h>VUUntC&^-gXTkaBp#2sJ(77DpL^Y%&;XRi'+5 +;E+^GqUDmuF1l#>6^e)I$AC)KgGfH@#bgf9,n)B$t"/n=nHe"(N.I?SVq!WfLpSU, +&*3jMC8sC]A90-Sh'=md+d51p]A:LZCC1HdmM9CP0sh2Z6iCT[g_ROu$Zi:5<"-\=1>n"-1 +IrYhQ)>,ZC8I<&0,XdGDTO(mknCmWcd/ST1U3tNeKUo0&s/48+THaYj\c@>%bTPUDWHDM"gY +Q=i$'=KhYotiZZqi`jC*Rl<\#m-q\LiE>_%"t2X:*q5j@#0:3$#HEsg1^HjkohO9Q=g)]A=t(qg$0GZs +di$LN70P2%OVSaW(XG*En_q9`13's+b`u[bZAb0QeOj$$FEMa)+iO$,5>T6=4GCB3JPiBBI[ +C@NU^VXA<]AcD0T@b\aRYG;Pe*YddChqk=(N7roR@`i)F.2%R,QS@dpmm$Lh$Tin;"G;VQ%fDS^F`Aoo9$s-7X-Js8=XPRE,q +#M%ARgPhj3Db8S>%HNr(T=+4fQt\;^=MjT?j?nUWJ]AK&:?/5, +N\jZEapc\ltMWIlloJ9sES:"\VmpJV9Ol0l>7+i(`fPB=XPYc%O5aQo$/(i>'lq,I`urC"=\d.)NKELZ +G%<.Z[2VH3C2p_.!)M$W`cK'F6mU8UFN$:AArWP@fV2Of,6mm:q&d=9u4g9dm:1A'VcN>KLIF_D9TOkR +uD8d8*PIufNIe(f>X92qtGcmah>b7uU6GY1R8>2pCc.3ftkM#!,C$Ftci7NeeM=a"t3rPkks_IYK<)GFdHV1GJ:GHqAi_lq8`X/!]A)QFl(aI!hVL=/%_ +1M%@Xc*U.XDfc%Ed5l+nAW>(4ZD`p"Y\P5!T:,>W!;01k7DW/4Er(>'"3MSLlDTh1saL_^9* +5MouK+;Gn8g`n,FN+LO?\a91?EZG'M'M?52Z0ChblAOm*@M5)R]A?Oi5!LP/Z*!nR3L!iOK2p +M8Z>4r+qn?"^u8U(HGm]AS,NYRTb.J0bl3fri:fNeIglQCH&om0>u`ON^XY^*25=W#S/WX9D[ +>Fp-*#hH\6[HX3:NS63AYN+,=Q*m[e$7b]A6_]A^3%%L$..>Xfbk=q/0Uc:6,5cu9Gfs_Re']A) +4BD[COc_(n?fokOs$SO,Z,)@7@aCTGECr)(Yc#*(8OWeh5[Wkl\]AG,j`\Pr"Ue:#kMd&/N/> +db;i1I=m4j)5"UZZ'KT^F85A@\&Y@b:dIp0>Z#^Xq#,cP#l#+A3haHe4K@fu>7C5dCsDElqW +S*#10dKPDXp._>QVrt`R)9h`./Q>VSCX2.*J8^!`DbLkM$D4b5P:lir;JaR-+Saa94OF4);! +EF^2rq#gUFeadZ5k*0sc_:O(St=hmSa1s%!,JTaJAt5IcIQ_0fD22_K-ONQaUjl\-sARNIHm +lh5&3I#ags'i+O9j2.u#"5&U\"A-\Y@OQ+&Dlq%Y(^/5.-KnuB8WFj-]AG]AlD64n@?)mATV$@ +6:+$Grb6"I1bHr=+'/!u/#o_35FNJc6JqF=\R/^HK+mErS1!`?[-5`s'+I,B-=PTFYa9O_HV +bmQk:Er(<4IZR;:07nE!U@mDU.Xn-X4l%qth.A!`bra[i[gc_\\`<[pg)@N8@/=QTS#eVV#F +c?*?JQY$!u=gK8ak!"9*dSVC^MC..%W3lW5WXZFbQgDLXg%1Nc'g`P.8BLIA96Hu%uV]ANiK;/O2EfO[q]ABg%G;DPm`Yn6WA;!70b$rKKg +L]Ap7,$DG0Q#*<&:N_ET:3Q+*69t%,cD>pW*OUFa6\Uc.aZ]Al\)0/X2_JY1SU&gfR+HapuK@i +[^n +F'sJL.o^mNCV\Iu&l8LR9dW'\p,?iTbPMP:C8GIEV9[p[>Rr*?DDo]A*.T@8=E$j0V%r%AW0( +1&fsJpi6Rk<<#W:o%UN6k7'nU`Y]Au1nG`jEEr1V?/]Al6[L\ECi?2ukK;f0t@8&WHg!Ud]AS?gm*=>iY`N+/+K6Cr$%:p(K0@q(Ebf329B\ +FVkc>3?r`*6/RIoc)k)*g)qK77D@s32YJ^$6R%BRIcdb;U0B*cn+oEcJ2W'>LYkM#k8ln0Xm +QG4MlgF)GlUqL5U,5PDD7Y@"WF_Tu1q%Y!o#J,5_5!SC[X'ZJ?ha%Tqd$k^XsNFV>3S +[f.XX`\2niJPD'WQ?:4YF=?#!W,Idi%TiW,)0jim[@VD%1bmt$=bSXojSli>Fb^df%)<9-P- +Lr]A*3D9SX%lE`cVN\r2diXFJ+-)4G7PTN-VghefZiX8`J:!9Z&3?X9pR.m-=O67NtS(Z/2S/ +4enDDW'53NT5]A(^h$r_?[:Lrnph"tOD]A(E8ZY;tkKO(O1e`;8,I07f0LnU>SEo1!i]A^+`^e[ +r:/Q,_mXo9t6YPfe6"n&c.mKEo4!-SLaIdS(*TQFr!V:5(WbnDMq%`/O)o*R5d?H[$jm3i&?i`A&rW>7`\3h4WnU;ag/]A.W +IJTr'+p`Ja?jQ-RPiiG_gdbiM2b0?8"Uusko_#,eJ#bnaY#Sat/fXdU4T\9dlT%E +u>plE@D]Aaa@Zpm\hm.X.`m9H\j-CAlt5@91es.'2X3-BS+29"fF[i2`n[:L[C1QO#62g6^9= +E1C`m1+7h2s?dY4YrJM@@6g(Pcg*'=mrgS&"5mG,ja#'m^b`%LuX,4`3%[(lA)j*^hW-"2NVF'DOd)1^ +4QKBr"ibWSi>9IT9ZTD,<[7rj'>t46!R2]An'/m@#aR%(dO+^cqgec0fo`:rkfoSUK. +0-lpCF.c_j,2hB5PbDV&CO"!N>j9.3b;W/rA^rHFiC[r-Tp#PQQS\(n1edW0!)Xd%f+"V2-3 +Wn9c1=.7W2K@nBPS9#\6D]AU9U9g=lIps'>9MG8EuF`';\V-tc+MW +XZ.E`QBUmZ8r#4<(r1En3+g(^ha80[!LY*D3O.ebC$m&lAA60<.Y\?D[*6`4JIDcfetC+SYt +UJuG]A'3!A7R5g]A7UO46q-J#Dins0dk=Gc/OW>Zt.DdZtg\Z`JdO2VJC(u:K?4ZY(+]Ae`YMg< +gne$<2!-NCSj=bZ00OYB>tud8(,.>8]AMl%6b\tDerCU=r8`_7Gp;@iO>OEJ$cGDc=qfS$'/8 +7p>]A=SN2-`,G[PL@A0`MK4fH#\Om"u%\4-0qF_Rbb+;`,)9ctA]A!p2c5I>dtfn6=2@c@keWpK";@^Uq!\AkJ"&gLqW- +ZL&u\B[IuubT2s>or(Fr#mQH8!N8C\P1"Y(>gCm]A]A5^$@0i6$nWC/#G,g/1V9$,I#n2mS==bD`gmD[=0o.\&tajW,8r__6I>_l!RakD_.Xi"&@cb,6uU&uOku1?['qb<#2ihcTg,/j5;I5H? +h"]ARR\!(J>P\AuGo!U-T*&"Q$eEWPGU2X=P"+X]AcHm_]ADcG^ZXP(`DLX/T18i&:Y-U_p%SKi +X_\UopKFD0ZH"8%PYfNFLkLkTm!Gl$N)KA8N$9Dq0![FhHgc*ZHb&J:^4!_VTDq(2kJ"t-om +EA&3j2JS(g>O#8D:QpT3*:qMB,[0IC;(e'&Eo5=5k5g,5dIEGBX?K/BE +YZT!'70ZnNg2UuKThqd8#nfoR@V(V&GtB%i4c+qIP/9f +^b@0P\Ds!+FH2]A+h!aTCL;-=qjr1FoAFbd/u0f^&CLklp"6XqfA-TJqYR!-9blg1a4)V.E2ZN-- +0c'/.mktRg9R\&cpFaP@bNo)]A12-o]A_LlLa.E=`[O67k)DMoFa2d)u/"Z@CKugn_OAVjIB!* +9E71[Jo^;L%':q0%;pb&]AJe`VWDri"GFM1\KH$@Y,-6D&c$oG5aJ]Abq?lbkf\l#C1DE&[ +K>.ksqUVt@McR\5ff?sp^C2@W)nanOT8PA7O)4\m+\0Sni7.h,4,+V"c^sMra,o=W[f.mM\i +C7^^S,2n31mEEi;h-or:TWs7nghUrf3Ks\JkKZid=CLi$L4sEuGtpZQKCC5Ks:uMH6(iN[^8 +4_$=_/`*m"kfk3>14tcn9Trb2+ns4QW07XaUQ879X+U6>,[Gpong7@$qO,oHnUK/gl(QTg!(lH!)Q]AmYUV[VE=BDZkNg,NO7b]Ai*/<1c&^U5` +NB7':%pc/_-UA3sIpc +^A%AtBpl:<&^FDb.QAoFd0Q4X"p+=:l@G.4?V,J,T6:aY*\6`\uU<&.INEDXLEeE`T<4IY-PVDr4/FN(2\Vl#I;1:I4_fN=a@o/k(S@o;`1D^.H8408UAT8(c;;;gTFsG#33QK>K%5D8V1E5$)r]A +QJBF9SSY6+UWhbfun)EVI(%Qq54g*R7KnYGTQbO#=,59bOp^0a)LlL-'L6:3fr-V_"-n(;9Ek*HhA0(T +:J>T/f6'b.Q.Lmi8<$HED<^3)U6]ANr>1^Y3B*,8'd_3-Kh'[K\J$go]AfGKqdT7bTXkEfus*i +=\#h'cP2aA.l)u`3T$hV]AV=aN2BtbFs3QZ@7DaP3$8$oR/Q7B!6WT+8>Hb6ANl25`>2_9E&-GL$;Yhn&^RhW:4VJ7r85,/TIWs"Z+oFl +>lCFYse;c7KnbpD!,R<<2U7K*/sUC^Q&p',1@-4)CL_K),+GK\SCA&KE%+f4>[cbM[+8-M8I +G]AE9.P=q*g:'iU^VVj'R^qGO/ket:c[UXmdeK\f$=*p#)Zhm9PkLq.YWPF=Fg0th@[+5`sOB +%8tcc>JCM'gUW_#q!q'Ml8^CrM\$mV8Al+'6GKRWYJ0#9$tgI.@.9^F<@!?R5K!O@"&,ZjlY +Ol;nkBW2>?DTIhKM!:1ScGAPPYtdUnDG6aB,idWucF#u5L225HZ:qmS>:\>cf.Oi.8##Tj^B +s47tJHB\(!H<-i#'"@kfH@Pd>qu3s$YkTi19J8@QX0*R(pN\4h]A=YD5%`@Y`@/B<06q?^$b: +d>NNsW[Sd_@q(##51oBs2[WbZ]AD#gl-6*&eS2bYOS`bCjQ-XZ$9)#abCLL*P?V-gJ`:P6<7, +f,%2$idb8N]AFj;dtum'NV.\po#:fD86^85KC(b8:d98tUg7T:IBT.dhV0U[BnTD>9I:W&5=(!*K5b%VnruUJ+#]AX%haMgWTh:nVBi- +p?O+$V//fJb$*2;2QM/'>$3FjY`lN0@48moUOtB:rk'aV`kDMqGZae83DeZeO#EiB]AYl7Ln=M4Tsr]AAE=*;LpIub4F +TVBg9%u*n2;7&lhD\Wh9lJJ:-5N(TITpEhtncn@,b72B-hEe`lKQmSd:iAiVY3YCajAkA/t% +488pc%3Zn1pB8Z?fefP$rReQ?Ro_;hrrn`+5oYoC$^[OQ1T._da +Y:C6jEn=FZLGf1h5c>>i;]AVNBm+A9W]A]AsQm6%aU>]Asa6^VL7]AQnk*2"5[M?Fl)6^\3B;Nr[: +`QcmkQ*C0gQJ65_pr>8O!K741N<3/BI2i\1;5J9(*8^`N-&I`%^l_J +$V_<9N?qmN8X(BHoBhpA^XYit$N,8U]AUb&o. +B2@g/j-%IQB,9uA#h!"q9%__Et2q:q<2E_s' +6N^k=6lVGCaV.(8s-2-`\TBh'H4/KT&QH&8e`e$>Qr+7r1lodL:;'6Dt`p#_*5X2!"PUTDjV +%o1)M[P(a#DcS@HqVE&&rgINEciqP<9j'^a5O@4YF-RfI9kZeU)uVTS9X)b!GKu0or@(E0kP +Eh5p#as&u6R*l27UTRuL>4NCrH6"EF;GKt^J_*,u=`Gn'flZC]A ++?L91&9rZfkEEK`e6)nc.uW%t.ik]A$p(D:Q\s1_RF>Q^`/+-.Cr_a"`]Aa\+3$m6_1d8mYmcS +MF&3:C!JqqRZ(Xml)ebqdQ"4oIo=X7q]A0#d2hIKV@OleWm9>3AaGB.-M76ot>L +%a_T2S?1mMD"(]As"#s.@^eE:jaq70(iNUROoN3@1id(r+@'ptM^KYE8S:&ZF'fIQgN_Weu\Z +q\Z7<41t]AW3%(t+93"*]AG[^-3]A(qXIYC8f"i:"6Mm:O"W2sfAl_!G@a]A\'(` +HK^l:3T>&+ZM&aZU6ea(/3V8&rUnjes4DtH=WU^^n&-_:SJtUqbh]A[``+mb*l691haj9_jf, +n/^!=0GlWSc3i>o0tcu`NK#t;h`?mMP#q4]AA/V&D?:p-L=G+O8"8M5IqFi7slC3gVh%181sc/@/)-@N-PVr.(PG6Q1,(sot')DqtKN$?nsot'f!Lj\B+,"V,rT..,W"g&]A_8'5+iBGr:i(N\>T\8U2sUW) +6@fF/]AT0%ZjWG#^%5^F7)2E#4g\H:S*;:9q-dU#2>AQ@Y%(A72%53M*DSZo'e^1lQ\[=k"WlbQgCjZEgd6gstbs +o9u(1fi$NcWu/Q?.d??'1g^4*Qi-G1c;-lo,BQM0=`fB:M%)Jka]AlWVLh4S#n&c7XTU66JI, +KI[m;`u:fc9U7R'SM+$\#mP)\C#'o9?O2kj,Kl'bh@RNiZeZW#'+44JbO9-*O8dC1,<2bf2f +"lK;H3iA$YQO;<64MJ1.I_-(63B"=X +_2GQ[o@CO1ae5oA0l/;\*`)5Y^4LhbPI03_9\8[Nt.[:ac7,P(81,5eJ[!-&\7"&@k'nWsDt;ehgR-pq1IM9jO8-%Lo-1TF+$@nP>eK`mRE-e2B +U9PYK_lIf)ufAVTbJXa>&dfgdBPE;_5is'q>#:Z`]AHKWm%%jP2l>9?;QoZfZDf8dTXJEoo#K +7\HX%Wt8RK>k%n#+`&-uMep`gaKIH'hMPdW4bf@`-mTWu^'39(f&1CNuaG_pDs-T.W>7Er2l +H)k0I#B:l:r7e&GOi@'VNk_F>f[N^\(hoemIfOTVkQ&EKDteteL.Z#hDOrsF0sORGj4.6Cm<7=n*G3,"b#W\t6,@:1p[051KKH2U=rdrWrB,Elu?u.s(fh1i;Z5W]A>S5s0a>r1g^1W4Mf_2=el'_@FGPh]AI$h;Y# +dq>fDCi;930'P';#8djh]A!Q=&2MP7Q'/`.H5'A3,stt!OoAlM +.%Bf";c?J+4i6dR\e\3Jt*5oY+t$K=:"4gQPiN=j!hc+nnCf4f<8Pr5DE?(#"Z;gc)h5XkA1 +ecR4IX3=)!/n4Zm1EL0$,B:^_7;[qAn='*$W-PrHn]Ao'_YGTifL[gBirk3jaYlWM9FG/jW<9 +pburppb<#9_LeWr[E2n3[*I-#>@);c''pY\*a'_Nk?:rD/Vm?/CDLArPH*g.:JTcVg=^m'`t +OpH9tNSQ@>("*;4oM'R:7[E5fVd#R0d;dY`>uFM=RJ-aVsmY2IrR!ku%JZ`OF^3qR!]At70qp +H!CBL2p&L1YRte[(Vd2h&mfj5UjlKHB*nLK?0T^tJ^/_Gl[kUK8H63VfD=C.*iUN)rVQcd/j +da!KFSNYsbKrNXmhlH+_k$ +Cg&`0<$??)FFR<>qgTaiZQW<0K@*d*Er>kU]AgZF/n#ca0jar;Ih[C0"A8m*`Or=/hhAMk(e< +q,iWOZ(iH!%SPkkJ>.;^4r\EniQjZK%T2o+QI5)]ADd)o$5Tc[gYMS\AT3gC$BoSQ.2r,>krurUkR]Apr]AT+8K6EPK]AH-F9#`. +7S2@eF@Cj]AIK"klTA:4METnueZ8an.9?qu[=&e"-83hB#dMEooK$WU&@nLPmY@gR5/,6tQ1I`j) +lCX?LS&oZVUP^Yt'99'Q#9,Uo6=eA(o)qm+W%#5_QI8a9r!2l%2o&3^BnN"bJZ%;uH7moOh! +4oW4_Sahg*ae"2r-OHjPAj9dcCWk/%R5&&BjD/i]A"_[!caI +U_$e*k,_Xg>'8cHMjp,^"(VKIjh%ND,8pX*+N2AaA8Psm-QN1MDFEKH<"sR8do@s_ctGrJm* +CH.OHU(`@'C$^9ZYM&N^A4R=1&%R@Z=;Ag#FiW$`()caF:9!_W5R-8,+J:Bp83KO%bb\d8M& +49lQrH7haP3)_+5_3_m.4;SS6f90>L5nJ"R';!->eJ2?+TfTYj-tCl&f_$3G<>q+2!\T*.\P +5Up*Bp1m`7^[T<%dT$hUe[%o$Ik$!]A"WOj'poI>fulSRE&Po2($?HqPajXnT3#9IVsqEg<3k +t/@;=UbsYoB'gf@#o/L`l'0cg/bM?LSg/XaX$#'M*KHhBM*RqV2k":X#eXjW\-W)HoiJ[scb +Vp#Lm\+M7(H&8bA/mCT!NEf4rUu4/DPC`?.cQRGUIKuSZV#ZqEK1b+nO;bkUOP1HfCa7qk32 +_f,8oN1G3DB?^3ppnHicZ5eUE!J,0'l2KiLo:A,)jra4P,aMcHh;,20,o:8]A4gA0EC590R4< +!J-TIJ1tCa0Kg8(m?/@Hq,"mUWChT5XJ@2#RF?@rQ9N6<(sq"]A,.MsgEtlMmKlYHgIMOjN>#JSg?S]A%HeBerTLse^Y(_a)q^W:bd'2^H6G%?:L0,!H1BK'PnCdG +2/>QW++J1?CbSL,K(r]AFq5)"mkGMYc.5Fn_k-4W`RsG1'HeHAW+de]A0^_!XSIN(_]AA.-00cG +oCK6<.h\G,8e1pLu0T2U:N)2#%VdnG$Y5q\fYEk@YYIq!Z+/B<7X>F-SC91jEY5EQYn%D&/_ +)AoaMRXR8$ckAHd3\`f.A"E1;Z,`c\E)?K-.u]AV9)kP!=J9IYZE-`LH`PRl@h?nBFiD6_d]AT +FM66X:EE33`8Ff.TkOH(Phg0\JJ:EcK&?bX%(pQ&"9_Zt`g;8Y[#l5&gQ1s]A"/u%_?bApM#9l.'&*M +T;-I'[JdfnF.Ya_kK#NA&uB^ie(H9[n<[!QV&+*7T!n89G?IGM0&&=a)#6$KLf`-L6"o8Gm/ +n'inTWV)qHr(TAUooH(2?2MqoWMNR90"a&)1ADc[l?;A4>-$bl/@cK4iq;%c%l:3*2K(sV"; +h.SH1(,S?3n"^aJb"H2!YF^F*9/+hIe,Z?RRK0lP@Ci1-"=F&]AsIWpSU)eJr+fVAnGX+)`l. +W^;oOs`:54''p0$(&Iu^(d-G^ic'ZXiS?kDp/Tr#XlrB@X;cBU:X,fVcWnkE31Us0.ET]AK_F +;Mh!Lrc%7'!)?HFJje#Zt4q>MU*C2]AZsF=%qD'[b%E;6h`j72-@O=:\ERYqjGE"ZPj(GXCY, +5kG&jk&fcPh16i\aoR]Al><\?GV"PpU59)OnuX)S81kU@r2.@X2s5*?41@6R#jE%Xr%+(Oo`\ +N04ZX($m^IX&0&q:\]AZ9R/TO"e&A@*cTu-,ObLcE8A[s:&ZfEDklnkhT_lr(i$Er98SRbP=P2p( +pGpU#OMeYr[QWZ2k#LKc!"[PN+bS&g7h[tq!lg!4p1S1StoSM>VSU#-71n]A`2h&u4:8o$N3@ +AV;Ouf-3&m<'h)1!/7\1,H'tuf'4ub+N\k/F%FGX(GKTkO6S<3pA.fLHh\t*5q]AYEl\q&,[q +j<*IhK*=I.*H;jrZ/AV,LoO>um,-@#c6s27RRE[:0g3dNgs"^?TA!:le7]AC%TdBk?P*7ZEn" +X7a)+2V/KBo\e1F7e]AP*IkT;s,<7FA6B:039<]ASL%'(9?^I.`+`lH-K^MFun\EQ9Ym7oFJ)mLt=`*]ArHa#L[bNf7uY`N#_mJ2\pghC? +C(&.E"q_7Knm5@L>8&IK[A'[O=$4o4d!$F']A=FDP0Fi-KiCaM6k0*hJ[`2DjC]AY!`IDTl&\5 +;om,$7\K/pV/AHIV^C$f'D@"#[99'6C-):e`8ZD7\8'tlSllV.pus`$?siAg2%PQl;F66bc[ +ra#o#>sIDND=lVq43pJJ71_Bqb8pjg2#'CPM%.1+N,Y,INUX&oqd%relWNp;QG^tF7G\e))^ +:ql1g5R_-7a.kjjdg2@N>;gkZ@i.Pei^E"Z*]A019G+l2E<_.`-@[@tj*rT8d/bj*$8N;FRF_V/,VMY6`[X;['b>\@-*'ua=As1WmVV!IBL/?Kg"?6k.hOBup(;0,dY%%qb +<'/uZ'&d.W"M;,/jJa<>05[>P:552BgDk>ZmR%oJre*>Ys_t[qYEQ/Vi0ZoCPp\o5.FPoqWa +9EI#NsWeMQBQo<50Pu[gc,$;$6!*9/3o?9g.kqc9\:V=,\PIb`d#cs:*X>ItIJmp!'2HT/_9fKr!7Qm8ZsK +s(P/#:.BNi%9P$Xb=:6\/#UK%ri:NXb7!HuQM]A9PF7+D)IE#5JS&uTP2UP#=.&Jo(@qki)'- +)E7Edj4#B/-J"g&]At;6e!,tZpHVg(N:UX,Q><=&hc'D83hcnns8>[150OcmikXg*+ViYq4eH +nW8D#b]A\^DQDpB_\B6mF=HCEV?B.Z5%4ag>j800d1Z-q!rm$5^jAdF%J?,mlJVdMrmE'QmH[ +m?>bKC3g.GCC0j^3F%i*A%I[mmUId">L')$lPQ)G@:M%@C\WGDMVE_FrE3j&UK/]AVqS +k>=mmZ685>;IDG0_:i!HI%sGsd4LHJ\bX(t)p07GTqq8SH'V9aI-^q@cNKb[(#2,J%Lu(,&U +^Z@,\WQ_r=T>]Akoa+PZ!m(W.$D6Ep98R?'+7(";WY6S4ri.#c%5LWnb]A+E53C/g8:BHTMi/N +:4K?SX@en5D)&_**"TiQB\hH0K`L@UNE+&NS8frNP=0);RVC##eG^)1l$7/!.=i5Mf!D#s.6 +Jj&YF5&gkcjY[/;4r>Z_s*(]A.tiS)<9S%3'R*[W4a=C8(1>tkTN8*qi="sF2XD`[5lj*,3Co +=\/Vt'kiSHfTgtX`s(%5_'E"#nrk`?#[7BkO/;KJ'%Jf37)NeL4L$HW8:OK4#?((_.7\d+!!t0_g?"7*dL9Z +..fLjPt&mD#So0/DH7@:3HEV +R='*cqtK+.FIJL$4HH#ZqK_o4K/i'WS:DiEk.UHO<&59:r5@7)cDp`k'4]Al#*$7a3grmmA7bI +;+V#T\HEIQGa]A*U#-OR8qS4ob=Nbs?W1+Tc4tJ&:_o,$]AJ`kI^'Gf4V(c3`GY3iDL\diGr,S +U#[YeNUr\e&Z4b<0UCe=f3g0oC@ZGPXL(Z`=:Tt(gC$nW/*ZkE&p`r`( +n67F&DWpnWi*Qpe,@`l<;P%ZJ%T6*t^e)T=Q[_ll&UX46YPd7oroqA=Fg'Y=;*1V3UE#s!"[ +H%ubus(V56ITMM(+GM^1#lC=m@s6J3m.@WsE@T'XqH-gPt[9a)bM-'gT2"20p]A-5gori_>8# +UM.-GJ#LW:U[lqde^cnh4kH\UC)`6X"rH?ZgMJLHt]A/GiHfb5]At3kn-Tl$"PE(-pchRFD>dB +1]A\92ROlPb6hh3pB$O$D'PL?ACn_D9j"Dpku5q#_ukH#[r[q%H[31+ft,CPPp4+&fJrSL'TPh@ +iWTQZsH#:Y0oUd;iP8XC7,[o)AToA8e]AWAAC*BK.:IAXa-]A.T!h"e_3K.<)oq")WrM(^?T@K +DHmQSPHH3?B@%nsUAMKF4b5scng[NXg+9W[7/FiPO.,eSjgNoHYu2[N8OcFFdqJRir/uhqqaS(DdkqEo%5aHr=Rn-DaQFdND(Y[JPnT>u6N50W8#B'9Wn>,U2L&C\Z. +6,e!/gBk]As4.MNY_$XW#aHVhEBPXf0\?M^%IQ64`8hN%G>*c0i%SjrU&kM+tF\5bbXQBh^rl +(->1eOi?8>Wn'[b+:o_&EDc&_Z&h?%nTU]ATq&/l.BU%J;*KYoGgB=I +a/,"-l+fl,$NCP(W*Q\$Bf+nrQG88emAP[)AG%'k>QhuCRN+/:>d7prj-+Vr3?e-8pP`Y"8r +*&hGEqZt,WP1FOj#9J#KY`WmRMZE/E!hD@M*;'o!T`0"J1mq:XM:)ts4i2O,8l:78&tO$aES +S6`E"a5FjgG30MYHVHC4%fA58A1L1GP)CnqkTZgWce"%XH@?hJ*`MWfZrbp]AsYNM>6@=NYNY +kl,3^Z!5k>o5sLd/dtk?>Tj)M/Z_1>$+tka[,RH +-jg=@-CKV!F.!>7e>L4<%o=OF_0QYI>P&ljn%Q*1R\[Aj$en05-6fTrm`6,(OH4pF'`\U[>iqCbPI(OX:l@?bN?Vb +,C;D:3q[b.[J9*-ADICJ7\;4\1*S[#1m0P)CpbWjbE(F<(Ab[l'd.ZKD1p%G8NU3Z2)VefWL +Z%pH->iWDr6dKNFuA2<''u7]A*-X8a%e?/R.D-hUA#>qkChhs?To%aDaVr4l\:N4>!j/[q:+$ +J^LVQ)oAp,LVpFZ@kdcu*@@"1bC07)!pcCi*Oe"QmP0H1b44Ue4QO/[?m3g@ZO^1c@h\V>fK +19Ibs("9$,A4[,g$'SRr8N&q&7sk?7#hH&Zbo_lMhZrj[\lom'RtSd8b)UGao4O:<%D#=4G$ +9&!TE9eZR=WhN`CcO!Vtq\r=JitX*L_nrhbu6(>uSFg=Z#QBE:@h'`OeliT"-f'%bgie^oR^ +b>S&CgcIL:Fr6Rugtg65dt'H$O(U#[3kAXudg$OMb_:O1bi0d,pWbP1ZMbgL$L)& +WEl:LE.n?j!b:EtMfIS:[RBS.CD+_.Q^1>WmQ84)pmOGXQ?4n=oq^pbZG/CHMqrWb#XUAnH4 +O@H's3j]AL49Cfd"#GK=cr/c/f3;N#>h"e:mg.qrd4AHe,dm +HgAF?63ptJ[^je*FCr/Ou_ig#^k0j<`D($-P)nfUs1hNdV1 +opeTF8HJ)b!h'jJ?!U`sNn/L]AH_bl+S!DkWP(>s)W\%QGqVprY9(R)]AjdcTg +DIT^YhbjXIOWd"2r\[@lZ]A0(SK?(FIgAp"/P,:1q*:taZI1XRDuNsr@)23j_M;+?7ZNsk7bI +W'5X$0=H0D]AWZ%]AHoLaAV*[o748B.!#=a=g1Q'QV?KLnS[PC[7#,&J*Ekl!&1rQ#&bqY7sa5-0\X +mJZ%=IGXeo6=WP_O;/1qV>Pk=",SK1du=0Lm`Q)O +*1pqLPMYt`JALgnN+Z%b8b3Lp!.5:sPVRY/"o\qN_`:.MfUpn8!r\q20X,RKQ2>bBUY7rQ +fE;SX6fW,^$iK'RmjYT3P:[q"n(Kd!cTk.eH>9n/ +VZ,>JGXd_ja%cdfr*,XF87\%0;^6l5rJ@>SIYm'c4=ce?oCc(*pR?qc]A\7Fjbln_K43:E.KV +F=]AXMdoO976Hp1]A(^&/i,u@@2(pC'e$tPVian&c1]AOKH2ZF')(%o%;1nmn<>tTG&DaSoDR9N +e[4ZUB_od1@/Xfr?^F2l7mG,8-"P$-RU^Gt%P#U"#O86,YtqW?mR0HjJo3'L]A@Ss:"69c?(B +2&Lg0+Km*pA)hd3UjsRs#H;ce5:kM*OeIP/_Q2_1)$TRoj2Y3%sj\f+'r8"$8u5s +n"\TVnjVa2%_]A\9LXPK$@"o]A8^hUQ+`o4PagM&:4G8*c7dps6rNk*s^T!U=dTpdiA2r:O9i +l%d0dk[5(!WGZ^/*-dP3Dem!C4WK+_#HS6Dq9HU_j':(dT$H2WZZZWr1S+X,GLM6,_Jkk\FQ +&aqQQ,Ag[d+N((!ONZJ;;N2`hk/=i_[$jL$nYlqb53Vn]Am!Vgao2[NFsp%7X!8rW7H*3+\V0 +j;AF$*T;Wu.ni,gT'XW +MdX.FGoh#kB?FEtfPrq#rHqO,o?[4bf4P6VL$"1eg\C&W+Ia?bb;FFD>fA&GM#.2a-(_n32B +;21GSnP*fG@*>jSGq05iQ6b,,IR'>@Vo:]A;g&44+f/POgTS\*4hO)H8Q*k:9q-k'SZ*[F1+L +TU%!3QC@&auiC61J/1!W*W%eH_p;q>@FeerH)J7BpT*@.8%urbjN]A4j+)\hbgZ9qIhqIhYEi:K]A+,dSdP;;njns4o6P$nT@RhcT]A^[4pl^f'#Y +?JEEa8aElYiTNoXd$bCCL^)G;\og2KZgffD#&e98t/V*sbFA$ArAH+%I86#Cf=(E(\P#I]AGI +F>(I("S@P/%4dM_9nmai:3QQ_Je*7tkhl[X/=%+-JDJlb$muQG?S9pI=TIa:dod(p=AJ2El7 +;>Wo0L9A-&82qFkG;iVOHBkkE1*/c%J[Hus0kf88pg-P[;P@f-(P[;2ph=+[_H:[j)euJ[XN +#J?>Rcu&l-5T0F<$`tS$aguL[tTl:j0b>k]A\f<2*#3R2]AW4WC:8b# +,p9PangnTL<7#7Tf:`@WcR*KDg=Y&&@68'tK%KX4)SA^ +)_Z!3\Y@#&mqbO&hJ\!:A#*TT34-9J827#pgP`imi85>2S'RqAR)J337O:3-]AIjR3rB:p/A& ++Di%n\*oE[IIn&Ip]AOtMUDBk%Oaq?9<2,2@_bZA!`AbN!%EE`eh,?`S4aKH6R*h=4NbghWFd +9\mQPeM"+rs@\O+NT_6MaUFZh[T23]ATqTFWO\Pu[67'A;g\J?*-N5`eM'"HS/7@WEdgjm;V]A +`>Q,NO/]A+X?.DUu%UPB::q>!DnV?H\!O_&`7rIQ!#fj]A6q&(^Q&u\"hW8B$hl"*ApM;D2`L` +q/oG'qM[G4ai9%UW5M9nV=936f.QV4mq:NJJ4P^Z$@;'?L.Oj:@&BaY +&8s\3CNK)(>5-unP9f$t[ok-Xc]AkjN(+S\JU3c8>5i45hdl18,(&J5V3N"q#B%d:nSK0N96m#XR=]Ajq3uj_\XH0>fVG,QrbL(o^jQg[D4tTr7H7L]Ar/@6X/@7c^%E +BTC(="SI4qs`G%;^V%"sjN?C7:D4i/pb%+)'-,Zi<5S!&Ep,"s_lcFU1*Ba3e7SA+T(g(Ijj +e3YV5[eQ5g8D>=R]AF; +W3Qe/o:/3n>F+s-u-.5'JT)m/9;(`f*LV#OZq4M.PIeM;Kffp]AC+D&_R';#b=0m'lQ]Aibr +h[l?fn\P0p?1E+uW*+2sm3POt4=ruo]A +q:"Mn<*."rqQb/XB*B@XT%u+IKrmL]ATnGH?.]A(Hh8hb7lh6I^[9jk(p%&EKumBsi65]Aob'9q +?`V>@Z2S@j58C\88`cB33.!r%1O'kP8*oY(F@h_EQ_/^sl9J.D4)%j&WeQS$>%97u%7-k:9? +b_'_D^2o]ASOY3?0Fu.Bj8sK0(95aAMbS[_%,Z6(q3U8iD2>AaLt`a1`Z"fC?SRqtLc$l_/I$ +/2>*]AmlF0@l#`2()jKW[=XMqIGjF&gHT_'lZN`Q?q+0H*f5@:H6io&M.Q#Z[K6VYHe\-6j*N +8<>K"J/!Bqs7bthn-%G75>5D^`?o&;nnW"?Mm]A,?,SRh-U!=4pC0T$l?!^oC?AZ]A*ZJj"85VDL>s=W-JpVd6$>8p +`M<9nVo$h5]AT?6]Ao"MZr1-'jLY2Rq-6UPek%Amme%V"agTP@X. +hS!P@"\3\gOS#&?WEPOB'UPkiQA*t9]Am?fpeN"D1u)o>7XJ$uM53+n/fcDt5^&_6p\Y4rb6. +/+\U1qYS*WVl6Z#mu52)g]AN1]AhT;BRbrmsCp+CK,E+$/\YR!qj?&Kcjme6;RYk>E=F>+VmY4 +p]Ag#S\;Ir`rY$d\\F]AO=FhVmPu*!lj8F@=6U=#[4LD;#DA4ZkSZmuX/ipClT4SY& +3*2Zr5sAjJ/F;/\6`6+VJoFNIt.K65#<@Xr' +6?/`/fn/9M\f*l#tmU$]A.Hp05@;+P_*G-O]AB>\+)Xl4U'O$`St4#NY)fG"bG=O,QZG99RKif +5"5+W%]A7n+7:0$"D'U?GrPhj@\"hdD&6)s!L%03$1d&)HpBNCg^reP(td!s7EApc'9I3mk2` +o8b3RjCHm8'_G\S7)_,Pb?q0R%C?Gr[4"=m2h\fU8sKAP*C'[6T;BV458M$pTXWYpX<\ZnPR +oio_%lS)Wrp*e$!t6[4Xl>-$)[W1k-jRFN06P&!IS=(!U36[9QIrASgVC2Y0TLr7Ke0d2fVZ +#CTY=Q@#l4\DH>!]A!6Q>GX?da`eX>X4efTjXJrf/EM\8]AU)'b$KT_Re\Z/d3bSA_VS.36sMJ +N>#kf_Nc)<_JAPaL)&[%^.Um2N*41.m%B\>t@]AB&J_8bZf"Y#%qP8gY6b@BO)#>G+JQY_REo +cBBRO-$80=7AKrh99,2ZM$&;0'Pf^uM"9c"5&\\K1<*oKU_?KsH?l#&n\1ee1MbkNs1aAhB- +*rodcK.OOBPXaAQa=-e69S*92lU+ +<)MWR9M;EB1AK^O6XgXg/uHY`Wj]A(uo[Wn'mc\h!'r!MP]A(mGOQ):j*hjj":LbLC9[r&gZDT +ksFE%0ON;DA)p6gqkn%[@YAh8`MW9f,EfCf1,J!V0n,0#?7>N,q)POY]A.7kVbRg5C[Na8I7= +os2%_Z9F(RfAYE/,Xf^ug>`"#j)L^YD:LWo\IN6c9G`19$!'e;c20E@d!(uuddubhF46g9a@ +\Qe6i/[M2h;uIC0^u@<0l\Dr[C)!LN4/^&T^kZ&kQ<##'\p+DQQi\D_+H]A,5KgtE7lus1&\c +CG53<98(/$7I&3aj8ET2Xbd_2K[4);AiD+/#I=a"U/0l_4*p!,nYfnkR'#6GV)9V1-P\)e;= +'_9b_l=!?Sf]A_/TlH1jA2,0u_TBM:m^[;.;jeKN!j)gQ]A!#^g*&J]AFE9@2fYoKNjh=dHSb5" +_mUr%29:mkGRhb]AD0`J%5eJiea2\6?H\\"pQXSD4#t)^r\YV2P=gY2nBe>l3ghGT/[,U?W1# +I&(URU7u@pNOWkBoaAPD=6^"5rfuc4PABU,ngK^Hc74PnXZAZhrD+:@dI@mg)Phd2"0`0)_? +Ie69qfc@fn$ASJIGXF6cLY:f*-?O`A03io/M54D<8Eahce!L5HME=(bD0iQl&;"(]A +&fnLb?lrrjctBKT@9i3a%LkVl0"Eh`ksM'/HW5!slfpfRRD+>:,FN]Aa7$Y(),M@^Op'(T\k9 +u:]At7cCktg5QXb,'0sRts.3qsIb]Af-W-AtkA"r0- +hO+-Yrk*$4J9bg>r%T6*.>RWBNeaF_T3OGeS;jUjp6.B%7Y&F#Mk_'gZsn43IAba[\k]AU4-o +UO9E?JXE(g%_04hKG$tS\t4+8;L47+n\W:ub`2#P5:'sRm:[,UJk5J?H?I3(aqa%EJgaFURj +iV5,W9*(+>fB=O&+[UsU+4a@aeY\cgV>mg.EAX5QS(+5!#58M[D4*nNMi0YoA[%\[OI+kn=I +1p@ZiI^fqM^T#P%4qa,<=R5"5UK@Q4N[0Cr"5j?uEm_dWE+E7Us7-"W91ijQ!Jg!m +K-#e.W-5Kbe2:2YF'qa,qg:+%gs5H*mf\9O.Z;_GY)Nh@*`A:pT4\Gi9luWLiI3D8m`hV-=s +]AQm$=0;CNB_OT=i]A3650+!CK!bS`MUPMQ7r`ZoFl/tV%.`c*O6=)WRG))cRJg[[PfM'2h3h[ +n4E$)6b>Z_G6*\j"e(*+alKWq8PN)I.6q)$ZD@')"C)p-c:Rt+,)&fT*!AP +p%9U)?*Wd9m!Mdm\=DF4a^FmXjAg%Bg&JK6(:U\HQ^\1H)=M]A3a&jLeI' +G@=pr)5KV,B)rc8Kf6NP\G/\bnLi#7KfMmU4]AsogS@+@$Y^&&@O"PHpa-A@]A(IFC7L:&oDXV +&cIBPjr6;*+tJflcF]AP9ABTm6\TEOtE/pPPt;n#6):!LMBAuATRTYA/qZcaF9H]A32sJ;L+1/ +ea/t5*&!`ECqG^)Ia]A:l>gJ=>89MWT#'oc3Q[!3N&FM0)Kn\u&Da[ +uN.P3X;rjJ/^/FiMsEli`"d!2oM>T3e$l-A:O''Gto(eJ1)g>i\FC,]Af/r^GPoZU(nI"Yhjc +Sr[s+/8/248+,L!j!1`8IO;,)aXT(]AAD:N/?;P6_rsnu^MOcC8A8=B-;mN$INiScR%9m=W_3 +YY^7SJ.,lO]A_lV8^(pPb/VTL#+J5Z!?r_?Y"Xd`\=C]A;'a7sg&1-cZ4"0tII@f,'mH=uB^>5 +XFCsNm$*gJtNfM,*EFXc5[//70nb`o=O;DZCgm*j3a:eG0B0$RU%]AqLqt16=ocNuDRi3B,uM./[%I/=D'2;V3J +NaW@SU7@E&\2+_%Km)&LP'UYO5$9GU&&U.E4'Q)1U9&'m6YF:r]A\:Wi^!'fjsD:l/nokltdY +]AjTQ&%0W.St0;-HN<\Ms#Qn-,BA2K@c.q=LPfIje$)\qq9hn+6'1K[Zo0Wn;56^;:7AY_SJs +,jF]AQO[_;$ko5*=MF)K/0miE'q7p2N]AA?$=EP)X'@:"et=6[^=Mtdnf3N13rHP]A1DOX\7(n_ +,IhpHBCt*CH_1q$'$4FWV3,Y#,!9B3F1qhnRQgaKJ+oCO +:D!O8)CC?Cl6Oene90AQ%TEn\_,sQ\Bs$.VJa+[?d>s?9-K!`5JX.8D!k=p$5[p4[tU#m(%7 +lITl<2cI((M,g+5d>V9^+/C[oIWM):[6@j\$n_7@j%@fNS;7[E0SdA5AVW/ik'E.X,?"%/?d +qGU-:X`=$jXJ-lopN6@f]Ab(.kq#\aA`KP-nUQQZik>)Ab,8D6coK:BBDOAHbpS4]A"0l"Qr=%U/RSi(C?M?DNopL/HChD]A?G0.?7I$TV +S1fV34q5%TV/7:L-kI?ClQmXG;?8Tg<%D\YZoFi]AoC,\, +8Fu?s-eI#ojJV(:r?"JFq0cGT"U,BWSmj&hRMXEVb]As5SL%JaG)r^HbQLFu:(u"l%+fo'IPN +rFg:I(Fp$$f^B:t1)7?0An%bKp5FMXPOm9TU\%TS/c#jB#-G+`oYN97U?q2C+D85%*/R)r!E +i/,18Y4g^lXtS+oqMLJsbO\@JKtj]AJ,).T`,[slPW$4RYa+mp.Di==HVZ?4C-rpeedna#5=C +s4MhmYQ;1I(;,$6;EoSXc.8eTj&]AI5af=''MJ?^mFes=e%\[MSEaRG9]A:-jQ,CEg5Olq(_ot +e5'`_uDH!'3;ai\l"H0I!QiuUT,qC4RClh?A4ad%OPCUg5;V:=Y0k(^))e@cm26#L>Fe\fcV +Es%%C<_':MK]AqMm!=gj +McRu/#@kABI6H@0]A`WAmWNq\MFQlag^CceE3UK.ZKgqpP`RiZVSGWEiYIJbNI6Z%.6I*hGOW +Ks=):pj%QYp&9U$b]A?aT3D^Z%=jB4,]Aq&RCC0?dl'\.fWS.%jbK]ARU,M*>+3;nXLa:#`1kWV +HO!tJLY$"<-KCA9cU5V-3T:P@Ogse(TqqKDYibc(7+EE_d[8%%YjuRm_;G% +X&K[5Auo!l2(:\L['*]AqXk6kP/VEjjp +O]Ao@gqQFtD)*_?\4;NF)\(YS/fOWk,?`NqP(:"'A\8SQsV!KTP#OZAF<71ro+*fRQ"E`5'Kf +4WaIHG9RNJCt.FhOe;%[)B,'E3i3AsQt?REPJJQBL.#(Og14%V[!BbT>kJGi#JE1I::[bC/02PCRB`ID_<'9]Aen\D*R=b?acX3bEBX4BoL +r-:aibX`KreTAqa:lf&RsOs1N=D&%0=Db<,^hG_Vc1a-V$fX!n[sdV*ZK8K$I?fNQX.X4<=K +cQ&/U1FE+Tpa%\5Aj-gqYk#B[h8VD]A623t$Y_!*BEt&N?(;]A8,KVHb1]AN +GIQH%X[?)!_l`.4MM)E[^.6ui0?%=;gWbs!(XK,_pm6fp\\'.[R[^W'9o?n5!%)G>Y^B*/4< +H\JY3r]A;2B'l8r*l"e61gm$2>A;6DB%^!jf&.4TC^oZG*Y?_I=?N:QkLfedC[[VF.P)`"ZfZ +Xg34Y!/,!_9Zj0P7qZ47@TBinV:m)/X5e,H663*h[Lu&`G*t:&#:NcB!*Pn]APdhe@Lc.<\<`9,Y#W-pYVVeLI1=>/-oG&#tfRG?I`_p%ciYeQE2co4>RDU,9]A+PmE+.!u!nqo]AL"JP +2d)%IutY[FWU=@`okhY?@FQO8#rj!iKXWh^nO_>epJSGLLum9JVq5<@XT&'XDL1\gb_%h79: +^D5&-k'gm3<";j21fE)Q8NeZ:K77D94QG87aYjg9)BH,4s5p)2pM0kS#8@(aF5bd=LRCQ)C+ +p-c!7(i@3"s51f+%<1Rc)bY1`(Wuj`g\@K +17$(B%1ISn7fOL=#88Gp"*H9`\3!:opXMVkaMJb[MErlsedaB%CSV!BVl%+u:K'SP.=!$Wuo +r)ahd(:=5iVjUIf6:>6FjE4fQToSPYZJatO5I=XcA'\6.eAV$o!.ofSFpe3'.,0ki"=kPd1n +[o+*"!/=%7X$]A:AC*k+iSZ\.Z;3"=Pkc^nuT'lV+(;#o9[)Z+`B-:QDo=mgnmGpY7!Ue%OS` +bP7MJ!e6U2sA)j^r+;CnuHmYQ-)?SSDaf(rtG7*:0!]Aj)\6BFi[W:DfQYb[mPV;p=!GjL/=F +1B6-p<8JS?Nof\DZb1q*D=Sl!e3mBXPOsFVhb+Kn;L[gDp1+?i@8U:=B@A^1,TZR*6@B*$ubXr@, +,\nE*'ps@8+fC&m[at.'a`)ZVIDe58HPSZ"UH)#gPRf.eR0tXqp^2sedji_u%3T@9p('O:[q +>g[0_h`07^6'09WZfdqBc6FN7kIM2b2O:leFaT:QK]ANmFn*me,?Aq3%M.7:KJQY4Ug_[rDDu +KkSo5/1d0mkW:QSM]Af(V;CasaB-EgWXX,iGg69iGV`np2'W?DuJp@aA4N-jEnGOMU5YW987# +6?q6lj5Y^l0A^:XDtCFW#-7T>5J(dKNYbGn<"r$WUjkk4$#IT%C>"[CR)G\U"A#blda_C"mm +MJn_f+!-f+a$U:Mr9Rk@kYp)OOV6+dTnBrniAUZ1>gBB[76/88Z5PK^Ar6__(CH(g.R;Dl4]A +"/[kM\ojg=#b"e&A]A#b5ia1-S='Bq@O94b`ENc,r"%`Q/Y]AnCKRET@>ed%Jch8mg\=-co+=( +DQL;q*otQuZ23G:+mj/%$]A))JO(.B?Eg-]A7%5E=>_<"VC\2s\2#j'h6i/?K*#IK*+\ZtSJ!J +Me/OhWP-!J#L8&R^#%]Ae<%Bb&Ep$8kFlAF1D[Q`AA?3if4lqCf6OojG]AaMTs2>=K&UJubpk. +o"2O,jnj.ZF9$1(4a'1K^9=q6uH9Nok6o9S.dfc\"]AT@;tB#^&p1IAaW*tB&b"LY>mVE$%NU +'r9j(sQHFlS2heK8`Kl-`!kOqJKC0^a?921K)oZ]ASHQ+SWZ@38Cu]A_Gnagf48J:1e4j:>W*N +nQqB[C]AboWp=CJK-%A%A$k/md6(q$/Z"(iNZlOJU+E'Ub.!#a`JA>"u&[rp4`m;V0G!K[rj: +b-_L6T]A/Q,bi-Ci)VkIA\`&:'H0bZM#.@CfVu<02H.<]A17t]A`ZW"0p?n!l8p>^KhS"8e)[bt +TMA]A:j^V2gGrUTSGs1q$RX1o4:W7AB1j':^RL%:>"B0*r9[]AgVAjFc:7LV:B-3K:*!,<`-.W +gXN-pUhq)Eh*GH`u%@NkenbmP.E]A^T^FQ$B@.cl[MCX*>ZL[p;<3)f*7t1n=KMJFL(kSI9i8 +'BfESd/1h@iiZ>XksA`_,jHVGn2#,U3K@Da9oRbMqOD22N2VglQnCEbO-YMX?'n8!SQmHWE* +h62O+;L0p::"6l=#T.b?+5k?[m? +'DYFgeirP.l4s/kG?"1dR0BhmJ-Can[=\FACjTS$#f;g+)L\0pY>4=G:emkY#joLphVAt(KO +#>t,N>W06#T0115a7S#^(K]AW(UoXJZs>G4=tUlop&c\KZ#2Aa-kr\h]AdJlU?rY;b4G +K)pl%ZE?Sg%1Bd5#?MKhZRoR5?4c:CQ[:rT4HruDJ_CD4E1MFj9%>[Voa'&2JCZdDk[H!Z3# +CHk-koFX!/?D<5OQ#(Kn:ECT]A#iW3OHdT=BeTR?b9MDOsm@pOJ,:tS=qQik.)5.IZ#\@B9%5p0F$6V=0g+8qZA't'D?]Ahc[Y0FCi[I8:@;D+qjHn,)!%:5NT@l,> +-+#4aYY4 +,JkgVl4)^W39PY@YkT,>k:hL\M]AeraJ+R7b%kl$^>9_Q.E`6g!T08_1'9a&iOc#KpaN5Z%XW +E.Vp"G\cO6KJ(i=KU]AfZHkB'`V5fG>IPcHMOETS<5Nm7f499g+Z-n0he&*aD#7a:-HpEoEV" +g)u4]A\\7D!YB3/?sMlU$R$,)I;Y:Pot=Xoq50!;*\eu>$cQ3F5b_ZHk?"Jn)WFfgP5iQn6qC +"YJ,J"GOFO9om6.oH%ISP?0?IoW1'GIl]Aop<^oe +Crd^Z8[/oCe>`$@l\8T!9gc`ML%Tli#4%hCDnFP%jgUu>MOf<5h)`#BJ_E,"RL%iK<02oK.8 +lrtGtg8Ui;^M#X8]Au&6GCdH7A)VWjb`,S.+Fgp99Y!a-7fF;cT,'`$B%-=a=B4kk&XKYSfCM +Tu8g9*OL)ml/RV_!(`R`,*3i'kA;PgTeWoOGp#"p5q:*q4.Q6&s^M(U@;&CQhjNrmSt]A#Y\h +1#Ok4WB[4Yj##7ol"iob)PC]Ac +Z!\(8;ujK?:3;UR`B/e25LjB0<<`3LUGkt"0$gf3Zt!Y``1jBhX!$\;'T(Odec-KZ:8lj*^3 +aM%08o"t45\aN0EZIS9]A.BXub.U__nTK3q(BpG]A>0[\\]A4p"0J(ZJ=YLE*HYI."gtM&a[?ubP0oMhF"di?c3=3i8TVLXcr`?p]A/Pcel7WT$8> +Lm1p@8\T<$jVZiQZHi*"KQohFr+A=N1/^**umep0h]AXpgN'@Ltf\^=pMB$;n]A[,3?!ME*i&S +6oCnFg!%RC1N(<-`W8oo+7;3aN0.!LlR2$KfD\FM'4OJ\@T\ +*qs"du$,<=ql:_GYZDH^54B13MXn@@SegMg9-W-Xep(mN!"i?<d9/QoJ.NBpEPh9m>Eih9;$DB\5n',c:U]A$.Ne,3P4XPO[><=UoOO=uE]A]Auk/?6K +)?[[&N,_dYbi\Y(2F]Ab:$eM3j`,CKG$&^-n#+NXE[a\AcLri62uCD+(WH;G#(Zacb$d"HD.E0Fmt#^am<)hF\5;BQb(fDmhgMFpC"b+:S-2jLZp@^qVGb8(3 +*:!10*;Vp_q.8QkY73As@E)JV>nmDIR-1q;VilTV1t^*"oc&3U(]A`i6)4AYsVY2,o`>!E$X) +dGF+chD'ao=40)b)8_/*eNYA_V5;./PG8('IQ'QgWNOoam89N1f6qjnl]AD=)SrYm&f=?&i08 ++car*+aN2H+bF82J!s>Qh^(aC=oJJOuFmB#+&blt_;2/D:VU/2qih=Q>Q!^Y09LZp8bnseLQtL)?@B +H+@K`*$4dKVbA657?BH)\XEq:LiDN+CO_r81bbK;U1TR9+8ctoQ=a8KU^AjYS0Ld*@nc/3]AZ +#k`5u/`@IB\A/@`?72$N#fKK"`ug"-$^Sfk\%b*cdL95?IF33OA`AAo"gV%R"LsheYEG'-X/ +ANqMdAMa/S,`(r=;#Ic$?^6gU=MfUSE*dpRJ[BcM^/T)-F=(;l'5V]AY(Ea*]A#,i,buLjL_md +RCR:3O\6`n,&5ZGI3H\>-&jM(GI)Md]A;gn71q[5km<"s(U`mW;`SGj-=8)]Ab:a0RO*5Vr-#q +N-MS#k=!"4PlU-(^g.K^ePP%GP>Gb<"INu`E3L4@?*2ap!D.)r?CDRc-'r'-T>/R[Yo^"_uP +X)0gKA[/*(s)[M^>I!Z,`h7@l\QnsEdSFlftIC& +c_m_TD"L?t.Z+fP'rA7OLU"idLgb.oYLQe!Ob2*+a'F"\JOUh8H-gn3S%g;NUZ"I5C +n_%&&iCCHXF"s,+jRm:]A5[ue>/AefZ:"ug!tP6?/$6I:k*UqSek50ZTtIZ;_o5/mP:7c$[@n +c[kK>-g+?2Y,7`5C$HAUU!@7PCCE&agX'j.iO"=XQiXjfsCb6C*52+cEh!@?l1Dat%>LPJ2` +#2`aoT4J"b=T&0[13rH`]AiUdb.9(e9ogncfmSsqr'E4#)hqUGqq$fdnXO$<2+L)!?fR-_cAm +o]ARtjokP.ON)o'#K*;:_&"DjU;/>/POZ\`>=9\0d1RppJuUK1b#P?9.d5=k\-mXJ0hth6VRJ +q8tG\eUg0,5;OCW:Z=mK-5i`)cN-Wf-Vn4>Z3bG8K=n#Uc_+b2&,?M7K%+!rUij@f7COnu[q +,?0Ycr)aaRF.*KDQk;o&WYD>@pdrN04qS+-2qR'>o_:aKEb!#Kg@>]A/7JaQ'^C/0.)e4f7R8oG[G>+KZ/1hT$rN9';8+gF;7Uk,f^uhWb`Cj&=Uh!<[/3B1bM-:TG^S +^@UhSCTGe.a3:WNq-0ER8*37S^H3'?UX$OCq+&]A6]AX`qakEE-3OH9l'%MFq]AQ"6\5UPh+ePh +%V[!Fcjn6#+^1g;!T@c=ZV5G+fXqQHKTO:tQA,+"cC7%`Z<"^`X?2BM=5NPpfH`#hd%3#WMq +-C.HD9PR&nUGk%N?Itf,cPfpW"i37=Z8Gf&BAOM%QJp5VODr8ifH.fPLr=g,fc7ne0M($Hd3 +7t>?oc;Y8oG2&"#TSOM["6V;h`'QItPVG;1C?0)0I>rNh.:VBC@6$5qjiW379d%bT +/_>TE>C$ZQ-V^:`g:'O*-s?fELN$'Kr&#gk.cn-9j^^tML25[:_bBPS!9nH7D[Z0bK_olm+H +kJrV!ST.\/aH@?U2#TMHhYoguU$)$)mU2gc>@GjNV*3+%]AZPmX5*\-*gL@KC5b-*m^u"/,;C +/%S,TN$Q#EVL`nGu&;FeeF!lW;?c*W +eq?M\$I=9/1Z,D*;@[Eu)n6TO67Z:aR!MfC6(\:df]A5gpSR5D:SL@P$`1_U'dH;)Q.c1#lo" +j!h":elDB+AFnlrN/+7b2M+m'M+Em[W62;gYTkJ@pLmfX+N;T;=<]AG:UsVql0<^7*LG7rEoX +u;<:HDli8&Ul^UGM#.La5c"Yhk-;\Wm3E&mRg[R)pM9QZ/f1H\jh,VcYIotA^/nsV&p)TiYcF?4P-cVj-g(TSahr&ol(u55lKO\YJMTZ +S0Gg&&d]A@7,V?EqMD2*PhCZ"uIQOCm8*\`EHFAMn2=!!t3i<<5R`'%$a_[R$5lA"d4B8628K +eZ6Le?YnW2fIOmKlBujZk3<7Z#fI^LHd@0+CY?(Mh`YT2i6e05u]A\LTs/JOj*fXfA=2%8MKh +Hounj1jr5RBbQ$"W:7p;`(KYT]A9o*Vh[T=UNHPPbm-^k, +$f]ANFmG-qCCs7G.NlSnLMT;jr\^0B4QC\m.mhR.<=Jdk7-BhfLQo$)HhqrdUq(t8h8n7e@)$ +ft$V)b3$\.G18m,ZIC4MZ_q[P:)f!\*[_FCO)k]A9A3eeW[Sk +#dt[kuqJT[",!,MfW.d70/,hXU_RLVj5 +;cV(4MlfHP5m!BE+=;[LK.R34MGo#R83P9_]AMLMF&`G2kr!T`eYh6jm;!^unM)a^inC(?Fn" +4*(?XfK9`=s=T,'Md?M(0XLu2WBP%cD+J$[JGi@W^U4h_8(\K-rB)O'IB4ZtO???'h-_2'c!\Mu]AiKolWGK2sg/Tn-q*MPp]A>grY%r0@Pi`jTjP(C\$Q49aPCLk=;P4uNgW +.[!jOFD5QqLrpB2;YCH$SqOJ5,5W`KQmg'e]A#aSV#F8%B8V$C+H7f#Z_p)MQ#fUaf!R$ +dTJlQD`?Nk;/3HJi)A^G"0NQgS#ZIEq\AA^tU!5[j@BB_9'[-o_M[AE6jT;)Ja@pu/.L^"U* +lESE7Eg9EUi.+_g?f'S\_fUq>e[i;s'cf8B>bW0EPFX*s27Uk(gIB?X7o;A-8kZi3E8$!$L,jh>;Io\gGY +Zp8cd%0q)@@QHHUaB0*)[9l'SXPk@4q_>+mfK7,ER43gT;Sr0V,0Qj=i?=aKdq#7d4TZ>)m> +Bel/a'>sm\dccrorL[P^.Xh!+r7m-BRrZ`lLO` +r>iB6ZL,f(iin[cj^UH>L!u>s-lpIMD"[>,f5,gT!_Z=YtW;c=,m;o5_JHrG^EJh +`36O@X#@SH`2b7s#4DX3sqH1WN)g2f7,[%NDg,CHaA_)3EFcTAO3/o]A%TA]AH7h*&-Do>r49Ef=.8M;Y%uekY*nlEuBe#;cH.kCb +>6S>$<#`q"CVfPJmm5^iUWWdHpnS+rn)n^VQF`mODK3F9VWLR"+8?dSR]A-bj>rZVfnmJ%A\k%C/`W +s/QrZ57d3Fr$kIFiB31,J$,oKFQ8-,br/b;Nhq>(oiH/h^B,/9/^a2dp)nHJc'G_@3R5D8*Z +2Zc!Q7r;MK*[^mR$)6N[doEh0+gueK"rFG#i"iKD&mB)>mREn"JI_*SaW:la#emB4l'mj+gi +-/'B',T+>Tr\LZA1i>d\@RpIgB7g".B2rg7S%"?V$k`MA26++*-W6rie7\!)7C?%EiQc9\=; +Yb/bBaX3/LXe6RbiCmtpb/PFg4W!?tt.'T84SB.M$Clo[6GJ\VbpB_2`k>GJ/38M,dW0\*TG +_527Ye5`um,r)E74%uRabkO]A]A7"Ni\DCr. +iJdMQF,O17LRh41SjBHP\(=8N2Z1#GXmBS-h#qP:=cU8'[^8A+$=cJe. +`SLhb7Z6?Zf"=[Dl`jE_K^H`A`b9O#c;0YVQf,E(^@0Y6Wjq3>okWWJ>Cl#b7u>XAW">ra`8 +>m#cQeZ-d#lA`Xc-?9Rs??G:fdFc*(oEp9&.o>)P$dqrmZqsbVg%(Wh-oQ7[/Hd#">nQt/Q4 +7\T@4tefV9R%4p@98k*rWcpbGeGDZ*q&Hj!fM?;Z[`$uhK)dHe+1`ms5]AY8fW/"S:i=[&qAJ +T9cmokP3,i98bDWPP/SBYTR>^pJ"i;^13K^YF/(PaqY8%r;rY72k>uQ58Re!U]A*,'Epl0]A1[ +iLQ7HqI/><;EDj3S0%*h;q<>A\Z\MJD7h?Qi\(q67G"!XCVuhBnK\b3D=-`/H,W@JPWB42E- +$4=59)>#*=Db9l>aXHAX&FDbh12q@n?MZYM!kM&,mGG$iY-]A%aPdGl/"u;dE+.;Eem3rbSAFrZBOkK*^]A[^3;8&ZO)taXuCM'-8/]A%8l/X"'tUErL*LO,rB2 +?SPo;2Y8Wne&M:k,'If6k@%Yi7JVNid"NUmqbaT':W-cPs0Q*ST20+aC#jO^)Or9?JGAJ>&Y +^T#R`aBGK&lKXr0>f=OrkD-b,p4_7NpQAXR=-HH@d#1Lf^9G?WK=jRhoSp-e>cL#[^*3C\\3 +!SUpmK6&Z7T]AEkks3$Xo<(mh+@,@EQ-$[fL0rqF +"FE)1#MZIH)QDp+cWoK"NAb3NFaE\-MDrbmq%sZlnp1Tj:8cA%I&/F.f72C4jZdgEJC:0p-2 +IY$a9KPNfBaSa.Q_"LoX4JQs3``B&rRRK&4$;hIOfUBjG=02maK

UH.S"Yk5t]A7_*H%@J#8rh]A5Q+`Y#9/9("+Jg_@*8]AW!\B2rA +O[]Ae?u64_!7p-7!5F1JBS<5eo5J%hYT56&GBn`4T-'&YHa>Yc]AiDDT)=Sop^[3htcR:4pe[Y +kCna8/sF*bO2[i`*Kf>l[;M]Ah!=/tj5OB@^n>Tcf0kq:VLt^PPm29j2m!r-E)>U,`qZ`#J(* +jFSbtOijMs^9:+]A46*inslf&Jh,R3i_CQ-&l?OJ^aD\h92%6L=c+T\+L!4j[Y7%Ei>bF0*;[ +*ZR-#_YE0@1[8@=#'2!@8%W7j2L;!klH2WX^iXX2B&P6^hrF%@mUf?q[Yd?r&UnquBYEK"0\ +#i61]A9K"k(@?/9cn(IA09(-ENt;!L?8mSkJ`.!X)`f!8I4=?#R!5`OWM@fYV%Ih"[@/)lieP +7)Ogl43?0_K&kIe^qh#QqJF/+`dY8_*V.H`FcW"@ir=0eXE%RmZL8iLLM.FY>`CX86#e,(X2 +f!o'ids"$N%q&<$6(Ot&a&)^u>ZrA#MiA]A2"t>q!"Uj?sOiNJZMLanV\`+doZU9B%#ePriPm +s=o:=ZaLU=T!h2nRc(?ItG;?@"B88IPf"Y#"LC+?1I;&Md#a\*Pm3_670sNk"7j2M1A9T`Q6V)ub-s$j$K3O?HP[eLIamW,%NbJ45%)?Iqom]AD!me\4\Tt-$n\Vb2`,+5 +n,C$ZHW,eZtb=ujTn,(A*X=C(l0hQhd!f!!k.$fA7bVYs)YE4VM-(kM.[[A=.MSPAg.po4`cr +_]AE(%dSh1pi+aAcO6&lA,L#H):loEts0K+e89Y/M2OIPIdgr`;nmQ>P=oi!&<`tNcD*U1.@' +1=#,74rd3X@MdG$@r?Eel)cljVo3R!&2T9?ar/9Gq/A2jkXmka'Nlo'KY1 +e.cT#57c71l_=XOImdjp[q+>YX$]A7p?AaS)mkt@V"PdkRV`Tc+Bs#li1":(q-GM#k5iDtcA#qiG/(B8:)K>pmEh4tH<'5;M8E +XiGQG?,sUJS;r)FctfnaVPZCsO67u%Ttq+mJp(mn&dZ_cq;dNt8_*$ph[U0%s^cK<2Sr2o!# +h&>7U47L^!(FKJ*'h(rrC%n(=8bI>*F6%Z?'jln[j.hs_,_Xep:)M5kDZVmR:q^_"Ik&JB^^ +%S%,*#b=82e'k:DOXHC6.sB(SD:"nL9AH\A5n04dC9!@[@IdT,iO0&cH(>oY2n)cKS6-H.fS +r1Xa$BpgN?jRXA?4*Y0)^n6a^:P(p-'e;EQ\]A]AiI>'0e?!+mJBcgU3sQpk?Q\/9,2RK>u^t( +qVFPbHMV-Rc7Ps*Jl'&QDJ#!8M9-n_G9\R_ghC2GKlMJApA#T4n0Q:'[*Y+o,YhGBOTfd-_o +g!&i@[ChL"EB=*EIVaK.'K02@cgsbN\/>H0rjp9cFsQ=o-=^:@c$B1dQ>@):U$ioo&;2DLU3 +HI8mDX4l98t^ED/AUu>&nF%GfJ.%Yu\<3#mn0-Z4D;HQqdrK/@P&a(j_gL[rDZBo7G2Ge%G5 +i#4b5=#dtj5f:%qF%5'r&)F;1Y=BePkqo#nTK.ZfH)F.X9]ARJce;XLf0j?C-`%[5#aoR5k1L +"R$%JN[6n8H8DjZHt$Lr=OI)Dfqjm[P^C>qr7X_(o[Jo4\6A=`Ii=$V27qc2GNmN`HpW0PZD +88T@RY?fKN)^VBVcVH6VMkKqu0bc%1G'ktSm<]AOiKekW)=:?H#$M*Rq;^D4p-:X7Vf +H$r,p?0AJKBTXgjdbaLoLi:A;`V2]AgN+ +>de'EIKquee\"rdB_dd2T:OLY/j%?7G-:8dmP7ZuDd<-`T.L"bbYskia#YV+A9sr$sO&fH_: +pKgGhA^o#GF:`s8Z^!^(PjX=L+&";bNYSU,j2gthkkK6hu7@Z-qQq9+6#!@!$uf/HR*m6!ZK +I\I09u=B*Vp]ApAXRLch)JKDnD%4@UhKoG.2"C/+884VB0$%jJfSf/Xq9p9t*__ +p1SQ=ePFVL0!m+\,2@>fOdlFTgeb$:Yb;s1SIM'E@2J5g"d#q7-%49"?Sq4,Zj(@LEq#KOOf6JY)G2OmLsY*h;:"II29RWGokI.K0=G[ueLFA8=D%dEFf<_8$Dh!uV:-/.qF8Ud:PN"LV(+*A]Ark +Iuk*M?.AVTBd#3TbIQ=L>>;C5>_\nFm^Cl1=#8rE(P#Mfs5/";0'HaK8;'+f/1Inp#umdYl1 +qcioq<*;]A3S#JYu"!:-dab_68[b;d6G.u%,Sur2EN#2D.VQG#73'6Qq^jn?^mjndEqC%Z>s-fCna@>hHu#u81EI'MmkprbanGQnG7-7-&2B;;&b99MdeP8jhA<2j=u0n6+nWW$I69c\p4^09?pX[1Da-'Z]A6MdcT8c96H_AU +3;]A_)cAgUuUncM9mHSIHadEs.DJkjTa(i6i,7r'bE:1L7A&>kpZs\lJ]AJVsk-a>.6 +::3j:Y5"#A)pFRGnq?=T%gr$N@#q"oL)"PRT$LKuk1))c)Y@=]Ah'!9lX')j&icFR< +NB7S1/L&[/Oq=-irMZ57!Z[e4g/\[VQsoeM%Jtt\.D*Q.'C!VKXCY=.b9/sDJXEmNiF,EmDK +J*Rpc8.>GJq0Za=K#1M@4.(&C`Cg[PG-TCmcViCS,_+7BfXD-pV`R/Zs#GHul87qjHFpMU"b +/OW#62]A*;_XXdnBD?`k!XFpU09DHj^h.T[KnF@7<0M2[hmOHAjYiA-Um_mSOSUCigeJ2/'k& +7`ZUrDf[ta]A?$+!E;qoFE"C"]A3'^-\Si)&Z<9eCpjjn%FEX;Nmgh5=;-pB/6GD7oZO_2)JgR +7S?2a^QAbm7>)nTpTAF=ElZBVGQOT@Wt_'D9#-P2F6Ad(Yq?,SCok&eLg3Zf('0[\M3eR,$H +#cSo+(7BQa0U2DT\m,f??&nSiVYee^Z#7L\?=EV2X^,q*+42eHcJ/[5F5>_MUi9V:Bf +2O!im'P)&r(:;QBsq"Lfq6tN/($>nRWFN^?tgEr0D6VXtcV&J.f,A/`SiM:5Ba2@7[%>[\-c +F0<`+mT@K$c:=D5eeHV9Aq$fqhNf?]A_oj^)5]AMATk`reOsX0WfD&oUYUCi@3l$,+*e>-uaoJ +IH@bfOgHo2>,3"!s6E:d"H5U99"dp!O_pVpkjn]Ai8r"a85VBZ6uWIE.OP0usjc@"rVGjZqUu?"::a=EkJs.A+NG7YJ"N\k; +n(&?E`6?u4_4HkI7\+GnMs%:9RAZ$kJL%X"&DW]A_SS"@&uLBTEb)+>6]AkO+QX`A\6t@Vcb/K +C/;=J\*&o8ifr]AtSdn%0Ce]A9PX>raI,K>=G&W;EiF=[t+$FEPJn?jo\aEWAl+/bCb=@jhC:\ +^7J]AA\D=.J_!9Hnectj\W4,-8.#j4T"#?>`94Khg76Mfj3=T3?,&R;uZJHrghG9il:Qde0>K +fBj-5R1&^1iGJNQi[APN.&-,f*S6[qdY(@X\,@$2FL"_1E0d5OGk/RX`nul^!mVUR*6;bif= +GXhgk:j_WgV=Y=.MT.XE2Z^UeJRgD`55+A\[&)m6[Pf.(n2sa#$_;ZhG[shbF7Z^&O=ghb*b +"X*C'+D]A[\XL8p+G`SB.Rc++c_m:/3EB.6]AgTbAJZ36-IlUf:p0Z_n\Z1!+=R1k'7>^#9N%U +_3"(QFqZE)^7)5EI3Zkhm%:C_:LO;*I[#WgUo!pCp@e2J1*\)d`B>[#J>oE&.8&bJR;Ar(Lb +mfnrU4K9^35J;XK3cgjH"B%rNS^oF(()nMgh@4#/9H=)`]AsTA9`<0c<\_R%E0]A.&AB +$SV]A[n37$AqE"G\<'/pX"V>p`,1CeBcJ0A2p'Fdpl^\R/c&DFMWdaagb0]AP/[Mu`X"f=)R6e +'t1V>N4.(Y<4T$C#C(+Z/q+.CK/sN`YSPFfm;HH%"Q#`1%:NX]AJJZ?]A!`),3W$;M_VT"7)C) +lnqG?s"8;=.o,d!.d?]AZ2h2J>r@i>-dVcXd).2oWj6+9TVm\Km3%GfrCe`r9R<7pTWqYQs93`HY7'JqW+'P[qn:W +W8u'2hcdiJ49=)R@$k,eE1K!AQ(7aK&7:LNs/2N4s^8D".I=Jed)Aql-N)'HR2lV@\*,FS?m\7YX=86S%BaU!hZS/,JJT$(9l<, +K^(`G_T4K<"'>BrB7O0 +QBYOZrbfi+jq'c;Q:DAXR>Tbf7`T&^?8.Rn-VK/P>cK0gkoA);@-L@m]AtmN]A6-A-]AKTIup(?g,so%)6/RPrU=O97$mFH'_WS]A>m06LWi6*?eS]AebdH\G]Ak+i?2Y7(uom +'Teh'*I4)VbE@-QJbFhh_Qu(EiorVQ)gL+psVUIIdsP9@\bi?!SPgi`BrZ_`IkC(]AGt=#DS) +Jp_bVAQ[pHMlPu/EtQ?`M6j%2sqR<4&-^,d#H5C*egT3]At0[A-P/h\R;Jla:GZjj?`i,Vg6- +RXG\'!`"3I`UsYTkc3grQh[8XSSu;.U!M]A()Ge3GoOZ7Z<\fdb%"OpOp&r)9&X\04WA=1%S7 +4NuL=QIZdeQgO6FVHh8]A(jQP1%dKelE22F+PhQh[=Y''5R*7a9gar%k"[;ALQ"H=Vh1k4WKD +l&C1=dqRjd+'`/*!ejUQr[pFU\iS+^^[9Gq%AS"I(d@5]Am3tc@C4,/i-5gR359G7_ +*N!H,nCU:G2(4-e&djX^8i8&#S8M2NEZ4N_b\q_atfAu0lP[2_PiVNLKuS?QU>G(38]A+'o/> +<@1uPd$HZHN]AK^Xr5JMO`Abc&5sFGO:#.%UHjaN)(,'9=$`4RT\2@"^J\fQi60G7/:ZiLiN1cEFaOeS8iQo;q/:PVtbYJWC +!PhZMd&HD>ZgX)]AO'.EO]AXQJphiKi0tVDp&RS5TUcVI-ubX$cF.$0Y21h8P&;LjSPOV?&aN> +fprca_Vr1k':J`)f)+&Tom6E'G9%%SXZ9i8;_8Ja>7u+)D.E=f +A;Ob[NU%6H8H2D7JR7X#Z'1&SZgO+0Y7M9Zhi9b,"O52?oT,Un7hGjMK4NtX^@j\p[hiC"g/h?+R-\t8$IfImKKpIm:\G?'N@$%N9nO) +dDT(L=ji59@%Xba4Pt9Yjr?1&\]Ao?/HVL3'JpZ'0,^q`p`*%ankT^2=#5mBOsAC$eWODT[c( +".RH-q[tLI;>,d\%FgJ#E4G(Ea#KA@,E+ipn8M('"M17_Xtm^da7H2?edB`40[pR>["Q4qIY +",euKFS='YXkDH>PRXHo>jLX$aHX;5R/X([e(h*K]A\YjGu84o!pP=Zr5(l0n'os3f-!Rm$as +h#$Q&$,,b')!$E@iM5OO'GCeVSQK6QI-.%7(Q'%"P`4@;e/FdnbDMOYql10/GdTjn^[XY/pa +g8]A$^CfWW:<-D$=sH7PI^o[^OW4OnD`T'>c5up#fQD +u!Yg&L6A"IR5O/kA[g1R2WnTi(6W$?%F5%\aW),5FJ:O0oQ&^%1K$8?n$HN]AWrP3_S]A,17eS +[%g1YPY3+Ej!g9NCelM*9_$Y=C(MA*:tn=W`6'n7:tZjb!2]A=lh=kjl]AWpi7@t.T#qA\A)#m +M/TO9MhpMQdJDh"YZi-/lDKMtN^]Am4p5[G"$o^]A@ga]Aj[=(]A,+;ODK<1IrXC/"V>HbU.MDA- +Tjs`;,Q1:PXFWD/n&Q7*j!=rDbT.kC6Kr".nV"j!m^IuEahgZGJPi^a"l1/j\:]AtIq)nBkRZ +^YQ]ACl/'!C4pGV!1j@U!EJ@h`MVK!+-Ro_+`9^q^d5'As;+>/%sP-'jD4Jc<$'cd5b@5[bZ0 +&+Ec#I2^Vm7@$QLkkFaa1YeoFa(:#4.S!'!r?D7@)-WmA4hURPH*`?O'(Ro?hLhYhoH +Z6bqn!AJ&Kmh&1+>)T!*X^<]AM1@9W6J^Rn1!AeJ'K.f*im0@2E_,%6kC$'l0,Pr2l`m0^iWkt9a8>Z)cSYA#;C@i)jU=0CIgGI&UZn5JgYu*S*`!F@5P7'U!oD,Y +%.&Y9i+M%pO(QZko6B8hR@&%#R!g6@NUgJl"ecc\\<.-jCTm,;^nk.BU'a?&H'luCfYNpKe#q:R:mHDcBuE#O4>KC,05fs +LH*B(NT\5b25F?ULi\q?(If%?&=iPspT)+QD>]AY6%@F6GE^Qk&BIddjWp0D,[!7$h_c)IB/- +*E6N"Y9d7%G_b^&i'm>@M&N&uGIB9=]ArkptHlH\a,[p.\M=i(Q3HLcuSn"12,2rZW,=O2*FjA&Pt(W/OlBeWiN3!A7Zm4kf? +PqYSIGe%+,g?fIM`D*8+YZ7al"_52\QBh"rOo1`ubXk7%ZCKREW22h>4]A6;H&Bl*Ok?=!4g: +X(fGgMKTtp>to>?QfI-!DN)a:I[c$01H2ciq[>C-&uhDEUXaC&l]Ai7Y0Ac;L69CT$A44UM!N +cCV"8^N`73mW+o]A#In(cc>iK+Ja+HA0D/e#f=n1XSC7/fQ[BaKI4V%I-X"1:Wl>m8pm +L+I-#Z\MSk,!"'m`qIq2/A<$jj:po[OjMEYJ8X+m(]A`dAikk;7t?=1L(\ZIIZ?K;l'_80[A[o-1M4io.c]AAgVX+XQ7,\h36B0[C"]A@fnJ3O&1\c;_*U)M +Uo9\Vo&1lAep"+$nf<2>0V-(o\p/4!7;WesrNuEYJ=P3+SZQbe*C9*s'0%KcaIWhC%nE4PCd +[GLV:`.0G=f6r-s#A'L2iLoR3`Q^=Kg[+`1r[jn*a/E7XAs34#r!=.\A!\stAoMK$;[bJC7R +"dlDH<0LPZJAA>q_s!I2i&X92f8H4DZq-7?hF:k>1pKOXtp*!%_rFH!2BrJrq/j9[q-[^n;H +W5-@a07%@_5`dXl;\]A@O)1P;*M+0dOi):[U5JSRG9S`=WVKraIUGa+eO.9hS$-DeJRNXnUCo +q(Y3tCb5"FVUr'p\\(`B60n)cU@#7`f#,qMZs"#:-"cB,GXD\c1+daB>;%q[m#&Ns#_9a!mj +X8%B[c's`pq`S((L6;i)WuJ*-WQ+YXg%n' +oA$X=AfQSLAV2K,Bq>u^Lm9?%Q[S<`RTX;UjW7^jYCQsFkFHp+oO?<%9_X+D]ABf;_e,efg=< +t1Q2f!P\`pO;X4haIH;ofZNTmn1XB+_M<`3\(I7)9(Fu:3Elh0Yp*G]AQ?K4e-V*q*k/Pd6jL +gB)C?Ht=35ZFu`c"*1U2Fl5dhD8kg'!6#*^>`akZgTL(:mJE!++^:ZZj)7AM@BZ+h/QqPg,7 +54iG*a9aeL=hk_Oa/O;0gGK@^/249k8%(hV@ebYd+HPL1-N^,:Y!SSA`dQ!>'!<(-Gu/rL$),%gsEA!<[The5/6kaV)9rX3,R: +JU9c1(=Urc*$?d/kSF?-0n@mT[n2UQPc:1>0?Dp70egQUOUMC#Q\lPE*k,giO90j!%a45\?? +hS7rL9Z_%,t(8\/Q)SLm:#O[Q^-A'3/!1i_bENbIcWGkME`:/1hBn;>B2>>*b3!]AZ_m,A$o\h0GU>t.#&=*^o=q18!(>W.=EMu +Q%oWXD`FcML^RV'1L4&46PHbp\DQ$>hQGqB$GYR]A^JP"6b@TmO*Iq%lN3M6`u.7g8rj/ +Y9\L2ZU)X+PCkV,f#GC>LmZ'?=ar6dU2X7!'PM#WW4(p;Q:)MOsF8kuW?]A,E&]AcOL/jFaPAo +k$I[QW,h!.Nk>+DZV:OtthaMsr"bG<< +m-3FdVhFs8AQOoa+:gkU'&80#H#.?;Zi:0k&7Y4%J-VI8/!h(/02uHYQPp<=!O;1MUM'X(^q +f#AA7`T,@HH*g+P8k\B8hf1N8&dVdBe#+9&H9O4NVqO&=&<>c&!-u'25Jk;**tsNW$#*B2b# +m\9N;D\MReF8UoK[$ceCXn!hptY1Ym1g>X6I`4GV/-)DKA>TAd\3'9,Y:7Y%F6q:T(;IFX$+;ag)=8E:`A_rm +el=U*+*/'L[(G*2V:G6k/[Z,c;J9(Tc>4nY/[4^]AJ;Y0?dfOHkXDHl+J2ZG(o/i61Z_).Kh5 +7G7_kV=9d%mjD)e\`Fm4SiB2nI>=-0p\q2LpK+\k/`F#U7,9M@bArf!PaknOoE"CL^?Xg9]AN +(22;;&p1F.aFr]AqfT=%Iu(=FgL9kX@ukL9p^q(7CkLXaFc\43uI9O1kl@`AmJVp/XZ\ +tU&,Pruo/8XPkjF?]ARPUXNS2%UTS=-V3_=JgDYC;GgA8bHm`BX^l.Z-rRSf3)U`$R,@Sn;cE +e@*;rT=KR!i8KJ(N'JK4TV^TVga_#M8M4KFA%2'l4]AD)fTmY"u +j\u;`KXjXNRgFE%,2ZEq/KjJE\\%f[IMb<1i)mUrKV$T1+ml8b.n-rF\hoKk+2I[L`d2DT-d +/1]Al:=HBcqb'=n+*a0^qMiP$d9G=4(5L&.J2i"G>t?'iEDPPdDne0KqA,qu]AZqLGg30,B/V= +.md\Cl`qC]A1&-iW2(`L\k7MD!33eV\quHpPQW`c=)D3sW<.=Z+q;<^?7kY'DUss0_%nq3 +GQg4S`tD?>N?9?ZYKo-$kfEJ%`W>E&%PKBT0i$HF^=bU&cU&=La, +6jM;^i%<(u&5f9OdT^fR'XVpFR#*_&nU4p5?u9q^6_Jb_uC3H6?-l+?\Xof)K/UD6m*F*`(" +q_n^(:B.;iZu5Br8OpS9Hda+VVYkuI)4p,)dG,m,d;tuoB,`n7>t1[:X`)g)UQO.d`D`tT2H +)=ng")2OHe2mW$?RNiVCtPNjn"&8+>.r?8AI=4Tlr19e$)>.QO#".Y>[Hn"d2oIV_.7&;Ldr +KeS=/qlDTV.#l]A973j>o8k#f=#fQc)JgfX/dS(osA8447:b@8"M$)mO=>1N>l>i0NU>RNfj, +LnI&\^%lOolsC'Tn($8S-6NF;>9tT%]AtSA-$g%L./`@2pWR2(X,Q$K!I[5P5#*aiQ#+\e.(* +6),;`_GT8,pQu=1"O7il>Ch9!*[L-Jg9^P9`"qOK!lAle^qXMTJDeNPb9SJhQf&?DJj@7FQ +4'V*'^J7#pZ9=G$_7-^Eo3c]A@XF:$KnQIar!:M`:Enu=+"'GrUp'd7CmtUeiF/0C)U8_b0AT +H7Zg=9jo)2*l:8#UpoRludnsdE9VkUdG(?6Km(?5MWfaCP;qj"q@?]ATqUnCO'YGbHf+Ucp*a$3oFDp6Dph$[tckb("Us210=>J'29ghCZIFsZ/ongcenV!=d' +lRqC-"SA,mDR&4(6B2[YqcFh%NfrVLMr0ksGZ*csmTh8-#!b"5G2Vd6X3,`/8RU(!Vd5!CE4 +Uf*?rSTT;p:&`-dkSZJTnqQ@`T2"t`02br^W&;]AdN/%lV`KF8SnkGjepL)4QNFd)Y)8[nP;BD; +qfE]A!RTMP*thqL(D/FM9',Y\VH4_YLp7jAH'11k,*SJ]Apo6#/BmMh$SIGK)'eB7X5o_u_C'+ +p8'OVWUW+F`>>;=t5D@7>ee2fY(jC:D$=;2-_29I+T(i!V"Q%MA"DcY^Mffb1:#i;T\f&"@+ +B4pjkE:ZGX"&Vba,1T%VEuWpmZt8G6eL?W'8_LdJf1m0%RhLOON+QLknJdpJ:3I[(\-eJ9B8 +$%gm@O0s!q!1GV1`%U]A*A`LbPVb2j![b6d9BKD$L+9=]A#jIT"ec%Kd63/Ht-+M?2nigIf<8a +fOgi6'd9+E-S1QlY;.OQ\-#Ni7@3k;K;q^[u;4X5Ob\A)+[D0oQ@kVVs`r+4u4T*f*QO,jB` +9N`s:(V$^(5u05^#dDH4s3q3R7kBh;RqKfccV73KD6;L%q)jbIFdp!mHqL"!f+&SC$?]Am1L& +E^nZr9LbmC/WHDq/1/h#BZdP_:lu%Vc'F8An(pEN30>dA*Ff2N)LLj+&"64S9@]A#UY0(Yf__ +jCCck[^7Fs-5rDmKmG>ec$#c5LKfEu\VFl4n%$^!?cl3XA,@';eBNH7$tN(T-t;0+946Oa%/ +=V\Ho<;r1em+I8*=0X,NpCH\5$rp.lrlPS13/#LE;jY"aJ1^HM9hH&0nXg0WD#psY>@;Z9Xp +0-+T_jSr*?Ob;i2[(!D&mFePUbu&@Q9"befakGT3!C@!cYD*4ElQl3@6S-7D_1"Nq8B"JXA0 +_Me4_FC?3@!doDBF4/rk[.+3V0Q5[IiYB'@51[\AN5"*5>m76<@=htB&_5Xn'_Z6B:VhOR?, +(#V("cN.X'!6=ig@1@p)bh'L4cB^rOfMWdsr9G/jQ,$Sr,sgSQrdG\,B/Fk$B#KU]A!'Tnm\% +>#pdk%02eL7*r%k+c&GD!;!V=r$SJa<$brb#>G@,"@6q44-($Zc@p!&jAepkT3h4EG]A]A@42c +(d/#XI'm9'a(mK++(^b`_+Y=.XPUU:R5,QG\+G;am#j;or!!A6D^euP)j,MBAaY`rXIk:2(j +KAk>&RG69R+_AF_G-Aip0"+'6EoATH$BL#V/D5R'HBs$EE,B# +=WgZeO"/Su:m$ZNUE7ZTMX+-DlL2$Jjb7@[C[/i:o>krHU5jK5+?0BF1kq/J]AL#s4Cb58,:u +KN)W,[,U^TMl<`rN?qH1a*C%jGs,>mMFZTGN6>,nt]A?F=3K=BG'O-+4BDSLrM'cr$RTbP-?HcAAAZ^6F5pAj4 +`XS-@u00)*aMiDD$W1!ELlEOLRF.-Wbn^C!Oi1%lF6Khl^\_a0-1HoVJ'WQh*d,J6%g*Z@6h+K$]A3-09R3Vh +:RrRf"TPs=3C8g&:l51bhq$A5Pr%!#G$&qVRf.n@8,ud:);,-8O-;SAhK0I*=Q/!j(F;O#Qm +RqX;#BP_&h`[TrjJ$m&+5>u,d"X):eIb7JL)&V#ka1Gbs(Larc#l9mWm*XX?D +"M(3&^5k2$lZI`h",e)*l53pLhn^e>,!C%B:$D`]A,=FYfQTZRP7Z=;=kKI\UXp'9QiDimeol +S^-^UQoVFXLN:]AI:*-j=:(UB<>>QXjH#!,bj.$j*hJ_I'L[#QS43+5"I/:Z0PmHO(X031Y63 +q2E!gY6*%gs&5,hshpj7;ar7gr$sj.ZJX6jVj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +%rO278g^,5bnu,kmjPdKV=Z.5U<-m5bt3f;f_(+M#i1$@pkB8niQc@ms +4q\?`n1SY-[k/BH3""*)"s +/ln1'_f;`I>g@[DlKRs@dQ__Um;.1oOlC^3&7a+SDkuTg8 +KcJ@WhmePp,R7mn&l7GBWhk*rcZr?"imofh3lj]AGW6t;Ps@7U1.A5,,L_3"U*3nm!"OD< +nc7^KrZn!^#,M?1>$KX^-qRZ4+iHeq]A//J=eb3F%>/*,S1UeR5HCUUN,C>M^HFjGmI-6Te0hemgB!j2$qKg"#4Ma@4okG)]A,VChh?1'a*pQDOY62u +lQ@\T%a#J)<,/ss`h,uHqCp +Lfc>_]A,K4pb%WnS\hE6\h1lA<:aD#^k)h=h`q\a,0qiViDM'ndZQLqTQ.&HQ;\%7R\]Aiqg,7 +-J_MO>TM2b_?XR&P1m/(m_obrY[>"WQKQ-CbK-h@cW1!tG\r^rNOOjl=.L\\G'.EaDH^WJNF +,3kfEdXo$d0ph&@E]A.@:Tp]AoA]An>\IKN5YkfILW!O_f2Nf!R^1f;h(bI:Hl)^r4C^h]A]A,cJr +F#RH%_rSfO'Va4!d$e)e]ASK(D_(^p@r?GDbF4W3H)e +$uW<-$Vlf")!%oCcf&9`lItXa+#f8]Ahe&&a5EaDTL/2l9l%G=WR\CsDYijoerV"L#oeS!HWN +7G]A6)Yf'*-Bn]A+F8I+Q)Y5*kA,i:pP9PXJN9pp:'2&/a/ALU5-6;31R'fE.FVA^V31VC'R]AI +WWn207T$nY.t7*PZ51t%RJJD46^-SSF7N?,0dVaoq8Hjjj=0pUj$gR+;MBgY[;VS",?C^Z*q +kL#R\qRPSmfPM+hU9MF0$ca.X-3/+D&\/(U).=]AC2%\=$/.CZ\t=]Ad@1_DWGCCh>p[FZ7sE- +c;ctGT)4ul6O6Y,_L]A.c^a5"KN"73-S^/un9-rRG&J((Z(,HfmCIp4Y +s4al?Ka`sIaiFR#ZHaj$(N1cl1V\DI]Aa=&q[+=4NWIo)./j%JO6V)>K,e@oA'Y6L,3e9=RLd +E-Vq88MAM6\$o'.,*)m09]A.*:AMn!'H*[8[X'nF?I;'67PLc"QaA*4pPd`ccc3 +CbMQ#j0EuY2"A\*W/iZG8pn7jBs)%d)<):X@C=^s0O-(c;P,ar4>As;Ef$Gf:2sI)L%>N,rihju-IjQ`QZds +'-F\a<&ap^X*]AfJk<_*n,(gO"[T*Y:UG\r`lN5M>`9KJ1t\JC$gRK3*ppTcZ)L"1%cM.;@QK +q+57_gRV/[_g9JsVkIrL>Va +8[h7'X%]A+Y;:Y;%fpR3FW$c_TO`S=A#FbAP7nFKb[Mu1abDt(`0VK_1Qag +nd<]AAA/W(/u4T\_%3!Z59u&-0iQSq==7VXC5"!75T-9UWpsT&H7F8?(U>)XPnaPgj]AI94'p5 +I]A7"sREo$(d6[(5r[GM'i8,ag*_aM]AD9.rf%b/)ejroUeK*\JIUC!WS>QH==fb=`!0$fET-[ +>IY]A`9oM&0p(AC6V2r@WYul3rD5'$=>@0a(73.>;WF+""u.R!aqNLV@GgOWMVT>Vfo,7@?AI +R0U1M>c4)5)!^edbL@S*G'X3126W+CS6)%_r +;f$@sS&]A_guRhT3jIiY6RLU4182D2-n2n*gRL>^?LIsE\u(2Da:/"Ei9NBM&8,+2VsiYmLV6 +\^$HC[P^)U[2-2>E`ERlJ+7$;-$HW>_c=NQ1VP^Xn[>O"5g(%U+b6Thua8!-B^l+KD%aWfa\m1Jh&?55*&Ou?&g"B1(m]AlRiW2A!C/B=s@ag6S> +^pFhCD!$B*W;Q4gG(s:+lPdL(:g^AQ.)!>SFqW.8q9\>m4,J$Z6*AL"LPpP8/M+U_'gh1QHY +D?6OHHm:[1F8QCd=,\C$_2R'T:9Ddd)4g`2(fQI0?-Hgq)Iufd^g:'mk?co<37.ik9HJDb@C +ehF\QsJ[#ZZ>8h(K^-h82"ble\Y$$R5=cqJ6BQp&PLAf:YKnh#Y@]AYXhJ(2pBl1d73+AMb+? +[c/jf.edighU"FX^=_pSGJY*)DR%-dXA*Kd)hOCVnj61U%\%WRHGboITTS*+;PNQh;(n:@g" +F@[^;1pMY;:8e +d.[Ho-u[B5*[mf87Fgdoc851V_8%'i'3OpJ6ALoTEKfJ$@jLsgS*O:i +)9^;)3['+@8B[993O^\EGUNdb*P9#C:<]A9\WI"I/apPi\`5nT)3n0bKJ7]A +bAN3$[(T6Og]Ai`IS?ls+l5iDi1*0NYg95OEj;eclX<<17+(&St/`Y2hpjf'$\5TYG(d;-<&h+Rbm\#L7]A"k1L.B99`KJ +[?$g%`hA*AJuJU3*kD4k/6N+jZ[;/TkX`Yd2).4G\ph7jE>Z(&"iY\H6^Sc[&c3]A`Z.l=sYm +FrSZmJ:)c-%,9to1lo(BM4gn%>EGNn3?8sim.iKPJS387QF[GD]A;-S0WcF?`uCOc"5-BBoHC +!;gp@7D8XRHNFAEID[S4HXo\P?P6fFY<'`&36^;*=jR1'f/>[o2cm!:Z?foIA!4LCiQ+O#r) +d:@m6rn%c^Y[Ri7qURu&g3)mpm/m_S#de^''%el_kF\ONmqT'WL +_kp-s7FUX8aqJg>=]A_d8ifQq($#'KYZ,(lb4#?j)UQF6m$h0&c\Vm;U6Rh2Qc.p+:lF'&EeD +Y^Ci"_[\G2=8JB8@q5`kLTi?WO'$Qckl21I^]A!qfO9'@QX(h1;i!&3d]AN#V>9>4j6K?]Ae<,* +WDtF&Fom%lT5#)NC\h".LKRL@fbsXl4OM4t,)p-]A%$n3qMl7m_B)9itbrp+91e,7uN2%J+J& +Ysun4$8@lQWId8DM#PIlau46RH!YfFjjtM]AaF3%+]A7U.a%auol*199"^_;McJYI@,(=#j6u# +fNS8fdi#5aIf)IPFK;Qetg&k4?pYqL0tQ'9*mNm +He^!&N:,XD@R9fYr?P<==,&nT)tA3o`#C:J8LNUgC)s,&H,8[a,*OqPo'd/A4^fiO(V*[E"j +j0/%Akc!l/m2T.QrUq3p@3A4T)o37NQG4O8`r?s&))e?>&-qf"gf#K<&*I`/(\J!u$g7C,00Cmo0mBlhmpAYDu(6q.W8"q/faRJ#d-QVJZA@^!"%JMe$/E +;jTA*IVsEiM&*DL2>[SLg,d\C;b&gU$&2L:ZIof2MhrF$Zb+p62<\)01f&@t*GYD=*?9kOS0 +ieM0Dkme9rp"!1'/]Aq!C@36Bsu\j&`5bnuoHh7;#b(T`b7LADXo]A"0q:c3mHWIi*N-lF(`+/ +iQ''Hp`TJ;+YstrnGfmN\W#OZleB"Vo)8/(cM:SlgbJ0fP%;eQLkeD!$t''&&6?S\B.WC6dY +ILb4(k%RL3.8S41-.$nLakKIkF32#4eM8PqN=cMa<)6phKiSkhQY1+2NB9L&RM8]A.]A0Gr047T.;4-!cP0GZ:*P2_C3M9!bLZP*.[iQQjl(h&15. +$#/]A3o=fM.R#C:_\OBs!=e@0S/=Lu(qXt`<%tR9b2Sb8FYDG@7p +2VrqfK00a*WkJEU3ca="l$!'"-bES`2X;X7_l%[=f +XPUaA`+F4/P#R.Jco.:meiZ1R4a/cgNCm/tlG`Pr\=Z5CX6I%Gr0Pff?eMHT>*k;5it!Nkak +P[;XPBK#"BdIkD&qTP1#LB<mXNHIenJ&AJs1%'bjs[2f>HGHb;]As4UqmD +DPB^O12bgHY;&Xj=)YW$s@pnDL?8*H,=dI@plMe7c;/#eT$m(MUisM&_V$ +L+s^a$l1ZF@EhdL]AtYdH#A]AM@^#!WUoIW]AjXDWdH$O>$cQthhF8&KE3*K>:br(kAr>M,6%V# +QVi)gNOCCKf>Pep^lqZ@<3%-9sI2.%H3c:u&U>h=FL]AF^f2AC/9*J82K,@E,h*[QO4]A*jmP! +3%7Fj?!ZV_,b$<=955q*K([W:Usq$k\Ze4+RduX%U,(%nb7s5,hWsoGVEIp!>4hA-Rs_=D`o +p\Df7Z&3VB>:cps(pRCDGY5YrjT-AB^k3_#%_`L.-H-1"9bqR3O0(_-:+oC4_/&%Nh4Re&TB6k&k)Ggs!hNKm/qL]AN.A^]AHc[h;G_;i^gqk0]A,hgBt,#\>AEFk'b/*f[?4/%g8&Oi5cD7Ub(pi.nAS2_Kn@%YXq6,J3c*+jJ&E&]AZs7#76 +,B`m1,a)1F+^29W]A5kN1eA.Qe#QZj6J??uDu]A)UURTX@n6=P?h7]AS7E)*:D[VNY1Q6A.R +U=B`!Xb>RB*(sfPJuq]AFk&]AJ&"8I=%sHn7fmYrPAIOZrW]Asr^nWpZk:[uIkJ&HT +9SC(Pp5_B04\9`s+ciG3"IFf-.dVY]A6X6nk6bdZTcI]AllZt?"Ga*B6!5".PuSJr)^`T>52QMHfk+-&6E +UjdphYc]An,VG:q"XV*OKZ/TN*8Ql>cujo5Cm;_-7:$QN=kS5rF&&Pci99%A*mD>7bo1r?49( +kmnHEuH575LCImRl,lrf:\Xc!$j8A]AN99]ASpaJ!m+9VW&]A>`4?afNOGHKJj*R")nHR.a1aeO +.HXY^l3U:,F$-4$$.Kf>h<<+p +UV&>g5Y+U5A3Gn,"pV`mSB1eY@OWFt0dirN@m=%mSJIT11I5aV[.&Tpkqm.UVL!mp:'[MA4q +\FR6doDeGB;8KC``4+YD^T*J&Ss(dB/N3Kt4E41_fK?hnO%VJT'/u!TifOS3QgV1K784&@MA +&M\jodDap[rp"Q^,9T8%g\;';>IiBsuNWoX1eVU8K/.j!elm9O)&sDJR>Y,BD!e$.n96OWmj +L8N'^33Bn!Q29J"cnnHTSUHtT6\qpgsE"gFk7KjoD'Vn!!B'+#FqGjjX(%@--4*J +^;`lh_dq]AF.GVKo==2\H,:3Hp5:I`u]A9j#to-eh]AX"6R$3%9l@ijE<%9#cOlr`,sAp.lo&;% +!3k#6itD"t<5[faI?4q'BJsJKGnX]A29)pd61VY#,$A^g[dqg/Bg1J\&LjYn*!X6jd07SS2dJ +pji![d'n['@aQ4^!mJ'3eL$Qhq-@Cd1O)%DSC4SF-_.rLWbDJ:5sFDeX\U5GBQW +*s75nf[k+[OS]Aru2hiSScDBX?F"Ea=EY!Wot +Pk!8+8atJ@#O7W[%%ilBUc<8IU8!ZW;bPFO*4M!Nhc4oD2#:75[\$&@7S*\3]A*e"B[J(s7q% +aK-FfW_u.1>L+^i)@F7_QZp0n,!l-K;h'80<#S=@<8PJ5X&.c.Qi'[!bInS>@VK:X*NrLml. +?lKD!h`KW)ldm\$o#WJ68D:\C]AU-RaiXd7U5EG$0shDJnn6@X:T0GIDhkRDCsE5nL:'S?k>]APKc>bmd&hT@8 +=E;0UqOZ0MH3:,`]AG0e=0N6ibqTrR5dF/7oc,t.RHi9[6aio\rHe0Zu]AN\Y/Wi=TD91McM.& +E^g,N'9n;]A^R9SCsjk/?S(%Eiae$71+0Xn2J/*nC/H+>:O`1Z0'@S^uX!1L:p5?]A*V[)uPMo +]A:LF.7Jch)^K0toKk4lRG8"0R\!2d=&#_#C)^nTA[QK0oo*ek2!H(T2kQ?:7aP"*pMgQrqU9 +i@U8)0VNZ5h9+I4++e3I[sZ_FPR)s[e1!MAi/,mS64`%a>Pg1=V*ZqeK`dE%fjG1L!g:!8eMp<:d]A;j29DeZFl+AKKIPS@Oq +J!bEG*ul)6&$1n#=k<6(:3$6B_GgI/YB\R39#r2qXIt;Eo(?Yp +np)@!jDUis`lakL"Ek!23?TPS$BG?lBLBircL;l2L6CAr^9lqVQ`Wn[\b/Lqrdl`.ke>kgVl +`HX6@0UD6^3^;%b^s.$j&Np2[!_u]Ae:hf7.Nn$VJF6[<*A_+A+$D3_*>AD`&C%nd78Cs]AWr@ +,3d+q/O@>[nJ)h!jQAr5!&)Q.D]AeZNsGQ6`I#=orA`d%N<`"*kQ@gLaK+K@De3@:b,..POa, +F"ba8Kap8c%he2>^>DXYa,*^N`Hb*Z?8F2\F"*W@R$b/K4t@?\WI,MJcb6K)9;%O:/'S^abC +5a+cmcZedas%/fn'8cU(9hca"_38o1\c/B3?A7q_tgcY,:#jE$_u\Fi[=uKsL<.VI0+O.mSE +]A`S!%WBS!12@Dhh9#(+=U[DnMd(NJ>lO:b%2Ra($Uj--<]AA^%l0e:;V=E\]Ab45H57QB;\L!1 +WK5&fu^ik^Weas]AfAJC$aTSJg,M`"Y[8@@X>ZR[f\09cH*U4rrB]A(lD;"GG*af''8VHhoq>' +eh"?5\G!*``ufU/)<&_8;\-rTK!nqKWZe>FNAOkR7',0F&\k,XjL:Gt=H*toqjei'Tg6PaIZ +l/%=Jq9CA;:r_a$mgal!'`HndoghLF=l]A\!J+ts:I6uYj\?8shV=OVBQokFWT(P!<=k1O'd* +'4hm;\1)jW@+@c"TpIg*Rg5+T8Y_UIU&aU3\>KlRe41WMY+&4*Xi0BSQlMoL4_ZS['h"o\;) ++Nt6aprO"6jJHXYg%@\BeQbOc_Hsu"HlG_/lPdL+*.YX.'d,PbSSo-[$B0Kq]AH4sh:JtfXpa +USd:0rJESQSI-OYung'nbQZGlu+!F(X-T'4!%>j@mld_eo1oB +i8esQ."OJ/A=K%r@0d<@!(%JdW3c`D*3(XdJ0o>T?k!U!W#r^TRKR*j+FglS't*Z&G^_%+[, +<%gIh9E_8Ru`>D3JA_jU7B;"@>NQG;*e4*?J'l?5M0N:G2gm%n[B,A*/O8'W&+"o%SqI]A1Tg +gnO/EH46pRmnF\=^)0aD$ub.HNh$BRarGu.[[ZbE +]ArsV/SBR/HS*&(_DfoY@oAuR4Wi.TZU;!NQG"]A7j$2kL-YnuT::66ap_Z.GhOi$ZiH*laHW0 +]A7nY3JF,fuNtE9DO4jD_D/E!/Eu\]AShp5oSU?'>:C)&l\;">DjBg=:ujri,uGL$K\DMfGTOP +ZFfs0#n*$UXB,hefg:8U^;Q-G444Sa$pDj,1d.=D8CV3Pi1F>j3#oZ@RNlBs1V?G>VA:t`PH +"/FhhoCC9h[GM*"Ij3CG(us8eHes?2!RpM)N?e8rUhYd!ZhW^[Dl5LFS1)f@3b93K24ZGqED +qf>7L_K2@BWp";0j*TS>g2SS8jD4(X)6\1hLW1]A'>LRr4;9bpTVT +J)s)ZQ,VALopY&papG9=D>30_Y\GEA>b*)q,$Q8t'ChQUt3.@Im:5;L^u&d`!"q^nc0]A@d_T +V&B8Bfn5hbM##"^mFA>spRPY?der:"%W;9[/ZlYnq8.N'dk/Wp$09mIo^A,j\jR=cE/5btX< +50DSN+Xh=nED"U>M(u)XnQ0kql8e\63O30l2PTd3?U7"M&ao3Mpe9R*E +Ql-OFGp;bS1k8G/nPbNZ!r&Vu7L.89aSM&qAYfHMh,+n&mq[ +;jj4W@kRGeC+A\1j[-Wm!L]Ag)*;oRf8+V>r,SUHAYA@A#NjIo9EM"HnJG^ik2++3P8DYg3ih +>_82[281:6(c0Rg(@d.o?P`.l*qF1f\M=.*kH-N/docK(_@Hi;sA0Z6'Pb1[@)J:m>XP80\o +#PG:`p$:l*J&P&j%5=4i?0TmC\uPF4pa50<;I1pYR+oh5gr@PQql'L+uAQRcGH%qVd^j%F +Ccqq%tr?CbGQ6.'2>4,,M"'[lp3,+osm4GmgmS2fUq08aTe"_"*XmV&@YA.6&?]A2:UIS8d4! +bDS0oVd[-8b;=bkkOS4H[;QneP_aRh&7UZ9#keWU;p]Al.mm3Jkn1F0AT?+^5spBlc+9mr9m( +EhOR$F);+GL(k:ra)ZY**VeALO]ARo6_$6=ErQlM7)\pfVkQj8!nS-P?fBkpOo`s,-,sXltAR +&te2eLXP1^DsG^(j$T\@.QtA?E%*-Zf<+T8d[>drl0L31?lm[uT?Wt8>k8@7@M41b(U>VC_c +QU,j.\cHhs;gmofBe9Dj?ek$i3#1P(DZS/`CTF'-jtnd^hlqBP3GXR$Ob2H$NOC1V5,M`5jt +7\k*!"40Bf[L.*]AN9p_5P-[!XFPM#&/S7PXK@V0*^h[m,6K^bL5mXIY$'NcBOIYCgGj$7/d2 +!*q\7'$%J*$)!Snh!m#D;8>kQc$#OS_e&+GL\M+OOgTF`+u\pZFt8.DGa.*m6m3(ar7XAnWs +O4.J>c9r+R0q_7h5!Ule_Ir^&RE<;&l?7l7o#Hps?pHa(h'?]AHFsg;IL.PmU%IL%.9W4=_O, +fVGiG9&b]APCM^[iSC$R,SAU8M3]A5PFr!s40b:H>&,%FH:NK$Zu3>i\)Xdg*MLf=8[Qcj"_"W +jNn2KbfhSd/+qW,k[.lBtq4#M9/3NN)MV3l.X[.L^DJj-8Z3&i?OlP`5XF(j8FMW9V\6ACe` +f":JEi3!9l);#?AhT(3Zn1SiX^AZ_h>@@0j3D9Jj,r7XSh@lhcmb;aF(*=NDCGnTa1F?_UOa +/%9^2G1C(l@SG:36FJHFa\NZVp_R)8]A0>Do[iLD)G0>k(8W'^91[_r0$l]A2(S_ua%#$FtMeG +Vr(:7M$3@h)`KOgHQp+@:hmajg8Xk:Ht-&)Z`Vo5aa>WfFSLP".lR$PI@.R273a`6N!6\6/B +eH.q9j"R7.UWO758$OHAeW)0TIMLWS9W4ur^f?=AZ*IV/Q3J?%Q]ADgo(6ghr]ADuUjD:oBaq6 +=\dSD`kDlQbO1eSSdidUi9!)'?"G5_aR_"j>uLpXno +)>KeL>`;YcB;L47_8Q+F[sGM&RBP^V\ZN +GTHdk(ZLJkrY6(L;=A1`WqLRK;'+<$dkr$::qqhN=S;D'7&rH,G`'5^_qAW?N-\gWhgVEeKs +:&;FLb4(.RRa&%HbU40+ot_5/Eq.aTO:g%*S=d_U5=!B>]Ak2nNAb<)/bG,X)eP;-qWjH,KqJ +;V*:J'aDp-@qKTXND]A$paDEYLC8-\lfU;jXdq5sli`\q<%ODF=cH9[Ec1iISPO+Vs%rJBHm< +d1qY?g)%5(LsKf9JN,F)H($:qF'VRZie#NF@*hX]APph#d8/A'2RX,o?)mn,IeP"d=^2Pob[8 +FUQ?Std^3Y/>ABop9*L;>8)lA"j:_o4>Rstd5*Zq!b6`;H52`_;rKf@WEXEDH5XNqDG!3U^2 +1I\^Utolo?:84aE/($`D=U:\%k%g'iOCWm0o8R$Eg9gHE5?jcqtJ.K*"9N;#ji`ZY_6\%2`S277r)9iU8oN;5QCSP?K +Q2>:BF&Gq6;'F!VAmB2aqA*a/@_oM?n+DW:$4C"h"&Nr)0kE22Z%^OOW-j,[:rB.NK(*0=)qo24!S<&2kDj`pF7NF[>-]A4qdShB*/7Q7W>QrCn +nq0;<7V+e>>cV!(u6J5AK:%dTI0&M&h9H2?+^G>\WGZbDR/N@0*'Xqk,,n\n>(@A`Daa'kI^ +;S"%:NA/P7[?-aWu:g-3kTl,s\/IXuBm>pIFcOpPgd2^AcH1)Vgp@g!=mIVck\b"2 +N`!W[*5IKfX&l+DB,lL+^:B_6/5-(^K\f=2j+.7 + + + + + + + + + + + + + + + + + + + + + +M2rggW+Z`\puA?>g*iepk-o8.A9FO4rfB;'TQ4+m.;`XJ\=0JP-:egA6GWF,Nd5ZZq6&,6e +W:VSFud9ta:B3(Cjn@r=Q%g=OQ%sAr37aUTb/+2^V=X4,lo(e +d9"V<=2!KpnQ?)r='+"hWflHg(XssgN[BT?I!!k*pHV5H%^*(J4.dqPi&l&soc6WbeEPiD3T +$=<\=5&"aj,.o\9d(l=lo[&T05GeHT]A)b;`0LL!1.*+]Aq/uNYEpkr5ZVXDYGu%9P:4DqGTb/8T%2X"3a21`s(3HZ'C,@XX'+3\*$8rUOoWf +Bbe]AL/%9rVDjVhn-?W#/nMm=5*@bCa6&R5)qX@u^,ogRne*p2cF/LZDFK$i<-Vn;j,NG.Ia0 ++G6/uC468D)GFlj:L$Q;[a>1bWG[tV0/6nHTrP;AKDD*3]ARqeZl/Mqjk`h_:8? +eUJ@k/cE3$g<_qYPGS!Vo0&7c/`hC6IgZ!?Bg5T/,0S3"Zke;Njh!nt*p%BPaEqlrX\r;/bh +b-:Z.kCo=(oAoVtDcWhC[kc$%9c8DM\bPRn%.Ri.S%S3(0dp\qr4`eOrJ*.CkJO`d5QV]A]AB_ +JN2N]AK\bP>nd1d*gB9uXk-lLMZ/Gg+5l/;)VJ8SB:?4:`^p:lO;/PsR_PH]ADo[Q?&^?]A>^!& +!WVk%rCdMfJaV3Vt_hUr8`lBJQEEpb3sI\\N*`\L\7"n=4W2?hn&iN\FogCl?:/T8!8!ENG* +WG^h/pkHJ+@2cAI'DS*hEA_mqX"#Ya0Xd\+N>O0iG5LS8*,Jpe;"^nQ_m]A>=gW)p1T?IU=X +P+.+5n!s3nQ)V'eMas'bQlem/;GpI`;Ai6)5e)plS8eiA/6eRQ1>j((Y3UA7N&n@.1/4h>db +#NXFQ#Dijd:'\?n'2/?4_BS5lh5mfl>-'1A'Mj"Bu!hMl17lYIR1/[j'3M/M1gH?U>sXY>`R +_.MteG4Q',g*;85-dO#oe`52KI3Noho.(Df#QklD0iILu",S6q0fp\P+r]A-W'^YdV80X.ABU +!8K?shnOXDPPiE2`f`KH'P.VP4$`D'`'Y1%Y>"s3Rs;C!>qGeefP[%T7#=Vl(BCdm>IQMSLj +Kd=:&Y:62+rG&=(aHtn,5P]AV;Cb"@[qZJ[K.\Fp]ADY-?N(*fr/gKa.A&G:7P>a%b@)a`GS/! +]AihD-WIQBBT=^jhE<'+nbN2qd9>03\unP`L9i_1ke/C^gZnr9gT@YD<*Mk`Q0k/uR[l +?)&-e2iRo-hNE*+/,t6brhuJug[erq)i;4o35u18+?.ef[K7omUZ8#k&?NGbWZ=<$1jf +5;?5"%CS*\.=<;C1K>m\Xp=0i\E_s4%.AkaI%Ge2.eL$hRLM4I$t\NUqu&t<"WnJ?Z8]A,&pP +ZYq]A/e%g!OLohHPt!BXYH#:`p`1".%f0E6=qlfRs7UWOW5PKHgLr\I73'ViD^bO9L!P&7<-Z +0lCQ[qar-Q!s,ACI!r'<)2H6YGm(NVXX4;4c:Z+l"Yj4O'J/c&0X`_\VXPTgDSb5/sYf6GSI +)LeE;^h/T=QuAMI%:AiOFDb4(t)f')rjk0*A^p&*u:V2.b.H9ZMf-MeG^n7ru+p8$'X"c +s11OAWLWq>1`;?jBQY#1b2mT(14aT!S3'KZ.ri]AWKM@EpCO78Ws\QEZdof]AT3D$k(^\=':7Q +ibqUD"*lQMpi#qB:&O?u?Rb?-7@i"Vj)bTXNLm*SCH9eXQoUh\KVI70c(?5Pb556%_qF#[b" +e`+G;ns?X?Zcb@AB'1Ff8ujZfEd>M8E=I88aGO;^/Q;WjlQJ6O1mMBkANLm9"5^@O=\>o%/T +^JP:^,44At'*m':c^bT!8(cjNr9&GB99LuqE*=6rI!r>g?I;:5H&OB>l9BQ.NeGEL(c_C.q_ +12%1&e[AY3gE77IPGb\H+9$:?Z1G5C\J*:-s`sZ0kCS0#8Po/rcLCe,c[iImsQs$S\),XCou6laN0O6N>UEHS_^oB62u8pr,8ia:pWWH%%l4U +5Xc)Gffa>92FL!-YXW_BMg;`]A(!YA^]AhmG_'#EJ3OL-e"ca1#?#.A@C5hn,`J95sc3$]Ai.V> +/l'"nAuQ4Kc.#09-Hkoa7c"I]A!!!4i+&d/D&@e_=84"H9gp'898$;YAK&5]ArW[c@o=#57]A?$ +`g#qL3aQ(]AWJr, +a'(^C"srMi4+O_JHT#Padk>6GCC5pB8uCO-)ddW:1>,^+_eMiDH&Z(X?Xja$EX-:^9mge>M4 +]A'=nG&dpD?DHKcrfPAIqK#K]A&ZX]AWbK[#tjc!6;TYuF_I%;[Ir8%DdY?BdI3h'q\/HkF<6VQ +kA#V&(K1Hg56N(.\&3d\u8R4l?p,_t;C!r;<(pD!VPU%$^d(FEJmt6A[:=fc4knH'_m+m_oK5<=l2-'XQ+Ir*)*9uFA]A +U)"luop:$\Q4m%\H#t*+;c/B/qqYPY,4K[r8!&m^D._nXhGr]A*\oaLR7/iPV4X*lsipnqMD# +fan>oAbM(1D;biritL:bhP,3b?#hg/*9j1'%M&_Ec_'\sS_OhB-Fn\d=)K)8hhEW(GF!<)i2M$@dp-5QqmolFF/fFb1p>h))Q> +r)Coc00bF$I.*HQFN)+O>kjb5Rq?2espPPQEJKXbo,t$[68=1H&2S1^#>3BdP1;kE@U(3$Vg +A:!uV0Noe(uqXQW@0@0YOR)8KZ#6:+#mI5'jD.K^YSU#i#[!H"cI"\\Pol3A)5AFgCd/f%^HK[c$qKaT[Z_/?)Sa; +OUD"nS2eBEOMYbArmL#Z4"2'Mi`pnoo64!"--pN[Qf97H0WkMdm>O+pR@"d9Z;]Am!!\L.`C6 +?ReG[>]ATA>p(,u\7r^g0J[?7$u!^E0eA0nPl%I$uGr?Q&20f/d&%:f$5er^58?i]AaK'5SEB5 +!Q&o_iS4FAU0l.qa#-d]AVIaEE\<-koka1?&^18JGZcO&KeJu0C2fK)P#q&DJl*+,?%mSoTM2 +dLkHRg5s:JBJ'4$0JRHX?XOE(H*$-*p=XmQ>sRDHQCU[&V#&pV@R#WNVme0&Ka+,S30i"cR/ +SFPTr@,oaS$r"W$j`MXH-8-I_+]AOpRr7,!'5GqGQG>'S.G6L#lsM75Vg!8B&9+sH`b_k&]AN/ +.QSVk2F(D`&1b\.+Z\,G9B::#n\Y%I+qd?jOK:<\Y#X"Da/;Z^6]Ag2o("sPQWOlYZ9>;ZqA. +L5S`rX@OH"4B!4)Np,G[[(i1,IoEJ@`#Z`oDi3k$Ud_abN(^d.2B&!2$ofnRgT3e< +qZ]Amc>KOTAkN$Y]A2YBh;U!q\!/8cGof\rF0DF50EC=&I\Y_W`U2*h0)<:'H7]APNLsm_3DW7c +3LUIO`j*`T3'@tj,eY8'sE4+i)S524/H^)d!k&YUXpL'8V#Jf(+m;bAAmDG2!I3P?b;Fm"@r +.<)F1ECT'8Bu)C@""2AMHCeUHF8r(`FY:KC%*N".:U&OJ%ND-mGK[&]A9W02net+ls)S;.qL. +>HEV5CeNVkY$rJ@$o1Lei+TBB7\c3)PVm$>/sd.K2I,E8RnO^Rbu]A^K(F(j*'-RVR^dBVO@_ +akQJ,>;EKRNtUd8nFQNTOg^kK9P"_g-58s&L-5Ud9_KQ4Qu"2TUUDS'$E52Y>d`YhSV\;R9itlOAg +6F#!fe*9tY6X$oA-fIsN3QM2gaD<$="D<&pen/MaaB*Q^jn=s=1S\E%lr*RcP1Slq9ZXS`H! +>;=Q!Is_oksoKZcl:p+$#_mJ#TUL!9O23p,HZ!&B*I#;NMr6-4c1hO`!1Uu+W`*q8Ibi*(9GfVUh7CJ2@+OZ(*`BTTau&HqIt,9)/Ph6\5FK-e(Q +'D*<\rYQhd*c@+OO"DX#u`Uc0uXJr+OH(i\i0YBD%Z)d&X_0)`d9q>jlR?'=3[l[($,gEWps +PSDf1&.[c@[H_ldYqD9aUV@("5P4dtJ/H0grH!7LI-aH62;8p`Z;`r6e&iZDs8+t(l6E?@$, +S=hNr!OqD?-g(==!mW=h#\LC'rIFt9Of#N9AIb]A1,6!7u_6.r-#d +3ogROU-[3L6gJ_,?iHI6tJF($?WW2^<7gnW2n+_u(!?Bt4290g\h",9-KXYh_\f)3XP*Pt4; +_kT-+Pb<8Ba@.hakBCX:V70)`$?1c*LE=GlC"G2d\&5oEi25b)b,@;o3@7:0,2 +]A2_$6m#q4MN>JbY%nh)2eq'7nN9*Af-MnV95;K#[oHV]A!]ApT,Bq7?.Lb'DhRTC_oSsrk;W(? +kYOo0PA-aB$;aHcl&+,SQ]AQL+uBq+!M>7.&5tM@Q7!6Po/n)UrFACM)F",Y!" +_Nb+2Y?(p$pNtK?^LpM\'E(XYagI(N314$R3S8&!gBZ#+,uJ5,DOp4f,%\1TlagUt%FkG.,Z +\<-ji!5,<\`(V[`PQ"ldIZ)]A,/E4qQfWJ(Hck(>FQo7=MJaSX]A$dSYOUAIHJ`Ja<'D4.Lc\,aqq8ZdAH4UT)Fb@oA)3LOU-LZb5;8^H3tmYL/CX;*o@Cb#JC.qr"\S,ZV/)HY&$K0#+W^YEB`'.%,5^ +KlWT!!XMVcZpb^BZhm2?$>VnM`Z3QLNTcGea9N2ObKjYK:QBDiCBKSi"d1cT/Sr7h5=pdd0W,?;gaf3I4NLbg7mO0Gf5 +Cu]A(&F#,qfL1n_SU]ACiT:gma]A`hc!-2Qn9fE0i[Y@T1XVbc.N_&//E$?j)A!]A=9Jl0CRp&>S +4Jn?tP%2V,&eBi!W2)A3!heV3l,B'Nd1#;rAr3iK]AZB4&OIZ$d*1ki*JX:5&sH"$_ZGJsZh^ +/slO_-Fj)MT;&jkkH=Z)I-U@5T=ld;,DbP]AUHbFZ:UtO\GNqu/]AkabXQN>/49tOYm;/-]ArJid+(S&g!6TT-+ZJ8,+-qj-+&(c0B%[E&@.;qD12m\OP>Q1Cm1"'CZgm +:Z#Uu>9;&EH`=R&5jE!)@#F@p7<$4-dO@1Qh<*9U;4SC,U`&9# +]A&%RS<>6TTM`"]A'2W>C.K2S3c2>1'O +s,S-RZ9B`PJAo19t3Kh2KYuDJJ0JYq<#gBH`1rXXP/d[O`Ak7gestE9`*A5fP01'MNqJ>=]A`kKaA?57faH&Z[GdheO_gfO&TpNFqi4"o9`O>d&;Y3/s5cXm:8T$07 +KWs-e_'@m==Ch/YE&;LQKaHhdPPj/FQslT7CUSV@[j&41^1`'-f`(F!&oC=0Lh(AcCc-L(q* +JnR8FVeO_oqgq'T$r9[T*Po=[K_$ZcoiRZ5ZE=AX6LDIY[`>QB&A<1304X)Ke]AY>lFE+]Am`L +0+mCDkcl>uGoP.6^/9[."t.aGF@0)J8+`KDlMSEu@XhaHG%G@oTS,&iP/NnK+WXI(QWMWJU7e&eWC8FRCi3L'0PT/6SZPOW8T<6NNm&:4E +QiT.%XcjKa"T]AqW#Oa5jSjBPi#n?&@PlP[?h*P*m!sqH9sY7,jPM$(dC_&XaeYCt[]AfHI8P]A +Q2hqd2?GZrg%>bf"_JLJl6PJgp[`aO93:roADH6g+\"ppl7gdTVWJaEO\pO#@oMe_:"OJ"[c +NoZetekYG&e%<7oO7HmednD@K%:#`;-kc['#NUOLbQ67b`mAi;J4n,7\U<$Yr$]A\D1)uc`'E +AZVW$pfn/k4i7+S6FI[EF>NduN`- +aXH_IJ,&+f7=U0VH9D9V)N@HB;M9+cK-7,%Q;&OVnc`;*O[M*/8?%_ITgLZ-)`!]AgqaZe\j4 +ScHH^EC??8^e$:mm>rDQ:!AXg,_L,863Yo/8]A9VfM^[g+%5dKL">F@e#=gpF>9(V;INK-a]At +b+aZ@0`25ZT2g+b +s:5e!/GOV&p'VCA)5FZ^.fBV\V[r:^KNsXYf"4F3Rn`S%Ig_Ak46-(d]A+PC$u6D;CPh;9WuV +olg#nTEJHCP38tbY(1nhmKD`^`CbTg0+R_"VO-=*guc=FS2)ZU#CT$o213Zor9a63Wufb-"L +k8`ZAaZSbZ\X!1s4Bb]A=9;Y:lKDOu#`TM-c?3lUcqb&nZ`g]AsmOf>BX/VOOt,-pW/Nom=`8l +4fhj#<:/Z1[e_aYhNi-#V@'\b*pfY+)\GUJ7(X_2-&IgKXQmKPsO.>\b6dur"Ke4Om7mCK*frsQ5?FPI`>be-o*:Po#h+$XD4C[G]ABiN. +=GRT*AiI%61ntESUl/Mc(L=VSI4$* +g:U'Z+9,2IB5$rY/-=a1RXOqZ8Z'GSM+m-T;+QJB^M7?e`LT@\k:.F?PUYR@:h2SVBR+RQ:)ce6"@EH+g5&8dJ(W'O.Pu5k]A78(Nhc5MUaCA:_\fOk/qIQN# +,Z"U.b3]Ai)(CBE.X"oKCXk0/)7X`?u%`3@2np0\]ANH+E>-3Z%"(_\FjI#DmeT\HV(YpX2H0^ +[^D;Q"8HNCSAZ&qu&'?6F,EkfgMki&K))-=bU9'/Y/RQ?FABA86:Bm=Qc:]A>`0[a22r +s0obkc*:m.X,0KptoLMdDS;+KU)_ABJ`n&',/GE,lunIp_PXsV79r_]AM.Mj)AfhKAcdft"M-'W*.A&^fa9,afZa8+%gY0;6hBP]A=Y/5)>q[&QCcO_<"#0_bH-[^Ck``*;i[ +)9.GS",MS"7ZV_8GB@f%hUBd+/G0[N@6Q$@k=X=iX]A2>SHBP8p+0JYP8TH"$oOHTh,UPS]AQ- +6VrG?Qr"6a=[4b`Ts0BS^3=m+sh.qAelO.-KuM%s$B=>Hm"RtX(#j>Y-PQTVW=j7>BPNVW.G +BQ-DE<_)0IKo)ZV@OVuR$@WDP#&iUBp?X6>am3NS*tFa?U#fJ(+,-j"O<4FZ4q5Mm1?"!SHU +MP_(seDRRX<^f24\j15in]ApV?\]AR^l@V5NJCE5&kU$jX&4MG9mKu4"hMR'[/Q6,I$+EChm1F +Da;H%%:r:l&YhNM\8^]A"%$(nN.eKTTR10LBLtZC1,u`j+TnslNiJmXs8\IG80'dR.b-tKD6" +:E%#>U?`n%Yu?UF[@[`i'R6^o9MPE1g#L)FIut\(0#L2&Qg$$qbVJ]Aj +F;ZKH1]AgIC%dVYNIYfq(A-*BqF=p=r$qX%IfAP0=_,=OW!)VYW5u(jYN8##L\)cpqVi(JeXt +\1?s-sC7hV:oblX5`\lmD]AcV"FNa9`0&aSo^!Kb>+C#Ss2[1&A^ne_T'9FuE6]A$=p6r!9g-9 +1p[k#0SpVS<4BlCgm]A<]Ag[ZKs0b(u&@hVE)G*2sT,j0%:\VW$D!Oca*&`&X9fAgmf?WuFk[S9cf&M;YK7)M0& +<=`08ffs'9'=b?T"T.uO@NRsO/H$@pef5<%;R.nWR#VJC\/k(Z*[+l]AR?7.&M]A@n"e^YsPP, +9PGWh"H8m(m_=1/):;<;j->d\MLQhcoqP>k$J7<#_e@k"U,&3DJ0hJ;[5E(\hl`b.N.]ATPq/ +l!dbhLG#0^^F.NH37nSI;V8Ei;LMtXIP;ZNd,geM8qeWJ4-0?RFkFLN?Wc#!_J4Yp3^7eMV: +A;diL7U_*;0AWgBPZfQks:aSc2rLDa)Ah4:[So@mX#[ps3 +:7TE\XD,1kTeKeB$DVe"QFuVFh^K#6CGR1C!6UUD`JO#$,Y,T0ie6&W&G)#kL?2HBNI79[HV +E'QA/dFU_b_3eY"@uiKhi@V9'.g6_OflLs[VOY"+u<`R;sm:Ug--I7e)\R6q5fU\jr26^.Q8 +dE.A>15;d.j(htKYsH*?32eVtL*cesGpQ7n6\pFc)#`iZ^p,91Rso'@`\#*1W+Hmc7i0l$kE +E.Zb@ApB`1q:?C]As@q+p8XUFW;qD9]A?aK7_`_&JG]A@dYEr/p3j$Tnie2jWFDj1K2: +&=&7q?8M2Ip;Q"adr=k-VQuQ.GTALIT-4.s,EeR30oU;c6N95+[7=XI&7gn8G41R[Q!'"mn6I=s4]AOk3*hlTsQDb#;X6r-fE')\oE3KR(Q*1>uHN4QEHK4KPL +tqT"`XT[2Gh/#U_TV_.PWm/l=dZ[WPuN&>aRIHFOo#!VJSNa/"JJA>*D_2I*(NmYo9h-:$in +`6S:flI1p;iF"81iQQQ0[or2jKr4-a=)-/%^cm/_!h#CP`:#A2A.;.WiYs6m->o5D*>Y#Q@m +qA.kZn<79k\[PfJN1n0$LMHK'1UV:SPYuDcI;8k4?c:+]AU"DYGZIoFK! +lBc9OG6a]A9T4hD^0q,4&s;pWLpK=al%6J;d<,Oo^XQQg*7$fN(4r0#XtX6W"7j/_/8Oi71^- +FD:H$]ApeY2_G9T8*]AM.2nJQOXEJu%_*N0;9[_t[m=,dXgbId%f%-=8,lCA;2=Oj'p-IY\.OL +KkZ$Ai,:#k[P)U3P[-BiUm<;bK#XD%Vg_]Ad2ne8Oa3.DO*r:t;6WIM;j`/!<5s(>^aYo*V1/^96$NA=!HP?^k,Z4e)*`&E/kcRh=Q<)R)C)[=5$T +PXEH9'A;0Jd*t`>K.8:qjZ5hGWm=0Ucp_WBYGmD):iIHj[>tK:4UH?t!^]ApCZQDe\UJXu$X. +BBtM:&kr3IlO0L3:]AV>NcWVV\("Rl$#@;IrBpV<;15CY6Bi%YM.;@gQeh.`-YgA=hk-hAgGl +agO((sMgVnm-Uc5VFpi:ZOk)I2:T:0_5=a>ok.n?TG*G[LHW_T5>:*;\!"#;'H52&nZJ#U\" +kBWnSl/*$]A'p59:A'"reK-mk?@Eo;HNfHbnUi@fsa/aK.:BIN@jH@M?XLG?QTJKrK&<_b%a+ +*%Ni7Sq\X7Z8o5gVu8abe2>Zg3CFDPS#MnuH\nHpT\K6a-ipDj(DK[J.BP>OLGFIdGKnMcY1 +6CbA_/&jO"R=GIYIUCY*q8;WaT'+.anIf=`HJK2q8X/%!4>?QSUQQTg@+6a9L*dWa^aV:iX9h^X:A.+<#XoH?9$FlLd<1?4,`mU9gf>YHW?Z[ +RPY&FKaX!?t6o.Y]A[(L\9O1o'UG2=#2qKSk$he]ANgO(_2K&T4j2!+#rt"9/$,lchQ[?Q1H/YsY(7%oXFEqS`5#RCh-Q=8MMUT +\B#G/c-.4)ToZ:it)=i%O;,IBd+!2KV4ksUaCYM8DC95S(57Fsc`E,,sTAq^'IAnI^11XK(P +#q$eb9+ISot6;LGpCkR6n@;_l!MX*FLk$:$u5-&*D'E*bqVDR4D;E?6Ish:rtJfX#/0X,L$# +m?dZEG9%Ub!_C07!`%DTR +W.G)rk2"o;e]As:nB;4hXJHbN4BS9-afDC$f7.-E7EGeki%&98Y^goc+U!8B\<^`UcXu/if[H ++1jWqB/rX054:PLT$Q55\21J_6gh7KSuHn\gltq"cWPd_6:W;u#aEc?MkE/c +&JL#+pq5,s]A!<7uUL#OYd$Je%FYD'Air`kR_PX3rij"J>u;S%X?S<7d3hSkYm^Y4pgm$\=A8 +EStT8#//VbW7YAAnP1%73T@f;((8oq;+hdWuin_DQ +@lq\dJ?f=AK*HuDA(mmG:F&7$_K+ft9Yf7$D;'dE(N>MTrc`gHnn`ZPgQFDlK@S'4VrHa42^ +;*1(ul>:m9j^BM":#@^n+]AtLZ'+[L]A,3)pQ]Anuj%7DnOHF-D&qR^`">2^/d10F +ViQRjDXFX$!Cog`.moomV.d,@ELJMs.+^5mF#Z;k%[3L[*;1[sn;C]A@cJVQ36#s/f5!d/I-G +OiE8r6T*1>H4*`XYo673WMXLUAg+'I(^l;!O]AeHdRW!;t=cJdnA[B7o0sp^!EGP7gdB@ZCtjku?1UXAiEa.&+$fuXTFOHH!lh;gigI"MCUb_KAh:t4NEC +<*dfE"Z;?#gPaUs&!YrJJfLE]Aq*D:]A3\QdW@FA;.1Yq%!E_m\X[j)[6"5PQ2#H#/rkm$@qrW +WYBcgX)2Jiou4OL;j(;D13)mPG:&uW\-oa7,_rROfM)!3,[l5iZNYHRPg4h+>,Ufc3[K$(e +nD%/*)ihNJKQMG`=*)d<]AOjAYg$-ZM-)o1eD?-R2[\X.. +1$?5_^Bq&%iPj*t:8O\Zg4siTUlo_FSRd6OJ=#?0Y,SHZ?c7Jlp0*EpTF%1V9nNMOp]A)2Tg^ +?23)7rCrf_Mn"cS:Gd)Er"t;\VtHU3Zh%`HdSLR`%?[:aS4G&)sa"/I:;]A9T$cAP5p`L#r+/ +Sb&0`A"$RC$b?,V*,I!R(59>H%C3+Q,khg-H3g;5q:sOgqU8=M]AWM3%KOY)l"oK#pa4M("E9 +4MZ)LLUR=^E)jZSd6LL]AAW*.9a.%l-Ci47HaJ92RHCPuf93kEPb-Ao&Y`Ne3YB9P:Fh0;6#(d!3^L +o(g'!M6nWh)Y2($pK:SJc(`">=9Q#&C0MY="U4q5+hjds7F;:C_A$qUOiaunSPAe7%Eao(NJ +Ltq`k-XPZZ"Y&b@A_c5>jKigG\Y=V.lrN/`sMr8>rN2WG:ieiFcN'OX"m"rlQr3BF%-mMKV)jk=]AhlCn>PshFS>Fr +WeXrkf+EC60XDON=I[N4]Ad&D9Y?bY&$L;02_hRJ?'^pA@sj[JuHlC05?O4#-W$6eFI1W +H/*VX2lBRX)3a(;YFU0%_^Sftl5Wk`UJ%=YU@\LIbh?h"\qd<]ABdTSmRLR+JUo#"Dnt,p+,p +N\uXc<%Eag:?OeP^<`7j`K]A[f4:^muCA',^R5""\rC +@&I%jFh$#dmpKe;PD\@jqXX0-$>0iT4PT%K.9@K1H#!&p(DFW>LPI=$Sbjt'qt>'%Vg-=;9j +XdgP1-LVl?Eanhn=rtegD"lKpS*)%U@Wsc@.9hY^V$h5G(:=h4*0MU%Bq%&eX]Ab +nB^;e`+l,T1fe;\.o!EksT:Tb@0cT&*?1$djJXO[>^jtU/U=qWMss^V +ATs0`r*C*l>9"/;h`"!4ZK&sUpU#AP.+sZM\7I%/&`^).F#Tc:\bMfJ^bqA>nk;f+A&.%&L3 +__U?;G.##P.c(+,B*8fSI+2ZDPg3$o^_-]ANAt[-ra3lF=Y[%WjM:XV.po$;K(pTuU2K7LnKYO=oS +K"uUG'P[\bgZ$!pH4)&uu^g-Y]A\W'CKma`Y2eU\gXtXa&(&((Nn\=F;n'NVaR3^%ed`K?nmj +^pMd1e[?K4Gg4%<+nr&(@9hZ2/Wo%4QHI-P*Qf'&fd+PE1\dlZk&5XJ4cuuWpd>X%onKK-9]A +<(n&/DU$_(=b$0#ic2M-'qt9[g=2`$&8sjI3B4S'+1_CJ9:#%`HXo&722g+c6nLha9=HI[.u +q:8oH7KDsOjhGbRRrJqKS)#!9dOB?N&ooRC4s#31f@0ILVeD)g0(m[< +[g$3V?]Ao;cE>fEVC69W"c72ba%1VXW8>?:A!`d`'O<+r[_m5Y]A+j5Gm,:oWu4RQ'jHoE(\& +4aQ>GRGj;iqYK'r%QIa/cR?6q?4==:UcY$79es5W'%58gq@O'G:]A4ZLh5]A6'&PY0q6\Dl/SY +gskSEX<_+iG'qaoui4q@*oB3$J&.>h>8E_`iTI[_DT#>C43Sg(#5f65]A>f:ZErLTkjk**I]AG +$6jhU#\a`pR!C1Hf;ihY:5T\nRPu_UpqG7;,PF,\:f+mTNU_F;7r&.U9BZTB]A<_d;L40o@V< +0?:Q):BNV;q/9adqniAC14-N%U_^[3"WHBSCa:+pmfkK%Q5n/F(N)4]A6KKo%C9o5/WAZK5u+ +pQ3TrXMLT0ia%6sYR\'8e9:l]AGRi,Bd4Un4hu/ZSU1"7eBL6XQUOrC^mg;@n[q"0/',[so-1 +3E5$a1URhd^TM"Gc7R]AO)+a'"Qe+KN<^c2h`-N]A1V_g8ub`e%AWq2X(a2&'H(^t%u/)?OI/e^!&"dmilq==eFI@WtTmVU24hju2[<]A\)>"=" +f/c^uS/.Um&Q%lH1#[';gS,?=O<*C*VZ]Ae@p>3Yfn[5S)K@Oq(rF,*Vm[(K]Am%MkU5bYN^'j +7ZBlO?(*`?cboH7n*b/lrD9-GD>`hI&9M4]As7SFPr7WB\(.OjS^d#&3k)#,pfS9.IpK2h*&p;7OC +kZ+jOcGPg,,hS]AUR/D_,@TF(R+U$n-+kU,oZ]A#e]AkKSG[KsDG<40$le]A#,>F%+jAsr_e/iQF +8i0-*m!JX#BS]AW)'>g=n"@[#^hMUu?7e9_nXQRce#c;:t9)h/)V!.H]ASCo&Wd>H*YG3TDm,N +hb?/.fk-]A3pYk1giF_+`7?]AHg=bI<;?H2FFO_<*#i\+Lg[Ro=r#V#N%UmF*Ys/T]AMI/`jQ%g +Zpb`S?1YVl'25*'Z3?XgnEWqo^PH_0d/aGt2@PN=8h?5d%M/-ZnqOOn4CC6Au"S8M*/]Ak:sA +dbT2r[^q8F5b,/couu6\d]A3@$Ce*BfXg1;Wb3"j\]A8=h!F(e&d5CCCkEHCC:\fj$7"Zehd'V +7pVsq9;*Rg3_;<@5sdkM"@H5HK!X;.X"nh)hiTY1Sr^KK^&[XtWJFUBRgdiB33BUu[VY.co$WHEQjj(H*7m)Nl@'u)P)8RT)Q-NeXa.(nZ`nK`5P8rGTI$VT=.p` +Xe,Smj/)J6UDF%MVALR`MAd_;@,b/9[!'LKS)W+mh'SOe>k?HZSU.Km^.aqYn9\Ha)G+ZqCR +,Qi1:N+d6g+UPrKB@&mo(b2>(aN5KVE+>[6@_I.;W97n(bJ9h(b1H?aKKYgBoQ22G/aGq><' +GVSMcG5jc1)MpQgMKeVY]AG/6ZG_"^6@*Co_dgCS`rVG&_J_F-L#DJ_aj&\&YN:u/pCG>&/j4 +8C[]A$cF%0\'kJOu'+2jbG_ABfZB=FT-Y+.g0Cs7#FO&Wu-d6rDtI5$il<:B_V\kUJ.clc=(- +KNX)?o;f"/#ZOY`!em.LPVc*"t:D]AWB.u%;D9ud74O1MK[Y5jh:&rZosTSK#m +:ru4[?$P/12k8STn25HBj0S9?hpp'e=g^YGg$307#4WXGRdfE!UsY4k<_9r]A!ibns2tB@(8Jk7XBuVg#hQIIFl%Rg,l9lS +)G@\bPXh=gf$;RQ8Te>g?.A"6d*:P<*5)YrAd'Ibe.!/1*Rl"2s`%hOo9=389i.0.:^d]A2^#B\to2KO)+@V +YGGM$]ACuMBXgSft/;E_$@G?7`gX);gii:OPQ6ugB[p,d4pA!6Wel8c#/"!#-+_fS1WuFWE8f +Zt8D`4))SM(LTr3[Ck,WG`W,fQJ"8)G8D%HC\p]A.HrMh`1OKC:]AQpT_js\aWQr;+;us@5?'8 +/A(gYSXubSaeF=la>^]A1:r;e@q>G+9\=&VVuVhWU,:?&QAkY%R%jO,WE2al#36&\:IV8'$I'PJP.r!3ga<&g`O +`h('%cKTo-c!-hMr8'&V\)%Y47iN!TcE.(gZ +".^Pn,McR&B'ir1nhdklg=c;_V0pp/qbD%8jpin[c,CY(iZ[2O7C4PJ_r[GHGfOIJ +[2;YNkL'pB6D.FAjbEuJY.i +k(\l0FVobr;"hFMN[mQZ`h5$=HjW9p]A\#*1YRZ@Fj'N+*]A@ +*g>sDEgBd#MEUHeJl@mTXL&en(FNF@s`1?ds1E=@%fbh#j1YDgZ,.#EEXOYVfi'trmK[X2uG +aK=6L?Hu#m\\)T"ogucU-Td$:2Th>ObX.u+nfgtm"Tt//2GF^*R%YUXKWmcm?>sq(\8+#p=r +V)rZm8K(-?eX$7+SW#hK_?;jJs&f8t-NpXfH5_iFZ)'1qjk*jL,GbkR6C)+/nlBWe>n'W11t +ff^N+9ior"KfH>Is;\FRtr0iN3,2YPij_\Nao=8$^8_!,:"gJZWZ8t9#$mePMeV^(GP'q7RA +-7<1i;,!N$V=&lP!B]Ae_'B#>io3r:'g/eX$+&r$":[Q(0nO[4u6/lnO]Ae6IQjT#W\pEj$Tel)9J2[#Ec*W`hSW]AX0Q8l +:@?U51\c2P7Qp*r9@`OcDlrZ$]As&`r-K-/NTJ`"B[3ma/lX]Ah;]ANL5<>dnJXh +,Nh:kSf'XK5.F;GtLkh;UpPNk>HWDa(=^C$*>=UT++`@.(.:ghi%FmCauOE":q:\8sa:Z$h8 +Q`/us*<-TK(r)&h-ST&SW+b0SsiW_Lr&;tXd%83&IGFlU^0K)]AUNCkc#[4FHgOqRFs=W4+ZK +;MHN6;HZnRXH>([Z4E(ZFbV++A?t*u6pp$=-HXPEdYR7b\JU06B?Z$&ag>_9)1*]A7nbu>QQh +Su+ER(*G4Qi773To(F!U"#H.-05S$L=*k]AM@:Ablq]AD%cL?1W]Aa#4^q`1Q+=0\lU+5Yrh^g! +MAgNJeK&B"uG9/BkH[oGi;Z@4;4fgJ!`8/1rO=duN@IhqODZa-QE9Z#OGe`58NqU__GG$D^%@ndX7OeG8X1i=gDUgVgJSo)ooG\uIdTXs@nD+f0$kSq]AM+ +(Phd.h<'+E06\Gsg8R-R]AO'2\P!6eP<9XZ]AT\59do$31#&dhphD*a"@fkK`8AdT0,>,Y*-M" +=ko00SoUSoHtV(#4i!WI;N$?,=QM'L'DFKTJG>dG3aFDpQL;C=R?QPO81Z;CN,K7@igEoAoa +QmHp<`\-eJEJb9*s8Y([eu03qR#h;6KaLc61tK+\ +u4OmPF,28gN#KW3ebP^Qf%_?/%;Q\.!dZ/Ynt;Ho[[Qb,'ZgbW*m^lU8LA.DfQ+.d(`1Bi_f +$CEr6N!eM8LOd*:B<[TsZ=*fr3Tc8X:;G-HD1l`qbU*^1Ui#jFamDBVU`1\fYrnWKJ]AgW86X +I$,fbmScL,Ng\s]AY`L=FKCq(k3soN2gpPhlLK>#Rf4EF/_lF8<<-QL.o'M9^Ssn;OU/=sJi. +t6G29TEb4<4s5Wi^.$XH$RgZl.7)u.HS +.h6NfV-6$XCuKLC'4nAI(magaYaE\6k\IK2A@QEJB!;T7=Vmi0PXT?Lmr$a9:n'iXZ\(]AQrn +iS'hA9rKJ(@(,T.7K^.)Tj>^74`Y*)DRQ<$Js=#\`FWCO.t0K<`)8[<0.2=S?VS +)=DXVF*n-^^b>;K(LH(RLWh9B2`LfdZPdGHg6r\U>mk@1^_p^P>q[f'(q2&m'b;Uc#5K=Z2% +hf[Fh`?!L\htH?@ofTD+E$N(^@YC$V$#bI?SdSRhL<@Q-#@\!,WV4A(57CnbA*A +]AFu/??du-E$n6:Zce:=3^V-\kKRBC`_j;G?-LX*XH[Wf5m95qH[Zc>Dj$Q4cR0=lG>fX--B9 +KA'^Q%,!><;d:[Dn>1]A9oQh7$WB@62JU]A7F"#;j23j6Q_gU:U_[h?r= +PLQo34g)^a:!uH_DB02-:>nmD#Y7[!lOC's/]AoXL;oUXH_GG9*[]A]A%R"W"/XVtPI-\O?]AklF +`!aHAR@m07*K=O($;#^SS#'q%&if=RWl(%G0qdSXNd*aJXFk*sabUh)EZD[h5-M>JFK"Ze$E +KVJT@Od1qR_Sn)qCe;n>;nYah./4$_%rDX6>j!4n*DsUJb&Q'!tBNCCMJPrb3'@]A9ah6DsA]As2YSC]AYq.h--[c^Mi30WcErfd +$rLd]Aa*RVUB0HrMmiG@)b>8)CF!Z,s[dM='k0HP.Ej]AlIA3/+u'rK`MlIo?J,F15q=L7jj:N +&;bR:`blQ(rM04S7=en0mXlVki]AU#p)Mum%+[d2<0ILTu"PI?hLmNf+!Q%7,K9=\ +ro[^_Rp$[a0#8d8tbsmh%6DqRnp;Um/^^4o,]As>PY(gcjDQ4mOE2iZI&HfYQQ6M!O8M6g]AU]A088+8T:3.]Af/4`$- +k/2;&"95DP87`9d;n?tNp5PlVS#>q&-1p2%ZD+D(25k#->_L%BhVk1V*\2oue!aP,4e(Jb%/ ++JEMC)4W_Qu5mY;D_[[m1jT!>&=n);^it-V:(H8n\0O5h4Ei:En-(@d<+/BfgR&J;L"0#k8d +6f)^M)okYe(j0"8r(R]A%nUsTa+>pf&15,m[_X(c6Em.kfh3p04\NkD[R6i$#kh`SPLh;YJ`_ +$(^3C'Fj>_[Mf@7oB%O9ACl`e?HJBN>]ACmbsn8FPF17Jpbd4Pr'iA=]Ao+h@2SR?ZRon$ +@3a-&K^_H98:RTmP!)YTE:)@4APAC(!JA4)l0F`\jm&G'E>u6EML8!]AZ,jP">I0`BDs2Y0,q +MV^ZhTT*2NRkr>>]AVU$p$A,=2HE-K:p.7]Ap%bq"?jXa!pCL^:H8Q81+MKF6!nhc9=ZAJJ5m(BItoTi!'eo8,1J1m=B6le%;JPH%#s269F,:DeTQ-o:!c +SkX9M4H)?n2qSa;.23X`rR`T9I#61/o]Ar,L\C"jAGWRHBTo9R]AhamgfhjMJV.\P&J%4q/)C9 +2"Z%qdOZ2YO=ir4!BT"p>rZ.jH"_Sl0jjKef:920j8Oip?3J1J/5\*#l_N8(PLl+\q&g+a.d +S.((^@GK-qoM>I+^Z+`enJsY^&+YGm5p8aaXdN2o\m;Y2-R_s0[>c%@(]ABubZKY +oK^8Vc1C0Pd`KNPOB:Y:?2%tVf'sI$084iQ!NVm;=[dP>;GBNo@)Ib`DN(L3nI(YGmAEICMF ++J8*mMl@[W&e`3]AirA#cd*_..[iF?QO=c)o/-Rp*-+i$h6KRc=".&3<=3m'"Z:;YUc\i]ANRn +ZEiI`[!(k;WPjWh]ACDJ1r?U498)b/NXB=H7L7,C-EG!>[_DZq76'rlRLpjUq_Fo^o +Ei8F&h!roU2%S6M_!!:SaGJqSYhO@b)<^$U"-c%LZ61`$Mspj$tt5H!r%PO0:d@ +uga[UM>)ZuRH`hV3Cghbf1O`mPOk$r%A01$5OcG>b(3DWG->Bj.LkoF'")DHMgp86^5?@d +BVo`)#_eh#jR9&S.F?t'-0gcO;!ZfKq8a$2%I&!BXr)t3V_V[sc"^MLPJN*KF.qs2\`+Fbg^ +p/Y"LC;k2uEHf/U]ADCfGpa8Vf,eWAK84uh$,SfB[ukFd_?QsDh$%'qK_Vu$NP9'E8Y)M"1m#-&jAJp8\&%3"\6VT81\Xcloa^s7W!!~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3(g(oDu/(&i)RbVEfWZC,+M +@_NqTQL/W"LZ'qpH::Rip^eldKW4cW$3>7f-GaEpg:a2Y#7WZ4p4nChVNaJ$M[(hlQ^Zg0Y_ +`%fJS*qR(^P+b%:8L`tQ9K(^U-f9o0.f^5[jHN=1>F_ZB6W'G#ZK6AJoR;.,_5@ANo6_^Y=L +e+nXumgk<#X?#3;Tlfkc[?^nDJ_#?eLOEUW!O@$C^)'fd_B0FqYAkJ;CV#c(BN:[,DS!tc%>Me_P +MbtW?__GZr^@8#ZJ.B:54$r;imqo3E(Ske\qCA%sE)Hq$3=Xu8@'4&-J#(cl5X0 +2fUhLXp;R)A\&`W9D0EkX-FY+)Y(%q>"hOe2^nXL4EI4dP"#`W#tG.8\4Q&Yb/Af)16.JIt* +P0JeE/pq+R>*3G%,J*mU^dE$4ar!%<#e>$ImW7+)CAq"oB9CUq^U<;0[!.1uk%3!@N,C!'tE +B\fubP`+*uOQ]AI1csS8RTd>fu +iPfTZFc-;VFkP8&r^.GgSe\;Kak<5e^0o%[$mjEl8=s +B@P9\O;RWJ#&*U5oE>$95QQkAC-T!>Hg;._]A:@8rkamLS`VD.1A(eUW>!%5J=7,6OYmU(`t8 +lEb:VL9756MZ1MD@n+=!p>E/]A`YoI"U2=bK]A1X.)Z.?IW^O5o2cQ-Yfsh^Dmnn=?bdms%"#R +J^#8V8t#5#8f,2o+c=\G>e;\2T)r@E9KGk+f?V\`)e.%WIRhPFXBqtSFS5>TFn.H:ML:WP!r +F,Zt:;_qIo@e$_d-TB4kk5ahM0K;25.=gQa224'=g#gSs2'8o)rFka]AMuV)Y+&#ZiX_Z7A)p +bfLHFjGYf(Sk3_Om_]A_cg#HaYB4noe[jCtZiT$4ub^LmI9iYlC&]AhZiR +XY?+Znl$HY/+lTfUV*:cm"SN&B-,_C2P$Vk+&kA+5HpI$Q8PF:S3_/@`kZJH#Qo!pu"M2LNI +NYC"D04.[u:P?Hk?K,a#ZLb.Q9IC'Y(kqNN$kj5:s?")GMJEeb/Ro7$UI8o/A>>f?9o#Ji2C +KnZU[Q*+]AFcDbE'AP5(rL.#lB"9`00fW1))EY>91@\-rXKU_s1;*g=DKtolmlfo&'pPoZsY +Di1a=KA?]A*keYe7PdB`dWr+K9TFSMeDB7r)2GN(Ud%A0?e6Q%%-n[HoJafRF2K^`S@NoO%I9 +Fr6q=`@T`DLmteTK3(XW.[E,V3N-#?MNa;iRDR2[&%fD3B,"dF8F^YXuhq1WN;SD::`Veg(o +Ab#8Y6"=K;K_#n[.GdtlO8J-dal^6NGKAJ5D;&8!"0N[iGmk'3?'K1SjD&Ka#%pkQ#ULrVj7J-\s<('S[(I^d(h^ +'_)Re.&a?qY2e-n>NhiSD-)prkY5'mo,X"mtL2G?5WieTu/Ik;^Z,(::]ApbjJ]A.]A$iqN.5*c +`g[UOc9EZ_@N#r-H!B!caN/cm\X@^T;EP2Na#((Jk6oJjN5?O6!m&'0"KsDEPg]AQ#DrE[`.[#Vs-!%<`0jH+#\QClg"2&@DX\8f?dE6JoGYY33r^bC4cT5 +APCOJhENf?sN/V11sh'j@!q^q$VmLlt]A3^$Dhs/oY=[@C(ZiUji:,DMMJNh`=Vg9cPhpA.R6d;qKM'db6VGoOCF;U,=uZe%:8(!ms!3(-N?KKTO"p(Zob +),A$3ZOP^c_*lpjE&PGNrb@$#V;<-:@[CDDX7'.MTolH6G42gVUO>:Olf+D;P$Or?KV6r +H5^a\2j]A$_Sgj*"Q-t,gOV_.&O*:OpNV9Q\F\F$%qmn*`m'qIcdE:T0mfAS"O)7@Sb2Nf`q- +kc2Z2fBgs7Kt%IO8gZV[E>/"$oC?p2eqHL1o#3UFI>,`HR2B>t+l'1P,OlkC[%J-0OV#6$h2 +aS[=P<6'C(iS,^3LB11/P[OXe@cO)8&gcqhnhqbA6*!tKM+adm[[4gqZaGPD(+B/Gl>6,F=8 +`SZ$W1MVt;@hgS#\\T[.uK%b(',h-9MjNeqb%ME:&40\iM)r*6Wm[6)VT`k_O2;g7_/X=rPA +<^cJU+;2!(SB9$ho5K\H4ufg"eTWC!Jh7$06\ME)pt(X$C.+?U"!M@#\U`5(uB6o1/gfqSP +[`LGo`WtMFtPDFhGl,r*-;/Dj'LcYkl[NlAPZY;e%N(V;'7k#$M1n"E=6GkQ*.U6hitL_RqM1qAuK"PFsl>+'3&Jj1'"'rl!ELZ7L>Vig.B=Q4d4!Gk5RYZd(,ASo2s^]A3b5[EXVHScn![0dms6"P +&?uFoDJ5=koIp@\'opAiDO7<".6KAtc<+pq$3+/7SpZ>l3\"ATM'!9+u3r>$:5,Y-"g?Btm=?0Nq#W'_B[cibj*k34l=@pRdnOI;\E,KM: +G/$(OJDm^lWfWS/LnW@-pXq%aJ%Js +O<(r17DJZY-F3eV/OXG2f:_!_OiOUrO?S!Uo9UuAh=7"JF5:5Qo:D%f\bEukr!BWA5oY5s9K +a/!W9g9tRohBlNh&%@*3B$5:$%_\Bu)@i-pgT>2'EiRUS,=7Kf(Ucql-1[.g&Q*[.EUW0WN ++Z3I7V[E-gHA9Y8Dp(!Fe6G9V.7]A.g\iFRL&_\g7"+pQF1E^4-ls6lbQ/4f3oP?B3N53`9nf +oFLTg.Th6iQY&/V7Bh.2UlY<7oB.D;?M.jCo_l6!8.rr#"C?XQt5fU>^6/L/kenDI^JYiK7* +&`%P;&eQ*'XI&EErub:/$&'p!lp$h4`A+\BC^i"3Llg,EC#@`a7<(ou1>Ea]AYa^r#]AmE@kP@\Rb7g=8Nm6d:Q#&YT\!iC5Hf%hcQBF>$hTGD*K(GrIQZ<"rRasN0%8@?f<\6fMINA%.o'-E?lZ751.H=@&Tf]A +mTS(,P3ZPk&I?%bUZN[[hU(e-jQNqKoZ=lO/muc'V@Z]A>c$5Zd*g]A +JmE"u$+T0q@mUI]A/a;"lEV)XX`+]AX1:8+5WfF_X6r/IpE%a0XmAJpg#HuX"oc8-Z:g-T^U7Znaa[1u4Y>"'OiG:Nq+O6%45 +TiSTrL6ul0S^V[0b)Ir2YctK/a[Mt;.k#LB-8H4TQbZOS'JEUT@ip_j"!mHfgtf"UNACZbkU +'f97j;^<3*@\3FB'h$&(d(VC`GiQ=;^[)S>AOVo]A[F68QI*j.lnBdnRt6*8M)+inF9XG.<4e +Wd&[#.X>i0?')><>5">Pk).?_VX-W+mKM14+6_ii1gNIn\>e>]AE_=F.fCB6ZXL5+hU^F5PhN +jQ3Qru+QN;KJ40gWtRTEZ:A!"Js9r0RHa+\95H0Mn3>QU)$MibF'3>X,NHbL0GBYV;TXN__& +s91V\@g<%]Ab(#QE]AS>9>=Q"rWG4m)TS^.Z9T/D90V@9JWf"fRorpokLkadW!=\8d7EX$jDCf +OhpTB!KhbTaKrRWBY@OGt3XR&tK@uEiajU&XB;-mDK)K3EpRr]AqJZhGOMlP)o;"&KLnDJ:Pf=f&=d4'4uc2l+0X2WuT$ToJc8cg +7q6*_G$kCYjEg/4qOifb2"np.j7>U(+BZbW'D?OrlWo5=U9fmpt&[26:KVo((.n7aY%09db. +[UpqI/oTG)EAHYI`D+^^Kkq\$*Tm-b)a5\$=8,RO)>]AZ48(n$S8PU#>P/9n5ZEDVmcR5?I2@ +eErDZBV:4^uN2c!&Z+(-&a!jMj>(%[Nn>OTV*,j8oqfncH*'br&Em'4-X3*1g".]ABjk1*oBE +kOj';H'@'3f)=fLdRld)BkTN*<44#)GfU7lPAi'&jMNjM\Y"-ZA@9D$s)RTmr'mhtP10Z?4- +c/m]A&3]A?hM2sZCTb;s6'3C9^J3D@GWBl0Z?(g\DMQ>g88b#`,c0sl?tR/E:Wlt2gg,c[Yr*+ +PtT3=-KPFJOjf`Lu-Y[%N.f9_T%kcXV>d%h[`RJA.#\)mCfJ>IsZf2"KU4A\"F+2MIB'Q1o(bG:A#!IeSNb>&g#6^h)nZ#of6C'Ccnq +)h&`]ALhY+1$mlZ'o.rSZm;mq8#On%)n=2-0)_0X(KZ2I8W]A]AU=K/e?T%od[nC`t4/Xd-Ob))fO?sHSWk=9PEaS +[ru/-p-DVq$Q0cc98l/iE>uPL0NA#(PL4cd-qq#T@T/aZ@>^m$^'S,U2.JqYlD3f(`k4UOJ6 +9Kc[>?X"J\,o3B1['1VAq+%(?/B'kBe,g<:$YcKQJYF@CZ2rloA=JTOVJ1`NW!c]A&9^3`CD_ +JL'ko4(!KlM;=HEDVlK3J/[78`rla_5h%49V/`GAP:Le[VL#ID/>2pYA6l)XW#goHD8fD;t= +FgI/Mjn'N,9<^%]ApU.1LYCkYAs5`Ut9:cl->;QpZQb`SWm +/,,G(BBr15ZV_>]AWjC!?=+q:!'(T,A8erQb69Lj*J&ul_7K,GYg$Z;+mY5o=;,pnj^^U3sOq +;HY11DiI!+qF%D':uB^35qtQLQ.Eu(';b`r[Pm@L/9bL<^6]AA\0]A"72M!tZ# +u-G<(M40g&*mGYcCL/^:OfhU#7UW9&)2%?\kFMo4=c"@S_Wc"n%D9_&.OLd[>7L+75DpVher +rN\N$l?RC%638AHu6SmJT"?J,8_BD%W-1+qoNl +ZV#NafbkuI^\88rGDD%@$gfj&7hspGIc<%(qgI@/KQ1.[deFJ_TpEH5k)&Hoqj;4BK_eC\AU +(1\0.`.&qOdVe58ZDabo-C"2j--ZDh\IbF8Yot.4JC=&[4I3;bOc/l&.jd;!I3h +rS#OR0[!-Y8Hi"f;GVPpF-eIVn!RQc6qR?*p1e$/enaN>[2&Hbfp9;c+,lH^Y`i>Ctk:_]A*n +@mQ>qUhf+Yj/Xq8A-mJ7G,*"(DW>$pU?),)+.aNB/9kp5+:_j/ +`),X&-K7-1I\k1rn@CqF=C4\8T;)#6+YpP+-.%(Q-ViU54efBdM.b[a2:q?uH-_<679+L'3i6rNb*rG-#mHu,6BNXmELf\)ppUBs=.#%!r3rAs?R9';3mu#[Lke&(]AVuo#f!J_ +grF7.Oea(;0=1RNkh/S'r"K&Vo/:#YPT\k*-Qp.l_j9pg'osqZJVOGai[b9k=_^]AcbRC;$MIV0ZOIPi:H?;'(O=)gaT0n7jpM-P +<5&W43"&Xu6C:q-u6Ji$Ld0i59L;8?0d3%$+a'$p0l[qkoiYJOWB2"t]A?9UMu&Q^>1Q/p]ALW +h=_K[Q^g@jTU(io"T'JE;`9B9H.,*&-8mF!b5:=U,^_nlYC6f]Aa9@/K2nt/m@+*DLpJ@E3)]Ae%M!+>Acj.\EdFr[i-,fX_pK56jq;?1N;mreeQ.T+2jO[:dQ1E6 +r9gWo"%=<=BlnHIbrs3-.a#SI82 +Plb\)Z0\UmlfU<]A]ADR8r\-7hfAg2lKX18UK:mC:TolH;8D6J'-'r[2pBfSEeP$CAHX$8^qnV +keCNu\#qkr1A:ZlQ;pQX*ni/N7R!ieN.!@+>U]A%"fb!H]Ah?&f+O9\B_G6_DWAYg"s#0YHTCmYO8C'eI$)b9356Q!AgNa +#*@Oi#GsE@S`oNa.@Ru5ba8KtpWHGAc/3$[0aMKQ'L]A:md*]A!+tUZrP*qjtJIf."C0c%7AoA +Qt*^ZCUM)%m\=_Oos0)gW&o^]A,rik\>plNb5_?J,S@24_8!O;qUL+3k&<=B=^f@rd +LE8po2J/k*a-/"\PIq1#'KZ&[tEqkJ/1F!q&*Dg%h!4^c/XsrQ7? +26`=PIXn:KUNomRT/PhpWDLILe^eW[o06[B0HedoeOeXaQmo]A4Eple:u5dM4b?IfjFXU$3#R +>3/O,Yom0(jTVMSY!K+cAA$1FU0_;98.-froO?hP3!u/VZ29G7p;i7kq1sIB;,MU +skC*Sli+>?:!04)Q`>^KqTKM6)PS0b=#sWj[J!@m-bt;RHQ8_8FB^^a,F.Nb%U:%eF8]AE[+n +Yj>.2(j[&r.X9)V?;&L/7q"iI@I1L!H]A0l70)-!\EA3Fu-,%"5&NTm^[1c:T5q[DfoK_i/S- +BSHYVp/qprr_&h(0X1_<-B=90^B:FEF1nXN_<'Bb= ++EP%gV\5#M9"I2(eN(j(WqA@e(>pU$47CeYPuBD>Dg>#@@G1G[IA(':?<=T&eG5[sgTBs"*M +ijQGu,g(U#H(J@=&>5I$1Vq7'&;4E<.bpHSep-=#p9,*\sYKs7[(41/"F[t:o%7NpTc'JU$h +)c[hQ11]AT`[RJANu&Ip:#rt,iRq]A6%G>gK*nFaD,S;#k.jB6-8Jp6#-ugZISj=,ecU]AVKlS$ +)8\bm7`p?ce]AW)1^(dL*iaW5[litPdpQ==k+'/:(LWR*Auh8bHfNEplMcu4lk8HB" +`0F,?b`2\`Er&E(7sKHF3S#2bJ,q3dD"paVMe;m9p?RY0;j +b1@C]AAfIou%kC@9mN3ob^$f$qr8#jbF>>\K$.]AF\2Bc$T%:P3k99XO;m&_,\K=g1,WXFB+lB +[3h[e4rROS*[m\!qa;qWI75!F*;@RT<4XLU)a!836&Ej2,4%" +_::_J%giheNdPK:\sJut\(n^cRUCr]A*rpY*TI"uM]AZC;]A/EPs5/uLC-:'&pF40,>#Of*A*@$ZDJQo!g(CH&5pk?oE]A&pA-j&8@"ed*SC1D04pU?V47nqHQ9.rX9e^30f&P3Ufp +&0"a?XWLF?1Sg*"\s*hA.o8#=LNpD2=15CD)0mT&A4fDuNGmj'%miFn8dE^ENTE_>.[@=H-T +GKJ(<$rM)L#"L"JX6\:k79lP&*!K_-LY;bo;Q&j^'j^3Y_Y9gC;kjG6qlE>k&^F_5iqs\qlf +qiftgpRV'eW=U#Lce$6&HWB7Gj[k>_P>IR9HC`j?HT*cN=PPUd7[D4[[."u@Iq=_%QrIblrD3QJ'GVLRJXel(CPOA=#teOo*D#!o-!XqO^4t;9#AT,B +;mr(8AW?'rbkV;>$5ZSF7%Vq%_:m[m3N:W[k#^Nsm:*;AY,cO3UHBtWgI3E*m+Wk!Y`$]A(Nb +WO_iHa;s;!=H*H='lp-l,87;1_[m-M-_66tb/;@W"Su2_-3YmG&uMs +W?L*;?g]Aq1">&q8-irJqbO:J +HsWu*:j*ha0YV`C@[@8N94n\pot="fhqIm#G,9j]A;+V.SAu9bK&Tr/7nQCTCH)&?Mg+b>kn@ +r@.hT4##WaPk)8Gl+`R;uHV6Irp[&MloN/;2#W+@gF*1C[@Ar/P%T]ATuRlUcaG>VN,(P&7ka +dHn`iet/0Ibk"g[TRs]Ah'on+RA>IWI`YoEi&eX9<,U<#O,="Z^AnpAUhCoohg=Yi+p-^8#Vm +OI:p^fteS>Za`W4"aLa[6I1R>@B'>SrMr)bVa+g%aVsY#f@L;QC\1H2X+r#[r`O((5,)rK4m +r1rpM,k`!4M%in\Ddp1M8h=3LG=;sc2\KUuF'su%=69[,!/Fru>PcT9OiV:cY*=hk#m*BoMX +dE2#d7YfsS7rl8J82X0@34K/uDcalFC.M1FukO +]At^US=RVo28/[i8I968I8L'i7eQ`WjI3Km:X)4MpqbL+k11cT&_C4l70Mn6ZHD#0.')`dC@A:@os>aI!GKr4PTnNVe;O8^ +V.TE@i6>iK4sq[*c@uh+=7o>pT=knQ\mCc)p=*B3t_t:j<8X!OuMFU7EBq:Z$M?1U;%4*]A\r +G;1N==ndA +HU=G6k#[5jCTu-7oYs[p!^WYDPq**KCug:+l'OZ?BarlQBH\a&$E!V+!BE&661B:kk.8g]AJ= +A3q?EZr8Ke4f=Cg/tY(;,076Rr`H]ADnpL@1ES]AeRkbaIF=FpG)r'.?PArIfBn##cIQn>%;N% +g`!_eG!H[[Nc:J@\Y5ckWd+eSAPA>"ho^>^.%nk(J_-[@F%h@VhYtI8e9t*!\rN:bf_E"H<8 +WD/:oJg;MT6I]A!aLBM\a^hCGgFa'51`FeJFni"Va#&`;N`8uL:,fJ`^+.9Nk?_p4hrqt_oJ: +*F4Xq,b>g+0/6dtK'r6aB2d=*teT?\&s0?2pE!h4)H?Qb"TH._9_MtMMbnruOLq +o.4tl?;;??>Yt+\0h$Bm*XPAO"nT#`P+deq'sZ]A9\62&Nt$S!(H#4NrM1&nq88p>pN`E+4&V +AXC[_P5E8a-gn"Dc0j/#F&K`R3.48,QImSNd0aU,f5U;hDr+j4/DilMf-qhtp%lCl!)@AM@9 +]APZ@D[E=NmVhan7'[aOd[-FsFJcgD,2d>L.lE31D^IF34brM5`QUV8gd29XhGM$B@;5]Af(&b +A&W;*fbuf)AQn_`G-jpEEs:^cY1NlEC5EeEGaPLm>]Ahlo7\:i;,id;A"\[%9X5?A5I'h[g(_ +sSPpjt0TCj$#56*,8N'6bkiHf1CY-dF3l&nF%<4ZP[YE_uGg6f8RkAjS/C[gWT3YaK*%+U=1 +!Rl'Fi55+7(S[=S'%VCL')mdU[m9\,u?TV7!no9W;UaB8klSeoblr=gETj4;jJa6,UIE'B+K +_IMWkZ,@bErE5X0,TV*eZa9_'i`Zba7+Q^UohL;_jro[RpT&c\ +M@HWJ1`V'U;@Al`%Uqfi;OHP4N;6aq/7r';VI64U^P5.?jcirXboT)P"qFBcJ>T2p,e'^3J0 +4O%t3rbDiD,E=73[217LX)s]AkR&M2@'.?KLrt?P!'?> +4iYK/%I@^G?WPn[9For>UkY3`?G6[1b8!,,5CN]Ao%3Vg7X32">`Kmp=Z^i]Am3X:G3+ +rLg*RILBGLCHAFu#06M%T'U-nP%(A-ZH-5P&C4#al3Ej%QLHI/s/?Ju^2,<#*,AOf.m7gk>[_HSpJjA4Or5r**ak(qs'W/F:Qltk'[/[QPMh=gQ +^[7nHqU$'QkRKB>>%oN)%tmT30BnmS,l\q`qQV?15962]A7k]Ar[9q/0JRjCY`Gol#:O+mXJ5j +`i88g']A<0[6!)8B9%YFY]Au=WKo:+Ou>dG"["HVomn*YF65DI'?\^IS:q4FQqK29TTH)?!s]A0 +26KrU)mRn4l-eiZml^e$CW`L5P)A@/(;'.`mW4he4tpeHk<8P>AqfK^F9RI7//"t&NF@8.`bHgmT@X:S*P@6$ +^.[98_Nmt+s>+dY#3U7\c0$9)m@!HT+N($G#1EN\K9s6X=nTn!nNC"Bi:;&T43f&'Q2V&#E@ +`>:JV/nWBR:LMQ'!(X"U]A[>WMeGk+^$^ +Pf39tAR=f>]A=Q:DQL1X[cA%[l.joKWN[N>prt4WOO((FOpV9Y":qZq^ZgLf3q-1*%\?(2S-X +@F.rGmgmXG/\%;&sja]AI>0hD)_TU'ZLS"D`p2KotPF+BR*##^e[>e0\:linK!k`X^H7%3#Q, +.*6ukUg7eB:'X(%F7)eaQ%?6CL[2_rtS%_"[fe7),XV69srW+^pXilg1D@I%5%UUbT_+kIrh +*V'?IHdN^EgncN^a?:E+r=S2W3,Z0#Jd.=QQ`J3lHupX=QAggk2Nj[C?m)BF!2BO^7l1h0GA +X1PqGM<5/3paOI'I5-sU0XKD6-3KF5fndH3"B%3%*5tJe?P+-Da7-XV/(uF(`b4co5LRR)B! +7_#a3m_Z>Ee!9IO5tC[HlViET7KhaTsD*9tIMo82H"H5L>8JJ>*i&(?&3LDC?)ar7-IKWiW8 +qKLP]ARZCcHlci@R'BP;).#HHVA6*3T%j2uEP$B?*3B.]A`T(]ATs3ZOW99m3F1c47Cb_C,?8)r +p.\E[VR@cMJcqq.cCZBFM1//Mb/oZ)L(pZieg9n1;s["`)QDQaY9+JGj?m8htfLDL__+3Rag8H&?MYtNC?>J[@ +P$(PUl/Jg\lu.odLflA\>*GH0B(COFHNce'ePEho@,pbbca]A;?;O00X\>0MCSFd:Uo<,lNTP +/;>o-8F<72a3IV`VMH@($Rr4C/E[!Sn!dtIbL\(8^3S-8*&aD(uk)V2Re4H\[hed0Y'\O2Y' +mS*-SL]A$q.a4"i4]A_PT/E&47"#fXr_eB\m[.XAE_b',DYbhR)!U(F9@E +9`P6X2;1$%H0)0t8,qeO1/jG+"@e5OH;p-=LkFgV@WM^!(lCe>fbm&&[5D_4ak7C!s1iqlKA4 +cHiH8&DT>=3H*%j8QeSea2UIEWQro&-%&:,GIUF=o,`hQ?i?]A>HScdfZBamV9,aa2I,9=eZp\_=(.aZo[^;\YAcFYa;/ +1l]AmC#:%BB7rf[`mBETp*%]AHm(?8;IlTe:e3U9FfLKT&5o/>-hmZ[i=dU8Agcu7[OpP'/E,? +[;sRTcoUVp`l#F27>cHg-U9^3ciEEgZT(It;.2@+X5oB3T:>W-\CJ1OcDe#5R\JA"<%>:EeVXV`f67,<_##Qdm= +V/j15-b@EBKW[j=EJMjoElBC@@b*K;I2TVc@GqhmSVRf<'U?ri#W^5&YhfE@r/A(5(.*X3[t +42RmCJ]ABQ,($IUY,]A]A?Zi'XW%t.1aP>Pbjp&[sB#k9B)Ign!,X-6%Iquh/8hGKf\(/WM?Y_< +&f!9\+_OE#5aI2Y!4r1M1;Ie^8?X)B5h4t^U5=C1sV,mJCWAss76Iqb&$_9V*rNNlnN<=&<* +X*.?kuIL-q'r%"b2eq]A*UR/&3;_-*4T&h.V9Gd5<@gZ2VYIrH+1%PW;7URN*WJ4C*>dlA\dS +kI,`V\iF,-Ka?L8nElf1,-iWtM?cBD(!mudbR:5Rk+WZ8hk(INq`4sl+%!Iijm3WEG8uYR]A9 +Ul^l]AIEApsp^M6.Def6UXuiKNR'7oK0mWlYKnn@C,pcl"iL=s6Jcukp:(*[9E@ar,DIF6Clg +2]ACd.faP9'rf>$3G'qe3D^b$NSk$!bdU$V:OHa@?33Q&\c4NNB-3$Wp6N^$@3&lI@T1+iJ?[ +*#0r4'U/5SnZ.qAhqkiK2Fk9^Ykah#IZVgBG^*7=0[>YrtNK$V#m:+l>=OeJlZGS9T9JQg$- +O7O$+2\56#:[8c\$HE]AT*FYibRqho]A$4<4jrG;qk4[#oiV<)^SR4RcFD\S)DOT>XK*j1G2YII?IHT]Agd$T#FDZIaDOLHMu4ud5 +leN,#N"8/MG[BVKe&=*Ne70ju,\l^A_M*9?Un`\&&]A(qQk'Z5A:iPRUK#4A +p:3VTD>EJ)_dA0B`aCu-7QkT&8^pt$+h4D;mg1.>dr]A'o<3O9_J8*kToB9@Sr-iGrN:#MMdWt`Yk;_T.&Z+co(7s>7m1+_MT6ouho9Y1Po65>ChW5LeK +_S&#:7=%-9[@@^en[t(d-9fOghAcfqXBFS`b +Sa.nJ#5n4N4&0Kan$t0GZ]A\a;U3)Z-?G^5F`R64kRStVO]AIn]ApdX>p!$=2`.Hf1`l?F9[iQ< +MK8cLKN&u+=fQPZphH>ZUWn5mf\^G(6HSNY$-A-)bK:J)-Ct6"$Y1aS7]AYjK`=c9's^FiIQ +upEVsYqREH99[Sm6(6+i+"#acghU8P-?k`b6Z,A2p>pAcc\7*s(E$lH$W7Z]Aoq_%KNGP;p3WR^HE.KAVocAR[p#J)@_IJV:u +PV*\3=%Ejeq,AIp/o\rGOM@DBWj\b9T#-@*.LS+)?oOqeW1-pc.p?bh%ONG&.5r3?WCkSlMO +<=L:CM=U1^8r&-9?!9:g:rkUUFY>*r!0,Cr[ap`3E:#k33/m;6C$t[T_QI,4e%:suP4XH;8N +19CUj\E!s,+u&G+W/r4[OMi:GBSU^"K,5dd1iC5E;K>@CY&TRnDMALt%MdX!TRYiNhXh7E7( +3JFdBAakKLZblYWD^i6R+,qZ`["C&j4UR(a;(M[VeRd&7GpEnAWF,tR.66Vj?Fg]A]ADJg\Oo& +0k1$*-ujnUM2p#.GHtsMH,WWMUpOT(S/]A;NJG!RrMACcM"l)I".TMT.Dh?i=RE=K=c4qs%GP +0Zoh.TQ:q/Mja%DcTf/"[T+$oT?e2'Jk._(&V(Ufot2bI;S_^r8\fmsj>\$q^@hd-c[1salE +#Nsom9Q=$UhB2`58NAF0jKV(,lPZpjlH[RkNB>hhDXM0#[7So(^Mg?]A42lGi0CTtn@8iTO3: +SYMoF%IWPET3/M.9O*/7mAI@eWs/`'6M0kE0*_?7Wn!X3M6<``Z9HB@Ikc3]A=<8S:I+W)h[8ROVK:ZHt(Z +nKiEOPn73.d:">"RrN-3Yjs20pe7<2.47TYR\4GB"%,Wu_q`"C$-tgDTB;5C/iJNo%@Nil._ +>6TTANk7BuWHJO)">XFapG,J.aKrDj0ea?@k6>@b0K<+A_'dTKsY73.Yk>UWiI^[^`TV+92! +*ZqeOPlfb5LSeQK05KS>)Gt@MNNXE5/oP\jbGaF%0,dW_?KUB[0QINNDK>%ob&t%F#PY6qpa +4c'qY*ocRl,hMa6I>r[1pC[4R(te!A)?Z-mf5!H($uN)"=U4JfCZhS3R)=.\cW(44lAqD2jk +Yh7>+J#'5%?L4p_,I]A8+I[CPrf8gJ)e^>]Al^95\\8CgG[>oG\?H;$"]A_5*Wlq$?p#,iV[S&V +3mlQ4&=su$f,[ne#9 +]AhfZ'eJB(uMYUWF:IZ+?[&.O9'[pPu9HfS?-L=P,IeY%XE<,3\o:Cj&J>srX3,>6dItE7UQO[;jt!0oI@JE[":TN_7T(rj,>We0URBLjI3YXFPI +F/nM>S8UpIfL`)Eqo@i5r)H_X8%k$ke6pG\NXeP1&_jSq<21f@09m@gNmTMK=26gnJRA*&(iB +*MA6$9DlIh'+_=sGd2Qtc,'Vt$U]Agq=3i56c#kk5Ylr8auN*2E +qYhJ(Z3M&QD)+AN/032K^H\+RA'jO`/Z'n?8VAL?27IYA7B*QC#=i1GrV_.\s3_qm*'cVaH6 +P_hm.Zg?C]AtoIcm_%sk_KH^S>_0o3<:knamNbG3760#Z?-7O)5Fe[g9+2,E$E.D7WJW8`VV% +e?FnN3o/#ei,5GTccA1oc3j,o;KV?U'^&WFkf9IM/:Q;;q(%-SYa(Cr+LA8DmKaJq.8,',,]A +Ebo]A4Feo-iMH'-HBGQM&O$m'l"oArQ@snoNB%^GL&!!0q0Gb1bFVT=NrS/<7(f\Ukl2N-Qup +7>V1:8kkkF-;\`4?q<;/u)n'=VLANDN&39F0$$YKii^T`Lq+9gJeChq^\9^6C^o**>`o,',! +,RUUA>7>!)(_i1(V["BHdfI"S?]Aj=:;%fB4m>R-WGi.fgT/SYdi#SVmc,;8;(Mi@O3p$I&!PWCZ3Ae/ViHikbK2kSZ,$7$lPEk7a2ph;UJ@AA?KSm'!5+Y:&AZ8S*Z]A5JPC;Za!1E3n,Z-H2>J`TpL!nQ~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>;InMRsZQ>,57KmSL9(MaJVsCN6iC&>6NK/M=j_G`,dGf7r9ggu4"fiI:Og^>q@2kF +C3]AH`pRfcVB_iViNg)'UT.3#WN1^1?o,NL_'[l,XlfSp_C9Sr$2CJ&*R9M6cm\l,!A:jhNDkI.@3kY?RW'Z`ADZ3K#*#gC^hSC7P +$G>iQOl4C4/(pF6+i4oDc."T]Adf#n[2h(A*(d&CAPucbY*jrqG?c7fWKu18=oAVm4Z\#&\0V +M&:_lIROb=g`F_MXi,k$pk'g]A\G,g09ucm.0FDm(s4-,hQhJo-ft2;\6SFXK^3S(NldKlqfA +f_t/fVY4BV%#4-6X%"KjjlOR]AdTieX3<$mR05bOQY^H_:(^%PF_MkYt>.o*migq+X]A?!r;'3 +_BFVu8$=9GbO!>aXn`tk1U+YS"1BU#J(m8NtNI!%+@5O)Dq6'Si/rY88DJEMq4Gs:0\0)Y38 +rI6Y!7H%<2g07`UG,2iJ.Fo3Jo3?W8KC6Q\+fqG"tNG#N"=E&mH$P!IB0l)EZnjk$Y`!t#fT +\hX#,VM_3(KmA5-BZX8\%3%N#+8ZH(k.]AS4OKFj,kre4Pi`CA9=:KiYLeT\;PS'30q+a$^YW +W)QtI*4YrO@,90*b_l6e',H2fX*=4.cQ?d@>m2460'_)iV'BsX6ZudjgkugkL%7=M^giMOD% +:G:!r#p'Q+H1J_\l7L+Ad5`'G'&iT>%P@b5R!f63OgKTbZ:NX:/Sen:tAuJbW^fs*G:Sd"SD +<-TP&8DX88JrX:udh[DmY!#d=6PRqfNVtrRUJbc+2E%=!MVej@F@@(9/k)ZmtI+loth->'3E +N^R?X\(st3HIE.?o+,&%bc%]A<_UTQb&tMg212mUp%Ja9I`*5RZ]A#+;)89@&4f]AJj%q7;a#sb +9i9pcQO?n+F>C5$\Ai#gu-*!us]A1ij]A,MuJ\A5Bh>HY$b'jA+ +R]AaN.u$5E:Ch;8$m__90-N)IIf/cBVNN\TM1>`''3kt>>:eg;=`Hb!@mTW5XJHiFT40tm@*J +u"W_;\fQVpl+5@Q)@&,ArFs1lF_?VmMYJ:8m!QqV]A-;l8`c:3PMtu!9+p810;%@B6#4;/\VN +I.VLtl*1V-YgI]A`G$2.H8RbenaFWp&LPKSU.po^B?/#68n02D1_rZDmq%8>tGk2)4`qa/Xg?S["=b9P&!oBJSG#1.H.-(l+,+ +A%&0ROQ%Pn0baPnEe]AE'*7ant\UQ@&grl_=UguF")eb&dN:B-@4UVK-^5O)b4'q3%omO`HT1 +P2+ogD:3&4P7kfE;Z +Ug_%L/l)MrU-cEe4cGN,Rj&/e,]A/)&h(mIY=Cq_;ub@f0t9s,2AYeOr;Xs$e;XIoq3hs'YkS +S,;Q#\j'E(T$r5dc,:LfU^1LB+7gosm[f),TRZ"5;LWqN'-\ZSZ3b='s&`+f=c#rY^MO[^YG +bU*PQIk-h63CM`ffDZd_+LT'GEPk2!BkWnFq0Eqcjc+r0T.hrF:lIE@'HhClT:3ADu+#,N;( +l$$"a8']ASF2ehl_dIKN1i6:Ve0mH,_6"EHA;i"H?D=+S*Ic8\4#B@lETg7?YkcCtTR.CejY# +BVM,FHF3ipg>dPHf6G1Rp's6GJVTliDP*'+,Wr$&Eg;@&8]AS#9oVb9-J +mQUt'X0EO\T"S$2N,TmP?:nQ'qm5/<+f]At,[8.7C`93 +K^llZoj2BEb\aoYE9;b*94hLmL/Kl7%K39%`pV.^)"3']A]AnKPs[qI4+pUG/r7Ct5Ki-_c_0f +VqSKg"U!;PYnn":m^!D,qk4;=un)?[$=09`!^VV5+*lB2B^T_p.,b="UZU(kMDfK`l'u]A`o4 +YG1MCVU^8O#rEs9:0J'UP]AN$ruQ=6/4&gclbPRGh7u&XBT34kOEqF(g'uN'+'LSPU"an4pE3 +K6#jTr_aaeR[gmQeEa;;%l2SbAr;B``J$g1#AfALE0mjp^HTofBie&^h)"=ceIV3e=0J?P\NW:O +ic&8,[o2JY@-hfK(hQ@&Q6-P>*3837`?=)+1@5H*sEMjXfD(OIl+G8MB8'/I:7(a+/0` +nrI`XpL>7fMegs!MpV]AR]AQOfED'?_!3m<1#@#ReNuZEZI+49>-Z%..:oW-(-.tNbc"-Y`rQ# +Nr9:UNeA1G/AARXE%T\sK9RimCCVQPhJ^UpAa_l-M5_8+X,uPLM1H2cNA]Ajp=bUi)V3RWW%3s(cnkj6"bBUa+J3oRKa#JiY:gn1h3 +;HohNl\aijo!5reBhHcFj4alC[#N(U):1t250U=f>PLd=eAiRP!52Dl;]A,buteEGasqg1bEV +rk&[q!\>7^b"YakqU(Qm"'E^olchgOT`/Tc$L%pbk_M]A;WmFoU+`jDt@rjo+j*#).3#p7k*# +tCNV7a4pn-N-V12tQfD&uoooC;OA#ukj=>Mik;]AIp'R78paG"n&D?J5fNg4+e!^k/%+8oR`F +&UFM]Apgu70*PGl@6TF>k8"0MA:cDtWTe@>.5k^5<*l\6f%r]Am:`Tr/2R>$9?>YW#^qB!Z.90 +g)1dd(*".BAp_l"r7X=5a=30[b0b+Oa)?D[g&b9Y.Q([YkNhX*Znh7e;3VE^9olBCMU+1s3n +\+FE!*5?)V9b]A$oC<3SXpWgfNE&82+R']AiT%N=8uhY+ +iE:S;opB`5b+;1AY^J9nJk:$LVt,]AP+#'(173tsiD6bk%*W!k_TY7:R4dI[/PV2H:m@uYc"M +2n#j%hgkDV5l8aRt*P5e6A48#ff&gDd-*?Pmb1-?t_G9hs>8EP#UB?NRUu'WZ*i@mU[-+=VG +4@/3_M)[P\S]A$#fk2]AqXnMj'PLE/*M."Z\I.aR8sFM=9)&hFSEd\$nR9bF,_PnBPO<"Z[R8s +,"W0E^/%n&Cg";r\j.uPSVd'P#j5b_gA[J;l3uffA_%d,S#Ta@-J*1Wh0#PB!Pt;nbuW_UTM +KC5\2gRUbjq5j7YQ>AV8UA+?+=_bZWOI]AuL"-EMuAG^u,]Aq/_d'+3'*ce,%(c)VG-/1b/q:) +o0gG#KRt(>r??&%*6B!e:o9<]ADph=36\P&RM(IIKH[rBX>u.ZGY`/tY+\ +Z8B`F@&(IHeD0'd<:3D@?m_2,p6UFe*"Vc';=$YA_"?\o%efG!,C;Pkso@>_C><>&tQ]A3$M` +#bA&Atn)mRA&iVr"nT_A*ee]A`+!KKYs-$qJm.Q"A;/

[5eGln+rn*s"Z +E`-\HqEO:o=h6X3[eC/]Ak/gkETj1oG`BS/g/L`N0cLFSl16C=kZW2TD'`Z2eZXN:ir'N +V>6_Xk5Ya)tXr";_?D`9)^'G*0%;heIP58]AU!\]A-Pqo,n]AVT?..T4Apf(LX,UVr8>ucd);E8"YYJZ1L"Aqkc()lRVt51u)O`fBih1 +[&@K<1iBtZV1BB7n3gZpi$c36\4L-0)+?^QKF]AW]A>+sd@q)]A`I$#;?7%AZRFVt*]ASCo>%_In +W;WE[S+q..'S:6U)f^P6b/i +B%GPef\G='[.kAdS+RGW6Uq9KXq2!>!Fc/)//&:EDEVX'e>#:;Z(dIFA\\a*,OcY*a8d-DmO +("XrOgJ`V)2Th9?55qR4(S`\#r>tb\bkhbkQS"tnN2sOW<&7sl.nQhl!l2028d.=,=hH9]A2d +t*CQiP)8IsPJ,rr99W?lKQ!?^m>JQCU(V$HN'B^$4M +^aNRUrOh`0TlV-.7^_%#`TtAOqD#7ug1f%`e]AsaGa!sX,m#,J^#/HSr&&HP:568kW5Q93l5V +TYm5@I;^dgX[J*LFUHNU&GDrMO6so-M:B,;Wr/FLI<8u(#g60t1S[j,EnKF8=A.5Frhf=``' +LDO-,9,6Y0!g#h]Ag?`h#U-u+4SdXV*D,A:>Bm^#6%o)QIGJK),oi]A$EM$6jLoF(QVafeSILN +AX;8Lq+&Z:+]AM>Z=ArQ`*:JbuO)MWhURJS!dR*19O"F9L#W/jk2`[N'Jl6:1,;1M!G4V%(JR +T=(gt$BD(l+Uc20M47V?ocPW?Tt>`Y0&#$r +k'\gLPn?na=^m)6B]AWYf>6h3!J7Gh:d^n9<]AC92q[*4#;\TQR`m5LKpn\[g&S-`Z6J6P">fI +l-W\a\OehNe$KjXZn=DdXk5r11\p]AJ]A5*7h6Zs]Ac?.t$q94ZU+c,(K +7Vh#SM6s*c9b+UK8JUWYGaE8'XSN;7Nj'b>t[_Mt>,e%p^+:Ms;ok:^0s^N0]AK69n>YmO"&K +?J.q,HMV*c!kUDlQ:d'G,gEWn;f70`;TSbfUU7R%>m_8LZ=?83l7g>?^;D09\guu_]AjWnMCh +Rm\!=D]AjL*!fF)"PKU,:so+/R0Yt]AkFiE1X6LX-RX0j3^7XDhYE0*4'$ac=?%ul5*/!Zj0Rq +s1CkGHT7h_"aN`KqBXs%mO?[[S`=oPjLa'+_/geoB&n/^Ed/l2+&h@*9b`*W@K-K9am[RKYOR +oscZaDN2LgPF?t!_aPM*d?0."C3NDM+[gP"pPUr;)frS_LoVJ2YS0V0O5DR&pFR#?lM41M89 +jIR:B`epjNeP60Z+l$W)Q[dr)q`)E`Ul&Zp=@3L62*Tj[UVT-Xf53%57fjYYmiWZZ)e,Z&Lb +to#-"3HCgj-VEO//7::V*-iQkq5j)h +(G\i"e:`m-N9YLTQIb&D=1^aV=ri7$/rgDq+VadpB1-Jgf,;-F*^i#8J&Aa*44h8j)HLnsT)RK;oC7Y&O/=\0.ed`PoaI\let@Tln +:3R6NS'`-K1Le4N1Q<\4e62IcnS<:g8n4_?jW\Ve'>&)4gC6h^pHU,g<1R>J59J"IX6jRaHO +fA/2"QgDM,U0:U.lVNnp\9A7%#\j*/k:I\]AV%+Lt.*PB()p]A;p3pP-f45t<3]A&oZtV2A6+,O +tb;]A=COPE.1.2(%j&%B#H#S\fu7G5aPo=!DAkZ>[]AmoH$.I0.fN"H^G>e2CB-#Yh@.]A3j@9/ +@%4Qab'>^0/pPoE+61/A5)e#(8P3?Ti$h6o5iO"@!%23B\N.$Kh*mD!aN`M;$Ba!+c[HP,4Fi'1':.5BP'S:;H69)9[R64fU7?nsoW(**&DfE-QY#l96IT/>daP3EJ4lJg>*E\GZR(O\Q1t"Prr"nYe.#(s0n#cgqO2B^MCm`R +-9eB;06!Rh?u?fn#AMlBmD:dS-AU1!Jl5VO>#9)g@XI"f/)X#qX9TXPBjLD +*>^cha(-HCEQASes6^X08j%/T5)("Ft?&r4An:SdQGid\9XrTQ+\(4l*6ZEM.1I99o4Fg7&T +0`2e`[*0@*q1DDqc!gGX'JV!/Yq:8+4-,'UKD)\eRFZ7ko-<*q,gf;/;SV,Nd))H,V&;PBYU +Fr`cGc0h7Zgac)Rfa1<55"I'R<0s�s"6]A<9FMG?=fM!_8X]Apk9VS:_)5M,A>]ACZZL;n?cL88`;m(fKj,65"hMK5E.u17!i+ +',M:OR\..=3%[Ouu"Dp'q@]A\F"gK,@M.f'Y"jrf@Y`!9in7%n3 +RRMq9V&9j\:G5a2_k.$A[9?FnfRUU$)tgPQ]AZGi.\Cgj/JM8m_dZ$4,jmV6G._Mp[l +=c<\'MBW*9)@RR$p_8@ijE]A\Cll^V,/$r8i#d^ifR)3&r5EiiDU5%I0$+OeNKU:9!Ba?13Y9 +QdK$5$Fi:TUr"g$?K)YUe/k-@SUh*b7ShSc8CQ0r,.-^mt53=Fj0o/fmcnKC +G"Ye^+r2SS+D7VeVG4AHW=RjSVe$Tah\.3))%!dlB@O\!4*DI2op35N15QoFd4r<4eEX5/QJ;-1>AS*\Z[.Ad^bRWJU\fA$_m2'EF+`YtgdEX6FW_fF#U`X(0Ah%5b_SRgNP$q/qmU_\0>G; +e`1JNAhY%8@)o8[_;/#c2RLgi@U"(i5r9R_f4[7hl"b9?Zm:Iu%+(GZ`Q!\snZs/'AeH4$NK +.WXS@lg31Skn:5Lo*AQ1;DN:anJdCHD]AJ^;Zlul]AlKoCn^T7Z8G9[R08m06+/M;Y&>[@XBQG +f@f;jBPA+Cr[(&?LJMPKU`;hB3;_@^hh?D*WdpkEMS_LYUG/Q:[-i\rk#\@l3Yl;o_HO#^:: +Hp^pNBH8E]An97A3;"l%YZprOBe:_%Rhf[SM,eIBD_ZnQXC_97\QZKbUNPK0'55ZP%;kt[[W. +bnAMm\p`>QBcX^OG!LU,."=*n60^l=7.1]As7LqOVfQ^s&L,$0tVX-c&IqG:%B,mlG2eNgncb +T&aQ^*qjIlC$ikPE!,@=iOAD,'W#@=3G7Q#hA`5)b?sTl6\kQ'`cf60ih*B0,IS>lT:QNQDf +(n7MHgpflH@SacUYS8M!hB0r@PK0d +,[F@oARKB6?"8f#inWZ?pp_(_c@GEpCPf(^aA0@Gr%P%kmQQEE\?dk;48UNbZq)#*4gD5NnI +2&!g$;0jQ23]A?\cC%+eg2J9QC:K&+iOGilC@aEZgq1)WDdKnM-f/CI&E9E'$9I6jd[&oIm/? +Pif]AoaM(rr?2J+3>,$l`DQ=R^/jjb1fEj;d(K[+HOnNLDM2Oi:4:Qjdcjj=p:A2mk)5gM1[g +4^'>Da0P0E`nS2_C+hTAfS1TBC5,u=qB=;%$?`8I3S6:&BZS;6?c.J`E:$QCDk&.eT2Z=D9Q +hZkD\SJYX!OnIaH'Zo[+^nchV,L6)%oG"h>1=3]AZ2!a)^8#T>1VTQ`TrCfr\fGE@+\cl^9(Y&"r<`mcC]A$G:&a[AF<]ATV!Dpq5'D4?f*LJ4W_4W335A@[ +?RmCoPUV@*2J]AEM@CgYen)=eK2i^8)0,\*78$4.Eq7Lt0'tAY"&n%:[m3E0kH0\X:&A`\k,O +m%mekAuPoj5MOY"V6d)gN@ji8WEnYI*LrKfs14,IIkTTd[A;:hsV?B^9j]A +N<,)a5=3lm/k%aMFdrC0^WjKLD*)RS)oeT!q#/Z3-_&5L8Kh[1i$>_3Tb*^NO\@M)6^=2_+n +Zj@Es^%AIU8T$e,'$dq0+e.jcb_5`5Tp*B@)nXDl)4Q-`Fb3LQd&KYCmpucU"jq$Uuck!0YrbGK*3C_5K[A^-<:b]A0MW92Y*l]Ac4?sY6B"qFQ3 +_&X.SBY@X^fDZUcCO8TP0.2i%B#3KHTeSt^I"7V!P8C1=)fJ^H_,h41jdBWo9h/NX*o=5JIm +;4.6eh7,!FPcGPp%alIj5S1(n,#r(2p'GJ:qtIV\oHU!pBMClaRsr@]ArT?IJ/t;H\n*l?@SE +K81LAZejtrd,QfL&Rq1'TiF<:bd-9g9UQC/7nU2]AXRjUX_=l@j&\IaTBN8/Wp@+Bf31HTh>Y +4%+aq]AD"_A3tB]A>$O4f@`0`J&uCVF"8GO]AUd_,/*2e%crPNO!IJZUli*&`,&*;9Bi4BgOB$k +%;m2eCXXH!jGoKdBYgl&C1&40+kt-;CCOaF9TgW#L[q$PkC:hNum7e=00HtU".RrgWfZVNbJ'$bn8^$tC +g:4:u1hY\?=HXgNMBJG$p(N;P=X=,6"TU`=Sem`'T&kt*<&L2AFKV,YF`dak+K#-gq[&$uO0 +Kph@YbdKQ`6V49Qap+&EM'7k4/49PsT7\(YX=jGOdHf%aet34Dn9_&O&7OC4@m5Md=,2^sr]A +4p>kUkqqCU\C>2=I_*jJiqoGYWM2UhYLg-$c[""FDeYg"G2CJE#?6+\RkQ]Af-iI0Lm+r+8"Z;gY]A1=B7lDc<,Bn[Ul)8Sc?tW)ge,OV?X3cL?gUD+537!.sQ,*"WB`6 +WNd6B7:m+j'sIF?-P1Xj*"iC&,><[aGA:VfrS:@eX(0>/T(1^mLr\*24k!Cff>O4HA[Bc,_l +mYaM(+0;iZ#0qAlgt)N17>#MEq"/3*K,id=A@6E92H'X>q`@?tf/"BKG9sTP=PR;R"[ot^RE +qUHDgY*MT.\rF&b,O6[JDJu%1FP9g`O"r@%\u?Q',FOnsF_nL)b:ke[bXX=jR>(V'JNBp^]A'oeD2Jd'gVERP\0E0;7> +LrsF68a-Y\ll09Bk_C#'2'uNOc>d_i&bc/%^?5XN+dcA%e*aR&L)GUJeI:4hDq2E[7Q7?iOG +s]A^"_Or=?/r\mWiHLZ8.S[HR_]A61BKfG<4+ChP^hWMb7u?br,\%Cb8$=Ff:$i&Ka_$Thp&HU +VeBf0R,j*JD0qCM3g]AKmR8+O=G1EH-5<[fMm#B'!&TXlMaG;pDaDC;64.Y[jd9Ju[>DSL*k^Cnb'X&"VQUtVo,%5F[[6:)U7\QgBuN=tr>C@CfL`9gKGQ9'%bB>341uW`(ZlN::%$9RA +U'5#!;HQM(_RWB[(=BjQm9uZ3@?^kMt$1J2&7U:7]A5_Y*3EF-l@i\-d@isgR,j&fLq_&(L1M +AfD.e:E:0O!-=>dBc%`P/uiLD\X6g_c0$*snLbqH?4?@Iq_3@`%\Qqf5ul/qh[\`OQ2XgX\$ +JVi,LNG&3mHsSfDm_)&]A/Y54Z;^bo3U?h<=,58c+X?O*C(Rs+6h'MN$>M8Me?!/N8`m>[HX=?a;/.\kE`7@m^43h8Dr+/$Lo^P6Z"`\$k +]Ap]A0U`/aEZ\*7(561):i_X^SXmI!0Su>+TH%=cTV2#7'kN'#So**tr!QE_sM]AD-`EJ`Vg1a: +.\F?W$6%Z\?6BRTEm5Fm#&)h*WgCB7jI"s"6$o337W5>T(g8>W +Y''USUqngd-m0Xdh"FKj=I46YcS]ARH8!k(Q'R0K$i@)KDgP@t#niH_XIBO40T".WqH=:i7ZC +\pP.+A98+AsWB_r5r;>Zt3c/U,A9'8O!h>NWOU2XO,Qe^$%?5Dk4cb+`(G%?9um-V![;__+&@FUY>Ij +Y^lMjc0gau84/b,]ALe3Ct^eC?U*i*2WS]Am`]A;kBh:8XXrE(7i[E>`!7t]AJ?&T..Ctm7BMfT(p6A(*=5piKYjt\LgKo_g^\bH.P=@'[%[hoqL>g +%8*De<_?3XuoO/3$gmn*(!bk.2T$l>^T3Ed[RFc2BdY-t7,lnaY?Pp"trGR@(\PP/-L33G>! +`j`AGjO:STe3kP.g\.;7KBRD6c0(Jk$#->j#X5LQ1dM-hP]AXt7/XX!n2iWJj+,Xsc$c-4C,p +/Db1k@L'$%[JE<*EQJ$X8h5CfNmB"frXU!8mqBgg70Q=7*34Bm*eRs*>abl0u^8ZUG'_qO[; +!:Q8lHHPKT#GAE>.1Sl+\lT8RbO*i\*0^V^AV[i0bUn3r!R&TUfr/H7N9Pc^p-?%)'lW^'euH*l;Qq1rC[&^[qeq/na@lL'QL\cGJXI/k +.7nO,t3$C;oL)?^Z?i4U8p9&AhX-g*XS]A1gR^$3*2g&AMb,,lFdL&B/54O@lWe.-:(s:XYGT +?Xm#($Mc)W*6@ea`-bsXQO9SQ\F8?n=NqkXaOar:'C9V4p3a$k$jGh:[K%[WTqH=(>l'%Buo +.YL=bg.4DCD`,lO6irr:u^WP/T3qTd\`t)=KM>CdfGoQTLS6W;tE8Fe1]A9V")Apk\Kb%VdtH +gMZ#&*'bXj1`i,!hB[m-2L3O>utGKE@R\oCcM4gS.4DeCV*jBBS^7c]AZo^"=9+E+ThckWq?8 +#Q'2AFXkJhU,,,a39?FZ2%LMZYj_kgd/1_1/+As;62]AG]APK[(`IRYXX8^mF+:5T;7[/?S'?X +cQJ0m6.H"YodC6Fad:T43R?gl$MkrSJg[!SFkK6ucnpe]Am7S6+LpG:ABP994o +&)3oQGYasgE=K]AP20/i#Z +gt6oA5`g\bahMKY%,Co8%Yd,mW*?a*JYX59Bm]A=HV>DPi+4/bRDm<"(d/A3#>CBR^(6.J&Z\ +5qY$:b(h:GOS:,[6H,!2EMhY]A361+8DlqfqJ+mK!nm*^'GX0gQkJK@c)FF[qoS;mo)LWlCY\e!(\-d +;2M[o'CkgPJ2V49l]A\MDA7`o"Wd"6_iLBXMFe_.aS)UcU/mLl_58oZ/RCR-u%@!a/%2p$V<+ +D]A=PmtTq2d&Ztg$rOgsK3eMG'XZd#-*WLf?R7C,(FgsSn`rB86Ou7)cWZCam]A2O&_:q*M"e& +s)C&WgYQU3iZalQuM_kWd>ZDD$aqF9\8k#o^&r?b6!,4k%b8'5[/jhCQ.3QX2n)hB#MF4-V, +k#D*e>1j8K\"B5\WcIQUdC7/;"#CnRjT(unR61G3E"e`b7%6<^._I$INcZT=.*4PP/=ZK>#2 +r?qV?KDO$F2e85lkl6E.kb!==MEK.6Ps+"V$b)Mg3oCnD8j6qUUkmIXXd[Xma;u@Jmtp<5\Q +3Y$F@8&D_BhXmBGmn'(If`d3DAW^+u,&Cm%IRNlLWTupFe--&O/,+d0Z)o7u(5MR'DB+N,+ejs0A'iF*4l9qhASY7-;#EgZ#-+$+ +MBb8I-mG_3`_r&1ZRTA#`p.NbdZdp,dt%:pK^^ek5r94Dt^1G??)I37'nE9j5/_8- +(Z\5.j5Pf3]A[^d-+B3S;bm$-3i..^dHd>XT7lAV3/!E'RbWsrR0arT33b:%^Tcj^&`MKO&5Y +0O&2/b#kp!kk1'$lZ&X7.,D7^=mM4(*f^N=Ni&gV<8j.>/+\*4a*^R@-("\7NX[X]AcbkA6*% +.m9FC2\1M4tg/l&ncpQ0YW6&-%<>iGJnONK=NHG8&*om=#0(a':L0$81U$4j'lm'q+ +U+#`70+9n?0rN-^K)TRV17+PfD#Em&]A7o@aB_uf4oESo +N=mNmY958%JgGG\i3ZJWSZ>0i,.(4)B.d"0(/Kr?oo*#p<5MR(^\LoQ0LOg@_-Y?8D8m[JZm +RT&fZl8KeD?67=7_&:lf=MMFeJTVJp5f"BoLne:DG"be]AqDA8n=ud*kHp@RDP%kLfR:.!;+%dR@+9+'\4M70AG% +Wo8T:RtkOOT(L[/]AAK:fQIKCEOiDWtj.eHCW`/%kK0L!)FDF_`iAaG@I26c*IO8(GEjjM9I[ +`2;Oie.rHeRZc9>'t[kM#C.%X..4HksFH2C#Mp*0rK0p]Ag!X6YJnXHCF]Am&V!B<@1F0TB7AI +,AIjU3YkOa-1H"Q:U#ut89iN%F-np(+YZ_O@dqR]AFZE&FJHdO.S,3%a9*%$?O%o-6c95U1M< +BpKf4,$*/K*So/5,*2&n1!5>b8@]A>?^s7$%j5dOo'(OVF.mWVMLZJCnXL8D"B:m[ZhWL5'`I +cqJo?ENU[,ka19&$OD';NR@T6!J4[R";%s:f3%^=&1"IJ0Rgg-'6=Sa=%Xrr%Z\<8n"(0_5+ +RNKt3ZLou#U\qeI+7F):-/a!/<17sb*JP;r5Ah=h!;T25%;hZEU2]AF!daG%P.?]AsW4ZSBd`)2UsX"3:9ADs,4lPjXOPXD'YLd<0mBptoD.,Lbq +Xm%mWP,Xah\O8YIJ\![]ADdEFT>)7g525$*eoO9^V2C29r*(S`>Emo5YW#BU"o4Ob?t-56pHj +7OjpSc>#ZY/UK[U3LTE0cta'#L*ORkQ\@635W8E]A#qU$Q$q-f&'@l[>7&"8LsTs4BboIc.o6 +Y-"0r0M.Qitfp!EdEL92.iU$N_'f$]At0LVM2L*jjt3#L0,=5!SeaP,;CI\+l@rdQ>5NAnX]Au +n92+BenH)@&/)QLR'4RCl[2e<%PfHsqXWU`+Mp;%P29N]A>Tr08Nh_Q#Lu!$_:H/r*kq='5j- +S*[V/O(?"0.!d")ec+?G3T6k1uk"jm^&W5n:p[rEbkl[GiL +a"/q3EN3'emT^&!AW,YTcMJ9J+gD;rBXP.^d30@b6T^-f^f_moN*qdDumJ.TXFK0hkmb33Q* +F49&MGUNr.na@gqGp[!5[2oeS0*Ch+Mj2G6/Ej/\"*IG3h4_gkJDIZIhrU[s6i!*bJ^9BL +pTpJ/UDP:@G<#\*.F,DPMtk':pe7^9nSa(!_kRI`>"@`Oo;AVN<0rg2:BkV_^iWB>tehHr,%6NVnc=Y&8$r3nrClRBbonJ\ld0A?n_.[7tSI!VN4Bm*]As7^p98.T+p;8B8F1L.lnO$ +&VirC\H+%4oIMpk3aq$7a`KNcdXK*ksZQc==/B#Q=>b[p1OE99#[a!cr!,,-4]A6HEAs=W/SK +B%_/u^Fge$0t.Tb@YC6b1k:CeH%7n1qjD.r]ABk]AZ@Ig%N91&r]As]A\50o*=fmW<]A=Hp)2d,>H +mgOcW"dL#BBO6r#%9'+BW[F*s!BQoV0'a%sHt8,Ff++upVMlIk/*)C_6UT:KftQuZ(l;5+ac +CS/3f7[0iMje2W(nT&m62';@W2eaYPIQ$S8S<"W'uL2,FR)&'D&N+`Vsu^:_XKS*9h5,:j,Lr4IT]Apl>Wo+]AYtL'Hs::BV;@"l'h*)j +#/Pjf!Z7SX1jgp-+p`SS7hQ4<^"+M&(j;1'lJ,p=hLdoX\n0!Dj1iHr=mt._:sGKo252iW*6 +b.&0o,rake6"dGeps(WDM9b+=ec*cHf'QgbNe!(PVAR`l)G +'9nnID=sQ#-]A0@nZD9#D'J-<);g=&f2,`>sHZOX2L4#^(AJ7EC1p=,H?>6+\J%PV&eZoR]AAF +lB/[G;*W]A=5r&FltTJXB%;GG:/rf/s:c]AB:R:\e_u3RT4_9=ggbi-X0o!PqfZl%^[0Bi#B+l +7P%-*Bi>CHb0NWnG"drV1aG0V4a&%`MBQW!unuQb;$e`;c,"Y-GX[cpJgN0c4rWb@5<-C*tf +aMaU.%pb.Hh$Hd5Zm@AJYSVVBi-)S??9R%'80GMjY1O2j@?)HOBNRIZ@TBqdW@u8*Bg_'*JB +]Aq#rVJ,r>sl0pKus:XQbi;O54RpSa-AU]AmP3LN]A3S +"l0W]A:0@CU.a3L(`5i*Kqe0jV4k`s9'6!\/bkG$0fA/X0CWSUd.l227fR%8=3IU= +ZLdT^*@DdC<$s:i!c)'un6!&r:M0`-rN#`4\Eh#P_g +e2q0(lDl@pa9ecgdpu#ehl`MbLkpS:33@`)Uj%+c1g(^9]A,bbVQ8&q;8>mXq&126.]A7"[O#5 +1d!2+jCJeE<2'[k07lI[Qno$2OL^T;?s"V11Yl1WSLPBaqI^acH1YI]A)M,T_'GjBUO/W2AuXI'4 +#u"%_U73LcKsTW)f;L_XblLMF6KGKPdbJ5@WG(Xu)=)<_94a>i(b)u?Bf8Yb@1^PTMsju(Wb +3f(>aXt',"i*pWT@Apa&o<)AAa44'qR@Ult(N#LrnSYUF4MeLG$`L\i-I&jt3TQmW=@2,>p,koVoPq5;G6B!)YM8+I-d\rU%("Jj=fiPN[m:D8FQ +aSYLP^?CD^<8XFh2QnO6R0F1YP?o$C8n:I?X7#u&"mL0IRA>K+i6AT=e;t[@VU@L4OsSdmWF +Bk>kK%V>@gA^C!C:kh3CWbC\)\$E38f#I/fS$(dCluZ0t0R.2RL-%8,m$j/*7AgolcRP*[Oi +4ecQcFd)5_a?&3f]AnW)k(06\IM7BL!?M!^Cm8DB4:Q(6[Rh40G;P05kqTKq(`r&L:ZOLh1"g +`Q##6Mua3BUeqj%$qQ[Z-k=!I&n6AnN3KD*kTm>(\d+p4NUH?p0M:";#iniZ%.\T^VG^Lc\f +c7Sd[[%\4(SI-$qACKW-ofWqM,^nDLIY]ApYIW`7S,'YL"MXJbc6WJJ"n?"[GFHHh3:S\E^rJ +X((7BUXMJ'l6H5.%F-d!kMbMBNWqKRthYe0H]A=\\OQOW;^=&B_U"h`bA\*IN67&iq3,GI-Ep +IcCk^u;cdV8Vf;NX1q>=u[c*W>]Ao)2rel*b?TQX!geG!Jc=D=-qN*]A>B\Wn1(AU&ZCd2R1Q& +D)Kg_[;Sbr##gd3c0sL3)aej]AU28ZrX6`^#4h_8*^KhS(0U3Hap_>Gu<>>>jV3#.n?eB.6X]A +af#!9XrB?>O_hm]ABEQm*YZZ7(Ct$L6)7UP;FjYD8%DhnC8B;nGFN<>;#eqjpPK&919LaqfgE#P"jq6VM#`D+J/B-h-2F>N>]A6?4bACCNE]A@A!>?c%]A'#6@L]AaCA), +G#oAB3X*7n(Yd!J$E!bU%j-IIJf_?p2+5chPqS"mXedFBZ[aaRfiZ:q"+63s75Y!B_9RG/q> +5NdVm3)!k8YJ.o3YPs-O)fm9tN/-L@p.2WSq<0+0i>q3b_@]AA;_:i+5(Cr"C7CM(oH]A7`.J< +8SNN4Q'rV0p+ahiZ3(Ib`'#l$Ds"*d-=H.@"bdQ@[unNdd#*!P?E ++E;7GZ\BV!gn8#@tU\Z_"H3K>5G#RUN`dRCfoLX<]AT0)13D2WFF^);EEsd'-2IT@"l%F: +*IlSSEO->2_iSG?5qE3ru.'=?qZYi(&fP/\,5kq2GaGCm#\foI=#ajj%FBSM +YU''3KR&G8p0l/4Ve9N,rq\kE'%0^1a9@s*/!i'QTE$:C?X*;%S]AmrP[tf0s#9m5(U\-ok4_ +ZcomUme[riZ[95'LB?Z>g> +brTg*$O:Tsh[ib\9ul0PpD!1cqr)1t/?h#'H\cj;Aashl1^BeCG3S"D!!/CfI +OrVLBW'EJt87;T[qeW-n95]Aljt2fm2Vgl>G[GAJFoa.1t;9)>("rm;eh3'^6>JV.PKR@5d;4 +<[0XD8V!#$%sNAH>W',1:JEhR@l?NXrO^sCrHBAPoG;3K7Q'4.9DTTBD.'T?$8>N3EE[&QSOMR?0[tbr$i>Y2UVn6,CtX!g&EmKjmc/ +k?$t!]AVT@&9LghjW=GdqI8;3-f[M`S>%,",hCU/qJaV'cZ;F30/`mWLo`bt.d=A!/l0oRCb; +g;rHp\j.Nn(uCZSpTr#IX^IOF7)3KgEkG8HmVU"SGi1>ochI'`%TL``m\aBkH1c^]Ap0sD(]AC +/^$Iu(Qd$KOG#Er"\b+5!q[HQ+'fS,#^'Sl0J*Z&F8_P]ATAE9P;#>HH.>IS(73ae'oJn,77j +Q\)sa9Q1g!Gf:e0Nq2,g2uF]A]Ai4g*mX5X/c;hdTOQ@TrJ/C0(Q'1lMQYH +VJdURY\cYHJX5]A4Wk@]A;LaP?D#XQ]A4ie+m +:4a\S/6#]A4QiTe+9N6-]Ac(QbH4[5/s-?fGZh*?%$l^XW^ +^1m&b9X+SVj$=;"_V`oBj&.Wb*7Y!9?V6ZMKPI?o)3O[>F(E>R)1+VT2NbcL]A0j93O>;XCGHd4FKC*` +ETY:aI@YR3J-rU,"AKA^VhNLL(CqHh6XI8"YIUm,t(.'% +4iPSn]A"VG<6IDra_C=2)+GD&nL/c.pWFdS%M\78!N0ai"KJ_"]AFu2Fj0c1M?")jg4eEB2+s! +=Cf8]Ar+Y*+EM$bt^"^HqG`8?d,ILa9%BXf8UA),Mmr$NK=L;Lr4dZcRrYRkYOO3;KSGNb,[P +'7ts'kG?tidBS,3Rr>3AuA7D`>>$2Bm$WR@(2&hhg't*d410_AL04I)I5rp`$g2btiP[rWUQ2cK?C +K'Rrn^_Gk2t3F,5Z/WfLu,DjfVtOmEiYJc!VA7m<1UhL:aYhp,]A$4/m@b@W!XMg-kS8e#)td +*\CG.5)Mddb#NCngm&lIXjH'6jorDQ8InGEt&>pT)JfMK^0@SD#-&]AZNYt.K%Z"9'6.gNPGb +,Vq>MM76Fl9"29HE9V`U3OennkLEMJ`]AFVrXK'b2,g@gN`[s,b#dW4XMC?SPtU8iiuih]Ah") +rc$P/7n$6-W6g.Y0\(fBVr;F?A)eta'?B:>gc39`BY+"I+:[K3W4W*R?WVp.YB*^%h +OS$aZ/C5A5+DWg>3E'B!Z)4`2&]A8K4gqDgLhO&,\!)*00Ro+5,9AIQL +g]A<=E0Y?FmQ:gX@l/Xmd@b!43=D0,d"+\^\N<9TTh`$>LY--&>bC94mscSCq.RMXWC()Tk<]A +D6/,m=(P7ZMgWF;*emk&=o[^@'F!qP`UR?-1ib[X=AuQZKk,4ap!Hqi-)"dcsH;m7ZHTLYs- +oOc-h90E7^P[(CEF`6n>3:Ki5bd#9D;6[Po@_Bu9Ah0hNl5O/Nr!(dkVO9ISM#[;4>K8Z_EH +c1rqZ5LVp4!!JmK>>mk1ipEV_eN@hWOr[ah0%A['3_l9g$DqkU0Rs]A%BO"j1)&fEfWiC6='tKFQrC4Z#qG*\Tttp8-4l6`^i9D6 +YTOl?X7rDAk=]AHd0%G.i>t_cNQ9n4#7W3XR_ih=\cR3@1E_0D-3HrKYBVY-lg'noU>GpiQI`=TZrHKR9Z;>CA7mZ&UKX%P +LVQ`NfQh*SC:RR#:6=Bq!Gl4_"d]A+/M"U(51\b(5h7:"Sh1%te&nYmZTc\N"6U<;N"EA(QK$ +*HAO(a,>tD#*hfb,8tLkXcj-peWa$?C"@**g]AC>2enEV+.9n1F"q$P>5[YfVdY1TS4?fkp0U%n"-?.orB2uRp<@R\)9Gh(PP;2G +`A0sqo0EtMq&ZKXijq2p!ViZB#/LHHnf?$X?NQjVgdl[)A-d!(1E$,fj^R(f<:[fg@g6t;3,4b37J7,E)(k#0,7b<8Jq1\jIePYK$CJKHF)\p.cHfj]Ai+,"c$b@jj +c1&cgmUD-l$'d/oIuuhK/$k1LBcoJ*-48 +NaOCEOslTY?4Oe;D85<8G8)4M.RJ>eMGfe1N9(XfJX6*GD:_Qn]A'5BE`DL+82o^_/_]AmniGVIru.#!<6'&:mt`"2%bCKmgeHkmjU;]A*ab*`%qi@ucsSaE#!OUu +/;S_XK[5GmIpa6n9gm2gc7Z$\$^<0III'%u\J5p +VN:;XBYl]AW;+6_kMgdO$#5R&[Ce?iLHEl.L@uo\q8?K8G^f;P#eKaXg;*im2lS>mVl*UJCI2 +DQV,0']AfMnI1)!?]A6-l^7ad]A"dbS(Tqr +6hFP(6$(LRajsi(]A;uMa73P+b4`CH@QfYK6hRUGqe=-#3)H(f[ILM^Eg?uR3+qQ;67e4 +XrfB85@1t:u4A$HZ;rbfAp!+J5,Vgcu)/_]A@12Om'16gi[:5iMrnH7FgUrpH9.Smfp*A/(BY +8keF=oAWePBcWWcfRBB3+kMH#EnP-FL6"_f>#PU[rUWM5nDn0EaEPY^OeY;;fENOs/Q$krtU +V7#@%iInH)g"V;LVh^uUr<&^g)Ce:.G~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +!.(LNI`2GBY:9!C;h8:8M/]A"@6`i\l8Ohp@mB-mN%X6*":0HH` +]A?C.<-rsQ,fqQ2/cYbQ,n9P)D`N-.s4?`>h[f[857B_$!>5#e\%F_-UV_Fjh!+WRIC)sd>!>LM^TZ@6 +#0'GXKfb0%^Hl6D0rdm=Va(S#I-b>i2pa4&Q_I5)kW%HMpI#Z.kC!'.b#PX:A2Qc]AAHppSd,'tls_Xlrjttr#IAC1\ZGXe[$6eDh;(QZ@u<(>s2rck:Xag+eto@FR41t.`i,]A5.d""*E'G!E +WqYVu(N"#+N??O6Ch.5VgT-YDggL6`.PB[U)Fe9/?_Ul?=m.k$<7's?Wn8CFS"#MsXHn@.rb +rV[WuO%BLh^7AIU-A;1,6UM6UaL87n)NiD#F,E"&1pX/JP'3qq&IQ.S4gC#611QV`t^UOV0^ +gAY:gQQhrZsKn4aA>85qYDY'Vq=mZIRo%Z$Cp[i.f6$P5(DpPj;URmC=N=6;7K:guU\/$>ER +cUs-e]Al?5PAX`Il&:+rl%2!4AT_>FCp=tt[E_eE(;bLqng4"`r7i:&=O=)r_67.2\Y#j`BXB +,aT0bn4@lCA0U_6>&A\r"hAbYol'`XV)>ON>aLU3FkbL'o"]A-K//g\r0uKHGf]Ai;2Q3-UNo< +rdU=(EcOu5;:3`kg0?$OHFF(C/at-G!R),56G&pi@q.p>NeC]A4<4VCH3J=k>o(&`6ehkG1TbUP+q#",629Q@rr3N-IraE`FRO72+)oWD4# +MZ$\dJ=EXdj)BLrj=Vh]Af4Nn88\8jO8KQ\1@tju,2"s9N:cc +g1cL7!T[J0/7(?ASs)ZMF+4%DBUDc1NIN0KcpZZ-!@3mTtgf<8P)o,e0am?p2H3%PdV'+kiP +-?#+J\n)8,%11g^.gpa7hB8\iM^s$hC\qm,Ob="?f4;"Rp]AHYWVI]AIM,+W2oH:A)tDeVO(!E +h#2P+9Dh-KA7?n(B&I-BZ.%gtZ/o_s!?7_a?p`3!bT"DES&QH@uLsEHl^f,+Q0':=fG_LPk3 +Yj+E&>VA+r" +,Rb1^$fH.hk[H=m)LS(uhlj)_NK')7EU,G<1aGqW*J@CgLJ<<#l[SUVE+-HGFmudCe/[s\At +dkN.j,`ge)&M5Q%)5L3EoTi=Xc))komOZFNU>W3F?BF +&:d%WX.$W_HUQnh)7:TifK'W'bh-Jt;,o-(0aJtZs%:8DGFEnnJaA]Ad7']A\=nY,FU:)ot=_:qhk*<'_ht?Gg$un3' +97uZ9(35?BQ!mN(6/&E-iN9*UWCl"\CHt8//mLXj`1U^g_(=0dH;IqC9g$ab7='Uo!bWoI.0 +n+sWFU49m&7NT`9M%,d$WnT^Ar +I@h;-`JO,o@1_oTrYXK8Psom.&_dSA/-h0rU?=Q5k1fT5Btno&n/Iso-GHOLKkqtg!OA[%Z) +.gdckEc5>e4%]A5'keU/&S'uR%D=+X%Z@9F'eIKha#+ZY7YFB%^Hj5`)F`d=@5gW1$ONdilJ& +V+=_[V&W)Za%o7L(=HU'=HC@Y:/8R0f\/qe-/jj[Cj]A-AU@<+D=8q/(eHc7`Cod'"J9&);3O +,i7Al7W+]AS/k1.GiHhH1^rus2CF[%Z!)&]AF7o8CX]ArnFek(etnj!X(nZ.iXrac?Tjkm*bIqp +b%TC#qefs;hg)6J2*'%d02`MJ1^gB`GAQj<`\O#%/8*O[jX5af>.R&ur26,qm)JNq ++$B7ocd'ha7*d44qUEMnj>Z"`Mk,c6K$nqiq?IOlYh``Ep!M-.St[ku55sR$6HJ=LIjG3BPd +\'<2 +k)k^6j;\pIV5e9Us-DY%kXI76ZIm+ZiSj=in^2Z[nB\9k1 +]A_a65PVPu+K"m+VokX+j5I;KYr/I,O9oLC7DOcn1cj9"1IFc,\oBDk@,)aN1;_PW>#pZV=EOH4X87K +pJ0i^!]Am'(-->]A'!*P#^dQhbjE0ciWm@V%nOdO!TJ8c6\"]A(J`VC8!I*.;apal/n$@8WV+\3 +B_fb4H2JD-_7KS:.VPB?=&IYZEbnX* +U.6+iAOuVQ4Z[=t8[3QS+;c4h$Z<#E#cu=T.?=/2lU +k6uo=,^!JSkq1)YRC*GGo:mQQ.8L_I[\EL"-E'CnZ]A7%h&.UE#t^KL`hsPKS/3hh5"`ZB\n" +6(7jlQ;kIt#GH$.[3FRNV&F:(R\a?X&q('rS'Vi<^bPcq9oV5<9!TH)l#^$ZIFF8o)_1?Z[6 +T'dOYa/R>Dj.uCg2^=]A3Ce$a1Xf\]A]A-Lqs_6j)o0Is-)';0S;]A9%hlPPnCmE6+Z[^l/XL+Y* +p6B;^MKaLW'fC>p*DGp%aWBTqUGTXbs]AU(*5L3[-cf1E`;69J7QYHjHbdc)#!@Ij4k3"m^H6 +jp>[6a`W;`#"8K>JBOW@T]A4Lm-\l.JCC2.KJHNVMi!In9l96@17)n%&h-2e?8&S5Nq95qun* +Zb*15`VL<;j;HR7C@plMr>:d4%S/a_pcRLF`6XB +]A$00'\mGLc0JukR>;;"4KYiW5]Aa#!-ib`o^qcl)K^5VV5]AS>8>G0iNi[BbtUbqSX +XmRO;i''>k$>7_K$pB^u)P"PVR-k*W4&5Ik0f9Fk8q5D^b,,;mqV)\KC+NK7?]A(bSgMfdKW! +CT@Fj_)@47Y!n*3@$nIQBl^-.H??b7-"8oH(@M;n_Xj!54JQ'J/E;(ZOb^R#C.4il<3;N(f; +jr*1F`Xi8in'REQPY*PB#:Zhd>:PmPbC,M`3EdW)=g*$B'M^f["7bltsmRbQK%R16qDPJH6) +,3s?m1fu$mIUQXBfg&)Q3M48u9T%N<)q;\E,1D&r*s[\eq*XP%6g +Tk_9prC5r./:X'WA^!.@L0\*AJ+)e:lQ81G9]AGN\OX?=^OBP4^HOjq?%d2&c`37B*9FDWGP0MUd1Cmt7R9XM>(Q4EEr'X[raM+lVW?f4quZ]A]AWT]A2!C-qJq@Omd[ +H7nX7P'6SXgP^WP$R)=?\)sr]AH_CPs9">JZ1uU,-RSHY_@;U\HA.Pd'u!tl?@f&2hgL,`n`T +TRm#N5Nk.9,rO*]A?N^!t(F+(,XCInWg`Wu0I\$WG-6q71BX/)gj7S5_S!&0C.N!"XX*2bJG1 +HTt56*tB'\GPq_RFc.AX'?BM#k`O6XG,$-.!,Mki,'00\5l[CB'Q7]A'H&"OOYOK([ZK]A$!C/ +0X$o]A!'`2$1G):5cH3a+!qe>2!FGj\QMdF5/Wl[R?/:;q/4?Z`?`YEO=5"MD:E!m&W)FqG<*1G"2!b"o9"tGpe)'VO_7N\oY:k#rUif/k +A[eD`IVrf^!oUlc2lpGWSmi?9d!:oX;T^DYdnVYdn/K(iHg(GdK9b\ol0NKM0We3Z+?V7W(: +Nu.$EeNp+oc*=@J4%)JoLN$L,o?7YPTC,?]A!qPVK`S&l.\;1Xl/?Zp7js*0q$`f\?;BpQ7/3 +7;Pb&qi'fW)DGrXn&YsU'MQ^e-j[QGOu%e7+1S'2.:Rsbf]A:rY&F^qB#Z +!'+0*den93+JQ.::/OoaXejES'7-rp[fg*.>(l'4Wj'aU<-0'quW;fgd\S\)eqUX=X_I'kQ1 +_LqE<-r3DQuhl\l!iF!:GKu*=o!*G5?(Uqm/86l)^H@ReQLJ\`g-:AV=ekKaauT)ID!F,Z)WGCZ]ANb4PNqpe\7u$PEmX%C,(dE\f8.\Nhth_;YdR"N +$QMWpiUJ0Bf((PEUNH)F3JacT)DkaP8)4H+=;aNK%Y$CE4HST-@)t]AiUL$YV7abd*PCLF=$P +9!P+aO;cHOQF`E!7Wtf`jNCoPRaaS3&nEjm&N4$+F]AC-kB%R[S7h#,a8/iKDAC7j0LJM:,o$ +&a[iu!&N$Quej+_G"n0lKMFiQ227""%-3o3HGi\%&1R6_I-(hcXc7os1Z?]A +8U&o--5-d05=6G-!o*?+gNCl#H_#s_6@tdWVlI>XQq;)^WRu%%W"@:@,".h[2)TMtne3]A`Bj +$jD?]A]A9?k5(N*06Q@i_;g;d_6c1EA)jQ=5$hRPeR29_4B-,%'1quM+l&*^B"ggVSl2^!3.n8 +Y\2eilR;K?JgcJlG9(=u9%;R^-@Ife]A,nQ(L_>^Ck.d/mZ8+9t!#C;jTF3ao30=n7"^:p//q +*=l9Ei52^D5fXb^h-4`Y]A2%:[u4[RRf#3h)oE.N[+kiu,*tgWZ^1o#>#hD0AbuNNFPa9/Mf! +#u_h%V"KLJa[.7_'8PK3R,&W/@WCG5Q*/%EN1!8>,_g>:]A!j27R@FoG2/2j!<;>h$i*a@V::=dq@&&7C[C:UpoGgUVghZcR++[S'`E+EbPH8` +rnG!LOjoj6#E%gf@gA2:9Mo7"ZE>(kUUKMs>/!a9/8i`,\BOu!habEo)G;_>t\+3HT#-cI:)tX +,^5%uQc'04\1_rZc5MF%pTW9EHk%,3p&ZSKXZM;#F1]Al%%O^n=Rj+OUl4O(k9#AT9'Pka-(R +X#;bG\6d3;mqVoChVI"=NO6c*16tHIk2trqX.EKXs%B(M!oNW,*h3rd-l/3%&Y>c0'2P9UXK +/r9JqGAu8lpL5Zc48CX6@gHKH"O=/,"k),'!?=KVkbS9CMO]A"\]ALXi$LMqa?JN7oGVocQQ!: +mGHr/\2hd\rk&AsMs1XHZn\9'N-Dt-i9';3I1ejhY1[,8[RE$D*bFjt0'G(P_=n@JS>G.ml( +M;VH*ZeA+H=]A%Y:heXIQGt_++qNb@Adu4&?W[<8`45,QGO""8Q>/`-Ns2bVXK8MU.,Q9X6og +c=gZR]AU0FIu-RacJ=WT&`JUL95k,'\[79u6DbdjI+a.e$"bQ\b%5]A[6i&#qna:'C"B:Grl2; +MR>(/c`kL'BXUAHKTD0i-#9bE6h.'.+sI)%0$JFnGLCb?;VNO%s$W^iG\n2T"i?4OKL?E4_q +42PQ'R'[McBuuYpUQ>pns#\_mQB&-uh +0*0ku=3q(jF9CR*G5aMbVfB-n>f[kJcOf$_$!-DRR*K9HnB?s%e129m/.",V=M0Wp78R^b8W +h"^/R2IIi*2LEt75sPs]ANC#O&+<5&RY/J:/`_(C=nAc*#jhZn>XldJpOVLV-Csh"GhsA\D!"4oc0lLrEugKS#Cie9H"D*N/aqmVS]AumX/tA.%>lXH_9\aLd%LS@u4#<\'"_<).e+q'+a?]ATp_VcJX2X7>[P!i>,'bV51i%QZ0.A>ma0n-W;"pD=)8Kom_`DWV +6>5(0T-<)g@%n@A'6nXY#Gu912C&XtUG^jK:?`(bU!Y +eT44A&(2PdLY/n4uE1c0;YopYIDoT\81ZJr=RG<2bc1Kg,BgUPDK8jG^oJ$,*c7,=FUrEooO +p^fObF3$o`eJAp=B3ui>@))($1W("&*@U+4,W"_`o(Io:^UbqBhc+l"g5Mm1QpF/hD_.JEAG,#O.T3pmdlg&-db0M7 +S"9\j_.h<.Z_TE)18jgE:n-]AsoimYPlHGD5d=4r]A=giAXq=Ba-b^h!b +CDp,b03fZoE#1dV`304%GKh';KGE\EkQP`!!54ejHD[g0)V"S/5`0[O4`a.UV\j>W/?tMq`iW2^PrS+fOR$>UC%k=R3fmEh0V]AL +36Z%6?FT1_JW,^4[L4e!&\CQr\"3^='>de*H4[,2o-)fFQ0Wj]A@E)!BsIF:9V.NJNC14N6C, +p9pQdTr,C]ANpYFoOm#0,igQ%/'&)Zlj58SHArFShLa`EcfTYZ=k_4o]At2XiB_7R/\8Lmt;K?=&5"qMCnB1f+30lD6;7W8G.8;"(d_[fL:h ++p#H"9=JHJ(%-ru,pfDFhZoa`SDN&bIT4;(`ud".oNU;:V\jaZnb<$sJ,pW431rO5$lXjFdI +jjT%.g)G]AnI:5O,eUJ=8fQtEC;P=_5`.7oG,:#K++b$L#a#/8QPE]A4X-CULf#FQQ0&)[_dk& +o>0$_G3?2to?N)u)5c,YL-3fkjM,^-F0q6^DX4HS#nZKC3G]AG48(ibWQ4gVASge4L#hc*W[H +@Q$4r29_['[1H`&r$\Tki,^0"lI"U2JS,SgU +LVkV*k,&s]Ame3^KDH/_TUh""Kmj9EIoY'8c(SG/FILXaAU4 +To'^Z:iIL(&dNFjN4l2[_%um`pTq>40SZ"?b-(U8dq3Ai'Y0"f&+QKVq_E3`4;bc-9#hlA4h +gY_V*#W@E$;4hsD-me=KP6b#;I3e8G:s8AS +0`oFLM%g[qBGFq,r7@$>IK@!mE_&GGqZLR:2[LD?#s7K/(nVWMrg_;`Jaol(`1IBFfCd`[7*^;,(;kJ&N_'4T@9`*Y^%#\FK\h9D +W09u[!t^%J&4aa;Ve+`'b;KosgY:E''/?/`FaC`.eis!g1(AT#37;)Q4Q\FQ5106D+8EU4>5$ph +5nE(7$W6^)!E&#Hj5]A-PKn[?:Lr6PN(ocEMhS(a[:SAroYStjGF]Atb&l,d_*Gm9RIQe!'&aC +%/03#2IsPhFl2YMqN<]ACBoR6gN:[E6pJ?@:3L,ef)Zb^Up.63?oW,01n&_S5@oXb/8Z9-pG)nF1JT]AlX#&9-u^(o5CN@m"u/K +["O;7#D9:C6?7+RlE'doC%Qh'fAODnDKKuBn>mGC',)&JFZj++*,]ASKa3INUp@a)pI1PWCo]A +H7n!8k%<\cc$bepeVS%.4Gudp+)j6,RHma_edh!BgLtusG$hR-q2 +upT8ZVQ*n'-,3]As$2:h2`?tt]AXL\Y[/Z7!HbaItQ,&cMJY?=,R61TC0T9>k^jt(/9$>:4n-X +XQZ?hlKLm` +LS)7(/=AA/9[+"U`L^\@i7_E1]AZ,`(h,CE7-#7&6HrYLBHLbE)I87R2P\H-+ +Ob_/,%)pgXW>fmm/?Tur@*dOMUc`s/e3d/ZtpF5Z$+A=OPbB8X#@Ulm$LH%?HoS!sL7=m6;0"4<'SQ@XoP(9fdVm?_9k5DP#`:SZ +)$GVf0TPjlZ\8i0G#$3\%!^+Xn[K;ngAApNC7IW9T+lJuJumk,k]AP)>,('H=Kp\)t?DDq.OE +QDedM4YR./c:)^qOSA_RU"J#aJS:tT[=U@l0X-8Mjp;=)NO?/`?B^&!#s"sgYS!]A-6j4ru/' +T0PNT[C/<`]ABRULl=LV$5K(5q/cm=4q#hC.'DZ-CP<+RB +9'%Np+FH`&Zu^-G!2f@R3n/OkN5;,L3$Kj5>7:d9I/I!ZHc0NPFDV\`4U+J@9(CG0AJrC75N +.Rj_0T!gtu/jDn_4L[gZ6+]AemcD6r2V`^kjiS`ZZXu=/9PnY$QA2%_$qV=Z\3LQHjG*0hs@d458bf]AC4:\6=.8M; +s$N`&-]AF0E(!k2@MR+fY,r/'[C)PGaPoFNQ5_&"J'%4Y0bnEVG9OGWF2o.9)/WGe$n%2llpJ +@sO/P?7o/PPaDr$"tK9PkG_\+a]AnZ^,f,TZ@b)T[O0\#3106,;ukg-l-.SrI^hVhn7r.c"YsAX +\sV]Ask[LX8!qg./9''P0hLac=L+Lb6Ds"3!pH6j4NBI1ET.r.FI5Z0G"DW)#nY[J\ZK<1Sk +S4lY;`de24QF"\U3I"8E7]AFnqPpBH:=:7_n9Ql]A41GZ#Ofqs600_FdBca"D$BJ.KDLG?/b\5 +rqJjVed3ksU)4K:4W]AC)$jR$Xm0dQRMAdq;pBF%!Ei%PF-k6b3>\JMt+s7)31pl/$$UC!Yn[ +AWU>.D,R=^-B3NC=!VREU@JI,m95deI3P&uFl.M1Q4R$C+1id%Bu^E44V-M6RuhA]A1$N0FmB +g'ptGYRRt8MiG=I3_9T^bRbl`NiSTiX`j?+90"S&XD0TXM1?7 +Q\Vr4Zo'>-N/&ci?dk'MMj\%L8qK)De&$-*B2@+FijIj88Kj`*)5MAF>i,lI'3<7>Q9)]A[2i +=hnU$RAo]AX'b)`j^uId@e06E?VANqY$^bcL!*;HnhnMsHsDjR:?>4P`Ut=hrW,1^N^r6ak^mbc +H<0\Idg4K8Y!oE8W`FU""a^eE)u^AmpNT=K\W*qm.!@'*#Oc1LI,8 +t/Z&@L'p)c)_qa[^"#q)1't&;:*%Yc=,e;]A//aDiPOdVW*/p[[%);/St=alB>GO"#*`sLIL- +Z<5,M-K9lra>7]AoLafp$3`P8&J,Q1IV2V\>NI!GF+mH=3BK<,5hg_5W.B!4oq4X*RFmn=4*fr$*' +:bC`4#18g+n`*e[NX[q*'d6G*9G?j%TbaS6(fbZ0W`'>\D2jpb,M?+/pn,+Kgb9NR-N% +J`-JjQg00&'64-crkoId'WmFpD&jAe;$`V2`2uTH>^]AKe&ik,:G%;1]A0Xr`Q_.hM:!Oi.M3O +B5Bi=*:q6P=e3-\9La4S=Kh1ldRcrABj>:W:R>*05YQRB,:gV69MJ?R@9Su\.h,rA:t%=#`# +1pkMtS)Ca;,j32"P+4ok\8n[>tECaR$5Ve4t"DLPASI8A9nJX5EuCQ*6]AVn_[]A#6tLgg\F-% +R"lsjf@TX;hZb-L?-OO'aiW&_dFe\X>ps"[\X1?W1hGcAHil^"bXk0#e!hHc.I#nA_DpiG-? +(,Y)5\c/#@.B4!qPsS:TYH,-f8bpK0Ma1n`u&j;gF2]Ad\!Eb-6*dO[h'3&H5;q!l!'OD[6uh/ +M0)':nK\0Q=""O/Mp1^6qU;'5QIKIM-U&VnfBdH>IJOgq(Wjogpms-MB2M> +^k@4srfoCi/5#CD;@msJc"#kfeNAn8Ng]AB6$2Nia479+Z[ECNfR"49"gm)sc>G5r;9Zla&D? +p#W9^n26;qJ0-dW<3kcUlK\6Bl]AmfG7;,ua'Ch)6NG2j(**W1VC=4VT"b=.RLCt#P1PtScmg +LJqZS9K(e\9Xm;Ua"N1uL\C<%t'`7i%5TH3'lk>,EC;d0`5If'8\B*Zcq35>+YmbFNHJ:/Q- +9")tMPgl$;%CL&"Cc)'1D8)I6A=h6Xm;GpQ"G#>#Z*53$u'+]A_W^bqKaPB-h2e7Vr0@q0f\r +kmhE]A:3'$NtiD=+IR3?^ZOM8i-4(^JU_#I!@XKNk5t_NE" +3n]A(sk`*!`'R^`!5QbL'8B33>"RbEHDn&eOEsm?K@)[K:!'TLqjIQ`>_p3Uuq(B&`SUV#7eQ +!`^TDSVspGAhG!B$ +L9M"E=3'j4s5P6cDR2)SW/VhRN7&\N3B@dl3U*-,9rD?MQG%HV9(L=fY7FK09M5JoA)JOgKD +Z'eaC5./?i<%@-=ZmFZii0q4+Mr`.();mTo&dglB3RksW#_"rmmkj3?HtM)sVd+C:rS]Ag7R@ +-tSH0-KVIn3\"q=6uK1Y05&AU-Mk$T[.h[M$^bCYYLVb9Rii1BWjt;n+`RE`qZdoXiM+dlmh +U'bE4;$Jd%(R9q[*Z;'lrYl\CEO:aWu7*CXHMJ6:73UkA%@mj:)fr2`8(Qo()90?1r9mc'?! +\8HRAQ)l=l,,K"9M$`G&t2F-@.&j,Ud4pm1)c9J<^&BjkIY7CXA+ig]Ad +;PPFbW%s%4S7LCH/fo?Ogb^Q[kh)g:*']A(bM%g^C23$eKEQp.a8LVmFQ3_giRoT"*Lf4&iN) +p&fgEj?iZd"bn*0':r%Q7keU`]A\4LbdN48N:sn0jeG4$1m=eD/gs6Z0E[6(S6lrHjSi?WXUV +MClnncI6d!=l`4;@;',b^,o()@>GC7MFW#3uE+LQYK4ZkVD*B^mE>PS-*c$$adeR^(,0^hUq&D3H)/g$G!` +$TKa"Jbdl8Vp6X=1$j`?6+H$)BH4K>p&QF/_2X39'C=,hOXs[DKB(^F=Up670ae6YQhe\!F* +IL0"n2c=QKpc@q5DZ:$'YI6C$--ZEc.?5Cniof?=p7l'@S^Xqu^j^!klphd%EqXM[,=]Ap#Z@\P)t79`t8j:U=.UJufC_3.Td;FZrTIBSeH*a3(YEVjCdB%pdgQD +X&jn&rmJI0Qf66h(9a^gl+E(9%uRg>0uA0nFW5EE^3M/,pGaWq*!g\N.QemOR52:12:;qbf? +WSt;PMr`m58;!==AKO'$"Ha2j_S$P*QE"Z=(=j%#aKUePPW-PLbbA0^+LN:Cgoq\B/&68'+S +]AL$0kXWf[;@_V1$@;[Yg#\QsIoS_hlLZ)b!*g]AlV?^73KbHt<9gR0>4dC5 +q<0n)A"6;t':eL(%`U(L[6UmY5:uB@8aSjM[7aCMtV54e#Biel,j[3ED8p13MLEgrAhnOYN@8W3+p*'pJ)INn,()mM!gtmKBY*bX_/@]ALk +4dY'^f!`HTZVHBX7>*-io[!>n,4OkUYdf$cA!dl:Qj&;.>*p9W@)q,*r9@Hhg`Wg$289(_AI +Hk%95A=o+)uPQp`&@R,ENO(S65IM%EZF0,BL0!VT20b(VNft]ADT>ZIj/$@"'eZQjipGkT9dd +Je+_DX)8YP#n[qUIN[rAQ.bI-W+%+%-_DsmX>\M@b818qP9HhjKs57`A5F1N;FGbg,[IdIH* +=\D9R6Sh.C6@Lo='?TLF*#C/9Pj;G?Q$6'0,@2MK$.40n(K>[E-U0VHOcj +*RLZb?<0[6@Y\e@Tqng=gpDrFM-_m@9]At]A)=`6OS%:3hoM2pOIl8&7hesR[C'EglAs7/r?/1$Y-tBls2ng!r8>+M-gehV%&ei;-+!1l2Wg9.J"o[;%<`2n5C2%C]A +Y6WS&eF`?EKHf'2Xi+hK;!u26q2>*i9ghQ?!'M500?`(#%uB5r09*0MctU8pOJ=>^V>iOm +\%Qud?`K@6=#ss*N3-9TM,tY,9SI.5.@r13Ob#YVMNf>*mi^Vr9%f$,_7cum/6Og-CZbO\u! +0NiI8d0maCc?id9,X1cCOd=0+Ja?V7-Wb>jn[;-uQ3Q>V[kk41kN4'apS.k&=RTei8"6s(?G +)J00_'o@^HV4VpGHL+DhU'^9\QCcc,+p\1ErYZ?"SduPYK,g4T(,oZcnf`d*N:Zug1\:6@Ye=):IkmH(u1^1bj[m4A +l-e"4%:^ek]AP.4E[apV[XHTjV8m72&bKpA"M1$#b0qn,dZVKrgjS5MmG/TNVn'JH +%3]AQL!aTa)>Jlq1kU2g8699GhnP+]A$l"MCg,U+EVGI"r?$5BGY#CI$IadfakT.8S(X>,A]As7 +nYSljZ(%nHKf>78$n+imaFN02]A@4P%pkkd(\R4!5>HVa^f5m8G@+=V'`O6rZ_HIMj5$]A:?cM^Rn0fOYcn(Jb40dHCmVl'80Ks>bEEJTQB/leae*(\>n"gQLq +Qdp(tL@]A\';PL6lg;b<[68n"?D>g1.lqB-C-(IXHYYedu,A5eT5C5gk3*!LO:O_p]AdY;ktaf:f.W$K%j9FUdpa%'$*P,7K>S+I\ +SD_ZB-;j3!G\'F('D_$tjN/Y1i8S#%caJIBa\a/d`j)b#aWt6).r1(!)U5SXg9'Zg]A@gWqHZ +cP]A0pqTR,3qD=OO5>nX"n1>._p]AR&-+ +R@uj!9(H$4%8XRgmpc#+q<<,NZY^a!R@r,`Z[Kjf>2q4=^[Tj>+\M&d>3kLZZ*CK#OY)\pq\ +fD-W)n>=3qn]A:qNj:)^#nq'4VT#]Ap2VK`YK%Xgb+>H80^[1%LO2fDY9.'`h/,VDL6G/!8n(Y +R*c>hKJ$]A"[45o1Apo4Gsk`DBBes2rK3#L=U5tg_PAGhGOau)LP+n+\)VO+9]AWM%pa?Le*UN +SeM9Ha/r['8hBP?h&^4@1UNDZJ'2h'sSJD%)2O)ionnH9'Q*e(#IY'pjR[@'n^tgS@781a/f +(#!>Gl!W1.IXM"sSVQbZNtEZ"Y@#&uk4*lSR'C\ +nP+Zon_RN&`b+S0-dL2#Z%6(_PgW7cU7ERGYO\$Zh9hD=6HY'rGafJ_&O&\lEiAac^iu81l` +lgTDP>8siLSqWU#Ij%lUoB6=<.,KjFB]APeCG5l +BZICP32U9QdjjV^2/WLG=4jF:.+p\a'i]A,OsYRTj-\K(dgJs.`/.Uj^Jl9[=NJhhVoY4[":l +$\YJR(kS@_riQTUkSY7f437G91mKDO65Xh0&^/5VB+P.jS'C)+X_R:V-gXtFL:&V*ZQ2/U3$ +@Dh0?XMD^fGdm&LImi;uO`eeEqZ,c*o#,,XuWa6dHRF'/r5qk@,>O4#Lo\VtEDg[![:MO8cf +>eBhHT%_A[?Wef04C/P'5h/."VLS\C%hS+EMOrE36#p=21B&N ++95m9!A+/N]AN:S4r5c=@IVN.?G/[4Y`4r:&(\l4BB0lmQlukNj5_-BOY.]AY'Nkjft?q`p3uu +/2ks`i%lgFab4P,K"8$:XrNabHlAV]AMB?p2CE]A#(i=Xof[JbJ50;&WgVcOE(Ec +?bXeiOc*$H$3]Ao_#$dp*A_JH?HZ2^;Kbf1%8(G0.k>lK,d,n(Ko_[9=G7kk4A>el=Guo_PK. +R$FsT`n@pR'!\WP25E.u9hc'pN+.p)Z!;D%Co.M=MBU8]A-F +Gqp?8+sS&F+uh1323_-n;ALSUAq+V-)@WZQ7Rfj.K1c.#,JF]AV]Am=G[B)V`]A]A--0qPt8rr6+ +NOf#rNXY?MtobPfhV/dj'6s/]A1.P7V7Ygpk)rN2SpZ.6&n.kY=?;L5r=A'7$=s1P;uf0KXU% +&@e52Zoa2dkCE,H!XfWO]A&)3_i4jh[)03g?%b4:Q/5!mn46ArS#+AVmjJ)1g-QrkS2N:X,j+ +>aQM+2>4k[@=G0H5+3U@T1Mq2oLj#oaV]AO2'iBXKX[SIpNtMOUWJS/i4ffMq>%ggO7QVLlUH +Q6Mh\)^""fMMB0Q9^P*5D.kM\3K,nU]A^Pin*A6k]ALnQZbW4h4>Z@Ae(,AnaTs+QPF05"0aMSo`5\(cdVlFJF+;$(B7gg1CDDsI +=94of\+glg>f?r'r'-FCpT(j:V(:a#QLF!%NrJd_O1J^TJV.*$W,b^CN<#g6dV\PtNc^<@J3 +#K!UAX:8GUrZj +JmY14YQ6,VM4d+GM,g&3:d^>=/^Zb>5``?.H298e)'YLV8Zo? +p50B6b)#>IrM?9K%>2ie8AM-cOm%W>Ta1trU]A#d(*rJ-<]A9;`*S'/[P222e3Z392i)Q7hA>T +YmIZ:Uk&69`]A1*c4#TZ*IJG[L3ELZ9B-;f?i$+`[!p`kf6$%Kfu`EWi?-MhpLsN6BTN)/GOB +-`NX+mpF6uQ&q2[3>LB7B5[:8=c'1C^L5L:FQ6L8KKH0EPDNZ(nr%tV873k3qRPih;GIP'S$ +k,D4PiH';i0%^a(,d*25:i@:=B3]A!L8>j*6g#WR+O[B6K63l=80cq2dbTmKVgsGB8N.jLdNI +?dn!r;8rSe'q^caJhXlm7hSlnubG*7H-*X!km'I*r`!9<_kVR%ZIO_h.$-\H4FA1ffHIr]A+Z +NK'!i]AY2!uda>>(,ReUpem]A_83dQ*K`@HmoA*/ICrsHDfc)P![GC.u.H2p0T9FhI#^:W7ES1 +]A:5X<8r:UY_hJUTghrc.j/6Cgq:2C*=p:(*N`OX_W!u4mgUpa:,L:h>"+$;oOVcg3oq8)[ab +i,W+;K%u-`IU(u4T\sW3"LH5;UIEi7r\)S$er"e2eRi?96eP)%h"C +[a`n=*e*1o,QiSY8hF'V79@jfP.s8+Mr2F4j:.W(B\^r&?=BJr80WKj[S,J@D1'N0n.Za6t]A+X).WY7,tBr`5sI,pfr`=!R5t +mcGIeZJ!g*mqPIZ1.>:BDD,i"*s)HUXl@F"0ZX3EogG"A`lG.:WmF+pXVQFREJik`9d1UJDJ +r_^Mr:In`ZY%Uh2ZFRah>-2[`TGK7cSWbWN""E9?=Y5IP`QLHPG\HDmJ?0C%s0::Bg<@9BCu +p-auQVF@BqZC.#lh@Rh:TcM"%Vi";qVI(b+"^:cX&?%i]AaY]Au_?LHAQJ'm0bS?j-Z9FoK=7.*Q/2CLLtH0;nn(h"6Jo8'P`J$^a2Hr$t;%%3(/<1.uRNGb;hRMO9dA_=]A#YV; +sfKiB5sNF$[8^s37_0:-Yh[cH$Zl1H7TM@ks#]AhtT9O&dhs@9%_N/= +mkP-]Am\=p.*-n4f&Hm@uuXah>oBBMO\/#CJ/"<;H`[Q/h]AXUcPZ7@a@J^HRlcju/D819^f\\ +"aU=1Y68bSJIa3d:8@>?g1gbF*ZHV3@4@;J'HeV'u]ARc1)\h$W(GlhQkXC)LSn`8K\3u:?;K +2TmUpu_u6,DOi'2or_7/1f,rTiYOo-]AWU@T_Q>nkcC#f,dq,sAOT?^<"Sh-^,X?>mCj@gkm/ +@_a"&<'1`JB!H$KW.n^#N<7Jo1s7%q@$O68i(U9^f'?)PORA1sa.0a.[acFt5G('_1P1Up;> +Ng%AZ.kI-t9=WFE*e&3>?(gSS=b6\rD*$_#-4L^em&VT0\-5`A#GB(t,"a*)rVH2?_>d*Jj2 +L^6M-VWmo1p]AW+DD/'AR9a'77\-3JiB:Z@A5T"U]A,Gc'nSe:0jFH@$l,+ +:79/5@!cK0QL8.P5FI`>S;X*?#Wuu(AXdT/sY\!1;O:GQ:\=I*nl_;r_:J4KuB-F%E+LEp@b$T_ir;4>dfH<`"UpbV]A)efOE>5ZhGO[;P8uh=GLq_hfsEQm(Mu$YTEdE87k +>X>;BDo)MpP+I%Z(G(4+VZ)flu/JDn"5&CcS)7_iD$@dTAGS>t'SR!pF]AYb*m#\t%GD,RWau +)B)2pd5WN2>?bfGpMNX)3>#T0mP3iK@DiuWgg6(RU.,^u7qbbCUNh*0ciiUul8m00*l!RDi=#aa'Uo05hrHe`G&^)n^ +#!s<*3p/s+Arb#kV2[(h\Z*T'Oh)4;&#R$mDX\Y'e@V^l@NK/XtdF\/f,S%^ta/A8oZ$KjSq +\Ds=/j.tkKoe2QO:Fj3Rp`c6b7B'jF>&(cJiE/aK/43>(n8R'7/MSK,c$\p>hPoQ]AMoYMPD)op5Yf)6P;1HH(fb +T)U/g)Z[$%-[clZ-QGHb=OI_GU,0C"&dKK8D9nJ-$,%Bc-2EMLMEYFseFHp4cKB(58ulr>AJ +*LKLTp-/u55B>!1Hi;D'hj&MBZ^:Ll_2f$`K*m_j$XeqLhQn=N1EcQ3uOjFI+o-_!is!*$fU +#_5omo!%C"3Bqu(`4+";:VjA%eoZh6eGEU*RbrF+CRV+?9)&n0;Ut1Q-<_?("M(#iaQP%Bn` +5nDsZhPiT"!k2ukpZH$3^!'XYS!8.HRirR.V:Z>g^/-YLPNrkipk=g1c:2[621BsH%h>rB`; +@'n'UhHr)iKMDBVp>em%GQgRIki\S!Wm.ISJB34!lthT9Lg\bOZla6N4[!(U>YM$o&CX%=o) +sNVa[ScjkB(c)=IeLSX+,K1Nm5%!:=9@'S-gW%V3sLf\l5h]AZ4V&"#Ci4d@YQGZ`l@`?f:2I +rkmQLBbEl9WoPad$\IA(>\\a4D"- +3#)`9:[V_PaI]A*_u^RhM5RIlfeAb\5jr\ZGD9?*5RB_Bu+*$lptIX]AU]A)*@#J*6-Y2=i!DXZ_PfYSml)-HHR@Uc(H?Z*[41. +OC'`cgl0&!*S^A\,_H4?T$5Tou%Wa*N"dm%na3erV*ttbL8&35FA^VdS?0I +'/Ponk@\EI]AjC),(."(rBe2jW3!\:d3Vb%Jq%k<%'mW1RO +sZ+`lj?Wq#eQ:5h\5E&(YLl2T"N'=&9\%.=(h9:TWiD3,5ch +4)L)<60mo(]A&"SQjZ"sW(BBM"6k@KE%mBDZ\Z/9X!hRTC?,q!Kj??6'26UF*P&86[1.D&r6V +Y:+mm%h5XM/=YYbarpEHBHZi^7OW,gg#S!0F\Epj6%f;3rU?kh%9C5M,b=JX-XB0D/G8L>dP +#=^a]A^hL0GcCl!(nYJ\RBO_+3;429TR660[L@McRL&F1VY]AoX# +cENI5Anri"S*ZFS(bma"'\:q'kF+='SD;n,q!?klABN'<)_XAMYLQ!Q7u-Ehdf"JV`.gi!%U +'=5f-`F"%rnJc(n,rhK0TGin`'Io6X6E@_Xbe:Ib2B`!fNB):Y_stQ+O[*O]A@;PbGR4u4P,4 +>FID%7nS*N:IdBE%^Q..R^n3Z1fC(?kn^-a:XdH;I^D_W]ASDo]AD[H34lK]ANLc!cFb>/k7D:p +.1QE?S8P,guoQQ9?03An?ZcRH=Ek'Vk-=G7Hmej8`=4*!/Cr23N+g"X)OuRpAPFG@ASV^;n0h^",L4NANr#2jaHaEf\ +"j)d^O^,+PXYgp^,-.>CbeM`PnC#5q7IuX3Kg?BAkp-8..fW^=,@$gY8obQ9(f;c]A=*8YoOd +^X/k,dLieO87?qH!&f^&9q+%T2"i.*gQXAdt=(;Vr0[GhjN!\@\UJF-XMZRr(;ic.6-]A]AAHq +tk_dHI-qC>XR^KB[Pd#KdJ/pqtc3,QWqp1Kf +kLYh@)G8+0Os#"/!f.03rb!_L6HT`0pgf9%iJe\N\OAKgNM$V,Eg\h;$5B:r._LK0-CCDB;1^utV4^c\!GGiU!8i,_4P4sW_X9!t!4c/%tj +BG)CVU[]ARMF_@uQor%[X(4@J0sQ&&CWBU4NI\;(DhANlIfZdATRhpS*?hgbI7T4(?#4U21_t +K/!i+!"gmcqaS1o3un,P?VcL5[[g/R.hS)I.G(m# +%.Dj+ah:7dWQPW%+*r`jaVC'%uiY'+@AS!1S.XRu0!:'9EY@$6_juQq$D\Tth&d8rTFjM54D +XOK?=D7gW4l@Y"\Na$U;0Gc4<]A2mB,LjfeT7m,6f0XqKGmANCZ[90"]Am,_:6O2sUUJ,XCL"_]AO16tg,1^s!l1&@6L6<-k'P?R@ +LV4/L8u(fWiYm`1ZDrGKrhS"Y>#^PPWMlR-s]AaVJg?GDCs/)qaJ?5IS9g&tM?U[A7kp +ASp2E+Q"X@bM_(H"Trqp(pMA_??bTbOfD*[l,N8J<%:.8.@rfMNAl_`)&/5f]A)KKp=&.lY.H +Bf]Ag9*L,g+5!+IDpps9Icr^&rOX-5qs+\YZmck5*EDt4>3n\EXZnc%pML-CH6:'upj39ZHXk +k7N5^deamZ3rQlho6ZPm(R>\sE(&W(1n@`"#$F?_ZE84,ibOmt)P=(LRXI6O&@8Z^'Ub'44p +.lTE=A!+bqY!>.9.u=66*P"gJ=db83&cFsr[k/!F4rCBHj?Eo@OLZi>XA^a*ZcpJ%/Wkff_p +/h_pMitF'jMD+-o[G-Rtsj8IrB5+&Frr"YjP'f7a1Ms8.QY-'Su,F84Z9ro1V4r<\@#(O1F]A +)-+iPSAdXqA6A6nkY!,"VY4h-3.#7B+orqHLE883#6ih`d +HkfXCo:&B^1XIiO$lpUc1c[OSWetID=\%]A0cHY-@%*>( +WU5_/6777b+sDt5pc,D1l2)GS4]A1j'>[Tp4r*b,m'N73b(TjL/V"BbAEr5Hl%=)F6 +?h=qn:\gQjY'7(0f/+qSg`5,cu@T4XG&"p0X2RA\@M'/6E0AF)akaU2u`L56: +9FQHHeV"'.rD;P[$W.lj4QsXq9kbQjs8Mg!l4"\uVj2<17M0YKFu8A(iu8(`=9.Y!@.GCdLE +VA$<4CCp\]A%RiO.EcJUVi:ti*%)Jcb20I_$h=(`J#o9,M%lIJ88;N)YVJ8YL,XDUjP`l +m1m!F#1-B.TlP&pk8l72`J5?J)+X@K+*)0<7a"QTMJ72p\)b"OM9CLmGWh>B<%r3B9Tm]A+PT +A9]AH_5Ms'N\.80X@hS)#1IB,LKXT`43=5t)iMrf+PY0@d_BS7:&fnjYu6S'!hqW#\6&r8Yh) +i:/ZA^&Q4KI`sB8k$s"k8,=?'*e`I5K3D\7.68%P(jM!S/%c-\+&.nc7R831HP"i'#_p_;U2 +qbsWj0tC0m?($Z'F(&'NjGEf!lZkN?Jje')ejPLIAYKB*@Dp&@+chdSUfoQ03ZYi2d(PE*d6Ll)hnnM$WM=D/?ILE.m!?qquSu8D4LAH,Xjf +no8FN51&9X_#`59G,Mp09]A(JIT(QP3E3aha.TVhUe6BJ\SoZ*:HG\d:VX35)sTgkUd;$YdlPnD!iOi5b`YP^Nfp9,N,r.ONOSA:F>rW>uFIZ!n5%W3'JYMiaQ7RJs[T'8\#sPI,#<]AkHrcnl` +WI7/MW.^e+'>SV*'gF&tl0(O9\m"O43M]A(U?/j%9f5gPj`#'pU>ViNGZk^^F[)%Z\/>+CJXo5nT +pbn@DFAV)0M[E+mX5Dd+sm=qAS&%oimm(`A7KgZ?0AbR"/EE2-cFUNfK4R/"bS/>q^+WCig- +8pGg^`Jso=rHq63o!74p1"[`OD\LV/K7u3Jl;tIBj?k:0eQc@$'"[X9q9o's0Ud3G)4[Q+=\ +b5.,pbgMqrsYte*Xb-&d&#B7@&Q+aZ;I`ALWu22dQ3Hk-Rs>gOOSu_%o_r6$$3'YBt:f;i>L +Qn/[.pmcNt3[dRiP'p^a9/J`hLHQfUomjgL&A>70.h`jKLaN3l?IUUPiVdRm%)-"rTc-6fPZ +h#tP^9;@ih$O8#'9Pj-a/`)P_1rSho!^:M%]AdD/;,C*ES7(-CJ@[i3,T;`0TASHg)59qHUL:jMor4#\`/(/IYU1rdRY&k/@;iUN=J/:/qNZ8\ +s-)4[5M2\^[BNBokLjE&50?tCH#s6\Qf*M'n +pADTiWhN_8.N9bs7;cktlRHr0(O@.S@":@d#.EYuE>K9k]AC,du+PPjtV'h0O*iFK1)$u/`kI?8iA?AIo#6Ej+llZT9F0t0M0j+^Z +ndLJ#Pks>ee=i_;UkJHEYKVI+6rQGTe]Aj;CPnf6gXZ';Ck/G^9/TV!&q>'!C+VW=;ZJX&j.Y +:j;C$Fg_M_Q':Qr\,O_/,"B?NTXATCaXr(At*9aJD%-?LXmb^F3IFgo0bIoHPHeAas,E8$^* +fMeqjaDrD06/j9!bB&Q8Ln$SnqH@,934VEP/Xo=7V7R"5WoL;jrpt\+rP0?)nqA=,HcAV9!-U +WIVgIULR(:)RGn!HrNGD%6U+P\WO*EcP@Q#(RgfN8[$l)N0A+R.QjSP9a0t?>_QT#*Xk!..3 +@^OH?-r$rmdA)[CFpG=d(jRJ6!M0Ek-O-,(KnqZ9_AUj.OAR!iU5r=H* +^h\8CCEiaXmD:U@cc;-1#1\ojkk?UWKE`$h]AgitE[#hrck+AuKVr:T;_b:l:)F^!\lnGYb,P +JiM>Ip-b%01X:$0Dj/,XVd$u!$-dEO>>R2Y22MX?^YlJHl;aiQ-NqNbfhAPqZOB$?AEJ3hM- +Lu\Y3T\-'t@:B;4H(8X'o'XetsWl!Uolka"U,'>ZMXjSb]A +1<<-_bN`muPWjgI[[U(m0K<`If.,q._c8bo9408*c>=XX/PTlthLt]A*?#;k0E,eZI0SSN0p^=%_n2lVgVuf@F!o<%3D;JKO79#s*5NaV9SK_V(B]AYtCR$/_52)R +SB*3S#_uE=hl.)9-`B+pT)7]A@M%c5$3,'mD$IsZ2\N!D#Ob>`DCGq.?gn0*fb1!'!Y0>_IR2 +hHg2?r1o)5^irIE)`=.m18]AtWaH5`M+P+;>S,%bpZeQ>AW.Li\M*KHJ"?Rl2-qAdkW@k.8@* +*Z,qnmXZZ0-D$j#"`_FARGXfnf@K3s&&2o5J!k,5G\i1fkYFjN*m@Bpe_0hc3Mj7\"ld80#h +f(;\7@t4C&a6TJ*hnCGq0$QO8L'-r6dtCCMVXRdJjqe88$>PmCNbC8&=r?1Gp9M')phn4[M; +#_-6l:R6!EE`3^\!_H:VVi2XERa+&Xp0mR&f7Is?Q3;`]A$*=TgSQLebdlP:<:qVJN^@QqcO+BN.k'Vl9M_M[f5fb8 +m`r5871\KCWCRt:_;E`-^M:sK^#-]At`^W"khI_HO#C9&UTPC^_S5C3W@;-5;D+H269WQMhjX +rRTbecj'd\R,&6Nlpp!Y7YHOY?I8r'er.:.VFK-_?Z0k=-h)i=1rB+\4kDAgL.Ci0#+9[Gjj +1LV0i>]A2lF@m0"f]A;_`t)&=* +XfUB%WeDb&kE_aQ4W,63XKB![O7O%*YFUOR;+cY;iNr*>)k,VReqF4%47;I;^(1)-g<(7!#"'c>HX`\ +f.qk75LlP-KW;FQ5`USKXt26"%24TG4^RnPb_c3Le@r&2L,*" +6:/Q),7loKHX_E-*D=Q]AYJ6hlB8@$.r1nN>B,F\PT28H4#Q.q4ce%086)0]ApB`RjU4sL*sdk +Ale%5Bm/lNeZ%^qmjLaVUW_%rQ6$9p3l>4?<;:N_CZCe,o9GP8s@5Gc1#T7FI)8jGNVQPKI- +Bh/h9f--4(fF*$poR(&,P3XougbB@_PL!JWO#'k=VYaFl_AO_tp+e5"FL_in2cc^'3`OrjrT +O`,JZ[\-AZ-*'.YT\8U+J[*ah2>ZBr +T9WgTJ1JaWl3%F7pIEoatLGeH-09rOX'N^.cif-/0OP+E1@H!@mFg/<6)GPChArdcjLn@b%9 +$D=7Apc5jAN5>$YDsA+!hC$Od4aR)RA`^,qK#pmY#Xn-kGu)q":0%? +frO0<,AZp]AQ_IV"4)/oA/['$OHUL^>hg58S=d=mN;fV/E)+i6TWMR/2;t6L=NX.f5=5&k+fE +;He#kq4@(G?p.&Fq>1HdiDLQuC"iZP-hXBELlg:"mEk\[sEfoo95J0*C4<&]AF#RR:BqN-,B\FZcdC@P*;&klg`[ri[M:h2>F+ +=D0XH02mr"4.-]AfCim_F0A7YPm&eOX0$;_FO'"rOL"=&MUdapZa-6MbRo?Qe'l9iO*@jJWLaU&8;,F +'[= +EHT4h>dbioJc9o#PpWl4mq(D[b^;OgtuG`c.U*f<*etY/%B.GV*350\#4eni!2)hhEoBWUbL +RmT22XQ0iZNMeHJfHTb+AY/9c0C((6'jA0Su32SqV05+"Kt-o1SNIX`P8Pq473$G]Ao9pGM+P +7%rJYHPIrEEH,uc/#,CjM4UmLrHGXtfa[!^*oi&AE]A]A6f#.+"''Pa8H57,Zt>n<9(po,s+^4 +#uSIYZaFQC]A]Au=b/B:jsfDuR[7f+UIj+l]A^L#/6:r^T>dV1g<5/UB"eRm!ATs#nL^WC +$RO7#AXEM4gKXi:4B$a!nHsG9HYG`b+JE,YO<_1pEi1:.hlY?+OI\b*QE2d:$p\#fBJDieaP +NF1Ja1)qJ4;c/G40SU$U"je_#P0\Io;% +eHjIhO24ul&#@C+Aq0W)YeGUVa%=m)*m=%o8q9.2DS!u4lU'CUg"/JdVUOUH$KR;Q7$RZd2t7kL,Q(f[5f +(fo[I%D3/S#gkrr)^VI!S?8LT?2JXI2hV=sFh"?7ctgJ#4&"nT:ElI?D')hFfHr;af9`NJa. +[?d.7nQ:oB[fpqO549,E;4si&8f<9`EVV?<9H2...flZNP"28SJ_4Y;=4[QsU.G2qk:7;V03 +B;sm:/[ulK6MW4%nTq)Y-K-gV^!E2R6DF*4Zts_K^l%`#JGc]AS%Yp+Ik.A#,D`.^+SN#mLK. +AU_@;0#YkRFq>oVn*e-a[1!as'dk0joea"SDQ"?OWReC7;q\h"%6KXeP%Z6,hkBFU;fIXcXn +Go;W]A^53ZM%2,!qBsZQgMUOe3q7J>]Ac1^S/Y-*#NVQ_Qm;E +fn/a*'R@CnmJ+WjDTW9C:>I3Q^pVrNe\!_l%]A?Qq7GNR00^IMP#02%[U?[l1nY#QS2=+@OV: +\jc:pQ;0r*t]Ags#%Enn%jip=n'`m-$g?M5VO^k24kqA!0ZOdpV2*]A!J-F&t%GK%*JUFhoqr4 +30lq>C/X:Pfr_I!"$U&RnLo1%8sNsp$1qNZa-09,CKO!@K![c#?Y56ZaSW-6i1s[0ekq#!q%YoWj'Gi?[RstUO6Q@?MNYPMns)_hmc(T5`>MHk1-V$\fQS_d[We1!Vc-L!Db' +Q*pdk<'jN5J&+nYu!`'GV=r$2ZF,;^"\u.Vi^5TCR8umh!oFYM'&"1A2;Xj&`8npIfX"(N;H +4Gk38U#?Kg`j2YS2$B]APE7/*q)F44d!PraEn*edX%gUd1V[MC;d7Sl@>O2(VN2AVl.k0uBE +..3,Sg^_l)7`CXXkT;sl"H?orC5.(*Dq=N98VM?]A`&lKiSW,To,NtZFN*&lMSmK,epd,N+4c +&lQAG5hFRgQUtS/LpTN-0T=mH%On"H+58B6QHiC/;"t=iuOb0kA4sEA,8)H9,[S!pY@o)T9o +&i2Q$AACE(M9DPuj:Zd.U[KH/Yi(aEVToYFn!Nr\"4aj81'gODS==\'nfiB-P;(2)[/q3fHj/eM[sCJ&4q +cK9U"\AsPq;ONhEpV^H&?7M94g%&'jKK;theqsg"NaH_=\fK55AEW$NYeWaK#Ti&BeC<]Ag!KDcnZ'7j`g)J).QCp1fngVf'a2auSM3@Mk +PEV5Y[L5>UblD>n'I]Ac\DJb)FF^pKqKme?KCnRs!FEJ12?K]AZQP*87[KcJi/hrqB3Fk@>\92 +%f5E#"VU-ID%,"Qa3VcIPu^B:tS;A2OWhB%K^G.Z80DFtMO.FZ)b7HP->l1Ceab_V`jFSBb>H^;K]A_q]AjQaH +.aK:9C9WJOu/q0s>-,I(Di['[3!HogEQ5BH)kL*&J0q_qi^>N_$!6g8bb(-T)i+YG(m[>-tK +V-45U,5!Q6kPP"po_j!nD-E+!L6a]Aha92-X^q]A6X)*RF$*td_#mHO*>(oEmQ1&,^;X4dUL&f +NI4[lurZ=Rr#:^i]Ap8KY2\ADN:fY<`ll^+ERFRc;3HSY=rtb12@gJ@q4QR'+E&0d5Zh.e(=3 +_Li+ +M-E9"Vi3_iPhuNAB=]AG(=-A5^=Ab@35pR1d\;Ve)Ct"-Y-'u!j*5/1CC^4)qlaAA7_^X'8R, +1mdh!OJPqfD7V3R:0QX:;D,AD*&"c22Y[+tY#]AR]AR<,P&f$Ed732(hsY_:b5;a<5b*@[TYLIM@6&JYnX4_-a2S"en,?*f%-QC"`BXQ*0(enQ&/;dHWAKo`+m69 +427YJ#A'LLl)Abppp$ne'5j6>;;0El:#@$$1.eh!kiZ7GY!6FF+#_:F57c_Y$!<8$L?80rii.]AK9ltVP[ +-Xmd.hr0`(]AFfaQ"l\T7O$KCW*X#pJ2BK/s)\VP"LeWaknkF1F9#OqM,l\a7taIqgcHgOA5q +BqGdkGO'IMS[!1mKUS3-cR$RO(/:[;`_Vq,Xi_a0L4g<24'tAarcWC>pV:fiF)NL?hZYEd9% +o2fGo["]Ai9EpVL1.2Hb7$`3U;?#WTrqD*cL&k8<>![P1ibe7oiU);n)":B#7*kHi;8WFo)!4 +^pN,PN">ATbDSQ&F,?.U2e1^auPrUc^f,#5!n%?@+D7,Lg;2EW+-J*[Oo9>TPLun)_GVY'PA +I`=Q6]A]A-kT:0+/[0NQ[`R&]AJ2_Voe>-M&[77R:N?2M\-"8!'4'idB\q3@c*gUHY.c##Uj\TB ++9n$nDGN>NR8AR:7aBjkeh";1d;!apueNo-f,aoci*W\?1'e\Ns`0to2fn^J9C'nZNDY-*D2 +rX,&pVnqp!(SnMTlf).%&tpIlHL"'kp?88S\QG!MC*B&qc^8)_#_fs16cIu3c]A5n/Nb@rh>H +^!nYo0>S3X3Z`iLZU2%1Nd2l0BGKU/?8eZAAK1s5jd[bu$]ATc4.GNI$!c@hra5L/`$#48aI7 +0Df6//*T$Ut5Nl7"(JoeX[eH#iek.d69V`GU\3co"MF,A!ljg7 +N+&u"*<$UKZFJeZ.!?qE;c6N5aSQ'9YX6Y"nHg(t^BoXKKcMo;)\tLR)&i@TmN([6kj!Wb>W +M@0$;6Uo2orp'79-".6Ic?0UWj1cQhKV?gt_&gH<:3:pK@`cSEG:%NBOk39Q+*-,2T +B7)X"CfUk@kLP2[p^Wmu$hEgo:`r= +EN@;D(U/l>5RkYnWRqic._8X0AMVeV]A/IIP`4,UE*XpPE&GqTd$j0oARq#"rY,)7ajCMsOM3H,o$5<%d)1g]A0#k.)\_PEe,&Y-^g0OXq:-<"" +\rX2ZHU:q5j0%UL2n.b+c`eR5%'GU#[?X1u50t#Q^\*Jmn9:ib,@:AB@^88Mu7i2B052P.7j +Q4ci+RjI97(XJU=@P!P[cscQ_fH^sJ]AaO^q8i)$&'UN9ZVK-D6'->PK,kf"3E2B +(01EoQrmQsS!ft!%#^*>h1I-R2@8)U^Qrt`j;`Y$G#En#r3u?Fo-0WNKU=WU1'Qk6.^7KZLM +Y]AV]AHm8B`Y8.0L%Z`12`E8_aLee'3)m5p1B4oB%8L,Q?[g1P"Rg&Rf)k4dcV(R'+-@>4`l3q +I^:m?/6@q?aneYE3]AKH$kGdi'jb#r6g`+'Ds`T!Qh(%N'3$6qtNKqChhJ,`QX0WG$ENQN3`* +g`L&27).R$hq1;*6d[5m$@A1dka8aGZ*8rVo@&>h]A$RG)Z;^9MNTjiHZ!`ZDE"_NMQZA0]AU]A5)MSKoFq5hU4 +h9l3$J+s_VVSI!8M94TpPapmo:I5YMHG<"D&9Znh\N_G%k0hZ:ck5g2D[`M?-7?Qii08IP8u +"@Yf2N)ul7IX\G/\BkraEUN%cMdI,CbADi"[4PNMG%Qh0m!FNraTL2n-us[Y2G(&lR/$P)dg +_LT]A%PdJ`mP2<@G=Repqrq#.:&>?ZfsIQ?uWkENR8>obkNS?A>&LnF55\Re#Dg&G63l)L4tI"kV=3"J +S&5qt?P7,%^6?oBE8E2).'"DqB\e-Gl"HKKQd]AoVqDAiVS$r;W-0+P5Zs.+[a25_?9t>Vo,% +QXLLSg9[%-*a),C![?:G;n1St(htE((&\it[jX6+uTNIVB`?5Q`b:RM3;,k?C;hs1N`JQc3G +")Zdccj_]AccfesXBaYsO]A5;ug$hK9ge+/8^JLe3)\igaZ^NLZEHGcsZ*B-2@Sp'(*YoNXSV:K(EQA,ugU]ACNrXSM.r=*u[:hH +?pe/rM+=L15T%]AdGKAh49cH0p+m%,M7a::"T-/rtJhc;?C99hWc* +t?W"2B+8L04\1G*)XR$\D^%)`-8ANhTl3n1j1d^iR@'H&FZ[sf(rf+t@ShCL +ReD&n;NPn\R%L"C7-n]Au;/gLDq5nMSi#n=>9nO\Ma%jF1Ik;o#S-74FI9DE]A,2frFK.fsdtlg6hA6:F%AP%a7%c4TLb2WII2U.62dX2hl9mj8.p'W41" +BroQ==/eLc!R'4/`gRn1rR<:^Gfs)EX^O5k5=*JN35"D"#*S1Ds'R?-69mjFfKne97"m.@`! +:d6CB/+>]A#Hh;PYMEOO-Z1Z3%ui&H10N$k+Wq=m)B,KX0WuVhBP;'E4@di1d-?k:d]A`6-5&Z +&j^>15%h@b,+kQo&8B6ZmC<)K@;#Br8a*;BMdB%HoqZ7=nlg=H27]A?P_62S9d'Zc.0KS-#Rp +W)#=NOhT+!dHSi@0CTpi*ZG1n=aa8ApIQ:;?Y[,j2(O9FFGhbZW7(HWdC6dcj$8D2",A$WrH +P^cbJ_=U2)TN+JAA.aVoQF[\NF!(j7P_j)mFg^gL1 +`e)XP8?+#G\V4h6\g>+?G*BAr$$U6ZWhJEoW6Ii?#4Q1f%-.:!GG[G8I%G&S[DS]ADa1dX1fI>`Y]A`)[K(: +*daJsS)#S^6DRU\nGJl_jf**cL*h3%rdMNW%4#S)[MhV&6c77=hA\i8f\#t`>53!emquWn:I +Lc`iglK;c3Jj4K\CDC=`0q\!N@4QnsQ<[KlK7[#ISW@L\HI\XC;3k4a&C8fge\2_Vk=G9=bX +m?,`r?(\?E.Op9)S7E*5D1,<+O*6(-=j7%9cq.LUcl3"BCPDM=]AD5%Ph&/[iaFdTICkB0bk/?;ZU'9_:-o(&bk-,38jfR#cECXl*$Y(2he^%aYBh0heIO!Q$qEAHdh47O.%:HE;>$4sh +&/%1aL:Fb'S:(J'CS]Am-3:_3iMN\pr8HP@#-hAnB_X__Udh;#hKq+;,*!eNlMdla+_493_=60%E53N%>V%BRf\G;D?ItgV!_@^Cmb#<(n0A>1*DNB`C +0*A?4$1'f]Aj2W7V!5YX]AtHP$q;1ZoPKd(;Tbl",o[2o;A8Ege3P8ES1nDS-qg)Dh8O>bhTbKcT]A,.lKVR02Dd6Io(h1nkrmCIS"#nef, +mkP.HW-lb$e\.eCj"Y#k*bLL@8k:>3YZL5VUZh"8JPOr-@U +P-N')C,@fX/HkT_]Aqq3mA&D_i^HUL>8>PllqY$NtKZOT*<7h&-h:(D^bZ&a(tp:l(s*#ru+$ +BfVpN%E)m$DLXLqtlQj'@&3_G"^*Lg'G?-VqCZ+HQ(;I(#).RpinZ#VTO(o+ac2V'?LEW3#C +F,0b*?7a$=?RF\;l?\)7KghsrO:G^gCsMt'DqMu3/*BkF!=Ht'V&Z<"A.Bg;Z-X7FTJ]A%aP' +=u/N5N^@45=kVH[[OIuWfeS&^J`5_gYN!J$K:nKm"Fp2@Q3dU^VD_gB0]A-;6"$ISDKqDHf', +DA$X&f5:O&&>-HmS$XKKF?3C>(C)N:ZIo(Z$$W[Q;OhpY@EH*C`tc]A[tZ'S=Lrp*DcWP$_l1 +$93U_qe=s"D[d(O=E)o[M`Bd-e#DAT)nd[khmlTA5]AG[`c]A#WUZMV36*@b@N$AmbR'#t]AlgZ +<7EtOc`L0-d<++YUo$3pkuqs%sNArFlf\0F$.+-bCYss7^FCk'/qiK(0OsM%[$n-lNH&3bma +(*qT`%kX9$(F,im^fkUa=[V>I=)P6&IGEl`).3IN,*WYft"LoZ`fpn(B?=e +qm/(!*?D\9G^q&Ng#ImBLmslPe@,raE3QUIj6-Md=Y*^iII#j4YbbJ:Dmf +J]AT]A&&GS4@ijJ^qlnR.<#Nf@P4p+<=uPY_p*"!_r9&+/^V[]Af?_aH\iD> +=^GtimKRQo_7t!=CQ77):FQ7o3m"W>cq91=Y3g,cl0"D"QcD_`T;)YD]Am`,0eGOoWN6KDcM# +m/.bEqgQ?Zb1_MiWp[NN%:`"`@)4X:Q*,jM3^!\\$VBrt'PL82C5M!_JsG)%e8JdKci-V,VV +]AJS=deU,^k%3&LZj!\AO!i:>(G#u08h1,'Unl#F5eT.0mTgn3a9[]A?GZd#CIlg1LA=f3G+1( +fBSPg;kFHAbUPc`7pCAmV[(Y,[H+4$#$[uZ*iQ>Ybe?CU^X+UGeIde>-*721fAMk#Z]A7k(dK:`35>S!U%GE"Z',nn!7W$4cK"(4:Eq[9fQE-)iP +ME-?4ESi(,D>2%V*RUSZ+jPS>Va:#+Ok-h_XCL.aKB_82b;FuV!T`&0^:X)N?&+6n`'(p$4C +7D4^$V`E$M_)rqj<^'b#bsHArR$&:&!3NK"IKCu(N.Hd0#Y8YmMK2B1T5i#8[o?D/?Q#/6dA?JahR.qj2#%_h_1fP +C21o7T=.0TJF[EmWg/]A_m-Ns9E-H$i77mLL[=h&63Z/2n84\ONjLR:4^X:il*;cHN1dQBk"X +=odn4-*P1>i4dWeJL-GXr1bB2a=rnP*AT#SWKK),J,rh9:BdrIaFIl)+Rp=]A06:+!N&J=+6DZE5A/1P%9>$sC> +:usHI9&kWtrQsOJ[0,*.-oeVUDM[_egp#Cp"'$KOHI47Hne.[Sels!_c-R#,bYh[/YNpOm0q +Q"`p$kBdret7f\o#Z91_F[\_mq4kop5g$2\a-%'Q8OJ9r;8q\Ne^^:)n-E3N6=!l +%=pFQ]AcFlO&,id9"3khZ,nHQ)/1^fY:moCg77-r%-=#f-<-p!U=$+[Mff\HQ4MSS@A+HRnjm +dBLA06Z:5HH\tFG^8]APNg5I#7fh^_P?AZA0E1dBWW+I3R.p5[KMM)n-eOdLh<9'"1706XXf, +(IP(o?i7jrc$=jUTg.R*i_KmP32==OnQGqkj2SNQ&*\HZn7e=R8<=&p^\8h.tHWm=@lQ;@BV +]Ao%a4+`c#S^`7]AJHS<*'55'Mk=&iO5*t9tjFC*!4&;\hQk@Z)'N7jn8#O$8RTB6LMl4]AjJ]AjGjOnf%qpO\( +rnE9S@)O#BRH>7lp90L?+FrJ!3q27$oSqo+W)7A*l%0+UYfJ9*Le\?`plXb,^?8t0PhsY,K& +R7CSg7/jhH9rCeYf-[]A!j=rom-^?X$IcLL9N:9I>m[4u\YoGM&CfhB'd;\XT`K6U;k_eADUO +ofLJLW?A/V%M+fqA)MfP2c0Vn^JmJpjS[e=?@_,GLERNH=+gC$WU5T[1@J#fa2_m>hTH--GA +l_rY'Bf*g0[Th+$SGW9'p4XG;Rib!sBNa]An*o3]AMF(:>9`^@*s0?o=2HW<>t$n^gHBCsV^es +7"[;Y^(CC:LM=oXW5<"pX^(#Bj=YVus.k)o]Arf3RQQo%-.?(HEO>4MLaJ\_TAY]A"dc%NlQT6 +UN(nE,7a$,76Ku6*Dm9pei+mNeJo7E28&9JH:W/XF%Wp3N&g31N"09=4t`r@'TIR`_M`D("$ +@LaG=\AO^"14Y.?\iC4D%afVSM0-R_<`q2)0>mFr['q5g[N;7`LO"/gW]AEcQ3'%cP[aIsC!0 +E!"Nr,_,Vj]AXk]A"ZpJ!2oYHmt7/$07"Tto]ABjTgWptSATN2bD^M2 +r22>Z*m]A7L%[8)U6*Wa,o!Gm9cJ&-j$DS99#B9O,a:>IPP.L_?$KKQPsU`Z=;!T=C`N@c@%A +,k\:Vl>(:99m(D$[Ji'qC5JY7C-_B/\*:9DiL77sZMoG@:hk[)RVOV*PquC%c3m,7l$UOpUM +O2rFB23<`ah=[rVk_V1SfW1AYl9&[!"2%rPYNl-[LEWR#1LL5eC7a`82G&V_d*J<9TRHh)8= +\$R"V'(af56Dmq:WJWKH(Ej4Qm1-X7C*W/[>g#lLc%D)"..Sd.S3ZhH=72*7KXqG$f)=uBnn +V_T`M+RQ+ABM&^POM_:i?5eV1/L0g"qcK#aG8Ib]Aa=ERFTfI +d%HfiJQ79R2`528H8LrmC#"-+W_ol7f;cCSl^rFC>XJNL$1%1MjK9q=InVLe`Ur'#'N!bK#! +3M%*ef2*IGWDuHj04Nh9Ma!hg;oofX\"GC\@K=uqs`Q3)8uNraZESUg$eC<5?K933Lbq5KW( +lL`BJ`;M#b7E91TdH_`hUTfhVd%U#0HBNAf&3>E&LM,453n=O1;& +8?pMU1PoRflNMZsPlqa3mOB8\gE9TV?IU4Y6'Lq0BlU:I@(e5Q!pf-37NEY09fE5(Da0RA&s ++f"oK^]AM!A3jfp"H+:?D-JGHCHS@/m4(g,KFjlPTVipY?H`WQ>G&.h%BGGi[5f-dDC&g)VIl +>pt]A`PfZ(dVe+MT#"eBJ9L\ed\W*&kW`R8-?hlK>J+HORLZ^i#o`J(Uo`t(cI+A +XK?D^AqeEol,o#1?TJ2D5[7PV\,"!'3`"6H`0n+CrR#h$CtU7qjk`g#4&/P`[r9I=`8B6'YQ +&0/-:1eD0_*i/pYrLYM2@)7a +f4ZQC:i3'i3tbl^5\P;JneH`7iV=Dt^W2L`::" +j)5IZfbAe$Cea=TXnAQM+hbp!$Y2YPGK3UI".\SfSI6^t6()%o:dNoHe/)i*SX?2@1LbkQ +p,(pG![AIN:\DIXjdTQ<9qgl8ViWCm6e42]A!dL]At#R=->(Wc9gQe-"Zc:9!n7UmnRi`idMe0 +B'KOW%%^d>-e/J@b"ncNPJ]A#+)f?96p'u,6js)d0d7J6EDQhu7E'Pm]A]AIkolpOnDHcYR%G7X +j)Odn;2Ph)"tmi_p4f)/Lr?0!UUXFh@d!)0NH5M0V1CoH#>nK.r.`o5r5p/F*;_M?bZAPcIT`\ +W\9F\e&LZZe5e>:kN/;91C9Q[?T,.hI,#t2=_4-mLN.k@cBF\+aA$;[-`H@#h;-a^97)0cF$ +iqI*OC%aUEthVMZMi>2Mt.%Pn6B+p%Edj=^#!9LK5F(i/raO3d^n*X4%rM +4+R4/Q=I?[sAp&BEpYat90D(0?^g0%U'RsoBL^VEWXr:TJ*-<2SH*4/X4H@Z=+OOE4/B6j#]A^4.3HeuRaaYTtr;M,k:_3O8#FaP&7X%1UcI_rV.ii5:5S74B'5d24j:+9^q>B +-W?<+a;Ka:T7:ALEWS@+TE!Q^=_O"6J8XnC^_@fn[Le9$h6B_U9)5Y#5Bj6-EVCC>!nWNH4: +"DYo7'h'a>P*2!#T7=Lu6,*V/]AH'&LlI+,/mdSsV=\eZm?BbecCJ22e!0e(T>)"-fP4Mm]A)(5TB@K+c< +9?`@oYCY+":6e;RkI3NMANoB^>I(ue-=E1B.'Tm=6Sj]Ar4^Ip.=2V6!m57n6XM`Wm5BL=Q?^ +/35+BTNLjmg!.H32!qWH2Wf[pfMBX&`I@9eu-\Fp(u#(0a3f\:dVrO6Z^B(\'gSlt=u[2If-g0(a>q*&D"@GuV3Dk`"k7HI""n/OS7[D-(]A.G@.<^V1)r7I*qP^omgmmkC92>S*>j>ke$QlIu,^ApT5Dd=CS$ +@8K]AkFP:N#tjgKZ'STmd0B(_@;#`sOeM\OEpOkB@M&YQTSGjlAF3i5^KH7"!n!-M7SeAi75S*5=2-4UDE9!Y?iYA +@AQc!HPd'a(3eqO&14g$`"Qm&BjlNYT?7qf%Lf;\p&X'F`bL3T4W?5]Af\89-&!%K\+E'^Z%b +t.j$fnf9[]AH=@6-$a@cZseP7Z8='ZeV;3kPHFsWQ_gpqE3JPEq`C%-s]ASlVB0bmFhRbJX#1a +_l/KI&^tY->Jh)p6J,dT&\HR9C,U,UdCusd?5PdPZgmY9(g +8bHhg=f_7gY87A#,6"IC%sl*_7IDs[_+U(@43KR]A6\dJ0WJe;2&8V,@bC$?,NZ5cQTY(t/ZJ +[fQ,n3,!N/A/<*UE)eJ[Ok^kV%]A]AE6"90Afs(LKZ#!+Z=Lf/^&9I;(J*(Hq/4L^!RL'Gal?j +qD$OJ`hkg1@UX-q,\Lt0RlsE#:^W7;.qHcpi#NmY$[*r9dam!P2=,p(#LIZ1X'S^g]AflD'q7 +D/u[s'Fi$=0[1TE':1!2r?&EDP,`d[K+Sd#^:0?3JVQ:^NW:k.O#m'&qo>@_.qQ1J1;28.-J +QWUq[\]AG=02_Y,bQirLsd;S1djKfg!H$?V +&_if&/Q'rS#WjDplR74AD-3oPNTC%h)&N8%'1#$IU1X=D(TRlf<6W(+P=0>_84[PeWDQWJqA ++Qb>/#U*m;]A6.=q`amc]A`-DG6RjR]AV>_YIQVP8.KWO@CEL%k?UpAY@WHAY9 +$)g;W)+Xm[7s:5m)2jrmp@R!h&ghgQZ\(mP/CuXtn`M`C2]AdK0q_uU40';9WA`//-##2;<_f +9[lOSb:\)$eNDnZtOZrq.0M<`G_t?`V@bcDI&ag3W24MJ^q!MG[2JSl,`pXK8MtVa5-E? +j16^-ubib-VF`Z_P@/SP%/F"iI,g]AE +)"1fIGgaDi_@gH]AT=W_=tRJn:+LU(B?[BF`aRY]AI2m^:+TCkQPC\skLssK`FWLg?gM9KcZXJ +doNTb#]Ag9F0DsS+(T7aI+?>f1=(cnn4=BKEnRDeBuaA&1Pcu-b[n15qn)5?i#cT'48oi(S== +tS-@JYN#;qBcp3A(o_4,.q=n-!$aU9X7*?P`N?#jfu!G?JL_bH/m3@rKeWY6?48RR"&:_ak:70kmNe`ktI]A=lDm"p`7FE8304 +rUN!S`As@gI#iZsphHumPb2.-SS3U$&%;6_.Pan&:pA""/m>`nF/EOLm75_ +(+1mn6ed@5d0-Q6lg\]AJ=8&mK352`Wl\9T2QXMUYj-C'%UoT:fAj?&*sGI4"6o_SI^@2Y6pWt=3qUnjg3-]AjNMDD8&Vs4/gL +hGQqTmD]A55D:HcSQEITUUS=J\(^(O?h%9A^3h,gCIi,eO>s]Ab.!+4quF +`VBLPA/IT#SO.,h:`LMp]A7J1(8TetRgmFM&2-'Gk*`d6C#/kfP-G@M7[QL>5:R?,Du=5>i%% +5C2sXfI,=un-SF7?n)r/R$>g0rFgV@8TFufTCB-*E3NV6+$UB+FGrme\@K,:k_@/fX:;!"ra +9^XpCZTL^+V7r5Gn7QK9OLVCj4/b$kVTQ%pJQsi4!X^&p]AIOb0+AgrD%R"j/)P.Y,UPJDi5a +u'bCqTEL=R1HmpL930a82$eQ*5ncqQF#5ld6'9]A;(e4-]A1Lbq@Fot0r +J=:9F]ATjQ"9R&0eb0ms"6W`NS?5B9UrAkeQ_K%h;bMZC)Pn_XD+Pdbd +4+N/`m*"ncpO3PnU-fLR33J($o2s5bW^`rR:41%*kWH#re37Vr%r>7_2&:K8-&"ITTK^?mqQ +Yd!+$N;u=M7Y1UiWhG#rK'Z\Fb9WpDeqMkJ1Os1(+-Ik-0Ag8K@P58uP>T=F-ALs;O[7t;e&$,_t5cV%GrWZg<%/SMJqtmDWKK4Uq@4&T:B-q6 +6A2?Shs;C,H.C?iNG$uhrsaj!*i>3qP>Y1,=FOc&0mg*5L4%:5p]AH,GkOhI`Pk;6j-^4+T1s +<&T^"&0=-:\uOR(/[.JoQi#eVAp))YHr:q9$d7>OP[O+jafEWPCcOqL91H/uP+8N8$[52"j> +R@-i]As2dKPed]A"<\ZNHC$D?GBUnj!p:%g"aJ92l^E0"E^#rn[C5>^nBZPGT>C'+s\HoT.U2% +JLHf!*I\%:D$CS;eH)rFi4oc^t;GLkEP]A^BjBC]A=PQT[<()l^G!:J$T2bmeC"7I4;MtY]AEf=Ppic"d1cRfd.,Rl=flC/B-U`b_5;H!f4,#0@Z`-u0\` +nt,T9?qtar@Fd"=cE!=7o+tV.k8E2U)m?s;UTX.h*$6!ZiG +gt^mKblY*-:Rd=lY=!Hr5qi8G=5SXC3qY]A'lCV:#(@o<6a?TYs!S$U:UNMq"0Q13_.A250HmZ/Qg114NIOmG-b:44_h@h1> +L5(H@?RdLXZa2HurX*6bFQE2b,m_jl!6s+R/U);3@%NpWRJ57o:\[:rW:]A_(Plr_#oDL5U6M +MrE5(HV\X6jY#;bIQL/Y/_An0@CK3P2f>^gW-);,R(a1=FU.F)p[p&,lK5o^s_gH>q4IQuON +pFueY&5k4o$73bi1%#e_?p,K#Zq2A3'4hXgP&spf%9dhOp*s\_#qk>8o(rJI_j79!]A86s!\r +uMq3XR\\hYAZ%_Es\nCUkJ,cE#>$8E4>7lm4SI*^isqKLl$tjc.)7_IRYF9"t_QG"R>2rF+( +<7m$]A8ln:Q9Jm2MT8E-h?S]AP$ +*,lY5u'krS^`+/m2^HC]Ad>s&(N9oBd"I2l4'_VTB9UXVBH^W1U(d=lnSqT0+uAdT(,><\_o' +RGe`eYi:t%(df-X+Lm&[<2OHE]A-kK2XBYN_9"._OW/TA+/=LrPR=O>rT95jf!"rr+&il.X-H +;LCUu3:tC4UeO19gTXA91=;8eXqUeH-5423FP`Rj#MmeL//oEcR/WJZ+,_<\`Q#n%QoHVulH +/M`ls@A_f=?5;l%.i"Y9(Tarm#UB$7r;tD_E\R&LG^'Yg1@A4J^6sS=l]Akn1V>b4J$Gu(S-P +@Vs4.e?!#Y%I'(3c(cSPVD+d8.5T1o@^GM:a4g62%HLuK&^8WdXG((dmBU%7Rfjn +<4e!Ma(9^Kp@cJ+`'p8hT)!-c*#k!gdo/hA=;R2^OootljB20T7ut=]AXk2DtLf$ea)0+>h(I +*9?9I$l&KYK0?jO5/Z2L*qj=s:sUu_"_b]AdCM*_i.7)qK>$h]A\R(0Z71E8j7T>2>BUnh*3j4k)Rb +*#jT."p,F,q!JBC#Sn^Q(d3riH7K;,fE'qY?&@bV;QIEH2kLX%M)WA:r$1`SdV4>55(5-1PM +JHk5iN,ebde99H5'V84uS\2q\S:r`rY-k=L'5*oQE;9MU%!6\RhFA^kgMI^%gkR&k@;@U]A-% +`4Fo_8&%VNO0(\hBAQc.FEHSm[T#la\CVo+!\_-Xep[8l4(XId>#eDG_qme +H?"s"/5ZG(2F)sQqdL-A@NfH:7VVd!\^OL`[U3'3<[USX;D&q957lQ'Er_0?m6XHl!t#5"lAR;pt&M/ +hmp[4m*b/;9*ELIANp2S8[u)lLtLA5OaM5a+1_3:#+!ijg\pJK7)ST`^j/ +!Q\?a,6J\CkKWk3\=/WGaHLl%Gu8W?*8Vl/5IhjG,8bLqh?,9#!:_PpDX",T"'^^C_#8XpNW8VV2=LDt:;8<.&7oXer&ld`9DffeXE^eB1i'aDQKu/I9Y3]AmJors5 +UMuG#1BCkWBn4EUT04?bp^dJ*Ws0 +IeccJ'/`BoEa2MYd2["/h9Z__>ArT'qX/"f,%UT?]A +#i'e8Y%\O_S*"V\"_C6FF1X3mj28dP[cntpi@LJ*)&59eH.UkW,X$"`EsXU?toFTe3AI)P8. +O`gME)g(Ipe-]A"pu5f&uANYCOL0a2T_a00MH\=9*D0"45D\F)kMpFUC,hUI:UbIR)O>8h^\$ +`/q0@SKct@rZ(6fr?N%.OT+[nF,L[`fSfom]A3p9/^OI>V$C:?&iHr]A'g7/IZAmsPGT&#Xgq8 +C?mLe/K&4=F1EoRZ9HL6kDWa.Q#FGmJtYc]AOCe1bM7A)SCCh$<29ZTB3%EX+Z-/77G2.]AY&JjA1X5L'[TBCQ +-^Nr_)F)'!PiZ"H-&M/$V7k:Q'%[;aUhDo2D/,dBU@Lg?8=]A^B6Q9:Ga@lLSR^((n#KV"J1>9njblK +QDsPsn`0^dL.YL/khl`EM'ts0ebp\V=9o`;+>i%D%u!gUDanjA]A*%T[6kHlfdPgMMmrf\$i` +*`s,cUBM.&tJl^)WBqZ2\kb!KU.Bfd6h4)L/hLRe.42&V=V]A(-^EeS^JG,&V5A^Gc56kZ*ug +2^\;C$DNkKVPL!-n7eT2C%,:D%fa(ITQSnEBe'g&!N3.cKf<0REG+ko08Bss0Ys0QIEqup]AL +b_gP#Lni6g\aWQ>k!JfS[4Z*A4j-M]AM1aN\1JZ0s+1%B(lh%c<;C@Yc.H(Gk4gTNg^IlXco' +qH<8Jmu'HAl,B>)i=*C>W1??*s8Mu/O@"pW.k`8F]A6Hsojhf8>f_"!@[fCD(,#Q7XKmSBr6? +X/D5?+1nEFW&b=d)_bJJ*)l^OQ7n8egmkr[0mg%)Tkj;SF^`(kW+YM=GR,?='p)*+^1%lLDJ +6J)Ojd(*7%Ko8S*=gS>1,0+L1[\[QCU^#$F9\/ddu.kBrHh]AEn0RD]A,(jaO\Qs7aLDQ5,%g! +@dJsTeH2p/BZ,X4i99U0;KH1"6;qF-2R;:kNFecQp9H;\\V6FMna`6@$[(CD*?bRmGmU4IV4 +gP!s6%a?N9H=pB=CX+WA;;p;2-_"0&t`*'kP46*s8o5F8q%aInQ*jlEM%'l!^&V+=`prJ1,E.]AL!pHe46otPPr$(t>srlkGbO[.+9-bImo#M83\EY_YT$$gFESXN5;6 +VdeAcFUO8W6)Y8>Mm9BXsbWOpu2e0]A7O&!m41-t4k-;:^C#Hh%CcV'N/.3nD5rZ:)=%+*[f. +X723ft$[1=F?2um:$earViSpLT:*NQ2t%3$a-F;[[`g6V*'.Y@C;T`*ltm_U@.@N!6)5&<'K\DRXC5OGTqnLFC7/]A5[r2`VH8Au02)R$(n!$cr%UMaTc,7fVVl%>Qc%/ND-fK)o/h +ACV#fk05N&9P?o!6(*$-WG[:!IcGX,f+q_S1@Y48P5.cg>uY-.Y%PZ(To!2pImr1UOO%*\.R +o0lu8jXU,EKkABKfn9=Cs4Xarn#+QT-&o)2NHpdq@,F;^C8kG`S^MgGuEeHr9\%[*d62Z8g]A +%h2_(BhnPianc,rMr_\_&i%4U(S(Jp%9o`IH5dgJ:IVu;c@t6!#!dC8Gf>h9G[^^9t +XW?WYi:F%kEa@l6M$-7Odg$_g_gQm_ppJ&=g>0R9E_%YU7pgNrgBmnQ@4j7a?+MbHfJI!p2P +H/P%[ZEe0D]A<4ZG./hJal_^Ht:-B5!@JOtNDV!E)cBZI\pn/2/)&Dtgg4/LW!)MZ5>$G4=(D +06'6[V^)'D83!e9Gh$90qmu2;i_%qA8#0-P[::0@0XVcAoYOrTUcKj49UnKYW?T$FPa_R6J( +T/PJT15%T6"D-F*DU4QWs[CDU)X$)&nQOVtM]A/P&`OnIh$Nk04o6gB^?oYfUA4'@f`#4Cj9, +8XtU#=W1pi%BV2FJ0p<''`K2p%*3Vr&2m:Eh9t"76mo`QHdQ'WmMGIcRRYB^s2SEid#Rbd$# +h1Qa94q27ermRHTq8YfPhC^F8.@n_hSdr.j-9lRE!_8t^ZmQ/$D!3no+,)_+\t=IqAXbm9$^ +n#@F$%erZN.+uu3?1"\'3)*$T$8Su"KX%u.*h5p*e2i;0"\;:]ATEp52+D2V&FoM5J@>,HK&f +cjm1X,"9o+qK:c!S'OeL06IGQnMtPP=t[V4W7PGs?/LS0u+f!%NVeID*UFMNsHl!_foFmF-Q +7`$"pN4j7TULe_^Yqn"&!URHm"D&S70F3dK%_YC(No>1AZdH#\&%0$7f$-gT:PohFIIfEa?l +`1sgJQq]A'Z8:e^a-p#?*TDk1PVIC91.[[]A`rR:!1Bl!49^5J6JT%-q@- +bLYF>UeA4[A##\NJ&FW*kBCla&0)\fo&WN_E-Mus!JA5d%TdWQ;3=@,.G%-_9moF_%q#./bn +@[nLIb5@]A`,T\k-*5 +3DJkW$.9OEgYa[A-5\(lU*K)sPq8c-!8Il=B`>r\kMJa:9a%V.799#Bc4I7^]Af($"A:gS7d]A +>B_1=c:9tJ=5s+Y0U&9qlUcG3Hf7[)\kc*H]A$;Vq2lpTnTNE=cddYh.-cA@E?UI]AWT +XV=.m`T,To/?7$A't::X3K\)>%I^Z=^Re-)HaE58tU0NAqu+m&=/UkD63m%Utlc8A^i(!>Q\ +\hiGt%u]Astb;G,H"^X#>;7I`2OE7+:L["\L!B','95VDL0JZ= +9Z#-R4*o>;lubWrr]AF`r00rg3sQrc8/.m92"3'.l=iT7A&:K."K>Tl4n3:#h%drirqZig_7H1PWDC(>16]A%1Nb*[kj*Tg*]A0i72F#gCq*S=rGLnI*H.#(hq +C(K2c#dDn.O/Q+!)SrCJ)bAn)$fK]A%4[P(DT5Rr<^/@Q^mkR5VJ3c>$"d,0D:k$XK@=Sb-jn +P&)TcsO>LMo-aSm(oD;&r\[VY$19?.dQ3\]As3bW2O=Mo>S[R?Gd+#CroXI5?-"WkNN)>oTXp:*PG%i$BoMRED)EcuPiL3dra^%=B6&bZ<);WW,oV;9tRdab]AjQ8C/%AL& +QJ)9\cts#Pt]ABs-GQ=84.]AMO,T'"dRcofi;$P9hiA#):"u+]AtM+A+OM[Ui$P(F=UJs1f,<2c +Yk[n#(onI4KnkJqmEY_%Cc*"/L,n>s,V0Hjs6'U8[+4hfat&.Qr;")Hi;4.6/VGN"2WL5R#*Ga"D;.oiC4!kPDPj84:%n)8>b+NWA`^DYaH:mN9GE`/E4Ak5AXiX +KAs!.!nTR'%hkmJ+#!kO@IX[Wih78c*TK%;3HndgSFo2kiojF/Y5&]A<=G=fC=s+S(5\\i<)@,?g3ebQ)D>s +9IB+F_*q0t(LeRj0Dp`)9Zp(a?WpWomD0-?\QOgBV+2(+%3-DbUle]AY#I?S"]Ah7?*:dM5Q[s +1e=jW5I9g!Rf!(T;Nc>9deU-@=/Wjs*hZSqk[)U+LsqgrCDHMdGN0f&<:aEu=BNB3M$C:nE@ +;Mk7Rg!rT0*(r+Mncp'&1CO)V".sG&quBRISpfObHp&Dt'rqf?I-".tGM0p@L%F`FB+\I/V2 +/JQ/M/Ocenmko0FJ&dX/i7-E=7ZYJ-9GB\7RFnOGE_L`E%DU,NFGIJ+pSqSGaq*m"m3]Aa1m) +,1UcF[(XdW4/!'\/8U^c=t/Tiu^Z<^>0c;M'6PWrtf>QmTE@g#jBOCDIugGDf>*0`s`8gWMs +J?5X]AmsEq/_cE@$9nLBG3q#ml0"_#^onR$sP8"CYA5=!neVnG2Zg\DJI-Q`O_M=oiZ+%0@6. +F*pnhpPVBH&!-S/Gp%2qPg<&uZel"+">9V&[N!0(`MoT)THIR@?CN,l^:]AT0H(_qPgN8RWNQ +j9V)a=^tOK`[06:k(t8I5Q3s)htd33mmY&$X)gBP=j#K'Hg?UZo*herLM-A[sR'Hj*g]A)[*W +'+b.$Kbl/N4n4i6jU91[ln?=`L + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/':f2`jpZ2IrE,a7kZ;>NMn"o%abdb$NbYpP +T'R%#YFpjO$;T^\<1dXe@Co$H_SV\15bK'nVYVpg(fSpWt%&r]AbJ)8ELbFPU1-h7WCPe96 +'V9PFP0Kh;A1T^Zo>fZ8#N@US,HlMp=*XZm3dk,[=oh(Kh)1Z^f#Y:)\U3Eip#MK7Gp9)[aUT1']AnL"\B7.Qq1 +>1[eZYO!ieZC/6biF@'Z+]A`q;%PD0Jai^@5gAp[@#>..,*pA('W\H@cAih8>n/m'G54))"+X[C'j)Zi=nJbau*uh.j_#i:M-in)79^T&@ +3+)cPDL=%^"imH53o[IMH3[bpq7@?WQ]A&n`U)0fWohr=`9>a*iRHN/o,.*b%f?UWJ'rGac`c +D<6'N/F+u9qCl:QcX]A(^Pi_"fQWYu+CBn%+>t)olNi?WjFhH_ +7EA,QSpa=c@"`YYF0ahD@7==1=8n;#f-)jfP8mqXh/l6L.M,_f9HQ%4E%pB9DCVPkLupY]AU= +*$3AKg;:IP%g+KkcgA0o(j!Qq`)]AV+,Yjugqe\D'Z"B,5un(gOM/=q^X@"K6'uQM9jphF'Pm(fE8b'H)Y4`#n>V(%oB"/fEP2@bo +\`XS)k3S7%7KGg78bj;AjSd^QUc_Td`FYF"j6T=Td#8NC%5,=(5ZV6BnO2Canm)]AQ!T@uIL> +iHJ@$c4RQ!D4:daCD:l75;gDK/]A$NU0<1@(&UL6NKjgl, +P0WUXq%=<0[>KarQ#`T=oG)X\Z1"-n1SFm;),0lA*=' +XrVS-cX$Q:pZcE&obUea#'Y_o-VL:C=6EA]A$$.]A$a^Q927/3drtiurBu3L6#^c2gGrF#:b[c_iFII,BIBGtV.; +1S%/u%aNZE^MqF@!%X['T$;JSSrolYQdlMCm`W"6!eoiZ8kVfM,=^)eIJ:tlIGQ3PI0]AuDh8 +_%+q]AW\FImQXs=DehM/:a;hWd!28eLjp5AQ;G&YPSO^e/(gfjXBV)WZ7H@5Q.CoE,LiUca.5 +\n$oKB8CW6C?EE9=(>;*'l0@ei25horJ(al#ou2XhYJM$Ya'Oo6;Bu=/9#i5J)A$/a-2M)Xn +`AjYWKn]ATG.4EsrVkDk\f+s+7D$9tdDh@(\lb^"RmI4%^q,eUmh^AaN[GLQG+\XIPfBfJ\Zi +O9bQ*itqr`@QFn9f^HDO+eHQ4@02q(DbLIcldo5-MfhjaF&M'o-i6a.l]A0;.AU`5\FeMO&Af +`;:Tb(&HDOht+`7>Fe,K:JXb'9VX*%ONAdLKj=)KkT1+!=ag6[CFsHB>[[U5NFl.SO^m9X_^o#I!")LrJ34(_m!$fr<:cb6N,'7'.uP#c-HFc +:C$/C&B6JDW.r$YpN>r[%imbEilh,J\TB$tYUqCk'VrakLjL6qpUC`4uPQt1[opZ@9J-=5;9 +t&MdCNZN3Q$(KtkY@cjUkNdW(RNUn5q+i#1FZ6;HP%>0UC`NAs8Db5\r$@4G7j'.HZ!^2]Aa> +Wjl$@]Ab8WEqGj[p2'Sa-q<_$>\ga("]A3nG"2eS\MZn>gc'MR4/1)UT&PW+,VF;BHU*h+4Y0! +NDqQ2)E.mppM>(Y>L7C#@ERlmf&23j-KbjfYkl3.%a-HE5B,L0]AGo<5>Paa4k[h'Jk1XUm!q +_;39mN5'h$=kX[?B5)jnmF2N\7SkY1:Nd]Ap"oRJ!k,md^ +fW&E@*hq>BK)Jbf9+!C_;c16'Z\ +qR4\Hl,XFqZfk\XgP8,R$K9:Y$X:0CJ,M2+o^,PR,[SVTLCiMC4S(-0OL226rVSaCk]ARQ\bW +AE.[brPHDiMNU+H.(Bf.WV^E_aLL"!C-jlQ0aTjigu[uk4i&d:> +LP@n%mUO5>TTPQg5V28'*A>'6?4I*f6]Ac>)'FD;"@.od%bmtW$c*@'DlN)ef`#q*+DbU@+gHiA*4N'iIJU-ENg:ta*Vl6T=8asd +DJI$XMt#/_APsU%3oa&7iD;HQ!h13dPm^8%1mC8qEnBDoTf+eq5tYlG-$-MnVa0HXR2S.6Gh +V9YYp'-'X5,h/q+t=kmAg^:A3`B,F=)+f'Lu=RQLVW1T>bQ"h[blFaocE"qohge\eAZtr2_5 +cTBmY;C:hb]A=)ACmTdZpMi;ASEY>5ZfVcGA3Q3U@-@:.n>4I^,C#2Pj=3$54V)AV3(nEN[?G +,fQoIT"DP-(CGJDP.JM8gc.uL'3hEn]AH0+Ep+.h?8[b)68\0d[u+l(#/cG`D1/X5(L`u8Mj@ +mBa%bol3#D]Aj:^)l]AkB8A=H%c7q``?^rAWVk\gkVYiGQIjfIQ*XpG'b`]A1SP.uIs`M>rpoKd +-#9dSQKHC.,q+oAYV_:OHn#+=9BTL.An./)6-mFT8_GYi'VN'HGUAb.^f5Wh3#R^k0Qt=$2I +TCWgAL7JVHV+s#k@'oMPCffmGXkroDI1K:UX;`"kO\jJ6rmo4Il\ikaVVIo^nt?5<]ALhCoh[ +"@M[7#pLe*AXeTC8NK#.op895U6Qoo+=qW_EB`ZiYp(ujB5hqTc$L)=KOhmV$NG8Ya/',!&: +Toai;@^qYp_F?=4:IQ.PK*Y_LhcEC9/mih3=4q[CL&e^iakGQR8,."1t?SWEh1R# +7:,cOF9ai7`iLan9$?@o31A-#0l,s8BL-j/7L6XN(SH?)B86`;aTla-b[6cCgPPoj?>*=H_l +.!cTa,d9JF-Re#P3R3g%eTHQI)W*l$>#CX`QLN<;)fPD(0Z)1pAu+8>F-`aXLF-=!VX.4&Qi)$mGq"iO$=s +/tD%5n,6E1JE\5o,iIo3F9?Lo;8Y6flEgl:VtQ"OS.="9aU +?"F$Y=>aFln-PGjB7DE8V$lnb=/ho*nC@SP^kK/V'8G&_f7o)$mVU_91Of?(]ATJjBB>.V0[s +$V2EMoM15>a60$X_+g+jIa6_0QhFa7<[LZlt,.-L8l0o]AG+WRV@:FgGup,iIEI_b"pgL#CpbOUnBo$nfq +h\e7"l:YZ$ioF+QDUcOJ>+Ae:YhT&?1NE*opqa/YWUL\i,ai("R@%oRG8JDf3GRb3Y0.ENd[ +ASs[j'kpQq9ejUCO7N'*AL>V6Q_CVNR9RATd1J>K?mI4t;<#&A7#=(\&@J"^ksm9dTQ;%G59 +"')omW;4;Ab"$4aRn/4e?df\8l%HeG=6\Ka""o\RXUCLlr/.phN*`o0XMpa9_YYSMZ2'(l5[ +PrinG04HGf+,%smaId9e6`S4n>P-XLJ.s8\:@5REJI,/$CEbLWh'Z)rhV1F/6H>Z1pF*/'2CN!f$X!7[PVh5a1 +MkAWa\[ZnY[TXGCdGr_ZH5:OEA%m\0HWlgk4?i[Oj;PdI6%qgUb02Y!s,1dJ&^*BW."%>)Ha +7sW`)W]At2D)qk79u)T_3jca3QY'HBlLf7bkiP.nshV!L5)+9Ch6m2ZB9romY&87Y/&(^jX;# +sO@g?ufr?;P,IYWn1fL2I> +f5c:'LW?b\Vm7%r'm!IbVM#!S.oA<[#o,ILd/AE_1bd`:W\9cAR>1PREJG5iV;7UZY5'Fp

l7uHD=XI@=.UN@0P7[c&%![_a=Em+C&K]AIWE50^SO=4<5UK+?-%iF\7;=H1RZ9I!dDOH)\=?>B*\baY'-pT-+[ +qAL@=.0Qq,_JE]AZ+u*!e9P*UI+/@3?1PcS;1R`BM%n7#[.#MMF5GmiC;N +H;!6K(&6*Vme#tSDL62e$Yg6I"nY6_8@#E\k"i"\*!V;W._R,U +#/^>-?(Z.:;:65:":?Wos$7EnYSB\L3<2G;gr7G:(EpGfqd!bQugGTA^-7:.R/E=g"t%p**+ +5d2G;1/Yi#XuVS93%I_T(]AQVUd^R7*pgD3BS2gii%?N#,9Rgm^N7Wi0'RfTe[&[V4F=Z$h;O +kDY5;7i%.sK[*MG"CJ(9X^k]AdHW.2?!9sb#]Au?rO#CJ<9V9V1keRpD%h108QA4MO_8gb-W"n +b:C)-]A4lmX5`6RjlqsEeO]AG*V>oqKGsLC]AFC0lL&>DEK62n;!a1-36-jB.N +C7R?*C>8Pr]AEAh_Y$0&u3!?6oF,j'VB#,s0Od`"&2.bHNBlFkFPJ]A]AP%Z.Pl+nIft9cIa*9Q +`3^mjhcr#SD7He6&H+B4&1q@VLKO>8Er"]Aca7"-A6c+)/pVs8J.>b=g@R%2/duH$fpnQn9/E +%%@5-]A!?VI_rjEsQ$t(;]A+dHWUR/C1H#qb-f,:)Z_Q_n--NZXgH:G!04h-!n(M3dm,GH:j*" +7sV!_]A(N*KoeHk#@iM)Pt4KkMNjo;Z&(,P'PTjVk\NhS]AhAR4YFs?'['DF(1(+c*-ainn;;l.korb5/8)!S?Si`HS471t%&KadgK@$L,bmP1 +qf0gM-^YF4Z@$/e)=s]A8gj*XKZ]A^/Y1a8mr(YUUP4.b8toHX4WH0LKNt#[Z6c/*?hksjhIje2tB1-;#+d@$2MRbMQk\)C?Ga>e=Z]AnmJZ_,F)uE'WB>"Rk/(]A +$_tF@T9i80;O1liC0]Ah(3*TV(lRuaNg$?UFD'UNgDY>Dm/&6\g$OJ@T:A/Th_Hp'RFY84c[) +FlT1b0seI7@nS'VBY25!e/l#m!KI[WiKQI)k8_2*&N%NWFIQ/FN +\LdNV]A=Qs]AO5%)XZR3TVhAJ\Zd_3dJ;&*.]A@n13:CbPSt/%4p*>B=,F]AAM1&Gpa%m)Y8V(^B +W>,(WBuWL7b-L-o+V/$TfEdXO'pG^irfE7f;,/#(poPE&Z +SioWZTR>'!ZP\tHnL_]Am%]A`JqM\eb!Hp$Fq,Jl-=Om3O:kZUms +q$XJK<^9USDmR7>Y(Jf*A.EAcb0IUAh=a39`P>J:X'8IF6#K.6^lsl2PsgLQ='gk>7$a +gIQYB7kE4cl.aP\6_:[H3MJj84[_J*AEJLH/eHC-A^7?9JaN/Vtl7.K5A$SOY4mg+XG+7d5U +4NZ`phlp8FC.T:F\=bdB@u(L1'aPO/m]A<,%Yk*0r:o'7LII_5NL-i#f>YZB?GPmW+Q\PfD?C +K\9iX?k&,0k@(O8EHu@>\IRBG\<_)'MIQd'gto!]AhiQEnLtj1q3DQM+i#G3>e6Hp..>/63Uk +UXiVHL3fIo^O#r+^`6[-T4jtR"!Xa1!`E,U_\F;oBEg:Sfc1RK2_;EqS.fTDAga1@lL2*@`_ +W]ApI,E3fB:>Dp>/jA#]AmnYQ]A%+QZA/>u5H4"LJg()56qbpf8#iiSD/gV/iFP+F$OK^1;dSLf +A_Rn:>D&eKKZro6$bEsDXZ0siiel,o(2]Ai:J1.MsO"`pM6rDA<%dGQ+VNpZ3[@[S +Wt5LX-i29OYqp@cG@UA\fjf1f4m&4oOS2qba&PV65H&]AZt:C'*2u\X+^1Er-SX$_\-jFcF%* +EY/mG>iHo1]ADaFblgZ&^^"[X7H)D'usa0KL%N,7J_Kb!p:\Tc5s%ol"(a]A,5L"S>lgEi+PSN +-l.nrT`o_n>nJDjg!(]A\O)o^m,INZ5=uPP]A51%3DdCU,^Po7:qbd:Ufu^QPZ4<5HKTAR#7dS +Ugn\;f"(IA@E+\[RZmm'B!t.:u`b'e%:G5oTY+R!$O?')k.OrLil!&=iVb#"O4Fn/J?6Y+jH0/3;GCK+[k,u$T=HcSZ1.ajbaR3n4X`, +-GL9e5Rkh29*9Lb&oldpe=rm]AbTp&^rR.A`1^$<7M:iRZhE4m\&,q'+oBV3n9Trr-8k1KbEJ +[N9E&_6l?0oL:L-MJ%Gp$`49:bd::H%`G.crT-AoZODUSJ@X,U@9N25s`m&`/++;m"i@_>g9 +csZ.K3N`^*CIY`jb\ac@m,^9;+#4Qp#%S*kUG0o`/,Y!@/%/4Y+=o&(Q'^!bhZo$Sa%(DiEO +o^%5G.ET+fJWn`&=8M,ER4D*u6nlUDN01VX45O>n6l"4q$d^&c0P)',.Cc+C&lg&oKD#-g(r +saOdB78M!d[pT;;L7=gr=;.FIUtopZ06+Qd1A& +Z#O$+N`0@Pen*5`KlBbo5hd!$J%2L2aBFQ`/7n46_,ac_U6@X.Rge/rO)\Ze]A<%Z3O"aVK6LJf'ObIKAda%jfadD.YP(prH,gBQ@t +`,73F@"fD+C*;EDg),91CV4'/oFaNukO?XG<6OrfVpe9X00[ejl>QX+g!n2Ug.c#]AuA0RchY +oaE^L$e>2$+9YQ.oa?8o6=l_a%utgRHk4nUX`\JumXl:'[?VUF%([457]AZ2dT8V.G?(UJf7& +S)tX1-g)q%ID]Ag+S9[P\=DWiEdGD@X-OQI]A$]A?)n"3D)%7r$m'uN +)$9T!NX3WBG5PSS^_W3b&66.)`*Vppa.gXN)tb4aPnI*s56-GC)VhWEs`j+m]A'rQ3 +R!6efL*eD,c26]Ac83=qX41ZVAm]AUd%7O=:O!J&&)*n2COJADFA;_9SB(I&c0/d!49`-?B_sC +74Eq@tDl7qEd;S$IA,7(cqiYI@(k==Fbka+tH=L"i4?8sq:>CTa:Tl.q\Zm9@'BecWm8XK5n +8LuGZn)$e`qaZV-`XES:fphrb$/--DPiY`g&?g@X0;.4a7&1i`4"ls47q55E6st(!-\AML>/ +`-Ao_/VG+dn%8(Y?F[c\[l9?!@)s?I!c7?IB:YV*nBmd4CsCJN=q3qX7n^DQ\5(]AO9itq]AM" ++jEGL88Q0tuB5iL15H?uN&1uTu:4tci3CAhs_p\JK:21NGq*Y`S*1b.r,]AS3g,ZZA/"G:sZo +6^YH)L(..f$nI_+D=Ua86c(AHj'd*' +?'esa)ZAupB'SM!BkDUWN$AmW;qJl9l2MSJJj6*8;Z,o)20@8RuA"[fVY&HY2?I_i)Ia"3Be +"P*>(SD]A5@4i@qP)>S-&]AK4^XOad+Zeb8d;18%]ATQF6+D$^mlRU#MD_s!63]AQS8%Z?4KG'R4 +/'q%N3Fh$*t^H%>]AX^#hp[B)YcR+[hJ6YT'r)#`6uEXdTC?+mm?+hc!liZ@>Wi2+a"`Q.3oL'. +CK7F/>9DSo)l>KgL"8M(D^TUotUrM<>+.rfsTGMQr0edHg49@-pFG?9'p=2irfWbD>1]At-(f +>dF_fLBb&%XaNmPnB7"e7IGNE!3'&1j\o'G+oS6 +qO=i>MB;K,dQK4Z(T<j..%>I=c[OYW#'COm=WTDa8OA) +qLbMtYFXBL`*r2mdIC[P0YdChNG@Old-jh'5C2G*kCbt`cY;*dO1unMW*q^Vn<4PL]AN:BYa1 +P\<%J<-Efc=LkW!!^MfY<,C7H#p?-2f[OH2RocL/`8m#\IO*dG=TEei;h%Y;'!M>MEf(R8f9@7 +=d^P_nomnMmh]A`++2]AtB`E"rDVW[WT1r2Rsi"a^u%)5A!7hf$e?bXD_@9nR/TlG*X3O&:cP% +(9r4)mrrpo.m\(5=-p9c9ofmfV=&ZQch@ADT20s-Jp(:MQ1>'!mstebP(!BGW2\%<;jgRme5 +D\X_%B%]A-BSr"n)CpUEUpZWm_ie$YtX@LlIDZqi/'a3pPGrP"+e]Ap3YTAo#2C-SkhU.6$ZB7 +s&ZBUE;FK65,p8qZC_:q>0`l\*e10RN\c)Jg'TqWFs4ZV'o(dmreEWK;GqM\Oo:1hT4t3IrF +b>jn-X_VR_$:B;"RF;uCreH0J.A19-/VXE,_/odb[i(oE\Y0op'C&M-TM]A2Qh +YIXY_Ts0bQ?Yaa%_)B'U4Nq`9dS!)9"J%@fTfo; +r)I+s/MkjZ>KDfoHm5?9?CI%L!ohVW#[QVKutkMPnP8_%.6+`9,a.$TT@oH]A;.Lf^*;=E>:+ +65QMk6Wd.I]Ai>gClpeEjP`ZGg9:YA4&1&A/RNLFP4LP@`k14Y9)Tlst\)\0'Er;2Fg:pj^[]A*hUe1o-Lh7,-70&7)T/5oP;--R[`]AD"Cf`b1#&6HXSMm2mV.rrXd +oWdK0W?R4ft%O76hlJL'Y5@;cVhtiZZ&ISDA;Hu)*A3_]A@\7]AUW43AIF=t<^N@^!%E=Ya!Sh +NLSX<-8dFX0_V-828+t)Woh@58jEZ6^KM3;$QA13pcuE)`H$IWkIgJBDVbX7<4D6-Ac_W*3j +]AS@&_=UB:&7*?:;W#@V?aE>kD1&=Z-O":q:f(T`eM9cXJeVG<^@$Ykcs3^-D??DY*RnCpY"n +EQaNI<]A!S-=doq'T^de<:o-)I]A=N]A1Q/:MZi+dT>N\^:TP.^5VM)r\VKeT7>Cg+,JQ>\ +970G-p;"C:MDbjenI`p+fa'PCc_,e/5C7iG?,D4r!HEhJl_i`j+H9f1!(gM7MU2*Q3F_iCtMhPTGtJ2GN"`AfK]AAFVftd8jP=X2f$#/upU2cbgXjo +kH5;RgMg?l4--\e=u@:AHo?/#X)PoT8"[R*MrF0j&tV:MgaAM1VDO#mlt)ek>OKu=%o]AuXZb +F=I[f,";U4@Yl./f-0[,Ks"^>)X*]A2d_L!V;Pl*`m,,2JWLEW<*7D*PXJUe(9%ct2(\M_),M +fJ-b*FLC_;*bPWsOgUD2]A^1gC>c$:n0IDTtWQC3ShdC'>DkbXU8S_"3?;e=C=Gk7V;r/%iii +9!QFBZEB2G?[k``)'0k$/0b2dDeSX4(fRLpSldDC"SM:?1$NqU_)-Y+?XXP*V:jEGbqoG:.E +kU$*XhGO)M2eI_Hn,Pd?V8Vq?dqR<)BKWR7ld]A#O"3Z,U"TR-P9Ho%>)rXHQ*[Y6c6b9dJjH +HI/7\SSS!J_n')Ad:?d#_jaje@5<6eRS)K8_1dD32WsRcPFu,mGnepkQK^/A/NorJ[kFDF` +T3l@]AW#Y0W\[O%Tqb7K/"6X4SgFNL&*nlZ.7=?i`fp]Ak&km".lfC!u9*@_#`f:YsH&boN__j +'[o3O;!3fjl?=8DTBFRghMDHgWI1*rGqmVDB3FeQ7M2@1a&aTR_>\UQqOC?'Q\EHIj#lQ:(]AFrgl[]AL7Z1R&Z*l&oe4im]AsXV/i-A\.-Df[q-:"T-d59*;:#r ++'!KUfl!jbGXfBDI;Sn=No8Oi3U\liWnPLOd3!OE\P&'?e`;p]A2C]AnZY=1h'.bX;N?\nPU,H +[s#?CHFhkgVc[(I^tYect[eESo(m?\=\0i]Ae)Wq'klg<,ce2+jTP9?!K/IddfJAo)t@>2tfB +;PqNb`A=e&5?pgIO;Bn6MoJjl*V-< +dhqddls=Gka63Ag4QGD8Eu0j(sX$^cn@\ZPXbN&a_fW,S"tY5`_O".cq9EcSkVgnp'-AVuD[ +qmf#U,D=66'p%q"YZQ"O_;_m``Zu5_,R:@m0b-RGobtp-MM#"bA#'IY0hN40rVA[h- +J)>LhgGngqn)JGX/BA%17iFOelfK,'T\pYHHEm&`p(p!.'B*]AYh\L*8XV68`PoW1/Dfs.3ir +mM;mdMN`kGN8qsQuBLF1F;o0c2)InV9t3l=;<`)mq9hrsEh\r2+e0e,NK`a;-Ge36oNNlkE> +J*qM*M+6RCG%'1gQ/oloQbSNm\p6D=BJ9QoB1$Poe405IN8Bc]AqH']A"@oK;WWR9jqT_l\J>U^Tliqo2)k0Xl3>-<(>Fh?rMgHlUnlOk&FqLRNpMSdee6)<&YH==DN=[% +,jUL%eT$069In,UU:h&UtMA[^;!cLe11HU)AA:&#&]A#c.e`uKO\+mA0b8.LA&8:n)k0`:5G]A +LZlF5M_gd)21$gU2Y=M!NY-F0cLb9VuWW'NpCcX#4I94%pUd^J&`@)Q+&-UY:gOu]AZ'T.h6p\e@HhIn&U`gCfAK#/2d>1QRnlBk2+E#_cacuJ$l"R[)6pORhopqltdR& +d0<9_ESI^>4XrLAE'hC&6XWCKi]Abr[M*W&TVsE47Nte$)Or(,L`1!r?kF5= +68tX4:kXAmJ#uAd_Y=PpVNrJB76`h"?m>.2nn$b49Z@A^.al$#V@^O?+)k2!r@`4HQ0,Uh62 +^uqqF=5;\\=rNdnr^4di([Mm482HNqa)9NK-)Hd5F2J6?Arp*Tj7nr)l6!hHIZCfZTMCLNmn +^u7M>q;Z`D63YN]A5o`HFd7'HLQZ3^#\'=Irdh7.59>Q&.]A*D]A^5BHVOTfCnr:>k=SQOk#&*JB'R:l*L:6!_sB#-)d"aVT)ptm\ +Y=?qE:gE%),jYS7NfEUQZ3m*%.fpdosF/;GP?*$;]AjCecSi^%[ADI,>*,eS([]A,'k`QXG'rX +'rQUoBAMpk6mp4%Q<0s!Y2\G,DpIe><3$6M +L[>3CRMXq-R;JVp%s@9+4iDc^Gm*F+7>95+F&dFO\Z\KGou#Nhpq4k//i`lkQc9A+__OR$Q-:/?aA<-f4pWQF$+U8[2PUbXRc(^P.j'RA`*<>chFkUi(oJSp%h6,T`$F/SpN!60NJ?WugZCHBLtWr^eAbXV +&kcGBbPkK%H"*Re.h>-NH;Gs.cSk!HgSc.m2JTJnf1Sgc[k_-tXSYhntn-Pn&n]A[i@gpt@:2 +_QeZGKdEZo"MP6cfb$Z',F2/5dH45sh)LVmSREQ3%T53)4fg7%2)9NT8R<^Q9D*^+i2>Q +`e:#%-#N#']A0lR<)/n3ArYBFQ)7=hi6AAe^"i6@d*^&*S?5de?O''?fS2F_$bScSFQqb4kPpJ;/V0Sgf#%i8prC:A; +_qfl1eP9#5C$n>\rUqQen_KN'-QTE\Q%h^4Pu_"*Q!X(@/@KTa8/rXR85:eN6H5Fr6MYTP?; +_15?CVMfpe[Z;U4+#SNa=`k(q^^'iliPlBEb.\Z3+,i8f1TEpl,eR;asSMhZO)HOm"0J=pgU3CJ;]A@G1([s5Yb7Nb5[RTNea<-()I[MgbIua\$4,2iErM`1LdbJlX=P% +pZ&SBZK.[-_6JZDIi\Foko0itm,NQ:UZfpq("NKnFCZGqE9@nW49-CL> +J5^YC7&#,Nufo3Jf!\C[rm,&/r8N-JA.tK.e":j5R/mN_ZmSgc*cqheK&lX0l*Y@[j4WKdg+ +qP&APA$A289N2igO5F\;Hgsj26PtJD8\o4;!S8H#TlsMS>Q2O1_),\E@FTc`!F^aIeVY!>7j +>2BZ?JW?Eh*Eq:O)>$Xrpp_-mr"HiZO/5(=/8M+9c6VEm68am6625IrW\%+NsqI_;*=g$DIH +'D`7<8]A%!t#O\'U41L+!29,B>=2"*!*l3T*g:=G&C8`2\L'c'O;83&&`8#8:_PP0\lJKj;(k +eenNJbRt(:<%$'%8!$6"A9g89-4#T\J(/.'OV2523u,hT>\("*48Th4+:f3*(d_;1ON*0GL[k7pP-Q&?MRa +f,[6U1UTu.G:Z=Sgh>O?RBHT*-'4<;`5K\kWF&1m)KS1RQYD]ANq4UL=qPDCc-Z6$gS!:@>A9 +D\Qr7*2ms^E(S0/q-oJldo@Gma+AhoT8ZMDsROu7(m$65;8_hb\]Af.6:f\gEgAZ*-aJ"U)h)/-LOSr*PL=P'm`CN7`(+L#7E'/i#U5(poDs)8`9f)X +S:Kd>SP4&IHnL'YAPa:g[IlG$.*0Hm]A1AiXm0XFgd_1&Q0Vd1+pi+N:;a_"C2YnAg;anV;i3 +_RsCG3VCoUTu@^;e!@"=03R/r)'\?L-4I&Ae[N*E,G3.'Q),%d19r=o^ZtH<+-Q:_t;[.^qB@Hg'=/ +,6ZUF*L-281KU.Pid%e!M"T%Yl\oYp:O)Ge"(bm(KsB(SBQttKGHPHRc$!H8a,j9/Q;ef> +>*hGs5]ArYS>B_>U-ou3-8+j6QPY39eMs`!c]AlJBFN_"sSqTfr/Zl.#YTl2m[!?dU?iIdZ"N\ +g)A>4<^F5gU7@3bYu@fj41IDTg+:rA(=2[7]A$3[Ri=9m-AEnKlbKPTZE4p$5sF!hOSr +rK]A'.@(Fd,N;5ZN@45PYp[o/g)(nO3'2LN#\W+X=K4XN@pNS,',#t+Vn$HQ/!&Y`S9;EmLI: +2,L[[FViJlOp0F+rrc`^!L9Fh;2I]AM/;i&&;J)VK4d%cTXtD%9-u:I?+OleU_Y5.)DEh$4\1Mm]ADT.d/UU'kAhL5u9$ +Q"pkQ(/dgY;oi^H9;rlLn>1oZ`-kQ%SIPI\3-,orH4aoSUc>t)k+#$[e%CVLEN)NA4c=J:[O +h+n;Ue,VuDtV<5X<[`'B98M,Gs]A6N%>O<;&*nAS[/4_sp@PpTTPW>Z?Q&Zg,d9lN&r3gI]ArL1Sj1U#@h?gi2[Ek:Q,*V4ugde!'HdT*)P!AUZ[Hh7!M_8O12YO..F/+5]AELj5 +Jl.*a;ZN0>0N%td>52JKQ1rbJFFIn72Y]A"4?dP1Q7`=3+XDa/]Asr;cB6$r:!LGSFAommoAc:plOUh?)Rl +6S#0ao5YYhO!l`HP@$5u!?T.mX>'h2C51DH2#0]AKA?DQPb +IpFo!+H+mCS-C/<\*72_@%G?2mk>4&_4Ns$FO>glWoGMJr@@+j0Rud^r"IpsshLF8o^*6t%) +P/s4",oF.o9hhUN'@B?MiZ#`Da^<3Zk1#k5t.@(F;eV0bKHHk*d<$t5%h+#@8mN;=2auRIZ* +DiYTF4T0aAP6==Os6Qs#c;'Kd$k#T%c$2.%rM77^%7hW6/QENGhV]Ao8!EF!I?u]AkNP@ZMJ^0 +es5i1.i\hqen7S_.Zb./8d9r3*g9]A'KRHN6Ec!SG!S\##1\SFF..,9deC$Rr3RWg34\TR@'I +>mc7nJ(kJR:J8L3Gs=b;eP:0Rm#8fu,DK>ZAho0/'7f)Ss,<"GQSZ"X_U')'Kg[F/Th+MnII +JN+,+$js).+O5L_a"mq(WnjKRpA7i1kG*Tf&5[qSR*pM9Oh#S_NA$"<-13;_ +U/!h0MOVQ6A.Q?2Drr21-%r:;&(UI% +juZ1?CnOW-C&X(7Z&jC^RWrD,Q%'M"4":fdpb1\4bBse")qna&h7S]A1JagRHu'r!fiWtha&Yb4&[$qMR!I1aCXN)Rd/sT>k.kBTp/0'r$pT_%Ts +rYnnp4bJ*Wo:gp#]A;2grT2.n7SPNX:rtB\Lbr_+"Z5RIJ8YAOJ_gN&Wl+XO!+Dn[nd9bVsB/ +JfXA;l#*SMl:#3oVPZgB8t6":5qhGZF".G9f1,Mb:?*9!.Is'0s*;^$ARkOQfL]Ai%Do*q\Tt +(o79IYht^!3PEE]AeS)B`InF($/9uh:Z-I/UnYaL:j#NB"0uQ.U/M'D)-YmJ$FTiCag;R1)4^ +o-PPK',#t&4n%RZ-d+r::LUOLi:3rI4YU^6"?e)3&H&?st644N[.VV(CN[_7Ms*&rY]AL0opf +=,eWk1YGS +71)ka/&(b(:eldEK[)mk?(rq[8ih>]AD_O;$!:VQrUoggKQC+#%K>1ON_E:1_Tk8 +uQJ)c=,:VRY'Dogp!-Eq@Bq)EE@6oYi,CdFH*nI]A_<))46]A(^!Df5Nn(P6TcB-kVi/J#u#RN +khTCQC64P,k9p:lTgVZq:1T&GJ3QH5n307c1^!r3@===DcX9*1H6ioTC;Nn[mW\?YaZI78j) +t:OHE'_TpQC\S6^.@DBNIUC#>-5:Cd0a_7%fO6e=+H:'pC)4,&]AiN>GsdF1hqpR\aHehdY#9?iG*3"i.rlgMRN9aenuFgAddKnjcK<%DoM\El2hJk26*udI+L(VMbN'Wo5OtHeJn!#eB1AFU\.*,n5sHs +NG$*,91&.BKurY\TS+Vl5LL/uTgX/nd!ZlF/=LKsXj+!LZc6^dTqhkZ<)'_c_[OM`#a +pYN57:\nDeAKG`uXC>`&5^PZEO.B]AdEaEn#[\+eH&=PRaqD&9at8ca7E1=u%r]Ajl*,\[jDI_""hK0:[I.hP +KnVQ0g$UjT^@iOZ.J=DpWa^afkK+_Hk(uke7/*oEBK5p;$aP:fjKiC?Z=P\M=B0cp@=N%\`1r`D>B1uJ?eZhSrGgflifU'rl`]Ap2+)SJFVapo,jf2F+6?$\^8B]AfnH]A1_skh0W?s(!G8(K^rcqU^nC_1h]A +?^s]Am*&DEiYO]APDDhle^*LAKqVSWRBCYo@0fO<>]Adoar)R#ibAg/K9@FXgJTII`1L + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.b!iQf&Dp$8'igJ`=N%9+)F]A\@VntOPk/rGQ++r+1 +[PIT:MODftI-Oh:ZHnNH_0d:PgbZ0M(*%.-b2J@"L*eYQP7$cqgYNrZ#J/E7g9NB0O,d20/S[KTaRLS_rhElcH@9FUMmIL)m]A2W0;hAqTTR(j>qGe +6ADigZH/Fu.?.@Sfb.,^LUh,D*hFEY_OtiV6?a3JKU]ACE>M/M7`2V5n"r]A<_oQS&V+hiiia> +!M`HNM=)be]AOQ"HF*>m*kM_B>3s`%d30PbLBGchK&LlMg,"rk&b>Lq(Bgb]A<39K9Is +l)!\mX,j>[Cu_:q_2)&nc3YgFa[+/5oN@q^.odfeFIp5M'=U>(C7S!_Uj,ff_!&]AIK%a_[8# +nn!Z0VV@D&X7R6*I/C-:d@/=1rrci9YSYE)4+H:R'(7fd&q/BZ82b?$(rhb4E#.aU!E"a`=*_-)P*D/r"?)Y.NA%l<7Y +8_ffe*85016J@ZC5Ob8:BYAq>=T6DUm/]AkEV)>p:C^/+g=!r!bXLjS\KmqMI=Nr7)!CnGYt9J_gRDfM7ZTE,fMHU)SgjQg[+S +VD[*aRJU[UNaGS/'M!-14]AjcNAE@PUb@/I7P*H8R'94<0(HplcHg'j?_UNLLn;,)6HO\Vl(8 +$n'R]Ahc#*T]A.j?IorLG,k_^;/FB`S8BsGefJ#ZQR"dgVN&jG]AV8%^V8VbdAqH8Y:0N)LjIRb +d)f__[hr$=s>SO%"j_@r%O.MN#:5TB^%UN>a0cF/'ldK\<'!8V`Gb:cm;_%c\b=:ORi`o\?M +1Q/Qe+d4'0b&b]A`rmg[FUC03#AUC]Aud'`&:? +[a#c@j,>SYiQ2a2b9Sfs'OT20l=`HB5E3on%"ug!-6Jk*ahJFj-c,laK+)Nh78>j?B,c2C6[ +#D,a3i?i'OHnAcln7SD.>UU%;W_r=V/*N.$^-"513b*koeGY;XG'N:1B&N[3r`;PQKE58U`1 +)k6GjdbTqkFkoHa\MC"d!ltJ'EfaQQs6:pg=M81`k@[]AZA;#Vhpb$"]AC\W;2km?,?rju@EiN +AX%h[O"p[^0@/Y(hbdV(u%]A37MQQ5Yu/,Q72%+7j>VP5l%hEE9^7J?93UK]Ap:=D9'aQ8"mr;X*V1li4!ftOag;aI2l,tMn;+Sk9g%[_8G-OCnd +WbTV0*jNY<`RXrjB,N3cm#>-eo\.3#&Cl9ksX@30:#iL"U^?*SW?'Es%EJ3:cc1U +P^)6L)i:%j/P@Q6p\b4kk"B7,chEGOA6A8)76-fYG?QML[sL;!"cl0]A[R*K*rH,3eVag3Gn*TF_ca."4hjX6"Q53-^gEc)"EF?l2ZZ +r\cQY'PaM.Oq-[?I5N_@Eb7]AI;,-Nk*?h3IPs]AZ,#d^OX-eBgQrJ+QB4n3X2G1_;i'#2)ri!LP88#^8?C\]A"Np@]AOFoY95&n +RDA/CAo8kHIK%m-OAtbcE_1'1JXmT[6Km7%hc/tk/83A=!Cu$f^Q6.]AATXiH +2Jg-gAud&fH@@0,d+'7R)>\2)MAO1&GOacBHts4=d<;X]AlGIRG^(dI8+:+MEj4MkAG#TFu^s +'IF%p.9JNSur,4?Yb7WV/L0%T$'c:A9*\r)qu&VaIo)j4a$IYZ@J*"""Em&edcFe2+!C-5K^ +KJb_E=(sf+-1dLb:!P!<.@s[?[I[17)5j^g]AXJpKN%'Q8Fg+ui:\'j-cn@#1o;sQMAY4*;n8 +s%HBooH8YY/@m<37P,d5BIVi[4!SpW+Ue63)[C[WbL4GR!U49Y]AJFbQQD&'KYmiI6gE!-oV3 +5VTBNe^%P)6!aX&DaA2ta7jiX;O?IL(G9?@Hh\n`Zga1(V_3M%mm>iIlBatC$j5?(@IRX[b-gB"jFb[R +fP.Zj8LNXX;0U??0R,-5mETL:-:A!:(tt(?m=%A.U)O0fS?H&=!)"!h&O^SIH_Dg.f.Sj+C\[Rt]A@i:_>58A!`h_(7,Y6O?%A(ug^N9t]A.,/?*YqqsC0-09RT8#cuN9R+%h$E7#s$P= +'`#XE!2$X-Cf@._q8_3_K+0L!oj`>qS2/iA3Bjlo#P%?3,n)ejh!H(DjTJhUo]Aron-0*:.+# +l-VD&9r!L-55J)%qV7l4XKE)KeC.6D?Tr*gG7D%RE8]A+c_U7+?]ATAB6c2k=1i\=bR5i3N%-T +2fHV5t68W>eD%Ch,h]A8mHeXJh4-5JS>OD4"V/k@R'_=C3KZ.q[%;G5#_c\\)>Pug3M4/!5>D +;\XKDOjlW,B2%GSe\T@>Ue$*Hqt:QuHi6Dn9Y7X?IH'j[sjOktfLBh>qZ0:bWt+-E\XYp7S% +0-d)Sle_k0IHGcq'Wo!>0j7,V[p)`+MOlZOT/bMf)B>bI;&26Uf#:V5Qrn9I2LJjKc$?o:Gc +DUB)mcY[S8YoNN7"+Hm?]Auh5%<=>RM@ZLiA=OsGj>fu2PH]A8hfp4[&Vi^RbV\I,BfKci*cZr +70m<#L'8p*W*ua#gG5kFPa_28lEQZ/f-`^*uWu'A9"UWqCglB63h_g`inWu$JNPr0G]A3In52 +7o1*CtI*J`03Q`g>]ACKg3I9.]Au`4I%+,k!G[t@e4*Co\qPm!YG@.M>o7]AlTI-4Yom%*Zc8PP +Kd**b[6W:2sj.O3D8qZ5*Y$;VlX]A.V?"L%C$,*U=4)g#VZ"?&b.1GB^[1&jQPK:2l\.6lVg< +oT\`0GeS:nm.mVJpiBhLKj0U"B0Hj1mT8pr9i`n@,"j-j0>M +6r3PT;tF8"LLaZq'2ToB/:JW3,(<`GfgGu)dsZB5E_4lA;[Uf!M.sqCTNUg0=>YM +2.F"b_,uTh%9*m"M/2W@MTb8`*J\nk;-rt*UTELFW +b@708MY6BK"9N5KeV4Ui;YdO-]AVk'@S/3EEO^/!Xh1>&uZm(-EC_3l@Ni\?G!;&GPkR^pZ*s +m2\-^J_$>rgX2]At]AHZ>s/RUk?6rLEnW-W'Zg*MD$FTTFh[`6TJ`)n4"4ZBqiY*J9%BpVg4.T +-8G"0kC+]A+A[j$C:ZD"?tn>2X"1ZmDTfF*e<-_c4Lp]Ab7L>-k>2'o8Kro/%T3Q=sM*?KN>-D +I_29Q#+1lR1BT&J<#+fZ3VTn?p1rn<:[^Gu/e53\[,O58DO61_P.EinHGFZ*WK"E2(FL$>*% +'iB&%EQs;(.Hme5A#GXEYhX`OnYk0GhI2;)Y[%I*)TE\Bh?/PNT+k.03&C7VKq==LB^9L:&@ +DZD"+1S&+NZL&I]A/I.)7K0]A@pB94'7Vj,7Z#Q');?IAG%%NqImBn'Y&@GaRifdl +7*Ak=$7Ukh0*=Z0Fpi]AAJN>QuV<#3%25NpZcC"4_;6-u%[ERH]AcMM'GC)<7j(fAnr9#BgV@M +e_=Y\,XsXUChsqm642.i_.AQ,Yh(r$e2'Y0P\q.GFE8TkGY\%a%Z@OcRfZ2D!.X*oTDT%KY4diN2FhqjTOSte;F +?o+>:2AqDR>buL$9O`9pf]AJsjYodQtmPf0`2ugac=3f)->Qdhu\sR9pF_rm#MShM*DGb9F9i +=VX]A$kHHl`tY1ONA!/ +`4ZUGcjJF?kIq#l+$(8CS821ZtM08GQNhVqa"l%NT;s]Aa5X5EoCY8P.b#_Zo"PXQ4Ba0/U8A*):bCrW??;l$m]A=?Y3doF)92uGMW.j +`!mpSe2="+0E:V->3b!cX.q?T(U5M+&T)FBUVToY8c:^GCr60R_2^J?'D4)PQlUYVJ'$4-GZ +4#YU+,G2>+[hVi]Alt?GEq,^:f_kkTgsYL"V=e=hXc$c=?d0pcR=>O_o%FdS6XY9T`OlJC4KX ++o^[pf=ES_;cBj%s5om6@Dh+,:4q.9fHZL3Z%U6C.&T4`M(RdYA':mOS"4o?eK1]Anh"BtMhP +t&0iGLZaN?e7)egjeGgT1Wi#dmI0m=YK#bYp>a*^h#n>FB=$\L?DCdLf0^_Fi8I0,GlJX_Uq +tFM]AXTV.k^9 +-%iP%CgKn0_+iLGl7)XV@51F_;KH+/Vh9R3AQZ@j7iCO[iL00%akn'qC!B'gs4s$]A2Chef!? +-tlI=<5,G[Im[.SZDg/P,$BCW6`>ZEDY%1;\5o-XEV)991i3Gf.2trV(DTXujmbV)*p-$(_@ +H.(sIA"rSp/.PWhXqKkYWd?HjK;7u.mW@QeW)7>DmLQ\lrm>(*[*mE1&]AFV,LMeX>HY'm0Q( +?[UQMn[jNku[%W4.HdsWU0E2F8AJi%4'ugP9ai$ZYqm2>*GYF5:,NIp$G5T",n+(.=^.`aDs +eD>+Y_]ApM[6^@(^Q#7d2.4BtqA/B8CLL.\"rJ;a.0iis&,",?nn@bt-VI[;R@HeYf\F/(167 +h'\G$X1ZTb\TJF-V-=/jNq\[krs"83E_b#DIR.;r>#7i@:gdD$orcfX7?H9_I/OPQ]A_#pqF2>_C5>XhS+'KY-G#DMU_DU4sc/c\\#od[ +l.[TdZk-q=6SU;j5WL+JjVh&2GUiOZ6&3n[k[GI +b^q(I9h`T16:-^7S)5nCB+%8oI!cW#i*5Z&GHjmTQ3VcX`%VUR=^#W:aP.5$ua+S1;Eac(%[ +?Op5$5Mr!0L:>eGtP*[IK&KA3!97f +HAZYJSR;"#H6Z,0UcOm@"in%jr%Ql23)=9gqiI;EdS`"BoX`iFhfp5iL/$UER_j4[[<;kF#Zp?8H.? ++2k[FKe7Id1u:9qF6_F6Ckmi6dtd8BQ-_+Ug\)i;3j.n[$FYdqmeD_4dBYUG:[NWTfYX7$GU +FAW&o"f*L,WpDQE4UAF]Ajt&0VUkT=N4KQ[_I4.1M54]AuNi/lt"%\!.1Va2n:39Gtl>;j]Au$? +?F?q^uFsL"I+iRU3Z,/8.b["5C[$Vh_a8:m+&uDU&uc&GWa#^&:h>Za +q>K;;!6!muq>bf(FU3d]AWhIenQ +Z`t"Mcjm4Yfb(-rM#kY\W+Mc1dIhEbTH/*Rt&kY-3@XF`.4Q@$J-GFi70pqilVj!u-Hdd]At! +*J6i)RR)O(.?]A4RK"IsYbp3mM!dthg[?JIdPl'NFPus:!;rLLfo[gWT5(t2eeZp3c\#OseP* +JS=+CA)7[*?]A1!VSoHa;luT3)+YeVa#kfPJ,o*p&AobleW\0e3m.M;RI(d2Ou>Y:4P#BkNg? +XHemSPO3ST7c2atb`3Y#..t$h#j;a,G7->C2s&K)IS%a?P54fFG1UW[+C`unPgh',I#K3$Kn +Y)/_=hbRhV!UXY,PN'J.IL' +b#-9b/n0q&j-DZ3ClpA;e#'QdalB=npd:MGI]A<@CkANgYfHC/9G)rJR>i-nj5DI^5oX$\_XP +P.OrtUE=()Z)KV*6Q(0G4fatbJl"qJS$eoB745p!f:lD!c?TN)47`HaH+leFV+-\8@N-.+G( +6NLYZMcJ4dIY6ZT2DuIb%m"tUC5-H`lt\`%s?[/#*II4G]AZAsTj6\.7)\t>hC0I`J3IJ_AX, +hi@rFB^A+6/qJn9u)m-H+(rK%F0]A("g/Ls5Z9\5fV!YQdoaHE7[?T(M?leJ?U)GofT[0ZR(o +SFM`;c_t&Am18b5s%9IR1nYqP&nmJ$%3eXZ'2`scaO+fFJ]AKVsBSuD^UkiMpO(b]Ak%K4qnSD3Hq$tZ.QcIW`]A.CESY;Z1&MYs +_8m-j'n[$uO'Su%P59l"R]A$M/D"E(4O:V^j>S<%Nn/$f.^^O+YAbb*KM)aYXP9#o*f]An'%7= +aW?kUU$P5O.AQH-\]AI97=c=9d`kPnWYQJm!9]A)A5qeJ49hkr*?i0OMai,[Bid^JF% ++Gr$!d3LG.ZUdLbFW4Q7Mm7TC6t%83]A"_>pG^Yljoh5ANJ_RCp9DXIL+9\-2tQp8l+]A\5o?+pI(p#5*c?m$fgRn3+/hpX7H`hi[=kE%W= +Id@,iO<4Xm:kaoA?5esQL1t4ir3:pa6SOns*B)S3;pXmY2"Cp"b+k00!JENmtMSrC$\]Aj9*? +=>!;AYl]AeiNO.hLB-`X4YV)72oc.k[,gL,5`7V_dKS(EL_mJeKRKAfUhL/Lt*6']Akg#UAF1Y +/G_<[q['s?LknTSqprRS'"euZ,1#lFgmP0"DPQMb65K'BQX(t?WlQ\N7+p^4/G*Yec*pWuE( +GP"Q`R,BYZh;Jf7SOmH\+LsJcPAQb>hRQ[9@;#S5g&6stb?PreNXE%'iZ>LU%HF"E#iP+"UDj1-0I9\98 +O_hK7p0R5:0PBmP$V-o,OLOW2eZ(@EHbL2?9S(TPhcW]AQY?_etInK$B1k*&Gt&i#al%6!QE< +qf%tPjflbF[D0?s_@[k(nJjPK>0"Bu["VZ^!Z\g!ERV>eHkY +<3-r]Ao!nG"/9o:GUn<@E"'(!gV'D'U.P(7!&4W;Q8 +,Fii-=,LdU\X$H?;$G7e$7U**3Mhp9cS$92#>5qbk:dl8\[K>,1X_t)GL3RHhoP%FW_L?BLD +9rj/-Z"9E4eRJcM:SP^Grs +r8&op-%iYT7/iOoL/bB?:]A%V;\R;oX!D[sdp[c-E7/g`)dt_:IQDN^o9Enf3Y@'Uc5MI%4=N +,Y9*G3a^Q2usK#1VUEKQeu39[&\H3FWO&O?*/emuGO`EX7U!G@F_"hP2ea`"_?f$^$:Q.=`]A +O'b:8#PW&/UYiJ$N(ZKa9p:CJ9OFt7=hhPC,;.C)p"f(O=W^Iq!"B^ce30%2F?bJpG&[HmYd +P)P2fN?kA@1@a`[h#\C/"L"P&E%rr^K7=CA"P"'[KaXuoO9Zo&I>b/ed'0r`[+q+H(9YT@D3%P;jEm*d.+tl7,p3q +p.nF6#:e[FIPpW@0>F3.)ICBs1lHbZ1"q007Mf?AKjo6&7*UI`nfh!&!;:M)LY.krobf9gZ& +jT=&S+]AR3dF4,YK=0:#,>QifJ(aZi5uCMLRkY5^=Ft"P +-VC?B*I@f_E)@?iaA7$/7oMZCf0eG+tq\rm_MrKFKS&her-8rOmJ\cqFTqlRdq5B17ttS,3h +8mC@jGm'[Dj4+FL7%9hPZHHaK^>+`_^RO`Yi$_PPS8]AF9fVC`5/?l0p57V +0,MiQO_h^':$Z5r$/9W6;"Yr]ApZ9I5'PYOW^?n'BKkW"%[(\c&DD]A[E\P#2X4bX;LFq$hP,8 +HLYQ%4jT$)HkTKX\Ar48.=8I]AC:,#&]A[F!ZF09WIAuY0@[!m:49*sa2-=4(%.:7qP0qXr=hVRgN5S*!jSO"%8O$:4OoFmNaoj'b;Vf]A_^fl3O;jgQ9H_O^D>Nj+:tc=4Vs@i#eD9 +B?@$#7od$"D1ZusR_m10W@Z&"BIcS&,\m=1p-\\CA0PuqFmo/593rha/R)Qqd>@C1NT]AsbAh +U5b:ImY(:P!H$[Dh/e8d*B#b?I750-GLnk+2l"sK]A7h-sAtADa.umR-m7Vgsm'#rbl)JX@0a +KFn4euUgT-Eh>mTI0r7t18"R&Pgi8(gGJ32!j0bXeao"OO/Ee:_&-ce7D2;#sW((+fcIX=Dn +c_%t^^#L&K5dj*3HLD=mmhf[?aF0i>8'4'BmqQ2r9WDH^d;$gb_VWmp/9sW>(+l';IJ2RQ&_(Ll*.#;^10g@9Nad<:ZJ +N0n2/bOPjeQ/'8'JE=VGCo)=AU8%X"$<-uNYmYP%)&Vd3a5U>ZpEO;-:`p*AYTCm_U>=G@`L +F4F<@T?0J)S9_ucgP_8_'tH$&/JUa\+VR`D3>tQcjcf/*`V-JZRen(0QB_#YVVYRX'M['?Zh +=SQ+UER7]A:/*;;BpEa_8\o%$k)f.`aXi<)bYP;F[9?1htBLP)L9<(=]A:=(hJM`n-0Pd1ITGT +11/P9)9lk$UQI\`E;W!O+Te(: +Yo6oe1.4BBAKs/M>!!l-j6Kio>mdo'1#(U0=L4%I^4b>J&'nik$[_4W6AArm4kkscf+4C6(c +iU=*><'96J4M\4!WW3_"()B\1$@-)]A[qPg.G2ah=FLT:Q(i%T]A$f_kXDG5TiMcHj&kI+Un=e +Y4H[OjEeBO99^(N*I)9,<,MOgeVp\+=!6T5m[_NhhmoW5ZA3t^F.`u([F/`Hb:/Sokrl$4 +d9O*ANc9UF.Y11IKbkEcK9`$->;RPTP(Xqr:= +LRLaJ;#QhoP4OL#9*#ZsB:LlM<&ic(U]ArCu-:p-HNd5oBBnq*bHUI#R$YpnF`9;7k(/&`"MN +0kYjm<7.q(?5?K1`ihuL:Z944)p`d;"^C^!?L +-GE(iJQk=5s?/eDE(C1NoMPSVM-qcl!JIFI7C_^UsoTGAD*+fCaDAFB1<`0V_H$=6$UZV*C^ +Z"qK$!:EE8T$1)K5;rFc^miA(n*Sm5n)(>unGOI:tD@'>#ZchZ6CZ;9+@tL.'1d$[:PiCA+; +d+GR5m+/ZBb?AZA`Xq.Qgfi86!iAO=3%HaGRS5+p%9:&7e_H%$VKE/>$=5gGZqGUiDQgZfk> +)%;hY)2jNRPN)r[.WVa` +AjD6Jl]A3*^%`2 +QW@K\XT*s4#uZ^%&-AC1SM`*D)CnNVn5Agfig3I$W:OhAf;RVjlDh5$:eBkJ]Al[<)E*V:#T2 +oIJ__s%!\4g1)n_gi`RT^e'J=b#BWPpAWJB#s5]AnAENj<[$!KV4QjpJcJ/3I"Mhp^ObZSR>7 +Dm*M6,Z^ENfDm,lG:0gQEgi<0<9m!)4eQNrLQg!LqCA*JF6WVno=RF\S#\V79'H`7?>ZMoth +bFMMN8i'Q")\>>n[$#p9kf3%-&![]ALg8uPRrH"GVpiQY;=FYU$g2L5Dq#<(q/46V3<]AP`kOh +;C/*5=ih\(pCei#=Z]Au((s9d?,rYTWUM:P\*[ol@rO\b%=Xp"\gPC/g%1)-d(Ltlf/U)^A[p +('1mLGG_<0RnY%o56L$>dMCh:mt_]AKK[['t<5]Al=J$/!&j-4"]AF32=_#>%"KP4RG&#*##:rV +meB9#h-uEg"dfZQ*,WSXh?U#o+E6SX4(j=&MfSo>B&/X8oqJ<?NqOJ +k]A>L[BrO@s$Ni%4a@bbnB!jBCOZ%t'Z,Y*6Ng[;9>K4[_D,FYe@SA4_h6f;B]AlDiesMrn1-d +$ojiQ*SKIXYbr_K>YclOH?7nK?F&moh(cEV;QMe3!c#XPPl8R@gO=gfDi=m+oUE.4>1;*.Ei@%45EJbn?+?*gA#* +GW/:m\Q63B+[,BaGNAdnmgmbAjuUP?ntEJM]Af#G[F7>X/i9H-mVp?AQCM78Lo/F9Xn-ZkE84Bo7D`[_O8+Pnl]AZJUj'mYA&o_fC"d?NQ;SmO<:`]AiLiTJ^-Pl1]A +,'H)0%5?RLr1J(mQs/fr#BQRcPSZ77C3Rb3aZop__W6H)mOs&:$-=5^Ir3__/"X1MTr'.*mk +T^56u=\HHnlO?JUAY7Qrj2pZs=nMH;kuV$ZT?/J:4dpLhWQW"%:Xd8A1?*'Af8&*iIiJjnF% +Pjg"%=_A_Cd^b-Kka"rf2/'1n8VNdf19`63J&?KXkh:9e`'sj`rNh+NuT?l%WRf<[=1S&Pnk +rkDW^]AF^ID'1'#o":uV0`pe9?5),sPl)W><]AR(cNX6p@1)T0/Y1TM,\8B3E)s$oS?M-O4-pH +,%FjFAn6gj(IUpO6/Pq&lsC0D:L-CgaP+[!o@H5ItGaH3ILU"'<#Qo49$3:K$XA7R]AcWdoWG +Td3_hD;^$A:J'*r"^0KcD;V$jq0PXOWY4@IWfc.FnGc\!9.TD:%0P]A)TuN#I'7<,*h->=MnD +6K$MFref6*"o%q.<\FC">a_8&he:0Jgir'S;,6%,W;Jhm)J0]A%=%d*ar&7dE=.h;mkrm2ml/ +Z_hl*3,OX+#XhT@X5'?AnBE,Epf>RUA3tn`TeFhLOSTlA>7(WYS_j%*FRCIL\N;Gj3M.HuFg +3Ppsr@K)k&$N0'cYZ'QS^*V +,2Tdm$X_tf!bYpNV<^WqU1l3o0sZ!"o6VF&MHs1L6pr^'mRQ-a@Cm3_-Bt$8WB7INWiW4fcN +"$Q4\X35Xf1=C/VNBBaQAm>B1k.T&d2$b#*2@aLh@2q)]ALXV&A^3/V0q$<<\0??mc:IjCA\1 +P1R@7%_3SdLT>Dn!%1ZBG*-`]Af&>e>STQU[m1X7(OIU3ra'AO-a'3\kZeJ$^d(4$mf^"XHr6 +,<`uXtP.@4&.\B7^^hX9&(EI@R9:h;Yr;e967[:ubObq1E]AUkbseX\+u7!!?%GP3hio%G +\Z48dkZhOu"N0alMf"G"O/"GVfTKV2RWM=.7%)b1@Amr0sYd<$u`^gDj0H8Jgpebs37,.E[,%/l5$+HCc121r=c=lk#bM +.6!ra/h9'p:-@h@(C:X#P)L'4(),h]A2m3l?nfL-=.!376N]AIWt\,Rj_\So>aqLZ3'L$CW6eB#P"6W'+]A5eS44kb]AchU1iP:IX3ersgf`o0i>_4Daj.9a%&93XO@C( +ilY(&Yij4fBso6fj%eBL4>J?9"0ZS/IY:XEaX.>&G`8O$gUIlUkir*(EW@N/h&$+LFpo&0L> +3ICqK3Y'pbI3P342uA=kFgGAK!rgNtRY_lohTB^"PF,%t%L2QIaETQ%GU81qH'Ec/1=n +([2AS$VpA!0nta4:**LuMY7f@#5;-YdIE5G!OjnV0=QOf.V6k@S^KqstOoC9:E0F +r)W:k"0hI#/hrC)s":+CQD;p.LJkAml8=-tu&kR6lPHWISIcTf4O&$>53$0,pMlc@>^W'?H& +FATe"RkD6^5UrCgY?jW(4<^Dm,YpuDC=tK;NnJVTM>'5?2rfj%PgS_*-!5]AnWi%AF:M8n5@% +d+^aYRelPuEfg\U)!D*g[s$FD%-R8J(BrDD:O%A)>kZ!'WfjBSI38!fmaq'Fg<;L+@Aqe[?^ +a'0&i\1hq&e[Ck&&0-(+r7\Q";ap2/TF_NUg_=3Em4+;_(qb!HMSkQ1`Ap@;A5bi[*V>u_bn!Cg^U +eZLT<2dgOj4RKE/A#`5JkE:HVrf8R(EJs/-fo?/n6PAt=b!"_5(T=fN-+]A2&>W9m?`VL@Sp$ +m]Aa#A'4^]AQdY]AINZmB4GKbGKmSgssX82nitN%Eti$aM(=^LDdKs4_sIn6>"-X^Vu64l!`pCa +I/[FCjJs,QZ#N]AL5MZ#WY[e.$ME&#^VL>^5;XHW&Pa_$?GR"_F;f)7!+[UO'5J4dmEU#3ped +hJ`#g5PK!<;79Z_]AI'['d8'7g"Ha6^r#\8`Oc&6pb%lNA*iUofZ`Vu.,*=X$LP![pa/>)cRY +1>5gNU,j_q?,+EZBo4R0tdis@#M7=J+lj5HVm'RZ/0mY0WCbXn'r"k=`1:1_NrC*KN^LDI&]A +H8(\NnSNr5:gG1cG.)CK)8a/LB^"-o'sGuEVe8aCn*]AgaP3S^mG@dND1Tn_Pgs$UP2RT_=Xb%ER.S_c.qY7<4&PkDgEU4\i,O]A +8l[m4<\Ee!5>C!VZD_E_S\!E\onWr[SXJSUAl`Me4-4U",1c9lT8Hfq<[]AV4InIY/pmGKb8s +%L7%s5@sa\,a4]AVYd`K(@U5G>R!)Ou7=K'fOV?fghZgI;DFQo`A'r2t(?>Ul^-YAV]AR#^C!L +E?%M*+#$SOV,$nr^2H>2k[d+PMk\n>cC's$?1!(o^gfnl?E8ng,u.J!jYs,W;uh(e[&(jDdm +&L'1hEmj1T`'g&7N%(*Y0qRM0QKq?au#-NTB`NWGdc7RGbLN"Ji$@jXdS-Yd#ec]A +-7`WA_CA^0SE!nn^?]A3I/bh\1s-e5lQ4Z`T0GcbY?O(2gY+),B0Q^U1I_ +@Y+<^^5B0Hkh[ZYaij^-2Wp[; +YZ3Kc_hp%275S*JtS>Y`RgcNmVr\J6]A]A^X:2Y<-__pEa,3X6[mW2 +qF2D$'4gEfSLr7--Qo`8fs(=aDKMdnn?NMd6.PAI-*;B#N@j1h6Q/*k)HH4MpQ,W8bBc.UK' +pSX.U7OO9X8I81P0MR'euMbRV'loqqrgaf5o:i*\+Zb.tK-JJT>nNqiDENVi*MNHCf#*"@b" +Kj\)Bmb=U%/;'84>]A.;A@cd9CAEb'45,fRjXcK/W%1I(qoJ&[\^-Ma8C)*6OMZ&@/ +YJQo7ik30,Z+j=0fj==_^_%]AAnE,YuRnk2lOO;n<8m=90I +kP(/IfqO.bEaMr+!m'=c"QTIBN);nVS.Ee:Z8;mD[4a4t`hP*sH>/U$N31MP;0!FN7-fni11 +p>Q)%gSX2"gQ*#o'!3#Q,f%H,hr5R*#TeRX1.ZCQkbJ**1lQjCC9N-RsrO7PISY +4WeqC=&?\J%&%%O37E(5uB,=-Fpf>DXCHUEYDl=mCb`]AJeKRC="jHYMr5t%/p!l%kU3%I +BLmHamoQ2c\RWEWDj*l&E[60<'DONSUqgKXH,#09=9*"d>iM"ob\9"ltoV]ACBgO,VH2E4j(` +$"e.\tmR3+NDOVgg6$A`F)YeaKft_C6Jbbss,k1\dQCMXZq0BsAGP7Xl,*60lZJim:VS,KKT^*e#`kdBXbq&XRkYk*X05$1+iaW5qaL';aXU5G$!, +j8eeN.BrK8frRrWfa(/+0/!J&pCPC*]A+3RN'9@D<:6(["Q@+m89%d'#.rI1a3k.dGDGC%*'m049\36R_R$a0! +dD'i+FDA7I`s3:d@b@3s+>>Hn,fg-*a.$b,-bjWm$.C(F9To[JTj$T[(h!0rBZoQ3c^R!1OO +QjUm^$f:ncSfnhUr267J>gPgE>c1@"6p"Y&e)"Z=B$2TKq@>V +k23G(a43MgoDD:i(6R@F$rqYNVSL-jn9Y]Al,C8Jrm]AhDclU%8lPP2W*KT(UMj.f,[D%QI`tE +p@2`sR_$?KQb"*c!5X5Eo#[Jp/OIh]A;`\lq=.Ia_IAm]AQYB'*jJ7$cSVQm,(#;lsL5\'"q]A:Z8JVLecA+dQSBaYOG"H? +/"c/-o'UU(`MTXu?Q7q\,4H;S"6U:MPMQ5q`p$s,87qAIec/81g]AF>flZFE`r?KrP=+-+Ot:Mj;8]A6;/Ee^GPBDq_(7#^#i/?tuB'D@8/X+)H<]Af?2`5jiTBmQXXm9r!n"[@ +SQ9jH:FP8p7sUK.>iL^f&43G`@l&r*T(4DD7Mk`4+>k@4)qp7P86F.PYh@6 +$\jIa7$F!b9t`U5$8AO>%eI1nd9,<%bg_WipWEq'Wph)Y%Qq+q%(IU:4Oc/.7lF?0Wl`21"# +[8U3CT(610IcWQR]A;]A[O_TGG:cJeu(ME+VE[]Abs5$rVScSI`e9a`(I +l + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +%l;.h#S?;6DU(j3\7O&J#U.,gsEu4P2XSLV_]A7iI^B;+Ir[aeBCQ,k;19%gQ%cc +s^c#pFUI9lj%?]A"3T)qY!7nc>VH4pai+59hhJV&F@jXod'Lcl+u,e<"G`6Q(flee+]Aa8l,,; +0'up7)4!]AG)B6I*KW6+0M]AP>[Po"q4#=Iip)ZEc5MRVgC&7\fU*`j%:ng^OBD&ZF-gSWfr', +>Ttr:6ji-BP0Oo^V[*@-8/0@N[J6n;R[SZ^Ycu+5(SH?* +j"fm#HQ@Xp3#S69La4st&')MN6UO5`PYH[]AO,VrNb9XUm(eQ+D<`0,k&.[1qr?u)M\*?1%W<\%saTg*a!9pT^*DCARRb?Tl7S,8Y=I$?j%RD8[J1rhG7>a6VZ+@.qE7^i,VR.Nd&0i"\#H13r>s(q7P#64oOP8o!eSk4sNg:J/9NTi8itK=Rcu4lVNc3oG@biPjG +RLX^-aN:Mg;0aE>=n$/U>eZX)iAVI_U5Z7,l<%hrK$RbR]A4$-5a>V&g?8O+'0nhniC1J^6:!5]A+#)K@cGnoeTI'#>BMQ`OAlDLf3%Q,6eUp3&XBVVB)ps]Ao(RS>l@u!VE!V<^-S +64,T=5^Od'8'I[*G(/oQP7n0]A1ou;s/#abc>9sOHOg&;/rJ^34!9+S)U;HI3Zen-Om. +SW?Duen9Qbs5`5i&hh/u7u`SCTKY_!5j$EdF`P$/$+lJ;)%LPO\)k&r:sEcSTX/1*Iub%1Hi +LfK"4!#Um[%i@F7B1EEflK/Kp$GKk3#VH%,)r4T6(g8a\!UbC;HP$m&B4m!Ar:[9uLA4+M1G +29uPpqs/hA'$/nM;5>>&k[u/R&mQRIa,Qj@;]A]A5U[$<.)OQS\NN?5[GOBe?a*$Ng`q$Xgn]A=UBflG>6%lMe)f/u&as%:lji`>10Mr!:N(Mm5Sl +CL+V9G7PrCbu/j/SWL;4J1+Q\eQ,q2:Rb3rZ8g)0rOPBtfpp`^J"qBU&PK0Bqhe/hX_ZnOR' +Rm5fh-#t\gS7(aXO96A'B#L=FRZEr^rm(R;0^\^glHHY)lb[f%Q2tA`o%ZX#-7n5s^p4GKnK]A3KSq!-]A;*o*.'XidCiA**^GTE^_A)Q12dq+OFXkjQO +%iXcsZ4S%SLY"]AbGX.dBF2#'uo!T#Xq3dMHHYe9lZKjbZ305r-a,+k;!RZa!3Tf9*TQa#.*6e4l!phreIp`@ +9@K[j/;g?Z@/p;[2Y^@:GSk+YH9:PP(TDXg<-QWR +1gV(UAoT6;KbG8mLG"\gakTrpa.XIcX2n?2oIGX"9/*BX*0n9S@V`JoIB%moqqbAMWl^BnUE +K>TDlA5cfm[$1Sg%iPsE/&]ATop.J:i&GIB@LAH%YTqntUAI2rGQNK]AC(tWlAK!f\#D`IGTln +Wu8)M4,gQVgrk9Qq".OqLC@&kLX"cJ`qFS!^P.%'@%Y<_6cc9d`4qXj)=D2[St);^cZaK>[K +^M2[oH4lI\JDN!lW>\KFAAE;@tOn!;*+V1!Re\E2Iu4l^'@ISWo@<4Z>IWdVQiD)MI3Ub%&t +<_^JeNr:"ZlW'_jXcpB_9eB=E?"n2j(?Vn`@sepe_h_6saQ8gmDp.a +j:4a,CN[C?J^Wp[C)`j*W`G[+`:Vo.k3%W)S>7M]A'K.WNq#&CqeYZM*>JTnl:M$MXu>NaE>6 +V3>klOCo'aKk,%Gg\,nH5>W\_rW(XKe-p@(p5d_NitH%cd\+U)hGmHna@N7M-2dJ8"416jh( +00h$;Y[E +nHhg!Z8>lJN75m"Ydqf,/c4.h8NlC#AD%YKW%m/[+Bg/PtX4sDS'@%I&:*dd*Xqo0WcWgQu9 +!d[pNpqCkR,5ngVqlorpZgVdf%)*9kKn_-j!)F$<1I_,U[r5Y%"s]AYi!^ua8nW0pdpm4;!QV +-mqfVa8L9?cJ[&rL?./^EPqc7eO%'_0RVCT$n<6(.[L)kSSlP6*K!]A +'W>R/Y;aK`IBC)SjW@Z'rg9qRYc+(tZ*qBpm:"4dhYCU.[9`[p9X@5-PHij`msi+qjHRmTjk +q)#*8>#">X,5D.IV)RX+LtbUpYjsVA_Z.(7^e"=D7_B;n]AQS&JW)DP`UtL@-=5;8b*6N=4ru +=[I&]AqReR'\_#\u1!st8KF,*[@N)#menE]AN:Sec9mJo?+goVJES5E-dZh]Ak@,[!^6'jK%qKWTdpqF4GfZCa?%i5]ARS0`#-:ahUcrk_4hs +@ppQ*g3jr=@5OcCSfmY(7o1N$dpQcVqsFHBm1YE16_ED[lT`Po)2b!bW?I*OAN&+/W1-*ZcB +9;UN5-AoEbO_I07t0lZ.%g0[SpFuQ;NI1h['ZcUZ8?7) +Bo\%%Nb,-T>`I-%X)H,F(R(BB1WKBH[%(ql.7"@bPlBJ_Xg):Ya_pL44Y4CqKR[.*,F5o8g> +._oG$C@XG4t-;_C`4A>t7.D0hjB@VQ$poM#)9r)mj#C`4r;C>7l1&jV?'CVlq!B(4B^5%uIF +67b.%a.LX./r%&o>CW/DDWp;o[La8am[_ud[]AS,nrs#9h)S:'9H"g,i@L4V;$nE&2/Vu.*17 +^A,DFW1kKS7m8O?2.$iefM4-Go]AW+DU_snff_r`WhJcnEV[[blpni8YBYC&P)8^)_dAo=o2Vf,j=;8GFAk.+XfN.miUhhUgB1qUCP9%.c]ATR3K@VD(0$F)*=9HIPhaf:mgD9+pt_:)kj:" +n#buM!A0F2a)V($qf(JC[X:]AKbW"#^[^`kF\,KSsa]A\%I=M-'Ylj.mFn=1s>K?aOt0h\ZYYC +gnng7P.^_F&YV;&\SJCr>MojN;L)gb5j9EP)n#5pNZUe-(b>d[q#5TFsRsuYK\L=@O8>]AQ2%3ZVJs_ +XPYs&<$0nc]A@G%4VojK1eFC+W.*(L7QG>GAcrdnZoI8pd*nQK2S1dV:KZL[he0VS#c<%:RPl +uPHaoT#9fJK::*fAVB"!\SC=uABoZ?f+^"*\+_]ApCap*93D0">=AN3,7nci0:J>8(b$b31p0 +2I)n/m5UAc8Qej;SGHcGWo6ha/+U<)WSGHdQIu,.9-pGt6O1&:*hO5K-1E?amFJW7@[ic[^M +>T6;i$31s^Sj-5IDOQ`pX=.K=14g`g(YoOPX$S945 +E@Tj!NZj3GZgg0?#C(K=jA+"nc*=3UD^'KZ[O52+;UKt+c*7t3rMsRV6dS'Pc`qV\7-=9K(` +pBPa3E;=EIij+fPXRGWT]Ac`A7fFa]Aj8PJmPJ@95]Aa[[^.,sL#P-P4g?)3t;8ineSM%]AY\&#< +JWNB\+cp?Q'>3EqpR^`d?U:BEFph9+MkYKYk5RbCpiHU19]Ase5/1.OpcqUsAHa.QC&J&cLrU +WJ^OcXFT4UaJAkhmD8LOH5plHIGht>:ZJMgo8#5QSV>U0]AG"Lg'7 +$I,Z5c6;c@@ea0mEK');V'HYd*fAb7CY+,DG^]AjJO'"bJ1nrT#X>Ps&\*>?Ml/?-P8GBkY=C +3b+?l/b>4+90la-qYnXB.Vo,?`W< +3O`]ALp*_K.-DU*Aon66bdN$bYXl.GRP5f)N+n.`k=psI`A^6#oY>aNF_85@/'=M0X)^,D,T:[NQ`:i't">IS7;+nB9&NdQ#b#JI[;! +&f<,rPa$2S%HKX#Col)U,^(\;A^1/@J-7GJ+65,dLi-VOnt4#Q`Qo'9oV`U0\3F4=M0Fns#t +HX&S@81f!<[8UImqlgl1?T*./:m*=-&B#c/Tbm1?Gi9cMZMK39WQuXu6;NPME#,i!r#7\PGP&1*V,n3$4"6nQa6$4&B +!^h%*AJrMXscc7VJp`hZtC33J.2p2o(PfcJD9*Rin(q,k4(eVa.1Cb>pk]ATBUAg$S`+\T8R1 +(lC'[2P!<:Vcp!a$lZM0Ndcj1Uh\@&DRoicpLoX'=>Lb7[QWQa#^Jo +VgaN0qWiY36bJ_H58kX/F9(."2YI2f,j57?7/LNr\)C_I,jVNK@_hR^L(H=Vfkdao51`2q&Y +i[p;ch(Lb9Zne;Ib:*%p4t.]A(3@_lO'G!oU06=#$2WJ#op'BNmLjZ)&D5HtkcA%a^\/14_4_ +CS6:h=>>]A9+!.YBu9:5:#j9N2*h5g,fU:6:L[nU\"eq`fWNaH2(B\NhD-7ID.iN"qhOC?Ckm +i)n,6t3C1uYb[--;_2S[BNR#F1j9$rB$mauU`T0:(5["XC=Sj91S'*gchMg(eX]AMe=/m*'Q4 +$ke4WC(EE+u1]A2"Q%tkfu^8SI:5Ah>BO[p@1h".8akH1N_AgQR=[pA.=$'k3Zp"%Q6nfS>GS +R"c&C,$5Dr.UpfM%H``cG5h[%TWOQfb'Mipf.3"sfT>F[9W/RB/@MG(_=6kYaFgV$5^Q;KH2 +echm$KL_oQR1c=bhudX,-[+k7$IH:fN*]Ak=Ea>`)c1^\W@!><&h)D5=O653\#0DbiU9\L(I8Xq,u1-piiqBCnMW;H`(99)m%TAR$qb2d6jf]AJ]AYAB2I +m8ABL_ua?lpGr=F]Ag)@7rU2EWYLt2iLa:;5lqRumq9+Z%;9;l6R*-J1o?@8'N`.NRAOH1)^& +M"GM!?6PXN8l'$Z"0I,"n0qs2FT*Gab%=T"bG"OH,j,3]ABC2ZbS0-.\%41D1$8i7;ir)uGk/sL*thH7s6 +IG_=C`74el&6,G&"-e/X(KKhV)DIG!#b;uo%d,lB8B$HN2$5%3Z*ag/kD*C&X$V@ti.`f'Yc +BmP3-,:8'(<3cd'fSh-qI$Zd"WKYWeomGaqu% +\S4X%nGT,'T;VB7m@W[)9q>i/EM-#8d(G97OOMY+Woe3P/.&hiV(%P?n<7(F2rqUg;gl<]A/i<<8ug5F-NV>rG^?J,TJiDbg>aV3+]AWH9 +.sT!X#^*/gTb3)\J8na+2iIHR1tDS*H5Ke'M8cL*dYl>(gM,Uqt^FNGnW\E4Ga]A"@9=AnL`_ +60tOA7X2+t%:d#-*.CMi7/`-FJ#tJ2WGXJrlc1_.L8[BZ@B]Ad-IoN:\&-3rpn>Am%*ETQ#Qc +F1GY+a*`6gUA_*l5B$A!k+Zpshe(Q@B?Cn2"J89A4]AkJb@ObFErtbI7\>3mM&>-/8U#^@NOQ +sc!t<,'u`qIV^ +X2_B5/cZ!MmbK#7W1?Le0CYmHRXBtNHCWbu8lQe8K9k5C"#8n>eqdMlKKumJ]A6kt^/8A)7ou/^2:@dkMa#sJgq::fF5Oe)9UOT[fi/NGmlZ1TQjZFrlk= +FaOhkNJm]AfTMW-=V7?!Y]Aj>HG#u?[L[ai#'(YR,RKl'#qqS7+,#flP\gTHm'h28X)-2hn2I6I=18(UXi.;bWJ:Lp' +$G:jStcRhQm!g:2!tl"V7iH03M$lGm!:-,/P)kp>2oh=[*O=N+HXY]ALAkCG5-hQ2"jqC>Ym% +(=PD`r`=kp"Z&[.:Z%Qj;o:/'P@WuY]AFoTlO@%?)8g:s^WAXBOmPbNdA2(UZLa467@ri8_%+ +'e\;=' +!HN2#B^B0T@beB-O-,#auCDY^-e9sI\lW7aVH4G:&JU2%%=eR$)eGU.65MpId1"2A%A*<%&+NV4H'bos2PUp<9FuO +Yg"2+eP;jESF.Rln-joHdVcus-e&RM:50/,A2q\\>p?VQ7aW +b73QbTWd[a]AeYq\m(g4U:8P6ner,!%<<&*d=A&%2/2*j/@t"`4CLgu:3_%%ULmACFbg=Y,SX +h>u6Db5H?7p/oI7k+VeV(Y;e_00n5?[.9'UR[h+LFnFCM=*DSU`!m>^a;'dhfkcO<I`"[bXa@apPRDNoe'jPjGP\VapXM/CX%6kZ6*1('N9oHW +Hk^"FPVEiga"F16&LYV<0,Fh.'8[GEl4R0!2D(QV9bpO^c)B&enrb'< +D\[RgTA`b.gq>kgpH5cB-i;>eQ0![HeQL10RP.E;,7ruAQJ1#tNPUDj0Kie?(dVDk\TFFXJ. +7#djXdD$-!>L(;bth3/)e10U;rjoL5(G\Uuf)=`&G(55BhEBWH>?EN#fu6mUU]A`gCn+hS"d5 +a^JJs%FYS$iZb:)Jr;")J25F`&3FD?IDia'elID1:2f5`6!RhS)0&@39dUh3J?Mpdh>AT"K? +0t8n0A-CB/eL\LM=?8aHe5*t3[9bXCNKJ+Vod4ulCuT-Y.75@Crh`bP',3Pj>Y$:hCfNB@(% +u==f1O1fkBt*JJ(of0C@`WTpo5s;]A60[Tn^#30:p!=jWZ<4e0b2/F!KNFNTIa=_Wnp]Ag,.!! +>RH[:bE:8uec.2I7oRnkOM=\3rirkQQ2?5?XL%2q:f!%*h2)-\#gl;Ok1=%\o-[*/e8AEBXP +aM?ih0*L%4!6,hX.C`m>GHHoG`kl\!T^FosJ.N#,]A +B4qSjRcO;UdnW)@0hW0UTWSAj";Sb>/%XoWd=CU,,f:Ol\R`+Y-k0[RV`Q\#21g1ID/de5mo +AZO-K.Hak,`n=jIL8f>AQNtH\:F6TA=m')eG!m2f1=ElBN9ugrprE-.JpE\fE$XSGB>.Y[1u +YR=G>Pq5+@@?AAod;e:"m"h4HSqb0dt5gs3P3+#iWu<5WI&\+A`nmL%PZ`jYsDia9r%5e4Gp +\M6XSWl$u[8AP;'On80c@oq0*p:E*7Yd#t2G#!Uc>fb76PI;[ljpCjJ6TJ1qm(sWUoH`+Zpp +@Q7Im-33\l!oimdi0\-FHW8M&'j`eM;bC9AB1)6f1&4Lk8aeH2#uMkX@_9U.+4M +L=Ek@S$0jlPnR+pSUaa+AD#JC`pJE3i)qSTkKF-0]ABaos3PSrXtF$BqX#?\YAcQTBK9qt#r9 +__T8YGqUCi!f.1#KWTqBff+W(0QlqHo!X1=EL'\NOM-]AadQ(Ls@[Np=n4L;:MCMZpre1=-\ +?JGl0KO&b7bK/eO%ECMtco<="Qcd1,!Y@T\BE*8XWX5JTY,7@uLTsAa?u3ro0EB!p,nVP2FN +poe\f9<7RXX5jCUn%]AhTPNd[Z/&HU=\^h&ca_C"P^$Q^%RQTFn%57Z8$io_eu1l-A:`C#7rbgogm!P=s8"d>!/)bWAN@5&(q&Yu1=t[MeX6'$NIK"1gl@tRS;N +RApr%of:0G:/[C5!_PQ"VT]AqH(pXnC5Hoq+/^4g#^-k!:o?0W>G"\q=n'5M(mIH7+.4@c.Y<27 +5&t?7We/X4OLZojrepbI,psCB/#1_?Oel:Np2C#Os?I*E;h6E`%/I-MBL)6j'oXLFM9MHfCO]A"-F67p]ANY +e42UnPl@I=X#.0Tb8@R]A]AE)!HOGluD"6=9_ujf4`]A3%'Zf*hQLIE.Os1tA30eoKNrXl7o:85Vbs,]AtFH +aCj*6+L0Bo*8G>%]Ap+=hMH2M+Q<\.b,PM.$>0&SJ1V@`C7YtD`/JFOX?"/uS[cPAOKt:/^+A +5W?nNKA:sHl`reOc,6,u33$!N*H0l-oX)6Ud^!"NOIcfRfX-l'1K**ufa.!,!SVna`)qq2gM +*j@7rQOUJL-7qCZ"IbGuNfj.`rX_KMYWj"Nf;bi>D>m+IG]A^;22#C>C#o0D]AUjT5j9'a?fj_ +GA;&hGD93m?P\eOEh@?b_`"uJ8IT"(a7BIbh1!I#c!/H$sc<1%q#B"`qRQK +6P``dMsJbkHk8tWF#D7g=4T.Fhmi7##,en5:&]A(2#b-9.7B;H&9cf'*I95fpQ41b8Uo"hfMP +0=]AqM,CYa;[B:((6W4FfXsb+DLR%SpgaDp%R?)?.)PFm&?3NHt/=2SG5iK*!@rj8Agh4QLl(R!a]A]A]AU +%2b%IA4Bcq@=C;oTj[E@>l%n5,A,'8P]ARh^7F'9?mI,ggZ;fm44#Vr'Nn2GcI'=h)DHE]Ad'g +sJ*p+gq;H81EX(74[pTq18\KShJc(7i8R,A&>hk47*7268?H+5*H[ZsQ#o9Ne8e_C#Fn`OQ% +FP:E*);71FaX24>/i[n=ldse=8cqaHrrX[[^lFk[7AO6bl6=`MUV.$..]A9NDJ +DVcg6q8\cO6#a`@WP`huJF:.Due'B$i=,/[0oC,;g^KM`!n/FFf80W?O#Uk1X(ltVU:sP:D9GUH&.dY.QON-EG";Zru=XZ5OG'8&/=X +66!A95M)OK\@kE;X!>VGdfch(tTTs(g8.,:tQuOcb`e:i0]A[*Z1f"-G%4,[YKT084Z-XFD*7 +(jUU/)e6D(8CF?@qabbbpVj7RbET57]A!s8W9/CT%]AEnt>N=ON(V)tWEY3p_qEl"R4.Gi7-sk +C9Jj0IoQ_S\#k8n#bh/cc9e>M&4!47r5u#XSda,d`tI3UEK2qYfEf=\iRk=`NH39TlZ<6==G +PuK3Zlm'JrB_3nXR-!#;?+UY,]A]A_mHS95n2H/>UXG6RF#O[VDl/r[J,X*fCj-XS,9cXXg[o^ +@`-&:M8iZHAa#/lnX!h^[J<^dj'AEiR7iG[Iio0hR:bb=rgl?\PD(j)'5#.BC+iThQKeYL=4 +qNNrF1,[j*+q[gWaOTg#SILbC74)no>5i"(CK+'^P;c'Xo'Y+W1Y;GThq_-`Fc*Lr%UKn).' +kBA2)ULh!t..5,U/io?GeWfP0:0_k(qfB>;`@O?W!I*psTpuG;88.O7D(kD3@O?i*O;Q^:6.oUZI82kj_?9s\r=]A,ffWIs3NQApiNKc`/Hs)Z6eUXLYbU=sg"8g,W':>d3$ZJj#ht@j//F?$a-;A"!^:1;>-DL=c!Mk?6 +EttUEmF7,.KK6RlJk[#ImU@2(ZJY5HFa8N^aquGhmYoc1:&'d8YE.i5Uu5/6eLNK8D&^$e#6 +t4%GKmW2.t=iPDnZag!efC/":YJ">d\gAK02R,meAu:Gic(>I`-0Jg(Nf05qQBeGZ\9-!F/% +b*:J+Q3nS\c3%NY)RGY1WmL8;-OH-9gfI@IL@2sq"#Uck%'T?_ZCe">Yl"*XG>b=F,+a+oUP +rf\NdKJX30pE'aDUq3a53.ZdcUo[le3!L1)I)dKIT5e.f*aT3(qKFBSuX$bB\77.8$U5R'aF +WTsgGLMR>Zt:Nc4SPo]A?h#&k93pdGU<^O5jL6DsHcGi4(jTAE.+IIdujm/O;;o2jhWT?VZ"Q +terFOE#'u`_Q9rK^)0X&2NCV+7E&ghH66hD,DXjUH4W+[ulbpJfl77j/&;<7dLI.4gQjW3;H +(?56%&$LYi!2PHHf'mB]ALg=;n-'X0@,KY8j_1h\D3Ma*SSfc-U3@>^c>D7t41Z]AqV/pB*&F4 +.!i+DmQgF#rlJc\K$aZdjS-K/8bA4K:Z34^?5(e[B4!j0J518PKf?p.B/IKD4=Nb6EIi;ZMm +BXoUfG+1#/pS]A!8B!K7L-k#-G0FjZQA!Vl+&>RhK5IR\`F@E3 +4F,t.8I%9f4"Nst!9?)#ermLf+&Us?IeDI3eaGB6*bCo%^_@>[dDjTcbE^)mV<@RgrA#k[DH +60%+b@6g,bVPc`YZjiW\ouV^HVi[W5YC3S`\ssmA0h.'GAXBX/r75'>8$+WioSqcd]AR,Fq8`aW[424@^4^e0El^?7EJ?uRA+s$k +/l/VZ[1;tBLUP-BdoI\4J)CgA^B$Y_Rtq^20,.WV]AXLqY\Rt+E-_qZV;:DOSJ[V:"#CDf6I: +=-p[gYZ9!i3-*,`[AVq`K8lN''e^cQOC>jhfBoIV^L&'@kAc^u&?&n+F'BSt;NS5:bH#N_]Ar(:\^YOh&Au^HX1'q@$ +1ZQ`j^d,&-ab\_,9JH.?:9oHU#9;O'Q@J?\,g=NOAc-u+80nF09MrO'%aoL]A>^B'rWIELM:hd&L +t1UcCj3^nP4NF?F7lnb#e9m/sT@L?TNA5UC&jF6-2EB*2*agut`W*Bs)R:!s/kb;aHTg?&'olF +g8h=j`"S'O)AmE"t%I3,HY]A9.#\:jr/7*0UrbaObh +,MpW?Eq-_ZfObLq%IHd:[cL+mNbWGAR/g+_k1b-mAt7cl#/51N2I;;#+9/u4rPI`%\[(`*96 +FN'Cj5DM/TXZIE+$Q_Rqg)(!ISVJS@%pIIrTMO73WC-1g\!PDQ*%/p2@CFsMp23)Kb9d^J2F +=eI5\Ai36RO8g05h;NOmD/do?2t>MrS]AdfS$bsi8dRe>WR\E8f/f?Kh@5JOa4HNeA5.ST"W) +IqlS\g4"#2h0qRsVMZ8E]ASd4#a)q5e68VO%ER\g5/*!=t3KT^imo(Y"jbg;>Z=/TVIABP5X&"A,G".%[[)CD)g +8&1XF%5Jn*UAQ?h+2aO9WmQmC.]A%#QLuD@b;T1#;ggHF;hB-8+gn0Wc'fK3.W$D:tZQf2Hn[ +j;170sf>f,51O\HTHfDmK6Bb)BN"2r:imeT9LUO#ato;u8Yj?_tAjf`JAf70*2f.::CVFE<_7-um +-.AOEX@?P-GO3$r%M*G@Nr!/KfFK!&),k4 +U;q?a$WKTL(k%/Gu..Q#5FimW_G,/ZdcIB;M)"sFlZ1Y:&C&s`OE%#!8p7E-P`$6a:T+dd^%OkG4M&2416'!>N/k'k71l3*IH7Cc4GqhA+3\Q"NI4KPB$bjI +iN/O\"C*QOp;`PXJi%aKlb[I[N^`9Q9PN87ue<[<7A&D\jsQ^Y>R$5kG!)1Fg)$]Aj]Ap-#l^k +5LrN,Fa5l9d$"#^UjuQQ]AUt(oof@%m\QT9Lh5QZ//Hm%=.\Qjeo5U`A$$LAI#LYT811MRVKH +7&QH"'D.VIpdoGI,*Q),>OAUmbMpK#Va#>Zo4mu;qc`[jV +9QPML-cA#>c3>jg/)Q$Ofa%BTuKAVh:b[#ibGT]A&n[JL:PqAhL'Bs`Gnm+A5\JYq(0WcHM>; +o57%o71T,AZ!jTo`a!'>2!XiBV`qG3[GH3p82RJf2g_>8L+iNLSsPrVHAaT+*$@?8(?"8c\]A +'LBYh8$oAVrm9LrOI:Ao%MUn338C,fSQUXt#/%"pNZ?4%)3s&RHm5Xm)<\k*AIFs?f]A[4r3> +RUhD?SN@Yu\=J?i983)D",3@@q$)W8PcDEW1paQr'XoIYF82UE-Y(;JWGps]Aj'rV[=CI[%*J +K3)CDG+1H.e9BR8.XjV,(KB!@(;L'5:R2'PlMVCQ3rLofuK1_uA.%T9+bjD\Ect>Sg0HP.;F +`lKaMn7f!5`CQFkD47`tC1TuE'pRfiRp]A)K7.#HnPlt;lXh(o_6L&(Q8I:7>"TYrie]A?,_sC +"g^$=+AC&1@&PY=UL@uQ2FtI+FR(W`%jQE8q4Ya.J6Oh]AY%N^PRi&dOP?+=nEMr2d5lDp,r\ +?eE'SX$b&ajs +$Z=f^rb71,c6)[5DK)'>i09Krm"knfd0g3K[f)=/I:ko76]An[5%'S^:TiNKD=P1X$pKd9XU- +T"M=.1g40['"#hW0h>[:NK +$G%A?`!S=H;%^H<0lt$_qG$G%VSOn>nXN9O?V^AgU0FhCXVa@g$%WA>%8S;3Om?m.eQ.G1lIW3h8MoH.gf9R3%0H^(Mm-5&NVC<#S/[R3%)^7,<*k6`'' +38_7-Rlq.eDO3%()bdEO%'OuQAtDpS4<>TP,Hoc-4nSOjG_0kUDD-hbAa0'%%c(]A6EcOoce9 +E7q@X3FDVt)^?7rKiPBja`S4JJif5J,tVG!CZ&ADcKH_`l3B.:HA$d4rRR@4CPb@$rR7Ud=i-?MCJfX\\^&&mTRmX0% +uB5VT>DsNSpHf(:<=Wo:)%4jm<1&jO.Fg^IRf4QAOT4;XD4>HlPE))P@gGRi*JKo\Q;tlq,A)#U$TL'Tb?6g0b@#r,[%_hp +Y3bcd+jM9RNUYFiN$CY%GaKPuAUDW."?EqIB1D?!4\3(boHp61sm,n@?Fj+>VbW!**N-AgE* +/aBgdfCmadbNtNaZkQq[%3]A46_EPOR_KmFegT:rLXG9;fbFhhd+^WrIq8:*fq7d2L!L@?W.^ +pSs6QrE/U2t$DgW>P^[N^Q]AB:l=@fRpt?FrLg;:+)2mEll$\)JI/utl,p[;,n4^+,?-QVa%U +K)lU!2Xlq"VoM%]A2Mq=:?EnuQJ&Vd\fG,O.eq2dn&uh!]AW:l7L_V@8Ed(>q>V^/VKgIrVC(X=+$V:_U +P#N3+3n$`S360b4'0(R!j=Ub,I"t+fO4HZ^u=s3X2Zl3'4@)4X=o%8p=e-0_Pd):1.ZV(gPY +Ig`38(ihcX=Q@FG&@9)N6FGed"%E;`u_4APc.MY(7#aG-",eTA2Gq!ND-S;\?H^quSUE]AX.0 +UE@0R@'uoWnkC6b("98T=XsmHnS!@0B4a&@Xd>^Kt4E<,XXeZQG$Ao9-G?,1@?2o;.PPT_AI +ealK7lq-!g4YJ#_?UImVK-j@u0Cro`mdaS8WZls$7"Bd3n9OV)!*`?8omN.1nf[_Ts1B5,JN +C"ER]A6!+Tm\H[-qG-gjBiG;2rXn,\`;)0>7NcTJMHTsY/&k*ZPip=;fLQ^;U007kS;gB_VIO +HcWkLuk+P@R#tCtN\Ldnp;_p9m&Z_9K>(e+0f82SNe*-T"fHj1;B>OougDC)r$J_"s\>S+Es +6LuL'2`92R*C4RhVS.-$%es'Pp5F_ErO/MH^f4jpf[i2<0LDBWAhBF9tE +IXR?j9UMBAc2FC(6lTL<)WaIM7_C)RrcnV/51U@b!AVf>]ACnKuFH1:B03UPuN/Xi1beP&jn1 +;8?r9^gd2t3@?B(&X\^GO4YBsG5(%h3`u+(>#L^tCkI9\j;R[E;Qm?BASANA5$O8SR77bPX^ +Ae'7m^(]A)V8;@pEtH%R&448Stdl+5p.Cqm]Am-rk!rV5VDj/+tI#B@.nm4B=:NM*3r!]Am%[5H +^.\f>C2&2C/Zp#e_[t/qn2_h\]A-Ym4*"]A[\Le6$po+>,5cNSoH]A&dG2%'7*(edYIS'o`L^jd2,.i.R]AXjJG,eM(##XN56_lIf15- +-i&>*YHuPcl9SA8a`\/2&1F8I\ok\i/b4q+o'OQBQ=\UqP7oHPnRj[RT&XuTk[SBFm*N1;j? +J&^*UUdUJ6,f(>dO+Pp.JXF7!=&Z-FYd-XiK[)f0?sKXl.qp!5d%6[dG>jH1TQZrqD`kbFK6 +/`@DSiG/(+q^7@Rbgte/X#-g4kP,uQWh6+=dSt.4.'O-QuU;YAWi@(/l36FjD5X-OH\Yc=.\ +a:>6T(8(NSY]An1bGFp2fo/Q6=aEb+Kr,:U2LuBE\0*c*iNR&Ae+O:OQ7[os^]A"'(09ZE:Pka +A@Ba7W@#Pobf%Wt^t/:Yh`lcP!DUU&6,V$$-op>tS.RKLG@%iIl-8,nNKEl$B1 +Aj(EA>LMG5CD]A^EGfaZI.DoW_K"*5`#0+T&pqf5rE5^7S*RR%dIgK_+OGr*c]ABO-N9'bGt'. +%m`7W$i2o)IAeoV&j\U`&8heL1t/F_#5RlU1="N31XuSNCr^e^*Z$!nED%BC@PPB\sgNYmg9 +56f#uNVShb9c]A?;H"##n&+dXc_?_WTH>'nlVg+Uq^Q$us1DAMr:1H?Mk,(/sKp1qBls8J@4]A +sB@2EIZ7(q3nQZD_dH=(:G>7[oo!d;Oj:PM)(V?j@KJak>8>]AVn.@!abc>C,I#)uH/tOtjR`:5^Y*jNMm]AA[;<.+f?\Z/0JGo!Yf&:5`^=%%p92t)9 +e:3;e*-!`jCkO?P>,_?Np#P2*Y\,Y8-!l4hX:Dm0`74M0*LZ,LP;W2;<0t6=VN*gKtFo1sN$ +0MS?h=7t;i2\HPK.ug]A`W+"dd^(HJdU::']A_AmAQLHhtSGKtRVslBU(ZL$mV?]AK(BkUA7]AT/ +Esa*![,c<[C.ruG*j&uNh(I8Mb-D9ueX=$H@:9^R-9Fj7Pl\O2U\e0VgB"2ucsF0]A(D9BV%4 +!J^(69\T;\_AIZW.q/2*cR;bqS&Ug2gU1;45G%_\0"5mVBmkIf&C!G/X[uT0j0e/OX,67>Y# +"s8Otrb]AqN3\,+N<[N%P'RIhb1Iu)p7Qg5DQ\!gI:\iY9+k-h47eKHDN85mP\_skjIJP?MEs +J6Rns+Ugo`:?Sjo1\A`f4gMG(=cIb6a75UGp,-TQUhcAER1@ZY%I!t;8/KZ$71@da,^1;R:M +.?XT7ge#`?f;"<$Y"?&W(Y#sb8GXJ4L;b8A@>*+K!X>$)mf()m`$L_UW]ADbT,A/sdiSGqSka +jTs&%>/rYiBc"<8g9@!ULH-H.lJ279Y"R$H_Bo.+*1Q4,A?n$/TFJ(oL+>PV^]ARQrD7.,&1A +]AZ4b2Rp6gf,,)^/HebWFY]Ajbc3JK\0)>,+)]AV:iO^2$'Nlg=PnH=eo:`0O2aJ?Q@$!c=l=m* +QgN*WeAnR_[f[qSE,8TXJ'fNN,._I@s"p8jfAu_74)Igg$iO2#FK7RBOZ$7d[aketr*@W4,V +5ZX`oO;tDfVXu'sY(kCJ+qhLIuA\+)7lD)\D+8TSi_UMEHe9oJu,,QPG+7je(B8H +Lnmik2@Cb?$Fa'k@\<0#e*IG;j\Q&q)@S4V,0R^89/>;fnU">=!]ATKXN2=8QU1^<-&&iqG)P +F0GWY\4UiC\uL=M;YPKtZYPL/HP#eoLJ!8,[6qL%"6iuP%1NcXK)HWK),F@R,UG4W:/:CN4i +$8Z7E!U)kNR7<0-Ps[>3r[\SHZ8Fr7D?Jb0l;i[-D-Qh4>Hbg%'MG&C=g;g*XQl@#s5)C[i0 +dV_,u^i'VEgBDhh-kthI@`cb.*>qjeH!F4HN:O48k%53"9hgB[j`'f-'O->M(lS +BUL+lA:DQ$]AI#Ag.s6N6@P5_\/CZ8_uOC=eV[IER%G7,PgW)[A@URm;P +H/#Mc2Fk]Ac-rNgDo$g#3D5UHVFM*;aqrXV_eCQmrHZIgF:cP%i(7&lWB^fKkd#]A@=f-3C`dm +0]AWM64>":[NQl3Ni6WC1p:]A+BKjJ./KUdk@flf?P8Yc+aN215BK&7R)Q&; +^b!\GRno\[hL%&hXZsr`X?dNpC2h5IZHtKZK3q^iN[#Z6*!;F$DRUG%ZmN9K4KQ^u0XuCqDg +4`hC"RbTlC:BHPo\8\XE>YorcBOJaWo5C%)SDkKlrX7Lc:J<05XKI]A8BrR!":/#-LU,Idpe2 +i*2dit2X6V*Nl[Ym"A,-9T3,seL1$5WCOb`$ +UEZQ&Sh9;'6@isTHDREW$`ERGr`1:]AA(J3g?7.OGJ`0Q(Fj/Fd1L[]AjUZ +fc51j3,r@8$Q,otRN#A&3@k!=FI4tD*L,K9M'2^WAdI]Ah_,Y*5R]A-<*;j4MY+t8c6&<(F_ag@2HM +h;..'D.&Dedpgk#!/P=CN\UkalZ"9YIO,$4p2._Al_KP00ft#"H%tZBPD8Hkd:#K2NChSQOF +8tbAaKe(Y*Hd4(EFHb-'C2:"]A%H!+,?d?R&9Cp@L#A`c9bdTG^'&bl]AL-Oktkn_!a"q0U^fP +DQUGL)4`+>UqL[L#h',JH+b<[O$QheZ(Tj6>-+scSYVuZ/_`:Ofu]A)2-LG/F80X'XLQ@@h&g +:I`UK(?fdH3bP+%oD;h'a_!rA>B?$eob0he +8R47e1:!lDiAWa?'MAL+I.h>6HkTMb@H(fg:_?amcPG0lsFEPcBCgWF>j*l#6Lc;\#W4=!:Z +BT`NSE67A7O2%6f.3AZ#+XHYh7X^;$bAa$Rr*PcA[1%_j=.!fB,)goQ\=0J/>W;';ih_2W=< +I*PcTUi\@j"5.9aYMX854ORka(X)- +rSgYs3rR]A'0JT4Z6]AX.^U.l\TG?=&7Pc^Qe0cQ198kGJioG5n[h8U3`#0f+hQc3NHEO*m1uPiP0F'7WTq#;cl'q@Q[ +k;-mp3;R1KjP7JDb]Au>bPWH=?S^>&pi]ARu4h:'h?X`*&Nc)_%58g^[@B'MQj'c2oS.-DdM#> +_$#STRZq>-"UI+6jOH;;lSB?#t>/73!2B/S.Rpp>:]A<-_'p(fZjH!nA-,j72$)SP)2#E.G]AY^ +he,H4e+g3KkS>7>o7OK!JZa`0Z>,H]AM$Cm([Mh/9RceM(;)Y+hL[t7cbeI"5]A8sO%#%#*B^+ +fj([78k[:E]A%NM)"H3;,@gh;j%)^=W)V5j0b&Wod!f8]AfDDL1FnZgUUFoa#6fc1V3u*J>O`EG^V=hmiIXWQ*iq$m2;"UYA'[+"-6WEI3"5g)& +5k7bJf^,7`'!DU4!-RlqU?A6+i__m`6r'4U+*o?-c*dNW>*+E0O2b6=;1aaJIo(Pd-.OkWiH/5[j"pYA:;W0e4PUrcahU$3r9I:Pi>fR;>WP#dek +$0`NoJ5&+#h7WWi+\WM^Fl1,!rYdVb$K/poR&3.(7]AkBg?5WF3`A:&%9!V6iRull-d?<6iQC +]AtqdtP5GuqseIWT39!CRm@G$%?Vcg-(G8HE6=Sa8ANYm6dYH$4c8f3jC5%%H"q[V+96&gqC3c^,t&FT0_BeDr-f>u5MUP=Rp[F1'.SfHCIqT%^73-_pbVO.G/K&$e:"AspEI;, +TXFDd5!@>/W?0>sB&+7O:BD')d$;TkB1mhp+0VAD!n!p=GP2mZQR\e?Gh1:jZI2\u9_5taK:[CQVYM&6K/Oh%uF5G2"[Bq +X_q1^8uMm/,ni:+H%TE`$?l=H-`hqHeqU6PXA^L5g:rLr0^%1EI$43prp&)1-Xr=M_33ueQk +2@q^Epmij[Ea@51/>G$#M^R?)_2,Ju[0TnZXCA]AsV/DqX^c!lCY.E^18'-,8jT_mp8,u-`T]A ++/m=u;L0mII#?3Q2s`So5K$;Y9-Y5O><5;$go\2&;bgG$rq6@[d5R=38.@Khr(^j(4Y? +`9USB'Se8lLE+K9I2lIY[`nf(<,/I66@^n9gR#%#CMo`S9>S=Z=d8arhFdj_\<\h*^Q&KXmV +k'imedLn7&,d4kS<6Q[!_K'lqT[0AgJ@!bD;+VtHDk%3g!>TD&CYY!`G,T,q2H^hgCsr1Bk, +,pq+LiPWP7p;fsTBLYZ6ZQDP6%SW_&rF_jROE-?9@bUkYYstV#KUTd:, +8*u")$)j&tH@e8^YXIXI9"tZ!_NQ[+bT2Qt%At?Y#k[m6%?[%",a3j3T\Iq#r.'kG=]A"MB5]A +jPE9B83,qQ)8YdW:Bs);%>I"W7?`#lL4F(>c@sm#e,[R52PuX6C +QaM:J)3buoZ4]AL#0[d1-XZ0K)E5BcKjBQrW/""o.mDT?7X'3o`naUa45F]AoCm1*XK +>PH*jU7J9u"rLG=5]A`pKtbWgqN.YZNWED,%l[E>bc71FC)kq.-[u?O7cCkbYgS[>48cbKu\K +Ul0aseWrBKV/Cbc`Qi:U`pg!IBTRSb,'eO)FWKAlh6.?D;[q,6[g:+i3B7E)LaO.'n=W#G@j +)r-7O-uHXYaUo* +H4Y'"pJkX*i;j.ZZnHL\)ipW-VmM>I)U1O?o5t>eV\q&URk[+=1A'iOW18>'b(Ek(qJT$VXu +b!K4E;h7eY$]AJ.b#"kUMd6=(4ZKlEPa4^l%CE/U*Rs+R*6-:X^"\[671trBjIF^.(QLAd&*3D/!eQJtXIRW#"^4;a-7rK]A1(6qfVVgo0P +EL)`c`L<[D1Zj]A`3MoP+j9XA2-mfT;b;3]AZ,`6m0_+`B-*.q(p?q!M0[/ki9E-%%%?E[,gYM +6ur,Gq7lRo5^'U,Sj5I\j5L/Ud"!GFW4:Oo8m3^#9_iOl>-^:l@2S4q@064UL$WG4DGQ(ia1 +(XoBoeBEWMWR;XXY[nAq\AWKpE9YYKm3;@;D0b/]A8=CBL2aj/r:@$fJ,-6s+c8n +Mk(?f@B#-C*(hi:#"P@,n93h^tooY.*c$&bhuPIAK1jVpV#;ZjFE/Wudt[(3QD^)3=,&HX;- +'e>t`4+Y>3F/brCnAg6^e?qPW"XR%D6)UYSi>Ndq&G@2NeCbn`/^AR>Ba]AW)I*%dj6=b;l5L +9kZ!,+uboBqpkj*,?i']AnCY#lUjjhK,q3&q_'`_;#^"fctZkjb>OWm#t*Y/#9Qf8@b>a&46b +)C@j4Z=8Tj@oodQ?h9`h)?QQQqT.J"fdBu`B`+"oc2"C\%IE".tT4GJO%NiWS +0iph=)66$X:maqa,63;ikU`@Ph^Q]ARm%H:qamG>=*dsr2aND^`6UL_T+PjJ'.?]A64hK8DE:%n +_lWZmP]Af72!n8!@cqW:.fI%BSXV,M2D`=HtY#Qj.9p?YfEU-7:^))*aLHjXQ0esEQRn#"Si?PN;FNiR.bdFYnURS:61?sbX$418D>5s'tRW?!hshXHY]A)`M!;U +5(piZ:5X#ZQ4\StZ +EDA#mL85cHN?TRll7SXBEUrmU67Ao3B5-PmTTXWiqXMXkd>#rYW:`sW1Qk[pc?fq7WlXaPT@ +%\KF51'gKQZXB?2SK:ffRj\m&Ga]A0K0lLqS?_bLF.\c]A9$@Z_*WO]AMK>4D3LX?I=B?XRgJa' +u[MdGC?.m?d>^:>Ho1VlWo851b-WGi\F5gLr`HSLnS#.n`!;UG'bL#JOH9ZIPN#ps9qEns0-OtFXH7MrEYD]A3AoFu=6e^M2(XdAipBas1=@FWOlq/sH +hf6EJ+ROoa!$'?#6uO7dFX$mriQ%KXa09QCd""ZVMF=1LC)LqiM6t;&JiaNUi0f7dJR87hf]A +h%lK\(lLSUqPGF)[M +'Y`G;leTDks6lNSCTssWJrjX13oJgXh0t3S^]A-f-7[AQB,; +YN:2>5R^^XCIO2LBSU`h9XFDL$FL5nSRESNlD!11.>o\)0O31p9#N(n%mV"og5J0n-f68K]A) +6jZXH0,LLul]AB/sQL"H*3%0rD&;T^(nu[^l +B^cf?O?GlX1s7jHcMbBS>S7Ke6k.K9#dmkX9+/[lXj]AAp-B^3_4ac6(AU'abjofLY&Bu%%G_ +C_,k=ok0+Yt#EBF)+CJJ?q;9T(B]A+Im.rN7fmU^4`ujrU1(D?&,pDmupI%mI@n4Vk+aqp[4r +8ai7A;Ar12hXR[[kV%bUe)6RW@PU\:?b$!JW0L#qMBsqOL\^;[(=#(fV[)6G&[C;.q9_0,G^C)S0WcK: +.;+)@tL(dF))YX=iX,-q[%N%V":Uum0AEG;c);M!fV*`!'Z96i@.n./q8`(2&Ot2.djYKN[G +,!c\lNZ\6=2E\UcKrE9*1g'7&%G:A+h:ng:*g3Q9ZC0M!Gk0W?I-69e)!9:s4%#D4`3\[&n]A +m1I0b"YWrF%RFX=$H0E*a3,`eq^%chM)($9p=h([7@g*A0'0p'a-0qpVh' +Lc+KK(lodLJlQt6G>gV;??>^`@N"c=p9'tDC&mR/VA`.2Gf$%OHD''UO3@rB3r&bUogA1f\Z +7u-I47q=%UJpI:"!7j0XmC&kN.5VXahJlT,Z:P)JB4.hGRan5$=('F-,2CC^Qq$?iH*N:5J- +.]AObo%SN[]Ad7gK$HAI'+.S^=V#amH*PelS#[+7l`]AG.,!pkN-R^,auU]AUX?W#..`O.gs<'0F +uGX6UCXG"nL\8A[WGmj@c^teQ<)*4niWl'eU.0EiT2Y&;NCCGDf +L/]A#2q;*!*Cp4Nlf%.>-8@3"?@uI1B`+tfTe\.?4jLo0VSFf"0li^Nsn!7t_25s"1NiSh!9b +)8[l'TXJNY^M6rJ0#oAW^mF?6_l7,+Jcm$8ATbArf%P!J6i>/iXjs_-p8p)=m2.?B?g(dkn8 +`WNuJgB%g;Uegp+%T@aJt`co[]A;&NOX/']A_I,l>+nI%\"B@ZHdZm?^>GLC+(92oUt*RN0>Wm +**M73uiJTI;[Z3^%UF^Wd4D;oB9c8gPEk%[/?g5"6f` +`6jlC^7W181(R-fi(VS*=hbS3`,oa3lZ[')L&Is>^1`g5tM.(gt?^2hL@D.M>!?bgA11<:P6 +4Cel:(*#W*<@mWBNs$?9K!iu]AKStbFJW&0]ANJ-!&&J!qLlsj$bQV58o-J8"a^t62t-0.'lN$ +USJ10#&9]A`G2D&j&=l:3sR9qQ%p6Q[).1Gm6=Tn:P`dbW(Kj]AF^i/#iIj7jJ=mMW'pft#tV? +)@;-8&@7aHP;Ll$uTeS(`'VU-5RE^]AGG,tc/X[:,RkGqQ*p@&-]AH/l2e"Y@4?q;kq>qEafKc +SV3^5i]At'@p%;7k@ngX3&DM)V9]A5622t&6'5AXa"/W7RYjTB3[4=]A6KZ.;d482RGj$oR%hik7u!3E.R2P"S:jKu\o8j[6A'LgS]A=]Aq-ml-&r[aU.Jg=3_cf +_Cc'ePa:tGe!2l9IA4;A-O'?N6Wf!im.KhdZc'ED8LC*ZM. +"DG=1e)F-3r91.!!,YEh)d=bo@l0_X6r_Dh!B8Kfre9k(o7W&dn5;rDSd?V.&/^mjL#O&^3# +(.mMkZI_3b/toq0MX\Ql5C`[Z_nJ*fAQ1hgf:4<'3/Xf>Fg%8HGL8:!HdMc'EHU#C<_d1LRo +9sb9N"&\jRMg5A=prb0bh@s=\F@2D1al*/K<,\K.q3TT_b9!=9\I_b(OoAfr02UhDT#_3#sL +f6to/&)ma\2p-KR3dDK&EG%06^K^pWB>ZPG*eX/'"FrJ1MKMjR7j6c +Gmp'XC>Ll`^0*543,J03\NIE=cn";n;A1\U1"hGG"OZ"W2.Mn[uGoX_8rUIcfBB]A7q/&\./G +D1Co=1O:\6&:NcuSt"(I +o3FqEXf[af(m?Bj+V1_Tb!ahLfpHf!E(hI$LPL;Un]A6hX]A9f-GQIWVOU1t+d@m:.0/EDT>,L +W2g5FS13nI:Uc]ALJ^o.#YD`8jj\gZN%WP+&QuOBkD]APc@kQ/os]A/>LNaC"N]A#AVU:7"git!S +X[An:=+NSEa^4=Q+Y+*I@MN<5TI1UfdE-<&2;Om<`\Glf=:5_18_Mg+@Wg'-S5W1":#k?d79 +e1X8+C4%*C)D7'cZ&pQ#EZ^SJ8`NSMdL+9oR(,d-)FtfYTOrF!Zgq%h-3)f!U/,^M4RjT4Bq +3H]A2b5cFU:621R%1 +`$5US\o7]A6NFgHG6R8`E"2p%g8eO7/FX/V;s()JIP^*0e^?RO5ifn5Pi%1g%ijN_'Z=ChcJBqOKF,r!Bi;mTH#N`Q;c1Z=DbOe*#4*-&,tT> +9dI\T:H>]AbZ:Z>@O-,uHZ.@#3qhG""\IA`2m$!\cln839UJMZPgn3+^"q&f#f0>]A^4^Za0T! +UcFc.ooR=MjXbYBjNRb8&E4+:jJ"51iahpkpT;XY]A+oC'*`@97Xu/I/Ii@&n370;1DCS[NZl +W,,GaW)Qcq/YS%XXf3iPrf]AUZ0mT7cGS\cmD'G +pPl0&u2f@2XcRmHsNeNQgKZUa,pd(4a)qeK3bX^WtX2CN[_'&oj+5m6_,DCJi[k;*IrY +PFhZf=9pPOti"=s]Af!3-P!FaH.VEAc&(Gg"TK>qa(VoW+B(&._3M:15D@rbPn2;?WU;2Ff/\ +m\(8e%fV&D'L:#*/gWHa&IBEU<(6u0gORU_)7/3m?"3`S\N(S81:90*gZU`Q)EVD)1.33T)3(!=f*k@'?u+u/%R"Jk+qO::jU^V]ASa +YsEHTfn2_*%<[k3u3"S`jAI"#nKoqUJshR;7L*"X,NRr<$Y-Zcjp4_Lu8M0UQi7UBU7>Vs_J +fW`E!h+g(dABWr*T;"Pq(JR*ugAc#5SGn%)Ztb,M>S,e3`j;!BD8.Kk80pOASNJTh!W,(JG`t^P8/S +R8Z^Dg\ZPRgW9a-EgY8@dW0tC]A\\DXJCeD.&0l<33bi8YJ6>bKYJ:ZeM,VU8.#A8qD$E@%:` +q7);AJ!5`M7U&om4\::@`0_.;_[Gh]Af[ffqn=_n:^ukq&oTrsX?R>oEn1'(F)^>f:e`2(Rbi +TYD>O,Z70V`tg=fqdF<#kSq/SIEJ36Iq"KgSSqeJr2a.2H>6.RdSeU$(OLolWGpqG0U\7W84 +9I9fd[db?B3&Irm@ip.Ot)0]An0h3XVO:oo1lI<2(5X +ACeJQP(J;l.EO,^hd1V'f//MTDL;1g<<8ih=2-i(O52i;:gjlW\k!at6bDf1t`*YXq^[3b:N +f0bE[hQQ.?EPh@/j&]A-C7/Ps>H,`qj^IOcSGnS#6phSAAEBWm60`>'r'Dp>/9,_E=]A0<*teG +lUpGQsVaOMd:&(2p#>$RMNLjrZd7fNV9MoW+gg.=QZ7i(Q/[4.I^Rd5Ii11)B^b`$1>Z+\5p +-jH/#(jn;9!K0bF6.D5t)lNAInu5$]Adji@p'Rht@T>0eCC&M%^aZ=E\p!`(pp%HpD- +K\;s2_&1ECu-tZ1b9o0E&_Q!pa!COq_ioJpisZ=b^;%W5n-+OS7dWO+e;iQ$4^@HVTcfg^F, +o``n(3:-?57OgFXDfhltBEVkZ2a;IQ,LU]Aob-*]A3MVcP+PkOPl.hY7&_nPtF97L]AFqopD?7g +__]A7KSP=EP\U[7U8Z3\7mF9"G)lR7PYD,^+\1E?FmU'4A`pM76g2*Fop'FNCN]AZ_>oG%VHm; +e[FNWWUIn\R(U)U%\k"WZ%%I"N7K +X"QSX9;%A6s$t\_jh`>F@NH0C!2@)eKCTA5H9DuD6k'`s0\:U`uF0a_Chl8MChl^]AOp;Dnad +7"tqiPgCq$_e0aM76d-*mrQ:<$[a31E_:$g6;h'9'5D%/POtB)[V3)qe9Zf[ua+mS\.j&p60 +I8CO?4;#aZsf4=L6UPf!fYT*5AZZ1HATL8V-D<2m3%lDDVN/joddc'10p:rL`W(R2&5S<:Ou +r;95uIl$[,)[,B"D\u\Aiu94q0AU?!+%H+u;23EMHHf[#[AQ(gDNH$WG'.rT_el$KCO2-`7Z +'H!6_i3'4e2ZQp'>HNO-'U=1?"#N/^e83:Brtq[7:_AF&MRa=P'-Wc0/-LDV"qmPWRumpWj0 +HWBOCfmUr2]A)&'YGl,ci?sr71s5sZ?K=CU:R*dodBT-F/-Cpdd +S6l"M3rPV[NG2O!dHI[9*i:Sn5RYKhBeVH[tdk]A_5s`(KfBF:9AEpOF*ds]A*QWGDUFi1Xa$B +nu^iiX&D985YC!(D$S^ftEjRf./ak)eg:PiS@Yf!QF=JbF6g*EY[YdjQ3%JelMO256HbW86L31\lG6$K7<)1%%ohp\o`.M&*LTaB\ +Iok9Qdd-&?,HcF!3[jPHRRUgK?^?GR@=jih]Al;Naa?3+6MKhT-t8YMb(pufmlbJ\)ti+)$El +3f_=S%0hF=X*P:'-A=UN$jpIr_Wi:aF.nCc='WPcam0d(6qI6iCfn6W`;fd&ci-]Aje%R=*mXG\-2 +mtK<-[&Rc0m^2jb+.a7f5FHo4d)_BBk0MP;:N;kdSpUC'0?)aU +L=:]AF='J857rmr.Rk'!tY9(m@Hc$buq\U9F38/ +>=#WdE+=qBabr&[G"gkCSV`iV9Wt`(27+Fu0.GNYC2^j%QJA@'E#J5;oN1p#I;+_mm*>M#6C +%I`e2ra#%ma7]AdlliCKnX[l_X!MRQM*oj'K@MY:\!%#Y89,rqWJ^Y@ul9H]A3"]Aun;&EMD7]AI +Z$,imHk%_%?[7Z;$% +='d2Nj^UD(3h0MN?70+U$m]A#UiMJBRN:nM/naLXgOBh<.)l'VP=$u6lQ;$Yu5p/5=MXZ53)F +IQkF0CjoPsbc_48RKpeCi,TR4^Q9P00b&Z6lIBqobqdJo+bRg6\#dGnS:*:6*2Z$2t5M.qoB4i]AoA#p_=g!7 +'WcCG>PXT(D2?!<^bk0Q:uVLkKct_17lsrUB%YrEnTeBmQVXa!hi[]AUTCLe+=R[h5VaHA1YE +@I'6Zsq\>KDo"aJF1PJ^ngd\NB2-CZ:%sRq,0Z%4J_C[i`7qWh&ord8^i'n-2(!X'E6BuAWR +7*S&D^3I=Y]Ap]AV*uf*0WY=SA8.*orb +^N)XB2;4E +FK)iHZ;4V=0'WVj.7@"!&[9Pg3'`4&5;>,ep>]APM.VQLpOJ.`71n%qsdTb3o;%8tN4d4MbLi +X\ZkQ$,;,&ZuiWZZ:;V[odA+Y$;FHcEsl?qI2I56^8C4?6uEBKC\Ri9gWJJr)I1'l>*A%?NP +Y_^hgB*]A7pY,g=03=M27N22>Rs=IhB@?o$P/A\?g9#[,Lf2>;Llhq)AE$Z3#ETJkAUT+`!CZ +8dMK!BN^`D69=Wn':oE7o:VV'*Bl4qufTW[FV`%;\%+tp\l>m6FiI'p-):l`@2F?@kod!eM4 +hEqM%BAqhY6$1eLNrcLNfGXfe5b`tH."e_@8=1&$GccH\j"Slq3`8J)J;QB@@a$q&@a$*A+! +RtBqnf/I`Qlg56Qer&QNDdRglAO1eQhVTmD(/-:p&V1m9.hq'Yc?*!FiHi]A;nHXagBDnA+lH +jgrJE;BZ&Ufo87u*Kb83&8leoZ)=d8UuagGXou&dAk7dXrT?iqmoj]A2NhpPu>NE*gGifY1X( +:/f5%tNB%ZG4n5"X%9G`MV0e%DGZV&sCEMc\,_Y:tR#Vi?QsI]A*bN!EbFVMc4(6oJRe!*YZ/ +(1!"GHmWKtDR[.I[96[GU&aW]Af/q7'm`N:r8Vi65B>J5@e:$Cs1\f=s:aMBEb+.fK6X +Uod"LEHA!S/3L'\3%;nlWG2?O1sBih'd4%;*'oaIaq^N`^No*FD8/_bOXYV&'[^spfl!SaXM +=uQLA:Q#/%M2r!aj1APieS0'HK+J`(g1r^<>%jGKIR4#$AF//1(E%]A&:J\PD +i<;\lcE'1"pA&gmCA+lPlk,e*]A,LjJ1fJ^,@:]A-"6MNa\G6j![TDEnYV!M1Kc)Oseo=?Z$I#GS9T48d]AK.E +HK2U9QIpN26'U']AhHV51VXtR:Jiu&MURh>K4UPpP5\j7LN#pIl]Aa@)J;T461ZLl9)4%1;j1< +O?C?gPBlY"J(os4%q3Uf$!Yt0Oj7TUYE=+Z@+%qU]AXh_Poi_!D2L;_+.>PM&(77+L=\;P2(W +5k\hARgI'2o6-_&otO(%>$B:6bP*d]AGeP +g?sq!KW5fmF^MOuoBXP52e!miM7@]AX6Aitj(U`2U[gshXi!N`[WoB( +s3%kMsF[r>IgCfld*afuT9RQuV1"s(ck1MsKdLI?*ME@RV(850K*s]AniSJGK,E#-aFcK`Cbh +;F_q3XkV5#4Jiqn?$d")pQt>YbEr12cm;ToE,:Fpi)_R4if$*,"g95h\[f?nG04,406)5rS&q&G;Q22da:L?>lq=Y]AH)h(q-./uD11u$!O,t]ACm +:oa&W:igqMSH@j9m!O4(PmpGATWNRq*(Z#6#Q$cU.\nelhrHLHcXIX"cF9oT@XfSp +2]Ai339rc*42?ajrrK'Xf[_Cado3`I!=*"W@CjaMi_N0+LE9PjN(X;gHINQG@%hP>2We)A2GE +*8q)rVuXk00NVORAC6$UPA8:F.^'E!tV/-o.jpsE4keMINPI5S(/C]Al)Yo=_O1Vj4c#RE8YCV7USt>Utgku9:Qfs-! +A[:,meX@KEm$7I=eYtYB@g\:#GGM.J6j_&3m.PFs\4rDi\.-YS(u4orCfl$@K,57;=m0*o(a;eU9f6o%2-@aCWSsVH(O,2c_p$@U'h6JIg-QJ\8^_n +&AD$7"]Ak14-N;8^"D#?(Yqq_\ZKQTR\In#EQP3cUn;eg<9`q:/:<\u&C( +&kBXD#M@),n2DT*9hNp$H?M.RoRhV:p(Y_s$W/fB"9f'qSY#GI+hM#c?/UV0&Cre<>ZLTlrn +t9;ru;pqW`FrP'@omu'MgMc!kJlonqRuOIC/2Vfg_ZWIQ7":d[>M(*k_EMq>&Ctl(\ecOE\q +:Vn4?649U;ur),f8Dp9+8NdJ,(hi\*gDa`^o"qq#T2_SB+1RE^Nu[:2Ij +OnCmL4SP(_uKoOlD)\ctNU`\`!TkR:@[W)4Zg-ni=p$1QktKAe+BJhYA:IFUP^2pB@cH^9;< +']AbTE1_/`Oj5`1-o`aJ41KpJ:3f9CPZdFp+&$s_e<+!OpXK65gSGFBPK868Cs)N(D@tN-G.1+q#$c32 +R?8[G9,+nW'HXk7BAMtn3"!`&9gaW-%Wh0S[I>#;H5"h7e1OY*Dd%23qd[H)/Yu@C/c:Us$S +4cLtHORMOnu]A:8.]A_E'u8)N=8:4B[O*$dP4*lAd6I82=]AQUXClbK56]AU*)EbC_#:pi(`D +%HV8%nGQ5c;OUh097E>k9`'G;m':LC1rSLg<%d(,m[4'*1&Z-8XjmUW:'MDge")DHHEX)CngtncA_FDfCUNEtg)h%/p;j"p2#J#))Bm0N^Ht0 +5&n)0(n!j$]AL,p';4)k=F?lO9]A;hl(i*`hAog)WI$+m<7KIo;6.n*dm6NWDd#m,^g@VuXPc1 +=!-N&:4f1aa<\o_@"Fr0qR$\3l%C +(kB/6*-UpUj"Tl'SQqhh.]A`fW"G2Wpj[qO\!;C*U]A0D+ino?Zad$T5P3WCi"p\`WS4q2h'.r +c5XS+4!&B9hI.E-HAM[C+tlnN7+/Jt+]A&I#N"0bHgdY0@6]A8qM_N4sN0A:15'/eUTg\*RQQR +26ep"YkH#EC^>1BArmYhIK0i/026'-)TPE!m>7!a#?deE+Q[c[-hL!OncLZ +LVkP[U=gtVmO3AkGD+&XqU&=%+\Wro4UFso+0%d^ZX0\\6h_$RW_H,sH4\21i8TajXF/M1Za +7>)=,,cLGqFlQ:*m9CA.5=ZZ4agB0[DR3V<0;qI*9i;B`307dLLX2s*:IT\oP!r,m7E_kdM: +fK(KF^#2]AJ7n%+tMLP(7Ao3,L&3#\g(tC;g#=kGu(HB9q';'Xh;_:cp]AKEL`E_%VI):[D#.; +)2e"VcXGI6`b]ASj4-Ra#*PtQ2O@^.@RI6a#`C(g.e`hSEDipgS&c$fCUSD']A%(D6'oL7'[EH +P[Z%HVMXN4.1,LV82ci&7CdHcY:"!U%9GoI]ApKpp#ZlGL9d1*P&$;Vl\VJ,e$YNKB)DELP<`7d&Z0aI^b>rL#^e`TSC%*mkd>V +/Ie`6mupbNa%pA=M"E@;JF.OI_N#BVm%';k:2Vh;"`W=&"70j3>E< +fUG/k;?Q_u6HfG0NY+-ED(83)WAjE>ukEZBU6#d([4XA[oefZr:2C-ki-M +Da;fJq9p,Z(IP)N^OO!<6+nKLG[3$UPiI>7-G:Emf&$^4h7WRDh63M2_''?HZGt(ur!k/eoP +[O6jALjhJf^:^a_HW.f@o6dSWN1^>tVC5%NCo?*6gIkieu@keWC,07P,PYV5L_qEQS@%F#!% +*-ktqN>uEW.16C=/4W$>^bse_C']A6f,oFs&OPhCdeS0F\ol">,V7F+adT +>b+/DVRG45NdfEau/)TZG?.B=+1A#ht`VX=o\G>=YcM2-pl+j-b_rXYmM&&O92K^XEM@I7j44b3>Y +XjKN2 +Lug1Pf(?GuVR3`,g$X\/8b^X)5".L1O)?sXb26?gDHM#AZ$mS7= +(Q5#T;CdsRUj$tOWo*S5^atT]AU-.u^0Y3=b'H"kDnMMeE"[K3:7BGg'B`[889A?3&`ntR+4" +q%p!!>E569!Wu3EH$EYUiM3Zg"(fP8hp('?UF+8=GFF9?os"6SC(nW7aeiZ\Cr:!_t=Um(2f +\ORQD0;/1)3=Cp0.4M(l'#@=.K!P5Z]A,1V/oL-.ciU&9t='cU4B/s)q`UmIBP=5t;OId2hYU +U<.7j0qkA:HWFHap5e!'fW%PO$E_8g#9e$-mp_36.VGTO_/hHcf6$MN>4'T#I;nD.Wc=pS$h +:mB\"t1%a+g`6A*hoPAb91nIDqX:S.s)Z+$\CHrSp:&M-I\,?-E3(^E&qY$-1[*nCkG]Ac7`_ +rX(a(FpZ9"nQ73St[90LtU.!>JCCo%7]Ah?j^AW)Ndi-@,K:1bMqqqd#@C8?+=PL6dV*d^S?X +AsK7-0Z)gW'Y;L<]AAd94;ie2IgNgLVruckXi;HLK)+(*M$!rHL-a\)pQDGF?\Xd?f6.g')]AVVUn_Y +o>ciMisX2rB7%"7(Tr,J9*c=b'g=@)X;-b0b`GpkX'9W0/c#oKrp%HsPCShR_:"'aaRh`Vis +&Cb;Ds`rI0*I&LWts%c9o[5W`#Z/lfCbJRl`08@&h+?8N]A8#'^Xe=Q\$t5>rt'@WfXA#l4`B +&nY[H6Ha\'bJ1Oo&]A0iHe""VRs5-Z-dfB*n!JQpoM7>W+-0&u[4%>7T +]Ar,'`Oa'h75=8=Y4F +>s+s*9emMqSaMZ(?KXZGC8,Xi=1>=Y9D!7H/FGpVltEjKafdLUV;p>(nI++;F!Ke$n^jZFKN +ZE,Tt)jg0(3QQ$%Q!_]AR5J+E]AJ)#B"mGo-aB%o"D!h2e*Rac@e"j&RE\bu9`2T24%<%n3h*> +06,i_U9L_4&E37l4+/9:2rN!?=0j7WT$0EpfLs-2XMRFL/YtCERrh5(MOpTZU82bW_p#(qUV +3Cj5)hHPX<(q0K1'h[8sApp7I>V:[O1Lm6Mo]AocH;bhknQ?+_]A]A$mX'lM_W!s7OA'H5*c&PQ +&?%-?=mWI2JeH7bU`CXSUkuUb(HZL:nF8Co&(h'BAY.F>t4gb5#`4NCo>EdH*hmGY05eC;Ke +MN'\o5a#ER2/]AfTI.1q+dR9kV/N'o5%1hN9@99OI&G#D)=P]Afo\$jC'cVImq@%RgQ1tG&m>d +nVf&lXUU7DbS*Q8?RUtRCI=*Jo/+UeAq_YnkSp)q5`AKrMD'cpu"N(lSnpmAL[^H5qhA]AiiuNoDe61,`'I*K&3j]AEDQicJOuIHS*t4!cVI> +4kJtT^#(HJ6d65cKI!V#EfVPrPrY!iO>;'!-pZ,(R)l0"u(L;DRNQJfp^R6G[Q/g"t6EBDf/ +Y,$[?V5!,4>EaN&s`n!Im7!.`)[=Tf,RbgXaTuV]AKs2>,`3'(lqK^T%T3WV"6-'Jd^<^-1YD +1MQ8h'Q34&?(8k:`9_Q>s@a1/!Il/]A_\b[KZH\B("PoPuJ>dq%TLfKjkIbBN'dX!j&.Fap]Af +r$b_QRcs`ReMtVt9\>3a%tK4>\f1$:W2F<=E4qi<^h8no^Y;?i/YlV#qaRe=(cWe/=-#7r0^ +1;0IHG4DAj*+/o+#7IW&-^PHSZV+W@j'm\!Jb;!JPho4BZ*t8"#/Q?m"1!KE%(Ken6_fd*cB +?9*LN-iCtE!?9Fk]A&_8^8jLru^>lP;L$f0?>(cZA'Mu8KuY?(@S.doT'eL\ +DWTQBA!]AT0^EQp:tjLkAtWcqY6s`#Utj\5';=LSik/4<>%sDXT2c6+^Y]A\f%du:'?PKKndB7 +U'6fQH=LkJ1LU0(i/0BO?I6_2`cgSLpDVe/6+[n=)-N&9otIM6pEdth%MG\5#1XNP_"05g&4 +kVT'bJ$SdN_Jua-=o?S&:J*(VDW8N#]A?aDX"_HS^/%=Of`o)eOY[b^(XI/CO48+kBkN/"]A?V +QELE3rM5^,+`F]Ag)WhP%E1SS6FEF1MkK[8eX8WA[JFM')BV^[7',l:1OWt<7sdU +(-Sr20c'-c+b"Ab$)]AF$MV:7PZ8[g<^fl+[Qhl('6T:k*[rJhDG8,UXoMpUl)P#MYu5,^P(J +aTnI/cOu'Kt^$iU[=]A@Bo*1/J+bi@FaMst@@4'VQ9]A +3Gh:J^SF6jHL&A/_1$qLM"Q,"S<_==crmbZeeYsL5N7+.7.nm%npm0ar_ER^HI>dVXI`9-nP +8N.5+o:'6%;N^O:f!9*E7DW&4BLFVGT!;5&GBWVW`-AB1O.hTtM1`^pdWha^oYP5r1;M3bbB@6T6VXnl8O7B56k6.klANF:.A2s5Y?>c6HWn(b@LRq +-r*?8itIJSbh%nOiG-\YMOmk_qp;iW^m@g9jY"8_rF-c)FYkcm2 +\]AG+g#5X^q/UAT,>\gSEFSk/IMNMAP8GfW,U23dPRfL5[0#2_W;`*O2C4. +[ci`gKnLX?%hhDS&*OFg&3V]A^^5"98T8ZW$eDfHU@#i9+&-AfgV!g3Z(XG)90m:D"J58FONY +FDil)_s[9tr;#s&o'>i9EO*2\KIjeSo%)0V% +^TWU@GATT3]A%/Cbu`r?;;Jo^6;'j/dsD"-bY'FRb'HZI[q8WRQ77lU1De_jq.>8cn]Ac`^?!_ +,TCS(ud9/:C-Z_)h/Ku;Ep^M4hWm8FsAP28-DG+ +T-p?Bb06CdN\gTOVa75X[qJnT;Gm^b*W-A!d4SdA=4^>>82umT9]Ab\O9B?C@i+*0s\ppNJ5Y +@X2s*3cfmVsQ4YA=G&PF@`k4fQ1eVp!U+&,F[l4a4Yj4H1ZAGU(V(@H$mTR(H!I(Yq73!6Ap'"% +lX`0qe7Juq[Ofn>s1fZ)Bfk?2&N:t'YoGKq7F8r9W&=:%@?.\G4DN(63a^l64*Dn>=2ah(crYRp,R3%Nq=jN/hXU +/%(%u53D=G:Ah/&Bo*lP)[>d3DrLSIJ$lKCA>I;oT7)MQ/[Gg@?ca^jFKhB&('fraW`]AJ"WM +`akn(-X25:YE"FKR3B&'Jqn)gr;_UXGrk^F8I;3O0CTj$If*Gh'FSi+"3qYP!YT4oK&N,$CE +D0gr``?;[7F_9\E5f +VgQnQQgEi=Zat2qBY\Ympc,"Q".Bh9&c"ke1i?L88-Di*>7;)c;d$p9\2Gpo=/#ji=CCbB>_t\fE=Nk@I_Kl->30F' +,k>j4N@$lh!R>Xb!4:20fKPH\@Ucb#P5/S1t$84Gprtm._PM)`Z3t'bCQYZ10PDl?sHK(rZ, +<,PJ=7&(&C2.BqKPZ-hR0a8*%rc71f@K% ++_DiOYr4Zt\?p.l>O86lPmfLn5XE\OS`%A]A2kP-BP%>8Z7ZSuN;JH=h,GY;!oV]Aj*O@d_1dj +mi2i@-#tSW.0J%\tLa1-=F-9Ri5e5R#u&-L6MaP([`/C]A]A+P_0&hYIkn,9-(r]A[Tj4H:f..!n+5eHlWfHpu@7h$PEV6uUoV` +a*i_?XQ@,SGYm1h53a`ip?gDTLmXdkXV'6IoT>qPf3(TW]Ag:2b$.gm$+Z-kpBV_7MH\%0PYF +,Shth-@_?9[&5Y)V+p"%WHtr3H>IBE_$_A/&VF&W/Ql(oT;JSTJ.LqR11r0'%:tnKQ2^:&A4 +`KV(LM57q`L!*'%O/#FRCa;,1j>t'h.6;4@6!`c's>0Z=n^l0dF!#^[7mS,Q>EfOtLY`VqEo +.5Y.$.3K'pD.&Ce2&(A8RJ4m]A!%T[f)75BV!1cMA7CU1&sgU/*lC5m\.[nX7f/^`6+a<5u'R +?\L-:f,WKro#^1ce&arVc[_@\Y"bP)oX:I6]A*CPCfj2.AYR/7fDBWTAI$NZb*+iFl3VrL, +,Kk2d&\GQnKHNJs6*V&9>Dh^!('<-[8T$ndpG#X!si(t%1M"O[(ai)f9nFh^qV +N)584W!(>Q8Xk"o(f?`&Uh\NFCD$5?[k"oN%J!$^mUnd!8Y:s&`ak'F\gKN$^]A!d+'.iSeMs +=++!)HfZ++cn^3qrn\&5 +A@7-Q,5ClVT(T/SgKBqt&Iq2/gYFr1d+4.kC2.qjW5edZRRK*]AN"5@f+V>t!6!fP+MkpLHf> +SFK1+$qH$R]Ae4hL;kp.bN*_IqNX8&fB*]Al201:Z^lmWYFfF1@/c):8#X$:o[*K.%G0-Hft:SW%WOl;.i3#%3+FHXk9E%; +LL4]AD]AK-X">WB<7o2+3WiLaieAoFh:4AQg=A!\UcTH_qd[,\5]A0m!V4XoI3]A3Di$\-j_"P88 +^VN?jR:lHWiW3MM5;XSKj2*so:rbCEm +WO)[gQ]AQIsttR+&?ANA(C"VG.7"KX?Z)a#SfM%1T+ptUD(MT=p)m8.2Q,Rl-Ts\E@ULjj:[hT"Z:)BQtSDoH/ji/"88R7Kh+/!]AP=1pP?7oKh +sAo94p@*0Te+89M7W=^c2<>N>#Di2[*tj_nt`gu[C%k-;$9ts9Mg&9;,j +=PHX35%fnu!cV^b9-S&=;2AUs/#j$sMtA#]Au:K61h-DqP*(4tT(@bp#)o`np%Ei=S-05u*cf +A&eFH34k.if>GI:=%T=UT=1%-30X3`j]AK$6Nj/Z`;o"CO.$RP':'c4H$bSUo5[;Y4WQL+)-t +m:-$BMbc>4pF=G3uF'hZWe.8Q9l2YMMqXSJ1m2W0R^m#0PY0p*,?*Lhn1`=N@sOn/RJgjQ##kj3'+=pTp; +5V[<"F1.flMm@TCLG.1`s]Afp#4c]A51hPjaS#>%c0C-:?&%6aG\#$4K@Rl[.Ajm;BH?F +^N]A'QV\Y:U/Zc,.oZ)pd1E6Vsj!=(pJMCDr([5NhUs^R.e%%Afb:s2,9^Vp%cd!o[a1npY7" +^cOJ&fV]A(]A[j492^T*sU*?VYffmnX'+nuE)PMFHs*iW)"Y<]AA/O.!_i[f`AC)2[P3:/moop!+u7/I +-eYGA]ASCaVX&ZmS1)]AG."'-0.6>0g]AS#DJ5`VU&`I%c7Rh!b`X1"ThN7&fOEJG\?E,A:9?N? +1\0Vn2]AI,%B`ZnOi=<1%.R0I9dB^0(k(n?`"%A1\4HjT9i8![%57s'>8`t/2hArQAU".sdiXl=[+6UR30rEM8;sRLZQ[uWqQf! +6U^)XE;=8A>+Ce4eJQs7mri]A#ddP9ED1:f]A\[ZhQEU:\]AX41QZ]At/@S$lQ;6i2`Pf\k)]AdMS +md2#?DgAO+8[_b8k[<<;[kk+C2;d(i4@7t]AGeqBlFR8j@SHY7rdY;R[b_pEL4B@ITR9Zdf5e +K6]A@\TTG=]A>\+ntkKe%]Au\nXlY!K\rcP0KTXcDqEWF"IOJ1KA)u;V8phcs,4HFd=+o3QI>bb +rc8[3n3;)@%=H4<80R_9P*;BS2.#'1*GNAA(NH[D(jjOVNF_04ZM9ppDnuSGVgTp-Ji]A/HA[ +3k^4N`fg*$Y4?nf41K33%BWQdWga%BIr*Q:$dDL;*h-r>0J3eRLd5Amo\r#jIFr=WZfJEMug +SK\Y<9liJ-,TNtkqiQ[n`nD$;$]A1=$W5f\dEmnY5C6Lt1o0(C)#BXh23WB]AeL/eu36b3ZJ3( +i=`TrcKDZo7?]A?]A1U6db;#e!M;??AaK<1;W[ulDT=.5=8&(^iEOpKmF56$a+3E%Bg!Mh<=@kD6T0,i +,LAm:IE0U1([R]At=8:Y`;%RlBBo;S^g%*G(]Ami2J2.",fgjK!-Au^_`^M5)K5CNu_fg,R5cP`fV^Mn +4bM4PD*G^d=C.Gr]A8hI"@?gB;q,m_;GY,Gna*Hc>Z!G,E#B5=TaR%tLg'"RF;$*uii4!(:n*42MQ?@s#qkiKLODE#!V_D%^_0AgBB_Ai\9/)aPH.E3 +0gcZDgQ8,p#g+fspUA24RYVt]A4D+!9kpR68;ATBgc*b7o*iVC?@:F=7%nC9*.jNq;tLr?^p* +oYEHCS>'5l^cX3j4g\-?J4I2jhn12K*Mn\3?Em5F.Mf"(%,s9u@drN@4SfC!K.Hi$3mE +Zh0+!g6!l@INa +>as**nFBPYlOd2A%U)W(RS(e/pc0$=/!.bed,R9/15cpB.jU*UH(plH%b%l`OK"8gHFTCXFZ +@SA.CJTK^%-NrHF2-"gL3`Q$K"i_.>1+>*$6fHn[9YTgn7_9(al^OFo(7 +9NE4Q)k-\LZ/AZ'Ad:c>kX&^t0,4Vh/MZ6j!9&f)Q)pI6N'Q`Ng&O!eWg'9eu\:RA)c'FNus\DUT^Y$l7=AL3G6X +E@Js]Agm%b(XDm`7/Kjkupq&_>SG#g7QjQ\M$SZ.p9fH,P-]AL%S9R,C?M6!OCj5k> +RYh[G.\'7^")8ed+Sb7VF_WNA;6`Q#nuj?ghMO5jlqup0eJFc#&.gdQ2OoVTbA2W?N,DSHjR +!E0K.]AsFTQ8W]AZ;*YS,]Ao&/sl]AtELD#Z;Qo+AqPAt)Y9&Q!8n%0>V-\@n)[S,eO +'dA"H' +7S1l!A0)HJo'kQ10h1:-.=ggu5HbSUpal:&X"L(gVI7DNhT+[_//[NqJ>O&pfOoX@/4Va#Xb +ha58=l\#jh?kGrd`72.D\)`qFn0+(ZF?UbPc'u`8WOo@@8A@EM]A+gQi#F]A*Zr6MmT/=m>L6n +%W7s[4W#MmrnNl$>OI4+uNaW'?D4"I;pfWGAOdDiF"Q'jja`pb6!\Cg"T.Y#6#i*jXkMJ:[D +oDD2&)ecq\VGa>-hCpb\4ln!D!?lGuG.R7=$kM#9^-?i]A!E<:hYRCjG9)3WEUjA":^%!T5,f +S_rC7()LH_>^ni&+G.0`!85J@3t<&Bq*oSNAY#rACW62IDppnn4p8>ek5@%]AgP*^\]AAS#b;B +%LiHGOLYN+7942fu^mJmk[p:RWn-ah=lj&445dH4]A>,H>V/oOEX,q+liQrT0KLN80Qlh:E5[ +@hd'ZE[;nSt;k:1J%7ILQO&_3KQnC;A6r%dn'2X;,NQ!An*"g?m6&p>pb@+#`tI;QSc!>Cg< +8'O]A:F;1.f%QO5JJ^\K9k-^R2J@!Mk_DrD!E/Ts<2R\\f[cDM3PD=-'j`,t+7OEB[-7Db6L8 +eJ(_3!?ju3'YOW4X-d1)j+i"n/SW!Fc*AcBg6O$iq.Pm=%pX3U!7Flj8abWl4^.YD*?2.[!C +X`,r$LIs&JC7i&GDS'R?",[K9g1/6>T`M4`iBLg8X\eB6ssFOq?Z-LpPr"iUH,scb_dso'3@ +n*F*kUk=io#cAUl2*j'`ih0Ilqs+,T87qo]AcXjrdH)e +*4KC"iGk2rDNW%f3s4RMS#ST;8@g:lIts9c+1?b'_?,p?(V.g`G-jG +GrU5/;5V`Yu?N*?pFhpi'[Q*J`<O+cc-"09RP4:.a:f7)]A]A\/@pFs`KZ +]A60Ef*fq9?9YUD0NOI$SI$o$S,6+%giPK5ueqjZnEJT"!1809sXk.5``M;c'\WRIEob+\%[( +6u1bdB`N6A"_;;n1nHrf)fYkMPrg+_QS.L+9DiirKS*-X!.6XI*I[urQOR4EUFtBj<(df%I. +YAW!!1_&668fS2UqrT*XWHM@eU]AiViIBo?p*KS68<\/$H3DQDr(jWfK?#8]As:gtbur9eO"k5 +H!'QII1Y=E[_)90^IpTkjLH>j&BQ$JEl$3,qD=e-b."6rHjm6Xo6L4YW!K`$oSKCD(/]A35Ei +W]AA61]AUCtOJI8PmpO9c)M6O6jdH,N"/\9Nc\?S4/D"l]A5)pHSs0Dg"RlVB^>=H2PnBXl1IiA +cR2?.P/%oC!)aZ^#cq4I`pGl.#JhKhi)#2$p"o?4`FrDV\82pW,qS% +Qcm]AgDD0%N`=64hq>]A^dVWAEam&+mZE3X(B)@jdAOC><&Sq99%6a.W=ec)m18\6mcSeVHW!)& +c^q,6NZgIP6XcgV!(+1)4:<%;j2_11Po2<(`=p^#*D5%\,=M$OeNQgIq,kh0Y,3]A=-Pg7gHa +?2GB>A\dj0*A78,Z3Om]AH/]AYhF,>Jttnl7D9>K5q"m=kJj\=']AC&Wu/;TNkp_1Sc)XL0aDU< +D;lEQL0QI:iM;q?p0T30dQ2sD$tF^6IHTKr6P[2EWq<(=d5SMHR&l07a'3l;Z1$C)d5V#9C\ +j%j`B<(Is,EO@rCYhs1;b]A;dt@[o"7UbWDGDO(j+2$<<'D:li8u*=ICM87(C +0)-\4=C\mSe,>_moR1mEODU>"$nGiLeLJn32J*$_2M>nUkY7n^$m/[,)$=H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +:]A^X\<"H3p/W=A]A`W1N(pk?A>Y0Z*V-[p3lYH1* +$brgdFpJ)#f9:4+%u1pc(P+[JQNMqDt*R?P$H)>K(rL8a@_YE +9aN6?BO[h$X#=K;&/4SQ-A^%XCQ%3puul)I:(Xrj4gQU4Y$8F*":)R'X'\_$i"o5I]AFA4,Nq +snFR=uGJ_j^?]Ap_%+MPoME6:hC^'Gq]AqhYeW-^&%f2UYgJ2;;VXa3$=b7S_i>r.#;WQJeFT(SU#1\[h7M%mIFqe,=SU20!UcQ14gtYgROIDVZa6jbo +hO/CY--9druM[a]A$fE\EfHK?@(*YU66&pTa.M_Ig&JHlPtqsJ!Dc678>s=kB-`(REu9+RKKQ +,q$4?PN+,TDY\]AX]A>*'PP5OtR6.9O"\;lCXgpS!^uSDN>i%;OfoI)I5Vs:Nes@\t=Yl(S:is +:IN1@5;&4l-V0p"#&lpS5j2P\UXB(%Y,YOTmrZbAPn_5f,A=durK"I(:-Wmr=('X]A^?P[B4N +'R`[=S83]A6>:cIhq>K:B78#dYcYHoTB4k#=UqAs/BL)'1sUf(]AGM[(smb>843F;L(rQ15mlg +g_?A!9r\lZ(+anlL,aiH?C"n./A:)IB'E(^O^nRo=r4da]A)EU#B.3m46P=;,DDjfXkhSdFRDZ5 +^(IE7r7J[nD%2ZJ8aIbTIFL\LP]AiiYp=:jVQ7c7b6X^%gYK^`<`]A=$P82,T(pTAK@duhe3Lcs/h]A&f\0dn +t]A!97'jd?=X!oYe<`:odf_B!iO(trsc%]A/O2`k2*F*NDXj@94\#;FqobU/0j?a>:EF-IF.!\ +2=g73.#2m2:JLA4OYH4gq'TNFlr3't(RuLYG]Ae=BKo;>F%HaBP%..k-^\Tr!&T9P$tr><[6* +RO6=$)e[Y=._X&f'j/u5rJPR*%MYNO"Y3`'W+\<1;$sKUoeLm!iMJ<#6#RBA5DOf\Y:964iR +@<]A:hr\$Pqm?s!Q$A7e>!8U(QJ$rr3L,+_'d'GL3Mth?!IjcBH5nkB,MJZ%WnHQqpsL^s_"c +>m,`XT<:RHM^k+5pAHp8N<9[lUL\n:_uDdFo*Ga21)p-UOY`-Hd.1?VCJ:n/\8NkK#%sId'+ +u?io.1Z$GMi+tFS`KEpEf7>WlVBb=jIpAI2s:I*;f^32bu=#*nWZ#5)[Y(]A?:QgAUFXWh2k& +&1s'=7QG>.Jg.mU3or&%.g&^'p&C\un>XBX=4)2Gq;0i7EPg34BLI[;LpKmS)*f3&AkP*=5X +kVRemjtD>,%L7?Hq"TCJarY.dFVd2J:m;PXY.'Z(=+5j*^c=.^OLXYY9]A2^$3LS2DW0F;iW6 +V*3ub*#I]Ajh4@:%pkElcH)Cl=_igpR(<>U7VF]AQ_gQW1-!aZf3]A1nsIU:-bm,5ZUm[B=oAXd +qf4RAJ"7ejr<**l=)f:8I.tc:39l]AmiPddFMB(*X7p+% +)_gmKcYr\9Y8YZ`Fs)!c6(F!'TA>;&o5?\!,V1ZHT%i@r]Alt%r)\@?k+Xc/8qDWT5d5'@O4G +XmSTSab=^'0730jWR9WfGU`kq$2TFb&psDhqK0Y%l2j(;;a&/>g +:ie;N?4sJ'CjXU(n]AE%VS^Sk-_aa*?8/G'X<6jdIs7;(oT0:P&OX3JcTKrAb_]A?>90<$:M7> +*caZj/1)7P)CgV;7a;#r!(rg6DNEWn7&n!!:'a$>$8BFF+f^ql'**+[t*qQ:lKJG^8G-c&*Z +o92ThQ2-P"Uda?16UF%6:$;jLFa_?VCB-]AYJ!%:cA!s5afr!cj!D,1E1DUTgs&hYIZFPsN%8 +ueK"tJnI]A:Wr4,G;ga@DIFQ'^U#ok30e)^GZo*Y3Ca:4We@/d?S$8=='Z?TaZ>:'Rlq$AHFsrj0cQ&`p]AV&Dk1HCegM;e5 +X/;FhuNK0NZ$kISZO_*$U(T_Fc@?R>G/P44q5_g74uAC^!lr!l]AXnUh0h?1[jRh1/9'SX?tA +VYb]AKlMEQg:ZAXDg(3=X_nNO;2in)LKMSlpIS*)OY58PL'$Y$>b;`'ePaCPE^Smt3lWRBOs_ +@mIh.6c8ZKT6*-KEF3.!p&e/*0Sl)^3Z*_-oW2f#k*s-#hdl)D*\@m?(n=YoP+59Q@dXujCA +V9)?'lf!BIc=l<=__iJA+o*XsF+7naq%=&Qppe*>'ZG807k/Eq0AP]AE+6>>-P]A_7REmDTXO/ +/(.&I4NDdADL`er7Yq$i3Bj+[o4jse,D`^1tI/a'-eAmHs51UKe"j`48AeC4@q=oE`Poa6k]A +=AN(Ne05p<4->iJd=W,9ZTH-!N5MIgX\D_>b'13&C&P,j0LgXY,$Yu!?L".McV>]A9N7)JA1G +k>]AsRl38-WZ#cn?^Z;QVDqZ'CIR^!]A4m<1m]A[`mn_P[>%S<%e=gi,5AF4a;$I5D4rJQimsWU +Dnh?lKcW#aj?lZ8&9SDG[\f(D1k)f>j\sXVMQtW$Pc!IOTgGP8rKO<,V8O9]A;lBF/KFe%,.V +b"%!-4sH#)XQ;IX`b]ABH[M^lH@cHDT@.!^sI0%7QEIcOl3j&@ggZV)4.GPB<(lHJ(;;=ReFh +_?MRFh!Z>]A#LOU>r(BpFhGi)F8lK'Lsk!_J=Kj3bAO0)W0?K&rEZPXEUA`$Xn;Q=1r$c']A6. +,3cV-/>']AOMOOi@:8cp+2&WISPV/:$H4t,J1bFO9p]AZLW57n/QW/4)Wfe,kCZ!k7D@B63cPV +\57.(>G7ULP+koiHr?3Hcak9nor.3Ap$`JVj30(QFdt@oHP[.C +McbHm[kX^%,:=dX]A2%),T-3#mL,c;emR1`$E.IC[8ef2d,L(?9]AZeJQD*>MO)WRtFT@B-P(c +V>!Ku32nM7+/loCA"!>-MTm&Cko=&WEkAO3G_d[\$F7?n&aJ99tfJh6?<@'LD.6AuI=DCtj<49%;3!=@!!@G^Fe!+ZG&TLnJj*.3ZcQV+d0 +e,]AQh2E[tnQ97>,1GR=;\IgpN#,K=HCb^s=\.l&.kQ"dq9hUnkCt[o;Go)f7TNQ5,IRX+adJ +$GnNRfNV&K*[E*#sY4Uq(/qB-8?MRkW(U1#qBO*Da3ma!cf:-m4\Qi!Ci?4pGtWM'"?H3&.; +!^@SVr>r=EY\t[VrVY^X`dKlu,68Sm*N7qJ+:`eNSob\(bf=4NVOoB\+kKfdG8==[4KLChEO +X\]Af8`-g`2Y0'4hC%rW7pb;@hnPWe1A+m57`l771+DB\Jc?r3K!>.H,"8<6i_"ooo(6%h@Bj +geh)UL/72[tZ(-m^kZpD#'Yn):-%4P@6Ju*FWf57jRlQ!hfKjS?+"lL(,]AI%\/+(eS'FOtBZ +DrjDXjpFZW-^pZHBD19tbi,RgE!4"/j9E>"$R)FU-r2jpP*.#E`9r6]AeZ!hAX=]A<3*-c(!l_ +(=jPqWh+"@t+SU;:ZnHBPrDmHs:d*7/F9$Q@k4>Jd#In0g[pU4h`e4<]A62@dRWGZU_T*EV'N?+$L*HNm7VJgU6%!d9Vphq(YauT +[Wcr7b51n./C5S_n;Q;.1U,TB2tFC)135j;[r^S^NW?u'X7\/(;#kr2lbo_.,-!CffVMA5%i +Yd",paSp?oNL!!SHrf>.'mQOGceA$,0E.,Iq%lOH\P4/Y8`M8JHRETG1cLMHnBqJOmlIG%jZ +nq!s`9dhC_I1ggU-EO@;NWJ5Fk?1U]A%j/q@Fp>9FMU[*h9n3V1/efi)FccMLJi=V1j3Ta&>Y +lQKUOl..eVhLj)b9Od8dA=B?(DDI&/kk3!1N=`:Y@NPu#@@3M9upcCi7lU_4$i:&ndA31A0J +2.KTt=in1e#1RlHot0Nu;+cYZKKU2CE9UGeM+Q.]AE-?Hl.?@,oXb>Tk>Lk-oJs^;V91P1G%& +j/)B1!+Ap4Y#+(W9_ml[8e,)C>(OtAM3Z^:Z4ME?(pK($$6D?7(MiVhon[\Qf5Z`0`EIL$$S +>H?.>n(,7ckTOLjX%A/O?R1@:]A +!iCJc[8!eaKB__GhFIOHINGW+)(,>XXNg3WZ1:Q-%Es5'&5;KsMb@LhZH>qXHA*6G)kqGL(C +.;p?%R@l1 +Tb-b`<&^e[_0-*_1GA*KY8UIMqn"qsG(jpW(+bPj0QCr/8VdX@061.Cmj\/(cq[&J8YGOTlqrFI +jPF,EGYN;DA8><8WNgZ,s!ZoqWVmsVJrMLEj[q*+R]A6U]A:@rb-;"+?l=9?;F8l +nleFkH@3[AB'$0XQ0f,Xr/b2!Wan1Y_BeHdokGVt^)=J[8Zn4i+Zeqp>CF*n/hVZU!t%t?eP +9Wr(.f1#_VbA1al8L4AB7V#\2NsdT9e6UXB)_:^g8:!.aiWu3Oc'<'SY-?"?[`]AoTJ"`-V0! +"g2?DiA;D85rqOnQj'hRSH*m^:Ma8LI=1''ToY7q04@OJ2-8*X$59JA8nM]A^;CC*C)LqfS +)V8O*4J:edL*)bOq7!tP?1*$?.Cs;@H2]A1GM-;BJHRY9s4gd:@:8Kc9Z[ERa$*JuYQN)'>4c +Z?u43a0@)-',0%1Mn2"qconS,hDYZhf_!hoHdd;)l"fuL.Ve"&OA>&O)!9#)?uQX_@6d!^bsYBUW1;8l$dVB7N8H"0O=+NOX#$Z']A\ +;Sp>l=*(%,0aKdJ0t'N*IZkUFW<\/hpQ**q=NeGk"ZPH;Rr;(!qY5dGet^n/LPIV!4JaY^/O +`nNp[^ZBA^7@N1c%OCOB1<*<_+099<*ptI_,,cEW;\7O2]A48Mmo?n0+p&jGs@bZBM>JEBXRe +490_P-Es.I.1''Z:cf@.99cU$j[=HSAW/[.":5C<04%dimZl=O5\P(0hr`iX-V"'[8rcX'$A +C>gL@3V7":lH9ri;+ZaW,#.Vf-$B(+m%n=N6E[)RB'&*doF+_Y=:Jnee@XWG(#FG2>L\-P3D +`(GX&D^fm$oHmnf6F35$%;R3E3[>(jp`!D5ZoDYrq6T_V4V+ihWqO+.VrqRX8L6B#ud'=O%c +_>>Q6;-hEB[r2ed%c-po5p*O7:I8$.)_Li0b,<=kA^(>@Z#_G>617VTCemc$]A,.?XM8ULo8l +OjeWj8!'a//G-8H/A*S(^-:n,B30I;eeI[bj=Cpk]AJ/6^lPH:Y%BM5foA'mXJjNPMH-36Jme +C%!0K6<9B1-*p(>o5@(Y&Wn_]AO'aR-$7t8,r+B(d.Kl)@:To^YN)\t/f`a5!(%TAk"hrf"CI +K3G4kSD@BVQY,m)WJDYj3+^T[s9W7c`Lkp(`6:]A,A+MNjfL,XH)d*V8X74s;SiCOY285Ko.1 +`*;0%m[j$@s&W4=$KD!R^tB9+iEemA[C8#$0:Pa%6=RoK73!(tm'k=sT=bFWdpX2^.MUIL)B +Em^eO2P\r<`"Wr_H4?&hpkk&;_rT\_+E(92gU/g%Q!3I>LKm@+93dD(j%1[ZPjMG(KND'q$4u>$Hh +C&3>&TFkc+U[tZL*i5"EbkDNlY8G`ro>kJE>[8NT62K]AOm!XjbX)ShD.lgEhe-\Ge%#VZf+$ +JhcIh%>*ZX>2FiVqAa`Wu8BZYj_:a@ZJ0%n'ak1ZTJE3m7b#a'-"Z!]AFYZ2<"mP`,r6&H/)9 +X7W*=cgn["LI/"oG.-X(\d*AgGeTP()Wm+a-(%:1M>-WL5pZQe)+tO;eq#g4Eg$R7g",aTqn ++(/IC,3(`F,US!^o>5'>a"OlE1*`B<_%f([DM5jdaE)E-8D-?02N&$e7gMTe=Q38!DaK0@c^ +jbm\UDP2E+cYS`?Wj`(/*`r?Yf_!EQH+T[l^JoY@-Shi6!05R&>GViNa?YCl=i0#kPn5f)kZ +W["CPr9#q'3YMm`kM*s2JbY5.YIll&ii]Aoo]AmA:E`t&]A`r)(.?M+#S]A$$RMV0-2Vn@&)%9k_ +_//[*,7_5phc09u`J.Dm0Atd`J;`:;BM4DEiqd7Y6h[Ll-n%T$'\I6iFA@Q,jn)1VuaX0EZW +\3f1?tBf.Bd'D/XTIO&f-cT%%XadbrQCPC5+1<>.'XZqu=R#lh`]Auleoq89 +OunbcUr5\JtI0b0Y"+d\J3?Oo*qDM(`B^>hs5iuM[C==V;%'0=T='<[0N +mWh`;!cO<,fH1dOBp`INqMh=`dNOICGR%$m@/\nGBm_d#6i-g+T"^ehDT[Ril!]AXO:N*0fghKdZjG9rK.n@Jn]A5E\!R2%:%>*D +?.(EQ'MM=Y1&!3c#fpg04A:(:ZbT6cO-FsbKi!/`Os+oi1Ch4fDEV5"Fs*EpbcR#5S-A76,Z +nq-dUut0ksLmLX3)a"r"9@j%mkCbtY=h;R;S,`sK!X2#ChRfet=s'$]A23IdM6<*SP<#^/iagH+@paJOl80gc1<4IY$"*P*-]AbGOE +1=4[5$C3@l'Fo+\s9%,"j"\K_Fo!cmK/mR(DC(*3F;JpUMo9ID$:&:WO&-%)Cg%:^15%puCV +'9(:$R_mFTWfgYHMJf!#Q?YJ7^H^(b=G0j(K^,rMqq>W&s+'eE`;^gN$1d=3cAL3ug?&0:[d +H$f7SCu,HWVB.-I>8WH9aT0".+6EIR(99a3kC7HSB//B/&(dLHW!Rua[A]A)UYO;eo7q+n5<^ +.9k/l/Tnchog1.& +L]A.a^oCa[8uoh=eP%NM\#H_J`$^JV7'?BC%er5XD#u<$Y@>CWc<.3.M6:BNZ1cbG#*U[S3^#QP6$VpC1er`#?QhA&n +n$@o*tA_.rPCft.`(Gb\aL[AU=Rm%E+pc&iJ:$o-N\d/kHgfF\:rQS^RB^ub$1Lp0]A;>?g3B +I\Xs1ku1(TE7hn@[$;"@ha)t*+YdYKlHUlu*k9<48So<[%o@bq@9CV3hRr6YM,A<]A<-r4!M( +e&AhQ=qp/T:"E$NlU^Q82Nm8mAMQC+^_Q0XQL*HFaoMD+K?"q=)4d&dPO3AXPDg`J9aCTX>4 +h;I+M`a?bf7p$`5(QP!8i.BA2_FXZ,;W^g>f@heJ$YtICTiiCq*MO3cB3r%g),?F,@SX)k-9 +q\JKVig-o'@OjdPoi_mhu;13f0@?<(\YLr-=i`%_5%nMb-#m37rF:M/.64DOnP#Y5"M4[`oa[l7H,LNh&5*4lle.g()gbBi'CR2hkHrt*f[1`I1V +2D;Cq)thi`ZoQT/&H5Z?l:eFrn:mbEm!!$==;j+hV@K +/@@,MgcGlh.*:msJfKJD6o&NO5ub>25Lq5XRWlL?[$'[5BZ!ZRg7_r_gpJrF_3hMfW:pLN@m ++c(l/A(?+IJ)iQ%dCY0iJ7>*k+Q#;?sFn/PWl$>qM2Zt*2)!Q*d;da(QPO/^.dqXXHgi.G,$0%&(oh1b7WO?% ++B@Dfs(R)0"cZKSt/Y$<7G^4)d[blW%QO3%E_9VCM8+;cmj5Eq&.,389-QqMn(63'Ks@_FA4 +VK7+51X^h0]ATHg(V*>d:5s/.SI3/Gii^$m#9U`0=pq3E5eoe[*4M@!&CFg,u)?o"*S*]AoWQQ9dK`-DO&l#R/b\>mIrMJ5UlqfN;7?;)Vaq5pft(\1>T$UE( +%rj\W#?Ki=@PAf\$]Au(aD#Qn/gq+P=jZFu*'!CJmsH2?;ql6u0ime2aKP!@2&uLRL.hgg]A,`i`^$^hC8-tYpa'S^upX`#Kh1`:SB\o>HS=JBpZV.IG7@XXb'"a+5)bj,Kp)6;[#@,!O"fL^_EDSn +V-=.7<5o,LcrVOT[Z/)XH@R/KuMG6C!eZEe.lC_QGB!udDkkc`(*#j-[BFPOuSR^G_Y]A]AiiS +@ci9id5c24jr!LG),AFP&`B8-RM5&kMWLhgHHF>f2@j0NnNE@G_:*N@rORSE]A1+V!M90(0FV +toNu7Ks11PU&K2t7[V!Wjbh^KR^DhJ4C\?lt(q>U?iZ2tX"$YutVQSr23O3s^h]Ao/pNFXNa! +Vh2O[@IhqgRTs&g-:r#q7I7*fI?Ll12XA9/!t(7^KP7*0eL,Ga!@``[_m=>R(a\@s&'s2p^L +o-1CV7m9c"H0$Fg)p8bpM,7&G/0]A(0lRh-($uUil^/AVDHH-?NK5H$&jQp%UBF%qM!LWil&i +<4!lB.*@A44XVE/1j/sEc=c4b!L3q0Gb$cr#:_*_GSM.Ec/WGEXQYDss[$mqhF8PBTI@U>(p +BBWcI]AZ1S/NL-K1>R`k;/fmH]Ajnc'40STF\8Jf]A.%,`?$"XctaPU)UC=Y$OZB">s+s"1H%=D +q,pVpuU]AD:9`2W(QXRL\oU%i^ftuTba+*5\fkDEp#Jre\>A/TfoM-pn.)a:W-aa2! +83_0b>[7e6q,7aG?Tmi)mjN6]A-*.c-r^Ej\RNi%K)?Y$$(du8Z-1Os,Y$lMs[bajSWphd4Y8 +#H>Q`_iYc+U4K[pZ0gl5jOd0iqQ*KC@7),\$[DcH_1r]A$aKBXnA>`G),(p\?Na!!i.i +.:4=j-`njP`JT#G#BUsQZe)s/4PO9[++t#sm/c/T=WWgVmqNgo35I!=8M%&X0oLbK*A4\!*$ +1^.B:"%tDE:7L*@]A.Y"ZG`kC&6paba1Ma$ND5]Aie*&S,-\Fo3i^CN@O[(5W>G`Q=bm=D!bKr +ju[BbI=7/k57*#>&RG,2uDLi;-$HgFItCl=glMg9s/h]ADE%V[0KmRE;gB?Y!Cr\rBdd[`?h!9V +1/J;:[RN/:4**c6f@_)J@em]AJ,7JVLm(*l;3p`f]AW'3ESV-?n)"4jf3$#@3E\0h[B(2n7;bO +Rq95jbqLbM:2E&2&GH=a#Qc=o*j=s?*MOWqG:6V5mYEh<]A\iH,U%5XPKco\hQ[R9Epn.ePr]A +mc!Bb@la=h_,Hn[@ofF_n]AR=$J+Z,dl@7f'"[*`h+?7+m'("E$+\?g-AJ!@ca#iO6kf[5s74L&@K;C6kB +.kCGB(Q,Vj-f)>:Zg7;nUh4E@oH*6\5=_$H,;L1)YiFJ*$+eBbJJk+uQ]A68.$ +:2n?f6eb^?f9;L_ru*a/Uu2B,blZZNl[<.0dR'PXbZ]AVm8^48P)]A^ii;VV(PD9L,O8uP&]A'8 +i&K9VZektYbWH(N,]AN(,Fco`;G+bJj=4MoFKA+ps&b8dJei"NH5bGFtaXBVnnb*[o#=!'BH_ +4.WV=R7_,DIK9T8!Y7Y^P4$P%SZr2AWYr?e"0n!9!VM\rdj>q,Zm#Qrgk$05d"\]AHu2lUY`$ +'6"7?ZnC"j99*Y6Q7&"O8"OL(G02PHtQlsfIU8rP9RlgFUK?*EqHS[Bd(oH[e-.GVc=DQ=^, +\pn2-"ai>D#W.E?,ZB:JPZofI:q0'Z39oTkF#dNL$AVoXot32G'MW\T"5T=Ajof/SN8scO'L +4%1Sa\UPA]A:X2IP8+1#\uuX1pc%QQMSXRd=5W^;IrH.B+X;aI6;VrC#M^;$j7\3Cjb'846&- +%9=*Q[G]AD=nf3!nbB-#iZ>De%4D@!hD0aVs*NI\Y?m2 +5H%j/;VueQ,GmEj3i08mZ(S,p.iGD4TS9?'l0?cB$,mQmL!5Im@j9GO%@qg!.+V9oW$ +'ti6=]AY6aB3V/Y=Kj[5B^K%#ZEYslE>d\SU"Ni/EG7R/#Up*-Yl[:P'n400sB=f&Re_.Fq,Hk4BVSd7&@1N"S(E +@J^eK!GLWV"ZBU7Ai8eDE&1eOpH3D`>Vn?hIY5@U("^Lu*Vj'7&YY\W]An?8$d&R)leuI8Xl0'%0jS+BtuS"Ht?mkQ;2p20h=<+*C2@UI^!`,f!5?#Xnrap1l2,;^:eaO[]AJu`e`uiu9LeC* +gN=+L"u@+3A-L6R^6YlDI-N`NQu5'E=be;i5-IR=8j3B_F9Ne84BNP^SjNhBRSl_+L@3usTQ +pVS"!.QV$!!c!(s<6N/\uABrrgb:Z@Dg2q[G#Oj^=F-U@n]Arq(_352qShS*=:\VcZrtf#[Q2 +Q^pptEMTRbHD/U46Z>iMGj12h'3IX/>=1mnN/$elh>G)=.bj?XM:?>QtMNmP+kU!g2?jhr3C +qVfh[ +;:o;es]A)7'#DTG#kUt-$ioOe?V'fmk@"`1TkS+<(`#'6d;t7/g2T[b)F +p$qNJoF2,AR?>/>O3f5Ch+"F,$mcTr`?uX8oDm2Ti(a'&H/l0[$$TZdKKSFH`HN&2T,7-)e6 +r#]A(BHlP]A]Ab]A9.R"cB.ZJrO=Ap-%Fs,tKM'CHN5r[Z)( +9MQD27-=`NE&UX;olA9g[(>b;R!D)G8IUF0rSXee$'VO2@IWb!hJJn%Kn$`1,"bC=Xf+_ +#g>a#iNEAlq'mJ9(qn<1,"q0B)`38OAL_F\d#\=rZWYf.S5hhCMC%fcT[#gcP30O8$S^[p@G +"PQrS\kpiYqq;@=eF1opoQ8h1&hcos$WX^43WmHo=GFaebk*A%%eqQj6:cc++Cg41N:X +2OU$m(.luSO?lkpAX5AWe6i0Uj;i+h,R\k$'bS0YN=NRC]AA;idVN#?'/s_`6T?D&-T5^[Emb +H=#`k1ji%b(lK=WFNF16i^U=e["'H7f+)L?9h:19\j^I\aJ-C%KMs%5c\g?>A`qU5%5$`3b)scCAIqC;c/gtUh@N*u'@)'H4+bq<^kot^8dYn"4<\NS5_5A%GBH8G7F\ +D`.`>eW(pcY`8Y@#[S;(<$Jncl?PQT5O:M8)\8du]A5;[A8fC2X$&k3DuXVnQmg%^>'' +joqXu=?4+eSEYsD'f4-T@*&51HNL6b)4OFfiU:As(oL^FEGX42SqmgOFrqI[P]Al/ZoG.Y';V +Y`6";.Fk`n49oJ[9)(hop'_SlK\]Ane84pMg%=Q&72YC:%81Mk%trp1'J,([[WChTW`.\8)I- +;a:u!8M`MTp8ifUkEW6*`crbDDf,Nmcf:Eq0meT3BEp!O\J4=75pM(>_RT"8fcq)rSqi"b`" +%*s#/Ma;ad6q#U2OdU*I-l5bMO^ATZMLm[!Z\CEpk-n=pZ@Io)=!_8Y,@9aq"s7gTi?D4QS;ZH0S3\FNi\7M<.XZ/$(U'CB +?&+e_iWP7[k8F$h+%%30`R,P8uFm=7/=D'^sE!/(NF2]Amj%\fVoT&8Yl)"//kNe0E;)9 +Ai0:T+Pf=B)R;kY)JX#R@\27.9[GS*-j3tN;Y\")ONJ#[1S"V]Al]A`)pT2nn*D/BHobUKfrF@5G!eJ3Sg#^LQnAmH +[O(C&"9A(X4%X!E,G1@WoY_er;9k[KDmrd-SL!YEW#@Po_(U7LrH^Le(iZt8cdTUbm'K%%i5 +QBnaf^!WMi\7IfKKGa4>8Sp:\=VL+E:n%cE]A3bDbB&f96:D@VB(Qma(Y_R!(mubGG>m0q]AH_ +4%HWR"J+4CEB.H<#WV)YN^44H4K37Q7)*VHY^dQ'1)a^oEJ%3KS/K5rXb%UNScrA5b%6T_']A +(H)TqFk)4-4W;4Kh#R#3m^6@sP<4*@tN+^?W3*N_DFkc'uCO5+Afp\0u3$RC[-Z)pUqT]A>on +/mBs-pYTg2Vc%!`$XT2;9Sq?`kEEBqeXXq:EVt67g.:I%t:I(lf5&6i09>9?^`GbHk?!C(O9 +D-\paV?9c-(?6(jX;B`:,S\ae2?Xd;g'0MT$+;1+s?4cl()j$e2P3T$abj%Pft&9/s^\"&h` +?nNGR5m%B+15$e?(9Plu>V*uWg;Pt:$U.2ON,D7Is%LF;VjB'8G-o$$/_hhfr'(a+[U5>FqA +\_c,sfZ`d('UjNB+,A9Eg/'ojQA4jC(hEQ?oa-4+4qGpXdLEc:c$f& +Vu"G>9rX_PCh6+^-S_(ckgh>s==gM.m37VH2off>9$5q5Kr[*Qq,Je=o2uUtGo"gq*KqJUb+ +!-;U!cIHQ?S"

/J:9Y:@RDV?u-9O#og@)94S;9H<$1(tQZ/FnRUDN*]AhH5IqCSJQ32lHKR +Dr)PFF39&1-2tm\<"4gs(1T2jm,K>0<7.@14h3iJ(ro2K(.W.dSAgjSnp&a&(Bt/2MMNSOMiiiJuh)" +\B^K%Nk?>ShVQ`rO^G$c9DWSB(-C`?"&TGZFrh0 +S)-#q[CUo5)L%?78K.`47-NLI@jCqFB_%SElds2&#SppZPSo&QY)^7(d%q@k$j^k=reIu +VD3j7*TXO<2k8pjTVS"I00l_3kdDpgqJTJ+#gb`p%:D6B?I4-4#O\=JO$UW^-I\(5+uM3^Oc +%gok-,-?5M04)uA.;l5VXE/?]AVZc1&S"UL0T[rOO7Ij8^=S/.'9b1;0$4E"C$<2uafj?dYb( +^F%K2rLTXE)m-^p6%lO#gSsPXAHKVe.q4/sIm4ZT\-*M7m7eF6Mi;-Ib+l5b]ApEBDNWBJ;\W +SYe3?"HfZ5(\fOLGn3pS(mrTFS$*eTUG.:;l3>qh*LYSk0DA>rN#8]AXbM[GqBm/E;G(()-@NQbrm +;^,[V()4Ro..0,Kl!`d,3V[aBbO,+_"&[j"$IF#UF=8]A\lbbPHSIPVE,:e_@FfDpLZNi[X&U +D8dK6*cJ*O21P2?ZAVOJ(k8YXi`u.#,0bKNO=5s4>@/Q]A!uFaY0cmd:L3:?*3/fGKG[FZ=d& +U.CniWio4MmTXHnGh-3Q4Q[YBB%d&i"$ZVh76DZ!!^*aj:fB7pJKY8WaG:smb=d,,>/Bke2X +Oe1gDZ'bDI$o:@4%tIBD,=#u\^$f'l2F5j@<.NechFbp[DDR`3c10Q$4WX9VOitS6N<\ +j4M`W:4>e!eH0'TVF,"]AX2aX9KT(dQ#'`7BuTojMr@lLsf!iBlS%G"C_b[p??hZ>TsLL +6/h(!KX$\T(!MLou3c+BsJ*kId@28bQ`<2&l"c.(C:Z.rO[Ul^-O<.d%GJ'b^;6O^dS96m\> +!V1^0`BV[(Zq'Sbd.CgjBH"m+SGrC^.JI(GSTG!_h.:4&9P/Q,t[:af3SF@DTc;619@<4.$G +Q#h9"N::aM?QuOKHFp"qkP";k@(!#':LR>TV;Y&WSDdYiAOc!8Gj14YFSmt'2%GhCp>T)FkF +"5odV"OhSh7AQ3uESaU +j7]Aj7CGsiHU>YGE:m!"ROmS"m`_]A8ZWb1O4*5r1[b$73dLE>5NC=r')epln/i]A_S[T@2ZT?T +SZe@f=hZel%5Gu!6mFVq$IN@L?@.=>qkKD.9@2k:-8JHHigM[RQ_Yq2W*S?79ujSHSAA(so? +HBNGP]AY+1Pp\7GKcI&PnZg8JKQOH9:Bc=hok_,#Te[ms21?]A0Dn0&lj#"##OUFSP.rH/2il; +\CgB:!2@M46kNIS"tY!qi_n\tPR<[Im+=$Mq#JEffRge<;7M>qVVWT"3Q/R7ZaRpfe& +1Mo^r@f(UVeO)&(dp_(.?\Pp\:R"iQ49O`-DV3Mq=NZM0a00:;Y]AM@CaMNLpWKT_q@7D6P;: +3bB,mRLU$4,$B%W2.'$8h><6YIR/;RNao&[I01lN]At:bk7o"IjfH)eWal5S)`4_62L.R +@"NN))J\:@+MGT$;"7=>$)%4J^0;g?SJ_,XgS*b-Zb+H*"*`m5KA208\/$;JZbE/urND$$-P +o#@1(c"JKbg2r.:Wht^H#:&&V^^bfWfOo,bfsX/mQp/Db6(B"Ajq5rjCHj]AE*gL#@);PK@MC +GeI%IgM@1(BVmR`phU@2(e%i@K$=u=G]Ar@6ObY+=U&iS/H2H4nL'G/^BUc:22 +TdX\BRbl)f+:+0*d3Mb5EKGgq)gO+2ZRkFiln^4JQm[/k +WC3=[q^:P?Nfcq72q$GD&f":55$$]A[(@e9%mC$rg8!TP3rXDhu=4Cuab##9O\chiapGuXaRs +&dKShEJmfdHUN8.Zjgq>V3'Q!mP'cejPQP]ASn;f; +6#(fl!jK(2')T9""t-lkllE!_J*/Tj31KU&.TV +LHqQ11Em=,N78KpOW\TWUSW;#:\0/duKQ^!MG"k*Wqf_oX]AT,gs\S+3NSDfOgE&1c<2S9)X# +DK2+eL)u5'aoh5TlQ;:aN&R7ZF?Z?tD3mJM\Ro+U%ZM#5A&V/rVl/dIur1VM$0:Rc)6PnGBJJ:?YI,37&9l2 +In*s$a58kHt[bKNh2C!gd"*_U+557$o30&J-)]A9$X'imGQRZ3>IIs-HuI-'@ +=@WjUh;gL"WT`8ei-SU8jPT]A37\S1qS#.T5?I8m7YjLs-3_'UNlmA(rrsbFpj+pl_iqs4a=@SF/7c0M5rPL1:[@PjM4(EDQ8@ +tsSJ1\5\5P-q*J!?,iJ4GIU5$.dZXk/!cA=1srNRoI:e7`f>!XJ=UL_qeU.ckn;[hdM3Mu7t +o%Z,\-\9u]ArMfWh/8o_kraV+o;]A'ZR<=?i(ki5c&-,cBH$8!O!t*u/95"heTd\+mdR)Z#7MY9SHNft_9H6*IDYGhm1\LAr-9LhL$]A4l-VQf\PSXn]A +s%H[ArT!&q>7"`"mD)dhM>Fg*WK2:!<'kHa!_T6,SL,@ll25*<@,75KCB/g]A>@hegCi[5r!@ +#OeHOaM6-NEhSGdR*`?B&["_T%o8JlOB/6DuIB4\83mOc]AgG^V\Bdk+@0q8Nq6[$0q9LBs`D +'7:cVYi^2ZdM,@"o&rKf&qlo?@[tAP?fGL)`'Ce!lhpbm-Yu$pm7IKU[.P;tMM!5jo/; +k>SPpjlFj,9R0=H*Tt?4Mlq[\Bhm8"V^*FJn7=u)7T@6Zp21c\!Di;Ni-CS$m*9\Y6J00MXS +IjH>T920im+]Ah)9KT?WVfG!gdunVF5/=+rqG.=@/"j!$:8"$2=h>'>L$qijd2Y6IED/,L;h +QY)Oj1reFN2+R[:6caS$*Mcf9>Nr\HMo^Vt,Aq(0/jqDAMPY2Et&bPQ>$;*r +M6P$C+rh6a@oSn]AS#YU",pSP3_e)\fTK9+VMhSge*f(=1e4IL<%bB2kB^idIM-(ali5T(U6Z +j-DT1Ki%]ASuB;,/tttVF\#f2MsH;tF%",XI;(*S,5RXXNKr%d":&j4+O,d".[Q8QH6nb>:l; +hi2]A$_i!FpGiPA5kl9Gs&'8o-P[=ckm_d5u.8=hcQ"q`ed'P;R*d<&jhFJ_r9_Z,3ZhcEI+. +]A.JA*VZ>ee^@.Yl?:_m'c!_00((:gTM9;R4BLu2ULj#lPM#F,. +;K4Aip=,Q7Lo0-`^$OK,6q*#]A`!@r$j[\W9dBV6 +8,0Q]AF!UaiJg$M5cTYoZRLFuY`3Z>3E%mD&DT.3Li?BG0ekB<5Gl44OR5%/P9LUi,I9i +eZM`&Q-f1he*(dCWWS.WkQG@>f(l7]AOguq7Qte]AuG]AMEt:AT@Rfk0'*aWoSpg1b1aFI +^;#Z"r(eOO--Sr!c1Ka&naaKC@]AB'%JFhS.P$pTnak/)2\Ws+\inT@G#"$`5 +N9i5bQijScC#]A08pL!Si0oDNI6l&H3I6sKp>$8/FtjG^,8gX6*sF:_P+"0=4@h.CX5I^1rWW +WQFf;+nkd?.$TYgj5t!mm2YV41@N/Gu0d9=RHWJ7Rp,&SBTO4^!rA>BXg?fUH[ah1Dk1k*C? +L^pR-poaKCBW,>kYr0kH(qjS\:Ec+KCNcEjG+iH;n2X!KhmGuLLAe_ZnTXTbI"_tr]AsDi\>G +;HfU6S:Q^t`PFr8Q7YhQOCYGP4ErTM50'Y_BN+b&2(tVsD0aE!5'K0#KpJWtG+/]Aa`O:iUC_ +MlT#3Qqu7'sA=kt=m71;.rg?.Zql9mtX9UGIhh!F)d1=KMU:0dA29FurE=`36"ou,uo+^!?!^+22h4q_YLB8sFDY:GD?j0^/4:0EiZb;[$p/'0[/AAG6$"VD=%K_dhKD#S11I.kDL-gN +`URmB\T*etQ^?=oQE.OQ_.m;ho3`KY[>&PJjLq'e%,Ic\ej$!/-4F6niQD\0jCZJ-K9n-),P +<.al,[#a!hPsu)7d#c/^jnak3!stP^N=m-Y^Yn"%KLTRtI+'F`/69d%=m/:F%uuO[KUC2]AEA +SFLM.?_%&6")=Se)V!#@^kq:6R.4/Bef^g"T(/Zs222&M92L(mOckGMB.UiLlhhh-SD=QQV@ +a=rsI#Knp&GN2hVn+_U*@HW`6KY"uA`Xf%Q&Md4Y36+HSh]A,t_a@?'#K-T`5U_Q9:0peE.7b +Fs?Y)!i+b0\Q7q^'N@#Ta*h@s9\f[@8DKqIS+dAJXbM3Xpid%1/r4&kF(fPg4)^KJ[75#5bP +YWWSt!DH">Tug)k#nsM76M/aY3r23?%:0g(!`G)qDq^n":N-\YM_ZoL([lo"fI&5F=70j:oEWDAEZ#jb*Wf,m" +d9\]AH4!Ii0qcT<&EbXe@uOu1@Wi^ia_2KnU-Lu/KGMKF8bc3&t>(E"TKlrum3BG@SpPHpnRrD*$]AoCAPQt@=nMlF +5Ql"`[7b2[U>crH)1E,"%_(kDKOjf+Lo0,eDT' +Q`uql/%=eEHGLs-dbL8Sl'Q2*C^BF9e%]AE%ZRqO>iTR,MOh*!j\)Zimgd[D,*I!N5aCQbl=f +\WPA_PBl&.QL\g\`Phs9afuJ,_eKpHlGqZ7ENa5V3h$K(*>:,^";^i +L"E1G'"KSG=/EEd&.]At!f@@\WnorG'$_nHclJ,,&6X6]Ae$HE,CegJX,ph_Ho]AocQG44JbDE, +X5nA\3.Q6n^i+6g[cs7R\(U,:&eN4)UJaAbA*mRg?\T'8l\u#Vgj,H$f>FloaT^Ig7oOn=6> +uMDPgWG)P3Sgspa8W@,_\tT[;.C4n:-.-p^]A*Qmnl +GaM=VRQ<"o-?>h2Ab06_N:bBWVaW"&h_uQ-prfN"0N9'"4K)E@N(BW2(6DsQ@(N8='Jm5FeY +5'HOX%@(YK!,+*^<3FKi]A+=[SZd[;QWj4i8I4%m;Dpab!1kY +\Ja#ZpS+r7V<&4H(KdUnrt0^Vb+R8R8ZYMr3"12@:4r!P[OOnVAMrh`_ec$"9d;Lcp=X:X^/ +m73hV;EUdn4min'd^KY_0R2&6q26X673H*KgR[XmPuboY0I9:!9umHd?V0D)SM7#9g0FhG3uiKurg=T=7Z +8#[]A7,?CN[i)]ACS&V?K/ruK1YZ0+A9>_A6bL!P-2-)oVg@$pSQP+2W"QsP*0FqV%e'r!t^p; +<>Rqk.ko:pA&+DQCrcppDeIR&Tl!h`&c9D"7fj2#W['qk]AmGQ*oj1B]Ap2 +5f%fs(3$cj%lH>HXSKk`gMX0Q+hq<;Dk\"[@;JKC?Yk*iTB0 +FLjPcI)31`_=#qrVJ4f=M264dQ6h0_D/Yo^UH6`OYW`t%3dA01G/AKsQ)a.`Ao\_CKF^Ic%g +>+*m?1P>aVD>5-Ep"&&d`,UjWWXl`*qu1rdHk&HeK,fUX\m@DO\riQXJ=1COJ#XVNRoO1-WZ +Irm$.!`,-Elf.)e21]A8-V8s79lLQ_ebU[DdhnCG98SE$>]AI*SG^:A_B(.rHlMs30l(#!E2nC +kD4!_^?'sp'"9gA#KjGgA:>QQj;a%,bnli,>:5lR=,48u0_iC`\TjbmF:uqT?LXuFU#0'eT_ +@dq2d^W>2(&"m:;,*Q^+;MqglF>J9&[*aoiQ2m%au5a9@q.IhN7Jp8beI2jCbf=?qg<2h:f? +.d+?t!YnU8l]A3(574'<]AsTcoC!*$e"X\/,X;l;S0B1Y3sA<5GTGTflTX86JE,@Q;JB0SHJjt +qDCm8(m'T@`r_=_jN=MOpHCePH]A6P_Xpp2@dF!:63MOB4$i(T.3-TJZZI4/K`1+Ve4=\2Mn]A +I>qHPgnBa[.M]ASs3<.!;Z:9ZPV[hVW +H(C!uH2!k*3k(QOtV+RP'W?p-2Z0@.\Nc\%H?eU:$!7jn3=/UnLrp[7# +d!Nq$#NU`5=gmG(C`>qsW;(360_FT'aW#$1H.>Pt.5B)05]An\K@868)6=fJjLpqrn5T%>]AnI +@@LbLfF8%NgYe$D-qh%g-!=)%D^!3P*odSNi4'bHbR2lcNhkq081FFKsP\M8H+bK&rurs$N, +[;ps7[)_uHH10j2_4U^B;dMKB?&+D;&(:nke]AO.e2e?rOt2NlMj-;jTQ28<-R+kZ/;e"f2$@ +d%"38:TF"?%<"-Kmb3&g.T&mTZo$f_49NE(*X_61q!UqS7;b0?SAVj`g(L*TQ>Y,'tR8bgBj +6Yr$92:=k:eH<1FmW.@/G:Js!lTr^4l=%rF$SW[X1UFV@p,\o3"r4PUAPqsSE%b[(,%\RDUG +R1:`Y.:56gE4CNV0f^(?9PEe6(-.,6r@joF;'R2%UMr'od*pb4GSMc!mqP=$>J'<6GkKm)=& +i;@Ohl9aMQeSP5"l@<_(?tE:$9PgG5r-#F!=0YR:5,fR#0([M,:9o"`EEh$-t9M18XoET8AD +lpqM*\PP[4G_REYeG4=I#0F;-ZEBh)Th"!(nbhT,,8%2F,YGM8diMP^tn@Rd&TIb[cLr@+Hc +V0JpK]A#)B&`A6jg3tha#D2rgP,gu]A@H9AAn@6cm"*DnJ]AR*`+:g(8.hB3CM^e3$)g1!'iO1W +BXb"'dFB#so$:Na/FP:@2a.aqi?Wa3UH;]AAg=eT6pQA^?Zm1X'?`JJ4)1Ea)K9=^!A_M8S?f +*i>hi:0chBa,P]A1io4npO%YD=S%r$iL'ESsZ^*"VH#ib]A'O`VFn:*.!&Y`Z-YXBT$laQ@(HH +#)E^c#5fgHWOO=TY7Qh_WY`9dbOTOrhOuY*TaYR^/03ei_"E>VrJ:'q>AVl+DpGGj,+)Qs:T +(?S,j!Q>t53%a&f8PfqTZ`#+*lJenPVOP3JIB5+d$9icrc1@"F(e*FluaisI\2=ga;(5EJQt88_GB\!.1G +d(=Rl)/C\L;!F;;l&W.&\NhBH=*,d#V[)S>HLkidej`rZZ9^0ia'AO@53)]A +"tjKhiodr>c<(kISX!g*DO05m?.ceJPO49FBLQ9)-=6A^Q8O[p2s/FK_';'0QQ?]A58cB3hW= +Cii!;6"[>=[dL17Fr?U2,2n6N;Q/eEm#F,91WOo4u/4jpO*a$: +O=HRX,'+q=!!=@XZ\S(L1`3+IGt0=S;gDJr+d&bg\I(Updb3_;U?_[=\t@r>@\>K]A^lu<`nX +:"UYk&&%6&C;-X=2O0o/3d_r74.81rk?T;f,jlK;*f$D"_<FOU>#PUm]AD +'b69Oon'eHghWU94YOD>$g?f\_V>DJ!cD4H5HVn*b9Lk1gNRga@NbY>WMPQ2jRL0t)sQgNs$ +cnFbHo$)+Iq>u2:Ehhem6$#4c&B;0d6HR;AN+qd%dc'l*qqt%,D_n[m[/W0YekfD4\&7CQts +`^>W0Jf_G%(K7bpZQOs%Bf>JA6[dtL^*I!#0GnRIc9QOTOeW,r0p`sKi&ktj/PnTo_hVaE]AW +kkRH'AgOB6<-."*B[6cN*KL2BKW9[''I\_P:i:LM&^>-I=pO-V,t"b+UK9cC]AmZZ31e6=O5kn:!OI[W!T'5hh8H,&8Vh +$+*S78EX8*.]A6_oY[blYXuQkJFR>W\L6jM#DMO.;P0*Z7+A)rXD$RUA4E+!bo:XWB'DM7X?@ +TRLEX"qS3,EDY4E&4rX-`3.E6MR%[RRBT(Z'M6&XA=VS2=ShD?7A/KSaT(V3U,_S=Q8F%uCj +Pkbne(:;>#B,!`9fqi20i_RRhF+%#ifGr9cqTqtPus'0La425j@IGaY3Xs,g2)AC"Z[5_mn\ +>.>k`&O5GT[SFGiThEAj2Lq*iahCa[B!:ACMO]AH:f56"f:`p")[e0s5ME]A`#-E^_3q14)o_F +9N[NT*RT'7qH!I+PG>D\Vh"F$phV@i#bAJS_CadI[tN9U7?4M4OZAkbJTb2K:?^9?Jj`SpOM +a*6K;/im$^__!!;/U([>`lYZ4]AdbCl3oFE)NYFZ%gm%]A0JAR5]AVquAToqEWQ\hJG`iWhkY2W +R%bIP!/XY-;[V;Usps]AlrG +Ns#edcT?SUU_#`a'`f=R/_Z!p""i4OBs82KI/>oXT@VIGt+=m5kd~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +r+,^ekY2a4-[5&TXh,,b*]Am$pW3sp)c%LasU/e)u"8 +MJRlqQ,?^isr_ZWVE +BYS7G7CfI!=TM[R4;VF6k2`mZdb2e2ak6iolp/6&OTL8In'oZW<4tlME!!d!'%GW![48TO5]A +q\a=M):+6aYOqaF_B +6k>r$d\FBWLr@*%]Almf97S_ia=!US:&ffJgZND=b3ifMW.o8cs0V^lQOXhTWfTiV)?GBP^JB +7n=n1gUA"l$!Sh(iK9FPn1)(\p>Z9;G9KuO;SPVg%oiD.:s=Gs.;@kRpl$4BC&YSR3"+'9l$ +aheFZetq$DJ2)qhJ$U$hE/'a$4s[M^Q:-;fXW$Gi>DHF!0*CP"LGB$A.2u`T2DV.aFs%ZA_L +D%EiQrc<=pdjX1[#]AuBWf/$bhW9Uq:@+a,8g]AD5JDl+$uUgC$oJd=S6A11CnDqkm=Ra*c@a3 +P@)D`J&+orHYf%7\rL7H3j@EYOo#a&IDLF]Ae\s?TPLno!r&Ai5VGaSK?'J7;=.lD]A<9+B%[n +9r>0mQ1:*^p\5]APr[Rleno=g=<%)FA,k:*FfARKa$\pC)n>m:=i6OI?!2A*3&F09"M +E.f%b\e"!P(4^46*l/dCNUXMuKGT)u8Je$V1le\*6A(N1scn169:Nf`rd:A@C`+`f+OB?u+u +F$9AD:rEo`S.&>;VtdhFKc-`mY2cNbZ'JDVj9+RI4KjQ0/Gnlf.:rAA*kb_a[u2E9*+lOeYc +RrB"U=BDS6/_g0,Ir<-HF4h/UXWZGkk53(F*6\ +kkN^dJbsk:d\IT+142ignEF=V')nIl`_iDWGZocd(1C3>TN6dCg8dlp-M\i +2HW5W#>5cMMRJ=VRE%%2KbYNmI6O59'FYtg4RVY\q+ +M'2r\YV"=t/Zf2CPET?;mLTKE1i2$]A\V$)[S5PmfAPthLs%=Y.9**F*7^I\,4tPW= +0_1B:"'c"ET8 +`%eu#g0qFV^M-^mKb161Z&p)Ra!Se6[S_XssfHcbW3h,7pm&fhk\%i9L1-_=M?(R;4LA[N7.Z\nhLBKXWk5Ap%@IkLnM(rmL]A +GS6Wo7:&+S3@il?)39+VMpfB8g;A"7iY0*F9F.J`E9ldu9L-JpMR%G0@KE\G64^;"6CF`RM" +=M`f)9KgDhI,g0J3T>tS`9?dAr/0[["6RP +H`[jr;"t)l>H/2=9=-.Y.@:jmgZm.E=`Es"6Tsp.Zr`UWuXu2$i)T@5-Jt5=cEpF4eWsrU?k +[_9+_j"\r^+iRJf_4LI*7SWKoaA8:E7Ud_ +=\I&Jlmel,2K&B@(L-/9>sGWdbmK8dR2NHM[sL'SSplme$UZ=4+kJ0e]A@d40)Yu)#%,bb"3J +P%C9TelCZ3Xb*%0Y?9kfY4T[5jde+$Y]AceaHoIgP?IW)*N7gupK=mKPFQ0-('U`^j_?Pu"9O +(lp&Ll7.a(6E3i.KB#Jqt)du6 +3g#ANh4?AN,3c&F8')^Q*l9D\sK]A,"RMJC.tP#FhECK\?m@el&?,6f`3GlQM<'9"*_jPX-nm +RLEIZNc[f?@AB49TlkA)H/abWWG[T"$mBeHQ2XE";/D/gL#&(Ld]Agr*F',<2I[F`W +9S#nV9>'9/O[Xa)T^aiDXGM[i[;6pHt=)d16u;Y=A_S?5s?r/;?UIWel8.=iuN +eCBk/%$@IJj]A=G-"(H3i\i&`Hur@sd!a2E4us*be5Jf3du@B6`5cV[=W&JB6sVb?ae'E\cfi +F3S2mkRD.;!)&*YERA7\_tpDD%RSfk;2"=f1(1D\Xb(KW7sCcK0OiUW^uo$U9uG:EWWH$Eb; +qs0ReG0kX+?JWQJG-LAphhHHJc"t=oj&)^0l$kZM@UW(AGm1X(\uFTu>*TtOaVILZT +Va>g0C1eCI_-J]AT&qrDY-/-gc5E1/N;`\sP=En8CAnTRZ9XPC7ij_pI,h64QM*]ArZVaL#<]A@ +p,0OYSj.SJ0C`h,EcQn(9=*Pom(m!lQ*`s`K*IA9NlSVlrX%Z"Am;10g8Z9]AT/AIeFEMXJLl&6LNXp=koW56=E,c0Mo!2Cu\U$QmIGhb1dHZugWo8q"520'$lo+ +X2Z>[;2+VmrKui>K`e`qpY)6]Asb$>pb+;#hlL;;+k?:Z),5A +=@F4T#^<[+Jmh*70p>H==5b(.k#anEa3o/]AkVGu'-i*b=M@St^GI0U>b; +19]Afa:,fW/L(\XG>D6(fa-8@&BMXreLPjjJT(TMpKPg3Fq83#icpW +H+M^qbqs,W#[o\Qc;)jf5Mhq5`IrQbn\f@X.k(F!@Y4qS1p2TWIplXoh'HZJMcm;k3//HRi9 +\p'ID_o&"Ii8`VV^)iW*u#BPZogj?Qs(gB#qejREd'?l,R69k-(HMT/F:RLB-?^ja)o9"Y!o +t7[C._k5J0aHG>mL29U\Bh9VB*ciu,^XXe+_a-%$$%]Ap^n+%rlAV,M!2r!I*bNjJ3Q^4c<8U +-Xt_rRtQPh#^KB`Fu"@m+#94dtG>4KnbFa;uW,uBCu*;m6j[Y1I#`m"(:'cJGZA9O\`@K=!L +kZN/N8D3d\]A,/51S9E6%jLWNGCpY.@=_c-RZY`)Yf^*h^3PM0\bGoI"d(J>h2IrC9TdbE7;+ +(%:$CiV:S)-^R^C#>Fp`"2TQ09rp@p +NCq*>979M)d/p;fKgi^!Flk(:_p75FF-)MY0;d)Y5qH4BdEpdBXA:4r*+p-(ObP2^H?S%O$&[Vd8`U;>QX, +jBYALQR_#3,?,:P]A:+;3#PSi.6lADZiaL_RU)Rj?uMUWCH"3h7@fG"M-JE&NT'eT*K/fR$&- +q"*?_88NFQr>:b>K-WG?q_[.)Poi=NC/1K&Xc^;hrN4+fraRcsL\j+@@XR&fOhUUK_6$#/bK +L+%VsTVI'*oB1'8;68P"fD[h\REHo#kTFKL%/"YU81-CeRA8Q=`auEPIF8@s_=-oF>`;XZ-I +6ISAO(X1g#q+0o*Cj`^4/:"aSF'cskT(V;>I/%2P#MI,Z>"tKiU"A5Mr(^mfr.[&lOG@\']AH +KKCCA`6f4]A"C>[RL12EQQa*rGpmoq[L;/h+EelU`dB+\Gra1'<1Sg0L=Sjf0c!FD]AcWBSPQX +K#0Q`B7+iH[HEbJ]AcDhcNa/I*"PMh3ooCWOJ1R]AViIEds&*RTK0I$:1?n"=G20mt\,nc@dTI +B7LIE?'1U3<>=4^U3eBd-!Mf^C7/LMQ6HH\ggf_/K)6S;*FP7"gF^K?W-`FJet?s +?K@d;##J7&fnJR#Ifn0V-`e8E@maksFiaqdH#\FOC>iL+">=4*g#NR*AS)4I4dI*KE;^pp8` +9q:I-9GS6=r4:=X6 +a4_so1P1L?FZ$!J,IOrAO3MgP+:,Lo/KjWKcU;XoA/dEo4&s[[g:EWi7,$!LcA2n-+EUU/DW +TY3Xu8@`c/<0AGOiU<6d/M6dmBouS"YU^ZB=QZVF]A*AmIi1hL6G4rCs>V?/G:_?Oj

nH.$ +'ka"6*.t'V;4r1jS?L[oaneQ`#QYB$6`aVE!UOh&e00V:*VUhqOV-Uq+>ZmNQ'U-JsS'mO(^ +0`Z4rP;;Uon5'EkSfHNk$X%91!OfCi&s\'*Ao-OC[7=hcIh(QB7Fi2:'"-:^78]Al#pH?D$8n +XH/SbdMrJq(?B9r#b1qcq10,CS&.V>[YQcNYQ^6.I;>M6rT\YeuAm(FkZ^XSPW(= +Iujp*;:_[_n)]AO<&HC_#*<$Th`+S:I=W\TPGD:1&KYg?aq;'^.N'@.l(?<2U=nI'@hcX,Rca +l7.fjX2#B99"p#0l=a>\@qoC,Qjb,l`>c8=c2.JGbi*m,;k6>;M=S`I?f/oP>oPQgK7pSjKZ#k(G/S)JT^3UnQ(\fr\Rd;h0iSe +oZJi6$R^_T5SC5YMcjX\8%d'Y\Ytk`R696qL>VZ=H>9b'a\j;[+Phe^5 +ds3Es^q#-%)C;Y#u_1V$;@/[Ie>3JEN=.E@H4F:-'3IV[<8kjo;n:.'NnBoPh`2!bTj6$t:a +!>^-Gm^O0BL6,GF)'p._l6geG'n>AU^;*[##$N@t\)U*5anL'4LD.?RkrS"(%!GDDG*lSJn2 +Ep@R_?DY#&tf)=3lOnLkp?&SFU\ZkEi:U0B:m"qF,;A[ut9YO^[@PLCD%nOn]AuNpC/A9%mjX +j6P1_BQ.W_CO:?]A,oisOXhg\sOADG=-k]AP8X.t1@DVgq;MWu#ZX'DmmT0dgE,MHQ8*EsK95- +('i`QiuqOf'siOAOg!^_NQ(%!2I7VVs%I)d1`N*g2A9)T5a.TXAtusBsm`SFR]A?n%E/@^g2! +f+C$u%-1NXVRWcX5Wiac?Pdfi_U!FVqRn:pOsp9DKpCHh,-$)hFdarY9+.DnonOpR`e1o)HYVm3Gf-Lf%+IEYV7o?prU+S]AJc(M[tWFYf,CqJ +NG7hQ@C\9).?nWa2aL()TlSIGLa[1SHS8=.SGC]A4).]A0Mi8.+J'qb'CS.ueoX+:\,]A.T1#MW +i`qr$L5#[)>RDJqquaD-2)\'Z;/P`lc@U9)uaYT1&1pK.up!g+.LUk<;QmefVh0.d3r5a)Mh +/s&Ht:4?nT4m+8Gq-2+1ejC>W2u,q-6QT[+$NRgOhtoPaEMi.!.!c3j-&0:;jU^eR$n/`c!< +AP7VRB!DI2\T-Y$l#Kl.o0:pJ-.!0Wu?GK7-(R>tgB,rYeKjn<+f]AA+(HE%9n-p0XCC^B1#U +Y85FNL&q^74)`UpK?R1?;ZQTa*ePH#e +B?HHiPi1SA[TQ)fQl1u9gR36/JZpG(+^EAR(_YqZsl!d4K@RS\RORV?m'gp.a'pWKpgt8#@? +Vl0Sa&`ht2:tmN3/UcYYg1o\Uo-*OtqC?1GsZ8R&SiAh6o>'q@Lm+I>3!>`f*X_bESZ$oIFY +/!iGH@tY@9:Z`En3U,>=pP+Xe^(de+F9N9Qa +L4nS^?p\A2$arpd;@\>YJW^c`_QI^+^4U-05XU3ithRT)-tbsh'mma5QQkWU'j=LWRX!sN:1I.R-J1?.O&Tt +E6K3k><1\3:R).c-#2;/JX,BaA%,8ZZ4F"WXRRr_-E5-U!8qYth$Yb=6)&72'o:r.r(NNH/M +kI&F'\0;inZ68[#]A3-p/jpRr\\:fWdD'$=6epmk5F$a4^&?T`Qm=.1nQA13DSXmauZ`-MMYC/tHJd&F?mU]Ab_MUENu+!&5e)"T,HJ`& +F)omfbf^)LL)j<;P2]A]ANQ13kmfSiLg+YkXiIrfIX55p*Xs0WC^*B9.g7g=gi#V#Kj:O2n^qk +,G[nT7D**elf>?8G5!D\\b&]AA3WI!2qN%pX3Ps+lC>UpVotCK&k"5fTC\>qpGUV4AHi+auRGD:=ABI*@4gf\H(lI9K`N]A1@l-AUi%aEuE:&DZYGcE93dU)o*9)P/e?D\H4`n'53a +D-r&Hha"7a=\3?V#8(5,Rp,;d*fU>-hj&#Sbch_t2]AS?W4.Wue2(%;a,8Q2\EtTU;F1rb +#r_8_25pQPJ.rQS-rNn]A='l!.IIi:kdHdR`/!/3J:lqD;1BVA7^Pq#HoL\AK\'Sl2mgtZEbD +,jQ-[E3oDLZgn?j`c1=X'rEta-h'13dt&PVYS,*qqVg]A_?)j[*fr]AXrB=hR(QC-&#QsagL_C0$P+[-b4*Q_.lD7q-_h:)PR$Cb2u]AjCLsV,W@ +Gf,9Lqd_f3.+Fd*`cl.fS_\WC^c\LVF7)p0I&@$c6(ODt]A3>Lf"A>#_+)7E)IuOb.'%,VEG9 +!Lh_]A`#i#klIZgk6HT"UGZRnIZk*QG(>?R@$=lc;X>70DrX_6\3.7bgY-73DZ,e+&TNp"YF&S>P@@[1!HPZIO^1.lnr6__L/f=OWdNl +/R>(NANTG!4E!m7(mmcZP?[[45b4X3&Ih6s,/N2mnS)t,<;7Ls.$gJH]AIq[kDg4PP*.f*A1!MdpB.)JIa=#;'(@$l$8l)?Y[e)SpFl4`Q!09N +li>l#0qQLU1pV/RIOPP#aAb88kT+P;8f)S0X\3UT7&7X9&BGsUba(*<#1,l^5K19qe&f +?`Bc\_Hm<*Y@PSiUJp4(2-]A7d7iKP;7$#`rGQ?[t4Ts0acPLdek[7E=%XHQu$[^GlM3,n1ZB +3fqId4`,-FsTejOQ'aCf'!q3k@k3!?Z? +P^#'Fa.)/GC5ggigYZEF%F*,Z&OrjQ= +[k89I.Oifj?C">M."q;-P90P!'NGjm*@TL;3Vr)BBbjOaOP7U,6=AQ_P_(s%qW%l14h@s!/i +:Ir(UoiP/B^IL2&G6DnAd0;;aVVGF)uEHaN7R6VonFW'a`-dB^-5_$E@p;R5@Ke9T[Z/BA7L +`eP+MsJhl3TGIaSPp"#u^Yb'Sli^hH>EsL84kgp&\h6?1OnuR/ebHeuj*\t9s><&+b9ai0$& +F59+_i*!_5C6S5s5"(UXk`ZL&Tha1MXJP+-uZFV]A>ToT=K5pt4/i`fe#k]A1=fDF\,V8^^5?>AH*#8%L^V=[;dmRo4L2=f._b=hN?D\";'Q@7-%Qn`k5P +kcWCGMpgl"#\,WD%T`lh)n_im0YeFmT]A^AU]Ai7Wu"<<>$&,S)Cr_Vl%4X79DR+qi:OlaaMGm +SM5]A'6bj+03BbiSS`&3+)8R.>HgWefb\5n;pG$2f22_T)K%#3?uagIG2Ehe7YNgL7,>lHUSr +:%Xg"O3m2UG&nCbk&m$pse"tl0#b(>-1I]ALHeNiiARl>]A@D*.F;&@&-'X1p07F^54pkK?i.N +Zn[RT0:'J9m\/-P@)T@sc:;slN@\d1D4I_K+nN7`=HHQ(Os.m&^$5uZFT+GogX4UGm"eH]A6l +99o7GIIRb!9pIZ`$qL$Uh,p\E+6F>BXQW(<=m0"2&*.0jXZ#jom&+l"Mr"I +MR3=+d[)f[.HG9=*R6C%DITW5Zp-"(69qUiO/+dIcYSQ1,Ho(\p@SK1@m#CI21Tbu*/ulWqdbTl^?mIA[!eY/^Q3;CWq.ldd +gHHe)]ANMcL\lh0Pu2<\Mg[/3-^)[!K*qPMb!*p%;seeWfeRF_Nu@Sa[7X"QUREACH1^s-o*l +5nQruKBOM0cljX8odd-6ToYCggS:^SO==c:J3+*_gj%8l$Dkn5A<:: +]A]A%j;H5S:1$Tr_bfQBrbGLCdf.*8oT^8Og@-Nkh[!>%>OUo($&Zi%1KU'"fa&0Fkt6;?T6)U +P`R)KJ;I58`)Qk]AAi'n;WVH8'Ce'2R:6`=<[RhGlI,gpA@^"aF*%Ng9+`2I@OulNJDWg +70%iCl]ADZ\^q/:7V;20a>2r%*Jb)]A[+o#=T)%ffYp"c\$JYG-'N!9K6aL!Z'B>Vd9J_:^O?< +o8Y72l'b_lm@@9cD$-gh;SHN"Rc$:QiSkggKhB29%g_6+^hn,`ml$a_E!/mBtgr[0TaaHTkY638GE4CbPN80b>AfR6E-?Ar:kU4]Aro9HF.?FpP?g]AufD!b(Jc +tJM;6rh'>F):Zq\fNb$$?BdYEDW3<=(n[8a3WG/hFuPXnAR7.@]A\KR@dQ)Icf%NDb(.mh3E` +1!:*U"R7$Ts10Rd+@ksb,bPPYOE`Z?@H4cQ%nCIb;hof>?J]Am)WLNV:=g/'$7RLc":g4YR!< +s;.,5`a6`36?$*oQQh9fnbAR+Dn8)bi?H5:?1ZT--o4$TCeejT"nGqdM41=h0@M8dBJf*LCq0"5C/M/bV']A]Am +HnKWQ0cgXb>Z,4CUD>]A8"Z9! +$'0.Y47Q#4e\%a,aKk*]AuY<"&U:9K19(WlA\,".eBOs>(bNNd/WRdSO]A5V$l +J&dBo-%Y +uLXJ*6#+F?_dX\kDClc0s+_n__]A+R/DqSN6IfTo1jQ/8SHm7a:9F14s".s:uTX9ahEQ+2oejZ`1@?4o-5QN\5Jn>pim5UXpL5#SM +k=*o-@N4nM4>%:rJU5Z(TiQm3#J<=ShF`<]A?0K2aC`\6gP&KqKor^BBjp.OdZ!Y]AmM(qflSJ +e.Lqkma/YV@LVb`:X7(O1YWlGMrU@qljCcF[["GTE/Du_AK0$'#j>788&_O%GK8c>$Sk +=bT#+Jt9H$s2RaZX\P4b36>@1L`1Z*@`Q?'R`_*^5+ZP)l3ib9ZsZQ+iMSc:g/hMZMtP6YYbnu2%\*#8.sItYMqUi#R%_&&^4oHe+XR$D0 +gKG*32%mP&LI4FaE.p?'9S:3AX4dX5SiA_Df3,8*aN)e_X:Cbh-R;G8V[^4]AgMsO@Tb`U@GKu!b6IFB,KB`8gL:.:LMAqRhqF-Er/H#P +OsKkH_#.qiD/u_V4:o59U%S_dhZRcE#W]Ah?!,g3mYYIk +PBEL:bbd6sJQt'PWcC@-HRnnu)+POhsCb610]A@BMutC.GBg,D8(f-.X'ILR)RVR0"r_L[<[c +a8>p?b",PjlCJ`R>km-b(Ii0jFI4lC!fp(2sDN]AYC5@)?!TA>GZFnT ++P'C6l+P_@1dJ%WQlcD)=5G[UqP=:`,sT-rAtEeaTtLbD6uWt;.]AOAY;S.,=\3G&R(!IT"Un +DFN!/Njd[JRXK1;/n8eZG*Ue/d*oj#fDF6'n6H-M(@4$L1R6;Me( +H7k5"@N3Eb?]AV)1g@9XAO)gGB0_(q>&C74lQfRls-4_S2L0TNtcY(>LWu22 +6p,q*p&JJ&1F`bt_*%MOHX]A$fdP>\ktJ$(@<[gO),r$k&\Q\qM;jc4'K;Ao(EM/LpE*D@+Ec +sAbf$$*IdBK?+.)ZFX:-N\2AX0]A:mL>shq+V]A4P>ZcAa+pa3nAk.bD/nSoI!CtMO&L&.aK*^ +uX%WmWd==AoEiW_;Yos0;W;Pon=ea)Y5\4!N?,%d,k%bdqI3sK#K8m@]A9kA(D$nFcTX9L8Jl +'q&CFj'!8E+*Of)RQl(sOB\Ee004J=IO4aWWdEU#:/F@j"USrEpdFfB=g"MA?F29[G7/]An[1 ++$c7dT'WgK"M]AeQu:1E!Ub`pUOsq&;f4<)te`Zm +e%(`Zr8/+)<3OjSrCr/'aKa5\;Q(7UQ'U$>j[a=,KPk#0:nnfe\rgLoe%%W0XS8'2D(kM3gHIr?C+A*V)?_h4ee6.34DA8_^"'"0iX_[>B,.3>8(!bS>mn)o@tN&fE;/n_i_5ogfW2ak?fo-0)%j%4+nlHJ?Qt3orK6;-u-_&m@Z#8qq3?'!pVE^,*&k7q`ge +c)A]AcW(]A[nt5J&*pLc"F6n:L:S(Lof^;;Aft&XJe?%1)n#J/;;t%#kds+XJKK2ACT$=WF@P& +onUk9g_;QKC^:4L5`mbED2g:!UE@2`P&50s5qiMkpCF0`QKV<-2Cftn+eUfb$VpRdlUf![\: +'cpOfZ!cB\Mo"V9(s5T7bS=N(h;F_:D5>LZmgZMTg*RuNdO7E?L?=BZM;/VYY5c2OJZg?4g$ +hZ.kM?4n#1F26^?7$]Aq"u!F#LtC6eYQic:tX*IgoQo"utE< +-O@L0;BsG1@e)mR[PQ^2V/0t=jt)W4M(>9-q=bnJBha)u>_12NnGkrU6>P0%5G0S.e(4$*@7 +DpRgUm5./hS0V0[a.Tc2!+l=niYloP"#G5A9-`M,F'4^XAJ#mW6VK;VH_ga#hF*@0t0!IUY\ +%,*hG4RB=JKq6CphYO>\C/2dGJJ2$9sY('Df=l-4l5/e]AV(D>EB)dj[NiO7M9B'fM8fF!oPm +i%11/hH/s<*;cbfZT7C!EZS8c?:t^3/h6Ms+JjC?DHb4E+L,&ke=`]ALHa@Yl3Fi=qDTP+X23 +oFs1%>&hXC76!P80kEQm'>mOBU$IMhh9Xh$f$1gSrWXF(f#9,JOKN8."'bbO +::D.f?nRMVc&4BO3()MicX-aL[p!"rG,8SG^=?jdQNu_rUR9'1::!hSFD+e[=/43KCq+Q?W7N$B74XbWcn.3*KVf.mDlRC7&dZ<=o%VDR'ou@'(O: +aZo'oL)A#N=rfL.u,X"3*iA%>o$#+50W[98OjHNpZLC(L,r>[$=XQj/)LJq=d-NWCUIF<[q3 +NGX)\n,0S4F551!7enUc^I:dl&g>O"#.MUf#fS:H]AHd@1qXr3O2(fm4Xc-ap`!8jIef,+7>[ ++BnIrKGlE85TVH@jI/+^ie\`rLRdOj:MS>hqA'BhD'/oT+:a%_L7R,DEu_GFQg3mIhTPHGon +-q#>$>;l=jg!T=G-64Q&RX;\k)n2>YF.MtH\GP/T/nO:oT>3_*;38"YW2VSZ?Yk(t5-:GU'e +^oJe`Q+Gjmck+c%?O\ebsYo&3'jm@H778KUi;bEaaDB>kSTGK%m]AnYG4Yt^CTkOXN=3PtMsON\A)CQ,RoJ@FXAG +,joloU3TPFTHa$bi2T[a0.OHWo)WiU^J=48`G1R?uj8kqeJRcTT-p<0Q#T(N$@5thcB7?:pU +!O4@>!F_6MF#(EZ]A[]A6VZY\7_GWh.UtkfD5B;_kVcJ4"V=g",8)%:B/8F'URFZCgP*OFKNB< +VdR.:MI;Ugh%rO5+d>3Q[s2jDTDqoRP(0)VW>R-`h>HY1#N';kRbRFb'G?(G.UXOZC;,@/h1 +a>le58a/7iY^.jr25dk`NK'1*AG[U,Zn:F/OO)Cd=1CrFZ'@bS8JK]Abe*>jhPiq)2V=q-gJJ +@`%j^:]AuZk0l<@lsBCp+C!gtO0Z2O1.=#3oP;dZ&B>CUC9\(g%0buc?XY'I+!Bl?3!M;YWq& +Hb6MCNh8/%">c:LB^&#:m2pI9jQDRRdJ3.i3<>\$;CsCU3p<%oh?.(F-$2#fD*bGiD(hB0+X +VP`O*otcep_H"4YOG$A1g8Zd?P=Uh97U7`SA+/W#"bF:<;EZ=`-TDFQ!=:b/fhN!1fs"1`NR!:*Zu.IPH([Nj>91'UAqke;j&m`rA +,^a5tl[VGd/8U>tl>11Cb[)[I`+%F6oBqc!sB*pNcJW#0,eC4T@l`O3lmr,=LQhe`:Ju$2T@ +h,2]ARrh/B&pp?iDaaI&Goisbsl"@W?F'j\mii65@pRp_uff)A(ro(W68:[I)QFC95C]Ab_G,n +gHiY8FDAU.a0g9joUY,pj"2U2rV#$^dg#$+Hf?R/,B0cbnkNl=\+ +2:[+3RN05^cj=f9r;D^o[)LW@,aBkM[,9c;-"sd;uAL2-"Rbq.BcKMGqGU0q0+p9V^UQQA-[ +j[unR<9`5"??QK6@)A)Q_[_tTppo7C?7CIr9a.j9H%ZTPV"(-D9Wg)$@`H;AUidicuM'q_l_ +;P=QN*7[8dQqXE.N:HH4IM;]A(A]A5H;+5$GE+h]A>'/HadRI:/FQ9S"j1V7!:8_um'fH$85:SN +IiBuBJ6"dZKhq+S)4]A_d+-*%]A\ZaMDODtS1[S#>XDb"`5b26t,3Nb6VE0ad7W-Yd6-:&6>O;h[YnK6Et/1 +IGS+W*bVi4FXD-Tk:7+9mcpJ6K#>WL?EaNEmRLD*MdLT%c#R.R,!5`\`oNg^*.V/nt/NI6/K +_fSjZ@bJ8*?>E.lQjaZ(`JFRkZ`\5/564?_OO,?GYr;73b!$'4RV6CbS!HsTVd*ilb]Ace!p6 +#[oE1Erb0H-0Xs/%;;DYRr8`>c4AhZF'JXAcT0eGoqH&X +.ohKj\51F'TXLI2X)8J$C'8rY$NT&b\GYP#=1!dsDLh-@Wm@*[3laC)bZR5>F_++#>ZqejMi +$'iTjm'emF^:Wdh_1h`\]A:,f`p^hLu75&L.LRO%R&i7q3)8n-374c+fMRtA2e_dra::=cSd^ +,J*GB[7,I+//???&fM22Ru:.(J?:2]Ap`@R,+CZFfm-?TKn1r^E/?8eBcbd.4g?.Fu5gKoWq^ +1\=HV6*O2&6?[1r;7EJ=^l6+!V?1rL6Z>-;!a!B3=5*\*C@K_Ukm`N6hD'Z5uZ9U:(-]A"@Ni +lIS3>m-eF^t%4F8\8H$)*V\>nV,s7Sc=ZP1aiFooNRV%^SmLhSGrFa`u?Pdk%sb/1YBZbW5m +.:p3kk"'QUYp&m4l03c`Pi,eM:3cW(!mI"AQ>ZD-cu9q-68GMWIn_r&lE4f>`tI.#YC4I\<\ +QC-Ju6AYftCAD`:>sU;lfYI,6gmQrU/qV&J[kI6G^*8U2c+]AI#dP04hdJjjSY:X7"YHW;6n_VZ_166(+`o3N2S1INn8'cbhB9cRZsA9U<>:!@>Z\N/3, +$K:Q>DBEl?O]A0MKeMWH>eYT"`oe_?JS%fk<0$/>>[g`rT,a\h'[o&J2V0k:$[bue_i7t1*CKo[XQDt.*OZb1Zmo&8?&D\]A>#KAklF?/6=E;?A2[pm<7! +PQ8YQK(^jKY[MMLN$%PlpKO(]Ag8<>@rN2K/Du4Sq)LVV]A9/LiooJC;th+*?$]A]A4L70++LF1; +2SL0)q%03iQ8#ICYk!6qpH9KthKV)%V7d'[[^$o7TUDaQsf,$12@bDs7Y'Nb +hc.Wrn-9G+X:7ET0`f15WA8%)G6<"2k?g,(P)*a:1Ul[)7fWQPN.CWTANd!4PKNuY0IVZ0Hk +r51rs+9=PE-!3n%Gj*:\XM%im^V\p8H5@EC':%[aW/tAmh"LTj%#L*UU$C1oDneZ5ZdiRU4s +'TfI6Q_(>7]AA100,e;4eaE$lUOS-BEoAH6J.'r8Jm1GrTpl/6&+3.0 +D`-7Q?C_pP#6DYr;=*Jq]A?JkgER58BO$YB$,!cjfcJiU:4/^_KBKg['$]A9Ha'^.]Ao3S[P99G +Mr"Nsn\\"FbF;L78GO@di(]AL4q +Pu"BX(N'sh8M/AI;r7nqn,"-VBLmF: +gG9QD\hLHfXP9#?90NDo=5#2hs0cCCk<8mHJ*X/r9 +A&UOlqkZWTeI]A+_,Oeic=V_@QR.T3*VIbW]A5[,sPO$@En&[d?'^H4fPjo3/@d"If/bJn>%Q[ +1nP)rnb#5RYfAmagSOcR4@FB`/LRS&24$&'+r2;df^K*AF##?e.Cico*@f-[)Ld$uDaQDSte +;?S6Db386L9%tAc[q:r"6&WSeC")rY>H;Q%Ogl#T[e8k9&P*!rNYTsI`a-0ml>iOa%/-2==C +@gBZ["Rl!cr.H%c8k-DFV7I^1Z_mp*4Zi8ETIs3T +#(-?,K77CR**%gd.bqH^c<^X))gr$1*-np*c_($dMf]AX8e:OF/&/1ta$-_ldecE4Lr@=+?\+ +ps9`&%$^(l:g`cV%]AXsak5No.K1EW!,A880qs$G_qXt,*UXK3s,?*h):9#pAR<-ooLJ3S:6WH>2d-K&>;C:\LD7MDFj*N-M#J=nfa +1=HDMD6KBkZmO5e9d^#4*8l/jFl5`"K7trL]A7T4J(e%N/QKQ9LR*&aAkTsgCLiX:kk>t(:iU +?EYWU:-)kS>XP>%WCucGTOe:E1q(DELaYDsso@on0f6cEH9s-R.DWrV!\@A?o-+T,]ASDQKc)gJB>E`JHLcE +UR[T[BcMTcF_%Z!l;5:C>f`a;n5#cu3CNrB6f!;a7k:=07^_i(>HS*A3O/7q#hTY[qVkA_0W +j1oc:LrdlOOc/LuWU*[>fXf(Y8eMkFh3/:42[qjTo(P/TQs;OX(%Pf*ECY_+rqsqi(F`ZDk\ +m`l\uWF$TpKc6]AADtBIIOqI%hFr[YcQ)P6?n3>@&*F>,dB&8&<:UkOYsG%qlI38Z.7"iSB$# +Z+5&MGrWFN:lHgm+K\5deo$:ajGUnA#&XD&)[5A(IUt&T-SioUN.f]A1KV=-e9nh*5u)1e=HX +`/nh\`5\n>rs1d-S[fC//Bo:Xt/?ee!eHWe[r>Be(&<8CM\u]A99uW4H%jF/`jRpC1ii_,UeH +3buWrV)>KjKB,_OkTR_L6ObeNio%u08DP(-2gX'VYu#cY/>H%P1DjeV_[#PDgJ&/_k3rEi#t +nS[7lt"H2OKJ4*00\&(rb)pa1krQ46%B!JlWh%4Et0SRcU +h]Aj,d)Y%E(*Yk2,cHhUQH)';^`(=Z-Xp7X99*t0DZpTV^[]A#fW)EFLP@_2Z3P2(^,&u:kG'G +(-Uqh%Of.$2g^!XXoQI<"8,ebH:?puqY+&1(dB+25/_&G0]ALcbY@@NGH`^Vb6VB$6$%%Y?"> +^9&NfoZ23B;(I8&=1*c[cJI[WsM:]AY(qkfnb,.UU3r'k%7O^H/`SN(+:4EUt8_Pbf/VW,f#A +*WELl1-s$13T[/m7f[^S:X'@T&E"U<"S_k!#V)J.dDOAHG8(k6Y)BD>DCUt%HKgphR+bZ>B!^/7 +`eJak8Z;MVS_&m6Y8T;bGhmD,%h:8;FD)D.bXGeLr$"RrbAC:! +Pl\/.hao*B%[5Db1o1+326SO@V:ROM]AA,1TOB&37a&CN$^qnUTJL:;u!O\?F8qCs!/DRj\Qq +",@6.d2>p1// +9:EhpTuYC/ooB1fKGo4V^KPU2]AM'1s$73ND)dl)[`)WB*m_$,D4'E#+jG)oP$f^[a9q\H\0g +TboiT+Rlhu"!D"!WiH)1Q/@D^`[=Klb5?n-0Hs+5@A.\If;dc,O:+9\#t,%8MNc\k8(nl?J. +rR#$>h]AZWM-=LX0dTkL#/pk,Ie4U'cUSVNTs#(\G(I6L*ms,$)<;J"F5_%eo'17SH,cIp?"0 +Y!)WtS]AJT&IC=D/k^k?8I_Qo*\_7EmKS/>Bo"?!=4kNO#>ibJHhFk7*Wg%E$D17rO!*sG18[ +fH[u%T!<[:]Aefk]AY/a%^^65H/V&.r[#nBtm-jpj(S0ojDpe*=i[rZljh_"$W2>GXQ`HYtU[Y +4\r:Z0R^D%Y93$r)%I:):Ad?A6$EY9?V'AL$S_YT,NR%!2L;9o7=-n&&m1G9=+d(300cTeRR +8^T-?h7lE3h3:sV2#TdR1NB.T^+P'LA?^b-S*De$;U7->6UU?i;Qb5_BE.3!F>=D=2"\28NS4k-:PU5_5TC.)!Q2ch[%$]A.FO(e!#MMl2I9Au:JHWuqgb2[D-45; +OV)A!8>!1ruE^7ZKVE&qYEZe(6LUs)lr(PuBjko_3,1Ob,+t/aqdo +j?_S;&I6O]Ai[H;Pk-d#OPH%#HcGbUnIj'7Al$bgan@Sk11ko9uBajDEQ24Ur0&jO,ijH7!"" +&K'K&!fU<>Hl0>Wc/!@?<@/H;4$c77:(6_^#LH7%caOG\=?XOU+RGS2XOJ+TB`\lAf:?AiJ= +L]ANT=$bdpBnW5&g",V=A+JoK0NtV?f/Q`(m_<4HUb79e%!GY.$>aI/p)dVE[i3FcIrjI=YK\ +:Kr[7QBRKe`CMHd&bh!icO!LIfRW`*4iOpZ^,6Zh_u,!.]A"_V/&(#SWdo>?$1d<#ho78;THS ++cU<8u#Ob*.LA2H6)5m!pf:#2MBC-=qFQVf.ed>/!3F/+l38+Ag_lGpUBfKUo?Y[.2Ri^]AMj +ccF=u\a\qVOV12^aGKlJd/G&WU&MiVUAqq@_-!ka0KnFkH);=Q9iC_5IhNmCI-&R!FCCr#EZ +8WDe^"?9ljjM#VJa;'mMFa)]AId?D2M8O5Y+P'm[,mUhb`scM1[L?PnQuh/^r*i8PfBi^Uet' +CW=o8ar7i.P2qH,8@Gj&#?0l+S\7*k!E!UL0datU-lofog$0QX39`'g^SZ9iu`C]A +g'e;!HAH`_1g:S-LO-:c_U)!Hn=S" +2j)"E:Sqf&0K1\s0*'k*o/pq>u7C;*%_T>)c@bcrj50e_5jrU0)Ml"NaGN'b?pELKs*:+aaZ +_r5:kXepk`BQ&E?O=f=%5RQM-,7['nX<4;qU[LnKRRT&Em20@iR=-C_lmY/$dq9&eE;ZH +8S-@+AOfNp]Ae:]A.`c=^_@a++1k9)4?(IA)Q,LN +).\LC=qt&=,B%Dp$iHk9\)=bBW +Ur&l?Mg2CR!$,Ir+NDKK9V9.dZ(g23FAsR_&VU@Z5\qgeP,&p0&MmcE>0(>q(Wi%q_TKE?AH +]AYK',9>19p3?HBYs)#;V1gB*=Vn&TIP\lL_DRuXlY%oWQR>$Y`FPVTSZ6TIcW= +K29J\n1Wn`"udp2.KKpM:Ds*?hp>_b@RLt$D0 +%SJ"*+l"%,D1A-)Ui(8\/5CoMNWjJpY1A(eZ8QpG/We?A_%MXh(A +Q0Ya;lWC(W1LBFh<=+_#t(I7kfUR9LNi9eBNbE=RGl8H=$11b&Wrs56DqO?i8B0*Klioi@fl@$*\(D!b^#Hni?T:O +lEA>Btt-CYK[LZ+R#bm*3l&P@PL.gM[FnnUi'N1`i@ifGiSs6eZFC4fHJXm.`>V:dXBlL9*@ +F+a-ZPkLijrL2Sul9+5q%mW +2$M1M._HH=n\Dp1+lSdl#4%f4S,pLHhX#8"[oAJnfTOlG!6`YTC.%R/95`X1q=,`Ei&:bo/A +oq&t'R]AW/SeOuM,Z;*f\)k\YiGCG!FYMiH9"1CkHo?dt^h%GoW;f +j345GM3hOf1n8-c,dA8sm7>-3m1i3k)Eq8[M3JOd6tMUjV;.XI +VG_Dj!$j[ELnZCnC3B#ZRiKel/1W``.<%Xu2H876UB@B\.[AZ9*?:inR7f06)*[i[N&dPDQW +3dUU3K(KS+HNe*QLm@gB1*KGG8?A,Nhs8"lZ0\hOID&VCoBqo +DANK&@\Kp/IRX>5Fhm+/1.[#r29p*BL2*%B^6f^aYTXMFU,&]A*+DNY9;VE&>B=THTq>B5G9>X6jsP#KH01MuF>-Hu*N4h,NXVd +#SI#=6Q"h(dI^))p;]A/i1m(A9=2\2n@'',4L?^qY%^gkE"TdkhQ%%K3Xn[l!5/[5.f*o^,G1).'!6oUd=KsRH4W_GMb[dsjV=I(Eeaa_i,QmFDXFKP^K +s'I2rr<~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +fo7d=_P*6U/n6/$?Yd;s.:;1e +R5tc7&:H@%ngb?84mq%KhKHFGUAt;;D]AS?ST9@/Qr\\[-C62QIrpZI;G.39J>d@J^IorHM0c +:Q)j+&o8AbFTo +B4,]AJZF<(G^.%C<51rqH3Ve.iZ3ZmrR=If +02i-gIM%U8"he>"dojUXG>"s,KJd5Ic.9V#t99%M'T +;%"iUMf>(e``LrmM?Y`;-"N&:"7I)9`kW[)E_h7]AOaoB'OWk>,1&aJTVJOZGDjYT%T'@6PbH +5\/MEVkoc'I.*=XNQ4Dnp`0@PcVZhEkL1<\%TJ'YJ&-t@L'(!%4DWuBkcN@&fMG^Doo5NUBq +23U8"D#6]A(DL)u$tYhDkWR`GB,`s)TTZKk/p#L&L>iQl+N+Gu%XK'`+UMHaLNe>?Muh4]A4=E +^K-ct2gTfH/EN%5=JPob'VlK'%1ehjIA-9(n\SI1#I]AR +bT#"pP;$".Et?"-&sf$W(=N=BQ4E6fci=RsTD<.C7LOnc\i[SXhWAM/sfBB.a.mM"m-rP$ZN +H(PMNRa^h3CR@0Ht&Rh$[Yp4"4I*(qAD>L=O@s^t`daHRirZV_s`rFeNCiIcp9aJ42=]Am[I* +I*fJ3#%#K"RRG_ZS1>P'ALVqjHp1QVKG^J2$Ro+)2V,&6g%ajjBh?D;cj6:-!e,TT +$2]Ai[l\R$[`qp3IbTbaH%2(5i&!eO`S.W+lY3s4(%O<2X8]A=@sLGenc'['R[.["-0>tBYO?[ +s5k$uI=5`)Wb=W/s*#XgTGS4fhY]A@O>eP?@j=pZYmfRnA8aWm2k4u7b)(>E8(QN^9r`_gJT1 +X+1mmpV/l^:[@i);AQ^Rs:E$'E93Y999lnF84gj1*OAs)5`5W>S=1oaB6TZ@LE@+bjB[GkAq +oa"++!8I4s!Kh:;uN/h4l2u`:8E6>.3&[`_<4Wu!n_MYk2XeBD:Io=7Lb=kWq?&G"AeB\Nun +!YIMmknhno:6hc,J#?iTsV6q!3KL;c[D^-NlQ$HfY1,*l.4H^fh]A*2-@nGb!70[kZfB=;O(b#FKVBf1%LR$X*`_]AJl'B)T3K#gbcJT +>1>V7$e'"BnRMF!6@,JaLt:e:GVAT^:s3_nPVeI/\&,57/$r*mrB_hd\,d-q%;3P6E?_`b`f +e0a.2/N]AGhI7PP5K8#U.>"j&JJATA5Mg[R1;)]AQO4HMRF&O6Yt+b&P;Oa[46.[,Z>9Y*)3IM +q9(FMG.J7W75#8=qVE-3&p8cBApGioS-l8intNbGSmbK1k\\]Aj(CH$HtU8XYRTjrT6W+b_*X +u=!a1;R=AJN+\a>k/c%#="2DQ%;A.Q\5K0_Ib=i]Am-04?RM@m`\cbfh>,GjXnaPI.Zs=Bu3# +K"p\Smk2]AI2FS8Kl7hl/,8[KZY=#$p/#j`.!Uou]Aa]An=+Yq#:?8@kNMT\'(#i;I5^'3J2-Z1 +prI19$^m9Cfmp^"iJWm]A=6>U>.'2bKroF_Nhrl]Ap`%+i]AWPXTWJ)6SP4dkYt^46i11HQpE%\;0k5_Jb!M;!r9E1Bh)#Nl`"'4PMV@+OH>S!gb)`$OcsZaoD[n7iK9fsRj;Uu,^V +*un@\8[!rp<;l&p5VRKk#\+=C90"[tkebpu,t_TM>U^[69p"[Nb7E=r[$T$Ft-j5UpkeqC[g +!^5,I3t+j!3g=7"?A$l4s0ECX.kNPK8Ku)'W;=:#!b#Ju"mr8cmgrM/9+4D.-u81fru,H:2Nc\u%#'[(&7fScFT/+4#<"/XY7\/!hYo]A +\n9rXqmjENQUd_Ythjps3a2%[#+BC38Nr##X/TrTEe=:U`/qh4 +WHFPq\@eET91a.bhsa"8e:c'aaYe&p[EXP?qBE_h"[MA%CuR?_mpN"HQ3HK*>l-rK:n]A=R9S +F/54SBOu)L1`S!f+WZTV'iW\C#\L!rgcP*)=#`'iX+$?:U%^^_=D/8ELql81qY(r?gI&!^#` +m=P'/6i)-R\ToQ,S@[cLOg\^0%2r*+n=31/*<=:mbNOd%jG:=]AGEPD!-daLC@#Zi#3B.kq8S +9L_sHK"]A:@%0J\'_-is%P#0u=gPTKtEa7ihfIgb&gg+poW8*hV2j*MsJ2`u!M\pTt0s2kh^]A +Y'1?m]AXh4h!Cu=V%k:Io[dTR&)!'Q)=Suqfr*V)Zg_9N8Zbd0R.=TR<>kcl-/pO4bQn(7HTl +:U-1-]A[?UsB7S)<#V6r)NddaYX[dG%nQPkq"J.#*VDWc@Dej7^Ef`M9aGg-p"JTPUc/1(u&A +OplK3Z*o`;$s8Lk]AM\7^QdR]Af7f[pHq`e(Fi\C&^O^okK+a!As*0_"VsRes4Bo0^kE3A>3Of85MmUTg[ln?"Y!P#ZhNCNY$BX;V]A[1h[^FqCQg0AZh\GbOb+VMJks56]ArlpFqd7cu!fht^@!D$liAa`<9qms +@5l?"Q`'G8_:@*h+.nI8o,VN\Z>[i$n]A2TD)[I.mHHCOAYm*cmn\NDS,L]A'+J +7B!`fE-+']AL5]AJ\ROM6o">9*;,Kc=!!/OQKObIA.g(U,p%@uL^,% +ILW4R@TEI=CGK&%UCDP[cOf="aE*=M\l]A-AcfX1qqc/E,4E=;e4CGUQLObCSm&Y%GG1:4AW; +XI'Yrk)WJeKm&I9atK&/Oj'mX,rrN\]A*1i46,e^AgXH_rUe#EA-"UY%7.:@4K_DjX1)Kq;ZF +8rs`>huq"7du*8Ydf6\4puS5o84,5Kg:nDQ5r+f_O$@]AE+5\7n6(O0"^[l!@',LM@?K!!)`@ +WmpT[8;b7A9MMhItPT:+;H,C79.N0kc6+'XNF-K+O4tD.%!Gd^>J,US$3dL,\n&q6P60G7Y$ +P#1!IfOZm1;E4-<:`nAb0&encKk/'m!!T>[>;iBa"]A8%52IZ8U;T*4q44KYYM%[qECuD]AUSu]A.bk(,'pf=Ue=rVi(lgk[cn]A+nG)?fr"pP9Ad9rhA1olK +"fX!4W`Pk[3WiE)LR,[@$>l)47YL;9TU_jm@(qchin!6HKrt.[RSrU,XnPlr"c@f2]A*["PjL +ksi!eaK/`[9';Z_c:i$=tE.+B4kl3gBH1KoTE012)SD.'*UMEo_n`B[3rL@N(<[=q-1r&BD\ +G1nQ2I4-RaG:djB2f;FcXCOWG)li-kBsfSAE3-EPYVJT?u7ngO'c&q`nPQ'j?5*hr/mig$Gp?V+WM,_hUXK8MR+3]A9&@Is,Em\/3ejmFA!L1,]A51A$\kq'L4Pe-cXdW?ed_CnFs%CD/NZ*CQJ%om7 +d)ZacQeQHL:EI_GGj9jAE[J`?4:-]Agakk]A\qgp%IfklH'YHIHTV?bi_U]Abre1MEYe_JKbV._ +8Ld,5`F+<5i)JT)%DOW6pR9dT77NR?D;iBBOML:kdrN44g!l6rD9;OZ8bXUj#'M(9Uohr.HW +9D#*lU,3?0[NU3Kj#L$3Rg*ki-%Jr._4qe@i[20?Ejs@(n"kmra,GM +[-;=X[X@0>4/ei6]AD_D_Y;S9sm?6VO/Bl#.hd%DA71l06$5".2af7[k'MIDMfedBjXhNm.iDiO9A&W]AoN1X;GY2BGm!+jjdB.4nu& +RH4I[>R\1d:01($+Qk(nk'm%9,%=JHd;['0MB!]AmSrNf4E-LCd[LcU:@iD8J6jGZt;:jCV9J +ZZ+SPlQ@:*LOFQA`dO4/A"hp!t2ofK$mL]Ae4'U?4u3lAXiE[^4kd3/1u;rtWZTPgD>U<$cE= +90KEX-mYB1/*@RD.[3.UVK4lF,TnMWHI""KU]AChbPtSADbfOjfRWr'TH_DK.AS86f +7).q14MAGh-aK&CrZBBQ8S)Z +i@C&D\Lm&@[7L,S4Cb5&2LPLn^'\VP%LjN`dB^Wa!a;cZ[-(N;IK8JZeB\Fsu*(H@*96E2Xd +s>jJ_B?58Y1GW8hC80%#VAVf>,,-jFN;nTNjbg9Y!Z73*ZR6//&I*IF-=db]ABc.cm^3f.VL( +468k"P(GRBcRISVR"^Q,9o@"H$O]A-pN5fS4%J+:14UTWc"/InNs8$ZS`SpoRmU^T`^e_D2Db=8C\ +W[^!%?i\e.,]A6X4i3[3lKrbg,dK@Ro]A.WHRof>)'CnHst#7'FlUrjF6&H468s3`Vk%mc0e>dg9hkR!DXKP.2 +ku-%Sj#=`+!6&4V*7mnfkG0F"(F*L/Q?01cLg'_imS9uO/o/?gu9MTbqY@9"b+bK1Hn=IbM\ +Je\gf%k56;fE0EoWU1M2!9;U!7sq,O3I5@-E7q$KJP2VBZ=f'6cYn$BCcD?jUpN$.$T-#OIIl)9i4GH*,%ac!9_**$G=* +eFpe,tQ\J#U\sc:GM-YPc*<\IZ3$%mV7nl_Fi2fEng%8,+iSi_s#H6hUHQ%T0t&n>Q9GBa#MmMu!8R?6$.*8(?[No06 +PAoG33,/c#gYG9"]AhVR,,j(!+?@9&T@cqgB99#p7LG[Yk?WAWkG&nD?gQ=S;'HEjBfct%J"P +P(>!K'%WAF7INX'-G.6#lP(Q=PAcEh]A2_KSFa_O=+?\n;PoZ=:n$8.G\TkD]A:60L=MJQQGr` +Y6'oaX!FKU;\Y:BY(Fe@\D^cC[HVjm[5Eu'k5iUr7jN3r5%1Oao!\_;*ndkZ>c=`\CN="\28 +/;,OuD.8*-]AG87lIG;GpD$+cVsuM\]A,A46;P%rV +aWNOkeaIm21P#5[j^XR3KV,l[<=q.g-ltZb%Et!V5V_bd!._npEGg;,UA(F8EVgO:;Sh[I2c +ORN`)`R16U3?2J)'L&t1!1cJB&3@,u(Ak0.+07/&QK(iM`4B,9hRs`:1Sb;Z43D%cjq^;Zr$ +eP36]AMD8\(_?q'>7LR-!dJ!CUj +(b4=i5DR\$,Mqq'*Y>EIk9S@4Q6PnfLd>arduFRf$3Pk>&/4oI6`%E#Y;*^N*h?Ys4GcG0&, +d=EA7S8&o3_:6`S/Q9G`\R4=cXR5q.fB@@d-PR;1UTBD/@giBPhF6-)3$/8i=gASV)@8rc\9 +Ms:@J<=e^uS[gVb)@G),Y@flm?'04o`+N+-%i@CZo+"Z(W=@";$)RU!5nq]AZ1t00,pUhY;\p +hpc6?,:rq3\[.@e.#ee,lk%6"6U2%%M%4B=n$N9*.b[l:U^Rip&dK2L(V>2XVS;C9Pa40\Pn +.;Z<,J=n.Q&OM*[:O/g=j6Es<2jGAgrXjAI"1naEqf:hEVp8+]AXrOa("IM&'N?<"B]AgHG5fr +"%p-?[kG+45_(:*jsHpr960PgaL7/;uD`!A6<`1,Aj;C,.Y`5K5Wm6bXj?$*=8[ntqt1UFA^ +Mq*/c-I^aEfmbHerV=GJ"?5$7u^JA2)'1cRQYo:k'UZaAZ"Q8'e(7Pb/pID_pc+2SG?FH=4<3mh^7U)K1YU(*bZdUrpm`V,c +j_Y?_dCA[i&eTAL5.Q/)&OV;#YKBE"^ATTXJ?=%8:<(8uWYHD-9cLK>jM/Wa +@hamP@Ck0@?t5G(_F6u +?Q"gdf,LgN'rsh7%]Af]AC%$r*"!"?WUPTgJ<#MLFemfYM%D]Ag:M."**qm(,:9+S<+DAK42RL1 +2)KYp,`bjK_85`+ERu-+br[F/g89"qq6u\@T6m&.q=Zf&e[M>/o#lCa`6sIa!V%Z*Z^Eju$I +\Fl2\os=]Arh::Dc!rrBGPu1.;P^4^7g[pL#He;[bQ\)oYh7q +8U_-O]AAXr^W3:0j*RH^j]AmsMWhF(7#IO/XSA%1d^Qe.k'!ZR@[.H9#6_6iO)3cd!1@h2^@6E +84i\Ftu?8@k9]AR5ruF(C3jE'Q+2enA\,(3?&2;X]AF5;JPm9pHI9JGehTHCk#Z'*$e0b-O"cT +iOW?5=&M8j[C+\@&5'MiM8B<RLckM\pm#8.PS\=!Q,"( +ag)8Y6-Y@tG@-EQW1<9Hh'EE?IPr&.$H%^?5Q9I2$_F^;rK!Kg\o+"H/"m+@s;#I5pJb)YoX(#H]A.&%W[3-\aaC7:4fZoYdt7t)*IS&%'aWuQ[s4LJO(!nb[/@mK(cL]A#/E_=K27fitE!3T\/7u-XiYKFraJ7]A7qS-bF%k:Su1N:g#e>``L_e85eZ0M" +14LO2Lng'h(,Cd2";c34FOcVC')24c+q$+4TpH$c(VhASVr4o_VWY9\NW0!>[1NLM2i#o'9b +Pt3E!p'Zg+QJ$;ThcDrVTYS,R^Z5SA*7nfj;8jum.h*@!b2S[sn/c?+ +iK=3Z.[1,"aXU)mAC2/T3oKTK>+=PU-#L.h>0qVkBUrUD+:/704NRr/BN*n?bHT9rD'sb-N_ +D*M54YoD)X^'+$#!+fEhnKEI!1h^d3B9$"j@hKD\iItO#2Om]A)%;4MTE?JbgACe@]Ag +7_N4I'Nheta)f5l(/f%-:3/,E]A#kcRumRU_dP"K$25R +]A7=^KQHuc%W2u0!J-,cMLq`@faXD*Kqa`nRbtYL)@X;H2S3:]AQ3.pMHmHPJb>dD^DpofOk1; +1Uq;!5EC^t!h]AtN/8KKOp*B%7"O49J26NY.>pG#:u0]A9*\e>kmA"diWYXuRX6*nRf3BFJuM*^=>AU+_):4JT"!M5oY.FR,T10HEpIcca;X(GF#k4> +\nf<8l#P6t=c[Emloo-A@-3I_r70Z<0WAaU(4,@7SA]ADMf#d&Q.tq7>Z%#bi_48M;gaH:&.2 ++>22=:lA)BOW7`*r,ABejgt^]A-Wja[D^:WiCklUQYTap2?8,J+ENZT5'KZs +'gW*:0b-dd'fqaNV>A98bf<9%WD-&u(GWDh1ea$5/JJ2T21c`+.^qo;.f8fpu>f+n!aG]AIlH7 +^d'PE:m5)h*pV=8En1/e\!.O3Hf?"G'i(Bf^rn!YR0'\21>0*-JF24iBJn6)0iba?Y@s.C_V +\9Q#C:@aO6l2EL\o09Eqs.CjOYgc1RTM@eGj2UVTtdd4J%I>'?@HXE83)lP@Da?D$Mham@(gUnYH3)C1!d=cIfA=,mUd>9>;X9@Nb1cI(+Iq6oF3pa6_ZkP]A`>[TM%I +2aHPdO,q2r_eXq&7Rpt&:ZQ'-[QjY5rF)#?RmEk>br)N3!T%nE$UIf4 +&6<,l$rP]ATBBSGkd>@'[;k2ecg'N@56 +X+eG.?pEJ5%1[E1,R5K:SFCA!Gk5(;fcVcaKbQAdeBK[`.R3DKT@#7R&nDt+0eu"2M7Pd\\o +,U]A.Tf!qNaK*TaGjFrtJc0dV0&\3pHeBEF!!i7C>*]AiWYkKag0I'0C+l07F\jg5bG,Vt*m7_`5B"U +(Cs*h%N:V(IDQ[C!/W=DhXh9cs3&8+o3/P2@NSQ`S!L/0c_UC]AS3I^53e/h"r16_cDT,[4lP +Tl%'fVh%jm-3m7:!gcR]APmP,[o:.[T>QpsR(["]Au#hFRiCV]AGmP[C654FQY^"HGd#TWrmk5" +MF47#$DL[C3KF/2*3eBE6JKP7qk%I23k=+-.:U,F57TZ%_6;h)m0#*ZNDK3kS&Q%`.-e*krAp<,b6-)$AQKi-EV/RhJ?GPT3o);/*/3_i_0MIlUP[.b#,YMic.78WgNK&qh'iI_JoY +.#mU&WdqT7k6n<)aRGG0a]A@V,i:'&Ik=@>XrjRW&f!9$Lp&99dVo+6fQ7nNj!Zql\F-UlVus ++OPTN!Sleo\1.Tj:`G0b<%`2+)"f'ModSi;PYp,OE)3pb#c3r.:lDl\_2S^+4pS(HhO&PQ-d.a;LA@5q +?2D`cIef?'SbWDU;%0E1t>Ecn&X9F@)-@gt\p5'$1/.k>!$7YqM+,;OMX<9mYE(Aee37:0@^ +Qd"q*#V_Z;ZG@Wp5"6)@e^e1Y/.9P8AUOOJK=]AO547V(D%9)987(*YjYDq9V%oI9H@@3gX)> +.Bn]AU^Wa?!Nn'l]As,`j/NSsg,V/,Um4PY!"K-g05Se]A0,0P.2;Mkp@]Ak49Y=#2V ++pm\2&AAUuN/Q#cFV;WAKW6J!S>Z/p@*HX3I^&mG2kORo_`p6PPt0[B[pi=O"N1@O,EV#d-T'N\,O +Ro95DIh9RJtKD/mPaYl)m:0#a]A.LLCX+G.(l!8:4#:BWB9.`E>VMcsAj@+eOI:i'(g.1#i3$s&6Ji<]A7$GJ51q/Emd/lba:oB1h-ccmfM#i +G[\p\`A9_g]AlRo:Je6n":7'GB[\_Euj;8W[`ei]As2He"6LMhi7OAUN!&`KT:fqTB!A;4j?(a +u_NbW`*Bn'`g:`&22.kjbFklP%OM0-R?oe!G]AFRHu[1OL/9AT]Ad> +u>pja`LAgKQmOJ1X_^:"&U#a[O?q7O=FuZ(ZMkm&7F%ZE5)eX +&H\r?*u^?Fi@;Dn-rN_kWn[8ahR^Ore"P=ou'J`a7cI^G\/3'oN5)l?,f/T<;Ne*^S7H!hJ]A +$VfRr%50C-gdl0.?V@\T)V1+-&kKhl_?pR@Zlp?EMWT/KQoXLqWq_ +%TULY:=uI&_WGfInO;gTXg%/=J$eI:U\DeO_C@]A)PF:hbDl5+'FCT5i>6>F>e/,uZ\q082X3B;BNdE9Vs&f*'4bn6(TH@T/J_:+TL%:+^P,fBX,_SJ\ +8b6bKJqc9Pk[YE-_H!Gb%ekVj*_es/:oo=3`FB_ZVH(-]Amj\.tc#VkU!@O?i +6E+Yrq[6Ia\"2g<(Ah62*qf?#142JbLgqBjh9>;Iu8@C\'KRFXWRsXZ5)p:fm.l4BLIN+Y%. +NWm^blVW:1,;2`(DO]Ag=A`bmGCsh+#/^*Mbat8$rQA\o65JX;VD#[_gQfM*0YCK2Q,OR)\/m +*XmVE>4ZIA2[HAt,2Pfhb3(.B)9&Kd4Ell0E?`ieIr1X; +r;[3bUR#j9^mBfs8=U8PZb1hnT!X8<=GiYkWHf;R#pU3Rr2q;)j.-X,1ILrd-WRc!e3<4_\6 +/n.j@\^#&W0DmCb@Z)OcMc=X=C/DYragOoQ`fgM.ibpo^u.5R"UEcW]AZ8P6>%[k +j0iO&n?R:XROg)m;[]ACQ<#OE=.&7b7hKqUWM'ZQ#mIC@d\R%U>X`6&@3#94YA'$hZEoJtm?B +J[PPcX9O1oo(cl2nWCn[USi[!PdE*:TUSgnp/QRdRL(3$_S@Z=+s(OV+1;JH'7*`?g5\Qr7RjT +UW[!SBW.VK8!t.c#S.Q,XWW]AER^a1E6fWjG$L.9#shKuE]ANlG+8Z.9&d,Rd'E[lm_h;Y$uie +B6DD8eBN@Nd4fT1`*3'VX2\Pp.#HsKPG!$WIAOsR^hm!9FTX!CThfkVqY.If;dQTkR:j_,RA +t[)47qk!BbZ!&66h?3BW16&LjtJ/t\]ASJWHKj#nr\-nLMdnDp%rMQg**/m2D-nM6^6 +4)ts'NP%$Lk!pD?W83lpj\U=+K"_-]AE09.m]AZp&Wf5lg.Vr'W/oHb4eW''Pc9fgKA+X+]A_.Q +#Fb^Sr)J^g^[lAiVIUObm6]AruNsFG)<#Z'N]Ac:=7M3-0:fZm)WpbY`(<@?cHbeP8'W#&W]A'u +`%[_B@[3%aqTaLilhpcPT=:#IlB`VbciT]A75CfgK$"ktAoHYHKPThti&r(pl3j$X3%6!%sn]A +0-sUeSRGS#8T3-\b5OC`l@Ur(^r61$s#>]A/-,m:E/%_gVWc+6D`[? +_L.C4Q(44Dd,f;.Ti@'o6Kg;D=n57n2tUmiIqiB-pAo-)+M"+/J#9Ff@CXEt?5VjTq=5j0G]A +%QMl1s33YIWG1CYnaXk[qYTia>sFeWf-*K(U2=Wr&O"W8P%,6pqTI#j'cDU2gmd6?==aNff0 +T"_"pEK%YTK\&:-WcuBWW`dgY1pK5jt=LjHf0I^.%b"`-W\P3c&]AQa?#jQG^\/QB?o]A@53WY +FOGNl+G(6LRA4X?3j5XdaPkK+eHs-h>,"aptFeN5#q&'.BTq3__/P`Z-+ojo8mjaEu;?u4$/3,)Rdg +i5]Ab(t".r=;JG#s>tV>OUh9Vi"(56$l_/F/9GH/P"eL9$5=IR;+6cp4Z+><:g^<%PrD=`e5U +2q_I`\BRdo3h"u<-^TC31pu1@Y#GO:W2sEMc@4&Yq\$O_O%c#ZiV55?r]Ahr>0,fT(a7c[H8oMifQdu1^&Seu/bs#ZU:3bYKH>\@HKtGmeYd28NKQ=4r.Th)[1ktT?`C +E:4g$tXMlOGWe3s_^:gY:s>BT&K6HMIoMqN+mgAgE9U8Gsr5t,?oFHi#[>aid;0J;(bhh$J- +F&=:j9Adg(6FT;g(#7s]AJ?j^g)4W64Y9BjP)Za<8@PZY^2)lP3S=k*h\&sC@J`95a":Gk=e5 +H]A4K=QktNt7ZB7e"VfHC4U?1Fq@q.U8^YBS>W^ar+i$N`->F<.''3s6=.!(hC*,Itlo^[2181g0pQ`33/^7K@`$ +RHh;]A4kU&?1L=!*/KCk[j;4QoUjWJi$jqidpJm^r*k/5p(iMLNA7DNKEA'gJ693g+pr_+2'U +&6cK\Z]AandaaVfQ2EQ8D]A!QE3_7T#>L`5Q6j^E6e11hl(`Y1hPgEJR3lX.soM +I/IL5B'`kh'"V=%=DV%=dqSgV#/Q^4(cd@?a"qbVUdKr#Ia#+L,%Ci&#!."/L7utn8b:tLBg +l9[dcXk`$(6HK5n0T>QQ#p_.a#rD[^Rb:.bG/5c1cI3l#UkpNW?=KI"dH.W?&bh%rUB7=A:q +AgEo'$)&[NhGA=fr>s1?YU/f7`;gCGpj#L*PV4?CL"lp3a64Q.NVS3E3p^$>Vn0J8'Zl?L%q0YoHkL>&%nk]Aj(N:17H,#b).mF!p0o +g34OD[In+;(jFUAllCfS-^=)r@hnpYW<)cgD!%^\lM8olmjm3T)Dpb=+HhGK0/+;TRnkljVk +&uC>g4=]AflKJm>aN.pXTrViV-aB4NOOm@jpgR(1./-o98p111nc\^o,9u57UDO3P4Z=%<_@C +X_0Ys;jTFDTa&]A&uZM/fsN7e"0rS4+oXXoQhI[hq[X[?uOnU771!7L6u1+,`[WRgdgH-5@=T +-ek#`!Ah%_`:pD59R/N`05s[O]A##oO6=dGi==I=*_W?l5YdjQ,[&J*@kdh<1ej+>'R7?n +pU+)H=H=O`BdG7OW7L_IMB>g.8KRR,%,o]A$1;Onf!Xmh2TA"2<7`5GS,Qn0s:In=4eGP_u'6 +(M4%k9ANBP7pf;GbD:F&0Q9X4L\+-:N65*Zq"`Hh1sJD$tY,[]AiR +VL)q:bU^tU$'ZC@H[7?P> +jW7AY2jpd95t)MUptY3AUc/;-Ucb>PHZMiX%Z:T+i4e[QcC$f4XFH_lZu_r#=<9`E+XDWasn+:*p;Zq_?lNV9JFHrc.!I +?Za#pd))*$q.BT]A8rJNa@j]AQRQ1n/$J[]ABuUGRX_e<*V"K@`l?'.E-Ws&Vo- +Bg:03lIh;!2IpI@8T8*0Sofr47=I`2A;P,GP!]ABaj!%I!`9o^q^t5?A)EAVWIilXp2SRp(dm_!L"dntMG$FdMmliS)0,JC%PV5:W/[^irZV?V+,H165fou>o$$e +P0i!CO0rF)Wu6dg-[?)OS4N^&>Ji`GkZa=3DKQu'k*;s7rVWMUrKPMK-'RJVU:#3:J0pp%Z9jZmDaK +(J<>btu63>u,5TK13RG$9S=hc7O6HZ+@-1#`RjoKDBZY4)g6B:J,TR3/jqNMVHMS..qP#(JL +=<"VQ^)LP:=HsF4(H1sZ]AH\^OWGlPsRb]Aip\ma$5'":q,;GN/;1\S:71A-Fm/-/pBq+N0/B; +VNW8GV'Y!&$)dn"[FYnO#XQ-ADsf@04ZFp+Qu@mb^I\JOLIT]A=+ELe^t_]A(QC@I1DlO9Jg*= +04Nt@O5L^%n,rM>oaXnOOa7*S4^*@:Q'EtbU3X-Mc1k8:(DdPs()@V]Arg$ksGQhUS,DMdR8h;eueE1(?k_4Z2TqS1=Y1n>:Uc0JBFFc@E +j7uCWJ6baFs%$UdHsH+7b4BOrT\Xlb1Bl>$<8jd?Pb"m7cO^^,U`Z'_^EH?LMq>BuDo$k@\I +[TF6i:o-CcZk_&buh<7HmXii8a+3^i1.\ks,-t<(g09cd/r(Gl7R_5%g2lbbh55Q&q(ems=R +YPl)?pZ\AAM&hA8Rj$t:c4e^b!2N@BBk'>P"$b5+%g:DW%Qrh\e8uo"X%=X+Q1@Xn.3QfO?p +aT!id"iM;U2ZalO(WCO@]A;q2o1BVk*mC[CPYHa*a2Fr2&QD"f82qQC,h^ +i_pQ^MItu3lUr_e\qfKE\bLTPbXihRFo#*PkMoDC`S:>6+QtB#bhlIn[']ANhgRqSd(BHKII&R=UQVj*a6)+5Drr2_&*VHb%lCW,'`-Cj8qUI4\"+"aEE%9V7Tqs]A";1X@6d)h]A=VKb"N:&spOBq-0[+t=?L(d9cIq+^Mj#)dZXA5OFW +tOpQR,%>D2hFp`r,\f_RLI1f^+#rG'Ir%bDVR:6`.pTI9DA&qZ+[2BA]A"8Z)X^7Z`3()TZ$g +4>C-SEIX_)/6IG0+9Qh'MF[*5*:ZQtu3u%BCE:@Q9q"P?Boos9/)"TI4&VR@3@qU +UQ9p\+p'%n/.Ra2K:.)]A=2!SI`.51X.W*lh8"c"i%k:^nlXi%q.T#WBkM5IC/FPeUb'CO]AIW +[B)^dEMa)urD"R=(3CiLK8O(*B)E,IRB?@XA]A2:Wi0[l`s[0@n;=]A-scc+<7lufSj4\W,54u +D:\lg3aLDq:J=OOfX_jj"G#Rjm19[87u0I/HV/%Q$qRrPA^q/dJfb)M!+ +irJ%X*[U'/fOg;s7_XK?skcP'C2otD%.` +WX7fr[dH$m_k:t)<4O]A)0=dFh`M;H3T\q(NC+>]A$#!kKs.pCdEq'u-34R%a)D$#UE'W(2Kd2 +6IFa0b1lM>m4a0`).Z`:Z#^KQr]AqfBNOdjsUGd"%pBbg+>XiF->R#C'FNd+-]A(Pi09eJA5_+%3J;=[12EIUW:m4RqJg`K:W:kL?&:2os_?ZFqjM?2*RZU +Le$2Y0K ++r=g,:/(UGFY0+Sj$Y+,%SaZpI=`3qDE9?D^mZrQ`UckMCs4P0/GN;aEQMhaeLH$s2?i)Rqp +i:YVZCVnNg^Up;UBF>auS!oe7/7(hj&ZcIbce._h/EuE,[24dO&.I96X^fAp0On6[fk+3&HG +TaA$ds1 +bTP4F\Z&5`p1bC,Q#LC`T$\s>ucFWM#KSh[Drmfo2,Lo8LTtrqsL!V&P0*Ml3ntoRmr +k/>;K;uo9ENX(qJ$I\oK,9lH^j+b-&[n*sOhi`A@8_kk-2R*'(3&6=V)iXhrtH[RXR@p_@`, ++m5`(tIc=YXHgHbCdE3Xen$_LMN0M8A?+RJuYl!Zd?k1k%cGSIWJrQj4J91f7A`>WXSHif`]A +h4IVmX[[d6.C-4eio8=V*mGRH2[h-[`ORP2LsmTR/u_p4<9[N9Nnf^6-OcYlSU+@9Yn_N3j$W,869%O3bY2@mo/6jQ,83G*2g +>QRt:J-6=0\EH5CloV!Z')PY_1n=RpF)&?fOLI!%u[$$[/)bDO.o\Dc=MmQCC?M#Z3aco@EIX"l$*-ntN^i??)1 +7cl/#pCFN-rI/TqW*?NB1lM`]A?Rm$%-` +b0[/Jq+Qgb7qYSeX/AJZmQ7e.n2WKd`=%Ri;6/./g2=bD#'"qse/M%k\``Lb)q>gTt`Uh'h0 +S,edJ!rqcIOMUYb]AgY3Zt0E>mbO%kWT20e.JaI,(J-6qV&Q&,g7i779kt[EFm?!:/n\fa@`9\Qf+5=fX7nH"BP +D)>A6<3mOA.r64ZV0O@MB;XOBR1K[5d='Pdt\lnBsY*X!Lp$fXSd"s>"r'W1F33BaNsE!Qm, +F[4QMFqE1Gej1jMGRlY[S18ME^EEM3s31kb`\>+iSrqj><6;cf\%UuIc`s&[m-aA[>8N,##^ +2=0[.OSTO^_%9K$%s&Vt>Y`$ii1E4Me\U;7nT!>P:DI;`2'8HWkh&YR&GZNYA57H15I5A,53 +++dDOh_.AY'6rT!lr\:_an'L?PV!jc9.t%hB1jEOk;2j\7*/*k`rj_'V3eS_3*XmC'I3SksR +:@Ro=4H(/bT@F/0Al*l_X4$hG0ZA#%Qr_/$"KsB*ELN?Wn-7:0&AUu2Sl2XZLE'"a1q5`2^1 +Io_R.FPBll\`mbD_0%r`hn**qCSoB#8K]A./lL#T\T\kgT'X3bCF:RB +F00G@S\8N9N/oQ$N:26G*riq<)G84AuF%;c2)[,VJr$`be=:A:Xo5a>Z*M_Y9sq#!Rh[aAj4 +>DR)UBma1%_,/o*3O!Df+HaTkOQk`3B2p$;[2AorqC>2@3uqTP7=bu[JEpk>Bmqg(4Ftr.Oh +JHAj(rKKhf>L9O)1IF?BX5L0ACZoY1*Aq\%Nrl$Ne'(8ANt&^oJ%['#'AEU2tBsqZ26[nB1L +kENSp0J,X]A'STVe&;FN&Il,1R?/_.cgQ2]A_ZbpNu6^UW,>^1NZtpF>[$WISq?-m*W=G(^bQ3 +6"Q#gY:EK$/_+L'9grr0VQ`j['s\`[aE;!cg_;oP!l#o'p&ENAmc3U69m-$g"L^MAW(MiqQ' +3D$:jNT9;l$V&tUkj9HlfY+KViSlV@0^m&ejT(BW_;ankZH22d1G^H_Vk#sSnP82^E$c/>N! +i7OSY:',^)aFG5ns5$bcn7A[FY,%m84t11;f>2ImO2\j4CE4E99E06q=1G*j7hUF3n$(_\+m +C`tR)7[pD=/]APY3'L0(7+DnKX/4\VR*o&$"&_9le0n;YnO7cUBTY0gd`[+6idiQJjXVu*3qah20F#59*&=jX[LcPpBCO@gl+q6hbL\IPP5`5$oluX#mXBITpQ#=PTjQ<kiR`-6UG(ri_q--oi5:$RJ,*,sNb9JMh;c?WNh;,=rCYGqQ"2`&c905'P!'WX +$l8.CoHo!]A?QO;M#B>B:[n@uX0<7n:@W<@Ik3r1W]A[NXo['BlMBO9NA-UGIUnQ,"=0-k,3i` +qjW?ii&e(^^'hK&j6BCX^Q9hYAX(2\Kl5c\4N"k1ql3TBJi6*c!KUOSL3XR +YRU_+a@/hJV2\$c>MR']AL^:G51_GAdus)r#TrNa,P_IK)O=^R;XCn6<+PcsNI<,6iVrB,-Tt +r94NuUQ2/DON2Kp&q4GTB5$&JtW,fJsW2HSY6$;-&^L3\$=$WL.'Ka'd.R"AlY\RcHWcO%b[j:BdFETq-Ps3L%\;//^DYe^:q<.-=Y"("tKc`YdV+ +m2UILkp,PjjcHbj.h0Sr>!937MliqY?Ki0`a['!.N'lq&N/:iplnpk`(YM+ej)Xo8L5CJf`7 +mR,DjA?l>EoS1;A7SZ`]Ap4K4Uh=<-\uWp9[5o9Y)CjHa.tOr$gVWsBrbjHQ?&_$Q*76=A(qK +/&m#2VNq<>)4XZ:9qkhd'8_83quXSR_R"MU*:?cB)X(P?\ZOF#',Mk.eVSjmNi9dS;GrHZ.1 +pVeXj]A=GL>1-81e0*!4A,6MPZ@0X,9PCfH]AfeCpH!icf1c +$e'C2srXr&94_I'5J& +;lYaDL*t9537S'Z!Yr*WBW[+ac&:L*]A-bQe:4L!ut&9-?Xb&p;M83d*2*tq,CSVC91k7j>HO +`>VZ=gQI6T;d%2TDC8kL]ADbrm.Bpak&V[W/^Tnc=5R7<,KW`4KX\4k_5Nh5,in6*k4iB;\%m +Qs\[`miCGue0-U5ZI.4Lr0`sK''42k"as:5/HJO_Za-BUgG@c*k0lA;YZRK,n)'Gp%tP.o"Lr'jprY$,<&0Cu8081sMa +PNc;7ae#ggaBP,@se&[0&*m&ZW;KSD.q3n/!,O\XiWj$^=A+ToZm[Yks:B4,\)L]AgXLg"u7TW^hAYm;H +b%*Ea3>bWK$0(@4,<_97jrlg-Nqo]AG8%cl4iMedk2'kd+`uPi5aP=<,`+7KOVsABr\]A2quN> +<9Flfa;l`r:=7T!$t!^rRpqX?3o5Sphqq0E?WP5Z +9cI_[UpMWIF-s"K4m*XibBdS@q!k6k[X1)BgRgsYNImEo1obXGI88ABr"c\lsO>0t]A8k\K&8 +9#)3(Q4\j5mguI%n>AULR\e39i6pP!C"6DmA/2Uf=(`p'W]AOK)63^m5R%1D_B(l=XW"K'!=dmGE:;TQgd0G&466,mCG+?/C*+jo.Dq4 +;7r1'u2)]A<'lA(tb&(kY'r.83q6a+q,]A1s;-T%aDcAg.^T8GB\7d@gj/sM\+MQD-c!n$=;QE +hcKTG!QY96(L!6fl/cN9D;^4[UuQEDhcs1t8X0aRj&/uR)5B#OABknlI!kIi(PTu`-qqjQk13pr>aRK9WJKNQ4Vqnug\U#t\La<8< +g`VeOt'5Q4)khC5BJ2(f"6sKjOfK$tLr,"\]AdcsC&Uhp +7S"/+WGUQfl:'EKf7U2G-WYN^s%'/gJklT!$H!^*o+b-eC]A^Cel&.0bT(\A4!T?A!r5oClo?q4gY8<;<$o1,m%O2ud[ect?*$)s@AluMV6VcN4ma!I/& +grK_8nU#Lc+q,FolTgto_HPV143"EeD++61`11ZF3Y(ClHJPYW8UWdE#%H@W\0L_R[TF=>u1 +^0LdZ"=jmhV7msDUgb>YAK@H?l-B(6SVcabkXT^+#-_s*'e)%![./S?7\ZZd8kr4O2.^`\*d +RH`469cIPWkj$URpcsO!/eY1%*]ARtD?m*\2'2IDK9`\`p8B+jhfu/IdRP!Onr;,TbW2QX$.Q +5(qElLUbO"cdBM(IKTA!R<@C)m$pmEkOn+5cG-Kg@qhJA +*f=.gD^L`K6Xe!o)`<@5[CK&^]Ar]AVYB*=Y_>$K0+c;6a:IjDNSAS=F\C#TsZN"YeS*<4'('> +t.+(qN$XkqHH5uS8<;b2kUINkMd=C;1!Zeat'!9*$efi!*5P]AWgc:VhnFM3T7PC12aIVCe)P +PAiDm^ReTt)RZi%_=`3<]At:*;[g3iqK`m:^I!"^cmu6B+frVu$bqfKs4!#a503la=)DmG+)1 +,O:Cnf6IGtJ:BU)q@rf?[BWQ"$Ap9:XDf%j:2l``>0HYTd3r1CC]APsV!GZ:.1/cPjltiAG2^ +(.RO>nV8V\;158s)j+n4`!9H/hlIf9Lg/C,kE'N@=qp5Rm3@s#M,m%[jQ1`Wc]A!q$L>5?5&l +NomQU1pQXl+TePFhGAsjfB&;\ecF8raj)ItikpIf)K"KjmooJ51!_n=DX-)e^"qrE\BQM-6B +:23'BP9@CUdFpU_baedXN<0chE$T#'puY158S?s'jk<06[P@p(ZaaGmF;16aalQ\?<;@CC1f +It/cB^7F9KZJQiE-*Gk,1elb\Z.'b-/^a6lRG7@pULQS>+Ek.uj_F?29B4X-s'cp^Y0s85l1 +RBc]A`@kFP"k2Oie'CJLNcA#@,^l0,j1[`,bB)>$fmpG![;S!!M9J+SpY:]A +_c#K2bLs%VWeW?TPR*:Pn*[Tu9)&@u%W +%c.V@.Tdm]A#OYpC'@n#pgAil_LTsNK'G>:L +dF+ZU+8Wn9SjNIG7?tp;SGXX# +O)IZ`M#qROP$4G\K3-7bu5-aIPmXerq@LY8SV,/HE-dWc\IgVI)\MVtc=8Vg25YU-PtJf(ot:P9 +CoP7?ZA]Ai"Y;Sj3KQd"JA%Z,i]A5>qbJ +'P4H5<$;)Vkk7SjHBiNS.-7)Bb;s6QCTqf5!B+^AmPnAAkn;S*N*8[a/:QYf%Ckr$C&F,FXd +p4WYq/Cq1,[#s,s/`CU0sE.m@;s7PtX["MKT>Y>)\KHBH-L+XQuc%(,"(V[C*DcQ`g_M<^o6d +/#GP[O&BUiQYQ/IisdQi@aqLA"8GJY +nEDS*E6c59D6+*9&E3>YaNoJ/WEHGShL;L(NY"\NteTl6@Xh6pKHjYQIl6cdK1q=,9$HC/QM +\R;hBB]AN"eXNar9cmUt9VB9K7*_/VH=k@RC]A$rB@O,RS2aNrO`j!6rnr:DPJ,aN1lL4W;hRS +cpZD$HEk(^D#^ZdBTsi:M^1sNgo'r?)7OWdc'IE`4XEX!"pPRSPW)"6pruC\+Vq"chD(VjLi +]Aq@XuGRQAPUCLiYiY(3I]Amlc.['_bR]ANJF5TV:A>3?,j-84L''u +4?Yj`gb_\a4r?p#l45qV:-WW4B^id]Ag6+M>J6I'o/$VMD_Pe&7q,gj-NnEaY:#>>0U^.#,n_ +kLpX88QfZj5p=7%tl5$1lQbLF-b&Bf,ubGDRDX/-:r38--J1Zu4h9[LHY$nDWX/HRT^uZ#A< +Hp!WI&H@a_]Ahb^B2mW-&>o9'T6A9^uhp\3D(>Zk4/WN!_YPiYG/^B]At?i:M;%/cUKPWp1Q4" +%6n?b`h?cQS:2),3G=_Zp[3873:;I/]A!8=F%Jr[A(NSc\,G';ZN!DqJS5Wu0?.^OF`hgLb_r +Ss!3?-lZl0+RV2PDZol-ik<>&cPhdGV]A#_3a:U<) +:/lKL(Mf'n&`bQCT!-W\Ke"6.o0iLu5NlXi(9aq-LDt=,S&^NpVLD5JU/@WjZB.5nJgdBg@>XWIm*JI2[=7Vs +Y@#[3-EBd&IP2U<-nFo\`Te*7Sn2Te5P$?FFFs)[6m>6G&93%\g_"SW'Tnjl84NBGKW:Hr$W[,>67;s.`+F<",NbKA;F.?gRm5q0?S?fm-OOhT +F7VpnOOsVd*@sB0L3Od\[`:E=^/a9^`CUbIC:jV5D@X56FO^mR!H=#iZHXk`B,1nP#]Asm8^Y +r5OQ2D=_DUUp56-]Ada6LZ\+j7]AXD-geJF&e;"n+=d:iEq9NNS3@!pRUsh_2+pD^\\2:M8M+, +LYK7Z:eK:P$7V$#&%/6fKu%KD591a +)n\r;:rYTD6q6mHq1QlM*>gE9$WAQc"Is0UUnFA8$A%m*&.jg!I5&K4(m2&56&(X%k0G7%&; +ihB8H;9iN):Q]ArSH'22^sBP;'m1!G,aB;_ZjGIJX-J"Y,#e)!Jum![.<-X6EA]A+X4L@VTZBg +rs&Wkc;g1WT'o9_#AfQjf&DmrCdG.P8rhY5q,?'G<#k!J)&SpaUkQ-s,Uj*G-d#[,A\`#dd'%!d%*^u3o:EPMT*?Vd +oZsjUho7?<-N\@<\<5*.X-'S#VYiqSAr;h0L;N[Uc)ipO6Qn^We]A$pcl&+;no+RRZHW1uHa3 +\)F$jhQ]A`l5O,T0&q_7N=31>m@PML6*RA*YR",)gfj#3X;^Z+MCt).@>:#X7E*6=V]AOR##YQ +@76Ccu]AQ05T-< +ZN2$%Ak7MO2"#aSeD>XfZ?[SEp\+cnfNfg,a4FU?_*hhiW/Nm?uAb%-#&+2hlQfE`7Mr:OX1 +PjZ9kp3CTc#>oK&?kOgdFtFD-*ucF_34-C@r2fBRDA@MAHc3pJVW^#^/`6,%SdIjQ`3C1C1^ +atO3?,&orQLkL,&n%D*O$P8/4>Afml^XpkD:*=RG-AqWcgt_:7$laT:=apE=(UP]AV!^85Scj +@-/BS)u).%4OaFL:O=SLZuX:/Qg?e^#.//.dEp?r=W-Kd?QnqKfP.WRnrjSlkrK)?J1dos1H +NMie!-Eql3rI[U7AgF^IBZ_g4>/WF-eItC*P\OVeI$L,H`%s)f5mut[>Sr"h'LGi?&orKMQ@ +caU*jD8EpV+lRu(;*LT3/g)WOU/=p\662Kd0:Q%k4]Ab1BjmJS@9-`^>e7)&,,<_)1Oif_=)# +!W5(+M+C)Sp5=]A@6)_*"mokKb5aC$@qF]A75g$ro0p^-Z?Y)MQee(`S\1e&J8+EqZe%h`)>AhN)Jr`amY]As3>;ms>j,U/GYU4KRtqcA`Pb;F`O/`6[X*.$/V>A#dT9oT>gkeC1l,fgK7[I6qJ@N1S.J5NCnkrMNaV?>n0`2H^[]A'CZk!W[nnN]A49DB.P?-@;bhg=PlfC +`_,(Us]ANn`KlI5UuuZ+h;dR'GuC<=4r@3_$IISrBq\e;hp1QYqkf(J$-PWk$f"/NJiEJ!RGe +.&*?fj![7]A+p_\aXM'%Y$e/rP6$-=(qRTHMqEFW@]A5Y\cY)a3?f_ILl+=(4!Lk(/S\u)@Zog +DM\?J]Ai-D`ON?j%AQu"MPS9J5\ue[au9FG6\LrI*5$oU/,s.B?lgLTp^1d%`U39858mWm@Ms +J/.Q-@nlfSkjC.U3>3sbm"P`%%c!O$Upkd=+!(_K!/rt+ER[Ekje +:.;FD7^>T$;Lb\Lq*2Ys*YT/C9W\*b\&Zq&! +A01"4:1dYZDl_NM]A(iZm^)fD_s\$qE"lq>1UUX2"&/c6GtrX/_Tk^#j9o?9Oa^YH_cTD^qnH +g#.7EY`4Hm)g*j`lmsV9<8R%lgsg,J9d0GS*?6IU+>DZ/5m4#EnlH +&kF[6=HWpfM.Z"WL,[>V?7<&1R"bcCAIKS65LHYmf-&EcM3sQ-2QPk0W6\BA\HO^%A0+Q)Sf +j=Xm7Wq'c\WLE:QSI3j`0n_-OeGJ-4H88"Ts.(4r?Y:E?B.\AD%S?<1,.b,jeP"eYG:;71*j +k]AJbHRbcNg@"OC`O/8kAuE\BJM\,VJs%oghJI-Vtqgm!'A.()(;,u-a=QB +2lEX_+]AQjH-?mMHCdh_$P^[OUimF0;5>TL"RK%2T`%0O@csU]APb2>CS#%2dhN7=.AS\(t2?u +is^7Kf"-ls>au]A*.J[d@h(L8$bEk5'e?aFTk1dWkNA#3?j*h0I?54I/k&If^?nl8"\,8F$/k +=9@a@?Bsna`\0q;ED]AAIbi\9.88*bfla_-a!MrT"@P[*1QIj`5j4A0/JiG&4.Nq%0'Vc)%TE +')Wt5SeTf+I(r46.#<_o*grJV*MaG^& +OH0hBO`ud`B+8!67dP"+nU.ejOemADqO`'fkHF1TP0I%8h%/b&9q1t)%kM^;47kM&1@DEop3 +I^Y:uA'B +CN1`&\pAmT[T$]Ab,4`5Q'R"(lM!q\mj`9'?56,XcYkQ4V7\l9^jo<2\c&-[c(HVb;*^cQNBK +/4><**..p&6b;ZGH)V&9Y_F/\O6iEm,7-kjak[hq?f?4Ll'0:1F!(f$`RWpA.;+it?RAPbF3 +R,jM?L^N>LuZ26%DYLPq:6+KcOC^p2R!F64N+=/DU^/]AX0"D4bp5]Ai"V5TU5^X?^SA)QcDUa +&8Ng']Af?dF!-BIMt(V(NL!8`!")qs$IBm0[6jf2`l>S!g%qp@:"6VFh*!mK;H$A:euAC.>[f +bQ+&U[P#BJlYbGVW5e:iR/UiVpBI:Am'Ci'#-(ld_ME;nlD''70t\)[o(^96K300%e1M@,Aj +g>3JS9__(VD6fR2^%"C+1fEcn#> +ff%4uUhukcoqda.j?,UMl,S,l&An2p*'_I`t(.1B'N;5')&XsoB4LQ:K'NBs +)K"j-tC<7@k(H$.kD=BLN_@I#D&@QRJp5f`,aFl)2T;L0]At/$(cVI%C.LipU^YM,I#Z;Bc2n +:JV&8RBE4Tj#MX[_?Z]A#gU[Z.>DSC+/_3Q.ifIWe7Demu4+.(G_BKDYkT+t#Ynr?ouI>@+/(ptZS==k@1Nr-GsDh&Qm3?,[^5[_)s^iU$76Q +-:SKX=Q@1Ro$d:7Vl8$ROC%0^>J^'8-gV9Si)3mfmJ=()&[+#qr#[,L7[[UpIWAbcVgNl$DA +`R"rLEMuCD\%G=l#?!OC#&4HHQQj3B!SbL*IIg$ra;R=k(I4&d(6"_ED_fj^$sLIT\lX=BYgM^?`^5lKhB4-m[D4(4@]A68?koKnQgL.M/)OStbA!3(@ +A::iXp!Kg;Z`=Dhd*)gi:T`kF[8(cKG5_^0AX\qG#Mnq'UBh6(]AN7_]A_mn-ZVG2*tUMgD':5X8cht +IoernGX2Pu?W9+Wo%%,tDjG3X0DFd"7fj]As%5CV3o(!hWmg03(Zf^M@\P3k:S6KZ +nUT'pL8MG&*'4F[R1puC;j!6GFOL8@GgrF5GXQ57?!>[]Aj75+s.5b1db;n,+L^#U\Blr=H:m +@M526XNhoXlGBYR"BidiY*B.%@<;$R2ju/]AdmcJLhH[0m^T7W!(`[Z!^?c?@FI^d;rXJU-1/"2dH9@bH9,m(r%RA) +9*F<]AL'B<7P?fHlTeR(:]AOjqN(mn/BNqlZaIAg7D=4d.f+7+!X^=).KP^.B7`-8,3">@o,fL +$\ie:!';IZnj^IR`WDX[!S2/#6XbGT[&4KGq<_qa5)f^k\S!>?b<:, +kCqPm<[e82*W[1A&Ye+19f/DX"P^AYD&F!Zc+&0)YuaHKK1[i9j3/1`@2OuqJ`O&3ju +^-B'/,3I$tb>CIL!\93&kHpnT@!C5p?;'7-;W0'+qX2P<\3a%sb"c$^eFnE\R2KdD9PQEHCN +$KNcL<-r:oU%,fShU.ab.HULXV9:8BH@S/D[Qf2I:8t#W@c*jlGM!A#Qi21UFCDE="Oamemb +`8P+bhn'(I]AYb%F-?9;k_f_/tc;n2:Ejd3"A!QpCGCHFU)$*gIEP5'LXS3i+,QLKCJ@t@]AUZ +lQr+cp8*AL`te/^.O5_tt`f&-,5/QPe +\X21snnpZ&)CZ=D(.4I;1d:!7#>Lmq.5d!7j'q";6@PjK"pUg;7r&s!"_1!BO>A4TB\t'Jmq +3+WA;-]ACJ*N-?*9/'I1JHO'471LI0Y%&M(1'S?2M_Ce;:*4+S%X#.j]A=\+BrEIG=-2%U8pk. +P0pV9D64"&57#b:"q`?G!?:Ojpk`Z>VRQtSVVgF^s=ni9Q`Cr-$)C+t]A`nA1,0'ms-5F$+_e +M\gh5%piZa*Zi$&7Ik6Xl<N9l@\,G^,ObP=7=K=R4IhAHUC1QBBmJ8mh,D3,]AW= +Wq7^fuVr-oI2+""[s.:']A42JVAfK'"X(!2!P;3HEKrPlp\+QUI1dl)-W]A9[W[deO.]A2P0\GT +33GTTe-$nA@mF`Y]A(lf;GX%>]Ah$)bY$&=YKg,!s-]ATG;['a:l2Eba-.B>dCZ@:)_8#N>lj#P +j1j/AcO/c7KS?pSI4cc9QGQ0rGEr&GLc0[k:es-8G*Y>qntIrC@-U%2'iWgP%VYiU9Hj$4&4 +Ph!]A`k69.5<5/)-jCJiT7uX(e:7;_@LoNf^hWC[BG(0qk\k`!W)\^Xd?Nc@2qiku._]AdDka_ +-U>LlV#SFj3,*&>YY+DK(P((I@UsT2*X*1C(I3P/!b7etXQq?]A;b+CN[!o2aA@/_Ue=^7EJr +cFl2&i<-6hY:I$u3lUV;!R4%hJVQc$KT5XD<%P"K82oPX=_ +VN8ps+9^4WU-%&c#;0E65JA>4BM_K;MMd9rTMXZ<'\[i]AR_NF.IqAZ=-5lVc"8L0;L.<:c_8 +=C=$[#A!Ip +-k%!&A]A@K3#G2U"i3_GK3lg+k_&-u1ed.:)ak-9nc+0_jC7U]AAjsUUNb=5!OQ"%cK +E4?"QQOu=IePBCj7<-G^=Y6(r/T=XeXIKo@ll1k.i/V7R%V6C>eNmVHT/EGc`pFo\2f.)Drn +0Yi+t;%'63``0Af#O)(7fi.7L4W`SZ\&=4iqH76WKhcfN"hCSM*/+Y@#kSI)moJ!NHWP?Dh4 +9B-$XKnhgELPGsI!k^%A9tbIl6f.o.&b^LCp5#>17#ul3#a$.YoGP;HD\'Z+)^"7+7d#u6YA +NdJZV]Aur#+CId:!Q>[\B#rWCRYQ8A$QT*Fd +gsN3Eu5`iq[Z"LYp"[Nr/tqJ\q20_Z?gOniIS"37T[N]AC1B6-RA^V\tl\iO.Ca0_(i.Q&Z(-Yr +Ft>%flVt;%W!$$77Bd>8Us%gXHq`Ci,YHl1Ho#MF-%6XY5.]A(Zp8rL(_=&UMoe5/F>U;9G@5 +hgS$p$0(sRSG]AD"JKWjkjd_t."OXB1sAqgW95Lb/^#LAKYQI=Y%(E&YCo!;Lg+s2J4c@3C:g +0RJTjU'B"BlWMH%SXfVGE:c)9ZK]A!.ZEOnSre7\<$)EPIbd\'Y0^UKPHIPD"Us#553met1m+?g/@$UE0<70lcLF-Na +g7>J5792_aKona0>O0qEf6?p.d_ENcu&?8CAA2HU'W^C.QI(lpRpYei)HJ]Aa(,gecHYJ?_u` +!%0ui-th-m=SM1$oi?UGmN5BKU/!C#Gp"UHPI1Bm<*4/k/Ns+d.m0^-,drMecZY$N,h$fToQ +m%:ITofijb8SfbR0sWYhZo3BfVj3>l_ObeOdSVm!5i\^MXTp^Fk(lKUDp5Hiu41.[=uRD$H7 +`2&AaJU#WLTqYZ`\AL^TET/3OG6SIo3=:OZ42@.-2@fOmSDuDYn;`.\,MECF-h/NpS%Q%Ip> +_U1R\AMfSUh%V^YhA;E/rq1$:SN;N$3YHWRZ0$a7Zn,h&*S'jPmGQH89A1^4jQ-^k%LCmMEB +J$Jdg,H65(o0M8V#Z\?'AWlaR"H[A0lO%afTs'CZB*NMr,gb7;&'U'0t8aFib<_&q*jG1poi)u!F^coA$4Lj=`Ul>bTFJJA*a +D9Hu`Zaj96/aE9^56!s8XLD*E8lqVS'CVoQiMq8KcE;=L!mHJae7Xq^P5R?,8UJ=EZ:iV$Zl +VR$"b$n9"U:J(FI8f`fLa`)9c]A`$d_=M8%iSj:1,9K?C",>SPJZ_kD%lN$D=W +n1l,T&c7,ZsN06-=bKb!1Lror6.Sn$8c0tJd33YIJW(`U'l:[CSan.'5PZ% ++c/a^Oc/1k4"P=R:ia48XSW4ars\d?:U-;<^uH]A#[j;GOf_Hoh[[UH0paM/E=09b +V[pcm.B:Q%=cE^G+S,hYaiVlbQDU'1m/S&CA=NsPSn"=cP]ARllLbS< +TMn++-jD_lJ]AXj'\?8G5j.b@C!*dc"Y8I]A&e +K[3(.K-g7G-,Je4]Acd6dZ?,_'raTuJ+NLYq%]A)^gNG_shRt$SFJtEX1bV*bB;-W3Are(J.Y"6BH-#t^D7]A!LfkM9bJhA/S#&8@l9eFRgL%sGVi[HeXtl6HbYBBT\L`qkXH/8 +FEh-H1q-Db+ABLTrmI8Tr!\ubQ.N?U,nC^:@'at9KJSblr/DK==l$d%jG[-+LqH@634l2>Kq +FIu%9U21OYa11W3X_+_#3;+Ql72.^;oebM0VH%K:M+=8]AF^'_(O?fe(!)Y:Q#*7ZG(5eBm@/ +EI8N<8&'Vl9U1FPa=DW7LLN!qD`:;_RVS^FjmAIn6`2Nu$M&0]As.'nu5o@07<+/35igX3Vl\ +7NB&/2-p3pb^:T>(l),+%5Y]AT_O+Y$'f?6"#?DAS/F_`klth2/511sT":)+2cfD<[`O9NeW2 +N82SY)Z-C+_C>FZ#<;+)\?'mlcK63V/Wu`[1^4IKE_WZ&4n1T\+#'*8_YQS&F_&q#?p'K*49 +t1(fKDr6j$CW@[N7$%NL:7Qk$oD,3/5Rlfh_i`np/mNXjH3mc50[P&$.7r1GRm[7[5+NJ"61 +'1[3mS.c-EDr_$+K/,4<\]AZ\X6K<>)9P&X4,UaK3$^[%PYVS[a9KQ@nOUZ=\\:#.Ucn@!S\) +3Z3p`hj0U-1pe^s(.Rs4d:\_e6]AT96YS5+X!a,+H:KLdOcc991_d3+<`0V?.(;JSK +]AWk+p&C/K[9#Rq=B1sI(4C_bW4RJR6*c1''[SG"FY^pF/ADh`GN2SJdI.P98W^IihqNb#-!A +>-JtOMK1pcEIrpr6W4D^M7jK%"MdDV_(,>FOBBBI1]A@OTWm#LAt@@P5Fq=ChSZ>UecUug;oGl-K4aD49f57Z!u7H'H1U6#B)>HA[Vm+%`g,,! ++D9`ajN;;GKgN'TO]AVR?5W\A&PGoX3d^\;q"lYG%/OEEYk26]A+W9Ag3n)Mf\2\`\JN7k#frte3TD\(R=?$gH@DWL)%CZ,E:6(?q]AbZp"`c +(-!^;Mm*=h0qDVaigrNs1I]A"t04TU8%681FZD_\+m^fs1UOM3Ln(.Q@H:%2kc^eU:f[uI\*# +^eQO:=7$2s?+(#a5AQ;LrQCBO-b@5NDS$(fCFL57OrIZH6-Y\dB@]A"I_g)b@ln]A)rrHjGM9Mq['k4:5e^*#SO*6aOoKa,i@"I8Ve:7*@aVd +rS$Lc#.VSFkOLDl4gpB29p:7K`93J^@q-Sue:'%u1399!p@!;gqQhV".gu#DV\:;V,q>mO`B +(uoETR2f^LOl'^1=^J`cb');?:,$fc/g1TYup1mpj\2Rl$.)VXhn`Im#VF#l#h6g&TZIG;BM +&n/2tpf"]A5qhbs>n=ZrI=blKic5$7mjV0E4=\@&/eJrHe?SR4WI2Y92satb;))A`q1gXN0u,9KBh5PK[%GK>W^cnkg%\hmltK3uA%6q26?i98gOEAe`(R[W +4W\h2>!C`'lmTPT%+Ki(pe92>bS]Anh(_"`)ZQ%"a&qG>TqLggHb":tO>9M#/M. +Lcj6tuHHdCd`;BPeNr'bK5hN?P;eG0d!K-J?nueE^$Yo6cJtKIsf]AG#h,S$GK4tN[OSaWu"= +;]Anus'Sp016ka7$kM/,gGOdf-tEr>J^eA@ChX7nF.ptDlDRN#VFkJ%OWr(sL5i#o.9Oa==(g +rsZ"R#8I@_Ts)p@D^Xc1O66t^PS!ADq<^5Nq3QANR9j90C086`B!ntQ@Qjd\Oc`k=!6s.Vo# +3_p0B9j/1-2;,0%W%D]Aq@Bc'pg$8g@%JHPT/"E]A +^$9qQ]A>IDnXBQ(-Pn$h[&C%Y)[4705dL&WCb:f_^70jL)Zsdp]A\$u5:Hg0/DGIi3#BZ%RteW +O!.j$A8>W7u*EJL;EadYd(bDa%"G[C"`YAfQO763H[/Q"KDSRW/q,Yr7?Bt`9]A[dlOk=KJIB%CG8P&uLh.D^0=H1q%guD0Q$>=k'Q)8$;T%*@Oi +itS7raAH`Am>4q(oO?4^=s_mBi50H5Boh$@^c:LBWJ]AU\(9(]ApLP187QU'X3'%hF)U?NlN`I&Jo*(Wc"[)o`\W@Vfs0sJ^iXPmgQ`$OV!`1c]A[&TEqcAuZM5B^DiZ$$JluT`$PtJ]A25 +X)uj)0B]A()@Z6gsSqEp&W\F=.:`>@f?#s9MJM%V&Nr>\'GWqa7L>@(I.&dZb83#1VPO]An:Y65A@M1'CTTa`&#E((%[F4't-qcl[sido +@L2=G->qbL]As>S8C3oZlZ+#G7(hQ3:alB%"$O>q7IN(iLoL<@dOj'M_+?epYIo2Bl?]Ag>A'0 +[GRW^-i[4T_@/CBFM3laTY,3T'(\#HNJ)R14%!a^NEhPZ"7lYR^,"l_^94/X<^s%\bF-S-[6 +A)/@l+p'3*B\W(-Z/;]APDOgQ0H"8udJdAKo7Ka4no.?1Y&CG\/%O71SZP-/'K-Y +KiuEA1J.VORFr*;Mm/hsSg_58iq`Q*mD`T1D(7YAJ0g#-l"O!P1Y^p5i"f/$]AJimk?emIo%m +75+$eMO2nnL#3GHc'4$n1]ApDb<"Cj@]ArHW!h3A4<&=4l!CP$V?R*6\*g\SH:n0(JQGAlpXh#RjIYuj_5VceqNg+WJ.pl%6A:,\>3CW +j/S]A4eUpY]AfS0BR()FGE60 +OW4GsN3mV`#'&]A-;9_b#AnFs5IW1ETrV4goeWkVI&f()tK2K>[G0k(s:F2i-g)O`k +OH,o=HEN'.2*2s+=SVV-Df)3INa,g\nH0r.RFP#ESB3AGH*W4*5R +g566(YmP-7V@5&uL)%D&/F/LtjN^M9Z',+t`!R4CkS/df_,(iCKka`_7;0OG0aW54Cj5]A/#b +44ujR$a>N\utn"Cd,QO[1#+8#b6sSbd2Di@TU`8R5&<9cgm6lPECtN`[&6!#Rp&J`!]A]A%hld +mM@4!*ckY?&EF_bRC,$f2/V0]AVCVBm0#_MF$rJh$H6gFMCK0(h@!jf7QPQ''AVpW.gq-nRBlAhkl9bjPl^i>_)9GnT":GR*m67Y0P +M]Ai*`H5@GMtVYEA92iI*EEJB"nlIN2[9!/FGsC&l]AIQkhKOnOU!T;']A]AKk/ni0E]Al!qub081 +=S"D@Ucik&\'9asE&X0RFjU1LsD?\9V7CES$6*^Z;9mmQdfnRdIl/a8-f.`"L;fd#,)=eg_$ +fC:-[_7=MpWK5mha3&HlR*_0lPUPlSW2QeHGCeOR$P5:$Y.\tn8HdFqO$31JeK+)'!$$!4=^ +IWU=HaZU#ib4gT`-?n2beeRiFp24I2((U=UbS.d,9YX4ss0XSsQnBNLp^Y@#OFb!6+u;jJ7T +QG$3ler6$p.OsHtc8>.l5f3,LVA4TB_>NSuPW=#-?67oSDBoF$R-fj3R-U)0b3%jKIA66__. +7%:g2gq;>&Of>BUdj[fn]A:unj$q9>\G-Lif-;c38:$;4.p\3B,;R(;pQjM&)2KjQ$9-O\85! +Q(D%..4@f:i0L:)/=G;qb]A*RJsONNCfZUB-gUcS(;#a:CfpWmcrA)<'P`=4>&?XKQJ??ek04 +`sE/qunJ#esjk^nBKt76g*R_Y@[kLF\+?`VXHZ>UE#R`QrgD$%E27,s!sq$N\#>5U"&/hOEb +8G96fj':Rp:cWX3RFDM7us^5Qkm"?IHgI\9K"AM0rU=WL":`qQI3hh=Ml@eVmGrMAPTeS*T+M!1E +uO3JZD!FQNT$)m[8nO-I4kZdg:^.==d0HN"g>9me+XKTmu9?F"gfj'bU'`:&]ADN7:6gb,*q% +?'ski@K0qp1VXD=\,"HL9TV\OT/(QVTI4Ds2&`2(9JqD_$fSf?BR#-nB5`OWcX6')9%Lu_Lb +KmpHQ.=E4OuLESQD'/q)iaPZ*IW#Ha.Ehp49l:bU:*$BG1jUJ,dZG$"ai(u^(6N@V"9:'2DC +d`18MgDG[*EkqC6%fUB(%*#(gpbe1\Ffg[+%FQ^N>P_7slb#2^E.&g+kjY3VS$g!P6%gZl4Z +,uq5fJr,5^/pSW]AhF$jFnmO/X3l\"!RnZ*Q^mh0gfn:aVkD* +u4BAi6-nmiLk.66]AKeq`g_l4Z(Lo`]AO@7/4MFMm0t8ukb=6':0$qXTm)9X,/V3icA'0a:AXL +"EL-uAnI"#6G*M(Rrh]AmJ2!@7Y`H7?/fR1&mkhQ5A5&AHZfu/CcToU-=:SMpsduj5T*9pE,- +U!nC*Z5grk_*1C!-'%X4Qr!"TlL"j#7I?-2C0[2Jb,V`6>D/Yo#0Gg=nf\o#@?:8l\X8U`mS +_3jn#W&89L#daUm^!;+!2MNK,C=#*U8J!F5]AEHsZL?SODsOj8P52Pb:rMU3eN3p7\\YE<6f. +(B0`3FiOId.<7f&W7l"P$c]AB)";3V_Q;#Zi"u;D,!0Y +`_3_sDi6`'I[HT-SE7OPq+%UqV9jk!#G4QgCs5ko\>PTTRY<7KZQ-i++O2!+l:^Hl*$4W`ls +BBBMMQdp(8Ralu2,(g[B"JM59nL:%f<=lo=g-g+"%)o\`p+ZHS"468g_;r3;5Xf\!n3NC;4& +RfZg$;QnkR_1"<'9TdO5qJ,d@Fd%OqK.tu[B^B%X@I0!?#/RqQL<#[DcroSZE[7cP=a@.OWs +68=e3`hAhDSjK([UBYIG='35g5,Y5kiATj]AA-\c[sMTP8?Uq@uq";F(Z%>IV8t?nfWUb*U_m +J)C8UqSh-*Q=Xr^-lUF=aIHR($4EZ"+WC(72FL=2_iOj!B#VB+&R%(nE@QdOf+#_(^i-Xpo> +kQZ6&B`F43oa3I)N+gmE!GG-O@6j4Fe(ZSK2`_2Kpjbd,eZN'rB)De+-%'82*YJa6m_gI:9P +]Agk1UuX+3n0H``)rSLp&QG=eF4f?L*e#0HB!YnOVt87mt,EE@9+IXZ-nNF!`M.Vm+3d@(mk? +aoaanb5aH]A^\7fmJK+j\haEeLpqrJjX`Z_Jr6-@j/IAi460+*>d\!)/`c67_U(6U)8KOj&*" +im*EKfeSM#@BeFqZj*oA?41t\b*AtjtO!71hLjVSekXLWAZEGX+Fb+nc)h5e`nms1kK^OH,B +4?RH[emGDD&*9?ic`JnFUu5"n!Om4Eo/:/*]AFia6e#RO\@-mB76/#-3Z\54K&6kca"7Y+(O4 +]A+V$Zb=Y`Urk;[C*EABt?&!=`*n?-e0!,0f4(feeGVULhP\>+*+Z*q5Dtl8Wo)Fs15;59IB9 +"WIuAL`6^_:!m%(j?b`fPdXm[V/lp;dSqe3`/;>q]ApT9+>7$.]A4A:F$G!-ibiMp?-G:(qmsT +=.lSfk[(F@`;lgH\nT$mJX,X>?`a60/-WSPGL^8=BOoM"-`OYF,@^Gh/`gK]AY*I#XB=sG,7: +n\XMbE.J\D0(=n4nRQ[4jW<5,M`@Kj<'n^V(&OBY]A]AE^7;ZbrMYrok9B2!3mFR(qA"Fh7$KnrjuP1k*u +6(QqboA]AAqAIego6,LhZbh+[':M)kRmAA!Y<8:(+]Add%S_D +ZtE4N18>-cBGE(E9]Aj)*k$PKb6r@^ON@BNpM(0I0QF$8W_t4=W,8:gQRAjfN9-k+LM^h8-d8 +Wc`c=$!+IQ',2rc]AL[A,MpLTLtL0@fr>Hn[p/-.T`>$/;FP:X0j6Oqu:=^AS)#-l]AV`rO-$` +%U:D"Hb5O+5cHZEesJX)#:bL7R>,QK3j7iM[S.P$6UosrQid78mfhpc:ks;M;KKdI0fj:R84 +FS&:NBbgjHB[(SRSZ]Al]A']AALc?R_jp\7:Dc792D#_64X<6V++R9X6j0=?*SK+pY$UAeHa+V# +\XKt8[[B+e#mM.\lf%&0-piimR?8MWdKGpL3nHbTdO_JOKh$`gf4q"Qs&)sa^O5kJ^8_O]A@H +"L=!:L^l;*>\g>d..nZhW^u,_E2aG%4!W9O!([ZBN]AC_fB^m@?dr7_@WO2qWaUb%;4Jm-$%= +:#+Qp^UOh9^rLEi&*6QhTkg;(9R4d^&!C%;X[EW4D4nE\T7`MM6HR?FtN=B$6<9)Q[`$O(hblrVB,*mYJOg2.'N%Gc=oJF5&S#cW]A#jk)a:!$b"k2pGE,*H'FB^"^6J`( +``?88`9L?dhRr7pZ!/-j&JgXioshQ@P&]A:.@%8t#T^8h]A:9,^@pI#"H&gn!JsfBKaLOMo[]A$ +Hd4[;PHN2+]A%WQ;H\h3KJ1O2>MiCu=Cd5>LQ&9sQ7EG/)I['rGh^EG$D96W`9d5_h6T%l[>a +>^2cBZAfQG>_&d>ueDAC's5>Ea95W0XuH_N2pBpZ^b61V%!RH@P#jhc>+BP?Q`N`E$,3j`G$ +$LN5R?_gge=eD^m=W_Z2]A2_M2L).MUbS5tE1HFT>fG +R0ung@7r13>krk)LGT3HiH&fD"OtQg`=]AjQSK\^-=s,@Bf?^p=/PI`oOZsSf+XF7Fjm*N3%o +[[WW716LgJMaF>HX9*6>"ZI5skj>hoZ7J_'8cH=H,Fs%KAL@*orITb^WH*i6[(Y!DLnMr$9! +$j+)SN@KX#kTtQoeE2#ri,JJIh[>>0hF(Oe[.CiCjFpcd@F:tIXfJUN2Z88\OQ$)l#L6)ic< +Hlogco.E;q;Mmp^Xr6+&bCq[c#3H>\#+7b#=")ER8I!PndNB/KC5]AG9B6nWa*"Jq;f'[&?o,rW9\HS5`[AXYH@1aeFEVg/5c;"0>J);?WX'bM&W[;+l$25!.5>.m<0]A>sfcK;8)]A9Rs@"4Gt<^TUnkI$M]Arh";08XT-1/prL8CT;]Ab" +ASplG\q,b4&br)YetD3U!`\VF.N<.GUY_UC>SnHW524/[4">3/"JJW)MCo)s`'21Sb9%qNW! +FrRg&\FWN*Kel>M',u+a&fG;;Y)$7g?JhC8N>E'7YTUTu^D7u#814f3Gu:fg,Tf]AoXO%4C@" +2@OT=7C6cH4@$5orH,fOZ4)WQ'p7^s@W+G9lg(";IgiWup-O]A;`M.`?t_erja^/Kt)95AtJm +rB'`4[.>A->2`J&KHQVP*0+Kn]A.KmR)Hp1J7>n%5&iPtOW3#mR9V9ndV)egNGZ@hi$0/SLt$ +RTTA@jM'%Dkj'^8PTnKN;U]A(K#$dVia:TY!0[c2e?XI6UD6*@S,.,k]Ao=/($<8BAOHW';f\) +PKg'^,mLi[>^S-8opB+u`\f5Mr$K!b=F6erJU#/kRY+j\0J`dbJTj]A:UWjS6Wg0>5&)2S.L4 +7#3.gIL1qR6P5TGOXc)7;>$-:PG$"1#UCH9=U%tfSJDQ>@q4f*97EVLee]A9mW!1WK3r]A6fLp +UgbH"Y5+e]A[,*b]AUD@P^`&]Afuh8kA; +U"G#(VP#@DdF=Sp2IM`.3N?31jO4d$&[O;O$Wq7s2]At`:ShVQg8f?CMM-dNl]Aa=`![1M`BV'jLI4@?20NdP+qo,r:a5EF[5S#^nr'Nh=8i;]Aj[9p[u +H^:+ofs7o>Y&soVQBgic8n$g1-uh6WYC.lE?]AR&f:F4#ufA04L8XK).K>;fUPnoQOm&h?IQd#M[l>mWoKj\ +1baYYnatmGggctGWRlE%)n?qQBoZ/,R@L_Ya+!&Uhq(ns8'-ihnT4X0&[d&eS]A +L*2a69KeA0?L#qKeL!+RXsa#Br@Z+=pnn6':`ha!,k;A%YKNsSRQ$25Qq9nS0%I^-.t%l3S\ +\4BJ/!+rD?al>O?&EJO+('321!`6gJjF9;$\;^7rh#Z\Q^.QY='#DelUU^g?[pL.-ml +&n\C%d_kZOT_4T(Y+K8"<=r**&5R.8@hq*T,o[c;ujsMn+rUQ8=]A>(XPSA_]A`lKU-3\P4D\2 +DTc2!^T2mB>?/=*`e.E_5,^dHMa":RH+!M1>TQ[F'rAU&6Tl/Z%t<")9K16\Q5,<1=FXX=XX +H=fV@-t9'bc8EomFf(:TsV@^>]AY-N;N((UXQ38OHG*r0BDZ6P%7b^\qkY$t^a1esp*2lWo'r +q']Akt0R(73cNFW$Hb?jfQ)@Kaj83DirqCDtQWj8?_8S+IL[_lk1p@5C\-$3D-#03'@` +,e$th`gZpB>]Aj=LQ3CGT@J^HM,FVLZjY=kpHC0B'MbYIE`as[SeP#bbnlaC +.`k$B-n5iRn:[a,[F*h%X]APVm.(G@Elj:+!Kpk:JVYq@onF"/!@M>3!O5!D0XDcIBt9W``h +,2mSQ+5+EjjlHO<]Ast^C*8tZbQ?>uYAa:7=IVFAm45R;l<@a$$Dc"TR7/T-'Oo)Sr2^YCQn" ++`%AXB=5Jip`)c/WD^qR&P)+q%doH`B>FL6dC*4(3X^?UER1eeX\7q5:Ld:t>*XU+ITA:WqD +TfgOmsp@l*mp1KU-p"=Qt`h<);`5H]Ar#]A0XX3'K6TgkS$')R?GR6B,Bekr,r]A-n0f9$7n/[*=WrQ38P)Lm`@Rjpp)2(D.1$ +eseBoDZOPbP_lc+gXhhm-['R9850e\"kmT:$GU.uo'`B?cU0.KALr^o^!E$)B%YOksqjGR>/ +l\iN:gt^V0?7KR+6eKGQO\Sc\naHGf!4"&aImK5,e$%bV9rFore<)'gh_)`7G,50q=2H[^Lb +j,g(P5-#X$c!1R$br\mq*@Bf?W!!-;8`[_(qIF +ALCDGt%G_8P"nDQc>i.N!?Vmka2UoHX*XNoVVSB%44i!DLNneeq/%fEqV7p?,d]AG*Ge&BN2< +AC67$\0C-SFF>GLA7ThfWOb@#Z.tk5HXQid\QSn%-*2bLR)GDm0j%"=M1XUfo#RS9XaqFl@" +d"C3o^9e%RP,RnF+-O4kCT;96AX);3%IMUM!tRF)hV<2(KWMd-j)SLh3;AC:"j)aZF3V?,c5 +i*M8C`739q$hj.8VZI7pp/dd;D`Gs#OAM@ou`bMkX;Fa`IMiZ2Xi-Yf\Nn/;BO.OKmSNBAkB +GqD5(+'gjC%XoU3D]An,*C8;lDiT/qNJtAjLdV&.'1-K8Wm]ANX6LW5-X@!\1<'U-OH]A[QCY9B4%rjYrK#5Lr#=-/I9JBBo5Wj(DaXLbQ54\ia2"sRHqB_:6q;(Xn[2gVH`)4K +DF3o +;hE*`Z#eCqCRT=DF\5b ++lRr1'TJ!':*2e3DK#L+GD]As^7F*)dqHg0!l_6O4K1_I^ZI@%`d;O&[VO!o8'!IDtVnn +h35>Dh=)/("TDcYZI7mgk,[&ZEHno7hIi5>5ob"8)eLNqEk?_F%W9*p$o:I6%M+OW4.* +rJY&@aQS0\48JcnL5'fA4-\JCW-44(M_l37s5CrnkiaGAI/B!1Y_//bdRR<^-'*JAR>Yf:h\.=$d=oQuEb",ec=@&_;q-^Z'I1>6H)M5M4UXh?8,usQ=1j.C +^O[U/ke_\=.'+L8/FTL2N)0<6d&ej'6Y%G+O/%%C2B&;W\Yc8(3quQ9uT0IhFICfo:)JmICa +"D43YbNum^Zk+bfa&m-iX2(N*RN=`e^-TORC#rll7k#f15F\*hF0q+Jdg8^hL>,@>M([G%$DKTZ.R^Tdbl`@Fn!c(Q0VfOWgCV<@Jj`1?IUt7 +?^+M[!8r\Dgd5ML2O7i0%miCR-JVnfZ+hPJc:!^ag9R:T=[.*TuR^hiW9YA#Qg^5s&fU7STM +hb#F`*BC$*#HDtB*1?GPguU_=7Xh22VNtYBK*aPElWE_\6I5Q6pJW]Am`m +.bXT81WV..bi-OR:8Vej(T:AP/coDi$R1;_m7Rd_1R'UJU'5K'RaGb(V_pV8.ak`K)*9Rqb% +L+K,/+MB7V"6Dpp$qc?O]Aoe(?3-g<$I;1TAjQGVFTWBk^*]Aq"W6%% +jI($hL.MZZff&*&b4=#0cY]Ai0eM4$2Jjr74b83WOKD^?"G)4>pq[%DIb:`Jj9qiq!h@hu@+UY3jDO'u]AiUD6A.0=O`T9Whgr!5sXtRS +UjXNo8af!]A'>c7#NKCP!PmrS2?$*-&jH#G>;bh2Rq3BF)2.@WKp@6;V$=UP!#Zh3ntLJd>Z= +jHHO9iu_iR!D!2[Sf<&Y!O;;q8]AmKg]AEZ-1S%*t&BT=OtE@ftEfskua3Me`]A=iW<7K=N9$OGZN!JLj\VKA"#_,]ALWQ\L6LNu]A8;&r^PqmTa93bLUd>Y14c+(GEL@,(h!KL<7PtbRPo?qps?"_u3. +$h1LInNQo[.XbLf:q[jaVI6)#5<+Qi+s+lSi$&d/\`p;_D_2D]AuOn-^L-\5%h?3.-"g+TO:P +%UF3ErZ'*duqn@$ghQ"FU.rKTV)9O+<4((PY<$6*"<(oO'D.*OO2QI^m\IX98>#/X%E8+@rN +(V3bBFNmVql4>=(n2b\`?!F.J1[#%Nc@PT\*AGgmM6ER)l,ph, +Qg94@Vq(G#Lk=ft$rL]Aj$=s`Y,1AoKM[\#-1$%b430>U@%8CbJ-`'F8H[ALW%U\nTT.WLk5C +T`C$F6rI)!Qit6f+qFc`!,o*:3,q$uBYLHqa['d$$p.7IA9a:WR[7O,q'Oq\S-9*'&9GZlQa +GhsGYSF^H[W2)XZ/+W,T0qYgL;pd53d)#F9l8/FV[ZZC-s4PS]ALb/hZR[A,_Br@i$?',;\a`=)]Ai)<$-XSjaCiF#icS +Tiq28f`EA2\>^KkRk<.Mc#["0VI&0$O +Y2IuL?X`+aQ0^9pXQ^nPdJN3aG;cn3[gp?oC#T]A=j>j(X82j(A5FViJYhuk[]AinWktP$Z99MFbptjcSrV*h_gDj)gdMNe=?5$8?663>F;S +boZ[_GC)mCIkfn4Uh5#>k"L9nH[gA_qsVKU<0C"e=-![K-Ri\EBF55@D3ot7HIb`u`'$jj:; +[TS3F>1^^>r['.U4tKft=JkB",7Ya5a0WW\87--84]Aor:A*WklZLD*_ZE52Y+<68IMHZ)&X= +fdf);"]Al"<3s-X]AAk8/4FocGV[DL2Se"4r&7lE>'c. +[a`q8H,#cn$G2Yd:Jqp3k.RH(oB*nue_cH?AYb9Hfo`f3SfC#O8r!"9mW<:It\cYr6#o4^,' +PlToBltoK#/P5!>0TO<6+)#WPX/c%PG+-:JN4aLYZYtjtNqerQ@QD"g"%5i;*RF`7(q]A#ZOMiCfIE*K?-jV1ne8FN<`d>$Rng8^AY2-ZB2G?+,Jqc(3ht]A4Ztr.HW`j#9E +Gu'Z!U*?UX3h.KT7dV<"uBu)g6^+)ddoI_;`N`'6p:>X\eNO&1,]AO#0aQ1n)+.)5FB@e6?"e +n2k^Q$.M5`6l5\]Ah]A(5surN'i"djJrA]AtM0Ll*H^HX83S"h(O6rkJ]AKq;pZkbZPupkfSdXE_ +F%XpHW9#("'A,L7gWE37BR_71fRH'S:;-i,l`9MkWb%%"#st%TAL_E9'-6;lC7)oJHu>f#Tf +mjFE@Wg6j2WI]AWP;"+ZTbk]A=Wd^@h$e=3)r&P*rpXn>ac^>ZAd0j3BI!YP\)6>or3;3U%.s' +Msa3LS[Pq5n!'#W7:5)b=1Sf.43nTkL2Fe9fP#rGK.C_Q8#Lg'=BO0'aJkErQcRu3M0s6j0t +`!c)[2u%?$GdCRDpS+mGTtWd'TmMbqo%"LmdMl69i2HX/i[[/Sm"s>D4M-3n9gBrMmH6=h8HZ9b?RKQI[7qMK!D'j.Hd,0IrEmBTgc;"\qLT(N7pc`3tn +?G>hX^f\O!W&49IuFlK\@Rj5;VIZP%sqKlKVpFd<:`Lp^"nU1$l=^o7LAh+c;&(63Q>-c=+o +shI=2`cSQk%cq3jmdaCZ9NQLV!,]A3pU9rVtsFkj)FA]A5h]AgasQd`.GCTfgUD)I]AtZ%>b>C;# +CkS4s$p<"iB$+OeF8Jn5n`GJT_/te@8-UfH)KRF_-`JCQA.0k1@U]ANg-B`/_dk^>%l2I_g5- +@&C1Amt"bE-n^;l_uLeal"T"AP=7C2:4X1/S93ZpnE71o#1-p,:W#+`+49^X(C,T$"4Eq/E& +nc>jb'#fc*,bn%sGM0_7 +3r0QRPj<'gGn^o`'ER_@NlktIb.L2h*cMaT'N4PphT)3S[dr'T +k#329U'u4`=#XJ`d[d(=CE:2"5B>B*e@\e6hq9-IrXGN9(3&m%Hha)NTUSQrb5,uiRpV6nbD +tA@,I/O<,-h?qd5V]A=m*X$T;QF$iI$WT##!Q8P-pG^>ruSFV96BmaI!tP$L2QEO?Zf&YYG`t +;#TL0:-BR5D'TE!VLAVa+W?) +Q-"p8P/$"-44OpZa5.GnQ(NmiT>kD?cbi2F;Y(sJGgG\,H]A>-]A)):"R[TEG%(tGALK2-DB#h +6SC4Q/OSZ;s'@5UnmF7f!Yj"E!eX,44COj4-(pXdJL5;g@Reut$]A/YMnu5M0\Rh2"#p.OJN/ +4Qnc`4r"1o0sEc[`E(:@hINEMX5UpqaScM`l@q?GHKUJi`t]AP@5VGgQr5fo2;7X+4@,>="@3 +I=Wa#'diD!.kWP9#j=WUcdPiT@oK0'BP)K8P:acVdf*=iVg%Gs,BkGg5Wg&(5PlmU)mY`lk! +t6FoD]A&jam+o0LoKH7*p+RnOiD$&F_BB\Y$3fH:JMI#e1\1*d>e`ne^U=mI"G?]ASFJlbj'$^ +AO\f`#/DO+R2raL)6W)US`SZ,'uC5NdF(Q/[Y.qhUqHmVq@T^6(ZE_n8)CThjhYd/2]AdaU0' +/,g[>r-/iOSJG)G=T1uJ:q)-;03:8P4/!a:ZpC^KsW0:9rGN:2lM/8rQn.3W+UhL/l&:W6M8 +Iq*P@7POQh6;=8UN@YR-e"`&mMh`*#XfYp%,D6:.`]AnrZ-p#WYc6YoIiUl8malJLLNFbo[a, +cCblLC*j'M\Kc,]A,.%h`Ck8Vjp/!nEX/bcV^jiZWB-mP_g_0'AAY8Ts3LHlH:*TYAL0L7'^c +=FWd#N +#r-mVoKLXldBugM[Nn5!L?>(LZr+!Lk(a8&g?oi4Q/VMo0"./&H +HOOV[%q3h;-T+bIR1ln@FVi.J=Tdr/fG&cHCGgfGHD96lHRP[pR-'Lk0PJcHaF!]AiABB>5G9 +&H]AX8O&PBC7MK7Fs"t3(q +Tn]AO#\SCCKH:q4s5>J5)H'J]A.fjOBK8T`&Z$4NE2nPg^Q+gW]AHJmUE%nql?b1!MrY*iq-A/Q +^2B]A2g5PVa0A0#,aS1WTblYfEP3bjY-`l3uT4`62jG=To$8.k3#t;,X()>3DA#.)=O^,U1sq +eEJYZmeg!aC-G +XPm*^5drXRWG)o^_iH'm&D/%3PCoQ`'.Y/?,Y2jkMF.`HW'lFo(ZLc@C.Vbc?)cO'-A)jNh_ +OtdK\.0IH6UHUnJ["FFGQAsUPM&rh;5MU.cQ&5Oabt/HXgPLAe*lR0UWjB+l,0tT%k-46_^& +/%FlY#qTT%-`C(`%X5Ne$HUW;XLVFbO9DcC@WnInG9CBhsP6,.TlKW-RZ/S4HF]Aik[ +ca,&\/]AdfBj^bZLU7j!+Gdr-QJlu#R6*a=eO9O=iIqXnPK;RkKA=W"H='1Jao'3&9Y4XsIa2^':d=B'? +fo5m^$NpKAFSoC.F0)T.R'\t,JU'gCQlgc7-u +T`17lc.dc:@>fMTZNc=SO/A8Y"s%?QfZADt4_*^T6 +]Ap$pm7M;oq>Md)o^K);8\2*m^[X3QURb2aK6jAQ.>G'%1l[K9pek((/Z[Gm:/=$e%R0D+$k$ +[>IX",6DV6\\5-XXX>leX`ddo2!0k9u7<)I.*@ED4?dFf@b-!r9?6G*[!K`\Mc5B +4_mUGfq4$'njI3)E98E.IF'9-eHmU]A4VR9C3O:^ +h,()]Aq"45X=[ophKq4P5@1F522H +QYh3?b1kO%OS.]A[k;&)Q^@[FU1.Sf?tEp2j,G*(=MGqt%rhaUW\.HD_>)bR!5!CA]AF8Ba+TX +kX3Ada!Oe4]A>%tZ+%MZiM?l+t2,RuAXXEO4P6EsHtHCg.O+P'a[2q8;ZJHK524VnC2aUo!;]A +qp5"9=7\Ma3N*D2P2p.\OM10juVT,ipLH]AiWaT[T82aW[oG?bm/0i^Q3a&j7,gb$6Jpk,i.&_$9 +djgP?CdjRF]A0')(C^`J86F0',RPr(QX!4c\<=9W1(2i4K^NpSZ3HX26$\\GAKVC$ +:g![AXq0)LYgER6:"Z0A+>0Ni+2o9Kd7Ep$L^AR\&=e'f/8e"H&d_JI6$W`s=X:/50-!e&B& +&:I6]A3kRt!kf'=J'r%P)KhjVcURsMX+,3[';c0>'OX"3_/?`F+e$Y1$:IQ_97;TOV\`Dq@"uA"[cK[nTiFuI2Eq, +G.MuY9K.Sf4ER[%?+RC

e*,j-,b?.O)Q:nO'f%bagbFi^)Db9 +>$SnPUb=&e@a`?D,luE;tN;;o2lsB,A&sLD>aqokDr/!jLBBX$MKA^3URo'Y +-&R?qg'p+O;Wh,grP*=F:fRnZO%Nt*[e39-Np1E;TMN'$n8Sc$f%_k]AHJ`(62^fYmFkNAn*l +F6WpkcLfo)U`S$:nM@D6ZliE+;*TS[t@\]AfRG*+bO1Djh&jteb_0;8Kr/hNc>u+,oidG"JBG +t>%GYnpUAp)pggG&DSLu+q\,D*%*a6_K\$:I*b2pf#S?fC5&I54_&&b$^B+DAU3e*QgTI1i5Dn*]AF318fe +@:)o2j/O3SSRjpac@MqG[m1sK[f=#i9@cd2D,2"KV_5jdck,lnbGbf,_N#C83^H[qZV]A0Zc2 +Z<*=>k%`;o\]ACm$aS,l?f3Ohq">S;gVfka/@N:\c\f*%*qjn4>k*.!d]A50t5L9L.8Co1KFR8ARanApEf$@[R& +k^0=I7JRMEX>'RUQCY^s<1TL*YNoK"#2f?jI.=E,c>`fbT!jCak>0R0aR=&G_,MX/^Wq0PFX +$$>*fC-qp*7AJ=Jqj%\rt:4IC@@B@(/=]AR/I;6[f%`im^.6-r>n[a'P'^;=sUa3;A^/Ci2Jr +]AKg@V%@Rs)ekI#8ss#FhjQ2jV[aZf?XW5dDKae+,1!^]A41%qu6BBQo,@N)sU_i$4,fY7ae$J +Ir>M"Qbd08eNik$H=?ZJ$W$kP.RR3(3QL9kc2k;J*\8Wa\5FQ'r"NFP#NL6;6gp+A#YW*S>M[/^9hp!a!J:\<"&A2nT$A!l_N-8B,u`@qDt$rtP)'8\8L= +cFrg0Ck"G,L9QP:/h92%:7o,bs`r8UZM1`([3,!ACGjK#Sl3p<9lqS5ngT_)TLRMp'V]AEcc- +naCo`apZ4=Vi3q]Ab5^TA%%b2PNKqhc@PGNU5J@JclW'tV1msCU;(1.t+n`+na(0.(>s_AGsH8Xqp]A +uKYFF7%kpWdSff22/P\N?:O+d=I=bqGoY+_CQ-t9/%0Z6[h"qTFI2-SNV:QOk2->:SjEK7/' +cuQnnP0*;YLQ+E?55L#eOJ\fLIt_-O4Bl7g%q:_@60u;8VPoX^6&ZYg6\F*m6-Q>@X(p0cX( +lfTUD578_l-b@Zs#&h>,-76d@n="J,d4^]A_BbD3VPP[F3hD[I)#EGcg<*"oq5L?53)K\&&%j +cnroIPI.W`J.27Ycph\NVI#\FWRAMbpGLgtP`L7=Zj!i@3!2QCr_H$ceLGB]A&"[q"c-@-+@< +3(u6hsDCq4um.MbA"6Sl)+5:GZu:O4F0/c&7b&XY3_nWc88N^\E;[f-A+,"K904]A(E*pt-#_ +Jb8A51W1nL1p8@NMRE#_#_Dt+fUo[]AL<0)kY1diH?Y/kDjIF`(nnJs#i,K+O$pr$G1:Uu%4q +D%,kjfY6sf6,n0df:.S&q%pZ8RHm%I_/#@N>,k_jlKJ(c#/l8?L>2Uo&NNk>A1hn`SW]ANKYu +@39aFs4.`J+\[3e#(5L]A)J1<++cF6BV=0?@"*mn.Up#+tUs"Y'"gnq5D,3m+ZZa:L`bk+&kA]ASDhKk[6Q>GfVIE!bl^*Fi,Aq.U@&'b6#>a2]AQkNUA"&W4(:.f]A[!:* +m4^U46Epj0Q7]A:BV3odYIWCO!T. +)$AHF;?UV'N.Y-aue.HC8aj<3ag?r%/$54JA7p9+Mf_jj4[rcUQD$MO4+V`E>KpEc!^K1&A$ +fg6>T'>`.R*b^C0S6icinj+JWBKed&nb%lX.K+c4[K5EIRE9kS;(/kMH_J+2+@67l)'dme!o^]Al9Y-tGe01FC1]A-jlbDj,o4&>",0Z#(ena9dRoU+QfAL0E1%J6M:G_m/&$;ceB$p +:u[T\"f@Au)(\%PnMO#K8C_+#pHVL6-)f3BJF"o@m4sh<*GiN#qhII=!2Z"+#Q0Eh4[H)89Z +uA<(`V&nf*<8`_qVpFfg1%@Hc1h()X(*"cgbB)dl?j/@hpCB:%oe@9(@<,<"q*IPn[AKi35b +t"b+e@c1PD#l()%JMV4T7;cUf!%O2(:'R,kb^87;n$6at%XoS(]A;AO3.#T=VE62Qk%=,-KXl +=PnZU-Egi[ZClVSYo,?=u[1=H+@ZC\//gn]ADl<4,UlbtF???Uhln0+V"($)etWr1+si.[qIQ +F/pL:m^`sgJ>8]AJX'lCS:jYjnm+j$/BL(5*=VMe0%/pmhdRQJqn"3:Yo@^\tK@Fb`ZV3r&RJ +"sTaXTrK)rr.^i@YjP0@,/IqL&Mt[>]A>p2Pg3K)`jPI%b*tNGD6nP1m_@p]AKfSg7m0CRlF]AX +Wb'et>(Ar5)]A7UcIds>>ll8oo*OQH$L4`;arMi%m4MbjVR&pCi!oH*q,g`k4-&;-)95+1LG# +&gVg'V=?Zo(oneRhPp%+O+s=410@7.GS<[SO=@h@ia6,W)MgqkKa(.qM9(269W)p=53]A28+I +tL@4M5^_m-F7h!lkP`'BlrN/s$&="F9C@p3=3)#mAl&DM1%k!T7pr,5,PUA6MQ1`*3rg9#ZG +RZYZ0P_JXh+$`rG[.&`5hUK@8ENo.f"-PHJSQH]As6^qj<#A3cY5i6UGuX@OimuPVTR)-OFnm +ku9sgom*Oi!KBXWid=V-DnoK]A5GN":]A59$_*_qIiP5C6:@>T1"oV*L&!%m# +d4>kg^ltDe;e9M2[n;lo%d`qNM[?W:D/G,oujE+HtY;s!S.\$b7;e#+db=B%gpJVF1]A]AX%`3.8@pbi@3r5ra]A-eZ"^?tfsbJP+^HGa9BAfR!Y_ +;"#%Pb\f7C,DVLRCQpVSd5cg\V!U2IPuM:%RGhUqFg>1S>%]AR6^:?oIh'N_*pFe]AZr?+Qe$b +$5-T*pqUkMPur"Zgg$^O1=5Te!,Jh)i)jB&d[C*m2dG<=fQ>oe1u%[5'B +Cq0qs7&$,95DJ=mOjgW]A_!ugAABOt9e(C*8AJt9YnD<65t\lrq;;LdEQ#ca>WI2^rg_P,)5( +drCJ"K!(Zs%O3TE\d6Kk"s\]A"/9)QiC$]A;jqm.m#8`k!*FSl.firn3h#Fl!btO`2Y42R&N*4e-1Lr,(bZlC[m^<-j1*_!a%L7Do +=OkZERP+QGoMYbMOEE3ND=(CE@LF_h7ta,D^S"#k?Lh/:`u0hoR,L#LAX3MOJ-H!>o0_Kp>V2,O#@P +HHl(s-r*bWgD1H)D1U[Ye"_5Gns[(EC,Pd)Q*EmeJ0tm2f7IM>A%a28^P#f/6Q;'P%9EG$g$ +1q.*VspagCDBs"TP2:Mu+j'Pa9=kQ;>$/Qni-lHu_@5W%b,q0,h<dVVc=#G&3^5X\@M#/R"O7+5mpU* +@6Z?qW#]ARRonY;n6)e1RgH8>k3tO2;`6NT9FgANFm:7*TNkkROMBQ)g/hRn<3Oog*FV%R73, +`>,s8AkdJ9Ac65bZ:F#20,I0Sld4.GQ'(aNa#]AdT>E9S1k]A9+pdT]A2ec,t'iYP3)@0?s_XJ. +gAhq\3Ha.Is\fI;NLgSqb`Y`;e[-titM46EC_`(09V0*8GAC5[D1jel`uZDkfD,_$bG7F=U*CO +8bo/bAqYCQn4jQRNYfHhch`dmIE+&AJ"l.^O59`kSN@.(<8l#TJo>,E'!!g.u3,>OnTg>Tn, +]A^TElY4odYoul5FYPahQ]A-?F%'!TQ=J7T2Fg-cnHtg*A(GV^@!0G9([$(XYj^AL[N@R@tRHn +Cs#$oA91gDEXrI?d>4qTqq-E_'-#(pjE9keQ;8*faFkN59&bI3=I;!B\DDpMKgLrsb)q4KHH +..'$"9X$3n&bAobmD&CfkMkT-e%u-)W<*GFSh*eho2_*K>F#TNg%eUqd1P>]A`U>)>qE/>4X/ +C6DUDYOiH.RFbrI$-fl()=R_ROkme$"dF6a7(_4WYRsccKc;#Z(Y%Ic$?M(i'%r5N:?B)``t +_"F6Zie?aKLgRLna/l#/h"m8.Z[K6c<.RnK0VfQ;(W +R_*;.4pnPi?0\!Z2^!jl#02DGGE9X7O#lHJ%eg%C1BS)d5Ps%Om+S(s_:qe_Z1&Z#oKr:U!%-?).8M!:^D]At);e;(^#-NU(:&b\^XfaF>Y?07D.5-Jcl +DH%.VsPjF(Q?,aFPrc9OX_HR'@m2H\I:\ +npSU!SfP!JJk5!p[9rQU.[KY2Q23dX:?d3T+jdQ%iZ2Aj):>o<-'No5'?NgBf"Y+dAV!>3-l +CI^"R,jj3'"+hb`Z[`rT7#WbSFPQ2a3]AjT/oHLTM@9i@G+A=ZIRrO<>`&#S`=E9>C8fqOu(2 +Cj5h_TiB9u;X8WT?Osa8iJ6#YqJASQil8s6MMs"^dK]AgEI5t'TWeIZF2A-]Aq+:ps3UnhjsWDm3&b_iOmnJl^pp#3dsb+`^Mb3Sq +*2*&u9b(J-h$V%Sf]A#+q/IYLbHR!mZ9CB^0*#uEB+hX.IlaY]Ab>IVpN!pf[VlrFNPdro!QFe +@%cY"5D9a%0B.E1A9u0'!ropXlX.sr>UH+i`XtZdYVJH)VtS6c.!l^pD8hm%tEIR9?QW\7>s +pm#BiGRIG01alcMR?Z]Ah&G['6+;X,PUY89(6CO7/;id(DY-MaX<+R,+)76P8*5Bt!X'0Qj=A +mdMu:gngJske@+Unf3tlpF+4QKc`ftn9@+[EW'6C.*-([O?LfS!aKT7$]ACP4=n/LrcQ4GtMq +C`X]A%l;XEUX>d>^Q+#(7P%Ngaj`1iA77emGGf_AccU]AX4ZXTbUj-eL5lc2LLH,:Qr(&RRFJbFb:*@[0lNnhsL0G^PRcC6J5kJDZ+kjc@pisJ"81nnOPCr'V"@t'[IU)X.D)N2#_YcHl#6b?. +>lEW3-jsUtp=r=L!)k91I-lgWSPuZFS^H'L_0eO)o0QTIf#l1YauUd%VSd*t:mVR0`^mY7S" +1K'cW*F`Md57]A^I&=BRr>$khSgD)r"EJ"!&@r;2E!m$+*>'&n7N9[..n\]ASNM.FnPgA)qVd@ +/e:O.1Ma#!dJ2D@gIhkkVi6]AsD%82369W4Ng*0I_FWB`u.r.SU@CP4k^Vfr_9@feY:ZclZ6]A +(hB4):REV#9,:q7df3N0YHFKaQX1]Ar[&ObgG5[57#\bZd.@;p+TNVk!ROL?reKFHKunVT"@V +TeDHj%(.04+KV4"H".h%F756~ +]]> + + + + + + + + + +=aCM3k8q@C>:n+416@( +;PEn(IH,ZhIdAm6)&M)G5\X[.n+,tY:oV +F'?(h1Yp4MqgESM1%;QRlr#H\b2G?fnjSjaM7l'P"TT6n,BsOEW1a$S&J/ol)A\SF!+#'mgR0%rRgurtes<4'A*-na3U0:@D?Zts4tJ>D/M9\RGjNcK`_ +#&p&j?5dkQCS+7#h4LV,JASYSB&HC/4LokdMlo]A?@^7gN>'sR!bXE=9bCMrWmO*`LDlSV)Tn +IYEOqoP\Dl]An+*:Bl?ul7Hl\cJN]A_nif)HW!]AfI1K\@@W480`S<1A+dHZ!(=K3.EW(#381X*Tms5HSf;i6k*\P +gjf#X,+(^o?XU05E;bk9UZ[`TnEJG`Y0bd/.P*92->9, +q-BkF`)cJo0O%Jc7B`'=3$d(3H_YC+P,K&.>KUGT#?(n56^rIR[PPWTf= +FbO1X=]Ar3*^6X]Ap462mD*`J&@Q+F1#g9=8`q]A9:YH%PdIT"bMm=J4F\7&R*V8kgb?_s"L\M9 +5&Z1bQ!rmhV*\;EQ6@WPX\JHmF\>G,eX^*12)R +U;t2$e\uOB$sqOWuZ\dYpa%m(YbtXla#]AM"hp/O.Nffca9a^U\YTF(p/ +,g1_ckmL-WX]AqfS<)kdTb$j7sY7`IDBW%$F)TQ%$B:'OrT_5`;f3BjG'a:L9SXK +O:1n4\7540l3nnJ=k3;,<0 +E5UtKR9n_#_n>9>UU([72NoRU*T6Mk[\j:$G^QV!U/44m3=%:^.AX;Fn-)O0%!j=HYpesZ$? +1Ee:"T:%OWY]AJ^2pl4+j.p8U::&`@-YB8:r[@oKebaeT&H+WMKq3067^*^1g'0+"I?_!r_.( +REkiE%uj[JVIZMIUi9ETVR%l) +M-(`/_o4F54q*mH"Or:Rtg`g-iXN#@b&3oZ,T.,Dc6'TDB$]Ap>i1EtjNBMAS5#jF134samG`R\RDQ890V&bIC +$8]AXr9hqrCeKrP!2t@]A(5WG8eb:UHH=0RA=_t;`Dd^8RpBVpIrH,;X;OK\g]ALH>U[DDi2,b* +_-XH@K7@4j:HA/lb9l0g'2W@9"Wgg%KZent^Fo5?FRc;.9./kB]A#GCA$_:HRB=&aWSh-\ktkJc%4*3 +e6#e$c\n+R[%aR$HGMlQcKg5bd(N+EDL0Tpa'.D21uTJlJe*5_S"E@5AOOanJopc0[?)?`A^ +.amXT>(V/"\L=Q'ggC[8o`rYATTO4YU?L.H-D5HuB*"-R`Q[,XE'K_5OX[_6.qlVh3,Ut)IM +4s768h]ASh5n,J:rEqE>-Yindj[I.dAL6/U;%[WW$HOHo#]A=$qPG..UFW/Rj3[f2SP>!@h-kV +->at'U\)Ye-=Vec&+E@O9-d9kJ>dTnWr>VLH?ESZ[9Z_"T;B-Yfb%M/N%mTdUIDn&qYJLOap +a9eJF8Kg!cA6[K$J-D4"Mu#c*$g]Ac\59YsB(:@^.lVL!K)BZZ$A.D4/-oG:&Iq9Z.nZ$C\2;r3 +?^K`@$dJs)5%e6f8iM\m,7a!!39*VCCfeAAOP,EHk5YbEdI%G +h11lGX(JEqSV@L3FJ9DiXt":6$]A2"91T#B\80P\h)S`;]A/.1TLRh%?Lbh8Trt=9E8+$n^!#_ +0(V=M?T"MF2]AhbmD@2IYZ1gjm1Md,?,UAiohh*/Ot7OBl"P%W"Ffafghb(h0tVc7duHH,G_U +CqBHDU!?7a9t#clZ24E10:RRMo9Z&($N[p:-:\hQCHMFj'&E8fon$LZDKBPQYOS8e6\OhLUt +`ZGXcNCo931W5_(o(@:hg1m9'%>gK&c8Yd.+0`-(,BU+a8@X+5q`':+hmY`DbgC/hfqb3suB +rkMV%d9Z,HujqMd19cebU%j`4-B'8);&cd<(?2?b2s0[SQ,qj4Y%VB=7)4)WDqBWQFb01:>; +AZbY(0Q`C]A>5rq,E>@l=W29QH212=%tKh5>W&!@]AEU52W;/l4j&/mc8eT/bMu'_nYogS[P2i +EF_[;5[^k8-e:WIpA-e7C-hb1Es(NeK4>A\V.#]Annps-\G\=jt2YDn?Ho<^h1X#,HPG##!nT +#Q\6qOe.fBXj1_-W0YrD]A>;>"\'tJDo`,ds0I^Z@9hk&W\pLTX3p6HprVJ=^:nYJp7CBM@;F#L['\?81C,5=mA:H[q5ee#KFrV@i +4Tj/I2^$gH8r@^EPX"Uj-iiEVfq!IRqM]AJS5%[aRZ%-SBCM=$W3@57-_th*PrhUQj!ceE +SaL?pfote[A=OQ#$4HUV\nF8u2OQl'+cAV#Jp5@5g!4U42Ktp*d8Y*QaVd6IJ3G?E3*C>'FI +jl)9.6E_;O\"o4oi&Ei +<:TuFI_jo$uT<3tCK,1bTJX^jZg0>N[92DdOrf7Aq<46(V,'WE.]A,h:sGqe'O0hiBio6U-8, +qUE[,+`q+AH`a>e9oSOan*X/nPN/OXi,V4ueubXe/U@U0C'A@(@:G+lTR)NgU^2cAM_TY.#C +TRcK5WXUYuRYY4d-!T`g1<->+lNuX/.4jJ&u))c-&G?p@U%%j=T'Y8cqWS?>"ANjr@r:`8-S +R(ag-Z5^uN=0XZiM-uuhD+p3g5i#UYF(FD54"d!c19L'0;/4[o:B7IHRJ@]AY0j:qI[M(^[cY +nm/?2P2^`SZ6Ej%s1T79J:SUa+3Y>Ctgk9&\L*rpq%?3c:p1B`C)TV>sO$?^2,TppaYCZbGf +>72./42&a[Pe=O+li_-+blHmTFhdZWB*QR3tsi?RjHXi5KH7#[5!$;oGR>n]AWU!-o?@lnT0d +G1H;BG0g1:ebVArbfd'B9[.BU3,Fi72t(TTR)(?(IPDN9d+6b`5GU*ch2(^7!B.+="C`h)1o +R[A(G1>jbe'R:.3^aDE:>hj]A$!:@+=m6V+[i@N;Cr'PLlEJ/,eIdSH$d+d=5&jX`(qdGm;N? +cK3m4+[>i6Oe-E2Q_jGcT[LWNa=b??&\OUSK:a;FrB29FL0biqFe?ES7S7ZL8-,fm!Sq'QLA +rh_S)J;2Q:-m1#n!+-@ZKPZ-(@f/L8AV@ol@)WN%8L34P*H-!4=q-FJ\Tnf7bYuPgfi +?fesD2T4"eWM3+M:7]A\1N=M8(;*oERXe0YGpMQ#_Ai$\g:LCp[4DGL%Wj(['qnMo"Qaop-h4 +71#ceD9Jh]AUZ*-nDQBuP$/5")rNG'U@m"rsAa-cfT7=rH6(/Y6#[3;FFrCm3eAY,[[f?Cc!-t0)m\38.TEJ?@*J6UV\;HTtc(nm7^p[^Dl2h>4`L[InbsW(b3o%hN$3nX +*\tPt*>aV=bs6l'?<7?Vki)meVhPCctg(b!Q?&,SE_t*F6o0CbH-j,@Yohc\AJ^.9PJF)LCRA2B]A:h(itn:aV&[5- +R`fX:V"ah@s&W+1?bMsm7,boZ4n[/D=`>EL/(b3;kcH%#DAa45>3Ti/MPL,Q)^_QI*UebBi+ +-h]AVW4rl`]AN#";G'tFHJcE)[pf%_oC!pV64k05L#o4\GXWoT70jA`N.n>PNKr_P5;.d-T5;# +m^5W@Lr8"Jl]A7d7JY&I)Mcs1'cA2V.1Fmp_f4"47Sm8'o]AeQ7X8NC_E.t/mh$\c5e.ARO2KX +PfhW1=Y&/?t3N(<,k`e#qP7CiG>->Zh1+(gCYIp3.)WUOItf\%E\6,-c;]A?::!_n-Mm0r)%Df(]A7TZr$1As5=p0Aa-0(OJ%l$UYIff-P6+ +S-I"Z*)>J-"RO!E8` +1g^i?H$ao:b_71Yu;u2@fF#LkP/sb4;oC +ma[eS,^Z$gnU='nqUUh&n\LkFA8X?1RQpO_noYP'Ff6iLfH19lU>qJHu*c#3b:$Zo7@`0*SK +1TZKkK0=.:3X0hm6f.io^u-F8C:bo9b0^oXHM!BnWVWXWN:pEn^0--0ni947?Qe`dbFqeZEn +^G9.QY5Gt2u$e%b4RtLB5iJtQKluq#d]Ad_!6ZP^FAF[nfD#RkrOEFt%kM]A@dOTKnon +>5Am`8ZO`9DTiOpEM,OQ(AmSdLIBN^LQ5g^tA;,R?pfa3^XWL3.RR#^g9=U.jcB;]A +AnRW'ijr3b98fK_FbTHWZI?Gho=+DrMKIBqR=!Hscqk"\Zp,(2Q0Bpa:V$;j5UHAR$o+R5f^ +4:R4TEU%XC:NBB2[2b"B\8,JN4E>1:#?'ZViN3`([)X:@M_,o3$3nT70;LLRpSlohs$(A3Ym +\#^l+h[XU/KkO(oCY>^[pZi2LZgp8?>kIAa(JZ*);[,33Nhu^6l?sXrk2&]A^#gd[ +2C59Gg5;BnN7\7LC$6gR?j"Trs7plSpok*Z0XQ+ +[Iptp:OCT$Gi`,$A)X&rob`mCAD(Y(&C#k2@_A(Bng2-DQeKDZAc +4,hAtL`[,WK@oRYlaO(1)/fC<+,jApEgG*)&`#PY%SSTHmB1ZOf^bcHE+'ejWh]AOG#3j7,dJ +0T/r\O68X=ibh.@PKW;rkb:?\Bqf^LVLZ),aG\F!S?Wjl>CElY#I^fB,5.$-Epc*"H*?R!6W +Ph0qpBFK>WE8.%tAhJf92,Kb+W5=,FJbW,IN'7,DB]At&1&3Z3K>%Z_c@F_i@5c#5,MqDuj's +!q!UGWYWH]AQ(IY=_^.KkJ*s+7_T<3P9gI_0R**&JT%`HeNDZ$rbQ+J37H6q%%pTp7t +>Q3Qs@@:J$*#`LL"I$4R3V!V&m88?:CVn#(s[PD:PQ3g"6]A-H4<,..[DklR+$4N^jgY%mTI[ ++n;,$OjX)M3.QtlVO`@n*_c6]A%9W;2;H4I^<-DC5;:!/F"YJBn:.aK@76K%OaeqEqZ?!\F*) +;L[bE2T2kLI;$VYa`ZNa6/>(j1o(q4kAFkPJLkSQCA@Q$V9:10*kjN-^=ilq%uSs->/dSnsD +uc[Gb*Vbn6285]A9fnQTgQR"'UIr@[9XRIjW(Zlddb5Qb'uOjJ?@@TaPF-HRfn\_9YdJ)/1?A +65Z:d`@OUA(K\4cjK`k6nBnE%X`XWfp(/TU6s^/6k81A\nS$59ST3jX$8J3-M0*$lLTB7Y2jYrFj^5"[e5QN$B^k2dU(R0mc1MbguF$J0=??@D&%s:$D +#@?1rZ=$8`2t=94$#k5M\&+4QH:In=F!k*L@^T0j.(kq\bf8)2o"Im3lt4$/\A@:K_@Y9HVu +X9@3nZ&A+D;X:r:k8PlEO;"iPZ-\f%ujX&+/$)39du24"3u%GbFO%FmhTmi,6%9MG`SM+1o4Xl/*T0[+b$f2%'.;ca,, +_O-61?_fI_O8=RcTBI=>$]A_LaJTLY%n.#Sfn30ReQtd3pA?85Vb:''S*[$@1BaiKF.8D83HM +s:nVj"OAP*=+Os4Cm*QS5sAD^>ch;`c(-UF_P=-_.M8 +qX@FY'gAbCV:Dk70G>U&'P"Ur=CaN-^)i]ADB_nF!1qt/I2"Z0)^TS\?oeD-1F/@!ct`eF@b +Pg7&Z*Ek9duVX+Sie`fF.H4S\YWpu+S]Al-##E1>W*f(SA[1GeXE?B_fD3rbtDWuX0r#K[_5I +M=B_]A>d]ApkFNkkB/aQo0r2dVA&r,X&m=\2j1I0FCfIEsF.M<,/)U/^7qK4B_oa;!5./UQcY3 +..>s%Q"8c+qbIe:WkXe1+1.G#;).ssRekiV.j/G@OU^BhRjUX+DF='bL*?\7><7^So[V]A0J# +V.p]A+J6["k67V[`DA]Ah%Ec11?_d(ecj7j$%O`Go]A[k03d-Z+%1NM-J('>`%;=<]A9..2YR.s2 +p]AAL$WL0TGFY*X#Ib[-VBW8#8Ju^Gr:n)'A%*p2`jmK1G94]A#0`D&3q:8%fV1!'+KY>:)+"` +77p1"1cZE8C(6+<5mAW%XcZq>>0d9HI7ZG`YI)R$q1>L6!3[R$siW]A:X[C,NGOdG-6:hHIJ) +Ql(9D:"-i>R)lXgs^[Wg>l$LOTO@n"HlI;Vb@"uWNJUQ<`en#mK,FtID!6Vm(35mSk*8Dlo^ +(%4kWAP%u"X7[lU_4MI@$9!9gY6bOkt<`V#Jm.(g-HSZR%kQmA?+?pd"rdV$*!iZ;+tqM!Zq +?,76j0484AKS0Ab5B1p$ABiBD?TPLK8TBrTai1\*FFF]AXhIYE44d,nbRX`Q"J&2*8%@%hn"< +J<"G;ggOgc[%K,8_W\(&(^Jh=oNJbCj)<7l","G,M&oY/QCCh3Mrs^:ZGrSPu$HPESfZHQEh!5Q8PG4UF,6?\bVHfb8+]A?\/YRBAh`1_0T\Q+EX]A<;4F)H++RDQ[dV,:)SUmV[Wm_o +>fX^?4-l>B;T77iGECr,^WN;,/1j@Cu^^+]AK.ShS>Za$pOl7[UHmGmD'DEIt=;_u8!%X<8!M<+# +[)HPKel9+@Cakk'hfEXU_^rm"WpBG(F-K<>]A557u`m`#(7aIs6CcLc?XgqDShj2pbDi@DOE> +KJ'LSbq,Bmf?a84_MdY>sn^QJ^2>3h2^NRND[2T(GooWU$]A3(JO&]Ai+0qa")uZ#mWYKZ>_;k +92s(U1#9[Agp@r7u+@]A$Fda&`TN!o486Ytkt"ljT065O(CpU*B0&c%!6"mQ<:9W_=H9]As)T\ +[p`0STn!t;qiZ3Hc!n,6C8q2!>`J?hrS#Q#QrpZ@B7\#O-KMOa) +f@nO]ANRO@PG@'obXm"HI*Wqm/e3HfX,LVKqp+ju%'XJ6lAVma:#jn/!]AaJ.J +#(lb1aBf*CrO7de#><9M#CF2ZLr,N<*%P10ERp#>6onLi!l0BKjh)% +.r]A&?sphN^%g';IK.+M.;*c)iI!D@Vb8g>pqKUP=X)JoPYbb5cQLf.76g-L0'>G[-o)j2._4 +a[EaslFu.;HQD.JtLOp>FPq`sDUjJgRe-j+F"S_2)qei9b$Yg[[c[q,)+7!:7H[O)'Q$,O*% +eA(?@Gqo3)nt,V?h"g*('.tYeN34]Abidi8LfSM(([bl>gNih40u_m"_0N)/s#R8Jflt(oqp! +&hJV1tMXX0#-8#O\Pq;/R[7Y27M>1^$Up5?#]A5'jm;1L\?`RRB!a$g`req8(4^/+lT0*Fc#& +>cJr>'HZ]A+mL,',"*o-/Q:*),XT"\T5qi9'2Q'DX=V]A@W/8Q2DEUie*g`?&T;r.<)b'0p%=0 +E]AS1jlW\qKA-.\+2fSl/Y::Y`KFcPl3[:,=S/<85!6ZbO6/DYd&/+-#B1-J4AhMoDu"@+lX6 +$G10gi]AoHG;Io"7f*dBjhbD9_k#X'hePf@^%=r\E7$CQj$=OZ?:*GO:--1egU6WB&#&d/jH( +f'$mY!-?V6!?^X^W1KS%s.#a-Q.ANg=F>:AM\)a&V['4rk&)<.H4#Og&nZ)3--oLoDofqR#X +p]AQQEjg_$hPti6'5h*VL@==d=I;F;BAu9QiPoV$dGi+7aW"D2E?GF\WY=\SUIjCn>j`@2k>. +!<;E`L@=om?ouA.`,X!U4Ouq/5A,(YEk,HH/Q7mBPNoMjD[bn7;[I/mck<6eGnh5c(mds"]A. +BpZ6lWU^*7SMm0IlOSVNaruQbPL>7.cgOQ.pP&pPjgjHs5OJp:dVipJ'c2[dd-G=**$UVb$t +gT^V+%[G5m=7A*$3FLqO:m.;U$mNld4FfW(GC5hULm,F,Q@9@9I.Wn=4k&#/ai_+`/5kZu#< +p@LKm^P\`S4iiB&O(X.)i$m5C+(_rb<3g=380Z`,"&Rsm(TE_="+gS/M/'JL!7ms1a;ZbCa= +XTnQC7KVS=*JfaYeQOZ;cuhsKO_Y>t""'_[^FXQ$j?%qS1*dp/. +"r_rH5&eW]A-D7sK>(QS"+pb>3Gu?JR%oLO"4EP+Xl"4fpE9<8d]AC>R-P^']A$IK'QaagWqimH +hd'XiGLb%8?%Q,`D]A.%t:LLi^Q2Zq.b"CUGJ,-(:BcG+05aImU\SFfKVJ=WS_pN03sT,3CTh +hQ/KS]A?4LP10:%)b%,8%a\OXK3P*#`[]AMGtQ61sYfJj#7/V/NVSj1+inX@$r%bigZf$>>)\D +hR^h2dCRQD-%Z7m=HfY^RoCih_^"/]Aq0.^=q4mGrQZho,Z94H$AF*hgCdG1aLcY-67q/;XN"VO01[+i\P>8@" +V\SS]A"30/!+:fMNPpVakQ +P;_nBq@O?@%p1<^m)$8\iHXI'Vq%/oc/n'MaW1cpeQO$(UKtjQ:A^*pVfEop-eCndcq>(,W_ +)AKC^LsB!Vg+oGH`cM`_&a)hubd^S5boHiN-09Xj7\BKkWgN^DA7"Kuc6CF7'`*SV)mX0C]A< +X\4;eLN*j''2s/B:gW$^WRP.]AMS]A;5Ath3UjN:2mM1bd]A]AA4Iq^e"D@nRPdYidQC4IK!EVT4Oh,nX[(i?2EI"KoT>tC"3qK$/!\?YmQJ[LR"!"ShHAFV#_oC!F9[C49if8YZ5"@i(qin$.5A$=!*NBc3)gL4^l@qd/ +VS+.>h$L8ZH3pjsGjkVt(N2V'ZE.r5+sBBPI*EHQE3T$9p0b6L_`70o))CY1J;^%Rpu*_@gVnV_u@:\;3=Rgicor^KF]A%NH$O +qm6Q?e+\$nNEk_XdbB!)Go^%8.(DaQZan?k^:q7_:H%hb=ODL;)h035$VoBah+U1$RU#J\YC +>Li<4*krpfUObBdIV=QaZXB<>6PGa?E(IH5UWGYs'$IHI.\&4IVT]AK.``j;E:llj+npFG/!: +#KuM3<[pi?=T;!#S[rZRjWGKtA/'/k+A')Q?Bi)B@R*duaZh+DIpRH@]A9e7T4uV4*fpsElr\ +c?@J\@%n8i#En`Qc=uq<#P$>%n@s9m3tM"I3k3UnnXu0*sua +Is4HqP8\2XLh'ZIeUG$F4$At[XDVs_fnKV,`-T=Jq>a\_cXU#Zt?cIi0/bV8Lhjk!gs'g^77 +08(Im`sN`&\np(8@I!Q$J9O-fLg)V;IFr\o=:Bkk[\n; +?&:,(5D)Z2Ka +6bsrQRFaB[&nN%$/=7LA:Ws-(-IA%#G:l$Mu5H-Mg`9X[#t*dur8oRN^H'B>p@O[u +Naq+thnno&?oMqsY.=F\C;&8Z8[sTC%b?tX, +cS%7$0K(BEJ,@3a1DN7+Fs\(/.Cq(Yo#;2X2k5&0kLb&&=E?>&[?<)h79!$Z&Pm>=8D$i]A*\ +K3B]A3HfZh*2F0=[>s4;kq['L*YVBHD-K]Ad-;lHd)e$nCpl=#Zh(G>L3,%pjjE."`?=,@9k:/ +=HKOrS]A&IYWc5u&\s04%1Ei%":]A%LXWlA]A`1+rQY=$)J9j?rpF,Tu#kT@BlkAP8\Z^)^W@p$ +t'kF\b?'-$r0iWDP+C(2p(d%Um +M.l0?^Gc:92>4+g&^^;(Sdp`?S1FS".S0`b6(k2!:cru3pO[5/FbYFY>b,dY"&4K8'BFTMqH +bJ_81^BYHKg,m68VhX)/fR7S"]A,9\0fmejM/?Ke+'?p9p\BFV]Aa6Z<1"glG;6]AFsd@@Hr6A. +tCK%jl9,qiCC*o>PHYNp?4]A>HfLkI_NFDI>iq\(-Y0KHm)#RoD5E&4QgJO;(^?@^<9Ul!j4Z +5\hPL>i(&f/XB4NE[qF2"(#F;<)a$u40qe@hC!P=j3QXX0@S..#qtKW(8+J;5#ki0D8RXM$X +kVr"B4h/$0kVW`quiTBl%9eUS!JT[.Q@b^RLpO+8/_\5^NSACh7C?]AP#a"WpP_Le#IXb=UsR +PK<[bHEmK4EIMJ5e<+Bcnl(V_9pY5b&sOnG;3*i1cPVY_Uj*]A1(&K<"J!#a*kRZ1-rI"lm]Ah +_Zfo\^F,;^B\e_T)pon&iRn9q1@:Z'rYdcf@GgH>?4)DaP]A/k@&V=?U2m#I6VXlW5Fl-C,J0f6^jr;DHO-m?lb9jD@ucjKH: +cIsuCB4Sj2Yb,F"mb('oSfil8=$H"VQHe[+8V7W8&;DI]ANpH+#7s)%`@U@;BeEmq[MW-WXEL +]AssZoP4H2eJTX9K<(i_@3DP^q&ne3dW=qc`OXN%Z6Rbs3hRC/k:HS&")u*/jV'"+]AhQ(cG3S ++A$>Lom@$r@Wc,J)9Ya.2K]A)'2o%A,V.GFoeY/Ja6L(`mh'^*\LDE5R8K(&qIQL\$?*>bch' +7qHmn8tRJsi^riYn*(*]Aq"Makk%4%>_DLZ'L5/Ocr#sU5>k6lTX_in+5,\cHk(8.JM0Uhn]AIOXqPC[OgeEeCWc:krGjY&[s"CcjdV +[2$/hNJe:bI?,c3`uDVWq0m@`[^2<(#sMldo$.6)<_GIf%9Q"ajh;sn2=#?Si+lc;gKK`d.$ +/c)DNrC9b;>!RFS05.Dkt;hG%lY8=pkRd5t.Z%P`cg@=U'%GCiC(_RYE]A"2L\/kR.<f(&]AtGoQp7[J-jVG9'Yq,JPn,Mf@b2jL$T(\;j3BR?2$#L9l[)[^e#D1& +521Pg:lJ/^DRFlHI5l.58I:,N0="fciH>-tma94gN?Pk&!92Q\+!UeIUjrYZ5%]A(q'(ja-IF +_gqJm'efV"4"C,($]AtLOr]A)^Q7gZcf%2M'\h@hRFE_M#t&E6,badqEX` +*4GUps0r8Ci-eQV]A1"M-p\6.Bmn]Als=;peGEY4b)$XQ+GV^@<.BU.V%2qj0g]AFUr.Grd6dI> +>bDkQ7=KlfQ`&XD;/#Np]AAh.`W5dUAo)-q4Hk7hSneI([-Ml<\tg=.lB/2uJDZ-]AC=t\lDum:jbck]A?RK>jqnA$K3ISb*;:&XO/3Es:#gh73u`^ +noa.@OS3#!a]A!&EN]AeZ%:WG/\X!3d-JT)nmd6;g:"%^=pE8d]A8b9<0TjbS`)%]A>Y0ajJaG9& +"*!^^ah1PlkP\LI.UC2\K=*N6QD0;3+@4l[?9?8.S6>K0G#[tdn(kt[ +FK3]AO@m.0a01=V]AOJS\*rCgll2@IN?&!lk_d$[\QN"R6("\-@ogLQL*)6XR72+sgSg5u]A6([ +kI5D$P;2uKj#7[9(*DpMi!DP\bYh.eH\\;?UlP7Foqni(dl/%EL[ca9*Ygiikc7>h#8_fUht +gL=ahUeD5*QLoo$IUB'H_JQB6d41I)Mk-U78[tZX,K-RQQJp +ZjWafJVo8cda!5d[2,HA=!2A%?Y4[g?A((+fIkOqpal1)IFBKI&=Z8h7Z:T/:OA3>dqk@_6;*+ +Y:fEXQ92ETRlAS:,>pOAIE%T68/)#>$IO:S?kI'WrhUAoYb7W'+)8/goP:A:Ne6tSb%0MCmk +&s,CETnEUqc<&>W\9a00p/@9EE]A=UN8cT<3A!HWba7A,/PCf$ki;p(g_Z:;j2]A1D_2mWaCd! +V2;N?[AmA0+\m6(`[05)k1A?@*t:&\A\_fK4mSC7t"9/L;=,oH,TWG_HF#[umRH+`X(t,cX\ ++,R6?*EZ<;#XAnOHV1uaA^>%3(^)#C+NBeh*'>!8<5QkLlaAZ/LOY#Y$E#g8JlWJNDn5-Q@4 +Mb?p$u*+lE9Mu910.gNU6)?ma#pCfiT-6p$SFX\R$=C,8=T-q6RRVZ*N$]A$>;M$AGhK*(5k]A +ek>#7>H`I*Ps">1ipd=Ccmj2Wp@hn+E-Kjtg3n."N28G/k(m*=n?Q*.?073Hg%2*&38Suf'Q +872)1F^L+h)%0Ml[$JO]AiLG37,&h^g_fDR3nQ1_oP)G:TrI'"GC6brNo3^acjA:-65_)P^d9 +f(S:c//Ueu/-I2W*-rHSmDs%5 +\HHO.OZ;6]AckG9JI%XMVCPHOKfY*[E*ZijY-1s%(GN6`FR_l6tY$V#3\c;Gse@A8;B77i\q1 +31bu)LIWs1J6Y"*1bC/:WmKZ')Msn;,]A$E6`+8\-#\WkRPVXM1=E.9)gT]A%N\*9>UpPnsUIo +d+QBD0?/a4@`e/NV_^\0gn4OdIm\0cPhfb^f1I8M@Ii\S%3*TN<6tgJiu:@1@U1\!Wjb?);> +Eb\+$oLIkt@7$+6hC4'Rc65*VlM"c%5,V9NfDuuqR1;1kjs,DCeAB&iUa":=3[rYL$O%b@Js!WGOSH +B2'raa84ef5E@\!3-rjb/^OG/(4nFQUO(L*:TI5>_s*N[SNg9&Q7`/Pb1AfD_?i_8tbEZ/n!+9)Ase +Xe/MR^m31+V:E@NVDC`,[QVunS-$l4/7o`eoGMM)@EN*)8Y +=AEpZ/d!T_&i&<"OLRnPDsp0/U?d8g1rue1JTPQX*<[=+%/XT;7?YUm9h,!rTj$'T52C!cIV +%(Sk9UG]Ai>. +6sd[+sJ5NP;AHk9U5QOQZ+5t^<_h"pChWBKUfb\)I/NXG:e97pUgZ.NK^!BVDjlOcfH26lu% +@O_8#)EN"n#%:;\b$MINgC?t@&2@XQu6]Ai7)-Z$RE1F^&YTLeHj6_+\oZCQRDnZ)S_+

*!.lRCj`LK6)R'!?cm^10*!o_le.FZ$["nO-]ALk+W8(o +3(Y21Ve8jP_8Wl5N>\ol:>@L]A;>?M`W,2YT1O]A0_ulP3.rM._CgH]AQ>lbBZaeM^bLMpl46uEj25%'O,`bT:>D:i&iYls41EgaP@hrsq9QoQ=I& +01pleV1i:QL$te;b-.;H3/8?3.=_=AS55:A5%4]ArGRiiS65X>!m)L*b&(0Zg2G!tnp,cf<$r +hdI(H,3=P,`lL.TA\P"i7W9qL5A[&O381r_/tU?dKG-<\ig(o/:ZGBAe/<;;0DrLAY`H[hp\CQk#YqI +QaOaZIm2hpSGa.]AeJe?KfBCN1-l-S*U7A5U*h/<;;cRU)Q1*dH("n/7VK:mfFf3HA`'Xm3JA +QGg*DEGX]Aj*`gKF5Wb +A,,aklR.G0O#S;g/eHL7Cqr;^%SulC3[)DOhuHBs3Zi(N+-Rf-1D4eUgk:Cl%Yj`]AmU+c)F_ +VhXgqK\S3R:S2Lao8P!0EPGP(>\Q:]Adp5)b\^iZmTJ'qaf5=@#U(j;A5R)$*_V+?M$65467O +K-u]A6:su)9*7s#aE?3*\os,'U2H/Ws=X'O_onV1;P4pqJm7E?sU^=o-"?q^U!< +$p6Z9=Kua,5;gCDVAA@cBL:3NG/6O.(,"Or,)UR[RpJEfsh,$9i_q,lJ-*R:5p_kr=SYLrHUW)LBH$Yu88Q +smrn(@a"MZhe^694$0OG:\V61f$j^HSOKu?Zhe`!Q-XG9IaGRpkEZY_l8fF_GD=:h1hAC6+G +4TCc(g#S'`<4FJ@Ka*J3jVib\FjjiMVCkOk9)?VBfVgn)#bYH.)aBrS7JL(+ +og%(8Lo1=M5=h)mhRZG,5 +PXiF$1f2br?Gmh26N5RH,lS`7ZYpj\'@?N7sZdrt<%6'o4&MkHU!PWG.9cN!B*MhKPBI+pnQ +)n(`@#D+)dG[5H5>hhm$SK(d@QEd7*UAaW[m/[eQ&`b+'WRRR-*B!m*bE9R65F`LYmGpMaFX +(>G^^R4qNVj2XCflr.VfY.?QZj'C-_1icX4f7]A)+f_2HP)iFQ]AM5#eC!97.$7ei/gk`eh-fg +-XCeCWO'8^;P^_&X?bu\H!E@P"@@T#C2hq7L`*)IG-(:CDI@Or^$`pC72!Hs)"+odMq6QckP +BVZpWMCGZjQ+[!XBVE]AdgH6GZH#:&gOuPhs6P*-Jdk?8V%)Lc72jflP^OfnLfuu-FE%p`D9q +q:]A^O*ENJg>ODKr\4\c%`AG$+,?mMX,t372,GTbt"o\9]AC +2Ekkl8(9?e^K0]A'9YS,IIkY*2(?"40>IB2n'X%MtX2;'IRI#WR_9c)_3eY41c?l:KuMaW +6]A)d-I<#'9W=DVHnK*]A@(R\*T31N,!AAnUUOT%l^gR-EDsG/pMFR+PZkq\OQrFj,^YQX5dF` +\PqI7Y_p1E!r1ADD*6Qb<,!#dXE&;e43,;EeVo&#^cYGB8jIZuP;;P@MnTY[mE_!$io83per +!X\:.4f&:[Me38dW"=8h9k_]AGi2LM-:TMSP-+mE_(8.0RR_5TL`]A0U.q:!ml6PjXtptF4\ou +c%o0.%"<5bosP!*A69B9!?ZC-N]As8/="5:9mEjr7UFd!Dim%quEPYO4B0;As_3;0$45Kd(["RVaJ[rgOQ!&uI><$D'm#!JC_!O2gt9Q[7'o +/!c^?S-f+U.aX#5P4[CDHCT)BVWTK^gYX0TBc_f?![>RH?sb@('#D6/krDF5cJ*2*?FUQ('' +qaY+"-Bp?>)o%$q#\!2<+O`r-l^p';cPdD`NO50CcC=r;#U&:iss?+T[PO+-_rI4VJ;)ig0k +&;KBu>6-s^qt[`o%q@0k!YAY+QFi1rf?d"g+:upH2qO+L"kE_t+OOadh*l2b\JJ?UJ,i!hdZ +@R-XBY`r6$2?@k&t(67d!-hC0>=OJ9jN3UhRaC?7omKtMJ/jBJWgk=7/8.J;HeTj0H:cXZ7 +n:Ut&m;=u/d-\EMCp^4^.,d`U/n6&H*gtS7$i#t5]AdUo(lJs"!!Q +(f!:7j`KZ9H:E!J&B^=&uKmjeiN'"9:)C=(:KB91Sej8bW8d01=E9f7JU(#VH+%,J$O7/j5u +fPAe4C=m4#37;r:C)pqYu0jW+RZYo#[!!$-4$!3//'nUQ9!;LXL7(KZ_;*dDo]Ak7A]ACXKQ,# +hR!gXohhc2GkWN_@6K1FDhFWAN_ZCFAA4Y*`S+"5]AEH%HAskbJThfne]AK0M!'p%J>De)0A[G;8PX)7%7%A^@0nWW"TX?2!!".Q!!%g-!!".Q!!%g-!' +m4TIfpbYIK@u@ScA`j!(fUS7'8jaJc~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Hp5P17uY0b)YoqNG>)?VQDM68I:2PqF"3 +baY=h3PC)9,MY3KZkVh9o?K>> +.=o=GE=F6!e'3UNLi^paB6!;Q75#/3-$J1iD9s1e@/IP\=d=_Lt9Mo3Y.5('m;]A4n1N.6<=l +"T"=`1Xk+5Hcn[Xkk[RDg3[mbG;l4cYN8[c.7=#]Af`3,\kieu<,t)@KP?'@*WV;j>bX +2s*h2ST5cEkcY$98^c,5]AUMPE>)D5MDm5X/l)l'1([L^u[7B3Fp\>qSr,.`J?)@m5o\7LJ#I3A+c&d#/IeiEN_8spA +p@`'qq8m1I%Xr(eLhHtoJ6RjooBFD!<+$PlI'K$5^CuWVI/Oc.>^\=o#7M-+QlS\h]A`X3QVd +OB^!PZPZos6ks't.Bon:fWMK_V8kqZ#W.X3&-\;O>g2Ie\L#BiS%9q.k"nJB9[)D)1#',\'A +3#[3.J>WB=C!2XA'PCr"_Y^^Xr)Jm1s!Z9JuAViiZ63@(@1e\0F68er:Hn#Fgn!lFM,J+A1T +B25,!27Vs$iR^`H1-0:.e$uH/=#O84S@-3]A979YW@J5PLt.>*b7 +]AQUe^4]A)ZAjYDaHmHEj]AdRMaLS79P+/4XVToPh[oNinI:?HM]AhRT)M&Pd@&rQ.VZrNpiV#+3 +RrMmEUCP%R[6jfD.hf'T"@5%Aim:eH9S2QAtNo@Zp>O>5ZfFV7<^1hSQ.rBLBDF:2VsB"bHK\@s$_DA$\'qSD>;'j]A]AX6mJ/i]ARFN?[jEM*c".(+u#@fC%i`mXCG&bJ'U"q]A +>!E6A"A8V6D,33nACe`^e6>@-AdS-Uka4:9B9/_@R_X,^?HgDT='Q7!cI$X+.ZM0=(;r-X-E +[o68kmH!@#&=ut#e`os&+c1,W*k*bL>2p:me,,I14(Pqi:19OOj(dJulJ_1T`mT4*,fiuI3Z +?al:;BWk=oV0WUM4S\BZ+)+l2/8X@c";Q%1&8gr5qZ. +1k$XC1RN=>D4+kA=O1We!qoXa0,Gq6ETKE;sJ]AY@%;"&DA'HMDI@s.j<$6!Y>PK6sCMHeKS[ +H>#LYh>F$aa7#)BEA,?ub/-+J?23"^`.:NJ"m/e2oQERZc)>S\K'_IH.2<"YkkcM:HgSl`a2q,)=q(co.ZX;UKMO,r&Z?a>W7>G'/Gtl +e2irSWURNs?q'fUQ^SLD0P/H6:LG]A=7EO)[UIdAjfH +u0SA,gAXk/5hH5m"eom_U7%BRob9:=sfPSbou]A:+Kd@VM!2MulT^(BY^&sO%iOGVFfHBl<(%hW3mpf7mn[t1P=-"9-2FVWCT+W!p&4Qq,9jN +9]AlXg,StL?_$>^a$R8S\%!-(cUOoc(9f^g>E/?-C1)u7XpbM]ASK_rj'FO.[o0=$ZI2p`,S.7 +N0+`p0iCjiF_AMAN#E#.2ndV20Ebip[Y-fI.*mTE8uEhi1!U6R_!L-W5nh/lupj0h5OUjckcFKm2%2* +b^^'q`RF*CaMBA7q=E5gE4_Fi]AiEE=">"0h8<.X=Wa[KgOGMmZGg\\U1iLH,cRnef:$6&JVl +#;Mj3Wc=Fmhcb+"W)B`Y8/(,dM3mfYU>WYYf#f8q6THQl!,EC?mHQ"TI,(ZF;B8gC3?RlFGq +,GKRRsG(+PT*`B2U@g.pA.kM2qGi'HYD;ia'`_`p2q=k%?Ae^%e+hTAC4+abXJ*n[b"05[f@ +%%I"]A4H-(M:-';C0VJ?gPf3RoE0]AM:RkgJZ7=NNk%2:9-LSeqrhbL7]A%5U;hUgLrhXkH6f0- +>a!$e62X0KLLK1O`S4@VPqMKGub0R_GRjbu_fn>b +Hdkqoe5SFB@#_4+JOIf?8/g0m1HBi(7(As/qi8/m![X4OP*MfidGWeW(AjE'&i4Dk3j&CQ%D +f"Rn8o_Q(Zod+!naSh!i6(sjnIFe#H*jSeG(1oU@O^u^FDGb;HeHrc&Z50@VEfi>Zb^`RkI6 +:l*qc8i.3OfGeBRD/8#;P!bF#GEafN^t3S<(7d.PKR`]A_u0L^+O$XVd=!igM$qEn-K'A[^->u +ZRhtY1Y>,b>Do:Gmf2ga-5\IiE)RoDRLlH:6T3q`PC;Um7j9XFYnYsCTSD;KcnGJ@b^W5^E$KrJCrqA +TCNAA[=jl@Vj,_eU4\d:;Eh]A\n.50jdCl^-+VUg;h63Pc[@VjtN6$f%sAJ:&Bs\P8I9V@XC. +Qaj2gH:MG)X3F]AkTR=Fc5(qZd;!)BI +2:"69HF,Y=bZBuJiN>,]AC?)Tk8(6S(IOWhiK;/ji?Ye4c,[.C,G+g\a1 +i"=Ukr3QTVZSO.rrCLk%3@7WDE:a)ojkX_I?]A=Vn)9?&nd>2?(I#e"l)("l5n.`$`UYU/[W= +G7W.6J6WuL@\UV)XUYIS&-mIpI*1oF8YB&LYlA9AE8Of!;GCYWRWh4c&pX,5[BJk"9E;MbSJ +N,&$J:Bq6H:#ajflV@kQ$5K.[)0[V[/_>`DfAAZ<6BbH7NpLi1pE(uiggD/nn4]A:(;?!1RO9 +[RQRb-^\?BS+]A&4!6j-,\@_)QO(SgO;)p3'gt9IZ=-CM@^S!5j\q*;K*dO?BR:[Dh>qQ+Pa; ++7%>DV^RBj.6grie(]ANmSnD7X1&/a/d88Z9#10HG+`4;3NUe26@\Hf'anTUIg'r +%oeD#SORAFg<;GA^Z6`H(Nj-YStt4pm43OEa^RTW;UlKN+r++CpfQEeATKJSn\asr#TF +0HAmUAE`NDKdk9Oh9bT8Q[QY\X?3J1bLl4,<%NB[L5Xh>C,sKl[k*@sb?Lk0BR<=[Pr5h8j3 +FZcb,Q,*'HC5+.iRKYPi2;!lDlQk87]A\#of'PQ#"*fX#BWp3n)O((GUlTNQTi-S$T(ZG]A(9l +O2n4%pg6:ma*Y>Z9_VTcWXsY0W#=rm+#^EIT:B4FX=FqR&4KakNDTISH4Ql!"92nZfhL[=Tk +Kt&T[UpO%%m3aNJY*^GJ+Ye(G0u#-rp0Yg96pTa.U?MK"a&6:LS(_Zjsp#,-e5]AAN8`k::aV +"k2]AHC_H,+UL=N%)>96q[sFd9mht$ljVZ`\J$E,?D4&QYTcLb)0Cq$?/r%6_ZKLt]A:4?qi*\ +O:KQ@-7qamsJF)oYFTHDsYO>[_n,0QJ_3@V9MGDN24.4I6>_>ZFOWF(H7`)sk5hA[YBQ3a[5 +]AKPp:F?Tkg`57V*u4(Y%^A5"O,L.!8JO#r\9I%1 +jO.n7E(fo$XVe1cP3q*dUW/=A,@qh8*"n?=)]Aml<`t@&51b)3:mj^3OZf"gm>4o1k-jq=qh/ +(f=h>FMH=$!R9<.BlD`e56/kS&4fO1&,Bq.c)DISjp;XD`KiIA>`F^\]ASBeRc\muIKo)Pl;F +\Rj;IFDV3iBq2;#YmL%8@&pm56,/kEW^J1[M?!Cc)VggV9na5R3Wuc3^W!S[%su./nXK;B>` +o2q/Zk=@-3Fejp/)*Mqji(U:QG#G60L(7_nW[qY:_!^(8f!4&V#bsFfCdSOUj>%kt)E:s"c5 +ree5k0<682F4*9^DGOkOR"ET50ng[g6$?=RaH1LH`-eZ30.7bOPMTKR2neYUVatm'/(QiI`smgiM^N1,YBl/KStPEL"e +t5'"AXt,cL,4M@no7Y +\dVnSu3fg47@kCZJe8Igo3ebe?]A@.5?Y"\P,btd_jMK55l-np^m +3YoDF_j'n)+be^]A]AsKu'rhY6Fgql/<=VZk`i7N"OO6TPV"TpK<.T4;4Yq=p<4GkI8]AN'fH_H +`>jX@=7b)P&`lB/3YH>:LBie%iBS*eD0H0BW2)@HeB,#l\C9^;o@njCXTBAc0:qW +=P6j7YTHF0#K$=PrI[pS_[r]AX&=XK0T$bm,<";THfROaH%[&&qQVm.9m`ue#5_kNF$MXC;B( +bWB:Y>A)DGmKu%+^bp%1Hs=R2[5=H9]AP15,rbN#fSQd`eh:nF +KVmGI;[Q\Elb#0loo;2k`hp[>.E>JqgG?pg5OMO(%/;"CD*qp/N>s:]ATj:nG*Y6"[f=a^Jk. +/9"qEU'N4L28Gt*(]A2()fC(B[Kg$]A*?CB[9cM42$5NP+EVk7P323e(gi%<$2TmH&LPMs0OiB)Ltc?8#QK.nB.j[/<,K5Gk9/(+j7srgJn6Aei]A8/jCE +)mcE<$J]A7hmPItf2e9h19JZ)N@Oh&8+(WU$*Ud)eq-+;9M>BC7X['UOVWAXh5As%2DQ9!^p9 +$F&oFa3:$_)5rQYuPXNlRZJRU%fg>n\;?'hp9GJ\79@>^D`7%hY=Roo+(H8@fpa9hXRX325\ +9b5rCoIh,&p60c/'8l>2u^bC5!=bF@@2@D:j*P0C"XVERlTGZ'Hr[+= +6$;2Zhhmo:EIn':4N!o'25Wqqk`1`jZD3QgM$!Nh^]A,f?t%P0G,:VG?]A2/Od#d:U-)%4'jS>YH*0,lGBpBnk)hc(AC.be:6 +Z1,WCOg^DMliM#.t;k4[-\Ra$9]AP\$i2[(n6n!DD]Aq12O-ksp6dmFoHLXP@Hg=&o*.0Dfd8O +"$f3b3BY(>9/pM>ioVcCE?5fT4DBN;?D^l$>r[Ef1j+qBa>nH[]A,ZgEku[^=GBn_^Vm9)>uk +j6s5X_aZ\&i7lt#YG;tAd4]AT1845-su4eebpu>n":sQ*#Kur]ARI,e3=Wrq0"1^o,SuCALGa0 +5DWsh$l;I\A_#jn(k=/@P[ZDa0fLi)B0`EWEm7Gf$4Ylt*$=o5Ke<%JjA_Ra<&8Co6l.\3C+!q +]AX<"9drYFkFjaQF^9TkMj-g8MN-3qcJ?PN0h8*pr\?>2ViVM1Rl]A0&In&p%;Ec)--cp"h9$6 +o-'[0XXg_=CX;J3HKKcVkV+H&-J2d*(cVcfOSUW +]ASd^*9LPkY#tEuCu2Z.MM=jD]AEC0rp*Ga/lW@7-CPA,)40D&!n>*^$09l(]A,GaLIAWDR*/iQ +"CbdkAocBfk=Ir0CAd5PomjMNn8#aM^:.iXWXcD2=%Xf4DYeduS%Rr6E!j +!>XJfL_ef\C?-jK&QU-8aQ>A.Tde]A;D,`j7,RhZqsY#@-jD;R*hXamo,.i/YN8A +Q03Jd_>I$UW&KcBHJO2BGjOX[B7@&lLW+%)C#p<<(53"@F[TPa]AmI\*G3h73\`]AIQgS'H,[r +%^lX2t]A^eqKOs2[8JKb.n@N!6si4VoblbM?nbD4AfN+ch77i[Jk0@ca''$T3:5hVb9 +WLEAEJ*IdR$.^\8h/Ocal$GHtanD\dgqAZUn:dL"42"j&/(&5h5'OaXi!4[qc]A'A1ntcon"O +jMV(B%`IF(Cq!JDNtaY2k?^afYKENFD7N[^?Q>?Ao9@!D*.e%]Agjp**?UDC!eLdj#oo(LA>O +keg6'I?;T>'ZVoNZ3`S]ADhP40PNEYs7`m9*KamMj^ELjV;BA#'>t5cBe$*(c\\rE"%'a%)e/ +.76&<[fNF8=#\P74[DIs2lqCpImuW41iCVe7I[Cs"c';21GE-sf&cGr2!i*3*T#?+DrDi/+9 +Q'Z:]AWZ$R"UO"Q7']Ae>\6DB/#=TmPDFU3b5b?!%b)&m%Q4Qo=l>_=EFojY#U\(G^Hb9V=.c" +@8%2e=Gq&HEp=RHFI.e%<#5'$K2T_g'7),9$h5O83Mo.W+/#i_+k94C!_K3p*M.G!P->?.0n +6]AjoCXCXfT`(4U2"g@%Dg>LFHh*`f%\\jbs>*ZV*X*Wc;8;HbcKQ<%dW;WiLAdJIA$F8f"Y[lP0oaZ)2-Ak\j90^i%& +Eb$=?_=PURZdZnoG\d?Fs^0_+"aU&9&emYPGOAD9kHKNim$to@9MVW&P_1TSCHS3M&]A7-mW[S=`M?>N@)/n69P4/#S6RLSpk`?YD"cOIWQNKM3^1]AM=63N +hdmA6&lGkn*SPbs.;C5ZAL#!:f5Pk-fI[Fd=]Al\VG1%gc+`omN^dFRZPq0RV'!i/`XUlYSFE +GoO@O`n$l[=rM_4uL$8UJFJ"Jf>8"M1Mo`MXo5p;W2Efo!d()uro/a4HXces'4=[Si'UVsBMd:mtht\%u!>>-7_IXGXSLqkc;5Pt'%R=GC1V6 +t1f[$<"G>_X9-uc!%HsEE>rH(V\MbE#,o[WS=9fFa?'^6'4XMtte4FaFO`_V%%Q?lHf]A3tVG +bGupLjTW!6.q$X,e/*sj5hMCIt*Z +(_,6R,b0Zm9daF:[$,ctf?J>oJVeOVrfXHK7s;t<% +PH@a>c!1hCI?WtZg/RC6Uj3H$+]A102miZYACjiY<$#K"p`HpE@omOmHaO+@^aZpgk3&>7U*# +7(abA[l4K0JOX,mqj_hXP#7U*(PTGeS1Y"3DJ/.qM[mVh(P#OR +o3"Y-Qp0@u.P,Z5Q1.l]Ae?5Uf.5767Z97?@N=\(/4CSg072#VprM*Fnbm986IJblMji\5>N/Ug,HWkHT9>bj:?pZ3@+ +51\l)G8SNjG/CVeMrpV:cdSnC1oI4jIs%&hRgh53,``F0I%D?WX=ZtAj7Jqi!@sPt'_)EZ>]A +0ul2Sd\u&0UmNiVVdD"?!X%K8oio$f`AY)pS&ZA,LTbIQu2>!Itm6%U!_\?V1RR$)O`DG\;0 +o)mbW,4>gFO/H3e[3$P`'t:DM+6+]A=>G!0CIV5g"kMj8R"A2\-[9Gfb(cCJ"g3:/%j32GE&- +9YcUgQWfmu2=J`T1)b7cU8@7I<3#.V5-+J#5AgOJk'mAqF789+Qa=TEGuaLkD"2b9MaBC#Ft +LZ1@V?+"!5*:rr97H]A'jd&K.o[0\"!^8h+T'M(o574`9(sbtSs8k?/>>H.&uEF;A0.;JACTN +N^YM*gW$:\k*)H]A!pH5Y&14]ArQKMc>/3?B4^je+k\,V>XnpE4O%Y5Yarr$hPj76;O7)d;^(f +0*IF$QVMbo_WBeG>^CBi2HFNFi?;YiH`9mKAjQm43T/_81Xi%Q?s7I'jKs>Kdi41gRDpTb6V +:+1`V&(GiUY[B\bGjTDGeDfBl5A]AUA*Fh9bdQoA1^tD7*;iTeS?0'Ba\(Ce9"IqpSQRfer`+ +qI7[FDj-Oo4JTt1?$)iH9A$mdm-Mu09kkZ&8g]A`s@V'kHY)GtIp:aa#,q[kJW]AA0*^gIJ,!S +B08iWut[BKb'b!7nX9kcrc$s&qku)]ArA-JBMu7,Jm:VXAXXGB`g_GS3HmY +gD*J"Z&I?KsCV(Xq9osf#GpY6#s'RGBjZpE_6P9k+Ac+Y\!E5]AE70^u\=QilUjV;+b +'NJZGr7(ICaIboYX,1m2;22t=6uMe!(5!g5O1Gjqs'MQB^iVUlY(Gc;(4[TnI$Q;NJqC4s%7 +MZ>`[BY#&KuV4m^_J3=-_fYk`G,R*qMDK'a9"(^^U'JN`3@>E]ASeBEb3QkFo%:KT@IH^FO9q +u+R2ql(PC&s^l=X$aJHt2QmN"sN?&E3PICb#k$92L-0;NJIWtZnlL'SSBU.&5DL1-$jNOXXU +IY('gC?r\DYD%n=V@R"Fl77%::#&Ya?eD=A&s_DG+)HL[EP8q8+5E_)q69Q`67Zac)^r!i +$8A3k>+'4GbXo'1=b2D(^S4(?)8!DuqbgQjq36ZoHlsq5S9Wr]AX(XLa4!-*@`o#3G2qVCW(+4EA"Pd6*?V]A_kFA?QQ#:LakSLf733D!^$' +XL7srAo#68HE53_HZXglcs3pdk^^qn!d;'5AQMC(_gA*$dujidQ>\YMfcJ*V[a"i$lYF^-n% +!5/rdpnb`ffMapm.pgH"r5[_#7nLPA$6&Q2;XE_#JgA'"1idsZ2D1DCf_7D_bA&%L5U!I'3dF7R'Au43AS0>I;Q`bpiS3C40qQe,-gg"JFX$.,Gq<)CH7!^$W*>]AYBDmZ@m?FV@)0<2#=o5:r_g`W9GYm%MWluIT_K +QSYbpr6LBi:a5ntp-2hrc_]Ao_-jHHT3nGSV'jP'''""1Ll/LTl<=rO7s/Ni%%djuGq5"V4n+&ZU+I26Fl5Sk$3KiO*m=t;hF/'Y5*/@05lt? +\ji5cY5>e-L`I[9]A[H9hgaekZ4([D"[Lja60=iBH)teuN"Z>K9b<(R$bkoZ=YdN[97?USWI? +=;scQ,_(0i;)a#dnLT1\=VmM,fMEi\3&N$^huKCI4'_[_0deHtqr'LB:m\bKa,]A>r3-JQPRn +6!-90FMc"$/+6X!l%TM,@D@R,(:l#7]At,B2nLnhbN.LCITk(0eiTp[b^k2%SJp6&HIRD@tdL +t]ABaqU!BTNdFdMmM8gK7Be'XolLFqS.BjK(sGuk,s;C2^OC>;$2kJU4\e]A]A&skVLc00#YskX +7%=d%(]A,t?Q,5YCGt;Ok^h'%!O3$/rSH-IruSL%;F/i)k&Gu*aTN$T:*euPLBpmKCU+dMnR% +3)/1/W&D?3r]Ab8HHo5Nc#JGe-`:03)/$7]At:^'slegU\)pFXgbd$1P-C'(4BM\"#dTZ(Y\sUmgE*!%co$Br#g*DXLV> +c0)I'$/1`oOS.[,EGf]A/PU12N9;q&Ff>>%o8^$\K=Ie)QL?QS-c0,)U?*Wm7ZO4@VP[[9%*4 +nq>4mADD':0"GXu.`W==ajRS_2T6E,)W2i?gn>o4K-Db9[[@r%DdMHWS!Gl1#%KDq_GAOVAq.\>c_/hNX2!R+.j)8:!Ib<:-[FEhH5Ml&tepdkH+uBQV +7-p8coKV)!9XKlYF%qu``LNUAD=R6>7rH;,kZkqH/=2QHr($\,RJI9!'nU7O0GHD,GV+]ArmG +PQ[MBe&@$A]A5!>dYhA=IOIS?IApWLX5cEg^@;t'2RN-73Rn@P,;-lWQI#6D&p'om7)utH@+s +[oGjLFq-;5.;Xi3$4's$q1Md;(t#iCsW5go]An8j!n_aZ:#+*il/n1 +<^6&Ck0`J9Ai%,7;/!K]AqGk_qph> +QA_"D#Ais,mV+;&Ood1Pl3i:OD1dq3ajg5TD#HBtRt0j.N_i&0LjG]Al.20mR,:_NZJTG&/`R +49D2uNDB]AqLrf"J4/t;S_aqW1YML:n&K@E>V%GP@5o4T[W^O.5H*Sj5[=%Xc(tr.<@i'H#J[Y?L# +7/'lVIF/f[rUfqYUYHT+)[FB:[an!\o.b]ALQdBbj5#%<8T/em1YZ0@s1t0m@eZd]A=1qD3>Z]A +lL]A98#g3\;$L?HUI5a>Ar@C>sF0-Z+#m7@S4]AV6N;*fr]Aq^2&dJR\.j>V(VDQ2puOau$-^&>iHk2f1R#cAD_O@)jI7KSa7NY+1Nog +a7O4,^]AN$#:EcM`FGhIj%>0B3Oi-Y]A/E2bb#6ZQ2DC)bla1n4,s[4JfHae(KC\_diVA5eYTP7+a8LG;S!j +7O8Mm==rfA^or"+W4.;M3pMQ+8Lt';W"@-<'% +>@0AFpuR<]A+?=hpP&E&,o*[?X3)P"[`;G6+AKOFO8DVQC6:0`jsnYDS4emRg@(A&-g18hpQ5 ++F:[q$h<((QK>-M/jXr8g'H$q]A&`fo]A@&R1LVgUGeTu3dDmP)hrr6Dsll?,_oHRIA$B*B,&N +C67!s0RR?$X7jX^25*)`d6,/4%UZ,H*f7[5d0YOP(nE9.VY@'`9[>s(Ga[/KC*s3Ki%WK!S. +CLg:0Qu-uj15mp4EHLn.hG_*Ak"Z]A=Rm,I4)TVZ58kk:4T^e)UiWR7XUOle9?YY5ldn>/kT=hqu77RE)^W +m\g!,a$)+sem8/4&rYI&tYbQGdoV$:VIlF_d@nW93X/:OF@JD9P8d7Ys!jDc^XToDSGG9C*uc^(4OG'Ej);05"8!JBa3pPcNkTSp@.iW +>]AYTVVU=6WbaaG(bkac55er10Ip7pWIh"%Jr#8DSYt0FGOs22hIZOO[l<]AUa+B9ilX-SW'kJ_\n8!@=e54g4Xu3u=X+lPbY"27nb>cJ23X!C#TJU\>Khpt5@jf!*TA +QOk&tA3PCA=T115-n/3TblmR,SdJWcMFo:>Vs.Wn`W-PN?l%Q@3N@Wc4re+M=!Pm^EJ1Bj$' +IRr=fJ^?HbQ47Fo2PU]A;$a"M6';+"9?ME5m>!ia;T#>OS6l,IZ,Pcs'?-AiUDJhPHur@)[d7 +NbLd&?RU0R/()."YR/b@GW64,OPmW2?1b2j_qtF+-XX:LZ&D%)2ZnuK2.k^/2[5[H;[?nN8C +%a`ZILngqS>6k=OJ+9AIZ;.D+'GrN)D2LgoSBZibe'_7XWq?a,.JSGBpV.Yl0]A4N-Ng"^;3( +4FLJ0=$3W@FK6q^.*`5ts*T2oRSb!N@%4;5_<([n=Ym-fpj'*8E7o/b-7[qDfus+rhd5IU#V8JqI=2>:Vcd(F81VXau(9-$VCce' +N!58=RG^FhG%h['?cN3gUZNB(22J!KRiPLPS>VeN&ooO*+. +>2e0BeIZVdcGBU#nVK89hfa,7-Mi/Q^Nd"1.<6`P*JA0"J^d>>NpB5BU'fN.Q\nadVu`K\#a +ZC%n64)m@=X>n=>V)Qn_-]APq&eSAia]A$:FYe3YVj.h+iZ`5hh*]At_ ++q+PUbsEr@AEP1AsH(V^pB9/I/k%CeM^(m8.:YUlm>8D91ERbo]AY,,0[@enn5RcKM$M/*.gp +`'K#Co&`ou3U%unONX4?YSTVkm.UbL!Ot#)m4%Wqm2uBn]Am+`V&8NRj28_f[YC1"(/k([g^8 +A(Z:%&'=5+LA+Uuh+?45&s=`t?MePD`q_qlN:,)FNKZ5]AZMRLX9$/RIATeVH$8*htTp-/%KE +Ema8B`O9F6gnEc(J36=ret%q1*n8!cHNg$0]A,V$f05o +9r\n`&g%+5[e1F6"&V8;rMoAB,_JZX@c0m6o6cG-_1Glchqnn)<84$'/hsE\j/a]A[qqV^hpY +d4p0FU"XS[LfSfZ8AOK=b'"6ugYG\-"P5M*"_.F?YCQn4ZH6b0F8qIAsrQX;>mSHVK&/iMo. +j"Im"PBen9A%lHO1TCsUG8SY@-:3AUq]A8lnnN&fA_Y`Qf'6dG>S!HhjeQ&=976h3XjS"r!1J +M*K8g?FB+'oUJld7_Eo^BSa$of1HDO+Pkpcc,9Vq]AD"f3)eWU[qGH(amU]An?JD#[_^6c8*LV +oA9f@>j7AY*_eEA>C%GdqM)enoMND_EV8l; +!cN`U7:lQ$?ud(SmD&NP259dhMBS(Em)lHn]A=B@lTsFB,9+(E=@s-l8UWIZFq,K1;\+4U +CiHX29j:1:q0!r."1=BQ=$Xu^0_)A;6:+jsPEuoRQqe7J+GiS\JUk28bn;o2?cdO-8DY+C +&+.+A1CSSH:N1*aO:o4/jNkYL0,Sn3CPQ3X]AP$MJ5Y@Iel-JmOM`\fX@7mT_oA<6!JGAUss1#F.X(kf2FIDVZWPSGRp1V_9k3H]ArlblZd*o(K,Ku'[H#u:L,A+Pf]AtlOg/\/ce40r+$bD#NmXAnS[p8F/" +ca!*)oI[eBPF49IXB9oe;TT;P+m^lo(? +)spCi>cQoWpf2hB#dAP9X>!nd$Z=N1R7XQ?HZ*j:7itfJA&JjIP9kU/QT.98D6KHn)OGb"Cr +fKjNb4qj;O088_o^#i#/0;r`$QP.38]A>W'?+N7?ldaSdgF_m7=mBcbgi'LoEgWKih>7J%g\& +XEfe4P'6TEL]A^l@[g##`N3VA@jp+qN_:P&,pnE=5>8kAL,PLSN@7Zj2`qH$g^!Z[k=UX'MnY +)JB02hl?k`)o.g9?LIma?)N/$G!'m<(c@4ZdR#,`gs:\B<8d"]AOjV1*K^8Pf8_KAVm6t)5=R +qNid@%>=tr$0I,-EnO7a%#0Sn>FE_3e^5FR1M^)7`YLX`/]Aq3$!o3-'SpsG`,gSO`Bl9'VZ0 +,)%Jpjpbb_Pf'%l8@nd.\]AdsQ&%"&@K/!KC#SI?+=m4J>2!o>4e=l-omsfgRce^]AUh-ZT:po +`MdpG,?/0<0'8L\5[foXKQY]A.npnb'oK4,d>1WP`>V$AR2O.2!&O:K*M +>+c+%QffQ,H`I?n]A[l=E5C3s=p$VDRa>N475=N^aIgDX>IrVt>I^Q/Y$@Ga;:q'7SJsZR[%[ +?c3o+#BD5/8'HA/3m1J@H@J8R/rAk%Z&s0bPGOD^Fg.`_*C>,RK$W@QU#"1Z%Y\i_-^_d=`% +`(gtTIO)+LoQ-^M#afT]AaTmRddnEm^>*U:s6-ops8L8dsR>Ft]AC3NJlAj(SH^%9%KlK4&mc7 +ge-(JHP$a:/P%a%ILjbctgP]ArSs]AjpQbY8*46JV+D`+&d7HJkL`nj^DoIsg^]A"GM9l6l( +^Z#Q6YVc3=efom-JCHR>X>6p.l/AA;1l4AjZmeEgAcH;#ggO]Aa0qmf[TdPahGKe^Ebbk]AAVt +h1J?W>L]AOn^R79n(q[egq*X4(2)Tpp=S^G/!Ie;Z +d=iEr8KB5>(>`5V(7EFn6@"@'0He%cQL(p6m>.iK.4O\T7,8"NHfZ#^RGI%.,Xj;&&VE0k(S +7`tpY4)VU1ts(?aq)7uM;B>&V%_q^bb`Gp%)kYKiiegEC3EnZnb:5Ad_Y.?bo=;rRCQWffEH +f@g;)Xcfj,mMV'tl?<.oSodaAbt`fm'F12e)DYP224Bc]A#Cn3no.q2B&3pKYWuC`0MNNgR#t +dL*ATngW8S8B!?H8IftV[Dt/'7@!9<:J^&RTjD=r+ZunY[]A/2Eo1'1(pdRp>Z?NV0!)&>@WJ +I]AQ-cJn&?R/@7f@M#urO:H2,6ET%X]A^oEI$>K^W#T\`+_ZG8oHgH2.h%D4IJR\KpS3H1m.h;B=1Opo*jO(qail`1ZqO +1I'sb372A%uT+qHhiIFZ)4>hG]AtV_" +uF?/#;Vd6u(T-S8Dl2Jq?1XWh/GA?0guOt$G]AG0e9POo'IBS!]AY +\KTbGs5$d$&KG>u3jU$dVFU;61#*TV"/?mn(tJd2DOMcjFE'jVla=l?`2j,8=c@gL,k8=lY^ +bbFbJ]A$.Y94pj_([3>QY.mfY[3]ASOt_[lXf5p +d@dDL-@"r^R[-p:_)m>*!dpt82'OK4qqLBOhiiNiJn8od2'7mQjW]AC3kQ[>1ktp/GBA+bXU& +VYcPmfFpXV$5WPEta`U*P5a5QD;7;O1P8W*kcm'#*N7_`03LroP_3uk?&H.mMT?:M)]AGl'"? +'p;uof.anAB`=(t1*E/4O)2>bUnaSn7jf+ +JMf,-%->\\]Aub[F2*oC@>*F1)6Nob";SO9WIF-9'T"9LSs+e4R\/jLJ&qpNi#8&dr/nlD+]A+;B +(1:+iEECt5KU>f""@S5s:Vnj?[_Ocmi@Q1HJ`P4>c@aC=%mS=f/TD=jSI`X8!T(hcI%l?-U# +M+fbYheIH1`ILDCIJ1_Vk,Mb4NJ\ +emNN@^[8P#dcZXhIc$2YUu\X(5JJ3j-6Kj/mQL"+`[dG7\UFQXAnM?0ggGB8f??G+tJc=fWkaRu6I)hE>K98 +pSq/r&G:o_:kV^Fe#s0-s?'3,`.dkC_MZ%["^(?CX#>B:A3GK./Adt%PY(=DQ_ik?E2\_,[t +KnprL2YJ*>*Sk&0^'GdP>_msf1giMHK&mVVub +=J;5/QcF0*\WS!ACB!@tRhg2VpKm7cCHbML?@CU?;IRE?XV3Ks;EJW^G2+ka+Bc@jJ5gIR>E +uV.@_/Xj;QHZ:I6Bb+Eu_o-5o$5EL@B0gQREe)s4^aqF'='bK#j;g&3oZ\:DbflfkJBj?g$( +R)NQ$1s3=KiE3kg>,[LN@MDS*PZM*s\F".VDrOrr!#A6=Zqu<3TD[Ea(b!rbq`U@ga]A+hVT2 +>[7$\=@cBBW73D_]Ak;S[F.65E-#HK!gY#IY3JmiN):*8*7LhPogb8EDfX)=r#W]A47aJTtEIS +&!VU<@4-N*UcSkCMk5\RG_,lQuV1)JO3LI+,7@`Qf@#P.88+bpVmJhr^cTV+W0lIcI4e&Kd= +Du[j"Va`QS+jPAEGi/HBCW(l7U&jA5oj&.u(F?@s..e7_Uj)/H1jfsqB^pEu@q%je@Q%qXXrBMg=5pHR$W3)W7k.dViA6#A0-V0dV`Ppl^ +S)*FJd9nn@iJQd7RcO/$$Wk`*tadBFDWRXcD2Zjpth1DkB7OX5`FU< +i\^AC1[[YT?Ik"gi.(q7Q:9MQ=C24#pB[t$&J+X1bUc]A1DjmR;0URW_k%^su8XO%TmLXe+fF +"n^7DF2)U[dKCp.(oLB]AA0ndSVZ'eFXr8Rq$8["Rn6F^`0LIZ"jZRkNRtK>\in#)mO>=9j:_ +Nd(%$P/r^Iu9b@`ggM78-m[&YV\YRQ9@.mMoe3Pg"?!#tsLYZ?iBHKUMF+\3R_TpVZkVD@)#HjU("k$O;Eh,heJBa.ZSM'3pKpA78`@j9 +)3;]Ae-DC4m'WWF)"X6`f]A^o-b"R+;Xf"\F99Gcml0Zbs>B!Lukq-eVZ9/SB`FRCca,fP[2tk +PbS'RTr`G,,D>HC:f='BgHfBf$fH+*78SG%'+:K?GE]AcRYqn(4qfLi;*1rjPb=c>`rmYiPB/ +Vb+2:J$4c]Am1&QbphMM,Zp/=,"^s=hf>a)r6hu01Ys]Ad/$Uo]AhP%@%Tm+M4h8NnjH)'_Hrl^ +4r27(.n^cS@gB_e9n,^-oCt@P$1gp+=K^8A=]AfrVcD;rVh/0Hd?d%\`Z0NS9s,]AqqgO=(ADV +TA+3tF'[9]Aa)]A4c]AUQI^V$\fs0H'5hcqQm7C:6$+eR",/S:KQdgagBs>IG,)u,fN)(GJ%N/CdB4i3Z?%e +Z(;"pImOaCc:J5ki?SY[dIsmdjDBo/,#aqPBnLV]A530YRXHMMJ(OF'4F=m6sc(3f<3LiU6K8 +_)r=q:X(+a`0Y0)8i,OgEg:\a+6s5g^8)lX5S7HIDfYFBRHs+;_A9qP.1BjPI8*',7`_qCV. +h0(FQ]AH^9e8i4%%\gT_=lD.)lU)NVGa/XdM`Dhr,^doM=)d=1\t[dRp$ie&isY"W`SSaFPW? +SbQAY"!e'(]Ai(F24eg\[cP(gZUk-dk.6BH^q2]A!+5"s.->1*nYo#/ +j!2b599qmsiF'AEi?oK8*aa$eZK%Md8?IR!p)QNOqu8Jhoq-[_'N_RjoAI#7[0U@s\IK8N,j +5s,kNfpFAiH&l5b;$,)C<+GM3+AWAT6cBh^M;fki]Aqg%gVt.B5A +#:U(+6phc$5"6*Mp.,E6P2f"oH?rtZX>j0Qpi['"X&C/j>&9ch%IKk+aq!9L5muOu(9$!=/# +'JWR=!9k4%T.Ea1M&lR04&"Dmd\4l&AcJA%P.g +npcRKD0F(hq!#tHa.6[rV65T=]Aj#u88#4e$%o#73R-*8W6WY,?k"l9^mW#6+VTd3./!A_\V1 +pg?#1C3"O/mcs"PH\Q?L76LsK0]AL(Un.g`Lh49;t+"dCR(U"BJKt!2-fWEbflQ'R5m8K7@!m +5Y]A+n?/tT4oaYI>tX)'Kgd'pVbRt"Q(Qi^m +NJl?$/ZC)K9JOi%Z*pugX%La.Y&h7Y&idUe9C9Hc+Ns#>hp@`NU=89+1CQ9MS/BHWEAT`0K! +a#3]AC5Dc2Ef#9;A`p\6CUoO/qC5JIZ8LoB==-K.)fPpBGN(iuRAnP1^ZRoJOnd4l.kPE?['f +E")'B?3T)Y=#\@tl"e\HE-aEcg70Ut4e@S"I<:%@jFo;@6S$7PhlZ9;?Tn)&cCH#q,c6g^U/ +J\;Js`\OJ$'h3SU^UJE&A`!i8G:*Z&LL.lg`mFm/'?#"mE9EOW:uF.VIpGJpq419>IT`C\<$ +AX4o=!`NhP<0o$kjA4:+3g\>!IE_8[tHs[dRl.Z8jq^m3;FF*% +8ANnB0=0kP_;D'.pHlZb:)i$B=E#]AEabqP-ZpImS=YL+G)J\74]A9![H&M19i)>HiQd]A23,,[a@@AR(C +=_EJ-C1Yg_!SIY5U0elDC%9">";#C%dC12kHPZV\(#aXuY"b)+C'(#4-TksH-Q\GN_54]AC/= +q4A+E`rnPrZ]ARK5Y5]A4]AU/g25)HPOo7Y6fTubg9e]ATHsDN7 +O%#"pT;\AoZP*rjeZ9qoM5Kbk&Q;WnhA8`>G5L[L)`e_r6,eM;@l`3cWPEbCR4^1Eb?,37iS +T6[I#uF=PTCJab\mRTQmZ?rlj+iT2]AnEqB_d4i*1)>WW?=FEP2m"r=NVh=.HT=7f.shj*Vnt +Z$/9lTuto&FaeNTdo9D>*>fpmDQ$iYh#p*r66HuVgQ-IZVWQabsST*jEbJu1i@A'"OEmT@H>o"$iam]Ag]AVoCQX@Q1;D +`Xhu1bGniCWDZ_8g1YcMp;AqAaKk=20l)URkeQ9,1Ir-NMR/!3o,hFXEXC'o<0\*>h8QX9Q' +?tSJ28ZU+ZIcj%]AJarIpu?]A@c@%D3QCeX_9i<-s)=_bAVEUo,?'KFi:!8pXS`FUS#`eN(rXC +IN4&a8([s$fi0`OeS6BiKH[&bKIJ+p;.Hk/6@j6m1g\N7i^^eD.O%r*egQ!@^E\TCY[A[cub +\UhPAp2#!`,X:E>7kTS_,,kP:'Qr()`616%Q**Kg9f1!UV(6cLm4/I;.t@!%e='1:QJ[q%b/;!E:q7W +(1^SuZXu:2[NMYT9PD9e"n]A6U_5EFrO;kscHX#=kBXFI;^-'ITVo*IoOK)_sgo=m7$_%GuX' +r7of5qRW&L#'2(.N$1J^MKhqbGa\2?*C8%B5D?B+(S`TB#RKm^-$I0/aQ-d0]ApnuMp+i7\W( +R!YM@K+i7dqIAV@<%/kcV_Q#8:haJO_j)9S^9SR0rf]AsL^/knIlip%qtWKS?]A$Uo7lAf=CJ" +]ARH">'dmWbq\'T9g9(pl0e&p%7[f8LcEYlh[LlX:S"%M6bo$"Z7IGtL@rHfU8k<:)`bMdE5U +E2b3?i)Epb6Dc4NlMd/#CdG`YeI3;M+8%"q&gmkGr[$Hb]A%MfE#:$>'24Hb#Bq<@>%gV[c2$ +r9k.@\i%G6*ip!PK6)d`&YN"uC&RjRjq?)OUWTIIq#'[W6F)I"?dSH?.]Ar5Z32:*^DoMRj +!1,@c&X"N4WKXEtlGM$:Y2Kea1Wm3/%CIun*?/ah2p3[lL2(pUG2D^D(Hf7oBc!?:ZT?O>TPjbWYbXB1%`HWq!Df-B@_c'+bJJ,Sr0C,JbA'R8F,r.?)Cu +l/e1k=+W-`4GAfZspfFqQb>2HcikFVKE)i'L4m\IG7J@P(j&S6i +27.E.rPjQS::La1=K*(Dn2Y"U]AahRg/nFM@Buc,\m1\oaR(IQtG6@SDGfLLHB"A]A[_FA*-UW +j;aIVCl50W@:/"tMq5rh;alf:r:9ekm\.EZ81Xqo)?qCH[G@En8 +1=cce(gFeB:\5*ehS.j#>tL&Rehhc6)^NAcNX)8l/XHeIdIjs/Pt7hL!n0i+;d.M&h#L*N=8 +WkdD!CjXLMSRA,Dm5XQ@0%5X2ms')KEWT/X6VA]A7$k8]AkiDE`(3HgnqqXps*Wq+aW>Yi*0&! +Xn%Ig".^i*ee; +aAW3PUY]A]AE1e16-.[^F58hWO?8bSr;+/q%jDBH(C]A#O[+DN@jK=bTYR0P7SW&J?kQ!:sn9HB +JeM\SaG#f-\c0Yccqel74lZJ2$miW'7W*H +>328B%4Ne(BqHec_NN&apY7#CTUuQ\U?/e\[LXT]Ap^;`_5WNh:]A'cDSEO7b#d&QD!(Tkqo)X +raD=omfA1DR5e7je&Fk.,kn6sUlhjqF*;?WbfVVV)&6.dO+fP1bC +`D.=A'ESIH)\JmBs[1h.,1D$%O\UY95\Kl#/GJ&Oe]Arc3c&)3gcku;3&n@=lEE84X+4YOJj) +mZmkIbXBWnWu9"L)D[u'KJ8mngjn6T6KH?Y`T<;am;?0!kL(rTr&e"T#CgdSt'W'8B4E^GV, +0.0&BDm&NHW'#-DA(.t"gMJDbSNpf9@q-3A+BUeQ[LP2[_\IKjiXEh0np8@Cg(u!+pQSirKXEkSU23RjV=O"B4-*"2.=+>2#-^>n'VA&2(d/_t +(pn2Zo424A@`L,NO3?TY@90`^Z_]A +Z?c7,ll2SlD6b0[+3e-BW)X>BL&/^nC&*ER-)q]ACKKR,*D`'lZ]AZXMQLcMcFEbR5V;VP.Cra +f9hF/'iG/Gmi_=R0Gqg_p,rCic[:4ASg,YL'OfgK9qc*C,?=CM!M8m2@2<7Die'JtjM +TDINnkOS(XZEiKRV4n,'[(;O5JrZ'3"2jYm%HqjWuH&0/I4eK=dbZIM/XUP]A%\3\N$J+WV-p +`qYKYa'S;k@6\,V`,NPfGs$_3EX!r!(Ur+P35F5.>6o.Ml.Wt._3d17S6j>K[g"b9"6V$!a: +VD0R[la[lajO]A),!h^%^@QCk05).e*O]A*nqsN)%r\n.`AEY#GJh4T9C'L29C-rMXG/sDB;0;Ou29t5)7OH0*$m3:8JD]AXX2TT,-c3A\3Oj.;?Pe8C*,BN1 +1oqt&SJnha[]AXu\cM85PdZdn,lC*5gX,l4R[]ACZQ12/e/;+Z,Q9SUM_t1/1,6fDp4&Lu86+a +uh?X+P)kZ'`\C77Dd,^+Ns(VIR$pDY_LAC`e)qE]AsOpp%=IetF]Akog>;D\npU.K3L@gga$1d +`gZb(`R@5,5`rpOip*!OhR*F*UdfhP_]AZs5_Q&V\ZM2+7lT-([XV5MRtT[^V87L^WUR?cW:mlLo5;AoG7qXe[>\F2A +Lm>JHOV2A.m/&e(cN_?NZ[K+TdD8rttp/G&h=3XVa^+kI6R0iT/CL:.,U'%7]Ad/dMXuD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.p,R23EfU>YBI61VNCY= +X$/P(++;/Db&;`5\pWVl0VUa@uN'oF*97M0Y#78/ZBW[?oTO0:8Y7FUu(#6?Ba)UX\c0b@Ca +t%@Xb<5QSbI"Zu/[Bgbqc1_@:@8iLY!6G:30IAZB&U,/X(hQG`L3]A\5CE@7o?gE0ru,aqgO$ +`QYMT&n.C\?b@;h#T"`8*>`eo.Iq?bPHar\=GOJ3<*I#;EZ*c3Vp.uooa0uPJ=%3uo#h$j%I +C/@X%B2M'bY8m%Kkuk"8XJlDDdAO/9B#Wgn*1HCG8XZm+TQ.e,WDrj?C)SsF_EBY%!e9)*`P +%"`(biF6[0bDlN5ZZB%<95hE/PAJ:Gi/*RMiW8RF_.#Nh:0D41G[Gg/7iab@XR)@T(O= +VoY*P`q:7@R2n"=2SB5'j:)b9K7BEec^`GXDm?@c*m3lEX8K!O[2loZW9`Sk#R#odrkuNKkV +t)!mFYFg@=1.o]A/bm]AS=VBd7HN?>?`(fI]AF14B;@Y7h0^KI([n"q$:jBjU"&`ke&hbV#DVF. +:I:kP]A8=sUs1,:=<4+-(s1RpPqQuh.([-!BdgO-k2hRRQ$g,:=lda&(8eoo+YIXN3IekOd^& +e.;qLus"o"XUFfF^<:'a6r^Qti=ppIK0UYaa4de"M@rIIh8:*bTXU*K\EkNc4g<&d>VY/?7/ +Ns(g:\B2As!J+E[U6AQXT12`8[qGT>4L!=8GU6\tarIqS995TQ;[4u=4lMrBfr6a:k4-bd/$ +<3ArGt(B0k8VN*KE]A'ZL_q=FU_D^l5t"IhQ5(l+/6Id\ej"SD-PT,A1IKbP2,=[3V.0*48!$ +.b?EbcMa+2AaiT7o_%_efFudSGH_VZ1e&rO20J'L4$l*!TlF&;d7hL/cgKhi/%QUlJIJnjcX +c$6&4FP_^3_!DTB8i3"I2![/M2F1Zk)H(Nr\Q:+SV_AGOXlAm,d.Z'M+'G=kL&LW2<+YlkJI +h]AXm`mZ>0`21hk]A#theI%a9gP_AYVCFCdl$O\l;,^8`N)^_I$/l'7,Gbl44:ISeQ'[>P"nt+ +4.@6I:WP'r>[j,K\`@47:YX'%hdX%jARDsIpHbEdlh68.P!X%D(7AIXmiI<=m?QA')b5OqE@ +/gI`bp?7p0$Z7.OQuEeO;G9`=VZhL!^>t%'_]A7H"Elg$iD +>k2gm.0?"9"eel1\A+j2-1_^67FEr`HVMPK=$0E=H>eLG[Js]AB#paQ!Nt2dCum;S]Anhl>6KO +Q@-^&uaFNtg*cdN_,.&$5W_kt=2CNJC:-4e]A(+.st:^908:n:Z_OO;6!K]AJ]AaJ@?)H[$5u*O +iCb-IQ>hY7dLM%hm;Lf)$edh5,KeN9=$nma7-:FLLb_>-5lhN;ph)*BnIcch7M-ON__;>6$3 +[g4nP1m1Db&1&_^H^@!:fQP!J5Wb%`-m7H)U$6h+O>?7@)?3c0(la9&.Gr!)_M_(Gf7!^/e* +>0^)o;\I,NlN[ip=iE5rO"qE9:LHT^0abES%nYO^20[kQnQJqeaLT+$$0\mjD`jOel'$e7g[ +CKE@]A3R5.RL=:,ZAB+;3Q)$K!:ucqlN-@l!s-)=f6"j?n36!9d7EG$lJg%WW1.@U_AZ\NIEPMi[3;5c +GegSc()mi*R)VPj%+l,qc+9AqIngJR8"\Tn-UT64R3]A"&2ncot;.Hk4R9hd&ih^48mB&[It3 +>!Pb13]A/>? +!=+^i2/l-",mKhhFt(fnu.%R@9j@eYl7`*Y\Z0V@f#i&k_jXFBQ="MP=dFRG:?fWRG.,E?sQr-8D+\um2nCHf'BN).r'uhMT4Ug?Us&2A('f*8/ +h\>Hd;kB(q)d,e=$$:=?C;KI94bn:I2cuP-GLWT,iJ5)]Aa#s=qN)Zk2ac.eAc2QRt8D9#*uo +<^r3D84A5'"OhFF1X)9+`d-s!`/LRO'JYHS=%A@c3R"THc:a,K_6/Hf#,H@bJ&?L7(P(P&-J +.Oh,GC0g"d-]A'`(!?G?SYM5&6MnG?S396>"MnpAMX$T^\eP +ILM5K'+C*TNOf/rj-\YR]AtSMa<^;K&##.1BM217`Y4-?ZZ5<)&@gaK6bYiGH0+S,E;AYan_. +:@cH'Bb+V*DaAq!<+&WnGCXh@r$GhkYZ8Bn&gNg"(QDV$9%QHGP(7C;,22J-@Wkj5g9kRk7c^(G^&KM4%BeBh +FuQ6XRlc=[dk,kN?5u:&K/7-1K=3l*hTRH^8s)e-?nsJ:ZsS.H(X!.Gc)JZE2+u/e\7b;H_m +8FF(P,XEaW7!=ODk.[;YY`K*/j5EJ`X%fYpRSPEtt,?Yg/h;Y+@H0"uC4mF$90MjI.9s-V$r +_EbHcJ\c*%A:AGo=WVKiSN>8IA"V)*F5^h"r"AeP=1<27[jQ.aMROsHn0`-Mi8>>g:Z.nMA]A +VkMi]AuZJWsAMni/bU + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[L?pO>O6h:Km%&FAAaaoSF)Ln?Vsj*OrH +gXh*ZdK4hOjQ>omXTGj8F:R$@AML7RMH\P(\LAk4'[-4VAA_4RfCCE<5j$jf`SQ8OrnS*\0H +/n:GR9di,#VGjhG31A*gfFtGB+OVWa())!gQaAs.,)RiO&Wo9=.)-,8]AdmL#m^P=Vkoh49XG +4rq\P5)%h6Qa=4%ZTg/%sO#US$Qt7[%7emeGJ)cr$IQUrT)OF$?ljOT%CHShbjqsCijN.KQc +BGpUr1]A]As(*1_2L=Tn(^PrZ%=+,S3a(PLfOK)`V[qk,fH]A-6/"ejbO[O#ZHt +#Rk*Rq3f7I*iksI5,cm,1[7g:XO?in1YcdDAR]APZPld`&"m*lhpc-4CDr/N\T1+/[jDW`K6f +,4FF9`4HMdU)jl.Pa:V66]AOsg_ScXcrKIUq*]Asi0Sdh1Yb^ltB>]AH:R+btPSHRD7!@f%Z*?> +0r&"_UUe8-T`*!L]A$D)/cZRj]AR*pqk>fqmE;uk2Oe['m[lY,]AV(E(MNY4%$a#i>ZaR?k)]AYD +ot(es=8Gi%6VZ:l:Y\_3.`k5ai6NJ8`9'2cQLT2?bp$ut`_QWXj&0XP0,(Hb[d->aWMP<,&> +M!82XE+?e+Ok/.:';KXNcMdb@gXE(rH!Y3a2B*O(@SM(Ega^MIVDCUF@7[k&5Q.=2KHq;*JsUYL%l(T-+pQo8/R@>V>(]Aj(CbOl$LULt)rMG:=.T/$# +-!j5YlZGNo<%]A`%k2*+Qnr10IPn:WX@"1okOAepe]ACFu.uRb8SSEb[,p]A&GiN<`T0!(3%fJS +OXQsMZ;8kEH%-DbYe5nOfaZTriB2BbX*6VuBD=c+ocU#[&A +K"Ucoc8iZ7Y0'#W6>VQ!7+*&:.7#\Gj2NK,PdPY&J;AZ6n=6(6t3Z2@;d;)$V7Y?D@6C5X5Y +f^O6:CX"Z0\iuANogQS3u50*%=NR,pr1r.u4@4d+jDQOg0J7BagdRf&oWK<0`/,o_tE,SR$S +o_.HAG*!W-`[C\2c8mcbJV5m/UDPoJV*gnTpqD#UogC:%ENj:]AHiA\O)c8ANfB'Zrn,mA0d\ +d3)RIQU:T,ZI`UnDQ.YQS]AedZ@b=d=K(EV2Y'(DI3F\1IA.,p+kXNoB[]A207#X)e2=O5(38a +mHa)=F.;MlX;Zk<:pe3FhDl2^[9g^PZEplY=UbNKT>>`_7t`U.nk3Zb:32#g4r)qa%d25?BD\. +8uFAtRk!kA2I6GAT>B7::%KRVI?=qBcXa$HR+O4rr%3T%ph1%5EEW"[ +'[o9NK0!<@4cBX5qJY)aa*2(+qm<^=]At`nF34\dh#`g+%:IFZ6N_u<^8N'Bn1(TU:7FL<7Q/ +U_$S#b5_tUM;Ref%-IlBQ>&*;7[[;hkcMs]AltCs/noC@_7ZjD^"_?TLSK9s$LmX4BY83&CTX +\#O8'P_=^sS"#lun>1f0d[$YuS/g^8hmjE]A.^XrVe"r_Ipoo9EJ[=]Aj1@G'qT<]AYQFl*D^(6 +al1/d?mP7VN%2GIg#Z/c.%@()'-P/b8'4[T$4aG@g_-ma%=ah;,Q7"/=M=nCepFD/F,3B+IR=cl?/)1+($!"l1:VgGadN]Act*l>e2_ +Jr%7#+I6@CuUZiWAoXa(^2B(dM7WNqYj`VN?eKn#dgL*.U.G9I/-[Xe$CrTH1/oQs46RdI:C +Ue;b`7I238*#,=`F!Nel6/[7`908W8_Fhr!<5]AtR]Anko4AIIGJJs&OD@n?RQoO\,\9H<`Bo! +e^;c1(n6s0%8OY;IrV]AW^rM''9sXV!jo +G]AM!J&1JL'Q46QD4gKWAhlLG-Agqn2CT+8\WQE7\G2d=WFQrfUXMr3D2uDh;`KuiDY9R"j3967#au1pLo^ih3k909^\ +ItJBIdb"siS)5$`'tWhk:RF(e:Go!s,+BQY2f0[f&Ei9I- +XuN\8fX1SM-+G?3e'#N1T83FGdWHuS8XK#aRop:Wc,ALO)1%GmmsAe3^M@1MR7nXOp8UP]A;l)QDH_+>ML;m-Qh&`.:MrHFaT4#);-2)#lAhWMu*75=q +E>SC)+\Wc@bk%WGP]AjkFt.O0SF$OXBG4m*Ylf&Cmor;HNegQ!^u#dXa0FbZWB,GU=_4\T`Er +!*EQj[+26K2&;k3aRci_9T4(-6;+.L:$FNWQ[.Mla6*i0bM>Fhmn0ip%.3BUJ]A+e\&XYoNER +\`kjIP^UV/99LK'2CmLjMN2OS/30,1b%\+c%T9hh`':[N,IiJrG=bIn9d=]AnV_rgWOA\dekjE!L-&Jomc4:N.Bb?fIo/CF']AVH6ImqTR^;Hd`kROVsYRpCpDo^9`rt +,4Al11P$(p9!dZJ3JD#rQ"I)RG_PZj`0HlsBK@&[[T'$U\?=O.C-(*r.]A*.L-\`T/N_NXG02 +f(9W9CH1U+?]AoZW3Eq0C=?8AMX+Wf'6E:dLK,]AoWD?ndu-JpeF2575bC(Rd%kL#;bIJC6OMn +K47c/V",/K_-tPf\3nR\i$Th1-`dQNfQOG0A5i:PdBcW([9[O*jEluBP<,\T.X]A]AhHiN.o^Y +eFm;G1_DT_W6*JY.U&cdd23OE^.4H]A73AO8D8$ +]ASe#OYk['1:uhS//tD7u(h,`P@;IFUcA]A[rBSWW[f>^-H='*FWQ,TNu]A..b5W`EmVZp6c5%* +.W;Eb835)`AHC2oa^X)eQ+%As)`24L9d'hU]ANgi;C)U\5Mm!6gh)/lsbcZGtb2@=594@NSg( +.NNa9<`]A^.<%7i]A*ubYs4=H@_>omSqGE:n)-;TAUH.4jR]A<`LC':;I@gRtra?`V%Igbmk1bt +s,41S!YcA>`]A:i1&$AEk("HIlf(nJ.m-ok<+kkh!"Z=Z1Li:HO1R2$bNrVn&3P)1qX:@qU/d ++N+2.)a(N!rQ/)d`;2<)j/Q\V";0$9A)frXY6FU0M)I:-^D8XPTrE)]A75Tbh6K/O +`QI45.^OXJ4;:7T>]AG^;cBU+V)QfZ,2`;2AH="XDuXL)`Lfj864,ZpGs"3c9&_MX +81N^bESr3p6Gf>2Tld(r^h\VUT^.qter@5'5]A276<)pfc#=MmWL@gYI#j"/OsY:"^0WjP5d*Hlu +WR)]AtD!?Vkg+Qm-,jjK?`*.`>78oNoEPZ6B:)#(65=gV2a%JYh`W`a%qqg$N_MldcFm$EV^7 +5hFo3kT065&7g\-7#J%NFp\aUjK.9WEfO:kc)^l;[$iM'mSOE54Ta,p!)7k%^_V*q`"nLU1, +bcKmr9#X3f'5T8#P9a3e7_h;\`D-9Bi&DqL6qnCT4["cs7<*)"o=-u%1g25/_YLsJN0a@X3B0".qkkl) +d=.gS8I$ZG)!F=[b8f^-W4)#/Qe_kIkt^MH`hGV"5#51l'Kqp*V%J#n"\O*E@s3$=o?.JRnr +@e@]AUJDJS(#0Kh0mJX(]AN$rl`KkM7n;YdjQ1AVs5pdm5KMeCfB1p>D_nXPjh)+i)?=;7"6A( +EG@C0Aoa58VR5MC"&$rY/;Wr$acrS]AJaoW>r*X[F@'RjGUinrJNM9^-T%^t?-+U*E?+Gps6a +'2KC'n7pP+aCFq^./(Mrl"lg]A7j3M-?h1n/JWeERJud=Me$bZ4M9DIAQ_JZ1HY]A;m.ontY@!n8 +2?o+6's;@F)#6Gq8nOoo5>i_tY_9Bj-kN4f&NS^Ub^,r>lJE^lm_e&e#,E?!fHhfj*9$6b[?bL09=]A5QXER$qDKd]A`'I,X+.fDEE(:6^Ih]APp&=#dA +o&Fp2oZtS/PY!HW7&FY-YD@(o]AIenFg/,kKK,.Bm/3;9ZfXd_XMr5`!PNbE%TSfijRCRuh/M6JO8![>?ilKdNrI*R4c;lRc^DqP@^_p^8@C9j?#,\H%Ma +@/\U20g7ZLJ^7H%TGBk#dTh%V]A!U(A*GNpb>HM"CG*nD[&,oE)0)!CXUkOX^AmN"4k)-arrU +Ab@3[,Cd5KH6XehWH^b3h.`<V`42PdZB$,K,2=YVGq=D#7]AXkm2(bre?2]Aq@2ZZTNNh_+oMD58"@Gbg"JSS*oUZ +G@qCri4&8Y,\^kp,Yd[;a%K!70\J,cu0d3k#C[r3iIt*l6M"9F)>V^1eGjKHW]A12TF!.J`U9 +0>?=4BK?2l4bU-1OAEe$,8A1D)9E\3Gbr!0&klD/AoAepFAh3>^u)#i9#VI7l:/0$K7#-1QP +cM&#SnUDfaM[;B?qS]A?;`%>4qWaP*.Pc%,S1F3idXZh?KH*2:^753fB/]AWiq]A_Jpa%n@fL=B +b[,BB*2]ADKJF`d%NjtJ/6'1UX0O@/0;&Q^$DmU-a"$7LSc9o +QUB9!-bpG`g9CW(Z5jS5&5jRrE?7kUW/p!KLLckDM:HFGcqs=,Rr;9kS"l4*^Z2[PqN(0Rm6 +'a6d]ACK]A9I6o/\3GP:F=ni*9=85#PZM6`A9Q(_bKs:i2/baE"T"]Aq&+9>JVYG!JlgVq`An0" +&KO&3]AL6NF(Bhmr/10_XiT(mY[%:2e1D#Fr@@j-Ia^YO6R!sqZd)-NkUc3pO--m.\d$dlrs= +Wi5[k"1&DSVqV;R+h&Ssj#>ZA4Y81RN(0DX%l9<`AMB]AoXe6'&BBdZ=pSC0D +g6JId$El@I`-A*2ZrZURX\2Y;+MEL![4NfNPAKM40DIQOHLr('#Wp2EsF`-8$q-aS::h'rmm +/2&SGA-Bh!-V\+u2dCt=GTK!CemFb>,(VD'*Y:_eR>E/r*]A#>P4+gKnY^MfL +[2^MN77]AP?bUnjQ;"t2l9a(OG/pDVUSHl'do7965M2:Vnp2T!m0^e%^=TR:m20TM+U?)rh\- +[%7f&["MVhaN]A"15eNSWp_JA-Ta='$JTdKr3[#`4V9?c?Sf)tblE$L-'k<[D;i`Eq?TJ<'AX +F'$q#:ZD.lm*`\ApZG5%".!?&5>*h`H'X.46Y_cZJ0_j;n`dV9CX%1.'se$m+8>?m--[UZ8( +^;342Y$F7$_$1oA?ape[fih`/O%/rRK_PYLZ`VIJq:DNgp$uG^qa8n$&7$a&Sh.?S6T3R4>% +ZIJE_n5(-`uo/M09a\1p*@6'aJMcH0U%.=rXs83]AAnJF%Hd5D0E3R/V[=$*M9EtN,)CB_ +`W)(J(rf_62YWTI/ECLIP5MUBb1b)Mi]A]Ae1np3XF[,&^$(\eBi'4Z-E-/uJL);YF"(t;!.(a +#StLokN]A%;84Ni^8FZ'mt%hQU^s'+`QK3>mgjl57X@J]ARNcY1"eKFBpk;Q"HWJHtuilg#ooX2tfc!e]A9#_f1[&*denh#5f +Mb)ZGufZoo25C$"B!15A;+`p:R&=,uT/ZLCFF,-nbjQX3.TXmY!&maA3e07O$F)?T8=hPb(S +pDBS_&lEJZX*5(J-jsmSUo7sM!jUnMjp$KlJk1ddaF;WT:-37U[E@ViGb=c=3:iP5E/JI^jQ +6=tSI/DX6ulS>cHR"c*O"@mD.>Q#096"6'>LQ5l??3[ +;aIrlS._qgFB9q/fiW`E&jjukEiu"fZ!B4=qiogJ9K@eBYlOqc""Prgu`l=Y5HW)?K24aZD=H6f`"K/s16V5K[D0g +7f_?,)!EcQq)m:*_SAMLG89:#G7k@&8f*rs0@P"Z^`fr*Y`!hK*mYQ\25\+sSo<^a=.hC[AB"]A&+GB\7jb2udGU.!4\Z*3P6`1etPVA`FEB?L!9#p"C"F(I&fO,@>ag4sTldtP0t\ +=-f`A[6J*g8[D!i&%)Z(XB-B#D9\qm]A7B6[oAmHSPTNNN`rSC_cTQ1I/qEhd,+-^BX@M0pK? +-mULk)s+.nO$$?+Xdn;*Yj`(`2of_C)/+gsi>q-eZ+:M893p.2F)T5,Xf2m_YNs')%FK__d9 +(*(aMQ,*00:69^BJ%ha(,q!m"pOScsDqN7=?k/gP/dN'@6*bqDjNXJ`hpbV80FbK%8d-XEoo +SCquBo>I/DcjP#e%ouob5pCiC;FpFHND>PIsK5Z`3FMRa#CH32 +eZ;Dfnca@qheB*,X!hq;0!MV'U2a$b)Na=HViY9JeJp;+FT]ARQuu+[?*oI11?Id@.B\E2RA#I"BNU*-tZMLgAAeQX/f$&MYYce4$S"JAdD*N)OWCe$,A`V[ +2&ea!9BZX]AL_FHP^U7%WafE^#`EiiH%"\W-bZ5/j,d(DfINC40Pe6DJj9d&PkD3FIq[[3tJN +.2o5%['u.7/6V^CT=G5c9IX]AbR\DK,V`jtt7P/Q?X6,tH1+kbU^7EAde#c.5NS#_*t:1^)=\ +4boGBML@S.O=ipp+-]A(Tojp?^6b)o`eqK*4()I8,Ti!U!.K8JASED["8]An$L8h-M10A:#)+7 +`?d4K`WT=(`809Bq[=k,4C0F12_Or)C9!B?\te^FZ\_1(%]A%;%Pn&t +aEo'W-,kP-0(lQU*"h.:l+.pndps?S5jK%0G01grf,ES!l;T6KU.]A#V=81D')&r;f"0emZES +1j#+!M8d%fHnMq>tT^:%Ph5`q0=#&T%Oi;/[jhOE\Y6'5@<"Zc)7rCs17s6A8DKDn%*? +ASS"$$VAa!$G'9@/"&&j(S%+N<@\&Aa;&?A?O,TqmtJKRg1)Mn!5R+WcSmSqW6QC#NGl`M!A +#kH[AX&m^C/E3>?Gei.^G$F$/^70-tqABDXDVLhJOqHs#bf(E@T'2)+F$^kQ+N*e%QJkm-@P:5tDR/ +&!I=JQ2SQ*"=(OD_a._b)_,]APN!B*gG>M9r=a&6Vc_$>SMQ3hcU@qY=ptS&6.,GA@i<^!-!G +q3#qRQh1W)6:tEnNrd3X/:!Ip!k]AJelh_^/f;k,`_%/gWj?^"0d4Ba@iY9oR68HsKNZ_G=l4 +L5H?UO]A)YL#\(&'s,bXomD!n72ehgK1Bl>)(B2[]Ap?%J^HE4Fhe"XBJ*l4R_7t5t?;^>E&H1 +t'Q'U8SGrFQN0!+\kB^.5':R'.:KN=J/Q6Q/1"q1lOdk\BY)n%)-!ZMphc=aWB)3S2Y=<0Bk +r@K!cLBlJq^)e%%\S$o:8Ff:[:AC-U_V1459A#9O#meNMqXnVC&Uiq(W+)-e"WS2E"OpW,bhY),-^5)HHU^G;MGl-\ +gENp]A6CH=QUHLd_q_\[lT?1r,6$DZP6gjqUJk!@eRV&N;#`$G"\ni-\QX*B(>i)ueh[<5g,>!;\U*I$Cq3(R<0mE)pC&EhJ5 +^[?Q67iqA]A8?YN,+5gITj>mkBZ1Cd^'T2nY1>[:@e#asg$Q!V>ldU?>!@"s*!kH6gk8P +)J2Sn_qPHt^*uVRjf%N'JKkXHoYhrom_#PUMgBUJ,L$MhnUUtCgr[T`)ZNF"Va8niEqlY76Bomms60. +_iB[8Op8!7(e5PuT"gTb:oPrEcXlI&8DheYl;fWnDe$6(Fu^dDTT+8c,T:P;BW^:&;+_T^6J +J:mfJhP)X=Rm#;T>((Gfkgqb7;`Pdn)jfRm)`#Auh'L^;hh8YT4Hti>E[Gmlbr*&.V$/E)fI +Tq?P(&.6s/>%[WiCAN-2=sSIHa-DqDnid^.+9Mqs?/_)U6k,4[JY/6'd`+7RK>Tfn80E's2r4oHb.SGN%fhS&X2e'S(*4i^P:Uk7)CA!*-*$POkC +suXe`9$iOP9!3+=`5Si,]AIH#I>eM$q@7 +t,!jS%FO9bTgVW3>/RA.$^&;p'd([oQAV1RK+gm?0Jc/+m`HS]A?DNFdhtI6kRUA5R=Mb2*JR1.CG.in)dT66:t-Ik +RS3La4*gc"U8cO@f1;dkRUc?Xc&TcrEXEAo_k1HGr?=XG>).2a`a+pmX00Aa4F)[Fnp[#oUQ +NW#kWA>4Pj!!/e:5#Ihh>Go)ML.o?Cb)neY6H<"5obPAt'&l4]AK,4f.8`N0\quokFXXHeQs- +kst!I%k(nmRd^lFlD)5a7$^rc0KhJf]A@!P=qdj';&Nm@E"h`P]ACpC'B(DYVE:>B41j"o2%o! +eciZ6OCo`/Tb9bs#@>V0n(PqFL((n/9N*MI.&p7r,W$nNAFUj9=n.rR$+b+`jp"W[e$kR;** +YrNsn@qX@^7lSibU*]AFQPRSu=jMYkn^Y_"iUhN.in/sINA2/8fZpR!&HdpH0[IK0sMVer +"kgl[:?l=HNNS;6=0J@Je;rD-('MUeQ]Aoq?C.b6(8<#uT@ubT7<9TTi=6^sVI-\6CAJqGDGD +jJ"2_e8FsqjX&LtFH'f+2/j[^aN"d4M-YSB*,G:#pg+X*Oj`sl-@I7D4PXpnPWIA:]A7T0t"< +e_La7o!(sahs@GGlN:MP!F9od)j3+/7%^UWRIDd&rA.Z:i)m@@Jbo?!g=hUMhN#`?(,!.]A8i +?HtfjBXePZ3ZT[7I+%",N9T`6S*#^G'7f0,qlG%e0s0ce+UkP0MI,?EP"tW-P>78iTEQ#mpE +R':;-/TYG"ROpqEfk&q)R!^E<**HoXNbRqPbECD5=i>IR1&Z74TMU4FqHO(Ic=:`Wnl;R@)> +4Q`.G#St#>LGB&cGo&>[gc-XWqXr\bc1sVT6IJZo_bqbFg`/bG*CMINL2?NXX%BWBDfG`/M4M$*n4%,c=;]AiO7&_RTk,>j&$16$ +obaV*P'^CgQbTEQUZF?[BnjXcM=/fnJAN/V@kij\/]A=W!`b'Z%h-n3P1%MP>]A$[HF%i;VA\: +RTH@V<2XNYX%$5NtQ-po7&L@/CO!K0K:a?B0/lWWUf;(Jo(E8k_n34i1BjMa?J+7C,AU=LZ[ +[Bo;=1t1bUiBfsiI_J7?,U+b;@)`9rgshYDHN.tj1mlmcFo]At"=9h]AeaYIm*iK]A*!'l&6+/s +4h%VRYr`J13q8H$,h^nD&]AO&TJ(VO]A+(L5M5.&5;$2\mjhW&8ZH&RF:jY^a18V]A6[eh(FocO +C9k1u%C>8+(eQaF\33`?i9A:Dg:IV*@pg +\GR0trWG8:+C:aa=6SXMZfM7BF^^N2*jt*-',NTD,(5NRXO+0A$fi]AS\4dX2-_QIfiA=\;>]Am,^. +.OCEXa"Du-[-*fLQl)O"W*_ns:3!al."BBS*kSlpWVUp!#W-AjdP36d0[MdscOVoJelL#_BrA/e&JFD#F%#L0DWMSun*B9q6oBcF#&+'jL708Kfjs*W8BT-QpM%K3"2(Sfgt\J +ZW4J>.ee\H$%FC-aQ)/1GgX0!$@k8:-,$JZ`RL^5_AVI'I'\mgOMc`5EFSf +^r;uc@(`kcI,']Agmoa7Q=DE3A"(gh*bFc/\E-(Qek73]AFG:BS+0!"ccXbeG,VlWp/he[WjOR +/m:@6'`-G,.^_<+6\^6)LIStg\;;on:MtTT9%8^&HFB7B;XL(GiRLc +G;d%218KAq`Ha4Zn)DE#k"$B;\3(6+'aMk%O,f4%B6pnUV0V!jcC/uNZ#?5e51TL'i>a&Kgm +h90$d2!5I2@1Wj']A89c1AsE-`Et<[HS`o[uo3X)?N_[aISJeTj<.q ++,`!!lLlRkU:"TL(>(-8?!YNjRf*KWWe)j9/h/Ybf0u%>Rs# +@+O&D_D)aJW;KLY4^9anPiN2N&nIX8-s1q30MI&m'#6b,NFZ@-Ao%@m\7tf^b"?=&^e#j4D`30H:!FRQBlU-H6*8=:4IK +^;/,KOf?`0Y['f(G8R*#>$cl5VT$Wp:^[ga:"/mOkW*kt$Q'5)Gmej\/]AOG"]A97#sWP76 +Zb'tKKFjCQdu_>+Om^#3DdjoSfP]AA>,h;_>$gb0,C]AZ!S932e2P=\:+,%K%6*6X^&+fT#CUg +'S]A*Mf&=^UXZg%1U]A'@.Ick+Ua(:K%r=\3a+]A>Ql+]Am/>q_-UDQs%<83.Bf6"9mJqRq_qmn9 +nAFOZ-\e!lbc10bb)s=YlE`R@+J@LhH-RMTnk=2:6>44qq?us+pfoV1(iOOp9TM)CV$hWJ%PCNZ +j$5:'(5U'IX):AU]A(2+P7e +"qA<371Oj`XoDSk3DPLW;c=F_)nADYtlD0SDQ;>nEpl)hd$;'t0Ie'"A[P*\lVTVIXahE4$# +i;2EP0\_r'=WS?\A"T +"N(/o65%1,/6Pqa? +(1,T+<.)*a@VPPYW5RXEddr)CVed&+R/l4nhUF%5$JCBZ&&$ +VtDgb#I':di(Ln[DE]A$QIXi_WPYgIo?J>GA%r$I:F?c[@C=fqSl!;g>>%,K-5I@4BCke[SdS +>_CVN2l=*(OQ@6<$q^cc%\#b/LF,+6i?HR(YNcNptMl625Yc./:I%/t@,MSbboOKoX9Jre\= +*qSs)^b7iR,_C87Ik*kRntlBr%F)]AIiSiCD"k?umK*rRI\K+D0Pt3?Y/sBFGg?MJu)``.qLh +CS<$b'csU8<\+7SP/ +U8nmIKUj$\=U6n'`%6.4_i8$&T`8Uk`jY]A#Ma^,jX[6(9L'/&Bp$E_+::?P>me[80j?q%P%! +'^1YE3@]A&[+]Ap+qgS^Z)md_RXqKa5bB">Ek;6EWu3.B3U(=j0nEAStI7jK\j(,Ro2T47QdoY +Ej>#hKK#7shaZ0$BRSQXO9EIuP5B:)mm$r"kQs+F,(GIpto) +ig61YP#ZKH&+RR>"->mk@BS`m>2#bhhQMOO(>.UcYn_Rf/&jTkFaaWg=j?C[]Ag=j3LfO5CMk +tmH\%3\E[l'ojZ7>h`?m0BJfR\TnUgpiA*mDfS4fc:1<*u>M:$+R%g'G?T$s-jsmT&9a,JdP +:\ea9$7oXhY/?XA]AH>:;e^H;93O!gAY=H/4";V:7hbPQ\qH!W4rGppj>oE[nR/m?Fh`TEhUp +EQg/_j5:;#E[BFN(eF4c:"A&>P#8'tC?=BI\^YG9F#fJhV7VO\.O9T?;3C(GRfqW<1i`G5`g +cP))O7AVVmE&ED8g'[r2J"ml,O@XD<-co.+rWuEoJ>]A3>h>(p\6&)DqVZhN\j.s8t3j6h$n# +O)mG!8H"S6HBIcZUt\d`f2*Xp7j&MWUZ>d@#).>`$:pO[m>[u\[h`>ah'sJ +UU.9S2Ln'XTe`D^fY`41m"L&1nRXTpTo9cMaI6c=sA7j0n:!OR*Sr\hd/P+ul6pcYMoLmVT"b1PE +`g8lm\Wi/J9U0*Q]ABm'O4j2bD7(JhCUGhlRj639*Y9_/.rn*u^+^5#')g?A37NPEL#ff?0Wc +gq\WNDG^(4Y4h$:8S(US<<*D=7EXg.?gq^&cn0kNX= +ncEi@0:mLq237[q);EEh$7a`qb66n]Al'Ae$5ZA(HI4^&-qBd^'KXl?W_si3'&n=-0"GcWs-DEk +T7t[9OB8)Lu.et[e@KsuMQQjl^g?J.hC;ppV+EU'M7]A&=om9#[YPYf&+Q&]A!s6j7'&/?S\+iicodB-<4J``0W;YeO +@sn@o`-6Y:g#Jl(jIBIV"sfCdJA>r!GjDehZq.V7R$p+]A$gIB@2Ap\ReU9Fhs5T/a3h-JZrJ +9f^2&7$Lp1F[7`mVf\^:Y/lHW*r=m&e`EOSTPQ2&'pFGf@V-[9!XhT)EYK$=4J#`XMq/k0rR +T%4HN`OuuJ")X30pB[59):dlf97<*f\eKcQC[p4_a>TQZ1K-m5&V4j_^ZmQAk(dW\*c2ej"N +t[XQdI7Op_^A;@Cm!^]AolY.2CL=_#:)=:FQ6HepaE-?H#2->kFHp":gVP!_C2=DCocP#8[*n +ei\BMp[<;f,p!;-']A]ASXQ+U>#,M>fGs5hX/O$ON=YlpG5:@2FQgBa7E+`aoSCF.,f!IrE*el +,s=HJ%&1GaWpQ%^W]A9,'6eLmIjag+0Kg1Kj++XY7LiRnO;MrbG6)W)4Kh0G`/NX>/VmBH"Xr +g#O,DeSOrn7S;!6.Mg(akqIJ\reX<>!U*G$udm(Gu5Pa$KO%Dl5aO)CAc9t2;2OF4sR@ToI8 +mh3?[3u!<=]AbcOdWZ\A"`j?tYcs=bD05a%"WB9aitP'b69$qan<0XC(l\U0CS&ItP?R3!MFa +oU&(-6B1/FV#IFrN[D""&mWX+%PPQNto_S.Gk.1.=MH=]ATFEL(!9TcFV.dq*I"V!l_THQUM> +NX-GbF)PHs5!!,%X`W@)ZnFFGI1pmaGThcUi_aV9_V2ecR=bA1eM<3,(+5?5grhV.`l:Jd`+ +-DRHtR)io-fW$c]A<$u97XD+I:BB2/mJU>a7&@+SoWT+B=TD+;d;(IYUcu$k7Lhl9Q=WZ*&^. +S%\J5IWue#8)DQqC`ET(=.gafhDB='7XO96EoqiBVi9/E$G)q#I0ha4M2X^!5G;>(G0?A_b' +EJe-1YJ++fJin&JjredY)HN]ACl^m7Qk@f8@?'N6M"ABa+#LB`ir%15&la>R>n?D_]A=G3*'63 +cOc3A(eT>PW%!.%Inj-J6:Bl#-UX,uW.a)]A!,1N`&*`$hbBGUEBXpb_stYC"U_n&_NEH*tj' +T&h7dcCoB/YIL8\:[;3u?1h'V@:Pm']AZT.YqUGe]A7_FYTf"H)H!%1k&Ln]AnXnLA3`+7RlN +"n]AR8bN#)l<<%Mb>h;)P*g5Sl[aai0QSpgJGi&GR]A('@Sqq:/lg4,`Eki.)/lOs005+!-2UA_,A5_B[?Af6lfFU%g*(EcSHu9iY +3*qe9M5ijZk,j!gF5k78t.%r%UuHWK=njY]A'b.1it:Nd.lo?/G-HTC/9R]A3Mc!;@eP>4L!ZPW&W#I4e\]A#Z>0B6nU]A +9-hL:8$GnV=eMTIFJjNbYB5LqH-_9:!'<]AKFE'3E,IeLs9T&_;@fSnMoO_Bk-4p0.V$?63+]A +/;U#Uo$2JsP5[p0l#6tGAD>C)AS#cJs+h*5Z_+gRYKF&31J#'j7*QQJiWto\b1+X4-1jU>of +QM,Yge)WU@?0a;!UoR-5m.5i/ROFM_j9rfCJ1iBgG=h$R+X4a/pP[[n0UD7bsoekIA2umd@( +aUF>rh62@o`:!VpfUU7SC)GiO^4q;g0nl@is-I_r\/'GX*BWL"`=-90b$[08HT+_k@$:;:FN +M=5^0aS%Ts>1F]A^-ZBS`bSM'3UII5JpOFr/)^U/??[g3X+HRKAAW.aA@ +P;@]A!J_agJRKAer+99C7nO;99MCPp;;!VK*`LLl3B4S:Z[.Bm>KJVSS=H(cq:kGc>UEE6#cS +A3cq-*k"nStHJU6L@[T>D-M'nIDEV0_:5\Wo?r+/Mk,d[?_TQhR/UfE[a4%ds_CgnQ]A]A2K8( +SEm?T?>=![c,O=4Hjp9o+%:.rj+Q@f&(hFTZ%MF2OJe,flI1=XElsA-IkqAR$G+\10&aP\Mp +cP*Y4Et_`Cta9O]A-^Q7RKE$T\3s%4c)0EY99u5QaZ[KALJ!8qD*1BG)]Ap:WV1M,4DE +AO\Uq")/.j[ljHqEaa[Ui:"U(fq4nbpNe-P'o:D5Tl?FIaZ5ML9hTBWfp#(1V'ij,rG+47_8 +!d5\Da>5_bljo0T<8pBqjgH1IIYO\Se4)S5_>L313Ujh9Z*c"UjT5J[[bFY&P=5H&rPKkH]A& +1?9JOn_Jp]A6D$]ACe1VBY7KHCiA$firhCCO8)$Z/Xs3i;LNP]A".$Qf?LZ#WqRF4n+:>9,l?b>#YKj09U'Ek!YWXbYTb9q`dg+/DP#PP&HrCc4oaiFN09[V`ATn?a +*U>p3=D1L?+AO +YA;PaKl<@RpM^3q."SC;5(q5D_\Dm7k\-nPEU?+lBdm5_:8(sO1W;>TCK^dL3:`D=.1=60qe +`cloOQZ:KCTkdZe%_6(nc!%D&N-T)t5!`S7jb#^J'=$=NdR"BEO925NPOD[P>kSg`$D4g98J&(K_n,#;pH(KB/3B +&DIqQ9:W4lW)n6\#0SfC.R5X^Jh)iREY29>O@h78(`*MtKs^r;O\/=$/p;8pcl'qWZ,D#LAG +fc;hBY,%b9*HN,7/*@l:gZEds=k%NZK53^r`_2LMKCK_3kH"i#*,%G-a?L<[QMR`01f\3Kd7 +79O/o=pr@Iita9LI`>Z^Vg'uU9QnSd:Mtl>kA3HVsnGqPEHBoLlY4+`C34@-3@bi0)OqKl+9 +Eq3RRJRJFI(?/Ps@N$r\mIm'+TQQ&62&Y$UP7gV"mb +Z2m,&]AY$?P5k=^7>t`E%E*#%@(X4Jregd58,)rWUB>ZT\.NQJ^dA]AlH"77.-2P85UUA'U=_j +tH*B164A=lbek@!ht+j-ufF>Nlb))B'O6%f6.]AI"X0s!7J@htftL>f_cC5k+arAKUIjWd%ag62Eb#4?DX$]AmS(-B`S/qiZ +,qk)MBo$;KNkL)d2NSpQ""U%2h&j;f2Gc1H+Tl7!6:+)m(*=/Ug^SQnEQoW*8:EEG6; +mgHEASCjp"1@9`KJGZ(UTRWh*`1bWEH9fHm8PJFg9HB[D$-g"m"Ot.OrNlu@UNcD&pK)TY2b +JGQStS^>*,H+_%k8P;)VS7V=5i)\B;Mf%WAJ'H/6gYsUj>$^61gk:5X8."mRF&4RWOf-/p)_ +Z<Pc`/[ObK:(c^!]Aa@K9?c'9AOde_SLomohMi#Fnr3Gh:Ndj^hp(4)4$0"V/^#4DU]AjjqSmW*Au#-A2j5$rP^g#VaIn`b/\!1b4u +VlN4!Uid]AiV^+=V9W6"[a*O!W,WF=TORF*Y(Hd5$P@u62` +"2K&ZE$@TZYJ*B]A?GqDP"dr9.3COKZQqq=b?'> +@grS[Afu*P#>PEce\e)2cJ3;bP=qF^F!./D*u'cbFF\roV(saG:pC[04!s?N%%LJUBNWoMe" +FM_Y5>@g:L?`_uJWg*4=m-543PpBa9rA!N/hm'!\8()OXQ'!"*'=FpcHdk3'u8#Kh.HC/s!p(,*9pJHc+%:1,0k`c: +[RO.MpaE#nC2U[jQ40T1]A\"Q#Jp5M%E_k>s*B!;3$p> +bY0n!4IJ6\[la17]A'^+mtQTq)PVdR\j`%NVl/AtbHgqL0O#Sn@J3b+3WnM&C@JY?,lI>Y#2R +2UD`]Aa>I,"--#I9=H]AfL->\tU98;X[#)#Y9G;0;+5-XELPP&!"o#6Q-jmD2-4`.BPb&cJGW6 +Q0Cm;[I$AI29`Er+pP97*3G7"dJdS6=s18aalZN^sQ'8+hk_TG(r +8M1CLVhVT.g"d%B/j9b?cu3O"n/.f_ +=jl=-(c9?Z5lU/koE[&#(H0\73c%,K_!F_K'\Pc*haj:UD>#EF#>N6*ELG1Z&N,b]A^DJ/Za6NI0o +p&@*oZ#__YKfmbSdaRE58r6Ub,> +5C>sr_Y"h$OIU-/Wq*mS8dQ0A)8MF@91)ta_H7P>$]A +?+ljCSR=Nljel$UGlnJ:=-N9[t^jG#I9E3_BfRB5>D0!1L:JMC4F]APoiE!dr*!1'p5Mk +=)%]AdnVaesfKc7o.fSC,Hb7<$6`Vaueb5D1g1>t2>QLV&fT1QrH]A8W-?0.S!K!-"<4<`N/m8l>9u?OnV)/ZHB'o%R]AZa@>`MK(QlP"iHu1WFuI/DQo<$#BOr7r6BE6 +52t/U)9l86(AOI!!*jrQ.+uX)C-Y-fE&\.8:r0gJS%b&.nN%o_6^WK6Ob8^d__Qa$"i-I8!s +&MJ$3hlm//am:-E51.cNAn=TP[CtP+gE#V0d.[;njPlCJJRC7@)T(g\cCPXpJKF&B>di4P.p +E-G`ke^aeI6@Nr%4<3aL+f+n:;6_\O?J36K1D*Zq7?7HBAkB&8Z-NnDZeE,oPFSb+\P+La_7 +X\bk85p+>6fFT!Q+`!uRV!]AdXgYdP>t2#(ak5QlED8n2%L'(3Re"*SQ'@PN*DQ\5[&=!e=ZM +/Umknm/+oD**!B@`5).72sIQ%X2,$C=i#(Nbk$Z@-gpY``V$h6dT`Z-(I8kjkT0+XZGW)i6o +AlsnGMOoDTDI+1uV%EVo&e.p21R:34/sOr5OeTiLXS30$TV/^@>W9Z&Dt7erALt":O^sN.h$ +]AniIu>YD3mO(@>iCH>b(_g6A)(6*:AF70E>*2E#F5L2@>87oDW\(Ap-3ZJ3b&/T7 +=m")%&@C?)m9Yg@F",6GO;\!G[B#nDG9oRGXJH2r]A"bM]AWbc%840f52R.'KB`)<'7,fi*@E54^rKgk!f +S!;\!flPk1sOlh8A/HSWu'EH//dN*(g?$orc+K-\1\8&hk\gW@`Y$%kE_p?2N*a,QUBbLRA. +Qg\j1#5lEf+ee+[O[9$(b$H-)m/MM(`SCmd7NN9EDefZ\h[7l>)2?%Mkfqj4P`'eV:!iQIW: +pX_ka%k)FS+U/lgH@/t%uEYTm?[d."7UID.[3icX/GqACVa:DQs9&0/a-LU3b +h9!rRF+$.JKD\\_GGjH:pJX#3Nm;fiPTrPa8n7o6S\ipI;>JJfXj"9)"iDQ)Hup?fHH?+'2r +Mqui"iNo/M'"'PP24YbX"oQ(b]A6n]A+L[4S,&cmH"hH[jIp0.jV\Bao?+?M@54"7;&0KkX,J` +X_>[^Pn]A:hK2S'Am/5nplQiKt^4(q9CtuM)kJn`i^9*%NdZl6QUFtmJ6GKp'S.^i3E5hI-nm +B-'e<]ALDB;d;.d`&O#YZVRKj77IY+XH<\gM'5B:a`JS$74$e&O!C7]A2$N_\RCs7E==$d9"[D +Lk?.,]A\r5'Ps:89Q#J@R%/gW4b58PI-l'k?Wrc_ROecm#QhM"9&+Os[NXKr"&c^_2a0l2&/, +^5B4jEi_-Q.G"_Ep=TtBeg-tA(H\EXh-q4kjTH;36R87W^rf>H +IMu.nj6-Nf:JXDp)c_QF3?0$mO7/*7G$`\DQV<9sOkuh1"Idqhf^-dIaBTp8VW1p;XKK"!k;EICL&]AVDcG9'oa#qDs+5EnKd^Uu>-u2f!kB2`@fl,Cb +@>7d_O+N=F`(o;K>lHXnr`<*EfLfP@Z#F1@_OMbb9QZ35Pl(u:u2$AVNBbs+p,+\,;L1tp8_ +k=r/RV;6uHo1S*qC=iP\leRJqf40segW7KoOQ:DS_J'8(i9`Di3XKO\S9g9rW&eg< +b+1=]A9HcFT>1'c(\k.:5db3R7JF.jq(Etbo7MFpLB2=IeEFQ_e1k:2mK',5,/le?_:q/DV[J +BQDP&o&'[q'=`!Q/=_UYFG)kFh;bY/o=[`2o883qV";W>743K,tF%Ee5o< +#',q#O(c-(EOhLct#")=CrO>R1Cj/"KUhD5.-b[VTVtonGi#\=O4*h\liUgqW^cG&.&=n-Yu?jG2 +BtV%\LmcC3`U=+af?@4S6h=SL`.%co4T:\P.&jZY[RRp:NmgXci27l[]AJ\SFl=r`9j4OKa"^ +1Q*?e5@WRs&s4"IXVK,[QZX6I\2Jt/f(H.]A^SSn*">\W7RI,d<^=7hR!R+He(n(;j&bCc2Po +8M-R8,3[sJ@g1;##)P81^Sm3fVO.+JDUG'r(4TffAu7Bf.aP+K@$Sud6Dl5m-:P.YPTijP^ +r>`4!Me[DSa@#4[c2mE?PL?rn;3k/JI.\nKC7B3A'jeQd#tEhfuR5"1+[$%FFM1%d'K#NCJu +sa;UG6AK+sGH?Yd)J_mAuR[VC!HWg^P)@oMYI(V6tSIl0Nqa5ci>4_=:X+^i`jo)&`WF94IP +@E\>rdo-mfpc`Ck*DK491JZpU?NuIWeF)OMM`((VD`,ML]AR>DeITj$D%7B\&)2XlKs(J*P%/ +/EU]A)@C]A\D2q!?sWTE6[gJ`^]A9I+n_WJmEK]A4VaO:>Uc/4.lVn=Zk.GpED!/ijlO9S`r5++) +ap`?O`8%1Gg"5`';c-Z(gp4e#kBDfWb3fk%LrChC9likI^J*(gb*_LK.AjHp\^uC9^#.iJYm +UItUr*'a5km"cSUeHH8VT)q?'E]AlJ;r>)PO"2N;AS%=)M=A>K\l)_s%Vu$(G#*>7.cuRNZMR +;p&<6=J[KlJ>MC>d5P#GVVW$cj"ms^I;"uu.f?1O0hK2%a7rG!`h/h6X'MOWiGq&TJFLXnS& +9_EPnMD!`7=-U!H7?Mk5h3rF)pPQ0etG-)pLLBH.I&gqhiA"@QlW$DlX"U(t@f&(I@L9G`7b.ZS'W=j7C6pT6iR8j_Q>qpAeMIdN7GD_cd,` +,ODL#lRuBSS+#+NQn/)fQ6An:UlF?SgWL +qB]AkmErV-qujgOLnDGs9IpG\5+-Zf_fp?NM+2D"Cf@#+/cti`k.3KpLFkg"Goo!6E*fM'u+lL;AE8al+^5XT0Pp7XpQ90/V(#%+u-";ab&YA1[b[k3:lV>C^b8aUj`B=ii3oCB +bE6K-`F$0%,9(?9*h.k-C7QY85KK"6kmTBKp!K:s=%oNK7f*V_4oZuh2DWGj]Ash(@FVQ+@Jn:^( +kZ%e>o2N=CN^Q[/OpD-\*4m"4?L^3R:dfnniDS@;kb'JYY6pVB9Ak,f\!cadQ +uMbrl`em/5-!>"j2\/Q1Jq-LDG=4#K6`EA?,9dDKVJJo\B8^V@%59Y#7)k?(EhZl4^7Ks6sp +UTcn-q]AYXXBPj+)toP;[Ih4G5Gd(Q_0GFX,d=]A\\6^bpIYgYb]A."!bDK*g/8PNU`Lt($=(*C +UMF%8R4\.f/;KR(_D.iO_Zf'^>=cR`8u6je=!C^?R&h+ns8)V,nBM=f#$4TPPNPdi=]ADiq/^ +;$MC),b%*9`HtVBQN_(Dfpi'd8q@g%n/a^!s!c;13rKE+6s\Y]AC8TPhN*o!L +1D`E'@!:I=jSG99Jl9ua1maQRg5Rl-2VN_).0lW$RHeXe0PXbY"/fF=J8r_[]A1d'8a^!TOUm +]A1HAu.Rf[s2!ZBXqRE.M1KD,qFEBQf5r:\*;a@nFo:'*mZ__0:S/G(0a>l4E5G.DlTb@=li^ ++i2kjlmM+.pecCm53UNCobjhh(afTsT`5LIkP:D9;Kb[:W?]ALY;&,"0Tr&TKlK=#B9fLLo%q +--lqT[,W7s2FtH?6i>]AXNY4cd=ejgk6r(aa\L8qKQ%([q"S%aaKM9'uZ/mopC>hI"& +O=\Y&FiXg7NTf_\:^b/VKTYhTCRcfg%^'rd4YX:I)^"aK!5R,Fm5$ +Eb5NWOS9!7S&BPkIf@M:;IsZ=Ndg=+/[#R.?*0^=EZ[LUlN&2e=?J(aDqq,&Fo(^Q@?dV_0i +_.ZW.q*$C(`j'8(Z8bf`A-mXZ9NdgmjpRlC22bq/k9oaM*.??#um>]An;$o51W\H&kr.'LQ$2 +6d*$Ls$3!]AW.,BhaW>lQ9PX4b&fTgh7]A9E0[JkT9TFHeVM&ocq%Pb!ZB"D>#cN/CY>\ +3*58CL(/(6PR21uA@c/?Ac+./Z+R`><]AVMf.E5Vb]AmApE>uoNS2XHA3%9J<.=;)"ceotb8A. +5H'T=LMdrhFt"+FJe%FQRbgfV0]A?_S+l$TfS/ip]A>lcA]AU+i13\C2Wf74s=[laVf`40:IR?; +/0IeR*D>:F;`@F^EKQe%T]A^c)WZ,!\O<)B,OX-Fdtj!bsn\C;GTN*ZJ$:%YZ`^AJ-gj8Lu]AS +)%_kPo6_fYSE@1RL`#30Nkcj[ +f?I]AS;>Vu^r>*f3rQ0#*,b(!D+-!*B$JJ+'V6gr1n&[?c]A@F'Xg_nM6g@TkD/qWo#BkV7:WV)pl&M.BFcO^$AR@b^4N_T_/c +=lTF<0BJ7\dUjU3"Srn&hU5&dc=\$!`J,Yh6+.2ZOXiHBMU6U3NoDn+N]A-,!et#>=U%WB;p@ +eM0=#bG.NYV4PY`bXF=EL@+90SgTb-?pqQ6Y=*?Qul3H(sgUe?Z%Am)lK`hXekWLFt,Z>2G_ +'\i?$&M9h0e/:[`0Srd5`\DQYl5U37^jeS%?Fk`^VR/5%'81@n^>bgPuEYP40_d*Z$"&4_4<0#50KU +qr/hAN@c?bA*M%N/i)O1RiL@caS.LhqGh;$[+h;Fa\,8Q/%&T9EL]A<:1^>V,%R7]A]AAg^UR%2 +\[X#:Y*d7R]A-Y1isRcA]AMhQ,B>W5H9bA?Y.!h;-J=>R(K= +Qt#\Yf\q=Daje>HZ*^E]AUaTMmmGgCQeS:GQ9FLU*MNXL["m7leV3mfNiFgo1iq#Ync-3?P>m +RMfp<:@jUFek\/]ACBjTr)lHD^#ld6_L[Kn>R0n2f5$XAF.N=-2$P +8\<(ur,f6jAO0C\YedWIe8.r2iu5XV(XXHi@Nkni3gkeb\,/ToeSU9a4R8%d5]ALRL]AV&[o\$ +V`6NU,)r+ABMVVH,oZ<7CYD\=#f`U"^_lgh9?RQKMh4UD51h_L+8thB.HF>%p1rJ4BGhBb6$ +TV&EM3:Brg:s;$[[iABgpWW!R>=IB;ZW[RnLWeh$Oqc#sB6QWW+N1V/1f<`=FK&>4:[]A1LP2 +@H5@F+nI>lV[aUcL.8^\]A^\XeRf8jNP$6T7dh"@]A6b>Y*W+fY4=)(V]As%bk$Q27^G".h=534 +DTD=3RD)>Tl*9-Et8g+iX9>0PX<]A;AM,T77je67rEE"h3<+hX4p>0j]AIfW5G4=!"n[^Pokm= +H2MiFB2<=C+9-iWk;m,lu+m$:nG +Q/rbA#Hm'iH9DcLD.tOIqgOc!A;5V9nE[^G^)!?&R_"6\2^:nS)$%I:]Ab +`8WY*780dW1#s0Jsg2n,L<10$-;]AOjrGN2[;K(mUgO0Gu#aFE^UL@#Qt4/s2KYR$JYY*Ic'MR0h*QVnq!q?,;q\H]AN"2l-!NGN4Y*S:2qicgIHj +TGCB.&i*LORngr#q-UTfi;%-(JP"?DF"SROUbI/(:`Tse"om8iTNokZ>fU"HI,hH%Z="Pqcj +3Na3Ko#;1$3DH*(+ZlZ/Eu3O-`QT>]A%p0'o,+Z'&dBqAYdk^)BZ-`,-j("f"E%d)mk-&0,h6 +=Q5):QWu)%S^.^0qgIR>LK>pkL8HE\"L:1O0.0+:GBW_#CKACi1-AI6(FV52G]AX/-#n[VhSe +!7]A;uGhr<4\C4;e!6q_8smSV7NIJ+V$`./uiTZA,V@tI=EaC0b!=!C]AH-9.GKCGY(a]A:3$WE +H`DI-uPF'&_=(9@"RZ`@:?^7PdPk$t' +iS$k;4`'EYb'?IU><0:PDAp9@Ychj(_\!G?/2]AhMPM@1R`Qa7T"j+MB^'GP#"4r>42-;uA3& +ZG*"u?;j#=#Hp?F);3fMDPtZ19?!eX_t@a#[F&P^atb(d^t&&Lq!2fA#12XGc6K"Q3IAJU]AN +\/`CZgI)W/ernmuh#V+6aLX9b[N)*6NWP1(Ub$Qr"`9qCerm./<0m#b+&R2B,IEIWuqCm]Aqd +"YG?NmeC,_uN>W0\9h7s*QlW)pqAKSu*\*<8S"0kYhpFfohqp*uT<1ET.WM0jtUAImfB'sYff64/7qOm`nX0VYS,^SSt +/XM\%-rq4IE20\U_k!Z.&t7rR]A;]A@gJRWSPnRR40-aXK3Z99^JUK*(TEoC*?qF,6:+"q7E%+aa'YXI'oE/f\3A[!Q_4B5flP63EpEZ=nHbo#DmM@JX^uEZm1^p +Nfb-UXUS\tjL=p'@`]AR+,MaOU/[!<)MMpO17=Rt^go.C#\+-oMPsDgGXbBs@u^Y)5'7H_NPH +B35*0$chhS)r?p*7KWuC'JIIY$D/=&X;_gob:DkHoH$PqdmM"X"WY3DfA\CpbBT +G8;4V`6o%'rQ1*^!4n89"5CFc$GRiZD#d:ZrsQ(T$uf:FmD+heWHLI-Y'HV-oqr\KBFtQCu` +D41i,Q\r@X'r$3Au-%H.WdI4`".V$<+n$AEsh\2MDOhQ/A8"9\[[(WJ/4Xd^mdq?O1A\e'c8992RC!FZ;#34g:ih@@@CA0NLB5t:jLR#NrT +2GeFZ;pcme1Dcubkifus7;<_'6qa8/7C +j;>%miTp_4R=Jf.6C/dL(J2KV2.l)IQ;.Bc.SeP*H[-8@YM9MJ=GAR$3,[3FgcM.=a1MdBbd +2m6!-7h'/#+3AHpHuE]A.pg^lUFG=s%$ObU$:3i690oj8\-PM/g75I*mS!a``I+>9==\Jp`Xj +K2J0'\>1-[fT\8ook.Bsef3VU&U@b>#!^CdlUMXjQMf/M3`K(UN?RqQ#(6%bD2a3mg%?3;QkbAVB9$W#@R(m/*(]A/u6p/)?Uo/Z#7oKCN\>n8)cmuj@);,Ash7)^k$`a.]AoRmbDGj':*da[``1qJ0_!E=GKoNqQ*N3MebDrA9PPU4pYro;$0ZPf*.piT ++u8CN0?)!M&'-^XHd0GiEc5TY9Y5:@m4\^d)r%e3 +:@uG1r3d:iI,*3>5OYmN(m02E;MDs1>1M81iBgs?QC@tN)Us_e5<;gPA?YU0Z5j7T.kKJW^a +k/i,3us%2I=h3FG"@]AcF/1ugTAutZGaA:O*m4q]A.6Q/^u=%nPC/t^cq-c)_FI\:]AiXAZQGkJ +:^-&1O4Sc[a'nJLi.37J7]A\+*KkN'i6q+Q^YE27DEdZg9BW@H?CAjKK]A.=kQBUEk6BB@8_`F +pSg),3hf3+os/)@q0:A5AG+TDu0*]AQ\KY0_%X6$K)>0ZV\R.Pp!K%krdCQQ_fKM]A;k&81)1H +prV)]A?pRe'VG]A#ZNb3D2;T,%b9:h]AM&3Kn#j%kFO4>(Dn0h$Jk5T$#K<0GY-,e>`C!7lLAj"US0&2Nk;?Ut2308nosQUB +]Aq\$7P'+:u*H$ad!KEZ.*-*6EpWJ\!l#oGci$5kWB$:XJ_MI"(c"HhKpbU&G7RY-Ye6ihB\QqEl2Z@?C?ngSU&>Kdqm5CUr3HX[<.c4.8 +3"ig&'6F5,&L#qG6?Rr#6tGoQq+Ut#7Dk_I6d2?YmNp,o^qcli^B]Adf;#BBXQ@O"XTmmGbg# +<8%lmJZphMLgG<(V02&jQ2rZOIEIe)P+P`Tu;"G!EL$"@I +Won^%+L6"=aI)/*>BaOR\O(SpW3!*MBUo;($;!/:Ph+]A>PrV\]AFW0q*0q2JHr@\VWCmqVb4< +VT(;GU6rbQ*&Te8+2i!qL-oYmrUPh";b&=`9nkH1bj(#Tm]A@*oCB$9]ACiV_9QqD0`:l2eE?Y +dr=:8Z&H=lJ]A@W$Yd[7=ES&,eUL7L_@MNOf"1h_`p[2)`j1lJNWLBkE>-(GX$Rn_Q#P&;s/m,D`:N!/:D[D^KbI]A4\Noq?N`[r0QiVZ<@pj7P% +2hW.T]Ai#,bc>EXF9?Y\DtGZ03O4NQSaiOHON%mVUkre]A"^VL,KoWhebt5Ok\TVjJUmeu?[QV +AW8p^Ya4(Tlk-K(8LVVL%g-?t.8G+2(*VDB*pQth[*jM57/iUPgXo?Gfb"b-FH[I?9@TiQ/Q +nGn@7PGY3(NEYS*N""[Yi+(?P*gO%k_OpJn*qZUl@t[sY8AuAXBF<@jWT04?YrGC3+L +-WYSia=D`LfYr%b;c0LD9=f3V09'G>H:UFoI.SpZ8YGSfe]AU59SF3h+9%Rg/[iCk8%3nSi0D*+&A+@*]A +=UmlgT!Tfa`/qg:rmi)nCS9([B/e0@'=VG0RP'$dm:Y,RDRdRWpUu/)P+`7?AGr]A$H6?149o +T1=c2<%`sGe[dVFR1p@ce5cFW&BHGEaFGs1>#OHSV_bsHs$U)r!;9;+oW]AQcroRelpGL(?6m)L9-bu,% +q7H2"S:e.=%YR;;!#"2`F'us1D$>mm`jOQ$-Tt[.VqfWm,8K#qLF;cC6m6'j@ujkGJ)nbdmn +(I:$X``I5FVHB@Z)8U0XD_LAa-.g[JJ6I7$lae',#6g?V=4D*'0KS)5Jg\?KY!n:b?/q:`A1 +0'GH>j1G2QW7_c?1WQW@Q_UtOIIY7]AQPYW)]ABQd^.'4`R%L,2qtk5@1f$U9)lD&3W&C1%h=" +3=:g!7V5uY-RLWtdu9Yq94CRB9V"4)]AJle)2KH_RcEEk9PV*pF=j.g!"Hq^8X\#OT:,Q:4Qu +rZdjG'ISpS)U1;D^Mf72.)YV,2]A#YT^nJ1Ugqkq7ns??L[ufS/3@JuL(UK=;]AX5W$F%19MWP +V-R:hu"O4j+T'GTd+l[?'2m&r``5d&8]AT0eM*rN>No%=5N-(ePLncY21bVd;jTuPO&Ki!_S8 +?p]AA\MPN[PfEY,upq,rk=B]A7nY_.N\EuOFd_rFImT4ebl8_ubNn +E#Hi&!R:3@3*m?TYo0.-[5<#\u%Dh`a\Dud%AHALDIMJdBH.$E.$U9t2i^#i>J^Ve0E_#geR +S6oI2.gY^Ve/7]A%ZlD)/n'.^\cH!RQ2YOIrG:p@()DA79EN"5,f+&B&e@#,'H7l)e +h1!Iqf]AV*F&S!I?EVN./8/sbhnOX0Fn9%oIEZgbVWm[s?65]AMcUr-V)jI@5A7,\7]AqE[;#(o +ZZ91p[&9f!k5T8-\G$/X0JGSNJ%cusC%K0XXWQ!prjcG6:qm%Tuu!KPKp3<>i^6$:m=;c9r- +2ChS`ctFeQN2?c_=rTmKDHd"(ZfMJ)_a6\CLVZe=YH' +k-bCHhIeiPGq&?Fj/s)\O;3hjGr,t#*k0`?=`l;Fj[PU7i;6Dcb&nR(4[%!Oh*XCEeg1s+iI +e9se3,cMUm'_:dGh@]A47@o*Zd]AG;`R'q?>%Oi/=\?@#7pIQi_12NUC`UBE'IaR^CW*FAHF5XRA/FIfnrF[bZ6-J55VG`1&aB'>(AcS2E!Gor?!3j=+H +-<[jN/Ih0aE_>07H97Nuu.!d:I'SUmqBn$W6XGkcd;f3P49g[$Ef3R@[Y5cC`5eiX+qS53 +(IZCUl/PIha9b\hAr>E-jL48+#\&,+\R),qLV6oAa'4Ld-'T_R/chm,Lu>dZD?BlXUEk_2*P +;1/%DU-MX,6P4dK<-`qP8i_79IEQ=Yr$aNr2a\rWB"3M2E^+\Vh3Ci!R8hfrJL>tc0nP +p'!/K\$5:cd[U)\W:KDGWHbUUOp*sE%d,2R8iI)asP`=AV\gAmR3dS=E3OQ*`B%",uS2/FT8!@H_fjNr*gQc;cCEjN#rAV$!=KE%tO>27QhR>n_ +#i".ieGo%hd`J=D%[p+UL#'CiQqsYd#5a)HN[%P*>>>n&LWT^t8(E'eBHQkmjCER_RZRfN]A, +L>#6fL6kWABH-W.(P%-JsX^?F^\+p97GjX08[b,.63TolN!-5[$KgosV.FUScS(O=2@$gs#c +@J!/sM2H6Al^PC@+@1s;e=pa5*F17J@+bA$s-Xl1J)UJu+r_K,0\*JFiljnF^fl:RSq5tbl5K0+l2`KdjmA3>p^Y%\hk(sRGl?B4s]Aml^4^]A2D.e<@os)_ASY@/3DIC,EOH +.4NB&,7\CBX(Bcg#XE@\KB)\-0NGM,Q^@^JBj`$[6!7@D,rG+*meQ).OfI53_%/B%ppnP[a2 +m1<4auGb)JMV!ajiNejU-;Bb6Ab1-RZe$)hAXP(=Bti>Wa5o^#:7ARVO[X#l_aZ[QrLub#MI +HL6ejfdXJ=H@]A["?QL`nrbOl1Rm#IilAdj>D;Z/>9-tmg0o?_bboQ]AF1&mc"NbqdN`,k[k7+ +deq'7A%sq!bDu^?!Z9G^o%P]A8Ik;ec5d95IY&h?F#75J7q@Z%BCfA)np9S0o5r/Mr,c.ccaU +\>>H0\E=rel-eN(RSjHV8-HcY?@b/ke5CH4TQ3lqu(/R!$R58@i,YYmK7cLL+k:H_?T3l:H% +]AP`oT4IKq!TD7:Ba!b",X\^scK.$RB0C5pG_6(/dcS0ffqP>1b]A,ZVQ)6e`qm<:>L]AE#AM]A4 +-6J]A[B%Q-;aZ(PLEO^#aQXY42Sq4hs^tH_#F<(PgqOK&CtOKb(6%^U8.]AcJZTLlY;B15TQXF +/9-P\cW,$6aZ$ne.^T=9cE_<>"#3s5>E!#32.2ibq!Q[@3YOpJ?Rb$i.^jZ$Xjbcd8n0pV5-`;7\5:g!]A,$jZqBSIB*) +q>!=r52/XgDJK)U[&1JNkP:3[55s[0f\"iL\V13f?+Vo*D=l<%io6]AW"$/J:pL:ERf:Hes:X +AYDj\<-,tG2c;'1/UE-B5hc_eXc?1iua*FD%QRaG +"#7b*Sr:^O4lL*m"34RZW1M>FEe8a]Ag51L+1BqHAk!K3o:rU`^`hc_m9-\@E?K4l3G8:p4(I +5$#M-iE06C1PZe+m"ogLW!GbMHr@4bnYS$b1)1W+24\&6IL&\3:T-;(?V%p2$$Y91CU-)9MA +,:Oq*Xc%g*R9(+e@RXEOCN1;;d67o*=_*V&+_m#9pS9tT['(JpdE[ED%8[ioX/k;Rso4i\\! +D&I`tcrZ$1.7.gFE)*-)G'eT)^X?ifi-l*.'%I<.^@H4sX[9s$D"\7p57g:mY@FM&5PWK>;)fP)cAegPOr5lYF +W3b+>kMt>Ib%U[-?#+mm<;kRG\#tXd(^kg]A6ge!Vo8QB[JHO>cYcAa[V-BmifTF^uD9$D"1n ++UsHF<#"iYr]A2sTCi6.lp?nk8Z&;@(,-YKEH,t_U,7TN=;/lk>eL*N6p7q40q#9jVIUi'k3) +k%f0`R->dfcXT2PR:UKLk(h?Tq8ND=]A\'a_H3hdrss^Lb/&@(JDS"Zq+&'39W_9nPp\_S7B- +-d`YFoRmgA@_=r(87;/'WV9&u\:,nRp$8gS-ni-XFM#n\N2p!5N(YSS9t4OdKQ8.)F%6\!F, +'$<8q9KeHF58#IR*,Bha-o&I0fNXeA)GB^C;- +smt!`c",>_ZHZHfm8PSWl^bjd0=dPkL[L+OZBW_]Alh.R=G]AX,"^,Q_cF4!4qu**mX=0'0?Tj +_9#>C0%@sSpVj#*MoN>g["gOm7':s^'i_m$KTF8Z,fmQ5*)"WJ@T(rstr,U&:@'8eNg>gRXH +!drW%YNhR]A$F$f<&,QINK;*kS[h8-!n9Bj2p]Au7`eg;'X[d2:sBn[IG^$nh-1Ulr&fC!g/!1 +dV?Im$(*(+P!*VV;_p<%U`TKVi!$?sGX@HZrlr@&H=B:uAIroO68n]Au`/jF8;2H!t1V47`hl +lD#/Rg3DALQNIaquo4+1EB9-!6Gckk5_YX.JXH@C7XVetg$tGOZ(cEk)ppsSr1]Ad!XPo`9]AK +m554^S",#NA6l76.E#?J"-Hh9$SBb\PI:"@caDemu%&AoXb66 +QV9mZY"[Y5P&%q%37SRnu09bKj-V3bq5thA:di+7QoScg#/N#@MiPkfg^>"5=`=`0)1ZGD`s +"i4LOs@BdXeGUtjlm$33L&^5^^s4rgO$P(2M7WTsl.dHhb4JZeP!7LA>,E +P8bddl-fI1jsLG<8I#ZsWMPY.9!K1Le@WAG#UM:;V58.GpR0[eb_+u/ +]Au9YGYa^\.0\/CqE,S?qr;cIljf&Vs>&Lfj,9bWWbq3JK-nY/27X*?7.@MC'?rX^P6:p^#TM +rec/2W;=LWm!TW(s#;;F]AbC,0bhcI[A'n,_!raFdh+$J0Bi#3,FqEnJ=SFf($%XpcjIk3E/P +;j\D*#mIBS/6+>7]AViM?(FFoPbnVfAUV)=kKh;.h&jVfN;Umh1 +c.B'U8II?M5%X]A^*BH-Yar9Na4S0pXQWLi7-*O`c6I5cJcJ$l+L?K[dS'r5V$Dca\t7K)T@r +=.i0cPDo)#!p[6@UX7rV]A)Pas1NdU!mthbI:V+<JR=C#k"K:S/r/* +8mBC$'tm\7RT"2Pb:l`Hk*rX0Z?o[8[t6^<23P6?:d_t2rr-'=Vh=uJg<.Q$NR1lfS +XOOI4t2Ilh;nNU_OK+RW9c#WOTA"_B]AH/@k=EWU"iml+2pEl +.=rEiFSm4]A'3IG(_CkHlAm$I4qr;p;es$48-s^Se8"qcl%;B_c.$aS`GXH":MRTq/:LVF=?, +pjn!I.l4I!T,u#F`&"c37\o-8MBYp,<>93Zp;IUhrXu:W.(l))=Of=aW7sNqUI(F5g(M'/P& +lHLfts_f_gOo.jXC6K)\7mjS=XqXK5dO2&e50h!O+H;/mqq]AR3 +63Q,kL.Hh\rN._5Wt:;/[$1GUpL35Z@JT))DninYDO"X("n9^G%S"P:t:f<[T.5q?n&]AS$h* +(>Mp\hmrKb`HJis^eu14&&WNVU]Ap,JS^frHC/VVND@R+B+*NAhH!s'f;St#$]Ai@ +FpnP.h,V1tfD.`8Tb&:8(/oo++A4Uc''5b@>f0f1tl*kmhFu2"^'SG<=ZL.,*lBMgB:W5S?Cp/NcW7p$ocJ"Rr,g8p+R3'V +SYHLU6kb?Ef,$Q_p,2V]AsCQ/:rS$f>"`cp";OKsPfdS^*tc99cX[k$l$SF\$Q-"UpJf?gq'AD1 +,8aF78O,IC9sFEDWUT4a/q*6eX@Z?:9i@9AO%s!!p'4!1EYWN_k5n)$@Sj'l?MM]Ab[9H+ZW! +76&+*L07,ZcpY&`@M`ln9saSuS&k6@7#%]A+ +s:t`_DFaukPDi#,']A;12b?#E;.90WV-aN:Ne4/J:1meV(0N?#u*<_1*L?XibC2%M,sL(]APZl!7,Gk#B??Z%YpaIM7q7G%rWE16t +fk#V]AIXT,O_seW&l_J<$TUH1#2/upYk0==#Rqa6A/Y(7Y_8YZ[?W9 +0tSf+V5?`9>F>Jp?,SQArAN[[(@lWqY=oTtMumpfB2-(GB-q\1>25+gUf@%GdeL'8DhnLQ7n6mnf_Gh,Uf2Q*1gF>BH'p,P< +p4;EEa(DM&UZ-AZUTQcWdng4,5+X\6Sq1$,jLH":F&eH5Wqr./]AVjq#0dYit> +R@Tmu#fN?O)AJJU)'(LK--_g9BtD)[(SsVK,OVb((93/Nfr+Hnortl,5u7+,4YoGp)@;e$qW +[4<,_G+^6GV`c,aD-TI)q*Zs5DS^(DO%]ArlN,.-]AOl.Io4/nk"Pf$$Y3UcoKtSH1sn^KJf=+ +!\CR!QLZVV\`MKC;.tDs!cudan2paV^"cfi2I5p7C*d!`#L%M)>P6tcF6g#!S6e:>%`2++of +,]A6dHkM.$*FT,Z'(NtU./f+G=6FIQd,Qe@j_hss=1t!R1HAP-mZE70 +9S0d%Us6cN]As&ZneJR*ai8dC^A8VW+.D$lC%8nF+<0^:s=D,D+A>/+J`G*\6V-2NJs;OEL8L +n^kQ'PbfF+R:ab*N.(Qp8HVGRNg=$O>W%#QP$sJCEPb#a0M\2DSP2dajWk<"mcs(H\Y/ol2d +0Kk<`m)N29Fn!E&?_=.Ngj`kM:mbPkF'%*n^ii#bMSuicb8/6[tiF`n"sTnK+5I:2'GuCKk$ +&$hJi.AQ\5GaFP,5ad%$O)!6mf+C9=jD8NnL.HKB-3,_hm]AY>mhPIn'1""#B?O,f@A8#LfJ- +bReJ!q\VBVdibJ7n'O92h?nU'>knr_\aZ#/H=;8RJYsJ&(m^[9UFNI0p^bs8Y5H;+[.@\WnE +kTfcO(jr.QKOCgm!PW>*G\WZec@kt(B+,%`sbM/%2JCb/8nmfGN(=,2-J;5%'dH$]AdBS3C!]A +b\B(I)]AK_&lrb1>$IG.:O>g>f=%r@l#2d=_I5dUimp[gF78HX`aQcir@eN[H?_5I52eBF.q* +0<*poM.4o(3/L0He/CHO2d)quA:;O'[4=*kE!Y[cs5<39DN(=eJ%hmU%s*<%@uG@JXJd@g-U +U9G^-a:HI:a^9j<=OHP-gRDBDG3L>hU0hH-OIcBu1L*Fk.m#k@S=8^oN='EN]A)&iKjLKpAS" +pSP8%KD'h1\g4?UiPC'5MH!nfQHQUf#I_r/DNQ!W*UhmT6[P^ih#'M82dqJ8Q-Rs5l.6Yag> +%W#\eneLW2Mi/embiMSRRj,ho0+e1V8@Z`:=:m3Y"+:+Ei>%j.fE8!::BJ@Jpr,$oT&9ZEce +2tMfu2o]A!1k\?/eSSLC_Xbg1*s)f>^4JFSBPq?,$VO_9P#oUA8bX`(R92?c!;E(-Q$4+.'74 +e[HF(52UZiRfiPLbOSm.>A_p528#l*ba>SnnkEd5uN9GBVsn?1/=WLPCPZ,7`Mr0mB-"+*NT +k[NfU*D.be$_5X5"12FJ)Yg&M*9"W)%f?O]A/XEQ2[_?>-7:CU +)U,]AY/pirPI'b9!W0'h:%FGLY'#YH*r[R6Y,HC09L`@KZ>p3F8aI#Z^??5^==9fJ5;ia^Lp+J$Ni2jsIOj!a1PUld8p%c$=jRFn-7ai`b%>Y40X +Pk*^OE^nXRtsCP8IDOM=aqTKha?'i9Lor<%k@`CE>\2E?SCE,(:tkFab8]APCOML$G\PD +-,(iVlOrcd/7Lhqh5tg)m'#=RuoCsY;s0!@8?q[Z:!hDROX(2$b;2G0Y*eNUD6t\Q)nlnpi3 +fuh1k1C1^>%$;RQfh[9eFt?S@-cplg4\jDN?BYpPZQ'p%&/G&(_uH1`JQe351.@:;I(,64DV +ol@JYX>Aoq&e&.9:P,XOEWVD8@-0aeB',d!M52> +gnS+&`_M6]A$E0-\5ZQ_Ma#;L?@^I,XSF!ZoZst&g]AB\A>Z6%QYVVB?H5o\(ru;jW;`67R"Cc +kjQ#Z^?MP@B/#q`Ypk0B(Pcdn08>p7O;;YQj/ad3&<<)kP'6K'/kX1^7KPl!Gj%P$8e-=?H0 ++P\f8%0d$\Y[WQ0h,'.4ZEc2_*0CR)gc)Ef%Sh'lNWZCnmAlYK)59tS\Vng*3lRe')CCX&WH +uH.0I$lmrNUUlB(Tr7'2CDCB6K?hH_/FO":54F0AuR4Q`d&nG-IlFI]A(nR?3N'^dWV;on,O8 +K>C,@IKGV==fNj&!Pt!4,P`.jqGk,u&W%g<:&a&,Dja8ck*q3s6T(XTEoZ''hX6kiXN?UeH. +JeY:c5RbL^m[X5W"\Wj@r-9!X)i`K8,PENr%EQW +3_FC.:VaIisA2_)'Q\UIFU=MP"B*eS82Y9:2Vt&W%9p-1f?/iQEeo['LD,H44_i*'hB/U_)4 +Y=N?=[^;gVbW$N/W]AP-f91tWVM`*:[Ckj?Fn#,i#!^ZU<\'i*i +[8+E09!JW"WZhQsVSr@(Go^WabaT;`=EQrBJN=WB\6mBY\1]Ada$naMH;%pqZ*?,hU/%U0g). +4k13O*<_iF)"a.XZB_Ojj@c)r\Q[!o\,X+:ON`sJg&K2ROLrLi;l7PD^:T;oo.#(Vr:bVt!j +g$A2dunQ0`-+sM'NCi7^Se#bCUY.BRs4,?\jGjL%)F1X\Sa&]A/aa9o))Q59bVeO.p?g*-hj6 +?*Z>&;53"QLg?77Ac.JLp2BhTO66A_V+KqCQ"a4]AoinoAftnoKA9,R\l_iekcjrnm$5D86]A$ +`hPOcG]AJ95Y)W`mVLeO1mFG5+tooSU&N'_Q;UCYVG\I(Z4CMAMP),3 +?FcfnHiug"H/cHko7pF0Y*#[+1D*PhK%cF/s/E$.FgOUhSd+BSD1;22M#pQ[:#R]A8ADXJ=L#uKt@A_MM[ +0/8Tr%o=>@fs"!aA_dq.r?9GkBri!"919Q)L_OZ0?/;cL?0Yu??YnX3MJK]AsY'dmV1Mp=-Xon^mO47jV%9$K@JplKB +K:Ak%2q2Jjh3]A=TQkg0F=@`8O&H$S#r+Z_]A2WB*F%43MQann:$9V:7rKJF]A=aF&]A +S1fg3K)4ck5#UNi6S`:J`jd,Rq!1hiOqAWMjLXh%U.Gq\>Cc\P7(JMY#mS8"NW2:Bm`Z]A5cF +?c6p-XEp494C.FPYPaq+5hmW!"JQblTLI$mf8[I_e?Pgq(:s(A]A\1$P1#b<-XVP^5;2j@f^@ +j*2^.%#n,86^N@M'@e')/E4K4+*6)#D^TC6.n`_bt57<8 +A9=a[iJD`[O?Ti:t2&?"l2>[66(okPl$Ph3ImAUSkpn'?fZ:Lk)>"X?.ELDRcA#(1gIh4T(G +/)8J)b)0g#/1;p&&BELkQqWt8]AQ(UX6m/IuS"*!!(ZAD'?Ci,L&9&s(9`0&2Zo`*]A#7SJhrmjH)Dm'DJB?Q`Mnd?dHnGodq_,NQ0V'OXhIK$B!4HoiC.HC +Y,^Hj_I>a)E27!h'^*KV4bL +s(bjK6YeDofH%dc@WBnrDe'.s"#m\hnIbaIcnBn]A'EnD;a-m?=83t>jdpsqQC.g4E,ltj):Q +VMH`T>q5iaBf*lPqpj9J+]A#/;4!#rHY%`&lGS.XmfnS>7r&nF/kHX/oE:(bR6i8.!WMr!]AcCCMOks.#T>e2,da1LuER=LmB^r5 +W%hEl9U:uS!0&"qi<_Ffe6^H9]Ad2MfdZlrX+-:.(YY'B=PQ>U\8'=f>A2nrG<+ZJ=D)%(lMW +bDKnO-93_4NPq/aHd43P7Kge@t5n-t>=VcPUrZcC4,R0g#d\_RDA(UCm5CRWY`rXmD\"J%^m +CdR3]A(;@ac_"+A-/eoe"nKY"KQkX.J)o'b'C*nBZNL&,C!eWE1=P5e[b)LuJ8DQ8/"sLPUEW +:-o-Kq#42`?c!3=lglb0FBM$XCJHY;LGV?Ti:sj9*e@4Ti2-p@=Hs20/T:YF>KO->o#qS%P: +2c_^]ArlntomNtrn:&>O\5NW%q+drNH;SO##'I5EQNpt,S1 +,GPai(9Hh*Y8?JC)<$m->C&#RZ+=PXU*V=8N%qu1B+Rtp#.PksT;HV@?eV9^-EJm)U?Ug0hY +3]AiD/:L%&HsUR#R+2to\bkl67ZR1g#%0-u]A14rOJjO(I/2pbFh\5^E"SQBjoS=HiEc]A6G??9 +Q:-hJrFbK[Ru(&UVp8D)t)FOU]AlcINDJ%M]AT7@=k#(aiEH,uLb,o.Gqm[ +n8*pL:2Hd9DMpNn&E=3!g.dB+mQgbR=Po_"LK +Z&=e^T_62nJ+.0;gk^:N*&%tbm@\ub'`;Q:)i6?&L2CerQcA+UFJs2'Yh_9eQUIN(_o+;,al +u[ibkfIqP[K0Xa0d5X?Kh"D!f1X<01n/X^*a>mR\1%d0B^shVgLpR9BTtC +1t-oFa$rI/R!XEo^3J:@WeefSdI'0e:p(6H81!W5N8S@+'_DWZV!ZENPkmCi4,Co\W44XZ +:%`!5t3&LCsS!eTT.7K7edu&lLee6gAm_+JOBUJA\1'+D$[lOqgKWIJs-Dq-+DcpMk[f9fdN +@22BsMn+S*q$?]AsP7>dS@6VjmBqr97''l]AVXaV+"_*nZX$jQsG%9j+GiUpK?%CYh-h0>+t)@ +K/\Y+[SI\J[FOb)\^n(Ohq6&rf0'-N(^+Oe^T(R[ELc/B]AeiQl`u?_TMdO,bn\$"ZVKAthPq +.!FmJU@g!]A4g/iqn`hFn<"eu6grkKD77T#GQu;:d*KY'rpj7_`lDX]ALJ\T$9ULk[L^&I)`]AL +FW^U0Oh2`/kQrfIN/%9p[QKNlZD?i--;)f_`ktaST]A!L>pII]AsQ""rYikH9W.Vap +`\5qWW6FLFOtW>XPlR-6s5rVLflA@X/Ue%*q5X%/4G6W,Cc'R_2aJ&2Zaa-,2?mBg!0A(G/@ +]A3%!(4D\kXMJR3h7Yd%N;Up2i1qjP!/f/hFh%onAdW5=d;a&gQme+,Rs1R"cer.]Ap3sGJ%/H +:15H1Qd^LuBc\%(9kJ?H;(EP[f7*7s&ip+O:iC#'3W'S&nEeM'2&6X.:?'@ll3PlYTUV^5;j +0]AY(nXCB,FY:1/^YpQ48`I*Hh>BD^/+Jom8>D'LOsSu9qDW$"r@sbJ +1[hq^0#\F-*]A+/(J-tgqe^hVE=]AFA)+Ei40o4H[TqRZ,;jJ#ck8mfHM/OH';bqasC1t.AK2+ +u9X=fEFDlTbgXf>Q1lA=G-peTnpkoY4QHV2ii[7nm>Y)^KO<#j"p\G+PI,rKOPNml$V'[(k+nbZIMM.!H5FIF&'sUS0r?0:?%:GN^?WXD9a)OG\Mo4Bj#7 +*0@R[a3F0)c/QHR$:(qjVaMMPZgkn:b2m]A-.d"1=rMamlAe$NGC[D,GpfZYcDTJk+F#eTfG1Hq7"^I>:APLfmHcl.2u1QG%Z+bN) +RL%J^Yk\nj)s303,nj5]AI7+'98RlT=>ld/OjmLg#uai(($L;<YJ)K++XN(=3T +cmGaoIOtb:G-HMGTh;aY>\16k^=nkOA7(GP/a=F6(um,u6T-aEcZCYbmhEgOcNU4ITTPbetG5jQ0B4 +]At']A_/_P?R6POn0^Kll6$XYN8Tcu`Bm%QLuL5s^riKEB(cke?ALthKIn<$F>L3.G0)gBbFRs +cF/QDf-dN_^:#nI)#Js-(FfPYL-.-ldMG"'MY#5\@rl7Fj[%W#c<,2RXTFUnMK_pNq1`+*k&sQV"n5;[H.==pXT3W#d81""o$$N0o[Fnq +;#nnO2P7dc,#%I?sOIqO^e]A<6,/"M-Xu8nBlAO;GHoMN4E(5]Ae&;G-g8mQkP6G$M;X;(nP5S +B'QggMmkm_1(6``!g.baKTi.eTpH0Vg<5m\,J8P`-S#)]AECG*4=!"0V +95L/MnV)[NVWm:C0t\n+e>BRp?lu")W5N%YCMR6/*hH+F$8'po!jujQ]A2S\&mfE-mK5BeNk. +=`To6m*n`Po9"Q]AHE;H/>o/73Ar6!7EAR'+;>7q2h'#iPKXt?=jIBl[2]A/"hVX"9s;[5J,am +VD?-83f*dR:/QBla_s1K+==@cTaVd=)!9Y.WOJU2tq0F5W@oogUFA_lWmJk]AD3Y8mkP +PpTQ.!Tg.N4%nmNq_B'K@\/+2+#D;Z5R)@oQq]ARNud6pf:_N,H%J=8i]AdC`#BgX&!C[l&^Y+ +"uP2(%j3/iNL2K*)a%hrrd%jD`TNlG>>[H#pKP!+pcGY2o#?0/SaL=)pl0CX:b4&G,O99(h, +sM6g0.Xc&OEdVPd7=A695;`qQ&oI$k,u3Rj=XR"Np)YLT;i!YSdbhjJZICElO/Tiq>lCp$Z^ +s*$0-gdj(<#O;VcHC>_=qL9IYL"+Sh?`t6iQ,j68[9gkbkN]Ac4L8W`.IF,TZ\Y(gE5a#hVc( +,tjAhfEmE2kA/qLG;Iu:\,b7#CUfd?7G_q<)Hub;+KO8oK7Z\]A;:djeJI=4q4;+))\kdC@2G +0I-)H%\J`#=GhVcqga:R7V4#P`TJr_)W?:Qo1%dqL?PS +qaa(Q67rW%MPM)Z1DG7q(UBg'0VXpe]A7gD&1jLb9^Z>G?ip`qc-o9OCe1[WJV1`K_El.P\$\ +M&+37HH_l9p+,A`Xjhi`=M?epS`GU%2FrcLDMkS+o1L8F?K#c'I\)7*!m14uRoJ%5"Y1<_&Z +m]A_7kFh)LI(V)cIM(5o,%oWf>PTqk_@M%Lb>=H@O'&%+0!0_b]AUe7VX94A8&DAE^]A.Tu*khj +Gp'5`"OfTjLE,,,6ds@^u99?"'=d3bT,>Zm.]AWiG6YDV5'1i%M*DJj@ll,eb^mHkL\e2>WeX +P1\@SG'8jNmHUsrBi,iNKES+aEVU0,mZ18$j<(Ck&fo>+Rr,$PXaDOfXU"7h#jgI]A%/77SRilI? +N]A#jt0"E-L=4Ba'ZkAtNr3G=`s?F%a+%'Ri!PFA*#>*^1=n"R"5sb=1AHmN +^K8r+r8;Vd#l_ej1q%LUK,Eog3Gpn">fuu`j%,h4MPAOWG([odP(8H@"p+PMf)tIh+#ff9>d +n_1i3keF5dYu=[oRo:3RbK;*h*TrR__V(O+J!g&3s:8h/dC?BQX-a$D#iZ5/:&-&DMaH8\DF +Jn+.!rJSP."4gaC7l$QCH+3U/\CH:$Qa_4-FShp]A>63*gMjQ0;rRSt!;OqjWne9)uWOPhDrT +=.1f@L\sB&0D%N\mNQ_nAL90kruH +%6c"8M*nim0+n3SdWfQnfddPgFHp(DDc\k"_JM+W_7G#Th+%@BGdj$1T'Ha9:PEK`%QD_m)8 +=ca2#KKI%j2>1l^BN[B>&to[9a#FI[CaM4K8uWl8n4r(N_-2QPlO!F'X&R>>X..3C+OZK'Sp +grTDR(LL(_=O5&*AON0tZ*+cYcmn]A*ot2bOKI^A/]A_8fb]A\aXPV\ac_^<#ihBGLYXd%EAh5; +X1'AM2u>qaW^,o>((GrT)ZrY9@&?KllCcV(n#;@Yj^u!Q/kf1[.#a%U(pg>AGd`[iEFW;n.. +Mg!GOJ5K(nh.+"i:q!fK89emMT8'Fq6-B:V[Z/R5VIWeGM7mW1&e+*bSa`k!)3@HdDn@I`/Y +5lS%9lf]A?%L63TH#-IXlE6"Nu=,,UPZ@_Df@]Ac6pc2/>UO*;95_X+Y4kWLu_`SL@;$38[oJE +`5\,9pZI+-'GIMeH9eqO=^a`h1)riL2\FY1D`2'T!a`b2\j+uV]AP5a^[LLSqqfsUK^g+nmfe +CX9(sbH[k.a^N*r:/g1`[WZbr.#).8]A)>jf%!-P9;T@]AGHm49Yf26VhAai[FHkG$G66iR.Np!Ni^C:qI+@CZIC&i;GhkbQEe +5\=XNcZ\2tdH;=b^'Kg?IOVN1,BDhM[.*YW>jK*bG(!/2=ie=*Zm@V'GT7LBM*e'\Q3B-c(S +2:[Kj?&T9+,]Atm*2qKleT4HWIO*J3Dc4_De.mLK8#FTtd25>\7GgHgoV(d!le%-8#eX8K"/gF?9.kRdd ++iqBqd(Bt9B2f8h'tmRN&c:2#2CRGdbeBbn:BZ- +A@'"5r!bHi&(>Z%?]ALn.ScU(_Ul^=@:JA'1r9g=@,;;b`TmR_8[E$>.>e4)IJ,]AA&Q2Qnp/F +QF&VX^rJGJh\%UhmHUd/DKFc.W^XNKVg(gCUg3L2Ed?T+=+2nnl1FD0WtS<8sQD8U!,gPQio +YFk(\K%h3o99+-0\p6"/3SGfX_7fSE31#I;5l\ed=h$_pP@:m:S0k2Fe/15#rKP*i#ak7&3? +;!*%U>)E-fp/?%:b]ALn,5X#,q^X%\6W'k:/<$%#7dW,]A]AgCYX3-#A]Aa.VD(I.4@1k2tJlep;L:9Wo2VFTaN/To5AL--DXD +Q&f)&L">0uWfr?aQ$Fq:(CY4S;U7@G8s1m'niPnE0S9El1%kI +Lqt:*"ofTUIZG[`i7N&%p;OO6>5K-R5c`9XOchrd8;!m9\@u68J]AnQ@Sr-XF>UDh5d3k>.B. +3gs[ACZ-i$4_757ccrm`.ahN5SlsAk,6N&=4JXnaWTY]A81EinIa!WiD>[?`Wd591Ve!KPKeTpln9\=(D_1\8!Ra +I>!m7V+s]A]AjNV&PSL(6JFFf)[Y41.\rlms<%$DKA,ak\EKnZ-um]AP&o+ZiMfI9I7u!uO+OlC +P_=cbB1-H_G-g$!h)=p?]A/B\-dg;#JpV7#p!";/p&P`q4M$EOb/_!/_-)2\Qu*%IG`p.+WU_ +7;4_3<)^m1H):@>N3VZ\=2Y3-SV"[a+V8H!<-*k/1Y?nmLm:(/Z:he-rrj,0*dQ.bej91Mup +mLjOLU*(d]A%(Z(.Vcmm+Yl\kIK7eeE.,X[,Y[fCHi@H"%B]A +kUfL?Fm&AP^r()J&'"Bcr_di'7/B/NRt!s!ob:BX-ZEge'5.Zga-r98()fhgZb5=Yg,`5\[6+088[b8@47jTla,akW+gG=>0]A2Zpo&;$K,^cC +!X#VZ#NBQXhFK!6N/U2QO.$If(c-s^oQa5V^/tR_TZaZp%$]AKJ-06-gcka(g9"d^*$en5a8- +/$U%YSqgBr<"S2@YN=&(Z+$>4&,/%Phr9rQ,p1k1I;rfE9.[b/:) +\P?5>EM">u%,:r-Hn)(m"CsHfG:J&*K2nTO_N><)Bol,&h7)c?N4CR]A-<&T=KlB?cd?'b8/Nq+G&/p:5:U/t,uhE=ap1>Ab +2:[ORMKF]A]API(7raN]ANKr(2of+ODp[958kH8u#$d.3$O?kMbVb>U4n3/2pCW:8@:?4JkW;tZ +)guUBk712j4Oc%HSC61QM`'AiBOgg(X]AZ#-%cUr-Rkkts4/@t\e=a38q!(D8qQ#ds+cj^B>V +-NbXiNC[hm0<=Z[OO_U(61^lReRh'rnit]AtH>slVI.0@25&mD>XLBl'A'o%JNeEa<^ONYp^.GF +eDJ\mL\S,)P^^f0HTMBU'QP9S\n@T1H7NZU]AjoiBbK/pG]Ajn0+R9T'VYd!UX(5r,%;]AmC%s2 +]Aa[_qG4Pfd[RtMM66C+'JG1oLTmH8P;Vqo#p[m4B$^I\NBF]A-7HXg7TZA2`tfMackG++^?%r +2OksiH@P8Gf2T=ON>GUoMhWf[JrQ3j6f7RER$8l(q4-I?Y<^M$4EZi%l+.qGMT8`M`ZL[SDn +$8qfEYgEP'RkUUIlIoPB^qiC1M"pN\Xkfi-5Om^6-49 +lOam6,KFV`5<_dQ)hW+38p!jNUcr(ZG"`:,aRQ/Obo86 +[[1K]A7h(.68KFjON=85?*Ed7+G'"`pj)NKJ.k#g4>,]AYG]A8I`9C0=fMh=qgjZ+75lT+\0%r*&galB_!1"#`NaTn+hp^&<[9#]Alo*\44Sd09$c#V]A/!^jf$(Tm+_*c95Qe_U2W01 +"Q%H7\1tG9ZMp'55A\#DV-o!:qoug%#-[""pl#/-@q:Ke&3-a71;JXCf463`iIMJ1O6AbTb2 +s.#n9>Bf/(USrNP(V+SV2"*]A_>/"R=3(CIg20]AZ_GDXFko9A#p +o2Cd5*9&\$,cZ.s7`Wbqjig7D/1_Luh]A9?@f:n:7k<"JuiFScE_/6@_gEFp]AcTpG(/Kt6KhL +^?2Hh?GY&%)*q@>JbNRm)>apI"$0Dhu$W.isM^^Q +DFaIoi*L^"VC(('TqP:q?R!*+pZ2&5\A_\-'1GWJ5;?+qj7)Fu*"S"o'j>V=oO+(mlX19^E8 +`%1`)F;#1,uWM'%1cNQXX/Npm^M@#oT--b@eD@(Va6^V(#@^%iW27E:Y6%CE?`GRZ`:#J!Ep)8g+hQ`V=C`8E58ZBFd +DY.1ikYNhgZ:1/u^[CLVd5&&YYHF1E8DHLNbt!eZZHoP^@#/<@0LgR=iQ1ijF5h'MMjotT&G +od\0Icg3daFH#>DQ-]AVIdj-j"H&?M[q`;gH;&l(MI]A"ORo-Z?ZL4IG^jUdm%":Z><]AG=-jS^ +kGoBlp<]ADW]A(,R'EIH\T[kW*&a.#"J`4hiGLjkr"r?nA#M-9&e/T2l]ADtJpr(T$#_1"g5L1V +IdCesKh#'$mA^,&^+IYEg8_@iV@!(R&%8)rd,A.4$nr[aS*STF!%2J#Q9/IFdep3?fmMor^B +?dsO*hdG3Y'Vk[0.m7HQaN/X1,[V"&X[\&"2[P.I=)B9`5'H#Inq^qa)V?$+uI'i;t+@I2tc +Z-,Ja,Yr:$O[?>09+*LT:K&qY(rjh&g6P]AcOH5K+@f1nX^^_TF]AD3OhmU>QdbAU +fgr&$:R>/*QlN&D=W?n/'kqiG_O#P3`J,,^;kq-']A'/Qd?iYn$Mj1"hO$6K-'PMl9sbbZ@s7Z>.W5id<;WcL- +>QEM3C@!;SL?o)laBN8&t&l6I!\.>g\J*[:D!I&orTfcpfm@qf2:a;ao:G8o(,_(YpZ"']A0V +S_^qT7tT]A$K8[7SPj6[VYog%m1agL"c]A;E4R\`rpK:uS,\mH$hjln.6[4nLWW^L:WmdU]ALY3CA@6lQdDA@(L0+g(Ckc0q62P_.LdT?So>L,"ju +EN?bg'B>q]A3EB>K\rT9lHit"?iVG;$cen9PFlKgD8`F5;ph!Ma3?.t+fK'=8]AqIN.Bl%Um79 +Tg[AV7HD$2OrP4YA?>@5`I,LPLYc7GEo8KkYQB%Sfb.D(In&B58UJ4#*LTZS/U:$E*fJ5C4l +IG2QiW08K3.21,B6#^tn@2"dl!#V7`?P6n9I +MuEp>9P?.#nq-/ai4-`r9qtC.-Ke?3'\L=aURq9ZGp=Adeh6*a-p*T4mZeBJ`ri;0YZ4B'IW +Cb.-Vd1>/%/8Uibj-gX1+=e.0.]A5"YV/mpEF5.b,.Nq1q#KVl4uiCMQ[^H[4L+;6EJ7,bdp1`*/qm-Q+s]A4H[W2 +B*s!^UM4La_0gg.]A;,o_c%dN71A2T78Z7bbBc>RVObIQ=C(.q9*;%)!7m5WdT^pF)-3-H-<8SpD6.HXV#=#E&m'-!]A"LY'J'V67J +pU-E'V'Q$6`l836oo?\HN20u#Q*Q\cJ$C"u:]Ak67>6I_f6(ssae(iHkZp/fonDAkR"D)6DP+ +$05iFFVs_5^:>RHF_-`XCprCuKaK.l/Xqf0Pp>V=Nn,C*;.c?TB^2=@Km6n>EOMad00Zr(ro +(5L)`Ya.)'JEj!B28'\M7e?hL6Af<_3U1s9&Y,eT253]A9)FSWJU(A[q_9-gd>guH=:kjRud7 +qa_?[M;3u(n(><9^mOm@Y>5.?pe!O@cK[jp;3>t[URc@5 +*Yakte<:B:T&r+qbB"u=m`P('E1Hh;Yl-qc*638Qs)\IcMXUA9dL$bY:[?E=[>U57oPIepFO +\TtXZ0'QU8j+0)eR'3k1T8n-"6GpKK]Ao_`g_rWfOSe[.^qK8tiLTnh$SaU&D$R\`R):Z.'[F +LR)pEWI#s$o!nU,_`rG\LsZQ'up;H0,l+>))!imIpn1CIp7$D0@=4ilFGsnMh/Ch2NKFL5+0 +2J8)B(6^W$71GimVIufi-_rcV`FWDVt/"j$WP^-NApU7c5]A&-<6Z<=5\GnAY5APch:AC]As1>nt_Bd +_R^f>1WcehT]AlR2gFoTa:Hl>R&G!DauKO8M2LMFpLAAX@beV]A\Vp+Rr,pgbR44mO;fNdjN"\ +VQs]A$?nKUJ2X<4(Do:uBf8AsL"?F5e&$ZJ#JQHpMI920Z2iR/:+LS!sNH+O@n]AC[>494ES2K +N?+1FW8-N1mDqL%c-KT#$/`j2MQ3E*? +#p%YJAh=.Y1*.V)6GfZ/GV5%i;#rOY#s2 +85hC8QK86@"JWkm'epD3K/IVI,5g.^?D8Y+!38_+XdbWt:F]A?37Gt=6-alrZhF=@,^8#kU:j +Q!8GUFT[$n_5s'.]A$_,2*ol&O)YLCsI3nd9_g1*9(]Aq57Xlm5%F14-&%E%uVZXo6b)%h85F4 +"h:I0(iMQpi-;1Ue*i=lrFNg9Le]Au;`Oer2Na,>&LKNfJ2nd:-"'60NZ_cG9UkG_UJQ:fI'U +u7b(`NdlTQ$@f?tS/-3-5h[/%gBU!A=B0Dlu6'HfSUS4!dS1Zhn3LP@NBSCJM/^n(.Yn?]A/A +W0%"pp`#9ZiH+@1;$8QJlo2]A?=8;M]AK3#:f<'1.f"O4oO/X1$Z=Dbm7SKdoaqC>'Q5jh\R1L +eBp+ +U*k@]A1nn^^UGPVD\YH5KBpL6dsP*ff"[?P'TJB?PLG'oYIKBF3]AQ$S=C`5HRRmo(7r16[dAV +DYX_flX`qi@RlKo7J-g\?rc3M--DZ*lhmeKF%UX#*a!YYXSY(@mB5>V*f*lo"6lLCXs7-T#c +hpdJRePpMqjmHYnH278+m*;;>$o +t[hgb+'TQ6lEUc7P3YW4Dm"(:o?9>E/To/>3bgtLGQ+D*>2h3G!A4A,'^u+Qki#VBrE"8e+/ +\)8_Vn=:LNAiLC/e7bSo!W[U&C8r@.D*%fQAqISI!Urg]AZ7Cg1,q87^:nHd-bdM=2O7^)uqEME-!/H=SqQU:Fpl#;.-GNI +E/3Oi?1K"ZpS^C9FJ5L:*Mlp4Z%-(Di2qEqm'HgmT5Z^^kSM-eGW.JWA&g="h-WREk6gm\a+ +oF(8/:lrZ?(Nbp$cJsRcrlgi1^bY&260PaI6bu +FHG'C3e@kBLes*3`7npORmEF=+,2;h<9Lu5cHb/N=5l6N:Q[hX8^Nb#I.JQD=8=XI4f]An:\]AVSmj96`lMcHnl-euo>3*E0//p6oY6*MWp<=NW)6loYH.(GKtr\eC +5Q1KV&E!`UE=a!iIPFKhRaPG>=o/5YP%9'Ed_/QOo[hb^PQjQ<@E<\r1`c"nR[5 +*;_s`CLF=bh`jTgMSuSm'GM8Q7-mO?gf4,cr`GV0&(.IaU/F<"`N4c(^%crFr_n"`D%5%Y#]A +H)`Gu>**(iO',IbYI&8`+K[n/HoDCeMkjo@fCs(1&:_aDdu@kC\O#%oYMHTY]AtH8l`WT.6[% +G^P@Vk[#u&JFmL9QIK$6N0USo[`4ks*URk%a:X9-\S<'mT_]AdoTG6'bAk%]A?IF=M`fD=)K!Q +S/Je[_kpIFC/.i]A6>EJnJ,-/,9&5EPB:Dm" +77q!>XX.ldRN@\]A3DQZB;G<"m=A88#S8e&JLK^/gZjkl\Lk0&f%o`\bHG@tABZBE +,9tZ[C21Nu@oN/=YLCk.GRBg/*?H(8q.+JpKcRkY>>Xcc=A?.gQ@>C[XhLrXgY(@@?NrD3Sj +G+B^e*jO;FQre$Vt2g@NRpu5>*s6lm",YGA!^A"2o-8rpjKZb:e,5ln(0DRtd2\A%">SP:Lj +DSb(\>Gsk+Y/Z`)mb)Vk1k%@n)IFin]AdE0p>o\uNj@@,.M^28G;['E_/tk(:@_7s(3 +Z*_Hae[^;qrNV;N#Fo`=[_5Q#MgJL0_8"E11KjJ:E`M6tVY;T:';4G9rh$!E>rg+]A]A +>L)BUpGSLI4?)"#"6PJ%ifHJO)Kjn/3;CRLgM)7GKM.U@UgG5nKpRd6j6l87,!4eKB=O/9uO@,n=N4&MUM7)dG)T'smKLXf+gR.;QZhKpjNLoMR^VM?^;B/UIZZ5;1<& +Qqbh+g9mn9t6l[C!?L-2@?0CGEAf?GLmGmh#QB5,oPuHF_ah;(;dp34ZRWa57<)3DT_pc+!O +`:E1'7Xn$D8/CqD>X^$5-h<5Pm +)t_Kir?PC5;BgRf>E#\iU:-G$LZZUXFDjs\E+:-m2JPsGC0=CB&"TSlfU'[".fL]A'nu@-eNIV`-Rn,E5Ka\0E&@qLgkgFCs;eJ<9N4i<8V]Ar0AS#/YS-NM +G;mmX);k!,,&i9T]A6g[2cm>.[`ZjZT7D^@*R%27=]AO(@"S,%PE,)2Q)k5m&>q3PTJ^&h9_B3 +-n9QVuK0Ddd*cCb.c#Jha5-J:23EcqI,,Q4oH+/gB)+TC:rLg]A9((Pa"opo)0.WbgWp03M2h +3Ukf$(.XZEc=%o]Ai/QCKA,0#=')+0+jU_Wpog'`PLs +C.5PpY_h#_JTdbW`mfsJm*.2mAVEO@1E:F!$lPI5>IIQ*2SMCdl/Mn*RA*S8;YI +`UNfTFsJ&*IR(`*V&rTGNL'ZctdE4_Rg%6&3C+%5s&c5j#5+Eg_,RM7,jJ)plk;Za<9N[nAn +J@$7Kei#W(/;-7PG'9_J/uh`"4XQde,#WkhUS3asBXGuQu'$:/PmK35j4-A/K(kbaJLYH)A' +A=?R]AF<-mMAJF=JXg)_+0uEi+3_J2Ga@YS2OqbCRAklf>aQBj#O\4fkE'QiaFGs(ch"&K]A1r192*X"]AsNU6bIU'.NG4I))H97q^'Y#iD1E>&S_ +-DEHPo5'tANX":VuEH,^P`RgaTFh;u9Lb7E+]A(_gPZOT`%;/s=m//2+2fViWB9c9FiRH[MJO +.KehZWHZ>iRdW@%%-?N(u)aRlW@CsV"ge_j\Hm=O5-e,4r9 +/^I3#&$t0h3EC9Hk.KUN=7(?ek4a5H,8:&4+KHdNoIL[]AFUh4s&jFam,&>h8$?bJT)G'rug\PYsET&obM +S@:?hF-4_1]A!^to5;88i0juP$cJ&d"o@KJM)F^.TWZDq6Z!bU2FYJ(1b-CYMI(WM5ue&TS`Y +mnutUiqfXN_36R"db2Imf@seFC-cUTO`NK:R;#C3X8\QGTerR1/)"N=ZQ8c&cjB6&)c/"Wli +JS5IoF;.tr?4(]Ar#lN!/Y_^iZN,$CD^a$QC``pT:F'Wnjs +j=``AXtFiikRglKCN'I)C6_[!S_T3lVQ_rm_e\X24---U)Q&1#6.)E\$sBdl\D7&M +_S*1]AF":ZNQ.Q)Mo#JZ?C>$V&3k=5[7QaC4b=&[!U<638Q1?E$]AYMek@u8,EK,1]As.i'" +NFl#t=iJG(cj"C^$$47-4[Y6n=?NM*1,UpHUiHBHClFMHi%0N-G$nIUo:P't>L)ho"[+V(( +Qt=^*[427M(ElT)DVkc'!DamnoA40l..EMOTb+aiSoku9+E)!fZF5(oN[/O_p]AgqKn^SbsS6KZU3='TSk;pJa:G)&lAM+#e; +DQ``m/OK+R!fdJ=!3V9EV7nXZeaZ&\\;Ln4VKnEIj74:fb6n[CAn-kE +bN%m,;5obUTFTnGj`)n3399gPG.iKCo4b)Ug(UQ!fhr;]A=',>1P`?>:ccY.[^Zc5aQ7#9$Pj +BM@k+#bH0_3"+VA`0KdK:a0H8RKNk&n\rpin+_@,f1W:6;K;l!qEcOWp>P>2CK5bEBmsUOEL +6.nSCMhB)LlNI>!Wa3UB7GCtK"Q$EU2Sp;4/RDORn=-AIU3^*Uh$K:R3#fM`'0"e>&5ZVuFl +IYeapP%a`Qf\ipa-_E`))ug%LHBJhR_;duVl,;QP(A-eF;Zc'OP6d_)[32=21^J-m(jo.^:l +RpItXYl'4EaXP#$WZ(AZn)#]Ai"+7+`D#FFr1^RfNXB;[tqGR7``#.0-'er0;1lnoWN[;1b[e +,<5OerEin6'kEMqETe44=!DQo;+7je2I_QcBj]AMu[Ro?:L@EjEroi>%j:o&/AZo@Q5:5OS!a +2\N=p<"AamZ#H5Vr^/!J/mGAhEu#c-?;(IUD7R.'/0aa%YpEMrW'>)R2(6/6@F14*$uTM>ts +E9XS.dpB*gVMcVZ4b-!ZoLmN5E<,aI(Y"bF469n@drG,e>k-jm\YD\fn +>;7*n7!(G@NBoEN*Jh>@JdUf0t/d!M9Q%hH6]Al.$)9%MmV$+X+N>:Tr#cI8T9jQ#:\ +"YYMZ56%P#`X?be<9cW0H?&nLk)n!-WMH5*P%YUH7RjKIJ"`R\R"3udn"!e`=#I=Ri1+i$X( +WDngHC9iaVQlD,&*AHf$CD,qM!uk+&Fc"XoHOe0me6_h(A]A]A)4r5[0t(#b;(1$h92!TAiWWg +#]A0H:;C>oSEdCipq$tc>b.5#s>mH!URU/*gS24817-E>g8]AVs5`rQe-SR*E/Xh\Oc:n%ED1T +Y%*W]A`p+`rq\beYe@i8qj0/W59&0:+<]AUI!P\4fW.bZ0)'PX?3qFAqNgTl]AUP,Y1Zr'Hdi`, +QgA%C^NBk5L0Oqn(WtL +NOgmN[-E5K@*!GW(D94]A[cMfphBW!CEk[#CM-0GBdqIncb)!'81uB\,Ti9Z&'$rWG(m8]Ae:3 +hSeGI.'=hJmq/KJDN`OheO.YWeNC%pbd`]AX5W0R:38XhoH,6Y1fpOas,+M>n6t3e4gpeJ#8]Am`bPE6$ +G*m[plr;GQksm$81=+YG.&CbG3,b>SJG,dF:kXsdWOaBdrZCb:(ijjk5tT?Ru?.Wi_IG]AhbS +%ilDZ#%UJ>rLm:72ZO^IC4bflqk!H9p3+l)AB6h(&.=-PpdCSVtUYK!Qq<=3-&8>&8?iq!Le +gBVbY=!(fGACX3hGJbL,&3NBjQh7u+Y!m^52Y?3oCf9H2T`IrLWet/PIA?OS0YdMG-rrp2H]AN.9P3I%pm/,?_QLu1UW5k)*!ofcV?^J4:m1uA<7h(Sm![jaT$gCNV(+T/l2$%2R]A]ABBmd2hB`KZ +ZOPXM(_oT`KIQskN`A%fCTd[=Q^40a'bpV4()60YEIckf1]AK,0Gl*qZDE,HFB9/E^lipPm7V +'JIpkiQJcZc7rUquHjK\=I;f;T*]AT>)VgoIWo@QX@.JB_G;<*V]A0B.P/m7;T]Aq76kCU9)ZEM +h"D\-@8(83^RG^(2U3/eoSSL6gCFh/\+AeEj-b[S[8M6NG0<]Ar5r2'(Zg$9JWV\n]AqE,6r@( +4rC&K3-LppH7ZLX[n/pWBO`ZcX@k7mNfGHiX*#3"`JBPW%V_NA%Q"4G3XJ'BhF]Ag%:JP6>Ck +'$^k]AVrPm8@sDk1?lT)VnF7p(@Pe4XB1HaPV=)f(M"<3(?6S@GBPIe(lcUC8P-,pqM!-N(Ij*,Nlm8$<+3kf+JZ)[F(/cUpr=i]AEc +Omt?*g\XB&jLuG#&iUQH9ifMk!SQ+puhMP#<#8KP,S=:!R'[*J7[kP1WA?Ct>q6/f>8/3,X* +7B74I"W+&225&5St;NrH*.bY1k>@0aMQ?pESnA@XuPn=g@l[g@_374B<#"jSbs(J+uf2hL-V +CJJ]Am&\"A;4c:-`$FZa7!1O0>_jjX:1(E]AdPD"ck,!6,Qi*V\%Yi45pF3f`Vrr$NbADc!`#= +]Aa/n)h\=p!d3\a''uoC,an"S?iR"gLn\tjX#;'2Mj;C#g!4T_#2m$N)<#bn"ee?[TrkSg.+) +&J4mcUY1q01D8*Y^p3[C*D(Sc/#4JFc*N>BmH\@]AD,\hffRmfHt-NQ'8c9Xhlo_A3+CTq&6aV5(5UPgXsrB.)F)cY_PhnS +*CbS+j1i:U+JFd.1IO'C>7]A.fB7Ks@o5G@'T!SG?IihsS4)T66A!a@A2R>0Y"kiAF7?TZ1F0 +Mk#5!9rBSFGnh:n$S*J(4M;g;Ejt13HO>2%mcARJO`Y@DK?;_W![0MnEP)I>q +6Vaq_^h6UW.RM_GF&f_alaCh!a4IL;5WItV=&%XO\8;2Y!@Z*UXNsrBNi0-kuZ_O8CM;11-+ +*Y]A57CsGQ7-HnA7a8'g3aHM:uT?+_IM<+:RM<\`Un-T@WFK2QH*S\;)-A!bc^aJ9Vk7]AVgdX +R@295;g/q&@>H4O-q2H#p2pn%SEcfEM2D7a<>EEuCS+h?DU%i8FM`oW&h+5:o+n1focX-MY7sm`rZat +iPk&t-3p+#n3l$>H`!,6-+84c?7.TRudCkMa=s7%BG.L(P?JXrsXY#Lmc0=J,LUF-d(d7[e' +V&o7j2Kkk_lcMGH4rAe5ojddhp1ZIblf'3m=M%TC\4RZ*RCPuTL`Qk6!A<0b5@`uDUkYq?'o +@-DP>^B\m81VDp?I!2!N7pKA,)+;(rVQ=@VMZ'C1^B'fAq3Tba>q"?`!FR`,+-?NV3dO< +G0[e;b-F/n/t/!cMX2:1.cbY]AMTc6a6eRp@NgX1oZc9&GQ"M(6.Zp6MOqZH6GI+ean>7)7On +DW'hH[F]Altg(a/:LBHBuG!`l_7[a*1DT +RFd)U8C)fiuf$WN23no@:P=(fX_pWf&e%'pl[>V +CaH4)J4cj>l;RrXQP1eWf]AOmWG_89[WE55'ToKZ:BRXgMXk%jhMT&ceWgYI+DaE"F]Ar(*]A-" +q*EpDg!(filRcQF?flt&PDkN)N#_&HU"/V-sT`C%$YPdt1#o4+NJpP'JCI]A"!FA]Atpo.:/dd +C4.iY%IpH;90oUTe:_[/SXg&_Pp:hOdHqlNX"Pk7*ng*$(fY:7=+mcQ[a:A)t(C&;c(L$[l) +6*PVBp<:S^gMd6P2phpqZh43TLZQh"=-`F@6.C_B24\!:!8@eEpJ-7bMO)%rtNaY=Wh(]AooD +>?BlRLR$.c4haXnp6?j@DX_0?eiNjB4f.`#&273V77`r_#+`jTO=VE+?Us"N[X-NQDZ?h0$^ +Z7fl%%7bab5F*dZr#b6sS:q"?1s-+1ffD2dT/cXrS%g-bI'1!RPG\"5leB&FDXgV-FJ>;V:P +9\1U>hWZh`Q7E&i&Mgd9Kr)W,/jot/.=p)d5VIq3@SV>V9'Ogsa'WIGm1:F0k=>np!:;?$=EO#V#chO?PIqR"*mt +s,GsP$>$#m"\<4bSo3tEd>>)PhD?.;(FWNBX^rM,6GTk:S)ig>?G"[ +(tq`cW2.AkV;.LUBd(Vj)t@^s1u5"R/7_B^%;NF^+V*QfNZB3&CET+r.m9DjTrVN'ao&s)u+TrYM1%b +;5B4B_cXiFSak[oi_j[-WQlo[G@IDu01-E[;RQ^R:WC-*0.=*OAorVQ>m*8p&'VPg>[$S(pN +.79N-.NU,1EoS@i^6b%QhG<#9DAITu3Egk;\Z;t5ZA&UD_4A38TF@/jjo6('(Y(^f:WfI* +-@;e>Yr-0"?4nn0fUP81RgjI'.T7ZY,.5'KnouhJ,)u17p$i;#>Pad!PA*06^,+H(F6@qsVH +Es@fm[q4.2Pj+\0=>[93-E(e5G=Z$7U$3@,dJ\WmhY0 +t]AmDN2n[A'H6SeURmU&I$*Xe@k=``";Hj$jrK-=Z+@(.,I:)ZC`5#9T&P*[p%b4GVLRXk:^n +;@OOD55dfH4dGbZ;)/Z2SY1ni.?W#,b-eo^DHbdSi^-ohGIo(riic:O7AN7Z'5OqYS6UdcOW +3dr'fUmt!4lT2]A8SqFc*qriW:i5gqa/in&I4EXNu=8?or*gT,*3,K0aJ7(e>j%3/0PJC&/A# +7Zt9Tn\tX>TCIu'tZ\6&C53OsXaWF'+$r/P"u&\(k6Sg7<+F@"$hs1d(4jtChL9C'Ct87Z]ARR._O9&nYg5''&::tT#'%aXH16ni?H(Omi$W@SS;2DQ(:q!&#`/*Vlsua"&r+q;@/F:1I@NqA^AZn5&Vr?hq)0T +nMO/l6Pm)j_K*@Xi1(.d8AE?M87CpMcWrZFX0M]A:T7f +@QGMp^8cggb^Ri.T_P*;tR'JU%pP[;($G:.i +s3E>`5MZ2U35/M74LR=D&aM;EpPXqb+5"QRq!hnLT5nX/Nbr)ArEb8\X3U)KgAMNQ6,#C@am +k!$kJesT&,VWB_8!b83pU92&[^T7_AoIXW-Z3@TIapF2%h:gQ`Sqd?ooQNI$ +I<3]AdB`jrMFH_.rJ![ARScK9k8kndd:pRja<#fc@Ca_"[9[._^h45;<5K:q)[:!?LekR]AAWH +\VIMTMpkl?phhk1!%W15\-rJ^IlI;T*T4`V,hEc\.(Jcs%^Eich-TL<9mIcWX+a.mU%m*7Me +R`egWVU!b]ASna#4'[/9'KVq\[`lB$^&mdh16.a%Q<3$O;^-XJ1R3*F-hnE9J1/,/XdU(ZL:nbsG?k\`js*@(SWl_YgC'-9tH\DB^E!t1%Lq`C&:Z'9^tjee +e+W_N2QEs.&g#V*VGAimVP;r@^%*UTZE8=s*i@c![JXIm:hF>b"jN71/*MFEb$OOY!E2AmXhgR[BqulMsk8 +F8QqJi)-sS[PD,mm$Nc"8B\Z7=bbO8>6<-Yi.9AKMG]A:1f9+(qf_@+^5i@t0D/0!N0[oO#mM +uSm)8GA+Mj-+Xn$7a/^K@affE\f"N0l0@cc4JW4jY;Y[^X0CL*\d-=H[d,6q#J$L) +2-VW[jmdLQs5!TaYJkL)SE_q.l-3YqkVRFT9KS5GKXEiJ#31DrJm(h>3;#"s7uZ +PErZTt59P(DfFrRf,Cf^BORGp,L]AB/P,a7.!eTnW==k7^'ikmDGcLG47R$NC/7>0gd-'dmnB +62bLmZ!>QnM$K[:`,iHR +p35(<`Nd60lH1cP00FuR>5qoZX#$.``CB4ksF'$l'R-Pdu#,X.QZCq*%tYe4rc:q.A:)E7sh +iaNgT;665Bc16-H3]AoGq7N:KKHWKp'>Tt#b;d-LEk+6`aJ%"\AQb6=B.[5qC!O%AcL@MRoA= +LYUJ%;>0ukAOh_B7oQ=6RR$cB>1tb$OI4@W[KL.P73sB4#shfo +s0;?[s$K2eUXVQR9.pgk9_4oY#8!uGZ$D$$!b`skmPt^?FUXSa,]AS&L^huYZ!-bN+K5ti&Xi +UGjnuOedeUGbqLGWf(B7hkH8.-W[mpAgh1)iSmJ67(`0!hCCh%!<[ENUpn)+`uMjF*7Fa@VA +KWYI'^3?`i7Q__VWnsk$mqDs^gI1I2-^mD^5+'u0KK1iOL6$K^PgcYG$?rBB)b-o-#rq!%UU +,1Q#M"'B/$^8T4Pd(hZ6H,YqJDl`.fG[PU`6qX\QdpJlc-raC856c_5Y^3XeIqbUi&6c>7WUk$qBa$*):K<<()\-5Y/9kT@C.L"C-8N[=RV:ZIWl +Q?s?b:Jr$cn=s='*AS`G#k'2r`m"N)U%U)rQe'oj.nNmc8oS^J5h,fT+9mothL,>d"pB)K'& +jp3/G(c3Accn0GLek,; +jEAAS0T[6SgP;tQY@kiMTlf]An[TZ#.mqlPj#SMY9\(5&J).X]Au;VT7*<5SXY7bJMd(pifQ#=495B4>QnLZIZj +RX3,R;T3R0g3^M-m-^(*jl=E<*7KbQbF't@GO5m=tqCq>#q]AKN;Npo\^$DVL?PX5:kbppZJbF)DA#LPAW"+[3>RNJ;12a&R +eOb[3Z^=7,4O.WHM&7W6]AjLY/u9fW?K*`l\an'"MelNV3Pir^5H_TfVP +V>_g!\I`SO*_QYhcbbhZfG,.Z0u?^#_193Ea]A#l,i!;Kmhe/@B@?qSIkG\T^Q^BT79c@qb\p +LkTSrnBhI\-l2tLG[tO`-'gP(W"`!>n-c_Z_A"khh+'&<)duCgf03e21WLgSms75l8,X*$-K +)UD9.?@^cZJbLk!UUM;&*5rWm7CSs\U:[RH#a>uD.Fa(@!4NA%u1T;e5/IRYE@soE1U,If+s'DV'1`.Pph2N +g%A4^,feu![q`l=>]AK*moj8dW0NNYi?@4&haq&2D=$*>WGTs!#FZ'f0Vq2SrZMh0s9C:#!B, +4Cf5P6(:3Opq,$\qb+4-2)9.b+UI+jAP'>,TI_JG8k.Z3Ar*A(5i*`C+A=pf18aOqQX-kO*m +R6h>VUUntC&^-gXTkaBp#2sJ(77DpL^Y%&;XRi'+5 +;E+^GqUDmuF1l#>6^e)I$AC)KgGfH@#bgf9,n)B$t"/n=nHe"(N.I?SVq!WfLpSU, +&*3jMC8sC]A90-Sh'=md+d51p]A:LZCC1HdmM9CP0sh2Z6iCT[g_ROu$Zi:5<"-\=1>n"-1 +IrYhQ)>,ZC8I<&0,XdGDTO(mknCmWcd/ST1U3tNeKUo0&s/48+THaYj\c@>%bTPUDWHDM"gY +Q=i$'=KhYotiZZqi`jC*Rl<\#m-q\LiE>_%"t2X:*q5j@#0:3$#HEsg1^HjkohO9Q=g)]A=t(qg$0GZs +di$LN70P2%OVSaW(XG*En_q9`13's+b`u[bZAb0QeOj$$FEMa)+iO$,5>T6=4GCB3JPiBBI[ +C@NU^VXA<]AcD0T@b\aRYG;Pe*YddChqk=(N7roR@`i)F.2%R,QS@dpmm$Lh$Tin;"G;VQ%fDS^F`Aoo9$s-7X-Js8=XPRE,q +#M%ARgPhj3Db8S>%HNr(T=+4fQt\;^=MjT?j?nUWJ]AK&:?/5, +N\jZEapc\ltMWIlloJ9sES:"\VmpJV9Ol0l>7+i(`fPB=XPYc%O5aQo$/(i>'lq,I`urC"=\d.)NKELZ +G%<.Z[2VH3C2p_.!)M$W`cK'F6mU8UFN$:AArWP@fV2Of,6mm:q&d=9u4g9dm:1A'VcN>KLIF_D9TOkR +uD8d8*PIufNIe(f>X92qtGcmah>b7uU6GY1R8>2pCc.3ftkM#!,C$Ftci7NeeM=a"t3rPkks_IYK<)GFdHV1GJ:GHqAi_lq8`X/!]A)QFl(aI!hVL=/%_ +1M%@Xc*U.XDfc%Ed5l+nAW>(4ZD`p"Y\P5!T:,>W!;01k7DW/4Er(>'"3MSLlDTh1saL_^9* +5MouK+;Gn8g`n,FN+LO?\a91?EZG'M'M?52Z0ChblAOm*@M5)R]A?Oi5!LP/Z*!nR3L!iOK2p +M8Z>4r+qn?"^u8U(HGm]AS,NYRTb.J0bl3fri:fNeIglQCH&om0>u`ON^XY^*25=W#S/WX9D[ +>Fp-*#hH\6[HX3:NS63AYN+,=Q*m[e$7b]A6_]A^3%%L$..>Xfbk=q/0Uc:6,5cu9Gfs_Re']A) +4BD[COc_(n?fokOs$SO,Z,)@7@aCTGECr)(Yc#*(8OWeh5[Wkl\]AG,j`\Pr"Ue:#kMd&/N/> +db;i1I=m4j)5"UZZ'KT^F85A@\&Y@b:dIp0>Z#^Xq#,cP#l#+A3haHe4K@fu>7C5dCsDElqW +S*#10dKPDXp._>QVrt`R)9h`./Q>VSCX2.*J8^!`DbLkM$D4b5P:lir;JaR-+Saa94OF4);! +EF^2rq#gUFeadZ5k*0sc_:O(St=hmSa1s%!,JTaJAt5IcIQ_0fD22_K-ONQaUjl\-sARNIHm +lh5&3I#ags'i+O9j2.u#"5&U\"A-\Y@OQ+&Dlq%Y(^/5.-KnuB8WFj-]AG]AlD64n@?)mATV$@ +6:+$Grb6"I1bHr=+'/!u/#o_35FNJc6JqF=\R/^HK+mErS1!`?[-5`s'+I,B-=PTFYa9O_HV +bmQk:Er(<4IZR;:07nE!U@mDU.Xn-X4l%qth.A!`bra[i[gc_\\`<[pg)@N8@/=QTS#eVV#F +c?*?JQY$!u=gK8ak!"9*dSVC^MC..%W3lW5WXZFbQgDLXg%1Nc'g`P.8BLIA96Hu%uV]ANiK;/O2EfO[q]ABg%G;DPm`Yn6WA;!70b$rKKg +L]Ap7,$DG0Q#*<&:N_ET:3Q+*69t%,cD>pW*OUFa6\Uc.aZ]Al\)0/X2_JY1SU&gfR+HapuK@i +[^n +F'sJL.o^mNCV\Iu&l8LR9dW'\p,?iTbPMP:C8GIEV9[p[>Rr*?DDo]A*.T@8=E$j0V%r%AW0( +1&fsJpi6Rk<<#W:o%UN6k7'nU`Y]Au1nG`jEEr1V?/]Al6[L\ECi?2ukK;f0t@8&WHg!Ud]AS?gm*=>iY`N+/+K6Cr$%:p(K0@q(Ebf329B\ +FVkc>3?r`*6/RIoc)k)*g)qK77D@s32YJ^$6R%BRIcdb;U0B*cn+oEcJ2W'>LYkM#k8ln0Xm +QG4MlgF)GlUqL5U,5PDD7Y@"WF_Tu1q%Y!o#J,5_5!SC[X'ZJ?ha%Tqd$k^XsNFV>3S +[f.XX`\2niJPD'WQ?:4YF=?#!W,Idi%TiW,)0jim[@VD%1bmt$=bSXojSli>Fb^df%)<9-P- +Lr]A*3D9SX%lE`cVN\r2diXFJ+-)4G7PTN-VghefZiX8`J:!9Z&3?X9pR.m-=O67NtS(Z/2S/ +4enDDW'53NT5]A(^h$r_?[:Lrnph"tOD]A(E8ZY;tkKO(O1e`;8,I07f0LnU>SEo1!i]A^+`^e[ +r:/Q,_mXo9t6YPfe6"n&c.mKEo4!-SLaIdS(*TQFr!V:5(WbnDMq%`/O)o*R5d?H[$jm3i&?i`A&rW>7`\3h4WnU;ag/]A.W +IJTr'+p`Ja?jQ-RPiiG_gdbiM2b0?8"Uusko_#,eJ#bnaY#Sat/fXdU4T\9dlT%E +u>plE@D]Aaa@Zpm\hm.X.`m9H\j-CAlt5@91es.'2X3-BS+29"fF[i2`n[:L[C1QO#62g6^9= +E1C`m1+7h2s?dY4YrJM@@6g(Pcg*'=mrgS&"5mG,ja#'m^b`%LuX,4`3%[(lA)j*^hW-"2NVF'DOd)1^ +4QKBr"ibWSi>9IT9ZTD,<[7rj'>t46!R2]An'/m@#aR%(dO+^cqgec0fo`:rkfoSUK. +0-lpCF.c_j,2hB5PbDV&CO"!N>j9.3b;W/rA^rHFiC[r-Tp#PQQS\(n1edW0!)Xd%f+"V2-3 +Wn9c1=.7W2K@nBPS9#\6D]AU9U9g=lIps'>9MG8EuF`';\V-tc+MW +XZ.E`QBUmZ8r#4<(r1En3+g(^ha80[!LY*D3O.ebC$m&lAA60<.Y\?D[*6`4JIDcfetC+SYt +UJuG]A'3!A7R5g]A7UO46q-J#Dins0dk=Gc/OW>Zt.DdZtg\Z`JdO2VJC(u:K?4ZY(+]Ae`YMg< +gne$<2!-NCSj=bZ00OYB>tud8(,.>8]AMl%6b\tDerCU=r8`_7Gp;@iO>OEJ$cGDc=qfS$'/8 +7p>]A=SN2-`,G[PL@A0`MK4fH#\Om"u%\4-0qF_Rbb+;`,)9ctA]A!p2c5I>dtfn6=2@c@keWpK";@^Uq!\AkJ"&gLqW- +ZL&u\B[IuubT2s>or(Fr#mQH8!N8C\P1"Y(>gCm]A]A5^$@0i6$nWC/#G,g/1V9$,I#n2mS==bD`gmD[=0o.\&tajW,8r__6I>_l!RakD_.Xi"&@cb,6uU&uOku1?['qb<#2ihcTg,/j5;I5H? +h"]ARR\!(J>P\AuGo!U-T*&"Q$eEWPGU2X=P"+X]AcHm_]ADcG^ZXP(`DLX/T18i&:Y-U_p%SKi +X_\UopKFD0ZH"8%PYfNFLkLkTm!Gl$N)KA8N$9Dq0![FhHgc*ZHb&J:^4!_VTDq(2kJ"t-om +EA&3j2JS(g>O#8D:QpT3*:qMB,[0IC;(e'&Eo5=5k5g,5dIEGBX?K/BE +YZT!'70ZnNg2UuKThqd8#nfoR@V(V&GtB%i4c+qIP/9f +^b@0P\Ds!+FH2]A+h!aTCL;-=qjr1FoAFbd/u0f^&CLklp"6XqfA-TJqYR!-9blg1a4)V.E2ZN-- +0c'/.mktRg9R\&cpFaP@bNo)]A12-o]A_LlLa.E=`[O67k)DMoFa2d)u/"Z@CKugn_OAVjIB!* +9E71[Jo^;L%':q0%;pb&]AJe`VWDri"GFM1\KH$@Y,-6D&c$oG5aJ]Abq?lbkf\l#C1DE&[ +K>.ksqUVt@McR\5ff?sp^C2@W)nanOT8PA7O)4\m+\0Sni7.h,4,+V"c^sMra,o=W[f.mM\i +C7^^S,2n31mEEi;h-or:TWs7nghUrf3Ks\JkKZid=CLi$L4sEuGtpZQKCC5Ks:uMH6(iN[^8 +4_$=_/`*m"kfk3>14tcn9Trb2+ns4QW07XaUQ879X+U6>,[Gpong7@$qO,oHnUK/gl(QTg!(lH!)Q]AmYUV[VE=BDZkNg,NO7b]Ai*/<1c&^U5` +NB7':%pc/_-UA3sIpc +^A%AtBpl:<&^FDb.QAoFd0Q4X"p+=:l@G.4?V,J,T6:aY*\6`\uU<&.INEDXLEeE`T<4IY-PVDr4/FN(2\Vl#I;1:I4_fN=a@o/k(S@o;`1D^.H8408UAT8(c;;;gTFsG#33QK>K%5D8V1E5$)r]A +QJBF9SSY6+UWhbfun)EVI(%Qq54g*R7KnYGTQbO#=,59bOp^0a)LlL-'L6:3fr-V_"-n(;9Ek*HhA0(T +:J>T/f6'b.Q.Lmi8<$HED<^3)U6]ANr>1^Y3B*,8'd_3-Kh'[K\J$go]AfGKqdT7bTXkEfus*i +=\#h'cP2aA.l)u`3T$hV]AV=aN2BtbFs3QZ@7DaP3$8$oR/Q7B!6WT+8>Hb6ANl25`>2_9E&-GL$;Yhn&^RhW:4VJ7r85,/TIWs"Z+oFl +>lCFYse;c7KnbpD!,R<<2U7K*/sUC^Q&p',1@-4)CL_K),+GK\SCA&KE%+f4>[cbM[+8-M8I +G]AE9.P=q*g:'iU^VVj'R^qGO/ket:c[UXmdeK\f$=*p#)Zhm9PkLq.YWPF=Fg0th@[+5`sOB +%8tcc>JCM'gUW_#q!q'Ml8^CrM\$mV8Al+'6GKRWYJ0#9$tgI.@.9^F<@!?R5K!O@"&,ZjlY +Ol;nkBW2>?DTIhKM!:1ScGAPPYtdUnDG6aB,idWucF#u5L225HZ:qmS>:\>cf.Oi.8##Tj^B +s47tJHB\(!H<-i#'"@kfH@Pd>qu3s$YkTi19J8@QX0*R(pN\4h]A=YD5%`@Y`@/B<06q?^$b: +d>NNsW[Sd_@q(##51oBs2[WbZ]AD#gl-6*&eS2bYOS`bCjQ-XZ$9)#abCLL*P?V-gJ`:P6<7, +f,%2$idb8N]AFj;dtum'NV.\po#:fD86^85KC(b8:d98tUg7T:IBT.dhV0U[BnTD>9I:W&5=(!*K5b%VnruUJ+#]AX%haMgWTh:nVBi- +p?O+$V//fJb$*2;2QM/'>$3FjY`lN0@48moUOtB:rk'aV`kDMqGZae83DeZeO#EiB]AYl7Ln=M4Tsr]AAE=*;LpIub4F +TVBg9%u*n2;7&lhD\Wh9lJJ:-5N(TITpEhtncn@,b72B-hEe`lKQmSd:iAiVY3YCajAkA/t% +488pc%3Zn1pB8Z?fefP$rReQ?Ro_;hrrn`+5oYoC$^[OQ1T._da +Y:C6jEn=FZLGf1h5c>>i;]AVNBm+A9W]A]AsQm6%aU>]Asa6^VL7]AQnk*2"5[M?Fl)6^\3B;Nr[: +`QcmkQ*C0gQJ65_pr>8O!K741N<3/BI2i\1;5J9(*8^`N-&I`%^l_J +$V_<9N?qmN8X(BHoBhpA^XYit$N,8U]AUb&o. +B2@g/j-%IQB,9uA#h!"q9%__Et2q:q<2E_s' +6N^k=6lVGCaV.(8s-2-`\TBh'H4/KT&QH&8e`e$>Qr+7r1lodL:;'6Dt`p#_*5X2!"PUTDjV +%o1)M[P(a#DcS@HqVE&&rgINEciqP<9j'^a5O@4YF-RfI9kZeU)uVTS9X)b!GKu0or@(E0kP +Eh5p#as&u6R*l27UTRuL>4NCrH6"EF;GKt^J_*,u=`Gn'flZC]A ++?L91&9rZfkEEK`e6)nc.uW%t.ik]A$p(D:Q\s1_RF>Q^`/+-.Cr_a"`]Aa\+3$m6_1d8mYmcS +MF&3:C!JqqRZ(Xml)ebqdQ"4oIo=X7q]A0#d2hIKV@OleWm9>3AaGB.-M76ot>L +%a_T2S?1mMD"(]As"#s.@^eE:jaq70(iNUROoN3@1id(r+@'ptM^KYE8S:&ZF'fIQgN_Weu\Z +q\Z7<41t]AW3%(t+93"*]AG[^-3]A(qXIYC8f"i:"6Mm:O"W2sfAl_!G@a]A\'(` +HK^l:3T>&+ZM&aZU6ea(/3V8&rUnjes4DtH=WU^^n&-_:SJtUqbh]A[``+mb*l691haj9_jf, +n/^!=0GlWSc3i>o0tcu`NK#t;h`?mMP#q4]AA/V&D?:p-L=G+O8"8M5IqFi7slC3gVh%181sc/@/)-@N-PVr.(PG6Q1,(sot')DqtKN$?nsot'f!Lj\B+,"V,rT..,W"g&]A_8'5+iBGr:i(N\>T\8U2sUW) +6@fF/]AT0%ZjWG#^%5^F7)2E#4g\H:S*;:9q-dU#2>AQ@Y%(A72%53M*DSZo'e^1lQ\[=k"WlbQgCjZEgd6gstbs +o9u(1fi$NcWu/Q?.d??'1g^4*Qi-G1c;-lo,BQM0=`fB:M%)Jka]AlWVLh4S#n&c7XTU66JI, +KI[m;`u:fc9U7R'SM+$\#mP)\C#'o9?O2kj,Kl'bh@RNiZeZW#'+44JbO9-*O8dC1,<2bf2f +"lK;H3iA$YQO;<64MJ1.I_-(63B"=X +_2GQ[o@CO1ae5oA0l/;\*`)5Y^4LhbPI03_9\8[Nt.[:ac7,P(81,5eJ[!-&\7"&@k'nWsDt;ehgR-pq1IM9jO8-%Lo-1TF+$@nP>eK`mRE-e2B +U9PYK_lIf)ufAVTbJXa>&dfgdBPE;_5is'q>#:Z`]AHKWm%%jP2l>9?;QoZfZDf8dTXJEoo#K +7\HX%Wt8RK>k%n#+`&-uMep`gaKIH'hMPdW4bf@`-mTWu^'39(f&1CNuaG_pDs-T.W>7Er2l +H)k0I#B:l:r7e&GOi@'VNk_F>f[N^\(hoemIfOTVkQ&EKDteteL.Z#hDOrsF0sORGj4.6Cm<7=n*G3,"b#W\t6,@:1p[051KKH2U=rdrWrB,Elu?u.s(fh1i;Z5W]A>S5s0a>r1g^1W4Mf_2=el'_@FGPh]AI$h;Y# +dq>fDCi;930'P';#8djh]A!Q=&2MP7Q'/`.H5'A3,stt!OoAlM +.%Bf";c?J+4i6dR\e\3Jt*5oY+t$K=:"4gQPiN=j!hc+nnCf4f<8Pr5DE?(#"Z;gc)h5XkA1 +ecR4IX3=)!/n4Zm1EL0$,B:^_7;[qAn='*$W-PrHn]Ao'_YGTifL[gBirk3jaYlWM9FG/jW<9 +pburppb<#9_LeWr[E2n3[*I-#>@);c''pY\*a'_Nk?:rD/Vm?/CDLArPH*g.:JTcVg=^m'`t +OpH9tNSQ@>("*;4oM'R:7[E5fVd#R0d;dY`>uFM=RJ-aVsmY2IrR!ku%JZ`OF^3qR!]At70qp +H!CBL2p&L1YRte[(Vd2h&mfj5UjlKHB*nLK?0T^tJ^/_Gl[kUK8H63VfD=C.*iUN)rVQcd/j +da!KFSNYsbKrNXmhlH+_k$ +Cg&`0<$??)FFR<>qgTaiZQW<0K@*d*Er>kU]AgZF/n#ca0jar;Ih[C0"A8m*`Or=/hhAMk(e< +q,iWOZ(iH!%SPkkJ>.;^4r\EniQjZK%T2o+QI5)]ADd)o$5Tc[gYMS\AT3gC$BoSQ.2r,>krurUkR]Apr]AT+8K6EPK]AH-F9#`. +7S2@eF@Cj]AIK"klTA:4METnueZ8an.9?qu[=&e"-83hB#dMEooK$WU&@nLPmY@gR5/,6tQ1I`j) +lCX?LS&oZVUP^Yt'99'Q#9,Uo6=eA(o)qm+W%#5_QI8a9r!2l%2o&3^BnN"bJZ%;uH7moOh! +4oW4_Sahg*ae"2r-OHjPAj9dcCWk/%R5&&BjD/i]A"_[!caI +U_$e*k,_Xg>'8cHMjp,^"(VKIjh%ND,8pX*+N2AaA8Psm-QN1MDFEKH<"sR8do@s_ctGrJm* +CH.OHU(`@'C$^9ZYM&N^A4R=1&%R@Z=;Ag#FiW$`()caF:9!_W5R-8,+J:Bp83KO%bb\d8M& +49lQrH7haP3)_+5_3_m.4;SS6f90>L5nJ"R';!->eJ2?+TfTYj-tCl&f_$3G<>q+2!\T*.\P +5Up*Bp1m`7^[T<%dT$hUe[%o$Ik$!]A"WOj'poI>fulSRE&Po2($?HqPajXnT3#9IVsqEg<3k +t/@;=UbsYoB'gf@#o/L`l'0cg/bM?LSg/XaX$#'M*KHhBM*RqV2k":X#eXjW\-W)HoiJ[scb +Vp#Lm\+M7(H&8bA/mCT!NEf4rUu4/DPC`?.cQRGUIKuSZV#ZqEK1b+nO;bkUOP1HfCa7qk32 +_f,8oN1G3DB?^3ppnHicZ5eUE!J,0'l2KiLo:A,)jra4P,aMcHh;,20,o:8]A4gA0EC590R4< +!J-TIJ1tCa0Kg8(m?/@Hq,"mUWChT5XJ@2#RF?@rQ9N6<(sq"]A,.MsgEtlMmKlYHgIMOjN>#JSg?S]A%HeBerTLse^Y(_a)q^W:bd'2^H6G%?:L0,!H1BK'PnCdG +2/>QW++J1?CbSL,K(r]AFq5)"mkGMYc.5Fn_k-4W`RsG1'HeHAW+de]A0^_!XSIN(_]AA.-00cG +oCK6<.h\G,8e1pLu0T2U:N)2#%VdnG$Y5q\fYEk@YYIq!Z+/B<7X>F-SC91jEY5EQYn%D&/_ +)AoaMRXR8$ckAHd3\`f.A"E1;Z,`c\E)?K-.u]AV9)kP!=J9IYZE-`LH`PRl@h?nBFiD6_d]AT +FM66X:EE33`8Ff.TkOH(Phg0\JJ:EcK&?bX%(pQ&"9_Zt`g;8Y[#l5&gQ1s]A"/u%_?bApM#9l.'&*M +T;-I'[JdfnF.Ya_kK#NA&uB^ie(H9[n<[!QV&+*7T!n89G?IGM0&&=a)#6$KLf`-L6"o8Gm/ +n'inTWV)qHr(TAUooH(2?2MqoWMNR90"a&)1ADc[l?;A4>-$bl/@cK4iq;%c%l:3*2K(sV"; +h.SH1(,S?3n"^aJb"H2!YF^F*9/+hIe,Z?RRK0lP@Ci1-"=F&]AsIWpSU)eJr+fVAnGX+)`l. +W^;oOs`:54''p0$(&Iu^(d-G^ic'ZXiS?kDp/Tr#XlrB@X;cBU:X,fVcWnkE31Us0.ET]AK_F +;Mh!Lrc%7'!)?HFJje#Zt4q>MU*C2]AZsF=%qD'[b%E;6h`j72-@O=:\ERYqjGE"ZPj(GXCY, +5kG&jk&fcPh16i\aoR]Al><\?GV"PpU59)OnuX)S81kU@r2.@X2s5*?41@6R#jE%Xr%+(Oo`\ +N04ZX($m^IX&0&q:\]AZ9R/TO"e&A@*cTu-,ObLcE8A[s:&ZfEDklnkhT_lr(i$Er98SRbP=P2p( +pGpU#OMeYr[QWZ2k#LKc!"[PN+bS&g7h[tq!lg!4p1S1StoSM>VSU#-71n]A`2h&u4:8o$N3@ +AV;Ouf-3&m<'h)1!/7\1,H'tuf'4ub+N\k/F%FGX(GKTkO6S<3pA.fLHh\t*5q]AYEl\q&,[q +j<*IhK*=I.*H;jrZ/AV,LoO>um,-@#c6s27RRE[:0g3dNgs"^?TA!:le7]AC%TdBk?P*7ZEn" +X7a)+2V/KBo\e1F7e]AP*IkT;s,<7FA6B:039<]ASL%'(9?^I.`+`lH-K^MFun\EQ9Ym7oFJ)mLt=`*]ArHa#L[bNf7uY`N#_mJ2\pghC? +C(&.E"q_7Knm5@L>8&IK[A'[O=$4o4d!$F']A=FDP0Fi-KiCaM6k0*hJ[`2DjC]AY!`IDTl&\5 +;om,$7\K/pV/AHIV^C$f'D@"#[99'6C-):e`8ZD7\8'tlSllV.pus`$?siAg2%PQl;F66bc[ +ra#o#>sIDND=lVq43pJJ71_Bqb8pjg2#'CPM%.1+N,Y,INUX&oqd%relWNp;QG^tF7G\e))^ +:ql1g5R_-7a.kjjdg2@N>;gkZ@i.Pei^E"Z*]A019G+l2E<_.`-@[@tj*rT8d/bj*$8N;FRF_V/,VMY6`[X;['b>\@-*'ua=As1WmVV!IBL/?Kg"?6k.hOBup(;0,dY%%qb +<'/uZ'&d.W"M;,/jJa<>05[>P:552BgDk>ZmR%oJre*>Ys_t[qYEQ/Vi0ZoCPp\o5.FPoqWa +9EI#NsWeMQBQo<50Pu[gc,$;$6!*9/3o?9g.kqc9\:V=,\PIb`d#cs:*X>ItIJmp!'2HT/_9fKr!7Qm8ZsK +s(P/#:.BNi%9P$Xb=:6\/#UK%ri:NXb7!HuQM]A9PF7+D)IE#5JS&uTP2UP#=.&Jo(@qki)'- +)E7Edj4#B/-J"g&]At;6e!,tZpHVg(N:UX,Q><=&hc'D83hcnns8>[150OcmikXg*+ViYq4eH +nW8D#b]A\^DQDpB_\B6mF=HCEV?B.Z5%4ag>j800d1Z-q!rm$5^jAdF%J?,mlJVdMrmE'QmH[ +m?>bKC3g.GCC0j^3F%i*A%I[mmUId">L')$lPQ)G@:M%@C\WGDMVE_FrE3j&UK/]AVqS +k>=mmZ685>;IDG0_:i!HI%sGsd4LHJ\bX(t)p07GTqq8SH'V9aI-^q@cNKb[(#2,J%Lu(,&U +^Z@,\WQ_r=T>]Akoa+PZ!m(W.$D6Ep98R?'+7(";WY6S4ri.#c%5LWnb]A+E53C/g8:BHTMi/N +:4K?SX@en5D)&_**"TiQB\hH0K`L@UNE+&NS8frNP=0);RVC##eG^)1l$7/!.=i5Mf!D#s.6 +Jj&YF5&gkcjY[/;4r>Z_s*(]A.tiS)<9S%3'R*[W4a=C8(1>tkTN8*qi="sF2XD`[5lj*,3Co +=\/Vt'kiSHfTgtX`s(%5_'E"#nrk`?#[7BkO/;KJ'%Jf37)NeL4L$HW8:OK4#?((_.7\d+!!t0_g?"7*dL9Z +..fLjPt&mD#So0/DH7@:3HEV +R='*cqtK+.FIJL$4HH#ZqK_o4K/i'WS:DiEk.UHO<&59:r5@7)cDp`k'4]Al#*$7a3grmmA7bI +;+V#T\HEIQGa]A*U#-OR8qS4ob=Nbs?W1+Tc4tJ&:_o,$]AJ`kI^'Gf4V(c3`GY3iDL\diGr,S +U#[YeNUr\e&Z4b<0UCe=f3g0oC@ZGPXL(Z`=:Tt(gC$nW/*ZkE&p`r`( +n67F&DWpnWi*Qpe,@`l<;P%ZJ%T6*t^e)T=Q[_ll&UX46YPd7oroqA=Fg'Y=;*1V3UE#s!"[ +H%ubus(V56ITMM(+GM^1#lC=m@s6J3m.@WsE@T'XqH-gPt[9a)bM-'gT2"20p]A-5gori_>8# +UM.-GJ#LW:U[lqde^cnh4kH\UC)`6X"rH?ZgMJLHt]A/GiHfb5]At3kn-Tl$"PE(-pchRFD>dB +1]A\92ROlPb6hh3pB$O$D'PL?ACn_D9j"Dpku5q#_ukH#[r[q%H[31+ft,CPPp4+&fJrSL'TPh@ +iWTQZsH#:Y0oUd;iP8XC7,[o)AToA8e]AWAAC*BK.:IAXa-]A.T!h"e_3K.<)oq")WrM(^?T@K +DHmQSPHH3?B@%nsUAMKF4b5scng[NXg+9W[7/FiPO.,eSjgNoHYu2[N8OcFFdqJRir/uhqqaS(DdkqEo%5aHr=Rn-DaQFdND(Y[JPnT>u6N50W8#B'9Wn>,U2L&C\Z. +6,e!/gBk]As4.MNY_$XW#aHVhEBPXf0\?M^%IQ64`8hN%G>*c0i%SjrU&kM+tF\5bbXQBh^rl +(->1eOi?8>Wn'[b+:o_&EDc&_Z&h?%nTU]ATq&/l.BU%J;*KYoGgB=I +a/,"-l+fl,$NCP(W*Q\$Bf+nrQG88emAP[)AG%'k>QhuCRN+/:>d7prj-+Vr3?e-8pP`Y"8r +*&hGEqZt,WP1FOj#9J#KY`WmRMZE/E!hD@M*;'o!T`0"J1mq:XM:)ts4i2O,8l:78&tO$aES +S6`E"a5FjgG30MYHVHC4%fA58A1L1GP)CnqkTZgWce"%XH@?hJ*`MWfZrbp]AsYNM>6@=NYNY +kl,3^Z!5k>o5sLd/dtk?>Tj)M/Z_1>$+tka[,RH +-jg=@-CKV!F.!>7e>L4<%o=OF_0QYI>P&ljn%Q*1R\[Aj$en05-6fTrm`6,(OH4pF'`\U[>iqCbPI(OX:l@?bN?Vb +,C;D:3q[b.[J9*-ADICJ7\;4\1*S[#1m0P)CpbWjbE(F<(Ab[l'd.ZKD1p%G8NU3Z2)VefWL +Z%pH->iWDr6dKNFuA2<''u7]A*-X8a%e?/R.D-hUA#>qkChhs?To%aDaVr4l\:N4>!j/[q:+$ +J^LVQ)oAp,LVpFZ@kdcu*@@"1bC07)!pcCi*Oe"QmP0H1b44Ue4QO/[?m3g@ZO^1c@h\V>fK +19Ibs("9$,A4[,g$'SRr8N&q&7sk?7#hH&Zbo_lMhZrj[\lom'RtSd8b)UGao4O:<%D#=4G$ +9&!TE9eZR=WhN`CcO!Vtq\r=JitX*L_nrhbu6(>uSFg=Z#QBE:@h'`OeliT"-f'%bgie^oR^ +b>S&CgcIL:Fr6Rugtg65dt'H$O(U#[3kAXudg$OMb_:O1bi0d,pWbP1ZMbgL$L)& +WEl:LE.n?j!b:EtMfIS:[RBS.CD+_.Q^1>WmQ84)pmOGXQ?4n=oq^pbZG/CHMqrWb#XUAnH4 +O@H's3j]AL49Cfd"#GK=cr/c/f3;N#>h"e:mg.qrd4AHe,dm +HgAF?63ptJ[^je*FCr/Ou_ig#^k0j<`D($-P)nfUs1hNdV1 +opeTF8HJ)b!h'jJ?!U`sNn/L]AH_bl+S!DkWP(>s)W\%QGqVprY9(R)]AjdcTg +DIT^YhbjXIOWd"2r\[@lZ]A0(SK?(FIgAp"/P,:1q*:taZI1XRDuNsr@)23j_M;+?7ZNsk7bI +W'5X$0=H0D]AWZ%]AHoLaAV*[o748B.!#=a=g1Q'QV?KLnS[PC[7#,&J*Ekl!&1rQ#&bqY7sa5-0\X +mJZ%=IGXeo6=WP_O;/1qV>Pk=",SK1du=0Lm`Q)O +*1pqLPMYt`JALgnN+Z%b8b3Lp!.5:sPVRY/"o\qN_`:.MfUpn8!r\q20X,RKQ2>bBUY7rQ +fE;SX6fW,^$iK'RmjYT3P:[q"n(Kd!cTk.eH>9n/ +VZ,>JGXd_ja%cdfr*,XF87\%0;^6l5rJ@>SIYm'c4=ce?oCc(*pR?qc]A\7Fjbln_K43:E.KV +F=]AXMdoO976Hp1]A(^&/i,u@@2(pC'e$tPVian&c1]AOKH2ZF')(%o%;1nmn<>tTG&DaSoDR9N +e[4ZUB_od1@/Xfr?^F2l7mG,8-"P$-RU^Gt%P#U"#O86,YtqW?mR0HjJo3'L]A@Ss:"69c?(B +2&Lg0+Km*pA)hd3UjsRs#H;ce5:kM*OeIP/_Q2_1)$TRoj2Y3%sj\f+'r8"$8u5s +n"\TVnjVa2%_]A\9LXPK$@"o]A8^hUQ+`o4PagM&:4G8*c7dps6rNk*s^T!U=dTpdiA2r:O9i +l%d0dk[5(!WGZ^/*-dP3Dem!C4WK+_#HS6Dq9HU_j':(dT$H2WZZZWr1S+X,GLM6,_Jkk\FQ +&aqQQ,Ag[d+N((!ONZJ;;N2`hk/=i_[$jL$nYlqb53Vn]Am!Vgao2[NFsp%7X!8rW7H*3+\V0 +j;AF$*T;Wu.ni,gT'XW +MdX.FGoh#kB?FEtfPrq#rHqO,o?[4bf4P6VL$"1eg\C&W+Ia?bb;FFD>fA&GM#.2a-(_n32B +;21GSnP*fG@*>jSGq05iQ6b,,IR'>@Vo:]A;g&44+f/POgTS\*4hO)H8Q*k:9q-k'SZ*[F1+L +TU%!3QC@&auiC61J/1!W*W%eH_p;q>@FeerH)J7BpT*@.8%urbjN]A4j+)\hbgZ9qIhqIhYEi:K]A+,dSdP;;njns4o6P$nT@RhcT]A^[4pl^f'#Y +?JEEa8aElYiTNoXd$bCCL^)G;\og2KZgffD#&e98t/V*sbFA$ArAH+%I86#Cf=(E(\P#I]AGI +F>(I("S@P/%4dM_9nmai:3QQ_Je*7tkhl[X/=%+-JDJlb$muQG?S9pI=TIa:dod(p=AJ2El7 +;>Wo0L9A-&82qFkG;iVOHBkkE1*/c%J[Hus0kf88pg-P[;P@f-(P[;2ph=+[_H:[j)euJ[XN +#J?>Rcu&l-5T0F<$`tS$aguL[tTl:j0b>k]A\f<2*#3R2]AW4WC:8b# +,p9PangnTL<7#7Tf:`@WcR*KDg=Y&&@68'tK%KX4)SA^ +)_Z!3\Y@#&mqbO&hJ\!:A#*TT34-9J827#pgP`imi85>2S'RqAR)J337O:3-]AIjR3rB:p/A& ++Di%n\*oE[IIn&Ip]AOtMUDBk%Oaq?9<2,2@_bZA!`AbN!%EE`eh,?`S4aKH6R*h=4NbghWFd +9\mQPeM"+rs@\O+NT_6MaUFZh[T23]ATqTFWO\Pu[67'A;g\J?*-N5`eM'"HS/7@WEdgjm;V]A +`>Q,NO/]A+X?.DUu%UPB::q>!DnV?H\!O_&`7rIQ!#fj]A6q&(^Q&u\"hW8B$hl"*ApM;D2`L` +q/oG'qM[G4ai9%UW5M9nV=936f.QV4mq:NJJ4P^Z$@;'?L.Oj:@&BaY +&8s\3CNK)(>5-unP9f$t[ok-Xc]AkjN(+S\JU3c8>5i45hdl18,(&J5V3N"q#B%d:nSK0N96m#XR=]Ajq3uj_\XH0>fVG,QrbL(o^jQg[D4tTr7H7L]Ar/@6X/@7c^%E +BTC(="SI4qs`G%;^V%"sjN?C7:D4i/pb%+)'-,Zi<5S!&Ep,"s_lcFU1*Ba3e7SA+T(g(Ijj +e3YV5[eQ5g8D>=R]AF; +W3Qe/o:/3n>F+s-u-.5'JT)m/9;(`f*LV#OZq4M.PIeM;Kffp]AC+D&_R';#b=0m'lQ]Aibr +h[l?fn\P0p?1E+uW*+2sm3POt4=ruo]A +q:"Mn<*."rqQb/XB*B@XT%u+IKrmL]ATnGH?.]A(Hh8hb7lh6I^[9jk(p%&EKumBsi65]Aob'9q +?`V>@Z2S@j58C\88`cB33.!r%1O'kP8*oY(F@h_EQ_/^sl9J.D4)%j&WeQS$>%97u%7-k:9? +b_'_D^2o]ASOY3?0Fu.Bj8sK0(95aAMbS[_%,Z6(q3U8iD2>AaLt`a1`Z"fC?SRqtLc$l_/I$ +/2>*]AmlF0@l#`2()jKW[=XMqIGjF&gHT_'lZN`Q?q+0H*f5@:H6io&M.Q#Z[K6VYHe\-6j*N +8<>K"J/!Bqs7bthn-%G75>5D^`?o&;nnW"?Mm]A,?,SRh-U!=4pC0T$l?!^oC?AZ]A*ZJj"85VDL>s=W-JpVd6$>8p +`M<9nVo$h5]AT?6]Ao"MZr1-'jLY2Rq-6UPek%Amme%V"agTP@X. +hS!P@"\3\gOS#&?WEPOB'UPkiQA*t9]Am?fpeN"D1u)o>7XJ$uM53+n/fcDt5^&_6p\Y4rb6. +/+\U1qYS*WVl6Z#mu52)g]AN1]AhT;BRbrmsCp+CK,E+$/\YR!qj?&Kcjme6;RYk>E=F>+VmY4 +p]Ag#S\;Ir`rY$d\\F]AO=FhVmPu*!lj8F@=6U=#[4LD;#DA4ZkSZmuX/ipClT4SY& +3*2Zr5sAjJ/F;/\6`6+VJoFNIt.K65#<@Xr' +6?/`/fn/9M\f*l#tmU$]A.Hp05@;+P_*G-O]AB>\+)Xl4U'O$`St4#NY)fG"bG=O,QZG99RKif +5"5+W%]A7n+7:0$"D'U?GrPhj@\"hdD&6)s!L%03$1d&)HpBNCg^reP(td!s7EApc'9I3mk2` +o8b3RjCHm8'_G\S7)_,Pb?q0R%C?Gr[4"=m2h\fU8sKAP*C'[6T;BV458M$pTXWYpX<\ZnPR +oio_%lS)Wrp*e$!t6[4Xl>-$)[W1k-jRFN06P&!IS=(!U36[9QIrASgVC2Y0TLr7Ke0d2fVZ +#CTY=Q@#l4\DH>!]A!6Q>GX?da`eX>X4efTjXJrf/EM\8]AU)'b$KT_Re\Z/d3bSA_VS.36sMJ +N>#kf_Nc)<_JAPaL)&[%^.Um2N*41.m%B\>t@]AB&J_8bZf"Y#%qP8gY6b@BO)#>G+JQY_REo +cBBRO-$80=7AKrh99,2ZM$&;0'Pf^uM"9c"5&\\K1<*oKU_?KsH?l#&n\1ee1MbkNs1aAhB- +*rodcK.OOBPXaAQa=-e69S*92lU+ +<)MWR9M;EB1AK^O6XgXg/uHY`Wj]A(uo[Wn'mc\h!'r!MP]A(mGOQ):j*hjj":LbLC9[r&gZDT +ksFE%0ON;DA)p6gqkn%[@YAh8`MW9f,EfCf1,J!V0n,0#?7>N,q)POY]A.7kVbRg5C[Na8I7= +os2%_Z9F(RfAYE/,Xf^ug>`"#j)L^YD:LWo\IN6c9G`19$!'e;c20E@d!(uuddubhF46g9a@ +\Qe6i/[M2h;uIC0^u@<0l\Dr[C)!LN4/^&T^kZ&kQ<##'\p+DQQi\D_+H]A,5KgtE7lus1&\c +CG53<98(/$7I&3aj8ET2Xbd_2K[4);AiD+/#I=a"U/0l_4*p!,nYfnkR'#6GV)9V1-P\)e;= +'_9b_l=!?Sf]A_/TlH1jA2,0u_TBM:m^[;.;jeKN!j)gQ]A!#^g*&J]AFE9@2fYoKNjh=dHSb5" +_mUr%29:mkGRhb]AD0`J%5eJiea2\6?H\\"pQXSD4#t)^r\YV2P=gY2nBe>l3ghGT/[,U?W1# +I&(URU7u@pNOWkBoaAPD=6^"5rfuc4PABU,ngK^Hc74PnXZAZhrD+:@dI@mg)Phd2"0`0)_? +Ie69qfc@fn$ASJIGXF6cLY:f*-?O`A03io/M54D<8Eahce!L5HME=(bD0iQl&;"(]A +&fnLb?lrrjctBKT@9i3a%LkVl0"Eh`ksM'/HW5!slfpfRRD+>:,FN]Aa7$Y(),M@^Op'(T\k9 +u:]At7cCktg5QXb,'0sRts.3qsIb]Af-W-AtkA"r0- +hO+-Yrk*$4J9bg>r%T6*.>RWBNeaF_T3OGeS;jUjp6.B%7Y&F#Mk_'gZsn43IAba[\k]AU4-o +UO9E?JXE(g%_04hKG$tS\t4+8;L47+n\W:ub`2#P5:'sRm:[,UJk5J?H?I3(aqa%EJgaFURj +iV5,W9*(+>fB=O&+[UsU+4a@aeY\cgV>mg.EAX5QS(+5!#58M[D4*nNMi0YoA[%\[OI+kn=I +1p@ZiI^fqM^T#P%4qa,<=R5"5UK@Q4N[0Cr"5j?uEm_dWE+E7Us7-"W91ijQ!Jg!m +K-#e.W-5Kbe2:2YF'qa,qg:+%gs5H*mf\9O.Z;_GY)Nh@*`A:pT4\Gi9luWLiI3D8m`hV-=s +]AQm$=0;CNB_OT=i]A3650+!CK!bS`MUPMQ7r`ZoFl/tV%.`c*O6=)WRG))cRJg[[PfM'2h3h[ +n4E$)6b>Z_G6*\j"e(*+alKWq8PN)I.6q)$ZD@')"C)p-c:Rt+,)&fT*!AP +p%9U)?*Wd9m!Mdm\=DF4a^FmXjAg%Bg&JK6(:U\HQ^\1H)=M]A3a&jLeI' +G@=pr)5KV,B)rc8Kf6NP\G/\bnLi#7KfMmU4]AsogS@+@$Y^&&@O"PHpa-A@]A(IFC7L:&oDXV +&cIBPjr6;*+tJflcF]AP9ABTm6\TEOtE/pPPt;n#6):!LMBAuATRTYA/qZcaF9H]A32sJ;L+1/ +ea/t5*&!`ECqG^)Ia]A:l>gJ=>89MWT#'oc3Q[!3N&FM0)Kn\u&Da[ +uN.P3X;rjJ/^/FiMsEli`"d!2oM>T3e$l-A:O''Gto(eJ1)g>i\FC,]Af/r^GPoZU(nI"Yhjc +Sr[s+/8/248+,L!j!1`8IO;,)aXT(]AAD:N/?;P6_rsnu^MOcC8A8=B-;mN$INiScR%9m=W_3 +YY^7SJ.,lO]A_lV8^(pPb/VTL#+J5Z!?r_?Y"Xd`\=C]A;'a7sg&1-cZ4"0tII@f,'mH=uB^>5 +XFCsNm$*gJtNfM,*EFXc5[//70nb`o=O;DZCgm*j3a:eG0B0$RU%]AqLqt16=ocNuDRi3B,uM./[%I/=D'2;V3J +NaW@SU7@E&\2+_%Km)&LP'UYO5$9GU&&U.E4'Q)1U9&'m6YF:r]A\:Wi^!'fjsD:l/nokltdY +]AjTQ&%0W.St0;-HN<\Ms#Qn-,BA2K@c.q=LPfIje$)\qq9hn+6'1K[Zo0Wn;56^;:7AY_SJs +,jF]AQO[_;$ko5*=MF)K/0miE'q7p2N]AA?$=EP)X'@:"et=6[^=Mtdnf3N13rHP]A1DOX\7(n_ +,IhpHBCt*CH_1q$'$4FWV3,Y#,!9B3F1qhnRQgaKJ+oCO +:D!O8)CC?Cl6Oene90AQ%TEn\_,sQ\Bs$.VJa+[?d>s?9-K!`5JX.8D!k=p$5[p4[tU#m(%7 +lITl<2cI((M,g+5d>V9^+/C[oIWM):[6@j\$n_7@j%@fNS;7[E0SdA5AVW/ik'E.X,?"%/?d +qGU-:X`=$jXJ-lopN6@f]Ab(.kq#\aA`KP-nUQQZik>)Ab,8D6coK:BBDOAHbpS4]A"0l"Qr=%U/RSi(C?M?DNopL/HChD]A?G0.?7I$TV +S1fV34q5%TV/7:L-kI?ClQmXG;?8Tg<%D\YZoFi]AoC,\, +8Fu?s-eI#ojJV(:r?"JFq0cGT"U,BWSmj&hRMXEVb]As5SL%JaG)r^HbQLFu:(u"l%+fo'IPN +rFg:I(Fp$$f^B:t1)7?0An%bKp5FMXPOm9TU\%TS/c#jB#-G+`oYN97U?q2C+D85%*/R)r!E +i/,18Y4g^lXtS+oqMLJsbO\@JKtj]AJ,).T`,[slPW$4RYa+mp.Di==HVZ?4C-rpeedna#5=C +s4MhmYQ;1I(;,$6;EoSXc.8eTj&]AI5af=''MJ?^mFes=e%\[MSEaRG9]A:-jQ,CEg5Olq(_ot +e5'`_uDH!'3;ai\l"H0I!QiuUT,qC4RClh?A4ad%OPCUg5;V:=Y0k(^))e@cm26#L>Fe\fcV +Es%%C<_':MK]AqMm!=gj +McRu/#@kABI6H@0]A`WAmWNq\MFQlag^CceE3UK.ZKgqpP`RiZVSGWEiYIJbNI6Z%.6I*hGOW +Ks=):pj%QYp&9U$b]A?aT3D^Z%=jB4,]Aq&RCC0?dl'\.fWS.%jbK]ARU,M*>+3;nXLa:#`1kWV +HO!tJLY$"<-KCA9cU5V-3T:P@Ogse(TqqKDYibc(7+EE_d[8%%YjuRm_;G% +X&K[5Auo!l2(:\L['*]AqXk6kP/VEjjp +O]Ao@gqQFtD)*_?\4;NF)\(YS/fOWk,?`NqP(:"'A\8SQsV!KTP#OZAF<71ro+*fRQ"E`5'Kf +4WaIHG9RNJCt.FhOe;%[)B,'E3i3AsQt?REPJJQBL.#(Og14%V[!BbT>kJGi#JE1I::[bC/02PCRB`ID_<'9]Aen\D*R=b?acX3bEBX4BoL +r-:aibX`KreTAqa:lf&RsOs1N=D&%0=Db<,^hG_Vc1a-V$fX!n[sdV*ZK8K$I?fNQX.X4<=K +cQ&/U1FE+Tpa%\5Aj-gqYk#B[h8VD]A623t$Y_!*BEt&N?(;]A8,KVHb1]AN +GIQH%X[?)!_l`.4MM)E[^.6ui0?%=;gWbs!(XK,_pm6fp\\'.[R[^W'9o?n5!%)G>Y^B*/4< +H\JY3r]A;2B'l8r*l"e61gm$2>A;6DB%^!jf&.4TC^oZG*Y?_I=?N:QkLfedC[[VF.P)`"ZfZ +Xg34Y!/,!_9Zj0P7qZ47@TBinV:m)/X5e,H663*h[Lu&`G*t:&#:NcB!*Pn]APdhe@Lc.<\<`9,Y#W-pYVVeLI1=>/-oG&#tfRG?I`_p%ciYeQE2co4>RDU,9]A+PmE+.!u!nqo]AL"JP +2d)%IutY[FWU=@`okhY?@FQO8#rj!iKXWh^nO_>epJSGLLum9JVq5<@XT&'XDL1\gb_%h79: +^D5&-k'gm3<";j21fE)Q8NeZ:K77D94QG87aYjg9)BH,4s5p)2pM0kS#8@(aF5bd=LRCQ)C+ +p-c!7(i@3"s51f+%<1Rc)bY1`(Wuj`g\@K +17$(B%1ISn7fOL=#88Gp"*H9`\3!:opXMVkaMJb[MErlsedaB%CSV!BVl%+u:K'SP.=!$Wuo +r)ahd(:=5iVjUIf6:>6FjE4fQToSPYZJatO5I=XcA'\6.eAV$o!.ofSFpe3'.,0ki"=kPd1n +[o+*"!/=%7X$]A:AC*k+iSZ\.Z;3"=Pkc^nuT'lV+(;#o9[)Z+`B-:QDo=mgnmGpY7!Ue%OS` +bP7MJ!e6U2sA)j^r+;CnuHmYQ-)?SSDaf(rtG7*:0!]Aj)\6BFi[W:DfQYb[mPV;p=!GjL/=F +1B6-p<8JS?Nof\DZb1q*D=Sl!e3mBXPOsFVhb+Kn;L[gDp1+?i@8U:=B@A^1,TZR*6@B*$ubXr@, +,\nE*'ps@8+fC&m[at.'a`)ZVIDe58HPSZ"UH)#gPRf.eR0tXqp^2sedji_u%3T@9p('O:[q +>g[0_h`07^6'09WZfdqBc6FN7kIM2b2O:leFaT:QK]ANmFn*me,?Aq3%M.7:KJQY4Ug_[rDDu +KkSo5/1d0mkW:QSM]Af(V;CasaB-EgWXX,iGg69iGV`np2'W?DuJp@aA4N-jEnGOMU5YW987# +6?q6lj5Y^l0A^:XDtCFW#-7T>5J(dKNYbGn<"r$WUjkk4$#IT%C>"[CR)G\U"A#blda_C"mm +MJn_f+!-f+a$U:Mr9Rk@kYp)OOV6+dTnBrniAUZ1>gBB[76/88Z5PK^Ar6__(CH(g.R;Dl4]A +"/[kM\ojg=#b"e&A]A#b5ia1-S='Bq@O94b`ENc,r"%`Q/Y]AnCKRET@>ed%Jch8mg\=-co+=( +DQL;q*otQuZ23G:+mj/%$]A))JO(.B?Eg-]A7%5E=>_<"VC\2s\2#j'h6i/?K*#IK*+\ZtSJ!J +Me/OhWP-!J#L8&R^#%]Ae<%Bb&Ep$8kFlAF1D[Q`AA?3if4lqCf6OojG]AaMTs2>=K&UJubpk. +o"2O,jnj.ZF9$1(4a'1K^9=q6uH9Nok6o9S.dfc\"]AT@;tB#^&p1IAaW*tB&b"LY>mVE$%NU +'r9j(sQHFlS2heK8`Kl-`!kOqJKC0^a?921K)oZ]ASHQ+SWZ@38Cu]A_Gnagf48J:1e4j:>W*N +nQqB[C]AboWp=CJK-%A%A$k/md6(q$/Z"(iNZlOJU+E'Ub.!#a`JA>"u&[rp4`m;V0G!K[rj: +b-_L6T]A/Q,bi-Ci)VkIA\`&:'H0bZM#.@CfVu<02H.<]A17t]A`ZW"0p?n!l8p>^KhS"8e)[bt +TMA]A:j^V2gGrUTSGs1q$RX1o4:W7AB1j':^RL%:>"B0*r9[]AgVAjFc:7LV:B-3K:*!,<`-.W +gXN-pUhq)Eh*GH`u%@NkenbmP.E]A^T^FQ$B@.cl[MCX*>ZL[p;<3)f*7t1n=KMJFL(kSI9i8 +'BfESd/1h@iiZ>XksA`_,jHVGn2#,U3K@Da9oRbMqOD22N2VglQnCEbO-YMX?'n8!SQmHWE* +h62O+;L0p::"6l=#T.b?+5k?[m? +'DYFgeirP.l4s/kG?"1dR0BhmJ-Can[=\FACjTS$#f;g+)L\0pY>4=G:emkY#joLphVAt(KO +#>t,N>W06#T0115a7S#^(K]AW(UoXJZs>G4=tUlop&c\KZ#2Aa-kr\h]AdJlU?rY;b4G +K)pl%ZE?Sg%1Bd5#?MKhZRoR5?4c:CQ[:rT4HruDJ_CD4E1MFj9%>[Voa'&2JCZdDk[H!Z3# +CHk-koFX!/?D<5OQ#(Kn:ECT]A#iW3OHdT=BeTR?b9MDOsm@pOJ,:tS=qQik.)5.IZ#\@B9%5p0F$6V=0g+8qZA't'D?]Ahc[Y0FCi[I8:@;D+qjHn,)!%:5NT@l,> +-+#4aYY4 +,JkgVl4)^W39PY@YkT,>k:hL\M]AeraJ+R7b%kl$^>9_Q.E`6g!T08_1'9a&iOc#KpaN5Z%XW +E.Vp"G\cO6KJ(i=KU]AfZHkB'`V5fG>IPcHMOETS<5Nm7f499g+Z-n0he&*aD#7a:-HpEoEV" +g)u4]A\\7D!YB3/?sMlU$R$,)I;Y:Pot=Xoq50!;*\eu>$cQ3F5b_ZHk?"Jn)WFfgP5iQn6qC +"YJ,J"GOFO9om6.oH%ISP?0?IoW1'GIl]Aop<^oe +Crd^Z8[/oCe>`$@l\8T!9gc`ML%Tli#4%hCDnFP%jgUu>MOf<5h)`#BJ_E,"RL%iK<02oK.8 +lrtGtg8Ui;^M#X8]Au&6GCdH7A)VWjb`,S.+Fgp99Y!a-7fF;cT,'`$B%-=a=B4kk&XKYSfCM +Tu8g9*OL)ml/RV_!(`R`,*3i'kA;PgTeWoOGp#"p5q:*q4.Q6&s^M(U@;&CQhjNrmSt]A#Y\h +1#Ok4WB[4Yj##7ol"iob)PC]Ac +Z!\(8;ujK?:3;UR`B/e25LjB0<<`3LUGkt"0$gf3Zt!Y``1jBhX!$\;'T(Odec-KZ:8lj*^3 +aM%08o"t45\aN0EZIS9]A.BXub.U__nTK3q(BpG]A>0[\\]A4p"0J(ZJ=YLE*HYI."gtM&a[?ubP0oMhF"di?c3=3i8TVLXcr`?p]A/Pcel7WT$8> +Lm1p@8\T<$jVZiQZHi*"KQohFr+A=N1/^**umep0h]AXpgN'@Ltf\^=pMB$;n]A[,3?!ME*i&S +6oCnFg!%RC1N(<-`W8oo+7;3aN0.!LlR2$KfD\FM'4OJ\@T\ +*qs"du$,<=ql:_GYZDH^54B13MXn@@SegMg9-W-Xep(mN!"i?<d9/QoJ.NBpEPh9m>Eih9;$DB\5n',c:U]A$.Ne,3P4XPO[><=UoOO=uE]A]Auk/?6K +)?[[&N,_dYbi\Y(2F]Ab:$eM3j`,CKG$&^-n#+NXE[a\AcLri62uCD+(WH;G#(Zacb$d"HD.E0Fmt#^am<)hF\5;BQb(fDmhgMFpC"b+:S-2jLZp@^qVGb8(3 +*:!10*;Vp_q.8QkY73As@E)JV>nmDIR-1q;VilTV1t^*"oc&3U(]A`i6)4AYsVY2,o`>!E$X) +dGF+chD'ao=40)b)8_/*eNYA_V5;./PG8('IQ'QgWNOoam89N1f6qjnl]AD=)SrYm&f=?&i08 ++car*+aN2H+bF82J!s>Qh^(aC=oJJOuFmB#+&blt_;2/D:VU/2qih=Q>Q!^Y09LZp8bnseLQtL)?@B +H+@K`*$4dKVbA657?BH)\XEq:LiDN+CO_r81bbK;U1TR9+8ctoQ=a8KU^AjYS0Ld*@nc/3]AZ +#k`5u/`@IB\A/@`?72$N#fKK"`ug"-$^Sfk\%b*cdL95?IF33OA`AAo"gV%R"LsheYEG'-X/ +ANqMdAMa/S,`(r=;#Ic$?^6gU=MfUSE*dpRJ[BcM^/T)-F=(;l'5V]AY(Ea*]A#,i,buLjL_md +RCR:3O\6`n,&5ZGI3H\>-&jM(GI)Md]A;gn71q[5km<"s(U`mW;`SGj-=8)]Ab:a0RO*5Vr-#q +N-MS#k=!"4PlU-(^g.K^ePP%GP>Gb<"INu`E3L4@?*2ap!D.)r?CDRc-'r'-T>/R[Yo^"_uP +X)0gKA[/*(s)[M^>I!Z,`h7@l\QnsEdSFlftIC& +c_m_TD"L?t.Z+fP'rA7OLU"idLgb.oYLQe!Ob2*+a'F"\JOUh8H-gn3S%g;NUZ"I5C +n_%&&iCCHXF"s,+jRm:]A5[ue>/AefZ:"ug!tP6?/$6I:k*UqSek50ZTtIZ;_o5/mP:7c$[@n +c[kK>-g+?2Y,7`5C$HAUU!@7PCCE&agX'j.iO"=XQiXjfsCb6C*52+cEh!@?l1Dat%>LPJ2` +#2`aoT4J"b=T&0[13rH`]AiUdb.9(e9ogncfmSsqr'E4#)hqUGqq$fdnXO$<2+L)!?fR-_cAm +o]ARtjokP.ON)o'#K*;:_&"DjU;/>/POZ\`>=9\0d1RppJuUK1b#P?9.d5=k\-mXJ0hth6VRJ +q8tG\eUg0,5;OCW:Z=mK-5i`)cN-Wf-Vn4>Z3bG8K=n#Uc_+b2&,?M7K%+!rUij@f7COnu[q +,?0Ycr)aaRF.*KDQk;o&WYD>@pdrN04qS+-2qR'>o_:aKEb!#Kg@>]A/7JaQ'^C/0.)e4f7R8oG[G>+KZ/1hT$rN9';8+gF;7Uk,f^uhWb`Cj&=Uh!<[/3B1bM-:TG^S +^@UhSCTGe.a3:WNq-0ER8*37S^H3'?UX$OCq+&]A6]AX`qakEE-3OH9l'%MFq]AQ"6\5UPh+ePh +%V[!Fcjn6#+^1g;!T@c=ZV5G+fXqQHKTO:tQA,+"cC7%`Z<"^`X?2BM=5NPpfH`#hd%3#WMq +-C.HD9PR&nUGk%N?Itf,cPfpW"i37=Z8Gf&BAOM%QJp5VODr8ifH.fPLr=g,fc7ne0M($Hd3 +7t>?oc;Y8oG2&"#TSOM["6V;h`'QItPVG;1C?0)0I>rNh.:VBC@6$5qjiW379d%bT +/_>TE>C$ZQ-V^:`g:'O*-s?fELN$'Kr&#gk.cn-9j^^tML25[:_bBPS!9nH7D[Z0bK_olm+H +kJrV!ST.\/aH@?U2#TMHhYoguU$)$)mU2gc>@GjNV*3+%]AZPmX5*\-*gL@KC5b-*m^u"/,;C +/%S,TN$Q#EVL`nGu&;FeeF!lW;?c*W +eq?M\$I=9/1Z,D*;@[Eu)n6TO67Z:aR!MfC6(\:df]A5gpSR5D:SL@P$`1_U'dH;)Q.c1#lo" +j!h":elDB+AFnlrN/+7b2M+m'M+Em[W62;gYTkJ@pLmfX+N;T;=<]AG:UsVql0<^7*LG7rEoX +u;<:HDli8&Ul^UGM#.La5c"Yhk-;\Wm3E&mRg[R)pM9QZ/f1H\jh,VcYIotA^/nsV&p)TiYcF?4P-cVj-g(TSahr&ol(u55lKO\YJMTZ +S0Gg&&d]A@7,V?EqMD2*PhCZ"uIQOCm8*\`EHFAMn2=!!t3i<<5R`'%$a_[R$5lA"d4B8628K +eZ6Le?YnW2fIOmKlBujZk3<7Z#fI^LHd@0+CY?(Mh`YT2i6e05u]A\LTs/JOj*fXfA=2%8MKh +Hounj1jr5RBbQ$"W:7p;`(KYT]A9o*Vh[T=UNHPPbm-^k, +$f]ANFmG-qCCs7G.NlSnLMT;jr\^0B4QC\m.mhR.<=Jdk7-BhfLQo$)HhqrdUq(t8h8n7e@)$ +ft$V)b3$\.G18m,ZIC4MZ_q[P:)f!\*[_FCO)k]A9A3eeW[Sk +#dt[kuqJT[",!,MfW.d70/,hXU_RLVj5 +;cV(4MlfHP5m!BE+=;[LK.R34MGo#R83P9_]AMLMF&`G2kr!T`eYh6jm;!^unM)a^inC(?Fn" +4*(?XfK9`=s=T,'Md?M(0XLu2WBP%cD+J$[JGi@W^U4h_8(\K-rB)O'IB4ZtO???'h-_2'c!\Mu]AiKolWGK2sg/Tn-q*MPp]A>grY%r0@Pi`jTjP(C\$Q49aPCLk=;P4uNgW +.[!jOFD5QqLrpB2;YCH$SqOJ5,5W`KQmg'e]A#aSV#F8%B8V$C+H7f#Z_p)MQ#fUaf!R$ +dTJlQD`?Nk;/3HJi)A^G"0NQgS#ZIEq\AA^tU!5[j@BB_9'[-o_M[AE6jT;)Ja@pu/.L^"U* +lESE7Eg9EUi.+_g?f'S\_fUq>e[i;s'cf8B>bW0EPFX*s27Uk(gIB?X7o;A-8kZi3E8$!$L,jh>;Io\gGY +Zp8cd%0q)@@QHHUaB0*)[9l'SXPk@4q_>+mfK7,ER43gT;Sr0V,0Qj=i?=aKdq#7d4TZ>)m> +Bel/a'>sm\dccrorL[P^.Xh!+r7m-BRrZ`lLO` +r>iB6ZL,f(iin[cj^UH>L!u>s-lpIMD"[>,f5,gT!_Z=YtW;c=,m;o5_JHrG^EJh +`36O@X#@SH`2b7s#4DX3sqH1WN)g2f7,[%NDg,CHaA_)3EFcTAO3/o]A%TA]AH7h*&-Do>r49Ef=.8M;Y%uekY*nlEuBe#;cH.kCb +>6S>$<#`q"CVfPJmm5^iUWWdHpnS+rn)n^VQF`mODK3F9VWLR"+8?dSR]A-bj>rZVfnmJ%A\k%C/`W +s/QrZ57d3Fr$kIFiB31,J$,oKFQ8-,br/b;Nhq>(oiH/h^B,/9/^a2dp)nHJc'G_@3R5D8*Z +2Zc!Q7r;MK*[^mR$)6N[doEh0+gueK"rFG#i"iKD&mB)>mREn"JI_*SaW:la#emB4l'mj+gi +-/'B',T+>Tr\LZA1i>d\@RpIgB7g".B2rg7S%"?V$k`MA26++*-W6rie7\!)7C?%EiQc9\=; +Yb/bBaX3/LXe6RbiCmtpb/PFg4W!?tt.'T84SB.M$Clo[6GJ\VbpB_2`k>GJ/38M,dW0\*TG +_527Ye5`um,r)E74%uRabkO]A]A7"Ni\DCr. +iJdMQF,O17LRh41SjBHP\(=8N2Z1#GXmBS-h#qP:=cU8'[^8A+$=cJe. +`SLhb7Z6?Zf"=[Dl`jE_K^H`A`b9O#c;0YVQf,E(^@0Y6Wjq3>okWWJ>Cl#b7u>XAW">ra`8 +>m#cQeZ-d#lA`Xc-?9Rs??G:fdFc*(oEp9&.o>)P$dqrmZqsbVg%(Wh-oQ7[/Hd#">nQt/Q4 +7\T@4tefV9R%4p@98k*rWcpbGeGDZ*q&Hj!fM?;Z[`$uhK)dHe+1`ms5]AY8fW/"S:i=[&qAJ +T9cmokP3,i98bDWPP/SBYTR>^pJ"i;^13K^YF/(PaqY8%r;rY72k>uQ58Re!U]A*,'Epl0]A1[ +iLQ7HqI/><;EDj3S0%*h;q<>A\Z\MJD7h?Qi\(q67G"!XCVuhBnK\b3D=-`/H,W@JPWB42E- +$4=59)>#*=Db9l>aXHAX&FDbh12q@n?MZYM!kM&,mGG$iY-]A%aPdGl/"u;dE+.;Eem3rbSAFrZBOkK*^]A[^3;8&ZO)taXuCM'-8/]A%8l/X"'tUErL*LO,rB2 +?SPo;2Y8Wne&M:k,'If6k@%Yi7JVNid"NUmqbaT':W-cPs0Q*ST20+aC#jO^)Or9?JGAJ>&Y +^T#R`aBGK&lKXr0>f=OrkD-b,p4_7NpQAXR=-HH@d#1Lf^9G?WK=jRhoSp-e>cL#[^*3C\\3 +!SUpmK6&Z7T]AEkks3$Xo<(mh+@,@EQ-$[fL0rqF +"FE)1#MZIH)QDp+cWoK"NAb3NFaE\-MDrbmq%sZlnp1Tj:8cA%I&/F.f72C4jZdgEJC:0p-2 +IY$a9KPNfBaSa.Q_"LoX4JQs3``B&rRRK&4$;hIOfUBjG=02maK

AR%ilB(M=khV8^'FZo +6_L57cR=kc7R<(+A=-(/dDh.Dkg:W$?XFmh=sY"\pocQgfs1q6oRcs"o(r%/L<<+q;RNqSp' +ok65PudnMtOjZAVdJ/>ETuM(sr4t(RXN(8P)LBPnb$lFfbQH;,c+ss-$pHJpa\=V@Yi8@:bm@>]AmXJ`_LI +;\E5HF;pRG-!Mm1"+2S/=s"YB'IA9`pH5.cn(p"7MTX"BeFr\Y:&k!-k7Vm45SZ2unJu.c#. +2]ATmE(F@rGP)?D#6:P$"Y3+1=#`6*I0CeqnmLoo'9<:K +p@ZQN)J8oK*B,=FVWd(=2+=G4]As5nEi+?Qp+$%=LuoPaX@&rI0YVfVG#n+`9*ij\B7':bV#T_qq/T^%'sOpm+%E@*?09KVflYTZ?nIhO>$24$#EUL+:'[DOt +K06:#!-Ni6o;'nGS[\8+5s2TEPS\dQ9f4>Hl:2'/]ACpMLk[H,ira;q%e&3#C`-Zp(:+HQ2]Ac!CFg%o$=Ze7VYlQn*O'f[s2Hsu?cOk>'h_6tS +`TJP*bg@h]AVcDQS2&i3j`jq>p+1;q8$AD3;G.1tV,/*UfmjYP`%NmG!0]Apj,7eZdXcXIFq9n +Q@_ed(t@-P0?YY(g?jeqo/V[R/,V]AVEY_:A@+?DhrLf0aZV?53416?Lrq@d).JBT[I'" +36kkY2SVts4C?`rd?rN@dpHn93/&A+sBWZVCh('JEKXV$n\kJ,!(D4LrNJKHu9)YoQ/2Yf@6 +:Pc6Cq8cD4B10+[/auSo2]A4*IeY&M*mS#";)nnF<5Y^esng"H<[>ad0.Bn+^dqX9 +Ke,ikC)0VaK&cBo**V$u@D&)PZgW\M)\s)kg8.s>]AV:k0Ng"f+A+)qeYXPCJKj_SDa2jn/O5Tn@r)D\"F*[r;-0=&N?n36R +)%ITOiV4oePAUs9K!88,$a&pVS]A,-.cJ-]ARe6LOn$Dn9-D@08N&p+@aB42>C]APhgS`-DXN^H +fJYg^r"StAB;3[SZ5X`%\Z=bkX/fTB3;8fA=S'LL5i649lpFtWCWtF$Ch4F8"P<.g +58L]A`aA*?1r*#3d*>TZR&X"4V2]A%.pA6DZ:@UeVOe8`'"0KYBj(7uX$@.<'(SgW ++A\h@t6nc70!Z4*V[)ulgob\[--NHco/7Ib6qG-8$m`+G2IliYU_s_Lsi +AR'"Wh[dI44sSI,7ORXbKY,1JT)f#r4g!pbLV#F_\J?V:675%)@(gpg]A\0nUC^/.fLeQLrn2 +r!oQoH=-,=5j`WOQ]AKf'4AR7'"18?E]A?LlCkj@Ih;7_5T2K$7qFmAgW0t8!sjVd[-Z6!4F,A +Kf;j)gVM]AmbPuaCGTYct(F0e_QR"@#<M&:Ma1eP.>l;ASPpRSh!mk%O>As8O +-"nWB@\'br%#K*e+@!*R;>3XgIF^s="3o"\sDbEjkL$T#9+4E^>hnqu%ipbrrB:I#0%M;QL+ +ASLZlItS:mPA0=jJ=2)p8XZgUhs44"q>R-^qtEJ*Tf"`@Y6&_3qicH#TcXa:NR*r^]ACFhZ!! +~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ORBd!msjeaqh"##S9 +&;7^%^6-I6VN7'rdn0J;6jQ%0-CtPS@]A:!!)(,`1Ino3oUV`Q/huH#R2^!8o+;T*jjpllcf: +:i^H1/FhrsUq.gJ[kRTJDQ\q\2H@`,ZgE0'^T+q4U_+:4b&J@H)c_62UQ%@caaU6Q:[mX4c* +Z-tKOBG(i6.6K"3(`>Li>W8f8WWO(cb\BB2s^,1-2rB5D(E@7g[EmZ%LmcY +jK\,H;j%+-4`E*`eJo+_6Ns6g$*q=!`2g@I`?Nr49upH\TT*sGa2_sD#ZfC$,%h'iq[_)q]AH +#^iKE.b:gQj[1uQJ$%htiRlChh4E^jh)?:.>eMp@s/u_"DX#-B:R&DJqh]AZm=%tM(WbQ%#9=U\Y +*I8;d*bd^mWf0:'$Q6/`TK,KFD4?;9(;@*3P_r*!;$-2GloJ+7f0S@MIU"!SZs*OcRWW%]A,E +`V.1i;(E-=eWc*!.YVhZdFs;[[d5b0.7Z'H$VsV*r1kX_s%5,/u(Rcr'M]AhEqt<58+_BJ*03LI4@;J[=>`'l\#$uMqBE"rEF$Ohr9&T3g +RhJrGU!Gq-GI[LA`RRrgsM\(XVqfWg#u3s(c*9>*EP?sTJ`"oQJ;!.3,AlJ#p6h5nX5r4L4LALCa-A!tT)5"`* +tABaISK[$NehkOTcP6r#73H^Xd_+IrDAh![j]A(1`>Khq*"A7:9biXJ/of39r7P9oC&kSafH% +:BRZJ&P7gjJZ0S0')eUeFLkQjQ82:4QEB'a:_YnB!Zq-sF(PR>rB<;aqCV:L*e!nu$IHmWo9 +1hcdC29ouSI=!omTBNL2IUV7sZ3"qCIXa"j,O+B5EBiWJ0G<* +7]Aq7ilk;%bp&0l(mme2HCDI/rbXlHRR6F%\cGWJ>#$bHB3<>mKJCFYj=e[8&1kY+BfOhXVj-4ZmKB_.9t$GnZ=8_XBC) +6D([3j2$RIR)=JhZCC/>nU.gh,oS),-B!eN.W]A$WfIN5Fk-lE:>BcbW@plhRQqF,ZDJitr1SJ2e7ZL^b,9P26T/&2I +8Z`oIXEXFL^5JO"QAL$pQq@*GG`\c9>T@1\6D32M%Q?(Gi?I"IR/P&lIGZ$Eo)Aq]Atr"?9Mh +DNNDTi1A.!01FBe0Mh?,EU()0bA`a&G:;CEJ&kq/:Cp(ljS=RkMOPd,lgWFIR^%l=f7E9_;c +Mk?Sd"E@)EmD$BXMg&5@"KkrbXVOVs:1A>;pFg0M4H3@K]A3!JqjflUS6NKoCWFg>jKCD\p03:Orq9mTe^j8jUtWFDASV;d^V1S=NHB[Z)GMKjs0SU1"Md*lW5ZYNSV"]ARV:9EF+O3 +=\E5NSi?P)[kj+!qj+UHh#%(g*40R!;+?8m(eaUE?+h_Tq->P.\EtV-m`=[+S(-[;c`f%lu7 +i#WI'f1P/>s+10=doZVI8Me0^n9]AXR?02(\2oLFHYF.K#qp>6p>,j]A74DK78S,rirYRB]A9)^cpkU$&a@ +_fQ?cn)rjXqBp>R!'$9u/,(]A?ro=kB%[2f'j%Q#["Um(2W*E?N3(XtEI7a?,JHP+kNPjn.jY +`BF]Ano`UMc\%^eELO$AS2Jr7"9Z_Z`c47FP\/^L+iqF5+;)&r@88Yit*J$!OG;S:cPL<3PD, +j#j&ru-^FLC1-iJZADcl?H)AY\$`P8//$tb,TBo$(pK@ZO&qJ6l&P*gr4V_n#)Mo6r8SBd+K +8Z,KmB9u**[pC-'"+Z#<2B[a88%u^2NJ3=U,\B8We?ce![Oa[OKj5Y2K-Bt$Y$p'M%MPL#() +<7!.8NfWHZ<:)-kEqmPeMHE1T:sdTB?qMPG[!qPgUj'q-=PcTiBBlOh@i0DI*BKh,*s?lg// +H`T43m)CRHW?MO6l86Ji6B[Y#et92.n-km18!io"IJYQ"%Bq8l^SP_pka?8;#pGr$O?-t!2r +0OE(/`DtIc&=[fdhccq#>\:leTm%#G&_\$CkK7'"R/mBfllVL.Im6^\#Tt7\ZckWn698'e:7 +=?$]ABT"^5g>%63(5%!nr,'ars/ +!Xs#GMqJfeSVC$KdF!W<&?"4)Xs)$Y;Jh"(Wiri1,'1ge9kckPC,9Vu1M-![KlubU6qS><2b +a6Z50JW;#r=eT@%!p>Y_',^KE2.<7_TOOOeBPOaW"-rW\J4JfN;K1P^_02cTq_fS7<<9op&L +mo'pl($Bq_C3'/]A,!V.nA60&o_TAV3i7MV.s2hkSIS[m%>#Og5c7B,MpmZ;kd4t+j@ +b'W+-dIka_i'<;Xb+Va8r?P%!,5PJF`o',IKI%XMA$mlc_mNFYD4DGC2mFW74IFR:.'gHbf\b?09a"5%15mp+hB[:QF%8eC=.@\.h#)3C>@K4V2M3>&r93\3MM6K1gQb*9iSl#DV\a="o.HmEIb@\>;2]A$q +@"cjjr9VD>2Q!WZ>=E-o\pqYi$u::n1dWag;rueF4GqP!)=Cp<8R)/9'+3pB'+*@[;iC9ndT +fYV^)SFQEgVo)mB@4>4<5Y?u6rRl2k:`5lN/9?G6.;AQ7c$&<>GRK6B:CjH6gYoJ=b]A +KL$Ig3;87XHN6eP=fn*p3`,XRAF(6e"TlGYocZ]Arj8*m\nHSk&4sCDMo +YFot5baAd'`Fc8B'?\!Oi2:;<6+M*ULVV8$D$IWOL0E%jlN=Lg7Q1:_GlV9>)`H6!7EJZKtT`P.289X!7h5m9ahJt'U +Ic8+LDuM3:(Zql7X,TQJ8-=%rQmdG"Hr!8_h1r8I]A^P5_VC;lm>hYPaU[:^)O>oD'-p1d^D5 +6#fMae.1V^0SW,eg**:f]A9T*5P,:iQY=00A! +E20ds\1$oVg:GmrJtWP,LU67s%_$lADbkdmubdjBjGD^c/OW4Te^dqE +EYMceV06?U'1\\Ir7fIW<^j+ +1oJ'5:-a6NFKXr\dZ#_$=Uj/+Or?00JNP]A?#2^sD@6LOfd_-"/@e'BP^,F+Y +XjY;>"t='%D)K1sO>9u*,$KTnA;-uJf]A;j\0@PV`q=,(8(BN3[C9_LO +V/(._8<@k=uX)#Jap3,uBE,%'=#_-*3m?>>4f[f6k;#9dg%JFVMN^XUkT=/V80_7hed!e07QiW!:0g>Jo]Ao"`gh]A.j2>CS.h"7rY[pJaqouY3W** +$_*cOZ*:4r$Fe_JjEJg9!`78$1a7GkT*jVjUCl:EbC@2ps3:q3q=CZ"@skWDq +#NAiZCr4$I[`Y:0]A`\fo1L9;6`Vc,.'_Q_a7TT%DUa8`C6?QidHVGYBkCQj7`b9[62]A[DSI; +Ot,)W,agJO"h[>]A^.dRlNn+@3;6q05ulfR+V@#a\/\bfmL\,Ep(V&sE5UX2\UTcfS%UCNF.d +/f14_)VSb8H<:M1-g:Y#*dAn?qD%n5auOVrY_(M^IdJEg(qIYr`$9;D5K0Bm9K%6.-jYA:T4 +MnbI$VOY)qo%!r,]A_60J5`L&^Ii5oNh`%D[f_6 +NT8M?Ic1YMB*E![($li!,h7UO'N=^O.&N$Zg2'?rS*AlZnE5o65TS?Z.[lL5T6;6,hiG1#F4 +gs%0^cloJh+8nqec'OL[l.1@5^G`iON@dZ3c..AV +?2/f%!I:!E2@[TjB.Id-*!Se8hdAiGskrBn[_b)r)il`M6--0T7p]AkPT,^8A!!jkOJ.btMK` +]AZI4+\%TWoEaOr9oF/D]AlB?Ge3f>kkf'g3K +?C9)K>T&JOGd^6I?!`qC[gNm@.a"C$$n?DmOs1FV- +urMr"#n3OPV"m'7a$0*fDZjHW\N#uXLE6[h5<=Z[E\CUB!`!(6c9o.GaRH.ir&iYqbfC,3F4 +]A,ZC&\T@D7CPlS.0C:m>-U2^WRAl*f2uAL9FqFK4N9ChF8F<3C!_C1-DDsaX\&47Qc)tcISj +RXI/2FL&!K$LQ9;mrN78W,WhfB=c+X4-h^`H%=bM?W8u$F1k4D.P2+qn&2DsCs.?`32G:-)h +Q8Nt1pK`J85CN,EOSRpCLa;uYX"et!QoZTcF$C%F59)$B7TIS>GOS?#S&&-V%`;()3^Z?T_D +K=j`(aP`UgMXfo'[O/CC&HDHJqIQ3tOo)WiML+SF55&NQm%Cq\QusN#8::*+)16-j13C?a=S +KmNbY`bBl_$>[fQ`G8QW"b&]AA;YRP/P)mA&+YQB7]A?bDi-jUsC7WCKN$"-'sZgI*g&5$VuAL +DFG_[GDG%h[dgG#Z(I;H,lg&?pK/:Z%QK>&EZH%Ial2P"7(u5;!H3n5?c=_)Z)%'``IC2*`L +Q;b[IS%$iYR4Uc[K!J+`U, +dh3_pRhe?A%fVTclgq+M8#7=A9epK8,#/h&ImY#0>\kW9:[q8fg&+36Dc&RY9h>`O/DU/^fs +-9G9!(H*j^X"b)*c)411'.?Fn+=^b2mR)k<4I*frtjfo\URXBb(TM:3Jni\!91iCKRn;9G:KrX6l0DZ +e3L)hMakcNoP!7V9\WZA4=^(M)-"\KZp9b?[Z_76[!&.@8=-Z72%loEgHbA4F.ucB70I/Glft/troWAas!B50l8,dJ-5P$-AS[:Y(Z@/BL^.&(eqdUBO +3KL1:ZqJPrYu90P68^fb++=K7:976Jf#>KjhnHr=UA#IJ4)aCu__67E=A5i2c5/]Abdcn.l"- +3%Vp58=eVtpXf$9X+@l]A[YX^K&V8d6).$,cmKSBB7sSOcj6@)>rn1GTD`3,&sh`@q3400(u$ +doq1p$/5i':RPhiA:["P(:/ +pt&kGJoDicn?da?3A:I%gIH=lo$s+&g9DRN8sb-ab`Ceb8$fU2crWLGk1I7j1K$^37F':Gl.HOA-#GQoTCKn\ +s1[IJK-N'3dDqQ]Ae%3Bg&LCTc:g*6of3Z3O',s0+:*4\X%\()SBn6DX6h%]A9S>.8=*>5'D8` +,$PK/b`)V=TBr.mVB:([!JN:L1:2:0jNq,$^%pcmVsg"ACcMg1d8b[Ttsc^?j`ARBKJl-Yau +C+T6PA*a,'>L4sUXc$Z)^[jZ2!pYL-n+ILQI&iji@#1+sQ/nK4U_5t3)$eu,+JGm_D'If0nM +6:(6ZMP5d<'#R1NJB/(F?W]A^Hq1>U"2Hj;]ATLX,)c8'/&93^47!&0D6+ZUnlk,\KbKL_>;hW +CfJTb!";VT^TNBLNDr]A6>%ok'7q@4CE7^G2K`%`o(qA1@:RH"*s8H1 +"3$C1hQEjLNcE)j1)Q+/WauSad8"D\S4M7u +#NO/O.:BR6hCi9:GXDIc4?uC[M,I/f5h^S0FDl2^l,"YH]AT5Y)pm!++c?;#ZM/DFH5a66,b! +60oCFPF4YmlcgtpSkNL:O?N.X>(ot\6r1Hq5csK6OZUO<+*b)=TXUTf`EE:;'O +*tC8I$$-^VY^MirLW%*efklE%DQ&ZC@bbrK4J0_HmiS!g^=*W/B_q1kIH0Zql,BLdAVZ5[Fa +H1aUW5[R%o8(S=Mm^@'C$Y1KM*49sJJGT4WK<+3Bih?mfJCF"?GcpCJgA;5<1rY8Tei5">'R +$qO\Hi00:c!S'jUO?c+>+EFIb_HG!KgHss,UWaN\feb$.`@PU*O'BSLZg9?/F*0lO27uXj-j +1(32T)XqfOZ6*m)Xkq+l#I/Rs`O"oDEM76bMe<0ibZB\:J.5nSO,oY0S`U?L.jKpT9nDf>KI +!!nM>H;Kl&_LdMnUPFg;X->`NN]Ag>]AG+'uOEoO8Yj1sDEZ?99,Bfi@[)%&Gk0H=i&7)1oJGQ +]AUct9pO@igL_T*,SWE#7]AkCf@i@-s/8o9I*$Y"(p0/-ScP&FdEmm9Thi*G05nrKFJtWVn[dS +'f9.'_P)3VQU4+9KQgRW,TJ">RU1W+\9p.hf_.$mEQqbTs%P5n_BO/9"/,[SVljn3Q^C&_/j +kL!)PQ+hn7S3!-(*/NSn'up"P2-6l$D5$0A%PM6HKEV"u=BN)PDkWS_Hb/mtC+c9;fRD8LZm +g:__%e6XnH5G5$jbZr.";H4:-CkjcEhlEgqVM`aVFPFCNMjlfcSU0b +3gi,U=*q:b>,@t4):@dqd:$aRA)JJa:`oFAZI+Hs*]A0dqpGdcISD*J5!b%`b';KAa`0C,`e& +G7!=$Je=<3=LQrfITmi=ngQm)^nOq(l1g[bjiG1n7=X9)6Z3OiB`gR,JPF@0Q?tg"i+[?dBQ +f(.sbEnnMqaZEtJqrM:7;jo38]AJ2BfYrWSPT[H-0KpdnZk?+a-dK>DkPg,`HO4G ++IcFrC&f4S2GVLbGiE\6>@Rcr'jNQ7.k[XLEj0<3f%%rdoIe!TOm,Xlkmp@6!>/N+m"\AbE>on)6+;QNFh7 +[a?tMLm-efDQD/)[N'0skg;^dT'!NrNt&lM?Ug5uu6Vq4G +:a*B$^.]Ac9JF1(?u`^sD;gom;,(Lp^6hjA6R5,+&DHT?_p(j014nMPjjdW*3+:k!8\6+J?GY +-$>,f%k?ADs=Ta=XQ1aO6hom#EQ"c'.4I97``)CBBej``?!%^mC,0bC7.*!(IAS\PP+k*LMg +e2:)UEY;)HZHh+YM-!L&@1(INaH%YRQ(h.MAj.Zs)+8bi^5O2:%uJ!e<&N7%p,GulS5B4kl7 +;rVb-,]Ac-JqtKRNYnHtoH2M9pm^FZ_FqiP?_EJ[18C:r!f>=ImFil?[.R!4RC!g0%UIGioj(0`m'i'/2UEa8iW'ii^+=QPCIFD$17V +pGS)glZ'NT>Hj*%cp:9A,j$+QV/\-=?1sHNNBe+V2qDnk7MAZ(36OZJbs&i_ZLkde8AatO*V +R,$kn9"DO%bpg#1d%B"bGK9A1AY1Xeono=UGoW,=DrK[p1"'8LPJBc"kOeeTNoBXnP$?ObFi +G;TY`?V?$H*(GNH5huSF"E`E'fAU>@C;I]AIZXT>l#A]A*p;IKu*pp+hIl6o[+0pIjVr5IItq@ +0L!9`("$Jh=r>.b3as%f;[f8G4FW@K9Z?r\VrJ?>>H_!F!cH0ToP0bQlJ$q]A/*[Hs070(c3! +G\ZTX4:"?R_"upb3llVE/IAH5+: +PMpGWFPbPh@T>"#__i7'C.(Wn";R;1_o#LiE";Tl_sIcJs_823KWm':%TjmhdL!D0Qp,G0BNifPS':9\I +lb`sF]AN_%IBJi"(konAWpPbDO"@ltbEN?!-2t0o*g59lmSmBnVN)PS";$+!]AJY[eA=siT +Q>UcI"P%T<[dbkhI!_oqI$HU+0[4ZPYan>DnqcQfI5;I'7^Sd7B +Yr8kO8F%@p]AdFm%@gk^9!DXsB2^"2#:j^g,R2NH2orKD^]Ah4\Wqh5(.H0=SifVr6).js6;9l +nH=r[ErMV0X\&'3W^dkNq$7Zll]ADJ"Uga*E?cqWgiTa +0I-+WAu^AjF?K7qV>9nTed,5"CnJ/fci4`_GVPg[0e-4N-m:ETpPCcLaMgZag\=k[&!HHdA# +D46mNKc1WqmTF;rJ'cG[q25_A2.$r=)qI4q,#7cNI7#Y=NO\s6H;%1H9-\)!r++[Ba^BYUqd +trBjbn;5*86tRWm6iHh[5fj=5E5-Y+cM+PI;bdaqWbuEHiHN2s$gANkB;#)'+%lZg2-*&X;` +f(`XB(SF]A/_Sg +`L-D'l`.jh_fGDYYIIo(#\flW[G//G5P#Z:@?kWe5Uh7]A=VGe0Z'f)fgaCYU]A-P2UZ_e-e[` +@(BaCNa8+c@MYbk-Bs!Rg?g3,RZaTR&!UZ<17,)Ndk>_Pt*)9dQN7;HXfC(@@PubmuR6AWj< +1C^#\J+Ub+W\G#4r^asC&[@iK<8F4Wl%6o4+,ZV\<>(-Z\1-]AWnDUia_XP9klmSmj@r'>Vb[&_M.V=mDpP&L0Ijn=('a3:@Md!TA7`,tu>C<+^^`;q<"Pg%*7EjUhic*=(X=#kk&qJ"(N=V[eaj +=+P6;moOT]AFG5d-$7>5)h%$P$*X,=38LXiK2I*Qub.?*B&DEh.^pc,E[d=3qKW8WRGKd(PVf +B#gI,l![LqjbZCY3OU:`)KOVTA,odC]A5?RSC'&R&jA&5EgAM@\d>ZWIIe29b_rg1+Ka\uOtY +)iVJ&iFfI+DVqFD^`@dEZs_qcC!SI01]AsmE0r67;:AInp3aC@7=^1*e_"sc6mfe:%FpqNQD> +`T+o?!2QSN("oUT[aOhOa\E:E`[)[Y+mj'T%(cSffMIGLYm*)/AX!RX/\pj@;]A:X[[I9'0[_ +=ltWd]AQG_5@%Nos/BKO0aDpWV]AL"O(mR["G*&=[4((2BJ=dCW#Aj`D"22"W_g6hGFJM-]A:-j +7'Z/-QT'?"r&@IeN*sr8=DWiNXN9!Mnjf1/CW30JP6R23=H33,F7AMg6CTL#u&/*OeiG`YaD +ni"ae'&T:%(2S!Q^V$W%%K?Dkc#2>]A3F?Ej4NBpZ-;`$Xk^rc@rl\Z7FWJ=Pfu@jO4Lq^In]A +d?V:0)>4i3CC+\6R)[[3,b$p*^A9Q2mW%Ip^qoQTIK!b9WNn=7+ES+k,MLdF0CQdSU#gTX=h +4QN;@A*qJ9rQSISAXm=#PI:&5`1KBJ"9h0NSA#._M+AQiJ'([Uo90d[FXVfcHX7@%iQ.Eo*\?[%6&kh +'%eb$Ur;+.TNq%I%\8V'gHs4aiqgDZojJqC]AEQ6 +(0iT(!g*U5>e*GSL6-#?g]A1)Xsu\8jdj>Vfu_?7?TZ/:"Odun(b;P7>OU%gs0t!n,'agBFfG +I7NhdH+mZgS21?s'.4J:q1P;5^cY5eFlBI`o+MK&:K0O8[BP'F8S\5Rt<;0pH==#ShRm +\Y77@gn0!CgI?]A0FkhrZfq)bYKUs9d'+bPuOMqbk,qpQ=?\qW-s$ep"nX[iFW@jK1Ak)u3>h +Y1(Q8GPAc&m0IG$7;f`:VQ']AeO\6)i7Q!TNRV0'XU,G2=.LE.mOlr>_q?BR[o98fc#i]AEmf-qr"^eUpG3+i\D\e"I=0S$lML=jo;3[o.`?"$r$i:O0 +=mql6;KVL-'M?A&]A6h'M;o +4.og-f9qX2o=$POiRD]AW8MTe`>Go9ISt3(78Y(f*4IP6Ee%#%r$D^V* +>k4T07+#r<42]As=U?ok]AB,E1"2dc:7q6<;U9fRLofASc$B#/4^T&@;gISh4M,bj2fkA +0]ArjE4l&^e_A^TOGNALR*j$6gq.o9asE?MjL]AeQn,kg^F5fY-pBO;FmfF_2ti8="KSmlhX3n ++dQe35e0/(2iS^qIY70MNC5?55@d#YGL^3uVnX4gh1r(dU6V18$[64$)\b+E6H_r$h()kI6 +'HCXI#(GLdR5Ha&^r,pTJN+O\*u>ZcW5RW3)L8#WZ@&F!0AHV&WtS=*j2r5['Nq%&i0FA-)? +Uah]AMrP,Ff_p@LffY,@*Emtc5d\.:c>kBN=hPojHQAs.kr`9^YGXbp3V^Y)VlpIbbOok(+_t +E75Qn,@WTuDXd5]AXa(pjR9!_iOa>X0)A:0!,pJq8IP6L^bhjhckC'E=;KbFnka+_hm`1`c4g#@4,`>5*&Z +4()N<[j5)oX`9:2`5-!G2iT6J>4&c/06:8dNtDEW>'8T&P,UdmaHq)PkEb\UaZ(8O3aE*2#4 +BKC=U)%?`Cd9\25^u+T6]A_l?$OlOBlE4L+E2E+t;h*ZOk"7eSf,m8]A"mG.P>6pS/1:;H#P!% +df.eLp-mYAUOg'ZS9$EL!iltEs$`uIh`=qgc[lL8R'G]Ao-\UbZfl%b\31^N.Ah-U1^Qmel>_ +#6EY)`ncZQm9SQc\V'OCRm2@TUIb4cc*KCNo_3=73>Qnb^li/^FqCcHn-Ug&m_4;OG[N$hHD +"klDU6Vfa[q+A]AM2JKY7]AiAVLBn4He#\&lF8Up9X'j&5?Q4po>r(P_A8j0Z*gkU2i8C3 +5\!`7QAT$,-q(;c%g1MI%0gkBfJ=[ZA&k'Dk=T<;hNn-j5WtBY4+\f,+in"b[K8MV +a!G?trQljRDn'Jdj_,b`A!a"n#OI7rI?`6'&BKAHgU[NZ;S>lTY>,[nk;\^P&4om%>'VUN>$ +gb]AIMM]ARlV0a&QY#]AXN$jE1jkLOMjMhA>L\*Ns^LG_5=ODi]A7R1\QJu3]A#$F`hlS+>D]A;h'n +fMdO`Re31"HIsI!\U6HmmLmSNV]AQr$#;`Z6`+#'QX,p!@0V-C&;ZfhB8nu+,E]A;nuI_p3HR? +TIoL"Z1joY'm47]A4]A5BHM]AB\\r4O'96IU<" +o,3p@n3-\c.c+56?]A9.%@g>IUaWsV0XPtt@KStb?8&Cemq1=r-8bf_VZNs.R2HmhTg:U-PTI +3Lji4XsB7[1U;bcH4nkNZU(_(t_C,K%0M$T8rTKBjeTfAI.'QN0F@ehMQ4jd.@s.fj1P-[&- +"5QS5#Ek\GdsKp;&&+knHIR\2B!&g0E=pd&(n?j,(2g\KgV[hDH$eAWQ0Z':,=Ljri!69*-0N0*6q4Q,^lJ<)U[Q3u?upjDic1L +-X-1;OiDKb`4e;(WqpeM'Z2S,J'/%8i5@^r-)$lO50"F..\Ups/;4`BeALaO%>!$sL9 +!bTJc??KYg2!WQEN'ILVm:<<1,pk's8@oi"_FA`s@qs,?g_5!X]A",3R,?IQBrJYe/dFM0&k' +eak?45I[nK-VI:M2Z//dsh'M%WU"+CKH:&g^9-hlCEDT(jagi5K59D4!]Ab=/$qYj)**Zb8XH +YD372F33=@&q<)@;gQ*W8]AF$;$ele,/g*`VrSQn`&``"[/?X.[hkBI'1e[='9TKi[%!ROh +d4l`;\mY:Ue&:`PWI`7KHuanRAX.2(mf$525rA1g&mS!0k]A5fAmZHq#[X3qACBLPsPHU*RRI +/h$QKc/0>XFK55O=q%gi;-1DCbG+K2W0Gjs%foK+qh]A&YRt\aYp;j= +hkA[rFniB;9*3*^YIKfl=5b[0G'9YOiCOb4KKX*Q<7F]AFPDS9>Or:5k_/bYr<=.eJi^b&YBItR#5$u4)i=/rTnS1On +8kAQh63Xf>Ptm9d=,?8%5.C'\pZ ++bf5JhjXU]A_k1JREU*!:U%AaUiGd2SRCiEq'-NHb,XdiUf46X^$)'OK]A`*B(]Al2JYAdGDM +p87'?sq.pgg(l'Z#aj:>.tUHUZVnm_b=PWu\eo2*PNo'bJ!gmGpqCN3U%0_i/RUgp6=+(r`U +(fdJ$kH)$5ik(YfR<&V#A,6L/UL*>q&fq_k1N55p@.A*9I9's,p"Q;dGFAFMX*`hfpN. +J8q\s.,ck@M#Of`oJpeQ5.0"(J:n8WN@$:)cBU5Ro?rUZf1^@o\-H5o6e@Z?;/0H0QU.mn\^n:1&>k8Cq3gc$M;5D7`t! +4lg>nM>eU,K$dB_3HmO)\LGHi\s023je&]A7Psco'Di14b`q.dm[YUH'W^90g!nO+T/j4)V;MCjRs\+1op*WE6JkN/1a;K`:A4cH;EW6f+,lQh`EXC$$KD3R7Y +^7`7a?3"UaRnN696`CK,r;Xb`+P2Nf(pG^HG(upe*f@isj8VgY>FmdLdRrM]Ag.3k6\P,d!^R_ctY6Ib2\T90;qYL&g['#p3XXn1b"Q(">t?O1Cc +(Y96b_POZ;:cT0a5_nQ!ak#7*Q6Z;BA9Jk-d%k!/+VS@tMrp.JuqY4d8,!bK01[Z*6qn,D"^ +T#BJU'gD%'F\%JL(S"km(-ca\C[p+n=6M;9fujhA8X38H5ca(LpJ-Kphp]AJC42hSVH]A,03hn +OMF'FN$^85&X?A*h79K]A"[dh9O&HUQMXQ?Y1SD%:i35cM(Ikg/9Jd6f!a#7'g +``WZJ%M]AXaVoicOXoRg;GT'oIJcWLD878SVaT?*+[Q?AsX&@c6Gg9AkBpUoK$M):d-C"-sm> +f%/+UmOFqmMFb'?bTQZoT2?=S:)%dS_Q;Y:AObHn!oo`b6;(G+?#UC;tkSV/9aEk1dbsVPO? +`D1X@<_c4B@UdM&G95F#G]A)RFj9Ca/aG)M91ZQMHH^5=Wqnc?\f^$R%n=L\\]A=)9T!E9)m.0 +i\VeDo0Y*fCb5%<2\IE1(\2q`4nXHe0O=r'Q\>f3Q^;8hIT\^%FeAl_.;A7%W>YdbHH1=:qt +9N0c#0ZJPW!l2\03]ATLm`a(dce.4^2(.[G!/j^=4GlI'4"q%Mi(R(AperJoTZKkbC/4c6MoW +^:@4#2B,NLEDE#h-obF.B?N9eD^QNe(=@4'"bDactO:Qo'rm$LV;9EP.IlkR%q^7)(Wr@*\E +4BEX#NcH +:&Wnbh]A3m!>tG*Lp3$_u+trGJd%[pjt=N#qC4]AK^ZE*N&oS&:#leg8:P& +)$-2hr;#r^_si^Ua/-@s/e/@$lW+Eq#7EEVg@Q[4fdb*mPK-gPbB>3Bh*8G5@+ +iN:P[b[u@<*nBF-eQmXNXo+?G*r7L&gFFg"^oq#hq'cFt;gC_)kp&Y<-gR./ +U\Uf/R,t#1Cc:^\TF]A5ZCKc(MMn9D6JqQjL_`oq=MZm<%>)j-i>9KV +?\f!-7a!4jWcK<@DW$Emdr"&gcT_+n@Ob=$&'d*ctg/hK6b!NP;Gn5DI4a:-)D-5RFWW.2ei +P,o3R,mfh!Yc+A)A=T+uDKd7#/#WqDX5lanq2*$aqVIH(R2;#MmkJC(n82aHq'W!;SJhl3_6 +,i=A5_"+=Q>Wt3s:B4I)Q!69rS7Yq8guCRFVV^QInf;T$cc-V]A[pNr`@[GbpI.+AXLu$"Iru +U%-`!2q'pX59X:*miDWru?#B95S'si\D_qhd8$,o7g!hc>1_2a[l3Db]A<#SI;<;,VfDGLnch +"1BF81Ne1RGi>D;DrmQ +0.@4Q>uVcJ`c=QbbIr7*0[JmPgbjpM1-![g:N/;X9:iPD)h;Ml-s:9r@OO[GX.9!9Zac'+0RS:uZ]A +K(e<_JOsN(;6LXc=ib0;`/Tabt$:!-`?i^Z4NBD(G"qb&4\^#@BDr,sCE5$'Shj;Ti>1cpd# +Y-#qKCR,*Xjl7#\HY."&C&e@p(0t1l.6"g%kkd>hQI&gXgG.d\rS$nCaIZrImpNtb2#(g5s3 +?=d,>3#C\jOIfamPj@<35^kXn>$q'e34D.62]Al[iWacd`T-F#W:.AP:?8nbZ(=qHr!9*WrJ\ +llrMa^0g`4O^:2C5kBtq4Fs"^ +W,2IC._nglM\7-$rDUR6&\W[u(iM]AWfq#aT\&b"[/dK*6"2E28QQ4Y*T]A+2o%%^D2RKs60uc +AWlXhc5i%hM/OhUrH`((8A(nlOMtQ1o.^,^4n:bpi$u.c@r7;uZ?o_->aRepH4&O"pc#BQLO +fjkt/4RUFW7E'Z4SQ_JF@[%$(C2<[1DfpMR%;W7m4Sm+<7=X(W[C*N9uFTOm`H)E4a3VIM=0 +3?`%$:HO\dJ36c4/BbC5R\M! +@'Nc*kbp1;ZEdgfp:>op0J-6)2]AD`5(t@P6-$[A0jmeZZ[8k6:Xp`YOcQ2TmHLbT=1WAl[(^ +333;fPj*#^G9k/000Jn^08Rig@Cm'<@\*qZHND2/'l3m,S8')V%47j0R57(M';Wk1%H*,9'E +QuY92eN)SHTHan#:Qaop=mNi9iVEB^J$E#Z7)9]ADP(Kp&%?G5q12Mm8EtcO!X5Ik"_d!+K(.h.Vgo/Kag=C\tTXk$oqiVmtU/LI-Kn2j7LJ:ug[ +rMq!g>cJ-cc;I$Il/1Ih"qBq"")P\X??-X>@aQ6WQ9Occ[p:\3aiSL4YuI`8S))^ftE^ +bf6n/k(Z^0C]AE"Nh*:7LN-9*V36`Thm;]AIq%e#RpWUk*Fq$(e[.t4^0%#WF1SeTj)pgMoJmq +S?AcY6F73rBl;nYI:a[D^WYF_ij8mgq+.+H9d'iT]AmX<# +`!0Q.NFQV0ne1B^@@DZM'e/ij56YkLB`\$.6!3XE#1@13tM,@p&h=lM^S3d6Yn]A&i2R0i\bI +1-9#.9[VVc%\*UT`'"p#H5&;_?rIPE%GHW3r2a6Idp7t+NX.e'#K*f0R't;Iafc!(8,mT5(* +l^6jRo/Lt^Cb7I+_7#SkP,EOEf?X^6-ab%7f0e;S+`ies%1UZ6=;dsf`r"DQnV:*Rq +*E/^$-VR35f@n!VK5_0/Gh(Ko0r[)QdQSS$QMU?_=1n0;03A>-8N3k8s-I,04A%$q0Z?/dSg +nd'i6X/pA;$&S=Ha.T7,Wd-OoMKi5-/+H"\<7.6TJqJhg]A]AU.&^7V#R_104ohLsWqJE5\Wl7 +%ch\6;DTojVp`2Csd!*nj1(Q'C@F=7P=kO3BD@QeH%:o=AN-L?EZgrTIR,BaaH`C,3b=5ApU +d@`7iu;*dsPR'S#CHt__')HRTF.f]A4?lcanuG2qG/"oW;=9JqjkXt)@JREl+4/iWdnAK$GFj +l(0m#'fjBK'jaecb/_6F0EXD"p`OVSo2=!V@VL%fA=ZdOZOTbOTnuYou+=71S5X,r220Y'U]A +pWCNoZKX/;Di-2uqDBc5uG"/c$PFi%rZYH?7n1#LH%HXm57;U[RrKXR9iTs*2hR)\cg,kOKp +1[tl/&n=:"onnk]ARR!-sbY1UR>>JgL/="T=qnfA(kMijEP6FS>S7)[&*="+fFRG!khpZ)7'P +E=Cf<>h2Eh8oPB`_5#4cG5eT=YBIHA=G$dA7'Z<(E<_(X'qKdX;;!GKBl2dl%#V>ObhZ\ZUK +qa%Z$m]AKjtV5aeZF2_J8-,.dTUX8dnVqUO6VJ^NLN"S2#n?YDH.;#C^G9YScefMkY.XHMio9 +jJIQ3e@d,:>oCVVld.]AMlM^/*_K=&)?E-c*^M*J)+kg3Ta.Bh]A0SbM*_I"N!@\?>cCqjYa8m +QNL*<>r"ReA+qg1Q@HlUGbB?0<1?YbiCqJoOL7s]AkjE>`CBNO`U.ifjKg/?WKPTq/V]AqZHfG +NE$8ei;iDUQ[6ur1aNXDV.+q)Y.q*!#8dJ8kRm)%ZmW5^3_P?N/D`_lG:J>E_1*4I]A*4t]A8Z +q8)UkdStZj$CI4.gBf"gM,gg.P>5L[bt++<2C;Y^?!Zu0m>Ya +tmdt!+mHcHYOqugHU/aX%^;?t0=DI@LD4#3q+N=/8On0cEm(eFQK%E\Yk2UmY]A,+40VeNd/" +Glb>HnDq)2;sbQ^MsW#4r"KHHT@Jc9durP',hc)/-$>\F7J'4?[hT,iXTjk.%%.h0+63EN9= +#iZPC5[%gIZ*UfW,1rb$_?9OOm?dd3-HIs6lhE%?h,T\?$lhCl,o"[e_mKSd't^WQEp/aN)c +mrfIir)M6CNTH[Eb`M1kDs:i[AG9s9"tgGkj$s7LnF +;)>(_m!K\Am*(Fp+>C[`E]AaLV/rRAO4AN#j0bK+!Nj&2q-t\oWD!'G%ZT;2j#1bT-?47)(^8 +d!pBg^KH/YpMmLtZ^2i<%?tY8-=`>I(oG/FN"TdPilmHg0Mg"6/R=]AsAqmb.H`h]ADs58"+O; +4W!uN6V!g-t3k5=u$eknub)OpZ.3+_k9uT52Bp;XaoUerWa2;YB'ENJ^X81jF#@%H#=h4pgl +.RM3K$"UTP5J1kqR(\$WjU8pKeD/,`Pc/G)@1=6&G"YP,deD2`eHR2q[C,jYO[U)Pbs&n45f +-ri0(A_c@S=4hWAHA.(li&9P35'8/lp0XE\ccY=OX-niP.+TohgkLVS;-uLirk#^Yibdq^GO +h+jkpN9)Z*FLJ0"A>7Mo]A\q,]A4jbm/6(GfS#h#l`gj1h%KZRQTXo +V@ahl.8Q4urqG^PV"rB)-k77+F;jl@3L5-jR4`_ZaA)utAAWB35dg=3`0L0)-F +W0p]Ab&!j3YnQ\'Kq:VbriCn9MX;l>"%Z+LIg^tq,mYJic`4+HH+UGjFG#(6,(,o:=5Nh1bJW +VLelpA48p+oVHWFj;@H)i.LI$)e"@Eq-RU_^j>$@AO4DQBC9.'X,AGb89?]A%guV/l>EJRj_& +PAd6Ne";MW?HO?k_YA>lT\VB4p0KNjef%Soi/[X1[kl6B+O6iAi9H7))+`o'2d]A3aaf,"eS! +Q>fR[goeoRTMU]ACI``_.#'iK38/C$RWYn3rR7_^#8`TPQ")p`F*\m2F)'484%iOXc:T%+1(u +9cpGlj>MM#T\6d*f_1us]A*rc*QTdSc,>tF1?^;qW_I4m-seGg*[R)[WFnC&n\+/NqrGi.6,ereL9+EkJ6F7Uh_m*t=\\ELWjcD(Dh7,.bm]A(LnRK]A(El; +oFYe3M'BO&]A4M5-rA5+a^>Bi)Smj/XSuR:XVOM8n*JZi_hR>O?)%`#)95IrYoJ!lPJ0BaL=n +\R+V-c*KmiDas_s_LFafk>3HVFnq6,*ceBOt=2=:pFtNfe3c+f\lIOJZh3fagI@GddUrqk8FQm,#/rR!0biF +6nZ=H!-1qfO:m;15Jq7T*K.XXi=5Ro@mNn*&VQS>V%@@_IPSRk$->eME:(L+X:F9q3+eZ`HV5LFWU!#^0:0K>Vr7n?Y'<:eR0jKlgO'$GlPIUmnOlK?l*68Y`C!ogC(ZnUuo?`HLe\Y1<.;8+Fpp#nU?FSTd`kYa +i?/C#N8Y*QmS,bCOoO7eBqmnf>qOC2NpIKC?K1PZ*%SceUPZc@j`$\S0Z\"9)3*-aJ%,IIN' +Ia-I&Tk^G]A)g1!sJ_p<6$&Q#%Z40m9F[-=Ya2f]AF.8[+#3]AUO8hI72%WmCATY:LR8rP +26TeC+!97R."eBktQm0_MgW%]A+K+i3^_lk!#e2*_@;MQG%-CISY4:4`*.@5&RQ%.M1F`RoZ0 +go14G&aJ.h2SF&ud^DScs,nrn#^hCJP39UUFEPjD4$CnOCUlOW>1DdIL"a[:uiM%?#[/,616 +J6Q\a"KLWDW=eocD`m&*$45*H.lD@J.ilST3+A0=4-MUg]ApSYcWZ"Gm)Y/)FE2!#X+/tTh,b +*`C(l]A5FZb8DY-oBeK1GC$%1M(s/7rLO/=6@7msL]AW#@5lQnc/St39X.+OD)`PZm$CB\s04m +`G.hcRSb2pO:NJe,>-tWXV]AA$_OD\M\-&0W9IFm9Lug/CSj,`?Rn9+L7/$V#WUk-\qWe":T> +L;(WJSg97b;U\2hu$*hf,@]A[l'4u?Rt'_3f'hG +JH39$Y,j<1erq?XOrcUM$b#r<) +`CqmWA/38GO7.]A\aG25-TSUr445g':RO"\I2%>/()H5mfT=u1d#,BZ>T&%AUH%e2/r]A#FF5b +9<7eI-AkM,O%N:e:iP;_M'ImNJ-_h:+lJV#QV&P[QA(PL8eN1PjK_o;(sOJ)fRQhOfLCO-:[ +6N6\>npMrV,&:\:m1b%n#O)tkP(739RoM'D[N6VeMU*aY4SdONq?0DQS(s.s51PG +QeQ/W@J0u@(eI]AV#^b^U88#7MiOf6kmeb6h\44Jf)kpTHZjCDNT!%rGj#T%8P;Oq]A7qcRiWm +`KDl:mYc_93BC[;@"kD]A*Y^^q4a->^is&d9RHnk^?[pAo#ETB0Zk?[$rP,mP.Xjl0J;+r6ro(a* +=5t->U\H^n;9*(jC%l_E?)T_d7jf@hg/TK@p7`AKu9leCX'UjY&)o8%t"'Tu10+?L'NdA^M' +f%B?_LV^sgELPWW.,8?0JEX\'N_MW=9*_edmR4PRrbr[^_E\&;&-Ll*G%:@!.iq +O3p4Prt,(*;kd$e_#P\Xb_gr]AeT^PVS%k"Od=m@J'T?`qg]A/A9.)K6VeY>rrrQ=L[3E"&?Z6 +dd[W=mWE:WNlUG>\C'&7,2Bj2bNL(D"%6HI6,GKcsVVnF%GS\6Gq&biRNL5GE1A*B2G0q07` +O<>5H?/#t>ebrOHKGP]A4@U!r2`)qp>4#'!/RIA"JAi$/l:UgF?]A("8R0q1f[cmZa$bip5S!c*G0_LZ&+ +bRBlUo=M7X?F8@/KI)EZtL3`iW.,hM'ie5M?OhP)'H^I_fm=O^$I=D!:@J_Y-$f/ +\E/OD1EGl]A+8qfQQlq` +C+GG-51[#j+l+;%tZ$L#gLfW*4%<'bT50%L+8qZncsZP!2'YbD4Hk0e53YDYn#iVVLHU.miK +n4-%-pl0g6]A[VPo#'bVGDODG;B0AQeYk[31+71#eC-bBXf@uN*.N>F'5`Lu/?oSq*2E9?3b" +8_Ra;=ISb:(M\mZ`9:E%o_fpE:s*_PbCTjQG`YO)3TofCALo@oDc5OLJaBc&NgeZn^S:q\tJ?.N>XlIl=-ET8$Cd,iD>`<0?tY#c]AVSd`QV+?_]A&JKL7-\WeQG&gDpNUed4[ +Zn%OLjlbM'8H]AV1@58f)MrM]Ab&Niib7/:-h86Fe/OdMldoJ9,S_V+4-+N9>uJ`i)Q&@m[,p: +5_8;P`?Po44O8-t,JdWEBlZa!$*"!6@E5"E#/ff$Y>A[ichdit16e.qZf*dn&I/-o,80EiWh +P7auWE%Ou:AYr1;pmJ'$0Zc.JnJiq#"6mg*ii_%1Sa3p.ef<$Sra;MSZ'NrI(q>lKIU4:[YZ;q#62WB]A +J"%V,?4A$[2$s>0fX$Ml!l#M_6mL1KAd(A@A_IZ%=QC:ej4]Amlc!OJ,bQOl&2cPmf&Vpdi^P +$43mtmF[+n2N+8udM.a5CjWeu#pWoUMQXNWrWW=l/AaWs.=Ea^7Tsqo!PZbbHRis9*3)Xs>C +72N;%"LQQ.TUqidjY*qcD2'Zg+:T!`3dMI'Bu[a>P0%B+J)3ch2?[q,JS_d1pqRkH8tRiF3b +3iei.pSkPNuj]AMooN[KNE=4LN\i6J-r@aV*/5aX-jR3e+EOTQ,&b)42Rp=GSt,' +l@l2L0E3ckAibh>;cF5GdoESm_Is@R8PYBp>a&-nLWqL,8G'><+FPTH7ZLW@cs]A'ekMRrY#Y +j?_nXJ&M$Xd?GDT7>'k_EY%,2=1sdXcNr2b,%"]A-W*C(6k`a]A#7n&T_8>X?sd4AnEN<:b;Vn +s3\N0?s*>U]A%'BRpSBA6N?;2MMIr$gKGOn=Ye/2mCf^>W`;^uC0HkfmCN`m!lU"9YaOk!`&n +gG8Eq&!7q!`jqL397q;jiVN=XJ"XsD0`Ip+,))j2PQIq3tr7Don:q1t<#*;PfPc+5T`e,i:: +'5>!0[(Qrsmc2mK/_Z!&R`F/cLpn-hmru@:VAilIbnC[uVL_/O>qEk45jEt;feg@&T(V +ADu?jU,k%+q"%7P6]AYTtlbj-ejj(7lJ\o"N%[Mb.p2'i[`62l7Y^MHLP-_QF'pM+o\=!04tJ +qDBiD7`JjgQ4';'>HMmj`7SDF4E[X0t'9b(5Q6YiWKum%=CP!TF_U,D%YRD#Eo#>!K2`8m=6 +c\_0qn#NB5@HPM6[__IN'7u()TenD,-p)lT'T=8hcJ3g#E*"u\&cFB"1sXR?sX(d9N!E:GQ* +qk$GEJaGMi"bR,%j46`QXuPh%K2MflQeEaWI4L"f.)EX/\%6Z^=c_kAY35(93'PNW,ouPfkVfqXU.@=[%DgU'du:ZI@6Vc; +iBFSsk-hi'+4E[Pma1OX0g2`6ln^6,"KiR1^1==+i6N)dX"!c+fji'[jbgmVCMj>_Bi=mRZm +'E?[H-ebjrFF$$N&Zpla=N]AKE.+0RU'4!Gq/"-ePsgF;$$k32=SCdPg/*;.dqq%LAq- +AC'=4$_;@Gm$O,?nER#;Z$n +Ai#*ZNboQoklIWIB?Kb(\a;3U\a9.b`kH&/:_u\8AO+Xd0Gt_AdVW0t5_,[0^-1Yd-s/qdWN +*]A;,^FYja1Y5LJo(d@X:?1YkRYUNM"sAZ\lG;[HRd&Z?+qW540WpRoKnR58]At9P]A8lPoA>Xr +%:h9r;s6lj)VoI7O]A/+rRR5?^1A)[@!61$m?Rg0CR!^Ufm+9@q`,`S_e0'\/InASOA[4q'B= +jSSeUFTAIGAc-C?uW'Bqro3$XA_U8J,,'AgZ`<7r\X]A77u7(pj/,0L_+a*-Q57QD=c+fm&N! +b_*sTr[V]A)q!.KroMrWZ7Cnl2p)*"5(lq()RrJeX7h7h-SuZr1nOkr6nX@(s,5bTkQN +nS`b-9l9&GmXUibReRX)o/9A+5$;/jA=S&.THlS>%Rhq4!SY2cjkPG.jQC5u6`n[eW'BcnDq +W2-F!$_2*A;7[Q?'WY!K=irgoq.8;Ogj3n*okZiaI4h$Sfqo2Z;O*:XB_#%$rrG;aN,,oED2 +s^!%Q-'9[SDLOY4;JD\X*2i?(&0Q>??%DP1L5bIhuL_os\S#VAN +8g'C5i>D/2ggpL.k/HK/VWO/7/8;nHF#=j6c+Ik_::b!gi\Un#N;PFe@PWIHUL[ +1!D8(m@klCLsd3>Lf9]A&tb"(/3`s3t10/R6osq1u5Bh(d +Y+/>m8PY#0/gC>1-_dkrMH&'@$cjo^cCN]A!e51O?:WJ7L$DE33$A,+*)ZbGK#Ga^tp,ePq@4 +4,`>DLDaKM]A?cdPgASA0E.O60@-;92rY[=CD7^*a@&jR'3a2[']A5H>CFXoB)N"K*4J7cFVGJ +5/\o2QpcOrsOTYXA^dV!r7j!KCK0fhB5/Vrj")0Trk\/N;OR2o6J^dPW+*\(*-nB%uPFTWp7-sO+*"aquS`[s]As$k% +>IAm%@I1E.$@PLlC.ghFgKD(n]A@hJ&u_Y%#I3iAZe,J>JZ"$g:IFem5R58e]AW,M2!:c,J57" +4TS]A)KfAVVHiro?MIg1))/pF";!W-.]Agq%DTiU1"T7`NKB+J)@g+lI;5H25Hh%_#-r/nQSR; +C;K//_fiA[U,+o$20aFjT!TQI=+u*uoh)KtOGNd&,\j:m$3$'N).anbJk&\>/ifk.3.ih_6G +\+M0@VbpZm/`p4qUqoZO.c[Sa;;e6X6rC;kMk,m0t6tok*F'o(W+:]Asr@J3>4NdL6/BkBs@e +QT;#%A"Rk[u#T.`'7rrD5rKI8PMat<7m'uFFff.pm&a>Rf%XCPMIm+Je0#F8@#gt&h[8)Ang +h1mfV<6Z6Peo*7W1*gu4T4O/-ZuLSi2YnEPeI7/2[I,a@7qjY%Ei)6m2bNor^U]AOKpi%ntth +&nr;'.i?DJU9CPYWM*e5>N1:mm-sleH+@p!n>^Zh'.P$amBQc\PQIaK\da)[gW0`L:9LOaMQ +8!oVUM$OqZ]AASNi@hE#%^>m98!4johO?;eG!^=*kg2E1sbO&[&NG2P-V;F7DJI@!*JmlTA6h +SE^WXANd/-gY?OYFB/p!]A;>3_g\^.G3NcTR9rK!=$h)N=Tk1O@==\WReL/0 +/u'RI#>i=\aC;)i,"LlBSd!Sk:@'-=:A=0P8=[,55_3A)(7AZ$hr9Ll_9FH!4rODll0pY?24 +>`gNmDdPLr+ZpTY9)UkNYJo*-0:i0E>[nCR!bbqoagll0kAok65m0qNp"Cj#saT:YA`/RTdM +$kic%-^t8c%:rHros89Q5(&I9>KY`Vg7l?d$ +QsD9qrgm2%j +MEf2d7cKMlaI6HRc8V6;KfDbF"CU;"rUH[,k2I?j'<6/>Q'5?#IsWS:J%U+GE(%sTlP@sb!td&Qt[#3jKU4e0qbnfq@dW/G3e!GK +18k%%;?DL +JW-*"'@a%k8Ws6&LE/fCD(bj;]AXP:GoX2fSg+n?H:(%15>&GrJ/(_ln+S[oLJ]A14)aq&HR-. +8IE(?8e/.bULNi:APo!E^2eiZrgH5pl\^j2NtPb6_']AjsCf'enNc$R,E3h]Ak@3/`7/#C6[np +P?nbqSdRVI=G[P;o67sl4+Veo,3Z4J(#!A0d@h07eA)?jG*Ha1W:9(of&G_]AWqb=^CEc$eWd +-VLLNLmb$=p$ml[>h))CagQ!NUcqY.u*uPG]An;g?);79;0Xop`rp7E;+r?s.b!833bb\"*gG +qhUGQ*_NIS^nHK,X4^9%l-?7q)FYs@cJXSDBB\X+]A*UAk)YdA3f\h?F1VJUlMg/#"Rd8i(^n +kN2P%_rE5-tQ3.U%c<*"Co1NV4I''[Am/4.C>Ap7L3+nDikSRK%k=_b#K(rN)b#\A7j%Y%u^ +rDUf?qCdf!:=&%cVp,('7u=*i$Zm_pG;&XQAWhlA8de#)@oV)>"Z'sB^KZ1AkQ0<0$]A8U'R! +MY+H-[:%jaRm5<3`5b)MS+HC1>t3e,9\jicc=h`47iN3kV0k^4'IPtZ#G=MggTVKfR(I/b.Q +T5`[']Ah2I+^8`hki[7A#);o8DdN2U^gLcl2J+liL9ZhEk,/N=+6q"\7l8ds+S3`8BFX<;KJt +]A4t=O1\FY%I6LETe-D^!0X"^+;G3XA]A0Wn7eO(]APG`9?C/(I!.jH+%o#f..Ug.AN+0qc-<@M +587iD,b)^,H2>^UG6b#mKsR%YDZ+F;YZ\\>6tnjOr>1>V3^teSaL`QNG*4'3b1eQ]Abm#)BaM +ddf%oq'D&^&OQW%S\/=4AfXqG:U\rV9!_DW99=uHWIU`jA0#2MY5qT$"oeaDj[X2_+uhh5AL +pIg!l=VB*Qq.`c>`>4ho0MnX]A +?Ufs7@,@R'+(3GFc)^c0&HYu8p]AH\i/gLk:p?'gOELsjLhqFiY$H4SBLT +XnnG!=n(a6iJ"0VJ9k7NYkPpD*23`?ji9J)H%gMQ(f.$53!C#+*KGtc@Xr?EE!9*[F/VY.+W/ +UIi?*mrc-2dRN(A>DHj9RTFFSp\Qj4kqZE9B+h`K$p'l7.1iJjbn3mXa%buU9AJhJdu4N:gFT\t[+Zim7uUY%d +sGR^]A#[mN-JbqR$d*?.l?%Z%q?_UF40Vklq-$pcbI#k%PhrlC=0GX)'3Do76%O[pEon2i,ST +WJLmE%Zjb8?cR9&_T>2J.D!5#M?A/!]Ai2r3m#='RS8ACG`mOS-T#_oi_sQ@u^]AFstQ+EY>t: +_9f)Q2!$]AL\d$;>f;l_hUVshX)6-kP"ZNeK#q1l^3AoT@'#PXW[+pVY\bWJ]AqcW6e5OeW%?b +7jS@2Ud4>N0(Wi4EIUA/tl>)2=gc))G]AU=!bHAg;e;S.AgaW*%;]AELHqG1JtSsSA,J),pLEp +R+g@lGl'D?]Ab=N=_U.0(TI9'"84?E!ER,=W+6@4Y5d3li0e923N[%-#1bBJP')iZKP^T8aZ? +XkUHfe_[N'#Rke$!?i>d%3($/-Q:f='rB6&pROu1hi;km&m +8+cH^kd<(K/L?O&XBLZBN;8>jFas),k\D*>=G>[oShH$JPVcWsos"H35;0>FfU!5&%[%^rf> +Et&2!]A,$3\mC/R-WZK?`4@d3u[-#+ +,nED')_AkcLu6%W;:CLPI/P,V,5FDH-`+4/MMc_TMTporf-1>dO@r#UtJ/_-ItP*_i[7+Y6= +2VZHY2V:er2bG5grU37EH0Ds9G8sF\+:+Jar:&'$X@7jR5ZJe6u=gf:+>pc&MLR&*"`N%U-* +F5@X]Alq"Yd$#gf784lfDpp$t2&nV+aJV*G\hp@7dupjZ@S^Jg,5R)+1]ABJl&&n'B,\k*)8cA +.`WZ5h6DVI;-Zij(#W.d<)1+!bC^">ZsC/ceW5010FPgto`h8%HB&ke,7PU>e!8QWCaT57=U +8MmHV1/"2s=Ir:]A%u&K\i>+h((WD/ZPPX=.^bI[nak.ikhb!;nht(P23>\eiQ9j5V5^I4*n7 +RPc7`"(@Yj6NhLUDjl3UB6$n1DVu>lM+6^=YYENVC8\#tW2IMHYdR*/'N'^G\ERpUMm4U%$& +)A81?NqdbAHXZ41aT+9V.F^79U^?!I)875/I/mm@,rVl.X.J3"O5K7&7J_Vtl?r+C5CO./(h +KAk8DDmPhS1s.@I2i'F'-1,BFnQ?d:R>>(p9uoko5n>A+QK8[^@IQNDt#lS$%s/P^IIC#$'e +[qoktTU0cgFW5'_.oUDS@B0j&jf)Ced\*42kgW+dDPRJj0JV]A=_Q$[g!sU[&)C%)@=$,PUU# +s7k"b[Ja^Q^5'!KN&!8[O2bSkg&l)do0F*soAqUYQ/)j8!^o8$mEXMsK.Y'#I7'0J!@WE5.3 +DQJq!4o`o%ZhrF'#+N"SHK^4q9QR3O(qX/:VrPr)@J\!to(SWkq!@?E&NX2O1\jHlR"-_>Q/ +/cjDsrQ/L5n_m1Q/g?WCgR\HH]AE*l&q7VMOV9$F&M'h8([AW+e',NFP#=Pd)"%a,L3KN!ZX+ +C+K$:2Xd<*G`CG'36)XAAL&I.K(aG>Hm*99&629u1jC_.-$JHEhV*:$JITFL5;g93=kV +Ge(8YR9_F!S^t_1es\1/D\=dXa!]A^Sb`\;P48d`\pq:]A1@Y]A4a+/k!M*?[E"DZ,S\iRp=aOB +o2uGf==hE/*#$4M(>%c3(90H[5=NpW[dh/O$4gn^hDMk@KnEJ*,_h@]A#Ol1L\r4.LGe0V(cI +=Ynk1*=GqU9^XS%kGE`l)^hQ7lD!@45["KaQ.fu>?VuCUKh*+9tTk/84goPTsi +P$lfPWM88.*hsM0>6Z!PK[0sBcdODVH>`s,buS*RnM.Ur0p$`?l\b+T=$s!MW$/Tmi^(4E#,\JZRPOWT +*L6qnVPqGuG:q5o"+L7)5/D)-1@rC";UFr<3EqqqtFj>;RS,3I8Sp)=ZL(-c*sKeG3?7!F4)[c?"-2H/te`pFD2Ym(i+OpG,@!\@)HfsI)u +/aL/j9\hbaN;Us>+J2T-dMkn.HETRZ6.]AVLWk=A(f]ATc0[0 +U"1Cc]A:[YWE0?./!O% +X!A!Pg8+4^Y?L/jG4H)rdHaP9>+7MXfoVE03.Yc +\O=_%JDIPbp;Z%R%m2;n$LuqcdSqN8DI4V66kF*XiYC"5L%0;TnKE#%B_2*@5*=]A1')sPnPp +3HJlR8D*gm%e^iVd88?Kt)ej170Se?k2K;c-GVB_)+l^Jrpi1YEiOAM`B./X'>T#/%JORg"! +dr)t.X*bAHF7@g]A(S"P9kLn4K0TUMbp8_f1!2GNYiU`2g>D1TRqha_eL]AHFNhOR(2cqY3eABm$%->0gKoe_'Xltt\&&U);.XtY!t7ek!m*Y- +rl?(Z*aO+O`A8Z#4&[),da%BF\<]A]A+8Z^9A!QE%"f?]A>KGfmB*MDC+t#+^Dfkr%qm;LBKK7( +,,KlIk0ms'";]A.(?;O*U\)mc_eC$Zm_HRWLbEghX<)mpED"hMTEcinlM\bi7(LC^]AHUL[IQV +oa?dAP3qGATF43Pm;>`DH4\i.(sWYt_7Tn1!,u9f^fj(.[E8cK9'N>Rn+#?Wl*g-R`!F81P# +_&onST^UGR1U&7#F04@LD.*R]Ac$udB^eg.Xehtu:_aC++(QFBUX%$;cGNp(CG*X=Y_GN2>`Z +#B(R%>.iuO6<4^kgI5ZMA,KMk`?XT9XEJr5RN>[M8E%MdW@rPIc%K`A?$:U\p_e-Y#\8FN@6 +Lm[L8"%-"`jL]A"K07"hT$VC1j_D'FR +6FQP0A<;\s1?uW'WpcLp\Z).<4ppB83scFEW/YijajWS%8\Z/)`]A8EQ+ltAHf6_L\[;Uik?!ro=[8;M9pE@,McqXlp!_at&da)K +@7/7&1$@!$Ki!@tqLM3HCEL:nksc+s=EEQfm'0)e199&$Kl:g\=ILU6o'\p;*>Xc#&L +s2Fh;!?Tua#A:uRnO$\86[+cSKuL&6O"X<#U*;jTiO\ie3e%r5%E_eYf.ZA!"$X<&15N"_?:fa=jFqUSJm#1^p(p_>>`P*(7'- +324f2mWH00?A/-gdf0X?[>97N!$sXcq?-M*9PZp5q);e=tcCA+R"@:qYs7_I^U.)oA!QbN%Y +JH:.7QI:K^,/(rCr&"i/=C;H?dn&=Hq:r-;kX*Ns0OFmp:N9SK!k4MhL&T+]A"YoX0u(4Q$[( +pX?)6odNV!tg$U1dM)t(bSjbTcpmO]AV."H*0TZ]A=p`BnTq['?QekD_Eal +'T$X$7,Smb,5(N,MsbVR+=X2hpXXOCWfa^q0,.:ZE:i7K_DbPipmq"V<2Hjr+olM=?m1W&_ +MB`[`PaY+]Ac_I]ATJJO^T+:Jp1gC(-C,^'F-h_q=%eEd.%.+[XPnF&4l/tmF +>0oIGWkIb#PuPj;Wm^VbJN[[C%J=1kD#H8U(CI2S(K*AXNpk2\$HX_hpn4_I$/Y)V#.7M9'8N_$kSLkC8&(\1K)G?@N*DRah:*0=#Ya=&As? +^?-:!%OjJd.t%+1c,UcYKo=#m+1tMS"b,,LT?lX[iS6AW6$Z?2^G9[7%!_OWbba'fkCliM\A +!B:o7IY-Jr53?nl@uRR0]A*a&q-=^it%WER`PCg*l)F]A;fEQL=G$NYi@]AtDjDK=ACSiBTb.-Q +jJh95"2GKM9V"W/&)`cR151i17[$+&ZrS9n9paR/=\4k4`$@M)!(:AI?6(29)dUmoKDS&*=- +>]AE)CpH=bJZbTQ'YV7<%oDl52%]Aj%6Cn,2I03Dl(0Y@i]AEcf//b`Ok%kOLE>@1Dh]Ag"? +S/'K)eW?f\t.$T'F.)"[oo(T=c4QT77`g;ja"@:Jl/0:IaKX6BpT%_u4(1g-0s2qMIA5%erf +s85-5oL%P8[c=X;3N_k(gG0lgAJ>Jq>0l?u=V=S$?R>ZsWcaQSAsQ9,^,60Wi`l,"4l)MIZ- +MjpE$j)lp2umEDfaeUFa#*#g'Z5kgc8_4"#gchpu%9"IU9JRR.te1n@q*!H=$KP^li&Gj3ON +YXq\k;9MW6@`5VgIjHJP:,`Em_%b^T'/):R=aF/2=Y$YK]A6.lFu7(pbn5,SKol,.8*1nXTPO +`plg]A]AEYTKY[SsT7mRZlIS5Waq4=(s6NSJ*X&R;rTeRWC5>e\J&R2Ml$6.&o:K-j(;7N2]Ap= +pHs*Zm4VJa`3QV/nm.n@g4K8"i0;@)cEE[a6N7!2u9'g8h(4H>)%8T?mTJCSOTBNp +V@B!P$5?DoNJd!.fqf1jmfb:M?"5kaIX/q1(onUdAS]A]Aq,:2^e-M"V8^H;6 +s#5h4MBcN1Y/^e#00.?L_[,4VI:#=X*aMZWgApga$:2RgB7BA%Q3AXmHR+&L/MF]A"3E/,"c7 +(B8*PZ^H0iENn5mXOc1--aKl$.4UUtBX7N,_0$F;!V9"%LMrTB80@2JjLjed4!CW75O/8]A(K +WIS1:qZCYV2UDl"mq*Xb)ds2(VFF\7-F/s^rN?E +)>f/dIP(=dML_L?%jB3Q]A0784']AqWKmSK)?=#OSurn]A\(GEX,]Ab>L?tO+XF/GB""aVV2[MnLhlPFt3LtL3 +&@G.V^8m[Lp_X-c6_c1cX7IZ!$2l/0UX\T(KU]AsW8W*%'L\*Sapn@4bKmh2 +E]A2ukO$CNu!SXVRDc-@tPTp+7NHT`TaKF5:$!VQ;!T+h.b_iuZ=c^4#i(8OPaImCc"dG$mn, +893ZX_Tt+6YN?j27K.hRcijg_*k,m8'L6!uGBBXaA8=W9(2VG`b,%uBJf4n +dS>h#Hb56h4FFL;$e/s!i[qi#CkIN[Km:u\p#P#-a'cidO[@\bZ$Kms-Q/N=a+,Es6:S#)I2 +S%d!4qeSA.lP8XuFoZf]AIb09$Rg*2Hb]AA-6b2G_$>!o96cTtPX1JbS77SisN\ZP6,qp6jTr> +<%*">K;!3f4?WbP<+D:l2NC?*) +u[(3X&"l\WocQu;M"VaJ5H@CTEfc6=C,-4PJ2I%UddiS:8(>Y#'E70BP)fTYn% +:0p2TY1M"5TtcE56%FsHu\"j?$l,9r`7G3o-=ea_T>G$n0D#Xc3qC">Ujm!0fh687MH"?(08 +XY*nAf^`;ie-=)\9Me=2T`b\`@mR.TL5#Am\$bn+Gt +OP<3oiMr:J*Y-a^pX.<)8U^kLc>NDNugD!QPEBfED*+HuH4a\?qaN\Ks4'beIQ"5EgSY6>lBI#'RYID&2,d)7ZHZ +$Oa`Semf`LJQ]AcbD!Q-q$r61aG,G[QXY%^q]A%Ib^Jin+eEu@*Y$Xd$K,&?aZA9[>HiTcC$+^ +#ns8+%`o,lh]AXmD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Q!mg<7q=%_:Fh +N140D;!Jcchn>nN1C/`+Zna+aQKH"9SaY8G0+EHOL$,Ank'^8I*;UGI>n,G9FIlmZ(o)EkI]AUm6WpP*:p +p@:LU>f`H&'d]A;lB4@dW"@Y@.HbL`oE_TX*l9r^.J8d>2+O3LXBoBL2^V<:-R$b774P[) +R3LiaLClH?ej^=f2%R'R_5&/M[1R`2KDVdTC)cMZU/D%!hBT]Am.L"0S)-C%!]A)5j(Nql$hZ[ +um;_[EkNB.ukaEBeHb\^u>WN=QT7AFs74rA'*]AHr3J7G0l;;e!*VrGT"d5A4cs&=k\3OCGE, +i*+ofphb9f_AcpVfN^Ns44NW;6&\&N89j0s[2eABc<*aU;l-3k42etHs(\ZTTBNs6'`:gD0c +=;:?t[kZEZjTP$rCHMG#pVtkO$d,:cWT&"B7MC&&,&q^HZpliQR*jJc&9Y99K[;/eWS&$T9hK&X.TrCAY?'5+$Pam[RN= +phn/LphPbJJsX"Lf/(.Jg.ZekRO-Z^ +7Z)PgIAHF(B"1LuD5k!+e8+(c2E[1p_%,FMP><_N/8lW*`=n4G=mmA,cRT7Z. +,pZn)Wt[TO`L"n5g&"b5CiXcc&(N,-fMD5,^$&&^5,(0BM?U +m5(u(4ePnB10P,P.oS&9-\ka)AOsp$ddQOW2`Gqjb;o/V@)pnf*.*c>OJo)U8:u"3_rMsM9*WQ'^9)!=%+0W#ke),/m:bBr;2UYd%-]AkGsA92g=gSFN^Vs6%b +;ShVM*6m'#_(^%X!47%u+HuP'SUMmeru/!`,V;Qb9N+7p5)T7LT?c9=-.fTqSStkTMorcJQ_ +kH>)c5+u:0lSo%\)0Lp5&c+W?;*ck;\55L%KFb +0<)44;%JabOf\$`HS>^X$KQ`%4-o.X)EL_QtM[i2T:fQ/\n]A/hQ"6Xr**IFJ0AZhoktQl)_: +XH5ABDc!@As@c'.V6qkUGRH& +#i$dQ4/ib9M0P#C!%EeHa@bRY;m6>Z>e_i^nQYj:!s7!LfMU\ZU^rZObF>(P'NmE/\GnY$Vs +=Dj\BD$l>,02CB>P.E1dL7fkAR%K+q-^NS^>JcOZ)6pJkMCg`,um^BV'_s?7ef+Feq17^Xr( +;?#SR:CV2a(FaDo"?;)"'Lr#TuQL1gtX^*8iGEf"]A!=VB`0_8di,8rcsFd5^RhDNM^Lorn^#D +-Ip4R8.[&8(QnMH>t*+iLlmJHOHW!^lQ_a[M+\VEdq>o%YiSUu`C$jnT8Ac%V=5bCrrdEPVN +^m;r;OrODhPF;fWA[+W-7\-+GtMgjsU +c#:plL*%2U]A\7Vc2OD+!@%h;Fc1%P*Z6K)#6:>m1H2M#q4RRRn9HP4)cr(J/U`\1SWb"MnpL +Ih1:,VO1L1DDlhLJKge,5MS8mWR[9s!m)/!AGIP#.YRrJ:L-$;d^8Bf)4\IRQN0c/-lq1T2Q +JU[0#`\9UUo\g&(6*u==foo6a:-!i*r<[c.(U-5>Q*6mn4EZ)(aTlp/c'q5W_:0C=4;bUEI3 +CR+md-,)qH]AYTUS$% +36bbM)#g`S@-Bcfodtg*-2ia:4GkYrTS;_S=>aB/WU_>*_fG$:D7SEOD%-ZX##/%'N=GMA=. +IMRMm[PI#jG*+V8[QFdB'V4#+e8H^jk56umsYn[=pj:J_9a&uop:2?,C>-XM4;_uP$46'-n2 +(YV@O(>n(-Tr^ZPN/+NJ02X.1Mqg'[uObpa/O[BRO=(2 +'qOO!JsP^O&TsM3,#Ch6l.#A^6X&R?KWrrZ>Z(ZsiF/^F$TjH4bNfFH4,rRCLj(8,aOa-'0R +#N-UQ^dDqsH8mriFhXI>L\4PJ64=n7;;.-37pi`*TPq0bLS`bM??",uZ.eEjH`;_8\85cM/V +,Y=eE-IDN-"@BGCr`-Xm*FrhnrP#pC>6Usg:HdFO=(1M/RF]APo:[/E1c8u@H4(!&B'a+Pa?Q +,@'FLnQET;Q1%l;q/fG%L?+f,Pc(Qg=]AANsc1KME@hIh9UN*sd[#\ET +sTfrQ]AQ"5G;,B'eaFT\ZEU-Nts]A+>MZ,QJT+0hg)@FTQ3npVK?20sS5G&.e9f[uEZ06n^CTXRl_AML>MFsG".]A&tN_cn<@88?,[F;, +CmeQ5OB1qqK5UFp4#HR)E5qpE381O#1"H`(*6EFl/rjE*J_"LtX(d40pu>YX8"3;UFHp;N+F +b@->SroGK76]A,sTf.MZf(RJ%NT""b2E@_c(c.1#%MUitaOa8OLUB+#c$b;#_MQ()`(CpKWoB +RV*.?+k*kF2D00WOJ@!e\q]AJlaP3ocF$!$^9^P/\n8IdJIL/a;WcP5O"^o^rJB674ufs<*ZS +0+\r8e'J(Mi*&#K.s)O8mqFCHYG:A"S@!%"WT!#3ZGKQR7mS'Hn\\:YD>t# +f(er)5DN.4#pHN.P)+C7s*oLt:ipb3 +d8g&h":`aaM]Ah='@6tQZmK'.cj".]A8$OndBo*9:JD92:CF#/fO(m)9VuHBT$*(#a9_ScQ?Rg +lE/W3;Q$b>VM3RQX@p<0,D]AL,.!pXMJW^Ak2`AcG5rYT@cYt$?55V7(ns99'/YRME) +A*B#b;<'CG^C&e7M#o"j7Ft&ku[JUEKOn0\`rT+7@m/,@4Z3d8F4s=CEctZ4%KOI +u);)@Me[Z"TqU-9Lk372s)q^l,p`S!Z;1nL-[8QB@Ka"R +f(>rRr;^L<=m9S:V+f`n'\KW@Mj8>WfYOlGGJFFd"hY^kLfsT)a=%b3X:\)a?8F_FP;3iRD$ +Oo[9q3(==tf.1%psZi.9n7K/93VoOuJLB0pWqCegF3UcOXfBnj"V7%iWeY6b*WiiF$o17aE^\G:A/!'06c +bNaAkH=/He>>McKF>+#dQm)SFNC@HAFuR"1=r-Fg^!gdsMh(b<)eD3(Ej/6[j=gk[_oDM9soY,eu]A9ba6S +_]ACh@/]A=\r'[Tq:oG?+W5P926Wt2IP\H-Q0>V[PG=Hl$WfW0OiU.>X%oq6W9XjZI^N%""F(% +3)@pNqq?Dun>i-9`mDHVD]A7KrXDFjbop]A`Unq`RQ?:Usj=l4RLtIS1t\edR$0P&;DM2fc`*W +>%,BD3EcfNDFqC&Bf6KUe#W:GkBRJ4CXl=G?3UcD(%,6$Gcu*p8E,]AQN:.F6"qVVjR;8F-uW.h:dD_\PF,/\!!8X=)E9H!lH>gjZ>R3N@J= +3UXr5^6?&)NI1N#VgbA<8SNt*'4l +Nf""C^H_cB&9<\rP(4J[NCV?h=$LA^:`=u(0$W:f^Y!N2dfT.dt1;#$5)$-)c&dor8eoTPX^ +me.dA,Yi#Q6qUhdJ>Dh,YR3+cfsa@N%pdd1=;;5^l ++5l9I1B'*;m2=0u=O59^`@Hm'DAZhdA(i)F]As[.9YtS#>L8kZaStrhANh`iL,X#.B=)86d#l +&Vg)sPoKmrXd-@b,\:F#G3=^tZ6_3VnAR7=R=dSap$R`D*in/#N1B%T5O*\;G5ZrI.2F(s;! +@!sCrbQA4>o$W0]AB&m[![H+eTi3heat"!(,PSZ9^ooWliebEMe6.UmUd>f#D\Hs;@8SOL9V@ +uM[h/O^:KaUB+pII4?W\GGj^doX4"LR3,G!Jbot!sZ?*X+=]AqX%H>$tXPOOrSEjP +@/mPh/KP=YIR?Ac%'Z9QX6eG&GD!>C95f**\oY@he&8ArDkRI"2gn\p3cY40mUWqdH)Gt6ks +o%;Bp"9BlMKM\G8L1K4tZ9WTDYHrlgI'6sAK&mrp0.CEI]AiM?Vm3co['DC9j!M]A.iV2p(TW/ +r=npkui%W@qZ5I\d+&2#AV4jP414(QX8?*1t;+^NH7E5]AEqm#/Z\oDU(0>QUYtU>6Sc0$Df$ +A$asRPRZP7Bf>nSGEBEM2+X'FA5rdOYH^N/gPlc:lG@&PhV'c0Yri%h!CL%)=Lj*j +8Je4d0gJ,.dG2jfRn"H8oEQqpgd`]A0pXZ:u$#X`sWJW +OSajPKI']Ai()O/'1EIb&'Ir&VIE(KH>kF-D[h4fP;XD3m'BTeU&ZWQ$>jcuU.sF/&'Lt692< +RD6H%l]A2;PSFpLoZs?P;#.]AT=h<(=10h<+kDLX5W@AA>-'pdn_DJa/^LniX%q(e+5<_t:?^t +5B%Qos'mY5I%>IH3Lja-S`FsME3K_"!aL\]A&Eqi9`f*7]ARmiEmCKn#tB21Y[t>oaG*0kNE3' +tC>FJ^Sa4(jXJc3e6J0Q<3O56?M[jIa@kO9tj(WPEj3G#$5;uLEG:X\JAlgU35CYc__*os%Y +WJ$TVJg&_cGml@u46i/\BElis)>JF +.O:VbXe0"B[4-@R>.glA?<$-DK!\.q4OEIm4a:(#b\+/"p`0[# +:[iXMCJuE)0l^68XNcdUOk-&.!NX*'X$ZNNY/n&Kp"74p'83UqL\X`&5\=Ntg.F1k9bjKLFp +4cL!QX5A#khLsTlf8e,l2f:Q0j9FONerMc#XTcTZmuO5CF! +@bNShYL=0^l-pHZ"m<*;m'F\H?tj\mR->bl5")2`IpCm=JgRZ8EcH[iAHZO#h1kIIC\Z'8+k +?^65(W4'IS3%L-0T#NWS&keVp8.Kn3Z/BWm[g1doUh%#_38AU4!]A89GCle*lJ]AA%1gE`7daFnU#)8s"=pl,Xig@o_<&b2.(10`G:s;m/mnP5LN6jU]Ai0TS^_E +V`7[`f>(u#K"\n1PqQiOF&$UEp0IDOn2s%XZ"=LQa)<=/c5Q+F!d[28b/<6)Sa+*G:33IcRPs4fei/,nQS%od-[D#F0*^5pBmNA#"Q2_*s3rV@u%anHf01lQ00$=6U:H#X +QHY/AU@t%2u!m6e;:h=(ML';CY?tG9t<^"*I4?1QLgens0GtP]ACVFQcUs+;geR&_.nj*,:^NtbHXMcZ=/1G9L>3s8nq +;X5cD?fmJh(Rn%Pc^Z!]Af7X:r\R'>klcQ4lq)3^4;i#("O8UoX9t:m38JAEi(d[)0CAA]A1]A^ +(HPge;kI!:p"g,\/."!C2.J-3gU]AR8)E;/p]AoYnJ""-R:,4RKcGDjS+f5c`@^H_jMsmihBi< +E7S?#79i4mSptI)/'mb!n)J,1R"L$dcmg3mB'*;ab=p#&[00kQs9&_(LusbT2hB@tm +ID\O0`nG61,7g"SD%,Ol?8MGsAO!s]AVB%;oH-ZGS/!n#-ps"dQ!:(s\O$PS'J-*%DYGIQj/[ +q,2D#98K[)JtkVeMiGI-+AgGTJj@r&;bb)go4e+*luo\hMo2XX^#3Qqf'_=g +3_nY?mWB;a[nOO9R3CQSL@$CWV-j`0>C2[)`XhjEb^8n%cIN?*8bf +?;o$)8:(LcGKP)o%(OQ%0NNBc#-pIle)b+oYn17(ZI:4MmC/dKX>*ta5BM>mPd'Y$_0'%\27 +gTHr\P8#9.nn56]A4Td'YmUk9b,LDGa$^\(=1WHT\?ps+?f,^jjC^[^fVNu`\K:M44A2b3DRS;uFoTq.3NG&BU-/P^'Rb.?fhN@U%%?>fIt'b0fZ6[IGD"N/KA&LaREu@HL5LOH2O)O +>'HX,h*W)M]AlG+MfB%,kG_F1D60>-?X7ID?[>f'McFI]ABMC\J9'V +WUlVLk_NH'nRe02i +eYru>@\(RnS0lkN5[p%"poqq`/66o+"BF=c(2:>t.#E+R*%UEh^PF^hL$P2JmK8F?KAMft6[ +^Nk7PTG:nO9]AMao)YS>dM(1k=45]ABha7XZ6c1*[Qp\d()%sD>;o[_T*H$5UC=(pK9`MuL6p=G,>gGhK9G*RdS`4Op&ie+emVQ@r +S232+L(VESsI9RJER1VHKXk_Girq)4F435GTlI'.n#03=u%qgn-9)h.rT%p]AG;ZJ;[jYhf(= +;cYKpA44KU1!/Z*fD5:OCKoCkYnW7f7neM=_>86Gg582ip@cM1_X[GGiX,`P5Pq@=geR>&$? +O<*q4:AlqRa]A^&CSSrF<4AM+$1J0fS"gSH@(!s;P!tcS%5u;O49*@&+Q`[D$jmH'*?;n.,4& +rS=5l/=aVBbeUCXCILr,":u7LnXtc&hu\L&UeMHcbdtZ`X?>(U2qVNEsgkH?S6]A?LT#42mD'>-Pk*WK-=F\O]AVLO).g?l:,a, +&*CW(/MF)@./Cmi-o]A0B*a/OYO0AX1cL5/+K?o"<=NUo0BmT#g+X0?Jf$eC4:QN-/(UGV+7? +W3kl0N(@B=ReH0'qe!s)gkRNj#+qPTOR]A42Y@E<]A""\uC%E/qHf>$]A`cEulr2l#]A[-+;^WFn +!2C'!9nX"hQt`8>^a^:f#h.s%K\+>2JPtc5RenB/5l;Fos&CS^S/`X^m1>b7Va\A]As!0j,?" +k!i8+-Sh[%i74l?UYpU'6lI*PA(F$*L^<+j3@NopPmh9P2eV@aaWcoI%j3Y'q.S>3:BjI2[M +KP-SZ2a/*-*C:Wln?iE8%2`:&Ym4fPjcZG0/9Ao(=TWDY;R%Ia0NXE??`>iglhq9YU2tfb(_ +'er%gj?Itt?:Od$hK.V)pJ&''TOCM^$Nm^Cj;T:a;B.UQ3#]ASE_lG=mPN%4fLe4&e"_' +M5(no"CD71SCPWgQsoWnAL3"A%N/PBaP6D3e+*i&0D?rg3*YOOAX'pp%5?";+''L9C6]A&(_%8J\90(VnY,qENi__&SW +Jmmbf62??b1@f=NR,9Br"R]A]A]Aa@UOP[\fFbh8TGO74\5l9bsRUJL-B[4qTm3`AeRLA/]A +j/SRi@V]AR5;prCJf+QXg(i7"5")ktQZ+!C"e-1&2B>T'AM;.D +d=a;*AFO>ND8#Eg_L.e2n^7^J0rq)IPMYl<+p)TT7C8?E$aDT3C?=!0&&/Uto@\#>BgCmNV4 +p%W,)>@peq4_\SteQS+i`!4[j>O0$#>;Lf=2gtAtomJ8@Un!o6m_hXoFn$F'VpPfOSc#8^CJ +;=JbqH*eCDm(4F-&![S]A\fe7p(N?kZ#H-Vm3?D+1*&sP\BRUWlh'.%+S&K!/IJS0Zh3RN"*X +,"-Z7gC`#M'/s9YXeMmfPp6KJhDFY4k6GS=U#@i(+BJ7""ACqV*]AWZ1^i,A7a.8)*Z +dXebfuOdI`QNC%^kBhel4Ko#S6Q'$,'6> +=Vs9[,RiAY+!BTImE)f,$]AWsqXnVC66t1ZJU$IGHMri&;L^OJidXs<=F^^PfkF(ZL3=s<4ql +V!oiuD>Bk+tY3t.GQ(k/=WGGJg?XDA@V_q2B#6+nrA)eF-BUi?2lDj0LTW&"%;*)Q +dR/j+VP+q:.#%&$>Y!6('8@fWerTauH=k3117#?_C]A3G:(nq..k>!@NtTArj&,9)o$jcKr$U +TLf<&c&G4e9+%'MH0MWb+%i%"X!om%D_V]AehF8?%5)SpU;BGmBV!4mWX&H'uRUFc./3)'ZC9 +k[sQ3)kD_-n'mpD^5P"l%@%L!oX4G#CLg)&P^jO%bA&&TWRDM1oBTqAN6)@E=Y'.W_**aUlR +k9aqVJJr-&*%"K1b4&q,5)atP^Z26;BZAH11dd#tD=ar^J(FtI?[XBSmMlHt>4nmb30BHU"r +Zh)H,iqlUm/@d5;Hd5U;3i5Tl^4\t(V&pQZ`d>ns8pKn2lD?=aY:C_antu=(n^+NQbCEsNNOlZ\.'F`OLkmL/eoC')G_T(&<]A-eE5&7b7sP +>NOE[sG/CV0dq0m4@TtgshmC6;V%PW,S2QJtr&5_jQ8@(QV;k2e,Epc`a)o:_]Ag$ojm^30.<)-tcmMj&,4C.ZL#^QOp@0L1#!;^FIfP#WBdbJ +b]AfJ<,PFH]A!RDC*\#,-,6EbN(L$\ADGJ:[`)MP7m(jF*ORnI[N9J`X7BfNuX>TbN=a!@3gbh +F1*$[8OEjTFX&SmJ[^k[4N&TJq0;G>AWYAJX-8,QhFU/OVe1$KGll./gJ\q>"M#3=o?OKU!8 +("'+\jN6lr;:c`LaC$NOKBS:jFN4"KtUU>l#HA\esSfYlQ5e_aN`Aqjt*pD(b9k'rm9Vcu)f,aNJT&He +bfrujiqqTPu7S"QRRYpSS*#+]AlZu%+iM`&=Riks1U-F8=X]AL\61:"f#qg)oa$)(4L=Z`L$L- +'lG=).*W#hd*U/:`T%;JMtXi;u;@%2YnmnXSFnk/ql_h/JVc'$>o=%8%]AQobQkth!?DHL^Uq +lPIl,EgEJImj102)$]AX>4boJp0@h"Zh2e[uJ5'!o,8L/-OW?aQPKjZTL13r>U9+c#;k?a\uX +<:"5tSN5QcXti_>]A`!`WnhVKm7BDS6L!+;1l3)V0)$;2F/T6Rn5X>!$.:S3cL"&jVPjH#I#e +f2T,AMq2^>341U!3A"4+(h4?=>Tr%t76.o^j70.GfbWj@82u[6<-ORNBe".q/5ECSP[tI5_p +5K60,4#EP&*coXl@94?n"^t_duJV$jG9`N.SD<+[?2\bJm&$n +a`6aB8Q#Vb"Kk4CbOeF8()k,l^WmNNtP_I0,?TeAuf!shD9oCRZo2:lrm.SG`MtIk+eM0a$/ +O3;De)QfWI2XY[XIi+Sk`C;Zo&_9HEG6+CHV)Of[a8FVT@%;15XlWHTFUAU64U]ApnccmJ\=k +Qc1")''Jt.P?+e0@P_[.b$ +)FmUJAflaKq,,sY;4R12h)cssV\'Sn"%S*DDX5PLjr$[V:O#Q_XaSAPF;hBC_WZQ._3k+-]AC +o"'-Ii)@3&ihLl5]ACIi[oaHC5R0hnS%o?fI5jM`bP[qsi9dgdXrC=7<:3gGXkr]A6/gD8l2=cGOjq53"VZR74%mOYYF`jI +9YNg#FPSdE_&'sr_<0kI76Ai6;#;hSg34o=E[OM]A9p=2A;MN;)N$]A1P2N'tTC[H?^GG,5@bDXF\TJ +RA.(m+(S\#>S".h7?3::"MVE&V&.?UDeCrsm?q[e*a`jNAp8=6XJ\G!OdL)bWZO+gQ6a:+gN +&Xm#aj&tA3/Yq#Z@Zq0#SmN`Tc-dZ1=m%@TD51pXRA!5"PSQ*M;b9"F%JBK2gLUK7T507J6r +e!n!`+S3]A0c*(KWA:"17.8^CS$kABn=$.(bBj9c[*)@/>IZCsL*9e*N!"W*h0gSYA +$,nd7jjrJ;ReN.HXlR(MSG\0*BV_X<%NeD5iC-uaA,!uS!I3D!:7&d7Z)7tAp!:ZX^o,jbC&pim=?o6GP'<]Ap8>#"oL00Yro@ITjDh'88UaD,`6 +r("bF5qQ>@mAr]AKeNrL`]AqbjJmoD'nKAVi"lj&Oge\/R1-/9,*S$TJ:4KdJ7rh_.U146 +(a]Am%><`iLpqcrrB1#M(I-+%!4?^dLUt#PQ"WV'5=q +/[4cEg2R4lJmND1j']A>Y<&3ec?sPaG6Sfk-]A%HoG3lJP +iZlYqeAs$Ku3VC8[0$C6aBKZQ9,gAB)bOi/uUK@PFa?n`iLJQ@u6UY.6Q<]AFYf`r!\>(#Cff +ra8HBuOGWIf(6XM-)uD_l:R08Z%DD4uC(Y<5U.f?=SC_WqBE4Yqo$+$*lsS23WZHocMl5pt0 +@D^CPeq&!fs"8RpgaVU;B6WP<9u?p$UO6huFuTrqI$ZEcJ@!J$qiV_EeAVGA+#,%Hi?;7_OJ +anp#sD[n,:RWiSR)lA\da$T^e/-HX'#B,[7*_t&hK/f20:#6JPb$Y@:`=o6Lg?=S*3WD;5EJ +GE4pkg[#oLdXQjhB&R.(#dF\r%Qn`Du/$k!$[9OVpQZZTF`0-d(:QknbfK7d"l?,`gZ5pXan +Kk7(GLa[pZ`6+edHXt9H/CiEV8lH_,q-B9S5/h(+&BmAqN)Y?fuI,I?m>?)"5[BT$_+#p@m% +Z.;l@S+D0iQ',_DK[h,TcAH0QBufJXt>0BRANHqgS?iGdlB)[XK8:L1T5:5_":NW]A.r^2Df[PtdD^3h +>5QY"*'Sn1Ht*4l;)"s,_pG)\=S;jVP&8IdA0Ld)=5c)UY`>teiPgD,N +mCR"._au%W?mC/'NgGf@_u?on),2*aA(^F^TXSN$2DQ/T[,-aV<[DUHUU0a_K*a8+6PP +liN@lH3A>7R6OHT]AR%->G7_D7tN\FnXgS1LW#u4ZGL/sMk>GKLe?elX!WRt,)mB(Kj6#f7(h%:PbA#5<6U39E5A6c<SS(qE! +_RQY(mK:bWYG#=s8rnKXp]A[\DW#4WDTaDQo5C-_[(s**PZK/KqU@77"gaO"Q><"!,k,:NGj> +8`cV.Quc.R.R]AJ%,<@4qBa;I/s+.$^5"Kr4:G&(uc-_88H9d@]A9HWA'O-8pe8\MbtD@S/-$G +%^Qk5JYY0j;1C*T$e0W?_JgpC1P3/*0H)XI&+r?2.A\2cI[Ob22_CqT3f!M(@*%e8q[".(qlKhkn\_"?0hSUG\03SP)LA?=T@o4bGt`4AXUIS8q',6Ed[Pn+?#-G>OAIH +SDln/NSut77jS-rL?0-!HHNJPPUuX-i2(p6(cAdkiX4\^\Q?X5X8$8U5mS:4iEW>j4[,?-`m +-3li@tnC:%4nWpViQQ%M@Cf^oqVhg.>'/>D^#3guLbMdB!XS_\;*VG2P$0;PqVL"@`gH3=jt +D7Vo[(<*^\auN$t08H%4!iD"mk*^KHk!"AbAZ%Vms1<5C'BW(><5`^B"'"%S;Z+H7Cn.mnm)jSpq&$,_]A/I3!NS +K\t5%OOH>RETij<8q:*Vo%GLSm=C,S0QS.nj>G\3W9r8p\3aRC,2AEG:A:`19MNGiE97jJRo9;cZoWGL$O8^Oqq+qb.=H!"QiO5e=QGAF:!&jF3f]AeTi%bWjsZj<&PRj_WB91.>fj65[54(1@J^.QZ#.+-1aIW@d7q@IO8D%k@`dL(te9BDq +2m(N;&5a:tEa7++030K?YhDgKp/H&1+ldVU4!?K+_o_VQ45B*;#RYJ5Otm[lYm +p=H7s`G-UaS[R*2(/)`K;W;Aa7cr[q#8#&K->eIOJ\?0eqKr4cbo>?X+[#.QZCh\qTn0s0/3 +g8EQ#2UA$6ZAVDhn??A]Ai*&_>,scHG&U%D9TU)6J'*)AaJ<#uc4VH0esWSF)1DNpZ)2RGal/ +!-=7VPIl8/67Ne>3OY)p89h$Uj,Ua1-SGP!GLRc>;$fp[,S7D^q+FIsIq'S1^FkII]A*:sM!U +$O<+Q=Blr@(#P&eQ;a"DEP]A0j;\"*RkHb:=DBjG%1)miIB4&#'OdtHdKGUmdNMAhYN;I0fB; +6khs%'T[nu&an9fIVOE=,Gp@X#h<(Ye5TZ)jIkKNn&Y(eWbmi^A6Up/!FtFdGF8KWTXq^n7s +$]A_h;,BQ7!X5&B$Pfa>]Atl/E`8+.0FXY3)u-o['$S/gl3p]A'`cX*BEl2LHIkH."[^">Nto6A,]ADJ4L$Nh-QlOq>GdBa6T9AV+Dl3XO%-s[Pi!(:sY[(^^;.? +IM_/5E'0Ipc,4JH\?a0..qt^^>JoaVe^XdeDW\EYZ>jmkj9 +8W.&;^.eBN0PcjgXU`3j7F-[i[&QJ?Tu,6Qk_p.T9V6TR/.:^TfJH$!Zo7[PDD0^S(8_dTo! +24(+D18H\)4\-1s\%;bOZR/(aVnptHHi#)4FdF"CkohF))3EIICDHf$=*+<'G@TCO#K#0-u5@/8LC/;q=Pp$BgdBjmEK_hMg+(l@h$6FG>I']Arbi1]A[,2= +Xtdqq&ds+pOj/8);tTY#]AL2prrrRWs+;bT7P(dA:QNr4bdC,l$\]A-O'dhcdbWE*?g@'2&"UT +r1J)!(G>+qL4klbm_:B,`bE;s_:[GZ:^=V*FN^C5aV]ABL5-CEgth>GL_1e\^ +Y^-o+J*eZ4W">.nhQ +8V.KUPVG-\S0-D*[q*rrFc0(2&WjVJKb.,a$-G!S*#`=H1Acq:r+C[G0!Q/N&T\'76IQnXl7I.$U1e`W(uLR4408,gJ*?%4QsOSr85co0FW(3np1* +47rV;ba=55#$GJo@f-Wh0-9`k&,,R'si;k(o?(:'`P&4\E,@^;*J2'=X(['A5iQ8I9F8t-cn +jV&?Y6:Ekjjm-ja`7r.3n(BmlC6P>lq_&A(^m>.rH7gQ?3lh=(i4:"+ri6E#(2r*EpU8rSC. +Lo(\@:"&]Al(8!N2Yl^[J_#3skH27bd7/^LMG/W]AqP:>f5o(e6528 +\Ac_kQ'46PR$+jd%iWhmt/`k&05aq0K$ND&3oVS2NE#JH2u'(JM3]ADEhl?iW!ApemY$ST@+h +"3aHb?kD&D_4WD2mi0#dBg?8f8r]A7d3@X+[CEu'ur19a#o`8K3Y+-ld@dm<'+a-8"1h`S?U2 +u2Tsj<=6#=q\KcElNd5:9H<04idIZ;F"%[Viqd;-aPodI/76TT!>J:`C/:=LOG4i+kktA"#j +/b_J,kmgO3Vk5hm3=-b5PA:j\/l(`i-Ke2$XjYkH3W/08n)#Vhm>r)X;jcD9UGY#b(lGW-iD +!Y+l6S4D:.]AYmFtHP%5pW;W6OE=_FY?i)hNd_RlginXJ8^Y>8L@oAB@-s4/A8Q?t#9I6qrGg +=>?V7P'ZUO#$so3eZl=F?OnQWVums_9Jm$UTi6^F7RVKf;'ia^?rV\UO^LhuKgomu +g9q\4m8aJES,cg`lW$&WAY>RAN>ll0Ze9>=MXLk30BmFX5VBO"\6)a_HlQ1_M$8G6`^Yi1VcO#O4qum +m]AriD1&O@(eQoELJRkB;-oAN'YO,[\FiKWp#\4#]Ad4#W/lk?PBV\'^+il%352cs%SCNl9T/^ +pOUT]A;qOPc@h=>D[!*Fedd#m[onQO"A\ers3t5,PoNc_JaI&md%(tPLHnB4Z`iN7ZV9OSnXXf?5?/PJG0sCRkj/D-%a!_e7cllrG +;Cru`B',K>sP,I='#p[qoZY/Ijr9]AXs3LZ/>rCYI7cUB5kb.e:5l>$Hk;9R-Dk>a585:HP#+ +Q+#8JhoGrAsQ5I%peo]A?RloS!>:;Yd)08W>[#B`PjFA58j]AEIKMJmN;[F#"I%)kZ*+raHnhbGF)$$>E1ALm>DMfKR8RsN?MSU>P>+k +E:g4o]AiT3A(+ZpK8XtlZM4 +=#n95uGq&gk?6\bbN?B2Z,$:]A8,_8[h_B1l-e%C7a25hHLto_ +7bnS"MAec8!Qdl_>f4=r\Dg(o8Jjq5dF_JlDbhM&ion?D_2_b@7\"el\q=t`]A)mOOTcTQ6ngm0ie;&Gu]A';F! +,JPF&<#i&P&=+&/m[HG,k@&Y%d9"5KpJkJpf5RnHBKdU>Z*[.9=?htGcYQ?Ri+>q30BJGoH0 +YDk1m+s-2:q,+cn^.Rri@2JXb\W,^mr!5>Kg*Df^EiD+#gMBN/9>3:u?p]At*O%2Pa2LHfUAQ +.DA1`M'K3Ib8Lp(82>#&e)\4Upd-:RJ?9Y%p.giV]A:Sfl:mm?qd+8E6%-V2JdTWM);JUEj\\ +CnQcX;$dB^pkXOic(43L=.Oods>;oRK/Rgndn'm[4M)%pt=]A/5qfpo>AQ`*Qo>]ATB&jh)EiX8KEIIi +hUH?&9*&5eASW"5S,Bh\b(b=iLlR-#1s/+?iJ-sA^^!`M4$9Yj/$Eu#N?&0VH)>Wj`+4KTH54fS +!3DDHhS*F>oX#2b8>7bFN@]AXl'_)VfbI%,D1/+)VOh`qQf>+rN"A^EH.sX=49J3&&W9#=.dB +>93Mlu>\=^b0Cjjp,j&Oadqd9;os4Xg7d=DC"T0#BBqU7n;>ZVbB[?$le(in?n^,\58*neR%l\>'XnaG +*c!sA,m7IRa/1a[-^Uh>+aK)c9=Cm0M&%_W]A=M[6`.nM?eSU":.#`e_C,oI]AEo5/.g9 +g]AMeGg6_*cWc%rlT2,T_;!Z4ZL^NSP?P@XP_0.Sl+urYFg?Kc7D_6(foqsM_FsTlT01=V2-J +(beX/`1/#tRO)ln&diXO=9.X,-/VV2pg&>&ljgXW&4+5AMuhGFH4aP=F^B$goN'<=V\Z\dnmJs"$F*:9=t6oRCp\b8lBWf,9KeRAC/_Y<;7j +5Sk,$-C\6BdD.uW;bGT-A`Q3D4Pl93lfa1p0tm^W=9#Rn8nW5(.PpepB_ +&1XX%X!;,MJ>.Tr[AP.?WrjIDn#-2tJfJV*UKd_FKgV?dh[B2d1!hf.WP%U2ofi~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +E4Qi"RLhjMCX@d +e7(^"1mNWVkj&2?kT7!WiGs-TN&E"9]Atmm,oT3.dYIJdDe*J"KR5P16UoD/'%%k'rgf^rokZ +$!YL'69)sgX[hI8]A!qKY&Tup3$aEHV88sLN^fA*HMD%ZgI5UZ.]A/LD`7pl![,!aWs:1L="*o +'["q+'?#WF<+(H\H]AQA`tWC.Gmh0eXlOf!41tK?op^0jH(Q.H[JN)D^(TOP3,2f6?+@)l4;; +0^pj%c,Ro'/=-Q;n!"Em':6&&[Dal._e__5['fL8+TO@M\ +lY:p,@?:F0A!`M8-: +I*V1DP4X/=?Jal$Kla+aj37d/b6^BSk3EZ^8T03a\J=`uc\M*.C4;,\29<()NI'\R*)f&HEZ +2ij>.'jS@jX<.Pa[,54>@"eIbl,b=!Yqo=3U:]A0aaQXgLF^*[l'66qF7nb_Qqrkg20[D4Zl- +tuEpW9`Do^YPCS]ANe:6b9)KS!mZ/]AE?2LfQAUilJP7eBhdg+9ng`#4rqZ*06).1I%`7Q)X^3 +XKlK[Z4gGn(73R;-tX3eSc/3]AQ5"mI%1EQ3KY92*tb"iM\#QV%XfYDNU`o(/dad@^PZE*TbQ +`+X+GH;E,HW63-b/Et:@+\>0NX'#o7[uMBh'eIF4:g/pJZ&L/DKqR]A7!V0V +_=h[O*%^@^kYmBPI)&&S\h'+-C!$T!p7DBhTAf$:O;:4q+Y0Nk\&:^C;c">s!.-Vn_T5ok9" +L++`;"MBkM9_!EN8s86OrJdJom3_cu/I/`qE0 +@&^HAK1E8\HiFTc82AUUP?PKS5j5&<>dd:nnjT:kj,I=`HljX">lMsSRpqciO(da[g4NXFl_T>($`*D2./!4$qn(F,]A@IO%6(Nat3-/*=RT>Z3?>MIcEc3@2;`R^1%ie?l0^fFC`p?E[$R4N@d=\/II +"pp]A\*097&>nbu!R$K8&$l\%2FGf4jJ[>f$TJ+ +seS@M[RdfOEd)&L,eGC.-]A)^FuJQ60sc0S]A$DM'6Z& +'aEQl1e4c!6SGdVO"gn3#T-[E18&&THdc0Y2KHO<[kDn"_0l[^-m,LUHr]ArW\$hB +Z+CeHr^VH)f2>:Q.io:%_s_"'Eu(lB;s40%O_aC(YfFkYUPR(5[ojYiA=M4,]A-o@VNNA?i=j +g06^k855\"55obOMSHD_[DC@PO!U[B8Q]A)>6B.>rEGHt4 +d&9ET(s8n9ra]A6$JOhVjHCDUM5SA\(K31SaebViRMJq]A4j`qT15[>&A3WE/H><",O8tD'#E` ++ZM1)/hMEa^ +NX;:qX()6BclG_qRH..+`Ug1;pOL:A(jM^IhK9e!IC@$et@h`]A+A@_*WK+nU+R7^N,YG@,)@ +10b5a+ik)d:\k-NqPGHh&+AUZ-;L0MVt.]ADiI0qpG*a6l\rP=AT<'9@!kjj.WDHeFp%<_D?q2DF)/%Z0Q4\M09P[ZHR+tGhlHj]A(^qCY8_mqU1 +$qcR$K@1glep<2)11fP3ofM]A$mu_X[Y017HU#R9#Y7$2;lNN&q(@8"SLh*;_\g@am!8Cf/.8 +`O4$Y:gsF^HS!FC+]A!^'c/,9"e).r33#DV[N&k>/5@t6Iq\e;Z$hg>l#G\lWNKaCud2H4rpC +]AN1Ij[9Xe$kO&SG\ZqTmX)i8=8Ua!Zm>SRI2Pn[DnDQRR+&hEQU0f;tVjt%1[>=sq-\@g#R" +Pc358CGra_4.J]AA(uIU/d56/I>qh&qei3,bZor9O#f7DP+A0rjPCtINUGd`E+6.)]A*2F9Upc +!UkQB=N1^t=B"1O-GODS]A]AStUBdHo*7$jX8-:K$37`W\_>B7+rI+M!5lIC90(0>D->6J-K[@ +4gPUo9cG;[=ceHVG))qO76:.OJA;u6IY-<*9eEE]ARUU60DlX'ijY:"2Y@In8 +/28Lak(?o%l1%diA*nl*)7-fSM'M +'VaScIH.0Jp$3okO70/Lj8WcXK1\G*O3B779Yh!fer+:$LQX"C=OigcN7g75T]An>X*>gqMs&MJW +L2a.,&QF%^1lX5-r^BL`rl6_H>g5;;HD_Gb@1jlR, +j![4G.l?j)FcX=)p>%OV2Q$@cF,iV>T:(?R^^=o&fE1ZJd##BM9mpM[$O,\EjP\>45c=1Q;a +""&]AX"NQ0*e+'@J#g&L$=S4sDnF_@LbLns>2F,\Wiamus(9rUojV>jac:iMh3=%T_tc/[b[` +DeMlSM_[VmI>JdQQpjMAHe6hDOD1rfS#gE+4)OZ6oG`H-YJkD]AJ6iNr2XfJG-[fR^=CkkfrO>7ZY!DcIjk +%A[q*`BRg`a%&2S,YJRGlW>;KCrA,G22:^(EKq'(e>aB,`-.fm[ipPY0TT4JI.?Dd!c'&Nt/ +iD1WiDtmN5J\c4:O/l37?*i5]ApH4;prm7Pq.OitAXC-/B'J"Mb*o3$cmA3=QngR_G@!'02ctg.V[OZ**ZWhg=O]Aieq%T=*=gR0k8t' +5_aS;5H)\d(_11jXBtUX`CB>[V6:f8XT-9>`6BAn!gBgi3nPk5c4'#^kIXsP4UH5qE6_Z'l4lH%61pK6Y_JY;'@*"a(B +f\\pR.K1%^Qo5U*c`%)=7?2?%$=e9JHm6SiLdS+?T,SM]A#:rj3ZR>Nu*n\ +aFuJ-j9?OL4T&2>i>=k3onYJM@[VEN3s;IZo4Di6Xt-!`ljVV(H<0(@Zrie55]ABRq8.q'%T* +uJ^/jQ'8\in4oY'r?p6m!^eL>#'j7@)Q(6Td^"bGTtWb`a%:M0,;rqhU2k]A;4nY/.(+3BnBJ +:!HC5EFJdZFMTL$jQ&_%hTuPuJhAmDQlnecS]AOI$\,t9[BhdOm-Qo5pbJ.&$+\]AVt@C(SR;? +)ma0?is:Bc+J-eDu[=@p:CXP6(nsUHS:W=*YN%Y3$'\GnAS$goBl@pC6DS>$jbEtD10%3mVq9Om9#V9A)Ji`9/l+ +=9-jA`SQYOc7!u'o_&oNpOUnL5OK&6)/7MX<+cl/d;:+O6a6]Ae:hVq)o>`Yq*G[aq_-@R/;`u7K6FuZd.Ve8,oMka]AG6p5O +oQ0T(=`Prt*=Bo3!o3o\!;';uYX0;?,M@fd%K'p4TSMZM.1B( +k.hI$-;Zu^bq%kj&l)9;K$*4bGq/A@@A +MAgWOrE9LL)KK^=1_$c.':No2fEr.mE)0lX^jP'%FP\"';"h#[ebg>^coUM<;=r]A$OF]A:$ka +gG/`T`74SP#7n+dUtI>%M]A?R?F2F+>1,Un,&QV7)UBdc+f$W6W0jX8dsWG +pG%jLf;L7@dJ@%JYMi9Hq\S/>=&9Q_rNVpK;OufM1iilh,>%'_*ZG#ICqME5D=#L(N)ee4.1 +;T4IYadZa6ZSU_phSe:'A>!8N$u6+'5H88K'j^<-0(&?s0QGQ+:.Sng#t-1Tes?AE>:olpN@ +'W$@#=)XTkH#1&X>U:?@%]An3J1Jg +67\o(Vq3GF0=9:JO^Q@`)8WEn?rj^3!E)bh[k^A^ou?^ZZ;b!Cn%*Ft5dj`"EjL!Vn!+H)2@ +dEpK0$H^RP(3B'KBiJf+7=SD"2LilH'j<>XXD)<1np\4Cd\7:O?9bSE<3IdMgKV*tUVOQ54K +sRW^ma-=dE7ZIs\1h@MY7$!QJ@5H+8h;9E=D;u-!+0b.?HTKRd.Buo^1UQnW +^K:0j-bCdgNV4TcfiQj9FH2*Gh::o:3f)7u]Aum$HE/W9OMLblmo=:!($$Wg,MP\4A:Yr0XH= +NNW$\/Fn[,n$%)=S%BJ]A8N$8APNDkqQHF"7]A@iBd:o:J-p*_o::*OP5?CN94:CBUT^+19ZZ* +nNG=q0)^k'Z[E%3JHbJ3u_ZS`c5i/"HHs=%NDV()tQfm/'.?7XRgfDn=L;s:&*iXs?Y +`g\7_IES_YcT#V*"9(:&Mcn2@?Fe/eP[umq'Wf+'Gq[1f7F7fSgq#K3E]Am%oEek,T?6Kb5/[ +_U*7K;TC?-"dJj]Al&V$#B,$bq0Ufm$VgOAMjd+C+O-n:7jSX?;B):YP5LM\:UWGNHX1*D74R +JX%NFT\(Pq7cIM[^AJPI/s=VL=G0[`)^g.8hG\pLB/G:C"=ZVCE2<\UG8X(7=SMu?dZd+pAI +as"U#YhrCMp1rS^nRmQS0U:>JXS$O<:Q5>9V8N[qLd95N\DZF*b'o1[^e$ak^$7^kG[9B?rHqm.r55+D5HH"'/cQ +o_rsTTdFuH&Q#]Aml@2@P^r]As?<9q%T>-:eN^gW^Q]AfMPSYBW]AG^HJkY2plKd8'-]A@cqW%n+5 +`]A(W^#UI`?Wn3;H6^S3W.$f/fJ<5MdC_fBW]A6VM<.O`$GGjL!b9>eWTT?.S-0hOL9!2O]Ah3E +7IJGZF\J]A&*m4$:!S+&tN$u/lDB)/FJj[!<9k>sF:))pAJbOrN^arU/I_qO:a>(h*i:>7q*N +%8.TnhQLEf/b%ZTfK#,s13=*dJeV2p:T=CT:VsHf\st'K'Lb7Ao#(LhC"[2&HIR>mT4.?m6@ +;&",tM`(H9n'T230o*d0[ThcZdhCeFq.'V"kNIfCA8I+**8n?A:V&_!tbj]A+J454-B%SY2V6 +;Zl)Q`)]A;RM0>V&[o(PTHk'm72P84`*E-l,8$jQ^YHgnBX3Nk]A[^E6'VYsXSoRFG_-5_6F[H +aC+dE#RAlX!hf`Wl#^.ipF#3NHQ6S%enN<->^@V&)sS\nRt +s@?X/XERM0)Z=CU^2qbCLeljJt@'?6Nqi(ds4R4p8JXg_Mc.Z6O;ED]AhGZaSnG`"=Wn`f^Cb +([`!lrA`J +c>=jZ"&H7$&6>DhIk\m"#/=dK`(tG9VGZ6%=0d0\pMXt7Vu;!,G49ug*kC6'&E;]AhI+]AXChADUfdi?:P6H:;BS7%.L[ +(H3-@gZSO@-q/NpVUGL5Jm,[T?Bm`S.cQ_Igl&HTa/A5aOH6=]AW;`m%hVIpqg,U/0:J!\?i]A +H`aW7k.`m=T1]A@Fo+kcO=i3mDOWKF.RIY\D#@Y^5qjFmHu(^:ZsVDSAR`Q[qh#Nhq]A+@G(h-!fU7UShligfi/P>[o]Ap&_@:;f+#bY5407/s"ce%Nk'?TH-[+iOUB +(/DHpKYoQPo/9*\$Li`#4lmXVM^R4#[Ic00.e0Z,kE6R +pZngmB0O>sEdmD+Oa%"Yt`ombq*ICi"((V'./N+*rh>N$AYm;@pVHl8=$gMUJF,/j)bk(T48 +d4>#o0NcnKTAr%E2L';UqTm^Jh1%h>DNe0tX`F@8l(JEQN;k:3INT8+F!fkM7X$,9ZWm#g-a +#,a3^Y7HnolgPl4bh\:,>J4Va]Adb1:^,eOL'g"9oU569)5gr^pe3eXHm0UP3_P0C#*X6H6gL +h2@X/n.X>V>).-r\SX&@i5Ym?T6f,`-IT_qok^D&Z@7dA^-73:rW5N<&hm2e^/VTi#Tmq(N: +HTV8Ng?XY1:_U7<9YX/ArD)\L0V)h'ktdhO+lJ:j-\5[OkYr8a0r?:kLa9T$0[TPSsu@eDP8 +c_p?e=Q'JaU@5Om!fFM1O;!\G%]A:15R7]A>_p1g0B)*lD!eZ,b54P(DI($'uU/A!SNJ!+%85d +:.fp`UA7(s;OdTX-N-e02L"je\RM:"=!$8rUPV#\CE&#[+B#atj&q:_E5YWZkDh_@i(aMD+M +^YW7`DGZ0lWjq)/.5X$@[L>2o;A198!hqq5+Y#M-U[6GhdofJu2:5b`'>[DT=9"OXT%H=0>9 +&c9LCi!:)%$H.gA<^QnbX,X!cM&u/5Hl?,PgQIqG&[L1/e5'HfV"6ENY2cm[?2XA:*EV'hMB +^C#pe8+fJqhF:[UPK"QS/1EJT?Hb"`JFe"XM(DtV@lA@-JN+0]AG6oeSY#*F[rY*_%"q3K+Uf +Q,OU;p*ho[e-@9,`kZc+e]A_sf[^Cc`?*h)LQ_,L%9A +C>Lc_-BB&BCtKa_&+hYfjh8;OLu.]A#OJ9,#d[+_f7=K_e=!hXW=gk\f"sSlH2Dh21qs'IH-' +!m5T[GaVhjX-^iJ^j9,?IL/o'!FA'tKk%+c2GA5l?-V83_U;\;h-Q36B*V2d<@3*]ANF##rrq +tQ*^o@OG!1Pi*3cDh&hmg_=h3l2f)u6,@0^B)oJi[f%^JkT+PT-*I?ia\3Qe6.f\5"[^LtDW +Pr<^7o#2`=.EkI5G\ja'WQ-S*;+G[8?`l$G9>>1L/s.f*oAIG6_DU2N]AFA)[lAlI[/I +&6X??0-Af\#3J$YkQQ0,rcq\KC)kdj%"eTQa5L+@a5$#LKm]A=go7J +]AG9kA`,$U\+#DbIlBrSY^i0[X'!J>lW*gJEk@N2Yr#YV,^4p-i%qj*Y)LM.CCZb@V,RQj\b_.WQkj(kuDm;'iu*3/0K=rc;mIZN[(I7th);N#>$:N?@D%]A:E=&BZP'38B +D\n:>/247[r#PWp%qR8`+"[Ah8L\joL$rrf6/8eK(&8;GFe2)[7Jd'[fF'hH%#3'p.cW>YMt +bc'US2KU=nX]AODQ8c,Ko10_O[9_nG^)rZF\`f53!1(@[%^tU\N@,a55#1bkkkT5<#]ACGZ,.E +Q3Y'G8l7HIa(>^SN$m^964^Pq1Y3RZ1nrZ%I&YZPEYd40'aD/T-.YD3q<,"R,$=^US23]A3t_ +Z$qE]A,\J7WRo%XFWm2t]A;l`XO4`0!,2B[D4gp4^CJNKYcAd1C[f$mQk#:m(Mc$=VHI"`69HmYSCp]AnV5Y6a1:G_KgFg=qeJm=q';)IZkpG:5ZU"Wm ++Sh1;WDg%8XFHa!<`qX.5n!QiP:9E+qjE.Ief"MujeI51iX[DbhV,W-IL55Y.RO;Ci7kmug= +t)o75P<:]Ac9m%YH%a8k"^)kWi2Kp3:0XrjeTTqKOQE@RSAO\jK&G!qu;SUWY4r=n!.o]A4MTi +g.YT#>F>%R3bWL*:ba#+DdQ<-5MUAc(J+BcL6-@,?5V7K_bNl'Z*)V7Nf+3*Xp-+V5UPH3>[ +%@uA,jKCT0\,&p2)fWY=JGN^a@8N8WSaiZVh"7fJj*ol'Js^uh?SofJ&N]A!Cp_k.\Ktl?-lB +'`NS0D.a7F*JI_7hQ!!snb$#5T4JJ##-atMC%qMj^[\L"NR9GC"[Uof7pdnnZk-2-h+!kF:h +cnjAgb\CGd5m,!XkoI]AO%PneqhhN0.$KN@r\)c9LR:JQo4@*ht"YM!rpI?B5Z@3COOW)p6[Fr8TppKPIV$69Ga9uGu?a4b%A)o+OR"#%t_R +jP-MWK[[I[R/RAguRK%;\P[_;]AUPN#di/sb+cbG2=#RT)Q"6Je]AWYI%/5#eq\gi!t.8qF@kZ +,)6]A"fa)&rLtDIJf_\4Y;HHNKS=B&J5\s#/u*5W;_.p>%gA-%#Im#UJ:gXgfZ$7S4B3:LUjM +j2#du1HLlNGk3&/%Ul$jI?LE?Nd34JBgeAnF@fSZ=[&^[9J'oI.E7eK+C#" +0Y1)#W_#fLWoZJ!m&0_g8GG7pap;/#Q4t&OL+b33h,&m;P*Xde3gbP,D>\3S*K.,W(YI&T>\ +J^I++fPCD;De_H5Xsof(N[r+*;jI)E^i!)04me5>a%qLo4**[Wo*=4K['l/V(&d#4)ZSSZ)1 +*V[\;9_[;F*o3ZBXio]AT8JJ,F('2V'hU9r7J*5[n->]AZBL]A-9F`H'-;Gs(D0@R19RQMB-L6G +\9Y\Ps2g1Qr8BE"V\??ljng$[J[Ejg4a84MI6#-8>O5VDS +Gs^H/=d&"q.5l!&;>T-KI@q02lZ;ET#I)@[%2$N[i3T-8+>.Aookp`KI-V4]ACp+>"d&OIDn< +r?NVtX2]AW,P3&IrWaR1)fgop!7r< +K37shgu[i`-Dna'1k1]AWfX!=LCY5+koZ>W>)nr_o!QcTj(#o+XhC3XlaHPE4>XdmOoT!$*BZ +[,,Ou9[S-N^F;g#(Y%=Y(DiEl%8jUcm>51:7?Bh'TqV'\dN7e\Dl.NjF]AB#Y]A);[8]Ap1dGki +!UYkiNaJ*Bn\>X)uJ5o:dge;Y$)oIQZ,im-:2DDXWU,d;AB?AJ]Am^LPLYc,Z0j='g_6&!j@; +#O#OU>m#ea>=[KtAMgWsc@#Or'RPYId +!).>-PZP"r\Ue"[=VFMYW[DQ(j;D>Da>/C,hJNcIb]Am4'mQ;`n]A-o%\UV9(glrG!jX8)CQlc +",jI>4M6II<)lsKa,`5]Aj9rW.>iho4'6haBR[;r +=:^)'j]AB1eC3j`K/?$d34us+f.!8KQc5eA\''%LH)i9,NcQ;R41<$+> +h$6-)hTPH^j`rHFo%6(NROUpX`SD`CLi[MsA>B*tDLZ)ZBiANV0n\A8`tdoYR]AXAFR6l(P4nSXM1%$:a.'K$ +$F8&o[%mbn6[!PXj3T]APC[91rj"l>\e2;WPMZ@Iq%f>4]AF=(5OUWR.\VXW"%4Ye@=I^r#$38 +>ja?nFA?6LAH_Y=f[SQDCLZN\kduLfa[5XrJ(ti/fiRBk4^JEQY`AHI`r>2k+crNkB0)((+o +G]A).`7HeNk,1,%9NF%'7f5c"Io),SpjkRm(4IO,PPd>>'<;[i-9bM_=::Cf23SXNe,-HuHHFELsdmIAL[C +SgAFs&p5T!Wct9'Ke((G]A!T4=([nhQr,:UWZ?$i@"N*Q,L4I1]AHeA\!Ch]A)f27undpCFX,\3 +L[a27'BXA/IQF($Fe+/B.'GP'ZlR@jP+!7KXr ++MO0&ha>0&Y.R`k<&Xm2E^^+`eJI&aO!2:E9oMtGsaMF/DO..#]A+u5.p-F[2Z15X)slO-/I7^>^-tYCM(33iL=&N"KEJ@1jMt+_]Aj*[METl* +r4\Sf4Yuc>B\LMtA0?ol+nN6(Edrq2Oq]Anl]A%=>;D>&>K,WHXXKV7Nq8V!'(.JC*maNOlQqm +GRQ1#Z7-C3Nbh9PH-E_`-M.>:bG8"o&j;5/k#`Cq!:qE74Y7NbJ.Vk^(YGj\$NNNup("o"*Y +M^##DE4u&q6VP2uk%:R-WW,>D<*?0/5sMM"2tg7g"(9g=pnZ&dL)bkOk"C8$\?*Jj]AmhOCS;@u+1BA$@ +!CRm5R?K<#%Gn%*VHKr;e<'_hX?WnnfW$qEhF&D$(XV`kN4S_=\"p[oi\I9[%f-:T"0X$1Eq +Bf07Ta>uBs_!lDOQRu=07cf4P5F"3+GeT&E9o*DB3dcK2rt2:WV@1h-n*7HPl(c6t"[1/>h" +A?$>('I*kA>"??"r[Cj8Sa@iX7U.cl/KjH%-2.\r#FK2L_%\g2,*6B:g\m[OGC:Fo`W5r=S% +3Nu\cqN6VOu8Y$WU0r-)Fl<+(r:,F&I@hJ*]A+qW.a,\'Ot++5q5c1JsjMb<=JZX<^VSNBK8K +$2XL"d_ef`$Id3)5$#uZ>02pk2H[59ZVR0@>!cu?Y48.T;uIu7?-n6LZ]A>#GYF68l\-f)a.W +T=J@4GhTMRGFZaW%fgWBd_&6V9#jn'tL)=03TreM_%?YaZg]Af_]A<_[kHnNp\b(g\ +Zo?,t`P_ROZUbCP%E(H[YnJ.e?J)\B2)GlS>Ec:@*T;-0O5pJ/pb#OIkMED>[Es>FCk&eOVE +]A4,O5^[4MJjEG=G,H:AqaCTF`PYJRs)BnnGhXD]AK';8&hRIlbFo;R`=S'&Inj/Qqe:P$mld7 +^!GA5oi\,Gb:IeA/[8Doi\)K>>i&6LMYBQn;2G@FEX,YfU8b#OjU3b)`@#dhr#^C.Z/1VdXY +)X09!sWCsmc7mk)0k4DIp5TG(4[m(MoaL>=aik)L'L`'bYtXl_ILI^d2k*=oLd@c'Kj(O#_8 +V]A$lum+T#u6(e6c@87RS>[bcnJ+BH.S`C#A_.gNW=`,]A_aST<>)9c&0EpRnht6U/A#^ra"+R +C?p#kHQXBT\@P'+rqio.e.Cm.fB6"k9Rfi2LQWC0@bNaEN37bZ8idEXKsV7V>MjJr:mRHeRVr!\K27=S.pKcSTDm1,Z1"TjE1J +=?FD3P6",i'gJOnMgNZFiLFF8J1kuJKo"B)I:VehdAfW(PMG'"UU$17d(`gp/)n)O5:46&@4 +_u8*n*d2,.]Au.LW*mpWtk\G0UnFT?8Tg#aLR+==H>+Ysh%UDe[9e-8Kb'LUbL'!)YpfF""3C\*fECbLAaGE%O +D+9R_UbX_=5<[qe,gS%/B^+B$MtHE+:!$W]AmW2jWd*q.;K,AK3o1oE,DfJ4e".i4]A9o3&+KenKrtmL>CBmk%6PXCNKnCY8R\'JQL48;+Dsi>)2:[dPA81fOjU@gQ;%QAf_' +(3(_gSWe&_VM9T\ZIW]AH^hRR58qo>[[/#[fU5:mKMe>]A!SHY,@J\-I*Gi-g`,rP*"SINk8e[ +%nD&4-kZ+'=,rlKk=99CY#>@H-6R!n/#7hBKoJcAT:ZHGOr`SEgJ["d0r(([Rij2jC8@*M*S +=Y(OiG=$p4h2Z2S$i9L[OG"@qjQPQ1fPj)7?Et.S+6,_&U;A9oZ$ML]A/oLe4N)!#,01<_NV>5-;Wsp-b%@X'$E[aqI$-,Kk#-.QpS@ +lL0'AmKN;\5JgW4"<2&tX@UHIaTI9>/VfMGIQ"/(C150>)@Iaq^RHTApqbRQO\57X3=a$unb +/Jf<7D?Q)7h7$`Wt3K<%KhPjPU)DU_Out4R[IB*L^#Y:acho/_>j>%TiE%WNj]Agc]AqWG$bIC +3%T<-"\F9E<45G-bK'VK;F,KCnF`j%Z=LkS(3=`0<=Z19_X>K!83fnT&en,o]Akd.2\rs4IE* +!0m^Kq-i<;Bt1]A)6)O/btg^!&,7cjOi)YX?:W-2YNRO\f7Z?r\Xq-UDNdTtHL0slr6n`4>$& +g`6(AC!^Qn4*n6N$&b2miA)WmM1.``"m*%;IDm:#6`_N+41d$#ObOG0*"gcLX.V*Q_WeqO$" +YiuPY+*ho'0t]A>2eWU@JFl.bG"RYhl.S/&*^,+(%l`A.%^i60VB#b:Vf+9[6!)A.#hsjS1U@ +C:kV)t9njC,Je_Rtgm/T)H(2>0kC,uRgF7E>AankJqtZD_7\UL+--QHD.ik%.m%M[Ha)Q'sR6^[^?!_faUqoY#nbXW&#&l.a:>""p1&$9et+V&'04HTe>0D(XRDP8(>=3EUM: +?=u)ZmY7.lap8oR"cOY]Aq-8IM5$96lp9q/l=#OQT^RN6YHRg$O%T8Lj&[%`0oX[EIk` +jeX9'>qe;Nm=9\qA8Qgh5TJb8n@'8bbE7=PBR?^<=::CC\a#qB.Bh*F#pTbPX>!\H4b=[p3i +/)\7D(RIA=*p..jEjDEu>j^k+YK9r(d;>0gY`Hf5YYg/CB#0G]Al\Js[[8FYb&<2R@Je#fZNN +i)8PA"_ILE3=5foP;e*:P(@tIp\";?i3uB5c=>9bEFan(JF.*8RqC'd&2K`O3fG!d0i*@nn+ +!%qH]A`$3kLRMdoEW>\CS0u!o+/D[8a\\kF54=#\RM6kRkZ%7`)bc1F&13reT0J'8Kd=X@)KP"&\7%@@d_>+YOjR5YJd;iAEBeLTP5^Jn%))Y0*Zi&9dl6:CTg +PMtC94.S-p(7sg+7&3lJ%^Kr9 +->Zf)nE]A!$m8n'`HUHB[mjI[Q]Akm"ic?k3">b>L0WPa9hfFQJI:`Vl*gZq%LCVsR7sC!in`= +Qi5^::.fm:StZ%F.Li7b8Enm;S(3))VkQ#$e=Udnq[K74jIUX$?rQjhjY]A2HO_D,k66&K2!m5mQ=1^Ka8T!S.HkKB2"MWUDi%e4##-U.<-U +]At$FaUQ]A=]ABQAmtS[7Aq.R>l:IllmEB6`+\(JF,oRHHg"9ObFlh.m@,V)#/&/eo4IDg`S2tV +`?^*>P@e]Af,dc@WXK,[K;`/"ec)3pB9XO'-i&N/WB!P:fpb;)N0(-u\?'[agDX8i(FT%KJ#I +U.YjC3dL"7/pDCVj*hqiES%LoNQR_d8&JR$2)jPgms$uqVZ$jdmdf_2NXn#.P#W5@o^+#B$A +B=M%ZF]A5'lulk;F;=ad),"J$r@,_ts(CTjp'@$eZe_*NPF\.P"):H& +f5d0kHECRYEmh$(CAS@d&q81mY9K^`nrk!-\--dQUN(*>p:Fg4K1&_0-EFr\\lV\2ae7.@DX +n8q/KlebF.85A\1CQ+deA-.]AnAP0JN?4A2^r-,X9_t1)ToCb['Bg"ceptb=C!PH5DA`B\0G0 +]AE/?K6Ma2]At\!j6;GbRR32kKt$%R#D<[upU41O5+ga;/(=ro0'qbH;i/j8]A&0o_7eOmDo^9G +*QM!1W4;]AqZc:B-=F3`(kmIb8`b,46HIE*6lRcBq7OOdMZ$L16>muf?9I57r'1ATmP3t#B=d +(ic`@@UV:R"9@B_Tn:UDCA"5X^O@OmMn7LO3GnV5dLoJ#YC+RM/'?)s1KYr2f1r0fG&W)WXmCTg=QLF!d +J6'::E9S)4(#T8b5e2FU8d6X^^uNCi>iGNo09BMNSTRa_*oIo;f4uSSeftlrFH3dN2P()p)h +tMRhWjL6#b6>10L+jpO*)\8"MD/nhccS-N0lJes:t;g/HI6FldETcX$]A-eL!H9QPm;#o)1Nn +941r<;?sF?X!cahehW^N`I&.LIGP/J@H_q8>/+WG);q+ksqAZ)6WTG3Q`_r'q*2K&f]A=Rk.H7*($<]Ae7lmCsZ1qt3ukNUQ4o'!5cR1Xoep!QHd"S"\$:3NVN$dT +Uc%g3o\!q8*2KOP\OMKO9k(k<5#_7ehX9F0-i!TAQT8P:'pK_kiI33tQsjP(m.9553Jbd]AVM +tfgroP92tW<9ET9tpZS0E#D<@_%iTF`>,#q7 +'8KhrQblKC"C/$dbKD[0qCt?+?E2tYX/rC:GQLf]A'hZbNC+SHQ.ZB/_4<%WEgH)+_0TO(Tus +!B6Tbk,aH+15a!q`C>U]AN^o*D:1nIeiU3Z;Hr+!&Hi54moON^^9`eadTp0ZX23N3Aft*u9\bbube#.[iX^B6l7XQ!>$e!.(G_Ba,PR,;V0g1WS2T/W%QsnF?)E +IJ*k@r?E!7VQ1?jA(\E_XX\qdkAEGnMCuF\nZLY=)HR>f?!'eA621/m+HlJ3/C;gNHiuSK^$ +]Ab%s)OL7;pupZOX#\:N,W1[W'g?,%bTb*B;dX.%AHZu0+&spc&ct,^rZ"m![OA%i.Y2m'bSU +XMFfd'=4_#J"^koRC_mB'M)=%?nK0I$=!MC'HOP/=27PW5\qVK\hj*)^"k1Q4g]A)$GC0i%uM +9iPP"dm#m]ATC5(E1_3B48o0Ce7mo\,_N[k9WQo6YkVY0i8.`1KK#l9&.#ed%KPcMmYW]A1C.- +:,6^gTQ',]A,rGU/W +i7E*R[>&nKm\MkR&p3CC'H*Wij0#-%lHO.(+)S365"Mg1.^;>&[?qPf]A.aB'\:)S`66cPo`> +nr54*keO(+@V_;LtNFiT6N-Bs#j]A4lZ5WM8#("cREJ\'Ep7pF6SZ&e,K-&K,+ZO)E.ZM5qsh +KPrAK#\h.=@djGu+e&qo4i`$dROLV4dUXY,)]ALds%=YNg=&Q^I>\eL+4#+)Yo(3q#j@Zf,j< +]AqhKqXt\[&M!mDu(55]A_h7B;I%@C0R7:j4`$tLgSU7e13GKar5Um-2c9K;l0fXlae\O.^*^o +e*HU5i;k;sfkcS%!X`l5hAs=qf8/db7p*p;9#2X)#Mh'gc\:NJHmgfq0]AH5J-hXI=66;P[Dr +.cj^($+:O6#%,FI@jH#B@6BHpF"f-2Fl#*=#,_k^s.;cCB$%: +Ha'nkLhr3m1CQR;`tdU>B1_J[*@=N.g,\hhsR+K[(g%hfEW+b:r>hYP_>]A5[o8a(5[:*L"!,GX&AfHqCr(J1KGUOZ5ej`?(h2+*D2o)\) +Qh/B@A^uGjjo0;JKN6^OKGC:,d@1deLo2,A!r,pH*d3S\(al^/?MG7u-=T$0*]AskK(7K./lO:!a=f3nNWNsX;:#J3)VTk*ih6V*f +^_=mtJ%9#'@1C1E$7OJdDZSm%ir`S:_YITUElJCK(-;&#,@8;c:\Or-PC:hM[ENf^quf.O`i +m3\L9"id*Z)l_M]A='"KLrTZmsF`kjS/AfhJ&Q4K:9g&ES`qZSl*W+Q4BknZ!NLC$l=\K+&)T +I!$a$4gI>'ae$s!@S*>1KH7n`d.=XeUZ)T[h4qC$^UT_0%F@WCe]A'c+N'02sQfib#7O8Z5;Y +H35r]A[p5p1"1Ytc+Mi[UMBu1BWVUs-:in+j[?UoOqm3lX$37F)s=#'Kp&/"q+>-!'la'CatI +(Z\@+soDBR@P^c0m]A5.)#upc]Aun:*_J)^!;WXZVI`YK=XQV.3@JiSp12bml/\ug*VW]AgVL^p +Lf"88?&BnaPl(GT?j*ed=lN$8e8]A:'O*RD?%J9 +/&s$*PFpjf:bsSB'M)+H3a_q5lrl5HEg"7KahV3:?PlQ->,)!!]Aej&+gO)W('0eG')Xi@>@]A +sGe>BQ1t8\q\NU`Jc:X6>tUBrV*"(2;J*bca3-8Vmcg>4&n-R^0PZl'61Ej%]AG$1oaWls\@2 +^:R[![WD_DP&6unNiXr%)qFd`($*LJ@#%GfVci&BuO=f$RIjh*P'AJaC +^94i?oHZn$HJ?,'1E-GVPddBI(S`DZE?0qN>bSfl'^S7=h+Cq'Hl^R?\-4 +GBD,CE8g:s[CWnTXO"2,P".e#C,%,Co4TQrCc[kNItcS@2O[$="RqY9j)6.W^I14r0S/;dJO +Us&J3.\o..nN:T!/&fRPNkT@?GhijqZ\ikS=lT7B'Es3E$'ISrKNJBEbJ"=os>EQR#3H;h2Q +fHNUoCDY]AMiOF%TChZh*lOaRO@%H'6mt^Vmi7*Nl>hM&;cA"A/)[9T7/hWAagB?]AoVE;RX*( +B5^c=L`9WQ_3O2R7$.Bd\3mT"<]AaqXs,U/,V)/_S/O9mjo62'>f:7r,fL7P@1g>M/PNCk@)r +^4\5iIE_WE%l)O8lH@Lp'm:2(("qPmI'@QdG.bAWgT\Tb80oo:="f/h+M,cI$P?]AJD(t#QMI +'^rL:N._b(RPLI!^bq/ +k_::gl?OrrH5De;&WM+sIs#*S!Nj]ApYYNYI)394BEu7Da?@@`X!&@Rg9?rM2o3l$FYWg5QVs +Dor`04sq!S`RC/(&`U5nFDeeKejMY)L?ZA$;o=T.-Js0l8ue)/GM_W8%4iq2_Rc9;@AnCi=I>[h:>fIdh +g8:k[qH:+M.!SMi4pf8j^\0=ut4J&"d0j&u0$p1o0a8)Mt*2;,?oPo:6NX)5)*.-IG+>cG`_ +k#BWuM`=]AEaoW-.>k]Ao-61HZp&c3an!]A/u-OYa$t3/qD*VPLmfUatWT35"ZJm_1.-7_$/OHU +b!@dra>[e=XUX+eD#\MgFJ@)O+?2X9BIYX7M2Dl>nS&:g47\G$`ThA/]A]AQ+>%g!*g]A6/0B6(,6^'Y!Pnao3]A_4/s-?>0.6U-b/A +$m1aF/*Ku4"[.!pS=+GLr3O\EK5#M8rCp<3&l:?L%Uq9H0%!jFm)7)ZVt+cC9bT0X_@QUA!A +Dqq]A&T43030pO'oh[DCD@V[@,`Gd$H/l;Xhu,S81]A5SLP[[=WV-,\Dss]A4F^Ff;9M?]A7]AR)B +n/e3,k4E<*Ya6F:shpK%g&T&X;8SSAG+^eb]ApM]A0sM;u^gBbqc5!Ea,oM4^"W;06\nY,3g\+ +@F/@ilt%1`IA(0-Ja5sYDZie#(M8`nMZ"_&#NPQ?djhGUCXs7]A,GP`F^5NH#cEoI@`&i;4ON +r!4cd4j'*R-bR#*S4'K7jF$Y@$cld=P["#;trqD-Z^d18Fpgk]Ar]AgGY\K'a5;pVBd2e[tqGQ +Y!P,Ti@A,\?=JmPJ4m8pNYUU>7U-HV:D:HH0h8%eS-F42T$6O.gP3hbs/gWlV\hd@2aQ]A:D_ +WP'coMa;UQ/si8UT32a1p-2LJ9RJfdf(3eMSOm,Dd-1?#GFE7+:13pV`K:,sj6_5fZDV<+4?;[ec0==&KPK'Zm[6GIR,l +ALO5WXh)$nI)0tBn5Q_EX$Of\e@342OHc0O0A6%RGJ($\XolX6d7>pBkgLBi783R#l>%JT0g +Q%2I9j3/F[!c%ZfB0HFqe\g\IuK3qW`Yn&/&n"Es&P3=32+6@M`Tj<+e-I0F+[;#5.L<-Vd( +U(G;5%?s"o'e\Y-EoIV.?Q+!GeMq@HffTob[f,C$T]A4Nic'RZY,o;?:"pPc[Y%b?&dB>2%G- +:`?plI`h;/2WoU02`hLhRVrD""H%A23kJ>"R3nd^SW7Em/8N)7$5Qc5RSuk484;l?OZR$LPF +n7j<[[#/a3n1S0_o0R4#"Y,o27fegb\PS%#Qljc&o(\p".:`JSD'W03hC?jK^6,5jk\Go.e_ +"t$_'mnmI7B&W5YDMo;\%9=qK#eY\GHG7e&RDHm'ZL(GTEorrpe;Xk`FHBT[S?M0+$ppgs^pJ=N"=fRaFHe0#`scIJ7%Wiqu3eaMoZ)gM#+I\1,&5@k$XY2d2V=t-% +QHWO7@#]A_T?b8plsBt^r3 +),:9Q6&*/_#q9*aQlaf!\Y@e[hip2H3&e5_cP^DjM$i["6q\I(S.b-b*llAiH\aI#<%3@7X54fZI9T +)Ri\7O2BEk5'b<>+FB]A0^&.:C]A5^A3E-DuWZG[>K+24?Y +k#:PQLjAQdhTJJ&8$+@O.^ +0?VJ'B-5;i0i6lem0Sb$0fYNGE\J,Yl(8OKHHpOt]A?sOA^oEnhi^udkaV@L^<,h.(UN)+,hk +FCj&E]An#Os#jlHMgFAb,"]AtP`gfqWX7-:KI";5;J]A2sjScC_0QEQ(o^&=`25be&/oJ@HUji; +)h8"Fp>+-fn#;(G:DMYJoUE+:,31U@(A#'qbg#U(^Gl5!]AOc%2b\144VnGIgs"7p0/5>gBJ. +S/rr=XQCiERYW-Vl0?iJV$)qCX!!FN$d)lUN51Fm90g%KN!-=ZZ4loATVbCPL1_NG-]A[L"X,/g?8LBZ0:k\qR1nc@h'6/5I-%A2uT3pEC-'7,t5"p' +:j14TVCJ[D[]A]A./_0L<,AAcA_Z/T4&#Xk[q=ftCr'-nC0L6^!Z\to!!2e=T8b2WQ#!Rd/DGI +dCH$K-Z0HcE@:%>E2]Ap*!VXY)d_RXtl'q!1Wr(k.>nQ97oWGU1X0@5&W98nK/s*o5/s&`1>b +s[S.1d\B[#HE]A0["K3tT9IZ_oP*?toF\d968fn`DZ;M4Q7d2u<_Wl7aWE%X1n7\IE65?ap-i +%+Qob6FK4?jGPNCfnN%fP&du+V1=Sjgd4PQYTELt:`"Qj.`^l5mP\1lmCZT51+Js9OrIn0J+@`II=loO38OqG=GIbK!.^HpaqHd$e`;_(8APU_/Z^;+m%SH#7s9/2/gY\RmW]A$Sa8[9?0Au[`61:%$b`1K6 +c?\sbXVW#:C+%f3&K.pS20H_0ggm=og!c\]A`bI]A"\412jCMKdbJ/p2#R1BOZm/n=ECGnE%q0 +nm:-el7`5$gO)M1a>k4G$o`&Tl5+)_XcLj)10c9`OLo?eKf[Nql]A;*;#T=qBi!-os_h^df'! +akL7iUp4/ZXjq$rtI(%_K"4@mClHXcKGpWSE5^laj9K^L9!U_RGGPgaicmI*7p^0%)-K#eaj +;J-QMEc.[IQocSc<^`8P(gju`Z-Q;EfIZ5GjglsL-%*!Q3@"p@_R*6F)*&M)lhP6BoheG,<\cQ#DUPL$V"ftS5+J-)^pODp]A +hi'%7Q?IHRn\+5g]Ancmgha$\h[.,=2'43'-,P/hI,`TE0lk3+9ToVq+W_A+\e!KdSV3iD;Xc +HK7O:`fI)e%#]AUgb6&nJOb/B4Tu'O.[:f(F.&$A!%U.Y5e#.drQehX&9dGEF@_ME0BVAbsQ6 +?r?'*2P=BALF;9j:c\2nN%^^X=Q*-giVPRXK9Ip8-lJh^QE;OPSc]A?QNs!As/<73PIJ>#i]Aket]A.j^?e#%f\YL@@g4@M9G,YQ_gaLp)r8G@sb;iTil'sjd>c9nB\+D?61 +0VWuK[9SptG\=1.A<]Ac3nQiY20WT1c09^"rc;XC[U:.b,WUY0\NALqp]AS&`VlW@I6tB5pRf`h?&HoL``O`(1]A/r,grp&!\>&VHJc +UUgMp[R)iOo:VCF@PQ/Lq(PBqbHt80XM3YP2YPSfPS22q!:?elpl6Gf'(;reN?Z0`W7CG.ng +W.>?lSXaKZ6Xl\Y/:"k".X5cKP"61qlgXME\&r9Q#R>g7p^ci\7p2s ++QXKOcb=;i=RcEDb^brk3tH^4=\Zf23`0NTh24#HZ@F)DBG+ua6;#r(Q(YC9.M$-]A-OYQ0OG +*\4RF%ijFgBai($,%%RtH-5*B(9kN)-:2bIMYNeCU8bP'MmP+7RIc)VOHWs)`KpDqrE`ik[5Q69dmChGWN0s[og[UbM-FZCBJ)_1B`f^qc]AqV*MjgR`60H,BcE_T7iYO#Xt1BE-mU4hhkf$]A;cO3]AL+% +/ni3XAVXl7SYNg.N1OK;GQs33iB3(;NQc*DEV`@JQANR5MgGA1CK<\=8e5/"jNf!;m=tRap0 +2)??$%u+.P#'pQLdq1k"RB4Q2.4mQ^\V/XaPCPN(u2dTDVF#:]ABFph09UT$d\]AV,[,o9"Ord +*.;(GlARPUUc(!05C%r:Wi8$TW4mH,Pi?[='c;L!UsBHpYCu#>S,)lkCimlIZCL]Aldj7F&gi +,eamg`YZV0pL%eX\GU<'!6-^K9pKo$Pag10g-&Y[ccfRm!;C9mQM)O20Qf+O#aZM5H)aZVXf +"Y"NTK]A)SaE]AJBpG+2]AMTIb>#($jh32c(/'.BJOp5nMiC9E6Q=ieqC]Aa"hG<`djSIrcUa0Ad +au*j@#VuZCC\9U71Z5"=,i70m46SM.?:,SLSX)m&H&PU#OpteC4hq/$b(BW(j1#5s%A2t3DQ +,YE"HHp<6$Xo(Ek3@(gTl^gFm*f$]Anj\`41VY-fd^Cra"g7bVJ^-e@g`5;c$b3\NT&?=0n9`TX?m=`fc/M@0'%%B.8m8:3bME%G`D3<; +=GckAYZ[>270A-:+1*MK8AY4<2qc[>=t/Rs#&OUnD&*e=rf6fKr@[:Y7#6Dkhfi\Ff>:$p6R +)o=X.nNH6O^lEH/W>-g([%35EI^fA>Y;n>j$EqRjPT1]Ap>&Y@dIKWt'sZ4X%%fCsYP2&o51F +-oKVUe1cS>`f4dX.9G5G$Wpc=XFOCEbL[&"n7.V%/ge)23e)Aso$*k27%%3-5tFmRYV#K6c- +d)BN98#n/VaCE%d.IeVIq9Kk%)T*E"g0H*)73L'$+Zp8)iNYm$:=PMjV:P4H=GE$^NJUYJDf +\4`NeMnpB@F=;u.77Dd`J<@qDqpNkl)qBE:Z9!Y0#6bo[lUlqdg4=0'<%E^Q*.i0BW&0`%!7 +_sj=TM:MD$U#pnBVQt(2`&Vh.V!Cj$7]At*pP1n5Vio_aR^RM2&.L9')6JqeN-WUrLE):5*\6 +XIg4TA?VQ("Y>=+[3U788D`Bu;PJPr`C9[Vd,6uAo6@V+k',e?tE!6HPnUqsO-IOAR(LAFTh +-F"%\hTZ^:'#?/0^Q+3Q=bBbJ;JL>mK0"VnVD?>Id#M3f%&5*opVkpg^Mc:AKRbt?T3/cjnk +;'p&Cl)"4Zu@#dlrnj&:>b?VLocXLq"`jT$6'cPq9Yb)O:kM;H,>s=+LQ(F/X8:pWR"C[V"\lb9%.u^qk,o(;#`$SZ5X\o&"`! +R[?"HDirT)j@,8MNdJ*lW/qqk\O76Vk37Y$I6"d2+XNq2-hEZ_eg/ROpYYu)T9_%A%S%F#+" +n41hh$j1%#9b\"L.*tffr:QR55[Aa\$Bk5(2BFY;?0V@5WVLFMON'_`f+>llKo6Vgp2b`@n+ +HB^>U3=n4I(HAQl5[aQ7b!Si<(0:R9-K\qngjreC`.%N?o[Bt#lNX2` +Q_0,Ro[\h>B1\-B,f.:`_$m4U%QV`>c#UEZJXSp>T?X?t_!@pYTb4\]A +Pnel.-d%OeuAj-k2'J*2Q:)b/,3G,hf<[EI-dq)004kj'Yq +)>R6Pu@dsZRj(ou&]Aa50Lmjk\W';FQ7]A@8O#)b2.4 +4?OY\BWFk"0J^HR,-_4WaUde>]AS0;f?I$Y'i8698(bH>30`)o1@h]A?-&+fgSA!<+4JnTg]AJi +V?+cd)^8NE,_MMq%s+2q%Pok[`:;-*2oG[FKQsTV4$P.p_&*GkC@;>EeOXMlVjrfmV_^d:.& +ODj/(/WM/aT?jq+S@*$ZH",Z3VDW2THg3Ku6]A=%D9_r/"UA4>)]A*7`#tDLiVnH_oVrf]AELNp?I26i*&?C8!!WB3!iF@Cp_Y7ST$eDioeb +h&B2-S$#66_-+#lK.9-okm[??,&a)QlA,*Y#g`g_/^$0n3LpK.l^r`b6$*/clu^JA]Af[Lt"? +6m,nEEE50B2e4`,a-Dr"Z'.*Qiu#'JUc6+Pct\@(RWngu#O0naZ%+5t^eKkP1/2@(YE!I=2r +J61bOG&'tl/X_5biVLNmbu!"l*NX_QS3:#C) +3K_GpR+@#OG$b&DdSR&Erej;IHD=uG^;T'k)4hsIDM:X:i[\BL^m%QU(Ub%eAK=X4lqcCf)e +Dbf=J#7nX]AY(_b$&U9,#*<(bEuTi$3Lgg`BqJ=*4#eM9R>!$`pGiZ`QIbqDe8/nZEWdj=*A3 +k.A-n6'_6o.VP3f!Q]AO_aM1_DJE!0pIoBGj+aKM^Y^Y?I,o*=kkXRrChLtW!I7RGUEG`Jq*S +0*?L2QjGL,E#::tIs_`:r2\k@m^iCQEG;-K^+r+tkpe44Fe\BMc0PNA.;sW,.pXcdu7`oc!+ +;K87M?!d+_EkTBA.8m-@Fmc^FK7o3&UCL+d$!"bGX!W:.B^6=N=ROE\/j$@p\.r>U+[Fjc*b +.Gb`qfoOWf>'l3bWQ%jn:*_C7Ya9QA#7m$]Ai%O83H[*3.c1n\KM_jDfHYec/*?QI:j`CD>iMpWQh6Yk_Q>1PA3k&')?)&l(q]A+:hRcq!FR +P)sfO7`El?bn7r[BRnq4;j]AWJW9/h4e!ni%:=8>]A'([>hC!kX)E)%1a)Q,V!!dU!9nN]AEI$d +aR\'>V>Ja->dtGc#:t(Sa^]A!spHK)q&MVeL@_6FXH1V-[Qm>I? +lZ!I;Zr%2e@"4AXjs"8=\<]AMA3-K[+%sM-Nkq!/=YHKlGW7@;3LQ?;tdsMn\3Uu-.L<4?qk5 +!3.,G16FGHCdOY*+,qRbtKXnK&YLNHo"UaMQj0lEn-&a`/o@%]A_hq;(X5Og.**(9jTmjnsFsO8:Upn-8Mj2)9B=KnXk7]A;?9&e +9L=Q'E.%oQ4qo'Y7!@J( +uj!afnFmTfe0M%L/n%e$HIN\A&DII-3]AKr)ZZU]AEFVh;uFR5hU8m-h_%A.*g*%Qo:8W;CNS& +tCfEm(55?]A9e8`=E9")d]A:tCfORed90i,3J`*GZ_E-h+e&Xd]AqF[0RImAW?@!fLeVHY?PW!p +ie0^GDYi$E?cgGiNsbVIdfI0`5tC&UjfRFWu/go8GI1\b0E*#T0.?7Lqj`3U[>ulo5@ +H0,]A4s_uNhuEqV:V.SZrM.:Q;&1;s8)2;_f_'P!0>L&:osS"D""+[I_,;ZSoJ?t(0Uc#D*!R +Da:7,>[Qb.EoTCDoMo5#;_DUo4HqrqI+6pb99mU0k>rJ`+7dZnZf^C8W0DM>BW70lB5 +<(`Aj(nfG_Qg(k+4f0I?UFDZ>VJTFf:9&s*]Aa)mZd-X,AGhlFqBS4I'a55jO[6%FW*e,e.D4uc3D_:3[)'LU=$u_<6]Ap]A8bVgD:Y=:u&X +WSEB0,)TcpA_1@o`(k0oRF84PYMR'\bq5+\=1$(#r5`griW!jT0eg5H0G8.~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +h[H +$s802_U-XT^'ps!b228N5J_M)6#Z9;#=JXKA@P05e>?(PHTl*h)iH*eF1:)rmL&FjV!eiaT% +5Ep6A`ek-`2!b8`C\;YDUW1(/O'u.(X%/RK"A-mPjF]AICu$\EHW;s!d<4]A^m]AKgE>q]A>Dc!T +8V_*5,C0U;K$7,PZV6@_4t-t!!:H[UR@^`F\m2udYDoX-ITkC7@AGQ3/%s*q-`i%En7Y'3ns +[]A1V\Jp5\LCb01=YG3KhF?]A\8>;$ri1GIH@'n2S`p0g!g+&D&[D#3S6E.<@>oC`$%7WFt'fA +YiUAplKN*[[INWH$h\G7*Wr:7';E[GLl,`l?#[SaT!:Vlei3JCKL!6j?fbLsLqS!3NJlID()J]A#VZ> +7U:O)7_;L/":KGZtPH:5g#;6T?NbShVSedT)cE#&Hk9?iUtsS2hYKmLW +MnoZHM!>s3:Su+4s7dO/BH;`8K&U(#]A+-diERi,F#FRf-Pba(NA>_7;]A5/,7B.'4qC[jKf:DSP9=^r +")N]ASIQTfh@_giqW^U&R>._05[DkEQtq9Ls8GAL%.F"n>(n5eN)VX%Y,*s6g!eE&@.>[a)AV +Sg86_\N?^Arr.3tm,W"'(=p`1[Y3`9;u.?5JA>r-da\?dOe%il/o0@%CqkaY,97/_8QIWHWShIb(K2:V$ZN]A +2rh/<*7OpKtHGje0B")"m^6#7YcQ38Eui19;=pX=ZiDQGrd%k_BD!SerP?i';.BM+k-OQ\U4 +XbbN]A_enZVO(hEQHY[Sq\MqHD=F^gKPihPa6NK;g$n76j'<`Bs#_VaL'HsJiO3t&IXML+);0Z9.&/V`YC\ +;DI7i*+?^k)GfN3*2"o:m,XsNu5Y:q7B*(-/ZKd5;2@48?XU.*2@T&V4q8*#5 +$SEC4Lp,[i'67KS1oQ+L84-"*-VZ'GX9]A3cHS]AW<]A)Y!nRY@*aDW +:3qR[A=X5is2d,f$(j\eP^DT*t?IS1eJkjVA4_RK2NYZOn*"Mn%ih.>t%Ru30KJ\`6=!oR"W +n."#YD7f@VaG-g+o-]AYK1Lo7;%@4-?Kh4&G>j9As(Qk4<"!CDSA2\N +FsP31oh$I]AVUnbmArNZ80.3JYDXM^fT_`gXe&CKVaV2,1.'OSrc/Cpa!YHdR%jEbuH6\AB'XurN\,:bVq@r2A +F@N_$[js#.7.EOFPWDFY5[[FJ]A4KKhB(>RnY'[I[<=h;>!2>LsW3:F5/LRL[TmpoYn;R:MO\ +KEe.DRt1b<(rcM.2EmSL_JgA4-ULR7MSQCR?`T;Je8N5PAqOr+IE\Y`KdJJ:jW3QYE,!'H.^ +ec6gJ:_R&&q'J*fgc6@oXh_u<%$bQ5`bSVP6VA'K+3\m:uAZkN]ARDbg'E8+,-GA:@Q3*u,*\ +q):lsrG'p0fA[8K3k6-p[>>58&II!TYZL]A5*Wo4eh)F[)U<30Q[LK6=.)=/QCFJI,"E6%*e; +Q67;gn/lkf$p3)6VC7&Jh=el,qlu3%i"n$5SVuD598I_XR<4[OWqed!uRb@jIF;X.f,]A8sP( +f-pu?K$=Hd5r&,/Sc?^=2b"^A,a=JG&*L=ochnY +Ic$>BGo$BbZ0Aq0BE9(%UrE0e]ADB)WNDAE$V^Fn0-c/YAuX'O/*#,CIe`]AGmg7,Dr>"9Qq$C#qYnL +'.qR@(Lf5D)ceGY@_$h9e:4BY!r)&M+,M.H*+T=7-0I]AGUHQ:Z5]Af`p6nRdMEM?j-]AD"pA4n +r*Qq5K(7)i&KJ?ZM=%VG:6;GE5'=&H1QM$\E"Sn69&38#?h2Qkc11\cT+\&i^?%fpd'K0e7> +hWo-)tJb]A7)ZWI(.]A-jRsYD`D]A^6rp(bV%B&5Q(Jlo#-Uld.A>+IUlh\l*2JLZW.P/@9i!6K +8tA,Y<.(5N)`^1`2$((=V:Y2c7(g-XF8uOJ#f?J$@?/B1BDKGB&s\Pl]A'H9MH=t4P91:eVj"t?Wj(>/\SqX=S?6nI@Cc>-7A;CVD:]AjsMS61\1rC=V7"s7<!ZS]AeDl1%+CYj2!QB_#dQ@%B9>`Pc.9g.88i1eb(\Y"]A +MZ>ncNF-_4PPBBd::*&8n108\5\XdYf6bi2GTL*IOMKc#PBRe^pNos-KugA[/O8/\=-0(&T& +V2>/(5f&*$8VL0\9lfOFg\5cgEUI9!(jU$nOdr=rn,YL@!o!XP_3I!K\dnZuN:,HBmcLIA'k +HgJIdpSE?n1>^VY:]AHbAp3B1=Xg)0!G?FInSoP:+2'QJqCm8A/g9OqLp%JD:"0F'\oaR/:il +>pCda3W4`3 +Ql#RX@^FWa;hF9-!;uedZJ`@9goDIAI2k-.1@Tl=ufmc*[K]A#lK7!X_M@C<7VNs8FtE-RQZD +ns6PN]AD2&E@RoO^91PRXmpS(R,%U)F#PCSQ.g:Q10t8pM[<6lUS\7s\A=ao!RR3^o7aY8?G? +-'561E4.Wk'9Q*dIi&I+0?;Beo@3kGK2G>q)g"#7&:"fj74*!*l?f&_@9m1HonP+>_)EH[H/ +*OWmhG^Je402"W$kIpQLk)td2-)mgfC;QM.l;O9=e-r>pnWmU5OG[U5QuBdNDVs7#?S2*j\) +!GM%jkIuDu9eB=6SnohkRJn[bqESbqN2dZ))Pe:?Lasn_'Sm-3YWo!=/A]Aa'3He;Z(f7)OZ: +98&KN@3ek7Cl0k#EX)h.eDGD+M02D"a!PR/M8;Ou% +rFAj'=r:3oP/XbUHMd.ga+NFm]A0Veb+[$>`j57A-?p6CA*>re^XWlW`SS +pRTfD]A;ZcbYhM0h?mcO:-P=bTVG?"/8ZeR(VIGRoBpCA)"RT0kF;Gk,>fg4Uc6KRQu:Qba8( +9:CE]AZ3^$$ +'=>eLWQa%9S^>6qoa.il==YA(k\5J3gS6\+,"hI'p9STm2Do)1GL7'eOVip>tX."uAVk]AB"XiJF +:22X\T?6.QQs13@@X#@H6K9o>5*3Lfbll@ZdQ*\Z#KEmT@=\CXspKcBK`k83.]Ah__FZQg"Rb +t(.fJNg6-#j7Y44XUSK8AUk35J[:ilp7e68ZPF[^k%fj\XcHF)q)#_lc1O.UBDrmr-'t&T5o +j%\-j.F'XAk>.bWIHWF/j!r3Fi%oK&K%q[;G#=J[IiTqSu0&GqY("p(MN;>i-b4@6i-3Dke( +%TEm5(=M)BaF<#I'tk_7qXL#cJ5`OTW%=LM*IDBLG4P"9@5/^qs#I_\0HMIs)!?1IjOG4gWF +Dh:o-h,=p-Gf13?AQ?$n=W&ITq(!^T^THuiQ!;_l#% +04BPZ.ROdtb>YakXn-7U,aiqi6DoVAqMImCalTKu@3cLrDLj8WJ\LqJV_Y8>^]As3M"`i=/eG +Gkq.ieh(369^)3XlgcRB[8GdsV^6GE;LmNsDU[V1+7b`N5Sd&qU*eV7QfP"2aMh_DcrHu@rr +e&08AG_!tANUtq4H)I9pt*B@$Cisd.GuXrt0$d!AT*NPFoaQ_5"^sTB' +M_^Bu>1HQP'W^F>=s4(D2auc`E5;edIPOf^80 +A&o'k!tr2jFU@d38^WR^j,hpFk;I6$qumVd.XPMAcLF9ig:@?]AqapGLk-0VWhK-jPLK9B&:, +sr8u"T,+g3#ogB31-iLO7>Unc8\4B3G^n'YfnF\&Oe#@.uMuG=8WOM[Wf!(iA&Sg2%f+e"l' +^:83VVB.2ChTC"h\!OOQJ\GBW7oMaEC8-ma\2d?R#u)ckBc1(+'2&nbp0YC\8\W8:.=_d0:T +oBV_sha8l[C7>5N=X;'C4r>njH`!jS!ado2NbihqYJb'Df'[r@=HD@COSIL<,6R4$F-nMmEM +?]A)"^'f_,X?L(t$dR=b/f^plejLfQo&"4tN0Np,?Fpq@?I/n%dNmupEPqWTG'-_21o,14IJ/ +6+,8^=>'((k/SFD!]A(Q-Z!uT(N>n,1>B,%"h0'8iqI88K1=\LI5*\AcF]Ao*k#JY"`Up#K2sT`r3=h@D_%L$hSMf.dMn`.ZMj=N=+,4pm,3I1*"\& +UgW70et=!\Kt;U0-.C)n';d6Ju,7EBf6VGSN7754t.Angla%DK4?BWaH+':uMGd.EnS$m4-9FVN+YOO5 +u%$7lXJ=n^d#^2E8gM7EQgHkudjbGJp%@.n?Zs,X;ac$iSJ2:l,H)[NcOZRM0oa"npA.s,l+ +jA1``IV5m3M&!lYCagL8Q8XSp +/Q[LmG=QT=sYB@Bf]A6-!RH(A%9*+>2D$_;Z:)V;2dJk,)=XqN!Kq+gCJbQdU9iC +qfK1(1fGT@"tP6$R>>`GUuj+,<\diQI52^s1A[C6a@ll$B84oUY,bk[)q)NXCR_r#d8MXca +EP7FbM4t72HQ)sMPtIB]A9Q,5Y88/%hKbXbTX`eZWQG6$]AG!Cf(%kaQ$gr_tIn^B&D[\G]A^Z[ +`1ghGt*U"i2a@-Pb&&8:cocXN0HWjtTL0V[g^"@_8n,0D7UV"^)";/J1q[EXbT8;ibiJ?=@Z +_pY0HEgOY`T]AG4;=B^acU38.)p8Y.SRC7$6fjYZeVAVF>`?o"CFDNW2EUGOmdW,'REApJo0Z +48/r4)bN:LO2"V>iK]A5P".>XC"/?(6gqPEKWM:+@W0$DAY$6^A\u?*SZ.Eh7!9\\O-WcN*BS +:'X`#-S!B0c3]An$U)p*/:SRn1I-9pSnnLKVU*feuNSeW(I9_0TTeo#V?$#pW\=,k[*Z3D1^Q +AA3g_Do5Xd_8.XIfEF8Lk:X%VNlShLk`KhY0Djt7Y+$nX3"7*Fj)LF%\K5TYJ,4H*U=LT_Cm +3FThnb\$N`RV5uZNG^.)Z[+]Afq4\_:169d!A<,E/@Q[GF4p]A/j?t]ArR;F9CnrG6m)k6E/&j1 +oP")EoB/PZI3Uf@13r4J@:/;Xr!NNh^ZWY$*K0H]AqRYbh17!0@2?QV=SI2i\K@]A`$kL<\&aB +ktqbIQoN]AY(E=I4hi]AKY3Dcl*TP4`Pi=jRk.T(W$>R>HH4:!Q_47$\O?TC^(K=gOhV5#el<< +f5Xrd&Ri6h*F"`RuJPQ3YeLp"ukua@R.CYHi&LNk$o#Z&q=S?A\',=f>3VCbqCY)JS7reKh? +dn5;:\'qCSjJ0]AWuJ^*rtA=hs(e?DO_+>O'.(JmDoG`f=m?dnL@UN95i%a9LXsOXqMEn%6MT +EF/o2Tcl*URQ[9+VJ"m-7&SS%3,ebT"[6t5rtT=A*Mgnb*aWTmjI*3*bUS4iqS'76;Xg7!cg/-DmTp1PgfPU2eW8jrG!rj,LANKpj2 +#GIg]AsjUo^cLU$ZEJ#Q'`5dr3TUE%_ZfkQQgXn".0_D>V*S[54*XInacU.+%%L0[R[cT47Kr +^V"4U3>gG@i&9&P#doh.2/&Y_>)[K;QAMW):I6@X`_-/-O$R8g#oFbM@i8cc^sif# +-Ue\:j2f^8HWS[p0).1;<=&P>4Pun]Ajjaj4<&Q9Q#dQR^\EgE$\mENQ-M.O&Mk +Fkt5P?.mjK]A5QuE@tOhJ-+EPr$c^)Pos2uELLACOLe(Ukl+8t944:^?;_rQ@.N-nGsmbEJJEapH&?S'mm]AeM5??%(]AtVsD_CKh&&C +Q&'GW?pAI-593%3m!S50rL`I@*UP0cDAioP-N)6nOs]A4Qhkk.<3V_/Vn9..fAjq&sjs*eJ4h +_H0$a(j\\Ei,"b(25\L/g/m6'P<7Mo.P)F9/9g8`C4pP/p;-HV!-M5Cmj06lJ(n2Kc#[-)0C +[#:uPS'V8u*TSac)Q\/Tg)um!U6.eKD:.0c9(#_^-UlXIL75.sG>Uh\om2<,2N.J/2cqSmgl +[B&g,f/Egn8?`"fOmg:A'`?[d=^S4_<5Qm:$m_d_K8ZI%%d'NmVd+3ZS5Kc2X!Y%%=n+0L/F +*d7Q$HVjn"Nu67Q61di\?!&/>#Cf2=MES4uh4.BTb;fBKc'aL_,bpk8<,mH1+>T$&+]AM<^[: +4UGkJ<5.cKXK#G>p:C74'o"IXCmfTjF43"BjaUA=DV3@Ap'hB5E3=&9ETZ?u#Ij4uXd@!CZm +I1!c#XIV)(U"b5S\9YiYZP%.hJX-mZ[lK7giJCY*nO_n +-^n$=(e(uE*Q=*1L^F9Se.BnfZ0Wpo#R^uh.2qO5$kX2$AS07jU2ZW<[3A&GJ1mK^3)8f%Q+ +6Pq=#/D:ZNCs^rq5DZ)J"4);)@d(^Dh9_U6h&W`jSD*)@%7FSj3u%NeenRfhiRnXW%c_u2)` +?KDGeddo![4his@"O)ZBn"=uQ,cce`cU0:J[VdAu:hSeXp>_L&$uRfI5X6j,D@F(ON;`cZhl +"Weuk#/G-L6j17j$9(eBQ>m4$$lL\U$9]A^^K4_u'Yn'-PGk[&a!^>]AW^W"Xll3H[N:-,^=)# +JHs4ZH>&nZjQnLj7_="pooDdH#?]AK+^HXi;daYH_Wu.X@d"H$)QP>fn?1Z%QQa8XFl3^jGG6 +JRNDn2VjkbV!'\9lqVU;!``bN\IR<"l#S_6E[aX$d)Q7+"2`\ldq?Rjp2u]Ah[a@&<7>';S/\ +ARp\LMt^gAi2(!e'6?4'!p?%OAk+9X^e^5:M)GJ[6ed=7lXE/!p]A,lR)uo+epdQC_mgHVn!Vc-D^[k%e +F"=?IoTFBB`VIjO;GcXFY6^)c6hlZ8A]A^l!I0di1%q+p"JC.'6:j.C5NFch-QAC:LeE!.8rM +1J?"QNB\D_^%-hs95G8UMnXr6p_?;-6HY2#tsj*FGqr7`'`DWuXKX_$;9_m@8e2=*JLP1)!T +F,0YB+bb/)YYI(TT:d-u=hj?N&ANPQQ`aC3T+j<-q[Q3aSRGaf-C_geMge`-Ul9gB6J[9;6G +>gC@ZR]A(tnoTP1esEk.QE'2)V"B(kVoo=QlKgn=4r\9]AGP<#4h`Kj9?+m5H*>VT>`V7sIrHt +qmkJ(_,Saf9B8/C'3jk57OLblV';e\m!l66)9i]A'!J_U,o750>5=H+dnb_IoZ\@rHaj[j-[pV^,bUMY)VfS`tC1M\ +sHSUW(HGqIZlq@FQ:;&>>Shb?jA=5a8k]AVu$]AkF"bbf'mpg#ino'$lA0$?7rWIb:f*8b)]A;P +8[W!\Oei\+ma8XBGHc_/b7j11WcJJ3K)>_uk@:Uhd>&Le=9!.DCJ#hu.IZKsIW)BT1S" +]ABg!1TLsqSV_l;4fO3#MY0c9`_fTuhuIM\dN=gtI1\\bn[8CNheA^%:9a"CeIM9cFZ[`6r<3pXKPQJZ.eo(Za_bb*"K4 +_.naVrQ]A,cMY,a2>HR$H,QA)A#UK]A`,\XrM%ecUp$f+O6$3,mdBMf=&S6ha+-nJT0G^Nm:fW +j8gB_AUV0fA<%WPuCV#as6SCK8MEhan*37$$Ddh+hVg99r'_MD!n)##3O&ZGY&gpTZjNjg\f +X\!c7",7-q&W4X.g(2_.;1 +HW6EK,Am8/]AWIDa!W:j.ok@JUf2DlJ2N9"N4IK`;NW:Ad(\,/n=]AZ*W&2+_615/"*B;.?J;_ +9^!\F7ltq+q)QP:Q>.XMPk8]A"HMGjI8',?.l!mDu.tp*68_kY(=R(ahhR$n"\)-4X]ALh3A)= +dUN,Y(RSd.?PLL;df/gKEP8/t<%n\KY*,AbFtR_;o%[&KX;aoh7e7-*g29^1m-p+eO+iGZ7X +]A"/,G3d4a=kqeAm4/;s_Hs5W3sbYjqR@@SLo\NL<12Dujrs*Zh8q5pn,$r/71J5e6jR37R^R +KT`^=C8.-g@t&WId;dpgPn.JjK-"\BpAh7@3Uf\gZ,\E\t!QhR;+k%gYaSP$EtWgJjZY%GnU$[H"FM=.:2#%HYXCLd +0rL/-!2V,eVd.gkX<*/+\*r?Fbjg_NO*;5P*%CM)2:7EODN_;\4m0VTXt>a)23I? +0E'WY6PJ+9?SH>B+?7pQK"DQf7+#!QSk*]As'I`j]A&cEPgTa(-!Bq)g.'Dh"$HH!IEW]A +TOT$r't*H4*k^H]A']A&JV$X'?I2f[-JBB&UiHGZ.-P!WGQ(J:,;H?8Ndf- +kZnu=X'HQ)?hCXK&=k6aq6#D5ll\RKs[A\YZ.:WtbH#">dW$Xg*ks2LKuMrT]A]Ah1cDep>aOSkmPr#VJ#QBp-`YO0"mNSX,1rmD[H3L"-&XqY;TrW_:Gb1#8H2G837*$pX +`1;\KPU^3Xt=oGUr.Xpd.D@'d!'U9qkSn:faIdCo*0-_oCdL:=mF;_9LEk5uj=bI5i7hIbN4 +5'%*")K#8SKNU?dD9gaV +!8/,Y*e@VA0KdKt"k^Wc5+D;I\U(p$OU4aqe76!+*:j]APYG"E'j!K2j[ZEO1C#XO0;&VO8:% +0_iGB@RF.1,?uDFA>$t/Fo1^B$94,4);V$g]AIXpo&RiFm0r'm,6^LW_2,"uJ&j%8>-Tfm(AQ +Idcn^or[Q"jj3GB]A9jiG.6u/(7bR]AS-"PF.C'QP(Re]A$%8NJfa@VXRt"fcIq:er2?[Tii*/q>9+*d^R7&;n[TZ.>iEi8XcH"S@I&\C(",IH& +$sb2,.*';@mOk8Rfu%d"W![^%i5Uo1o$d%W^rZJ%=GoA2H/l\F69Mfg2s82ZN/Ka]A-&*o/=fJ"4:78u$<2R?+IPX72c]AM[@"hFlE=`[o.;FS% +iV;8'Vp;-hKP9md^5?)-7a[$%k:":ePQcIZa%;:F6PMgIaD$)n&7<9;`!I2`(>Nqi]AC.&I0H +E5,>4Wm"7-M%f9*^/nhTQO'dB2mkB;,kKAPNiE&LOHGB_Q?4RthJSp/RJoZ+)6+Piq +F3bF#,>6?:3*rjo_PPan9hM+h)HmZ7OMt3nj8@XX<]A[jN8%1C>b*Mr-dPg$@LF-Q+SN7+- +VBin=M'bqJrY8pLm/ppK)Q=-CZrbknR[Ijc#cXcDp7THDer;4a/#Q!o9?/g,T;>Ta#j]AHCG7 +i2FGpf#f$'8nH#JA5?l-LNjHdAG8r3(CT,04G3I/Q=:'ToT1s&&4JrVQ=K/HiqtH(.:g_ioC +\/)2]A$k<3dNg'e4tQt&h?Xtg/:VY9%4oA8dG^EX#P4&\KC]A=fj".W +qQ&k2%1Di/Sn'b#"-n)n]Ah-o*]A'm.dp\pO,tsVMNQFQAHNf=P;^,Sa'^%kG4!jJ[K=[>\HTV +u$R6,.T!Hh(64D8p\-ra0oFBSN9X0Tjd +CXTc!O@sUbDZoqDrsP;hg[[?5tm%#q>Do&6UPcO=Z`XFn2-Kqe[h1BXib/obW.jF@ +K)1oj'>QCUQUp8(p$'h+Yp:LNfq(J%8TW9p6l%j).`9kOKL(4[ZINFWAn:[!=^pN4bTIk*/2 +o\qnb5f0.tu6r'_h"8.-p"LV!(?0&OCYQ#RrnE#6<8V3J1kaBC/s8>W>jZESs_\+*Tc`BXF]Aj(oIqEt.pHNs:tFZ2$c,,&;6.kM6 +bB?2%(I+3H@4W67+bX-W!dhg4Y4=(9?`WL0DI+HYQH/`Cp`!7W,B%)e?dd;[uSb3Zn4kq.1]ARYsFe]A+9B^n\07\R.,H@!E^0W)F?\o&C[i3E8WT[(83$-?g +:[AHPQ/:fY)L5c5(HkdGUlWg?b!Neon@#:]A)U+B_79;f-l[pC94#GZM/]A-5u!?/D@KQ]AC[&o^Q*=4$h:aZl"G[rCHE&NpD&'3,?kFu80,),*.NAK3o.-@P9O/)Rbocm[(IaP +S=^-5o+Mr5Lupja1iKRlX7\RBQc!>O!qZ!RSrS&PnZ/OQ0\,Q(3'/1Od30c/#&VOV!-qulAA +K958n`7MD(%;4*r#.a,`uQFea)@b6:6P4^@rX^`kB]A3$JPs$&R8t^`Ct8GqOF(.jq7I11nF0 +$hl3o_H2@>D"/9tc,9fG^PK+AtcV00"b8S&N)31!8`YYH^prr'#7-mF6F-p`lS]AAR%P@0oX. +JhlHXBX*d&Zh3.#g["%]Al$WRk<,j4*oBM?0$=dqRP5[*6>:_ZV/$2PAQ:?c88(XZ`2,:f`"r +r\^5F0R3G-0N(.)10f,G7\a920O\(^i,d*GA9\Gt@5c?JMN#LQSXhmp1j-Wp!EEJfZW:%""9 +bSAT#`AM:ogMY*^9#h$5.BP8Q$S@)4!+'C%L1H^U4N4:$#PnP_dqrju)]A&>$\j<&1Wup`bk\AA%a*:TAia&``X:qU_]A@Got,=dQN@rQ,al3C&'Wd\dm^RIgdIFe;+ +S1Pdh4(E0>6XD0LbiE5LB%90RS\%$N-oFbh(CN;b-7^Y#$HIrnOuqrT)E"NZ7D)X'n +QP\lU<22t_1p>G46`G2on:!\]AX;V-"Neao`:@t0763;>+s>o\1AucDDNg4$S.XqTG\P,:8P9 +(WT`ddf3pq4b1=O2]An;5&b]A@gL?j-9k9=\WuQ-usQOB="Uq=N^c4#8K+tT0ZG@16MF94r_PG +'s8U1:DK;LCL/qA'=o,`bhgj@P$UerCa&iO^5KlQI3UMC159B^*d^OQGID?f#4!OM0RelgVdk8s"d=T$e'M[(< +OgSYn&.&hl>/h@^#>Gotll +X?pKB)22d\PFJ-K":aO>J-u!lBTF:XKQllm.""'^a92k-k;_G@c(`XPO2'>"3>'4l]APAfC&J=17uR![jGl +'e_m"'$H->C]Am(d``CAl..?AQB=(l>?\[\9!S.K>riHgNse0'h70Qm*lq$DTs$m33B\@Pp]A%<('8'%*DQ(18aF%d^`%kpB9Z'oBG8'a.XRZ\<.<*[>rn>:R!V +D=pFH@Q2Pt9NaCgS?"!lCZiS)9g)"CHQ4g$[^+2XJI.[Tt4i'9%!jJ!DQ9'u$WP!$Ebqsc&I +Fuqet>s5I*[(GJPf:."fBjB2"WFENQ[9$FS,QSY98"*k+C.!k2T`=OT,WTDC4g?*''DIgml(A8MV.c%;gWNlHGn +-`>^gmdFdq@:Ima[,L9a]AM$FQ5S2V;=^B +77Mc\k/:bhJ#rDrUoYgb5ZnD>s;b]Ao&To]ATPc0jSpNgY@Z(NLr-'q=$?nDMOY+_Cq?&3F&d4 +fV@VR_BC-)0ch(qL_8Z;AZbtNM_j1drgSqrH]A^E`nl4fn*\CS1oA(lbIE2$8t-o7EOt^r6$p +o1CE9Z1)e023O(i'NMoW`BjJ\>"oplqo8ldimlX^U*+(XY6(%XE:*^q"eUH@GN)UdC[78p0a +0QtW&kp*o@ocuDV$\`?6amOV\7fk?"&tHn\lkJ?"t>NmAp&d03R9/o\#M0;f@*HX_Ko"?Q`) +'*4M&3hfA-R`ksNB1ld\!/jH-WDn.F@iL,iP\C"#bp*i0sl-,-qHo?(o_!$$2`jBeQ4 +p+naI.^ICR5u[_AVb%\c0kStDTmrj)@U3S1k@Cr=d9VJssT>eOM*WG^N`B9V$k&RHr2hAsqP +8KKRXYL`:aQ[#n;dhkI9+"lqTXK+%3j`H656@oM?OdqOq`D8gC]A;B/g80#EjlkN(9AW5;>]A]AcQ4eFH>\ikOt`,oG"#^^jrnh3>8,[,51%#L]AnXE='i2eGq']A/U:j,*`G@Oq0:;NO +*o!_@===MfL<\ORJ:lV&cfIa,\RbfIO@k&kk?05:Z)S(>erqmiAP9&tGH)`o.=I>q(C0deA$so +Md;9@FG@I@N\j2\Q6,4a<&8`K]A'eod.Ue8b!tQWp_Q%W4Nupg.4L)YN;[l]AWp:EuEulsWmj) +7k33S[ja'MF!02nCXQ/WBN;G17m&2Z3P0WR'34@YLf3*nhdGSCl^KkARcD_eX^$_V+Z)JuA9 +90g@jo!o_gokRf.0R%4PX)AC)>%2TK4DI&,d;I^u]ArH1#+p(m@e)AQgp. +=+6Ggjl5s^U?p%FSqsJl.="MD)FA<'FeWVfGWW6l\V#1Fd[S/^T=(8''bmEALi2VgXo_2PmljF]AA1?gh%2JgXEM",5b7*eDbB@-Op\_R*4%/d*0+\8k\W3 +NO2o8>tqc&rX$K>-++L=tYUjR0K"J(LBqcXi.LrSfUjg_#EWnLa.)o']A7DD;1P84+Jb$eu,* +>+W/.^>ZM+mjLJe5m8*dVJQ`+O4W>.0DO0#qgR2_gaLugA0"e$F8PbRm'`\bC5kOXrrmo$^Q +9#"lYq_>s#j4]A'a,#O2>:D`WOfQ)pX[1:,Kjm;8;"uo]A;Hu[((EX6I[PKiU!G3i,XdHf-Lb: +GmEn,8"rfl2c, +7#lXWC4<-g`aiWs;;kX,n>=+eF-XqRnNq'6Kf6oiK?j%rO!)=@<<<1[gOh=No:&@pt`W&mqA("HK[s&pFM-ZC/k9=i6U6_e@qLtW#Dce:>O.k4jCIEA-.1`h2h +u5$qBM0X*uu11TK3fiW&tbWAeXZ53L\<_Hf[VbIi>.dPZt.c9f#e.M?uo'4\8OYpjI\qC7KB +<;R4<#@NLpofD76@5mQENMY5OBB(cG^U$+ZmiYmuD->oh`3hefN]Ak(o?H.p)+L7r\;ghS(BG(gHrNS=6( +ba`,lNLgIG*+7&L!*.!DWU6#3B$e$N>>m*!RpmR@)(Yd(`)@BL<(C'oO\>;nMr-T:7< +D4$uIhRC#Q9>nTnEm/-8AY!\ZbD;*p^EfkRboi@(ANSV=q>QBr-KOISVTWHJCPM +(g@((&s)R%Bu)2o`QfM\`5lSTFfdI[d[3C9g$J#C1nTfedD9,+3dhCjmLg;f9pDVke2g"#sf +2n96g8H3MWIbc`j]AM7YWlu[k[O<`b1^;=84f$7Kuh\N''``+81f8G6K!7;%]AC5"kA8nV0D9& +1ZaVd#OPHEnMp)#kUJ.T(U*,>NKsdmVU70+TKMAa=YQ\:KjJ=P7/Q<$j_cZVoh#D>TX<8rH5 +5*hQ/<*'QA6@?J5An_;m_2t,&0q;9T&GAZbOFb]AiR/am^cNXqD$[&>C<$7:$'W"6'MrS'1Be +MeDBB06?MfD)I,HUA!S]A:Q1;[^,iT=/)Ao8.ppe&tnXQjIi$j'.a(6'>o*,1?7_[.MbcTS3% +Up5FER&o<%hg.0HEHc^kPTfn'b4;s0?Xj3bWiCIFrp&KiK-mn9Z=Pe\R\*U?gT/#Sdm!PpBl +gq.'1(IifYcG(q5[QPE(8L%'!)$gY;ZqHUFd=c%[")%*]ASCTF:)CDMd>u84%]AHKJ@)ur6+W8 +(4DXDc@9OOkLo,a26*Z.$8$UZknGR0&(RL-<>e&EO:e"pW'+QJ6fQSN[Q1/[`#6MQ*j1/I!r +]A/dU"ehmi-_7C911*:.(=)#@_kO6-f!UmX.K`=uI5'^gO:`JQ\%OcreF@45"c^bj)!%O0P`o +Ybr:W%I*mLk)7d4i;\h/uO'>Cb23/g!&$r?Aqu6@8YHD_D@^dcnUJ/n&'s3DISSRoc?o>7S* ++JM;B?8;]A^R;gLDk'oKNg#e*t^H1I.(^-)[$6(2ZRP?#l_P/g8qsQ:o[q +s15a>mlW$/[2JYS541HB^cKp"IV76]A_H-EZ=KAm'&l[o'PO78@;#1!Jj]Au1OV'2aMNKq">*u +YcN5(oLq6Gj?dZ20.tpo@glht,Q(qXW5I($^XJYM3V_Y<*qg-ZF#h_bfRm`5hGp;!\+h`mWn +BX\Ft$K1/C.DMjL3)]AY?dTh50Ick'Mab6kZ?75[JGJIsf-Fq,9]A\'gf9aM[QSUQ,oA!^BjB+RE)lQ$orPM4GFTrA?PM3"6pHSk%"jG;.3PZ"Qt#tuuad +jG/q>%0Y)fCQ^sR'fuL,U,#1mO.VE20W6O87eC4<.jq7N#`a]A;ga?bV#8XO@D7&:39ej$/`g +?K(eJ7cEEVncIDWn[RahWp0F#g_HU^XHeU\Ks'%PO]AU%3T3C)-DO92S*Y]A'dAdH-_,KP4("K +[0Ksq_MS,g,='^N.:ILj>;i>45s[)D<8uFm]A,,&=':[GiSkPXj\@jVQt:Ub\'jS2fI +aJBS_-m-Y#Nnm[^GJX=i$rR$=5CL=mX:+ohs[s*!Mju2l97;9+6-ZrWAI1K>"YC5Z@%hBL$' +NqRlDK[@S]ASh'MN1QBI%a-170gHBuP$4L4#'h\8;kiuR&NkArB?-=A]Ap&4ORkZ]A'*sS*"W3# +4$,N%?\ld##>4m)l8so3ic$.)@bu;QU0,*G'IoQHR@scd/WAQ#FHhIl)CSh-b71a,+"g%N#r +8uLD3WGXn$W*RU^_5U,_J)DKIdS916\LPio"jL6W3S'n:,n[4aWtk4t3RGFBVW&J%S`4Q +G7_k3':sni#P.*c:NPc!T"2Rm0OH;ao[GlG\UNOaYANOF6IJ4VqDZ#BFKCY%X_=2=<($&b+A +90U\3'>F6DnDIY$,pVZ#l)iM18Kgj3^^>Xi-ak;!?3i2jTad:%8otBnAfU!+)[_^V9P&(HXZ +\=N)4(CoOV/.lLI5dH/]A99I1)uH'TTuJ"I@T8XZP"6K7=b$2Brq1WOIfK?F4nkOhTC\Rc^#s +[t?GQh3F2*,U<&cB[Q/(F[DX&eJ/c#B:p]A:6j3r%/RC,E%9;5'2e+j#*q]AjXK5&RWZGb)%5"@"3BsDJTm +8@pQWboL*GkmKo+t8aFQ'&oZ)Y_7%@+@XTlgn(^pP[-V_SDf!L5OGY*3C%lR5OsaW1ncE:OW +@6.;_`UrVZX5PK1AG+!LBJ7eK1hCUZ]A)FIl,Q3u)/&mi.lDr$#9/R>aIQ@7D,r=eG3bC;F$J +C\hi!tiGfT]A`aP9V/_X)*0lI)N8(T'EeKP.r9C=Sq,>HuBB\%nW8=S68@f(/+q&(/om$2WEB +Yc+(]AHQ'PO1'NQ[E-E0"%c$U=Dq-"e<[ESX!]A2O8-:2i+mP-9.[k$r'__T: +g`k_k;t-a.52@:= +7e\%j3i?&SAfg9Y9h]AA?/"%9ZBo38)J7ft/Q+X^07He@R&VN]AX]AF:@("RNTXGXerf4>nS&?( +\2V@Z.ok;2Zdt=-(o7)99GsVIU)uIen"qBjnSKVYn-qkTe6Fl+ls-W4YC2i"gnu*)g05oF]A$ +rsnBB88F%GtCr*W;BYE)A=ejQQ'c]AgJ.J@jNk1h!m?\'kP3oi>GP]A+/t)SRWC'f(eZ;PPsrt +\pEL4.@2TOeCbSpoo-H.D8n$RTMirJLnB\;KXs"qPYC"YO$AU2M/j.l;EBAhgC&AfZ+*QiRP +_rXAb&R($]A-PqCda7jIj8I6UHfPHnPHFF(>KQZs8pA+'5epr(nPL +DiNWSO)1JrA4_W8VFbt&RAcenPNY>X)R,bpfc_Aq)^#I\>JIT/>b,O4C`ND,E4pUJc#b?Y[R +[ChkPPR#r5&!j5fL3=C%/egW +[DBm'EY>\Nsj66FGo_>]Ak=^6EdgX^?9coLnVdi/ct`tN!"h:CXh2eg)%a)B7'4cPPEJjf+"< +C9&\$Si/o0KlNG'rh5N&oSHNG4d?@XLQp +&Ij3r5p8611]A*VC"0u8d(YoK3aogP>Aj$]AIlf +>JMo-(/@8V$gA^nsXIp\K33KFc5JSf%VBir#PQaRSg1-I;S42K;A@49tr!aAE:42_NZ@&B8! +s46P]AV0?Z&M\=OA%e0PP^;(>GK+O,V"^o79!B7/><"+OD:U,4e+lRO:a@M4rI"K@Y-e-\.s4 +W&jqq,8-B79E8s)ned^]AfF90(KV&s>WcA*(f=mb]A.8D%%88EDDn2r.L-na8O=jRWFtTA%]AUW +JS1;364q2WlonN +]ARk@U_q(]AMX"o"FKo.Ilo]Ac4_'8jKfTM@MrNGD,m1E6cJD@"fGCR!B+-%GJe\k3h5VlR^e@N +>7),1')%:.-03r7l/L=*-e=5nO@)iV)]AYtOoe$KpO8boT1GaoPoPDZ-9[:XC!?t62[_Cl2o8 +g#qJcCh'?T^,L>?.'\EYm^K[ps[ITdau*YNkZcd'g2cbY8UC]AbLIVqH[e:f.#RQ +iiHiG4HSqibtC>8(#\X:-oPlQV%J3h;/ZZZ$9X9+R)t7l/+r[SR4c>dnioPrU_L;p=YcN.*; +%J]Aq!B/H1Ys[V1"SMNA0P:!,TX$OjggI-cKWhqR&ea'N1Vj<;,BQ^7fPF7K,81kN-#V*"_l" +fUfC`C,VtF6o>BB3NJ:qO)anIr3VfsQjjQUb,Ocs-.P"%&NZ,LiT1"?0Z;/1;';!>HCY1k?0 +AeO62hVUK>T<]A4?'hInW?'0"95r7`(!g`?+Z@2;^8=E,%)ORe@HOsrSk2$0!aWJ6(cemn=In +7COOFL8l+3q42V0X.T%Y@>#is9OlMgumn;%Lg.+B1SCm"!2a-+RR]ACClIUa>uR#pm3Rf'4'r +c20/DeU(Y4SoS.maOrFoM>bf\32)%3Wb\(L<[QgDJ&'(<%K +?]AI>.g[%PWPBcD%9-pCmhTD'ESW`jT#NVPK7!q<`H]AJ=nkBE0P3sRL-h(g%/UIS`Q]AGYj;_$ +c[icT.tRCfMF9NCN#4&C(UiP4/^]A[kFlYa'9GZg^jO&[bRm"hE5&.6AKHnD. +iil7Ef)BE%dD?f$X>gQ>D^g&DM8_!8pD'e=#Ii..Kht3,m/[`_o&C7Z0psG2*`>7tcg1BV4q +nD:Dd_FkA-s]A9*=>a8%rEe9ECt:SULf)d9I0<<,(7YcO>L5@^q^bca9^?k\tQZb=n\WZH7a.Yd2Op^H_\pglh3?L@"UFBp24Xe1:$W +;i-TCV]Aqi;^O5c2AqpP3I=IK3[S-:QakKqjC;]Aql4\&Q`7K)TtRiP6]A6n4o-F6@'Fqe9Oe6u +&/Q6FGiS)Jsl'm?O66,W,CfjBmh4(9aH4`6HVkHWDc81W^&aZ.>3&ApD4MGN@f?k7RTSQeoI +lH(XGM'FF8%d![.+Q^NDJI@_f%e]Aum"Ie#qLPoUVij;A`OiN.Isq43k7cDk'SE_q\a?GQg\N +nt>.1ak^G8=m.O5/E^@\,Sgc9,&%R76&f^c@%PTQII`mZH8/_2u^r2hC";hP`>F=*nWA-Uj" +!SfIdDC*;jVM5rQ>2god6$MqDC`L/ObDTRCRhSNeU8;TDc8d6F2S,c[u;7P4=ArR +C>V5r0PV%<:c-^aLeC/Sl"IS8+iE2RC-L5FaOM$b,Ipembl^&UX/#FPV1+:TqXNCf2!Ym/"M +&>5n]AW)L,>tQhNb.&(BQrT,G$bfnbI@, +[=^LJq<[`0U"Y1/Nic-&!OqPp@7gR^3i@kWDFr#7')K"f4RR5_;lfe/R72N@ck*EcsH[:jR]A +H-ofg-@Z7pSTFgUXZH/p$5,_?c2dAS+EIl,97FEB):nnl0- +ihg9"D+Yml$#13Qc0:&K$Jo1HB8uZWH)@9k&k#mgE-X\Ra&U4:=:h[;W@DC-ZO&so(=QjlKe +C+Zdp$NH=DGXQ1Vo)A&+UTJU,eF!SJIKFk\S+eGV +o1@/73-:!3mr9I)7sd-5@M5h)7H:qB@.B3o]A$#j^pG4[JNnoe1kcjbUpdD.N[#9[s@FV*Frk +0s*K/YZNNi!l:q-*NC?K)N%.`IKc=HKH2rYdeWd6]AZ6\Xl)/aHD`PI'?!LVk9=t*n,d +W>YI'3D@\-!9mNK1^3l"@RA.ZT)_F7J*`.n1oT9C_uJ4u7eB4?T6B45aV"YV023P0:@!=OnY/Q5t:_k[PVdMga+3#l"q=&\Cg'op#!e5QGi65 +>&9,*g[#U1aD)o4"i3f:BP?g9&[*+gS7]AmhFF\t!-iM69a8t`\!QHhU;4q_Q!7PY;c$l?5mW +0(D%M3Zadu3/YdP;O:[JJcbIW_X'X3%47q/B*0bcU'a,,Gg^.sNeR257E2+S0X:XX]A7"oJ#o +Or*@&Ui7C#C-h@0o,2'697-Vt;ugrY5O%1,%klI^blbm,,bq^[1GQLa?^)WB"8Mk"fRJf+-@ +8>ca<%'SFG0HsEPo5#J/;qr75Hchl[U38)_=E-qosn'E4Ni/3eaQQD0X$#lf,TbcGGKf%[1l +aDq3H\B!"@+J78NUUTBJ8GZ(XV?@QTt4Vb\me57A(j^sQ1[$nlOcW\R6h7l)6K4%W?Vi)PSg +V9)`cVg6S1]ASRdZ`o+KNZiG$]AO]ATV]AEqU*9HI$71!-kj,7R?ZGsHU0lN,AJ5c*n$aS]A@F_)f?_8o +UMa0Q>^p.6=TtgIgFkijD+&5=081U>8-?I+AN?hm7)R\T#cK`01#3)r@Fce:nAC`BO8^roY*D +0CWQk4tQe6:BX/lu;-n;gD"44=9F1WH6?'7@"7p'BR'4>NSi+uXGKN0'ZM%siPa\#0/TXm]AA +FlR=;f!7Tk^@smMYlr4jK;R0U"dtlbRJ(cb5t-5WjRQN;1-.[!V-=biJeR12@SN;uifho@=F +gHY%KXj,(FDsd:q$m?*ZijL&?"uG2hI:DpsiY:&9.#:j]A@/W50"0G%ROqc4+2Mh+>mCi0U^* +&D@m:\[%Z43OTVa5rTtT>=g<1+)[>*f3UDG_Ki+`IVLHV:hg/-7b-TpKE&!K+)[0oP15=QIM +qPq?^ph7=/$un(:(,ra/Pro-$R(u%?^5-nf4[pUBPsqLHM`9;UV#%u9,&Yi6uiQ2gp%\EYU) +AfrGC>Mn/^Zh0Cp!q4eOPbY*J<\10^ZSCt/-n&RC?;?Sp7(c/Hg$hLU8PL7G`%ZY"cOH7OI4 +[f5G\monBDP[Rs.@0(+)aF"\6%.EDoPl30L[+Ne"OuR9Ce;qs6B7X1>;b^b`pk.;Wr*aWF6K +?u.#l@5F,WH,hep!WeWF@m,IZ+3CGC):rFPQ\"HEZ)TY?_PL=?)p"ju1.6T[ +TSn$)j&,2#*gCd)+:tVm@E0Jg-!"g*4JtXTpAMT@FY:&H0$Z'R'dF-0X/qRh\_lF +)?iH.J]A]Ab?[$L\_bB@ZS%h&&5$l,BAr(HCJp(5+mLZg=o$D98-!]AK>+SFEnWRn`nPoCV-A:E +HA6?3gH:Vc!o684>OJKj5C62Sn3-6fSGhId(c/iT(6D)$@EtIC10pf^f[[Q!^;/Fb0N+ag0u +MaB+_p/gmJm0j5^iSk5XFPXYaJ[cMc$Be&Ur$#l*8X&ls<&5V2_s1NV3Q\0os%-.gV?SCZ%g +\L6[!cdWi^:She3'-LBKR3<@DqI_Hm'btFn +/XJBL#hGSK4WdUjknFFP[O^R#!WNoYr5!1+!Ws8![KYWeK&A`dGi\kL$X5?cV +7C>9WH#RXn.G#MBgf(JS^+$Q+fbJO=.K?VeVHi;kQq:MEhM//Pf9hK]AIT,$]AL +'dCn3q_c236qIl6qQeh>^'GP;j3?*-qQ!enCK`.uN=e$/GKuT9Xn3ua&=,?.$'k+FG9`\e-M +rV"7.JO%LM+tl+:U!/J-p^8588cUp8_b?QIR(5PPGa4rBG*faT&U\EiP?8LoOn,c@J)3%#bt +F;0:/Si&`@'FNcqbR:gD%6/kgYF`I*!E!hY-,<4K +I&YB_:()r5c2n;l4uVaLDp*9"RWe"\t#9q4(pa#&%k*W]A"J&<&ArCdJSR_"9D@Y5PH(`8e#R +9QD9MCtit$56=P'&L^1D#k+Aq"[8mE?Y8".Us/2Z>kFQHb'VgYWj-S5Y_4TBoYVuJDHli6_C +.B%C>fb:'laZD+-Y;HL!5pNbII_Dmgm/I(~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5es2!/.+rLd9Ukrt+O+&d&+L?:scDn%@cn>4H*#2Hu6 +$]A3ZBU0cq(laq2N>"GZEB`)m"c!qeQA.PXA`P:W`fM0=SMM$Nr&hdDHr<"IcV:3Bg9./m51c +OcT?]Ap.NU""k[t^;oR&Z"rUaqeH">EsudsnMK9m`l?7FceTPNO7\O9&nu@aX>-k3]A@PB!QI- +BGO#%^RIlhXjJ>cHO2OL.<"TT+OdEb&h-Mj&k4o._\`'F>H!MQ+t&G-WfM=(IRr;Uo]Aj]AM4B +Q>Z]Au7'kg[g&Y!jbKKc@;5hlk\Z6<]A?.JZ7o"S5t]APGBs]AH?k(VDu5:I*(&eo_2,3mTX&*W*:k,/!ZZK'&cag(i3F9DETalC&&c=U\:03)nC8Ri6 +JV>_FKKC?[6ol-o/G*=<Hb`D@3 +3U_:AO>4VTPWh9(@DK*.iYf>FSmdBkT$;X@sLc+J*%t%GMW8@5t(iA9cro$8)?.+S_s$X&\ +lR_]ApL"=OV[]A>o+?&JNB..Q"4_f70`A8P^A_Rk+8Vl)Z,?K^#3K!HRJ^jPlU;TI=`"k@C\sd +d;Nj2CJ`Johs*FUg;hJYm$HPocb]Arj42cSu'QKmS3UREVcWgMcF2_Er&,-^@drC":L\tbYP4 +bD'SfQCc)M5Mp!lJR'u,MKZMY+q!R]Alm(9P:9kbDd9qn[cRnH0G>B3:u)3e/&/MnSJKuuY4Q +[-e+*`Vk2fP*MIiHAO+-^6TlSLsrF<50]A&Gc5C7O\?mt+M3^,5?#4"W3,-iTMQ>F8:s6H2L?5Ug86+)mE +<\rY#E,u66$u83$cp^WOf7irQ4HcgJu"'(T(Wd:uZL,6Ee@B+,L^#Q$e7R2>JqqJ#s8:SStL +%6l7d9&XN!95O;^SHpZ(#Vn3KP0,9[>&`oC9$*gC@XO(_G[PE2_[UoO]A"?/ci;'5UjJ\8S@9 +A6(*ag7/Z(rkWV8M6ZaLY10rXC#q-QFgZIgH>3q"^>@>T;SMF:uSHaO=$@1Trus2Y^0r& +S#:1XDa-''6^C:FK##o.Up';4Kb^;5@^1'qK`Jf+u[`tSSPj;QF@m>h9Z?!C)U\MH]A17$"FP +Y."-s5Gb(e&JPmW:Ao^Zp0G:;XXl`.K.Yh=;]A]A:s)#B0ojaD5J'FoBCp`1MH@Y[mt`GR:rpQ +NVSrg>m@=ed$Q0WA[,oZ]A%=1h'e^Z5SSTE".-Zf[a[9rE$<$q(_ED75.O1&,B8_1bKq.o5:gj +P?0eoriV?jOHIt+p>]AJo>-&?8Wu)O0tu)LjikA^>#;p?]Am\3I`MYEirFg"!sqOJWohujM^CS5kHj[^73dcK_[ +,4k*UV_^Ecq*JBRIjeuLpP#Q&n):4R:aX+1IH,I3,_j<\j'Ob]Ac`#%=i;&$F'$,L9BmNN4Hm +a0;-T`'*]Ai?-fSGCTctoVH$l7jI:X!HX@t#K#.XFJB,Mbn?Q4X3`.!`Zmg+AKOba*V#jOQ)9Q?e-M;O:EKO;#BSKo(LP-q +B%Jc.'q[(bMNr+93>?)RNYE,]A8FI(jL"3!35MO4LBpJ]Aa+\>eiXd/CrZEj>m@LO@T!8oVYio>?Dbp;dm"XXroK7lcr +=%Q]A_+T9nP +L\F@-!mA1f[EP1#9(:re^ucK2oGk#'8/ZVQ84B>aii0TK:phsXGk(Z!-#JolbceaLo#bHqH^TTM0(p?X'1W#NHc`58hB+N19>1)B%NPE,,H^cI\K-m>cQ.?H'oqHo?2#jTZe>Br83=C?6hG7R[G\ +(]A+[<=6h72nua^cBK^m#"X;7Q5KUn5PadKVtN`OJ7WhK:JMDjdggQaQcTAiY27?B0MT +j]AL8!!5]Ab%WoiGVo!'bjLif92GSaXNJ_1[J+YoHE1ZF\+DE../C";T&2qD@&Z/c.Y1>Z(,a: +9?drq(Q1fhfZo-om&h4VW"W9=2<2M#="q^+[:;P6mn!d:D$^DF8H0>>27fWoOkoPQU_]AKK#W%K0ZH<$T2rgAln]AR3 +j^&^!7dVCZ^`+h%eM +"QAA6`7/f3D*:J0dc%ot!\AM$6>.r/H^PNQd).6rrq*p8,5nGrWqDU/04WPQ^r4<&#OSCAoR +k7_Y6D^)\2#c(MDj.!$\m2A2MoIfQ8-sj4d2AQ%$F2UI&J@^ +Pbt:WfqKn0')$1'McaK*DaLZ:iVYm,YD]AXb@:E[Ou%_[P9rp7BG8,6f)_#M%OULSnBW%l4.$ +giJC*@,<=h7;M0ntH1@QbAd1-ArPaiUlQnG-Sm:YgLE&b7@>K_ifSq$G6u^km:1B_m84#OM=Rf:h0cQ"9I:TKIS=nY]AJf/2MTB +Q]Ar'S,85UIqAn%mA(0jij4C3Yc(7F'q)Rj_ChJ'l[JrZ-1#SJ!KnVt2S'rIPe';>@]A"VZGCi +&HS=rJ:to+lFG`uUFo\Fjfh:;*Gn%\Ra+qjacsGpE!cS'8DBMAI"F..^F#q3Y,i5FH^_oi-. +eZN1/s[ZSQ?f67Q;LWHa;$SAk_0+Fp%B'*d$rp-JuS=q[IO@kA!rG(@GJp,TN$II&["$SQD" +ANW(pg9Yb`*bm$g%aWI._^)rF#&F<&u.A7nVct[U-'Rjld1Nbn$ueJhaP7"1"rRd/\0IFr*V +c#9hQ2p1AC6,PSt[&O[ac+qE-;[lk<\YO?R(1`A4on1p/9rqT@8SP_uomRf\cQ/P"dNKN&@^ +MtGl"<=n3J,/b_UjKjfXrCu_$hXg]AVl3uPme5>rl]Am[`?$S8*fU, +9ODoJokPbFn_/;$epFkLPqKK@@u1kE_%PDd9bA,h7W?+T;T62f&iX+*6b@^$dVqJPZ[1Qtog +f0u`lb4UNQP:(4*6p`gbI+(*pQ7^pQtPN(sj6R(47>.@lERVrjN:>tpK=-&61,n9?&Sn9Z.> +')f&4D2j,*RZm7qmC*sZ;@2j$On/qRM0Yt)b%TJXLV[VSYJ+>Sq$;M(q7Q.q<+'kQ5&%%V5c +dT9tM8'Z&,clLGN["$trS-Qa$g)#I[.cCQ]AG#BVAk8kc"oQ/u^i8T/e.n,Vl>H-QNYS!(Y%b +YaUdOJn&,D%C@u)Du`q;36G(PRE4VjEKXd?(3VM`)4Q"0VZ)Ge0N0F_S+:5<<2[F_D0LB(aM +Au8f;.mn5RqA/$8'?BgHVdfND%D_2-&:UT!J'dY@U"5&`KBDakR8gPt@7Zc!>)X'X#CbgZL1 +3+@go^X!/a+#O:`LYI+bJD]AJElM./EPRJc8&r)p7oSL$Ie"r2jamn).[T9s-L%9ZK_^$Y[(j +LK:Ydjk*K3A/81Z4b8=6A\lUI$E/<.DT'$XQ7Zj-RL1[Dt^:eqk[&uO[#2=;(')YE#c__!]AV[kJ?*,UR]AA[,FNu=]AfJ%3FD/=BQ9K5,$X[^$0IH:EM[$Bn +JEHnNDrMAnkJq(T)Y6mdglQB1+(o$GDU7*lp2-ba8La)t0h_ +QjU-M^eKCoiF:F'mLVP':+Uc\D$$Oa\@E.P'k+msp/]Af7UDW8).9De!*a:MaoAX$\@4O'`Pd +h,"'E':;8]AihBY-J/dq#O;VEj1H5+t[jd1Upm*pR-qjKTm;jg@ST0FWDp9't;J-6;?Lq/%F3 +j]AOB'[Pq"I*U^nbk)'pKJX^0MRTTZ*YVmZ`_r!a):@+&_IL%N#Z#Z<[G.FH_7c2an;JW*`f; +2A]A=Wc/kDKRc1c)=,>J/(Ch4&!7tcN-M(Xm6QdeV[b[]Ai5FM8;-KuimY8P"Y71uA>m]AK.$^k +d)D[JKi6oZV"S"0RJ6Qfbf0]A&L5NppR=^4#8TJ3C#=!-"IEH()eiGSB43*gRmTf!s0Ldj7S` +74e)%Hu3$nmOfFV51=V<]Ab3_SKa.c?9sgrOf/#on84@kDDH^P=#uE^abGMk#:>AAlhdB+rLZ +L8C(%2'2aaMpm5[Eou9"]A=:-"$:5@6b;>.A.&Lh-c"c&bWtk&RQSqiV"$: +/bb-KClJJ0E@>1`(F%50)i(OUC,[5Qj;*QBs?6WoT$+Hm`R)PLC3;j\bQ(CKkQ!;)F:mAi'i +Hh\U`M!?'tQa>$U`m/q:XV(p^= +]ATX'WehGB+=r7Skl/)o.LaQKTMZUJiZjB.Fu.1lLQ(ln39V4p'$l6("[;,o&pXJO4FOrPcd? +6QHE.]AUMPcH'<-c0nbr]Ak'Zh!CSj85-<(tO4nVI'PqIWihNLZkq`oR/dQ7=#-V6ZT=f@`TMK +WqbcP2k%.LG`F2dIG9fc\6bAXP5s,0=ro(7Wj=>uKs]Ac<#jpJR=L]AXp3SnE(fb66WS>6lkGN +p__jgH?Y?_:_o5E//8TF-RNq89]AXH[3G$GI[D +b8M-681@KWn&M3'[5gdZ+!dr/MhIUF%88n96Fa(`Ik._2$!`Al9nq@67k*?$%6e4lbV%p++_ ++t$/*4fPLjBG%8/dHlX6Obtq%(MlCr?#O$r7'e6aCC!M9MSe]Ap[BFX2]ADe(l19ak2"^NGk9@ +ABH]ALTZ:4tjP(NPHIfel>29$XZ?d>+*H,"=t4L:Ml%?.:gRTU7eT?F_%q6ka;j(N.)>W460R1F +Tm:k[Z43?.)$dA_UG8'@fGmrd0=\0O6i[4X".lf[m\9]A`i';kDg9eRQpli!cdY&!;)FAm/Qb +*ppJ_BNg&8es^0peel'6ARcF.4LNh"sb@4cqf%f1#bf)Eh$&@a9.cJ2iG'8'Kaa +L6oisu*f'BPS>GI/2<'j,Z:,[Vl4qGtfF?i"@"W2gc&nF]AL&\e1mRENO91JnF)E'8>Y`jTN? +GKK_P"'et'DW)EQ&5ZNH%6.+HQ7TnhC)Z?/\f$T!.[b</PYsJb6`>aQKa"/he^rZ@^:M_G'[B>*cW-7fT89F/]Aio,[uI"U>d-!AA8mS6u" +]AmY606bA6;Li*#$)gg9Ri^pBgT)([M*W^#Lgk!![SE'/^iX^,t#C1%s>t.W8ef[%stXh4[&2 +6qkhFpNJ*N_jC13Y\-]A,X0kCgh\X6%N.s5a=A90Y7)_UgQA_-I6PJ[%F&c6(s*Y,pGjO!TVK +Wo6*O+`AK9GCrE8QE*G3k"o&(pS)6`8UiZ+`-.q4%$f7-!#LMRZXRYt09M"V3#Q[-l;4YLWg +L?ZrdG32mlQN\-.N211Xi)Ydc),[S6pQer0fJ:3/n3d_3]AO/u69;%V8Yn>l!.ZZ9N?jW9]AYE +$T`U%UTR%GMZo8*,/$<#8.j-&ZqCQr/Po3)>,H&BP'BUgi;Y?Cj"4o.;=%s\sU0Pan[si'JV +fHj3Q#n05'lj0*"X+TDKu/1;&=.$Q89\Q'2GZ^M6d\cYFet1l]AiSNe%/(p"ag=PZhSnesQ6b +!1>d=VJ:N+lYTc/\_uNCng[cJsAKhVGTS7>'ZbT +F:BKcg9hH>JjI.nIP!9_L9Ls-!"P&dQBoS%]A'L;"g9,Z,9a_Ei`UJ1Qibup,Vb$a.Hac:oY7 +*rPS+\h]A4B..IJO,D&#Xtr$H>bg@uu/Wn3X*>IpGes7V;64K=n76*nJD.RO&BGhQ,4@d*9S. +8+@$fmT0N`=j5ofqGq1]AElpQ0)pj+$Qb]A6r>=np$c5L"rIXU3YC[iuqpk/41^+3710gMjbhe +8&kV"K_b?)u3*W/m\Cg,Q)Z?o$Vk^C:r5UB,tm@cI!$:b79Po!G=%BHEi\\oQXjf+cgRqKEB +(&@b\%#T:&0'#%OO)UFL,6!-1YjL@26WT\@0'('@:7>u\#;9m_F8QuE +PI7)=UA1[+qFI0CoLDcZ;.o.HB%F(+2*$2PQ9gC\i,?)Gs8o_IaL7Aro4H_1;OPc=.$ +Q[UR;koY9h2#)6Z394*&_?YEp,`CT/;ah&VG@1`k@E+c]AmYV=Qgi&"C>*OjD<8[iVrj!UK-s +.8-=sMo3L[fUV:51mrPb5dh/\*0-.,`$d8@_?r(nCA6^fB36I0kd`ApADrrGYgU9%DJ_Keu3 +qHs%m`W%$#,o,FTj-%_M#8!iVF*a8G\2p!$'i4MQB!be0s8:=Q1$E!,!W\)Gu/^EUiF#h-2, +Q1`Pa1gHeU$KJ*SK7iOc@&n+*`:*+h[A_ClE]A+^auC<_*[a:M'O`ntn@qEQ<1K:knW+@l)AL +oYJCenQ)^Dir0JM(sgc8%g@I\g@[o_tIN,(^QUjo^WdJ9F6CMR]AANsVY87XSf#BA'fn1L@7d +9c?<4\l9K#,Te9ZPf:!ZYefN_lL@86f7tj!_3*3q;ZgtZeV4o!>sEf]A?'Jm&cqWP/+m.Af.- +s:!j:eRT6%_I9m-Oh(=P,^g#gi<&1>$lI=,RcZ^Ms2>V&tWKGUQ=#&h+qfEl+'IK2Td1nPV" +3,qh5a&-aaPknu_oq?)7%DtbFJDI%C\!/b4gjps\.E4due=#Kl5+gqD+\g#V@WSXi+fu%8P; +9TST1]AYn?$"QaGl5Y'*S_*_Y?s2.Q^3,g+fIKPdd*e&PE>8Z<&'t5c->7ocYZRDASahqo@Oh +/HB1Tbu!jJ(1!\bk=-d%qi5eKYGG=X!MIN:59`,mX'r%Y.A]ATt_)/BnLoU.eZ$g<,^2B87RrpE?2N`([$NRK"a^ +pLKrHi,;_.jkc1kOo)0k,==Md*G%0PFBR!*JR'13:I&fs1U![/f8$HN$>s49CbfMl3cT682s +qa:5,EMkVp-s&P/BcM(a$'$H`=n"Rm[W'WcF/$+7cn,X8.s5.$#BRS<@8SEmQrN%KbdbR,aO +YM;K0Rh1&72:B6,EKNi5iWA?]AQF_hDX5PEqa6D:;#7qf)B,B:A79,t$BrbIAbG4ae5a[$e2V +k0_S;*g5)iGa"6?=E(K!g'JdJMJ^?kcUL1a*hcQ,eKO&S[dK7>qCNT_*3UF&/`[3&eA5ADe? +#&9LQR$\1)6/PRtF%0h(d4t\>n-=i&T+$DT!,d-L#loTYT/.cK^IO>+'j>"EhN.=%omOIb<< +AQ?AG]AY.jKo@^"63Y>djSpDBr*(C7(g6EiW0n+-V8rT&jXan,pe6"jqnQD-)YBg=a:&k5fb` +$*RRL>q,ZC2#7HC]An+4^n9QLVEkdWP^cuS2C1'&NdXls-GP)-p4(ki_.ZuZ,M?E[&&ST9'VMJZ$Zq+#lGQ:t&0BbOn;PGYj/I+G.-Z`2qEJ)Y1`Z6;,"o0N>>KMl4 +c/!'$G\qq/5lRaRO4^=7o1hgA6uV$B7"0pZR3U@E"6ZG\m:Z$Lt$M@An[cZmi=Qdh,(r6&5B +5S:[c:TOsmA4ZN'HVYNP.n*bUC;I>`K?9;&Xb8<,]AK,.AHt\Y'64R>+F!r0&(t8AC2S$7F(0 +X_AXUg>3@iT/:&/E[H(ie4>bG%J1Ybj>=>[IqelKFMOpcG'M+Z0[61AOi\-ij5OqRH8j2AI) +N,u85g:5p/:d$K!KBX.%QJJT-?^<1#]AK+p*V+rVc +\sB`i8Q]Aa>s;9/$AJ.kubucfM42AK&iD +`RhZ^b[(gH^SFAo%]A">Wg'9M4c\p/4tjhA$^pk[e!!@4>n,8t'"!QFIlQs/,)XB^n(DP!e#_NYlXJ!EmI +QgYPU[DH"1BH]Amu>)dVQWf(:QgQM0rO9Kl.C`0DVHQSigDCHo_ScYdBSllMFQ6Ml^^:kpXqX +ca%QZ9n\DL^ru>QOo@qC!U.7,+-akH7:);-!n^a4ucjl!V66Y'Or(S:7M-b,ShPPU:gMT^t" +jZHWrNHTW0A$ESonXp(plgId]AAON$WD*=_8:HE8CQkgT,;&L\D_g@O,pQlgZe\$(2O;$+9JO +d,[mC9OiZ1[W2&aeo54@9\$pIm;:L)7n3g]ASSIq?4D35JFo\(0-)Y1`h+X5IY4Lp.SjKSVdX +,EfAC-sVIrS&]A)J.s2-+`hr=nYT#oKHCbdGR*>LVR(95UmSN;+jqROj_+iQY.Bl.`337'J*! +060/89Jb`&[.^C/#YCs+(WJD&,T9np,$bF1ZG7gql[DD1#9\Q?c67U_fiYkka<& ++"PrWm@e!iob3(Sm=JhO\pVnL8D$$&HE/'1-K(j"fIP[L@P94ds^F6R:!bNc>$b,sOhUM*J[`1Sd5'5*\nm.pJ(2Mpn3R?T +m^njg#>b]AT^oC=q +*pmj_lj;h]A:46U5b>eniaoh'n(MOTR;4nK=*"'pY`;ENYr-$,^]A2"fVAN.JhqGk?"rb\S+HP +0rX3TN%O4@n_?<36por^==lbK:-8)qBKTeh_U!;7m*k&Ej$/L(SLW2YGtCdlp_)G*FssOk4g +B)Ef\hb54O%VhU=JQ!V@geJNs1p!h(eVcc\^]A[u2QYG0MU4-?6 +%8Z]A3gDl242X-FrjO!=oM7g"ribS3`H`0f<]A[NI\=bc`[oM_X*4Bo&WM:SMTl4Z[5o[%6iOF +l8,Vsb4]A&9/>5s\*rk`0`KlGm'%`Cs8O3%*RS@&P)$u+'MsHid3!FtkV^?1Vg*B''VQ@J.Gj$^*cq$rPV.EGfC"#&`?ApM50f+XS2q&!,11X]A5T*+B\t +-U8+q\Xg@r>N\\_\f5ecYW&FVK\r$mA06*BA+;eDi8mD/G]A1r0>RDcD +<2L&VnfdKVZ`44$"1Cp$%\D:ItA.nj=Q`Uk+AmkL3/Ykc3Y6bC1S*BRM?\g<0oFKnILSkY?t +f5?FYJ6Pt/>H8rt6<]A4=8?0S==FVGP7fj/,W/OU6S$K[.#OlHR,r=uC)OH!LjnDHhlVJ<[5& +O.M@"9Iil6D(%R=r$.9eT"^bAmE0=NB/9EW\`V7a!0f%CfN#7LD70kA;W#^M>Z%\e!ajmg;X +=$V"C3K7aZ/W=Rs7"$eAP5=UT+AhIJZKFclPK7OP2`f*k>2^*rj'.D*I\oFNEg>T1i=sVo6t +o,MY04iHN9m>^ +SJc`+\PItZbT91#6Ol-h2PW+F`kXa`c^pnMe\8r$XmQNhb]A=(a/U[fdkdaHs7iuD`_X1t[=p +F>%C&(b#?H#OngPm_)9/H*p6KWlq$pY_eYZU_t&"UYq9c(&`WeeJ7/-ojT2+&#I*aQc=h7*8 +*l$MjaQIaA[kB\ghMh<_1YOYnrSM@\fi_,c)8lK,SjP=71H5B",[)"$L^,ILsS?8IVS^i]A3G +]ABs,JSDjldD.KS*@':_q\SL)R<-P;h82ZFSi&)>!LWkS\@BTY-$SJA`uZ[\*G2VZZDnb#&#C +If-):DOJMm-/FU+Vo,s#0ES5gjrnM<]AGO,;3qD?Si:o\h#UJ#6GL_cV19F.Qm"dp4YrgJXYe +n;!9de.<5>j1h[@.bjKihs)(JSF<]A?9ZpWNc>9InfOKV7a.B:7pM8KP_Fjc-+8:J.mK:S.[- +O3XAktHDM1rf1]AdA>c7r235OpTZJ1(?:jRc^\1n)Z=:eeu_^hcI.[AbCG0H-8j6<#_4e_PA8oFJm%sNXoPGVrbp66;\I3PP(Pe#u&Nuh]A1U!t0 +UU+=iV&P1QZp!1b3=Z"@<;c)+e1#b9Y#u6=4?`tH^[K5B?,_FTIng.*#gRhZ\,NC$rq?Fkid +0dWYT7-RoA]A,E-d%gcLknR#_h0OfDo4mSmA"8`WU4\gR)PR3fZk36O=K/CXug/?O`>"-M.L_ +F#q^M4fSA1RYJt.k_2^n`j.#i^g2SCm\_[X>lD)_t7#PQ_;EH<:UiFKVEO3^%FcJj]A/:6muC +%-[R@UH&pV2DO/F:B?pcY>;k?]Aj%[1Vrp5[VUZT&mB+:)DiK?,7#7\N3si#djh&d2W(Aa->; +-bq-;`?l)i!$7FeQ%Yco8d_R6JX6CD=jb4:7VB:*`I#D6J2k\IJeMXT%O1ua1&6u$%l<'1Z, +q83Q(,G(hYq0Ze,S1\Z]AY)sQK;)FKSCYBLG9Z@diS+*<#p[*Z@cfD<+=mZpKRRQLl:Z(KnIq +g%+YVs6HrQ9jNm9ZUkD%\hM\77(UCqoWqGaFh^;TiKGoWZuPs.fa,(6!:-ZDMFQ.In-^7OjTS'l.\PG97n6X4W.@ +pllT>[4Z)-5C[j4W;2:-VQ($SGB*)K05k5#"rCTOEt`JTIA0CDjs&TI)(og+;\h2kh;B.k,Xu&77fKY86qk@)ie`;'"H;3 +P^V>WHMnM_+1C<2QEC"+p2e`-_ptM[2a*%R^O<[(e[4Ho#%hT=\X6>2-DU,+9KLutBMD>",P +\t36Du*o?j_[,p+[BI$RpgE9%m#n?7Z75h&ed@@E1g,]AI:i&-]A6Vb+*"!^N-DUei2aA#UATr +7fSI5L\u8p6kg]A:+,5>CfnR@4:cfZ,MG8c^S4k?F'NeH>TUs8Cal!DokirP/Fc+>LoQ&nKP+ +p8a!,T!:Prl?'6Y!4WT]AIWp+(aA*a8qC74S3/+(AVSH_C=s5$GNt]A-o4+JW:OS1.Y#'-X>a@ +r]ALG5=Y2]A"(pig3emE.!4aXjd2;5h>+*OoZnOBU[M#$Qn8h6?1Lu?,=XV=?4gFQ)Cd]AB/!BB +k42UV>pr1LZ+(lOBgQ*M1!Slr,@+;L:Ou:mD]AX7P=KKJ@mOK0gL5r"snr/FlFgcEg^A`6c_Y +p5K=Po[m^K"3P\L08CSXOn+:a((aQ)"secbH8n!\eTO\oZG?8pql-C(En1jJ6tZkbEjZS4BpWT9^5L(R;]A08XN1[80d,\ +`t",4clN5pIG%QTcuq7ck`g7:4j:OaYZmq.&m!'&k_'Ok($@gD#V5%G1UjQQE9aOM6?:DT!) +]Ac>a9KJ3n]A"U^"_EhS6E_.V-L#gn&mHU:8X,jFd6'J87LnV=3%GBqc9L2-Hji`-)g1`"]A,$_ +Z,7-ZoU*sN=5L.PI4!C:CVQmm7[A69'!r,5E`0.qLo3E''Pq"bFPF",bHb50T-o'n]A]AEmKBt +Q00cC7X1WYScXT/#u/^K\4_^OKS/`ZI\ZVh$Vn>h.?oGtUQ:K;KW_oZ+HO)n3/_GIL+c6K,7 +,fV&^i3kP]A)QCC$uKIn6L'4-B9I[X@VNbeCX9`N5To3(1KdIQ3/gJj$DRKq]AkreX:KTS&rlc&:T*ighYh\' +GRo:b[E7mEg_-9bS:i(DDf4%XVJ-q+4(c9[;5I'g&fO(UA*"tZoR)tpP';+o:3H"7'brDe0Y +;Jm*PgUiQ498S?_del?`e*--?Et$]ATZ(g3LhOg2D-p]A]A(Z@%SNOTT^KIY7N#P+fja+=NGROX +VU/NPM4(4\[n;2/`T/O%-q4)U)m(Nf)9LWIs/fBS>VLDW5QKYdcqoQAm6`/J/ol^s>@s@i=% +,g@+j$,M:"r6hC.^J#IeP1TC^h^TL7gR:75!0"k^ +;=$@;Brc)61;>@;elnakjI%9[aR./abmN` +Ici?uMedTaEnl5-NE[%d$XeML/d4%lh0R`lQ5u>64TaN(5AGHo/MgNTgKQo(k4( +l04!B)ckbEeT!S?%4u2Gq+npmN'_K@$LPo)Rik`A)QPDYuK44]A+GYGM"Sh*!=BJ>k8O^fRh7lMTZc!c^H2g@,g`!8 +gcbD52X;e:n#?X`Q7>o,+V]AX^Hm'j"MlrhW<1/.q7d5<#L&RRTQ4L/tohaMTGj1QrsbML4n`H,6@3%n!fc)!B:8qnl_(@\ +Lkhh*U4K0gjmtpEqJ_YUM[]A+>ZR\,sAJ^+?0d8-:0r3U3pt?NF,cm`pRheJ4G^^E+K@,`_iWWdQg#Y=_P>/]A2+.GP`g@-B +Ve&*C6fVpc%d%N*f;jpXs2q-1)$hQ6"Mh7c4=-<)?#r"knQ_rtiK*Zfi-R\#lqQ/L[!_@G.S +r^Kn"%l0q7!1e@F*uo`$?VEUc.Khlk4>F, +I^VRirJ.d5cYE$%=?LpFciE*AN5Ld&jBrKsm+4jTn.t.3I\nZH&a50"a8PEqa(XE0o0Hq@B" +O\CqO-Fo+7-jAC8B]A<6f7?JP`e4b>KQI"1V9?C/Ff7dUEf"UW5XWNpt!#(MINFPW9r_R!D2@ +e63:LPh^"r5(H,&#UJS'%;@BKs;Ef:2mq6/QN&Q'*0\7"aJG9PNqu^KO($&&h=P% +^H=0'E8d(EHhq4^QR:9Qd3CZe\EdekJkcoY*o,G.ok"K]AQ$bu>\Bo!dZ([51;?2Y0pB4pD<& +G"V.a/TXHD%Qm-E5*ln>@0i'*qTF!V16NNYV@anO%[V^Bp;@U*E#n*D*W*er)F>:!J1]A399!ooV: +=C<&87Vd-h,O&,`T%Io&djEXPp2bn0I#?$p5q!*\X./oK5,d_MKnW-DUo%gsP!0Zt/@Uel\N +ou0tqH5\ml5c5>M-q&ZApK-&hnWiYk,C$fM3 +8+Z?H.+KF#l%d7$Z<,_V(\m)Lu/]A"KQL5spC8Y@^%_]AAU`\j^RTiFoG`G7X1V'+aNp6VcOWW +.dp]ANBl\,@:.q;%6@=a^A[an@lJa%6^%KO)6R=D-m+uCL2``/!+*F?\BN\UZo-l\nJ%8AKO+ +:^r3h[.I%u-Ht"^tG6B;eh?Qkq4iaC;k<_N\.Ci$c>LE#J$Z9C`J_++>kfiVmG*3]A^/3W!YX +8=C>*jSB#4Rbc4e^jZ,R;c8&c2u6ne@iJCL9URM8C +\k`DnB%$04nqlA&8d-BU46>F+4)tI?P(08Vq4g=A]A2oZOsj/1qdas\fG0L`8X&WrPjq +.M<"!GW#r;q(EV[8WIiYPqjIN,%T`OBcag:NHPh36Q\t!Hpf5[]Am9A5JH?LNn\RdS%WhUnn% +csI;*JCXL>]AWXKB'NW<6;*hW/koTcq42Ks27H+ujOJ*?t@A]AM&!u^".gNpCOZpmnPoY$m*SB +A7$kjl"tNtT"H5&:_2G'fAO3>,d+818j;5a9K66^1Q./(S3mV7!A0#]An)J77OB_!tFmfrI?=l.-arakmCHN#<*67ildZZOd92'hVj;,nQ0Ele)F-S73VCpW2Le@JPg +ilUOK?O"h/F_pdCF&O=6eJkMhED^L:#'ZQ$b4I*k\WL42EZnrRoje,k(Yo;^N9(ph248"Pm/ +:VZmT-V>0s0RbJcXu5gHK,dM^e]AUh80siFfHgYr8%ai`.e&iS@hCR"`a*BZ^iH15*(mep8[; +!\gnfY(aKT+P'2*n,U,9)=\a,)QN>/cZf-8ag[E>X11o.\1@g0&j-/j!7;7;u`=L[?%WBc,+ +_=e\d@W2eW\!u_Qi]A]A7Y%M%LZTR!@U+E(<3m;+TR=Nf^W,)QHpXPu[Q+U4`[W:$^r97.-+ms +E_6gQiS/,oYd;X^i/*`NVm;o+b%J1kfDk8SC@,ZJT*1Y=@'B@)q.;6.H8X-E:KjXGhV^Hh^6o1l_=i3Wq^\?g;(3 +^b.Yolk_o+6Qa9m1ZWUO9=U>B(e_V*@;5/r@f9sD5k?BLS[)LM/N_0Vp'chQ'0!]Aa!Qc\@V3 +^?t?A[&'_ccnXU#_6kIQfL,W8,3^]A6NK5-=uOl(A$t^DPPs>Rdf.bL^P"& +9U=QedUHZp3li,N1_^`7K7tjH%!a&3WUTmMJhAsPe&gcjY^&f`LFUQ]AbAV@O_OQ'IKXLi7\D +a_kf@_TI5*r3JZ8)W'R=ficr#;5!rh0p[hn`T`RZ1htH``&t!pi4jCc"(m7J>)T58[r$N5!I +gfK96+$Fc=BBQ'n=6TpuaXZbB6_cT+3kOE1oH%Ko@O%TGAoBe@eI?-)>2sPkijqo@P11*0>D +F5,ja.tbuQ8lj,Q<6`,CJrPe.$cd;MddEY+/.SfD5"h%fV,)[E3&HuhZcm1mtY%S&iRZ64he +@G-+oTLg?ZA&Nh,(0DJOMmd6@sjo[m#&pe +7i\lhKeD)gl@e@\N&XQS_uLL[,RTpE6g<@8,d.qI*'W1K?`e%cS+r4*DLM5c1"UmJ?c>&/CR +Gkl?)fOdesD'JQD(;+GGBY*Hlm8[2>f;d?P5L8i>oBt0KjdZqZW.G"S=7,"E&e$*TD/]AREhn84F@Yo/2^!3e6M%aiDriF=\ir8@9AT8H1nYGODMIui;!;Ab +AU9d+K-6?MEp>CPGA`GJQ)Spfl<%0%+hV81A9&H*r`mERcqfT=M@J+M+pfSL[GFU?P%q;0=QE1:;K9O.Je;!8hQ*iHFCnHq;RTC:*k +7IpuREB);2R_ni?o^!t3Elc/!hXEa;O@4UY"f^T*_S#fc@Z>dHC7Upu-h;f@h*@%*?7t!/"K +W\JQ'3_H;gg%H#8j&r$G)#eh'Vt;4H("./MJM_WK/d'D[r7r+dh-l^Zn&bp_,/LCjur:8f-< +KoD/Bj%_@rao>HBLZfrN!o<`dGF(UiGW-riIChj'E[pn=+q?KsSn+&+b@mt6+PWD0lg[i`[: +]AF)E\2&\Z=o=QfFRMlA8DX+sK<.gK;fn#%_AOfaaFY70SFkAdk^b!uP3,UUBQ_ilN$1j^$VYHLV&P&FZ^]AZ'c#%&CR'Z2"L_MLkOOG)/m"a]A$]Ai<-6iME +QAR-BfnP&X>bo:IJ`er5X1XQVTN&Rhi^g9d.pL[JcZm^07r="4;s]A!=$Jgq3&kqb,4['h5g<$F5=WfI9?b>S9\o6 +_f$8j4e+ug`)>N"!lLH9bq!UcLBhp/9hR)OFp2qS>.l,cQEN8&-2T>+ +Y;m$06%.))d%X2[J#m/-ckJTXSdhYBgU\s($J"eJN\k6.a.,'h_>/WI%La-hWBOOfJl[C2>U +ZbB8FCq.>#&(]A_6dgSqh:e]Aak,GK9p5Y'OU/VSOh^ep^g*gd4_4Ar\L&[/k<#[+0A&>-!/q4)6no\'dp2-jlPj_K4-:>:fC5:I2;drd +]AWGMaZ!sq0jmOh`.0KBUI.:3!C;fJ3hurmA$g?W#Qc5]AP]ATPI+u'9h)CYtaO\TnJKT_4GjLb +6e!UgQfO8J9mp,p[7qnCC!STC?Ck_s?80RiuhrY(_!GqmbW\S:F8A66^.7?pm2GU%f$$D-kO +@-QM9YO7!qalno#U7XirgQlF]AIf<5,\=67]AWj*lDY!]AbsN5EIt%_<&b^T)JdiSLFeK@Cg\(S +\C:2$[b,j4RCmr[tA23AN%ZB-"hY(uqqMIr+$bGu'=?2Kb)4i2DYO+Ykf/XgsV\8'?-8,tBp[GJG2n_D#NJP\\T"GgQJJ^#dlonK/oe$B6j"*> +j(7RUL2E_<3Gh>P#3"o +u&(IZWI"RR*cSDqPR$:]AY,0.`I.)!m0l_<'u'pu`q/iUaYfh.VBZ&&jWXYhhP.p*_ZH$=;%< +:UB\`SLO.BlMp*F`lZ'dR)J1>'ek$-s=+1cZBD1XRH6G0B/hGdW6pNDWaVbod7E=.=+Pan3$mJ*Q?ta'prQVdrQRZ_["(W5 +F5Whc0Ed'[?YV.K=V]Ah)f(bZiQ>nsg*_sN@d3sO?6;bFMRT5_M[J72SG46`A%hmDr$1qJBeR +LIf]AAuF2:KTms)@LLkF>UF5/0#.M`nV7^G+SC8m?OQ +.RE"XKLO'/N1.g^M]A+]A,lKnlUXsun:EQ=0N'1NW`!XA>Z^AO[uB-^`o&moHH`qqcWl"I%J\- +%$i9C%W979U<)9]Ahrp-N(9r]Al]ASKLaF"e%"t4=,$ZU9#B.T7./P<, +.!DepV$r5XD22i6-d3tMS;C`Ea,-LJm-cXG,),k1)L8WkIR*ObC3IT-?<'p$46OqugT%D!t8 +]A-KPk4EY0C-J5a`P]A\F]ALL@lJ,cN-MibU+ng&^2OqZlHZb:7g[\";"9*DWS>"qs;I@Q%;erP +ZsG)g%j>=]A4!KNDtF2E[1h1!`Fm0/HjS^XDQJU&6Q8UZpPt"FupWdlC*B$6Z]Ar*o\Vm-6ql_*j^3mdddlV\+IM1 +(]A/npR,3^K8'$qt2>2M).YXM[!r4''(k^VZT[1=*uQ\ke_:,'+'oH +Ll1?F:D:.mB!;7oB5H'`h;57$9)Jb@[i'9Oa+G.Z`<0X6l%&),]APq`R0$T/dUQBIQ:[<$##)Tq./;5>QG<;rbQQse"1`Yi$WAo,OMN'ua) +hB\Nl@RAHWA0i4"\fl&V_k^OO_D_u0bFf9gOpQE$GH0HI`1gjPQeu^;C:S&P!nk +/?+'&eipSGh8&`$+Wn[hZ7@rVm&u#1_J2bED*q-.R=0QXfAf._aJsRcmdg:8!Zm4(Yd" +.]Ap7[11ri`(`%/2cD*MkqHe! +@!!XUSXa?(2:aPpC%Jnh"]A#j.AQ7N^@9EZ<)1-edm0?u#>&m6^?G#!MoXkWCj*k_J)-aWOKJ +-Y3C&M=FiWV8-9k'^ahsiUO#tR30><,+O&Sc7m5Ip,%nS#QAGm:W#biTFOYgk68Q]A__Zdou! +W'ep]A?NSt6F$N'k-rgoSG]A3M&TuOfN2olZ!*\K3"^u@9d+eY>#^5YN(RqE#AH(mOn&5pV(Oj +q$jY6Xdtq2uG3@7Rq:Q1'dRV8pXom(VT@l +B8biM%$7N92\Ml]Ag6*/..3A(4G"&oX@adZh\e'eal(m=V\FO"*il<*Q9_"$[iM7`7 +_jStC(bO3GoQ4)p+O_OY2T6C%ZG+M+8/OH]A#>U)rHQqED[GaK*fEb,gs;=#Bk^qO"r_oLDna +E2ljrN)NrW[F(7Y73jnqd`58(qg?GI74OM?1j4C6H063]ATdPY6F+#0#J+I"3N">B"U;p6.S# +SXl[S(@Un!:G[2XhEa\F"d]AJWKXAbn-N5bBSWmLUJR*E3`C5^=.Ko+L\!2$ +hlL?GDR?6A>j$qWd2!r,Ef7LW$-Al)NTcbU*So[OtZfJtUL4V'CSsK7/b?jtFMZGK>Fp/38W +(qbeeE$02FFM'mNF5TgVcQV4#cRs:3*bOO2Nb.jfj,1sMC+bNj&lSmoQ2J&sVC[]AAaX':3P: +/3u=eq(fMJY1*&#SfAW\+i"19b7^C*3"9\b3A&,NLTPbWI4J=AmLa%f^:7"Hls-t[e*@T-p= +1;PloO8fi'RphZ]A:Z@..I*oD,^I)Sc1iH3o4ENPYc?Y +?>k8u*-VI$<.be$HiV?L;/50^1#iaF]AbOYudDY;%X,H#E5>d0AgD<0%(R4Qj1HS'B'/%i$8U +]Ai2k;9Sb;-HCjrK09p#;MDJq48j@ID[m.J!DM?EI_96!9:&eO\3\Oda3BM_'Kf^orQ*$\7<+ +h6W&<:+5XVY:rMrEP:(NF&fQpVtDr.;>J9B*PR;bVC4hAoo:"<2>D7IJe.^T;8$QL:h!,q?-RFLt"mYm!V3!3TFM'K'RAaZ#B;j: +smEo]ADMFlLql[;H=J%aqr*T$2<:LfNTEqaX&Z:Fl1g*BA99ZH0o''CP/rsE)G.F%in?S1^Nj#7ft +rJN9U8%!pS\"@'Hm/mJSQDRtZ:#d-,m\o/8i^Q64^_o6D7+MDu$#3X,"":[lD[h@m?Qn1Qn0 +1i.MVWD=msE=EhfgR[rq\^LmfRb;HX#&hMsit$@#5=)i5I5dW +g2c3=_01(4.aNp%]AFbK;.FCkBQL6+6.:L*EP[ +X!qCc<)qtl3M#\g:nZQ6s_^V0@+D13d-ksX9.XU0:9,knol2,XJaKoQh1-PP03Zk"67=7dqo +KD7#GJ-1.;;4&2B:OmL>JT9CC"/Z>h?R=M-7R!fC#C0XkckgX% +s'^\)*#V!sJ\7["M#)C9RYQfM;kVLm;!hX;'X%n`oZMp50&M9]AgnN/Tm$q2#jla!Eo_IC).` +E'Q8A@5D55"S5;%$Z"Om2@H"iWSQ^[E'VpS:VH-QhO%*q!`6eo_su8c@oepEIB&[l6%?oBEQb1\R_*a*m+Dp +]AbX2_GLJ?M>iea$-e!Ym#9`M2oa5%GiU4:PeC2F^\UNBQeHo#=B9dn:8W>6\ge]A#a4ckr.M?tVpmG)r*!o`Q)(uttLoKouU +0oA4/)u-;/p'YA-?e_1j&t]AE@O?4P&Ee +"[.>qBH]A06)gJY)u[Crd$im4FK1K!VrE"%LP;h3noJ1@n6bMm.7\b58QRPM3/%jaLY?!>79_d>Pa#!I-0'ZT:8@M/N.ke_cSJ)q\$\2:S:Ml.pk718QMgd_ +_9#nHAGgt*$N3D7.L+21%\ZC,S29?$P<^]AGGaj@9MQ\oLai2Un.t0$(h\n?l9:0n35hA'g99 +KZ3oT=tp[KZ1JQ7"e#MLWgf8M&Q\j_k6_qmg&'O<%:([YBk/7\LBJ9/F"_;E!7hPuH&^fFAB +BAH4O-d3Q*Zm7YPMUsYiqrTSuW2B9hA_rIX3[cfH]A#"1O"`@1/YAh*XIKHU!d,j)#2eJMt%Lj'97chf!(I>:>OZO[o/I%)kd9;Y$Od.-C_j0!"&O;; +*]A^=IEb4l;pa'2QekLjduUm\#J8,JD`U/2i1'79kX*(ghJUdq;20HZ+'_@.*/aSBrK8kskKd!':9%c$ciCl!Gh,sWsq$_+ +D90Rh]AXa;)@As&a1l%J)HV@QMp*j+TjSj#&t(\6I0/h%Y6hG$a +\LhN"#P3Ls[6T?ZD`C.]AR,a`ZGH@8Qq(EH#T;gK-@g$+6a["%X68Z'e@o#L`@lrL]Aeq_fia*U=i1S;brA'qfa"TcXjN+m'ForB#5dH9-?8_(Gh-ES5< +^N%G15_9d8\ZK4YJt?e^Jael3H*7L7m&q7buZ2fg2]A@61I%&&4;iMkF9ia=VeCG'[9.IRWpNs,JZ[Tpi6JZiF)cXU>I#;?h +SRZ',*(HKNadCg +@9PYNcm=VS0,4.P-_h7"i4W/dY\q,l"_NXM0DoJ7_5!:9F%muG$C4t/2^,C3PV# +I#!JgN!!@F5h$QMY9S7N]AbN@,Atj%(ai,%0<4W6q)r,7Pl>r:^O9J#eW3X-*b$c4Z.2a4:=o +R4Y;bg_+hgJk-%q?`Y'bL4!Dim=W=sl??jWURStG>TC-h.\\HK>FK2`.os"KQ]AMn,Y6B]Ae57JO6n>pfP)=9qgj$LX"&f?Zha]Aq;^Z8:,B0h;3O6>/\OT!&DY0Mp1* +q=G<$]A(@+OK.eIT'QMq=;UJ9]A6^E6KE3#e_<#Q7I8N5B=t&C7[GKYprB6 +.s:cUI)D,)J)C]A'lW]A9.Gu,!d4DK#1gYrs?^CZ_MdgiPtT@\5s?_7:'kI#72#Dr?UFH;QLB]A +/=/rI>]AcIN&oX(iZa=^ui*8+%CStZ;c[bn20=,1\'%8cqNDDH]AqmMCc!/bN,1O5o#D-`g#eJ +/cu\)OAdQ4nkn9ahJ2j[jnG8lCY>u5k:petcStepkeid,J0@7IGf,Q%A>+5Efq/_+4N+rCsd +s:u:LBctg*p+2-Z&2#M-DpJ,+<6*c.,r7SW),k>Ql=kdkCVI=E_hO$b=`+eoqU-UiZE_R5*6 +LoXf\n9S(ZM5K!Ckj%ka8'%Fr8,25Z?jJo>3bbXUG*iSmOORR-`tpi[g21"9sCh0%G5>eBhp +DI,m$0R`(4?AmeAgM-T7d/r-O_cd.#;]AaQ!;Uf<,U&.A9^r':TUk-I0g&#Qsq+7W%N?tPn+o +3FY&?sA_YmM`BD78Jr=Gf2FGEV0ln9*@X"`%F*@Rt4>($=1D?f#$r3hYROl*6U3s8?o4(U"\ +Ko[R?AdijJNdS56,>N8[0V;2hCa6YGQ?f$6.Zm,O:4tAsgm\.sVdc/AE-aU;&t?/QaL--Xh5P[H`@aD%YsM%clGiEMI]AJifP.#%b,&Zb%!F +K3e$eBg$:@8Iu4CQ_K#'F'>:Kj?0#dl9=M(-ibr#?'Z+aDRO'KWK(2o'l4=2A%ap0#GiU$!7Zn!E +IAUpt3\R5;s%bCK<;k2DcXE=MrRoHAu3c(i]A6/Ll6`;h_[:Lgp0@p>JnmXc7_&tSC#@dIr/k +?8[*=-PjhH[\Jq(sbN3&*WldM7W[P$Sk)D)/Z\mk-&UNcg/X(&rmV! +9g__n@fa2>5&]Au)]A5KO;EU:+k=70K4q(H.;f7:S4bYAN-I,fLW*Ymk$;A+WDrfpJ#+3 +V/c2@Gdc^FYJI;)NKWtq#oB;m:NGFCX[LSN[S/eO^[FuL\1UU(-fY=D@A:5k!lqTKC%fQ*ioCS3&]ASnJdLR\J%[\mK2$G#MYJhtOr%$'h. +uT4)#?:3(e[(@$C2dWoHL^,)]A#nS'+Z+5RGs=C,]A +#Tl.OUj!-aU9A0d7MB7gHo#G^^F=`CG]AsC\lq(25.7.\e@l-AU+n.V3#b>b(6(:>I;U9[f]AU +1&(Q$Ln7mj1#qJ3hA&?B0POnH*"WM"uOj_Uod]AMdiM>.fD?[04&OdJPl`SdN.(oX;Q!&H-U]A +C^?jT2ZsS'p+S/.I8/,Ihbbr+G;^T5P51Npj5(6Tj]A]ATa;Y%]A?"bV=3#B=!DX-kEXgfKl@-) +NGZ+Q6C-XL7<=-hjK@l<2ff[(]AcLYK[<]AC%7U+;Q]AXO+,cnc=CjAocK15b$G+Ar3j,91")P3 +<c:N>[jrF,lM$/5h56Fb**3=Jj/hCEX64r1G +AZ3Dr4ngnV#aYk@^!PqpsOilWq;?I1XegMV"XX-N#>"!6)it$@ce\'ifIUmO*[-"0q@%@iES +O,(p`rciqBue`Ws?pA@OJLb5/5CUg8PePd@@6h81W]A!2JPkeOr'MK_ +B2'SOd'=8dKnTJjYp2D>L9F#OF8*pV"%cnPE-rJ$]ASL(N1Fr$A_6Alb_1"V[8jGk^Qf^B0,m +]AJjlM8(pjKG<:U,$kXC^e/!)Uhg$S]A=fXDV[+i/hQ-^k +:nL:+?P.9akgPPpL%YGF.X.5&1?)pBmQoWd[84_fNSIiAMXBK05M/p*R`7P6=4>\"BY_Mg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Y.Gc6+XfW*mg!!!A!U@;IZoCK<>RL5QN4$Ls*a2^+ta#H. +B]A=Z87B1.oFOT>[8IeqM>[f]AZ4R?\I@mdBM_o,5@%)qk]A#>ulGoE3P[1>1l$2TRal3g"Ed:0 +.)F@,..!FTAp]A7gR:ZcNK"s(FO]A4*cSY_?*$!bhg]ASlLSt*"c.P#43]A/Vc0U)f*<@2".gpi1 +Mu_,S-ng2Y9Q_a?^Ud<>h_R,H-2UeOZ1'GV@"C>/&rUN:W,?mqE+kb'q"547Vo"fSC@*#o@r +%=*5EXfnoE9E5b@'RG(OQ>J%%f@P_1KtAr;-71'o?a3X4]A3l,F+OY"=?7bu's3Yss\6!Y +N&_SX0^C*q\iL4Y"s;@gQT4\L5%VMtdTH$Qrs-'"*3S"%UH*Z,fikNE.u:2p.41&ICPFEDV0?EtZ]AZG)C5kN:3PNkS89!iCA_m-X=,5IlT +@@eB>5#mk%TJ%(AnWI5Y0To,glM?*\Y!oDej`l?lG-9eu[hWnY9g5Z/W#opiYJCo1`kUV1cq +iZ$qM0&=^Yk;sKk]A,tf?V3Lb>7Zi%jC_+tZi.s/-U+/c3Q_5@*?:g%5h,(g!MY?"jo>DM[]AIEVn"-Qr^'LmobNY@GjQL<1iD("Gg&Dk7kQAK;[I*\LULcO5=Mu%pQ4IO$-Su!%Hbf;F0M'+L2&1/1j%"4sAdpp>!#J\A]AWPLbsVE5T;jWJ2s-;%Ot7c9b?6 +fpII$*3$Fjq:7Sj<_iXnV"(!:T';RrYJ:Q+@r9:M?hBbX.#OTk +E#Q='K(a%kQX0Nc6sVcrJ+k+\(%R9qnHHu6H)[PeNd0E(0u*kZqSQJ1qIe$"?I'iG/pq3-XS +%.`gGcQQLdY0>XUk(X52`WX^"3YmBl$iUuF[]A$#EjYiUDL6XWmD$mlbVJMI\q>U'0]ACl)L8Y +VrgYE?lgPk[4A#=_"[-d2b\?uo^8]AB-KWHQ&!H2q2.q`bH3@^^IWnBX4(U2?]ARb68Q_hS/j( +bDiGu!W'G&?\BeI'Y\((8qa"P[nFf_-T[]AU]AXOIc/L?t%([s::pG*q=UWC:[mf\GAq,gXdHk +22r+[MJVedrtW2Z-bG_3i"D=^oHI)V8d.>A\a:,8$:H>4.BkOX\/b>eHpjgXNm?oGR5=D)sl +3aGMhFfo#j'-3/Sn?jEd?P!m[LFgtCG9bb>&,1Y+F5_*E= +NX1Y81B:dZ%GEEHBZSm1Tmln[7A8BhS#S$Y@mU-K]A>T(C'QogXm@A)2- +nfZbTBL"adP45KH"h&B1OZrR)8U48=&7$gX5d4<^ANE*D%*V&"oV +JTC,*Vh,5<]A`?]A[6Y+q!VJ1M1Y7;j5R:"diuDq)ir?I3ad^FT%h,K\_[Nq86VRKb$Zg4soEt +-=ik5m0.b-Z6S@\%U'>A7N/G:dJ++KTZK=4)%ihPNdfVP4ai*uPb',5G+I>u/eB0mj3nmk.U +!gg)Vo@'Bl)`!kEj%:'l"81dQ9p4/H +="a]AtEQtrVW9!!:,Kf3_^IfS,Z.7bJLdO=0MI!OYqo)@uqYVF.*'#]A!@4dB$H6oXB-[_8[dI +_)n%lLOb'gVDC\!EA;^^2>OD8"5*Vh?+-)&fpF##Mm^r71gtZGf'#CJ!f.(ll)D=qf]AqZm+Z +Uu,i7MSDKi[t$8Z+Y`6DuUa5E!X;nAll*=l0nCRBH+I)ic\A:1B`D8o+dMIcR7o:s,a5(A?b +=:-JWqH3nZ6+7j7O0$82R]Aka3CM=urLG[XHGjMTDIKGf]A<"Q2['KP4JApJ2'EC'tU#m2dAC9 +_Vp<&)S/9SN%Q?2Ju"]Af-PfC@+eeD>m+.Br\)7$ACqT`:JR>,%q?baoTV@f=-&5=\PD&M>@cd6UIJD\qf>jWaJ)m^.7c4=#:Xa2(Pmg +()FpqK1]A6(u*^-:>Rn.Wi;js^J=?lTaPTGXBdLZ@H@0G$a53?DN#L/Z*s6'",LGecse"KU*P +dI06OPQDoTr=EP]APY//Fq%OYohI`^`Gb`c'm>)jU;_[M%2gbG'%>Gk)ho^s8AJZ^@1\kV6i^ +Ld.3)e\7^Rj.O3c]AnBt]AqBI19Nt#Uf[*9pEI0-jRIOAJR(s;.gV>5rVJ58I7pR-L_@J.9Rg/ +eT1EHfZ>&CQWQti&O3qhs3B:;[$\nCi'mTgji\L:(\S&kTk@mCTT.b?!H6A;K!#h(WtJJrQ4 +A<3(:u?jr+.(KfEND:K>ps04TXP;V^C2@7L9_-,k"'*K!TEO(4T9Cdd=Z>K;3PJ[ZG#OikHj +s@"Lh`;0,M7O7mAONnD_fC2#HpQRj-62->f;'6l/!GD[r]A$'b@`.24CR>lP+_(hIr2+/-P?B +YE8#-?ChP--Yb"(4nY5i*R?%9$1\,+V\[:)=LdYT5,'-+Y:He4.=Jq_kdD$!*4A7!jpZ\NDS +$2Zt\VFom1d)i>BWNkn:%BpWi!`_$E\a*0LEt>9_[0WabLI\SEShKA]A[B7jslQS([rAZ'1fU +TXR)hE.K2p/!1d!M@V*FfEW:_\+'?REg4f`)U"'BTUi]AG\0ZbonP?Wn%8h;`A^a-&&8ae4_< +48N`rA#>'c+=T=o)SCk/YGoM5ekE=:j)Cg3XBr'2@BELiH1>(9WAgf:TDeMg]A1o.+C&9[QG1 +tL>NC"CWhN[IHg;]A.;UEr#.bV"`q/r;]Ai]A]Ak3Y5Q33;JWrO4TVqheP;+ +U;92P/(/+#r_S''f#NkQ4^;%G@US[N/_;MfLPPkfMnV/[++$)G!`rmneUAqU2$A;F]Aff7&*W +,9?MKrNS!eKDRiHUl4R9F[0pqY[,PbGFX/9sZsSN_V<)+[Qg9^Cc*& +gf'D;62qX_Rj$C?$mQF*/ZIbQ!2I$)@B(:g@i,p55/o;=c4Lo95K`!J6?cI/oQl!@X76e/V.NK]A40["4B=_5Tk8')[IbXFamo/;S/XV85"ktO8?6@h!gos:\;4uTE"O@\5GK_u\V2UnV7G0YOBA3n+7#qB8pI(cj&2 +n>Lk#lIOA'Yud_n"cHLDA=+h-VKt8HCL=cDT^A%L>>b>bT:N=h_+lni(Gs=IY+)iO>i%+@k[ +%9!YC4"BQNd#^`s"UZ.39Tkm<15QrH27'Kf;rgPJa@F+p?$F:Yk&mGIBeoLY?#P4UI@Tjj(6 +N:@[V/V"t""C#B&Su)(WW4?F6)1.N\Nc<+g?C$!T?N$(f:BN%rbrm&u`H$-14q^r%pkWY@Zc +$=V/Jp-BW,&m-FPs;:rZ8>aeQ':BiKl>B[WP\gk1 +IO*3b>4lAiI2L4?9XJQ6YWkb#R\oHXpcEA-aTK:@Q&X' +'.CDnQhIpf5q`*7]ApA"$Qh/CdjC\5OSChBE`7Y0'(?lDR^^ki[@hrY9Ab3*J["q@jIlFB0iSr%(>,3>Z;7`oe'33;-`YC:458&Sc +_4.r2&P^\(h[I;2aiFn*/nXLKP@/Su,IWnIY`Ss2>4L\]Ah>"=_KW(44cpDqWc,,\BO+pijnZ35g8=V)]A.5k+"pg[)^@hf(+8^F +t4fq_D_sqrH9bFH)ag&f]A?mgp">=uL)M*e'i-l#d#GJB=NUUAmu)hC16FnrjosPm3Zeh:C"`[ +gl)GY`h?b;o%P[[_Ie,CEsRt'f:BL@&kQ@)u'/TDgBDh%1gRJ45k9b$*fkSMf412&T/"6W\]A +7[Ij4'ahEQ)R!8V^Rlk1*W#airnN"!9([d1+'3>FZdT.5a#,HYWknhc)DK?B\*5@gG[_3>0%0(mb/C_[t_=3H.2;h6@5 +m6qT79dFC7rl2'>-V/o]Ap4rNXF7,e%aZING`W->:L_QcjJ"DC4RgPX!3@jUBRr4nIAS`VZ#/ +@_50PVieVf6.^TjX0>k'm:-+5d!U52'Z?(m2kepFB=^J:# +WDcfs$^:=:jVU-\HR!k5pYgi5sisU70+4I6?Z]A,B#0]AfP%K0GkQ!M0K7H!6r5Xbd'nERoa>" +#<:7JJ3EsC>,q-"/a&I7-eikCUKf:8V_!K8a8"Op)O[%AW1e6od\fda_lZ[MZ1I'rn@Ohe;E +'+,PQEhBYV"m:"964ni?1anOtrT@/87?=Z*@BQCj.5fX"ZaQdqEjkhZD^X2#.e>M":uCW3Lj +K8QrKm&5V4[cIjM!UtrdF>uN%?KN:rS\%"f4ug4.\V=>+h]AD\Y&!,+HCY +Nj[9\.Bn%b5>^C/-4&^Ar7rWHOHQt"I;pu?YZF<'MB!t>UI*#Y^^IC7Xp8qV/L?Q?hq#ttD6 +2#VDe(4"_%r<*$1&/#2KJ:d(+sgg\A@9f+B9:SYF-U)kH^E;iTaaC=p8EPc_b:Y,dfMgl*:p +&/bco2rB"NH'gi(0:T]An$MDLF@)>I@U;\mWi:`.\*eUVqD"X<;l,nO5h`)!Tn\;2uP;oqB7q +P4KMr[le6&dRgWJ,.'Q(h:DJ-hDD.8XcS" +:>R$B(/o%6@lV>a4<@)^_YPNlPA]A#YGKSrW(La$N"li@krGc*%Af4!mW-3U;&\TI\F_V`WNMT[jJ)S'iHQghAi3K?/foA!-+CM!dEbkPVM*-hPf&IK)!,hWh/HZ(Pl`[@V +li3=]A>t;fE3MK`f6MNuLoD&i(ZG>ROO,XZOo\p68aPIk$t<]AB39`SL,$RY^s8+p's0X[UtP( +dQ_!Ko'loCdthWU&4?7-/&np6=[V,D.W-=V@bT.7e_8?,1`G?Ii_(CpQjUJ_8$GA\c(<=l/4 +qSlAEXAmA[3mLQS5jeL$T%!MHJ"bIW((mFA`Tu0@o\Ej3?5"Z",Obk3SH+Fh#TYk,9F$Z$O_ +po"^RFZ#&>0ad*Pse`ql37&N3-Y5TY7Cpl$1dlR9GcG03ep6(BK5$:fdgS"ZK9_NU29Du678 +`Teeet9\8S%LlrfRK0]AoJo_mir=g"6h[OB:!c[iO&fMhfj(( +"!cDW)!kqAg]A +j/)M%fe9'\jFk%!o"ILEYC;Q-X6]AW]AnktFo@r9'>,fus>Y?ERX+4i*#_C$GMYoBM]A(OC(AI_ +b=E#ZlNE.1aiRSZP$XMTl[RPM]AP,(&e!W0_fi>?e"cj3hUguK7[Jgk<-uqQ)sQLd$IYCMkB`6XJr>ie3R$ +qYWjFd8BCe1DO?"61eLIORiBbDc%lS4bU&rH_PX!&pNE]AqdR6:B8F0KVIk8\#:<, +/Q@U\30dDakd_J887DY(gX]A>QdZujRCl=.&sktJhnUgc/%AkMo8r,_^R]A&Jf\HEjM_*p9=5o ++/a2S(oQj$g'qM-sR(P@q@fR*jJp]AO:cb]A+-2n/HWsO8`GGBk1j?6CstR8!SW_"S5`CdR0C& +cPl%s<[TBVNpJiu]AX[#VFBDbuM96lo2M1\F8NngPV*+Qai,O$@@F]A`B6]AMe\'&Lg5IgjhQo3_nbDa(3+a7]A\]A(FST7c!+'S0O%BIb(X]Ao%Pe!oWXH=$uNIP.Vja0(=` +q?S_-98q@u/o.0o=7>(V*3$WFD8>Y#%\_h42:MWUI[A]As_L(NtJ/KHTb27`WB2SGG,Fh1q84Re(q_C9j9m.6GPdl +^,?a[$PR0E[H=S),,>)Pi*Z/9M3hS`U6@fKL(Q:u^fT]APK5]A[kK/59Kj6UqQ39%IjPAC1`CK +G)DA?,B_A.+ga[^QRm`-%Y%3Xj2]Ak6;hb4eEg;:MXf@^b44Vd3f-6jPT-4&X!r.Q2nA_&+nnl&nND=$0iuMrco,P@R= +oPbc"N'YohTi/]A$W@(TfP^)K2-&=]Aq5U%H%&)]A913\`Ck6_Ia)'Ko:Y6H01$_@L,1@:AuW)k +kT`r[(KVmZ8ZW$hp3'8J3BQM02,3Ba+c1Q7]Ah^eP=iL,66F?]AJQ@g7GGT&_a2)D$jSTf8Vhe +=e`;eWKZ(j*uNpiu.E]A0=,3bp..D#WA[\3AS(p3KqZAF92cBrB>_E9#Tu,QL` +qE2QQEOK:&i19)D'AWk0Ri80l'(R +Dn5ET:I^J<8RTAZ5MiL`b;DbmR&fY +pD4K,(HDj+isR=%p-PH.0UEK7"GC`A?34?\CA1\EgP?%e3J\uA8pn!am?YU`jr#NH88@V4 +m+P!`b4p)b)P2s*f,?IZ754^G'[e\d)G_6L#8'FD.Fh[1'/D]ADK9[C80>4&>8G)Zmkn=!5/c +/6e.irF0%:fuX8Rp1_tE0+]AH*^mH&C&dj(1&ko/PRu`H`0\!fMJ59A.1%_-'E?7-G>-^.PCM +O[9q@P0m3X]A\L2.-1bj87@Y%'A(QLS&*#AIN.'ecL55aPl]A1TeRh;CP4o!OoaP`jt2P= +'a4:6\2a@?EmK.!mE5&T4sndRG;FGU5^NOf;b]A,^N9j2:SQ]A%8k[(I7XjN`t@[T7gPYLpZ5_ +,+03t25LmBPqm$qioUc&"%a20W@?=1aI7O3[ITg6Q6cpK"'eB7PX38?VoQ9]A+!d8;2i3cP!6 +uZ0kbj6LV,@-c_lF!P&-NOITD:aush]A=BsTm]Adf$I?.`A>O7TVIOA"dA8>KNk\u)C*5IDK%$ +-_&rOOZODB%e]A*>6I4.j(HJY6,L%\*D]AW-J.Z?dIOR_9K)!i@p\LXP;0==-5X48Nf\',R9+^ +lmMAf7*iegoG;W;H\ORK_1d``V588t3Hd?@)Ss]AJg#-6RK`s<&g9XJ4Hkq.*B7WoDGq9Mib$ +L!LO.[l8.g,TU1bc5+B@NY"?H]Ao2>r@Cm_K-t,]A4V2Fh>7([eV3S:eRj1rq6Au$S`Efd2!m0\#Qd$(Y<"%haq/M5ClI^PV&@j2rL# +DiI\F1Msfnj.++iblf,*6F6n*W7(*(p7a1 +5,*&VFsUudS8bj[o1jBoGa2PYe^7nl3'%^P3?Y2,,K"CjK21r9:,-uGIpSugP&e4[j9QX62( +]ASST[HK&#mS+t`Y'Nc'(Zmu*4>A%k1\YEf"qPGS^L7Ck87,GgR:LqWUb>Cp8+/f?!R@(4ajW +&1=Da=87[N!_P6[=.2@bE?AjO-Y6chkY*$aZdV!<5Srh.l>p_oOVF-0=J6UC@B#uR2dm?dW. +0^.tYY[i:RU*ui1[+SX7aMXPJSNCF1IZTW]A*M2?0/(OVf%d@%Hk;d2>RT:AJc2:j%ZLXU9i5 +$,m7-SUJYJfc% +*VT^u(:5()RB:=$V]AV%i^gqh"N*BMVFX;Ab]At(?M)bl.<+_krY"mt]AkcnBP_)+sigZ`<\1jsT"7,(kVC7ni9 +T(@LKdOnbMU&A*!(,[0m.c/#B@<^=qT.4jr>[P4(eSEqm;FP3gW0/1XtdUaT746t#S1d5_9H +<#'V.oZ/$Oh15DSOVGfaOIf/!?s0N]AK[sRjYcT0(MNDWnDT=!h.3OB]AT<#[^mMj?65%QGfDD +&/j,p0Nk]ADn\U14dI7TJPL(VGE^Qc,lQk3?sC((m2[kpE*DOr@,LiX8.R>YVPH8j?$I,i\*G +^Ts)bfC'Y-#Dp#:g`6\1-?Rg/dVu`TWRaIDE*YG:o&fE7hK$UoALh)g_*XsAYLI5)D29\q]Ar +VCbB\eU8kMSg_lA2QOjOuhKd&67NCe%R]AMhhMl1Sb$g9t7?LZ.bTg9W`rj-Ru^+2XGuJq4FV +5BE2t/i?LEI4$1GC6=#j*3)M>B3')&qqB_'4;^M5&RYC,]Ao#o[^"YjG>'(O[0="l@P(MBoobG7l4FKFq-H9E#3Z&4Ea+S40dK^-/cr#(R]AnYi[s'5-[Z_l#tE;*eAm:e=>>,: +Ju?VqI.CoAr_8cg-PdK-Rb4!;pa +WcM[rTc.ZJh5LDZo:]A>XPN+Pap*gk#CJ67FN3tL!gG8Jj*qUdYAkP9f`Lr?L1qh)-n'6R[

Vc4GX5jqTq+%KQgiC#i+do0Y=DP$-]Ad%G$a6"qV< +ZjJYIRfoR[9B\\$QoBj+^@>Et=!YN`;"2-\a81N%h)?d,`Mb95=D@!DG7#J>M[RD&s2u#E`iP$%-Z8JnB>-8uC!O>Rrn6BC68lI +G53.N&se`haH^5*/T\L9rQHWpi7b?+F7CF?fTd1Ti'8dZ4ZhWC::\SGBCQsUsL^5bWWc=O%L +0&7jB#>&?5-mAe&cLoP;VV_sb\C,+?.;i?As(BbSfN/&IVO5f`e7>`Kd!s^l0EEV4@+S`a$n +_59q,_\+k-.r8H8$UqQ82hsO'J878F=o0-f4LH=ON;@]A-!#mNA)Y4HGe['<"=cQu?:.SVK?a +g#?!*;UZ]Asa?H:J7$%0B)H^-F"BQK[(0M@o!.@;6_qWpK87kaaHMe9(sb2)^,)U&G7t,A/W) +*:GS//W$L.5>PJk_&$7@n$3h#9/h!b%^%mK*uBqbcLZ\-IPlBnE\DVD29F,)Bjf-YU]AhahT(FX1Cd$X9*Ek6iteK"i"/>m^]A?TTEG4Gf"(Cbj!4.&:UU/+`ZL%'*Pn"Us``n +YL`uGeYSufhVT7DCV`;qWF,ZMl9[K?sk[\WNj'DU9)gdbpA\7W=/uE.Q[53.*L`OU'%EL=+Q +.qaZZCErJ")8[$/qC@W..jIpQ\a3+6-a7G)U69LAj.!q,3H%D?:&E]A(ki9$K%q?G#>d>6F`: +1D^`RKGiU=m/K'WJrr6X7-oC0%VuQ\3sOA:ahd8_tFCj[E +/6FF3A$W\hZ+l=n*_OM1TU",F;).0_e.+($kRu6[[MX%lt"kXsj+75oPd-S*/WBAUt4CUn?# +A0;^t+H2Xr6W)%`)Jcq2pV9'D0#rb@E?,&ofV:@Ps(K&q-o,%:(0<[Vs*H)CBoGL%4WES((` +O'S*;E^l<]A,'FUVroS>QfAhZf5R.G!K)%9el&Un$"l=3^K`M+mDRQI"A_,q0RUWtfslFrI+q +T4A'Z`E#hmjPkQPN>6.%Gb;h?TrO:FjkLhV.bf18R6r/0[f$H1epE:(ok:!YmVN6;@58`@u1 +!>NsdUHgHAN?VjA35OR/EbY+57H&(V:+Y:;_E#nO&G76pmqel7E&_YGU^,Dp,0T3:"7PoHEW +:/D!rg!Ck;E^PW('1WnWDuSUh*fX]AX@a,fVf*eDZoC7'>3V>8r$mm(*Yn^_BBl;I:PkD"ZU/ +F(,%3n[m7TVrUP/1'iIcsA"E#9Cr="V5(d>cITC<6qb%^L)@C>VH=^^@9F&kCYYN>6iJjFtK +?J_Y$@X/')#+3G*AV-4VCL9upY'i +Dj6!PF/?k#7:Fk`ql6d(BNAEUOqZ=,>L)'0;j83g7G?#UG46*GBi=]AU/@@T),?lELL&7-&Tp +r40NaWmp`j`+.Wu-?+=sf:0%2_%1Q'g6Gb!,.t.`JT6WPl9uIF,YX:*iO&cW^`5d0T=kIWWT +\ao&j-,,rbsAaa&P#@[U34sR!!5]A=Fr%4mP\bc8Q7UK/]A$ae>n2gUR#mbbo't*Xjm"gBqFk7 +1JP$<]Alj(ZU=j21CpL&3*U\[")UMifppL[dL*aeHHiP-.p)-C*mB)#kT4U@h5l\DYV=Z#_`h +50g,G%BIjo4LK#?=!<=&&b8\O2@QjYeZN[IT.q;0J/an&1VBq<;*A$3ZE2hhamSn*p6Ou":" +;J.72YLa'V;T8:E#R6]AjlfDIYUX9@W@,>k6qCoMuAQMiM#,mQOXmZBKEC!`?T.h1o%V9TYs: +0NGrhbI6U:ISX:ibL)Y]A<<%cHB82nej+_?aH8*F0hl/52BKc*mY\Nm3hS0oQ]A1&GL+kaWul]A +kJ3Eo#&d;HUJ&,hI_,OZcE=*/>NPUesrje"R#BW.t4*bb/f`doKqJq`toMN2>7HfP_u^kt-3 +q,KikXi@TIJ(-&'O$Y4b6QF3L48+Ih)@fhYjti^F=b6(j<25I9=_dQpL'/4sq<$qCG@4lr.\3-RJ&j +n(X,^s^5E=`:9um1!B9n_"Yu]AV9ntE6q@.$)O4/!V>DnnY?d:E0J9'7CA`W%G$!S0EBF'As% +,WU89W![GLD2Lu"/PPOj?Ts9B=i77Gi&Q`S'kH5jHRfYcK5cT$ +3:!]ARmMi!ij"[je3%7OkE0KajH/0!(7nHnKC_2nkl/&g-hZK>[Qt`tmOGf]AR.S8Yq\"6i +^DZtYti4G@k*YYhtli<4GF9.RlpJRSIUj`d&adDYg?Gt7aFnehihW_P +BG5K`Rkb?-`Hc.=ZtILD^4C-if`=GeAbd6k05CZ`,VLU0e:@,$Q[+!KI4RDkpW\U6qhiB(LC +TQ1%g0BE]A7A:n$Op(@35TWJhjDnL*O*+^=]AeCNXDe/cT@_lG0c82%KYM5;VXo!+7 +OR+]ApdYS$W72sbGeeKTds5%Eo]A+X^S9$A$R7g5%UIL1m6U"N=Xq[3a<\C!; +bYC;bm2i^Oi`Dk$Y^Ut-#H4B$j@/Y8(&*(n_,9e;Q$J__+D>@DgNjB%,>/%u9RI9-@>A>P]AI +>q#>)^5cK\\0&;_dpkYl[4G2_:uAOn?e[K%2K&&,boP!4M3rGCC`VnJ^qnXWJrWmd-=2/Z8> +YGN_96AHgL+[%9V1HfT,YuXA5!X>+Y44\@)<68Q/Jk)fa-&A]A4<45?C?S[Q_,Tmr[T61k(O` +A.Of(H,8qo17N&PK.A\V$o-['ZlfZ6N`gm]AK,hG>s@5h."im?>T+I-Kpo_Nlf:n*7;(j#?08S===/dg4G. +)\6c(7[YR9f)BH&3QQt_PK5(e(V0+,+G8M.uW>-$4+YoUd.4;IOU#Mkm#D.kWO>%N#2o,,:- +q%=rS_*o]A/a[0%U%eDF9b(G5h0)0<3?GeANco+?IZ"D6rMrCD3s*d>_.CJl'POZNYgm(eRHZ8]AJT;qsP9M+YW)#^ +$qnQG8-L"Q,NE-b!U0_MD1GouMo9'<1AIGVgU+7V +iQHro2W(iO*g95ogU'8dO%Mc*1X^n`6W[!n&[E3@$=&B5M3I4I'R`s.YQI?5b>33cj&75a!= +7<#:;H=l\&m192Qi-E5-fmX)H?t>'&Jf\QVF3`Xa\2:QjflFk?_22O4_A)9<5F;cF+=a@.2Z +dYL*;35?F=92+Gd79`o6RK5S+osc$VUKD[14Y_@CbE"6!+iD0U[n:SW\i*G7[f+R@OX0eCE[h`10WsY,Y;IMi/T(;K)-Pt$!hlAD67 +B:TM=;'s5>#r7nEWinNLZEdXT#slPdo\iM2,MDq&jr8UlU'ob;e9A,&+h>b>#D]Abqk6I/L1( +#*,`b[8qd^9p3u&,k=-KTO=+tBB,kgODWL2cTZ%Qp"f4b"#`Tj<302cM?i^LX/mqlA(s4a22 +mSrVUspM_#7W#eNQa/m(7GNJ\mQZ07nf=%)1D:1m+bKeg/36pEO(X$WKp:^/s$YTns^FKM8l +K6`aI5dglbGNA_pc^E9cbZ#alc;#Qh2As!m?P-)OO[jMnB8QW8f"R_sJg]ABRhU>%6MplBM+A +^K'^t:,-TLNV_[)$k`;o2"*ibV9C.F.Jk>ZZe?Od5$98JZCaX3ZEH-6LccS?'k?;OnY[ClYQ +Xt_SS.%-[ngco-7EVtj]AR.Ph@@*4fjY0riJ]A7H@VqVC_t5t.9ariF7T/ +E%H`4/3/=U]AlgacZ*D9s[/ka]AOcfpJa]A"*lQA +HCZ9c]AIkU/1[k"-:@i?#o*L+nO]A[' +=h.NE2N!HA`jdW[A68a^.]A1!Z,Qh"F?H9Rm85T!l[E$^DV+7EmaA4*0f1ir_l'ElM4O]ALrD` +$lsP9=\k9Hf+IM?gqB*4r+%@M5$\YMQq\Oo3prto!(95(7)N9W()`:3HiE'IBN +.0T;it&D@Z(2)PM!nsJ6de\?aa8V_7"_cX`E/Xb`"12&`MUTI$W?\PPL`TMr!NjG1ecYIb4C +EnN3B)mKtjQ'IFnhYg\J(DekW,,47pe84rFUKBeh0c3nujsrQ5W$0rLfZ\KJU@!]A;*:XtJXX +rA-=I=tC`q60^7rr0O->8dW2X(+ATgn.ViW`s0\kX'f[i!3f/Y-FB;R@r@huc#V_9(\R6NLt +TJRI'5<>j5[etMf"iB^l+2T4[tPDfFU&8S[HLScQZ>6G"h\K]A"0TX',d)XoP/%O=Didc3gN$ +Fa:`:Bc%raob"r]AtSaa;!cTM7C`ebYC/,`,`Si0m^OIJCJHYIq-$!h90pmg$F("99_ce&fN# +XJe978%jrkkJ2Y_'uF/k;[)IM#V:sH$o1P^t3U+LIe,6,hc(fE`f)']AO;4e'p:n=:RdrUIO71L8mkaZ2$-TmJEk'fWQ2!,+k9=K8(* +FFo(,D.,h@M-lEgMegq%LRu&P3o1fSO*[CSgs9,Q'Gu4Z7JQZV=RAWBa)KmgiK#N)$O30=O# +%lR!=5C_QbO2AKUakj\e*/bk^Sohh%\oq"S7%q[Ul!jB-Ee;#(?A49O=DD9 +P*5/2QSoQ+-/UdW45s-N16,,E`9EH3YP&:0;]A:(ZC;VtdE3ukS"9Mu[u'RO.! +J?:G)TSJ285peQ.S[:(d@<`[W@c&U[!W,d2n9U:A +Sq/MW"i+ht'G%b5?[^=nkcmaSHhe]AK&BG2MEK,opNh^#H+iILkKli1CJrVtIKAW^E8q4G,Kn +t+D#1'@Lb=\0orC,$jp^An~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>qcu<[.Hi*]Aqs*_C>nA +&Y>[J!jHN]AG*aF+pZoaC.4ZIK&HX,:j"Dl$&104l1GUkfJ1YB>@l5DY1\,HM%#qK!`ICfK>l +;6Rfu;j$E-&5_L(5->'.H-WMBG)QP2WjEn6^[9Drn8Y:<=n4Xf.D2(,KXaam%9L(T'gZsj$7 +;bgG*JXp%?PR4o==^d]A\)82U);@hS9cggog[j5Dl'L*3+1BnAcC,XWKV6uEd$l97'BW@b2sg +k+([cSiHOc2:lV0-Je3Q'p19rm&B[h,+^osCj.Lb62GUC3Z8bol(huS/ss7[3r$gmtc#-\=1 +hbsius*OUW!WMicIfoW;l2P\sRI]AiVJK\@B)cHmpjD/(V57a7AnG(;h<]Ah5^FsGT26R]A%X$"TAFBn^Q>d;1phl;H*!Z-(AIs-!Y,36CNE +u&2RRd-a[UOMlNGG/-Pa>[A>qsR@%0%L3P"TgluEMj?')8!WVguhK:^Cq8,>Veb]AEj<'Jki- +W;"^Pk`hXYgco@"e>p5XaFCuhn`_Ao:$0<`LMo'cTe$;*peL9\'q!Q[^U]Asqam?*r"o9[QE0rmM"emKA4b?E,otc^d +C84'I0n5p^ER;F_>0kQN:tjQRf+SA*(L/KY"`U8+<)m>'OYN[3!`1[j$uuP$UlRf\+o%ZY/r +(jqIK56L)ahs%V7-JCj/H)G"Z$o1(PPB3F_8hiC6Uj;.OZ^T;bEFVhO$8a4"$;kKEQ[]ALUaT,Obm\pd6:+;%L.\)%P1#-d^V8E)r?U^0=$satP!O"8CKpfQXb,f +9n347m)#OXY3IUj;MWL^!85!i2_tZ65a=!Ifb#Q"7p4$jKFS?j12-$>=e)Q"Lr45!spDZj'E +P=B4C2%+Mes-T&:oYWeg%Ce(GQ6uC6q"ud%)F8%!=tK=4(VEdj]AY%OL;?".)Xln9Z:Fh4\8C +4\mTWA3mCJbo3gl=o%722t)_8Gh@88c"geuK0b9*eXc5.'?K>;^[9,QRmBOoDX,B/Q%AsGJ> +&Ws[*Wt]Ak&oF04=MUWKNYiNO=Qr!bWcuI.E[ep"'*SeH'Vq&&^FO4@%n4GD;b$?=3`l?$!-) +,m!#q;aWO.M`$HWaKS`B7'-P<6IQ``lf1"iA[QjRgsTeK/fL)KN_YWJQHd8gZ4^mB`Q;Ua,($hYj^T"rIOW4-!BQ +=fFYI=JjWI[g!5onCZ!?W:r^n']A,0b(GLSQuek9&G$Op^SSURZG;&=4[ciV8TRK5qd28WaM< +>h4C/ro6Mem+oEZ^AOFh,F1s\1GnEdel^_%(`i?VNts^"rb;6fC#8Omp^M_9 +P*rIB_"H=NQOQ=[VrBieR-2lu5,L92*kp@.?nR=_I1b8)L\C,ke +p-UBWI,DTEe_c#cGD.V/L@pWX%j7hOZ[\98FG:Nh)o3VZf9*I\8KR]A]A>1?DWt^#P[]A`K,6#U +"=l`nu9HZEp!"bi(DdbIj^I_-`RQTm+pi9nT>"SN?4ACNU4.#96E,J$sg6P$H9DD=a+n(^!d +o@>5>Qk^Cs,9s;iJgCtaqVi0p#Ied\=(5-q*X9JU,%N4UYC-J7]AY>Q9-QZKac=>/7\[f7Ujn +*c\.ffCmelGf`o;s(Z8j5F_5oCOX\T,T7qYE488E@nM@J*:\Eh5RXIj'C'lKX8!OH;/KK6Jq +NL5;]Ae!m!!K +olm(T!OgrCn*cRha9]Aeg=LsmW]AgrEDm7QO#l'(Y*1Y=R:kJd%(!qhAtNV!btDinC3:LD)%Y' +Ear8h8DG!\bttP?"fSfAgQ`koV@\lKOFQSd,]Af4eJ[_^Z$bMa(r@aV^e_rTtb5<HpW;?f_i1k,6$tF,(dcaC5Z0[=WHEK$jd0_F;dE\bDa'>-I.8Z(E1^he0\i +6k<\e3W:g$r3CjBTcr&&.=Peq4g7BjYTP&B%;F*?o:F,Fep1p]A>?cN$o^UAT +[@)V8*#;Uu8?X6s.H>EAQSj!t]AQNqS4IkC#3XbJd"l>(QTk08B^@q>KqJmV.E11TY(g-hn1Q +.4go5S+.GcqYE(mA4;<:ED'(Mr'[Z:?1D +r!2h]AUjjSb?8XeO5AId4W\o&.UH'ZXoDhfjZCRg5nFYd!Pl89Zh +_T6,^%u$+a?YYAFKj8hZa`_jbqRX2o,k[qCqjjg6gLrD:$m!6d"$2m3qE_B"kdn.s%P-ukoi +B``>mKUoO)"A_83-\&%AIaFp'-\X"QE]AUUEEOB+mff]A.c!Y./mf*!]A?\=^Zg:j(&3`F8S>h; +U,MX?CQNNGX/i3[Zj?.R/XUl[jNAN$_]AahL14IE]AV?bPS;p#-!F*!\ZJdYVk:MGHAdZ<#W+6 +F@WA"oaeAGNDs'iU1Y:uGT5HUuWEP]A%ZNdI;EcQS(]AUDj@!N*ia',3NIagh4blj;c>L?2128 +3U'4jo%Z$X0jrahF9k,p^1VF!B;gN:t/Ok!_l +E^B.ARf62]A+HR3u,A`^?A\bgf)t[XZH@H1=4l#FVg%A%)T;g9CZDH44XTPpH>>+n!0i:5&JQI)@pf5C'ghgZ5UTM +TAlD*.`0bsZp3A4Nn?%j$m2W*46m_Oh%)c@$rNgVM:f$o\O'.6o!0;XJm'T)(Ea1'LS[qZXOk%2Q;o9YqQn\kc +P2ILtjX)aPi>eiRYsuq9)/R@LQu0s#0*XNn_<29=+%I6DYh5A&b0kD'%RqrTi&I7X6_Dd0NW +1pQnN&p"/Jk/OMUDfAF6"gD=7j0,Yg6%,PLppFt5J&o +LMhr7<.f&]A2DheYG>HYDoPB=sfdj-e&r"R%[hn58>U3d-;9aDa'#pZMZ.?ToHOpW,(/fRRj6 ++=d*Uf(_\a(..(YWper@\Z1OfO*an:]A)ZKfm.XS8fTZ>Yal`-4K)!5f^Se^3`N_Rejd@4F?Dc*-Q9_*^%\`'XP#6kPYoTs4G=3'p497uO]A!8TW#C +?KCK(^nbJc$QSWi0R`i!T%_rT\]AbgGSs.+mL970,S_^`*(SaT)=igX&+0GFJuIu52k'=m5KZ +_b5Q6=:]AD'hsU?F==)@6_,?f=_BjNO2]A3n0oC"YT\1+G_O7ap6*l#5poCIbQ_E?q$M^JE*$G +66tI':I=HE:2E$\I,ni96hO[$g)G8":>Q16!]AS![m+5B+;q'8_.&AS59?k8"nR;Z_\ltM'Om +"%Defj-cds$=TH[Ua>WirV`]AtD#ELmp0i*jnd*guB3">;/YoEtMD23&W*E^?,]A'[K0U*aV%8 +[:5@k468`\4\S<')kAsM'e0;7i4J")\d2K*=sJl;`^D +EDc8GZ7Y'Yc,:EG/c$TW'QG9UB"GD-LHbHdh002)YL:g +pH*dEp8(Dgp`;03n`T`U`T]Ab7!9CQ)Q76k:(OI/1eYAR[TSUpl2b,b96QhAc4>lAXW`7CKT[ +[J>sR55Z$(@D!,RcZ+S4Yf\DIje+8[Gm\PulF_T5f,\CmBDcd<:MbM0-Q'7'"D0bc/*oSiA5 +OTIKI\YofH7h)Vm1)Y7'TdCO;lQD;1t"*4pdVea(%#!4B.!cNsOUN4^KK-* +6--LT-CPrRrf!fZgfRNBZ5lW_*;^APmumV*m3ppWm7JA2rh8LlBd8IC1R.W^+"n(@\X/FLF!Y_8O7pg\TA:GTi<,nj_MNHPQ+/KuM4Se._!]A?DBj +c@/WDGs8?/Q+Io^#R)&[8',En1>tK`br$Z46$m_dO77BZ-XVCYQqgA7j6XM*;JXjbp'NH$gB +okP0CrQXiOQMj;qqmXVe_U4*J;9M]ANFkjsP08Y)JqAS`F`_^\&SZ`HRJ)$#6g7&fNh31-g67 +LiYl6q%gTsK`G'.ij`t\,TL7qmPE>GCPF115DONudA?!:FsFfR9Gp[5M%OOV8A2RR`&g5'Y2 +gB_kLj5W2%btjiZ";:WcDpL_oA,9nmAlZ?V5XU@$eZ<@'DcB2l1^0)h7(4FgF8M.h2rV*"BB +7&D:.fs(]AX=+V[\#$(';a+UV)_$)+Tg8D9_lh-Y#]A/\rj9%9hT]AkHEG26dg\E%i +E]AaJ/n?&_I/N!os\ks6D,gF'Z)l>Ci'n$2cFha'DQa"?u]AXm4R7j"F9B"Wj!rYDAi\Q@5hGU +I_'pCNBo]AF\@*iJ9`,4l):I3>['-h_\!0$lnTq+-)G7I;GDNnIX/Tord((gZkc/LSk6]Ah7Yf=bIL;U+66ol;WI]Aqn8cO +6,53L,If-G&rqLO8>tbpjP,S+3j'UVXD2$,ldP;Bd,a/Y+6tDm5]A; +;u4=5;-PG[I!Q!-to//&90sX__6#s#h_?c`(M$=m4JS6@J52h`Dm!O?IbF^Mj;_['( +"1.guY^ob$Z/O)9V3=5VK;F*64glPq^F-tOJ>Y_r<&O)`SHJ2>]AQY-U#g8_eRI6Q,+-a'mO) +Z#6Sfd:+T=^2#mL#'\QB)t?:X3^Ig"8GQFOuW/Ra^IuK^)#e@[N,N3<)Dgm,uKSW4cFoFMnW +V/bR-=ja,(*\9f/keWephpl.3?]A8W5BVDGGNSPs:-A)#TXu3dOB?(2s,qs.S;"[[i\K'cV\+ +jPuHjZO-JLX+L186f2&3:RuK3^-"%Nf*@M0M-,-H3h3P+gj82Zb4H"a-NBK +BCu1[QbL%P3d:=3KYVbi[):^sQFn;eeKP/0M>oB?+a^6CUL=!% +!0V">m6r:UlR_lQ!,V4Zgob/%5?0hZ$'eY%ERkdF9b,De"U]A&Uh4#nXnO6Z2k^C+>Y$U/&*! +D6+O2*V+.^CJC@LT-8['T%I5*>/hgjSlW%-65`T!g6R?^M$hV^Jl!Z!d&R-(\]Akq"onX7*G]A +b%G7/\m]A8n/PDf)rsXp64_\&MP!]ABf%qcGnD8X^$4s/OpfSU6LA:g#W"b`<%aTJ-qP;+t!9V +a5)&(4dW.Y3FuOCGmkJ-X(-ri8 +\%!V@$WW[a6r?G+qE+mH9jGANeEQ6q9c)!s:j6oP]AVoN6FIq%I^JQ@2tPYqWt4=]AD"RB-.kr +66r9mqo']A(0/: +nki42.L-`%D7t1c;[WYZ$P,0Lk;nHr4F'O8o(\cMf6Vn]A!/&4-Qio +M:(n!4t6X97FlILgW=23R.>K.!rr,U'ZB/#NC;JFXTP7YE&-%H.Y%pH#?R-6(1=>fdM4)j=M\fc]AF)8 +,9,F&JhmaBP3;^c.3Z8:\LicGYO"$I??]AQ\LhLKN?/'gF!mg]A^8DIuQIlpI/FOqpE3Gk?q<$ +0=hC`S!opd)fR]A%Et/FD5:ID$dSfNa^T`SGZ"GD?3IEMt2[j_#D)B^.=+e]A)ZhZq=;iAS#D/ +JZ!`NF+EHs^rf1c/KpBka$Ci&?/Lq:7oVkUH#YW=UV/LFZfg1$pC,beDd)&7Z08a+:L2gKnJj//uQiKf!mZ3p?BVkCQC9 +k7)7DHS:5A`r"@1P8buU.,feSmG]A.;9%MA$Y*-'ntJh9+2"@8-Ji2$-%:bI__9LE@X6;&4iS +b5G!Lbgs#]ANCY[7g!FjW"-i8GcLeE=a=f[p[D+HOOoR#R8tj-YS3k\4hY5IbjppjY&.eK'Pe +Ka^rtq,?7!!\#i[PuZ#,0=@O1Z,%%2e^U170PDu3WRfhQ!s=YZ!(7IQUn3ntS-@Cu&&UnkPh +<;p[)/GPRCoQWe6`1mcjjKFb]A%$WS-o,OMUese7O$t&*DZf(:Db5Ak[rf=Q$u+.U)LQ&,q74 +!RUf?LE^35kG.u'c;pEg-s3Bb='c9$;nK6;s%k0ieb<:_S_FaY21P29`-mF]A[23LD?ON7.Ti +Sc5<8qdDo-hNj5/FB3di3TM\QNCHV+eNeQ?!Ga:qdVgO@Ap2@BkdMGV_36/pYg#0+`C1>5jm +`1Yq5p&^E:(L:_W&&Eb-l78WrUFb!LdF3kE00k%Zh\J;E\NKrX<`.++[m+fbF1Y&9P6fQ"0" +.db0aVW"+2IK>I"#mF1t2>87023Nj+=ekk9/WsUuK`ADYZ\h3Q#Spl3NJ"lhJHK^UQ'._Y^mBj$AtQ6XB,80JkY^:sSs=)RrVSQ7R-iD>Y+1bZnl`:Wq-FCaH=ea>/Y78W)+Edsck`tQW=F@=`,rE^ +T8po[pGI$E([SLc\pCf9HjPaU8UG?#GX.sS.cOHMA_f4O"W<8+c[eG_A%cFsq22$^kgNL43D +`(]AW%>a$bfrFBDWemiZ;hS[XcD^Ied`eR`B=]A8MmfD19"omec5n-4^47SMm(HUGjWm%E@))'Ys34 +QX.KeWXS'H>kiKDSVuq\,H2Zf[1dqeiBbM'3E0R;NDElX0=;WGGV741=cLG.P<@)K1.-'s&_ +2I2#eVgf8P=d#r^;a,-$DV;.8g0LeTr$A>qjuCI=>'BTVa)FSdQUS@c5RD\1WMYHtfEo0&' +G59Z\6Y['XU)U`ms)@WdFqtL&:Q@lbPa"t%bO9;A$OjcL">p?:>EZ@^0q[@@'3-A61,5-J"Q +Qg%rpC\7KF(3HiRNX)%:e#3OgVE@H8qQ;%@]A:gc3pr3^m.!Nl%erM1SA+5]A']AE!-)8K*h/Z?8@l)Kua@8nnlsIJn5Ygop7E"L70"0M;h7.- ++f@YDf9oQ%X.1s%t,E0F&fi1Mi5kh6F;ut+dS8L"/kiD)Po.$$S;UXjCRppn1:<#90XWOPD< +AXd8#:CLTW]A8Q$,gFh*OFpW(/b>f<mL3`bog^/2S( +ED$\?`+tIiUR.11-NEVr7g-Uq%,['^iqE'"00sW?oZ(XMA,DJcJe&G*&N;Y-#*'5/HkT)r:s +s_BUk2!$W#e--W5A+K0_0'Y/_-:A\m3cl8=ZJdneB:71/D(Jm^ncp(/ist_RcO-ip7\hpKqk +l3tA0mN?<"g$K(M1La]A$_C;:922^Z`dnk9h_6oW/8?Z9\.8/M6u(Y#3nLjH>5nhQ-Al9TJQC&-cQ(kQ*-ij[Ac+IM;bcGFb +#lhG0Dri*57SV,bb_hMd/5DW8![QE$k%:S5N"D0]AD7K(`B-iC4c=HART\mHpN,"!Xd5m3,53 +G#O#8If5VG-,RlB$#3[[%sRjq_*MK8"^3cdOi.t=^!VWO4"IA@%MI#/-pXXa]A8pa:$bZSlhf +dj8'g;bo%Fqn@M@%d,SY]AeR?;g6*3gdbM44V5'gGC1aor<@GMD;qY*urp,WVo>]ALF%jcH#S8+c`jAE9hC]A":rT<.nBm$b=]Ait +RiHh\U-GR$_K?V?`i)bBc=bg3R@M3`5u(a2+"]AkB^mDmho*1)RH?P($)Fm\#Bfg=1a&]A/^(c +?dR'cLjo]AqIOMBH!8`YoB?G3X:5MdTRR$\_G,B[9;JcdI"$D)`8IJ->H85I^I!7njk\*iG:K +FANkKY?gt*H0`,jqo-Z]A^c.8M*ME,+jg@.5*M%SP!\T>B.MT-\e+rYAm/AA1m+%d>mgcSP(@ +stU^Y`cK]ASiGZ@p;H?s&hNcYYY:%,4W7UfUYqPNEkXROjt=IMIh?"-=5 +Kafk[P]AfO/AEb2(71_ +4BudifKEaiKcFO^D$PdmYm:'+LL?U_jG?mGeIkg)n_sY*f>*k]A]AWV:u(`6k`#4NLp0&If!DD +ABQpq)9W>GjeQaaepXmN-K4'9Edq]A277RhV"_A$H"li^k"iU4:7W2cEu? +n`(C*(`.]A:KhM<%F%G`<'20V^8`GLg_ui@DOn#:'drDK;Gje("2MW9NM3T:c-abj7-,Q`5dk +s[BddPLo]AFejCd%Z#U(`cf%CV1[NJS+c?oZJDU8HnEe``F1 +'lAqiJl;WQ<63ao^n#MM`p_mC'/#hF1U7eX(d%<2Co4cf+A/;CH"r(oS,5SYO+21jE`fO-d6 +o[NgQs!H?7dCJA3q0ldQ\?5)R2siMaip"Cd(e?j<"O-ddU6\a"l6RcW$2j0#Sr[W!5RSZ2]AH +9=jPjLitVq0m^a@u='-<.l2+$M[!$.Q[b"RE2pit@E\]AC6R2Hn6]ApeN=:LED9@RDbc?W(2r[ +AM?]Ar>9A'1::!&WL"WRI-sf2-:+$Ne0HlhC7?:R@Y=Yn_+X=el"3mmMo'&@HQV!00Wc2K+,e +MAg9.g?Ti/7#TQIT1_ParPVZ/N\N0c3eb[OGSk"JK[.bi7%r;P`ceElHm)T[0aM7Y0bbNc,p +ea+;?+[ls-LKj2[ZL\K[OD#Y[*t:7$"rMkpRmWZSR/QGPZ, +)p>DX;TVJRfpX\DZ_Fb:,<^e0?I\F5e0VAeRWsgOCL@eEE9<;f'($!T;FnMb?`;/-0h.kHqT +QF8>2VLsAt&S3EoVVWI$nDGIZ?VLlM$?c-JF`GKdEE\]AOTNXRb?Q@:uIrhtnR^J +tq6S^.*oV*%j=kl/NHcHP'**O#.)YP:99Z0E(BaUCMP&f]A,W_K3UJ^1QijrS@S-^ +^Kr(2(,ZV9"PVRd@7GqBnrHJSMs4o3\>6XD:2SgX:g20\EihIk+`6lM&@2&$N0SpX;P]A]AW'< +?)ib/HDj,X,!#K5BlU$-2Rggck)?+'`e%nZqNSZD/"UI$YQ8+Nh)0s'C8!S7,L9B[d\jjgC6 +0fOdJq'Ug_\B&isQ%ikrP0haG[m"2tk3P*]A[%7;2"705eU;F^2,VC8<:06l`kGeBLG'uNgb@ +7kg.'%GNW']AFl7"EI.nj^X"O9H7`KGm;)P\[ABoE%8oerbk!tj]A52 +48G7R6s**&KMN$X13']AqaY:a>Nn7s%>L%f=EIV[+)hTZLdS"[sW4HWVPSJ($=b"59KVOBi\U +/eG]A0%e=8Rl&H4>jD]A7OZ[O/8t3n[h%U*L'aIMp3jK]A9-P??%$E]AS9f!CJ!]A97A!Y +Ud@VtP^U'rTo=FthKm0Fot:>KDtWKX!pVVV(s2$8b*\ogW;noMuh/'JmI6O3VM/2HtR86+DI +F'96Lk"ia.E%VJqNlAD9?FQJ^oXk/Pb%"21gWpo5M<(O5lVSi"QGGRp9o*PBIdC%o1`nK/<_ +.o4!=rT(]AY?c@M`_iq5rBnk.NB,Qu6kfa:A;;=oPD(2S5TF'UforKMDWLb\d]A,#@2+rDiPi8 +b;A>-:d%Old2pc/Pub2tkOY4Z%mm$VH;EFf*dbs>JAN4Skl>kBDI%YcXoN,D&nRe'Q+BLatE +l8COYL07gC>1tlrR+CKOBI#jgT,W,drYM6Fl#:9piLYm?^R?``q85Mj8mC^4S&>-SZepXN;% +Ep(?'"g`Wa8^T.4O'cj/>_Qdsm(sYL>OFao'q^/Fn@:?!_C0NfT-ZMY&tkZGL4[BYt;Jn*_2 +7)^3DWIJF'8"'DC>\>8Nk)\jmZV77Wl5Rs+VB!kY@'L?kY!^-DfenTuRg<:RsKb\sh1<#n.N +ZK52:S,52\AN3/K:++*YK6q-'YQSt>]A=_(>*_/N23"hD(s-8g%ZZggp+uO'+*5[>;0%lELHo +rMUA*9<;=VYDN>Of"?VY/k7hd9KlKo/`0LC@$i!e[OB&DrB[FOpf1nackg=/>i8MN5K<"[q( +&-@k&qO_cKaDS61EbX!tAY,T2FM?o+.Seu^mLaVgNPHk[(]AT0t_M(=!,mRNs]A_-4jA>6`B2k +%_Ob=ku!O8fJG+0`nJGb0Nc7_"bIMuUr"-dU2K]A^VCtlfFQOTZX!>Jn5[X5Ge4-QC^3P`61T +k0c40f=^r;JG6^AYNh8(Ap"S\&jA3hFarOl,<36@'ML#Y*fICRD#Q-S(f7!/t2IZ=VjfDPD% +=(BG7>Kp7X:&ZW,TVBdDU:L"klU1O.q0X/L.=Y%8B]A/iM5)/cObQZtq.FLT4NAVbF+APC?LO +2-d.fe?CLu&/OIIuZq,:RB:h?-Q^05Rh:%+ +K7cN"=(U>$]ALJ+1oB2+lp">?8h12DW1_.;(Bj-s\Ii/1LUrqsA:3-7@.+,YcYN.*?4WFdqrs +1Bm/PhI)RQ#,V?AM-5h>-9ilf\SdLlU#o=r\mXBc&XW"KqhjPsbj\u5G38]Ar8AHFO#E>DSU&Mu'WRkO/^h=V"\Fbn/aR9tr*s29LMSc-+p#8dEFDT0^F5fUO#&$h6 +XVs=0&T'?lGPK`)*:d_7meNlVE91O!IWMhJR]A&?ifU%e?DbZigcn(>R]A*4:beECb(@$195Ac +D.>p?aOt?A,bJR5NqS1]A#4Ba45pIX[4TJF&*-ms8LhmMUA\fI=$4l'oW`=Jdiior`i,qTq'! +g?i'B^IlUmgFRmBoZfsDsYeE6J5H?2@3"l]A_!/#-e%Rnc3nS`8]A'okVg-,V&Y0n>/!AHYSd8 +8JQ2OFo[-&b4Wa!U01]A,$\G65`Yk3Et&Pg\G.gPHZ0a`#:8K/>5UBZVLu.[_kqLSn,LEu:** +4C1dAC:F@N8Jd_JLH;=>08K?1dNA?"cn#M]A:,=jXGJjougk"^Dr_YGY2WZVO%oRTqU!3LsaO +=g\$qJ10(F=rh@M2Cc/D[cYa;DT\S0@r/gu'C8`uZp,nAroYlbnNAPA1[U1<7*5YJaHH2Hk]A>-nEC;uUgN(B._/'01lhL'#"lJ.&oUQM&cgf7lbH:u_(Jbefg +Y!I?CU!ICY^?b^nCl!VNVZIhU#Ku'2X>-H6o:DN[QUl=![C/UL8eHPQK4B]AWA/Ep@5]Aun8mE +HZLXq%s:-fhG?KAou.%r:[2:JU;-hQIF7/&b=.iJ0FDh)*crb%kL[\"47a7dr!<>oFgG9HO5 +6r$$,iG5MY-ZHjUh\5M[6-:b2Er\ciYVLHjIM/jI'tq;V\5Wf*f9-'d"-5"VX1HUp\`:K/5_ +/#tTHG+'Rc(gF..8'6'k;UTD(lb6=6rP0*9eB5Wlm5c]A6(GK3bKoJe@270hi*%n(e!/"Y"fF +0fiC.,b>!)FN\:nu)7%]AjAtVZooU43.K9B#oUo^u"=_23WA5;9E1b1q1an&kW2CLKEDGU^[_ +B2W5`m;Hr1eYNjY@9coO3MEc/bC&73A1RhBO#P%j%;=D]Ai:1)(_,tX,f[<9U-NK>gP$:bJIR +^*HgNNGkj)+PEe'N0P-XNMsdprWLiN/1K_+o[:u.oL7nG-\T-%=m;lq>'h8Y^ES(6&)G?Wd7 +4D=CutTYr.h1Hld8iaK/_Cr@1TmGlGN.'cGa<.ML"\f8=(\`6rOg2nTtpc/ok&E3]A]A=`Ga?^UIFnR^T-(@_`!VR +*+'KXb]ADR!,7=;7DifdlXf6%(g"ZFE^kV+E]A*@8;C)jfShOh67jl&<;U7A6T3TjgI-m7@Fm/@4Dc3^I9(kAIe;4:riUk0JPQ;5!.49u-Lh^< +_cP882X,L\CCBmE.K4"'b\^KQUM%9XHR^j,rD.A?f4NFtekd]AKXgVjCj&Mho;)uaP:h]Ar[B$ +i>N?91e#RoS<869*QH0RhJ$eRmV&K1RHc,l38f3eS$E9=.cfL22e`c+Kl[%sOo\cl;t.]A= +sDWm[dO]A+P_n;+M$j,FU]AL*pH07A0&;k\5m?8#Cfb\^Hs+blJo]AE,rd\ +7D7YB_h^^3Q=b9d\N)mj6lLTCG>Y2F8:G`#b`.?$>9!H(/-&]AfK$>u3>IOh +tOGs'7:Q/'c"jQ0M\lkI[8`JI-GW*&Mb6>!bOWDp;BfI>ErO4*]AYZYXiI`['M:MFE;OWV$Nc +:'S^E$g'57u4$>_Is+SBiCmR5'A2u+"lF+Q +b%)\'S]AP3H=Qq\'.Wt3o`(:+N!O6:8-SPTbXb='[D7KQFEG/o\5.+T`Vm$XjJ/%E5nF\Z`[g +4a]AOajQ#3,dOQu!MTk5+rnnCi]Aj:t3afBEU1X>eX6>EXlT.5[E-=hM#ZCQdsW6D.@(*GbagX +gk2#_R;p^fgMO]AKg)pll:s]A+aS_nU^8:"er>;:Y.nrVj__=?b?l]Ab?jnCf==-DRm+bpCIdI; +.c;U;B6F-Z*sqJC:t!JNm5bmhp[Ak%\XGik6.U"63Dq3s@`X\dtQ!nq7<5ViB.N*jt'*NlGA +VhgBAr'c\3f!-lZ[a0+r4$N$[^o5O5H?)o6bTIs"A!eOV(!:OL#X^,Mk)sLLtSq'9)iZ^BGk +ZVZW^OMS?dtkEsRK3p!fS+I&L!BCnFN.4@Bj`<6inX@%5\s>&=N8KMCS+jgU&,TDRJ[CZ>]A_S"<7!(JC +b!<)Cc?2&ih-sl+Gn`0(lam +aq"@Nq"1dSAU_d96!j>?ic:8c'XqM=p>0B*NGukM93Rq=,V@,>6n]ATqq1,:U#du-HMmVGFn$ +6\.gI]A`^W8\1h4haEkRsX<$p5r+EQ"t4Mtc9AT`10jtghc]A#Q'Xd[7-q +rC*)[?[%jQKc-/%)f5@\QkijD)Qk[mAlX"Ica3U9?$Me`j;@mg-1repGC'T`Wu$jnY`B<'h& +n\:[6#id%,*B67\`o*]A*#IcP2#Qkk\-AJ/ji;'A7M\[]A5D,Tr'_14SGXEH=U8&PrOI=ZD!,S +FW=e[mVId>5-e(sUBilUW +qps]A%6SjKD;=`Yp5[_TfCMr8KZK>rP3:TX6(&q[6)7/:D^m(U4,Y*"CfokZRK_rG!g\`?->Ht:hj!K+EeE8Qu%06li_ZO5:7B?FWg7kSJ +X9CG7n_=PBjl92j6.J-VeY`%U,a2DM/o6TIj26N%"gUq!aTV1hQ5qal*Wo:5,X+E+"0;I9MB +eRS8L1KnBUOXZ-5;qI`FYU$`q+FKpe]A)rD8$hd-"[:@jr,^rJX6mW71;C"O&qGC,e9(u +@p$IH(%L)_9:3)`K7;A$2clt3n0KcVZl%G.CZ0)t\&BD8nWC6er/Ct,:>$RVX``_b=8+!5Mm +;dEI+=,n*=Hn%82_-bAH!GN^c=Dtg5D7:X8JDm$e_==R#'m,?V#1di^C^Q;<>>gGbjTi7SN> +"5`CO+s,3H@H1.C@@O$!rhY@GPJ6Y&hsTB:?'1a2knc_bh#[SbGrnhlu2C25NtFLmkpg`bi";BN+J8*JIZF,XmPT(5mXBF +e@o1$TC@ge718&;5LTume@*DiCjq(3"GN,CmB=:,4ES1t>4lnVLE";)!cfF,L.a5cI&!h87L +Dh\O5_oM,)@=[a3tAe3(n!@gP(IO$jJ0QS75_4Li6)THN-Tc)Ih:JAp@=%N=#rPcJ)O* +N29#.'mMR7Z,`tqL#*maq.h)=sm69K=>dZW;rk(ITUI"1L%m8QqC2si#OZ:?hf5q]A-cG.&T$ +B8MX`@OFd]AF6'Qa%7[WlY^oHKFB]A:ckZq/VleP)*U!)9A^]AEaW$GU$L1;+?Opqs3=YWEjBJ- +EUf&pZYl1CeXC9]A)6P]A<`D/LurGq3)GQJp7,*d&DW\K;TP`d6'"Td?uLfn/--FVV[2,ateWK-:\pRK#i8Q_Z0lZB6fEZFN_P#"[.@n!!]A+X'W%Y_B%j_$3A1Q]AKHT'n.hWb3?VERfVjO7b<.$@Ef5KQ0C[B/78?U)ja"l`u%1;nT +"=SIpB(-;ZiBs:9@L=q3pSd_6)>4tH,ugcrR?"4c=J*nSnT(ZsE&BT/LAW)8"I=]Ar=erVAi3 +$%t,`pidHL+*?Fe@/g3?&h@2F^93O]A@LU't>AGrXV_4h'8%W2D(dm.`bLM5cthImF+8]AP\Kh +fbMQ\$Wd>!AZ=7_Yeiad^!GCWp[CWC_OngE7N[-d5n`0//24E#OaH\-V +o\9o./sM$'cY\T_OaS.sH&rO,G:$b6:!is(i1;_k,mrsqn4*>[3"IBA+:#Y9/1G=YAN8U#g& +!7K\r;?B``2i&lQ6ha)kBTR+oP4#LI?GGt#o1u"%gb\]AmZh@T"m(LDIQ&Ntpe\AR(*#J_Lbg +BARLqc"Jk%^*t[mhe!7eI8*EgNK<&a2V&hasPSqBc2kNM$F3YsMmU +/Yp*.dCmh\Y@AuVW;FoZGG(X#+\IiGaMLd@4V!1:-t=%`/@Vc=M"9m@KI[34&Wj7J`ZKPEK\ +<>9bENUX,4#f3Z)iq]Ao:^7+DR!="l3L +`id:'=Su>UKLml>5i,"laUpn;+tU6lQ&a+gkLFV\),ZdJ!8*pkmo*c-PdT'X6#(kQ_1tD.@( +.)1O`3SQg,%FJTA5J_hFk\jtD=s5Q8!(>:.dbiZLje/5Q$Zr(rLknGW3V?]AX%"kqh*.7!*Iufs6#2:&0&End` +NCG&3#$o4\<)A%5<*ZRi,"cOcY@o;onNUmB8EBiGm]A*0G"r0DQmm\,3Dn*YQTlX+531f`:`4 +`.II^UDHa3n\<4h#I0EV,'*YK-j:mc':5Z6gZRa)YLT_B#TD'VB)`gE&d/HIq'@K5^8'Hmju +tTBTE0fOb-IXkdUdf+3K>="& +1(!?CufpQ*#E[[XJ.2+%pucFEA7I^"^PCiWgFX4;hsobdt?^"XN!NtK2=SVG.dJosDLP&\?o +;!:-jX`#Ja@7Gd-'`A$]AX^:1Ro]A6(XDKhEg7oBHe#Q!i,^AY[afrI`EMaillPiIBr$9A_I]AF +A?1:=P9Xr6>]A/iQfsHo^*2Gqe8O-S,eb!i\Wp[ijJW8[M<3?mY[e7>BX#$_lA2Iau;5RLt-]A +)N!R93VptS\r\cN\LT>Yb=a>i*@`OrF@;#@>Qks==8b^B2o'[PIIoirhaN>%(,sDf3]A7MdRM +R=W84bj\o\UseuJ1+Z2b-QTlO#7$D&PLOB0+nb;Mu'l;k`)b;oEMI/kG0f'8+HKM8aEWj=,c +eG2h?:`-)\.N"<;(^J;54iGBX;Q'9s5`oCdlc\,*.K^oLj#D?FNeJNJ=?16@[abV_46o]Ai?]A +GR^jU)=_8q,!cOdV8.r:N?4iJ:BN`/X-#:Uar5>P'M^0aaS0^p`blU,^-52#Fr(J^Z]AH<'Lih +M6rL:#AD"i[>b,;0=TR1"#r8:!KZdS2<\o\?D\=GQ,&d\:3bhahD@Rtd+)$!9&So8uG7rP*l7nWd6$&.f7>^P4YsoEZlCiS2IJ:?.9g31Om4SrSmi.b(J-\CN3B +K=(bVV#E2,8^ +%td0kRA%!3S9.1q??5.Gr5e,]A$iH7VA]A6J%,k1roK4GmOt(/HVG79_dYc*EGl/Tc)-;XZN$Q +A5[jR1arE4p-u<(>@uiJKf4,i-7quHB%7.Qj.,]A9nqnaqCQ?NU^b[qE6lkWTD;!1If_9/qal +I?j1/9YsSbADrl=[e?`pWK[>)J4BaRJ.t'9Bd_K?RgarIHs/bS=_1@ZfM^*Zet^!)1Y.:JO]A +d;B%t^k/$sjq>+-(CMW6TUW<5$0R5EHluoSp;;^#NZ2@YuaT=E"Kg=MXP6]AL*`EDfcO=K%?Y-bG)H`Lr$3ntJu"H6*9Q\V3UF +LYJsi!CH;+;jO2PQ+@+AZ,=;F8o8=flRreptb&T"FSh2KmX@l@`(g\MDM`$UOjnsl8o_*D3G +#4U"M-I=8'Gn4:MRd\]A&8*Igg`r]Aecqa+&taKY(fVl$?fNXB_F(_#DZLN>SYio5F#p,mN1>W +sdf.A[^b]AW#cHmqE9o!.0ZaILVAC%RNs_e_'@_j(*F`Lg]Afr6K=oD2=LuPd/%.8nrABE@%!M +U+hP$-.aK9DfbR^-#(_B$:]A7q"9-4]A6/1mLZ?\.;PHN-Emd9$3o+M+m7Z`jkN?J[!3@n!cXN]AGZYo-]ABm6te;%;SA8BHl*>fq8Q#cI^O4SXJeS!: +NEK6nhhnCS/RPGVu(/?WCfo-,e*Cs%Kep3'ZMR&ZP"tEcU^sa:s/ArR?72Uht4P^j8tL+(B& +7R3V"CrOZse1fJR]As*!1HVF'pW-Lkp`>qA),:*&L%9je;so;AX@i;'r;-OG*f+0[Ko5/5qh[ +8+o,@@3g:"!b:cfE"^nS/rd?c[C6g19+W)G^5Ps`M5Y9C2LWlFl;7j1\;:S;,FJ*dTQtm'9a +a'RTbNR.R/UB6S*`8mX+$,cK-.J6_a7OPAol&WWmu5067!&p7DeUW!2>ajm#W^'kX5\-u]A3%U1%';(,:bPR3Sf?;4eu!e(Q1Y +U4I$5A'!K)=TktVYjW!)TU;72=Qnn*6X*C_?&06]Ask#$Tct_p?fIqW>H'(ScW.:mU%X`;$i3 +hPIZ%j3@<#+CGg8R;1;%N&i)t,#E3ee]AojTCZh"l]A>tVd8h0]AC?t%[dI4XL1*f`FCd\stKrZ +uXl*eOM&/DV%5>C&:M!@6LQN%jmWa,Zos2FV^b&aZb[2U:$im@U=U%VCps@QQ*"NJR'qcST7 +K.?jH!pF!K)**Mk +_b]A"!)5&N>Zlo*?>*JA-(CG[$VpVrq4)epeLaK'>,\/?b'tc`qt_5o/ps*%FpC^\cRD&rqNR +:-NV]A,TTf$5*aU*B@:1T/l^TnOol9qu`b"C6,b1;Mid9Z&A%&l-AA<-1(O1#@hTSQHW:/7qY +I(\%-Pg(+\G0Ulo8r.>l@c%d&f;?d^m+KXO1)KW:(J0h$VQ"$5g)h:-]A'=Q!L/D;6,oR."P< +e8\U0l\Ee(.pGjPKNC+U1W;!m'@/T&L)2 +8'Fs?hnBJ%&F"^-o=V'$kV'P5NdkpXDFP0K$*$FC!8Cr(X#;@I"K_\0#nK5sGp(FuLX6]ATRK +fQml@DZ'#H/2YH2l5&S(3C4V")EuJ2RT/X!<7kM3DF]AIlEFMq\5+la7#uQle,cW@^lcXpFZS +A]AIZ@Ml*]A.e%b\;-nch1pqM4kXDt*+TBdE"561$$9D.(*LB-A`5S`ld>`W4i6?OPUk9!@@73 +<\ckbeZ$.hI1W_GpRfgBna9I6+UB>g%U&'15/?1;n/JNNhc9=.UD<4TlZ#r+(3WSMl%lZr?[ +(:DVH^:4:hJ^L4`[3&\#F*h17RgQD4pmNUdV&j,8=%n9G?Q.52u26iN2(d\B7B\h*?P=rm*4[Z?^`gdU-j/cdT#=?&p +#N7h1tGN\$^lHb=QjUX!>g7>HXPOG'6<4Yd(OD'jj1Vn?'DHPMB.b7,#ggXkpa*_C>h-C*Lk +s8N4W"Am`ElKsjr7,nFi(n4J[bZiY8U=&N8a3*XaXEs6n3S5nob2tlk7l`E!XWR&]A*gMq`;# +;<":=S&3;BTl^$%Fs)Ve&9h^d;%:0-Dde>VFCuurVUqoKl9D_O]AofL+7?:=m6#m=fk>6Pi5@ +5L_$o#K1XTDC4.qW,$ +n%=4`bZ^,?+`3qo\M[cclV)0(,ZiFKM^`+ish**tfD09jngipN$l24r5))Wb_)oFV54)(=qPB^sm:^Ke2+DO6D!=1&5[M1V%p^Hk:/D-i^is,4e#4q[9"iY94gg3(gqncP +fQ%p8sgo@acoZ[DpGH,`T@KS*tVU5NdE>:s:`>^'1kY`@+*6%,aiBr/97TZd:(gEGeMO;2J^ ++bIt@h3"&:U`j;2_R=F+)PBV_NT=($1b8N$"mB>\:6)=&ic"!6G:6J@;^lXhal0jaS3S-VLj3$IG^0&fSQG`53r +c7'#psM48Zt4@jVC>47Q8<*V[&23"S.^R`$a/._F=UM=cW7.Rc/sHJ`irof0p2!!5i8XB%BP +:(nVPlmRZE"X#1H.q(2W>nC*=Wm$\D1[Ye8Mq)gVrW!:hMW?qA2cdq[LPt$L`7HI=m@WpS^W +J&O.$S21*7TX2Qor$.WAt)#lD8!gudt$(9:W"U*SaMmaSM#%Uh8kusCoYH.Gg@No<B50AWbot:&JrpT'm7[YM>cja51IHKHgC0/69fIMP]A5Lplma5sVATW3gXT/rD)JMXb!a$_n,2-R???- +#g=,eF*8g[t%2Sud^Vmf+".$=HVN1l+euVXWQ3hRDj/7k,80)+#CpR[%\1HM.Uo%I80i]Aa-2SL)QGN?bZ4RplbS[Y,Ug\kAm'l"JgN+N5Y3m70c`_J +$guFnb]A-aWjl5k0.j +Ien?SJA),%/d3MiVi6)iD+A[=:$uO'>m>a%=i>E]A_m1kV2lQPiV+4=eu\JlhZ6$HQ7cAf:gp"Y!'J +"ZPZblKe7cE34?DY<@;_3Q+iJq\6/5q!3_tm7P0^%SOV%%C!KKppj?@&2rk>7sd+g:0`$>'J +\gM?&$e;"O_[j;RjZU8DLVj*sHPYCi!p.`<39'g@F*fIX"jO\\mTd=`j8i6jGQ`"QQ89l;Z4 +WT.9aXRprVCSJ_5BBtqq,Sfhk/Pt%7j*!W#0WnQ/_\mR8NJUV.Z.''=-4a9K-!3G54;*ooaP +$q55`&,b#!NRgn\?UtN5@S:otpat8.> +7qc8Q;ZX(=q;)oNDsV[HoWUF[p;7V)Ak]A&-@oJ^$4L2Vr;7bq6N2iL0:1q6-m#n>r9*=dKpeGi$9d*"j8lS=Q +q>6+DK7ENCD;B,'n:u9q(1,di#h7eW3E0_X%"/1O'T*.(ZU(f858)gpl@n3*,]A^0!UqK`crj +-'dFdk;`1Nq6;U$U&6VR@g-ZXf0KEiPqho-aXK;bUB#c5@I&fPKid4-6,RN*K;MO9-Q%u&R& +#%71IL_g9Z3&fWlJ[>ujgD?A%6NmKJ@4?em;jcUSo5m`lf:j!Fnc`WH93jd/odHf2b,kNeW[K5dBmW +oQs*eELPc4ml0":e@`K^?FlpH:Af^uJ>^=Qg?%=oHA?Pak)K]A:teJb)D6Te8G^@\(5Lb5%KU +KoWqa3NWegR>R5RT0@c`'uTWojo'+"P4rDiP=g_G]A=!UnrUo#J?J-$ +46N&e/IH=YWH(XQs,W+?%g%.5#C>DI:L26=8@o`DHp4VoF9W!Z&mn,o%/(E[:DkKkAm5&6V[ +7A_RNF\%d;M8M9o$jtq_b8F>d15'4(UnHUp9Q)XV*RQ$dj]AaI-B]A$p[8Wc?cOknV=FY#9cY;Op39L28sg9M47HFL/g3J:]A`B^J13Pc. +7f7QqnU2j@mCU-S_\,X+rY=4T1RL +kjG:8.cS3$mb52+tLF;:\FF+o3[BtG5Dq'KCXfWVH4oHk$Y_3F.CtaC8q.'aC#+?:4N('FI# +Xb+r-::LH846go8%O;$Ikmg2DTZTeHF@#Ghk>N,X6W3G%o86--N:FED[Uum +1+B!P3!WUJTND^M/Pk@5@!]Al\,r)ekb0RUY)B%DTCU744O.>6Bi"_hqMT_C0=c.Z>8UqS;#A +^I@d[01t3^*#osZOK)2#%&WXKS/`o-;_U9tRn-^sG+teqioZ)0"W.@fAsd=-iSpWET[1gR6a +]APpPnDe,FW1u"DSjpH;r.d>A_*nWRZ6`+4ec/9mPYP4n`brm8qm(HL!h?!BCDc'TLP*lJ +Y#rC7;ulWR3]A,l%*ag)Ul>2aMnrT3B>,T++=-CO20+GWECZWV(X2r[pArho(8CZ'6>#a +HFeVNp;/D(O(!$`imMW*KaeYaW"1k-g&'rVel$]AcR5j8CJ#Y/k(:OP/A.YVMus.;]A"c/u +WUf:8:&XdC>@VP[=kfXad3(%GAO9!Bn$(D;0o-FCE-hjuIT6)F5Lc-\:\t7T4::Y`T893K@p)(mRh#L-\kG +#CpSL!5UmlSVF$2WK,j\%aY[dNr=;!,^?cuB![7lOq]Aj3p6p,hlKB77=r%>#P +-!0D6;o3BT;_9.!=jsXE2$Un-8$lP@,)ktS-LLVQD7[C$IU8"BKH)oM6Waqqq9f\c#nqTfrd +H;(mBXSPXH8h\]A$H7Iu0b5GA9bcj(Ac=W2Olt.bQ+,2o9juc/SI88NIoAoP`]AGH2iD,$ +.X`S +q"th8^>Q&/#s^Oee;K3sKn3'tGSVX'p[fd-WG>!)2qs#qo^qc&H2^GD\9r/Ao^fNFFT*ricq +e8S/\T'Z_JlGtU2U,#`?,rXVq:J@50#V[-*UMJq>!KJZtX?'14OH;WffWdK8dJ@b3NUR7S=, +I$UdT76*N^Ef+K!GN]Ah3?r'R8B?NTMGig=MgkdnsR>TC&*q*dftRb01T4ZY\-'3.Q:4rkBa/ +LFXCK,CMaVtWX;hTL@1jQg[Wo;AQ.9^1UG(',d>QbQ$O*ucRS-?A)l@%?MYm#g@H@9X[Co:pMZ5s8$EA/k/s#ucXPm+e& +jt<]Aqd_AI]Ai0QAKP+n`gl++G5f+7!:l"Hc$Du`pRC99/Wcs.uUOKgs:lUEC"$p7:$]AuP$1k` +[]A7$GAlG!dbW-O^)W3M0VI&q=r6TXV@''=)c#k[WNAJk;2Z9?E>hQpN1Ta=Iu^E5DtQ07=@b +1:f&0HF=Z^lP2Hq'7b6gine["C41t_"CVK1>nMSsMhuSk,RWV>mNaAt<-sMP3)G9SlPb[Z6% +"D[GUgW*tch'LMR7[[sN'-S2F,-jB?2.)JbI)eba1TDM_2S]A:mH&6l&hW!X'VCZ35WpE5ZRa +Z"00Og^eo*7BO.6J:2'8&VLf.`akdskG1G\F(\k%WRF&74.WX*`4.HRUGUu#`GcW`2UIA>d_ +;.okWBH)#.F0kfY)HObj=VLhFA^9o,rSG.V>SI+QDC(E?m[Is91If9Y#Bq&Hr"Y%jZR,a;SXk!S\#8^^7"oW)YM.FAG +.iO)i0DH2:XW86BV\L`c?3G'PC>&L\IbNLh%:H]A;Zjkb&gj0[l$5bqMk!MJLhJJWBmbpUb\. +t$_ZKQJ<1b(;[g!lH7`PTE(m1&)iTaG^`d-"<_O3(d6<"'&BgNr`Xd7D15I,OmU<"0UkdIn( +S.CLXsC-K/:qq9lsXnD!7KOVo?-!p1GB>o27PHm'BY-'C[1,:<^MPm@"=gAbG*o?.9-JXl8` +(agt;.$dn1L-B.-uqa4@4gS6kj3+pmJoQKleobI::TOkiV?)]AeUq(u;M8[%MEO\>`W"Ufr[7 +Z'+$99>#\[pdqp'ZtR%YsMq*Wq$I!D;9,G@GKdsEWWbJ)&UU^jk`*OIe0id9Ws_i#Sbk2>G? +aH(hTOd))@jE=fb@V2saR2#=Z0@=i\HsEF*j(\!hmP`BXL\<>T@@Zk3]A3:_q_g!Ed'JB7f:Q +^J`6k3faUVq_78t/7pLR0&0r^0[PPSb!61crPI?VV,X+D/J[/EW.>cgCD@A"n&j$lE-djer[`I'Fn0pd +t!PCV-C>OcZa[`Fq,0sMhn;^=4C"+n-KCkN"j$I7Jg@%F"6#BE.$Ac0$)+IUMrIcY?U[@EU&'^ng+s$#.B\$)U,"!0AS"-W.!@2WrD0C^go0!i7jL,+:kj^.OoJ[ZHijf*uX/ +7.CeUYhE4O@Z+ETu5,DPO/8U*:+g=338AZRt%Q,pY5psHXEqscPp>HlP)<]Ak)FaGI=Y&=<,' +RIn_ZW<#-# +?.O8/&3u@J'6>>=iAl$J`q`N&PD,hn:VSaXc]AE4g]AiVqeA^H-A6UER5c:ZFI'+n8uDD>HEWG +eg0=')?a(gif,1r^EXO.VZPF2fUPl*0AqW_]A#9=*1i$,d2mAl.ctp1E)4tWu6kpY+X3!UEg7 +n2GfO\G]A8Ze*IXh8Q-DcVOFBATM/WPpm[>(NC;O&d2fBUY7t+<'?JFNF')qBk5eh5MZ^^g?l +q,%6YG(0War[?9FM9(#khAKg&pp9I+(`IC]A1+1!22W9FCnECoirs,G/RBKeJWgJFb;I0lC$8%2h#/="fTQ0+X^PF0HrON/R0ADdV\LN%ccPOld1n0rUm!dq^.U(3C&2rZfjC0 +uIuDLm_3'qg;)Sd!hGo4'I?!;hQ/87%1d)DTD#*@]A\AM/Tm/X-M`5`VLGcB"t^0`8Ybfan2G +g11hSXdK14f>]Ad(StqXotp<$:e9_/D@)@_%7i%ucO3W%QEBQV ++BZ1c.&9i.DpT(3r-*S0Wa=HZGFJSGWd&iaW.WoW@CtJ?V)?%iu<3P\0(gMle^-&giW`Q4j=`6]AHC +M/fPrS:QSA35g83Legp(RO!>(C_CFgO"8k'cC(;mb.oKc]AmU^gp[>$>CMc,K%!hr/D_a%!QL +X:M/u.qr2m!rq,G'"=K?;,VpdG1iD`DE+uX68N4F.pVT:2"e11E?\EbIn?;#qFkW(WL;N_;F +l(#U:NRBe%^Tj8'.?5t8;OuFPG?\87mVUAl=P,+UG^2=c'l"2ek81knoT=c#Yp;Xr/o/\C:o +:29]APi3'==/o9"aH.PKQ,bM.6mQAG4$r]AM9Rg]AMoYjBK$+j2h"3T%7Z^(R%uO"QL"@qP[4`H +1B8>fMP_M>-L,]A$:H.ZJ<00Fo4FT6X[3I'XC^8]AYt5=@FVC,]A[U7ioaMge@Y`ginhNr%LC4[ +t\mB&'d_Ql0Er(;Z:rcPiqYL2$qkrq+0V4e*bH>if?&8=U]ArOKnGme->or7_Cr;1('0D(ZC<]As'9gSUM`+[S->U1j$!l+&[h +8E6=2\%7BgT=DZ3,Ur=QMT+,:.K['%k%Ku:rR3bJ5Vm=qD!^ +bpn]Ao?M>Y^He3plUMlZmJ"RKW/:MIt>V8_Mg8UZ,HPYpb%(Mr!']A\%fSj>^=Q[$*`"-(lrs? +j7kS#/:]Af?5Ona+%/L:'b$UqLm8YuDGO*k/2'mcBU&?muQ\-9*dQuIHh>M2n;/_]A_A2cICnoq=WS=cX'IV%W'@[\:XA*<%.^shB1R +F-q"LY>@@[\_^kaPp+deiToID!l]AqN_&3:F:dWQMH`t5[Fb"ZTdWR&l%;:<(]A7?1_rg50/bT +mgWZU##FUMD>r[9o0fX+7#kkWq8-fi+'QFXNZSmbp?BV&+pER-Y1>N;_p3MK76mJn+UL#4`% +iM`VetWN/SaYVYk9]Aae'G]A$t#OgJ!fRkT3Nm6oeD0* +Eu"=pjVc[IXV?#CcMk/KZ-c&t4'Nfmp7&@?mfo#NL([lD\gFtt9Rd:*PYk7R9GcVfK+gIn#k +eOf&7I0^&*Hl1)*$[^oHq31f'KLOe/"_'FT0_ +#Zs^XCefs)9es.9@D[G\&Jp+D`Ets*^d>ca6,/%,ELoYNs.5ED5$bIRF3)?r'M"Z?)4uqok@ +ucS\`GcF#fGJPHBNsWj8q9N4Vm5:+2ddes$>QFnb,<)(^)$DtHD_'mG6EnkMS@h#Sc\Zk7^1 +q-[L4p*SG.)4X,T*+8#Z:A/:4URY;%]A!K,R&'t:HTIp*>$1`4NDu`;3^4Fqk_rFMLE_enpG! +k\X;R0[BnjN'?>T:AdM"+AQYPs@b1;=:HP.kB7Fg#G9nhMlG-YU^qr*"/2^_CVOH60Dnq4o[G6DlO4 +dF6*&QtH=Q:+#-`l8$rp%9-#Idac +!;<<]A3o3]AFJ^(q=q,gj\!oh7t#:Afc@4tnru3&!&%J>'=t4l%FH\_:9ZRq5^]AM52TCB/Fnsq +:b4MmuCV9a7J+)XV;.hV5,Ht9g[%#@\&*'5IQR[rM:\8&4Yn1YNb(:.Ef$[0dkjBY!oWe28]AST +5JL9N%YHnUE@:*LS5^?l[m9]AAUN)c1SN-pj;bN&<(Ri +t$$"e5r)F\K0M-O52.+K&`BSL@<['G_EhEn:8oUWEdr)$RDT$k/XJ87nEdUSk"2W;4SA!!oc +g,(bDV2g;#!SS>-?KPWZ@<!J:o&>(IK62cGn)ph/1DmAh'(dVVH7?K*bG^'+ +X86'/0(2;-2IoLg-uSPZu'kqje7K\SBKQ7Qr]AZ4ktZ!Im>R2:?5R?n0J9fA[pAJsF[u4eYYH +?%!PsLUpZ3X!^f'PqH'AfAX&0S_']AN1\*f*aNM-m'QU1.%3-I*gJ!8u$]A,b1R3W[KN27T#@L +'+?SBgs?h7T0IgSDlm*/::e8S5CKG99eDoH`bhH(]A6+EkY.6GPSi1WOlPFSfs5#.$*0"u(fn +SobTSA8*p"K9=\dc1L]A9E=>hVodm&r5/s\,"DScX%lr^`_pCWVqdJTAO8`oS($35(.MZ)"#m +5^FB*R8#Q]AsiW8dWQ@XV'j%i$Q/="MOK7e?#iG8V%$Ki01D:;&.lY-:uC/+,6Z3m]A7If2Mc0 +eoAhnRcf]AnW%#oLHIWq:)Fd.h0C`'Cc2/"\GR:;@;jB?#(U=PR?'DHe_ChHg,L98\$ruEH4,'0#q.X^or$,O26ipZ.m%hEUAC-aRo#7!\EaTm!J\\s8KEB +IS=):#=H?*`JYOsj569g\Z:;3fHElo<;`n,4SH>ap/rMJe)TZdcSrYNU&Nkfb@="\+XURR2' +?]AQpspa]Am%$ImJ%bAYS@[q0g@R(l2)YH+gOA-\,=2`pHh=-c4.8As.]AH:"dohT-Mo\+/bN2i +/=?&or8Tr>pA2mC"!4\UCe)os$Y.L3B)D#O3UsR6k-@L.[17_BGA_!%6FQGQFogH+"K5'tZj +'k8m:o?)J$\g@hLZ#8C#^pgpC9RS]A/Ge5#VP[SeerJ.!D1e)TmjmWN'VhS5F/-\RcMZ\fJJk +-<^'8!7XZV@AN1r+(3o"2#D#3W&26jcu\C_RHn;R\)qULiAo%XK%[H$E3jqnYJpd(89bFJ]A1 +GIQ(6Q[T_+Nh+Y$d7`*]AE0M2f);'DoX6,/ts1h.7pEXH902m'Uhe4Sd,UB1^'q[Ao59o1ngM +X`QS62DU$t[baNr.i,Z=tt:F`bOY6`0Q\5bFN'%C8_Ya?i3F16)=:8fCBeme.O@&7SuD-\R( +6QgS%M'Jr_UfnoVV46eWT=:jfSpO\!.c"fFgo;L@&.10K:HoQYj_TK)7V&dg$-Y_ft@9m&1" +3DLa\lLo[NuJ2CW;A3340A.OqF_9Uf#PYHhkR;Vj(5QHH&24fol^0;0'DnA+ +kZ*gU-Y[khsl#LC3JF!H6:j3F.Kn)(n77_Ss1f!PQJ#J:%Q/i3ROh`)bb7U,urJpT-eQQt?m +*0&c)me`0FP$Uo0&5g$5E+FBrb_-*X,q$%?>$S8U)\YaO4KV8@bLXtAAF[\(?BIg%GZRR=77Hhr\0Q2>,]A>eZ3Va.W_Q/XY+&=j<2=V%)mR,^Y@$6P?B?qFF_G$ar9I9;o#DL* +$IS8&?5=:&rcaEV\a#L4$0]A]A]AYbnDj*-<=[;,LUYeLVr);oP$80DsIX_L[Se<%c"B4lcE/2/ +P-B)9qnT8Y[,iZ8Y.20p]AlsSYe%P(q5^M7*RH>!!uUl=I5q]Ab$e7jOk"X)cU?d?s/pn74.SC +7\jdLKhPq??mIG[LWS+u*E;A&l[([2n_:HSMio:E8ZKQi0AM)Q-2/Z)4f*U^?8%/GTT +dW8tn*t*ZBm0uL?i=&<;\J^>;q:C[a=GZrH?]ASu`e57N%nuU8;dpDI:hgf%(DD#`pBY!0``t +na5J>:GB;R3j#IN[M73@gFO%0u_KFZk13VnfkJdL)KbjnAt>o!.8aKp3dhF:8T$dt(!bqQls +TPGO\M1g@4e>]Aa";8gi8dHqF>"aB^k!Pn7&/.Yps^97-5_k"\cC;S/Tp_9U>DH2$7TiHAjHk +O`WS$`duSO=e0(aV+9]A^q$+P7(@_R`&bqe#LFDClK%$elqJ3LT'($Q9rI77dBTrc"ZO_gb_3 +P"q,Cf$K86ZAhOkA^ICm`pesud%$M1O&aY8/eQCNO0Vs=ff`Y8;@Q,pc#io1JIorO+EmYsr! +F"^3H[HDf^o#$9GK(i%4^h`Q+\"2 +B:)*?;`:2GJP!Ua2POg/QMIE;;S'Kg(QMKr(3kh>lm87k!\k`Rf"dT)0ApHX3UURBA"Vj6b+ +9?#TE'q=PW!R9ss:-YJ2(R-;=JnDG_=SJl%->$D*Cn3P\-/>l;nihgO9`Unje3#'joV>lMuhf!!&NR^5fhek]A+.oK;X7T1Qd[f[5_![,m.9Y3o +#eh[X_JnJk?>TBb<)-g@%&)'3*lFB7]Ao@o,$:a7X +92*RG#CRLLWuVo>^,`BWiJ/*b$kVM +X*8[(iRP22=KVX@!tVQJ'sE5KY*J#g2#(C'X^IhrrU,7Ve1d`YP@;S)f4r(m&@A%f2o +gq_l@QJW+=9\1k2Dq)\DP&t[L%!DU!_[0bK8>\nmL#oG[iR=EWb#e!AYjMCJ6^#F88eW/@=P +=-,D37an:$Ho7$l[t3crrB2c%XWi`Ht:Nn6mPEUdIqqNW)WkSecl&';/nSuei;3h<&,tDHK$9M. +>bCnDYmD@nqWb-]A)A_>e,,k7orbnUZoi&ZV%G(iO.j@284I4$Mc)cDf;8/JUruN"XN4/-P%j,j=rBi2ST:lIj5^ +_*Z"ZB)[5GH9;67?%!]ASU#C.ec-cok.e+5fPQ(2Lo$Z6X6aF=n40r\0u'd8P]AhajF\np#2d7!*I4mD$H` +WH?V\e+]A5'&ZKY3CT+md,m3&YA-_$I`cNc,"l4"0.+:60Pu=hB[AP;l>SQPb7]A`,I@CXV@Q& +hN"W?p19Af,U?&u$#kY7I:tE4VmS6F_4/*@DDP:5d,uh67johGqGm[f<9-KpnFX3I_AS=mgV +d+oc=hH3KUi9(]Aql@P<<>9\MG"F'ZK+Ff1&IY?pMM=ugW/rG'eL+'+bX"2c)=N*Y2crk4O^G/Ufe+F)Q1/ +4J\c6*A<(Mcg+.kMkdt_r+d,j#Zrj-%VeU%P$dl>H-]AYI03b$Z=k'M#%IEM+45^/4eE84*"i +m-T<:QSViRc<3%-h*>I+p`\An^Vm235"lL(-9q$S+TAD(;147H>IkRuXjO%n7O<"'?m2FT)E +&H\`82EF<.&TMQ8>(I#3<-Ne"@;q>2!?]A-a8*%52bg4V)f +gUS[bt([kOTknbI]A<]A"!_t@$G;9m=r'mGnA[SbTgsHQDi&LN_4f@TpI+*%?:h-h0`#G\:+/D#'$==3Lt-ucsl:=<$:*ufS"oq +4<,@7Pl?))CJo2YVutaF@l%<;3I.oNBGgOM.#EFPfHrl%<3<7'p3@,tB::6@86Y$bDUa$d'= +%e*PMeB)I\Vc&OpH\H)n]A^.kkQSUc7aHgH#Egh.X62_`+<@_ELk1J\59p(pd2s18N2X2p%?! +MTdLI,U6ssc@a.,pG'5t6%G@.9Sf/F?+5f"6O*""SkZc;l$h\+B;Jb2'Pg^! +>'#=a:"r"D2RNj1C9-^$+lJl=Je2N.@12>sOEY)-STjqPDloN^STBK.$:C9suLI=#qAC=; +0fkm1^?`GC-J;ik^q]Aa+94CK^uHK^RmC!Enq:V\$u5<./EDgcC7l;=9.XBbcW\ETrauO4=FA +SD:_bJmcGkYHAW`R]AtI.<'HQl.MdI.?'C9k/ATN-nck9U<&N"$D9GbZa2_sGCQm1'YF9gn%X ++?Yo9m>FO%-HES?6od6RAYRod%./jS8G.o-^T4;Hbufo0`n7bPtd-)1^bBMR="T,2+Z:h#^g +l^7BEo2?(`;/dfq2(aE$U48Z5+Gq'0e/0U;u4c91s>D +PKqb5:8kR7Ng:'5Yj,6DFlKSRJR]ANV1XCUKCTt%K$Q9gE*e\=V<&iu"36 +]Auqo"Bi\[G3N%5JNs/\"W]A_a9?&X$.'cmW?tuN&Y,gL.7.?ZOFg\bW2F";m!9VD>HJWmj&(]A +"WKhqqXl"iEWq?+0mX%2NIbK2W#a4NX_jJp>[/WJ0>2R\Lg[4'u^mleaj0Q'n?9mF]A582-P5 +3JIWS]A*Yr,6g=:Nl/dIETCb[fS0R*(YPn=H-gQi +D09U#_;lVTR^sIa=4u]AF+/L7M3@POcG +rS6b4(qo"jA=%"Cop1`&;7u2s&3CWZla65f=kuDN6ma6-WF1G-WA^1F8T2?N7=tGsb9pM*i. +G,`SDt;k;fkfZB2+`toa0TYYF]AS$10fn@lcB?,=L.gS%kqN.GQG!mC=#K6p_U94nP +#mMhKWJ,Y8KN$/k2ls0-ZKo)Np^m58$lr0lU'B?FZZskFX5?r,K84FiG@ra.V+du++6>^X<(&$*9fY"aoqA'mJd>:k.A07?OFPUbLA9+X+u`.G?=UbJ%PIZ&LUcPdcH(p3 +k+"0j2N1-eV(&)3Zr$-mme]Aao8hphV\@lqhk^>^E;KW'Y>W"`ku^.i'@ +O`sG8dY3rPqJ+5.32'ZH385Pj7.SaNU.Q7im$to4!<'iI*U)?&*1QHePdj2YQ.D$C<62R[RRO"-&c\ +<4e)Xbgd[)NJ%N9\`N)O-]AL5Z*[2/!:^c0\GjPp7apC6i2>o[Z +Dd)moPT"A`PB^D&]AW3,=+8"l2]Af=3*F>ff-PfcEa=oMSUd3C_i'W/5MDT/NiS +N1Tl;_:=\K@6u+/5HBEjX9ZM=UhYfd'oXMQF]A,40#L[C-r5qNHgLZ+Df9QLED55/ +C+,B!Rf`CC\M1X,k/g_bgYp%4m*1C`drTEODck>WXWLDj`UHN.rH;"4D6H"OO +4s5*Yo]AC1;6_U<=Z+5Xpu.E8&65@0m9RD6%EXCTCRgS^FN7<04!L=>6M*)*`I(+f9Fe^B8,k +U3*s+(Gn_O\R1<"]A=J.j-201hM(eE^]A0UQ^A%GC;LbN$c_l>XP,f05!-AiDOpB)+4`&4o7V# +:VUQPbDMog@(=t,Kjp,$\.P3J/Fl^b6UT4NKu_BgSa`>e97?9Y$h:[lX:L*,XQ8$%AF1(6H< +5`,s1:pC6o^5/RN@3D./e"Q+mYWfPM9'M:j;@1>RF^kbO2n_.[T8p=H&-7$uBui@tIeV.\;r +@m9Zc>C,=)fT$emJ7B4Am-:OMpI'Gbc2dJb"3fe*8)'&?C$B&`N5HuVIXYWsJ8W4k.mH7jVb +7&,.43Q:!DKiU\9le@LBkGcBA,4%2s7+XEo$_=928pScd:]A)[Gho>%*o>- +">'.2hf9e5]A6/=-8^C32J\@Hs<"<'^.qJ$/#N4@*upX?hQ_o'C:3rKud+IE/MZlF#>;e-Dm3 +pOroqYKo?IP#);5^L`mJNMOgJt4VW*\,$<5k5-LRluAcpm?Y0%*Ic#gUB=C#fUQ<0=3[`#!g +DjY'TO_D?D]ASe(U@BA?uPkdj]AF&1tbRA5NCS_$#@&CR-pOe9_psGNG-%Q$qs?5oCDJbL.Qt8 +ac,l8^[_I_6]ABB<,H'SF/ +7F'EHEBBg$H8p&$IT"_"QCMolE5YkLIR!1,iY4^@VU3EDq8W#T/Hj#Wm<,gmPL)ljaS7ZCD/ +fdeO>0>)Q0OtV1r+[&[7/;X::OeHCV/bH'J04s#)inAkIIWH[*IAL.:+Kt>7Y5(Q%d+i0(Hi3@6rL3[>^8A[QP4;l,fj7l"(CL+HVLk4aJ)0Z?ZT]A +I-jXVer"rYC=^,!1R+)8oYr.dD]AkYZ`,3G`mK>H@5#jYJu=Tkn[dB2n4UO7:.Eo[?hR\iC11 +1DQ"$iZIXgC'Z,-9HVphG'n=Galp%CC`UA%sQW?]A[9Np>gQ[?r8lM`gL+Gp2dBTm?&*=,\?MYV8a7G0JXT/p6g&08eAn[b.@=pK2t+ +`\Pr5[%):5[kf2uU+%J6R!#8cN_DLd73I,l-'/l#[!$tg$[>Xf!Fu=cmWDemt]A35RYWY0chA +#MulY"h_3)4?mrppO0p[?J:MB#a\Z*O+",045lijX)D?7.d7^[C,NlLFD>J;X +)YLktu1)(5&5Qb7\.(Zh3N5pDGo-;:cERaj.CXt(tS/fl7C"(dnV1,Uq;+g8-k.uR47f3E79 +**,9X^VC_%PYi5=h\c\Bkd6r-o!mT,ic&ngj\E>gD_E'FN%3L"SjpTFQDR`1eDVn'iTe\d#+ +Y[@_[(JW?]ATsQfg]A@1ZM:Zn#8s)&r&:2D5Y,JkGJ9>F\0e8q]A%o`cG[.At)OY:.c)MUK40n!co6Xo4:4nQ$/%34-5G`_LY-* +B$d(@n*1rTWkLMFUZio@5Pi&6O%6^,:f(@^e]A]A&j2[TA[2Ys +KdqcXWUj;B?m?f3bq^$`!.Yq083cNin,]A`^f./AOPt)9ID/kMQeF%huJrij#qnk]A^ces*$J& +MbnkeVI;S\]ArAsM3EcT^$T,6>in]A!QW89$+ub;t+&3(5e;Y7NWI2(chm8Lj9j"9oq:d*pGo< +t7j!#b3KeJk5oXg>:s+'2rMNB6RU81iBg:d+Nf%JT)N4H!6`B'H$h,\UZ6fj^C4$B-%'MA?o +gI+KO;E!U*0%Nd"1ahrQpEj`bg\cTgZXHGs?j%0-.b$e^+AT2G,B%0ShU<,*M1fqbFA3tGgD +am7Y?p5J__2<2[]A3?"&nRd$:3LfO4se!^B&rEKAA0%_q*eGQ!Q]AakO4lDDhda!./)ccYNcM7 +;dD)&U"RQkM/e&Q-r?TqAe+%_fZk7M6*uFArChb#lmqG6nea#2[5lUa0MUVE>mj2,7Mhdq=& +)`hG?P,^ta:8G8BS)pC8,=J/f(gg$H?f2bmg3u1Gp,=!&6D4K!Y@btMNdQ*e9XZ'a!A7Um?l +IIf9g9[O:R/H:DPB7KJ0HOCm&AE`-3nYc2TBc[ebJGu5lF^/j+)C7d.\P3FCS*g22?$ZMiV> +@9P.e%!Y[2`3Q$k@JP_Va@9)S#9.)T0>fOT\R?M>`<=Yt*Drb)\GUoet%XQ>pm!!r,bQOJa8 +AZiZjl/7:]AJ/RNN"Wo71(Os +-=[6eobZcCp@43Fc":h-QYQo^LV>BY$&$[=-Ga@8`X.L(IEDfco\74-W$;Pd$nA/pq20bGgI +Q/d8GNnXo,d3:`i-@mK75Zfd@/\meq`=Vkk'5:r*Ua_5Vs[`uLqU4?DHl,c$mk/L\I"HKis- +Uk8E7#6]Ae?K92=`gNi."WKTX1nl-8/-f-KqAJ;dG#=(.SD<8-HV]A8:P%;cra3B&2"YV!o%%0 +F;14RIA$k?hO"m6=I1rK'4nVEF)[[&<9HCnK@<0l]AfEcN]Ah\U_Q>,QMu=(*RED0AV!/nu+1f +q'CksKd$Yk;l?f$rY5[SkRmB+F/C2V\)Cc((rptC#@GKjr%GD1)&j.I*_"*%!If$)1sKU5Rd +Jpg[u&4N97Cf6e:SngdEcW8-bCp5e/sA-,@&RV%>i6UdN2#,SSp:(!/@G_HhT-'rS*>24CK_ +?1EWDB.k;\l$n]AHVZsiISG$P.p?0N>HJEu"$-^!SfWQJnP.ui*_)6I7pnjVs-N"As!J\ele9`kGhbo%D3T\7R24)nGf9OCbY6f@p&-uj"nG&U)Z\>4\HJM? +.S%foZ+?r&Qra=p3V6.%[.",U"LLX50]AOjsgHTl%;>O56o#LO5hQ".$rG4#0VAgZ>%c\P4dY +5%"?2\%8CjJ"gi,2iOJ)*le:Ch(QZ*UbMR9O+J289sD=NeF!hneqQ[b7jZVI)LH--rXP?UI._6@lR#%B@1!d1#'g+:&Rb?@TRG'SXb)W3%jUq7-P()KS-NKP>nBER$+lPa92 +6Cc>;lGamq"tc*$TuJo>p]A:5t1)sI9;q;pq40%K/!SK>l88P'S-+D2X:_r;W%uV9n<)[\sd' +Y/t&8Jrd3&[I:r>(f_OFZ]ApmrM\?7NY>q9%#&(S/Y"cY;#<*a3MDAeGhL52m]A0gI&jiK7 +b4CCa8qp0`AN#iRR]AT,Ogk^*S3W0Za60VSb?K:g#lYY6^)_ +A&#tWIc,>J@f0-_97(tILRV5b!"3mZWAfilg*l_1I^eH?f$=Sg7>L`^ON<9r-^IJ'B]A*,AYD +t4GWW@VWiCj+7"(XBn;>U^;G;;)q.fLiF9?it@k6AF]AWJ<<^oMC#HTS5Y$HgWt8ORc;Z1fGo +K7a9TXk&o.PdFFc?.[jO.,[l+is%8d.K*;^UU<';$d3MDcGa%3J>9(2$?S/E!N_(]A+m42\#LQ720G.q+=dR512./^fFf&u6mA[%36 +4B3ktBja%/?c(`o9bAY!jU,chZHIsSL'JcC-6:/Sa4JWH9@HpS]A7;K[f%PG27Jh.Vsf/f6o7cWQ!NZq]A2bYM:Kr2(Dbks +eb860$Hs[`4-U?n*@;Qj5rIKC&2OYS-4gh=.c9F*$O4Rl@fqWJHc@X:C:JXbth06,TEhiGVo +CMSM$J[0"pVq#r8imUoZ*o->$8CdGp-[=C'jUD@? +?=Iu>F4W_=]Ai^ +R]A9-rgqA2bG^aHYiqG456F[=uDaS&\J*Z@7NI2*cdJ3#/MMhBdOVE4.GPn_`aiQQ.H+25r@7iX'!T:e9J!tCOO7W* +-EBN"rSC3XMU4[_NrX+t8+A:F0]A@P2dbh-SYqFKpB=@*Gq(;[n2*m-A3d;Z9n5.Q"RJ7)1JB +0+Ajc)knUe.YcDG2L6V32!,Q9A#9B#s.t_PX;,P.1c/(h6H'<$V3LsHs0aYG?Jt264>\qmH7 +:pL`Q&@-ZFH_^Vs_\O1!gto;,@WYK8'$K,7nqfK.-_i2(S3p'7"16W:W[Spd/M%jD/OG#diX +*]AY2urb3+Zl^(DKLf6M4\f#ucn`Y/TXr`rCY("h"o;ac+.aq8]AI9.=,ue-#RK)OLkpl^$ +m-o\!^2)A=u#gBs8Q;Bs5=:IdAjSOlP7Cs:F`d,>.7+'XFgHW~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +7*fW]A,#TDDT1EX=J3/kEL5Z[E=)($mdBL1Yg=SO +nWhSG3m[>dt:d5(&KW&5i;ni=kR5%hLuC#k3?3U.Z^qI.6qS.3b_MZ@%f>bH#[]A5#<$^'^n8 +b=o2E?8NJ#TX;3-*F?1GKN5R9Nc!f_*^e@fUfRH^LU&+\TT63Bk0dE*OeTgA%A###EkPTVWa +X#;XO*BK(gm*Bhf`UObc%j&(VoT+RO8o29-2i%Z'`3+"N;.VrNq_EM"OP!tT/"_^R41me^)+ +V=.UE,%&P0Bf\f6*s/DDT"]AHLQ([0PSEIdgeGD[P8&0YS>n(dck'n($p'iHK_d`,K2]AR>1]Ab +mZ>'(HA]A.ZD-H[j:%$ZdfL[Nb2)ib<'(G!t;?"2Aj&8NS8]A'$9cXF'*5BDHbW +OP>;ZAeM*]A&A4+rj!?8P7Yb@SnX&.1(@8n4NiBhi4LI&m&L:(!6fW4K%+3+RN6Q[(_fR\40q5hb&InIGmf]At;d-Fh) +=q2/p/j)^c/D\iF;,=ao))>Bppj)DN[tdR?Vp7`@dp*?/3\<0ZM!#P5b=&j2,*QNDm78kF#B +G#"'F)Ln=6mP)%h5!hU6k-T)OG;hH>pG3F=H+rh#e"O.8UX+6heg(e<>?bPLo$.Gj\L4FgggX"?G7PjQ/> +HTN&aYb.!clO$m+n.,&ObDmMD&.#.PHut)1k:2UgY?-D%ZY'I_^Ud?$,Eq:&"DVgMC,WjK*: +,gH0%aS;i(2Vh6t*.T#^KCtAnT/+,M<\A$+Ol\X +A##UNtV#G\Km38bc*-qhKdpn3>s;QbB#flgKU+8>AUFT]A\_2ielSaD9kpS8PJD(f)XI4Bkbk +d4GB8YO7nr(g&!L3jPaU6#h9XC7/D.&i1cfoRk)[dJ:E32opR0(47&B5#<<)ainS_;aqp:_V +E0iJU2b*uNfG0UNMb`LkBW5]AW-QZ)+cdkElJ)+C7k2o!;*G,2,n_EH)C4P%F +(b'JV?mc!DP5ifIMP\kZR/+;lrT!'0e#t42)7!cR>ln`rY2Zibmtg`niat,-Oe]AbRTe_/ +[0a\#1-#3u]A#R:;ZWoi>4,"f4lbVS2NOb3gk2pJ4)'#@VNJmLZlN;`39?<.(reGNOBpqV\1s +@F^DN.*o1#>r\=gQQI+alKdc*=J8Y'CsZDR*U:osdEWM,&.rp;3FFr2n/(RtI6bprotkg^-8 +7lQamKods4m*Jdf1)3_6pb>BMGb^1N.Sb=VIa-WhL,mSoP.Ii8O_fKV/difWgcnI!cib$X9[ +$93V&Pn/C#)pMjDKcQ!A"Xa?T_[s*e_e-(D/=%8@Z.+]ArQ*&4`'U>#UVECX/*)9 +h(Gia6&m1,"H(;BY.?Rq2P0'HHi:>>n"gd4LLK%/l36F`KR;!dai;[t_c9u2HL#1kOk%=-3, ++J7?;1PfDVpECA\(`JQPPj4kS[1+=9Z$I\f`)_K0KoBh0+p><9,c\M;pD#kS+(ClI7?8g.m=ogU'CdfN2!#<[DRXW5nVNi-tl!]AeqPQ&P"1a\`Pp[G$U]AY%E'-n>6)^OKboK.a/iNG4\D9I#fN2&_,3 +i9FZ9_@eOP@k<`j;G/s"%81MeQo,je]AE5<\@CZ@2NElhj+St4ul%A=rc\ge259NbCp^ACLYCn!aCs=J:Ie;[)rp5upHt]AFO*#2,;N[L4R2/*[mqR4\JgI6j/42,,J2*uflt<# +Z,.V*9lr-,,_M?=9C8\e/XdqERZC6_^$[DJj,J/C='J.imStDY4T?*CmVqO5(;:PZPW^pl\W +&XE%g?NoKVtX%rW\0r1RI[/(SBn'(n,-g_";I&nQ9Y:cq#gFNOnCn]Aa.k%kP>s"L+bH)Zh:Z@rR1Z4U#/f:4_gPd_g#Xij]A6:B?fNY,)T9D!k7oGC5PR+K0VHU_ +@ZMDGF)2PNhqdTTd':U53,0(uRYJ>eY#@`HjncjUj[dsQ15of!q.J<"9,*dq+@dl"8KAo`AH +hn=SKCP:-L*j)#d90mW2lu/glJA8H*thLV)hEmhjl;5XJP,e)9D$M7Kg^`fd:EmohO!VU2P8 +QH;+;gGFur:0l=%f'\mh.dEbWc9m)BYT1B_(D+#$qRV>4RA#(Q>riWk8K!%$o>6KpV&q2@*km:_m_'\J[8p>>pt)Cm$DP^fD +/9eiK(dQRl+'S"%I&Z2br%@QBU*"Zpc4HX*2G0W(M;D:Z=crXi(G:(S(mMArF;9"X#Tf[gi2 +D@@5XSj@IJRJr*R4i=dI4T3'UU#?<]A\#[QCR0'c'*?Mo^>c6=JT/Y*F"?.@)MZ\/dk(RQP]A` +j'Oip,BT:BXRuU?%2oVlRqf<,e)ss"l#L635mJQIOfYQ8m[OiiB?0pF"*M(t`-I9PmL(S6+^ +^]A/?/p:ZnNnQIE5KNXEXu.H'FJ1cNs;^7?*0Ls.*bYH!bBEH!*mmLb>6"t?Il^h-F_T_mi#i +T[/!;MPW7qj(MQgWdYLHDua0IXKZ51#rDMl`!uYbiVC5KZ*gLiGSUr'MZgfO*_J$Jbf+qpE% +a/4GOkk$*'I\`ZNSY9!'3==deTVp9+FR:5!>JdE.OnE[4W'hHkZsbA(Ns@gSg&9XhiaX1,+Z +9gV9:5uY)8Z*/DXZLYt9#iRdR4%#o'.\jue(-LfQdAC]AG`7m)!YLJ>@WF,XIU^$O/"Y,!KrC +$1]AZJ=`4l-TiD?%27Ko5bR\CD&,._6T`rOILojFDD!ID\&o,3hh'FdjiSe(=J;`pum)<\Sn. +%3ou,pOl#^0DmP6FT`?DKZG"_EnEo@Zf\noDG.q=]A'lM +Z=t,WRlnHEDr-Vg$]A:Yho=mE]A=Vi%)@@Ypqjn8uFWQa3gHPU*cb0)5"As.a:J]AZkXo9ME!=?4D%" +F_(%2$6n@B<('-[9c+>d@^dfJNV<*e#^"*_jgk/C]A^cJ +!_[q?2NghiFspQlUJd3PNg%VSof`RDReP1&fR_^`F_6!H^Fd5_9pi/LT0-H+Z-?+'u$*fRQQ +)(?6@Ve:o1c)62BY=r#a&aL(1\_d*e*7Y>KoJ^4@H9DqYNRV6D_F\2un!!$\UNgA$JHT^I<$ +e)>`%NENsi5TWiE5+I@EP@LZ)5'?P7MpJWhd22buIHB&e,H_<.SAS'151nTC +HY9@rLiN/?\/>+fIpf=o.^W5$CdVK*F +M6\fmYh\Z4M\">8hKJ?1C^!]AsHDb1LQ75E9h@!+t"!p\qPlr%Qf[YdGrVEn2)s"\5P_LBt=V +B0=M2M<.!ZadJki9`VpG5P<#dJT)q_pVM'mS!jaL&*8Cou]AZtmV,rhFh+ALH82&1UhJPnZp]A +,Cci%qFt0TCNSE=f)Ru#^!/b<-g?Ltn!4eIEh8C?f=g)"mN4os,/SP" +>K9^D^fF83X=7Zqn^$KGnS"r$Hm9g)?%`dd7ipO39L +;D2@Z\/P*FRb.%gQUTepQaVOH^aC.]AA-^THHES4\\9k;aTfT5>If!bP3b-`'/YJkhcMQn4=,[ha\FOLp;_4`Hht0B +3/<^7Ml8*oG"@-AS#F7FurRs4dR[98KB,qIr$K726tss30]A_pqU^,mgQQALXOt7'CTES\`_B +JDJ.^O;aEJj,Q#KsYdpO+aO8_:)2$ +kL-BfF+X&#*H+>(Z)ViO]AZ+6+7]A__O"jLP)Y)3YB;2#]A-2YOG4.CJjt[oesSKB9]APAP[nsTI +sLsT'3_=ihW^%KrF%#qQm.4JAVNgW!*q^X^*Mi^c` +GR_+PVlJ$saZa7"P)]AGFRjG-pDJ#)P3`.,BC?hO9cY&W,@$mQ3,Yop<@PGMq`C20lm66?e1b +!/`2ERe6\J)@uM[r%aTK#.hs39()*T%$_iKUUF/1"h_rC9C%%7X'jllQhJC[$';GCaTP7Y`N +l+l$c$kSVW:^X5nU[\ea%\qRYRkM$6]A.1Q%(U8^2Ro'5W:YqRoima0O=-jkq,n@@qFIuT*oG +Qk'HB]AiK;f9@Z/)MtGl3e!dcWE6:=@apfKO&^uDIiY>9rQ@e<%R7ZBOE@PrWDk` +u$Dfi\M/"S9%6+C?mS]Af4"$P4&,Ea_Qt5&u+WgtJCV9A#GtT)M[;-(iK_9!>ib.jZS5>^a>" +-I*377*CJoof58;-6b"*JY$a]A7Q-+XBXgH:")+Pc1c2RRn7V2*jBjK^;$HVWk^S/h8k-nNLq +:AgLYSC8l,t;q[beN!DR=9+gVl?fAe?qS'_Q[`S\ta+puG7hDf=Z]A.n:(k:f;A&2,p)%.]A'/ +4$c>n!gkMA$fs@P%o$@CJlc(>53B=PYF%521O,i/6pg*LYNnY_Lp']Au4BIuW5qs-nZ,="&LZ +kDiZImNj^"bVP]AZg6+&1cjFWI(qj`V7"(J,+%jp;G9dN]A>AIdP*t\/$HCDEfB<#f!I"]AYjk. +aZC4bFfo+]AH/I`bTbG*X$#V:*D(_II`j7"eV(D)!2,#>n]AiKqKW3Q@O.T_mX"3b&eZc_W$%a71[m*N.H,t.7pBr>"h^,8`Y9CHaOI728]Acuf;SYKK +2k3P/2:4B[s)[m4O0jnQ'6gZio9*aR813umiPo/Og(89%$-F$(LGm"3%UEVIO@8i3W!F4L%` +h'L22"c2c)+a+&4dAeP+7+,b+]ATI)"%fJ8[BX4J3,W-,sQ1r$Z^V@Ii&-,;@+(T!-OG:s6Xh +Whh#ph;,cP[?a!Nd&IX07+S>5rl_V+"2+m9\^T@=`.)cRaO.oHhC:E$B+aq1rm`0:X'ES9bf +s-Yg=5[.42^*%3PpZOIUrR++R#B0PPKB*81aQ+POPVc&>H(]AKW2LBfFq!nEnoL +/]AZF_ID!d7)N2JgKGm?upXo]A7D8$dc'KJGd"q3S#V]A<08;ob6R_!.h3SS\o0pPY<7NE4U!\NZ_QAkZH8ffct$^GcbQ=QGAWA"5Gdnf(B8SM#VMRkRlp=IgOfJm +t?ZQ2!daGMVgA^'7nRZ>*6u&lJ.3BP7Cg[?pmBl!83"_%U3/YH1^%=*;iG\88W[-^gjpI",n`-[g3lt%etu1&cGL4IK>[IN/=IAC]AW.uiOY2GdW+t%2kI)O5Fs/ +*Y@?o;WS7R'3>'>jBJ"ggtqu$;*(Z*Gf2@.'%F&DXH/R=6F=uT$lfCu!+J`jYoPtE\o&824h +`0G7W/=f&XjRpY9D+DjYfn3"\o9<(cD0PSjaQh`W!LEX]A.O0N=PC-7K&Ckh[h?#fE!/0sA^N +74]AROfK%=UVP-S\D+1N3^,EjQ6;22*&FS,:Qe!gs9/BF-gN34%+-tTcn+o*UQ4?^;gkmF^sen[ts;NL>^D/>#R!2?%$`B;Alt2+)[F?5?_h1*3jJk7^P6W,#M&RnI8"n)*IB;D*""GkgnZ +9.*2c4.k%*OW`^28RZ6%JIsV$/$!G`in_HX;)`!2"AjOki8WdtO9,L6FR63KHaap[NsCo9Md +:+V-SL1O0hj7Eh[LD#\N55YhbW+qMfa[VRn7FqChaS$Z+Z@B]AnD'lg"Cp)U'uKt\*\QGGYG]A +j\XC!rR?]Af@'13N,o.C3#ARDI\jYbZ7]AhakEUQ^,c`Y7Ta;#^H,)]A]A%A(2s/A]Alh\GU)`:eJ +)TrmgT"<_,$ZN(*=Jnj2n.?!EpHMf+$2R]Al0$!H:l"'k?0gdndPU0df#WXSlNc'4D#/O@DMr +:HL&>B=k\*hBrc&mhMea32rQgmRl]AP`>m_SA\ZW.3&agt`daDJg'@u"cFbE7Z9"&"P**BNP?AuI"Ht2kfjn&ourEs$Ci\1W#6"RE5@WA%E+5JOfhRLCKqd_QSQe'%;\ +u/@"10Vi*.q@mRdu:Dp,LD@>Q?f$]ACV\&jrsd6$lh+-`TDA9WTV.t5h4O3sXEXC3m*9'K#]Ag**X+]AnS*-bd4d<.3B4[Dn*#*"i!"TA +r7s13G->99P[P(nheA"UH;C`IC+JRS^:IMf)X`.A`FLNRS5LJrJ8\Js2/(#X`(b'el-p1&26 +47ce$5[(R/$1aK=Ri3mdYUDBo2_4Qfl"^S2F``$*hic81'Of-5B8G)^E!.&83=;Gd]Ah&I=Js +c@'k'^V"RFK^((#9Vt1_"DYm4*pb>5LKA0kW*NDT)b;8S'7qtW;fSFne$L^=tJ=qiISX3V2> +lb_lcaX5NBM"0Xh$s7AbtmaXoi>J87Fphj2Nh*<;:3uCi=EhpP)#`b#a6Ud_^>cZ8I$'!MN1GXE]AaOUDR4f)M7hi4B*"c;EYnr +,d"AppN5Fo"jeqme$8l*X`TZC7h:5"rq`R[<072`ujCC*jZIp+Ll8DjIpLe?!KZgs<\g&g[R +7)!Tm9M +2bAB72V)'eC=LG+_)fun.5YV`A%&la(DCZ@rHj(98,EbVS0nG)4u^UYmneZBlU>&43/2jYmRb_o'O]A<=nV=$&b[%h +IT,!WtZ&UK3r'D,cuu&A#Kc-VO[GBkp\P4P>>PYG\:rB`[=TNK&Q8,MRUsI-u2sYKm97hYk` +^nG2'H`+WMt5S??)kU6uJO5\aik%Lp57T]AHqm?8;ZU'Lnef%P1CZ3DJE4#:Z-^\!,m\G+C`Q +;6_7b[_TiYq#'U_+#5$]A>8S1+@[U7`-9*26N>Zc]AdT#[4WDcAd/*0=rL*eH*4TaQ0#]A>%fjm +;N5&jQc&A]Aodkijg[kZI`+FqXA.M):"?PqaHoE'*\CX(J%:(#u1\W0R\s$'"@+7R(pe&?R`p +$-2cO#$0Eu8BG2S?Z;gF(d1j`WMukBH$RN0o02$%C:Upe[SSbqFK+Nhl%,a,L'jE:f[n5RG? +D(.T.jDN=_G!IDIt4E-&%8:mGdQJdI'c?I@N9&c/QQDq,uKGVb;dW`*=W&0+(TF'QQr;F[JQmZCIi*,YBKNqcCH1\eoY:<%u?;E`deKP +K@DNf_D\s)&@jcdSrjn=KdAcb6/SXQ//V'4Ak/]A!?RA0iU*eO_@)OCe$sG"BQA/;jRK&(Tfd +dlZZ*Lq`s>#!Rj.(c\pfeHPkXnEmI'?=q=:94Vd/(B5!%EpI'Zd^U7LiRnlQP?'bq`PotBQ* +)Pu66bmgl.b1r9`=AJ:O4"<(\oReF]A63J[./-Ui38,.i#8#Q2d7n7.i6:sH,&n?nYJ,8_@9jS#uOX +s.OD,J15RFhBe<;OL?!,A#r[h_YuiREV8dc7)"l#^KBk-4.IVn&bC,P=JT?8)Q;B9n\+kHek +Wg*B$N,O.Cc8i.+L-/.@U +>OMc:l%Ea2+bnZaqI/RJKu*c?_hip"lOrEp0fDYUm\uYFViS)`?=q,HbK9I]A+MMc1;rjU$HJ +T7Clr*<9@sZRhR'72EotgouPu>D'[q3^)B"<k\m +rqaIa"WZTg]A5@@h:]A&a1mPd]AKVo9OC'Eb$DJj?oR&Nca^84VZs9]AfSBd>D=A1:OQcIM!Nee( +SD+GES:'N='*k7?6Y,t-GLJo29Ycu^.f%7%S>Cl'sL/\AuJ]A>*;F0i/$gNUg(;RB9/.pE\3o +=7=[8>f"hP^kkqY$;f9VE6\iJ*HXH7GVKRdScIW+/4#a\gkhrVd(Wn4=Ur*qsh14a/a +Q]A)ZrU13OaZ@4-8p#8'DqH]A.g!D>&d1qiE#]AYds-6Hi1V#(p/'?rD7055Nh8q_H8?m#cJ`HF +aRsii#8]A<&I"4J@lBQk7<*u?R@;WPrAgAWE.4JD"3u-j]AJ.)a5hq6UcMoe@e(HG*5"!&E<:W +5AYM0)Aco_I/h]AC,f\Y,Xg?C&U>I]A2H3%'1obcX%tTs:+)KaR@,b;LEZ/\N4+`]A7>6"<).&; +;6@s]ArJpb!5V,gG.NJm/@<"WdC9YEFJo273Q8.>(Z*YUZ1__Fgt:dNnX[Df*G-^kNWaa +Xf=;GIA2,/2&Xa>hhG)6.7jHD&lQ&qo16ISVDX;+&b[9Onn1AboO`??!CUjh=pfuYE'+Ng-B +$LYXM8lIBi^d\B-]Ab+[J_(HD%bA6E^@)jPn["4Or$9\Y6$\R@-('fCeFkE!FPR2B2$K+E4E" +^S+!7oN4k3M"-]AUVpFS6s'bP)^c&+mD>H%TN'8qY?-R'h-UZq%Rj$j.2pm,OG+qG?a=VLY04 +laA#h2<%;.WZHUM>tpu]A8nP)\'&i(1K#gDEHHHJ3*F[Au7t939[YK'<[&>`@SsG*uBT_+HRH-1qqXb`EL98\ +([FjV`9tQn1Nq7bE&AMM4Sh$$Lk50pS'EfpQ!dK_aDaqIT0(tNBokhPCOMPR?\Pl2;iTDJVe +s*fA!pkl8g^Y<<^Y[YY]AuNWNi]A_O7Sd[m1I@KWrWHB+X2gmlJnk\#,oE3Y[m]A\9!Vd-9K.nE?LN)?RhRas@'<-4 +1fXBjCJrB;5/!o6%i2>A)>>V<)HoD-8'K0#sj$7XY#0G\X_q:"^:fZB,t"'jIM'VGi&Wa.9< +5XQS\G?]Af@0\.B#.1Wm&0Z:[`&8SMB;"sQE%iT0Pt)7dV"CF4BZ((8;XUa.6>DqFe2Cdl8f< +P_P`%-(0*9JTc>iF(epQE2]A'0H*L_GO!@J`W$j7K:;\8p`AZq(+*m,Ts&$%&-cZEqRP*[F2A +b2]A?/1+3S?F`l.in9PCdOU&j1%E.Os.q^[DU0:3iAa_.i@b>Q(.:E=in3o**f38f:W35t2N4 +]AIp8<8J&1o-_G;nk[!5>,X[-:M:k*I&EN:e$>c.!mh\o&?Oq*ZcM +,]AZ"um[OtBKiE&NNH.hE[:*[A(pj3f[ds`26pO$(u4G)t#Dm2cFm0BA`?9\T^[;"%(7Qn![K +2G7=\A9nVpT.OLh>,T4,rH,c`S^R9LL;k#BX]ATd.Vek_+GBq[-QZ*i)6ZB\S<$[OMlFttH6* +@iJqjDRo'*pcH7(XGno\h8".71m*;$2h=d(UoZG:"UZa8-8hiCAqo&WN_Y>:b'X8tLa8r=XqXPbM$O^Z_Bn9T/? +J@"1f@D95,9rQ0h`j,u#i".MO96iC6R*11=%Buo_$OHd$;a@#B5lMsYo;\X=7,!FFo_?%^ +Ue9pXg(B0VMi*Aljk:Un?EXT43R@H_;Ab[."9p> +tig8Z^?e>D%J7gJm[YKa/COAfDSDpa$Z6BqH'#-<(K`r4'N'^S)/Jd^?YJh]A*o9eok9,9"_Y +de*[aJC'JcM*AKa:'edeCAW^H8k5NPa-r6AW=&u#'$=*S_H_`@'?P8p;Ei)nW?%(9r-:m*VQjs4YhY0VZ9#V-W32hMF89q!00o0Oo96Uc"?r/X +?RQ-2Nm5hnoqj)Q8R2s&l%k/dipg`q9A;K[@+1c9ZE\r@%UB3c1Kr_-Kgbfa6aV4k.kC)Ach +I-lkCJ2!eA7inMl<:&kJ1R(]AtcS_'?+X%`0Ahd[,H\h[$LpiD+9Cb['+>ah)$@jDXN9Lnp6f +&rR$Ri8/t5O#sJ7OT*#mK2`j%)]AX-S&gIrKKYud,t]AU3F0H0LeuKqeJ"4PueG=%B77l#ecrb +>E._/eol6KS9THUf:T+?QV!2hZ=##4SB87c3APh9ClQV`t%(7;=)%k-\e2@8o)652(,OJ[I +WJ$pr*'EB1.,&F4fsLi'N-k-,(AC2)J91OhsoiI/IMhAL3tkf``"H'"(ak._c?T8hiR"73nS +iZ[2/NQ'EB]A=G)Nc.W9C?qo2sS=R19]AWjTXjmQo+=\5/),["rWM8\jFjHeB,LQHUtQ%8E>r2 +XeBb&/d?oUk&//fENZ[(adTSMtB70#d9Z>Wj?c9Oq%$r.n,lp!gKWli[aQ)FqVga!9;e`m3C +QrSca"\TlMeU\c?j^Fm@I/+hS*S8pSdp\fM22P%HCRW+Ns*DBe4u*GVGR##7'F?;GGJB%k%/RBAgF5>belBS(KJ]A[&]A8C%UZ:V +F$NEqfeB;NKoh9;uhfn,KH"">R73%^,/_ls!cO76[%r!jEFo$H%\/gS0?3]Ao@qV)6A@FBE?h +]A;R7(A1U'A#1F=JS*(`hH"p8H:i+3_ +IniAdopKY0n@l#2OPf(2]A4(L2-NgtCHIPs=,K5obs1Ya`iS-i8k!<4$sPHLa231698lfPh3. +U#%l/.tqcb0f'ek(R@`^,C-md?I@; +clG&+f^"+Ao`mf=rXFP(L5tIRg*dcoi%_Z`l%&7*Wc_no)Ko'ocZ*CQ0&.hGie!'6EP9-o+2 +&c(1rmu7U./:Fr/qIR:\f=k4q)\5u4!sMdXF!QKR.QLd`$`++\bQ*th]A.Ob'qjP>dILj$@F" +!nE_YD1r)A6X(i,`U*#"Tf'R]AaO01k\W4hU"W'sVg@e,g\6,3LpkhL,.[]A]AP0kH@g`Sn^;qC +'.kKBEarnF._Bs"M]ApXU@::]A^*ZZ*LBqr#\#0%^KAMe% +7&#UMg54j>=gjG$'@1@#a^>!/62g0a5ap&\qmDKa4k=I>sa3b^1/M!nn'M>*tAEIoe +YC?l=0NtL%blf?N?0/&[%#3OG9!.\.EYKQk^*T(\&]A/(?DRXdX.\-"fEd(L$ImU@#h(TRN9> +sHWKlK]AAl7H"VP>ZX)]AMS$TtCqk$)MX1gWpPO6A^"j__J8GB-)r!UlOc>d^iF^W`kb3$T1Jp +JtD(JPTh;D'SY$LUnrft0\`n[9uTUP%%EdXIhEWab>g=O!DaGs2"Qh#^eR^kJ[nHH-(Ci2^n +&Vn>O[1UW$F?6h,$fsW)L/dWr.oeStdc+#kKh+!I3O#KY>H+?uaa@dk\6WboGpG!PT-`hNOU +D9.NJq7,]A>gNU9>K#=]AhLJskLM#tTRX2W.Bjp0JjX-N/oTffJ_X%IlV^:>?a1+=YYi;M6i\O.mU97fER`/,>hfaV/Pa+Mh`K#g37(L2:uLbA0+ +PSEhLt'dbH%9%2ihiXU=.rBD(7*\PKh?uRbs=K/&NTfPoL6@o]AU>I7P7b!5nb.Z&2.5I%N*g +"mYK+hY)oF!+jI1=p%CA%r?6">NGEZ*\cH90sI&GZ(A-U'`.^:kX^3-BAQeOCdt^:lXFDQ9.o_m_p$7Vqc>\q::"e0Xc; +[Z(Bc)#G)u4(3YuV+875 +\n@3s&C9T6.H7g+kSl+]A$4.^tr?HqV<&d_n-BHLR7uugO6s7;q"m:;c#i,c.VI.^?3UT6_uk +8EQK1,g`ER?R2?LpN0LGZ&G51XO[2Qg-tk'%4Y:60V--;PcZ$i:"]A4P7KTC,g)"c;2(QuCYJ +rp`ZCrB5=Sn>CeBYg`[m.>*4:dH>FEK*AY,9\3rUQeub).7!P%_3IndM4h#W(YP8a<453:f" +=$:qD"&KS]AerLRV4X/H1Q?&S^upC1m2PCdM*Sp1BA]AohuT(3YuM.NIu8'epYTo*kc@/f^0m# +cpl]A#8.^Tad`Q#s5mMs7?#l[Go3&X]A70#Ihc(OogQ-EGt7MeE%HrX\T!iH^RS.Qf&cP"P-P^'#q:N\83F%F\^,FiI%P_t?D6c5) +mI]A*g:b(G:5"rg\N7FjWbGcf^dZ*=q*+o.eh/Q6C2Ro!XO(E_n%TiYpH7O`?tP%`l0LFl:Pq +do.bl@(3+=:M<=uU1CX5C\8`&1q??7%6n-%id3NirlRuWJ3r3YK5/NbLqZKqsV64gBJ`[6Fk +II8!uVPL$cp2+uj]AAhGP8.dS9.6qD0ne+N'I.Rt9>Y/pha_VfBrm]Aq%HR1TeSVB!'j4IK5^P +>P"@)_qA7KhU#f[k)o:qY?/IWmf$9WL?+3TW.2[o7'D7H+,f#mhI;._>s"8"enV-1:7DJLF% +0-"Nb8!h&d%4s?U9-e7;1R+:JSm2"tjP:!d7/BijpV^^BDLbq#@/'RUjG5#'$->-k232;i@< +>fX[h$3iL5-ALOBr;%XQL'3Eo&':(Gl#Dp60;o1VhP:K`WV' +N;/)f.-D7RZ6s(SHSPRgHXUTfT3"&dBIh"=o?NNSCW_o@;qh0Q]A2qpWeu4=pOA*]ACoUeD'q! +*7G9j[SZ---B:bg"hc.G<_d?$DQ52,`1]A.Cb*4\T3+W!,S=lH>/;7=m?*T]A`N\N +N/X[]AUo<-M)VS\.\rHp-RI\7s;r=IPEQ3V5^HT(@ttN+knO,(6O5frUM+\@FETQdka%e*k"Q +te=)TOop?Iq1Xh$3a8=3L8"MtSiI)Y6$.Hk3n?bEjN]A8b!X]A?@s5Nm,!e$.)=FYu=l'Aj9*8 +oA`q7g0.8+7^j*GMQ'E'am8IW8_rpM-A+p^rnRpYVjj +?66?6$`ZlYkaMY)cDGQ`s>?!RD8e8]AdY&_hCKmP+.Z3RJu`cPfDBQE'fqt\TX]A5kU2UIZk*5KP2ld>kXDY5TEA$kKl +Ou@V7T%p7s:C7"kX(p.conWXsG:SY0Va&5SZI*6LG +#Aj?!oW+3r,?.j(,\J.MlsRFiT%5m$"B\Js:e9Se^RH_S^r*uG7W.Xb*nP)+3CRHb#pQ\_YD +olhO9gpk`gGKc?!Lac1=044PYAR;-o)D5@c*p0'4KBshBVKGJM/V#K43S/N@kTR&,!CH/$&K +K:ts]AMEkG4gDIk="S[KCej:k +;7da11f'q-0cHAB8Q,g&ABVkrp/pj\=<$F6q1R([%ddtQtOCZ/"hfjA)*(`8dHF`_lA2H)+N +"O[_,d*OHHS%nLaVA:<$f9I*Z)YN+@.9[SC\/h)do,VU\kUB,17._s8hq^`Q`N)#XA_.=SGi +!o*c$Kn9%So*![P#`?316BX6F(Ht@9cMF";jsE4!iJj!:Gj+fl#8 +6$fOQg`$,I6R\/h%S&ncX@_(,;W8`NBW3BoaI'W%V\nBD4/s(Lj`!mOt)e7"h;\AT<*DQma9 +8W2Ti6;h9c3!7_ +:;Yp]A!DPi5fX:"`2uaPF_jK0"/>H+t,)RI*aRS*KQJZaWsRCoW;EjM/4\XST<,g1A>+L,Kh/d4-YrXh?X*pCA +4P3hhkhV\hG]ASr#$j3QE=9$E8,V#KTTNs,Xl'iUIRlfG;+EJf:nkkhec5B=8NM1Gf;".3g=8 +'h5c"@(@3LH%*3h8Y%fR85(YQ'ROKPa-ldrf)$Qq;aD-fLo%ES:G8N!"e]AF(6>#Po88BhE?% +AdWBHaj9b7haoG%ZY&4V-9,6KjU%V(c?T9@Spa+O*&\bc1c.]AW_RkEb8aVQKl_?5+'DfJHZR +n:]A*:D$%Q/k;SY#nf]A@N?D(C606.9/BtV>7iW[0=SNIaes/+kc0^$25nGR@HC05ZRB>8XYQHD=Ob<"i,MkA4RL4AI +5!H5ZW@0[j0ZoaK`Qet[S/?A&e.gCc2PS4f`Zc>uFZL^q^c$Mn +\Q8)BrkT/p`eE)6&#M!1q[sLgQnBs6_<^Sel*i6$Ve=j\6;lRZeP#sM!)d_XL4b\"?q@BGVP +g1N\akAXn/1Rj/L`=*F?BC=q)JPqiQ\%=Z)M:Mh`U@7OHoLcjsri^Kc]AD<QY#EPOF!$f@5=R#FrZu'?(Vl*kLhXm!OTgN-Ga.6ceIO!uS +ehlQVP#tlj3]ASLH/762qD@pef7=-[.]ATL='>WknW/IhE?p`2c+\Y9,'2TS/Q60p2-cKC_6BW +nDl*O:,`e"Fa]A2Xk[:eahl?Wu:Scc_V(S[NQ+4J2(;f7DVJ`hX-`+o[SkpSS4#p0p6#'\qK0 +-QGufh_0el7--3!fBrtN.=C!b52pE8#?I[[ZCj"7IgFk^LmFa-,U^pr[Hem+f?r)a2OR+f8) +u$C/2J-^YmS%KPmW<35WGQiogU:sCC7AS%pKPb3A +7_=uZhJksg%RL3<%Ma)1FiqoCX05VMa-b"M@O3rA/ZM,fA*NT2qqZREAj:uB3UFVV)FHMXW]A +"q`+b%:_mTZg!W:e7cQDZAi]AhninFuZa>$;QX4HQq19!r1fmTVZuh2`YJc:^?pqt\RWDX'6m +,aUqi70r8GKRoi?VdA0sko^2aG(B0"Q@&[;(K41@1^e2[Ak\FKV"/4OfA;*N6`o"T]A*jUj1. +Wru1V!&UrncaW!uDu+hXSXh[FL\tM.X,TY&=&l7-'[kIcJ(=EDkGA3D^Is.a=:"h[Y-8PZ2Y +5*([N&*mpQEN[.oGS*/88j8E8F>CDn(MI'C?VGD>@G[Y;8)Mc!YB\Ig,R(%CDb>EAP4]ADIUc +*i$$6+jh4JMrHXZhIR;I(q\n%;>N'7*N*sFi(?de?3O^>0W\E@keiI7]At@fdB'9'!4Os5*O_@5W)+r?44MI"mq7[:qsPl%41P/q"#?lOY=PPFiXd%9Kk +?S6i?KR.$IuYC=)#(\3K'BiNWXf"%5kRSBY>>g!:Gj[LYk=l^(o)QZr[hVciCAq1=)[pVdh_ +?IFBj_nd+YZYj3sTZWBr=^L+ZH?L-$VCt+glX*mR4YWSjEoNmkTkS:Z%1_Cp>A=-:&F+Qqn> +"7@GmEE195V7@^=UD3Cg3+PA9]A2'X>bo$U9(Q#"6TsR)&]Ap2q0+sJ9%naZ?60/GQ^Aje_ +(:q!!mbH&EW$DRD[T<^+pS*lfo"h[&&(/;/(:9bmlZLj>4/XifVM]As>h)B'Mt>?dSdT,OhuN +Jrk_l^dP7nMEh^E+EtAkHdksTF,3[)D9C9:G+PKQPW-NG&lp>?T2/3*K+L3\/Ah8'_g1$`XKUk[\^[f,rG3-!#52=) +jA/-?,f-_n8ViWd3C%QT5p?QqJgt`rOu)QPPnkh&j>e(ihI"lE=WFMORLE]AdIX)3O:KG[CG% +SaeB'Y07Q^JjAkbL$'9b^M8S,qliA?R=S/ZGQe2odWUW#t0LE@Ghl_;08VEB=k"p&;+a!m>U +Cf[R55P0R'B8%dBNo3+$lT[KEKZ.)7(W&,/$F!'dJ9l1cG-1\jmSb/0:&U2LR*Q.()ILbXhA +#T`F0Qn>gq,%-R\-^4lj\cW]AGRce.f$MQJIQQ/M1W$*03u)(=OcZ2s^\QI/Ltj5ZYpP?,X`&)^^@bhr)-FbL??8+,h_T>G]A'ITcrVVe0Hdu7^Cd;5W`TD5AiC87;K>af:1cL;ONTF163>N&goTrJ9mS3#GB*9M-5qP]AEG +@@EUS"]A"'uJm"!G;m_a>I=)k^(iHC6F)2asA:naU2hUkko?%&P5:V[c597)PG*4*/:D/7tpd +J5FITk(4AkO.>ho+FNS8jrdshmPK8#scVP"qi62^*'rKI:.5AG%KdS;PeQEIeW$ga'2hT?$E +>4P=tD3W;cekB7(T_@`RB';?Xq6R.*t8r]Aan*0*V"/&jS3-00q6F>H"r>l4)4l?/m%m(f^hm +[8D5OC0Vd^EF`;2nOl9.bACnNoiD+IeiLinD&.rUa;I!j``^rAhOj]ADrH"4dh/_5nVR,>Z#o +$NVeZ4I%<.A(#m$5Ya2mHeJ(Ju*F&DQ#'2V$F*cS$e!WhL@m&`kC2ULJ5IZaP3dGf\PM\P9_ +@=)F_:f%0ViY6^?-k1fK)-;W)Pq3Y5,'6&qIqd*QA2^\n-g/2nIS57jJXkdSJkGH +:p!OjC8.;AN=kO[PdWi@ORM<]ARB:Hj4(fQ$oTZ,0s\W/3o;;^:F5b\B^e:&sb1&Qf1GS'?k@ +%3q=j,78%4#uZR]A3&h&r:K>u3.uoe)mn1#nY7:+DV9QR?)7M[UU\Q>%)D3Yk1@FR+a9B%3UZ +J3rL5+XFiB&H5l&)lkg3gtUX8NUm?`$CeC,D`_M;ZRJ$-GPhH8=^#^A5%pJrBe[aF6tW$VPD +>8PbBQ$`hD6T,]A@3X0o>m20DJ'XnqA<>A-RKSio;&5BfU7loI'iOFf;OXLZ6MA19MV-LYZjI +auN`9L-NSFZ::5J1&SN'WB'U"?^PIC)";gkLf&O+/aRa<'Tn4SrY^3A(r!N7sq./_lR":ir+ +)#&j]AZJAfD=Mgjp5E"XXX^7V6/:UQkI"U?C_&[^Hr6fd2"eNKA/oQn#JBm-`N9Uq>miEIf9? +YLbO@Yt;CdLB!]AtOYlB02Z%9WoX?c[(a=Mr`";"*J+RbNgeL4hjm$,8e$bK\"sb;bL>6gl+6 +]A180Ro`l7#6lnEGqDq,Ke;Bs0Y]A4%A9DC/'9fe+D"E^UO'8NZAJnq>NtkK"p0?Y=eLr5h]A%M +ZY0]AQa+GcI=W-B&&]A%Z:W@NtV;PgUe^3_*3)o7ac(Z.8(FqQR)="^r/I6#rInp"FD`:M7StZ +/"I0T]AVuW[Sph&_RDG!##hd['/P:U#//_So7+`aZ#BL3^GU)F^)08.dUhMsbu'L/reD@gi?& +.f"*uW^P61KCK\5cJ-q)Z*QZfpigV138.>oNI^l+Od.:"9U%A2a"Dej2PeNggL"-qBCoK=<< +*BC<-%9rMtF4;\[^T).Ml'JOHR)hbd0B?kkg(+l!^Uk@lON\mp-bO^/g6Hba)tGtbkeJ>XZO +hXA_8iM?lf\mZq'=F)+%_lQ'C([&K&UTqITG-TZa98lhnM2=2KD%<3YAhi&B+@W;HG=M!s:V +Hq*0kq*c1rOA7[-CG3kTnU)5?lep+j>mcC;,1!sp[NQ0-k#RF2,:?1+87s$d4/nHl-GK@iC345s^@O2P2!bbKDt_^Tc/;."[' +X-A>*>)9U'Z+A15?:p=o[7&:p%4[jkUsr)OcbLd+J+IOiFt;XWMW7<#Du;RJW=]Ag@2FEEqUj +G5\uRHh,ia:!7%3f-,X#sEGehKM0),Yr^lS/dJ7,5S"*L[))l+1$c&-s!\uR8_6`95p:f,UM +ES8?C\*`.ahE'>@L8/?'8g2^P#ue`0]AjLV18HF>L6.Mdm*&A[Mjp2_GBXka^\ +"#_Z6CM*WbOhkg7^=tN)Zu%SNdIM]APeAm%j.2Vp3's?:&C%BjY#XW_)G#:YP%(ch5lKt'=tK +TV"qe$iFrWKMS$8m%JC^`1cE=G^[JtA=@K>Pa$&I4N-[%8g7)QLL!\sKp`I@gYl!jNNZD^^? +7S35O"+(reZG[5V6[ksI;_kTYP$.=g?@!8$KgY#;-`lFaN=2&pH/q@.\i`4O;lM(=r^[hSS4 +b)r4J0^R:Re_5m3$Srl&r%Yh-?84$m#6C1gOnjgVoMMf1LRPKd^+?W9''Sj;*@b$,%diY?GT +5lOuL9e[WKI^lrIFu`p_BQXC8j+]AKG+J:mF%$YeG2O%WF8,;EXQh^:A>G5L'10h%a4`,">/34LS+^S\XYcWlduU,dLsM +u/*j;FLab(9P"(5\_Dq8IaX($_/oXUj9(+4Q-4$>"g4lPcc4pp%OVl6a.R.emXA)Y(#(NK=W +E8!`>3>^U9)d&[KDuggPG6Ok_LHdhOp1#QDUP"1=br/!q-!! +49-:'+"siV&M$Fm(b*dQa@o0"nU",eRbIc\N`EXid.@Z6E),.l+I]A&tH6G_4K"gj0>OP=mq:cR1QDjWFs# +YHHZaL)qJ8RuYtG']AeFIB>\e(2s>OJnP.;l=&r9a?*8X<^(S/B1L'Gfn>d?Vpp/b\b\tcjl6 +pF+HG*-\.BE&TNttDh!*:4/S1-M3gD^6UB50>DqXb\%3[A!m2k"\GBDMhO`=TE?O-[MPQc4U7?(2dq!1-,B%(% +X/g"]Ant%bR9Y\DXFbYsO:<[.95.V-dM/H;NArcLC[sXmho;^[Rp`Rgl-<=,DV>I%V^1/HhU* +Q/'O7*?">O&(9Bm*>hpZ$M[2&pj3=$*m;bQcp@P9)[* +kA7a%.g'b+9Z``C9[&bX:>ZaP_u?6LGR6!-gnVHj3)$3?FV]A4)^kU4`S;&a23d^TY5<4e'b( +O72l>%ifsMgRF\Y2^]AuM]A^@QA]A2nV8&#%/kB=8DM%!+K[.k5)jjaCKRMuJLR +Zbee75Hr\iA[)E=TUI6$O2YkJO'i/u38K'0"*1XAA@WXGAR_:%k`V_n0>=OViA^3!"%aC:48 +G[RXGN02/,`\uAtR\EAh-M29e2<#nj)H*?@MZP!OD!JluX(l:9l6G-!:QTB +]A)%L>'cVr6doD1]Ag!Jb@ds.U^5)+LLS,1dQqaBj+CJDV=F.VCqt7R`R&<>@]AqQ.47EMRib]A# +T!2?YBn0-ODY@Hi!jX`a^q';h(aSSctmnPOKUQgKG-ihW5r5YHf`5cCHQ,F9Y%l2B`WgB%`n +^X_>RDei`'C(/2f#KWYG2g>>e]ABe!JVqi\\\[a^:5CH1!6Xq@JH7C=Z@q&o-9^b#]AV4r*Y5# +%#q8-oS?S1^%lX&jfBm9m^p.hUGNT6L#IkT&OLk4iA=XI,7ao6ArlmoR%,32kN +jGbU^Y$79*/bmUlg(m`N.e: +9X]A$6%"^c]AChs2@,]A4;q[BD%*0$E$. +SNWA`]A+i]AZY_O&6Q%W-TjFN>'%.W;T..PQA($Hbfib*"GHHU[@V9475,J&DeOR*@XWBE.BsV\bl)qE]A=aD@`FO +1Rib.W)$`;3kBkKqa07U]A9+):c-nO&]Ao-A)X#5ZAn;+YC&%"o?u_V8^F-d\qiOKI\g1QW*&D +gqSOiT)gU/PEQp-2%UHQQK+%7USXeF\rd;2dg&\-Mb@e(^2>Yc.DA/H\6j1/?Yo)qQ*qD6b0 +!'Ho5e\_^gU-;`+"H$FuB[_UJ*@%'i"*rX4("1/!+aCj"Pqa3un"gp=eg*Xfehp2Anq^)#>[ +-[F+)qhk?j@K,Dp64OQoC]AhYks#6eg75P_K$DmRRQ;7?iON.,d[&>#1cOgTQ]A/XJKIk]Ag1:+ ++g&_]A34T%#9ooOD6<-ell;^V4D?5s1-[S([5T8:Khh!"055ujh$UZ\;HeR5\qr9"onL%=B1aM)&B.n7GQ^'@q)<.PtPAbcZNt2HLGiV +LSF;NZiQBDr,9W^"hhU_2+4F5NXE(W/V$B@TYDXkVo_<;]AX/tura:NCNs.[2UFOGaP8!aT#/ +UQh\PQtZpcH3WkkOoi3NLnlM[RZ@'JG,6`G:WFOo7]A=n2p6T21&"YgY:UNU!+(7f6E-I^rHZ +m1(Y_I<7KEKF"NB2NJtu@O/ckb%76Y,>js)D@UpL?50[dZ.47X5;cDlB($go\g@!rHnenQLS +hXHEXOH?cHi*#hn<%snB:^g#i]A&>$p&9?:Gre#CQQ#SCJC82%<.6q."(-Lra?LXf"//")@Ns +V>Ym!U-9sb\9S5%(4G&/!8gd]AqP_u`!bl6uaV6MUg[/"Ok^2/R#@Qq#*802U![`kA\WiN:c"0qa*GnRGd#]A8*!28#l#Dj+&KY%#S2WF0.\S^@Uu4-Wlg8(>e&U#*rCT)edCd +:?;3qFa*+E@q4rb[:=k#>=)9L@KJPma[q'NLQ/8 +$D``5NP$3[k)-hs.7ePK/U)i&#Ra#mAmJfAjI.r1^]A;o#aWMI>Gub#[(fSa@O.7B1aEuSSC? +d$0*$DkfG=u3$3udbq,sOb3m5rGChXNud3GAQMI4$NaN);dGY-.1&chu"G_o +qEjXa1.#k'BUUlTo%A0+ed.;cVAK$7hNXnS?>NSl569j(E^eC>#u.+`_).cZF-pK,< +Fc,aJ=K0/qNP,d7h5#m4mkA;t\GY(N2XLNLo7L$S+i0+%2NTE9fVP[rQ\Hc/Unl\iLgPfpuW0R=d;,j0#[qi("? +]As2&k/1eSF`futUXn-]A2nYX-,';jSdMa%V['d:j.>pI:i,ZG6?X*DETi@H/DWCT +`&`aW7et=\TKV<#S&AV^irTLRM&]A7\Ob`QpmN`Il:iZM'AbD9a692-M'_@HNNW=eZ'rhInF! +=enFmmDTa-:pEHXc!8)@N#@"/5_5@=8k***-r%^i+m^UYh9Or9LC#PIf +*,]A['fcmUR&b>?cFRY'5$C?/X[M_]Ag=>BkYpR=V6aXX"(-.inM6YR`-RJdR_Ht6LL^R58:3# +apJI_5^FLd'NA.8#DtSui?6/t2a8hRI2V'r7lP>JUC]A\\mNXSgq`To*^l,]AhRn>j2[*+[$XEV2!Qj(b^n]A +fr:kMA*u5jeUVO%Cr1\_56MJ(HJjGJ1ipJ0%g-b;2$Kp#D7r`b+kJK +p;0N]A9[e>]AI.qT/1a,c:?O.OWiE)cm-N=74oUNgr4da]ALA4rn5Z(L*/@^ujBXfV!]A8KTuG`" +p+!9,N')@b=N,qH3NT-ab@pYmpt22Fki15r7dFrD>3ps"sliI@M?k#4hU@55">5p=Vh&9U(. +>h&iN5th(`>)F4b-jnFg2=#2Zp+Tb+'>&Upaf.Smd#gJTj4JVO_]AVnu!8)Zg:_fCd!K+3rbL +Mci@@(U#&X&2d,b'Ui.s$,lZc7ZDECj:L-\ou+Hf?1%ZF.*:Une\?(;@dFd44Mt1!Ne^c_XE +6OS_GZ#mc3Tl,R32pl6L#$[1;+oPO\CfT7Bs.FCI&^(egWW2QPgK[US47f8(@/\!Qh>-%n<` +%NPB"kmlHp&NaO@E%S.kN?tgY,oq4L\L[N;OQ +LB;u8tnTok>7NNAMK#q80eMCmAB4kjcn[Ggp@PWT-iVpQqW+`_FT95;beCJe!"/XTEm9U?I` +nE(&,:rF@-./SVfYdJD2@kT72I.*^&jE&/5t^]Ai)Cr[SVuu +/4ip"[hV59k/VR!GIKEV:Vpd^![Dn +trE<5fB-KoTO*'iLeO->-LCXa_BqP*(ZgX)LQq,9eB,p\#^P+g9>BZFCkVEcQOtj!d8h5YXu +?,jK@MN5gRh-qfj^I7QftX&sZ@rVc1dVp@qojJA*;3;X=/BE\5rJEq]ADH8rQ$)^)qF`>cZG. +>_aR[mERh7eq]A.%*PL2u\,^9n&JM9Fc0oY:Rnc4=\=\PN$RE!V?,qO +,jJUgWYq?Rp-;s>gV_@)%J#8YR?&`Y&*=MMCFG1,DB,bgQHa.+QXZ8'nq"aQr"W5iP'7# +=kXF=S?2l +b@813La1W#HU+SeS1iJ'H.T2#`WNWLVO<80FB_3'._Pn\q`^2Ce\1P80=`lmKjGIhn4DKf]AP +_FG71K61=W3&El3W,;D/jal')bNl\HdF9!8NoXRQd5nlJ2/s0s8V._CD7a4qYJcE*G,3`i/?QF3+73FFO(rEEHCR;K!8lp5-Y'>GNS*GXN<^8(4bB=7VGf%ZnT_D@u; +HqnkTF]AC@DPgj\Sh0eB+()PLFu\!ucoRNNSug%5"9TbW7 +mM"8&:T54iOR"`tg<4K^mM5s>Q1MrHV>MCA#rk;D0=>7_N0n)m.`!AIpr>WK%75BCK6B`'2V +AY0/XIn?rQ6\>oY!6U!@TH?R8`PHSo'==c`Ii_4TA8=Tr0_kqX6H0F`;.`Bj8/G9*+=8f%bW +%^ja!SfgIQW]A +s$P6oG*W\s<;An.P0R0Q`G,E6nA95lp7).7:C)\)Np=n+BC3e^2(^Lc!H*A*8l2+ca(jL*2\O.Fna>X:*Lqp/o&A``!!:[Z$7_:"KLZ+TQVC"XY@?YF7"M3soo#^;ft6l7)4^boh +RpjL93ak:=9pY70@0Fh`&M^"o.e-rq@'Acn.TrqmB:1__nGCg8iZONEC_QRdJ!\Y!K8pVb)8 +l34J0P'ngLArW\2`E[:FY)>t`i-+-ksl`DM7?fdUV*B +&.FV0+c-gp$1)$sUWRnA7::SD[G6s]AZ4;p>QA(udY"K`-irOc3^@t>J#:faPD_T\#]ARA[[B'O5os;IXNqhf=/(QWb$mJF$a=6&%HnjAO@/p3m&5"C9?%9 +4f%N'(3?p6blJT]ADF.K@*HMU5TF0GBo-"WlT]A7S1n+mUO@qtT[/,/pJ6\JSr,dBORD[4#qEr +9>rL]A/H&nZ=TDcD4g/^jjfH9d$DZ5EdpF-Fq7_Kli(.m(Ahe3q?8=ThC-=Wjnp;qPb/To,S5 +)@IM5+6SAu.6/'SM/+;?2#/iDZdA.MOg(AO1P#rY'Q@p1pKisZ7k=cdYis^t4[9B),Lk8<=` +Q`jhr?&WF[!7WqJ;?dBQaIpEFHIU@l#lu:s+sfE%G*W*>orF90"M#ufCN+ +1)+Dm*)4<\)E/YLl>\F\h$mRO2USY(s?uAIqh*0j"jcaO$H-?=:^ +/+lF]A<[7O=rF/]At6^rFGoN-m?&=1BYClD"%doH=KTAHQ_NsItIb+5PHV73&?Da34CJ!"*Wag +X(PjXe`Ca0P\n('IdN'?C[,UM'SQnOJA$%0:N-)r+(e1d2HGW-N(ik\ItiE(]AWo,"S=cAOff +LaY?pFFh"<-R96nSl,/s"cOk^9N&m/?%kE7aU&_pOTl#oNjU3kA"&CTM%UTK"J +(atg0D4Ubu)<8g^FOo;4)8e.JnRVHkj12:jb^QdA<2IpuDf@F +$g9m0X@$N,_9S03Dp.*P$k]AcfKFI>EKL5S$WR$G"2JUM!\iMYK0o.p.P)S^2dDU+GlJic=nU +mDaOl;403d1+mq(63=Pr&`gR10n.H!m<"eb_dBa\X,_&-.4()]AM;o=2E;W2Q,QRYFCC,spN0MDL0IjkA37 +_jrNK'4Nd>>!,m!equY-"\bpGrS<8<:j:HmN5sZfQ$B+!'OJXcn%M>1U+ofp2ErnQUtVf\St +&B(8M9C_gWkOj8VM4.c[O9!(>*kdo2U(Jdmd5`,WEaQ,0j]A97_GEFtNgj,*D_0blP[g%^Jt? +"4Lj5)"e5Xi"&RcmK))7++cX<)ch]AP@I!@Z`mg*nm;.8bX@E1mr@5$N::q7aN;a*lfZS;N[P +u;q_&RnA_%2T-77]AXf]A3]ApAPa<0_]A8L@T?8:u+QWjUaiX&"dO(&/bn__-./PSAD-DAD`Ep:V +;d*@/;rBGLFdT9K?occ=,)[9Z-"^3i9SH]Ag#2pC1BFXt0K.OhoHm)OV&e0$ppH^7TT9"\kQ' +Hr^m9"Sp/U#1BpM*`Lk0Zq/$ND\2SJn&TI_/mU?JU+6/ +N@OG^_[l[aV-P(aojHD>(L2m1e]A;:)k4\2'=FR+@VMeh`r'12K)f)66Wd1+J6lGe?aek5/ZS +G,))L[8J),`[E4JE9d-0!MkW\HjGs^t/\Oo`C)E4mS(D9#56T%;cj"S_F4RS&(JVLMm6k['U +d]A+=iBa`+renqt!Mmt>iU_*/5KG4l+[pDPB`Sg=bUpE)V=oWdt.1mG7T:L5/Wh=?;P]AF1L_2 ++#Z!Lqkgr,6"b;,p[t>sj;g-hVcF1Uo#^.0?i'-7^Q"d!.L!0L%f%dD]A[9E%mR8Mt)`F:&=U +NIlDKq5tI$'U#IWZP^?tQV2"P&"(6Co;,p'JJ/Hhqo_ucHJ%8IdgMV42SE9-0S'NH?p)7W// +T6Fn&6'Jp2FfG?#/09a5r.gM1qeGG"*$H'f7W%;XTW%P_SR5\q6[\XXpk^Vq!2T5P)Il&Y\Y +]Apb"NFNGK2BJoW13gTb$2-pRVL'a#//@+XdM]A8^SpW-%Y+&Wo\!%pZ?rf979pQ"+2hNaD,L3 +T#J\+"%?Xcq2IZ#F%h)N`qQ"f^nmg$6bpZ\J5Sk73Rnd('SXkK]AJRHbhi*3"/LMie4LE:2q\ +H.ba8V*aj4=S4/L4F@Nm!X&grP@c$)8GkcX/t8Pn4DVq;IUP(%N-4ds`s`>=_M,CThi!q71g +gg&hF9s6Xd.Wor+B^SA3RV^^(Z5BL?[R7J8CGp0DR,c6*gVPWpm[J4u'IDKc1aV]A?;]A%")37 +!p&:M;u)I$(223g[c1NORpq>0OaB^"p7Z+@X`9&%$Ag4V&kW6lG4,:NI[je&M-:,f5IWFg$f +cI$[/_jF=eU")mq]ABLj/RqCL7,u&YHUXGr[/o!?Du[5Q\HZaq^9$Phjo6eGdsU"9bSsHiRsI +g^W^1Lob"rA[j54X_g>fqnl?*RV\+MI@,mY^X`R*JU=WOMY>ph-2^R6(a=NDX='fLSfJ\N1d +%o\Eng#$R8*B2\03:8JY;>GXT@(46R[YR+&(`n?0ghBq"XUjnaVqbXo6/TS9>iVCCkCH3"@M +4[>h!tAKni8I>-)pS4;8\bbi!EWVD_s[1JNOY6iYhY`$K'8Zo[FHuC?(o.]AU%l\R%,@;gfdp(YAp^[; +Z4\8=%^gPW&r[pZmqbNpFb-D"+"V^Q&m?ZUU]A-`Jfm!j6+QU"h\O?2 +9e.ko*4Dh2e<>AhHhV-s157']Arh9;4'de5s/BWcV^='*U6ePu;$#[AD;#4Lfp(Bc\e_5^3>A +9]A2E28u\OQ'J2JU!%Ie'98g6`'TW:a,/mT:@o@pIosUB^osr2s#?crq1NtHRk]A:6--#.)=sBVT$k%TC:0VSefo5l:Rnl`FcAG +8h4#LIr`76Lfs.`jp`NKR'X&-GU+cUdpig/o965G!/7$%hW3/=_T.0s;aY"(JmiPc(]A2&.K, +Vl:6@hH;;`gBbRG$Qcd%^33YXsb2dh'Ndo(]AY_*JQrMK:ZNS%!l3_8$YHFH?Q1Fm`&#_2BRK +k1iZl["=SX^U$f8G@Ss&@g(:^d76/.Hf@L<)Ee;N2=%f`W0$P;hhb@P]AT'o@U +jj]A>)/a)n7SEi8JqI\P&n#34R^E;,3pZP=K9J4/>DnPqP8o[Ym4#!FWWdea.3Bk'6m5UWc<' +=)4fudmN9aZ'*KG"VrP3g\Ve4AW06'FJ9?7f\[:OWa+//eL7HGK$/ea[*(ZMgAHt[2, +#^:J1G^(H1oD!H1X6<)UN@14aqC`gc?cC$TRt9J111cU7H`;V"c>cUu8 +NN'B9_Z280RFmpH%ic]A@&8CUf@[Ia=eQ?N)Elbql,_#EU99[D8P"5_5UmYQm[WYd%Qjj2#lD +EjEASjp3J7pG$,;Peh$17omc'[$QM7U/?^cn'GIhfF.qF#jKf7-DcNKnOO6-@F5ag]AJMR$OY6a?0^1@ +QqXqU8+VUilHJ*0NFGRQtgTM>MZ]A3ehj%q&7rS*Vb-'Xoe?BS*T)Heir>Z5E1PWY^/PQ$ad- +bTd8t8Cr+_V,N^EBl"Xj!>f[pn3q+oZ,\d\j;V//0(KcOuldalbBnJR`N58JH,R(5)FPE!8n +qrr+\AKF0+jDHs1ERn_'7o=8,?P2d(abe(7X\^fMaSsNU%&q>]Aq)fN9Qu@ssO+/n:=t +F/-YLi5gE5Ie?Cpf.MHF:2*aNTB'7cQD/;/@G8fH&a.lH8%ij +9ZsV@A3Pc2-H41I`",X$WA/E +h5f(q07qhbH)$/[#M+SmGZ,m%3QMT'X>eNK9.(,BuAa$hWBO`)LEXiuS)BCE$UeHSJr$7">1 +2q>#LRBopHq.Ipjaq6/^=YJ]A/u_uD68.m0lnQqJ,'!O9:%cE8GuR(OInQ55cFY`T_nM[GA7S +UVonL\?&OEgrcY\NBhbE1uc4Jk$E`^rdhABC3Pc>a(&EMer]AiL-%theYgc8gsNJe2(^C45&@ +SerP#s.>IMK_[)+e$&_l0/(`F;"oY]A#7EJE@6*#[!]AOBD:\fl5;\T*g)m.#hpY48..s4jQ8q +%g*bYaD6e\c;.D:dFm;KKD54E_c1`"UtQ=%$-g^@dBu2`)f>[)f;LYKes]A=m\Xa]A9]A=rk-`D +k8c&/kIkSNNgD`&qA +,ZgS35hSHTEB&;iF^lbonE9g%=$,WLt/=0H$[_d]ArL:j6a^NTN>iOh`Ro1G9@qNR\ss't=)2V"f$)h0o>-WNpn;C)L$9uUbPg&328:<6Td^mb/rPdUH-*MAl[4&/9enEdGM*etLTn +;ViauR:^2D![1jPeMN]AMd6B5'&GkhR*:j7)C+4b)=Kl5[h%g\O>p_^`pob)2'tV@i=_ekX;F +HjsIcMjQ%.,om--2_#4EXN=H05]A>=hTi*1*?$)$q;Vu&daFGj&kfl@0PZ%tUXZ#@Ob%b9t@: +B+92#&r4[")ABTYK*RRaXLEbLC+q`C`Tsp6RX@KgnoR(K.l1bQ*R;LZ%cZDOUQ7AJ_l#iL"b9&\c.O.toEaHNo_S"EjuJ%AlBgEW&CmB.c#()9gN19W$KH +gpr5T/aT[a)kqlfO0B,;dN%*4#F5G;$d@h0//,5`_A6ji)^T`4lX/'X>7.uRaZA)eeDJ&d%M +EdNc;^PHZ/NomqEKR*TcQ@MY]A6;V^o%2-:+)jU!O[tZ_*K3%SRel(VjPRs22dalFW_n/'=j0 +u[<&H#1EMN1F`pZJR(Z;1NlITtLXqI7!Ji2L9GGW`qS)L@os/?S3\GR!I/>7geWgK,X1B=D7 +b!'Mbl3]A`bb'2,)EiEs"?FS;C6(0G$5K@AWsa;";4g"Ol@KA6E\R_"in-!Yj)I[mEu3?_.T9 +1$Zk^eX%7/bV@=c>o((1V7rp3Pg&bkVe#i$_m4o=->3^3)*0`P*Zh2?B53c_[<(%O.e! +#^Ba1IjHW"!Wa(!ES'2fG6%LD)h]A!0'8WK +2[u2=8N_1laadgAIAWndL=YlE +oM0jDf_apY/s-t+RBYAl(=.nV87j^9"7J\dc(?bmGmVp:OABfE@u3+X&.tVHsXo1d[Qg$a"W +V)0=s2`ZjO6"5bt'PMM%OnT8[T(@,W4e!,X^C&lMYUJXT1pRp^QBWr]ATe6*5.Oc(%b55+J.H +\V4VX7pD,N\t*-AV#E&.OM`"N8;TZ^!"'tR-u#_3L55uUj,u0&Kr![r_M8$)_&!V5?5FNS"O +f2hj@N<1S%U1u1tFZ9W%B)2@]Asm`/:q(eN`3!DVJ137e'p)BT0((A^p"Y'H`g)gnCtTZJ0h? +p./#k[Wt^kdQT#Va?*:5oO"W#A4,ih-<(%+$fU@ +fK=4l3^c1AJ/5i1KBa.C4=6Yl4@PLImO80B@s7o>c_)7h`Dje8M:lO==PN!h5aW__m_m$3E6 +@`kST;6[%YmJ`V,D, +0dR-%U`"=o.U>gtZ9_[Qc'a$L0=-YMd]AI34cgo;.6Y8Du\GM']AHW&"Z:$Ie8Z#1PEf2"[cCR +$hdHJgTI0hbGOEbR[KJD%:kg;?]A4U"C7g*Y*!&oD+m$i]A=#\jse.'B1o3%pKZHk>Kb">sY8E +O!$`Lms]ABB4pDdiGj&uBrhI,I_PLl1:Z%GS1g29[^gCf#?+X9lJn?O@! +<@Z:Ub!LN`W%_YCLUaN:?V4X$XIY*jY<15=]A +,a9B8`KX[*u$F(V^56K,u3<;L)iMXbE%bJ,CLq*_9&@'cj(#^-NI=HUrpF#=FdoQ(NY(!Q`Z@C +g&0oVn+a4T8&7TiWZPbQI>cH5?GT?coWi!3Ir._s`Q&U$JVf@;:;5H%;R=BU.f%_.LVT;sK) +cacY>cu/^Y16KR;%)eL6-faGKM`0l2\3[$aaPoqa*j9`eZ!V:NAE'u%[2hAkrc0E36QneGZ@ +e$`=1)B*&(YVRU0N:t"]AqnUGC@!h=TaFIO,/TKGFJAIcSE?A8C:Lbm$tPal5>)+&-`ub9kX$ +%SKFcLii&cP.-kYA)R1GW]AT8_gMP7-DRq[(KOI'4k;0[nEpTkMMg_#,]AVdd8&%;*s@%1sa;*ru]A +dd_?QR8(7Q@oN2T"_J%I9sc$=qn.j\BdRA;2,iOsFf]Aj;o?h^?:8XCOamS+\f_.ne"'9GC./@gY/qO.r_4''p'75M*9O()sF;<>aZ7g>m)*gciVo8W8i)]A!t4-*Dq0himccW0 +DZ9,WaJr&=co80[(eY#VDlFX& +Ir=sUoij?ulSVPRuhq2a3#naoW`kbdn#.Ct7ig@h@,gU%BT8/+1ZN`$ZI]ATfGVoBhAcofdOn +QX/t6\u0c`Pk3G4-M>).D]AIZb>m8JcEE%bnEQKp3:'\&q>"Q>ahEO?8PI?32$W!"Ci;Rdc1M +f>V+s9C"[)."%W;\8h=c.(C^#+o?DXdkh!__YZWc!`S5dOa=&m4CD_X"j$jBLD:C"A%h8;$4 +(j;i*g1-&hc'I8#X0]AG0Td+]A$HNL'8Fk.0>EFofH4ZapUU'#DAJ!T#5t%'qcPCUef9W)X(L,VblW5FbH%d%\&;A(JV7(5Yh;#$lXEV,Y,d +KHV9>2NUa4Qo>L1.%JZ4HS&n!5\4F**L\^AjE0K31KH4BR)qi)OXJ+7ojlA_G?-AB=W`t+JS +r:oeajILb8'3eZSF*"E'0G$gOMV@ogcqo,mrQSQUn-\ZCmM".%4`"qNm,Rdp4Y;B;#:BLZXU +.$\(+j2W,B!SG'FK*n0J]A=&1=cJ065!Il+b1WK+.uOq$ABYd#geK.7R]A_6gb[L.4hPk!cDf9 +iZ>W4=5DZRSa'Q;sKmh.ZE%t(*Zu+PUltQ/42mRY3+.V,B"Q5)tF72[&_iZ0uK10Tna$T7!* ++;]AAOp;M,&Kq*KONHRpqYJ:3aR^3#E:XG'OH;PsW2QkuEUiTG2\5Z5tXVHdjq?>f<.`h81e,QPjOXj%lB4a2pT@[KRM%Y@*q<.)suM,K0;q0 +E$Jpo'fU>\VX$uP%YKubOU:LcmGqeBI6)MaQ(3tro`J6iW2)gJ?65")q=ak/AW;\/+$Y7cDK +JNN9Pg?2fRDNP8h)<'cCT$!ElcJIln(1fFPeg'%6(s!Fo0Nf&PXb[d-\c>DC[4h%LIR`nF<8 +`a,b)paZXb,:eX=M]A.e^3GY:\&p+8M'2ra#`a.?nXEMJl(?OtRJ2,O-7ng?4TAa+68ajD=`) +lt-c)?_6]A;=dUjINI&SK:a1[4j'_h8=0*#osN\,>h6/:b8C>=TkS +aP<`?4Z+1^[t9">#9u/O!OO7h'[l\\Hb^hChRjTh#Q90W`ck]AO4L'&HI-Bq`bfJ"Qp>Udp\u +NE%KW$#c!<6Bm_hXeQSI18^R$8o(`:\*'$5/KF(lY`?rap,58.*n;**l98DAEs%L51OKJ+;N +O^Ab_:l^3jl7n#kOHd_eBL5?QkH@("FDu$;)UEp=WlUV.pa,TKl`/+!P(mK=kWZiD5>Uuag% +3%Xa;<%sNX=LLn*aV%NNZZ0m@;qmO]A/qZ1hpotOmt@C1quHgarb^HF-)@?QDF6W&0)Z0_83tS +>CNf?^t_IVmjRldqi)Ot"N:jSDF>b4@5CE[a&\DE:P9oWem_p9eOW6S&/EiU7=\q/l't!e.4 +]Al]A'R9?L3Oo7_]AD(_r]A7.H'K_YKNpCi]A&)$_%5T!PLG3BW`L;,A,mHIaX3^Vs6GN,k@C2)W? +P7"5?'-;F@3nK[psJ)'hh0K2%6jt-3_qi)Ot%9dX;JR%tA<1t9O)7ak*I'Ak(_kXH=^hU6b[ +>ThHf%+8\aOpkf,-e_j3\2c'kgjT""kC$YU@VHiiYUZ7^Mam[OMGf_'S__cFHM$4eeirSWIL +Y3f9#kb4oTe!'!e,VZX4K6Q"FY&Yl<3lcnN*dH1L%WjCItd_Y=EN?uC)Jb#Pm!(9&%:AW7H) +iIcA!^94T3*S1=`2g;[leec0SRlai3S'"mPNLklP@=N.tckg=XAHp++JL5mrPhO-gD4)oZ@XC=?R-l) +2b@&jCofAM2nQh-/F]Ah+mBRiP^ +DTVTSdE:I!uk"j_U\K=S,G>$B[L3a5ATh_O]A7_'3dh,4$h,F!CZ9$'@cUL=iED_C!Z>Kn/V_ +2-gZ^\1ZFN84#XPk`?rDB?nF^n+6]A'5Bee?1VqdR?o$?rQBmcb'[,YL#F1R`Cu)t9@(rSZI7m.!#C,#*"JnDOKC.X>H.M1PDD6_>=UlOilLWio2N[G7\AEW56mHfkM!WkCIdjF^r8B +BtVnUmlm-WQ6n*GnQY?Tt.5S2_dk>l1jqeqfZ=/B:A:4r8_0\>KdFlj;8KTcJ/[>1dn?l2%C +a+#h6KhD-\1Tm7j-J$3K(Ng=Dm&'6$ojJ*jg%a,!UB#`p'/kT,s6/2Bgi8ckc]A",@Dp\$tP_ +jk@CgQY/B,J,0tfjt3)]AD-C.J)uEZE+pS@sNGNF4fh:[ +B<938QTDr.-D\6Qqf2g!Tp&3L*Phq6:Fo*+^ib/_-mJQ;Fut +tVP,-O;Z<:5&8,TRf-+j>:d^oL/c8kL3JnFW^^4P=QUSt\U?]A`%/Ws`^#5D]A"c>]At+tK=eVT +TgKqER_q-e>Y5Xi6Qom3Q.8mZ/M/!6*B6BHU8[g^4uecHkfl1K5oYu$"=?SPBR:>#83NZ6i, +!9F\p=ZJWJHp>[f%F,6gcKY.`oWi:]AFnJ`$lh0@-]A9bgrRm*SY@rl4hnM@lrhQuLocYQCo#, +/h9,C]AE05jqr5V.Qb]Asn0)r;+5oo+CLf[9>$L6Yo(F3<*jkD;;lM'@")[Ga0^_]AmZW\[=g1X +tqIN!b=s*i'nbb?\NcLZ+%DD;b,"3=2Sr&al((XXXRLb,Kj`'1!a$4b>ZAYrjN@ul^,%\Qff +*c?VNC`0@haN3/LI60D6Up.)- +\u#[:5a0<'Y;$@sKa<*D]AP/]AT<)l8ml7A79cm0]A`2[*NJ7J +Rc0\6]A"Pc5q)hDAe2Ci7dPpPEB7hZ5mZop']A=U9"2jI^7sA!*&?;@ClFDbOSRSOnUUiYh'\'$MgiH!@hX +&^/-9@3J4Ls:eCB-:kNr"c)`DQ'`Q9F2?hVKV@m>IXe?m_gdZWaY(-J@q31T&fBol7N,nr*t +Y=4KVL$dWM)L2t@p'T.TJ7);!1@5318n-4SA()aIt:[=B+Of>a#-$**HX>SoBB8%GK3K +Tn<,.a\VQ14CFQC +N*6mF>>mh"d1"RjD"$rfp/Y$j>-N81o&\%*.V +W/&HS73,UqOI4J`?=-2u4Cp8VULFWJq2q8PfmA]A1;TW]A=P6Wgi"#nI/*X8o*5LZMN!L)X+4_2iDple7.=(8,Lf,%4<'4iI.k<')L[7XGcC'^RE`'YW)DZR^0e(:rH*ZXX*j2g +rgj"rqGcs95UkjS.GE;8(sAc>!Ij`b,tL.>LhWk7a\KGquV6JdGCh)XW]AGI(2ULdVCLV6bE2 +?Ef?RW1Rfpo:?n>2K;-$3+4eY763P[3CODk1:>r.7iZq +i*Y,!T>`Mk/8KB64XMpdNJ)rf?9V[H!p"8&R7qL9DZ9Pcrq[Y!2/?7;S3'5;<)imNJW9''^p +e6G;N`N1X-lF/c*A2RLB[(3d1Uajk/h0/,3+1qA=AM7hIK1q=V'tjmc334I*o5[S9*d;KUlI +2KS5"hkN1YnA2LKA%?f'F,im]AnJ,7QMQQ#Z=,"P,s;[Hf?Mb;0tcJ3=T0k,fdJ,ieT@FCrC0 +K4lIMdrMk'1`8L-jN-.)g^ogcM63NqsZ^!pLAMPQ?RYZ7C8h@kI&M4-I/5Hle6eI*KpNQE19 +Q4-1!h+VH7:A!0VE9T3\PQ`7l5t57nFLLjo'>7D\4j7RbU@k=-OXIib8/,L?!il'KGZ4'KF@ +UPPh+md8fiT^b.l\#-"iIe_CEU',ek!DORdT8SjZ4PD=LXLmBO`"8^D7HAq)chMJ+`UM+KHW +pDM2a!@LaU/H8#[Oic/QgSk0AeIG_.qKNf'JW#XD)LiRc5-+*c5b2$-C6>5K%"fag^)S:,,=k!+Jm0;hrs=kkQphPeN8))g\,L=\ +#_Z6olaGbH:KpN4"0H[hXOp1?4(4u">pZWN0#&L7(`0=S;b%!#>k0DW(g"J7d]AU!Xrb;Za6k +mF*'$o#>+2Ro0R<5"QlDm"VmFiU%NoC`ja8XOhI%QYAZp1RXngd\/#2j"mY+bMoY7`nJWP64 +]A>fkC&t/N)j\oVkqMS-%YJ9j[.Z=Tce25[r3ZXW:GK3HK2(:]A +5@_?8S0Tj`n8e.CJQ_M5@@869qq%/8.d +F")FSmhTIG3eiBbEoCH&Js%_Eobr6lSc2[d8)A*F56(md<9Q^3Da]AVQis@3.QU+&^3G<\=tR8!&?2PdhVr[cMYQ\F@]A:TlORE`4Kp;C]A$$.^S/ +nOscZ:qr^EHA1`]A)9._@S6IMVke)##OQ+u[(nfZXpOt$,h\"a#M3X8qc[!&j,D]A1ql98430a +B4148**2pd>H(=0!6g#T8eb)i8a"$XKJ:jj:!Gb:T%\V$L:'YMbm^G@q;GO9:L,C6\N80Yd.pKM&PFW:aNq<4l;EU8ThG,dp4 +06?pR"^Z1Cn3?2`%6W%eeca1-AB>HXAFouj?Tc+'pbC>05DcPGY,pD@S!P`iJg-[CD\*[#=$ +(NFi8c>.o*:t_+_>4rK2jX\kcoH5D327qZn":R8JhOf'$3Nc^p&/i?;gU=bNJe[@q'i@ipqt +.bUc+GI;Se/C`sTJ^V%3!1]Ap*d21SFeHe9SIkj%TM@r*\I/DS\%6MhlNLs^95ms-360i;.HX +rE/:3dgs8o]AX[mNZ;Kn.SQBo($8!Ijo9Wc(@6VA>R>UCJ.ZJg^dO#M,SGXe&A:;aAkpEK+g_ +P=OCpc4HT'6h-fr$[b'Tc1pV*WCY2=UshHoZ=*V,E%-uZ8oNcM_hGDF68i8r=@SXo.s)2C)D\V,*q.[87ORHuDW3=l3"VNJLc7rM)l?0p!3RB9,'YN)HhPBo>p+e/?K?j=uGmrH +1mC5mn?_c@!I[s0oekh*h&RX*]A4]AaDAs@BNV*R8M +A?r]ALO&"Z!8TV>?=D53%keMdl('pu`?_;@.JC***'4Hd3l8?g+\.C[VZ<#rOFm3[fJcYGePNdF1lsIm7>]A&Iuha*"Ebu'D(G8,?7`DH$O[XF`fiA[E;[sjKY=2B$?XKBA +#@8la1BT?uFKDeFXhHNb1_nPt"Fe#Yg'#2krAEq?e)Aq?H^79ojOj.VcSd1C8J=)JWap@Vll +mHSam%6;uaFK%Q]As6>9q`h+&9NR$U!N1f(fOhgG3*W;TEGiUW'Q5>`&h@&>V=iC87jTVSUIh +TOb(3BL#+9'ec,2*kXoQl?5(#Q+e>&[Y^Ed`O>XOok$cqHSAo^Tb9T'SkZCZ.=c'kJJhlK\0 +sb?/"_FNrDj&U"_3F'4b&mCh:AG,j3bo$TMgfJ$@*Jc^ebn[/6]Abe$&3/,1,ZC]A:#/s_;]A(i +'jsple]A9Bq?b9lRHT/B$AcNm50.A@?n-q@UUa@Q>,Uk/m/[(tKUibkDja_l3b-J0LqYDqpak$=J8OEr(/boJR/fC.+q"Uhj^&;: +QUS4[KXSu'(o7eIn.8LHr"Xo2T]A"OjZj@15#U7&`t^:sUFqtJ[meu)<9f$_uE;,L1e:lpd#3 +.1M*S"!VuFB&%Uce(MH+,h4%p;W(2ls"oR2-#;KFoBKs]A&.!O]AbqFr+$sm7osk*YrarM=$1S +$dF/,,XcfGV$3.,p/&Waii#R#O%=%eFeJkc# +5&4nJ]AQq\jkg8^:cHW6B#R@0OC?gm['%!@r)R_WPD(G6[gCadH_kb +lAlO<<#,/pGGW.oeaXmsBKLG-IgSbF-mVA0a95KkQYSpg'h3,)@1J0.%V>s%S79.mmi)#u^8&W?bV +"`%<8KX%Y5'ZJCe[N9,17^ER(#W3h;R6p_0$.NmbQ#PPRc->W03nhDZ^CPcH-mF'$.PlV +kf/l4Xf._=A0_!W5f8&qGCB![B,9fCg!OQs8Q&V'A%U*+I +=3,GLpX?b@L30..qo^Je*884;gmQ-4UWrmb$1N'%*fL]AA^SWXXL-I_gto[_GNa8V73IA*-iJ +h/"'O[:?Et!a>a;dNK7(Js4m$ngH.BVU0.jHPAp+'5DCOmE*JlastP\p?Xe^lI:Y(-U9j@-n +$Jj-?eY%V9mT9R[T]A%Ets(3DKLje)CG_)@Jooj[^NX2>Q2=K]AJ))"io9h'UT?*iK-j&]Ag7[; +pA\+)%BPM8`Gmh.=TX'p0:'(pWg=i'bQ^a50S=5W3/MSh/.5<>9/gW(o0g=8<^u*Jah8dR\h +`&p*gX!plgW.@he]A%4?_hY+dVB@IF'KtUQn)"@Wn!Mn@Gk'eHZY.UT3sWK+\8]A:*a@K/o@HH +4NI,^(CifQbHNHbNm<06@LGLT0E +i#;,tn7+'=Mt(@miH_]Ak!q&72ZKoGO1+ha*g?M[c0/@rg7=/lrnQ33<:gLij?e_m3?TpDhfE +_rs%P.Zl5J[<2WiIntJYajSPg(`W5"aOjTl8PsfKln1JNmTmHso^ppES4cKlP,KKP91_t +*$C%MCZ>2qQEf0S46Fkta1581_>a;(Dl9YdX9Mihc!fb';(X'(`<&-` +JYZoDB(if(q(oUP*,lXEC<2_q`jK0J[8!\A`_/EB.@\31&90,QnVs#Za2IbQ@B^s/smS0>.! +KXZQ]Aa)P7'+irh\!L!*p/I]A=X2h[^NWO['UeYR@0K$CMm/Wpb+WV,;eCc8;R;XOO/fFi3;sL +U$olC_nnMuII*RiZ$TnfpVOcG\WcuuB.oi@\$NDfnDM-jCY*I[\omW,9lPno^N&;Z9r$I00C +'W?Wc^kqaJ$M_]A#V5/F\Z]A8C*,Z[plLN?Lk(kGLlej6KSZ#"Lo@8NR#$Ou0/)ejp$:52=gN; +=g,3uR?G1YDcYdlJFTV_uUC]A\qXKA7G7.5qkXnCGa2dTf3St6uEmV_LM#9"GL!6=c:&]A88,R +OKO7,q18l+XJQ`,:u2EQ'@Mfs47K$,cS7EJq',M!mfEHe-ZNiIbk\3L\=1OlGArUTUoGL[U/ +K?5DFd85VU#.GEf<`&[=*-PX=iS+Mb>lRT3Z4l4W^s6coZ?oRqie_iqt#F=a+kUP ++*)D9CrD_\[PsPuS-rB0Whp7>*3;V5>3a\PJjeU+NW9B/qrZJ\Pa(7L(68tHdLqb0r?(d*Xh +/`sdFEA[IT]AuS`l*X?Xon5<,)J^bD;6h@Yimg*KG(%XkSZL=BX?f,Na6JEMJ037EYWC"*0h' +-GFtk7CH,sO[.hJ?.'H089FMC?EI-kkp$,Nl'pUqopFK[cr6V-)p@e4;^4$/3Xj54PhT@"k3 +k.1'0/"Y!-G\NrdaI^Wj\(a\634o2R!e*&9Un)if9_I!8o<=s*Tfi7="OBt!X^r=M,@bm@o6 +*#EH,t1KT_L]AXK8M5\@C2Df[$0Sa$NL1@1a4&KNHj.i%?!XS6XN\oVR8_Wj +1f3RU9^_30kihI+03PZ,dGi-'q=s_Mb+bl7WM-Jg"[Q-W=\i,>o!*n,MlWV*KZ]An>ol)uGt^04!C +@V.Y60c>P6b.*fq+/h,$o.P*/&/nep7pr-k>p@X!E5//C'(;.Ta-#NjhTID!>,#K*#&Og\Ph +VKic/%,3<-M1R'D0f;M?-2uf.(@,RVr*p["u0YUCMIY-XXj6KSaduQcS4@8\EgC[f!7B-%Bd +`7nApICl#_<^ZdrIOj*,pQKXPoRFcQG@LC"GkUTUb[O)Jr(_]A\ToC%(9,cH^n'jDaVLQ#6(q +)qV5r]A7-i3`e5-aB!/<$(Um[:'@IW"#/06)I?5,S(iC#^nn/tRb)(CCKVhS!tXjF,Blo*:Y1kQc'GE.it#Z>]AOtD;G\BU +NPnRrJKG;;'!'R[pQaj%HJTY:7O:mr3ub12)R6g;,MdkIK9]Ae&e]A!2XI1nZd[W==\@B'26^T +fnMj'?G`JPE-6q(*UZo\ +9L09'4eYX$.CSkKq3A;gU&M\%ro3SYk2q^Sat%7BWcE0%&ei$*\\$\2F[o;(EQZd"9E)EiKRo/YSTA[,6g3AG(J +b^LN&iMEN3"Qi_12:OKmg#+G26>h)f=9>jk'/pi+mFVo]Aju-6$d'QAS#RiB`Z&pbq1P#/j2? +\2)R6;-)IWA8mPa$kg?1(]As8j!!R1U`WC3Q?L`d4Z8ATM(c0kW5b!jQsnb)5"0K0UV&a@UWp +d+7:*#ZQ.`U)mR]AH6Wg]A(t3rN`plL4j1-K4MIf&Xg4ekCLsO!(C.LdbNiISRW#oI,LG't0d+ +66S>kaZAV[@:U)I;3M)nVK/j:iYe39riCrjujgU:OrUE"0-TPJ\ffIN)S7joY +em%,;Z)jg=Oe.LkN4F[[NYRHRALKjX'?M]Alru=nP*4Gc'ZbdF196LUDL,kZ80#W>8g1l[\`TpOk/s3[Wkud8d[$'%[[ +NBAWYSi$M#sm^2o8K!3&6'-Bo(7`ZSk%A,TYs.X[$M,Tt@_-USsm?3\fP`nD,\iWcKcc$$kc +`1":6Qqs@B(uO><3A>OMMM8*3.]ABC4Ir:mDS^W;]A-4l$le-K\>6Vj +3X2^23"lA1c`1NRjb,&h,Eg"BN[;"*i?Y,?VWl&m?NQRq+XhSI;kDpjU/lSi`[^&;Ia'YC<< +qYHJ@i6t2$eX5uY3!-h+]A=YJQ[C37#h:jlc`cpKS%kLqtElD12<0hG$k*%P:\a'7'V+heF +G@1KQ^.(,a1O2[KR4ds/;+g%&t3M\2#"6lQ\Eot)tDSs,#cb\%)9MU4m72"Ta?l',VfZ:!-f +-1lEf>6loZ8*`c5YaUrU+fVF$f672K&5:U^t.nO.cm6W).LqrV*Sb^I-BVNi!CEOpi8Vq&Ml +QD2h[Kr.'HSdCuQhD`bYSBFfNc@)t^?m2-J/U8m%cUr<%4b43sla+,+T&,9;dW`D%(!ppOd4-NMNe)9EF7,#Uu!P]Aj( +1)h8Up0p$a'US=M)?F@b;VocT`FPP8gc\Cgh"N^R.5s`?,X]ArRYAY;i^,Z8,no@Ipfs= +b]A=E3\u +<'%">WNZLrB>"G85'sA8`Dsdp:e[e[6@86L;WW:^KS%PqHc=78ZkaP\pdR"f8iC91g*j\iXf +e\_k?=QV4jGrY8[7?K[)bCM(k[1[fV7)paFXD/Je7ns5E$dCT3_IZVdPXBY5lo&\',]A&mtc% +2BgfkMc7'K?t62B4YX[]AQiu,a,d#ljQ@cF]ARTsqS=CRYh$AHpd-+!AcAL!rp*HD*/3/[;4hF +2\H\Ma9;#T4fII3tacI%42JUsCiE9lm/m@/Dhoeh_PG+e]ACLBi0&!tBl7Z6;\ZL8W@BX&X7k +5j!'2AO8eZI*10D'r.@ik.X]AL1#-He(&B)UHaLO,4O2#52eo"6Zk*)h1HYZPm-BDOgXCu\2s +IQ!bP&MnPa-S +aG]ADpDQJntVlj/@*\U^-&`KG1"&feDH)^_Bti-@U6I8E"2n5[6n>*&!tA['j:5 +p>jbA#Pcb*A5BOM=X@k8Y=#OVTTIO-*&&`f#Ft5pD"J78,6Sr/S.sIM3eSR$82Spm[ +)!=C539VMbrG,:=j\-V!>=XH.YH*"D7f([qmrD[:6r:eN)iQ[K5&B*Y88'7XHE;2W=@-n#m?=G3f@6mOhL=.rq(;@OC_F\'^,hF!Uk +*-T_cDV2XPlh52I3P!?cCm3;q.]ATP +<>FS-;LF,,eeB4Z0L/9[)CO=<1N2V//=]AtRqnRGChXBN/lQ'M$YK*SZdYr+Br4[%i2C6:2\8 +Q!=Ec4eB.o4UAaERegD4ZiY,-3V?,fUJ>EI.^B.88-VX?,r!JQ^3qdrqq%06s*JjhOB$P4Tf +moBe+A/i017^o_Z$se'%^'9:l.:PP)t6XZrTgD7c%`m82TB6Xfp'q6`;K%netNgiMK'jg1s: +WciR2.;>b--)Jl2X_9QFk.+'%s1l:)R),0p`^Y$\$0sO3j,Liopk=Jiif-3>"?r3[fSHuk/: +g&OOH?TH/U0bUf)R);"mF!NlQf[!`n81`#-<;S!n.N3n^,<)4?SRZ=FboKOO*te5=<(8`2P[ +>#%96EDG/gWMFTMe?730C[PRMUU2aW9'TlfMrKXYp:Er*$6Y6lBhPhcRhNlnE(&!=nE?pns+ +%$)@rbiD]A&"O^JXW`jH"=!1>,S4r`+s)U4F3=40BZ6[6@+^G[Ga.No(2H'j`lna*"S4ieTR2 +=.@R^7gGl7#j&l?-`V4%]Ad\$u]AKn5`+t/qEEL\0!RbG.Vu%bG[Pd1PcUj$[^hLQ!C;:u'bs9!q?a2E&g\[Bf%T[K/)QSbBU5O8)g="g>Id*u7It:Q+[?"_hL,fVmc[bT=@>PFj +QG^Xf@M7Lpt3r9PZe%Ufgi*P8ZgWaF2^W5[Id'A2p3aX/\5]A/_Ra#&)g89`hBojS[k\5J^hk +=0_E,\@Mgjj#Hf)B@[(*ZWH$F^e@sEN2EI$*II[EF5d=MP&ra%I[S$6cNfl!U]AV"Aq&TG@r% +!"asGW'7Tqjs!tF>>S.X\@=LE`=G3X.u3Zn\!*n9&fms[U@\sbbhd(cmQ(fp0UF6,aT`W2+= +'CEH:*/GO<;>I_LMR\/c3"3H-u:\?bX6dFO/J(F\m%GQZp*O>El$uKU[0R88u/Zl_)EjGODu +p`^FH-7\rVQV]A3Rd0tYQ-`>eN4?s&&6k&q/b$?/i++Uhh-!['<&+[*?P/GPo:ZmED\LhWPY5 +6cG.+(j6-76a/#@cm_LJjRomE7J4'0a:c57m(@EO*X[:+a'b>iWD*r5O@o2$H4gkIKnmH@IV5X!P(D7!jh9u'/R#N[ +XhB-hK?U\:PuXD8IY@4@1R=`7Y"d/ZK1!U(`&;Mi[!VO"IQh)/q[["YGU+U^]AmjBYlTHE=n1 +kY+O9i;]A!q6]ADLI"ja'P>4T&eU7>Wa:'gUt,KOctIMn>&$Jp`<:L#C+U-q"0')@Wk*NNiKKf +7s264sjm9Ai/,n\EcLZ1I0J\MHI[%+JV.FajU8>Q'\n1P0R?cOGfC)R?[o6`,6.OeXFnsQoh +Kea*q`a\\gZ:B\<7nEJEBB*8VA$Gjmnj3pY%,2PBUPN]Aq:,='NHH>6?3edALRF?[$PtQQ1!O +RI&LC4I7HN*5>B<@M^DOJQOcdK"`^YqHU4.l44[Qk#)&[_[`f64I'^F0VrZ/k7Wi&s6-X+A` +K+'19\dI'lFH4"5bj2?"bSDm2&Q!o3nn3kBC(*YI31UMh@IJeE+N"DH)=97Ou5@Tl +T+7kks7`rrV7$ql*hO/(.2F-j\.BBA4"CQOsMcJJPQHZr:b*bJAjG^O:2>@^^/UpSY6/XuM& +B=c++J*2iP]Aq[qs=BK9/EW9GHUesW+d4d)6BW>`C\J?Ra'`h8/\H1,[[24tk92kEAJFQ3PV" +%M]AY#%bCN/]A;cF)L_cX9XP*L3B"Ys4Zour3jB(8Ee>qTUCPu6Ti*3*h+ +Kt%Hj(_Qjg3^,NU@g=W3W%ts@LhnLu[1?ZtYO_RjX%Tqldf"LSi`5Ze_!%I(%&f)Q)VXMGgN +uC[>MFp>3/>s)QDOKO_OinXIp.2a=kkVi)KNN&2O@b@\olLq0sA3BI#0g,N0!JT@nVKUO29\ +IjMq+g08)!n?lDh!V0)ndn!GIBiJ1aC(N0`3c[pBnV(TiNdquB#Zqot8gPA^LY^ +uuLTlnpQ-HrGR;olk_qgQiR9s&Q6cUPc#T]AHV$&Ju2W[cbImU/)[T9km?6XB#g\`k&?hnjU+ +#)@rI]Aj1_`"eg%pEt#OrKu+Z4X^E_nH,FSX.;L9-&]AY1^SfZA@_(Sb +*>[NaA7'96,D#S=)(VdSj7Mio/uJ-?XCKl4`LJPud?NfXP.",JF!b-B4O>+,P6l/M4G=s1GU +aUZAj^3h,>52f=o7/35FtZ2VYWZ+3,X]A'#*1slX +H!+_)i./@l^PLB\@JqnZVib5YGHC-og3^FE1(&^WqYdYXh!a"m3=WkM,;YGaQM&a"KK\2Z+r +9eoKtJhPPCoB["7 +Z[=*<`l3Qp;8Te4O8M6 +=G5V":aEi4W"O$XdJ!F3,UXSB?8W=G70lE`__`a[B[[Rc>k"^9_=4+\L+B#abqmK2fOZRb_4 +b;uKSO9&86t$RZAM\pO/Y?$p'$9InE@N##/S&*47(oDR$UZJT_KE1gD@F3TIT^7"$(Z&"pXq%R89Aa]A>B#f? +VF^0?!H("d31"r)a,5Q&Ld`IjDm/oQqcZ]A0ce)2+tCta[EoEn*Z>,PjC!R2:;?NL<<7!?g@A +..Y$=/7h)E=oQ%EZE1u=Z($ns3k+Rjp3g/, +?[sQ'SbpqqmShtijOON]A`N=Je?hl%dnb@>n^GKiGppGI5ehAT@3HY/Ge%j>OS?>.K\*tp%$/ +^52:c&@)@nT`f:e]A$EI[D;Sn]A)^t,UDMo':(7VMI<2.?t_?%7 +@K:S6Fi3]A7r2nop:SSCr\;M+G%M4O*Q?GhI]AT([8eKcVidTre]A(CWIH60R,9AW)+7e>oMhC&OLfb)BeKsb3eXSa*0;*GoC"&4[ +ChpJ"%\Y%MOb[S.QC_qcC*%W?13+jI,chV69&Q>Z]Aa5aJM!'i2GK`nM"Oeg(n^Y&=%$37tFf +eqC4#`q]AW6]A^[#6oqjMMf[&bul]A,B"l.,c?5\MO&o@JhV,gt.jG.K`D*QFJ^ZiDL^,jg+J;% +I!hANND'1'DkVkc0CIeHFaCf.'4C)*dq*m_ +]AgW=WWj))K?U^,>WD$a&2L:IQ@WJBQa9t?:%a1#HMU-LBmQkSQeAlQESFo]A9tQZ:j=QM>2)> +^%^?)Wuj;kg=KJm_]Ae_(&hU8GB5W0jZ%qN4k@I2\Tq`S1E[^P>_$gdK]A@>WpWG_D@D>[p^]A^O1c+7RejW.U:ca +p]AUCGE*[+kc?Fu+92&U7r7SE`U_N/@4G4s;ab3#PIMm,V&;Q.)VuVDrOl3OlYb6ILK$2dhI;di:="4Ch`pBB=J00nHMcC-I*u%2<^Bgr1dlKZ? +N9TZ[2#_gr`gV9R0t=bf%&7R"pR3<]Ae@UMcd'MOaiUr%rPh\KHcaRiMT%eE5$9! +d%Nh1[O#`>k+,Jhrm98A$FOu#G9:]An"PqF>tp0>*P^#h$l[/jj_8Pkkbb%7/l+[11f7jZ_M[ +6h./OPq="S/]A:.3iH!B^jP@\1KiL]AhL=*.f^"\ICpElbqP^ql5jR+#F]A +tNl1SaSuWC7O(isZ`P!?[O6@LpfX,"2m5C!%k&p_iQIL^4SbGC2.OsI9oS%]AYVM/"&9fu043iT(,@U"bXb +AQN6`?87Li;E_?hK.RM@^Z#/N]Ahc^RhcK:7Aac.J"(qnSG-DVJBa1/a=l?b'icX7Pmh4aMfd +:gWP>gX*Nt%`5+]ARBs2?*gi>RE1!iXOL1Crh'^lGAeRAL-n;\[HpiD9dF4AEOmDDrARoI&+K +;SR\',&&j\5tZ2P/K&ZUI@DcAUgc[-15*=7:53-0P"[:uk%/qtdP$4:]AWO?^;(;A5N,JWRrd +C1E2*^gt+M]ASN>'+D\"ok]A9AEd(5qj-Ft0\uSQ?CZ+i!sGbEF;Lk&_:9pk,*7QCa4!$aC9X: +kXP'cm$tXOK(_oT=cW\?>+DCmboLJpHdkmio!@:-kuk_4r2_c]A6K>!IQ3p\PhX^CGC[m#\Rf +;ik>4Zm]Ai.\qNE]AseiN6?r-Y='?:"4nduaNIj58N#;i +#KqaA`XF<`jL#F8^nXGF1_Geq&Bn9n6mU]AH6nDe5+sI-r,kGiUm7t<-GTB9IMNLHC]Aq]A>2p= +kYLgsL2`'*8-[jCN+PQ`]AA0Labe&j4[^@4uTn.0use0gWh.@l!p7Q0n0\(Cd`d1E^2_6euYJ4uW) +OM(F9LT08n/>]AY"pn+IYGfZ4[#&(0*uc@d0G3KU\$k@1V>C"6)*QQ;^+">ZQ%Me-dc/gCP+$ +\*mU%]A>G4kRnS!Z.bIjJIn:k/Me1T[GAb@XQ-G4lAcS3L:Y>4UD%a3Mt.l^meZ@HmArcQ,)n +6rm=Z]A_:+QgCuR7]A!_O5eqTa<_NKqS=O^%OX3-mnlKT,nRZNe5+o!1=mUq)8f1@Z$10CkUEB +SsNdT%Y3p?fDeX:QBi"or.TF8;41iN_qEqI(^]Aac[s9QBlU'$%MsM-\@-O.OKKM+ +9&I4$)5cd;6C5"%`/jc1=^=OE=1&Y&fNAQDrp7aGKI\X[aJrZLk#C++nYmK(&W_<*0V3KKHe +qVI%9X7^mA@aE!f4\q=aIgr:fZg<9^oQYGffN[3&4uWf`@K9/6Y#`H$c([#R+W,'kR@X=\&4 +go3Sn^)#aUE+f^GUI:m"F`<.Y3-M#[RE+m,`ZL^4&&*2<-M.fcA2,+EUKHUt&7k)jQcgbM!P +i8p00@eE`='m&l(%h3ARb0TJpq4qSfK:b'0[R\AK6mq,LBXTb4jh.bN8k"cXhD2+1=YV_Lk^3\%]Ah!]AL&`\bd?HO4g@tVgUX-1d-1KLj$b('mhqR,`lCktKeq_#]A691S_VAU$R5n?P?7RMFIus3I^-) +m>g?K7nOhEp=Of>GL]AQ&`)"pX1KB=-7Y:d'4&6!%^N>OSq]AiPG6]A^5T-#)op#E6FP&qafjNs +]A]AmYr.&.`8PLaqf?ngo0" +K:9CZ!qc[(`0d=M8d/`Tl[NFMlk3BPKlWKHIn)X\c:.WX&urd*c*MYd`dtEU'L/?K,JFHQiQ`Bkc1_B6l.1lpQPiGGt!F@!JK`8R)h\,>/r=a6' +N/26M>JcZJZ.$6`/j0e`jq!t7`4<6X+$)LsKHb=Ve(9]Aj3Co3b!^2S/`:WHkOuU(Y1%`'^f( +GfX*hC/q<&IRgs2hXZ=J1jS@)X)i'pJ>L$g8p; +V$CaE>nJar(f>U$W$K?u>hdgnm.>1+[@9T>)IP[UWiW`!/Xf2)Lp3\NN+d*&f%5$]AU,pAuPX +Z60dZ)>h7;K`Q:a8'N`-Q*1N`:b,kH]ASenAiEbJsFXVCmr^o:Q:=#bAeB5hAnqfs*+KhjpDh`\X86]A.m&*X.#tY\p<]AFIns,1o%S +G_fN#J5R&O8Ef9lgr=Rjjo7&>e&,8o&XG0@3AG6A3JKCNl)`)U1"D_1`YQf]AV$Nb +/gU9O'mbG;hlNVJ2<6USLjk>9=dhK3Ut_G,ET7\eW=:PV&bW84T]A7]A9;8WOQr;'Y]AiJh:(l?mL7eC[*HQLFe4tOjFDmp&!uuObR>[>Jj::WQ&OI/9OATDDGHDMbF9O +CYIMW%q5o@Cf>nR4$s:>3$*RX[]A1i-.L'+nI/.lF=Nm,3l@*uki'Qsc!4Z=_pS>.25!T;t/i;)ko:h6rMdBNuN;>?as1gLlTke8t2Qm]AWgM"2&f +ol&E[Z&9s%"(RL0/U+$AhRCMBC(MV,/_Db(AF5duQg"r(7@2lZX<>aUQD#?OgjPR,u\%DgSL +MD)$;]AfWS*p6b6H;6#@?Dp[+8pJ"S&-$%jnhP2`?2ts'1$A[r%Y;`ZEmZ*BFHG6h`K6f#"22 +P12%Jcon'lIi=""O7#"N)dN._lm4MfX-XVi"c)-V+"j)5`]AflIRpMoFdmKQ5>U%Ih9=#2i\E ++1fd4O5]A6Y/l1e8'Jm_qFL21ih*9d<4]ARne)t8FXbat>9iaAda2&uY&h<6uWfbJeH3ZfC_6@ +a]ALCI*eM_(Y6U38-eZ$-XIo=/oM&qA*ZV[.&a5kbWl6gg8iDR`eCJYr9!6-),.tp"LP"a34'P4gWoZ]AQ_RfDd81N< +'KZd*_,mL<@060;[Y) +'`747JiBX]A?%>q)peZj;^,?=]A`E_5?)d'Ro]ALk,?Ip#`o?'Rqi3O'rW0U)LPMqh@3fEPn>$; +`BE+Pda_o^,Z2@_UQh6n6(kY;mPNiu27WfVn"MTf?EQ<1J[:T`c,"?6jQPn4((51U;.kFKgE +u/"`SDP7R66,04/_K8GjER""m*L;R]AE1_Uh^!OCnn!h#4:p$F9M\>!^>3BSSc:;G +Ubl@^3RRQ[e/arij4]Ap?O@m30<%e&^JW\npFh0I"/YW;+2=r1@/s#::G)#lL]A_8R9\+N^HD$?qn:A.bR5,5\Z63/_m:L1;uHGBE_:WRXEX0'I!.% +BO\hYl144R]ARL5/F@K2?BQ+*Ud.f&Hf)1-9L.P=8i62a>P2EP/cUd%?Tret*gR0un\c+hU.9]AUR[Z6WS4)-&t1cA8pOq +T?%kikG\WIZ$.HA5V!BI;BO=M(ou__irFfa=@n9fjXC9d6LU]A*/Ml"@V=Hdc%,6$d&SJ7AtJ +&\hn"^4Y@VsN9pCjsN2DLkIkO!"XKs#lHEW'T^2JS-s?bQ>>CMQ*UTJ_bTp8dS9B_SFj/Zp0;T=A$,&2Z*5dXQ":M.#4)@Qt&f'f/[k2Tqb;5e:"@M;qDoUG0H5,bDPT>$Q97OPpcO2? +D9Y]AN]A4l1'6andA97NnII2Y*RdlZf3F1*W:G+TF)dBJp$HuNFq@-#0CnI$N8=uosI!nF7=0W +q.iADMF1`G/(lLlAC*sfq9L0WQ'@cQJADEOZi8X$2VdW'Gk)b`n)frHtP7gT&n<)b2'.0;oQ +JH==pIp^5tb$&!(-ge\^Wnp=`rlS7%QmK!PN;]A`tpTbn*?F_7?d7+S:R0LCi8)-H<8b8S%_T +JbPK-0Ueomo'#A4.u0kUl$Ad-:K_3?SO`dY:-;EA7Dh4@^WMcU(%)YlXN0Z'TI\(/q;_B*E,Z(E[g.&eHHTUAYLE@2-He<(8 +%r+"K&*/.BmXqkT%J+=7A_t[7)ehl$K-c> +Ib90YW&jX8InmGH]AI)B+jthVO?1)@Zqg^6e1SK8bN$D_)YmV.2NV*)C6IE8>GaIH=;JiQ4*Z +'S%;88OuZ+i.9"4Z3;7ucNlk;#BS=IC/krk9@5P3\?]Ac.*=\&rpo> +aL\#8S;N.DPl`&W'DX$XK!7uVLPTeae0lZ*)9i%=++mpKO3@DFXR,`GF58>HaiPt>Y[/aX[Y +mor)),B!*9O9lQBJgleJN_:dFS(X=n)C@TN=rB,Eg6_d[A\1c=NEHD#E/Q;ptWT:CK"I^\6V +6DG*i6@`<[P4kdFPf1pt49`c/:l=gMq$Q5,V5+)7INPh+1$J&7GTA8`eU`XVUVk2-jRR*FA4 +"]A9/"a&3qHNUbA^7CLmf0>gLB%GVQ^ah_\D[*A2Zt^gck\T+'boq[ZC]AullMB`_qC'B\j*Gj +BfBQd8q)N'aXiLXMU4>Dp,Bf>i>fgL-emr:&EiR%ei*1@l1`f,M"Y' +NY19`pEO_O1TSmpi)H`+[1sV&&&L?K#K>F"GDQnJ)=K[Vo?5m(]A]AIKX.S\JTF1.%m>2cYh7p +1#]A_LJ-e.W==GR1fYWWn4Z@#(KR@kqrl&WIc9g5_6o2%m18'F;#6N[@'^` +a@/,TK_9=9+iNi=R2qOJg-0/b#m)&q9[fj]ADep%"eCK40$(Pk)7B9os@'N%"U?:Lr3#&_>O/ +\0"7kj +\"M*c^ee0ajWToB;R&S"/U_YSJtUVRU@NA>%R/)Y#H+6hnMt#=,Gg,ma;Ib0M-1E*1?j!O0s +S1Aqr:G5IW7cm:620U^PsDmh79BNk6D6*`WMGs*+IK",pi4#Vq=eZkHs<7?1uUp`Z5qLG#J8 +)^1`o/a=(.kV`W*[DV_&bm-NP'mV)t6/"N7_ATO5\6++cNd5`6>gtl+S6*XPEfKGXl&^1U=0 +<_RGQ^FR!fFD:V? +#tTn&g6QUJrFoUd+i8U>5nc\u1QgFX#K*)LOU#Zmr!rBeB77_]A-3#4h@AqN]ARUT4i"@*.19S +:/0&Ai[\4V+=IpB+UK8)7`VleaJ2Q6[_oGI#=11;rosLb_;h,1."8Ut:4:Y2H#)T2V-[5s>O +mL+A:gsLBrZcR["'np0gmX5XcsrX\hn7FdPp2tQCB2^%r9o0`d-%MKF@QehN8LneQCB\)40k +mjR6ad,&ZG`![%TAJ^5g=Q`@7dV0K*;*u]Ap$9ffjn\P?hl`j8g*MpoA(@'/%sUG8hA]A"I*=Q +qC`uiSb?*bg"F.cguC0U\8EM3]AfEA=crmdoYs!UXL58)-0G*6]A'!o1&!t*6dtI/(i0Yn(J!" +ms#Wda$NX#ZcPP4YMqfnJ.K-sL,Eq77>5Z0`h:tt[ke&j.!\]AMiT=/NeZ'negM_W,e@-sp3$ +W:d,7&ARHG(KZKpLfJUW7ocK#p\t;hmKJ_-%TgY'n#k&Pc7p[\1,b>oFL^-j\I>EEL.?Im!! +WUSXZTqYd"d&,='%4Xe_sA8FBI`4h'`g3RsT77\%;1=NtVoR@RVgLHS1N9n;tO)a2n[Q4D,#(aBS@ +n`I\jRNi"(_hj\,P\Qe+FDDD\LZ8THa6Qq.(%8d@`tZSBa2Bf.^8#_6q +g,*i:V-S5]Aih5qB';uP$"PVkjNg;JRcC#DN*>Lf./Q#`sc*6l:03e99bZg8V;=5P^S;)&(X? +p6\LL]AU4\9s,3\3S>ce4kR_*6lKG>W%?*Vp;O%T23ega@/nM\@O]Am=>Dj)H\&)CEf0\g0^th +BdF-eKnSb+q3&inX@oI41CgEgr_\<%uC]A:u*p@`B!Yl(4JD_?SHmdh%S&u(0sUsfkY6$WWeS +?IeYfgIO9":P8JY+8+#Or@c:E\pB:fUNVo&]A5.TR)#,6lJuJjE:.Dd?%@.PZZVk>T=eo +j5OfhC.89cF[<2@`fqA6]A;)*qQ.=CZh(Gp6=RN)m33Ka%XGr3:OcU9!<&V1o"^]A^snSQj%3f +]A=%IC!TU$mn-4ZS*p/i1*i]A\nFX1;QZsIFL\(;R>IEmk\5*d1s-B]ASmY=MGAJ`2L\ +P=j&AR8S.BJ^U`B-'DfcYF>ltGc9i0]A6a:W/9deDZ]A9)+.nF$!'U>;FeFL!Xm-Y1sV">m)Dg +MA_%$WJ4E_[U/_,F%mpn"[2Q%>ei-i>M"j8g%9#P$X#1Bq,#\&-_^No@b-^jJNA@%p,0rXkn +'Pd4SS\_dIb22S(PZlVDT-:E]A-]AbjBZ88K[1teY"]AGjR&EeFQ-#Lm#t)\MW^9TM_O?;QZJRC +#QTWSP[[/7nKbY>f^\6W!U#a%`+eX-A0(4FQ/ZHn.`'^b1J5JXOd3XnWkenahd*MiH8`_d(N +5Hc05sS_E=DN!e\@bQ\>(\<9j:*qo;0/-R07g7d-SMB.b#T]Ag;`-OTgdjSMKPkA:n=EH!>=( +9D=6Dlg(($AT>.U1J4;.3KbKL4QDhV#cf=YB9+4Gc4kQIoU!6*Bi$+tVR;Nr%EZUXnA`CI8`N+L[/?Q7em+[[- +\;&4LR(#Un0j!N!haes]AX/A^]AgKh&cA@8'V^`O5eH>E-9B5+)EugbQV&/jR@^)\!B+/%=\,j +_C42[&A_T&qp4>Dsljl@uUJr4h[WI`sHZD#8@eE.X<$k9OQFUQQtD>)NaeW/@`;S-_59=EDE +F0\B2d?q=:\qV^emtln1/QG7?`BmLFFFkE0>hqRX4F"207?[3P=?=:PCNdp!+UR^i]A.D_.V.T<$Ofoh=RM\).dFtF)]AX3 +mGC&25<7?O+(e\uq>>irp-Rtf1FuMWkhG3C-TfKM[4^f:%Sl[g.Ou5VdoCEmbcV2O3RA!FAu,PVdA7n/ +KVdd&:aCfD2halC:o$,V*CsYq.^$*!O8^Mj.oU-8jtEnWVm>RY]A8jc[R_uo*)NV>?XtTa*[: ++$EVa%LW&kc!HMGCo&B6imh&Z,65:bg5Ud^jk=nJp)07?_*$CLr#jXDm,P1bLr&_Oo=U+g4# +^&%ecB^!Nn#`50D;R3s0@VpNV(_mW->#nZ>Hr`g,"OpF(1F +@KdD(R.qf[[t&-f/oaEW)sQFrPj`S(%*R2DGps2`8"=^AdkfAbCH+_5ccUlJF5?mZ.bcMWOC +-o!i&$A>F#k/Tn3<8n3ncm/t.50P&Mif=PtmKAejP36;SJ+8GR2Yi*C8_iIk*JQl<1g$FL?BLVaITK!SBkL3m'kQi81\Bf&BB,M.*j5u,:hu6R;EXME%#\n +rW0Ecr_0SpH/;8NPfa+GKXa!8Z#WQ?0CA5)H +K.8)i^>2j#S8L.F&E^r#C8*tr:)+OFcFg?OaV!1iEtsb\3bg)jW2M8JOEQMqguJYeGl(b&7U +X5+6c\\C;#%L`d8=*U,`SY6RW`rB0P9/9N9H0M?(K[*?[/9>#bA-#O5mb0Dd@es@^;2,3G6pfZ7C&RZGh(dqpcTVG+l&k +GD7g-^I'Eol@s="WdiA"2ZK`G6.1d]A!]As1E:7"d=;-&4?WP4-?-OF%UqGKf-X.09C>G_E3E_ +$jqH(@>4sDEfi+T$LCQ;00=-mKX]A?<2oq;_=o[ +u)@;5GO_-]A&]A9n0E@naW2e`4L1.Q0sW$PNd&C>LRO[+^gSpGN2/M1g +0Hb5`8R\/,q:e5%>EZ]Agf!!WW3jOfN`S/b*`:a.)2-RUQcHZTteUE@]Aaa\Bqci-*'_:bDHn8 +O25.rcD9k*m^M2M)Dmnn3c#_/O";PcD!\ufVqGP'Ve>RIQ>lr!!h([Mod5.;NN;#g\)#mn!eq-2@9Ut'=,f?o3r9VS/DSH+ATTe0t::7pK_ +C]ALUp]ANbq$3TlN9j'b]A$9A]AE*C=Dd5Id0KQ0&!H01oKfoErjgi?3KAMK*3tOaq,-9,1MT+r` +UF+'g)W[05fb?`KN/?mS?#7AR3/^*oB&jjQ>r1\b]AYE%rOS?Mbrb+,DZJ'k^fhtFi]A&2qm&I +hAq[B4=ZLbEbT:$/#^bWe7=%-]Ak2j84?njP+[XQiZHK:qJ`KJ54;t_LS"G*b&;T$D< ++Nu`-ElHT3=.ajDlp%>k^5Kuil6k2q96\%rV_Y+@T9,S9ufesBB'tDSUh2T<#=SK+q'#IQqp +QZYsjfe!J0R[\Fc%):RG*(UrC`OO.Vg>a_\+0s +PjQM2DBEqgZM^`)/reJTmKd*%Anh!"d`!D&'@5lW"dcQb_+m8RpV8'Uh#,H(?(AIq_n<\/T4@d +-^F/1iX_(J-5-[B-km2nLQ4_mi_fY$<:q2Heq7LMBjjGC2?kA=k1t<*eTuOr4DY.Z(,&1b]AG +uA]A&ifN\((!B2eA3DECRUrJ'K_$RInON([D50OL-sS0o!5j82D,#N[Agtf.>d*4L8LXgE_@; +QqXq;p)$c8#Zsl<)YfS?RN/SEHCgQNK6IU;bCE8+B^l*Xs@VhabgUE.(5!S"V>OTEG&jEu\q +!)X%GKj)>0*VVYHgadBR3N4uHaUUU_?9eUGmc<]Aahb,*'N*R\NZ'*5@RNO[I%/dD4N_`Imeb +-H^U+f=O,i#!]AE2Fm/s!:=bo:Ia7>daHUl'Q,MCe&?'S5p(o]AHAu7Od7rU#*o;Sb9GF8)?HV^NfuJ`@b' +Beg:(&1j)T^kSm,'-QFmU@_L)?0;V=m=9Gu:h!Y-%hn\A4*e82l;Embi?TS71C6hkLg1"FBR +?Z.I.MU#Ft+qo:P:MlX+f#,.ap@pW.MeR,fJUKh(G[sK[ge*6,]AA/#^`nG\;U2DTl6IKslQE +1G[5)C1)nKkY78n"ZTi?tJ-165+D:@&\78rKDA=B^!RMQ%Eo\!A,cWK0uo&dEB=@5X\!lU*A +)<3u/KZ.o\juIhXcM&[1T:Z]A+7cHomU\s`Id`8,1Bd3JOs0A^O8h\Yn_QM&ZhNV,.0r +5LSlbLW7W%1\61m/uguB!^mU8oN#l$]As_7$*`A'*Ph9TSB$K=fMB^S7L"A`X6g#i;.5Y3nen +d;f25pTqS?(jW+Dqs**iPofSK="g^68^7#.miQu)X@V;t0/'Lh(?QI%R'sGlCNJq#1"XDD%; +*`uK6glQ/K`>VT3oh8mtbJMKq@72=faPi.*0i2InbI'$B:3XbF326I8s#/]ATPm^kOILa-h*F +'?\]AtL2Rf$$aX.s'jHI=SLbT;og6nL@nI6TBO;#%gi^*37%M#P7,6$]AH8W5CJpm5hNDl`3hk ++nfG@pk\Wfi8h'\a9$F:1\E%eCA!fi04ol_o'=0^c*errN&2M-uqn(Bk^.58L`oumt7C1P+O +0YS-]A8iNK'Lslj2$Lk2k\eNa#=Y+h1;6f;.U%p,f+s5qmCFEB]Am"$o$(/l@ +^mleEMZBP?6FAXiV4rK)[7"3Q*]ALlq6(LEZ'Pm:hOU>OATVOf4L"ZEg2qo>H)5f(4#Jd8jr21[(aI*\UNbS6ZI2*M3In>#@Hq?\n=5@=-Y`*e^$d*_>BpK&n2p*-9 ++KWE?]Ah]A>eWfLTnV2*?Dd]AFeYNrc[1M!eKh`SY`-XA8&.+FU^63;M&@A]A>@1tB6WWO8eBej& +589'lFQhLhm6L($f+&em:A@.USTETLN:Bk;aU8q(fmLen9*Ma;D0=Fl4mq%cKPW0;uH9jN2i^JNA +F)tFKFcB0j=;r-/OAt00\7K`nNq`5[Z*C"CO2rhR7uRhV\JGI&10er`]A/O?nH)I8%"Q%Zj<< +NU9(R7X7Xu5Zis!.dVl%Blc-)eUmrPIA[qCia\8Z3=DO#9^1NQRD#E)k< +H"$AB,;i(\^r''l#[j=$5bjh_S;EtpO\b!&7)V1l\f\@L4WkEjf.p!o%_:O;p9I7JegaH9V0 +q8cLGI.pU\pBRQ6Ima2HU#X;LG9SD4X@He2`s_!1_a\A0E)5T<-)@Bb;UZF]AG7=*=![.dR>( +o+(4oGp4!YSDHj$lj2!@cbVPsLakRMm+Q$d'!=L:gl)beE5g[aVXd0&K72.<]AE0?I4WH)mY)GLBgS3]AQ1iR*L9UPk%*X[->n/6`iPOqeR[plZ*>*`tjtVp,<$E7uZRq +tTC9bN*c\#94U$YiMuA)=_`A/oaU?J!E_GW=A!K?\4B2gE;5rCH]AEMIi?7*!%]A'Q5!GC7XGd +QmGpIc+3ob$*3&im=74&s^.8)55Jo>JUAXoCO0kWAejlQgnOj2\d.lDTtH#[%YWO[WdPk[L> +N5aj2$*\VC,^oa8;!8"(hV*$9/4CfS7;kRb;0Y2h0"4pYlXVF*Odd[X\d#@qf2sp2)bWjH,G +C'V[\VjG'OH^'f?^.h#j:^cimhO&YB,E:g8``E`bnXFQ/$e0`k]A^\mf)ugNF(5ko_O*BegNIXZ`WV6tjT&?NINR>K$]ADYj9*,?!%Bp:=A*^:3hm5T*)q!bT2#]A$V*f-<@1W\ +CA&L,m?p,o8SnB*@m%Nd6_Bi0oettpMD\ZnVMba1*+HObr):=A"7KgLY/f(1<2nO!#>e1l"k +dX&UNqc0RqgejOX:qlZca/ok%Ej>3%b[SJ$UB(s7`q#3hm^/K:5ibcHVNl07GD@,_RN!m8#8 +%$Y:`Nt#,NRYnk043Pg@D"&.(D$-?_sFe!=]Abr*:OhJonbX<]ACj +NQ-cS7cg'^k)WiLi333CWifsla4[O`n4Br@ +:9]AX.\nSTATb+4m]A"mm+Q7^a:c^);&>g,/N"r9/P;6\?!5uRP5/@2jc'R-uBC.R#Kk-/WCk0 +eG"oG/J5"'&39lIk=C3Um-M3BLm+%_jcriDf9`[nn\]Aog#'1u/lPM_@o2*_u_r+'3r\ +XJmVN=2d<4J&'MO(TsZn0;I[#iqd',=R(Yqbs=='>MF4`MFUl@1NE$3#MIbIh11+mAKiP7s1 +*l0du73t89p37IoY-nZr/42+H_bg=keRTis)&'ErcbKE:+-nTR+T$Bnq/jmKB#`k"&l1BC:# +6b9J9gqK:@K,pM1*U1LHFg\bVDM83o-'d#"4D1X=mE1c>LI5(@+$)'MC\f=e"R,?Lr.ciN_Q +<(MUs]Ap:2`-op(pNV*0,GY&&5,Qb+Dnh*h?l +5"2$?S8\0N!)3$=@+FE`$e/M_/CalE`WQ%E31oa`&M4f3A#@$qq(-@Z7c7EW?7%F&)$1@?MU +NA4ZIHfA@#X?,!Hg*\9Ukqm48a8?B=s5k'dTauC7a\D,cmT8EQ_/1<;(098q/qG.D'Z(e,XW +eiL2OoahQ,6^Y)H+E/Ml(!g45JQ'?9\O%:ik\7X7SZ!j!P^KEQ;X4P>mZ+EPG(4oTf=(CbqA +_m>[5#5fl=7#>(?G``Mof3,YU1)+qHUN?GRk35SsXZD?E\Un-^-H*eE+b7)7tO@W*)))V]A>u +*AL?2Xn*LR&;fRp3O!TanEV'FM8RSN&PT"Onje6u9i^)B#f>\E[CZ8?DWaZNd=9'UaKVs&YVi[ +XU4KUp_TA]ADjJJ`?g=T*u1mEViA;AW`!s?R:p>8A==[0mf7gbn^8RnMmM3<&1T7]A$S3.uIG> +oK]A@W<9\42s,]A[a4"PY4tpXLkGhG0$c0@P#?I(D_HoT<--A8`K1!c!/[kQ^APdt +LgEWS9_IY?NleO=q^\JD6k3786=Eo3Yi)50)]A5pabQOp[Om[ZigiEM0o:2c]A*$Jt&mgEV+ +IdgepelU$-95HQ4+:E/_1mG1llV;*5;V1>\:Jj2TABh*)XT/CdM'[Tq2l$Vg(N/$n1IoQXe4 +s%)#YYSA\U/pI!pE%hk*mbf[sHeAa&>1nb%d\.%8f@j`=3BMsC/>(Z(_f4[U:Oh+/hsLFFZg +N(qZb]AG+>0"h*Y7'U\?uD:dLmLR1nK@_8BnTm.fW_Fje9`aX#\'?&X4SKPklU1%MKr[;ZnEG +YL)Ng@\Pkih?=PAJMPWlU=MIu[pLg%Ou*Os6PX^\=>f="HC@$Iq=r-q[.rFh=ot +di$E`UVT:oI]AG)@G'Z,3i[d_D.5/HKU8"BB=pJU!2'dne:!^@$`c[Q;OpZj'?%79N`EZZL[m ++NHk8<\`\0]A:uBPC%0Mm)kL;_ZW(1IZUUH4K+:pJcp%L(5df50aq$s*t:V"N8C&LjI!j7Cq$b +i'[PBb%#GfLnk1']A5!YX;m5/iVo#V_:mR$piB([pA!8^>kKB:oa*'Nh!PW^?Z1cM$1f +AS#Kei3\4-4[iXD`s;7 +CAMTH4'U+T\rdQFr+^&qE@lZ;>ReF]AD>c5NanBi@h8_KtR#FIGsU\r"2L'A7]A?#W;MP-OCRqBj#tM^)ESki'rOla84[H>J]ApE2OeDqC>L/+ +`nii>540L(Y#)QnKHgATfu[Jb=hW)UO5dd\*Z$f-(S$2OF/QCPZ7oEdE3 +es%nCTM_/cKb5n*:3(Brd282c)R&_`q+@H/@8FWP*SG*b..--Vak48ncCCF[kgEB;htflYr' +45a98'Adr=X:b!8gX-r@.cHQB2B2hu6+>(eBb"K@g0-BK6oUTp/9t&Vb[b7f>)B'D*pprI&9 +3u0YS'KuDeB>E1IRj9_I;I^$#`eiioD, +ac/3XE(ka&,("XM\&'[`u?b-I>SrPT6-',?W(Je(g?2L)1U?.=NHBRpe8Sm!iF3IO?3n:gd' +ZK9aio(`I5HeHA9s1F'!>2Nd%DhC3RKL98F8Q/I@-ruFo^`:NSSeC'CILr +iQOKC;Q4dL^0jO_t<87[9-jWA$$bX5aF7;ucXK7euhpSKF$7uc?%a5H"TA:1(e@Hj.K21/c5 +I9oE:G2cE=fA#(..N>@%$,TN+t'uO.j@BV";iVCO"oW!SC$=KiSaJPt0kJDhK&^A2Pl!gY +q*74u^dOl!\RC+aIdQQ(`2aYP(_-j*;BR/`0YDXMCKN[_hKqTg<:XYpItuLY8/7s6hV@le1O +I%\!hFe\=-t%hE>ekW4)1s0B2lWt4FAji\`n:I-fnQ>?--\!oUCSR\JE(m7fFL66]A_c2ZnRd +kI"cqOO; +P#g0f?Op^.oU-;FR!iSfiXNZ9lmc^1Y@@q-H$=]AB3(YdB6<[Jd*cqMh3"!Z>2#^8fId=Wdl? +U73e]A(9;(L?C3^DGK(P]A[a%S`+,@qY2K\a+6:0(Fa"Ld[*DG,*&7(Fc7W4rmiSP,_NR?\iGS +'>Cgak!n4[4uK=3INZ$11TTPomu>M_HF-\Q/tJ&:Hc)%0ECW.OrG.7OUi!5iSX0UeOG%#k.X +X@256m10MZKQB#9hpO>d\+#8S\6WFjJ$3l0-8P.#?3IK*-KXq9cL!<%Z6c8;B\E(?oHW"%4\1o(pbdpTe0'UbO;.mUn/;kKOM+Dc.ABl+^e@J,%HKW>3oMRTE7CI?T!Y"roC_U(tp!,r7Q9Q +n2=FG/iD\<#cn(1PqpF9*fe@8_dK/lckOfOqM=@eKkMn9Ze0-mm\t*Ys#1D5X5?8P+k8m&sb +8nYs/=3BJ"$kYhO%O*c;s%7jM'b,\RqBee\aVQe(4Fb&'Y0^:L +UccC!>H4n)+4PJBa-Dh,-qdr"/OFX?e\I1$DE-k"WtC``ihjcFeiE'.Y[f-KOpcrQ\n_/(fI +-(+V3!BpcB)GLR>lM!`SL_o3cY3!pm`RU;LB5[o=?WB2-M(!)I]A2"E@,BPA9L#GQ?Mlj4Z@X0j-X]A^.Y!dW8AdNX,LJ1TL=J'9#50ecOAVOfGt`tkm`Yi$:/T +]AYBS(b25OM@KOi85("[!1c@EDqTo"L)"0AEc`="Se'-d"pBth,1XS:ADnht>?b=2PtR3jntD +a@,`UH`:;9:$[>]AQjcMm-2S*Tm54J[MPnn1Hs(5L^t7a^uRkB;?Id=$3K_NAs5QD[\P#11on +7Mfqe]A`^Sq9ikl@^Zp1=`49Kl]A;iI=CJ+[_+[R%(QFJ#c3UjZ&Do6dqn*\D<5?Sp/cF3.Q`s$NPP]A*hZ#"X@aNrpjt_ +UiKBcVRD]AB%q47\4^5Ma8f/uK.um`?5amMGb\R<_;_/*sLji$4IdGc"Qe\r"kce@-KdhpfrWsElic>6I/LSZ%$pW>O+mcS_>kc +(P\Bku&8S*k,4JSau&m!L2:J%XPPrqSqRnG8#rlTn6jl_4CNH$0N9Ka4p@I1j0eHfs%_ugIYne6"A[#`jX:I[Va +d-rU0-"s3'QcA7t'(IW3QBB9nUNQ:i,7<4'%rn'-M@l5bm3SXc8B>QfMhU@9rE@3]Ar]ATkc9S +rLjteN$b8Y%Vs![Vf>dhHA^<^D(MH2F+14/>B@B*=FhrTF9EfI-<8hc*@WT*ZruWZ0KL_*ca +4fa"C+-QHpG\[K!jt?!k#pH[oZX45rl?c[Y=be7nH-LWS)4t$KdTgN?J'KOMKU"^#L> +L,QkHa0trF[W;j<5LMl*&>WlKJZ5UeMMc*$mm>/i*PK5\17!a>E!EC$1c2"lB`-5In +NY`GjY8b.AmmP*!dREK[2PK4BU0Yk1k#?pVpErNjqggarh.Ts1Y&&Uf[q.-s/i/Q!XI?J[J_ +]A=?!0TB(O^'8H>2&F\Jc1__u1sT<`%.U=R6kG#S_mr&4(HZeC?:[E.UD^-kA6qi;7E]A7a@HA +3uVO$JNtmB532J\E2V5N5h(F7!,U2SMnS^PPEr_kR_#f9P1Eb(XJ(dUp-<#8ghcW%7Gt]AXb& +,`"O44=$GHdAE!DO&/b+j6jc;+lg/W"H1s]A$/% +gAWnL%HQa435f)WrY:=N';tfg_BPDHJR`ko==UJ!_`NZHpV+T!G`T$-;.YiBHDR[46jAfbmJ +RXY0r+M]AXhE^tN`b5o6hT-hrPdLM7^EdP8qo"i1#:#NAHYn$l_sQj^QM!p]AH.dU>Rn6:XLl" +rXULAVcI40Cl3N:EFnSDOfPC:\`pQ*kt/cZ30/T#5BEJV0%2Qk9spQW989\=,:&V) +:mnDfth+S\[hH-d7o/'g2@f&!S-_:5k.I_8=2;,q[Eg6Rqj)p$H$jU#6?UZU:n_AB?'?,jN? +j3NZ`;l#t@i9SqL?O1%"VN=E;'f7KL0g2c*_Ics$#oW5O6.;[6'&[-F,_alg;R7!* +R[N]A$qa6tAAL%6V,G@?K[7C/qi>/F5ubIFT@`4-FEP`s_Q'pH&N)QMn`"YUdcZqi!XlRd6t>oQaB<;K$!`l8JM$i`-=>f=V#LB\"4dSfo +H"s3-NGB\7rMWIl>=$_=*a2WN$nDNA@YM8?V-?6$/g;&T@RHAP#JQKT"W9W37XK65RB*UIWW +/\:NR(u9#Tics9TS'-?q=A5[]A+#\m',hdXIjGCj:e:H:`l?'g9IP^ns',d+^aD0*N<.>Mc)i +OtpG?$BI-F*Y[D'?ZcEg?*%unMk5OlN#H)"OcUi3V#la?!CGNs2iF@566QXFYU%NLBh+s5P%4U&4H)b7:%;Ve=1Q_u#Ie"@c)CKgG.nnoRK);C +f1NA>Q(e62l"tl\GWt-,IS-/ +g$^W9R^]As,MW$cl%$c0'.>4[NPMi4*R)+R78..B:L%"+b="fX3&N"cVO!aDhSt"!:4[,<=l& +hXI+Ns:^_VPTibZ]ATfUiKe-M6%&M9q69ND5"j:k[u*;82?%s8.Wkc_QQu/o]A4[Io<(GLIMauLA5 +QSA'lp9r4IN<+)Y-DMX>(D((@I[/T^*g#q>'it[Z4OfV@sp!l%tR&Z'VqDC_[T(qM.RAgh\6DZY8LG%W'R'=BJ_.[Q8[o31:d)0Xm +!kD/,S5^OLaRa1j_r.*TqI1`D=siW/.lEs-)q]A*o/ZG.QK5)pTR_8)>I:Qfs'!h1ht<8"RR, +aU'JkgJZ,79kJ$e*M(mu:CWipIbZHK:8G0fCP^]A@-EHgkjKi&,qNT?sEK9bh.bYM@Kfi4&rL +*:r%tiX^o!h$.HH,!Olk_A"09_WBD3bJiC[+.g`<-j*a<>i3=C+0q0!mgOU]A`Rt2qR/H[q/s +al02o-H+=_'&Umb]Aj(%+W&Xa?`k[>)>\U5_=*SoiIER*b_;bbNoZdWrS3jM\$N*:;E*oUV9G +2sl@`]ASNGJs +U!RfE<]A6_dcpCQP`84SEm)`QZQmEj9qpZU7,R]A29=r+XK"WZGK1"ZN#0S`lcG]AdDs-B^mg$^ +""1:.(Yd!F4&T[9rILcp(_%#uDUhU6a6/[3LQ6SQ?ZLFscbcU&$]A?BrPa#?Kf7L7ol#^ROYs +L>9+s),\raqh0In`1[bt/!1%9`VVH_Bha#S>0'afs(p"MPYWK?p:^g!S08_Lar`Pb-n5P2O>RbJ@W\n1PBL0i52:gcMf_E8c"c*/DX/f-3 +3LB\P[6r^!TZiph_;AZr28g:1s5pGiKXcCffK^HW[%mgYmC3\"]AXD/El,8G<4kW2/L![SY]A< +n[ta-f$M@rE^X#[X0f7`c,0X:MU2;cOi4K7pRT"%o$T.+\40AJ`h)jRMj^!3-7u:\-)C7c.! +Fh5iPFP]AW2ltgXGlKiF?-hJlZde=H-0^Y)G(UqX[1_29'D3H+n"SmgB\1i7b!4,8:[=]A^6&\ +*?9[<8MJX)-5m>qFT:Um_>$h<@d3*m4#0-:njfktq44r814+Q3C^i.Hr7V:f@8]Ah((oYu1e8 +H:II7_s\0g"M2E`KG.0_p>l_U,+ejS[;k_Qr(GO+W02)XE65FMrcWS]AXXlWp??['J"YL1'RH +u4rU0H.Ocr25!-[B75M1EMhg1]AYb4614jk+4O?dYj!4,e4C$pla#VX/j[id4B_Q$XELOL?!grG;GsgWj[3Fh\? +p@"Due>T,fgTu<"^]AUQ2;Z5"Eg1E.Keo]AH%]A\`(ULSH;1^GO+rNPb/L94mDT@e +*hQ$'f,o3[&+dQ3THf4DnfTj_BmU090]A9naZ-8s%6[0IjA?"6mNBN"OV.2PEUWOI2T-Yf=/6KJqEEl[C'mI)>NY8R3Fg$q6Ao`4?"Cc6=O6a0:H/Q]A&Et]Ar +-]A7ecq8hp'R`8";`]A!U#Bu'M=9dWnu +VnY=A3eql+"cna:=;.P$DR`hnW7$f+SH:BV2LXn,pE<"p)B]APg6aK+RsjrQk!h%S.*C0Fg8h +(,mQ#q[D677X@ZYT5u/VTjM*s/7.r"6e'KH$"16Rln1+,R$gANK>@IK?%,c7jS8.P[CWscnc +#%%'/,s$coAO%J_!UiGj1A8L(*\9jjWU3(`p\/r#m:/!m/Z6#O64K^JN>*kPV"bA7T8dhQFF +T?1e;>L8(JsTK"W4!YF%OkY:$shuGJne[)erWN7Xc1I;H3rPs%]Al=Zr@gAB;R/BgQEY>FukR +s]A3J$E?DZd"nnY#Qa(Kb^V=KA?B6@bjMCp:bt4[\i;]A1oc# +&%iP%O-k13ffmp#KNglXgUJM!lknF4\6Gi=/@Q85#R2I.EdETW[s3In$HZSGCsJfsL)4Wk(j +r+e1:h+^F6I;uoP"n;:I\"9,RU?&Q1)7)X%mpGTaen,B_o)/E(D/FD)%>1X]A%@#&<09(EkRR +W4K@+e7lZ22HHR+)EqmqYB?[gL2i;d3/]AIX>\u)0\kI=6XX1>S +DJT#6S;feKB9)r`SW7C5?,fXY"5:gp$I<3YBS&Ss1?5gap3KTNeE'21&p(RI\%F&=s"3U`U@ +k-"c2-\S^$W`rUK^q+Pst;F/8M1V4aJlCgaWccG5#!oQ[c2jN*0n8#$$6KA248_I/30]Aj[G& +Xu/8[cg.EAbKPC^4nH9i31aA-Mqqrb&F%Dii1R=eh,0X6i;tf4:M[AlXAi3el(TiLjTS8j]A7 ++9u,umpAdK21P($&1*'\()*]A(qMgH3nKj%,L^]A&menWNaX'tdA5-TPa5L('ZeJPEV(-kP*8e +:@$^^;_)r[,K#CIV8VNZdd3^j6cEhJ#g/&fJm8N3al*^MD4PU4>A%iuN2/ +\Adu7UGUnYGH8R@PE44ZiE[)JG9ia?LPGu3W9k6V7*2n7?d=KdWQ>q +Hh-F9Ec*g%mQDgGp(=l]A.64lfe]A$,VLOo).dO$<1X0oC@`C3L<77A4;UTm8G>gYsM\Ja6pLU +<`8a`'s<$ftYL"Yf+un!=kn43l0EJocPoAZAK9^\s^oSU\=V53nS!0.R&^C`%KYNVN+0&tM3 +oRH>;*S7dGj[=A63jhPbcp0Y^H7UO/O35X_O:"I]AKAu/nD-&RC:0/iW3F9fh-W!lFQCA7]Ai3-sFH,DLi1$I8U+bQq]A$WJ.Y2#,d03$/15m$C*1_CZCH:cB%gr,0F`=WflN,d$-fQR-L2V +L9;L_!TDqgM(qaafAR>>?T0(ff9q\\@LU!.QPKaQ#0V-Ap=eBK,qa>3#l#A[*N85eoAS-3W1 +RHs3!C7X5nFUk^]A4fa*$,T>Dg>c[#ORFQ$Sg"7q8M>d">t-)%#B>k<*k&;`'b@'!?a>4o3;'fgSR`fP[n\O94X:rKiUZufr1T0u']AO8!dp0B>c#s +.N.oioJMtUU"(,dp#kYIJ9g;>=^P45(0SXoQL4EY"H1@r%B+spIXeBYj"PVLKU^CmI]AFdq:a +BOW(#kNW+H4/CTH\[m*%Lm*#[!F!3q9X,UGn_It1bsdh7fDF,9`DkT=0-Z%jA,";bqPcg`Kk/6*]A +4CNAnHeLobu%i-_RiBBV6l:!cM5%J=f(4/1B'-dsqltFrIjLqW[@6jL)*o0GrY%6/3kqOCFH +3.`T&W7/,e/:.ggHa:qDU,3IcIWe/7;:tYbXi9;f*,_O0OJChhL\C6iOBg62R-3OH>HsD';B +'4rmK.oN49/Jj"m/6Y"aSY.ULW:)&C@GT4cJ//?NF6#;>>KbKp%EO`$qkFYT&.+e6GIhpJWQ +TMOF_AO`7DNpU6lU,m!8a.63R0T0?(l.0_b5i6]An@_(HCbmUBDPL@hXDUhAJF'+o"]A]ACg2?9 +\@2sbOZ"r`>W:eD;4I]AR/1'FeQe8X6S!E*sLpDPEHsV'*5o@/_ku%:&B?MHq/*$#%R8hS;/) +>aj]A>4E90sqffrRESX&W&)9LA2J2bg,A_CIXJ]A4c"5$X0E5EQr():]AYEW+qSpRNO"7M`#>b4 +!.r"5j9+.7iS6^8U29cMXOnrp*P[E:]A*mncGC]A!.oR;g=,U[Y2!_b2-GUhS3hS"jMlMET#I% +fggZDiAU+F%U+<8PD]AI:3B-%BM?ORs+DLE$(ds<6ApK\`k$=i&BXpDI8;`PbYXm&C(eiK[h4 +Hir@Hd+*c?JLdpGGi`9)tp[`c3t6:0ob!V!]A[drU^"TmJRD^9bj'hKeod)m)m!A27QdK;542 +,Je16F>!d:`:='%^Anpc/lgh':P6#eG5L<[Y,D.hq)'s.=HZLJG)igQ(tW&T2`=Z%fqM +pO]A+FA0Rm.%\YCqo2Cp#2^s0=_@XlSn=>gIU?+%#.]AXMCP=457]ATR)giiae(%FcTYV?Wc7_o +(!53/g@sZY.E>\]A$00D6Er\[/&?_e.nM_;glLrK3%lgr$ +PFL(p@rA<]A4J5/,\=X&G:;WJ!7(1=VX;K9VU"2Ot:kpnt-lCB&`2Zks2*lQ,a5DcAWe'X#FJ +Z8F#!:Gd#/1Tb/A*fF\s1k.27M#+?+_8K3()=Mc(i*hWp%CuF^0G:#4)]A-gqKk3cSGPW0?%S +s1ooC9t\J:N/0*;mjNTQ9t^57U6mF,'Y#]A(@d*HMMpZ?X#;,9bg#_XkR>T6/L:qJK/lcARM/rTL@]Ar.MNV[B&P +Zh-,:UCf(rB7AIss.3?61<#_3E`YGI$enS,+WN$Uqf-MiAI7g",,b\cU"pJ5C:6lc?IH]A*H+ +!N8iIpR#O-LPuIKIslAo#>`rR1-J6C%S8#b^]A9Zk>&ojb(u7`YJM0oIF,rhON_`b:ImT'!4? +I$%,=1^l!psQJj(u=kFnWMXfAZMGC:,(s4[/O)6s1oe1Z!@sr@c%e!E3iPkIeuao94c)XQ]A5 +6oJ*V5m13Gs*cLVhbf$0,2-;c^?@<#,W_kkE^$C,a"U7^k:>+59g9TLad`6\XnO)O#j(khIe +'DbCA1Bk40D=7A?XL#?k%$ND=5a]Adc!3;[CutuF)PBUEM(VmpMNFh=JPG1#lj\jg07&*\S#\T!$*%39bQiB?uHnN@r6\PRk%HMG4QG?*<'l1%4fn;H&3'X, +hrSdN??YCW!Z&EBTUA&QCC4b)sbjdca.h_UW4Pm]A`T_Vc"-k*(@qKR@EIR2d=Yj1H:5iNOgpY1MEj5FK+o5g=qK9O-8(3,]A?Di?jdV#7CVaSBJlt\Hu +X_'(e:O:JRY:Y,D0n.CAMt7m'5^I./\EOgCKpFM!9j=@&N;C]A%h^ +AC;`?lCXLDB`t&ipJ+,j_GEbC8,7Djq#qi5W5Q%()Ll#Hn]AJ+hDC==`-kahg(U(^1AsZ;:>[ +4Dq'L"E52DHqk]AY&Xle]Aq6-rWa#8B`q5IRL`,j[B=Cc57Dtcj?(Zq8ER2UQ0S?WYSDu"hq5D +C''Y7Y=1b?J'P>E4/-GJK#4TI^Af$bhiH0bt20a)$F+`hZk^T9cp(W\F>(meM"V5O+Jg]Ah"< +`dac +O;(Jtt[O^0g%0'CK:0DL`+\)fYmR@4c-o0_`Cdg2Ul*EtWRg:n1YJ-">qT[%QH-ZM9*L9ET\ +VV0TFB26j=gI'`t#0*F?E/i,>h=9R7,t.lb">s-ViaE;@!N%h/Xsmt5;+KebBfYh;d+adLrR +6e^_N6_XT4bM)LV'U&F*9H-MA$(*;r5rcHmVpVgt-kn`=\b;``22$XuXmAKH=SXF6$9C=A"fDKN8=KPrn#n)griU+>\\30(WbZ +!TA'mKrrf3&C&G&oYORI;cQi\(bFWEppP+0l]A?%B[YkoBKW;V= +WJL@U787dof"V7qK]AmYF2oVPY-p"&Q7[[-n.6Z7k=&ZMrC-f[ +C$taD:l[nUu#mMW3RP+>l#V4<"7Yl"Oj\^0j$hJ.+ +@T7W63']AFm.q'T'^0VkimG)+4Y64m*/[+P,L'ah6JSt"5dL[&fIeQE>Kj(6'A^11$35`1g%$U^tnB+#:b.9G9"Ai$[[[_JW0KaE`MVrY4S$[[jC[C +TtiIq-'Dq_aIb%=Lh]Ate-#LINrWa:@=kY/3W2A)Y\i^Xm-X5@o0c^sK:L(h-62Npk?)2Bd?D +1a;AJI=(lLJV_qc3H7>\YF/U71OW2^g6\RMUm7%/Gd+q9+tdc>;EHQq*>92h8ra2TaW-hA^" +(rp4Zj/-g"4h7\$?VnGPtjg3MM9[`]AlE=o2N&7>?/ALZ3'qQD>U-XjD8D'KPpf1j)VWpA$ITEC=dhR5?o&B,WS>m68([aL!5I!hV5hri- +/OXl6m1tRpcMn@oG^.-',)UimYcXEi._![WHg.CgJ,YUc%7LPHJ:lp/RqG!d@T;GY8+X]ATUc +Eq-e(;=@bhRBAk5Us^FQ9e0BMINe?lU9BO'>O2H%-+InW6uE&#`oF??%r,VBIGF5K%44g4V1 +oCiW5^V7GD;E*V\X7DiI1@TIj#6kB9XYkPqL60NQJ:U:jW%8>eRS7;_Ju6IFd+lLT^naGpcD +8ATUNHnA#JOcBUF44YV7eGN5=eD?G#<+m-iW2f6nf@6^%\:oIRt30nCbd)Oa8So9R +2nYJ/&:&17:U"d\&.'::3Cqh$r#\BWk2)i>C\:70=CpdRcoKTc%$ +7NWuM4SE?&&OBAH6ta@/tUdS`qD[lmYqh'%O3iT4@4Dcg^nS&\'1LT6SWnZJerWoiRc)GjAc +@PRMJ"@EnnhZKDHF]AFs^aQrYmr?uhODo1g@;Hm@0?-U10mI>;/!U?,f*ps8$=BJ[EE,]A,i+1 +,42"U,&\XK2rTZ9?LEC2-8N]AAPdI0=M0'Z%Kk`JD?h?4IgQ,jUUto4`AV9QTD1l9_F_Gs%4Q +t]ASTmu4;"f0s&0aBgM)G2\Tt@qFO:'kC,WL;Rum:/'Bp59"r8.>3sm`f@oH+9R=mle&oT-rSjOk2Z"+nRks".I!8+U.:n-U7sTHW]A^OJA9PFTpHJpf!SBoA7oNV1o-Y4tA3rTa3&l.fI!h:,f-bX"i6jQR9MPh+HkA(fk]A'1On#(I9`42Q +L>us2*]An2+>TCP>#NeiDRhZE[<6XaJiaQDB1R4V3L +P!/J/'+/bY-sFP(KagBGe>*D[:SdT)Er-te*]A'Bh:u8%+NnDpQ`ffLAsR#VG2&HG3'"Oricr +0j+Msf0)&f",s(Hi2iSri('F?=V8Z/;VWc\dJgHQ>oC8:M`mEEH0>ui;r`m)asE5:Z'>k@T` +LQ.!tD.Gao:+.pK?11t';Mn5`fh$J3-aY[h7<#.#;RM+u(WUB1CKm@bKIo3rj%YrDBjkGDUS +B%`.]ATPM.j>&*9ghKQWU".SRDB2q\:8IjA7[k%Ubf*_J3\gBPONNoIT9aA5RVcul4c/\bt\X@$S%kf!>JA8U5^RYQdgr%6-C.cX4]AfgH;?u<'L[Wi"YdfU?oIU`^ +!=Z\OIfmFkaF7XG>rb-6u`\f,+E=9&+Y7H!:m(N_dp:X!ZZ*X%3?J[?,#t_2E/AeLU55A>H( +hMCPR3dRi?.sc@`VI6@i9&T')@@tsSXPik`<_$eo0NnPE5Cr4]A=;S$G%+q?C9oG%lUMb\IV) +Fi(,PVc\ON-)Q"FVpgj;P(B7!qh0S&nKlXVo$.rffE9K_1Q!MkdY`C7479+)J7"`'=II3EI_ +L.[b!ccGm;]A/Ptk@ruD&V:AR?/[]A,m\&Z[O2Sm#]AK*0IgF#fd)kR&(5+P?o+$QZalTi +OT;6r9[[f"3g`)+\iH0n/(>d=VM'ihDgtp_hHTYYLZJ"g#6L%e`Z(%S&;rD(Hqc?_6pe5cmf +@/4?_bcHShic4hW@R%?F[ZJ\[aD-V@B6X*&-0UCT"t8W^Kt/$1X..ellZ6R,,5'h#Jn^M_C$ +"a(ODIlJ_R]AB;YZlOo<"]AUN@Fd*<)a:9\NQRg[j=_[iS@Q[WdXLu+XqFtoWrs$GL>QS\[DnS +$O7aXb>%$86%B:2,0Pk)56GKFE""QF&e^?UA4Jr&I]AtA2a$eW*U*F_($?%LshFm7(QAmnS0b +GoriVN7C8!:gX[]A-NgGC3kp_'6FgL^XJ7,V;_h?XFo)H1foWQ^e(]AVp/@F;\LO!PSXM''&0b +CoApa&('.A\.Z0.RN5q)Hc4>dt2AR(71+ErD5YK`2R$?a5qG;[mcr]AG8N,)m3nkag#NE2g5Z +80FG4f)&=9F?DZV8oK:2;ECtL,i(WJ4Dl/0K7#Q!59<$eY]A&`(_?sM!uX@/o]A*8!jn/1X[7A +>PSa"Z&_ZL60=5XfVT]A\[R?Gc\\3`gPi4@,)*@iDQpdDcup67Xq@rL@^kbgea!\YL(BK0QgV +oY87@P&Dpss5NG5D-IN/GEC?WW15sfW4KW<=@AjkoXn5(@Wc+ER*BQ\eVRB+2nsJh:W(!O+X +1`6FcDQ9P"t=>iMJFb^E^K'6gfpag`@;TSPV6uR?Akn\NRra:QK95! +YG$^=As,p_,PH_9b+Yb_#WhSfpTt_##R,IuCs(sc*VW59.Lc@.J2J-f64Z7P6M)Z[u*/ol:* +WGNT?8u%hYUr4jrKt)SE8ftXV.-YFYLe+\*h%NnoI&dj@ds"j%WrGRgG\($XrT7Odq4aNT +t,uN'mH65"\7bjDRFE2X:%Sd6g=MNW62;bD+fj1T5"*U/.Y[.gkkEsmU`o-I.MXkd`P$M1eG +u?ERRJHYu;A`Uj*)m#-_qY&%V:h)6e*)h+fiB^oJM^3a;O*Mne)Y;-aQPm6+j2%PdoR-:TPT +T_\j)]AorikJCicZE?ksb'gp\4EC"9Lls(a0>!*BcS6-O0pIf^/+k)2=2$Bl@ok;n$i`]AC-KS`Pn++P8fCro=.#VH$d-fnp1tUA"Gt4r*$Qr[u,t=9M +.p7+q5%(@ekpoehig?48p9oru=3m3 +>]AX;?((-ne@cARU#rsFE'FX@ccXUaU=,%3A%Y7#Z@pL5NR#QLi",V@a(g5*%3K-70IMSodN> +TdV;;76&g<'1?T3VVboCmfJ_RMsZ@TbGlPJio?ae"tON$]AY3UX(6Qms6Q]A/KDD.7ig6X>3G( +-%;H`1\M_u@'h7KF2gUbh!Yh1X%:;L(o +24$GNTC),mF_m%&hm_W5("AA2 +/,:hcsXp1hVboqhMSeNEhLif,Gc,?n&**.M%*Yi=(kFPJ5,,+!I]A'"c>?%Zt*^oEc=-eh4:7 +1f;>(Th\h*5O.3dtZip:bhbOEja\m2#Y)J>`(c:<37t]AmRX.j+YG)7]A]A*.TC:;dNW''*!-'E +2EhC]A&nLHjA[]A#q*YG_$1eHJnRVZ:e`8PB=gZ=ULUIW8O8@c-,qd!Y#atJ[[[O!;*&/rX('lp-I4K+%K",URi:E,lRc>'O'/rkQD>n^@FH[bN!^H.tHf\VZ::a3g$gbVEEqb1" +fQjE6Q1ApL4T'O]AD0J,Y7[M?X4f*J"P)2)W5s^)9a:7V5k*R$d[CeJ,)UH`BJb#$!2JoV`30 +Pi8*BB+g808pRCPQ__&fh_&!"m74j>c@8;Y@8-3LX/DnuNB9G$Za2GEgsF[C=hQ^@8WVlsiC +o4u8ju1N\?NJ0]A0f1f;bC9:^>TG)T2-86`olOHUJee]AcMQmXeKqHn1#nCPY:K@QZ?Qet8e)@ +$koj6dK2/dS't.L!bbfFK@U/ne(/'o%%1T\oe00,lH[^*[%M$u52.Ksl+[LgXp9kD'e[9N,A +(pUH\UMZR-jiRAL0R__c(,&cd,"LqUSF)rQ(SkBTLjus!>E(ZI!j.RZKWeA^H?cqCM@L66,m +JDB%C_*h2*AAmLK/5Ys@^f.N$GLL,IbaBL#r<(FPi%_V9p1-jmpiXp,;q*WrT2/"$4X^Sl[U]As[=bHXC"9$n-sRf8+(&A^IE2*VpUgHsY;KSp6s +q5`,$MW4FYe*M>\8N'gY]AcTW*:$eN!G=>@"7&M,!7Dm,+F(_GMVl`ra`X#OcbcMU@+3di"q= +d_"7-jL*CiFVKnnF_\/3>EM[<:YJG$!^inFM:sHkC=+cC@!h5(:c/XNob%"YUWMt/J:kt/Dj +g5H."LXTFgtYr0ERr+T,NBK-f%qpQ!,!Zm5]AeT%*jcn>O6MSkki`^rUE_.kI;n\TXarUB[rR +dNW/,D#D+oeciT(GCq&P*STWW%qB;Fl>,M`4pYR$g+k*EY +7STAFY*\?*/=!&[FB>JL2M?1+TW6YW2IB($Y)LCE0M&6Hm?crgR*?A;:JiXV7$ljX +Ui#@CiK9%F(,sj*Dp5"DO07ZtI:G!qk*Yu6@lO>@[It&`8RYpCZAkHaB&VWs#)iCHl<4D0ts +*KBe^`<^G6$Za<=Pu[TZ#4)_o\\CB>cou#C2:$$BT-nh.4 +AA#gC[$fggAGtEG%]A7I?'TMnchW$sj0Q^'_[QE=2ql:da#ufi-!rs9eLjZ_4['8Z\>g`%I// +V^lK;67CqCb5WeKsmAFE+/tn!j';YaUuKHuTJTD0a@(b"6LNgab&K@iSCpWui]A-;UYKVADZL +e1BS5pU\os:r2g$PIoNk_$36e0:0(B+4DIIq_N(-^QQ%RM>&!Ci%#E?eR\#(e`,Kc>#,id=D +&7P3h%oa=/7&j&PDrXL8]AMt?NdAS%ZR3]AmN4bL,,Z'Z868GFs(+niOh,jF;p,Jl^*N +J,ku$8*oHCLeVs\-sT5bp8d4`$$gg0%ek_':2^Gqd',2`I@TU/:s+DO^flp25m^(r+sJ5gJ$ +"JqE-$))R$ke-_&`$WJKs=m<=X1rK2"adn[l?DlZUEMG<"70mr!%W3XoQIK<3aqf9=5r*Roc +PR$'_"O,rL']A?8C]A0>s)n%I2698O9V/3fB3f0sK6_'R^FQW9.iDn>oKc`Ult5E?3@n".m8rb\I\!"1PDc:!D/&Ys^bW1!* +EhDStXTVhU=fDRmed>6%fH2>[_&7fm(`U[4b%PZJj0=M17+Xj#)gV-CZeS6pJT^lXqEsI=7( +`W\WP)5#e8EI=gojtbih>R:8L_JV"gd(!LhubbDmWpG&A&+=-=9sTh?:=1L8'C%!_6HX"6ph +V*++K'WZ;Tj!cU`ZlOtlmN364iX1';-Sc#Qq*CD^j\L8"s8+2rVY[<3+ghj)ei"I%je6^ZGL@#E^'9I7M7[BlYB,NV2o7CC,SB&'/XiBi7i/&E +Mko]AdC\;?:*=_G&qmZkIe=G]AS:@<[RtIanT]A-4L1?]AH$%]ADXa]AX_QiU$Q$^SL72Hg4/hY,Wi +r\Y\4DqK5)-&huQkM3kU'97ri-ls%)MGo[!PSsn!'2 +(]A=4HhHOZWhuAR[&!-NCp2'K5]Ah;T/TmVo-Dp02ogZsQ=kD*u<"#;REG0CbOq9sD_VX3NjOB +5iYD1%hB>8HUA*EsLM>&AHZ7eCDMl(.4,ub_lZ)J%=(ee:)>TBU_?9@C.Ur>brCp6,4rS&qQ +Qr(B!Nc@>'*=El.i^s1aQ-0So"-i8H+=^HY,8%k1`HpXK8@P)%JG'%.[(gY$t +'KmHP4cTTZl/*[M'EWg/GsGG]Ap^T&$)kI*WuPY+qPR$GqRj2ABQQd/]A@:7WSVE\a.a-"F`rr:'cA-E*iKF#U34#oGPg@+`IELrO89m%ffKV0H]A +r3*T9`<$pCOV'+MiHdY%A+OH_.Uq:`fPibEhQ+IGTWP[aOmZ\GR@/n9h;>,hjqNDVng;>)rq +HMk+d7Yf2*O18+PCQAA\BN94h!Bq8L>2UF'p<9(phiVI,U]AhR$`]Ar]A\)@uDOHa'`\#t=Vs,h +Z=A<"ereJIckTWhJM-0rTnBSEGf!UNE]A;K's>M'E=,)725M7]Aa5C2?JC(V:gV_^-nC*ZZiJqpVZAcAV[\eo=PPs%;F:AlML/= +P3fA#9+RH[^7#&C8'ImTTA_cW!g&`!TMCMm-5`p+*bi1C.j3]A]A08g +B:>m\-8&+]A"@Wk?"f7^3lLNhcI3_tb(iI-*_48TAnTdo=@+Mr;oJAFFA>n?L5![Z]AS%deo3r +f6l_"Wgi<`'HF_I9pnc,g00`Q-^H.,B7WFP:#9b0&!p1]AIpOYIQY.20FG/+7D.#OE#.+oS'e +)VaqC5'47*WN'u9ml0@Po8ei1.]AH:3g2)-h2K*!JPi8Egt0;EC=EuQ/2(_5ARMaM.!ij:bMV +#dQ<:1n9u*G+[."ZKo6[J8GIj;oFqt=7pJ)h;)AcaUC +B8PpK3P]Am@#Gi!8!u:bJdq-$a]A\gS0aEpCsPu9-[Ot2Dtc3Y8%ih8ohQQ@PPVtaHXl-B2GM? +Ho+2CRCW&66PkKK6Iru!e4@@,%9FAd4;a_u)]Aq9&ZM%PLWqbV>1e,/2dZShhV:i)qd9-S(@= +ABIp%L-GHXN?/3,,t52CFRtn>!5:5Q,U(p7\4'.^KI=LW9-hdB:!n6e*-'o$Sj*fEK=uq8b%9@XuS(I7sS +8Sm]AG$CO-^nIssJRCKZT0>hcokt"-C$J#O68;5hHM"p0!btcuk26^u+LhOHaNMgA8\Dq(RjrDNT!:9!no&I%i+OtWjdA4pF"E0r[h]A% +HeQ\hM=H[Ak+T"1:s=MjLuFCMfZiVL5cAlP<>8:)*O506=u6g\$8?g#gpj`c-EYFj1Ylq62a"1l+VmI +gb!Z.2lVQW-t5D:F+u)Od$YVjO!u(64E8qUU9bA9,:ehB%W,=UQ'"[1NEA>ElAf#ZKG^n.Z\"3C+$JqJF7:`a&*aF=(C['iGIa/.tF: +98-MYDZ1l?(EWKdSO!M!F_bRg7j;\I^U>u4YSH>mJ#[knU,AoMmm@8F:,Fd-nLC;!]A!tL0;N-gWGdl%>akP9JhU)DVZ(4XGG#3i9+mkhQV9W).)Vt +FP1-5lZ5<*(!X88kBBkr/q'%?4mf$W5T3#f"]Ajl99(S,GZM?>s9g +LCEFjR5!k,j]AFQ74ET$=dVfru,*2V)8_T>WC(:D=qO+Qb.hs5C +7:FJWj[='/).?ZpToA)j=W1`.#q:/["fdH7X.o()A7B3/Fh0ZW>[`QtS%V,G +fhrR/#I5^1%hGffQb0lA!9Z6J=;d6.Xo8lmf.0Ju1$X-"ldk,nelJj%R9os`a"Qm:K6AdB#"Z_0G9+*?qh!Z*JUW"]A*;lFUt;O79./Zh['d@Zi]A3^l:Y*lr\ +O,8/4e8goF/Rl#Jb2Wilo9*#%`3(RSR)$G*W]A@o1$F(&]A*ZmD.XFU`%as*O+)cL;BUL\6A8W +Ch^N!tZN\!c;F?*TS.Vc*1@jnK,[Bs">+!H8Ff@'^`]A5m/`hON>b%O@52.2)B6Mdu +C$"h#0QkQ#j@YL-FRUXJdOH'T_jV\FYZNJJ7q_1k[LO@=DX:DI9#Br5cJd(KQif\7fPLZ?ECG-n(ljV]Af\N3rUjYRV(dmkZF@SsJ%=lZ#gdY)fnBK^]AN0DA4[B#;f@fBXdBfhPD2$ +-k6Y*D'DE)Cs&&J9RaA8^.+`="22([=is#_>Vk6")d6mMO/iZ8-p3&H#RAd2HdKN"Om7shkV +XtK^phW)Qn4"kLW&qI*2JmPX%H"@0Op"^9(@%Bi$-arKDq0[PEY"6EM%ZF^gkN,"?Tr^$*^< +7?SZJKA6lE"D?^'I@oJn">cEm(C$e;D#QeZEaFK&98!KpUi+V.m!G.k9Jk\joK#[%cDGNYjSGA]A#pI$6JR`j2C^66g'4#aq:5n(3f3u;&E]AS#*:%t-h>]A+(EoHR<6/PYYO52r +MH5fLf9a^#&9KU$9Fp@_8A!c00\p@5n\.rfP-O/?\$X6f03=d,=io$koY[VN0cgU:rp[Vad- +Xi\$MhYBC^Hg\rOTsOJs5HT;+$+m:?%#?`L@cB#405Y93.,V`(Sc5^l/.f8MPEXk4W2QYW;o +WH0h^hkd;Gf0RaV=Tbd2&80)-K.g;Sdkb5@dO'WLj' +bS/gf&DgI;GOTWI`^#=FtmohTr,hNgVqXh)a#.?$\1_\>h/=rs3]A$J%<_?4uDECENjH0'QIG +8Y!.q:Og=g`agIN99"V94mdB/C'=D$q+RoR,-(_gZT)75$XlP&[n8=1!,Jj+0Qa2GZfYPT=h +;b2cFsq=i-qpCQNXH]A(kc&Wb_37_jD>\@r\7GEh;b74&Oe0&/HT?-hWr(2gS,1C<6"brS_ki +Q-,?u=hfl@dZFhtK+n#kq$rWSbRmAmLi$MkOcjJJm%KVD,s(&W-;mq':%Xs8rjno"D#WcS?C +SQTh;#9ID*f,W[gN5h.!f$u[^1jnOZL3LhC5#34<>t"))!ib(M"'D/6-GL/K@-E)37Le9&6-ks-QIY6.$h0/SBa=\N! +/X#@rEE,e(X5[T2%:mfo&p_4S#0o>!Ph[8IW.-'qu/Y^F?5]AYl1[4!D?_RI_UfT=-VB]A(I=p +R:r37>AbL^dINGO3sHBV;4g[)]AU6r.VoNioLd/^PA\H[fA'2nPT`e9X5[Qe4Xi;mEV\Df0m' +24-s.98A4T@:X[i[$9QgY/PFH?Pm#Y77q[OBaRrcR:a-aP#@D?@?2N*pH +,6/YYpa\?KC"iYsUDQ=D3h_,HcTT2-uMf4j`FfQCl@$0Z"7o(c]A'*^/52o$*.r]A_bq?\8^Z* +_+F$TQks@A +UunTV,%n9Y9VK4DLD"FhoEG7KBu+%qfX`od.K?n,O7**tein%sJL#%'1frASh'9S6h61[]AdG +OASJ'@JBU"H!FL:-KofC\E(S5!/!sffb.fet+m%?m@Qd+m@BD=NIYg_oC-S(VARmWhJGJo`j +6Q<3e)O"\Rg5XH)ASKf?i&a+a4t\65!\uj)399g'Zh^>2n=9XCKT)"LM-m32IQJND`N,pM(SQda*Y/n`' +q%8UADdHT^(p'+MA5?k)GK%]A_6.M$hmI-p(oc#D;'2LgNI!!:mZ2C0>@$S/s+s(iV$.(>+3- +Zh_2XFSRbdW&R2g38]AasP6DI_0&]AQU4MQ0/lIh4T*ICE0B16%Pa6oZl +PI/EH6IUV%PQ'GE^#Z(9`GIfi?D^po7&]Aq:_TG@1:r<`q.0rL4!J0,eqgg?k2g/.BbHbdKZi +brR/8M0nbWqmR!WDu*UI/W7o+qh9Tj)a^SZn*P@0hSnjW,t8N)*(L!+9_F`D;Eq8h!djS)".(bKDk0IU$5eJ&f@oI_H$":Y==P!,aqR3 +7cU2a5D$NpBAF^=e'ERc@?Y=[&Ak>_?<(u&KMMYk'J#9Pl]Aem#*:4M3&inXQJPs99RmpB4hV +no*X]AU92(CX6\Bc9(#u#Xd;4u+J5gQo;jO64sS"8)U'9kPjq2]At4F79e#eeh>WpMTfABk^RM +ehS&:h35_5dr:,p;19_JiSfpN`Se'!'DO==43E`Q6\)t]A[^Hg[/58h^Fp(p!=b8AUQh1MO'b +_7E8n0Wggh6j_ZnWY0Y\%_1;F=f +oK704K\CTQH,@KBn)b*C7FP" +%;Y)%:W3eU$oa+@s\bS,C"A>Jldm24V0@+gS9tmBKIR,G*c\`k7'mM7Zqstr8>SA\hZ#R!eO +tLC6LGd;7[t0$f +>FoV=F:c6,_p]A[?NA:I36eT`b*3WrV[bI'*Z&fQi7dC_>O)<`TSBVd>DIPO%5:72)R,YMPQ1 +>GT!hoJ&p'd;G:9]AKnY5;&Q,j$+S:OuQ9moh0/rLEM/Y;h!n!I#mYW,l\t@kP>6=k*NJ#QE3QRi1Gb]A^P[)j*Ij6((%?\f.`jh*=Z62b$77er:4p! +NO&6q2<)DM*\pg-.4LPIji!B]AmIb"5#Ni=eQ*:PGHn+kDfjO)s<.]ABnV&VW9a3r=QL7)Dsff +<7iTF.@9l%@lR*%IV%[m3eMB@)*f0^se0Mq[3-T8j`$#EJ$W.2^4`lurL?uUK +`-;5W*(TtHbqeCi,X +R^R!kE@n=\u76jpk1)@OP&c17*Pl8o(7;an?sMGrk4Y1?sk*)`sN^kh`#o(qlM@*bZ<=#"s^ +qMnsj,E_>2mZ\+j.FjE`ZcS4=:%'ta8`69oP/bA3c8`\(F0f@7;8i"lhtM\Eq=]ACCsr\C]Ae$ +/2=PcZZB&Sio2;_bNRd:']A+/BdJcW7&pJD6UR\&6LCYO92^7g!-n*1+G0(Td-g53J>qRbp!:LRc:0>Y7@a'_?^96O(NGBpY)@X6%RZg^O(Z++U8I*3M_*M*^RuB\ +gep?kQr#l]A46IrO(H>7FR:Z@cQ]Alfm3d>_%;"$WeZ0YC-3'-V[X\fE.C8 +WF*CitWL71B^!,O`.?Vm;rBD;^SUoV>K[PgC+1a#F0\/f8O@B8ZD\)BfQSGKj6J7%bMo11"3sG9fB?S2fPsNuH +T,tFJBAsLRU'_NH[,i-g@'qnUcT&%Cm=/b@%Ju62"pUc'?I^=o"pV,C=Z".]AH\@'*^h?-IpV +n=qZWms'$@;lJk@m@/J'?I^LqJoC'b*Ujj@969B4bcTQ22G`k92RUJAF/3>h[K?Kc8dV`&G/C9sC8(L;Yk^W("H +#LSPN'G<0^o(,Mb)9:'UDIIiY/)/-o^l)F8r#2c4[bb-^=.OYb'4_4M[JGWC&#\[lSIH0g^]A9h*IbNmuS +aES1nVH8kRrPG#-7554$lJ,_-rkjNWEZ0T_e_'i`6A#$MAP,_l&.\]A1t*OpoB,f,T+75e3`/ +bV=9L6hO-T<,e(&9CN_=GM4D8:"GVe/Q#+T!4)Ib((RreoA;X0cH>&5f[(*Z.60kFp\,/bY( +msVt:0`oDU1-.>;))f8t7->qW;uk1Wa=k81KD=g,`*(n]AB?7joAiRjL_RjsI9:[Y5OT+]A5FP +1eK10\.ni.Bs9JDkk]Aa>QYD6p$E?;QA[=!d+$VAqCV6C`,W@<0eaR,IcLD8M$L,O\*0r\dAc +Nm6"*UYQmRCh\)]Ar*u%a>?u;mZ?_mgbi=F#L>_H=ngZ)U_B3^HM[4 +R7)j!JjTRK\?30:mI3_ERJmTsS2U?tE_F4KR#&#IjH\A^Qi?d8;r(dXpD`Ja&=W_6,>N7HI* +R/#l]A5N")(L2l"RV-]A)M3hJA/.DpVrCQ#Sbpp;7Tf?XC=:X7Q*Gd0PGZtPsBQ:1#8en?8*TZ +E,%h!/:>5<-A4!$M-J@64nNT$.qPi+u.`e&S2FDc%-h7-()n0$JqJiO&TJ1h5]AW-i[6*@*6DokSNS< +-XYdn"g)C;oN=`5;;80lA>fO>H:03;pZNC^(4eEG3W%N1.%Y1@Wd3dEh9=0Webc9806m4VhH +9P6*[5"i"iXT'pfmTalKJ4dMo/Io;3CbAY[\X1nL!o^_;D.(`^,8J.@dAZhW4 +[1U%H]A.R/;'o2F08ORC)E%D,).UWc'Lk-d2<0$aY@>jiWQD/*PH5qXV#j1=Z12mnTW6AUtC< +:@Hqg1?S.:l"h-YBA;LHbUDa`PcT\9,H@bYNKu4U?_H=b!WGmi.m@=Rg_d\$jP<*3/KOEVMF +0`4.+@u1XS83(#",*(o3SW`W>/\1>"76uZOnYj$=GRqB9iX^jM;Yn-/s840,q#'ke)*l2(6T +"j'^[H+2\Qu%N8'-@;$[kSBgVd_EGcK(9Bo1[HgNsSi?Y'!1IH_E-X)Po8R(0diUHRXM%(R2 +0phjP:?,*a!,h6Ge4Ydn+Mh*X&Dqqp\TASN>Q1fl?C_o'=?V9b]AI-$+@eQ,#R?16hBnnh-ZfA[Q +D+cX>X$YWu2=6FIEp9\+r4V)".6660tp9W6mL[B`SLl/sBa;MT^&[SM!GffdZSe%`*6&4RSR +%c.*AF1\1$-KCXLs:9^2!%n$&no<&&RNj_]AEMen:IMrZIVq"mO+POCdDh?In0H1?3q$Z[f??`+nVWX72YErg^(E]A97%Y[[\5_Esbh=Zm\&99oD>]AP0a$SJom&AJ +&/^"G<)QV+*#O:IECmF)^LX#HBSR]A7QqFiX-f=hX3[0MUgS/X^1]A__J!,DaXX3V[Lgqc,RQ< +7Z1i(K;!so6uU[=pZ9FfROXbGjf7MmMB8)W.2Lrja>rO'-#ccXJW +c(35\B:7<"<.ILbOEB:e%JPLp-SN`j3,ppmEtAR^CePT6E1_KD7h +_L"n;X9Bii:BscRqLY9)BZoFXX[nTWh49+"`Esgc.eeJ5Y'7qdaC7tb6nJ5Tj*!j:^r)$mV, +3`N/_'?osCn.%!!##jKSUD%SPi_l),ptAI8Yrc'b*+S8,s42urn5<0oBbuNjn6s?ip6b@Cgt?^j3jXNZ;,B$'q`Xa>;4A>dOj7gW0I^"G(O(=h-q#d:PMXk7f)iORr;ij0+&Ui0/bKDK]Abpg=H%Si:bdT@p=o +-,jOQh<5)9\gP\dkEp+8/FqZchqD=,f,*;KdORY0\gMfYgWK.45ZW7Y#`(>l#.!cf02Nm5/> +!?/iOF#hq]Abf\kK!,HB$Vf?f]A[&SmCP@b_(+[Yg5;>-Kd+G%7'^u2bWseG<4Kqe+l[I[a6#qALV\1nRm:UQ>tA"T%WB`A$tD%!LGChN( +EtgmIsWLF9^nh&FqUY\^(M7'$6ZGCa-aeH4JW`17.U_"IXX2GN6fA]AaC@&Sms:%80Sc0Q?*/ +BV=>nP8,ETa8Jq=p3ZYB:od\Kil-0=ah)(SNV<4\k276PD6t2(^l(HdkX3PHdg/1d5bOiCdB*c$HE=rK%a +30YV+cq=IkAeZpn;NDRDi*$<#!Lup-3Ntb0JF0l07O2 +U[^;-='JsS\(Jd#W1c8-#=m,aOr#(<#WV+L\B]Ah`"[Rj(l.pQT4g*Y>^,j`;]A1_lO>,#1ma8B?'trdGD%h?M0; +Bl-Lc]A_.4IVR@-US\?jWlDT]A/\q)urOk$[YU9Vk4"&U+s3YUG8%]A)GR,s/i:[%d++oh5?`+p +%$.UVFWO]Am[I^U$"dC#b)jB05Y.rNIBH+G=?L;MMren4rDr*kQJZ=C1'L +]A:Y?%!jflD1H/NnNk_+s1;@_N24@["(%EH7=V&P^^Ki5olIjd%MJf2:>Q3=n+N,$7o+^X<\G +#jFX;#c5t:?8>EtWm8c7EZr]Aqq1%27^GlK)#kW8%:q3&J;/6Cg)#,ppDK]ArZoR^h#eV2a2SB +THQK&D$tVRI^E@6TiaZJRCWWSUC(KHR7[!B1/!!l4J +j`p@1O21=3dt^b6C?"GISP^B/Wrj`S=#\nY8Y'%Y&uXpeQ;*0bLEU"o-*2qgGac%I=L1o>+D +`mV4jT.^2:SdRG,:#'h2:cIZpCrK44lLs6@R1k,Sm0B2aN!%&00?J]Au*'f*AbRqNN+T` +:Z-.eHV`*nS6,Rq2e.bF5g&ih>1Th$q:ft=>pBu7s4)u1Q.>9e2srfU;Yq[ie7hO=-A'i?%8 +m5DJHj9Zhke'nr[(aT/Jr0d,O0pkNI5'4oN\CRN8;3(a*YpmHPCHcBUKFa(3a^B +@!cE9:Ydcdtp>6>-Uhe;4.Q;pn+cVG@UWosE2gGF&lV#NJN=:b=&)["%ae0DN>@]AdeOo5!q" +>6m%?UAQ[k,=5\#+ICT.4Hk9'lAds@:&s=M$ +qka-AR)Y\$m%S,<`J>1S#DgeRg(H>ArN-/N[0EVP)S+[%tqB/-j@qZgM*'--S6B?]An)KX3p^ +*X9udSS71-Y,EY[3-W_EIN_rXX22uMR#iV8(qE6h%b\4J!POtub"MhZnL` +QE9>cVRF@VHka@JAL)7b)aHg\TQ(-rbn))aW+Fjhbk\#@@f52XVW"0D0rC9INVu:7tlE91%' +e0J$P4lDYCR9^C_PU78DUY`u#uL=3.799-cjD'%es@+PX0YVr3]A&/rH#+`DDt;iN-$HGP>0g +#a0kNpuh'ZU[t@o@M;*L_\l*9n[Ec0ln\/aj:hcKJck/##hot,-$6-Ir.YD&FuQgcSS]A.m<`edT$r(U;@PSE)&V4!jF7Ukbsi=S1_GitLH'\&UT[LAt+dPd[DN +=oA+(T`\XiuR!ah6YMip:<+EDmW&0bsRIQq@%TN;LAmZ^BoG]AQMYNE2>"h:')1L,1-HcBQCh +80>$OCGqVm6\4Ae_GBjp[P5jp[m`F_c+(?RtUZLmqH#Wsns/r'?<)Q8'%7D#'/*+h(Cp@E.+ +9K(/'$:`8#$]A`+-d&)RnbpgnT:r^;aJr*ftH5e!MA?&qcU`,bZumHX>"a^e&Uh%a,W"sU(O +9EsDb]An!\7_WX[*#qYLeVObHmo-6?;J*BY`k^7Hi6RC;be6XWKlbHO(\T)rFM=GL +A[!nth9<3R6$SrJR2L-m`CCpo9'oGVa>:-fMpd!AM.5!*#t*#<-UDXe0sHPG1DI06o;Go+=( +-_\G3A-$:3L>H3Z-Q@h5'#0P]AAOIglVFJsOY`0)D"36^^L7lWU#G6`$b$Oc8G%>aigCmLdHB +s^nOcT4WdXlGcS^QlX?^m$11Xk!IcVpjDBVIe!T'[F,5?!GgJtf!VHj!<`F!qD'%br+aGBS( +%9MRe,h`"\VL'qp01ZIY9Z+F7ajJ&=6_e/U,i%2LR^DOY2fKJgor6tl]A6Q2'umEF)q1=8(Ga +&ufO^oSNFXG69IKGP8`bQp1uS:q<"P**0,h2u/ZZ"^d6L@ghn,i7i`<6J'KYh-d\9qEiYcAp +?:8jdq/PsO86M>oQ2]AKOK(jG)(er0X0>kP/rmdM +qb88D\[;5":oqk#Br\?I9Ebd4X*flgAR]AdZ4A(?[K&UH)Hb7iO,UQ!X>e0EIZ(,Xohoh)MTY +!cUE9kZXh

L&Z=T$d%hN'58fP7OuD))V +4%tb\,\0ptP#&O,?<,k(LiSrftgat_!$`-)g9^&kI/mi5AZmd0:Zl*W0k5$nuonF- +u$l$pF^>[Ca.St>4ca(Ajq.Olo?3O+!^qO):[hb;5R(DMG*1L; +0Lbo+D]A"0/mbBKc\A'n?=DdUeorn7-_k1afllGT+h7fZEFa>&kZJQZtC=)MMqK8rQcN()[jf +P8SVP^lWk58Ek?RS9U''o;H$J^*NHE.-i1kER/mmtnQLM!-=R=k%7d9#Ppjkff^hYBt^5g?Y +M+!2RYn3+:o^"aXA4^DX*3uH9[8U8#+pIad;&C]A!.lfuc;\2hXOaDc3A^E7?9H<."OpL1=fjn0N$g-X/*Z:1^05l0^41UEF` +qrf0U^(Lg;+n22)R6[7n8&XIL\m.]Aj:)W^L"(m)Ot&N0[DE;K'_@j!([r1SK]AbdnThhENl]A3 +oe%qe\H@uZ\hIIq2&Fn]AhDPUb@1PV`)Bt_@te_3_Mp-bjd$S'k)p8\dmdl%f<>DPI?AO`E2T&gp:#(qn_OdIs@5[ +NlA8i_GAe"7dp`33R%V/(#i_O'Rgo#M"T-%[#LJ&odU]AAAKOJY-Pb+!R:<&/?"!Hg1NU]ANeb +q2$eJa^tN;c5]AGarZl>qNFWXm?sFa)r`d`$MmGF-,_KlJpl)2(ol<0dFM>LSQV7RQ +C=3ZeH>Un8LC!j;d2:!Ap/)D/NoBEC3-r9)8Ts+rO6tS6nL$eTqPn(@Y2Mn]AZ"j^ccV-F?Y= +73gDTZ&O6cI7I)g=E/+Ikkq,WL8+pN;N'pFZ0Jc_;*Xlfo4Y:"o=JmVAA_2s+%/,q_NO)X-` +n,t;Koh4')U4r0pBo.h@_gsPi!^%V[Z6CPqVMB+s.$4lm6K-*E=`-W"JWW[k@.aF65$1I;]AV +_C!j`NUa1_)QM"LZWKj5o:[Z8LXZb%=S*5?/01)V# +M)^Qf#9^5>RoPKXT?shg`c-6\*$]A?GHO69&IR[krt^V124m%Xp=]A"YN=eIpcnLHS]A8"b6OLl0IZYaN,28(]Aa+lZe;\lX..uu\[AiqB*?!Tn0@i=pT/6Y>Yuoo>\V?/Po9qkk:eA +.#>1a6i6pUjYqu#ZVg!/q-/1`>G/fY +kdbSK-j,XOX$;9/43l"^B;h]AAm( +GShA0!ZoC1o3.A>-c^-fE0aR6V]A>r*::aX7kpiu=1N?9s5TsB?R5B!>4c+3[,:E$d,?to1K4 +^c-Bm`%JH1\je2gu;>,Tsh+Za-UPM4nU*qt]AnsEk8dGaHS7(&C."ANfK,X)'V-r1H,B'\(Pe +%?:71L9b"0"!]A)_h0ekb:HaV^@]A@.ub20Dl^?u.%K0lrS2'R_>u.[:&*b-N`42XsTc/T6`@R +[T\%Bjl:t=Y=&`?!TVc*Vm_c40t$1:gb+W)/L*#)P[90;l/SBLR1Pg!AFSIf"L/(a]A54Hg[\ +=_)%8q=!S:1N;"1s^@W=AV=GDa2U!pi\L2s??B`)%/=poJ7>f>.=l;`QNR%^OKm.uEqO&XFV +#:08#j/7\9HSE0dQBmdZij.6TGBp`(D+R;jbK]An(QT3K?2Kp?'j+E +`.Ir4HgVZ/*,cAG0'=ltt-mf-kZ_$g>1dO!>"Nri]A(G\ZD4?`fX5t;GK8)>J]A`gF-Z@e[[bH +V6oFjfsTf>!Es?SR%,bfc*sHKNs&)7kM]A?H5M3Qrl-$BKC;ee!Ie6P#YCUh!gB3W&MTVd5X=X#@L3#/U!Kg#dWi:_8l[BN_1;R3U6nl,D"@?%.]A\N(t1f[l[ +78bi-?#>I;sZ>662,+JnU:2TN=!\P^he6m;!.N05+e_:#EaicO0=%[3WXJ&Yn@[kj"IrFQj# +n.5Q[FkUZK9CR8#`qtb[C*Ddp\T!p1=SYqdO8*,4.+HCKjk#/D0OAa(4jNT\M.__!ggq:WZp +G_q8'&Y5\9o_:*Zd7D]A[ZJBTdut(&EOp!Q!Q7[12VGOqgQfW>*i]A!^D@r&[K"(_n_=J?D\Yn +R!*D.(1r;OjAi&,melbR;,L2Q`m0.Tn,?;I%pu;>lTYe&-qKZu&e,4s1RUY50bfJP\%a#pJf ++&V7BW>hDRVQXa(G2b=Nk:R]A=Y[[BFpJ20pIH<8+F:O_*e+8A4C#Lr.!!Oq9"TNiG`N;J\c: +3(K^`\C`'e78":Hf'phd&%]AQSE_/DZ@#;?F]Aat-3+[n;NM0'?G*gU-f^AQnILUe#44P]Ac"fo +pITKMq=R%rr0>O2c!3r_?6DIW.ZbhY1J0t8)lc#O7c1?68fK+iH"*j#mHPDeXc,hB@iVi<#j +$NVElL3H\AliVR*d*'.-+62="Hdb3]A_%q,tSN=hn-G$b,+YKeoM`+$\%Y2Nr!1X>B6ES"?+/ +jQpVm6_M!Hd5^)p6=]A$h77;#);^p-)c8#@=!'63\kVGV)(02@73h9h+UKIfZInUKM@cIVu\c +Md72E76VF+#(!Sq_`>;rZ7[1Gf(-AI7//!%8!AeN+=\`G`Q7QY83[7psd9GWu.S2HO!_\1j_ +Wfkieh*"e.+%qnipVf9:lqLnDH's$"RJGlTl'qF^FA[e!A%#*[ie2p#(i']AU8Yq;1aD5=51P +A)2.(tf9r60LMbmW9k;o)eQP9oMY"m6&Z78/U?g9l*q!fQ*5m3#Gb]Ajf89q)#@E]AgF`hD+7uu8 +G?e)QbZ=`2+d517S_c&9gj]AVW3dkG05?$IKV36i7V^3Y +ApsKr)JH>;Uqb@IQ68+u3!M*tfFQViHTs:Gj-3_i>kpZiB7l2!V0p"UdZfgK6]A57gM6g#g[U +&VO]A>G$O.n,f&i^GeYVs)O-Fl.)KK=;H7>4hH$R1\1[rc7)T_=tH@Qh-dLh>&c:@Ie'DA)j' +WL[GDo1f#4^p2?an:fPQt@g7@ZL[Q3\-20G\Mia^F^=nFSi3UNB,Ya6qQU6i^i?^`SuQ=Gh.$(cWFYP^0='hgcS6&W +\561V/W03WH?V/&rSu,umZV!Ud*]A8n&JU[I[9[SSk*ZEP(-&PYY*sjG&;M6-:S%a +^hsLr$*1f5Xp^$Pgm\+K*<'/:5Zo@+P;aZQ@Id?iTZSIHq2('0+b2rQsF)?V54Hj,h`6`(K5 +r\X:.]AXRd4d6*527.E2pj4]Au.ms;KsTS_(;GEV2sf%YFNZ$J`:iGm*'@]Afd+OsZP`?keoAJF +1up4C0/RXUm3RTE9p^ZlB`I#KjB'ghiSi;9<.>/d;!g6=S)s%!'!2ndq8!=F(sjU%]Auo4Bka +1oS'9^R4b2]A$l2'F79;6\uS'a3qafSbOUM[.G-=Xc^os&hQYa..^mp#W4`bmh3go'u5ZO'CD +F:g7Q'#u`&%5kPX8S0`jhP*hPWj*7hkeO<=Yl,+)un/'G*>Aq@me$EPD:(s2Nhg^)og=>F>X +/LsZ!,"=CEea0+N.f$&J+E1$KH`)UnP<6PO8L099kEo?=k0i`V275KgiTt=#bj[Vs,!:T@A7 +[R=Cc5YWi9.&YF,Q)=ZK2Y2?(HN='nhq1f[c'%k1t+XGgm4N=tE6`90ZX`&:(mVS6`:`]A7%3 +?)V[tq\,$IQ:tg(Nlhq4^arXA=F&k-M1(nk2R9!kG9n:?0TQ0ID_jjkqBPZ8IFVS>olP>Qr$ +4F!@PjE1pI\\,[)Dn'Cc$7WZ<&;,b\*,P5oXbTV+ +crc-W(YiEmG`F!\Etc.hF6YaU;2TM#O6]AnRh]A.>]Akh$O_1D5)P%6((O,DD(YR,PlSo[@NZ%2 +:D]AKEOAG*ls1BHcGY73n!ur'D[s,hj!uUhB/.r'&n)8^%&09SUiT@OdK?Zi$qgrEp-Sr:7#R +C\H#kni8#k3uG#Z4GToq6*;%)hqWM;45U%oJI_#RUq/YNFuENWMahDX<=@B`0hqK7#BmoJ`) +ujqUm-H)8[<9656d;,N`Y;&td]AD/!j`@B![D@IJX +rbr;EO.G/$Z$;k*Qn0f>7ptJu4q4;>K;;mBB^S +)BW,*Z!Y]Ap*AS'cu1KP/m+L`U;M'O/GV`;UR.iV3.(1T?Abk>]A3)k\)-QD+?Q"6*%9aX8`[> +:C5^5$]A@uhc3Li3e<"+1f\QI0R^.Ir?Tt%p`Q/AMkG]A&#:fbPC=s)sBP#Wjr5YFc"9;e*-/]A +ITS>fBKq2?hCW?"\I=eJon&<>%t9?pMp.XSDE72Y0t6LAN"sB5^k?j`9F+t@oH2t'5VsHhFn +(:#m=INn3PK!:fEm%26I0;StT;&GC-tOMsBki?LN)KBYOLn$q`JdHcHD6\Q\/eahnG/Wu:UQ +m5hNE2')dL>cHQc^f=-#d-:6hC(tJE4hhD+8\&#AIaXU2W+P3r-Vkk1u +m3BWAfrJ]Air$Ucu$nkbcL$L?iuV#7nLk*[F;HL;/$p@qD+:)]AhYPI[)4@R%/On(m,j/E;_Ng +DcOnlu`!&GAe8^sQfF&_Z);DiSRH["uo5K.-jojJZ(=VZdEBs@C+mFW"L"Z^UpNsZU@T,F"D +mmaAMA.s)Gs5A:6@_tYo$;&hn5hV#3aUYag6q2BUi%eq$tDFV^ZKgu!_2B,: +eJ1qZCi1sC.;M_\Y$DOG=4SaN5h67'PIdpMe[m6D\9ifrF^;Y9,/)1_C'9cQ,Q2D$*:>6I!> +ciT.e"s,V,)6)aTAH\#'65I5PKETC23macq9Ua:$)NeP&qRUtTK.8:Km+I!5pu();MN!M081 +*X_I8n^%eD4=g\1YO&,>3u)`-qF/63#c1j^EJf0G\JN&Ni+e`M@!khc=OM[mY20.,GC7Y*&" +Me]A)N'+P^hZHX<)e/["f]AT'G_2>-]As]A%?BD)P#@MBr=gfl&)UdQdk\4Opf&ZBHNRRrY9L^/< +"sg),G1S?q!)+5j#4991 +C;=Vk.@GM?f9m(0.O$L8,I"mja3O9CDA/EK1KCCK.cUBfNl#Fi&Q +"?cWU@?agEpK0V;aF2(I77EQu2;K$DQgR\RPa#[#[h,KIZ&FMK$&T&VN[Jt@#@eeCmi7>'h9 ++^lF$WUci$bqclSG7N>Gd!1o8Mj+1CiK>416YnRaPeNZ^ +Hk.Jhd-TOL*3@jVV\D;:JPj*4IB'EfGY\FM."=W*p)3'4!qOra-u/*DBPhi#^k^olJm#:Y[o,NQ/B5[,@^RJ;X3hf.XWU +O/d3`Vjb'I7b6._9:T>`+<^AN@Y4N8LDLjJk@&rGM`BOpqa?fm^4PhMEcQ3HjADOM:G1PV.b +C/LVc0_KC]A&d:KDki2"XXBO*Q,+V?`qO6R`]AgLgkCF&.=jOu`1VGjM/1'"ioL6ce)I0k:tMC +CJ$opP)N,T\31(KFV=]Aj]AOOVLR0mirQ#0*;P"`673dWekfq)W?'@6A31 +KCkLiQoh&69e;fQe$L>,^^q;h/6%j:0udkh@WfGC#P/oMu"d3iH53.D`B]An_1a"8;DQPVcMI +367["Q3Lib/t:*)=SfcPj``R:/qb@H%om-O)LaqOgRS>^=rTp]A=**ZfO7J"lEZ/-nRpcMUL) +]A?8k6NCX9+;n-2QEPSA5R@,($=V2A[;;kSTMaVPtV;VG<`Vku<^`A3/XMK1//9cp.ojG(9MD +KIm.CQUj'F6.`_90iEKLB)Y3DlJ(CD%84CTVAUP#k,K9Gl#&ItoaM-COQ0g\H)pe&-pLK8Q0 +=R2cZ=VF4+BYPSZ!8U'W_i2t0?(`%\hrg5@0Y?A#+NYjLH +Xjg9,;G'[07O]Ab!W=0"n=rhX]A#cT\mE"dpeh&d-)ZXo_5-9R#3n&rMVNK&qtSQZHNOVPX=Q^ +l-?7%2oqn9cosJ$dAZBJ$JK',MZjX:UprA&dK8IfBh$"5;e]ApVArFXZn!.&cmgIWiE'k92#0I7W3U]A@9-"UT99\s@5XLUqP>_Q.oO3ha/>f/,@WL@oS# +,VSVrGbe=hK[DXGiFkpXbN0IAY^@r?PH:('0i3'CP^APA,$p'2!N=nNrc.j_oT +OQ,ULgjc*HWQ"g&Y,?[AGEOg=1(%g*-<+h92^P4qJ42LZ3CCBk?#)Be#"CgbqduWNWf826-% +A"Gjnl#Y)qQ!_eL=5KA(.pE,:6rgj*':rD>O"iR^HUV%PfZkluY!fR*2aP8n"_5SfWE:GOsG +$R:N_J:N&[7Q>K.4QW*O9L9r;6#]A1\08OuC&e_+&pS6T2.jHn&T+-1:0P7Bms$NLQR^=`:+\ +;)O.+;Trh8u9+[?t=XI^cV`01c`(Md)at2-Ud.Qa>1m2BC\'Yo\Tk$IJp*%kDFR/58rD-pE2 +JK%eN.]AH<0C^*tP7cXgYQ]ATd'PFb0/b.p\UI6L:I+( +A[s#NfK>LZ0AnMA:F_QT/kdUEbK*5h;a4L!ActY%!,!a]A)@_sN_aAFY5H\j?AZ*Ja!\U;)Vd +[HJd&<&kJC$UbkNR#n834B)iMgR^?6tMgQduF#qSk@%Bo0bf%aAV7h`R]A"qJ^RkEIO"@Mf#) +B5D-MGXW*A'T+=W#B/i,;GB05u)=,R%rY-(`?Z!/OCV;m6*+Vuu$OF\tBH9fX[_$p0V-)4[n +9C8gGqXQC9CF7ihX=A:+K>6>Vqh-Y_SVX8YP.@dEUW)hq7f"`r?6*3g--C7[*1Iqjnf@I:Y# +Re/iUOb>R3AO0to2OY'YHq+8BBc]A\\]A]AT7'>S9?R:I[LX0Lg`G7e`&NlME^`D#0TI[#$.M-) +V`1#"]A,o:s3>c+C[d__l>[E(GTpl_moKoi:On&9aFhI2b\(;]Ar!Xm")\r<$oSG-[jhais[2+ +TY\`-F[@;tr'??7,RBi@H=ELk6PkiPL#LoeG[u#]A>4+nb"`&ZX"oC_1 +dmY9qDP$ak"\hP;tdn^UWDKZ:Zs[FlH>+RD22EcHDo(GBA:+G\]AX0bS!LfI5g/o;0d*8O5\` +)[.edUk81\Tm:lq<]AhA!Bl_o?:Ri!h,kFK8V9'WS:R0^qp,D"C0_Y>FAHXK3u)*=bN`Jea4* +Rdmo[O>dnYKge+PrP(>7-$]A:*2IKua;cT@2eclN725CsMe$ruRA0#q9TOVJ +2"g,64bi7uZ*M+NGe,buoZ#6S->W='MTQXlo8/P!3RS>*^'ea,$Xh@hK\dPoN!8i5\q"(/h6A1T+NAm;7-R$6?XG:8)sZ>5kQAYATET:f`/ZnoS]AOJ",->0eIk]AVAS +Ajk=Vg"b7Ve#Zu:VQE!N/`2M[EBZE7eXo4oVslo!98&8el:8_fitCfW@tG;<#.V7+O)s?=5_ +i^c=*&OcYgI?]AA;Ug0jc2[QM^tJ*]A^ubCj%O,82C2,\kuL*E/=RD,;eI@+bPa`T.pflo5F`_ +UNLRINJg@6)So9T^T*]AuLR3`gEb")=<3>TJ*giTn:6AY3BlP>"S$GDjQ5Ku[9Y"g!N.SY_fG +N4i@LY4aj*<'L77@mZ6/#2*=RP +9@>5_9Xl0M#SjK"Lp<+U!"Ei9h@c#=t-msuj5M&ViUqj`ZrjI`VlcdTZ5`9"b;_Xfu'A5+59I.#=']A&YgPg&7Y;*?H;Z +^@Ou1?.-]A__%'aoMgk%ngAZr=Qi6ceho&dX'PGT$W[\=^mT-p01%kU/6r@k;T&%)oHgnYq_n +i*QV8.(3GBI6/NkYocIlH(l&EC2q#K-*UDWrY7`X^^jYMHsiQ(JMc +pP]AFN.'_)0ia7MWg3!7mFfg=f_$Enb98$LJE>B=p0cLP(5#@j!*6QphY +(k0b!%,A$&5?Ht;3dVT#ijP'&uYIUH4_5W1nL,OGXqGk$o$NI?enY`Po7k7Yna14DYNhNK"n +jfkJ,%1u3;Vfrs/$RF&I1b:^hi+>H?e!C+EeGr0Y3T#l[UuJu&HYcZ'jY'OHX8qqQh(%IQ^0 +@`RP>>_L'/T4B9G-cWESc7\i\jF&E46AX(HL\EC_5JR;s+3faR&u$u8@k90rF:#Q4Bq(MPYp +.FZ8e=sd#:\`*@!b>I-DP^Y=h6c6M3qG^5er/q]AB7eJ)eB5R%$HH5&!SiqhiUT?tQ3E#D(]A\ +g!#'Zo5e^*G"XBst:R+)h4JkZX5uV"2/Df[HI6RH=1@QRaUpY#qpn(+F,_cXWQ=6GePDZlW5 +f)EDY8X!<+;AA_'9E9aEK#k4SdD"He-NW_F\CqSqfA`sN)&XkP.1$Ck'S9jN]AP\g9_ +XTV4h*'%n#"?H"lJ6WIR[UC*8ho`to4/]Ad92.J^aL3=p>rGsHOW8n9MS!EWB/\+Q^5=niS91^QpgjfM(!r")/53k,AA:?/Uf!23ccODPLlVM@2-N%l3M+cKY13bp +PY9(>;*]A5sao23\]AfS#+F-JNjDLZl>en@$SAk&3#pD'KMc"pFS4C7$GX$Kb]AA6,(H7W^Uo%u +JgOT`[N8KQ]Ar]AgF<4.#+dg/9IYPR,XeJP[q-*RSGiB2qYG@B\Eb,Qj%^1[T]A%QRAcpdhULI]A +PhIIWH*3?5T?fW1YecW$tLLLW!$hNp;ERA#E:G*,h2.X[qF>?#B_A:A&=dEgn;OaD]Aj4&i7k +@I8M%rQ-jh4]AB9KB.$PdU1#a-]ADkR]AM9`_Y!e01h1%:hK8`7'V5;A%)XFR:-F7QKfU/&KrK. +(]A4/839`L9:e8#iSh1hp#2U=IfEU7NR'_OcOhjZ/Fpm)lK!"'F +U1B#TJ[fpQ*QG3ANj#?f:G`I=lM4Qn)(nSI8s6Fo771>GFJr-o2"*&]A/>[u-IT0_$@@V-l)' +K!X.%Di47(HDak"3Z]A![+/:nsAdZK4tshu1i15hWFPTI*3WgM'=M8HHiSK,jC55j'7:->$p^ +k$`(@>3jR#[&R2u^OsUB`nfBY;P='RnSUs$4fl*G@D0.7Ll5KEOOKMJLqGdN+>c+24IleV]AO2h,"G"lSnY]A*(c:7[!gGI:ZkF$:-[CI!WGuSQTVJic'%X>1Os72jNR\lb& +h&pHRcRo/]A_(q-X#NJRh7t#L#daSq5o"*teFN%[2-45'q[mk+\dR_+WSYfc7kuT,KhN2]APB-!j*qb@D6eF-dA3Qu1i--A$3gqn56"0AWi(b_!t[@RH;2mY@lh)r/3GtZ1-/N0Mf[QdB;+7) +"cZ%!qWC@VpM\X+$cpG?N%:hD5593M(V)5am=g(c\2`Y5Hg8edu2*]A)pFZ?!k;;W:* +nt.IU-#^,Wn.&J)I.qAg?T3p3/0OtcHCllArDRTPAHiM'pH^b^T0aX`KDW`<,e;.&9^)u"ea +]AJV,8;CH<,B@oc7rA,1NBQ\UZ(9/;$LX`:S0% +UJ^Y/g#l?/*+@$'LP8>sO+_&`b4`3i,l:p0W/DbH6P;KEr\_+''m +1/)n^C04$,[`sU-ehW1A$VaD:`Q#X"nL)JX#U/I\KE%hT:clb]Af-Z;WJ:a^CQcue[NNu''82 +6K^NBPR@$e#sA_(#KGrasbjgD29o]A3AmBMiZ5'*U>S[O*=:T_'"&b)pX7Bi:OMXP2<;dGpoC +9`7/Sf%*I)#0db?+*kK0C`^4XIJbZic1/dn2laMG=V5WlJ(Zb*NDV9Fg:QFFL/45aCCWH(XR +6$%H%g86HobSZ3a-sN:mt"=4]A8)<6gI.S>R"=Fi4@j1b,0-Y?*cV[5+dJhT8H9A$*`:@]AR3Ao-1hRAS>4R+ +/_mM2P!=Xj,3jZ+S4 +k0@`H4_fF9eMh0,XV$S=Q=PQl+GU,@9!P.t8I7Y"LlJ&S1ODrfffheakAnP38mbPVHarlnqE$+b+:sM +IgFlmdPEB;csIf!OBVh"jkYl3W4C7"\Md$L>bgLOf*W4mC]A"-MO +o5LiF;A^tN!gfcEjP=";W$"'Q>#n'eNs%#`ST^FPjh27`ML^t1t+F.OkHak +H`[?b)$^,eZk*f[)QbPRapC]AXoNO.D#GjjLOhE)[rkt5V,7#5$m_SG_Nm,q:2qJVR?#kE^?= +gnkuUW[S.QB,R8'7IA>uKb'P'2le+-Z>:3br43FiQRRSB6EB;>"Q'A;X,.3Y3`rmTQ]ARH=f''ms9l/0Z438T) +8Y\Y>SEtN;GWo86*)%]AQ^Qkt:RclO]AeCVb$F4Lf&XptdGqB,nBFjXn]AHoH>)Y(A""!2#-Qef +/>[CiYou"[?WS!=;u03ktuC0:/]Ac)d64! +q=0gCbP`O`EL3WUl^1mAs8H,E6 +]A?[)\?Jj24HKpW^%id(Xc:;8+[lf*h`*$,shi]A)a\W&Ye5TKY.c4.$V +LNp&8N:)eas>VF1Og%jms#sRHTI0:hOS-6@XHuH$o=QFj;jPlVHDdP_r/YB<3#d +spgXCe^@eRW` +57*ATcaT-!H85(,J#SHGt@bZR1LNG@T;[[N3/'OY"^3R-atGTh/Z%&kScWXgKRg/,V+pRW$2X +#GiED&)2@=RBdQ=6mHZS(B(>s-LW*`HBd6]A&^<0,S6@qfW3e1K4SGbddV/U8!Mr1i_*uI105 +=i^=Q;3V8EkeqL.$*\XGCRplksRg'_6^JSDtRf=WLOY:htj&qV>,&?SPIT9I(hTHBF,p[C4S +XC0f.]A"KLb(C]A?:S+m;N,uQX.U7(/#+^G8IltZa4WhOBQ=N@t/EXN.ck5[#ib<6Vfr22=$h) +lmteTVLdk&85HfJ&C+97dRBb[eMX!-I"4H@$'%oF\*=n$#nVaiBZ?>Mn8NI/,l(252e`V^gu +R'bLmkU*bB;oC/()LES-'TKFN&6KLV4d]ARYW9LNfE&=LHA+u6-PR)fnI#?;UK4d`TN,P=6]A0 +@rkS.VQocdP!6ZYtSKOOe-i_f%io4o^n??kH,MX$U@\[,Fj@EnHTV*@@Z\KE8JAVUO04?jsg +aE(&6FFJ-Oi,#G9%26g88Z +B3Ej:fQPF?Kne`c#%,f$/d9<3',20odA"5u[^O'9Fe>Wk552_k[%!^WOXY$KclcVNsu7b`jo +Nm2INk`%#RY,ltI,=WnZQ2B#6Ad&Ihcq$^Or:5udEGmhD1D?"3*$#PZn?E8UQsIMSlS?`OfI +A@'2a*$g-Ju1gU3I`Wf.P,UNlr\*1UHBPV.BIVL;Fj*]AuLD@Y#,btgRd2%RXmEK2,(Mh^__U +ERHreGGLE20;S3>H8`uqCj*N+sr0`]A\2M,K.p1qj5rTJAQ$Df]AlLC,K-!Ko:&>pd8Q6k=a[6 +["[*&!mY>k6L<#q4(k;)4qTYD<*Vt;.m[+Z+43;gKTI6?E)8>7nW2S*T@LX6$]AC76)h?3k;_ +mY:W/7['&dJapg^Hk@Uad<`C@7g[%B**`daD+:qE0eYZQ5OR=IgiF7*[d#ZJZCJl:84-)8AE +d%BgK]A_[g09Z\gs^.CKI6YKo<5/N32Bbi5In8PS?&,h@j+g3jK,Ani\AUdKlomQ3(rlN6!\L +MU>@k6i%'<6Vre+RT.nSkfm6&4W(pBC.[-)Gq.k9nruAa[9S_,mS+:K3[GPq4t]AMI0pP)]Ab_C#WU4O3-Lg-Wd&.aOY0R,_[5g4!l2P2.6O +*-69#='2B&h6]Ah0A"2OmYcuYCW4-OUie,"e.<0NHejf0`'&H*%]A7f'6_`:$U!UI<.4+>=dtJ +5]AQJ9i=ErO1n&3LS),/g%B[#gi+qJi]A1;??.JX\!DE"SEkf.E();a,8L\BO>_7+PrFJ\4IS5 +Sa]A>'%p&Fb6<9*8(Qf9n"H#R0^D4?,KG=?jQHIcGrHm@\aup'a0RbMUoQ=BLsFm>QXPLPLm" +`8Y%-a`4TkaGEQAHlp>+p\7=+S"tASiq1e:RTP(+3d@KKr=Lu:Z +?^0$uo_.lA\6Os$FS8[]AA'9Ul%rFP#pG.aopp_6-:Ei8Ip=E[&bf\cUC%o;ibrAheJjIfaipVk+sK)hNM4B>`p=ZbO:`'lK>Tem2GW_EO +3>_8iI*kt:OL>!hS;H&j;&FPQD9jY&_jMg0&dp2SU#\bo#(cX234L0VMt29VNB>Qos/X'aGJ +-;]A-s)N4J8gY/Lr=ZP?Os&DGOD.7]ASAbX>=-LUs^L=JnKF$$e:hbDeP:!gGc\f1Co]AC/b%"F +FnJ$QE&07,2-_(\0nGG<=nqiaJo18I>5$XH\5a&ECn_qqSo4Dmc>K35IbhK\N-Eor$_CCH/1 +`@5jP+DYSXTY9:uk$C44g;@EP=;>)E48?"NDpt:]AMn/:srquZ^t/Zg./!gaJ#YmKCcnnmnSq +mZd#AfHT2gS**e"\SXY^u8E\p,qp`DSf$_t%h<^H/.fY?2Y)<]A^_&T)kDNF3g*ATdp.EAXkN +`u"H\]ASr\QeU@-/]ARu9Aro<,5X`@$)\[QPKr9EtA#.8jI/3#HM^Ha@llp@S]ANS'*$S)uc$2, +#u]A0kbIPqjE37l5IHg?iS+4XK:K]A\GEr+aag)`jpLE%MN/O)m;05?u:o2Ou:79cP]AK'LPQ?f +>q'I;&5_qUYXX +FI5)OoA"-g;M:KLCEC_-Vbo'<5NPp14?[376@O^n\&"/oaOu#&H#Bs'&/jg^nVa@@D-AO`[% +rV-[WhXjB5$QNn[!>YI8)_Jbel1$d/V32>TFZ>9(sT1Ba:bK,(d.JJ&C'JIHo-PAIHY5*hZju"D%MI,qscWC@\q%<.4BNg(!F*%e7?R3-]AKo[LO +[\OL/PNfrnH)KiN'`.0d@B-MX/t66;S!rZ*^8%J[nVPp?h0MhFOpoP'HK/?nm8Pmcq;gd+`,"fTgP*MZC=WUN2CP8sW?Hl'4]Ap6YTHOA[J99Bu= +Hl%(H)-iMSuBn3cpGG$*/u`=q+R"(,?3i(LX0OeGJ%7b]A@f,,9!6k.+ZnF6gtBtp9eD4+8CG +!DrJB7@Z>Hbo(63S^0ESa;At6kO[ZFM3^2%6!cL'G%W74Y;V$l@3!9OPR9*Snh?2Br9(5Icj +#=$`:Lc:Mn5)8^gDf,U?^.?(cbs.dr"mAp!aM`B,kkqbjMt?LMSjZWN_!L^sgp"":8A:a%@^ +R,-6*Ao-6)35]A+\3/Q\^Wl9"8"lcX>(bLX$\BbJ(/Q(=*tLD7'jo$%QtcrHh+=h@q`]A1$F05 +]ACLcB2%i1:8K;$q'RO;ds65d$"%HZYt9fG7b:)6VA+HhW_-&#/ +&Eh(DhUo3%hA< +kD'NmR6.rN&*!VF=u**X@%O-OoVpb*8_$P+>NWgJ_4PV]AU3O=)ef!X?a1`^I_539X#rU0Ylfs'0eK/$t=8dg)WaipK0,MCju>$+UL>Bq+!6$";"`&0i-11ngrWoUCl;tNVYS +D_ll+<;X1P;if^&-F&RfD/Pr=n`V$[[7nUt#0Z^$/lM\j0'ckV(RLRP$bYWi@E4jM03t7 +upoD#$rXkLI('DPs-i3)MDFDj+Kn]A`%moVE8=jhBL +KuM$m#3Y]A&\l"+$U=X7.R8mV*^Ou@X^'IiEL=V[.-\hG?Urd4p(/A&>bG=WBPh\+qU/@3>m? +@>8mPp8jad>uFR0-@\6C8>,$Yn0>K;huq1\UeBYE,V8aQf5$B)![6!+)6d`DO2?%`0O]AnsJ" +R$Q(mrf2>+2,PQuL8D3d0jlIk%9(fttU"KWQS\*,,ha6+?bY/i_#NG6`*(foNL\glD#)D['2 +4#HacMZ-^V!-P?77&p5OFkUJr/Bp/,kdh!eDTgt@<.oEV!OH'ROP6&-Bi/%`>BMQ"=NK``V\ +t(%M$p';J>;C?Adf(6s+-+n)1rt08Y5*g!%CQf;%`9Y0P+ON:C%WrN"3*hW4DQPZV%BO@i^T +CRK6QQ%o>R2P#TWe\Q&e77CF8TN&ca#88\]A@ +Y*H`s_"XNM;(c.e1>aqDrs"9ZCsF2c'%q76(eiXd$_OpFNE9bJ=^6X2SZ,K4T*A*0;7F&M68/:t-lHRM)OuV>D4(RnRX*aID"UF5b#l/\XJT+@>gMo +$f&'5V6qJIq(:\r=`q;B"L);m7C,1KMep3F)\V%1uD]Ao@.MrhJb+.+U9E7>P,"Id9JUWYq`* +3h2f>M#8]A/<'8PBdQaC&NoK@8U$0D5qR;6BAS@ttYaD7,$]AN03,.1&/lsOs>=;9cB*^'0m.rpD+13nEFb"Ufr\Y6^s(deEXAhZW2ng;40-pSl&@s`7`qI@)\jb`(hCn)Bc +pet-GTt2O^=0he,'M,UoTF4IG\Kf>>lQM+5?DX)Y!mQ@&^TOX7oE,:BEMV%6lpHoNggO/@78hTaHiOWpcDYC1hRqJ@+#/N\29qm+LZI?o_(5=q.b1o,dQ>Ftd-@m +_.'1-*@J)7h,ZUJ,A7>#`3s83!:N\E9/p5BI"3/RSGmT^Yg%6Ghrur13c+LWB"1DrK0$VXbq($@hBGXe!Sq6NJOk!rQI* +S@t]AI\HrgUa4"Ts1cEY&c_hs`io]A2+G]A!N[&-T(u4U#]A*YW2T#CNS7Oa/2^68+Xu\@'`lh8o +V/e]AR;JhOKX\/.s]AC?]A>h?:]Ag.DHpfXqk%E5&l.Q9ZS5dlg\IS?V:@]AkqLG[:W;lAFrWmQX6[3ruN<0XJG ++:JXZ,:U.,nkOtnW*$IcU`i0B>M'<$#jb&Ij^j]AA`fICRl01nU51'9'LYY]A@5_2,/#/G&oN' +<=84sd\6h4Y!)iMDP;FXKtOKZR.4YrHF84uTD91qiG8O`p07kOt&>DlEX,-9a1"Q*b,4sr5B +So#1(N-(8HP3S6oClVI6=oXsE.nhFMh3Jqkm:.I92$qi%AIXD#S/(dtNPle&S).' +Fr2]AZU""Nprp'r1K*!2PuK.co=iFW,r3!HY\g4*[c'A<'ZJBR!7jnX2RK,JGf"E5^(d^n\o. +ZXZQkLHi$r2+pqHWOebTkO"D.SNK./aVjL`[o9(SroV_:IN7S)aldG\)Gnah-a)U!1Vr`LLY +,5Of'fc%[5"'S?.Kr#:1[eB:7[b>7&d_g8&dF\7p9k.l:?F[3Hi@dc#2KVe$]A"V([tM8aI^G +oJ79k:F3(A:3SRs*ULtPq=\<]A`*]AE6e*=e]A9md%b=c\jHrp[?0[.Y63d2s9g/o%J>UJSgUFB +J^Hh#>OiPD"=8ZbHFGVh&$B.Kqlajf-F9E3l?PiG4-K/>c,Ph!&eg("6O)]Ab+^4Ant$?6(:V +p7">Atc%p#O"P*BC=&?;U>8 +q"kSU(&hLI'Re5-)6\).>4H,#s/Zr?mI4gb4^"qN1`E_8PT6JZ6`B_XmE%L=S8\tSkXk[ofT +oYRlUlj:KtpU_9XZO$bKj>Z0\oeK!Q-dfAgG%%NX[L0(?mEFQGj5Jhb +OaN%J]AYR/$#9$!%[QR4*V.&;+`eT*eC\b04<*ldPY^a=,!mEXZiRGdf;cI+a-+uH +%6/`cLYA@p:N\u(!pGUBT%PQKeHuD1r*URL%'8!mbk(`Eo"BD/r(YIhjtYC(WCP_GO6M9;Lq +'-NdsY!1X9>.r^'$`GJ#F%5=q/T\Hc0_&[gqi4A(g-qi0tb6T1e.hU7%@?5`o[@EtT)1R?aYuBCO8&W,?OI377ilJ#:a045tDnJo +DEm,nX+ia$g5c'6P2_RD:b`I*mFjWKX`tc\1kEg&9lQA;8^?Gu=bA0o[=6.Qd$i:3JmT1Z/b ++%\;kWTbP^([D^pMR-k08F/$PY,6,l$"IoGsK7oK0A(6XX,=G&O<$VHMo)@cW?#@,#n32NYXYg[6)u048$4*U9br*aZd>AUgNYZY8?O"IKMlqgX)nKaB\V\ +&)@8]Aqa4THX,M-&hM1V%VB??V_Bpoc=GU&h%T!!^(=b=#V4<887^'5TeW?*NWh?Ldf#%(u?+ +oV%_gOMfS(2_/kBr10H/?90)Br!u5IV62^6-6C4FVhDZB-RcO\t@ma.ncJ12fHekM8`JuT,U`/MuAhg>6: +_7Wn>T:MlDf2i)B`?`]AINd[$'$!^iWMK>]A<>'5V0I7&3b5T%ZpA_&)RT!ON'-`^ +k=/Pm&Qcla^AJ3*!$Drd`>'**TGeYHr>rk>LlAG.a#?WEfroul9tom9i_VMnKNAc3rV0I/cP +,4Hd['B_%u:XQhrL0OBh5Te!dO1,iA.th8ZE@'l"=A29Ee&lJipGARUE_B!%g*3@CJuQT7;f +A'Y=j7IAFgiL'I4s/h?a2e:T>eZB_G"/7R"8Z6oLp`&%[n:jChU]AZFu.^,S!1h'o4u+i?B') +H5q>15#3"<1[&SPP1j2e#0Rg!]A">d,]A.%_ehLHD%[9q,DG2%mh!rr9/SX!i9cdOulI_>9GH. +[EU2(nD+6W@*d.b;Xs*N1e2iWjCM\l=,OVgD9s*f]A1[9Of)UWE9RT(pe6b>A3d[eP>7I3Zcb +F7?qRS4*F01'.Cu!&ukUiVt]A4rpZO'DNH<[XW<+g.hMRB5I>.G]A\F('qW`R@ikM8+r`?i6bC +b"@5Loid3MhC]AV.K\Dr(K4dY&EBC:XmF8Z=qm/]AE-2:-=HA$t/cU"3r +/PWsN$YjV:M[c"VVF)Y.h,j0%FPnP2YfASd#afaol!?[ok;@>C/nm1kFf'*K*1$jh>f4aar` +Q0f9&E#*RB5biu5-GBCW\c]A1TZ=Q:GPk#LrkEmu3]As\@oXQQ]Ar3L8#j92b*1"WAn#7\oj3#l +=qmJ%okt+TgE&(.dF$A9"9uilHn,&Y3;iui@!HhhD)?_U@\_YC?eR7?8t46-#W7>qF0SLV\3 +QfiM&qS4NI_*TSm`4grV8O%k%IQnQc;C668%j*7Yi_!c^pi76UqQ"!58X$XK$Tp!ksX9<_5S +6qZC9CDmCl\;Z3X8\d7+9%>irn(BXH-\X)-3Q7?Z#")]AY;ZE#:0<)IO +7s*Yn'@:8i:+r"[sIMfC"N@Id=!3-Jet'ViJC:%eUe!4is$e0Il!3i#4J[:ITSId$(p**C)) +;/7nsos&U!(YLoPUmm"'cEbe"f5lZa:jlPSY[==MO0U36]A_"2!16c"';^HY&)D.G6!LVfhlQ +V4cA+GSpH9NJToNG4buH.""IN7/^q7,oSE`;6pWIT#`K`=2<"]AT,Ap.E13[c8=I-AQP5PYEV +O[dN+KX1T:?Poiu<\Kp,Bc'$fQ/5o>1QLNf=r@#IQ-C#*6J^5 +*c)\H?;J:YYq-f=h!'BA;jtS-0@mLq_`j"S*Yhj*\0'Md=U6$7c3sZ9@"NCM)8n,+ZO``/8F?_KMR`q"/ +r2@nVZ;8'mJf.=msYoC0ke[]Ai)k)C53u&@ZrIbKE,d]A,`A976+(O+1Yib$bHl2MYcT.',";b +n+Ko/UqA%A$CAoCK=o2[p6YetG,"^r.(CU]A#&)Lo1*/8SP\7'^jr8OLl3MV\-m9mbQtU1ZRR +P%gns`=/]At)5KEFqi)rfsR":sZrC=Aem.C$8(Y%,<"NS_q2`gnA8T?QZ&M.3sB9MWSlQ'lZV +qp/dH\ClQefdNNieRH)Rs_(*Or>o+`\/R;,G9c.I67ORbe:'r)ZA5Jg@mGiY[;oGaoY>uWU) +_9)>*ZbeS]AUsRu'NW3pG]A4pGQD_MnclSPUo!1B('KGEV4l!_!Kh:QN0Xl4RJWc9:2Xhaple* +;S\JCirC"(R[WmGbNJ-Tm,Soh]A72Z +V1!*m:kO6PJ3hUu!>`,+?8r>^(Tf'ESgr09/]AR*o=uF,UH=.9^1Z;oT5DG'&rQ#Y:#oR(4I/ +[H(pKFs1As*e+6*Z*]A439[CjT[aq=1']A]AZLHoOeXZobD^G:52.NDV'H0*Zmk,:$9rNrZU)Rb +pSKI0K`,m6`#cor>[,iK^'e\F4'WZ;Bk@DC`9QCOWR* +%VW7IPH+`P@eK5&"oF86iB,jW^SN=VEAb0Nm\$%k7E&R;MZsB6P +i,`IU/7VZ6?dC?+M%K/9hb'r"ku06gC.Q8>q:oju]A!G%4H!Ls2g#cP2p?3N,oi?2&>94fVjq +$:JB5`4]ACS)%0RlZ=T"%2dERIeC+('$VTJuAPRK'g[SaaV^%_\OV$F5^+rU02B +"ga02Si?.g%$.QXe:Ugrctl-7Uu-=R>eO#bsr1&ofL(`<$<;T[P`^]A%4N8dKA*P-)7K*2qTB +EB;(4ofh)*S&G/b8&.R&jHN%OOD;.%_D/.tu#.Tu/78,p<+^[]A"ET-Y[k;>)q%ACH5^=LK5p +He8\%&b+M7OB6JU7RSS6nn\hPX6MfYZSBqh$r5T#_Q)a(X=r$-Spg\HSJM>)]AB".;!hqJW6o7IB1e'M"= +QiXJG"N9=cC)km[YKGJ/.Y>PEub&bs]A>ig"=A8.QoH:oobrC?,mG]A2QIaC]A\dP.XbG]A<\.o# +^^T9/71#6iE'Bc;,AgB0o]A[;^ah!7"7E\kf=)rA;CYSACQdTC3@aBMEnh3%BMh@Qc1`7l,,='4rB\\K;siu +Rth)Sj1r+&-(Eeb&2!3r.RL:/b4`"LRY[&K!KPhf_!A]A;hWu-u]A^KQd&7/[G4,t/GEoQ\4&O +V%gjLT>[)&p6H0Q:F=705 +")r#r5N`Z:af1ZgqE2579QB3e#[QY1j-Bc@kf1h7';QjN/;gPRSsl1[X-b7AUK;B<#l!LVL' +gcWmZh38Esf3r=WCS4oMJ"kS)ghP$7RAf,j3=SEoURjBe>ng0]A?#E_tIqD;X+75<(.:g2ETC +2\MJp[5Kd[2%GB`qgdNZFsT(i-%EH#HYi1qC!bjeEFi$[o)=rK,,5o>Hu>maH1s6!=U`X4U6 +JtC(*Ho5PFXk`Eq5%e[sbjsku#uk)8CH,,"A?7o$ZHgn_m1AK2r<#lFhjPo5 +B2bU,3FT\OgR<116k:4g+L:bGNaqu@A;_O#N4AUU#e6DNoXKNo\cGHND)K]AuLq+a(ZXF\!#9 +Hoo'L\6b1P]AjMF8pR&k['#a\d#._"*:X+KigYT(jq[Huoc6s%6mU48o +`qlfPMr#,FWcBf.`ea%7D`=%BcY$CNHcu9Z[pYT5*NL0LN +?s[%C!%J]AH(F0=Ru5#O3'oAWVJCkjYueAq$bTG[%U(t)MlZGfh'&\-&O]AUJVF]Ah>o\n$ADc[ +P#mIIBd%]AodRC`c5>H_)-X9]A-rLrCO3TCEpXh(5e,oMFoW.pl6^iQVHSJDk7/n2"Q"JjR7", +^6VmH)^f4lLBPX/9$UpWM5kY*9t$^VLfYp0UMPLgd,"dC1Nh")mp5[Le0m)?Q[1Z0N'@tUhT +Z;^1ad:L9(XGcIdfiq@.LLp'QTr[)Mi1*Vb]A^]AE]A>&@#W6Z@h_&5Ge+tb$jqD+/CR.(43>pP +4'ouAFC6UIp:VI%B/$VnPBFQ-u%F&f`]AV(pq2q(niIL#6?9/D(j@"8f\]ADaU3o_4M+Ri+/ul +-i[MLr5lh`U]Aau1C-B,=WJh([jXF:U?^r<`3I*sU2A>tkO>BUqiNoKT&F[IX%R`-:p`aT7Fg +T;?+Holl;W4@1]As64BSW*__['.[s&J2W/iW,AKme5YYj:$BQ7is1XtR6=#B%qYGV_>QJQ]A94 +k?NJ*jgGhD,G4ktE5*3W>.5^*]At9B^]ATTZq=/<_m3Wb5\W4P$JYb'HU,mi__,,J@3S(?emO/ +O<3m^fH!H0'D>L$AG=)Fapoo`h2/kE7=ohggl+;$D/pt,rYO_)\[rZVCInd28R(C_iNMR!O$W<_jVs'2VN\6HEWX_nQ^NeF +cc:7;D9pN'B$S1;h[:A!3>2HXr,`-oSbFoW4(2LHCl,sV$'@K3:4.d;i>-%0@ekr[;D?V-s8 +/Z]A591N;H%I;lDll!;64Vb>of>d,OQYJeIJ7,Ji.RhEGg+q$Hs5H2B&Mj+8F;(FkAI\HafHc +;lfcBXD/Ym23D@i^Y`@=\*flZNK&o`;B9"\[Fb?_"Kd,4]AE4"Wr&e+:Aod#&5ro_`]AZs/VFB +4gUP!JB6JsY_nC",OmIBQogU=+"1J'#SP>-,Da6W'$L.*BYR?"r3%4!ZOEH1@ikE_j+ +3bacmno#j&"(g[if"dZoErdAXQfW6ak4BZ$M,=0&IZ7:5aW$,NHE:;R`68i$f4Qpe^e#&4g, +`HjT['=@o,CDH,6.=^/MTj? +S$I4W./g(SjE!oPU801ecX;p+Nm'\)-[#YWI^ak#qU*(B1&hBNho38^;RW\fd&?(+&p_TH]Ap +*fHED[:O/+[m7jd0D.R/!n4<5Kj`cb4kPOAEj37/-3&E@-9R")b)HkI?o##C>;cVDFjEVFPs +pI95(UFTpBCEG?3o;tn]A34\6:.ZE(d-Q$;+Dn\Vf$#+, +WQ,(+!kKQIbM:9PKUAI8(U+7SFs>6hWV#0(,-:WJFf#>$U_m`[j7Aa\:N,/;OcYS-J.o&"Nm +l7?4ZB:E7Hfe51XamE\;P'C3P%ZD""gffTS8[(Yb"RR]AA@i71%dD[d#^qbg:$[n^nA0a9fcq +k`GYWEk'bd;64L>r0(:Nqt%"LMsflJ?fkTnac>DcK5$^.4JuKYj7I>JqAT)J:P=]A,mD/>ItiY,]ALQj,6c6(Ue_iIOi/'_I#G +oOJOs"U]A9l>pT.cKoaUGc5bikc!X(>u`m@dq?q>e9njQ/U6]AccabMId<=Yn'$>F''9:799Fq +:BG#XU[^KX)l[5bo#_$jeaJdBZ);5H/Kb-WAXDMcd1D'&$+9jsOTHHj72K`okL_qOub<#?TL +ko.c2jp!`n3.pOG:e]A[O?.MsdPBJpQ68?1\V-Bsm5meYcCN3]A-04*4pP4OTXHoAum")]AXKXJ +;rd)ratmjdC8gjjODVaHBFMNTA]AF5RD5Mq[L0ka32BEq4CWEE?\\GGJRcTD;HBqYU-;UkJ[\ +jlGLPeIb5@<1uuj4Zms21&fa:^#1ERR^VmFIEWNZ^B-T"O!PtPF#J`kg-1jfr&5ZDD`ma)hD +)d=q06^:I]AiY"]Aj`i[n$)+kFWNBn4*mqA!FR>k$47-GZ*@G;?+'"gUA1.DpoY)"4;.i=S":Z +B)Y1Xkq&e^L!O=d_@:S^bHjQnn"m/%3FB'-XB8'5EBir3hJ?l:(qKIG@NtBL/ghU&,_k&Z4/Bb4g!Gh0^r +_Td.'P5@3:W>g`kZ-.ZQh2iK7J*9cFuh3]AfDfn$I`[nB@^:"h7k\"_Dp\=e,u>1Pm73XgGsD +W6F7B3K3#5+=ru+rCAW)>IO\!(,OS^Poq\q:6I]AWi+k,NT-^c\9Y?qo69"H2`,JhKWJ-gp[4( +)#e26Y<)Ca9.T-20>C&$Mj`n_Y3h4'N=L;6EOd;NdCHnZ?&#M/$bL(#*sL.HsdYa[n77Al0Z#9=Vb"a3&nZ6")H]A#;5H +./KJpQh0cgUKkeCLYG=KGg:II72m1,UuPbqB%hlWB/UiCR'=77C:CmD04K)]ApJXiFY=A +Xj,,414t&Qr>pi?8r#b4LhIVB52+2'E:\0oOj0,,@lUmMZ[;),dJ@o9X;%<1(1VKlKu/[9/C%7TGA/O=0 +Lh,*9TI.:CM-:\iIX6cT2fi*b>'Z3mjV*XdBE(mSRWkCF3VrJ>hSJa'$_)9XW>^)ZOFAr8&0 +I0%l`(M9T/S(T%?L-mb_ljLWlZSn<:VBL4ulf0R0uYQPi=d94uD7QBmj)0%ATI8A'@]AV5F6o +<31@C(kPK62P8'&l.oc_@^!-2#*]AirF^ODnIG?\E-JNpQ +N.R!Y8^58p*Ts5XPt3n(?-^@>SQ(U8FF"=)G#i"N>Xs/-6A9$UD^MCN&+4`kfIt%M#pNI6*` +I0@fC^7cElb_Xg300Ug3eaKQ=t-O'Wpn,kPAo1<:1#*pT4<`Tu--7pAaU"\kLURmg>OJ(:jE +r#?P0+D,s3V2R'iC<"HHG8?-\_H4\?aY>KV&Cs?>?e"GCLB:3jYjC1b]A2pWY/L!EsW0;7_ +3pQl0a]AEl!1eu)OBk5^VBO=B@!0UJ'==KqmnuC^%XYLGOD]Al',!kggsk+a=BO5DG+')m>JOg +HRS3Mo1G,tr^9;.=8k:[`EDnE48$=MAds%l:DqWc21fMohHl4O+jHTj7G/a,DQ[`0sP5d'dc +`*_+N;Vk[i=7gNr#@#=M1^G5J\gjWl+H`Oe1L"j#HDRdCn'%Iho\"f*Gt1=/j=XUaN-oK;a@ +QOD8gY@"b?i#rq(F'ugJeZ]A4P!\Vm?@KQDNRGe(68p#HJs(DiBF7Ri- +'1VQ$[l*hh>V\nJj!l,ja'GU&=T:k&lF%l>"6&Hgm!08(fV';oiiXhZ8\.%7g[5Ltc-*l/p@Rto#YqYW>l\()mJ'l +dXgn+R0"rUed`uMe)?VS#_%SC5&hXeh'##IK_*ll--:8*jr2H3\g^5^O9PeMhHt*+u)_@ZM$ +kj43(a`IakID;cCXbqdN%`QdZ;Y3N\EPoD]AG0F#`eU"j=N)i#f'+trE"P^"i +bG&I&s0u;ScA)dMB\#H]A38)>Xhf4)4:M&&*IP`p-A;YYt.=V`h'WMIa^kChVH:IVV[@?6aN! +%'i_QfJ'b@S$f)o,g/g.4dj'@VObco_bj%YES<3)rZh]AZZ0pa> +0$UE5Xl;X<`"kdi1j86g"C/[l6TU2n$0"XX/'N'PUs+[,]A#SS$/2eT^Ue=T7a0-%5nQi*=gX +nE,fNLad]A=>L]Aa9n7X.tU!gdAl>Y%PKFB=MeBi1/idPN-B1!MZDu**D7bV"]A8Ug/;20)s3\a +C6Lu^H7V8HaPYJV(&k&02]A7XBI%B(I[+t+=PMnD90Y:SeWi)&7MO7dD&N=U``9p&Y5JR*mqe +tB+!DN2+&,ZY[EDKV9(4^[6KY1XNY;!9M'Z-P;ETZ!CPnfqM,bFEHJfkQTr@(kTjQX*H3&q? +!_&l1?Gj]ACo+KH%REB-6F-b1o^1,:MgL0$QsllXI>@V_lhc_gLj4Ls;1Z^^J^62sKk8X.n`P +RuMY:9BQh[MS6S4"K+ibLeWj4$,4Agf[VOe3Z$C*s<)U-NG_J!)>3N]A@`+"Mc5l^TC_^bY;7 +7Zg)>pb&>G@>-n&J4@KHl>-uV0`".G;37P+WA!H9o9+dpQrmj2b1O?AWn+VBk-m#Ut`;R'(W +LfeZTUP"RrHBZo,BsaW4RY)o:dJ3qL+pqiHUH[FND,0,nN)*Q;a8O7+'FCGA8kO>GClgd +'5-]AI;^'#GqKIU*K9sr4Ao]Af/(oZmiYZES-CaW`EHID$^G]Af&+Cmc?I1<$.ii)&KK8O'FfU$*@+/p,NP=_Ep;d +\Ao(Q3UL/lg*ll"<&?qajhHU9AKN)Ujl<.4LKte(\dGomZ +eh7<`)sKLYL:`mL,)=Gssmm0Y!spUA*lek%77WG3-&lnTq.%=3YuJB"Z<_cUk,/CpsdUEs\u +6Ci4*JJ,2I7iZgeFDY4rABEobh5cA]AUV"6CHh@(9)%2lq.DfN,@T46?>"5GM2j[)q3[aK=f9 +FJgq^f+$0(42T+i30lhD14hSGn%4>I")QWU%%gFhs%N9Y#!2+Fj`1BRGphSAkb\b"Z%\"Ydr +20.suK!B_U:+PScP8@c?<;EP%-q%h.tT<99,,p%ng.(>Hp_ooI08WmCtH($Cg]AA`H^UD%m;D +_*D+33L/GpSLP(Te[2E+cLdOcR/RI.-KuukA0$ABtgdfiB88G +q5nG#MOI8h)eGU^.G8GjH<5_!fQD#t[\mIf>"o/O+^[FJ7rm+l'uHVC!GjL9H+3ao>IRQ@YD +B+3MrXd\YXM%9^%MMR7ga>gPMT^kr^^;mdX$)G-Bjp9&F:c2O)-]AZL+ioOgEq+,.[l8^/<)q +1:DYZ)D,!S=%8-7Gu[Njpjh"71MdVN4aZ9_pqZY_[!Z/h=5#^Z`Db/5b6[o]A7(ZZqI\em4P/ +q7$[;=6n5.9Rrk8/SCMO<6"=QC2ZU)&n9=jWW$^QkRS,Mm,LJ$)5'q%"b=i'#4Ve1:[K1LF1 +fqIQ^nB4\94HOY,ZSn^H%IE/&+7O>Z`*u%uV`g4[(c;`uLK]AoG +7hI2BR4m)>h>%0'RPAq\l +E:^B(d=A,Wn&pN.5.duK\[<;\+?m&;IY_9YM&iT0=%O.P\o=c#KB#[4Bon[jcJ!^>e6tsr$[ +dDm9g2nTIR,ah';gDuoHC4DEILjSnB%LH#?`J?q'st1<"hC0V^T%9Z9fs]A2315VWfqM3jPW3 +RQ/uhg0gdZaJ.sm-7Uc)<"r,_kI::I2RY74Eu892:8/^#TAbpGe$>[:&5:e1nDnjUf(i(a<( +U$*g(J"@[1TXB2%jgurl.=$oo_OcQY8\s)s[ZtOJlDUkg:/=OKGa0H?o=."j1,5IHF>@:?9< +;3r*t?Mp1?VU)\\!.3=uZ*H:a7QE`3$r;QYadV+\Gjb]AR$Y^`N$KmA0LC#U(ifaqCI8`?*!' +&l9KVDIqJY:.8NeWe/)t=WG@K8P2m9q3@(6VJNMVjk2k^l\k'D@r%_4pVkf!k=63M,2``%n5 +U\r"X4/]ALoe"1(<`DqA??^n---,DmiqWi!_?(7e^q]AsB8r;T8r4bhBQ!BEimTn4(X;^P6h5N +9G$217LIAfP_`HCifW?^03koVP?O"4t:2;&L+@p3-2Fm"Z@8&V:4ltn&k=]AGVJ\O96Bi/cge +)$bO*c?B1Z>!b@s,GX)W@s\'J-/$B4J"+)PU]AJb()=irGVioA@-;D;T,obT&i"sq@,CW\6W5 +XV!H.q?/;k=(TJ!s.rg#er`?:^DpPk:bsn]A-XiZdf!=EE7Pf2 +s8]AEE3E;bTk-oY22a3a&?"l07[*?WpW:=_WB`-45R^m.<,(iK(pq_B>H>W2Po:r34o/g<@db +oQ9A(5Cf-i6\BuBR[]Adrro?VFdtun!*bXVKXLt$K=46$95AR!BICuuK'CBr5=If[qUb147EC +\$s,h:s5<9.$G,4<`C6dPI3D0`2.g"?-S5S(c[boor\Zb=!ZiAGojid@l0i,sgpRX8mgD*c]A +JWVh!#KV@PAi=r&p^L]Ap,<^W-]AR,h1lN%0Nd%d.T/1n/NS)B1aq=%U7p@/OJY5QLYA`IHTHX +n:6Q]ADb]A:J?g3cs/6Jk59_K&Xf!u4<^#t_FHC^O?Qj",eU/a>KORlQCWT7I+//1\Q.&A`>5q +3F=.DSO6sJWT`:)`C?n+Ti-T)3/]Ar%DjW"IZ>^+=o-K7FJ,gl=[d6>!ma'QcR=YG[.W.Aa"J%e&Id_]A)Z"?nhfC';222; +e,pWpM_fF%d#gl0RFd1P,L8T27BE>$>)j-/+;JNX&n/Y^,>_I$`d'MR+#;X`$-[(0uoZ9N>, +)UM0dnjpNY`eVqU@g:^8fSUP\K*`p!CSeA6CjfE'm%CqTC#K%"]AT-B&YmYoj_PrCYjj^?h\G +.Ea/r5>%'UEa#T-P.bT1E^P;rg9(?:bi)_q8J7.!(`C]ABADRj6tHfDIS.m70389@]A^$XY)0s +jtr0/NnoFgDHL=sBa(H8!ar"&(ON/]AaunNa]A9(lkQZ#[*Au6&uCp*@rqg!g9'snZpGi&rj +a=\0[h"U.HFn64"f358]Ag:.">9[D1(>SMo(dAEX]A(4.9b; +&3qgW$]AV\#5H5sI&jM!\&N8rQ\OKE"rRoc7V6\nGLeYK3gT+(EmEH>UQ)AT6CD*e;TlBm)#" +t/`^mOG&f9K8jh!u?=^rRoOg.Tk?rp_eKc9?[9#X]A:Z(JCB1as5'LS\8kB+'HrYZDY_8O&1p +3k4Yr:pP3pf#9`W)$(=RFE3"p;"Uol"bKXo-Qf5$GZ1N]Adq:5Dbhr@J(R:u5>#2di9`--"oW +]A:V:m7qPYef3e1=_4/gU9<5C>dYLJ0(1"9X-VQ5e\$4mPAKpfJnO:^<]AKMQb"#e#'%:kOG@rB.6@3\tq;2rCn:5-nCj_9TqdXml'T,EGPorWb5pdho]Akfo.CuZcfoN[2s*_. +.WI3girAtVBa&CI2E;6#>EXurQ5%_.2BCmeS#ojUPWS=trf(#U]A]AV)Eo+' +Ko=+in;Nu#[5jYL10ajE=NduQQ:NWj%>'))\!qCD+15^sC_hnqEZOTG82u<;*`[3;I/7:n +JIgl)-C(d$e>j#,Tip_8iYn@6F##:IgjZ\%lZAcQoD_`VB$O[?Z'L6IT"K:+W$k0Fjr^=sfp +sn;bOHE7X35#HiQ;`Zd$F$./?.&-Yoi)cOB8FErJqf&9"3f$6b[b8NQ-2Ah\SdU6l&"W]A.Di +]AaI!_klH[<#CX`UM5D\CC(nq/4%[D\"#[7-t[MEUAD8%'$boR/WFA[PCd1)ALodTMZr:VVlP +Fh=e)r=",N1#i]A^rehqIE?FG1mM-MJ"ErZ5jlPSSmIXTK01\QZ,=%pRl7BhMaq +.*OCMTuC+0$^9iS_dJ"D9AqFhg/aV,IKj%fa_hHQBL.bSb9.N[Sr?8Obn"3K/Ed^:anZ`6c2 +1Lj*6'nJPlT:iLNeFO_+L=aR5l<.p`21nVqO^ffYlo!QY.$pUO=n6M=)$U$mgot4aEPTC-hO +,k(i'$?BZ\N>'LS^G&'AUmuP+:ku4#-k,d&YQ7U1mF9GB4pNpf0c)_YDS7k.XV@QJ1ofZhu. +KEjY*)3m8h/gCD#ZfY_R@@]ABSJ7,-P(WBnPeQEjJd0SLp%8jIfL/SG]A648hYMt&X:%/1cM/, +4Tq"[[#ZU4Ti)$jDLc*s/5$9N8X=fQQ`Mi)>- +'rFl]A]A'F&TZ`0F*AF:.5!4_%1=]AO2l@%`ml\[YYuZ"12 +c>NjO(oIPS'?m^Ig%Vsn$!_\jSM/V6uiJW+NC]AIjQ-HM/mCB\t"[Z//MZ&.%lG]AaP>-Wt7N>rO'<4-5\$T]ABa8KNu) +PNYGat]A8IE>OL&a3l?tVF&&p?9gYE7T1T%h@G.-%`(]A+*N!rkbgAQo'(]A`HN\s)(bg)Me?rj +XE1aOQu15r]A]AqJsZ7hZY;(<=p1+]ANsJ2j%:IG5 +)-T\\\)LVF7c'@k-4UeZFf(aYjA[F!:UYWMgtc]ASWuVqNu\[`V?_%$F8YsF^B8nQ'IVU=b6U +-"o_8Pon.YIS'B9ZQ&Q +7UeMQXD/HW;O@bh=iUadY6$>l.;dZ#*+V';C`O4"^,m1(DMCSlf1nS='HTHJqBDLEr.*T3Et +i/!pf.HWKVI>bh"a2*f8 +6/abMViZetA"[WiLgaXqlgYrrFVg3)4TBq6*/psH?LCinnqmj9)m:W;b>`S+Xuqu31[SA-H_0 +f=Sp!VWb;2G&ob`p'nQ,8)=Rs*TANu*K_pklQ9bmemif"TU2reWuHZ$E&1ALY[GWj":-l7&j +*U3IWbeup!m113F$W^U+nJ2e7T@Mn*,r)aC;CfuAhVOj6ccF\G]AW@'HR$\]A$,_1Q(HR,/9O` +:g?%XsY+P>jc:.O*^a:1ATMs'Nb*8qjOhTQRX)J8K-s+,cJs([\Y,2Z1,H[>;ccDdInHcqLL +lo(LZ"^rFR:-nY>5L(L[HEkXFmE4=Km.(]A1`_7]A5o]A,c$qa"7`,-.`@VT%XfkA0'c?R0c!FL5)NAUJZEG$E]AGXj=Z`?<9^Jr&hW"e(dW8F7 +%6-/Bp.=IM]AGJ;i=acU@@=:1WXS='tuSZ$`U/g"OI@p`?>4(kP9/k=@c3. +H(YLd-lHrNb^93Ehn,LD=Xt-CJfe#^D,S,HIkje"[^p/6!uO+kOIQ6URp>lAbnME,jiTV$_E +7?L2raH`qn4]AtFTd!ch+iT!S#E[0JgD9#/rBn6eA!ZpZCMUE)NG-%0?2gQjRaEEq9K'&Pf>9oeMVShCZTLR"f&3rGYRdtX8N@SR(,FA_M&":M!taL>g"8`(LX +2'OH?QsXDk`m8h3%f4]A>9X]A581]ASjNf(rnW9qcKOP+='*bO.3!'gMi3JrG3tfi*7QPmSb(fN +?960fj.g(\f_8(lfqp;T6S--)aQK#9cp4lMg\Pc[XH_+uNS,=e\ED.`i)'NeiP$#2)"OM"hr +bQ`:^38IAZ@bK-4/(IoX\C?'+c(s/rH&EnXF[m5k>?`TIsG(kl(DQ`l?$e6<9)E9?]AI +h0FJ24bZ,JmAA!%H!GQ94S1TBfs8'Aq&%rj1rl@mff_DoHm6V)^V,(',on8L0 +)Ni5">s7<;VC_-`09i(O!>g$'2<#*c7(JQkH(%]AlClV+3@-K*L#O*E=_V?rP:6fF+)P%J2Ak +sE\7!,JCR=WM5p;"LSKXEL.[3!(1H,kiJ*70n$EdY.3e2Y16mDBPlFF,mpP8;b_#fBl*3WloCY>@G.bHO&l#$. +!H,5bDZsTOK?Dj)+DOm'+uYl33Vce=f02sCVC=*'4Ac,H%hGJ[cq5gi*WT"Z$@.uB/Al0tM^ +mODKPk#>_6M::_^6L:d8ae@l"7B.8#<&lI]A_6I)Y;i&("Sf\L9-dV/=_RK2\qGdWN88hKk?C +$a06>SICLFf9C[JRAEEL1K_.5u=(BUZH1Hb7aPA>&@u?09\+K&)OmRgM/-g)%dR!Xo5(G0R(lp +3Y?ho&@Lr-OC3>;_-F-C"WD,K(XR&V5;XVrLEl]A6oL@Yo>3$U1?:MKb +FD]AnFGklLjgX';m)G"l'HT&8F/3QXfF"CiGRhc`k>T1n!#J8 +ouG=F^Bp5EQ`?9Dp7/?F#FX>s(+Am5O+O76hLfO8PP4J[heGeQE%MMu<8R3ZM7fR_H<8p=2( +NZ10FR?^.B6I%]A\=eUSY-`qlo+TT$7Tnn/3+3[5kK' +?;"Nn[7^_D"U*!LY9hn_^27>-E\TZB8>^Nd)mR(q2oP)=G3/Rhu\*t_$ink9';A^7=>m:,.q +Ym92;prE%J(?a^D]A$f8*UM)Eia-`i/3roohs(t[]AI6H8mCJ\^`'e'[aE,,I,u@\/6EuW2.kI +HdD89@Y=7%R.E*3P?BSO4I<-[Q5#0H,h?t@sJnPb4ZOL,Imn(\Bm@p/r#:! +4(]A4.:,WhQZXH^WmH6$EhPM2@*Xgf#_sPL'7q-Y=aRIAXYGgGD=F]Aj'2b`(]A^eUHpK"7tP0rR-J#GSL#0dj6D)a+Qp@HSD*7Ye#G%K<5M?oe8-sV69nCkV1is"V+/Vf'>Jr%&LS +;-^WH0Q,UoPQV-mVE,P7n#k.St/'4kj^DdIh\=c6ffBQZ),1/XQia`2pi:7eX6`WOhk6!L5p +T8Id^&I,BCOL4gYe[o#(63Ms0")9WR[%F/d?n[6)mNH'LK?^dZO6E[#B(K+QH`;d6K,5@Pr%)Tf)E3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +gm`5u\$^Ga>0i9qhF,U\h$:B^3hTV3G3HF4$8b +)-@q=F3ukOEi1+.q0NomD6QT-S2F'1%(]AIPs)B5r2Fa(`OE\1E.;1(,+"K)=%eJY&%ooCh?- +@G2_IsY>;gY[BOQV5ij3Jq75Z/:Dm^[Es_FaB61UI.Q7.CmIj]A'KNmKL]A4G7@o=/T?AR>@+_ +RX:_MfCBgIbks"Ic/P@#e@[V]ADRq?I+)Yk'"'t!s090TYo*1Rl,W>A`c:57;>]AllHdUEF:ZR +K">K<`8hpA+QG34&&FD.FU/O^5cqBP-jeDJoRV-#m.hN=:+kk`]ANn_]Ab"KucIMfP%)8OmY8Q +W$cN'pUKqlG:e.$mk'mBk+D/'U#S@<,=/mPX(0>c^;JSfT41edYp=?IV(\"WEb)n%CM3&TkN +Ok/Np+6cM^f_Pa8`8f$jqib`+W4(IJ/TW$4'4h!2hoECl/,/N,41kq7M-\$19!H ++pH_D+@t0*pQraf'ZGrno`8o'%#u=ej*-XDZ9oLM)253;uh%(UO+AGX4ZArYfE'Ann`8[c8r +kdoO6RRq*WOcWr,,s%*XmKSfkW'lgC8,4cV8h>a3-o7-&6lqPA'Y5a1ICt#FRb[KDBus6Ej]A +D@/URCYKh""W6PV9oA6Rb'`4kN".*lKSd!/U01l5SkLW>RpB!G9Rou4W>1o^6K6LNo(!k/0_ ++I\@nH5*\gb&%YLrXKW9bid!QY+GMOF3(1I3o3(3'mrC:J22S53/+&*aYi1>l'+so\"!?JG$ +5*A8BJ'8\Hr#fDP1dT2IETJCT3mS#7dH*k-lFh$b_ft^gYm$.IkdBM"SNM\FeN?$7+LW^k_S +iabJ;nCaXWKkD2NMSkrM5(Nf@ZHZ^cVq/+j6&74n(nN_#_.4G&[Xga9p@[D3_)_Gl +![,EV_t;U^_1_I"S$i"*he2qV%'j_4@EX>S<-(.%?<[W8?CB)@=0pDie:&,S'A +:3]AB>h04Qn>7(.EC%]AM?)Mp>-\fg\q!:"m:0;SC0=+bfO&@[]A&+3s.Dg5A@W/`#C\>ITeT27i>be>r(c`m[Rmb;,sQc#.$%7c=,fcn1EPg1?]A?n<,JU@aW%?&"D5-B`6N,cI;WW`t9c +u%81.&4BKh\5>.8Y&GNV=Dq`ej`P`.$//eDS#'m,'T1o,62#%b-&*K@0:ip\#7H''(W[7[2h +XG"17Xr/=Gps+1\n\=uQKM:jV:;W.MDbp,>C6;t\CnT[f0(<9I`.M:0PkjRa$XBQNO2aKUk$ +<@c%t#hf\8b+SXeiR@6;9=1%W$,94Y/fjNr8dhWscMh4]A2l4Zt_tg7UdIqb7)d+,28X]Ag.#. +;1Jg`cDQ-0;^.O0^2^HQh9:[gD22H02bSXr-\(=jmsVTgXbn$S,ZZn9!o[<8!Kf:JMBC(%eM +*PtDsrI!8Pc)0_XX5@M.D=??D#5Wn+gJUd#A+qBW(B0Ri=OPDmW=8j=pEnUZ]A*+*;bK'GH'" +"U^DpoGflSN9Y^"pA==B\8A]Af;:"T-A;_IC&3QT:Arot+$>"nu6DRcFj;PN,?LL@(p(jc]A1gYsZ7Pf@=H,1fqATWs%^-<%oj\:P>9B6P+)R?a7*TfB*@I>M +o>'H2Z2,Z"[PP4(TpERV(4-iK;U]AT>"/8@E:?+5)Xbs.i;a]AB,)f@iUCSROaKNrK9_T_ccpS +auK\X!VGk&A:5;@@tQ"%GV1A0:FKXO(fW@*F>;ZU`GKjBF)'GY.>U?^jQ?8;bbYron5SW4\q +\,AGoJXPSc=KW6^HR&1V.UTie0Y%XV%HWP=%al+_tG\^B-++EK.?qjgXYC>G^69aY.n*!,-h +\)&o$g?]A#R_HZn9%=Ib[&P(:s7Aeh<^_BTU(TUmo*`N'ohr]A3-@HYna +DgllPeki\'ftBAZ;J>G1RjWH*K3]A8V/mN%L\k1aL>-gd9cQIC"hAc5M*c*3SWTKUVnfo)7q@ +`&4/UnD>E>!cLj"bJ3$Z'^u8\H/\?Z>P$fU'a`*B4KHlg/[q7<)@-#!ATne<&3o_C=gbc3P4 +?1Q(B]Ag:m3a^UcTds4Y(1&-fN_HGbmcGcHD]APpD&L5Kb]A0-Hi-8$6gQAMN9>MrYts+Hod"(!9;\bn ++XO/;ZUb;&U'+1I_u9oRCh>AN'?T=9@i@k/MYnnBVO#^r5m'%ulZ?TughZ&j@Emmd!GM^pn1 +VDmF>Oa"l5WM?pTO(\5mI3Hif)D!K?h(6aj_hbjHs,7Wl*;8d[8$N +0Ura_M\an-l7#N%)O*BJ;\%d'41,f>PjDhPnuPH>U79WE&HY\if)6!tf_3'AY +7H,>kdL\lia4V=d]ALh:l&>05iSgV:j]A1<OV!`a@O\;mMUk,EN;ZXkP1VL*qle=IQ%@H` +tcQarC,A`0I*%F#5Bckh4,Slr)On&&pRELJKuoChF.>>776,Nr_T4T6S]A!S_< +WItRsr1;U4?NU>7X0Y<=D.-kh]ADsO$aYpAXqg6IILgGG+ipLRX#\$iQL*K<,ejEqL7Yb("?W\D\iHpEj*KJ[oX1/9BOk +9C%dY[Bgon%sf/h`X_mVJ;CkDDa1mrOI:rRBa4rhpJUP$(nXb\dR\Vp%_p_o3!t)l4LIq'WF>dF87@b?7>I8nr#We`o>ZOE;$.n-CJ!adjcXl!@5C"jt3Em"aH.@NJo3onOhDY/S,:?+6M)6fsoI1Kp6 +V_.[&!n +U9&@<(>j4r5;jH64^Uj3'h,SZ7V;h'gp`!^=#E7(r[%_uK@?p%i:bu5T9@C)adeh',,BleED +S.>a6u1=O'LkeueRUNq)qF`FeM[t#A0@#lfHMrQL>4r=CLh;j[=X4ncmN0e]Ad$r+uqOjf>[!U!?ZV9Xk6YpEo1$+&fGm)g%D +TObQ%JWJL9o94rAJ?(C[A4Y)&'T2U*Ob@DK"qU@b_]AOfD#MCegDJZ5#(O[;;KM^kn;KXro_+)p% +D!Om3ZWqu"W:9Hbu,m.A*Al+[Opiip.E!-&aAT]AeZ +@Ah1]AT<$F`u+/EGs//90W(CdYi&7N>M<:eTe*buP2i,(Y#D6`;))/`0&.h4Lc!8ugfI>2bn9 +CrSb^2g#%R:irooVtr31RMHY4[og-rTq@R,;h_$S_pc"TGNgYF"d5r85bs=TL)QG61rV?H!* +l,!pH(2BN<2=VcqFJm%0qjeV1?YaSsVrj8_/:#KLGVUk"&lmEFRBCNAJ;W'@OG]A^95lmgJF6 +4a.guF7f0AW8\dn$]Aq:haG6<495"Zcd+EAg,c*+rDOA2X,q*-gE[)-s[gL7iNu&Hs?=P(B&h +K7+/ct]A/**kYM"Pu2DVf@V3=1BKXI+l+k<8CZVP=JB6'TB1oE^=s("/p@tQdMk;\ZbA1-k$F +gK6&>M'@M/ROH!VJ&G_"')`aM/jjNt[Ogt@pC=k;*h!V]A!BJL,cE`J<)QDip6cA"$9_gD`V= +nRBK)BLnC)i5.aK^0CSWcs^2WTmc$<>Wd']ATIO*eI\5CBB0CIm0?Ug'8%+no6;?BNR[B^T'I +=KmQ,aibZ`A'?.jb^nojpX2%-5k<6pQWb6f\i?FJ",h;CO"pefroL:g1Wi:@6`4=.EY9=5(;"< +1lVYuN;>-AejIm&rC`NiE@!2c']AZB31dj7_C(`#NO2aA)hgqgr#0\?G_GA(HeT!G#5Qr8-7) +N.%AJqpb1.1.?l!R[YMKR/52RlY1EKpjMp0QMpIhq[NjB!(kN@&be$7q_UtdTd$h6':02C60 +1SHb$-"!RZ/(8%4X!68a2ZdpJ".N@c2Y,e$&@o=TsgO&OjjQdk7_<[u[LSI<]A3RFt*5"V&VR +FRbb5k,qFoHp\V(fmr[I^S?)tmD0[K;N?:D/GDu='pRT\:$7$S6k,ZsXrF*K.%D:l-K(gEYN +q,fmZt0o?_\MJWH/\HHmd5g7!UE$%LN]ADP.P +Co>:cktmIPD.d,?C4%M-g";/;e?`.f,g=ntcW%\Sc5_fcn-'RWa;ql7FqH8?R +PUL!-_I\!m>W-k$@WS)+MBqqQK@?M.]AZ@C)4f'hRM#\g5]Af0P&"m*M'icrjeRWEokfpBh>O> +5O''*W's:7N9X^]A@@2!#`,c\=`8F[Hea[1_&o,mkarjZ_Q*N9B905YsR7=m702mnW"@#lO6i +#IHa:V%rTq`C^Zc:uOK/DlS-l%@ftM\1?(FY5iE00%l6rT&@D+*d+`)8ZKrbN8s[>Bj!V(5kJ_c?\k'`X*G:Xh +ZPK)E7f[iq8a'a!)ulT!lU<\_$EchF0d)"AYAd2F_!$OFMmENf5fj/&V+jVcW:hn)#CVR2pR +WbL.<7UG6=6*)blOecO8M'nl4o*K&\4o_B?^ +2JX>b^C58(f)7Ni61f43%j73N;IKcC?]AcWKr#1=25l]ANT^G)tgH>&t+,Wh:MG2j"ll +N83=Nk&"*>l1'E`$o1tp4CT7t%G_sJh5\%g4tR$F[15RY?hqn_-)N+n +]A$'6'UP";YXH&cDJ#(jCP*+O.-=GUU2O_9\d^IoZ3r^RB?/!+'uq=T.LUrnu8jKJB8695u8U +*JNY1k[=io^a0!@7LhcTgFh4%tg)B&(5sL;C.dQ7q'g>NamV!3u1"haBIBuS]A5q92!e5/Dfe +@c&kB,h\Dp#i.B$+rl.4Tlp]Ac%=K?(k25`Jk:tl_tj9i43l#Y51T?Ql>gTIHbTSMb?kWeV!N +gY:+s/spBfKU-M_>ijOh2qAW<#@JT[%EK[36dRJX:=X;q]AdQ#T6?K;NW5q]APdBabug3LrggA +kq,c^\5Oe-5(2eSP4c<`$@sN1XFo>o/>D?SLX^>\?"M/[l1>L0jhf+aa%QZlI/RA&[9-;iNK +9W<15@&&q$O($\&,r,,(@gHIJJ:2nF6H2.I&XG2s-/m$hU^&^;fCnln?3Kg9RfE'0Sgq`T\- +8id*tgCn'HI?E61sLXYSSBI/0+hasp1m2\]A2[GaV7Zh2bVVn]AqhKsNR/GRD5/4=ap5&-/O98)dL0!C-cW/nbq)I7!I`L;\hee)mKOMIg6c7H= +Jk)[-;f".9,oK,Q-:e41ZV/7LFU@9e4agG0qmk,*WKSddBsI]AJ+nBX.OA),tRcp9BT +UWU7'?h7Q>Xhs7Idfi\.aX@e[crhUS9$\)0o,4627'a-q8O:X>r\i%B`;@q\k,RCe+!/M&;R +o2eE$*Pp-p-(<[(2[4X'fiF3E'X*5Fh(J8PCK^/uTJ9]AB64Hc* +leBDd4o(9JBgT1&fDcN/gheZ%(@B?h`\X/`i%LG5(6I>OZg;?uR/X?U&cS3SRnmIB&XHl+3B +b7^34=;f)LmZlL=uEB_@Z-W:C@!\njBBEIXQ*Q9G!)uO`8H-(_O*tKEL-]A;+r(9.GK;oHbV3 +L8oj<*T`$g_JdlNCC$u4tP;q<tEEp=4!/aCY6./!'&&7JJEclf/s',a&L&O +W6[&).6IdKTa6Wk,-q7`L+-`B`hI\6!lH8l2IcXlne5):*To,jYBJNpesNnV"7<>hnRQZa*/ +j>he#e"iRlV"T,m$a$a_W"$]Apgphf3&H0QYm$rqJc_F:.#`DW&8T)o!O/JaH.PM.X/SU2?M5 +*4N,u?h(FB+PX2:nhX8N/Ti5H2-j:BC%0qNUacR^8$_.K@)fgQ@4uV4MmiF7o#aBtlSC-q)M +DaLRAQ-ptLm+&^cq"^#c]A&^=6+ms9g7MM8TZfVdmd`u\U=3Mg8J6U"hK3Ej0^FF7_T\j2j;, +9"[&PRSP/.JBqe\&S4;:S*NFX[cS!CZ+"'T*L)_ZRH6LjRDk^Hg*oSAs6G/Qkf8ERA=O<'h) +WN/4o?@T)h/]AW=Fg"!jbs +h'H?=mNlFWJV9c@EKh'a.7WUo*6u2o]A97*BK"OCZFSFT?_l'Mgh86a'[=n1qNaqC[utpMIB7 +EdZa(()"K4.9AQn[Uj(l7E;3NtSglRujn;#oXm_0Rff7ei?!/sW%+Up'$(@GbI*at3%.T9td(V3o<@U-NM(UBUggnIX +7;Z3D7m90'QV^SbU+^ni/Dhr^n5A7pVD(+;X=!&D6<$[7s"Qd?LdLp>pdB0?k5fQ@j2[&Y7u +P,u,1edQJ:O,Xr;Pp?$A#O0&hO]ADmT^g1:@_-O"#DqHbea-&57JBGH(r,t=Z-W'9G]AEf.NY!(gtgh +VB_LCTl3OZ'X5.!@`)T3>d[T1:O(2MQ3HK8=UFG$\%k^QdMm"Dr.)W7JLbQ"?-J30Ng!eF!m +m@bdd^.VAiCFQQf@Up-U/GBLTUGk4bS[(7cWf#l"fHZ&E@_Aq1eU,3qNTjGg&1l +u>j6*.jIn&8nNo%7V$i(=QFYD,ArdS*A=0;aY1,2=_7VHa`mloGH\m=8ahB_0*qm*7IAo[0= +A8eGTp_,;f\b/h3-jsn2%&pBhs/p',hOkfJ]AO?GM;!(Ke2cICU?@4/:s(cJ';lQ/sh)D*ZfF +hV:d8%sh&g^YuAorZ]AS9rCB37]AWnpsJcPmBG^Idi$F1i7k28;.ec\7:h4tEk@-eN$=f(E@G) +UFU2G)f5]AA'e@S+,1PnbA\qNfCdT`3iAELj,S;:3\*lkpAP>N31">!;J3N"a_8rua7Q"mU'F +q*'ImQSm5*Mf=POna'V,EU\X_..btXaV7s0+kfB!F=-QXfGbi4Bi^`)*G#EHR2X$E:80p\H^ +CB_*'3G(Ui\WLb0QF$$C',6PPt>=C"\f21?UgYSB5-Z$u#fS@2e_D',.jo2jYG!Ns(aTu*VZ +r[iH)/!;q/G?IIV3B(nA0$hPR/)jZWoJqN:U%P$ +nIOF2L/S-XtF2PBsDMWl]Agp2q]AQ3,[GC_[m?E_;6OAM#4\C`Mr0r +%\M+VMaJ=LU<8`_9ma2BU@ZU*&%?0/%="3qO'Hhb!a4sV]ApsC2l1rJ\Mj/=KJ3G242WOc,-8 +!1QaSX!T`PQeu.p;:Tf`W(G_Ba\?N;LM-L$d6a@g.2un6ZR_*A#bM(&$K+eYJHE'i'a'WHd1 +Qp]AB47_@H6e]A3*&^!+KVL3XK85"mJ$Uh#,`M=?Ud_k!ORY!dos"Rauk;lKQX7G7s)tQK#mMr +rT`=<#QE[TZ!)?Q0%ehh%mD.X!0f9^=W5D+UqX1Lm.suEm10C=4)*kI>9"4= +SNRD`b^rgd$#HDM]A7Rc,4/& +Z!@7Yk0oXDpRNlgN'K\O?)87f#\>ST4CkMi!7Pr-6@A:>D2GHMput)rS%p)d%"]A(!LEI#LUt +"VR&"FeMO3Ygli%L$]A+V/39MmAh]ADPUgP0JB9NPROcHL7%IV#MTAL=X-InT9SCa:nLYp-#K+ +ZeFREVX>Za=(S"4mX&&$?G]AWQFT;gjZ?EKT0TKQ.\<_LJ6*(7D#!TWfD[6E&"G> +k&]AOqjbSB=A2F5ie_LT9hD>]AKOs-MjYE/-5^-A"Gr)HqB#liO%TL6`5[XSiE'8Fd`isO'lQd +YiFX$Bf,@9c*;V7i7T<+0k7]ApRDdb8%rBFHQEE"5kZ0>Ln8.*hJ>8?Squ^#QFN +=:iu>:IE$ZaeuOKQFH21)B*/FS%9MfVnK\aM]AU*]AR(Bq]AVe%RXBV=M)FbA7/:EPO6&^Y9aHe +-gW>#YD\e)T':@O"IcHfBCTigA9!(Ff(@l[cs34^SE)]A/36OnB7Ki1d3L`/l\=oQ")O@Dd$' +92?2C4SPF.fBM@3rp9$,hK,*?Pa/%N[7<%1\N6'QC]A:^Q]A0/oB,!\j7'I3/JAP#D6QLD +>82LC.l3m8`0\luRDoB5\!t^+s`]AA2^hYfMB61lLB"L_Z]A*K\suK]A5@r%C+bII7RgiU"EnYt +ua(B8L/^N!9mtUf$<7"Iu\5&kp]A>M`e!7)AW(QK#X+-BUkkf+%6fVGACc8@'lA*=)L(6^;LU +s+S%3i*&/:9WP^:WR[\GUNIo2-%=6o;nWq!.g"\I$mZcTS2U\<5&tsnQ.c]AYt($I76QZtJJ:le_d1K,5'pEr5l-nD4(dr10_.W`-?mK^YUoZ1f"XbK2:92!U +QmpF!]A:n^oZCKfddFhib]An^;P+(NAdW`3%O:4dkj:b0*2N`?LFftc=Oi8e[_n0?$\E%C.<7)/me9XbVXEi> +-%><.]AhVaUdc\kT6c%K?Mif9Jpfg+>^4WaT7q4B?7-B^,AGcD`F#R4j+KJtGbob/;r ++R0&LPJNqR*oRrqh)"lu\X36`0r9pdNN"U+``]A.3C>_0=r^hCVCan>DX\BZ?pM]AXZtUT*4mf%8iT^I7-OSq0;R1uJSFrLHbht#;W5m^#TBcZBq&FGT,rg +j;`.Nmr2j'>W=).E\.GY]A=B>O[T"3J*q%:XemX1JbC0Q_tb66^#?O>:Q%?Kt2BG7PiZ%b7nR +,C/0j%BHM1rWMQS5NKG\*\04#JgX?@VKkkWH*!,VYjT:;]A\ObXj_2+k%Kr..9)=r3"(%ce&`IH&PC?%>B?ZYPcuNMMjE.i;%.bK7@.8]Ap(.,]AZW:a>eWmC<;i/-E)m'uADjfY3*McuW\)0f$khKO`4/dCE8+#.^nl +-/"Cf$*)[F/h2]AJ?YVg=1mhXC[^4T8*YY`G&^g%bRLqFQ?2Qu1BHpu".V9o?Ah%PAVpN&s,> +J77rYO/W+i`-k1YT2Cc0FLcr9RdUS5k%1@sK2=l14'.Mf-Ku+%n3ZG5>bq*^ +UYRLTGq8cuuINoA,":W`^'V/8N'=>c7=T)rS(G_Hoj1@Fsmc_(F9kT*5'B$a6jtYD7mOG2rupf!#&IVBNGVSl[!XjHho +=Kb=\*l;T<69ZpL"=kJjEXHW4Zc`W=H5)MKWl6G#`r=-3"Z6$!Q4+OCmdgI\gJB2ZC_kFO?JYHR)CFlqFS,H6d:W-"ib86 +Y[c\HKt1P1;A\'Os.&Pm!@BO-/^/NdRVFpia'%_ahjFJX-B('YXdcrKT9?in9(K%oiMMfGD* +?dNIhOE>?U\aLpMu5&:mqYS>jFUPC`c\1Ei/%s.&;=hd3h +/2oRL2%2$W(31bPCNI09J"b!4M9PW[n#SZZT`]Ap#n9 +"ot";=T3EWFT,/AXfQg+gnk]A01gOZ;6_Z>a+(06;seq<[%l`t+fORN0^ZE5'g-"&-S`E&PR_M2nQLg^LB@\du2GKL$9MO.%:&s +,38d$'/0C>;ShX&&L':=+$HJ3C&_>1Xur;&CkE-fJ'Nh8;ckR[hd]AT0=19?GT"Ae0->7MXRT +')%d7W;c.6N9GQ_]A`5(jf.O]AC*d#p#gQ*E0?i(_SFE>>aqYQ\?[\MCHL\m9.HMa[A4UmX2T" +<<205"I`kg'XYLFfoEQFCr/:7m';DR)[M$:2ldh%$sn-stBV<1W^=p@hZP#gTJ2i^MgXj6.Z +?_]AQ@cBrdr.2epPT?B.pdPk.#e5-/TPA."VML(G(=eqLk#6DZgpA73@Z+ +k3.G/a(G"A*^`T[&q8-kN6DqBh[F>AuSkN9JXR&G`2]A_niq8g=W4OiT",*cImj1Zl"GA^:K+p +oQs.9>A$#_Kd.NZm-P#qm&,>ZC2O>;=q$dqmSR_s678&dD>Z3RYb?lhi6_1).ID&K`^^@TU]A +.F-[ATV[J1`AM&mE?`$*$H)48(B3-=L1,\$db_NKPd^n(eZG&H>pFB!=d/bR@0XIVS@L@,; +4?nClo!V&'arLL,p?'l1V#^)B\mI]Aqb_:(jH&R/q[Jg` +J^a[*m"NW8"d?<#@WahC5>9h'@Tt_AYG-\&PW8Gidu_I0F2d^L +o6-pd@%Y9ms`9fDLj+QK,[Wkh'?NSMh5:EAA2i[H8>M#)Gphs/XdiKoa"N,pK"Arg<_^8WXE +F0o#2ET=MAW$[)2ZG-gE +?-e&0l:r2:"U(h/SWr@`-rCn%elN]ADo[fK=N/p(@aU"#U2_q?IPEcQJH-H7KY"B<4pSp"6;[ +^EpMF))4^`H`gp112Ed.\-jM@%1k)pa5t$1FN3=KO>X2TfhTiD]AtYU3cCKM<6`m,F/aFi]A2Z +_;(AZfQi(Li\XnpJ`<;7cHL9Nr$ZEc:=_B7c[:YW#*pP0O3^TR3bI(isq6PC88pR_\ufuZ]AhtZi\OTM$XC=Ok_k3j/XcSPJhkj3QL8N"dODi[6ba;]AqI`+MNH +bde-_0-,-_P!,ZQD!P'M^8MZ]Ag0"DQHl7H)h,3GP*9Kgr5MEhm`MQ1]A2Y.AY^A=9+h30h7<^ +rf\6,?b+l+bpUsLo2W`<)bSh"@(CC,CP(>*;hK[1hA6H=)6:%EaQZ5V8/Pk[I%-nhiO]AFIi+ +FqkFdcTj;V]AVfOR-1g:9B(Xc4]A$PrP!XE2A]Ad]ArgY=pQ6!))TC +V\8%>$J5Hbq[fOK:^c^0r&A1^[BY=A%\fu?AW=lXPL$JRau\s&S7HIEhB"[qACk!5oQ^/b_j +bbc.j'a@%K?HhOkoh.4L`!h13V]A%bm&e!9^P+lFBs(im3fZ<5=L,\@2k>=/YVRDcusH/?jXC +Is8QPGrAdDfqiri=Fo+lD2AeX4>WSq$I75T4\^DA$C^g)-?WBpi9beNp[*(DQ2;>&iW2-*#S7lYP'KW9<2mnfp?;ZC%&kfP## +eD)I\=fBK,1+!iAYl*c4LK@'W'M^WL;+Tli85f$(&S[@ink]A +1kqn4K3VCaSrYiW<:!'nIAL^;'&SWEkq!1fHK;rY0A41"fbmn!fm!KCY+46dhPSF]A8]AcN)1r +/4FIH_uR3``;8e[5AFE4#QC,#H)@ZYcGakk=>1K@^0Un!K=X8r#CH:X\RGmYLi.]AN-\Tg1%6 +:;)oRfE\AcJ]AX +",B8EW#\#1qKfWEEp/$+Gt-J=0kmD@Bf:r?#k'Yc04*_n_cS>ATom/]AJ%lI\9W\TEQ7Y[Vqu +%ESr)iIF`@SjRC$>'7Z-Ut;EpRjc-j\E179t8Na?G*0dc1&cI'sj2iL(e8,7CeHch2Sa@)p+ +C4UGij'n4"bnn5mYIc4''T:Zu-V?4?f;-KQ`(]Aae$WLRA4&g +H?MmPLG+-29;s#ACN@T`W(qSAC**d@ZiL2\5k>nQ1H@/uU(+Sc438^J_2df/C*[MUf@r)Sij +@XM;/Skl%Air-\9\l(S+m`f,e*]ANN;tMI,@_G-F*$nu>,-7#<%Sb>8jrbC^P^'HU8m?_K1KX +A4&qG8c`=)O4Bt+e+*P#/5*jDf^d5aE&K^(*-6L4rF;S33?mJIoY'rI?@\EoCFW6[B(&&Ibe +LR6D\*2&-X9?Cdn'iX$UA#SKjIq!2jWneF;=[QqbFD;b;E"F9-`u'ufP1Hk=>s#UeeWpGTZ]A8 +)Pc;h'c8378cB#'hGGpV>ND7FS_K#N/XQ$3TcoC6#$ON,5paGb+*H1Y0p&CfST%VN>7/8[qL +\GOljEsfWtJ>_h#pI%TL;B!G.lR!&JHMBF*7E#Due;5+\&AW9.iDV8c29,X[hR=#;jY:$UJ7 +><$7Od8N7e_pgB4RJ]AI\?c,m2A(oENRX!f&@_A8+u%G^M(r7a8JATqI(oMfgBgj6";Lq/8$9 +(3:*'$?em;1fBmC*n-e[5j3*g?Iq1%fL;ae9LCK:\gleG>ok4O;jE;,[f6hLn2%d +((#OKT#'RPY3YJ\86_k:\FuAjhK%u&:"'bLCN6,nP?Pe`$ZNub2W;!g$IW8&0Ep*8U[RC./U +/:WX'9A%R30e/&gf!`6Pmd2>E>=@lAFsPDY=)M\5)K:+LU/TM:<*H!b1hLBkbe&2ig&Y#qA= +7l0V,F/V=@L2-I212^6iko$:%P!OQPnJ6P*1_5H&It<]A]AbGKIi39l*+14A"hKg/6:pY^(%pU +C$Jm4Skek)(CMV5D%>r!Sq40L=QV^L$=5pb_A3D#Bj\!+[Eib<^%%g5Hirh8?o&]A,o>uMp-@ +b5IBD2H;,6!F^=BA_Pnu8cg9M5SMh_!+eBST/N.bg-r0:2_'X/DSqT47;AW$OI-[J0knnA-./S,AZ8*N43MVl+N?SC!\a_L +WOh/>o'o2VI/EUoktPeRsg;33s!743dUW'ann:Wm#SqKUeuqCB^7r7@ruelMU`G$?/-k.?<1mb:ULIJ#@N:W" +qkk9trThh+qoFpS`4PBI%1Fk8WgU/+Sql<[s:JY-gsNT.j,&dGRk3UtOS"FLcHJ@suHgJ]ALo!]AN"s72/jMl_;erBErOjD-B;ZlYJ<`?9;h[c0n5`R#e"VXdQPZ +E*8pG:CqZleOO=&'j2&Ro2#QhodquO/u%g?HJ&'d&D1WbAZCNPY&p\%gKJ?LK%VVN%[SnT#j +?12nisGpbI'"noGV^-qBg)[Y;&l864;DB8(9/jX'U=j(Gu33Be6$GC>PUhmN7*WgZ`mfIZ(R +GoE:fHD6ka)(^"Sj%_"FY1&^K\sHr5^ME9;58(+%SE^'7De#s3N&d&+F)R(0MK0dX@?/u09$ +38@jGm)0ju-GCKFF&+pJ&3AYoMkkS(pu;r9*g(SitDkB@$0tp3bbichmBa^#%@FU4S0F.9\> +LR([j%OIBt]AhM!;T`qgo8/PLPJbrqlP!$*Xo_aC?c0:`3IapLWlHEkJ+HN5iZGENVZ:(T@4C +,qgfr*@"mr+ABe^U=N@I)dJ8rdGO%%POa=.SD_@Q$k.#B6Nm]A**d>)/K-?/@c$HuDCua('3/(u[cGWG%nOmb97NTljqqiNG!FU;L.W!)H*Ok38E`I6:f#t[H=<1oem=(rOl9b7lq5"Pc@<0s^n`PnJ(=HSNGu1M5XnG%X:)6b +Od4qmq@Ka['PD*PZNm(==92B$(?o5R;gt>7k.=YipFJsD+:QHX10h:Cm'HZ[?n0?`^]Ae#c9* +,^Q!f]As1\hg*:M)sIe/CV\F*a\Ol&A1&<&NJ->cQ]Aa=?g?).N:+cmg\"6oCn;j@Q(cMg%Ybm +&)Riuu`UP'AW@1T8598_)qmG(<$!8kEAHD;9*9t;U:DNn""cu8PWs'+IE'Z8ePFq<>N2h/fu +H9uipqF0MqS)\sRLV%lFH`T8ZV\A-f\j]Ab8SVong*^@.3IHECXn7LSQq.\/ua`O7fi\[Z^c@ +rN3n%6:oE\JT"bBLF&p$6.r2keB?:Z9<7WiUd=[q)m@"lu4_oQsYTpfj1Z&[5A3/YCFjTngR +\L?a6ec:57#!NT&o>E,_oZ]A,>Vd]Ac2'_HU^+(AlB#?>CO<[Doh +kF&=U1HI_9;g/rL\^#9qYI;$F[OOo,>c4-*Zp^*Dc3rRfD^`YKG3Hn:G@bst's;qQ%lM8^Y^ +j6r9g`.*\g`&1YR8\Fd"OGo;P1B>1r0Y=tbfE&jo0#fbIrE+b9BZ6qJ;3):G]AjM!co) +#pB-D?+kSQ5C_jjYQQK]AQ8ZMjY%0p5;H7C*?Cn)cAVJJI/GqmKQZj8p!(*2kpH;Z<)$W)pLK +4fOn.XZ3Ura-GU3!g=7bkAB"oGD.CkrVV;QoqPGB;='j*77/(S@Bh9$W'Z_A%"V=UWZ<4]A]AL +&/d:NI]AN+3np!9[XqCmN6ZOSHDQUsJU@6RC&je!i,nH3C\530me39=dL[e(T]A@`<,I__ +A`ur^Bo:#Faa\09G19o6D +,]AT0fHlhMu[/A:kW:FpK9F8e'P0,kV.jHojF__anD^X"n*:4j,F3X'5uDVhHZ3he10uD$:@hZ?"W +XbSCCL16r/nE=7e7XfDF=FaoN^(5*41Y>*(rhK\pBs6&$cJpOp,VrW;Cn2\7KHs6g:CqGqrg +>(>s5GNR6[gV:S+`W-S3^PO%s2lf\."]A.PXoK5"K6e?!XT#a<4"S:u@.uZ(FF3V7J%!_7MmB +/`07AUPE9-52hqI^bGEhFQT0:%R[Vr/[jb7%_/8Wgf/kuN>CF2)eHWu?/d`Hr;qPUiIPl",lj%%lN?#T"`3co2DGhr?^-T'Ofk;T7o\reO8_K#b8M!oIgXL6):SotT/R+lrTg9'b\Ej$h[\mYE!TT +klgYK_FEsH1/g:4JBdT9C8feE*)-7n9&VkZl7\+!)a7<=a.Z[)>no-1So(i%cj^.MGY/%1b/ +[_sh1()NZg+dbL6dir;j4;1jo?UA6V,h,:W+VYMc89W%'mqOD6``]A'[%CIHm"@CuQ1)6Sqps +,f_;&>n7k0nf'Sbe2@5YSW'IX(Z,KJ<*(n>XT3k)5\C2D1&JsKlI.3(f;,"0k*>t9$/,f/J` +Y3QY#D`\s`^Vcsh.*`iK8C*bn+Y^nn6GHFJqjCki'SYPM,]A/^Z_)bm,nkCZ?+)d^P'9-oT,_!Qps\/@o8N( +*CDX7C!,jA7o#OXj/:'k8"mAHo@4s/0&Lnqd9agS['+[oE1%#Ihe +u,&^A*!T.)QQ(Sg$Qn`Z2]A52,I['=:]A`DcG&/KIpfEgA)hF5rloHFRFl[WY=[N`lQ!*b@HGI +;rV0bHc$Cld8hiXZcVmD1`St6Ep#@lG'bTc8+Oc@83IQ'lMk['.#.0`1gf[:gU:2(V!XcLRV +q?YHW%.O>YpoNb<[D9Ha4PUUS=]A)Jr>(nG*,$"4S7AQpmCLta-Q1.Q^:JAfqnd4XupYRQO7! +[GbFWA10d0C@GC%*;Ah"cSrXK:8U@DP`eX#SUdHPAn,.-`n(/u2NHd,V\!-\8&Ut6:FecqG]A +kYO\j1tho,#7K@barmE9/V2_>Wqo`j,7e8_m9#UqU\*!`O18Ob1&'Gk:GHlE#.mI^f:K!E&X +J$s!+VM>Nghu;l,Eg&O5_R<,#G*2R)stc_0CG'Q"(O,K[G[2^!gJrt(IMQe8\tkP +cr1s+h*)I%SWa2/ZB8&7^7D40IYQ_V[\H:[&B2`VJ^p>]A7@;g?#N<@7]Ae +N\GNEju)8-,M#b.q$#p1A/WOp:KHOmg.^)ZNF(V+Ys>RE,4u:LHjYEn\FJ,4"S$dU%!IP#5r +YeMu,fDHGlu_AoU)t]ACfXj[!)kjTR1k1CEWqr2]AQ\AQ#;'JB:;;2k\R`FZ#0-;(cho2q0(l/gu1ujS'$3!(Zc$tI@*'49h`ZmC&&8Do2<-u@(B4K!l"h +F\Ra'a%jmP9*U$k>bsR^Gu-nmd0UCS;tdKVk[K2Rk$75baHl2i"58T_%?iWP)O=%4Q%"gkur +r8HUPTBR]A]AV\Q2dP'LD>3nK%mt&d1IGf(-g3qH*hBLQP'K!fQ:D;RrVcIqup9QZPo#/[g+*; +&9855gR.%juRubUtBL$;b+W5poRBJMTt8RoSnNcHIj^">.a*a3XV)2#`m4\afi23Z4:KPZ'j +1/"8Z%OAD!of]ACa*iLX!Z`=>i_ujW9WtG7 +VgmW5EuA6kA43MM2JY+9c-drKj8h?P+@9k3[D3*0TjW6+=BLnJ'nd$_.$]A.-=0RmZs'*8$e^ +E1:b8%'KW;oI80Y:2*:*XfZi^H`cY'DL]AJQ[A.VXX:Wt2A!JC.;G8fpmr)jL[%6:DQS8tj45 +AAN'Z8>_!AYQUXF(6S=b,Wk9,EAeZ(3aWd)=m7)oj@!qGp8\tLW(K9^5,iE6!:#2*O9?**;\ +IS.NLYmqU3[f*B`NC,j>F!C9)38OSTUNI6V6=77u=]AUGENd>'H)bj\08J^ZKn+QXGTj]A?gF0 +@G`^BoN=D/:I!ToHRXu==AWA?+;@&=\<`-OFK.9P4r:N/emt$qkupp$m4HQMQ+Zh\Y%#Oja,'r1g_L5/48,_95]Ao +2I!2up/M_MTs7=qpfUMMNc>bma9KF5Ck?"Il#"mnNd?0A&oM[e".p5Nd[6i9e/?6U6l(#W"QVAt`U!^Q$`BM\R`gC,j%mfr?)bqD%-gaf^^/u^\l-U:0nJ3^Dj0k=*TVAe:W#P6i[T8 +DR(*5H=\bi*CQS;Zdp5WH[gY"hj5B(mC#!>>@p]A6h&3rElI\S0AD'I +#KF]ABELD5SDpn?YDB +k7E+)q6a+BMh"r1XPFV&Ab5BYp-cdMbgZ+ocXj(sHH5s:>a@9%$UL%Ks<\u"&62bZ2V>4I5m +)lG$`OD\%P&4nM71e.$pdmB80Tnr2V;u!-oGAcNXC!k,da=bE[3/9H\fX"==R:MrY+%4)bA>W$NbZ*"%(PD=JR/g&&7n]AFE:sY,`BnK0>V`e%F=),` +%1\_Xn$ddK=DQVmK2Nh-\'F-OJ>RRFI!`LgO!qdRT[^gh\n@#D[kg3pl_R$MdWb_T9>@#YX& +8FoGgf)klIVZUk&7g37]A+^@3Y_;t-"$i/E[%ZHF(DAs7o3p +pncUJoSMMP(]A\bj:tPh/1-H!T9H44_Bo;()J`&K2NgV>E%;hAMNO6JuqKo0H8g\JT(8SBf,[(l;cR_)S= +u)C]AdR.Zndm`dpj:_)hm_Y1+mkXG>)H-OZB_-ADu9?ZOW%CQa)4sRbkefR(W/guF5L`@/^pEI"q!GQ[[#c1).UX)TZ2lXLGiW/#dL7qdDGo^[>hl*0,>Ss(sBA4*]A0q +F"c-?(dur%QIHA++o@/KkMnNe"n%P&=7u>7"[LUj.DR:1tVBP:"9a""BjG7(.kQ=d_pJ7D*e +UEA=AU)pZg]ArLn0nuG8@45R!c#I"AOsRDNSHQJ%%8/(KbP@Ec7^r435NLZl/436"S.,]AOujL +qbn=g/DI[X$]AZl\OPW.g72\)_J& +b;59hN$3bNr,FL+%,Wn*_j,NY^TJAnjs6BP>JI2TGDa2EkN=>tmi>5F#IdU;5#On(iVV]ALL$:nU2 +PXo+b/G&%R\0b<7OXPJ6O0Z+@A4!2rVZM,*F06cu/ZMUVgkuG.pJPC^7`pR(D.!H$T/Q*WX& +QEuMEEeg_GOa?dW*`h&b!uX^8qg5W`Z4k +/Zr:&BW*cZiWpdR-r3kal#pi_HLeh^g\XKpirB=1[.1ctB5$Q&;%"!u"Oa>(a!>2#e(l86u!*KEoX +L9[K/3!\%WiG3AkMglo!(8N1,o`/TK&rTVN9F>7/^Q4$Y]A7ngibr:Y\Cd-&?$7r +MI:Wj?Yh[iN#P;-=f[;23R;cRt#$71=$^T?`^S`oX5]A.E!C_WHPS/(deOc'"in&qs6*B_`>j +Z&LD8Fm^QIYJ[G/;c'%5qn"rRTYC6+^=22Ka$:,:fV->Y)nI?]AZh84`n[-!7qIef`87kguR$hQXP>Xc&&4aD27@eAu-^ +;SAFb>mO\dfrAIJ,>udVtT>4E)1"2&+;HKYZHI2f+bLPfSR%^0A+e5NgHbN@6WZO_/LBe&\m,JgJPEb"$_YNe=TjA"[* +#U#7BeQ4'bi<')d3MHK)X'$)%)fnA#WZoY@]Ae,:@W9Qi\=drHplr,^F$qPakE/'Tq-;@Zc)( +O2eO^85ni?Gf,=09=.O?1AQG.fo5bmb^sl-l'hOS4M=@;T`T^A+`MIKj.)$b\RCW=QN*d%PI +)*hD+*QjkoSf$9Z_jqZ7tD).^amhS0=X,*jTq2n00BOf.Q>dF.,3'Q^0^":q^G_RLqk(f.Wd +JTgk)M$(.AQA^)Nm)R?'a8I\j^e0l`dsR6a&8U--2R?(MJ,(of=[r5QEggAG]A@qVa,&\uNg5*H6J\7A0\@=_[]A/gR(iR='52WjG$ +?FD^lQje1FDGH>B6;D##jqe:Xl2o=oib^`)TL]A6h`7^R-s.M>g9pg:8'A2/9PJAZ4,-\ej,Z +3u?"NPYOd$>-K=gH-$mkWeHk_gi#??8Fm]A:>XMPA=0`UO/F&[Fg'dd$m'k>1]AkIZ`(p/PkmW +\7#L2`8`)40t@EN]A)'S'$ElI]A:"O1a%%QV6]A0Phc58Wef-AUV*Ai7cqOk#Q#6K"oT1f +:UMaDfYB%hWDSF)[lO9+iN!>'l36,r=O('&>>U)>XAGEX"KjNhXjkhP&ui:lCm.p97mONFF4G:lT/$@Ok#-?3^D%pT1.RkK?fY$-k=U\^3Xl5^Pd^2h +RN-:g&hJ_Hb`>?^]Ak[>*R61JRlb&2^%)2*F6Y!7TOXh!G3'4l!#nC#u6"@]ASkls0&tDE]A.?_ +4_m(e-\8CJ^1gX^ac_Yc7RhL.HiZ[0"^4u!Jd2AMsE*\1IGBs,Z'iN+BWoRq[$P/@R.BPbND-H?).VZq.jBu`c)pC +aQ/A"=NL!6[IJ&$N]AX.dF,pdH%))dV2md1_'*d$^tI'B8pOQ@;csSQO]A0j@!`a[:>s61&$/-shm1PYm04_:4oRgVW$CkN%gI`mUfiN0M&Z=d,qT)R9)8gBfOpZ$?%^5 +lf2JFRuGLo>f@qT@JfTi(?NJ4kP0i!5;t6RTJ2sE!\QW_V'm;7I1oc5>:[gm&da&1231q,./;*_$n.J8ib\;IYB`fgA`??0>j +o=%LK`]A\;b'WD(4@&ERh)k_V@5#2GC&)j8[prdPL\.7 +NHRq^4XBKX&fZ=F;BTn.%[Y9/U&7bUE/1!\]A[jgQ"uq41t9-oLpX-T;5'0pLFa+6aCdWI9+bOPMt +tVEml'5<:%:iH6CW7@]Ak]Adj!-7TmDZ@O=`^b4ObAila;[Ap9e&g2/@@qjB' +6jJ?(0ajY:.4lP8KYA6A>&7q4*KDXNgE0qcY>JOUbh$b3hr,l-7rbtdFAF5O?Zq\J8C`&)1J +Q`-?Y"Fb-0$-NiE$gI[ZJHGfSm">;L/)>p!P&F7I/g(k?]AI'j/.Fu_Xo`!OnlihI(eE)XHo' +b4#28u%MEK)A_h;TC@m8ObVr]A07If=F$=K-;jOKuof>+gZDPS)Ba]A]A*"Fn:FHC9(OpB>g">C +i^c]A!rDr$hSr06!H:e*F->.lERI3,.gB:nZ0P7l^]Ai;q@=]A"OKm>E(fmW,m9cFm5'nd2WA8nJ4P$KS8D"]A#i7d#OgBunc..^bj$DH3F+6==R<9G' +]A&,FEXDEuW,^A#*beMl8ISnHFA#.GK4J,?;0c28GKSAO;Sr?oQ6U(FUs&1RlT=n]A;lOJepPd +!FXCg(g)=nXoM_a$J1]Aq%lgjU@m+D/Zrk&V@'AOgimTm^(O3[1N%iI3 +BI"bAIi,;>:caq#4%l/IKLQUrBHc6RI]A0e>R6Q./pV>j2Up\_!'lHQU-*WhV'8u*hM_D#4ibnYIR4g&%BqBBpc[/$5[[F$fS1UTZ.G+QM4e/MkHl&b]A +[.dVB^O$a8?8pAcb#iknXNua%7`SrG?j69S?toFE)t:PHS ++jTNhD4scafbbr=%4mke38>$DOM\R[^J"]Akr/N`:AWJKFIDEpn:#3mM#W'FV@dn\Td#Dj8$0cXO\,H0_\)#GNtqXWPCXNt= +TiB0c40.ZGS]A^?6Nn450Z@F`iTj@15TcQj2?C$GGNr5Ja+nIHqNKuj8D;5ST%XH9&NV<&GRe6__UX1Y);qD)I\ +T\"iI0*h@:Qu)b:$AU-+H^]A[9784h%?R-\>O:r"BV>(>7UD&(HGK9mR44bn*!sf19I>Ef<<2PL!mel\>qY!5 +^6!O\fI=W9*-;]An$Fm@"LPf1l!cS-H!$1B]AptjI;>E@rjW%uY&R\E5%>g* +l[5qh+3j6\n4c+A?\dmH.6P8m+9;7b87"$1:cVapL^b$e:qS@5tnrm^$J=b&J"UE2%5.l,GH +[cf6'Zk@HS*i=@LEMn2>/S0)!mdamj35>m4k.onCD5LpkYT6$<@rdHV0jJasok+;5+\WJ<;[ +LRuAH>+h$,Xb@.#Bhfl8-@]Ae;Pb)6=fbqmpn0*Z`"'QT%!i:=fns*dG&&=- +N>W&DZ$\]A`UN8Sb*%PG)^cB*`%2U;4[n4YZ%7^$Fap)9Y%:Q#$l'''Jrbp8[=l>)=ptG>*5` +`Z-2$j="ajq0R11VK6V@&EV2&!jWNHIA[(@*fpJ:/p]A*j[KFAroVZiQO*iSRpKe>2G2<5$Kf +;GPsQZ<0JsrT"$&*aTXtW&tTd.:)fr-^KmQ2BLm/4+0?hUB]A&Vq/&J/%j^&*Y>VCuD;TaCCq +.[%:ql9RZmeb:+*Fg#\&l<7?5@!5S=T*59PSYEp`>/pn5XU\Z3Gsm:+;"Ccn=!c8_%i[?Ft0 +Akb)F#rYpbj"U.ARiIo#92cg)UGs:1O'DMoJL!2:8NqPf8I)CgDEJO-lb.W';;NGk4T>CDM@)p;?[DW1o5JNMPr6^*$P +'/@.GAJ>C`:JmHK.Wt*;6H,c! +`3Bk\_l'AY>4Mi`Jna`E?&hIU(k&_Q'Y21<&>@g?dq +'bAVEsUnbM3%ii;As"J2nEr<'WIGV?hFrQhU>g(bVY@[5:\!Yl*_J")2.Sf9J-_?Be5/GEgk +N]A.Z>44q2"Jhlun9p@ +pQ\-9G/p7VAYG1@'6aNTK0$OdQG*/K8^maV3s@"Mo;iLj6u+_, +pU1(>4)emp,j?PTk@EWb^"3(NtafAYN&gX0$)GnPAj2FTqQ[Be:e^g(uulD-dY&+DI@`,B1k +mcH=C!(D7/;"I2P+c*);tGk@kRPcT,aiG"H?f9?BGSSG(_XV)XA%[q(r?rF[ +_LSH"Z8>sLQlcN.m3$=.$2X>0=%O_r%>S6e8c? +Y9-04>0'07G*71iM;;).0>_s_ht-IGQC.Ia>Ojk!Ep;Q4db2O,!MIs:??%o0=XOk<*Qa77OB +E-=I\?N?4%[`%jXb_hlG=7Y-!#^jZ"uoD1!&ZD0g'72NmQ_o3F3g4h$g]Am!o+F(g6)*P_MN^ +h'/+oo@C)%\`J5rlZN$mA6)m52.aUKG$b4LM#Y.fG@s1+8hQ$NAe6Z%%ML]AT-0rrg!f*0S:9 +M>h$mEO5)2o.YE*Xc*W"eFi`m@3cUYC5_lM-?UgEg+KuIjaPsPOa#i!3#AtOm@pKF*AI;@cu +3%c'T/^-Fb@H4#6D:5%"8cre`]AGMs"1@#d2:.C9;\?!P]AGG!n)[Xo2:9mD'=C3S']AIlq.3sk#mRl5'W\l_+:1gXa.fr6^K&QY%.PNL"29SZPfpZUPeMoQN+ra%k? +[sgJ"*b`8>:W>JI$CGfVPVY0-I+kLP>;d*Lrfp1Ui5+nXSK\fRc +;8=qd@EC=e9EC]AQ#*5)j7i'?+p`E=h-h@*WbDqL33N;PKLHo:+V$j_Vi3\kIg3e)HbCrM%s@ +LMoA+pXQjSFp3N[55@@S8'Y4KCk?C=Dm^4.Xk_tdH,<*E:^o;nVCDbo)dR1WjJHb"e+P"j/% +S#djZDg&;h9gc"$\5]AU_Tj?3/A:3.RV;!TZDQdt&E-jl;g:Xnt&7/Uq%)=e??odE\S9/X3r/FJ +:Hr8%59fh4#"dH!/h$C%L:qIHX0-OYY]A15`plDKA^Bl05>U[0E(.RYn%5D(u3bD]ACGlEK@5M +F23;?k1Zs_[`f#\b`3FIn0^Ds'ISD%n9g. +1?%1A^?sUr"gnUa_/F5ot)o+eEc*;:JADN"H*:pUd8Y%)]A)`7%mo6$',fC.#+oTXrgkqMOM, +2_Ws@t(j98PF:r6@HQGm2=lCcoLZ#%)2$c)".>W#aNJL'@%\\9kNP>,ic9celYj-*fldbp1S +iO)<^S$hpEPFG;>a+$%;XT`=o=&i7$,jVnPSi@l9SXB[M3=;Jp#"HCogO->+`/J?4D4d&T4e +HbpG-GlAir5D;JWD2e3*iGmoRM&[!tGjXK5ItUYfUJ_S7I+l>\p9PC%*4 +#i.?;Y]APqi^7.]A7G"@5j=S\t\#ao<+kS&)J]AiGQ6gT_DdQYYCA.GYgWq/rVo$`+1@OYEbtgXY +G+fFt7`03"Y:5CcpO1o)O*.eBOY.cWk*:Ja$VMqXn`(a;3XFESd=:]A$hL@0Crm'Tso-u]AkMk +XUH#"Qq)Vq%HU\#e9/SU@UgZI0gWR2CR0h(8#XgodYp>j'Mi54nR@TX!S$`.q%RAcsT5iJSh +Pq7hOJZ5Bf;A%P%s*k8cPkdZ\KdDl[>eN;9X%Q.Q"X#B!>EEG]A+9S4L6Bjs'*G7Dko>#b(5CSgTXG*&2OHCe/`afTM+S;`ItW>hTiH +j@FigFhe3BWc]At7WLm`U!#99uj"I1 +?u>atkj60KmdW=I6&YG0Kn;^X:\@/7H?bSDZ)p2^F@%?+?qlMNW>:Xrr>\=XPF_(P]AL>q'3^*VaL8-8gqhQbY*'T +6"IjQ<\pJJ[d%:_!15Iof]AVG/-&cES84[rj.&37WKi2A2O_q&.)8Uqs=Zj#,;.KdepXq'K?> +B%-M(J;2R$c0Y&TY?AK2%'6k_!(Y%a)G@9jb?S@6WW"6Ykrnb2HTA75"<>0M]ABEh@8LNE\#^ +*8dh.Qa*nU92>fZ^Il44XfG3$8r(jp?@mQL2N_i"N\&=P/Ct(:4Do:N;E9JL:itLQE-3=f?P +F()t`[ftW!";Kam,:NMRCM7?H9bB)kWXalEg3jfp6Vu?82.@fPm@FD>9gY0fm0>f>=QM%GI1 +mdQUN#5C49Q6l=X9!i9.T+8Oq%qBg+-(cQ7[2-+^l*fKkXma16P7K/eN,fiol\I\+P'X52%3 +Pon5&]An5JdI5`5`-+5;0pf1HNs)r5o+hb>I9QR04B4`gR5k_3[JB>c/a1h1H[/99s%Z$Wh2u +J%Alrl[;/^l;R"@M;jGXh`9KZg=BO:>jTg\I%a(%o!$6miVC(Vl6W?Ii27CN6IX&g0cIqSFO +2N6m)lgTm'\+t6[.I2jY*4mqsX'.l;N&o>EiJ57W4]A07A`Wi#8`H?i2\+HV_SfJa!rNinEV= +n6KI_>j?XZ%eR$(k8kjZi(3)qJ"gp#Wc?DjfNPo<#^9YgJO'R+JF9)+G]AlFf/'tH0KBHUNjq +1Jt%p2,LCDV6V;I"5Nq=t$%6UY8BUHNS.#9u]ARA's4!od<1$hl!)%+:tbM;c;_kpmPFuqh\o +f?Ls!6)5A%uC'6CoJLC]A2./+T1FO_4U[r@j_pH)\Bt!jC<4"10Y^fVX*'@/>oQPkE:J_=$SE +c&/>(%pq&Q.WkKneBA`>]A@tE]A]AYd[pS.]A/#?@T'TI%gAjfZ8lgBFYE$c(2FF&,L +Y9;\-Ee.4fk2%mmI%#P5WAW.=8>O(a!k4(eX%"io%m7BOQ$=^_91tCn4D(V8iF^3*E:c#6fE +=gD=$CYl;K+lth![s2s;]Aak%L2H0qRed-@(n%Ctf44Zm/i\e;/g-S#X^8VZP.DI+;BJ38A+> +;nBl!!j\:>UT0s2`*1UZ:_4o#8di&3RFCVo@UE)kYsi1*B@gF9o)pf; +)e(S2DHb]A==[e^bXE)tO9aX^B?:YVVM\]Ag>)Y%*Xl%MK8-S#_)Pi0_%TI%P+p0eR3OId=OoZ +5rq2'lmlkbhmReVIH,`%HQAYBhSm]Au4jl)n_]A]A6n+AS@-$XBfecAR7GGm:rociq!@@(=oG)I +9f7K^)piUNj=&Qkm9.WAm*P3\T.T#L$&,2&C<-JTi]A0Vu4`]A/[-A#t +4(]A_F&VYBG3cVq(4N4P'#qZ=Yb&V?JQFh70EnN@+["*k*eF[PB&r135sl+`GBXdQ>:J5Zk2N +9N?\Je!`:M>J8Lj%HVo%#W;lZ%/\?VBBT:Er+H`"OOp9VtHe\rdF2PECU/>#Ia*QSV@EQ?.N +i9^R^;=%5>mjFfuZra"__A`6=hQ*Oa%>IAafX."!u;V,Q>#S=V,0%gCgb!TCoYNZudG:61sU +N3>Y"_IAo.6:qsVBTm"^`h7Q)a*3g^ncFWd]AXb57EfISCH@WtH\UKcBIu7?b*(F!A3UC9\.l +h0ERp=5U_a26A,Cg3d3c-8q,oai4&&*(5B:6GfDX95<;/,Ft3hYU.1N1nE2]A[=Pq*Ga:1Pf= +9k?q3V*oi`:F6&,Zng5R?TNBOc&;4!Y5Tsc,*&8[b8H;1`:?n/XJN!f-;qdnuXS?He4o1]AU@ +;Rt1%5IgCV!-hlfG4@4XQ8[aBClKHUfpDtTmp2iW52fZ^*\>Lq?psORb=ILPS[Y4*U1+d_q' +\Za!bMYk;Qb'?._<^$fa5goU`G/0@Xqu'6u*1SE;HLeBAn;JC<>*XpF@(NQ?>YCI:j";;Q/> +cC1:#^L&8B)7""8PJa9(O]A>\ufPm2qK2eZ3>B*:oS8&((FtJYak@UN!FpL%E`CM:9/^Qe+?V +Fj%,5U,EEJ!.bW_j60mRc%&0n')H3s::\"ptTmSt\?6<=`4:Z>e(\>]A8=F05 +Sle"/`Mt!O_qe)Mb247m1^DI\L5Q[\.96,DMDoL.;f!)33nCi>\X]AEBD]A5QqP)&#@.PPsjgj +K6qn`>7E2iA*p!WH"^hKu:ru!)qR/>G0Wrk,em!+"r&(GYDHYgrHVApLd?\u-HlZ4tJ('5^s +#LL*>DQT_JR>&j8Wd^C$09=!Xpo1Fs(>Zk8VIL;E%'<=_eSgh("\7>b';p&^VVhE_>DE,Xi3 +Wc?_XpXMl%"WQ5OY%.,#tGFmKX*pJF&GUg%#V'84!i3=dT-mRC?nr.%@tk3BQ9\HMk4UZUKY +)2P]AK2^JSj/3UZ,_J-m/,!*4@?PLXHEJ'1;_6WSB1[J>B2f`#l1iVT[69&**KekfKIn+_*^M2)cngU\AsaOWW@)>BJ:W-JQYt,V62R]A0!OSAj(;fb%)]A +WK=5r&mI91ZWUb\^C?YZfgrqe>_H(%IJ*:#9514em*j$r)LgfI'0@F#u>4CfIL)%[]Au4$hE" +p$0rECSS7,E/gMnV^q?c^i?5ohI4;!bIf+)5\cr?Hf4%?RJM6'IBNQNJ;=1!b%70ta$K+`J=:')ql\]Ak3e6ZZSOcD<`@P@;qhrclj/?sk02X!dLki]A[XB@]A^ib/4>HU#$FBBag>e`TGo2*io< +U*rpn]AA1`5H:jH$&^X5`?GOp2CJ;/l50]Aki9N>d\8!H#2YhR;^.PKBInT.FU_3\+&bOShnP\o(KfGXYYh1Rc\=eckg195E"&Go4LOq +tEb>lW4)bYU+0GhNjb)t$X=VKof5odubc8c+Rhfs@[:PVRV4-;P'E;:aG2lK8eZu[g\.\#4E +8jG2(eg]A]A.'%"Wf= +$*.p;XWQUGa0qd#J6gbVeNX=e.V:\RCKH65!bARlb;D"_FbC2NSVd`Lo)\]ADZ+qXm4kIflTe +^#b-9V7']A)VbKCJ(=MUcp-)%lN*M`I\_mY]A0f_h8UTJ:o[pT`[Pl$6t*)rgIgiE<]AX"^r=Z^ +/"=Upqpq<%Op(BF+UG!*Z2b70btfH"P%UX3]AEkpn\TtT@B[Z3V6^A_r-qY-W`Gjrr.9qBD@d +;=f27FL2#("Ui4)H!79hB!20F+!N.\L"WX_8\)"S"5Tb8LEDF_=8ohR/KA!I[^+5 +]As"-9,N^58Nsc@Mb`;\)u;"XgZ/FIS'SPWR=1^38@[l,(o?PJA\4U?BH\\"^B*QAI/KcF4?: +'^Hs/R?VnT]A'dcOk\`ho3VY5"bl5'LPL1!;\%$4FqFnVk:H%cDC` +!NYc3.dO"[4h)oJ;D_/J6H4A_Q.^U:NurCW!jcCjf%5"E,t&!8ml)qE!4,)QLQkh7DJ@gWLg +WfQ0#eXr+)HUKHi6O9S@G/f4HA-phY!EgA3[Na'4XQBh;3Z>eV^8!h54.Zb`m:R4UCbK)BE1 +u$FKKVbg_4"b<*Jp:_e`C?`:NL.T&KjmL')cg5^b,Lbs+"iHD/Z]Ah.=_9P>,$8qIbESV!lrb +h-b`&k.&=V]A>!^O2#&>(Stn]AtZhKf,`=%>5!7rI(-i9<&Vhr@/r'r6alaL28A6@*4Zg +e,0hrdmRja02g@AsI\2^jm_'KpKVG7'NIo(DOZjL$^c]A@P4FF/;YK+3[&h":=4-V;HS*BGYj +C-AP@!3C5(L1>'q)iia%1hY0(WiU]AD^rHRltA.?QQApNs6)W4DOCl?;`W:V*0]A1U@^UO[82B +Ss6dWrL64N$LUrXV4IY`%%iT+o[)t=Ol2q>#"(iHR@R:cZrjCj.)SU;?n.);64[qM:Ve.Dp$ +slhkE_HpPT+m(Ts`N8*u.Ma?X(^b^^FDJnfsW8['u\k]A.Qb^tfRUr1F=4[V:PCHGqJZiW,0t +%S[mX9j[N"U8O>D4rHE)I(de^;_l%Q5X$n_p=]AB7[+A'3\V6BC8.4barcYQIL6e +-)u4h\.fofnbF1S!k+q^7NY8[EHf@@qmWq%uk'8:O6fc7g^+^e=? +_pC!XmlN7ADr2iEcVi_.nkLj?$g@DBG*F:!aVPagGp<6+^;DuOeWdcA4IoH/md'Dnq-B&S6P +u\>ZA8L+5!@W#TM&7'"ie4JPuq/u*N_^O*d789LCBc-NI9o6TM1T518mU7,g[/TL8Q0Kl3A4 +Qs\;Z$1Xdlp#Qkg1LF&0skl9oRr!lnJhQLVNp*.`+!Jf,j&E'-JqLCB,rTS32'K_X=&p[.#9 +>#LJ3rhN9@%3&\ng!H9E$6QRqs61PEh1&Eo%-e3V*W(Bs)$\?f0B8GV<"SZ.d8eZXK*?XG\- +FJ5DX7Dh]A9;QEFW\+Up/J.]A"6o9j1ai8^1'rVak=H0+dU"cAJ]AG]A3JQZK:NXO2YFlLtDOi?E +sC]A5>ig&M]AQ:*]AmJHirZtD50cKpALH@'Wj'S0QA1ou@mNr\49P68]AJcBnFLtQ&ri`U>$75-i +'Lq!LmSpCr^cn1M;L)jAWXc]A[#)*-@,mg),;2+X)dm)st4$Ibk;5@IRI^MG@)I7pIW\1[s)! +=YtW_mmq17"[Q:]AMf=Gi$O7`^VEFC`@hWc=>!#pL:YKQRHh]A\("g_&3MTE;*d[ +-#(JK32Gk59^tH%(VeoDNmn4OkJ9AdHomO6*AfjLD6Z>_5&(ss.HK_UqVK&7iQ2]ANF(eF_5d +!g%$P['+?kZ.a*7k,A,KW'qnhf'EUoCr=a^Y]AD%lI2T\Q_+iR&1MNt\[!PK2J*N'8/Z(F%mW ++[BEM.A+@[N=am[28/o5G"2o=k2l?UpG4K%b=`gMS+dA;I2!U)\tm+,ZXP1dF^4q`c:[-#DV +Egmp#rN^\QSYG!3=D&"%"u(=H-H'8Uepi_U6B=BR348,=I+F?ud$+36p*&Zo@(knG,F%.Gm? +`9$cl%6gmL1q\mbcao0M$s(VO;j4/*!MX$gRf>&2HT`?hJcl,Z="G6[S4sOgZUVuVn]AIsDha +WNINL#FB,,*`:/2Cs.A_,3W8$1\d!f(O]A +U]AO/492h6nTZp!n5./O:B/Wde)%&qU]AJd1:e!lL#KmOb1mPMk+5$JWqqqoW+Ra(]ASW93o]AU% +?Tq,h/reK]Amn%:d_k3QY3h.(j3r3*!Vqcr[gG5<)+n?MGmhe@%)>F,sc`GFGXdW#&7?>@R5+Ikfr>-R=;obK=; +$PEPqPf9728@0^ai5Gr`qkqrE9"p;1nFbh;l<8A,GD-,$b4%:;?@&MjW,mjl4poYOV,hP);- +'J8q^(=$,#HUqnZo7/+ENuA"-Z/DA%9ZIJV=fr))-kk-Bqq+&JtS&U<*XF:0u^!dJt0=mn"a +F&IU[`"V>C2"c5/[DD;+j*&fcH-_NC`lV^DH:(0H:G15ael/nL!^D-H6>Ad*m"IPJ.)646"Q +_go%UXmX+_r,/J5_Z:*K9]A1HgiYA#Lop6pQ_V6PtNfg5RkiP@L5=am-c@4&6%]A$[^h,KfhmdB(hj^dOGrf:j.4Y`!jH`Fh6Uc7Q +5HDD2%-Oi*S8'0I<_N0\B_/+I4Rc4a[4,%HU.Em5+F(MGIR+9VC'NG;*a;nu^VCts-sr.q#F +)(oM`M"?]AR7(c8ne`&akaN*nl@pt$f>"lq"\`^M;&7,-B)K2+FY-s-]AECQR*FYd/I[;a"o#s +<_,IDMD*3@"dRH*f7#Wjca4Q0=Z2E"ICa\u]AO3n5CHoEGMC2.QN^%RkN!Fi)%fnhos']AM6>EKEAa +L0GmN%J(=@Pnj"IiSk'ebCJ?3;o>lmqK:HOOJ56f8jQD%GR;Gq,LD?m`l1QUAKK1`:Ctm%WW%&9]A&kE#?]A]A@dSE>`\:]AtK,`ia[Se[a.0oSq1m([mg5"bnIkm[\9ML)qip4/u9X +oW;.TQ>ba,TjeYNRd8j#&'NQV/aDZ^o4RkDY?i@h[,eEr._]A6SnK>E18%-%-H(gVdH3:p;a' +,S!`d/W=lLi;+*)l-5^@D68_3ANH2?KDl#EXDAi%?;M1bUFW2`hd`$#]A8Le:5O0i+F\kOnb6^>H +,cbO@YG`E5VYc02M9Np:YS*u4a-nWT!@;t2:^P:Ca+e,Cj1hT)fB&LI>H#S%.fs#%2nsWmffUL,rfoNb' +!h#>lL%fb00')F?e:sLWc5YMHe=r0pFo"3Y2u;b]Aa#If]A+U6IMU-"$PEe#SF?E0aX8/C]AOY_ +tm2_F->ne"`.4&FF\.1CM50m>*Z&bYQKLu:Rtg`GEDPfXHlFWW#>3j;(=;iC4;3mWr:C-\00 +>7C"0]A);MfH-ZXSO$^]AOP6KnCXnf9S(.^MmMclGG@=dH'YPJgPK."$\@R]AGD0&l/>lcD97V[ +cZ4)2i.g5Lp3B;-^GYR.=]Ac%oCDOe":\I3mNa_!<*Ln[oCUOEDb"[E;70O=;k!q0&/!\'/[I +LESKPb:Z,KI.3VVt&FF]AC=tT*VKSD+Og7IBU0u\^)i3ZQCRk*2(+-K^9QB>mVui1_1Z;:h:\ +Q!A@M.*E%';&F]AH+)[6A.7#MI>>b.p'fS.^tC:n`U(o3P"ROAKDu"%\8clW*E!_n"67P0@E$ +H.tfRLsB1He;`6S&R#o8h9:58?TRLBU>/Hsd<'L-fF9r)6H*5F$rPT\Xhk-u +pPg9njN6A]ANHg=d+>sRAM4kkA84Aj\$pLYYE-,.e]A3X^m^2SK,L_sU\\gQqea+ +^YtoD.Z>kf^JMrcH(F_q2iuu +TL-:(:$(c,M\L@aI4n#?IP*P:^]APNa:Z$=AfJsa+-ODo48"^F)h'^]A^o[_N/C.!Q5/'4Q8S+ +dg(;'nV7ePoOP:E_\iG6U,I4-M<*LmI3O8jX6VrQ4"IISI;n0*a3\gs-552#qq97[@9# +bgNlC(&aOennQZ``%']AjO$2rHo)QRLg6EnfqLq']ApJ2\s:n@L/1.nnn2RKNPYlO?%POm.Son +SS8rf)'#7,+)9(:k`XBU$#;$89]A5s*'1j5$m.S$:q4+S?'6sZ9j&:ho?$OumeEF#n$VJi#hiT1N%G0MBLV\)Mp)*[PkfHYF[R'S:kD;(L_ +[[:JoNjZ06IYUmG(3<*N\d=TpVlTl8$!0u+:C*Tit&23rK1 +"3b[7#:"Fd8-@^(bXZ*es-ZLK<9?te:B'f\o38M%&c-Bk'fraS[/B(l\''`RYrTf`W)(u +N"8h']AdFX,X#SsH!\1e9]ANJ\^Km_Jhk2<`jLF.Pd5A,;0VlP9%]A$H<*h.r7e[ +"3>P=mis"uXOSN:N$@W%Tkc`jFo4^[C+$KGjK)3q[JQENN5+tT(.tlelI#AM[9Rq(SEspk*=g-&_jK[(]A`]A%Y7-6CddqZ +A_.]AYp]ABF89.@fFZ'20?5"*Al"70ja640WC1]AG+uoMG2[CYYU]A+U?]A7V'AF3UWU@s+OV81:)6c&^3)f564HEW9T>4,h*kIIs'Hqdk,I]A\T?hWEdWf0Ff +$RVdi/tjlYft=__DfH_p#bVp?`2Gm>r277*.Z/tLN'r5PN]AF5H@7i\$E4^]APU:V0kc;n=[S? +kFNg#G?R..I,Zh4iQOY6+2Q>7"rR3WLrFB8a8@Z,uWp4oiFTlW8-d6i[&MHf:QT#o##5i[`t +oeHGg0@"_.>>u.)\aS@KNT44_U4qJ@nR"Rj$Ej8bl)-j`H1`AT-kdF]Alg4,@@Xq^?.nK&`n[@4X'#H4"_T"TWDjL[c* +bF[F!ncuqgnjX[1aV4T]AmDKO_&W2cEYfQ^#^Sb4:Qbol38$XbCX$ubGbH[Pb`iQt/`sqH(aWr[/aS"0a0]AOd(( +h`Ma.A\QebbA/2RElJ/"K^6NO16$-2/3&s62'4MfZnLA<68P +Oo4;%q6/LbA,$!f;Lst]ASF5$YQ$\^%&b1=OhcH+Y@TkU;:TXZE[C?5dVZcrX?Q +Ytu%iU1\n>3bZLH(Nm@/LCGE)CCS&b<.V@7*(g4u_P;N/`:G41@oGF!?'0Y_^-ME1'5`7L^Y +0H8*gIf=,QBq(E;OEH=3E,ak()+!+cn%St%KMJbHS&cVE?T<6!qTD%6qSa1ZfSrhApRSCjpY +F_m(JPR(MRJbmVLc::SPF6C]AfLtL4l9lfOHj5NeCj)t\Bf!F!OQmm_@,`]A]AqD^NC'duh5od1 +JAPh.&5EYBpTZ^lOA6*rJ<+ti/tHIf>Ia+kag)=$Ad1L.$JFX2kA,?ijbiTT3bi!n(*J2CX# +O-\TkWaaBQ!&AdY%ps[q_;fY$iVUdl>S87[=HjiYlq%@M(eM*3TjL"G)!Rf9#Bg55):TVZJR +MOk+>]AR#q+kStA!_`*/_-%&MU+;f(9,9lQr]AeMQW'Ll1:+Tu+H&UQ^8qoBCfY@;J=^G:>XfQ +H1N8(Fn3L[]Aa^3o4=._h<5(&V!?l1?,Uc:GK9D\ac@H"]Aocdac0gZ0/e*R^`/[imP$1,^t@8 +^qq@XXtHVc;I-`B#'qs?$d`h87D/cGmR.D1e9G7WGGT0Cqp*t.k&"'Z1EMac5Q6Er[f5+Rj6 +5F@ANC4<.+8]A^l>LFNV7.Vk7mQ^Ue(2Wf.U>DkW$6*o(s2h\%Gc1*K#tYLTbI)G_;]AGTmINh +FhOecVH5=:0Snl(#3.$@_j\a;[$tn"BemFY/HhF/-g[e:p"Cr7;D1ic/&.cIlBeAJnI(0leH +/rOX8ksB/4p=q?iB_VMX**Q78nA^$F`/(2RBSEj8I:?.HF:-X#l4T<\dAXNV]AiFlHY@E"pH# +qV0aUi(.i*fDSS2W!ID@T%Hfs0\apIgI403GD;17n;8$-4022=Jf/VPOk18G03ccoSEa"8BY +9kWHq,X?'84`oQ!-BjeqWU04GGoa#H@Ro[e(MIPcF=?Om%\T(JU!$]An(\9&1@nRtGQ[QrXR> +KIZPnIYp*q-.*CW.U)u3mQERtKRZI^dM_q?!Piqdog=a_N^6M$+_n!+_H4)0Q2F7XX0k?>$5 +hS[-0`b]Akt]A"9[99qd&lE^DT2^uh$h9*OlA3C8blLlMhGIfk#Q?<)2SDfROK3=\G17a/6p$U +&(hhL1T_5g9!68aB+N3R\*tZb,R^"4ZF.(#YJfcIN5b[qB53 +*%Q5sFR1b:K;L*6588'T+4u\mGnEX6dKBh30CA8b@]A:U`G^''8f29VlObbT6gAg8KU*JZP?H#8`@-f8GAe$fk+(q\6:K;^'&Y_8GP"Eua +V*a4H..Ti"SBgUTAfB#;j*:0:N%O*5Hd`9mJk#m+'/Fc)h.'eU_5n`S#i9^&p"^A$`*XeW_u +5F@c-U`;I9,=Z:4%?J<)L\&Y0%S1!=J$n8<;;E*qMo*pt\CJ05FoI>'pKstih?h/Ekgm^=Lo +6(+G_leLlpBgj$!`USh?"%Ns2+dnpDT2dZB)Zm^=,A?-C7(/Y!Q2;;Fe]A=cKP]Ak&c:^16eC. +_[#]Aq)>]AUM%1"%U3Q=*-NfeP._dk,V"45*IE536T2o[Z;j/4Z5_1WTfQ2fS5@>!Lh!! +DadMNYP=.Nj*0."i2PIceTKMR5N@nlbG7$aHq7h'SXjRk5m9(`f^HEsHF3`N<.?d"OHSc@p` +8QDWY;Dda"C(-(5-FdJ*]AL"*)R[Bc%kTU6*9&KOSPDs$LqU@Rl[5_u)8dWP>29%N/[6srcec +pDFhTm]A!;-F[)J+TBS&RQ64VR(RMpqG&XJ2mJsA]Am)ocDd-pl-rSK0S*UJBc=#L9,mugaBuQ +997&k$a,3_M`;9sdmu^8R?G._g0U^!U.7<"LCFoYY2n)PglqXR_^>/U[Lp]A;DE--C$j^aW#g +[BVI8_WQG?/$V:kYW>#Af./g22l_eg&%G[b#8)(.!+:2!_*MPD1/B=g1s$o.Sjj;k\IY1i%f +pD]A0]A0LI(ta/N=BnF>+=-fT[%Lf0WiL#9LQ(#;Ht:kbr.sK0ljai2fT?,7uY+',qP#c.@j+h +rEL<=gf+4+,,3\-q9]A2pMKt'b3qJ0Q_Wb6kX@!/G!WlhZ.q`od[JN-hq*1(aV45o>B@JTa#s +:Z.>s(G=+9Ei8GEcF,EZ'Ok'-c9,qW<8:'M(XmW[2"Gs +=>@G/UQ,_a6?"H#::o&63Z=_,]AT7&.r`?`BnDh]A1IIRsgO-@RLRWO0c9jAP*V?eYEl5n80s^ +XJcUUjOO?+INsU60f#.U>O5Ac2Y#FpWO)*bY)+/5mH,u*.E`eHjk\1kShIH(*3\t-5eB^K,W +75>t:_@,Cq.6)2a/64krRqap'iBjkWeY72Uj5=Cb0kAVjd5He0H`TZ,Y&0!7HU'QPD:N<" +?RXh!D=MfB_#[N_AZ9j`:o1u4^WmO+.[s?GL"i? +s:9k7QG5Pd)@iPqQUq%[65_S!I'j@q^YGA3DgDppk#7M-gUcL`t*!\L=GnO9./@.GZ:$UI6X +M+mm+(.rq8[ICq1;,hQ%>4A_H<"3*1@ia7;p3\mPS +)8]A'T"Br]AI*@D8N=sG)&rpbE+HPVk>l!r'FBDHM6m= +=N[92@jcTMhF+f=KIg+A'!:h"0H$%->hOrYXhaIeU:n\aQXP=ce:HZq7Sl6K@BR00upZSo2F +4#R=['i=7`D4W4,-C6jEV*$H2<@D2C(s\:$GQh"O#JKlnmLcaPH2<(l'5rfGJgHDShjLQiTD +h_=@a0op)^Gd,/>@-=`WPZ#/\/Ge]AoL=Qd5?4<#OS[h`eV)':>u%oB0GJf9hY1B7p0*:5qqJ]AS0Oco\-DE +HYA&;\Gml?,.b^.DCq]AN2L9on920"AtK$b)KH@hY$kgt4TN,"U2?q-1S)YbMmP9f.@no!Fbd +C#U7h)IlkQR*fDg(,CJrOai+n(+<(dhMgEHN+FLC'*'=AnFP/'u>$imdGoT#_"HQQY)0q`W')rWcX6nuOQk"JThJIFF.o*JOK&B+P>i?KU'Lk!9ih2+-%+rGeGr&N]AhYCU-Biupd+q,!*c8 +>k:VR;1p:CC#P2?VX;t#n2h.@/qVKaS(j55L(/>VD%_Pg>RKd/Z@d&j=S8?9j:5OW_F"oYO8peSEYs#KC+@\)#47C6 +-:79qQH-49W*k2PaPN_7(2M7%0\T0ceUjMEZc%'Xbfi7$[^U(NM?;E$bCN(T`U07l_DcOjia3+X#F$7qWK +#[M97B%:-QSkN!^N7Sm8k7:0m7%bq3#>og3BI]AcI:ZHn_jaY::X!Z9>M0BjgO&p7O+3)CH#W ++bi`iQ!9C`8ihf`3Bh(9i#k*4gP$VtWrRc@)U-a"N7Ub6W8'5XrlA- +6`LGopf\0lX2JSdZ>3^:]A%0YUKURQEDX'8.>F&;l8ZnW#5&F'mTm,)$PX!8W2K.D'S[J;N%j$WP^r4C#4pe#I&7W==PE:.HZ\.7dueumeqM12V^iN_"rhkm6snWJRZV +(:jiOrO?VnSP^XQ.)r!e*/I'n\_EAR6i"W9`(II[+=b?fB[([afBBXh.&[oBV8M0-`ktApi+#^&`ZKRD/FbrFFMea2U6>tIm8?2(WOno&d"8!(=s+cG\:'pg9;(3%ofb"`fm^@ +@Hth5\A=6*&a-b(aV'p-T6)lQ8M@HJWusr[Lo2&;_%5@UVfWS0\j!a>e8krI#RD+ShqcBGcW +'A8+@Q.Fhu"'&;rFXX*MN_f@'Ji(bhmBB"VXsOp.Hla]AcHBJIsWj?UF6*281QGGDr*-YL@#3 +Vh"HNPVQD_mo4H+XcWu;SoPd(C[(:Xn82W!N]AN0&DFZBi]Ar1E9q1tHsO0<'Fa)+gDMdjohbe +9Ne>7',tk!p9_('TS3XM`mgfcY'%!A01QScBaJ2hDH\.!!Q%E?-`8`9AejAPOdBnKpnF_=g^qli7]AcS(>]AP^5s[\$^gFR]AIc@j78"311T#05&/6uM7ZRj')8?ubYG%R,TY*HF75duM +o/)V&<,*T]A'']AB,kV\m7Xk>h\+;'_^"`r(\_ +QlTZIIZ8(t.9.VK?@EoHe2/bJhc$h99S,jKM_X*9Pl9@Pf5+Y@%"0>O[9NYH5M#[V6LH&>(, +(_/Bo1;Up2+jocI>`rhU6O)7j[[8daY>D)WL6haYgou\k_bp6M=Q?66"QJ7u.PUP/CTLSr_[ +WrP@S.b3ekJMqS+I4C+,hK7ah1&@=ETMEeMs:AmN`$9u9n!&N9)oV(Y(UsMidg53CZKc=[:- +0,fP#UCW7bbI%5:V=42MOG-Gst_j`%RPa\Y)>E$h8Pbd&bMr!D;B0`]AJV^!_U@6_R43oXT!E +ISN\q#]ALFu0UbgaCY`k*1C]ATR:STi.aJC,%<,hZXH1@g?4dN<>KO59m"?E(!i^"_rs.X=.bR +A3O`MkjK'&56D1+WmdW:n-h5CjGl8Ups/)@MsT'_`*8T+%k$S9r[8e&eiti-loFJ$?Z:&kZa +bN5A%lKIPNOoD^9M?5qDfH!;:%-g)d]ANqnf^:f<[9iidS@Cc`1]A%$BGH='r3YDs7:96LNSe]A +*2:cVZD*=?5:m<9DLdpK<;JXha$#%6WhB83a\P!NCL +ZmfoHA.6oP3"FTcPM`h,@]AT50i@R>,jtq"'@\Q[_ZSU^i@Tp-GdC4q)(BN7gt13dU`[cuk); +CSH5m70+RL@7B.cAgJ^sRnVZTW9D!p&u`rnH(cN^SA6eFe6GZ'E_tn1Z$@6rGB2hXPnn[(@< +YU`AY+)AX88FK-NC$>'L7A&_t;9E3+Koh:)@NHO2[8nNl5]A$iG)FmV/[a2"K.me]A,s +M^kFBd;Sk>7,M6`D$F%PI04]AC=6]AZbA^JRo'i*4KPQ5B^ZJg8.n8+;53C>pfCX+:l\-rCpY: +,Ug?bB#Vk[SL(CoQ@9SdK^2[YbPgdr4KgWt3]A&FMF"H!F%1)(6/YH"NQ@(gXPEQ6BCZA;`h[ +IDPSa&8HRp/j8V9WUVjci$th#h`sa65V4V9Pcoks,2+_-UD3LHK\KK>K\&(\8Sa^>b.*ZBM_ +%pG677k[8.]A$S0N1"';ZN,m\]AhOBtIccU@"I>L(g"e8*sOa=[,lGj`Qcmr+(R_lE,gVIa.He +fVN((I)f\9_V88Mg]A%N,;\pm!jX\0$=<>#HD#7QZ;p`Lkl[aRK.s7\fDVO43MtohQ&joIN'T +D;0\VBX',W8]Aa>H7&FC0/0;o#@f4m+UpQRT$3k`trX"n@s?X']AKQX=O +34O2L(Nu\!^ItaX?ZAf>q+T@=E3X<=J.N\(b.6uBC4/$ +Mt3>4$FA%RRRROFFeN8bT9H7=4onNMGWB/31;>O9gHArVre0aj?fm*Q(mtO(c_A"SagV$q`d +OKKC`"#5UNRK('RfUqI(cD]A1!3H5\*n'jWrJASb)9C2=ZWtXhf\7:WYoe_ceR"LHD93apj ++h&Ojcc"d&YFebo'(U'oU(0D,G7o8E;o,h;G--`70?Y?`B>%+l@O,r78VVtk*l5W.'qBK(j+ +?]A*eg!&nDYM`k]AOu5/nNtPm;oH\oWWjp"?5\">i3_Sk[E/gMW>162F=#p59CncQ,.:,rN/+r +2K?Ft&:24N]Aj$1#SY:S/'dO9jRCWlt2u;*NO%RL!'AtX$qF)t$e_6"p=N)='nsn#&_+2t'3A +-Q&GmZE"l[c0#L#oB@^\0:Rh,]A_`4gpVBQ`A?^5BErL?0/r"Cf.8h)5)D0EoOK_*r>@1AMYJ +(Z\3=76cXD+Am2T'@gr;dVrs>iE#Ks7`,C:ph3>m=d'JbYkN?\B6&A$WV[ZEn-o#A4FhjcN# +C&jFdMX!OF'IFmnaVKRJh64Y7Ni(!2BA3T=mLD?h&-)mgbA*D.JaL4[ssb!Sc,4Y`Dq/u=CZ +ks9\fG!88*r0[7trF,Xsm)paN>Kfb+kt[0U9P43Qg/XCVSMr*7#mno+SNs2jSt=[6D[X-T]A= +\=19G#^l.EZ9=iNsdT3,. +Ft((I3BZS=mZgYe;XeqQ!Q92pSK+g:M;ag\m(H0ASkq&-Zee2?ife#`)iNhhfpHBC>GQRoY= +DKX,0p@J(Ya/A_r;)T*fH'mmj+(;j^Te@QYA\=d_^slT4(tiG,0Y?mj!@uZ8;0@>KSmbm3Je +0bd8cQCQ[Jgs"QGcQZ!pLuDk*$Q[Ptr@>hH_.nCs-'*qDf-g3=BR91X_,(<;=Cb`P\Z?rg6H]A8 +X5WgY:m.]A9=9pdkm9B229GnUK(s+DTFX`%X.c88PZ$7'0n*#'I#c+.M)tSP+L37pH%F20\]AN +M(V[VCbit*I9?EMN/1%q$3?!-]A5ID/DQBuVDiW +ntG9^q2;LekV_QAe`EiVU(FqD8<+H[D'A5+` +RW%!e_V4;`0FeL5eN_EF26ZRBmEfTDO`5)&\d96AaQPK$.A>QrR6uB1]AO@6n>kZtf'It!b/U +S/iIW=IRAB'r$0hZ)$q:N\5e/G5mD[.!\%4'^+mb,Y!_RJ'mX!^mN%gPkf#8s;q5Pc>BsIALs/RN:P +J4_d&p9IHl\No?iCS=8X3S%s;lh"7f*geiMe^^u\hPgKp==@.?WrqPU$O)a$&\j<_LX.9ek^Yk0cigeGmYrN[cL"11+ide%T-Fe/\QF1 +#\p(]AYhlA5I1#&u!m__;-gjRes'P5e-T8E[7fTX's_Du^uof#9AID\/E$M3W`*$/O:Jlq'DL +""@2J?Yf]A89)W%NgTir4(sP6$Z;sWCE:`TM54ueWO30oU=5[91R_;6Z-*5ld'`Ek09qB?!q\5!IQ +m4F*iYnB9%g)kC=u8"Kq1jbaoOIk?2>2aVQN-%ZS\\)qkoF9PP,s@C)>TWK?ONPK0%*[U$F8 +P=&@0QLnn.b9bXMT.'qAEW7,WrVY_G:0BX'X%N6_q!Ii#Yu2m\2+)_p%S[[r9%i-9)mn16pn +%?TZJ:7q7>#Hq=E%>'JRqhmLR"%*e_I&M2`?(tJifdLLYlOocoGLL/10V>JkiOVU5E\ASOHb +J:ooH<;'$G#NA&I:_F:pZF=di<0+*mo;A`!B3"m'_1!:"/4!M`PCgO9j=''?Nj?XhE;V9gT! +6>&,m\rTC6ppiF^:TN3!ohKT<]ACN+9FJ@E#g9ShpL4Xdp0;m2B)kF47!FbEqYEhXrSm^2%ne +lW8o!(O#Hb2[2(_.M)X\d'h`(mk/9Y3ri'3L^Y`o^pQRZaH\jb.5e27;.*`l5R')/K016I8D +.aKk!>O2I`&&)B-Y(CmV(,3jYQonKF +(I?qu<5INAuO)TsbS'7Bc:F$EU,T]AIm"gIV']Ar72SXFn-R_ieXi4=!^kU?prBIVV +RkV236^_Z2a'?spNcf@i\^.B+">16;!PB5\2-B?4&#PJVd'rf!V(:i+2$5Z`D\9jrjYOA*+h +tFfq.N1KVrANFk+N=9Mi$@8V#B+t5, +SqD9c85p!\faE`clGq7;2VH@bg?Dc"rmYNeP[\DH(3AAk:cY +koHCk`kVD7q7s/p23!iY7gcUhDj>^l2T^Frq&^*\QDCP)=Sh0a%^'A_iSl^dU10s\[9G%J"$ +O%NVOOl"Io?M!)P%VAL%^[>SQ;6QN6Zr2CNcQ9/P`/'e[dr133Ju6n&8%&6-Pr@+E<%]A!?)& +Te)IR)SFp:FYTXON*Ol.EeI=?ZPqK.a*EGp+a,1Vhi2oEn)YHj>0"0oRHNsVMCP9m"QQ5khL +6XtHAuC\V3*tZj\Sa(Nc0#K7]A@[t?H)MJ06!L[U%38>9XO[lRZ]AF?4pFU2Y>8+,c8G8:SJT? +!V(i[>=7Gb7"4]Aa2F4QghM6Jh;.SEG,,4Os6gT)9[E;4$oRckM@+>?>5'iEs._M">mMO-hBU +**s.oGg"L@B<[T3N/*?d3!^oV:1iT5X2ihMSS8gBTWa4W:;>sTelV8l]AqoA+;EBEFk)rGU2_ +_Z;o\4(DqcSs?9b&ib$SmBp9Ar!HE;;ip'spQor/mr\.TSa476pj-)TnS4%.f17tr5,:pT(`hM(4(#lNCn(;!gL'D&8LV5gbKPKU+u[baI*]AGI$hW) +@o^e3+f^rM)BTO+b,ROTE<-ZZC'dc9o%&2n/BO^^?s.l(8+n[*fnH1N#%U +MdQNIV]AM4rZZ6JVXDKIIYF%qjMJZnO5Wke$bS!?'K\ED)(75T?G)N9H!#3g`$hTWshAEcp:M +%AkaO_F@]Abc#hD/,]Am_\/5uo/03nmt!g[,SVGl9>`RK:+oFunZ)lCQIrq,c +:'fT*RUi#3^Hqrt/)K.Z\s'g)`fn:&rr,,&OK1,6]A.ACKEA/]A!f')8OM/lHYr1;g44TT<;.K +Vj.Xo$R))?C<%l9AC!3HQjeEpf'#)04LiV]A4uBT\\\A"=FBl$cp6-9$*rr\c^JQuE;Wh6R>9 +@T7nB>Yrl)Un.r,,'Af%s9I)B*H-4EJ$=J$.:K06HY`aSteSY`rVg:>4l10@UX:4b&`2[G6) +^]A(5$<>X=Ql?[iqFr-)"Gn:gr)rlO;2lqG_o9q!Uf5MI`e1q#[MCVq1*EcnF9UXG1L1&$0#i +_at!iC$-GM`mTMh"j5=9oK^ +W0U5qMo4_fW"lgYJ^XSu%T]AeE#c"]A4^^ +Gajl4S2JZVZf213,Ze3@d+(h?O70P&2j[NkO("'pp0r##70lX&:C_j?-K.HS8W@m0MaiI"`T.ZAF/WPtZ$Re!`f,N9#=kUmnDN%4'[iO_Xe]Ag^1N;hY]ACtW9e_ +6c-3D_H9t9&Ijst*:<^+$+Z#kO,@j6]A47ac@Q6,H8QN.Yhi&YMffkO:73lK%j<`I4Y%6ale/ +3_TpCmTS_.eMtj,NfHK\(Ael1s3@.`^)?I$"HutnZ13$f_TD:V,_:E&2?fe:.?o.8)=($OYo +_e\$j9K)\'8J%Tf8FRPbC,(I$T&RbR4=gb1:Cpn8t[jn!3=8o:]AKWU2:*#]A#+m8+EdaD^Q'R +\E+?G3qDiO!eO +I(4c6#$$eab'X;l?%_<@m*kD`=/HILR=Z\Q&80DpqVaNB[FIP0\gCfH?6KR@jKQ*r\6(qd.r +u'I#tB!,`ajrM@SSFkonT46QPSV0V\ArU#XLmKHCFiA?n"*3n,B+NCfCDnVGBa[:K*:ar_&\ +&T^-69b[0]A'@0_Z"UEoJG]AC)h!G]A!Gi33?ZSf;^68G#=(1,AA,%#!c!t!`P0Ch8#75Eq16^N +0h14\iFMNGcm)#FDG!Ptp,pSU\dR\W`gfg]A.C!sXFU7[=uMnlN2R`UV#ME;jeaR_O""jdEac +DoTjkXGV]A;\%APnmAM2pP8UG;j_AfNqErl(*89*WT*`_BoF]As`,K.XRWnQZ0IFop#@IgU]AK9 +Zq!a+pCB>mBq->\iU*B]AbiF-)Z54egCi*Gk)q]AKqC4qNG/r5">]Aub[O=Ht?'Gs;[;W7d<8Vp +T$49f&$c,!s<_M\E'i3,;a3[^9k\&9UU2A@2j8[s3&EV]A(jCCu`U;cne#_ZK6?'Q +=F4f)&(ii/V(m%3hKYo_c2h_ff&79W_fQ!:H-!1Vir!T?)=8ohYYG6`f?E=a*!9pO*2c7`P> +X4FD$j>*iN_f0F%R2s"$E7gTIW]AUIsto4KjQGZ:l_n7bmRVbA83GBP"dGEpQ=^Qd&.dtW-S_ +uGRI\-Y,4N6\LoCmB\gp8lR6?K*W+]Af.paMf4&SC6K$h*oSdRW]A2_in\o4\)9]A>DbrX@tL!e +=:#n19aM7CSQf@s19l($D_Gn6HW;mE#t't7?]A2^.eDn/emPWSkb(l+]Apm[+\lC":N35_Gpps_\`"&"q1n8/>)Qg?;OYP94Dc=`QOb33?fX"A:-VKZ6]Amjc= +KF@=Hfc@+RO@Z.O`5M4]AkX*Z'FUBi:tnJ6XanV$p.;8Sq,0"eG)(Y\cE>6Nn;=a7^KkFG,:T +1MKHQ':>Hio6?+6[0]Acnu-jGgqkdD'/AB,-"rbWS!`/8[WeQgQB0sj<4NSf!LB7pB=\EBH%8 +-*']AGs0Ys&^HC5g0h+gLHM!]A1X4T-E^O12ofN&Yg\7cJhW=8npF]At\GOP)VEet:;m$=L!TH/ +#*(b0EGZ&?nA+Zkf=6oHiFkf%N-1&QM_XN<%urjAV,p1(MD\&5)!$#JcnXBV1\\i]AF5gK7dl +aK=h*F.bb=/C3Q>lPTF5V]AF#aCM708/P_:4h]A^t,%U)0RUF=+-AZa?H-A9=[<9E$O+_BJ@-l +NN'k=uGlL8>&cGnb!dbX(B:SlG,[X@fhj!+gR*RDklg]AnV+;71Pr-dcPJNYVU1(F&W%e=KK' +O&V5akIG4_b2$%n76HZlI&!2iq#0@ek(e8E47aoHm:`t_BK`^.os,41^:>_N$DcqJISQ_T;f +hB$[GG]A,>2B5_3dh&QZLi.mS8?\?JjkX0t3L+aM^/Q?Q:"0-;l,j*rrr9`;;+_]A +<.["jO6qjaMAKc-`ON>i)Cm9#5OW75/M^W#dR/^T:r$Alei`S3_@Y%b^t^@/fhGq*@*/F+!I\NRpDl[bGYGoiaRYVJ[(U/rM +HUP-3*r73#j@=o&XD88IFs?YFrg6IrLX0cT;m-KEgDob1:hNf.B4BU2Xr?^Du*=7*7I/>TNX*k&Yp`T#nas6X>0lhnk"p`&nKB.D/=kAG3_*!\k2]A +R.G@k??00Yt3U?!LfEH%1dS+jqn5/]A6E]A3OMoNliCCL+9-]AU/@]ANHB?^"+BT&]A.`.U?Y,C@j +ePg\@S]AF!-(>2#&cBCBH*#O7AT%U4+9dh(IQWGiH*:qjgJ%Pj5LNaa3cIA4iN+BG0_KXW!Z_ +#f0`^ps`DIPh=X(/t""5Ksj]AI3]Afjlk2IP#hdk-a4fiWi4D'.op7*i;-B:1o`./iYor/"]ARP +#p*hQ.k#X=n&6ZgoGfl?DS+iOl!D:P\^ipNoQdHIQqo1kc>jE*XW;\ZjeQ0_Ld_FPi.c-(:s +M\0]Akl^_UmEK,Rs.N+B0hS1\'AZC>("X*7(cN]A[aqAZ+qKL,eN$`eqa4_riZ=I(BkcAD)9!&;oW$VP*PgUIQcQ/IZ7e^#i;^4KL$"NO:Y&oH%IXiuurkthJ)b0m-?+lC.1G3dqrEMQnQ48^S`$BFi?SL=d"S.Mj?)6Rtd;1n4Y]AG6<1JO%oV +saN^^pTXrViT<+\IP>D-Cr1MJi^Gp4(fH)Vl8fDgKn=s$A28>!mQ%.ZNWRf#,8%Dcn![b%OU +b]A?4o*32Q,%U3_dlsfT6IA-Ro^]AEK]A;5;07a +eV_%(190VahY#D\P0Za;Y"".M'T!t-?&T'H]A5k[jn"\H^[SW=@/5Z"bXkj]A=+CMOQ0qdb/AW +tHJ/D(H"_A]A_Il!EVt1bgW&h-8AuK+C?HGN8e`rfWO?UD'*X)$&8V.-E6P+j"&*;2dW\;bi$ +#"i_UU9npi-]A$rblj2GJi'F*D1MA"`5^+7W`$'DtYm]AMMIh``2r!3OYX`0T;#98I9_<4/I#> +LOaR[_Gi)5#q=l.[-mR,Qn3BZP:;i!SY>@A6li?&qh2D-XIr\o +Jtb5NoJupGB4B?D,i4:MM.U&)K8B>dfPZCW5N1g(%JfL^SC:-rl&OG7pT>uCTJmO]AQIB[?*N +*Q"lC%*,DEPEhXkmLXYBCEpX*,[NX0K@V[Jko8Wa(;/o3En2l^W1"R^K*LfG-cR5f[EdZOj]A +A%HXn^c#QIp3PrCCH4jDU+qYR[b0cJ[$K_9h5(nE_.1Oa4 +N$>'bg`B`Bu.+4S7)(qTPK[SQo%-RD9k/(nP/3-STbRGpGN5hhsJIp'(;*kB(nlTrTOK\I-/ +@(Ye2uKgF]Ab?Gt>^MN>RN,X$>jS1',rje4OXu:Lh[9OH`N+B?,uT7$ +ob=(M*CD#SU&u%0lC(j>5V@Q!I+mu`7IY5bdPnU$_4.;8<7?AI1(po45j^GJNc8&d3!'[bfo+B?.1&Y!t.\UOG?K +=&55b.p:Aj8`$3,o@35ek+(o424g3(LpGR>Hr9>BOG4Z(HcP-KYI"HO`f_^S1&"kEWb0Q&c4STUAUU#ja7TJD9E>INHNUe^\p44(qGX!!l2]AU08h[ +B>MpHnF.I_$/@.+$SnXutI0qk>IIeQtdC5d<$1h7D8[IY"`E7=6M%(idD.]A@PPY@0?qfkYA7 ++0bO&1mrK2T4p-3;026cBVlH*-\]Am$PX,lYZ:MhYB/HgWMC^t0/01mdiNGM'n$S(r@<+W_B0-sRA3']A[Q?4*B$=^%Ip+Z.)0mCR%Pp!nio1l9G=HYYdbWu5?1.5:a_mXS`"%BfXa]AGn]AKqQjGe"HT<\8Bqh'ar+CqaQ&Mi$,uG +@(DQ]AV0O+qP;DnAk1_ED>"UrDT`*o&ccK$/%BL2^fCe/Lda_!8XK>eRV[J +P3NK_M4s/Yggq?pKJfSL&5>8a[Pu8]A4_5-rt8r1H +\!RV@5`o^^BJYG"NmAb]Aok\hbkg??,0_OjHHJKOCK/gH7l#=K$-:Cs+)IRu9^HsZd4:-Wj-hVIoKAuZbEWnaXR+1mmr3dL/.Y"7IWmrngL:D;B#Xit +fYC7a$r,@]ATAn6D(sO*e^bO&(-:/8CLu*t*BQ.K?W`HJ&5*pD\tS'^'ZKnSkfM?PoS3O`3GPmUM>eg]A/;'W- +PR"I_Y?Lmt=ioN8:P?/(p"[(^Kf%d`i>L'NVFo,!dZH-LV%qdb9A\6-hQ@OtSqP0koMRu`#QULf'qf@fS +8;hes5>N]A@5[sIduGOiWQRs3WhJ(hiu(\R@]Ar0uIR2"`,rHEP=sE$Sco;ho?%mCsf*rkFu3W +1K'')V(VpT&WfHf_So$GIn4rcJ1di$X[`.^!=.UqAs_NM8!]A3ofQA3o9*s9p<,Ru?mhjR0og +3YO-.82E$FR'1K[E@QGQ8fRX@=";"YHALJ#Vg/-8&++"QS)cL#2[7;j+N:dc)P:7P-i;bSr5 +E*"VZ!9$mI`Q,p9N+E>gIKkCi(*UO((=RU65]AE`fXF;Th+#sf?M`FE6HEdgqU+4t!Xc(H%e* +KKqb:6&%[(Kg?>S]AQ_V]AH#1j[cc-V)J#,NP"A3>Mgo4Zmj7:(#a`?Q-eW4 +j\ioY/\ci(r^N#Ncp/k4D6$G!BBg^:2tE09inM8ibK@VFN#!?J>#h3.1gmQBdaR^cdsUD:IAeE*j7NB^HI8X\&B1e=b*IFq1fBW(=irLomkf`h@$@A8s78*L7%9 +O/B%N4&&Njqmg@8UhFnA`Y4EJ#]A%8fmQ6SQ?082.Jj![]ABiN4lMe9ll=HUBWAAhdAXRd$Lu< +9m#`d'i\?#G+Y\Ur_i5;B8KmB?JU>^0&H3Zoa54%l*/KKg4Ni`'.7b]A#,!*eBIW]AY(Vr@?P* +.rD`q.)Y>[_ojIHL=%3("[/+[)f[TLb?TKAjN>/\0)c-s:q\Ug3e.'hQi_Q2J<3$'>Vc;A^A +AA)GOLrK"NqNRqaO%pp-G@:$'E&\5@qS`)T/dT=j>;Il9/=8s +6he3LWmca51OUQhkhFIl`$UlID;4/4d?s8pJgYRW7lh^eZ\;\SsU%8?S;fb/4XPNEKC71m4" +f#li0LTYSm+!teMjc4]A,KQ4C0ud;*fBB@4pf`G4W57.3a5BA6$l@E7eZ^0IC2L\ptX@]AhSJh +]AZ12*GZm0a'+X]AhG;AaWu!Jh.<*CQ[C=fTCLMosN/Gi^/m@WP3U\NVgf]AScT,lm5CD0$pYXJ3cg=o]AKU;Z=\jKF:%g%'^QNN6d(8OQf1Ws0XnQNG!Xkg<.H"?us +OhC[qRD\^a@FNN2LILSg&@/Z;LXMM#OKDY'(7:*G!'@TR#[0V]A9]ATWbr0i@tImlRoVp-4;UA +Fc[7fA54R)GYG[MP&ua?uV.DmhRcW.^%aO[Nk#(S]An@W0]AJ0DksAYiTAh_a_X`OL8O_L[kO= +*!2N2*0cKcEo1B4oWSHGEim)!$@@\M#6mPn6N_X33Y]AI/b&trX]AF +;Bs2^??&1L(/mKp4WUA;KR&2FSZHs*HR6o-+*QpQ/lFC7=#r;H^su,Abh#.D*#>TF^4dG/5E +*L'P?kT3M3Qr9co?V%Bm-'[)I`:V6!JEDVi0)`]AWmbYB]A*qXNgT)F]An@H +P0J*Zh$(`pDYSQDXkk6@QWL2IOO>@'-hY"Fh;JJXA3dLNQ0Ah5I;RJf,MB.C%P5suT>-6IKJ +"H5%Nhc*kn1scQ*Lbq<9:30E$QTsle2^!J/Is@W6O8Hr0Ym^]A))8abI3+7Ng`E)+V(ZIgqO* +lhIQM`F3X!UH?8Ah+.%2&.P:a]A^WIl]A"p+f/YHIktIZ5VFSWbiW>Q!*gSlo=)0e +(@#;f:4;K9\S=2SCH$W@\S2kBoU2bRb*Nck"H@ULlSS*bPmbbis=80l?F^qjKVZ]A4MHp9H\m+sDkI'(`XUEh;YR(2XU`I'>&ucri<2 +&2pb!;JMkJE'H,pC(iiJ_Pa!t@0]AU2_+k-O8^JfXa)Kc%PR?@`YZ_OY`!MF_8u(d@9"c$>Va +\JNr@CiHuCq4bXAMt&kj!aH\dh?nNoi!W,Z^F(K8GIdYXf#S_VU`EH&G-lfWkE,K]A8Nhi/$DCDiHl>3KP06H>lX&.$aVe!jQBb>[5+*J +d^o#pQ]A(J7+^T["HjK/cSU-(jC4bi7hr&OZDmSA396u..,(/1[eSikID-gW@b)KpF%aWXKC) +176MlsE;d8+TKm?G[O>OuLC0n]A_RG4.Zu)5ZPDs]A':??%.UsRG"tALn=&J.\Y.DOXn?%-?75 +'ulcks_E-5X;W3.;uX8^dY2Y*i")?R8d(kU3f<+[@``KeoR28'T`oOAaH2(U=2LZ+CfN`V%[]A?]APmK^dSUk&N*P-bNU"V;#PQnq#ha%uEu;i\1*;6-!RNH#Ge!cr^Z.#PYZ?1V3STYZ/$9Z@T/\U +\H73hm5+0!hMXCqgucp$p%^.A7ADhg:AFWg+aUWEm8R[7@@lYaoJq'6[16%,BiqSCsE75/nXKME.^TIBhN8-\mLpF7QfVl"L/UD^/TDHi:;LTe]A+;'GEV.m"b#jHI3e[C,rJEi%@YWr"jZb#jk%1@uh\'IMAG-kN.kO"S4R +`cUX/?7)8qn**',:6X(9lXur4@EJ."86"G8feOSl:IBab83`D&s3?(-nEF6o3\!J/T^d<.[& +&#YMXi#$(Q06d[Ul!,;MVT-Q:,Jtl,7KYe(d+S\oG7oO>!@3hJ"e`#PpV.*brPI>%Up\A8&> +S.M!EuRZ2MgXK-l(m6>:7T[t_kLC@h#"lF;9)HcSnqL3AgJrn +?puQ8VpnWFY\9e%,s+#m3qluVI5?=+MVtT*NmHIa!.OGli<8RSXS$@pfh:NfqAG0C1hX\TB_ +-@N3\OKi5gME"d#a?Bq$TDbmd6!,[;tc]A39FH&nS*LL$i/Q$jJ$o +/;4+k+mTB2m$-XAfuka[5`1L'4BWRJmk=a=_B#]AGtdL^Ys1bBlCL0:E$7eKEF9pOZfSN+&Qc +l&?3C80Xc6I8ocRB:n'E*U2,GS/@H2bCm2V;_=2f7=E"A*`;#Dc$f'^ltV"d@lqD5ZpUZd_B@X9/8o\/Yh!;=rM:,Mtfmt_j"QC +Lm(Ff#=*/b/7!NBO`TK\@=F_&.CS +0]AWAo>m#GEoYKMHF;IuVPqkF)74''$DeM7";r@?fA/kh7nlIbni-*V#NGVif=[:-lqdcg_Y& +<"<^gFRn6BTrO_i$U\.K/_K[a$`Yn6W:BX,/a?Nk6Soc92b&RriA`Ek1f*0DQL)>6ADR.#I, +bt"c#7rk5ZN5Ylc@6TgN_405mcV&(BLHU^8htZUZcfUIh?5nsNW;cV*)/Z@l*BEp@XeoFF9" +:d)kJlF^?2Ea361.gXE/8Q=6ebH_ObZnS0=,l1]A*i_)ip6R`Z1^-TlXRp1ruXo50ainoX""]A +n`'L3.,WMAG'uI:S+18o8nh17'QuX/-q%GWLBbT+]ATD$"?o$b599IH1.EQm!reEoP_9<4(Cn +XAsBcsk_4k7djKgW&+OAqpqu5m$RUSr:9&ci$p(uNO<-#MW`Duj.Cd,1AjrM1YV#J&$4%RjZ +2&RXCCjd^K&B;?C-T7-GIk#tq1hee\o$uFp/0R4_Ven\(SJ-NLFD]A&1NJ.Xk`_>=fC=37=%i +'uK2t`//2=ac$#N*,3,r&O8"0BO1Q6:":PnjoIjaVq+LQLEN`V4@lE98&!Ji#n_)>lA\)Td) +hLMNVJ)c,4BrMr9>s-Y]ASHPo./UmS%UO9ZWb.2]ALk=nJ&B.Br4*Kfh*lj(JJIB0HQ+%)TjWm?pOOWI%rQ +pfRe$t.kW85[(A4NMY;(3^.bO:VYr9!MBtq:B_="M%T\A]A>[Dmo$R&Y#[(d6C-*QmF6_]ApO( +W*,u_VZr9iEi/X[o.\lcYu<3.?'Pu +L6qf:"pGCB!Z!a71E9SpmGhbrIkNLoh]Abn>5FdqE+PtC\Ffm.7jD>MUZU0g)"RaI/F#s=%(A +=87?DPkRnRsY5_Ksqn)B;BQL,Vp97_?s39^;s"t_KcEUMRHjG/LpBlUQi^>&%Uf2TPUB7)o# +bAk[-3[dR +QgXM1mW!Ih&Q2/6%d9P%+J0?/g]Ab,2nonQ\b_T:Pb6pY&[Y8,apcr_=QDQ0^(SV]AF?8A,@lRQO]A=V5F#.g.'FT.m@s]A'.MaGd'TW]A&B +B[)(T2Z`6k01:X>ngr!]A#mA3ZLG,MeIq%Rm^Z<4kP)R+]A%uJAnB(@b%qd;VMG>/J#0MkBbaY +_Mg:IE(Qb'&/I8\V1IP3nHjkY<$*Hnccf^J]A0rMU1.+`Ou@3olrSp]AAXqdNch_fRnXbp9M3e +rPt@P@j;)Y^^QcC/\Q-M'X&kKjT&*dTh9=[=i<_JHeNEn3@2;.V(;Ls;[Rb8LDu#Aqa%55\_LV2JnL.BJF4Od +K^_o\PmjteC,BnO%#"YL8dV1M:jr*:>eZNq;(-MCo2&q6^\"IhA5dIrl^FpZ.WS2[E0Z7AtQ +5gck)U.g71&*i[V$&n0R1jgJH.;2Q)e0LEJ'08JnFk*E_n!Bb,rhah7l4EX>/"N?^*R<8X?- +iR[U78M&H$YDU[Yf#bXUZB?]A=*l6WDSj),9YUXq*Auik8iM>NA;T'gAf#EnhH$A0SDcB:Ja3 +C#!6-rF;>n22g_1;\L0Mhei-n=BR%$NnO-JJC+nmQaUClTWLa7)M^M%:02E2@=($$G=@PB`f +g:Uc_08FY+-QF(8NlQNXYCKhMPH6]A(#$7hSPg_Jl:?.F$_MIu`X:rEX`lR(ql+DRWE +GnT-QPhM&^P"aL)o#TdmcIb2@:("I.3iZ,E4?@hPbmPb:5E;o=L@b&>04i?fcP2"mU,'l[A` +lNZoA>KO*Jr/M[mf?ct'^:`%[Tf:g*ME_=-9hVC^0jd2_N_5W8&';m)ONaHYm(p^.L&-$rKV_o?MXZ3ts(M0R;9i5l_)@T@:_KbT-S.fkatPG?-([\%l+ +k1W)#k4I#`*]A*F^\MJ"<(MOZVPmF?G(X(-bA@!n2W`5l@LFm5UOo2d5&N`BB*Zc\k,i^os`E +E4%eq3#Z:5[?qm]A0+^e=)qad\.pTf*Hm\>A2rhV%G=?_==X*=lj%hTSkL9n/UAe(k>g1=h!H +u@`3S!nmc]AuZL]A'mP[YPVP?#>kk9/Z^5LY6UD'fK8hl7Q@^H2710)_QD5gsVtY1ee?IY]AK_) +D2>jSQZL,C=#)m%h_hTFqgfbCn*KPSCd5dr*%DJ9SZ";:!<4@<Xe]Af.:md,u!(CfU5d_"& +BVQ7FP"4?0Fq]A&rVEVk6Oe<&X(TBd@mG+HIq*`G9i=HQ<>&drDUZ7YkS[TuZCsHb-,9-e*3a +?&,o(WW=!RJ[fXmC@V%WX\[;c]AOnb2Fr/GINU.NB[^'&Jq8QQd$W7hSkj#AMcmgu\rSPkT^6 +)EWJ_]A`M\fWFdCEqTlrOQ\/)fZ?#Mdg^QE12#c`a[:S[tn`(j)CkJ-Y9`?4\V"iuc;tK<_M5^$jn[$4:&WgSald/8rR"WqhV`HbPK +WBDsIb13Y3m7-_NKPi"AoMMS6hcc%V904-EO?^nmnl%rNXD2pa +/Zf/Z3j`KRa"@P3V#(/63Q"o?iE004b`j3\6n^7XgFNbqg3>s\UcGfXCs`]ACNn@dm?\<*<:j +@nOaFA&c5U/:RelMTa+*\G/hc5gDHXqrphEP#)KYl]AA/VKPr.LIh\r^(=$slRUb6\Wuk%jUH +\\51-4iX4!E[BnMWP+2[=>Mpn2p\3MJJYtnrIr4tj@`-`\pg[Oe8"Zt@)Oj[!t-/U8*7YB?M +3JJ(s(tEWk.)"Uf`r=+LlA5%@V^kep*LqW$hP29_Hbf"#Dt^J:K*P)\p1nQ"nkmV/]AH2l`hp +-V97MsWdKDk`>B97k2lY'X'UR[S$"oaA#Ln'%Ge#?XOS2(^1T;50j!_PALuST,fH@JtiAg>*X/.E0P>J +=r%!X/N*i!$6,3PVc%VVI8>g6h70bg/)!kLGHPQ$gG>^)@+ikMa^p,-NSTZm$iVr\gD.WL"D +(N("jH;a`d0]Aob;cNi.N3oN4s'V1h;Nn3:#h@O2ZD[2n-aETc2dH)QI0\:nTKmH#Rh7($qf+ +K]AY[:]A3^cWjTR^?4"lVp:s6W1trB.kq<@S]AR(&HH@kUTL4$+n?_pi5oYa%\Y[)RKW=g%F27r +:Z4nig/"L?XpA6K@Hl)GT7&+^tpk,MVBJc_^FQ7T'-MkcI@-:r8 +9qZ0_nH+NZB4u2Hts +Q2F^HOHlYMpi1eMV,N452k',.#U3bP`or0_*N:cUQ68;2AUZO +m^'>b=';*!(b52Y_Jn9i3h5h[:4FM21+14%KLa3gQnjH)Xl^]A1,'^JQSA;-=/!T#(,e_r?@BaPFc +$J:3m>;^U#r#q5tMYe`@ILr631:Ff8F_WX]AR;6gk%%2)3+@)>*4`UuW4[SDB<4dU9WU +Rc_.^.-%,3)CQF)5Mo,:'[Vk#KgHJqVt]ATS9Nu[,Q+Z9T^"q-NhQeqXUtu=Wp:,/G4dW9($b +NC9i3b(K&ao5%c6MNlU)1rl".Yc=(>nm`+rT[03RN%PY4ZE1ci^&2-H5g<5/aR@=C<4Q +iU0;)5FfG_7'eD;e-hQ;moCVPKseN,b'hOjZ5_Fr4ArE3d&gT_l7j?_84/RI\U^U#!mAu31c +/`Gm!GVCV/ZruG0mV`5^-e0gXlpu%Hh@>^ro(='rc1bglB-$;0mf#WFi.'$TAY&).5K%&!)L +\scM1gaa*&!S$>>_l]A&K5lCIE=/276K<#gAgaXo6%!lh1V1>7VCXaeQPnZjG]A/)lV)?JUhFC +4-&tHD!NHGfC=m5ad?bh'WJmUo&6ue8!cXIh\0$b%jDWqr:p1Ncb6`$@!@Zb*RCPl:07jaMN +eAKWFKq>`E#I9hR@_8Vc/,%(4;K:5OF*L\_ihBsM759,[k`:ngA'-Nb7b84i)>$I01AeY=%` +moVm:@HSe\J#'(3VpmAao/&uK,OXR%88`r5KDB`\<[%(K9GS]A;-HuS4`)d0J[?f&Sl`tE +nsDnqT/FEm[7Rlm/(`n.5^0Q]A2q!DJ#BX9GhGMu.,#8in.g[9@HXf:s_g]AZ-qRo@MJF,djN, +MoQWo`]A8,cgN_W:@]AiJ-^b)W!V&sp(ESLf8bNI7l@2,6A(,@N_A(Q]A+9(6C;$hku;I2.?16]A +P3fSZ'^H^k>BT`[BC%ibpl$b(S\\/:M%7;&2HHf]AA=0kPMjU[i-#fVC`%=Z:Zt8C&Qh%Kj?5 +Y?(Z8a7.YNaYuZTPj\TF76m#G50!Am&*iDd@o]AYqZk:-W^dg5$VQ#,^Qtc)j'&KWhH8Lff_o +sO.R9n!'`(%4;s*MrTH'@kSgAT+r0Z^V)m0OVH.Ng6W?s:IB.%>_#M38n+Dt^[Rgko?!6_IT +A5P\W;(]Ad#1-]Ar4V<=^#X9f,`R&oA^/\=CCfj=i\rd_Z13\inQ$(42I-NeK(4?'BA?t* +eDWfkP9?q*Eo(0#8ODBIb]Acn-S2?leV9"s8:lef_/ADiDq.aS&(,L62$jh231RGK^]A85B +A!1i(J89.+"c9b#,/h#6QMpbB@hBnW/hQ4,tmaTr+ZsSD?g]A2mFE04T(RZmjgO8lZESkM#8Z +E([LbMk]A!5PbQANJ;IBA'Jq<]Ae-0XHuo^4SYE8VKHhJD_AW(UF%/3cu&rX,##ln;1p)pdn?. +GZF@G-"@Wsc[jQuJG"ms-B1Af.a;1@s,7Ef17A%0!%r]AXkPqZ-1cdN@;OK\B<1C,"-)UulgaJq?cZgFXbS:i>B+^P5R*L&Dc-JHfJ@nQ=VJPX;2fJ1jm$#6q;24WsQA`Zn@m,6*Fk==8hB6&XWkc#))2uQNtg!!Zd +i@N/ua=]ArG^]A"h27B/LNC!Osjaor*,iQFY(/Jb%_2\B!587llB5d]AM+$%'kpu7hE)MS]A%2)"`S(C:J]AmLJoGaAol*4$ +M[:/8a((jKsVI-E2CA'BG]AY#*G3]AIQ^]Ai!iM[:S3mPZQn_B5LQL[4K7un,<&)4Yk\k\s]AE:V +u2>,n.Wf/LJbWN]AS`$X9de::^Gm?]AgY_#b^.i3SmptF=G,s'Z"F&`p4#hI&^\'AP#PIh>M#& +bF?3]ATL6@+08W9Zs'AZjD+rd\6[2C_qSqt3)bq`cW&SL^e(b;*c`4/&K(7f3-emrO"0=>(F/ +$)iQ^s#:aCgkC'O@oK.[a*g]AL8giY#OXGa^g6e$\LK1ub1o9"+q`*:G,lX'#fuLkHPH/c3A;`Mf+S`rL6OZGq-01"Hng^2s +^K_dN]ANT@E&GX2%o`,is_nBP%59j^59]AC8&%FY*qPH\c/rFmiPaYG!c0clG+XU1[1H#c4GCV +jkQS^Q5,++2kGjL\nDmZtO9U%p.5p^[Zs/>^ErP3hO*r+Im2O@6JReqh+?X]Aq(1_6-G[Wj)X +Kg(*rTuB1-j"s3OQj$-InWi_*eZmp<3%T4[p,.sJ-3p"8&V:4526gfACFaO>HVa[R]A5'eJ\4 +<>bCdSFEJO^1*IMLQFM^B<$rD5L0#g57*hjGhc=Ve..mt;BUC/r4)C.h\q.;ko%4Ak??`U=q +9@>$2Ri)5iZ^#[5lmm<1k87rGp]A5HTp0kdLN<\IjYjfm-L?e=6cA)E:VaX,C;Q#&=*OWX3#)34_V^L0cm(MJ2#KXTpR%:JL!STIKG +hh&oOi+5fSml]AIOq"UIkBH0'"&5QP79K'\LN6'I,0lNo6JE_!Vu86+BMM2s*DO,"Gi0MU01O +18r%2hfZJu1IF*i=u!?EZ(fNpInBm"WDL5qAffpQgVE6u@6KnC"2KofB#+Nc-dF$1tF'??uB +6/"p^n;]Ab^k:F6u=`qi)cq7bGqAY82m\coPo>_@M6C5UX,Ia?UGNNT$jY?V%ego\+d`NhFZ; +B>?2J::'IV#F',gC9kiu9m]A9HL[>JAh%8B7-n8ALN/[<1uA86c70DZ9_qdKO%1Z(EWS[I<"p +G4@*F3B&be`91$QH#rY"\rfl*fT38/kq*PI8B![F0MR7)U"5)Pl;5!EU[CU.f#=IX3%O>OL= ++^(3,l]AG)`*>1:[m;]Al*_8\?fVKf&k&+-o^7lRoY61i"0<-7 +XI+.6I]A^PETVf$=%1,%/U?e0)eRJWI<1T`8JcX-XcgCEA+]A6KrHhT!B*;Rp;SiQhtsbn0L!: +s20q%eph^`nRRN(ei.6dsUJc)!_fhkA`Fh_HAXe[E]A==P>%B<@(K*E#)"#CoXANM4OE)$-Ln +,))j-n<"oN%B,%<2(#"4cq/7M/JiFi=$L;qV=@T/L?=:gZ1F#HolTi2;cl&u?M'#;CM^)RXI*(-cZSLXZZNi7BI\NkF9i,b3-G#Ze3ic$N?J +B$Df:B&qWKUoo!7fGl.FdqMgbM=GL&dOObu=;/_Jtk)Yi-$'[0a+Ye9.;%*M&'BDZuK%*W@]A +Y_lpZ`Z!6[*s.eY)q1[l2QN[Nc@29>3#.#UJ'[[(5'lpKc'n6)>lB@]AG3HUbhgD\cF2>7?27 +Q5*B^ib4iGbtED)ZRIIFmMG:rNTZ7n'.lhm&0FJQH:u$[GP?m1a`G/hJm_[ZgoS=";Xqla@; +3'-+K2oIA2ppDJ=lc(T#fCY1$dRL=jK)(157s:E +]A<7r]AA4%QpQ;gO982-rTS7u82(73=V']A6H%_-OEeY@"%.=60`aj6hB'TT?,N@[n`XA5Ua +F!\AhO"BntD3]A/"OqiSgHhr_K)ET9,_6:]Ap,J%fZ731eHV'YHO9ffqGngIdNL)I?l\H-]A^#Q +G=GS<)tSHIU'8Zp!<9#FO@9PH2)Chg[IN&[ngm[r%]Ak!jGQ^&*n2/Cs#/8GN$\#VKr1@!\d9nk$JW$fVaK,MiPQ&5a/N0nfe*Wah=V`p!C3-(A`mWSE4I\j]A5H>Z[.>J;TB40`9 +Ii^Fg\Va]AQH&P`n-3dZY3E;]AVD_4+tC(%.@`hNES;0clJkdX@Pp!d:`gUs0t\f-Bs]AFcpT^1 +A6)33T^4A,RDB2JcErAI1McnP3q[%Es:sCM:LsakeO1OJX&0HFmV[r(*Bq@E\Z<"FNU[PcIm +dE3`D#Qs[WX&EUSOr)C0X5:J(-#fb_NXo9iPp[aOqa%39PKKLY[s.0L/6R3M;a%SrQ)AQ',- +j2P`S6%SIM$\?QSj^pV^k0HOqOg=a),2\C?aX8e%CV^)JfGN8o'gBK8j8nhQjk<1@<-96::) +OQlgEi%)5o&SXU>k\l@'lncqKX;P;1(i"T^$lm+>'O<+*X!S&.Q4"PK.gC$\F"F`LsnCr+`9 +ZaB\.F5B>%cE!@@!.=S?)0:OXVG?giqo@pYBJ&I?TRIA4dJsqn&= +oU`OUM8`.o0(C#mHg]A$Eg4S)0qpFS,IU +U_M!i75P.__`SA:sR!dZii^nfkpjq1W_0q^&:GkZ?.M6f(!F%V4!7cNE"E^;(_!H_3@H\n[6I\+]AmYd.Ql94k +NfqfX$+2)Ti@qf(o=9nM>IrPgI@4/Xan,bqlRSY%bo4n:9\f&<.m*\ZoaYk-WBm9`OC6UjEE +6`!is-dl<]AC(jWM#3YW:h`i"&^ERWgqdjXUB+kYD[^PS?6/!_"VnJ!KQ%`oKMQ]AD#fW(PRdH +Jph>Y[1HrAlluA@\b.T`*`3nG$#Mkh*K5CNpI'WW.FRYhib@#'R8W#m\DeoQckGcP1UDGO(l +JJ2W/+kho/[1PS"on[=SGUcBE.U^EYOF.VlN'*H.@L8p!Bru-0S5#`Lq9-Fea$3:P%SuE +EauTR8t`&lWfAachodZ_b;ua8SAcKqtm;ldg2&k/KXL0duo*QNK.Do-0"SO"j(Ao#e*Q/CoMVL[`R6`bid/13c?2_s +R +eILTL/c%0M:F9'Wrl&.\"#5q0UCo&n$g%T*F-6ttR6/2^F9W8-FR2pIZ`HNt)bO!&Nc\Q!iJ +O&jqGsqWBY^5QSBpm*ZD9p:HPjgR$j`b+,*HUn=I2@b9Djk5"^m'&N?Hkf'OXP)c`$UiHr=?H@I/8U0>0$D,i;`&emWg4c:41os%^I61%[!((hiY;.>ldG3usl21G)oSWf8$So?4uJ4[R[SD%:'-R847]A-*=CE.IcCRS1Up9OPn5"!'^>]AS2A`5W\p\3O_EXhpH4 +$:-XE)[RUpoK2'Eq?'eR2und-c3PTGSU4BRHf-bs5'CB#;906,@^.h8,mi5YW-oqhldUn4D7 +^;mL0/R>"-UPMqh^UL30b0rH^B`K3%:mQ^]Ae#s3N`9%qPmh`ju9q_k*]AM.3(uEE4K+(QfD_'3\39K8#=J0`5E;S7m&FpjFhhcWEbP@6Le&&^mb!NUfY!-.^dfhA%A]AD.@m0oVEaBI5#+a%to.#lc#PMuP,&cnH+?WF.`;hM)J@e +3WJ6g.",0=oaq?@,s.[$uQFee/-; +`>lO\<%nU8_#t/QLj +dugOj"ZRX<*>:t:'MCl@h=cdKcfS`RmS0:EB-E\-u:'o]AAN>hH24m?/Laf01uQ(cCK&n/qs" +[Mks%s%geAmKGepATd[F[E@o1geHh^+o.V@;2Z;$/?Y)BhW& +a:^ZJqRE3bU-)aGfNVa?!euCF\dB5'L0bEu_iIh/HtB&utoH`R8*OOT1$ZHc9@q,2M\F$D$/ +^/98\)=u0**B%/;3,5]AS(B(ge$J19R!%nZ0S[&*+5qJu=DfSdmA%19-ghP<),>2kq9.'4IbT +iC$k]A*9iJARAch:gi+.O.)Od_5#2akKd=`A>XFn1th:<4&s*XMeomrGI[8KQQ>tcUgFNjQ1W +.GFDa[Op"?>31UMM+G$k@L+Zl.dNhu0:%rgb-o*8!0snfShSYsmS51-/<4n +e[q:7a9)miIbr7.43c6u73?#%>d68\aO3p75nA&;5Q^h=Khj'qHs?S11FqsIcI2&*_pM2bZ= +LJqS>6H,a4X1pX(A^NX-jFQd+SLOu"$hKW2?HNpTN?e.I]ABY=H!N4Q7.lF6(W&bpaTc +Bk"c-,eBPZ%\,qd*6GIbfM8c8bo,FJ?n1l^>\0_[.TbV.2'r@NrQ(_9SjZVJeGlD#BRp5:.r ++2fde,(' +blg6Pb`LH06bOT[iRmZ0W&46;gAY]ACK)s-MY8DIkbrs+P4k*tX?]A6Ed6p)3ZK>dm^,?NnM%L +e0l6EQh(DNURV),H01FJ]AYh4CT'Io1nLW,F:'^mU?QC9`F+i-o@D,; +H6jFb^n!X82Weq'@Sdrr((16`=R)KhCRa5.TVD4)t!Y)*fhi6dX*2s.*"]A`%=0Q%?;OUZ'jD +"D4\!t?i"I*Z`D!jY[f27M>Vn6YN`K_l6LcS31[BF[ReYl.LH5S +d7!?r8rEY2T7a`5(%ELJi4%EGQ.H>EZ?2Ls.$t-&\TMc+AkF/6qt_]Ah:PK"0-hfo:+Vmd+;6 +Q@G]AVNKb.M.*=>::7QFKQsFkJ&BBItQ3Z8TLS"GFiLa=b7t9 +[-#""0K*"gG,B'OijMho)_B5VQ5U7uY#^$<'8:3BL8tYO4]Ab_8C6Qgc;<:6&Zn1W`jNTD=c4 +Q86>-(B9G,ntV3SfT(DsOs7Z&Uq2$k2%hRh,!f)MD#CaF6m9+*W#6+8BD>;+hc)dsfVgLu@eO<]Ae`QJm*b-A^lul2rM^#up,9I!.,o%fbR6'6mSeu+/qli.lrPa=]A"Fp0dO +>pDYoc;fdNUA&qK@@$Z/^J,)Xi#u1*,b?8?cK)%L'5:5Hl`cKe\N(q +KR?JCM:IN$0'X_/(b1G#-PMN_5CVS"ZY1WEJ8DK,UhM#C1OA0o6U\\%Bic=nL&rOGBNW*5B< +LEY"6UWQO(]A=.g\+=$GsBJDB.bjr`YCHNV[%Veg`-2qBCZ2\%LgMhE61BQL(T9sV_aWQp`0k +W`?[6hWEjhoN=DqP.AI#n$s0[#@.YD$YADT=9:]A6a/;I,8FmgXR+]AJuHd_XhK%kpucnrhi.' +GLd[a9"Zu_<4j11F,gX6N`4]AL/`XR9QHGH;*I?]A>@T+KiqQ1'YLWS)&np.56^kk"b[kV6SnO +%(eCORo?c2J14?njgtn=E"hNT04EV9NSJclTuZC78DA@R['gE['BJT\5dC6NW+@GLX\>KXhu +l2L5H^?8A5g[>(,,Cial%[pV?:QJWCjA>Em^>kj]A_eeKK4s-ASl8U?819[Z1q&GZC#n^TsV5Ph)\#$:hd.]AHu1H^# +]A>t.==U?@M9`rO&>r)AU*-P_sGf2<;YAW(X[S8,N!/j +fN7D-o/kkA5MP[8Ect\.`rC&Ck)6WQc5kSeY^,tK%gd[qis/m%0'H]A9kb7)8.+6,*q-C=aZp(q3M>]A+WSHQYQ\Q=MUK0RcUKc +b)C;C"oL[#Y1Q\^;%,fS:>TCYLSo0ShFboC0S-jne_$Y>od=@=lrf=@/GW:JABJ)F[qE2Ma1 +YG3YEk>AZ8[Q.@V0#)3&bnCF\;_H9/]AnZe^TnlO +5@Yqj;BinG.7LK3@_W*pB:Db0,#8g`7CBi)ip.CF(FmMs0@00r(Uch@F&KT3P_c$!_?)XUHl +^[*YBHIR8#)\ri5!lE)UaCpX?P2`K+Q?kL2hj9R+\Xl\^-2r4uBU"/&k:>bLa>=W.."qdA8N +:&N;ln15tVrD1X9GDdY"f:o?2?_RWA^\:;%u^PD:@DhPXb0#$i5E\A+b;l6B;lX\5#[f-QVc +^8@[jp#[pfba>@k`rkZPAc`7b@%2rPt=1=Z.g8uC'7V9^bIP=diN(0+Tmi?*_G79hW.9.c&5 +atqpCk$cfj)l;O3r[`Do*2CLTQ6Foc,Sj5iE2nN +3>p!97*S9(W%5\4]A?h7F0[NZl_f'2r+YqSm2rge?SW\[6hJ)P2+Q'#^T +>T)\qtj35C?)S-ctm+abCo:83+Ee:k"b;hiZ7N#O&"lfdI77_VKU#VgQJ\K8s\kN>he:TBi2 +:-0!]A]A]AfMdrS\^,/i^%Ho(PD&;7G_rHAf"b=QpjHP'lri]ARta"coAuu>;),JjEc&ScY6J%b. +7WK'FP'IA.3(;=.o')7E+Ah\Dp_+mDXgD,*r"\*SfLT8*r"42<9R"".%XgFGU9_M +sP@#q/6o'l)@[,6(th3?2!gAJC_aToI3J+6VjSilO`g.CVjh/UL)=dt@4^ +$/]ArfBs4h)"T/FtYTYs#1c!bL=l`%:c'i'4!]Aif``ZOV,d3BA8A>R`g)f.[Zh\j:3Akt3i@h +a6Z(=HF7&+EZaE-3j)?LY`7S.l*6p[QcX4ma8qU( +lM=n'ZGBj'd>lR8.7ig#Q?";.fc-AFGG6/(6YF9=qO)!accYtXR`976d`JBh#6(^LC[mj3km +43I>rBfA)t&.M]AL1kKVUa),I:$Miu=S0CWPgjX(ks9k"r<>VoS>iWrEW?i19&;CWAW&ZBS-5 +n3[.9\#R=*7SDepRW&3#;d=R_4XE"f"(c(cR.G&T/O#n3rqmP1chN)c+='hfTUBq,o0`8$g9 +STdnAE"0cekhkAb2L*s3Cf0Ilg?me4^:9+18IIAaIEIT0@BElXkVZSs;B01UeBfD%MPeB42p +5YYX0#8LYFZ^0OM63>IsmGShMV3NqVE'l<->KD96Hqg0[j!!RL]Af`)n5s-$\E]A0V%RRh7EnB3&8',@sj%$b5!)%SR,D?=s!*/s80o]Ad9JO8]A]A,t.\O]AELD_ +%T#?o/iYW[3fHRb2^hO<@C"=[W^B#k-M)qFY3uk+>^Q>"QeXjj2nR1?,Qb#e/8p'C%srjc=_ +3Bpl8_3u)7i1i=!A^\fB;:O$lO9B:G?8PY7@Ng#\aE:*S?2q[6:#.UQ+H+5-oJCeWe_q(2Cn +RZ,:"8F)p76TkF8)TSMF7sDBqh9%\=-OXJPr8YfC'<)8d[QA@#n3O>1D1A3lR\Y\[%SLHYrqB[>+%%ARes"Smmf6>nNuu+6[\=g^F143msW=e"Pr(Z[FbqiR'/@EY2<+O4A.?Wq=lfjS=08r]A47"khu]A_ +`\tMmhU',$3.t`Y+(?%EXnpddDFi#Z9Vtu^/D`n)T'mfP<"lugB^#8p[r=EU`#LRhKb$,-f& +!/$C]A,DSTRc@%!*?X`dPJj!hTlj&rVr@aJ`c:^-$#aW-#ZaIYEiQ]Af-<8D(Jc"'arlS$7Ejt:YT075F)O1#1-V`/Vms#u0_ +j)m3>L'Bm!lTtib4M(6JLE4neeoLYYii_d1H1IG0jEd&74q502*THf4_M#n,XQ4dJ\?R6QW9 +L@>qY:IgVe\ItI*QHHKHQXa2\MV$;Dlr96-I[JCr,UrjEqoU>&X_m?iH+$RqsE,"J+^R +V1X&"/L`mraCn*"-HA=IPRK%.-Gl"jP"sck\ZU:?2"ONpT"CHrJKT"B&5NNiJ/CkkCNV'tN) +i*VGbuSU-atkK`5Mc'.HuMbbQR6krYoQ'[+dPhZo-S)7U]Arpi-M?a_H4d\sUBb<@`89*Ab._ +]AEK0U&[QB:-A4eU-ljE1fI[Hfq*QD]A(/$n+*0[5)Ft>O1,WUqNTa3pcb2%U24G]A(3[1W/mjCTnbS,UB+:-1Sm4deGEF5]A3` +gh#*<9Hf0Sf)gen\?TcMDg9Z&#:\mYkRhi_@rBkYb0NF6g-2+rrCj6Ed#+']AVt=SeL@nLpp; +\a7DJAdkMEtAb6tms]A0SW(,5_hR]A1lnbis`pZet]A"D6^:ot0S-s\Z0Cs_<2_l9<-C#0_e_O* +JNO>qo4'=A;jji3S_SaETL_$nSfVD7:A/\b8BFuXo,/IBJJ#g(a?Chq"1-@"m,M8XDY)L'F3 +K24S\-T95GMUopQB83_8_\Hb.5KJ@.;5oV1udS,sY[?#jUeaOr[8re8kInj(Y*2fR%A>q,K+ +/rlr?/]AQa6U#!B_net]ANOZ2ZYCBg=E#+V2Q>JhCmWWCpPcE@a-e)+Q^pIr(ts."2U]AWC2oee +[7O,BflK."uXFIBa*S/VlJtm4s!h/+q($496!&pCEIR6/>q1MHW%^!7MjikF'W=u&F*Y^7?r +L&D'?dsK8"W#%N/M7>>7I(P;+47JB[Ul]AqZa!:e6nh?t4ui,(!$9MeE%kmm#K5JmQUKXVK/P19drJVRT`YN8lNadpjs3D>F,[>YPg2GZR^(G-MK!dLq +-/8%+j/$j-HJAG7nIe0fBh/a]AYXSqmF8qg.n7Z^!bQ)tpXT(@(\qc4R@\"G#0QjZ<,Xua0sf +88;/kuXDS?Z&^RN6F(U<=U5;;l!-UZ?25Xe?A<+"0f?SXI`"h`0k&=fa%9'ItJ<]A62rk--G>Xm@@V3uN`*7DY$k."(P^h>HTFo.fIlV +P(X;.[C&P$qj64r@K22k%@m`gpM_pi?jgMJ_CIa32T'Zn53[>%s6=pBDF.A!(ph#r`&$m%*d +gAAX%b)so?slhWPc0"4r>EA+?Hhgrio`EgmuV.'A*EMVT=RBZ(.)+/TXj/+>FlP6QhMJtljE\7SZ]AH!EP5'1N%Q:12-]A9d +mX#i+@W("FQ7KL/QGH91XdH55##2G8c4XG7S5PADT6Lh^?a8k."I&AX6NX0mVIiO63sVd)S! +[kMhS>iI)FsYk]Am\E-Bmnl]AB2e<"'oq1J;I>H+IY6pZ0tW +[A[?*XZ1+FSe53)=mt;r(7+%@BLb]AWpK.QqaAu?upl9c\Ae,%H^BjEM9`4^`L`-4i7&.RYJF +l&bmO4Dp29cVU/`*Rb3;^>Q +q%G9NoER#ZI#Y3Cua(QAGnHb+'l5qbZM?ZDbnJs/9d_g@(d8Om"@'>C.h3W4\@HhHj460>Em +gatpke:1TE8gdImKWYbH5_1s>4[39rQNuBn`Cf/nksPnV\uAg]A7*QN*p!<+&e;VI?g4u0Q.! +K=*$2bAof#sH%kTFY;GJGM64EZn9p5<-:kH`S/bjoO=dBNcjpG-&S=K$SXUsYc9Korq;LHX,oE +\cbGA*gFL,g-lucZM>H9uaj<_RAi/C[?Xn(@#BYjsF6;IXBr##IAm]AB(c1-q!L"=WYW/RbK- +W%h42UBmW3M(0Z0^Jp-2sd9n/(YFm^%C_/7Rr^oIdK6t3jcibifLVAq90bCIaOWr? +?;nAYcH^s'0MPuFU3[D,*eK,]ASk8[R\MdH*aU;/'?5tfo3 +ZVg9T!,"W9,O7\60mX_mEKJUX]AFMdM./i75QOQ`<-,=-em0MW@Hd[`%KnGdF20EHK*RPXl-n +P6Im^'Dl'VontX+$bdGBtO\YdAoo7qO]Ah4%[t7\Q=%OTaXk>9Cl!:%^0Nl+^[-X"\RP +#?,V>aNYqMgF'2An>j!APAC56@/mE<=h_cE0rMSn:ZR6=6^OUsPhC]A,1CW@9/]ARP6;?dj$V+*#d4l?Sn\i:*6Rh&+%+AEZ-FO]A;MU=HZ +aHrXY8L*8,*H;ro#&lZrh(md&9GJRX&?^\>BcuP!N97`n71o4kmXT8cp`Rp*ME,-^#RhF!fl +d9C1Usm)G?ndskPC[=KMC"ammJ@jSm4u;`q^r2+ba!k`Qs:Gr%4hB0Z'I!t"FrZ6-i1aRflq +Y'p'+Z=7dWU1$8D=#DI-1@pjW&u*Z?IG<+O1Vmq31oa3Dj'mTO1Nl`An5=I&paS'_YaEa5mm +OeRK>IsuCRJs.]A(>_1sTaiflgH^:T5I(S^mE=%1_pgFC5*[<`hTZu&;aOu'eo?5MP[QOVU9j +Mn"Lp\V$79kShB1?aDreUWN<"]A:j$g5\2f68_jJ;ip@U?pP#P%gYJ&PU@3M,c@UB +NBVTh`jG*\#]Amk`@4O"0iOdddb'(&5%:R4m(#H")eTXD:7ch2m*q"-]AaVW@UG-SErrk.OG"i ++tL)L@>RJWhPZ;ebKl=!7`1g*&4sf[gT(\ij;.$67F[sOMoB14a*b@9$:p.%.24L_)ecK)\[V7$/iVUUV +,Mg.t*HHd]A\G9A8uQnLG'pruN3o]A<@Rr7nZuV&_t(=gk!`]A`bkuJ5$0=k,?K;Sbf^SPn7gSn +r@kUm_+qbfFe020hsCtq3@_^I6]A_ja;lh-!0/K$dd0=WU5C/Hi@mH6Sat%fM;ad^ddQ4",93 +ZfV;2ncPmeU)B8P-JR&(\2mB&))_s.9e]AL!/K*]A):.qEsDT&L8hH+$HBpQ#SZ^I+qY&5&Qe" +*XGOi$-rdBKS9#VoY:,'EZn-8gHI4geK_D]AnlO +':`(cc[D^u*?_hnW5W@-d]A/6P(n:F(if@iEOE+H@CTlnP&p`A1b).[KVa6Q3?D'8\9tQW +MnMEc1Ara@E'W_AFIK/nPVqlI"7J7-ZNB(!92'R0Kl**^2j`77`rcn@h7lA:=>Q)f'\$>^H+@LO]A]A$HoN9?q+PTK[ +!oH=X84&[HJ%rq:lXCbPZ\UXU%sE2+eS`03'\c-tq/#lfC2WZcH8d[GBpCk\6\&`q(^AJ3kpn_QeSs2Q0XXl +k#RKfTmeD.WQM)W`JGp4!LY+S\tLQ>$Nf+KHP6=.SW/l$7!P'Z0)/Yl]Ahle9-qjE`]AFS%O[*57uKGZ">%FB!\leV$I5/us +bnqW@G4:Nc/TY+h'BrG/%N?#leUd=B;TkR;Ib&u$'h8^Xo<36YLIAs#&bu\Dp&/OX,XO>_^- +F=WhSh`XHi0iF0BLjrgd#ktn#KY,uUtNX32agW!2.B%AP@om3>0`agauin$M"slZSjg?JET. +9+Y[k/q".q*m18q->/f6;YW4o^Cs%@##\$]A'K/gJKW8Vep50prc*rOA%Hmn=,n#QkhqQiOK? +:[,p\/Cp#Mj7WM9_N&?i&`I!-?\&Z!)4Z]A62+aARJSCOmHBPk1fF%GT%&jQ8=CNqLgLnsAT$ +Gd-V?EWN(4)u%_Ku&U_<]A(JR>M+\JF-&f3WJ7\puR[e53:!1&PgO;;e/TaBA9WH;k((]AO7W5 +rpQgK?\M'_s?7N)jOMd^cl\k.GZ@AmKrtX`tGfdT3bN3[+RRi7jA0CD?&m_?LIXdS_"S2rIH +'T;_X>e?)iU\B3hX`e_7YHu@K-R"Te4o:"+JJj3eiGcR]AKB/p6ul,a"P-W[pNIJ(di?#Ud0Y +SA#imgc,:TeLdt/s&#f>I#_gh`^MR(ck2^Pm'-MACkX.>ua6uDsG>\TGX;i%b88Hd1`u6?_6r6cQ^q(/OWPo!f4t^D"fem^+u]AZncsmN^ +[o\sGV"#khr'Do>>5BV`8,_8hXEPtAR&Vgm$)X]AeA:1?Wq`I2T/sd=4$\u=@:Cmg^b;gTs2: +!jS)!`%'^.[[Jt$+!0:IVsFO@%efa,\IpfDXN8?ICJfXQ!YOVeq*^B[bqQE_36+]AeQ`4./:A +BOrIfH0FKl_@=k4?ZY9-F-3&g,oQi#npdPG+cNN#B:[JR;X.Arei/?HqW3e3WO$]AdXW^ib;P +l]Aa?io[lSFGP\SBN'1G;;usgDUE'b.?HVO;h]AadQe)qb#%-r5J/qT^p3*hh"Yj23;Z6P@:fF +VH5\tB&QmhmR(Z"83)FakW-Pa&\*uq:SM_R$(8iK +9r"A+@64nZ]AFdJoe7k:aRe=D^5)gX?q-FtWLmfp./L +)9d/L[,7;aplS.BW8/7jOZ2^R;-jp$R';HkTos&nQ1=D?mg@+XI5h]AOfGq9Pq3MuaN*'&eJY +P/EBOQo&U&SI;2iVY]A\)l>Cf1iU2ZI)gIrZco`g]A`7Mb7\21ucnVi''[[! +DhYY'NaFeV:a1ki9R$$$+q2N8%9=aEc0JJi0!kqbom,3m?9,KgIS\/DF:u)E-dS<57WcN'AV +`9+U<]AfCerJIn=_`E.t/6`3FQrdB4IGW4?5T'q!9$hhfj5g4SiTaQ:LPg8B8V!gR!tbht82` +QiHQkj*+^ZEN2F]A"@k9WtVPUNWcjW[B-/0t(+5>0M +LR1sTZ%ju'(Y!n]A/V6*:#P@:#[<7O.c:J$L6H8/XRMZ\ba-`$tQ/?WM[oq7$j!]ANLKK!KrTq +.mP8F48`#V%/>$(Z;3l]A&h$OCj&Bap$YGF9G&*drC#l4-;0;g2B,"(`SeCU&9rG$c=US?U<2 +i_JU/qo,T1Fu00.V>N_E]ATFB4lFpt(pi'b.eJ([WAkb$ioF,?HuJ!g'M-[.EoSW+c>oDKoqu +6"hi-KN6>K7&NAbL('Ae]AAAd<^"rI.l3f1KSS?)[0tZ)#,KZ2ULga72o!IOt>HR.S_chjupk +WsT0dXjr6W,8\pWY-0hA=m!CpdXKH4>mNNh&uDqY\Yb^Y_D:*%qV^(kMM1J8a8KLd/pAAcVP +7384RL.=db?9JUEM^O@`(;L)&(!60SOn'uchZ8Ztjphro$d:+0k7,Po):WJfq]ARN9nie%_]Af +qe:'g-ZPfAZQ`8UC72Q +Q(M4J.H3[$Y*qJ]A$E`'A&W9*SpE/(`B4524V^kXRJBZpPMIMVZ9qjE9PldY7=%[;tLCODGI= +R?r2:fq5%)^.h'SlQ8,6bhYW3gKpf/?0/_qnYXhI"Q-H/+*Pb``h-m!ZHP +'M7A+i8c0n-9a=6(%LI[Xuh6Na$DS8^U +$h^on'Ta=qr)>rl"S%Maebb5BQ7:V+'UsjQ*KRHu#U*.TA4k$t%^\&<,hD2"N\-b/[]Ahaop\I\B?94c&'qINOdBp"FnNPB^^6^=*)aNdo%8D +KL@;)'Hf%#Fe&C@%8$5"9e..4MA3o=Tg^JZZQ=B570CV!jn^K/:A$^62/r+kn1?*dCf+s]A2` +ik"Sag"SK#!ViTV>o><`T_sa1/D("#k%S1\5YR>#E;\r5n^Rp'loPj/)Y6fhfFGdpq)tX^Ui +gNW,6hIql;e);f4Kb#:`W'H*#_mIb<&.n!sQk\U#RMaI>Rqc&,3H-N,?^HWm9+R5W2$n='I9=e4;FT&]A)eW@6:I+DYG4g]Ach+b!Pjh`rT-Q1^uo0l%EUZfSZ-P.K7QK'479AHF]Ar@pfK*V))81W +*q,Y)Z1jl-4[TbP_<%k>J##4gRcjA?$*BdB%KDSm5hdY20*=:HuOGS`>[SRZp5i^S'o4$uW* +k(;TLA2^:"9h_DE\T^BKR0[g;WK+sJN2Bl04JkX]AR;rYN$K!e0%^;tlB.*d]A@q[NP(&P3'`d +Ji$,p=2-73s)_'A,OIpl=0XP&jbdO*9*6^i+p9k02u,RK$!uJ5Uu":Enk=OgggCVBq\jlOeF +5'rh>OYhu@"B(jBHqEAF*8rSH>9JlmWH/[jVcL`ffr7RnB>@PmO +^INN#__:,[nIS`&nOR(i)PSN[\4R?5;BTopA;gp-l=bR_2eNllEYghmYKi46j2ZZ?mF5BC)gKX$$H!',IXMfch9//j:q)ZraEXi\8G-t'a.bDe;LV>%C^ca(9`%$W+&D]Ak +'/\Z5:pZTi($I!al66R.*TQ9:E&$S3?0?>>FVV1gW=:O_$V?$)f,X_-[]AR&eEIlmgP1(K!UP +OaZFi"p^/([$_>eeAC$^dNo.n`['e:j@\2eG!h6HTm0#nX@=ri([0[R5m#JVY54I#6#pNHFD +oU%^lcSs0bcY;\k2j654*1Kp,2eKXU()A\1Su'SIn]Ah]Ag6CVaKqQsKLh*WBZ1f1`i`St;b?2 +"0@\0eYU)9J%D:C?Fi6-&9P3UTrKT(PojlH=82Hq4#[mfI6NQ0]A&f+]A@-dqdIVfc_Pr%*aJ- +nQ3d<4r0rZ#@1(4E4n/_mX^CfWeVWP2>8ume/U0!DV@JrquMQHQgAq]Aj_IH0"6 +1rJ%c2cPkUYPI[fHV\\FVuG:8V^?jb2hudj4-54M_-"g'eV6P3^Y'*)q]A)V\)g-Xi0h_HsWZ +c.$>5LY1;pLA:nZLtHnkWgMIg,TI@9+`#4e\e=W3.XVY\As)MJ`!@;V_.In +=$6',hL$nl',&;ST`/9MrGe:MFNrrjF!l17+LXtp2!!d*?dQ&rn8XJX('G;f<^/.4U'P.RNu +=4>iteg,cVDpg^kc//aL"/d#JgfmKtG`%GLpA63/In/`"\^>NKOW19muhDOi),ua9(1^QGe` +!a.kB/Y=`nUs)9O`XMI*/PSp3_="&rX0(gbV42c]AS0F/s_n%f*EC54lr_@=t(ADkB>?LR+Hj/nFN1V[44hD` +,I]A'`QUDQVX/g"'ltBl6jATc?5#n@/;h%2S>jYgfp=_8_W5:G4b%V.]Al0Ps0kVAXs_kc,t=; +nMh29oCLO,qK,50%+@t!U0,ma50'%$pOn*X10%V@8gN&K<.sCurh`VWU(iK,!p2(J#"76`U? +5E4*PB%#VV2"Ts+FbW/NIJO`5!#'VaDVTJ#dLU(pspKP#FIY[`WV*`qtYk)a?[3BqjY]AYWYG +emf/:Ac>uOn,E6tD$_M`B6+F\KW5Pj(Dh:CnKO6G/$.dNhC3c)C6TK'1bfZ4[_AeEbqo%o?3%=21Vp31.M>FrrTPUbp8nq<;oSLfm +EV7;ONqE#8T&DDkWp3eb`5Af9P$\*`bG@d71QZe@KH%6"_/[FIYJ[P*-DH)\4 +ab+G$h!c?ANp&"6=r^OM5^mtLW>@JNo-]AgHKK9iAuKifolR;#BJ@\RkL>,i:qrU)JUdj<3!j +_+-ATs08\]ABY]Ajl2So!T6K1T.`m%A;PXUbGX.'72?O7n48@YcH[?B72bfrI +oE&2tK(XIqBTV$W'p'*de:QBdD5-Td7Fe*Q%PRgZB2U$,5OL-th/'25RL+:FM65G#nQqt"a/ +_9!DDe0+2th96"J\VoAmYMhYi@_#a*'J@!M:Jn<[,".qnX:Nsse>`cM@S$B$dbl'G;Q\e\Z]A5#S-.CC4Ek@iE%W%%=9rqItAPCb1lT'-=c)S\Ru#>fN6.Jp$%:)iK9VtJD +_5Okan/%QH.)+JjJUA"\k+I%WohjDQr_+U?U;'le)CB_\U\IZDae[_WQ,VkR2:)i?$KZ,o)2 +-7tdOUa'bg0W[/XZ;BTru3IHAuT%WdX.;E[K6a*1$TNY8%sZ$<($Ut71,!'iB]AUk7m0Q3d:P +]Ai,mjI`#-\&B?H;M=`a9d*?Z`]A`iK#$scO?uVl=nl<,D-hi()cXXd-^c$7uCb),_S$q>T!.T +EIbp+lb_5FA7d1]Ak.2E1nd2&dVIakX7218ekY9%Vj,C''?`=V''Q_b:QAL`hPlDp[GCM4Ita.b*)s)qlRQT6$r6'.4bR501DEXPb]A.8,= +VVh%Q@5iaGX68,f_/!3e4gFa'L%77[le;ZmUfnjX!b:A-_5_H?^MF4$q>m)2RAr1)&.egaPW +*EIrkMF9S:S11/#N^^T`MraWq5D6lINoMCl]Ampr6>C=VHomM[+OXVQ_O3ID&8B=sGc0fiHbs +ueVhq!X*S]AsS\B5bc$BJrHNJok-nb_53o`0P.gP5^/qf2QFh!W>N`3@:q8soT(faj;Q^#,XU +BDlsH!>JoWuFeIiu;L6.H4=N]Aq<3FS==]A0DA +Xk#&a9mhk"Tj'7X._G,sn\Q/VsLGijk`,/b<+M_\5Vl=*$^s<`GL%lmA4fAd2dE>jOX-YM!? +QCS2R#bf1YF3BlqkKOV>M@j%Dk"W +^cN*8JUa.8q71G+3s9\gM!;[h:]A9`ZBu_md/=2]AerjGu^=K4q<%i&FcMd64(e;32("r>:oF> +'lmE0,AbBS>HW(o(L^in4noYu$OhEnOUA]Al+1]A$>)6V(.TSCM9Z=7kL>X4%ZQUE7^A$>_-p& +/".5k=,GFoP'ec,'i*8m>3jVuW\R7lcrfq5r!NK%e<^WB:`qd^1GkO!+bqdkeT*Dk&t-ai^@Xbk"D3G5%Zl6F&]A_d-9(Em8.W_+`Lq9WSgefr(u5V`b%1[j +A%u#*Q*DWP%b-V't59F[^ocr\QZp+l6gQB&*+)Wl2=YP^t&es&%g4qbH"MA]AT)l(3FT!%Q'9 +7;g,beH3>j7iYj1!U;+BTNKX"UC@iSuPWeJXA1aq&FWG4-?e;.5K!k'gf-21r^E4aK6D?0Lj +OjC,GPu11LI#&9OpC]A)L:^*Uu=*]A@D)g/hll#6"TDnfdl"YakMW`j4fs;isKqmZ#^Wh(E=i?]AC6g$2#,4cm\pIBoM5B+r;5>T.MT_Y3[:]ASfQTfV"jQ +CAE\f2s+mro0!_KoU=ST3tmg=oQ8@PC3XU(,#u1p=\B`Y<7Aq7d>7GE+=s6n5Z;O([h1]A, +2q_s.&&E#O,jjW$Q4u4dKWrsCJ1qslj7Et`Mm"(%41N.Gp[0m\"H(ebrG3r)N;L:j#l4S4)V +;:r3`'VdXJqG`44]AG00[Ns_W^H/[RPLnn^\a8B$+pF9H3tZ"+K/YcJHYNughj[iGC7&q6qu@ +ROZN^uqZ\WVmuX13a(tGBHR`h\XSk6SUj)-FQX_*M0k3-H6<4CRKK'p6NiO=ALrAn@^mMLDQ +CtTq&G1@L*3'omBYIW4U5`%GO,(s76m)0[k"'[1'R\eZWq;mLn`n22V_?cNoM!<$*!Z1@EsI +M;E]AZ-.kkN5+hLk-V?J9hu`l6\S?_4MVb-0_Vf'u$T\&PV0F(3fq69`KiW$U[+Gu;-0KAXs= +U:T]A.CZBOPlo;JeXGD\JT*cV-T&UlN^0TVJYrlA,-l")9^W?sTOaU9Nn(tpnduYTkGS;1X:O +471cNe`b`e5G"HhAWNT@/+IjWFgS73pYeN+/nf/Jb2Lo9qNBfXptQhStO9b)(j8hJ +U^FpJ-d;Y]Ai>Bt&n0e: +p?,>$'k0$mNd&3)"">r*N1UYkikQX]AIq`eZkR_H-=dNE`n\X@uA?9XK1((@t/0o7]AZ26lQ$g +]At34'.1-3'HU3BIC]A9AJI2TK2QfLH,lr;Rb_$lHd>*Bp7(Ds"k/-_sMbS!0aT>2!jj\CPk2t +"m0]A%H6C4\L1@nkDTD1:HIDZNX3_l81-oUAo:&*f?4;(#T8$]AmRt#kP!fB8+SQD*%e7V6_qm +!NctFCRi1g]AUdSI$Xs>3L>F2geDf,cX/reBC4;Xi$=8MMr=PQq?J(52&7H"H@EqfH+VC0s($ +*Q6"1XF)tS+oJel2G(B:GCe3n*nXF4R/^QOm#Ja2eFS#9>Na)3er0mDGI?K7I%A-Y!'V]A'@KbA +neA`49OOl7"'ZJin#$-IB0]AeNXso.cGc9Tg4X!KmaGUJAku%_S`en[/^itk()'31i8Nl8)lD +5?\!J$3e]A=;<3tiT^_XMf=;k)XDaEN[!O,32i.b@bn%<90Yte'FQctdsT+HWL1;b=!03oe&. +e5`I8SUi/<(fSFg4!*E8[OlTem":i]Afa-&3\0t5Pe!#&gh#J6'\olWdN4G5c5Z>uFU!t"g\r +g5X^U\p\5XRg?Oe"62#>/mG'V/[ZW3["XtTS,;Cl)XO1"d8/M>gff"64b-Y(E!`.WDhFedgH +51/_/rb^W9Z[hl=?1q29%Ak't_sd*1%IZ.`?i=q[V^!Wd_:Eb*?#/*AjN"A9^moa-VOBA*jn +j\d-@*AML%HY!X/g4)E)kV(f<2]Ab@e2[9V]A/tl\WJ1;fJ)0UKY@'ZiU3%Zr:E1Ag_\mqo;SG +/pRql^5s6h?fEI0dW2N%Yee[djX5rNp,4cs%O?S@$6cJ*CgTYW*Mn`96;s.I/1'4Q/5niaqU +`uL`niM^S?+Q,BQGY@-=8iAgPs;_Ya>2eGE,@.`hRea)\(A#G"Z@B)rHX?=A"Eq/gr( +6jX@!J=I.+"jBqno6W[Q)7\69-WnO)uoV\>5Hd+ujTnGXP>`X,Tq3D7tW;_\7C@s#ANA&TYs +\VmdebNUtc)c$.b/oLa#ajj;p7E=:VA,IZ=Ilq40_2rdeQR8dZ=-/&U0$u#F:TIZDCkgX'g< +GEFO,Te1(JiX,C+KFYf6]A)Co*?rr5*Nhg&kYS$PHqrd0\g5i)f2d<"1`a_-u/N'jfhLqZONc5ou40'@JpUo"722I2[\a+Op*'6"fC<06sJ +gS)nd(>LX4P50`WT0<8#d!p(!T$[C0">^BcMJ#?eT0F1)Ks#OuABht_^gO#$[j-\a46CEEuI +3P+kPmM&Q=HWDMfF,)=oIXl=#a.7BD-5P)Z";R**0C=^>a^rt(rjQsH7@aA:eH5m2_:gt/:2 +#!j/8\+T9EGs!gN#h;!.J=NkkD7;"Nn=*.2#QX,h+p>Bl40Q!>[KoeLo1j8p[83@EBN)]AK.g +s2,p5Hl&f.3'jhgrq4NBuaO^tbjSj`?_/3jCn&;K"$GW!*NJ>tZl2Etm]Ai/!R5I]A6C74iM +jcHe?=U]AURLi\s7O;f(j(ECs_UhIOJ>DY!$Gmgm]Ae`,&+>YKtFZIq=8MYGYmITZFbfFq(c]A@ +(A>hSIeuqKBDl>9Q;U8(eG5'1<>>11Tlonl1l[2MZES[1F)\mI^!MH4ITXd1(Sg?#%i]A9IcZ +uk3#@oi&Rb!AbNL!l?H'I$I,2dYKL)+E[B3i[mV;YW(CI"I^Nm?Ta]Ah;S*m&_^^g,Rg.AQd_Xq:<"QQNdK?0ljJNl?GZnT8,JsBN&O&a(b;:0)<$6gKGN9 +Y5W&&d('$&1=H8h-o06gMIc"`l0rtXioC3-55(C7-[Vf*#S%N"&"IiM]A/BILT3]A?Qnn)0U&d +:-r`5QMWdu/"lOB8l>QsC-`TI&<%h(eRGZ='\H5\ruZ$P;'[gr.u@'pL`_Q9?i:oF@\)t4P* +cSU1[oea2Ton4Yb!pWY5@aaA/I=r^14ZqaOkj):hBr=aL7taZ94PK]AO+8nn6djf81M-tW)d" +_"SGa)UJ;9M4,'pp]A*!NR%1C+]A2GBB.bpn#+2'3=U<$?m%T+Pk[u"?,N3:m+hF9aeL/=^Z@ +$dkG8ummHk_1M0gac^2AFSF4\,XS0']ACV>d^>_(HpE.>tR-i*W)T)8h'WEhDS!jM:+aUPoo7 +0oT0>O"j`$bt"]Af2`V-HB.E[Y\Yoc3P\Gh>QGsq7NKh7`o"@V_ae+kpG@lbE>eX_C-9TGa(! +RZ>$oKT6o:MIK"gT'_qY>a1qNDhUhQUOWRs\b"%uJ*WbkiI,R>.7'V=i#O7,.!cc0A5:]ACE* +.'"G?IFs89L*0`u#nn__]A+Xp8Tn.D/Ta6caIZMJibV)(C[/mW-2@2!M`1>,l8##JcS49FMWe +jOJHUg#'S(Z71'\B?U3*.fp>Rs +]Afc)sb2eZdej*5r)^aJWoIOW'O[9Aom4lPa7 +,-V#ZarZX+lX-YR9^uHp=Dj\f;I>e6nos.Bn2_Nla^b`B$8Db!a)A>X!e#?8gN6BsQT:#WGaZbh,01-5ANs"5JZWb&>.%?tJZ@9hAmjPHM9P#)N'&RnpZu8XcITK6Acm=>>EeVYT$SMWd?PG1Y`J$SBSRBkqqE%j;CHiH^6IM +C?%@)G@^#^jh8Top(%k*DdGkYW@?pW^#E6+4:'aaKriX(Ptj9`FR2sM)OBc7U*5ENF^4-MTU +aYt#Q87g#>ZV7n"Qd.=Fs_Ys'#q8[;qZ0>_22m(B)o1UNf8gRR^OF"Id(k$WBM]AY-,e-e=BP +lY3?_>nRHA/4Uh7I?G4gr^Un-iPEWjj,oHU%3"3UBQ8Z^o8F1o*K.*2&%1RNa[11Ku-,*uTK +jiNc_\mCQLSJEShgl^E-:\4C57@8;q@+qri*Bn'+4$0lrt)MV4-))Yj\:XjZ'rn\Q+a6=d5W +0Ub#o%"qPK24j)8&f%m=W]AA/Gckrio-cRQ//:"nNm(<9`),!L"2lgig$+?PriJ4nRB"]Attn8 +f(Hpn\_Ro`P8R)M&IL7i:tg]AN]A?3kQREa(r<4:SNoO.UP8J4cnc8,A#JaFC3Ns*TCGbVH\o, +.(*#4h(geb,A%"7f7>i!iUZj6&i"Y:jNH^`(+lCDJ/Fe1g!>8mflPrRUl%_n_P7j5Ks>\+&f +]Ag2?o]AI"?#lnSUCm\>dg(6NNt?Cd<3"rdGOWRl*^rkT2XJoqR7p>dXA_6<8,uBZQ^Co*K'2& +bWh9M7/[YCQT3;iiC:HSj?lpp4>(^%mhE+;KIoI0T$2&`nLsj6ZW/&L/G$b#GMHoIlfmnqt\ +]A=BM%OLo0SQ=n#;5t1]AJ7L]AMJ!5"1'&G5IN)F*oa!BN";<(2UoBA]ARIRsFRp]ACs(7n,GaZWI +m2`d'GQ3h,s)bpsnb4:>eR(c5",=!&91Cto;rkNcf_RKE&!Wtih*p`(cdtP[jN^nGG5C%i(+ +>\VN-Vt'V\?R:BN5-2D6*BCT:s!GDp]A7+/2\FkkF%^RY0fq&.3ZtVfL/cPMPH8SN7IL#bULc +"&sd#g-Z,(cF9R+D9BX6F#e*W^-\R%bo1lqf]A`]A8F^1qEe,2T+:`ucp4TrQ3YftZX5Z<::?7 +1"Y.P-8'GKD'3P:J6>(!mgVbl!hQKM4?9]AmN-[CCKoXD\H-aa&*#NSDR.31b\?u,^Ytf +EkZ3-<+`W1p^-Rh)T^B;oip6$hD@m.H]AdQRlCkMEa@Vo:fMQK&br/taql\?>R<"5l7GW`JA. +?ULFq_7^HT>3&Q=An%#ZD'R1+`7#IF`(Pt-<>U#YrFG<8Gb78.@'O$OnX;s$oU49L0h1Wn86'e8NdDcO@-&+j>k +%/YOYB$`mF]A)h,V&ek7f1J'I.Un?C/VC^b.Qoq%4Ls#2.#qKYUL)Eg!imVjTQ-=6(93\pcMb +@;`<'RqeKp))MH5!6>f(T7Kd(m0-uIJQTNTZ#c[20dAMBCH"r;rHf0+ArY)bN1`d%FB)rHMH +N]AcWok*U;>+XFDN6"GjiN%6j,n+B' +YCp_EHNHN`\3Fi)i6l$5ji#J$[<'r+Dd9$RECm(f.@Et=/,^qM`g(Dim[4G9WJ\&sY9,4gA, +&C<;6=/k#1V2O%@HEi3K&\2OD4e"4:N(k[WC>gD<:Q4s*_@6,:+DO!7N10/FmnUs)Y27c#Sd +dMfJWC]A_(DfK$I&L+XY942kTP:Hln__OrQ4[U6CpXUK5^c`*pldm,b&BEYNNk[QPG#bYW*-% +X^uqm$^MTCpDF]AUsaMC.c,4Qn=_F/2m)f8n&F6C2aCjV#LTYL\QG*2\"WPcVGZPXuKc!n# +Jq[*hSFC4VGT>ei?%Y]AXk1>c)T:b1j;@;kp9>BYX7*G.+:bXnE]A/[KeXHR?\3qrY_]A5\OfPe +]AhYk4-,bU<%doBJ.drPqTcT0$d+Cl+NCO3rC/cTL_ph<2fgA=o&LKS6KoU6V2B8P<8LNOOD, +ZiKC)`#H:NLHeGF39.jp(9P2?0eU#"ANBu.'j0AB60]A3WK2G"ch`2Uo+NhaPb^Cud3_+59h#6.8C$A2cVAi]APj/-3Jr6O+D_qeA>O]AqQX64r)$mP/#fqU=DW?PX\N@H8 +G$r]AA/ROQ0kIT,WYdF-sbiWB;+e5(k'HTKS^n`;R/-8MkEIO1+Y@du1R*H;7S^q)7b$`4$rVo:D^^LZsY"Qos5CYuD`O8 +7CT_%N44:\ldDbAfha-bD<+`tL[1Ql!6ol>t.Der1L#_$a'X&j)8-dHeLe4?H9/`*6o@n#*V +.q0i*B3TCfNeQ??,!ehBRg:^c#9s1< +Y)C3XdKiCBQ\.*9*Ri(+DA>[JKCGg*6Da&S0"T8tS^M%qq+K9?TMM/KKQ_UtLSa$o*c5T;Ef +NE\fl9abE?Liue+NG-`AtenWhqk9%<7EH&f4&8tA@i6$*5K?Rq(^.:*^Z0@9bBNM6 +qpE\q3[k6KX8_3DMu?Y11%MAoJoD<45;LtpH+l&gJK!(2X3"cj$0gD@XUHI0p`*4,A"17J#f +jaCjo)\3K1&$9c:gU*^11Si`k=rY+Tm'7O?'$@f[,mID]A)!`riJGP3jS^WhTB1+293-Z2<** +%ambE'`&Z@=5u=A]AElSkm1G.UI<;S`(@GiEKi`R(>mV)]Ar7&XjK93M\VooF/36%!,?XEJ\XFNF_ +DDoW7J?=uo;`QP$#LMXtFq_fm)P>bt%,h]A)2IZ&p$piL/GYbJ*]As.8nnHBI-mDJX^,Q1/#2. +d:+`U5*enF"i2>O2011na[k%LL9RE,/%g)5=T;O>^OGD`Q2du8P/>(S+rE1$s1[X3o'62UrN +noo.m'/B8WjgrlUqOVa`,@RS;RiQUWI@:nGl/jY.a-GrW?epp@5m1]Af-tBkS4Qf_F/4[C4j6 +1=B6?90:mF&_DU7NKJdJW:p=<ts[/Y%AMka4_tCYsjDrk%\C1gFMGF,8.2FO7MOMC(3tiUN]A'mpr^AQPu"F +rqQf:;mFlp_^ERj_KSXRdb@\7s$=C+.(QJ'/;06hcnYHihu3(_%U!9l,k0b=ju:?A'1[+0.5 +=T\I)eM0N"RcoXO?@o3eSX5l +##JMUFi26_$LT3BGhNVfhOnD>k_&-54C`,%HK.N.',?LO)O,O]AR!paSfnuB['WI=dT1>h4l% +f9M>j7)?rrU2XA"X7(V!4cd`U:'$%['gI!.BpJ&5!g>M^YU@]AJ!u4u9",ph/L7`0OEr+,.&( +gi7*P#e=beC]AZK/0kOIf$KDq(I^m-EQO:UrYYhs&BW5!`SF]A`b'8IWhW]A2"Zqhiao#g*DQ'< +nd0.fc8X=A4D%1eI;%5P"r/W;&o*^1@a2l:\CS,t%4oCM0cu%,bm7(\bCAWcQK79KjI_8X53 +^4eiGu%5J`W?jLf?f0.,Cb[3L6Y^-pVGpK9"Y:T&6U`CfemTVK09(LUU.Tob_%a"t]AS\3%7I +]A,,O!b_@SckLHF2+"_pFbPtc5`c4uc?'QFa^]A??gE>BRceG;pJDUD>#Y59:;>#JBaI#M(X.Z +LS/0IUcYWefd@4gX?hXr-`n80@+o[!?UNHd-rPnfa+$2)Jg.;bVCkJ0?dW%$T,A8Ydji8dp1 +XOG>4dMP/"7fAe9FSj&H]Aq>i]A>-pX2gVa[!kW)ChBS"+fVRL`Mp^ap9JX0E#U5I%/FZ+Y*eO +9>/]A*g`tcMY^'bK:s(`5`QmV8jJON\G^f02H>`CLH7s'DjZ3jmnW9^'i;BZ[a[,;MU:;?peAX! +(R6t+/0Q'7r3ppsp\A3pW-[JJA??9T>@8usi,'QIAi'2c\E0tW*Z9u_4*FTdhHCS''W7Elae +$r^[KsdZ49X:gN54'&YDV>Y7f.R?]A]Ah6ohK.2-q'mS#/G,s.In:--)i7.6>&iNre9dR9)M^H +eid8W3iccU;KZpBt`)9uhT%Q6>APVd/,_m:H$6+#por!Y6\]AYCZnQ[/eM%C+eOOeqA^]AT\.9 +NL>LWP-Fk)YoB+n7\&bu%i[GG]A^E+c6]Au)!MS63=-j@m8>(,p6HChK?[,GesM;=_110k2$*#9e2- +3KIQTGtgAflI#=1e!@2G:3F:dt9\/0SQp,]AL^c]ArAYgEi\PJq#/g4gomd.pst% +13`TPs/:$pS;;\K<&VjJe7-l,8=fRFa.lVd"AmT\'\+mD[48MY@l$&U&%8P]ABT!@J3D761jQX1]A8*di?Rc! +GKYddl5]Aki\p>N7=#:[1<[^[.V<<8tUa0>>%-j)1f"q7f@'WSNC)5!3Ue4G(HaflSaDLCiid +4i(NS"tm>NK:WH\"qYece\?Qf%aSZ@iZ1onHCC?MW6s/#7("_D$+W4bjB0mP=heH!r&%Asl< +'noRo+DR2'U->3:6Hsc%^@pDsFQ7^rq'ij%"c?O`8WO0UhS$K-?K=:&sBp`GH +I)Vh#+V3*m87'Y6u^?`#&"_3\(H8W?/T;G,Jc,7)uWj^GDS__rGomU9MeQauVb(7Qt7 +e7#U@pe5XV=jY&Y^,Ycc8=1?&4&;h7]AT)-IQFSU:;iMqO(pc8>*U3/n1gHc/m\>;X]A5#WVX` +]A+\MF8u7VqA.^PPhae\M*'llA%ZJqapquPE,&p#JYXVg6f]AdLu\+PCcOq5F[@ccVb`Z`U%dI +91VEH16iAZnF*`HGXj^+SD5@o0?CG2aA*U&K[h9CA!uN`,\VA$KRAU)n/Xr3EOUIg +2hJKiK2A">JE3fW9J,_,F +@;6C#a12_a[@eQ!T$Go]AC>cJM2&e:* +o^?=9QWtV]ABkAJObPKeE2lG@3!bYm!-^on\mO;qbF1g1Vapih[2[Y55Ve8Wp#'V+3\K[)0!VFWGJYodB8gr +.tZ@nJ+EPaPebB]AUE7uhrbO=(W4N\,D +0UbqD5)J<`2bT3`Vkt0E\<:(27h"KA4uVrb->^hZ-?OfL3jpeY[/+9"a/]Arp/)k72jJS\)Fi**P!H[Zq3YOTf+&?&8_5Y: +&1V)gU@GV;D?p,gDu!@6(]AC]A"OlF7F)^e,Ub??sQ/;*W>bJbRqD'j2#92'UK:. +i<`>;M9u2eP]A]A1HZ#CkW*jqbhYMP.-B\*T8>X&2bGGL5j.)Cj@X%r9W"s?_>h,?EH&=$%k>( +0r('!5l7j8lUM/Ym?5kT_4FC:+M./bbcfXB6hToPFJ\RaC0[bg@oGENi)^+?t#fgHEajG/n_ +R"q#C2pK%N(W5Dt_mW_F%dLG;_@k'33FAp"&23IZA"G`b,c8&;[nJ"$TDsnd486I<8->B0^. +m71mEGo9a>M'!JeM)%4Tpd`W'hZQ>buG#O?\)2Zeb)\.^c)9FhZ,]An!]A>amXgb(QmeBAjlYp +Pm=5. +ZrhCA*d&NX$;8Y#p#0BH:kN,3shN65k3Wu>u0`\q!*lI:kajpm'BZEA$]AJia +[*a?P5,8h`qM2LVP8$bt+d5Wuk7p.3&.Y90ga5f'#MEIY@inpsLC.4m,2;a8=c#J9T'RIfih +`?pC0XoqQX+h4(;71S4cr$WsIr'#;b=@ruk/^3)7"+qk$'E,6_4CjCh9:7'fSrfmI)>19X\' +(f>?A6j]AhBE>`3;\E7\mH(pSdbR?m"M"M/jm_9SAan$`WX[PK@406T,D/-_\M'aRB"t[FBD- +O2#dlJOe5c@Fq'Y$o->uWY=K*)sa)Uf6%M!Dg\<"s-_+Slp+&I@Wr-:4nFIgJ%S.C\T4Whe]A +]A`G-FZ@tnLZaobP+2YaUI8;mukH`CG]A^Ab[_D#bR^saLcc<60-+6"8f72VD%/-8%dUn0]AO*9 +C)EeQ=]AIn"P$I^4+d5=+8'uD/"4Em$/SDDW"DClQ# +,Y8;PeKaDHWjWtl5AUiZ-%fQ/ah2sUnsS1,m:qWVl&0\N([DPQK7=WkDLl^_GcW]A97-4lJg2 +NOCQs]ANr*1[9US+kR3$L\U#aU_X`nXQK[VH6cN#p8a`VtRRj,fC3,J*hPP(?&qb-s>Nak3?Rmul.*+qk=qPbA9Hq'mV[`>7T_f#JA3h;4?5Q1;&nQ- +L^e*aB4T/452-69QYa7&Wo,_+G!RXDOh8"h=189Lp_Ac$r#X>tgratl3WN$0@q)rIcgbecX+ +ZHt(Dou31'mXdLC7FSjQFJ,=q%@IPe"]AFN%P?V/T>E*K&`JA6M)DlE(DYDTDQpZ.O1]AVR"Y.g?`kAOc2_:EtEXme,?Y._Ad'#316aa45p)g25kWQgOOEW'id"5\ +6(#p(XJ^"5c!2P6/2KZVK(eAZ7(5eY7GmA#.(lb7K&F`@[f-09!ae$:T2I:-^W*@X>DXWNk% +hIh,l[;6t]A0E$%:dm"p.,fE*O`qCbMomo3t1H*FpcGWr+grHso.^DeDTQqoSe6nn&$^KMr!7 +A_7uu+&Yg-93:UB2K*i*f]AsUSmr0A`3@au24BWQ,gtfPum_lI/>Sk["m,]AaKU"c=7n/*q+0T +ks1F,u"=VSZrPXZ`0tLQs5Cp&c%cY@8mPbq9a`0D6b""Pj22iUh7:+ql8]Ad\8Vk)B1p6OD)P)t#au:Y7T +C-0*/1_dI472)!iM,lX[U:@F>>26GA"0IF]AN_1G<0W0!Y"mb!OEE0g\2-9+'9Ch]AG.BOETHG +$GMZK\&33;aZn$SG<&pS?9ZaadVWr2c_fZsDY&RamgXBlrH?.qf[Y`pdFj+ij0Crqiflo\+=G%?,,bunV3LLE@6'E3OmM0Dcfm\E`-g_o*WF#h\J+W +,`;ad-@b?G2_!S[pHX^5,3<2AW';YpM08;2E?+:[:o1G'Jc/=2Ju;#_f-I$Q[R_NmJ@C,8[lOi`Nr.*MI!; +B>D::j-8+D8ED9FA*%Mc>u?IuYV&/kZi%#G]AcfKs$cH?K-@kr'kTO_*?Gl=&IPO^H+P.[U6O +4]A'%T6_NJ(YK'_WBT,)q=qm]A[[q73.A'hK<&H8QU[4#si.aQ]A2A +Z(5XR41n,(qo#Zn3la\0j)#+NEbc!.P6F:Ed@I!:aMYZDb)!)D +n3lu,fBM_(d&)6bOa8Nd%B`)AhVE;7$PRhM8E;t?RK[_F:77FBj-d/!JkE&Z=(@abY",_=QE +I(-`O?M4/t2osDKo.)Xp39RooR=O_]AGM0sSE:]A!fD$>-j.H$bFngl2L@kToq86/#=a:,!Y0- +uq]A61&le7!`9Q6VJ/GE+W9a`M)uM\"IN>]At74)]A)7L[`rT?4A-dNVZ"9%2%B/3)kG=.d9EE+ +Rl&`utC&09,MCN1SdI<[:l4hA@>Xi>(HtHg,#KtBr`*KNdrjpMkBUcXaPhK&A$r^sC36En@Q +FU!;:BQ^5LF"pgNL[`HQ0SSQ=[,"+iN-U]AF]A.m_Acnmi[JG#]A7i*lg_\5s9+r,jKWhs6X:iT +Q(QVLTQg/;[#8bG`Sfakqiu\cD73/A& +Z!7ZqkHJf4q8C@f?C%*^#\>^0NH:B[G/cDX)0uMb0>)[j_1]As^n]A#t +ltafGT9T-#Yk9-!4["Di$t<8$P6hm>sC_gh<'hb\LP:EPI#<1QdAdkn0iqS8aCkX8rjn"O]A\ +Y$Pt.\_^3F`KY2nm2RIDgN2<)7N\qV7(jG"e/%2Cg8&"%lUZ6a[TDc_$qKn$b5*sn,0=t?a$ +TR%.%Qgk?p#=BnSCEHYQZbmqPZ]AmlG&*I25WdIY)Z]AA2,>qrSR(ct8#WZCI//l4'D67=kE?qGMuR=$m(KHSW5S!8BM8H1-PE'nm/piae)t8fusf) +IS!"9K,Xd4LZ+t`O)ViO'oUfETQpHeLBTYZ.GLP*V!oV:%GT-cod%1@W3C9-Y(Y%ii'I:e;! +pDarOB53iO@&M&!iKDY\jE*2qc%FWP::?LB*u:f*dHn\oq>,E1[$lbje("/i]AZT,X4qK+'NA +X6u*AVaUiZ +bPNc]A:O-S53e;s6-2!Wp]A+eC.A]ActZ$EBE;NKD@o?dmgnZ>3g(a@?=+[M+i.V\kp@QM*WIEo +&c!B1+Q(sjK.J]A(;& +n?YrFgl_IM?2*pB[TMi)cM![1s#9O&&1U^jQGRa(G39Y-D+HRENMDP+jTaYG +e*l^0@=72kqsKlN_LDmB[HU52]AptA(50Z\^gX0B$)K%@6%3^Z\[U=HFp1edq)BICIU9p=UEI +u<]AiK*>\r3ltifOR7YgsoD'Xes*A*]A:A_CeVfNP4<>H`S#2:I!$p2=8(+]AaLrb`?fke)\;1n +]Af^9R15%?((1Z_(J9cJ8sa\ +hll^"B8Tr[^(J31FQ[lGof=db59i2FCmi):D\fNgc(.mX6b70JI>DD9E9+6jY9NP>?nW<,?g +(;5E&85@/#AqLfL9H4q*i-cF80]A_@\Yq2fqC:hXCXoYYuLW7QXg^km2&dH`%'W_fu0"(bR*E +8PR"6[C\(R#aYlJ\B8,=-TAr_Qk0%psd +KLGm^\hTjAF?ql/$0iEoB<`a_/96b>V;D7eg(p9\e24S:]A%8cuTtg_Mne-T($3HC:1N04-D= +YB5_eN)LE1U1CHfb4;V.DuIC[0:]AW(s!b'%[%WG$4b69L8O_95XgEa]AjlqrK+%nb^W'F9*0P +01dGE`afJ6>/F$f3kEp,p+_s\$3Qi$R&K +eAL*W%ZE?]A6]A<:_iQen#$.#9O1!t`e>(sj9sab)jgcM+$HMs[-M?K`/OkEhX]A4o7)j!0Bd#X +L185M<$ijYKitD3qKe'lZCkpTY6/lZf1#<=g5*)k8]A^Z$Qu+h>5ZEqY`N9!`YDL +0cJ![PY`b8XE*n_k9Fi3StBHiT.211DJ49M1CVt>"nd531+=pn\*VegA!08`*"Kdr`?&-(Qu +dGO:06irD]A8H#R1RK6>mNW$D1K3#Ik:WD"XUegj'pT/e:0dNd>s*UQhq'V8T%CU>dD$oY_:) +k!3mDlFr^#s4M9sEM\(f't_3qdW3%7B9nc4jmq./fJU(s@6OL+8DQF(5qf/g=rBnr\)4kk&5 +]AL]AeP[&K&gJ9;3IAFk%h7A,C'1!_VjER([(bA=R;QYs%qgD'>kfms5B$&DBc.CD5J2IBr9#" +*2iU2C2.6DH,M+3;U#uBB&T:Vf\kIKff6[b^f2i*b#3#%5!cO07d]AY>5$%quFpS_]A<69q!*9 +)qYoOi\JD"Xs'!(8W7/6Ge4,)HHfOhBR`&):1K[q&LZ>1cXZ'dLk7'+#kF/S1&T.1MmYr4G* +$MMEI-<-)R&L`+$)b-eL[>gbXG!mS_DS7O?\%[HB\:,Hs$X:*I9\S9YArNs+XchOJIodclj83.^AZT\p5?VMNi0a#30]AR*NKpZXB3 +l+;gA_8cM#;-.e7AEG>5Z/eYIG;/(7AN+88P"jO`cVSflc8WOEs16ih(pZ0HgCioW*<;92!+ +'Wd7@WXgN+1W=u]A6A);82hHr#Ue[f7+,pG^n7Uim+g0cU^?#PW"gYcF?&:-lB= +>t8iUTlNC;T6bSp?X/"@Sq$'6V9n]A-8"=XU+N7Go.8@r=?bUOWBSEV).g77qVs:ZBCZ*8jB` +*'+D&M?:Du#&p>.L-qc=50>mt6PfC<*q;-=>-Kn$V_EZTN18nB`sfC56$=uK'p%]Ao3S;g$O[ +04F@E`'sk^iop)tj\.@%,#b35f&$0c.-<*LuW]Aep0?8qRh9YI&\q5@fB>EL/<[(ZfiB>\e\Q0Y!hKfNap7!a +GA`uuD#,jqQa'd*2QU#sCHmjSpcjoDfS,/O!WCV82?&Ut#%Wl`=0CuRK2(+%o#$N*'#9(0#& +]A[jtQ3*I7gpgS?Fj\cKF?Q8DeE2Xb*!E0oS3t7s+><&RH-V*Xi^.e@ogpKoC<+-:qLTA@I7r +IYn]AE1)mXK?oR#=fl*_gdK'H0&/gt>+3&-"=XWc.(hh01M311@R9Fh4[ASD=O70T[:"38sD0 +s+@W@q%IE6mL(mSYD##sfu!+geVb8F;Wm\'g8&8fLq=n5d)BZmagU#YZ>%n#)c`/b!CerQ*$.]AU*[S";f +[WnXpDeK?QX9C6X=d.D:5>`G@]AaNfV3iXB9;NPJE]A!3sk3:[&(u'gH,[).CjprgLMc1T=)fK +8>">^(DG]A$.d:hlFU)!pIT4>p0HkoS%k/2NbhWo`p9Jn\s +.K1?/_M%Jq6-2lij>;8^tW%E]A,:_BTd/00QUEVXQY=Jh_+\^:9M2@Jgdpe$r[W9=b48$$%QK +7t)i:e`-\Q@'OuQE5U1sZ0p`C```!2;2jM1:9XCJZ0A9g?,T?^+>$,=a75Y0ImossIkRb0M2 +)g\\V6=^J>:LZDh*2UmS2Zk0;R7E./>D_:[3S;'U?u7]AnI-SP[3,MO)):XNmi@1,KV/P+s%+ +1J4;5%;'jD$TeEk!72V+sRP2/!LbYM/^HH^4L&Y7^re.[#hB)&hPZsR^l.=R7bsi#FR:5alL +G;PnEe*e/]An>H#ftQ[Hqan'lZa/Z"*$@ts'tD6(g-[s*/%2&A2JB]AdU\t;dOgTH5&^pukE`J +H!`cB1pBn=;ik:mO'fd+5')^gud7P&%fjI-0CMMNg/Ej**Ef[bLAomPlC"jedq"=ar">=1;OaUN7LU&(A +-j3PR73A2`PfPR]AGr7D^;/\G\.5qP^fk`1%H@rpWh`5p2:sX<=[5Z0%RZIb$B^E".?EPU"tCPObJ;)PRN,\Z)Ieo@Nd5gr1t\OF"k74S=2KjI%// +nE2`#0ifjC1h90,rM4",4qr!`%s]AI?U\Ca-aYE%Zr`OQaD>fe]A(E7ghU5LTgE8SV@.mIHBoX +rh`jdLo<#&B$4AtH-_X@k=O/qd*6?RVB$;V\8HDnNK=1ZI$4=:'@*"Zi,e+ImQ_!>aS7QeiK +oAB?[. +1mQ2>7RYKlbk=c6MU45T>u +QhHJ/$?k!=C@ri9.HoKHg;E2KN)o#U<9,\X1eA#53.&+;/X4_/<_;+G\niCjP;aN'i*CiGuh +"L,6NfYeBh*:9T;U^\>U*Ef7+N=p0^i'8&o=otU.-K<+0[CiA#_8>ij\:\5hbo/&`6jDo$ahM7`JSk#qp8o>2T`mGK8)->sKDB\T,&ITkcrAlrR1;kEm&o?@>sDkn\$sL +A5L?$%]A\LEO37-9I+I;fg4272`LLhR'JK5_DJXp4OLM_4:RXaBRIB%s4C3[-`;e&FU@>24EJ.r% +dJEAoA*Eq`f8S--r@o-8qEbrJBMKkU2bObr;[Kt'&sH2?if=!S=24O`k"4j$;$BV(%?Mtc(/ +:dl*RqDje9RXEe#R<$:E-X+BaDoF%0+oB>nE=AqV&a7:0.IM%@:sbg#iN1*jOi-Y*(Oq44Y! +5B!;Ye5+Z[V,(aA8S_H/.<#!V6ThJe%7d)$-?S@_)U@j>,JFYXn)rh&9EjT;5bKo^+XHg@O" +='b7)sGL?.ScP/S^Sc5n>_H_RgiV&;M\I^:cVVmX1WO'.N'Hu)"ma"0M.6s)OP$NiS?B]AC;B +uX5kmd=rB#!LU&69RtqKLH:s+"?!X)_SL?C\T!(KsFY!n.B"@#k7'tAVgrVb9;7E`%U:*kcG +>#&=#-=EU"od\/Wtm^m/CHcZRR%8#$$"Zt#W$;=75CcFU6#Gg:[0Th]A24o'7L0i]Ag[B7Ci7? +KLLX]Aja=3D21,ZC5#2Kb`To>pS+t?Z`'F\3GP]AM'JVhBd6+$;K"R/-`P&L1;_tr[#@*V0-pG +[G>)KO=<(oe+U7ChN!EkRM#N+ADac::G`C7plg!u&Sf`]A5t6>R/lHl_&%MS;i\K4>RXB'dQ) +"f=&D!!PW8UZ'"PYpUbjJE]A+RN!L3^uK?QCgNo[Q%"M;WCdtYB@W5+Uu*u`dJJAaj1obp/Zc +.4ufr*kPR'Y?j)Q]AR^p.h8O!(FYS2knh5PMq-,`qtIhcG#;sefpJTGaR>3q;Z5M^>3&/Y(-` +h7[cZh=rs+16Il/@VV#2<)=!#]A[s2 +SCiPfc]AgEXm/W3si/PB-Wh>(d\XP+/'rmO]AgaWfE`($Xs(a=3DtmJc^af'3e$\t@uieHa7e0 +KrI2JQYNPNUI_T3mp6G4Jl#Xcbc^JP6GNMm?MV^;VrYg4LfU68LBSaFL"FA7&Nu5#q7BdJ:)\mkebjg/a!drjq:ITk'U_]AOVh29.UQ!f3*MR(MT>' +1).6#lPq&YsV_n:lT]A%@#4RQ(I-r64%%CmXhm&2oo(pq=*cOSVf:a4kMMHQd5Ao-X>-:k*r4 +6(:Z!\49_>Q$uEF]A4P7$\*IE7uj=WqS`%^2`uqfDFYG^1.,)g%P(X?#0s(V[!2id("J\XKjBMX#2\ +i&Z^LTd.Fca,;d*[%]Ad^>p2jCiN',*jL6Iu\\E#=3^#/hfu%lPdN&!5>n>&]A)3%tjN>lkiM#8kJ*fmPFlDi4]ATOU5cQ15NoNMmK73a3J,t;( +Jk/XMH2S4)*T&"d%iXimjWTm9YN8UNkpKmlkge=CH3Ndf#:*TA5h.SUY-ri>6%tr"+*+!Pb8 +&W;\&Q+SX`W9]AZ/^>7fN'2[k5WTF!/pjpr,saPkU?pf'c2J$!fg#m]AK)`V.c3QDa`F&k.=\\ +G9(!?c1Z_A>+-9Ku$"--Qa'aYeFk;+@kj@b3]Ab)c#=XXu[*,9?!&.WBe!/KS+pF@@0:e]ALMZG6)Aj]An\OMn*5ml6j&qq%A8O@GP$d0g^I:sFB>l"hU$L +NM_+]AZ;D_M'GY1o-d9j/&9l^5E.@OP7`lZOpNI8!E$i'VC.%8u)`S/[29"@g(uT=4$TZ&3tb +T"jr02o,1_^[]A,U-;ju3;1qL&D9YbenWI`gFWTK:-@FNg9!q1_m8,som"%5]A1S*KJ?);Jt?s +T8Xk:^`-b1-mc:I.>A"8m1c*W78-;)EFJgmNFP902%O\&m2`;R^'%Y1/X$aUAaS5)ln'+a1CRIHuKc$0N;PHBTr0Z(H +]AO9J,N>eL3RME=Bt!BTK)=f%W>k-]AIrI#C8Q\[(Y=rrJI#Q-kOGlSNrBkG4\m,[P4[g>#\]Ab +72C1Alg6>%g3$rgC4h1T`lh_iY[QMQ;[ucV1USD[rBsH,g!P:-A7V)A2b6T[kRkkEBi]Ao#rr;Y\pF[3rc=ILbLNU!u(>rE!IQq;,U9_D$j]AOOt!<\6Ue/=-@_H +VQhEoI8Tj5g,o!Hl]AcKHX]AmF"kY@q0O==.X!%0Fcsu#N,8(d(?$L;#r^QDdifY.p8DAl(B'G +*kMRE2sk+=Qn2l"V8pQT/&EY;btkFVM*C*n'MV0`Vr$,'Wq`<^<:K1jCaKM7E\00^,cPjKn! +]AGecV;V@6`F^AZ9P7=5PG'9L.B$puZ+]A9sBe&u+a'&D=RRKc/'mAn.adrY)]AZPZZJ@ZZRH<( +Z]At\bk:PpGk_GQ!80E`F'E)(>,l1TL5ChO694,l`dt;dP$Zp+fQn/E=Mu/n`>YqGM\i9rJk< +MRP2jK/]AZsaSjFF\KZ6"kM\1OqEqNA6V=Ih(=Ef!SBfc]AG,gk\!Y$b9("_,^'!q4+J]A#\'jS,KrkJ6B3%']AnF(,Zjo.rU1s$'o\m3 +f-ANnH:NG:9E-8`!jf"OTVhrNk(0g:cbTojDWi:a/'-[:B96Tt(Mq7)T,D+R.RKe&XrE&Q^- +EL.*33D[bp>1dJ(K*BA$>H8SA>ei*+YnCX[62NLQCMo&'QVqdn;MS:MGA2g6rVC'8'olDoL5L\+a0[iB^U$Cm95.cM%;0D:fo;0Y+2i6Q94KE'+\B/J^TD%6PFQY=0%gs2R +tXuLZ]AQ`hN'RG?UM7.'&ZUSbmn4Po*(&9%D$*aGSfdROBfm\bD?OpR4[N$b%$6#`8S[VGZ+: +c0G*'R@NDPMH,Nou;TK>*El"*0>/eJ^HXWXCXba1TS"@;:Yc2`sU=a(Sa=D%Sfe7pUId\m.EI=AlF4S@6Rr\KACiAiN2MgRnM[nW>nub!ul`cmCEI +W"=2h1)9AN%&%0Pam]Au@@@YIGjK!1RH>=sTbljnCZDOM[$W'IW;EN2;oDZmp.?!3Xj+lVdDt +s:[Utq)q8):3%`:6C2UmrZif+c&@7IZ)i7pAe+:`;SO*Qm%YI?$mq:,Z0'2s;frO>UF4]AJ>g +dr>LggqS0?t6O]A"$pp/Jt!Td%GBZ79YZ=ptKnB!?0KL>npprU*E"A9Uj!.^<`TM0:(!#!Ar_5U!(3pW^MAd?=GaM+jGG3g;2p#sGSiccE\#0Sl?7,EA& +ie%mYlRYiD^H=%14\f`,Tu;q)IS+fm#RPGL]ANSroD>?]AIe$,W3l1\Rj,]A1W1S`LqtT14iC&G]A2tt_DekT'"LG3taH+=_gcQZT:R^Q\b +JW5JOhc]A:%qe]A4,o$eD +)L-c[70u=eY666#c,VBS\"Ce&kdJpjW,$d7Zp_ZJjOMe6PbH?TcLqGim^B3QS:1dcG +"C!5buY8*UKQ^3BV34mp`">/d#cT`ute5,"JfgQrBHFpNM[rKZs@Vd=\l5M_PX%?luA7^&K$ +XH5hgI[Eb`3MHD[TEf7ET3M9Nm*$-B<"`&XpP+-lE!6C=6BYR_]ANM?,-u*ae5 +Q/rqVDa^!':=*^AnK?,&R$@D"cip'[`H$j\1`M;_=e%"k)SOn$bb)hq\%00DX,YncI6Q/2Z= +spU1ZB<"/JXCQ*VV@'H4UZ#`M";=rPL=b-f*]A&Q*8&Gm-3MP`HTb3;7G.\D/K5a:P+#\o7&t +El''jP@R!#i8peMK2.VR0L1_io#Oe +&%U<&NIC<1cM9iPd]ABr-uCA3T@XW!&?/[9GEO`8t%T\W@:a60c@P'!Y2Hmuj#n\k)p=QmrU#g$,%@6' +AWZ;V1Vt?cb_r#4.lI#SM4I=Qu8OUhqmiG11S$/^#5PoFf4uI%/H9]AZYqYg(L/;5nbPrU5(B9?VjL8.@XcmYSg4jq(_u&,G, +FDa^:HjQY@D6Jf,l!9J.Q'p(@H<;sGNe.6WhP,MKD-/IXd[7`5^h3gl\c?)3tBkrM(>*O;^H&ms0 +ZY`)2F;+*JU"e52K!VL.$s>NA7*k.eV(^oF)j@$?_VAc=LJ0Mfho7d-`R;Oi1uRF(KFkZOEK +Fi>]AST0:UH@qgXq,F`8!a5oIga8E\RQ_hVb +O3LiWhnPp!o>hb`;OKGW6a`F$Sqp<=mEYk/?d-Ia?)tQXS#5f +T]Atar+.F6L<,on4^6l.\-RKu:P;<)5]AU.,VLn*^F>TE'NdtnVkGfDP/&jZmMD!&R-iZ!B0oR'O9)DCQD8p3+7+pn;)SAh%r +Z@(cDmZ=?Z.NYmna32g,h+>Xn;0Z52es>pF9U>!"OF=R\Q"]AaKKb>hVj/7]AEu$<*[m@_VfD( +E-2%(^3n">5^Lpi,Z_UC`4_n]Aopj11G&HVlahU$bAFGu)D#gpqJU>L;l&X$qAg&Kl(?$_ic1 +)"EKW;__Jg:k@8qU^pW_3[)_qIr6_GG6_HKld^U#=M5K<<'E:"0U,('qo%fq?k#60>l67d06 +-CVr)L9q^)X%ZcU)6e_WCRV2X+@Bn3I?=?q27kpV2Rn?N*CY-#JhD]ASPK_%3o-g'()'#!@#7 +3?eJ)d+iQt`*N>A:p=s7_F2pONN5+c3JT)g4;7:uX_sAc6O%%qs*Tl72j6iFu,$crAuXF;LM +['V1IFDRdXsUsrYek[7"1R4)BT(4kI]AR'98tg;*C(Wlks0hOlJnO%VG%"iV_j,]A?;XICWjtB +WT&@7*A;[`fVt%&73g/0YY(!iJ'pG>;3!s-#1uKq*A)RSV.*8N=l;J1LAEFr'u'-X",(mUK; +Ee:mP\%a+2[fI!YG]A[I-dJ`R'6^bgeuR22-ae]A*kQ]A:@^<^>YAX`B3u*+P^!r$s5"kQDPM7)u^_m8/tg +N]A$R3l=HCLfdR5]A3$6[lUOs$7XakG/UN/j[!.'rRqGhnkTJF5sn?okG21#hSuUG04=A'p +3RM^r$Ypdm1qJ*CCQu1]AeAP^\(plr+qb\\Pp2@Q(:`uAQRm'+&@Kh)07CjVI) +@9Lg*&@rU633]A0EC/:7aDAOXKbe3UcT_[LcnnI8YLf7NUbEXHIp/BJpo62j46T/!6[tRQmF8 +ER]A]A+YC1YKN&,iIU2YU;7X^\!gbbs"QKIT&m#0J$k*/8io/q(V$V7?(;>kb#P$^ba%glti!-5oTS7fr21u;`+qFV:0]A3sR"T,;\&+LH/)VNJ;#r\49H3C5%e:-RMKI +3Cr;9$iV?K(tDu%GM$_+lHN!rN+;N<5ogr,8S+tB'7&5!pT=8P#TL^!eU%CntQ#XJ;7`G<[< +;]A.$qKh$`aMoSFpNO68FQjQR'i3aaF5'Xh3/90T]AL6s"(Gk_RsNHXP]A@S'>>8$(>&CR%bGQ0 +3fMR+o(3@+'^D?$G;[[gS&9,sAZ,f@e,ssa?WuXZXa&-H'Oo3&4D6tbSo&19+.OP_dD+)C&` +soJ'tF3gqdr/QQfJL*0\3G$b_u8I4Er^,cQpg)DFIrJ=moST>ZYN6aC@M+bB:h4rV>mI'Qh3 +QjJCS2*S)``8ggTQo[odsH>Xd7k<]AD\\qS&dA0.O-@eZ.\:#^UcIp*/o7lYu-K(C6-<6Ran` +DN]A`MQGqo?FL0fC0-Y&)=ilhdT>8q*$b`K^>X+$l]A:1O^2(XnYfa2(Uj`$/)a)^t:"-F_0eS +gLhIj@*2Y+:cRrF^#s)NnCbO5h7+qu*oI#6L''`<0bDu#%#VZp0TqBS/r3Y8nd,$"D/k`NCp +S2e5sYWA6)DTF"..q',hD^p4T_4g"?UCc-ln[bS'p9<-1oNOsR;GWS8*:&lCY`:S[8B1/Y%$ +rtQZ@qZcNfS;QP?%gCIp:uO^OsVU0ZS[.[-7Gnb&Jn%'\ApslT3cQS+`M%)LZK%Y^TF5*Bhr +=TIBkTWtr`Ykl7rpi5g-IO&=AC5PeZW'/84>%"40`(JTJLe_?\Ug.U=1Db^6_@=n3!@:`=,F +q_T\P24mkj`opc$1!%j=%]ASj@(Sp@@Y%MYX:2o'cVlpu;;0)_5G>#-(c8Q'0\W@Ton*>qdk, +3dZW+(F:3C/T?\b4p"-P--gHNSb1TXSTJqt +es<,(-X^R&Xt^:SpdR=,ga)'7q`M1+6C7=-gNTH\["_F=aYf^)).H0uH68jIN\\?13#7+FA+ +3qL]A3okceD4 +)6sdE7X6]Ali4A\ete9m[aakDB@a6Nrp7/YfGV*QWLPG.*Iap)?`07@V5!Gp175Ia+-8_e7&m +QJ<`Tl[(1$ZIi?3@CUf>uLO-'f2feIEjMPrc1JZfF>B7cY_c@#tm0&AG(.=9=f'P2eBQ)-%p +:c''0="d5@\mMTcBk.?[C+4Q5VZ&mC"GO*WZd/4pW;k)V66PV$ssA=8hkf^Ahs(leLu)KH>Q +UbU.8BE!ZpM\"a8#'3BUld$If`EQU%I#n7">,2sC:4^Ha&baK_AI3-:m_]A)2KbL=\$X:H.Xa +q5'.#?'?\HlGp1BKZ6a3qUZu"HY@^ZSrZFD+/(A1[XL,-7GY"J`BuX>N2BMqW@ICSFmH"dOY +!PoF5K?_$/&S=SnknfDkDGKB&GQR]A?qC(\BAkP%.d1]Aounk2<'o>V@LTU`X1?fLFN>(0>Y*, +eO'USI>T0Of2Z(os?3M:5,Lgg/-7^Rq5f4ff-j$>?_*FW$76INMm+"3Z/-mKVC +E7UBo[3"Z]Ajr,V#2Hr4*P@K'Fh:H^d@!&FnA:gT9A8[>aWG)O +HF+IWY+Vnc()]A7[_5S7LNgb,Z+ncAnUUSn2R7K^#'>d5@QSW4A7T2\JTXJN['mdZMMb*EX(i +38ch*(K@Br+0>.h!sfGmo/l:5oR6R,pHPPm%*/.S:;pCIDTU\N(H4F#A?=431&a7QmO:=lJ +fqZuH\UfOEgiY4^YTXqeKndM\6p:-DJ*:*9p#>hSMqQJEE0RM=/X;BbHr17M2;M@hu=gboqh +GeF%"JVr3I%H;8(6GAGW8e<6hV):#6^n#KCIJDlp8I7=rI%a;bJHU*oBR._h,8E,Vk^@epON +P-09hoII[u8XY99b)1+n(A2rZ;n4KclM]AF-S(s`6B8ZUh590%lIXQ`I3Va[>J8D0En3Za^Ta +TO;T^hl'`.M"?2>,tXq-WasM_RODXY]AYi^2@tU+j9pDZNRsX?i.tlurT;38!k5F#T4t%[)+1f336aTN[_Q +N\$JkqSOp!@\&E\,SYhj#k/ReQNQQ@r2e`PQ$g6DoBTV7'!%DWpA7J#5aH(XAD[%rV4cP/J- +j?J-M[Nr8Ll@rXN=*maKiZA^U%e=5(>D?&E1N]A/_S/M9K-"qBSQVijmZaS^+^ +V3'V8`hbklm(ZN^kQGsl7o/)CCF6X?f07hpNkCa,-'\NbrgaOCunY!VXbB/IM7MPOd"H-`*L +2a"YJRQTY(jW=kcBS=^]Af+>c.tH^=!msNW,6(+J7AXh-L&ONGW^r?f&,'6/c6pjH;ud1Y85+ +HDb$\<-+.rOK.R_l>J6k3%CAsdpVolS*c[3)U@37*GH-]A,FMr`c'Lk8+7gb(l/%Qk#Vf(mDO +E;bNt@tgr(J+SM4oIP:,FfcOE'%J1W;>)COk$bL`U))]AT+fl`N-g*(%RknAOBRY:(q8=F;?B +IOQ.cPK%h\3^tZVhFC=dg^Lkq4!SAZl=6rIC@,qrb3\"2ZrTOZ_6$F"FrV0XVN,o$*X.GTV< +fr1c4.E85EFJb?cO=Q=Q]A,p=+WdEb&nfWnr=>,9nj=cm*Y<\N(+N)NcEHF/7lelr_S/ul2c]A +>JL"miTEA.H7jX7M+0t3n82Q]A.b\bq_m>OYfSI,Mp)"IXI/0*]AbI"M;Kn1Ub_BFGV66FRV$jr@(,h?V]A +'>%B^!^PDbh^]AEQY<6WmK28\'^FtTap3&2KS0Nakb2O#g07kEOCr^DUQ`=2lL2M61`ZSOs4t +Xet,K"=0N1fPc!paYj+uW".6f8s7oa(b1F7YU"0D!@!Ul;%*&Y*lC?7\"D'+)^+UdI?XTUFm +/$'1BM^V$[O)P3D\rXQB/gh_@VU?d+ZnZ!ZbU5pV>M5F4R2L-1!@L]A(M:eW:B,IWtKW&UdAf +QacZ%Dqb'JXajr@AX<8]A4kn',H+>EdCa]AqhlX>`$?g!D2-M!;I]A1)e#q'"/CF3E5]A3LF+Bl.XH6$9>2d1qtMR3Sbupe"sbI$(4eU +m@-7%YBpfsW^S-Z/XpK![eV6`*oE=#]As1lCnuC*MoQ,:9f-B%mQdJB,(3fYMhj0u(oR&XDpV +%+FbP40g?a!l.*;2]A@:i``,Vg-s2GJ4lB8!$IsPb'NI%".g/4*oQ;YL\%=9C63ZLt5:c"\CjgWl'BI87iP;/dK+E:$ABU-?So +^jQ:jdo4b>')&h@OgoSL\*RcpfmpV3Lh-8IPH/BWiEYQZ=eTV-k=d`tW5oo6rDk=)njc3A.F +hri+r3*D^"$I;P([(dr`@HI5bguFp/j9q+`^'2;*0ldj!W'f+Ku`0F@TdK9fn1I=$@FW'hI% +'=cdeZm1VXE#2^QdrZXCM9n+*'/ckTd9^,#^ZU:X4!:pNqP\"LR>%=>3qfVtj(8h2/T-NSMh +HFnHE[REs>e^9)+g4qn"5Mp"S;% +/-X*hKRRK!j9gY".(jlbUF@]Aqhf)[L_Zt/j"-$1SNEEiRQFg=_B(Z)/%\$Id[TDSJ/S+B::; +IV'8kja4MmY^t,VbTir^GdsW05b5$Hj5.;1A/"["E^]A95q,oYLK2.<(%h4\6b%o'8G=`OB!& +*47A0E"A$'b6WIfPGm;Vq=-#7+X-+#0!8@rXmmOM5lo#/u48[\9 +KmATqI!_De!(4I=qrUILki(.'@$>P9$JHKXqddOfq[mk/_A +7%HdUnJ6`Ne-^AJgB.s:fSJ_m_c*bD?inoqn9RSLN!/IV?\Z"A/)gf\ZPUep5o#uS6@=)q)S +P*W.');!c7N^n3m+UXP=8@$G]A^ZFVk_3&/`sVa[?E%_c),YM(hNBdgbZKWgF;H7Gdl>/Q(gt(grk^&ZL(3Lr)3#Is11C5Po8\b.Q:E9-_&_=*>e: +*!%6aE3&DDI1nlDU,PptOhn77hq&]A2+Yh);@m=.kPNQ!S9[0k.Si5DUOA>"4QC-HK;`Ls_@Q +MDbM*K7c]ABGAcIe1,dLfWMY[>5E9/!`1*PBe]AIdT5P=D0'k)hPrr3#-k_3:."1IGHh;cKQ%U +jLV90+."+3R"),(X\KfHUp_1?DpL]AK8=37TY%K,/"3$+O;/8`Z=IU=$%JlLe@4dE]A>d&"mWi +%7rQZQqC(Fl?=f*%+K!"k,VJk52%\F\rUb*d-@n"^kf@kmZmr`thrHroSYjFg";Yu6TOePpI +0(j(o[rZZ$0DaH)!+U5AeOrAI&R#Xg;.S2i)ug`=3i^-\Y?AHT3*YA)WFM*ILEDi[UB=?66GkJi@9YK^F^d +C]A:\>igo39_4uZ,YO_4(EI_.&%m7-0"-@P&4,'\a"U:o&pZhhmTNT4PCR,2;`prXk@r.5r]AB +5#FkX'2FLQd%1*`?)e>:HlM7]A"r8u_Ph'KmIn)=:31AguR3o*rd).[ssrXK^pG_qIH''CPn3 +C[m5RT0X8Mq6ArXuOqui.jsFQ4>r*n):Hu?d9WD-^QiG3lGt$DY<#j`rnqe^.h'@O"U=n_eTs(\N.W90@ +!Vn)0^jIl\PI]AQQM]A=&*$8t=-!.*!25/rh67fO2m\6?VEF*;,V,o1JuJW*S3f[jDI'jU)pG_ +qJe#;:@]AB4S7OpJc#QEa7uVTFF^FR!je$o?rQ&DH@pZ5Hp#67("Y(<, +c"S]A&iCVB'<@UA\1#=>^tBZghQ@gA@C%V\m4os#BT3!>AU$Rr16=W)4#ToIe1'RW$^.r0"Iq +X7#891l^2X1e@KOK!d%l(Jlj,nCCrLeSl'Ff-..DeZ+k-U4UG8 +L;o8aNCh/g#*!:X(u+BIo+77#r2@]A6HH(U:b$dF8q"aX\mdo]ARQrR.#Y^WtcKo,RJeH<N).k@*RIMXr.eSK6egK+!^U\;G-%eE1#$Fc#tD?VgWb:,Cuca-T9'4*sT>f +4!F&Z>>gWQ1SX'7^0eb,5J9&bc41+YUkOPTr=.m"K3)%7UTgW_QK1=Bl_]As'q9Ls/I9hRdKY +aDO!qHL"I;,+8l[sb<<]ATXr)s$`IMB9am='FYt!fsX;J?dl%@=np_W.2m-F;+Z5VfAbd[VP5 +Ot.8,aoNI]AGRo\iF`5jr>0q,^Zl()$%$T@n'&*_TH!.*U,iDqkJ%&YLDuB.C37TG?/O)jPj]A +aZ*\+$/k`s0fIM^K5FObc2B&:C@c,pnhb#^:+i`X:jr`3RVa=&)#r7!NfO(Jh[`.q70_K,fYgN>6g1'@o!Z`MJ;sjej\jhN+K.::R3 +%p3P)#P@b=AaYbVd#kJ>:IeO=qW"I,Q[9]AK7WhR[5GQKge2$?`tJCpZ0`N%5V#!88rKf?MsF +/?D-HZAc1Y22_K"(c[&!s@5W.11(BpC`ktk.hX>DtIhZ]A9U_,>WR$tMu\ZU*dT=FQ/k:Z10I +cVEOY;qT&=u7i?E/CqV@(F[*U;Om3Y=P%t%A_e=R.#oDAbk)@J(7$'2g@!faOfV6c3erZ3]Ak +bP[LJYsnRXFAak&GOE9^L7?n:i%X]A^^$ZVJ1EQ'0:[MRFT' +3Ud]AffcI@uMF8f(39:AoigLG?7$?UU\Uu'Z!<=S@="G)EWh=mTH[r>M2PcN[ch ++i`g:;hs$q2kSmMimi2W.$0iiO6t!s%-j;GQYQ^Z[R0:S74BP5)%)ajSZ;>07q#H7;DV,7En +?o>_;`5LrH[.[SVgDf`@SD*^h5H&3[gKt3,7%%*"VG?k)$>emMU.PPJ!3PKArj"adL:3%$g* +/XQZtg1\c\E3kX%h-+Hom.Y'@80O-&!YUS[^(JPe4Q(WEKKH4a3s$8(a,-4q:JQVKk'Ee?ML +aPc_=sl(n$'3P'&c<F&73d9"d!Y'4Fika +oqeLbFr&oFMK&U%;UP:J;ReQG?qI#t[&bil\@e(Mr2"'6J=sNJ7?&n1)f5Z;_jG#+HF3@tCgZ$^\A.p>CM-g27_Ul`n<$V"7WVWX'?Df8r +6WJ;%Pi,pMC5\$YIkX6nd'&c6YRP9Ac6@K5;=8P^PK=VaUE*q0Du"8.;ge*Bu!;)R5L%%)pT +!!^3C2>_IfXKeH,r<- +Lp$k/IYp%sM^4PteUE7o;T1Koh[fW`IBK4Enur4=;T+7ZK/<@tWAD?$jU?ch7`:]AS&n(#jG@ +S-74.'e7IFm:7q\L!_5(D\qGD.n2Sl_e4KVDfQK"1 +I1`.dEiF4eogQf.-Bd>(dKU?E(GWpV:?8E-c"`)QbH&a<^b*[?cdeZogW2U()JX"BF)VB;@C +N=2RG%Mho\Ilh'n+2dPbgrG;=?;DdW9CP((?a[U6)W&OfpX*0)6/5BLS-@J-Z-Ag +ZT*_I\"B*X75!]A<$=mglfgF@32)MVgXrS!0u&5iH,o< +X7`1Zp9U@BuGOBdrm^,-/_\e`_++K5W7thp4'*ODZsXD).^XmkE92Y[Q->lKC'&2e@l^E+,pqIbHPj^(sh5$P=FhjM` +I:c2VDN +VRU)Mf_K@EdBW@k0Y.C0H+ag69ee:J"[MVbZio7$,Nl3OYlod(/U7*Sh`OInEi +]A7pEeo"&->02=VSO&oVb$@.^hNadNks(:]A6/2O%8Z"MoC<& +S:un/b,'[\9Y+dQYBWm=FG&(/_]A1g54,kD]Ak2@HE@C'G==aDV@'BR\o#B_6e)rBGK5;Uj0*R +!+`'?&lq=Hcb_HlL6Bio_iO+@H8L@B(J$heU&PmpT,V0WA%U8_>T#4Yc,8l]APCqck(tRd-Rk +qBS4@b\jW5m*.+k%p"?Tda:BjsYXH7+=LDe^XL.%%mp^JmY8fafLUf,7lsEKHBKLOAM(QgafGF94,3[/%BBo +%da\.SPB0TL"ZkTdW&S;1()lJNoA6qNI)Bi1*V%hi"o8E_mWmQl7paMO,"$;ft;+:TjsQT\Q +`*0k+.W&+h`7Sa/8R!_['X<9HlKcI==VZ&Yk7')`dC\>C7%YktTbGgkkZf97r&^e*k1iG.LQ +;:P>CGM'P_ +*!q;3NNHm2]AobRZfdmf^#UXtb@nO5o>?hh=6b%CnNa84lkQ"=?@(>:0r+S`cMHRSIPf +H9gos7H(l0]A(_UK-kBiX:;qI+4%C3:lOcGO@L#M#08Ca*r80q@0:JqrEi\L*Fn&=AX[qKG8&$Z1?H4[iL9qFoS*%.!NZ1\1`]A3:+e640` +PW-Q5_57D."asdsPdhh>hY+H`+rn!;SL^5U(s&5Gat(+k)o6;_Z`9%T6lQO]A*5jH0N[?4o7n +$[CUhQ?dC:u[Q-BuHI:f>F-;5jCJfDX`XWYt%SGrHe05!r^/j(`d='"lNKoDAp\;5,HV-PNA +-Oj3)FkZ(BT*+/>%k("Fej)#DN?*&;35`lP"M)$$.1RV.3_lMLe@@RgX/".D$oR:>8cl"Q0u +)N`H_Ct_!PtABIFnqBq.5upT\5Su90C:ElgFX"S@2QR:"3Z>^-]A&ctl#i)G8EB(d_r)b_b(q)7aT/'$b*]Ar+5S/^1/pd`XW"P1_:(Ao"I@WSA-eZ*I +`^bW=-`V*IWh`3inj.kc5W$[h\?_FYLJYm#le3/jEaT^21kj_u&`>5V>C)su0I#rmb6lU"i! +F53D08^`7;?-r#Q^'da+aF>?`c0%,k4>YQa^*e;Wk5J)beAKjL=OApM9NTo5D"1/^me*fdcK?"N8%f3 +o#j%b5AE@1"ec3o&.qpoiSBN1`2>hR#Op#]A%BG?\9]ARBB\6aQ>s"a&7lBIgT"'1W)38m=dh! +AVG7GWeS8b(Mg1isEX=cDjX]A-H!s]A'CNtjd)&;qH-@pdd%a+jn.\0kP1Y1Q9W.`,Sd7gF9Y04,*h +)K+3')P"c[$_`m=l5bRqL(>9&+koNN>kUW[#osmeLBdkem*NX!&95pbUe +37IgU8O9(8`8"UZ'Coon#'!`ChgO,\'I[;2GdT+.;JU.A=I55f_U,u0fGScrlVCF5MhM1pD1P>qj6%`F">KC9"k@NPW.3Cp<'i]Acg15,o]A@QpmqNa=Sd8i@m;9nni>IXm$? +mC\^m?(QQ@,K)LtBQ7uU6*Q)m3MhV?E-Q?foYN-;qiI[ZlW7)c\9XOMHBfSj +UMlQrO3'RmW)0;e4Oq5KCKZWcAj%OA[^$*N8^I04=*Ei* +p$=)@[YGNfiG/ZeJ.3JG[^7S>@Wa^!MPr$Q0)PZjLT=[hCosD.C+FUckr,``25P2`hguEF]A6 +/gA#LqUaj9=gWBF1&I#7TD)A`fEYL<4]A(Hc=1:@7%TI'9+o#?rdZ+rL4(^9jUD6e$ +(B5V<9nsls.i>')27Y#S1:%8AINslVP4rOD>Uk8-;IQ'H86p#,gRY,&b$#ohfi]A->B!q0b=t +6:bc9%6Xu+=V_YfPa=5d\W/QZ."Y6eW+AM&\@Q4=6nL-UD5NQs]AKQY.Xo'F2co1UUbp)#P@l +'EHPO!_DNo/?B\r]Aul\s)c5*\>9e.j:fTgULQcX!M.(RHIPE)^kkg&W.cc)WQ%V;!BOD2YjM +"iegsukGl[?n>c+Q\lYfuoeWb%-3V%JPXKWZq_hm;>4j^\deY@S6U&c86L>,ul.;H@G(r)cRLn2E&s,hEknP"H4"( +t.Q4t^V"F@Fq>\`J:@.,,rP&N85H8^,s9P]AD[eAs@Xsbr*G`]Aj/_@0"9WR-?g1krT="SQcJ. +bfQLTaom/gJH(FO2a:YE"6WDW]A"b[Q08Q%22MdZ&'ddok.*1di()5W4=r%u8g9'O4tSd823`)jVLj-gHaD2\,"eAnhrt +9ZeQ[ID_tP&39LC"]AounhmhsD)Ucar8$^bFLmnS^TKaZU0;U]AcpR'``5h9XP&[4ctotb97S? +#-#3-AP3X%@ms2PZ*NHPqN0pq=1#+[E)*(O8#3_H]A0[?3Z@.hPkMjlrYHs57',bVl;cN +EYT4u>nmZGacL+o\diDo$"UQ^>'V2)Ne1eS%D1H[oIq^9+Rb\'ls>YgV-ORA^*H@6RbVR61/ +1A:mWeb$8@2DMDVL\6Mp]ADjpLr`?fsOm=R]ARD'nQ-a]A1P-*35e>Smt0(ha=FL/t$$=2L[U.U +-LphAkNZn")WLoq9IB>Wr6\FNo(4&&+JG)BI&"7c1,!FTG=`g^RMW%p+Vq]AWN:s@/ag@!qP/ +rK>21j&![!uFe".3dlbFrKL_-7k(FOQp#%M?p!j!#d#H0lDM?sSmqgV[]A[,qUI7Zng`\23^a +_jfD-(a&`bVoKo6i_i%5V^]Ar;N3C-PV,"X;^iRhYl$_`R<9oBl80OOR]A0/m)^FQW/*h"oY3l +8_H>Nd00::YpdC?%\ +CI)+\j,?ONEX;\nClhOgE+h$@,]A0(=G_@$*`EK5iO(_FOOudJMu%isS7\F,^u/-$j[R"!!5is4(lF^95V'c-/s3-+tI`&bkn;M:!J +[>u"L!Zm-[dHenG84>%38\PJCh7?jXId\HWhN&_8;iQk!2M=B6;a7C7KQa0#lED,]A(nBj5c) +qs?4;lNRL#rsRPDbN@'-CEV2<*MR'(.01.6`",%kN*CA*Sn8!hZ2\Y'IH8\$$QfIA<1&)SmO +^3#)%O-o_p@jqomQrB9$h\VhQhWl#7.Ht%,o0m+WgS7*mni!g +&L^sTR;+O,^*9lW3@=SHVMPdT?SbMT[*DK/mV0JftM+QSt]A7`'1FXk12lBBkO_-Ke!-(@o>P +LOGt"9_YLC<:k*_''g"Cd131j:q[UJWXXH&gjh9MOeppO>E\M^#>Iu/iNA<6@gYmRl=H+13C +]AC(UC6lHEL+^5n'3GE'JLS$jp$/Dc(seMgBNOG?7-'g`YP-Ide4-7E/SX`%RaF$Ksl8Q^fH7 +K%J.)#=8!\Jt0[APCEAZWjWX[*Bo>lZ*ZkaRjg,#_I-1rg]AXGj/kS>Dpab!0]A+b6l*@m5tJQ +7>*Sk+^q^/CHa(K2I!8*`nHWOViXgn=?km:uG8d2\.Vb3Y/q(/YNnXg2Q.V/m1`mgJm`Udji +Q:WfrJKDhEHS(tAHQ%b;--4tiK^JFOKT!p?iYLCHB/f&qcTBX>B-F\VFLNR43JknpAdpUt@kJcq*<7qo@*Qi\ +E*@J&(9*uPgZq4[DnZ^>$JTuA6h\OWq=^GLjZ7m9)0T2"-f9u!:B?bcSSlVA`i/N_3&K +QN#F;eOt)b0T(3:>>AiBlUqf,Yb`bJLg):"VZ:*iQO&"+LlD>$T-^h$g%&53tcuYs3\(%+4m +E/tP,oDD@l.7:3,;=E]AXRj@b1?@?u2<($O&ZQ`/F6\"\'\Xbt]AhC(7;Z-Eq:Nem:lf4>hZH9 +_K$lSaB<\.n$41Qqhal-;PZ5KLbIe"(/.V:E_VY@(MP.F"e8\Juf\*/jN+:VjEDUUS9F?0;4 +rR6?ZIqXK85OdN=4ioF$>LAV^+*Fcu:kU5?gZ)M$n@[!r4#+X\I^.L]AA;)@_E+&3pB(D"-!/ +qH?hr2M+Xbu/VNp%%D:]AO>$W3/5tT3I*>$b;*pr:`mnB[tH$QQOnsW#(/=+C*dIKsu,iJ>Rm +[SUjDYpgMb;jCGl(gBO^R/3BbY0c>F[9s4F,!#Iil9NFgIR"`h"<$"*MTG`Lm\[)#^a'rmnM +pIgG%^J8+2H27!;6o8:e_BB)K!RM//>t#QEap9W2_W?dl^&Q$9:ll*!$iub2_,f?_SO+g_Lt +c]AONto(:.WFKs)Hq*T%CYVHEQps`MpB_^F.cb:&AF3#@f'0H9mPV&T:>G4l#bL$DPmrp7/R)5]AJE+6mtVA:p.<4jFW5JcM52SIWc?n>@<;?RV#Bo_0>TnJAf?eu_X4dGL6rm^=8Z=iWj8,27;cFpbsaXq+0c +6#qP\#^[S!KeoC`:2?omV*f[12Y,bK8n:s2$cl[+oaaeq?4g@-6-'Qpt\DPbUf':JVS,\C2` +S%(#0a4$dnIN^BQrl::K>=Im/1er"Ddts"=@oSQ)=KGj_&*^5HFOM$S7*gPZ +OM-$HjQgBRWsF2g,GKK)_Y_.75*VNm_-?pOha+FjtJcInV$NJfHWgAK9+Hcg;:>X2uO +UiR%)E8Q-XEf?[@>FK_8,l\W:Z;KA,*6:Cmk`;#`!BP.+]AoEt\(3<2'ag['Jt\rb4_Zol&+EC\,GCFm?L +Blh(9rKXIWBp%k7ibh"^bpf`Wdb"/aUge`"V3q>+k5:UO$DG@.9YdB;J;C`gC@9QTW]A*)nhbGr\0qep?5p"V\$9`dbL[,'B=S2R">@RaKQIT1 +s?h,RKbg.GXK+,P]AlFaU8%Nl\gf99T]A$)Lo##jg*NfAe.9tf%&GDsic?TtZ>=,+X0BW8#c1"?-cpGurt) +3s^6$%T%RUBS!KNXk9fkE^%>eVUtf#.&.AA<.0IZ#_G=`H??gI+!cr!4QSbdmQ9#fBNqTRiK +e-:o[XCIaaIVBb;.T%k)T]A<%QLWRPZEGLh.dZ;f>[kc(HWZ@K +OPN^MVTiL*P6%r*S29BtsRcDNA5WY(]A0.lg5-I)%+Yo-kX)(5C,sFM^h& +lJYrO(NMK3JO-@\NUih<("#lY@sG6+oKTEu>4H?O?_]AHZosP# +X?`:R`Q^8G]Ad_M%C[Z&C;c.ILoGs5UU9]AKi07U+^C;97?)l\AS/<2As2&cio;1pXhYg:Y-Ur +W?.1Ea2FJOf32Ir0HACm@Oofj[Tfn46JO8@kV+$sRR_4lqkn+\q1k/X[]AIq!D/l(a>XIG=Ft +1UYQPD[/D@,e+EEb+(/U:N#nQMlj6.ed\-1'1-jC?q%)XS_$O>jWm!C$'\J@.$=%C85=7I72 +F!Y:*GoHS/aInR/LGB'L.DO@>eN5jG%"qfgYBe@Um4NM6pk=1's8t3e7X=#> +-GcqYZ1;m\(J$VZ17gI=%^NmJ:o=g>Qb`OQt2pbrJh^dd'DVgFD-9eBC36p,fbR2=??O'<(g +5?*/pPdAu1-u"jI0.Gu.QaaB_U9Eg2gi9pa./`DIf4$Y=;<^##S-9@`AU6Ud6!J[)ElH+aR4 +DSHl'hkUJ_2/q'/3+J88bf@P9?n\V`ReiZF%4*dB.(!NChsRO<^sLaEnM=FsqRgR6#>bqc#" +iouEYD`KPJkklN+f#3s5h>o`PC8U=)3n4#kGd?'1h)0$f\ha\V/::=e,,_jK4\Zr6ggk"Y2Y +M.f:)5NuUe/p:&X2!ElOGY2$pXD9gEK%oe4nSD6gS&N_DA-DdLor_DDfU.m/k>`[.FoG'>UT +dE>dRTq\[MIZIZe0WlN&;jQ$VdNS*=qWPU +R3,"Dfb3o*uga7b(0)i`tq'OgR<1X68k$,:OZ8V=7kSZ`@8dj`^QhH@Ro!%eUJNgc`-8BXsg +lihX>J*STOOFV-67-JcAj(,D-q"6'g/G?h[g-E)W(mqGc +jZP1c,LQUgddXt0GA>S7Xg*;!+C4:g\WBIu:=:*ShW94S)r=`3_^-('TIDNhnU4s1dLclKi^ +$ZY^=hXMY*.g(o%DiUg&38oe#p+Ie#]AJ.I4L0>.jm40]AflQ$bchW*^K.beoEN/B(\$Qg'GUg +QRLt&5kY)h_7j'^OJSs,]AS!-LbLmp]AY`Pe:p4f+]A^j(lmTId\BA>&o2rWa$7MK$s'n&a-,Q9 +"u#$ZmdN>>,e(]A's%DTZmBg#\;2iV9@Qj4;73c[l&JDLehicm`7Ra5:*rs:N(IZA`O]A2*3%U +p4X&\]Asg.;Uh;R$sSVLN@2#c@VJ':4[\H1$Ph&\p=`mjBN,E$9L)1@ZI9DsQ4?gZf_C[@/X` +%o,1LdM^i.hG`;aMT)XWD]AQN"ItgVYBI&TC72@`FRsih!+*INMR(q:SV>\hl-Gt3'ZE``t?( +fB-=2#adnjl8]AbJ3%3T@m/,f3&(64&DK4TXEnrE%?oHL(FCmPo9?.^ad,dDj^Y-(7Y.`.hV\`eB1VQ#:X#$oQG[gf8dN[ +:c(ln5RW&IA\i4!aX6qmll%,LEF$*cbkhQcredG1$iG9'RV7Lk4k?NFDroAAH8#BuGG8k6g$ +ba4#qdHg$L.O2AB^4VocP>D8bc]Ajs"-K@LRQD5XNF^FS=2;AM1Ukj$lAPtpF&5`d;:KLV4\3 +FHDfb]AcETjQo4%o%HLUI%n46#tgB]A%3ENQZqJfKe^+$Ks*Lju?cc&K6k7aZWi-iau\dGC'kX +[T`ej_Y`'VNGA:Z#f?BREf)E@bD`Ic=RY[q[D:#S]AcFQR'M-c7)1W1TndZ>g=CuunNcSHDbD +rl8$'eMnm2p^Oh*6oD+0lKR>0b^(,-c?)/57lQ4BtiG]AgnSZ9OAb42i:UTD0;0FA^K2=:J&t +s%q`jcdnRo+^J54SeZ\gYU;)+%_du\K?MldBksVb,Cblq=(3):%5(C']AUWLH`WRZ[Fj,@6[8 +754HVIG3`JIN#KNFrL4HbGdJacaIjM!=o41)o4ORpXO='Zo8i[%)jjDuq7S9nop&FCNs=pHT +\L1@_b8fjTOi[JoRZZh\`jee=P]A5pgm`*c%eT,Kt5>Et"hO7`X;GZtgpZ'*=>*mRG@_-_otR +*M:a=n*,eQ1r$h>;[X$brTU7815\hO,s=JcUM_jc+n#kI*Ph/f9%q7.Q[=2Y.^qX!]A8]A,4@O +%gOo%Eo-g;6cmpu3lZ*dp#iV@"K['T+%'CYXXkP1UF`;7o8qK*D>pmCn4rZ$fVaMa*_12X;r:W+U-"Kt;:(9f#I,D!)UOcL(>9: +tK7<_lG2!F0E&WnX]AQSYA(B5%o+$ui?pL@Acq$c>5Ppgc0%l\XRb-[kV"#5r#X1TSt`Xj7hu +1'(kqNS?O,9?=a]A4=!t%cTP\q(@AG$iX2Jbj(2Qj*12/o.m4BJ90lbbi7Vg1e@%(sB5LBfdC +]Ao2!ik2?tYPqXli1Jb=5T@uW0F?lnV`U;K,CSr4+O_O+5>435PXk97HqT!Y[3(Q?l=f53[jT +El6N)%E"Xg?XL3PWhSf+8QR9ZdDSb%OfH/+BnS3(2&D?FJ"EB9USTQNu1GNrn?hST7HO0M0, +0#""rQffZk&c^>F4_+'C'HBLdN-K]A8?K:bQ=?[Z^F\=[Q-[`J.X#gSd-i-F0WPKNuBB_> +>p;Z0*:ThbD85Fk&g>IS-OR,d]AJN&f)!t"&ne.f`V>P"ht%.6MW@>7dP`^IGgJeM`*HJ,WP1L:#$=7Y$N^H$+TnCOIkH +%ZsnU%>r>e9h2*hjihOeSZ.%?1;S-n0hu%;6#2`\FH1b9+:)sZ9rCMX[%DG5]A,ZoT$]As('lU +fkU7S=NCs*DmF2ZeMIRU^BELKm%>+U%'pN#@a/Z_VbAY8VCOk7?BUM_QXh<"Aa0kJ`g?4Rs)PK,MU\rFs1':'RQ:T=38<]A]A1NTGPHB$k=IEK=SUgW2M5$3YB`:k&9' +8CTG:+qegC>#4m)f#H-1nhnQcMRM3iBD.2eQD]AHasOqD4 +eRjUf1':p8bTA=qdCWTtZ?O1\^-"^h=G[JRu\tlY8X8YH:4ia9Q"nQ;$da"o&i[O6_W9A=,5 +i+&`KR%DQ:?&1Pq:D>tkQ#n,dKJ]A\&\EW#dQ_FTjhsF&aZ62Jb0+$?7&ZLDd[G4.0?=U&6qb +np_o\L_W%%c3RMrA0:TOV5J[U5hd9p"BdF8-BOTVl.B$hO@`9&tNF%3&.`?dX8K1g8\,Kf*SR +8lIhu;i#=>b0\eu-I5Lq1Up?2XRARbVd\Jp]AIVYfi;M=E(h(p0-lKTkRJT;mMnk?=,t;'UM# +h:(d6r>^2BG`E)rua$%Q@o%6bM"o!H,]AEnln2]AL*YA80d.Ts2$i9X8.D:(Z.P1@Ij=E"f$sF +.bK;Wu;or7NN;:Sprhj=bcIk**G86H[*Lo0sE<)?qtatD2`)nM8ZU!j*NSR`1V_3D0@:3\N]A +pmWA*\?_q7`p\2:9fq>e/&SX62E8s8*i>lbOP;!]AeHK@LRZ[p9R>6T5tV3]AX#A8J>Cbd`3el +%C7C;)bh^8.BSc[nqs?&U.iN=@qCq/P%6:PaW4sA)IuL"n'^-ZR]A!AHX$KMSn1CDD`.V%F[A +5)N5$\,CE<)PKqUQsrm#A":_]AN[g.IMu>gIW"a?m!R*]ANXQr=U +XkR8ZLSPeVDbCpQg2[@IK[I^9#$X&,o7,&c)8[@?Z6]A1AF#^>cC>^t'03B`NP.bk:pOO13S_ +tBj`KjQ=?`@p_g&#tAXSiCBl+`5!Ck( +&/dAagE>)i^('=si>h5i1e+5%qEc_tQ5#76[uMb38=e#e?>mmSE#*i>g/<=D07"4+DH[droY +G\<2QbN?ddSSql#(m.QV]A#u?[p.O7+#a8an>iHgpCpdMZ>gZ%]AP9(>fZEp-g`lLM- +.[;^&3k1ld<^Z-a(5)\PH#(n)W8L/G/*am\7EF;c$A04M3"<2#@Y%)OgJSJ4VPW=F@Wn0c?p +CD!m^&t?U^5c[O\`CVSH"^"I8BGHLfZcFNm89g:r]A2b!^$X8US-'Y"NGjsiWlbf4&q6D+k?W=CfKL-h403F9Ds4qpH2bn[ +#[oW9F=`bB[0fToeW&3L1LmdGMRbUD]AJY_^8+&JJ"0+-GiCZY?mbc,BuERQ"/jd4J=P]A6"9; +=]A^1M*"\mZaCM8+M[-e`;3kBT,irVB?Apu9aC"C>k7o>doWesoj&o,M"C98W4Di4M@D26Dl\ +&>p-j>gPt+bH5(QQGMiq\AS'YCF>1PHEJGUdijLA_k+;/\A+"D>&S)/%/D]AW^CjV:FoIV!r@ +&mam57Sf2(Y3qahrn8&um&VOYB\W[704kiq(AVZ.h]AV3"-6J"llp@]An@+6/ORD[U(*!kP)&#%o +VIC=X!@7fm?aM$f1G=d61JHpP&j'i'ifQPRLo]A+YNp-,f-6o&_TiR'o$a>L7,qYQS>j"sW,N +s-DNoO=X@X)rcu_SgGZZ$]Aq!7sYaapT$5*tf0%b3`&LRQqnUSjY:3e7IKQ>*G9Z`3Pu-BOE; +W*"53YRr5"'fIp^'YcV]AZa($pcDAN1R8,,GDe1'We#k*F4g+K/:b_P@k1/RMXNa)9h9h%,`rLF%fN/k;G%aAcPu:/p)2@/Ck%-OpB,a'9i.*G:@!f"n1kpXnG9I;acO4(Ft+ +q:>W'5cAg"P)'>MoF.Q3e\Ab`Y\>$#%M5@jJsqDU;Z_o5I$,F=Lj=HuM7q=B=:)S%j5/PT6$>c]AIN36M4Fo\V^0/_T@uFph +jNma&+WVK?2\KYB?2XGIm_M05>h$[HG@om_NaWG5DVkYODb(WSE76ogAkZK_#c6ft'AW;D25 +t4"HloaoG+nG3?>4c#`+ZSW?r2!Qn#[\R:na.\-e+!gfsuP?FRuY"YB>P!+.-I.kj-L,Ree8 +#XQc[\-^^5Q\^/1rBZPV'`[=3Z5Xl9EP>.K8A;"d:lU%[k1Dp8:J?o>%D[+WTFf8i;HB\,8W +&/O.l_&.e_*i@P@c>sZ[lSU`giAJscI5MgS4<>)#T.HG3M^UaT11AAj@/fc4$$dAaTC7HNU2 +F!3c>AP5InP`o_"@pe]A/BpQ1RSEQFd/U:AO!aY5"Mn'^Ia7EP*MJY"a3"$brC3+rs*b9&-7N +9<$M/n$b9fMCkjKk$8TGQj*o`Mg$u]Ae^D;s0Sc3Z.^`i2n8P+t$YAf_T9X]A4!W8n<`1;%NQq +7,EQdAigbGsUKGJ@*8e@&js*0Gte[3eL!$N\*Y%Uk2qnt[J1Wdb[ND*U*F9@TZ;u6$K:qr/4)6Y(^X3Xsjr(Bl>\S3.gEKcc]AD#=t#ZjB`l&BIi=.Zr +.s&"XB;oaa#unbKFN=+L4Cm[MpOqc&lVm4Fp:q=b!6Ui)Hr`uJ*>;r1^B4)J/Ymo*"/VT,[U +rm:=]ArXJS@JaH?h[]Ai$F[j6"rAd63\C4"3B"uhOglVue8JW-9MV$c!a:h:k'_d4; +F%tFRicFOL.Ue84Z-@BGVKM>9C58hP*"c-q>DL"F98 +H#[^l-n^k0M@Z$(R;AgKfnrP0,`O&'L'beK9Uk\P7?mqA%b7mU5f()=#I@)1=Pj;n(@\-!7K +5s#"Ja=`^Ug7C3Fq +M;.H3M'o6q\d7]A7$?ds+>4oWRRoQJfp!qpp2=t:cZ+ +->!]AI2X:*m4uhL>t\#5j7g(8qbl0[.2e*:_BoU>/iV`@HrM_JUk@YXDkDq>?e>VS[ql4XcGM +]AJM7[LR"*B[a!Wr8Nu76bA&Pi'D!sSQNT\@C%BeYo(aYg$,soc/ +Lu0L]A(N=ca0=n0+32.<\'ql"KTufi.(`??E+F#f0%!mN%>0\VF%O0a&uobJre5,[E.g\W^\RTCfjilmf/:mX#T#hXr3u\N5\f:h%H7edmFbK$?;'#B1I`__k4?$"#M&H4 +?\ob80S!Rc=O$`&F<8RVj51dN?!Z\%MacZIi3jB"^GL%sH(HPes,VQEB`?`6n`bjpm*d^-7X +el1,oO^+7"p1k#FrNY"8"s!2XT$P"X1Tb/(lt2>FBlfm[L'R/m+faW0*C`1$"MM&&H=ig:c4 +oX8cK"Hu%?k\FK,eIIR6kR3kM(46TAdW6MX*f*D7!PG,3qn7$jSK`sKB>NPZi(dd6$Z>H,ID +tU7#ReM1O37LljPRYF[":3=SZ;!4-aqqbL>9ka/GQ/hYO +l#)8\L'9fJ''I-6$BBKpj#lEOG7)Q4^m1H1pbR[#?^0m&4[FD\(BAa10lDkMkR3$#(i.R6.g +tAd4>K5U'8ihh8a>[rrPp57n^Y/KFKf"%,f_3'n//Ss8'i_rc_8&N'bA*;%Js9@!7=-0UnH_ +6:"aJ%7%HH^D3F1b&9B#dreo@#-=ICSpL>sFY@,fTm^:E)+R +jggO1GTIB#)A!C9Ci"BW43"+\MtsNJg)^MtJL<0@ +jG\3.YNcD=GSi5PI4n$Ro'#"r4)T*@XKPiqsLcU'J`J7CjaMRfu=X'j\%B2Wc2*)\PY*$@6U +\n^Z*(nIf%/'?ufWjBdZ$2eOMHte#KE#f#^!Gg3UeERr1;&^E1Fepc(B)Xp^f]AWJBQHk+L-2 +GVJ.)TqbDA0Fd?.7FEikg0\HY^>\00L^ChIkK)cC]AT+7UT%#8`\X@4e^a:AI!t<8Fq?nEFhc +9VCRGu9f$LGr+a%F5.(3Z9Zb?d6R7766`g_he9>?O +jP'b;aK@LcplR=NpOM!_P5!uh2;#-_7-->^l=9H6^R`N(B\=U^pZQ9i"5P +'Mjl7Yg6#GTTr"]AWQUEVC2E@?D4,c6Xbr4nIed$V6@O,7(qV=!?*TgWO4JBqGL<:=)a#:G;N+F-`u.U"PP;iel[_FfR%hl3` +%2TY8JVJ=Eo,/!;Ep8]AX's6\&lb@kQ9LVo!1%4"*cnkS&=Jt1CZ7.SLoETT#FUJPtYe^)^$a +3k/HU_k7V1^S=^mqj:0OpMi)5Y11j?Tsc`SAonFC%;b0_1`-GO7ZqgAWdAGF-^Ru0"j5+jpa +t9?t;T5gYh5r8Aun*N4"#;J^s:Ff;lXhS=OQk.Wha#LB6H@Q4,J=\OlQ[8id,n@+":.-Ep<$ +C1V/MC49pl$)O4OQZe\gZ%U=o4'dKdJu-Z,nl2mLDS)pC%uJ`KP-h"?S#LARY.CMmErM`0qG +Gk\4bp0O6<8\B;a>WZ@FH-YW),O'I=<$P:2O(h!Ta#0(&Sj0$_8[]AY)F9L+`?aa-+]ACDj736 +55iQB:hQrO5QM7mrs5XQ5_00pS2(%e;!f&eIrtJ>'3?n:+:=#O;mRG!N7m5[SIf-\_pSqrCh +"e@sD433Q@B4A6L!VrGi)rp&h*5h#s(p9arAk\']A:8J3QZW!8n/B/tAGKgKqFWP7lp;k5h7s +^1+kpoTV1#kd9aYJc&[uo]Afu@:SD$*uj+HgmWFhFYl5-n9c3j*6Y0NH<6am+[F1`UL +O$e/P?/Z:Es4eO^Bd8b/%Xn0%pm::9k@mP(BUGl#'&+(s.hH_>?ib*c(_jk)AB\C3@4K$)B# +5!F;r2@S(aVAr_9fCdQmRq]A%IBk:aTsnABT-?--lX;%@r-[gJe$TmKaF/4^,3&Isp0'`qB8tF2N$tjnlQ7BfWfu'9 +fGE;=gTPM)DlZo?%a"h5)m^6bVcljbXCoBVdLi+sh$?f-InnL7ijlr-R.Se7np0eZf5WK0BN +RD$r()RHLi*'IH"!PAg)2ub:#\50qi-uU%K5p`3!FYN`!?cJ>i/JU9i8,+B&_6c@KE5=8Xcr +sgo/B.YOcHU`p_)Z$g+onomaYA#JJ/^K3,amlG>fkIfGf*J!hb"(P`.=ncM=e\>m`eKIkmh= +iaB6&5a`W]A$"<.h4@H_LtP;A';nYFVE>%3LED#ZkUChTg3i7'CWQFFV=?n-R\GHiOT?tPEQb +_$Ifun\f)TEE(eg6<6Zsn).VtC=*X`G3jrj1g0q4.R:'GP8-%BkP/).&@)TdsN?SkqPrXAL^ +iUTXp0uh1aFMbEWOHbHbT)$f3MZSL25-&6q:O4@6]A6e4]AZ[oR)qZ,luE$4blo%[RtTI-*Apd26* +RK_B^BiVq[=I%F/u&\^A-q,mIbS8-*@,^k,3QTR;N9 +n/#FAfM#+>^HL;p@EEDO?h]AU?]Amf3]A\5*Ct9g6S,$.C`7cOsD1[%1Z(/cV$"_-5!dI04AFj. +27*_'WIVH"0:fHq`r4KeE2'\EfuA?nGHDKCdr&u'8d7iIOm&iF8dST?'uas,a/)JMG8i^"diELQ5O2`[Gb/r ++.]A&cc7iKrL=$n+g_!$%3^4Q.R@,Q=&(?^fr$3g=T!IYkk#X1E*$5[]ABpKJ6%/rA64p+*0>/ +`1:#9atrMV7."pUc"469KJ2bDjnGW@f:^FWu&Fm*5rtl0#>TEIu!]A,4rbAK`2hgi'9?s!Oh3 +*F+8RAK:^*;YPcq;Lpqn3)EfO2Lr`0X=m%k@W6.6S++f2:!>ggQ.EgKbrYaA@@t0JoZ3ED>P +K?5E7g5SU*+n8QjO&1L-+P9fNu"bPHGJ53krL]AWT!(S9[Z$)06g-rshjY'oNRGYCCZgZT$'( +kL=0KkUU\=EZ?1+,N(4_pJi'qfTNsFE\.(e57^HDIlo$L#+Z=rnmZn5iRED#FJPY`qqrh6*t +[.rpj=S89R%e%0s'S%?3,er@PnW)Boh6LPG]A-?Jpm0r.P:o&4PFK4QoL8GCOj\EcYkVNVKm[ +qsGSu6bW=5EY.) +@AErn3\kNPE1Y+Xpfe&,=1d9(_qg0'lSKD]A?ELkGKcs:K0X`FFJp8;FW#)CkLJVlM_^U4*(l +5k,8mZQlBV!hP^ZAYdT6EUP!rRc0UZdSh:gA;bWj'j#*)^6FA-8;jOS!S*VXp.P)+g@X?Z?I +!iFgu0'+6CDf^gn#kNr`'1c1eIH8`r159jeFA]AT"Wjnk.B[X3I),fW\"OBt6HKe`9CiA\46? +9*aH[X=VL-0(kjV4YQX2.!Lm62gV3:'Ii46N?l*35ZBA,@gL'e-AFbcfg'A+lARnplX5Yc/` +(TdGPL2mcBAs3II+YHG=&1\ST;K9BZt6;:Tqu(adUojH-k5R/-X/b$j&W(WK` +f0tBq:N[r3s6d?XRY,I"8/YCn.`HtUW*fjWa$'0IY/2d50Z2;CV?C;_=qY?);?OTH4)Ig,Dn +B&]A;VaTP#2Je(goVCEQF^P=/SM>mtWMZtOoB%"N$FZ4"%NBfXToVVik_Q%i@@)#Z>LaBQF'T) +8]A=3=)>g)H/E2Q>a2Hc8rZ3F/Fk%`rTAga>'S[kl#?c0M=j8?@tpRRS=i14qs@;H6ltH6fMI +LQH=h6CU%^?RX6jbda^'L#8j*nM\qeK2FrADS<-sImD"qkSV(/V]AqoO_D-!c10m01D5M+HIPD%>[BlU +(X&c$(B=kJa6Tl]ASLkh(#YlYgU\OTBI2!=3mCj#W%,-Fa+K-g_Q2E'?-DVo7SLY +H05Te585;'H%g6.D1Z>sMs=(*g`"Fa8C3#O4&!*=k]AR)",^@KQGb3T%X_8R`LgFDGs-[9Ij> +Si8"@e^=1L=)!.E4,+2mSV@o]As6VhTXY%.7;E!G%s%^8;rb6@oZKHE9O,_jnob/+ZR+2K9*3 +\/7Z[ri6AB*mn[f&Q[57b5o,9QMSkpm,p6OMbDG-&F@F8q3EJYMGFC.i7J(hX0ML6\\4i8J`7P+<^5PhaL<^/-OT+q/V +B^g:up_qM*"8]AmfqKhHEkIP$&Qk/Ga6n`#Neoig@:)]A)-l6HiCcdSmK^YCE%epBe;Sdp)R(k +KQ]ATL!JG`8nP;efgNGt\,)Y-]AV1XPNN+L%LH_sC01m*!&/Q$@+h0DNDK4_UE.hNXk +rg>+(jj1M9annR]AJ;s@3o33#??'of'hdXIXR#>u(i(pcKeP%Ps3mKqMFq!I"t";ON9=jPf'9 +LqU8MS4JlA0\=0E??*KQM%#(2+Cs\p +G`3FlpigciYi2*!O3MT%@[IBahE?a.[i6%1$mp+DB9kQR0V:ITg:T?fJZh(I&sh%5&UMgu6u +Km,Wd8s*-mu[fZ\oq4U!ugCLJWM=]A]APPp@X9^m[IU5P(LEBb@#:E5\mG26PJl)=>U>%*%+EZrXj&EQ?VTO_a3rAaDrVfRA4nAhc2\0i6&om3?o"bD;")YP%M,W8`Q` +-q5E0*"mLD)UFJd%tRm91JZB*:=V"Q,2QZ[b<+\CoX9e;:_6j"J$L==Oah+7b=4u$!,gKAOt +(ap.(fLe+tTR;h3[n&WC-jeGtVma?;]A[:[OE5BJ1F'Pa2F<$r%0W1A)rhK4E($$7e4sJ#\Fl +=PGr4f7gH-"?/4i@]AeZ-fcZO[0$-^ +:GQr\f1IL-PqoC`r9MYnNs#]A:X1M"+:3K4[HN;g60qluSf"JW@XFeajO01-i9(W"=0A(U'Qs +V#MMIbTe(`@?NOTi1Hm)k^hKPTP5#4rGEP3O;VR^^7.Q$8@5j1M!Kq:Sb\'GUBX3u6:(47n` +,Q6,\o,gmP)sUJX6!#9bQBH&@p-b.IZNp80eHc>ZJ@\BjOc/51i_S%KGYO\kE]A2gXFT&/N89 +ISP>(`FoBh,Lb1G23*I.$)52c8LLb`]A]A3Lu$JY\;jnY\[ZR[G5pta9SJTRclpi$!,l/=Ug-m +)h=o[?Ka>Un'%b,_5T9#,p@1V5 +(UZ9mNGZg8I_cOl;ZN(RRZ\q/-f\0Hfs3iRHthD8n:b'=8B-lahe;$jP6Oe)A+[0F[aGYF;T +jt`TS@^_DDrn`)iQ*p!1$AOV+U8C@MRBg?1WPa&]A>q-u#"L_i9tYahcc20Fpi^@"ka:LO6ip +3f78p#N8WuXUjDRj?-n3#=dbCIYaX-C[D2q@Oc&XgFVTk,[lV+UqK +C2\eIFXY$/O.d<>hQXUQdujU^`m_h7NEV3V0"a18_[Tnmq\\0XbRc +M(?i%%/0bG2l_PSW'[=>C1Mi>,Hr-7[Ee#lG:Ho-@:nEpp)80&HBL"+cr;%0(BCG^7Zg*maE*D]Ap&RfX(4;1.qJ^;VU,rW_->:#a0R\DB+2klR1"4t:N&MJZ!0C +@&p1O3EBT+f`Q5j4"P]AbmF9GB"#f+EOC392PE?Y2h@L:9Y)V& +O4QA\gU+<16B)88%T(!kMEPi\m6gFE(FEljK64-1T9A]A_:N*:u?Q$/c0Fd:rY0$GOHMj%<'#3KAI'jm%>m9^2?fF3i%ucHm=@$8>L)j$*F@CD +IK.Mo0>DEL3`!_AU-+o7bnmjBSGF.]A2bUfJDFi]AT8\>`m.+D+S(4?&p]AN#2/0"AJ!56n!FkI +90/^P>O5C39)7(%=`3mFEg+#INO72$&*R*-d@NF`%\lk(/3MC&r.F0Wu5,9jo;c?-JD_Jg\d +k:n=df.VB$ZV7u,XE>(LXCFGL2'f_'UDUHR/^"q%XYmq]AT:sJqHo[NS(Wr +Z*OWZG(iFHJSIe'd$J^R9?b4=X2(l6_r6&Dr+E[anQ4TaM_!aAEc +h&YE9R2lrfNlNIaQ+(%m`W'"k:2o;*O?N4#-^od<^jV2H59+iklhacb>6YNcL?oNS4V+O1Us +U]A]AZsOT<>t:?s0RkBc+2]ADs6A?#]A=o/U9/O096E`pgth+3gbH.rCpC8+9oQKPU=GIJ]A8cF5) +c8GmQ2`LuX3/iBko8g$r/^G2Ol^&'ZuD^QMU#Vd_X+"@h1+1DsnQ/Wfl2mkh-EnsX:qd)K-4 +T,PgbbZh1O2H\S[!sc/(@oY;Fi0c';("KUr>NFfTCn\?2Id=>6 +j!kGm?"l`[\VJ3?bE29?8H(%-s#@U\Gc(L*cB(jJa/Gr$CD`$@7uf?6,.!\IP@R311&%eL9Z +f(W\IBK$3TmR+R,#D9Ou^P'IH9NL^OJ?eCd*44o6PnXYNPNUI_B(62qjl8C0]A\cdVao.l#R.)R7+Zm>BJlWN&1aP=q-dET-cI^:bGedm6@N2T)S.E8#E\E^p@ju>hq$qYu>>i!bm +RMYhY&&!0:]AhkkFr`GUWL4:K9B*dM5pE97GjW*n.60Ys1bbp>UN(!I`0VGN9:>J@Q<"Roe;I +ssi+<#dYJG+'o#t!&cd*!]A6FW3`(NMl:3!ke>)E1.p$_BR34fg^Y_-.o*)ZMYXEHY^nAuPi= +SUq,Z6RuGP_hqP>]A4&[IA)5R^6\Ke4cV1Qpof%TsP$a2q9m:Ja2]A1!<2d^RJK+h3%A)7OZUUi_.26_gsm#!eS\%Q,c_cmT^U:bRN@t# +1Y#_S&K3I3-1,[-I=JaAp'bU[G1 +rF=\eo@XeLE'8@e8Q0I'Hutjug(KXcT4ARH4E +-MS?VO)Q$_U6^6!4h`OPQ7b%2tKHJ(9'D;[tsA!aWO:19e,4JlE/X+MWAD-^Ot# +1Rs2remlSk=2i;U.nV?\/U?!L,l&<[WGDBnX3kIal?eP`E7]Ao[s1`EqJX.r21WG\o>iDoMA. +=1dSZ)u4f,PA,qSL*^\WGJ1`>,Uu-7M*B>fIN1/8r[*l*b^jI_N\ +nJZMjQ!,s/NH[;LZIAq]A>![PJBe54a?_?r[$%0OBQ_0_.VLVD53<33lPQl5X#R,"PQA$h:4* +VK1Y2k91[#\U-B&W)EH/-O^Pik5V[M70e1Ti+X-Q#i2a75_[\8K7+1/WXY1?3Mn<-3`LeF$@ +mlLKsn>0JAN$5\NH,[/&@[6@<+g3F@%65"PRk%;1YA+<&WkL6^#RK%N&S@IPjF +Z0BD]Al.&Rq&[>"]AL^"3SS'GJ`nujWE:L=\IpIU,VlW=:N&oQa:YlGL,!D$\<[keY!3=XUE_j +0pOB-RkpT6rdQhG6_WJ3+nb5_Q5_$ei\_BJB*]A`*0+[j1n%1b9e.-Krm+fY-P3c6[1_(iO8& +nk3.J1prn%YCEo!5n^0QbtXcPCJ1s5p!_dl2eJk#e%K9H#00>q$0,4L+ma,R$K1+f>n7TW`e +'Cp,>eiWnkJ;s^;N,?W3p3K`Wfs\rE +2@E?$R@;=Eb#d4/M_ma8)kDJ8F]A^=%2/EYjQ[$t6\C;poOT[$@dUfRi/S0*<-53?JA!Z:4/$ +cUAH\U'bU+X:r2<0ICBS#)J'DsleUXC%^>\/tXK!SEiE6rVA>)jQsEeJdjb:jO"D@7JPcFX' +N)j4eKaI>Uaj/;;3\@frJEq^I>D&JD4I]As#,-oX@(F4#3@Mdhqj`H1p\p,DgP!_SNm_A![7thQJg,ued0:6fhMGj]Ai)FDNM.!(pE#2RP5aLe-*977tjs +64IeO";M3[RiO%U->L"/ME4@#U=SYXnk7X-R,"*,cFYXhPsNPe>b&TBHtceBY4sJLUJ&\g89 +btUXH:mq_pb.#e2%)LG-raY`Wj%iWB!X"sVt7U#B+Wn`!bU`Q+TGiGFTN50L +0:[I^LZ3Mm5qc@.EW>d;1"eoSp^p5)W]AKTrr[0X0d>*\%.)F +\WmEVm/$JFC5hMo:Y\;-!mZn"=2#aRbK*WL'#@Rh=##2Kqb>;A)mA&F;%gpFU@Nd*o4j]AeKA +GIbXN1#dHmR&Q8.m/V$OSoZ!QCm$GBtr"7If8GN)nB&H8+mb`_bjO?ZL+:Hfo#:D`5RJS9hT +h5Xm(;:E^s4,ET5aenmXgP#:tuknrtocsS<8m.(gbel(OFZEUuRP10[#*5C`em`VkrGIHG*F +'*0Q]A1\uPEmVbE6q4'D'mP)fD'HLfcAu!0'!;*K9;M)f4ApecR]AUQI=EmVPKD#2gZ[50L*Wi +Jl)qhh`k]AC[Pukr`6s? +jo`5CK.#+/*G1)mAn1N^gc5U7NYV0/[2$s]A:$jlU"uL-GZ"5^d-aB_#:).gc]A09n_Fb&5W[ +.8`7,QY?aF*%&`XOHpXe_cj*ZULQEI0RW[lH%%%Sn2njDamcY4X:]A\R.Vm%0PAaAF41GXDT8 +Zto4pDWAq.Pno;h@0If;7NT1!Ha/N8,r3g>jr2Nm"K-=JTc%Ab+hI?"Anp*BrQp3pe=O!W'[ +6rq1;Y$^?g,+Yk(JqXjQfi*l]AiP+(0QR0N?GZ`mTL]ASV;>?+8E*q>`L.+C-PnO"*`4npt6+Q +ECUMbc:On;lOen""g9FNkU0"D<+RTU3+8UX5.-7,uT,Ti`oT>gSquP4@^dNUC9R607JZe*U% +CFUB-YnFqPk>R56G@9/rMYJJ>T8\nf1Ik1qCg^HPa:uO:ALZi\SDFG-oji#?8+?sEqn^d5#\ ++WSRM`$I9)t7u5\MRI'3>QX[9MVZTCp!HR0RI9gli"8,fn_^pBML3=V9jmj6BLLL^,jj_TUS ++2^[B,-Cr\%blkD;O^Q8tjKLR-Gs(l@_6YbNKCC0k&?2`ohRP"]A65P+W=1K)6D'hFB\n8TCp +97=L'kJYu5'/as;UkL6g1mN[dmUkOM>=Ycrg.6hmi&q=_m2%Z0%CCZ1cp +S7RkmM'%.'<)9-0X"^)'a2&[V2NME7omb&kk)-4Ge*iGA9M%,l(ho]ArlVXYD:B-SX^]A.0'a]A +^m'SP5<<_U0b=?+h@GmoU.clnBN0ZVqUuuM,CN`jhOehKJ`]A3&9JCLM']AVKVj4D]A'%c_hjVi +.b;M,em$^Q9V=1-$B8r9`ZGfKaAc,?_\`@(CheUH!tdnap/?N/odbAV]A`0TO,bh\:)l.$)?X +RIE7tIgT(E=ik(`hccKpDhdhdbh%Ga$`Yl\1s0cKWVX)::XY\>Wac._g3jM(b[C0`@>Z_:-e +f^K4-\o,C$k]ARh1rcU&85J-,p.>@]AJ\MQ8"%?WoN0k0E$(cT#+hFd!7eDHn4Xr42"c=Fa3"l +:JU1SXW$bPAA%Q)$A)T>CKses+K8?;ku,J(Z+"cJ^DFL#.jL:[[DB2*!YI%Mi7,tC77t<2(@.h?;8M5C(acj0_PC95_(h=AAp"37g9!Chq.L0)IiFoj::Rmp. +e_sC!,ih5!iB!$ghtkbq5WtRK=Jh1(;b:NYe?klj[R@5h!gq?[MT'0$jA7&!/ft3iQ-O!`f$ +rPgfln9bLiQ$A)4GRNfjoSeC&Fl=2sCWZHm18S_IptbF13pm29H0:rS_0H#8nE$j9/]AZTjNG +nS0-CHg(Dpm@Amrm;P$o]Ae/MXDnj1)B30Xg;^]A3r+;9OCpL/[4)IuQXqs&Q$"T8cL_?JKSp9 +7iRj#lQ_j4:TKHE\*@I8UkkK+f(:o`>YG^kAGYd6g++ieU$_scS(4VZc/fo1aTS;pdJ"O21o +>T8''8Z92%+8FJF4A>^OAC=p+b59f+2),Z+i,JK0Yd\?Ygp*NpW/";mLbol%jJ8NlLbdL5$qYOaPSVr4c12o"g +\qeUr,$[jcAd"jVqP\2dph]A'P1%6NJRAM2K/j++98I3%`1j?)loI4,h%&Cm'E>_NC4MpM\t; +eD2U>s5:-/lClGK*s(0WXIni;hM7kTo2Ak-DR2Wb.3WGY2?Xq0e`o36&?@mW_TUnRAC_6%=A +Q.DLq,;fQ__qG0Wf[IQt4P)Cq0EABAo"'sQeCuF@&J-nY`gRWL@11 +-u'<'H16q=C%rgNld2NIO]A6GRr<#=BP\ie6@YR)=NnY7T)U14FoldKAbnCJS+skA +(B9mRtM/eEskn<\4ID.AWg +C/_/;Aq)Rp%&K8-d!,gX0d]A<9n+Bb.8H6n;r;co[IMf=jK:He$<3`9FE`RtWXDM6Wgo.)3<[Zj,Kt@j`0PB:1O5KW)l`gHN9ge97!Dj[ +V4<]AD"[;\P&Fp_QWkJT<6,<'tIA+JMA\tR\DooOId]A@pgHMkN_W=j[H@UA&l/ikVM1%W`d*d +LPVom8jIsVR7-&<*2LFVul=Q&)L)hfq$+A2(@T%MGB0D--8IB*/NJWmp\L!J`BT5NCn_=!8h +kkqYas*fOh`>n0ogr%6W77N)cE1=nCNA;.j;bCL_NX%u9t9.nJW2ZC:o$CLQqJ^;L7nnKnES +1ma;H\-G9+XG_3e?c\:-9\B!e5Eh=?[/o$P4'd03JKZ/dqF-p`$Y-8"qXmDfSkEO"I,h,&:> +1"o=4;t]A;G(kKY>Nk:*;:f=/;4Y,J`p_Cp9(m?bI2e#T<"NA:4,NHju&hKB/b^0sf8O@oRBBC +k'/ZQ6pPs[Dq]A:3G:;Ss:GWN3BAsa!gY@q +%Y$M(_e;@)Bgbb)!jI5)LX"E\M2A_VTU4h($)El+#';6!I547'S4BGuW"tWR8Da-5\#g +U;^J-jfi5p$c9u!UuKq`20KJ%G`X)i/s6WfBgZ5rM6N/:A+0!,-g>7BFs&3J9'%OF^L[YZrU +^\j'ucN='h\"GdJ95hDA970#9!7ogCQZ]A#tp7IU+8heNPa0>rW=WJB`\,PKPA&gJ*:8I*-*6 +a'=^As%Xl>24Gi=;a86/22^WXTqD`dL0cM8?Ou,bBF$M=S8:aa'P"eDR[GHINR.\M.n04><0 +$Q4tqdZ+XUgaV;>bm@$4+MAa_:DC*M&_UIYFkL&L&FK'%OO\H@[/;ok;9$C/49.[ldB*F_2q +JJ%`4.q^ZPF'?tK]AkaF.>?.\"2,u=<4?PYPSm,?ZTrUt-7s8*,u>9[n/%hJogO8YYPbQ(P^Q +JYrR7hd_1`g[q&gs`=Vo\t&<69DPpXLU1r89:1>p2d/GCL;Z9T0c`+4;a0kr2BRGnfoJs/&U +Wi_d@$CHi\dn$,$8mE81,I(jL//b[&c^3@_ee/9K+kbJa3',K6@nG6YIn<2mg#/Z$q0?OC'k +kSLG"Z'+BILV"ICasb/i_YpY@3lOMeS'^:&&WlGtccANo8iQ(:>@(hiDBbOP/*q43.Apa0Xq +#=8f0CooPU:7n%^$r>pr$?t%,!3TSRYHnsu/Nm"ur8\H(5H2J/:QM*8k(@P:&;S'P>gr`TO( +)!40i@Bn";'Jsr@MX8Zdp(ZoBGpg@Upn!#7O.)e72di*PGt%2a"G"i8Bdq!cT=AO'tA3f_MS +g)9!5\i&[F=Jd4/.Th]A++^R!ULBK?7mi>oX,Wjg!QQ"HC`/M[.C<\Ch8"ZOZo\m1"_c'PJMEoYH,d-/bF +%o5W@D`97s-adcLP%A`[1MJf-dHEZ?mfJY:4.Ndr(7Pi,)00f$\NAaNJ)oEREX#SX"1PX-&S +@W.Hg3F2Ug6ZKc,Z"T+XGr>.HX[OsFmQ_NOm?&l!G$cjPhO==i1nCjd*KI/);LE,!Sa?VQTKk$To3)]A^7T_(k +sLjs6;_,3/"3F<`X//eP7pnmn$qh^PiVOti1`]A1;rH6)>:Sh'1W8\IuZ%fk3@;Q,))5.5/j[ +-%uPA\_?f?q39T81SDT#"RSg7GX6.<^.o +YE_e`NKX9O4iohYF"!TbHbT?dO#$$-4PireS)lo,-:emW&_*Gld)BQgDF`a'pM`8)^HeVR(I +k]Ac&0^iQD2B44++0(,Yi3$HLGOHL*e)1sKaND8JO2ULb`]AAVI4rls\5MT!Eg!2^pPA*Z%TlY +5DO$j;,MLnYVdM6\9T+*i*m!DI@h_'!Qk7VL%ni'#&^56dpfR\?:*d;B_@_=E0K`mUqe;`Nf +^*_#&^RQ1gF,@$Z]A9U^lG\LDumBn=JnE=r$3GZqIXpD^/Tk+KG=D3=&=\/]AI0OpHSEOcA\=% +5>MrQ5I_UOBdO<\>d`Rb1!>9Q97H>V9"s854K4c-E%t^bDJgm^X5*KOfXOc\l]Ag@ID;P18,O +jAlsd]A:^p43=c$=LKoKKlQb)gCKkKS)-8@ktG)rpo9B;`um?t"[p6*.6iDI;G8/u#h#:Wo?K +iid]Ao=Z*N`>MEAS,\qS.<.gFRr4B+E[EAC3]A.&n=:VNWQV@stlY[aDq_s''Q:F$.VCd0Zfm: +j?p"/=[I(p:A1.TO$A$dnRo,QXs>q@4+!D*C.c$uET80M-#cElIg#Q.K2OL]AuKIpT,ucbR*Z +CFhhRr1:+fO3ZnnVLe/BD)gYtp$D"dUE5o]A0%(-3:c[AlWn;PU%o<\+;Yic8=FFr +3FsZq`4aMd+)/PP(PHF_#]A;OP_FCjb-lLLMVdff_jatF4ZMY`29a(T5"oYZo:)G=W!OQ3/Qe +VJi?PSSRfM76KCQ[1[(l8jc)(>!WHI0^,sY3,4fA8p*Eg5/65Rmm<>3@R,K]A,8Dm\45`#`D@ +4c%"rCSB*su+-%!c@bLF1O4_:Z$*MN6\<%79sU+@H;\$;?J;1u?oWs_:/7=jc>FfcGS;Le:B +7&,_m:q6r@XKb`cX_&cD.s^lPC?7[nfj(ZF!m/*%FuXQQ]A=OHF\#HHVfG(V!C`73\p"L6Agn +rIceq*9">7Ne4G&J3+4p->aZBn1V6;P]AFI+'DOoTIMFXJST6mY8ULgh&@:dOuV?hBlukG^!X +HhW2skj+Yo]A0C*It7iOSq6%uOFCuQ`rL$OI7;>*uHMO&$HRp2N@%7e>2k!XRdbEaG#G=1:$JalA?Bq6K-Ig\[9tB2IY`L.> +Gh)j(D;iE>'Ak"HW_RQianFT(kp(DSJL_g\9NU/ZlI[*2qtp6mpZo\H +oPc8b:r?9uQVUq3:I(96ZJ;A<)nZt2etj;\0Ho,-(QdDSa*20f\ojC0diK4^:VYaor3"dr3[ +#U$EW7N2Ma1do'oJqs16Z/\Mc(HgSlnI32cF<^/as\AM4b]A&/nN]AKm)F")J'Xs7]Ad5_ArPiH +?@:Nbn(ZYD+:#X*Qr\Ybu6mG0ed..>6`a!#"!\s'aMl?d28BmW]AK/#) +'6J>?.*.%8-2NB=.LAUqYH#C_g3pD812R$2-/j>%D7HBa^9Q5T(0m(CTZ=@^[>:E-utBE5+` +j!I!do'^S,hSj`#gf#ha*7.,>/;rL.s*N>:smjf\H(I-5Z-A1lrg4lg__I`Gli-+c#Ng/Jn? +i]AbkV3%kn(,`eYg)BcMWKO,9uTF:YW,h/;mXD]ALo__*(qI7n7r7 +KVKH862^>3R!X[.fm$m9X&-hZ:B0/]A"e&-JduHg6C5=G5^LnR^,VNV'3.PRb_P?Q'o=H)kJt +i2M/Ki#c4.El3fo@]AV:FR)e0!5^Qs:Y_WSFkeS\8&%S$$57V6NR]AaSpn^AZ4+9cN0+b^TB5O +;'i?O0;i"]AAPHigfSMr?VUh,4qkcaaQ7-LB70/()hsc!'<74:If.gLeY&AFf;<33medX\/KP +>W]AJcI;;:mgP^lkRN1(Ib@N>)kgD.H0m=-#ke&mqnc=#pKe;.\D-4]A39NcPR;^`30EFRAb.%\e_e9Up!qUPK?A$QaK_0JWId^=WDhfbA,+BfF0b^W/Q-@$r +\j;"0BC43Ct9XC:8FPAM1d,&BZuteQQ:th#5d',n]A)#M,>/51)2fC-4Akpcj%GnV-t'o:5k6 +5'Oo9U&H+n`]AhaU#M,%5GR=-eW6j3Z8B7kku<+,i]A;)R4Q`Sp*iHcV$Bgh6WuYAXpB^l_p4H +MfLGK&&4;(p!Xh>'%hE>hW1RN9'!+CjF$DfKrqo@@3MK^$,9-P*IpSMO:b+,#6!O[=\kV"I_ +@SU2-o=57qW#"(.aORGVjaA(^`Y9fO'k&:B.mpZ$Q57:EBiCj5_q!k88jecNet!'jYV9CM>u +$aAp]A>pB/Y/s)S$o+s#?u,,k)RSk!;eF=R_oBL[NSb8=r)=UL-Y?%mWmh"Qc+aMgfl\'l!se +oRQs(n&?Z`'2c<+JM1]A$.<+GjZOOig\e1g!,j&"[ETVE&g]Al.fmj<>%t@*(YWtLt\8Cp6@,- +)uR>j5S:/,&hNWY676"P%!>g0-Ql$]Aqibq+,4<)*`n.HS%rAn7@8V0@.TP/ijNP9FJk4\`[. +UPnZh`7a3&Q"OTRb@C+O1(.U(c7Gb4lZR]A]AnhTEErI]Ah;Z\#ucf1Kr.G>?Pn_)t4gouICWB, +SROB^q#e\hSe9U$P?a+HoS8#h@3*@eTL&3h%h+9q9^3>OJ\M1AONd%.!GUkD"ksa.*AO+dCW +0J=H$Vo_>PQDfrlg+ckcpn=d(4)Z[ChD78"2jS?ED[g*V0%kfjR;$uHp>e[<6aR[bd8j'Dm@ +e!q_6CI>e#!&+_-rF)!KflYq). +=d>I4l9#o"7+(N]A`!?GU6o-Js&YSCS#F$$a5@NiHGddK,MJq.G+5Q7ukL>8&b0^mS2iHfL +QSI&c.g5sb.o@U:SpZRtk*>56Ffh>-\PI.T>ZV_1Pdg"d^WgR"L*pZ\!nT#L0l9"7pZuiocS0G=$42/Ha +/*__Z\CMA]A>Q2I8c`rmZD?B.f=]Aco7\dV=u*r2m;p./E6L51k2Dm3g%'f1[pBO]ACKkJfTUK7qpn'Qd)TO+3U,I6&Uoo"=*@o]A)Y2T^-iJ=eB,oeb=h=BP+C2p5!.[MMbPQ)`^\"/' +_*VS=`Hm85#d3&bHia.hHk2A@kuM,KoD&.B1DJ@f)2SI:Qj\'Xkh%MYW[ThNMUh5m'g@1CnO1X%O]A6U%Wm.:(r.`SnU\biq6j246QY4Hpia5q.Z4#b"k.+k:>\qE:;"mA +$9@j$3U=Ch"!spiqXJGQ[uWl,M,9^;PlZ1c:H@AgXV;d=e+F"p*8+%K(F6j:&Ts'IqB$h?,f +kHcuq8nlf8?VASgn>cp,`r+&h"OP?Q1K6a$uZaDA0"Ii#79j@($7?Lat;aK8>,8^.9bb(/T!4QjKcS"RdW!jhp#kiD$+u?]A\lFG$eGca+>`%?-/^cZWVt9!U+*pt%pUL: +b:*YhsOa9'6G\FPp-S9RcP8*(Jj>!M8@b]AFPUltC/aK(o!pD([BU,_?-b%/a,!-h;FKk']AJQ +_.np\AN@FY="R7"$(dNY%>-:4Pm)GX-4O'.WX$pjWLj*p_:"GS+X_`s1<3$DFBI>^h&J>I@f +7#8]A[AQf3"T,TNkkEcr\1\8/XF?tRd\CJ>kcL^$fG`6SWCeaQ0h9PA6/ +i3?0<.+>YUc0cY'hWY+eA&.=+KNG(OM21r2HPLRS2o8J+DsrstW@*2+3DqMtmbZpukq3us[< +j%Ch]AX4PJ;,@RQ3"cfAjiGL3V!j4R#r-ZI$(`i7pu=9@j:IU'+(4D!2(Y2Sk@:'Q?%K\IM@R +SatK.tLtr3`Re/,Rd]Amd5C?Am2i3T6eQPLL5*-[M'nI0?5#BUZ#[6CP5T-6e!AK*uYh]A!esH +-mLrlgc2^T8jC2Yl?ou.rmL;[%\4XKsN-:4LPM=o"#N4`"q:Y)OGpD +;[XOQQ:fKHBk8?JHQo9rGKs=d5I(DsUk\Ft1dc@SlCS;Am;a>09CYQ-.HRM`9+ek`ZWJ]A1#, +(G+:W-r7Y/JV+SjT(/4*PjfD"ZIX5Tf90ms8j@_3Kr?h4/-M:-gODL059S?7bqXo4i8_cL9# +K2ZW;Ii9NWLT$,u1!`Ik]A9s%;l(<9/fh%:-CoChRg.7ZRIbV4;N>dTCY)=:WY/FNr@Z[%a1e +9O"rrFVbpcHT]A^Qt.\2TjLV_>(%#tO2"lk2UEr*]Am3Oc+F1=;>btoeq7nh1\@KT"n,R92C7X +PDG3tU8IH#5rcBu[WM_NT2I[_Do;B\sZY2h+YDU8#?L\$';ITC1YAN]A$_YY3r) +Ejk^GfrT7"ful-im(\n=iXsm('Xu3mmuBONP2SZa\oC:ZG[;e@]A8Cau7VReG_XI??3Po*^c, +H)!3$*a+OhCXG]A%_bIWOVH`.\DrLl;3/qNnCu"%/g6YU@Wk67GfWq1moQ*@I3Wq!HidTECP4\_(=Z\rp&7'TGtHk#SO84 +tcidhe8\Iau#qA6p7%UX?".\87TElnnZAIl+)gQ]Atlaa"h+R;NrD17HQNj,;?c3#%O#K]AWh2 +`"dbr"u"G+4M"bW9R(%gW=)OkZ5!PYq[:Tq>3Pp%LXTT2A_:EmWrVCU(;lYZI\A,_B!6J>5- +>O(b0dD6Tfu85NlbcepKn,ipKII2X7Pj-+:G\5T(4E9,SbT8[H'/S?C>/X.SDI?]AO'IXu;/_ +BiVlFP-d/^C7SNp>+9jZ/q0rp@U?niM"k.(.7Ih+bud2<3?C>Mh5,U+Mc2uoM"uc#`cpXm5R +LAHl/Kktn]A>XMF,+g@?UD+O5.U.0^Q%TL*P,Ih;u27"js(bgWikN]A5']A99s(6Y6mQ\EAT$hs +Y&^p3u*fi&GRM."COthURqb*$O-@(0a$"Ct?7[ilPadI#PLGAj!K7q:8Zdo.,79Q1-^:L-E* +8XH9/M\8_RQe3&r^$b[;@1sNg$*j(O#$RL\BZ0%Z&)'\Yrd]Ao3_Mr['Vh_F;e$L2ObF71e"[ +RB[Lb)omM#0UFqBnXMiM=hmE\44R,knb@?Yt6Oue/b=INp>Fr&Zk_lchg$Es.H'>E7%=oAH2 +4qkR(e3#m3]A4)=([9_03)%'+oi\8"]AhICc5i(i*0*acTX#;]AYu4l=_PX]A_dO_6;h<9"+2&j# +WZQ_B*3uU"EAm.Xa)E^D:LSZI3K31Bef*9h):_<[]A7@3%pLW9.B[9VeG*Bo&6"\\Hi1l +De:EH9BC>URGk_lWdW]ApeX)-Pa(;MSn*>;C1)MLWs;4'"=_9WT,3+/UT@roho(g=s%2+%aA8 +i4h9blM)[SP&`mq7[I^Wj3fZ[GLB.n5N)Y]AcTT2@1YC^,+7D,Y=!]A;u/MSLagX?">=+W)Ni6 +)"h!K"bdi:NjJu?nIO8=kU/%6UjZ=lGK'52+V);C!=<1&%3%`)%CIYqPRh-&Cl`M:2q?nH@p +"SPDl#9iU`ClXm!Yt:oLW=c[r2q"(gl[^WWGU]Ag--TP'Dsr+He5%/J-Q8NPP +Wn4PU(Adm.XeD`^RAa:4c:N%m8L0^HD\+E?1-=Y(2.FZTQe-AF7k%)"l@('F6hKCI`pDNG$q +Sq8pqo3W2I__9iNh1)K*!G``[jKTUHNf\85^t6(O5%&f\)6:Am=i7:e(b.ra_>ic*oIdeU)b +>u$?&(?n`f:eZr)oR^&/BNj"m;o%c_2.VF?+3"#\o^(i5JVR?A('c&b<0<6c;,1\`ZSXU'gI +uSJWcS;E[&WU2nG\rkXFD>DrFq"NI?r[`*QD/9='aX1iMQjkOQVf4!_.4pg=fcS8q-e^lHoi +)rOUO6K1R!ArpHWn($!h]A\6?TBB5Km74nWYi7*3(5'9@mng(@,'=7U3H=GqIkJ+QV^:8VPaZW&kR(k9#\(:*YN,:`sO +Qcd:U[bNFZ[o$\uGC2]Amq"*40;MVo+"94skW!R?>YQL0.3$6^blU1) +/dUGe"`ZFrfIst'jr9T"RpW+e*M6ebn5Z9YKa]A+"?52&(,O-T21h5diLhZB9ZoPRa&1TrF\, +n_?RWaRa0qQ46erRk)+Di`:>j57,2^1]A[(kl?BB,lYspnH0jVh_,0$l@9EW'69rHB./]AP"/8 +S%_PUt[4p'_Rdp\'ON(?$^Q.jdV\%RBE2R+2B%m4$mbSlr[L]A+n]Ai3a&DI>^6Q[f)3*Gh_.Z +^%^N*dUV#c,e//=jj:3Bp7PgSbHXDD$Vro?2oJ,FSQUglP%6*eZbhQ-k3='HLArSAG;r#4q +n=",VTIY71b*\soM&T\*/1%b(bCuEJsm[EgdLp*gW#KEI$)K0A-3EI16CA?/KL;]A+@2M5cis +,bK"cAW$MnSuKl`S<(TK3RE]AgM=Bn&7XV)P0#B/TR1,\AFl8"gU9P(]AXOiiu?kQK[[$W/oKSPi%2-F^<8a&e&KU$Hc" +MRrN:3Xi)-$l5j(m8m5r;dH?*D`1@sc60+[E`(4.XLqXU^GU'V(X\`K74PA(R'L.D:7dS6_/ +f/7,i/ll%e"VQ`8_RSY<3s#RJZYrBgI1qun+0tSM9FP'>W(%m,G +^]AURDRQn;Y-\tWk%A8aaG3Lt[8$A4%1`]Ac%0+&VHiYK3'ad$*]A>A!T'D9+e^V3mXgRR+"8.bD4FFZg:X#s^NiPo4 +(IMs\bC4U.S49aHf=XK]AN@kFgt([Z4ZMf3=fg[e&*2*3u1[5Y-bpGr:*9(cKer?VIq7!JG!I +Yd7q?19OemJ1YZF7kaP"MZ*Hl)A,p/"TsJP#D(?aPZ9]Alm>W,mtJ#;-R-/MB^\#7laH;8G(V +rIL:o=urEqs4dBc-oE?*'(c`/Il?QP\&JsR[1Hp3?mHtX,ONJ,ePWYDrUH&lC=;";?B:tCm8 +EO3&dL^m6;Fr^_8"5`uH)/KQ"$nl3YB9*:mDQZ"$@%jVK9:T`BX7?_n3\Z%i:M.@dN8I=od` +$R>"2e+6cqd-s,8;H)<-kDPct<=BpCW+lG_mu5[4rQaj(KBF=:-?(8h4'V]Aq0_nfGJVm#'n- +n/cQ&*4\jf_42$/hr;$j#CK=t=n)=.fHsO)=>@jX0%-%53Xi%h0PS]Ara7'dT"@J!9;V=a-bk +Fsl]AZeCZd)`a8&2`D(NW/#(og-HIY-Sl21.%.-V^(%9E=#-,"791NZM>Up3rJK2#9)oL:llt +UB.DK/o644@mKEf(W2QB!VYOpS+D+"+9?:g+LGcn(u +!XfVM!8-'L]Ac,eBR36I4qP"o+lQE4@=TKOVD([#5tYOYq^_f=MO"PKB_!Lp<_Fl<6=F,BOI\db3uPk@9l9"eZKs5I,bN2KRs,`9p*rg +ZoTbH/r#,VT1<%,P.F%ilp[j88D8E#_C#@V#":uSK[Y5.,Thpt(Z*fJm;iEbp,1/h5.GWU6M:u'e$g+.]A\4C?*.!*C8Lpbd2"Mq2G,g#(tF%WI5 +dP*HHlQP'$5F$"1h[Y*^G$u:]AI1r]Au%/grBo*aiQDHhk +s+2=O5d_kP3:K67Cq?_rF'1)J`j2+SI:U6`plFDe`Mf(YgXt)[egc3R$K#-V2So\)kUN9"'62/]ABTB#O2]AM +s=$XF`:5aHOs+bsga?()V&gT."%k?V8dlM:mlI'3cN*?8T'^q#CT]Ams!1d*b?"SEFD81k]AK0 +Er#(J?_&"sa*@EU]A(]A%IV7"cjpNlc\#!cPd\KcN6TS'Vn_oShGpl=e3^q0:r4*4k`9dN#S!b5U<]AT)Dg?h`BLW8.VP]A`$#X^E)ll"Hrqid95]AfnSWFoWl0JW[ +bA+WJ0g&mCFJs:PrI"/82hiQ1puL+ZO6bP59[>bjhK9@I\LV7&4:#`IH4S9gNEgq`oDq5W\p +0F4s#Y3VBq&P%627K.*?NiNqnNZ^rR@Q1A'cC?3;:I$_>E@hp55MKn"SunDH;B!?9rm_TcY]A +C<(&WomGPfLfTfGX")">Fe32-@I&3\EnSkY +NqITJJIAOV]AF]AQGe@Salc#8G,f%m/.&beY6%-Sk<_AdMNNE,AM`eO5C>S)EMghKkV'G2;HY> +#dom7I;?>ALSVrMIk/VFFg8tPb)f6[;hEF4j3+ +sC,jkACt=dfYdLt5g\4s8:smsj98'YJ:=VM)50)#*28eGJAij9q[2(X6bquh?\M`h6;5B9b- +Kp4FO5BMq.3[_V^',O_nUt]Ah6X<>5pZ&U*;Pi73[*PRJ +([egjgK+H@0e#9^4N+]AR,/03,5u2VU/j#$DoXg%4>L?TdPTXWrFA#rE,iU+0Pbq8^lZ'>'X+ +JUm?7DAo]At3r:cu"UNNaXM?8sBJ3%Ki=]ASn4@&^a`$AFGWIF4lU"N&/2njAmIE]AL@!(Ij&%o2RH0X3. +]A@=;WSW_Ja`I"+Y^!r%'uNPYONjK2\!U0kK.&qD^mV]Ah_G3AMq!qhHIRHWFMt/):0QMEuoe8 +'g2Q.0`TQZ:Db(#hh8k#'&G"F>qLok\]A3gC]Asc_SM`s[M]A^i+qf0.R#@imCSU:$6'0c+UZRc +Q$t.;.1/_]A_mIYWlZ0jgR5eOhftK1C%Lc5PSi_QC5H8d)+EILML-Y'MVD/IF^6bQ5?ij="Fm +TKpO')<\8*jD6JaK-hkXU#lG5NQ:\i_Y-9UM+u+,YASLKffiH;pBW!`a&$j'jp_\ktInaoh9 +Hsu*r9knOGY"H>V@I)ri#W@T<5P.U0O[41(WMWUA4DZ'/925U&Vik^m*u?nS7MN8Ph`8(0K\A4>"jC6rol5n4X<>)RBh9,sK3)3&*1V[mV`Qne1bt +>7JlCl!j7]A@5QHu*]AN`&pm#0>W'lbi+JuQ$Nm7,p0.;2=b&hZ9]AD&kYm,tEt-U+!3(]A,VP07 +HN@?AoQni?r8Y;[h"*(MBVn4/3>2A>+`B:i5.UqQ9WSDk%cloig?NMQ2o[i#J1Y7AMOf_B&"83dq4mp)a9:,iMgqTB"r-nIb9,!'ns*3"hiJd#95q>8p +k)lG0ASHP[[I7t<+Ar0\3h0Vf(%bX>41aW!KQ6l-J'.$9m)8P0[e/:e +I^B"P!Fe#8Y`THWeCOG*Yn7lKY=$B/T]Ai2Y:g4lQmL!C?Ii7/pi)5e_U$]AeYhp1E2".YTtC^>HH',Yn`cm +uLk>jt2'^>EEOU)]A2B'^@9kENBu2rc)EZ\Vn?1LDX-/\c:LPc7)]AmP'JFIMjQ&t'F%5GS(Kt +jBo\Ql,PlJ%iiI>4XYG%\QE@7g)1]A'i=,i7L^:ZmSg22LYG@j)AiuqR>t44%$*bBe*sLZo*b\JHikq:0 +AdONW1fc=_V\!MEiK(ef$\2G"VmT@A9tN^**Gc#3bu*'X/DjR/oZKk?WGAIn$:E.Y;GG/Y2N +D5mN9]A@^^pNe)$6fG8O]A!ZsMq_B:MI$^"@T'q,MROmChf9isE\a8q_]A#6&bbVeVTNTSJmd9h +O+l:Zg>WU"t\OdJb0HLZrZk?ch>sgX]A_8h_A1D\-nsVT1-7PZ@tNHX-H=Fg/$$b_T33W0k7X +d);qT:QN(!(:LMRP7M(ifEhE.Of5H-pBJf#fT?@]Ah;RM+I)B%?(E:rM!r3lS,$4q@aI#dB0AjF) +#*J$B#N,kd#aO-j;=1jZZ)ih@/qIMa+2;oKpjk9TTrB;Q==Me%c?mNTa=eQ6U`"YW]A7/Z]A!t +CFM.Cbtn3\m1b[()>q39^[\LPbbhn/??+O+f1R<28TTYGfTEb;+p,5NCb03i9^Ls(U!m;SUQbS!UkQ;4e0U6JMl*aIqoR$<,0i@n]Ahqp`N00Rml)Z*oVai8+dtkIl0:0FdiJ/-"lJl>K;/JIbp-7sM7g!Zb81,?-.AOMdc=Cq?P[/["T3LLc4VlfN5S"QS,5drQBV8]A8W+nBTsH +3f6Vd=AZ8(f$#LLiR%?*Wa`(t?Um>[hTe`+.qVGa4W5@S':BVaEDj*m1cg7i+`k3=1]APWScD +QQE9ADJLULI?I53;l2b[`]AOJCd$ica/O=[hP:;D*o518gPUMJ0XN_H)K-^@LKofb6D4b3R0$73,Ak-7c,!@;@Nfk!j,U]A347[ +W&?G'X>X<$]A_$N-muc,SYb/d:24l0F$V.*a7&h:-mQN$g3!RL'4$+H6O(9Mao6b<3G+q=7Rg +kIS8Lhr;pE7/6?b,`!U/\I-CNQI.=jW1O)1&3U->P="6:&3or]A%T[CMFY7r8Ed+KWC +"tYWaSZ]A%k&+KWlP+)`Db_3&O$: +NrWD_Un"%4`)A"21nUF&2(X1)lhL%XoBG!*WK,,lmF&_+M:[uKOMEDj&#JqelT=It5(bmCq) +&V?M8I[U1s,\51(<+FNb3an_DW9(a$5\#Ch1_21V$_)7[]AZY,O_"`HmC7b*=I1gGkHhDe+;" +2EYpPu]A1Ps"/$79F"R^UJ!4\MbFYG=5H?>Ug^:FS3FP&Z(G_(J?dD"E?QY5mLI--AO=]Aom]A0 +OfBi'=ZA_$UW'$t,dGD`"pZN1o!Yc%SONHJ9msHg4go.AtPoCX\b%DKmVQKY80^@mFsWmQ;rA)%JemUQf^Y]A +$HX=\GlB#AhTJkZ4Blk]A%6f+=h:^HnPXu6D3UI2?)X<:>\4`'CF*SNt$HSnT[MiMnf[)!-_Bao%aX=fH9fF +:L2&g"]AAA`Ced&bm57fG99j[rQH+TlRPH;\/6Xk$")Zb*F9.]A9;#/<%>i#,P$+Jmk.CS&88) +b!5)T,>]A<*WK'.Iej--&:?=48X#NDo#!;.=+]AgS_)6XDV)Lk6#!0DTROsMk?>L=rW0M0YY)r +t\7GTi1)KHLdU.-o?pB]A.X(RELk6N;L'?GG^Y)p%sE3ccpoX7o.RA2P.7Ma*p8f2St*GaD3K +d%NXh*>9S6uh8ORb<+&CmBC=5]A@5XS8/`G']A:=1)CMUaXp'.`?\-/Jt7aO[AtK@-9LQ<1uU,+1%*N4n#se#-O_+j9@Um\OZVGP@`8MWf,G=TnC?;S:@WVooTZ6X8gU)KN>$Pq34 +T9+E(5WPet-kBj.+XIj1*Na!rJ!RMWJ<<5BS'URJ`93QD0!]AF/J10" +Tofj?F=3?hhSW%B5BL/gu(po2>hHtWEYHG*68t$?HMblal(P;)1)T]AFoCn(mBZlT)@nBR)A776plD]Al:`&q)nIb9jZDrH_V,@5l +m0.u?$X-P>#B8BO,JW=0OU[Zid.a`n]A^Ts&)([Yq[K=k6@jopXeu*B>*/+m,m[+moB.F$`ma +]AC*E(!\'P8^`u9)FBVQL]Adje4H?:K<$iBUJN#t)a]Atki*-)X%k?.:n:5Vb[DNs/0:XMto4<3 +I82StlHeUq,U@NU#EA^%iua)FeFN[U1$6X:K1(!qbr3268CgI>9i?5f0_IF3KKg +O?U)@;3p1iemE\!/NTtn5o8L1afIb$DX1Q.2k-j\`<>B1FZStYA`a)$*W/Xt"IV["Q6fu'4M +V]Ah&\n06]A2UE&VYMZ"Mr++nTZ!\24VK/=S'Vkf92Lk<4Hf8(h]A6b[?88X'(@HuY05*HSp>+0R,-#^ +g;Y4G&jA"j?r2@M<*uUR@KpW<&dN?n['4DcIRE9Ae6HA<'/*!XmjRAXF'0H-EFo-c-UGs?`(kU1^]A)TGbZ:h$c[tC.7gk"k3C[MAr, +;$-mlVi:aH-j<2PYZlA!`3bKIQEEYF9AK`l?tF&3!RFWB]AB4M=C3/F:aFEh8O`LWAA_o7miWSK1.K +558Zo1QOa96Qfb%e&0?6sIO/&1!?WI2#!Q`EYD%Gj/)"!s!J-_q*t$4DBAp\7_iT5s1BEti+@8*F!Bt#j'J%a-#;rt0/o +uhm*JKG0G,/!Z(ENZTeM\L_5cY8!O?Tqh\Y;Vl9Cm$_\P`-gk6#DP4Qdf3;u%".`B^A!@1)( +SCZLP%q5I1Q\H=BKqT^Hl]A"`-Xgu50q2g9%=@-de=LMQ[D%jDWKf?WAp".%O/N0Sc9>p_lGq +PRnASg8%G\";@fIT2S$;5VMXCWo5',rAG$cT-:$+B"nFMQ^9L*l>)r3<\\]AOA.Q;Ao"WoCV[ +c.!o=i<(a8B0l]Aj!-7OfNHH#"-kOnYcHaBjh$Uoh:9']ASaN>efmr]A,usKp>Wr_;LqYSb'XJX +ac_P&O`30`4enIHQ6[I`^#cp&*XiYD(#G=P-Fj+'`4Scf27]A +6M$W\FQPk%kGeRRR2(C_n==]A41 +aj6K;Pd0?U-J(DUreR`ab3;aQQ>CSc&f +s_8qq\1jF]AeRfuEDa^=Hr;#m`ds8Jr>>cf6!`@khg.YiF;n;S0M8afGFc'gm.#tApM[Wl[Li +uU\p,_._H#(&f:!W_*?HB^mOf@d:J7U/d=E!FBgHX:q<`7sibJIfXi-0&9[ZU49]A4fQ2Li0d +["i\!4*NEXJh!CUj,[@Y@TLK+Xke&/]A4dLc[j!?c3cnp3U(*Yg#As;\\B:BT +o]AsV5VM`7X,f`\bYR]A'd#fD[KW)F\>:^t7lkh`B8[MC* +(!S;I?^u-*&0C=A=)KBNS]AOd`LFBM8.DVdkEF7gO/M'q$#EUd/KslYTYqaYJmGSNb)kCUGb< +fhRIh$MK6lnmBT'_+4Bp1K:5PJ"N:R=DQ$B/h1Mc9CKFO>+qmS(@UO7E\\'4Fpbe`_4 +d&uB#Pjik`IJOOh?M./`GjZBAC=u!YP$6Mp("Om(n+MTjNYJEI%V>noM%MP;Ss=(1p']AC1o,5).,rh)(]A7:7.h%DjpMcSAG;d#2kA+qN_<(?$%nV55#PlJ+c: +5rJbN#2a8F6^7\g&KH\$CLFd!\O*\ksWg\$$:L?imjoFECWgVd7qotuXC#*q$h3#js6,o/_5 +7&e^LjK$u\@,[8XaZ;`h#&QgTGF:]A^u<#O)6&-U17ICf4p'm!AYJ@i(#[fVC*drR9c9WCA=d +ec>Y"/O,Z@YXP$;f^Ai!7rl&IKlq&)t\BarW)H5h0a*L)8+fFj-S,Oe*k\h!_`YWa,)m.:F_ +H5u@]A7%^$%"A_ha:M8\B9U,DuSF;g@9h!pB"L/AHp5Q,)ert(c\<$%_i#MnhK#8V[=aED*UgD-W4T$tgXG?Q4t&[[8Q1`-:c, +SQ(bc@6rfZfom!_^:7",U&3]A6U,e:ruo/f'U;gR.F34,V`clp2-!NMC*=33fq`??M!-p=()U +"KnnY!9%Tt03+I1-QUdM>F#XakU@<]AeBi.\jVI_?s'j@r_*DDWF"?si\:)U:+E"VS1[!mu0& +EVe?ekn6'*W.7_'#:LJ9B68Gi6/3qGDZj^rC/*^'Jd"p,EXRrP7UK`94I<`cFV[Y[k_cLuWY +PD*To.)IA,orbB^if@FTLO4p0=T`Z5u?Fb,92AFK$3)^q_.*dVI+E!Sb0=bJl+&-.aQ?]AP`- +2?@_\FVuLO5d$\c#E>u3bVFCmUq+@1sb!1hFoEU^W^^Z`!;:IDL=YnS12(g(aHRRN!WHYsQ4[@]A%]A(?K5W$f2W+X;20)o-`-/HmZE5mt_I,o?c(]A8 +t?\N).5]A]AAEUc3Bs13C2;.ILkS.2Z\>`9qW!qcfuE^BP5WK'OLgETuCA0,?naVoQCoB,>f\:.#CN +Ii9:K1+744U`V''3+=`7E%*+=msr#'3H2_UJ(U_&,3]A>?$2]AQ"j>hm>HKpMt&%FJ_* +lc<`Cie=5G[?%O5i"o'NeUro?(=:'-du`d@VHgZ2meOBL"CjViUsQ/"^2-X,jc,^.c'17)Ka,_OZG+DcPdQd=PaPLDOQ6]AJFsX`$MTE*JjC +*fDZ]AU0sdu3&DQkf&m:9 +9XGcU7"?mp[CCP21TP5kC)9pm=8A'sd-k$ +jPd*VGNZr3Y.g0BkTVlbOZA?Bg,)PR\2(LpLV/@Y-MF4WlA0Fq`!&ZA7WT:bF-l-\T +CNiY:AmiU<"?JNH)t;e.)l,*JlbTp;YPr-bSYJftsa%A!'R?TWd%c2rqpQZAp'(DU^L-T=t\ +)+6mgYRBNISYgRXZ=;\/)V(7%3l36p]A=6+UcNHVH6Eg/5F@Sj_:#SHN> +Z=7@$?Wib2PcV,W,Y6DNjdb^F?ZCHX0iH+tYReM9_]A`j<796h9S3/%KNccjgA$:KjQrBDs-Z +&cGdI=?/5GOpFSJ:\>1Gq\(`'XJecc%pSeor.BB0\Auo_/">[0j.E?7!oKhdst;ME]A?&L5Z, +1OK*+Pb`8D\(8nD1:5Yc4uXET'qd^V`&G$)=DdT/\c2j:kLa)Y*):Xr\jeuB29/ +ien`T]A5c;J0:7):t@r:a[uOT(76hJ%D.oE=kU$8s)dU/5$H]A>Wt4lW^(86iq-* +thP(5*Zj*@'AGtLZac[WSQ=goK<6AM@n8te#$$J(]A%Fm]AN!Rh4ZL`["`8h^bFcW4?[gf0BBP +Fj.I?*\:("oHD.rF3A;<>7uCo6,-(6&(aY9I)UF7\Pb3D+dSj[5UV/)#hK#Bc-plm&$tu3iL +.D\`V83$P]AEpVNu^I@m@hUk[N)FXLBD^"8p,Wr:pYJ?3(2-+YrPPq$FO'?>kp1OK"of7XJSj +\b`e1T6Yo3FVleh>H(uP=q+0*K.Wt]A8?*T%0?@l4>pN\8J>-raX^i;^e\%nYSJgglDBf7[fJ +d(Sh6.7PBm<$(WCR5m>q*b"hGfsB/gWp,Sn;lXT<-WY*I(Dl*$:;tZ`+^S^3NY#pDL%Dg!erUgl">WC=TCtg1TrY)m/hVQFHn*_QH(q?B\ +T'IGs"L\)S4dlV`.K=V"X@4u2AY#mDqO$OZmel^1=a5t`i=eTOC4^_bHO#cd7LV"RRL`;.[01 +F4VnOif4>8I+e@5;1H%`]Atk:n=!M/(\C7An#rUj$#$B8L1oeiaKpcG$C1 +#&T4WH\+67n^i8l[i16nGkiJ`C@LW%)C7\t;CiV*$5F\cq(s!fc4;oqg&8lp<2Pr>'#\jSM@ +7X<$S:muau3EhUhCOOj_#RX#Fuh>c,r,L\tiMNV1]A4nO?%47_12qpCVIEQnGrD)oO@H\@ZL< +X=mg,jg576Ij::BKiJa+*T2I5(/**I`LL.8;-R@7bOr')%+#3A`ieigGte$ ++0Ium^)RSnd,\RT<31@nFqAh/"@hofB&c=CrLKA]A/c)]A*mmH>FdKkl^4O7FsPNJDZt)9H +9+PP4gq:6S0Ag2^&D(g6`2,=Z2N-Gr#bh?QinoKP-t(S#)4skc^stc-3S-HklOPPlkMtQIK+Vc[a8o,GXn(& +>2dk\;]AM5S[-2OS'EGp$QH@ShU6hArPpOCDu'-#4K(%fC=U!O.;k)MJ>DmZE,]Ag)\lp9b>>" +Rp1:U+t9\+J'GgX^N\gIsON0^<7E&qYQK1qCCr3_;Chia"K9PblPTe]Ai`c!dtL1fQq!IXo

SC@iBUk_9!]A^qtF[_jqI +]ApT"Jq]Aqr,bK*X.tD]AO5`)(."H,(XFToE)g>$kZ&op@'T\hbpX"]AMosd)GB3,3Wlf592C8Xi +b?ii$LAR4r06?4"Mj:2@Eo"A!QWS]AWGF2Ad>I;mjB-IXiYZVIhJU6eh]AmKa5:$2. ++dU4$IXP^llRSKU0d4WJ,Gei.f+HNp+*fB+l:W7DbeaoYWR-]A274G1TNSj2D$k=8@oht2_.! +(#Sn?Y]A:\aUF**"+ms/7I#8UP\TBq-75nB*NQ>$.U0F^af:Z)K63LC1`6hoNfp\7`8+I*A)S'/b0D%/&0[]AW_tZY&%(*Mr ++EY9nIjBIb)?Y4,t@A6n%H4h-6;t(]AC"DCKDc9.=D*)rWZ[4A51)p3M`<^IL+EjTs+A7h\FW +M9dX#2:)"BY,b4jQIb3TD3aEPF(hS\9Zm[8:r.KU>obHJMEn7h%1r%1b_PUuGQ-;.6oHDn`' +d_/2OQP+]A=2L#AGWFOa9hR!jB[7Vc0[#7-Il[WaN1.UahaMDZ:C&rk$V]A&fGX#P[@5)&0t@VK6.$_'O:0H+)uR@bD+R:[\Ik26<:+4R`g> +NNo\LR/:dLno*#\nMLdJQ03/efp9\;bh80"Tk[lqJ$UMlp`@fH0\(QArZ0jF)UMVsEilYsq83JdNqOd$a@0fmTR3[Ab#kJ +F65B._?1]A6WeZ.2\0>OX4-&di-<(9r%_cTdi>J!QuPF]A1!+78N^"e@&XgBR+t5tjaANrbQeT +t6*K9T#`'@5SooO-/);9>fW.M$X=.E%8)qq/+PLT:E-s7h4LV"eVJFq$h5I=>/$?^c;;crNO +LAj(H4d%M\sTOC@uM7n)Nl\ZjU/U'Q=PeulD*1g+H$uTC0Qj +&"/f77BUX6MRj1gU(p%R:Ckh.@%rhMC^S2n?`AY*h)8q#7+:,1O<;D=rGOA02=J1.EpesoO\ +@\e>AA\&D:1Yl0RN@n4i")9KUE?ENk=sPRU1%jTRYD8Mq&?iF9lKTqM?2`AOB[^!Ve+n+"aZ +CWl=G`9oc5k/A&U8Q2UI,cR[89c7W0mmm@BjdA431F:ddh5psaK'WFkUreGhgNM=8X'D]Ao%D +ed#iXLgr^(k",iBua5&eQa0!b!;-:E=_qm/MQo\i?AU>p(8^1c^`a)H1`X.R+UrWR +-iD!/;WS5?0B*jce4KASfigdCTn)l;n3Yd^,P#!KIPRXT-%!18Rfl2R,+!O.Wu]A3Dj>G(&+hT?]AO`.@mA +&oGS"0N.F7Z_jD6dUVZm]A"8n%?m]ATsLQ'AB5_6LLJ\1_GG6fI9>lVbqBusQj6ihT%_Hfn%i, +L27\Q\77B3f!djjB30DUX'jpI,2nIf!#0C7*FPcP1M.B,-#Bi]Aat^il +VT/A_H]A-u=s&*G0a%6(3bAe``l%2cV+J8aATUb"=uA&HP-hqhYe_Zk:0X?i@W,Ep\8skS,VT +cQ"Qf?,&+.Ne"?3'!O8P@5o"TK?$t"u(kCu:#9)`=GVU+?mTf'V/%?9aAYfD;O1rc]A5HD3+f +[4(FF)[:nr7lN%^WDr)=OV61YYDU27jX%j0c*hMIk3E0n.`2H+kCnCjV +s.\P+Wrg%SGMgq]Agpuj.JF]A32G56M8M)TM/caDa[7)*WTdD;AGJWZ;` +e!ZnGZ.ajLqTbTJQ>;I5B)dk@Q0s,/X29`TJ%WooEGB]A+eo`L<ECDhLg_^OjuW;dOc$ZG?*VQmur +Gk$[I7o3T-H9C/[TbZ(ZlQQXJr6IRj^E(:Z?,c?ZG]AGd6^^M7Lm(i4sOLD;3nE3"Of=.\1mjPJ4Or0r7 +Ek!hj42_oH_7NNIBHgDPq0Jh*Bk9^HSP8sCk`pk%k%o]AeiO<=r>\$SrQ"tr"_o,3Mb6G*-Wu +kDUe[,0%l&2'$A<+3RHSV=7J*$Xr\_XpXpYVSkkN?d<."D!frOBT&7c!nsE/O6aE\CK?Co@J +fD(&Mtd-Ua>/G24HfA;%q`j&XKXW^kqBp/X/m51n6!\>(/]Af.#F,m6_aQ-t0_3XPuc[%Ob;F +`/Gs3,\@(\e(&T_Y[I1P6m_VYSRqn82\HEK,[dF/3=?D>k[@ZRmMGGAbfGa.de,=[AU!HK>_ +eOP_9tp`YBf",e!=rW"*p2h[Ab%]AM^`E]A5rR&YE_V3`tn%7/T6(\U;2A*q=?L_K=Q9Tc7?#B +XW:5 +rCL5lS`7\O0_Q$[fW>+qaTfi^4U('aGjm)3K[p,3I9UAGSHmqfn8,lW5XS^&?r75#QJtYc/V +]APs-^M9$sK^l]AVhXc/747AB&Kc._&sH>6( +mJJdgQ_;]Ac+kH`5 +uj]A9T#a\#`Y'8iUGY=4'QlD(BB_E:``_:>l?4oV;p8gZ.\09#>6/q +N]AF!)smN0=`'OSiuq_WcJOKZiRfM%j/Ws*)fnG*5>a,dId"j.P#EN.e*(+d-3b`!@`>n506; ++"@*\t^"^bR,8.:O",4F7DW2Z"/1PQsEpg'c2^`QVT(f6!F!&'TI""M(rUGnq#Kk]AmVNrdD. +4Yp+Iq_M<(N-dHqX8H\p0nVK+198S5'T#9)bC@'Ni8f&`K]Ajao$PTrH^d1)cO&:#fje=<@D< ++.-0?0nIUWu[eSF,QK.mdLp\6L`Me1I[S9V'61LE7>t +4;\q#m?,U;r,$>^?(>?Ij5&D)+[bkHJ5mpA#%,-S)eS=7/IT/'3alRMr72K@j%SW?)FnO@=M +UKlL!p1-b^G/'1QVWDm=e)[QVF/,o>(>ORgP7dn7oA23hHQST/\F\W(/pU)Z866Ru9RrO0,N +FMR,XD7QPAXkS6_),>1.Y\?IddGlOE7hboW>QRE>`s96;#D?k5g^imTpmBK@bSSkcBPTJ)%o +tZEZ7-.DP0`eht*?c+*amg%GK3@fj>$h+qGW>WNm_oj4EZX_LoDr2<>j^FUmel2K+#TlMs2< +:;:U/4$>@X!L,CKmYk;]AYl#A`ZlZ+a\@=2#/HHFbVKE^plJ(hoJ"FRV,ePNPFR8EchmrnM70 +B9n=FHrC20"j(Qa[`5X2BH*6cN:n2(m>I:h[DaCn?[ljJmFZ) +(.@Ccj:q6?h(%mUqf5DFZC',)#-;Y,HJ^Vfn2Z'EY/l.O95aeXNEKc?rEq/#,OYGrXkPUlI_ +c['cMU3ndDPF#b@-48OLS5XV5jPl>\F8Ae:^0IVKeS]AS_o?.CpoHIZ7UbQ5k(+r#%iPRto\@ +YS@RCH=f`kQ'J*Q![K1SZNOs85iZZi\@,$fQVp7OB,U +.`in_ng,N\3\6=j6^]A$0kC+ +`L\ebPE?@UK97:ScX4VUGp\#7C@FO_V]A')gkD5Eno[Q/HF*8n*Y)f/&rHZ6BlW4Ou^c6?tQP +1o%^4)'a0j?!r1ddjt31j!!ZlH.ia]ASAq,k\(&drRpF07$i+a&-IsQ=pQl8NJchmn0Ll_q#* +eB]A"S"B_r)2N=>ONQD6Wu0eYNLS1AiKF6>I[-+@Ib@qka/>_g>+lJ+[GlhVb"1sI(p*em$nO +"_i>hOCWZ``3ni4<.D,]An?g^J2LLK,-N&IjSR<UN22BV"bROBqX?^7=KiPYT) +17X+VqWNJ$\F#O>h/TLQA5>>E.<`.(&[=3@,WSt!PI:Er(4R/[`ml?->qHpJn%3B',ElVP`, +[s2/CD*-FPaYSR3@hH]A&WZ4*1E=QjPdX&.5PKik!/gE+oZd?^fdf#L@Bc7gF;b8fP@("[:WR +j/)PS$D,5dC8t(4AC?i=DFdU/S'qg*o5MR^rI,,P>KTY"7%J +U^4*B24JumQt%1aa-7Pn*V"F8_[Zge))cKn+)+[BZ^6.A>-J +ap]AkVahCk`$Q?iD5"jgL,b>;>*a6ER[RYc-[eo\(Ne8=0nkf:T5a]AuPd=9ruOD3h6`QJi6b> +B8f&]Ag?K[PHdFjB2$M0`,s3Ks#X[*((sCApAlY)XWr[H,oKV=*16,DG9\/@BCV.NK\u>ge4= +YDIa1Y946kreQLcAo_B('.DM8CkrfCBX4!3pDK/goS(:04[I*N^=UiC6SA\D+"rjJ:@o>u%) +*;;>R1uA,Ahm!GAXBqu7q,mTBp$pkgTFiU=Q6h/0iUJ`4ApZ-mdk$!hJ#T^Pm'k5Lf,h#;(6 +Zd3BFYdqUJ1/J9j)M#6rDX&:\10'-q7sS&n(+O"/QoU[V!EU84HjFRg=b<3mBhiAF%OIZb +Eog8:Fd^m@WcG6Q41cUWT)T7Qi=4b<1H)j*Bq4WD@-"R$+mZLa-k[!:IXZE3 +f:NZ,?lGqXHW^KL%XTr?m]A*ga]A5'6GAl6U+pr]AI#Sb!h;u=73&ct=2*//#ShCIWd*Y=Lursb +U0s7OcMbk:]A?Q1bmZOK/7PJ]AKP+Poih9u0QC'< +q_g"fZ.?$ST0\CKrRD9_I!QU +;HkbYZZ/7ZC5TfOWaD-PM]A`G,^HMdLA(*YfIB,3p"Xe&`D^E[^ClV%fIR,GW:#,pfi=8V!t7OPjVnVHStAsQe_$388=<,`4[Fu;Nj-[.D7b\=di;9T]A^LYh5/ +>lZ@b"V)+XQNDl]AmVc8Aci< +b]A(mI0XO,6_9bqHK'A5kj>aZ`(2mO# +6[6oQ;rZ^%'YDC8Cs*Ra*\^29Cpp'G*&%TpkrmLgk.E?eD2o*HgX'ne*jVrt.fLh'RA@%ac1QrF(OhTN-5Zke#Z]A +]A07Y*>ttt4>Q2=O+sQ@N4c%4ZpO6*p*)J7Fsf]A2lAtrinQ3K2P2[t@*^,##^U0mb3VZV8cAl +,ASt"\2`PN/?&EMi3q57>#d=cc55;W/M.b@!0POi\$cluoF8HR;MY%W@Fi"?!`'1_Kcn:q`e +.KcuRZA-+lor\3j_H3d4AM]A[pN%?h@%+u9)RP9Aj0mX]AJeqp\[f7%$\**(tH-+sfb'5e_]A!ZqT#sSB6pQDO=b[,l3MQ. +8'EK-]AdfP-QdSfu9+*;a7j1q7a)XrG*11KI7g,7o0T.\p^JTl4j]A2aQ'CJtTuj1:6[dP0Y%j.o#]Al)="4']AsYSH1` +^c-dQ5rTMDuQo)cnOK$0[TYn-AQES\teWq*RJpRgc-/fJ+PUQ&+UPiKBh!]A\H61o,ADsX#I#5ZQ2p==kr)b!@e5qV"li@E'E$gdSh2Wq`b?*O90]Aj?]AA$]A=*dEp9g,/R$a6b75lhK^[]AoN`9Eei&<. +H5)Fk'iOR_I!Ti%Mk\o)i-(3Hr'`SY'V[(O6=97[XF*;T"CHK`+E +0KWUT$"Z4#1"+K+2#_o4dH'K0J0H6FANn6+&7S-]A7GBgSEnN>G.Il"FZ#nmblf,TOqRkuNOC +Jps[!HFfEW%jd7ADRYPKl(_A^[U^]A,@(&N-8Gi"mk*/Q +]A(CCa=BtcuIpkfj3_U3d)kdVS@t+B]Ak'(6P49Wm"6DkMi;/4(]ABNb +?VH"?dU4a$<]ACrge".>\qSW%(RX@?(YopG3)4GLPK_F*93rH_886U\?Ma76o&QCZV_qa:) +7Nl-n^S'4'JJ,\Z.#6N*Uaq=M*hC%Jl.C;uMfD]AbmPo11IIQAKRIq5aXGg=i(\A[`]ArL_"Xr +HRb\qr1@qr`j9qR&Nr2nXEn>,LF +YYiMG>f=,c9iIm*(>hpr/l'c1&bA`tKR;6V^PH\a6ZgENac +NKQhn<7-aVCXD>,u45;cpK2!_C%RN!Ro)#/cMVssuXT"%^Vd2#EZ +

c&AuRQ-R!!?Dp=COVXH$nn%/kRCil;n4oacOo4tP7r>Q2'S*#22fE9OZ7=4SD@ffu!Bpf6A +43RKM5,a]AVRp#Zl_1JeH51c!BSmf)cuR7ZNAP#:j<_;Dk^9HGuO39M+S[:0Y3m$?'`WNR8J6 +[B:rJ%q:H1`ZfO,6/O@ZrL`iBL&:nd-_oeXrZ_YJsRE;Nd;h.)-T.37N\dJ0aE%V\V#WXZ%L +tqL+Bi?XhQ]A"*:$09O-,R/$,Z'o:U +,_"65-di9W;27QX%aR1n2UWL\uj6o@n@`Y#ZCACf)A4,sjnHcuL((iH2-Ee7(0lnBjbJ$;:Gr#H3EI,oe+:o<#f9So?q(`_PJq +W2YSf$VYWSMZ"R:<)]A\?C32!5_*CC^Fa+/]Ag6geE-(DCn_,J*Pa4)+"fHdrX34i_^/'9C?YM +;q,2XPS;gOO`^!\9`P-Z\V=!76\R^kb@Zs3E\4\Q%>BeG+dkD`Y.F+]A +3(DQX%_1jIT#TL&C`Frnh44m/;ArTBD`rlTEMZ>OUlZ44!&9J'[ucr@:p%*ektIH-a,5F6n+ +e55i"kEV[`MQpYSO!Ltn-^%']AkXAlhdBWUj(q"]Af\e=FNU*+W^"k&e4.if`9hkg%q;6e8;eo +dd?C5kU[ZhCl'P68<;-9r@oqO^.Qq?PMKS/mUJ)BK2u)?k3PV1<+%eEb/L.Whk.j3`?:&/eeX=8P(N& +'oqot.L8R4(KoM9t>T'o!l5-EfS%`.i=AW)R=D.WLWP/UG5R'Idu]A3ir/sZr1uC +bs>706@J([b=uFRiAp-C6JV$$]A/nK$$<\kk3)SorVl,:&$&!aVQ6iU>u_;g8\'N@Zu]AQ36a25A[,;, +4:fsDg^Ymp&QsA?>MIe;@.28??B+@qN^busN`9"Gg&>+I,Ggs8\"",gfc]A>D/:id6W[\6)'Z +1=YgpRT2Dou&G6btut"L\Php$e=o7@Kc>2I*nNH9,5(j#N/#5=G65"(d':`9('HFrEm7.TBt +,p8q#q_.?5$)X='%T_Hd-"+(4T?886O"q[$A3$=\EgHp7Ic6<2eK<"^919$a%;-S8U/ITdKq +m?aap52@hYH@LL1bsg39-=Wa$O*.hWmk +^Y*ep%M.3-K=Vb$XW/%)RMoBUa$6N!6-X@YK/=U-+3"Z!)T9Hj#+9[h!tR#c/GFSg19$u=fb +\Il-.TWTr.K`mZCd>J)q+Is)_b:ECJ'gC^uiY9(aXh0*)81UO(a_6p2FH>8Kodam/T7A)tI@ +@I76;[IElhcS+&87b?g89%RD);h3I:o;KCX)G_>k\*Cq\&*t`;/_hKRIg4pZerAe\n56\fmj +^I=cLSC+,d#ddlTkYnbCNJ +H6]AEQgLb9k"oaFP<-=O@coE[`NJ;6@dFK'Z-EAN">OcNb"P1M^HrIicjD%h23?%6N6X1R5Tl +uRkb(7GgP7Q[`D">)g)u=mJYSlmr,6lnlf>1J-hO98I2R%%aY:d['"ar$<$J)$FN%J,Gn@"p +Vp\*+s-6lcqd#g7P<04g.#rgAq$2#NR%E^=FM"Kqmj-.c!Wr<%X2$u;+R^=^k+-]A7jt!P.L: +:n?URHDK=7g,sgZ9!$onM-tTOm/\"A5b/r-keq*I?3pG0W^E5=`")N8c6tUV/!Nml*tIYSmQ +L&TWt&33OF%"IXtrY4_a(K&M$H\P^(Z7(GK)3YC0Sf^W'' +UZ]AWo]A^Sgoqs9u3S!#%No,Ea^>F@qH'U+?2M$uf^&O$Tl2EjZ@0,6mG+kohIeJnKX7WVsca_ +nA6]An%VCPd?DZ:$L73MEeImpiJT-.Z8k.nX`;FC"ZdEVWtbi`C!?\" +6frLM>FX@rVpjJE/nh/%($QZ^a62E[]A7khskdg.=$]AAi07e&YJM5\kSSOJ2]A0!X`BWN*M/q5 +F,T26'pIQQ,_XE[fFkS)kj/frpH,Z[6s9+nH.jqm[VPIq31K0:E!@-="B=Y88e>F6ZgB;hK: +4,o+R[r<9VPq&q'SV!O1kTCm\pdp7WqI_/"q,7iKN`g)pN?N-bB]AGOd]AIS:V78_b4qkPH/=5 +%uug9]AAE[fB!tMP5=:dXS8 +rC/VL[;&>B5>i:4nWRO+Ud7s?=IA?XR=a8m#+_jkR.lB4\!OqCPQZ5-q:>o86#lclN.460Zr +Jk"YBl=(/:lP<.SF>EB_HSaUrA5\fO/0AJEQ"Akcmf-^(5I;Y_F@P7FWGK0!2bcL(2(X^f +`PKca$,urahS4qSHEjF<@D!\%1XHr@)BjU@I&3uKRnU#,GhWM:,%V1H7H1gJtfRMF3ijnT+m +S/1'Q:YtdCdkJ*dN,#702:VC<3MLE=oT*s`2mN&jp/<,'kC4Fmp>VaPS,bdE_1T+[8+]A9;sL +f)9^:NhHddgl4$j&\pM\s9+\YnDD^"rNk'qM3OF`a4U&)VV"!U +[:j'A*;u^E71b:";-^nXHHRYZnurJDB:Hof3!hT!_H^P#_cRX50o%QHf\8gSkSd[gnSH+WGk +?QOKU#oh5g[,G8O*'i6r$CbYe6Z?[OCDp.sk^hg2C+PKBD$U]A@c8TLTlZJrOP^&`!;4hs!4d +>+CF;Y8;h8p^2]ADErS2?]Am4%'j9B6Ch?$*e/"8V=kOCl.A+5Mn^*/'/To*Rd3f@n0F'J*aD= +hp-lD5t=CuaXb5Yk4Vkb`"g_&s4LJq`bnbB,fe)%eke?=M[Tl]ATG7BtLB%#krE1Y^t=Scp.O +7:Zdf9>3"YnWOLhjd)-Z,^urAQVa86[M\gsMpbHifW))/Y-G%,nAm>e6X65be +F"q?%0*$LYPFWhHEu+2qJqBheN$1`8Y7r9rnaF74g%q;_K/&R7:/.:+pKB2qQBA>A%0+L,>[;,mP;-MECAu^E;Dn-:i)#[CL=hh"Ka&/ +>heH$4RSL\r5B*jBiYpeCeaa5%2?)Y>>Er?gZHrau'1`\NNl@g<]Aesc;^rQc4bjU[0]AkOn_" +OI?b#%^&(]Al32mX!f&EmleR9BhsY,7Jfa$%8=0=YhY'h`9u!V[D'fWIJ/,_+&tUsSO8mPjJmaFB*5*YADkS +'s%2,GpuIIR%#P#@\K%/opgKrlOeecV#YEg,4$J$c,'J%"lAu1n,@WBg7.8^2tH1SG?-d@OToktb'+TKJ3[pT>?8`"Kf:<<]AKhk[a3)erKEl/T(aQ.![=. +MBh?8hlojmH+hp[/oN3a72I&keigpJbp2DgLoA]AB[)J(@0OKWs_Ya6HAdG^!gl[94TN?9S+L +"2c\$RHVn)?NO@^3k1S%Zfk63DPZ%XS!jH'l[1IH1%*c?Dn#.mMCAlF^Vk?,ZbX2U":.o.iIVf>"(g+JL&3C%TH-T"i[\n3)l#hXi48cL_+ucRA-L64.'3(hu:g`&XC(CV1(,2%fR)rl7K(^/[@;jor[Rj-n`I!:J4EBE<^*9LQon3 +Cu71BW]AN^T'$Y)fTSE%4cn=1s(,jhgX9f[B8QqKj>XdPX5!dA#!N/]A7ho.=VM2.Q,ee-'s=8 +IG/.dpCn]AX%Uo$q\de3Wc=X=a"p-"$T\k.OamA0A^npBtpkdqYimk, +ckGe:K!5Cbm"gh["ZqGj@&5AGW]A%WI%64FicUDqKFpFZsh<#l+Zk8[^TV[`G0P'Mm[H1+Ph> +E6?6@_Woo\8JJEWSjW7OSF#tXa2rIm">K>5Uo=*P-0*sG)h*18^n\:UY=,`A3$i]A+ +,[[uJYl`P]AiqgVr6g,tA+Q]AiFac?0PC16&DTrlX`UNtclYBY$#Gq/I2K-Mt`0I>]Abnmf"0Br +?6:)U$L=>Y]A3J:k`.'.Z!j:/:bhoj24Mj]A>@@-jQi/Lb)is12iR*s/ah_J'@)S=+`aN:BYH7 +&;Ucs_Yg,5+gHQCO93Y@2/)#l7pF?pp:Lh8fD]A0!1^n^./H>#)>" +C#P?s@4JZf501EdjR&*Mfi8e3!?l)?pAP#kN83Ma4o(OcRZ`D%s7uk#lR?B/nZZUNlR_jeH@ +]A"(QR62&uKl5EP,-,Q$!s3n`'-'pKhV;SB+I/$1oRf(5$Z-0>#,G"5WPW2`/moE%mUA+G)uk +>c1&M=5;1.G@HIjhl%/\dh>GH%$N'/>BUX<<-f)NCB3`ZIN1M&_nUj&QoG30kTs%WNEUQUa) +WB=)SXoX>`J-Wtn)oq@`N0!:;]A8&NIKY,Wl]Ag&jV>.RLg=hGghu!TSNd0g^QgB55uq*#R0m7 +9"I;<=1ss,Wc`3?dr8HAEDPO(H&qrsl.Af-c0J)J!3e/2eGA4:TCk"?AU<8OE54OVAQIbKb, +7s'FZY*Pg\&"EEouobEE/`+Q`#=iL@8J5X&iTAY_I=p`1L:g/VF2OnfV%H]AG@]A:ohW&kW-_. +u^^5Xo[^!nIh.E=0LB3i7h5!(]A3NBH1li\=bJA[;rk2/*EVk,FU6QBaa=3<@$]AK9#`(M_fD? +PZ[A\X;.+B@0TA/ao&&$))DR^hm(#@AW!R_.(:jigHM058.;#nsQ;$. +=MV4BiQ)&8QZK6#*ZonLiInc6!m"(uus3npS4dS^S*B6,pZVC;:.L03:qpe(;M8t1A[H,mV5 +%34cCmEltM`]AMn'I=LIAY!Q4i`Yqh=Jrk5:5BPQGZ$Kn7:UWKUD6r7OiICDtr62VM!tX>maU +ULe7OjqN=fkKEPjAQ;I-DjILdZ%Y8CelX!A"U0(?lPV0_Xj+XBf6)'AE!o*%Gj"BkE9iiCX. +JgMu3&qQrQs'@OJ6]A_:,9C\)oqGV!n^c^l@=G:JXfI$]A*$:^S@TB6QM(>(+\V/.hHmYYr<9o<90RnWf*Z3[ +`^-V\3^3u.)q>S+Ggp``XWeBr8/jN:`OZM!ta^Kdrh8bn\HC/J>N),[9Ko(]AZN?:?__aS^.> +22BDKmEL.XCY#<1Z?%2>?l=7rg=1Ag^D6pKF:sSn^0E+E@W +f9VrL?NIpBR%&e>m$cNYV"oYlN\P:A&DTjcf$hTF+pY*/@YJrOfS:Ypu)/?/#_5:KQBLl;IK +8kP]AJ.1LJ)Z^$2hIq!Z=7hA/_'4oLu,&iJLfeu$TkJBu!RC*@RbH-;I^GoOG?K07@*a_ac4o +qZnWhI)QVjI"F?qEW($&^UE9"6MuLKgllc=.;(+L(5-QY<'e8Oa+dYShlKPpqG'tm=2"(`+' +?l8q/0rP8Ka1VK*uA@`_;`s/]A'WS5Fg;f>DiIqL-DdI5gl'^$ITSkh#fhrD/7EcBdf6?2jIE +)G$j&MHc"j&q"_:_!'AZY3ODj=6W).T3b!n;-3!^m&ri`a'tZY'"dngk?g2);P0P$-[S7#\msWcQ!RbD`RH +rkZh*nO[fk-ZV@/)@Srpd`)^8P[f=53Is'Fr(g#NLEG<`b\W)O&2XOjCSa?LNEBPgd--I[#* +B,KLC(u@Sn8]AhAhd4JH,2HX)8i]Ah23Ep"KJ2hq]AG0?-LEqL)P=f3h7Gsirr^PU!eJ4-YDf[h +"mA6lS<&"S3)gH(_^ouomGrSi;8bcigYgD=\+rhU2+elB=HKSoqZ"snRh1T*9#LjrdiVr>i, +^tK9hp?f9Q^`g!h!H5q[j:V4h>7da?(kjG3L*`WRB9kUP,_E$)L7T`VU+s,=lXP9KoEp6O(' +`mkB($_:09c*^[L0,G*b7QWcFP%dS6Y#0[nL"tVbu83ZP`G7'D'JE5Ln@JK*qJ:;lT5kg-:b +)f-t_]AWjh,,o<$Yb7??5,na_7%oTT0rp#crdo1VgVR-R2s.5+=l:=]A(C0d"?WIf/mgcRFeqA +)oH3M95MiK9No)*ZJ>C;k9t<:S!"mH#+$7HB60!FdCAe&Xmg!V0#'t]A[:#R7A!.3J&+*B3iP +f&fQaS!OLe!]Aj/h]AV8h`LrJ6J +NO$^2VIZ^>EBPLQdWmDfP8J;R)Q.'K4..RrF?P'd"qu8_0%8Q,_s`X[*J/$2BAs7aQ:2q8\Y +VX7LAct0R#/">7>M`D897U2">g[UC)tFt9i,t6Nk5s/./A,Y(r@EQJ%s26KC[(7$kHkX@m5& +a56VUoEuU9)h[5On?RV<*He]Ahr>;kep^t,3T9eQGTc+K.QYlJ828+&M3-/6g;aWtA?tK[Y +_4f!BHHQIN^TA(05,$AR11@D?GQqrYhnf@"\B74UP0i@26cW;U/0QsYPsWh7H`ppsa]A@Eo%J +oPE1B#-C:\%^4[8D'*pt?=okPBVX]A+6aWeeC7J)mWrT1p(F(VF9*2Ji2VSdt*5@Wn_1[g0`\ +C.r]AF2[.e%373iW3SOZP!ms_5')#5.X"25YoFt)E;V)C>mIi`Rhq:q9T<@23P\RbPZiNQh9/=X&>RcSmTm56Q0+V&j:pHRgFj'bj+QeOC +/>W0[nE\'292F@&UAk^nqYdpQ%UX@fpS9K_)r9N2h)OBP298>mTEW9q'[PVKu/)c0YL'dF#? +0[3YDN<'K]Aq9K&V<b]A!kW;_3ZDKY5Y((P7^_6pgeEnk>c9"l"61;4@ +IOBklL3T^=p%`>>o8osbge?oO0#kE.u%2%/Al-QW?2N!Fj:#?\+\S6n_\4uZ5`2Pru!X0Tp! +VD;X`FUnP(6*!0$@E,kB`)V"l;F/%_25RRC&2_?Y&L=lQ8%U"NqFjEJU]A:i["oARoe#W,=8_18pfjC^T-U +'$khCfF4"W0_`>Y=,#^S'@&&:!mkki>gJ*?$.X,3-[p3J,?9CZDTT/FV0NAa?e/F_mZE +6L/"(q,UtD?;s,n\sdQICcp)"H2#g,UL!*[I58_%boNSF.Ek-DeRgD+jZCrmC.W%!,nP<;Kl +=tH1\LLY?C,#FUR'H2pt@S6N.57oef,N0^*KN2gPKY"/GLr+I0d-%H91l7QS7o.eI,Q&WS1\ +&f)'!a^u!V$opI9aeU-fg^FH6W8>_c%S;(AkS&Z_gUY6t3liG.-@[`YV4k9h+6/aN6PH>XJC +4id2V/>(B2W\%_k4j)Q;C+>?3&Wg"U`e8f5I!:$!n3;[oUa]AH#iu=Oo)63sbe1R>BrjGGab1 +FSVn"akPaZOXPD)cOL:lF3G.2FHjmV.;bWTL%!:#tqKsXI&!HG&Fr/hXWV.`!,t^Si[@mCF^Y=J6D@aQ[g1Q>I]AK +j2T2Z`l,'<0=mZRD#82;5<8b+;c5!XYD`:tma1o[Nh\m.$285f$TMVH!*Ii\mpWQkQNnXhE9 +T6+:H]A-=J\:*m^K&Mb)Toe:\-9#.n:^,Cp(8Vg:^a2>"4P\);?e +^W1@Ut0NDK:*no*2a&lQ>NMc/5@^d>@.nq2Yf2B$H+tK9L^?+,c7P[#q.:e=QG1&b`bJER-# +NM.W)H"0mgA@9==V+[ep!8*Y8At>4,HK#MQ?,S=*irI@XLa8T[NWg8OT!dLZhM!=SKiB^M[9 +q^kWm>,ki30JI%G.g.FX?dJBfqrXNEB +JOb_7l$B6OA`,(eY[\aqZ9L:>d2/h8.CE_#>c1h([\<]A?m%,Nu^LXK/rq\CA)T_:kV5#H_/* +399(5;2h\;I3$+U-NWJV\rEE2.;uF!tQ*Bf?`?>AhJ,1I`R>25aK'mAKFqg!Sabfb#MBO,`. +KUC\d^2ai!YT7nL]A5gub\?C6D6<7$\(NraeYi?Bp33<1In"o,U9RqBqp>`FOT!qkVQn52/E0eHT8M4t8.fQ)AakED8Em&&Xj[$`Ae%, +""^bQq:3/EhCZ8:)TE0r>7[+(.j[s"F0_opOOGX_Zd3kc\::&7lVd2uRq7V!?Q9RH/7;V(%* +aXnpu_64O-OdJ3q0e6tTk0t<[c%WupS*3oO!/`38fqu?$R2"_QKPG&Q\7?dMf-o6Soo/07`& +Z$WRQ6?13Z:u+kA$t:OWGu8$X#r?&$RIR-g#_"UI+*`!2\U=TCISAjDSG[HlU2\cJQuOQcDP +j2MaFmp/tqJ""[8%02od=.`@\ctUB>P&C01[Um7Q)C#p;gFak^C?aZs?>NSmFM;d\#T9E*?S +?,jag(;"bbX\R&5;uI\-]A5O4I6*7T2G#%bt[J)c?YUY/]A)u8N_KnuYK>"BG0VeXePNI8(fBD +_dm"eJ[pPP/i^o/-&Dc]A,h(lu;2^3D,s5_t2G)0Z_WnP_bn%M*g3o_EGhgc4.V&qL)`)`Nt%@oj4a1XCEGdN +fPc5-(*fA=MF$cZIF0munJc=Z59F`eT89+_U3%6@ddY"W[2n\1"Z&Y7Hs#Vo]AYqo$V#$-_Ed +6*WElS&6WYaL9lHu@%IlB?n-3cfJXp*pCGOWS%+6^o4Z`:83k?bPk"nL`hO9_'oEaSOPrP:D +9+*6X?N?9BE[P2J6U7a6'2H*%D_GeQP +rmT/6W3lO%D'7'(Q&]A"3#Am*X#7Yg7,jn(1dS`="j,r\^:hf35`YE'HcE0JM+R1PCmMF5XpO$/@:%_S+s!\c7E* +nat/p%u$-1lOqLXKE$hZ%oh/g.i%#LF:A=IrO2L`5G*D5R`XohF057G:;L+LVlgh#0p&Df0c +b"!kk#Htaql6X)9u+X1*MUdlO8!"rj^<^,10q;3s3VAj3EV4n4Fu7@%A`gh3"1kiCM#TQQ3M +12;adY]AsoP7Qs.uZ"pNReZ3UG'TAELqMtFM==hJGSg(\Es'#`Yp9WF=j(gZ^3;=UP_D@+Z"5"3&=Q+N"dlUU?_dpp2*"o)YrZrV;8G$k,RjZ]As'go?Ul-hA0<,BdS) +^4EICE5p[oVhNH=NI(J?b!I^Ka+tg8F,)b`"F8OMo.I't[Ii7\;)VPLZYO5sL45]AA<1[Vn4 +2`NMeS%Q!N"=!Hjn.^Sj`j7'<0QIn[@\H0#.Q6a#lR>`(G=eL$')YRX(4!?IGY/EgD(CYSS1 +3W(g0$ZS_GRZb@,r>m4qSU'`CJ\;ilr;nsT-h[/oY?r#DK-IdW,]A!X'gfCFT4\J+*\CoQ[>: +O]AF0"@p,+5pSfjs-)d:&#bs86]APdG@W^*tSH\'1go>tH48O)1N;%q,qq)%^dRk=%)[0X#n7^ +f5308'_Fbo2H<$(&+5f[hgWoQo"+/kR!A[U%Biu2N0sZ^,T/NTmN?\%C[1l;4el>?\M3jd@FU-!Q,:L8Gf1IlbuQrJ,K7\B8=+P`gJSti%[HNYIHO-0W<>_AFoB&KjZ/nrR`1I_!3X%]A%=rUtm +"aB!2k;Z-!O7us^sE,l]AW&j@MF>SPW?Y:n3JJ!4DY_;7C43O(>+e+UT,'3k1/5hMR5c(5k%% +nZkmW3#;nr]AIPM/mHS%98MEuHAkAr_jY5OAV:Ld(pq[&c?aogks +E^#R4'PJjATBM73d$X@-4X#dmM>o2W"B_SVkLJ0%l"\o' +TIB"kMb5oD##$O^@?^Z3*LGD8([Kk:rn(+V(!J4mg8>P^P\qV!]AntM^^5G*]A\HIYsJ6e0'+9,[Y<"Qs!Qm:]ApZq* +7,mliIM(;S_92'\J^7Tgj'M0i).O#t[h2+?cWt\r)It(Co\4B_M/GkMO:&1#ZF(4Q(=3Td.a)"M211Je#;sfQ\m_;\7MbR0:ki9iFLQ=KM^,&D*XHjN: +H=I<=htN^8=*=pH[iT4`aT5bAo0l89Y:dK8rq*e%ftYjGSh2!Wjo18[L;3,5Yo\`UX2jj`Pk +nm>nqtud%S0]AO\^-)G`sMjFXjs!!ah12gG+FfnO7kj;LjS*8C'&?Xphsa.snGEBc#i +LVP.[^]A/b^r9]A.LhqtfLu?O\flG?pge9@%OA5J`8KfFkGaMl`2"biZ%4$MGcRp"b+66at3N8 +PlHrC80d*k#B^QfB'AVi/@-lF9g%KcZ:?gS#(3@Em,^-\[^<=69t=CCEt,:;tVl*Ce_M^$^+ +OEp&7.1)^e.D=[_1F@1*+C-_8gCd2?%$N]A"m6F`RX>-WRdLuT +J/rjmgZPP1@d3q1O2o(F$1G@hbbmOdJmQ/a!k&;%W@mbtdg.##c%YG*W'er6Oo*j7+; +VjGQ:j'V:oDm12_,Y@\qL:=.pO*Z&u-YR3*kWqZde_qaQ9#]AV.iG14!L[1k3TQL`ig\(5(hU +oM^SkdSqfNSD[4\VocrrY-b'W:q2m;4tnI;MOg7'>:AR49.Um='MZ +J-]A^t,4]Aic/Rjktaa:FEKEn@iBrTu@*WetdBKm=5C9UmmIL/3lH$]A+u)i_N[21"k%k@?YIC$ +k&mZ5_1=_p*9&T9@0'Ue@ta\IfcU@KFa_KmMMr+oc^K+ucaDbiS]A34S%=YfjJ8XR$RI(i_)! +rB7!A=rRTq)OhY_3LX]AoAPg4/p4b$)-.g<>1kis+(FntnR@LGlmVR6jiclr%*RYphSW3-S4$8".FVHeJiP; +oiK]A1G[]AGe:Er1eol'-YlrD)I[jE03TlNq3/_!bH(jIea`4X"P5N3^7_T!krki2=Fc1N^=Su +JS5puK,_oVu%FikRPKj+"f`ef\&7!^!a":i`&,/Vr-dL%MXZ94RT[d#pACk59tDosbuh9j9$ +rFjN`kb.NW9-Ta;OXiXl,F1ZVb;:G=i's6Sk23fL(:H]AUPqi!l:CcG//0_jgk0V)6&mk+90/ +WI`P,mOU1c9eie8DHf!.R@Tr9PQV[:&_92[".()Z,s6W:DA:?7)aBb(Z^68212N.5'7ab-+n +a4ZBZI0I/*0nf&,W`&*&LJP0C,_^%uJSDH'm_P[1X=le7cG3:=E(Od8NY*@JPm8&*cRHj+:e +A8QD&6-Z2$j&1@5e;jN.$CJ*abDC\1nHiXT7fZX_01@n[S8(q;I>XgVTVP2hq9$*h9ta\:"? +mPH$Pt/u@&$DYfI6"$hPXKFM_.R7oN+9E5tE'^jM-j6)-?X[Zi?_[*V"7(Ei^mb8WeH%B6rB +#cM'c3>"T@9M,qlr8IpXi:m=otfWosM52QCcMY$(YoWEn`V6>%i@R3kN.4OFHE>ZYDeHdR@9 +bOd?H8#a@lan20M06lqf!F+0F:_RODf4]AX-ql-W;B=MLQl('[nM<)jcbpPsD6eUjX+R8G&m9VXo.q%:*cSb@F/9`HL+d_*Sg4;"'@,`V[ErdD_D/u1Pt4srQ_MY4`MPN2FaD^J_AB[(5>>L=_17AjXFF+($P:uo?HU7M]AlbW9/ls +s@HlAX"q>rt9Om@On7J0nYI]AF#4Pg+d.BU/rf/1a +6K@51,mR/dijX2BVE*#0uaE?!)Q(OPh6Zm/NG.P?\jkVa2-))j!?C+3-gs:Y&XNLSj +_r,4j!`/7'c/OWjd`;L +$^VO)90XOnVM*s0-B.^rXHkBOdoU:62u2V*"OEI3rik;D9i[`#W5]AA[%B!_ET@]AP,d/]AK>IC +$9R*0I(+'\SuKi@n3HX0F>"k4WukDQu'8eumR_S+"OJ`\(FrAjpH>=Kr=MP1/ADSi0>@ERpf +:*V8&B[!MpsdLAma"WU,#kpgPRq&i:;<*h*bQfmi/*(hDohAN=0b9dA@$bI[F*r!EhE)]AEA5U$X +s7a8f_?#c7EUR\91+c%jiA2P<]AG@hWUu:nm-MgF4o8d44P+;V +R<7fV$bCb=;J7\.*#d'P-=IFNjDg3>+W*.!(>>M$2EZD>?`]A4*XAK/m0Rl30XYQl0)C[5cLq +OP"HiIPEU`^R50p^X:[27pP*`5@pqSV]AFG)g\e6XrH0JX`"`H4uQ[j@gQiG*cj>7BkMJ&1WL +k=##Q&Y-+Usg5OI_2m[.ik4lq7nFCkkmUK;?He`uK03n`&DV""4'UD2=lBiP/G/L\78H<0k! +.Z1j^YEk4eaP=a5VJlCf[IZ$JeY%XuD'`dYLBJDo%P0I9]ARBq!C?ZuiIM]AsY?pF'f.l"e+$b +H7"F4g(MhG_,1;>!d^gd_Q7@*@rTB<)hRUPp1u+oM-*bMT/,/O0'[U[C^I5EPIgB]AW1+bWgd +;T&p.#)Rji!ZHPHB!Q[).RK`BH:Rp]AXZ9IJoR:`SGH8=O0W3pgD;t*C/^&9:sE"3or2W&k,I +IX?;qo7g1?Y>")/'g^o*h@CYZhqZaBNKDdna,;BIJZ1A9oo8I=)/Kk2XUJ@S6H6"of*h)0It +DP'`Gr)BKpK*nlSkPTqL#]A?XU!D()+/]A#f[XF(V((J65WU5So?^.h;IJ(Vs^&QK9GF$&GRmh +M%MmG!/[\[.&:H1.bjM:8nhp!dML@\NFpu,aDAc'R?0EiphgeR)n_d;IQg=G5JNI;=)j53(= +Af:CaCU87Fj8X"V%`!Jq<_9,4u<_ja7LGC7F;:tt%2eZV$n7/+8M9JaU!Kt%*@G;o@rgWT +jZ;j+B#f,n%HD8Qne(K8L;`LZ`"(k0>^mjnn>O:$VW&U0&%CF$+_K[5PUK1\p(ecik+@B[VN +/&="pFS=B!DXY[cAjub[l^Yq(l1MSIRHeP2=UH+*]A4;3rbY*dSn%+P73VJ@EsFD)@dY:9>c* +DBaQf/6KVa\I]AL^!K7uUTq3Z/NVe`"oIX2OY4')-Dclo<>S;c-f(%s)?ek +j,1_HZ:K-@KtF9j?VbL=7@,7K\QRq;-KD_1@rTfc+:$o/7#a)if>`UgA,:afZ$kjg2A@*`e2 +f/W*]AThiJ$?l@-``67Bd5'P:Er=kmnXW52D\KB,ZSa!sl0hB@lpEe=a&cR*p/g6Rg2BEH23f +'rOKaA[fpDa;ZV.a-AFd$;9Gm^.Mb.eW78=fEG +[B(@mC.5l1UIPi@pt)GGBdLL!t#UgcMaWfh4+sC-KUr`>.bg;t6X);?:#kIb9kj#khC)LHL% +PAaDQ'S+aTtuLE? +&lh62=SG(KT=>:=JalPX5ce_/q')_0'`O?TX+B$_6+k(+s?HA3?#f+C[^-Y'%`)#:p`9J@#K +<(BX.,TI$_Q0eC`4H!3S)rjY=a`'mn@fZ8iD$"('o9H5!2q"ZC&O^U+$k=6cAJY>,SEoP:MN +h3Db-CkF\oL0;tPM/d#%nNYeI\UL@cq>Ya8r->p*25<(_culTZe$l\q_;CH:8fAF.H)PEG2! +mE/VGY7;(=7!#e:RSj`mh07=2X,C\*G2c;IF@LV&TD(sY +M?^L>"cLbnlW1/2523e%j&+5t-6s9/cluH'pZ-^+I,,Ob!%nN)#R`=UjdjO,0:G.\VgG`-uD +n7=Z[.hAJ/r'_!h`VRA]A[0QSm#qgo2rt9g"99P#qgtOBi'g-+qX,c +[G5RV#0GBBO-+T>e#FdoEjLVrG,M=`.3MXVOYN\T3%N\[iU!c6N4^q.78r9>cd[b%s"D=?oj +ni._LmfV,^E`Elt/II,UT2.TsiBI8g0:ET[m40Q.O5)0;BLn`sA448T4ak +Zg&>Gfo6Smq;eF"Os\6MkoiT2WHiQXWY4a+0[kb2pa1_m"J@'BhZ=:G^2O$)*Tf-*Si^q@"g6YiWoC5NX@BlGb5gr_%^%OeH%TpL +ArlV5(/Sl@JU#hI$SBmg>nphCC_5"En1C;pMc3IFX$;.`/bVe-Ze>rIQ*PeN^PnZc[1=o8Ql +lKl\#P$ph9>g<"m$p)KZ-]A7"M0V1qM>&9JTKdT8UNeWpCQdH8:h\g=fbb7=e086A+4@ortOp +peQpO(>r4G!/BBHtVf>s&V[?d5T8,2tREYX.e8!ABBLPZa6j2+3`DD\4sk,X&3@%6-'h9=ejdols*q_X3S1 +%5G5Rk5383t>djjqr9hg=ja8PHHXZNbg1!JY%W>NBZ:n>64@nkn05:P#7MF)8Qsi11'_]A^s: +04%u6SSR]A^44V!FQKKKGGc)b`L'Xb]AfL^.03p$P#n@AJ9T\N,Qt0Xj%efX(Xe_M0H*)Eaiq8 +oA#>_W7@uEPCkC.Ttm/IrQ`+?.B9RHPTJuG96!^Pkf[Qk_IFJ/[sDNQ2X;q?P2ISjLpHAs^B +0?j#NWT/7n^o6Y5R+,]A@.Xn1:SQ5hJj$=EpSlVKV^J,((o]AD(t#;[H?8l\NSmQ9dJ'>/Tt@G +m6S:\lVLas^:JFZ920/X@.0p^7HcO$cj'4,7]ARJ13UgQW3f;Kr[9%CLR.K%98).3j$^?<

l!5I.fK)Q?U7(oLZ(4@7;)EG+(Sk!# +4V\R\d,(YeJss)o9c>./G_bQAo_ap\H;1b6lN2cHdGc<oeaoXGSk4 +'T']A/T)UEmcO"/0_:'5UO`>^B'&9@pC6_R9/taf\@2*(4:&p,Y]A3D^t1?06-VutSd.gthHkj +XWW(rM7`*emrWk0.$NG9T.?S2e^bB)0sgCP +s-G1FDSA@^ASIt'drHoXJN-[o%T(9r,NkA,)CEMOfc\9ik7n6g;nT9F4T-lq=F/=Ei$EY*3) +rhpLMk#NSX+@n(=PUCli%ubdfE1*14YR^_p) +X_BH-Y2#tDJ1i1J#l,]A*=9*Q;?C&+-`F;7':-=LIZoRO^WM0d]An[TgtB-k.A^'Kj/puh_4]AO +;)TZeT.mT4_Lt;Ms-nd_=YH"NMXG&*=MG6EW$/OlY`mHUdLNUand5E`AK1\H5on)Ol.k.=At +1E^4I-r*9AJg2O++:=bd3=Na0X>df9te"\feoE!\t1n.De0N!u/SMW+]A-t,^!QB4hc,#Ra0W8c;FI(rM1J*F` +?+7:3u^6[Ln#`lPJE2:S0YM23Q+=>,u\&@?0YPeQBjDW%fT9I,*K/3I95bgk,:[_:Q1GH@1/ +XlAKpIM:Y=l\TnbaA/rdqIN3&U7q5LVMAQ>Tn*LBCA72=3;O]A/-\$P4(#\PpPG?[`##T^"V_ +*;]AWF7q&(q/:^bD's6c*0/`-H8Tm+b1I_D\RPY1;b[pY!+(B>Daus8s39@^P3?^g:o]AEmmt4Th1\]ATJ'9^l;=/kT8BGLFBGH?= +!Ea/LO50kEt:31dmr?Uo=g\f`hFJ>`o@:16G[*XD?kU*]A0Y^AC1C?U&bqr$:O"ohn\gn28o- +\[Z$eBSEnlok(]A9tn*N0=#(i2= +o$mkY^mD6%_]A*0cY/:;.in>q%e:S?/\)/.aE$-:`'iDC8GpOfujs081AeYeI+8e;,N_\MT4F +/hU9mTX$qrP7cI;-J'jO'0(#$I"@a=ou^qsOfXG$s8BMc*q-ses2SH^I_gL,S,&o/q_gg.Ea +HnW\Q?p><=Oo-7ZGlfI,+6V##%=$ASdgA$dNj[7RdBd6JD1iF3eM/NJG=I?) +P$1;Va628$\jh,Z?`jif]A1T$!rc8%]A/l^R[4K+?V(s1,,.k)U+!Xh?*RSoeRoLK'4,[_E`3M +&%fPa#3fnfe6",>Z,8-(?E;o<1QY9Z&E$mDhfp?e8W>JXo8aRk'k!YbQTlt&`:aXg&uGOY$; +AZXm/:8:(.-s-t@Q!VY+@IRM5Zr +D>F+pGLQeCVWPV8f`XjpE$9WQG/ml9:Z1ALq+aqJ*`K3ZLgHe`n%)7j6aW(o;l>a%oNJQg)A3jmah`N`[oiNn@,=N2! +U#oGXpNNALuq!&a?%"U7L]A-6,I6c#UUOA4(=bP]AaMA=L_C4eT!6Ug4/D,rATc8.V1QEH-#Bl^Y+rrl3U<#">2?3/b+<]AW2_D3J@Pj"c2*6/NF3Y_^:R%Yjsk? +#Hq(A]Aa>c"K;J&<<\S^4hrNq0qoXOo*F)$l=^RjLPojb7W8m;f^AU;*;R5=rr4@e5pr^%%d4]Al +"8ua3:lK"ue5"O+>a4*K9W7NU/t[_>>dFua=a>(PlP;fHRK^'?phL-Bb]A&cf-J$Q@lT>X]A+5]ACqkGo*TNkZ +2"3#q)XkV%n;I1+U@K5`>MQ`jaJOli875. +0JZY(_b_JeNs?=*8Ni@>s-n)>1J78M)#r):h8EPh278[ksi#G$bZ=-+i8O%2Zkrp]AbVJZcs` +-#^d(2l!m-^\HTVM-,sW3,r]AC:RTRF-`I`J$QJ3e1HXCe#;5[f"ia2uMU[ +IHNMi?`eC`Sm&MKP7J$jeVfe:;(V=hU/MsdWoNAMh3Q+@:]AV.1,PSa$O4j[!s>'7Pcr,`1"s +/^2\Hr#5i,oriF8=f5e/0i8*NC&]AKVr7JgN_kia5AD.?mWV$Vo:iPBsL:Wb\,"-\/*LPL>Hr +ZZ$Nb5Y90mbY&`a9koOc4O'+U,OH;M;95%WFE]AK*=JAC.G6KX]AihDrI+%N>*VC2`C[&,`=p[ +**`bg\'^7]A0@n"]AQ +IWJF`HSNhOCB4Vj?>lGM>cm\tiaCP#K-UDJbIpf?b(Cg;ZMh/7<+6 +D[WPfd!)BYa9tpcZT"Z9VpO:!Rf%p73FNE^CSR:/a]AhhV`OMppM_Ru9I.it40[jrq]A9HV.9L +u1FZtU]Ad2We]AC:uOg72lU%d(R"$+=PUWcf\*t7W18$mZU7b3PLkg +()B?oelG\^8so$D$_#>?W!m:N3-"^f`&%W3N4?,#j=ppkWd"kZ#A+1IsC7Kh!A;flFgKCX!Z +9/!g!A<#s1frIi]A(5:?Sen(p&!W:6UT#BErrk7\Qqi*+F%%pYjIjo(U7+8@ +oO2?dlLq6@-k'b(E:gme:fJKI[tP[Ga/@)FtUhBPCf)canWjQ.M*c$V=SLc3m3M`W.:]A +lbm!]A_sEuakdps,bNk0RcZ(Zud>MHuL=YFUeNB'(jJ6gPcO,akL$dgI$nB]A$"6\kU6N6,]A$_ +UUOJ3G3M4M#q&c_U*&+j8A),W=F'Q`&5!be7dSs.g34CN\$h*!2C569?5HUSe[/`/3R(3HId +'&srR=5\0=9a.:Srm$iT#lVVAWj]Aa%8R:ki"W?\Q]AG#Ajas/A)1YN:">WKQWVRq^lXhd]AWE# +!8d$R!W>lb3MjOrB*:aJS,O%.,L/1$f6;5gq+u6^ih2Ak2rqUoKM$c5E^j,\0j$Dll6#$_T8/F\ +FV7!n;Mb8ajcm^`[e_#OAe6_1K4a+?tF.l6]Ao_M&hYi2_Cd*-TcfL_h\6GAl'ciW25NU/rte +H5'_sa^?'S#6`;dQ<"drBV(%?-KphXs<3.OP:#=8=V[\a=R,#N4)(m(d++T2%p7ZZVTUF;-f +;6((lke#?O%DS'Ad!=*)93=qiEKT3cB`*=9LuUL<*AUCuL994?EKet!mG`K1i;"9uKLAD3C9Rcam-GH6\2#r2G`&2- +IZsN1>+mD5%b8C"=$X&LpIe?5\YE@Ymc%AbPFBp&[FCSEVs,Mor:HANN:Kf6:XV+;m-U[]Ah%;E3RZ"Z4AK*Q8*o=0ut6g;7).f% +l=\PQ9C#l0bS,/(]AUGel?6JTfW(%HDVcQ6=>4Yk1&R4!Zk:9rfH/$O0b.V(`UcT87m>?'U'C +8I_7*rIu]A"j(LUqK`5/ms*PJr>X_:FE5kjL68GDP>,Bf;^'M(]AL?0=05Q=er+3nf!cVf,N^g +V/&DPRMT2.'A1)=H'RHshkKb"iH?hT\IUlDi2*.WojN#YH+7@6X"R.a:Sfkd"eHK@?Tb,/hh +O^-HkJ^kI-&8+egbKqD(CG+fFj/[NL>2!c?sgr*J4-09F +6%"bH^5,JdY6cpp^d9%C;U(p<3]AE9bL=49e/UE)JQSa.TKI,ggbm<2Wd+TXR-"f +HI!eYAA06fGG'n;HY;k8kMFXX"gV`i0&IJs)[GQ-a=(kE?\80o?%;"+5C(1F)=;1Q;5r`ABd +cTJ>dHK]An??=Y\U!WPlXS`L`7,J%Nou1s]A@=Sjt"#`36!;]AgJig_RCOZ;-AJH7p(mhiE7:F` +X)m(I.Fr"rP8)4NuSQiB:2%(":$Hj1:=]AiWnrBR7gKYd?)0EMeb$g\--PkB2/$EkY5iS@=fn +;G0)o^=c1aFGm6Ym4agfa(6-AJX&["ID]ApoX1CeL.IU"'^Uk"kKc-V\.gVIm+"<4e-QM5,qF +29,?:Zd7bhe+/B?Ws3Y.67qU-ma\pp;_9QE,E"*&@/$i,]AP%N\"mZ%,c4#Hp!4e!4c&SA"`G +W.sL'j`D,-3&0:4=!m;Q$A_dS4Uh(P<'eoRROJcfo8,=ac@c4^g&\^urBKiQBH=#6g"E'e.9 +*j=:JS.-TOJi@%L0UpkP,ad]AEb?.?78T%C,XD[/8'K["6-L]An*dH,-qQTkg3%K]ABR1,%]AOYc +]AiJ2[f4&0JqQYGDPEZmD>=#KnneFBbS#U^l-0EI%[N7Q`?,$[Z^o;.6i7A">^;;0^GK5GO*Q-$#h7Bd6`L#?@k7D3iC2O7c/&@9@$FsoeTiHl@71N +k:7"BeHu2JiL6Dp.)1,5!kl/%,Q0056;HE:2PV9kWA3\nHifHjC4fM:;,chaVl7<\:Y*_pe^@IrUc%`Eb&ruE7$Eh01SoP +'<<.9PmmEd]A-(in-VgNJ%/L#%b1TZ?L\/S"J=tb`(]A'?#(]A+KX>]A+>@EM&n7kF9QdVbSK+3DP?QriSUkQH!T.d>5]As[X3iZpQ9\7[CZ9#InecJ;WOqO1Arif[ +AeWUuV?o&@!339P)r?H:JGOfVaM2nf60YL>I\*.X+MfeX_*0cu;>XuG'erOi']A5Q@8HOODRF +l6\#)4GThZ+E>DiJs=:/RT<5k6OM'@->GA:X^XKCKlM:t6^8=9P+ABsWhd3NWCV8"X6%uJq/ +4k:I;Y%[Ra2c++o+pN]A1\)NlSX!!U0os#K1Wo`oQqCF,GP]A)YW,.^X;X-?pH,W".FZmm>@12 +)S_K6W$JsgV/YM-[bD&$@aPLG@OB&up9K&3A)Y/faM/S%Vk3DK]A>@tBnNSqjrL'e7Hl8*2Yp +MU^B-Q*a9ZE:m'PLU6,>_#FU?s:A6[ik=bG/sjJ/`#IK$jE!DYF\Wm.gO<,D)6+0qETOAV-` +\)<5>4Wm*4i<;#Q=Dg/oRC>2TB#"X9CaF$Gu0/@T+_N)gYg5cZ#e%gN?6+q +(5Q)kMsR3]A/f!js[:6nqZQGgnn6M"G0B(NAg6g@mV3h=eM5-+=&n8sc,<=%eEr2k\qi/@,[d +:2^c-]AT^c/FHPZ2Ylt9%;i,n[\Ke:*lSJL!dUa^DG!17e'460MkmFKa0c@4\>]AKg52AVqnlK +G_q(WFT$H#EYlPuC$o=/$Z'C$iG6^01+! +kdo(D=$DJhfCT0B-EabR$,;o2t(T9nK/XnXR&PpY^ElgTH=NZ09rN\&$7tkAB_d//I+85ZSf +U$TLNs,X$h[M-\Vq:!,W$rV^]A>$RMCh"`Do]A4n\na5)=Pn'BcP)`D(>.F%Mo@saf0ABc]A_[D+b)3- +su&Mj#Z7M@G"A.Lhe>"<54]A8g>nSL=.:M"tgG)O)e+I]A[se"F-LPO"5_jW:lEo"0A7#cX"., +VYCNUnR`>JrF_J^(a0JOC!4._AHu2I0)ohO_FCIf=,fI;C):s8JP`gcS\h,lXmH;OouG +@2FJZ[O#>hQKlC>p^-m0`FCe0rSEfA@)XK+I+n>bjR!.Eh.`2i/kApNBfI0FYS_qHF)n!+q& +o<>l(]AoTEpu+eJ2*>P5q5c/J*AXl>/)V`_34!(Pf-IP.DU)*9V)2m=7!iOU1n+B=(jI2!iok +AanjRb`/.A[-*`b:RQYQG'O&*tReCZkP+=5_".4#jX^G2;Rf<0Z$R$=+DsrtgD6[G>*d8.W. +3V/BV3geuWXTu`l))aGdc9'-XdFW+PPNVY +;YVcRcFTuK^;aM'^?]A*QpG`:,k[%9k!)kqnB6j/9XJ#SHWYa[jcVC,*$&Q;.;2'<\6BK-T/B +:LDP%>$l/fgG7Qb6?fW*_W00E^[#fH-]A/*ge=uWUI=\tbnDHfM=3TOO>+fVs!U@CHPq1^m^q +3jY(W;O*Qm^T]AMl`=BW\F<1rd2l^7O.U8-t^Y]A#K$B%4r7egLGl1DO:)`53>/l.VW?6"d"V% +5@`nIr8Gf6d?P'cZW$3RAQhd]A(p5]AtSQPNY=&W-C+g +lN*"/"Z;FQmFc32u8#'p(..n@V?ebh(mUD4sbG+2QV^h?b3sQ@Nmhll^6!aH8,u[f8"_t`DG +A&,;bUqFA:T=?XZI\VC%M7_YBCMYPbLU30]Af1M4+Y!'UK/bp$'C#8WY1u_qhB:?&T;954&*+8@;S8%TRqEkk0%-`\(3Z^<."66D3WeIg*0Nj9m6F5fA]A%\ZPk>;Fk75$6[/3 +Q:;W@pu#l$STrfK!MpbNbEqXDY2-T]AuG%ifOLc/=e%)&\8"i_J'e64/40d8Gl]A7^ +q8Mn(nD6>Wn6P0d(^U'$DXIhY=Z@&F9m\c+8YEdc@^$@lf96:]ATA^a97hRH;;`$?D)'HW))C +G<`iC[]A=@+O#[c63&9drCmJLo/JM8["Q2[_N2)IZ6*]A@f]A%:ZU4'7:XGbT/qD?hKNCZ@\.h) +Yn!9i,UD&W=VdMfK."(kC>T2k-R+uspgkOij;$?h@n5+WB+(8?0+NL:T'ngkPX=g2LiofKLd +$OoSPa85lKRJRs^%59dt%#Q;D]ADkC[L3*aj_)g/O(>2VR1u(tL*maild;:6Tn<%j3/.&_&-kg&=Y`$iT94J5q]AX)#)E46eK/X?Tjn?'^X"\?;hpMX='crW +b31+b7a_o7?::KWsaTi&1(_GHC]Au*nORnFUnch(NJJ_Bt.lb*tJ8)0Rq'XPZR2buN2((O_,;qQBuJm`Pmi2M8.>DY:;_'=p:Rmj2Nq'Je"6n)OS_ZI$ +K(!,K[mreNq#HMC)N3@QfV;a:G0ojn\u!:QlgsZj]ACnW6qn104tR?4,VW/3F"E3j[/'8J^K. +Jo]AUc!D#]AIl=U8C,LRhnt>gZW:#)C8Abmb.S%Ut-1n>*'srTX3tdHG\BBl@*[rq8`+M\!9KD +]Ah.=)l&R;YWcl;ULD9hU(H1*[Z1jUleuos=MA<5rGef0h6Z/%I<.qF>)]A+]Adk'M>C5Mma_a& +r8C!PVKiEc5>FkR=i.klj*Y@<=Y(GkVe//o,i6NF82_'.&e/V9>V[OLHh:?rOh[kR'1K&n%nC6Ys8Hio66;+l6f +Qm>G0aN$84eJ=I^,j^Dg>f`'EOpAFcStWG98-q2c+hDO[Y`u8B.hl6:?ch*6ClHETqQO6$'\ +lCV95f3%&c484!1%_Fc#?(d=O\>]AR:I[7?n??&/TJ^X$qg\pI=^/h!f`^_F#srn:_ZhB?f2S +j_dg^L8+'T34ht?hU@>+TudQ)+Vi>`)H.?-!qi')et$(F5fkV_1d3GF%)(u(@FKgH-oE8kG! +BWph"'qrjpK'qTUqZ_fCB51S3f28`]AKA"C9!6l[E6mgs\SiHR43RB/9VI-75V9NC`Y?F`&Z* +>&a\[r=uga=kDEY.P.3Rb)Q>aIt[NZ?doIl=:fif77QRZQgIY7$6;7papg9)/Eon_?,4;)omA55.lI5de2R +&,(@g0%H@\E3"`:j^/9SjR%&Y=e%f4bRB./5F[AIrJC#Bg1d]A.%,#fTU=bC,QB160*%B)j(> +:"CY,X/I,o"-EP`dk*"&s_DG[OCDM>#8hPT?d9Y[`OX-1p*sq%.HCo]ARTj5qR"0_?T5%#QcZe,BPZHG=biu."fA%.$AZq7k?:@&CA"^f[3]AuLQjYK1'b)aE*\c#&`Z-ZNe.?`e>rqGl@-KCUrV/.dp6klTn!*^]Am6/r$bQ:qd/[dYs#s4)=&T +Y`)BdoD)+IW0&D7B"u$'H8u0?Vo'#O=ED9AEe+rU+Y:MaBMmtVaDN]AT^=^%RD)TGpq\W`oYc +V_^l_;S/Ldq?TNuG@ZC/]AcI*==CV[Q\7D$@?Wq5oeu]A*q$UiVW3[m[p^0E`7_=%oL^W +'hHI:oP7-?$kiLD3WOT$8CrkNQnBh>"=m+.Wkj_s6^&46RFL:Run5'[0m@a1d2o0-ue]AaOhi +&9?0$>ThCt0THZbJ`ghBn6@%<`"=]A\t["WIBhR49Ca5UsT:\+ahKI>jR$5JTa.'H3/mVY/]AH +Hs-r`UVe0Wl`t9>DlO":4$5l%2d4;Umk;Fj&J&r1Ep!`C]AK++QJo(pDVPrYs'/cF8@bQe.^S +^A@r=CgaQ9B^U%lNP[6+o\^u6X/r$e?+gDSi26m5`I\js?JN'uro^C/Pt]Ad5[/p83l;LcS:H +7R@PS9>L-R85,[d4"B*r/MZbiP&uO-umZ?I+bkd#YBeOc2W?YBe(.6_2dX1q.W"UGhN#A>d=?W%N5&-$:@H&:8kkk/VB" +fm]Ar;e?6EJtU"(76j)5e@9Gh4@^:r^FL\nLjP/a^AFJo4oZH"MOJZ=IHd;47 +`.pC2=)b]AF*!WUJ#k+5\W:FD<-/lrHIJBY(;*)$$D +`U"jB^15XRGH!.-\V4oM+h#9%"hdFQu=js#nPeB@N4.^4$eoX++n;##eTJ&32]A!G@^efJ52, +Zi0>l6je:i.+@*R2i2Agdigl&p?=`jPKb=>`cCDa)tf.XQe62hcMaB`XGWGT*JAa'>$c4$F, +Pq$`GmCnD%T>l-SM[go5!LQZ##+V#ZDEOSH5Zj_*:eI("KMX*-%]AR,l_#K@MEWfa^6,I(M#r +139f(a\*5kISfW([m&fM>EML.,Vs'9?tm@-QKA';.\0%:aCN0#a\7S"j+@IAr'kOdL3j6+9` +SD`V8[TA",F$e@`]AsNUG!n'5u$k9T-'upS,Q-kN2A7\m&Uhuc\_6'B;`eFmk$rZEGOYFh +U#X817U"7frgOKePY)Jf!.t:N\b`oNT'?\>QhgrQ._[cqLYoPVo]AI7):dO)/@"b\EUiNsEn, +U2uUi60k<8RLHE+qB\28cb9RVCU(2JHHKJZa]A2ue/IXg$7H0!]AZiIX+sOaTW:!7Bps6HNnlZ1:c2NauqYP5m!I1OLk0O>l)JF52STG +h9V)bb<2`HOO>ciEm?k";E?_QpW6mX5ZRK:7ljL1]A0jG2^5Ebq^%)f&:)sNh._^04^3GOS"@ +'@<\D#9A/L^VFC#9/eVtE1qg0q@X=P%tGFQtVKbVQbF+d59nr\O5f#j,4\OtC#KY%7NBl(", +h,$NedWZ!j9BC%&'PeKVrm:cQ)2Us_dU>=.Kl8B5/Q<-erf['P5ABhN.k8mUL`KFH1UZA<-0 +2*Nmlp0H.7+nT)!]AUWF?"/.a+q\ocI&F('X?o/aCOFaP)<`TZ7JL8CIJauR2n"j-Xdl'gNpP +l5>6%2Gah^>/n>$HBno4aN&Um)?B(2qf3;SQHpY>q`7ZI@]AVGaIj>1iQ*oc8[a2chKR)?CG" +:0/edZE*tqD@e6"Fnt^$p-Sa?UZZI0d0IFN/ [PU5GkFQ*L)94,EB*A5h^]Ao_;qI\$or:u +dNT_^frg?'#"J2ZE8-(T%,GbNkd*$*(\sA4iQ3>%kB7'?JYb!=Yn<*_r.pc97< +!A>FTD-jA%$M6Cg""C9/.O^KgGKJ,m@5]AIX6B.]A-IL=]A;h84"/9-j;'fnDna`PfFp3l+hI^^ +CR0Z>uYC'M7rJF,k)EiS/1M0O9?&#fTIWh_pSl\qFL%CX.L%#!8cPgo"gAU@S8;i +=Dp"X-82NkH$CU8]A?pNn1?D$Y?6c(jYb.TMj.cJ9b4523S]Ai'p]A,ec^A7$@.!'^Q2j9Qd[RF +hU<#hX'qat<"2)n,alD:#g8OuV:FK65Im8'Dr(4WB[Hp$Mj)tu'.V]A^_q2;L4;OUIb!o=:$j +W'*+2BqE(SF"S.F&l<*[Aim_`cZa[U.?'+pU&,?G-Yq'Po$%8JGJ9i4Jm$+Z8/AW_f'T5q:^ +GSp$fj,GY>rd_c,7?Y:6Fs72Rn:2k[HjFKfVm3c*-aF(=5$% +N*;![f1J-\^j0\j@IP(Kl"7$n`@%W'PMeGA15ZXQ<_cf:a)^^9G&m?g"uQLB2]A?r/sT%'QbO +DpH?\[8gR/tff&W.#b:02Fg!sE23o +j4PhT>'_>`(F9#3:"BT-F'Q_W_(+?RqiO";"co@Zl@j6I'c^lM?#.W)H+YoQb +rG\;0T5J9PPJf@?,/oE]A7p^B/k@:3@Wi8\G0`%1.mApCUckM>p'@Cnd]Aa*O\6)_*S;8`4TY? +g_Ck_Qn'H:Hjqa?)CoWItU)2,l)5ZY?//eH(Jc:8VC?r?`.6F'2*M\G4pBePk&196Ds:u\bO +C46J_3Vfu=G&apd]AuPacOH)h9s-6*@r8^W?aW>82/i(/[76*Im7m\,*R?"Jo2`s'[psT/@P9 +.l]AU_3m!1Q[@tf;E'njfK^u:/^/Q3f@j=`e#sm\D.I@&"2XtLc`8R`59K0!,D8\S:1AOtE$V +K#T>3,U0p!!98W`W1F203P)Fs5-d>2G-H^]A@=FTo6kUf*,UK%,B2)qQ&da&5K0cZT)56(;F"gN>F'3`o" +tP/_';o]A[/Jp<;Tm=G1"$7PX/D:#"PD:*:(4_h<]AC-<2>>l:=H`3Z'OffJfX4&\.JoNn[2g9 +VHlF1E\nb@GtaYOX0[o8.![H?8bG:#r*GIn%sq5+Tk)[TmC?]AVD-%LQ*rq:N%d5LX9&N*UoZ +,s]A1[oDPXI6/7p_mfla<$L$K69&+>80D%K(e9kZ_mQc8`?,^),WB=?l3t/W@Eu3!i%6,Q#%B +GUPB-A0;-76k1n_=7lo3J.Qh6N&.[,)mbf$^`aqN1B)^_oL%6q7c_gZ8UW$)\QUCc!o2D'`)%I$G.4__HTZ7eR:-dIlePp +eJYkA#9(T?V(JC>nskZIhX9'NnUSoBnF;UHXl+b4X*,bl=702LVo0,/gYj:a +isk/pPKUk9:pQ-ig_.+)W#\NZHU8G[0@D/[p;"#d:bNlI$mm^A0r]A!@OCOcNR1Yg@uWURua' +Hi1`]ACbt>I:W(%CB"'99+2V!Dk$VH$;bWH@)'N9tQD)qV8P6V)_XdhDsYGX2lRKY-o"-^ +t(49g-8c)4c>W:/X=3l<[/9c6t]AHu[g2e2fhenWL'EY*gh8@/gDflX-[iK9@*H%q`Bb`j5\, +7)GrD59`7K_=CndF[`PCra%68Xmn+Wu_@$37'[3NQ\$dt\bU.PFb1(6kp+]A%=*`U]A]ArZ1kdJ +pM]AV%KUgp6,=u#&E?gA_ZcjT4"H5MWM^IP6>g30BKB[tF5HhMd*UEW+:R384-=;-So"F[X`\ +N0*hJJ!N`uj0Erj[CB3=J"F:gFo$D-,s'mBRrbdFedq?sD(hM\&i"*R0*"-jN'E;Oq^sf3J% +<"$cW%Wb,(2Stt%3( +0GaO:\knaSdm#_VeS1\TJlF58L?T&*[7m;c84qZNb!)=QSs0P-[/!$dL8*:q:iM$>_e@H,%p +&Z*BF?j;BXJube#.U+RtiTe%UOq>D$[b-D"SLC1)T&-0D*&t_KhP;29?;;cPhTp7e&u)Bp3p +!l`*D:KpkJBC-_uXi-%;6VkC8tlc&7j5bQ:Hs@R2'XtDV1!d$e'%a\j)-'N>')$;;r" +_[\6/eh)V)YWqMFeTuP3g;8HFFmr?#?5`!3/L]A6'%[jW2H(?BXfpB9d2\3sc0lY-j1S/K*9N +ljqBh"NSXhmXegR_1OkL7AY7Df%^5bg*;hM`#7*1V2qqDRQe*1m/ghVu)l_W'#JJ./27\pr? +rgM-SE6K]A>tDE^&m!SKWBiPm?p0F-L^oN4J%L@c554I%jDZpHdp7J$4H%VOaoX;F\8[h;pFW +l*]A_j=LL7k7^$5WfPd)p/@'aUES.m)1T8[sJeRlU&ih+F^*Di<]Ab"[W^"sBuH,Pi%1@9q@G0 +oCG6g!Z@pnV-$9R)]AC[f9mXNRUiC4Ba6P;KT0Dg*Ip6k*!d/s-o'`CVmj>a4e7Hm>\.W6eC7 +0Bqf>$d,fLmk2n>6LQ$HG\[t]AJoYI$e;e+T8-89:/A+Dd3':`!-GuXVi28758:PN[kA]Al`/]A);BLH7$bP[!SZ^Rt +a2g!r^1'@*W"K8Eg0mgdIG?&eraU +7Y(/FB3Nr*r&Uj<[/:EWJIN_0V$aU#%C(bGX?B6E+4,V8sO)4M++GhZs="J\%/4Fn_S]A)j1m +WSL^.";cc8I?X'8\KDH`^.J.&r#d43C@6P61hcGa:o8R-tL(qom2a0li\a5pIYPTl<'4DZm3cpd^aIda$b(?mPAiMP*]AY\#\aX1g\A&4(GqQ%t`M;=%s5bd +VDd1Ad=aKYf'r#<%:ER!-l5gC5Q(b=3UPOAcW.+fO76eKChX*JlXPK4KZ4_JpWXIlhtuG'&e +Hl>ip^KZoa2Lp)9eC#Z$6Ir1$8Nn71&T+l.BS]AdJJbiG@LJfBPq?u4<0,Auc7 +_??!H!DQ(Q#d-Njo%Nl\0XLLR6QKGD2Q#+[%gS:*q7i,.Z0PDkL`NZfZU8-GjLCV_^n_L;5]A +'DhCGQ,@.ZGED`upQ4J>sBe>SZDoS3mJ(DUdnoSeZUlLt:a4ZHJn=I)mYFG'p%i"^K\MpMJ:6TE6G/Y>Q6cS4E*t/Rl^p3oCL(c1qmhekhc8 +N@L?Qr?>oR(ef'#:F_7N"aAmWP'%cQ_0JV@r)2::8kio4)>aD?1hHQ.G\1EZ1(>-);q8WnZI3>KATha4rkn[.5UNSm\tD +]Ap0_63bMBW__e20u/oZP1gImDWF]AnYg9Qt-[r6M8Oh`#[GSoD,<>#IcL_bmd\V8R@aJeJ0/- +-'e$RpB>B&)]ABEAB^hWH`S_S]APZ[I^:$DO!Y[.[A3M6e>#VRsM0f=Q(]A6L%$e0ee;`"lIJm_ +-5O9Z'-G?Spo\N6q2KemWEfHgdF;`Z +,'91%Z0LPTC&[7ZUK_4\/"L9gWu0SfTF"[$Hk$;_R[mKru_`cTsJ<G>4+,8>j00[WlfmQZ +<^J#qs$0,MQOhpn$ZCu$[RT/"^nkL96iIGT\8?nrea"3C*sl9*9R7D +nW85kokqFW[do>inB!&/&!(!leLUQ\X7'J:i"?OIUE4p!U\89*#f(N[@8RJW8ihT"7"a5mnZ +>,@Q,Ht-bNn*>l5p_g,S$OVCc#Q2SO1O,>/iQ/Ci]A6nUta5R5u:`EfUrciqLWr(.W@[\#5e! +\o##mV%RmOqU=sM,MRI#krl(#JcL#()%!A,X`"3M0Bpn6`O-boUL:etRTY"ag:CjjMCDV6A` +T]A-<0U\CGsB.\pe[c2kn1u#M+?0H;DkmI%=4QUXA.7qdAid"4$:=&3*4ULGi%2;`6S>QS]ANg +2HYpIfnRn0UM)BPIe>tsb^sRoo@M-'kGd>,R9`X>kfh2e;LRb3uSs(3oa$$.s#nBXO2'aEN* +;b-*mj2@5qf.^4`i-a[ZO$G;1;iu[\-uWba(GD-k4@)7g4CSp;/@C\U@Ggf0.kAr6MfBZh1K +9Q2)^%;Xq_sTK?q]ARM_o]A(Ep=[iDAbN.7!hCYVdSAiqb1t`mhcp3ZV +%db/EW>2phRIZ;lRpYaB8VCp62E9+5s^n[5Hf6'leD9/iie-Xn#c4SjY=m>S:SbO)o)KRcRe +i%c-JUc7dVI3VWDtgrVrrHGf7R7U:TTn&hRnP`>Vm)5c-1N>MKbWn'n2BZ]AdWjtV2D6dP_c +]A$-t'iTtZNc;MV;1dhJ@L-OT/"0PHfcsFmUljTl=RR&b@$0W`*W&]A=("u^6l&SuM]A-$)Xc>6 +8`+gEcdrRnI_a%=DS/Ztr-n@pU5G?[)?W/>R;u.\E_[/X+7U<:f3rMa>O2>)S_0BL,*0rNNg^q +"VN@I05[P6&WUY(Tq"s<\fi?@qRfD0iH/j@ee+;ob +>(IfK:![-f(a]A!`'bMH#$'NJ_:gjB$k?HTVDMm"8U1hM=W39/18+LX +L[NdKN6,p"C`]A4mY48/8Y"+)A4o-FQ%G!N0YE6!PO)X-.kcUguO&l;'3_!Z-eQ`/ckEXq)69 +H`f]Ab-(kgoMY8R<-BCV8D]Aal#?p4bsG%p"XK-P8Fp_($=dL`e"#"^`AB-cRgU5Z&L5HL@&0S +nqGu0!t"i(L=+IQR^WW3;LDe"20TUj19<."TP&$3V=W(6`EIDiLNW6D1`:eAf*i$Ch\Hc3cD +[E]AE,2)Whj:XPs7n':Kq.fl7;f4JM^;D)dYZ!='oYsT7CEQCX-`pfq64k8j)Jn3L]AMr"2*:7QKVhdGbqpJT&:\ +RXKHD%gpr8QLT6e6fhD[FQj"2qQ%'P&98[5Ok]A:4-f>;9RQ4c`-T1ra)j(]AKbBls-KU:lh9K +aKBZU]A<7f`W(Q-6f'B+)WX)75*5S[)Q)'M,LBDaO:f1D=;>%/)M^m/p!*M92Sa;.+u\5aBuM +,O80]Au/7EmOc)M-iI@ZjiLX*`GTruSXRfR-6bJ0l6&>)&!YC,QW[:N[a.Wt4&KR&+#5Qu+(4 +"'CQ\Pp>HOh&DVr,>>D%:j6C:EL04E7I;N*k``rMqEZg`%S(1$,;l^YY(g3tqf>!YL[a'Oga +hEN5^*]A]APB#Lmrc,GZU469KKRpA2b-N(JamL\SJ9hU/Ynk.]Aue'Z.5<(rep[5(/kpc*B#es" +,gED@smR4G,l,cpr.6=BH!i7NKu;>CM25`^6QWuNa,Bff$A&N+!ltWV.37 +"YGCcMBBsp"\.p;Uc)Bp37gL$6-l!3!B4;$5`JdZ`QbqK]A`i5eYZ2>49I>3X')hN&1I\.CZeg>K<]Amd +\j4lu&)OKdC!)G?AaW:;=2=YJ^8X+3M/"/#Li@PpKtB:q5h-M8%Jo_%jW+F:"+3W=ElE\/,P +($1n>E.Nko;#Y#mWj=ikiq$!qHTU&4IL(D4<03qu(NW1Q&$9Nc,]AE+$F`3lp0f>`^ +hS=3(VMCRO1Y:3X:lp)U`i5f&0;+ctQ-8(.=/VSmf[sZ=\EWum"o8GWl9'S3(Cl8dH/j,;$L +,,J8'kcJ1eo*;-pG/SPNM3P(**sWR@)fnue/3/ljJlRRZfeJ_FQWJ';oLZ`P6'"4??^g7f1l +h0g+G8A@Nm)qJ9N_RM0Ft"!&#e8?A5F!PdXWh3YDD)PU]AP3.QKOHQb3&F.3F#([&?`_oT5)b +g(rCN^63"Y!g7`%7bI9"*JHj.9ng04US[OYnHQs0)^OK&G[iO*8QrKJh%/%iX[EsDpZhK8@9 +[,l[FWN^/Ic#%W7h,*aQ9biNc,>KIG?tFT)bq`!8'Un'/d9E_,l%I\:j7XU1h(.W!0M+l^j\ +"XG$VF./N\%g?-(S$,$6:hDmI"T)`.[Ko,Jkp*S_)Dm[6a]AOR5F^;jZckIW/T9B'X9GR+R0LRGJZr)!-J:((`?mOEkfp<]AGqRS8$/HR\3DaplOs00(Om?;YTY$%"4,QM``F23/( +F5!,pr=*a>GMh#!6-pIXiED,8-;4kVkr-DduXf$@trh3W6MM6]AI2OrK3qt&;9(,?8sSKumP +BoT#U['m%E?XN#brAGC?^^AH'jRhWdeRjpTWq".=f,oFS2\EU64#a3@*=f_a4\RXk37`?XhY +!a4m[/Ggm&%)!_R]APPS$h=lbSTXQm.(!7?&iR+tNa]A +4_-2;pAeFg7OWI&2hG:l/uD#bqe\&UVY)G;UUo3,`@Pp0a.]AgrCGhRLMN".`#?`Z4bpun;G(<4Fiabd?3^"KlVYCLm[n>d")Qo_%<*c`,T7pPB8J +-iAA'!!dNfC1CTe8AjHKMkTnFJBj4OX2)gTnPO77)aqf\Yq!-*n,ib[i +M**aek>KNbpd&KjcLI*Hkhq6Hg?X`2G4Ck]AC0(7(g/X=Q3uF:'/A58MurOKZqmLV3.]AS_?\% +CorHkMc)t)[A'kfV4)$or6R]A!S.%2siGj%f,`d)5?kdnCERj<*kqMH^a-6Y6mneCh6X(`G71 +pqb17).6VW?t%]A79BF">Q4K/?HfD-d>UrKVmk`UN& +3KD>V4qV!3CXtLjoHKA:6)pPN48I]ALF&oEpUQ(@'L39VNp`sXd16[k8pCCk*SH9lE&RsE5He +^qcS`RUPhmW$?,ZXZIYBq]ASbYOtYYeTEL@>?KE_3Z.[9G5:I$3N+,Tgp7%=JRUcTBEHRNfu% +@CRM4.nJbY3_:1foN_gW'NI2^lfG_U!MX8MB*OZ,l0Y!m2V:k6 +S!g<9*/$#P&Tt;ut:_R'(+1^79UaKVCN@0DmbF4jiki%T`=4GC1NgiSl!* +Rq..8Zc`2bMbB+NVk]A/c2DUGBN]AZ48Rd0G',a@i)W\nXrf"$*$V5c,T8Yt(Q`PDJn-+H7.B+N#:% +L+i&'nk"$m+;k&#`To-?UcQ,Rb +";1?h0W7MGXU/1p4UF>r/K^KG:dQoTb^$gH>XWQG%OZBGktbVUtAbKWgM.15Vi]Af)T^^93:2 +ObC]AsK509kuED`6J&McNh8GTThK68?o93.>shu_s3/+Xsi)kHioo_^d.\j6j,'1uAfDB"NK^qW>Qs*3>K:r'AdHfJdQM$3@sa`'.ekU;?1dqc-M5('D2.Hd"M +K>X'`j*iG'bcl6"hPAiP#8Anq'."ZKBf;eF%Z-b\$B@hm,)hf*d5tWushn,Prc*5uitNosd\ +b$.sUXPX[Bg5c)QV$X"c[.r0#dLWKICBYQ43&k?EJ,UB(c,Uj0]AEbV/m0@F>\_,""rT7.=WT +\Ub4$'p9Ra&undZ7A_)4lV3j!^!u[qIAV`n+d0k>Xm\e4p_Rcr"l\aN#:cTB78Sf6>KbD=p@ +rP*Ym8IqLH9d0d9/!h/I'^i#R_/V;,8AU#4:EeXh-G"S>R\ns59o#)F`Am0p`EQRe.C9F/qnUI25=c:8-h8YphN3.\AJ:sX%A2Mf^1%K+'"^-jPlnCkNEPLr^,Bt#_!hc"*-0a>VL=9Z8n8RdJ`&7Qh\rgV0nTTu` +k#ANm^7-jUqJgR!:]AQ8&q+.LGe!L-pQ*.'!#@)"*Jou=)d+,4h4'n_.-Tuc4W%Krkj`$^1nK +>CjbJ)nBT;srTA^V`L;m>J+*rf9'eU9$jQl428fjr)U/qfF0gr<[0XPTGf@8Qt;(9>36+GVV +KLA4&QYWoR&'2Ze:1op2e,,4cMdg\H2V"Z;+W.bcscg>s\eHi%:=G]A$fq_CSU+S/M,t#Z2-R +`EgCq]As`PQMascNXjbO;iY:#Q80"()EJ#ENo#J.I2OpmEK3:5T-7Hk[^me5C9b?_^Jl__Y+p8?%W*d$qBkRDuS?pA\=fFVHr$>4B8\j#^6ko_,LqPLaqM_oY2_# +2o^:/&B6+lZ&c^9jJ)GbgN%#a*fNRZbF:l,'Wq`\ViMIj%GN"T3BG+)I8WNB1LfIdX6A$A?J +mn,G#QTbX*#RYX*uTd:(-L/)J`q7\!B?mH7\[>>KIJ[[+BHZ;-#/J_I&BPTQ3IRiOqD\E5\B;SD3S+V,^-bpbs/h3k=*Z`CI(^rF@(\RnMft4[?<,-:kR`OKKV +WNKHckp6=Dl+#,VL>;at"(?#G$,t&isNK@>6\$R.4q"19!GYMu%;UPer9lTpJ+Ep^2Z@:CcCnf*)hok8/`:Mm3NRL:C7C=iD0]A +_uju(M\kq0s*`VpiSUggXbpE@arBpq%Z"#G/Jnn>\L\"Y!XFO_qp?c%/1j)R4N9gd8<$U)bmsinU$ +GEC*TY:m%@E?r2brRs7^b/2Cql<(Pi(,enPd%UERV4>*\e.h*ga&;!1IY[!O4HmZ@MUCJZmJ +CRV%d4]A04GC4p@YE_"XD/g<$:AkDlN$:Y3!`1c!6"95^7_:;Xb^gJ:'0mUl7=WJNOM\'nS"ligM@YC2Iqi@DG.[5EQj +)>H'*7#rT'ACDsVsO]Ar8'8T,LRc+A]AMF9<'q]Aqno2sc^fc0;oU&gC@ZFkVrfD=WtT+oGSO`1 +Jh)UsRi64^)3A;7V:;t2^?Q+=35`7)0@o_2Cinq9#,s/4EOIsNg)P>#bGRkm1?4a9Jlqns,D +s1)*RrbU=pYR?P5;UnG0]AW+Ipad+`]ASG/S"!i$usHdO?KnUq?E'QR6Vp&C6^ +ukH:WN0"q^?o[MZr[u$#-mqoRuX9MR70(7c/5GqL$Z)EId@qZAcCakfI,.quiqLSCDb^TQ#*P>aS#'Mah2$.HD\7O]AGPH`s*8diOgAT@"di' +OgRd_kujK]AP6l!bkSO)9?clu:9:DtEf\6[tIM`fL+BqoF]A<[I^f6XiqJ!,Hk/:dhTl'j>LWW +JDcQf6'O$D(g5d8WS@\7S7@]A8hGIG?fPDR.\NCNCk0[_*hf6t[$ +QSa4Ci/VR=dR(6>MQ%b7YMelkGW4_r(U&l7M-LLo2:-fTdZim%h@lL5HXA8R6V.`3i +[n6D&B?-csoQ*XB*B)IIE[po38GW7@6f"6NSo6jLPD&OfulB'0tGd^Q[iT=W7R=Zn#(A.@`P +pml4C[7h`?ZP*$XH`Hs5-P*f*#p17]Ag??GG'h1Hh#9>mD;*L-M]A"pm`#>S8GPErIJ:Hd=d+L +@rABOacnr3eh`"=HTJ1G/M$d'k=7I0#ij2ASHf>Ld*&Vd2LP0W@\7>G`1NqZ+TOOAu)OC-nY +Zc\YPo(?h;Attok`8G=ZokFOeM"Rl.9&t:h^O\68.QM>>Ckp)%;m/\D4t9-i5L*)Dnj[@>ajqPZ.cqDg[m;"^;(D%cr:'sn\ZslC1X;5Ds`%aCd4mWH1G;'L!PL_MhM=nbdsGj +=4:28^E0nUcHptE@,4"5'X]A;U^Q!<;kp,:eN)[gWSF +#YIX,N10%abU%(OWf0qT"$K]A]A-P\EJek>@if%r2A+M1t'DjRl8ECL*oI4E0>&aH@Q]A9ShWN\ +0>q81aFaLrRic2eefj@rHDgfWR4#5(29N@W7X5C5>m"_*88\H-9h3?3$[3hCe<'4_"^c)OE5 +V4eBi(L_O##a%I1Gp11*6qXh\qRCjk@`NnVl:EH7iL>(tqUdD[cj%M6$HbEUc-6#G>!K^@_6 +WK7pFQS<2P9FE"Pn.mn"@^gE*XhPHE-,r&fkt$"is[@gc]Aq+;0@a:1MZAAT_WbD:Ime?ZS/0uEp-@K6p\ktci;H:3H%5/Kca/A![s; +[i>W8W=i=M0-h9cI1$IB=n7kN&)\cj(3(YQtckJ%7if.5R06sVLL6Go(LHefCIfs&1e.Vck0Ei:@f7[nB#(8g`Dhlq<@^_k-.eaH3L +7Bi;<=4/IYoKA.2]AU;]AQl&Zj[&E_:A=cBrhfMdeA2I0#:ri#SSD+!R=X`j +8G]A\lYY0VN-T*UBqIZ+!"9A`ZdTX./*7$L+`bZJAL+DW@LD\oAE[;UF*a#\$/+m4/04A_fNP +?L3(=4?)DoI5/>a,''\geh\jMcnD,U=K3NFYIHTZ'(=qb^i`q1No@Zq)W4pTU19*dDKur]A26 +g\7\)ImB*1BZa9g1qJ16*t;>ZAM/YF]A4%GrK9mR/H/2RBpLY-"p4X/^,(9]A:me^$bJ>H='>' +95J2H5`OD*Rf^P,RG5)`=5OLi<>ckt[)]AWuUI\ZXOfEF!?2eN\]A9b,4F=:bq&Ts@cW$ZeSG#.NctK2p/fE>kT"*tlQZjB=C&ciZMp +Sgj!M+c$f>?C>l2H_IJ<(mK7_orchfh/>n1VE8RTS6nY4:lLfDQLhcR856'/P`e]A,%:)'*[W +^N'N`=&3^8?IjT]A?Kb-aoF8AriiRKGRBVgjaVYeK"2i+A[*_%qoZ,]A^QOJN27SWA8n7p/M_4 +1U"TLE`'81-]A>[K=1H!%u3WX_JaC`$Uo]AK0L6GDh'P]AI?,Cur/TOYgLA(:\J]At/.KF'r: +Wpf&HPr>p]A((4IT;iGL(jo>6l:.D\_=uH2<(4.fBX8`%'d;,DI:74_>(o%B*jufI'H4+SSUA +p-A8Ba0A[JasTc7QHtAa3?KJ2[.b6QW2HFm4^L@(lZanh(oJ'u+Z8j%M]A^H^An") +,AdMJ1NrI\CIa0!4Z8R+ED9\pLg90!qqBFMET/dnh+CgeG1h6RBJ(`;0!8g8(_]AIola&M7=f +GYc$VH7F7#Dhhep7K+32r^NZHW,Q&8M_LALPh+FTe^-^?I!K+^7?iURfIo:_9'[>UoCL3RKA +O?`55#?IN<8JFM,%r^(#3af]AP"sTG_iMdDsge[Ebl2)3U4VKBB(IoB=oH\.aJ:ZIqq,9GJKg +n;CI:.%++mje!rJ:hM6ACQ+cqc>RbmgC:^_K`d2-C_\=P%rZB1%LQ8`J"d6G[GP?Y6[KEi"[1 +p@V\1RfMht^fo*bDAoPB]AKIWIL]ACXq3b\`XdnPo/>9pOt!H$e%]A_&5%*&\3uDr?/[XHI?qfE +,.sk7Q31j)B5q[-G!p'rJa4GHn$ButmsQ=D_FcgCnPrW'jQ/A@gNTTmiW]AFBQ@EdpB/07uIF +3f"g'b\3!t'%*^5]A2lnNFm*bI#spDe9%HQe3F^;$B6;eKW/qdn(()nL<$9bSr5nI,C^PVeV&pHZ]Ao^M>; +USIFaa8[_E0!4Zft10\1#I29)^&uqiJ"qY)]A^'RV`0HS+#:qT%Ps:*\HH?Ce?l)Rr<<:IU*(*"3s?o"(^r\l1kuXAMTtdKf288`ariEPPKVd_Bd:T# +fs&`GqAi^%[PVLSKLqe7jk9mDA\M@E;l5#3tX3hcn2U.YsI=92SD*!XHPF>;XjbW+u8>$)8A +j7NTZF:J+YL!$GS1.R%e)<*r>VFntsYE3TGW@3Nh`Yh/3m'r%Rpao#N--?,uoKA=#\PYXs%P +QugGG-j$Vq['-QG"bsm,]A5ZCLuC:E^jF`Y`hD78JrantZ'4TZA=(<&lhMr#,TLAHI=Gb +A[HAhJr7<):MK@?-dP6b%"(D4d6S +(*aln<2Kj0'(la?TknV/E.G5D,;m? +Eu@5G'tH+D&%36c5n--_-cC@'A0KODF!s8-Dc_DuP0f1LG7!>*(M"$T*sp]A)DiX.1K710pkh +E!cC[F-fJI[mHVFg$\\Y`8DLN%S>8&q=2qIY,Zq3A3!uYp?(9>iYA7Em`(rn7_ddak@c7(lO +l2)K1+Y?B)W$@\rRLVoYp8mKO*C?YoO#K>G=tXQbum+GTo]Acg)$A52fi;MsP7mm,gg@OjQ`# +DjhqtmR6fO**[FP1]A5W)^Q\/VENN`to<\4F?+AJ'-h;/lL5.K60MhCCf/CI?dGS2R;=*'K:B:<38E>Dm7_+#LfW!O5rT@'h1*_[^YTq`FcICHb`1F9$k$8h7P^J'hWoAqG$ +KgRZ:t#-X$02i(r]A?F00?AfB^n2&a:M'/'`o+[Hqab=3$\5O3tf.AP-J/QYAoML_`a&[mC0N +L7,PDH,>,-@M1;gc7i-d$>-Ui&`Utr6+W8[kV8&UZU:9nIGXYZ!!rI/R!>ZqVom`lZliFelr +.&J3?]AsXX1+$kQ(UOOAH!^%<(.PH?'d8i5eQ"&:+^XRQ)YY&#\6Gog+*mFX7k\FHE_Ds+AMc +mfc#@>OSMk4q:;!V^92qRl)1B"f7rkmbm\^A([#q^;3'\uMq!g8m4*8K5Y3So?Q%AJjT+l[]A +-DB-#6OHrjp-kuq)KEp>D<"I]Ap")d"D5PseX*;Z$qrYX\nKd%VI"en7Y' +?Hn"-Z3L-0qMiYm]AF!OqX9W`0cQf;J-LfAPH^K6J&Eqnro7^L6K##[S*cuk-.ki`6QkW"./_ +j7VgcO#4c"-*>iN#Ya-I'k#BYL@VOW_K`^X+=cB%IZ8)btE7^hg,1!*`o^tR$;sEW-&!cs:e +T3kG`e>J\j*6:[=N11DWt'9c&X#@GT&@WQ:O!II^MRE@F!'l;H-b9Zi%Xb0LKb*k7V+PO_(1 +TrDjUYc#\ZRL]AU%q\qn#e$E9c6Q1[o33CL$Wk7-$)"Uh]A<<PeeKD"oT,;.isX57udKH^@[uI*/ta]A7>r&XYqq6Y[!/KNQ\0+";c +F7#UYN=7n]Ag)>rK$1O%Qm?Pc7l4bP&FDY"&5/&XrI`Rf +:cG-SQ31elt>9J8R%0kVWTthaFOc5X($QD3C``9kqc;7@9Dc;Q#+YrML;+`ZCo@SEW(nO;/k +W@,AIc""A.3gD)H'L!aup^3O-6@H,U;dF6^a\J-9Va^3OHA5H`Re=A1KOrCY#8ZR++AD\]A]Af +l#EhW*e))J7pIkTf;d&H8ZY\B+i==Ch%s]AjRqmgF&)S8g-Ur$(k0DWhFc_\W1,f'K;p5?`jb +\3$o64gM;&;q.r=5)k7>R1^/+bb]AYSr;^\oGA+]Ac"R>%Z`Tj9Z1TNq9)a`BmgM7*>,4 +Ir_Xu"(uA?F&s?G\dtidhVU6h@jR?<0")a7P]Ar)+JLu-70_r3V\qW7pf#]A*9R#:nYl;ol6A4 +:@$M>I\mMMtqDKr.$/$3CAoXD8(*mbcHPmGsX7&>`k//\ +oqTP%0\=YsGZCH[!\9h$RS21E12u!B-Yn=J7.P,-PZ1Q,`GK(NdBZjA7KHMtgZ\DdQFlBCVn +n<"bGb-9KtkF+d2U&+H?:nDEKO*,Q]A[S^\tlr2k.B'WA7A[&&Xs*3R#mT'";^R]AP7p,m*-IL +R(-/s"f+^2lA'^P=nQ#NdJ&D"11nm4Ok5"[MTk'.SYVc:3T>G2Lh +TJ`>PRe6hWQ`rNqMt\?>OJGemY*l`\4Pk;NK3&?S)I'$*u&\.BfUkM?gDI"_FaGP1(7iV_!` +mE8CgWeK#@'V6,"791\8RceQiQLB2Vdqso\m[p8aq9g$)28[_o+6Wd['4$N1N-M0[-Ek^Xg +>Y=FPSVDL8`_=?&=)_R_^X%@rJ)O'Z+WUf44>[O1SFBE^/4^:6kHg:mR?PYj0n&qqoYC6f03 +o\Bu)T/)2gp>Z]AirXW"3%qDt#[L3IiQ +BVQMomF2*LnAjO5R/Z_Rb%;:NLXk +<$'.H(a&W7FWnE5&cgX20i!^V*%C=)NP%.]A"iY&oa1+O"J9Z]AEm^cR'FD1)%pCX8g^) +an932b/[f,u7%"BLoKOnR7[\IJPMka,ZQZL@?XcEX/*!GlIQ5%^1&NWEb(8<$;:fjp)pGD+c +4LkAb0X'S>SZnpOG".JQs+.[8qYIni!0`+3L0pfelVQ=L?C]A4R=;Q_a95HX;<"0l[>iOY"FM +maPQ8WH8$&RkAV\sskASM(ap(o?J$t&HfH-9u=1f5R*kO-)MH9:,-!]AQ[VO6D,;b#Zo'T*6W$_*gNu4T;nL-,KSsjmfQt9oG:k/_*@Y!!BD&EK$5PGpKX +GP_81^]A@i4YNW%`Z[IOi3^j=WNR9qYl+s)Lnqh/&JoA`8G]A?NL,?4`8%t?J*i/a3Y;1=#2U# +760CB'kNUl3\Y?VfKkTpJ;Jep/555fL;b@/RrUn:4oQ,EQn\FG,7#gkWDSNXeJ2[&CEu&mFj +5Bf5)Y@d!6jZ6PZQ`?H5^>,RMH7,Z%;-Z0GODM=OT'ZHM.k<9&S9PW49'I*'ebMf&&e:IE5% +A"b4BQaQU$@V!+3-d4sk`jsPL!-&gcReN7&8@m9m1nHF7(Gd +34mu'`r7c3Pk-W,pC^NCdZk`fBORq)F!)Re:D"ruhpg+htW45&R%0A1E_>d3.'b0\*<[d((n +K.j]A4-BRpD-2aa/HPN&T)6sVn_MX4mgP[W8:Nh?&ZD5_(j?Ri@s +*sVcc@N[b,=C9;SG6PI+'lKBej,?3h_%SIK5Zp8D^*dJ[d+f1;`gV9*:njpp#C5]A$O?JdQ!I+j.j+f*b=kE;Jq#bK]A#X-TV&I]Ad1ED2lq!PBo8_"C<@#,.d1(9@.mN4!8dtVW*Ip%oQd$._BB_c'Z6lMiPhrFs1:s9JK^3Bp@4h>DT>JVm1XQET]AZC +@L_J>EF74\lfY)dga%BH=d^J!4o>8DXgo^g"X:TrmNd+!8e +CoQE+ihu_M+D$Mj-/J8`hDI/Pju[b2dUiNGnfS%$_Xt_m7fSYhF8ES-=$n:ZNIjS2sR^c,,'sR1amKtT1Ar?o31Sq*I9?fX[h'Ek-r=,On/+Y2 +;meX\5Rdr;:S\Pf-"u@.%>;0hno]AX6/M5#`KMauW0QXCXfPVW"ZCZ/-UF0LNr&4*BLf>:=%3 +*o>H4fP3%ADtM4>JQ8DB(F/^`p[H +Y;2l\`Ua=L,Q-%/6he`\(Kp[b,No`ClLPuV24"i.d)7&5nd/0;u!f.&_:^hpZ +oD+UOQgW8)ESrJG(4hN'U#*jfWori\G6l65VMOEQ+iu2Nk4/0>CF/cp2uMPGs((Q-M!BRP>H +qg@hWe?:XY\o!_8@,CI_n<1]A8J5D9Z-Di'eu6i,GfWR%jd4#gMF:7%bi2DrpWVrCL"qf_^T: +VZXY%;8Dk2&`D$160k?nR4+_u41_3s#m"?$u)W0C5P,3*1RO-iaUri1JIUbF3 +<8mUKsJKqa^GpGZ5/g%HhUE7]Aqd#UVEqF;!,DClCjn@0OgaUFY9$=a_Z,:;;LT`J[fS-X$E? +^KUL^oiEdRB*pT8lKR^fLpW@k.b^MCAGFBU+;TLD&"f+H[uCNI?%pXd3^lBoN=Bh6c;8Ra+IVC&F,.:oC4`GE-pBQ\(-BNNu?.DAA,fSJ'`ZU +O.R(nV>2oLj,_ANuTPI=CYL_eql%:;Hl1TDqVD?4&H*_jY?G&TS,CS!\'8>.AQ6JYZa]A-0[E +d.,O.-bY!Nqdutl;5:`^#*jXr#ZfE<[Ir`a]AW"r@Q&2G7#7k4DkJ7o*]AQ(ck+B]AEQ2jqNbXE +hU+02abt:J0^%2*<4UlED0sBUsh'24\Q#%K9npLRIf(6.Y]ALg+]ANF7cUdoI_:;\$2HZeV=;dHX%0Q)9npQu?/\f<8*,oA +Agk@TLi`)7dCJiRR2=(e$Oc_Y&ZOqudpD&JO1\CmIuV2hqY+&lF]A7%riJcP=Y$8mb"nXe<$Z +UQ%jc7oOG5[cLA[sQ(BRl*t!(c_*R*SGgME(&ulH*=0mf2iCG+sE3o7F-1ErfX\.P(u[SgY. +mB1M78lUTF]A-(#N$R]Ag+/@[9A-70hj#hX1mOnp:#OMo8)4GP2Q5*p,`Rj1UO%_DNp6Cp'`)) +sH&!Ls@182(ij.A*4h"G'29+Ul&d>.I_G.\U!h/8r=F\>n0cYbD#4oklGX/!0Fg?B]A%3FfIY +iQd5G^d1V_;OB)V(]A/gTZZgs`Rm>7<_H@nTqXoaN(>*7&h+\\gURanaWI&Rh@<%jH(=?rOZf +%)8-f=7r\j%&:K]A.\`#KN%u\VJ1hpV>l3ccjQ)Bf=!PC2&HYBA(94h/Jm!+0QISb$=U8J#%_ +Nj:"?eWORb92*eX4M0TbmVB)^SXb-tE;Iq.AoI$BaDOlAq.LbG9St7#B&6_*`?qc':s5Y3/7 +#_+pGB/H"X-F*l0E.de7em?MZBGup>!8..R[oA2WCmMh77J*`I\-6?F&UT8WIX*gVP%C%s@: +s8kn*s#j3X_6NH5$:9"X[qI@d&6V5WF)W%?;Dm_=,-E3j+!VY]A'c"+ZdGV>#I&M5&5E:/fU9 +*h4G#/fhd-G+mhYWfG2q_BQnsHA'F/jIe'l("h6uO1Z=@D5TQX_n*'3A$34ZJ^'4#kZ8)qF$ +*h0:4KC'b:#)QQ8*i>akI@ts0?.0g+)JsO6QC0=gt./iWL +nZ7HTLeKkN:n1WJd!i-6E#l'q^C*uhh23>SgI]A/lm9)pS9(7-JX@4pF4?Jp8gKhB4th;*IfT +n\7[pg-INM.::t:F1t<)2&D]ADT@&L,Rld!4ODfdaF$lSZ@k,+4+*?#Po-^MYK?WNOX4>j-kN +O+7n5_ufSp\6gPE:o<9]A=p#hm_`cP]A?AhVouR6r:!ZG)\%]ArBl(s7e-k!5lT]A=&T`=SO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +*)Pg.fL"9FYQDHsb=OH-0L]A=Y[ROBRlDV7X?,OJP%)QL:''r-$uTp&2^J_(a3ZS22P\qs +OhZD3mtB"KmN1\IKBRZ:rr)Aj\uECuT%qB@hVQ +h<*XV8d4l-EgfIqZoYbroOoF\qM)\FBD"+=(!@)J?sfFsYWp'eunK/4@[#ep>`#5\$Fk]A&(J +if93Bp+4@0c0>/P866mcZ,PKT1_^]AT6:0?@8 +#%qd'1VjOpUr0OI7?12Ff*3)l&B)d#Ih\]ADkg9Ss&BnIjYeCY[===r:8s-Zgr6Hcf<`)[2A- +IfE&n`^]A_XX(2'[bedVZCAa1R:nbOf7DJrr-Lggk1H[m?@KK>,.;eZH_@3T0Df"^QZ!R4kS/ +j]AtO5SPp2.6HRC9%_[7RtJFq#Jl'-NUHs/YK#=ZQ!r*Y,9bOKHNQe6age6gR1Itk2^;5[u+8qV@rP5b$S^Qh#Q7'sl,n: +#XMW]A6P5F8EY2IhWk7;Eg9fqL*0^G^+V+**r`eo>9YPo$XNMkO15?s+]A; +?CB4@2BH-c9r;4,'OY6/b\5F*>r/_N/iLSr'6!?8NCqG!k*lJqrXb?]A_UPK+SQ-W=7]AH7.n6 +M$geb8ci5G;V<$Ng%:7=tDY]A%m;ApPH@_u8Aa4XuPRLDR.XD'Kih?s6qOTam;H>oKruLG08JVm/ +]A4"@a63U6)DLG@8eDPJ$"O'pD9"A5OoOaGl<(GR<%+-uHKGd&,Fi$$6VN0.[dGNn`NP*b1L:=m.OXjE4X#pd'-&NMInpeprY,VoWYH$.ZC7DS +D)U["k^o%33ed5hPmmi)LD99TDoJ=Ks?tO6N2[FOl6,>TB0sMgeo[j3[KH>:WG+uSE*68Vf^S>sF$G/>m+:" +<3gg(]AOkK4?k6"4Y8)RVT;\l`B(UZ:(]A?LE17W$BYh>Tjni+%WN&Z +TDG0CQ'9HS1![ofnJhg6BVPECN"PGZ=j*75*HZ!$ZYE?(rhsk&]A=YZp-8#qOr:>[@UcB4\s! +_)d`$$>0`%.N&6G21Hh(oD8T?(tO#?Or!PQIb'D#3J[ +*S(h>;)T#JmlOU"5Zmn+QnC3Mi$.pS-?^+j8qG12Bp7>=X1Ru%]A\";_5EWtc.UH$:R0_<1o_o=%3I$RJ7C0mB'CEJtYZ%e?[omM@F=pd8Gc<`4(ap]Akdif'h +dH#1t\ZI9_bV`d-!U9CJm\k1%W./XO2@aE78A)1)kLJT'I&p<+^:2;\:MV?1aen]A3Vm6Ft;o +7+@)/6?(O0Q.,U?<%,N%,HL36KQH:sQY$B1hM6_F-1JVFJMR?WFp,Q:`R[c-ohlWu&-Abfo- +X=uQe(-uUI +e!oZVjpcC5e)XO!Zd:pr[cW?30Bd%Jbm;@8U^5ZUm9oPgrbCfY[p?U6WtL8kg^^:"'LrJXrM +amlj1Uq;m#`rTA1^+_FLYQ7qB0ME(#D44W'-[#D]A!WauM+[7D$T,4T.WH\hW:f=]AD& +uDi,eTncj$+qAn3g%[=G\"r\YUu:qK9k\b;s>]Ah(=[^%V.kHL`SD91.b16W1l_pa- +V'foV%6e3@WA`cuZ:m\_r^@6&da0b:1.IF7OliSAlGC^$Fo&DQ,CdNA%3ZJVsl1m4J8^r[(0&Y>6hsC4fk;(!WIQSDL_rpC0 +A@k\T(Z\;_5*@X+6$HY;@A*m`i@GX!jA:G_d:_Upb2m1OU(PQ7j9:gB?ikhdHd +*ojc>W*Ah@P^C@8UT#db@n"HlY#jY2Y6L3N1uAK:6Lb-,JDR4+`PgSr(qSrBjfn&ClEgDheB +8D.dXF\q@+`6@]A!/DfpB*aa*Z77-Kl,KrBl%ZJoCXlaGHSecq`$n3dBP.Au[uEA;\O8gR-'s'.4#)YuMdIN,Q;j3NY;fe,*X4-:i$DFr\'SB=4@7jhE>3V3I=XXI +\nF5#YN\kN)4^VpGCQL1X.1K@QO\a0Wgn#ZQDKAFPn,.M^Hjg-;t8N%1g7%ZMam")V$G_P2I +H;.V\1`??@g:k=($_`hobamiY*^,6Ee_cb`\Vgm907&W+]A2S'++j4)%/;UCXLT2LIm%8Z)ud +81-sB_)k[m5?D?qYg;8LI@K.rARop6u!Z3V(T_J'KA/^?]AB($bFIF<&bPGP/npT$]AoEg:LT$ +kpH;=tPh8ba.AJYNNVWC[?GB?e,q]A_eIa-GDemdBKnZedCSSu4`cSq$?`,!BhU,MU6H26X$A +o,>WS2pg=V@i`l?q+GKG^Ze4bG=0-uJI%7X8gZ*(=ja5"I./)Td+B1.Qe1JB%PFaK\0!3QG]A1k\iS"Lsb"Lo:H +$n5.0,)Cg*nN]A4Zk)2!WZ4m.'*U=_3O_'EHk@/B/;Tg/P>>pMq2anLaDTlR.e(7suO-j5L;2 +AfSXjle5U#X9\.PPac9[(ckk;F"l&`Zl7"PE;SrTtDa)ZemOobD\]A",;*.`?YX1P&P]A!sO,bG +^5PK(D5BTq\NiZ,>T33L1,e:e]A[=jXM&"/U.[/X(?Sf2W0bPT$%!&#a%>47M*f9+[p&"&BlO +i^Zcj.WfD=Zq/W]A0V.I9r*2jKBC]Ab\omrK$TcNR+*;P>:M+$&hAjWZAQG8f!RPe>)oI:I(J) +-T)rCe^^U&6(e2[d"8"7&q0t8(MWE6e?`tGMFZMaWbLcEGk3&j6@h?P-Y#??2U6r)bic5)aC +gqe0[j$/t0mX).lfY)UXd"QuYIMJ`l%W]APV.5W:EaD((==>&31DV9ON[Ca_(]Ar(BY'Ij=Cj5 +dT,tY5/._h8%LSX%?oucMP*0=S>R@:iU]AY>ntkp>o:`FANGk?2Kn3E#*"g>A#[HB2e5_]Am^; +QS3\Fe:Sb0ad68;:#9o'FcQ\%Eic>brBT +B$>Qg/);pS5Lc&t,.tdV0:-;lkLJRFL)d9$57-$r,f[]AEHf4sl./7R>9r7o6XW+Ob_]AcDj*k +GCi94:?<#9f)4;m\M_jJHbSDH8@++Z#;%mM(6lh'>Bd;ZoeCMs>c%Ot:`N,oI'ehc"fBTh0I +DH0/-\C6k6&rYRhHGN<_.oB;s'ADrMqBMpEF`LME6GIXQuBJ5tmpJNQ1nPZ\)!anDdd9c#4- +[q)OIA:9f/X6^OC&6Tki_M:NC5gEM%ZZ.:+lFr%&qj@.F&jibkBR,/4&q#$La\!uqBGX[1.& +M9*MC6l`+26P$j9'PL*=XTgW,JbdD2p98TZD89LHTf5kV:;Wu$eT=+4cIGN"_,XeKg`)j^UU +ck4"AHS/jT@#Mr^T)t`r.2=;)8fT![VcUi[_l(:9__h2Y^/6qC2okBcX@jE'(,PYtScpD-^^ +U?1aGO!]AE)EJmqSohp9@Z +6eZnZ1_a6VM1=_o">9#1-Ddd_=q1-VJKTjb;F^/$Io9@i@A`peT+l'%ULb)Kl&b5+^j9(jo* +u+oIZc3[KhZQAHl)H,"aZ,Pn2HYAGMDbF_l202q\ioPF&G^mk.k +1msa]A,7[!_AXW!sI_sDu3V5uZP5t=qi%m"ZKY$#aqP4"LqCW[6[:=n.6_c +B55=Tmc?RC)C'^Q"H%hiX$O>tB)re+qo"n75HbDl4j7egB4j@G7N9#tlq&dYtY?ee:iN;,t[ +^[@KZISYj0:;U@uE'RU^G?qID@\8C+hGJ%Y!kRG2^N-l@ETDd9JJueMa29/K'$'I"h:[ +M0mP.W_Z8k#4lC3A(326pA,]AdPtrDIjmqC97$E`i-*Vh+TC$k)jkGYmKeZ%*M9c2OG`^=ujl +:.eo)\%-Rchj[MI8$r/?&KPfp>L9Ms7K9ouJ;k$sf/^kptV-Wu;&AQF,@pIeGs0=C:>'I.WG +5#1.!J!sF,IjdGDoG9)k,H8s(@?\Z-HaK&^pG?*DT8*Y(Un,E+F[.TAgC.Eb3YQEu;84.e;q +4>(de,'B(9n=r2#Cf`sh")P$FW7C`RDl=QP*F9D6-kdB5mbbSaQ0pp(AIusB@:+NeQdK1cMf +A4RCJE=5hR7:F,ls4$I]A3CC2E9[+,E!!esk##RUCtcj5D0N#6_2I\uiU<_lWk +.H%1E-+TJArrESrP_>!3D>!8**3IV3[Wk)FZRh@J>oNbIGrrpZ+"+hC:ZoI`+)BgV%`AG(>d_3!Vi`#4rtIT41c7\br7Ni]AO]AZ(p$'`P1f)gNo/&>P7J8l!ao)>.,.spuR0=b;0kpNC_OHFE/^F,SN-NB9;K"E6eIbThaD=R +DAp5`?^I"KeC4#>M6dEr>X)C!?qKtPOHk;^eerCMBhB[NlN"M7fCZdKqs=:o=XCLge:OV6(/ +@I3^td?f3Co$@nA;@Hd*L6,uZ'm?`::P@*>SFaV +Wb?Rb\%7(0j>8,@q,V?MoEc-dXA3ER:MZg'gF!LA%U('kIf0?nQcM"I;@-dWT>:\qTVF%Nrr +YhE-<7/MFMmcG>;M\s>\5?Y3XHO^=U[K'G^Ku4qg/EM3XQu"0KVY!bcF-S`aqHEKHc24"!%H +J`Y'D7eTduV^Dk2^EE*E:GjA$Uo1"X?1QVu4l.%ND;Y/-9ig5fY#c'"EVX2^MZM;_Q6,#In\ +D/B93X5o;HN@1"D\fRqjl8_n1HaI5hHFC@q.EB5,mT?)_&O +%MPa+PEY%>Y^c-Fa/4TBV08jZR#A-&1\?PAgpEIj0XOCCsCk7L +Bo1R:X<$TB(b@'%V^o;;iBb(3cR\sR$:n)(ZCk2INB;W_CJKFIjq#W+&+&C!@%M]AMfH:gi[! +o__;?gtANh-2Z>gkMP9b$kJ9BC4S&nA_,mZl%kXb8Sk@qK*^YfR12g^IlXBFB8eL,U$ +1C,nDiLfg&:ebZhY.^J0rF5:VA?32Xkl]A.g+\+>q^#0O]AD<7gqlDCF6IHrOe/LbV;9FfRZ.Z +0QUd(6&/Il"euh1/0Tjs.ia\sCCp\AB;C1/^)CI]Aat4cKpR2Bsu-B9QL?P4o1%@`Y62a2UG0 +""E^BBLK,mTp'YE*X-a=RFS-d +Mg,so2(i0Hp*6M,Q^pG?9gI[unp_8X@%L!_jiUH5-7=u:&#F9.nu?[%;ZiH@?VJb/Dt_R-6FBj'bM=pN_!"nm+rbh`jcn:]A8F!q +.-ko0usC94DNW$&_G#_cC'h]AFRL`RTiIUp<.9"o#e!mMN&\%*X"ItFKobR?VH_s +f<3m)?Moa1gc>UsSil.o$bOEAQiUBOWcO-CmqV)!nZUpS\c#UuA)B:eU/W^?&$N/fPD/t_"TcF_9_ftW?2B-^EgGoil,3XeI/JKrWsf>pm`H*H*LVsB' +G_QN4rN/1h7Vo2a>qYX3&Ca4Q#Z0TF.MKgZ`Plr%M9NqXk':3o*!g8%K1]Al(-V7ejMdWYnH>J86X?-k'Fg>g(ZW4@:a:jPo!cM/>N-+n4a0/C*`` +_5O;PU6N]AuZ"rRR_gV>YAM)I@akXpihlfso%@s[\AaYcSNr\4)nZ!r.XH\\!MEs7N6Y&20P> +5r+ntpE?`UI@pJqe]A)lFcQ"Zh_I6A:bM1)kDINGT@p(c]A]AO8GY`TI&5Lnhc.dfV"shZgeB]Ab +e94u$5#/$\iErE]AEn:Kcn5;EB"MNk2UWSP`?b;(.Z0@*og;p?9TWGRe+j!%"3E`D%*YG0Z6f +d/Ek"C,[bd"0,j/",`uQT)m+K3JmjK5u2s7^3tCZKhiNVG2'd.^5=j)LTV3]A[,upT^rK^q1]A +(NVJ>dYB8_*O$Q/I^EMH9+p,TcCg)G8`ra%R("!.\)5D;[ugq0O>$q%(G&ms'VC2i?lEHuNb +;n+Y.M+h;!JE?+)o+B>I)T($Z:P@GW[um:P[FCq$8/R^hZVUhlViZib<[)j<5Y$_*C)b0W5^ +6/dHkR_7g&6,6+#d'^VectbQ5\O:Su6&Q!rL$@DoeM1q[29\C\8 +hG=F-NO$7K/o]AjtqoWfdRMB,'ar'qP?G?FOu_K<<.+-?4C5'WUAgM)&cB@TUh;S-?\EM0HC( +QQ"]AEp\iRl10t@R`p5(Q=5q.IMnWW*N5j]A`LZ/dBkYq=.u-8SqqJZqePE++7B +V69-PBaa([k77PbKLaF:Yh3^2oqeBNQcSB;2:A,.ZrnVcW&"28s^3"/ct\=0QE-U'A'`%mb6 +d;e%Aa>7.!=Ym-,:sQR'#LIA;Jh_@V@$*.8 +iQ<4?#Pd&jVWqWC5Bo>udX5-uQjs)?]A/*b$e1S$;3Zn/rD]A_0fqSVq^3_9Y%S*p0B@]AW(NrJ ++?+<,,C0-Ed[U:K^rk[j>#I-Sg`&4[DG"BlMpY$N3ho/rYa5=(]Aj.HMWRhn\G]AF['J"a5L!Mo!_,jjHoL00b@@@#K+3dji(V;<4'Kg/+9)R51&h]AQI1QO4d +&?Hm(U/Sf#TGlbdc;#D3o".Lt3(V;s,0j5sLGLJ8RZ3I$7LuK7C%)\$m?XFV1gd:\bn)7G55 +h!Q)-l.20+Sj-8e"NOiu_%236;!*k4TN$_q,?(n79WkGTK?3Pte!&QBccHB"g33>JB/@V6.T +JVu:pP=\K$#e_gW#ojRh8:JL$0&J;h5$)@_^&/CKTc*'(b=FC2DUVO,\?VN"mepII29S&kOC +!&SKTrTk[@BrM'DMs$/fr9,cX#`.se68iHELi6+0_/<1M&7**3,+F1rNDI&:/NmfV;AN$SK' +,(*dcbD@#A`d2uQ,(*B#/B%g>dla^41I_@NJ\/d6NZE>J@"6>>_:1YJ]A[HW\SaPZ8HLP[Ze7t +9pYL2r9]AqbH%LTNu[n`MG0"@nlQZPH6+W@n?+1b`>g(!U7OM!+&6t5:hF.K^MkOOrQB&4WIJ +cRl.Ajo8=:=ZponElX\mL!=LdkpA^qI[%%M.iK7n6#C:d4AB +23F;Xe#m&%J9s#i'$$FuOq_oF*:4+\3mc#h&1A'li/Wnk#>'juUU=ZiI[<(l.uT*iL?tO[hdumU_%9-lHLkAia)^.fWL1C0$Y$Kq=U3ErphR +kc(a0;TmMT`BrO7K<"pe#F6+@5-0@BB#5Iit@'7X0EjHQIBHHKFR#9o?T\9JoMSPb +_P%V$r]AXS?sq*6FCjZ;(8n0)$p5\PJjLii)kb(+-d1f-\F@E2?[tr\-mDJ+c+1oe=dL,eXEr +"F-d"6#+BslQENJ? +#!\]A;;r>Fq8S7Yb$8Xa=5h_fI.V#SiP*ZI?ofq6Vq^^2[idK@&GCpNfW;1%$do)0fbIV,=CE*HYAQ1IDVG*oOSm_5=HCm-.CS$)2duB +,@+3AkO2bsnVR&:_Ff@ +:eH*LYr8Y\0kqI8N9[bIe'R#/c$>X%*nNqk=oasM3rQ^NdokA2]A3:B&S4VBK`%Xo(UKk"P[M +eRghtWnc1IHI)FAI&RgU&_1ZcL\th^ETmhuCBRcO8;`%q_+DZ[28=O>O-u8>r[UjtPg"O"0m +0SbEuBl."/$oJ'.)AoHTAC(W-gPuk]AMChBmN98`>"pATuuL[hh#iT-C +3N=YRBq+iZ)kHE]Ak7_]A0mD;S1;DhgQFI/dspal"CJFXrME,bN*QI*NUlE$LQ(oL"IgaL`Kr@ +_HAITTD8YYO-I;r,_AN;pILf^I9uI<&Q4Xd9B.*ZCKL?A(-+d-7^jrg0>Z3p3C6a$J?DIPQf +`eTjOu<`m7/&2b&0)M\cOgh6V3g_[]Ab\"&@,C,fh>0r?QE6Id;iIG"<#U-)kV,#+k+1< ++.biQUAkS]AU]A^9s3fG>ZIH\R=FU-iO?fW=9cM-4Y'uRHo8%)E@;h%I%8Y)=]A_b+-"6 +?'0lKLO7jZBIV5HJTT0n]A#qMa2HpnZ'=#KabGMFQ5;ON+seR2b8Vn6\`at!k9_Y.IFXG;2mU[FOZd'#i\O9jElfbB,aNA@ +TEQ*;J^Xec$i5,g!*qQ8gqR]A+'#.T:]AEbm1p[ZWV`q$YXD:V(TaF8j&f`.&9f40+;So?N3OSJcqnsOrrsn$]Ak><9ZH +iMU_J(D%MHqQ$:%P'ap^[$Du?8*Q_7N9hoXo),U`dimgc?30MO"@E4DkFR20oK+H;k@S>^D]A +>a=]A"b\b:RL.!JeAIK5Q*RI5[X6ki`TbJ`[OH:Y_.9"L:F[UF;f`I`M#6LPmB6CVD3R0JTQb +F89TPkPVNjXt&^@igK%a?EWt8HU'iV<;+oGY-qm5pKH,[fj5+<)[5"MEi8u\I9nGZiC,sQLN9dmX_IfKUW<\^S"h\1e +YMZ]AM"V5,cdBd]A6iA+uUTWNKkMYZ+T4m>)Ys#`J_QU<3gSa]Ao$YUT":]A2f=(,!2D"4*OKX!9 +>IaBA1PK`:?aq$1NMJn#+=2se1l,[6WL1VHkl2l@Yp\K[DUM#K/'=TYN)#jUW2H.IP*A^Wo9 +(*lkOYn_8j*mZkkoXud8M[VFq:GfJ=")lHoA"RB?7fj.4fgGj'"ZHm&24?bVH?Gu<&Ne?6JN +&XSKnLQFB$e/KQq\WLFlPOPUb-*IY:Z#EZdeNT:9WRJ['Kt4O +i.+II%m-%aXH2_+tMjNEDNBZZYr10GCMGCKla_CeH0(!)Y;$2/GlcJkd#E=.nOGM;,-fC%pb +$Ylu/1;([.ccf1Deu)lPMbF:o&_Tp>J=VHhd^*N'L!J0OnA`.6/5;]A-p5qFt/ +-D9_?M>TrTH_328lns1mDB2fJT1?V3bhL'Kb00XT*djXhisQW2Jh5T)$q!_Kal`e?:VcnM9k +>c8Tb#>/a5m&Xp8`N+Z<,UDGN[D_)9OB_q.`YUTrS&Po^6ThK7#e2b`,g23msB`RnR^YX7k`#ND#002e#j$>SEf>uEs1Q[XU +%kg@$JGe?['DRNerV6bm[);hVo?qG3Sb,7#l^+S0l4@>f>-bJ8MdmEfFX?CkKo,nb"G?=905 +Iu1klbbn'0PKG#&rW1e/;CB%`DAWd@-%Kj,FhtSg)r0n0JFnQnNq@*T->K`1m8!%,XZHUdtR +^1E`=5K*1)Gdf8[XNdesf02"j@C6Pf?.bIk +,P0#E0gUXH;_Q8,g2&P8SCcO,5[K[%N/30)s%P>3bk8p@P;uMig0OoTVqZQE(.`p/+5dHdoMnfu\'uPc1WrI&ekSej?0t]AW*F[m:f]AOQ +aE73@YOa)G(XR?2j`9Og07=Ml#'L>I9.YqLU2E\iPAdtG_*'-/'bu+Ba]At@?SK(_I=s$lmgg +Ku_%Kp^e=22Xd1n+aH$>.'o5RZ1L]A>Ne6)..S?r$knr1lu#libmjmmE\sF#WW9^\CXS;8/1rPT@)'O%a;W-Qb@2[UoCJB7-/6u9,R1IUji#B!H/3lV(mMW1h:KC9-gl/Iiq:%bT"8@5NG +nn['2_`pEuL69aV*+idOL^UAMO!+T58LtVqA)T)HU3g[ +Nc!+cuVokHsF2:M=[#Sj0Ug]Am=Q1^iEU![UoB=M9r5Y5t]Ali$S0ql)p8U^:u>m=k8P'P!k^4 +nj`N8td_e[:Kc+?C`Ftf"(e4]Aq,Nhl9BuGa2!f.:P(Y09ZQ\nQo_I'($NfoW=]AlZ;%q?iNQe +WDZ1.KmMk7S!Q&0I0O6sJ)DlHSCCU($A6]Af`,;ihZo@WH9;'FW`l2.^uNVWR$2m'G)_pEX#=VrnCi*I44f_7-V&XX#hOFq%$,"Q-JL +UhpR'=rec9B^9db5(Ids*2KW++087j\oJ.J#FCgpo7e.C(4HPV2eb/&\2m:\k!>2QC +Zm%&0F,[kCkLD`,!oMT/Ie_b!r5H(A"),rIDD^nkG:Co-i^R1-\WiKEf$=jDV'et;I/2oI6o +X"A:O*b>W2XA&Yj0ioM)6PM+Q6c.-Ik`?/S)bnfq!B\d-+,E@!EiDHD.n?^+/=HQ^7Q1C'c; +'d"mreW1<0PEYD@Kb.g9ia:E&k#W3"a[eEktiL@;RPS&"98jloup7,QKhbRgJ^/A#B+F+WY[ +HrXuf1;tgera%7N4&r*fBc.`3L9Ikc?\t8Jq]AL_S:j\+6Oa>dk?)c_dbd +8d3l$ak4VHWA-4]ALl7^AALJ2iDh@/J]An8E%9!+,"qf*qe;4qYse+SQ4pY!.8tH_O2]ADpeCqr +%-ST;LecMIUB5qigmA.kPiF),s7oIR2=eSjW(MOHkdA#4JWeEtp_%/8lN1-l6pU*^I(^TLJE +g9@oFcD,hXGm*JcbU3TbV)L(hti[^RMU&QX@?OrE?^.NHu/p*B_DBu*OcFB)Ulf`k$HK8ohP +V_(UY"QiYNeS_Fl91q9fuJPlD$d2Dgd5cp[dnDY0QX[/1MG[5--#Gb8f4k0!DBE2:*jO.+di +buSPf?N7=ErdAWGb+RcnWo;l_&/#0X-0'\@VX?Fc]Aku;=^fVV\DU^Ip0[f!%O@dU*1+PVrkm +=HU_^kcS(nPN?$O0H&%"%k0k +7'ACKT+uV;+F\H1+-b!tbcR:%(3,#eruc$%6pA/n.)3i2mQR(J^-1]A6\5;O6A@9fX5YcBBgK*jQlUH!HYjW!%-Q-N&Ql1X[.?(T(_L +l]ATL88g?u;td,R.8JI$URSc.S!YgG__lEb*p#g2?o\$QN)Y_^3eBX;k(7\\?NLPjHM0Mlqm3 +cd'b=`G&'(GMB.Q"4\$b@!pk7o)7[W,0+f9PT3h29LWI+m8FIq!PAe+gR:h4FT17jCpDu4l/ +"9>1Yk@8a7d`6qfAGQd1c +Zb>h`+cQJ/W(n36:d)u7So9ZVGa7Gmo)9+Hs7i4:,^1kDV/,=)N:kurfB<2mucsf1qq6>%0X +&pP*mpIO(4]Ae-InrO$UjtEV>SW#n>17uc/W<>_NT%!scMhc0Y&.!(n3#aj]A&o.8,13_B)UjJIR[0ku_2r!`rb/o?Jop)[ZWe[WMk`b@!b\#Tjeh +1"cj3*gieii>8q0^6nQIu;Ub?aJe,eOUNIQfqZhC6t`%9>7Ks1!\[$`O7+=Du36k"5LRhY/1 +_Ep',gPMepQE?&(H*('mf6Bs@;%g2GbDkU\Zg`>2rE&)`o[WeRc+LK::r0ML?)Q+YM/#q@Il +P27N%39BCY`:m>"3>Vmk$&Gn*1*i@[PtUl4P?"pJ*]AbSmDK1gq-VRJn^oi'>JNH +H*'AuH;0&VJ5^Bp2JIoYc@9Z[;!b>KJ,+=]AEN*KAJK3cj"]AP9Zj9nJRL'B.V;--;+IF'Wm"g +,<[ME[@C6NAb;M`b?kUOSDD$CRk_i[7LuqLKbkS+sjo;]AY!:PLY?0ebepf<=NOpben[I0i6D$B1/I?#Ip`s +&9^ih$u,fcE%_$\M@9#D&_f[aJ#:6s=>).+/`-:7Cn:[iZ*\)3r-R;tr[rmtr@0CQ7<)pcu5 +8Q0)N&,,e6mMcYUfTL&8]A,J"j9Z\Wc,M?5koc"Dl.-Z1Tk)5kVP\20n3dWr4$Wn-(H/pZH3) +nQ>@<]AnAA%d&k=LVS";V#'RD_HDJfoMQ,cfe'L16:i_;;Jg.j-Ld2]AB"kKGAE0C'VV_l0'', +ZAWI3E%Tn(EdS4fudWR6Z[[QgYul2et=p`IrG;1[BqHWcW]Ak*-TY7d*B*E#> +KUUrF&)'7;=!<.@U\)%$L9YCJ+VWc!BC^%jF[0/Q]Ahpk/g<.mQh0\L4AXb"I1tmsReW^IC:> +/R#Z`-KK72Km:fN7>:Lo?`2V%?(f3ek63MVNA9lFd`CB6ukq&n:IlA?a-&Nf"u&5-1lAoB6\ +MI[7RFQ[ZWfmA"rMh/s+Nr0^9qVW_mpdZ]A9t&COQDqi_Hobq_<[ +7J*j$50L$AN=\*>FAbiHJ4iL,1DjR2.9XbqZ!"E&o%*<"1Zi)_AL9o;H/"1So"Xe:4Ok@r7L +2)rPICNa`"m]Am!2^?3!2bin7rO\^@`AGd1,%.mb`6EH-L13\7Z>i#'*J)7BPrr*NWdqsD+io +K/.(L"-T.paV=/eo0&7r2`f-bj?^5KEMOra>B;dpcVf&4.\+uOo2R/n^@]AK)[-arLDGW>X+t +l=ga%3bLEt2u@]ACE*ZDHN'o%).ps(4K"'"'(d5!Pbd[;aM<77,PNPs,RDO/ZL_!-?iY^?]ALo +52_Llhp.db&lp#(e>U,6G8[+.8Pse'B!^;'DG>Km&o"0i_ZT$YCSepp3Z6NS#h$cRn6Nq#)3 +L4R]A5U +>gdN"5i\Znu]Akq4jL:hf47\;qrVn+'*hu&u'08_atVVq!9(FZo,_s4h@!`&Pl0gsJiQ$C7!L +$,h"BR$`jXE;qAeF*,;CD!9N7]A>%"j#>Y[StWh<02S$Z^aH49&r.0.H/)9d&JXJRQ@&kAJ\pC"MCrOl4/G;Gh]A5NM\9bOKa +Uf+j2eW`Up[#OuBTt)A$T+,pW!@CW_p>V&d'DMj*Ae[ENnA0]A&&ML+YPdG91<]A@fSIO"eYoa +WZdI-CWgpt.N99ij&)03Du#-6q:=0t#>*6V9`s%D1r!>p:1U-WUc`Lk!3")XI=0(02cHTgB]A +h)q2Y$^=DZCr?!D+P1q+.)S)NNb^'0Fi4pf^bG7+\)Z@k/#U"O?[OiFK1-jKeq!2B?2mMTe2 +bqY8R0n3]Ai.hED;uS+HDB>1$6(ZOT/P;t;27u,V6,T/=I'\f\-;=<$d't1`^PR1fY\$S[#$= +*p\_!BUjMtX1/?neO9Ha;C6FT4'!ZDVjq`AChc0F!^$;%:6Q'^`?>QqXQ@8WSLH.G0pLV*&u +A.W3","9$,fHV;#\jIsTUhXf)cr36AJkO*$oR4Mea)%1c)=U5LGs#\Dea377Y# +a-Nn/7osrgQN0m]AdA4lWd-T3*rIiS%f_H]ArXYLg,9mKF5+?[4V*_[[%JAV&GnQ!=5cZEh>L, +DHqrdnO]AZ9&2t +s^CNEH3^>=E'ip8?rBQfC>kG=G`"[*8i*GMp_ZY^f1,<#oa4f\o7@6noL^>2+MZLE_UV"SZ6O52(".,AGa`%YQ9B.(FGNI?gqlCi+WbmFiHKYG;luj +R;Lb"r9K]A]A:0e6Wn!R.-tS]A\X&C5d.t_2h'Q*2bHslK8SG6b0H&Pc%Ph!QR;iU!^J`BS]A1Tn +"V+=d0iAfsXEQ=3eI$nHu\(@h$@rDsqH3u\?'R!rGJmb4)\^`$gKm69.f.@5+$)XEis[B`d82YGm +CufYKeS6RG6BH=92"hAFS3Wp\t]A>TF_kaX_1_9['#?qdZ6:pe>33ELuP\oVdJZp%d)pK5ZR_ +9o,1rOA>4%nDEXCn,(U7uSn[k*L9AkjB%N]As.`6p%e/JL?pPt]AFl@QG#bZ>-fn-^\3p4:+1s +0%SA%>:bY+1N.+qom\?A5AMMX:Hf8aI^4UX;PO*H5Jdh@Nn0cR8GqjUN(']A+lAe$l?;gV;!_eN$iV+h ++n]AH)QP'UV3f'P?@ja=np63k),B(4U"dEOb.WZb>e2BSV_Trre:Po&U3)mn#ICEEFgYU2@?m +RbI7)c^s5V^>Ga8'lD\I@gHZ2`>s[VB[%@VuK5c=qJ2d^NmT)U11HmC$Q^m4[C3GV4TatY3p +!;n.a@F6g)-ko\J*,W=oWn9:JAt[.N2YgUhGQFUO%tbRAIK92l5/4^;4s5!uSW%#gr5LX(McULo4\tPcakBE*o:WmXmQ7_!$@TR1 +;%V!#3iB;aU)H@=1`WhLcP+K_HZ>.cYM(5Vq4Nn^JpcJR0F[5>ZHl]A9'rNL\g*hS]A553;1jU +9n.+o6f2C/iG:W@#7[PGmWC^Sn+0m<`9Het17uU@AAV<<_QMEg$3Y)NdK94[D5#^.;JmJAEF +EGVK_KQ0[2C'oAK]A.0@MJ13B*>aIrn2gG>mG_uKkER5TRQ.*0):Zl)(6=_1 +,.>@It*+7Ro2mBE*3+tEH9Fb3=KL?M^"]Ah5JDf3d+4acD>lK6l;1AP$;.P41K?$c5;n\,E[1 +VEJL@=$$A(parqb%KEmV'q2C/6AO+S:Gki2ClOYmJleP:r:C+`O!438fAA]AXm1T+fq">:eu[MdEmO) +1^4+36rnGR&>Mf7)s3PjMP#@AM*5C@Xi-gJIbkMq2/Mckl-RJY&`Ca)Brmk]A3[5^/)(/''gE +7Id8aQ4N\*o2-,;d0E\g38t!E2fMu5Y%$D'd6W[u2bQEE>E2tE/N +bahg!l.-?T=g0sAi-dt;mAnurfgaeF\0*<>F$F:X-7Qmt)%qgkVJX_tg^b26^/B/4fibS\Es +MJ_AYl@Fr:m6L7(&]AbXk)R6hUrkN>T_jOn7[TGN4aRu:06A$o7lN()TS__qm^bLZt`\ab\2s +_CfL9.)/\42Ng]AZVc%)^W`WAcU<,LPQO7J4Q2ss&lVum9K7^d`gG+NJU8ri,6:4OZGTkj1.E +P4C30PZGYZK2CRbfJHrRHKPmq6n7R5!PB`o_[t6iLe'saRt880^F!oXDr4=lBA,d'00A?isc^0 +AoC0YZr'J)/l=+3onp,f_'>"t&sF8+f=9=*3p:9pI.l;GMS;_Dh?T$r8_NtZr,>O_8a3YC@O +32sZq]A6B3in$;U1`S>Jis_3&%Oi0\nMk&XHCTQ>nJt_O5^BT*ja>&h7OH0H6)!S(!pk>U5;Q +"`ra\qk6q7bYR\g[Fb,*9Ko7)UmcPj7&9irJ*TN3ini$;,+7hEp8i9\p?g"cUTY5L^OkK,p*@ku1D2BS&c('Bo)%#S6S(7LSd!fVe^U-U[CA482hg(,Hjg@;P3hp^ +r$k[.57$j*?bHk.$rNc?m3/1=FpFgl$p2Wa5chC(38So/2kWbedmEJUppZ7BQinho@cl7%h1graD3]AoW>F#1:"k5_?L=`FpE*o[?&)nEDkRH#=M +]A5E%"Pk&+'hc,3)Q>V2q5jANjKOLYV2(VUQS[*P@u#GDJ/H-0:&X1%iL%UE0dtITI.GU8M6_ +[t0#rOEnN]AsRlJt@D>>>4g,p[mc4>H?CG,fQgP"bH>.*&ZX-%,,N/-^*TBi1F+"Ou,r/A6p' +IIC>R)UcOi&qrXY^ikT$i3q&g';m35)"0./(GMpnb5O(Z\957/&U-T.ApjGQaBMX\T72&THI +`s9B\a/e9GA`Aq_'h]Adu&W=98[2j'IUI8&>4NZO,lR!EeB!Htk^FUF$K#5lED!Or$]A3CkM14O=kr9,>jqJIN1- +LEtNqK(60qi<71ita!H_V4QA[R4o!2m_Rc5bd>(o$S.,<3k:^pp@J*O^E6uC)H"C5P(E*bOP +!TC"(;TK8^6,+$;cMq_@KImb"DWCGG8O*X8Q,=(W#=F::hSS?f3E\LJO=#$KudDQif9qV_?Usd&g^]AtdlW`r)0H+D`JL/p+oS-i^W"C0T +E[,B29JU14fQJi9E:HabDIRMjEXa1:161U6KBD2Qr&I7Ia83J?Y2JR2@'>f/JYoq>gFI@MCe +$b"ScHerkuj0NmO\p)3;kfVcO-[q(L*+D*acjqP=Rj+iRU29s?JcpW&5OW +4Q/A9!aA9q".6D;N?u[?gG&A-20j-VECdqFI_Yb7kjE'S4O(K\L0NL"MR'3(dXt&Xi/!!;n= +%%@f*aL-JomOHlJj5T2MEQIc%:J9N?YXq<%*e$+]AKbP7ZP!ub>J?[B,^gI6jn`#gZ)2B+kF-!t0c#P?Hl-]ArlniL+:6Q/&*n^Sr%kh=]AE&ke*_6[?X?MDj4TX2Coe +@gB<7iH0Dm/BAXY']AJgX@?D)Aa]ALKk#"YfOl(tN8%cZ6[BJQ+'mNpDII0EUfc_#M-h_NJRa4?T:$3"3<\C<)Y@.<6?eb0_N)b"Je +iBRC>K<]AX_Y1NoqR7#hUKbWYa*r`4K[$s7sgsn(uB3neF/Ba2Y8cm'(T)78"5!C#=+b2]A3OM`;kkW8/uRqNh%DG=9]A8Fq*S]A)!1Z?1TqNW\ +V[^Z\$Glen(@PLakZJ*"ekM(L0SF1#+Ia,hb(2kH[2conQ/6+5pMI`_MUmkg>O. ++B!F2o=`%LtCnE:9)9490G"'rVI@R;P6X#kYR/*'@b[o.8FZB4BDZ#CLuiKZ2E9Q4o-h+:i^ +ukclh;[jJn0liPS0t&gJ!%AmmY;:d)hB.dV6'I[M*QajZ"%VcpCdW/R"@)'s.mUQ`:h&I8O8 ++5DB:IBra%/%0E)!G<>_3-?48FW)^fUU+_2C32M/9.;Y]A%N]ArGDJ6]AXiljp&Oj"Q>,kLIN(t +@(XOa1sbYDFV7#Rc1K(ucQW#k4)LX`=;*@:4Ck@,hnSXg@cf]AVMKp_gH&qjW5h;54]AodLV@J +$VQofC[urQe9gP!YGQjMQZg$Z@metMc^/D^7"M0f+#m*TV9V:jM(NQ3!p0`Ac9^H/'CoenjH +1Moq0k2N2_U:p6gfokp87c^K:0'.X]AAjmi+t$VM;`aMLk85>!WPRj@Rqp#f.XFq9TAhjdKuK +V`3l!T6a?FuO\\@st/lcde/IMPf%pB?cM'7jXA^JuB.f4iBjq$$)?[b9\H0ngT#.A07M%at8 +%9:`!(El\oU66H?H,'I;b=3F&)2,si7g=_'kN(^j*'+^`2U?nqMRa`b?LG]A;Q7Q@V.n$dL:U +.Sa^a561214jmd`6jBJe]ARp$_Pf7JVYoHY!:,fm-1RZ9&!X^Y+Z0Z]Am-]AVBl# +gd=l-,IDj"(pj^D(#(>PL&UjWrS=BPbqaTbQoSXNXsFFLZhMM\,G]AG,g3a@1Yl3F$_f(GeT\ +4%4gSXRYtBIS":HC6Tk/[W@1De%;ff`3/;bB_k$:W,NBMBG?[3t,dOjA##pPq3!5UN]A(&9Lm +o/Khb:Jj=.ao;W)%_!k5g$9KYW\>.%#f_I>q,OKKM?=6FlID0)_T:63*@B.sAh5sdg8C+3N2 +Fa86^R-pZD6k-B,j9I5(rDbJN=Ya)>BDlUZ<]A)DLJC,j,2[k."jc9\R`(!PP$?1hPJ?:ak&T +5NF2J+[uMZg,#;T3)aRbTEFW'UR-=b]A#dJkC4j<$$IaBR0+-EtBhY71@DqYEo)9T43[#nNq5 +//,[GL*lU3a12W[.7VF;2iE? +#\6+_Er-hCau&&i>B,GFjgV659b4rMW[0dNUD$h)2U%9WV$nhrV"V\BIR]AclfJF+1P0(1=IJ'!:n9`]AibUK<4/.ufet[ +,24K=Y-4]A_"ihfqiP(fcPqn"Gq-"7Cg;4b"/]A):+L7He>?PMk?.XemH@Hh[&5_.59U_NfS#%l-d]AVq%X7o"]An/pPO;S\/7s%\gOfL/hc?C0=0WD1VY]AccEMRI[_: +.rjGh/Y:ObGJNB=_X(SOcpWA-'Yl*m*$j2)L,a[.0Sdc[7GDXoZ6P,t2g.8WkC8@+mG@^>HS +!?_mb+c\!/;=L\R;Z_IL=Z18uE)+79aG8(a.CI@s:\95[9FWO.m(gl(.%np,FcQ)3F43"KRp +JOK-8Y4'ohuVL09+CgZYMZ^ANg^=C9a3o!3Uh.hL[>BO]A/on:2A:n@>M!e\#9+fPpO><;4YU +R)[?RlpUcAW\s"e[rWmXLRM%-PoQ4Jdu5\ZUHEqu`'U8Tq0^>Kk)lV/?`=Dfl%=fN&M^36%b +VAd<6R"=4hU59M>`V"I*#df$#),`S]ADhjoRJi)5BQ_p`1lVBi;9m$WEcLf'fp_l%^c[9^D[) +k$$?orC$`q5#O2\j%lSVZYJX[,ua"6TqQL0L!6IEcA##A1K% +q..^Db^qdNqcd#-ojug_Jr."9[s,Z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.RR^d37?%%$6Lsh&rG6QbjRkh;(\YN+Oop%?dL^DLUHWi8$$sA']A5AH1 +&?5leEjS9goip-/$Hh:S(t;b=QD1H%N@#jN5k>oG<>`G\E`W4aH&./MHc_bBs5m*B.5M]AD9k +D42/*+"]A&"fMuFH'_KRuE77GU7f[V3UPSu0W%c\LT[VY22J@]A<(FYik%R^C<^q +8EGJ`rNb'f5tphlJrTa'F1jPcK-D:crb=mUa*R)4N'@NQQBe*pIB-P/m/%0^'FHSH^.r[XMB +6F8'h*7LJlbuSfg86kGEM(rkR:fmlN`PnfeQmp@%;c`P7<=cG*#^gV6CB^qU6do]AcDQ5oSRk +6`2'tG)uTi8*c.cKJZebOl'>PkP_*(ht-lfA9n(GX`OKf"X[4TONutH9,A,BcfkZ3@O2re^U +XXre5*W*RAl3j2t5,5HO`*i=Gg'@C[ci&`]Amn\.J)+c9m'aPrUUoYOc*rDl$ifqTCn=.Z):m +(DRV47+)a4_rFh=o7K.u1f(39M23q/(;Jd>IoW;[+c-(Tp%t9e*@bD\lN+R8E:6]A-'diOa&X +L&RE8,Mc,E4%abZl\P'^;BP4P3PD+6*2o@_o.i5*LSL1F5C,LJDlr\2ZHK9EgQsM@\HDE5n2Ds6?6YsANpWeGaj\]ABR/mI+*T$i*2qji&(Aj!I' +5I_l:*I38_6Kf(-Aq>ujDj.gA$1id&J&_]Ad.OWbZ?=0RjlPS`qXf]A+""0L(30)5/&X\FR$kJ +He]Ad(8'nGeL?jS?F'0W@;:PgA%.eP7-Y,$iTE[ldT,(flAo/A2'72tUih?I@R_kTjD\-23'E +Qhi>0DmnAiMjM*0E<_SaSY@=`Pk>`iq`jNTE]AKltV*>WCW79'm*%N=6q?nc+02IKu\AG=sLe +ZC%="f8e<'PC^X!pNbQq]A:) +b$2I2F/Q7G62n'&k=C@.ZfG2hC*bi*Nr:.3no*s^Se#meUgVM`+1.I`L+7a_K(6lHN/sUggMX\X7ZP9(1HMIKbZW0e;Ul`AAMBLTDG7"EL4XNDT7j;oBgt=G94\r*iL"D=W8:O:8l^4q +aiCF8Q]AJn.IZ3>pse\%In!ct,7_gg80KGhO,0pQ$P]Ak.G8@(D?=8e4p$U]A\t1f@d_ +,b0uV\,i*0D>c.ECl/(J";gEVlI]AZTMbqGVIC&2k\k2hl#5K+o^NYF)Zl0X)NU13lOMr&+a! +,)J9k%m\d0:r/I2Ts2B>oZ:#G[8h(l=IV2f1$+q\0C6OP$`;5BjUMpA$ +=@@E5HpRm\k=D^A`d4oOQPMm&F7>.or_fdJ9uZdK,[/#5WPHF2-:H^[UejE>--hJ3lWaD2W4 +F(gf5ql1C=#2a9U:,eghT,$N'hBqG[&[ZD3`pgbtM0ct-P:ugl_7bhU7)9gK"8KC% +r;'5DbahU!N$P7P`,l5blQkm,-50Z-EbbQa3i@;jK9=$[b0[//3#`7l'i\IhpU'7`ssJ.*5K +RQL'=pGIgW;rb#BMaU.o2N22&YF5LE#)oq>GWhstfW@p:38PotI:_N,XX#ZTJ!@=X1 +\1@V[9>;_Z0RbRi2d5'IaX)=e*cF;bq6rdb25/kd@"O/]A5W;>oM)YuD3# +S6IS!C3=,\^$fh1W;gb3+PiR8f3"4D!AY%]A:]AUYt-&`2X!od;kVjaJd5#)KWdcu*s/1`>k\N +IHgr(B9"bTZQc$b$=?97?s*+rDBMW/VN`"T&<Ia%;An>]A:H$W6XnYaS`n5o]AB^.SHX07r)gQJVq;\h +;V1p(?=GFhsAPdqBm^s!nrSD$lG9Zk`KN25t7e[g<]Aq%`B]AuJ2sVR8=)9LnmNK-A3dV +Yp34j?.D,(ObI^WQ^rWQa,)q*DC*rCV3Z)>EU/-qMn-bCpQlob9ECX)' +#e7R)%3&YB]Au(-Wh(m+8iD;V`Vfk5@"s.^KOZ,g<8\UVb"Lgtg(0%QPfGbE&[[O[@@1E4=Wi +5GC45Eqj;FMTI.jC<>MmLs.6,63IX:Z=GVNQ,DL1WV;H21c1R@@HVOg4X=g)FQK:Ep.dGq+. +fW4r%-W[+c+/`]Angp&rYK63=(CJoTjR]Aik4lKQOP$gY8[dY(S1.`%nb6IP0IK3>_MSs>q*sI +4N/KUgDgVWhf]A`F?U4NC;A6/'MmXZhNYV"taW)+RgdHE@ARSd]ABKV\W)V&;Za2stYqd8FV;h +3=hsoQ"t)8R,u\3\(PSA.N*+Z/P(;^`WReKrgeCA8*+[\$S]APpe_c"On7LMeYC^)2FP,6Oo\ +qhTq#QhOhIc'_hI@j"i[50r/Rk+)QQ'.981^a1a/OJ97!\N#n`_X^2%[m'(!HDk,3-ms2eWr +C%]AHhV%Xs2]AsQ5R./WE!SRpW=K$c-kA*PHljA\_YB'b"'q"BZ*l>4Io(('Ap:B=4lPr*:d!( +?s+(:>`#KYI$gLhBOJo)U6Rp,$r.gZ"f=;r_`lCj`^HbZ/J;J`,piEP19akM8IJ+?r+R8Ajd +lGe-oT4pjOs6Z;c@-@AMRn/Ei#@GbiDFRbOoQ_"BT[/_hiL<+su4a*uK+b3G:_,:pOi>8[1? +_@/jgQE60")OMdLJh*TNo%a.<)ciHNf$!V!?d)o4&V2.Z?(roB"(J=idVqSU*F!57`)NA5Sa +FL:^-H_4S,MH&.?/:20'?pkYY&_P2K!aV4&dhsJqpu5gW=oB)[" +:@/hud_j%r9ILp/,JI;BF\CTsp';e+*JH[pYsYC-MjCUSkq?)08,Fm=gbm2Hjo>),@lB7.6c[)5jeGu[_<\%hgeqRE3N5`i@SIM +'n73p_hKD$)mr\s`WPn]A3KKfALJuN]AN@%e&`8^ZbH1RQln=!TMiYpDKK+t]A@Vrt8bd+[#5jL +I(Nr=Cm42&$9E4EXN:7I=;+5G+[KMSMDVAQ1WeC:DT\$"4SW<\+BZHrI6VqX\la/-NYaSS]AZ +]A+A1RM_hPg&\QLS7cS#[LJX*lW$BSd0!X=u3XjhbBs#]A-/'o_;%([>U/>F]A#Y^)nTnPIk-$l%\\#r]A@IAqpcF:Z=kN$r%eIr%NP7;srhf9c2+QgH1kY7AjY^Y2J@r4WX +Q'lR<-d842g'4c)B1@lCUd@aeoZEj)hJ*,hUhPWJ$SkhM^5Nt2KXC*/Vg6s8kH^Ik'\P3Uq` +5bG5!Qm1RE`qGg!J:g#GnfQs9eT?qja*=D\NO.2Zo?TYK?o(ip73m$n=b^ZF`K[u#!E>)D?R +EWN]A$3O@b'RXlQik[2=.8.+WW@5[i#/hVXXr_fXq@"`(usPHI>c^T\SQl1eG3#Bg2ZgKKTZG%-+ +b'8X.gf!2=$KKFu;,u^d2naFPUm&-Kh[86Bi09FH-iZ\IlV;.dj\6hY$Nd\:%T[V +[K;E,Y9i1So*\6l/`o]Aq_uk\0._e5iI493*<1I4j]AP:gZb5`X.G(RWTFghr]A;NBT4'C2R)D; +,'H7)Xpd/@Zeg_E2@*>k_N>Y@:^chPKQ.MY,J&OmKG8U/g/[kjUG53t'Z*+?%<0&j,pos)&k +"ZIqIqt8+V(FJ^(Xi.eX7daf@qe7+J;Q55]A6[iO=BMW-,Im+ls[3[6jKY'5KL>s^^9TRW@$+i* +lL,\a>P>b&RpVfuoRY!g%cK1TdkI8s<@!me",e@2e\!,!4/TJ&8"`KI;)MLYj'L@.-QQ;@>< +a!>USs7o-Oa>AHXnCn`YDM+TZ@i2P1;>&l_kUtBJ9,]A-L[GU/C&M +4H0=t5M5kiQF:K!([p!m9SRg4#f(N9*]Ak_FtI8dqaCbi@_0l;oR5BlF"hU9O1(e!:!/UKJfG +3IBKOcDa+=dLgfbbe_T*bZgT24Y'NfSO\(0#Ipd#qr/HO0a>%4mH_[#*T@Ua*Q5a+NkY+hjO +/5eE&R3r(:Bd?]A:ITna>t$J([Y0cLTZbIMa[6:^*^JY9p4;U]Ak0K@Ki^I_bo_P`nm9eo3k*F^/`\eo;NBBi!F3($]AkSdYMB`?R]AVZM5=5XOl1iB?4A8L4@T6./Xj]A;8mq7i-0_`%10m,d)sCf4RI +DLM]A\+I%cO$=4gHJM1+A@<66O#nL1t]A!]ANHHS$`6lBK#DRD]A&pa0dNo:9B?j5/AU!*/0ac`[ +*lL1HXMpZ:p^3N143/AI]Al_I^GF%Q14d/DHOp=Z5cm1JjOW5Le7NrB)WPW&K1@C'?m7Ot+=d +6;,1Fr'(Wd;/K(G%F!2*nu]AshfV+f7(O&?o-6C#PEh>f9rEsMj7c"=0@E/Sh_)YEei8,&djB +@-C/l\#3Rh"Yk(foiO;DD7a"smm`SBUVmscA/=oA&]A2Hj;XXQUdOMh:(#&Zs-u7'%k+Z]AEE+ +W+E_QV26NS$NJR/0T#]Ae^aMS6\F$@tIjlEmrsH1!gJcU:Wt5&/;r=0X;jhZTi5/GmT/)g8)0 +mCXoIKg3>NUChRrfAPKm*I*(F=,N#G]AOCRKNY"/;j3_G(YP>G:1W\Ij]APeqHisK>&R]Ar.?@M +TY\AjoQVX$54uNrNH-uK-1I.ub4@iqTc?9iL[PLX49R-_m6SM:oY/:I``YRbj7/=/7eZku*[ +Y*UGbT4Z0lqQ/m$hpL'ia7]AL$"t\\K/>ZLQG6D#^d`>Rl`]A"acj.1s@'9"!:G4AZ!p;EDp"B +Yf1mn>E]ACnT@#8*6Nre5:"*@MN03X%F1-&#diaMXO1K68@?"YrU@=d;u'eWt1fCm=3c53s?7 +eW.A.NlRk`U]A<@RLF4fVDVNOhgRB/B24n!\c^#;O/pB@ufV$NOo*94=s*B!Plf.:X=MQNXpb +Q/77L/))cBRb$N?&PF,io_8pG-mhcqmaB#Cd]A]Adef=h[P:@abPb.p!pK4?$L6/=]A9$'!^I?_ +j;OI*3Xi8EBd;c/)K=TDMce^:h3o#hCAURMPWRcmLX/M"aTD?;Vam.8nKM3k,( +UiXTId1mq._G1TaE]AG!+WFG11463>$.3,S&RKE +1Ac]A-jCT.D[gWWr5NAG9<E=<9( +59=b4C7mGec;l]AB9"LdaQpPne6>pq1lED&6Y)#WrMK;aV[&g$[[Z%9HSo.r;g8U6;Rgk0T+q +f`3135,5tSY-T, +<+3Yo5monnFu3,'hYsE4o]AV5!)A$Mpee:?_ZXNpkpn0Z.Wlfr]AF1k,cMRE(n/5s]AVSW?t19l +?4I5Cde!;;usJ8bE?NZ?'ViAiLTC,[K$SLtg7f.Y=HJp5ZVAS8C,6i6r>QY51h>(S"4kJ+SQ +NM.l:nh$,q8$Ul.IRamLAHE<3Ngb2,Y*#9hr:9C[dJ[M)h$0'73E%36f0(ep_F/e2U +$OlhA)A#Y5qV+1OtEf/r4>L=@e"7(>:u,#lp!E^,$gZ,1LGZmU,93ea.u2]AQs/-#+#YZ`31U +`(0'Uk,2Dnkf5>`9O5#10Wm,P\a!o,lOUaD1Jl>gFk+U:c-J+:3C+Q(1)T%fUsip4\'EqF-b +;>1adpVkR/`%IcH4QhLl.Tfk6C7/_k%GgE/Vk;NU;eYklLujYkeuTI^UDKS$^JGuAsqGVOlFg<^W5.:ghNuGq-/N7!"nIB2A#C +;0SsiFY5]A"5D\u>6NUE-HO8Tq@q:]A2=7+fKPB8taqAqeP?(,'Yu8U/Nga33kZ(%`i_+IW-+5 +8"Op5#bp>8^^fU^)+=^]A<"2klhgf"<>"JY6XBU"/sF]AP`R#VN0AS1jCu,tV/UXo[aj]A!,]Ac+ +-OKsW)@_G"aZRBXPU"AHa385C+1Fl5\mPQE"Ofm<\d&)tj0l0V\Y=t9)ek8^AY*7QA%aosES +]A5@K^@iXYG_00gOX^.L!mjF"4A0:V@`uO,dPUP-K7E)[e%3#eA*C.tY"_*I8([[Z?1j59_ +[Z.!>h$d8FJHB4#$8bA@'W$]A_G@)&21MOm`8NJ6aN11H/tL]Ag0'H<_X\V&,:X1_RD18'/D1D +2fU2/b"sR/D"]ATPDLpkpoL7Aqdb]A3YgJT]AN88KaM?]ANE?TEHPrIl0ADgkEjbY(`JhiKacFr7 +q+oZ4EU8EiF<>iYOQU-!sgBr6S+D7?'%gLQ`Ip[.M6C!>q_LtV@=jVq&i;+)t+`0P`K4K'HX +N3M6/.[g,*Q:OqS%f1.IFOY?L!gaAF)gMj07=b9CKj9j,AE_!=qGfWe[[QZB*VPkMU=<@N.6 +2)0N2UR0+D4U-E'K![qPhO@Va=U?iPEfPKbrWeH@co07UEYW%Or.QSi/9.I,BNfhC^lH/m[W ++S"&U^*"PGopJ7H$b4_-2ARg[1n+^fHaPq$.o^pK!e8F#%9[;@B-\dN1^5`n]AI=M&Jd!;"Rn +P7W]AE5?i!=:u24]A3i9Khl[SB-rGs8L["?$J*ufbbcAEaj&:MOlX.B1JFIZf>;juGBNPVXl@H@^;K[+Z_lo85>RBm\(l#&HW-?$T +EF>f`)cm7j\VP`dd:;oW*mCC)UY7/-p&!M-_7/[cU3M\dIDPKm7P3:&IC\u\re:k'%,h'cC4 +0uZl'I]An7_=P+q"4*3:(pjPWVb*p_fjoF,50:6$APZUn@+nh0#VmXjtLc0_BOcl>)PG@TgSH4D\"S^>k.o5)/hc\+q"&Vp[B6TiL9KG +1Ofl5<:hd]A4m`c<.18gOHpDc`CY:^ROQ-K(5bmf[U/2(LqC@j[t1gde"/:;0t7]A`(bQPP)Lt +m\[0PueAR`aH57]A1[4a4LmBSU4.p65!>OIl'k&+%L.nb@eU%u:+JRqTfcEJQ`0XJ="!Y,leL +fRuQ`RQ_$MmJ4>?GQagh7eBC0dd%4FC0SR]Ack7fSP*-[HL[@O(A&X[BlPMqdt]A)2\RjY'bhb,CNmt"`]A +GqsA4`qRQ3'Y098?s$nqh;M=pRV'-=%PoNTEB(kr5'MYL8J9VW&l(YU&'PtA +3RchQ&=cgds8KBHBT@lOLYIrI2QnCNb4Wec;`%lXZ"XSUo2NLJEh1Z1Vqe+LPNLLQYK^dL:) +!'84V57oI8N7?b#s\=\GK=^=89\]AZkA$,\0oBMT8]Al%XA!Xl:_[+`s[n[6A%41[!1cD-gUCO7bkqD/e6am>6iEiT5ZfN*HkB',&lIT!Pn#>/3M +nGA0)q2?AprIrPeSK1=L_FQ[:1`W.5XF4\2-lEukf^L-WbRM#j8n>i(e9H(fmUm*]A_lJm\u9Z[\Y.[R)+1;JFY[elJ08!IN9j6qZAN!*j-T_rdh`JFh5;7b +Hb"J:]A;I<3H(ZKs8"oV]ATYFF+f5Y1)O/r($'q +aM1KCXQ,nr&t/jbi;Wl!&9WR?bDL?:O_rWVbpudZhoOpXaJoela_?YNm_V9&:>:m:cb&$gT$ +s;'[-qrEJ_UmTL*O1Mc*'B[[]A!J^>1RO@7q_SLVi;e)@CnWDSTNme7:b`K\AZfr(gn8)#3Gb +BO_l71->rDCAj4#dmYY71'":5H"8t*g&(e'pnaIZn#rKOkotP?c5d0E&\H0Tf#(=jOgMHDep +'aAC\k:On$P$*:Fs(da=DLD;-5gj5Z%IZjSS*`6_)Vg1`9!dH,XXWBRFeW.M^jl+V5gHMl-8 +2TD0QHln&ST0t4"W$Y +i\eN_6U^B('7ro4:IPIQU2Ip^l1+2D%!`DUrJN^jURPtc@>hgXRQn,;j.AQ4mTK2^.muFVQA +OBK\T,M@/n/=#8,]A4^VUeX%c^u#6a)iOT7/'Ojpmja,J^6cZhT(7ZL>nPQSu3qbQ2[ +7NC@iB5noAfK2r8*EVnhMG6%h[^h^cfBnE>S/35\V%nhJ'!,j_Nfh&Wmfl\pQ"[:3b4MZ[(k0q0C +a7lfESl;?l(+I(lnY$[QEk<-'3&Q"0=1j%UkD@",jU0!PZAn&Pg3h2392g^sXJ@\PY-m`+cha1m]AU +QR,-6j224Z41#'$1.0;JpWI^Z)]Au^!2sG3e@XdV2rfVj@2U\AC?QoQP;p$g$_@UA!d:'6'ds.c!k>UkA +nFMjVC9`geX+G<>Tg.!HOh$KX6^\kV'[OEF2]ApSV2>,S'l=6^$IA("]AA%h:hDtAE8IFjOch9 +JBp[[TCRZbaG.G!!\<(>t2Y]Aig$?67Z5<6L=n8Bn,QPgm`V*@^:E\6p\5?SL3S9[Kan9hiCL +01\smpZ+4%XU!ip3psfTLj!Q==X0oN;"RlpGkb7&#`buT@7hQJn"$tjTm+pm$-uJ)LgQY)GldHLq%ND:ndD=Z<1KRIWm8]AG6;lM^=i-Qk-TWOD-^V4[Cs1#G5@ +7,b\2SBAG^/fN.EFIUJ44Cu3b8>r.YdU>M`iP"pU@M61<[^UacjY-i84+6Kk5s8GG^Zg')Km +Ci4PE04gnrEKf(&URW+mmTnq5:jO^(G.,^4W$GoR;S@c_87LjgG3cGm?BqE?>,U&>UZO-AUs +"HFhG8O$#9BejI%3.[@,q0.k)XXloP!N&,iA)rNiN;%Y]A +2,mR;j.*0X$DdTJJoO/qZnE:_s2O=V[/"gbP'.LVkOAMd2`V.HFrEMqW4#k&[!lVnu:RH?L0 +`-f@&i-2>f%,%]A_Sl2H+HKZ.bR[C1V+dX!sCqNpYKOro&9kjmPF0bI_Uc?i&P\=R.4+gjXSj +r@pBHhqt>6>?"Ws.Fl^*YYYJU:4:!6U"BY2*C)A'75aU:en`-[K7P<"b2&+I0G3cgIlpg/3M +"Hc!Pl3G.kX\7I#. +/d.V`=F5!L9jn1q,B]A/BgM^EYlr@Rs"U;JPi$'ouh>;P*5^m^B'W`'SS;nOpj9iIN?r+,-79?;#%-qt"Pge3k)R)Xc/G76MMMfUBk=ICC(Wp?"Va'J(%c1'Z\[DI/H, +\X>B.uPfch:#\LcW_9$9]ArL8)J3,JUP6mXOq;!-%jP.iIc\-;lshISNo>uZi2S:hQ&1N?XI/ +ReVRqmGAc`%n]A'n/D/9gWZh^LuPL">+9BlXYHO;i`fR:ESA/8KmGlc+md[g9"54;>5=dYKO- +9GOgmK1Lg-unZ=OSF!GfFF)HGTABQ:L@O+8/34O1KUAk?qKRXZI:=d8.CNCl.6,+\ISf.&k= +e9Vd^q6m#/u`?0QH)<1EV`TTXNEM&9QA#[4GZqFeE^n\PrQb.X#emOO4Na@8)>,&?nu5SQ>c +*T\N_kUZt$`7W2beX;ZfCL6IHOQG`+^Ck3`2SK+YCmS#h@BC1T8SIp=)V64sB\dM>5JqoD19 +)XI=!fL5i=//q1h(ee$,`9?<@E);G5nQB2eFd:46QKg6V"I[q;A(_lGElNIdtG9'>\/V$OhM +4]As[;#LZ"H6ln&G*m9gd28hIchoN.V`I;]A,aDr"%Gqk+U2mZjD!+F7Ti(L!dAFg>mt(%b^HP +K&&J6)s!4k_k?QIAns4n1u@n?O!@uj,YnUB+#'5M'#4$^9\eO(3<]A[:jn.&gqUe5r':;Ep\j +pZ/ReG,I:DNk#20?L.m`Ta0<;*J>kor9J#sXm +(+7$N0ks^`k,fjA_<^l"!*r_k0$KfN9>2khVYefra(Wc^GXDSG +24-uQO#FVscHXgRdo7s&N"'.9UF3NiN +(L\.M`TH+WYBOA_pmIf=@^Qul_,icWRBJp7JD"!%UXCjSN*U*,1hMm=t3IbDfR-roJtWr\[c +prn\0`*M&^lN.q^Q3!Fp++XefT3\3fYA%!@r/+H$9M>E6')G%h +a'"-ZRXCr\OSV=#o<0coBE"Ze3R3_,]A]ABnUG)@^bN)$T/$1Msr9`mRlCKlNmqIjd^ +'=q:21Ma7@biX;[_>%'c4'9aB/f@)6"5L(3N7qnK)&TV%!(XCk'A!-k3H7(CG?m%L9DN9D4X +_3.Z)'s-7nZ?c+^bj1d3Gg8[^b`TCH5[s!AMcAmZe<(:EnGs!/.pF.UtD3*g5MYRhTA+'GsY +?,N[Y5?>u"C(r3q)gW-g7;D2&8oFZo237I!.IA=qAkGWX&aK$fIBEsf<_Y&?TZ?4cded*CB[uEY",NGLIb.&GXO(SX8Vg1^KT*RLuY"G"F-qD$TOqIVXs?d[Bu^6 +IGNhltkPDi2LeD[dNoH\!J/I!kYZk>2"DVGfCO;9Xc%PF`@cJqpisQ-1h%c\7kRUcS#EAf]AR +*C:tL"'ET%T$g*Lc-@:IZFA:2#A^7An'm^[9QC=7'bhdFnbZg/]Ak78=9l<&T:$(JbmDRg=_; +*kdXqtBr1@(3`t44'I4k'N&H/W[Jcc$ncS*H!2X_hF`R@(3WnCVhhqVFQ +&=""D[E'G]AHKG0iTM3qh!GcUmgs4?k3S)6:'L&PepQ+LV/!/?sb_9lK<7J>0>#/oVStJ,AQjh^S +==CHdXPiaR*PaA\Xp'S,/$.-:T?8oLf4A;rG-n]Ab5[>%1=LkL +PLPMR#qu7D+&)W_GdU#3SRKcf@r7-,bB[l'%d$343,`2FZ#++@P>34k6dr@<]ArThjiQ4\CcrKM=\\EL'Kq$=<3iX(6(/FbKbG5!rmJ0B[B-d5FIaap"/ebc)m_p'sQr7 +apiNC3dfBo2i3aodhlPl2j6:JNj(9st4P\rdH3TX2m\5OANB+XW%Tn\uBnkiZ#^(2XWK9)SX +X'SQm<'Fbd2>/9iqE&Z?l)[%%q8I"n;2H#g"VVPUY\K;%K#5jCLJ*pc>&a\.'hZ9/#=`oV*, +`DJ@T>\F(#j,4MQRMeAEX_J^9XcC"nCUJM.Wn:A.M@d@c&h#b<8mF/;Iu3b&.XJ.PnWu/.-O +bRZF)HQ;eIEgYlFFqP;S5qkfYn]AO8S#9:8aA;rn#10EFhTdGJH?nbTkih>+[p&,%Y3="8c]Ag +46[fA8U:b3%c,Q%eA1'mUX4qaB/EFG$#M^TOpLWN918s(^`'=Hd;cQ0AR\t(WJKXJ&GYXp.8 +#PAG(j;,<$j)cnbGW[#V]A3+ZpW`j4;9\1_?Z)i=^-83Q1DPk`mH/07jan;CTKJGh8`@fG+c$G8hZo; +R"(\Yo/_Yg7fm2o6nZDk*p:;IoRM!WN-CW*0KKqJ=j.qf"G%PHXT*1U%U%4u3;4.0hos8Rge;a?%>]A@R+J5YOA"FFf.jGVL +9*Y%n:;Aq9%'u$P5mWOBE3[O\]AmL6`m5sVL$lmkhFD7[#=fu7I)kn7j`-6)Bc(>PdKdL2h^FrduQq.>BBU,)N1&^?#b!*k)`emXA1k5 +eH$f>I[),"P2Hm:P6F*R+1^F+$.<#Fs,cPj\hSGGG`b2;/V)imsfe& +OO.,;rO.S0b`lOR+uLO&GDI^jA]AnimMJRstX"2F3(1,]AGGNTH[:.JCrGl6A),@f&McpR*QYi +JcpL`:MSSKQEQsL14emp2+8d'#Y8g>f)-DNDC_f[`IcoCkm5n%^qb/t+@c!po8*k9h)Lk`)b +c7#06>a#`q*_8I[g*':"*'J2@%$_%>iPZ&fZ".d;A::"Fdc=chV^#jURppQM"rk>#RV)3@_< +Cfu&-?cR6T6F`QcSLiGQ]Ai%P5=r/R4Wg$YUM:i;:K)Y+r\bl$[AF4`:)VSU);5(Yo]A;oYne[ +d5Zah;ZGdPrrBg%rk58E[#T<&qk2NpK:$i9Ee,%6DO1Vg>YLQB0YJk[djQiP(.k:`uFb^e"< +PXPf8P'Q636,\[10S%EQ-VK$R+p*g'b]AXd8jr6LDpB(J4&3DXV^4m\3i62R_(F:Y!cL(-%?l,OGbgJZSH/%G7\XpO/29jOWH`moD++!BK^e4^I&F,HiX* +N8>1@V@dIJ&Rkf`J8:X:[fi0QG',T\GI,FRJ`BRnSUA/H\0@56u$4I+LPG(u,eL;T'3bL&e; +OCh@UC9,F%R659NtcdPfghi..sd +bBM/=8]A\&Ml2Odi8F,X>j)&!?&q,p(>Ek[\\a,usgO"4hcBlI!qd6CX>ue"+%g[WXg`p69n?LEo%49_9s +P@8+)9+T0%uM%G2n=FZ_U(>ZrQZ@aUn65Q*jsk1=?!urkk]A[K8,TmZCf#E5L0/%ua1O&"*RRdCgdH!0m +DeGDOdhOr`i$i/:JborkeAch0o#s1@=-Yed7>^*4k.AXtI+09L\s*XcS1*c<5"ab1mJ5&2tG +qd9:rD0g(g66^`A`MB[h&'%C5V>8emo.l]Aj9+Kc,6VSs!jfPRp&kAQ\Z*Y"T3T%`L2 +qLtHkhM=4(Si^E3p9kSPcDdP,fmmH.kAn(=*Fa+'&7IiiZqIolg:l,GI4>)NY$J3S9c:^`1\ +UHSU$hA!=d<(F+aUL,1sJVoahp.o-VWArc!2\lPuV&%.\6co8b!n+;%H.P"hKBB45E_h"TrY +Q`C*NB1N,BLljQ^`+1&%r`j4)es@nuO>k,MScge'fK`9$P&"EBLNG8F8>^QUl%ZHr4Ef[fNm +)T;HY<2tbAREW0nW#MYLK!6_b%TuWrW$PMFA_?3#M5FI%hohNmJ"\N*8;d'J@071('rLBeq6=[.jVI=2u30=F( +a]AV0&jjTuCFqK?[XVF5#ZkWZ_g4l`t./>=jcQ>1spd-sdMb`.XRe&2.`Ga +R5o^+O:D1,+=Hc2#Wrm:1$2>aH$7al?af]A>P)G!H14i>^'#0@qPYP.oTOXB)OMD=O^shAtJ" +!@jk8P=Jr,F.sIE6b*GO*7-Iqa,VkGHF6r0J#qYAA3L5#1VW]A)3Cu3o+EdHj4([D8epa8'g6 +9U.o[XTV@L5#t%a=l9Gi'&')F.7,BM.pZQ03!@./Ts4b=/OgLBhLU4&5gf4ak8g-]A2_QG7YD +moc>MgSNs4t,L;h&j"pNYfo;LVck[,$kIqZUb\\NO8QV'(eD/Ts[#,Vc8&RKR"EqDJmfcJ03;R9P^ZP""?E-mTrn\pq!WQrg>jp=7V-CXFEE?+/ +1]Ah]AeFri&h*(BMcgu+i?Icuiaa$nbkh8K`Ml7WdhJt$&[q#Df0n@%P,Ju@BcpmajIjW$X*h\ +\.*R'Sa(`>!q]A_2Yk8e/qd[[1N5>M03[2+[p,L_":!3.L1P,40K6i$dH;,:Qh$OL+YSp%E(M +UXPR2CB8[q3YS0_!`A$e>.A.!&4Io^>2k-YD!DSt-uX$BYEWC)ZSR?5IV[lFh"ZIJ%Xt:(Q5 +C[^ToaSkFl&p<>!.a!_P\^?E4.VJk'S79-0jq>"W6U!QRaBPV8s[^g\(.,0Ij90(cZ>TgYSD +Q]A0o&9*ZgnoLSJ):n_I[!_@CW3mR_aAPK;i6'U"j)Ps>8f/6iU=5G,f,&4&8,Ha*4oe/Ak'; +hA'kfdsV#rC:c)(.?GeD;3:$GN$3[*=(4IKJ1Qqq_fh;b=:0>V/-P&BV$S&WC\'PWP#![`ab +@1qjZcZV(".`LIK1WKqT0_)$aB-*h1Df_q(=>.%P5RZ.-C!GCo^-D.)k]A$k2oEGoW#Aic1 +LtZEe?HE:K(Tedf$ltI+%VmioF*,6_?i,5B/Bj?&)PIP_HH@;7@R^,6KZ(ib3&pA_O:53e-L +'ClIuX.8*IV"&b8%tWa)q#J%UP$db;= +rJd)K8NS!VDD(YC$b2Jtopd?G9o?!.0&TrO&rDO]A&d/' +)GSM.")Ti/\891f"]A:gWrpLNp$5dEkJ3T:V:1QkS9i@:j7^q6#YtD83pQ+IgA0&JnfE8CqV0 +EFGC;S+n,tm7_48.K="/bha'ee!iIV(%=rbUIZ(!(2t93/O?0qqEchg'PlJ.7h>^Hh@:(3MM +.7:+O1hjnhEkbVN9o(uBA?2+6-YOO +MB$"/_H:C&r*O0e_bfZ)II.$:RB$6AG/LZJ>Orf#'#h*<"#DqgMu,U1eWY&:F>Q7*=>jYEcj +G07.M3ghMogs/D)Y\5*kmJobf4oH*mnSF30FtGbHSM:5E:U@2W*Ir;hKr:QKP?SbL9P1i5L` +",:Cpb^TMG^K*VhkHudI2%[7*Nh/!CKt@(A\H;?\.S`(7WlL']A`+4.Rq_DI6Y&AhL$Si0?[F +@0(hoP9ulKPmnZ!%KZ=gVCMZ[K$XuQ@W?.'0%P9+=[NF*=?`oTr&b0(Ke=LX5MlKg??4pS6/ +>27!F#^n3_#m@dcP<_D0TP)eB5Z3r!_7&=dSm@FP]A=j&VW+FMq+a6-nkUaCQQQ';VfuB^r5\ +PTG-4F`MBEH.$/0dlFa@.H0Ggtn]A$Eo1UG'P7\(BQ7E#,Vg-o1XGJ(@M/.2d\;q5)q!Gm?To +Ye;p=,.tr4L(&!85J`XN%6X13p&&cGl$A'MZWGL"YJ9*QJ$<3P[B1Fn`^P`M13m.#KNUeNp: +`]Agei-qBY?sMC\)JIHiG_BHQJ08P=MLjjG=o@]AcY'1br4-Ji?+d)i]A.1&:TU]AS6*7.'1n@N? +Y]AhW>G1Sb6nM;@;!_d*Bc#Iup"-hf0NR)o6XT=t7oJ.J#$f2_e]A`N$h>[lN4jV9e_QbRkb<%"s +ZC2*S5h9]AH-7"Wr*M:>kceO-h#JBOTF&VRA\g7=-/foB?GIXiDYrd:k6rL]ABg-4h&W2qls?W +dMqK_(^ss;Ll(sD7peO='pL8l%03)<7.Lhs`S)s-/$;nJj]AD-S0^k\KTD$rQ$j +&8NOTE!r$&j$o9Lu*Z2<-stY"t-Ud_6fC=^8V5s=S?@/*'3BR\)cW2eE+BgqdZ[%M +nt3gVg,f>_as.i?!n-gDro`Ue_9C)0c?Q';lq[=Y$Fhq6HrC6.o)4Ao(d7FlT\dcf)*Wp`l^ +DBf>\^5C1WK$XBTCD0B&b.Nas'Flj/Sh<59>7Egqso$$ieA^QMSYRsp\_;h$]A*A_C^";H3U\ +F^W*CbCFM$aUO1HKP:QL7!\%^^)41P6[28*HbDoen!b+?YrFhXPYHi:GJtZbPf5$./nJu3O!9W' +K.Oj'$IQn_`]An)V]AbJ/YI*V^oe&N'c@,mM[R$SGlOin"[LYp7(4[3ejZZo5l:tYJ>BG0CCLX +9$QXMpJ+N%m>GM&8F:J-1YN[(0M^)85HDJO]An,49P3o#ZYW,?G:0(d1G9m]A=>6P[!" +*q<]AQWYW5ScO)g*2*4)O,f?0EPTRieKX%0O_g8g(q_Si`^mX2VgDAOm_l,'?_:&bsDNJiX6g +Q"!(%'Y(8dM'&)`>,BE1nW7lE/fmRDo)oUod;[8BBJ&$HC#>;pHT-sZGK71o(]Aa&(3Xgf$tT +:O!:TGPLLF5,C,s4Xf@m3h2I6*UWgt> +DD`jj?R$_@*I!/XoKl&P5akGiSib\nJ$S%8R2.=9O6MVT"%'QA,RpT@q544;[6$ +!6!0CS\PRMI!tH!JPD2+"rWsoHaARf>D^)0# +6AO(W>^D.aF/0tMD:$=2o23X,UMB5$^s2pin!DUtTu52CAL,Tc!/VW8!MH)pGk+jXQ+osr2h +_qhdn2I"_*#T]AXc\i=7uf)8YDX*rWG+Xu#>[>me[1:/l<*)Ha8\*)?cl%>;WJbe(mH +2F.R3Ni-qi)BgLF++O?gZrD:l28tq+e?&Lb^#[")[Xi-PRg4RtrURgs&ITCn7nOTm1g9T(NE +iH)u%M3-.DMpEhD76,_2Jgb-;4h2M-d3#=g&S='6e]AjRY#P53G]A9b4o@78=3AJYCBLD3[=i; +<:YJH$l2qHnh>;-2p8SV.aijYfD2sRnLMEN=t+f8aAPB?V>Cj\bb(4A\4P@Tg2\:gGSe\DN? +nOY]A2i#j$G7":i5,g_c\u=Via]AE2StLi-^#Q\0%`BW*P&FjcUtCs'h25C%NEI&:Ic[#1hoQ) +jS$>W,g2P7^9(VZLLXh92sK;/'Jl$P2!fMRMC21[/pm4"C"+gt]A>XfJJi17\8Er6eheD`CaD +4l#=-k+K8ice-P@cV6aj5(hoR=>Q0u@j'lT4.6Y$1VYDe3-W*.l8leK+`2uGbn +/"GaS-#@/D8poK?q=A8ZBa!pE0n+t&Z?\Blr8YP18ls, +Rj;"PONM05W:Do$[-s5O`L?9hLfPE,/>9g6qalk75!C]A@R(t(7@!M]A2^bN)3%JL<&/\jB8Df +TWL&:aOO5;*eGa(/_&Eb0-AX5W!@D7.mRD5SE[?\fn8$@$3#Q*$IXi4gWq)Vs.*NI_mQS:VI +5D21kr@]AWfh"rhO:9CeI?(Rq?J]Ard&$Y"nGp:.dhD3hGrD^/c0[\Xc59rfEU+/rp:S*d'<%S +:Z_j8uZtWXK+Gbg2b@[9.#KL;/uD65eHM8(>`K,;]AOc:/IcZ9S&3Wd/MAS?a5U[l1`D'ao1r +85*+)V0]ARr'Coh0&t:?h69+8B`5UGR2=IX'U4I79m1M.8KIc&iGafRaE7ILIKh.MVWH\-^8V +c/+cIM)n=sjcV@djmi$6mQiDg'k/,u4UQDKPJ$bBeQ5o2\BFc]AC;%o$3(n3tI')V_[HZ.<_t +$$97TNL'elL1.dK@fKDm=P(10%35s_rDP):t8FEV(o4D!]AOtQji2t"5"spU`!(U ++;*%alp%Wa[Id>B0WdMmZ4+pNnc`j="-kq&hH0AI_Hs02CLW8L#;HJ`%rV_AY)ZS"/D-<N]A/hhj5lPq/GXE=lmG]A,@2f"">'p%EpFmmP^q4><^d#k'q-3m^ +q^Td9)\B7Y%hqSo@Y&ej\40F^KM_simkC'qY_u,K7o&'?_WW[!H`&B^tXm2dD[j-/[-MBRUj +_mah]Aa@[$J5rq:PgD3#$>+LoGgoqQNP$L1EH64X1@"K4T8"X0U>2Y_XQELg_Q5 +V7`!+n<76ad9,jjo54]AK"/N$q +LZGeHKne./X8",MCebba:=p6DZ)]AVQUW!7[VQg3Ir7rI?5<^U..]AZQrl]Ai/_0?Y`5WkkBA3^ +mGL<=CnjrUITLj9DtjkR>>^72RS?jLC8O63h1N'(I*MfDkk6]AqGm7.CY3]Al5?7:f]A*.]APQ5P +TBl)Tl3,KT,'7loFUI"Y]Al%(S;Q:k63c'"a[gP4_ee;qkU5T7hs7]AB")CJQ_nBd[!`0/K6jN +rX>5E78c2c7"kmL,F/N.*;LLCBmgZ0%6Nm@8VEpt9C3oM>OrhXU0qajON-83.P97Cl)P;&]A% +tL2d.cK6:W(7a!I6U\VK6dkVO:=(a8Z\'=3#H8#6QZ.npR/#WhI>e5.Om+N[8:_Q49%tTFnL +_X*oU8j?*o;a,>FAn8^Uih!S#t?HK>jbL2P6.L4Z!/-)F9=bp(-hD-bs"?IC^UMug.PSqXb33+C\LZF5KiXe+f:m5 +i&` +MUb_L)#4tQYJMD%1cd`S:c4pV`.[4D]A-&D)$M"t#3WRI*,N;T_bcIfSiq]AsJ$'rEIM..T%j. +Z"J;K'4uHtCHt&^32X1>LE!?p<8,`gDdeoWRejq;H%C;^m`EHK$optXmmuLag:FeBjr5HhZg +O-DlTfO"@lKNA3d8t8=O`?Zdjs_.lXl)U]A2qg]AoI]A?J-56t>!!8R5L-)Zi-.nsN]AVKo?j$*Y +[Cq@4M0`X*kfEmRW62UJ8*f,Ic.kZs_"roSlqqdL<#$ +(io*DZ8fA>80+8fhIi9Y"OI5Dg&ED-+R'lAuL.QS/^fnj)1FEa(f=4>FFn@Ba&+3)`p,_Cb( +`(I,JPFB]A:jj(:9l8jK/gOBVj__dX<0]A4_&FW]AXG5]AIkXr!SOj!,,8drN/r,Cgjjsuaf8,/o:L]A^;Tl>+06'rqRcD[\`':N7?[jPu8:o/*'>A$ +qP!4NoX_H``f401:9!T%fHolYg+:4kr-,<+(m]A4^ZToGkMrX*j$HF\PFKm=VGX0V;rp.ej_X +%^jGBqfh:Yb4gOr4;_s-**eQ]A&DuJnqP-Gg +F]A:_k5r1QX&3YJj*3'DAkgeK!)r=`OB6W/*(N-qr(p,gG8AoR*?^&^rqA,nV +3nn`KOe`(cga;\ARG@Pi1CDGc-R.7;B5Skdb.VFn";SIS-*?>.e;]A:FMhmTI1ZrL-,O>:sQ^:8P;mfMlaTU&`9([Z)LhnJ,T4d5cYUXi_LuP!Ea@)WS>dRrqOrt!]A +m[1HVg=tB/r=YdGr@.%BqB(eHr(i5k<(Jq9_ND2j.tSW0:(+i.uj='B>W:9RV'UjY%S)-QPs +Z5+@6cc+om<'aY\">Goajfp_4k3Bk_0?P<#nHTa77AEj430/ctM(sk/0\eEq6"0S+-XrX.l( +W``'.Z`CGU6)C(!QiO<1#2tQriQ,2KpB-Kf98^m0#6m>iRH&PRX[Fo!uquE*HjHOX$ZbLLR= +CNJuhb*+Ki!?!Uh5d#g#irQ3+/)@5A/s) +=fm.Lj2qC]A+^jBf;[,-B*=2f>O*DhTG?CW2K1!hOmnO>D,.jn*j!Y&$T6H,]A'*'e12)p:`@S +.pdqa!I#nR1"V='nQ(dpInUTjaKdINJe"`tJYBPLC7V_L(jT^\8LkEGd-0iHR*c@'k%A950Y +/e>sHo2?/etW`)#-p(<@7#g-jll6c_"^^B1\X:CH&G`eujO`%^d1[V)u^4B*I7!0F/7j3^S4LJ_31RQu0C9^#?fc2-#qsMasq!! +/i$u.Yt5ba)G*rXB#h>UQXrP^[Sj3uI^/,"g`(mk'<"%DgWn'=1frr*o\k@pqAqH.tm3NI5c +Hc\D1Sca47a;sefdLFgHOXDVAiZ[.MlCm_9?%'k`uLTrEs&VHla7J +2LC.a>bLOqZ8#Z35=mXMO\uEPC-qW/K7sI12l$(he*MN`Umo`i+kMg)'oq8:?a5V)XSXc]ABb +jUVdBCCGZX+hRh*lr6\)]Ap`oFi+%>Rk3^+27RM8MU0kR.ad8LS5rSBfakMiTAZi"ml4g%ni! +q?Q,`**r6*(Q&l2IQEWN*"J/'^gHoNU;t&::=PEUt:j\>K)epgArO1[*qPLZ9Z57*GkZ77rg +]AWiGc]A=rqlt\*o\F#I-Ob&?E#dEG4_DGHcbYlnt1nD&Q9R+2Ad+8[:Q"dch]A57hID"D]AapRN +]AsmT(o;.r0^be`PHC3S'F*Dr_CK)oeY`YNmObTWo:a@F_i-"Rm!L@Lpk9(me]Ac4d!#Aq\aQf(FWQ]AAb\6a^&"2B]A3OVqE=>sT3Y!,Rk +WC%%HQ25elQ8F6!k`*le&BoG;o%tQPqr\TM$J7re'"mFUn.2Pc^3q7o<"9t6@=k'j3#f-40! +VWMY!F5%%M-lL$GI\=*@9lSP9[F"_@6bDp%-WF'pd9M$`Ct=op0pjh"V;g1"ni&53u8uTEs& +:!:c*d)C#:TZf9rflU\RTD+[ZdSNHmG"`teo^n-/O^TL,3Ng\C?%!.%V4+,B,N"WcU56-f#& +ROHcUOL\rW5cRl'j8X8DpapH3nqhP6&k.U!(]A7g +&-F+;2b@,p[EaD1l%CNl'KjG&5oM;+lF(_^k#LYh\I'+Kh2AjU?klf0ARAhOHK#gbH[M2-iV +G8U0J*c:<4?:S%IGh\]Ag0qpk_CrGpaR\Y\.f6[4N^IT,R(?^'1#H?1UhY/)07W^951QAW2$, +s*7"hhCMaK<'8&'j!@@ap6H^.@i25BD(L-1O\#(.Q[,*q/7q&+T2K4F(o,_rGY +Rqnkm?VhV!L;62sG;NK[^Se9(38+GYJ?p'E4d`OpHkn-qdChE'Di!`0TO`Di3d&eY(K`/9<0 +4pYPq)rGY/`>d=3QOOG+k=+Ip'@\oM+t,0$hq6\\MCEGJQgYuq+\D>din/9PIl``djFp$Yt9 +PRh7#(kBLX)6J#s+4B$TgPZJX[GI96-kAHn;Um*9Y3ce2P;[Jgo@tDj'%8pY=ITUitd.[u5D$lmIFP=qd20.1[N% +[RQB1rsHj*$V72icFK;4#N&'7PFjQ&%^YL61QAa`-TU&)pRG5o6;0ADUBPa4Mc6^QV,`1/,u +]AA)=!u(h+cS'D@FLO6N1%OC'3%;hQ\Fi]Abb0*h6"t:QES'r3p=Tf/kL+Tt#Z1E)s0[4E!Ba* +arb,N1fO9,PuJA-g?7h[WiD?%![>N[^$)-)-(mk,a@1/,p`,\Y:AcGLhK8^LJ%Zi3ss#Ckq9 +aa,pP0C2.R1GLA>-roUS1B=t>quI7oQW;IKaJ'<^4DC#TEk5Qiq7,L9`BPD7!UeQJ!]A\;VGn&^pKl*>+H0704t/Mf.Ff>lXLZQ#DjU`B5Dq +N##eY'$jLImQ#Zm +oO1(X2k]Ajg!oLdG8#pc%`B*V=#c7Jbg95Jhu?YMFZ/Zl8Ya0iY=nTjJZ'h05A>3&HbrFL1i$ +/#9L"CDfhks!>2kobYYA(I%a;aNruna:K#@%Y!NCbR4>f]A35phgH)4f_JpHYF^VWS/(SEm9K +^H#,s>^Gk)"Mj(0n>Zp\7XDD'`rp1I[h$lK`<^F1F3C6.>%@XuqB+WEkHul2A_`bC7uOj/g: +VP#p'GRLB"CM1W!q4a8^Og@+!lbQ1+?AC-Us/ZAm.t2_Lu07cd,;P:9DpYo.%Y)M%(J4L\rW-jKUA +&S!3Jd\!Pr+*jfDrjC><^NGua$]A[9[W,ZrhZ/XWKi2EFFqj\8Qn:Ut:!B%5/AKBI!+a8b3Fq +:'YuhV@'Ba_c^Hq6m*EhS##)n:VZ[o=.8>#h#2#@&%U$4?KJB[%umWoeskL8!r%[WHW(]ADDK +d;GJ9990Cn"tA)8DtgAQa;3W>bItZEJ2e1;oC!Pm3`gS3oI9".:,r.MP4^\X"N'Y=?S,f:-+ +V]A:S1t=]A8_Y[6C3?=B6P+`_$]ALAAdKeFPFq_ia,REXA93gk!C2"-i)"eH-9Y]A]A#(E6Hobl:5 +i;KcEHK'?1deDQP8e.2eFC`-UW<"#^\,6EK8(p=cRlsID^ptAR8sX(9^n4[oGrP"M=O^lV(&f$\,caa(Gc*bT*0]A,'f3DaPTB$O6a,20+fXr1Fp]AM?YpPg:K1354#6/5l +^2(;H!HF_MR+%bEb@V>Qh71?J::jN?S(tk9:p&XWs5`]AEZ(b0Hf1ogKo +dNM+Z_l2HqXj;##PJ:;]A/r*5 +6?3;qFJ3VY@IdrQ*^6>-.,M09_872b5q4CRZ#Rmc8iQB8!'=O!n]Ak-lcA([i.DK#_V.b$k14 +f6W0G4b-Dae(eH?;oXSXnAjrfPs@-o#:\?LLYo\rF>4$=!IZWWip)jcBJAJDphAIumYY+3kp +%^QS":*1[&Tdr`(s6hbZqZkRL3O^5JD+tl>t\Ym&VA/5Z7l>quUA1\n(91IPGDG2iM$c'5?g +s9G+u)PH2`njmo.OBP>J9`=D<27[+.r]Ap"7]Am@)\`*TB3daHT5_:dflG'?I9Wha/^sb'&,IG +>I#rhuAIY!H[6oJB@nH'W:VuE`P/WB2od>GF>^JFMoNNR5(JV"LcFLLZhpj<,DJMbun#jr=q +TenD2pVF&"V$'FRp6;VkBu"dQou+"lZ(k(agr$.N:shjL1`2MEN)\^"qF)iiaf7s.F%?m&6r +%H\d+YG19)IijM,)0gM.+@af09BE/Q@)F3;Nf:HI=>k#hSL=/s_m\Ou'P9r/^S3oGhZi7^!M +Nhn]AgFnGPlEeM-0h&VGD(?;^kV3T)CsWqUZ?Fr4pK$%0G-?u=SZ-Ks.e.qJ=PKa-O]AVBM4@8 +,Esci&kQ7Yk^bnqA]A\V:'lD2.Ge9&u6:#CF,kN]AaSQPl&)Y,Ydhg"b1>+%mB[`\gqshaOSD4 +AlV[nMHIU44^:-c7s:?6B"K\ACZBL%6jj3`fk[%K?Q57WKi2s->'44D1QLONPkKZLo>cmgls +Q]A/+c?qPgXtb=!BJ3lZ^O+\=Ogq1*\DB+![(F9K%&UOhUe;bgs0M%YQjh:*2Ze4YZHFQDYM-i?b +h.-e&MS_-qK34^M3Q,"!nbf-b_WCOoq0lFT`#nAFc@"#?q8WS]AMqP=#oh0d_I[o1%ZfOU7&, +*>:an*E046NQ'dTI/a8R+n,U?>^3KQZP]AFAd&?F3\#3+i9%l0Np`=nnO!Fo+ITl;ideo:0N-")$K(#JHjeucFLYb8pV9$\S;p8^;F`Ql +*?InXBLN&W.>^:l0FPPj9=B,pam`iPCYB%?-*rI,)dOR$oWa7/J[;#iBn#-/>mQceD(NGDm\ +O9`ie:KtP]A$VI+R!1D,hDZ[)ZmhK9e:l>HbjeL +k]AMP0FRN9ft="f&d0rbX+co!0QJ/g'Z&TaZ]A +R2D[qV'oZI)l1.*bX5JeprfUnk(Ih!dAK`;X0Bb@*`5>*\@BBB,TA9H@[Y*%u%BO&Sq%9Ak' +r!n@hTD6Q25sh&YZ&\Q;rn!#2%%3>Z?)/1ANRmfh?SSuCr_1WDP%@bVg_9M(7i&(o?"t2ueo +^R@QKZ)d+R&**V>&Ji5tp$[pHR(Zg?n+TQ0IU+EcJso3<'21mlaCm377bGSGgKfE5Z]AP1f~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1/]AFGGCr0Q\N^%?_&j#Y=^:+JH/5G=b@s80]A8e8k:@$8r)K:a7h[Y>i +u@0bhakAp#LP)]AlpcCQ81/q*BGBd_/2sj^cr5U#l'5PpD!u=5*urGY7MP^#oF?NPXD,t^p3q>`cQEFSiU ++5WHS.LMO2nT<[hH7R5f(*sLKq8eoP#[3*q-Rq:6Y;g2'+nIE14?bD*OfqddO.no]A/eo1lN^r*KtJ,9;_h$6nR#oj(5_s-^B[]A$;3\$:7t +gJ5:E"<.+M5C;Cf)"rnqM&NmQMJ'$HDV8J!foL$Qr#`?R.6A-j)eR@@eUT`6D\c2/<@A#M#V +(kVY!9l;eC]AtO,ih)i>Lr6fkLVn5*nDiObr*W$.Gc/UUU==i\\h&%RGF#%gpmL7ap9G88@#OQso\:^`4gq)r9K"2n<9C&pLCH?m_:P?\Dt<"S]A(>UR=hnVrA +:f?`cCH?DbucjRq!XYjR%W>nMa>nsrMd[<_5!I((@F>PD(1-rWl +)OKjeL!gTj2Jd\)hTO/o()($/B[D;UBWC6\7t>cGO^+*epRl($DY9bQ_/l)4F"`;F.'Bf@P@ +fImJ'QkcECS@MAF8LZ1hnI5cBg"jG#&CSP]AAJSeDEB*)C_FA!S%IOs[8aps(s:(c%djdR-C7 +?0gl!%$hlN$B'.(7fK^H%c+t/lmflofU19Ze&u3Uf0-VU&+C)ieB.K"UIeInR[!!jRTBDHZN +8_l]Asl!IJAQn2FlU'\^?oq%V^?8rURI#q?k%f-[l0t9>9TTgf1M$C%aq5K\>]A]A&X_VePenGP +f-)r^?Yg+56?b[s' +<\th[U3jqYSBc,,`I#^!(lPGD.9u[m-ohQBj^[V9tI#?)F;0jN'R^LUiPa!X2'*LGO(/o7lW +<1\./LV7&N!53LLR(p$?^^i,%-UN_pVci2h/Z2Ra?8YYQX^)Us(+HQAANk*K +75?g3p_LDC'eq[hfoV+r.\&ufH&">V//ZL;Q\XOm#S'_W=YfhC[TYY@t9-W\VR8!O"2?T<\= +_r_;Mg3E;8ARk%:_.U^7F=c"r"_`,MUW.b#taisS-eRA+a3XY:l7B]AXHXBf)1K@Ec'DJH +;X@LTq]AIkZ&[?k"^VpKI%VLio)DH'%6d.F0=pPA-T@9R3e4)D9s&,+ebZ6FHpn)),*OJ90(W +o:k,r27ggag3&nt`7Pji\_clF<(,0qi_0.,$bk-=[;"Gt*p7men6e,=/?Z$QfWGYOfJ1BZ0Q ++d_Q_)]A2#"R@CS/e@.4e>qd@G%s#C`U>B8\Hr5R"Pdk`kP]A7f85qEsk$K`O6tE)OOSJeDgio +a+cWLNPHN1(JjBgTq1lh_/6"#$BWXKLnIlSN$?X8'Ja-jqM,?\!881C,"I8cg?7q.eEOYU69 +RX8I06#p4*$N>Ci0B^QmDGF)(Sc8okn;2]A*Ft2,dC5J+/?Y199Wq6su,OG2`Q[YQupl%WVJP +bN)ImmC4-$^47*M$_8Npqn8U,]A!pBa\^am0445c%Xj;]Aa^q`_CY#>%36YBg!-C\`]A!%R_5Lg +,rD#aMT%tKbikO`3Cb_-qTV*9!Zr2a3OP`9dbg3LcMI$clb#.&g>1@rc2E#`C-co'FNe?@\Y +2*lJ$--Y\1J2c'5*49&AP]Ac6m!kkS8ttjKE(Sbk5;0oHG=90?KI!e2borc>#8DJ!9qU +#["iq3(=["RERoTP/V(.Qq@g.f+`C9bhrZ1(oqeNXKd.ql!q8j/U*+Gl-/&:0&^Nm(/]A.a/f +C>8eJI]A]AS"N,ZkB^>PjjSEVi,^Xf;G4Ca/kq`c;1GM&P9!BOS=$Dn+o*rhMJCO0#O1 +WHbQZ.`_R(!m<%+``dnm;0-5UNV[$icGl0B93U6g[]A1:)GQbnA>%9%oD8,-88(\XCi9#Who+ +JD:oo0MD1Q7!U!'kLJSftTX%mL\VV*dD.uu>%QO'e'-fW'PC +nB@(.lO.5(`+B/_Uim6U!(D`/DSil/fAS_huNj/:mdg_o_-#WYj'S@Qtn#eeRn`sK_FCBS^I +l0Qb45>@XCghI5;ukBJ`-[?A-GFOPYSG":*iYQn%3EQ.Kqb[Kgh']AC%'NcqO8Z2V/-M#Y)g? +WD3(gr(m"M[#U8\)63"_6qQ.T*-/#1+G9n +G?dg*.iKo1I*S`J673h@+]A-N#,F\eSp(NSIAh\ukKG6H$5Z_.@N`iZ;@4c!^&3"]Amq76-mj[ +EMqpku2Eqp3)?XtX2)"L@U8%A-YMV4M:TBOia'O%IDna1d"+Nu.EX9m7$epAhTl36YY$lGknXWG4HOgd,YjOo>_>4@:?'JcYjNg!$g0?$=Eu?\oJk9ge'\K'(N$e@L+?, +d'ac47SsV%_#m4]A"<\(I:V^IB!1ZZU3=EW+M]AEUDbnB`Slrpn-$//h]AnY]A#R<1nk'lqhr.VH +0gTKd>QOGVH^s_ZB%lZ5sO+fBBbCU5PW)-)".aaVQ-A+2]A6gKam(:$f/rcJgSIjYP7,9Tk8K +mF4(9D+;4>45_MJW?*G6%cImdIbDHa^H%.W%M[nCa/;M-[J=@HaCe*1jsa4^Fb\]A`<22l;?3 +F2UOP[VG08IkGc[iO%7P<;G>+OF&fLpr?NRl[&gCA0Xnhu'J5C'YOG!(C-BQ +s;).paJq?jl]At2k:fqV]A\,50'<+(lK# +,m:@[Z.0BOiL>.-g_,0$>dhAbfN4$?f^N2siU4!psd_GI5jfq#fY#pTmY[cr%I4uDI&0lAeP +9+SM3cCjaUbC[58*4hH>jNoB&*(u4o%b=s8p-.^ +6mf8EUX-M3Bq&Bo\@j^hl3d4Oq+Me/Ri*]A/nmO7V6K5SOHdDppiHk//GXq[HRPGsS(p6p*a1 +9!'bJW8_TKR+.C,fj5Rcqg3kaQHY/cB]AWOi$N\?h37$,#^U-]A +YcqQF,1f]AOIO1rd)l(I-XQ)Dg3N@T8ii3]A:`%:&h)B4".P^CL\o:@im=Zq+m+DN>6uth0cOH-pud[0=KmE)_'A6aO"U)Dn@ +;O?:`.r%D>!aqm:3(7P8S[[:qjaSQr?I%]A]AZM-N=q;P6`c;*"f/XOjGpRsKb0:3O.;Ij4s]A? +V';-?nSGc?$XP_qX-Zn-!:Q:6ipqYq0D-6&I!!S?80imHu,/N-cfGs1=Tc*GXcOr<^ATpfnS +E`I=it$rUpn3c-PK\hW.A42aS"ulJIc +Xe:5./,o-s0baJ#=@mT19O.&Ld67KZ.k,G]ADh#Fn2`[2"#)BXpmFd/a2u9e_>YW +rca1j&N.!jKHg\=$Y)E_EV_FF_ +`/g)QIi>'HYC]ArG%u/S:S!>&tH++D%"aLH=."cDeT(F +dai#X^,:6d52tT0q(p#J>(+?)6+rRAH1N#3(O>Ei!!=l9=3n[q/[NH.\K96]AhrmeP@K5'DU" +7s6Kc?IcU4bMFdgp2n'N33*!edW/:a;:f4u!bYe1^["Ai@s="PBohhjua7c +II#STjd?RV!1;FeASSs0$5!M'8+\j(Z*0eqi-i1_&.9`UsUlm8C!`d!nc]A5!6l2?AioCk8AC,lQ&@XAfdrGW6$@JL<"B?sELjFJVP;l=R. +9NFTDi!'Nt_^s*\TkVCKm4jUufSf5l^9s?gnT-T'Z]AR-2U^QJ[V@nFU=n=>*$qH27[^c>I>R +iF\aO]A*[G70Nu)'WH'/ +PL>A7F09@Xb=cH16R2D-jm8*&o%ZT@XA7=Gc(s@?.J\o![O$9CQK#`(_%4-GFoHdRgZ>1p%H +.6!&kQ!Pao\$$l)etGRV7cg&:[Z05?OPbT%D:h!J+RhW9_OAV1EpqT6#]A=8/<27_7uX&Drb1 +n38u0B\UBVN673<^A%JJfjj +Nd8A?j]A&Q-cPHNe%l6g&"R4A`F^?XXAQnC-*-8Tdfb]Ac@Q.#;1k#(`.RjE&V3%jBt +3'2TP:VM)7$JhCDIZ0/P"-gB^SD3!.s%ao$(TMS:1Us"km^U[V6Xr!`Um82Knc(j@hd1 +_bo+>uNndQ.;W'C.f9DgPFR[BH#H#%jpEFU2CZDiK?Q:8*3mtU]AkZRY@R25?_A)s7kaCPY +B)?=/]A>\^`D(Q)OJ]A5L!EO=^RY +&Ac/Un&NE"gP:k^Dmho9QJiE>@#L=iPZQ*-RHQ++%,.:YD#Cd4u9:Dir'k8d1TEG\%Xd>Yt0bRaK'VKW +?5MHg)(2``CW?riZieb,sc7EUg7CUDt^3*a'U?bU,hpqJ0BZuV51]A9XfZGlQpU+>5FWW=c]AAaX0MB:#US.ROhsVS! +@is3(-eWOW&c'S:&WYZ/>U`i,q9d09R"FlS!^X5Zi20tD'G=hndr#>X!3Tf_ol=p? +R!0F;,EPiZNqV_tB^Am8@]A%n#9DTZJ;n5T+nUQGUC'1Dr1<3B8$(LIR,IDY\j@-]AiPUKED2S/er,+a2?tJcQ!5k2]Aq> +MYL*fm3kD=T[8>\3QdJ+beJIM87euM73C1OXM+7GQ^:(]AdHf,J9A@o,hMq-H_X3e/5E@if8q +lniTHFHL)D!0/f?[u5GLc[hBhAYIr%i9D('Fue@+=uM+Pl]A"^bt@sO!\"3=:0J)3=rmm,i$. +t@K.*ARptDfNbZbr6 +Y&Z\RdCk*\e0qa*cGZZ74WY8:P:CYD^;s*:[NQb6:LLV[Xp^H_%F5R*i6H:1CUi7j;fsBca< +Q;r%.9+mgJWHLG>ic=2i3/2#ER-iM'8RT$GG?Z&7%kWRm'o^TMm*H;u=[D5o>3@"pnm2 +5[Z*2Ik<)Y4:-Kn%m.g/%dW\^BsX<#>aj$m]A_2GBnE>Ne/4:8elTUWHmE:s*Y.M>&h8fm;!r +U8?n7*/#"WAodR4HrW8R88u_2oA/hJQW)D!C8$TsHs\&5ZnRr3.f#Y-n$q+(noOK?fiI)**I +e7H*Wljnj4[:_8YL@[-BE&%XktmAt+YTbi874+kD'Wo7ke(a!(/DY2jSKp::""Of=>,%cNN# +RMLh2K:WOjfh&DlJK;hGLQ/ak-$VA7ARm0ndIoP#/>0>qna..17&rgInDV84kksA)*?,!aK# +e7:0_+,V%1f;qcUK)cF@dtF]AtV<"k@ehk7]A"U&/&du-2gQdm(6$>fP44CS1Sh8WAo-+BuGsn +5"n^=70`A(HreJ#!_5\VASXa@/?pS>d2Ene4JMUnA9,Z``TrA;M8mn@;kfV%AAX0V%!0W*I& +S%'.A'QSiS_SX#p:dRVS/Zt%@FgC;F9dj,EId>I&E3@'.rhX@A6NG55fGArTMoj->MGu6->b +W^gM-&b"1qtCaQ%c/o8e>Snj19;bf_8R*;>p +qD\!K0d(\Th"Z8?aO4G`gdTOO<$B7KoG2eg6t4O7m;cQteJIYd0N"%LJ[$?jEIP$e.'@hA;o +_X"h5r*]A@JmuN'SDX6RNk_KqWA;q#7))h'0B1j1Y`QeT"G&*F`dAG=7HH/@PI:t$!Fc5'G6, +6qL#9Wr$H>=36c,Bg7^R?G1mA2JT\Uc2(1-G9t(Ju)d.[i/u9H=@0Y,<>dA;5Y&3!*.D)a"? +3\Uur5k,K:VF(^h-oK76K>gV#R]AgJs^rb+oGMp'\A(MIL:QdBq@P&NT0PB[Yt? +=)!>SX_.JGBEe?aP:mJ[\7isTeeM#7.Jg2sFD9#9Tsmqgrm$(S8$"m\Bc$SHYC]A0D^-PiE0\ +MaG3W_:%2S(fKn.B/&(#?G2d3L<$-/QIlRPkH7XO)DOej]A>'gkT)#oQPh_"1c5Z2kH4]A5PhhF?7gj\r1r1' +E+B@jXqZFlU1Co>I?Jm\@pDPXSjd6g2F76@jTID8uL%ljjeRg=n79O+:oLMX8TKUPuU6p&jR +5^7?2C_-W;=D/cA\%6W59qPjHkm]Ak,l@JT(;(!`"8:.4bFn_LRAab#P"9D"H6:^!F\A)HWb`TcpFH?BqF[39,8.R6'``pR"l6c"DPCE5"2E,Mp[(Qh4Qna#&RG]A +Y#r`\rS6SU*7%_a[6OgZ`^DB^N2:qJ:hpoHYcFUPg"h8YJroO7m9iL1lb3_HUi:6/=rWNZg@ +O]Af_f=8%jCD'&I&g>GJ\O>=b/uL:dR'!6+=7.I["jQUtL%8'Yn>rqnK!'"^BiaHriW/[JRUW/EujXV8e#@Eq_&QlJ%g#,W9gD=LVn +?qidBt1+;@)7fF5)_\3,"SiDLQ)ReulM?08;VqmKg +n6C6pG1%mWL^an*g$R@9/C!C+=`/\f9IcF$U0[H:fARjU([<7>*7@(?Dej.eI[N0D)g6B_)= +YfEL.=cAK0UlI$UC")--nE0P;43a;IVaY0D9iT:G=u3EdYAj0cd;0"8)U,]A^nP4?.;;Qq4,f +Uq-\uq!a:G2UEDT'N3_il)RIP>K,A("GcR6)o-M^]AI`1+:`M1e+4MPWgh"D%2[Z5K.H3jZLZ +uqVh.dmW,?'qljuk?i*QDKdTNRK_ku:M^+id`>4;;Ih)=2'8p?h\9HFZ3'R_<-5qFKLVd.8< +K:l`Od`hh1L=Dmi#B?HHIh7no\$L`3Nh=!69@G]AZ6A47>TQKgoN^fsIj7Xj"m< +Jt[I.#Mn!cduEAEBdep`XH2YK)7/)APgL1>M=".?.NKkH"pM_qB)a)=Gk@Fr4FU&O8+4n)2s9A2\JRKZlF\3[XDo#QmbSdER ++WQ"l8-g/KBL!48[!e_4S1Vmo'Tp&sonodjS%u\`Alh<[dQa(0WoBD!n?37t8=M0M= +f/ncC12C^I9D,cie%\1dX:qDL)Qip5BtB*]Aq)%A#AreO!Hg=+3$5VOKf*D&%dMF/('0+^-qg +A%]A^DkPEA%O(i06?W2jG\/Fm3LK!F/a]AMHq%?STlYS\cMXiUr7I0;%hVu1.PZQ@m"Ld*rT!.<=]Al0j-1B$kO/jU8DJ]AnGb +E,9ZZjF<*\tiTFg`/61gH<^5uXV##Q=5:7!r04FJ\JJD`g]A!1\_u(W"<)7HD8P'F1iA*XD?U +Tg@aj,42`0K9@h.XV*:'$omQ1Kt1>2csGh#&XERFAQ`X%OE(Zo?DS%<%?^2P3%k4p,B?]A +&$LE#]Ao=)bS[lH1pmOM;[Aj@s;=*eGbGLE'1K;nC^"T;a0a7h[YJ>;%CN@1>5c/Z!fH=!X$P +3k0O"a]AasIioBnH2mmW?ga?d4jEmNl:iV$>cDnTS!4CUf.#u]AhCLd$M7c22p$Aj^SBIR-\A- +gE='MY$Uu-^&XR\"!N5/(ZZ`YTPh0I;16ni6Cs!q[^r[L_S$\KS&)OCCE9d+uZ^I0:q$+VdqXuch`L^nSR#e)4U&/#1F5OaU5aE!Yo5r(7NP^@q +;i!,8P?CX#L+@X7:rZa7I):e_2K$K^j#_E'efR2IN(n]A&H_N+>W\P==aCl +DWt%!/\hAkHp_"P[V,@o\5p;3:\J6PSm`0[8m4dbFCo>=:ANu7F%eND9^p-gt=^>[&%_(W"aJ +X'h4m<57>>NcCQJF:>MP*r5\)WA%.&;!Po=uKMH6EWXc.Eddk3U6(CkJqjD8W7L!"\,*Eadg ++c]AujgpjOd`'%]Aq_dSVOAuEQ0k8f^k$#r2k;J*KsIZAM/]A&,>nb(m*l*o@%4h7&Gm$p;=f)5MneSAnrsdXIJ!5QEIVT"pki>P";e^^RRJ4D#T[9c_ +RS^ChPmUVd?mmF!O]AB77lHGUW)9:p86reX7tkbO_aM%eD9ctA&\_j$T/G-fI]A\:;smh=ILa2 +7ZMBMie]AI@;0$CunSS5XI]Apc`#d?B8?64ldEkiMsp-A3R3CR4iB)8a-5\M0G!M[/6TK`cg`3 +OKk:EMmf;^R+M32Iqdm5@m]A[^d30Q,SZa4X]AI):=GGW:b10UXPt.2l2>`jV?!! +,bO;!B81^R\^!CWYeX(r>X0WUiCBq9@cZWp$r+bDN=nXFXfTBbe2Q)3/2Ca-YFZl>Q)sPprs +-rUl-*\%tc5$^Vi^Hj&RU@@is%YQ(r3DMFj^7Q=>s]A4@E2F.l'.gcsQbodGPNsBk>OT&,pNe +(?$>JYN"(\i_Y07F7Pd$oGDKUZcOA"rS''\9e]A3dq-"2p]Ab+[25s,tnD3;AkBcC\RO8bCXdm +.(hBXj<-<3s,>te6t43I%n@jKnoUlE);;]AbF8[EJ\l2,caIpE>jq3Ar)9#TlL#Ls+Q0ESoJT +52mqH@'46AmVAXBLJP;0j7B5Y-foNBg%6O4pM4C('R@hFoSm0-:8Ns#5f/_7/T:?T\0GPQgQ[H'?GbpufdVA2ag=t,T"Am;Ie9d9*'_@lF*TYn8I+]AZ +,:Stnm6!_uobT8(k)NTl'467T4kd@6`(phso0H*n_k*I1_@A=!+RO2&oRQI6@nS'Ht&1lS1@ +pZNF+=3UAO,#$n4gHW0l[3;IReJn5^?Moe)dQ,XD]AcUO(.C7%W +\5E`TZAbqJfsHuHs)0s9DQXV73Vf$&HDIeFXO=3su<=_WHbe9QNfn,1_QMl(OkD/1nZF2c,N!kp!8X,HF+lhrqu#NGh7Qk<[jpefC0`a`*_6;\ +ij1m5:HD4.S.8TdX]AIgGb#+FYhc5DF;04AhRquQUb-Tj\[5C=9>@H-^cZB9/C/L!VN4eOr*X +[gK$o^nuuH5 +I%eHFQP)M7hi!"9bsa@)"HEg,huZ:J]AJ/bl5m1_`.Cu,N+EB&C&Kth9Nj=Xqr+DKlc?5Do1u +Q=ST[,uYmI +:U@E)*.-N.LuNZU:a;T)!;,6D8a0Pg#o58\%(qECBX?gBA0OA'W1&IpcC;.oEtCmkA:":qZ_Jd'`?OW`2>f#l'oW +$/^]AZB(Q%=o2[;LA5ntE+d>')Jg9P'-r8gG_gAU0r;OU5+[m!pn"L$pqZ]A_Q1i+Dh#`^0??3 +@Ze7nLN1`-;(+mHSe#P!j3B"oBRLF?NAD[=.:SC2\-"4pO4/#C.uo&UsIOhM)R)A^P7MC+m? +4+n*0,4T1;6uVZeU1`m +))n;u4Il&VA_N_q:SW%JOJC*@dTVAPp49E$UA(!;7iG!o/'@P.?]A$XO=/nWr]AKVa7"bq!h!_?Dgj86pqAP[ +uuNX`9X2,I^9p_W(]A:aJ>;#Sp8d$DHY61f.#UK%fQ&*,#sg7LDM\:`3;S/3ld5;&WHs31A"W +sg_/6KQ1nr)A&6u:V^8h*jdXoKo=MTS]Ai%@VQfE\VY+&tQg?No&5,>Bp'C9($t/;?j'6I1q4=cP4D:b0Um=4]AeTYL5uZGU7fh.Ilj)FDM\@H?q$Tql9\&S/(L9k>]A +0L%YS!es?1qR/"XrT8iMRWRepJ<$A2*?o"IOg=0#[ejmT!kVfB+[HlZMnHkZ_e>4XacAY#[\ +elMs1u-5"7lA5+;9E_::M,Sr%/_@Vq`krnn5ct)jBIQo-+HdSkG` +OsNPmJhOiWTIfl,N)0&^qVU\E,>54NktIO;0j;K7?dMVeGc6^#$p$_E##=C$:[9Pp`p%HG,$ +&:;IN[)6">%&ah@OS*>aSm@h*[4,>/VL"h7_Q*P!LN1-#,uDt9SAC8DmdO9=jV;OIB98F.P# +[Eao%gbg.#.*>6&C]A_#iC9E6e@PkVHGMip_0;9qERiNUO;o0A=Wp%F8*F=6U$^mF0bN:o%A]A +OG0s"4FL&jWJp^s%#0NW`j4kb)%GPZf%,V(-eR:UlKPXL60L*5o?g-jpMm@Hk+iXTo6o' +AeCt'Gu0af5(-\IsVDs1:38k$Flep&bqT!nY\rCbebd@.Fed419Z+hn$Z-@gHE`-c(`6&)QT +4*IfQPSfRFo2$hDM8+PKef0TC%nEu2Ie>G6]ALN,e9C/9mOH7Ts;f]A'=M)ldj);@uVB5?X!O? +$qnO5M`;mKM8(?"pQ@E2=!1U_[$H$5.^)i'YbB>@u_LX#q"]AW[*O?d2ZXc5mG7\'&d3MLjfq +bHpF.K37dJAkS84-2)^=U:<@Qb2Tq5bMl*Yn&4I=o>+"%?gFU<]AKs!BWgNk%fU6BeWo&oadb +dQ9:a9TXi<-#/TY,g(*I&1!b,CkAH6GS@.6b1JEL;aq'@hc\A*;U?F\9Ub4md<_FP5:47em, +X2,pbG%2X7`i?q9lint=2".oE\fad8a%T,0Yf1`[-74lG\?SJU'5Z4,V,coVM=^Yf(U:TjVd +VpMkd>3@>F;.odFFHf:g/tJd+Z0^8-03n"'nUjlemJ?53q/<1NDfX'S*a8iN7GiS0l)S;t"V +Ducp4g@:6=LQ0lP,D7I[/I]A?8W=CA;p:p;1!1kH(Zm]Ai#M6%p.h$5X?EshAlRpAD*Jql7ei9 +q$8%IpL5lsN0BJ\iO;Rj[!IYV;OMX^H&,Ko8RQ)@`..nY#-fnEEU3H=Ui;k%Rb,MlkbJ)_q-VTP/,&6HB6b`WVpaD +oSg+4P]AWWV7^-AQmY_`7VA7`bSp4.hn_n7uZ9q8`&29CD`;^KQ@MU6Ssu.LODSVZ>X;PNVDq +`Y?,be7fJd*[k!1dUIn(4YOV5E32q0jULS^`u_NulqTem_+H@\`ZXqt_g^$U".n,q@Q"W^Oq +3^gN/0!=\C`Yp:Q.@IaP"'g*W\$@>p0dd8`9MI=5H9'T)4&]AD^P3s[L%Tqm[oI,lku\(fF>Y +.f]At`B0.?c+_OZ&FGu#p.B<*FtQ6O5QBV'UH=uYZY;E&&Tgj#EIRm*WhcRe1QKg#rF&/:B8( +*emZ=q*JnO5^H74l."rUWQuG33PbhpOB0soj",]Aan^@g3_b-shq0c]AWfp]A['aBoHeTEr\0fB +TZ$^&C`)dY`9OkO_82I41[[a0Jj`=\Xf9)of^,D4LJfr\T&c]AZn/qk5l*"GS.\1A:Y4;4A*j +@'Z?T<$M(4lQ/#3=_r#9_gdQ%h,5gJAkLW-0ZB]Ac>\a_=/ +MC96'\3ekpKULk]AI@fg59\3q@pEm6FNTWiN-#Y`+H?$W^j1D*53ejqM;MajPlS#7nGo=.org",M8JRe'"A3(-7HJJ7K,j1;WH4 +7i;-L,/"\d57Z+k?,d\^$8Jj^b!'rj3fR$K'2>)ru\gs6WH&umG_T_PAh/[%>'jFi_IWkeKI4Hm;lOh2G +77gJ%5IeT+NK]A#Ni+IP9E*n6.k0MC, +Y47AUZB\A#tfkWLVk.SgQFVMpN8mWV+_'tK4=bHaWj/9dR1P0Wg`2of,V#4f%2@N^)BK8]AJj +$UBEE(,_\]A>^o1j\pZ)G%!Z2&,pgj5#--G8sh(:7!PR:eOODHr +TH^4fQ_6jYf)diOBQk/SR1#Q6)M)d@a_?rSZW +7I2HXDOu]AKF8otMB\Wdm1&]AR.*,u]A,F(_m??U]A*I;,ta"p4*8RRF$mm/Rj,e$m#(0(qm8LLt +d:jm\$t#2cVId9#@<,O'eEIp\c6/XSC0`H^")9E_A0:jDRV11,-50]AIt:"ao&s%0R$Ym>$Y^ +Rt!r&-uZhpNsjJTVn[jYoXG&j`%+f.c2l:HKLC)8nVmD\R032lG93gmDk<>82hg=Mje(Hdcb<)f#P9GQ +q]AR5:n,eSY9d&Ij>#;7V\*Y\IU+uLJ:k0N3WmVu)!WH:RWmXoKN;_[;rCq0j^2IFn)qra/rr +,&U_DD"`6.**cG4lo$\koqG/2m,@rKFOE!U_BmE>*M8DY3t>fKGWJ]A(8E6F`K=77`ed"?'o7 +`cKdNE4=%BlHV=.JFS/lf5Y&1?C<'WIUhdOOpOdQr&9*Rbu;=Ig]Aft>kimt_(7cSH^..V;1\ +##1'*T>`kb]AdI#_6/PsAl7.'WbDM^QN?p&+UKd@I0R*U\&^]A7]A)L^a1e/WYWffK/G+oR<*Ao +m]AbR9>lRa3p#r5>iVr_NBtiD*Gu\$P`o-6Y-)LMgV0hYld+9<(;mt\4m/l&_\hR^eefmh+t4 +$0l!HsPp4t0(%08[^QaOL;!KMU]A1&V<%rS1Q,N<:"N%_ct<`(KD,^CMP@)5>c]AU&Z3@Dl$"_ +t&'T4OpOQH2=?_aq`dpYAWu-g9Y$Frl/_*.?KD9L&U)NFf`Qg.6RG@8Ju?f_[M8H$QN3P=]A% +LnQIqm^\p5LG3#cJ7[&$Qr^Tp?Z/800h;=7^sqN>A,lc28,=%J'Pl_YdNjHU(3#^=FlYe2ZJ!l&'h:I* +;l1RuW3fr;$gG0P,>-RP_Z3P.b(=kmU**BqMALbf!7VkY2**8/,K%30"C),K=]AoI!uhkIEe& +j+3m!PZL#5(>SQUaZ#6h?+d>>gO+\^L.[4780\oD*a^"5aB@4_>=2JfjHRT3HY@J<.g%-op6 +EP[E26]Ar1bI;iA[lN@3*U_?kRkrBWK7Yf1(0%OnQo0_fZ/0i27JfBcm4AXbiQ.>hKB8<$$3u +,rF-+3I)sW`UP;N>Xqu\AGYE5PjX.]AM.U`HQ6[S=t#IiZO48W5)^HM1VM]A4?PU=90(m5`&p! +]AjM@3!kMXYfM"sO/*JsAh>Pb#l/BO8rblR,OC7:"E2W?:a809R+1CcY4#6&('6ET++Ydde1S +X_9jZkW,]AF%/!Zr,g68Fo[!k>q2]AYe17rdf/^_\dL3RT/)H:hk=qQiT&Wr%-XLP!h9iAJbX, +6IS;Fb'3cX=IBYJN9_!5]AFCQT6h(\%)n]AAoPq%#]AV=$'$3GMVe#CjWZ3e&[RF*r0Z3.s5eO-W$dWo$7p/i9a48k!9#,!U8,J4@RX +u@1p&.UQs)o,3N"9\#<0=#JJH3W&T+lc?B_"+F^cf='G`d2!"^EkTL_a5%T;,c6Jj33geA2hbbQBNgPD9/O'@S1N(CYb)"\n8-'*S!&j=L;D +eRDHLS\O<7q6'N"@!E6Zi)Eg-gT/O%9K;an$Ml356G.JqnKskO=3?G,^lc+amRm191^*UE1n +,*)i'WplheVG"*f`W?&9%ef#s3n4OR/4gJQAMD6lCl;g!!`HJ'ae4BARt*^h/j=ZBql&4M]Aq +HA?5ZEJ_W@!LsGop1,j)oUbc%iJ!!@_rD?f"=L>McF_j.d +]AQ[f]A7iBLJ-hIfDp(X__H6#]AMJ`=?9E-WofaZj +1:%h1/d!$+C/:*o;55ta%3V""1cor\5Cr!7I[9;Tqr_gMWqZBO6W!t`&EQ@>Tm'ej=Gf>m%, +QZeJsY-t:?M,6,9;CsE7-!cO\oP:BOd(`IW1,BDcheeES$`([=A8Ne>?FG:lq3o`rpr'\('- +1*k"SR'I0aPj\Qb2_WF;/qi^\#&$i\t$p(KDIfRhp0Z23'7SXI/a$fKf-MB]A+F=)_=EJIukZ +Jk%a?660aL_,'HI/.!qSSVn@`r^ROZ`%W['5;2^lWp^`NoIUK1%]AA0A`dh\9o-n.e.IBC`p' +2*$]A!+s+L(UcpBZ3oEsd!Zd,>Z*[#FSg=KEseOWU=KM@CNHTZM'gXaErP,s+oCPC'Q[H$RGs +)*ChdYpoj^*JIkP.WOPKViihHAijo5GZ$iGSZX3eQ"&6CF_k'E.b]AWO_BuE^'%/h@l`%%qonO'I'8qK$.;q +u=;\*Jq0d-4pW2Yk'IbKK@]A5`b%E[V(Wiu27l5&9j4lDK]AX,W4$I2P;N]Af7^>L@o[7ojB,2' +Qb8NSsV$afm!-ZD8h'\SAGdSrY@9;'kA10rtK7J/NO"*r\tn>f+mS^8hR#VnbS93adn[/SC_ +4RPi<;4n&DD2n![Xf"W*4=jDoZ^Wj7eO%p,QJPcj/Fo%kWRm71BP*YR&VWTR+3Z3BMOOam$u +)>W#oU?OLu#4g9&UHU$l81N+=I9S/N?>uU[bi9^>(ZAji+'$c_kY+\_Heun>,6]A&B=>c +oU\"s%`im8>TlCmi#+Fu[BR"^/P8cfE;A)&#%=5[5O[(4_@"6Sbigi]A,S;d/F:ejHP2m08$8 +O(I;X,SFES#og$h$9#n_U0hcPs!QAraWG_B1:ZU[,JSHJIA^YO3HBUm#)*qXU*.$p1u7:W[E +O-64"_9Xed4iHFJa_#?1*1M+KVpl=3Wkh3rjQhps.r/;h9,`>'2nN(ps`h$c(9QV[[1plDLD +pcMYf6>tRg?R]AliaF#aGb55)%Y]A12Mg47k7r%fDlC]AmPo]A!XuMf.*.h!S#%Dp@!ZDK!o!F0F +/I^AX?2s$$50g346rH#!HuPZ&\p6Ie)W,uUc>I'[+9=uFsM\>F!$Mid*iKpZ)g27$"8FiKLg8#.R-l1[42$L`+GLk*\6E<_^^Kk1JoWTZ5p^6/]AXeR(%"R(I6ks9N\sd0fPh6O#Q.@bIq[:HfWR/f8$NrDC!!2BgMu(mr79:;AN.oM?pE^k +L$j[9&*Zu]AAod8_A*n7S/8`h.$-Q"f2nj4!6cqImGA&WhQ__D&MB*k*)0C4#`F5Rso/1ja\; +M!X`e_I:&Wc%r%ABNGY4&P5@kdE0>6Pa;8&s^`$U@,Eb,R&s!p)-5V2=">fVrbo#bU)T@5fW +W;hd$m`E5GakeO8FHjjHa0J)s`t4#YKq;+d&u2`+D_=g9=GlOkGt2Ct>';4..7fTh;D)G,9Q +j<(DKG?SIi^W"WX$1,UnJ#a,ROYU>rXb8C@mIGm74c>J/78]ARc1../!aioCWC2sT*VOkcTDU +/_$,Xg_tQ[E,4I9>P:bVYStgH'dGpVq":9M7'o7-7$k>YlOfTCWKMBq&m\#FTJ'<_9>:=(hl +C#0peEKX>DPIF-1cb4%k.VV7oSh95\TJn-!-6:;-i5h9b;PF+r)ff(%L* +IoUJ5nI%DL((;(H!Xq`ppZ=O.&T!.hh=>&aR9WL9WMO?VVMQ!pSl+V)NAK2^WG-Fe__EHPDW'C85?@%d9h^sYY-P8$1gV43fS +8?j0W6,UUOLMJ32+"*Z?WOl.OTHL,)0B"eBn[jPm6sd*17>n"L:dXU0@e$/0n*,ntNZ3:3+W +$(T)co\3?Il2b5rT\_>_//A<;89L[61-[hQr_Fc8s")Oe**-D*-)+k_DV4NS^QrGWDK)'+pB +a)oA^T5E+e_sUL0VC7TLg6eU-rf.fK'B.K"YaY:(4+=_&tFc;h4&Icn%0&<$&X8mDUi^hPee +ed(,&oeb[iN%\qLAaX +ELbM`9iAc/NAeVb*inKs/p(SCrdt)/5jkI05uO3e).7>!mc6`U9m-& + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +uOJ +=kj%BT"BH5YI3bP-B#%3hc@^WuE]AJhe^,p'4VT"77o>g1L#q?SAH4.Xqr=n8Rj&LUVRQeAZb +VYN(<3=u&QbQO-/^M\GKqn$00DZ'*2)';>91qo_8f0P>7\Xo7mXpc!2e@r4,C*Tg, +MPaQaRGaB)LD;UR)V*9dnrTNoRcHnTV!+2\u"L`K"NP.:c5#9'P7FArm`hHc)^Mfl$[?PJdK +^fs2TI\#MeK\`7q#.[5$\;ehgS2\"ZF>@Ws9(f?4Vagg_Ep#U0Sjo9@QnL%M9,ib[71mg'V- +Ou8G(D6S<6fL'k:#%(O8+^Y>VS6mI?26[N%DL+DJ]A9tbpY_%mdVn;il"SnI1nne]A'3VEEJ79 +cAE21E(r'-BJG=BP(@n3<>E[M5\RJ+aFMb'^fZ3'E']AR.jb*;s[/\l1btda*Ocs8rZ'G=4!O +Mi$$kG@rhO0SEIj[LMIX?-#aJ?eIT7o*X89U,AEoc4>NAgZ +Q`2bJ`g=$u)pC'Hh3_qoS/a":?p8q- +:hPTEcF-#Z+$RlqVij"=B@XNR[fX.NBqd$B!lm->tQ^83sp!9?nW0-hXlbhIo +W-2$2@H"@G9]A)7$G"9cPkB0`UindbY\C,-'XXt1=/JC!mET,qe3<)l2"W1hX.#K2eF]ALOM-Lae[It?Pu@:%h +@`MZFt(AV^nB\+D,ScT(&Yh)QbRg(ZhA/Sq%!YZF%sYQ_Uje`,bR6*1<8\,O>jfQ?[P@pmsm +T\eRSWL%'A+_>0BDnpK^,@&D?_01-?gK:q$[D!8Wg(\D%o_)Nd1K5!F041$tQ,"C4mF#<)t_ +r>A)jTp(20Y+c`YeeR+*Y3]AhOq0[D%ce^c7,Kk&hrSqCmil>`,l">ECJ!QBA/jDPTV;tIe+c +%-/f;`idM[3D<#*W/ekUidm<\Ed1o4R$Kc^0i^N#(&"M?DoeM4Q6'8e.n!O/8KF>(9LN<9ZL +X>Si5'lmhtspr\Z:nk:nRjMuST!d4DK;os&%Ga\G'nt/OA/:5I[\C5AT,.jmQT*ohIqG5\bC +70Q0=7/[Q_sS$7WC!IKm00]AQk#ej4L?nA87`]Aj'\=7"rb":t\.Ad:ZR8<&3#LlY`[YL'<&.S +Y<=0gWN<-B5:.MWj#Y=3G@+3BM\8/KK9BRA>Js3lkOAUgucQ.#&&d!H&4Ratu9p"%amI\pbC +54O)dS[,8YBn&Sf&K$3!VeZ8aAl0rb"-RSGStW6@DVF=!bj)38MCeDq"&,c^*R)9]A3R4oe%^ ++<;E-l<6,1dV:i/eM-?Bd)eVso7QR4UEqTuW`bl;h!B/hZ3qQ7hUo='U:dN.q^K%^ZjL!o!Y +QA&%g?W1k?Q:WT")TCkOV.6EE9oTD#84gB"sbId<,FDXVS^Ch7rAa6hYT6eZJi$.,8q8077I +r50Ka!CLGk@b)pD#W:5Jsa^41HQ.t^TeM)^9U!MXE7Z?0.XJZh.$6>&-TGM +\AjLmneCh*@t[joYj^3K%L#Xdf,cY8j%-;cc6:s`^OjbP)2[(0N5>\d8qr692]A=SaHWEX_?5 +''DtZa:Rl(r\6,D!>)rHAAlR[J%UouFtB*hr4$K"W[:R8'!WKaUH5A11,;D.N=CWu)#V*QKd +gj&cO7$bn2mc/2ZqohqcVeUr0#gl(\*B<)ZLOlXSlt'=.pC]A_8cm[nPNqbh*R7[a='&G'-"G +4P`.&.[BC/jR]An7SCk-7`H]AroJ*\=if7i9%X_(c`7n3IFgF[odO1rk2:KgZ)gV#ajKREB,`_eAKF_cRLC7=,rWPZ9TJ"bXXWC\h +joG\sG*ISM?*n9>pR.cOf+_d!m``%t,2kKTd8R#%fiM +RNA[(4&BJ*r[/a2//X`fD0$$K@R40MO^pRagWY`k+2F]A;sQCG8;ZIc:D,Jb[j,RiBe +#'/L/a2R2;MIL==,/Ri0bAJMB-JY4A]AXJh]Ar;MptT%7Pc7SDk<3D6>;dpppRH(1o.e8tEGKe +PQQ&,c0l$IMGmQO45k.d2,Pps%LrB$oSM8&Zg[f&4CRX(.[Uq("rr94F*"2)\\JPs?U+`$lJ +j)RQpf4HBWaJ871$9@s(70aE;)ChnbOT^FJR3"/UHDbTsnZWm%iAqc,fcn(dkBH0*smN08"\ +eK5(jmRTil_C5M\Z0<@Ci$U(>\CoNYl*F!fKbq.b(+*@dp"S#U7*e4#:@)Q&Q6FXdPQpC?5f +(kN_/W#a=pf_fmV=T%eEt%QCs_RD?!AH.-R1:I0@9FFTt8"KmLcc-o%4:4f4pa+<1FaUiQ`) +l`Jdt3E"43d%Je/_Rb,[u)R/a*X5+;`gG +hJNVdcnj88r9+5e:,q0djO*5P=M:hD)^K',[rADsqT_.&$*sgV>P!*e +q!>-kPoLJ`S2Rh(A$3+u'N<2mX<6HLe+$AP$=%u%'OIjgs,_#.bn++&ZcKA;3B72]AUH1uLCC +=b&Xl).WRCE_flKgq&?+!D9PfQf0f&Ca:W/`Y,tnm'6rK-CQ&5.V +PnS&AO`Y?Q,HA_SQ`d!>ZIBVJ`MET8$5S3)4B6O%T*2``dEG-am[CkX&bRC5?5('QB^E=#VC +7Iumq5lkoTXX3anIi)A+5Ea!(Fh./Y;8;9[525WMK&KI(?jMl5(Ap8pFs=:bq*og>*TY/Ld# +3T3IUeNL(SNZd;E<.1f`iqQR[S%9m2J[^NWec^p_2fG]A@@SZhhTLa]AtB"Z9^KVEF#m7Ng-._ +!O,U:%"#%/(5WPK[.D=BI:e@N^UX+5$hQ$*VTOP((4klC7`FdUca94.>-:ZSKq'ui.fcdGPt +R_?IF@qldWn%@(b=jIKTlsQp$ad3ITpc1Do?m+aHdIq!R[f;3OpW;nC1@UV*r>g12.X[3VsS +]AaTVAA!O:TV'A33Jqtj7Z$5D)$FZGh\\o/R4\utDNDr2gDJFbS]A>Ii1?n1^?&\rbP+M\]AKO%?d>e_".C1*,bI^]A+GCg7fk +M#NLB/'6)B3dc]A=-!fu0lf5t-aSSJCT)[q[lm4H.FB,^l;fFeg]AN!]AtU$fSQg.M]AA"3E$^.6 +A!nchZ8@+@=lV:WRd(K#?H'0\!aiOTEndmqTiWQcoqeo6d[!&PqQP( +G,bl(.8S5lGgdG(;t(6ka0PXQDXQnYft0[4^FGWUMuAT.YC)F"Ho>3\9EOG\<^D!-aY(Gm-+ +W-RFE&)"n@P=#eZH"(5D!]A4\4dTaSVWVh0n[;$Be6OmFPI8ic*Fl6LF*reT9E +^]AQa+M$3)FRD5lin&QY]Ak/@fF;4eSXJ788nNnP)SGT6*r"Vj#R9gJ$8BY;8mA4P&?!p5Y9.\ +\95OS>uQn8\J,@YNAKn`3/f>"[#B[fYE'6d4V*fgA)i`"#L"8c)W.gV\?,cTV;*R-Y]AW,knq +ln313P*MP=h%k]AnMW)^tNC;>dEtX5]AJ;1\UN$pYNERdVXC\k"RJe)Xj'\7^/WbFM"\`2Nj.5 +-8Z$qU;%k,,SV",7".'9FMIkHf?=5f9'Au)amZU&Y7N&sIl^^qm7+k#25=_=+-[^TW\lJT=# +a6cq_IefWOKACdtJW)n\fQ,_MioEK6)bFE7Yh:0Um;Z1dB2cPd4E=hPB'/X[&'@$$Aa&BZdA +'n&f'!IGUWS;J5Bh\e>!fGtidb]AVkf/BhsQ&WA1Cr1N/Hbb(Qsr`.T'*46Ol-Lg/c:gkl$(% +t4+;>dCetadW2mT7\pNVUq5WL]AbcEb\UtZhMTocHp:/,d`+.hP@lL#7JiS8b)Wp1]A_mRUFKJ +QW%MYAuB\Xaa0W%>Ap`T-+.aF&qkP%aCZ*GJm/Nujk).N*pGgNN70Zp?G]A=Xo4agUW^a.[ac +ThmbQP`jBjWt&#\X%TY]A1m[p`E+#VLMnn6\,OKqR.*P%Ce>"j:7_6&H=Hh<1_>T(gX&0&^H: +FFH3KnSp'8\d;FHGeM&7-9/79#XCltk\*Dq$U-91?-D)+h-Q6[]AfH;t\DVons4f%FMp9S$F]A +4)7Njj<0X;8&$%UgJ&lhTID!>Z)"tdnV^4QC+GpgV(U37[P)rY-p>IeaXF=)r6]A"]AK4;sD0o +eN/3(>rE1p*YQlnkY^iM,Zq:L7=c,&b,e,42o7#j%GVCF+NHo/ZK]A4q]AY;qFfRpKhko5X7LU +O4MX-NMgdcTL>`QPk:2>=C-=Bd*\^X41/_aH_[h`cH^1o6l9m.PrHoVfT'tN3nciOba\L8!C +?5^i:jHY)k^!+m`[pf@4.Kl>X!tTo%\e=fl[;73;G"0nR.iSO(,09QiR_*I0TN"]A>*T<06@S +GJX,:bm\r*+B8QT6fO@o02e;p#bu(L4r!pV]A(iaI&tQjLE8=X-/R$6LO;A?VZ*#it\oXDu*U +Jh_]AF%MmDUV;.E(>LI-;Y)]ATX=RXk]AlTnH+r?c3l*TD%2*e:l&-h#J>$IO:V@5Dl6E< +`3''huo3GboG<%r3V>SD'$HI6W:-\@j"!Aclk,gVs.+:kcg=HPgnM7rp\`1=VW*2#;,9!TWT +>pJ.8Kmr*F&#G[7U?,a=*U;SnRM(^5P;:;*\#=L$*^I(E)U9&$0b#=e@>_:nW]AEZhq>5NO<'cZ$KaP$$-g=R5tqQ1lI@OT"RD3"b<'%=XWN4m0&^hQ +N[%]Ad:S&;+X:tJ_:@0u%iqs"n."d[$M(Qs>Ebun,@nakOtMJS&$dKdi]A?>#P$OfcY<2D!4MQkP7<#*3u@[D(jLM +25)b6d95;UFP!+88*D$V\N*1,HTN/#hXT%#Pb-S`iWFbHmKS#9GNA/]Aqa/hgr/9=r, +\gQ_k`a9Zhl+b:eV69(YTB-'@kd]AlnRiL+9LU4$$?V#/V)Q)kagM$RSKKP(_R?h]A.(8rjSZZ +4L_n7HY:%)VGH;4M(9kR@_Rk@h-@LFBlUENebNc<@LfGqdV]APp;A<9 +_2(Jmr*K5c);l$$Bnj4eQ`M'ilY*V0A5J4u[s.\=gacg#>;=ZrVIp[=clU%Gc9n3*q,AhU" +e/E&#/">#XuWV./aA4SP#;/ECqKFNLs8Slar2Wm*J=62uh\*[-]A-EPV,Y!tj7e]AqgLB-\OlEtuZ9#(15,Vb"ng>k3` +?hD#R&[-Vnco!.;*#EfG)!YpCmaVJ#oE*bL0oTr86oF[+IWB99)S;U=P<#n"9E6&0Dc3_L-7kAqfrZi_CnLg:_f%TC=:j(WKJ5B!.%.95R; +N/bRJ:n+e>J^d"K:52E^(MdYFp^aJI$a7WkCUp)::9cf36k#Gh1$5U`)iG`G/;_-X)]Anq@+* +5u@qXV0U8Tf=/N9LJg7BbFC5r*nV;h+G/YumnVkYdTcf:@I,b9'*35\jWOP[7>H,fYus@-A$+U'M7ETX>jod:YV*h2j-l5DU=?)Q<1f%pc +gotpB&L)i5O!pr-KI+BDW*.>):b-4=p(mbq[CV4^csWK`:oHI^ducr=2U,i)#?!kOC=q8`OF +4FjokQ=2e)i`M&N3)BoTlf',Ur.Pc&OM1,-p#WZY#URd7SDWjAb6Q;k\Xi=0f)([9^I_bNla +WJcYAr'MV4h(1]ALqls5i7h%G5:ngS@@3e0.J`urW$R0)l\'5@%n5#UZZ).B@-HZdFK$7.X^1 +tbP4rb/ZQR;?P]AaG^o,fi-&KBPFHr&k?5nPOHDN^'P`Z,uYqZ)(jGL\)qPXBuhI86(D.,dUC +?Rt$#:i4,VQqF6)YEV.Fr00hT]AF&AU!s@Ce +^DGd#iuCler^MO`!&!HDJjI]AhZrm,^k6.;_`K[n]A>e&9F2)NjH.Y#p-P/*gBA:+oMYSaDg5' +RN"ECX-T![rG'*.Ml3o+LQ5-Ce'"XX+$INRFLFf5;o)LhIW0&_SC\:6'17]A1nM2CBP]A,\l6$7-JX9)muU>.W).2YENR2.F3qt[X3VK6]Aa5`U +8aBIF%sY:E\lf(29a'+]AZ$9fAZ+!p23R7HqI"mh>QVEnd=(rLI%-e_RAep +E8VN@-Oe4NXRb%;p!CFmc:.&a0/it/`!OY0JPIk`]AYR]A\Y@/s>o1,\UM[kTG1lZ^^%umt5;s +)\#!m6UqGBXjct>WoHdnrCSgmf#l!H\Ig;hiEH?GM(tf#R3glPkIXOSP2ncJoIW)s]APEb9"> +/>e'Ed`l#7I%NhDX]A)!l_ju[W%4co2i\sO8,(/\go6E\[tP;NSf48&62JN]A,asPW6^UdWj`Hem +Q;;.XBbgt`+E1hQEOa;KD)QT!f0tDtQW4q]A]AqpXu?A+s5fuQ,m9 +FUka>54WZ)>qnSqeWT'te:<40NjSq?i59`?\^;ibq>#QD#Zaa2s38@H0`\oOAas& +e5rMm5Aia>ND+&YkL9j7)p%63Ks3)QBdSX(WWIpq\]Am_Cn@0X[r% +Q,dTE3#^"#sd`5KVj<5c+Tf>%gM+^^KjiP'R?Ttue@B;hj,6kt^'Bi[r*-gc,u`pK:qKT+'5 +bDV:qg#G9&1@K]Aq)]AC>+0jlc0&0%kB,'#EB!k'm7q!7VqmnTHVKVHu>ZPe[$:hA&8--4Y7:X +LW$MGXf_ml2't]AMV1`G#DZpEYr+'>TGDIn,/1iiK#8B#I2E`*!Wft%0oQU<\BM@c>fiEq/09 +QKpgd0Of[$:c%.R]AqLFrg3R,P"aumKK/NW+om=.V[1a19MBE"6)pk)Y9P`qXu=I]Ae/_j)&$< +hC&8-tJ3>HRWUcrpm*aO^Qea3>_h^Ckm`t!B0\6)`Cq-Cl0RlPVLUus6Y_hjYda9',ASaWW>h[l.JU3]AAKS:0/&r5[)uPDANq60ksL^ +XViuA[Z3Kdqb6<<;=XZ;\,hdEO?BFrF6lths:I\=ZhJ=Q&$,sMjos9UcB,4$53kN#`(VbB.< +2.%,6%k44mEiA'<.C>^aFokB<4P'XV:E]Aq/AB]A9G?B[.$H`_9po0eC3q7haC0TCOINhS5J#? +L3LGu:TVM'LE3X!3]AE#Q==lfY2&!fCAA/L%1,tg(L/e/K7a3r$#b6BiZ%t%5Mup_r'.71HFAHSVJ<[OB#J0%i[U;c2 +FKH4*dN'4,5VVPE`2L\lajg0OU,4R]AQ['u-1+>11SnT +=Y7b@8-]Alo+d1u$>H?\>"[D.Z3gei!+1?%<+]Ae<7kPj*%"tV2KIjK'%3TE.n5@@l4 +R"hSif[@e@@*je/&9ch(_ks-D$l(TcXn%XNo)#nY;:&`R@l5Iid!Qu!_/tZ$jCkfD+<(=(&E +eLaW-8fj.FCGklK]A:V158$[;!UgN@D9848P",Va2=#Q'ru6u@lggUe@(SkZiT9[Q>sm&cZR0\@>)E=U(_@HWeIFKb="3(_m7CZkSK=f_Kf1:>3HX7U4UZIc5NY%HI---g0*diS4_AEl1>@jtb"Vq$HXGju5]APNWBT^J +Zkjqj(t3k%XQF\Gb[^cI5or6P0(G.6_UfL),=72cm_D%Ajf%3Vd^h:k5.d +YeMZ7MQ)E&3d!>Gl$/;GO`YmQtIDhmSrp#;Z_!$&Is"4aGJ%bmm)$L)+N8:r9kGoUm5A`sa. +joBR2P%.''/1[e/\cIi]A^k&"4$okA,*D%53>^'B$J%aN?..-]A4(+dMR)MDYr+m +28\KQ>h2.+F(lmR0_a@!V@)J=-QUq;?#$H-`+i7H,+=r[26bZAS*AsG/sJ7@G5#''YQ;X$YU ++-jOQ%c2!0OS9MUF9X9?D\%sDr62Ua3U;U6RI*b70Uhn)qk"%(7$fVT +M=dSP!:YV'h&Wpkh1G@W_I4&951)7CU;/'jQFRE.66RR7j.tM3fm\gC:MWMiL(c/j@Ufdn&Y +!sdFO)UKpP+nKh4Ki&M@u(Rt]A6&H?,`Z/t+3A_YQ<#1'PkRi.2Iq3CZTseckB/eDug/rTMIC +Mc+pY6n%A-7'TtHPMOs2Lr2\EZKFY()prno*^_=La>$jO4UtF`iY8MR7s9-45ln<%e[7/Hq5 +;o=0Y"+M:q +qcu63_]A8[YOO\Si/`7r!2j?q"`DTPHIN/;ei!/fS`8t +=_BJ=k&aKJ9PgiI$uuV6/8f'!N<-:n`HV7J2)1A<&Gjm[AF+/q. +X$*JLqF6;SDs+,j4&lMBbnu#^E1CZrai,3DtqFKSp=rm3'Uke@?.<4.5rnPP*@ +u3-_,iTF\0[YfB;C1M=rf,Jm@d!k,`BK9'"da%CkEPM*[SAU$5CC%)R'EgVJ`-PH<)_!5V*m +\W=oVP"7cJKVZ3e?Xb/A(GY\0P3O4"[,Mr7hT?tsl<7utXuXtfIEqn.2_$5.MFk82M+29?R/ +Yh:t*'$+>c+udkSI18D@N=&PFR`Vb69@/Phc\9@hQGYb]A%rh["C4!R1>G@S1KSC+%X3lNCUPKR +S7HnMc%G1C28C>%65Ub2lT;c0<_t_rLec]AF[!0omQDKcfsT7d`6eG!JsI04m_`ZDLKH9L2?1 +4W3t[[/9*LP0Ih\[sMbEV9LS1$hN`AnSl2rcBb%kGR)?Qc9J.olhU5oJ[GR\FXC*eYs+u(ro +-fW9&BFNFn'VKUnlda3pm_0F?%%Sj2+;dCh'VDuOAB!MO:pD^C(o@GY-_J53(h%=V\=I#0m9 +./\$C/qs1KF8;kK/[Y',C?[/V5A?ek$[AumLL)PkDdu`I]AFT-QJCX+`j!WcNN'?eR]A^sHaE* +Dih$?*&q.IK-G!Qr*iVroq3(Ya+&r4i*s;r2$@T,_a"'502dEIPLq?j_HpSda%mqA.7Q(`co +Z.b^0Fd,8VDXf#E.an-UU#X=JECW=006Gm>'+cat%?o37[G4mD>Q']A?"Wc9SYpEuAU;ir;,a +SU3)L3iISm)6*p^,G1rGj/WA:p,8Pur:An.+H/j,Kmtm<0[WrkO"9nG*/5^8TE +GZr]A-n"OG;CfN_)d-L&=I+R)Kr:RR1c=orUMib_e.^d\M-?R2md6r(204M@%J4ZlfKKWH0CA +urN?i&_tq-A>S@>[b^VCXGiX81;^F_0=XU2PA3,NuOcj5T7nA.)Yg.#$bB3U.;1jFS=e@`Co +F['nK!LJW.dE_R=D_QH[=T?Ri/]AHYcr)JNrG1:9F%I=0Tepu5]A]AoDT +ALo0?<3,$!J"Ikc3 +r6:l+#!=G%Ed]A3C[\WQO'AmUmM7KA)F\.%J0!qgC@%k1;eV_$2no_SdV=.-d:`h/5gu0=_R+ +U_D+:-)(jGT4njna6*>5.Us%lYd1BH*1RZ6eA\Ho2J\J1ddLkb&Bm$*K^@g.pA*(L9:_?Z:O +;?8K8X(mR!"0[K5n-OD4D5.U4as2G:#OlC"*d/emKdr=PIm3@n"Ga`lZ?IYUEU`qs/G*&*hf ++Qt3D=A'krV;=_EMS]AOo#XmIC!c[M.ud=oVe1`af\3"EG;dVY$sI3Fu6gXEP0"8!`qJng"G%J)on!DGGi)Fl6AqBM]AF^Sc,f`cm8F$57,*X)_A*n5D +CCK]ARB@D11#MLn)6GGC8n"*ku$&V-3SKSgK]A7MEk6(A/25!-a=&RSSY*9q9RJL-%p;H^k47J ++G"a-lC[VmmEJ&A]AiL3p9lkpl +YEgI(@qdhS8K<#D[h80[&>Y1t6B>kH[ShEQ3C,SfJ(Dnt$P*<6MpeWHWe(eF7d$hfI0/bbA. +2;Ap5Ud3jR0YjkZ'+CNHV"=(KXGO;I!6,^m(ZAeLSp$$7T3!SUckINt[lJ +8jl5$bDY>bO7S>IP1t`rQVT0-hc%`^XN+%#&@9*7F/Y9-d/Zra(.pD9bJX_,?>WrB&]Af+qN? +l1706L4H\fm-ZZp):[XB0R-OpOQ@Hc^X+Alqj%b8FS-r+I[W+&Q9_K.tMI +1"k;>@#<_YWrPD.HU8$-1#tLRhDaiml2Is5i&/Y&J2Ni?LbJ6j5M(\DH#.m)+YFri>[`3Fn$ +QMaeD>D[%:IYe!0WZ7.;6"/pjK@W3Ks+f:6u,.nZi/'8&G$c1Hb=Lk7YMo4LD'3(f'/]A+Z=F +c]ATLgrSXV%Uq\.8>&W#2khtO'7Y6\C?/?&WF^/I_(bNk3WjhrM)2#>81\'\"B.Ce@PPQ(H?h +OI7"/k?6lr=p&bbo.m-]A!cKG&'Co//]At'*qqWWKf.Bd,*;=4c&X5Up_A9iHheEsBXSjA'=?V +)P"b4"-Col)1[-H']Aq3\loUgSG9i6sb5'9GF]AQ/DA#<.3llAKi7Q:OPr">O+Z*MT.iU0#fBK +U$SVZ&'V) +c8(rHT$Gn1p*qO3A`lo-o!o$03BeAM7D(Y@l;e\(BLCG&%=+C7p;J@@BBu;;=-U\I)JoP[>` +O@W]A77A,Yn#fH0K@=8#FoZG*[(`.3[S41E#0.6WgTh8M`E3CCkWO#9Ii[4sId_cmDBO:JkpJ +1rlS!]Ao\8(0X,bf_PFakC@CYJ:kMu^IbH?q#.oW/jhbF,qL$jcjnLRo(TVXX7&%IY9Z_/?1k +:bohE3AiQsoITAt?LS+4A"P/93F*3]AIs0u?Lk&S;@nCoiBD`YiZ%C-f_9nnQT^[`\B;`K5d8 +q9H+AbmICF#d#gb;2g^U$Cc<^/$T%u3L0dsWo)c"JTaiUma3Fu?/UHhXaNLj>3r"TO]A.$%`]A +#pcPlR)gj"^S7=4h=AWU+GMmup'N;XB%O`dR`,m[JdXXOr.X-g?I0;`l(Zs7A1dht$*GBr,a +ZB&<"jUsTd#^TD76fFZ(;p!1e$Y>7D-$.phq_/cg$Ho$LE3>)9;LHFH,p+QqlL^3:CeHoifh +rID3,b`VD\A]ALdq9]Ac9hIJq6d+iF3aF1Q&&5Jj;Oec+lE8 +oA+AtrEP'FY_fm9eR,QX]Ab-TuL71T6+@]A*,dL#gO5MiO4qo +$*H5.<1G!"%,-g2u`"O+[G)0?O5W?L)j9niaF["ps>JV?[i94?$f5R%Uu]AljMhi\o`J[h3;o +JVu2^?TgsgeW4\3(/Y&nCQ&3,Oi2.).rFW6dJajBXZ6(Z5qIH5m-OZML<_$mo*=7`))er+!Y +rLVYWRMqdMU3W`R_.E@3"Sib/Xj7,Hu-6r\%bkejg4.0R$e8C40:!['N1Mm,/5BX_[>A5072 +_^Q`g,1%`mU@hJ5&&[a#B5>!]Ao>J5m-*jB]A/5P6Y+0?TM"qF/ot&/:I!+&%F:lI2l!u,NWU0 +YdF)`Hk9T)YXa4Q!0/+WYC7!lN,4?j/g?*[9ORu`&OWrGZPahK5FbRTa/UM-I)jI2:r6g"m` +b(^-P$9PN.mZ1kQb9;_h^Z'VN3`<^hKt66nQik92pnO$&+i6COGW_R@]A/SIZF#lOo(*h+s)s +_Qk'uq"um/W1CRdS+B*!?%71$7qmBaY+gj`_#X7>XRRC?SC"rUPLK9n$gbi8URcF"<<nO2%RQq]A#qVY@1MtpTQfZk/_5.RkoboXgE=:WRGfG+@`ODh8%**-;S&'Uc4fZG1'49T"p +XB6uE"NMm,$;Xq\!.-b9QRD?ChdhLPTrTF7RY.C@rjFmaTI9EVAf:e.Ib!#LX%347h^_8dtk +QKfLfX&0J)-W4_fB'ZtpW215K"'+_]A"!t\u&I08R:=Hr)B(%A$Q_-C;(igp[Aa@K!RS9&P2'[+5jtPH&K +\Gr=@N[[X6Sk3`-%;@[&*uuq#&enR[V9*.,=UBXIam]AeG7>C_M_YF&Z25(=#SrK8p.HI>cF[ +:r%>!J80d_>FUX/fYI[?%Pd`\Tk^WJ0A_L_l>P&VV&#IF.)F)/PAJiK/ +n=28pUthQOc1W_`ehoLNsGIqcBMn\5/M!>9j<.)WbSr6,CUllE<@Ga&+ns/-&FKKI*X4kX5e.m%5U5'4<2-\R,0>2)&H*$Mek'eo\$4[3 +'EJqGudKToEV9VMYK8]A$jJr:u5!P3Gsmh$)G/7m32/-NcE1Dd2:((3;^tXdd8++[pNH/UgLf +."3@gI*O+*>:j^+Rr#IXgZLd!L#HP!KAafCrCgh&B%TB(%mY'HgAG&72,;,Fo3Nh-.idsN*tAhRNah_49*sLeiI-_ +KTH?0l!C\rJSiRCAi\k9Mj6Wr92NBpG+oRDZg;eA3:*"i!X_VZ>" +m9gI9Qt_5EBD%0#/WGl0iI#oU$!!6kN\_#Z'eXLN5'OOEJ;2g5]Ag6qlc8lAn_J-QTj2=45+$ +ESh$*4O-cI?tE]A,]AlC`U1E9+"3HG)taW,-Ebq7tN54p&p;ZnY]AOHr8BK1p)C4G#&jG8+?_?) ++M2I8M(UHK`Ylq#Q4PC6HXtH,h>:;g6+$Tr`'9;?rfX?0\jiRSiG<9`9/\a_8q58rQNB=[O! +AFdna6=]A"r=mB@/pQ:QAt2A%91=K,jnm/#:!:C=4Tq_G?79u#6!\'S7&"\8enUXi!i`'qP=c +Olj9;h2pkMVBkld[V=b#[%4DE)N$o"foHN;sa"+EJ=O0Gb.$Go[:YP82_S(4i3h@D!(<9$i/ +&ao8<"&W6hQ]A?/(Dh!QE=4PgQ\44+UiVkpS>$Rn&lZ"bV%CL`%?0Kr.0a"R^DPWY2Q=.KXe\ +1X=%p+Ks+.=m_QY3I[+^D,GE_%Re,t3Ohrsg(#HF[?&Wi<"TSTCPrddl%Brd69CFb/)V&.kA +PV=OLfjtKm@-V_\RT$_J>ms3-0r0@)3#$e4'OK\a=YrbS\/5X31[;.99b]A:^]A0=#cc$3rZ$k +`L'Vh_9E!*?ppjS&O62Jn+%0;5kuDVF\cbXA5TRbXWV.X'LJ#"(bHV"W6f6B$KEeu1/H`.+J +I\:(Sp0arY0;a`rf86+GgrnN%^j!BG^+DC4:$N>.d0PoM"S&fq;YXm@28u0fLgfs20`!?>H+nXi@+n#jeM38-/p'J)nbD6Pb_rLlgI?A`r:It +WA2T"*,^]A3TN4"U/3N3F9#l]A+b2:cDp"NC*,u +ntpq:n!=lFi::1IZ(6Alrll([C*'@;%cIM715#<&d;[873)jWQoo=?4(;6-H]A!pI,MftH/6k +2Kapl,b=&Vbdmp0ee%qh^A7`*QnG*]A40ufC]A[dIFb$WWgUYV85T:23D[-I.:428U6F>AJ$`A_%NiD@plYY/=867L2s%hBno15GO2H,1"/ +c#JN^.54UPG9=Gr(Iq,S-!d=4WD!.K`s,W__""oJZ9p^G2gk""i#[t7,-[GKXIa)7I%^To2e +Aa!9\$.qH/UMgNpu3;[kcSV/6,TALF(pVmo]A`Cdc3fX-WADpe6qnOPREnA)"+msWGjSjUc? +'p`B?TqnUKfMj^(mY[gkGkYmMh&4Z&d&7asKFn`Yj-\=B,ZU<^oS"i,dPD$CpG3E7IGE$DXf +,Xi4UjQNhcN-8C+K"IOjJn$L)P:!#_C[8]A&CpYo5c<%!;/+8#2ErD[RJ5L$^JmgU +YXQBNaSYs8$i+(E)&43:3n>-beIFrTHca"LGbW)51Go1qpNFSG:7ZG[*k%f:4g')N16BT+m+ +HF0ITC"ghE]A:H.6'JF+1H[-W@HC%!ZjA/PYG$&!.]A,Wu>VYP*o,F +d52fA=^,PcKSI'Zl+6&\;>GpeMk=juQSuQ`Jqh1C(-.0[^nUQN"nX0:!41usB((m]Aa$[o0:i +@dG;B:3@4^`W1N*c9Ll"oHMo/IVKeK;Lu\#jaO%)Nm-k*_Qj>OoSur%gLF>cs5Ui3CP9`/nH +!&LpIVDqOUW&d+3P:8'AhG+P!+1-o=7^+RAVBkY"eD:^f=!ak<:`-^Bj*gul]Ar +jC]Acd@u2Y-$`0m4[0C(lN)mEH?B/0KtK)(_3`]AN&n8o[[0M==+Pun(D'-&F(gkVtaNbPiJc@ +q#1:PZ&W-;Gd-qjEQ<"1!qD3KK@/#k$R[K_1u7oBl#oi*ijXCm7IMd3aI^`'3-:MYC4ufB?_[dPd.f:T.ne)u?qr^*err%j4[4;@\r;5p2( +Zf-)eEL7&_FN$s&J(o&(5"C4o$:G'DUb(em]A5#J@I`=j;:'[O4_r9H_(Md*fndH)V,VIW?Bi +a70%G-G2_-21sKVo`^ZI%5D-hl%25/$U87_;HY[MML#=UAh7R>9_$uLnfrP5T\%2Ol"MlI:. +]A0h9Q5baL[)";#N*1kfLmNEcP[9P^pK3X>AF[AuuL]A+fKcP!d$W_D#1!m:"2I;i>ZhH1sI5R7M!lJdaYL^TASI\q(h&9]A +F't+%Mji<,Usuhj=ORSK=@eUBH\&G$mg3ap"2&6SM?'"F#_W]AB4o!5Kr7Q3A=Kunm4)b*4lH +<+>U9gU#U:DVFM>K'L>+?V1H>#cJ9.tBbJ@;8%]AG^N?11u(5?7p#l9\)]Aeh=^ek[[L-Ih&L4 +$Yii0b$GU3G4YGao+&"d1aEg[ooE)2c+mKJRk15aYI*06,@fSZF=7>[6S9`<^\-T1K?ruRY< +V0_$k8I0/qtHVrXrpc8W.u.oc\OB>gNU>N!R`0>'N:XSYQ0;"JRA!"4Zsc\"D!r5s7E7^o%R +&$W&LJH#Jli2''`.s%V\KrsCd4\0dXthBr?"$.;+3V"Z'(2\\VLOFZt0<4Wc0#`(qYd\QVH& +5\=-Uj#7rJFp!B65>au5`19-S*0hBIdVX#Me.'EAg]ABUc>Vm9YNk3+NDPn#^bkFdA'P.En^eWN[A=?F +-Pq%Mk[gB:_02]A/0a2tqSa.KiMFYNHkOZk8VCQf$9OVjlc3<1,eW\CGW[=hVGJIUS]AU9JYUVMlB)OItdW0R(*mOqS5lfkECc2*$;8M"*S&P5A3m>a268]AYp,-L@I'ngntP$gntt_(? +kZ.]Ap]ApL,Yc-IXd\JUfF(N6J/e)b%d61h.eJ,'qLk4kF)&dJrHhdIV"+K7UGq/Y#_PIAsW36 +`3(!6a\JcECTB8JCc26"0AKu4.Q_GsW;hHQPungBgiaKLk0)k22ci.Xhib#4MK#c@).5$=/I +1bQh#.<<6]AG629K3V>G$_\""n+3^8i4m5hKMgL$C&RIS[t>=Raa1pumBinMD[m\j^`.3`sBZ3f(3V`$\)L1tkIg$:C,j +,[J(eI(OV=H1c'RL[nhe/^ZNZ8ADqK_er>/GF'Lc?2[t;<_Qobk9saAuJ`ZF=&o$TeUsZdN' +&CnuRkE67!H7@OquYIeO_7IQtU76'p/ing@BM;1_g#psilPl8ejl7'&pQL0O*aa('U96m02* +p3&isW3tl87;0/7gf:2i2Xc:=D8Ba"Ira\I]A#I9/QNuFU#JR\2YoWMQ3oVDC&&)(h,.\U5`: +64+'*9h4rhGD99:tU!FQO56j_2e2'bo*nT`i^0(C>ZKA@,X?c*"GP!a66To]AGn43=_,bh/6r +gp>Ud-cT_&Cop7nA(s-bt)]A+B +(32i.hU\1P@(%bN;uu9J^%\DF08mBNQ##hc23oe'V<%%\Eo.*VMUA8@JRPS=)6K.Zf!oXE=U +]AhQ`et/Kmq^X8diT&TG-,kI80W3_@TYXR#&^!*4FaKgK3A?bf;&?cE[Iq'W94:1g\\i0tRs^ +2KL19suCY-(J.`@T0EM7qChM3mS,paEUlTJ"B(M;or;V27/^P+&dri0pXQt'=:UN$IWV%S[S +LU,J]AMml[["XH[iZhr"@bB3TOD[UcrnKOZ28)PM->KMWnA4(Ne@=c0G$Vb.;&ci7+=?.dGnK +f%9rXX6G8Gk/GfF/k*$,*j^(8!bt+:+e3l%:EZ8`S7A@Kq,Y,lFQqsQih4NK'm:?YT&/_oOu +HWR$9i]AIDkqJHR,6i]A_*PeXHe@:^\]A/Pa243;5-T;jH`J>$"i2?-(TOSrW*Zj<5X,-iV8hA@ +"ic$TTO32&=R-Y-L;>s[mCq8:&4XeT-OC#9&BesNnOSqq\!CjF:S)9N8`nQtl"cbB3?mKmmO +68UlN.-trpMrj'P@'O-G9*htW_3/:Eu1#5S\6"s>^e#[s,KiF\3.-@7H<"$gL;4;Z[5`O:`: +ZqLQcU-s!@.j,T0gr9s;K]A9Y+N*oTEL>h]AQ:'i`f>-,F(,q$X6h=&uW:3kr^Fr^/;tE+S\Um[#:#2,Qse[c!`mQ/UY0clE<5cU?kW=hC":n9K2Yu1Q/9.1<( +lJpX,[nr+.mlYc_F1,."4hQSdFD)nJSZ'Xcmqr('3^_ +(4(G0!TrWW=:R/ufADpApGN+-i(mI=#0dC&o'19/RUd"`aJ(8,AM5s6V= +,d%iVcS]A$ij>0m!TS)8Q`3$QigDKuC8iq6rU$<)/="oKHTk!kIun@E'0]A*=(%E__0kOH-F't +'@h6[03jS@'H([6P^0;!emFTU?GFe8e--mV,R+nl/KPV!5J0_-o(MRV?-nUC^"1AXg.-+a)p +"Q/#N%2*LcML&U]AQ)!aL=:`-Wd&"dO#in4sO?Y8g`ls@Hd(&,_lT#R8'N3qh[JBn#XiG$JPs +Rd[B(,"SNX@Gi"*mShA=5+/7>]AuPj6X[W5N#mWl(qT1W^Mn.4#:;6%K,fP +inls_L%q8MkS1jM!&$7o2@Mpk4:TE/oN621=!<\f6S9>f;]AGKn,c-/cMeF85:#(2A&2O$Ip/nLW.+^(#5EtD+/ppeS0TCLh34^CC"hK/(@0\JH7k$9M:W^r-c.^-cl^:MII9\i +8LHb_oFc9lUP)H#@@D=n0*L%L>1tZFJcB#FH6tDoV38IbZ;CcR7s]AsX/1bc+H.I]A0dRD8XiK +n!CKhE)?bTk^L-19#'G)"u38\N0\5%[f=HR,e3B92UD8uBR$Uq#QoMV-FRl_59a[qKej;+fL +_TI!aVWfO%b>2=Z,(qHik,LG`T*gOKB>Mo]AK0'ZbcK2XZ[P`baU,CO>cOanJG,^a!\@@*dq_jMA2!mm8gWd^6, +gA]AU=O-#Lt/U_kdeLE&-;)'.-`LMe//G:SQL@;.35+\dh*^nTXU[m+=o@nK%6V]A37jYOY;?n +CU%@cob/,$;n^Mi2F[F7(CA\FH7o^$7SK?&)H7gS,OsVZ=q^9jg@qqO]Ak-nfVOGV5]AFLS1/\ +Iba0BYd&h$esrQsV0]AaJ&6%tUm4Qin\j[?'^h]A>'?HU"S`'V97!GBQ=]AVp[Yj05* +S[IGj1DP('&N:a4$Zjkc3A&sPXP9k1eO/l<*DV<(NhnSDdb_nJ6Hk1-Bgj:?,S2C]A&W2t*Qj +b43p`&eVMW_Em@uJ7.r=S,3+NUkCVu>aH14lUsC9Y@0>;Oj\_$='Ym)U8?4oD[7D]AesAFo$6 +"E8X'@O\'09pB9@R>]A\f&Hi0:,e(ghL2@aG`qSSbZsYN ++c4j#k0cR.GB7[[#qL]ACLeq1hm.e:QKHN2'`1;#l&)scF%6Zq>7Um\KB?+^6:MZDs4fP_R50 +KO85f:e)`_J:0kj-_scj.I*k^@TiQPU#XbH*# +KQEP&TU1QCLVnAo[npgP'[mp?p]A7,:e?YPO-k?-"ofBn;T@nkpNP>#=jXl;QReG_ao=E +>Xf^G[1]AkJ"V2M]Ae=$^OdF;\]A%;n'B<7cTkB!Dh)EK3M0/pHGKlIL%^$Q@9fX-09N;GNs'"WqNXYsi +&c%s.-UnWQMsqeRU5KaUUPZ>$(+qQ>nK3IiEa6!/B#GVu\YDc=3&g3b,;f:^47e=Cp2pTY?;YAJ:Mh0%*]A[sZc6_= +qgTp_;.UP)c$mjYAN-#7eY\;dR2FfH=bVG#ZN($9C/ +">nXUIam^C%J<4q?$/=j[&YR,>+ogT#3dc>+R2nQiEk6di2*d4R>/'j80Jtj-4??LK;In\Ra +a:<+G:I.gdr4G3ac@c%HfiCmhLL@6+119$cW'G2:dkcL$D7I$BDll9;8S,\U<:Ra/@==f\j(69Uq?aBL>?]A?eJhH^0r$9KCCX* +%1:eaG/J6E0%S,Pg;c_`Il(KJ+,;>IS.cP\JU?#o&8cr0T1$]Apair"p[Pn@*=&egB;0e6(j` +b-S&W'65\\r"Z.g3$8caXM8pHILj$eg7ne(?S.D_.BWCYBORmW+!@1jmf +/eq9M\Ag>tfF60QT%5heK\RaTqJ"Sor$Di&nSn!j%5O4juc]A/O$aJ#;$@^E2*VdRHuFi.p8* +WA]AZfFc=We]A%%TnK1QC4N!fdHpBgfM6LpUMq0^scuP!M0D?C1M(d;nU[b[p&MJ9Z$'V$Rb"W +$foca:$p?OS"NIP\C&ci3YR-,0R7Zi06Ne%DM%/"%cFp:6]Ae;a[Y[,@d0P\Td(\2J4>FIGGo +1%;_bl_!1a/LGu-1sqMF>KeBBU@ +/ja7a,;VUO%Y?L9t).01VG-/E2Tc\L)-4<908lf,bb3K["-a`p7-oIT.]AF`6"@HWbt>T8[Rl +u%o3HW#>[J(FI;lkOO,Do!)_$"?6lu?A_1>PD`f2fciI`3-6HUm80!:E#KCOX<+t)&R]A$!u" +nbPkT0P4E2+s:*'H#K#fDDq'\:#S)InUTEU"_+/DX4g6Trc!5L3jEZJN_rT8f4"2[nuePY5V +LVlDP4O^#:4ZY]ATrT_;;4U5I0s/IPE9H@;Z5&9^^8V5:+M0eK"Uk@Gu947o>MoX3FcLkOCN( +OQL:_6t$Pfp=X4Vc3tT-(A#4`=ceGnZfY#?2c)s]A45EMQEq0pPg.9lk^O5VUO%UTDQ`pUprCrn=_*d>=;Y@,Wi" +gU:Rb-Q?BtBh^_4!qQ);fE(J*5e&-Rb6jh14XJ^nF5)qK.!kDGXHT/FJnIQ^\cfQ6kgi6'2J +LmD[j<1p4^RWBN([>;pJ&Ts0mjFaLlBEHt3k'OV$iT-N;COuNNK;:gH5r6\IU,$ekb[Q!EPM +53[MO)*:p@HV)!)>?iVr.%aT,^]ABl$b`WPeU8_TO.E[F#;X9 +'g#SIoRg,TA:f=&UU?,taWMgkh.rA)o4Kc6!;N2J-Y,[:$EQF>("t7fehJ,8%`.uP)jLCa.@ +EB*Ic,4>XV!$?l&hb+IcoHeWpW#67s&VErV.5eY5gU]A/O[.HW=O9&3F +o6H2KHCM-MY;SuTL)!S'8/)PPsd4j##r,t4+mq/aOR6GsNn#kKaDS=!*[8,Pu2Q.'S+]A<*$3K6GXi)'4>OrA2gj/cjtFui:f*Ia,b+dM* +F0$r&T0,a@J\\-R'?_tH"FMaGJaU6qma)qe&L1jg9*Qo;==oXYmYGl0`1"NYl'Q&, +^B2=PlaGkV4$O?LXY/UV6he<8fWhRSPEZMmGmFP`H3Q6[ +dL\&qN&_*G% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2F-M!moU.c-m62O]Adoc\!XL8*9r,7OhBDMt"JqI34%,njPRo"3,X +Am&pt^)mgpLNAE\]AFtcS!Omp<;L%Y.!VLF4\acd*Q#oHhQM(%1O0u3N>lej5*-fNlAa-Ge)ku^01&9qBjAAf!_ +qs$B<"3r4ODb1pH2FZsi=VJj^9oJZ\?h99E,1F>Pi6TqR!gFL!_[2_n.U":&;0TfJ&.hhQ\W +_%6R;rdR9pI5[uR(`"V^gK*52q>!$S2?=d!Pmoi:=?,(`"Hi;@Nn=e"-%q +oFHBUcX(m8M'#(:"D$E,.ML\h(rgkB`1;*(cZJ6B\jlH*l0J-"M9No.DojB3ej,Y/)b\%fZP +*/.X*;u(K(2I->I=/Pce5k/JQ%GA*X(:;A-LC0g-<;UW^P)[:VemsN$k,#r:hH&i\%k-a]AjK +l>eIeZ/U0)pbVk\3j\g%uas&@(4V1lOminm\.[%&thn'64Mk+=U*<^ru!ha?MB^o_JM*rHLh +n(l.-VP?g[:)YJG_KF:D6"M[U&88lk,FqLo<0hl8XICW)TW`"7gO,2*,cD^:#Q9 +(0"6S!9G7*ktG:h:Z!hlQ(f$%`2BR<"1j^!oc\0K,5"P.C4'q\f*M_tn%$R4]AmI6.?5K,o/s +>7bSY!=Nh&5^:ub+atg>^?ilRNpps3Q\0#=0#%hr6r_?8'KP^c6Tm?/+ntR[[lORSdXm1r+oXC:0>a&oS` +u)TXnWS/EenkMM-RL1EFcR&dQ@pnTh+cF6HG^*2=/LbF1R=Am=0-@lM/QgC.#NYilC_+bce? +Bm,1*Tp?uanN3_(@JG/pMd>BVe6#l&7!J(&&t#@=iDN**CFRMnX<%?c[N1mQ'WA[+KGW.I+[ +]A::W'@+!Z,/BMZ_Sjp@TXq1debi_2G#$K19:+L7PMnAg]A5:9A9=Ws3`>gQjB'6tfE)-cjSJ2sP,H^8-junfX)9aZQ7=JL/g"BNJCfW6NBNo0E#aca%muQ5]AK%g.]A_Pp% +,a.TQ"Pob?A*mhf_ki)hr=Q%4Rm_AoKBYgq.pfqF.HZKrP,'[*1-2CmIIE`;]A@b_=&a9aX'V)3_\V# +]AGHlJ\ZfB!T%NC3t'i8G8=]AP(p4591)'>%-&+a42=%'jG"X(&*jrh!53&o^1ee[,*GCj)c@/4MZkgXm>Ah5"1["Bq(qTCSHFQm*He`q +['o[kA'Db*prbI@BgRLTDYpMtNaWqSl2"dJV1Cu2kb%bf +B%cV=E7`q2^K0mOM?]A_.4P\>/j9&<#$$q$CSi&KQ/W_l:7AUAZ*b7jlh#g[B@7-faT<2Y7rcVP]AGa8f`)@8D,eZKOgPo897BJL?"P]AM&ie[c/,oRnbYh3Vg$lk!ge7CZAJG$qqhUq.mM&SJ +NS=ZO@)EpVY4=+WiSlkWW,c_o2HVLL]A$ge-(Q)o,E^@iZ+:]AMs4N_\6iH"[gJ33]AC;JPaE1Y +n^VY)fKd5AS_:$;U\G%5#L`&2?MW^9irl.[o8OnnSSmgstiU%\tTkTeQf3m64^?)!bdW(Ee( +c.UljLo.K_B&tcm1c-:k?>E[>>Y)&)iJHISaKEgGqr/8&\;M.dKMh[soh@ME/@H([WX&]Ah@^ +eA[EfUa4$fdtZ-EWJbJ*fJurTQ,Fi!'tnR[3(uNgTQ/1Q^RmcNW1tVmh5A)gDNcU3PW8gYp_ +MG8VM[LuY-uPlsrP$"[CY^/>;ZbD?1c06n57KM(X%@;*DISdo5>8on_1"-g +9t[at=5*.IfGf3jlmL.5;a16a>^VKDJ)8"F%I=4b&?2".-Qe*PqDjV")&rQ5\E>"2u_J'WDt +SAf6W[SQeL?IXi@]AgtL/qTQgSfEa_n1l>W.1^O?FTZ5:7+3[$%^d_J=6[01e(M.<8jk/8>d4 +T&/WJoq)r%if+UO["PInV> +=mXIscUUKX9>eN

1733!%Ys9+)EV+fT0[IbP9[;9/m",daR,p, +)iZ5-&ZD,XiYJ`$`&8NirI?p*h(-*MhK1sY0^]A54Wk^RB0Oo*F31QK]A`2`2p_uMU4d+2%53c)%PJ5 +"leop9-%N#<_uA.c\k;BJU$bGE$h#^R@,m9O=K4ErEk1cSYnI>3:*ATXqROq%F)&lp_3/FE8 +8%^g>(]A,oeOs+h5fX)H&FdZ+7mC.1:(1E^J,>1]Ac[6Wtc-?Srk5b\\0$;-d.e5GA#8S*lUYRN`3HjMVG>^UgGT:hXm,-e.H&oI&K8Vb'jiG +1n(UQC0<[`%$i-X$Z07$20cTah%%JC3QmJZ\W7[(Xt,g?QmqeLS9Mt7HI'\]A9\n?^,tT6m\s +*7*[&'7%tQqfc_=F_klCQfpS^Z(bONqmu;MSed!q5ngO^pJGKVZ!;q\(aKL>A[#3&#G!29=? +!KSmfKA.b/]A;n#Vl)oB$>Egb%i\qmjsG^)WFJ<.C[WT+$XQ):h4/bq%b'p`rJo`m;&[q +>8F1Ej$%FT>nAt\>kVms=L_H-a"N0[nq@/.3+QhlJfn]A$As$dH/fTR`+$jFYZ3\L'E?%*Ali +5u1Q`="$UNqX]A6s\C.gK,mgOQeBNMLA=Y@NMS/B:fLoTiT:2:WkWQc1)$5,ijcP:U&3iSX=c +(I%Ok#FLG9"Xa)??OQ%f\@3%A06>P%n1(/[J]A@AY?l7&5j8+c?dTYDbco+6_M`b@56Xc:_i0 +I+63mN2:+2%Z$\SJ`NY9OO5,1TEaKlbc/:dgae,'2AEr(,X?nSc<"F]Aa#WM+"Z)+=l@XDL*F +]AInf4;ZJceT3YQRp(&iXFLO71.%m&!fB*$X(t)Hgq3cQGWJuIAJf_E<#G7bdp_#lUOR\k'Sh +X&5-Pq(M7n8;jaoa$gOhAZ%[aAJ8@uBQO7cQ`i(.GV36inA9F!%'OGlK9:I(s;r2@F>8Mdqj +H;K(is3\R/2PsipVh8(4^hkj0JfsTV^%;68OU:#ZV#VXK^[)rl4G[[mo7).Ql\_rt[c2">^C +7T"(dmN830`a$f":&nB]AW`Q'm2Iq<,g6ElE.!$gqn4A1Gm"!KAE-V%3_K@>P]ADC$(g7SatX" ++$4H\5oHGl"!cGW>]A?LT0$FfK]AYVOC=f%?(GhkgFS`H=Z^,;_imQR##G'aQ@A]A_Hi/PYoN`% +\V]Aieq)Nk1,]A$besj>K@6V[[YY*_k+Oo6ZDcpA0+fobUnH$V\.$:X>?/"h6N$iLf9[80Us&= +e,IG(Y&/:/M$'`_hZe8ec^/,5o"J'S6gHH4FH\@9MZ5``%3Y*'1Z[To>bSWP^chV?@YD0iJ> +8[0[ljTEGqhWroA"Gg]AcUklsK%O(kQI*R4V.F5?JKU<[NmG5jn,YQI:!8oV\PY'[D]A +0eS#RP+27`0g(>CUOe1u:+2i>'g@J!J"!Mp\DkI7>l?4;AZ+_O`T@p0UHpkV-CkDL]A]A1fP^1 +%&APj^56lem#1gWps-in6T2f%hgbZ9*"\?^qUf@'CB,Js"9;$&1^6mpQKtdCCC]A$4,TV2;G9 +\RX_>9)SYf*_akq5c4'hT$!&lSOjj3S@ZWO$!DBh__as9%L'F%:e/eFEtX;q(#A*Gi)^Gh^o +d"O'U`.=_@%*ATc+HfEm:AiuXF`qTU[`[rRQYD6jUgD!f7f73Mh(S2!O6nMF&?$Mo\q,*P1f ++]AN\hAnhrd6c"S(b18S>:@T!(BLT\,`>0"nk:rDHCnD)N9VBpQhnqkX7GY72F_sN:SYa9pA_B>Q?KkluK>%QH +ihp_L_GI"4'=>j3g"Rg>t$83pM/+T@]AVY`jNW"U31qQHAMbF&C:F1\1qSt1k/.!69BrGP"E4 +.L-9$6hfNX\(e)L=V![3..Rj!5>2Db:^CmlJTHKYTQ0O^eS_=ihlt5&"8h-iWBHWB9$CNef: +22Q9MY7]A)icTVR(n2kGr_:Z%5J4V[pqA)p`2l)4"_$i..%cc>\>rI_Y6jc;/#VH6"F7'*$$E +@QpN(_0]AU3t*3LqUI?=q2[!EAO"&L043,-GlE^GNQk'%a^7'ZAmqBE;=IDL?.^<:KKMZf/pF +L'U>PDe12#8@ipWNhUDH$.o1qnAD.#Pi7[9*$OUd\ctf:s$-dKSrD)cWR:U:X;$S)&OCOcP, +\AD_;[<'BH[+6c":QM-U/!na5(g"C`+t\0A,HANUg^7LrEagVV7gl?PE6mFHl?uTKP\p)M[e98oJ.BC$24ad^ViFlY% +3ct[1Yn;iEoZVLm&ad@em?,*^VeXRf!bQl#*hp@a7CiF]A`F_[rR]AA8gScu#Y8ETW%@qRB4#Z +7g^'0q+Z7V[H)S6TN'!HPo'=@iMh\rfVn)-85g^^f8Yu*u[LD&!,-Y?V)gaCk3-^ddGOGf%[ +f[Ji/rs2PdkWeiVCh#G*>$`ko[/n&'M3'6'c,O\7Y(?_[&!)Req<>#OK]A4Y +si)4:HkT[gO(TYjUY"'D:h<`%\3Y"+Drbdn1%SJF?7'%)5<@R#0,'mH-O9XiE91kiVeQ#6e` +0`)[X\Og_#*_O[IDOk"@QjLN(WPMAP68uUZ.c@$d*"d8rMGYPsb(V-@!A5l=DSmEm!CL$mI* +"(^j8U_:FPE+;51IXR$oDX\n5s;<;ZLIUeZVnHI9&,3O4D+\-lT^cY/IEc2B>?T3%@`Q!UoE +EcG:?ha$do@PV,@?4p6DFRTN1QVI;P9,F@M6`(ouIqG.,.m8ph%^C"mM=6F\hVU7tMf^!TKm +,(jY'RolOj^.V$i,1N!7[-oL/mJ[u&oW7NnpI?(&$KiHUPt4kkO2=*R`n6)^OV;Y9I +u@C`_W5oRGl>UgfEE]AJWS?Oa;RA/2`OdK^6m:#L]Al+Z`Y18icnB3hJ-pl +;;'.'(E[H*PHIuot[0_(YJUR@bjj9k-V;-LKT:1;sllroRZaH]A9"T)*A::HI(8-Ei8!U+AkJ +n&C6Wjf"js#'NUcYe=U82;[3(1t[n[EVW[WCMt4f7g:0qZZ_Tk#Cu>^s3\"RlRqm87fukmh9 +L0nGV`XK_$,Q!tT1J)a'a=b@ufph1GDKG0H94#,=AR1rVk7<;lP8%OA`bSk2<"QX-e,CHZXK +hsFHgcHjoVE`o"""6sA9bZ(-M?bs95Q[Bo*96/?R/)SVT^Z8Mk#8@nimir2Aurcj^r)Z^*NUNL!;6Fgg4YPUfPVdRJtKeI$anQ84`F(qjuk#(T +3G888tcM`WYG@eCmPR;_r!gtTA*:.o_5_2r^fTWq;%@8U]A_<(rh!8(4Su +Sefr1e3r"+#7BB8/_Q4>X6Hk9ca;f^L!,/6B:[n72PD@tkY@juYg'c;8aa7rJ9A>0q&%8&Rn +/_3d\/6/(A?==Y:hB\c:#r7pE7s+SJG)mQ.DJ"]Al']AH>lZGB#i5BmF.%R=nL314L>1JCS[)? +HZ10!%gHn&l(kRfG8=qP_$1ff>Q'2l\b+cP9j5kICtb`c=4R'RFqGp1LE57;YMR +UL`EN[;5[OBU6;+TW%3_K1,XaPV! +'hU#-62[ZLaBJ?-4/m5pt/McL;S-.p>4rf%Y'*#1@6'!^,VUWgd(:2L;CMMfQW':n)FP[?Vn.BT\=Sks=Y&K__C,cVZ`BF`!;ULO)H[ +F8NCnu!JiXTbYrG0o(H.8RYS@:Ur_Gu]AU8PSKtWa:sc[((V+:NfkfY`WB8Sj6r3ZcDn.^nHN4:odulmR3/PL[Crb(% +=%\Pu9U^E='BqQ@$_H:]AbQci'r``f^P>_G0g_Nn_>1Dp%NVrX$/^:=o9-+e;qp4tI?a=;i?U +H$2i/2rMm:5]A>&?`6#&^Yi0JV>sAKH'QpO_5PA;0'\-qh=?GU5YL-U38'EEPggT*6m,.g>l\X7hFUEZ3HTeJ8,5qcTEUJ)0Cen +XtV:;0 +iQK3*bEHRTJ"!]A`Z]AX4rB$L/B)qC/]A8db[ +frp$0[g3i#hs#^#NXYJ\EfPHYA##FZ@lHET6)Z6nYVs*l9J!Yo[Q[dh/6R21OXZ_j!G`,uS` +=o^(/rkCo;s6uo0b__oZlONj<1Zm:2$aR:DQ3.>S<9 +_pCq']Aqq[:6U42c:?B4=GUcYNE-?Ur\T[ShU,.3m$%DFQZ,?V.W#Af!b99>1;-*!$84a\DOc +UL'1Be:Q;:3MpesEMM'kgFqCi7erY@+]Auj0bNDJ9"RN0rcJ0AP$[f_<-P5?cnFq-2!VH+j4Z +:?1Vj:Y*^_!2XU+omdK)?PNXhRXHZ6ct"rCoLN-?,MFU_@t*0aD!alN^CW2@kJZMUA`]A<\j_ +e%eU@0RbhtF2HTX5grAcBR\krdIuR-.n,_4nQ6\2%lSQ`SYf?8'+n]AA'eNL.4XF'a@R]Amk=5 +7S6L+YdpUY=h$i"`p4JGF$A-Y;H4cc/>I!W9PUFbdfUiN<1\U]A,oW`C+Q#ebar74dE[pb!&t +B;LX6"-Yn*3H\fN]A4BO?5IZ8d^M<]A#sNL;ZO(n+8_#YWRsr/PUG6,`iq."U^-ZN)P!^3m&PV +m@csC*jZfW9]A3-b`aMW@q\UV8[3=U&+6oec\YrY46Q,"c7G[_gINI9NP-'h6L93$+[[*ucIm +]A!?M%9,C-_u-dj.MYq-/sFl]A>99!Zr!s>ls^OJ`H>f=T\&1Q":Q=nm^LGBImq^scC.QJ\mD. +"9di69@CT"]AU1T14NCWa9;CX?EPJOrf?l\T1>9;)cMWk%?9/gHL=`\`[T2WW%@,V%1=r_i;``*qj6Xsf,5YXB9$IZ5<+/sZaOU +s5Khj?9MENl+8I^C`C)W+m4\mpPESb?uqgX>X+Xn['cs@IXR-<#3`-Lo_`O`u4]A0o*B($N*- +.Ti1E:.AT!p)srNpFErG$OWGGZnL4.HZ)FMcCjsAVu$+@`!4>"`pfm_$aUq-07JsiHG![LPX +%Jh]As"eL"-9e+cS;PIeU_RtZUI<4E!hA0j?i)ZDODLujdXtR#0]A;]A"fZ?CW_"5c&;(GqVTY[Hd35Ts^A&@XQl]Aa-PCl3J2VGmjGNk +P>^4@adjn5DQO/7,)Z6/kc[s+2-`f@SXi`"EA:'rh&10O3DJIrI.NsF)9ctM]A9@)tqYoc?(R +gZ)BkU;$m)AFY#+YH_74gUehrd!%/:>b#,?"u5'>DG6ni'8,Lqu_W=e4AF;QOdYl'3&qdU?c +.$kRjKE45CoA#>6f7k5c2>IW=pVHW_/#%bF,o&pcHb3Ft)!8SSJ$DaCVEJ.:@$3)le5>D6?)S!EdKU'pmh88/9$sj1l8sJ\H7%%96\<1TN%gU.Ce +b(AQ43Rg7HF$J?q(jbul%Ais`03j^$Snb*%@)glWI?6jJ@&!QKbX]AmC<2uGTBU +]AC_jF0s2g\5D8lWb;qF9dUS:U/`PeOOh>;C7/-]ASrf4HqNJUIn_Bhf!kG8X`OVT:GlgGrLNXQWVmkXWfp1+.B?=ZO\cpNg$-L +.D\dP^ApC.""$\(1NO?+JHcSJA6#!9sa!FDPW3lWg4ZMh6[;'0VcN6m*?>^`[D!0AQajC'@hR0'n7$ESS'Q]AcKB-W0B_rqh467nbJX,b$b +$I<$2X:JWk>>iQo.bX4mA,Eh2Zb!Io(mD3UBj!RTG[Kk\"H+TB'tQg5LV8L?A9]AU?=(6SZZ47CBS:97';ZReL>8HUJj,+)^ +k>ohpIKP0b#c[&?@IgJAG0o2Cc>#C +r0aeXV8._`!se693O#\UKtgUHn8FjuN=+-aV^]AhX8\9J3tO:i>ES5RWK]A,U/q\Hd?PodKEoP +Fj5CFDJa3c:ibi[pDO:sT>.\>Io6-(2G[->m9;l3,3Q7d,) +>e0cVZpn(rs@Y0@83'jHHF]ArlKA$Qhin;-E0E%pT^*Nr>`5R*P3?I]ACOV?&5FjeIQ1qKZI9? +j&.JB^GiZQ-HQc)"d_p@R!Pd@.a]ACXLoTmtoA9;&>RB'*db[8>uh"gJkfX_u[=SF>_oik+cZ +P9O._J*ZOf!Xk!4t*MHF%=h>Cp7YC9F:cNG9u^)(q9\I7Q5U2W]At:RXR)i'RcB*=1[u6J2Z4 +`R`sZSi[UnM]Amjsa[I?dZZ&tH>h##$b*7;Z7mN8M*lDRje0gi7*khTM3>>hj8RDqX(W!e.j= +23hE[_Um(1bMM^aMH,ZFL^AX5:$>^N_Uj\rSYA]Ae/m[%8 +BhMs"aE<`uQ56pbg]Au/>=!T?VV2"NLl):`3VV#N=\S?I+oRN]AjqmL?GSJ"(DU.J45YFfk`0E +3C.)d(hAjD>JS5UgaFSg0Z2ENeC)0+X&d%&"q0S_gp6!%e0'.fp5uJZO*R&2'F,qP^Z:"ObL +/-3)Wu0EhlBXEN,OHjOf4b>r:W_Etn.be6bNhkm&`4GL]A2i`;8RghFpW\R2HHb#r70ZU.)I% +iI9>8AM*[Yb=@8>o%2tL[<4C;L*=gf4CCudK`e%]An0Lc%F58eN)ko%Ig9(Y<9DYI\D_.; +Sb'K-lr;c(:c)kGf,P+RA"t$9U?*5;C/G6SYKH%3(QqpO_TWk<7Ia^hY.E^Fek3klm:&BkJgnml!hTYNp&uC29LMO(sEEV7O*^Htb@H#IeDSA.qW,&MoR<_Ns*+OGlQ +rNlP-ItfF$GE5U/G8BmY0kXP.jst[ca^nKnV[WGe$OnWqj@VRel +O&.8R3'8ETK]A_!!2O3fRl/QN3>q;"g-e+8H]Akta%4nufX4?mOCYH>8HIlVZL+ +UNpQeTJ&g^12P!WP\rGqOJD6@?KNEpF;D>`eD(RAn9`s:?j]AT,F\!9^9[q,UA%8L9[MK)k,(7\*79.fkb_77q2sn]A]AeTBG27rI,CLBC7B(OjT-,TCq$7MI^d,a +3L;J9TpAY;/P/:F8c-4GkMq-F\@NMbhkIl@jc@m^11>U:8[Z&5\HTJ@&C5d'>:\7CRqI\,=29HfA!h>D((%&kuC!=L) +,Pi%H,9Z4?PS7=eoG;:`k:;&/]A_$a_L^J@]Aq58DldtbYWrfne246TaX`l9r1scMr#8jU"DR; +KY[O/E:mAT`Wg+BocA`M41TG>(1eJ=C0&(koM9fE\+fe^6c&(AZXM<%7A!ntZaLEm:_BQN1) +Y/^q6S9^&s_BQ7VW^cZT9M@gT$Ot1'>ibDe)OMlN0$1W.`__hicF9Q7T/L]A\opbJjoN@>:Ft +4)VdMhmH?S-P&%U"Z,GNleF&NQ+DIua"bnH6IseGoch4V(M)1aSSgeR]A[#hR=Z)%;_5o&(L1 +Dck?#*&'I@Gq"i]AGZ$UauZV%#+c5T`piX=)Fo3dj%/6MA7lGa3*c0sdp9mVVAl?]AAn!A$eAW +Q=iBm'n<9VQAS.e`JA5$#3h;ukQ8oEn>0["/@.iLc^CaCd<7`[')\>B!PqI'D@+ujm/IDQsl +@Lc5mj_"E.;RP@aggKI+[Eo5C]AI!U3n7G-PEt*A7@*V5=R7o[j\#r(`jgl^oIX_'\WNuOhR> +KhgDb#%*E7Od3LtB115Et>S@Dn:h)3bWbh631=h3ie:B,T<)2Bgg?hDWuV0N[gJmuiU7o)@n +M,'pj7dJis4lC84jD[@i:0qU$BnSZ6&aol>c8@,7Og1csMAWSAQ52`-nMp(iW%AA%( +k4NbT@mLhN1sHst;0q=P(?!T>6)J;`%a*M*-e9JNmP1YCQGhY0C25RC%ILN[3A2>9)sN=+4T +aF7,&d'>N#-kqOe12=cX&BO4og"/ier"T/s5$[=\+HI+IlOV32^Y)p*]AFH+UGbX*V^C[p>?@ +-Tj*qnn?".,AP3kdm>]AYVYA@"X/@!%;N-1\MMPEQqK-JVi:^n?(.bUUgVDH2\nQpXjD8ag*S +?]A?=CP,s#H0[ek*c>QqZ:1FZ5K?khN:OgNEhlrjq5I`p4:,:);>7t7qr@L,n2jus/:SC&%?F +0g5?Y6e3,I4%,J3?IbdoEo#;0h>:QKjT&_h1RQmDs4hMkje(fQ=I?Mb?!J)S"MtK)0tSg*?& +VTHLd+=b&H`')bgPYkFuN2)XccqNj1K,Xa?GF0Nb_a8g'LJQ/%OC)TfRX&YbfP3osg`1ZHdT +kVkF8po.AA*]A-"[I7mm0gU:Xd.Hfj2@]ADV!f0KT7p79ehUC7?XpKXPrs +=8pOjZnBtgYDqpE%MIWN^?Fb9l6re`8+`ntdEauW(Gfpa&!d,L)B)$S#EN6?[$fUI^BSI5<5 +A\:JrPEj7nl%t#u>.4_je$u_#f*?FTg.qV^3[^]AL+> +Y(,KPOVa6JMd!c/@"J'#Lgs&,;/9%JRlmun7b!*mn"tEk=,NLF(>&pkiD`3U3lluSVG;S$&k +9i]AN1a&V4LmSn&L*6lJjj6TPqT9TR/_[#!s]A!RZ>(1o"B,[)F-I9:QIs3R$e6*i]Ahf.=ddDA +/jl$Un#u$'e)'c&#Y5RmXBdHGo'B3@E9_Bnj<,;dW_K8A]AgH'#LWEeJ`On=&bP)\HFJqeC*l +"K*+HP3dg"\.W.C?YHMi,!iI5o&A7EV@/Y,ZLR!;5pm=19cc/U99h(K-NuWgT28L?MN:L#i, +:He"!76I=X\N2RlfZE2)W)*MA8NmOYHU`^?.kV!X]Ac/G5_"Nsbe;c6ST?lWlcs6M3 +pm[ggqMJ?-S_,99'%d5UK!?2Kf+=u6!peB^'?^I>.=V5n)Z-CcEMR'DBEUtRH2sDiN#9EGZh +q`9^[",qC\C@@f"2K77!:?+q_ZihYLi=P\c(=d2i=f8p>qRA'A9Ql<*p]ASse30kc*f_k]A,j+ +)&eJ4=6.ffe<.d;2JuZ6A02#41-q4C67@bbIWa$;d?_\3SoTn,6c7sW,6oH)&ber!fj_+r%l +,s022ThohT('Ul)LaE:!/B)lsI=/\X:X]AK!cD,P19*OOje?p9[8@HjHo2XfI7G\]AB,t.fi&q +$:tp+m.K?'Lm7?u%TA'NRa)t)/Ch#n':HQ@Mhtr%2([oJcFf8+,m_8X0kY0SFkdfst.m&0*t$Q;R2)F:t3"XE9X*O +\YSIY*ob>9DPS%\g%sQSscO*HsKeF4O=Ip/mPg&6\BZYAXo7Ah[X4hT`5"'Nh",7Ugjto^70 +)rl:c(r"P'E")iPSh^*G!QmYa<$Y"6d!o:$PqPm8iNiE>2F`$WP5YniE^pU+Rn5:"Q`Nm9Hp +b,PDrk"qU+$sE1@+5'7S[8_+WqQHeN*Y$%5EBaA04_HLM7Xr\rhY3r* +"da5,Wu+$0Y]AjIr_JiAQ7OQARs5(`KlNMIR:[Scq:-R`!/K8+"Lk?n8XC"halU;?qT:@[4V8 +hhuQJGG_M*j("pp)\lJ9n':-KUQ]A3?&(Z,04^2H0b]AEKhSu3>.:__O]AK/Mm]A?:'TCSN<60,s +,o!U)1P]Au'&j>ViqG8CUl'"tJ"0S0%/_R[&THT\ekb]AF:T=8q=8r9!#(#WA'NiL)&pXiB_h7 +aY3V[b +k3eF5p9pi\GIdG-^K!b6A\=M$dc7S;pLqalTT9Tbg`F3ciq_Yc.e_Y(Z1W^8Z$XBtdd!j0gK +jS-E&dhem1C]Ai'YZj\3MTCt*M!Q9qR45QTL?D1?1%p9tPJT1AZ+df;_pHaT$?^=83(iSfEN;']Aj=uGdHYbj +Nh*O67.Rh(.iT0Yd`c:1m-A-8*af!L*Ul&=dZr5lb7EXHaHIlZ57=m'oU7I1in0ShgM^e]AVV8$ll7X*9190ARn5, +@W5Q&X96h@Q*]AM\e.nQo4o4,_e_>L]A7m[N+O? +;.oA@U5\[NS<1_Ni1c:qpc.K1X[ARB_NC,J')d),\g%YL%\4g'CI`JSssW<[iT+1>MA`/SEPbl9+7Z7AIH$Cp1/Ap[hY&R +m[K2SB!OL;.iGEpS1E:^I!&,L?&dS=.CNgkBV",pSSXn1""LBe:=ZrLo1#!_fK=D$I82-Fh. +"YN#G3+HW(Sk?cDOjT2P6'0OpN_Mpe1rj7Ue/*0^9rhlo_JWi^/WYX=XsHX-NoF?fsabl2e' +F^.XAre3_1^gcoCM"PtDa*=!aQCP[g4sY48J,(RtlrfLFU$jOklsJ2WjOi\f961K9$&eccG_ +rIe[3+kDA[j:"cjs^Xe!Vlc[\\&Yf!!:O/sqV]A+%GP>8KF^g*;erS6_]A3i1AZ.n2kC`2[:RJ +bl=B3TD6G$:]AJ+79Se4F"f8k.NqbtS?-1n&sT8-nIRE%g9157t;f%^51H5[12?;bl+pQ/%'O +gJ/8V)g&hr[BX^$2-'1<0]ANWKkH8Jq!5:C]A*,a6d +%.SIish'ZB?4q[=t8LV,o:>tpitBDK&Wb%W7,3qgG.P*F+8WrBqJ?k9\Q7gFmqo:;Ll!t(q"tHG\@$ +\*U3Zf0^trnmh$o+bQWjao^2rr"`q[2HVZU[0P>c2&A,ESd'hGI$EULQ:PHeUk3F2??`qX'Q +k"QWP1^l2"m^*NKcnj&YTB2kV7KEoOX!E,VLEj:7D.)T2mC*:RdgQ2aUl19^f9%T^*j[:kBSh&\2$bcU.(A>^MR``@piT72APT1th\>n +d0IXk@p#b+[F0?Q5?H[MfuH6ZWaE5Hf"b6rl7]Ar%AA&&_iuU/";g4`J)>`_IQbBA(PUqoIcQ +T2>'d5M9TpKOcdV*/!8Sj6*#P%iZ1#_Clfn`J#r['iUE%GNKEHt\jG&[c-;paIE5I"VGV8>j +3[dLfr1_ep)C&EK$L,Q-fJr@]Aa`'Pi.0kN.!c+oH3KEaP%PP@h4dF9,STjF<2qi((PhYiJbr +.hrp13A`*8ZNcuYqic1Cq%_aQq>1@/=87$E+@;[!7Zf?oNpd6(r7aAHkSSS;?aVss2uE.3^7 +63]Aamfq_1"5lISJoU(:TPoltBbaZaho:)Wjsd4nYQO:J_W'>Ao`?-.+]AR4S*-K?[-AhT.,Eq4$D]APk`PTe +/X4S(\C&5*MqZ6d`aK%rF)h65j;Q^9#fq:0]AK_"+?HAXCVHM#n?oHemKV>Hd*XYd\QOgceA;K=94E>%NW^oobf-`3SR55@Jdp,i0Q?d!*Y +Dh&`W;%duV*=tBMlUB/;2LeB#s'9/-$;ojic,;FZQ=h_^PE?=]ASARP'n'Y-O'`AjnF6`lt,; +[jJe]A*8^7J#N!ZRV4j$En(+B6"7S?L+10I8'3j@l]AP[reg1(%(E:L;,bPc>isM@Yp-17kr;/ +aC&>1-6(X=MuNW1$HMpWfDRh&auaQ/DDcAR$/_ZlM@nQ3+e,LKNS4aOR6cgPb/2]ABh%V +ttJ3>LNVa#dMN\W!A%Qf1)?IX5YZdZZ"(Sh`=8Qj0\g=5oGS0UbJTmRFGQJEf-YG27t%pIJmm$/@F08UbJ[Ah +`\j%A1B4R.@oZ[jgDPk3aPSaW9Dlh?/keg3R-!_Zb0L:1kH9%*>JI*3'WF%d?Jif%.Optf>S\u;XBr^4,irM;^7f"S,e"pQ:QZlbmG_HY)iT +H$s0QOM.(>:$FNPJLC"VA6g@qhT1_[`)Q9iPTF8GF/^I"@ +&0o$rk^JiJI'h'PGiTYu1)*$r4[W,H5'm=Pi4ka#)SER#O"KSkPN?o^BhK0*)7mt47@[Ce@Q +XX5PT#+T>.#Mj&,;tp)%*;/(cQ=jNK=`?$f$"QK@Y-".kN,T85QiF'telSH%X@!J!K[1.tFm +2,`(Ee5JurbIE*=%_UL[/+fC$D()qUhG2E)o(;AJKKA2fj3DFhQa*LY!H6B4'YK(.EFLCe$! +3mBA+@9cPI3ng26VrE$#?B6SPCMRRH10nJ]A[3=/ZLF8o[lm11@]Am$-:Zl*p7KT_N*]A.uC;hn +HfZKdX21KfrM&l^9*hn2n5p!U8-7-5-n$_&r-,m9@,Y'ht`-u2Gi8P* +0.l]Aj;0(5]A&YrEO]AgDjHin'@/[,,P;rcX#l-1X:n)IU)PcF'$-At`9XagCPQBT9m3$Oi$^ja +M]A/[Bkg_$,4W'=e/!J\D(Pfq92HZ(M9aZhb(R,'Y,TTZmB(j@h^pnj+OoWNkJ3BJoqn%4GhJ +p0k,MZg$5rS:h^;E=NFEJ-H'2/rU[3.]AZ9>^LHY>A6n4ltC@le.m_m"X?SdeC%^bKY#d6rM$ +6nF8qO'r&_>t_^81QHDboT&%!=EqPjCZF2-f[esm"_=Zn"68s[YtHVNj.kc["TS\mci\(FPl3s*ht;O0R^dhL'KA\Y_k4WL +3&_GQ,=?+Q16""G/X7'1WtX*U*j*YZr2*F6!6nFf^4`APame4lu]ATd.[RjG8FKhb2NiedVE^ +8cnOA,/dH1J,N(3daTQ/fFrqG!bkQbqmq^A,..&%.1l(WbGs-1PrKf98*(65VMmDTA8Uj,*S +N3n"]A_)#fseL;3VYd9lAB'pVgG=H4Yb.FSbs$U!ifff/ISm]A'Z9=qX35`6CD'eS5m5;]AV'eh +5fb6&:"(KV!1m$ket%Tq2aChsaj05Q2=lc#W4nUO,_epe506'L0M#+RRG\RHo#I-Q0 +fd*hHEXN$"BdtC`ncFXsWMQ,+"mug0?\[?4.$/=lS6G\=FjV*,5JLLGndcRI#4VqdurU;Y#9 +o,Yn/%'3i,)ePOBSlUS8#nqkJ:EjSGBV@W:G_]AF6ODFS4_1Q0eOndq\1a)q([:n*!LFNr/KF +DLMec5H$E,hP8JAtT6D3LgLBth!d@scb@6pM;=PJHoCob]A2TIs!@mMgMPE-SGe4#pCk;r/mG +a!B268-q>:iF4?MQ\O1I\NfUH=f-DWJ(MWoY)+TV01*EX6UH=8SGX]As5:(TtRbsfX;mM!>jo=s +mjag,*s5-u$#F-rG-;rop/*C.`pQ]A!ojU<ta*06(g;&EV5 +\h.9[Gm=>nF]Adrc'_3-g=3N#rOCllDEDW,Um'g+l&E\n=u>C3pEu,Q##PjgHT)A.;.kU_AI8<[A2(hYY:jFP\`25TXlK1P$&=;CUVg=feX;*O5..&kCejJ5,*0Stmq'scPiNk3-pRnN6tV.U-ND3?qC(3)5';eQtb=NM*,NDVF58[FFt0*#[L`i^D.Iu#o +lk#'SaOdUc3+qLgeb>\F,j!FgZKV74)e>:W"Vp_=1+,`NS$LS=D1R$Ar*Oc/&1^>1UWSd:/,$h?>naSW7Tr7O9]APNQjZY;Wdl,)7%'^UIXi+Z\)Sh$OUrYS8b>f>ZQO]A,^kU2[ +58q]AYilBD4XLU=pH*6$5<>I"r!aO\+@,L4rb>'j?#*Z-8D+FZW6Y<$NM`[$OQ!4'ceDA!U9e +Dtk3>_GT5FE*B[$pV/\KJHJngQ2qWND%56@/S[i[8Y^G=WF.]A);1rh4k'QQBo&27fs,PA*2Y +#\$)'#,*ki\b8O[+f>KXSPZ2WQgm\+K>UMGq[sjO0eKg]AWTE_$<`pG$VdM?4?oFOEV7$A=JY +G<3>_/De^*.aqihdUpX=+C(=A/U- +*Vap1RX@12alu*GW>)>]A65,f"RN>X"mgg@1I2b&[@#3?]A8`f0ciD`IqoQ[+<]AeAkqJeYW%!i +WG`i$M(7-`U(n7Qq5SAFG(4gcMP?MQWgDq+WgZ;B4Ib[g^,DrVEo,c1mj]AYZgF510W0m1W*M +Tn0[mFG_:I9J8&s!eQJ7Q@G1BPZYZ_%.31daR!`gp[NW,'8'kU'$J*8UDqVc&0EogXu^=90Z +ob:qkBDKW:1BV7pr'hn1ANSe7#?nQ72"hg(U5h<9Z_S#bk7>]AcC`cPS75.?Chke"a6'6LDUC +;)-4;DO05*u2)roAcR?W\4)*u?#5S'O,U+aSKa7*[#a!cZrm`Z"0`4`@Ab$#rX-'O!b+V/sL +b1?gNsPaUL0h$/V9>F?2ZQ"Q2n$92d.n6\dbLRZpP8kLI`bi*udb!+f0qj@KLrA/W,!Xld&K +cYk^0"AZ>&YeCqIF#XP6A(u;i8R8R8/G64`J__& +r?"ud6Imb +W)aFiX,qkM&aKAPiNAMW^^taitr+96usLhg41p_Y+=W,G@pKpthgg6Gg#Qb0T_WOYDChl8hjVe)oEOPTGa7T%KS=DS^E$GqDf[A +6Go!5MQYoLP"@JD!`HQmu^`J_o7T>G +"m/1kfGIX%AW$*8'qSlZC9MmD^s7OUkhBBaDo?lEg@aT)&4F"KWZ:D:7H2`!5A\k6q3`W?M- +=581Y_G;9&`=q]Ae?cMM0$SeY;gDEB'I,J:g4Y&-9[>E@rU +2*SZp/0P?io1Bin:S&hc]A)"AQ,9`6M]AB(YU_rANJ%t>;a0B1I ++)_PEO?U\(Hr3br2.`h1bMhcSGKS<9p_[&V2D8Gr:e?S=ALN9PrumeokiiRC0jL=\&6%.:-l +GhZn<0>Q2@S:qg$&5V*ht@SYTZ3MlHAUYFd0)96ItIWog`,)d=$-Q@9e@H$8WYZca+$LjiR& +Q-mpr2^)U?O7o`RZ7r8@;@Q8Fr;9XhL/r9mlkpO +2;muZ`W+)rZXD:l."5#hghoNr++"PN@/DM_VcfpoMGE"!37Ff3uG+a4Nc#8$-G^KRuh6T/dl +*+^90A?;s0<'kshjNRi>1"6hkBanR)n;ZuWk/7C.jP$^hGfYCQQOon%*c8KF`i*Gh/-T^]AhKC.g"jUmDP7Ad,.kBNTo +^A,Kc)ohnbK[)W?W?T#n"PK9Rrps6c&5=XaFHGp6-E(e_YI5Dl+fBF1)/:`t^Z6!]ALnVh'\F +qJ=lSlCGi,=Z@\r$U;2LWbin4U/s_OoeD!GM"&r6.=#B_gYG*3"G+^;["(Ks7eVI3."7,k.n +I>KOBcIEh*kR/GPL%1?r?#245P#3Z=L(nL(-0pH(HQ#@Io+t]Ac4_"4O#7-fA/uYTB%$%!)T'-pX"Rg!CHBOM/I%":"S!kES6G-?GI`(o(]AVV'mAD3/cDcG+0#DL" +#R9b,"j\Oe+;XT]AZ3tX'9lGa-iJY5^;RQ67#SC/.5QBZ["\T^Sgc(U_2SC11"+T_@bi_^'1u +F,g;Zno%eb_$='_"l9DRJ?&`TOCB666JhcRdR6-2b;]A_'BH$.U0=N#M(s]A8\#>R=)U]A\E2Z- +f5'FfImC*j'rF3W2j-Z!pmI@_Bp^G@&O.H8G2&TltkB7E#*#K[>V%$A.dpPYmURo99HYt!kqMaO/Q0WKmK-, +QqOba%:V5!SBreX9?PVihfk2Y'uI#P>PsklE@>XTU`\p^[[@/-9g@$U(37]ASQpg1!H9Q'>$M +fP98E7oKqtt>Y$[%@^Uhr=%p>sV$R.%^<9e]A09XoHj@7)t%n[EW101kXaR)&,Yn+U8%%TZiui8,GI:,@TM(Y=:G'M +!aQZ2Y"F$VK'VkNYu%2!ADXo+Rh*4jr#(L+0qP:5O"VkD"d,2tHKZ"#UuD-6M),bu6ZGqeL)NBp +RF?]Ab+[M.Y.?j8To#G'(rsH#!f("[I7S#RT`A&%mr<@IKIY\EfK..a+'/Jtsh'X!Y.T)NGMZg#AqV4H_@]AX\-DWU[=Jq%,<_o$ +RbKUN8t0R^ZLr$"4]A<-K73i&Hk"2CQ,a.*\+23k>$#Xa6.n"RASJ^@/nc0.`2Ei?FoYV@S73 +8Dpno14T47[>4GAt#^NdUSL"7UcgURe^Q"#p9fumNX?5*1qe*Xh:#f![9!`eFrU/&fc,3?@fnfh;HkK/P9%D3I:u28"=sp'+qG(fHAXp'AFX-+/mN`F +\D=VS4k+S3PmAe@^gI^6H/md`gUqYnh;p@cD20RlO[M>e +TR2rP=P+CKmt2gY*$Qd/mapq&JB(,)S8T1ID.Nh$B7JPONogiTGQe)8]ABHXZ,,8&s?NpU'Pq +5ic4&?%Vdl9mB"BG/iOuJM!I%]A(ghbMLI/?^#5>k4<)7J'^BhnrX6Nac"lq9mnT7?LM&N6s1 +L9RIpH++iRb2fnrXT%^adN6%[)kca>7@Pd&Ruqb4o*GS1AY:iWV\EkNU@,ikH96.%m"jo/W' +,)CU5-mQ#AR(pr75HXhf3kBqAfKTf]AL0[1F +41]AUmN0G5OrBb\H+Q(kX%VmoG]AW!``c+Z +TX,7e/*r<:.>BZf=?QbdgWO=NW./6cB,]Ag9BCWepNuP7ZZ;/pL9"q"VBj\`8SdM5 +0oOd99`CpNVXQJHfpE9]A.hr%C515C=0>-i<8\3F=KI +1]A??.U44B$]A)mQL3eHFF,F>Ni#/3<622'fMQ(!9A?UYMM:WRHE8; +;m.#deflj:"VTfUWJ)?riLFdN4q1XL10nSfQLqQbrE0.eR+dD\]AM;]A" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +L1nZ*#qRjGBXCJipL"*+[Cr"GBZYnEOXq6gnD6c+\7O';hDWn4:/e&^"3)Jc'PbWEb +Z<2h[EIa'! +d%DRH#(Xe7pi`Id&""]A7bY6YYEeAH4(_c*q>]A5_uW%mN8U:8/VcD.j^&+B2r*s6UIJQL!@Zb +;o@bO1AAa@c!hb]A1*]AtG;b^;T9O0Z8@c8bdc8`8DteYQ[T]Ag;rJhhK.\!TLj4)*:+\Q]A/.t1 +L=^,+A)3>EO2?2as,fLHnHbKDc1(^5)FLdlXbC.A2CiPKuQKY+m%5QWSTC+pXoJdqPU*>hId +KamhW4Sum=rqGdZk(,[B_DIE#l8K"NJ]A?/4Hu6cO.oA +YVkg+&/'Cr),O*u%(`5ef/-rJh5I_[Q*->XoW5aoq4trP=s4?u%\<,i>I'5"&$#P&7/Dj6alLM7NXk39X^PN1WS>A/h[P= +b38gZ.)==g3Lo@hlUdJ]A7r-p?'60._mas=Wct.-q9Xo6-5=8[3(B/]AW='A?rhSUN>@/3HQHahgEb78W@Ysn.DOn6?Vr&39j@!7)R43q_Q:t6QMPXdslKnKZ0dfD-=-Cq9ibZ1\i]A1C6jC.RY#gVB%Tds6W+kp- +JXN95B@2=q9%%c]A67e$L-&TBRS^2=:IP?aJAR0YjiKpR9Cb6=39sh0*V)L'p@)!2c/W]Ad;%Rtq +N4R,1V0^'E7DQuTE="4+]A#h6?/,n*hC%)kR.]AN,Ss(Nk0W?kf^r66/,9M8L'ujpA6g:XCcb]A +McrAlAAmL#!*^,^1QWLB3pD3t"1UmJhV^TFns7S,SE]A(IS1O#$&8267(d_h4/ +Ja?V'1^%Z9a#VLet-9L&1A#P9#j+0.@8;XmtS/#GflLO4$%Outol:3Y1aG]Acb?!!h!')NC&Kf!XLE0#FLff;(S!T`0GT7^mr?2@O5rKM>LM*0'S7N/ +6Q%VM1JYUGE_fQ6i3QQ(CQ.M@Q>O3i`TE[[OJ9.""DK7&L.?He +$H>$Y3+m/p7oBk^;e+X$Fi+l\,:_RI_*9Tlpio4Q`HDU2$3gr-38\Pa]A^>!*?C[c1"qIj;G@;BJ`?7KJG!_p'++ELG6)CD&QOg(3Ff8'*!MI1`"tH3DM94S0RHs/bN^V*%p +4_/UIpC,$Y[eRc_Ftdi$N!cqk!Z>H"iFfpVA%i=:Y-2HZ!]A5q1U3AfW% +$2VF#5U$PmlZ@X#'K(LfMrgB,'i=@bfqP9p_%PRN7*%*7eg$tRs=k!Otci+,dARB< +UOf)6Rpoupi_ts139&,L/EniS@lM'EbNDpg(VgNDE5i-qFD=mT0>Wfs']AAFFdo;5?``7El>- +)I1ic;>@f.%PW5pD=aT+IFE__X\kjlkNnlIMn5XE=(=0I(W=pQf\iP,@r'A]Au#YD$1LCfPUn +EIstJ'`.UMmZSe=,GQWQ-e*@5`dMk.0Ro/oJu&ln[!qR`KU:FILKq?Vlqhh_h4b&4E+-aALq +h*OUV_St!oO=KBl@p.o<^@1kV4(p#I9(IK.7sOJ_P/-]A;,U9S?;Xl9?Mtm4!9StVPfl?-C.a +tqMR2]A`Q?5Y,22Pml&qF:G:c3r0B,X[TH5qTaPd2lRq9lQJbk8A_e_"9GPi''"XIJFcn4VVYTRP!%&)n`[8G!W^Y]Ak=l^$>j*o +]A9i\4Wkhk0[fqd@L?BQg,]A,M(YpdW9CRkkXI?m39IJi18I_4$ZJ0Aqtj:$'=bYQ*`[&\nc]AF +gTGT4bUX8W%>U3B\P_9FCeIcp[,l4#B1eqniTo6@K! +_."N;U4$q]A?G?TUJqTtT$^*WNEc..A;@BthF+FCP=m)T*H-?mV!"'eX<-4G'D/"hYI>9i]AiU +&r2%8-*E!%f7hc:4l]AaoS7$+V`k/G8[^4+,>mOp1j@8`S@hi->I@ +AaC&nR:>IC"qbu!5c\(q?4R_[kEu1STEimi4=oaERn)'=U4S +Wn09_iH(%,_@R2[Y&@mN_b\?_F#-E%X("gE#V3mJErVcUP;l5''^1>>"=_M?^LWFC=KRgI(i +]A'C\^0iB83#FXpf,dLpTq +F?*b3oK6Bg>lGmiJF2P1]A^3PhJ=;t-c[3fR!L#^Oh5+&Fjg02*,)+(LdOKG\Zs_dkRFpOmOm +WQlT*uST[.eJC=K+WZ=`<&Z>-(/]A#0/Bd-IMTJfDG\;O6kL.!5l+U!kE_2fq4Kh%CT&]AbiuN +_(-\CH-8%jK/Ao]ANlD';MeUjTAc+$+s)bq9=DU91hrcp]AD[Ot@Lr)6,oQ+pR'.UW$=EWZc.p +"$8Z1BE:ZN(*ceBT_5BMb*"W&;:fppeQhHWlUCAnp*J8]AY@^KCV^55hkkW9op;]AUm-(sh@rr`U\Z?lEL[#-^9,fFIoS`lDPTc(^Fk!MY`O#4[ +[0Sbsht6u05\W4`=&ao8Xj=gJoX*ORjXPNt/r]AKCA=j0[AYN&SIpk9c+JV8N*?';s6HoYjo1 +Y&_h:MZE)2Z;h`\E^&e/M6lniE;GpM[501V\AMFV2Wk(!SLa]A(h[c'%'\^23rmL09m8.BBKs +.&j:8h'4AMm+:4cMBVW&[*Qm+/O,UXhcqcbu9dZUXZ[NEll1Wh=C(u@q+p@R&;DOJb7j/r(E +#4TpSS,CZKSMkS1pcBjTBIVh+St4"c\;196Q$R89Jfg]A[BQ'T\or:E+2'\iZHTGkXRYu+hK235Lj*fCM+ +G<7cIYlnqcj515(+'o7lE=rpC-YnnYB@4.2i0C1,E'CU&8LHZJ&Hi#\-_mpXeE\S +Pmqkr'sc"WAFW9"ui'Q&lR;`tb^Oo'WlZViHnedF408-!7oKT\qgk'kC+J2SQ*MER&a]AQN6teTg=b-K +Ift9*sq^E3c55EmnkFWr8`%\cG@&`''LP0]A7ZC0BS\G43iW^Q;o-f8&!nin$qJsQ +0M^)b`"W;Wctn2H::9AQ3Da_p,/^UnH1mhn;74>u;6b*uJ;nmDi6,7@)UUbBukV&=X,r$eZh +ASC';+]AfD4'/d&)X=D1qW`/h\7G.c5\94g`*0bq+:TOMrU\nGZOE:CgiI5IlO1Jc2!KV&6[q +qZW4F5AK8oAJ/#@8h'[V.4Omm'gN[T3(_L_K"jYE$J*_hHmR1#um/CH$"32D]AB%o*GpM[lTj +1nf"=-,C8^dHY1m6]AdL_j^,(cu6'IA/"*jqkksD'q".Ca?\[(4q,]AE"oU3'qkP?c/aZ*nX1_ +G?4<6a4a(TO6[]A&D4/S3bU,Y@::M&6k_CQ#/E4gBbL@3`lnd-u;R-hpn:!4]AAt +s?,f$`3OQOU/cSD,5X'0(L!%!L,n[%9JT>^U=.5TkEYX5BK(F/)>/0a]A.cEt"[[[!+`HbYIM +51-]Ag>TJe$mArr(KbjHp17m2btC,MYk(uKLUM&;qr8r-sC@[LY%.*):t5d*t%>jt+aO>mTKe +?NesfGu6uUoi*OF4pS4r2X=9ga0O_J&f_u3r[UsM.*6'F1]Am&7/)pWTufp>TJkm(\E+13u"F]A\.u^@,!P!\Q+#6t+81f +-?-*!bt6f$?lQ1nh_ZX8+f5m$s8nP'jN0p0]A$H/^mebAeut<-G^2NarSN8N:A3Hc((7=P`*< +:qRP%V2fV_XSM)qTVk84,!5MP.(uR12:JADV*1&^)[ia5G6E.e(D=j*X0$F)9VPQudBe0>DL&pZ1FS*:fC +6i:c5k#V?FO-SdMI`!3S$K'f$atF>*S?19[t`T1KSI^CrdK'j +CM;%+BBOp%nZt`>"4ZLtNmGCoK2r*h"\SrW62#@^_rO#$i18PZe[pcB\^N)4!.CQ%AjgYr'# +$/%[L?-FHoU9#m&:rGSc-/Q:^\F$hMrejW3:Q($W8\=B\CCkKObC9=PG/H2-?8QKnL57G>=8 +?&P!:AFk^-gHkUH$%6sOtKami,\P-s]Ahe?lCXWlSqF*='-5Ug86,^Y'D<=SA_BTrn>M06`+Y +B_P>Ob[f[;Q(cGaBs4]A?3A0o1P+-IP`bj_*$"';0mP`)ahB:7^"FM-%I +mmDs=#A^NEAk@OVJkHeEs'3lL)[C,rE:$Jr^rZ2f?l$e;):ER:/oN-_2:X:;]Ai:qenaKd_-Y +?e*_oP9V]AHhi(G5,c\.%5mK[4;O(QT@;o505bclT&G_6HP!J:We,@qY9:n[mdXPW`U.0?fE7 +pb_IFRdO`4oe-ZaLHCd;fC +UmTk#@9[BEH0`L+#Rm8j0+8W#Xuo05BI&0TbbWnPa#YK'8ZD$=9Dq*gc]A[KKt1#_hpA?&:^G +4(O+0>%AEZ)H*YPI6\V(oHl539G[uCBB#=qGB"\TtS(_c9YbT267hrCSF]A^U>shLAW#5L4u" +a.m$7`rem2;OZ2#JFb]ADZ?nc$_4hWhbK]AGNN=7GcpK2r;)1]AE7ZmBj.9e?KjZ/BAF74*o0]Aa +_ql&VD,)5QaTTT8X@ubgM)'VHo;[<^gVORViD6a6Mr'fl(tFB*SYMmqTTl_QOY:aahtf3a/U +gIK=i-1k!)Cj^nXsZ0_kH&u-sF_.slOQWK73h4lYn]A^Apg@J2[e&-;E*8W*'.H%o+P.7BHYk +U\6KCJYTE-5p:=UscXIW?3%l2]AU@t6i+KKUW-*k-kH@k^*`iWI;!I=n.M\rBsKoG,Zr?14og +RkI4sc-mY+l&_fY<3#LH"Hni9Jr`BY6HJJM_)!Dn94n`;-7G9EW"gbC;Ph2h>LXEHCA?o[G) +MOL]A[K%PK\F?o)WQX59f18r/MP"N[i"LA[dg%h%&&'Y\Y&uWNeE?]A$+=b:Ne"8W"SBthn"#m +k1BfF'-0pbdA^)%g1_,2aOZR:l^0>2AlH3^>ALbbjXDG7e%1QQ0R+g61;"2+l-79ONIYR_mr +AJ;s.;0;AsV+O\-WeMYhL$^%)c);4^UV]AQ[Uf9eEs[;d'upqU?Y+]AFjTr!a[VC_Rn__`1=T_ +D=H$";cXpnXL4,&UD1Q'n^iegRkIF_8O.Qqu[[NT(taB4;3-rMpDY0^qr9bg^KR-^T`rU)0"4>,]Af+\E[QO0iO&$.b +oh=:,_.2MT]A#3G?!Z8;$+_o*Dl#@L:JG3>:'hI:d.3Te%VjVV#TY_4@$KsPP+`@4[TdK5MX: +K?Rm/.N_PZXNaMIO-gR7)RGZg14n0f\5WuT:PH<68MEcOC-=b^LM:1jMo5b3k!R#F_+rm**9 +3#1e>PQ941P0G#SSlJ45;,5G]AJ5UW]AYHV:YDK-bqmMfLj3:]As#gqP!_8**?RQF92JY3"*PnH1_]ASI&;nXHkRFE6R!l1F-S36%V^$O;J_pR7'"0Mm.Xs)a&8l8+Qe<4iu[i=R;W0h[Q-9gKt(tB9la5o +.KYu0`:L3e/s`XmAI +60cfqY,H^'8cUO^`$=*RbbDR*7^jmrTZ:ITfNPTE&T['aPSkdTVMHR638ldp[e/CD\f<8K/b +N*a6/L\;M[eu>hG:AiFBQDmJ5!lY-Wej^6DkSp0[+@T+)k0=N#B7oU4+>"L;WNA%E)o'@KFc +OCR5,k^b&-sKkTp\*hS=86?$:3#;Iju9?7k;_?S0nnRqdo.R?/!aQt?CDXcg<>%eLmT=._+q +LZ4'&,*W_>&Go?DT:3YjGUH&Lc`t3`-8E^Oj9F%T)TH[#$".k#mI:\5[FKr4SX<-Ol?IgsMZ +Wa7#t7k2P2QX)2_\of%YE/S]Ad^>VG"5KN;"3pUEO='/F^WRf$f6e@dLK%Ie@deO%5bo239K1/md]AdFfA2V)+,dB8q;ETfk$5?L;V3rFlaZeT!U?:.dId5%[Zp +H`CPh=(VE?&<>p*OT*taA,g\7W=FPmK.Vee\UPjmlF7M$=I7\5+k;,r;@&.hT'$e-qm$l"JT +f!Us%7YRDVZ!OTpCpifuiUo2gGW@*Omn$7ZD!g]A[:\>*WpMf%m^B9h#[*`(5m[HMs+%^n,F) +BB'0HBsN!40OZjnLnh\AIX>`H4aOLI(f%r)Um"*.AmrW,n4I*.V[+]A/l7%7@n,QcaLqb)3S, +-BhS^!S.Cr2J#8=1:AS2)Z(f*XfdO^f*b`DJ[d0$S4"/R?9+)kG\#_k+GN%`bda[XsiIWI+E +LPrZ^sE8c[,pHg&K"H]An\M#X-*BOHJD9K[ah@f66?J6.i%j0W')H^C!S""\!bN.(p:a4!t(M3/k>a,pP.(qEKlVUl"%ric&2qjn"UYE>/5%aa.+?QSP"G +f]A!UqG83!q^:E#078n_;BUt7GuH@L7#'4V`M#5k@hZN:$.'m'"sSo4IN3s2t!2e(;]A]A;I`J! +:Du[WY439]A*?:0tBTqs0lG:VM7lE+g29A2?ugqer/RVrrRKQ07s!&24gNs"#I?iLS>7Y/aBb +Hlorc^#""@l4n +mQOm.W_@rRl=-3X)WD(nkJ6c!,I]AU+H19&VdqP-FcL!-G6d3c;97<2Zl\s;s1gB/kYLm<1$d11dTD[?G[_N +nNKp8#9]AcI,jt`.B:WTCT3_gPR._6Bd5W);bH2=&DZ?HUrZ#1nCi9g)]A%.C,grpcr>Gfg#Pq +5*f"ai7>YL#UejeHQn$2^1[B$ZQ%p\A7PPbinAl#PAIq2b2Pa +^n]A3E/s.qPl'M.SmM/^7fUuZ84Al3_<_]A39n(0G#(]As*PL0:o> +13OZSl'G2$+N>"i@Zdle-D?^V+cPtYc>`4''cNt1GsN0Z1SbUrO(;/\UWmt#hnF56-"%V+@u +C`+9aeNi'=W)7BlelX!;@d,$SucA\r(!QQ&]A(`/dAue!+g(oIP*f7R393Z+c&c(^&/0Z(G$e +J7:lWuLdV)J2=aa;&QLPlR9nGF6&K^-ADb[gfsGo[S^1_QZTr'S=,ifpc$$`b[ejuge +JYA:AG,br.P$AZck'\=8`L5J/U%NO[f!gU1!b=)S4Inn6YV%AfbcFmMBgi +t5CS&BIZ>?n>A`'2;XD0miMXa&9AZosUSsXTmer+UH*i&c*'$m)l!%_EQ`3@jdnhD*7 +BB96PH\DEkd0`BS*Ws+&7!u6YM(#<&3Mk:d#l07Q8#h7funr6PZ6jem0a]AkV2IKc?)maefOn +BL[l?[oqe3DLA%<,&+E%nQ1<\7ePTQ_OTAn=\!@g+pK#l"n?X.6+)_,`C.N,,$OE8i#7q5Le +moW1rBPP+_c2&V'/AkcePpk'1JVZ3sn$+#9$kOZ`)%1uqf5E8)^V_'*"q9qU8b!rCnU +Q=6[_sMN;^;OQ]AYCelLZ!:BsS!fS*kRC=YQ<,96)0t5d)&.D;)'FAH2s+h[BmM'LRtL1k3tW +c)?kbU;m`c&]A0`/3GM]A`PTI_"iDLT_nh\>D;?\6N-CmnZf`YiijXN#sS!?>BmX=l^/NN>$ +88frit^+eC0!0_>4WY%8-HRk#s-#3K_t=W:2IPs/bW(%siP(D+T-Tb0`m/GJ+u1f8aut>8kB +@VZ-:+-iNj%'lg&G';6Aa3J2WA6H"qqEBLA1=/QbfHc?(Esp&J:V^+Sk/="%<]A2!8PBoT +[iOd7)1)55nbFmnm,7B0OS7Um3qC0WHTSUC:kRa)Tg47P-*[VJAMZQ0nkPIG\9>Ag;oYTR0Q +nhsRH6C/=`4.YTUcQE\@K1gn-[Z>rGVURGr6Mg_>N>heE"bl$\3fVY6L8E;qs'`:ZeK4m44PM3OUBt1JC78mUVSZuM&g9>;TG3#jp\aUat:^X.Z=)j^`]AG +^S_>'p_OZZ4sH72">JX4ma,J'JK"ip$r,V5YQ]Aeh/mX$kAW2,*K5!-#0ON$g@Eh>SV`EjkFp,^@V]A%CaL"F+<u'PeUdVXRsIEGl$6IO)]AWCV7qnJj6ZZ;!t1DKh +8P4KZ2hNER_BV]A;r)TSllR.CiG##@X(.pqETAVj43Ln9#%T +mju&bc@3L!J#K,HV3Y8jVV>@)EG5BaYh.8cWp>M?d#mrg!@SdkpSq_qAEqYAJ\?u&Y0H_PPK +]A[EP[Lm'BN@\DWco#K""tR6WI7ATBZO9n`($H#.r?OOEYL1[cEE7=SuL&k8*[+0ANV[m]A>dX +J4[lYA,W'i:I8f,XW-),D@E\ckqc0%Y1P:pH78:ZF>[g#d^-]AtNFd;:9ro-T>f6jK\H+Qeas +*a"abt13a\NY[YYJB7Jmn-S4a%TtFrKc(n3hO="/5-$S(0^c[-#(4s>fUO54#/Ma4c6qZ>5ufEo._#=,I9Vc&ep//#7K5re9M&qICj%_i5SXg''V3L)?L0e&1i#"&Ze#sE6*C) +?TIF43n#WHqh(B>*NGHVA)mg.i'W_C?&#QPp"h7U91ntk`W\'Z#V!-E3>F?"ncat#?,]AQGpk +u1P.5AA1XaYpTm>'(h]A"oS8jQ"gW\ +.iggoFT" +a,rP-e':9FHKm^H(tYLC:Yl"G90\m^mo_\lD(NHo#4Umr[Gu46EWh\XY%O:NuSPn!<%;B^'\ +D!;'ln%!!NX6X*"'ge*f)*D'H<%$?rTdK+<"Q-1Upjqdf`V'V+h'-5eLU(//O..f,?Keg21k +$Yo3HZoTa77q?!o:f[EfPB0d;Doe.\P]AM:\#S,tT3"oh(Lp76F""A,K9!0rNYI\3Y'9CFNR; +l-m=p@+FVD!K%PE+>Sra6e=]AjBr,#CD9^6O_E5$85=IcT:>>C[Gh(Tc:X#3A**]Ao]A]Aj\W??m +`lppKGC^q0)V%m3TU(V?ENY>H<212-/Eq8)>`Y[Q/K%C!jBtTIYO(I,V:foiPGociR9YLBK4Om"q,/ +GlGG"b=!sK3r[bZ(Dl!9`C_Yc!q:WopEXj>[69XL5#5luj\*h^&lV=-Er3:,^f7Jf?,E:4I# +Z<_7`*r[?e&cZ]A<=Q-nU\4lBF[#HP)#!h6=&SeMg[mW+]A%=+4M4_pL4CSReGq1i.% +N1k9=>6`*ZeY"\*$+i4a(%B`PB/8CD!b=D1HNSekQ=TP=(XWReQU@4tNVr6t^N[0'1bqlnEs +Smt!M13/<`X^UN8jb%nIS\gXSo.B6:nBtoF$fRiZ7bI*7*Ps7fZl_;ep\Q[FMRVr[cP3nNG4kCm>p.ETeK[)U,HRe=ljc\gYJ"2]AXtt +03qW?=)@WOMJm^/*#BN;RkVqY*Y^@KGPiX#a>2nRQEB:;2D^2G3.TkfV)r:I+[UTu;C'K3PL +Wc2)DS/[J(Ac:p@/V"nqXrfl&j?=MB:r]ALlKmVmS9(87XAj2.MEK'_BnEu*%eQ>BC:_$f"1< +F>SeA9pkm!%?QYaOr/ql.?]A!`K\Y2?i4q.$F??m69TZbcWVpsA,1me;XQRWT/Iut8\EhJoAe +NFup597#F(l42ps+W-LCYS(jDqk)DE7!*7m1k=LdQlF??3R7Np30="'84EgP^u@t'jC+%jK+ +q^=L;n2b56i)c2?s0J=-[!f8.Br%sgHPG`)WrLNe9>^ngEIk;R7D?[Ra;5dt1"p4+_.LUbGW +7(_[B.s%EXGd]Ait/r:L,@LprKo?N.S'hgUj233W +^grC1%?-&"1P9L9mbZG4t^j0.j\">]A8qJQ;MR"+9,&djdZB6mN:9d$H.,\Mu@Zi+"\?mC@E$ +%a=j5"Rkr:a/1egP3kYI%c&B0\5%6Xf=1DF8l/u1b$ML.U*9gNMs'rCo*oM=,IEjE8MRb=S?lSEm,=\9W%I2N?KZErKt]Ams]AH\T(, +rgR+Zre;M*"IH/n:9.'.R^D;nB'"']AN9B4\dVX!\e0,bIloJ'qQb@k'W'?;mZbgtpn=r9kD7ZIq/$U5ZrMjM7l``p*d^$=<&%c#/:l[mpLr+XL5'Js\%1`TM,a- +V6t)$Z)U(r$'`e=^m^T_%=-/ZPj*Aq\pEG.#>FnSaE__Nn("nuE"/\M+X&pbVQ9%Ck7-N'61uTGfZB#>,ijWFWd +l)WW.$iU*J*ec=b=5-g=Q^752U4ViXSk"!" +,H9LsX'B0b.*t+NKY(bJYS\,[8_5FpB3c?"ce4BQBrQqqlH]A]A\ouBsLmVbXa4/V65<%mjBa8pDi'h5>DI%j0BP#46C.'n]AO!K=7s$paY6t"-DuBHe-R-cN%`GmZS4ckDBG_G"h60",1$[0cH-(S5&n*+lecm#\o[r:#E"lJ%5*:+@op +TjNL."^m#uHD%9ee*ncr?SjU4 +D]AtkF2cRFPc_YJq&Yqb?9F7@a%G[haRF"rF@5'`ah21rFBug8(osfk;,%rGOABNm%E;A\s/@ +iVgd1am2n^sio-n6jAjW&F"^)L%50Qk"msiqc'5+Re$Rm^f,Dcdm>Mk@aTe3hp.mL6+.&l4#(=;.+[6#8ipEX)9/08Qjk0q`) +\\/KU7MgirB=Sr!pgh<2Z/\4_tm2MX,?Kn2V5YW)D2#o.m`GaWVo'nZS51q9O*53KS6#ZOUh +>3'Ef7X^C7r;rDq5gn6+,'qMZ3qeh$qd5TdM7[aWDY-sB)0#":;DM81VeRu8oR9lL%X[dPVD +TbPWIdX]AXAB;;g`AB"KA4,9=(Q?c0[M*]Al]Aec6gr-5g0f3KPB;FL)PqlZ[j:3b?mNbAuVJ*@ +)%R*3%_="+dS81g#g_ep#dTNa)sUpUbb]A_VE50X'O1)kbVcU-4obIaM`;C/ZFWP4.TApiRni +I(@I.'aMcJ.61KC-[)uJ%.naiBp4cO!lU[J+M%B\7jDk/I(Q?#r`cA_hQ$\/5$F=l6S0dWlt +2m6Q$X('5Gt3hl9.H?_JO')3`k<4gF7Hd3j:TT6c%Bfi+ja!1<1fYO;6uV!`XpjRf+H.R."_ +$Sh(>(#G2T)pup+1WS5T')$U@_Y,[S!NX''u6r&&%;`1LSqY!;L6sdM*@d_Ka?X5oIar)bL5 +45)DS9.?KC^BYJKSFEppT0E(R,OrXN!r[N4G4-5Ico4DeOU)d*S+)dJkXm/AK`A1J\GkFVW- +YIe"u5L10if@lNp\33a:'4tn7/W10?\8/(AK;>)@"LY@r +WX,"F8VDUtA\Vrg7`RS$Mhf%:`D[W1PV6D9'u7;_jKO8GeGFDBD.6$?L +abj^FG<;Y1A&'0*bLo2u86lddQr95OW5FM9*:itSXC'ZuZ"(BrlEP>=6s'?eQ75[K]A7Y9[^U +/bsYC?.!jQd_1+]A3^Ff<>03F8=IL9190LS8$bA:h=mjB=0OfUlK_5D%gXip'\D..J_e53fIUs#nPhmo4#['P6bfL)6#Jg-U/k'H@I%?/?Y!m'/4]AKn\Jia!"V9KAKV;d]AC*-6,r'AfQB +(8P[kIB7_jF!i1n(V\:?H3uch<@_k77u5*Sg;FJ1=E<8):3ZTB8LP=/4j@$GC(m/kd4Dd)j" +KbL%;,,M6lWcXkjol^p+2AaQ>XRCp#f*cH`.8rkBTj!'>t89K1!jgK85c.BPFndR!ph +EsE"*]A[63YT+;De3jq^!rW%qOnhX4Wm7K:$]AN^j#;S[&X"*PbegG@CDKqF7bm:Jg=?IF5%kn[>]AWmGgsZ.MRHgU]Ao7.VD +fl)&_Gd@!--([.N)7s6S!>goc`Fnc)`5U-SlVt*u&^lh:[3W^#5Vk%[,rF9`_15Y+@\X=757 +W]AiK$OfP+E"GAajD1V62lE>m/l2E>#)r!@EOfgL\E.eGeQKek9R%XZPI!NiVOM_M@RCDYM0&2rNfJJc]Apm +2XXp?ff'3h+>9@Zk0_`#d:>@rt=rBbJ<=beEZqqZ1MK]AO):o*g#.(>n@s*NOLH4<%II_Xu'GEmqVTu=r;A^^`RQV:*%Q'qt663:c:'+//Dqt=jX^516=\*^>km;/u +(;BoaC=VZOrEBAkXhPtjT)QMb>Y_oF6$`o+q.pHq8@1_t6N#WQ +(,Z.6s6C]Ai-A=J5b^Jg0B$^$\VK.G41 +/Nnc'CRC`!PKQCcL_DVL:"=0M*&D1(c^`n3U#>LG8WjY?dZ[6jhT-`BJ7ba-V>AYd\q:MN01JWKeb@qfk?Y4bM$00Z.-HF";oA;U81\31@S +ppsI31%#1PFQX21+ECm/W1!g(-g(Buc,e-t]AIP2(,qeLQgpIc!:5FaI)^C2:5QVQB7a6qoQY +sA.^r$eg+\PO0nl\A`,FqWu1\<(E,PA3cKPrD=p'@@^Dp]An/YMSNGEV8'_fZ9BBH",h&CqG1 +KU&7pEU@FedR!m_lc8qud&[JS3pJUH4O<1TebO@I^W%;2Sk'H0#M/e/:h&u?CE,;_"'I_K]A>u5<$1$L`YEB8pI]Apq +<<2^8RM$5JM)p)eYqj.V55H/%r?:3t@:<)NQ9%+:OhVP77bUH55 +d`3Y:^^,+MG(OUL.+7oC%NmV))`@m%f?TdFK>-HgZ$P_bi&sC"[)L;MnP'g:g%;9dO<@XF[FX@A=RNO`q@Y=&Xf=O#-P:+K>N%1r8[*]Ae2HCj4RD=PN]A+4GX +55_da#pDc8je/=A.ukXJUF67i5q!UL9/!lJo"!k0jYs*s82lt.cgFtBgdjNt.TA+[pP/*.j\0@:0R5l[ +9/`q&;NN+^-7o=h>iJ[F$2PLNKR_O.@orhQoL&p[f;&IjlGAn6!6@eER*[u=40$+ +gPOp@()@k:o6AA:3E+/8[#eg-[oo\@O7O-beLm`p%rb@Ti+m)L1.R=1dH4"*Q-U_43Xr]A8UK +,+e%aM'K]A22r8SSp>hLs%T4O0U[g^G[+g_ebk7te$ +J,HU2LJr)f`@!<;@P8ukI]A%?9BTGfYK%/t(VA"WLK52:FLb5E;LVm&/sn6)[\Pc+H\FE7q9Z +_bXPiL]AGrkNr$9@^&./,?EO"FSEYsblC-J=8LABQa'&8#AgbH4Hp0GnSYg^:CDXL\$A>K/k& +,[8C)=4V2I1ecSFmCi,T^7Y.lp[c+K5+g/>4m2agH(OVthcGs5_']A?RMCqE]A!L5QP'9`//,1nRN-,B@%tB.eol4`GZs-?n+p08!(`b+MG>*88P53*'.0b8$n1 +n7]ADQ/%7nlR3fh.a+Xto*NYMbt:VhDGA'"?K;ghEiEo.sEI4d\rK>)\V9<)4t,]A]Aca(b`+Cm +ell&@;4JV+P^]Af>Qb#i-$u3%a^C]A?TMCu<;tR`E"&)j531V%na+ZOb1='DTAf#!_:@LG6igf +>bbCMujgN#f0ZdGpCXS2@$&+.]A-H +k:!)U8qU-CclSJm8P1/:m_LKg%RSdP+cNoR%BcJlA%;eF@YL;^V.^-]AWM$Blq*9KKle164Sa +@$k*U,4=+oKQ-`CQ@m'N"YZ(m3Y&d^!b1j3'E_d>@9*eQjbSAe^1kO>_10!dA5#"[FbXgFq/ +3hQdcbKqQ'7\kR2]A$I_&K3_IX&=5iDVDmF"SRos%^Th,h<3qUI\Xd` +hWgSJ0)^HAY+<@!OdZbSPS\@;oX`=BpA:<4r'sgf)hpI^#,t$?,uJ9(.]A!a*uN7&R=@!UjWk +5;S!rZK^oCN,)aL,ga[!FFl_%5(1[Kh]ArQC5$\nn*JhK=F1+.?QI;Cf`7tk77K3Hcel93FW5(=odAo@HA0G[gmV0^U.O +8LfhAP]AXVHkN6Tj$"m%Ad&Wi,@5g-,2\i!cELA9``&p7I(XKURG'o>dUJ'9GDR.aX&?e0R6" +:b=hC3'[p7Flos-Q4u-*98m,d10pF]Ahla_L?Q7Rog0>Wf2'a/He)WW33+7ioV,XA9&ctp=Lc +';%bGF/*W!!Y!)'=Mb[jU;aNM9HMB&t8EXRe$bGr`Y`+TQ=B^\*UUSU[;eCKh6+KEAD0RZ]A< +P2/_]A+k%0FKV?g58^Kl)p?>^'=1k7/%=U=b(s&nON6LYu]Aq1iAlN,!+7>Tiag(XS&MaD^/t: +URd`-d6A=n).k>(V#.ff9no-oOkm;K'q8H!sOU3-N4gAY-7J?94Z%oBMn;AYcsF_YG%,b@H6 +oZ!@VN@&`--9K_Ui)%4JRZaCV>lIUdTr*@eK:eqgo,Pq0ri\`$3_1GoV;'!UD=]AiO%@dEuBh +Spub^Nd55]A8Ja4G;%k\+4E=]AhD1^!2#L^Oh8e18Mhg!ia2KjS@HO'4E\ENn3&\ShhYn6E +\ArOWSBYY:$W]A>>8t1M@t*CR-VjXSU*e93Ol!^L +dGcE5cVGF\YqFM%6,n0r&_imN9"[lnMR[1#.U^_.?5O^Bn*Nem((/k1O??H.W/joW^3WTgf0 +LW#bBTs>YjoI]AII@9\2c7oA2HI?M0qU#j4-*,:)T'0OuWCCOlhImLE:B?jmoLr7dAWbq/[o% +`JNQO4i$O&F1MO`2%E(-_8lAhZe>e./a;e/"cr_%?[jf#XU7EJ\[pmY5@Uc03ki=\YZVJ?IKCSJKP?H708XL556^gmj?inYpl$p?02 +?=,=]Ap7pU[r-0kmZ?dl:1_HeQhiJj$_YZbfGL.!JrBM=IH)YClA:BhR[diUrW]A#*=eH`@0lq +OtRgBEoNF+@T!;M>6=K&CED(`E4T%mIP^+P4+qnD\"NNo"d.WZTkAoM;CF2-6]A4$V!ME!LLM +=SG,c!_`*.hf".9:S#[^W0$-NNSeQa_/9J;7(1e+)Q;=";7lT-2]AOq[RjLc6D*UTNpZK$$jj +KG'9[4\A3F2\r:MG3Xg+Nm(ee$lk]ASq-JG?VjMaH>:Td*'@Vs3S/S'I +hUr0\S=>U.i1IGW!*[]A3nCP%-,#h!-D]A`P&C_VKm8dJj.EcC`r-a]AD<\/+@7/[?B[grT*Z`. +nbBZ]A\]Al$7a9HSml!VUCPWD-rMK/ul1Hp7ViL?N'Ei-_(G'-2Y>i95%(6dUJ^D%Lb?b?@AWI +@uoVB1^%q$hX\lY*/TJt@J!$h8M`R>80"gqLU\)0?Kqt=7SL`n-Ee]Aji$jfK"GNk]AapG:%bs +pg&nrf?D3oH*pQZ:!do?3L@TBH-Xd@d2.d33s\irKgNQs9\*^Z4tL4TlK9`(F<+dB`+(DCYl +;,R$%gQm`I&.`Hcu/r)8._XA]A1l<.4I"OIGE5/H8aS8k.BrsWR7aJV\35fa7ghr;PR0i:";@d1%RHl]A91alQV.[QRSle^iEM)%';Jabf6(!`7;*PhGSX!5+P-N=ELp +0B9]AW%=1bMsB&;065SLPDV2=T%:O>eh-HP`S5b?4XFC:%( +>c1pV+rea3*Oldk=s052_aqpP\D3:#m;$?C0L?'HOPo]Aj%$J@ZX*Z23C+^XBM<;6kUpo"^X@ +O?$QX>;&) +*HnVh=G[:bcjLJIqKeYUt'8J9^!.$!I-sNZO0mUAWNq_R$(n0e;B^[Xp<`!Qlce&N`XCKB,dJiQ;o%seWV8=?<5"0L75!F!<9Z=c@,CI?h?r1X +ma'N&__>Y7@Y!&ai*h"JAOI0]Ai`V%iN[bc#p)Nj<,R:LRe_kqG&E+s:#pSRg1_fIuM,LW-jU +p]AG0Ri%Ai9u'NZn@R!Nm'U!KGcF1)"nR.!<"uHqnb;m!/TIPgVR+_MZWuseW+GTK'j,K<)dm +hdVbrmdSJ>%sN$'otUW`#+N]A$CY"p\5oC9_p"Z[MADmZ`L455Y.$"p24^AUj5Q6p"eF7M. +EbcS8.A%?"p$uI>PpGAV!2h263((j%?/`PMiY,"\7Br'?"89C7^Wr9<2W<3E,QCu"^>TgORo'6kn5)f1C&u`l,(AkpMX +8I.na2j'D1dTCVBpiH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[(c=Rn_A//JK^Q`Ck/gn_s_(>ED+si`;_^]A=UF]AipOc+=u=4SMA0`DLZ%_LIEqY;]ARQ*7c+ +Q3FZTBtp[6&ScWj3$K"rRUX&e^M#XHXV9dW5[,d^+D0Qgg:_%0mhC832`N;BIaNQO^@+.Q(k +fY8"^#V^Dd=7["*)J[2K._LJ:Y5@<$aqsMB"b^eOlAM?o-pGIpuT7>`7m+T=Mh\tc4cE^k@K +k/bdY2>/,p]AiEZ"Z.r]A"(X7/Y7JC@>E&dW'Xf(?m/&=SSpDLRN'1p&I"&Kg1_0%:DLC +76GT!,YR_!)<*^Y"odHkI1H8k2uV>0_#0gJ,UqaQBh&MCqqlR%aT&_Rp2iOT +Fo+=HXkg*C)gM@c#ID=a67oLApYQ+*Y +L.T\mslV+N40K\_eDc>PS3"0=nQ@Reud$bAMYX98-UBT.F-,.,8P*oPF=%,7$/e;l=&:,b9`G_jHjHPF^]Ab;5&EOTD`\0C:!\?l'W*'3G(c9/)Q!eg@uNA;OimjPO2b +g%t`%j_6fUU8QFrPurr/kh4]A4Y7"/]A!seCDfG+\:eEbZ8+qaG=QhY`\Ie`aedGgB"O$!jVHt +![ToDF)V(,+,-@oT$CbT9P4?cG3t._R[9(@KlObJ*isqO:gq=tO;VG[N53d_>r=9P$eU@ig> +Q$-nK;"#`rgD/51(f't.tqPS[f3n.#pYTY"hje!+cXC9]A.;T(kW"inj'YlJuh2AZ3+Ud\Aq6 +a#K^TgN,>Rg&Cjf8u29p_%p6)nZ3Vr?k/UV,T@5/FrN2VNaLVd6\-67el$1Aq8j>g-fV09YYWH8n/hPM2Ph>:cV4X$Z&uhtEf +g@S+pQC@4$,MIrcij1XWU%>iMJ'9<.C9(KKP1:5Fa.V`.&T/:VbqJ7l/`B?k-qnlL[I;o,25KXO8 +b+Wnm/@AfMuXD\2I2l,"Jt5S+C&sA4F,sgCnAuSAm+t'bb%r*RBt;Xm)Dl$ur0]ABPuKZob[I +=F]ASibaKK0D'BL(0:QfhZ1^97LkV`8&NHS0i24D9H-kN#;S+o9FK#O00m7X1'K")^M>q.E:/ +J5Z!(e#tW)Xk#erSV/r,4``tD+$;GoY\Kqd\/>eT_d7Vhn"S'DfU":Q6!'C)CW/>^cp9cSB@ +;F\5-d_o9E85AG=m76!+:'iT46>?/)30V,n5,#A">PTL.<2+U9>=W!d%O.@FFA2cdesfcP/9 +*miGC4;G0NFc\_8Qg]Ad`@79E;YU5[@;CuI:$G`1FOYFX#H!8=u6VI$a$1*.k9U3Ei/=)i?24 +&CYa1`[j9OKNshGj->)-q_SaBo7d/tK#OC]AIAQ:AI?Zgf/2ER)%fI$%#*[5Pe$OKe`#8<'al$g3NT//?PDPf5gBNMY&Q;&YESQ^k9r6[h(#r? +XB:RMOHe`h1k325:M2O)K#XVI_SaT9ZtM]AZ_lDIR3ieOP>M5laXebS@cAO6c.$JBa]A+nVF/a +/=/7*[GUSKLG]AHp%grEZ(5jXS%f_umd`5X@6FPP!7+EJC*r138ioStJNV&/^q*ls=Zp4rTF' +OCH*$QM?+kb"&b&Q2Mon6bV>>DHn^2?0ZIl'\')HRt!f"U_]AE"B&(s+pVFM,:He;T ++li(r3.A=6XN_.hd&_L`sjWn0$S)YTKGfX1a*D`3'&gR#sBo4JkrV&Gd`HkSd3as#WS&oT%.el#4QB$!612t4f^>..[KT +UnB+;;Hc_DjU$6GEnrZ?o^fOVe_@0*33)Q>nIMV,Y5J!ZAM]AKFTYcf]A_W#lAJ/qC9S\MPVKO +9oSgJUr.%,$\0YZ$mAOEDj/5rP<_#L:ERRL\;akEi&H@q:*V9C;`PH530o&=$Cqei/'(3Xtk +XhZ,cq6NKVF,]AQ-0t/T8Sq`+$)Ut-^ic +H0$SG'Fc\u/Z"AadQXS\HCO[?icJPgiQgcfa-M/Pq;5/$1G:Hs03+s)!L:%JSdMH41MTW;Ak +I-*hqT3m^.[IU/?&t:UBlAF2gnr\_;)3>T36SPU>+qDZ^Q@<@c]AgI[ +GB$dsM8H37C<[u77]Aat\,TF.XR>[Q(@E72$]A-!9(UK`(E2I"()\md@ju>KSetK3_2J*@_?dMR`<5kVMjLRqc^ +sq\`ihJq9G`\b\Xdn7AO>,Sbc4rDo?G#(I"TLmqk92`9`0\RCHKi2,l?>[s"hm"Q"A^b)&rJ +4Vr#Hj%IGu<52CcPa#?+%u:JnF9/M)$+/tpYTT)ff).,_%]AEeb#1%pNt\nLG]AC*+3GiPs!Ji +l-%h(a\La.O"I5[MU.QZ(kUV\Q&u(2<5Tr1mR`(J<&"JlKtR7kr?E8*4cl]AFW]A#"'4Mr*]A=:H&D;;K(^'D?-H#GA!(c-6 +ZCE8mfP3?f>,WU@U'r60:,"6lM$A[H;MM/'&Z=+e2&dH2ET3oV#gq4hW;4&Jgno;7Grb)h.Y +=E*t642N=MJuSjLGmqJ(i+n=M_RO:L>_EsD_Rai(WrPWRV:YrEPf]AK6u_%mF!n-&VfZdkM#, +m0?)(3d_NPOq,*\9H9n7l&GA'Mj[k;dV:?/^(i=dm&Mog2j32gYO-=MO+ +$IkrQr#0XE3E)2!,:Ap&M1Mp*%#K^'PcJQQPPS^b\Q$*RTJ0l8oqA8R'8m8*VnkpB9C+n`G]A +rrN@qJ]Ae08<0d%0BLZ?`4)""Q\h>_)2E-plp1JQai,Ycc$XCG:P`t+I8rDliB;D]AHY3TQdij +A6k8m!`>eiJgrs/s:N5'`Gn646JK+%BmNoK@?UPMn(`NDGF+"n>$.5[X6-@--+r46kVi]A!:N +?X*Ng'E%3lo^:#HBD`'LGkh)GpNTKjPGc]AHT-)m/Rt,qZsh>EhmMskj^sFjc)`$d]A"90aPC#nu +&g:ubENOER$Ztf#;RlN.#hgs[@pJoJ'e^d.>//^L<(u$08OpNZA[\GNXe_+`Mq]A&_i*#oZd5 +T6$cO"J)IO7MMc_$:+mSq!RT%A0jd2iYpf/E9*`J>UsR5+6L^jct6VaJanVcU=Ib,\[<08'JDHT_q9)F7[ppf +KA+FDd44nf=0]A&Yg4CD@Z"Rt1jN+/#ms^/E*)O8*j>AWO*l +4sbXHnHRl>cV@l&B]A@'%l&)X/b8cL]A*e\,Yk/"5WkCg-QH6=W@4"'NUi(4?rEYE`l/uqI2tL +Z#@]A2%6I%bI^[V +kHFQr2cfdBA2m\sSfB)CN^Bls2O2#A1_q8bo#tOIpnQhFm_QgK;EaS^up:d=OqpEsVRs)BRM +s\q*!%UcMK\h72K)oq2LdCq"=H/Ok?L*HRWS+@pOWleA]AQ]A]A.A[C5jMWq4`D7=80mUJ/GTUC +ICY/F)[lj#Pg&kLbjE6?*>S($6tD\d_k#.IJPPqA&9_*Y9WoT[r?VDNEd?%(^AjdTl@'[SM' +FJ_uAA=6JXPR1n]ALO4B>MntiK$p*u3LJ>N)Bk-f6>Vs9rTY:oDn,GN1IA,MJ>LZ%[i#;%I<4 +'>40hbBohmsIY/g+%a$0$[SB*VCVJpd@6HOTV@:/B%TX=!gXL2fC.jIUNd)R/&i=bb=,=+#7 +!$;8a+,c>19Ct'JP/?j+2:]AsW.TNOk4kg:Kc;]AtBh3]A`/Xj&8K[gJnce=aVou^G(R4g8R#Le +<]A`%$thOY2i!AH&:'&;q;Y+HN0qgC$(?"a+O=m\@2*;=_7[VT=Nj41mujdI$6?YH1cUJOLqm +#Qaom`:o$jr*r't`CKMDV>\GOlX@)/;fk>NF$\7+KC3MKh`k1)KJ*TZbN6pGpa?!SUhRM]AAT +>?7$l.rHgi)HGTc@8e=bf)ts'7AQ]AiD9c0B;=%1k2tjOZ.?#*H@;#rDI[=T%>+R)s.jJ*C\Q +0EqVU$H82]AqAP!%c>:"W+c^BM#Hk1,.fsNFq\6:h`U!FTBXt)R00)Z/Ich(L?l&lo=JWiG9m +F>hHh1OgUM)RbBeqQjtfXPPs4qf->2*]AEDE+a6c)UP735KCY=lD)loT`"9nsQl]A;JXW,jkR2[b/Rr.Cj.siquQO,NjQ*Ki;G6[!9o+0 +iuK:p'4-#AAMqc9Y.e8fj1aiPn0$9e]Ai*c3p]A-:iF!=D#c0RXgPq?B7m8UgQXdM)Y4F^,9oM +.SHgIe1A%V*T`783u\F,H?s1+C%ZE1hb$nq0%NH@I#(?)Bi?JXF5XK.sN]A4A72f05FUaHq+7 +Dg,q.Ug!p^M\#Nc+T8KX61qOQ(['+2)Xa&HQ3BnPbc\k[&IZO6pMEI?1it"l>8\$lVT,)4D. +Fn$*J9Sq4>$An+P.9H+:A=-,2u/[u0Y^\4g"R"M.UleiY6HF?8MYf;FPP8;,8mLOrnd0@Na: +CW0gC(*=V5QMOlNL!]Ao=AZ^I*atVk):l/(A]A'[RFT:]AJ\tc^#'XYL9&W=/S.ZOP7)*8`2P3q +]A,t%(V&`/E0-V:.cs7jAlOkGCcXW;A%$IdB +fMa5IC^$F\,d5e2V$d`p+1K3QHaRAT`"[%oL&`Ifg#\HqBG3VY&SfCK +&!E_ER"H%;.D>CH78AudmldY,X7)O?)6)tI*6o,#jV+H5H)mk&c`58=D2FO-jl(X+ekT90h; +hP]A&nr$RG?(:BB`fa5/aBTZLrW4i4^=-2.,WCM_[b1BK8/5:-Xfd3QB$@o_YugTIqXWfsEj]A]A!JoT2miGB*JQ@XcDQA6eB) +J&8"sDO>,2c:,),*Vbl\7AI`<$ZK`TWO1W3:I8.`To<#I!a)uX>9I3Y2_dB[H]A +63m]A?2RID!L2^GZji>$Drg*&[%8`Y%mCP0:QS[.,3=no2*W[ffjj7A'Y?X?i*\iNP%7]A176XsuEL&kX"?`3LljHMGXPE#+;jL/QplZ%2g?/uQ/ +V\BF4+m-eof\BA"+`t)5bdjegtgbh\Ge7rWnVk%L'F-=p@3m'tL[9Enf7(QQM86`;V0>74oY +0!0BInX6@S=H5G'M)Wre,>)V+[XN:t_'@fjEVR-SeS +K8NAY@@r&%KMfq6HV1.;QDaYn4Q`BfM+C'I)M_]A@L\`rEpLVdMn&i<]AdHHr:Ni%/^2PGm%t8 ++%-tL/Lk>%XUoU^/mgH0_*l1A-\#M035R^7m4^F7*;9f$c7i'CG2opFhQ\uX8M`X&;Utk,,U +)/?INdC&p_N_*R`UfCoA!M`<4a$9ZIn(LcnA@Ma*2LW/.!5+-unJXBe;b[JEooYlR@.JfckPgjoUgC5kQ6\2Q0Z1Zfm6n@=LSNP+ +oMsh6*SL!g2B`o4OZIYS";4T:h^b,:le_V\W?>nKN_aIL>AeHM9?p6W).qO_i__uR"0!srFj +:FG.;&,kqIBcsQq7+8(6BWdiBl0-..lC[PEu,Eh-%TRqF?qtgU8UL<$8:R+rc?O/:Ddr6l7U +I/aRn6dMiYN-T>[6okXuQTmi4.q2tuWs.+Gt5nu[@o"/b"W%KTknu#'&FBuI3qnmn+8A!HHZ6mlu(_"UQtNodOpJ'ZOc/2ONhJi_!JkYAEhcDYcpVfeVndmj4sXG8%HC,a[ +di(pVib;5a"PgkFDpE-io/*,#drn2rA+MHL;c#dbF2aH#K4[,q8fRGit]A-ZVVo%`1[XbZ#p&d2dAnKorNa8g +:gD$:Z7<3;d2e(*lQjDUF!SsSjf$C\,NYP&+_I.bJTab!?8tsN5j1&(bC'4PhN=,^=AQ:0GdjI0/C,o6Fo"40D?,9VL +G2Q*1'sg]A!I*n8'r"pcYI)AZW8m.>lSYA!#0qf>U#L\!n97$r9+VV(L?,tmr(kT"YcHZ&N^f +">[6f0Lh3@ck^Vr,Oif1SB6S)@+u@-W!IiPRhMAE6J=#>*BXid]A&@D!*hTr>1X8Z>/WU# +-6P&2'&5*?2[*dN`POEYkc<)"k9e`cf(%Tb)-fWruC"0KDN!DH^CjsoO"D6#F!/cMi2VGFng +X6X`PdV+B+pXfT[1NWJM#kA@L2">]A"THe( +!_Jb/*ujGX:Gqkp.r#W'Tt03GL3`RQpU+RV7<^L<^G?bs2R_$FL;]AG.?JaS0)k%&U-K$b%.c +#Q>+k$i-q>5T(kLoL"_N:9&=l4?kih(I,'K]A>IF#>!CX;/mYLO(N>+X?4i[G'D1`9n_STdl57#Ho +[Rb$1$qf8h4R>L/Y:DglcIuX*-Y%=5ldV=r_oLSKul+na6,+\E^[jXW&)jn[Bdr2_nr*T!ST +T*T6Kk']A.^q\2#8[p;8&r\Iauj&U$<(R!>\hQV;*,H:[La&7aB9GWrMLsqe9>Y5,j_#(B<%n +`3cfI[]Ai'>'Q5IgXeOXSlXn*@4J8@h2S.:#H([APdsrf%4VEjrbB+?U=\f/)$!o\sFa4;n?c +t$,C's4del!ijVTdF[S!7C*<1R(4-[h?]A'0c]A'iZFc%MX43TGAP@ocZ4H`bo[,<:L-k@aeu" +RJqR^XTT?mEK\"e4lq'Us)^m3b7t6(O.[SLoSg0<:Y9*$`qH\N'"c@b8MW@l9U6-1:9KSD'Pld[.Hm>76NgjLLh +"H2>lVN_;hpUU=%EHcKI0r">aIBAIeAeiI)DEfZam4NXLF2%#D41%.a59"2\agiY6uZhImqN +QB.9:6gQu+)d:TglP7r2"&iH=2.cX$WQQf-cMOUdq\1#eqt-gtD:r/KIa'Qa??um:hskkcm,bpJ_L^.0]A?T>@.,%Lj36>l_IcSFt@kQ?n(J +UVK_M]A5`X`XNqCE,'^*=)?=1(\GpklA[E/%qBA?1b0"Php'QRKN4k_PpqR#b:88AOtofk&SD +*9.\L0!Q;S^-?WE9iH>al\)"YhFAXRW3no-?#l,AQYjb$=tYq."s9T>Re\UY^`e!0K2IK[iQ +S]A[ZOfm1t2W4!UErn&7TG)XT&]Aq&Ql_JPQKA+)!r>Q2MeDE$fKrCr]A.mg,`;-DY'o(/&A[j<9J?hOD12Ki?&MX%R?dB"J<-frENZ(sVUM6X-mJ'= +Rf,3cReb2fbb,:(BJ$V+bcAVWm:_dQdHHF]ApZr3V,,lg;RW;0g6kqC^="1Ci`hRfZm*]A7-U/ +AV7==!m_!fuC:hugeI]A@!80R>KdO6eU`jZC)![RGbV>@LY&neaIGS]A`O)=&amo-&QB.t?^.e +'p53A>"0,_3<$t?:5AfD0L0?2^p=PNED'r9I>8/eS%'LjGEF#G`S<7ia>6;C%udnlZ#V^fXj +1[hL2T/j=s]AqF?=tQ8(mO.4n:/ZilDSI);1b^#Ss5k#OK%8C%/SWrj1UO2[Ln5=n=]ABA@*th +Hegcfkm?OSp@Cpj]A/GWhi$NZTE[Z5B,6*j@=]As?=5'iQXiXRSA-Pubr(<9F9msaU*< +B9sh##u?2J*fM-s91OCXhM,c\]Aldj,'&7-OMe^2T(\m3L;mZXQfXm]A.dXNYsKB"C;7Z(dr&- +Z^`-<_keeKT+]A-.B%+%$+#h^u/&G9iFkLm`gF"_TKmto6^g]ARdI;UXJ:E#H_.JmjU@_da/YJ?,ObS[BsY80^2#kP+Fg[ME2[ +X(Q,3H&;m^6Z8N+YbSsXQ-X%Una3;#IY1d;m&8mX(%5mSV\dqgG%7+uArSdo9cZb^@$j\SJ[ +OL.e>-:OmK^4/WYM9$dnaHKI`4:ohsZ28hYBNlBW!7pia,PY+7a?J&_dRZ);b)go=UY@Qp![?E"p:#f&AT]A[1 +8Z`saeB6^cu)G,b)U*A8Xnh_./"N1d\;,!QI8@'Uf]A6/DTWDZF7j@O6;M=r/?NC&66qr(JUWg3>(7AOWVYmHa=I:B4f;]AJ;oNq/c3:M.G` +rL-!Ti@[N5p7FRf^iJ+=Lp%eUP^qn!cNEJ1[o2irfIOTuWl7QBKWY>'A;jlr$f=Rr4BgI'/P +DVW!R3;m,i6lPtSpcUJmVWd6+j+M6HLs^2%hpA>s"0QF.]A)23DC)fu0(+T +/Ck_]A@m0TkJtNXI/l2QcA$TrqA7#a[#Jm+f)!8Y+X^ZpW5q3/3Cn$QD@[Xd;4q,2hs#pc%-^ +imI?\o:BT_]Ai@PRpak,oP"+dbr_8@5j;2/4mG]AE*AG(!":_!U\)Sp4n;k6M4$Qs[M<9ln:q^ +AMA2DjrG'FIj7kPp+2Capm9+-K$5jc+9k"G]AC"L&4ai'c)h#o0K`5/BL^KY"]A9*ho_`GK*@cN?I5;K2)_*NALbhR\@7Mr6I;A/p8R9?4;#4G73SD2F +18eJQ4,hR/*IB_Ngk)Un`NurO`c?ZWdI/<:3F>CDq7hU.NqN]A?m_pj+:!1Se&bcmI'H/Wq?Z +7Gh'$Lf\(]AIQE.3pbY=>0fTAO`,r=]A2&i:+79PsY*5E +(qo3Ar,AQkGc10@QE9m?L-3:rgC]A$C'%NXdfSF)ll>\23\e%!I;B>mk?"E2 +ohUZWs)\M(Qd&Z8$ZU69",8ig=:Pqk"@Gp39@JqDP(b)o84Jj-X[F$+YQ='-;'q]A[bQJf=,/B(5\HDCZX4F:e`<53(TgTn_)]A'%TE*.Y,m^l]AGYJQ&>g;Q?G=2 +Ld+s24JL4JX4=^OZYZ7)%REE&(ZBT=ZO7!rZN[sp%H$78'K_k@\\+C_%A6)^2W?FWBO:_G'A +KJs)=03PtF1%9'<_h`ak':Vpq?F)e(5>%WE/P\JpsgGLPGR3B2+*?DN(.iEs8^nF]A2rAI.Ck +ghdk$Miu?DbeESqrAj[Q--M7,r(")P85mQrjrj?*pf_[dJF6;T2$at>2QO!o]Am[Os\+uu;@7 +jV*_Z!W#D2DdBouM^#nNJ52Ei3oQbtl$gZ5Q)X%p5'PL0m>,m9.*/_B^G9=UHY:fTcdX?7LE +Y3mb,^@#gD#i`j2]AmG&ii=mLNZLPT=Vj?;St*N)\SD9XP5K!7U]A%d'5n5/4*^W_4eam/G\?0mBu6e2\G-ldpSap\i42gSd%f-eU +kM$)C`\T".i_2E%G,9:6[DQdM&@Nt6h1Yt=dIFHZ-2O)/k.T;g2(>pNR0g.JdlW;+rT,(irQ +;&JF5ptaltHoN#m^dM%2U\on*D8[mNc*KAlfsnnP@-Z\qW)21j?^T^bT-]A=k`Rf:I>$ncJ<7h>@e8T$OJ7XDPGp#AF&q"R-?sbU/%mU^%m14S0R%TP"&fh-6eJp6&Og=ge8YN# +0?3D3+&?[.;@]AtslJ`Z^YB/$8^!('GB)nNrpLOX8>e\*bm-Y6#9d,+oFcrRnFGEc\cb?NJ+b +Lk`K*eTPcf'Q`uk-0$T@muHu5b#<_T#[n&ETb3jUTf#2^OKl.(Cs:&"Wb)7oL'CLHO-F#=^R +/t7@%GH8Sa#$/aZZXNRt2dDeju +KB6W-@jQC0't+BD)]Ann#YEc(?Sp3Fc!SIB_q1[aC*ci"F6D= +Oua1'8Thgl;3fr7/3-`Hjo)MYAF4g7c+M)(uSWNP8.JgGcpq28tl*an;f=F8?FS.G7%p4"i? +>+F9ll8[]Asq0kDgO7BM$uS#ZWYT7fh6Q!GL4b5a7rF@i?)K)8urXau"+3C!`i(g(@F#XtBMU1,R?$!*L`p!_?l,O5=$]AOE +K?(Y:;B[2)t6d7um1D8qKV=Ro*%%=!N;D0QgS%A:S\j>Q6%%!O_(e?)k$![>]AlZ0`s>AG$n< +NT%GV7E^cOn:9\%T)b/N;BD=Qd29=D1-M6^UcYs1Eh5jaHiJ;dhK:6prCb)`=O/>bcIJuThNr#9_S;fGa$pJAT/qZt1-F:3JD\LV?'A@q2d@panQ=,%Z +JKar$TV^/2ECIhZAa)#%k>*8rVF-u_.$]A]Ahrekmk?8`j/:C86.]APTJ8)::VP..E^i?=WL\Q@ +@Aah'Ao3U+lrg!b$u:6;EI'T)mt0=`IJDPO2M*be'gX%Vm/^H.oGs86d(n7H,!_?41@[rP\3+2nG4*=[j:<;dk8Eqe>+Ge!' +6IN!Q?M<2;b3>(.M29Uq?eQ:m;nE7Q0rc9h'[XK+bCqo23N/X>5d<&B-PYT(*<)!W'1,*]APn +^0J1lo7['tT#MJcnM."Yr*qA^^m!rI8V5;]AT=@[QG)V97h'&BUVA$5cne:gr$m6(.cTDeS8( +$i\BJ2?g.H<5d4\`u%/cqmbV%PaoEI/I@5O%R+QWSj+Q +l"!\QM[FJ]A(`'Dih1iE?`e"#R;'A5YW7.10@PoD&`V9P$:>B2k[DopIgEgd(>?, +Vp>>?"br_i_f,gau4Pu*5O$7:%H;iM1\%#74TBf.O$EG'M7n2!HdpeMNI&CmaR8t("IEi'O$ +;*b`Ydr8)[#smS1KXF,X9AblC<9i2(X0L@VY@cT488i-F"E3ZXZtaunlqHSWFKON&/5K:nc$Zr$tCKGKQ*Y'j=_@RsdDgJ[3VXLq.r0r\D-`tW_UpmJ(T-^S@fE^s +`_XfWF6KUHn+V7ibA&[NZVo?6^1M^`So[+F+It8bF4)J`bJR[Ik:6tUeNbbfQuubi3 +@97cf0KT6?C!H_rj4_&6o-hk[TK\Z?$fs.6CU3o8I-9?h[3[ +@Xg4jPmLJXIFL[j;euj!a3"20&t*c66-.E\!hXOpIt!)ea6DHusjg-QD3D0IDL,+tlqHF[HR +G*^=%sn&9I@VYYS@6ob;%k&5uFF#gVUL`@^XYKI$/AJCopn7:-N=?/_U[Y?nD#@+jYAOQ`)b +!]A,-=\Y_Y'D'Z@]A"c=TVitC]A8^f7HaCeT(h'o_nMME&1jt$B.dq4W$%Ld!"(kXpIK>t1DBEk +YB<;&>WP2nfkioWPS\ae6pH=sil^VN/>[7Fo3JoY3RbVrlj]A[F>#cunlcRK#C]Ao"/*_5!+D5 +R6:3F`9(gfC&I7$n$e'_-YtGP&"P_\4EsW.?q3e8[ +;_CibUYj5OR7t5We;I\e/sG\5#D!o:1_U2UC&P)`[s0)e!#RoSt(CR)Ja(Q+=R\MQUZdn9P3tDJ#.f6+7[iVn/Ma:Bpm&^r +obaVQj/W&FRZo_[6%oUScdm=&j,D>GZld9a-*@YFA#AIKNUY'a(HAPlkRkP^Q7D?Rj@aa'Sh +Z%74PH3VK`HT3,=&uGa9^BrQmEgZ7j7j9XD"$3Y&):dl?6c>KojBYE*[M<7dcb`ROS9j%UBX +4hoc;6%Z$6:M,QZ)SS>U9cFdG28nen!ebYG)r_F-\+L*DR\m?DlA0:8Gena1PWX>%F*X!p^9 +tjN7AbFKN9=ZahdT[Z1inkJG^kH<$3oi_lLQ1 +K'8DZH`RI7HEDD9fe6`BWf9f>ZnHJ5jhVE`HrYYenQ!7,iri`8"gqgsuj?I,JUGJq\^L=`.g +JMY;5'0-WE2MO::aYE5[[Dr085'Ml@bt_qt%lcP=hoLF>J>mO@Ai#T!+XViH&&EI3,2(gc5J ++*an\I`5)!e1S<$,\0QGRCooW=f%ND$XYI.BI0/oH0`M$TtV_5FGd\i3<[-^rh*"$P]A+eGHr +aUPNU/i)'YJ]AlEuDX7r+R!$=Uo_6YZ=h*8^DX]A2QPhp7Sdj3,Uu5&-bT1B=;WdN]A#sAA`Sq? +"j.W><4/c[:l&8?O%0S]A0n5a+tM]A_OK"0j0hKi,ARfLOL8+q2?;!&-O-ZJq"4'EAQCCSA?oP +PFaALXGUsXp1e>t,RFaR-m%hd3/7_lssUOE*-;;ML&KIEDd&G-THJ$HcjHoLk,LbNKXRjK,,lTW^Ve9tX"(q?D;Y)33/s'2*-?E=1G?C#Jn5S?_*GV'_K%YVbX=%;d`eTO]A"m9??3>S2AE^)FXZHdd]A[7]A;nES]A9(VX^ +kFEK^=npA^3NW,B*dYtY)4^i3W\BBkiNAgBLE;pX?e\3--R2[W&-AlG0]A8`9l#IcQD9@Ts'4 +bN36j`1,0rm(M7FZ$:rKE5?kQZ6AW*4=BamIBYb>N$-Z]A\"312DH0%Y[Q6Hs8LUjGnAIQ"?6 +&,RjgG]A#$8oc8EcM.V^'J(dY3!`Ur`7Qh^J?tHf0&F8[l?G4Pq4SMlF,(ZDf,*l_G%fmPhc. +lp-dtI<6";&%SoAHMgi*j5T@h47p*=//B>@MYnO@Y.G)0arPI_`SX788Oppl%#7%Hh@U5LQa +^EFjY\.Ui[,=/omf*=f\'YcQ:Vp)&C8^q6O9$kHlu1?=cQ'SD'^nm2U-i.\3gub8YXXM[M'8 +C3;YN#S]AuD`4?RU6DU^.R8lOp!6p*iOK]A`%S&>blYH%J5NUr6O03'F3Rr*Kn'4BZ6#3U?#`1 +89;$72W#kB8kr_fG'$SeEZ>!PE=O]AG=F/@'Me%]ApQK-<`niMJTX:,`O?'>iD085aYrkH\F0V +>?IuD]AQZ$F&Nmg\8&%s#(M%QiBR[/*Mtr'b#,pC<&5,cb+qcPf#KEW\]A_MY%;>VN7:nEQ$!P +]A5pL8&4iRIb1bc?B_/EBQ_pr=*fS+&R43BK%X8%n0qD%c,=.]A6QlU"%.:pF'*qL#<** +d6:pu([o>N(9B4jBS1BlA"Hsc+Vbsd-\GL&m;.6U*LGij6`\e,pHkg#BD.?LED>+Pp+DWW'r +pAcL>;rl:e:24g!$uMTH]Aaj=QVCE9CZ$PTh.FHGfa6G%+2\8%GIk^kQI'q4DlSJ%$j;E(g\8 +3G1@&gu!CKH`I8>lfk8k@8%krOFK@K7PEP"`K'G/VS(N&4H(`3bf':81'u9:F>0[@ub,>37^ ++'ftTl@*nlT<&,<53OY6W"D6P-"hlV$Ae!K\A&b]AgE3\c"Bphpkm:I%U^s;#I>nSrI``K[1` +&nqpPXmo7H&5hEQ;:2ZWJ%IAqB?3rl:OtTHImY$2G8qO:uGq8+8KT')'kQed-8,Kea,r(oA8 +s+hN(sZ1;/D!R=Q!(It`Hsk/lq;II`%toYW5npA&c?Phu\c)>EH2a`(JKS7:fKtiT4=3 +4oU.BeL:d\1.m*5097Rh8#X8,&:^*3L.@'DXO3U.$6pq)@.q@!JbIYd4?^TY_E>Q>,rMaa-m +sk&]A3$fhR:S\U)pdDFA;4.Rm%pab9POrV;%4U+;.+@5'G0O`V=$T>^[oH*l-@^D*qfbk'Q9Y +=,c7<\kH?kRH3A2:D=ZiT@QM+U"XM>"5pfc+U-k_MsD\1'0Ct;0EG1+t?0uMKiE97\dWo9VT +68cLr-FpJ$cPWgE?)U8m<[fV5sS`a2Cg.2hoPm),+%hc-Ngm7QGDSZ!AGRF`UB$Vb/YTo!$( +"uq*'<*-t3pIB=uO8[&kq7'Ncc10L[oo0J%UfplZHo^j4C0.jL4=hlFOjUcI=gD=VrFPlu6^ +s1Dg3b^Z2Jo$WrXQXd.c)EQFY_?T]AR0DR9FTXO9\D^l@.<$e+Ap!Y4hGU\I;/Hpi^/8cQO(H +YIC^5e&TH'/l3_\2HE>XlW6\2;qq$\GJ17%Rl8el)XEb&.59HpA0`E,UHP#k!(8,P4:s%QdN +OOI$58+W'J3f1F@CCt.aZICoF(%%"EFTMQdH^.-9->.__Eu*G16K$5i3H9Vh&M7@niBmO4`3o +?N1`mfk-TH;m[:l;F=fna7=(]A +]A`'"O75ioicGC`0U&nK]A1Rn-SJZQ&81'kiL6NXNqFs]Am2!lDh,b[0O)Uf$lJ0(58[7\u%O*=.oX*1uU_/]A3uKo?PN![`G0i_/ZJCs0e6I?hHGqah)$KhE+i@pF?inTbP-VpY_S$Yl3Y[Y]A%%K2 +MZE"Ssb'C.*p.$fofBEc?<5sa1UYc]AMQ4S.*F6B;i+mo,WRN2TY_QKo/T4&6gCjtqSlGRdLc +JLSDT@OXScqmF%up;<:pb9!=:a`CYn7J6VMV3/JG7N;]A"Ms?[=%:A/WL%DDPb>VS)'Bk98[T +*]AY-24&]AZ40P=GQ;n4:Y=oq;H^'(I-f!c#Yd^=8MTY93TM80>2:,Voh'FC[U,A9Pe6XE6%[e +r\4$/X?=V";`6N)"q#4u##CZdD#Ru`)FMq>I#(;!(=+*M7N$krr%>%W-@cuVT\\p5db`M"1kH2=tO6%$V)[a +t!:c=Fba]AJd^!\H/jMC/F.?*L>J@%'=(Kpu._'lGEB-U/E:oO-7EZ[dHIJ?-(H2%4?[@5Y4#8rDoq0:'?qO'k +n4^9kM^?A)?jC5KN/O&rNQ:o)t`g`?]AJ(B96,(s>RQ>48=eR,mF>]Ag_\Y5t\Vi5LklR0\PV2 +CdRp_^$2/2]AI&[/pCb6+XhdQYjBCHN%@@Lh=LQ5+E.GUK]A@+Y^MeG +WJR8MukU/i@Z%F]ANF1LCHprjPUqho,2SDKNF%d&=[UM=6_X1jj>TS$6PgCkTT5F'/ONCCF;, +1a\Jbcs.WMAo2lMHRBrQ)39iIFgL^OSP2?XNc`.=\g?RmGDn@"-7th4s]A#B<'P&'@kKoOG,L +VALu5\fbcY@houqVRhApRqo#h(s*b2*ho%MoJJ$a!I&?Ds+aEqGR[K!8;$l,hq).3SV!rV*< +>WFbEW6N<1]AZN:VibK;I_g/q)@.f!\cP\0RZ0g"[4lo+uDi1Ng5>]AMut+28_RNT+LR!_A"<; +S&_Oc+hk@"adlADiNZ=d=B]AG)hbgh^g0iHR$b0AYdI>e?FoIsLSK1O;j@),S(=!U.n4PS0'r +`F)`f^a8pm^ZE,ZasfQNg*s&Lsqa'H>8pNePMD+/aNHOL7p0=K&n?U7j>,\`@+4#$'Yi\L@0 +R#1Ki?9l>2K8V*4Cb!JarmEZcBo%oW4C"!B-+Wp8e<*5&i%qQ8lNI\\]A;XB(#M2%1&l8MKA* +0F5[kM+f43GM6Cb^8RGqQ.Ja"'HP3(WPg)FK(\lTM,e3pN8jLYE#?Bn+50i(=>^O@m\3\Cip +,+2F.Sl9;Z,%^i1\+0"\%pje'rE6/p_!aV%J-EgFhH0#81sg+:f.fYjO>VF8Zq.Qt +8mmck#SC_5lW':7tJf:?q4a)Y\1tmoQ81+fi30Sfl0+IKJ5^'#k)?DjgB5;)q8JU=\dsNbt8 +59mR'-U2*d7WLS^(_`[ik`3%/=&k2WsCP=0]A&62mUe"hAA,4Y([=Xiim(#:@5]AQ-H0!`,*7e +t#(S&E6tlTk"TW%1T?JB6.o>rNo$sSY64*"65t\FQu#["Q^:tgXl;^aNdq9sdn"PD3ZLGa4KT$XQ?c.ik^Z%?SpMdo^a9(pIa-J30c[mWZU'hs2lD +c`LYU(p&E-W1u8VFk;.euR8\!a\d#XhGgce[^V5TKG1hWD""HOd,7qQLRc]A%g[ +""]A1HaZRE&tF9[]AJWa'H54krPSNI&PK(ip-%$2_tFo)#7&/,"(\qi4/_RF[-BR:]AWL +Pol?#]Aoe'"1b'dL>-MN' +sfs7LBfnPI:+?_U(?lf@CWM*lHSKbJ*[E+`/D80VTAAC&QXj0F`0E@RHZ89.kdKrg5P`X0E+ +a7o=T4MH=Drr"rCj8F8jpZqd(52c`rGao*&O";V]A"J!nPm69_/?,]AWIHRtIYD/rl^U5:e'ef +*5Ob9\W`C`5&RJCeNoK;MZU.W=P`W_6U,dVcVqE_r:qUn7ZL)V*%!_KLO7Y2skZph[>6%;fe +]A489SCThg53g,<8NE;ltJLn*lA5AbPtlgkVs_h7[#]A +]Au[Ma^,;t(>WN3;gYnX4pcF$-l.VY+%acj?h"D5sPrGd1`]AVcU18OCc2:$g01DJ\K!hrhaVC +W;H:6W[Y7G:s0i9?'H0A+h-Tdh[6XfV^"R7lqu?#fHfUM'i2-ak?VCS`+'Yb?/<6%_-q/B;# +O'4=*E;1Y3#m#`12,9*-\SW?4_J1XIsj5";]A->6sY?#lZ8DsWX9js=^Su7c3a]AEqIU!Tr%7U +p-ZJg8)[*KVaHCZc!,``G9^\EPP@\e(jLtkN]AcsQH7PiCY"p<_aYC_A21I0=1l(^0YJ_g@Y` +$-=TalaSIE/n6/\,ahMPt +1)%pL(on4IkXYF)=Q"cOGSQ?E)X=5qc1I;5OmZs(L*Glh,8>kGfBgFMlb2nIeLYY]AY@F6-sD +jjU`kk:aS`WrAY"m%t]AFSFac>T"DDKXCjP]Ab'WW81T0d_[/T6i8tDOrIXuIE]AqZ/9L-l\X_c +*alAqU2t$Z!c;#$$-Bc_4e5%4hk20g'6)ocP#`VQQ(KOA)oc4+HN3qGL)t:L;9>?u52^>Ab8 +m"lr*p]AKneJII6*0=Ra%o7,=r84g`QMXA#hDI.$D#!m76>j"PGBXjl9?`/9FP2'+f'HKT"gE +&$"fHC7OljV0qhUlSh+'iCIdut#@40<=[U`["">^"@fm(k +aWpID4DdaLoL#9H&RCJWHjb3KHD]AdU)/0*]AZQ^$LK6\eMuE4dV\'%2@LPcr0bTEIuAd)#k+E +(^7_'D.afrUb=;*KA7#de+IQt7D+)k,&cqh+)cPe]A3Q2;dN*N;!g_rE(548WMRplgdatK`r& +NB\[sbH4))*$dEscjC"]A\5VL_mPLRGiEm!h]A3MUB^7FcS4f^lnl?&hb-."G7%1Scd:%n(`Y2 +c_#b]AR +k3[F!G,&O&^m:5<$Vb^AMT.Afmd^tZQ[-G8H/]AGcVgW6+;rsqHbK;P&86Ld(ONXEBo1PNsDO ++1n+3q*Cd5&kY1g&2p\)WLdq7&rU2t$^SC/fiR!01i+f=rI==ch?BnUZ]Aq:Ghoc:X:i3npHX +Z*;'J&Ni\Q$%I:ljVOq;`9%=m&1e(r6Dn>UAN#;I?oUQ^Tb5eFkWI'o(YWHGQ;q2P=;l]ACl* +GOd^+R_Hmh#8KH5Be)WG`nVgSVt4_e^JC8A$Y=bYdC>o28@"8)rOj09BL?BhR:nA.:ToIh>Nm< +7CZ'S?IQbOEP"`Er([hL6ISanp;<:"H1S&&>LY0JaubN*&r2ES219"sS\O<93K8/seiD3`i2 +[gTc*bj'1T\hYP`qcX<^ZjS^^t-4g]AJl"gQnobSOS!De&CEm\@kJQMZm=-RG)leR59js*h73X`#Z+YX^1?>"QW<"i+19sIV(eM4_Bb?5%3Mr/-Bog!s950A*mZEe#j0'+H28#b]A_b,cnAd$)S +Tf_jN5;W>S+l_K-eKeIPCc$(]AWf@SViP#!uTKSP<8;*@I88M2qd8@a_0;jl4d%-(h9&7g.j8 +'_qk?mrNB+2]APBCDlFGd8;9)BKk!HO@?q52B-g_r!697rn>/ +ML`0J&f_-r0aJSTOEA5C.@@%n*/B6Vh0[!a_HtstZUj5Gm*6kSGcBir&MPL.mCVdj,Db=a +=;/7Xe$C$.J:.&im.& +0,F^DLbSt/Y)!X-XI7a]AeT?<-R3(DS:=[3k(QFU]A+7M$$lKQto;J&?`Q!,os^o+B!K=BD2+O +b?%MVE+Z_YJ@O\iWlQu,Sr'cjV3O-D"='DC@O1iH5FES3pD%/NZ!d3TfIK*^51J7UX!PSbiWmL +XGloS7J/tOJZU$KR8h_rHs-:)R]AfW5SD[k#/D6d_(3_CG'qb80m`q"d'r1&/8g3+4Q[SB:[' +DXa.jSQNYLA]AZ\$]A.,;O6+Kc`D@8(P+"dY1\1:$g[7JtZ+@e0CA^ResmrCR=iI6$u7;r's3QT\UL*XR$L=:Yu'-G?@td&PQ`A_r9[=X`04@6d^o5F+'f']A6e2< +3QJ[5M7_IaKR*YX"8=H(#b2Ff)K^(F[*d"TfhJ5!/ht7QlK1St!0'-jH.NU9I%<@HVCKb)2f +,=Ziib&9^%&U0di)aEg#Y?6Z292]Aq\GS9gK1"MmccPVqh6.q(*6:,#T[Pn7n@T8EHa>q8G!j +;]A0&H\UR=GXMGKPr]Ai3BQ1]A)1DlNL.i.,o'FKEuOiISI5g^^b.k(MtiN00k#CVMmj4I>?Kj*nmGQb^C%/c +1*hUB]Anr;Uuj#H=.EG6=H;g+sfo`PRc`]A3SQH)csf[flYX##]AF5W_%o&iR_?7ug&OO[:1do; +sqRX=LPhMBJU)rUn(b+2j;p\p.#dg^MYF2DWX@%VI"gb=pC-*RpFAS^cc>,) +(d*p1M.((Z&np!`5dE!lIm7a7eKl^(P8sL$J@4QXqB#'TL!l)O(E1fFt%5P2$oc3s5gaep8O +IQ?X,8>^\08h#M?lZ?%-YV69/_AkM+Nt\)3IXbNRo`a+BUgmT2[s6Gl:a@5u*-f493&f4XnM +d'_N`'hnICbPGDUg]A\7+,;SV#"fns-S=js<#XU]A1s4/"aplJTi"IQ.63m"UTOCY1lA)HaqY. +Bbl]Am'\%,P2I]A:lV#KjEs/e(H(7^%PPsKA&j);=W`bt@NWs5WOj7.WZZT:R9;a7HHc>R(#tK +W9tBeKcS/4LaD=J>7?r#Y?D,6NM^im=>n&>Z>;LJ;Oupdb3u;kk-oOZo0<&Lbg.Q2Wds\j#cg*EnCiVqLNb/KSqmos1NaLjF +fG?X*W#3>J[cTeU!p.=g3H)hH.0N!O&_+V`Z_[gbr-PD)[_qiGeGJ>5>>@^t`C?G!W#N,0D) +CWS:[>p8S0Hq%.gsCJ\%Q&E1\'>H#RF2nUTCropQ)8t_^SZ"kFkWq`_aDb6GJsn;`72'6L4b +sOG>SO]A-pp^;b#Dt8<\0D5UTOIEdHLJ52SOoh1VL$2L,b/ck;bee$M$OAPhZO_3ZVl6EC=>`bMc&93T\0e$`:giVB6EhVf33J8M.2MS7s:SYF4%4(R7Q*fHHo!bQ&#ip<^71oOg5)/KeE_?s-fe;]Al +t2R9JW.12">T%0C:3`8K+6T(Z"ebWaQOce`oYs#]AV-uQ*[?'WH'\g"*2%14/S1]AClM;n/\_j +6\C]A9+GQ!)(JjttgF'6*7[o&8950UE9akd+GfSf'S;+L@VV!D[gS%I[jB1A2$K[_r+Rk=]AHE ++D9@4VejQ]A#..pc(*Ji)*_iTDD>mPhqA:\QDM`UNL7,*eWc!jgJVnJYY('K`QGL6&i\Cg^7n +Dn(AeU8jJ1Jg +H*$h<+FHo.[S=-?dl+Cs7?(%F,(+Zo*aI)m'K"g+`Vn*lg7Ph1Va^IO>^BFcjiROD__9_l^a +`l*RhhfE1)4L5d$X'?F#4^UI1UL"$,aT4%d0u9>a#/W9R'Zmhkg5%kl729XXM<;@3SGKG5Y= +`J6>:)d?4KdIoVEVl>k[g%Y]A'Eg@FPRF_qIDP-7L=-NqO4('UD.2GY4)EY"Zr?rVe>Gh +&k#Xe/!Q$Cno3#pBQUaci%+iGefFf45IhJ6)=IXg-DIdTJBoG0@/5?-.P/Hnrm9XNO@i3N9! +2Oa%!h1Ak8eTLartOX/03HG+6SP_D\7ndC(7S=S:j>E!0AeS>/2=#5VK>-n&Msd)BrRpC"FD +=kX$ibP[H:V4Ft>=l\TlJ$LimIdWg8qq=`L7l@X;gJLX[RFg&G*-WcW;N$mKCJbh4'+thY2i +M373/"N4/QPgt\b@hoa+QB'-_X'DJUJO+ZLj"JH5oE,EP)i,p^V".PH:ao7d'UscM' +pF;UhM8iPa`rpU6&N>+_,="HJ"Qa`fZVdbIUCLh_G^C&#&cSc5RT^rk +SS)JbEl`[;k7$K))T9b.cG)j"ul_;-2DsD2-Ku%T";d$73H$E +L?9;Xu3as;J@idCUFjMsk8Ug$/Q=@CQ`o'D6W?CPSSfH2+ErCC;*(2=6A8fh_"P3X!D@<-9& +nc"ipnMQIUpPS4MmR8S#1J4UYFN'8/7?6mlSM/krVV&JUT.f%,8tL$GV70 +i##pd1&1nsI;OqNM$1qRs\Vs-;B%St_.gHC_R@_BX!poKU!Rt,/shV&s%9W:*RU"-X&_as'W +E,1FNe)1/)YmSm.=pd,lq!pq%2S+9'5c\S=]ASfDC,4=9Ki,_@!i!Vt:VWd)KEqW%.6T28BQ? +1<=RXP4pp@=Hmg'mcGJ6H.7FQ#mmd*tgKNmo?:/(R4<>CHd,Ib +B!JQE!klWnp@HfB8@<.*+*gNMi)UtL[`1&)SmE&nBDD(n>F+@MojqjfX*qnOCJe,H<&M^B@= ++=W9p659]A>"onQV@/#<\VRPVK5Wi&N61-0',%?^2Hn+gX`'\KHa(Qe[1',#pF!La^n8_aZ=P +j*W+L31#SD6ON%:&TDj\3]A]AgDP58URprCG#P"hW?S--ci[]ADq$+c-+dj3lNqXOKnIBD&mO+L +OdK=G,rakaP03YBkTEe"93rR]AVoCumZVIV[mVg:C+X2C&GV9[Qg3`?Ppd@CRkK)[,o>`$i"[ +`f>MA6.A2L4/\^7M\$]A?O1Z4)u5Hk'`VneYJrG?L[ZTpQjS#f0kISVMo9W`@>LqWK.-R/]A4O +HrG:g;%PT18:F-5s3+gf=l&_#<6o'LkmCTp^##i#98%:7aRA9L8r5YPkcP]A$ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +8U79.8a8`:qDd,OA8)63^f&BE(C"lpKkSKp\ +EuTlX;B-R="A4Hge<$ZhN/97VZY;g``=8!!(r;R]A<(l!+;Q&!,LND:%0*N8r6%flaD+L6nJ*nE]AZb^D#*p@+gQ_K[)03"(Nt"HR +8Q6i+!%b"DgmYj1)/jg.mt'Q?:png(seZM5deH/D>pG\cM.@PsFcaZQQ+\5JC;=?rT +!&qB="B>(UVZMh8A2P2`5^$8Kq&67iS82cL52^!lgru1dEmVOjMB.2SVO#)@q#h%PQQ_!.ha +S!Uh)ndWU32Z_,0BF^95u"YRAu_(/IC($4oh`jap9pYdCOYL(@>sX7C-0Q*nI-uB;Lg6q=JrT(8Z.@RVC2La6<+BSEU;"PsP(VXrm+]A*AhDYLr!<7#N +!kXM)%heS(EtRn;47S^5bMr7j@OAUX^bVEP#0@O,P=F+-=@;ULk-7NEZNmDjgo`UpI]A5(mp@ +SIBo1kJ,HB9g!DdJf;X,V71Iqj9!3:V:rOZBZ=t.toE='+OQVb=o&J^M=2uohG@(q?Z#AAO/ +d4G*AEOEbgL]AX/_?+M\Za=(='+^k,f[.qAXkqpk`57J+5ipS(gL7#ONhY8s*%r:`'joa#:$% +0TeoaMEeTd&WM5CWW."K(kF.4f1\!Z,K0Ca6T=LG-+l4Omi5JFgB2rdG(Zu7[B6[cYWa9LmD +lAJOM3fb6lgG&+7* +cI2Z=c(d#L@YW%M1hV_mfq?ld,_fY/RPW:.cWq +3.OECI#I8HX +:/4*,m;>/(]AHVUp;7s1]AZR!M,sCJani&@Cp;]Ai$maU[88F,Yr!8qW/\^gGg/tj4]AT]AiKUZOQ +Y/caS6pXE/5C.E0>eX@_4h:)Dehkj;W(/I&d1Ad/**$J_6:EDd.d3`Y//e/$QD;[8M!.b!mL?/<5T]A>p`^I""K.Apqm_eO]A0N_9JMk5P&^Z`_t*TDndQ%-J@46;%U^:PeH]A@_ +""8H_9.h6G18uKX=e-#[f!K\[[Pp";bL@0[2/"Mt/5,_0+"(G:\=eo"gmT+>cJ,n4n*]ATb<5 +6fAko\'*CDtcX9I3^C-P\6aK +L)Q^Pf)ZF;XH#K?j2icJp6hKbphpRLc(`975f"`UZR-B47Ip%?%QCG__56=_l7b6K^:C$R\%Y"g0A]A*pTs7MMPZh0Uk?Q[6.8t]Aelj:/pAZQ@/REMP`2O<)C_/8@ +7RmXQAr3m*3#C//M(AQ)dc"2l!6+p,kKfbAp2@Q#83b#P`WgFaJt^q#pnOqXZ1Sqoa(U"_h# +H$)@Lli +!]Ar,Hro$/`i%7=Mm,"igIr1`TMU5;\?c*Wq(SqN<7sqqlc-I^WeF,ip+2:^s@t1e!m(X(gh:Jt`cd581]Aeg8 +OLn_D)W\D-!FYu,Sm6LO#B4C*[0a?5fUTLY86]A@C\0aSe&7coe:+#l!tS9L2W1pAE-7?s'Pi +Mla9mi@lr/^b$r]A'<,Um2'Wn$M]AmbQ`F@^k9tM>NfKX/Lq/n?b]A>WJH8:XbQX)5n_QgJ:mLD<(2h8FoeX&%m&Ys381'hmC"0NpR9=J7)g4E$@ero;p +kio'$Aa/TO0?;So'4jqg&)3ERYE@F:SI9ftEO/qV[&j_PnWfa&iY/cmn]AD"hT02c0_rG8cHh +tul0/5(/\XN<7o*tLNp-\;$@%!EnBNc2j*;N4oS`A09:.!_)@#jn\]A;:1]A]A[be^<"I]AMAf^s +:!6.3'qQR6aFkB8s'Nf-WPEWSG<*?knMj2OekeYjLrj!5DE6ZMR_:+caH1JT3aTHSbg(>r9/M'#`Ed>5Cs83UTH&a-0>"8k,-[D9($o7[p-\JfMSMQq^@8=f +;m2.\ZI!W0^f"-SsC_%OX5&TT/'Kp.Hf@G:ettkHMR$uEm!2X#T=N450n"Ab=nU.:m.4R@/4 +k4/SJ=Tfd!FX95AZnYhmYcQtjIp3=7Ccb*c/,"YF_B:I96cJPhHnI8C9+h`PHpZ@fnRl#d`` +jqI+"O/+>6qOPWH+,Cua3`,6/[3"d:--jpKnBS-)r=Z%).uA^Wq:m#C'B!*jn"k3-bGT45BO6Sda'>@6%mj\4;%p%]AbXQXEnBjA'mX*l)uMnhllD1fZn#QJ/MppLS]A`\u0_.6Z8pn`^g=5rR:%f7khp79aefFR- +gY=UnkU0VQ4J7$2*u![/i=WPJujhp="usVTlc"A/b'Zg_!0A&Pk"RILk#\hIdkITB]A/_^#)P +u&:;%5k!HbPc*)s/\TNJh-]A^OUIXIOel714i-6`.p/ArZS`4>mhV2._GE9hrhJFr5S7Og^U:h1e9Sb@SIPYQHd.' +T?cuIkPGo/+cEu);JU-iCM6eJ(_B%EGZD%,q^cSDbr88SB$nblaJVf6*Ee,dI:+I,u+q7^2@&PZhpc/1o&5%D]AYc<.D!2kIZe4 +p((?`lts0@&Ze*IO'!>3\0W_aV#j@Oh66peJ,<-kgbeIV[!6-=kheI=r+=7JePq<:WCnh@1`<>X@'iUHnOSrkFH5n=W5o +[)<%9b7L(oFQWULF&=l$qqs']ANCa?`CG2.ND/ArF.-]A'FB_b&jT)kH>3b^"h;ln:O^h#+?)G +8U!DiHV=t_0RZMY4;bii&W#^)O)R0&?/B%1RlRJtLO8EPV*0:N+K6+H>@@V,N]AAHempU#l39 +DK==bPO-!=h8NgPg1d@n1a8UFI(@XW93W'c@.4elLU"pIhEPL_GdgAmWV#+N!d(0'7,ULG8p +h'8."UkuHM&A'EQ)opb2%)*VfK+UYDTEYI6o5r/C;G)11YoFG4O[(-^@ES`=#:d +02j[]A#nVU1]AA^Z:nE%-qfalsP<2o+WMC1R=%%Rag.Xi9U#2@Qs$XQ'U7`k8=(_qjq,6I^qJj +G_>JLE;hqR;,-3pCJCTPiRqXQZJ,k/ZcJshUK#+!c$S*O8(>-jF"'aKfE3GX#e>4\"-_RtW0 +Oc2PCULYO>MtBpQc#MV/fh0YCl74eJ@<=LI#]AhVBgfh(@Dj0s2CsAJ:S5r@9'`ckm'KAq_); +$4+QHRPq8D[1'i0pHEB9sq8Nt=-'&`WEa<"C%M\I5dofUV2bB!1qaQt6nMOE(Wgu*kn=0O4Y4,tii;bs# +f\07ZCO#,0T_\F=j_8HjML=Q4!,[tJY98ae_DKegm#!&c7djLVfm`[,*7DAR1p8$+oC8PaYR +$p712\sB,lkd/)BK^ja]A/s45K[B/[FmCmcQcpe-mCkOOCtcqCKlT+SQ7fr*8=H:O^;OdaNpj?99rl:)`j)>!98o&gjO# +pHBPd@s+"n'eORM!X(Ps=U,`j,/c!Uj?9Ght-W$/9h#+ZutZ!r4YKFVNUboM&U&i#2oeEVRQ +NN.=]A4H\5kCAO`G\Yq2rT[-XdNo&!#0=o,UIP3*7OGOc+6*.,C$Tmf'-c +al"ae+kn@L7aCiIE1.K^Qm34r@Q1dmIEb[,+'r +LHA.`JEB^V_O(7`dATlu.#pS7D%QFV=dmCC^%k1kWns?bt[V';=[PF>aGRp_)`8O?kJP/$R`r1AZ +$0^Ops8X/N-`Sq,A/=@&C2'3u2:,0@It077a+%2QQ:KK*C1OC4\FH+7F,;_FFoW.`f15X9jg +-Me8?Q9GT-5]AEk4i+XA)3fO&KFtp^OF0gD-2"0#[`[D-Pes-/C7c324;OAe.&)@#KriqCu1Z9_f?nhX,h/k"k`kKZZN.gGHK2VQE +@@+9g#3iqe[&QHf(H?Z?8=W/a:n&M/s/Y0n?:VJ[Xo_o_`KW8m.04X7[;gI +#lWf+ +IY(,ipm7UCr2KiV?dWHLjD/A!iuN6-mg51*d;SaDd8+,s3ajHol:!C4DQ6qNqktT-S$q]AM5V +gYO4odOXhkGHAT_&:6\\2%gL*i([NA>Kf4Z;&WU/=\TCYUbElF$PQ-DmFf_nm5Z8E5DMXlJ( +))[N'X?j+F6lG@AtN0Lt6ff!.,"9qWAPU*'#UgB+G&;$+Ob;Lq8e/XRbGh?=#PN-]AsT4&[3. +P2)=%6kYt;k&DoL`gE)`-aCq9%^2m+&$]A*?^`J_B^gcU0G0!(8VfJIb@PC(h_`bqRATKX1t` +'X;ko$u72_9l38kju\!ZN176fVKPid/d_W>M1Tek<\9plLciDDM2t\Wgt%i%EBK_q*%]A:G`nW +K,7,!m.`".nX'i'ab3*/`nc8oH*aKi)#H,P@h5C3'H!3>_IC4s^`8(_;e_3@]A4/[b]AJq)#`: +%^\V)%*`H-I74an=IT:c/hIGSuXn1`uO,=!L(+0$/&VGqOC*)=;d*U7g8"/Wa%gbm:l$DXo* +:/2;dbLOK-RlUTL8/@?t3Y%ZL=@P`V5(C36iQkk8R?e\rY,nXNBSl`b^c)e[]A+fLp/(JPM;Y/Ed[9 +HS09b")&47R%K=c*ihVC'?sYP\7`9odK]A,#A,-.]Ae5 +4`M/1ZBSghlh,S%?oNE2DVu#"rd78iI#$l3^>q)*prc.+8/%0d."*reF:'63[1)3F#=fRH,O +%AmFKJ79`9/pU2^Har%;b5Ukg*daej_?QVagcE$KfdJN5;adSnY(+ +bokK?aBX?AT/6fd"4JiV=htYUnp51_[R_)\ +$oH8b3.EV1)!Bf[T60U]AC?(?tD\n%Fd`F:Ld6JIE(W:35cU\@4S#;]Aid]Ad5@4I^RX1i?MNZpRXOe;VYjJ0@R2MMO9d`*Oa1u +!>cJQl91G0b"4Im(1YgnoidNCo^m7!k(c'6YE!a,0h0tW;la8ufo5BK>0P]AduCi8'`KDFEF +>DpdW.G+)[hX0+G.@>-A-uiQ3=&n8Pi*]A'1JD2NB1:WXQ:OVAD+:nfEg`.Vnf9iF'H),@q*\ +>a*.f#g]ATJ.EGre$TU\(_mh61=ZqRO>eKhVHS;8.Ap0V$GI6=A'sTdAN8X')aDSpXE2W+uIf +1n^OSqrbV*b%.#,NZ+a^-QbWZ;n_0mXo;"OWoaUlp;@nANXuiJ!)1)7si2cT?1adsXM`kaBT +EMX*$i[UNSgH9^^@qPcDaA('F'bG91QN1s*[%o)r9`61jEWHpR"ojl-teU_Q#f5[6,eZ?(XY +=b`(Vq9SQc%N^"8*7P88$d9XE>n`L8i97qGpC=>I=3u7kO"6SCHh3+&dO,bWDl!*KVquQ6po`A@h.HMSRka_0;E+Wt=b\!S$KI#eA-,L/9)\k +e=.pm^\`kbF/XJ\EiR5.!c0=u8S1+ZEh_8@7l+7mDp&(mY'(3R+7kRU2O;V+sqXTWL4$X/AO +$b)AG[fGS[OtK85<`NR]A(ZKH>(:YWc19!Er+R!HcsR+Fp:JO8/j*T:(k#p\<(LJaXgfaZMY$ +\go;$m9rj?d@IsD]AkR*EI@]Aa"giY*>Z\Fu4\&CEDYL%*qs!Zg'^A]Aj2laZ?m%:rT?a^6XQVL +27l:,!lWd7D(Tp[..2k`lmG+G4FXa&s1Ms!_3_M%(dD81>]AbN:QJD267,Zre6Cj)R7p5Hb@^ +Wa8?iYZ\;tfpP4?K+=H5hs"!@$7!'Ifj6+TXctI$,q(9J$"fYRGNAk2g%9'6%KHq^3,8T'\u +&bJJ.AjjIDpp@UR-9+Ll@N7&5_$2:jCT>@!]AFkrmu>7#j@8#"h7e;a+_Mq8f$3fjW +7[B$0Za9G!:MfM(QU0$2hXI!/%S&3[To<]AZm2*&RM!Z6SWf9/j0h?/JGG;JHbEqZ,,]ARbn', +/,4;ub[+^\8_7B%7?F!Nu@$F0NZT=7mO4SYG902L`h_LfSUO,70mqKq&ZoZnYPrF5#FQ^;t: +Lr'9s:P:V(ni"(P'OD!19VjuZj +g7P\fWS,ia^8]Aa$6MHCI4ik9&P=A),q8R-TI.Ps2bp +WOI[/^+US1Tk0bdQ:JhJ"crgPEJuY)9LlG911o/#`+[h&SPj9h#%J`"V;ce&S?*B)lVIKVXS +L/%MKt673ZOb09C&E%30R`>N"@KV@I:$LKW*?,qZo +j^C08A(aIUaNcJeC-.7k.t%badAMpk7'$)NCWu?$nDaf8%pQ*]A4S=qgmj`m;9fb%Cbr3Y[:` +$b:qaOT:"3hiZkmp[;ZV;)tHJ987Aq+XJ\/d[TjO +I=H-_-q0GJC.A748GoMm0#r?iB\Qd@lTF6=gj?6R]AV\0S7<>h=Ze(p078K5t=]Att!74aX=TT +BoV3t9XBR072,lqPrKM=nCg8SIumTW8VPJF`2a:[CJ`+L:M-oZY)ep@pX1]A)&"iFEG-l[Pf6 +i&[rQ81lo*(lj@H>_%B%L7]A]AlXp:)_l971897OiuRlq$g+=h?lc]A&rUX +/4*=CEO.-NE'5Rlq5s;D46ceYj;/HJ4do<+5nI1;cl(tX\Km!kgObJn4(1m?Ai^tHWMd3GQ^ +fr1-G56]A8-G6:5_HI0='$+c[=)3:L3"]AHEBn4$1.D!*$J$idj=,\:_Xh!*'?8BC#cXLb5]A;j +'[t-:4s%mR>?BG-m]AeKU7SeiMO_"#&km/8.BR7G]A65)YECXV)>Cf@:#\g31E/ETuC@C<$*7X\PI`49rT_K +>25rKp=[8Q&M&O%Nt;N67_=ptENrm[3W)*e>CoD'oQ(j`(_LcV&NhAn>G\$C4GWfL=jQm]AkR +m:'!H:tfh`(1$%/mr*,'*UNBR/LT%5N\*eF^]A6 +.s/h8;1jGlmHTeN=oU7E71N/Crg![g4G1#0U9J>!,Psf[AluXG&>D4VAU8:Wf_'')9LD3sa0 +8+e,3O+aSm%5"4XpW?tKtneDDc2=[[Yi@0A?#HFme%h*@)U`%\WcI#VBp1B@^@psNJb"Z9$X +6!%K&k)/l5U>;"Z@SEp+K/Fr@Rt>QD:^mThd/Iap-_ps=t#H,">YP?_[R]A(Zq"e)9q0/1s#B +:O>K/]A[4&7<>8gOjl:VOJ(o6qRpiDo8>kfkK3okip`q%rJ`lW4=!FcOZc6kH#.J +6+AaLSW!Nqg*@adO,dXZT>Ugr!Osq+d1L:0[G0gBYMT?F%04rmcDnb:E&AX,s=LC"+94H?D9 +UDES'ob$<6lR]AToIL23_`h>cnWB1h-YIk3H/$;h8lj#n\;Fpu"[54LSZ1\(/pNIb:u-K)23$ +*Ha.C?(M)sAfp-M!&Z#UaGJr\qqS)1lTR$Bm7]A.tn!QdsXEJ]AqnB%tO#kVqG%?p1cFiEPA' +O'/)._[5S]AddO7WL4+;@C1;8oZ(>Pht!\q/9\4f:B]AkK+XJ^XQd+ssUi8R/p-"C:O1Hqm7.4 +M4@gSVE_uJhEdl9"_[_et`oa?,R07+&2m,-^fL;&A;FtPNl4QnNO*BLBp^U7pK4::!^YCN&a +PB00G$B]A$bdNGu8F3V$8`lml\`da1OIC6MgfX;HEZib19W^i_2i +;g!OATt_p-rmqJ>Ad@-XLF\;5$u]AXn/.a0j,WRR7U$Ei`pDMI`TrIVO]A%G[nC@*.YOo7*-?9G[[.)(ACcM;iU:\L-Y(0B3!ajaNF +Ni`<*^+5D14m]AaQjX +TbAdJN5!b<#7-4G<"NGN2H1QNl$PlAf0a`iZtqUX7;7dWrH#dfWE-h%TRX(m2/f\rm*;h@,e +"=B=lojhIjTVbl9j<1rB)STnfn3>YP@D6;L#W9A`nB.3l`!_h@VPBUg7VJejA+hC+Pb9!51c +8cocn[d>M.kCLER-%ct$_1C2l`N!Ch;^0o_Huq0T3ksRqW&q,;@E]A#<5f)KiSY;.dV:�!E +H;[^]AXIabk&qiBhX`%mKaWm(7A"9:M-VLS? +5EQ?Llc?chK3kYhXIEjIZAZk""(WY +okV/?4EnPD5@j0C[,h%sBJ:(UF.A?%CN&m4c)D_K;N3I71UZPY=U<_/PjB8'idE?bfs[f#P= +,Za'KUlo]A(\#9+(OoE-f;A/9"aCG.mDO&8RQ$g'^k$N"e8?B`CX),ue*B%TFUUN@c\_.4OT8 +pT!@p2$baSL,1VTdX.^:QX*0a"+^^OrqF/-gBt_>'l!d#>roq=MjkrCEJ$+8Q'qLe$WM]AT0J +!i9h"U?il2'[>d"Ahp$tFQ+J%RP?E[9p"K40#\n%^c/-nbAZmWOaH@q5-]AUJU#`?7P +.;.;A'gKqfeY^!\(?GgLoDfH+Np:]AhE:j^b("[R2+!Q)7&dRPq!]AbmV;+3b=fSlF9sht$Q9< +'']Ak,(g1/rZ&P*G6;l/g?Pq3?TX2tnUD`s\N_se;;i8Z0"Dl2q*RhJ`$H1\Qqo([#U+'[/iP +ki]A"<67eQNVB"eKUlt+YnIP(-tq^7g4^*SJ?Y[(f\ZS\]AutGV:)t"ODq+nXjuJV8,qIXVk!s +1`9Nh3/rgo2jKHkR4^Chu;\CFqdaJ<&5`EkTmAdNlg58!;6rDC-VQMM4,I=`@TX.kh]A3/SYIHEpTNh9=="QMdd!_i1W:,\2$d@:+hO)iPPJH@,'. +'k+5n#moG!"EuM,8/]A>&-\tnXAPp(>8IaGY*BRfu$kVA_e8V]A*&BQSu[;Na?S.^QF6lA +_;oqjc!gn2EW#"FGHpO!J%7MFng\9FooJ0:(%_qE'Z,.X^iUs;_+#.jlh:7uUi10M +uj4EeibB@j8F=FV+mUdXd:"JIf+bFcTF5%gBFL1:&JgsjiY45I39']AIVs+B4qT.q:.eY'qGN +5n>]AN^g4`7_Y"O\Q#3.W;&R-)/tf&B#q8VE:+"Ik2Kt&&r!#$>Xr9Nki84;H$*<3_GXm#`:, +Si'`sqsQ1[qhDYT\q%7/rZ!N_:L(?7lktM_$Pso%YE)G@!OkId%OV3/(PG8sGKlG?)"?r;0-1`&tODRMiX/QSraZ;"8]AaF,P[=rU5RGLSLS?$:JW!DA=k1UK`]Aa>hP&N +G+ObJ#mn1:H^/?&hU-!CS'$HR=oV[4tOh=KiQlMW%3B\[Am_(eT8?o,H.!SZ5rnaK^PQjJ"7^'>b4s[ +%6cB4Xlm3GC9&-8bMcl,sf%-nhcnG+HKJ-.MVgEIP4EQh2.Q31 +&1+;g[2VRjC&I6QZf"mUOW`;'gnhbf[!\W_P[Iq^UP[<o:B=NV:D%&Q)q;mL@LM#WGr?&L-,_3Zu'23<&/HA^a36881/QOt`l*f:dmI +o15$hf0Hlh&KjVrT_l0-cl_hPidO`i$Ysp\7XNpB^*Ld>d2mACuj<&d9T&`>rNK9XMCD$>V\ +dg>'35D2"$G\4)E\T_CM19lL]A0P^o#Se4lR!=_,4N;@C+.`;?'T:UN+B4jhdH)$WF&O2]Ad%S +JRd$-I4>6Vk%J$eq&g9:`DL9\ptMp4MdX7R2;.`F.g,]AS7MMqUt/cSDd&Wtg-=sM'S>!j_^, +X^"g8$MZ+YZ(0,U=_3hea>pEA3G^O5iDXWcRZK^%FM7mpg&DR7Aj-WkAtp0AWh]Ap0S7i(8]AJ +!R,L#b+=Q?!//NMKKEbP_ZPaL]As5X7McKE8:Ooo0l;)F1UNdU;W/m +`'_kg_-j]AKE'/h@l"4"j]AG+ifIe2t;!+.d%W'/Ht&@T`.2Wjj0s1-_stn:8]A!'e*M2`5k@R5 +!KJKNI8E#ZAmVi0MLLNm6ZQ+DC?QK1o;I]An.Q6$59Idf+B]Au28J176+^6CQSVa<`_G)GfNk^ +jK8Zg5Z>SQLjQq'A&AHV*!LB?;^_mt]A*PJSmRiVsmg;QhTprX9)J0/%P'=%r/F?m7pN`.:[> +'GgrJprQ?F,]AY,03G!td4Y[59lPlCEreJE`HP$\/!NP80i".tD%=U>u!Q`r;ZR@=b06tYgeT +YdkDr5Q.!E3*/PnTPBVX/]AtO+7#tBl\f@4g:RWG`USs(t9]A-=hlu*jnG2lnqEdroME(+0`g@ +u?KBc./plPbah]AU5"PrWE\Ikd2ZMM##Mhc&1@Kt\I0;dK)%'h%gPX&*n5*a.h-1D>C*qWd-3 +B@iAhcb)on=7SO:f6-C`<@Fm$k%\NfR++C)npG$]Af[7^=*#SI;0-]A"QD&1PN[VsUoR6[=anT +,\W]A.pQ=p)Pb?mcuF^?ds*DqX"H;j#B +Wbc/ncH=Z2TQ=h77t2p<@_;4tTOo:9W14m&V>\$=dmHE&KZHUpsV15: +N+DRE#NZu5!nNBa]A)0FrGhg4Qm8Zri-r98?1G/X37jgK]A_%_Uc3\iP*!V-k+OrhjCnEuh%E+ +-<%EEfpbTX>SRgZPk35?Nb+iH?lci5p?-MN0@,Y!J/Y>g/[_(NO!'9BuUUi2>lcZ=RLiYI/YFO +,nasfN'Q6si$r-nj9fpdhQY67<3+E-r_Y6g;VYFRRlM5k2O`4BDH/a4Q712 +$uFs@kfX#BlECFOWaIhE%I/L8V/n)WXQmXC^(PC-_flK#p9D`FidjN8#d2W5h#)-TIjgD/kg +140H3B_B?lW)`8Ks$YP>eq"<+3YDDNHfm_tKs+8[fI0HeD?e?!#Yj$@Ccmd%h_TP=bdnKRR" +M;mA7+ZEHn5SITm1PdTK9R*]Af@P]AK"$;-jf2caiIRA`fjha"'clB#m.,2/@=(q:nZ)a:d-k,%O1tq9M=.qb!>WAs +mqN+_R_'Q%?`RJ.=7>JY1%;Z9[jEW`ACg!>>Ohf1m:`7->uF`'p>BPa>&BT!?r/Lk-s6Q=>+ +=%rluVqe''&$:EjL[)jUE,lcKD&24*k'l-oTEn\Ag?+f2p=r>W\hWmZgb.M=U8uHijU7*6<< +FG&`'70N5kFO(hd/=D]AXY6840^bUH.mJIrRLp2.,1'9#bdS-6a-,R6BT>#`?J)j$8T>1#6A; +1NMt1>$kn#D9)"kbK,@oW>eTR]ADhX99--0D\R@Sr1LOBb`U7UXJ:CG"&rL!Prc,6&X"4'^^D +((h\HqCcZ5rb+"OC+De&AB1K>[S:g5(9e]A#i%&\)_RJ%gAY5PHH\PSeZ:a`4`r#E0rFn"RHj +[:S'A?:&5X%^VZ:W<`/T6*'0EJEO3qH +3ga1B0X-GP;OS`%snSNZS6J?%l*b3?a=JjAn&I3c0YjCKUYd3U`S3 +'!Hjh,)'R!P><-o"U.rN+m*"We[lC=\euca'mtBtd?R$`+$_i@B_Ef.88fqL#rEFKKG9,>qT +7Qk/4"coX"7e]A-[PHP))9%C(&^)3QY]AR0ldpf9`jP@eWl2WSL[KW@.@t&!PI36l>TcE1#%3O +Tc_O*q-\.L4$OVtn<`ngl0Y_dSr7[U/0CBAX"+ObkV\ECj/A7TLF7]A"m:[3mZYs#\Y4D/HR +3'mGn45PNkCLg-J*uVltmupi01DhfJ*I)jI`Tj_>'r$Zi.&O#F;V!T\2U\otVr3t3./+IS(1 +`\G%WJ*$m_Ydr%efU=:1U^';5K#e%M7Vq"hm.OCO?f9A0K_l;7V59")m^Xo.h +,Sgm%i465>"RM6"RO+Wfo't#!q_7N\-$,T&8$92Qi5hWDF%FY/j&U/o>c@EmDFMTY'YU>_?+`s>JU/d +7\-9VJMQY_I>5?q/MRNA3RJNt=?sA]A`=gqXQpGQ4laoW1YQ[4ABu#'pr!#@CWpcqMGm*N$G+ +on,Z.ZoD@\Z6_d?H4[*9Tjc3TM#,nqbLfj@&:OFsO7h?42c5&I +pgW+Og_q,mO[>$P0s)H6ENc&^11J:Aj(]APo_.FOaIKW8-V:=nD:t)ijN;/0M4q;qph$P9L^2 +[VWl7.CKk>)@u%1NL$t%8b&0u&"Yp#:qN?)\RcGRX[$A&"7m&)Lk:Ud]A4P5`>?jEdAm4Nk/U +2X>Gbu2U?/Ql8KJb0K4im[(+A"Mc58q+TFAEAn9auU%AI\i[CPs^bSF.s=eTLCEqLAs1VBB# +T1\E)f,qWC*A[-4LW)kVkK3-F*n,q(tPgR\O#2'D+19ndiT*@"N?PG#pIX?%?7.e_7q( +]A]A/Bi\ku&(Bbma[Sjq+dW<\O5i4>lhq_-&g2)*(J?]Am\^4$C,W_.6"gQ,[I_-5@5S'Tq=?it +p.-(Nm2(1oN-7<$\)!ru5F&mcT/;HAK#JXOj9EjOoAQ*pWu1kCKl3%gc*G@A&bHMc#NQq:rP +QlFs=Oi(tXZsLV_*e;]AWIf5F!`..0m1h?5!]A4H:R;P9shBlu_h%LS`pTeQO$CJ8'I96plH4[ +5AkCTul^$l6Xk^,di$G8q)FKLj]AED'BrOM?U]A!64QK1pM_u/%gWg(gtN4\WMnJDJb4g`U0sY +Ph#HHr`;/R7((eE%g`C]Acs4XKo0quCr^3.p.inN\kit:"nY0Gl!eD%]ATm"3/oZB7L7Z<\FD#l$LBG1%T;*aW3&IpOo+/i9)+7 +>ecr,>9khR^2>!^T:`t)$r2a',*5XSMNW8/P7[fm>:h"b4>oEROc9q#4sL+oLZQ\"L5ls=q? +9;$EY8AV8sdSpC +#6;DXI-;HK[`po?[4X@FEs(PmY(FK2.P/A(T+N5NFIAL3MB=KOJru?4\-5!1_:FYetqTYkjQ(iRY +,r*a"n+b"Or +IqA,hD<&KODf9"WO61"eW7_HV/=JJK7KIpJ?FMQ#k$9FZXEnqKP9N(J0tZ'`4.L`-okp4#Fe +.)g#A^Ba79>0qK?c`-fj]A7R-b`p"/LCOhEe*;Pjm;]AS%oh/WSX>V1qtJ6s9c@*P9eU8KFguZ +CMC$t_=qUNPn`uf+n(u07=o!I@P+=gLhVU$AB +46=EC1E]A\'#TDdbLlb]AY@Q^2W,tp`Fh;qRZRlJi'@o@2YdLlE5:,TfiQ#`s91hk?c3$e`SDs +cI/>e%0-+N^B`H&?hhbD7FB8_81aV$i7OguVb,t)G^HgY$*ThSaCHbXBYT6=*d;hiU]AT/ZVJ ++g>4.f9s@$h>>ao04o"4mJ%*]Ar3G+&H-$uNo1PEbT%r7%]AL:eFlaK=L%;r1I>(!^-4h&Y*SF +S/WE_a1#1sa:a<`m[GR.o(?EFoftl=*2MgjWkeQ`"+R#bLJkYC4[Rm<&/!RdZroq9J7`a4V: +N9lN41>^4Oj.,+BHGEMrQA&GBsNn*+.>+UFf +Qm/#Yup?8_!_rHMjfpr`&[(RHaU@p#Im?M0uCbH9Mo2*2QtJsh(*?7#QicRX@n&UE8 +5Fd2(4t6=AF9,P;6^c*C%T@PNK#r^W_221S[;7Vj0JJ9l!O.b4_"GMHdXtQummjNogD'AW*F +0-"XKa8!kj5B:jT4HY^5:\Ac<-jV6qMF:8!2SR9j4nndZ'"`")S0-CT0#M>9Wb5n5iK?Ac1a +23*EnmDCgO8CFA/c&a=Hr!g.QZZ%09`P~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +jm!&js]A`L?J1-!AD1rgp +qX$F8":6mBuYu7&[*+iF#Mj4aHT$7mUJD_ilIHO=*h#"u2\mY#l>`s*F7se$t"R]A8rNkLE/A +9.@V2F4=Iu*5$Q_Fr57EfRhl>s@?;@P-A/>;9Q@M8C)DETC"ko]AKg7Rfc![:S[UQ +H[E@?2@lF)"IT#PX"qVhhPLYK&*mdV+)=;9g$*oujpE7!W80CRrA)VO/+e)MYR!9Aa'85c/[ +Im+W_H?fYthktR?GQ18kp:ol3%cm_LBb[V('uO_B3cBuA5^#UPp`Ad_Q92!LZ>Q8m:"tpEM%^Zm;/`M4%J7?"=A9=4alt/$uEPF-b:_BslI=B><CkiP0dW+:]AoB"i]A\Eqo[IX[kMiC6:+jp?_.$?]AX6<\2KZRZrlsXTH$#N->hHgtgdP> +o?D)HAH;Gp@j!.]AsS$?"EB\^RP'&2Tb;VSqr]A#f)a?0:F%]A9HVRrE5rf`1/6$ct0M8R+`8Sp +iLGlR80/<@kbRGf0Q$!3d*QXZ".XSZ^)@>@hHQFNKkR0D2uC&8S\;utDJ8\#$%H*42D"]A&B`80fUEe`NDfa$8`BHroiW +*.nQ-]Aj4@2jU/?"T\Q5P6E[an)kjs)3kk1@Oh.Tg!hU/?Gh9;ZrFZM1M9E,fJ=iY[# +n)6X:1\os%EUN42,lO0kC.Mi;$j;n@d0QAh60QB[J4S\aJ3HF%Z=?5*%PrMM'--U]A']A567e$@6Q@/-[LoMF1!XabeR,D&^;m0,\imEK6 +^I=]AknFVjE&H.P3,1101?(`)rB9l/HhNpFtMk5CX6o%duQCh*u@Y%4+;,6Z4(?@6m\C*NAHC +Ir\0(479"b*[dAte4q@<2LV!fQ?$+tlG!RaK2hbSmbaZ# +%BtMaJ21kiUc]AVe^e>Y3Gmn;#kp_;?XX/*`gU<3C\!rtIp'l;+DNVtL?5u]A6b;bZQ.sp!nIi +2K2t+XNu.2u.sM0D5dHP%j,1JZ!5;*74rVFn">it=_T/h2c!_87?2!%ePXiLqXk$1'=j8%+>kD0PUjE_ea**!MN/h,X%0gt[(k5)kP%``_n8#B?b&bU_.lrRj[[[ZhZb>!B8;S( +3PKFsLPG(%*1Vo,FZR3$fJX&<\j87XpS0phUHlA,AnHQs%0Q@F))OAP$YVg*4d-nuF`VVfQgjT6%k/pjK'[J +FcSX1Bb\pT#iFWV('k?mQ?fL(naKhK_c-W^B:K]AH7-Z$M5eQS?'VrCB$hj8\$p'BXs+V`)iA +klqlR)71G(7."+VBf6ea&/cP'3Pt$M771D=n\6bC*(&33QBF?F`1'E+:i%/=TEa>$emJ_#MF +5nE;WA4o_]A/$3J#>1'mLuY-emeT7lq3;k=h]Ao3AZ]AqajRm#%t'RkZ<:..6a(7"X/I)QA,(=^ +4Ptq)OUSk&;O>eo9CMDF@ol/#0C%SjUcSR+/$#6(d9jJ.Y"d(O/&PIPNk(Pp[:#Frd.NL&\YiuLY?6UJ%p=*hgP=*[KJX"\C@ +Wp`u$qq#&Tpc)mJa"M`;pr8t +Ac0Rp:jh+iZ^:1 +bn/c\f4eP%E%8G^_=hLZ6e_Jq3]A!O:BO/fC;ibF&C-.@j72:(TB]A._83rrRUaKU&ZNJ"hMH4 +RVbGadcV$&`FAS'r$`'0%'#d(5G:?FTNU]A@/9PtKeo;pfKrtTj?1u!CCX'&EPe9'*p>=S*fR +(1<9pKH9BYs32_`BS +`a^a.(QDp[,+AC%4uP'"HH%oBcZ#R-g9\i,/]A!poM.$l0tZK$#P3IBEgOogM;Zu$M[=-tDA`8\a8m00E[.0Zl+`QEM)a&n`%( +u,+#>)!'0]AbfWW>qD?#07CUb#*E$6dQ%$K5baH,;I5$'R\-;pk8;5t6$>*oY]A]A,%!<.6bNTF +08`C_C/'q5K]A,ldf^a1VFXP:t$Rg7]A5Hj_i%)^+^R%.pj7U_a*5%dkKIjuLJVRX%JYfSgnTs +tHW&GOT^g(Oe@]A2Gpf`u@F"p#e?KDEr`HOf(*KViEZ'2Sl*)'%=MA`,`g?a)o&q(BL:SV86. +Gs2,12/[pc1RI6=17p&hof0fD^p9fr63:6 +3kfXV*ca^<$F9'$j1JG*TE=Jfa;f8aTT3C5\BJNfF!"S)]Ano\#j[pnkhPVp(Zp5@?)-5:nDbSh=Q[/TBt[7d*fEDaC%,u(n>QHZNc^WIJ0B9;P>8dM7V0PWOcIn/TG8+4"'6]A"LF\ZJ +g*%i9&TB[O*`rE9!uc?)4)(OY-&&Z$i:OuhMTEOi+KRS49\[1rg+Ve!HWtYjKI$/TplYM06` +W;'Z!p\0AE6l_8Y[^"?ruN;8MAG]ARh$\l"i;7)_f"JkT1H94H"%f/[or35'nBC +KP/Ud^:Ba(20I4DN3Cd(@*[TtZudX%hSU`BrhfX%)<:=?>R]Akq6ZLC%Kd1^boEm+r-`\4.kW(0BQOLQ?2O`l(4Pc)?a10c^0:JlZ`g +j%BaEaZlQ-RdNSP<'XrppPB@Fn6?(Y]AAi=KJh)G0jn?4XpG43g8g^M[bd?pNTC$mi@bnMH#' +9@;b>rf^RZ-ed-l5CUp=:D(\P`KK@qkOIrp'P`\eB1h1%jWG\ap+=p\p(R>"#/@#?Tm.\H]Ad +Ct#5Q_s_r:&2q/ZhCH9 +^@_4&c*u[NWZ'&Je\IJ:M`]A6sK)tn?1K9>$s\6tM>MKF:`YCD^_gE2DM(OI&jj!'%r +R>`V,K)!Y&.!$AY";CuF)AG`ki,,36W,l.Vch'<(q^_52P"IcE!]A43Tbma(4)>96ed5uG*`1 +8"'i_qK$Y;;q.?#:o^\A!]Aa=H@9YP^#=-q/si5LHNkUdaj@?04NFeiaP($ZrX!iM@$PPXO\+)k`EbDc-.bjM6l7ecZ\:R"p9Y[I` +dBL<(l7+^+U^04fW/pKSsdu)T#+jb+RuP;]AO%T7o7E2%_^$4SaX^(K$HLYD)!XsMHS3r`&EM +#lCJt=qLO58Bnk6\^&[[8-=Rt53q+/*&n,<(fdI#%o?$l4f?u8@&8hp^Po,X7JZjB\8Yf9/4 +HoSZA>i8&:`kZ0(W;%Q`T\AH/ +'Uf+ZhWM+7MYchoZogsV;O(l=+UCGM`.+3LFa5f[2^8psg&F38.BIjFf(bYLjWg/[a_n$kX' +j>-jWgB@Q0P,EqEn86?13l8s2d3[u!F_]AKHh"j7jT:<6hGR#h.AE3_g`R+Coa[]Abr9aUs+?iTk +Y8d0q4dHbJu#>8u7;_pkT_#W[:Wkgn'&Rf'.pK^b7N2m`Ct>g:7^/;J!q:]A`8H2Y6XLj(h^I +VH0nG$B9G.e^i28m)n"g9pJ^JF]A&@=BL!"3TF_Q3mg(FkHm;*W2Y\G1CHhE6C<7WKZcRKmQ: +jb]AZ0XQ(Tk*Vi#dK;jak:1&7ZRH#l*p#9V-r;i):>,>DVp2HhNX,]ALE\n+i]AE3T&Ngp6kf>X +GR-,<.a6aBKLA7*L +t[A4S7Eg2pkn&Oe39f=hFAKlL;*$`(*'iX]Aok/l6=P%.4'6TC +GalA2*d\GNL;b$79MHmnfeL``b+[.HPP!Y.RfKT-R7JQde=r?",da&dWPNfhL%`QIG0,`NGs +co>d&`j25qJh,^-H3T2$$Hf!7L,"8K\VJB[s.YZ7hd>i)cf[Q5IUP*M.TFA!CC;]AN&1hKXF5 +-#[Y1`;_gT:d-q(1)oh2hM*9^DM`iMcsH--$dcI"LcGl!@fF6==7fB?c".5W11:$>iBt5/Dl +))JKIN^G=cIB\*(^Lp4/AJ?PKZ[**TPT,F@GdR'/N6d:o==7looSOuW8Hdf%$A8-^8*Ajesm +*Y<\p-,Ab9Z(B&&]A%WXKf#Q^kBt%?0!br^'V&-4g_!r;b[sef_[B*+T:AWJn'*/eQVEDGIe? +AMhaiUq":>\%E2Enh\Cj/udfXHogtT7!H)cHGeh9c)CX"A$91i0lA%%j'R=B/eiAhc"lFoCg +Ob3cIZ@rZ!$J&;\$2pBb8uNX+3HCm2U(N5Yla<.TrQKE7n"OZAH-e@82-->pF?0lR.8?)GK+ +\[j-V.)QNk4I(:2=1">-<"8+2*6GH'3@P/'+S]Amb@\GC`,U[]A11-Y?&%T)"f3!kS\/6:.l_2 +G*#7"3,-]AKu_V:7JVO;nS74Y\i1/[(@(&[",B/t.9bh10g>i(8.O$oPO4/9bcqXM0.j.,_V> +k'$t[`#JOcKg8!qo)UFI2!0]AO%Ics`Hj=e/VqZpYaC]A=fK]A0tJ8BY4]AnHtpnB)Xq;cf2j1R- +q`WXY9M*42Um[V.Q$"cU=NPtq9hmkWGg.Qrl,Nm_#i6T]AQ +qFeFr=RIl>hO3V+1.U/@+Em&^gL!oeuB-]AtDF#imh3Rb"$r&0sFI!0<$Ga^(fiJ?r>3kNI4M +9r^[(kY56s)q>'jU)VL_e@O.p8C9sTt6jE,Q$u=)l;>O.\U&g(UnN9F`W>nnE]A47cOJ)WI/& +'BBgJ!hMrE"bPM.RiMP^Ro<+*7oDZd[U*^UX3?JN7o_?!6A%Q)]A2ZKi/KW=.,JlM%0,cB2\D +]A"5sN_5*,XVnEOCBT%;47-"UdXr>KcA^0?h`tS7AG2Dcaq!KF0;) ++,j5Om^n8$:1i=lrHTSFS]Aoc-BW4PqAL4=%laP`]A\Hj_<%i:9ZW7*J%?ZXHu[1C!(K4!#Sr) +R]Ajeg3#;MkB34o2Mo]A@`-dImFsK!t(qYElNJiflPa&)*,17r4RH-\ZJI1X?omrU/]A);pSW#Q +F#aQ,XH[ae*cTX(PG0TTp8pXf3h7IXUXZgLBbR'4Hdc/S##LulC[/^*%I@6/JXY9iDM@>6_t +Q!I)mBb_/?;1nIa]AQ0DmURhss4'QDmWN@bY%5ik51K=td([&&Fk>5\3sjjB,`XBj[[_RA5>b +6_oFLkpOl>lWMq$%%)=^k59mYkMm5lQG1tZ_%3;?C3n*<0s-_ed03#p$`Q4\PqNk`@/D"flqeNJpp1Jj)k.akJJ,(d3QoqPm\%6e5A8`^Ss_Rq_Z:,:/?_a +4!jar!4bREe)K>9*#si;;:%RW9JD'A__NnnTGXR`/fS;[fr'"!CZAXO2jr, +^.2?:(-W(b/QCY5j5$M$9LUIhdk6n`!4=;1^(%8F3\###=F63Vq+Q4G7WjMN^'b1[oRpoH4r +.GWEKVVVQH>k'p.XVa_O6#00I^(D]AE@7WZ0*p+AJubWCPZ +7]Ad00IGgHgEes,W-U-@3LrbT+5jGV3Pb5r/pVlL_^Q*)AWPZ^u<)hTmhLkq0/ZAkcS&9K2Xm +%N70fi?/us)2f$A)\:X![74mm94+0TDrn@EZ"MI`^+*sJmk&-R)J:n5^ehqJ^:<35_bbn3Da@BfX:Fn`=20LIHgBl/=c%aaEW=i]A:1B$(;4^5*l1T,Vd,[VQ8P1R63,Hj4U$p#c4s&"Sm$A7k$o17A,GkS$LNVkkng +pU15_&emI1VARH@uM+]A[7-t6#`j?0@jo/l2VGNkhPAD9bFb +)hS\PQ8h06gPMAGNlqj;:1,Wql9DeQ?MI/a%(gt(,]AaSkC7;ml:>ZE`QA>aX39=f:="N"AQ` +Wo2eqhB-''`.JMX``Mq(n6&"E9cJ!H8"4q +>=:nlPH2.FU_?*SPNJjCLjBAc-qM(gfCB(@E*0HLS:p.Z>$:ZdJ3_,7T5[&i_9Dj:<:g8B@=]A>n9TpcV/5[2N6odRWhF$5D63IP).r?MXMR31r3D +gZ\%TFM! +u_M.+7=(BjmS2PIU4m=:)K\ahJ\5..p+-0g&;f(pIW$@@*qm,@!c%fYhGF8fD;qs>3 +CPH0#p*!@@O2rO6_:r*f,t@N;tE.Ng_Ec4'tl(0LR`/jK?a"TkJq28a36F>a&I_Z;WeD'S5@ +Pc=?!C(g?DF\GQtK-;sM2(=/gOpbp`NDaooU%WemhH__$qTI5>LF1BiRn:Fk[4a5deVHhY'/A5I+NMi83b0BDPY'g=2GQlr#q=%M) +#t-*W/u)$?KbTVs^3)82RjbI@Snb5p2\NdWXXajnJOjJa4V6T.q^8'KO:r>2KXln50eI.\;0 +3>Hg9IcLjB*7/=JO`b@_XP#BZPZUPUl9k4J&/LnNYf#S$9612g[kj@SXAVl=bl'HU-TJXFMD +.qc.-t[V(0.P8!*QPb_Ug2]A;c+ij1U+Q\4]AUaN7#/AXSm?KK4l@`7BWD<%YZ=*&+,X3G+4Z& +pE-!`Kl3oBu:[OC1Z+N%l;ka4sps+;8ec6q#u]A(Tn0G?!"R#:gfR,hhIi&TYmMOY^@o'"h#F +=ir;kht,S6j*Z+J[f1uaim3$)%*=7WWe;aZ4uo]A3.EeX +);\S'*IFmJR;`Q.oEk,s_^1$.?/r8)N53#$,J^+%IRD\'leH;=\p\Ukd>0gO!PVuBA-EHA#l. +i2G=B\n#,*!r/(-k`HVrlD!r\%hoa;KT;95L2#`hk@ER8RA&dAoltp(^55 +Z+j6BE39YF1&04R^9=oUE1ZRS30@p_grNg5&lM84m=_Z2''"MEgt^\SRQV(Mc9t>k%R%A_ +3=,-EHmI%93W@PMas"Ke`mJ6>9(\Ih$4Nmu@8n0aV":I@t$c[hnF$Zq^f8%*;;I'1H&RQW"\ +CjRNeMpW:DtlY1&8NG1a6^X[lc#5el&Md+ +]ACd=;hQrqc5f[CJs&YpdnB&2>mo0LlZ74/O8kmem`rr0O4jKNHIYh%HI=^>-ofRq]A_s=l_>t +UskC9CfbU>nJD(MZ_Ga4J61=p3Nu^rlDlc@8cajQfG'*jVp"ed,!#"t:5rt[&MRY@^@eE6eg +VV6)IInK+*tSbj`k^2>Ld3R/!T\U?hlK$-U"HccbLrFPsY4_TR.meYA#Y2lc,:L"6.`&GCHG +mX1f"%-$6:o8TC6Zm%l++-e9pWWdjWXUo;X&$2SE5k[j?ZG3%4iorQ^P^KahsXgEOMEeqYd% +;NU"k1U`qE%tR5[(hIg4=neNhD&11,'uhC5T^k.5OLoa)'&Q32BB`SbI4rj^$/,!&e0@&ejE(R(tb"HYIo;ta+2eX=-5/8 +%J(3[*moj2tl.5(0OcVD>i!`^PYmj7$'Y.c6k\/@$%1:f6T8hVp_(;CXQptbHY!:ZM2^B#8R539PGgl/=HDflV=Rc6 +bO^__KC\kQD:`b2EZfn(Q6T)r]A5W\)D'i?n(g0f5D_;7WFq/c*RAD7019R^q)7\D$c,(4@YC +_j9$trcXh5,taAI@JYU@`[Yo1@R]AI&"Q#i[-4p&k6EnEtka'ogdl4)KgY^sd%h8;/+4Ck:m0 +&+VVU5<#V:M,9imcQ8FO>9d%!(uGVgS98*;Eu!rD-NHj"?>?$^k*O7D6JM[PE?5!iTL%Co*qYQ$?fNM_4No8g<;=JHFF4jIZI5Nq5\6gTZ5S +^r,Ia=^dhj9rW?j)lKeaV+?[SgS$1dk^AF7uF+B-d= +]A%DM-41HAB09Um-0-H+\D2H'k45XN1(dORZJ4>]AI.1mWj?o)eQJrY;;7iLkWM/ZI^$/7*C_d +\bkP)ollmlBq(J6T)\ekRf:*qh:%WQZ0I,lJTEW0a3ocL=)g_hPdqGqd3U*ae +!X?QjUfE>q@+br[Pa%W(u1p96SQJ?']A?XB7pk=096GlXfZ7J6QD/A!n9\$cm%6\O??VEF;mg +GQ(fG2^F.gJ`I++nUj/:6"CJ:WX]ACeO!eDQR$aC7:]A@s<0;qgD/[!@3XR:IMngP(h,e;o[XB +qHqCeTmKoUCug@'[@Z1"maDd]AUJI)!d9r^\D]And&WbiYrStQ4C[=#.aWXkgAFSXkV/2NXNY(j.2tcu[r%PrGJ5^[ZHK:5oZt-lfWpKePVCkMkJgd9]Ac +I[4f"2^='sBOm`-0l"8qYe^4cS-/jcFOeHRs^S#SJZ=AMm=mH*CXjbnW3JmtQ:aI7SVHC?UO +T>a$#B&/%QM?m&#e6DbXq\SaL$i_`A!/6X3XhDQ-#e6FJq:5@jcB$-^]Aq+dLi[k58e*98g"J +[H-b.ia=93cnP59ukK'L".8`TV;TEj(k+?Y"N]A-r_Oi$Rf]A+@_Fc]A/r+eEUf*]A'rq=2V7X6q +c1C7?kWHsZ6pC:Z@n#:bjn25r@h61F`H[D.o#Yt4NMNfo*LM3]An7)mp`79/G#N^@%rT0H:9g,#>uIt!H?j)=@]AbEq86!<3'gQCa&T@qA +3sGEN"m`WtK"G.\b4Up6T&dVHr"#q_\'jeMFKPW@U+a9lb%\5=fFHfBF'rmpafPC1Nq@cdea +92Y=b=SEa7'%>O-UB1%OK5Ma06@G,B;/HfS)fc3b6^d>J9fi$[;n^GG]AmPm'3U6^h[B;Z-Z` +R,N#q;e'b/"/FF"eR,eOuJ&j4=O*IkSJ=8.&!(%VOuh$_&h2$6>6*E6@Q.VmLi)[=D@"T=uc +=aD5J1\1^#rX&d?4X'Hl;%jh/;EaVDXh7lgkA5c%6nKm_?D8&2?HHW^2fiIFZZYZN#oHSk'*Oe2U(lOH,5< +?@@cM'QVsFAdF^$Zte*)>tnnkdErHUM'n>_7hT<^+2o3@/__sXL/u1$<]Ab+Fr#(d1&(jh#ksYWMh>QVPa7 +$mq*O)8`tGcR!j'eli^.?7@fo/?WGH'2LiKUepJC@X`[_eh494s"*VJ,8ddc2E`si5Bf4+B@_@d9i6^r?"r$Z\61I*i?f +R'r3.sUQpuY=hWAM=2>#]A!]A-5WH\YD07\>%/G\uL(]Ag%FK&D.BEqNT`Y7O@Kg)6_G/.qhcn_ +amD3+AUM8d:#%H_P,U40V<"=Nm/!@l:u&:\;9&8fJ965W3uY8C0FL@.;;+@`cb$uI4FUk4a9 +plChH*>2kRqqX6l7&)>K^LQc9p"O@lYi2-%,=m69"&Q31mqEoH0W)fiF2QI`p +U#o>l-7kckVo5f_Wt4f?^f&,1Xu5]AUI-4?r=\l9XN6SHObobl"R5"IZ*TaM8CZga;'9?Jg.Z +XJ%b[d*f;VSF9W'/(:B<#k_8i7U1N83N,uoS9aFD^_GZjdSR/@\$jYb?hP2K +1Mtk6=h<+:?TUni$OV54_N]A!BlKpqQYh1sT6t:8]A>;jf`.;6"WFK/p=F*fb?`!YCJ(_KUm_;pl1lKc#XIT$7QGP]A%E39a^[0$E1-EVm`qm^> +eEB;7Y*Z$5k=m9o(kEcYrpJ2,,c8?ZDbN>0#:ZLZ&KNSZY-O!\RL&J[_Z9>nSWsdJI2%2rCG +P[]AG^9`u^n#pXXLV\p8,9D(Pt+'D[__JlndKH%*4m4(%bd$m$_.#<$2H%*ZRIHMQ%DqM8&_K +ukusO_]AqU\;Hb9i.<$HFQ$/.2;fE"I(:_1%c=fPiU6;?6VrNCFW5R2fB+;J'U1\[C-@62!38 +Z\rdC?2E_.M)uPSF@f37,]AhnBZdQlYbYi[Rd#'J"Q*(-g$BEc)@Lt#-rTU(#A(_E2G:Kbn,*AO"%b2G]A[+OgqFqIC?'WE8pYkRFJ,E&O);[l::"mYQ!3UuC +4RoZ"X,WVcXM!4S4e\G(@4etAeq"Y5VW_g?D)G0*JO&e-U&4_6d('DXgf\oiRFo*8>e&P?W# +sM!@ZbbDR]AfQ0:&k%WM9ka83Ne8*iQYj.crRkI5$Y&Gb)>_RDmm3=QZ"8#4H;)LrA!ldM\Xd +`r@5^nF3PqG.nf(\IHqjgo=/S1%&n2YZAUQ)7oKkYMNlU_0c0T-L>3QE>c@/WeMqR5aSLa^f +PGr,d-CktIY7FO2Q^fI@cI's!4qR)p^4Z;?(jdCnb_Opa+( +`S]AH`P,2@\)\H/mAjM?V$gnp9q_?X/)RRe-7i^?r0;;'D37k@7Y6NRFbJ;IpnPZ%6>-m/VD" +i.El0_S#!.j.plVd\T2$*,\F5)+$1Zc3ec*@81+N#gP4q$8?nEV96`DimQi?BMUC!DFC)JL\ +@fY@N1R@`RA6i$\>rjk89"tTcqqM=H/F+h&NW'R`W\u/jV[r[K$SL;icOmd?8-8eWGC.#Con +J<'n&;"j-9.Kf_=YO+q^l5Fs'DL5LpXAqT]Aq^Yn5EBFS/n.Ml +eCX&6krd9;A<]AcY!cs/)7GK4Ukn+h>[G"bF;ACriY9,6_"*HsppY:WmqLim_Ynln80h0WTWs +H?f?VWGY@@k/B6uqNSaY)&gYkTW349Dk,lNDk5VGWS@Er*SA0[,AnC5i]A;tK^Duih,_L$cP+ +,B`1(Jj30/-Pr]At9o#/m6k:Ne?[TZ-r=+R2@WT7\a:-OIN9;*Fkk^ZM..ai39WN]A0THs'*8( +*lg*l%V)h95fN_cXeEe'9\<5>Sb>,C71^aVC1P\W]AAo@\e>4HE.NgR)0A6'CkQ7nPuW4>K*Mlkr4T[%R)#rMqYcR5Klk-V,g3VaP]A +TY3?E<+grFZY0Wm:jMW1`*/%X(@%WXCT@[^EBLFJ*1:pC(-1dr7VaFs3*c\r:=GOQc*-l(4@ +n*CEBGTn(1:G6Y-fOHtlK;'8WO`(Sc+3`>f.G!J<#,2AO3qY73`?XU>D%#`)F88f`da"_Rpc +e@bF$7H<:I\KhXBhNV+aT2'*5oiXfJ)d"j\k!/?E80U^1-#A+%IR,$CJXRG3jb*]A^kXhM%=U +IDP`C/,O?L`W3266(XbmZ!bN"?N;opE`F=S6;Z*Jrj\Mb>VNPhY47&KRmCGAd"D-^) +G&UoF-J)%L7Uq;II?)`JXhkqqhD'Aa]AmprVL+3,29KX_h-+WpDGl?To/r]A"I1!3g268ibc=K +qKD>@]Ah$;<)uVMVr!&H(nEI&%6Yqo:f9YC^Ut!Bema)gL>f&Fi::LpD]AU[?-QAniC%4.$a#N#( +j5&4'Ikqj^lWUX&L/ +fUhBb^Ca:=MZciS)Mtb"h0m_IM-b,(;1,/2Lj?=\UYI3MI$5RG81D7U9romrMteL$f1(EF#\ +HY9K=]A--k[=X+/7%)InF]Af:@Daj0Z!X"5jq/`3H;)alBOn6%`>S6Yg$RZp_X[A)$T8eroM/0 +;[1,M7IQfGgrHUO>3rMeR:?qa*6fhe@rJI$*hD`^X>u#$nf_UL'$=1!u6:!"QM)$..Rcua<2 +[11q51G[.r_)]A,.p4E7TT.U#@CMk8@4pCh'3/XU6;5]A:#J8N4%\,em"Its&u,n.A-C*1Qk_>]A&c`6AJ(eue\*jjB_ +&n48mDsH*Jn]A'i/@Wh&ghPKF:JjA.'`nh;Z2.O+n'Ijp&:dS1A*VW_!k9>X>=o/'PYboI_g`f()1W?qI\qb&Gq7ggNqg^h)p +)m4+EEp&JchfV/-hB6>2T;9&Vm +8a^ma7,pRDW%dO'6>DG'`d^CmqG%ehc[cVnC4BMBD=dts +/$TP%X#/45F?!0A^pV,K9I]A0pRiG^6#D<;\R!lc4ja0-;?VW9!0gY)3fRT!d,7<5M8q94mQp +tlV7\sB7a?.pt<3\:e'fJXhQC,TI.RMPPi(&/b=E`QMtoj=ls^r1QJHPI3MZ-#;LUduqpa^' +PdB8-]AoOGsQV)243!.DDa2E@A;)lWKG6fIWbKh!b5g.<-k]AF420-r'A\9=+.f3&&td)m^&#u +GCI-Q_B(4Zru9YFV;SZsnTsJJ)H-VaT1N&L^]Ai9R$]Ai)U9^pjDC^o3auX3@L>=c+?^A6oX4=RD( +'Fm.Z$9Z4;j5f!`/khA]ATMCFf;.(>$Hd"&_7qD8r^QY:rJ>r@Xnf39U#qbp>8X[C()I40Mnd +B1n@aMnq&]A:hI&+X-Vo!%(D,mq2S,O'0V>On4>b2l&bWB##K1eq,l.QM9Aub]AYNjjC2_;j\U +n-6_">_b-p^JAF$DmY2`pkN.rIJ? +D;8kOA7l3mK(+I@%s/?raTa6b4S-fMt*W'/ggI^N!b8kkF1sbno`:Pb!:S$f)[L30GO\k7Of +`oa4i^ALI"NNqjS0BK^IJ+"h5b/\c")J98YmH>'"Iks=IO#hIBf$Zu +ID?mkp?>g0IoO(Je2rV*D_+o6-5o4N:3dfcU-P!nLQD,^2#e1*jbuZ6`a5"*?fD!D!%IW+T? +pi5oo<<(2RI]Aj[N:l$=$oqp&.4LZQC'h?U@cW/5uN:q0CkZ6GfLV:def;DS57ULc1f)4>dam +Y1O_jhK_[`9jA<7-+1Aklk=Q6c7&r6&m.qg?\T:9#!XBW2d%C9.g["efnGKY6DX@%FT2T06C +H0CfHt=S8.,(bD:$;$3Cm?_WVAKK.7I:9G\f,]A*8Z13q#1n7B#(uAiU\G_\`6PrCX7d/$UVsQj[2cg7m\dcRJflRB]ANgf&R+`c4_@mhb"H9XL@MUZj3t% +5WF!U*3fM3TcB=^)#?_2B_C+aM$K+JFjc9H8,>TU+^kqo5O`hU[l=b:k'+'[q"ASm[Q2OOBd +B792NOJ6eFT<-8G.c)bPR4#L\R-5jADIWLPiA,C0(&W&5obX5cka$kWa-9;m)^Jk&1hnVP9u9@1=dVtGLBp46b`?f*F@@hpW=ln[Q5X>&8^ZU.@B?/+;H0G=!e?4W!tK^k," +o7Fu^oG[Ek%RW8rKXCPtV;cq/NX=Q]AgV%J>T.G$kHe[S2Bg<)pqKh:&S'3d&ZX0]A*KjPrpE+ +[I]Ad'=:9)5Z;ca_=iO?,[%d>B/_)[_!W_._br]A..B7AAMIXWj7&5)oV0i@\>oLD;K;^^>`)1XIV0/Dbdu(@n!0FZRrfbB3 +US+,.O#]A!1JZ;jjbhN`-pY5/WhY"7.01"gAqUJbr%Yb).:H/@?YuM_>]A_L$1Wi9=BjpH=G/u +jX$2+&^e9fp1_ZVDlOfppe;S>4JXkTfaOXV:!;`OfjVFQj*4i.o+A"'IVTubrP$e!CZ3IE:l1 +/j1RkV_=8pi>p6lT%qEWW&7!)=A)@MOco@C=q!+NDjpTBqd9A$rL),[q:X.Ydb+[#%mTYMZf +-%Ra%*IH`c]A,i5DOK2LPoEkG\LtSuULK.1IXWtmel_j$J8MUC#_*K`Y@e4GONL*"iU[T&KMV#VBrFgoPMpXbhADJ^D>cM#R<_1rfb$+f8L2N1b@PpubH%P+gs#uQ +_P;U7"\@!TYBCsF"_d#p+P]A#_&8f11K5sR^I7$ +)"o7!_+--lKT27T-%;#3h?^!J)=TTAG(UrHPKYpXsQRC[JOtFg'QH+8g13^DN+`WM=.2rH7G +9aXbFKaurnn3^In("srIpHkpT_%,I/hA\+HP3>giNA\Ckj^VS8V8\Vi1eNr/0(3s"NZ*,bQY +j+FSNW(/9So03*6dNonItg?]Aa,7coLU/APWF_sI;uJ.J?u#S`AU@74e$jA86<%3\i6*#Oj1h +SOgXncnX!'d+Ja`BA\r7&M3Lq?s($jEnH@$pB.=tUNDIWNUMlNXd<>9u +(//U]AXWQG]ACJ"u42/Q/d@.QMu,!IAUMdnlY\[A*Jk*f#=2Ormc)%@r1MkIW%p"?4%\N@T(/4 +u9'7R,Rum`F_<`15"o4r-NldD4^mn=sWAMJk7ilfUp9WN-.#fY +4Uo3-egJ:Lcn?/JMH!k6)=A#2O(_*2nrL'##]A:jWqbV".n'\_>L:]A0Fi_ +H:46YKd=4kl%e9K$cuPla_;\!Gn0g#]A[Yh#s'9Ke/&rZh.o9d!"o?\%6#S^t:%98fi'$G&B; +&'+8#U?hLsPLuT1hoRMSo4X6UDid^0UE4kjq6UD8H.)>)Y7_+0h'u\>2KGDOh]AS]AARhjcTSE +4k>JkiJ*0>ka$G]A1F;3Ql5F#tin'.o\&Q*T10uD'O/O@p(F*06&@R81@j1S +qBpWRc;[7hL;BbSQ%fnj_n(e2)q;=;EJQ8h:4\&GOrWP(jPY2tm.]AgEhooLf +hdM6_tj"$'Y4b&D\Y$o-0c]A&rcTlX/i2LI\ePrNmG.2JXnV`a;mGY_pp+cf^(EdP,7)AAb-d +K;uSi*>eE2jmR@sPGD'@LjDbfnAt)/;.W]A%b>3`Y'D>M=\mmBmC^bLA7@,3*Kl-;A4+B;mhH +-&V>XipT>]A1>$^0JCq1#rE:h0%tfH>'ADuQlY9!F49Vu0Opg-(Y`!ah#NVbRdl[s*0)k_HBfgH.bESUS92 +QI:/aC=;*0XeK8$V+&#I>b?Y&D]AAC%fEIP-&"\n$!+T4bY]Aj53ZUi9AM.*I#S.SQgH-1<:oXcmg6#mf#;jA +mb-'D60Y#_ToW*>bmuCNB@b()oO4H\%H7MCm8(jLfnmAf,p!=Dls&*=C(,Sp`R"T0SA*_a>; +s_to)D.8R80G7='D`#b4;bdM%=^93E8g:!)^-)[[%VM)W#MjsrLCN$o +&Uu0`R-2i5#:$TMdMeX]A=72GjOGTlM'>?3'JX<9c0hKUuN#Yp(GAg`p?!W1?=7ds?M]AHO#_( +3mL"fC.c]A$T)+jbj^eG%VGS71fAJ3rg#g#[Cm2brp"3UhU:8F(2a[))OtKP&&3FN[eR+G$k5 +1)YCDCS;#GiLMufkelLBW:\6-1g1o"M$-,H1dqVqe2@m_sD.mhiF,ns(/!>**IdlDMR%\^0" +&kFhP[1!o>IAjRd'R6ghAEgRe>qHH*m615JD[)=k:NO58rAF*#/12JAPfbj0W\X5X8MtbK]A +\OoA%i'[0?u.L/?/iXM+]A/4`[&2tH>^B+ncR=-%e&?TW4Gd*$46@PA^62=X@a7T(+G+unTE6 +<=:4@UF3S@8*k_@+Fu*KhEXH?DraR*+SQ%_5Cg2p`[]AWgOI_i6a9DM5ulsBcH6Ho4=`:E)J^ +UW89afD!s5&'G"p/.VSmj\b'Wl,76)>?-;eRM[XdtF(_s:na@=J&DY"puk9hoP\1qp[5D3P2Ehf_M\=Qi,@ +mKu^K$=r\=4WTG5[WHZ:eT&S@l"XB:`m8b4%,Y/-cH`PY`9Rd +J[4E8KN7qS,Du>H`XZm1)'-ES>87cd%lcFZMQp&5J@E2J,P0+!G8Da6cPT[J"rka0(.l%ZMk +8PC(YO\O=p1;'W'C=qdcIC\./"Qd,pd607G0TYc_tl-9od\K-;Dm%fb(u6jtrm,hU5Buq&e)-U(3q]AZ2=d;ohI*R(\Y=d +[k/p9+chgO5RH?]A(1c7FXo!O!,5`WRh"6b?gK%Q06+Sh`JANo1'2MK4Crp,V;ck.U,]AHcV@fIQlH(`2Ri(M6m[h4HFs/3I +?%'28[+XL@IclSM8&'5W_;m^6/:)>#j>RFeY2F&=(Mf?P#@h`9uRID]A43CZmiff9d;nt4l9/ +[M]A7-=q8#_6#Y0TXYYpYl-nX/S\:u>I:2Zje3(L&g9Wscm?W*LDa+P&JY)eF(!ZAnq'?W_65"e=I@MLDWE@X +bdfS2Qd<(?(>A+Pi+JPp"o2Kj2K9'N+GMtn`og4Aa0Jc6aS!r-;aj[RPq9b%U1WObSU./U1. +;kq?A+H>E8,3n77&o%7=k,^t>)9XS"2ijjmh]Au;koQLnEQ)U>5'IAcnh-"$ctW\fL4BG'+(` +UXUE`a'qF_4eI_8^f5!aT8p0j![(LDC=c=0QpH(pmS5C\mj6M,'Ip&HrnTDhe?D/?8K<^Q[9qEYRFb>2?f*+eSQFR_O*>,Uq0i"l>nH&o6elC[2C\64(JL*<89_@VFPX)8g\k.K9O?8J"YqO\ +2E'$5W2_GDak4q+RP%jVG=ZBi*JMm;rH6^HQ58=;iZI!9gi^!]A/FA>c/a<.a=jm?-s]AL-hY< +5]Afk8rEg$6b1HB#0GmcQ7o)$#ctOUPcO^%%Mrj?lKm<=`2n_B/[CDbNs!GUsk:K[mKP(4:f[ +aPgZ0;+P0t[rJ6#S(VlJ[ +(jY*9fuiA0519M1KR7UCpOOV)EBqhoAj%e/r5m'@ur0.=@.;cJ7'&k1+#P_j-`Vf+f:BI(GB +P+sj*UR"&R"K')T>rS>)E%Pd2?I;5\h7&BP5>T^@d=hBRUC'D1`8ggjRdSXklPl,JPAS(f=I +,[>FEJ6b_o+i`h=EmoLXF0s^= +L@WuWMEK)mOV\VoQSL(*J`c&*M4)9d[H\.hfKg2W7nkpK*LY9\Jbp1jU_40N<'R.!l+1dZ':*CM+IlA-e67n6$$g2]A)IR4=2WZY(na_EKm#)F`[oV,`=n=1bEXPk;b)55'$2Bc9*7eC[I(Q+T5 +B,Fe=F!7&qX\4cJfU(MPG)he/'+hl:]A1);>s]AHQGQ3R]A9X4F_P]AKjPd\Q#!%F86'/[TWR@KR +ci8"HO!LN4)>\uLGE12^,O:*1ZlnZ\"o63PI-V^5n47FFpB\HV%HidGJi@@iICVun!e"HQf0 +aK@EnLugRG5j?/ic +6+GYn<=$n?iLnKA[nfl2?_L=i+-VKdo]A8\P8LV5,'LB5\8FPZA@_=L3G&.'_+0Dd'5u.O.:; +jR.IRmAlQ.8-H.&\BM[c<6gAVU3+:gR5A^$',&Q;q'A+t[AB;iIAq*>20'Q[h=Lo6au-n\(R +=ZI5UDN:Vm)DcaaeY)j)84@O*kh^aF&\V$(nW#r7-s0BGlt\[88sf"Vbj8RhO<8mROF\Ym88 +]AGr<>GTk`d1GsZFIbZ[V6krkC7>G/o=K%lkL5>4:D0mCKR#=T9KmAR08L1*5+%g!dd,5<#LT +m[W5Hf*bWIOX3+Ku36R=e[f>BUoe"[oDb*BA!L[;.9XMI\dT9/n<@o:8+"3d9iNet\CGbepK +nXH^J;/=\OI?H8p8s=ROYk'jWL^TSSkUr;RJQIFgPM&u)_-XkQp_e;-Bd7.SuT\#Z^ +ZcN_Y'9NH+6jd<6P2[dQpI.UT0WgQ3BVYHRB82/CpWU,p#VQ&M4Z#!; +Tkb5C)8S\e8jmR*8;1cG?\0:M-[26^KZhF&g`cTb,7o,.o#`tb\Ai6GV1oN_+hnam +!NDgp5[IBJ#`fq.h.:nV2[c;TA4U2QqX`mc`T:W`g;@Q'ro^3UCSWJENmA\qkjfJn!f(CnST +D1?fF!rEDCVB%:H(:q!(\`5f8p1VNKd0#>!rXj%N1L-mmaBQ>m7bV-1FOa +ma7,g[TM/NiVR)(GZ#&ptmnR8?ib4CK;jU?JHjo_=MIXpOW>#Y__f*XZOH[A\l#miPXdW0K5 +"l*gT#(o:**-`BPph/`M2Ge'!bnn;AQA@:ogimjtcdSBEah5jrG=ejF"cbQni5--GfM79e!. +(j\:E`5`bl(-nV9pAIRqSWh@6tlR"Ku![POE2)!i3X():b+Sk8s<5XWO&8Xqkj?:%(mL\]A>.$p5i92]A%A*h +b;S(mDNV=(iM!00!uS(]A@&)@X/mUMdDJY:*i2eZ57tEc+[sH"[O7Njel.%lSaFt(aW4e3q>$ +q5[HN9*#I-S6PK%,-V!@;Ds!X+R2+u*5p`heEpEYgLrgq#[gC(q?%B`IC/#J0c$+%92R.-^% +-ZHd2R-FP0fdZe=$OqHW:R*1Wl0_S^so2*n]A6geK(XJZMRB63]A`uGF?Aa^92$2*-!58^(: +#%P7J;:p9,j"OA;BC]AKR#Uj!<]ASP0]A#--Up7?()RnR&1/@I8YpL&r-T4M!kV7lc1YX6m?V&D +%W_dPAbIeS)rIcU'&CXT#me-U]AqX-*&ni`7Aere"nM\(,0b=m&OK7A5*j]A"LBKhMPNE(Gh7:gNWBbD<*qR:L +b>US.O>;;bm;7%EZ>VR*:7M0YS/B?8Ng$3U4$pu6ro%oI:!@ZKZj)+H\1i:)Lgg(M$a`Sp_U +FE*N.Q7Fko1%cqa.Mg@['9$f8Cu+lS@Bk?`P%s!e)d%qrSNG&A9Qc-]A+7n0C2Oa +89?*Vb915 +aR]AkDQ`%9:Y<;SoaJmU=-"HR0]AHng#h9F(o,$WGX#XTH"FN-Gl10@nK,K?D:GH[-_E#;8)r\ +!#:p^%M$-;8i?SU8kg0NV3b;KY]A=(sL?GcBY$-9_)&b`#L(^U]Am+IFOmGk^\c$mg,FJPJA.n +MOD?j".(QppqZ+f8sed0$\FjHca-(&jZd'[Y/DW.]AfVM7d!RGWfa$^Yn@mT!jiM3S;,'12:; +a16Gn`inV%X`[uF#o?%<2opLDB3M*;IS)8O+e=PGd2_-(*$"l&"=V9.^*ORQQTL^W/$XL=@]A +SM?,3"_;($N]AZSX^\+?gpYD6gb&[L2t,X#V"6$!,3@:h;4ns` +-,:-iK5&EP/b5m0B6,0'_i#o2$C:JNW2@,^GH?;s.+#!CC9]AU:M:AtN[Z4:sCqJQLVFs'7TC +/]A01,S$8>!r! +FV5gEu7X\DMc&#D7(i<%Y0#CKm-U!<%28m,BQ_4nR9K+>VgHTf0:bnI;u>abBP*'56CEV_%M +'$#`[$;0$b[/Lpfm*V9.T)G+r;H!7:U\BCV4Gr(9_]Alh6E:!>Z1p\o3quJmF_[nq@;Z=DCCP +H;g'HGT3robkG)q\sg*Tm`m_jfe5U7YjPBm!:Vc3^FGAo8$D^,fC5+uKC9Y\5]ABWI]A\^]A_%R +*>eeWS[YqZd@u.$*elkMoM0,eGhMgo&D'L0c9t;n)g@iIE?$V;pK6Q!/C9_NOT,2DkrKU)i$@>?6LE2E8I2GPk2@GV-9oGZQLrL!!!"u>$GV[ +%K@-&:CkZJKaO[GrmTD1TjQd*buD+%L'Z6`s!P=[ONaP'-:?g)pA_,Ns*og_I_-b=Bn&``Z@ +1,IpT:-`X'D@n4QLt~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +!d:/]A2I2iR2>^71+(Tsu%MhGW5XG +.fGF(tJj$3O`/0Vp.a?4J*eX!a\dg/lUPc4*O=f+n(WMV,lNCd3%?/p_?0p+S3*[h"/E-ka` +4#6+$C`#RV#'s+ef?EXQ5$g)`bP31VaaQtZ*L$&D$k'rJ^P7YIs'I!;AcD/EBp&G-11=V$c2 +TE[6dN^Nmck$6mse@QK`S(Ks7>$ZpNS_!/?f(R^*0ffm9"d/3-LRX5 +#5A+c&ro++<]A1b`bGqtdGj/!<[kq1W1WVUq,jC<;T]AhKO;7U:lJPf#\sCZ&:1Ou#U_V>9EZgD(rq4!0%9/OgU,@A=J")-jop)e?X_^p8_s)b"B@*E2_!C9hl*2L3-E0Cb)'hn +)mDfCD>\hu#B'KgQ?h8]AOV44!Vr)R0)`:I)4o1.S8sd-Molhrfs@<]A\Y"*EUY]AT8#,hCXu;!FYlg,-H/L&&bYV%T-L*sd#a/5h'u'-7Flo7 +(VchQ-RI?HPhD5)$>?H*a3 +d5.]A[$LA4'WsLS*eW:0N-=a,3Kfk,.pXnU/e_K/Rc_/!jdj"A=%=coJ]Ao8F6pk=RY@;J8=.> +?o:9L`C/f?pd::HgZVl.c6_NDi0O%d=Q`[UT["5mK"!2E +.L(CB85MR"0r:7D'1Qb5J]A4p148;>!dVg6X@R:#Zc>YG5!NY[mqWD1)1[fOW=+:3ZX +k!^WOl]AJ]A>3^1isUkr?@qd^`6!*+`7ha[@%=-,$4*[0cAH.H<;0j,B8Cn+6CFGdg;![p0W>3 +/bikk1]Abd>%B"7--6'rhp_E@=rakNWQ>R-9hM(J(?h0f%`;CsDf1V'be_&@fSMVo7rB<2ITM +m,(2Mg`FYQh'P;(qP*?e4AO)DtkSHePfSG&"E$J*FN9OOWm1Z0bq1AUb25KVBTQ_F/ZP0enMhK6_&sC$ht.Z.nU@8/i,G@bO_+jG)*o/fq:SEhJ)/@aI.g[$")c*qX#DtKu)82)Q%p?-rem.I+ +X/]AcgcBs"qJ;YKl$k)ITIK[81ur,IMGN:2`O#A+F9[F.`^OJ!*"*^dq!0"idk6/WX,c3s<<_ +Dif.ai(V2pXR7^>^u@sA_1u!5j^+#J.e!d@Y`&`PLuW@UlM#5.n9Im&TNb_i?-otEs6X#@2Q#Tq]A0?E4KlhNA?#np,d)S.h>)T50WWn"BS;>aiG/modC4VYn9_HAP20s@_tqW]AWN4U%[a_6QLXJ@;%KNgFo9PZ"n0>c) +FpW:EhA!^G/Et4;F]AO8"im)>!UN`W26G9f0^t_GL_G3Ci,9>gWfK[l_GVhb,:Cr:k*7B[rXX +9j'0Ta8qQ@@MreV89p&cH"\6"a]AeX;,Y)C(n;2B@s7;K("=(_Mj`7(60oAY6tCOW.`@$@)FJ +.`K0U$Ai>\_FJ-9[]AfR8Ncs@-B).'U6Q"V\9?lkJ&6-IZ6*FQnXW +%$Bo9\_2BO'@ZFEae"#+E%j**X.ItlD2F[C&EVY4=nK_r8lJS`#\)3#/!_Z. +9:d%?0QJ3T"+k"",A'8HI",l'.BLpb-.6MEiWN:f19MEH7^/^3aL\[fjd@Tlo>U\5Klf(I(l +ak\W/*K.\RiF']AY3ATehT&iSTZ^j>p,c+#sunWPD94o]AailLJf +Xsoo\WVd=MooH-fW)pR84"JhETD7+5[J1+rHF6.lFCl@K84<34q5J*&75YW!J"m-BPfY4jj* +M$QjnmP^T673JAu-g`m'VDkL=8FD6.&P$'=+A#2PX<4XhhcGCguX=sGaQVq:q/l`Rn^(LhhT +.E,$'.s0I:km9aH=E*#*IL2#T#$oC$uD)]AU?n<=^k>q. +^@Yo.b!:/ls-*FTU'fjW`Wh8'u`Zsl2L=i_7t>14^VY8j@9nK2^>8OE@_9T(91'%>k::fCBCC2!t-kID1$CcC&UW$>E1?$Dc*=IISFNJO-)rC +[oT\H]AXUKg,^q?O0GNUMokNn-9P+5W0`gpmHL(gu[LXU("+Nr^JF&P;Qr2-'q($RGN9WPe#J +%kMOM]AD*QW!e;Y4M>s;DZDDW/D=r0[%L9!Ke'dEs>O9NZFi6(;NmI)+.Y;#d^V:k$I,Qt>!.['K'kRm.;.qoCtA\4V1 +Wi;;#[G92O]A)8Tb!cDV!%)#A1HCTbs@:$rhIKbVZ;ftO's[E>t9mY+>;.5.,)*"H7mp\=S?CdF$!l7MF3;]Ap2^R +bjg"l]A[[P=LXkXmA63)>7qpoGHEP1kNFtZ%FPPRVn/)G&MZ-66j\bhjtjl/4@&HVEM`-1 +eIA&f4'l-eE$.m9=)YS=^\*p9@H8+TFV5ddCuBPI,kd)#*R8&id/.b=+m@Ce,g_rTa]AmL1IT +TE(V6ZIFLl?I6CSoA[7ImV)Tke[.inXY.WJbOAPmdM$&bc$qR\,njn"LuQrb&A#re_]Aa)NpQ +&PAh49atcTH2P9PC"mJY1Tb7aBj&R.0H!Q#C6AdpI)YCY[4$L9_n?eB$EJqlg\DDKG5p=:KA +e=_^$ZegXhkAWIrB?5m$QFVt_!DeWBD]AYPV.lV&Kt;U,_eiD0;b,f4MCYf7YM(ultkE=oqqO +;JKQ3UO2?@JRaalC_!N\;^0"\]A]A=$mk3QB:T]A>[H`>O9JS/:EL'`-9#MP!A!L`OJKJ.hhQ^s +UOU)Z*BD.C']ACppXt7huG:i%>dO2NaiLh6G.9=RLo;_r+nnX)Khg7CpOYKObL-?]AZ^/DiJ[r +kbt]AG+Y:SJX7E9q[M871I_b7_V\`^=ntTg29"cjs +j+Tm?T*(P+b4;SNo\IWLQYC@BMi6?njru)\l3W,OgtOK9O<&MlR#%O\j;>QCR;IKD*8jdX[O +PTcp_goC=+'/;A31-l?Gh)RL5C>N%%@Jq'G(Q*!";\85]AEN&\MYl2k%Z9HY2)pFT\]A(3uMBO +Tq=,O!YOo/oTQP/WOCj4)5S;Ha<)1DgS1(o@C5p@o&qlcZK@^F3V/ +g%m<1buS*IK(i^3DtpiWp.mD@&"D4\Jmj2n%"1ioUH4"o-N*X_;PF-k4chO`uib/ToOAu-Ye1OH'V?]AP1RcBjSJhEb,rD%"cN!AdP11e=fNIbd'C: +lESC.J'8ZL_PCE963T3thV*Tmb/dY$0+^U4K$$F[XUV'UqjR4]A(-O.GK<^efnS&cK`r-m-tB +=*"o%#4u>EIV):4>Ou&8eHI=$9?sXcq\,(B$":]A<1?/->WKLI>`A:*g`KlJ1A'I./3-_bDnE +VVlqQKlu9:5^*cD137-a@mE!]ALl7Y9D>sK;r,]A.H1Rea`Tcrc)8O/<&Wt*pKi.Z7";8SAmSk +%*fPGhbL4?-@)r"![oW[FXrX=*cR>QI)jEuG/,F9oCME@%:(Y@i0dFJf5/Nh0d/jF\Y722au +035E@O@?.CU9Z?M&1CQYBW/^+>3oIJ2_N1[BPinHj"9@,]A4tU70ag$61jfm7.)b`)W\33)pU +@Wt91g$!;NtQVHN)9!`43^!2E=m@SGnR-JsR=Fq&am,XTgZ-1ArXQ-+R(>2%<3/6hBY+HL(P ++DbC%arRfm2IFB2Y"!P0OI\u9 +g'Arj'Z(+)[,f!\2S0*uRj\NVkY0Q4dZ!ltC?1#+Lr:uu]AOkuRI2c]A[cs+uN_:+PY""Vkn]AR +BdTY0)'mGWguU@1Jb9U$;c%N63_"p_SQ(g#8p4uLlm'r\n#<[ggTrrJ&=dj+OCH-:`K#fO`!n@6e3pP`\mO\^cr2sA+_1lhDGK*=iIO`00CR;) +qs)1%m?pj[_V2oM]A`&HUB$aqIi@qG:F.JZS(OQt$>_C7?Vp>RG^>*^8h!;C;+nn,dgBA"5K4 +Vd%:O)`mS5urM+.>7Gr7AZ!f!)]A:.`VC\TPbd2 +rdNOGX1]AfnV`9n^TPY]AfO3@7f:"fk5\]ATQ@:jHj:AX^\IjegM>-9%@>$IS?!Xb\X7UR2q/'c +KqIGnejYO+`K]Aoc9:35'/UNcnOi"Jhp(/N/W2$V/H_rLs'*!ls>p+,*d52""e*>>Hj,8uO/B +Cr%qS(isO(7Ffj.pZG(1gtPE)o?Pu<<,)pB7$b"-bmNRn'\,T@2l3-j$XB4o:#duQmT(#m+? +6\f,,n@8+AOi3f:F5^/B+@V-di@G#a%&[sfp+iWAVcn1UTZ(GW.:5j3N<6f>FG1A75)&EC[CFtP4O60 +l6TECj:PahDfL*iG$65@+'YlsRC82>YC/eG-DX;]A1K3@cqp +:TjRpnXgK6.]A'gR_aa+AFn-dIGrd`8^d1q-0.%;s"S[^sk0Tes"37__)(OQo:Re,A +Q)c24BGf+iGZ]Akke0+HnkOR4%;E5IGV^4^Z%fHp:;@?a:D-PiB@&A"t4llcDO.gXrKe?M_^D +'9M?]AF`NiYSAgLLDF]A+$l?b\"^goO(tA/$;#dZA,m0)(/Dfl)ZKNU!]AkJ+M\(D/tZH64?e?2 +'X@VM]AoJ?_m//j86=FA]Akb>j-HHP=q_J\4on@SK$"^PF9P:G&T\\P^A'Ob"Q4u[*%ra>YGQ< +)U:%"f*5g,k;@BEB@:s*D$1bsUei/m!5.aHQI:i0gc%^_==EB2U0L@c3-]ARoibP%rA!5d\tr +(#.A9*hH)6^pT_/>m`X+##03_\#'F5L)9/PdtoQk:XQcF^<6Eq8M`1> +[,Ns>mhBa^!sa@Y*TiV_NPIWrn((PBpZdjMe6"cAk+A+9iTgC\57J+Q4!'[>;",5B +%8iq^dIfoF&O<,.?(qZ2^\QFWu0Y!A(Z_Y'D7k!kS6,(jRb>/ut(EcZ*rT;B-=V9OC"[WRKk +^Tc-ca^qf.$ESf#I#qMqYq:k_SmiNM\_=Qq*Q-EDOIecZ\Zr3i]AE)LTVT"3uq8dV(Hr@nepQ +O+dVk?)6Ras0F)Dm%eM+mfI&M+`m)B%!/bBD./FXI"5LsTRA8WtLZ"]A+%ob_fUUr +:k&\^o'mG.f1kMY4sdnci0B">dJa+aLt@"Mkg,.9R5VNZ-4r1\qTn#XKadKN3,Ie`:\rl2Te +_Q:OtK33[KL>U;5ZZ9'+e7LS[-6L`DR3W3J;+bH9`l_?5c(phP[siB?=!11^TkT#n*Y.4Tg[ +e0iU"he#7:Pe.O6-0(HOn/P5B!*]A`JO58bs74NRS4m>PL!rQ36Vff?9BF)2+>B,N=;q0M4n/ +BDD!")p4m\-C<=L%`u'$j+h".=W0-_MNo`m_TOdp49WZ#(949/!Nc?65Kdrc6;BRV1/(WFU< +.a`&JjjdKUqA1K'l+t;,XhsO2suQ[2sQr>H-t<^N&j>]AH\?206\S:s6K:A!b8T',]As\4%H?a +8\lL$6S71.WqL&J";@Nt%R+[Z12j-bQ'D3*ad-pmfG&/nob(W5BZ4.ZO%&0U*pGA"OGXMkAn +hZfJ=[&MnFO`Nr$OZ/??@uXE`EJPkt2\&MlAQ*Jp)[K:/R@mpTm-c=q:Z1"]A^r1FV/#oGSj+2iTkW)aVLTACQ'#H:&+mE>Z:2KLtR+3j)6VB>I/4c(e?QQ)X`k[f2B50hft+S?#^pBqf(KH]A3FDk6*6/ +#9V@W2c4;B`qL(T=5hB)FVeMR(`O,2NBr_am4A4/Mcn`DddKBX\Qr`,8?s-'-%Lhs/AjLdq. +0g/@VeFHf0C^8AJ5h+Fh&'I!R:%*4JjrR>%(l#*ca9\4X,<8qa[qp-E1tQD944(EiTRIT"M` +SIi4C7-Ig0Z!YEl[c%",%O2]AuVp3#:'gSm:sQGkp:kSU,%"ln`5NK?O0NDMH^q6poL*5P'7t +l-a>lhQ`Gs,A%!>,8[f<[*Es.Fh.0FBZ6M67`'-2Hg;Hpp:!`N#j2Sl+0gc +AJ3NOS%hPCC('B"V^n=5rmd_tT!_K-$6<4L29:q&j(L3h91u"N0*J$6&+U)1)-2q#7\XXEA4 +C?Vh6-MpD$JmZ6(-?l=D,(jd,u=NA`]AeATGjT<`:oY;K6R#VN+`'M6%*bYsgk`WtIH"\S&USJW'nomX`8CV\2)sr[.V*B[JgcGIZKGmoX<46V/!7SGP +;9P4pEgGXH2Y,d$9Z_"AX@iWi2*$ELIDg5(At6s\9`!SaU.LfhR8diM4g*RX%0Fr,[H$*5>5 +%rR.bVQ/"E6F,.EQe(GDM_fGk;8S0&['-USbC6#+-0L)[YIfLFZckE^;Z5mOHc5NN]A\gE?ls +q?W-1!LCQo#@">e59)/g%Fr/=Ss\dI5[E5=]Aducdj9Z4CU!'<.W7LaRtTH/c/U?0-/[_M"nB +.GQ5N?-/K0d2E-1E(`7oERD@JheHe9QPlB.VNi:4MJ?.fd>]A"ZBT7:EOK.EIT_4K&hQKh6T%R2HnZ&uD=cU6S4/GtmN@W*Z0o.?-+R\Ja8-*Wc8Be]AY6FS#,W[7g@h=7-g.`^o +f2elWGbn/YZ*0J0!HWul;u*c@lhP^9dTq"(OX#kV?[;lM./5,7_g`@Ddn%P;YkT4(XWGnY)k +,;qZ[BI?^lR)),$6&7,&%m9-p=OosaZXd![;"/BRI>8cpNuAE50eY`*:e1$pd=**%7Xi,X`4 +5K%\s]A-$e[B:s7icLeJEGj9.rYd* +=N'i3lb?L+0`Bb/)b*7"#1^-P@1pV_tmTufN2@@799,+DOC72aXf3iATVD]AL*#`#cu&fZmrK +-VdC(2=N251"?MP*LppF_5eoV(\O2`:G@Ff4OHnm*`#-+Xcc?ED1Tlfi3+t$5`K&m_QS;_>Z^omOq9V;!&([shN7,CT4EI2f?NY_$q,'W. +ZTH0!F_*eB7D,=-uc'BKh2nYYTus&+(1&NscT:6,f) +qK"[qLRW7JPVLl2jp#YD/eEt4Bp3Cl'3!22G<9a\,Pp5#fi3A%$4Q=gM36*G9Z2u>;cJn5@c +M>R.keXOC72q@Tu`P[gDJfeZ-@7F]AX%\/D4[aSK/YsIkMuP*1"5aL3?fV=X1+^!i?_/kDYE: +S#02QFGc^8fSbM7tY&EJMIjSb=]A!EH4`_s]AoE*R)lrQ2J+_d=87/,I,<,EY.$kUD)Z=1oX[V +cBW^-:?=(r=^f]Ae]A)pn)`+a;*I[Wj%ct713%9T)2#g5jS7/2:?(C)I4;X48iDVo2..iQK3t0 +1Z=uX,%++-hfAm`!>(i"L^?`lebI;E]AKoiA%ir^o5`2kcEJe(rD;C%G_t +CA$F^?d6,1LDm-Cb"di3W?O0aalZbH.:1g7!p0eHX;5!sV8;Pq@hI/I(&A)jOQcLN8(,bUPJ +D.26jeafjp+]A7FAHNQqeqm:P#$KArP?or4WUpiU +2rq28JQ!,JKg4M6B?(Auo08;DQ\-_,=@@$Jnud#=)kVeUX"\`<@"j@#04CA7C8(:m3so-E_X ++49_cB>7Z^m&l>=*,dG.M@2F5CZ-:9,@ +[TV",Qo66BE`"*j&YBdhlcaI_+s8,uqsE$`HmuM4u>5c:`"0kaI.T/Bdo=K,S(Y`i&]AWQ.)) +0l#>0TJk8\>!857:FJ=Zs"sm[bmM]AM"2Pe_jA]AuYHSUVnhEbPP@q(mnabC3JrNuN6451LUgl +:qF,i&A!KC*%kOgH/S\OFFHIbOK?1"s/[/g2h3K<6pf22d9@NS!kP)Z_1-O8IleuY7t3IG#^ +&G.GAj%EmO[kRS2cS+/Yum.44rC?U$b<9hA4J69;Dk^jt3&a;&Cp59"(kIR'K=p):ZYV4UMem@)>aE9-Z\f +$3Vmb]A`Cud="`^nsrA@`B!;.G,dZ$&YX`WbV-;H__ki_2%]AuQGdf%ufh-m)S2gn@k\($bX>njJWH%:jHoG +bd]Acp,ZNSp\5Mo7j2Ws#.!rIHt^280H"Rs7Y!G(&:UcGklL!S8GFcoUQojSo(tLgSpk-c42K +u$n_St.P<(i^CWNCYpa4&J+MXOtFtPYRQJ:;kP4@+:aJ9^b2['SIW@*%b>rgZ^l:Y=HOH*@U +C]A/#i,aOj4X4MFH<#tP#$jb^%gVRt05q)&TiG4ZfeHEXn1TAO'>c&J$NBifhlk4s+PU)@NNo +p_FS_('pHf)r;nDUK\Sm4)k>a=oGf_[;C5cK8F&S]AHe:<]A?lp*8YtT;hc%3]Ae7PPBA09pRIY +ml@]AGI;UlYP(BOq1Qr*+V3'U)?Hj\H.,K+ciQlZhb\/EA,.DWur)]A99_U:fOb]ApM)rJ&4sE' +;%S080n]A!V>@COj:()=5#r(YT4:!]A5Q]A5E9%9F\IPkY^>cFVCJQQ9]AZf4"JD,;$1APQb +1\TrL]Aa2""B]ALG1)"gpBf,q&8fAWjiN%!PrSj,L9(R-#PT9[k=h\Ca!\CqY\c,\Q_K;:`B>` +PG7,&.V$/s+j^83%sV@gt-7$4l:(e6LqO#ZX.$P +RoThM*O4O!jbtbC^lj0ZR@K6YpN+]A%^7),(r!.mt=Sl1BoYFj>ml*f8uKFoAS&[VrCJ3\]AOK +soP:=?HeMo4"`E_sVtB$k3C6BqdY`0ek-S/=;rn!e.R*-Egh.NGQdJ<]A +ds0gTe1BG5j`pJS?-Yd"sR1K^VEi#(PN6&ZogC:q\%uMc*dI01Vk#"`q1>!_C"k/kP=h8 +W_+9'1QiG.`-61IAf(#)8`Vo(M'l#R3/&]Aq]AM?,%l:RU0)4('-bo;j5ST86VT4:6',m<2rE_!TGufSrH6gefi8XQ8dRZc-1TeD&%+ +]AJ58-MPV$aj'%X;IWnEl7\kpUm#@o5VuSs,+M^1=Q"YIoqB/HbmuhmbA-nmJ"+.-DXk6L*f% +j8i-b]AOE=Q;AaYj/!P(Y75q_ojTO@G>QKOuM%7#eJD1DeR0AO"#.QL_ORDs*3MdNFGhd@5,1 +q+,!nAH2S`E4UN6`AE"EPf5T!Hm<$bsAq7.M`fLqQc4YSj",u2uQWSU0s +#(qa6t*?g;*t'd-t*X(%>?BVMoGY+G@ODYJE\7!-:]A!C9QXuAK-@9J7)P\Hmf<6dB@ +Xr\pIK_!_#1T"kJJrrmemhaF5q,gUXF)&lWi]ABOdqQ*g.@kO<:G'LOXF2]AsZXBF+re)%V`7k +ot9iWL`*1E-b`ejTSlD,IC*cu*[:$f$dEH9:`Fu2@:1]A@PCOuLJuRrBm\!OV63f\l?.`[aMS +\ZF>&n4hnh.UPd@sH6mh0rog?La-'jF^!I&l,F_=EsgbZ\puf;H/P$S4i!1sCq!)1k@bGKBKGE[PRoCMZRGqYL +Hr%>0phBq-4@0'rq%XYKU;N5Rf*o[\l.Z,h+H]A9\>^4Iu>283urD,>$!-\T8W`^T\T[WrBc +7\"th*Oai_DFQMjUrL$d]AB^-?13;cR&fErp>:Dn/4;LokrOTg-Z$L$?kZPTIgi$t9D]Ac^'+e +FiFE6h"'2Ea?k*F01pED:;'RKA=`m\\G34Z;==2l/ +Z.`SEMP[!Ve>lf`FUC/TG*$95fVnaF[Z!KjRk8Hhc2X4D,Mb91 +6=_W[,DSMBYZ;V--RaokE0Z=+LrRQ*$X.6i?TJ-=NR`c +&">68,P@AqqhAI/)$ZhFO(OR22:(8*^B/HM@oM"*Mr>a%_+p&F8m\IQi)'f:W?9)?/hE&/'q +'picUGmZO2!uUq@o/kp>B'28RA>$B&.i6Oc]A9&n]A[NBON-Q5L\N2#g_Vhh?kFG_K1Vq6snk% +;T8&Y.'3]A62;RtsRfJV9C)Y4HQLq<\;05 +BhFD\I#DdKRI$h700.+6DDPa*7IGkn>a_VXQ1@E6'+u+<7V8*r-` +4474>!\ZF&&j<67Fi"uFcZFV!pUbk[s(0.R`(YEc%WB90&DH:h`"YgdWI=33E-02T_mL)_LF +4HU>$k9qAKl'$bg"pj(k=;oJ\obE]A-Zk=5#cEU==&2n@Cn@)r\qGN +mmA9GASR2A[3Y'NKIHF1]A+_0'DS45S+ko2epTpnjiA)#_0hB.Ngsfa$I?W8>lqcq[[c8/lkQ +ZP9pr&IMI/:lM#4nfqSg.5JE"]At\$:h$3LBa7js"NQb%sI`j_I*:$cL$r!-0IF+/;tMl)EPJ +?$H%4#dsu(2kV-I/r1K81lI%,_;)_^q3cH[Zg,MVfR;FA6A,.pqLd?;Lr7%Qd;uIlMXFV?4; +8DlRJk`L\en=^[OEhDt:Qc:OS?mRIL!T9(F3#hhrfmj#VO%EfWI"V&lFM=O/=HP*\F@#X-4@nlX=sZ" +fZ^tUdZ!;$bEU!FX^"h1n)QfWq,*R2pm-J3U_O?^FnYIYiK +6]A:p,F-g*-M_k0oiE$Hsa\X*dHar_\^h3fW(jB!D`/Cs<'^%uYc;&PCeH-7'rjHS:N,+Zja- +eoE0s"aVD/nP_oh5\Cd4,UF\Ag.2,bXrh%0fJbE"-UHNjTA?$!gWLpEPLS]A@,sPZ-++YamE, +,(LNB`799De)P(uo\R0@u:8AP<+&LHK.Q`HUNrt'Joj7)Ir*.;I.A8SO&_QBPs-R9E*j5n2) +We0(10*WbceZ$g@W8;O9J_\3:>/jK`7dRji<"#0t*tn2r>/0/r;4lMRj?`:V=[_.M952b?J! +K5R$Jg:Kf/iX!bPe66V`D4XT="AS[!WdBKc#Dl=%%4"pE\$rgO1c@7hfGhK]Al\^k^LE($s-_ +HZ_5]AO);fH1R^Hn(f%Cr9=TX^?gDQaib,/J=q' +t3N;KcT2NgG#WYLtiX&L>RS0hF3sbq_*pr(:YS_id-Q='=L"TFYHo%k4-U5^\sCb=h(FfXKs +ZDMlO6JTkdS0P@*6#6JZOMCh7l]AphL+mJ%@./&G1e9nS(,7q5]ACr2e> +"J>5.c4Jr2gs=Khh]ArSNASbLU&a.J@LT60IjIr3kA#NfSm]A[LlY.(V%%rU.Kh+'p]A2&WT*=$ +HSc=Sk9)dSW`@>O +0]AL:t5F-Iio\>Xudbm9@Z\j6Sgo+g9X"Y!YqR,QSX[,o`VXr>b(KQ,sk2%3C,S#Bpu=nd$K; +!P&7D.'>JN4AeD`UsHT^2*0Eb*VbV`!E:aml)P$N4+t!4:rt3"p<;(HWgG[0!Y`5(!sJpGp]A +.:tbgGI07n^nYeX(FrEfa46$N&gWen4LpC$Eo2)7a,=:BQ8&06r`6E_V;&9ZN<"4asEK[S#> +m@)^'D')Z#h/ie["Xi_]A`gdA*`\]ARb^1j>L/*?(J0Ap$DOU@UJKdU`.T"]A:ap5dS.KiQ$2Ab +0BfM2.J3?/E'?@Da3<&]Aq-Zaonc%bM\fqL%&^cb=MYnAH +#`XW8jL0$i>OElB@o4?QhZK/EOt&$PMbR\iIUXg;"fIW35/]AP?;E6+k'q-U%3Ne!e;DGc9ud +446@=`9F_p5g`3$$^$i>:W38p(!hbJYO.Zs<[VC8U9U3r^1/aTh:Jn]Ab5m')5T9Wj+s3/i3) +\M"g8E%<;,BVQ$ca,ak`_N,G\khf3I/'j8RM`9:UHf`i&ZKj:IR1#1olBY( +j[@6"hrBWL..Te/6gus&\VGV-p!r`qAqO2P#qR9$XK7f!p]AXh"M-NGUT5BD;'H"IP`2#"k6I +b.mCbM/`!B&!*3$jN.t.^:Bk['hetWFJ8nh)h",!d#(ZE%b+4BWa5n.3ck5>'kW,7D6C"VD) +$K-[D`OICV=_rG["n9n-gL9-_QjLCuP.]AIIW$lC#jB2382'G\$31frC_]AKDRrBePIO5e_BcY +@t3&)FL$r50n,k/Zaa;3#lAr.2*eh_63)HEPUBYb(X2W.H2?db$DImOg*9*7&VDiRmW:lPR` +t_\kSWRJ"TV)DM=\<+A:*R$R1Mq&oiOXer6Sm_n)p@c#G_jhH2?".rd/[@S!-iohY>IC-_Y& +qmb,aND@fJ*s!<=-2X<&Pa8PbF,7h+(d/+b#u!goU<4*1+K5YlJbFQ]Af0Q;')Zq@>e"ju2GX +fV?aOM]AQW*,S/p,M-YR=UA9ptkKC*r1F9;-/kd;48e,=hW3,;bIU,UG0lT)mp3bjV[cOjSK( +CBl0n*,Kd7g`sKn'.8B^G#E?'b*WK))57>n@A_-=.^F7@$ca&F'/#P:U:K\42LlSb9j$>6[g +eAe%!js9s3?g0Xe+PfFF.sG5%KIRR':rGgKe]A5,m,p@SU?#C:bG2

f"6`5.AE"n/#@dsR8%f6h@-jt!TTh$R=_e1A1a +(NTNpZ'VkW#H+X1!fCakFRKQ8^?^,T.&KeaAL4EkfG(P(peJlEflqkTqg0VfkiWET6GQ3YVd +4sc(CK6*r1j=6]A*7YmTrG4l;^$*\/p?V&\%'a)EiYuBFm4c!57BJ,AtH_^hYGh0Q8bX+P7Eh +\RN%=-[.04q^V5C*P$NUh-Y?FKn_;S#jPR"2"7nQ>YR4G?;*F1Agg:(g2`di>\G]A&3V*!S/< +2`]AA'*dn1PO\-TeAjm\^'rGJ1$"(QmiFDRn7)bZ<2Z?IOLcL-t:oY]A4ATr>MJK/d#g5k[\dq +X;3k3C><@:9=cZIZO2VKal@rr7-#H)g?<5ImqLPWOl!dHQm2a%*(bhG'iUbs[gj*JRR\>/:u +46+gDp)*X8(+tH#]ABGd(j/!d-#:@9Qf7XmO[EPG60W\YO#,@R# +AO!b&X$Z'9hT02Kco`5?4pb\"W4IL04)Eni9:XPULTFS3=>b3@M&!g6aE.mAa_gC70i/!dc4 +n;bL3C1\X?TQ0\sN'?,m%g>*YaZeW/3=I.0Ve/M[RT8!lqF1#`CWf3@g>\%nuZ)'<+Q(@4t& +"qj\B`?-PF>'Q'5n!cQiQ#:G`Cm+$N\^"Ms+DN'U:e +P=u"q6e7*aB^d["?f+'P]A7!_<*O"l;W+WI&JPoFG&+Fmm2DkK,_58qhoidR)A2e6tGg%1*@- +ZZ`j]AK'0G9"6M8f0;g4@TbMGUt2.eRUG9P;iJ\Z7*B`j46FR?[r#;= +c2>(5<.G/]A8PSHQd%?Nbj54R!Sm%R[s5RBldr>ti7YnaSj*,,i<5Gf0@<3&0-m,.)Qhe&dK= +uKBQWXo_Q77C;.p'/XF1!m:Dh=ia7@4.!XV1+piFDN.aOS5JQ%5q$n7Jk6*mD$na]A7$bE^3@ +!AR\%oi3X?l5&c;I8"MA(jY%%s4SO)'0*Pk$_MdMPL/Q^)oFd?."FWL0AoFgE%hbhE@;A-H/ +j]A>&I[Ae">Q8.G#09gD6%5H9@NS"ZSb?MRuZCb=<-sN9VP&DKL'e5\IC7e,c#mJlFr/0mUMQ +hOQe$(4FsVSfH(J^_a-AW)]A!B]Ai'87ahCTF-nYE67('o4lJO%!k6;>;#j7J0J^;&Yg'AF-.9 +mCp'e%=RTOQam?b&W'I>\#>DRt+`fYtQH1=$GM5@Td`]Ac4#FZKB^V<\4M9;V?"bE#c@tr?sI +,eDt3rYCk!ofG_PIo`qP$?QH"*Go)]Ae7D]Ao[BPDYNS("oJ=+EtU+WW86n?X.+o/N9"rrOT>5 +DJja3J%UqKpml4i='>Q$ZLBGQ@'$C(I=;!/MADbVSadMfC`i"cp0Afgc/r6b\,&2pRuTl7Ym +D=R:cCqI`GATZ4'Y7o)RsG!FLXjCQRi9^q3KTWo>$5LGP\]AnI#acT_,k=^I+f'+Xc5alr9W> +g2d(A4M^"9#OQBT3-mo1.JPa8q7t"^^J]A@6F;J6Vuq.'8<,HIG$;)cC+@gd12"RUS&.p(B?' +f9tWm35`qS@DkAY30dDKYeM(YZV#i02R8u-8rPSG-6&!Vm2=YYG:X2B*C_=+,@S_@Y,E:30b +sPCPnTGc-9hDQcVtN1YgC\"+=Ue:V,:iMm?r+\`:!T_1fm5ih:slaj(WD3EoQ:ns=BejW$cF +?/<:s2GM@'JV5ZpKu(0]AE#?gB$_i2hfnb)e;EA,6)(D5dVG(&sRk@L5`?PlEe4SCb +LK)[egU(Tr2P[E81rDh;L.sm#DH8EFN?&LP_JZ/dh8te@d3fQ%e7]A/>T=;5AR>cl +j]AWHQNuV9PmTb;I&dDCVB@Sk=?'UuEFEp5#ORn0oOKM!;[hloK5K+\:r%n:BI%i0%cJ#)E\2 +LkQ>u,qp3k^]ATd\YF9h`%D7#2TRNY'&&/=LL\SeiX[0>9;C[c%jG +CmUYi!T]AU8`=Q)Rl7g'RNUY1f,p-L#4:eub+,Y/9sRk)GXq[/Wuf,:_jQEt0TK>pNM7`ah$pKLl0an8q%Z3L:^hshq!V$nZnOFd2dok?#0G/ODpRM$.Y\? +18hS/#6Gi1g_)Gr`ZfV;18g#SHo=fegdlg*`)q/f=CgJfA9jRK>)>Y?EiOt1]AgE]AjEgBh +VU230YdVZhV?7oNQ3PZQqKCHBPXN"->*rS>JN;G2-Ig +>05Y4ZtPnf6$cUFS8s-:H!+`ljZb1[8r46^7oYWn..#QVL5tORY+QoY]A:X]A,E1]A&]ALel]A1FoZRZK6mK=o,ZW-2-GS@HsBm.IuQF7tZ5I=/ +^mRYC:3CD6#dC&tJR9QI9C5"pqh&#m320@jOWL2n^bd73'^RcEE!97`idq:Y7c_D +Vgn%eab[JX@sXn@F!NQ"b#RRm"aYmO'scP&&f!bAl]A,:fu+?Rca8<_?TeR!QWtd`!mqt4K1>q +&B2BQe\!;^-8V*Il@`"W]Au.rq/?pl3mK+)V!l:)L8F.&^5W50-WA#$i59,4BmE]A^d!sZ9kB.ohY.nZ%2# +4h,DH:4n2s5f[R:-G9@/q1RNX%L)&jen`"q@Wc&hJCRQc$]Amh'.Z';N`iE&f_-kV9aAni6?O +JhM9qD=ncEZk2]Ap;,7'd&!Yq2$Ta7=lq&f8[LTp`c:\e%Nr_Wgin8C>jg"qSDh$s'Go87VJ% +fUcQ']A42#Ej_/Og[Ici$2Y)jfp+nLFDY0WAj9,hKPIPj@b4C,fm,&9j&s2Vt1;tAW'XG^iCD:hX_]AB3g;"G@F+,HG4^ch` +a]AM]Asm#U'3mDSV;dVo:2X_@V,^47^sBj@+09$--/h1?UDD`<%]AaPJhMWMM"10AgEM*,n/V&4 +4C]Ag!4s1DD]A0F.rSZ!tkG)1S81G\^e@WTe?"XDY5!HpDlOrOkpaUhZ9,%M$3Lak;U?]A%q,]A& +lO,PO3A[3i%qX1lF'hWh-iLFUFdAL4dJ&u_f7.]A\5\9&hcdre_=Y8Ntj-$THSfM[Rq@G'.f( +WhCjm(4Bi'Y&s>O=X(nX>,AGYeht^bK+b&e@6RN0FP!dkAcYfKpDLt&$55g#4p& +Puu%\FqY'F6bT7A9JXDBO[^T\b$h7qb%BR;tq+4a^X$@*52tRXjGp/M4N(biiFi3`p-jcFW@ +%eXS=_Bb.??A:r;nb'%19(YT2_;@Yf>!JA03l<']A\1B^DRAg;GuFg/WgIU]A[ScDr&qo&gdGp +2)Ti`nXrQf0AQqi]AWH$M@gMj<7k.:iYDHW:u +);B/)q*44AtZbuP(P!C%:.f9iZEE#SkNqu)T54aQZ9N$hE8rr2d:!NZ:oLaJ/^Nd?0]A_%1h$ +5@4sn\,^e>kZqHk(-`*E9\O"WNY2ni:n\(4^8@SZlh8QRFfS#E7u"ISAHGkofNPe8cc6j*`! +U&&%'H5@$PnRD-.7u$0qP)$aprtA^1?aRaM7js%%n.3&U^%b&!ngm$3Y=-/6pJA<3Z"s,&;s +)7mH]AaGttL3Y?^%5XrpR:&TCD%!^;?lU7jgd$:NasWIm8A?T/)u6c9X(>`":24Q8r*FoXKUc +4TAZe92mVJoMQLK3&^pheCRNh?f8[M;UfTEN[,D(_,H7":/?0&e$U2/)Ws]AW>JqZ*LIXUr:- +ri:=#Z.PbfejQn.?P\K#gE+BTgRF#ZA!mX-_t$u@E:P:;%2\3[pBlO4<^*D$r?AHm1O1%51Q +_$Hj@TG1-LDrENG&d8dJ>kdcnX'GG"!50P/dflEb@3D3&XC,7Ia@EW?dN^&K4L"U(jLYN3`u +Q23``d"d)#tXS?fNXe$Peq]AEXGU"b-8M[W&R"@;=#aWop->c2-&6*!jn`OdaG!3*r6mCeq_7 +AV9WRiXm[,t`!>@58F1]A[]A`H`)SLiUgHB,=')PB/u2QR*4"QgTh=TrknC>3EX5-Q90+Z+rN- +bT?Xd+J++#*?cRH:2me0^qYXU0;T#H;N6-6G7X&W=U0PEpAS,:Q&q(<)s6n;E&6RfdmM3oFP +_2D*DFsmF/LVCFq6C4YI*n`8HX'h* +bKB3^kDosCqNs33KrI5B:OD>5FO,A\C\CBl`+QdUFRYkS3iS$94s1dm+nlbr0rl+tf4O,i+p +:I*!XY#?E2V0MknD5Tj.^h0C"'.geh;i?a2dt/Esj:aeM8l&=G'#dY!5`9N!hn8TH;sc(r_O@+E-g1GXT/oci_A<]A2U +hh;X7;_Cat-5WO/^J*rV[R:M!HEkdJ<#L\dS&Hdk:n)Jgn"jo>Ak:sTDE56_gBNj?g!>j)s3CN'F[d]AC`E4ofd%P*MKan5.f'J`'(*XIMs.+K9D@JPhE:N^65gO'Dm]AV-6QiPXJc:-1V@0"5fQF@E]A?a?h +\nuuP9J]A?Eo+5<@`R`On?2*XlA>Th3]AV58ak,,h4MW +NJXil_*Nh7sU*!Z.UlmnQQ,p$cMaKh=7aAG%bZbY:]AXdmTt$Q7=T.ig5aK4)YqrrWN28YA%K +CVQ.Vq[%gD$RiDmQ8FOqKnK>Zk;Fi+bW:bN[a5Wub',Q`&l3/,JsUJN^cbn#nkpCTn<+S8JX +AD]AWkT[UbHR%bZ +=""94r0E'pIBE&X6'ann+3rB9p[eA//VG'uQ3Ofp*c(=rq6,B2"a\=Y1JWB!XBGaKgs`;'C4 +m\R3iI+IgLnl)gT8//G8.A:F#eaq_dm1eU$iSjb`DAFK9aG?.\_D\2>TckO-sMf*g`,8 +^*1lg%eUe=r([(Q+pBk?d##PV:(\#BhLneKi54PS0G,.'=[R7-f@oRQ>cgu(BK[.0qhHc,[j +,:NKLi]AfNi+id>)3A,\d^?bs;.$U,Eg&nj[I]A%)N=c0B,Gs6[2nL#i:"d=hZ%IP]A=[?$S^Ak +&;;0Ucq?!2!/Cr7Wu!HE&kB_Q+:hS?P;CGLeB7Hri\fR@FdT_TQkdok$>EF$b0n]A&\n[/:_O +9L]A#rfBC]AQ)%??bF3V=q4Q0K-U%!:ftN]A-MpTu]A[Q+F=rk='<`BCdI4Y*moe\]AUTUn+#,h`G +73(kmm*rRDOr[dRleQakk78&a1"8Ht+rWXG%ij:]A$2Q^9fm/5V1hjrZ8*=+n@*^"cBlij%'; +2[9a<9X(+-gNB4oe'nUE9b,cNMj4uIJ``gWull=]A6jPt:GXnC#h\*?ZW_'>BZt]Au.Abk7D@J +-W@M=+6;W`H$]AIfI_aq[!0!_;Rm3@j`+cdA9bNb-N4U.XdSQM>^@hhm)nU)7-@omFaL:R.j=SmZ=jN)F_ZB^iQqB=uIuF*4p'Ma.DKXHS>fGcMWfl2\ +H-.nqFnE4H'N*Tm2GVSe@)3&)]Ad,-n7m^P_*nM)LOag6i[.9_(0"5R4[b3M +)b#Bt>e[Pl3@2s,!a@AeLpq=Kli)cu4;ph]A'7qjC6^,=uKm"BN1Ed>q_e;cXs7Z1=qsa"LUU[^7d +u13IS&`/^'[="TCQ>lRW.pDgN_<]AtPc__KUMCp>X3&@D&I)+Q,Uq,SYopMr=Af3Spt-rHqA'HHH# +<"SE$TG]AFQ+a'`l3!WKU:CYJ:)7 +_[kYj>KT\KK-Gb':q-fu#;5RHo,QZla-kE/bm1ZKtp5;%NK +*DqLBQ\!HC43X&a/O"EI_*Gq"GBA[[I4nl_?,Ibog!k9fm'),m5I-(NTT\s77(J6%rM8[1SB +n\4_Z7Z8NLDs>(%nR)C+Zq_&2nXUPni@c]AU3QI<-['*Y4uA +hEi9S6;>\*rVPfrfuo,q;,EPn3=7(2;9NL:K/lsLaVQ-Ju517WVp%uKO#'El7nkP9\;c"6cC +/71PTMEM#>=ehD3_MhdV<]AG6`@`JtC +iWdhqaO_(>]A$R7_@g#&b?[(`4[cB6CL-X(Qt/A[cVk/'.?tg0DNpDgb8_CN3![B(Nh25'g6O +-Z`6j3[cTuQBhR@NQL`==)n?:aD6&gP)QrZ&tm2j\N/NbQ6s+*\M->&QAfX]A[kI-m@o&r[=) +$_?61F8p4MfC82_t,2.'a;A9k-+'>?:u4?"@(JFZ#GuEH?0ZZcRnSfXk;8/(^_(.9!9K^mNu +k5.,iLFt7u_n]A''nhTU$)#e+K#=m:teL/0\i\'9K^SjYW\(\c-/)sQ?WdH9)YMS6Sg2-SVF+ +h9h=78Id9oD6@:J(TXMqE;&'$N#Fj;+0obds+U((`oK)cWQ#8U4U9/on_/Q0Er+m&"M^*,)h +lK7sn^bO1>.U`rS9)j^,.TXtOLi,1RDeNcfbIOO5oA?-u`Gdp2ZtrqZT2O3jENlqc(/41@7@ +BpBbZ%ua8Sb&FFW8i@g[9P0j3VuaeLdXj'RqiYMY5@2e=DbKe';h?*N42N99P-&Y`P%bd(J) +=H(0@hs49ePCM0@tBL%\qK_"b[%'%"a+^CaY(gmG/e@`HHEJqr,H57-SuKHC&EW+0Xc)A[(% +g.-9'a?bLg\k/GNA^\mrjd?FHXid0P>PK8sRNn%/^(eTu-+Rds]AhD:PNbV2NnQd9P,$I';J8 +%H]AB]A,3!Vq1b,pal[5/d>RY=*KKq8]A!sK&/VIJ29?b@k`Qn9tI*^ +E(o;5-_EZTPS^2+lS6>&,&F[F!)+u+?[/#+1fEtn:pH)j?P2oSJb?5mA2!pSkTht(9SIOl*7 +BFF_,.AUnoE!d!nJmm;m"T:jsT70+80^toG"=B38Cbj@li!^r&#bVWV.9Y[7^VZ/W`:sIE(s +ih6_]A]AhTJnsu!J#8+;k[20LK`e$8`V6;$iA=Co9lui@NM^\?3Pl'kml5:I=mZY>. +\N\-$(,Z0OIHnV_nfi21P'EdbeS`\)S6FcV%78pa1.Q^TTMPne1!V36mJHgk(D>^WQSg/&\C +pm$;qF6InA+<"5f5'B2S5f$<0,^D[L[a$\?tV2MQ2/B`kZ9q]AA>E(@>[aJa'VqR`Y,AD!A1r +@n^7/GVOB]A8&;QK1+d`t\GS_c(MbZbG+a?1NE;9(TUN:#5@4Bf+_Qr7K +)9TJ_17g@9k.#ck40W*j"s4$.O+V+."IKE8,`r?HMgh19"GXk'-Bp/JNLmNRu@M\'g]A3/4ME/+HPD,&9`j0od6]A +Z3bfSe>:\uBdi3X4g;[(7HN%5,G.i4o7ak%C)`;\=Qqq$?"[89c>!09#5-n?H,:XCD[X1aZU +dscC.CFE)HS$'aV$ka"KL4ml@[=$QWET!YVsO^*FboeYl13\ndW3!J8=^K^d8rk;$_K.3Dc5 +2id5FnCV4Rd^2mrSFgu_Q++X`.je.,B9C+6;YaYY>N+($P]A=#oj +R>9oa'B/&ttEjoof90!V/RU5B[D5!J0_XGY!0]A2H=a<=[>th:.%TM7nn8QF*_\CeR3/qDo:a +,2huYlrk"jFEo6&U/'S/JqhB`55U_CoCXK'i.KD4HXNVGC+nPd6^]A9smLd8[jRnHQgLQP_,< +#,@aeg"Xks#c#0D\d:L+8i4/+Q0*a,X#r'9lr7SfdUH%?ojE,W +Z*0Rh>J0o\k!9+,=?t88M*bbT3.pRj=Po+;^?,7K<=#\4VM?G^_49i]AR,qZO;(Pd^'?)WQBS +q9LY3*">AO?@PK8X_lXF%up/^Vj\pT$\cRdHdcriqu+fY;J^Tt"%<1/nT473#S6;cP&!c739 +nO]AU]A:f9XKZ%eSP/L4(3u&oi[\#D@?ko_98TGFhC+]AH@RWiP9fZQR!R[j+F:!9O(K*_aU5o5 +n;lNYTHVH8N?V:`Y"RC`LLo"JtD5D:D`EmW`^eoCk4epM-uK'G!cg4&O^WL#>?Wq#^D]AXZk$ +ib)V.-H3M)LVoK0N8)Ag'RX2o>BU4@-Ufm`;C]Aec[:Sj@RdaCH5._Z:mu(LH2?bdLoJE_03uOL!Mqc]Al?L5jen9cS*[5GUG +ooSa@r!q9qB"ab"^.>>fku2+n;^HMb,4!c!;Z^n2Yf!X)ppWSPAaO7_Z9^DQ[S4/#egaVR9" +\.qY8#K^Lsk\Vq1M@^mlkmRi&2KPbRoGIIqg#JN]AOm"#[-nV?T]A"< +H0SQdUU#a>\#/A`^.gV+rD9_nO +9H48*6-a)!Kb:,jd:InQ*ObY\2M?c,iC%qrQ[!:kZLe_)N8VcE&e!/E)R3K$?dFj04cb +!@>o?HdLmMBWePBJ.8.apDZS)bW09&qT*>e6_7"kPC_Ho,1!",`okskDA`Mj:%oZ>il&V,G1 +s\U!%@JCmGD:RFL7PZ)pE)-Sb6=W]Aki3Rl[T!Ond)]A"(7V92!$Ocm7Z;]Ak?"\)GNS+!)\R>s +1e%?sl3+"KJG?g>`s_\E8YqNgRQC5]A8R+0@Ik +k#Bn!*/,lWl]Am8gY)99#q]A4bG;2t($WS^M/TI5sXd-?-p$n26Z<5QDU?]ANJ1%3kBcjUM[-.X +L?J5M\/nJT"M[I'pY4WUnpZ*+^Af" +2'f22))`buVdh(5)@/D]ANXn?!eI3.JBKDkC5j(QN@p9rml_$oOP?afMV7m]A>>n9)*9HeI1%/ +@V2Qp)5n,A96lP,[\J`GBOi($lBha#i'gH>#XVA6LPBg6iPHjrU;$A[5?PuCo&Co4Jc`Y/?= +q01W>:bLHE:_EW'qo3&^8iYE/HX1;Vk%C.]AnrLd'Wun8$/P-=ul3Z3m`)6%]AQBq1uGjZW+"! +G/Cd*^?k]AIm(0p3eA"4t>%(qe]A^RasHaf +f!-5a,CqdgI>a4;+2ZbH>?BkJ,YaB]A\P+o8SsNT%&XcU*E+YNhMI0Afc+\ON2V%pRPVD[4S& +0Ejf>bj9_)?k@lo0>HBkb!4100o[@KrrbFDhM3O>#@hp3C9cPR8Uh3uGj=-3UT6TBOjd'K^A +>1$4QI($*MMe2JL5$"Z]AA948>g-;(gJ/9P7AP*on%^/caD-KUJSBt3EI7iN\)Kc6,lcBGm^Y +Yc5Ka.ng!F[`F_GeJRaE*p?WSs\+3a@c^Us8$A`q_8-O@!hqIlIDpWJ,K;j]A@Xf)r!'UuIX1hg +LDP.Vh$ZX_GL1-4>89W`TiQ69f-uZ5,HFhAZ]A]AV^1]A$?=UU'1fX!qQLc[1^oaIXR[<5As+Af +]AQ(B*$%S-jfrDO9GQ)*`O7D:#j&MdTDeHaV7!#,.s@K*k9mV4qc%:/.!"^TUU%-OXuq'Pa&s +ZiWD/$1Kj,sVRoZ\jR\#7*,d"H=Y"WS*P_p4;pX9XZ +3]AiGG%>!u0c::bM:@OgjHQ$SgVEWC01O6*CfNgEU/8g-!/*o^8T#uFV@8=2:r'>&7S\c9F5. +I=*.BW9/esgD8A/,Q[[4NUD"%,3be`CYMPs'7M9cXCSc07+!H-P-9\X3hQqV]AW<;1Q+6,7SL +d$m&aDQ!`j>B8l&\V_+lH7M=183p.pPKo9&qEdkZ+#QYF$$%c`)G:h!!Z0KoXO'Ge=d!j +pRl-NVa8.g5W;*")f-tX5it`?SE1EE9r8i+6kch(k$L@lQ!=(,&S-R)oT%:"^.Bi=tQ#j8iW +(U@C)?Q,SYDm=H-RYlo9,-)*+lZ\uCmap*aO)iIVZ)fe"fZ[8&uDUH8-8t+PJdPG7R2NmoJf; +lq27VUka]Aonq,$OB+Um4Y191"K;+aS\L&rlI_K+AL)B@6mk=2eAa^#Vl@6 +Cl]AJQQ;%Q)-Ccmn()I"TlpHp4!HCt39l8A(Oeu?f-HrHPdIo=%,V]A^)>Jdf#)/83^SAmTFhm +3K-_WfX#q(,a*PXV5b&>M6;YZj7=5# +.>9W*Ti3cZJH>GZN>"Q#VpAqY)M*7S(M\rp%j?:E@Y-KepB^IuC-AsjH#c"/o\&b@3_AV9NC +Oo9nR%%8rF'm45H>\j?0-/`_qJ-(,pm+Y$+*WlB>o[u/VIXLtilQ:Sdq!IJ;5C`G(e`1S_3 +Os2988sdIV6JX^Cp*>#9)^M-CP\1g>!`,<\c_U3Y1NZK9j!V(B'QC?6_#kooTUCe5%B+qTD`6s-<76kZ2IdV,m2?7:co +J?S(M\O%^2k:5R4LN\(b^>&@Fa1g1HJ1"_n]AiZ+IP!=f@d;[OaiY,#E%tfDgL[KjfAX=B)^. +4?43#TPZ+Q/\CE06]A9OLP``Z"&!;d;R,3=92Q-/b8&.?(&>j\e*,NSm5jeYpMDt61C@r?OUV +]A'UlaIs)cuoU1Fd+);f=7nJ;7Pa>J0ZK_)/=L'=MspH3I3CV`J'dlc^dfQaB$>S[s^8Xk' +J&R_ELAFG-pU79SrF>47qcX`'oB[kYHtk@FLc#lNc?UYhB&&c-r9V0D;rs*j*`nOel58tYD6 +T]AVI+UX)E;TCcp%9tIJ;4&X'=GmlVQ9>h:*EJ(Z8B:$u>o\XkHcZ+es^jp`;#_BlJS9j,oMW +46-&7An5=RZTN69mh*YQ1QRl:6SN&\]AAL +Co,@+T5@+e#e0(!_L_dSaVlOG+M[(M+@Y`[s1n-)l'Y@7]AQ"t5,9'`(kZ+$o@?/0$J`T*`"D +=.:uc/&2'<4$9r:6_(RPa:sMk&pC[gmTF0ZgrktWI9qgOd5R4p!9*rNnHrRf!KBY+Eh&Fn1h[=UXmQ`rh5irF=XBc=mo$V.GTiZst.adge07lF'D#EsjimN5@_&S[ +[<3a_]A[so=]AqiM7?sC9`uLK0a;;"T@tjFKV@l[?FCnaDc!#gLE]AabIWh$20mrPq^JHisJ\,P.V77ur!QF(b(8*]A,H%S5%F(X +r4]A;L;FO-P'.&f"Ps)]A\:'pC$3L$@7C$o22CVE@><4mHj/NYI.?GqAdCXU)pjQbW)u(+'4GU +V@/g(DbYB^3O>f8r\h^:uJSD3W;0MQ4*HR*Ub/#c +K?Z*Otqs&bdO%aE-WVp%&]A!nm9/$ALn53n@2ZUb"%4\'uD;#br/qrsd4diSHPHdlC2.^"f2Y +)aNCW1G3=V2hEZ2+8LI45d".,="l]ANK!r2?kc11cNQf@_2&VP062s/8[tuh*fD0?&8dXed5" +&W+EMHU\P70[/"]AnfOL7VIFb5=5"b8TUo[o.T\LOJTF^EE?#3l`_6"W,e^.lIYArfrNFVT,B +Q]AGuuUK4A@W9*eR\eU:.4k/r!XG:Q6J]AbX+[iLq(#>3hKmZBoG8uHV53bK@HL21N/]A*d8=En +a)U[q>4:\@C<5?;0UO0,WFq)IBB^(ThBC]AB1-E;o[SWV68Co/=(8Kl^@W-;_*Q3Ma_^A[A3< +sN4iEG?H&#ik3R+0J$5 +1l!$3lWT3UQA[!Y-gr.]Ag]AY$=fe!VQ7uA*BBQB[#KFono3PK/8Ql7=l[lZqaQ>DX6lJQRhX_B2q2O68.i&KQchNg5u +Nd\CE2XDjiaCu&&pu3VJU5.&Wri"9f[TgF+"Pbis5SO>@?CNk+nrZJR`N-EmCBjj/8PJ;Q%` +71VSbRIE0>_8IC)D8(b<%`&FjJ#L<)bS:0@0&>/kcd1;dM,F +@qH7)2FUIG$e.on%FG&oJMu+&G.W7bfC'HKX_FVqTL-`_islXTORo#e_dl&"*!)*&pr?RO1' +A8^:8f=?6i3'1NAJYmaA=pf8O9njEai,YA?)=RHU/UBlZ;L'(QW/?6Bc#\Pm*R7r)?5F`sSA +alDojTQW"(":f&p7i*N0lo-U5ho'Ljn3A;!0T;N*;M"Ua)TAF>gPHY1,KHC +@e.Q[')@H6Z5(@=Utt-",1/NDVj#F"7*NX,FWNlUK.n'8d?ejK@K5gpPFp"3'+Wk,"+55Y08Lo=_93UXF2jQr5VPRZhXMl`1Yc.Uef,3mf]AnpFku+0g.p:,H*[#d=h906S*SW#&3ZLNY?a6Xt*e=g/f)NFFm<,'^R +DHtk`\1&EnsZ>SfF#?aqt?)jYNflpeTkCWu(RLKL8ql*[MF?L^IZ(,`?D_6EKgGa%H@KnA+8S"4>orB"B[m\EWm59&8 +TO3[E'Q8N/IT2%+?atS@&1iCG$7Zo8M@3,XW9[.1G+la"kTBY;7Dk]AT[/\4G+)^*6jb=AI@F2grM?" +KI>DmiH-,7iZ`nmV:%mA`Lb,&;CSbR*h:D@1KYgi8#:4B@)%R8XII`MN:.9VcUgc"mHq7=6& +NFZ:L-q;Xf1hk2`jXsrJfX1nj[P?]AGnbH +GeQjC.(=J1b;F`0'0(XMWs5B]ADVlO3=l3-fYQL3Da&W(/(]A+pCX[YN88Y$GY/CK[h'>H"]A>15KO"k@pT"eC!;2jYe/JZRY]A. +D@Fmtd*Z0qUjcJc<<@l"S3gibHNEE_)9&iDK.gB=n+3F45.pnBTkfcEE +?Z*!!5un=6^fLQ.:=oG7'E)aVu0>*,-ErSDD:Zp/.^E@X4\>^F +<5O@d-cEtQ$r=%,-.*lnUlC@`i1GY`q:(35&;FG*gq5PK.Tfj4r;1Cb"bbg ++f#P4a"GJp`FAOT.ku<1XqrF]AjCP5K37!fccN)ff)truf,J=tQ2U@QNes:[T(J:82F,UUL[c +K*LaC?@V[3>_4Q@UtL*KMC$5(bi-j8$m51&j!,dAb(HOWF&POf?Ud-hj?5Xc')DR%dXJ0:\j +QH[MBBrbfd9B@sm1?MIZGa5Vf\Yl-j]ALs;fcN3Fe"+/+gd>M[dW889=]A7X^J9nc6KA/-O;<5 +i6 +>O7.Mk_on=QjfP(jX^6d:UM&b6?G?@:Vk;fW1OB)HiVq^b&V*YslFhW?bF>uUK'fo-042Bi* +f*"q^,pQ-"8i0;%A=VF+[$BYGl/>4>AnOsoSt/UA`HV#I%Z_Ygfh/t3]Ag,brQV[@IsM%:n#n +>rmeq*5`La0rck2D7%N'q<;*hBBj-D*?E$]AR=,Ags9AU*83ct;RmroZZ'WH1,Y%J(BFWI+j; +1aG2o`f>X&cr34"h-e,lX,@\]A_^'t$Nt]AatpkqP64L$PnA]Abf+\st>o[?oto37q9Xh!' +GK0i9[ap/$A=b+/kNjHU-]AOdE!_ha8OuU:\`KC6$T`dfPNEj:Q9`JdR5Q68!SI7Ym?Cb.9q\ +)E1l!?ZZO"i(oa$="ui-u56]AugjQ",E-49u@*FIdeLJt`sQ6;XA`?S?4L!LKeoCtj'h,c.bA +28ej4=ls<+n6c0%&f'FCR`]A]AFY>KgW:D9m[;#!*e\d`Z2.-C!Nsi68\7/BNmDY)03_GElc@4 +"Q]AN\b!b0B[':Fm9i;6*3"-W]AN02d7(]Afjns-#gJsG[KZZ=VbLc +r$giBTBf#XAq:Fo$]A7O@mlR+AN2^_/W`J!Qbm<*O/#J@T0YA=11#QFjsKO[C7sg"rXm>(p1^ +Bed5s['VfZ&d6s\XcdJ;^F7iLE':W"Bk1&o([/t5'8'o%]A2mJ+\LF1b'NH14SCNN[;$H90aW +)dSmn[(iF;Ibi)Xl'E<2qmf=D-B(fT$hFTkmU'crOu%AA$t8gON3626e*oaVUDI$e18#0em2 +orc/;gW3-S)_*W>u/6,Jem:jDfQeLEgIURsQd0%:)MZ]AZeBA:_$_Bgc*_[3F=Fp7\VchY4X@ +q(hA1djV,mF#LY)kN92#s3,5j6#'.fWOZ3\9e'kh?IJW+\,&=-C&S(1Pa%0h3WZ9@)I;1L9Z +s!.AbAU\>Bq#:@o5&G5$O^3eEd#?#:@9i>'+dLkXV0$M@I?l3$(G]AYTNRJ#ridlq'/'K!=(< +.p]ATB.Ga/:Dnq1R3?>]Ac6Kj]ADi%K\#bE[Pd#=u.VOkA8aD9!W&>fsH`Jl:U$Z66:3MMRlnbQ +B]Af6CFGnaWjn?ID%s,HDoh+%9k%HtC%EFdmeBINV:p/^1qraH>,ruZn\G-ZV-A(3]AHU'g"IIZ.:DkB7@o(?)Y*o +'P]AT)et[XKN4Wq&u6^BD2YUDXW_EYcCS@W3n^-jjoP6S2jY!I/`oo2a@<o;6]Akn1"c=Qg!"-Vgfulo;N9< +u*&3OY@$PAeci$f#9[La%gK"s"2([iL\:RImf&)j\sQbBdH7hNW>A.^Mnq>=&I#6lq8M]A9qR +-ZXokG>YT:ah]A`hl7rDpi!^cn!R*VE$lDeO?g?`_BflM6g>q9.6inInDsrWe?!p(c0.oAec0J"hpNeBQ8"jYP<'?*6/oDi3R!fm;s&T8& +*L0jChB>:L_L3#4M34'QHI.(A_il@B9'';EK?.9B/Va.6/i@[:XfJB$Tne(o"]A]A%OOE&Dq@G +;6\PUN/`H2Jlj>l'K3q(WN[;gSq\uR]A +iS"P:GA +OO!SK>,bVE`K/K47ZEN(6A9JO+a$hUD@F`&kl#r$(Q43CT)ob0AePc`S0Uq`(AP*f5BndS3N +pZ&Tm9`lKp`)#kM$]A`c!']AMR)!-l>kqY(ItFrdek:i&Lj1]AdmL6(EdYDF3%]ANPD$T#,,o$*O? +:s]A.87tl;1YHV;!dSP),:?P]Ap#+*_oc/^qG*!Z&TEi37H1-dO`/-pO^pm&6/7A3%$F&'Kc5m +tEbMoM*1OCQ!OPr*8f_L0sJ,eZsB0b^pGk#Z#nt3LN^0@ +0&a4l+@D&VK9EkHeme+8nZT"TCJj-.M+!;jq6.pMk$^\[H+:X:+G.,I#jOZPXWb#VH?:a,p" +#c-bRO`>I2E.-nWA+ss2fPIehh=8sXc_#^Ye)_+T>^lRnjejaa!tQKWL&fe'D%Nqd$#X*_$,u%jG/=<^meF:::N;88(dZe%j0cZ1EsF4L?o^br'MbnC9:(O@:QJ<6# +IN7KYqXa+J,35Z1k/K3Yk#K?`ar';.6F!b2>[)K2MVDUJDm;d+:`ddA]A=o+'JqGN"K*Z;"+0 +.(JKbbtGamMJ@Kg+_Kl`%iBECh-6Mo7Cp=_eN:_2[Uo*4ILLGU6Sq,`2'c]A!i_Ba-%Au8`($ +QKoVcsl#?s#*E.B`X+#iFIJEepCbhjZ^/VRW(KYm+M7+\=T`;h2U_cj4'RM@sY=(#XZf%*2F +l'IF7+=S=qmobMUUZ6-MFcM^=JjYWK#"i)(KNhd?)C]A`=6KFW5>qI-mA1\t*fo`RWBb)fo,M +L$_A*ZAZf-lcmKmpP:5VJ^R;p)res\'L*,Tl5qKmYm9G9bU%[8CnY;GKBDR!dPJEf/p;m3e+ +Yg"E7p-RB/YIfZGScRir1ea'L3fsh81cboj*sYR@A06mCaU+Tr73S8I^]A7oV@2 +MnQ30s=P<5o+pWtdp<-LAnZ4a>Y_Q`V@,.54bN'`ZcTf1K#AriqW/k.HWpQtfT_\Pd[`ZV8g +9J3Cl!3lQ,b#"<0^'r$dY6.LiEeWm@U\T"8b.>!V?ab;g1i]AjUN^#EJK$+,Td;Ccq_7S%K!L +E6K+eqnGU8lQmNa3,$'G=pj;(*Fm>W/J4SqB!K*)B:U01/:M\/9^.?c?ql'2?u>MdIRlb:5]A +%L>4:8:b;-R.j3RnpeNg5PhIo)rQ-t7Vo[FJ:.n\Gg?Ef*58ZWl,smr@R2Q3X_r#9]Aq/1Uqt +]A-aqVg\&QR+lX[rj1(9"2PR)"a0E.o6.n)rTIkr,VT`OH$)&Ofn`iT0.H-+Sbnr5Cbs,igV% +(s6Qd>!6TS(&6"[!+&H1CBIu/G,>?^F1H! +#p64iD?\[q;L_7hF]A.n6hDOss]AgS4L[nG/#=.qXb_b(21>sZk!?^I$=@m>9D4enH@>R)2S/Q +l%CX0:M<9B(=qFp`k#_S,Mpt$F2Q(m%UL3qb;[es[57ltHm>]A=a=0$O$R!+ddD.7h#msDDCn +guVWO9rp,r9P+Q+4h.!U9]Arg;&_+EhX#uE'5QS;J$V!!4AIOm`s\Mb=7<-iC-D[%QU9ZG1n1eCF)CJE'j?O:@/QL)9!-#WVCk/C-2jF\s\sgm(CuafEc;@Y\!NSa3sH"n^\QQp'bM[EH +-4s6ti*==*!u`.Dh()S$;&3b4ZEL>@64]Ah=c7SmXTfY77J?I%U$:nDY`s8q.R^ajU/0NR4-2NSHV +cP`]Ac'.^IqT:D-1IU#4A0V'oLXoecVgu3#2-5!jP'SO9nl1.N3XQW]AI/A2ir/f[>eI7h'64i +@QYLu!/[&g-,BoNn_5gs@;r&?mSV'R@??YQNT6M"`Ou8#7GP?9,#D8A1emFF&;-1`kZZJ%BR +,GAMj;2b$7&s7KbO3Rg&6ii!OHFhAD77-$61@]A*F*38jf6#"YLMg3=YM%trZ?pC_T>P1u"/5J[kL]A%S>h,akiC_C? +jE@oXb6Q+\JbEmlBR([]AD-^l^CW8t'LODY]Al +8cTntiP.1'TFHlrr5)H?^4MiXjQ6L9C=uaO9@bi@DC'"q<*5Ng'4a-L\Mf1POL3!V>D'HoTK +Qea1rsMW-^J9qSLJ*UH%8&Va>4?d\Oi\+ksR7gKSHctICSNdWKnj%9EsO6;YA^7_,GS$3K>t +V8[".(Y>&h5c5g5Z3r!sbW#"d#`s3O(nQ,&aN0S0j'q;b3:#$BfHq]AXek3KjaV+7R'YrYp[m +&17tB,*'u`CU%8f!44Wgh=AD$IWu4gYKhjh5/fe(KZI2oW;Pl]Ak9I_FYhZ.&0DoK+crDsY3b +XC*/.'/;8-XAEaZi;f720'Z$5f*i;1^[ropsBp,$p$#Igb[rn=`b,7=?n9C1P!\ST/)cY7Ek +Y:eQF\*aMA`m67pL$'keZ^,@@6?$6SH>8i[(b]A2JPHLLQU?K^g5k_qeg@@2VZ3BQ"[2:+A6h`H8bqVdn"B +ftstbgo\N)!'fgR@lj4_FT8cu``QWX>*8rAG(dOe*4df@9+Wq&Hhb;\/SkR>, +H0?'MJeNXc]AHoE8H$R=c*;[+*8&]Ae"3T=oG*MjJ+o1?(TBI6Z3KD83.pQTbnt6V,qa#KE:jF +h9gHOD:8bZ<9K1:-r$mf?!H>8o?N`W +.iYIun7?CAuYA:WZ+$oJPb`&qBD4O=G_58lI3f@VXa_Uu-.*EBWecWH6AE+=46t67rRB_j)- +@)HZ,u>+WJdejA +G["T/\8tiidB(:-U.oT)t[INjjgf,dg=iUq.nY<5'BH,:H6/M'6P+(A@ST/=rm>jsB7LXL`^\IZ:#"-)_br\lOEWRB/kSeSqh"R4N8"a]A_ +4Z,a"-snco;L4#5b7'mjS0TUh*G#hhs)e$7)21`\pf^LaPAG*k+:h:jWMif+?L56ZY8Uc>#I +.bfE?HKBkV6c1P+"7Or([&_f;<0FbP/8M/^&-QPR:/q`\T8>&fW^a9(L/ZY8B;;A# +,+=,qf!;\-BeIB_-2i&R5+CD`JY"&lsR*(gCnnA"R&5RW#V$a5)3gqTF1D`&E^t./g<8Ck:9 +:[/n)d2--DU.,V*#hSDUe4RBU\U*a//&@:4L)OHHdB`0/J&':.FN[qiIp&C(V3H$KO)V12H) +QG,"*@/,eToVKIK[78J)dgJun9(MqV8-h7&]A>M#=jhVq0q_"Or'I1SCSXZDl@B4cghW600P6 +O9b4"*Yuos(]A\a;R/]A)@p'p\Df5:5:XkPenoNOV!$[CqC\rP!i2RiAOrn5bmT'[R?.(,NBj! +0(:OQq;fm5I:<]Am0LBF!1MWW:tI(mk*A8i)`hBp5">G1rqm%-@iq&&2.cX+8 +/#mg=tZfeN@I/Frqn@S.=r;,`_^\Hfp:EJ>=pu)(drA-^SGW+k[Ud+\>E[,s\6a1c?Ce&MNX +[5PceNci4.EH"iQ`Lse"\S3lu:#P[`*eiea3o;`T +qQH\8"kTb'i7,0=fGq^@WL8(,@i,Sc-3Tn1e:>TA..8gQ#bB1dCD-rjeH>dW[rJ@'UAe%"n2h&DUWPH)[8H&fs'Z%sMZ; +Yn)=:IDml;n'JA"ngFBOPJgj-Au`23tG#"W8g!PP=7,FkB!mH=5F_2]AY:kIl'-6YB)[Wk_UO +qZY_iCGZt4*ERNR)CE"[.^Z4Pq0QmuqhO(#1:X+hsAf3Z4XJ8h-6']A'pWJG5.^G_fF7K+[:f +_p8V7Ho;LQY5KKmi=Xh7@sJo_)6XkgT@,/.O`U.WWJ^W*gUA@kru'/:QfW.k((/b;Of]A(S8F +cEOqXgl\@Y_Z7[=S(nK9O?,Lju5n:`B!Luu"*F9Fu[)2bnm73V +"0ZD_Xi%*l0Z%!6<`cu/WQ$?edIM%B\fS&X_()Lib%`&onFB&=\="UYB8?c^jSjl/Y0fPfL. +W;eRlhIM_ZV9r2XA+^f.0_e%JU>Xl1[:)Q(Ltrb%7tJ,@=(7&"qKK-n0=X*BN7(%EAe/$'H' +cgYrsuG]AaaD%>L0Ki)DQZ>m#>)XJlF]AA8NPl1mJn@%(A)N-G+uKNo(UDL:M&M,=t+?_WS21; +Vcpm1WAE`\Z>u4f^TPL9^B*g9r]AYE]A>C-K?5oM?-W0OMKh1q&!*Rda+GQ*P""TP+gN`M<`E' +Qhl1A;VGRF9.SXegL-WtZ/"lu7dW.E:teB8QsO$@aM,a,*R0Fh79jY,Rr";aIYgU"b5siT/d@81\OAb)U7#GGuqB2O6.Z`eK3e3T#t\eI_ +Rf[%gD!%7jo37]AeIL448pdXgG:KH)C=^#hJ!hierTE<-cI1`j>JWls*DSKm9JafQ-`\T`=2pmt +N@rMDV]AO5$kSm.La4H9N)h,miP#Lp*7XN'.rpZ?9Ce\md,pI>+HWFmf8&#__UIX1c`H/oA.Pu8rOA +?^!@4KD[52I/%('Xs2i8dglSWZ&MeJu5!4X/1?nf&NQk'K+6`N<%==:!Jh20rZ)VVV`qn.JJ[0jO'n"rR#$D1u1@F3JEkFE!RQ8Iot6)?&,E^e4 +\l_q6R0Y@g*`i.N;"CK;fNn-a>t(hnnkZBRUUd!M?0:37"V%BtL5[M=a%I2e'f;t3isl2D#)pK\!6WD_6*WPq71&qB+Vg,7VM5DlW9EP+.g1p-c1B5m`/,lBu*8f&aIEp-;+:(O_0'D71b7Eif +GTD2[tF<4YtX08AVg((4I$p_]A[Y9a``!'qQ]AP^JI4eoYJ+oc4L>[J+;*+3e^^@*M +6"^QfL&ckH)RBJ%C<:c6+r:LVfjD_QjrQa_:\XJhfuEZg"u/Kf?_hK95Cg.+q"DOdGUnq_j= +qf&3FfKV3@I!o>LYs]AM'0As9n)`:'8%>i3#P/Ua?ASDf#T>Y(< +[Qa/-NSTqH4L,6ef1mA!\2XX?Wj+)HlF=At#?TDt(e$5Hf"T#c]AXuOlck*=f%4=,,N(3knG-f/*1YM-7G:W +QAgaG[<&%=B8ob\T)?1&Z>DF5>HZjukS-6`0\aLZ))XI?d?q=_rT"$ok013?']AWYPk9nle1W +FVP8ZP]A['KRcMk4R/qDJ0 +dRm>12>Ri'Ks%Wc>CUYMFA<@h?[QM[:\**XQ_@6c>n/T>'sp%sp_gp2.\]A>uMWlBSeD+NSm, +%]AeFHni4D^q\Pq#3m4rTCTF]A=1!n??t<#>n'p4dE +cCVr@qWl^'&i_nMtj!Qd9%;o(:U2:LCj8qXM`^T)JNMX34@t&rBXibUBVGDZB=\k.aS1rQC/ +Y$J'Y@DhT1s(d9oDMA.?TRF%$&T^Q'WnO(Z8/rU<]AgD&^=_"-)1mZ'&_/]Ak2eZ&8V'>RP8-` +hlMJ_5oG8iU`u@G-*k.q`7GrK-n4Tf%u\\cg5nucEtHTht6)l6TJ@)AbUl&Ob>5)G=$AN:1B +>Zcl%$&1LY(;ld)DuaeU4&oB&ghl(U=hAr*!]A1CptmVjq&M,^4#(YNT)S[a'e8Ajd),P3/V6 +l5@jsES8kk=iHo:C/.\jWNRAt\9;rZgA(ZT,uY8hge9gM+RVosWttQ9WmSfGTeZ#Om0$"ubR]A3:3[=#+\WK!5P3LU^\]A!d>S>1Fe7@c4*ZAu-i6BZZC: +>@Nd]AUW?T%LW+S/6=4Rh*JNX&b]AjJG&.(]AJ,YX&-L^Z\:\(bY_A>pk1D`'$g)E8_7F1]A%>V* +1^T-S>&WSf%='4+lN1`bXHVla9&?Ge1oiDc(AI2uWs5u:O2Hg5nt;%GG>9&a"f:'JO+&U/4P +'ZnT?'Am?PRk.c?h21sKCcX&LYFA//;WVu*X>S-^M8-Go5tgZbQN'RFYLs4n?;T%NIGaBD%?UQ&^s&?%XCr)Tp$?j)R([9H7g.jhS)KE\AhZ' +hmF)6:pbdSc"J>l$nQ^>qEQ-]A5+o0*!TbH%EIAfl9Cfe?X)0d``]AGq+8kGXm_abG^J1n[]AX7PjqQPNWEb8 +rQ)nB[mW.5Eq>:'(lIX.HNZYiO_gl5HG%jSW3:mXW#S&fgtPO?(Hqh`pg?IKp&8V/"hW/ID6 +,KdXfZST>6W_r"=HJ?`SKX@?GFte%Ua]AP9?7jr'^-=,T;07FOj(8IQs31Q%!o'tp83g +<8@nelX4m7c^!\T::'Sh9QLP('bS^*bX'Z1?p:N:l=)?IP.3Guap7'@tM!W[Bb`[tSt6jNZ^ +(ojaI+;k$jdQ@q1aU5&[;&Fr/$e:bd*BVohn^_b$]Aa?E92sL +A9Z6$[hKOM&8hBreSSDUecp,l\g,-`*Bd!'=.F0F@F9)[,Sf[6Uh[c2LBZ.CD0BggnF+QRPJuNjsGZ)b]A@bt5*OXkrUbSMo,@MbogfnRMN6rA)j`T="gONo8KN=_FsTg$Ha3\$]A1 +'#&PTRId7VpV]Ak]Ai9sK9CE(^KjTO'YY2:tOO/Zq73A*^q)2RjL-/MpTg5a8\8A5.;;mBZ@6? +;lX22ZW+D*==V8Gk!&%_m0DcQWd@s@(1$6#]ACm-Mk*0DN3V9WpJl9_9o@H@*+-B-N)r*>i30CB'g/PM&3QR +G.^A-dno78pTl'M*tePJ,[;<4:_LFne%W*\7E3/K +FA(*%ecau"d_eLtoKmP^kC^"3L$"kS5*#=&bM\E>A#U4J]A[sK)bAq28uA@'Nh"ak]AaHLEKO^ +"p&DCS(Hn?Tch\lZCld*rB#GJ,0&(heDbpp!!rHh%g8"J^F;bmpA5-q4bO:qHm"2^\W/(f>m +c+Qg^R'b5(M05QC9m&.`!G]A0k";7Yc7U6sPaE\XEQ<*CDr +r`nhgFYNZ*hI`GmF+$ejn)mAG&92iio9u?Q""Rd'tTNRBE +eeDoa%M[MTY4Mr@?Zu$gojh8ic&:XN"Hc>KpbgUuAbGU45P:b:ISe?Q+pYhO0b6h+qjQ;O+3 +32/2@`UoaB96]AC>"Y1o]AAC2`3YRo]AT>j`j1\40GC#kM`LPn=-[^5^*9L1aK/e/RZFBq9BOl" +h0fP5>0W)Q)]AFbtu,kRt%NJm/s/LqL)LK3p2cC(N]A-c;+O`fLK*MY*2WN$ +Gk$??H,0W1lpX>V]ASY5s%Y&5:N]AOL38#/UUFPLg(gc;igT*-]Ap54P.QD\HQ2e[-?0J7gfSRsh.G'P-/Le8MW4B^,>0(pj8kQJJ2T$Y2ai +>J0.6aOX;=gtpONX\&r1XT]A*=mhPe_h*5#1o&`30HGfC1A/k7E4AUXL]A-5k"+N:@Zs&E#'@: +;+S$b@dkhSm/a[r>qTP&T*Ea);/_7*1#ea8'j`rRoGd!P`7c]AMk$a +QhO5Up&;XMkj/7mFu0,THLLR5rN;4Uh0k>Krtf"T#+1,\q7nM1rqt=`@QQ'7/a$$tX+W+)2+dYs6!2"/\,r6LeuO&o$T@rC`BelYS +M^_kW`XF=a*krengQodqWZdG`KU_&L'/_P3i$ +;OQqL^Fi&"t(nY1_"1g!$b%GR#5m7%L^rtA=VMD20n3U`/aa5OOW!4Bk+Y\!uZ*ckk:qArer +q/%nDK`?T-k7-bS]A&(F4OaU*G"o9')#Zb]A,1T&BX0BEW2Q!U,(WBWX!,^D,\*u.8K1G[JLa( +jtL\]AH]Aj2$iumUjLcR8l;I0=MC>FZW%9F(/C((B$V6/S0g#_VeEEsY?Nf<0ka%4euE0uUkR_ +=ViDe4\)k,PtK.TWX6&ZTKaRX"'4ENrGb^R?'qZ(l85YYQ7-d3jtr?$:8d-uQCbH;[NJ2:ML +]A3)_WPga;O-30"oS"Xsg[duKQ<.uJ2X]A!0jW[>jb4XY]A7Sj=TIjd[BsMT=mdfh[>,8nVI4H& +C71?fmG2r)KR9#d9XciWlpl?=[M +0q7Qj>#,frn6&i`J=1!=:DNN3h49O#BV4f\]AjFb'=-"c\$<:sYO=EYbl?Tl#ZG;n*f;-!qm1 +C%&MGo[:DV8/:=pi5oR(=e0n/lc+KE@rc@%+g#j%$!cHY;A;FR!pE>-1]AjogD(C7'<`Od<IHN9G"LrKK]A=VhJ16p(kqY%6"C#C$S$_XXsAWfZl9@d]A/K:SYp;E:(gcf_!$\&@5"E(]Ao +Z=l(i@R)5;;7U7EQGU<*u]A.>"G\"fd["ls@W!U>49e,tMSQ[8,kmZ6]Ab:WBV#/Kb&dmQ\>hU`9ql\l +CmaDZdiFVk8D-pM[bMYUc'&5`9s'rpl*mmlsU]A^Da!Hmao5.mJZYL_4P'8lM^SEVorFRrUTO +4M^La%GlIL6MoT3)poPe-[t_eT:rF?sCqE'(cHrF9,!*#Mp5X$PklVb8@WJ_jOk__8XIJ?1/ +o.Z8W%/ZBhOdbs1o7@BeMNq#]A1Au+J&,9tn>@FZSoE&&mlVAGRFA)%aJm8u=&?_nPb_3,=N9S?[[:Vci0JQdc8) +Ja9J)EsAL@Wnl!RT3]A8NOLuO$=TQA:jN.c]AJXIOqD=NC6$>nYp@,W0q&Ic^G +(@:o]A?^7bCUP4cJlAJGB%-K2\o4\!ihC2#%O=kq=&/tfG-:1R]Aa2%;-,9OXjbeMkaNO`W"rN +;-_p.Mat:j)7Fa*B4NR'c$579N%+M8nM1Bsq.EU.;!qjb?;LHp.Lr$Xl/j[.S='2)VV%(/m59HjW9)BUkEaZ/A% +$:VitO$A2(Qt#Mdt)qg,1tCNZB$B5bgOh@^o_(`2Zs@briae5m13 +9?r_=l#hhc5(48PV8(hQC.iU3X(flPseoj_;L2VpqDuukq[>+ld#_AmV'S(1O0M\9t+).!/R +b5[:U,D_g*8dRE$S,nj;5X?(?u(Fql2n5-?Wphon[BmS"#OtE'Lst.[)PO8lf_gN(`"h]A#PY +)(R<*''m]AC2:TpWrnUn\g+\14&%]A#C@?OEkM?A>,*;HHB)^D^BW9$HZ[1iW%sq,j3I7d-WB) +(P@O>i=X`(#4t7\b#79:>h/3-Pm-fFAc*8U]A8=[!0SI+J_8,\P4b_G$I6_uO'P\)p)]AIYZ4lV1Kg5[X35Ns3WaC5`P[4YV%,Bs+ICVrq,?SWAtSfepQ^" +/m\-gin`ofI>r`.gpQ&CY]AUOtr^&@)spCF48G +;8ii*X;X[_>*lWb?o^E#uU/hkKfe!q!+cT04$euARfg*Z`0u?1"ar5EkQmC#Ve%&0s!!h$i2 +X8:bH_J3Bm.@3-mGWVAdI\;02*8EE;\$!dl&YAn9G%>kkB3XYQ=9%m@lfD_.F'`R8bPBd&iH +.P,?ET,;]AO)ID9UQ,CFYEHG5+T$e/p +DV';DcFP[XG'=)ag4CsEt/H2lii&FiphWAel/+]ARaJX%iIV7iJV?70Egj +Yt^P.0PGL%o=Gl]A0RfL1Y*E7<)06le?k_t$b^h(>@G*BWaFd02,!f[,*GZG'3?SN?QeA,7S3"$ +/d$e5*(?_.2[;L,(!.L@&lR(BKZ#/gRZLOeNj.3F,G0SSsouR2ZAiiCSnEWQ1b2ebi*>9jlJ +JCJoP,NAT;_cRDrs&.Ggn=W?)?*.T]A_@bX*A*jn!;Ibc5iEt-M1 +sh(#XK,\@jgM[53C+Fc!'NTAI_:=6rN0:(sC0?%"a1Ij5;s(o6#__=u*5bO0)MfqJ^K?Df]At +7/(j"+W@A+as4BS\\tsS*ggX>(bo243BYD#;d]A!RTSQnDCAsjefEF[f_76:=J(iDZ23Q% +=''1^=i7bPXXTDeGGflHfJO7Eg-W4(bLN*=E+:Z#7/"M07V[3h9kGn#,=0qMO^8DI/h)o&:f +)qG#J6&U#+N1\c;%=?dX4EDtdQ,^$U[Rdp#tAQGqe*QS4uGI.ljg(Z.@N`h*[4Bc,@mcKiq< +Vhp<7/nK:mAe!aggUCoUo:dC61plQ@Y.D8-d;0qqcT4s:>&,+]A1uG.3[84'^-YPFn_JO5F=h +*ob4c?*Y6h=bFPY_2*=[/!^f#T144[i0Wi0:A%@SY;#XD"c=kcTNQkc8^7`YDLkP-fO4;Lqh +LP1SucAJIK/h4`=ne(Y<4Kfcg_aD<="Yln&K7btVLBZ"Vsn>ZtMZ3.Bd;ZHlB;A=Oqh+cSjg +o?dLn)7ED$?pg6S_=>#n3Fi1LthlBY;[PFA-1o'gREjY]A6suMpqiTk#;\)JY"(GaGInM@B@p +s=m;*aMRJQ"Od;TW&]AbOobhZ0Q2[?+fNHF5Tg6SWR,ee24pX;V!\%Xh:?AS2\s"=K@:e +.[$ormVCu3&7!;_%jB.UYs[ok:aa0+Z9D0?IMcJ(\eol!4b=BD!$W?bO_.1d72iAm"B!T@X# +O,&n@'pr=3+F,4Q"?i_O#K7OETIM08&eAO[LpmJnEqe66W:t4!"Lh,FOSsdVaF0!6lN,8@sG +Y_olI*Go]Ap_]A,?tqLbAfM]Acq;oR&843308:0%[*pHS0k1N\#.e"c3g^PelnC#[3NV>L6c!(8 +FG2fB_ANMD0g&[Y\Rbkg;O8_gu;6S=sPGab2Uj=*NLOa.U\mr\H,T9PB.Ng6%HBVh0,Krm=5 +1W&#rXQPme=r)enD#Zeh2H?8ulhlI+[fP&)ZhXkH3J2S +h.qfUbu:O;f(K_<=&$ki,*7@DBFQ^Pd%"().U']AD?JqeV(p5LR+>QcGY2&4:'15cc-;aeOsNp"1up!P:I@&=Z!]Aa93_P6'@l>oeOu;&F=@.!D@(`C:_DN6W(5psW;$4@A19[0!>Mudf_Xt +;7gTagd+YAO7W'n1,HNUhC!W3]A$AN`>G\\tdo0)Y.Yn9WFq!,tbB@!3b/<)oAol`(WY;#^k%.uhP]Ag$)cmj_N?&aDN/n^GgNQS +3i7%U\s`B>W?/09WQ;cJ1JknN=FQW +ZAm-P=f&?<`cBd.[Dq6@ok1He5qqMeQ>NZ?IORn=0iAX1'_+[PH5c% +>G)iI(\#Y@7^R9O7`-1c,4`(U@()f#aM&WVZ#%?M9X#(91f-r5Wn=l#f+TN]AJ!iPpWbM/Q3G +TcUC02dV'E_mK]A$=$\*j'$N'@*B]AdHEn'Unm*0\1)+R9;;I+.2R0aGE2o?qnJ."qAqkXI,AS +L%OD"q/J;0_KPBAH5g^g;Brrt)0]AYjFhfuLG9pSRcT6//9:ArNZsL"B!1GEPBX1smF9F^(f6 +P&2af*)lR4*2?_Qo#Qc-3C&t^[qbSS(u8s3(Eah7(+52sRo[Sg!$f6-)6gQ;E/RV?^$HVqX*MOsq]Alr&'HBEAkMF&t,0]A/Z>BN4AF_1\?-C<_Lo%c>hdn,]AfC.l +72#i2B#kLX8%Z_b=OBV3EUaV196HeSqroj_Kg@n+pmoM,pUdr>s9"Ja!/'-4E(=%IR3U/j;E2J]A<]AJo9U%1iqgu3O91M\L,.%$ZE;4\(nc*XC*Sc +UG#n_@I'=3c.&R:r'DWS[[)M6Ep2*mUjf.NDG>aJhA=m?C7@Y)1Tsq5:meA2Rs!P%gTXd=!= +c0>*N/3'**\nB^YF*HEuIgAk5b0+-'nM\]A)/@1pC6f<]A-9/ng[0p)B6'Dd[Sifk_/t))rl(p +>0DG3b[9B]A[B_6OskNDTRqsF\S^%-+N!4t"mrl_;8%k>\FL[Y6,l5l%a^Kgd7gYO_opQKNEr +&U:'"Hu"hF/8O3"Hp/Lq'Kk +nr\9JY-jhf!209lm?dcEcK\W^JR&^D0OTqjJNF@8lakfTB>Go&aMoa.9+($*V/+RtaT!.9mZ +>>j$(.iQe*C@YQgP4Uo-qAK@eD.;TY/5!Y"fQP>s!cn;:?+^k?<41$[C[l.!D6"+:"15Xs\6 +b5'Xi4tS^t0E7/PZHOk<*(%_FRN@&IQcQOVL\:bg>,[m9hadk)N5TbNub1#L:hj,JFu<=e*l +L:Vu+Ng&_Si5OS)3*PR=S(q)kceth2.$sN'fh*mq\l`fNA[]A%U3h;@*eCWRF9oK9C&S;8)Y+ +mq#qGBke#il29re#Wb^[,/0sMcHLeL8=bf>YJi+W]A>PLYE]A\%X+ +p@P_K#=6tpgNL)NN0\U]A70b*3c*_J5m?sL!J<*2QTkIpUc#73sFqYV[H%$3NUD(:Ui +6!u1rb,2YNFD%A&71b:Q\iWJ[*SG=GF. +:D(J?cIAqk)fYPQ;b1Pb/.Y;Z0D*&<]A%:Yqu'l`HNN]A!GMh.'f7Qut<^#%5hegU>f/D"co+B +u]A7Y*go=2$a%[=4fP+AFf2KDa_V*@>?s.BbAMN-b&Yhi[?N$AGlpgNf3tqPSSlJL?[qnHl&T +X5CN".3l*MfNM$FP4r:p4$c_!CJl^@Zo,2,7fWq-0%p&;%/j]A/jPV!MXmdbEBg]A_pj6LHs;. +EoG-Z41D)A3sQ?VBuH-1>H>d-Y +5un(?*+2'6`[3n=r96^8K&ic2&'=$=kesC*1:9sM5W^DXeTX%#;*RS +_Br5bKb!BoX=*'kO^Blc+FMM.%"_4tP^O:Bt9;>4cKPR_u6??b&f%Jfqd9[OKoktGNSg,R!s +&#,n;;d@s\DSm=+ju1!>Y,Gc4e[1ubR+'R0WGADs2%q11mk_N;PD1N#47TPG@Rj>//_!T).g +kIZ;;tQ1/;"W_=ubJQFr8=op5%-fP.cKeLfSl)Kl>bWF&*ta2;9HF_6C+B8!XR]A"2TpX>d,7 +$,rF:LZDJS9L6)YI'%"h/%0T65"%ioqXN)b/Y_maa*_oNjPe(*MdBY959g)5.KTTSF(;CBY7 +p2n0W]Am:seDo(ZFJ-:rJ]AFk\a-:Wk8C"`Ora_Cr^:e+H-d8`PcodTPGG1B"6ENf +iPOi\uY#IP&f\eSBOe/<(;T^n,ERjQaafr*Hg@6nX";g4Ohg;2S.>nY[$[B86_mNkjBFq\jc +Ga5S`6-u<;fX9^k8\0B!H"Pif>'_W.Q7"Q('tg]A0i'#D4eL/&Q,2VhlhY%LL?pAEY!@3` +EP[u+R28Nj"E:t(E3*j[=\38d:*1`iB0dff*!oQD]AU5n,J\@c3m:`WJTR9cN*ni0E6h]A&\A)1eTFBH"'`gu^Z>Ti52YVVXVSM#iN +EpRh9X_sm;gq04"O)f5I\XWie4-1fhpd0d(l;g"rKo/F'$"gqnu^3>o.jQ7^Kdn_SO>*Qq^K_V&T^$/*W/U +:sI@QT\'?MrE0"+C;DYniP:%\RdB5I)M?t[EF_*qBh`*KpHaE;R<*4=BSl?9HKS-JpkrQmYC3Q"6m"?f`G%Bb.X\3@ZBT^=c8QDhrtd! +F,UJ^e9c^?uN8"bLOKcrN2>L^/q0TJ[@d-_^Y2^[Lc=]AtoL\S?YNR[b.QBH-[&8^M;)6[K@A +3oep<\F'/[9&2r>*2,?c)o.&60pm.QKiR3,Q&o&M[OM_iXlB_,n(QOs*Xu`9tAAKt.(Bf=/6 +Ll?l:'==7_(c2nPWbl7gfaEhPppqk&]Ac=[mY`EDd(>U#L/M?>Vh=$2g*DeK_^%\6MS+e?DZt +p*/Eg3jXWYM-lX9A8(::T']AnqClitPM#eU"1A2:769%9aYp*m.C-&TAQ>&W"qd9EZ6_%/M8FlIg)N;! +d\)u63%BC]Anp'o+^fo^(5*mPduhqlEs=f0naPr/&F<$5C>Gnr:$=m7VWq^+nl9@@u>ecmP&? +@oO'-gk6uUF+**i"It>D'("3NFH=[<7DbqAVPrPNG6,7KM_%iP:,3X`XCIuJFp:;.i.`5">g +1m4;]AK59kP+/HkuQs-3J*oA?o%NE]A,#]AAHKhe0UHah%;MOO!4KCqn1sZeT]A7U\E.G6`XXR1E +]A[S?5BJ*-mb'sSQc-R,9)d'H>SG>VS54FIVBHh`c2?B\5]A@+N#BHthILsp>@1M75sopUf'T_h]AQRt(fEV" +=HNSG8!9h*@V[m=Yeuugd#)#MkhV$Yk>-7=>r:A6!J,8g%l^qM^r9F#EqP1OBs3K3ldrH5&O +0)sM!qbaO5Q:0;B?7(/)tGt:G.Ye0pR6*/(%%<=a@*AQ,Vfm'A^-e/N4GT>(KKVXMI]A8L:Mp +rrem^fG4poYEW-gLnM8unVJ&D_:8)Y^$GaBn5$5X"]Ai$_X17gk&]AT*W^0?u#T'RL[Cu>Lc9o +["&i!I*+_^6e8`kM<`GcJ>E4'[eKc=lTFcek7>/=S6>%#R?K]AgM&iY%'*(USSWlOB(J8.(mi +pKlJt\Krk"CaZK!\_lShQ5$kV3GT,VZ`l>R&qU,Mci/CNpF5M!=_F]A!J;aO +CEBnJl6qU^-/*@EiQTZ!k6U+M/@qmZI4Q0ME32S0kiB5^m&&C*R@)9+t6_HM,0Uf&Q`[Wrj7 +CIO,4@*MqZ$#_5/WPIZ@P`/(OZJ2K5T3JR+Tr[]AlB3$g9(Z3[Wnn'J:$X]AI4##egW'Y2c/8J +&D()"aN6t/"chbGF-10K)NjU[($Tm/8[9Dd1PA=7/@mp2Lg1sHChcGcebU/Xds)gXCABm"?T#N]A5>dH/o +e8)Q^B,g:B#Zcn]AbIU&2,AoH*h&h66hp+a)eM14q]AMnj$e`C;90fn`1:b9=Lq%qXe/_`VQ2> +.0+kIl.V!N&TrFW%5d_Ir;k;Fp+L0Gups=`5L]AaAWkPslC1*.FhM]AuX9(u]AK37JU2t`7-h^]A-L6tO(nHg%1eD@p9%>Di3i +#5XS`"-jW127pgCueG,3+ug$oAQJ*9k,=Lb'Y(l5i$jdXt9euo=NbU=5[1T0a#UD7h\`iQQ/ +kj$CK3br_pZ?RL2'^FrUXRgIib5n8T'8.3h(H*@!^B=V&82_/9L +Zu%Vh$%-ViPuWj#3$2h04,5kp"qoi9p,k,GNHggs/42`RTBHi?Y!DTq4N+<&Be))(Im1TH5L +COE_X"bUN]A!Vj'QTJ`*l,6fWngfk`@7p6RPKElJc6c%.pnW/(.:#8'I&;B(15J38Wj>2p#+L +B7cF'_!=uJ:4'tOZ!?i7r'"^Xrea&S=h^4LB@!J+lEd4GDtAZ(0JlKL6u@URMK/[aR3gk-l. +g3c(c\KGAl5bY\!Lobm0bs6-o+QA'*\5Fh620`ic8TiPEOM_4',liULcYh%Jm31:c7iQerfT +7_elp)db",0H&J#es"5:iSiaBn%JJ;-_GeXe^kB4/;nsB[spG[jla'ls",0@H;;gU5uGm'st1^=^9\S(UcdRuD8uj(jGGNROZiPJ`r3BfDU +:cPL*L!qJkC?p%UP/lcN^`4uYoV(\5C`\P8=aWJd&qM.anQE/khi1:@K`h +=?9#4FJSMh5]A/=5;Z[oZ1^]AmJ:1>r!.Y&@6pXf>i-IG;L=QUhWr'YfWJ.%jnEbHlWSaD$,!^ +E*juTT>P\mMa(i+isbrcr:Y,_Z4#dP%o@Ajnm1r2u`elok`cs@*cKk!6cet5HFmp%[#KS'h> +M>,#>!#.]Aa^I)"$8`n_,_5KQT8:l>[3J/"18.Yh[M6A+\ea8R_bD,*`$_%Q#<9&rV]AFe@)Z^ +*1);gCkqZQIB%_\mYPj7/s.hPB%m%!g8-?S2SXba1P6U^eE%'2RabJ,UI,k+,4rag`D]A++CF +3HZFftgI7ZM*h$ddl^Ol>7OhFfCo@Okba`UEce"9Gos?"hHhe<3DK6J^Kt#m+E[[9rPgel%1 +m:EW-bKW96T!=:=UIW=q[[m_DGqJ:l)Mk>fbg_;\ILYtKO+=ZAU?S2p?^&gmflLqQ>l'FCm@MX??5?(DY6XV:o@D9?Rms"qm& +%cK`]Ac)MJOc1+dV?a1^\:R@SnSi']A;;B?baE6U)h5O4==TPQBpOM9"/@C"CO.XV4a12pA?Eg +0:HoLE3lY7P[gGF8M%.5GRdC.7H(05R1=e4r_;/Z[JUnj$G@)^V&$XdGp^Xp(3du(!9qmVQQ +KuZdbpc.r3LJGP+/cH!,aOIG-@?WXi+d>D>W/''(JDkp!dL&)UlI_*V%]AasL#[1X<*h9u/8+ +o/"^a!mHa'<9A99?dXU86iU&m!@*oII$_E.`>DOSuZ!='J7_#.XC&;qD1!Id'ig,NUp@LcWVa$'+OCkp(r/VNIAi7LBg]A&+**"\Hh6';rpo\;qr5K0d\>4XMT=cG^]A4;*rq*+ +$c^k1.0Wk)1oFUuAWV91iV#:@=Io>\theE)P]A?d+Ce\+cXnn2q*ViOW(H97/S9&#)K7ptf$^ +UrshnjXX8HV4k+Ah^S2$>sB0]A;a:,7/=o2.#1,d=/MK:4ZNut;9N*=*6DHu:dk-FTnG'tMEH +?kPWK=b:L2^@ST+9,8(go=E7qIGqQ8V]A0@d9$ +m]A;11!M=-O#M^DWl(9-V;`GRs$LmX]A0CF$M50C:)Y#Ee"30RM_N4+/!M0-0[tU;:Y,;CI4(H +!`ZI8/<\mI7gKfpC9E8[d)1A%l-KCre&>SI\E#p;0?j%9f*lNXDXaNn76t'"&7g[Z'/UmcE8 +2KhKEIjrMZ,]A10[?udNNS>J35Ya/tYlS''XEfIHYnOk<#mFp("\=e14&F,.4f$CrC>'0GlE5 +m<'%7SU;J3[FU8\[Gu]AH%#4MHClouICqD.mGG,Hu"q;]A:V=Q[V\gUV6i<>RoGA+Ig6^ +[TQfIG[pI#lY00!]ARm/p>A"gQY@(P]A9$"MdiYe2W$-V-c2\`FJ[';',aul\k]A6e1.U'a#\[L +0o:FjDiLH=E%#\cqHj(6f>+^2s#S(6*,3!Ba(c1Q9GAU"gM5MYfpBRU_DfE*I%!A2p:;8+rC +10s8'^#+o-+mWN+PLZOGB?P#oLs/ra;-E9XPF:rlOa"MA)nEoepsD07,2X&*I4_,/_KStn+/ +SYdTZ*Z/s/R]A.H2:WEM$?UDgl>>-YW(J+/TO=M4t5S?L]A_;0;[]AcE&O%F/E]AYpOEcUu-4X34 +SPFgBbpF+>]A4*OEP0Y32&rDE+T+6C[.\p=i3VPUjJS]A;E5##$2\q!M=eE0=P!=:n-!@]Auh>1 +]Af+m/d4U=.me8>&_Ads]AC,G)B" +noT[K1IQkm-Ci!M>4/Q"84Vi"rWp/nA>d/`&pr>6^Ao_YF-A[fRZ.ZY'SDT[Y3Q +,EnlcXbFDFt8&GEKUFT]AtC[o\OF;(7DSPF'?< +26'5-mS)pUNt)0\(-M.D-5W.H$(Ys0-:Ub\"fs2^ZZH*Sgpach_:iC``e3HclYE"C9r>ioeT +.E^5(WRd3"p/0('RbG'6Ln=MsPWqb\*i1>BQ-tr1MHD2?0B@bbA1X?>F';B"OlR";J,(S)qC +\sTT^*Qa-<8,k/N4"%#%8U?UeQ#2BB\?-C7i7\DrP&1oi>#bcc[eQ?9+/B +B;CcJ*f#^rMn"jS^D0PJ?"1Q66/;q`cL:s;/T<+!N>(Nj@U[J\)U6e032bIqRB@cM?N1G,62>! +2HFLm=3l_PP=e'+n:!P)iP[UWdKHT'BK.')NsaJA2ategMaCODDF;AMF!AjWEG\B$8+e@]Ac"_R^>);YGa_1c_l7H'SP>d)I< +i29K:6Bt!ao;,V$,M]Ac),Pb2":ArP:WW+&BEJF@0Z@0i$dn@V=oq4>ArYI%jNTOF!:dq9gNJ +_;5#&p2*`4u91c7@^hbP7FEBo65hctj/c!'u0D@V[K5b)+Vm56Ad3#)O5\d&,8O'R"K)Qo_g +D%8$7dDH*D;05bK%gOmGEUc/EerQD\-IJD^0h3k.3QC?r>JWpsFKl]AaE3!k4/=8AD_47Q. +K^<`Ac_E>(JRkS+[r@)0UHNu#BEk[`gYRm]A.I;ql7mqDrc1 +?*jo2VXS[UseqIS[0_S2lBC,DFZME?eW?Mro3"M="FA+IR4>&h[SLn, +N0V2\pPVj,m6mS]Au)+&f\*7X74&)G]APt<#U!f(AE4+>k1&)eOo?JP(sF!)e#:H3,T2Rf_Qe1 +sO;H%"dRP[IHo_5jE?q$0k9J)8@)lcj:;Pasf!)#5'arWlMAh>*LrOGf$".m1a""OXH2=!", +pHWC%UKq819lo75N&OAl<(WRQ`lJrEs/258S1=Id5&m67o$>U&VQ3>[ol^h/tU;8-SfcINYK +C:Zb%[Clq5$9o9O3q95$dT8Sga']AI=7hK@J>oS*_(/O>r-s%KFqh:V#nW/$-5=r<;Kof+4=U +*hM5UXo#reH(Ma0WG,dTM'LK/<-8jWe]A]A^hET_4&:u/]A>G-=?M\u&gXa>WA'?BVV`)T>&Ta3 +TdIf@*f*=A/#i$]A.!r2Cu@&5'`,DFG"Yp0(8@:?It"7T7!ac\T +KF2i9m=N6[[7aWp#>S:@KC^CW2/K23bLBn\hO^'&o0-q"F9I^p*FI4R(K1G0&2XEP$Gtt^6_ +rOQI\sN:sV#tbT8d7K9hoHnB56V2-bVDh8t)W1Sso=Q4$?5t2a_(F#.6)d +eCej=s5)5N4t2hV1TK-Ybq6+P:ahWZpUg/`rU +f?PT72Z:p%:9$,)C[?c#^)c`=)D0R0H9^(jq8ZV8Rj.h))pI&#qss>T,j=eY4[/' +#NXh=OlDQ4AAM+s';N@2b@>gf(s)AJeYkr[ +SIm5LsQEmsNh:VH$nXG8*\Bfs^4!;XFWe-iBHY*&399K8L;Jo[W=TfZ'%Sm`QkaHd+I3)%oN +2,us^JYB3#H[o[,eQG^uCdSTgoOT'i%j+=5` +D@b@aIkhf-rVd[[PQ^D9JCZ15C2&d0)+QTF&\$JT0A*HQ\?H(?GFb&%?36M2/NCn)t4,[!J0 +0V;\M':#@:!3.e%<"n3=KIp8bI[(3g_Y.kPRI2.2QKX$un\3hk-Z]AAR,A/D\Ua4&6`4g/#iP +p3rI9d<@QFRCHWf(g)hQ<^I4o]Ai-i@$'u=I&d]AVFB4qkpH7?/n+[N`g2Ytc`Yn^;CGF:Qn(]A +:g/hZgh[^6@/r;h8h>_($dgH:"458Q`5^T,Po57rgaOuZr9!b#'CD'%9B` +$([/\MRN':,kimo7*C_ +,`4h9L^B2,e4A^(L!aB:Yk*%AE%<1\iro/p6R&f']AjVpHIg!TW":!K=ppVlUF@;fIqb"qZ

Hsg`RiXfMLO=4]A$'OJXeCQ-E7%h.G8"5]AZYT8ES\PEN=lu-Fqqc-'!rgO36Q2nQtEeDYK +a@7B=ZhsSF1AdqZNg0JpVd%G?)l#\bT(rkU?,cQ[a:jZCob6S6fPRSp^IsXZqFtqTGcR7PO, +@P^"kATAA2q^ZBEam]ATqXgo&I^qs/,':bqp0FYSOLW/YE^2'DaKTG,SKUG(3b82uZVYLL&DNG3f^'24HVL>F +?Od1M3koL]A\A]A2E$p$qE[H6?%M]A>D1d(<0-_?@]AMs4\**01gEbK#YcKp,)H1pM38f^L6)j`b +!ua2uBjmfnutnkli#9GSlC@jc2,!-e7rY;7-cM/`Fcf5>PW4"RS3c87:6n:]AOBp27BOlWUf1 +P'!]A#QLrccD67?_K`gJh>#3V;STrf02`3@'CSt5dF4C!,KhJG2)`Lp7k%dNJp)^Z"^mo,cXC +%f!T'**mA/5f![N7Q*f3@(4cY(g1aS/p,PN4 +UgG&9Z>DJ<^V=Kg)hsC_aR)le<;FFi^HA6Bn\3a'[7ZbrLQI:a#.H63hM\<\]A8!:$bC:'1.NW&^Jt&Q`?PR%bO4]A3jj%JZ3"7f9c9, +l#k@pZ"\*q"joHV +dFiEo[B^fNlFErf,b2\5TZ`]A+dVf?uhW.6NIcuTR2jTuoHr]AXrr"Yp1Kl=g9bd_*#D^HQLct9=h2Bl@2?Q&%^$oAY9 +8Q97YS5H@*i[o>]A=EA+*Ufe5RbW1>qSd8"8p@G]A)AqgN11D0FpP&.l,THrF:N3UnRJQ%29I? +:YI]AFl!l&#\k%c`JR?)egqij.`^\*QPIUVc*Lu0l>91n+*Wf> +c(sXqFB/t\SHufb\8,-+=O(2C/"`sGDe$%S+^';00D8L;:Psum8Y+"nM:Om$[A:VIKa2F-lZ +)'^:Ylj@':uUW +oR\t]A3%BfT&7"_*Tf+V.a0&5Arm8+s?=MJ.<(U)pXWM=g,?9*anG@5(UeV)"l;-#[PUR9UaI +?gSeM\2\a4o#TMMXK$aGR4F4TqIm'>@@aqRWZ=tKW2`mqY+9@n\h,rfZujA)]A#GLIiR5S!2N +05rJB7u*LN4aoc&A&?d(_APh:U3uY-re,Y*H&e&K0oR-CePMNB(3+^'HE0#/LQu-r-&lM6642URpL]AD +meE'\jYq')nObJ@UBhnF9sL8gr2agQ,HekB$FWAcc^,gRj5P35':I0]AAZknP`+UsWBr"uo4E +o3<7Xtr77r@*64oX:GW66FLC/;`XUjOSk7XbAZ;Q=;aWI@1M91?&?$9jQNd+t_O^CnK2UeM) +<+0ufgMh6Qc0&=Z--tVWo-D"\OPcC$g-eH- +ke52170bVo,YcMboJ=SY\?fiu[)\T\^\ica[-1JjU2Yhg#V3^aaJ+q#G*NIXtX]AD_%R1D3-2=]AYHpGko)(#eqftqJ:/D#EUr)]ArI +T&K1I[o!PZdE;$n1;pj6YGLHPr)dRkh[#B.^qAR_0bKBOr%,!qf[Xo/-DkE3,h`kVC_oi+EP<)u.XJd$W^Mm7pm_N#]A% +8PGjG26G)df?Fc88r-.r.'$ek8F`B@o#^N$Z&m7"dIp!POtF]ATG+!A1Sp,lD42o8.bis;` +]A]A.7>[sZZUFoJb9/=jL.=&JR#=":U`b3^0[2F;bs1P1&ZULTI<1@co`%Zq%!`/W?I5b4&;k" +K,[%hj@i051$AH>"g]AMD-th8a`'oT&TK,jlIf`Y_/:'n2KV+,+fb?>#;?`GV*:2]A:]A.KTpWdlg!MNn=pMd9I\#!2N,K7N$]A5,r +r.,6r8l7<';P,P@.Ib;pBM&nkDU`G_rkU+J=g&nqtnn?#Ic6jD27V5RH._(qE.>\F6d`O9#ZRP&!s)gJ5pNq")+8YMu72H(,9J>I.sc* +(]AZqDQ6tX+'0973OuVR?N@$;+$'D +\C_h_,WiVe5[&&H'l13#8=kg>/-bZA5dnFmbu"LZ:qZ6lTdub/SV0m?*r1&XUXcp$6o#5@_c +.K;ZtZXg"]AU)JKX^TVFYc>gjECB]AHjslQ5I6qeirT?$HkT_4DeMF@QRsmSN*s:I@eB#1`M6^ +A+=@JD1KQ&a7'%r0k!m2\aGO5p<"KOEE*sW[nOCWcBR9/6]AcfiGgE^O3Y@l/bq&'N4o[_;ns +.%gCST/KfNks'X]ANX>9-\SG7VaVTCTfJXDfH^LNh#PZqJAIaC`i&(]A>EiAH2Z*7%=ecG(fT6 +=Z*sf6`YVjqpko.8M\Q[QHul%e +h&j.`7h7);_M3>jCqg8ds/I0Bh2Dl4H@$,WYukXKB#%FReu*A!FF6:TRDXJ29`[+'+OREoKH +Xk1Lr9,cG>B&[L6R2n4Dj=X^LB*BNqtb6rUXN@4 +N7%c6OJYr"e&ZTRt]AS_eK:Ta@GP]AX8u?YT^5-_+`q["aZI>SoN^9.#W'[OM!5`@&,YV_hkW. +rJ6..:=<=)tK#\?D?JbJtVR2(";\/5%64-Qi,8/cZan^-0LPelf6*14T%06[ao>#AuBc"VpbP +m%`fI0#tD5B?S%=2+Rtk_tSk[p\89VN5;#l(ft@VDu0'D+2j0U(%s^oFdp>)2R_*FmZ2"!JA +;:"Duhe[CoJ;bUh#%,%$$q#e[:H5&-dfIRLT*_BP&ipd&`5B,G84D,?dT)H`t"MYX78Pl0?9 +FjhC]AQK\alo)(1H4DiMon7(V]AQ[8l$%>G591Q]AQ+:,l+=Wb0V@,$Q!R;ig=9n:6.;<4dHPp7Lsp[,f704_V!2)lmTHAEsL/UCG*f+JObp\\P;D$7IRb2B^[2+HLFpX5H)0=BXoMS]A"oR +q-NoV/?<&#+ciOXCA#13X7]A)l8fVEJQ87;V/B-FWBoj +j5!QUF-o`M&qSJ>&gEkW6DSZ$FOm'7qbuVTeBq%^E''Rs3=$Q?p8+3(ntbC0KVaa5+[JXn4V +GY$Z(W8B9[&@:UV'oO`9n.<@R7&ACLTnT=ikKP@A<^!'qKl\n3GuqCN\,2,GWB!CfXF'R$%; +8?Z +gA4g1?@Z1uR"a.tC=)GaUbMH:M)`eQc8N:Fpb1juj?>W=LZ +c=p#0g8k?DK:p5.SUX2K/#dN)Fdf0G'`mm"&B,X$78hHUOA*<99?K:5TdeV0#ja!0+?81!L1 +=sm4eKDIPlMA,U1Lf*-7q$/hbI0L"TI#LhRBkp/Q47-1EXbL=Lb;#Vt>MfGLN%O4d4UhB8RcR_.jiW)XA/Ma1\[16p\i\4q"ecqZtB5M:$G\!#iP0GS`L@e&J+l$ +#F_t^iKHM^#BCj/>UU54o%%OF0F`=6<)Fq,8X=tU+rKM +Ah9_6[K

t#Xb(@(/O'0$sHBQ??!m/YB2TV4V%!CC!UkV*\Fk^E^o.=m*CuX+QUE\,LmY( +mtZZg]A0]AurT`ST^#?lPLDFNX/ho"iOh8)cbT>S/S!(Mq7jH:jFElG/[+j:bilH7M<7:U/^c]A +@\I6\ELMfNd1"5u+d^N?oD)iF*QqugWDk:0M1DX$-iCr2\53TH$NC>(YGU:.PQhl5?:/VWN7:W6M-3I4J +DBqTp6$A$rTUBZnRXU#[[Wtd[U@USA9:%r0AGOiP$t"fQ\s@g-51oUn2gu'Aa,;-p/oZnX(@ +1C.\dXlU-AMajic!,$3q'B$#9PC[KrCud+ZXl[#@bC7`O2\QYDB7M:M*k@@+u3PL)(KPmAEK-(pVE6"E9;k +&Aa;4GZD&rdqr>.%)=,<>WXji+/m?"8Ph6?kJ!nGs6)'@quoYT9CjNol5F:?5N5>Vh4Lm;bG>4-"IC\]AYs+O_ +8M436E>O_@pNrE?ITgk5)9fccOD_H.m_dg]AN%G3LG$/9!MJQ)_)QHRuSYklF'+4a&?=e?ar2 +0EIE5>P;,_%>3roJ>'B\Mgg3c!pup,#9G9l*?SOMakeB\8h5$82"rmG0)D;WOhdR.8cj3^pNE7S%2]A9,@[+a:$\j#]AN?qmF0S"tEVbm/^54d=M.0*L'NeAM$h]AMDr,T^1UesR$hHnmP:7!E>f#bF`_m:=[F+f\)*r> +%5:uiMHeP1k47r)-b0l8mU]A-\nKU!XplouWe"4ERY&mQ24#siFZBU=a'(IaBFr/KD,N)WJO[ +LCZb!n'6QS/LMj\RGma;/(Gi^(5a)_#VM:3U0.G/YTeFlqk"trOV4^pd +6:uB.?f(8Mk,'*iGGH%tRCq.uBOfuO4:$U&E +eBs81XHFFomfXLn@e=tY=QDM38BkM6`J/fb-Kr=4Tpq!Poot,Jdo&qj>qP`9)2X(MWi/W'1\?u).UeKp#Mr00Ro-C]Ae(cPnUP!S'T8B[7qs7UP8S,1E +iGA7CU.:8>5PaZl5eShcrW9%mo]A`8<8%f`*qcTlr2c/u+pIr="6+lELr:r;/I1pp?!f>/dpc]A`BJb_,n5W@LWS`Y.a#1*1jiln,C>`f"U#FZ$NY5aTO8YC@IR +Z)DmK'gotN:AYZI89k\J.Y#gL.KJ[ +#7R*BXSRI5LnJ0_JP#9E74u[Z7D,"sY48drphF'j5mO>*N4nC6tg#(0F`cF.IsSWq"&$2[-r +2RbR4$;rf0lofL=hbECsknsp#L4'1W,os-M[HL+GHH +sn[i/emiNFfnCBfQV@>:1kcMN'EGJ-$-4_d@2]A^'#d,1&<:@NWM2VKGD$XacJ\8ZdqW0VOt* +FubeBQ6mFMT"=75&E#B3b"#e)5#gV?2ar]A6nT$DmS;mD;RueP4W*)k=8/`3lA(38i_f\7&@j +4M\hW<;3lXVB(H:l$Ko^=COki%PkZ[ilf60p-D_0*6>N493Y?O`5CB80E3Gf0)Hhq=#f/j5Fp +]Af;K$Urc3b\=N2o>1ND.QF=F]A/._"PFm@A#3)GfYCA;tZEI,"NA_@ +s$W3'$+]AZe[u5mlK@Mi8GHP?0R8?3\uki+;?5bJ0TZ2Q9g'i,DNs#fo/@q\Zm:K@72*G"]AsD +Sfj5oBWYHMX)\@91n>aJJu]An2Y0i.g-COW8##WLU36(P*bh8bA.F%SGV^Gr^kE^ir`[s +n)>TE"bS8jfK%Z#3Gmm4(#0$uaq3thA^__Y-f:Si8Qu7FP +i4Ojj%2<3Vbp'l>5'=8?rd>%o+r9Zu+F)rrmlX?tC:X;0sfVb)!3r!Fk_@2.4+#>#`Qd1(cc +#^b\Kk/=--0oc*DX7lqdgqQ]AiKcp9d:X#m65Le'fO$-^YmpideHeM+B?j%DO/"6$-H5<&k[f +\Xp'2"?R=A%$s5TJ:cVpLh@TOiWVThK!\Ep?L"Y/!QK,HkJkj+(u(S\IBdZZr-m"shodA/"OFQQ2XA7bEc;[=[*_/qT +"0?/NUV5%"$V_s_iB+im".\?\Hk)Y[n684i#`&%;LoM2.AN$%IX%QB<\F*Y'Wc-V]A(N@m0IQ +5ORr[9)>3'cSe]AVOD2@>+lNc7mKM#(0#[uehqKUW9bF-XjDa(`3P)/!Lg]A+0/g3-<,Ek-S64 +/\$<[isVZY\[1YdE_\QqpFT,hf)d"oIsoaC$cnh_%CEg1)9kVX(iY6**A-Qmt@Z)a6uq_?T, +"W>=iQbW%MI(^V#YL9*E/aZ9;3[SNW^X'*eC8hPP[t<<7!cXI^3_KW(NiQssitSls.4/r$6N +ZPp=ZsEkmTaH&Mbi39)H9@fp4o]Al%^5Kbc-m4&n0&qCMm'k57SWfJH8"=I;XXj>oY6f?00B) +[DgKEI?N]Asbs5GJ(mk:;^r:JZL^\[*Gg[@=OSuP]AQ)3%AjXUI>L_A;h"5#d,g9`fLNBY[uCD +nc[#&!49Zh"&D^WKV.@>=70 +]A4[P]A#BF3W-eB!E@OCn0"8[%:+O4+GL)b +;dur)B\rgN8X>isCM;\N:^s4a/edLG)MS8PL`cs.+SR#:J>'050"(HFrXI(/?!R\)Eb)Ij5]A +R(pF9"49:f8OC?@!`pV+hQ$b*G,`C:^;@[\W&o"GC<05PNe(a3RB?gU;J +8*[O,llRVA/RR"@Qoo33D,>ERercR0^!M0fuO.iZZ[4&A)E)eIpl&"epGg+kbYnBI'+[Yks' +$:b$cOiQgr+5$j,?ni]ALlQe\]Apl(g(c1#2Lg+>Dmc6rS0,h+_3a2Lpl<>X_DZ,BBqIfPT]A\;sF[V/d8H=NGjJgJ$1h +cF@n?j:g!&D`GJ'aEnR(GI$Fhk?WYgp5X@R\?(q\3$Z(O"8&1#__'J0;1?Wk\FY9EobJ3jMi +JklF:RngVCC&0i)@JTnFqZo#(q8<&kN8*5mc\ig[YqIP#]APOZH[f4@7f+CVD7h()KLhe6E(@. +PY4\&Etj)%)"uU&(kjl6k*4ULUT`^8(HB[4o&!2`(lh)BWmB\,Oc/M'd8W!DP83pl=PdFkru +0!ZHPiek$;1IM]A1k+UK]Aq1U8F)QUBDU6\O*uU'tGAG>RJ1X9b;h;["lG1_Pi6Xe!KU)b561k +$G.C9]A9`gSf_u)R4;F&>M`!,`PCRseEo0PC3Tc#KW?[Weqbe,u!;f=ZY:TH93_eY21[G&R,ZVYfkP!(!F[g +j=BUJKpas3?:YGgTGW20""q%m(Z-(6+YLoHj+_Pg,JJ"M;c?blP!BI!IQ"rfPj]Aqi0i_R!"e +XUD]Ate7%q>\`Fo=^oO>W":Q/P0sgKQt]AW_[-\'uPeA%DeuZ%LC:D,^rZ"7QnJn)H2Y)@hf-f +4g[(_D8;V+!FL(049W^QLlST3!db=0KR9A:j6l\\i7gl3"qfsrB^/G`_+Yjd*9qWOAJf[t;b +[gjgBG$'MMf2-[dgI?K8Q+5K)_9afL)5j&+U1:*aO+&F`RR'RiC>65aPp8&E$-sKVL:NT]AD]A"G*BjrkB/t)qZdoFAsW/'WR=Z6\E")Y5o-:i.I_ +uS@Qp4)j9k]A^-4W9AW"f^.B_\:ICQ4)kk)qg&['Q-?jH=l/]AW5<,k/$tmS[ki6:^e*Md;Ape +Rc%L;XqRHA06i%0OfZG@?!H+4N+j-(r2Y&*SMqt8X!<9&g`Ecj$<;2c\tT0F#Cd@Z\O!h2_N +*Va'%@mT/sZ#1ljANqHo[A3"\Wfa4q@!BPDp@$$)I$I0sKio65#@bRP%kQV%Ah+U3a-:`Or2pWH4j<./@BRmbb2.$WJ\9\YqmS&Z +`oU6KBhqWBGqu6F5S0:?RN,<,]Ae2R8k#gJ1IJ63ehl=d^R?WihY/MoG8,%X$,k4*X%+o@S9e +@H*4b%kW:s3U@;BqOgO67((dEtGbm7YPfiM21&!2S7ImH4_hFo61%s;2eFGs/P:*TC[4!1C[ +8SOfo\'<:R1^oP)L71,T0EepF_epNnig&j_pAL<(^?+UO*cET4QKBbL&!u'XcdAN:p]A(!nYd +^6Sr]A.Ctqs%:B^H8Ul#Cu\A.ahY[q(JqKWr0`o^.LPQ9_1CG[0fj>l[i:QQ +%0At^?gB>%l330!gm>^Mp"4r:^#4S/n9-p7!]A'2CAAF[Wg<\QZr-^G(G1Hh-_Fo4,#2'L +crbkI'9`Q#>a]A%\ie?gHae&_0BOa>acdNTe"$nI#C&UrWL[NCEm-*H_RXj(Xd*fLE\5N9$i& +e68qKjkIF/5(XMqUm"mTt"Fd&+7Z*=NtUKh:<"F*1NJuCB@fN@[/W)s*$7lO\'5aH[*V8CUO +kM]AWQ?R:'%!>H;?4IW^MU99d*PPR<>$9f.=eZ(5uB?mc)[E(PtlWDjZl!+VJ:_*g#;c!KOFZ +!IV!.P:#'5m9!^HO\_?)_aX`2L`'SHnF[l7j2B2PS;`VRElLDr+4KWmR%Tj#1%(Irih_h;k5 +lQ-HYipWXc!`57MU`S9bDG4&&u_>uUk`%'7LAJUHIgfS9B!g:!CUMmXgr-)*STs)K$s#E+A5 +Zsa'aE1]A,Sr#^U,F%j*1D*tD(+a!%WFW5g\ +*\jNK5*B+QXm-T1;'3o7)`YPhiKr8^R>\XojnacK6E3FY;'AqG_?hO\Ll2i@qYda,Q_ZpKZ]A +Gkj0&#_Ui%1aO:QL:9aL(]AY!/YcOkj0a*akGGA*]AFiE>R`)NU(QB&?\\6JA<]A(WZNFLDdOAX +;\RSrlh:BRL5D4IFbhiRdknm80L:C=e%*C_3dVsdr*^_bL9IZ`Dea_I]A]AJ@usJ\"6"MeoW_p +X(R%>2TtHSV706aOm5?\JVbk.B36GD#XLrGOO,UDrBpC#.B8l.>[:Lfh;(f%ZfRD"^OH1Ke# +/g$IJOXF*p.Yl%r):pLMmWOd/Dod\XE[7o$QVWf)P<\7KkW+81q_iHM@Tul:@ +!m?CtWm9LarboLSa4++GCcIQZOfgmke=Hmg8QW[Ce=IE"Taj^tP9g2W=abI0V4F?k0WI/m+F +e69in#%m3u.p7e]AN<.q3lVPGgS++R;UcL_M@)iM=m1j0>,-'fo.F +_r3G/2$sS#)[`pE%mNGrf.R=I-"HaSBdF="iUesS2nDm`Z-E*uaRf.e(K_'Iu^5]AbGI(/+YO^-*s/(/a\kcpY[6O[/bGR#`s2>UN!dYaHVWRmXMdbN[8@`EXQUjRgdM^PV2O@3OZA=-qW';1.-< +&;[49Q5>B#CU,0,!*aQi*]A#iQRuCJ*M/GjoUsI7U> +:erg)()\uO]AQ1Acbp#k[RfSPDOcC0_ptNQr]AtZHaB@_!=X@4Z"DN>mSp!Lg0"d37'(D$WQfJ +p71)a3nY"_7Q;4U?L[?16sTpQJAYognlG)^$.*5)9aKn:%4IME;A9m09(uCtW\69WlFN]AC0" +.%,"lIE3E7G2QrkNS(Q5!a4ei,Wl)BTn(c^P?%Gr<^pE3`\pQ5VZCE=+cGFiDc2*#0:V7A]Ad +rI&O'!B[P=(i$ZaVXg;kPH-0qcN$!#c\uf#pW%d;qK,Kp%$CmUYlu( +$&2+NiIDK=:0n;.:[J]A++a[_`h;/JmLN>ACE[$D8=lNao3NfZpfSBB[@e\b6DIb679;RWPo6>S^Fp+)\M>%jbD34cX4+pYRasYg-;DiK(!I^ZZ[83kEK\eS*ID1^@=SGPqB"eZ]A;;k:GlT-U +g:uU*Z]AK3=;pKd1Rnbs'dJ[V2O\35A=`6@a"Tj8[6q_br=#q9kAc2).4.QRJJpWJeVDXQuAI +EL^Y).6G?V2E3'Mu",A2'JA_UH\oI*(`(,de[a/aeBOX%p3KR5Sn("O`.VQe>;C')`Q%^7R1 +;`0k>')LHaEU>4HOe2E/CblB_k*=QbtnmNI[&$?e8!'-)ZRCkdcV5/TPilSn$-f9.nX:V0m>UH#N^rMV/)4?L_(\0olN&4jK+)Q0:es_ue55HS0^< +ANN@;jWR+hekHnR#3kGa70%K4+dmGBY/Po2q[j^CRuFL5=(Vm_0X0D\B#E)Ci@$MC8E,io:u +Y_M!k22[m"[jn=nA!G7Ff%"sS6[s?]ABMqWDX=S4*C]Aa8N4b!:A%mU'cZS0&kp:DuMI=^cbI" +D,)UTQ("bKI-chlfcUs#KBCh!3ZjjspDSccs)s"mZ&Z_'p^*Z/#i4kCUU"l^]At_!O'u>!9EP +8Dh72L,hOuuFP>1Jm]A'qiE^;32@uT(gNjWe@ljeZ6cTsM ++(?"#%qS/*A%*ca%N5e<2nme[2-,:B"5^9lB,TFT"P*rcb;k=F%=fHAO(LMl[NQAG4Su^/So +@'f^M(1dLk#]AZIt_[@`jRX!9*-C5i47e`RX-rIG-b)irhs;b`gH#e>&YIghL\h?*h+?(3qU& +.mI\oPb(so,Rs;T]AR-6GG0LI5M1$`D=[0m*Cr(jjme5ZOJa"b&rh;5!Z8q%;N^m!&fZ?9iW8 +YBu8l7O_0N27UV]AZDa$F>m3W05iI[mVT3'CpeFU3B^fU)/XHWgeeQ[QTZthGRdX5h#G^WH[) +r\Du%-=5J=\kh)09!bk1/K%O;?W+D3B9)[B&5c2eJJ84#<]AE`UHu3>r;cB=DrBi;E;P$IlFE +9V4-"c*) +#g'ZL\dcI$L@(,s'Js/5cbSN?.\EHBDjECHgt7>*ut.(-K@sgKG&:*kZNBlJb9TD8j9$j?F$ +V>7"ZLZimgdDL-).G4XM5qUtY``n]A8?g%A&RQ^D+iK;6,/@:3?"Q3`JG]A(Q5#[[d'j&ledEUrn"A\CsWU27Koq88>#03Q[MG +_&QT27Fn)jSt[IYgB[k+mYFs2$-QtZ%*K_e\'U%lmEDb@T$INe%;LUCl]A/qnQS)X[GQ73h#>a6,5i(o0G+UsG" +R>BegW$4JMa"5\m.[IQbDms"P^7gd&M@C9Omp7#-,4o^I_Put"1a2B2.""GEUUa"b?$@!Dlh +4/:BC+i@1W.;5Wuag"(0Qq@>F[hT[[O#7_OYl(40^B*-K)cj3E*LBKQq%pnJMji.sHO4Q5Vp +):<-;+K(YuXlPR:l"O]A;6?-L5"Zu*"O''LqY%u-6:IljG9Ym!Cor +qQ"YMlHR7)jVZ22eS0(>@6,qm/^$.b@@'RkqU@%'DGs%0j*b"5:]A,5c>A>*Uo)-s'F-'8E`# +=dLQln-OB+Qa?V'BFVeGHL!XBfY;=nB!ek`[O>D"CsfL(3S-QApRq_RHi+82_f8CCgZqd:",j!IEE +E6Yb;e['9V]A"Ab"R-9*n+&Ljl*mNWQbs&)4oP45W*=HWj@&mM4lPJ0R:/qi\IookaH7'/"?F +c;ddn7e=#mrKu)($7n;k'M_99IgPWu:.k6'be[KPI1tP`E`l%5/eKTq%Z,B,)QL'R'p8FNl\ +<(1Gjl>++ea>8Z4#F^@3Q^9SJ>+d'1Zq6fG;fuVatfS0!t9,fZ'cV8>\a$C#L>aaEZ2SZO4S +NH.E3#>a]A+'ZDiLV(sQM.)HZfV@'NKj?#p9D=8YF`k=X#l(Xh_4rU%JgOuFX0oIj<5;Sua=J +(uG)B7K"AGPj:_'"]ABM24Lem--p;rrEt3ZR8NrQG)]A\Jd5B%7nN?Vpi6`@T0EpT7]Ac%oXQ/e +I]AK6Fh,,@RAIEXK,"!\*5)qOdVb:ss0BsOUOQuG`Lsik.a29^%:ddG]AdBmo"]A7i7+@4hnVZH ++@&`QS@b7keu3_/pY@(f!4-44D9m1ioW#/d2bsm'kgG`]Aek=B'SccnU2YJIVKsc-)mP"($rI +LDAHthOAL>k/C8_,[u+P*)7/8K%++HXDB=TqpdnCC'$Pr4'qMGb()s'iRE*C8=$lAIh6H70% +]A_#s#q[b^?GCLCnWObB?G:cqNFfuojee]Afg\3o_LP5uJ[D+H2pi#bCJ#Df'QZ0pC#<[IIr,Rs>F`Q/=>8TWZ&E61T$`.Si3Y.GdC9E(kR3>p +rM.h_^e-!L_I26YLc7(-SoM^cI)0OKG]A7W?n*"oY]A6dA%UJ>&k>#-S26TRQ[3QfIE@V)+gk2 +G"n!p/t"W89CI+,q2X\hhBOPT!DF6[L.c8HeO&9pn[,Of;+mfQ&89L#Tg/^6QPk'9NB4-NG' +\rBsJ0I/I/E\-)UH4D..(TW2m5#sQ>0@V>pQ6Nc7!r2Q1K0VJJ+MJ$T#5mI!&+QbMo +oETSjk0oU@ks.EWp(TcVA/f0>Vc`=U07r#oaZO26tSdhjI$Ku$pUCVCk,JXRb1/qR)m',Tom +JV:mu_:73>Z@nCPZ +5`(9STej&iE1CjC13A33^*9hm:c$\4I`GMCWXuPd1`!XQXC1O4D$/L#\#jjZ"'aNQdGAeY;m +s^.UI3?+mgoGdPa)piO'#*#od@hn;q0qj8nS5p8#L+edOgEMS2E/U\b"%=DL*5r6tT;VL.)< +qo!47LI$:MM+=PV,$FI[eFr%JaOJe8-lIq9lC)ak(m>DS2`kpBZU(_(qKsSUt(&tg5cc2\tC +H8VE2K3Oi]AX7*03'4[Xkuk^XT3ldHVL-@2qX_1n!jd=;_3U4V=uX7GoWctc9piraL=+`>$f+ +ibX\_@c2jUAaCpfNF->T$?'UtH<(R.Yb\^^_4i@ikrHp'pR*i7fpW&t*t +@K,]A[G";B_sh!g)LH3p:#p:4-&Sdh-FW+jgjS_`/\&:Jg4$ikL>mWXE:E7%6eeg;E;Mjk]Aqj6S:(FO%jm#Iph1B#9r3"^b?U]A^0oa`M+m\R'>E^&GC +3pV2D>a1*=:J[,79._t%NH^UU/Ya\[df3Lppm3c +0T;s8&SEV:UG*?lT)fik[KjoCh^e+VMo#quMgE"l67-$nXq]ATI8MS^BoFGB51)9'AMX)alV& +@kVB3(X0I0d"D*D1IX6=ajKE.(4sTbnc[Mc`'"?pqN@ +\8'Y)?7I>83GAk0Gb6>U^RJVPPV;#/+)JVhl7>g0[=lP,+XHLj-8,'Zo+_3n/O.WVsbDd!G)W&#^?K4X\^obCFA1d +d?\X-0JmJZ#_sOKdoZj[B"c+,+`uD[q8-KXSHaPKQ!pq:lk9DpYtIWFOiM;;jr"lD5n9:h'[ +>'An8_!?0i01#SVk-#L?W/,+@9,7W4$2o9ZA\ +\(mcTLE5JuC8mF0s;qqJ]A>rfN=.5?h&SC!0jk]ACY"[ZPUr+gq%cSI3Z&?PrBC"lDQh+B +EC]A&O933`0H1hfFhp)H`'`?FHpWm21\T-s3\]AsfDQ$L#G,90#JZiphInR +$6XUJkJM*:33L4hc`q(NXnsUX$r:.lusUND5._rA.4;eAOagBOK8i1cD>W;KmLraD5of#Ft= +5D85Es/%^\$=j8-kERLk4WMRf\MWs#bE=Z$*P)i45O#IYGap;fh/fQ'd0iqo/(YeN]A'1*Xec('ZX+9=b\2p=InHTCdT\DP(L_nV08TSK(;dD:e9Vs0p3?(.(!:VXp)Ts_^O7kb +s5;62`]A!1-]AcC%9K]Ao'V):1YM-aKG:G^[c_PffokE^Z/>nX6e%Rfr;_9l)B1qPCR3+AJdEq, +F\[F@&4`D6mJ]A`-$6Ci'^SdV5?#NGTc-^E(@"O&&qaE.;%;NEe(%H!+E/_7QEQBo@W0Wij(rO\Hk0/_dtk/MeIjMRG#2C4V3h74H]APobG\88PQ-l$r +9OdXL4U]AV1l?7JBjuqB!sH8<9287AOfOYF$Vo&kG^sH2An#IXa)a3[V^Q(Y[ECceWUJOF!F8 +ocN]A@5+9Un3p_;)$n0J)*Ztog3hW!&&f(H8+Q@7/>J!YKY7GN@-iRI`n#C1.E&%,n5e,taN\ +;"Y!FE)?N_W""Fb1KTDkN3YYV+Q7k5?g]AP=4/itU(S3Q7!pJf95s%ZLR0MIEP5+'1bp&ASm# +9(]ADM'unDVXHD7K-Kq"@b1^1kjf5E0u62s4Q?MuW\]AGkZCYhJ7\gRGBhqZ*8ea$;P*QFcZ;XsG7=)doZh:lU#E%X=3*Jm5eI\ +/,+7JmRK4T<-lcT_I*Mba)a2>.2Z=E0fL6shY9oL?mWiDEB]A/2ZAj%Hn4\qW"_DCsj=Bp4S2 +&nM/Z$Vq=3kAfFe%$]A`^jF">P3Q^gf6arj^41FhY-$7>$C=4D3!KU,l_8L\'g.d%hR(8m[?, +;gsV!J2M28PC+Y_V2Jl=9RNG]A\!+LJ.iS&4Y( +7c=s^=bZqT8:U +TN/38r+'oba%K?,G,lckOHsAVIkKiS]AkT^>tnh%L+.FU$/.&gjA;:6>UAa($e)2A]Ad(r**S^ +lc7$jg:FG3C"4AMURn'FCga((RAgBs\rK;1E737;1q[07El<3%XT2(-k[J+s,#D%.RTH +6A'X]AZ9S!_l<(.H.&]A7Z*:#m-6.1Qqq&!4;M=tBk0qnq`qJhXaIH_X/!MGTjtHC` +eA_F;0"[_^>-H1W$L1'OZ/a&h,4\W5-BBG:LlqC[J!VMOo1-d(Z&-mqPS9g%9Q!ZS_qc2B(FklsumJc\2r +Q"G%]AgQ]AA?BGHAPI#>.``p&D`H^aGK15u!G+;./8kZe[\S[)<"S1?Z:7@TDR^&dsDVn +hn4*pg@^q:YMH^-nac89$:rs_KmA1h0FTfJom''J`s.HfkJ\b5 +:hqh7Ill*^%)Yp%%+Zgf-BUN]AadRrcUk,S9W5HRml6R\ +1`@q0+JIZa%]AgYh6Bq+Ro.4GJ=JaB/f4$BJl:W`l%E:'q0pT:996#<.jdA".]A=[;)PCR^OBD +5$6G71NeBJT/,.+3mNQpT!@cO^kH:h]A%OboK42#_);)P7sU>a\\s)dh88?TL+ +eR3,bfn?6,iNibBur8p@Ls&*0m(L?R5?X9+,%UHTQ4uML27E-S"0r&'L;)/,pQD@rcig7?5Pm.H0&0'q(fZb +OK;H6DtR]A[;Z\\"#bZ4b,dr=7;Z%$LNr>0eY5p;<=XfC`$05g)(DXT,j +A>aENEp:j%XH%+g15FCO@`m.gqQ,F[Um"M;J8bUY`_g;T@p$%`Y]A`AD9:jGn,.3e1QlVSmI3 +DZXDDDqH'DsXbOjmp`'H%1(D2M/^617M0WC^@t'stEeS\9`YY%588fPJjuFHhZ)q&FZtX.b7 +kc+!?Ric4"+<'P,+GOb5]A]ANd;/)c&e4V&NPTf]A!nYi$PB-B#&h!`c"`cp(LTOh_=J2FVjq\o +=ep"n5C@q*qf$V%'7I7%!!<&\)^K]A.Sm$s"ZfM3JsD/sA\`:(`@._P@T>r&Z3fk8W<"3;NIH?0&%UV$7A>eb8ooDI0"e>d>5BmCF&+.Q\s:X/\;O\)ISIqX4CeEQX[jq +h&N?+b@\rkl4KhgP;'/4C0=B@!1*^4#V.\[;Tki!db__5S4VU>Ts;g&kUO#1-1P/5G2Gq^+Q +LL*Ic/Ml3K#R6JC/lZ9oT?XUeo*!o#&4Fr%i?`uOH1`GR4%k3stm!;Oj;.a,l4hllB=%9*Pc +me'mC:,2QQmf_,T2j/`PqWNo;r8>:%[=708Dtdqg5B>#j5Ws(/;9"Q[K_>"*B4@"YA/obpGQ@/:>`^8sBoid;cehjt +9i5h*oUf^F*b6(i-JP14t^LE(k99\ngW;IsPZ +W[PkjE/]A;>%l#K>X/qfs3]Aogj\lK..'F*#b)d-BckKY+FaSZOb?NTTB#VGdP>28-Fhbc[\2b +%Wu(;0O;M<69?cUB`k_A:0[n&5CPs(gs6DTuSLIfZ:hV1PcrqMOKj4AKV&+dtaq;fI/Tc>=c +n9dE-,7I7u>pR[XD.U68/eB;N&AP<8R(>nSoriBW/T]A89=XeK&*WUpB1eYop)?;5q!riHF?& +7N+[`4J=eT>Z%qm:u?T'H__9F-T,JE4,Ur\.^LX*d9kI8U.TO'-3L(Xe?hDDd9e'E;[&W^g? +(W-=>SYN)=;htj[_".FU2QcR&F[jYE@UPc]AqY>gNub&#E"p_o:$1([/pt:@qlFnPUD+1q]AHYVA+<)/.gr'(nh"J4V[m-Ir^B/WZh/]A9=E<#kIs9l=!PU*S>i:o'$O^`8(f= +I+^B)FUr\@!Im15f(/\KTAI<:H2cgRMjLVUqrmQKJDcK4mfNSD?+tXa_PPMZ9,j?:_<.*8Jr +sc?T$JL%\c&9G"ihs;^;.:#Rs4;UI02\Hn5&0]A[LBifeI\uW +-?[_ZF=f7NO=qE8*C+FFVM(.7VWemX+Ha^N1YH%QrD8Q/E[Se\]AJ!^Il\c5>U<"B&fj$`QI_ +_M&=N.cL+KSULMnGHj(V?g/Fn'`'aO;Z);6@50)7p4T7D@<4u++oS6Rg:I7W(UM9X[!mNN1P +`k/AFnBUf,#95tXe=2=Xh``T8]A'#`j2d+Xs-?Kea9=>?HnF`2Y;ni:%qX"/hWMNEGEhn`1QlRd]A<0D[E)2tR2Hkm +E;Pq[efI@TT&ue"N1r++@A0XrOkZi%F]Al3R=E:/U1rH-.AS%`a +F?c.s#HAB0,`icEk&#c?!iH`*Rhir&Z`9C=s^+A#OS/emtjJ2d*`U;ak_mi4Y$u?#8]AL/ML_ +U?!:7)"PXL?0hJ,X&+R.Q^?s4mG_]AX.Z815I:dP"-@/tnJo%/A:/A]AkpiXdfg1+KLc#l#&*d +1o(I]AksoOgQ.ntm_`l;/U^H3o\[@[LOsJVA4)Dl@AVSE,ctY.KZPBlOo9BF>*+`lc-+h]An"5 +6K+&<8[^-&JUC/M=BR*hA +Y+O"kb8>`8dF&Q]A>?rJ"#b9SN;daE8SP(c]A:ngJbA/R#pL!8#X4o64"h*9Q"-f#%S.5lX6=4 +o@,ORtscrbJ8n'r=S>nP'=P0,SO>l>7a2+O$i0oj`If6QMmgT$O[CIk@SK53@O!CQdsq`Ojm +ucEfWAuFoLgZ$Q>jVFN!G9KGVsP>e5C]Al0Hr>G.+Z5eW8HHY&MkeX$L5enmOYA\;a3.L`2fZ&W'bA6Fmo*`rj%/5I(!W +RgoEbo4?'C^XDI.$p`h1lO1``A_G]A\e2:o_^]A[s_LY'FP9kXXo+U7:E7'"m,m#.?ADm_+N +gf6@1?.5WU7hNhoP3(l@2'E_WM!9PdABA%3-j!At$GD$!VO,W=.'$RNaL"@V4/<6UNEp*>LT +YS755j%se]A:.#)/\r@sh:u"_7i49hS1er8[l./(mF?`uiaG_&5M+e'cCHbfiib4,L".W$dDm +%&UaD*(]ABe/I:=j>[3iK.XsW#c:f1hk-dh,N4oOX:_J`(S]AIR93f=2-21rc88ZS48N\C?>bg +"(g&[J>aSd/&=Qo3cE9noT3i`VOHV(a$u&(0"lUl3jN-SKRPU4Af;HosqCeB3?3\5XT>NfelO(Vk,47QpB\@(u`dFOX; +)#foO=jU5BZpqIS!I)[E@T;^bHWVPf74P2s)+M]A'_`<+uQ-SZCh%gd@"%J3TU3P'`AWlrAJiH.$Uip@\+f%ZSG?(,m +mO^O>k(b?+/@iSo@%NO@#`h7*/Wh%s<]ArB,J4hnB!.&cV7jE.:(WqR<'nbD_qhajrEP@;#K9 +%_0E[hRn=4oEjIBqX%K'Y6+UHYA\9\U%s#t@PcKLBEXF[pA61"mZE@rTs7JIqLcN8q3fE-00 +OUSpta524>R0aq"X*+>Bd5gS3K*E3!HMo7_Et5(P!N^5s.:A:E+s3DVpi158K'#U9h\W9Y_` +mHc&V2L8K@G=[.dm6mn')N/]Aima:TK_R^t$_Z&2C3Y,Z$n(S;icSOkJO+B:1rj`J?O(86VL? +Hl2/_Fc>P+"CbAWoPH,"HQ,QcZE\Qe6*c>*m^A&cr,qJ%S7ZE,$QtW87Lh?8.Y-s*_=0qT4, +tF'4sN4_m!--ibkf0<3)Jie.^LGMJWTo4bmSH.F#QJZG,t.SogKKF-j#&2,-SZBjL%K>l>h; +iGb!5_D>^0Xa't@0(>3C6>j3@LC.6FhJC>uC('5We65&d51/M`[12mlCm07\M@,\rM`h^_n? +lo51b#_]A&s9S`WM-[/*+=&T48LI39I6_ZYKU9Wo3FHDS9(]Apm"16eMOKOT?u\^a/kO5Wd@s$p_eKB!EJ`[7_[R@;dtl^@" +7YOm).9s.6p9+(l'O@SB]As/BcmcalCp=Ce>CqVriS*^-VmWa,AF.fH*heup&@5;(HpY0(>Z^ +Z*"7lMFH\a7FPB;t!h79Z!r!meA\3!u6bEG!p>:hl&[QJlj6!F.OpgsMR14*%XI$5>SdFY#9;efPcC%*s?oqVc6&7]AmYA'n +_HhJS$B`CfBMkN0!*pBq;Ce,QZ(cohq@gUQ!Wfb"o[o[19^oSIMF)WXP<8p1%g"gq#5KMrt# +-%G4k%SJ1iNmpTkBgiM-+mbL`reSS'UIhn=O.`iY^hDr8-Lj8,T&QT*6/Xfe4c?X/teR?#4[ +^4:FU2)-pCfK\"I2DH,07lJ\shu+Ga$:N:UXKAH\jE:^H5m'mYL>BQU?Xu89G6V]AM^qPZpJ9Q=X)''P'fQphLrBNl +ZQ:#FKG(Npt8L%9 +Ric<]A]AIlZ24[6Z=$mY_S/a_qO[7VC]ANQ^kAF7'%CWM.Q4&>jq:s+XdHn*P`82F-fZ-"Uq"TS +"%oK)-]Ab/g%,>Y@b)q`!1UY/er_fGdJ8<5'$m0?M+EZ7s89JJfq%9/bI/`uZg;Sd1V5`pH^]A +,hSJD/CVFK0lKaX6/HeZhkU\TTkH*Je2+S*^sZJe3aNk(%k^0W>:Fl1WeR+XT6`^8I5E. +R7KQ\DH75kO3Pl*#(hXi`N:P\T.&WD)!rR1"VP'pn5Tta[i^cg?l=-Qh\7h+nS=:\bATinYm +=NP?0tCFP&Fr_P]AHe!a!/(7e#4jKql(M-XAuhBKUr[6$A_1u%ght?$gBq.Y=Yb%6#[s\mUX_ +YJm3a.PJ]A]AdDNWX-Y/=@`dad+;4(7ga&kfp[;\1SCO0$IE/*ip@?VK-[2cO]A"Gbf1,C#i;kpT-c`!P:-g1Wmq,(?p +eAsg/*D/.U`?aCJ\A2d2>BDte22S,9BOEUJ58!.Vb&F +]ArW]Aol,ABghQ4ar)X>oYY7aU^D9C)Mn9UFgErc]AJD +oTa3;dk=<=g47JJK4JoqNrI@;./QpY#7a:KDfg6pOYKOKVEIR`[O@YR6-i7\;K+-[*m:8m9e +;)&.,rCf_Ws)E+hj>iL;l&""AkR#iF)jWhL2i/8*`_o\>>:ktITLuV\ZjVM,;H$=%V,rA6q2 +AuPQ01(.bj=D@pmS_(%R\ +@UC=KdpLC!6$/)#O9,1fj1i"65HM0-lZ6#">mlFSUnIe/A00A4u+M?J:9)K>r7F1<74@5Wd0 +:jG+N#>$@XE$SA8D6'9+`!Dck1MrU1@"hqsQC]AB?CpBl0Tn'V;B2=q=q?,:^;:\(TJ1aB8[M +6)fTG"F_tZeg>_-lAY?+p1'"Xl0,BG\t!Clc3'%]AZ`IjbTgZc4B$L"374Z +VqVNcEWSs0jqr17Q +O=PA@@XD0G;a>,CKoT42@B)L.X3tPhD9EZ;;g4*0DtReQ,SmrWR.$ij="MQW*Md@>YPu1YMFM(gi\8n/mCGno)#;N@qA/')gM$UF +[uH*&-".?lQE$S^uj6dCrWZKO5ARt(h>M^-$:skm<(hD']A;afH49#k-@jZG2&sK38&R:1Iad +[9n0*J4ddYiQGT.:^l0/N>J`1$6*-V+PVuhXDL/u>s6k_`.85%L^;tVsIBGt8Xh+5n6a@73c +/)\b'$-4"c$'!sWUj#J\jUsm9k?t2E?,SqJU&Thkr4]Ao(cV3a;@Tf/$S(q`%mPO+L$kt.(@7 ++X.%k,7V:kC9r*0E:?d@/0kaWC,`pqj',)67(dVGgTuhui^NZN.XR*_nj\;?:\T7&rs:kNoosT+G=NlL[hg9Dmh8c_BXet$B +%)6%I)5(LnIc3dTBN2e"(Z3J3Ao2BU6CkOlqoi*ca;)?'V$@H5g@U9S]Aie03U^>3>?d]AaPj-8b5<@bq6KX;fH(r4EplIEm"<)7+@knI9FrL/XH#9+Vr$X_;o +Q4]AjdDJCqBgiK1-/]A0[du#*.nf&&S2Z-BBs.PhU6b2+tGel8C[*p$`=uV^^/.bnk\40HL+n! +Io&0XhQ)d7CCHsHhhle(_Nl$[U),k[D1tGT^$BKi^e +cjA/IH;CHD;IJ[7&\T_eRBS\!QYhX'D>>B:qIOmHke"g'5fM'>7n,iSFmAfqD_9)dYTF=IgP +'obn7@a$>e9QkXg/!A0^LCN^Ps;F-"NkUF8=4l)]Au_qBf78aKT3CC08,h%G9H*.mrQkTHF(? +m+Oh#1PHUM>6oiP#7U9M2['V186W`:54@kd_S&IiY.PCU-b5"(Su=J1>8QBc([%g+Gn5:*n2 +9)n3*uNE0Hg=Tqf&1aDt4>dSd"tQS^5!Bu6)mZ8+X/^UUcjO%8#Dp[IYpgdXeh>okp/_'NJ80GO!]A`816nrVZ>h8'`9p_2YR"1r57P9'Fo<_LG0/s3Z/fW7u"f"*qEJT'3[bQB; +\>>mAR/G'c5D4(>!+sZ*KAtnuC@'&mB#r-bZ%>>0]A_m@N6e)*N7mBm48]A(h`R(421r6G`fBBl$-d%SE;rouI45.'dIlN +7hHYc>e;r<+"/pBQhYdqYV?Sejb4jC2CJ^`EYEOaiILZL8RGqUU?dI>sfQBlDfiCU0<2.[b_ +@B-F^m9Pgbb=$34MpHGap!?>RpMM)Zm\UY_rm':Efn7cLbGZYSMMQ_lF,o8]A7Ci"MgS>!g_n +=-%+J#q-Gj3M@mH72fFuGi02n/`'ZKO((?D$Y.#%lJZj&WOE8U]At4R\U5)"n@GNtA:<]Al7(B +KR6/Lf,)=?%/.R*B2oREX +B^Z11^M.K(hCSnJ(/.cA&%^Y3Cm\$JacUaDL-uDXG'.o!8kGG#;>NT741,BqH>JYmf9Bs>"8 +?VN66)=3D6;(V#o*qXim9eAF-QIetIZqfbtW5Ig]A)lM]A9BNo/!Gq>I6_@Z +Jk8W!FHd:1,\O[dm.#)aD&dkW$jO\D`J;oB4Gl4F$u2"T7)jIier@oB&bt+IZuM[C*HO"pCH +bRY"llO3]AmC2@;>NRu-ZS1pV8_r4PT2!IUNSmLDR0q>/'kp[4Qd\@&]AL3&KKq`SQG\5m$T@^j +l/@hr*%:b-80$9Itg1UD[q;8Gj0!`nj>bEs`4%H$@#s/DCYDcMAk5en&]AZr=*F7X6>oS'3a_ +S&sjFcdJQZY.KN$3E->1eLIR$Q:gF<&O(68lkd*^TOr +@3/U6dbNlZ19bc'.-&j!gtq3)EC46CX?XlfpS">OC_B57uW!f8'_&9,F?GsXDrGQ;gb-UL`qB5i6;]AEdj/JjZjAtSno%&ofSD':[2C%jmZ?)<0`Qnaj"M:$-4L&$dod7jAou@PF*KN +*bNfL&.=;2brIRgq-m%2&F.iS*,,ZXPae_JB:ATuh2Ou1g4BR/XIZ8Z`[S9TEg0E!&T< +&^fBdJH?I_fX?m-52*R(;5mY,VAEHq`,-VC;7CE`Rqie6h:\<-Z:el2gHTN&3Y]AdETbf:HdM +&4tA%'b9??'H;rta1@q]Ap%@Le8Ec*1*-gukUQ5:CgI/WiOa)8<;XMJR$5!OPUg9l9'SifNF8 +`$20YrhFD\d$ZIrSuN(+27XgosXU4hmA[Kc_92;M+daVp&8j>\%g&BcX-Y3YM68A/+-t#rbB +,QieGnnADi@^0/*G%pti[hGOF8"If8E*938R1cp7L$oo7M.lO/WonYmDq@,2m]A`2%0jCgq'g +fGjBUbtjtHEWL:>p8=IB?U*q*IfJR/gNsJ!?GCc&jm4a9^gK,5Ru54`A'"HTH@,`P(jNl'^W +Z#6nG"B91$;;]A'TEG#r.0,[U[I']AUi-h*&'tk5+j^dj@X!3qhdt4sg/or)^_*a.'HUcG\>SCU96u#%p/%Q+1p.[dP"YI<-+[jQ:nr +)'km.Z0Y$#LD#`^URc#IQ5Wb$"Lh%npk%G.u\KNS6R:'?c,8@\BLHO*@#-^BK4%8]A8[#6! +K2_<9O&4s,CIrH(-\RYQE&qAg):8)??R\D='A+'*_UB^(5V:TU,nHrR3O\V$p\W=&A(A1K/= +OL:@9F*,Z7b&;s^XJO`:Kf%>ONr+JB*->Qd7'r)q--WQ6[aeFPCb:FE8s?)\AV(S&Tc@[4ZR +FQ)M]AF#ok#BR&#KNiei+\pX,3P8>lZ]AQsI!q[HedT0@.BgoY3X>43-qE.;G`mB;i8rhoB/pi +i\2#M0.ZgSjk92#INS'<@r+56_&Pnb2?SpuQbpDWg-)f2%u#!s4';If'oRDqr!Rjm)N@o,#` +USQf?&R@RQ<`MZ(cn:]AORiL([,NK6bnNk6ZjZ-_dUfrMTb!VkN$q1.QtIsgkUp&0[?5R,Lcb +XUWd:rJEn(\EBU!L,,U6%pL8n$k;1!W0]Ah)e:&q^.D.QDVl9b&Ts,M,iP]A&GA+kM5@KsdnbZ +of8,QE2Ln_f*B=HH^j:kVAZ[dRV^IgPdS=Wka:FrYEX_:D/ih3_7jm7VbS:a=caYfgB>$32Y +/!m<>GkCZLE,.jP3[$2BnLaQ'HS3?*jkI+0]AfB>ZGZLQCQRm=@co%6a$HgI+;Nn(l,i1O$C[ +2FcgMBC!\rqgAbVQQ3qDKP0Rj'WM_iDf7Ge,n(W%S4/a6KP+.5Il"MN;k!o'dD>-9c"-FEkA$Y2_3s'k^HsHKmm$@kUo/r +rV*(f'N+n1[h[-U)kFqcS4g+=(%cRp,SCl-qi9P;h5'+DG(C +^qP>G!_2abP/WVP3c?ERF9gs)L*R9:;3Y(8kCdTO,K7ODf^1u,Rr04X`4rMPF<80%eIi<=d# +Z:8k54]At7tmbee'Em']Aa8ngY9-a0IA:u"C\lsPsf\.g6UXMh+uhueSR;pku!$$tjn:_,Ltbn +THBa.m)b0)2t[BLWmj="PiTN:r4",\fnf)lK-KVKg&1qXs1'Ttt'+hDjro#,>,_k:bY:nG)* +L<1+(0+1SGF5OEjppbNHTIjju=ho#CgVr$<[qiJ&\fff5!s7"X\k8_0ar>)>e/JifO$2Ef9S +*/+)!XG>\Hh$=idsLg2h?G9^Qc`UHYdV(s]A0,PC#$h7j-g1`'oK#L5A&As)mXSq^EH^s%f'W +?YT"TR_&H%2N`4^\&!]A>7@oBat#'F9M,L4jt?5ZB/k"1a3,@/>J=J3pJ2eF2uj?1'GV#J<8X +122%e4M)R:r/GuJ-iJJ]AaFJbT`&BP5&U'*9/5!NBdS4Wk*BhOn3^td&@2IP"$35e#3E24`bt +L498iaaZK'dP!nJI=-l.Lr@BqW28Pbg!DlO.t"I(lGMWNT!/bEqo;!q/N?3F[=9.)Ah;E^P2 +fh(/"HFH=bVFUt#URgPUc7BMT5QC\/d-A-608?BA(I@OW_KE)!q)bEF`<2JsLbSGO;;ah8]AZ +T)\lS"ilW/Jb?Z:\2\;A^/Ha\2W.)niO_9$"%'c&d-B?*"7o*r?FL%he[+J51\b91j-%ni*' +-%-scL;W4JRd!Z1beXV)?b[%HTmDrC;h/GiH:m=0h.jIU[i#Hc"9>hh1.'RYlN4ctl#_Zl94 +"`S14:]ASc@:I)/!5l`"pr*ni"WZ0DE%I#oWVRA4S]A)`jB_9Ppl\K=2g]A686"U/UF*7TY>$0 +"&fKs'3Q,)m70f$V"@:;-J@NL<<`$=ZS"cXPG6L_o0(H`#'d(S$_3Q*e=^YA+!Ali).k$^iM +D!-^okX=pnL4dN\lEkKme*F22qI&\XaU/#JOk0+C%_%VgQ.r@HAO76[%d)D5=o\!gWQ>,-]A&%oUomV7fdDnE2r@AfXb:a>Im?X.&]A5PD0ZL.&Rn=T=7mIoj)mp6&# +?bC^UoJnB:IW5>JXj"h`JU\`F5R>Ura7oNr="rQh7KTi.0GsAlguFUd;/DC8C*OS2dUIU +O0n4#p)]AUC>S57ae[\S +)3838p45]A5I6lL>U`(odIhN099Ua/('uRk:/51Fi2@#Z8>m0=M6SMkpf(n0T.`&;8W5Z=1E( +YYeIpU@$F,!@/A@7rdZZ%8P1oa>KLW8KVc[CXDDIM:b-J'^`3HP_)7503a2]AOn5e93o!Y#,8 +N/#2Z_9f.,h%L1Kk(71VH7F@e>XGBT*aQuS;%J577bgd&rQc]A*hb`bhIXr`&/_g6(qV.&nr6 +1dYb4Gg";fG+S^@]Aq2C`)N`i%rIh%EV4gl>GiQ,'f9(,V&B3!ITkEJ33pQND;guUZ;0)]AAaE +:1_pCS4!mDNQt^#+Xdj4W4bZWf1/Y@&50Tkkc%4Y%3l\pf6u<62T1eUH;&"u%/pcBC:YXLOk +VPrVm<.TdI8.)CV1:Eaf%nV#O,b]A&>oIDt7]AL0?Uqe3fo<2AP[+$HU +]AdZOulGiFQZdKI,EKBpTW*JU0)s0er!]AU6YEElZ:[R6Z5f5gtm!tC?s$/M57!bX\P +iSq,__7:L4\FC8dXJ'p241DdfFl26V:m_!f;*:KR3iY$WI33of3DLQRP4roR"JcWX@kB4X"* +:eeM!P]A_!K`V+f(@Nd`I^(gc#5AQq-iD?u:NY)JKmH6bL<#h#;-.kV)]Aa,l7f$C+?%5AFQHO +*D3Pd8HCreVW-EHnEH1B>T:tSXr5cnKo/!t#cm'ICO;?]A.YMO/XBHa$[u&=!PPoBTtuodqKg +!MsR459+ChO#Dmg"Ys:G)Q;f>`gSKSiTPg)VOh%TKu,WV2"snq/.P$*:lj"d<@c@0dF=-[c2 +RLB.lcV_O!9oKm.C*C6U8?#aE2eb)B+G-c'(:gEBUj::]AQgn3/f1:>0fO;oU#bDY,ZA-i7hf +P]A%RII(@!jhp4QNt^5oa5!UFVsg(-[nCAUZQ'$*^B&-"/+)TlO*oDX8aR`8m.H3hHJ2#JMe` +@>%@(',Q9T`EU6W\FYcc_j'Y*>=0PlA6Q4Y/!B>)>IFTK,&ns1Q-!YO?r!E%Q]AT8L51p*T.s +c2#sekF2c4j0jCN+0\LLV\JFC>N`6;>MXo43;;7ID+0t#UBl1oK+h9]A?;*42k;*HGJ3CEr+9 +KD#4;hbD.$AF:+WBHJc;g!J_aj2#SF;tO*=kT0.W%meqnoW;L%Mk;2Iu*\048;mjbZdhgBoi"s.WqZ]AfBoBu#+-dV59rUKF,- +U6J"Hi<)dMc[)u?+RP[[u"l7L!9?NeS=9(Tq#Tr:KduI!Ff.m5I +h44hc"3p@TAkf@Q>KYtuk4NC6+<=9Q(KTH@#A>9$%.OhcXj5O.s%iIu7O]A.s',QtOnhE;H;8 +:Y7hh+._m3Ns,`Yd35_[O3KYWC=A'n9o\*X^LP]A4S5E2%.BI,XO0Y]A!N>\RPKGlK)(am"cSU +%ThDmO7&Y1-k'nNL?I138.'=N_O'0`k0(dM&;)o+)%*u#&XUg&*!OaQ)jlMD70C42&\CV`>0\d!YYi;X4Ej1\6fC\f6 +5enK+mNe9l=r%fPP,IYn65^*prA'VBT6bj=PAsCdm7Ao-V6DM:6lb-_(b"Ad/N) +K6G@SgMHO_^C/;T-cXBQ++%HU#7;:ug0Dmrpb#0I)+n^"_;I;g/0F8&NBs'/#7;LFO/aME5^e38/_CV5Oknj8PG'6Fr,8[K)2%m`EW8XPin[IDiak+EL&E +qJ5,mCf88j3@m$Q`6=7a/"c1MN:Alo^6F-M8_)keuEOm*rSj%FeGHiKH3=5@?Y65(.hQi=j9 +q<-jE')K;[h`tnL/$N%TfqjZ1a&`>kAi3m"Y-$hb)6Tt3/q"!\8a7l4_Dh#Q(pOI[2_\8opC +q"iZ6R!KPi`DY2gRl7hI_UMkq=a4LX&j4G]AQj,AfaI;'+$=pukJqp.Dr1V'(`_Lge]A#)\q:V +UTaE5oJ$G$7I_1:#%)BBohF?-72VCu8i"Sr^$]A(>pGLQ?B2IsCkg`T(13DJX-jUXjupZ!]APA +a+CR(W;&,W`4R%\^^!TD*J)'.F]A#MD#Q[cX^=U +_b),]A)/u;r$B]A]ATO16_,4f>7=>BM^djg2ZFWD'N!7:J2: +hZXpg=6>IXoO<_+HnkJpB@rC$t"WG\@P:P!mJM2D8F]A`68ea$1o"Wa2]A35VrX)$mfNGH]AANE&:-$1V5KLieAM7!K^6)h8UFj^nkL +#Nq\Sr!#6Ad`pWMcUG.1fdhUGqWFUqd`O)epd">IKD1DoHYk3rR&>3qqN$q,_OIM*;an>8u0 +BRg*qH\Y/<_Ik^3M.SXupFt[UnSV2LU_YsMfm!*p!doi=OGS+nh$OfBP%G%j-C>",\h,q+_E +XI7siZFLn0H2lN)l-^H]A4Tj,H@(\J"1KSdRL=DIVDd!@d1jp)b#54!h2cQ. +ZTrqQI#<\F=cp>NaoGDG-[^dPs[35Vk*^O>hR-%HEj!D8DuE;TX*lSl#<^N'?.Q().9m@bV^ +7_F3-puKB7kVtg=ADQ7nm+#kf+$Y4aZh"[q4n7srRqFCGhRn8HI:E_6@;pnUhF[4*?/G*jb_ +ntX:oR^Pk6lOj=I99-k74.G@ZZ&qO;hoLTR4U7Epgfur7[BbC;Lo/)YI5;S9h<4X]A<8K88B, +s't*D@U\1Em%9/Y#HGj[j:Q:@#[0/O:P%S[1T%IL&.]AV5l_'8(c;$_IKE<=R%uHNli87mgHa6`NVCXV'a)1=H]A<@QBLtaeF^a>4UibDI-OI-ah@9XFXsRgddZAIo;._^U0BN4d +2.]A:<`bW=H<<]A0:HR='hS+OK$,H9IXrY$ZYU^8IW/i%7I/`TdH8l92iV/t1a;4dR`P2?XomT +-[q%&7#s+YLaYGUu@'C\`OpAP.XJ$[rqdOA$CLK=h8(]A3,/*G6N5BlPNdaHS9oJCg!*hV'GEInuh2DG[s&?r[YE=VqH5(!-Lq]A47DiSCOn0-oRo`M%it96=9k'_K2cOrgBJCV*eu[839[UUG`=*'`CK1GeP++?2X)VCZ]A(;Ma\=9q*\(_CX +:ci2[%s=/c`HFV1R5M&mZIcGNj,R119@)V=eg$jJ(3`T9u%]AupP)/.pa/>qOdY.gP]A&B>DX: +cl+h>F_U.?Ja,C2-%+W^BhfQ8s?GDS/=6o6^9[GB!3]Au""/n:Q)5Beh:FpK$BRpHfOmpca]AN +23s>_pMSZD)DcR6)IQl$=W]A]Acdf)?;JnNMRds&-tFaN@1M6uP96tLSLj6jt@/L*gm\% +R/'>gF`to_'%Ks$-5&_lJc4mFV0[m^h;":?(,Wb/nj&idtC)PISuU/W#ZNN]AZY#12O.6,oDY(=DRfS!D;`5Xifl6 +#hk*)-U`r5aVm*G^Eod!+GH`",\W(i[@9;0p1H?Kma*"Zsdg%5I0js"SL`m\]Ap[hJd]A5C#J[ +e4,=48Ul;q5;!qh?'ZAKVK%9P3Nr^?M`fcX]A:"QZKYYV73cXF:m;kMn)jW%.;<]AjPi$G5>gR_=BLmG;Ql +UbI>\.I-HB)hHp>]AAP&#?eCVX?4l,7._uiV(0+ +P-n^gZW27GGj.f$-#k\NpR3(YMG&VX=94O)^;DR\*Z">Mku3muL/g]A"XV[Cm$Y!5XPm8t3_Y +V/e&F)DiQfJ0Xh5tWO2/;_5$1=Bn&=ZFQH8,m,aui'#$>jo&Zk +B?[e>fi+V]AL,DeJm-Z4PO'>NR0r8.%s^<>*)Bs"R4p7*>oCU9!WALQ!f!HZ@f@su)9OBZ>Be +`T'/SpKC.r0P>\'M$kfK%;.eJ5^ZS0J5'Fbbj--631=$1rNci&.&5VBXEq;flNVp$H+mD"_Y +[4"@[Jqm)9X7&e-ql+@V:LgIs(=4qd;rc$X,U%.$+kF4@MX4eA!hbaGqEdBCS.\Ju1@6YS87 +,`(e7KLXsa-V5S3=lAH_S:D$XGp57pC".U):*k[YB$ogAYnc7S\r@?+S<2 +3TlZHE1h2Jf*/R3LTqT'o:/bqBiN>c7oNG+1AK"\7?4?!T8*s"^C-ZS\_q%e^(aLl`mfORh4 +un12A)?nPFEVkjM40uRRp0*YJ;t7?,m"X2mAl24RFrHHl9]Aj&Xmo+QDh!g`g,U6#dt+@[I'>b!m:k,aBI)d(7qj%NG#49"S +IN2TY>$+$(eaum0n/5N?EGk&?d#ciK0.Sj.g_NKqgcZ;1&1/UT8Fpj:A;!P:nI@]Aju/566$( +)@0=fO"G`"&KN8*\\(K#OI)^[`fuk,K\B'.J:d#$mZi.H=Ln\)!0^&HF>[$RuF%2O"b?1#7q4tpog?9`,:E"Qq`LqMYDp/i#0Wq%s.(Gel[ +4n_249a'%O?=[WCMb<2)=g_-:[A"Zb,(*SAf3K#>!A[1GHV0J9R;aZjd"&pJrkSWh58?lJWg +`5r.G%rW0UYM6R7utSPPPs!\Y.S]Akcj4'oIk.\r9r,Wp0W_@E&2CXNO'm;N9_ +Im/X2I8jWqb'RY,WP,\K[U*d*6X,%qq=VBu/2gIC"?\'AiEEul-dW2s=c+cg.P0/)Tu*HP(T +:T3jJS)hDSpAc9-BXF3u4`knr#S0+dBM#?E%!I?8H$0SK8`!/g/tL``>9]A8.,`+U&+%o"@;< +lurjtsm]A\b=m\RfcTDRf@$I.ScPf9ABnF/&8L+@%T)Oal +bL.B(m`UG!=*a9XMW@+P8k%/J3TcVWuEH-!+e6?Yb6'?QAi_N[#,5!EX51>=i"s`j4kD]Af17 +7DI(=`S/beK>m4$/bpYL\Pr%>p'5h!M+' +_A.rqF*6%Rf[j;IF4KM)6T.%,PT<=q0rj1=3Uj#(mW5>OQ<]AXQV;:e?f*fXZNpfY$]A`->6=J +,Qc_kua4M!p2QBNuqW]A4\RMSIP8#j/BF)^rN2MX/_JCo8?AH,ee[d_asU,Ad]AGcQdgl=;=@&@O:K?I +Go/N5%NA$R6b0#_F5ImU`LZID@1%2JpucI+!eU^CGU)ropb#@?Z\4C&,*FoH?;7Ij\rk?:g; +Pue_N#Al1Fd`G_JrP(Q7&MnJ,0EIhXu'#[_Jf@X":BWK,=a7=(bLc*@#%;F?2QV]A3C^ +`Cf5hK,J@&N.Pc"rU&fOQ.FF::8qmDA,u#59ucQJ*u&#. +>QM&*Vt+tbbqFqs#^&'s13UMDjOr4lfOW&[n^kR%H*-J#SOWFUVr^aPBL@K!h1iOs!?Aa1t5 +bd@7M`7_*pRT7$I,YKb5!@3s#5IAiQ!I8iS+#(5=p?0m&OO4_`cH\]Al%s\Bb@oGs/HXBf'WL +$;sZ57'jrZg"5bfndc;B>U->P[#GF$MF$_DjXX%gauenB6ZIkhGR)Q\QGhV*Kee*@qo-gPIe +6t@+:0p\\(-q%C[.:uI`nlADspWIKUYtS:P\RL1 +M,5%a<67QB]Aqs1!DV(-CCZ^EE[GsO&Y)IAHkW=9@BlB03'g^V%(eAIq5L.!^:1,_$K0JEJ0m +-X3-md:;We^i:Q!GcFb8kVg:7O)$Uoo4+)q)M6C5:J#'GE`eo:@.62"YGR"EZbJ)-AHmE]A3F +")JhFOd9kLF,.mo7B/KbJ1C/$m2O>P<3%AgIEM]AVVtAklu9EI$&!7Lf:G9<)B/+#tH0&,tUIr%Jmbhk(EfDt78O\[VMqYR,,T3aOlnW3.J>X +,n*e0!'t*8SK]AgDP&30eMF")pXP]AQp;RI#a%WA,H8W6b*M\K'L.QP!phW>(`"le0)D>Vf)n\ +NUsTq)9PKf=]A]AOaG[EDI/\g.$)BNus8kCjWJA,2Z +.c!:(t0T:>"C/]AZ,@.4r_!qUqDffdsKcUG8dDE +kN>5>n6*+3YMIQiL,Q)B^iTe'dNT#n@G0g1;sYrb*MdIS[A_bUKJMqj:i8VVaNcbk+U8fVe4 +e]A-_VM-A\4mpCgC1=mol1?(+M#Kp&1fJs[>k_NXS)I8O"(\@-CTQi-7rJ&\upQOZ($eIPg"FS^d9j5=V/4D6_;7pBX\`mjZIs=qkkt7L +G&LOIpC3`Z\R,P+'G4\FCY6BF_CaI[tKC+V&n<7q:O8jNc2UUG[9UNs8>m?VcQZ2]AQS&-[8Z +C/rj[g.k2#bcEB!a)0VF8$F_LUmQZZ!-JrpG.(.T^k->^o3*6rFTe0JUL0g812o +VWV!iO]A9EOPmZ6NV/O"iI_p77Cc$e06%#;\0K'Z6kOi?H*qh8&//D?((G*d;@6;?41GM5j,]A +2_q:/&\1f\MA&2%1S<4&Ld"2K(k(mM(;VM+t:-U)3*$d'c!Pdqqj(1M:4%Y+@\d_H?ubXtD]AXPI]Al:G9"V"t:95[;7n,jQOl]A04e"$VUu]AP#Ah^kNM,Sha%4_fP"JZ4"1bUC9FS>XfZ +@e.4qa+W@KL&[+ZK4]A7p@Y'(DoH'FJ,&T&0@ +0ZFs7u-XV4QD1FEC%N_(CKK2^Nj`55no=Mu2-+NrS;BqWZXFQ]AM(=`C'\(;p=.%*<5C"ml"G +N&P*%jh(Dh(ic\0)1?3M5847lMkKKg11Rlk=D?SgYGsGg-4\44G0+NnWR>bTe1^E=LAF[TR@ +S.@W90L\C#W#PDDCkHKrI)PkWQ7.@l`hedj-!ILoiUZ(mXo>'OKtM6RBZGb`IEHc90'E3Tme +miNf1CBH!,+RXK-8Un*#GJXiKIsFq!gTOahb!"hqWBNN= +jD@d9WY@p:ADYE8^*-*3qH(aK7,s8=6.;f)GRkite9hHf(_["f":!>"Ci"]A&ac28Pp@e7S%! +K"%f@R^8X)!6>j$`6W]A@h!YRLQer3B;fHqb-"NF^\h>Qd\=rJF +C`C??=BJZ"r7[#'e"CkbA]A'tYQX;_2`f4*<8%4X_R\uFn]A?2q4IQ;q4\>@pR\ADPCQpsYd@: +]AH`*,jE6uF,.3E*o7)(4TF5t9;cr!dplms_=f$c]AnC7,\/$a@3n2W7#>(m$BCcGP +-cFbGM73!h;NL\I=Pk*(p\@`RQ5(OkIT$r+3'*3m^#ejuq:#eA\"V4XNcD\Ja:#BfAZ:G*$I +ViGhh^1aB,hM0^F(%F%C^Gf<"9B2fPD>:_:72inZHM4C3#b9dgP)ra^^t@G]A.k3FfkLs;U:W +VHp(dqP"rIt+spLYah.7IG#K7&:kGSUP]A%tWE-]Ap+U^dc=_pkMh17SS'C]AuI7pu#RUV\9Vu! +Y@Fa:JSF?7]A3->ro'R@cHbjDQ8Vi`h>d]AE.P!$m/'I9j2No0*<*bV]AQ)DdNb0PO-P>PR^dPo +tM$$a.i^,aUE2[K:*PJ_6C/N&Mfp(B0L&n`a^jFL`TYj/a'_IUJ]AJOn;V[A9"ZZ-Zq%[i9B> +]A%8:R9=$8,VU$YKAJZ;k*;W?ulD6-!rp0GGhn&`6lG((nF(fXcZ(6_+>8*$5JSjsT+Q1i#UR +P/BC]AFql*Vqj:0_sXV?Te685k+'R\,:MtqlSMAfHK[#*8r#r5uR&hAinI=C3t1,,a[i+4?\C +8g3cDPRmKVa#kM,.e/?RVk!^OtmiF"OfQ]A$nh$H63dW-DQBjUBP[&T)gAl`?Cu.*P^4iVE%@e,O)[L[8#W?(q^/ +>F<[Q'ZdCWH/A"tPPcbG2V[.<:LLg]A=))0nrsPdi%@D3Tm!a;jQ^rS3*A!H[A]A\Fb&ZrOt;$ +b6Qts9SY[L!"H2:Y3T@PfX"rqf/;&Z<``^AN5]AB\e/#mCbf^%n>"`\V*A'Y=_Z7Ed,2ecoi0 +s@6NK"I_m;/c#/cj]AB1n`-oeQI$l@[!XA@+8jJ)%8R48Sbf6X]ADj_>[TDNkmcUmr9tF@%_P)DW1@=YMX77;7P>?T=Ir'=Fbg*^CgZ&c\M*&'n+_FYNbi[u]ARo3]AR- +66EZFRV*5K.2TTG4Fdo^O3L&#^AFKc\&%>+/aSXr5)MG'DK=hPd'mjinfI\HN8lO4JXL_K7L +1Y@YO5(h%1ieFkdcPi?le#UY0fQlER3=V&k6W@FB'bk\N84+M%V +/RMM8n+DkTi_>1W1fQo]AS0F6IhDDu7FdIFKXTb/giH/$m&g>:E9g/;-^=&rUE/%&T=X^Klb! +OE0L(=#o!ou32mmG/fCP9W9+HZ%[V>b#)%S=?#imi(DkBWE*e[DN+jYfjZaYZ!`Pl=3) +]A"BPk]AmX%c)FnX0[pc%[FKTtk7iE`bR>k#uo29.d]ANVAt\K?l,k"daIU_I,jc.Qd>X=#T.c- +7pO9HfHVOcQuWVdk/9WZ,p3,NXFl"X"m.Ke_4Qdk^NF_Gm;oo.`U:F+YlA.KJVV>PJ;-iPHu +UNO-Y@f]AP;.5'ok6A(OuXDOkoi*X8CS1d;GX7XGgtb2,J`t#RFJ9kgl#Xk>6:Dul@lNAQ;d6 +I'%]A.3J1m/"69=EYIt%@OSk#-^]Ap86_V=4.j4h.loIaY1>IeY=.BPb&_WqK/6=9$YB\8rS\5 +F8Ce[q]AJj'N)HDfYUWtg[V8P1.AViCje;.Z2QMX$lc04^PLT9(iimkoq\B*n%D.0c&PAF1uf +,('s\@^>bFl%SqLeok".)l7AM!@h`O"be5.&0iJaC^M7m4[aM@?98PG3M);*@4[]A0's<=L[9 +/#p`b.`t`q"0<]AKVFY!k0RNci?@U>b?_!Ne%(PGs#K@!6*`gilfc50*8TAaL_s +B(.nZ+CE@*<\KiKfOL0DikVZn"B +=I.!WK-hbL!lo9369C0KSk>,nWIgjgKaU//oOC^Q>Z'3MtKB^)up!CPZl>bbB;\, +oakepf%=MsfE;UhIuGXANfe-k/peGJh2+*Ki_EpSjsY>S0`m;"I1GQuT6?-1/]AJ(Hn]Ahq[)8 +eii0f9MPBcZb`%040V#2HGVIUQ-kPHc(%2aAjjjeUZ_>[pr9pQMMZfton4cL;Bec$Ia!*^Ug +?gk'!(Jg^j>k0N+JS-(&]AZ@)e%3Pn1=YGBq7!P:Be=l-E2nK4@)NIYXmO4'-N$b-is"FNY:# +8gk&dn*3?E%nY))]AT"]ADV#_N,YD/?5TD^_fl.]AXsFQ+n)u#DRZ,g<$e8"S_CGMlJ\idY1fU! +$M"T0"(ZL,5)2Ur2)qRJWdEFJ_:a4HNY>s+NoHl!&R1k?;NDbGu@RWN4a_RJi0%W+g$ZLN=d +V@,mPOqk>&ipi"p:N!iAj0h1_#"kR4Y_]As14k(jHG*\*(+OtMf2Vdq,,c8Dt-tm&s>E?TuO6 +=e%NGMu=(.p_jlVXFHV&k4aSpF&N>680QYeA;H?A*er,BqJ)`6YX-IX^b`Tq?i4ip!k(`S"+ +D.KApj>D9)/cG%$dmbYE9rGMZ%r8OH#AldQ?Lp_3`WOL$oQ'HP8O:MW0(V9kNo56mmS!%T&W +>lW6!L&ds.l*C&/$@23G!HU+r$'Qc_O:rAeKpchM.tC:;cD_?'>Qo2!.G#1b^keCN +6%(aQefR;#9.]Aac;/:_FfX!!USu_*--;&>+&>_1/YgWOHI\\&dp7s +=fp07lh(D]A5p.<%X>ItjaT=1&$^;b>6]A3S'`0dMWGkC:;PoDsfpiHA\o;DVRGk/Y\,`FLbrPc@E19oe72s$+j;3-&i5e +g%$*sc'ac>G't"NDm`X>Cddl?Xe&dhHLeUkb+mm1;OjYhDuOLM-^r($6WIrO=_=(gQ_VOG)"OF^fl@[_Cf@=_U_JULp26W<%'n.8YI&unHVk8>*T"FsN +P<)R?B#?Tn#>2`Vq\%.kZeS>kEKNqsSmY#^Ag]ACeI^$RrIL#cRW5!U/CmV^I(S+39r!VnBViM +M'PouuT#j8S`4c_S?U?V=\X]AsM#5-(=4]A;5^a=B[H!dq0\dLXEQS\SX]A;o#e)[e?:E+8u.cJett=`6-1FBVd-K-&t'dJ4QfM&iAmJhs_6\&[%Iel:6t?!^[n.']A +3mHB#@0UFkC2IT:n_fYQel\FfV[&g6<\_IbqcKMH+-rpS)jJ)#AKa/ +q;HP,@h9-.;1@CO!f5U2AtKH+2-3mGjGeYbV?7X=k*>gP2RhEfF'cZ"#,?R@S^>.a5\99@E6 +Tae=DOok60lR0t\'1HEs!-3QO'8>P+e\3492GMlfU^74;ohbW)6U@39rf71_erEJ'd%CZ1;k +Fe[plXfqa,.5R"=uJK'ffqU[o!rbW2dH?<"%/B#;S@mN=+!Vo4*[Z^<8W8jW4+*>gPEs+C[r +rQFh%!b.P"!FRa`S*`1C#\N^5!@>35og(_L!7"6I,5i*r1rYl/&YVF^;X:k(_qCnZ`pE-6"l +8QdKu^>dQR:k*F:JVX:3>4"6C]AiB3/;[9fX!&JaNX*&`'?8Z< +0X+"KZ!kI:*6AS'=B0"^?q>,U^T2:hEYZNB)/LAuR5[`0B47Ug&]AtX"nQT^D27qo'tTN^B"D +U*nbl-n0ZM4k>,ni4L-.#ctA3mI[]AcNh\6%_pQS%;?AMbae'[iTO+-rsnTDU;+seEQqt<-Ch +X`^PYHX`:lSOo2j'a6:\AeW_j71Rlkf!#"sA>r)87ga1&*dR+hAi!lh;2F>+0h-f)G3V1d>nV7qZ6_-r:&+85ob]Aja6P+t;t1o*JdB3,JUZMq[SXs2JKP&GJCm7.$-;e%/gr>pZura +9N"(.4*\:Lh#<\dA6bWHSND6g@@Z/X0"ln3L1Vso=+=u.O_9o?="o-O[hd;[@QYk/`>"r.CA +!U8aDCg+0cb4*o4TY]AI4obKN[FjB#%U]A"io;%Rs&s)KT34:(-f_4naG/?j8\h319qXZE\cQ< +06\F/A8:G9]AbrMO.t>rfI`p[:#q3_'h]AYX8$qZN*ZUr_)S?J87g:Lq%#i&)(;9]ASI_Y5E=f( +F#CqlUttf/3*Zp)m3B7L^DK\cG)*iK/8Vg_UE!fa[W#F0hHR6H607)#[(?WkDTD.UST*MrZ_ +.79qi/;Il20_=m,nmc4aV!#(p,\d;esG;jOEDSKP/:h:W@^EOcKn*<5N=J(KEML_I@ohr4K@ +\)>-D6-`T8ZaqH/hJ[Mr9>DP,T>Y7Si+9oLtn4A&Fm%%s/3nak+E#b%>#pA,k7YZZ=31qdeZW(<0]A*&O'_2Oi!,P#241`L;M!BS@"f!=.e=n6/da"s!R'Ccf:)R5'LPXR;Y#3*8[35GZ +/A$Q4$2A?Tbdm_QaP8^sp8O^NegX5esFu2VpF,mHuu"g[7R'qjsT'#fhO@@JU?98UtoV8`q) +mfH(/^hVegL=26Q,Z+KFpgBicp-"NrE_$=c/9FLspQGn-[d:f'1D`<::Nup8E^@:6VVmkPXq +$.6i=+=.eCX)1cpMsT<)tesNR_%q$_$QH@C>._.-Db_uDW!1ASs2k*SNA$Z+]AgqB[5)Z7*U\ +CYoi>JTnqu_,%9uGPpM;>'b,E@H%n[!^+uWAUGdO`(@b;XGXN#W+//Q,j6FLtBG21kiC5S73 +o_8+Sp@`ZPFg\W>.Zpa"C+t<6bKF:]AXVS'qh +G"6hUFX09!'BtZbp6/)pD?H<`c*J'S&Vg1o\\70T?J2$XXb[\LR8&P9F#*afq3(D<>)]A1#&_ +S.^^%VR#+7J;85q?hg]AqOQg6l,^3&dNieb??a*/mPgQd/&B@>0J8MOEMJtN,X^A0VMi+GNW[el:(&j*%a&#m(]At$lU +@W+>",'/%2>Or`X;*6@56"VW@&T2'?YclpFeQ`;uY4$D]AAS:Z-649XfHlo3BeB-a8=Zh+InX'KtVod? +!CZ7<`+a\6pLqpbSl[FV`1RqV']A(X@b#5#GpZI`d9*'nPAi3pd&>8FlZ9/I]AOGqgM'\d`rfL +nHHEMR:o>uuVX3!kq:ONh!FB$8D"=:K*Bq_I@:Pm&tk&CeF)+q2djg!!XC8*=Y[_>bA^ +V#`$HG&[GnnaTUD'dob76]AEJXDO3JJ75!p]AW*jNh&07p_5/]A#dF&i>lRGU;S8pVu9fbYPJc1 +3'==)DKorbFqD.?L#=BhV5'fLEDa_]AKH%:BY^WX9)jo"d/cDf"Y%lZGq6dJ4&'E7-c:Y.(aJ +[BZU3dU!?.YD?s1W%nH;/UF`tY;<0e7aacB(g7)n6Am97+DB,5)`1^:joU;]Aa0$fW&k\,9k( +9M7+9$TL9'jm/LIf=M,ge:D^asFS;',PDtkH8P\N+g]AQkkikG:]AHV'F8=OLj^?6V+i8_9qp]Asj0=r;Fi'0Q/`hrk@;2XXZ4m\8r +lJ/$lmqU:m[EBR"!.dKS,F#4>_EGs44f*lm)oP"ntX8_(p4TcVNc,Mt"I;5^CSJ3;C<;A-lI +f]AQ!n0GKXq6FW;GFYE4:<0EEM)X7X(rX,X6igquB76UII/DFr$<(AJV.cU/`$1$Ub;^8't", +"M[HMZKAG.4o&1qb%fYe79Y?>ME#N8-2S%!km)TFEtDhmttR\HR4QdOr@+)D=)-p2nkE2j@@ +.W=9cZ7;&t>r+YeWUdZD/W_i.8$R)1ZOKU+UUa73cI?*-NB@l\Eksh3<3rP4h+6jM2"]A +8`"a[guaBY^UfQ;s5'S>5Q>s.3:7]A&)t%E3Ir[1erL(W8Y-33$hXPK(atrIUSodb\JNGq0^+ +P"g3u@g.e5KgF8Q'JCBMH#,n6/W!A$1d+PiY=IGt).[?Tn\j[LW>CfdlR.s4,?g2 +0S9d:/@-hX;o;l4WennB]A>"NBEA>MkiD_W$]A9EdIWL..GGd:F4r0+::qNJ10Yg%TQZ?+kOR`0GEDPC-h8_NA]AW +a*+%=\I/i)KYna-NbhHO]AKYT<]A&Z6Ec6(mCHLT@Fot\CN^>&SWaUQ"4\+/("DnL7:)sM4+\- +M3OhG;j")oI2/MK+daEI7,omY:,HpcW$V5"XK.316ioG@1)\ +j#F#-jM54MVXlR0+aS5KtWSd/oG3e/IHV\pD1%"\,HC^q?\?)I=]A745<4[%hIH/XsB9?5fhX +lbb@SkKUG#Gn#:1h1*NCdPIGA^jYMX";^g9:e,j;GUuMb#9rC7a!b64qRC_/(1-oelkpHlF6 +,Pbe@:i=5I(TXT`>"B**.q4sJ`D552G972ec[-RZriLBi0Qhr1]ADZa7'I[AB^r^:q=_XNY:_ +^p;[QH@n8n0F(/#hVBnLj/K,\1-7$JZW:p>W=;:\HDGJP3ReM1/8br&=:(-1Bt^Z?UWE[\fP +4F@X[Qi3Y18p&Yi]A.a3C\.;R5qn'QshRoSH&N@_lL&W-6,c@FWg\9DD6_WNbjb@]AJYOfMqNR +Ykk=)TUks3QTlnII2Om"?l-d\U^O3f`f,qI"p>a`)VmkH;,7,ZLJ4V"365JfLY_S,Hn%*]AQP +T=0SU@:q5:A?CNT*%o1g[44h]A9CHuI,rF.^p6_qRVi-Jae6'&h=iNApcWNXp#N<[-@MA2lDr +dMMP7c8m-GPQ0:nDm36KDp]A=[nd-38:rn:AKr`]A)p*Oa=)Hs,3g'?Y(@O\Y?;mhjS>o'h!_? +kBogO=HkT3>&S!Bl_pb[jJ@JA"4sUn4ch[6VVDdGt#!cXR#-:ncq9'ATf$q@^>: +9gJD6jZUJB4Wkc^;7`:FO+DP0_RAaiL(eMbq*@:uB)!!_)jE'0Cf]AF'13<2@Y2H-YK#8pWUc +%BTXUhaul]AY+9frMtdi,p#cEq0D>c?0;]A7-V^DOh3N)/GOi"EaY>kJl\%W1QH[a9(QN@BE,= +@liunmJkpaP4a[ht$aP>B25d%_;GO3cZqobP^9'S"X$"?[g66Kp=Z')olkJT*/'6r8#r*; +`.TDj7h%8]AFn]A=U'^1GkFn[DP&:GSM"7oCPnBBSDi6Un6"W3,k%Ls*tf\PB:g!s,+?.M74DJ%I(>\5j\2+tTW4n/PrgbP<+%Aj29lJb&gZUU +usBlld)K,WBt6UF$Wir@FEo6#dMDP"EHSdLe?R'4nJlSP#A@pY!dKi&GOp9c@L8^Y`905k43 +Fm8NOYq\IlZg6te]AAa=h9g6-Ajk/FSUEho>fEW=gUnX067LS<0,P?kL81'Dn1Npq +`ESKndqWI<=s,9&0H#&CV`\ipErSmgo]A10-#[(NJi?t=@qb!#-a#qWli3\iTS1[>Q(/d)7T? +uZ)i;_R,b.B;s);,?>fb%H1)7f%NUl7$ukRHAh.q`bYbf\CJolBdY:3e;L +cFP1=mFiXH_M*/#Em'O2o!2RjT++:E?.\-;F++R&@l4[(M8&ogXV-H@K(HM]A`N-3k>'kGkP? +6.>'-Kg`57$^m8uZ4t+*@*/S5Bll?rI0!sX!TqIJ&0mS[#@#h.5?\@JFd>?L5i&G@=YrPo/M +&K(d]A+Zm;.$,"kEto;-=)X'SRp2ZfsNgM?$iig;?Un7K6jk,#mho4V +;0>qZiIs>JgU%K33XZq=)dn>JIrH*\qKg>h?Eao!4;k*d]A@I(JgB3j1`6RiVUU0A7J>:g:`uZZf%)\-%uj:Y:&Bh.F8PPM +=bQnFBBrrkM=f8]ArFEWkfC=&>*)C#iKA[kIF,Y4G/mVoEOG5.E?/d&-D)[Tkf+"hU_1*aO9pfS5;32I/ +MSl)3u/?]A3Z]A4^l[=jLoaCp^$b7Vo%/94*_W>HuZdd`:(AY\"E;ZNnaLdANuhAmGbk7(Cj\E +q'u(0(H25m"lEkedml&t5#iOYDq\B!hfarP9TldD),c4Qp%nrJ"tB6'J/-AMph8.j[:XZ)1E +oXkZiTfS9A*5L9k!lBNI:=):m<7"8SJXqJ#7UjT(;j^U5G5]A_j)^3(A`$'d_d?,^-ik-YEVU +"nM$5b]AdR><#\d]Ab?$b5,Xi:4=JY4:HIft.#PY)F1h=s4]Ao+C`S$L2D/Im +:Ii"hr=-4N,m8N0-H>/-Tget^`Pg<@oU9Fa"]ASS*G\Vmns)UCJXq'\se$Er:aPE*oBa#78E7oI1p(u,okg1FCIbWZ#,?< +\#,bPRWrpAda<3Za$.+S@f>Ce)h'pZ*8GNYBc#\\mJMM?kJ)>1nrNZ>?\2QWnlJ`_s)DrJNK +cRb;@d"lZhr>^a6.lG?#@i#GO?6F<&UX3QaXZp)AjE]ApA6s.+SFl +EZN8F!@h[mqQf74]A[2DiL`e]ALu$I@pl\qEjB)>B$8%ja8WCc0:<%J=t\;GOn_9[m/^:_ZBn( +F2I?o$Wf"1nY9MP^H;)*N:PIDcbDk+Y)b3l44[C.FZ`uTO),,/[f?o,]ATN:&G!?-@9Fq`7&b +qLT7dgjlt@XbV&h7K4s.%#^h6Z8bs`sX+gTF3-N15B/GXI;[T/g]A0]A\=gYW:I8IAt@aH[5XX +gV9>nP&quFLTb0JmK3GMn^W#UB!5sJlQ%#dG<5hKY^h%mpd!r#:JN& +!K&M7cs#JSm#KnLB#(WPme5p">():;SmcQUL<^X#)j&4i78`^K*f4Kh::Gi!DS9c^4_Xp@Ti +?d$*Adon3p%H6]AMS(rpl32fuGe1KB:7todCErQ>,=o+S)K,oN5_Lmq\Rm$>$TO(Mh*E5JOu96.?DsaCL3EdT'::`(VIDP +IeQaomq8iBJ"(\'?Yg.<^t[n1m794ArR/H)K)M0dFA)2PD5i<"_E&dFl/E#D#89mL9)2msm^ +"F%raAgPX3;A52(F#W,#FSWlr(WZ2Y[7QtSP.DrJio11\%6U(3:Cnr=?WM:QH?'-\M"k +$U]AGe8m6s(GX1M_HgE:J(rW`aKsS/8>Yg5JpO.p:PsIkog6'(SBq?D@YD[/2]A-CX]Ag\t2k=C +eMM+L,[/]AIk?-/Vg4ZYAcLXk?ODm"=+ +Q\:`Z;kK[B[,p)*X\$QWVg`jJr:,3W0fq%YfQ6/u(I*B?C$NJ-r"T1WOfjQFn*#u4GHtOeC= +Itsc)n[3"&@0!Z"a@s1Z@2q*hO7U*_X2>fFXFKgd_sU(Tl%oWQ1T2T0s[:nKB7rd9-m'k(a^P%koI/g`%4-IA9(]AW=*(MT3OB89.(lA'S% +'c!\4C7AC1gBU5=gcfXa@333C)t'+RmIc"\@mcnee5ID9>V#(GeHt]AOrBrin]AN.mfs((DsbR +pfcIkn:)Lg@o_W%aX;P+'!6?Y^L\(K))M?eKWAmF=NAJr6KsrHdu/+SC'X]A"l0OlLC[<'%la +6)m%D]A=qCRXTdXk^gnASCqZLZ-ia3/W644T;d;79AM24W.W&5:*1)PS!3f@!V$MVp!BQCN74 +JT'pC+:^AC.dkS=QO]A`RAahED-!JPEh@$O*bIXIIeVIho4JTRTDHU=;dVE6RcjTY0:tJMb'\ +%]Ag1k@AgH)r9-H;t^^0,?:$%0A;7i&JgUiVDN5#t6B(-?_kL3+fHdg&u$i+$e!Md,?@piHl^("?HP60IK$e,91Om#7RoW:E0,BorS9pVTcW?hLa +%n7,D9K1hECWY!00Mrk^TKo46k"!WCN[&UsjmL,GPSPL_.KF]A(B5KN7J,D.+oMU#%ATo%tcH +!&/PXH)q8DoS>JQLcF'&1/R2\Z_P&EbWpL"b"NtV8qB@\!DDC?).lO3Z]Ahqm6=Ai>Ugtp^C2 +!jdrL<65o@:1Flp`;"lYM\Mb]A@\?F"k8aY,$oi?P0[Cl?&Zb%Vm%"e%CP&]AcU_QZ:9/bkR8- +Zm5CJr'%OjZ$Ago7s:bUA,;5iL9LI_`X,DAifjc'Npn0oNjOtT/u^IqIc1&QZkj:"6W!eKTM +fA'V=Eba*7jtICI_\H'F9CJ3+B%[o.gi@$LV&hL7kos`@V9!0k\^3f@$*q;TomI.E_S@?ed2 +!0BSQ2`"kiadjQPTR+Ar@_KTLtc-3S7MPNnpj>X)kYJ/A#2'Z)C,]A]A)=G1f,;mV5CMT@.kRg +%mHP]A/RrSSg:uqlCAq>7f&ch?A9tQO0_/T!LL$b*Lq;7*MD)37M0MV +d8nEb\F((j3NmNV/&i>LuL@&&u&?.:.1RX<2.a$2aN,O:!DH%j9acjcCQR +DrgfgEq,p4jNRIpuoKYdtLp;N+`U)"N-Xb$j0Td=plqh-6jfs7tA,SunKJ,o@dAh>W52e(2Z +!TC5g'cYLn[M9HaCUG$f>?OlCR.jY5E"m-G`6#!iJ,%sWlZK?m5KH4dnajj +[MZ1`kW/.RuY$2uS4foiBrqAjKn'GYkt<6V5IDQ?j,pnYiCq&8BdB`3c#,6ourRmo,V$ZF1g +fPu3V+!=O4U#-2ZL'n5ig<;$KLd-(1CR# +aQ[J$5Gcf]AA[>\q]ACP&F8*oi?7E$893-BB*'haifl*T3(p;W2CnJEA`:jRIi<^ +rTncOJe>1i_.[#>7%6*E+?`7siN"BVH:m&3#GiKDc+jL\1n;?;1Hr!d)RQ*(lQ_I-='44CHI +J0X:Vp5p=h$TqgOn?_6"PLR2/tLTJ9pS32O8[EN"- +A75j0([=sK4d&r)a-2B#uP:tR`\%rF'0WCM:.=dHAe..oo8%F4t74b,.+bXpkt$\Lr`NIC\f]AX*qSPG2/C&"(5*b +,CU9L(B&3#7&`fCH$(H[D'>1DV-)o(hbE#P^a0fmGSqa#3Nr,q:eA'ka8"MDF9YnbIO,a&=e +dY)n;8#G'W7@o-AqQkSf^89SFn\%HqVp&kCpUgN[]AZ=)\&[lUc#WD;0g87`LKh8f\D;'#oRb +Nea\j09R8DPYNZ$5Gi@-7=I(d:JIK,X3O-cFbN4MV]A074o-a[BF^.Ds:eWG:;oAJ9`neDGbi +f&P:m!;MY%E"74WDE)_)%Pq"DFl\5c?7h4a_N"^rM`$:SS]AEmN)r>&DZAug<2R +>a5*Q_-_C%;4Dd*uGP0t'rpIE^`(77&h]A;%m)%K,U'+@^+N:Dr8:"SQdf3/Pi"P.Orr1*5/e +@iR*cQ^d!m^>j(8-CP=@Op4C,B5Xt%D3@ghd>U?pTX$:!fnjZ&DP>@G(-i\\]Aa\r^GFk5*^- +H^aMlH/+Ui4rJX/qqeR)!>Hl?O>oh9'OCr2!QXtoFgidRj&:IhCl+_j0=YCO):Q,>-+I&6a% +R8+9%'(O[g4!?V"[137N\^#Co/PSW9D84sWZd,*>NC?6UDqO!9W10O%-JMT&8T:0VD>kT+iQ +`F9`**1WC`HN*9]AbOj#ad]A01aeq&Aq+;u4]A["AHY&%=+_n5..Si:IX4"25:94eVsJNdo"J0&)a7KUtF.i6*7WQ3.EhCKgY+c!;)"'I'H>JXkVjlgEhIJe*,J +]APPd@+=Jg>O4DZd#Bor=m%"b(HYmdoL1[M;/]A8GQWWPmCV5+WeS]Aa)m&ar+*(->(VC?k>6kdYi.p/dV"[>)sZTcB3c)[7$XUj\orR!7o"aV3)5qEpd%;Mhn6UE6J$ +,$qmGUoj.77sI2%AZ@WKT3O4k+[!pI0;9N\lVZsCrEc.'GssG(`mk[KZn)5hM0bC>Cq?oGm9 +6mH1PXp,83hhNq2os5j[@[UG5#JM-;-Lbib'gLfF=c*8&pCTm]A#C6cSDd]A%45R`o:)n,h/:O +q:es\:Zdcn1N)EGs\)]AEuH4d+mTamDJ[J.R9:Gh>dQ/`O[-28Y?[X:N49RYR9OuDA3+Sif>: +bXYpf;0rF4bG?GlkJFYP0_/Ec_2D`,)l]A^]AT:i15eZHOE\:4W"!9ln2QFqUKu/k:cRe,LMb( +OX$4V`9gh\mFIBHBW,)`EVOhst2k#2+:[pX'$ebd>]AP-X)Fc^tmc'fnsE]A=Y]APqtn3Uom4YrdqJG +2J;V;&@FXMpL:9!'90jSN;cL3hY4oq)$Qi8t9@kFI>@YeHeL/DQ'2@fmE-8]A:cRccfp6,u6Z +^QR1.T5QZ54@o:__jr)lD4TbsQRso%H5;;8Io'C@F@@l=hW336'jGf4]AK8p&4!SOuFO&8_Lb +!dY@[J+[>(R42A-.Ot=.f4UYTa[>urmbPFI'g8MW7$;5;K!`,'G]A"`'<:DtCJU1+&RQ`VDc- +M6YU8nM25)&p4m)(8e:SFej)K^:p85CWB[Upl96f0-.>a*X-Q_qK0h3>*T)V-e0EmU +DBQ8c^f!!'Q(18(=g]ATgTsCiVl()SWGf'j$I##Vef%)`A4:JfFFsc^-+ZMDB'3l(dSq@7_V& +mlsM0AI6a7S]AfDN]AH3@4']AUpiuUJd1"kT]AD@?Qg,91@PGh-mcIrWkC5'YVauWio6WcCHE57? +O_gDn,YL]A4i_9`>&+GOleH5Md_(iERT)hV#*bm`S<1q)#"RalW3_A+XmMb$!.n1A2r0@tN_2 +Pp18_H*OY%kSB%e#Gt_LIl>3"lm.lX7,H"Jj1bMoB#:[NDDh+cUXh'B\Q(GSCJ.@[NaU"mf+0i.HupH26]AZ,#VrZCTNGWWn>UXY5nWEJ +jEnA;nrr#QDeh[&mK8#Q=QEWrKZZrMHC\>Y8uTf,ok60L-6ZOAa;&;9$c0==*l_iJ"tWD+en +HOKn:s0siRPcW-+9qn?n&LB:QP5[p"b%`QC4:D>$gpbbo74?DPq9!Q;EXdhOK_'*ZN@3/_lU +Oa8RjZ.89U<&:Qbg,ut@;319WO2/`ULrsd(45`'DSAk\c4MDTU.KbEZ"0m,]A#on9cm#GN:;b +3a@)/dArFFTD*92?V'C>:.V%N01^d6KMd]ALq;G2SU*'@@t.bW(oGa_]A;Y/XrAHL$dSKoOp+a +AeW+U8jF&^gu"'to!^JJ/,nC]A%M`EZDAh::%50ej:0cN*WW!:frsfu<[n@2jEMWV>r]AHHW6' +d<,5(>#1h->Cg."@I<3AJ*>*nWHLtXSSL?S,/kPHf*_p(YKA6ALk^"9c?3@5C`m&-No2X4=i +rR.O/D9[o?_)J6c4?)KFY@1@NmASFJ2a+Uku@F"WoC=76[0Vrg"k!]A^E]A77EoJEN#TEg-VDGd"#Uq#qh;h'9]AaZAR/2`Eh)0L*0?RYT1?kbCFnp+tdb!n2D=^ +]A\7#aH]AAo;EcgFAN#rUG!-ct?A`>_294oJ7s3FZ=aj2Y!PrNr_r/SKXe'i`BO]Aqr..nc"iC4 +P;rh+^'.I)cc4enkqgk4"5iK8T$_i09YU=@(e/>9MF$B!8VI0s(OZ%X'3D2.6uUOiUcQ(f`C +Snp)>oIHD;B@aeBqdqnI2*!56?baZ\j]A>Ja^$Y)))&XUOD4VDbF+N8dgu8B;\[/ZiM"_d-QO +46r4jb$ld8Fm?l9pk_6*]A[2T1!cgIV9+UpNK7&m/;F*H:jnL;<>FJTnuk/Lt#YjSAr=$H9mZ +]Am`6,WCq^ti9SPpK?PjY$E"lN\Y)a9EiCYsf/]Albff*0o0U +X)I"iVdKnBrgEbp%8gf4\:-lSY)f;)B,%_#D\)):?TjF9Lq@ncb9q8K6\D@R,e"/=mC:G?K; +AiO-^@L+$r+3[IKBOa:Ci=d!d_.T=P*haYuIjAM1qlPIJ2#?M$9(>(8$pBdflcZsQ@bL%=q*\>HI^g +Ecr\$i8JIPGMZ=RJD!OB5C`;Gl>qoAQXWio-)!h)@Q?S\SDlX`@4'6Mm,:$Qql$W=5L#2!W3<.?slEjg60$$sZ[_.8'4-h +%m'-mP*>\`oW`=Y['\O\.Q`",>sTiQRCK]ASgX8c6B?m^?8kfa4JP)1fE^Z=1TDe"-UoFQT;K +AJR@0brC$Q]A&ht?V9::Y!"^n?)t<^m+_+*rZ1o?q?I1>]AoprVk9ELMr7MH'Zum#\/?+g7VAN +[]A+4,.SgM%2!V2[f%u:Z))B]AO4&*iL[Lj$TKjWN%:f#3j/(t%PinOt1nS$[3W/#L$+SY"7Ak +Zg-UY*f9!_;P'3a?)MK4hm?eD]Ats-Q9&Iq=pm3/E8Z'I4[i.I=PLf#Q%N/AIFFf-'b;;T0C@ +u'femDhm>5$NDI-`]AlWd2Q?r<,ZIECG*nK;eN?&b@HKqW0X/J]AKK?C]A81X\\-pMm.0U^3`6"K=hWcBM'$lqu)2mh%r6@5#>)mqfbM?r!KCsi= +t/S2VLWl(iK=_8J8^9jb +A1;DV5OXr/#+/hp$i9]A*io0i]AQq$(I^?]A+=TjZL&q/F'qh%`IISjQ+MtAbtgt/F!FC3.faih +8+V)WCZS\2M2*#A1@Up)g;-oPt*XjCGpMm>B.-p?m/p"mA>2doaKh]Aq_ud.bHVa*BF!,N&U) +='e`tk@\9,G8aiuc0?&I&D3^YUSZ%J"3//ea=&-4XI9es7HVM5=CJ5+qY%b>U:WC^(^ +X$L,DVi3W#rJ[nq9ioL:2T+iOQE_LUeoO"P-)#p6?a? +kRM`^L*@8>TRGi5*'6E:+"db=Kru+;,"",6)!@EP:R95)E%>!T"Ond]AI_No0#Bh2i]ANkKVm+ +6$<`:aj2r[QjV]AkYdB4cOap&$VpJQ_Hs]AH=(B"pUJP(s*6]A-mkc):fUq( +=MuBoG1[3/&=EidliYnN7I4J8>i(Q#fWj'+`K%cRHrE(-CB[[1 +81XEOV=>ZG;m<\[_h +'T*W)!Pn>[d1+c.QNu-*F$Ej^o?DgJ*2bi0$*+<'R(#4Jg5XRtWYKXXlO +SYa1_1'-@m9KJtfgi@F1q?3RkJMYN4IFd4-&!G'P#l9<3N(e)5==l(:(hV6lf"5_/e!=e'eS]A/^RI(cMpa@n[jIQFN(-V6J%$5P`& +EB3^E[FG#0f?kYI-Q'D5AQFn>5eW3'<\Wite:eF*5#LWg[In[u4n$2!Sb@Bfn0"0XX3+f\$2 +jX=ju4$!a>f8EYk?99iP0a<5/89<(*=uJb)9T\K["_9bpuo4paU/Ng;48$!q;%I1+K2.:ps# +nm%p1I4o(j[lF?j"e;JR;c:*3rm?kaP?$SBc,ME*KNRGIG0-&[;^Iu6p8kIkq.j51HYS=^Gr +kMOjKHJ17`!p4:FGKjOPAm)<8_Clbf$VlG?=!ugEthi_1sKDRZc[*-^!1GJKjBLSM@c36@jD +73fTJ@d(TBpc?J%3WMbZh*lf!),OG]An:=N9hdaA\.T4Eu"qSm656M*o=@*6!'\%;%:6$o=X_MYnK +r=cb'//uHC0q`TADa4"Sfm')]A]Am3K#o!G2@GGL7>?MA&4$]AE7(;+rq*SLhX&:h+G-IE*@S6Q\E+d +_c:nU4>';ohNDJ@%a^:UUdt5*:O1Ej9V^7)ot-EUKM4`OWcnjWQ(?oTnu*I(sRe^&(88+/Zl*flY,`+k_HnkrcW0q +a:&p]AZSMW.jH'meQ7PWki#9Zt!$'Drp47Oo?jBa=HjVKl4R*5+R5-_sF'1K!9,*^i;bu8.,Y +[Zid[q+/Y]AB#cSnUg"*X]A)&&\eP,,Y$Y".">:@I"+K!-%AIjs!p4oe]AZEflmudp>BR'N%6S5 +o>mY*fh,q%hGHqM75u$X!(BaNKi:EA(Ql+h#!s8X8@j<%UHZ:c2bWa>62ru%FlgK;O>[L?2@ +^[2rW(*Nd(@7-&MqmMeP^YIC]A9Ldb#X-b<-Wu3D[W%)G@ob"PZCH5_'F(\!_gBnE4H!JMMGL +?)YSEY_SuKGTGL+a1]AukRkbhL,A5TZ<%aLfg(!QYVlZ:C$*ojE^G4HOf<4B-U17Jm`r=2IdA +n)nt(Ub8/LcUX[k8"Ybb7J(p(a`;`/\:f0K<_NM=8j?)Sl3SfkYYQ[j]A=C?=)QfBQ+%#;`^; +UiaX[Fab))1#HeC4JmcfLT&"T35_!XHDfc]Ai4N\%eiTZ)5%\#1=%OVpZ:3* ++f=_G\jO?9CC:"A0!GNC=D\gAY6r]AGO6uWSnVmMGW8D9Q"DFO)M9M)4h-]Ag!OM2g97q_C`b7 +.kHN(EFV^a,GD/F21*?RY0*e']AnithT;LchISLc]A&RchR$*`#MYc+\:^dbQ/q\]AkD>Y2?\.o +o;F%uVuB(jdg<^BG\44=HqN2X9]A=u*)\Me)'12blHJr4f;/Zq+B8BJ>i[C=qr-&M:=3cVX=1 +5'OA01F5'8CQI[PW_3T293"#Rs6E;Z`)!4=.tY59fHA&iW[=`norYG%:'_h?fe`J.Ha[g[,$ +\2`Nc&i%$H6\(PREP=_T#bf\)LaEU]AeQsWbNBPaal*$0'G>U5m-rHqu_,`d"[U`W:OZAN*]AM +%q.HZKRF!^`BJnBQoj1%YN$/`s;kq(Jj?'jW4RI;NDiqZ+Q:!L=;Wc?M5N30TL^m[af76*Z]A +3G?-ch?J,8`(_+LSt^$Y)QlJ]Ae,]A3N0r"Rn`PL[;o<##^Ng+R@7aU +p&c]AHk..M4dLEr1Wkjo_f[8mj60gD8eB]Aen=c0=Wd[t.5 +j]A[Q_X_f)lI01.H:(M>k&7VmP3!X5R>G0usiWr'kR_>qWMso'4Sp:;EeZ=W*ub(T%c:gnUaAe:Sd7*qhn;#>g54.Q&9C7,]AF+G;>OaIT$;B) +3q+QH9;7T\Jl@'#iNf8>7c3XVgEf=HusIPG^(&6hQF#a[^NX,k2qDQL?e'hMM_b1_lbfZogX +SQAlWQpcdSM_^NuU$WLI,Lo^og!l2`Wt5RYg3gn(LmnY*F_Xn<-'`?c:Q*O#hc!)BB9!ud=l +ILHRofkdV@Ls_*t+TZGakR7pUV^U%6<:E#S-/n!*pJ@Y,0Xl8)-P2enOc`Cb-JPW@j^jugmf +nP:S??S%*\?BdO)r^&5)Sh2+X`.0'S++kjs2!ooIu_"YJ.XlR$7T0esS-?)^D?o^=HfoP*#]A +aFrhE$o5r6nf/OkjI2QD+d"^Z=f`G'.V4J5ZoH#n4;IhNN,[<#$SgX7DULL5t7,3WQ7ms't1 +;$hBX%S;Y?IU!m`!_=N,4;tsDV0Ll4kls/j12b^"d'5df`.ZcF$bL\9%/VXmtB2SEUATd\H1g;PW"o4el$]A59k +RNefgdeK\jZ\>=60@%J?53#f-7D!#?R:6R2PKB748!5S1V[^cPYc)$<))%1*S +s?_!.//M$-HUR:@>^d/MI4oc@s4LM?-@Q/DCC\,mLdPG5mHhCWRe,oRV"2Q;+5-e)_W_`s5MhDD_'/^C +^N)*4J`CH)gn5bZ"I>gu0[W`&>jek!"Pg9U.8)fQ[%ZZ7>s-^CDah%> +GVBce6Vf)WRgd/e577E8mmhaBAtQmK:074ri@AD=%d=UI:GWeD,#:e7<*#JR(u1t_/(t +0"LE,(1U:='']AjrUXKA[?D/Y!C(=*(B,cA?DTom0W[cZl/.Z;PfZ2b#en46Xu(FB\=3J.OB7 +F/*48mrtc:lihCj5_8$-L(u^.NN#_6g`]AH&"_Y(bfd;Wg2!,qJ9k_cP:kHD4aE09YYaZ%$1D +(n4YUA#8HmFbgjsgL>gCae0t1ea)S[\cGXhp[+q(Se&[TVkZ;["o4dcWbTUs1g43c["h`L/c +(AoIbcFN3">TZ.%2jP[*#fD]AY^bJ`%Ymb)m.&7olZ4V6s6t^#p+TWF/)t_fkT68DaDj#E$d" +T=-CPXS\BbhF"]AS^VY^P$.Yh%M]Aq4@8>L%T!\=Fju:YW@(+Ys!hnA#->JY'hp2Unp]AYBBLFq +K]A`@OC+M98aO+H!BPgb7Jkl;0s"oJB.7n1Nb#57]A^^?b1NmWmF3q6m9u9jL,7AT_!U7B*uQ# +5HXdFWgX?e:jOr8a;gH_*m`cib]A116Sr&Nin]A+ibWL0cD0P5Esct?`R^p[f)FX%.An*p#C>H0XVX%V_oP41:&ARR +CKQ+<]AL1br4eVI;`^XB0_mlB\Jb)0^HLb5#]AITq$B9A-h%-?f#B3a;]A.GXb$DI:3$D;>>EZd +V;B_N3L'j+D-#)a8dd\)/u)K+%D//t^;n=+hIDJKKR.#]A4*\V@Mq7nG6b-j)Y]AR@*9RnZQq:[1[B +-WO,cqb!!Febe/rL^7n3Q2YWBD.>2!.ql>"-N"rW4h&8^;lk?.kAe998g&E)!%:9Uc!_NC=^;O)"bc;73bm9ak%GgX:D#[1GppGGkYY#Mi +@9P]Asb;ZZDFm;gc=J:HbA;s#-'df5*)>4?:a/YnpGot1.o]A=YtKooO-UDF>oaXN;*4ZhWp_iO:(QchhQa_hV/3\I%OdQ7L-FjH#X]As +&jB[iF5^6(lq;eF.pC+L3cp2Z,c(T"lj4H#gBL;AB^Rh?peO,:Gjl73%TmNb?J>FH_"lHHE" +=)D:g;iE4%!/f]Ae:e7'FoKb:Rr>%:PEW<6.V@7\FtR: +RdX%U'WQuKaf-1bTk5!JZ/hYr4sTPj/cXQJZo=_L\poQ]AAN:)]A^9HOBrc/cWii>%W$E>c#jR +BR[8rK\TD(B&"#pS`JB7Gn*Unc7'aui/$mbVrVd,Ek?#T$JlRJpW/N.ZfIZDZ]A"nNVW7DS$6 +kKi)$lO8*$QJHu&rIY1pc.Jru'c^oY/j#"HNR@')bKb&3r\k0L:pS_pKaKslXiGm@oK*E;); +spbEf6VIMXKu86[TV,mOF/KZ["IY=I]A]A\+i=($X5s!`a0.-J=45@.]AXId)?%0Jc/kt)B^Nq$ ++eS,kfWu_d0:X"#Vc+e>FpH.Pn7t&'LZQjuIn%8lr"Q1Lg5Q=uE'OgKp'9]Auk!VLCTp$d8uW +JALsn1G,5JD';aP]A(SW)SVoEWfYXtL/k" +Ld;t^ftEVG4g_7_?a*\;[I/nD=#Io.A-%B1`JGU_pof8nF6D]A0*X]AOt\gOrJa=DY+:X93tJY +bpu.Ejd0uKeGDJ,SaC@E)W+,a1f*p[Ze'd8!S'H-E=8!pNb%E2oHYu]A;X+QU`OMJ<&!CMEEYp +s;/"%oPoIE*IdO>PdUUGI[)[`+>%ECS^e2"8.T\pOU:(:O]AY3o[@qua$G]AiC2.7'?Y5;J:tB +4n+"L1b-!18r/&jV%"MJ#=[$>n"d8C'>u)"j@!<`SV_"`8Kg.X_b]A,/lg$u1]A:I=R_MTmE"g +hkl'A1d-5b#qlNnp36TmHY-\8IRHD82'O=0U#FL""$jR_>7!VPNfCS,q5\Y2+j,*Q:?R=,:uH;4+B)(Cm%mQ4?J(OB-Ye^J^6=J7m1/Ef:s +XVM,$cSh('c2WK6NZb,(;"h4dI0,I<,/Ggm=5J6iJ0KK-N1),?%t*bC#pf]AsX`^E)#rcS'4'JO\@q7Me$`fXuaP5V +m1_/G.=U-RcEZ[X0G,7!U9iH./+HcGg1EYV]AtU:Z)N7L+>6@BKQ-9L]AiZHQCt)*N"eM!*i[Z +)7J-%KoG,.EFFD4MYQLllX`#5O^H)X\h?!,7p\0=b6!BB(R0=Bq]Agnb#e +ceDhnb2=(*bb'=HTR1Qi#bM\PgA-b8R\((#(OU:bP7'pRn)tB;M2op"Bn"XRO3rr9'g_TAN\LgUSXIXTQ+'eZ1mSa/3i%7/oOFufZ:45/f9 +R2n(;6\SjpE75'+po6o^f*Fiafd41oO:1(30^W>G:4Yn!.]AL6@#.)I;8$qa^FWP,ZEB]Al$pU6k-4J,>pG)G1^`.3IIfGs1t5-sofN:esAcg@c.6d_E(51uu@^\P +%LnL`A8-8q7F(UI&5!Kh&1E2Q7"C58ar!^0FT;dl-!If +HNA4;r[Bk<[&OXW&![r"]A\WhQAQX5M0Nc,0jCmaT,O@HggrPJ3MVu:3OrWbpG]A1l&-e<9k4! +!#SZ:.26O@"J~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +=Iot7IAK+&[@1p.b$(cenW]AJ'Wk[48c!pC4g +1Fn`ohO.gu!2@1Tp&6,JhIZ#pgGs)'0h?V7+r"'0JAY0_S/#j=^/K]A^Vt54M3p:6MkSO=V*CT6>9dP>8aa^,@o%_-Q@MbK[K`jQ&MFfmVJ)Lss`tcNlZKI.? +TuVTC.1\eCRiH#ZAF^e]A";RIJY'.0slWdC;!m6&Di'?6K8R).fbgP1!;DW'Pc7`TTk9dn72/=X*).7@L5$X_dhatH!6,#A$3Wh==fF7[H_HQO&Ul_hJCZ3 +rhjknTXY*-6K#C[l*$+R8Y5G^T#MiBqUWL&16pN^WmmMJ9%YHp@8s\Ri$^i,*$@s*"b*Ak8T +P,p`^`JZ@Ugc\d?cs,K[^ck3e"->q:PS/$,r"tk%3?j?VBrPLG6,3?&X\g>PNaMZ6]AnCRrHn +nJ_Y%5U6GB?u#g.7)-+1^6PO$+W9.bDj=:7KZE'DneS2&U-:b'E$=)M7DuQ)l;p8aT#67O'; +5AG7P9GTPKGHf>IaI^Pg%WEXUei,GBhIbY5a'HS8t=*^h[/JoN-=.7olI?lka0$MbN52!MX# +&K#cZqTlAJT_`jh(Fo`Qo![A!Zh+mJ#K%eJCZ"FE5@"EJ%\=?lKL[t*=B6,C8%#IemcGHB/t +>=U7"&OYKDSR`K@/3)O[_-0;6qE]A+qse1U..6GrOd[-T@;nga(I\\&-$k;X6t<`hb"X.!2b- +./i*;d[X#O2D!B/,6>#qes*$k=h+FL:dkr:iO&'b[YN+X%K(q\ms/45"mZM-]A@sj\<2o5O-f +2i[Q7k.1c5n2("NgP!!s(A5Al^+s3%/P6)5FbYX=g;(r4I,,0`V3K<8ps\j4n($-=n9dKW1` +cYF!ZpL3AN!C*KubYeC((&WV[Yu-XHMQ4`j!&b(ko[iCF[Q;_jm]AR^>PG.+2-WH(fFSq`ZMsG^]AdfNAp%@uNpF&BWLs-+:!X(^ +4CRtM\U4o`+lY>Y5L/&F3?\51,UhkA+c?654$2uq`"/(_lIh-'I)Hnc:XQi[MiGBi$[4kiYq +G1eiB>:MYhu.@UG^!c2RQGdAELc5JeDf@F-gL_Q>Js%4`#;s4F?$"K)50gnoS3?NXj=n7+'1F0JX\o.aN`HjC>A0?rqWct-da9sXr1o, +(s80J&icp;pi_5s3@.Q^id['l0GDaG-NjtEJKL%7-NPI-&OejJBLGA"m7,b1S9Gs5O0ek)b@ +eX6*soq34W_AU^'cii0BKRPF5^/3S,J#MaI8*,VTdp47_HF+f51gfJB(50q059!0bN?hi8@p +WZ2Yk*EhjsslfmQ?UT#L8^\A`.#4WitB(JO64Tu5&_dMn`Mm[!nhKN?h/Rnj$MFOh)cO@^Pi +76e]A&6d"Vcf'69F'H)b/G)Kh1S[Yt6%@>'X;0St&tf]Ae=HUs*C=YP@Y_-6N^Z@75dc#C0J>B6n#3`o(1e-]Ab*!n,A +ji'[*j>cjl0TQW$''k]A#=>iVeITRM:Dk,h.5)8L'plLGVRniH+2?)PRaNHs&0aPK6P1fW+ma +71S6FF0t+8#')oki(kIYi(-C_Id*pTm>De?.mZ]AN]AB'S-rnJhiB&V*)R]ATZ,j=pW!8>t([+_ +G[;m1gm(kF!Dd61K=L0<_MU3MhjQ-g\bg?=cgQ8*:jG@NhrI(2D.4Nq8C.(n45t'0oKH.I]AJ +s(V:2Ip+n9C:&Vq%6"RoaR6WPe5W_ljH'2;V!7K_cqC?k`fcD&/l"`S2_D0Je_eq=^88W@tC +Rf/',[^%8i)oKZPWIE80Pf^]A[-dZo]A2H^paY^jde(Va\&KQtG3U(Dk"6jsiJ*\XQ5Q_)g&7i +5lb7-DR?0.mML_'a`Wj6e6KEZlKsF9!)]AkXNkH#?G3B&9qHk"\t`M]A(Nkc[fgC'ZtYD[V,m#qkf%sbgZKVpmf]A2d&IR4%"4=nUEfI"P1g@h.'(JR55'@Aj\UA@q_4Bcm'7OSC?kc2\ +-8h^nGk7A-N^Q9'm*We3RFreMLLdJ4&t,ka-;a,+KfR!N$H7)D.9MG8h(n*ieXK[A/B@btI6 +'q5Yi@'glW5/2,$6G*:J06)KaKO&5R(J%ugG!&5aOGee8U-Q>m9``"f%0c3D%,&4LMmHO1B)@26mm0iCn%>#5/ +WS1'kG5E"b$2A0*Y96DCPAo_L&'d2V,F[;.oh/!F[(G=,Z8qQV4CHW&H)3o.hJYQ)4QVAV0! +5P(NuriABfFl_KCn-S_A_:VrOlKqGp#XGh1Hg&Tf[fA/FOF3M\ZJ&$8%F88;AK2UBoqaJm7, +Aco@tnOpG7>'iG]AGTGoAmZ-WW*YcOM/qTT")$75S+r]A@QXQi27r#pG7[KV"nGNgAK(I(\T!)g#Qn2\TTUe$2D5o(-P[)[l;.\fkQ*[q146o7+%mm^hPJlK0PSF?s%5f+@ +*9>2;_;1n)\djpQ0p+qF5[AFX`K9]ApmQ\t1sG[/koF!t0*_(Qa[-2`=q)$0^f<=/MVS"aD>P +MEcQSm&agVGlMT]A!\CWV]A1-b^qb6d)b?WjK3U'3AZ2&@8)[g4^0a^I)m7rTUP3'K[&=E729' +p/+*7^/r34GO[@(mj6+-&??sVAmeE,egC>a7+euRIOB3+*krg[5/(6=#F)8$\_*VA-nTM&KUV>5Zi)_F+G(n%p>b"@3!5Pe&[^i7J*.(&HW +]A2ncb_]Amg0j+sN69o?#X`h#7Ok\0WWpQX7%fl6/ij"5;44(Fh8V9^2QGcp$]AEiW-_;35_;!]A5i9b#`122h&Wn@cX\pc*FT_!jJe0!-VBJ(sCFq(>E>k9 +-:o`+IK415?VAsK6\EpH?,Lk.uu>LE^'kDXlf:hVe%*[7_t^DToKo1CAA.S_5bBicc!&Ee=#>VT?!ZqEuQ+CA0=M+jV#YaikoC*GP^_! +`'?('Q%ICeiNpL]ASFV<^\L"ZlWoh"i:dsu!=LP'61/W$/L"["Cd^B!8f+#eDj,QG15%raSe_ +%`6o)$Pdsqep*s)$*)"Qn6J]A>>1%^]A#r^Pf4kj8e+jZZa3S4t^VJ+5X>%<-A]Aeg_+r7rR&qJ +82R3]A&YreS%uSYG_,R@lp8@6D3;g"[kH1Zj$n2;Xf?8k+iTAL!lUKA@1qJ0P%N(4"Qa^ZEh- +VjgSFO%BO9Sln7]AH;0e2SQ]AMsrLWfPl\T3AP0a&]ALZKG_n(Qc:7Z;#m'L+;$^lXa_Bh8^KrIsB>E'3/8/XX]AR,8,1D#KJC>:GN-Is7;p8$%=DWkVA`2gV_F]A#C"l0ietR3A+`\IP +-p$h(A5?.ieY^nVSDkkog^5#?:C/WI[o$10Ca?kY.qFDN.?bDp8gVhG_o5*TO3IeHrp5%%/& +O5,i*oeb]A`8H^G=r#clPK*-XM"\lXZ.Nab.>L[+.h#7V9h^k>^3Xq3D0HYo.75F>L#8?u[DT +JW6]AiASM/>+A@!M@HBhZV4lb+)kf&*&+sh=2l/JIaIthFYL4kP#G^6YYu5fB:(%DI.jJtl>6 +nkqK"=+[$th)4'?]Aud"2scq$%B8'KmYE"SRZS>*RtO4r"NODQ>/`(&!T+qclr:g-BX:CYag]A +'8'U1A6d-5'Gj+#k,*J(m-1?B#=jsi"'EkfBepTU\e6bC2o1m\&CYD&F&r/^e:92!L%eDp-1 +5?nkfJm0B/4FV)5*,)Oh9]A8o"B(:_\^\bGM2eq[b`l*n3C#m]AKG'^+C&N6?c]A4>^V&^hnZgI +a-HgaeJOQ!uFT1B(8YG4qo'b;8a.9.tP)P35XrFp[,*1,AfD<)%8%&N3B>HCB/W>-g!a=I\i +m.)W*8*bQVl-!eaT8d9+m5KR7_,ZUN.8BPLr_n*=_QH?#dmE::j5h +ECZL%$aBdFTbh3UX3E/NW3\_6i-FTT6As*Otai[rR]AlJQ`Y>3D_78$=-RQcY]Aq,pk94^4l't +-J)P;sb:YA^\s_^=BmFOPXoY6p14e;64%kB@[<'rh[jATQ0RVX)aJZtG.pfW??'6;An;[jYr +fLa%AB!rX!f\3p6.IkPm.!8Hb1]AS52tU-p&1R:T[F00-MdLsDk'0&0]AlIS"N?k8&:O")qKF\ +!(M4M,&YiB,!T)b(dj-19k7%M07CBPdM*O)2?F`e +QA9cuUa0-*<0?L*Q&tL[4]A-ib\DHPt1.snkL87$Xq0A9/@Hpte\t]AD-JRXcD`+(=(F8r+2#h +]A"K4IX&r"3m/\XN7,%:0XRKfP_BY/IpLl-,u0`m.prRO,Fe +rM!q[K%JI`,@-dU=_$ZfP/Z%?Ua6l[P2SNLF5l*88$+Ff9%-sM?+u;]AF(&l-$$>V_]AHOGQGD +ns'%"O#Lap]A3\[=nWT`[Y*bTE*^LcA&!n\Ii(%*A*ic]Aj(uuX$Vf-iTODYhmkmUH?SBV)&-' +>DRDFg[T.Pp9>rr,HL0M0@"qT["N-b['/_*.aPtt-%jr9*.j'#AV@Yu5U*i[b9_*\Vc9mUOc +32ap-pZkqSddJlkpI]A[EH%)RV]AmdQ*kQB>*4N*\>Y-9X@Q;*umQs%,9F]AmEl1YF19jZL.iSF +*8\QEHl?cle"53Za-12<]AJ>^V'a6$Z@iNeIfo&tMGr"l19rOdM@pib:M1/PZDm&uTLY,L,>$ +%-,kFdQR]A!G\k@u#BqZtn5g)_P"StQoGPQG9eosUWLYtIp/Mem%L#!d!f/=lgRWL1hr>e*2O +-H")]Ag2j*@rBnd(Mpa6\f*HCp<#U%1"^!$X]AB$^@_(nZF]AX_M(D.R)I#Susj7Ls_!Km]AEo69!!J:#*AIMBs=)W^4=24%q?uXVl#&%e)1\uqiejbSYrknk%5"d=K)d +;abq4N+4mX>,;ac+0ahg@KZ5kBLg`HVC9%DG'siB".:(oXGFJ7q.4e`ioR,QL?rFRmG(c;oO +8P<:]AP`6cB5D"q1,l3.&B97Gs3&2qV<)41l'[lN2s+i7i"THV$ndk67>Al^3eBUto"F1c3Tc +LJnPh"X:e)/C"1U&l-#nGL +b6#X7OLQ:,T1p;Yb8Ems0eH7H9s&pg_3)XR9X6Ah0-Vt:Y*Y_t>IAUcqo-''**Z.@P^oecgY +@@Vk:^7s(a#[%P(BfC]Af +PqC'O36o0aPDW%%BGRO0:!@AnG'lDEWugX]AqjBjP^+)3"H'WL1jG?;4P/jNA/'Z^DN6t5Ukt +#cg&+>OitZ`l8CNqep^q6q:Ehgq./DR\ggL^B,q73Z1tD2'=>SbH=r'Ba[/ +2c?0XMSWfMRM=GaT20'b865:ZLD#--;L1t%>d=?qbQ=f?C5f09I$Sg!>d\mb<4,VF6f!C&!` +&'C3365/B2oX?jUohs2BM3X$*L*K&0!JJs^b]Ai4\N,(M*E@MNA2D]AcN +6HRh=ef[^c`\N_?\U(io0$L*:,4%8]A_\B<>kF9C=H/\4;Fr\P+8XHKqlTl_IJ2(bEk*4;,L0 +JkHEk(IH#0KfNrnTkjH$4KL59[hmif?TMEF9^t2Dt'Dfl,9mWo*1NG95SI,Q]Ak/&W?2'+e#A +u#KK7.tF2R!CLMr@s`kb%Y]A<6TSIhu,j*HX=UQkI>92!8%9k"=Qq;,aD!d<@bN;#bdu1UPWZ +mc=q^SBit=0X57JrP'^=p(tb63Bpbmqeo9o#F:uWoZ*+n48l"ME\3g\UJh-)#2+B<"?34^?C +3+9am]ASLYs:/oB[QX2G44TTGVQL\^NB8RS_BVFPbk;4\V'"J9Zti/m466O?W43_V4@b4qlY[ +?N(Bt'TDuX;-DJ^LG+=c9+sGEhX"WFAohEmLa4*URb8ON7HR" +TW"\DYOgpARU+X%gXU8Q7p^ocl;AbTpDj^+:.pFm==fcbIL?uk;0adg!/8k7eQ7*c&!p=H0^ +cY6&.oaqhJYmS-koH8C.q%JZO]A0Jc8XpjG\gsNq8Su&`I@,$nnTSWP=Od*i@Hlc7oJ>Dm;r00BQp +KNZG;mhU[e6%S,8m7d"Nb`=`MRTo8P[6ABlZj'o\@0o#0P%^k:J:*'PPECed)LR8-YkO=nI, +>Mo59]A'@gil@ZXj2?-6Ze^)Z/M+>B/X#u?^S.H/mpbH/`!S2*P-35'[DK!0F,I9[`q^imr=? +cTo6nq^*Pca*8J:*1#c#^r6U]AHmU-2?;AJL"?X(*1Sb5PQha[X@j0]AsuS[X8>RZpYmSVDP&- +eodRnNUd7Sk@EsGQ,A0k.QCN[6Ch.Yh/KDj;N(og%1_$(,s$ihPTLNWO6(hll`HLK!XuLc?r +rDYSjgZ#$Di;cR&i_,,O['BX;,LaCX+7@(c@__dl3=5hOUZNFQ[FFjKX"0iC:MiEMo(:*=If +PCOdu/D]A9F:)7(k3Pq4@VXVLYErB>DgOAl1Fl0U`(o:O'OH1RDq2;UU*EYgdTpr7^?4P;bG@ +'1rL26:W7rRHX28:=MO5[6g&UeC`Ll#BTZ<[?WE-&2mtAA"K@-O=Biciu1HpIsL8Nl/&mY#D +5bHTb8,I]AgUh*lXmu:&6:]At#M$EfdPuC*aWd&/L^2h75.!/EYUc8V8kE)pLj]ATc9+p\j(aqr +9A9F9V"SQ<1D-Uj^B[!\=(&0mck%\PUP,(DrTd9CsDT`0edu3R>7\OHm18cfW=\$sM#DUG1 +B4_jV=6p.RO/11^:jIDTZ,M1OENic.oV1Xj`deHoY0UNhhoqbo6_3Cb;Ul\&1-I&Gb\d:!jF +!6Mo>cmeuRBFla^'9cpENI$H(km]AU17[K/5MMBMM#5hc6L!;!FsM#_nXRJ,4_IaiYMAS9"XO +Z%GQ[mK;db&g76*:X02@ZsQbeC.a'7IoLT!al=BIO[:o(%SCBWIP#un@5XnOfgk2sV+#/HrjBfQh1^f6f+D&K:P$;_jr=*k,Af)1nnm;GN<-q8;6h,3JJ7`HKK6X%SVtK088 +4gtJCcbQ#h_u`b6eg5jo8l;Op_peXh;ba?c,'^T-5`)9^k[)"GN#i%),_/-UmGFbT\8&;_q( +iU85`\TBenH]A=5)8_jr`1BTQh?!rqecgD:2-Ki,1"iCp2qcU6l-ib)^*.Xte>r)a9U#E:5Yj +4HMr9;NAVq0gmk,fgV'JnC[i8S#0MR=iM+O,kpB!<=$_`T*s%:hI[SuFg%Fm4I,=5+na9Ak& +Xgdmbe!(;4esLOMB0k7<;:T$&Q:oT9X$]A]AB2n)D(Ab;UF=2HJ +*+kF&HYPERlIpHNQ%T%OA*/"ZFV$ttG]ADib +T[L=Pt+61WcP;3FYsqIePRmWt2@YB+9TQ17&FKT13&A2I\V$DV6TbYBY4?D7tt2C!N\]AC$cB +5K=^N,SWLk29Vh$V#L3@fA^,@i-u\TPHOL$p:QHkWVtNIc"8hZP*B*)9V>fspS/rj%AU]AhA2 +*GmN,o>25ncIi-,Df[G-rn,qeaR"I\Xk/G["M[$Y>9*k=q&`Cn&U_ZK^9,,r+6-*%Ts4LRgd +n&;%q3W^I;r*ar+O-)f:N1Z+r_#3tYuLYo*aX#U2gt\qb, +<'3JZeEoYOhHGN-WdNOEM&4H$bYnXE&T, +"3:cXj*bY6Dd*k8-"2=@B@KFMS`eH'[m2sKR#aeInZBd +:tA+U$$?[7j75CM/CO3lZ/'GT8#FO?7b2JM[%+7Qk@-\$Lb9iG4_KG0@J[a)PCgiOiml/k`W +s$:2EB=K^CuI-Oo;=a/.VbV^,m->_-.eZ)/l,q:DlX/HJ^kb^\F/$FYEOZHqnJ0&]A+!h!2aS +Af<=Y"r<)UpFV4>Jd]Ab3U#nmS?g%3rcUd"doo5eIR1bVDH5p85MA:L$sjD=CUd7eA6NsVNf(Cg!g2:BDl8\c.t9? +%=$deaj,PirAksI;]A+lVQ_>aS[nlilu=^qp3K3&-;bCaQk%S8/8/q1H!')6g^\WF;kUNY4!T +C.D\?)qZ[0[$S(fZP6"=D9=dY1rO"@cp))J?t-6pgApl4>Zo3.0I`o9+$L#rJmdLm.?`2?`I +:F3DF?Af!]Aa9S(Z&P(I9TJ&/fCpDD'bR4)_lKd&?jU+J+A-bh(-u5?EO<87:>NTp%%ScT`H3 +d2ta@W_la;Z8VJCfq9igM,3Eh[EqNQ[^Lu@1$Hrs7]A1Wq+gGQpb=/>j8I%?5=CYBi)\D3/ZV +ANY5l=(ej\i/5j6goNpj0\HAa;7F^URFDD*t0IR6c9@SJaYD[opY4?iP*PWSD_dpZk,Gn_/^ +t!]A98HqKb\/=e-&`DeP@Q^#r(C^3C'U=tO=&EPU7oM"\Sfq;S_Fs#0hsHpI(D>,9is`olF,S +msL]A<\%so@2BD9U1#AoL`p^4FjB!fco=*Bcf3Jb$/.PUap"4T!T0Et^sn%V*o]AYqA5Ac5iT1 +$0Ti0rQcOZ-,&-JEC;p9WAL@et1a'%)FYhfG""k +P#4/>o"-t(ZYZ4S)]A^6NJ]Ai!5%qjQiFUE1UIo?C +JLo5V35t&8[A&;t;e[QrSLIuoY9J>0OHE1]Ae_Vk7[8+^Hid\27_OI(u7]A><(*MlMSIh$qFN, +^(R]AW((jSZAe`Wr9_O$Cr1Y@`@NUth"R7-!Fo0fT]AIq+n5ie:Zf8eg=db7[+$O5l*F`j@H!$ +9LX;lOkg#Oo;Te@eu)43"1E!)gk,uH_H7[K_jro@+Lf\7>:MA<7/`ssU8$IT3k*YrrHp,5AE +0pi/m,/X3UInkDZ))A]AFQcBL"?t4u&,U:+Z0>"Z]A#@RXLk[cOp+,h[q,j""3QS2\S"ppqj"8 +bhtqjdsN3FAWo6)eV[DH03hfe=sc]A&&1);NS]AmFMs[5NT,N*<#cs\-jqTA+S_X/m0QRQ>A.s +qMCd6;c)Z8'Su0*Me:L49gr)';4IaPuGJD2k$&>^oI?S&nU-@G/!P^]A2cr[T"@a%C-7&=a/C +&Yqmp0A'.gI%T:NO@7e+LpU85(ogtYpHXm(_Vg]A%7OYT$A7)Ue`a'V'XP)o@=d$ld`tNcKhh +aP1tq!Za"SlQ]A47s$]AB4YSOd_/WI3DK%d[p8cGEVIW*]A>OtjrQT;"a;W7J8l$$MJ4o8s##`6 +#chMO/iN]A:EQi;"8J@Q3a$Dn`qj]Aa?)+qh\(X\"0_\`5jf=u_2;3kP&g`FB\[Tn!;Oe,qK]AF +&QLJ/bj;r6]AG+bUb:c$DZV!!!pprSM/3-QEqGmeO39QJgTQ"SheTp_''DCo4-K'%@5*\=og^ +t#a,]A(%a/%8QMpi&EVo>'o$$hkNU9`"H&cEf^A2EKH+BSA_u<>S"u8>B@nens3h`FoiUHW>< +moU'%[LV6iSWq;pf-Y;>r@GO*(#6[qQ7;uG-u5:Q5_,D30VKWp\st!Q=_enlU>7EUO'A@*#N +7A,A,4!^V#*hnU,W-GgDU9-utrGhK6C^]A0p0d=Y1L8iO,-pQe9=dU8B:WYi@Ol5bVGC3L%_D +k_sOQj;FLj@34XVTtNX#DYH[cm.=@YXTqj"]AQ+iO59-$l2)X<76nTnh$U^RpTCpB_S).d#3IIX60*<:J6;p$8,iWDYp.o?0gXjZr>]A)YY[` +#RAPZPjDH&(G<\k(MLH0KRi!YV^$X#X0FZB,E&2>?gX0F[`a#+)7B0-1514/OW/N+or5PG$9 +pmi+6.4gA^s^.'k;Z\(]A"JXjc0Z[X&Y=K,,q#m'2^JM>K^[R"*lc\.-UnoD>7a*bU7Y@kDX*rXAiqX`L]A`lIK(mraiDH6'Pl.i:r_0OTs$#_Ya +j]AYF0Zi`k,s%5?$\q:0JMNofGS!n> +JLc#6KlC?ZHSR?2ccej2-g)H9F2lmmVE`o!hn#XkrlfW=E'd69DC>fLF!)O>/Q@SO/e,JT)! +T0N_^JUOjW6U.Qh-XVA*pLVqi7YT]A.rr%GA^6`(eXq$lt:,4^=]APllNfYiCeUC@EXoK/I_PB +aB,NS'pR%QJNUl=#&W_h.ffW\3&qJ+;E8Tn*.*>h]A0YSkG"Zj(6;[QbEp&eW*-^CH1iobtBm +j<=%R.^sdcJ[0Z"U10poZE![!HTP,#Eu-b43HK=?'>PMAS.ZCI9QUApPQadh7biW^FT3,MII +4,mUY->_tjl533/\CDV4AalWa&V2\*oS0-+ha(N26p=759p.+gW!+mk'H2"K@&8;7;A/^*+J +Yd`Hum)bgoIfS//^Z^Cg7c(:tI.d+_]AW'Lr^nhNHXI[CY\SViQ,kDH +(YK@niUa4TI!8@1>CFU&d^W:Q?AN"XK+P"\DF@R]Ah(E?&0;"#RQEAko4SX$Yl.TCX1)&/kL* +)e4]AA!nG,b]A./Ca#4ll]Ah$q2!#VOs/LZ>)e$/7gA_Sbe),0JPD9-E6G+Ll-SH2_hSVlbG)C$ ++$0k@"jRWKF3t'%,MAY>n`!hMClRUVa2m>_f%!,kT!WlZcDJ@N`cB)=@Ol^jN[kVs-H"h,]AZ +j'Mb]A'r9mMWP'bAe5QW^)4%2QKn*9& +9.:Id1*mNU_/.YEia,t@n=n8Z+#",+d[dWSU@rXesp0Y!Pra:a*O+km;K2eI-55^6G1<[;a/ +(e\-6j$J"$JJ\&%H:hB-33,!S&R)%ibOjulnjt8[`&%$:CH]A[*-aH7=Q +/84ZXPt?Q3U9`)4GT>qEe6n6o"q\D1(fG[FOeWt;gTGTE +$eCG/UE&g%2i_[eQ#MBdfm6M7&UEpf/d*-NJO`LZD8gc!T>3BsE"84PSjA#52:)d5_o>VfX-1$F0%m2Wg1YclPlTLZB/uTsr4l2bY]A[RrQH_.#^\3Ec1.Enu5, +PTac'eX8N)^I*`&A>;R*rX\0FEru3Gdb@"V@hPRN,m:pjc+s4jQ1md+20obV;?&-Z="MdG+Y +1YQ'i1).ZkBO^7;9?0QY3F%K5efd2_]A5[mM'dY;e$X.a*G3k@;0Z<_bg5r+iC/PAQ_0C.+nO +n=c=rg)GtNg]ABp1d:\NM*&Z2GAn@]A4%T?r-Q1\0\!XK6bi]AorBG!HD@,e?Rpa8%8+*_(b#@p +GXT5$#_2mYKM;*&AoU.g-[6$;/P^A=KIB[RnFOPMA1_fO1qW3_bVlfCc^;h(uG!LX@lG9h?[ +n8S5q:fh]Aa<_$Ceo^J%2Ya4Fiq\JoYJ&\U"HJ!5(m2.KdXC"Ve(-E9OJIrX4J/)Z-]A[@40$V +!pn6WsnJH,aN`H4L=hJ#LNCXKq%Xlif()M(6>"%5LI^&?k:S5+(KqYL@HO?g+(+Dh"1kV<'H +Zk$%)-((03PmN86*:Et^s&n23_I)[JC'HeK:X?:"/M/:4B_ZLm5FZN=b20(=$+\Pm]AV%fUKS +(H;(_8Ek\Q='MZ*YC4d-0\k@59f)iBO,dZkY$'PTL17i&2HfpGS&@e6(&)N:%Q5*gc;$O=QaOZ+ +N1eQH1um(r5s"Ujnpm:rVfPIunDjjXkUCmP@Kr$,nS^Bo(hVX$Gr^[(R%\oX'u#!>bU_eV#n2f%>.I*J8dZI/n +0Tu+$P]A/UpTr+i_)jKM,)O7%6r;W=QmPEp(iGQkG69-f',UkK3Q_(,sT4q*:uq+m$:s7ep\n +MnDpD!7"aP7^.Pf(m9>6+0/6/FO>qi)A/DDbpaYdBTub]ASX!-]A0fucZCG\S[9fpC(H(-3?fq`l-;5>a/^4(hJr5c +?EPK[mZalb6Oa?K9j=[atid;6'\aJYuR^+?3P;`tl2=qIdE`/4pA'&g8e0XgE%Qo3/"oWEib +6Lco4qQF/Aq@ip8V4FPDoTBYe"]A?q\n(&f,SC)gPAV&t8@92BB +=eQm@]AtsqbdrbRf!iY,W+>%K0>8u[qflbm+f"F$=gBqi(#/^gPnS(fJ.$n;5dGBEmPdk?FR!'?/oOE/n0J_[$6 +[@`ZmMl/^Dra-Yl5XbNi9+(-u1-;@MJuae0?6)!Q="4N&q<%S%LubMT>I>PlbZ20q1KDBh4u +rleOBNcQ.9[YYI']A#9"7>K0dmqWI:[ps7gWP0,.o+H&hL1rs5_ipnoMo2Ki,hL3-\S@IKLCo +CNq$?johtD*&^Zk^jN]A/0,1R3^(I1T4 +a]A)sp +UIqJV96k2Wl*b#UZ4L3;;gmLF!^ZhbHMhjHWM@Ni4d`>(73p9'jK6c\UBs@,HBbl[H.K+oI\ +;u3!Kkqcp'FKA92q+eFjYiHpeErIK*F@HV-ZB,jNN1A(1SlT+l?Zb>>`IBY-6S^n*TeaD9Kb +!i77Xq?9U9M?6jL9FA>qgl5moanclQAKJ='VX=\i^I2]A$bESeLJmI"d(^hiq3+J!3sf=+?6b +!Ul4f\N;5MrDg%=X]A$:q-\%Ig(5DWMbB(%))U^SGoU`J#-KUB?hZB,C4iu=;`cT(%Pa4bIpC +(t34K)["rl0n=`CkQJ,K2<#g-bESEi1/T1jom9oC\@Ou-@19Y^7Kd@6)@LJ9u+=CCIDn["sl +%bCrO#4/\RKEn@"BN-M)eDXY6)A$8^S0$+KCg("5j7XifLh`i7F#6C0d"7tDSMsY]Aj#\"B12 +%F+%dEuYXN_:sSouRAbpLPdTQ<9?g'f`^,=+.3I;dj>A/8DYe$.;uW3^/&o8RDB2@eWo8_W- +l&&!//cR/8?Mn#jjTZn&`Z=7!e+trrTL/e[kS9$(XilnrY`?EX*LL]Auc>MYOfOF5U"#H6_`egYr6s+I9C96PIt?pcm8(E-A]AdFeX +?nC?fi#gYdF+kdj5='ps%I."=l4[%%os,ugO5%;Y%^q9=$%JA'$J?7;$ +t:-f"@"sRm,EX#V"OUMIO1c\E,MR*"WYgq//A$EMLaM8MgimECgj=h1L`f`#pf/M"ZS82uf>RI'!FsociIQaZ^f!Kp"8iD4SH^'6NinE +,=43PrST&s8I%c21P4Ha"DtMSC%u=Wm,fGqp()$-]ArIipu1]AU%,46.dB#Mgp:8r=YJm@rqsY +$k>m=F3/\%0_\7,BX&Q\7XN8QI4c9qS'D +Edj.RD'?$tHL"YlR97-`h!6:6dS*iF_Y&hFp=i$;aOZP\3.B^J8RVp)^[6=G#Q6J+qq<']AQn +lPXQ'&/YcaIV[=[*:2J_@ +sb6h1Lqd2NtnoUFL,l3,UpbA'J`.gC(raG9-/?RtNqCF4%\&pD?'Sq1jU9+?RmPLUA+Q +^!n!%Qt!K@kXY'p&;TG+4nOP.h>k8Pl@2k@MF]A9"%CKH=2&J&+0#)5qhk'$AUaD>Pi=bqJLD%^ +tDgK_o;0p7W23bpW1ahNOU+eh&EBbGA-.4J9CnP]A-1_n*:1*%m=,'Y1j'6QHjhL5 +P'Uf*E7'T/0FZ3F-7.Go!"-BZa-iiX8\4Ynm/>lBZJPV"OZ:#58`/Nq465dcN0,(Xter%EC) +%<10Y3t/lIUr4L=rP6rESH@Ed4gC?=K\.c^7:6S$_^cVrKa+%j<'MKYSOagrVfWuH3$APg`` +0#oDV[BRt@TI,BKqF[C[h'E2dc[U9)osb/WS1s5^XW,",nG:T?Qu +OF]Ah3c\4Dl"9%.1pm-qf<\7AV:s#gb"i`YAoQbEWBs^qXflLoZMIWb?*mg`KXH1KT84N#b>m +q]ATnPlJW$8/CMUE0Q4IpGH,bW.cKmau]AK?;-R0C%40s*k2P\lhmr5C]AdO*6@m@"1(1Bm8eP3 +[Q?8^iuAWHScif>3>"M<:7eae\ePP-q<^VWn_M4nY@/GAjqahe3i4/?gj?c=30*]A@EpkH?Y: +TWk)ZpCXB<5Hd:s'`M"('7Hn[L;=3=>7g\18IIN-=g8fK#&Q1t6^^n>oL +>0Q*,(q7*jU^\Sp[5u9)opfZVa/8efQ72p'G@"ipG45C4h.D'FM'9(/@0m(10c.HEWh6FAMA +MaeH_nCkl?1>lb%G;C"2rJc_[_V1@DTR7T!hq2ludO"Y\%A)U]ALXp-*n\8a*Yks;9HSL:Q>/ +q+athW">$OL;*d33h7%YdVMQG!FS=B]A\4M*%nD9f1#,I#5;9R:B$)d"3- +:pJ?+%oKuE"^XTGP@?uVD#*90n!Ra1%A.N]AGR\-06]A@!7rp2!09Z;p-eL@!LmR$eTii\Fq6eWg9RN_SqJR\-g1JFKGIkZu+9m,JV\>#"X!m4OlS,QuK!Rn0?d%lb>lVl%<2!f2U")u +iBM-M0I>L+oC&e,&3(BQ$"H_=S,>idNGe>h4$trLZ2irBND^qUq0oqOC^E4&EL,$f"lO#Y0r +/#^p%*(7-]Au>?%%L]A3&r5(<.2bXL!QG74\$ge"cRIHkPT7dE@fU'nm^QWcPH/DHXlcd91fHO +QiS:cEFlrtC[_]A<_qd@K[8D]A)sgEQH)K3ZnK\VU+M[T#]AitW)WVLMg]ADlWpGct/aOF)BLb1o +?@Ia-&:\6a*@kU3Dp3gOb[VK'o*'^T)'c<`<=qr&kf(qM^@0<:gtEl$%U5B]A@ART]ArFR;,"9 +rJIWi:0jZhXFM8`FMF#i^YsM%)i@]A+(,`Na/+@p4id[P4#?X<6I +9Vu"c0eiQaGh$1A\Z`l4^`+pRWo0\3h"Sqgjc"UOED-!._H9gm:g*C0FIbrQA%lIm=4O)Zte +cR/fLdIBSpE14$68Lqs/,^q*B4,)"<>g+Yb)aN/Z:;Qbo)_e^hp;Su +]A(5jfLbc/NWjbt;"E,B'o^c;/S7)fS;]AY,797l1bV(&9_oFL\Qd>DBFp)AW5CSE.WK&?IJ@g +[rH"elbD1'q0gMK1e=FhG`.f*U"FSJb,`M]AXOZTEj&sO^t:U%+L"@j>/bLoPXP@WhKf$.%=L +1a59I+]AJ:<7J"M>RH`h%G.7`0!8]AB>jlo3(5g545PP,,'k:)4FP#,s41hUs9bG"qUeD?#0Q9 +QDl@/T6s6(\1L0(?QQqPG0,&-jInX>Jm(PVFP3lnSUKlqbX@k)Blu +S%(T#_\"P*#+e)@q&'e5dh$p^]A\UV2YsLYN_f/^QO%'V24q?;p`9*JK>]A\\us<@T$na[bqb^ +m=. +SOlQMdhA(4C@*(2:>cO3iR1DIU;>oe/,.:@.pb,DTrfBqolCR-C-$3Q%DC6?-(#'g*P[RKH]A +5kg?q]Apn%DeD?uf?T6f9*gDm"hPDI!9`Zf3CGB5$&gptcJ\$ifn,3uMCeFKCaP4S]AQp6>YQI +p^u]A+K=EeOAnh15RAlRajJ?MLboN+@Xs+;8r%L\8oLJ7Ukj+`%qu43&d9_8LG-FBoB(>m]A]A@ +8l^$!tW-U-]A5;1G?Mb/RY.4a1:2U6d9XmQ(B2neD5T@%@o]A)+UE%3G2:A>)n%-kN=-U@jD4#:+Kf&,P]ATh4[-V+JF>3c=RRTW@4CEf$Tb[1I*(ufA"IqG'oGniCaWEB +N7_bkCb8Ke#-VS?mre_mfjf6U@Q$"j\eoY>!&6Y,OZdI;BU0LYnTog3ae3PK6gOqoMk1a]Aq[^#k> +1mbRCM$p]AS)I9ff'AA#@X;>[J7bH.W5rV"EJDX-,#>2gJ\RKsPYb#?HNrn7CuA&&X\m^NImI +BKu4'jrt%r9X0uHK0&3i$E4_c-3hUDMDD ++qKMTRn:D\Ji^oEQ]A)S`%Ql,^k"R&V1AB"g[gb4c$MK7;_"X!bP3.qB/eqi"GN5X.NDZBAP5 +6C*C<,oYLG?<>T9RFu<5787VoU=dI0GRE/QUuJ:+(o7EB0>ZuT".Kp;ho9n\TMAdWiSn/c:Q +BojC5`Ru(]A/C\Z"VkL1*9lXa+CR-/(2Z6qFY6WR$i/4N.%^l50">q7p+/Q84)t@MJ"UA>A]A; +aQZU$pUWCegFPQjr[4mfOCSB>/nji01U&O^;[B +%piVV=cnWF$S<`H.;or:4lljXLk!$p6Jjm`lXlFde7KqN5)'ai+^a;Tk*@q)Y3f3.VPb`TP[ +b#l/o`k1d[2cI'ujca'=ZC_#=N/.NZ3XUVH9VQ; +8WTXT$bl'^e8BAi:]A5?0R4h-Ql[carqp?!=k-$:)Pc#O&)bq'*_hhY\@ITF,)7@K=qAgJZM, +Of-]A]AHuZGRi1nTigJeX3`p^)'9A/$j\NVU3k*f=(W5#UYHJGYI/Hh[-pZ=(A&Q/XI^GaZ1); +LZo!H]AsC"KXg%W;8i^;9#OSOWO@RFl#5%ZYbU;]A)Z!ro^Nf?1;@eeu$WK1WgFJDls;nR7>6g +b63_WMdj5H=rkUQr-S..\F_a#Y"WLY1P/HMmQ:JlTDMK2X$.`ul)3TJdRG+TOeoARr+\K"oh +5%D+[a4+Q("iNk0uB-_>.:V:=qJ2P]A%jS#=h:8)+D\./G'_Wqd"KT3O\a9rG(6N&'CAc:ZGf +'+5&1nQt7Iam[>T$bZZ9Z0d1j^h3*_/Q7uHM74"OM/l_\EAj:l'BEQt4\'m%@X4Q!+a^!&iX +7Cf*9r=iXId>=(La@0E'Hi8c0:S@))d)`04.8=$GO&Zto6hcgr\d_h9>b3%K>aD5HP"ni7$J +9QEq_,[$u#s>n<,X(T$mcAS+aCZ*/cM/Fer=rra*an3Y&Q>=radi_Eg[d`k^*;\=U +5'Ah%cJGS<]A"@naI,T2Qu.=N+B75>K)$QSm"NM^BKh!YNT5."ip%u +0;-)uVmaruK(0.MJN3F\\VP05j(FhFme_[Z"jbC+]ADYbK46faaSi,r[4:gruBB+TGO2Yk'^Uilr549B29!)jEnG8@5U8)&1$I\VO6,t>`-dQb'1EEUOEJ6c#'RmVEc@ +bs+dtHU3\jaBLG",7D%1"d-oGlf+bt/k5KXCS7j\[N;%.f%nrWYs4O1pE;YQr,(&PB7'+J?;$_T$J)pe@V=%m.iujC]A!=FpaX'\m+&,$:fDQ\"2 +8;kFmnSFZZOD1/:LWJG-Wg3rRg%CiK,P.u7`hi#!l5CeWp@&K4`Ni& +5j^[A"mis^Z(&FCd/_QGbu""dD:r_BIs[W7X@[8^?-R?HRk$s*m>%`cV]Afu!Y;r0DB`%7M@#ffUoN>JrC8tZJ +57BlN)aJt?0?I4(5t+s[Vfl9%La1$T1&P(Zi0=AW)#j`AFmIHD:SVH)aCbs4c^rQ/G*6[obOeXVPQ/uH#6:T)PE]A(%4cD!GpjGG"Q@YjB#De^ob?!_r>b< +/nW03'8:K[)i)dLC5NCMeFG;]A"H;V:(+`i')G9E6YNF`0:q;2nbnLm4Nutq,A;AVP&OHpK_. +a#-$B5Te?a\'U2E\.7YqdI22SJG'U-=rA=6aeFQ3:u6GH"RfYi)*(bfrH1AM[!Q.SMSi%!;% +\piP_%B,cG-f]AG5#]A`SX3S?`,[HgD1Bo+Gag^B0-,i]A#:?gKFgI4CXRmO`kp1b3_R,N@k\^[ +eCeo?\Ph\\,Dt$1K^V5l.-t60-:r`'H`TTQ`"U2U"sqN9_M./)%O'lO@ +d'3:";L5[&FbsMcR_4\Ij@%/7ej7phB9?KC[d@ic-8iNt.,SK@YA:]A,@c>J>V%hd86U^Y3JV +?p]A?^IUTN'95a$0,d2LhqlXMcf*8oq1ND2Q':)^;.!'"RD2^-Z#S;7jFiX8IM=[3$/R3-4&" +OHCX?0]A-UomuQ<"^r/(an=.fcRY>Ege)`FEGIr_LJHQe_.-/;Fel\12]A +aU_G3er>JaEA:&s:Hmd#=+>9!ACloCX,H^W?*ek!-Df1L!+s05u[QJO>,D0!m)pQsIJQd-[q +R?Kl>i/_B"a'5%F7cLiPnEg,1qsXJ&Vm`g2c_51;QLV;3_Zr&&VE']A3ocCbP:W8@=h7ZuDU+ +UgPfBG\*+PGE,,X!_&DJ;G\1c4+Tn*3`H\+n5]AA5k8jCk!ZeCM0QHnNK- +pP8]A(=$FR/:PBDEVmi!qp253PAC4gKpeD/gI141A%))"K+*H5bQY8alN?o,6>[5YjHZ-@g_6 +^bg-"'Qt6gR/;?d;;M>+J4HTP^nDr.m +8:.(E^?,pn\E9(O+bco&,4g/ee6TYj=\)n._qF'7QRYRSP(Fe3*]A,,[PgNeaf=p8).f%*(.l +1YPAKb%2WFiDLj32jHO:)8'>'k[Hi&W0L=+`*p5,+.kC6C.27o2l;*f7'rr]Aqj@/pSomhFX# +$Wj8Zk734:H`(iF^;KT`TLB>:cPR>tYcFboH+J#G\*eZ9-,;A1:Jg&qt$sWp<>P@"Wi-ngcI +IK>l3irr'`Q#^;5OU"Imf*CCr,R@Hi[BHK0)XM0ZWc!,>saEhUWOEP]A.a9hF!c'-^<-K^Q4V +>W7Fm;U5Rq;'An(I:\Veo\cXB-%V(Eakb+&B;6YYW&nF_OBlk!$Y[09d*r-]Aj.WabNs`S.7C&/mL>+CM;silSmo +?et/;pF5!<)9:?Hr"apW5Z!5#p)U/Z6D%0f!BsaJDJT#QfkgPrlG+So=M\_H3VRfh'u&gcVn +1'd!W/n;@7H:7DW@X?XP:$>JGY-&5:R16q0ibq7:F.Yd(r93&"G9Y1!$8K&t+fK=sNf3>NHG +F$gHiCW@M8Y82*o[)Ke\E#R:d75[!re8k/;OIBNS-:mM<1^pApLTVV%Rj:4BS+62Q+gX$uKO +mlKO=&q4(0u!kgfZX"Pnns)4J*Na'g*C$Yg?`o"ep&k?4^%RN\;&-tH6[ +O_]ABEk6)3--I]AGYduN/&@$p!%8/(6Q%8#eQdh_p#F@$;Ie$[+lb'^8.H#$l6sn4.bh7VXte\ +0#=(Oou5\n]A2[T#9XQ`YUQTsq]A%lb,_bX11N#KTWLB+.-6i+UpT.t/f(G(J_O!n/'*$92VG3 +l0Z?b=m9Q&H68]A/+S6qb>@Z'@7\tX4HfLnHp0f9Ei.E7$j<=X7*H\PU&)@BV8^Ip*/I0rc>^ +pki@9gp^]AMs:@b7u8u25s30i(FOZ^UpP)VJWYEA*Vqh8rVNb^sIN^87.)3.qnqOko4V9HNm( +'T?4)f2G[>/*H%$'B.Z3X]A@o?mFeSd*-AJi7PQ_dgoAL_@9r\,0S#t"6u*;8`1q&,3_d-\]AC +uic20lrCEZ+]AW:#W$rakA*+ceJMU9NKM%=>n!>1mJWr1'^SW-)"Z:7r'*'fV9^^a4-p!#SZL +;C5Sni[,Yf\qMple8qrRKT?dq%\^3]AfN'6adt)/@A]A-M3?5-/2DZ$'DYH>th?>0$'Y.[)5[5 +XbJo+;4!eDp1IN3k7aEdJ9IFh55ZMu5\sJ.sD[rU50*9PP8d.,1.aZL6rBbOgoE +JMNRJ,r'DmrEp+`s1V;JL[V_e`$G,S$/j)a9h!'B_F8Pkm2tP)3931Hl)RIi*GeZ*."c+QI1 +7F4l"^EUdAphh8'F3BQkcXmVhUncGU^SZL!/\c4[$>&IV-VeUo3GoIp +uRjh>?g/GrBe1Jm&4I%EO8UoWsfCNONh]AEc^Y1f7U*UickOPOjN6j*fl"J7-tA&'\\unhZj1 +i49T1NZR8UlHfO%e1>YGI,lgbUK"[j&\(]A+BhbPD/*pNIA18^?Ykd5CN^h[(66UY:BWKA%UP ++>YogZJo^XdI@l.`]A:>e#Yb>k7T06A)t>(RpT.GG<`raY%jJa/gRXW@7r@C=+iiK0;hK^aGb +EGP8"-*9Kc=H5lbabW`)WYtiW!.tQsIl?"4@2;PEuP#BJ>J1m_BCSDN4pMh4=XlZj^T)ANUl +d)&+D1k`0#E5O]AKOH.uCMVrEr^ojkZ&Sdjg.I,PC>0deR0*Sb+H\3`?t_^^f]A)9npi/'giXI +sjs7=pCjFhfftS00CGoWR`?'*7r:UdMF:mB`27PDDTc[4mFn%cb3?@qEJ@Y?l?4'JBf!p'Eq +qS*pFl83[4bT]A+j>fU_o$['Y1>D^3&pBZ\7do;mM:ZGA52nRVBc +DE<]Aj\$#3+Q7/s!Hg@0iRdUQtD,-h^2g^rGGK63c\f%q+R2FcD-7FdiKeuqrh:R!!aa;B(4m +2iXaAnUVA);?LEGYojF2a[)4RDsAHiFolc07@$J%\r-C5L^H-8tVK<*^f0d+"+%0>^Qr.3iD +YW*$!Xg.Sp6Ih>6LF_+&'fc>hmqWtTqQ'/n-j2]AO>boce=4u4;SsDd"o#u]AI?]A[ +BW,#!SOZ0/?8090VHejRbJ8Z\j[%JYYM8WkQ;?0%?*#I^EIXR;)2^FlfcS0a7UD^[b/:Vo#Jj&Wu#& +:aFT[8hUo_qkRPNU.PU!6mt_peQeL@jB11/NR]AXlB$mkKG +1]AFcEYh(2oDYS*%>0oh`Y:%gW7g_]A'YZTQYfOTWAP>Dbe7kVV1Ar?:B:ZMYWJs^0C'%&Z./K +hX)A=`%45_BLHNSsWqCY5]A(b +aeXf7E)tgZ:WRAZ24bs1s+?.uQqD]Ao;@;R3MS#1QuIbb_)rkf>7<-U/&UuGF=(i`B?U_9U+f +q7LsH-G/'p.;KX,Sa8NTR@`0]AJ6Fo#+Hh&A6NDLj=3MhRul6`bBm471E5C_HPbg0m8%BM9+; +T_#M((+M'2O3%-B-$Fd06=DtnbqlsaQ?e*[,R@6h$dN]Aa(6pF_J_Xqf=VE# +W\0g^bQ4A05M:jj(gXVk,V)f>k)7/lt1]A%ZsQ'YtLDm-4,8D9$eo$\dYZMkr2VO+LRiKTT2. +1]A,&q-d.akGXlthR^^p)frGqK"F#=%(tcoqVUa^T,nGP]AphRkbY?!9H`hg@mk9^>K'$6mh>: +DFK,GqtT\;oIUrrSUSRs250Vg'-!ndL!"dnDrZP@cE&8c7<.+#"s$e^@q_OV<4OjgC;qgUjU +?qhn"s+dTc:LlX7m^W/oYT/,cUI0rI2A0^NsCIC@=2G_&eH$]AiC7m?U@@4:ShXRPdW."YTuB +WA[DoCI((f^5pHWK1?)&*XVV0F\ETF7_U^k7Hjq]A+h,t_C695kb+TARVRhUc[jop?IG#?)u^ +]A*Iu0^ZU-u?blkK1OKTNe?kVNFYWk<4i"?# +uP/]A9Pkas<%f&PM0U7sFt5lnm:4?Yb#sGc"p9!g8;-cgCW1l2*Af5#Z?^@-'"cBEJ3`NK/U[ +m0PO'?0&'S:Lbru+annRpMJc!-o]AtI(&bT7n0WNQ,23nX(#2IU9:NLF6gMIp"KXIA$$rXtW; +PkHW(kr\!/O)+gOKb]AP&*mF%/KR9fk!Wfim*r5f.L7uD[W$LG#WsW)q@[c=L(S)8`gS$;,lL +um0^J+]A_A0B(1LAiqu^+mbX5%8LVip%+WRk%;kT0crHMrBbcgk/7DiVpCY2LRHm^u+BOA,/^ +:'-J_o6ktQON$.*/__C+GOFd#daI;$p[kcR1M-" +QbD'.p:lCu&\;-Lp0R?R>;9-&$p#utY=!fOmlaMrflj3Yg_F$;,9Y7?LU7`292BG[UBoG2AQ +Hd:aAbNEp@;QiQtb@0f_fa84$CDKJb2#7R,3f.HP>9qFt^uJjT;rm5!WKSh4D@IpN^*>Z^G3 +Xbiug)7B+?;CODtkHF>?k@c;dKmGSb(2X[uD`P0euXdp`cRKn%g#_1t$-f@L,R"b.=3ut2uC6V:^Hf2FHAXeq2bpqpJ-*= +\`b.dj&'hqZ.\.oPG$":SmpnUr=3sgtE^T>e7*OMmeXXf4N1l2=`V*&-K/2B2'1V"8_7JS-\iZG5[A#b_ +#.4^(dEBr?.flDtqlO3-bnm&ZN7W'Q?'qSbo1o2r0;ZfuKR>IROnr;9uCjcs$&[_i^ie+'%0 +a:Ehp?CU`s\:dpd6[AZ;.>8W'LfUd'OY=2.rNJI-e"a;tpL5ADEZjsE&1CVRUM)rZ2HKiaoA +Lp=533=cl+$KIod_^"3C\!Ds2T9^37O1`!EZ*LFm#;u^E@nkA`F+$8;2&LFN<%h7hngTi>Zd +QUTUOYgUAbPF`@r>'X$oa]A',;+Yorth$%]AMhY3oI=^Dr/Rc$m#cG1+e[[g;YHSGW`+]A]AX3+d +nOR2+1mj(]AH[#oFk5;?%!MWd-h`+-k9HJ)RSMK24=.R`GjqGG56L*?j*//PCe&QGt$%.0;%G +"BE_s*09c]AGkWFTu>g!3QB`_N#-'eZhoBQ@r4a)VV +V>%V6bSDoFA0YXB?jVMOF)ghA +Lg,1[m/H$NSdT'5Vg!0++&1Nn$_X2Xo^)IGLht2W[gbT)qW\5YC5Jk?[I1e)7419i4*#in@? +`a2duHH/.B/8U8RuN"4Fe*se^QZ4BVc*=/G@\"R7=W:8g]AWqrr)]A!^oWfP^N9Z9Io_P1(rPC +@2HKE_S%DR=ZH`dN6U00-]Au%DIkBYD$N$X!%-=l'f3?NVDGOh;4q1tKtVYmep5aiScVpX-)e +%\Fib23&fP&0nY9-fK:13BDeVD]Ap")UbFhNuYh]AEhgZK4UXC(qk,uH?-i1Oa`0qjePH`.5=I +)?NK7%^g]AN(KUC$ir't$bH>j?!eI$2HhEkdPhdbU[;,J\b^2Sl2&`ce,[#+c=,F;#@e>DVi2 +if1bIDrq^>oqP5Vo`jrGgEIq9q(Qi':<+co)Unq^bj0R.[*V3O-\h.@epka<61*Ok9k%T!HB +004KtVPm9iNHA%gi+J@8d`oYAl.6aC\#3a(d.cO:-9"#g'"C*f4P=ra^NO.%%HXZWL +0%ACi#^]AZRp;qW;h"7/6kPg"MJ` +!)7MY:Aps6a0OV)gX2qC=2+9F(!B.\UrUl*b1_GYetK98AAVjU*%P4IHMP1 +"0)Ne+%=T/)UR$K]A?UbhJ^"HJooQ\69Eo&]Ab!e2_l>H$2D!4h@qaEd*?:poC8#&5C;F3@*!b +S"YeH=fE*6hs3P"rj(?Q>"!M6b\q8!b2'Q=Hb>*'Pm,bcQ;uK29`1Ml6'"F@X>$h3ld$KtIE +4a<>GV_W6dH_KSJBie:jH&M5&%WB;8Y/R\YkFW/ +PR9OhgjheI6AV[:32m*nTsU-DfI).3$R%K&$/2GL5)Uj,J1pct]A"4?aZ>Ysn[WZeQf[le:5L +doRN\q``FD9*N.eAt',KnOm$oQFDkZ3'N@al$PgF2'0hC'F<'lf%j>L%3\A$iT2?W'M;ZiJp +j\+G8<(i-F^\Y>Bs?QOJKmS[0)1FKBCt4CXF(7AqC9t=;I`nfD3]AEAI;NL*ooig-,)rC`p>% +.VLc80b@eNs'Tq`0erKOUepaAo0'1SGe:a)1k9CepAB^+eMjVTQJ_+bH +$C2'%aA((_K,nRanj"[HL9hKeHCGHSm.X*H,1iP14BM4*se_Kjqh4@7*l +6_jFYiF&4N`LICe8AH"GO>R/hC2B1(Ang96$-8iO/>6M'k?seUA;:k9S*.,U2&[#l.o#pW*H +6"cb)CsY89N,Vp58-8hM^M$eO:)TZ_5X[f,FK`GpM*nZR.n,,*3j$Ygmr[%;P\4uEJ`?l?,K +\.eElf\jhYoEs:NAtO-9#+&dd0kqs%Sc?6PL0nSH't=H+YWA6:+itA$@!oiFYB^9Ju,WBF/#1=fSQXhqJ98QgcB6, +X4oe1g$G&uaqCk!ST[#'\]Ap7n03mUoTsHM'J +6pTW$_B]AKq'=V\&'&Z$C.$XMJJ>qLubPcs+aj2.kDn3^=r)3sH*oU[n9.DY4`Xqn^HUQaaD' +8NR(d"m'Ji7>S[5s&^BAL_*PjZ5Y08JnC_re0in'#u`$?$T]A\dniFn'a)j^o_XokBV@4Q3A" +%k+-rNZe_0W,'G[0d/5R4)g=6&7mMomX4p`(k7`,E/eL(k_jb'7GRl\k>m/#*H0J:Fh%]AAIp +.%d7gNb]AsVh@oc>R38b&s:3N7rR/e6s;?+3l,ok2ItmNRI;!^Nu7DJQJ9!Gq +rum_l!$T-[`tkiuFK7*V-D_R[_mm6:;k&=8*U97uc`+CHFRfnW2.TYlcfPH[aTnpj-9JhW:8 +;eJes:NWMd>a2^B@fPI1V#]Ak3:0#qOTSbU=JVa)Q$TW&Vl;K*-*Z/bf4jG:.5RrkLB*8c4KX +%WMS(e5lR!Em8&oXgp4_]A6DC!]A>d]ACe*N\\rZP1!->PF3W+QmBFY\-DlUWE%Wj+2&lV1e&9T +B13.d7(c$i/+a.h2ci3h-^GOJkug9,fM(\#8N7($Q(jQ&Z(O@:IM.HIR+So.3fiPV#8(dWnU_D+LFOf.Z>82qX#!Im-!):;\4A:!(A!$obnS#Gc.'97Ah:nEIG5C7`Yp96 +$#FNkOG.R>K$e=#P30\4h;\:dTi+^HI5Thp.j6U8%mh.ApM<``K=5=e`Aa5[dM#;\q,*AtRO ++"NI>IF^e8'VP'UWOF1(Hc0dG*jO-`#W*44IRI#M&@$rP.r\u7;^]AN;!e\'VF,;aGF+F?0G^ +9-:jq8K0$h!?f4'X/g,mW(Bq5P^J@'%eG@Q[3LcN!*gf5Y3?&(EN.k!+7S:Y5aTe-hf/\=mc +L`K;ME*52YOqpJ1C^`%ghtqIM!;e^\S=TmHe:5IXlr2D;c;;='tR'drAo@TCrA"N1G97W/,3$OsM20NfLk_EBnDdsh6 +WZ!sH.0Z&nU+:#gp*GfY4T>h*3*WHC,.fE\Z'Ot'Cl2_'Nnj_C=C"MUsdAq6><,L'YbP*NbR +P"XOV=,IBM\(sP^Rc]AeW/1ELZ0&pp3nmnOmF-m%0H(dk;JXGPTj';(RC8A4@(7C3h$CgWVE:@lbq&-nfgu:/WK3K>1XUYJS7252WO`p`;ttoYu=Kf]AY +FuM@0k@`#KN[5@$,Ea-'(L";2DNT.NSO`$n-9O[f!>H"HqZ6K#IbN?f*m2h3fVHkNu;Maj]ANR133%99C9CqLX_LN!+.%?1\ZqlR_^a\EVOh)>i8c +?m,Pg,SN7pc'#XM26H9uq'm7G[#L7FB(c35gs3`mGeon'6e$nCMJ2;0r/n\5kIOn$68!r\NnE=T8X1 +9h[MD1,30mD^08dQdaq_I&hQaGo%jjEf&b`_o-,[Lh#2eg2IhJ&Vkk.m:i4W0!ZJk)qYR&94P9\\?5gCXXV]AS+p/=5Ng\.e"DgD]A +DFN`j]A8rB'Wi__l5%eQ[;)[]A2Y[.j,Y/?r-RTYA"TeQ]A8;Y@8qC&PIPppA15D\,![XYn&$)iL#8qh9r!jS$1Y\q0n]AeFeVr\8O_> +a`~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +NoHM>fsI]AqkUjl76NJXl[ +S!#?mZG^C=k@4%_3GYu$W`S1Dp*gX6cZp +)Hj!W).o&D)##OsSMK_G1FQgj$j.HTRphCd7Vqp2aJ:]ALHErq@U7QlGOI'+ZH)pS51*57nY\ +%.*-M(SC33a(LOgQ64tq\@=NAb0#1k,:b8t/JU-gIN\mrQ%$@CD_)f\pnX^o\X7]A\K$gJYn$84Zst'7086P;OP/ch2e;HdV3Hm-($ +l9Z"dV6psEs_cI@U1G`AF`V.m7eGN1B+[:QS0.i"cOZYpG4CIVS1^iFu8S'.2K=3HucXJUun +m#'FE>S3CnkR32MLd.t?\L,Im3bNeg5hppQ<&UNDahu?O.ILq'[XJ"ZNHKcZXLNd-eK_9rpo +dGdVd4-0is!RGA`Of9I]A_OW%E4b!Oc4Ll8?`E*f-P2e\Fi4.44$>l07G,rN3"Ela@$VKdDl. +IOFK[LaBIl1%2DhB8!bU%96/NA$RfJ-DK_rDFNB2:Z>&C#!37\>f@!+EMYMO,9,3I".*4ShU +P4ah6Ui,FWs]AqinXFSopEb2>.r$*ZKI&bL6bYF`du8uK$IQ$`sYS`aVhS"2:+(]A;;E-FK[oA +P]A.3LW^>`#?dPDUcMMTusj1TcsKp[8hTfqgaY[7afj85G*Q`@`/,P!2k4WMaWOCpj"'1$*M: +SV1hHMh3`DH8Q31Yd4[,H#.5+0B,91HegI0:%0?J[g_l/),TWLid?703(F7m6#aQ+)[D0Ef[ +O0383EH)kO`j(Xfkjh&s<'`P,H-8G,KFKse*3"ad@u;HS3?*Y0k_T9LtGSmf;cEDoe/X7"4J +"jn*>E7"a4U]A%W>"Qr"G`V$2,VNSbTm6+0RV>Yak('ne%bdKALXf)R&5!I>V?;c^0]AJ@P%&Pe9$4;= +\.k;2eaSp.I#:+g0/,P+W+,_r-/hqG]A*BAc^s&2:tF)&%8IY=Y3DgnZ[PiBP%N&`Pj>N!qD]A +(%2dV%dFtB'1Z)qc,F1C&L&=Xp`S^i@Shs+3gO+-;G&"hdue2Q8J@\?pf'B1j@!oA>fW-<_L +2O;,ilA)Iu#52/4?@.5OR.h?'[PNZYC]A&)a.3H6++Kt%l6fru_V6"Jd*r>]ARaG@>"K4:>R5I +Xks%u0GU?a<0#CZ.qg$q+WE,p;=G)OFD@e'8EBnpdRJH<\khBD\a,=9D+F +5("ahl+Q#qDkL._G@]AcR^.k=Q5>=_C[,=hE1*6Aah;+]AnRV3>`@*'=)t^QFLC+f)Cu<+7[oi +kF$BK$ErZ_ee2`g,!47BTHBbj)L`>mLltd=o,7.QZ#EBDf&8L, +M^;#83.tIE9N1aMl_KLRC)R:CZIA?Dq['b54YVZu(\m8MUC6@6s55U-hA$:-+a(E +f":*nldXR/f^f@d,8Am2-nF(_*,QCfh'$a4JEI\@"HOL>]AulmScU;3O3=>E:Ze\n:*]AUh@\h +33M-+Og()CS0>b"H*"*(I'6J[+O]A[Y7*TDVu@8pJ_\_Lc@NKZqJU;CF9*.4%\b[mKVe[Z#Zs +]AN5TTg0Ns%et#`2h+gm&\tDiL&b0e_QH="?iO[Y`Rp#abs)On[me)-8g-3%sLV#5:/k8crS3 +-ST8`Ug3&tI;:]A@`(k;q;[,E'@=Jgf2dq\cX>(/V#LP:7kp5+Ac9H>;cM3-<+3'N/T;FiLO/ +H^AZr6kA:L>LV3^E6=X*8Dl\XtS,@hTjdC6To%uF`K7"3acg\$sUCZ.\NRi8l?Y +EV!T.]At6+[KXFoVC4`n$O^h'3O3u!?pJ4orE#88-FluM#W=HDX&&H(i&`GKtH3kR7K +Z@(:krjp7H7."+QM;C&qlTpY7V?a!Qj5cJ6#AJrg,*[)ork^b.9f+-:_)(p/M`dP6Rjk^qh\ +Vn#)k=40QL$g\K!MDJHR[88:U*j)5XoR$6Qnd&[9j)W*n1*Q)JVs4/N%W,Df +"/CDO"WCWeL&OZ!d]A2-`S)*-Kl/8S*pV#I_WUP(4FKq@T#7d]A9_)30&ZQEpuh^OAYGO@-6%t +5Eg^FFuYBTTg#Rqn+]A^!aIkCb]AX4frr@6\CAIE)uC#Nqp +IL#?l@?9$4p/e"]ASHn/cLA20^6aW.Di,8Y_\F;*$a.X#0O.*uI]Ai-ZL4Z6^t*G +190?]A^X)rBckS-CDpJJgcO;*rCii]A>%6FFe^?[;Cjr\D,5%Gf0Q,TBZ1NnU +C=R@,CS)t-PB7dl7fb9DoI6Q2]AdNe)!g!7gq5ac+9mNA#sd?0f)%_+7m=N!Ws'fK,n@_;Gd: +%bIqOSsR>`V-mMCo[1r3DaR)_1Ah*$b/ZLr6k^:rT;V3Q +W6bmr6E^>JiN`E4j-V\Oh5MrWK-,hG*47$-3H6V[5ne,g.O!L*6Epe,bHoqYLalm#i1Q5NLd +o&p'i9DdDck..&%8/BlQ9URVa.-$8#Bar2s2"Quio3LZL&hh1'>8!hdo,q)A(KheBN.5uggm\L95L&9R0pb&L1ck25eE +#j3"-g57Ff/5un8o)]A4Y@EJi[YbVmn;VlZlp>[7SJ$-0)It6CM0d)TXL$IXqtt1<5Y26p%5k72,_/NRThEGO#B*OTe_+L]AriFJJ6^rJ'98(?qX$Yi#6;t +*7h!\X)^o=:KqZjedh3uI]AWI=PtH3FRHG8@WiI*Gc>li=]A.">9*S7Ou8"d-.=4EA +A4[MR$7'o'KOB3Y/F0sc*sT>"tFFZ&lJA0MS&>DS[.\_VjQeJ-"^MWJPJ2Lp!3f.(9kE"[k' +Fa\npGVLg+=4RX0%Sh3DEcWIs22c*UYDUBG,+6bk/-`k +)Qk.0?oa&<,D(E/rQlk>VI_X#CZh?Gb`f0HoON*NHZ"S0U4XUta=EGp[-]AoNjeiNh,u^+!#p+n2Qql&ZoQHpf0N\Jh.d`T +"R#H&FgV8id0UtiSD^Z.9c+eeC!,&_b)r.C,OOc,P<+ETG+'/m5st`3Qu%sN^+ZT`dnrJX35COQpc?:^]Ac/m5lQ0>@LBTZM@tsSW5N']AUk]A9[74i'3S<0fHFlEa*R +(iK6Eh8D5+D%8eJ,<7Q4557NId"25te^UR^ai>m>+D:o2^-U(Yq50`.<8$i6rDn6N +`^\n,E]AU^?)!\M9H^(ohWNkqIFD5ne[%nNX`*Ie-OTAY3_$q&4$=4A=GmdA[Z,a[??s(K+g, +iT@bnON]ALcH$!eR8lm]A%)ES0Sn'hB>+]Ab(s)O2bcFStDqEk?p_a"7u+jO0+k* +/e@W#^rDA>-fm$H=Q\d^4%G[ub,UhJNpf3u-ARhu9g/IBrV\XhuN)8aOAnAZM#Gc[GCAD,($ +As":(aMf741+N)AtfZ9o'4&6Q?:bgjODd]A?Lg1b@KbRg,5qn#"l+s0r*,LP@)!EtiApq:b%j +f+(gOZ2WlXIl0g,+$,Yhf*p^PZm9s1RB#,6eIkVW:I!ETN4S)<*G8 +!tk;8m1/:QQXr^3p\BskmdfRr8DSrEk'oAp2#Q#llER8QqUW4;X!G,6E31d&9SD,oBj$i]AQ! +bh+6,:WMV$(CG+Mmds48m8cH>I`#CI9VOa9q_FMc@7(]AZiufd1qo.mYNgL.-kH)U0WL0Y^*- +Aaa48d_ZL.i93rapA6IZh'*$d*d7gM&"B?0MO;gh$2f3%f=8FNU8oY-q^kYPn6Q^d>KsI4+\ +N*\Ge6aA#:J#YTkeV.SlAk,seX>qp6]A0L(?\BA?$PF:\\I4W[9'L?)d;clT"fm^^Q8f:Z94C +H\Z!4*Jp3k_UI6?-r'j-/>*aQ`pR-h:A"?p>/+'B($&;ZBSnJVr?,]AIL+ATYT*i'DE,._"r$ +/]AW5H#DkL(8#,.J"QKU5JuKI>F\(- +"$P^^C%#DI-2242,]Aa3$';h8GgWOlOXb5LqeBu@8VGraVU5>l+]AQ"I/H?X2oBDj1I&Mn^LG4(s`h8YX4/[Eh^:K97Mb%g`P6SV`R%O:4 +<_*,nVJR]Agk5!9W=BRrV]Ac4^bpY4i"LL+r7!\\8oC.X5D:u[Bo>L +B__dW^a@lWkmo[f3o_2O@RMeP/'dR+lO*+;]AjhZX:*a3X ++!^Qh7&t-1L96^0caX5lP-s=!3SE)6AUjT!"JWtDln8nXS;q'_P1u-*gPjqFh%3)?nnuN>96 +Z^&&]A2UDai!E,&)hkO!Fm*?jsLd59I-DKI@2Lh.2`J8egdb6:]A*celt6!E0o9+KhNdQ[9@ZS +d0J`T=H.llY)8\f/Z191Y_H\Nq+P,Q(aL3M023*_uoTJ]AF3,kk]A]AjIA*7<9g5V6?8e%9YkWO:X.3B2Z>>C1`Ee4d`_r2[M!a +*U'!fBA"MACcs_SX0h9.r2Ds(/hP=^>=h@rK,>lKXS0JUrB/rVc[i]A\OAQ^tWdIq4@9>WOR) +anmk]AlSQr3M"k@pIgm'sjL35(t]ATJ?ST(Ra%n;uDLc0a>TQ#(.8rg@AH'fJ6`XLZ9rp=te\c +;<(Cmt8VtSC7WYWJ'.\P7?j.=p/KZptopS+r#N(f<*G)%k>kbK.a7&\@OpF5!_KNIm#2N8^Lb#`\S7=\+:Ft5E(,e!VfnRXns+$&,"[f,k,L#>7/_!V>3b0=Vd?9`WI9:*MPc7pC?&4^70_I<&'b-soJo`Ok"3'kVsl@NVW+G,MC%_! +'guMV*Jd4%0;S)k3>r=*rIO/LK$Q9b0!1<,,fbi?,8Hd%5XT\ltQ^1P2$K4a;=D!&pF[ceE" +",Q\)Ujd@MI.l5AY,m2NV@5C,4IhPKA]A_a3?@;Fcin6J^q@%[jj;Q=LuC$Ar03B?'pZK()>5 +I\OTQPG;FVMhXb#OIPMUgB<>+dn:OED:cFDM1Bf\8!e$AS(R%-mc[.VEEuK=R"o"nFjeJpI_ +eCQDR$Wd`.,jc8:\ObXh5q58/9!4n5ppBAa_--(Lm1]A\J)9^Gd#5"dA@uXP\pF=6MTG22j5l +3dDRQ\=B(qE=g5+7a[pj>;I2;Q:6,q^Gk*2j%Hl*+Ti_Tbi`e7gZ@Mk\/[`mPT0,h3,64OeY +gR,T-TWom2R.Q;Yo-=Yu&nA8kL]A?YLdM5Tk<+W#YQZ5K;WCChp8CNpXt4tIYdls$DFj5Oeqb +7*"@,Y58?`uPCcu9:9, +->nDb4p>C=bg^KG@_"!JH^"jBM._.?]A,MNQ$*!F6j>F)<)$*S#eO9"V\ek+:=QK@k88P4Z0W%J*RoFO?PRips%YTSS[r"H6kRn2\ +MCkin,t?.ETYR^.)E*gXurE1.:j-/K"lQ%L.k8QD)#Ok?%Q)Z`L70B`q&)]A&-#+7t+?$U(QL +2dkDn03goAART"UYd"Jmp:SpKP +0%AS(`9j4DJj+;f9pg!W=H%dGiU!)f&V9nGeK7%8@5T.153pfL4k60c*C'?:G4_r\De`Y6H@Ea`]A +W+n79,9o1lmBLVQ9BQ[ArlA+GF/TPf64GE[`qSD#@bOccJmUlgG.,\7d1c[!oRR]A_b>tg)"1 +U90bX(@(#K`@40PZfuo5AD^^(&!bKCVTG#+SE?G)Gg58+:`9+0/eu)Hp>&L#U^b"C!$o7LX# +AceE\k2Vn0WE'e>2[eBFI.ZYOI!GL&/\B9,Bdq-:.[e`(QP6EY2:QXtfPWiN#"0%t1$%JQ^[_DENmK"3RE/$TiqG#n77D%R]Aq!rsK:HeQSP#ALh)2UJ[3E8VfuB;_qP@0_ +)%Tg;m23EKI)KVPc#57rW:N[d2)c39W#i[dABfcpb^(uH1ZAE+++\hK-!A"U>n'%:$@>EEM> +s3!r1c554*02LYI2o[C6PlkXjij3_a[GIQ.J_2XI[;a?NO6a^ +Skc4@"pYC"+cb.rQ6AS"s**Sm@bI^!j2c>9Ai>[!1P2rujR;>)2V"4%SXm/^l,.jo!hJH+=c +XC!4"W?u?g0"28Mdc)dj9dLis7r-*,9`l85\B)D;p1_;I.CeNWglS9F/g!(ZVF@g&r%L +`hf^7*o&YI:&!Q:]A@.@$M8/aSgSd1604)Yth/NNjK>$_^l+D^Upr/_7%O8OuUM5.n99)85`* +<[:(O`[MnW_ArV5%A`6=l1]Af4-fKaTR0JPg@3SnILg!*NROWK"bnZnZt;GO^L4(=A_YHa[$W +kQu5_Juk5q"7u30M1lmZP$8BgKdY)bBS]AXigP(C +f:O(08P40kp$c`#KBc$Fr$4NJ!-^gd2_#Q!.P:@Zf%6dq@-E=XCNb.#[Bte",bOaSZ*5fr.rP5M@-,)c]A\g_P]AG@D[`/jPGI!O +PWG_!#DJm=Q059*^[C'Yg,$>Wd#%h7Ni#1ZHDGke\4DWgZ^j/2"kJ%M6AL8C=CM\JC6N$po) +h3upP#OSdp@VO?o6QHj#i5Xt5g$d`UNMFmrr+Dm:JXc]AOVHZs]AX-F^[QO*)J`;A,S#UNPGYf +oA.3Y+"fdOQ?ZR0pZ71U\pJL_.t^n&8;j^^C'auPS`@b94s-CkW<#mhJ=J8#]A/XS'6rGi(7j +*+s"![YbMR'#gc:okI\b]A\8LJG"\q>6]A_:Ml/el6X+Je:mW#S'Ci$S/lkR2YJM#F&eWit0(P +%Z&+@H-fUKbP)RVbl'_ep\o51PFYX[#mp-qTFOgJ924 +Mg-"G +<:-A(0J%#D0$0r[qoAZ[VI!%_)FO:`HOL)$H1s.i*a#4h*?2CA9O\piP?-r;8Zgf;k+tirR` +G#mgp.DslBp1I^Kr,GOSj>lOr,"Bt>l1(?]A6O6>Q`!as(O0PU!K4YJLf`bGqRk2Oa$CN=jC9 +`lM7+WAa[H@ZqG@^U1W8ckfcJ=RNL]A,>4]AL4uhT%4\elbd?2ui>4b9WI.L^"@B6F+u-nRV_> +LQp6ph"!-^6Cs7u8!JrmN@kR4pnOia=i;h.PY;C7a9_p$/-'18U1As&50911EK>r7+*!LcG>_$bsAkA%C.!6T[,Qp70*uPG^2b'<'4BK+UZfs)mnpeNnpSOgbZ4WN4K!bD%?Af?#J#bN$#>!H+bT*1"GM-#WAnKkLbaJ6T;\s&8SLmEFV +C("E4P/A`s`*a*3Vj(9chUU@[hsqK8u#/Gjps..d&%5TIuhlc?kZ%I#/aW0a2McN3Do$TKQ& +#dkPeP`cN$U9kR7bLYT]A%e%_6N#5\@da]AKNW$ToNP)@h+4B!t8LC!@`B%dj&>u371"`JqY0g +B!Al"m1fI99<=1:LE4*"W5iE^'QTZS=Htj\)AsBOt]A6Pn,9B)7%6Eb7.qTA=<("92eaqT`?k +91`@8NhD6Ju!>D2$LAtB[S211&)e2$nhf8mE?\T63bQ()c=Z&gWeu\?6r&5Kdh0ZOM>4r10,J=n#>i[ULj +p/oW?!@Tr3%FP"/lqf1jLUMtrLBA?R?N?J'!r%@t,X-k-WdrH1?#9-,J,f/!Yct>o0cT?6Ga +67@W-]AC(5CW`H(UUN5Ve=pD1VsJ,1fRIFjXKoWeg9*p-6miDeR4.S$>h:nG[U2F@l_Jd.[db +=q[<)HA6mdd5+@q@'"_t?Looemm6DP>1q8gkJQ^U'E6C^jgl5fgr!Hh]AV^ +nj,3b9FoWEdt:2YIAtC8Ug?5Z!XHqNITu,cL +*lMK!@.KOn:RC>[P0L1c-Oam-X19n@%'A +o("?uR9p5L!P+Ed'VC:,$kVU`Y.OQ":nS)\Pgq>AY.[2k]AT"`7H1P5Y-ZmF\ih=tna5_,f\@ +Ztk(((>FS]A(F/bIlR1lGA'K&'C"^/:+0r`DW0 +2i0$N5DDtm?3Zsa1Rk5PI%`'r +#-JHi<>$#rq0YR2McC)bS&%g(-\!-ll_1UNs2'c.MMLrbKgTXZ\GCr4njJ^m%Hn93Qt2c"hM +[LVh\]A^:QdLL20MQW>d?H?bKgHD_4^g_q<>R.,;[R/%R1,(TrDc$uXi?jSQ=Ar2g,*h]A.'b# +LUCW,rtLiW63g#95+jj=pQKl;M'QldK^nmdBLSE[[[lh>e,?dlo`N*;FGtUDbEp?B4JMW$oa +1"!QYa(]A_-<2/VaWPh1hg7Rot!h27Ei]Aq:0LFN@jjHQ=q\-8tEN`ldBY66OR\VN_@Zrf0bX0 +HfcPVl*3O!$=4BbA"9k421q/8:iCeh8F[FJ%%&FUh#hW)5+r]A'7qrq"UNJ`@R`gV!YH^Np"o +W'Cod$L\fn01KmSis9_6M>"/m7_E4SZcOO7SJ+T@Z+ORILQqFX*6_1neG3_JOF1"h/BRCN>P +L`$W5*+uU"=Z52;dqWW4,'gpuUdPc8.aq>TiL9F-6?:6VWqQ)M*QhV$oE.0UepH9:U-]A>rOc +bc?opS4s&;XQ`"n:IT93qY)dA`]A*,0'P6?*;Q!Hp[^?q$7U(D!?rE+P]AG*sm[C]A?I]AVVfRQmTV9JAOJW2 +c/$&u!Tk8moC%"l3O@]ALNmMXA$I&:Rj8!j;G%VDn4(pjJCb?t7ZVc^3XWYdAUqA\AS +#FQ6"HKnDjc)PDgiG#QQF7.(Q"CMa%/A3]Aa[e/J3^q>?YYdkNR70M\/+$hOXD3B?[@[>$AM(5'?Qc+d)/Oo+l`,1r==Sa$;l*h'gRFSAA%\.F\b1 +3638=PT0Dt-&T7gDH^GV*e"6WsI?^+04RBg"s+L&q^[X^ig71\/:B/+&?>(7_9Eo-/f,hucY ++Aft%k@Gldd/mhep00!8M)=p?0Z.nKo3uG?;K^lYr/8FX5^6FJ'DFXL@i#p,2RXuMU!^rEIl +bRr*>A4\:J^T464ZGFr!:4`HBh;R71E(1uUIV7i1.lTt'6+\4^B7=eUCk$C#%2ZU`FJ5#rBr +1>h_Dmmo` +>#_sK)@f2IYe>Xf5n54%i4J5U/!ohL"PIGa_2&Y[&%T=tUqjo95]ACB6#Un>E'Mq"\!S;XeWG +-Y@A='t?a\T\MtI5SOa]AX:_Jd)&_pQmSJJYi)d!\kJ4'-Jiuqd`agjmd?`!qRV-6\6P7e*Vdmnf]AF-*[%V7T;hq1TSYts*5rV[LuAdni$o +``]AQ\sW>l\iTXNAaG;:=%H2G?gmqYLC.Xbs(/0Y`#2Z=$QQ#-asns+`]A9rorP.DGrdA[LDhC +KZ4ncg#RPZg);(jcch",GfZU;&4#G)&lSM9]Aa[Ji)[KP[F5j->(:S`'Z%>UiSa&[=^dRtIZD +Ej9#DA0\+96Yn7od[/X9&>s!+_Wdm3(J*kGg)koO*c3?0\nuOGIO.^n>Vr+,_ohm7O5[c +f^X,Vkt/*7UL\gJ4n<5s2`J4,JKY"alSgekMus>o-XggQ=fAb^p/'n\7nH:O!ME.6H'g(&bp +3jE(M7;!\FN6\M&"SQ=_hk@?c81mN[V*P2O2s/e.@TQ$[3l(G_"#Je"A)8WUSXHQ9GCUJ[8M +GFUDuX47:^qh:s#sR%i0m.iYcWgUNB +'O>%am#%=<6H&olK?AO_1Wg&^oo5%a*7)1imk(8aoAq`Re3HHJ"B,=u87_p;EjJ@sNqk7h4u +"Q1C8n(HFJhnt_%gq(.I'LDt1?j%]A^XBjhl9Jj_Y%)l#!EhbP-[^`NfN2iGQ1O)=(UaUfH*P1VV9$B`WYHkD8Y/B!?14?YaU;h]A<=!L5!2pF)]AnR:=s-&h#cj[eJ+V,[luf4 +aVP+IUne4q]A<[7n9S3o*nRpqU=*-e!cT=XKs%=a?#7`^nN1N)#!p( +`]A)/r<fR'5^s`]ApWmQq@54urh[t#_7=s=j6A.=n\kP'$Jt&U*]A0q[0$`Gujb6e6IKa6M6& +UYWpjc=Re[?_QD,#/b$hW2_\%7U?;6p#5PAk@;_E*$k*Q"p]A/;od:KBPED#^eqOfM-km[smP?Iuq +2q@MSC@fu7UaO$U]A7b+9?@Dg#5_++Wl%!"nOmU]AhhlMlpP-aKJ\-erqPh+B+*8$T(!o'?Nh4 +8r[1c@2_lPV!j^G\72)OoE5AbgPPG_oT9=Sp"5L]AOQ:1MEFCjYisBF+8tD*knB&*):Q.c-<) +7KjV3R4#\>dnAf!$2?GT(4JdSa/Gl!HZ[eVuTohF$8r-I)?&RA7=qk?JEmJhEo9D,E3Y!gAp +F7#?Y"glfW'rk>W/fs+Hf$meE(q,YO>EJ!YNcE18qb[oA=o^#qDQ+p[>@4'_ssc,W"gQXELM +cA.-4`;/cP1:Mo%)tY8&fj]A1LIib="6/Jt,\%(P,q/CMW@sdataLI2j-V6F6g$A5Uh%JiXMU +`gH`@?nM>NR=0ikBT5jP[E_s=W*Z$#&HG-pQ/l)&cqld.-kP)k7:=VIdE@dtpPkl2M8[PdIJ +o.g\*E9ph%=9*Eb`#Y44ld4E"_U%ecd(C*rK?n%N"'/KR4sqY)5BEr;lQ&G%:S]A^@tdr$;ZP +8LhN!;!6HG!fcrm^rjK3*cjF`:P9eX^^cs4p/\:G=YlV,e;IeS`6Np?9s4KIi4^FtU_Xht3m +RhDQ,]A9ZRP!i:qhJouE[2HF+,_5[(J=ukRCU@B22h3#gV-Lf,cBAFg^V?MT1JF6'P)\$B!'( +Yi:%j=Wf5'SGJ)%>m(>b(L[:X_jU_=rGGd"TefhH:9Kho3m3JG3u5`bYeEZpo0&gJ*0P$^5* +&s/d02]AX0>79M5U;)(=/q]ABG:-iV=(o0-f(TgnZk?S)*1m(]A[nk7eV(qN,VIPF.,jfi5W&q.-F.8HL@VS#Q9#F,5^EU3 +JSaD?3HRPi6P5_;d$q/I#/XLXnJFu,]ALbC\\^2X+$<,1)FEPE->gT&-!3A.4\U:8MJ/Tgp$ku:cY=#+U=WGdcK36apJ_U(i9:s<[C#M.L +C1+[*Ed\kn'Y8I= +284pH7&s>1*/p.*L@cu)V/[:ul'IJ9=kA"F6OmKOr4uPH*.81Ef3QpdK=aCR`d\k[Vs6daZc7^W4Ha43:[@=E[#R+d`;=a7G]AZPcH@$WR91pd +Hs7@=dAu!:hjmN'[+r82U3Z\bc88;_Q:8CKZ,"OuB\`Q[3F8-8c(pXqZY1%$[i"l543PW?A`O#XfWW>A+sY3de,FZaM!/Y@=GG"g2fIKd*`VLM]A +5Qb&W'fEqW@oqK[h\Zk.Fi39d( +c33YO(=5^+>9tSlVPpjfXV:/fFK:(.b.o@u_eAda,'2DIL9C@9'*=sEmJ*Ac?;"i?7'!4hdi +rGZmH8:F+npo(\hG8phIjWM]A7+:C*QGP/+:b58\5pH*DaS1YJ*pg%^I@l1MkMV.o2Sg40t>\ +]A&."bsR]A7Yg'e]APZ\e8nt#'r;&N +T%o4O*8$60Y?4O\f[rcPTQX*WpSUF1C_GulWKPW8ceri:*_m5h%CnUo;p)>#Uu(A$[;R#Q/s +6:IV;=jZ?n#Nlb2V#"HE-@ds!('Q#TC`g+B*!d@f&e-M$)qj--7!Ot.7We.f.)4PoI^'h5VB +_tn.V@'m&Z[qZZJtrk7=!HX'mo)BWLb,!75_J-MgG91QK&"s#lqE#o.2na)Xr0k74pBP$BD@ +>9"S8T1PbI<&?J^qf6g\5]AC,0(Fts02B`Qp/(In"+$R1"%8d*N>pc%M_Os;ngdeTubD]A[)2B +h]Am!OGaW,K:(VX\4DOXCoLQ?rbdP_gnN?D`/$LL+X#Ta7ddEc>s?us^I^mfP&/aQm!Q[ao.:VZZ7N+[$O2!tm,(6-i,slq7M`rl;b +7;adkOuMOuK$5(u=Q4`V!p[I;S'(#!c[DrTo@b+OE^DkI5)COHbgsCme$1c'^0(WFq2+55?r +![sAj38P)MA8sGOsJ/DC-G3"IQ5Y%+^%Y>RJ$&GY)muce+Bkn4!d.#WJs1">oLoTq=IXMY=; +<t! +!MC4GB9FXG4Am=sIM(4F?^n+/_Z&U_W6@M(T=U7Uon?&9-KB:j0Z'B&FUH)>=oW2&Yfgtf@c +>SJY3!@OmuP,@=@^WCcR1#+h/?+_8eChKk`Y$-Y69MoEW5-mPb62n?<9MA+lM;*NN]Ae)*fGp +/EEGoGOrI+lL*mtJ[:6SuW(3kB+]ARcTrAa+8P8cJ9]Ao`kE]Ae]AhQ\*0e!eLIQgn-:7%4a0S,o +kZ(%'qo5ik]AQ(3Y&&'[uAH0H\ccFXHPBJ,/M>6#1/ZFls[#Da$ChRCTj0@_]A6%=JquZR +c;TTp>HA''Na#ImDPEGf57N>5)Z$e]A;arDr,EQsplhgZ&<^J^>@17*:O?Qnq#Cu<5JG]A!_"G +%#fS*(h(01i$20NTdWlFP:.bb_c_gl)M?aI#j-!9t]AUf]A**3m0"JS(+p37pZ["*RVo:n`lM99a[]A[BNNp44UImGiBJ:nEIe9GOJbf/)ICC`B)gonC9XkIMs92?S\_4`dQ)ss660S?O?]A'ioA?9jY':8D`'DM2Kad_=V;6RNF> +:6SPntp#in&,*01j*Tj]AYqDNr&cf(YG8N0J"6//Z2e$?UF_FQZs8XhPW1foPYgE79d>XStK=E1Q&F[gBQgiM1E5[5\"FK%[C4r$%4g=/B]ALq8pL8=F2& +SmQF&#lbVM=JEFItJ`Ubf,pBJuoK4Ra/,2VVrt\fns3781Qd*U[MHAR/Lmofnp:d(9;CA48UEF$06=ju`+ +pDTP6Qo$ln(-,FM#?,[/Z0SU;ESj5r^C4m-7YiD +/=$iDu>XNDW@6'?Mu(ie+0F[Yg.CMrTUEn8eF\(c[Jk[1?Qq]AD`)ch*ZL5(#X1!'S32son2- +-TORQDFNZDspHYQI26'Ws/_Te:ndg$=I +-u5AuItVJc81.c[i1dZXjQ6$&.FgFm,qR4cb7+]AuQ9K^i2YN=;27J,rI%rodWK!2?H^S"lO2 +\nEb#q(Y_ds9m1=VtRY3VA+d(Bk;&q@ePm +Cg`>UbSW:7K>uY#Z3SL=7(2N\BS'V,k7s6hXe[XY`oqIT/PFT(q3o +CoG>M!LA,=l'$>02/b,XuDfTi!o44FSGcFII=C]A:-Vud'[.+1"cHf?7C]AI+g_d-r!Xj6E;f" +]A0E?`u:0Jj>[=DTCR'+GiV-!P5ure,4iUCJ+jQPYPS[YC)dW!9l4K1eJtl/6V:OrX#;:^8&@ +47,a,!f6\;N@c@NQI7MDIi;W86`M[&1M*OJs2;qi^NVXddp&Xa0hEJ[DJVRU2t\ha$*5$P#> +#t/R<*DBkuuC[,\Z9@7"8DUlV?>RW(E1t^N5V0?BD2IS)P*rf8/$^eTe'kKuZmZl:O[C]AmS9PbuHW\V=[jI5%:\.b^STmd]AH +4s]AZ+@d]ApeN5!Is;$R,tdBk_r8"Al=>e_<0Lt(n)f0/j>NJo>Q_*:I4*g7"C6Ljq/$7847UZ +LB/6Q,'1jqBjb\Qn.>CL+)8a;KSi9+YPW+7@qWYu_B.nqK6?aa;mG#"!36ee5gp^[QDp8*B# +VQrhJ%.t3-5b.3/.hDRWrE0*>Y4CSHj;,L1CZV_',Lc.W!eQC*uOfEM32k/A`22^-+j2TuUZ$uM"@+Ks<;>%X\:F.c?<@D#Sf+nL?8P[>BI6]A&bIo`tk1TUat0 +S$;^:<38Z?mJWIS;::$9_k(KV[oj7+\ntWjf2NsVB)hQCcOV[PYGVkZlnLm!cgK"%k1ubr;Y +dci&7Oqn,L<2?c9COE;IVXY2pL'%A/`J4e0k1sS1^a^+(M4s1F.Q.L@Z_I"5B!Y!mlm@-6S' +=5(u^l,2.B-kjLX!YN*l@;nA3ClE,;r.us!p<*J#4:uHW/ +`$@D:AFKboen2W:ma/ZbQ1UJn41?od^TBd7je4f&]AD&g)UW/0rO53%'4_&F+kORi;b++;@a, +PU=[6"-[JK^$rXSqcID/eTH/X_uEn0%=A#lO>M7n`4o.]A^=HFp`6>&2:1dlT>"L766O"L!;e +!]AYhL0&I*29*rN&a7+2e[ooI)RM$$u>l/b3m\;6-H0LCD16e<[n +eOp*.B\TS*HeW-;8BBh1l-38_OiR`>#ekI2V>Fs(gu$+/8%lrhU>T"9iM(P#ah5>#5d+PZkX +aC<7bJ6kGFi$"4.&?94lT)JNgachAN+pUAt*@cj2Kcchn@B=>R$CJ!mq?U)7C> +l897fn1i18]Ao(qT`K=I34tdE)p`;p+)L,>TgW:2iOd92PbKi$=]AtYc`=-Dn>1)2RmqV0*6M% +FZJ7Btu$kg$4T"TC7aDNV1?S[gd&9jdt%lE#$%sBAOKN2$8H]A-LfDC?$)mAYi\Lcn@!,c(+q +C/;S#^O;4."$"+5fTgB#[_fL5+`M^KadAnNIBe?LP:O3->SJ\DT`@+:+eSuA^AOBHl7cMHe$ +3k,b$\`.C5iZN"K3]Ap$s\e*8&QW-\[f809*$tQQ3,=^2'g;aM=4sF/[A5Z%2JhiDOP?)^gAG +Vr\9u/Km5@hp>sH3Xmr7&B^b +sH*KA=ic_j@Z[2-%eZ;?5I^*t6:G!CGU1DSKgd=HZuN'9An('?Kl#b/h;a+:QhM0W;@EKi3< +dHE_t`>D77T6c=r;"D:A$dH7&Vo3sXJL1QcHICZYkP:ip[.<%j!J+"C2;RJ;@T +%_eub/=!7PT56\I?3$"1J4gg6GSST,a(4j^(B"TV*"?V+[D-SA3r208Gnj6UO5LF#Fj!._:Y +C@R3I@k^Q:W.?X)EGo]AEP^U>(eBnF"g1GZOeTD_F50m9"lb;!&HP`G<`IGjY:R#uooP8XL]AD +"bp:8^392`H7QU\1HCs,/qoDu_"W>OUeHo#'fM>ScE#EdGpn8Z6pR>lX^sFi71@5ti*7q[r4QPYM#4KNC%JQ<-5\io[aHhTkQcXd +7PQ-$%,BD9:F_5CHe-6P!u:VDN*97Eaq1`'\U9=RhrQ*I/\ +ISf>:7cd-6%X-WG/T0I6I8uOMi2b, +4u1h-(Q7+rV@<*'qk/o$e*nn6t!GD;W*XO/tm/l,.Fq.9HmHFZ/Gs\9m69JaVI5\tWHucXkGJrG"pZNYQ4B>)Eg1M]AdO#)W3Z:LGd,Wak-b1!cU-VFIqW=[ +uXoK5RWh;&":\:hfWf7I9b\q0HA[^=W[-CM0:QG)4tL0Sep(SeA@1fE7:BjcT<'[=, +>537g(6SDM5JeH9U#S?m$@`Te^r[6,H@c:B0S17E'^n#J@V_q^mcb]A=Ld#K^70XSW>uXaBgY +r3M;?_-jT1S:0G%0pie:ng$N67$8c4-u847aG&D/*NPdiP(e[-5j*TZ@BUm0R%/R2>qP"W"L +'4?t(0UYOtY6$S53n1=b,@H6Tr5L#Q%LQ+eEqFRj*5l>SIQjqd=""ER?[@]AH>(:TmpSFS6KR +H?Zi8pSutPBFMHXg-$``;^?dUp0YZfMh#LB.o8P^pt5d=)4PE4j_?df5*,W$8u,HK;E74o@I +m09GsbU4_Y3IBIeGf'Rl(UUJAfJ3LEKT5Z#QSS=I,$:(e3XIam30SJ15mMK5KHjlnu!r@CR( +^a16>a)''a#E7E,cLp$7_I5OrU9rl=p@`\OE"XJtfT$Yf"p:eN3F9LN0:mlVT,R=WpO)Nd/i +^*@^N`=9_r(1d-g!H>6FMY?c)dqF6fYM3>MN>p/p83 +.,Z]AI.;WE=7pjaCbK+p@tSQ$QD!YrS8r/+r]A4386T457HO^B/a$- +=,TibmWN5*q\qPZJ?*=2*.N6>'d#gdM9T+,.i(E`\5ro?'sY:K$C[&.>G^D`iDf;Vo1K$%GH +E*C,U()*HjeM^gU(b%#7>T%jM)%D%Z8mO)QSCn,5aLg;Zo"TWR(=RahAXT5;;??V:`ND1%b_ +4R-F%t5u$;Z$#*Sar5jQh3X&IE_3Gr`!qSCQE3AN/eI84q[#J]AfBYWcEJZ**N@):Y?W6JL +!r,nF\N5`i*L@fZF6\@L)eQ^/bN\Tp3qd^g,hmV+9Ki(iO#/p@C"K3Xb.hbUG8?cGdJC7_8! +rft&Dm;1"\@AWlL20tFQ8ff1cnsV//ln6X#o&.IPVS]A'?o/Z&+<44`@nf"XE"8i)TEeplRiM +o1=k!d$@%mBsA&sYMT1pm\IrDE]A"Vi&p9/K8L9o,mRb&L9W2?R2u%2I+_5f@1F4m +!JJT0Igs`04)dln%/Qh;7;M7\fhi5a4"K-P@;hJ[%OG15m2Q>Sb?bb'Hr$IEsU"8P,1/]AdEk +?c.&af:B=k2ENdlfp%n7Mm'&#BRf[61B]AJE)G-KqGV.\i6>ZtBKY>k*)2ioc^>0)-fZ2%!7Y +3,,"J*=NAgoiZ+[EZULI?XJd)OC4`:>3`TC-14@^,Y#)hR:&0^Us8b=?5r3"30S=Rq>5J]AuR +aA^^"&lYUpY2;FGM/49Hf>K]Am1Kq^hS[s^C*IN@Yu+!"Wn,%TC=5qi'tRrX/P +dm=@pa[dr0/CWg%AD/"j4qU3/1#/SX_ZI7m)WL!lH1c9=[GA)G@Y0:igso4!O\ndlKkQ!edE +JB'3a)jl^m#NIqRN,)q5[P1U5Sc%-`$-?d.r`9!F$0K8k^;h6J_%"Uei:sA1rG%j6`7^b!*, +A1V'^&:s_gl<%TtgMA.aISG2G6#ug+<_0KgofU#&-Ye[8e$[I.%O?iS"/a8IKNTU_F.&FUcg +.?07gJ73&Q(0J]AVV/99WiV$h2,k:P7-H7+-op%UAD#9oC5!h]A]AH(%o)`C;@/WWR2BZRau\MP +,-26R_a_KMASnmm0XL`i\X"FbRhg8cBC22,[q1qkr03\^D@lJb +b%j(Zg*d,O$B0cYBT5^@Z>GsL(EQ<2!:Q.`[<8jaV.?IT/46k#=tVF>F%%&^lsc,DX>!K1]A= +j9_2?"5.48&jB>GttZ8N9W-pufGRPE1!7*\n_r(!o_spg4k^'$PYMnUT7&f*O@jY18_XbhKc8Z +n]A;c5XY*eV,=_A_Im4aDm&@n^p8`ITR3VN88'\Ka(B@jcdj[cHCIRBFO&JpG$OO@*^b +A,\B+NW.SQsUmb'g^-3#eHT$#DN(WU:@nl*eD +*r.=k]Au:sI5+6!,)FcTmLHl)D<)RQ(!Pi:;!e5RRmo,8KV)#0qUEu$Ld6$B^e!5LT*P3`>A^`U-@#2eNe^^2o'5!rnM4 +L%C#1_%-Qp<0CjJ3a.sC-I^=Yt)lYeH5!%nuWTC>N>U\RF50"2!J"WX^o5'PM@ge-8i7.kHb +Z.)Z_e-D"l1Vo&m6-fkp8e++\dk9^g*^JX]A%bD6!H_Q&E/,Au*f>n7M +(jsh7@m#9*8tZM)H+e:&*BLE'7mKCXLba0)%>BGgHWfH1A]AV?cm@R^e7//R-OIa;XC4>AF5J +oi6#_o68r5'k'K[0&m4!?M_.9iQ4feMhG#,l[`'.Y!FiKM,K.HDc4@YL\'0M>*j\%Rehf.@H-W>Q9l;AOY/lma^*8?JAGW-;<5 +Q%PrgJk"Mi@P3alc'3"6TXcN;-S)B?A:Ci-Y/^#2AJN_ULk'Pn1`fcMc3m4:q4ntudI0Yu>s +SpkZFpPLD!jH`laiN6=gcLWT'>4XCa.Xq"^Z[_PqV;5Djs +.honfj]Arqhg!3:aa#Cu&sdJ%VXHFr0EIAWa=@$d5uFOJ\2ihH(`>O2"I>N43P.+mNCdk0-A.6fUg#3E2 +9EH@k\aiIegoZ-!moIlIE2`[UdRKk2:$TRA]A$b.cMP>9tpN.gKJ)DQf\poha&S97a!.`aq%N +EWP8EDjhIrnKn6I>UjhLn'Y[4*8?<:bPuW4Y4.XC.M'@!A!kk&G^q`JhX@o4Q8;/5VGCs@kO +.rB.(?i!A35<60UX\ZRrH:MDZI*D6dkUB#"Uk"/n5;UTZ)XRkF,iT:3=jA_dn_rRT^2-k)Cr +"jG&GJ',`=eLo*M(qSLN%Hc.i0Y:p=Y.9hj[1%PdA2G]AEPW69s?Tk0&1ioQN5F3$jW/6*H3s +1IQ3(/ld:0Df[hqg#*?s8n2I3rlNG*$75H"I;EG)"S"ebFPKpO.IO>a,pb_?>c#iR<$j>I9g +-sTcD.5rgNAM5W4-&qb!ijo9s:HEYCsYW)"`!+;jB@-Po#M1&B2EB2TGi'39"pBf81sJ?>nX +:jUg4H#^g?%BD7CD/PSK&dfjmqbh:lFI,St`MRH%9pEM'U6TW`JuXV4Vq0kWH\/C3d]AM +rN'4s-X+Ab5G93,J*oHR0H8/0eh.*:3Et9p2`!1S"+M$nef#h,+tS,kPSD[BgS%!!PCV +SPAmW.KTs^@L[sWB8`??-;E"?/X>)LQA9Z=[k%D0NqMl$41iQIeo#k19MBgORF]AZfM?ANkMf +l^4)_tS#[MGXT]A?G2c.-N!0n="eX>6pQ;A693sW-+I^k(iZ!iojsgCokD]AW%BR]A.d6`3&4K" +uZlQWViVeQJS@9G3aWCGJBcp3[DP`/n#f.[YBmYiDIk>SMAMrjToong@2/!n96&,D[lI#sj3 +<@Fe15h(IYYk!j@d$7SL2R27b*>Gse2uS<&qE!;^ZLRrglkgCQ`I.*1NXh,=Xk17-E7Mge^W +f[429l$*VloE4_1\E!1C&!A`-/85aTfRnG$1uE-XjcO^gQlUjG-X09iOOL\I$ag@>Dh50_>l +4:Y"dO[=U=5Bc2T%u!#8[f[YBFQ0[PrKdT>ch8]AD11k6l=oGTr-Z43bQO72?V@&Te+R(f87b +I;/PED!T#mCW#dEbj`=]AN#]A\V<_i+/62\71(cE^i0VV*cGhgJ%$qVEhIg.P!45A)]A4KHaEAp +i93jQ0#X<[58nCQbj?WsfiEcT>kRmCTi8B/;Na>dm.RF]AhbmIY=4-ia='\"4mcYR,%-q[&Pg +sInkG"I@C5nITSXo8^=Dj#srb[S2/hkm\UK0)9o;);nej6ptGfh-a1IG,4EAAH_T&ue6F$QgB1nuMAPq<#&^&"D<-&0Ac:Tn1XZ^B50J&;LrW +Tl#*VJc0d2)LnBj3/9d$<^LK@BW.p/<>6:Z"$urPJH9HEQ>)kSWi`6ZDl"hZXb4`mNa?7iepg\4&ZjK:0n1iH +a.Qib.4*&fg9eht.o]Aq"?13^@T"gER+ +"*IMp*rJ>1P4q +Tcf31lbiiK(QZ6c0$[Y=mRt@fX,Xq*I5h807p4+Dc@Q?iX<':\cVMT*%a5a7C4?[jq/2;3r9 +BI6TTjT1q2H4YWJ7?&]A5r4qC0/:h44%jAm.L_C\HC>9L/Z6m^XJVYjU598<#:r$;#,.tl7TM +SE;3h=O(V^E>5Bi62P$BTec<4t"Y%j:NAr4!npehcBK?@+.IS[`s&)(#^_;6$DN,6:P'b1CY&+#*$[k6'1?_L_I]AI +SL$G,4/O/\!:Q,1`UFQOM;Z\e>s*V.Po@-aUp58"d^SI(Og"9i\,Iq.bqHBmRDZa%>j2">=`,Z@apDo?lN54./Tr-0?8<ghoaXM(VOJhe?Q\7h4sO]AS`@oo\R_bhXi/FCI]AB`Z% +AQ!F51Q>XED[ChWl::K+`p%D1HKKJu=;b]A$ +Osl)+*)F:4'BD`-h('1N+'f0`nuMq6,/o:-OKC_/,cFfe+i45ZjOo-H4T[pOW[*K1[J@f@+b^aooVQhl@1p&laDD=rKr[2)a +<7)&9s+IkLZqr)/,GDB@2tn#Lh3kUWa+\=HQH99?;(^2*[Rm^R;R&iZhCIdQa#o7II\RV5cX +Z_k(AS,pnoB)h2pbUgu*r&?UFD88&c'*"FG:^2B$[0gSFqCu;8fQ1HSB]ATBg4MJ)[oKEVd-j +=Fk-$u,A'Rgnh#XfOYSP!L5=7`]A*`2]A._tEVI5km@Hd#K42'_q=eN>)*Yb>QPLur +fO;GKtM=;'!VqWguGV[a>n64)",F9Q7G,PJdA1Y=UcF'>g3>&s6C#cc@;ADMYtSX51n30UTn +d;,^]A/>AB9DbP:,ZM(W26Vfkk;V.R-H8bFMq/5fO`&`4`H0]AN8aJ,5pOcJ7ORN)'K^!5.pC3 +F8/\7M8mqKN(_rq2%oP]AKo4Q(^;Pq/1(f66UC&FiVl_3K!1f"`L+)W0(tYj,jlXq9[L!DOgG +^q)WgXH:XnC@:A,E8j>b-3?BRF"]AUbd`\*uI.n!k<-]A/f3!j1ng?$8_jhk4tKG%"3pgtCH[C\%UXLgR8UB'6q;uX2;jk+d0?T''%I^ +kNA_ro9?)Jo-A(&qd`dcZ"b7&HTF[=mm*e-nDqFInFaFZpZ0m`NYQAOYgS!(`[o4e!anDmp% +k8Io,#XVm.sg2`\Y)7=:;44)UJ/Z4W0WSMJTYr*[^WO3;Ck6OlFX_l^j>3nLkDf>Bd(5]Ac:hT"o,Y@^=MmY:<(mO[ +oUQ:#p"ooE]AD?\k_^X"W/Z0R=OMM/*r)kP2]A?3;K$"o]ArqJ.N^kjfX'LrA+.7tT_Be7p8!J#`Q7iJ6d=$J>i +9W2m"ASL;M1"!oO1m;!De7^:@d!C/&m0WB9P+T3-C/NWQ/J<)@@Q6Zj;UDAPZJXl!W1_tejf +DQ!on*$BH7AJ7B+=$jYni8k`GdfC!&:JuTAL<@$JBZu__h.B*)]A^LNE8^mDSma.o?G"@?LI73ms0In9ON. +hVl$NT3LV_@q?(SmG-/+0K7edXOH-?`b"W7Q^>IlAI'jO0?cr4iKuJm;,^C8)`;p.VfeJqk#Xbj+!a2Z+S&=)l5Z4Np$]A@Z7\oh9)7X09+SB?BD` +WLqri#A*)C;H6CZWF["^QXk8Nr%ChL-7eRHHnJ)d:QguahfP:Tl\jOIZtGDXZ4IW]A.\e;PAX +$RgS>9,&pS3'SpKB2j]A5qL@pm&NuFe2FQk3pS+rVlbek0>Oe4HX4kmWDoAW:`m?A[O=XnR/* +-%eImGa5&Tq;;;8#j*CO$$=)VW'gmAkm#ek>X*4JKfK)Z-L]AS)K;V(SN/#b +aYjr!q8-Q6P0AOVn^tN&M4I?#MHF.n0D6@I^b8rNlGK&pOpc%9&3_n%Z=0W-RU3_;rV;.A$= +op(&\e&Y1F?:(Xl;]A]AijqC91hjFoH\*s3Ms$''PcZmjKJ7MaP'J=-hSj[)h4trWbp_o#tI,T +o%_"J;VY'rb$u[I?YFYgg&;-U"gSa6k&>AuVmTn!VC)1\U/:I$QumsZ/cF2rq=Kj@@t@ZZRD +hmeM:=VD^\ekSO#&H@3B;lR>F"dH0Fe#JI3cP"-1S;dXkl^sBG(4if@=<3]AfF\CeZS/icU'`+NCDYO/k%4Y!W=UXH^BMN&>h>)DS)ec&U?-m0?i ++&kKEsY)e(@NqW8-OP*_f*"e(HLIAWW4f&W>+,W6%P1YslViI*(D("edE3F9FLCqrt%WTV%b +CZ[5gPF)p%_+^X1MQPC;IOH,UE4Ahq,Jn@Nb*^IYcuK2%b):67I3HV= +,"U:L2lq\sk3)ijW;a63^[6YZ11O.+'"Km*iCDY#Q(OkPT2HGuQhT_M[>Ru+g*6qG8R_%&B%?r=HUh"$2He@'+WZSY&=Bi7j5C\,?h#/,EHcVP^ +K@ON.Y1(iu7/t9tj'MmasE*)%2@R-uah74+EC4iW!'FZ2^l0TgSKR>ISYimDk")VX.8S)7Ogq,t&, +''R(!AM[+d:!O.sD4/;k@>$M0r="heeZNP#g>d_>\<)d`<)K)mki^:? +Ku*(Zmb_lfTg$+DS5-DSrdTuN4@SqfeGg^`;87SY$?.T-=X)X'0gnasr&cse$_N$jk]AHT1\9 +[NWBO<]A)Fl*7gLrS>SH-sS"fdZaKq8rD8F,9&6ea:&eO(t/!`I7M?7p6N]ACn!>T/6I2a2ai^ +`co'Y^;c@bH;YO]A[EO[RX8nt1p24>G[YQeRWLOYYRpVpRt-Iph[JZSs^0]AeodE,T)nqS)/0^ +Mn0L/Z\RqVO+BA(Ob2R4CI\9Y4'Uf[j=>hA=mb"Vp.'CZ%$fY7GCXZ_!+*p9G1n@ +l;;))4JhURF`qlk$Rc^e]AVnN+ZVJ?G9;-b29[TXhgIh^g@ac]AN>I>UZ@I*a6RPKJ +95qWb%&B=4bjA2\LVEO4^S$O-UNoBFMI?3hZ'@(.#UG/>&]AHj+M92IXNqS1@)g42>-Z^(*0n +emk[@ng#.dH;5Xq94P5+/tX8eWQ[6b@M9\p$U_:odr`X@8i44$W0%+MMi[gN:BGVHXRUem=F +M0FC4EnX?PU@56\M%JuoNZ7'kEZ=Bf/eM#Mh$9ll5T'eo<\.0,UL4;=`qhXZEFi9%cmg?g/G +"4V$%Op.R8/7GUrBoFH0G7SQ]AAfWT)C/MfLGEXT^V_3$28ca<^Zqk':"RbT8u%qEYJh@-*@> +Z!bZUg`LE25uTn\.rp,Aaj$,O^u3n?'.eCK+R,HX3+m!Nf*Z+e9O'Ohk@S+g$Xh'T4ZPN*;3Y:Z%om]AGE[(%+AT%+U@Dn;R4OqM]A>nLo+?n6!>K)Vp!hEW@OrC +uRdDqrZ3mXaujI<+rTN2$%#QpA)8IVLkQbZDF17L8uZl0?R+3PX,AR7H/ +SXQ0q +heZ`CeU,XbXI2:&\2o=:GTPU58m^lqgdo2lo"t?E^0r6/GIDZ]A09;Z#P>$8Q5E53HNhXe\uH?4"+bAG%R& +_Nb/BqITO-$?V4D5GTR%/,1C2Gn?J?'sq^d+n$eVH\bO<29l/`me0Pg%?P#@?c#V9WE4j(Tu<[/Y8Oj+ +a%Hqjr)I-N==)GCO*hgCA,PK>@ZJDKm5@)0h*H)fD!,@s"QRhkb:!@sJdb)Q,qB?ka=jp#Pe +Fs'T>JAT]AaIZdDB&06+/a'6GNVAAE>QjW&MoD#LA"QT7=,e(S88h!4-\VdMLk#5_*aaN*OYY +b;oV5?-69 +=23Ye_"',M#DFA:+48'l;[:"AXMU+!g"u80"1mA:pSU;M(Ds8BdYThQ6lSM!3n&/WdoC=/8L +:T^NlK+d&5GS#&It4()^gZWKAO/Z2t)TX6mJjm3($pll/8c9X[/-B\)R!TBTcENVOD;Q+)#9mBBGU]A"" +oHo)i)9OJ"WRpFs8FLkGpP/a]A"PE]ApSnl'#G+Pke6\H`R0NU3~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WEB-INF/resources/chartmapsvg/user-defined/上海市.svg b/WEB-INF/resources/chartmapsvg/user-defined/上海市.svg new file mode 100644 index 0000000..ed5eb1a --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/上海市.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/世界地图.svg b/WEB-INF/resources/chartmapsvg/user-defined/世界地图.svg new file mode 100644 index 0000000..f45905e --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/世界地图.svg @@ -0,0 +1,458 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/中国.svg b/WEB-INF/resources/chartmapsvg/user-defined/中国.svg new file mode 100644 index 0000000..500f695 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/中国.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/云南省.svg b/WEB-INF/resources/chartmapsvg/user-defined/云南省.svg new file mode 100644 index 0000000..ff09b2f --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/云南省.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/内蒙古自治区.svg b/WEB-INF/resources/chartmapsvg/user-defined/内蒙古自治区.svg new file mode 100644 index 0000000..00f4549 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/内蒙古自治区.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/北京市.svg b/WEB-INF/resources/chartmapsvg/user-defined/北京市.svg new file mode 100644 index 0000000..455b328 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/北京市.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/台湾省.svg b/WEB-INF/resources/chartmapsvg/user-defined/台湾省.svg new file mode 100644 index 0000000..f50b0e2 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/台湾省.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/吉林省.svg b/WEB-INF/resources/chartmapsvg/user-defined/吉林省.svg new file mode 100644 index 0000000..8524656 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/吉林省.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/四川省.svg b/WEB-INF/resources/chartmapsvg/user-defined/四川省.svg new file mode 100644 index 0000000..d5c3c2d --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/四川省.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/天津市.svg b/WEB-INF/resources/chartmapsvg/user-defined/天津市.svg new file mode 100644 index 0000000..1fd3e97 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/天津市.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/宁夏回族自治区.svg b/WEB-INF/resources/chartmapsvg/user-defined/宁夏回族自治区.svg new file mode 100644 index 0000000..ae2ddcd --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/宁夏回族自治区.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/安徽省.svg b/WEB-INF/resources/chartmapsvg/user-defined/安徽省.svg new file mode 100644 index 0000000..b46c05e --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/安徽省.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/山东省.svg b/WEB-INF/resources/chartmapsvg/user-defined/山东省.svg new file mode 100644 index 0000000..6ad38fd --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/山东省.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/山西省.svg b/WEB-INF/resources/chartmapsvg/user-defined/山西省.svg new file mode 100644 index 0000000..5ae0da6 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/山西省.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/广东省.svg b/WEB-INF/resources/chartmapsvg/user-defined/广东省.svg new file mode 100644 index 0000000..40283dd --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/广东省.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/广西壮族自治区.svg b/WEB-INF/resources/chartmapsvg/user-defined/广西壮族自治区.svg new file mode 100644 index 0000000..21ab033 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/广西壮族自治区.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/新疆维吾尔族自治区.svg b/WEB-INF/resources/chartmapsvg/user-defined/新疆维吾尔族自治区.svg new file mode 100644 index 0000000..36731f5 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/新疆维吾尔族自治区.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/江苏省.svg b/WEB-INF/resources/chartmapsvg/user-defined/江苏省.svg new file mode 100644 index 0000000..c1ea429 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/江苏省.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/江西省.svg b/WEB-INF/resources/chartmapsvg/user-defined/江西省.svg new file mode 100644 index 0000000..32e96c5 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/江西省.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/河北省.svg b/WEB-INF/resources/chartmapsvg/user-defined/河北省.svg new file mode 100644 index 0000000..e18bb79 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/河北省.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/河南省.svg b/WEB-INF/resources/chartmapsvg/user-defined/河南省.svg new file mode 100644 index 0000000..42ab121 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/河南省.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/浙江省.svg b/WEB-INF/resources/chartmapsvg/user-defined/浙江省.svg new file mode 100644 index 0000000..2488d5a --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/浙江省.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/海南省.svg b/WEB-INF/resources/chartmapsvg/user-defined/海南省.svg new file mode 100644 index 0000000..eb56067 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/海南省.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/湖北省.svg b/WEB-INF/resources/chartmapsvg/user-defined/湖北省.svg new file mode 100644 index 0000000..0e68959 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/湖北省.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/湖南省.svg b/WEB-INF/resources/chartmapsvg/user-defined/湖南省.svg new file mode 100644 index 0000000..5e1f6be --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/湖南省.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/澳门特别行政区.svg b/WEB-INF/resources/chartmapsvg/user-defined/澳门特别行政区.svg new file mode 100644 index 0000000..3447eb6 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/澳门特别行政区.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/甘肃省.svg b/WEB-INF/resources/chartmapsvg/user-defined/甘肃省.svg new file mode 100644 index 0000000..ec8b2ec --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/甘肃省.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/福建省.svg b/WEB-INF/resources/chartmapsvg/user-defined/福建省.svg new file mode 100644 index 0000000..69f087f --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/福建省.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/自定义世界地图.svg b/WEB-INF/resources/chartmapsvg/user-defined/自定义世界地图.svg new file mode 100644 index 0000000..a356ef9 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/自定义世界地图.svg @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/自定义地图1.svg b/WEB-INF/resources/chartmapsvg/user-defined/自定义地图1.svg new file mode 100644 index 0000000..36a5ff2 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/自定义地图1.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/西藏自治区.svg b/WEB-INF/resources/chartmapsvg/user-defined/西藏自治区.svg new file mode 100644 index 0000000..761085c --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/西藏自治区.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/贵州省.svg b/WEB-INF/resources/chartmapsvg/user-defined/贵州省.svg new file mode 100644 index 0000000..a360449 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/贵州省.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/辽宁省.svg b/WEB-INF/resources/chartmapsvg/user-defined/辽宁省.svg new file mode 100644 index 0000000..982b650 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/辽宁省.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/重庆市.svg b/WEB-INF/resources/chartmapsvg/user-defined/重庆市.svg new file mode 100644 index 0000000..d1cf87a --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/重庆市.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/陕西省.svg b/WEB-INF/resources/chartmapsvg/user-defined/陕西省.svg new file mode 100644 index 0000000..e070ba4 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/陕西省.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/青海省.svg b/WEB-INF/resources/chartmapsvg/user-defined/青海省.svg new file mode 100644 index 0000000..c66a1e8 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/青海省.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/香港特别行政区.svg b/WEB-INF/resources/chartmapsvg/user-defined/香港特别行政区.svg new file mode 100644 index 0000000..4b7022b --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/香港特别行政区.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/chartmapsvg/user-defined/黑龙江省.svg b/WEB-INF/resources/chartmapsvg/user-defined/黑龙江省.svg new file mode 100644 index 0000000..29d6cb0 --- /dev/null +++ b/WEB-INF/resources/chartmapsvg/user-defined/黑龙江省.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/resources/config.xml b/WEB-INF/resources/config.xml new file mode 100644 index 0000000..f71f1f5 --- /dev/null +++ b/WEB-INF/resources/config.xml @@ -0,0 +1,1753 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WEB-INF/resources/datasource.xml b/WEB-INF/resources/datasource.xml new file mode 100644 index 0000000..93dd43d --- /dev/null +++ b/WEB-INF/resources/datasource.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +f0'?\h3FoeW^e.=J,-RCB%&WCC)TSZ'70Y@fMV/IO+:' +V'@\EVd1pRJGMVTg5/J`PP]A7Oej&dotOn:]AZZh9qJr7l&t?g0^d]A02d3^`,n^NGQ/prU0gpn +mSERt,;O$j;5VHUgXi29e(3.869KoK/Hi&GYd@dT1=L;5n"B@BoN5-coKT[Y(NiEpc3QBFK/ +0:hkfe6'nOaW(TK,SCNRN]A_CL[1"bhDt+D=Z0\!(AS`Q((VsHLGllWM\XuCS'f)BguY!g^u' +"d]Au'`:OAukOiij#9&rP6=i/?)lBBm--dUR9!o7nHhnAn5A6f3/1HgeJn,0`<=FBZ1t:X_J: +^=+=!9b=.T0mZ8Gf"(62dSBmH%JR`2f_fA1?KJ +se+S4dHH7Ut:'g+%"XY+h\Cb.lBsk@?69 + + + + + + + + + + +SsfoI!rr~ +]]> + + + diff --git a/WEB-INF/resources/fsconfig.xml b/WEB-INF/resources/fsconfig.xml new file mode 100644 index 0000000..4931524 --- /dev/null +++ b/WEB-INF/resources/fsconfig.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WEB-INF/resources/functions.xml b/WEB-INF/resources/functions.xml new file mode 100644 index 0000000..ef7886b --- /dev/null +++ b/WEB-INF/resources/functions.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/WEB-INF/resources/widgets.xml b/WEB-INF/resources/widgets.xml new file mode 100644 index 0000000..98f56d8 --- /dev/null +++ b/WEB-INF/resources/widgets.xml @@ -0,0 +1,17 @@ + +LdQ9kLcD2(aG]AmiZ$Tn&_WI[@l./R4RnEk.)Fp"Fel +e^4iYI/@dP5$n9Cp=[8TSg99:+etI*D&P_ZLG,"6Vf0q-KZAW1S#Oq2#=e$%s?2bWWfZr0*5 +4k9(Hb&WIq/]Ah";S0Gl&L$K:aVO_#DAh;\`\,)d-JMsc\:-F(OnF2G[,,K* +Y3.tS%ZKu>V6gfViuG?::gu"p`]AW?L.eRNAo+LN&(>'q0f#.*E`,AeB1XG6*$$&^bN1ct=lS +s2FBKk+$"Go,AK+ +Zh+P[44boGWA?U+(*dH^)'0b0I&2RKJH:(DHNen?F-BY*`T)?7fB;#N)tu3R[X?6eG9c1SRGVph`LX`77@O=:A.rpI8nmbL3R9>d+*<+M.);kJQUbCaa +(b]AD);h6*n5L5(FN<;NI[aECFM#%L5!]Alk^T?m72T/oBH!A<2RLS+ +Nk0(2Q0rp9fNW=3E07i3'_k3A47o(fr^rV6.I.k<-e5K`nmobNZ\)"%#WQLCmLb'Jg.3u@BX +)5a8XfsnT/mHlLTC,N?(ZV4%d@'Nf>LVqb\2JVn47&[7BS,MP#O\U?KH(R1-m8 +Rj1`l?#32OdB9:U@:0+DOaJj_CAh=<_bEBC;,\dJ`nZdBo*&f[$^K'=6AN'TH$@Q,LmG.[BM +LJ,5F&"^)0G9a(eJG*#T3+u(aEn,\;a=nF-o8&bL*T_)(NY-M.,kAkj$Qh#h=`T%Yd;R3&t& +1AOG^Om4//B$^RW"SgEG6K-nJVUa%\lnIo("P^^&BGh"p639WH2Yc?DuChquZ +~ +]]> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/category/edit.ftl b/WEB-INF/view/cetc54/category/edit.ftl new file mode 100644 index 0000000..1ac8162 --- /dev/null +++ b/WEB-INF/view/cetc54/category/edit.ftl @@ -0,0 +1,50 @@ +

+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/category/index.ftl b/WEB-INF/view/cetc54/category/index.ftl new file mode 100644 index 0000000..af83d0d --- /dev/null +++ b/WEB-INF/view/cetc54/category/index.ftl @@ -0,0 +1,37 @@ + + + +<#include "../layout/ref_head.ftl"> + + + +
+
+ +
+
+ <#include "edit.ftl"> +
+
+
+
+<#include "../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/chat/appVersion.ftl b/WEB-INF/view/cetc54/chat/appVersion.ftl new file mode 100644 index 0000000..37ba58a --- /dev/null +++ b/WEB-INF/view/cetc54/chat/appVersion.ftl @@ -0,0 +1,198 @@ + + + +<#include "../layout/ref_head.ftl"> + + + +
+
+
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
操作序号类型版本标题版本信息更新时间
+ + + {{i+1}} + + {{value.isupdatepkg |updatepkgFilter}} + + + {{value.versionnumber}} + {{value.name}}{{value.remark}}{{value.publishdate |dateFilter}}
+
+
+
+
+
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
操作序号类型版本标题版本信息更新时间
+ + + {{i+1}} + + {{value.isupdatepkg |updatepkgFilter}} + + + {{value.versionnumber}} + {{value.name}}{{value.remark}}{{value.publishdate |dateFilter}}
+
+
+
+
+
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
操作序号类型版本标题版本信息更新时间
+ + + {{i+1}} + + {{value.isupdatepkg |updatepkgFilter}} + + + {{value.versionnumber}} + {{value.name}}{{value.remark}}{{value.publishdate |dateFilter}}
+
+
+
+
+<#include "appVersion_Edit.ftl"> +<#include "../layout/ref_script.ftl"> + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/chat/appVersion_Edit.ftl b/WEB-INF/view/cetc54/chat/appVersion_Edit.ftl new file mode 100644 index 0000000..9b0d554 --- /dev/null +++ b/WEB-INF/view/cetc54/chat/appVersion_Edit.ftl @@ -0,0 +1,49 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/dict/edit.ftl b/WEB-INF/view/cetc54/dict/edit.ftl new file mode 100644 index 0000000..4f534ba --- /dev/null +++ b/WEB-INF/view/cetc54/dict/edit.ftl @@ -0,0 +1,34 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/dict/edit_item.ftl b/WEB-INF/view/cetc54/dict/edit_item.ftl new file mode 100644 index 0000000..538fb8a --- /dev/null +++ b/WEB-INF/view/cetc54/dict/edit_item.ftl @@ -0,0 +1,29 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/dict/index.ftl b/WEB-INF/view/cetc54/dict/index.ftl new file mode 100644 index 0000000..aeb99d6 --- /dev/null +++ b/WEB-INF/view/cetc54/dict/index.ftl @@ -0,0 +1,32 @@ + + + + <#include "../layout/ref_head.ftl"> + + + +
+
+ +
+
+
+
+ <#include "list.ftl"> +
+
+ <#include "item_list.ftl"> +
+
+
+
+<#include "edit.ftl"> +<#include "edit_item.ftl"> +<#include "../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/dict/item_list.ftl b/WEB-INF/view/cetc54/dict/item_list.ftl new file mode 100644 index 0000000..2830c7b --- /dev/null +++ b/WEB-INF/view/cetc54/dict/item_list.ftl @@ -0,0 +1,45 @@ +
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
操作序号名称状态
+ {{i+1}}{{value.name}}{{value.value}}{{value.status |statusFilter}}
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/dict/list.ftl b/WEB-INF/view/cetc54/dict/list.ftl new file mode 100644 index 0000000..63b742f --- /dev/null +++ b/WEB-INF/view/cetc54/dict/list.ftl @@ -0,0 +1,45 @@ +
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
操作序号字典名称标识说明
+ {{i+1}}{{value.name}}{{value.keykey}}{{value.note}}
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/downloadApp.ftl b/WEB-INF/view/cetc54/downloadApp.ftl new file mode 100644 index 0000000..5b6a735 --- /dev/null +++ b/WEB-INF/view/cetc54/downloadApp.ftl @@ -0,0 +1,116 @@ + + + +<#include "layout/ref_head.ftl"> + + + + +
+
+
+
+
+
+

扫描二维码

+

下载手机客户端

+
+
+
+
+
立即下载
+
${appCTitle}-客户端
+
+
+
+ +
Android
+
+ +
+
+
+ +
IOS
+
+ +
+
+
+ +
Windows
+
+ +
+
+
+
+
+ Windows版本工具包: + .net framework 4.6 +
+
更新日志:
+
+
Android
+
+
+
IOS
+
+
+
windows
+
+
+
+
+
${copyright}
+
技术支持:${techSupport}
+
+ +<#include "layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/downloadRouter.ftl b/WEB-INF/view/cetc54/downloadRouter.ftl new file mode 100644 index 0000000..05e8856 --- /dev/null +++ b/WEB-INF/view/cetc54/downloadRouter.ftl @@ -0,0 +1,67 @@ + + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/exam.ftl b/WEB-INF/view/cetc54/exam/exam.ftl new file mode 100644 index 0000000..6bd3a00 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exam.ftl @@ -0,0 +1,18 @@ + + + +<#include "../layout/ref_head.ftl"> + + + + +
+
+
+
+<#include "exam_list.ftl"> +<#include "../layout/ref_script.ftl"> + +<#----> + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/exam_edit.ftl b/WEB-INF/view/cetc54/exam/exam_edit.ftl new file mode 100644 index 0000000..32277e2 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exam_edit.ftl @@ -0,0 +1,199 @@ +
题目内容如下: + <#if pg=="1"> + 考试剩余时间: + +
+ <#if pg=="1"> + 考试说明:1、请在规定时间内完成考试,并点击提交,超时将自动提交试卷!2、点击关闭考试,将清空答案,需重新答题!3、点击暂停,将最多暂停30分钟,超过30分钟页面自动关闭,而且不会保存已作答部分! + + <#if pg=="2"> + 调研问卷说明:1、请在规定时间内完成问卷,并点击提交!2、点击关闭问卷,将清空已作答部分,需重新作答!3、点击暂停,将最多暂停30分钟,超过30分钟页面自动关闭,而且不会保存已作答部分! + +
+ + + + + + + + +
+<#-- 2019年第一次项目管理培训考试试卷1--> + +
+<#-- 项目管理培训是对管理者和相关学员进行现代项目管理理念、体系、流程和方法的教育培训活动。--> +<#-- 通过系统的培训,使广大培训对象具备系统思维、战略思维的主动意识,改变管理习惯,降低随意性和不确定性,大幅度提高工作效率。--> + +
+ +
+ + + + + + + + + + + + + +
+
+
+ + +<#-- --> +<#-- Q{{i+1}}--> + Q{{value.num}} +<#-- {{if value.isParagraph=="0" }}Q{{value.num}}{{/if}}--> + {{value.subject}} + + {{if value.type=="单选题"}}单选题{{/if}} + {{if value.type=="多选题"}}多选题{{/if}} + {{if value.type=="判断题"}}判断题{{/if}} + {{if value.type=="问答题"}}问答题{{/if}} + {{if value.type=="填空题"}}填空题{{/if}} +<#-- {{if value.type=="1"}}单选题{{/if}}--> +<#-- {{if value.type=="2"}}多选题{{/if}}--> +<#-- {{if value.type=="3"}}判断题{{/if}}--> +<#-- {{if value.type=="4"}}问答题{{/if}}--> + + + + {{if value.ismust=="1"}}(必答){{/if}} + {{if value.ismust=="0"}}(选答){{/if}} + + + +<#-- --> +<#-- {{value.score}}分--> +<#-- --> + <#if pg=="1"> + + {{value.score}} + +
+<#-- {{if value.type=="1"}}--> + {{if value.type=="单选题"}} +<#-- {{if value.optiona.length}}
A {{ value.optiona}}
{{/if}}--> +<#-- {{if (value.optionb.length)}}
B {{ value.optionb}}
{{/if}}--> +<#-- {{if (value.optionc.length)}}
C {{ value.optionc}}
{{/if}}--> +<#-- {{if (value.optiond.length)}}
D {{ value.optiond}}
{{/if}}--> + + {{if value.optiona.length}} + {{if value.user_answer=="A"}}
+ {{else}}
+ {{/if}} + {{/if}} + {{if (value.optionb.length)}} + {{if value.user_answer=="B"}}
+ {{else}}
+ {{/if}} + {{/if}} + {{if (value.optionc.length)}} + {{if value.user_answer=="C"}}
+ {{else}}
+ {{/if}} + {{/if}} + {{if (value.optiond.length)}} + {{if value.user_answer=="D"}}
+ {{else}}
+ {{/if}} + {{/if}} + + {{/if}} +<#-- {{if value.type=="2"}}--> + {{if value.type=="多选题"}} +<#-- {{if value.optiona.length}}
A {{ value.optiona}}
{{/if}}--> +<#-- {{if (value.optionb.length)}}
B {{ value.optionb}}
{{/if}}--> +<#-- {{if (value.optionc.length)}}
C {{ value.optionc}}
{{/if}}--> +<#-- {{if (value.optiond.length)}}
D {{ value.optiond}}
{{/if}}--> +<#-- {{if (value.optione.length)}}
E {{ value.optione}}
{{/if}}--> +<#-- {{if (value.optionf.length)}}
F {{ value.optionf}}
{{/if}}--> + + {{if value.optiona.length}} + {{if judge(value.user_answer,"A")}} +
+ {{else}}
+ {{/if}} + {{/if}} + {{if (value.optionb.length)}} + {{if judge(value.user_answer,"B")}} +
+ {{else}}
+ {{/if}} + {{/if}} + {{if (value.optionc.length)}} + {{if judge(value.user_answer,"C")}} +
+ {{else}}
+ {{/if}} + {{/if}} + {{if (value.optiond.length)}} + {{if judge(value.user_answer,"D")}} +
+ {{else}}
+ {{/if}} + {{/if}} + {{if (value.optione.length)}} + {{if judge(value.user_answer,"E")}} +
+ {{else}}
+ {{/if}} + {{/if}} + {{if (value.optionf.length)}} + {{if judge(value.user_answer,"F")}} +
+ {{else}}
+ {{/if}} + {{/if}} + + {{/if}} +<#-- {{if value.type=="3"}}--> + {{if value.type=="判断题"}} + {{if value.user_answer=="对"}} +
+
+ {{else if value.user_answer=="错"}} +
+
+ {{else}} +
+
+ {{/if}} + {{/if}} +<#-- {{if value.type=="4"}}--> + {{if value.type=="问答题"}} +<#-- + {{/if}} + {{if value.type=="填空题"}} + 填空题答案格式:第一空答案,第二空答案,第三空答案
+ 答案: + {{/if}} + + <#----> +
+ <#if pg=="1"> +
+ <#-- style="visibility: hidden"占位隐藏--> + + <#-- --> + <#-- 合计:共7道85分--> + <#-- 问答:共1道20分|--> + <#-- 判断:共1道5分|--> + <#-- 多选:共2道30分|--> + <#-- 单选:共3道30分|--> + <#-- --> + + 试卷总共: 题,合计分 + +
+ +
+ diff --git a/WEB-INF/view/cetc54/exam/exam_list.ftl b/WEB-INF/view/cetc54/exam/exam_list.ftl new file mode 100644 index 0000000..6a38bf6 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exam_list.ftl @@ -0,0 +1,67 @@ +
+
+ + + + + +
+ + 注意:为保证分数正确,请勿在多个账号同时登陆的情况下答题! + + + +
+
+ + + + +<#-- --> + + + + +<#-- userstate是通过SQL语句用于判断用户的试卷是否已答--> + + + + + + + + +<#-- --> + +<#-- --> + + + + + + + + +
操作序号 + <#if pg=="1">试卷名称 + <#if pg=="2">问卷名称 + + <#if pg=="1">试卷类别 + <#if pg=="2">问卷类别 + + <#if pg=="1">试卷描述 + <#if pg=="2">问卷描述 + + <#if pg=="1">试卷状态 + <#if pg=="2">问卷状态 + 最后编辑时间创建人
--> + +<#-- +<#-- onclick="editRow('{{value.id}}');">--> +<#-- +<#-- onclick="deleteRow('{{value.id}}');">--> +<#-- {{i+1}} +<#-- onclick="viewRow('{{value.id}}','{{value.name}}');">{{value.name}}{{value.name}}{{value.category}}{{value.description}}{{value.userstate}}{{value.edittime | dateTimeFilter}}{{value.creatperson }}
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/exampaper.ftl b/WEB-INF/view/cetc54/exam/exampaper.ftl new file mode 100644 index 0000000..8018582 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exampaper.ftl @@ -0,0 +1,37 @@ + + + +<#include "../layout/ref_head.ftl"> + + + + +
+
+
+
+ +<#--什么情况需要写? 第二种弹窗方式--> +<#--
--> +<#--
--> + +<#include "exampaper_list.ftl"> +<#include "exampaper_edit.ftl"> +<#include "exampaper_limitation_department.ftl"> +<#include "exampaper_limitation_person.ftl"> +<#include "exampaper_limitation_class.ftl"> +<#include "exampaper_limitation_course.ftl"> +<#include "exampaper_person_import.ftl"> +<#include "exampaper_preview.ftl"> +<#--
--> +<#--
--> +<#include "exampaper_detail.ftl"> + +<#--<#include "exampaper_import.ftl">--> + +<#include "../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/exampaper_add.ftl b/WEB-INF/view/cetc54/exam/exampaper_add.ftl new file mode 100644 index 0000000..fbf1a4c --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exampaper_add.ftl @@ -0,0 +1,88 @@ + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/exampaper_detail.ftl b/WEB-INF/view/cetc54/exam/exampaper_detail.ftl new file mode 100644 index 0000000..85b8c80 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exampaper_detail.ftl @@ -0,0 +1,50 @@ +
+
+
+ + + +<#-- --> + +
+ + + --> +<#-- --> +<#--
+
+ + + + <#----> + + <#----> + + + + + +<#-- 排序出现问题--> +<#-- --> +<#-- --> +<#-- --> +<#-- --> + + + + + <#----> + + <#----> + + + + + + + +
序号试卷名称考生工资号部门参与详情成绩试卷名称考生工资号参与详情
{{i+1}}{{value.name}} {{value.user}}{{value.user_id}}{{value.department}}{{value.userstate}}{{value.user_score}}
+
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/exampaper_edit.ftl b/WEB-INF/view/cetc54/exam/exampaper_edit.ftl new file mode 100644 index 0000000..8802da4 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exampaper_edit.ftl @@ -0,0 +1,121 @@ +
+
+
+ <#include "exampaper_limitation.ftl"> + +<#-- <#include "exampaper_add.ftl">--> +<#-- <#include "exampaper_project_main_useradd_list.ftl">--> +<#-- <#include "exampaper_project_main_useradd_group_list.ftl">--> +
+ + +<#--
--> +<#--
--> +<#--<#include "exampaper_project_main_useradd_list.ftl">--> +<#--<#include "exampaper_project_main_useradd_group_list.ftl">--> diff --git a/WEB-INF/view/cetc54/exam/exampaper_editexampaper.ftl b/WEB-INF/view/cetc54/exam/exampaper_editexampaper.ftl new file mode 100644 index 0000000..4168ecc --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exampaper_editexampaper.ftl @@ -0,0 +1,449 @@ +
+
选择添加题目方式: + + <#if pg=="1"> + + + + + + + <#if pg=="1"> + + + +
+
+
题目内容如下:
+ + + + + + + + +
+ +
+ +
+ +
+ + + + + + + + + + + + + +
+
+
+ +<#-- --> +<#-- {{i+1}}--> + Q{{value.num}} +<#-- {{if value.isparagraph=="0" }}{{/if}}--> + {{value.subject}} + + {{if value.type=="单选题"}}单选题{{/if}} + {{if value.type=="多选题"}}多选题{{/if}} + {{if value.type=="判断题"}}判断题{{/if}} + {{if value.type=="问答题"}}问答题{{/if}} + {{if value.type=="填空题"}}填空题{{/if}} +<#-- {{if value.type=="1"}}单选题{{/if}}--> +<#-- {{if value.type=="2"}}多选题{{/if}}--> +<#-- {{if value.type=="3"}}判断题{{/if}}--> +<#-- {{if value.type=="4"}}问答题{{/if}}--> + + + + {{if value.ismust=="1"}}(必答){{/if}} + {{if value.ismust=="0"}}(选答){{/if}} + + + +<#-- --> + + +<#-- --> + + <#if pg=="1"> + + {{value.score}} + +
+<#-- {{if value.type=="1"}}--> + {{if value.type=="单选题"}} + {{if value.optiona.length}}
A {{ value.optiona}}
{{/if}} + {{if (value.optionb.length)}}
B {{ value.optionb}}
{{/if}} + {{if (value.optionc.length)}}
C {{ value.optionc}}
{{/if}} + {{if (value.optiond.length)}}
D {{ value.optiond}}
{{/if}} + {{/if}} +<#-- {{if value.type=="2"}}--> + {{if value.type=="多选题"}} + {{if value.optiona.length}}
A {{ value.optiona}}
{{/if}} + {{if (value.optionb.length)}}
B {{ value.optionb}}
{{/if}} + {{if (value.optionc.length)}}
C {{ value.optionc}}
{{/if}} + {{if (value.optiond.length)}}
D {{ value.optiond}}
{{/if}} + {{if (value.optione.length)}}
E {{ value.optione}}
{{/if}} + {{if (value.optionf.length)}}
F {{ value.optionf}}
{{/if}} + {{/if}} +<#-- {{if value.type=="3"}}--> + {{if value.type=="判断题"}} +
A 对
+
B 错
+ {{/if}} +<#-- {{if value.type=="4"}}--> + {{if value.type=="判断题"}} +<#-- --> + {{/if}} + + {{if value.type=="问答题"}} + 答案:{{value.answer}} +<#-- 答案:{{value.answer}}--> + {{/if}} + + {{if value.type=="填空题"}} + 答案:{{value.answer}} + <#--答案:{{value.answer}}--> + {{/if}} + + {{if value.type!="问答题"}} + {{if value.type!="填空题"}} + +<#-- --> + {{/if}} + {{/if}} + +
+
+ + 添加单选题 + 添加多选题 + <#if pg=="1"> + 添加判断题 + + <#if pg=="1"> + 添加填空题 + + 添加问答题 +<#-- 添加段落说明--> + <#if pg=="1"> + + 试卷总共: 题,合计分 + + +
+<#--
--> +<#-- --> +<#-- 单选: 题,共分|--> +<#-- 多选: 题,共分|--> +<#-- 判断: 题,共分|--> +<#-- 填空: 题,共分|--> +<#-- 问答: 题,共分|--> +<#-- --> +<#-- 总共: 题,合计分--> +<#-- --> +<#--
--> + +<#--
--> +<#-- --> +<#-- 在第 题后添加单选题--> +<#-- ; 在第 题后添加多选题--> +<#-- ; 在第 题后添加判断题--> +<#-- ; 在第 题后添加问答题--> +<#-- ; 在第 题后添加段落说明--> +<#--
--> +
+ + + + + + + + + + + + + +<#-- diff --git a/WEB-INF/view/cetc54/exam/exampaper_project_main_useradd_group_list.ftl b/WEB-INF/view/cetc54/exam/exampaper_project_main_useradd_group_list.ftl new file mode 100644 index 0000000..2e1ab47 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exampaper_project_main_useradd_group_list.ftl @@ -0,0 +1,41 @@ + + diff --git a/WEB-INF/view/cetc54/exam/exampaper_project_main_useradd_list.ftl b/WEB-INF/view/cetc54/exam/exampaper_project_main_useradd_list.ftl new file mode 100644 index 0000000..a961a32 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/exampaper_project_main_useradd_list.ftl @@ -0,0 +1,47 @@ + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/examresult.ftl b/WEB-INF/view/cetc54/exam/examresult.ftl new file mode 100644 index 0000000..6967b96 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/examresult.ftl @@ -0,0 +1,18 @@ + + + +<#include "../layout/ref_head.ftl"> + + + + +
+
+<#include "examresult_list.ftl"> +<#include "examresult_import.ftl"> + +<#include "../layout/ref_script.ftl"> + +<#----> + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/examresult_edit.ftl b/WEB-INF/view/cetc54/exam/examresult_edit.ftl new file mode 100644 index 0000000..d2f5016 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/examresult_edit.ftl @@ -0,0 +1,194 @@ + +
题目内容如下:
+ + + + + + + +
+ +
+ +
+ +
+ + + + + + + + + + + + + +
+
+
+ + +<#-- --> +<#-- Q{{i+1}}--> + Q{{value.num}} +<#-- {{if value.isParagraph=="0" }}Q{{value.num}}{{/if}}--> + {{value.subject}} + {{if value.type=="单选题"}}单选题{{/if}} + {{if value.type=="多选题"}}多选题{{/if}} + {{if value.type=="判断题"}}判断题{{/if}} + {{if value.type=="问答题"}}问答题{{/if}} + {{if value.type=="填空题"}}填空题{{/if}} +<#-- {{if value.type=="1"}}单选题{{/if}}--> +<#-- {{if value.type=="2"}}多选题{{/if}}--> +<#-- {{if value.type=="3"}}判断题{{/if}}--> +<#-- {{if value.type=="4"}}问答题{{/if}}--> + + {{if value.ismust=="1"}}(必答){{/if}} + {{if value.ismust=="0"}}(选答){{/if}} + + + + 总分:{{value.score}}分,得分: + {{if value.type=="单选题" || value.type=="多选题" || value.type=="判断题"}} + {{if value.answer == value.user_answer}} + + {{else}} + + {{/if}} + {{/if}} + + {{if value.type=="填空题" || value.type=="问答题"}} + + {{/if}} + +
+<#-- {{if value.type=="1"}}--> + {{if value.type=="单选题"}} +<#-- {{if value.optiona.length}}
A {{ value.optiona}}
{{/if}}--> +<#-- {{if (value.optionb.length)}}
B {{ value.optionb}}
{{/if}}--> +<#-- {{if (value.optionc.length)}}
C {{ value.optionc}}
{{/if}}--> +<#-- {{if (value.optiond.length)}}
D {{ value.optiond}}
{{/if}}--> + + {{if value.optiona.length}} + {{if value.user_answer=="A"}}
A {{ value.optiona}}
+ {{else}}
A {{ value.optiona}}
+ {{/if}} + {{/if}} + {{if (value.optionb.length)}} + {{if value.user_answer=="B"}}
B {{ value.optionb}}
+ {{else}}
B {{ value.optionb}}
+ {{/if}} + {{/if}} + {{if (value.optionc.length)}} + {{if value.user_answer=="C"}}
C {{ value.optionc}}
+ {{else}}
C {{ value.optionc}}
+ {{/if}} + {{/if}} + {{if (value.optiond.length)}} + {{if value.user_answer=="D"}}
D {{ value.optiond}}
+ {{else}}
D {{ value.optiond}}
+ {{/if}} + {{/if}} + + {{/if}} +<#-- {{if value.type=="2"}}--> + {{if value.type=="多选题"}} +<#-- {{if value.optiona.length}}
A {{ value.optiona}}
{{/if}}--> +<#-- {{if (value.optionb.length)}}
B {{ value.optionb}}
{{/if}}--> +<#-- {{if (value.optionc.length)}}
C {{ value.optionc}}
{{/if}}--> +<#-- {{if (value.optiond.length)}}
D {{ value.optiond}}
{{/if}}--> +<#-- {{if (value.optione.length)}}
E {{ value.optione}}
{{/if}}--> +<#-- {{if (value.optionf.length)}}
F {{ value.optionf}}
{{/if}}--> + + {{if value.optiona.length}} + {{if judge(value.user_answer,"A")}} +
A {{ value.optiona}}
+ {{else}}
A {{ value.optiona}}
+ {{/if}} + {{/if}} + {{if (value.optionb.length)}} + {{if judge(value.user_answer,"B")}} +
B {{ value.optionb}}
+ {{else}}
B {{ value.optionb}}
+ {{/if}} + {{/if}} + {{if (value.optionc.length)}} + {{if judge(value.user_answer,"C")}} +
C {{ value.optionc}}
+ {{else}}
C {{ value.optionc}}
+ {{/if}} + {{/if}} + {{if (value.optiond.length)}} + {{if judge(value.user_answer,"D")}} +
D {{ value.optiond}}
+ {{else}}
D {{ value.optiond}}
+ {{/if}} + {{/if}} + {{if (value.optione.length)}} + {{if judge(value.user_answer,"E")}} +
E {{ value.optione}}
+ {{else}}
E {{ value.optione}}
+ {{/if}} + {{/if}} + {{if (value.optionf.length)}} + {{if judge(value.user_answer,"F")}} +
F {{ value.optionf}}
+ {{else}}
F {{ value.optionf}}
+ {{/if}} + {{/if}} + + {{/if}} + +<#-- {{if value.type=="3"}}--> +<#--
A 对
--> +<#--
B 错
--> +<#-- {{/if}}--> + + {{if value.type=="判断题"}} + {{if value.user_answer=="对"}} +
A 对
+
B 错
+ {{else if value.user_answer=="错"}} +
A 对
+
B 错
+ {{else}} +
A 对
+
B 错
+ {{/if}} + {{/if}} + + {{if value.type=="填空题"}} + 填空题答案格式:第一空答案,第二空答案,第三空答案
+ 答案: + {{/if}} + +<#-- {{if value.type=="4"}}{{/if}}--> + + {{if value.type=="问答题"}} +
答案: + {{/if}} + +
参考答案:{{value.answer}} + +
+
+<#-- --> +<#-- 合计:共7道85分--> +<#-- 问答:共1道20分|--> +<#-- 判断:共1道5分|--> +<#-- 多选:共2道30分|--> +<#-- 单选:共3道30分|--> +<#-- --> + + + 试卷总共: 题,合计分, + 考生得分:分 + +
+
diff --git a/WEB-INF/view/cetc54/exam/examresult_import.ftl b/WEB-INF/view/cetc54/exam/examresult_import.ftl new file mode 100644 index 0000000..3133346 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/examresult_import.ftl @@ -0,0 +1,27 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/examresult_list.ftl b/WEB-INF/view/cetc54/exam/examresult_list.ftl new file mode 100644 index 0000000..2071ca7 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/examresult_list.ftl @@ -0,0 +1,66 @@ +
+
+ + + + + +
+ + + + + + 请选择试卷: + + + +
+
+ + + + +<#-- --> + + + + + +<#-- total_score是通过SQL语句sum函数求每题得分计算而来--> + + + + + + + + +<#-- --> + +<#-- --> + + + + + + + + + +
操作序号id答题人部门试卷名称总分数答题时间判卷人
--> + +<#-- +<#-- onclick="editRow('{{value.id}}');">--> +<#-- +<#-- onclick="deleteRow('{{value.id}}');">--> +<#-- {{i+1}} +<#-- onclick="viewRow('{{value.id}}','{{value.name}}');">{{value.user}}{{value.id}}{{value.user}}{{value.department}}{{value.name}}{{value.total_score}}{{value.user_time | dateTimeFilter}}{{value.mark_teacher }}
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/examscore.ftl b/WEB-INF/view/cetc54/exam/examscore.ftl new file mode 100644 index 0000000..4c6acb7 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/examscore.ftl @@ -0,0 +1,14 @@ + + + + <#include "../layout/ref_head.ftl"> + + + + +<#include "examscore_list.ftl"> + +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/examscore_list.ftl b/WEB-INF/view/cetc54/exam/examscore_list.ftl new file mode 100644 index 0000000..1355c65 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/examscore_list.ftl @@ -0,0 +1,37 @@ +
+
+ + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
序号试卷名称考生工资号答题时间成绩
{{i+1}}{{value.name}}{{value.user}}{{value.user_id}}{{value.user_time | dateTimeFilter}}{{value.total_score}}
+
<#-- 分页--> +
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/question.ftl b/WEB-INF/view/cetc54/exam/question.ftl new file mode 100644 index 0000000..a3c3377 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/question.ftl @@ -0,0 +1,15 @@ + + + +<#include "../layout/ref_head.ftl"> + + + +<#include "questions_list.ftl"> +<#include "question_edit.ftl"> +
+
+<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/question_edit.ftl b/WEB-INF/view/cetc54/exam/question_edit.ftl new file mode 100644 index 0000000..4c1472a --- /dev/null +++ b/WEB-INF/view/cetc54/exam/question_edit.ftl @@ -0,0 +1,80 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/question_import.ftl b/WEB-INF/view/cetc54/exam/question_import.ftl new file mode 100644 index 0000000..bd43ad0 --- /dev/null +++ b/WEB-INF/view/cetc54/exam/question_import.ftl @@ -0,0 +1,26 @@ + +
+
+ + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/exam/questions_list.ftl b/WEB-INF/view/cetc54/exam/questions_list.ftl new file mode 100644 index 0000000..7ac1d5c --- /dev/null +++ b/WEB-INF/view/cetc54/exam/questions_list.ftl @@ -0,0 +1,62 @@ +
+
+ + + + + +
+ <#--<#if pg=="1">--> + + + + <#----> + + + <#----> + +
+
+ + + + + <#--<#if pg=="1">--> + + <#----> + + +<#-- 属性style="width: auto" 实现表格中各td平均分布,但是不能自由拖动--> + + + + + + + + + + <#--<#if pg=="1">--> + + <#----> + + + + + + + + +
操作序号题目类型题目试卷类别编辑时间创建人
+ + + + {{i+1}}{{value.question_type}}{{value.subject}}{{value.category}}{{value.edittime |dateTimeFilter}}{{value.creatperson}}
+
<#-- 分页--> +
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/feedback/feedback.ftl b/WEB-INF/view/cetc54/feedback/feedback.ftl new file mode 100644 index 0000000..1520149 --- /dev/null +++ b/WEB-INF/view/cetc54/feedback/feedback.ftl @@ -0,0 +1,14 @@ + + + +<#include "../layout/ref_head.ftl"> + <#----> + + +<#include "feedback_list.ftl" > +<#include "feedback_edit.ftl" > + +<#include "../layout/ref_script.ftl"> + +<#----> + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/feedback/feedback_edit.ftl b/WEB-INF/view/cetc54/feedback/feedback_edit.ftl new file mode 100644 index 0000000..4946438 --- /dev/null +++ b/WEB-INF/view/cetc54/feedback/feedback_edit.ftl @@ -0,0 +1,78 @@ +
+
+
+
+
+ +
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/feedback/feedback_list.ftl b/WEB-INF/view/cetc54/feedback/feedback_list.ftl new file mode 100644 index 0000000..828e241 --- /dev/null +++ b/WEB-INF/view/cetc54/feedback/feedback_list.ftl @@ -0,0 +1,46 @@ +
+
+ + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
操作序号反馈人联系方式评分反馈时间SessionID
+ + {{i+1}}{{value.username}}{{value.contact}}{{value.stars}}{{value.addtime |dateTimeFilter}}{{value.sessionid}}
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/groups/groups.ftl b/WEB-INF/view/cetc54/groups/groups.ftl new file mode 100644 index 0000000..1344d39 --- /dev/null +++ b/WEB-INF/view/cetc54/groups/groups.ftl @@ -0,0 +1,12 @@ + + + +<#include "../layout/ref_head.ftl"> + + +<#include "groups_list.ftl"> +<#include "groups_edit.ftl"> +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/groups/groups_edit.ftl b/WEB-INF/view/cetc54/groups/groups_edit.ftl new file mode 100644 index 0000000..4d71312 --- /dev/null +++ b/WEB-INF/view/cetc54/groups/groups_edit.ftl @@ -0,0 +1,22 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/groups/groups_list.ftl b/WEB-INF/view/cetc54/groups/groups_list.ftl new file mode 100644 index 0000000..45a0a95 --- /dev/null +++ b/WEB-INF/view/cetc54/groups/groups_list.ftl @@ -0,0 +1,51 @@ +
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
操作序号用户组名称创建人创建人部门创建时间备注
+ + + + {{i+1}}{{value.name}}{{value.username}}{{value.orgname}}{{value.creater_time |dateTimeFilter}}{{value.reamrk}}
+
+
diff --git a/WEB-INF/view/cetc54/inbox.ftl b/WEB-INF/view/cetc54/inbox.ftl new file mode 100644 index 0000000..a77fae6 --- /dev/null +++ b/WEB-INF/view/cetc54/inbox.ftl @@ -0,0 +1,108 @@ + + + +<#include "layout/ref_head.ftl"> + + + +
+
+
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + +
序号标题内容发送人发送时间
{{i+1}}{{value.msgtitle}}{{value.msgcontent}}{{value.username}}({{value.usercode}}){{value.sendtime |dateFilter}}
+
+
+
+
+
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
序号标题内容发送人发送时间阅读时间
{{i+1}}{{value.msgtitle}}{{value.msgcontent}}{{value.username}}({{value.usercode}}){{value.sendtime |dateFilter}}{{value.readtime |dateFilter}}
+
+
+
+
+<#include "inbox_edit.ftl"> +<#include "layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/inbox_edit.ftl b/WEB-INF/view/cetc54/inbox_edit.ftl new file mode 100644 index 0000000..5b5561d --- /dev/null +++ b/WEB-INF/view/cetc54/inbox_edit.ftl @@ -0,0 +1,10 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/index.ftl b/WEB-INF/view/cetc54/index.ftl new file mode 100644 index 0000000..de6a5df --- /dev/null +++ b/WEB-INF/view/cetc54/index.ftl @@ -0,0 +1,74 @@ + + + +<#include "layout/ref_head.ftl"> + + + + + +<#include "layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/jcdp平台视图文件.txt b/WEB-INF/view/cetc54/jcdp平台视图文件.txt new file mode 100644 index 0000000..65ed467 --- /dev/null +++ b/WEB-INF/view/cetc54/jcdp平台视图文件.txt @@ -0,0 +1 @@ +警告:请勿修改文件夹内文件 \ No newline at end of file diff --git a/WEB-INF/view/cetc54/layout/bottom.ftl b/WEB-INF/view/cetc54/layout/bottom.ftl new file mode 100644 index 0000000..d5fe107 --- /dev/null +++ b/WEB-INF/view/cetc54/layout/bottom.ftl @@ -0,0 +1,22 @@ +
+
登录账号:${userInfo.userName}      + <#if userInfo.defaultOrgInfo??>所属部门: + <#if (userInfo.orgList?size)==1> + ${userInfo.defaultOrgInfo.name} + <#else> + + + +
+
${copyright} 应用版本:${jcdpVersion}
+
diff --git a/WEB-INF/view/cetc54/layout/header.ftl b/WEB-INF/view/cetc54/layout/header.ftl new file mode 100644 index 0000000..d7722df --- /dev/null +++ b/WEB-INF/view/cetc54/layout/header.ftl @@ -0,0 +1,26 @@ +
+ +
+
+ + + + + +
+
+ + + + + +
+ +
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/layout/ref_head.ftl b/WEB-INF/view/cetc54/layout/ref_head.ftl new file mode 100644 index 0000000..fa29bb0 --- /dev/null +++ b/WEB-INF/view/cetc54/layout/ref_head.ftl @@ -0,0 +1,13 @@ +${appTitle} + + + + + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/layout/ref_script.ftl b/WEB-INF/view/cetc54/layout/ref_script.ftl new file mode 100644 index 0000000..4ade5b3 --- /dev/null +++ b/WEB-INF/view/cetc54/layout/ref_script.ftl @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/log/log.ftl b/WEB-INF/view/cetc54/log/log.ftl new file mode 100644 index 0000000..f619a74 --- /dev/null +++ b/WEB-INF/view/cetc54/log/log.ftl @@ -0,0 +1,52 @@ + + + + <#include "../layout/ref_head.ftl"> + + +
+
+ + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号会话ID登录账户用户姓名操作路径操作内容备注用时(秒)操作时间
{{i+1}}{{value.sessionid}}{{value.loginname}}{{value.username}}{{value.actionurl}}{{value.action}}{{value.remark}}{{value.spendtime}}{{value.createtime |dateTimeFilter}}
+
+
+<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/log/session.ftl b/WEB-INF/view/cetc54/log/session.ftl new file mode 100644 index 0000000..4eb15d7 --- /dev/null +++ b/WEB-INF/view/cetc54/log/session.ftl @@ -0,0 +1,88 @@ + + + + <#include "../layout/ref_head.ftl"> + + + +
+
+ + + + + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号会话ID状态账户姓名客户端ip客户端类型服务器节点创建时间失效时间
+ {{if value.sessionid!='${currentSessionId}'}} + {{if value.sessionstate==1}} + + {{/if}} + {{/if}} + {{i+1}}{{value.sessionid}}{{value.loginname}}{{value.username}}{{value.ipaddress}}{{value.clienttype |userAgentFilter}}{{value.owner}}{{value.createtime |dateTimeFilter}}{{value.invalidtime |dateTimeFilter}}
+
+
+ +<#include "../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/login.ftl b/WEB-INF/view/cetc54/login.ftl new file mode 100644 index 0000000..9acd1e4 --- /dev/null +++ b/WEB-INF/view/cetc54/login.ftl @@ -0,0 +1,54 @@ + + + +<#include "layout/ref_head.ftl"> + + + +
+ + +
+
${copyright}
+
技术支持:${techSupport}
+ <#----> +
+ + + +<#include "layout/ref_script.ftl"> + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/module/module.ftl b/WEB-INF/view/cetc54/module/module.ftl new file mode 100644 index 0000000..1aaeba5 --- /dev/null +++ b/WEB-INF/view/cetc54/module/module.ftl @@ -0,0 +1,30 @@ + + + + <#include "../layout/ref_head.ftl"> + + + +
+
+
+ + +
+ +
+
+ <#include "module_list.ftl"> +
+
+
+
+<#include "module_edit.ftl"> +<#include "../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/module/module_controllerlist.ftl b/WEB-INF/view/cetc54/module/module_controllerlist.ftl new file mode 100644 index 0000000..2462854 --- /dev/null +++ b/WEB-INF/view/cetc54/module/module_controllerlist.ftl @@ -0,0 +1,20 @@ +
+ + + + + + + + + + + + + + + +
选择功能模块主页面地址
+ {{value.name}}{{value.href}}
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/module/module_edit.ftl b/WEB-INF/view/cetc54/module/module_edit.ftl new file mode 100644 index 0000000..457709e --- /dev/null +++ b/WEB-INF/view/cetc54/module/module_edit.ftl @@ -0,0 +1,81 @@ +
+
+
+
+
+<#include "module_controllerlist.ftl"> +
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/module/module_list.ftl b/WEB-INF/view/cetc54/module/module_list.ftl new file mode 100644 index 0000000..b62c3b2 --- /dev/null +++ b/WEB-INF/view/cetc54/module/module_list.ftl @@ -0,0 +1,56 @@ +
+
+ + + + + +
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
操作序号功能模块主页面地址自动展开排序号节点图标上级功能模块热键
+ + + {{i+1}}{{value.name}}{{value.href}}{{value.is_auto_expand |istrueFilter}}{{value.sort_no}}{{value.icon_name}}{{value.parent_name}}{{value.hotkey}}
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/no_permission.ftl b/WEB-INF/view/cetc54/no_permission.ftl new file mode 100644 index 0000000..50e6ff7 --- /dev/null +++ b/WEB-INF/view/cetc54/no_permission.ftl @@ -0,0 +1,10 @@ + + + + + + + +没有权限! + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/parameter/edit.ftl b/WEB-INF/view/cetc54/parameter/edit.ftl new file mode 100644 index 0000000..2da0d55 --- /dev/null +++ b/WEB-INF/view/cetc54/parameter/edit.ftl @@ -0,0 +1,39 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/parameter/index.ftl b/WEB-INF/view/cetc54/parameter/index.ftl new file mode 100644 index 0000000..8c3c907 --- /dev/null +++ b/WEB-INF/view/cetc54/parameter/index.ftl @@ -0,0 +1,24 @@ + + + + <#include "../layout/ref_head.ftl"> + + + +
+
+ +
+
+ <#include "list.ftl"> + <#include "edit.ftl"> +
+
+<#include "../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/parameter/list.ftl b/WEB-INF/view/cetc54/parameter/list.ftl new file mode 100644 index 0000000..1d7e82f --- /dev/null +++ b/WEB-INF/view/cetc54/parameter/list.ftl @@ -0,0 +1,47 @@ +
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
操作序号参数名称说明
+ {{i+1}}{{value.name}}{{value.keykey}}{{value.value}}{{value.note}}
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/personalcenter/mylaunch.ftl b/WEB-INF/view/cetc54/personalcenter/mylaunch.ftl new file mode 100644 index 0000000..4fc7194 --- /dev/null +++ b/WEB-INF/view/cetc54/personalcenter/mylaunch.ftl @@ -0,0 +1,50 @@ + + + + <#include "../layout/ref_head.ftl"> + + + +
+
+
+
+ + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + +
序号任务名称任务类型
{{i+1}}{{value.taskname}}{{value.application}}
+
+
+
+
+<#include "mylaunch_list.ftl"> +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/personalcenter/mylaunch_list.ftl b/WEB-INF/view/cetc54/personalcenter/mylaunch_list.ftl new file mode 100644 index 0000000..ef08df5 --- /dev/null +++ b/WEB-INF/view/cetc54/personalcenter/mylaunch_list.ftl @@ -0,0 +1,11 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/personalcenter/mymanage.ftl b/WEB-INF/view/cetc54/personalcenter/mymanage.ftl new file mode 100644 index 0000000..79383cc --- /dev/null +++ b/WEB-INF/view/cetc54/personalcenter/mymanage.ftl @@ -0,0 +1,17 @@ + + + + <#include "../layout/ref_head.ftl"> + + + +<#include "mymanage_list.ftl"> + +
+
+ + +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/personalcenter/mymanage_list.ftl b/WEB-INF/view/cetc54/personalcenter/mymanage_list.ftl new file mode 100644 index 0000000..539e9ba --- /dev/null +++ b/WEB-INF/view/cetc54/personalcenter/mymanage_list.ftl @@ -0,0 +1,57 @@ +
+
+ + + + + +
+ + + +<#-- --> +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号申请名称申请类型申请单位申请人申请时间联系电话审批人审批时间审批意见审批结果
{{i+1}}{{value.name}}{{value.application}} +<#-- --> + {{value.addgroupname}} +<#-- --> + {{value.addusername}}{{value.addtime | dateTimeFilter}}{{value.tel}}{{value.spusername}}{{value.spdate | dateTimeFilter}}{{value.yj}}{{value.spresult | spresultFilter }}
+
<#-- 分页--> +
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/portal.ftl b/WEB-INF/view/cetc54/portal.ftl new file mode 100644 index 0000000..f3c6150 --- /dev/null +++ b/WEB-INF/view/cetc54/portal.ftl @@ -0,0 +1,19 @@ + + + +<#include "layout/ref_head.ftl"> + + + + +<#include "portal_common.ftl"> +
+ +
+<#include "inbox_edit.ftl"> +<#include "task/myApply_view.ftl"> +<#include "task/myTask_view.ftl"> + +<#include "layout/ref_script.ftl"> + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/portal_common.ftl b/WEB-INF/view/cetc54/portal_common.ftl new file mode 100644 index 0000000..cd5540a --- /dev/null +++ b/WEB-INF/view/cetc54/portal_common.ftl @@ -0,0 +1,105 @@ +
+ +
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/portal_custom.ftl b/WEB-INF/view/cetc54/portal_custom.ftl new file mode 100644 index 0000000..8651c29 --- /dev/null +++ b/WEB-INF/view/cetc54/portal_custom.ftl @@ -0,0 +1,14 @@ + + + +<#include "layout/ref_head.ftl"> + + + +
+ 业务系统自定义视图:
可以在系统管理->键值参数->首页设置
中修改 portalCustomUrl键值。 +
+<#include "layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/qualification/qualification.ftl b/WEB-INF/view/cetc54/qualification/qualification.ftl new file mode 100644 index 0000000..9fa1120 --- /dev/null +++ b/WEB-INF/view/cetc54/qualification/qualification.ftl @@ -0,0 +1,13 @@ + + + +<#include "../layout/ref_head.ftl"> + + +<#include "qualification_list.ftl"> +<#include "qualification_edit.ftl"> +<#include "../layout/ref_script.ftl"> + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/qualification/qualification_edit.ftl b/WEB-INF/view/cetc54/qualification/qualification_edit.ftl new file mode 100644 index 0000000..4cca29c --- /dev/null +++ b/WEB-INF/view/cetc54/qualification/qualification_edit.ftl @@ -0,0 +1,33 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/qualification/qualification_list.ftl b/WEB-INF/view/cetc54/qualification/qualification_list.ftl new file mode 100644 index 0000000..745c4a9 --- /dev/null +++ b/WEB-INF/view/cetc54/qualification/qualification_list.ftl @@ -0,0 +1,58 @@ +
+
+ + + + + +
+ + +<#-- --> + +<#-- --> + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
操作序号战略名称战术培训名称内容备注
+ + + + {{i+1}}{{value.zlname}}{{value.zsname}}{{value.content}}{{value.remark}}
+
+ +
+ + diff --git a/WEB-INF/view/cetc54/qualification/qualificationjob.ftl b/WEB-INF/view/cetc54/qualification/qualificationjob.ftl new file mode 100644 index 0000000..e4e41fb --- /dev/null +++ b/WEB-INF/view/cetc54/qualification/qualificationjob.ftl @@ -0,0 +1,12 @@ + + + +<#include "../layout/ref_head.ftl"> + + +<#include "qualificationjob_list.ftl"> +<#include "qualificationjob_edit.ftl"> +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/qualification/qualificationjob_edit.ftl b/WEB-INF/view/cetc54/qualification/qualificationjob_edit.ftl new file mode 100644 index 0000000..c321f27 --- /dev/null +++ b/WEB-INF/view/cetc54/qualification/qualificationjob_edit.ftl @@ -0,0 +1,68 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/qualification/qualificationjob_list.ftl b/WEB-INF/view/cetc54/qualification/qualificationjob_list.ftl new file mode 100644 index 0000000..1ff10c9 --- /dev/null +++ b/WEB-INF/view/cetc54/qualification/qualificationjob_list.ftl @@ -0,0 +1,51 @@ +
+
+ + + + + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
操作序号课程序列战术培训名称级别培训课程证书要求
+ + + + {{i+1}}{{value.kcxl}}{{value.zsmc}}{{value.level}}{{value.pxkc}}{{value.zsyq}}
+
+
diff --git a/WEB-INF/view/cetc54/research/research_project_exam_main.ftl b/WEB-INF/view/cetc54/research/research_project_exam_main.ftl new file mode 100644 index 0000000..3bca049 --- /dev/null +++ b/WEB-INF/view/cetc54/research/research_project_exam_main.ftl @@ -0,0 +1,38 @@ + + + +<#include "../layout/ref_head.ftl"> + + + + +<#include "research_project_exam_main_list.ftl"> +<#--<#include "research_project_main_edit.ftl">--> + +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +<#include "../layout/ref_script.ftl"> + + + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/research/research_project_exam_main_edit.ftl b/WEB-INF/view/cetc54/research/research_project_exam_main_edit.ftl new file mode 100644 index 0000000..2151a4f --- /dev/null +++ b/WEB-INF/view/cetc54/research/research_project_exam_main_edit.ftl @@ -0,0 +1,36 @@ + + +
+
diff --git a/WEB-INF/view/cetc54/research/research_project_exam_main_list.ftl b/WEB-INF/view/cetc54/research/research_project_exam_main_list.ftl new file mode 100644 index 0000000..7d1d1b3 --- /dev/null +++ b/WEB-INF/view/cetc54/research/research_project_exam_main_list.ftl @@ -0,0 +1,90 @@ + +
+
+ + + + + +
+ + <#if pg=="2"> + + + + + + + + + + + + + <#if pg=="3"> + + + + + <#if pg=="4"> + + + + <#if pg=="5"> + + + + + + + +
+
+ + + + + + + + + + + <#----> + <#----> + <#----> + + + + + + + + + + + <#----> + <#----> + <#----> + + +
操作序号活动类型活动名称活动状态发起人发起人所在单位发起时间
+ + + + {{i+1}}{{value.name}}{{value.wjmc}}{{value.state}}{{value.username}}{{value.orgname}}{{value.creater_time |dateTimeFilter}}
+
+
diff --git a/WEB-INF/view/cetc54/research/research_project_main.ftl b/WEB-INF/view/cetc54/research/research_project_main.ftl new file mode 100644 index 0000000..d393056 --- /dev/null +++ b/WEB-INF/view/cetc54/research/research_project_main.ftl @@ -0,0 +1,24 @@ + + + +<#include "../layout/ref_head.ftl"> + + +<#include "research_project_main_list.ftl"> +<#--<#include "research_project_main_edit.ftl">--> + +
+
+ +
+
+ +
+
+ +<#include "../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/research/research_project_main_edit.ftl b/WEB-INF/view/cetc54/research/research_project_main_edit.ftl new file mode 100644 index 0000000..13f42ff --- /dev/null +++ b/WEB-INF/view/cetc54/research/research_project_main_edit.ftl @@ -0,0 +1,15 @@ + + +
+
diff --git a/WEB-INF/view/cetc54/research/research_project_main_examadd_ks.ftl b/WEB-INF/view/cetc54/research/research_project_main_examadd_ks.ftl new file mode 100644 index 0000000..df131c0 --- /dev/null +++ b/WEB-INF/view/cetc54/research/research_project_main_examadd_ks.ftl @@ -0,0 +1,169 @@ + + + + + + +
+ 新员工入职培训需求调查 +
+ 各位同学:您好!为了更好的了解您对企业新员工入职培训的看法和自身需求,以便进行准确的分析,从而向企业提供更加适宜的培训方案和建议。 + 在此,请允许我们占用您宝贵的时间完成该问卷,请仔细阅读题目,并选择您认为最合适的选项,对于您的理解和支持,我们不胜感激。 + 我们将对你提供的信息严格保密,祝您工作愉快! +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + {{if value.qtype=="3" }}{{dlcount++}}{{/if}} + {{if value.bd=="1"}}*{{/if}}{{if value.qtype!="3" }}Q{{/if}}{{if value.qtype!="3" }}{{i+1-dlcount}}{{/if}} + + {{value.tm}} + + {{if value.qtype=="0"}}单选题{{/if}} + {{if value.qtype=="1"}}多选题{{/if}} + {{if value.qtype=="2"}}问答题{{/if}} + {{if value.bd=="1"}}(必答){{/if}} + {{if value.bd=="0"}}(选答){{/if}} + +
+ + {{if value.qtype!="2"}} + {{if value.qtype!="3"}} + {{if value.a1.length}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + A {{ value.a1}}
{{/if}} + {{if (value.a2.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + B {{ value.a2}}
{{/if}} + {{if (value.a3.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + C {{ value.a3}}
{{/if}} + {{if (value.a4.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + D {{ value.a4}}
{{/if}} + {{if (value.a5.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + E {{ value.a5}}
{{/if}} + {{if (value.a6.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + F {{ value.a6}}
{{/if}} + {{if (value.a7.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + G {{ value.a7}}
{{/if}} + {{if (value.a8.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + H {{ value.a8}}
{{/if}} + {{if (value.a9.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + I {{ value.a9}}
{{/if}} + {{if (value.a10.length)}}
+ {{if value.qtype==0}}{{/if}} + + {{if value.qtype==1}}{{/if}} + J {{ value.a10}}
{{/if}} + {{/if}} + {{/if}} + {{if value.qtype=="2"}} +
上传资料附件:
说明:上传文件需小于2GB,严禁上传涉密文件!
资料附件: + {{filename}} +
上传资料期限: + +
发放范围: + <#if pg=='1' || pg=='3'> + {{if limitation == "1"}} + {{else}} + {{/if}} + {{if limitation == "2"}} + {{else}} + {{/if}} + {{if limitation == "3"}} + {{else}} + {{/if}} + + <#if pg=='2'> + {{if limitation == "4"}} + {{else}} + {{/if}} + {{if limitation == "5"}} + {{else}} + {{/if}} + +
+ + +
+
+<#include 'file_limitation.ftl'> + +<#--
--> +<#--
--> +<#--
--> +<#--
--> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_history.ftl b/WEB-INF/view/cetc54/resource/file_history.ftl new file mode 100644 index 0000000..05e6385 --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_history.ftl @@ -0,0 +1,8 @@ +
+<#--
--> +<#--
--> + <#include "file_history_add.ftl"> +
+<#----> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_history_add.ftl b/WEB-INF/view/cetc54/resource/file_history_add.ftl new file mode 100644 index 0000000..a0cd344 --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_history_add.ftl @@ -0,0 +1,31 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号标题提供者上传时间状态审批意见审批人审批时间
{{i+1}}{{value.title}} {{value.provider}}{{value.uploadtime | dateTimeFilter}}{{value.state_desc}}{{value.approver_suggestion}}{{value.approver}}{{value.approver_edittime | dateTimeFilter}}
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_leader_suggestion.ftl b/WEB-INF/view/cetc54/resource/file_leader_suggestion.ftl new file mode 100644 index 0000000..50c61e3 --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_leader_suggestion.ftl @@ -0,0 +1,13 @@ +
+
部门领导审批
+ + + + + +
审批意见: + +
+
+<#--须放到form里面,然后初始化form,使用的是模板,textarea里写的才能必答--> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_limitation.ftl b/WEB-INF/view/cetc54/resource/file_limitation.ftl new file mode 100644 index 0000000..22682d4 --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_limitation.ftl @@ -0,0 +1,56 @@ + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_limitation_add.ftl b/WEB-INF/view/cetc54/resource/file_limitation_add.ftl new file mode 100644 index 0000000..8355f36 --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_limitation_add.ftl @@ -0,0 +1,18 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_limitation_class.ftl b/WEB-INF/view/cetc54/resource/file_limitation_class.ftl new file mode 100644 index 0000000..5924acd --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_limitation_class.ftl @@ -0,0 +1,18 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_limitation_course.ftl b/WEB-INF/view/cetc54/resource/file_limitation_course.ftl new file mode 100644 index 0000000..72084fc --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_limitation_course.ftl @@ -0,0 +1,18 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_limitation_person.ftl b/WEB-INF/view/cetc54/resource/file_limitation_person.ftl new file mode 100644 index 0000000..728d6dc --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_limitation_person.ftl @@ -0,0 +1,28 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/file_list.ftl b/WEB-INF/view/cetc54/resource/file_list.ftl new file mode 100644 index 0000000..93abdb7 --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_list.ftl @@ -0,0 +1,108 @@ +
+
+ + + + + +
+ <#if pg=='1' || pg=='2'> + <#if pg_check!='5'> + + + + + + <#if pg=='3'> + + + <#if pg=='4'> + + + <#if pg=='1'|| pg=='3'|| pg=='4'> + + + + + <#if pg=="3" || pg=="4"> +<#-- --> + + + + + + +
+
+ + + + +<#-- <#if has_edit>--> + +<#-- --> + + + + + + + + <#if pg!='2'> + <#if pg_check!='5'> + +<#-- --> +<#-- --> + + + + + + + + + + + + + + + + <#if pg!='2'> + <#if pg_check!='5'> + +<#-- --> +<#-- --> + + + + +
操作序号标题资料分类提供者部门上传时间好评量状态部门管理员审批意见部门领导审批意见
+<#-- <#if has_edit>--> + <#if pg_check!='5'> + + + + + +<#-- --> + <#-- + <#--onclick="swfVideo(['{{value.id}}'])">--> + {{i+1}}{{value.title}}{{value.categoryid | fileCateFilter}}{{value.provider}}{{value.providerdepartname}}{{value.uploadtime | dateTimeFilter}} + {{value.sumok}} + + {{value.state_desc}}{{value.admin_suggestion}}{{value.leader_advice}}
+
+
+
+
diff --git a/WEB-INF/view/cetc54/resource/file_suggestion.ftl b/WEB-INF/view/cetc54/resource/file_suggestion.ftl new file mode 100644 index 0000000..b50da19 --- /dev/null +++ b/WEB-INF/view/cetc54/resource/file_suggestion.ftl @@ -0,0 +1,17 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/swfVideo.ftl b/WEB-INF/view/cetc54/resource/swfVideo.ftl new file mode 100644 index 0000000..0df4562 --- /dev/null +++ b/WEB-INF/view/cetc54/resource/swfVideo.ftl @@ -0,0 +1,4 @@ +
+
+
+
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/resource/train_workflow.ftl b/WEB-INF/view/cetc54/resource/train_workflow.ftl new file mode 100644 index 0000000..017898c --- /dev/null +++ b/WEB-INF/view/cetc54/resource/train_workflow.ftl @@ -0,0 +1,22 @@ +
+ +
+ + + + + + + + + +<#-- --> + + + + +
序号审批节点
{{i+1}}{{value.num}}{{value.leader}}
+<#--
--> +
+ +
\ No newline at end of file diff --git a/WEB-INF/view/cetc54/role/role.ftl b/WEB-INF/view/cetc54/role/role.ftl new file mode 100644 index 0000000..af9b480 --- /dev/null +++ b/WEB-INF/view/cetc54/role/role.ftl @@ -0,0 +1,19 @@ + + + +<#include "../layout/ref_head.ftl"> + + +<#include "role_list.ftl"> +<#include "role_edit.ftl"> +<#include "role_module.ftl"> +<#include "role_user.ftl"> +<#include "role_batchroletype.ftl"> + +<#include "../layout/ref_script.ftl"> + + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/role/role_batchroletype.ftl b/WEB-INF/view/cetc54/role/role_batchroletype.ftl new file mode 100644 index 0000000..664110a --- /dev/null +++ b/WEB-INF/view/cetc54/role/role_batchroletype.ftl @@ -0,0 +1,14 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/role/role_edit.ftl b/WEB-INF/view/cetc54/role/role_edit.ftl new file mode 100644 index 0000000..793833a --- /dev/null +++ b/WEB-INF/view/cetc54/role/role_edit.ftl @@ -0,0 +1,34 @@ +
+
+
+
+ \ No newline at end of file diff --git a/WEB-INF/view/cetc54/role/role_list.ftl b/WEB-INF/view/cetc54/role/role_list.ftl new file mode 100644 index 0000000..9b9d61a --- /dev/null +++ b/WEB-INF/view/cetc54/role/role_list.ftl @@ -0,0 +1,110 @@ +
+
+ + + + + +
+ <#if op_Add> + + + <#if op_Delete> + + + <#if op_Add&&op_Delete> + + + <#if op_setPermission||op_setRoleUsers> + + + <#if (op_setPermission||op_setRoleUsers)&&op_RoleStatus> + + + <#if op_RoleStatus> + + + + +
+
+ + + + + <#if op_Eidt||op_Delete> + + + + + + + + + + + + + + + + <#if op_Eidt||op_Delete> + + + + + + + + + + + + +
操作序号角色名称当前状态角色类型创建人创建人部门创建时间备注
+ <#if op_Eidt> + + + + <#if op_Eidt&&op_Delete> + <#if op_Delete> + + + {{i+1}}{{value.name}}{{value.status |statusFilter}}{{value.roletype |roletypeFilter}}{{value.username}}{{value.orgname}}{{value.creater_time |dateTimeFilter}}{{value.reamrk}}
+
+
+ + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/role/role_module.ftl b/WEB-INF/view/cetc54/role/role_module.ftl new file mode 100644 index 0000000..9e8d2f0 --- /dev/null +++ b/WEB-INF/view/cetc54/role/role_module.ftl @@ -0,0 +1,3 @@ +
+
    +
    \ No newline at end of file diff --git a/WEB-INF/view/cetc54/role/role_user.ftl b/WEB-INF/view/cetc54/role/role_user.ftl new file mode 100644 index 0000000..b8d7e46 --- /dev/null +++ b/WEB-INF/view/cetc54/role/role_user.ftl @@ -0,0 +1,98 @@ +
    +
    +
    + 组织架构树 + +
    +
      +
      +
      +
      +
      + + + + + +
      + 未授权用户 + + +
      +
      + + + + + + + + + + + + + + + + + + + +
      序号登录账户用户姓名所属组织
      {{i+1}}{{value.loginname}}{{value.username}}{{value.orgs |orgFilter}}
      +
      +
      +
      +
      +
      + +
      +
      + +
      +
      +
      +
      +
      + + + + + +
      + 已授权用户 + + + +
      +
      + + + + + + + + + + + + + + + + + + + +
      序号登录账户用户姓名角色授权
      {{i+1}}{{value.loginname}}{{value.username}}{{value.roletype | userRoletypeFilter}}
      +
      +
      +
      + +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/task/myApply.ftl b/WEB-INF/view/cetc54/task/myApply.ftl new file mode 100644 index 0000000..cd7cf6d --- /dev/null +++ b/WEB-INF/view/cetc54/task/myApply.ftl @@ -0,0 +1,95 @@ + + + +<#include "../layout/ref_head.ftl"> + + + +
      +
      +
      +
      + + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + +
      序号任务名称申请时间任务状态审批人
      {{i+1}}{{value.applytitle}}{{value.applytime |dateTimeFilter}}{{value.taskstatus}} {{each value.users as user i}} + + {{/each}} +
      +
      +
      +
      +
      +
      +
      + + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + +
      序号任务名称申请时间完成时间流程用时(时)
      {{i+1}}{{value.applytitle}}{{value.applytime |dateTimeFilter}}{{value.finishtime |dateTimeFilter}}{{value.finishtime-value.applytime |userTimeFilter}}
      +
      +
      +
      +
      +<#include "myApply_view.ftl"> +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/task/myApply_view.ftl b/WEB-INF/view/cetc54/task/myApply_view.ftl new file mode 100644 index 0000000..00374f5 --- /dev/null +++ b/WEB-INF/view/cetc54/task/myApply_view.ftl @@ -0,0 +1,26 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/task/myTask.ftl b/WEB-INF/view/cetc54/task/myTask.ftl new file mode 100644 index 0000000..11544f2 --- /dev/null +++ b/WEB-INF/view/cetc54/task/myTask.ftl @@ -0,0 +1,98 @@ + + + +<#include "../layout/ref_head.ftl"> + + + +
      +
      +
      +
      + + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + +
      序号任务名称申请人申请时间当前状态
      {{i+1}}{{value.applytitle}}{{value.username}}({{value.usercode}}){{value.applytime |dateTimeFilter}}{{value.taskstatus}}
      +
      +
      +
      +
      +
      +
      + + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      序号任务名称申请人申请时间审批节点审批时间申请进行状态
      {{i+1}}{{value.applytitle}}{{value.username}}({{value.usercode}}){{value.applytime |dateTimeFilter}}{{value.taskstatus}}{{value.finishtime |dateTimeFilter}}
      +
      +
      +
      +
      +<#include "myTask_view.ftl"> +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/task/myTask_view.ftl b/WEB-INF/view/cetc54/task/myTask_view.ftl new file mode 100644 index 0000000..482db62 --- /dev/null +++ b/WEB-INF/view/cetc54/task/myTask_view.ftl @@ -0,0 +1,12 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/toolkit/icon.ftl b/WEB-INF/view/cetc54/toolkit/icon.ftl new file mode 100644 index 0000000..935e8b3 --- /dev/null +++ b/WEB-INF/view/cetc54/toolkit/icon.ftl @@ -0,0 +1,35 @@ + + + +<#include "../layout/ref_head.ftl"> + + +
      +
      + + +
      +
      +
        搜索: 图标名称:
      +
      +
      +
      +
      + +
      +
      + + +<#include "../layout/ref_script.ftl"> + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/createclassaudit/audithistory_list.ftl b/WEB-INF/view/cetc54/train/createclassaudit/audithistory_list.ftl new file mode 100644 index 0000000..9673794 --- /dev/null +++ b/WEB-INF/view/cetc54/train/createclassaudit/audithistory_list.ftl @@ -0,0 +1,33 @@ + + + + <#include "../../layout/ref_head.ftl"> + + +
      + + + + + + + + + + + + + + + + + + +
      序号审核意见审核人审核时间审核操作
      {{i+1}}{{value.yj}}{{value.spusername}}{{value.spdate | ndatetimeFilter}}{{value.spresult | optionFilter}}
      +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + diff --git a/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main.ftl b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main.ftl new file mode 100644 index 0000000..d72e6c4 --- /dev/null +++ b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main.ftl @@ -0,0 +1,20 @@ + + + +<#include "../../layout/ref_head.ftl"> + + + +<#include "pd_createclass_main_list.ftl"> + +
      +
      +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_corp.ftl b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_corp.ftl new file mode 100644 index 0000000..6673447 --- /dev/null +++ b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_corp.ftl @@ -0,0 +1,41 @@ +
      +
      + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + +
      操作序号下发部门名称最少报名人数
      + + {{i+1}} + +
      +
      diff --git a/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_edit.ftl b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_edit.ftl new file mode 100644 index 0000000..9aef2f7 --- /dev/null +++ b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_edit.ftl @@ -0,0 +1,224 @@ + + + +
      +
      + +<#include "pd_createclass_main_corp.ftl"> +<#include "pd_createclass_main_user.ftl"> + +
      +
      +
      + +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_list.ftl b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_list.ftl new file mode 100644 index 0000000..97a876c --- /dev/null +++ b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_list.ftl @@ -0,0 +1,77 @@ + +
      +
      + + + + + + + +
      + + + 审核状态: + + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <#----> + + + +
      操作序号课程名称课程所属班级名称课程序列部门开始时间结束时间状态
      + {{if value.status == 3}} + 审核 + {{/if}} + {{i+1}} + {{if value.status == 3}} + {{value.kcmc}} + {{else}} + {{value.kcmc}} + {{/if}} + {{value.jhly | jhlyFilter}}{{value.bjmc}}{{value.bjlb}}{{value.addgroupname}}{{value.starttime | dateFilter}}{{value.endtime | dateFilter}}{{value.pxmb}}{{value.status | classStatusFilter}}
      +
      + +
      diff --git a/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_user.ftl b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_user.ftl new file mode 100644 index 0000000..bcc0ca0 --- /dev/null +++ b/WEB-INF/view/cetc54/train/createclassaudit/pd_createclass_main_user.ftl @@ -0,0 +1,74 @@ +
      +
      + + + + +
      + + +
      + + + 模版下载 +
      +
      +
      +
      + + + + + + + + <#----> + <#--<#––>--> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + + + + + + + + <#----> + <#--<#––>--> + <#--<#––>--> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + + +
      操作序号姓名部门工资号职务(职称)设计师系统级别移动电话*部门岗位序列*姓名*工资号职称设计师系统级别移动电话
      + + + {{i+1}}
      + <#--
      --> +
      diff --git a/WEB-INF/view/cetc54/train/groupinplan/excel.ftl b/WEB-INF/view/cetc54/train/groupinplan/excel.ftl new file mode 100644 index 0000000..6d9df2a --- /dev/null +++ b/WEB-INF/view/cetc54/train/groupinplan/excel.ftl @@ -0,0 +1,7 @@ +
      +
      + +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group.ftl b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group.ftl new file mode 100644 index 0000000..b45a532 --- /dev/null +++ b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group.ftl @@ -0,0 +1,24 @@ + + + +<#include "../../layout/ref_head.ftl"> + + + +<#--<#include "group_inplan_main_list.ftl">--> +<#include "group_inplan_group_list.ftl"> +<#include "../train_workflow.ftl"> + +
      +
      +
      +
      +
      +
      + +
      +
      +<#include "../../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_detail.ftl b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_detail.ftl new file mode 100644 index 0000000..4edfb64 --- /dev/null +++ b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_detail.ftl @@ -0,0 +1,105 @@ +
      +
      + + + + +
      + + + +
      + + + 模版下载 +
      +
      + <#----> +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + + + + + + + +
      操作序号*课程序列培训对象入职年限*课程名称课程内容内部授课人外部授课人培训时间培训方式*计划人数是否外派培训预算(元)
      姓名工资号姓名单位
      + + {{i+1}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}}{{value.pxdx}} + + + + + + + + +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_detail_view.ftl b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_detail_view.ftl new file mode 100644 index 0000000..7e49b7e --- /dev/null +++ b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_detail_view.ftl @@ -0,0 +1,83 @@ +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + <#----> + + +
      序号*课程序列培训对象入职年限*课程名称课程内容内部授课人外部授课人培训时间培训方式*计划人数是否外派培训预算(元)已使用培训费用(元)课程状态
      姓名工资号姓名单位
      {{i+1}}{{value.kcxl}}{{value.pxdx}}{{value.rznx}}{{value.kcmc}}{{value.kcnr}}{{value.nbxm}}{{value.nbgzh}}{{value.wbxm}}{{value.wbdw}}{{value.pxsj}}{{value.pxfs}}{{value.pxrs}}{{value.sfwp}}{{value.pxys}}{{value.usedfund}}{{value.coursestatus}}--> + <#----> + <#----> + + <#----> + <#----> + + <#----> + <#----> + <#--
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_edit.ftl b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_edit.ftl new file mode 100644 index 0000000..f4be40e --- /dev/null +++ b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_edit.ftl @@ -0,0 +1,48 @@ + + +
      +
      +<#include "group_inplan_group_detail.ftl"> +<#include "group_inplan_group_detail_view.ftl"> +<#--<#include "excel.ftl">--> diff --git a/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_groupsp.ftl b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_groupsp.ftl new file mode 100644 index 0000000..b153b25 --- /dev/null +++ b/WEB-INF/view/cetc54/train/groupinplan/group_inplan_group_groupsp.ftl @@ -0,0 +1,10 @@ + +<#include "group_inplan_group_edit.ftl"> +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      审批意见:
      培训对象:计划人数:
      培训开始时间:培训结束时间:
      培训课时: + 年度: + + +
      培训内容简介:
      是否产生费用: + 主管院领导: + +
      课程序列: + +
      说明:

      培训不产生费用时,只需部门领导审批。

      + + +
      培训科目
      + +
      + + +
      +
      + +<#include "group_outplan_group_detail.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/groupoutplan/group_outplan_main_list.ftl b/WEB-INF/view/cetc54/train/groupoutplan/group_outplan_main_list.ftl new file mode 100644 index 0000000..a51d179 --- /dev/null +++ b/WEB-INF/view/cetc54/train/groupoutplan/group_outplan_main_list.ftl @@ -0,0 +1,97 @@ + +
      +
      + + + + + +
      + + <#if pg=="1"> + + + + + + <#if pg=="3"> + + + + + <#if pg=="4"> + + + + + <#if pg=="5"> + + + + + <#if pg=="6"> + + + + + + + + + + + <#if pg=="3" || pg=="4" || pg=="5" || pg=="6"> +<#-- --> + + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号申请单位申请人申请时间联系电话状态
      + + <#if pg=="1"> + + + + {{i+1}}{{value.sqdw}}{{value.addusername}}{{value.addtime |dateTimeFilter}}{{value.lxtel}}{{value.status | statusFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy.ftl new file mode 100644 index 0000000..e85a371 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy.ftl @@ -0,0 +1,25 @@ + + + +<#include "../../layout/ref_head.ftl"> + + + +<#include "institute_plan_dy_list.ftl"> + +
      +
      + +
      +
      + +
      +
      +<#include "../../layout/ref_script.ftl"> + + + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_corp_list.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_corp_list.ftl new file mode 100644 index 0000000..e9c3180 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_corp_list.ftl @@ -0,0 +1,39 @@ +
      +
      + + + + +
      + +
      +
      + + + + + + + + + + + + + + + + + + + + +
      操作序号下发部门名称调研可选数量
      + + {{i+1}} + +
      +
      diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_dxkc.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_dxkc.ftl new file mode 100644 index 0000000..f213737 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_dxkc.ftl @@ -0,0 +1,78 @@ +
      + +
      + + + + +
      初选计划名称: + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      序号推荐部门课程序列*培训对象入职年限*课程名称课程内容内部授课人姓名内部授课人工资号外部授课人姓名外部授课人单位培训时间培训方式推荐理由
      + + + {{if value.yx=="0"}} {{/if}} + {{if value.yx=="1"}} {{/if}} + + {{i+1}}{{value.tjdw}} + + {{value.kcxl}} + + {{value.pxdx}} + {{value.rznx}} + + {{value.kcmc}} + {{value.kcnr}} + {{value.nbxm}} + {{value.nbgzh}} + {{value.wbxm}} + {{value.wbdw}} + {{value.pxsj}} + + {{value.pxfs}} + + {{value.tjly}} +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_edit.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_edit.ftl new file mode 100644 index 0000000..2f42612 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_edit.ftl @@ -0,0 +1,38 @@ + +<#--<#include "../../layout/ref_head.ftl">--> + +
      +
      +<#include "institute_plan_dy_corp_list.ftl"> +<#include "institute_plan_dy_dxkc.ftl"> diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_list.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_list.ftl new file mode 100644 index 0000000..f0027cb --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_list.ftl @@ -0,0 +1,78 @@ + +
      +
      + + + + + + +
      + + <#if pg=="6"> + + + + + + + <#if pg=="5"> + + + + + <#if pg=="7"> + + + + + <#if pg=="8"> + + + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号调研名称添加人添加时间状态
      + +<#if pg=="6"> + + + + + {{i+1}}{{value.name}}{{value.addusername}}{{value.addtime |dateTimeFilter}}{{value.status | statusFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk.ftl new file mode 100644 index 0000000..d4c3957 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk.ftl @@ -0,0 +1,28 @@ + + +
      +
      +<#include "institute_plan_dy_yxkc.ftl"> diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk_result.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk_result.ftl new file mode 100644 index 0000000..8a7eadb --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk_result.ftl @@ -0,0 +1,23 @@ + + +
      +
      +<#include "institute_plan_dy_xk_result_list.ftl"> diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk_result_list.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk_result_list.ftl new file mode 100644 index 0000000..0c71634 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_xk_result_list.ftl @@ -0,0 +1,77 @@ +
      +
      + + + + +
      初选计划名称: + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      序号*课程序列推荐单位培训对象入职年限*课程名称课程内容内部授课人姓名内部授课人工资号外部授课人姓名外部授课人单位培训时间培训方式推荐理由调研结果统计
      + + + + + {{i+1}}{{value.kcxl}} + {{value.groupname}} + + {{value.pxdx}} + {{value.rznx}} + + {{value.kcmc}} + {{value.kcnr}} + {{value.nbxm}} + {{value.nbgzh}} + {{value.wbxm}} + {{value.wbdw}} + {{value.pxsj}} + + {{value.pxfs}} + + {{value.tjly}} + {{value.dyjg}} +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_yxkc.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_yxkc.ftl new file mode 100644 index 0000000..781e950 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_dy_yxkc.ftl @@ -0,0 +1,68 @@ +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      序号*课程序列推荐单位培训对象入职年限*课程名称课程内容内部授课人姓名内部授课人工资号外部授课人姓名外部授课人单位培训时间培训方式推荐理由
      + + + {{if value.yx=="0"}} {{/if}} + {{if value.yx=="1"}} {{/if}} + + {{i+1}}{{value.kcxl}} + + {{value.groupname}} + + {{value.pxdx}} + {{value.rznx}} + + {{value.kcmc}} + {{value.kcnr}} + {{value.nbxm}} + {{value.nbgzh}} + {{value.wbxm}} + {{value.wbdw}} + {{value.pxsj}} + + {{value.pxfs}} + + {{value.tjly}} +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group.ftl new file mode 100644 index 0000000..9c1167f --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group.ftl @@ -0,0 +1,22 @@ + + + + <#include "../../layout/ref_head.ftl"> + + +<#include "institute_plan_group_list.ftl"> + + +
      +
      +
      +
      +
      +
      +<#include "../train_workflow.ftl"> + +<#include "../../layout/ref_script.ftl"> + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_detail.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_detail.ftl new file mode 100644 index 0000000..6115be9 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_detail.ftl @@ -0,0 +1,79 @@ +
      +
      + + + + +
      + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号*课程序列培训对象入职年限*课程名称课程内容内部授课人外部授课人培训时间培训方式推荐理由
      姓名工资号姓名单位
      + + {{i+1}} + <#-- + <#-- ui-config="required:true,width:100,dictKey:'train_kcxl'" value="{{kcxlid}}"/>--> + <#-- --> + + + + + + + +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_edit.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_edit.ftl new file mode 100644 index 0000000..4ecae21 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_edit.ftl @@ -0,0 +1,44 @@ + + +
      +
      +<#include "institute_plan_group_detail.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_groupsp.ftl b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_groupsp.ftl new file mode 100644 index 0000000..a55b4c0 --- /dev/null +++ b/WEB-INF/view/cetc54/train/instituteplan/institute_plan_group_groupsp.ftl @@ -0,0 +1,10 @@ + +<#include "institute_plan_group_edit.ftl"> +
      + + + + + + +
      审批意见:
      + + +
      +
      diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_delete_editsp.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_delete_editsp.ftl new file mode 100644 index 0000000..3fea50b --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_delete_editsp.ftl @@ -0,0 +1,10 @@ + +<#include "out_train_delete_edit.ftl"> +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <#----> + <#----> + <#----> + + <#----> +
      审批意见:
      培训内容:
      培训开始时间:培训结束时间:
      主办单位:培训经费(元):
      单位性质: + 主管院领导: +<#-- --> + +
      说明:

      培训不产生费用时,请在“培训经费”处填写0;

      +

      非经济责任制培训不产生费用时,只需部门领导审批。

      +

      根据我院教育培训管理办法规定,外派培训是根据工作需要或岗位资质要求,安排员工外出参加上级部门、专业机构或院校等组织的学习和培训。原则上同一培训只能派一名员工参加学习,学习结束后在部门内分享。

      参训学员:
      + +
      学员信息
      + +
      + +
      +
      +<#include "out_train_main_user_list.ftl"> diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_main_editsp.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_main_editsp.ftl new file mode 100644 index 0000000..be75624 --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_main_editsp.ftl @@ -0,0 +1,10 @@ + +<#include "out_train_main_edit.ftl"> +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      审批意见:
      单位性质: + + 获得证书情况: + +
      外派培训员工讲座登记:
      外派培训项目: + + 外出时间:
      讲座人:讲座时间:
      地点:填报时间:
      参加人员范围及人数:
      讲座或交流内容:
      备注:
      + +
      外出培训应登记人员
      + +
      + + +
      +
      +<#include "out_train_main_link_pxdj_user.ftl"> diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_main_link_pxdj_user.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_main_link_pxdj_user.ftl new file mode 100644 index 0000000..401ed1c --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_main_link_pxdj_user.ftl @@ -0,0 +1,23 @@ +
      + + + + + + + + + + + + + + + + + + + +
      序号姓名工资号登记状态
      {{i+1}}{{value.username}}{{value.usercode}}{{value.status | statusFilter}}
      + <#--
      --> +
      diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_main_list.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_main_list.ftl new file mode 100644 index 0000000..ee43ae0 --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_main_list.ftl @@ -0,0 +1,130 @@ + +
      +
      + + + + + + + + + + +
      + 开始时间: + - + + 结束时间: + - + + + + + + +
      + <#if pg=="1"> + + + + + <#if pg=="3"> + + + + + <#if pg=="4"> + + + + <#if pg=="5"> + + + + + <#if pg=="6"> + + + + + + + + <#if sj=="sj"> + + + + + + <#if pg=="3" || pg=="4" || pg=="5" || pg=="6"> +<#-- --> + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号培训名称课程名称培训地点主办单位培训开始时间培训结束时间培训经费部门录入人录入时间状态外派登记
      + + <#if pg=="1"> + + + + {{i+1}}{{value.pxmc}}{{value.kcmc}}{{value.pxdd}}{{value.zbdw}}{{value.pxstarttime |dateFilter}}{{value.pxendtime |dateFilter}}{{value.pxfy}}{{value.addgroupname}}{{value.addusername}}{{value.addtime |dateTimeFilter}}{{value.status |statusFilter}} + 外派登记 +
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_main_user_list.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_main_user_list.ftl new file mode 100644 index 0000000..4b92d34 --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_main_user_list.ftl @@ -0,0 +1,56 @@ +
      +
      + + + + +
      + + +
      + + + 模版下载 +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号*姓名*工资号职务职称联系方式备注
      + + <#-- + <#--onclick="editRow('{{value.id}}');">--> + + {{i+1}}
      + <#--
      --> +
      diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj.ftl new file mode 100644 index 0000000..a272f73 --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj.ftl @@ -0,0 +1,22 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +<#include "out_train_pxdj_list.ftl"> +<#include "../train_workflow.ftl"> + +
      +
      +
      +
      +
      +
      +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj_edit.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj_edit.ftl new file mode 100644 index 0000000..2f07262 --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj_edit.ftl @@ -0,0 +1,95 @@ + + +
      +
      +<#include "out_train_pxdj_user_list.ftl"> diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj_editsp.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj_editsp.ftl new file mode 100644 index 0000000..0eda003 --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_pxdj_editsp.ftl @@ -0,0 +1,10 @@ + +<#include "out_train_pxdj_edit.ftl"> +
      + + + + + + + + + + + + + + + + +
      审批意见:
      参加人员签字:
      备注:
      + + +
      +
      diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_register_editsp.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_register_editsp.ftl new file mode 100644 index 0000000..551c21f --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_register_editsp.ftl @@ -0,0 +1,97 @@ + + +
      +
      diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_register_editsp2.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_register_editsp2.ftl new file mode 100644 index 0000000..c8a758d --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_register_editsp2.ftl @@ -0,0 +1,134 @@ + + + + +
      +
      +
      + + + + + + + + + + + + + + + + + +
      序号编码姓名状态
      {{i+1}}{{value.usercode}}{{value.username}}{{value.status}}
      +
      +
      + +
      + +
      培训情况登记
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      外派培训条目 + +
      申请单位:申请人:
      申请时间:是否获得证书: + +
      培训总结:
      外派培训项目名称:时 间: + +
      院内讲座人:院内讲座时间: + +
      院内讲座地点:参加人员范围及人数: + +
      讲座或交流内容:
      参加人员签字:
      备注:
      审批意见:
      + + +
      +
      diff --git a/WEB-INF/view/cetc54/train/outtrain/out_train_zyb_editsp.ftl b/WEB-INF/view/cetc54/train/outtrain/out_train_zyb_editsp.ftl new file mode 100644 index 0000000..169935d --- /dev/null +++ b/WEB-INF/view/cetc54/train/outtrain/out_train_zyb_editsp.ftl @@ -0,0 +1,10 @@ + +<#include "out_train_zyb_edit.ftl"> +
      + + + + + + + + + + + + + + + + + + + + + + + + + +<#-- --> +<#-- --> + + + + + + + + + + + + + + + + + + + + + + +
      审批意见: +
      培训内容: + +
      培训时间: + + + 培训方式: + + +
      计划人数: + + + 实际人数: + + +
      授课人: + + + 授课地点:--> +<#-- --> +<#-- +<#-- ui-config="required:false,width:200" value="{{teachplace}}"/>--> +<#--
      培训评估分数: + + +
      意见建议: + + 点击查看报表 +
      培训有效性评价: + +
      报告人: + + + 报告时间: + + +
      +
      审核信息 + +
      + + + + + +
      审核意见: + + +
      + diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_assessaudit_main_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_assessaudit_main_list.ftl new file mode 100644 index 0000000..0631473 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_assessaudit_main_list.ftl @@ -0,0 +1,67 @@ +
      +
      + + + + + + + +
      + 审核状态: + + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号课程名称班级名称培训时间授课人评估状态
      + {{if value.status == "1"}} + 审核 + {{else }} + 查看 + {{/if}} + {{i+1}}{{value.coursename}}{{value.classname}}{{value.traindate | dateFilter}}{{value.teacher}} + <#-- {{value.status | assessFilter}}--> + + {{value.status | assessFilter}} + +
      +
      +
      +
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main.ftl new file mode 100644 index 0000000..93cf28d --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main.ftl @@ -0,0 +1,20 @@ + + + +<#include "../../layout/ref_head.ftl"> + + + +<#include "pd_certificate_main_list.ftl"> +<#--<#include "pd_certificate_main_edit.ftl">--> + + +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_edit.ftl new file mode 100644 index 0000000..a985fa2 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_edit.ftl @@ -0,0 +1,96 @@ + + +
      +
      +<#include "pd_certificate_main_stu.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_list.ftl new file mode 100644 index 0000000..bd07805 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_list.ftl @@ -0,0 +1,79 @@ +
      +
      + + + + + +
      + + + + + + 切换证书: + + 请选择培训科目: + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号培训科目试卷名称成绩工号姓名部门证书编号颁证时间颁证机构添加时间
      + + {{i+1}}{{value.coursename}}{{value.papername}}{{value.score}}{{value.usercode}}{{value.username}}{{value.department}} + {{if value.zs_type == 1}} + + {{else}} + {{value.code}} + {{/if}} + {{value.awardtime |dateFilter}}{{value.awarddept}}{{value.addtime | dateTimeFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_stu.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_stu.ftl new file mode 100644 index 0000000..c566561 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_certificate_main_stu.ftl @@ -0,0 +1,32 @@ +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      序号工号姓名部门试卷分数
      {{i+1}} + {{value.user_id}} + + + {{value.user}}{{value.department}}{{value.name}}{{value.user_score}}
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_edit.ftl new file mode 100644 index 0000000..5684ea7 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_edit.ftl @@ -0,0 +1,93 @@ +
      +
      +
      +
      + diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_list.ftl new file mode 100644 index 0000000..efa112d --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_list.ftl @@ -0,0 +1,55 @@ +
      +
      + + + + + +
      + <#----> + <#----> + + +
      +
      + + + + + + + + + + + + + <#----> + + + + + + + + + + + + + + + + <#----> + + + + +
      操作序号课程名称班级名称原学员新学员更换方式状态审批意见申请人申请时间
      + + {{i+1}}{{value.course}}{{value.classname}}{{value.original_student}}{{value.new_student}}{{value.replacement_method}}{{value.status | replaceStuStatusFilter}}{{value.opinion}}{{value.createperson}}{{value.createtime | dateTimeFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_main.ftl new file mode 100644 index 0000000..cbc2ac0 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_checkreplacestu_main.ftl @@ -0,0 +1,17 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + + +<#include "pd_checkreplacestu_list.ftl"> +<#include "pd_checkreplacestu_edit.ftl"> + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classfinish.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish.ftl new file mode 100644 index 0000000..31623c5 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish.ftl @@ -0,0 +1,19 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +<#include "pd_classfinish_list.ftl"> +<#include "pd_classfinish_study_hour.ftl"> + +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_edit.ftl new file mode 100644 index 0000000..dcf0621 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_edit.ftl @@ -0,0 +1,170 @@ + + +
      +
      +<#include "pd_classfinish_user.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_list.ftl new file mode 100644 index 0000000..71f917b --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_list.ftl @@ -0,0 +1,69 @@ +
      +
      + + + <#----> + <#----> + + + + + +
      数据推送时间:--> + + <#-- + <#--ui-config="tipAfterInput:true">---> + + <#-- + <#--ui-config="tipAfterInput:true">--> + <#-- + <#if version=="54"> + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号课程名称课程所属班级名称课程序列部门实际授课人培训费用(元)补充时间状态
      + + {{i+1}}{{value.kcmc}}{{value.jhly | jhlyFilter}}{{value.bjmc}}{{value.bjlb}}{{value.addgroupname}}{{value.realteacher}}{{value.price}}{{value.finish_time | dateTimeFilterUndefined}}{{value.finish_status}}
      +
      + +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_study_hour.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_study_hour.ftl new file mode 100644 index 0000000..eb39473 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_study_hour.ftl @@ -0,0 +1,16 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_user.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_user.ftl new file mode 100644 index 0000000..707ed88 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classfinish_user.ftl @@ -0,0 +1,81 @@ +
      +
      + + + + + +
      + + + +
      +
      + + + + <#----> + <#----> + + + <#----> + <#--<#––>--> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + + + + + + <#----> + <#----> + + + <#----> + <#--<#––>--> + <#--<#––>--> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + + + + +
      操作序号姓名部门工资号职务(职称)设计师系统级别移动电话是否参与培训实际学时姓名工资号部门岗位序列职称设计师系统级别移动电话
      --> + + <#-- + <#--onclick="deleteuserRow(this);">--> + <#--{{i+1}} + <#----> + + + + +
      + <#--
      --> +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main.ftl new file mode 100644 index 0000000..8162578 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main.ftl @@ -0,0 +1,17 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + + +<#include "pd_classopener_main_list.ftl"> +<#include "pd_classopener_main_edit.ftl"> + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main_edit.ftl new file mode 100644 index 0000000..7e1e3a9 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main_edit.ftl @@ -0,0 +1,43 @@ +
      +
      +
      +
      + diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main_list.ftl new file mode 100644 index 0000000..9cb5334 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classopener_main_list.ftl @@ -0,0 +1,67 @@ +
      +
      + + + + + +
      + <#if pg=="1"> + + + + <#if pg=="2"> + + + + + + +
      +
      + + + + + <#if pg=="1"> + + + + + + + + + + + + + + <#if pg=="1"> + + + + <#if pg=="1"> + + + <#if pg=="2"> + + + + + + + + +
      操作序号课程名称开班人开班人是否确认创建人创建时间
      + + + {{i+1}}{{value.course_name}}{{value.course_name}}{{value.person}}{{value.confirm}}{{value.createperson}}{{value.time | dateTimeFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main.ftl new file mode 100644 index 0000000..68b8b25 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main.ftl @@ -0,0 +1,18 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +<#include "pd_classuser_main_list.ftl"> + +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_edit.ftl new file mode 100644 index 0000000..b0328a7 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_edit.ftl @@ -0,0 +1,140 @@ + + +
      +
      +<#include "pd_classuser_main_user.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_list.ftl new file mode 100644 index 0000000..4add19b --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_list.ftl @@ -0,0 +1,57 @@ + +
      +
      + + + + + +
      + + + + + +
      +
      + + + + + + + + + + + + + <#----> + + + + + + + + + + + + + + + <#----> + + + + +
      操作序号课程名称班级名称课程序列开始时间结束时间培训目标状态部门
      + + {{i+1}}{{value.kcmc}}{{value.bjmc}}{{value.bjlb}}{{value.starttime | dateFilter}}{{value.endtime | dateFilter}}{{value.pxmb}}{{value.submit_status}}{{value.groupname}}
      +
      + +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_user.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_user.ftl new file mode 100644 index 0000000..3914a7b --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_classuser_main_user.ftl @@ -0,0 +1,72 @@ +
      +
      + + + + +
      + + +
      + + + 模版下载 +
      +
      +
      +
      + + + + + + + <#----> + <#--<#––>--> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + + + + + + + + <#----> + <#--<#––>--> + <#--<#––>--> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + +
      操作序号姓名部门工资号职务(职称)设计师系统级别移动电话*部门岗位序列*姓名*工资号职称设计师系统级别移动电话
      + + + {{i+1}}
      + <#--
      --> +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main.ftl new file mode 100644 index 0000000..5b51a8d --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main.ftl @@ -0,0 +1,20 @@ + + + +<#include "../../layout/ref_head.ftl"> + + + +<#include "pd_createclass_main_list.ftl"> + +
      +
      +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_corp.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_corp.ftl new file mode 100644 index 0000000..6673447 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_corp.ftl @@ -0,0 +1,41 @@ +
      +
      + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + +
      操作序号下发部门名称最少报名人数
      + + {{i+1}} + +
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_edit.ftl new file mode 100644 index 0000000..5f9a7ec --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_edit.ftl @@ -0,0 +1,205 @@ + + + +
      +
      +<#include "pd_createclass_main_corp.ftl"> +<#include "pd_createclass_main_user.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_list.ftl new file mode 100644 index 0000000..b3f78cf --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_list.ftl @@ -0,0 +1,72 @@ +
      +
      + + + + + +
      + + + + + + + +
      +
      + + + + + + + + + + + + + + + <#----> + + + + + + + + + + + + + + + + + + <#----> + + + + + +
      操作序号课程名称课程所属班级名称课程序列部门开始时间结束时间培训目标状态添加人添加时间
      + + + {{i+1}}{{value.kcmc}}{{value.jhly | jhlyFilter}}{{value.bjmc}}{{value.bjlb}}{{value.addgroupname}}{{value.starttime | dateFilter}}{{value.endtime | dateFilter}}{{value.pxmb}} + {{value.status | classStatusFilter}} + {{value.addusername}}{{value.addtime | dateTimeFilter}}
      +
      + +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_user.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_user.ftl new file mode 100644 index 0000000..bcc0ca0 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_createclass_main_user.ftl @@ -0,0 +1,74 @@ +
      +
      + + + + +
      + + +
      + + + 模版下载 +
      +
      +
      +
      + + + + + + + + <#----> + <#--<#––>--> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + + + + + + + + <#----> + <#--<#––>--> + <#--<#––>--> + <#----> + <#----> + <#----> + <#----> + + + + + + + + + + + +
      操作序号姓名部门工资号职务(职称)设计师系统级别移动电话*部门岗位序列*姓名*工资号职称设计师系统级别移动电话
      + + + {{i+1}}
      + <#--
      --> +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_dt_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_dt_main.ftl new file mode 100644 index 0000000..b20d03e --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_dt_main.ftl @@ -0,0 +1,18 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +<#include "pd_dt_main_list.ftl"> + +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_dt_main_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_dt_main_edit.ftl new file mode 100644 index 0000000..35dbad5 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_dt_main_edit.ftl @@ -0,0 +1,47 @@ + + +
      + +
      + + + + + + + + + + + + + + + + + + + +
      序号题目类别题目描述是否必答答题
      {{i+1}}{{value.pglb}}{{value.tm}}{{value.ismust}} + {{if value.pglb=="问答"}} + + {{else}} + + {{/if}} + + + +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_dt_main_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_dt_main_list.ftl new file mode 100644 index 0000000..da4d90c --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_dt_main_list.ftl @@ -0,0 +1,38 @@ +
      +
      + + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + +
      操作序号班级名称评估问卷名称
      + + {{i+1}}{{value.ccname}}{{value.pgwjmc}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_mycertificate.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_mycertificate.ftl new file mode 100644 index 0000000..99cca16 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_mycertificate.ftl @@ -0,0 +1,76 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +
      +
      + + + + + +
      + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号培训内容学习时间颁证机构颁证时间证书编号
      + {{if value.paperid==null||value.paperid==""}} + + {{/if}} + + {{i+1}}{{value.coursename}}{{value.learntime}}{{value.awarddept}}{{value.awardtime | dateFilter}} + {{if value.paperid==null||value.paperid==""}} + {{value.code}} + {{else}} + {{value.code}} + {{/if}} +
      +
      +
      + +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_mycertificate_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_mycertificate_edit.ftl new file mode 100644 index 0000000..ef88640 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_mycertificate_edit.ftl @@ -0,0 +1,53 @@ + + +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_mycourse.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_mycourse.ftl new file mode 100644 index 0000000..2a9d34d --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_mycourse.ftl @@ -0,0 +1,72 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +
      +
      + + + + + +
      + + + 请点击课程名称查看课程内容 ! +
      +
      + + + + + + + + + + + <#----> + <#----> + + + + + + + + + + + + <#----> + <#----> + + +
      序号课程名称班级名称开始时间结束时间是否查看培训资料评估问卷考试
      {{i+1}} + {{if value.fromtable == "cc" }} + {{value.kcmc}} + {{else}} + {{value.kcmc}} + {{/if}} + {{value.bjmc}}{{value.starttime | dateFilter}}{{value.endtime | dateFilter}}{{value.issee | mycourseseeFilter}}培训资料 + <#--onclick="assessmentStatus('{{value.id}}','{{value.kcmcid}}');">评估问卷 + <#--onclick="examStatus('{{value.id}}','{{value.kcmcid}}');">考试
      +
      +
      + +
      +
      +
      +
      +<#include "pd_mycourse_file.ftl"> + +<#include "../../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_mycourse_class.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_mycourse_class.ftl new file mode 100644 index 0000000..2537886 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_mycourse_class.ftl @@ -0,0 +1,134 @@ + + +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_mycourse_file.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_mycourse_file.ftl new file mode 100644 index 0000000..c0dec0d --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_mycourse_file.ftl @@ -0,0 +1,31 @@ +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      序号标题资料分类简介提供者上传时间资料附件
      {{i+1}}{{value.title}} {{value.category}} {{value.description}} {{value.provider}}{{value.uploadtime | dateTimeFilter}}{{value.filename}}
      +
      +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main.ftl new file mode 100644 index 0000000..5aa2edb --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main.ftl @@ -0,0 +1,29 @@ + + + +<#include "../../layout/ref_head.ftl"> + + + +<#include "pd_pg_main_list.ftl"> +<#include "pd_pg_main_detail.ftl"> +<#include "pd_pg_main_assess.ftl"> +<#--<#include "pd_pg_main_estimate.ftl">--> + +
      +
      + +
      +
      + +
      +
      + + + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_assess.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_assess.ftl new file mode 100644 index 0000000..3a4661a --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_assess.ftl @@ -0,0 +1,129 @@ +
      +
      +
      +
      +
      + diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_detail.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_detail.ftl new file mode 100644 index 0000000..7ef0f51 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_detail.ftl @@ -0,0 +1,43 @@ +
      +
      +
      + + + + <#-- --> + +
      + + + --> + <#-- --> + <#--
      +
      + + + + <#----> + + <#----> + + + + + + + + + <#----> + + <#----> + + + + + + +
      序号评估问卷名称考生工资号部门参与详情
      {{i+1}}{{value.papername}} {{value.username}}{{value.usercode}}{{value.deptname}}{{value.userstate}}
      +
      +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_edit.ftl new file mode 100644 index 0000000..3386c32 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_edit.ftl @@ -0,0 +1,44 @@ + + + +
      +
      +<#include "pd_pg_main_tm.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_edit_dt.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_edit_dt.ftl new file mode 100644 index 0000000..60dbcd0 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_edit_dt.ftl @@ -0,0 +1,43 @@ + + + +
      +
      +<#include "pd_pg_main_tm_dt.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_estimate.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_estimate.ftl new file mode 100644 index 0000000..eecd4d8 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_estimate.ftl @@ -0,0 +1,26 @@ +
      +
      + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_import.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_import.ftl new file mode 100644 index 0000000..237a15e --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_import.ftl @@ -0,0 +1,29 @@ +
      +
      + + + + + + + + + + + +
      + EXCEL表头:评估问卷名称、题目类别、题目描述、是否必答
      + 题目类别可填写:组织保障评价/课程评价/讲师评价/其他
      + 是否必答可填写:必答/选答 +
      + + + <#----> + 模版下载 +
      +
      +
      +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_list.ftl new file mode 100644 index 0000000..53cf002 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_list.ftl @@ -0,0 +1,69 @@ + +
      +
      + + + + + +
      + + + + <#----> + + + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号班级名称评估问卷名称有效问卷问卷总数评估结果平均分部门维护时间状态培训有效性评价
      + + + + {{i+1}}{{value.ccname}}{{value.pgwjmc}}{{value.validpaper}}{{value.allpaper}}{{value.scoreavg}}{{value.addgroupname}}{{value.addtime | dateFilter}}{{value.status | pgStatusFilter}}{{value.yxxstatus | assessFilter}}
      +
      + +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_tm.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_tm.ftl new file mode 100644 index 0000000..0380f80 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_tm.ftl @@ -0,0 +1,52 @@ +
      +
      + + + + +
      + +
      +
      + + + + + + + + + + + + + + + + + <#----> + + + <#----> + + + +
      操作序号题目类别题目描述是否必答
      + + {{i+1}} + + + +
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_tm_dt.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_tm_dt.ftl new file mode 100644 index 0000000..fdc5915 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_pg_main_tm_dt.ftl @@ -0,0 +1,38 @@ +
      +
      + + + + +
      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      序号题目类别打分项评价分数id
      {{i+1}}{{value.pglb}}{{value.tm}}{{value.id}}
      + +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_query_trainflow.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_query_trainflow.ftl new file mode 100644 index 0000000..27e1f22 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_query_trainflow.ftl @@ -0,0 +1,116 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +
      +
      + + + <#if pg=="1"> + + + + +
      + + + +
      +
      + + + + + + <#----> + + + + + <#----> + + + + <#----> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <#----> + + + + + <#----> + + + + <#----> + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号课程名称部门课程状态补充课程信息课程所属班级名称班级状态补充班级信息课程序列参训人数培训开始时间培训结束时间是否颁发证书培训学时培训形式是否考核考核类型考核方式计划授课人实际授课人授课人工资号授课人单位培训费用评估问卷名称评估状态考试试卷名称考试开始时间考试结束时间考试状态培训资料名称培训资料上传时间
      --> + + <#-- + <#--onclick="editRow('{{value.id}}','{{value.status}}');">--> + <#-- + <#--onclick="deleteRow('{{value.id}}','{{value.status}}');">--> + <#--{{i+1}}{{value.kcmc}}{{value.addgroupname}}{{value.coursestatus}}{{value.coursefinish}}{{value.jhly}}{{value.bjmc}}{{value.ccstatus}}{{value.classfinish}}{{value.bjlb}}{{value.jhrs}}{{value.starttime | dateFilter}}{{value.endtime | dateFilter}}{{value.sfbfzs}}{{value.pxxsh}}{{value.pxxs}}{{value.sfkh}}{{value.khlx}}{{value.khfs}}{{value.teacher}}{{value.realteacher}}{{value.teacher_code}}{{value.teacher_department}}{{value.price}}{{value.pgwjmc}}{{value.pgstatus}}{{value.name}}{{value.startdate | dateFilter}}{{value.enddate | dateFilter}}{{value.state}}{{value.title}}{{value.uploadtime | dateFilter}}
      +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_query_traintotal.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_query_traintotal.ftl new file mode 100644 index 0000000..e270ff5 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_query_traintotal.ftl @@ -0,0 +1,76 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +
      +
      + + + + + +
      + 开始时间: + - + + 结束时间: + - + + + + +
      +
      + + + + + <#----> + <#----> + <#----> + + + + + + + + + + + + + + <#----> + <#----> + <#----> + + + + + + + + + + + +
      操作序号课程名称部门班级名称培训开始时间培训结束时间学时参训人数评估参与人数评估结果平均分
      --> + + <#-- + <#--onclick="editRow('{{value.id}}','{{value.status}}');">--> + <#-- + <#--onclick="deleteRow('{{value.id}}','{{value.status}}');">--> + <#--{{i+1}}{{value.kcmc}}{{value.addgroupname}}{{value.bjmc}}{{value.starttime | dateFilter}}{{value.endtime | dateFilter}}{{value.pxxsh}}{{value.stucount}}{{value.pgcount}}{{value.scoreavg}}
      +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_edit.ftl new file mode 100644 index 0000000..41685d2 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_edit.ftl @@ -0,0 +1,84 @@ +
      +
      +
      +
      + diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_history.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_history.ftl new file mode 100644 index 0000000..a236f09 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_history.ftl @@ -0,0 +1,27 @@ +
      +
      + + + + + + + + + + + + + + + + + + + + + +
      序号审批意见状态审批人审批时间
      {{i+1}}{{value.opinion}}{{value.status | replaceStuStatusFilter}}{{value.checkername}}{{value.checktime | dateTimeFilter}}
      +
      +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_list.ftl new file mode 100644 index 0000000..945e2f0 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_list.ftl @@ -0,0 +1,66 @@ +
      +
      + + + + + +
      + + + + + + + +
      +
      + + + + + + + + + + + + + <#----> + + + + + + + + <#if pg=="1"> + + + + + + + + + + <#----> + + + + +
      操作序号课程名称班级名称原学员新学员更换方式审批状态审批意见创建人创建时间
      + + + {{i+1}}{{value.course}}{{value.classname}} + {{value.original_student}}{{value.new_student}}{{value.replacement_method}}{{value.status | replaceStuStatusFilter}}{{value.opinion}}{{value.createperson}}{{value.createtime | dateTimeFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_main.ftl new file mode 100644 index 0000000..3bfe2de --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_replacestudent_main.ftl @@ -0,0 +1,19 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + + +<#include "pd_replacestudent_list.ftl"> +<#include "pd_replacestudent_edit.ftl"> +<#include "pd_replacestudent_history.ftl"> +<#include "train_workflow.ftl"> + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_edit.ftl new file mode 100644 index 0000000..6bb046b --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_edit.ftl @@ -0,0 +1,46 @@ +
      +
      +
      + <#include "pd_superiorunittrain_student_list.ftl"> +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_list.ftl new file mode 100644 index 0000000..26bea0b --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_list.ftl @@ -0,0 +1,54 @@ +
      +
      + + + + + +
      + + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号课程名称培训开始时间培训结束时间参训地点负责人添加人添加时间
      + + + {{i+1}} + {{value.course_name}} + {{value.start_time | dateFilter}} {{value.end_time | dateFilter}} {{value.train_place}} {{value.duty_person}} {{value.addusername}} {{value.addtime | dateTimeFilter}}
      +
      <#-- 分页--> +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_main.ftl new file mode 100644 index 0000000..b7fb512 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_main.ftl @@ -0,0 +1,14 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + + +<#include "pd_superiorunittrain_list.ftl"> + +<#include "../../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_student_edit.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_student_edit.ftl new file mode 100644 index 0000000..7a901c3 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_student_edit.ftl @@ -0,0 +1,41 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_student_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_student_list.ftl new file mode 100644 index 0000000..6e17934 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_superiorunittrain_student_list.ftl @@ -0,0 +1,55 @@ +
      +
      + + + + +
      + + + +
      + + + 模版下载 +
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号姓名工资号职级联系电话所属单位及职务
      + + + {{i+1}}{{value.student_name}}{{value.student_id}}{{value.position}}{{value.telephone}}{{value.student_department}}
      +
      <#-- 分页--> +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_teacher_list.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_teacher_list.ftl new file mode 100644 index 0000000..eb1ef08 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_teacher_list.ftl @@ -0,0 +1,49 @@ +
      +
      + + + + + +
      + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      序号授课课程名称授课班级名称课程所属授课人授课人工资号授课人单位授课时长授课内容授课开始时间授课结束时间
      {{i+1}} {{value.kcmc}} {{value.bjmc}} {{value.jhly | jhlyFilter}} {{value.teacher}} {{value.teacher_code}} {{value.teacher_department}} {{value.pxxsh}} {{value.pxnr}} {{value.starttime | dateFilter}} {{value.endtime | dateFilter}}
      +
      <#-- 分页--> +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/pd_teacher_main.ftl b/WEB-INF/view/cetc54/train/plantodo/pd_teacher_main.ftl new file mode 100644 index 0000000..2c3c6df --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/pd_teacher_main.ftl @@ -0,0 +1,14 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + + +<#include "pd_teacher_list.ftl"> + +<#include "../../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/plantodo/train_workflow.ftl b/WEB-INF/view/cetc54/train/plantodo/train_workflow.ftl new file mode 100644 index 0000000..02e15d8 --- /dev/null +++ b/WEB-INF/view/cetc54/train/plantodo/train_workflow.ftl @@ -0,0 +1,23 @@ +
      + +
      + + + + + + + + + + + + + + + +
      序号审批节点
      {{i+1}}开班人 {{value.checkername}}{{value.checkercode}}
      +
      +
      + +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/train_workflow.ftl b/WEB-INF/view/cetc54/train/train_workflow.ftl new file mode 100644 index 0000000..017898c --- /dev/null +++ b/WEB-INF/view/cetc54/train/train_workflow.ftl @@ -0,0 +1,22 @@ +
      + +
      + + + + + + + + + +<#-- --> + + + + +
      序号审批节点
      {{i+1}}{{value.num}}{{value.leader}}
      +<#--
      --> +
      + +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/trainsp_main.ftl b/WEB-INF/view/cetc54/train/trainsp_main.ftl new file mode 100644 index 0000000..a68e752 --- /dev/null +++ b/WEB-INF/view/cetc54/train/trainsp_main.ftl @@ -0,0 +1,8 @@ + + +
      +
      +<#include "trainsp_main_list.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/trainsp_main_list.ftl b/WEB-INF/view/cetc54/train/trainsp_main_list.ftl new file mode 100644 index 0000000..30cd05c --- /dev/null +++ b/WEB-INF/view/cetc54/train/trainsp_main_list.ftl @@ -0,0 +1,27 @@ + +
      + + + + + + + + + + + + + + + + + + + + + + +
      序号审批人审批时间意见审批后状态审批结果
      {{i+1}}{{value.spusername}}{{value.spdate |dateTimeFilter}}{{value.yj}}{{value.ywstatus | ywstatusFilter}}{{value.spresult | spresultFilter }}
      +
      +
      diff --git a/WEB-INF/view/cetc54/train/uptrain/person_edit.ftl b/WEB-INF/view/cetc54/train/uptrain/person_edit.ftl new file mode 100644 index 0000000..2fd3932 --- /dev/null +++ b/WEB-INF/view/cetc54/train/uptrain/person_edit.ftl @@ -0,0 +1,62 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/uptrain/person_list.ftl b/WEB-INF/view/cetc54/train/uptrain/person_list.ftl new file mode 100644 index 0000000..5ebb1d8 --- /dev/null +++ b/WEB-INF/view/cetc54/train/uptrain/person_list.ftl @@ -0,0 +1,61 @@ +
      +
      参训人员
      +
      + + + + +
      + + + 姓名: + + + +
      +
      + + + + + <#if has_edit> + + + + + + + + + + + + + + <#if has_edit> + + + + + + + + + + + +
      操作序号姓名工资号部门名称职级职务联系电话
      + + {{i+1}}{{value.name}} + {{value.code}}{{value.deptname}}{{value.title | titleFilter}}{{value.duty}}{{value.phonenumber}}
      +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/uptrain/report.ftl b/WEB-INF/view/cetc54/train/uptrain/report.ftl new file mode 100644 index 0000000..8ba5e9d --- /dev/null +++ b/WEB-INF/view/cetc54/train/uptrain/report.ftl @@ -0,0 +1,21 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +
      +<#-- --> +
      +
      + +
      +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + diff --git a/WEB-INF/view/cetc54/train/uptrain/uptrain.ftl b/WEB-INF/view/cetc54/train/uptrain/uptrain.ftl new file mode 100644 index 0000000..293d1c1 --- /dev/null +++ b/WEB-INF/view/cetc54/train/uptrain/uptrain.ftl @@ -0,0 +1,14 @@ + + + + <#include "../../layout/ref_head.ftl"> + + + +<#include "uptrain_list.ftl"> + +<#include "../../layout/ref_script.ftl"> + + + + diff --git a/WEB-INF/view/cetc54/train/uptrain/uptrain_edit.ftl b/WEB-INF/view/cetc54/train/uptrain/uptrain_edit.ftl new file mode 100644 index 0000000..ee82821 --- /dev/null +++ b/WEB-INF/view/cetc54/train/uptrain/uptrain_edit.ftl @@ -0,0 +1,22 @@ + + + + <#include "../../layout/ref_head.ftl"> + + +
      +
      + <#include "uptrain_form.ftl"> +
      +
      + <#include "person_list.ftl"> + <#include "person_edit.ftl"> +
      +
      + +<#include "../../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/uptrain/uptrain_form.ftl b/WEB-INF/view/cetc54/train/uptrain/uptrain_form.ftl new file mode 100644 index 0000000..88f38e2 --- /dev/null +++ b/WEB-INF/view/cetc54/train/uptrain/uptrain_form.ftl @@ -0,0 +1,70 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/uptrain/uptrain_list.ftl b/WEB-INF/view/cetc54/train/uptrain/uptrain_list.ftl new file mode 100644 index 0000000..43baebe --- /dev/null +++ b/WEB-INF/view/cetc54/train/uptrain/uptrain_list.ftl @@ -0,0 +1,74 @@ +
      +
      + + + + + + + + +
      + 课程名称: + + + + 参训人员: + + + + +
      + + + + + +
      + + + + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      操作序号课程名称开始时间结束时间培训时间(天)培训人数参训地点负责人
      + 查看 + 编辑 + {{i+1}}{{value.kcmc}}{{value.starttime | dateFilter}}{{value.endtime | dateFilter}}{{value.traindays}}{{value.coursepersoncount}}{{value.trainplace | placeFilter}}{{value.director}}
      +
      +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/yearsummary/year_summary_group.ftl b/WEB-INF/view/cetc54/train/yearsummary/year_summary_group.ftl new file mode 100644 index 0000000..0f0065e --- /dev/null +++ b/WEB-INF/view/cetc54/train/yearsummary/year_summary_group.ftl @@ -0,0 +1,21 @@ + + + +<#include "../../layout/ref_head.ftl"> + + + +<#include "year_summary_group_list.ftl"> +<#include "../train_workflow.ftl"> + +
      +
      +
      +
      +
      +
      +<#include "../../layout/ref_script.ftl"> + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_detail.ftl b/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_detail.ftl new file mode 100644 index 0000000..0e93bd7 --- /dev/null +++ b/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_detail.ftl @@ -0,0 +1,41 @@ +
      +
      + + + + +
      + + + +
      +
      + + + + + <#----> + + + + + + + + + + <#----> + + + <#----> + + + + + +
      操作序号课程名称原因说明处理意见
      --> + <#-- + <#--onclick="deletekcRow(this);">--> + <#--{{i+1}}{{value.kcmc}}
      +
      diff --git a/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_edit.ftl b/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_edit.ftl new file mode 100644 index 0000000..119c981 --- /dev/null +++ b/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_edit.ftl @@ -0,0 +1,118 @@ + + +
      +
      +<#include "year_summary_group_detail.ftl"> \ No newline at end of file diff --git a/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_groupsp.ftl b/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_groupsp.ftl new file mode 100644 index 0000000..0c2a0a6 --- /dev/null +++ b/WEB-INF/view/cetc54/train/yearsummary/year_summary_group_groupsp.ftl @@ -0,0 +1,10 @@ + +<#include "year_summary_group_edit.ftl"> +
      + + + + + +
      审批意见: +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/trainweb/task_main_list.ftl b/WEB-INF/view/cetc54/trainweb/task_main_list.ftl new file mode 100644 index 0000000..14c8364 --- /dev/null +++ b/WEB-INF/view/cetc54/trainweb/task_main_list.ftl @@ -0,0 +1,52 @@ +
      +
      + + + + + + +
      + + +
      +
      + + + + <#----> + <#----> + + + + + + + + + + + + + <#----> + <#----> + <#----> + <#----> + + + + + + + +
      操作序号任务名称提出人提出人部门提出时间操作
      {{i+1}}--> + + <#-- + <#--onclick="editRow('{{value.id}}');">--> + <#-- + <#--onclick="deleteRow('{{value.id}}');">--> + <#--{{i+1}} + <#--onclick="viewRow('{{value.id}}','{{value.name}}');">{{value.name}}{{value.name}}{{value.username}}{{value.orgname}}{{value.creater_time |dateTimeFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/trainweb/trainweb_main.ftl b/WEB-INF/view/cetc54/trainweb/trainweb_main.ftl new file mode 100644 index 0000000..c8484c6 --- /dev/null +++ b/WEB-INF/view/cetc54/trainweb/trainweb_main.ftl @@ -0,0 +1,71 @@ + + + +<#include "../layout/ref_head.ftl"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +<#----> +
      + +
      +<#include "../layout/ref_script.ftl"> + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/trainweb/work_done_main.ftl b/WEB-INF/view/cetc54/trainweb/work_done_main.ftl new file mode 100644 index 0000000..90ed809 --- /dev/null +++ b/WEB-INF/view/cetc54/trainweb/work_done_main.ftl @@ -0,0 +1,12 @@ + + + +<#include "../layout/ref_head.ftl"> + + +<#include "work_done_main_list.ftl"> +<#include "work_done_main_edit.ftl"> +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/trainweb/work_done_main_edit.ftl b/WEB-INF/view/cetc54/trainweb/work_done_main_edit.ftl new file mode 100644 index 0000000..7543e6a --- /dev/null +++ b/WEB-INF/view/cetc54/trainweb/work_done_main_edit.ftl @@ -0,0 +1,22 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/trainweb/work_done_main_list.ftl b/WEB-INF/view/cetc54/trainweb/work_done_main_list.ftl new file mode 100644 index 0000000..9d8c76a --- /dev/null +++ b/WEB-INF/view/cetc54/trainweb/work_done_main_list.ftl @@ -0,0 +1,41 @@ +
      +
      + + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + +
      序号操作任务名称提出人提出人部门发起时间操作
      {{i+1}}{{value.name}}{{value.username}}{{value.orgname}}{{value.creater_time |dateTimeFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/trainweb/work_start_main.ftl b/WEB-INF/view/cetc54/trainweb/work_start_main.ftl new file mode 100644 index 0000000..56e21cf --- /dev/null +++ b/WEB-INF/view/cetc54/trainweb/work_start_main.ftl @@ -0,0 +1,12 @@ + + + +<#include "../layout/ref_head.ftl"> + + +<#include "work_start_main_list.ftl"> +<#include "work_start_main_edit.ftl"> +<#include "../layout/ref_script.ftl"> + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/trainweb/work_start_main_edit.ftl b/WEB-INF/view/cetc54/trainweb/work_start_main_edit.ftl new file mode 100644 index 0000000..7543e6a --- /dev/null +++ b/WEB-INF/view/cetc54/trainweb/work_start_main_edit.ftl @@ -0,0 +1,22 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/trainweb/work_start_main_list.ftl b/WEB-INF/view/cetc54/trainweb/work_start_main_list.ftl new file mode 100644 index 0000000..1db18af --- /dev/null +++ b/WEB-INF/view/cetc54/trainweb/work_start_main_list.ftl @@ -0,0 +1,41 @@ +
      +
      + + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + + + <#----> + + + + + + + +
      序号操作任务名称提出人提出人部门发起时间操作
      {{i+1}}{{value.name}}{{value.username}}{{value.orgname}}{{value.creater_time |dateTimeFilter}}
      +
      +
      diff --git a/WEB-INF/view/cetc54/user/org.ftl b/WEB-INF/view/cetc54/user/org.ftl new file mode 100644 index 0000000..401a2ac --- /dev/null +++ b/WEB-INF/view/cetc54/user/org.ftl @@ -0,0 +1,26 @@ + + + + <#include "../layout/ref_head.ftl"> + + + +
      +
      + +
      +
      + <#include "org_list.ftl"> + <#include "org_edit.ftl"> +
      +
      +
      +
      +<#include "../layout/ref_script.ftl"> + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/org_edit.ftl b/WEB-INF/view/cetc54/user/org_edit.ftl new file mode 100644 index 0000000..7b0d2a2 --- /dev/null +++ b/WEB-INF/view/cetc54/user/org_edit.ftl @@ -0,0 +1,59 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/org_list.ftl b/WEB-INF/view/cetc54/user/org_list.ftl new file mode 100644 index 0000000..309b609 --- /dev/null +++ b/WEB-INF/view/cetc54/user/org_list.ftl @@ -0,0 +1,73 @@ +
      +
      + + + + + +
      + <#if op_Add> + + + <#if op_Delete> + + + <#if op_Add||op_Delete> + + + + +
      +
      + + + + + <#if op_Eidt||op_Delete> + + + + + + + + + + + + + + + + + + <#if op_Eidt||op_Delete> + + + + + + + + + + + + + +
      操作序号组织名称组织类型自动展开排序号节点图标上级组织组织编码热键
      + <#if op_Eidt> + + + <#if op_Eidt&&op_Delete> + <#if op_Delete> + + + {{i+1}}{{value.name}}{{value.orgtype |orgtypeFilter}}{{value.is_auto_expand |istrueFilter}}{{value.sort_no}}{{value.icon_name}}{{value.parent_name}}{{value.code}}{{value.hotkey}}
      +
      +
      \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/user.ftl b/WEB-INF/view/cetc54/user/user.ftl new file mode 100644 index 0000000..ccb2507 --- /dev/null +++ b/WEB-INF/view/cetc54/user/user.ftl @@ -0,0 +1,32 @@ + + + +<#include "../layout/ref_head.ftl"> + + + +
      +
      +
      + +
      +
      + <#include "user_list.ftl"> + <#include "user_edit.ftl"> + <#include "user_batchorg.ftl"> + <#include "user_module.ftl"> + <#include "user_role.ftl"> + <#include "../role/role_batchroletype.ftl"> +
      +
      +<#include "../layout/ref_script.ftl"> + + + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/user_batchorg.ftl b/WEB-INF/view/cetc54/user/user_batchorg.ftl new file mode 100644 index 0000000..518d1eb --- /dev/null +++ b/WEB-INF/view/cetc54/user/user_batchorg.ftl @@ -0,0 +1,18 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/user_edit.ftl b/WEB-INF/view/cetc54/user/user_edit.ftl new file mode 100644 index 0000000..c7ac84f --- /dev/null +++ b/WEB-INF/view/cetc54/user/user_edit.ftl @@ -0,0 +1,44 @@ +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/user_edit_ext.ftl b/WEB-INF/view/cetc54/user/user_edit_ext.ftl new file mode 100644 index 0000000..fda3e50 --- /dev/null +++ b/WEB-INF/view/cetc54/user/user_edit_ext.ftl @@ -0,0 +1,49 @@ +
      扩展信息
      + + + + + + + + + + + + + + + + + + + +
      邮箱: + 身份证号: +
      手机: + 座机号: +
      联系地址: + 邮政编码: +
      +
      头像&形象照片
      +
      +
      +
      头像
      +
      +
      +
      +
      +
      形象照片
      +
      +
      +
      +
      + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/user_list.ftl b/WEB-INF/view/cetc54/user/user_list.ftl new file mode 100644 index 0000000..f900a67 --- /dev/null +++ b/WEB-INF/view/cetc54/user/user_list.ftl @@ -0,0 +1,94 @@ +
      +
      + + + + + +
      + + + + + + + + + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      头像操作序号登录账户用户姓名性别所属组织用户状态用户类型
      {{value |avatarsFilter}} + + + {{i+1}}{{value.loginname}}{{value.username}}{{value.sex |sexFilter}}{{value.orgs |orgFilter}}{{value.status |statusFilter}}{{value.usertype |usertypeFilter}}
      +
      +
      + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/user_module.ftl b/WEB-INF/view/cetc54/user/user_module.ftl new file mode 100644 index 0000000..9e8d2f0 --- /dev/null +++ b/WEB-INF/view/cetc54/user/user_module.ftl @@ -0,0 +1,3 @@ +
      +
        +
        \ No newline at end of file diff --git a/WEB-INF/view/cetc54/user/user_role.ftl b/WEB-INF/view/cetc54/user/user_role.ftl new file mode 100644 index 0000000..38bd249 --- /dev/null +++ b/WEB-INF/view/cetc54/user/user_role.ftl @@ -0,0 +1,87 @@ +
        +
        +
        +
        + + + + + +
        + 未授权角色 + + +
        +
        + + + + + + + + + + + + + + + + + + + +
        序号角色名称角色类型创建人
        {{i+1}}{{value.name}}{{value.roletype |roletypeFilter}}{{value.username}}({{value.loginname}})
        +
        +
        +
        +
        +
        + +
        +
        + +
        +
        +
        +
        +
        + + + + + +
        + 已授权角色 + + + +
        +
        + + + + + + + + + + + + + + + + + + + +
        序号角色名称角色类型角色授权
        {{i+1}}{{value.name}}{{value.roletype |roletypeFilter}}{{value.userroletype | userRoletypeFilter}}
        +
        +
        +
        +
        \ No newline at end of file diff --git a/WEB-INF/view/cetc54/userprofile/index.ftl b/WEB-INF/view/cetc54/userprofile/index.ftl new file mode 100644 index 0000000..569897b --- /dev/null +++ b/WEB-INF/view/cetc54/userprofile/index.ftl @@ -0,0 +1,35 @@ + + + +<#include "../layout/ref_head.ftl"> + + + +
        +
        +
        + <#include "user_depart.ftl"> +
        +
        + <#include "user_baseinfo.ftl"> +
        +
        +
        + <#include "user_rolepermi.ftl"> +
        +
        +
        + <#include "user_pass.ftl"> +
        +
        + <#--
        --> + <#--开发中...--> + <#--
        --> +
        +<#include "../layout/ref_script.ftl"> + + + + + + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/userprofile/user_baseinfo.ftl b/WEB-INF/view/cetc54/userprofile/user_baseinfo.ftl new file mode 100644 index 0000000..77c97ff --- /dev/null +++ b/WEB-INF/view/cetc54/userprofile/user_baseinfo.ftl @@ -0,0 +1,28 @@ +
        +
        + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/userprofile/user_depart.ftl b/WEB-INF/view/cetc54/userprofile/user_depart.ftl new file mode 100644 index 0000000..20eb7a0 --- /dev/null +++ b/WEB-INF/view/cetc54/userprofile/user_depart.ftl @@ -0,0 +1,16 @@ +
        部门信息
        +<#if (userInfo.orgList?size)==1> +
        ${userInfo.defaultOrgInfo.name}
        +<#else> +
        + <#list userInfo.orgList as org> + + +
        + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/userprofile/user_pass.ftl b/WEB-INF/view/cetc54/userprofile/user_pass.ftl new file mode 100644 index 0000000..d5ff24b --- /dev/null +++ b/WEB-INF/view/cetc54/userprofile/user_pass.ftl @@ -0,0 +1,27 @@ +
        +
        + \ No newline at end of file diff --git a/WEB-INF/view/cetc54/userprofile/user_rolepermi.ftl b/WEB-INF/view/cetc54/userprofile/user_rolepermi.ftl new file mode 100644 index 0000000..099d155 --- /dev/null +++ b/WEB-INF/view/cetc54/userprofile/user_rolepermi.ftl @@ -0,0 +1,8 @@ +
        +
        角色信息
        +
        +
        +
        +
        权限信息
        +
          +
          \ No newline at end of file diff --git a/WEB-INF/web.xml b/WEB-INF/web.xml new file mode 100644 index 0000000..23ffe41 --- /dev/null +++ b/WEB-INF/web.xml @@ -0,0 +1,84 @@ + + + + + index.html + + + + mvcFilter + org.springframework.web.filter.DelegatingFilterProxy + + viewBasePath + / + + + encoding + utf-8 + + + targetFilterLifecycle + true + + + + mvcFilter + /* + + + + + 480 + + + + + DruidStatView + com.alibaba.druid.support.http.StatViewServlet + + + resetEnable + false + + + + ReportServer + com.fr.web.ReportServlet + 0 + + + CXFServlet + org.apache.cxf.transport.servlet.CXFServlet + 1 + + + + + ReportServer + /ReportServer + + + + DruidStatView + /druid/* + + + + + + + CXFServlet + /services/* + + + + + + org.springframework.web.context.ContextLoaderListener + org.springframework.web.context.request.RequestContextListener + + \ No newline at end of file diff --git a/asset/_temp/certificateexample.docx b/asset/_temp/certificateexample.docx new file mode 100644 index 0000000..b420109 Binary files /dev/null and b/asset/_temp/certificateexample.docx differ diff --git a/asset/_temp/classuser.xls b/asset/_temp/classuser.xls new file mode 100644 index 0000000..b293a19 Binary files /dev/null and b/asset/_temp/classuser.xls differ diff --git a/asset/_temp/estimatepaper.xls b/asset/_temp/estimatepaper.xls new file mode 100644 index 0000000..b0961d9 Binary files /dev/null and b/asset/_temp/estimatepaper.xls differ diff --git a/asset/_temp/estimateresult.xlsx b/asset/_temp/estimateresult.xlsx new file mode 100644 index 0000000..35d3bd7 Binary files /dev/null and b/asset/_temp/estimateresult.xlsx differ diff --git a/asset/_temp/exam.xls b/asset/_temp/exam.xls new file mode 100644 index 0000000..2b9f3cc Binary files /dev/null and b/asset/_temp/exam.xls differ diff --git a/asset/_temp/examresult.xls b/asset/_temp/examresult.xls new file mode 100644 index 0000000..0ef47a5 Binary files /dev/null and b/asset/_temp/examresult.xls differ diff --git a/asset/_temp/groupinplan.xls b/asset/_temp/groupinplan.xls new file mode 100644 index 0000000..d0d23e3 Binary files /dev/null and b/asset/_temp/groupinplan.xls differ diff --git a/asset/_temp/instituteplan.xls b/asset/_temp/instituteplan.xls new file mode 100644 index 0000000..e4aedc0 Binary files /dev/null and b/asset/_temp/instituteplan.xls differ diff --git a/asset/_temp/outTrainStudentImport.xlsx b/asset/_temp/outTrainStudentImport.xlsx new file mode 100644 index 0000000..0d3c2c6 Binary files /dev/null and b/asset/_temp/outTrainStudentImport.xlsx differ diff --git a/asset/_temp/person.xls b/asset/_temp/person.xls new file mode 100644 index 0000000..96cda52 Binary files /dev/null and b/asset/_temp/person.xls differ diff --git a/asset/_temp/question.xls b/asset/_temp/question.xls new file mode 100644 index 0000000..af43420 Binary files /dev/null and b/asset/_temp/question.xls differ diff --git a/asset/_temp/research.xls b/asset/_temp/research.xls new file mode 100644 index 0000000..8738f1b Binary files /dev/null and b/asset/_temp/research.xls differ diff --git a/asset/_temp/superiorunittrain.xls b/asset/_temp/superiorunittrain.xls new file mode 100644 index 0000000..58a74b2 Binary files /dev/null and b/asset/_temp/superiorunittrain.xls differ diff --git a/asset/css/cetc54/animate.css b/asset/css/cetc54/animate.css new file mode 100644 index 0000000..ee8fd8f --- /dev/null +++ b/asset/css/cetc54/animate.css @@ -0,0 +1,3554 @@ +.animated { + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + -o-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + -moz-animation-fill-mode: both; + -o-animation-fill-mode: both; + animation-fill-mode: both; +} +.animated.fast { + -webkit-animation-duration: .5s; + -moz-animation-duration: .5s; + -o-animation-duration: .5s; + animation-duration: .5s; +} +.animated.hinge { + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -o-animation-duration: 2s; + animation-duration: 2s; +} +@-webkit-keyframes flash { + 0%, + 50%, + 100% { + opacity: 1; + } + 25%, + 75% { + opacity: 0; + } +} +@-moz-keyframes flash { + 0%, + 50%, + 100% { + opacity: 1; + } + 25%, + 75% { + opacity: 0; + } +} +@-o-keyframes flash { + 0%, + 50%, + 100% { + opacity: 1; + } + 25%, + 75% { + opacity: 0; + } +} +@keyframes flash { + 0%, + 50%, + 100% { + opacity: 1; + } + 25%, + 75% { + opacity: 0; + } +} +.animated.flash { + -webkit-animation-name: flash; + -moz-animation-name: flash; + -o-animation-name: flash; + animation-name: flash; +} +@-webkit-keyframes shake { + 0%, + 100% { + -webkit-transform: translateX(0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + -webkit-transform: translateX(-10px); + } + 20%, + 40%, + 60%, + 80% { + -webkit-transform: translateX(10px); + } +} +@-moz-keyframes shake { + 0%, + 100% { + -moz-transform: translateX(0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + -moz-transform: translateX(-10px); + } + 20%, + 40%, + 60%, + 80% { + -moz-transform: translateX(10px); + } +} +@-o-keyframes shake { + 0%, + 100% { + -o-transform: translateX(0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + -o-transform: translateX(-10px); + } + 20%, + 40%, + 60%, + 80% { + -o-transform: translateX(10px); + } +} +@keyframes shake { + 0%, + 100% { + transform: translateX(0); + } + 10%, + 30%, + 50%, + 70%, + 90% { + transform: translateX(-10px); + } + 20%, + 40%, + 60%, + 80% { + transform: translateX(10px); + } +} +.animated.shake { + -webkit-animation-name: shake; + -moz-animation-name: shake; + -o-animation-name: shake; + animation-name: shake; +} +@-webkit-keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + -webkit-transform: translateY(0); + } + 40% { + -webkit-transform: translateY(-30px); + } + 60% { + -webkit-transform: translateY(-15px); + } +} +@-moz-keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + -moz-transform: translateY(0); + } + 40% { + -moz-transform: translateY(-30px); + } + 60% { + -moz-transform: translateY(-15px); + } +} +@-o-keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + -o-transform: translateY(0); + } + 40% { + -o-transform: translateY(-30px); + } + 60% { + -o-transform: translateY(-15px); + } +} +@keyframes bounce { + 0%, + 20%, + 50%, + 80%, + 100% { + transform: translateY(0); + } + 40% { + transform: translateY(-30px); + } + 60% { + transform: translateY(-15px); + } +} +.animated.bounce { + -webkit-animation-name: bounce; + -moz-animation-name: bounce; + -o-animation-name: bounce; + animation-name: bounce; +} +@-webkit-keyframes tada { + 0% { + -webkit-transform: scale(1); + } + 10%, + 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + } + 30%, + 50%, + 70%, + 90% { + -webkit-transform: scale(1.1) rotate(3deg); + } + 40%, + 60%, + 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + } + 100% { + -webkit-transform: scale(1) rotate(0); + } +} +@-moz-keyframes tada { + 0% { + -moz-transform: scale(1); + } + 10%, + 20% { + -moz-transform: scale(0.9) rotate(-3deg); + } + 30%, + 50%, + 70%, + 90% { + -moz-transform: scale(1.1) rotate(3deg); + } + 40%, + 60%, + 80% { + -moz-transform: scale(1.1) rotate(-3deg); + } + 100% { + -moz-transform: scale(1) rotate(0); + } +} +@-o-keyframes tada { + 0% { + -o-transform: scale(1); + } + 10%, + 20% { + -o-transform: scale(0.9) rotate(-3deg); + } + 30%, + 50%, + 70%, + 90% { + -o-transform: scale(1.1) rotate(3deg); + } + 40%, + 60%, + 80% { + -o-transform: scale(1.1) rotate(-3deg); + } + 100% { + -o-transform: scale(1) rotate(0); + } +} +@keyframes tada { + 0% { + transform: scale(1); + } + 10%, + 20% { + transform: scale(0.9) rotate(-3deg); + } + 30%, + 50%, + 70%, + 90% { + transform: scale(1.1) rotate(3deg); + } + 40%, + 60%, + 80% { + transform: scale(1.1) rotate(-3deg); + } + 100% { + transform: scale(1) rotate(0); + } +} +.animated.tada { + -webkit-animation-name: tada; + -moz-animation-name: tada; + -o-animation-name: tada; + animation-name: tada; +} +@-webkit-keyframes swing { + 20%, + 40%, + 60%, + 80%, + 100% { + -webkit-transform-origin: top center; + } + 20% { + -webkit-transform: rotate(15deg); + } + 40% { + -webkit-transform: rotate(-10deg); + } + 60% { + -webkit-transform: rotate(5deg); + } + 80% { + -webkit-transform: rotate(-5deg); + } + 100% { + -webkit-transform: rotate(0deg); + } +} +@-moz-keyframes swing { + 20% { + -moz-transform: rotate(15deg); + } + 40% { + -moz-transform: rotate(-10deg); + } + 60% { + -moz-transform: rotate(5deg); + } + 80% { + -moz-transform: rotate(-5deg); + } + 100% { + -moz-transform: rotate(0deg); + } +} +@-o-keyframes swing { + 20% { + -o-transform: rotate(15deg); + } + 40% { + -o-transform: rotate(-10deg); + } + 60% { + -o-transform: rotate(5deg); + } + 80% { + -o-transform: rotate(-5deg); + } + 100% { + -o-transform: rotate(0deg); + } +} +@keyframes swing { + 20% { + transform: rotate(15deg); + } + 40% { + transform: rotate(-10deg); + } + 60% { + transform: rotate(5deg); + } + 80% { + transform: rotate(-5deg); + } + 100% { + transform: rotate(0deg); + } +} +.animated.swing { + -webkit-transform-origin: top center; + -moz-transform-origin: top center; + -o-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + -moz-animation-name: swing; + -o-animation-name: swing; + animation-name: swing; +} +@-webkit-keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + } + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + } + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + } + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + } + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + } + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + } + 100% { + -webkit-transform: translateX(0%); + } +} +@-moz-keyframes wobble { + 0% { + -moz-transform: translateX(0%); + } + 15% { + -moz-transform: translateX(-25%) rotate(-5deg); + } + 30% { + -moz-transform: translateX(20%) rotate(3deg); + } + 45% { + -moz-transform: translateX(-15%) rotate(-3deg); + } + 60% { + -moz-transform: translateX(10%) rotate(2deg); + } + 75% { + -moz-transform: translateX(-5%) rotate(-1deg); + } + 100% { + -moz-transform: translateX(0%); + } +} +@-o-keyframes wobble { + 0% { + -o-transform: translateX(0%); + } + 15% { + -o-transform: translateX(-25%) rotate(-5deg); + } + 30% { + -o-transform: translateX(20%) rotate(3deg); + } + 45% { + -o-transform: translateX(-15%) rotate(-3deg); + } + 60% { + -o-transform: translateX(10%) rotate(2deg); + } + 75% { + -o-transform: translateX(-5%) rotate(-1deg); + } + 100% { + -o-transform: translateX(0%); + } +} +@keyframes wobble { + 0% { + transform: translateX(0%); + } + 15% { + transform: translateX(-25%) rotate(-5deg); + } + 30% { + transform: translateX(20%) rotate(3deg); + } + 45% { + transform: translateX(-15%) rotate(-3deg); + } + 60% { + transform: translateX(10%) rotate(2deg); + } + 75% { + transform: translateX(-5%) rotate(-1deg); + } + 100% { + transform: translateX(0%); + } +} +.animated.wobble { + -webkit-animation-name: wobble; + -moz-animation-name: wobble; + -o-animation-name: wobble; + animation-name: wobble; +} +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale(1); + } + 50% { + -webkit-transform: scale(1.1); + } + 100% { + -webkit-transform: scale(1); + } +} +@-moz-keyframes pulse { + 0% { + -moz-transform: scale(1); + } + 50% { + -moz-transform: scale(1.1); + } + 100% { + -moz-transform: scale(1); + } +} +@-o-keyframes pulse { + 0% { + -o-transform: scale(1); + } + 50% { + -o-transform: scale(1.1); + } + 100% { + -o-transform: scale(1); + } +} +@keyframes pulse { + 0% { + transform: scale(1); + } + 50% { + transform: scale(1.1); + } + 100% { + transform: scale(1); + } +} +.animated.pulse { + -webkit-animation-name: pulse; + -moz-animation-name: pulse; + -o-animation-name: pulse; + animation-name: pulse; +} +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + } + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + } + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + } + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + -webkit-animation-timing-function: ease-in; + } + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + } +} +@-moz-keyframes flip { + 0% { + -moz-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -moz-animation-timing-function: ease-out; + } + 40% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -moz-animation-timing-function: ease-out; + } + 50% { + -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -moz-animation-timing-function: ease-in; + } + 80% { + -moz-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + -moz-animation-timing-function: ease-in; + } + 100% { + -moz-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -moz-animation-timing-function: ease-in; + } +} +@-o-keyframes flip { + 0% { + -o-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -o-animation-timing-function: ease-out; + } + 40% { + -o-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -o-animation-timing-function: ease-out; + } + 50% { + -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -o-animation-timing-function: ease-in; + } + 80% { + -o-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + -o-animation-timing-function: ease-in; + } + 100% { + -o-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -o-animation-timing-function: ease-in; + } +} +@keyframes flip { + 0% { + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + animation-timing-function: ease-out; + } + 40% { + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + animation-timing-function: ease-out; + } + 50% { + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + animation-timing-function: ease-in; + } + 80% { + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(0.95); + animation-timing-function: ease-in; + } + 100% { + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + animation-timing-function: ease-in; + } +} +.animated.flip { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flip; + -moz-backface-visibility: visible !important; + -moz-animation-name: flip; + -o-backface-visibility: visible !important; + -o-animation-name: flip; + backface-visibility: visible !important; + animation-name: flip; +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInX { + 0% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + 40% { + -moz-transform: perspective(400px) rotateX(-10deg); + } + 70% { + -moz-transform: perspective(400px) rotateX(10deg); + } + 100% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@-o-keyframes flipInX { + 0% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + 40% { + -o-transform: perspective(400px) rotateX(-10deg); + } + 70% { + -o-transform: perspective(400px) rotateX(10deg); + } + 100% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + 40% { + transform: perspective(400px) rotateX(-10deg); + } + 70% { + transform: perspective(400px) rotateX(10deg); + } + 100% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} +.animated.flipInX { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInX; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInX; + -o-backface-visibility: visible !important; + -o-animation-name: flipInX; + backface-visibility: visible !important; + animation-name: flipInX; +} +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} +@-moz-keyframes flipOutX { + 0% { + -moz-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} +@-o-keyframes flipOutX { + 0% { + -o-transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} +@keyframes flipOutX { + 0% { + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} +.animated.flipOutX { + -webkit-animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -moz-animation-name: flipOutX; + -moz-backface-visibility: visible !important; + -o-animation-name: flipOutX; + -o-backface-visibility: visible !important; + animation-name: flipOutX; + backface-visibility: visible !important; +} +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + } + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + } + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-moz-keyframes flipInY { + 0% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + 40% { + -moz-transform: perspective(400px) rotateY(-10deg); + } + 70% { + -moz-transform: perspective(400px) rotateY(10deg); + } + 100% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@-o-keyframes flipInY { + 0% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + 40% { + -o-transform: perspective(400px) rotateY(-10deg); + } + 70% { + -o-transform: perspective(400px) rotateY(10deg); + } + 100% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +@keyframes flipInY { + 0% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + 40% { + transform: perspective(400px) rotateY(-10deg); + } + 70% { + transform: perspective(400px) rotateY(10deg); + } + 100% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} +.animated.flipInY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipInY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipInY; + -o-backface-visibility: visible !important; + -o-animation-name: flipInY; + backface-visibility: visible !important; + animation-name: flipInY; +} +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-moz-keyframes flipOutY { + 0% { + -moz-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -moz-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@-o-keyframes flipOutY { + 0% { + -o-transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + -o-transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +@keyframes flipOutY { + 0% { + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + 100% { + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} +.animated.flipOutY { + -webkit-backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + -moz-backface-visibility: visible !important; + -moz-animation-name: flipOutY; + -o-backface-visibility: visible !important; + -o-animation-name: flipOutY; + backface-visibility: visible !important; + animation-name: flipOutY; +} +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-moz-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-o-keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +.animated.fadeIn { + -webkit-animation-name: fadeIn; + -moz-animation-name: fadeIn; + -o-animation-name: fadeIn; + animation-name: fadeIn; +} +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@-moz-keyframes fadeInUp { + 0% { + opacity: 0; + -moz-transform: translateY(20px); + } + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} +@-o-keyframes fadeInUp { + 0% { + opacity: 0; + -o-transform: translateY(20px); + } + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} +@keyframes fadeInUp { + 0% { + opacity: 0; + transform: translateY(20px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +.animated.fadeInUp { + -webkit-animation-name: fadeInUp; + -moz-animation-name: fadeInUp; + -o-animation-name: fadeInUp; + animation-name: fadeInUp; +} +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@-moz-keyframes fadeInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-20px); + } + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} +@-o-keyframes fadeInDown { + 0% { + opacity: 0; + -o-transform: translateY(-20px); + } + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} +@keyframes fadeInDown { + 0% { + opacity: 0; + transform: translateY(-20px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +.animated.fadeInDown { + -webkit-animation-name: fadeInDown; + -moz-animation-name: fadeInDown; + -o-animation-name: fadeInDown; + animation-name: fadeInDown; +} +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-20px); + } + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-o-keyframes fadeInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-20px); + } + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInLeft { + 0% { + opacity: 0; + transform: translateX(-20px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} +.animated.fadeInLeft { + -webkit-animation-name: fadeInLeft; + -moz-animation-name: fadeInLeft; + -o-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInRight { + 0% { + opacity: 0; + -moz-transform: translateX(20px); + } + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-o-keyframes fadeInRight { + 0% { + opacity: 0; + -o-transform: translateX(20px); + } + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInRight { + 0% { + opacity: 0; + transform: translateX(20px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} +.animated.fadeInRight { + -webkit-animation-name: fadeInRight; + -moz-animation-name: fadeInRight; + -o-animation-name: fadeInRight; + animation-name: fadeInRight; +} +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@-moz-keyframes fadeInUpBig { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} +@-o-keyframes fadeInUpBig { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} +@keyframes fadeInUpBig { + 0% { + opacity: 0; + transform: translateY(2000px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +.animated.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + -moz-animation-name: fadeInUpBig; + -o-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@-moz-keyframes fadeInDownBig { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + 100% { + opacity: 1; + -moz-transform: translateY(0); + } +} +@-o-keyframes fadeInDownBig { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + 100% { + opacity: 1; + -o-transform: translateY(0); + } +} +@keyframes fadeInDownBig { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +.animated.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + -moz-animation-name: fadeInDownBig; + -o-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-o-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} +.animated.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + -moz-animation-name: fadeInLeftBig; + -o-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@-moz-keyframes fadeInRightBig { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + 100% { + opacity: 1; + -moz-transform: translateX(0); + } +} +@-o-keyframes fadeInRightBig { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + 100% { + opacity: 1; + -o-transform: translateX(0); + } +} +@keyframes fadeInRightBig { + 0% { + opacity: 0; + transform: translateX(2000px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} +.animated.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + -moz-animation-name: fadeInRightBig; + -o-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} +@-webkit-keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@-moz-keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@-o-keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@keyframes fadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +.animated.fadeOut { + -webkit-animation-name: fadeOut; + -moz-animation-name: fadeOut; + -o-animation-name: fadeOut; + animation-name: fadeOut; +} +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + } +} +@-moz-keyframes fadeOutUp { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + 100% { + opacity: 0; + -moz-transform: translateY(-20px); + } +} +@-o-keyframes fadeOutUp { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + 100% { + opacity: 0; + -o-transform: translateY(-20px); + } +} +@keyframes fadeOutUp { + 0% { + opacity: 1; + transform: translateY(0); + } + 100% { + opacity: 0; + transform: translateY(-20px); + } +} +.animated.fadeOutUp { + -webkit-animation-name: fadeOutUp; + -moz-animation-name: fadeOutUp; + -o-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + } +} +@-moz-keyframes fadeOutDown { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + 100% { + opacity: 0; + -moz-transform: translateY(20px); + } +} +@-o-keyframes fadeOutDown { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + 100% { + opacity: 0; + -o-transform: translateY(20px); + } +} +@keyframes fadeOutDown { + 0% { + opacity: 1; + transform: translateY(0); + } + 100% { + opacity: 0; + transform: translateY(20px); + } +} +.animated.fadeOutDown { + -webkit-animation-name: fadeOutDown; + -moz-animation-name: fadeOutDown; + -o-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + } +} +@-moz-keyframes fadeOutLeft { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + 100% { + opacity: 0; + -moz-transform: translateX(-20px); + } +} +@-o-keyframes fadeOutLeft { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + 100% { + opacity: 0; + -o-transform: translateX(-20px); + } +} +@keyframes fadeOutLeft { + 0% { + opacity: 1; + transform: translateX(0); + } + 100% { + opacity: 0; + transform: translateX(-20px); + } +} +.animated.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + -moz-animation-name: fadeOutLeft; + -o-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + } +} +@-moz-keyframes fadeOutRight { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + 100% { + opacity: 0; + -moz-transform: translateX(20px); + } +} +@-o-keyframes fadeOutRight { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + 100% { + opacity: 0; + -o-transform: translateX(20px); + } +} +@keyframes fadeOutRight { + 0% { + opacity: 1; + transform: translateX(0); + } + 100% { + opacity: 0; + transform: translateX(20px); + } +} +.animated.fadeOutRight { + -webkit-animation-name: fadeOutRight; + -moz-animation-name: fadeOutRight; + -o-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} +@-moz-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} +@-o-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + transform: translateY(0); + } + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} +.animated.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + -moz-animation-name: fadeOutUpBig; + -o-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} +@-moz-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -moz-transform: translateY(0); + } + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} +@-o-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -o-transform: translateY(0); + } + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + transform: translateY(0); + } + 100% { + opacity: 0; + transform: translateY(2000px); + } +} +.animated.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + -moz-animation-name: fadeOutDownBig; + -o-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} +@-moz-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} +@-o-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + transform: translateX(0); + } + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} +.animated.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + -moz-animation-name: fadeOutLeftBig; + -o-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} +@-moz-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -moz-transform: translateX(0); + } + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} +@-o-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -o-transform: translateX(0); + } + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + transform: translateX(0); + } + 100% { + opacity: 0; + transform: translateX(2000px); + } +} +.animated.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + -moz-animation-name: fadeOutRightBig; + -o-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.3); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + } + 70% { + -webkit-transform: scale(0.9); + } + 100% { + -webkit-transform: scale(1); + } +} +@-moz-keyframes bounceIn { + 0% { + opacity: 0; + -moz-transform: scale(0.3); + } + 50% { + opacity: 1; + -moz-transform: scale(1.05); + } + 70% { + -moz-transform: scale(0.9); + } + 100% { + -moz-transform: scale(1); + } +} +@-o-keyframes bounceIn { + 0% { + opacity: 0; + -o-transform: scale(0.3); + } + 50% { + opacity: 1; + -o-transform: scale(1.05); + } + 70% { + -o-transform: scale(0.9); + } + 100% { + -o-transform: scale(1); + } +} +@keyframes bounceIn { + 0% { + opacity: 0; + transform: scale(0.3); + } + 50% { + opacity: 1; + transform: scale(1.05); + } + 70% { + transform: scale(0.9); + } + 100% { + transform: scale(1); + } +} +@-webkit-keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + 100% { + -webkit-transform: translateY(0); + } +} +@-moz-keyframes slideInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + 100% { + -moz-transform: translateY(0); + } +} +@-o-keyframes slideInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + 100% { + -o-transform: translateY(0); + } +} +@keyframes slideInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + 100% { + transform: translateY(0); + } +} +.slideInDown { + -webkit-animation-name: slideInDown; + -moz-animation-name: slideInDown; + -o-animation-name: slideInDown; + animation-name: slideInDown; +} +@-webkit-keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + 100% { + -webkit-transform: translateX(0); + } +} +@-moz-keyframes slideInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + 100% { + -moz-transform: translateX(0); + } +} +@-o-keyframes slideInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + 100% { + -o-transform: translateX(0); + } +} +@keyframes slideInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + 100% { + transform: translateX(0); + } +} +.slideInLeft { + -webkit-animation-name: slideInLeft; + -moz-animation-name: slideInLeft; + -o-animation-name: slideInLeft; + animation-name: slideInLeft; +} +@-webkit-keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + 100% { + -webkit-transform: translateX(0); + } +} +@-moz-keyframes slideInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + 100% { + -moz-transform: translateX(0); + } +} +@-o-keyframes slideInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + 100% { + -o-transform: translateX(0); + } +} +@keyframes slideInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + 100% { + transform: translateX(0); + } +} +.slideInRight { + -webkit-animation-name: slideInRight; + -moz-animation-name: slideInRight; + -o-animation-name: slideInRight; + animation-name: slideInRight; +} +@-webkit-keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} +@-moz-keyframes slideOutLeft { + 0% { + -moz-transform: translateX(0); + } + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} +@-o-keyframes slideOutLeft { + 0% { + -o-transform: translateX(0); + } + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} +@keyframes slideOutLeft { + 0% { + transform: translateX(0); + } + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + -moz-animation-name: slideOutLeft; + -o-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} +@-webkit-keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} +@-moz-keyframes slideOutRight { + 0% { + -moz-transform: translateX(0); + } + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} +@-o-keyframes slideOutRight { + 0% { + -o-transform: translateX(0); + } + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} +@keyframes slideOutRight { + 0% { + transform: translateX(0); + } + 100% { + opacity: 0; + transform: translateX(2000px); + } +} +.slideOutRight { + -webkit-animation-name: slideOutRight; + -moz-animation-name: slideOutRight; + -o-animation-name: slideOutRight; + animation-name: slideOutRight; +} +@-webkit-keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} +@-moz-keyframes slideOutUp { + 0% { + -moz-transform: translateY(0); + } + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} +@-o-keyframes slideOutUp { + 0% { + -o-transform: translateY(0); + } + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} +@keyframes slideOutUp { + 0% { + transform: translateY(0); + } + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} +.slideOutUp { + -webkit-animation-name: slideOutUp; + -moz-animation-name: slideOutUp; + -o-animation-name: slideOutUp; + animation-name: slideOutUp; +} +.animated.bounceIn { + -webkit-animation-name: bounceIn; + -moz-animation-name: bounceIn; + -o-animation-name: bounceIn; + animation-name: bounceIn; +} +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + } + 80% { + -webkit-transform: translateY(10px); + } + 100% { + -webkit-transform: translateY(0); + } +} +@-moz-keyframes bounceInUp { + 0% { + opacity: 0; + -moz-transform: translateY(2000px); + } + 60% { + opacity: 1; + -moz-transform: translateY(-30px); + } + 80% { + -moz-transform: translateY(10px); + } + 100% { + -moz-transform: translateY(0); + } +} +@-o-keyframes bounceInUp { + 0% { + opacity: 0; + -o-transform: translateY(2000px); + } + 60% { + opacity: 1; + -o-transform: translateY(-30px); + } + 80% { + -o-transform: translateY(10px); + } + 100% { + -o-transform: translateY(0); + } +} +@keyframes bounceInUp { + 0% { + opacity: 0; + transform: translateY(2000px); + } + 60% { + opacity: 1; + transform: translateY(-30px); + } + 80% { + transform: translateY(10px); + } + 100% { + transform: translateY(0); + } +} +.animated.bounceInUp { + -webkit-animation-name: bounceInUp; + -moz-animation-name: bounceInUp; + -o-animation-name: bounceInUp; + animation-name: bounceInUp; +} +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + } + 80% { + -webkit-transform: translateY(-10px); + } + 100% { + -webkit-transform: translateY(0); + } +} +@-moz-keyframes bounceInDown { + 0% { + opacity: 0; + -moz-transform: translateY(-2000px); + } + 60% { + opacity: 1; + -moz-transform: translateY(30px); + } + 80% { + -moz-transform: translateY(-10px); + } + 100% { + -moz-transform: translateY(0); + } +} +@-o-keyframes bounceInDown { + 0% { + opacity: 0; + -o-transform: translateY(-2000px); + } + 60% { + opacity: 1; + -o-transform: translateY(30px); + } + 80% { + -o-transform: translateY(-10px); + } + 100% { + -o-transform: translateY(0); + } +} +@keyframes bounceInDown { + 0% { + opacity: 0; + transform: translateY(-2000px); + } + 60% { + opacity: 1; + transform: translateY(30px); + } + 80% { + transform: translateY(-10px); + } + 100% { + transform: translateY(0); + } +} +.animated.bounceInDown { + -webkit-animation-name: bounceInDown; + -moz-animation-name: bounceInDown; + -o-animation-name: bounceInDown; + animation-name: bounceInDown; +} +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + } + 80% { + -webkit-transform: translateX(-10px); + } + 100% { + -webkit-transform: translateX(0); + } +} +@-moz-keyframes bounceInLeft { + 0% { + opacity: 0; + -moz-transform: translateX(-2000px); + } + 60% { + opacity: 1; + -moz-transform: translateX(30px); + } + 80% { + -moz-transform: translateX(-10px); + } + 100% { + -moz-transform: translateX(0); + } +} +@-o-keyframes bounceInLeft { + 0% { + opacity: 0; + -o-transform: translateX(-2000px); + } + 60% { + opacity: 1; + -o-transform: translateX(30px); + } + 80% { + -o-transform: translateX(-10px); + } + 100% { + -o-transform: translateX(0); + } +} +@keyframes bounceInLeft { + 0% { + opacity: 0; + transform: translateX(-2000px); + } + 60% { + opacity: 1; + transform: translateX(30px); + } + 80% { + transform: translateX(-10px); + } + 100% { + transform: translateX(0); + } +} +.animated.bounceInLeft { + -webkit-animation-name: bounceInLeft; + -moz-animation-name: bounceInLeft; + -o-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + } + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + } + 80% { + -webkit-transform: translateX(10px); + } + 100% { + -webkit-transform: translateX(0); + } +} +@-moz-keyframes bounceInRight { + 0% { + opacity: 0; + -moz-transform: translateX(2000px); + } + 60% { + opacity: 1; + -moz-transform: translateX(-30px); + } + 80% { + -moz-transform: translateX(10px); + } + 100% { + -moz-transform: translateX(0); + } +} +@-o-keyframes bounceInRight { + 0% { + opacity: 0; + -o-transform: translateX(2000px); + } + 60% { + opacity: 1; + -o-transform: translateX(-30px); + } + 80% { + -o-transform: translateX(10px); + } + 100% { + -o-transform: translateX(0); + } +} +@keyframes bounceInRight { + 0% { + opacity: 0; + transform: translateX(2000px); + } + 60% { + opacity: 1; + transform: translateX(-30px); + } + 80% { + transform: translateX(10px); + } + 100% { + transform: translateX(0); + } +} +.animated.bounceInRight { + -webkit-animation-name: bounceInRight; + -moz-animation-name: bounceInRight; + -o-animation-name: bounceInRight; + animation-name: bounceInRight; +} +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + } + 25% { + -webkit-transform: scale(0.95); + } + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.3); + } +} +@-moz-keyframes bounceOut { + 0% { + -moz-transform: scale(1); + } + 25% { + -moz-transform: scale(0.95); + } + 50% { + opacity: 1; + -moz-transform: scale(1.1); + } + 100% { + opacity: 0; + -moz-transform: scale(0.3); + } +} +@-o-keyframes bounceOut { + 0% { + -o-transform: scale(1); + } + 25% { + -o-transform: scale(0.95); + } + 50% { + opacity: 1; + -o-transform: scale(1.1); + } + 100% { + opacity: 0; + -o-transform: scale(0.3); + } +} +@keyframes bounceOut { + 0% { + transform: scale(1); + } + 25% { + transform: scale(0.95); + } + 50% { + opacity: 1; + transform: scale(1.1); + } + 100% { + opacity: 0; + transform: scale(0.3); + } +} +.animated.bounceOut { + -webkit-animation-name: bounceOut; + -moz-animation-name: bounceOut; + -o-animation-name: bounceOut; + animation-name: bounceOut; +} +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + } +} +@-moz-keyframes bounceOutUp { + 0% { + -moz-transform: translateY(0); + } + 20% { + opacity: 1; + -moz-transform: translateY(20px); + } + 100% { + opacity: 0; + -moz-transform: translateY(-2000px); + } +} +@-o-keyframes bounceOutUp { + 0% { + -o-transform: translateY(0); + } + 20% { + opacity: 1; + -o-transform: translateY(20px); + } + 100% { + opacity: 0; + -o-transform: translateY(-2000px); + } +} +@keyframes bounceOutUp { + 0% { + transform: translateY(0); + } + 20% { + opacity: 1; + transform: translateY(20px); + } + 100% { + opacity: 0; + transform: translateY(-2000px); + } +} +.animated.bounceOutUp { + -webkit-animation-name: bounceOutUp; + -moz-animation-name: bounceOutUp; + -o-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + } + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + } +} +@-moz-keyframes bounceOutDown { + 0% { + -moz-transform: translateY(0); + } + 20% { + opacity: 1; + -moz-transform: translateY(-20px); + } + 100% { + opacity: 0; + -moz-transform: translateY(2000px); + } +} +@-o-keyframes bounceOutDown { + 0% { + -o-transform: translateY(0); + } + 20% { + opacity: 1; + -o-transform: translateY(-20px); + } + 100% { + opacity: 0; + -o-transform: translateY(2000px); + } +} +@keyframes bounceOutDown { + 0% { + transform: translateY(0); + } + 20% { + opacity: 1; + transform: translateY(-20px); + } + 100% { + opacity: 0; + transform: translateY(2000px); + } +} +.animated.bounceOutDown { + -webkit-animation-name: bounceOutDown; + -moz-animation-name: bounceOutDown; + -o-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + } +} +@-moz-keyframes bounceOutLeft { + 0% { + -moz-transform: translateX(0); + } + 20% { + opacity: 1; + -moz-transform: translateX(20px); + } + 100% { + opacity: 0; + -moz-transform: translateX(-2000px); + } +} +@-o-keyframes bounceOutLeft { + 0% { + -o-transform: translateX(0); + } + 20% { + opacity: 1; + -o-transform: translateX(20px); + } + 100% { + opacity: 0; + -o-transform: translateX(-2000px); + } +} +@keyframes bounceOutLeft { + 0% { + transform: translateX(0); + } + 20% { + opacity: 1; + transform: translateX(20px); + } + 100% { + opacity: 0; + transform: translateX(-2000px); + } +} +.animated.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + -moz-animation-name: bounceOutLeft; + -o-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + } + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + } + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + } +} +@-moz-keyframes bounceOutRight { + 0% { + -moz-transform: translateX(0); + } + 20% { + opacity: 1; + -moz-transform: translateX(-20px); + } + 100% { + opacity: 0; + -moz-transform: translateX(2000px); + } +} +@-o-keyframes bounceOutRight { + 0% { + -o-transform: translateX(0); + } + 20% { + opacity: 1; + -o-transform: translateX(-20px); + } + 100% { + opacity: 0; + -o-transform: translateX(2000px); + } +} +@keyframes bounceOutRight { + 0% { + transform: translateX(0); + } + 20% { + opacity: 1; + transform: translateX(-20px); + } + 100% { + opacity: 0; + transform: translateX(2000px); + } +} +.animated.bounceOutRight { + -webkit-animation-name: bounceOutRight; + -moz-animation-name: bounceOutRight; + -o-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} +@-webkit-keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(-200deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateIn { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(-200deg); + opacity: 0; + } + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateIn { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(-200deg); + opacity: 0; + } + 100% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateIn { + 0% { + transform-origin: center center; + transform: rotate(-200deg); + opacity: 0; + } + 100% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } +} +.animated.rotateIn { + -webkit-animation-name: rotateIn; + -moz-animation-name: rotateIn; + -o-animation-name: rotateIn; + animation-name: rotateIn; +} +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateInUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateInUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateInUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} +.animated.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + -moz-animation-name: rotateInUpLeft; + -o-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateInDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateInDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateInDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } + 100% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } +} +.animated.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + -moz-animation-name: rotateInDownLeft; + -o-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateInUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateInUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateInUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} +.animated.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + -moz-animation-name: rotateInUpRight; + -o-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } +} +@-moz-keyframes rotateInDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } +} +@-o-keyframes rotateInDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } +} +@keyframes rotateInDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } + 100% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } +} +.animated.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + -moz-animation-name: rotateInDownRight; + -o-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: center center; + -webkit-transform: rotate(200deg); + opacity: 0; + } +} +@-moz-keyframes rotateOut { + 0% { + -moz-transform-origin: center center; + -moz-transform: rotate(0); + opacity: 1; + } + 100% { + -moz-transform-origin: center center; + -moz-transform: rotate(200deg); + opacity: 0; + } +} +@-o-keyframes rotateOut { + 0% { + -o-transform-origin: center center; + -o-transform: rotate(0); + opacity: 1; + } + 100% { + -o-transform-origin: center center; + -o-transform: rotate(200deg); + opacity: 0; + } +} +@keyframes rotateOut { + 0% { + transform-origin: center center; + transform: rotate(0); + opacity: 1; + } + 100% { + transform-origin: center center; + transform: rotate(200deg); + opacity: 0; + } +} +.animated.rotateOut { + -webkit-animation-name: rotateOut; + -moz-animation-name: rotateOut; + -o-animation-name: rotateOut; + animation-name: rotateOut; +} +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} +@-moz-keyframes rotateOutUpLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} +@-o-keyframes rotateOutUpLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} +@keyframes rotateOutUpLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + 100% { + transform-origin: left bottom; + transform: rotate(-90deg); + opacity: 0; + } +} +.animated.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + -moz-animation-name: rotateOutUpLeft; + -o-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: left bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} +@-moz-keyframes rotateOutDownLeft { + 0% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(0); + opacity: 1; + } + 100% { + -moz-transform-origin: left bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} +@-o-keyframes rotateOutDownLeft { + 0% { + -o-transform-origin: left bottom; + -o-transform: rotate(0); + opacity: 1; + } + 100% { + -o-transform-origin: left bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} +@keyframes rotateOutDownLeft { + 0% { + transform-origin: left bottom; + transform: rotate(0); + opacity: 1; + } + 100% { + transform-origin: left bottom; + transform: rotate(90deg); + opacity: 0; + } +} +.animated.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + -moz-animation-name: rotateOutDownLeft; + -o-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(90deg); + opacity: 0; + } +} +@-moz-keyframes rotateOutUpRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(90deg); + opacity: 0; + } +} +@-o-keyframes rotateOutUpRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(90deg); + opacity: 0; + } +} +@keyframes rotateOutUpRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + 100% { + transform-origin: right bottom; + transform: rotate(90deg); + opacity: 0; + } +} +.animated.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + -moz-animation-name: rotateOutUpRight; + -o-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(0); + opacity: 1; + } + 100% { + -webkit-transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + opacity: 0; + } +} +@-moz-keyframes rotateOutDownRight { + 0% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(0); + opacity: 1; + } + 100% { + -moz-transform-origin: right bottom; + -moz-transform: rotate(-90deg); + opacity: 0; + } +} +@-o-keyframes rotateOutDownRight { + 0% { + -o-transform-origin: right bottom; + -o-transform: rotate(0); + opacity: 1; + } + 100% { + -o-transform-origin: right bottom; + -o-transform: rotate(-90deg); + opacity: 0; + } +} +@keyframes rotateOutDownRight { + 0% { + transform-origin: right bottom; + transform: rotate(0); + opacity: 1; + } + 100% { + transform-origin: right bottom; + transform: rotate(-90deg); + opacity: 0; + } +} +.animated.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + -moz-animation-name: rotateOutDownRight; + -o-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} +@-webkit-keyframes hinge { + 0% { + -webkit-transform: rotate(0); + -webkit-transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + } + 20%, + 60% { + -webkit-transform: rotate(80deg); + -webkit-transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + } + 40% { + -webkit-transform: rotate(60deg); + -webkit-transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + } + 80% { + -webkit-transform: rotate(60deg) translateY(0); + opacity: 1; + -webkit-transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + } + 100% { + -webkit-transform: translateY(700px); + opacity: 0; + } +} +@-moz-keyframes hinge { + 0% { + -moz-transform: rotate(0); + -moz-transform-origin: top left; + -moz-animation-timing-function: ease-in-out; + } + 20%, + 60% { + -moz-transform: rotate(80deg); + -moz-transform-origin: top left; + -moz-animation-timing-function: ease-in-out; + } + 40% { + -moz-transform: rotate(60deg); + -moz-transform-origin: top left; + -moz-animation-timing-function: ease-in-out; + } + 80% { + -moz-transform: rotate(60deg) translateY(0); + opacity: 1; + -moz-transform-origin: top left; + -moz-animation-timing-function: ease-in-out; + } + 100% { + -moz-transform: translateY(700px); + opacity: 0; + } +} +@-o-keyframes hinge { + 0% { + -o-transform: rotate(0); + -o-transform-origin: top left; + -o-animation-timing-function: ease-in-out; + } + 20%, + 60% { + -o-transform: rotate(80deg); + -o-transform-origin: top left; + -o-animation-timing-function: ease-in-out; + } + 40% { + -o-transform: rotate(60deg); + -o-transform-origin: top left; + -o-animation-timing-function: ease-in-out; + } + 80% { + -o-transform: rotate(60deg) translateY(0); + opacity: 1; + -o-transform-origin: top left; + -o-animation-timing-function: ease-in-out; + } + 100% { + -o-transform: translateY(700px); + opacity: 0; + } +} +@keyframes hinge { + 0% { + transform: rotate(0); + transform-origin: top left; + animation-timing-function: ease-in-out; + } + 20%, + 60% { + transform: rotate(80deg); + transform-origin: top left; + animation-timing-function: ease-in-out; + } + 40% { + transform: rotate(60deg); + transform-origin: top left; + animation-timing-function: ease-in-out; + } + 80% { + transform: rotate(60deg) translateY(0); + opacity: 1; + transform-origin: top left; + animation-timing-function: ease-in-out; + } + 100% { + transform: translateY(700px); + opacity: 0; + } +} +.animated.hinge { + -webkit-animation-name: hinge; + -moz-animation-name: hinge; + -o-animation-name: hinge; + animation-name: hinge; +} +@-webkit-keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + } +} +@-moz-keyframes rollIn { + 0% { + opacity: 0; + -moz-transform: translateX(-100%) rotate(-120deg); + } + 100% { + opacity: 1; + -moz-transform: translateX(0px) rotate(0deg); + } +} +@-o-keyframes rollIn { + 0% { + opacity: 0; + -o-transform: translateX(-100%) rotate(-120deg); + } + 100% { + opacity: 1; + -o-transform: translateX(0px) rotate(0deg); + } +} +@keyframes rollIn { + 0% { + opacity: 0; + transform: translateX(-100%) rotate(-120deg); + } + 100% { + opacity: 1; + transform: translateX(0px) rotate(0deg); + } +} +.animated.rollIn { + -webkit-animation-name: rollIn; + -moz-animation-name: rollIn; + -o-animation-name: rollIn; + animation-name: rollIn; +} +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + } + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + } +} +@-moz-keyframes rollOut { + 0% { + opacity: 1; + -moz-transform: translateX(0px) rotate(0deg); + } + 100% { + opacity: 0; + -moz-transform: translateX(100%) rotate(120deg); + } +} +@-o-keyframes rollOut { + 0% { + opacity: 1; + -o-transform: translateX(0px) rotate(0deg); + } + 100% { + opacity: 0; + -o-transform: translateX(100%) rotate(120deg); + } +} +@keyframes rollOut { + 0% { + opacity: 1; + transform: translateX(0px) rotate(0deg); + } + 100% { + opacity: 0; + transform: translateX(100%) rotate(120deg); + } +} +.animated.rollOut { + -webkit-animation-name: rollOut; + -moz-animation-name: rollOut; + -o-animation-name: rollOut; + animation-name: rollOut; +} +@-webkit-keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} +@-moz-keyframes lightSpeedIn { + 0% { + -moz-transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + 60% { + -moz-transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + 80% { + -moz-transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + 100% { + -moz-transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} +@-o-keyframes lightSpeedIn { + 0% { + -o-transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + 60% { + -o-transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + 80% { + -o-transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + 100% { + -o-transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} +@keyframes lightSpeedIn { + 0% { + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + 60% { + transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + 80% { + transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + 100% { + transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} +.animated.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + -moz-animation-name: lightSpeedIn; + -o-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + -moz-animation-timing-function: ease-out; + -o-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} +.animated.lightSpeedIn { + -webkit-animation-duration: .5s; + -moz-animation-duration: .5s; + -o-animation-duration: .5s; + animation-duration: 0.5s; +} +@-webkit-keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + opacity: 1; + } + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} +@-moz-keyframes lightSpeedOut { + 0% { + -moz-transform: translateX(0%) skewX(0deg); + opacity: 1; + } + 100% { + -moz-transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} +@-o-keyframes lightSpeedOut { + 0% { + -o-transform: translateX(0%) skewX(0deg); + opacity: 1; + } + 100% { + -o-transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} +@keyframes lightSpeedOut { + 0% { + transform: translateX(0%) skewX(0deg); + opacity: 1; + } + 100% { + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} +.animated.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + -moz-animation-name: lightSpeedOut; + -o-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + -moz-animation-timing-function: ease-in; + -o-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +.animated.lightSpeedOut { + -webkit-animation-duration: .25s; + -moz-animation-duration: .25s; + -o-animation-duration: .25s; + animation-duration: 0.25s; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -moz-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity 0.15s linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} \ No newline at end of file diff --git a/asset/css/cetc54/appVersion.css b/asset/css/cetc54/appVersion.css new file mode 100644 index 0000000..acc7352 --- /dev/null +++ b/asset/css/cetc54/appVersion.css @@ -0,0 +1,5 @@ +.ui_grid tbody tr td { + overflow: visible; + white-space: normal; + word-break: normal; +} \ No newline at end of file diff --git a/asset/css/cetc54/common.css b/asset/css/cetc54/common.css new file mode 100644 index 0000000..a92345a --- /dev/null +++ b/asset/css/cetc54/common.css @@ -0,0 +1,18 @@ +.icon_report { + background: url('../../icon/Icon16/report.png') no-repeat center center; +} +.icon_import { + background: url('../../icon/Icon16/table_import.png') no-repeat center center; +} +.icon_addOK { + background: url('../../icon/Icon16/heart_add.png') no-repeat center center; +} +.icon_rowvideo { + background: url('../../icon/Icon16/online_video_insert.png') no-repeat center center; +} +.icon_table_save { + background: url('../../icon/Icon16/table_save.png') no-repeat center center; +} +.icon_database_save { + background: url('../../icon/Icon16/database_save.png') no-repeat center center; +} diff --git a/asset/css/cetc54/downloadApp.css b/asset/css/cetc54/downloadApp.css new file mode 100644 index 0000000..e1a5957 --- /dev/null +++ b/asset/css/cetc54/downloadApp.css @@ -0,0 +1,221 @@ +.login_body{ + background-color: #FFFFFF; +} +.lblCopyright { + position: relative; + width: 100%; + height: 40px; + line-height: 20px; + background: #F5F5F5; + border-top: 1px solid #DDDDDD; + color: #707070; + text-align: center; +} + +.login_header { + border-bottom: 1px solid #2E3D54 !important; + background-color: #205081; + width: 100%; + height: 75px; + position: relative; +} + +.login_header .logo { + float: left; + margin-top: 20px; + margin-left: 30px; + max-height: 32px; +} + +.login_header .imgLogo { + max-height: 32px; +} + +.login_header .divTitle { + float: left; + margin-left: 5px; + margin-top: 18px; +} + +.login_header .title { + display: block; + color: #ffffff; + font-family: '微软雅黑'; + font-size: 14px; + font-weight: bold; + text-align: left; + vertical-align: middle; +} + +.login_header .etitle { + display: block; + color: #e9eeee; + font-family: 'Arial'; + font-size: 9px; + text-align: left; + vertical-align: middle; +} + +.main { + padding: 10px; + background-color: #FFFFFF; +} + +.divDown { + position: relative; + width: 540px; + height: 300px; + left: 240px; + top: -300px; +} + +.down_title { + margin-left: 30px; + font-size: 24px; + line-height: 40px; +} + +.down_remark { + margin-left: 30px; + font-size: 14px; + line-height: 20px; + color: #999999; + margin-bottom: 20px; +} + +.down_list { + +} + +.listLi { + background-color: #FFFFFF; + float: left; + width: 168px; + height: 168px; + margin-left: 5px; + border: 1px solid #e4e4e4; + text-align: center; + display: block; + position: relative; + cursor: pointer; + color: #999; +} +.listLi:hover{ + background-color: #f3f3f3; + cursor: pointer; +} + +.liIcon { + margin-top: 40px; + font-size: 60px; +} + +.listTitle { + margin: 16px 0; + font-size: 16px; +} +.divQr{ + position: absolute; + width: 100%; +} +.qr_code { + width: 120px; + height: 120px; + margin-top: 5px; + margin-left: 25px; + line-height: 120px; + color: red; +} +.qr_code .fa-download{ + font-size: 60px; + margin-top: 40px; + color: #1AB394; +} + +.qr_p { + margin: 4px 0; + font-size: 12px; +} + +.phone{ + position: relative; + top: 50px; + width: 240px; + height: 400px; + border-radius: 30px; + border: 1px solid #e4e4e4; + padding-top: 55px; +} +.phone .screen{ + width: 215px; + height: 300px; + border: 1px solid #e4e4e4; + margin: auto; + text-align: center; +} +.phone .phoneBtn{ + width: 50px; + height: 50px; + border-radius: 50px; + border: 1px solid #e4e4e4; + margin-top: 20px; + margin-left: 92px; +} +#side_code{ + margin-left: 32px; + margin-top: 50px; +} +.sysIndex{ + position: relative; + height: 30px; + line-height: 30px; + margin:0 10px; + top: 10px; + border: 1px solid #f3f3f3; + border-radius: 30px; + padding:0 20px; +} +#gotoIndex{ + color: #000000; + font-size: 14px; +} +#gotoIndex:hover{ + font-weight: bold; + text-decoration: none; +} + +.log{ + position: relative; + top: -200px; + width: 100%; +} +.logTitle{ + font-size: 24px; + line-height: 40px; +} +.logListTitle{ +font-size: 20px; + font-weight: bold; + line-height: 30px; +} +.itemTitle{ + font-size: 16px; + line-height: 30px; +} +.itemTitle .version{ + +} +.itemTitle .newVersion{ +color: red; +} +.itemTitle .uploadDate{ +margin-left: 30px; +} +.logContent{ + padding:0 20px; +} +.logContent p{ + font-size: 13px; + font-weight: normal; + line-height: 20px; +} \ No newline at end of file diff --git a/asset/css/cetc54/editexampaper.css b/asset/css/cetc54/editexampaper.css new file mode 100644 index 0000000..fe7e65a --- /dev/null +++ b/asset/css/cetc54/editexampaper.css @@ -0,0 +1,47 @@ +.icon_report { + background: url('../../icon/Icon16/report.png') no-repeat center center; +} +.icon_radio_button { + background: url('../../icon/Icon16/radio_button.png') no-repeat center center; +} + +.icon_tick_button { + background: url('../../icon/Icon16/tick.png') no-repeat center center; +} + +.icon_check_box_uncheck { + background: url('../../icon/Icon16/check_box_uncheck.png') no-repeat center center; +} + +.icon_ask_and_answer { + background: url('../../icon/Icon16/ask_and_answer.png') no-repeat center center; +} + + .icon_align { + background: url('../../icon/Icon16/align_middle.png') no-repeat center center; + } + +.icon_add16 { + background: url('../../icon/Icon16/add.png') no-repeat center center; +} + +.icon_arrow_up { + background: url('../../icon/Icon16/arrow_up.png') no-repeat center center; +} +.icon_arrow_down { + background: url('../../icon/Icon16/arrow_down.png') no-repeat center center; +} +.save_as { + background: url('../../icon/Icon16/save_as.png') no-repeat center center; +} +.q_item +{ + padding-left: 40px; + padding-top: 5px; +} +.q_question +{ + padding-left: 20px; + padding-top: 5px; +} + diff --git a/asset/css/cetc54/file.css b/asset/css/cetc54/file.css new file mode 100644 index 0000000..e69de29 diff --git a/asset/css/cetc54/index.css b/asset/css/cetc54/index.css new file mode 100644 index 0000000..9ccf11c --- /dev/null +++ b/asset/css/cetc54/index.css @@ -0,0 +1,501 @@ +/*----首页 index.ftl----*/ +/*顶部*/ +.header { + overflow: hidden; + display: block; + height: 46px; + margin: 0; + padding: 0 13px 0 0; + background-color: #205081; + position: relative; + z-index: 905; +} +.header_logo{ + display: block; + float: left; +} +.header_logo .logo { + float: left; + margin-top: 7px; + margin-left: 7px; + width: 32px; + height: 32px; +} +.header_logo .imgLogo{ + max-height: 32px; +} +.header_logo .divTitle{ + display: block; + float: left; + margin-left: 5px; + margin-top: 5px; +} +.header_logo .title { + color: #ffffff; + font-family: '微软雅黑'; + font-size: 16px; + text-align: left; + vertical-align: middle; +} + +.header_logo .etitle { + color: #dcdcdc; + font-family: 'Arial'; + font-size: 10px; + text-align: left; + vertical-align: middle; +} + +/*底部*/ +.default_bottom { + width:100%; + height: 100%; + position: absolute; + line-height: 24px; + text-align: center; + background-color: #205081; + color: #ffffff; +} +.default_bottom .left{ + position: absolute; + left: 3px; +} +.default_bottom .right{ + position: absolute; + right: 3px; +} + +/*顶部右侧*/ +.header_right { + position: absolute; + right: 10px; +} + +.header_btn { + float: right; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + cursor: default !important; + display: inline-block; + font-weight: bold; + height: 24px; + line-height: 24px; + min-width: 24px; + width: 24px; + padding: 2px; + text-align: center; + text-decoration: none !important; + -moz-user-select: none; + -webkit-user-select: none; + color: #c5c6ca; + font-size: 17px; + margin: 10px 0 0 5px; +} + +.header_btn_ie { + width: 80px; + font-size: 14px; +} + +.header_btn a { + color: #C5C6CA; + text-decoration: none; +} + +.header_btn a:hover { + color: #ffffff; + text-decoration: none; +} + +.header_btn_focus { + background-color: #3B7FC4; + background-image: -webkit-gradient(linear, left top, left bottom, from(#3e89d1), to(#3B7FC4)); + background-image: -webkit-linear-gradient(top, #3e89d1, #3B7FC4); + background-image: -moz-linear-gradient(top, #3e89d1, #3B7FC4); + background-image: -ms-linear-gradient(top, #3e89d1, #3B7FC4); + background-image: -o-linear-gradient(top, #3e89d1, #3B7FC4); + background-image: linear-gradient(top, #3e89d1, #3B7FC4); + border: 1px solid #494949; +} + +.header_btn_focus a { + color: #ffffff; +} + +.header_btn_focus a:hover { + color: #ffffff; +} + +.tabs { + background: none repeat scroll 0 0 #fafafa; + border-bottom: 1px solid #C2C2C2; + height: 25px; +} +.ui_tabs_header_center{ + height: 26px; +} + +.ui_tabs_panels-bottom { + border-width: 0; +} + +.ui_tabs_header { + border-style: none; +} + +.tabs li.tabs_selected a.ui_tab_title, +.ui_tabs_header-bottom .tabs li.tabs_selected a.ui_tab_title, +.ui_tabs_header-left .tabs li.tabs_selected a.ui_tab_title, +.ui_tabs_header-right .tabs li.tabs_selected a.ui_tab_title { + background-color: #FFFFFF; + color: #555555; +} + +.tabs li a.ui_tab_title { + user-select: none; + border-radius: 0; + color: #333333; + border-width: 0; + background: transparent; +} +.tabs li.tabs_selected a.ui_tab_title { + border-width: 2px 1px 1px 1px; + border-color: #57889C #C2C2C2 #FFFFFF #C2C2C2; +} +.tabs li a.ui_tab_close{ + background: none; +} +.tabs li:hover a.ui_tab_close { + background: url("../../thirdlib/CECT54.WebUI/themes/bootstrap/images/tabs_icons.png") repeat scroll -34px 0 rgba(0, 0, 0, 0); +} + +.tabs li a.ui_tab_close:hover{ + background: url("../../thirdlib/CECT54.WebUI/themes/bootstrap/images/tabs_icons.png") repeat scroll -34px 0 rgba(0, 0, 0, 0); +} + +.tabs li.tabs_selected a.ui_tab_close { + background: url("../../thirdlib/CECT54.WebUI/themes/bootstrap/images/tabs_icons.png") repeat scroll -34px 0 rgba(0, 0, 0, 0); +} +/*左侧导航*/ +.ui_layout_split_content_left { + border-right-width: 0; +} + +.ui_layout_panel_left .ui_panel_content { + background: #fbfbfb; +} +.layout_left_top{ + font-weight: bold; + line-height: 24px; + border-bottom: 1px solid #EFEBEB; +} +#show-shortcut{ + float: right; + margin-top: 10px; +} +.nav { + position: relative; + z-index: 1; + overflow: auto; +} + +.nav .ztree { + padding: 0px; +} + +.nav .ztree li.level0 ul li { + line-height: 30px; +} + +.nav .ztree li.level0 ul li a.curSelectedNode { + height: 30px; + font-weight: bold; + color: #202427; + background: transparent; + border: none; +} + +.nav .ztree li.level0 ul li .button { + margin-top: 7px; +} + +.nav .ztree li.level0 ul li .switch { + margin-top: -3px; +} + +.nav .ztree li.level0 span.level0 { + display: none; +} + +.nav .ztree li.level0 a.level0 { + padding: 0px; + width: 100%; + line-height: 30px; + font-weight: bold; + height: 30px; + /*background: #F7F7F7;*/ + border-top: 1px solid #efebeb; + border-bottom: 1px solid #efebeb; +} + +.nav .ztree li.level0 a { + font-size: 14px; + color: #69737A; +} + +.nav .ztree li.level0 a:hover { + color: #000000; + text-decoration: none; +} + +.nav .ztree li.level0 a.level0 .button { + margin-top: 7px; + margin-right: 5px; +} + +.nav .ztree li.level0 ul.level0 { + margin: 5px 0 5px 0; + padding-left: 0px; +} + +.aui-sidebar-handle { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAMCAQAAADitaTfAAAAFUlEQVQIW2O++j+bkWUTAwZgJiwBAB9kCOy+u0d3AAAAAElFTkSuQmCC") no-repeat scroll center center; + height: 100%; + position: absolute; + right: 0; + top: 0; + width: 10px; +} + +.login-info { + background: #F7F7F7; + display: block; + font-size: 12px; + height: 39px; + color: #ffffff; + width: 100%; + margin: 0px !important; + position: relative; +} +.login-info a { + text-decoration: none !important; + color: #5C5C5C; + display: inline-block; + margin-top: 10px; + white-space: nowrap; +} + +.login-info a span { + text-transform: capitalize; + font-size: 14px; + /* 14px~ */ + display: inline-block; + text-decoration: none; + max-width: 150px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: middle; +} +.msgLabel{ + position: absolute; + top: 1px; + left: 30px; +} +.login-info a span + i { + vertical-align: middle; +} + +.login-info a:hover { + color: #000000; +} + +.login-info > span { + height: 38px; + display: block; + padding: 0 10px; +} + +.login-info img { + width: 25px; + height: auto; + display: inline-block; + vertical-align: middle; + margin-top: 1px; + margin-right: 5px; + margin-left: 0px; + border: none; + border-left: 3px solid #ffffff; +} + +img.online, +img.busy, +img.offline, +img.away { + border-left: 3px solid #fff; + border-radius: 5px; +} + +img.online { + border-left-color: #40ac2b !important; +} + +img.busy { + border-left-color: #ed1c24 !important; +} + +img.offline { + border-left-color: #dddddd !important; +} + +img.away { + border-left-color: #ffc40d !important; +} + +.jarvismetro-tile { + float: left; + display: block; + background-color: #ffffff; + width: 100px; + height: 70px; + cursor: pointer; + box-shadow: inset 0px 0px 1px #FFFFCC; + border: 1px dotted #C5C5C5; + text-decoration: none; + color: #ffffff; + font-weight: 300; + font-smooth: always; + margin: 0 10px 5px 0; + padding: 5px; + position: relative; +} + +.jarvismetro-tile:hover { + z-index: 10; + -webkit-transform: scale(1.07); + -moz-transform: scale(1.07); +} + +.jarvismetro-tile.big-cubes { + width: 110px; + height: 110px; +} + +.jarvismetro-tile.double { + width: 249px; +} + +.jarvismetro-tile:active { + top: 1px; + left: 1px; +} + +.jarvismetro-tile .iconbox { + text-align: center; +} + +.jarvismetro-tile .iconbox i { + display: block; + margin: 15px auto 0; + height: 75px; +} + +.jarvismetro-tile .iconbox span { + display: block; + text-align: left; +} + +.jarvismetro-tile .iconbox span > span { + position: absolute; + right: -3px; + bottom: -3px; + border-radius: 50%; + padding: 1px 6px 1px 6px; +} + +#shortcut .selected { + border: 1px solid #0091d9 !important; +} + +#shortcut .selected { + position: relative; +} + +#shortcut .selected:before { + display: block; + position: absolute; + content: "\f00c"; + color: #ffffff; + right: 4px; + top: 3px; + font-family: FontAwesome; + z-index: 2; +} + +#shortcut .selected:after { + width: 0; + height: 0; + border-top: 35px solid #0091d9; + border-left: 35px solid rgba(0, 0, 0, 0); + position: absolute; + display: block; + right: 0; + content: ""; + top: 0; + z-index: 1; +} +/* + * SHORT CUT + */ +#shortcut { + display: block; + position: absolute; + top: 0px; + left: 0; + height: 150px; + width: 100%; + background-color: #33302F; + z-index: 907; + display: none; + color: #ffffff; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +#shortcut ul { + float: left; + padding: 15px 20px 10px; + list-style: none; + margin: 0; +} + +#shortcut ul li { + float: left; + display: inline-block; + width: auto; +} + +#shortcut ul li .jarvismetro-tile { + margin: 0px 3px 3px; + border: none; + border-radius: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; +} + +#shortcut ul li .jarvismetro-tile:hover { + color: #ffffff; + text-decoration: none; +} + +#shortcut ul li .jarvismetro-tile:active, +#shortcut ul li .jarvismetro-tile:focus { + left: 0; + top: 0; +} + +.shortcut-on #response-btn { + display: none !important; +} \ No newline at end of file diff --git a/asset/css/cetc54/jcdp.css b/asset/css/cetc54/jcdp.css new file mode 100644 index 0000000..d0a4c64 --- /dev/null +++ b/asset/css/cetc54/jcdp.css @@ -0,0 +1,138 @@ +.bg-color-blue { + background-color: #57889c !important; +} + +.bg-color-blueLight { + background-color: #92a2a8 !important; +} + +.bg-color-blueDark { + background-color: #4c4f53 !important; +} + +.bg-color-green { + background-color: #356e35 !important; +} + +.bg-color-greenLight { + background-color: #71843f !important; +} + +.bg-color-greenDark { + background-color: #496949 !important; +} + +.bg-color-red { + background-color: #a90329 !important; +} + +.bg-color-yellow { + background-color: #b09b5b !important; +} + +.bg-color-orange { + background-color: #c79121 !important; +} + +.bg-color-orangeDark { + background-color: #a57225 !important; +} + +.bg-color-pink { + background-color: #ac5287 !important; +} + +.bg-color-pinkDark { + background-color: #a8829f !important; +} + +.bg-color-purple { + background-color: #6e587a !important; +} + +.bg-color-darken { + background-color: #404040 !important; +} + +.bg-color-lighten { + background-color: #d5e7ec !important; +} + +.bg-color-white { + background-color: #ffffff !important; +} + +.bg-color-grayDark { + background-color: #525252 !important; +} + +.bg-color-magenta { + background-color: #6e3671 !important; +} + +.bg-color-teal { + background-color: #568a89 !important; +} + +.bg-color-redLight { + background-color: #a65858 !important; +} + +.border_float_div { + float: left; + overflow: auto; + height: 100%; + border-right: 1px solid #EFEBEB; +} + +.borderMargin { + border: solid 1px #DDDDDD; + margin: 5px; +} + +/*icon.ftl*/ +.iconftl_top { + width: 100%; + height: 25px; + padding-top: 1px; + border-bottom: 1px solid #DDDDDD; +} + +.iconList { + overflow: auto; +} + +.iconList_div { + margin: 2px; + float: left; + width: 100px; + height: 60px; + overflow: hidden; +} + +.iconList_div .iconImg { + margin: 2px; + text-align: center; +} + +.iconList_div .iconText { + text-align: center; +} + +.tableCenterTd { + text-align: center; +} +.fromTable { + margin-left: 10px; +} + +.fromTable tr th { + height: 30px; +} + +.fromTable tr td { + height: 30px; +} +.tdCenter{ + text-align: center; +} \ No newline at end of file diff --git a/asset/css/cetc54/login.css b/asset/css/cetc54/login.css new file mode 100644 index 0000000..5d84290 --- /dev/null +++ b/asset/css/cetc54/login.css @@ -0,0 +1,161 @@ +/*----登录 login.ftl----*/ +.divBrowser { + position: absolute; + width: 100%; + line-height: 30px; + text-align: center; + background: #fff6cc; + z-index: 99; +} + +.lblCopyright { + position: absolute; + bottom: 3px; + right: 3px; + width: 100%; + height: 40px; + line-height: 20px; + background: #F5F5F5; + border-top: 1px solid #DDDDDD; + color: #707070; + text-align: center; +} + +.lblCopyright .logo { + position: absolute; + padding-left: 35px; + top: 5px; + right: 5px; + line-height: 35px; + background: no-repeat url("../../image/jcdp/logo/logo32.png"); +} + +.login_body { + background-color: #F5F5F5; +} + +.login_header { + border-bottom: 1px solid #2E3D54 !important; + background-color: #205081; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 75px; +} +.login_header .logo { + float: left; + margin-top: 20px; + margin-left: 30px; + max-height: 32px; +} + +.login_header .imgLogo { + max-height: 32px; +} + +.login_header .divTitle { + float: left; + margin-left: 5px; + margin-top: 18px; +} + +.login_header .title { + display: block; + color: #ffffff; + font-family: '微软雅黑'; + font-size: 14px; + font-weight: bold; + text-align: left; + vertical-align: middle; +} + +.login_header .etitle { + display: block; + color: #e9eeee; + font-family: 'Arial'; + font-size: 9px; + text-align: left; + vertical-align: middle; +} + +.login_main { + position: absolute; + left: 50%; + top: 50%; + margin-left: -170px; + margin-top: -150px; + width: 340px; + height: 300px; +} + +.login_form { + width: 100%; + height: 100%; + color: #666; + margin: 0; + outline: 0 none; + position: relative; + border: 1px solid #DDDDDD; + background: #ffffff; + position: relative; +} + +.login_form .field { + display: block; + padding: 5px 14px 20px 20px; + position: relative; +} + +.login_form .title { + background: #F9F9F9; + border-bottom: 1px solid #DDDDDD; + margin: 0; + padding: 15px 13px; + color: #232323; + display: block; + font-size: 16px; + font-weight: 300; + padding: 15px 13px; +} + +.login_form .label { + color: #333; + display: block; + font-size: 14px; + font-weight: 400; + line-height: 19px; + margin-bottom: 6px; + text-align: left; + white-space: normal; +} + +.login_form .input { + display: block; + font-weight: 400; + position: relative; +} + +.login_form .icon-append { + font-size: 20px; + position: absolute; + padding-left: 3px; + top: 8px; + right: 20px; +} + +.login_form .ui_validate { + font-size: 16px; + height: 30px; + padding-right: 40px; +} +.ui-right{ + float: right; +} + +.login_form .footer { + background: #F9F9F9; + border-top: 1px solid #DDDDDD; + display: block; + padding: 5px; +} \ No newline at end of file diff --git a/asset/css/cetc54/portal.css b/asset/css/cetc54/portal.css new file mode 100644 index 0000000..575b447 --- /dev/null +++ b/asset/css/cetc54/portal.css @@ -0,0 +1,166 @@ +body{ + background-color: #F3F3F4; +} +.divWelcome{ + height: 30px; + line-height: 30px; + padding: 5px 0 5px 10px; + background-color: #FFFFFF; + font-size: 14px; + color: #676A6C; + border-bottom: 1px solid #e7eaec !important; +} +.divHello{ + float: left; +} +.tasklink{ + float: left; + position: relative; + width: 100px; + height: 26px; + border-radius: 5px; + margin-left: 10px; + color: #ffffff; +} +.divMyTask{ + display: none; + width: 100%; + position: absolute; + top:40px; + height: 215px; + background-color: #FFFFFF; + border:solid #DDDDDD; + border-width: 0 0 1px 0; +} +#linkMyTask{ + position: absolute; + right: 10px; + color: #676A6C; + padding:3px 3px 0 10px; +} +#linkMyTask:hover{ + text-decoration: none; +} +.LinkIcon{ + font-size: 20px; + margin-left: 10px; + margin-top: 4px; +} +.linkTitle{ + position: absolute; + top: -2px; + left: 32px; + font-weight: normal; + font-size: 12px; +} +.linkCount{ + position: absolute; + top: -1px; + right: 5px; +} +.divMyTask_close{ + line-height: 36px; + position: absolute; + bottom: -14px; + left: 50%; + margin-left: -14px; + color: #000000; + background-color: #ffffff; + border: 1px solid #E7EAEC; + border-radius: 28px; + border-top: none; + width: 28px; + height: 28px; + text-align: center; + cursor: pointer; +} +.divMsg{ + color: #676A6C; + width: 37%; + border-left: 1px solid #efefef; + float: left; + height: 210px; +} +.divMsg_First{ + border-left: none; + width:25%; +} +.divMsg_last{ + width: 37%; +} +.msgTop{ + font-size: 13px; + height: 30px; + line-height: 30px; +} +.msgCount{ + float: left; + margin-left: 10px; +} +.msgMore{ + float: right; + margin-right: 10px; +} +.msgList{ + margin: 0 10px 0 10px; + height: 180px; +} +.noReadMsgTip{ + font-size: 26px; + color: #DDDDDD; + font-weight: normal; + text-align: center; + line-height: 160px; +} +.msgRow{ + padding: 5px; + line-height: 24px; + border-bottom: 1px solid #E7EAEC; +} +.msgRowNoLine{ + border-bottom: none; +} +.msgNo{ +} +a.link_msg{ + color: #676A6C; +} +a.link_msg:hover{ + color: #676A6C; +} +.msgTitle{ + margin-left: 30px; + margin-top: -24px; + margin-right: 60px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.msgApply{ + margin-right: 160px; +} +.msgstatus{ + width: 60px; + float: right; + margin-right: 85px; + margin-top: -20px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.msgTime{ + float: right; + margin-right: 5px; + margin-top: -24px; +} +.divCustomTip{ + width: 400px; + height: 80px; + position: absolute; + top: 50%; + left: 50%; + margin-left: -200px; + margin-top: -40px; + font-size: 20px; + color: #DDDDDD; +} \ No newline at end of file diff --git a/asset/css/cetc54/session.css b/asset/css/cetc54/session.css new file mode 100644 index 0000000..3ed7fb9 --- /dev/null +++ b/asset/css/cetc54/session.css @@ -0,0 +1,9 @@ +.divUa{ + +} +.divUa .uaLi{ +line-height: 20px; +} +.divUa .uaLi .uaLabel{ +font-weight: bold; +} \ No newline at end of file diff --git a/asset/css/cetc54/sysMessage.css b/asset/css/cetc54/sysMessage.css new file mode 100644 index 0000000..87a4c89 --- /dev/null +++ b/asset/css/cetc54/sysMessage.css @@ -0,0 +1,21 @@ +.dialog_msgTitle { + line-height: 30px; + font-size: 14px; + font-weight: bold; + text-align: center; +} + +.dialog_msgSender { + margin: 0 5px 0 5px; + text-align: center; + line-height: 30px; + font-size: 13px; + border-bottom: 1px solid #dddddd; +} + +.dialog_msgContent { + margin: 10px; + line-height: 20px; + font-size: 13px; + text-indent: 2em; +} \ No newline at end of file diff --git a/asset/css/cetc54/train.css b/asset/css/cetc54/train.css new file mode 100644 index 0000000..3f657ed --- /dev/null +++ b/asset/css/cetc54/train.css @@ -0,0 +1,39 @@ +.icon_report { + background: url('../../icon/Icon16/report.png') no-repeat center center; +} +.icon_radio_button { + background: url('../../icon/Icon16/radio_button.png') no-repeat center center; +} + +.icon_check_box_uncheck { + background: url('../../icon/Icon16/check_box_uncheck.png') no-repeat center center; +} + +.icon_ask_and_answer { + background: url('../../icon/Icon16/ask_and_answer.png') no-repeat center center; +} + +.icon_add16 { + background: url('../../icon/Icon16/add.png') no-repeat center center; +} + +.icon_arrow_up { + background: url('../../icon/Icon16/arrow_up.png') no-repeat center center; +} +.icon_arrow_down { + background: url('../../icon/Icon16/arrow_down.png') no-repeat center center; +} +.save_as { + background: url('../../icon/Icon16/save_as.png') no-repeat center center; +} +.q_item +{ + padding-left: 40px; + padding-top: 5px; +} +.q_question +{ + padding-left: 20px; + padding-top: 5px; +} + diff --git a/asset/css/cetc54/user.css b/asset/css/cetc54/user.css new file mode 100644 index 0000000..75438c7 --- /dev/null +++ b/asset/css/cetc54/user.css @@ -0,0 +1,35 @@ +.divImg{ + margin-bottom: 10px; + display: inline-block; + position: relative; + top: 5px; + left: 10px; + width: 240px; + border-right: 1px solid #DDDDDD; +} +.divImg_last{ + border-right: none; +} +.ImgName{ + text-align: center; + margin-bottom: 5px; + font-size: 13px; +} +.ImgShow{ + height: 128px; + text-align: center; + margin: 0 0 5px 0; +} +.Img_Img{ + border-radius: 10px; + max-width: 128px; + max-height:128px; +} +.ImgUpload{ + +} +.table-userAvatars{ + border-radius: 5px; + max-width: 26px; + max-height: 26px; +} \ No newline at end of file diff --git a/asset/css/icon.css b/asset/css/icon.css new file mode 100644 index 0000000..e69de29 diff --git a/asset/css/样式文件.txt b/asset/css/样式文件.txt new file mode 100644 index 0000000..b94dad8 --- /dev/null +++ b/asset/css/样式文件.txt @@ -0,0 +1,97 @@ +放置样式文件。 +警告:请勿修改jcdp.css文件 + +animate.css + List of possible animation types: + +Attention Seekers + + bounce + flash + pulse + shake + swing + tada + wobble + +Bouncing Entrances + + bounceIn + bounceInDown + bounceInLeft + bounceInRight + bounceInUp + +Bouncing Exists + + bounceOut + bounceOutDown + bounceOutRight + bounceOutUp + +Fading Entrances + + fadeIn + fadeInDown + fadeInDownBig + fadeInLeft + fadeInRight + fadeInRightBig + fadeInUp + fadeInUpBig + +Fading Exits + + fadeOut + fadeOutDown + fadeOutDownBig + fadeOutLeft + fadeOutLeftBig + fadeOutRight + fadeOutRightBig + fadeOutUp + fadeOutUpBig + +Flippers + + flip + flipInX + flipInY + flipOutX + flipOutY + +Lightspeed + + lightSpeedIn + lightSpeedOut + +Rotating Entrances + + rotateIn + rotateInDownLeft + rotateInDownRight + rotateUpLeft + rotateInUpRight + +Rotating Exits + + rotateOut + rotateOutDownLeft + rotateOutDownRight + rotateOutUpLeft + rotateOutUpRight + +Sliders + + slideInDown + slideInLeft + slideInRight + slideOutLeft + slideOutRight + slideOutUp + +Specials + + hinge + rollIn + rollOut \ No newline at end of file diff --git a/asset/icon/Icon16/32_bit.png b/asset/icon/Icon16/32_bit.png new file mode 100644 index 0000000..d77e613 Binary files /dev/null and b/asset/icon/Icon16/32_bit.png differ diff --git a/asset/icon/Icon16/3d_glasses.png b/asset/icon/Icon16/3d_glasses.png new file mode 100644 index 0000000..be29f77 Binary files /dev/null and b/asset/icon/Icon16/3d_glasses.png differ diff --git a/asset/icon/Icon16/64_bit.png b/asset/icon/Icon16/64_bit.png new file mode 100644 index 0000000..ee46c5b Binary files /dev/null and b/asset/icon/Icon16/64_bit.png differ diff --git a/asset/icon/Icon16/Plant.png b/asset/icon/Icon16/Plant.png new file mode 100644 index 0000000..2019396 Binary files /dev/null and b/asset/icon/Icon16/Plant.png differ diff --git a/asset/icon/Icon16/Previous_comment.png b/asset/icon/Icon16/Previous_comment.png new file mode 100644 index 0000000..35f011c Binary files /dev/null and b/asset/icon/Icon16/Previous_comment.png differ diff --git a/asset/icon/Icon16/Track_changes(2).png b/asset/icon/Icon16/Track_changes(2).png new file mode 100644 index 0000000..24fa360 Binary files /dev/null and b/asset/icon/Icon16/Track_changes(2).png differ diff --git a/asset/icon/Icon16/accept(2).png b/asset/icon/Icon16/accept(2).png new file mode 100644 index 0000000..fc09f6b Binary files /dev/null and b/asset/icon/Icon16/accept(2).png differ diff --git a/asset/icon/Icon16/accept.png b/asset/icon/Icon16/accept.png new file mode 100644 index 0000000..719e391 Binary files /dev/null and b/asset/icon/Icon16/accept.png differ diff --git a/asset/icon/Icon16/access_exports.png b/asset/icon/Icon16/access_exports.png new file mode 100644 index 0000000..9490ad3 Binary files /dev/null and b/asset/icon/Icon16/access_exports.png differ diff --git a/asset/icon/Icon16/access_imports.png b/asset/icon/Icon16/access_imports.png new file mode 100644 index 0000000..c0a92da Binary files /dev/null and b/asset/icon/Icon16/access_imports.png differ diff --git a/asset/icon/Icon16/accordion.png b/asset/icon/Icon16/accordion.png new file mode 100644 index 0000000..56502ae Binary files /dev/null and b/asset/icon/Icon16/accordion.png differ diff --git a/asset/icon/Icon16/account_balances.png b/asset/icon/Icon16/account_balances.png new file mode 100644 index 0000000..5a09cb9 Binary files /dev/null and b/asset/icon/Icon16/account_balances.png differ diff --git a/asset/icon/Icon16/account_functions.png b/asset/icon/Icon16/account_functions.png new file mode 100644 index 0000000..679829b Binary files /dev/null and b/asset/icon/Icon16/account_functions.png differ diff --git a/asset/icon/Icon16/account_level_filtering.png b/asset/icon/Icon16/account_level_filtering.png new file mode 100644 index 0000000..813253b Binary files /dev/null and b/asset/icon/Icon16/account_level_filtering.png differ diff --git a/asset/icon/Icon16/acorn.png b/asset/icon/Icon16/acorn.png new file mode 100644 index 0000000..85d1777 Binary files /dev/null and b/asset/icon/Icon16/acorn.png differ diff --git a/asset/icon/Icon16/acoustic_guitar.png b/asset/icon/Icon16/acoustic_guitar.png new file mode 100644 index 0000000..11aa6f6 Binary files /dev/null and b/asset/icon/Icon16/acoustic_guitar.png differ diff --git a/asset/icon/Icon16/action.png b/asset/icon/Icon16/action.png new file mode 100644 index 0000000..a090f0b Binary files /dev/null and b/asset/icon/Icon16/action.png differ diff --git a/asset/icon/Icon16/action_log.png b/asset/icon/Icon16/action_log.png new file mode 100644 index 0000000..e808cb0 Binary files /dev/null and b/asset/icon/Icon16/action_log.png differ diff --git a/asset/icon/Icon16/active_sessions.png b/asset/icon/Icon16/active_sessions.png new file mode 100644 index 0000000..e01e76c Binary files /dev/null and b/asset/icon/Icon16/active_sessions.png differ diff --git a/asset/icon/Icon16/add.png b/asset/icon/Icon16/add.png new file mode 100644 index 0000000..0ea124a Binary files /dev/null and b/asset/icon/Icon16/add.png differ diff --git a/asset/icon/Icon16/add_dns_zone.png b/asset/icon/Icon16/add_dns_zone.png new file mode 100644 index 0000000..f8fbcc9 Binary files /dev/null and b/asset/icon/Icon16/add_dns_zone.png differ diff --git a/asset/icon/Icon16/add_on.png b/asset/icon/Icon16/add_on.png new file mode 100644 index 0000000..8b13555 Binary files /dev/null and b/asset/icon/Icon16/add_on.png differ diff --git a/asset/icon/Icon16/add_package.png b/asset/icon/Icon16/add_package.png new file mode 100644 index 0000000..1ce56e8 Binary files /dev/null and b/asset/icon/Icon16/add_package.png differ diff --git a/asset/icon/Icon16/addon_domains.png b/asset/icon/Icon16/addon_domains.png new file mode 100644 index 0000000..b4a2950 Binary files /dev/null and b/asset/icon/Icon16/addon_domains.png differ diff --git a/asset/icon/Icon16/address_bar.png b/asset/icon/Icon16/address_bar.png new file mode 100644 index 0000000..721f174 Binary files /dev/null and b/asset/icon/Icon16/address_bar.png differ diff --git a/asset/icon/Icon16/address_bar_green.png b/asset/icon/Icon16/address_bar_green.png new file mode 100644 index 0000000..e10c438 Binary files /dev/null and b/asset/icon/Icon16/address_bar_green.png differ diff --git a/asset/icon/Icon16/address_bar_lock.png b/asset/icon/Icon16/address_bar_lock.png new file mode 100644 index 0000000..a21d706 Binary files /dev/null and b/asset/icon/Icon16/address_bar_lock.png differ diff --git a/asset/icon/Icon16/address_bar_red.png b/asset/icon/Icon16/address_bar_red.png new file mode 100644 index 0000000..4c9a252 Binary files /dev/null and b/asset/icon/Icon16/address_bar_red.png differ diff --git a/asset/icon/Icon16/address_bar_yellow.png b/asset/icon/Icon16/address_bar_yellow.png new file mode 100644 index 0000000..8189c69 Binary files /dev/null and b/asset/icon/Icon16/address_bar_yellow.png differ diff --git a/asset/icon/Icon16/address_block.png b/asset/icon/Icon16/address_block.png new file mode 100644 index 0000000..67cc54d Binary files /dev/null and b/asset/icon/Icon16/address_block.png differ diff --git a/asset/icon/Icon16/administrator.png b/asset/icon/Icon16/administrator.png new file mode 100644 index 0000000..df13663 Binary files /dev/null and b/asset/icon/Icon16/administrator.png differ diff --git a/asset/icon/Icon16/advanced_data_grid.png b/asset/icon/Icon16/advanced_data_grid.png new file mode 100644 index 0000000..26215e1 Binary files /dev/null and b/asset/icon/Icon16/advanced_data_grid.png differ diff --git a/asset/icon/Icon16/advanced_dns_zone_editor.png b/asset/icon/Icon16/advanced_dns_zone_editor.png new file mode 100644 index 0000000..5cbfb9c Binary files /dev/null and b/asset/icon/Icon16/advanced_dns_zone_editor.png differ diff --git a/asset/icon/Icon16/advertising.png b/asset/icon/Icon16/advertising.png new file mode 100644 index 0000000..44095d1 Binary files /dev/null and b/asset/icon/Icon16/advertising.png differ diff --git a/asset/icon/Icon16/after_delete.png b/asset/icon/Icon16/after_delete.png new file mode 100644 index 0000000..4d3beff Binary files /dev/null and b/asset/icon/Icon16/after_delete.png differ diff --git a/asset/icon/Icon16/after_insert.png b/asset/icon/Icon16/after_insert.png new file mode 100644 index 0000000..37396ef Binary files /dev/null and b/asset/icon/Icon16/after_insert.png differ diff --git a/asset/icon/Icon16/after_update.png b/asset/icon/Icon16/after_update.png new file mode 100644 index 0000000..a8a14b3 Binary files /dev/null and b/asset/icon/Icon16/after_update.png differ diff --git a/asset/icon/Icon16/agp.png b/asset/icon/Icon16/agp.png new file mode 100644 index 0000000..06d06cf Binary files /dev/null and b/asset/icon/Icon16/agp.png differ diff --git a/asset/icon/Icon16/aim_messenger.png b/asset/icon/Icon16/aim_messenger.png new file mode 100644 index 0000000..82350bb Binary files /dev/null and b/asset/icon/Icon16/aim_messenger.png differ diff --git a/asset/icon/Icon16/alarm_bell.png b/asset/icon/Icon16/alarm_bell.png new file mode 100644 index 0000000..9570d3b Binary files /dev/null and b/asset/icon/Icon16/alarm_bell.png differ diff --git a/asset/icon/Icon16/align.png b/asset/icon/Icon16/align.png new file mode 100644 index 0000000..5377a84 Binary files /dev/null and b/asset/icon/Icon16/align.png differ diff --git a/asset/icon/Icon16/align_above.png b/asset/icon/Icon16/align_above.png new file mode 100644 index 0000000..bb38bd5 Binary files /dev/null and b/asset/icon/Icon16/align_above.png differ diff --git a/asset/icon/Icon16/align_bellow.png b/asset/icon/Icon16/align_bellow.png new file mode 100644 index 0000000..b52f853 Binary files /dev/null and b/asset/icon/Icon16/align_bellow.png differ diff --git a/asset/icon/Icon16/align_center.png b/asset/icon/Icon16/align_center.png new file mode 100644 index 0000000..a937922 Binary files /dev/null and b/asset/icon/Icon16/align_center.png differ diff --git a/asset/icon/Icon16/align_compact.png b/asset/icon/Icon16/align_compact.png new file mode 100644 index 0000000..0b65554 Binary files /dev/null and b/asset/icon/Icon16/align_compact.png differ diff --git a/asset/icon/Icon16/align_left.png b/asset/icon/Icon16/align_left.png new file mode 100644 index 0000000..16b0dff Binary files /dev/null and b/asset/icon/Icon16/align_left.png differ diff --git a/asset/icon/Icon16/align_middle.png b/asset/icon/Icon16/align_middle.png new file mode 100644 index 0000000..161abc6 Binary files /dev/null and b/asset/icon/Icon16/align_middle.png differ diff --git a/asset/icon/Icon16/align_none.png b/asset/icon/Icon16/align_none.png new file mode 100644 index 0000000..37382c9 Binary files /dev/null and b/asset/icon/Icon16/align_none.png differ diff --git a/asset/icon/Icon16/align_right.png b/asset/icon/Icon16/align_right.png new file mode 100644 index 0000000..de62079 Binary files /dev/null and b/asset/icon/Icon16/align_right.png differ diff --git a/asset/icon/Icon16/alitalk.png b/asset/icon/Icon16/alitalk.png new file mode 100644 index 0000000..96edf8e Binary files /dev/null and b/asset/icon/Icon16/alitalk.png differ diff --git a/asset/icon/Icon16/all_right_reserved.png b/asset/icon/Icon16/all_right_reserved.png new file mode 100644 index 0000000..492b7c2 Binary files /dev/null and b/asset/icon/Icon16/all_right_reserved.png differ diff --git a/asset/icon/Icon16/allow_users_edit_ranges.png b/asset/icon/Icon16/allow_users_edit_ranges.png new file mode 100644 index 0000000..44b20e1 Binary files /dev/null and b/asset/icon/Icon16/allow_users_edit_ranges.png differ diff --git a/asset/icon/Icon16/american_express.png b/asset/icon/Icon16/american_express.png new file mode 100644 index 0000000..9b7266e Binary files /dev/null and b/asset/icon/Icon16/american_express.png differ diff --git a/asset/icon/Icon16/anchor.png b/asset/icon/Icon16/anchor.png new file mode 100644 index 0000000..870ebf6 Binary files /dev/null and b/asset/icon/Icon16/anchor.png differ diff --git a/asset/icon/Icon16/android.png b/asset/icon/Icon16/android.png new file mode 100644 index 0000000..71e9265 Binary files /dev/null and b/asset/icon/Icon16/android.png differ diff --git a/asset/icon/Icon16/android_phone_protect.png b/asset/icon/Icon16/android_phone_protect.png new file mode 100644 index 0000000..2da896a Binary files /dev/null and b/asset/icon/Icon16/android_phone_protect.png differ diff --git a/asset/icon/Icon16/angel.png b/asset/icon/Icon16/angel.png new file mode 100644 index 0000000..47a399e Binary files /dev/null and b/asset/icon/Icon16/angel.png differ diff --git a/asset/icon/Icon16/anonymous_ftp_controls.png b/asset/icon/Icon16/anonymous_ftp_controls.png new file mode 100644 index 0000000..c142216 Binary files /dev/null and b/asset/icon/Icon16/anonymous_ftp_controls.png differ diff --git a/asset/icon/Icon16/anti_xss.png b/asset/icon/Icon16/anti_xss.png new file mode 100644 index 0000000..6ca3d81 Binary files /dev/null and b/asset/icon/Icon16/anti_xss.png differ diff --git a/asset/icon/Icon16/aol_mail.png b/asset/icon/Icon16/aol_mail.png new file mode 100644 index 0000000..96834b9 Binary files /dev/null and b/asset/icon/Icon16/aol_mail.png differ diff --git a/asset/icon/Icon16/aol_messenger.png b/asset/icon/Icon16/aol_messenger.png new file mode 100644 index 0000000..55a8768 Binary files /dev/null and b/asset/icon/Icon16/aol_messenger.png differ diff --git a/asset/icon/Icon16/apache_handlers.png b/asset/icon/Icon16/apache_handlers.png new file mode 100644 index 0000000..9aeff28 Binary files /dev/null and b/asset/icon/Icon16/apache_handlers.png differ diff --git a/asset/icon/Icon16/apple.png b/asset/icon/Icon16/apple.png new file mode 100644 index 0000000..813ae7b Binary files /dev/null and b/asset/icon/Icon16/apple.png differ diff --git a/asset/icon/Icon16/apple_corp.png b/asset/icon/Icon16/apple_corp.png new file mode 100644 index 0000000..37d1571 Binary files /dev/null and b/asset/icon/Icon16/apple_corp.png differ diff --git a/asset/icon/Icon16/apple_half.png b/asset/icon/Icon16/apple_half.png new file mode 100644 index 0000000..f505914 Binary files /dev/null and b/asset/icon/Icon16/apple_half.png differ diff --git a/asset/icon/Icon16/application.png b/asset/icon/Icon16/application.png new file mode 100644 index 0000000..217d1ec Binary files /dev/null and b/asset/icon/Icon16/application.png differ diff --git a/asset/icon/Icon16/application_add.png b/asset/icon/Icon16/application_add.png new file mode 100644 index 0000000..b983568 Binary files /dev/null and b/asset/icon/Icon16/application_add.png differ diff --git a/asset/icon/Icon16/application_cascade.png b/asset/icon/Icon16/application_cascade.png new file mode 100644 index 0000000..db45111 Binary files /dev/null and b/asset/icon/Icon16/application_cascade.png differ diff --git a/asset/icon/Icon16/application_control_bar.png b/asset/icon/Icon16/application_control_bar.png new file mode 100644 index 0000000..a37f3d3 Binary files /dev/null and b/asset/icon/Icon16/application_control_bar.png differ diff --git a/asset/icon/Icon16/application_delete.png b/asset/icon/Icon16/application_delete.png new file mode 100644 index 0000000..ea4e4fe Binary files /dev/null and b/asset/icon/Icon16/application_delete.png differ diff --git a/asset/icon/Icon16/application_double.png b/asset/icon/Icon16/application_double.png new file mode 100644 index 0000000..a87b1b9 Binary files /dev/null and b/asset/icon/Icon16/application_double.png differ diff --git a/asset/icon/Icon16/application_edit.png b/asset/icon/Icon16/application_edit.png new file mode 100644 index 0000000..1d61fd2 Binary files /dev/null and b/asset/icon/Icon16/application_edit.png differ diff --git a/asset/icon/Icon16/application_error.png b/asset/icon/Icon16/application_error.png new file mode 100644 index 0000000..f67ecb7 Binary files /dev/null and b/asset/icon/Icon16/application_error.png differ diff --git a/asset/icon/Icon16/application_form.png b/asset/icon/Icon16/application_form.png new file mode 100644 index 0000000..f6bc923 Binary files /dev/null and b/asset/icon/Icon16/application_form.png differ diff --git a/asset/icon/Icon16/application_form_add.png b/asset/icon/Icon16/application_form_add.png new file mode 100644 index 0000000..8904a5f Binary files /dev/null and b/asset/icon/Icon16/application_form_add.png differ diff --git a/asset/icon/Icon16/application_form_delete.png b/asset/icon/Icon16/application_form_delete.png new file mode 100644 index 0000000..14b5bc1 Binary files /dev/null and b/asset/icon/Icon16/application_form_delete.png differ diff --git a/asset/icon/Icon16/application_form_edit.png b/asset/icon/Icon16/application_form_edit.png new file mode 100644 index 0000000..9921d22 Binary files /dev/null and b/asset/icon/Icon16/application_form_edit.png differ diff --git a/asset/icon/Icon16/application_form_magnify.png b/asset/icon/Icon16/application_form_magnify.png new file mode 100644 index 0000000..b6ad641 Binary files /dev/null and b/asset/icon/Icon16/application_form_magnify.png differ diff --git a/asset/icon/Icon16/application_from_storage.png b/asset/icon/Icon16/application_from_storage.png new file mode 100644 index 0000000..a3600b7 Binary files /dev/null and b/asset/icon/Icon16/application_from_storage.png differ diff --git a/asset/icon/Icon16/application_get.png b/asset/icon/Icon16/application_get.png new file mode 100644 index 0000000..1406fd1 Binary files /dev/null and b/asset/icon/Icon16/application_get.png differ diff --git a/asset/icon/Icon16/application_go.png b/asset/icon/Icon16/application_go.png new file mode 100644 index 0000000..5eed333 Binary files /dev/null and b/asset/icon/Icon16/application_go.png differ diff --git a/asset/icon/Icon16/application_home.png b/asset/icon/Icon16/application_home.png new file mode 100644 index 0000000..b18d623 Binary files /dev/null and b/asset/icon/Icon16/application_home.png differ diff --git a/asset/icon/Icon16/application_key.png b/asset/icon/Icon16/application_key.png new file mode 100644 index 0000000..25743a7 Binary files /dev/null and b/asset/icon/Icon16/application_key.png differ diff --git a/asset/icon/Icon16/application_lightning.png b/asset/icon/Icon16/application_lightning.png new file mode 100644 index 0000000..6414e06 Binary files /dev/null and b/asset/icon/Icon16/application_lightning.png differ diff --git a/asset/icon/Icon16/application_link.png b/asset/icon/Icon16/application_link.png new file mode 100644 index 0000000..43e6578 Binary files /dev/null and b/asset/icon/Icon16/application_link.png differ diff --git a/asset/icon/Icon16/application_osx.png b/asset/icon/Icon16/application_osx.png new file mode 100644 index 0000000..6bd3cd3 Binary files /dev/null and b/asset/icon/Icon16/application_osx.png differ diff --git a/asset/icon/Icon16/application_osx_terminal.png b/asset/icon/Icon16/application_osx_terminal.png new file mode 100644 index 0000000..ddd96b3 Binary files /dev/null and b/asset/icon/Icon16/application_osx_terminal.png differ diff --git a/asset/icon/Icon16/application_parts.png b/asset/icon/Icon16/application_parts.png new file mode 100644 index 0000000..5393223 Binary files /dev/null and b/asset/icon/Icon16/application_parts.png differ diff --git a/asset/icon/Icon16/application_put.png b/asset/icon/Icon16/application_put.png new file mode 100644 index 0000000..45e33b6 Binary files /dev/null and b/asset/icon/Icon16/application_put.png differ diff --git a/asset/icon/Icon16/application_side_boxes.png b/asset/icon/Icon16/application_side_boxes.png new file mode 100644 index 0000000..0978b61 Binary files /dev/null and b/asset/icon/Icon16/application_side_boxes.png differ diff --git a/asset/icon/Icon16/application_side_contract.png b/asset/icon/Icon16/application_side_contract.png new file mode 100644 index 0000000..9595b58 Binary files /dev/null and b/asset/icon/Icon16/application_side_contract.png differ diff --git a/asset/icon/Icon16/application_side_expand.png b/asset/icon/Icon16/application_side_expand.png new file mode 100644 index 0000000..65d8431 Binary files /dev/null and b/asset/icon/Icon16/application_side_expand.png differ diff --git a/asset/icon/Icon16/application_side_list.png b/asset/icon/Icon16/application_side_list.png new file mode 100644 index 0000000..045d2a4 Binary files /dev/null and b/asset/icon/Icon16/application_side_list.png differ diff --git a/asset/icon/Icon16/application_side_tree.png b/asset/icon/Icon16/application_side_tree.png new file mode 100644 index 0000000..9bc2681 Binary files /dev/null and b/asset/icon/Icon16/application_side_tree.png differ diff --git a/asset/icon/Icon16/application_split.png b/asset/icon/Icon16/application_split.png new file mode 100644 index 0000000..9a97dea Binary files /dev/null and b/asset/icon/Icon16/application_split.png differ diff --git a/asset/icon/Icon16/application_tile_horizontal.png b/asset/icon/Icon16/application_tile_horizontal.png new file mode 100644 index 0000000..fd9fece Binary files /dev/null and b/asset/icon/Icon16/application_tile_horizontal.png differ diff --git a/asset/icon/Icon16/application_tile_vertical.png b/asset/icon/Icon16/application_tile_vertical.png new file mode 100644 index 0000000..053153f Binary files /dev/null and b/asset/icon/Icon16/application_tile_vertical.png differ diff --git a/asset/icon/Icon16/application_view_columns.png b/asset/icon/Icon16/application_view_columns.png new file mode 100644 index 0000000..0d1fa6f Binary files /dev/null and b/asset/icon/Icon16/application_view_columns.png differ diff --git a/asset/icon/Icon16/application_view_detail.png b/asset/icon/Icon16/application_view_detail.png new file mode 100644 index 0000000..da423c0 Binary files /dev/null and b/asset/icon/Icon16/application_view_detail.png differ diff --git a/asset/icon/Icon16/application_view_gallery.png b/asset/icon/Icon16/application_view_gallery.png new file mode 100644 index 0000000..9e63a69 Binary files /dev/null and b/asset/icon/Icon16/application_view_gallery.png differ diff --git a/asset/icon/Icon16/application_view_icons.png b/asset/icon/Icon16/application_view_icons.png new file mode 100644 index 0000000..b17fe38 Binary files /dev/null and b/asset/icon/Icon16/application_view_icons.png differ diff --git a/asset/icon/Icon16/application_view_list.png b/asset/icon/Icon16/application_view_list.png new file mode 100644 index 0000000..8a08b52 Binary files /dev/null and b/asset/icon/Icon16/application_view_list.png differ diff --git a/asset/icon/Icon16/application_view_tile.png b/asset/icon/Icon16/application_view_tile.png new file mode 100644 index 0000000..4a0c64e Binary files /dev/null and b/asset/icon/Icon16/application_view_tile.png differ diff --git a/asset/icon/Icon16/application_xp.png b/asset/icon/Icon16/application_xp.png new file mode 100644 index 0000000..6318ac7 Binary files /dev/null and b/asset/icon/Icon16/application_xp.png differ diff --git a/asset/icon/Icon16/application_xp_terminal.png b/asset/icon/Icon16/application_xp_terminal.png new file mode 100644 index 0000000..4c0c8b5 Binary files /dev/null and b/asset/icon/Icon16/application_xp_terminal.png differ diff --git a/asset/icon/Icon16/apply_to_all.png b/asset/icon/Icon16/apply_to_all.png new file mode 100644 index 0000000..1b467e6 Binary files /dev/null and b/asset/icon/Icon16/apply_to_all.png differ diff --git a/asset/icon/Icon16/arch_linux.png b/asset/icon/Icon16/arch_linux.png new file mode 100644 index 0000000..443aa02 Binary files /dev/null and b/asset/icon/Icon16/arch_linux.png differ diff --git a/asset/icon/Icon16/areachart.png b/asset/icon/Icon16/areachart.png new file mode 100644 index 0000000..cff29e0 Binary files /dev/null and b/asset/icon/Icon16/areachart.png differ diff --git a/asset/icon/Icon16/arrow_branch.png b/asset/icon/Icon16/arrow_branch.png new file mode 100644 index 0000000..d1fe717 Binary files /dev/null and b/asset/icon/Icon16/arrow_branch.png differ diff --git a/asset/icon/Icon16/arrow_divide.png b/asset/icon/Icon16/arrow_divide.png new file mode 100644 index 0000000..e611bd5 Binary files /dev/null and b/asset/icon/Icon16/arrow_divide.png differ diff --git a/asset/icon/Icon16/arrow_down.png b/asset/icon/Icon16/arrow_down.png new file mode 100644 index 0000000..691f6e0 Binary files /dev/null and b/asset/icon/Icon16/arrow_down.png differ diff --git a/asset/icon/Icon16/arrow_in.png b/asset/icon/Icon16/arrow_in.png new file mode 100644 index 0000000..16838a7 Binary files /dev/null and b/asset/icon/Icon16/arrow_in.png differ diff --git a/asset/icon/Icon16/arrow_inout.png b/asset/icon/Icon16/arrow_inout.png new file mode 100644 index 0000000..82ca9d5 Binary files /dev/null and b/asset/icon/Icon16/arrow_inout.png differ diff --git a/asset/icon/Icon16/arrow_join.png b/asset/icon/Icon16/arrow_join.png new file mode 100644 index 0000000..51e7de9 Binary files /dev/null and b/asset/icon/Icon16/arrow_join.png differ diff --git a/asset/icon/Icon16/arrow_left.png b/asset/icon/Icon16/arrow_left.png new file mode 100644 index 0000000..d9c50c4 Binary files /dev/null and b/asset/icon/Icon16/arrow_left.png differ diff --git a/asset/icon/Icon16/arrow_merge.png b/asset/icon/Icon16/arrow_merge.png new file mode 100644 index 0000000..5a066e5 Binary files /dev/null and b/asset/icon/Icon16/arrow_merge.png differ diff --git a/asset/icon/Icon16/arrow_out.png b/asset/icon/Icon16/arrow_out.png new file mode 100644 index 0000000..0609b3e Binary files /dev/null and b/asset/icon/Icon16/arrow_out.png differ diff --git a/asset/icon/Icon16/arrow_redo.png b/asset/icon/Icon16/arrow_redo.png new file mode 100644 index 0000000..60125c1 Binary files /dev/null and b/asset/icon/Icon16/arrow_redo.png differ diff --git a/asset/icon/Icon16/arrow_refresh.png b/asset/icon/Icon16/arrow_refresh.png new file mode 100644 index 0000000..257cfee Binary files /dev/null and b/asset/icon/Icon16/arrow_refresh.png differ diff --git a/asset/icon/Icon16/arrow_refresh_small.png b/asset/icon/Icon16/arrow_refresh_small.png new file mode 100644 index 0000000..313f164 Binary files /dev/null and b/asset/icon/Icon16/arrow_refresh_small.png differ diff --git a/asset/icon/Icon16/arrow_repeat.png b/asset/icon/Icon16/arrow_repeat.png new file mode 100644 index 0000000..38c140e Binary files /dev/null and b/asset/icon/Icon16/arrow_repeat.png differ diff --git a/asset/icon/Icon16/arrow_repeat_once.png b/asset/icon/Icon16/arrow_repeat_once.png new file mode 100644 index 0000000..b3f6ebc Binary files /dev/null and b/asset/icon/Icon16/arrow_repeat_once.png differ diff --git a/asset/icon/Icon16/arrow_right.png b/asset/icon/Icon16/arrow_right.png new file mode 100644 index 0000000..8d204af Binary files /dev/null and b/asset/icon/Icon16/arrow_right.png differ diff --git a/asset/icon/Icon16/arrow_rotate_anticlockwise.png b/asset/icon/Icon16/arrow_rotate_anticlockwise.png new file mode 100644 index 0000000..7da5cfd Binary files /dev/null and b/asset/icon/Icon16/arrow_rotate_anticlockwise.png differ diff --git a/asset/icon/Icon16/arrow_rotate_clockwise.png b/asset/icon/Icon16/arrow_rotate_clockwise.png new file mode 100644 index 0000000..11b6dd3 Binary files /dev/null and b/asset/icon/Icon16/arrow_rotate_clockwise.png differ diff --git a/asset/icon/Icon16/arrow_switch.png b/asset/icon/Icon16/arrow_switch.png new file mode 100644 index 0000000..422dae7 Binary files /dev/null and b/asset/icon/Icon16/arrow_switch.png differ diff --git a/asset/icon/Icon16/arrow_turn_left.png b/asset/icon/Icon16/arrow_turn_left.png new file mode 100644 index 0000000..6a7c9bc Binary files /dev/null and b/asset/icon/Icon16/arrow_turn_left.png differ diff --git a/asset/icon/Icon16/arrow_turn_right.png b/asset/icon/Icon16/arrow_turn_right.png new file mode 100644 index 0000000..f0053fc Binary files /dev/null and b/asset/icon/Icon16/arrow_turn_right.png differ diff --git a/asset/icon/Icon16/arrow_undo.png b/asset/icon/Icon16/arrow_undo.png new file mode 100644 index 0000000..a588266 Binary files /dev/null and b/asset/icon/Icon16/arrow_undo.png differ diff --git a/asset/icon/Icon16/arrow_up.png b/asset/icon/Icon16/arrow_up.png new file mode 100644 index 0000000..30d005f Binary files /dev/null and b/asset/icon/Icon16/arrow_up.png differ diff --git a/asset/icon/Icon16/artwork.png b/asset/icon/Icon16/artwork.png new file mode 100644 index 0000000..e31cd05 Binary files /dev/null and b/asset/icon/Icon16/artwork.png differ diff --git a/asset/icon/Icon16/ask_and_answer.png b/asset/icon/Icon16/ask_and_answer.png new file mode 100644 index 0000000..cacc3c1 Binary files /dev/null and b/asset/icon/Icon16/ask_and_answer.png differ diff --git a/asset/icon/Icon16/assembled_diagram.png b/asset/icon/Icon16/assembled_diagram.png new file mode 100644 index 0000000..69a6989 Binary files /dev/null and b/asset/icon/Icon16/assembled_diagram.png differ diff --git a/asset/icon/Icon16/asterisk_orange.png b/asset/icon/Icon16/asterisk_orange.png new file mode 100644 index 0000000..86fde52 Binary files /dev/null and b/asset/icon/Icon16/asterisk_orange.png differ diff --git a/asset/icon/Icon16/asterisk_yellow.png b/asset/icon/Icon16/asterisk_yellow.png new file mode 100644 index 0000000..471b332 Binary files /dev/null and b/asset/icon/Icon16/asterisk_yellow.png differ diff --git a/asset/icon/Icon16/at_sign.png b/asset/icon/Icon16/at_sign.png new file mode 100644 index 0000000..ba3f169 Binary files /dev/null and b/asset/icon/Icon16/at_sign.png differ diff --git a/asset/icon/Icon16/atm.png b/asset/icon/Icon16/atm.png new file mode 100644 index 0000000..82b75a6 Binary files /dev/null and b/asset/icon/Icon16/atm.png differ diff --git a/asset/icon/Icon16/attach.png b/asset/icon/Icon16/attach.png new file mode 100644 index 0000000..169a845 Binary files /dev/null and b/asset/icon/Icon16/attach.png differ diff --git a/asset/icon/Icon16/attributes_display.png b/asset/icon/Icon16/attributes_display.png new file mode 100644 index 0000000..1619e3d Binary files /dev/null and b/asset/icon/Icon16/attributes_display.png differ diff --git a/asset/icon/Icon16/attribution.png b/asset/icon/Icon16/attribution.png new file mode 100644 index 0000000..07dccd4 Binary files /dev/null and b/asset/icon/Icon16/attribution.png differ diff --git a/asset/icon/Icon16/auction_hammer_gavel.png b/asset/icon/Icon16/auction_hammer_gavel.png new file mode 100644 index 0000000..ea1fa31 Binary files /dev/null and b/asset/icon/Icon16/auction_hammer_gavel.png differ diff --git a/asset/icon/Icon16/autoarchieve_settings.png b/asset/icon/Icon16/autoarchieve_settings.png new file mode 100644 index 0000000..1e23892 Binary files /dev/null and b/asset/icon/Icon16/autoarchieve_settings.png differ diff --git a/asset/icon/Icon16/autoresponders.png b/asset/icon/Icon16/autoresponders.png new file mode 100644 index 0000000..842f413 Binary files /dev/null and b/asset/icon/Icon16/autoresponders.png differ diff --git a/asset/icon/Icon16/autos.png b/asset/icon/Icon16/autos.png new file mode 100644 index 0000000..fec5f40 Binary files /dev/null and b/asset/icon/Icon16/autos.png differ diff --git a/asset/icon/Icon16/award_star_add.png b/asset/icon/Icon16/award_star_add.png new file mode 100644 index 0000000..4046d11 Binary files /dev/null and b/asset/icon/Icon16/award_star_add.png differ diff --git a/asset/icon/Icon16/award_star_bronze_1.png b/asset/icon/Icon16/award_star_bronze_1.png new file mode 100644 index 0000000..e116b0e Binary files /dev/null and b/asset/icon/Icon16/award_star_bronze_1.png differ diff --git a/asset/icon/Icon16/award_star_bronze_2.png b/asset/icon/Icon16/award_star_bronze_2.png new file mode 100644 index 0000000..0cec925 Binary files /dev/null and b/asset/icon/Icon16/award_star_bronze_2.png differ diff --git a/asset/icon/Icon16/award_star_bronze_3.png b/asset/icon/Icon16/award_star_bronze_3.png new file mode 100644 index 0000000..57078a6 Binary files /dev/null and b/asset/icon/Icon16/award_star_bronze_3.png differ diff --git a/asset/icon/Icon16/award_star_delete.png b/asset/icon/Icon16/award_star_delete.png new file mode 100644 index 0000000..056c1ee Binary files /dev/null and b/asset/icon/Icon16/award_star_delete.png differ diff --git a/asset/icon/Icon16/award_star_gold_1.png b/asset/icon/Icon16/award_star_gold_1.png new file mode 100644 index 0000000..9db0942 Binary files /dev/null and b/asset/icon/Icon16/award_star_gold_1.png differ diff --git a/asset/icon/Icon16/award_star_gold_2.png b/asset/icon/Icon16/award_star_gold_2.png new file mode 100644 index 0000000..2b64cf0 Binary files /dev/null and b/asset/icon/Icon16/award_star_gold_2.png differ diff --git a/asset/icon/Icon16/award_star_gold_3.png b/asset/icon/Icon16/award_star_gold_3.png new file mode 100644 index 0000000..3200f51 Binary files /dev/null and b/asset/icon/Icon16/award_star_gold_3.png differ diff --git a/asset/icon/Icon16/award_star_silver_1.png b/asset/icon/Icon16/award_star_silver_1.png new file mode 100644 index 0000000..d405d12 Binary files /dev/null and b/asset/icon/Icon16/award_star_silver_1.png differ diff --git a/asset/icon/Icon16/award_star_silver_2.png b/asset/icon/Icon16/award_star_silver_2.png new file mode 100644 index 0000000..eedc0e4 Binary files /dev/null and b/asset/icon/Icon16/award_star_silver_2.png differ diff --git a/asset/icon/Icon16/award_star_silver_3.png b/asset/icon/Icon16/award_star_silver_3.png new file mode 100644 index 0000000..2eddeeb Binary files /dev/null and b/asset/icon/Icon16/award_star_silver_3.png differ diff --git a/asset/icon/Icon16/awstats.png b/asset/icon/Icon16/awstats.png new file mode 100644 index 0000000..1b62182 Binary files /dev/null and b/asset/icon/Icon16/awstats.png differ diff --git a/asset/icon/Icon16/ax.png b/asset/icon/Icon16/ax.png new file mode 100644 index 0000000..f1f9c14 Binary files /dev/null and b/asset/icon/Icon16/ax.png differ diff --git a/asset/icon/Icon16/baby_bottle.png b/asset/icon/Icon16/baby_bottle.png new file mode 100644 index 0000000..1467fa6 Binary files /dev/null and b/asset/icon/Icon16/baby_bottle.png differ diff --git a/asset/icon/Icon16/backpack.png b/asset/icon/Icon16/backpack.png new file mode 100644 index 0000000..55b2b5f Binary files /dev/null and b/asset/icon/Icon16/backpack.png differ diff --git a/asset/icon/Icon16/backup_manager.png b/asset/icon/Icon16/backup_manager.png new file mode 100644 index 0000000..1aa1864 Binary files /dev/null and b/asset/icon/Icon16/backup_manager.png differ diff --git a/asset/icon/Icon16/backup_wizard.png b/asset/icon/Icon16/backup_wizard.png new file mode 100644 index 0000000..ec26805 Binary files /dev/null and b/asset/icon/Icon16/backup_wizard.png differ diff --git a/asset/icon/Icon16/backups.png b/asset/icon/Icon16/backups.png new file mode 100644 index 0000000..64b1804 Binary files /dev/null and b/asset/icon/Icon16/backups.png differ diff --git a/asset/icon/Icon16/baggage_cart.png b/asset/icon/Icon16/baggage_cart.png new file mode 100644 index 0000000..853e691 Binary files /dev/null and b/asset/icon/Icon16/baggage_cart.png differ diff --git a/asset/icon/Icon16/baggage_cart_box.png b/asset/icon/Icon16/baggage_cart_box.png new file mode 100644 index 0000000..4956fad Binary files /dev/null and b/asset/icon/Icon16/baggage_cart_box.png differ diff --git a/asset/icon/Icon16/balance.png b/asset/icon/Icon16/balance.png new file mode 100644 index 0000000..cf099e9 Binary files /dev/null and b/asset/icon/Icon16/balance.png differ diff --git a/asset/icon/Icon16/balance_unbalance.png b/asset/icon/Icon16/balance_unbalance.png new file mode 100644 index 0000000..a7d83bc Binary files /dev/null and b/asset/icon/Icon16/balance_unbalance.png differ diff --git a/asset/icon/Icon16/ballon.png b/asset/icon/Icon16/ballon.png new file mode 100644 index 0000000..f39439e Binary files /dev/null and b/asset/icon/Icon16/ballon.png differ diff --git a/asset/icon/Icon16/baloon.png b/asset/icon/Icon16/baloon.png new file mode 100644 index 0000000..bb1df57 Binary files /dev/null and b/asset/icon/Icon16/baloon.png differ diff --git a/asset/icon/Icon16/baloon_2.png b/asset/icon/Icon16/baloon_2.png new file mode 100644 index 0000000..6c02032 Binary files /dev/null and b/asset/icon/Icon16/baloon_2.png differ diff --git a/asset/icon/Icon16/baloon_2_empty.png b/asset/icon/Icon16/baloon_2_empty.png new file mode 100644 index 0000000..506f05c Binary files /dev/null and b/asset/icon/Icon16/baloon_2_empty.png differ diff --git a/asset/icon/Icon16/bamboo.png b/asset/icon/Icon16/bamboo.png new file mode 100644 index 0000000..5d6e85c Binary files /dev/null and b/asset/icon/Icon16/bamboo.png differ diff --git a/asset/icon/Icon16/bamboos.png b/asset/icon/Icon16/bamboos.png new file mode 100644 index 0000000..2098246 Binary files /dev/null and b/asset/icon/Icon16/bamboos.png differ diff --git a/asset/icon/Icon16/bandaid.png b/asset/icon/Icon16/bandaid.png new file mode 100644 index 0000000..026c0d3 Binary files /dev/null and b/asset/icon/Icon16/bandaid.png differ diff --git a/asset/icon/Icon16/bandwith.png b/asset/icon/Icon16/bandwith.png new file mode 100644 index 0000000..097092c Binary files /dev/null and b/asset/icon/Icon16/bandwith.png differ diff --git a/asset/icon/Icon16/bank.png b/asset/icon/Icon16/bank.png new file mode 100644 index 0000000..f318579 Binary files /dev/null and b/asset/icon/Icon16/bank.png differ diff --git a/asset/icon/Icon16/barchart.png b/asset/icon/Icon16/barchart.png new file mode 100644 index 0000000..4e4dccf Binary files /dev/null and b/asset/icon/Icon16/barchart.png differ diff --git a/asset/icon/Icon16/barcode.png b/asset/icon/Icon16/barcode.png new file mode 100644 index 0000000..c0e3585 Binary files /dev/null and b/asset/icon/Icon16/barcode.png differ diff --git a/asset/icon/Icon16/barcode_2d.png b/asset/icon/Icon16/barcode_2d.png new file mode 100644 index 0000000..0e1a7dc Binary files /dev/null and b/asset/icon/Icon16/barcode_2d.png differ diff --git a/asset/icon/Icon16/basic_cpanel_wmh_setup.png b/asset/icon/Icon16/basic_cpanel_wmh_setup.png new file mode 100644 index 0000000..7bd6347 Binary files /dev/null and b/asset/icon/Icon16/basic_cpanel_wmh_setup.png differ diff --git a/asset/icon/Icon16/basket.png b/asset/icon/Icon16/basket.png new file mode 100644 index 0000000..1ff455e Binary files /dev/null and b/asset/icon/Icon16/basket.png differ diff --git a/asset/icon/Icon16/basket_add.png b/asset/icon/Icon16/basket_add.png new file mode 100644 index 0000000..c152c6d Binary files /dev/null and b/asset/icon/Icon16/basket_add.png differ diff --git a/asset/icon/Icon16/basket_delete.png b/asset/icon/Icon16/basket_delete.png new file mode 100644 index 0000000..336dbe7 Binary files /dev/null and b/asset/icon/Icon16/basket_delete.png differ diff --git a/asset/icon/Icon16/basket_edit.png b/asset/icon/Icon16/basket_edit.png new file mode 100644 index 0000000..9aa521f Binary files /dev/null and b/asset/icon/Icon16/basket_edit.png differ diff --git a/asset/icon/Icon16/basket_error.png b/asset/icon/Icon16/basket_error.png new file mode 100644 index 0000000..14e9809 Binary files /dev/null and b/asset/icon/Icon16/basket_error.png differ diff --git a/asset/icon/Icon16/basket_full.png b/asset/icon/Icon16/basket_full.png new file mode 100644 index 0000000..a17251d Binary files /dev/null and b/asset/icon/Icon16/basket_full.png differ diff --git a/asset/icon/Icon16/basket_go.png b/asset/icon/Icon16/basket_go.png new file mode 100644 index 0000000..437c8ab Binary files /dev/null and b/asset/icon/Icon16/basket_go.png differ diff --git a/asset/icon/Icon16/basket_put.png b/asset/icon/Icon16/basket_put.png new file mode 100644 index 0000000..01fc586 Binary files /dev/null and b/asset/icon/Icon16/basket_put.png differ diff --git a/asset/icon/Icon16/basket_remove.png b/asset/icon/Icon16/basket_remove.png new file mode 100644 index 0000000..c2f4ddd Binary files /dev/null and b/asset/icon/Icon16/basket_remove.png differ diff --git a/asset/icon/Icon16/basket_shopping.png b/asset/icon/Icon16/basket_shopping.png new file mode 100644 index 0000000..0d72f0d Binary files /dev/null and b/asset/icon/Icon16/basket_shopping.png differ diff --git a/asset/icon/Icon16/baton.png b/asset/icon/Icon16/baton.png new file mode 100644 index 0000000..7b265be Binary files /dev/null and b/asset/icon/Icon16/baton.png differ diff --git a/asset/icon/Icon16/battery.png b/asset/icon/Icon16/battery.png new file mode 100644 index 0000000..51abc8a Binary files /dev/null and b/asset/icon/Icon16/battery.png differ diff --git a/asset/icon/Icon16/battery_charge.png b/asset/icon/Icon16/battery_charge.png new file mode 100644 index 0000000..2f64dd4 Binary files /dev/null and b/asset/icon/Icon16/battery_charge.png differ diff --git a/asset/icon/Icon16/battery_full.png b/asset/icon/Icon16/battery_full.png new file mode 100644 index 0000000..5314561 Binary files /dev/null and b/asset/icon/Icon16/battery_full.png differ diff --git a/asset/icon/Icon16/battery_half.png b/asset/icon/Icon16/battery_half.png new file mode 100644 index 0000000..08f76f4 Binary files /dev/null and b/asset/icon/Icon16/battery_half.png differ diff --git a/asset/icon/Icon16/battery_low.png b/asset/icon/Icon16/battery_low.png new file mode 100644 index 0000000..5a253ad Binary files /dev/null and b/asset/icon/Icon16/battery_low.png differ diff --git a/asset/icon/Icon16/battery_plug.png b/asset/icon/Icon16/battery_plug.png new file mode 100644 index 0000000..ebc275a Binary files /dev/null and b/asset/icon/Icon16/battery_plug.png differ diff --git a/asset/icon/Icon16/beaker.png b/asset/icon/Icon16/beaker.png new file mode 100644 index 0000000..7897f17 Binary files /dev/null and b/asset/icon/Icon16/beaker.png differ diff --git a/asset/icon/Icon16/beaker_empty.png b/asset/icon/Icon16/beaker_empty.png new file mode 100644 index 0000000..27dfd0a Binary files /dev/null and b/asset/icon/Icon16/beaker_empty.png differ diff --git a/asset/icon/Icon16/bean.png b/asset/icon/Icon16/bean.png new file mode 100644 index 0000000..65df34a Binary files /dev/null and b/asset/icon/Icon16/bean.png differ diff --git a/asset/icon/Icon16/bed.png b/asset/icon/Icon16/bed.png new file mode 100644 index 0000000..49d651e Binary files /dev/null and b/asset/icon/Icon16/bed.png differ diff --git a/asset/icon/Icon16/bedo.png b/asset/icon/Icon16/bedo.png new file mode 100644 index 0000000..55a0ad6 Binary files /dev/null and b/asset/icon/Icon16/bedo.png differ diff --git a/asset/icon/Icon16/beer.png b/asset/icon/Icon16/beer.png new file mode 100644 index 0000000..1113e7a Binary files /dev/null and b/asset/icon/Icon16/beer.png differ diff --git a/asset/icon/Icon16/before_change.png b/asset/icon/Icon16/before_change.png new file mode 100644 index 0000000..f7c0067 Binary files /dev/null and b/asset/icon/Icon16/before_change.png differ diff --git a/asset/icon/Icon16/before_delete.png b/asset/icon/Icon16/before_delete.png new file mode 100644 index 0000000..69eb2db Binary files /dev/null and b/asset/icon/Icon16/before_delete.png differ diff --git a/asset/icon/Icon16/bell.png b/asset/icon/Icon16/bell.png new file mode 100644 index 0000000..8dce996 Binary files /dev/null and b/asset/icon/Icon16/bell.png differ diff --git a/asset/icon/Icon16/bell_add.png b/asset/icon/Icon16/bell_add.png new file mode 100644 index 0000000..af3bccd Binary files /dev/null and b/asset/icon/Icon16/bell_add.png differ diff --git a/asset/icon/Icon16/bell_delete.png b/asset/icon/Icon16/bell_delete.png new file mode 100644 index 0000000..9d45172 Binary files /dev/null and b/asset/icon/Icon16/bell_delete.png differ diff --git a/asset/icon/Icon16/bell_error.png b/asset/icon/Icon16/bell_error.png new file mode 100644 index 0000000..681603f Binary files /dev/null and b/asset/icon/Icon16/bell_error.png differ diff --git a/asset/icon/Icon16/bell_go.png b/asset/icon/Icon16/bell_go.png new file mode 100644 index 0000000..9ebc9a9 Binary files /dev/null and b/asset/icon/Icon16/bell_go.png differ diff --git a/asset/icon/Icon16/bell_link.png b/asset/icon/Icon16/bell_link.png new file mode 100644 index 0000000..729b87d Binary files /dev/null and b/asset/icon/Icon16/bell_link.png differ diff --git a/asset/icon/Icon16/bibliography.png b/asset/icon/Icon16/bibliography.png new file mode 100644 index 0000000..c38aa91 Binary files /dev/null and b/asset/icon/Icon16/bibliography.png differ diff --git a/asset/icon/Icon16/billboard_empty.png b/asset/icon/Icon16/billboard_empty.png new file mode 100644 index 0000000..c9c2375 Binary files /dev/null and b/asset/icon/Icon16/billboard_empty.png differ diff --git a/asset/icon/Icon16/billboard_picture.png b/asset/icon/Icon16/billboard_picture.png new file mode 100644 index 0000000..acb34ff Binary files /dev/null and b/asset/icon/Icon16/billboard_picture.png differ diff --git a/asset/icon/Icon16/billiard_marker.png b/asset/icon/Icon16/billiard_marker.png new file mode 100644 index 0000000..ce3ca9d Binary files /dev/null and b/asset/icon/Icon16/billiard_marker.png differ diff --git a/asset/icon/Icon16/bin.png b/asset/icon/Icon16/bin.png new file mode 100644 index 0000000..aaeeb7c Binary files /dev/null and b/asset/icon/Icon16/bin.png differ diff --git a/asset/icon/Icon16/bin_closed.png b/asset/icon/Icon16/bin_closed.png new file mode 100644 index 0000000..41e1f9b Binary files /dev/null and b/asset/icon/Icon16/bin_closed.png differ diff --git a/asset/icon/Icon16/bin_empty.png b/asset/icon/Icon16/bin_empty.png new file mode 100644 index 0000000..df6278b Binary files /dev/null and b/asset/icon/Icon16/bin_empty.png differ diff --git a/asset/icon/Icon16/bin_recycle.png b/asset/icon/Icon16/bin_recycle.png new file mode 100644 index 0000000..66a1586 Binary files /dev/null and b/asset/icon/Icon16/bin_recycle.png differ diff --git a/asset/icon/Icon16/bios.png b/asset/icon/Icon16/bios.png new file mode 100644 index 0000000..24005e1 Binary files /dev/null and b/asset/icon/Icon16/bios.png differ diff --git a/asset/icon/Icon16/blackberry.png b/asset/icon/Icon16/blackberry.png new file mode 100644 index 0000000..fe59ce8 Binary files /dev/null and b/asset/icon/Icon16/blackberry.png differ diff --git a/asset/icon/Icon16/blackberry_messenger.png b/asset/icon/Icon16/blackberry_messenger.png new file mode 100644 index 0000000..38d9f92 Binary files /dev/null and b/asset/icon/Icon16/blackberry_messenger.png differ diff --git a/asset/icon/Icon16/blackberry_protect.png b/asset/icon/Icon16/blackberry_protect.png new file mode 100644 index 0000000..8b9c9ee Binary files /dev/null and b/asset/icon/Icon16/blackberry_protect.png differ diff --git a/asset/icon/Icon16/blackberry_white.png b/asset/icon/Icon16/blackberry_white.png new file mode 100644 index 0000000..2645d65 Binary files /dev/null and b/asset/icon/Icon16/blackberry_white.png differ diff --git a/asset/icon/Icon16/blackboard_drawing.png b/asset/icon/Icon16/blackboard_drawing.png new file mode 100644 index 0000000..8feeceb Binary files /dev/null and b/asset/icon/Icon16/blackboard_drawing.png differ diff --git a/asset/icon/Icon16/blackboard_empty.png b/asset/icon/Icon16/blackboard_empty.png new file mode 100644 index 0000000..1ece694 Binary files /dev/null and b/asset/icon/Icon16/blackboard_empty.png differ diff --git a/asset/icon/Icon16/blackboard_steps.png b/asset/icon/Icon16/blackboard_steps.png new file mode 100644 index 0000000..6b3be8b Binary files /dev/null and b/asset/icon/Icon16/blackboard_steps.png differ diff --git a/asset/icon/Icon16/blackboard_sum.png b/asset/icon/Icon16/blackboard_sum.png new file mode 100644 index 0000000..a6aa0d7 Binary files /dev/null and b/asset/icon/Icon16/blackboard_sum.png differ diff --git a/asset/icon/Icon16/blank_report.png b/asset/icon/Icon16/blank_report.png new file mode 100644 index 0000000..84043f7 Binary files /dev/null and b/asset/icon/Icon16/blank_report.png differ diff --git a/asset/icon/Icon16/blogger.png b/asset/icon/Icon16/blogger.png new file mode 100644 index 0000000..53b4366 Binary files /dev/null and b/asset/icon/Icon16/blogger.png differ diff --git a/asset/icon/Icon16/blogs.png b/asset/icon/Icon16/blogs.png new file mode 100644 index 0000000..80d2307 Binary files /dev/null and b/asset/icon/Icon16/blogs.png differ diff --git a/asset/icon/Icon16/blueprint.png b/asset/icon/Icon16/blueprint.png new file mode 100644 index 0000000..26d0a66 Binary files /dev/null and b/asset/icon/Icon16/blueprint.png differ diff --git a/asset/icon/Icon16/blueprint_horizontal.png b/asset/icon/Icon16/blueprint_horizontal.png new file mode 100644 index 0000000..c935294 Binary files /dev/null and b/asset/icon/Icon16/blueprint_horizontal.png differ diff --git a/asset/icon/Icon16/blueprints.png b/asset/icon/Icon16/blueprints.png new file mode 100644 index 0000000..54a625b Binary files /dev/null and b/asset/icon/Icon16/blueprints.png differ diff --git a/asset/icon/Icon16/bluetooth.png b/asset/icon/Icon16/bluetooth.png new file mode 100644 index 0000000..3e1454e Binary files /dev/null and b/asset/icon/Icon16/bluetooth.png differ diff --git a/asset/icon/Icon16/board_game.png b/asset/icon/Icon16/board_game.png new file mode 100644 index 0000000..1da83da Binary files /dev/null and b/asset/icon/Icon16/board_game.png differ diff --git a/asset/icon/Icon16/bomb.png b/asset/icon/Icon16/bomb.png new file mode 100644 index 0000000..6e8e3a3 Binary files /dev/null and b/asset/icon/Icon16/bomb.png differ diff --git a/asset/icon/Icon16/book.png b/asset/icon/Icon16/book.png new file mode 100644 index 0000000..e48ff95 Binary files /dev/null and b/asset/icon/Icon16/book.png differ diff --git a/asset/icon/Icon16/book_add.png b/asset/icon/Icon16/book_add.png new file mode 100644 index 0000000..5507bec Binary files /dev/null and b/asset/icon/Icon16/book_add.png differ diff --git a/asset/icon/Icon16/book_addresses.png b/asset/icon/Icon16/book_addresses.png new file mode 100644 index 0000000..16e2a56 Binary files /dev/null and b/asset/icon/Icon16/book_addresses.png differ diff --git a/asset/icon/Icon16/book_delete.png b/asset/icon/Icon16/book_delete.png new file mode 100644 index 0000000..0dd9d2e Binary files /dev/null and b/asset/icon/Icon16/book_delete.png differ diff --git a/asset/icon/Icon16/book_edit.png b/asset/icon/Icon16/book_edit.png new file mode 100644 index 0000000..c60368a Binary files /dev/null and b/asset/icon/Icon16/book_edit.png differ diff --git a/asset/icon/Icon16/book_error.png b/asset/icon/Icon16/book_error.png new file mode 100644 index 0000000..ea3ba2e Binary files /dev/null and b/asset/icon/Icon16/book_error.png differ diff --git a/asset/icon/Icon16/book_go.png b/asset/icon/Icon16/book_go.png new file mode 100644 index 0000000..ca674bf Binary files /dev/null and b/asset/icon/Icon16/book_go.png differ diff --git a/asset/icon/Icon16/book_keeping.png b/asset/icon/Icon16/book_keeping.png new file mode 100644 index 0000000..a15d784 Binary files /dev/null and b/asset/icon/Icon16/book_keeping.png differ diff --git a/asset/icon/Icon16/book_key.png b/asset/icon/Icon16/book_key.png new file mode 100644 index 0000000..b985491 Binary files /dev/null and b/asset/icon/Icon16/book_key.png differ diff --git a/asset/icon/Icon16/book_link.png b/asset/icon/Icon16/book_link.png new file mode 100644 index 0000000..241961d Binary files /dev/null and b/asset/icon/Icon16/book_link.png differ diff --git a/asset/icon/Icon16/book_next.png b/asset/icon/Icon16/book_next.png new file mode 100644 index 0000000..4a7af04 Binary files /dev/null and b/asset/icon/Icon16/book_next.png differ diff --git a/asset/icon/Icon16/book_open.png b/asset/icon/Icon16/book_open.png new file mode 100644 index 0000000..6e8273b Binary files /dev/null and b/asset/icon/Icon16/book_open.png differ diff --git a/asset/icon/Icon16/book_picture.png b/asset/icon/Icon16/book_picture.png new file mode 100644 index 0000000..d345086 Binary files /dev/null and b/asset/icon/Icon16/book_picture.png differ diff --git a/asset/icon/Icon16/book_previous.png b/asset/icon/Icon16/book_previous.png new file mode 100644 index 0000000..c1d1421 Binary files /dev/null and b/asset/icon/Icon16/book_previous.png differ diff --git a/asset/icon/Icon16/book_spelling.png b/asset/icon/Icon16/book_spelling.png new file mode 100644 index 0000000..aeedae0 Binary files /dev/null and b/asset/icon/Icon16/book_spelling.png differ diff --git a/asset/icon/Icon16/bookmark.png b/asset/icon/Icon16/bookmark.png new file mode 100644 index 0000000..add8687 Binary files /dev/null and b/asset/icon/Icon16/bookmark.png differ diff --git a/asset/icon/Icon16/bookmark_red.png b/asset/icon/Icon16/bookmark_red.png new file mode 100644 index 0000000..f7b01b3 Binary files /dev/null and b/asset/icon/Icon16/bookmark_red.png differ diff --git a/asset/icon/Icon16/books.png b/asset/icon/Icon16/books.png new file mode 100644 index 0000000..571b0c6 Binary files /dev/null and b/asset/icon/Icon16/books.png differ diff --git a/asset/icon/Icon16/books_stack.png b/asset/icon/Icon16/books_stack.png new file mode 100644 index 0000000..6d659e1 Binary files /dev/null and b/asset/icon/Icon16/books_stack.png differ diff --git a/asset/icon/Icon16/bookshelf.png b/asset/icon/Icon16/bookshelf.png new file mode 100644 index 0000000..c589cad Binary files /dev/null and b/asset/icon/Icon16/bookshelf.png differ diff --git a/asset/icon/Icon16/boomerang.png b/asset/icon/Icon16/boomerang.png new file mode 100644 index 0000000..2037903 Binary files /dev/null and b/asset/icon/Icon16/boomerang.png differ diff --git a/asset/icon/Icon16/border_1.png b/asset/icon/Icon16/border_1.png new file mode 100644 index 0000000..dd5ff49 Binary files /dev/null and b/asset/icon/Icon16/border_1.png differ diff --git a/asset/icon/Icon16/border_1_bottom.png b/asset/icon/Icon16/border_1_bottom.png new file mode 100644 index 0000000..275d749 Binary files /dev/null and b/asset/icon/Icon16/border_1_bottom.png differ diff --git a/asset/icon/Icon16/border_1_hor.png b/asset/icon/Icon16/border_1_hor.png new file mode 100644 index 0000000..56546ab Binary files /dev/null and b/asset/icon/Icon16/border_1_hor.png differ diff --git a/asset/icon/Icon16/border_1_left.png b/asset/icon/Icon16/border_1_left.png new file mode 100644 index 0000000..e3fe2eb Binary files /dev/null and b/asset/icon/Icon16/border_1_left.png differ diff --git a/asset/icon/Icon16/border_1_middle.png b/asset/icon/Icon16/border_1_middle.png new file mode 100644 index 0000000..2875a7c Binary files /dev/null and b/asset/icon/Icon16/border_1_middle.png differ diff --git a/asset/icon/Icon16/border_1_none.png b/asset/icon/Icon16/border_1_none.png new file mode 100644 index 0000000..d9a1e96 Binary files /dev/null and b/asset/icon/Icon16/border_1_none.png differ diff --git a/asset/icon/Icon16/border_1_outer.png b/asset/icon/Icon16/border_1_outer.png new file mode 100644 index 0000000..eaa8dfc Binary files /dev/null and b/asset/icon/Icon16/border_1_outer.png differ diff --git a/asset/icon/Icon16/border_1_right.png b/asset/icon/Icon16/border_1_right.png new file mode 100644 index 0000000..49f72cb Binary files /dev/null and b/asset/icon/Icon16/border_1_right.png differ diff --git a/asset/icon/Icon16/border_1_top.png b/asset/icon/Icon16/border_1_top.png new file mode 100644 index 0000000..6726775 Binary files /dev/null and b/asset/icon/Icon16/border_1_top.png differ diff --git a/asset/icon/Icon16/border_1_ver.png b/asset/icon/Icon16/border_1_ver.png new file mode 100644 index 0000000..0b98f56 Binary files /dev/null and b/asset/icon/Icon16/border_1_ver.png differ diff --git a/asset/icon/Icon16/border_1d_around.png b/asset/icon/Icon16/border_1d_around.png new file mode 100644 index 0000000..f5ea514 Binary files /dev/null and b/asset/icon/Icon16/border_1d_around.png differ diff --git a/asset/icon/Icon16/border_1d_bottom.png b/asset/icon/Icon16/border_1d_bottom.png new file mode 100644 index 0000000..0c3c947 Binary files /dev/null and b/asset/icon/Icon16/border_1d_bottom.png differ diff --git a/asset/icon/Icon16/border_1d_left.png b/asset/icon/Icon16/border_1d_left.png new file mode 100644 index 0000000..10d002b Binary files /dev/null and b/asset/icon/Icon16/border_1d_left.png differ diff --git a/asset/icon/Icon16/border_1d_right.png b/asset/icon/Icon16/border_1d_right.png new file mode 100644 index 0000000..f6b621c Binary files /dev/null and b/asset/icon/Icon16/border_1d_right.png differ diff --git a/asset/icon/Icon16/border_1d_top.png b/asset/icon/Icon16/border_1d_top.png new file mode 100644 index 0000000..cb25d16 Binary files /dev/null and b/asset/icon/Icon16/border_1d_top.png differ diff --git a/asset/icon/Icon16/border_2_bottom.png b/asset/icon/Icon16/border_2_bottom.png new file mode 100644 index 0000000..bb26e28 Binary files /dev/null and b/asset/icon/Icon16/border_2_bottom.png differ diff --git a/asset/icon/Icon16/border_2_left.png b/asset/icon/Icon16/border_2_left.png new file mode 100644 index 0000000..e13e4d5 Binary files /dev/null and b/asset/icon/Icon16/border_2_left.png differ diff --git a/asset/icon/Icon16/border_2_outer.png b/asset/icon/Icon16/border_2_outer.png new file mode 100644 index 0000000..9354f1c Binary files /dev/null and b/asset/icon/Icon16/border_2_outer.png differ diff --git a/asset/icon/Icon16/border_2_right.png b/asset/icon/Icon16/border_2_right.png new file mode 100644 index 0000000..88e7e41 Binary files /dev/null and b/asset/icon/Icon16/border_2_right.png differ diff --git a/asset/icon/Icon16/border_2_top.png b/asset/icon/Icon16/border_2_top.png new file mode 100644 index 0000000..0d326c5 Binary files /dev/null and b/asset/icon/Icon16/border_2_top.png differ diff --git a/asset/icon/Icon16/border_color.png b/asset/icon/Icon16/border_color.png new file mode 100644 index 0000000..face858 Binary files /dev/null and b/asset/icon/Icon16/border_color.png differ diff --git a/asset/icon/Icon16/border_weight.png b/asset/icon/Icon16/border_weight.png new file mode 100644 index 0000000..055ade0 Binary files /dev/null and b/asset/icon/Icon16/border_weight.png differ diff --git a/asset/icon/Icon16/borders_accent.png b/asset/icon/Icon16/borders_accent.png new file mode 100644 index 0000000..d73f38c Binary files /dev/null and b/asset/icon/Icon16/borders_accent.png differ diff --git a/asset/icon/Icon16/bow.png b/asset/icon/Icon16/bow.png new file mode 100644 index 0000000..8a6ef85 Binary files /dev/null and b/asset/icon/Icon16/bow.png differ diff --git a/asset/icon/Icon16/box.png b/asset/icon/Icon16/box.png new file mode 100644 index 0000000..ef720cf Binary files /dev/null and b/asset/icon/Icon16/box.png differ diff --git a/asset/icon/Icon16/box_closed.png b/asset/icon/Icon16/box_closed.png new file mode 100644 index 0000000..44279dc Binary files /dev/null and b/asset/icon/Icon16/box_closed.png differ diff --git a/asset/icon/Icon16/box_down.png b/asset/icon/Icon16/box_down.png new file mode 100644 index 0000000..1324169 Binary files /dev/null and b/asset/icon/Icon16/box_down.png differ diff --git a/asset/icon/Icon16/box_front.png b/asset/icon/Icon16/box_front.png new file mode 100644 index 0000000..a33977e Binary files /dev/null and b/asset/icon/Icon16/box_front.png differ diff --git a/asset/icon/Icon16/box_open.png b/asset/icon/Icon16/box_open.png new file mode 100644 index 0000000..a94519e Binary files /dev/null and b/asset/icon/Icon16/box_open.png differ diff --git a/asset/icon/Icon16/box_resize.png b/asset/icon/Icon16/box_resize.png new file mode 100644 index 0000000..ba22f59 Binary files /dev/null and b/asset/icon/Icon16/box_resize.png differ diff --git a/asset/icon/Icon16/box_resize_actual.png b/asset/icon/Icon16/box_resize_actual.png new file mode 100644 index 0000000..c9c21c4 Binary files /dev/null and b/asset/icon/Icon16/box_resize_actual.png differ diff --git a/asset/icon/Icon16/box_search.png b/asset/icon/Icon16/box_search.png new file mode 100644 index 0000000..6b4607e Binary files /dev/null and b/asset/icon/Icon16/box_search.png differ diff --git a/asset/icon/Icon16/boxing_glove.png b/asset/icon/Icon16/boxing_glove.png new file mode 100644 index 0000000..f7c06a7 Binary files /dev/null and b/asset/icon/Icon16/boxing_glove.png differ diff --git a/asset/icon/Icon16/boxtrapper.png b/asset/icon/Icon16/boxtrapper.png new file mode 100644 index 0000000..1083d5e Binary files /dev/null and b/asset/icon/Icon16/boxtrapper.png differ diff --git a/asset/icon/Icon16/brain.png b/asset/icon/Icon16/brain.png new file mode 100644 index 0000000..53d7fe7 Binary files /dev/null and b/asset/icon/Icon16/brain.png differ diff --git a/asset/icon/Icon16/brain_trainer.png b/asset/icon/Icon16/brain_trainer.png new file mode 100644 index 0000000..4b8f4f5 Binary files /dev/null and b/asset/icon/Icon16/brain_trainer.png differ diff --git a/asset/icon/Icon16/bread.png b/asset/icon/Icon16/bread.png new file mode 100644 index 0000000..4d815b9 Binary files /dev/null and b/asset/icon/Icon16/bread.png differ diff --git a/asset/icon/Icon16/breadcrumb.png b/asset/icon/Icon16/breadcrumb.png new file mode 100644 index 0000000..6638a62 Binary files /dev/null and b/asset/icon/Icon16/breadcrumb.png differ diff --git a/asset/icon/Icon16/breadcrumb_select.png b/asset/icon/Icon16/breadcrumb_select.png new file mode 100644 index 0000000..9165292 Binary files /dev/null and b/asset/icon/Icon16/breadcrumb_select.png differ diff --git a/asset/icon/Icon16/breadcrumb_select_current.png b/asset/icon/Icon16/breadcrumb_select_current.png new file mode 100644 index 0000000..ddbc8ef Binary files /dev/null and b/asset/icon/Icon16/breadcrumb_select_current.png differ diff --git a/asset/icon/Icon16/breadcrumb_select_perrent.png b/asset/icon/Icon16/breadcrumb_select_perrent.png new file mode 100644 index 0000000..d56be18 Binary files /dev/null and b/asset/icon/Icon16/breadcrumb_select_perrent.png differ diff --git a/asset/icon/Icon16/breeze.png b/asset/icon/Icon16/breeze.png new file mode 100644 index 0000000..25afa72 Binary files /dev/null and b/asset/icon/Icon16/breeze.png differ diff --git a/asset/icon/Icon16/brick.png b/asset/icon/Icon16/brick.png new file mode 100644 index 0000000..d69e9f7 Binary files /dev/null and b/asset/icon/Icon16/brick.png differ diff --git a/asset/icon/Icon16/brick_add.png b/asset/icon/Icon16/brick_add.png new file mode 100644 index 0000000..8ba7c3b Binary files /dev/null and b/asset/icon/Icon16/brick_add.png differ diff --git a/asset/icon/Icon16/brick_delete.png b/asset/icon/Icon16/brick_delete.png new file mode 100644 index 0000000..47662c2 Binary files /dev/null and b/asset/icon/Icon16/brick_delete.png differ diff --git a/asset/icon/Icon16/brick_edit.png b/asset/icon/Icon16/brick_edit.png new file mode 100644 index 0000000..a14b00a Binary files /dev/null and b/asset/icon/Icon16/brick_edit.png differ diff --git a/asset/icon/Icon16/brick_error.png b/asset/icon/Icon16/brick_error.png new file mode 100644 index 0000000..5694947 Binary files /dev/null and b/asset/icon/Icon16/brick_error.png differ diff --git a/asset/icon/Icon16/brick_go.png b/asset/icon/Icon16/brick_go.png new file mode 100644 index 0000000..4ac1823 Binary files /dev/null and b/asset/icon/Icon16/brick_go.png differ diff --git a/asset/icon/Icon16/brick_link.png b/asset/icon/Icon16/brick_link.png new file mode 100644 index 0000000..34d0f47 Binary files /dev/null and b/asset/icon/Icon16/brick_link.png differ diff --git a/asset/icon/Icon16/bricks.png b/asset/icon/Icon16/bricks.png new file mode 100644 index 0000000..c7d1ee0 Binary files /dev/null and b/asset/icon/Icon16/bricks.png differ diff --git a/asset/icon/Icon16/briefcase.png b/asset/icon/Icon16/briefcase.png new file mode 100644 index 0000000..1dfbb6b Binary files /dev/null and b/asset/icon/Icon16/briefcase.png differ diff --git a/asset/icon/Icon16/brightkite.png b/asset/icon/Icon16/brightkite.png new file mode 100644 index 0000000..03975a8 Binary files /dev/null and b/asset/icon/Icon16/brightkite.png differ diff --git a/asset/icon/Icon16/broadcast_slide_show.png b/asset/icon/Icon16/broadcast_slide_show.png new file mode 100644 index 0000000..5af47d9 Binary files /dev/null and b/asset/icon/Icon16/broadcast_slide_show.png differ diff --git a/asset/icon/Icon16/broom.png b/asset/icon/Icon16/broom.png new file mode 100644 index 0000000..5ca8dba Binary files /dev/null and b/asset/icon/Icon16/broom.png differ diff --git a/asset/icon/Icon16/brushes.png b/asset/icon/Icon16/brushes.png new file mode 100644 index 0000000..d1b7932 Binary files /dev/null and b/asset/icon/Icon16/brushes.png differ diff --git a/asset/icon/Icon16/bubblechart.png b/asset/icon/Icon16/bubblechart.png new file mode 100644 index 0000000..832a1da Binary files /dev/null and b/asset/icon/Icon16/bubblechart.png differ diff --git a/asset/icon/Icon16/bucket_truck.png b/asset/icon/Icon16/bucket_truck.png new file mode 100644 index 0000000..a56a3af Binary files /dev/null and b/asset/icon/Icon16/bucket_truck.png differ diff --git a/asset/icon/Icon16/bug.png b/asset/icon/Icon16/bug.png new file mode 100644 index 0000000..c7299fd Binary files /dev/null and b/asset/icon/Icon16/bug.png differ diff --git a/asset/icon/Icon16/bug_add.png b/asset/icon/Icon16/bug_add.png new file mode 100644 index 0000000..e8d9959 Binary files /dev/null and b/asset/icon/Icon16/bug_add.png differ diff --git a/asset/icon/Icon16/bug_delete.png b/asset/icon/Icon16/bug_delete.png new file mode 100644 index 0000000..06a9049 Binary files /dev/null and b/asset/icon/Icon16/bug_delete.png differ diff --git a/asset/icon/Icon16/bug_edit.png b/asset/icon/Icon16/bug_edit.png new file mode 100644 index 0000000..808773e Binary files /dev/null and b/asset/icon/Icon16/bug_edit.png differ diff --git a/asset/icon/Icon16/bug_error.png b/asset/icon/Icon16/bug_error.png new file mode 100644 index 0000000..b47f35f Binary files /dev/null and b/asset/icon/Icon16/bug_error.png differ diff --git a/asset/icon/Icon16/bug_go.png b/asset/icon/Icon16/bug_go.png new file mode 100644 index 0000000..03e5eb2 Binary files /dev/null and b/asset/icon/Icon16/bug_go.png differ diff --git a/asset/icon/Icon16/bug_link.png b/asset/icon/Icon16/bug_link.png new file mode 100644 index 0000000..27faa96 Binary files /dev/null and b/asset/icon/Icon16/bug_link.png differ diff --git a/asset/icon/Icon16/building.png b/asset/icon/Icon16/building.png new file mode 100644 index 0000000..6646b81 Binary files /dev/null and b/asset/icon/Icon16/building.png differ diff --git a/asset/icon/Icon16/building_add.png b/asset/icon/Icon16/building_add.png new file mode 100644 index 0000000..605c3e8 Binary files /dev/null and b/asset/icon/Icon16/building_add.png differ diff --git a/asset/icon/Icon16/building_delete.png b/asset/icon/Icon16/building_delete.png new file mode 100644 index 0000000..e79d395 Binary files /dev/null and b/asset/icon/Icon16/building_delete.png differ diff --git a/asset/icon/Icon16/building_edit.png b/asset/icon/Icon16/building_edit.png new file mode 100644 index 0000000..ac5d8f6 Binary files /dev/null and b/asset/icon/Icon16/building_edit.png differ diff --git a/asset/icon/Icon16/building_error.png b/asset/icon/Icon16/building_error.png new file mode 100644 index 0000000..a885126 Binary files /dev/null and b/asset/icon/Icon16/building_error.png differ diff --git a/asset/icon/Icon16/building_go.png b/asset/icon/Icon16/building_go.png new file mode 100644 index 0000000..c48b089 Binary files /dev/null and b/asset/icon/Icon16/building_go.png differ diff --git a/asset/icon/Icon16/building_key.png b/asset/icon/Icon16/building_key.png new file mode 100644 index 0000000..e0385e6 Binary files /dev/null and b/asset/icon/Icon16/building_key.png differ diff --git a/asset/icon/Icon16/building_link.png b/asset/icon/Icon16/building_link.png new file mode 100644 index 0000000..86f80e9 Binary files /dev/null and b/asset/icon/Icon16/building_link.png differ diff --git a/asset/icon/Icon16/bulb.png b/asset/icon/Icon16/bulb.png new file mode 100644 index 0000000..8e4833e Binary files /dev/null and b/asset/icon/Icon16/bulb.png differ diff --git a/asset/icon/Icon16/bullet_add.png b/asset/icon/Icon16/bullet_add.png new file mode 100644 index 0000000..6c73649 Binary files /dev/null and b/asset/icon/Icon16/bullet_add.png differ diff --git a/asset/icon/Icon16/bullet_archive.png b/asset/icon/Icon16/bullet_archive.png new file mode 100644 index 0000000..3b848e4 Binary files /dev/null and b/asset/icon/Icon16/bullet_archive.png differ diff --git a/asset/icon/Icon16/bullet_arrow_bottom.png b/asset/icon/Icon16/bullet_arrow_bottom.png new file mode 100644 index 0000000..a8fa340 Binary files /dev/null and b/asset/icon/Icon16/bullet_arrow_bottom.png differ diff --git a/asset/icon/Icon16/bullet_arrow_down.png b/asset/icon/Icon16/bullet_arrow_down.png new file mode 100644 index 0000000..bd140b7 Binary files /dev/null and b/asset/icon/Icon16/bullet_arrow_down.png differ diff --git a/asset/icon/Icon16/bullet_arrow_left.png b/asset/icon/Icon16/bullet_arrow_left.png new file mode 100644 index 0000000..6974836 Binary files /dev/null and b/asset/icon/Icon16/bullet_arrow_left.png differ diff --git a/asset/icon/Icon16/bullet_arrow_left_2.png b/asset/icon/Icon16/bullet_arrow_left_2.png new file mode 100644 index 0000000..a63375e Binary files /dev/null and b/asset/icon/Icon16/bullet_arrow_left_2.png differ diff --git a/asset/icon/Icon16/bullet_arrow_right.png b/asset/icon/Icon16/bullet_arrow_right.png new file mode 100644 index 0000000..2ebd254 Binary files /dev/null and b/asset/icon/Icon16/bullet_arrow_right.png differ diff --git a/asset/icon/Icon16/bullet_arrow_right_2.png b/asset/icon/Icon16/bullet_arrow_right_2.png new file mode 100644 index 0000000..9a12619 Binary files /dev/null and b/asset/icon/Icon16/bullet_arrow_right_2.png differ diff --git a/asset/icon/Icon16/bullet_arrow_top.png b/asset/icon/Icon16/bullet_arrow_top.png new file mode 100644 index 0000000..3390a8e Binary files /dev/null and b/asset/icon/Icon16/bullet_arrow_top.png differ diff --git a/asset/icon/Icon16/bullet_arrow_up.png b/asset/icon/Icon16/bullet_arrow_up.png new file mode 100644 index 0000000..7f6162e Binary files /dev/null and b/asset/icon/Icon16/bullet_arrow_up.png differ diff --git a/asset/icon/Icon16/bullet_attach.png b/asset/icon/Icon16/bullet_attach.png new file mode 100644 index 0000000..e31d369 Binary files /dev/null and b/asset/icon/Icon16/bullet_attach.png differ diff --git a/asset/icon/Icon16/bullet_back.png b/asset/icon/Icon16/bullet_back.png new file mode 100644 index 0000000..a77a79b Binary files /dev/null and b/asset/icon/Icon16/bullet_back.png differ diff --git a/asset/icon/Icon16/bullet_bell.png b/asset/icon/Icon16/bullet_bell.png new file mode 100644 index 0000000..e367141 Binary files /dev/null and b/asset/icon/Icon16/bullet_bell.png differ diff --git a/asset/icon/Icon16/bullet_black.png b/asset/icon/Icon16/bullet_black.png new file mode 100644 index 0000000..29be567 Binary files /dev/null and b/asset/icon/Icon16/bullet_black.png differ diff --git a/asset/icon/Icon16/bullet_blue.png b/asset/icon/Icon16/bullet_blue.png new file mode 100644 index 0000000..b9c8e02 Binary files /dev/null and b/asset/icon/Icon16/bullet_blue.png differ diff --git a/asset/icon/Icon16/bullet_brush.png b/asset/icon/Icon16/bullet_brush.png new file mode 100644 index 0000000..c674511 Binary files /dev/null and b/asset/icon/Icon16/bullet_brush.png differ diff --git a/asset/icon/Icon16/bullet_bug.png b/asset/icon/Icon16/bullet_bug.png new file mode 100644 index 0000000..6191d6f Binary files /dev/null and b/asset/icon/Icon16/bullet_bug.png differ diff --git a/asset/icon/Icon16/bullet_bulb_off.png b/asset/icon/Icon16/bullet_bulb_off.png new file mode 100644 index 0000000..7978b46 Binary files /dev/null and b/asset/icon/Icon16/bullet_bulb_off.png differ diff --git a/asset/icon/Icon16/bullet_bulb_on.png b/asset/icon/Icon16/bullet_bulb_on.png new file mode 100644 index 0000000..4369cef Binary files /dev/null and b/asset/icon/Icon16/bullet_bulb_on.png differ diff --git a/asset/icon/Icon16/bullet_burn.png b/asset/icon/Icon16/bullet_burn.png new file mode 100644 index 0000000..312fa00 Binary files /dev/null and b/asset/icon/Icon16/bullet_burn.png differ diff --git a/asset/icon/Icon16/bullet_camera.png b/asset/icon/Icon16/bullet_camera.png new file mode 100644 index 0000000..e44c003 Binary files /dev/null and b/asset/icon/Icon16/bullet_camera.png differ diff --git a/asset/icon/Icon16/bullet_cd.png b/asset/icon/Icon16/bullet_cd.png new file mode 100644 index 0000000..41498fb Binary files /dev/null and b/asset/icon/Icon16/bullet_cd.png differ diff --git a/asset/icon/Icon16/bullet_chart.png b/asset/icon/Icon16/bullet_chart.png new file mode 100644 index 0000000..2cadc0b Binary files /dev/null and b/asset/icon/Icon16/bullet_chart.png differ diff --git a/asset/icon/Icon16/bullet_code.png b/asset/icon/Icon16/bullet_code.png new file mode 100644 index 0000000..c44b3cb Binary files /dev/null and b/asset/icon/Icon16/bullet_code.png differ diff --git a/asset/icon/Icon16/bullet_code_red.png b/asset/icon/Icon16/bullet_code_red.png new file mode 100644 index 0000000..f4e27a9 Binary files /dev/null and b/asset/icon/Icon16/bullet_code_red.png differ diff --git a/asset/icon/Icon16/bullet_connect.png b/asset/icon/Icon16/bullet_connect.png new file mode 100644 index 0000000..e9bb2d4 Binary files /dev/null and b/asset/icon/Icon16/bullet_connect.png differ diff --git a/asset/icon/Icon16/bullet_database.png b/asset/icon/Icon16/bullet_database.png new file mode 100644 index 0000000..c758ed4 Binary files /dev/null and b/asset/icon/Icon16/bullet_database.png differ diff --git a/asset/icon/Icon16/bullet_delete.png b/asset/icon/Icon16/bullet_delete.png new file mode 100644 index 0000000..7736d69 Binary files /dev/null and b/asset/icon/Icon16/bullet_delete.png differ diff --git a/asset/icon/Icon16/bullet_disk.png b/asset/icon/Icon16/bullet_disk.png new file mode 100644 index 0000000..9a4c5e2 Binary files /dev/null and b/asset/icon/Icon16/bullet_disk.png differ diff --git a/asset/icon/Icon16/bullet_document.png b/asset/icon/Icon16/bullet_document.png new file mode 100644 index 0000000..f83091f Binary files /dev/null and b/asset/icon/Icon16/bullet_document.png differ diff --git a/asset/icon/Icon16/bullet_down.png b/asset/icon/Icon16/bullet_down.png new file mode 100644 index 0000000..83c13f5 Binary files /dev/null and b/asset/icon/Icon16/bullet_down.png differ diff --git a/asset/icon/Icon16/bullet_dvd.png b/asset/icon/Icon16/bullet_dvd.png new file mode 100644 index 0000000..ae52739 Binary files /dev/null and b/asset/icon/Icon16/bullet_dvd.png differ diff --git a/asset/icon/Icon16/bullet_edit.png b/asset/icon/Icon16/bullet_edit.png new file mode 100644 index 0000000..bca3433 Binary files /dev/null and b/asset/icon/Icon16/bullet_edit.png differ diff --git a/asset/icon/Icon16/bullet_error.png b/asset/icon/Icon16/bullet_error.png new file mode 100644 index 0000000..b2e6b75 Binary files /dev/null and b/asset/icon/Icon16/bullet_error.png differ diff --git a/asset/icon/Icon16/bullet_excel.png b/asset/icon/Icon16/bullet_excel.png new file mode 100644 index 0000000..26f3b14 Binary files /dev/null and b/asset/icon/Icon16/bullet_excel.png differ diff --git a/asset/icon/Icon16/bullet_feed.png b/asset/icon/Icon16/bullet_feed.png new file mode 100644 index 0000000..c6e5f24 Binary files /dev/null and b/asset/icon/Icon16/bullet_feed.png differ diff --git a/asset/icon/Icon16/bullet_find.png b/asset/icon/Icon16/bullet_find.png new file mode 100644 index 0000000..b7c44d6 Binary files /dev/null and b/asset/icon/Icon16/bullet_find.png differ diff --git a/asset/icon/Icon16/bullet_flash.png b/asset/icon/Icon16/bullet_flash.png new file mode 100644 index 0000000..322d834 Binary files /dev/null and b/asset/icon/Icon16/bullet_flash.png differ diff --git a/asset/icon/Icon16/bullet_gear.png b/asset/icon/Icon16/bullet_gear.png new file mode 100644 index 0000000..f61760a Binary files /dev/null and b/asset/icon/Icon16/bullet_gear.png differ diff --git a/asset/icon/Icon16/bullet_go.png b/asset/icon/Icon16/bullet_go.png new file mode 100644 index 0000000..bbf906f Binary files /dev/null and b/asset/icon/Icon16/bullet_go.png differ diff --git a/asset/icon/Icon16/bullet_green.png b/asset/icon/Icon16/bullet_green.png new file mode 100644 index 0000000..3e89eb1 Binary files /dev/null and b/asset/icon/Icon16/bullet_green.png differ diff --git a/asset/icon/Icon16/bullet_key.png b/asset/icon/Icon16/bullet_key.png new file mode 100644 index 0000000..6260013 Binary files /dev/null and b/asset/icon/Icon16/bullet_key.png differ diff --git a/asset/icon/Icon16/bullet_lightning.png b/asset/icon/Icon16/bullet_lightning.png new file mode 100644 index 0000000..12c8d73 Binary files /dev/null and b/asset/icon/Icon16/bullet_lightning.png differ diff --git a/asset/icon/Icon16/bullet_link.png b/asset/icon/Icon16/bullet_link.png new file mode 100644 index 0000000..b5ce184 Binary files /dev/null and b/asset/icon/Icon16/bullet_link.png differ diff --git a/asset/icon/Icon16/bullet_magnify.png b/asset/icon/Icon16/bullet_magnify.png new file mode 100644 index 0000000..d534795 Binary files /dev/null and b/asset/icon/Icon16/bullet_magnify.png differ diff --git a/asset/icon/Icon16/bullet_medal.png b/asset/icon/Icon16/bullet_medal.png new file mode 100644 index 0000000..c5bdc53 Binary files /dev/null and b/asset/icon/Icon16/bullet_medal.png differ diff --git a/asset/icon/Icon16/bullet_office.png b/asset/icon/Icon16/bullet_office.png new file mode 100644 index 0000000..a3523e9 Binary files /dev/null and b/asset/icon/Icon16/bullet_office.png differ diff --git a/asset/icon/Icon16/bullet_orange.png b/asset/icon/Icon16/bullet_orange.png new file mode 100644 index 0000000..456774e Binary files /dev/null and b/asset/icon/Icon16/bullet_orange.png differ diff --git a/asset/icon/Icon16/bullet_palette.png b/asset/icon/Icon16/bullet_palette.png new file mode 100644 index 0000000..ea201c1 Binary files /dev/null and b/asset/icon/Icon16/bullet_palette.png differ diff --git a/asset/icon/Icon16/bullet_php.png b/asset/icon/Icon16/bullet_php.png new file mode 100644 index 0000000..f579c8c Binary files /dev/null and b/asset/icon/Icon16/bullet_php.png differ diff --git a/asset/icon/Icon16/bullet_picture.png b/asset/icon/Icon16/bullet_picture.png new file mode 100644 index 0000000..3a2cd6d Binary files /dev/null and b/asset/icon/Icon16/bullet_picture.png differ diff --git a/asset/icon/Icon16/bullet_pink.png b/asset/icon/Icon16/bullet_pink.png new file mode 100644 index 0000000..d4e688c Binary files /dev/null and b/asset/icon/Icon16/bullet_pink.png differ diff --git a/asset/icon/Icon16/bullet_powerpoint.png b/asset/icon/Icon16/bullet_powerpoint.png new file mode 100644 index 0000000..25fa4f8 Binary files /dev/null and b/asset/icon/Icon16/bullet_powerpoint.png differ diff --git a/asset/icon/Icon16/bullet_purple.png b/asset/icon/Icon16/bullet_purple.png new file mode 100644 index 0000000..5d75adf Binary files /dev/null and b/asset/icon/Icon16/bullet_purple.png differ diff --git a/asset/icon/Icon16/bullet_red.png b/asset/icon/Icon16/bullet_red.png new file mode 100644 index 0000000..6d2d08f Binary files /dev/null and b/asset/icon/Icon16/bullet_red.png differ diff --git a/asset/icon/Icon16/bullet_star.png b/asset/icon/Icon16/bullet_star.png new file mode 100644 index 0000000..44225c9 Binary files /dev/null and b/asset/icon/Icon16/bullet_star.png differ diff --git a/asset/icon/Icon16/bullet_table.png b/asset/icon/Icon16/bullet_table.png new file mode 100644 index 0000000..623e4b0 Binary files /dev/null and b/asset/icon/Icon16/bullet_table.png differ diff --git a/asset/icon/Icon16/bullet_textfield.png b/asset/icon/Icon16/bullet_textfield.png new file mode 100644 index 0000000..2c8d890 Binary files /dev/null and b/asset/icon/Icon16/bullet_textfield.png differ diff --git a/asset/icon/Icon16/bullet_toggle_minus.png b/asset/icon/Icon16/bullet_toggle_minus.png new file mode 100644 index 0000000..5112059 Binary files /dev/null and b/asset/icon/Icon16/bullet_toggle_minus.png differ diff --git a/asset/icon/Icon16/bullet_toggle_plus.png b/asset/icon/Icon16/bullet_toggle_plus.png new file mode 100644 index 0000000..22b72da Binary files /dev/null and b/asset/icon/Icon16/bullet_toggle_plus.png differ diff --git a/asset/icon/Icon16/bullet_up.png b/asset/icon/Icon16/bullet_up.png new file mode 100644 index 0000000..760d796 Binary files /dev/null and b/asset/icon/Icon16/bullet_up.png differ diff --git a/asset/icon/Icon16/bullet_user.png b/asset/icon/Icon16/bullet_user.png new file mode 100644 index 0000000..952a43a Binary files /dev/null and b/asset/icon/Icon16/bullet_user.png differ diff --git a/asset/icon/Icon16/bullet_valid.png b/asset/icon/Icon16/bullet_valid.png new file mode 100644 index 0000000..5644ac5 Binary files /dev/null and b/asset/icon/Icon16/bullet_valid.png differ diff --git a/asset/icon/Icon16/bullet_vector.png b/asset/icon/Icon16/bullet_vector.png new file mode 100644 index 0000000..bcb19c7 Binary files /dev/null and b/asset/icon/Icon16/bullet_vector.png differ diff --git a/asset/icon/Icon16/bullet_white.png b/asset/icon/Icon16/bullet_white.png new file mode 100644 index 0000000..5c63873 Binary files /dev/null and b/asset/icon/Icon16/bullet_white.png differ diff --git a/asset/icon/Icon16/bullet_word.png b/asset/icon/Icon16/bullet_word.png new file mode 100644 index 0000000..ac06242 Binary files /dev/null and b/asset/icon/Icon16/bullet_word.png differ diff --git a/asset/icon/Icon16/bullet_world.png b/asset/icon/Icon16/bullet_world.png new file mode 100644 index 0000000..28cedb7 Binary files /dev/null and b/asset/icon/Icon16/bullet_world.png differ diff --git a/asset/icon/Icon16/bullet_wrench.png b/asset/icon/Icon16/bullet_wrench.png new file mode 100644 index 0000000..8eba35c Binary files /dev/null and b/asset/icon/Icon16/bullet_wrench.png differ diff --git a/asset/icon/Icon16/bullet_yellow.png b/asset/icon/Icon16/bullet_yellow.png new file mode 100644 index 0000000..a0bb7e5 Binary files /dev/null and b/asset/icon/Icon16/bullet_yellow.png differ diff --git a/asset/icon/Icon16/burro.png b/asset/icon/Icon16/burro.png new file mode 100644 index 0000000..97162e2 Binary files /dev/null and b/asset/icon/Icon16/burro.png differ diff --git a/asset/icon/Icon16/bus.png b/asset/icon/Icon16/bus.png new file mode 100644 index 0000000..215d246 Binary files /dev/null and b/asset/icon/Icon16/bus.png differ diff --git a/asset/icon/Icon16/butterfly.png b/asset/icon/Icon16/butterfly.png new file mode 100644 index 0000000..a89a0fd Binary files /dev/null and b/asset/icon/Icon16/butterfly.png differ diff --git a/asset/icon/Icon16/button.png b/asset/icon/Icon16/button.png new file mode 100644 index 0000000..77660fb Binary files /dev/null and b/asset/icon/Icon16/button.png differ diff --git a/asset/icon/Icon16/button_default.png b/asset/icon/Icon16/button_default.png new file mode 100644 index 0000000..47c761c Binary files /dev/null and b/asset/icon/Icon16/button_default.png differ diff --git a/asset/icon/Icon16/button_navigation.png b/asset/icon/Icon16/button_navigation.png new file mode 100644 index 0000000..b06d301 Binary files /dev/null and b/asset/icon/Icon16/button_navigation.png differ diff --git a/asset/icon/Icon16/button_navigation_back.png b/asset/icon/Icon16/button_navigation_back.png new file mode 100644 index 0000000..0688df5 Binary files /dev/null and b/asset/icon/Icon16/button_navigation_back.png differ diff --git a/asset/icon/Icon16/button_picture.png b/asset/icon/Icon16/button_picture.png new file mode 100644 index 0000000..f85bca1 Binary files /dev/null and b/asset/icon/Icon16/button_picture.png differ diff --git a/asset/icon/Icon16/button_toggle.png b/asset/icon/Icon16/button_toggle.png new file mode 100644 index 0000000..776c671 Binary files /dev/null and b/asset/icon/Icon16/button_toggle.png differ diff --git a/asset/icon/Icon16/buttonbar.png b/asset/icon/Icon16/buttonbar.png new file mode 100644 index 0000000..d272d43 Binary files /dev/null and b/asset/icon/Icon16/buttonbar.png differ diff --git a/asset/icon/Icon16/buttons.png b/asset/icon/Icon16/buttons.png new file mode 100644 index 0000000..c5d34a6 Binary files /dev/null and b/asset/icon/Icon16/buttons.png differ diff --git a/asset/icon/Icon16/buzz.png b/asset/icon/Icon16/buzz.png new file mode 100644 index 0000000..38071d2 Binary files /dev/null and b/asset/icon/Icon16/buzz.png differ diff --git a/asset/icon/Icon16/cactus.png b/asset/icon/Icon16/cactus.png new file mode 100644 index 0000000..1f1d12e Binary files /dev/null and b/asset/icon/Icon16/cactus.png differ diff --git a/asset/icon/Icon16/cake.png b/asset/icon/Icon16/cake.png new file mode 100644 index 0000000..0e69b3f Binary files /dev/null and b/asset/icon/Icon16/cake.png differ diff --git a/asset/icon/Icon16/calculate_sheet.png b/asset/icon/Icon16/calculate_sheet.png new file mode 100644 index 0000000..53e3e6b Binary files /dev/null and b/asset/icon/Icon16/calculate_sheet.png differ diff --git a/asset/icon/Icon16/calculator.png b/asset/icon/Icon16/calculator.png new file mode 100644 index 0000000..005fdd1 Binary files /dev/null and b/asset/icon/Icon16/calculator.png differ diff --git a/asset/icon/Icon16/calculator_add.png b/asset/icon/Icon16/calculator_add.png new file mode 100644 index 0000000..3faee0a Binary files /dev/null and b/asset/icon/Icon16/calculator_add.png differ diff --git a/asset/icon/Icon16/calculator_black.png b/asset/icon/Icon16/calculator_black.png new file mode 100644 index 0000000..33e472f Binary files /dev/null and b/asset/icon/Icon16/calculator_black.png differ diff --git a/asset/icon/Icon16/calculator_delete.png b/asset/icon/Icon16/calculator_delete.png new file mode 100644 index 0000000..d3a51ac Binary files /dev/null and b/asset/icon/Icon16/calculator_delete.png differ diff --git a/asset/icon/Icon16/calculator_edit.png b/asset/icon/Icon16/calculator_edit.png new file mode 100644 index 0000000..4b5300c Binary files /dev/null and b/asset/icon/Icon16/calculator_edit.png differ diff --git a/asset/icon/Icon16/calculator_error.png b/asset/icon/Icon16/calculator_error.png new file mode 100644 index 0000000..9f099e9 Binary files /dev/null and b/asset/icon/Icon16/calculator_error.png differ diff --git a/asset/icon/Icon16/calculator_link.png b/asset/icon/Icon16/calculator_link.png new file mode 100644 index 0000000..c12c705 Binary files /dev/null and b/asset/icon/Icon16/calculator_link.png differ diff --git a/asset/icon/Icon16/calendar.png b/asset/icon/Icon16/calendar.png new file mode 100644 index 0000000..f404e21 Binary files /dev/null and b/asset/icon/Icon16/calendar.png differ diff --git a/asset/icon/Icon16/calendar_add.png b/asset/icon/Icon16/calendar_add.png new file mode 100644 index 0000000..b0e188a Binary files /dev/null and b/asset/icon/Icon16/calendar_add.png differ diff --git a/asset/icon/Icon16/calendar_copy.png b/asset/icon/Icon16/calendar_copy.png new file mode 100644 index 0000000..5f76841 Binary files /dev/null and b/asset/icon/Icon16/calendar_copy.png differ diff --git a/asset/icon/Icon16/calendar_delete.png b/asset/icon/Icon16/calendar_delete.png new file mode 100644 index 0000000..762a5af Binary files /dev/null and b/asset/icon/Icon16/calendar_delete.png differ diff --git a/asset/icon/Icon16/calendar_edit.png b/asset/icon/Icon16/calendar_edit.png new file mode 100644 index 0000000..31a2dfd Binary files /dev/null and b/asset/icon/Icon16/calendar_edit.png differ diff --git a/asset/icon/Icon16/calendar_link.png b/asset/icon/Icon16/calendar_link.png new file mode 100644 index 0000000..18cae73 Binary files /dev/null and b/asset/icon/Icon16/calendar_link.png differ diff --git a/asset/icon/Icon16/calendar_view_day.png b/asset/icon/Icon16/calendar_view_day.png new file mode 100644 index 0000000..8321924 Binary files /dev/null and b/asset/icon/Icon16/calendar_view_day.png differ diff --git a/asset/icon/Icon16/calendar_view_month.png b/asset/icon/Icon16/calendar_view_month.png new file mode 100644 index 0000000..babfcfa Binary files /dev/null and b/asset/icon/Icon16/calendar_view_month.png differ diff --git a/asset/icon/Icon16/calendar_view_week.png b/asset/icon/Icon16/calendar_view_week.png new file mode 100644 index 0000000..93c783d Binary files /dev/null and b/asset/icon/Icon16/calendar_view_week.png differ diff --git a/asset/icon/Icon16/camcorder.png b/asset/icon/Icon16/camcorder.png new file mode 100644 index 0000000..69498c1 Binary files /dev/null and b/asset/icon/Icon16/camcorder.png differ diff --git a/asset/icon/Icon16/camera.png b/asset/icon/Icon16/camera.png new file mode 100644 index 0000000..0a7ef90 Binary files /dev/null and b/asset/icon/Icon16/camera.png differ diff --git a/asset/icon/Icon16/camera_add.png b/asset/icon/Icon16/camera_add.png new file mode 100644 index 0000000..e2527c5 Binary files /dev/null and b/asset/icon/Icon16/camera_add.png differ diff --git a/asset/icon/Icon16/camera_black.png b/asset/icon/Icon16/camera_black.png new file mode 100644 index 0000000..6547734 Binary files /dev/null and b/asset/icon/Icon16/camera_black.png differ diff --git a/asset/icon/Icon16/camera_delete.png b/asset/icon/Icon16/camera_delete.png new file mode 100644 index 0000000..db98e6d Binary files /dev/null and b/asset/icon/Icon16/camera_delete.png differ diff --git a/asset/icon/Icon16/camera_edit.png b/asset/icon/Icon16/camera_edit.png new file mode 100644 index 0000000..1733be6 Binary files /dev/null and b/asset/icon/Icon16/camera_edit.png differ diff --git a/asset/icon/Icon16/camera_error.png b/asset/icon/Icon16/camera_error.png new file mode 100644 index 0000000..2098f55 Binary files /dev/null and b/asset/icon/Icon16/camera_error.png differ diff --git a/asset/icon/Icon16/camera_go.png b/asset/icon/Icon16/camera_go.png new file mode 100644 index 0000000..5fe3a2e Binary files /dev/null and b/asset/icon/Icon16/camera_go.png differ diff --git a/asset/icon/Icon16/camera_lens.png b/asset/icon/Icon16/camera_lens.png new file mode 100644 index 0000000..3f11b6a Binary files /dev/null and b/asset/icon/Icon16/camera_lens.png differ diff --git a/asset/icon/Icon16/camera_link.png b/asset/icon/Icon16/camera_link.png new file mode 100644 index 0000000..314106b Binary files /dev/null and b/asset/icon/Icon16/camera_link.png differ diff --git a/asset/icon/Icon16/camera_small.png b/asset/icon/Icon16/camera_small.png new file mode 100644 index 0000000..43bfcc1 Binary files /dev/null and b/asset/icon/Icon16/camera_small.png differ diff --git a/asset/icon/Icon16/cancel.png b/asset/icon/Icon16/cancel.png new file mode 100644 index 0000000..33c876b Binary files /dev/null and b/asset/icon/Icon16/cancel.png differ diff --git a/asset/icon/Icon16/candle.png b/asset/icon/Icon16/candle.png new file mode 100644 index 0000000..8cfb101 Binary files /dev/null and b/asset/icon/Icon16/candle.png differ diff --git a/asset/icon/Icon16/candle_2.png b/asset/icon/Icon16/candle_2.png new file mode 100644 index 0000000..113b0b2 Binary files /dev/null and b/asset/icon/Icon16/candle_2.png differ diff --git a/asset/icon/Icon16/candlestickchart.png b/asset/icon/Icon16/candlestickchart.png new file mode 100644 index 0000000..3f02301 Binary files /dev/null and b/asset/icon/Icon16/candlestickchart.png differ diff --git a/asset/icon/Icon16/candy_cane.png b/asset/icon/Icon16/candy_cane.png new file mode 100644 index 0000000..8780d8e Binary files /dev/null and b/asset/icon/Icon16/candy_cane.png differ diff --git a/asset/icon/Icon16/canvas.png b/asset/icon/Icon16/canvas.png new file mode 100644 index 0000000..1853f44 Binary files /dev/null and b/asset/icon/Icon16/canvas.png differ diff --git a/asset/icon/Icon16/canvas_size.png b/asset/icon/Icon16/canvas_size.png new file mode 100644 index 0000000..8049575 Binary files /dev/null and b/asset/icon/Icon16/canvas_size.png differ diff --git a/asset/icon/Icon16/cap.png b/asset/icon/Icon16/cap.png new file mode 100644 index 0000000..565a937 Binary files /dev/null and b/asset/icon/Icon16/cap.png differ diff --git a/asset/icon/Icon16/capitalization.png b/asset/icon/Icon16/capitalization.png new file mode 100644 index 0000000..4b3f39e Binary files /dev/null and b/asset/icon/Icon16/capitalization.png differ diff --git a/asset/icon/Icon16/car.png b/asset/icon/Icon16/car.png new file mode 100644 index 0000000..af76be3 Binary files /dev/null and b/asset/icon/Icon16/car.png differ diff --git a/asset/icon/Icon16/car_add.png b/asset/icon/Icon16/car_add.png new file mode 100644 index 0000000..5a522b3 Binary files /dev/null and b/asset/icon/Icon16/car_add.png differ diff --git a/asset/icon/Icon16/car_delete.png b/asset/icon/Icon16/car_delete.png new file mode 100644 index 0000000..169cbce Binary files /dev/null and b/asset/icon/Icon16/car_delete.png differ diff --git a/asset/icon/Icon16/car_taxi.png b/asset/icon/Icon16/car_taxi.png new file mode 100644 index 0000000..58fe77e Binary files /dev/null and b/asset/icon/Icon16/car_taxi.png differ diff --git a/asset/icon/Icon16/card_amazon.png b/asset/icon/Icon16/card_amazon.png new file mode 100644 index 0000000..b44fd61 Binary files /dev/null and b/asset/icon/Icon16/card_amazon.png differ diff --git a/asset/icon/Icon16/card_amex_gold.png b/asset/icon/Icon16/card_amex_gold.png new file mode 100644 index 0000000..4807ca1 Binary files /dev/null and b/asset/icon/Icon16/card_amex_gold.png differ diff --git a/asset/icon/Icon16/card_amex_gray.png b/asset/icon/Icon16/card_amex_gray.png new file mode 100644 index 0000000..a05eb36 Binary files /dev/null and b/asset/icon/Icon16/card_amex_gray.png differ diff --git a/asset/icon/Icon16/card_amex_green.png b/asset/icon/Icon16/card_amex_green.png new file mode 100644 index 0000000..4b75bd5 Binary files /dev/null and b/asset/icon/Icon16/card_amex_green.png differ diff --git a/asset/icon/Icon16/card_apple.png b/asset/icon/Icon16/card_apple.png new file mode 100644 index 0000000..9df57c1 Binary files /dev/null and b/asset/icon/Icon16/card_apple.png differ diff --git a/asset/icon/Icon16/card_back.png b/asset/icon/Icon16/card_back.png new file mode 100644 index 0000000..e23548a Binary files /dev/null and b/asset/icon/Icon16/card_back.png differ diff --git a/asset/icon/Icon16/card_bank.png b/asset/icon/Icon16/card_bank.png new file mode 100644 index 0000000..49503a1 Binary files /dev/null and b/asset/icon/Icon16/card_bank.png differ diff --git a/asset/icon/Icon16/card_chase.png b/asset/icon/Icon16/card_chase.png new file mode 100644 index 0000000..e46fa8c Binary files /dev/null and b/asset/icon/Icon16/card_chase.png differ diff --git a/asset/icon/Icon16/card_chip_gold.png b/asset/icon/Icon16/card_chip_gold.png new file mode 100644 index 0000000..37036ed Binary files /dev/null and b/asset/icon/Icon16/card_chip_gold.png differ diff --git a/asset/icon/Icon16/card_chip_silver.png b/asset/icon/Icon16/card_chip_silver.png new file mode 100644 index 0000000..f61642d Binary files /dev/null and b/asset/icon/Icon16/card_chip_silver.png differ diff --git a/asset/icon/Icon16/card_credit.png b/asset/icon/Icon16/card_credit.png new file mode 100644 index 0000000..cc9d962 Binary files /dev/null and b/asset/icon/Icon16/card_credit.png differ diff --git a/asset/icon/Icon16/card_debit.png b/asset/icon/Icon16/card_debit.png new file mode 100644 index 0000000..77e9e40 Binary files /dev/null and b/asset/icon/Icon16/card_debit.png differ diff --git a/asset/icon/Icon16/card_discover_black.png b/asset/icon/Icon16/card_discover_black.png new file mode 100644 index 0000000..6ee7c9d Binary files /dev/null and b/asset/icon/Icon16/card_discover_black.png differ diff --git a/asset/icon/Icon16/card_discover_novus.png b/asset/icon/Icon16/card_discover_novus.png new file mode 100644 index 0000000..b0ff869 Binary files /dev/null and b/asset/icon/Icon16/card_discover_novus.png differ diff --git a/asset/icon/Icon16/card_echeck.png b/asset/icon/Icon16/card_echeck.png new file mode 100644 index 0000000..8712439 Binary files /dev/null and b/asset/icon/Icon16/card_echeck.png differ diff --git a/asset/icon/Icon16/card_export.png b/asset/icon/Icon16/card_export.png new file mode 100644 index 0000000..a74f95b Binary files /dev/null and b/asset/icon/Icon16/card_export.png differ diff --git a/asset/icon/Icon16/card_front.png b/asset/icon/Icon16/card_front.png new file mode 100644 index 0000000..a07441f Binary files /dev/null and b/asset/icon/Icon16/card_front.png differ diff --git a/asset/icon/Icon16/card_gift.png b/asset/icon/Icon16/card_gift.png new file mode 100644 index 0000000..89137bb Binary files /dev/null and b/asset/icon/Icon16/card_gift.png differ diff --git a/asset/icon/Icon16/card_gift_2.png b/asset/icon/Icon16/card_gift_2.png new file mode 100644 index 0000000..14ae61c Binary files /dev/null and b/asset/icon/Icon16/card_gift_2.png differ diff --git a/asset/icon/Icon16/card_gold.png b/asset/icon/Icon16/card_gold.png new file mode 100644 index 0000000..9d9d144 Binary files /dev/null and b/asset/icon/Icon16/card_gold.png differ diff --git a/asset/icon/Icon16/card_import.png b/asset/icon/Icon16/card_import.png new file mode 100644 index 0000000..c9b5a14 Binary files /dev/null and b/asset/icon/Icon16/card_import.png differ diff --git a/asset/icon/Icon16/card_ipod.png b/asset/icon/Icon16/card_ipod.png new file mode 100644 index 0000000..f9aab19 Binary files /dev/null and b/asset/icon/Icon16/card_ipod.png differ diff --git a/asset/icon/Icon16/card_miles.png b/asset/icon/Icon16/card_miles.png new file mode 100644 index 0000000..b4ce12f Binary files /dev/null and b/asset/icon/Icon16/card_miles.png differ diff --git a/asset/icon/Icon16/card_money.png b/asset/icon/Icon16/card_money.png new file mode 100644 index 0000000..0478a5d Binary files /dev/null and b/asset/icon/Icon16/card_money.png differ diff --git a/asset/icon/Icon16/card_sapphire.png b/asset/icon/Icon16/card_sapphire.png new file mode 100644 index 0000000..9ee7e98 Binary files /dev/null and b/asset/icon/Icon16/card_sapphire.png differ diff --git a/asset/icon/Icon16/card_save.png b/asset/icon/Icon16/card_save.png new file mode 100644 index 0000000..9d439b0 Binary files /dev/null and b/asset/icon/Icon16/card_save.png differ diff --git a/asset/icon/Icon16/card_solo.png b/asset/icon/Icon16/card_solo.png new file mode 100644 index 0000000..934d057 Binary files /dev/null and b/asset/icon/Icon16/card_solo.png differ diff --git a/asset/icon/Icon16/cards(2).png b/asset/icon/Icon16/cards(2).png new file mode 100644 index 0000000..5a93c14 Binary files /dev/null and b/asset/icon/Icon16/cards(2).png differ diff --git a/asset/icon/Icon16/cards.png b/asset/icon/Icon16/cards.png new file mode 100644 index 0000000..7400452 Binary files /dev/null and b/asset/icon/Icon16/cards.png differ diff --git a/asset/icon/Icon16/cards_bind_address.png b/asset/icon/Icon16/cards_bind_address.png new file mode 100644 index 0000000..3a28195 Binary files /dev/null and b/asset/icon/Icon16/cards_bind_address.png differ diff --git a/asset/icon/Icon16/cards_binds.png b/asset/icon/Icon16/cards_binds.png new file mode 100644 index 0000000..4780c2e Binary files /dev/null and b/asset/icon/Icon16/cards_binds.png differ diff --git a/asset/icon/Icon16/cargo.png b/asset/icon/Icon16/cargo.png new file mode 100644 index 0000000..be95f86 Binary files /dev/null and b/asset/icon/Icon16/cargo.png differ diff --git a/asset/icon/Icon16/cart.png b/asset/icon/Icon16/cart.png new file mode 100644 index 0000000..7242590 Binary files /dev/null and b/asset/icon/Icon16/cart.png differ diff --git a/asset/icon/Icon16/cart_add.png b/asset/icon/Icon16/cart_add.png new file mode 100644 index 0000000..81b2d4d Binary files /dev/null and b/asset/icon/Icon16/cart_add.png differ diff --git a/asset/icon/Icon16/cart_delete.png b/asset/icon/Icon16/cart_delete.png new file mode 100644 index 0000000..ffa3301 Binary files /dev/null and b/asset/icon/Icon16/cart_delete.png differ diff --git a/asset/icon/Icon16/cart_edit.png b/asset/icon/Icon16/cart_edit.png new file mode 100644 index 0000000..367d338 Binary files /dev/null and b/asset/icon/Icon16/cart_edit.png differ diff --git a/asset/icon/Icon16/cart_error.png b/asset/icon/Icon16/cart_error.png new file mode 100644 index 0000000..1f16369 Binary files /dev/null and b/asset/icon/Icon16/cart_error.png differ diff --git a/asset/icon/Icon16/cart_full.png b/asset/icon/Icon16/cart_full.png new file mode 100644 index 0000000..e174d4b Binary files /dev/null and b/asset/icon/Icon16/cart_full.png differ diff --git a/asset/icon/Icon16/cart_go.png b/asset/icon/Icon16/cart_go.png new file mode 100644 index 0000000..43f063a Binary files /dev/null and b/asset/icon/Icon16/cart_go.png differ diff --git a/asset/icon/Icon16/cart_put.png b/asset/icon/Icon16/cart_put.png new file mode 100644 index 0000000..76dffca Binary files /dev/null and b/asset/icon/Icon16/cart_put.png differ diff --git a/asset/icon/Icon16/cart_remove.png b/asset/icon/Icon16/cart_remove.png new file mode 100644 index 0000000..4bfe365 Binary files /dev/null and b/asset/icon/Icon16/cart_remove.png differ diff --git a/asset/icon/Icon16/cash_register.png b/asset/icon/Icon16/cash_register.png new file mode 100644 index 0000000..1365312 Binary files /dev/null and b/asset/icon/Icon16/cash_register.png differ diff --git a/asset/icon/Icon16/cash_register_2.png b/asset/icon/Icon16/cash_register_2.png new file mode 100644 index 0000000..f826b1b Binary files /dev/null and b/asset/icon/Icon16/cash_register_2.png differ diff --git a/asset/icon/Icon16/cash_stack.png b/asset/icon/Icon16/cash_stack.png new file mode 100644 index 0000000..2a54d4f Binary files /dev/null and b/asset/icon/Icon16/cash_stack.png differ diff --git a/asset/icon/Icon16/cash_terminal.png b/asset/icon/Icon16/cash_terminal.png new file mode 100644 index 0000000..5e13ea1 Binary files /dev/null and b/asset/icon/Icon16/cash_terminal.png differ diff --git a/asset/icon/Icon16/cat.png b/asset/icon/Icon16/cat.png new file mode 100644 index 0000000..035fcaa Binary files /dev/null and b/asset/icon/Icon16/cat.png differ diff --git a/asset/icon/Icon16/catalog_pages.png b/asset/icon/Icon16/catalog_pages.png new file mode 100644 index 0000000..3500342 Binary files /dev/null and b/asset/icon/Icon16/catalog_pages.png differ diff --git a/asset/icon/Icon16/categories.png b/asset/icon/Icon16/categories.png new file mode 100644 index 0000000..62833e7 Binary files /dev/null and b/asset/icon/Icon16/categories.png differ diff --git a/asset/icon/Icon16/category.png b/asset/icon/Icon16/category.png new file mode 100644 index 0000000..da05f93 Binary files /dev/null and b/asset/icon/Icon16/category.png differ diff --git a/asset/icon/Icon16/category_group.png b/asset/icon/Icon16/category_group.png new file mode 100644 index 0000000..120c0a3 Binary files /dev/null and b/asset/icon/Icon16/category_group.png differ diff --git a/asset/icon/Icon16/category_group_select.png b/asset/icon/Icon16/category_group_select.png new file mode 100644 index 0000000..07db998 Binary files /dev/null and b/asset/icon/Icon16/category_group_select.png differ diff --git a/asset/icon/Icon16/category_item.png b/asset/icon/Icon16/category_item.png new file mode 100644 index 0000000..ba1117b Binary files /dev/null and b/asset/icon/Icon16/category_item.png differ diff --git a/asset/icon/Icon16/category_item_select.png b/asset/icon/Icon16/category_item_select.png new file mode 100644 index 0000000..2853469 Binary files /dev/null and b/asset/icon/Icon16/category_item_select.png differ diff --git a/asset/icon/Icon16/caterpillar.png b/asset/icon/Icon16/caterpillar.png new file mode 100644 index 0000000..ed1a6f8 Binary files /dev/null and b/asset/icon/Icon16/caterpillar.png differ diff --git a/asset/icon/Icon16/cats_display.png b/asset/icon/Icon16/cats_display.png new file mode 100644 index 0000000..a9e040c Binary files /dev/null and b/asset/icon/Icon16/cats_display.png differ diff --git a/asset/icon/Icon16/caution_biohazard.png b/asset/icon/Icon16/caution_biohazard.png new file mode 100644 index 0000000..4f7f551 Binary files /dev/null and b/asset/icon/Icon16/caution_biohazard.png differ diff --git a/asset/icon/Icon16/caution_board.png b/asset/icon/Icon16/caution_board.png new file mode 100644 index 0000000..d087809 Binary files /dev/null and b/asset/icon/Icon16/caution_board.png differ diff --git a/asset/icon/Icon16/caution_high_voltage.png b/asset/icon/Icon16/caution_high_voltage.png new file mode 100644 index 0000000..3ead1a7 Binary files /dev/null and b/asset/icon/Icon16/caution_high_voltage.png differ diff --git a/asset/icon/Icon16/caution_radiation.png b/asset/icon/Icon16/caution_radiation.png new file mode 100644 index 0000000..f5362a7 Binary files /dev/null and b/asset/icon/Icon16/caution_radiation.png differ diff --git a/asset/icon/Icon16/cctv_camera.png b/asset/icon/Icon16/cctv_camera.png new file mode 100644 index 0000000..6bb760f Binary files /dev/null and b/asset/icon/Icon16/cctv_camera.png differ diff --git a/asset/icon/Icon16/cd.png b/asset/icon/Icon16/cd.png new file mode 100644 index 0000000..6afc04b Binary files /dev/null and b/asset/icon/Icon16/cd.png differ diff --git a/asset/icon/Icon16/cd_add.png b/asset/icon/Icon16/cd_add.png new file mode 100644 index 0000000..8500783 Binary files /dev/null and b/asset/icon/Icon16/cd_add.png differ diff --git a/asset/icon/Icon16/cd_burn.png b/asset/icon/Icon16/cd_burn.png new file mode 100644 index 0000000..738e88b Binary files /dev/null and b/asset/icon/Icon16/cd_burn.png differ diff --git a/asset/icon/Icon16/cd_case.png b/asset/icon/Icon16/cd_case.png new file mode 100644 index 0000000..fa938bc Binary files /dev/null and b/asset/icon/Icon16/cd_case.png differ diff --git a/asset/icon/Icon16/cd_case_empty.png b/asset/icon/Icon16/cd_case_empty.png new file mode 100644 index 0000000..36042df Binary files /dev/null and b/asset/icon/Icon16/cd_case_empty.png differ diff --git a/asset/icon/Icon16/cd_delete.png b/asset/icon/Icon16/cd_delete.png new file mode 100644 index 0000000..1595286 Binary files /dev/null and b/asset/icon/Icon16/cd_delete.png differ diff --git a/asset/icon/Icon16/cd_edit.png b/asset/icon/Icon16/cd_edit.png new file mode 100644 index 0000000..5aa93b0 Binary files /dev/null and b/asset/icon/Icon16/cd_edit.png differ diff --git a/asset/icon/Icon16/cd_eject.png b/asset/icon/Icon16/cd_eject.png new file mode 100644 index 0000000..f5a91d2 Binary files /dev/null and b/asset/icon/Icon16/cd_eject.png differ diff --git a/asset/icon/Icon16/cd_go.png b/asset/icon/Icon16/cd_go.png new file mode 100644 index 0000000..441aee2 Binary files /dev/null and b/asset/icon/Icon16/cd_go.png differ diff --git a/asset/icon/Icon16/cell_clear.png b/asset/icon/Icon16/cell_clear.png new file mode 100644 index 0000000..6e146d6 Binary files /dev/null and b/asset/icon/Icon16/cell_clear.png differ diff --git a/asset/icon/Icon16/cell_copy.png b/asset/icon/Icon16/cell_copy.png new file mode 100644 index 0000000..d72d2c2 Binary files /dev/null and b/asset/icon/Icon16/cell_copy.png differ diff --git a/asset/icon/Icon16/cell_delete.png b/asset/icon/Icon16/cell_delete.png new file mode 100644 index 0000000..2b40ce5 Binary files /dev/null and b/asset/icon/Icon16/cell_delete.png differ diff --git a/asset/icon/Icon16/cell_style.png b/asset/icon/Icon16/cell_style.png new file mode 100644 index 0000000..48002a3 Binary files /dev/null and b/asset/icon/Icon16/cell_style.png differ diff --git a/asset/icon/Icon16/celsius.png b/asset/icon/Icon16/celsius.png new file mode 100644 index 0000000..4e241ea Binary files /dev/null and b/asset/icon/Icon16/celsius.png differ diff --git a/asset/icon/Icon16/centos.png b/asset/icon/Icon16/centos.png new file mode 100644 index 0000000..67f91e4 Binary files /dev/null and b/asset/icon/Icon16/centos.png differ diff --git a/asset/icon/Icon16/centroid.png b/asset/icon/Icon16/centroid.png new file mode 100644 index 0000000..099584d Binary files /dev/null and b/asset/icon/Icon16/centroid.png differ diff --git a/asset/icon/Icon16/ceo.png b/asset/icon/Icon16/ceo.png new file mode 100644 index 0000000..fb86b5c Binary files /dev/null and b/asset/icon/Icon16/ceo.png differ diff --git a/asset/icon/Icon16/cgi_center.png b/asset/icon/Icon16/cgi_center.png new file mode 100644 index 0000000..005c800 Binary files /dev/null and b/asset/icon/Icon16/cgi_center.png differ diff --git a/asset/icon/Icon16/chair.png b/asset/icon/Icon16/chair.png new file mode 100644 index 0000000..700a156 Binary files /dev/null and b/asset/icon/Icon16/chair.png differ diff --git a/asset/icon/Icon16/chameleon.png b/asset/icon/Icon16/chameleon.png new file mode 100644 index 0000000..a1930bf Binary files /dev/null and b/asset/icon/Icon16/chameleon.png differ diff --git a/asset/icon/Icon16/change_languange.png b/asset/icon/Icon16/change_languange.png new file mode 100644 index 0000000..02a1e3a Binary files /dev/null and b/asset/icon/Icon16/change_languange.png differ diff --git a/asset/icon/Icon16/change_log.png b/asset/icon/Icon16/change_log.png new file mode 100644 index 0000000..d17a831 Binary files /dev/null and b/asset/icon/Icon16/change_log.png differ diff --git a/asset/icon/Icon16/change_password(2).png b/asset/icon/Icon16/change_password(2).png new file mode 100644 index 0000000..307726b Binary files /dev/null and b/asset/icon/Icon16/change_password(2).png differ diff --git a/asset/icon/Icon16/change_password.png b/asset/icon/Icon16/change_password.png new file mode 100644 index 0000000..63bc659 Binary files /dev/null and b/asset/icon/Icon16/change_password.png differ diff --git a/asset/icon/Icon16/change_whm_theme.png b/asset/icon/Icon16/change_whm_theme.png new file mode 100644 index 0000000..7ca1e8e Binary files /dev/null and b/asset/icon/Icon16/change_whm_theme.png differ diff --git a/asset/icon/Icon16/chart_bar.png b/asset/icon/Icon16/chart_bar.png new file mode 100644 index 0000000..59c4544 Binary files /dev/null and b/asset/icon/Icon16/chart_bar.png differ diff --git a/asset/icon/Icon16/chart_bar_add.png b/asset/icon/Icon16/chart_bar_add.png new file mode 100644 index 0000000..bc06bee Binary files /dev/null and b/asset/icon/Icon16/chart_bar_add.png differ diff --git a/asset/icon/Icon16/chart_bar_delete.png b/asset/icon/Icon16/chart_bar_delete.png new file mode 100644 index 0000000..44fb326 Binary files /dev/null and b/asset/icon/Icon16/chart_bar_delete.png differ diff --git a/asset/icon/Icon16/chart_bar_edit.png b/asset/icon/Icon16/chart_bar_edit.png new file mode 100644 index 0000000..c6a46cc Binary files /dev/null and b/asset/icon/Icon16/chart_bar_edit.png differ diff --git a/asset/icon/Icon16/chart_bar_error.png b/asset/icon/Icon16/chart_bar_error.png new file mode 100644 index 0000000..9bd7287 Binary files /dev/null and b/asset/icon/Icon16/chart_bar_error.png differ diff --git a/asset/icon/Icon16/chart_bar_link.png b/asset/icon/Icon16/chart_bar_link.png new file mode 100644 index 0000000..9eb6b8e Binary files /dev/null and b/asset/icon/Icon16/chart_bar_link.png differ diff --git a/asset/icon/Icon16/chart_bullseye.png b/asset/icon/Icon16/chart_bullseye.png new file mode 100644 index 0000000..789151d Binary files /dev/null and b/asset/icon/Icon16/chart_bullseye.png differ diff --git a/asset/icon/Icon16/chart_column.png b/asset/icon/Icon16/chart_column.png new file mode 100644 index 0000000..31fafd8 Binary files /dev/null and b/asset/icon/Icon16/chart_column.png differ diff --git a/asset/icon/Icon16/chart_column_2.png b/asset/icon/Icon16/chart_column_2.png new file mode 100644 index 0000000..f24cb27 Binary files /dev/null and b/asset/icon/Icon16/chart_column_2.png differ diff --git a/asset/icon/Icon16/chart_curve.png b/asset/icon/Icon16/chart_curve.png new file mode 100644 index 0000000..fafb7e1 Binary files /dev/null and b/asset/icon/Icon16/chart_curve.png differ diff --git a/asset/icon/Icon16/chart_curve_add.png b/asset/icon/Icon16/chart_curve_add.png new file mode 100644 index 0000000..fc850a7 Binary files /dev/null and b/asset/icon/Icon16/chart_curve_add.png differ diff --git a/asset/icon/Icon16/chart_curve_delete.png b/asset/icon/Icon16/chart_curve_delete.png new file mode 100644 index 0000000..b3a26b9 Binary files /dev/null and b/asset/icon/Icon16/chart_curve_delete.png differ diff --git a/asset/icon/Icon16/chart_curve_edit.png b/asset/icon/Icon16/chart_curve_edit.png new file mode 100644 index 0000000..1a04935 Binary files /dev/null and b/asset/icon/Icon16/chart_curve_edit.png differ diff --git a/asset/icon/Icon16/chart_curve_error.png b/asset/icon/Icon16/chart_curve_error.png new file mode 100644 index 0000000..7b28f8e Binary files /dev/null and b/asset/icon/Icon16/chart_curve_error.png differ diff --git a/asset/icon/Icon16/chart_curve_go.png b/asset/icon/Icon16/chart_curve_go.png new file mode 100644 index 0000000..aa7dc60 Binary files /dev/null and b/asset/icon/Icon16/chart_curve_go.png differ diff --git a/asset/icon/Icon16/chart_curve_link.png b/asset/icon/Icon16/chart_curve_link.png new file mode 100644 index 0000000..131b37d Binary files /dev/null and b/asset/icon/Icon16/chart_curve_link.png differ diff --git a/asset/icon/Icon16/chart_down_color.png b/asset/icon/Icon16/chart_down_color.png new file mode 100644 index 0000000..7935f70 Binary files /dev/null and b/asset/icon/Icon16/chart_down_color.png differ diff --git a/asset/icon/Icon16/chart_line.png b/asset/icon/Icon16/chart_line.png new file mode 100644 index 0000000..2ea8f38 Binary files /dev/null and b/asset/icon/Icon16/chart_line.png differ diff --git a/asset/icon/Icon16/chart_line_add.png b/asset/icon/Icon16/chart_line_add.png new file mode 100644 index 0000000..20d62f0 Binary files /dev/null and b/asset/icon/Icon16/chart_line_add.png differ diff --git a/asset/icon/Icon16/chart_line_delete.png b/asset/icon/Icon16/chart_line_delete.png new file mode 100644 index 0000000..b064edb Binary files /dev/null and b/asset/icon/Icon16/chart_line_delete.png differ diff --git a/asset/icon/Icon16/chart_line_edit.png b/asset/icon/Icon16/chart_line_edit.png new file mode 100644 index 0000000..9bc0b42 Binary files /dev/null and b/asset/icon/Icon16/chart_line_edit.png differ diff --git a/asset/icon/Icon16/chart_line_error.png b/asset/icon/Icon16/chart_line_error.png new file mode 100644 index 0000000..ffb6a41 Binary files /dev/null and b/asset/icon/Icon16/chart_line_error.png differ diff --git a/asset/icon/Icon16/chart_line_link.png b/asset/icon/Icon16/chart_line_link.png new file mode 100644 index 0000000..d0afdd5 Binary files /dev/null and b/asset/icon/Icon16/chart_line_link.png differ diff --git a/asset/icon/Icon16/chart_organisation.png b/asset/icon/Icon16/chart_organisation.png new file mode 100644 index 0000000..4d8bb59 Binary files /dev/null and b/asset/icon/Icon16/chart_organisation.png differ diff --git a/asset/icon/Icon16/chart_organisation_add.png b/asset/icon/Icon16/chart_organisation_add.png new file mode 100644 index 0000000..dadaeac Binary files /dev/null and b/asset/icon/Icon16/chart_organisation_add.png differ diff --git a/asset/icon/Icon16/chart_organisation_delete.png b/asset/icon/Icon16/chart_organisation_delete.png new file mode 100644 index 0000000..0002e50 Binary files /dev/null and b/asset/icon/Icon16/chart_organisation_delete.png differ diff --git a/asset/icon/Icon16/chart_pie(2).png b/asset/icon/Icon16/chart_pie(2).png new file mode 100644 index 0000000..d075419 Binary files /dev/null and b/asset/icon/Icon16/chart_pie(2).png differ diff --git a/asset/icon/Icon16/chart_pie.png b/asset/icon/Icon16/chart_pie.png new file mode 100644 index 0000000..2f74995 Binary files /dev/null and b/asset/icon/Icon16/chart_pie.png differ diff --git a/asset/icon/Icon16/chart_pie_add.png b/asset/icon/Icon16/chart_pie_add.png new file mode 100644 index 0000000..90f124c Binary files /dev/null and b/asset/icon/Icon16/chart_pie_add.png differ diff --git a/asset/icon/Icon16/chart_pie_delete.png b/asset/icon/Icon16/chart_pie_delete.png new file mode 100644 index 0000000..e5c65cd Binary files /dev/null and b/asset/icon/Icon16/chart_pie_delete.png differ diff --git a/asset/icon/Icon16/chart_pie_edit.png b/asset/icon/Icon16/chart_pie_edit.png new file mode 100644 index 0000000..c208b84 Binary files /dev/null and b/asset/icon/Icon16/chart_pie_edit.png differ diff --git a/asset/icon/Icon16/chart_pie_error.png b/asset/icon/Icon16/chart_pie_error.png new file mode 100644 index 0000000..17fbb92 Binary files /dev/null and b/asset/icon/Icon16/chart_pie_error.png differ diff --git a/asset/icon/Icon16/chart_pie_link.png b/asset/icon/Icon16/chart_pie_link.png new file mode 100644 index 0000000..608b1c8 Binary files /dev/null and b/asset/icon/Icon16/chart_pie_link.png differ diff --git a/asset/icon/Icon16/chart_stock.png b/asset/icon/Icon16/chart_stock.png new file mode 100644 index 0000000..c44f032 Binary files /dev/null and b/asset/icon/Icon16/chart_stock.png differ diff --git a/asset/icon/Icon16/chart_up_color.png b/asset/icon/Icon16/chart_up_color.png new file mode 100644 index 0000000..76b1330 Binary files /dev/null and b/asset/icon/Icon16/chart_up_color.png differ diff --git a/asset/icon/Icon16/chartplotter.png b/asset/icon/Icon16/chartplotter.png new file mode 100644 index 0000000..da84402 Binary files /dev/null and b/asset/icon/Icon16/chartplotter.png differ diff --git a/asset/icon/Icon16/check_box.png b/asset/icon/Icon16/check_box.png new file mode 100644 index 0000000..b036e41 Binary files /dev/null and b/asset/icon/Icon16/check_box.png differ diff --git a/asset/icon/Icon16/check_box_list.png b/asset/icon/Icon16/check_box_list.png new file mode 100644 index 0000000..77e42ee Binary files /dev/null and b/asset/icon/Icon16/check_box_list.png differ diff --git a/asset/icon/Icon16/check_box_mix.png b/asset/icon/Icon16/check_box_mix.png new file mode 100644 index 0000000..bd60d19 Binary files /dev/null and b/asset/icon/Icon16/check_box_mix.png differ diff --git a/asset/icon/Icon16/check_box_uncheck.png b/asset/icon/Icon16/check_box_uncheck.png new file mode 100644 index 0000000..c17045a Binary files /dev/null and b/asset/icon/Icon16/check_box_uncheck.png differ diff --git a/asset/icon/Icon16/check_boxes.png b/asset/icon/Icon16/check_boxes.png new file mode 100644 index 0000000..1411345 Binary files /dev/null and b/asset/icon/Icon16/check_boxes.png differ diff --git a/asset/icon/Icon16/check_boxes_series.png b/asset/icon/Icon16/check_boxes_series.png new file mode 100644 index 0000000..4e4d313 Binary files /dev/null and b/asset/icon/Icon16/check_boxes_series.png differ diff --git a/asset/icon/Icon16/check_field.png b/asset/icon/Icon16/check_field.png new file mode 100644 index 0000000..3d289ab Binary files /dev/null and b/asset/icon/Icon16/check_field.png differ diff --git a/asset/icon/Icon16/checkerboard.png b/asset/icon/Icon16/checkerboard.png new file mode 100644 index 0000000..2792ef0 Binary files /dev/null and b/asset/icon/Icon16/checkerboard.png differ diff --git a/asset/icon/Icon16/cheese.png b/asset/icon/Icon16/cheese.png new file mode 100644 index 0000000..e503e03 Binary files /dev/null and b/asset/icon/Icon16/cheese.png differ diff --git a/asset/icon/Icon16/chefs_hat.png b/asset/icon/Icon16/chefs_hat.png new file mode 100644 index 0000000..e5ebf72 Binary files /dev/null and b/asset/icon/Icon16/chefs_hat.png differ diff --git a/asset/icon/Icon16/cheque.png b/asset/icon/Icon16/cheque.png new file mode 100644 index 0000000..efe33c8 Binary files /dev/null and b/asset/icon/Icon16/cheque.png differ diff --git a/asset/icon/Icon16/chess_bishop.png b/asset/icon/Icon16/chess_bishop.png new file mode 100644 index 0000000..90547d5 Binary files /dev/null and b/asset/icon/Icon16/chess_bishop.png differ diff --git a/asset/icon/Icon16/chess_bishop_white.png b/asset/icon/Icon16/chess_bishop_white.png new file mode 100644 index 0000000..fdcdaa9 Binary files /dev/null and b/asset/icon/Icon16/chess_bishop_white.png differ diff --git a/asset/icon/Icon16/chess_horse.png b/asset/icon/Icon16/chess_horse.png new file mode 100644 index 0000000..c58a224 Binary files /dev/null and b/asset/icon/Icon16/chess_horse.png differ diff --git a/asset/icon/Icon16/chess_horse_white.png b/asset/icon/Icon16/chess_horse_white.png new file mode 100644 index 0000000..a2cd3d0 Binary files /dev/null and b/asset/icon/Icon16/chess_horse_white.png differ diff --git a/asset/icon/Icon16/chess_king.png b/asset/icon/Icon16/chess_king.png new file mode 100644 index 0000000..a0723a4 Binary files /dev/null and b/asset/icon/Icon16/chess_king.png differ diff --git a/asset/icon/Icon16/chess_king_white.png b/asset/icon/Icon16/chess_king_white.png new file mode 100644 index 0000000..b36da23 Binary files /dev/null and b/asset/icon/Icon16/chess_king_white.png differ diff --git a/asset/icon/Icon16/chess_pawn.png b/asset/icon/Icon16/chess_pawn.png new file mode 100644 index 0000000..27ae9e0 Binary files /dev/null and b/asset/icon/Icon16/chess_pawn.png differ diff --git a/asset/icon/Icon16/chess_pawn_white.png b/asset/icon/Icon16/chess_pawn_white.png new file mode 100644 index 0000000..3c6d157 Binary files /dev/null and b/asset/icon/Icon16/chess_pawn_white.png differ diff --git a/asset/icon/Icon16/chess_queen.png b/asset/icon/Icon16/chess_queen.png new file mode 100644 index 0000000..1b0b183 Binary files /dev/null and b/asset/icon/Icon16/chess_queen.png differ diff --git a/asset/icon/Icon16/chess_queen_white.png b/asset/icon/Icon16/chess_queen_white.png new file mode 100644 index 0000000..92c2adf Binary files /dev/null and b/asset/icon/Icon16/chess_queen_white.png differ diff --git a/asset/icon/Icon16/chess_tower.png b/asset/icon/Icon16/chess_tower.png new file mode 100644 index 0000000..774a0bf Binary files /dev/null and b/asset/icon/Icon16/chess_tower.png differ diff --git a/asset/icon/Icon16/chess_tower_white.png b/asset/icon/Icon16/chess_tower_white.png new file mode 100644 index 0000000..ebdcbce Binary files /dev/null and b/asset/icon/Icon16/chess_tower_white.png differ diff --git a/asset/icon/Icon16/chiken_leg.png b/asset/icon/Icon16/chiken_leg.png new file mode 100644 index 0000000..824f888 Binary files /dev/null and b/asset/icon/Icon16/chiken_leg.png differ diff --git a/asset/icon/Icon16/children_cap.png b/asset/icon/Icon16/children_cap.png new file mode 100644 index 0000000..e1d6e19 Binary files /dev/null and b/asset/icon/Icon16/children_cap.png differ diff --git a/asset/icon/Icon16/chinese_noodles.png b/asset/icon/Icon16/chinese_noodles.png new file mode 100644 index 0000000..192bdc8 Binary files /dev/null and b/asset/icon/Icon16/chinese_noodles.png differ diff --git a/asset/icon/Icon16/chocolate.png b/asset/icon/Icon16/chocolate.png new file mode 100644 index 0000000..9cb4818 Binary files /dev/null and b/asset/icon/Icon16/chocolate.png differ diff --git a/asset/icon/Icon16/chocolate_bite.png b/asset/icon/Icon16/chocolate_bite.png new file mode 100644 index 0000000..58b45c3 Binary files /dev/null and b/asset/icon/Icon16/chocolate_bite.png differ diff --git a/asset/icon/Icon16/chocolate_milk.png b/asset/icon/Icon16/chocolate_milk.png new file mode 100644 index 0000000..a4a56c6 Binary files /dev/null and b/asset/icon/Icon16/chocolate_milk.png differ diff --git a/asset/icon/Icon16/choose_log_programs.png b/asset/icon/Icon16/choose_log_programs.png new file mode 100644 index 0000000..ad27c84 Binary files /dev/null and b/asset/icon/Icon16/choose_log_programs.png differ diff --git a/asset/icon/Icon16/christmas_tree.png b/asset/icon/Icon16/christmas_tree.png new file mode 100644 index 0000000..d1bb4f3 Binary files /dev/null and b/asset/icon/Icon16/christmas_tree.png differ diff --git a/asset/icon/Icon16/church.png b/asset/icon/Icon16/church.png new file mode 100644 index 0000000..e1642d0 Binary files /dev/null and b/asset/icon/Icon16/church.png differ diff --git a/asset/icon/Icon16/cigarette.png b/asset/icon/Icon16/cigarette.png new file mode 100644 index 0000000..c7d0860 Binary files /dev/null and b/asset/icon/Icon16/cigarette.png differ diff --git a/asset/icon/Icon16/cinema_ticket.png b/asset/icon/Icon16/cinema_ticket.png new file mode 100644 index 0000000..68b3fa4 Binary files /dev/null and b/asset/icon/Icon16/cinema_ticket.png differ diff --git a/asset/icon/Icon16/circus.png b/asset/icon/Icon16/circus.png new file mode 100644 index 0000000..1b7567f Binary files /dev/null and b/asset/icon/Icon16/circus.png differ diff --git a/asset/icon/Icon16/cirrus.png b/asset/icon/Icon16/cirrus.png new file mode 100644 index 0000000..0ef2b00 Binary files /dev/null and b/asset/icon/Icon16/cirrus.png differ diff --git a/asset/icon/Icon16/class_module.png b/asset/icon/Icon16/class_module.png new file mode 100644 index 0000000..b6e205f Binary files /dev/null and b/asset/icon/Icon16/class_module.png differ diff --git a/asset/icon/Icon16/clear_formatting.png b/asset/icon/Icon16/clear_formatting.png new file mode 100644 index 0000000..54eae5d Binary files /dev/null and b/asset/icon/Icon16/clear_formatting.png differ diff --git a/asset/icon/Icon16/client_account_template.png b/asset/icon/Icon16/client_account_template.png new file mode 100644 index 0000000..73d9cfe Binary files /dev/null and b/asset/icon/Icon16/client_account_template.png differ diff --git a/asset/icon/Icon16/clip_splitter.png b/asset/icon/Icon16/clip_splitter.png new file mode 100644 index 0000000..4d1b59f Binary files /dev/null and b/asset/icon/Icon16/clip_splitter.png differ diff --git a/asset/icon/Icon16/clipart_pane.png b/asset/icon/Icon16/clipart_pane.png new file mode 100644 index 0000000..5d25388 Binary files /dev/null and b/asset/icon/Icon16/clipart_pane.png differ diff --git a/asset/icon/Icon16/clipboard_empty.png b/asset/icon/Icon16/clipboard_empty.png new file mode 100644 index 0000000..2648bd0 Binary files /dev/null and b/asset/icon/Icon16/clipboard_empty.png differ diff --git a/asset/icon/Icon16/clipboard_invoice.png b/asset/icon/Icon16/clipboard_invoice.png new file mode 100644 index 0000000..7ad7b0d Binary files /dev/null and b/asset/icon/Icon16/clipboard_invoice.png differ diff --git a/asset/icon/Icon16/clipboard_sign.png b/asset/icon/Icon16/clipboard_sign.png new file mode 100644 index 0000000..2d4a59b Binary files /dev/null and b/asset/icon/Icon16/clipboard_sign.png differ diff --git a/asset/icon/Icon16/clipboard_sign_out.png b/asset/icon/Icon16/clipboard_sign_out.png new file mode 100644 index 0000000..ddb7cd0 Binary files /dev/null and b/asset/icon/Icon16/clipboard_sign_out.png differ diff --git a/asset/icon/Icon16/clock.png b/asset/icon/Icon16/clock.png new file mode 100644 index 0000000..9906fb2 Binary files /dev/null and b/asset/icon/Icon16/clock.png differ diff --git a/asset/icon/Icon16/clock_15.png b/asset/icon/Icon16/clock_15.png new file mode 100644 index 0000000..c315b96 Binary files /dev/null and b/asset/icon/Icon16/clock_15.png differ diff --git a/asset/icon/Icon16/clock_45.png b/asset/icon/Icon16/clock_45.png new file mode 100644 index 0000000..a2aa9bc Binary files /dev/null and b/asset/icon/Icon16/clock_45.png differ diff --git a/asset/icon/Icon16/clock_add.png b/asset/icon/Icon16/clock_add.png new file mode 100644 index 0000000..5e637a4 Binary files /dev/null and b/asset/icon/Icon16/clock_add.png differ diff --git a/asset/icon/Icon16/clock_delete.png b/asset/icon/Icon16/clock_delete.png new file mode 100644 index 0000000..2a15c51 Binary files /dev/null and b/asset/icon/Icon16/clock_delete.png differ diff --git a/asset/icon/Icon16/clock_edit.png b/asset/icon/Icon16/clock_edit.png new file mode 100644 index 0000000..dcb3aee Binary files /dev/null and b/asset/icon/Icon16/clock_edit.png differ diff --git a/asset/icon/Icon16/clock_error.png b/asset/icon/Icon16/clock_error.png new file mode 100644 index 0000000..f5557bb Binary files /dev/null and b/asset/icon/Icon16/clock_error.png differ diff --git a/asset/icon/Icon16/clock_go.png b/asset/icon/Icon16/clock_go.png new file mode 100644 index 0000000..2bebf2f Binary files /dev/null and b/asset/icon/Icon16/clock_go.png differ diff --git a/asset/icon/Icon16/clock_history_frame.png b/asset/icon/Icon16/clock_history_frame.png new file mode 100644 index 0000000..f40e399 Binary files /dev/null and b/asset/icon/Icon16/clock_history_frame.png differ diff --git a/asset/icon/Icon16/clock_link.png b/asset/icon/Icon16/clock_link.png new file mode 100644 index 0000000..045020a Binary files /dev/null and b/asset/icon/Icon16/clock_link.png differ diff --git a/asset/icon/Icon16/clock_moon_phase.png b/asset/icon/Icon16/clock_moon_phase.png new file mode 100644 index 0000000..13cc577 Binary files /dev/null and b/asset/icon/Icon16/clock_moon_phase.png differ diff --git a/asset/icon/Icon16/clock_pause.png b/asset/icon/Icon16/clock_pause.png new file mode 100644 index 0000000..942449b Binary files /dev/null and b/asset/icon/Icon16/clock_pause.png differ diff --git a/asset/icon/Icon16/clock_play.png b/asset/icon/Icon16/clock_play.png new file mode 100644 index 0000000..d6aaf79 Binary files /dev/null and b/asset/icon/Icon16/clock_play.png differ diff --git a/asset/icon/Icon16/clock_red.png b/asset/icon/Icon16/clock_red.png new file mode 100644 index 0000000..afa088c Binary files /dev/null and b/asset/icon/Icon16/clock_red.png differ diff --git a/asset/icon/Icon16/clock_select_remain.png b/asset/icon/Icon16/clock_select_remain.png new file mode 100644 index 0000000..0aad101 Binary files /dev/null and b/asset/icon/Icon16/clock_select_remain.png differ diff --git a/asset/icon/Icon16/clock_stop.png b/asset/icon/Icon16/clock_stop.png new file mode 100644 index 0000000..d5b8340 Binary files /dev/null and b/asset/icon/Icon16/clock_stop.png differ diff --git a/asset/icon/Icon16/clown_fish.png b/asset/icon/Icon16/clown_fish.png new file mode 100644 index 0000000..95d394f Binary files /dev/null and b/asset/icon/Icon16/clown_fish.png differ diff --git a/asset/icon/Icon16/co2.png b/asset/icon/Icon16/co2.png new file mode 100644 index 0000000..e305ebf Binary files /dev/null and b/asset/icon/Icon16/co2.png differ diff --git a/asset/icon/Icon16/cocacola.png b/asset/icon/Icon16/cocacola.png new file mode 100644 index 0000000..3a99d80 Binary files /dev/null and b/asset/icon/Icon16/cocacola.png differ diff --git a/asset/icon/Icon16/code.png b/asset/icon/Icon16/code.png new file mode 100644 index 0000000..d3571a8 Binary files /dev/null and b/asset/icon/Icon16/code.png differ diff --git a/asset/icon/Icon16/cog.png b/asset/icon/Icon16/cog.png new file mode 100644 index 0000000..8f4eeb7 Binary files /dev/null and b/asset/icon/Icon16/cog.png differ diff --git a/asset/icon/Icon16/cog_add.png b/asset/icon/Icon16/cog_add.png new file mode 100644 index 0000000..3652872 Binary files /dev/null and b/asset/icon/Icon16/cog_add.png differ diff --git a/asset/icon/Icon16/cog_delete.png b/asset/icon/Icon16/cog_delete.png new file mode 100644 index 0000000..e5105cb Binary files /dev/null and b/asset/icon/Icon16/cog_delete.png differ diff --git a/asset/icon/Icon16/cog_edit.png b/asset/icon/Icon16/cog_edit.png new file mode 100644 index 0000000..dc0a35e Binary files /dev/null and b/asset/icon/Icon16/cog_edit.png differ diff --git a/asset/icon/Icon16/cog_error.png b/asset/icon/Icon16/cog_error.png new file mode 100644 index 0000000..d4c38ba Binary files /dev/null and b/asset/icon/Icon16/cog_error.png differ diff --git a/asset/icon/Icon16/cog_go.png b/asset/icon/Icon16/cog_go.png new file mode 100644 index 0000000..b95136c Binary files /dev/null and b/asset/icon/Icon16/cog_go.png differ diff --git a/asset/icon/Icon16/coin_single_cooper.png b/asset/icon/Icon16/coin_single_cooper.png new file mode 100644 index 0000000..bb981e0 Binary files /dev/null and b/asset/icon/Icon16/coin_single_cooper.png differ diff --git a/asset/icon/Icon16/coin_single_gold.png b/asset/icon/Icon16/coin_single_gold.png new file mode 100644 index 0000000..b0e6508 Binary files /dev/null and b/asset/icon/Icon16/coin_single_gold.png differ diff --git a/asset/icon/Icon16/coin_single_silver.png b/asset/icon/Icon16/coin_single_silver.png new file mode 100644 index 0000000..be74169 Binary files /dev/null and b/asset/icon/Icon16/coin_single_silver.png differ diff --git a/asset/icon/Icon16/coin_stack_gold.png b/asset/icon/Icon16/coin_stack_gold.png new file mode 100644 index 0000000..21b8207 Binary files /dev/null and b/asset/icon/Icon16/coin_stack_gold.png differ diff --git a/asset/icon/Icon16/coins.png b/asset/icon/Icon16/coins.png new file mode 100644 index 0000000..28d59ee Binary files /dev/null and b/asset/icon/Icon16/coins.png differ diff --git a/asset/icon/Icon16/coins_add.png b/asset/icon/Icon16/coins_add.png new file mode 100644 index 0000000..00c830c Binary files /dev/null and b/asset/icon/Icon16/coins_add.png differ diff --git a/asset/icon/Icon16/coins_delete.png b/asset/icon/Icon16/coins_delete.png new file mode 100644 index 0000000..1f590cd Binary files /dev/null and b/asset/icon/Icon16/coins_delete.png differ diff --git a/asset/icon/Icon16/coins_in_hand.png b/asset/icon/Icon16/coins_in_hand.png new file mode 100644 index 0000000..5044d0b Binary files /dev/null and b/asset/icon/Icon16/coins_in_hand.png differ diff --git a/asset/icon/Icon16/cold.png b/asset/icon/Icon16/cold.png new file mode 100644 index 0000000..79cb756 Binary files /dev/null and b/asset/icon/Icon16/cold.png differ diff --git a/asset/icon/Icon16/collecting_data.png b/asset/icon/Icon16/collecting_data.png new file mode 100644 index 0000000..a7f0bed Binary files /dev/null and b/asset/icon/Icon16/collecting_data.png differ diff --git a/asset/icon/Icon16/color_adjustment.png b/asset/icon/Icon16/color_adjustment.png new file mode 100644 index 0000000..a1a0525 Binary files /dev/null and b/asset/icon/Icon16/color_adjustment.png differ diff --git a/asset/icon/Icon16/color_adjustment_blue.png b/asset/icon/Icon16/color_adjustment_blue.png new file mode 100644 index 0000000..d486c18 Binary files /dev/null and b/asset/icon/Icon16/color_adjustment_blue.png differ diff --git a/asset/icon/Icon16/color_adjustment_green.png b/asset/icon/Icon16/color_adjustment_green.png new file mode 100644 index 0000000..9ce2658 Binary files /dev/null and b/asset/icon/Icon16/color_adjustment_green.png differ diff --git a/asset/icon/Icon16/color_adjustment_red.png b/asset/icon/Icon16/color_adjustment_red.png new file mode 100644 index 0000000..44b3acc Binary files /dev/null and b/asset/icon/Icon16/color_adjustment_red.png differ diff --git a/asset/icon/Icon16/color_gradient.png b/asset/icon/Icon16/color_gradient.png new file mode 100644 index 0000000..0f7af7a Binary files /dev/null and b/asset/icon/Icon16/color_gradient.png differ diff --git a/asset/icon/Icon16/color_management.png b/asset/icon/Icon16/color_management.png new file mode 100644 index 0000000..f876090 Binary files /dev/null and b/asset/icon/Icon16/color_management.png differ diff --git a/asset/icon/Icon16/color_picker(2).png b/asset/icon/Icon16/color_picker(2).png new file mode 100644 index 0000000..2022a74 Binary files /dev/null and b/asset/icon/Icon16/color_picker(2).png differ diff --git a/asset/icon/Icon16/color_picker.png b/asset/icon/Icon16/color_picker.png new file mode 100644 index 0000000..f060c57 Binary files /dev/null and b/asset/icon/Icon16/color_picker.png differ diff --git a/asset/icon/Icon16/color_picker_default.png b/asset/icon/Icon16/color_picker_default.png new file mode 100644 index 0000000..ed750a4 Binary files /dev/null and b/asset/icon/Icon16/color_picker_default.png differ diff --git a/asset/icon/Icon16/color_picker_switch.png b/asset/icon/Icon16/color_picker_switch.png new file mode 100644 index 0000000..3a74000 Binary files /dev/null and b/asset/icon/Icon16/color_picker_switch.png differ diff --git a/asset/icon/Icon16/color_picker_transparent.png b/asset/icon/Icon16/color_picker_transparent.png new file mode 100644 index 0000000..301d76e Binary files /dev/null and b/asset/icon/Icon16/color_picker_transparent.png differ diff --git a/asset/icon/Icon16/color_swatch.png b/asset/icon/Icon16/color_swatch.png new file mode 100644 index 0000000..4d42bec Binary files /dev/null and b/asset/icon/Icon16/color_swatch.png differ diff --git a/asset/icon/Icon16/color_swatches.png b/asset/icon/Icon16/color_swatches.png new file mode 100644 index 0000000..ca1f342 Binary files /dev/null and b/asset/icon/Icon16/color_swatches.png differ diff --git a/asset/icon/Icon16/color_wheel.png b/asset/icon/Icon16/color_wheel.png new file mode 100644 index 0000000..287a344 Binary files /dev/null and b/asset/icon/Icon16/color_wheel.png differ diff --git a/asset/icon/Icon16/column_double.png b/asset/icon/Icon16/column_double.png new file mode 100644 index 0000000..50c35d8 Binary files /dev/null and b/asset/icon/Icon16/column_double.png differ diff --git a/asset/icon/Icon16/column_four.png b/asset/icon/Icon16/column_four.png new file mode 100644 index 0000000..7f25f1c Binary files /dev/null and b/asset/icon/Icon16/column_four.png differ diff --git a/asset/icon/Icon16/column_left.png b/asset/icon/Icon16/column_left.png new file mode 100644 index 0000000..c11623d Binary files /dev/null and b/asset/icon/Icon16/column_left.png differ diff --git a/asset/icon/Icon16/column_one.png b/asset/icon/Icon16/column_one.png new file mode 100644 index 0000000..3a953ae Binary files /dev/null and b/asset/icon/Icon16/column_one.png differ diff --git a/asset/icon/Icon16/column_right.png b/asset/icon/Icon16/column_right.png new file mode 100644 index 0000000..8c2743f Binary files /dev/null and b/asset/icon/Icon16/column_right.png differ diff --git a/asset/icon/Icon16/column_single.png b/asset/icon/Icon16/column_single.png new file mode 100644 index 0000000..9a1c15e Binary files /dev/null and b/asset/icon/Icon16/column_single.png differ diff --git a/asset/icon/Icon16/column_tree.png b/asset/icon/Icon16/column_tree.png new file mode 100644 index 0000000..932d402 Binary files /dev/null and b/asset/icon/Icon16/column_tree.png differ diff --git a/asset/icon/Icon16/column_two.png b/asset/icon/Icon16/column_two.png new file mode 100644 index 0000000..2f810b5 Binary files /dev/null and b/asset/icon/Icon16/column_two.png differ diff --git a/asset/icon/Icon16/column_wight.png b/asset/icon/Icon16/column_wight.png new file mode 100644 index 0000000..1bfebcf Binary files /dev/null and b/asset/icon/Icon16/column_wight.png differ diff --git a/asset/icon/Icon16/columnchart.png b/asset/icon/Icon16/columnchart.png new file mode 100644 index 0000000..7b6be36 Binary files /dev/null and b/asset/icon/Icon16/columnchart.png differ diff --git a/asset/icon/Icon16/combined_chart.png b/asset/icon/Icon16/combined_chart.png new file mode 100644 index 0000000..ee85cf7 Binary files /dev/null and b/asset/icon/Icon16/combined_chart.png differ diff --git a/asset/icon/Icon16/combo_box.png b/asset/icon/Icon16/combo_box.png new file mode 100644 index 0000000..c179216 Binary files /dev/null and b/asset/icon/Icon16/combo_box.png differ diff --git a/asset/icon/Icon16/combo_box_calendar.png b/asset/icon/Icon16/combo_box_calendar.png new file mode 100644 index 0000000..23dc735 Binary files /dev/null and b/asset/icon/Icon16/combo_box_calendar.png differ diff --git a/asset/icon/Icon16/combo_box_edit.png b/asset/icon/Icon16/combo_box_edit.png new file mode 100644 index 0000000..8d93ed3 Binary files /dev/null and b/asset/icon/Icon16/combo_box_edit.png differ diff --git a/asset/icon/Icon16/combo_box_light_blue.png b/asset/icon/Icon16/combo_box_light_blue.png new file mode 100644 index 0000000..022c150 Binary files /dev/null and b/asset/icon/Icon16/combo_box_light_blue.png differ diff --git a/asset/icon/Icon16/combo_boxes.png b/asset/icon/Icon16/combo_boxes.png new file mode 100644 index 0000000..9602fd3 Binary files /dev/null and b/asset/icon/Icon16/combo_boxes.png differ diff --git a/asset/icon/Icon16/comment.png b/asset/icon/Icon16/comment.png new file mode 100644 index 0000000..a5bab32 Binary files /dev/null and b/asset/icon/Icon16/comment.png differ diff --git a/asset/icon/Icon16/comment_add.png b/asset/icon/Icon16/comment_add.png new file mode 100644 index 0000000..5f1267e Binary files /dev/null and b/asset/icon/Icon16/comment_add.png differ diff --git a/asset/icon/Icon16/comment_box.png b/asset/icon/Icon16/comment_box.png new file mode 100644 index 0000000..4e5220a Binary files /dev/null and b/asset/icon/Icon16/comment_box.png differ diff --git a/asset/icon/Icon16/comment_delete.png b/asset/icon/Icon16/comment_delete.png new file mode 100644 index 0000000..8e8687a Binary files /dev/null and b/asset/icon/Icon16/comment_delete.png differ diff --git a/asset/icon/Icon16/comment_edit.png b/asset/icon/Icon16/comment_edit.png new file mode 100644 index 0000000..ae36fd0 Binary files /dev/null and b/asset/icon/Icon16/comment_edit.png differ diff --git a/asset/icon/Icon16/comment_facebook.png b/asset/icon/Icon16/comment_facebook.png new file mode 100644 index 0000000..1f24c12 Binary files /dev/null and b/asset/icon/Icon16/comment_facebook.png differ diff --git a/asset/icon/Icon16/comment_facebook_box.png b/asset/icon/Icon16/comment_facebook_box.png new file mode 100644 index 0000000..1ede423 Binary files /dev/null and b/asset/icon/Icon16/comment_facebook_box.png differ diff --git a/asset/icon/Icon16/comment_google.png b/asset/icon/Icon16/comment_google.png new file mode 100644 index 0000000..c376455 Binary files /dev/null and b/asset/icon/Icon16/comment_google.png differ diff --git a/asset/icon/Icon16/comment_twitter.png b/asset/icon/Icon16/comment_twitter.png new file mode 100644 index 0000000..f4dc00f Binary files /dev/null and b/asset/icon/Icon16/comment_twitter.png differ diff --git a/asset/icon/Icon16/comment_twitter_box.png b/asset/icon/Icon16/comment_twitter_box.png new file mode 100644 index 0000000..dc9968b Binary files /dev/null and b/asset/icon/Icon16/comment_twitter_box.png differ diff --git a/asset/icon/Icon16/comment_twitter_retwit.png b/asset/icon/Icon16/comment_twitter_retwit.png new file mode 100644 index 0000000..35cc99a Binary files /dev/null and b/asset/icon/Icon16/comment_twitter_retwit.png differ diff --git a/asset/icon/Icon16/comment_white.png b/asset/icon/Icon16/comment_white.png new file mode 100644 index 0000000..1d65dbf Binary files /dev/null and b/asset/icon/Icon16/comment_white.png differ diff --git a/asset/icon/Icon16/comments.png b/asset/icon/Icon16/comments.png new file mode 100644 index 0000000..9058397 Binary files /dev/null and b/asset/icon/Icon16/comments.png differ diff --git a/asset/icon/Icon16/comments_add.png b/asset/icon/Icon16/comments_add.png new file mode 100644 index 0000000..da76ab2 Binary files /dev/null and b/asset/icon/Icon16/comments_add.png differ diff --git a/asset/icon/Icon16/comments_delete.png b/asset/icon/Icon16/comments_delete.png new file mode 100644 index 0000000..4a7bea0 Binary files /dev/null and b/asset/icon/Icon16/comments_delete.png differ diff --git a/asset/icon/Icon16/comments_facebook.png b/asset/icon/Icon16/comments_facebook.png new file mode 100644 index 0000000..ecb69a9 Binary files /dev/null and b/asset/icon/Icon16/comments_facebook.png differ diff --git a/asset/icon/Icon16/comments_twitter.png b/asset/icon/Icon16/comments_twitter.png new file mode 100644 index 0000000..0d579e7 Binary files /dev/null and b/asset/icon/Icon16/comments_twitter.png differ diff --git a/asset/icon/Icon16/company_generosity.png b/asset/icon/Icon16/company_generosity.png new file mode 100644 index 0000000..c30ff59 Binary files /dev/null and b/asset/icon/Icon16/company_generosity.png differ diff --git a/asset/icon/Icon16/compare.png b/asset/icon/Icon16/compare.png new file mode 100644 index 0000000..6a61957 Binary files /dev/null and b/asset/icon/Icon16/compare.png differ diff --git a/asset/icon/Icon16/compass.png b/asset/icon/Icon16/compass.png new file mode 100644 index 0000000..6576ced Binary files /dev/null and b/asset/icon/Icon16/compass.png differ diff --git a/asset/icon/Icon16/compile.png b/asset/icon/Icon16/compile.png new file mode 100644 index 0000000..6a5fa25 Binary files /dev/null and b/asset/icon/Icon16/compile.png differ diff --git a/asset/icon/Icon16/compile_error.png b/asset/icon/Icon16/compile_error.png new file mode 100644 index 0000000..4bf99db Binary files /dev/null and b/asset/icon/Icon16/compile_error.png differ diff --git a/asset/icon/Icon16/compile_warning.png b/asset/icon/Icon16/compile_warning.png new file mode 100644 index 0000000..bb83c1a Binary files /dev/null and b/asset/icon/Icon16/compile_warning.png differ diff --git a/asset/icon/Icon16/compress.png b/asset/icon/Icon16/compress.png new file mode 100644 index 0000000..183511d Binary files /dev/null and b/asset/icon/Icon16/compress.png differ diff --git a/asset/icon/Icon16/compress_repair.png b/asset/icon/Icon16/compress_repair.png new file mode 100644 index 0000000..2b93aed Binary files /dev/null and b/asset/icon/Icon16/compress_repair.png differ diff --git a/asset/icon/Icon16/computer.png b/asset/icon/Icon16/computer.png new file mode 100644 index 0000000..d07d5fd Binary files /dev/null and b/asset/icon/Icon16/computer.png differ diff --git a/asset/icon/Icon16/computer_add.png b/asset/icon/Icon16/computer_add.png new file mode 100644 index 0000000..e89c1df Binary files /dev/null and b/asset/icon/Icon16/computer_add.png differ diff --git a/asset/icon/Icon16/computer_delete.png b/asset/icon/Icon16/computer_delete.png new file mode 100644 index 0000000..06eb7c6 Binary files /dev/null and b/asset/icon/Icon16/computer_delete.png differ diff --git a/asset/icon/Icon16/computer_edit.png b/asset/icon/Icon16/computer_edit.png new file mode 100644 index 0000000..88f128f Binary files /dev/null and b/asset/icon/Icon16/computer_edit.png differ diff --git a/asset/icon/Icon16/computer_error.png b/asset/icon/Icon16/computer_error.png new file mode 100644 index 0000000..9598803 Binary files /dev/null and b/asset/icon/Icon16/computer_error.png differ diff --git a/asset/icon/Icon16/computer_go.png b/asset/icon/Icon16/computer_go.png new file mode 100644 index 0000000..2cf1c6b Binary files /dev/null and b/asset/icon/Icon16/computer_go.png differ diff --git a/asset/icon/Icon16/computer_key.png b/asset/icon/Icon16/computer_key.png new file mode 100644 index 0000000..1364e97 Binary files /dev/null and b/asset/icon/Icon16/computer_key.png differ diff --git a/asset/icon/Icon16/computer_link.png b/asset/icon/Icon16/computer_link.png new file mode 100644 index 0000000..223dceb Binary files /dev/null and b/asset/icon/Icon16/computer_link.png differ diff --git a/asset/icon/Icon16/configure_cluster.png b/asset/icon/Icon16/configure_cluster.png new file mode 100644 index 0000000..a3f76da Binary files /dev/null and b/asset/icon/Icon16/configure_cluster.png differ diff --git a/asset/icon/Icon16/configure_customer_contacts.png b/asset/icon/Icon16/configure_customer_contacts.png new file mode 100644 index 0000000..5d1edae Binary files /dev/null and b/asset/icon/Icon16/configure_customer_contacts.png differ diff --git a/asset/icon/Icon16/connect.png b/asset/icon/Icon16/connect.png new file mode 100644 index 0000000..88b6da2 Binary files /dev/null and b/asset/icon/Icon16/connect.png differ diff --git a/asset/icon/Icon16/connections.png b/asset/icon/Icon16/connections.png new file mode 100644 index 0000000..906f306 Binary files /dev/null and b/asset/icon/Icon16/connections.png differ diff --git a/asset/icon/Icon16/consolidate.png b/asset/icon/Icon16/consolidate.png new file mode 100644 index 0000000..8769bc6 Binary files /dev/null and b/asset/icon/Icon16/consolidate.png differ diff --git a/asset/icon/Icon16/construction.png b/asset/icon/Icon16/construction.png new file mode 100644 index 0000000..6dd0b2a Binary files /dev/null and b/asset/icon/Icon16/construction.png differ diff --git a/asset/icon/Icon16/contact_email.png b/asset/icon/Icon16/contact_email.png new file mode 100644 index 0000000..8f615f6 Binary files /dev/null and b/asset/icon/Icon16/contact_email.png differ diff --git a/asset/icon/Icon16/contrast.png b/asset/icon/Icon16/contrast.png new file mode 100644 index 0000000..001e003 Binary files /dev/null and b/asset/icon/Icon16/contrast.png differ diff --git a/asset/icon/Icon16/contrast_decrease.png b/asset/icon/Icon16/contrast_decrease.png new file mode 100644 index 0000000..65d5152 Binary files /dev/null and b/asset/icon/Icon16/contrast_decrease.png differ diff --git a/asset/icon/Icon16/contrast_high.png b/asset/icon/Icon16/contrast_high.png new file mode 100644 index 0000000..864dbe9 Binary files /dev/null and b/asset/icon/Icon16/contrast_high.png differ diff --git a/asset/icon/Icon16/contrast_increase.png b/asset/icon/Icon16/contrast_increase.png new file mode 100644 index 0000000..3761352 Binary files /dev/null and b/asset/icon/Icon16/contrast_increase.png differ diff --git a/asset/icon/Icon16/contrast_low.png b/asset/icon/Icon16/contrast_low.png new file mode 100644 index 0000000..0a5b27b Binary files /dev/null and b/asset/icon/Icon16/contrast_low.png differ diff --git a/asset/icon/Icon16/control_cursor.png b/asset/icon/Icon16/control_cursor.png new file mode 100644 index 0000000..e705456 Binary files /dev/null and b/asset/icon/Icon16/control_cursor.png differ diff --git a/asset/icon/Icon16/control_cursor_blue.png b/asset/icon/Icon16/control_cursor_blue.png new file mode 100644 index 0000000..2dd1f96 Binary files /dev/null and b/asset/icon/Icon16/control_cursor_blue.png differ diff --git a/asset/icon/Icon16/control_eject.png b/asset/icon/Icon16/control_eject.png new file mode 100644 index 0000000..00deee0 Binary files /dev/null and b/asset/icon/Icon16/control_eject.png differ diff --git a/asset/icon/Icon16/control_eject_blue.png b/asset/icon/Icon16/control_eject_blue.png new file mode 100644 index 0000000..7cbf0b8 Binary files /dev/null and b/asset/icon/Icon16/control_eject_blue.png differ diff --git a/asset/icon/Icon16/control_end.png b/asset/icon/Icon16/control_end.png new file mode 100644 index 0000000..e69fa3d Binary files /dev/null and b/asset/icon/Icon16/control_end.png differ diff --git a/asset/icon/Icon16/control_end_blue.png b/asset/icon/Icon16/control_end_blue.png new file mode 100644 index 0000000..88dc738 Binary files /dev/null and b/asset/icon/Icon16/control_end_blue.png differ diff --git a/asset/icon/Icon16/control_equalizer.png b/asset/icon/Icon16/control_equalizer.png new file mode 100644 index 0000000..02719a2 Binary files /dev/null and b/asset/icon/Icon16/control_equalizer.png differ diff --git a/asset/icon/Icon16/control_equalizer_blue.png b/asset/icon/Icon16/control_equalizer_blue.png new file mode 100644 index 0000000..1467dca Binary files /dev/null and b/asset/icon/Icon16/control_equalizer_blue.png differ diff --git a/asset/icon/Icon16/control_fastforward.png b/asset/icon/Icon16/control_fastforward.png new file mode 100644 index 0000000..2d674ac Binary files /dev/null and b/asset/icon/Icon16/control_fastforward.png differ diff --git a/asset/icon/Icon16/control_fastforward_blue.png b/asset/icon/Icon16/control_fastforward_blue.png new file mode 100644 index 0000000..d66725a Binary files /dev/null and b/asset/icon/Icon16/control_fastforward_blue.png differ diff --git a/asset/icon/Icon16/control_panel.png b/asset/icon/Icon16/control_panel.png new file mode 100644 index 0000000..10d64c5 Binary files /dev/null and b/asset/icon/Icon16/control_panel.png differ diff --git a/asset/icon/Icon16/control_panel_access.png b/asset/icon/Icon16/control_panel_access.png new file mode 100644 index 0000000..88b606b Binary files /dev/null and b/asset/icon/Icon16/control_panel_access.png differ diff --git a/asset/icon/Icon16/control_panel_branding.png b/asset/icon/Icon16/control_panel_branding.png new file mode 100644 index 0000000..5201171 Binary files /dev/null and b/asset/icon/Icon16/control_panel_branding.png differ diff --git a/asset/icon/Icon16/control_pause.png b/asset/icon/Icon16/control_pause.png new file mode 100644 index 0000000..6102c6b Binary files /dev/null and b/asset/icon/Icon16/control_pause.png differ diff --git a/asset/icon/Icon16/control_pause_blue.png b/asset/icon/Icon16/control_pause_blue.png new file mode 100644 index 0000000..f5c483f Binary files /dev/null and b/asset/icon/Icon16/control_pause_blue.png differ diff --git a/asset/icon/Icon16/control_pause_record.png b/asset/icon/Icon16/control_pause_record.png new file mode 100644 index 0000000..47080cc Binary files /dev/null and b/asset/icon/Icon16/control_pause_record.png differ diff --git a/asset/icon/Icon16/control_play.png b/asset/icon/Icon16/control_play.png new file mode 100644 index 0000000..eac3be1 Binary files /dev/null and b/asset/icon/Icon16/control_play.png differ diff --git a/asset/icon/Icon16/control_play_blue.png b/asset/icon/Icon16/control_play_blue.png new file mode 100644 index 0000000..184be23 Binary files /dev/null and b/asset/icon/Icon16/control_play_blue.png differ diff --git a/asset/icon/Icon16/control_power.png b/asset/icon/Icon16/control_power.png new file mode 100644 index 0000000..b8f55ad Binary files /dev/null and b/asset/icon/Icon16/control_power.png differ diff --git a/asset/icon/Icon16/control_power_blue.png b/asset/icon/Icon16/control_power_blue.png new file mode 100644 index 0000000..d4e84c2 Binary files /dev/null and b/asset/icon/Icon16/control_power_blue.png differ diff --git a/asset/icon/Icon16/control_repeat.png b/asset/icon/Icon16/control_repeat.png new file mode 100644 index 0000000..c54ba86 Binary files /dev/null and b/asset/icon/Icon16/control_repeat.png differ diff --git a/asset/icon/Icon16/control_repeat_blue.png b/asset/icon/Icon16/control_repeat_blue.png new file mode 100644 index 0000000..bc323e3 Binary files /dev/null and b/asset/icon/Icon16/control_repeat_blue.png differ diff --git a/asset/icon/Icon16/control_rewind.png b/asset/icon/Icon16/control_rewind.png new file mode 100644 index 0000000..5608c02 Binary files /dev/null and b/asset/icon/Icon16/control_rewind.png differ diff --git a/asset/icon/Icon16/control_rewind_blue.png b/asset/icon/Icon16/control_rewind_blue.png new file mode 100644 index 0000000..e48be05 Binary files /dev/null and b/asset/icon/Icon16/control_rewind_blue.png differ diff --git a/asset/icon/Icon16/control_start.png b/asset/icon/Icon16/control_start.png new file mode 100644 index 0000000..df00cc3 Binary files /dev/null and b/asset/icon/Icon16/control_start.png differ diff --git a/asset/icon/Icon16/control_start_blue.png b/asset/icon/Icon16/control_start_blue.png new file mode 100644 index 0000000..172a73c Binary files /dev/null and b/asset/icon/Icon16/control_start_blue.png differ diff --git a/asset/icon/Icon16/control_stop.png b/asset/icon/Icon16/control_stop.png new file mode 100644 index 0000000..0cbe9b6 Binary files /dev/null and b/asset/icon/Icon16/control_stop.png differ diff --git a/asset/icon/Icon16/control_stop_blue.png b/asset/icon/Icon16/control_stop_blue.png new file mode 100644 index 0000000..34831bc Binary files /dev/null and b/asset/icon/Icon16/control_stop_blue.png differ diff --git a/asset/icon/Icon16/controlbar.png b/asset/icon/Icon16/controlbar.png new file mode 100644 index 0000000..8b9d141 Binary files /dev/null and b/asset/icon/Icon16/controlbar.png differ diff --git a/asset/icon/Icon16/controller.png b/asset/icon/Icon16/controller.png new file mode 100644 index 0000000..fd281bb Binary files /dev/null and b/asset/icon/Icon16/controller.png differ diff --git a/asset/icon/Icon16/controller_add.png b/asset/icon/Icon16/controller_add.png new file mode 100644 index 0000000..842745f Binary files /dev/null and b/asset/icon/Icon16/controller_add.png differ diff --git a/asset/icon/Icon16/controller_delete.png b/asset/icon/Icon16/controller_delete.png new file mode 100644 index 0000000..356a391 Binary files /dev/null and b/asset/icon/Icon16/controller_delete.png differ diff --git a/asset/icon/Icon16/controller_error.png b/asset/icon/Icon16/controller_error.png new file mode 100644 index 0000000..cb9de9b Binary files /dev/null and b/asset/icon/Icon16/controller_error.png differ diff --git a/asset/icon/Icon16/conversion_of_currency.png b/asset/icon/Icon16/conversion_of_currency.png new file mode 100644 index 0000000..79bd529 Binary files /dev/null and b/asset/icon/Icon16/conversion_of_currency.png differ diff --git a/asset/icon/Icon16/convert_color_to_gray.png b/asset/icon/Icon16/convert_color_to_gray.png new file mode 100644 index 0000000..b49686e Binary files /dev/null and b/asset/icon/Icon16/convert_color_to_gray.png differ diff --git a/asset/icon/Icon16/convert_gray_to_color.png b/asset/icon/Icon16/convert_gray_to_color.png new file mode 100644 index 0000000..511ed66 Binary files /dev/null and b/asset/icon/Icon16/convert_gray_to_color.png differ diff --git a/asset/icon/Icon16/cookie_chocolate.png b/asset/icon/Icon16/cookie_chocolate.png new file mode 100644 index 0000000..d68f287 Binary files /dev/null and b/asset/icon/Icon16/cookie_chocolate.png differ diff --git a/asset/icon/Icon16/cookies.png b/asset/icon/Icon16/cookies.png new file mode 100644 index 0000000..2fdc0f5 Binary files /dev/null and b/asset/icon/Icon16/cookies.png differ diff --git a/asset/icon/Icon16/cooler.png b/asset/icon/Icon16/cooler.png new file mode 100644 index 0000000..879afa4 Binary files /dev/null and b/asset/icon/Icon16/cooler.png differ diff --git a/asset/icon/Icon16/copying_and_distribution.png b/asset/icon/Icon16/copying_and_distribution.png new file mode 100644 index 0000000..21b73a5 Binary files /dev/null and b/asset/icon/Icon16/copying_and_distribution.png differ diff --git a/asset/icon/Icon16/copyleft.png b/asset/icon/Icon16/copyleft.png new file mode 100644 index 0000000..d03bbef Binary files /dev/null and b/asset/icon/Icon16/copyleft.png differ diff --git a/asset/icon/Icon16/counter.png b/asset/icon/Icon16/counter.png new file mode 100644 index 0000000..25645cd Binary files /dev/null and b/asset/icon/Icon16/counter.png differ diff --git a/asset/icon/Icon16/cpanel.png b/asset/icon/Icon16/cpanel.png new file mode 100644 index 0000000..a938e4d Binary files /dev/null and b/asset/icon/Icon16/cpanel.png differ diff --git a/asset/icon/Icon16/create_from_selection.png b/asset/icon/Icon16/create_from_selection.png new file mode 100644 index 0000000..a35eca9 Binary files /dev/null and b/asset/icon/Icon16/create_from_selection.png differ diff --git a/asset/icon/Icon16/creative_commons.png b/asset/icon/Icon16/creative_commons.png new file mode 100644 index 0000000..9d56246 Binary files /dev/null and b/asset/icon/Icon16/creative_commons.png differ diff --git a/asset/icon/Icon16/credit.png b/asset/icon/Icon16/credit.png new file mode 100644 index 0000000..a19f5f2 Binary files /dev/null and b/asset/icon/Icon16/credit.png differ diff --git a/asset/icon/Icon16/creditcards.png b/asset/icon/Icon16/creditcards.png new file mode 100644 index 0000000..90b1fb4 Binary files /dev/null and b/asset/icon/Icon16/creditcards.png differ diff --git a/asset/icon/Icon16/cricket.png b/asset/icon/Icon16/cricket.png new file mode 100644 index 0000000..298c74a Binary files /dev/null and b/asset/icon/Icon16/cricket.png differ diff --git a/asset/icon/Icon16/cross.png b/asset/icon/Icon16/cross.png new file mode 100644 index 0000000..33a3837 Binary files /dev/null and b/asset/icon/Icon16/cross.png differ diff --git a/asset/icon/Icon16/cross_promotion_selling.png b/asset/icon/Icon16/cross_promotion_selling.png new file mode 100644 index 0000000..d8bfcdf Binary files /dev/null and b/asset/icon/Icon16/cross_promotion_selling.png differ diff --git a/asset/icon/Icon16/cross_reference.png b/asset/icon/Icon16/cross_reference.png new file mode 100644 index 0000000..dc974c6 Binary files /dev/null and b/asset/icon/Icon16/cross_reference.png differ diff --git a/asset/icon/Icon16/cross_shield.png b/asset/icon/Icon16/cross_shield.png new file mode 100644 index 0000000..7bb8214 Binary files /dev/null and b/asset/icon/Icon16/cross_shield.png differ diff --git a/asset/icon/Icon16/crown_bronze.png b/asset/icon/Icon16/crown_bronze.png new file mode 100644 index 0000000..1d504fd Binary files /dev/null and b/asset/icon/Icon16/crown_bronze.png differ diff --git a/asset/icon/Icon16/crown_gold.png b/asset/icon/Icon16/crown_gold.png new file mode 100644 index 0000000..c276d0f Binary files /dev/null and b/asset/icon/Icon16/crown_gold.png differ diff --git a/asset/icon/Icon16/crown_silver.png b/asset/icon/Icon16/crown_silver.png new file mode 100644 index 0000000..8a6f859 Binary files /dev/null and b/asset/icon/Icon16/crown_silver.png differ diff --git a/asset/icon/Icon16/cruise_ship.png b/asset/icon/Icon16/cruise_ship.png new file mode 100644 index 0000000..1c8f8ed Binary files /dev/null and b/asset/icon/Icon16/cruise_ship.png differ diff --git a/asset/icon/Icon16/css.png b/asset/icon/Icon16/css.png new file mode 100644 index 0000000..5bb1aa7 Binary files /dev/null and b/asset/icon/Icon16/css.png differ diff --git a/asset/icon/Icon16/css_3.png b/asset/icon/Icon16/css_3.png new file mode 100644 index 0000000..c53c1a3 Binary files /dev/null and b/asset/icon/Icon16/css_3.png differ diff --git a/asset/icon/Icon16/css_add.png b/asset/icon/Icon16/css_add.png new file mode 100644 index 0000000..b4443e4 Binary files /dev/null and b/asset/icon/Icon16/css_add.png differ diff --git a/asset/icon/Icon16/css_delete.png b/asset/icon/Icon16/css_delete.png new file mode 100644 index 0000000..917d535 Binary files /dev/null and b/asset/icon/Icon16/css_delete.png differ diff --git a/asset/icon/Icon16/css_go.png b/asset/icon/Icon16/css_go.png new file mode 100644 index 0000000..20245dc Binary files /dev/null and b/asset/icon/Icon16/css_go.png differ diff --git a/asset/icon/Icon16/css_valid.png b/asset/icon/Icon16/css_valid.png new file mode 100644 index 0000000..5d9695e Binary files /dev/null and b/asset/icon/Icon16/css_valid.png differ diff --git a/asset/icon/Icon16/cup.png b/asset/icon/Icon16/cup.png new file mode 100644 index 0000000..9e234da Binary files /dev/null and b/asset/icon/Icon16/cup.png differ diff --git a/asset/icon/Icon16/cup_add.png b/asset/icon/Icon16/cup_add.png new file mode 100644 index 0000000..613d87b Binary files /dev/null and b/asset/icon/Icon16/cup_add.png differ diff --git a/asset/icon/Icon16/cup_bronze.png b/asset/icon/Icon16/cup_bronze.png new file mode 100644 index 0000000..7d8128b Binary files /dev/null and b/asset/icon/Icon16/cup_bronze.png differ diff --git a/asset/icon/Icon16/cup_delete.png b/asset/icon/Icon16/cup_delete.png new file mode 100644 index 0000000..a3d833e Binary files /dev/null and b/asset/icon/Icon16/cup_delete.png differ diff --git a/asset/icon/Icon16/cup_edit.png b/asset/icon/Icon16/cup_edit.png new file mode 100644 index 0000000..ec2edd1 Binary files /dev/null and b/asset/icon/Icon16/cup_edit.png differ diff --git a/asset/icon/Icon16/cup_error.png b/asset/icon/Icon16/cup_error.png new file mode 100644 index 0000000..3dd9e74 Binary files /dev/null and b/asset/icon/Icon16/cup_error.png differ diff --git a/asset/icon/Icon16/cup_go.png b/asset/icon/Icon16/cup_go.png new file mode 100644 index 0000000..698f683 Binary files /dev/null and b/asset/icon/Icon16/cup_go.png differ diff --git a/asset/icon/Icon16/cup_gold.png b/asset/icon/Icon16/cup_gold.png new file mode 100644 index 0000000..d4df38d Binary files /dev/null and b/asset/icon/Icon16/cup_gold.png differ diff --git a/asset/icon/Icon16/cup_key.png b/asset/icon/Icon16/cup_key.png new file mode 100644 index 0000000..db483d9 Binary files /dev/null and b/asset/icon/Icon16/cup_key.png differ diff --git a/asset/icon/Icon16/cup_link.png b/asset/icon/Icon16/cup_link.png new file mode 100644 index 0000000..63666b4 Binary files /dev/null and b/asset/icon/Icon16/cup_link.png differ diff --git a/asset/icon/Icon16/cup_silver.png b/asset/icon/Icon16/cup_silver.png new file mode 100644 index 0000000..fa66c66 Binary files /dev/null and b/asset/icon/Icon16/cup_silver.png differ diff --git a/asset/icon/Icon16/curriculum_vitae.png b/asset/icon/Icon16/curriculum_vitae.png new file mode 100644 index 0000000..aef8f42 Binary files /dev/null and b/asset/icon/Icon16/curriculum_vitae.png differ diff --git a/asset/icon/Icon16/cursor.png b/asset/icon/Icon16/cursor.png new file mode 100644 index 0000000..0382407 Binary files /dev/null and b/asset/icon/Icon16/cursor.png differ diff --git a/asset/icon/Icon16/cursor_lifebuoy.png b/asset/icon/Icon16/cursor_lifebuoy.png new file mode 100644 index 0000000..f0f79be Binary files /dev/null and b/asset/icon/Icon16/cursor_lifebuoy.png differ diff --git a/asset/icon/Icon16/curtain.png b/asset/icon/Icon16/curtain.png new file mode 100644 index 0000000..163f727 Binary files /dev/null and b/asset/icon/Icon16/curtain.png differ diff --git a/asset/icon/Icon16/cushion.png b/asset/icon/Icon16/cushion.png new file mode 100644 index 0000000..864ca11 Binary files /dev/null and b/asset/icon/Icon16/cushion.png differ diff --git a/asset/icon/Icon16/custom_slide_show.png b/asset/icon/Icon16/custom_slide_show.png new file mode 100644 index 0000000..b0a5742 Binary files /dev/null and b/asset/icon/Icon16/custom_slide_show.png differ diff --git a/asset/icon/Icon16/cut.png b/asset/icon/Icon16/cut.png new file mode 100644 index 0000000..9a0ae03 Binary files /dev/null and b/asset/icon/Icon16/cut.png differ diff --git a/asset/icon/Icon16/cut_red.png b/asset/icon/Icon16/cut_red.png new file mode 100644 index 0000000..119641a Binary files /dev/null and b/asset/icon/Icon16/cut_red.png differ diff --git a/asset/icon/Icon16/cutleries.png b/asset/icon/Icon16/cutleries.png new file mode 100644 index 0000000..688d8da Binary files /dev/null and b/asset/icon/Icon16/cutleries.png differ diff --git a/asset/icon/Icon16/cutlery.png b/asset/icon/Icon16/cutlery.png new file mode 100644 index 0000000..ab33e5b Binary files /dev/null and b/asset/icon/Icon16/cutlery.png differ diff --git a/asset/icon/Icon16/cutter.png b/asset/icon/Icon16/cutter.png new file mode 100644 index 0000000..fbd05da Binary files /dev/null and b/asset/icon/Icon16/cutter.png differ diff --git a/asset/icon/Icon16/dashboard.png b/asset/icon/Icon16/dashboard.png new file mode 100644 index 0000000..2150eaf Binary files /dev/null and b/asset/icon/Icon16/dashboard.png differ diff --git a/asset/icon/Icon16/data_chooser.png b/asset/icon/Icon16/data_chooser.png new file mode 100644 index 0000000..25c82dd Binary files /dev/null and b/asset/icon/Icon16/data_chooser.png differ diff --git a/asset/icon/Icon16/data_field.png b/asset/icon/Icon16/data_field.png new file mode 100644 index 0000000..3f06ef5 Binary files /dev/null and b/asset/icon/Icon16/data_field.png differ diff --git a/asset/icon/Icon16/data_grid.png b/asset/icon/Icon16/data_grid.png new file mode 100644 index 0000000..3a68ed8 Binary files /dev/null and b/asset/icon/Icon16/data_grid.png differ diff --git a/asset/icon/Icon16/data_sort.png b/asset/icon/Icon16/data_sort.png new file mode 100644 index 0000000..9417615 Binary files /dev/null and b/asset/icon/Icon16/data_sort.png differ diff --git a/asset/icon/Icon16/data_table.png b/asset/icon/Icon16/data_table.png new file mode 100644 index 0000000..6073bbf Binary files /dev/null and b/asset/icon/Icon16/data_table.png differ diff --git a/asset/icon/Icon16/data_time_functions.png b/asset/icon/Icon16/data_time_functions.png new file mode 100644 index 0000000..3421b43 Binary files /dev/null and b/asset/icon/Icon16/data_time_functions.png differ diff --git a/asset/icon/Icon16/data_validation.png b/asset/icon/Icon16/data_validation.png new file mode 100644 index 0000000..0cfcbc3 Binary files /dev/null and b/asset/icon/Icon16/data_validation.png differ diff --git a/asset/icon/Icon16/database.png b/asset/icon/Icon16/database.png new file mode 100644 index 0000000..ffc935d Binary files /dev/null and b/asset/icon/Icon16/database.png differ diff --git a/asset/icon/Icon16/database_access.png b/asset/icon/Icon16/database_access.png new file mode 100644 index 0000000..5c58069 Binary files /dev/null and b/asset/icon/Icon16/database_access.png differ diff --git a/asset/icon/Icon16/database_add.png b/asset/icon/Icon16/database_add.png new file mode 100644 index 0000000..4550ac2 Binary files /dev/null and b/asset/icon/Icon16/database_add.png differ diff --git a/asset/icon/Icon16/database_black.png b/asset/icon/Icon16/database_black.png new file mode 100644 index 0000000..c4de3ef Binary files /dev/null and b/asset/icon/Icon16/database_black.png differ diff --git a/asset/icon/Icon16/database_blue.png b/asset/icon/Icon16/database_blue.png new file mode 100644 index 0000000..96ddef3 Binary files /dev/null and b/asset/icon/Icon16/database_blue.png differ diff --git a/asset/icon/Icon16/database_connect.png b/asset/icon/Icon16/database_connect.png new file mode 100644 index 0000000..e7dbcee Binary files /dev/null and b/asset/icon/Icon16/database_connect.png differ diff --git a/asset/icon/Icon16/database_delete.png b/asset/icon/Icon16/database_delete.png new file mode 100644 index 0000000..56d6346 Binary files /dev/null and b/asset/icon/Icon16/database_delete.png differ diff --git a/asset/icon/Icon16/database_edit.png b/asset/icon/Icon16/database_edit.png new file mode 100644 index 0000000..7d88a5d Binary files /dev/null and b/asset/icon/Icon16/database_edit.png differ diff --git a/asset/icon/Icon16/database_error.png b/asset/icon/Icon16/database_error.png new file mode 100644 index 0000000..b52abcc Binary files /dev/null and b/asset/icon/Icon16/database_error.png differ diff --git a/asset/icon/Icon16/database_gear.png b/asset/icon/Icon16/database_gear.png new file mode 100644 index 0000000..c736dac Binary files /dev/null and b/asset/icon/Icon16/database_gear.png differ diff --git a/asset/icon/Icon16/database_go.png b/asset/icon/Icon16/database_go.png new file mode 100644 index 0000000..9025c86 Binary files /dev/null and b/asset/icon/Icon16/database_go.png differ diff --git a/asset/icon/Icon16/database_green.png b/asset/icon/Icon16/database_green.png new file mode 100644 index 0000000..91c401b Binary files /dev/null and b/asset/icon/Icon16/database_green.png differ diff --git a/asset/icon/Icon16/database_key.png b/asset/icon/Icon16/database_key.png new file mode 100644 index 0000000..201b3b2 Binary files /dev/null and b/asset/icon/Icon16/database_key.png differ diff --git a/asset/icon/Icon16/database_lightning.png b/asset/icon/Icon16/database_lightning.png new file mode 100644 index 0000000..a15b536 Binary files /dev/null and b/asset/icon/Icon16/database_lightning.png differ diff --git a/asset/icon/Icon16/database_link.png b/asset/icon/Icon16/database_link.png new file mode 100644 index 0000000..9cd1d0a Binary files /dev/null and b/asset/icon/Icon16/database_link.png differ diff --git a/asset/icon/Icon16/database_mysql_php.png b/asset/icon/Icon16/database_mysql_php.png new file mode 100644 index 0000000..cd33ebe Binary files /dev/null and b/asset/icon/Icon16/database_mysql_php.png differ diff --git a/asset/icon/Icon16/database_red.png b/asset/icon/Icon16/database_red.png new file mode 100644 index 0000000..4766cb8 Binary files /dev/null and b/asset/icon/Icon16/database_red.png differ diff --git a/asset/icon/Icon16/database_refresh.png b/asset/icon/Icon16/database_refresh.png new file mode 100644 index 0000000..a0500fc Binary files /dev/null and b/asset/icon/Icon16/database_refresh.png differ diff --git a/asset/icon/Icon16/database_save.png b/asset/icon/Icon16/database_save.png new file mode 100644 index 0000000..6eef15c Binary files /dev/null and b/asset/icon/Icon16/database_save.png differ diff --git a/asset/icon/Icon16/database_server.png b/asset/icon/Icon16/database_server.png new file mode 100644 index 0000000..7f3b849 Binary files /dev/null and b/asset/icon/Icon16/database_server.png differ diff --git a/asset/icon/Icon16/database_table.png b/asset/icon/Icon16/database_table.png new file mode 100644 index 0000000..1e8dffc Binary files /dev/null and b/asset/icon/Icon16/database_table.png differ diff --git a/asset/icon/Icon16/database_yellow.png b/asset/icon/Icon16/database_yellow.png new file mode 100644 index 0000000..45858a1 Binary files /dev/null and b/asset/icon/Icon16/database_yellow.png differ diff --git a/asset/icon/Icon16/date.png b/asset/icon/Icon16/date.png new file mode 100644 index 0000000..945af71 Binary files /dev/null and b/asset/icon/Icon16/date.png differ diff --git a/asset/icon/Icon16/date_add.png b/asset/icon/Icon16/date_add.png new file mode 100644 index 0000000..6f31086 Binary files /dev/null and b/asset/icon/Icon16/date_add.png differ diff --git a/asset/icon/Icon16/date_delete.png b/asset/icon/Icon16/date_delete.png new file mode 100644 index 0000000..36540d4 Binary files /dev/null and b/asset/icon/Icon16/date_delete.png differ diff --git a/asset/icon/Icon16/date_edit.png b/asset/icon/Icon16/date_edit.png new file mode 100644 index 0000000..7b16e57 Binary files /dev/null and b/asset/icon/Icon16/date_edit.png differ diff --git a/asset/icon/Icon16/date_error.png b/asset/icon/Icon16/date_error.png new file mode 100644 index 0000000..639cfb9 Binary files /dev/null and b/asset/icon/Icon16/date_error.png differ diff --git a/asset/icon/Icon16/date_go.png b/asset/icon/Icon16/date_go.png new file mode 100644 index 0000000..9797ce0 Binary files /dev/null and b/asset/icon/Icon16/date_go.png differ diff --git a/asset/icon/Icon16/date_link.png b/asset/icon/Icon16/date_link.png new file mode 100644 index 0000000..fdb32e1 Binary files /dev/null and b/asset/icon/Icon16/date_link.png differ diff --git a/asset/icon/Icon16/date_magnify.png b/asset/icon/Icon16/date_magnify.png new file mode 100644 index 0000000..d17a05b Binary files /dev/null and b/asset/icon/Icon16/date_magnify.png differ diff --git a/asset/icon/Icon16/date_next.png b/asset/icon/Icon16/date_next.png new file mode 100644 index 0000000..d473f86 Binary files /dev/null and b/asset/icon/Icon16/date_next.png differ diff --git a/asset/icon/Icon16/date_next_gray.png b/asset/icon/Icon16/date_next_gray.png new file mode 100644 index 0000000..99b1316 Binary files /dev/null and b/asset/icon/Icon16/date_next_gray.png differ diff --git a/asset/icon/Icon16/date_previous.png b/asset/icon/Icon16/date_previous.png new file mode 100644 index 0000000..ac24c3a Binary files /dev/null and b/asset/icon/Icon16/date_previous.png differ diff --git a/asset/icon/Icon16/date_previous_gray.png b/asset/icon/Icon16/date_previous_gray.png new file mode 100644 index 0000000..7c3b2e0 Binary files /dev/null and b/asset/icon/Icon16/date_previous_gray.png differ diff --git a/asset/icon/Icon16/date_relation.png b/asset/icon/Icon16/date_relation.png new file mode 100644 index 0000000..2280e1a Binary files /dev/null and b/asset/icon/Icon16/date_relation.png differ diff --git a/asset/icon/Icon16/date_task.png b/asset/icon/Icon16/date_task.png new file mode 100644 index 0000000..41ac590 Binary files /dev/null and b/asset/icon/Icon16/date_task.png differ diff --git a/asset/icon/Icon16/ddr_memory.png b/asset/icon/Icon16/ddr_memory.png new file mode 100644 index 0000000..1079c17 Binary files /dev/null and b/asset/icon/Icon16/ddr_memory.png differ diff --git a/asset/icon/Icon16/debian.png b/asset/icon/Icon16/debian.png new file mode 100644 index 0000000..8f97ca9 Binary files /dev/null and b/asset/icon/Icon16/debian.png differ diff --git a/asset/icon/Icon16/decimal_less.png b/asset/icon/Icon16/decimal_less.png new file mode 100644 index 0000000..531a010 Binary files /dev/null and b/asset/icon/Icon16/decimal_less.png differ diff --git a/asset/icon/Icon16/decimal_more.png b/asset/icon/Icon16/decimal_more.png new file mode 100644 index 0000000..8ff7837 Binary files /dev/null and b/asset/icon/Icon16/decimal_more.png differ diff --git a/asset/icon/Icon16/default_value.png b/asset/icon/Icon16/default_value.png new file mode 100644 index 0000000..6aeec51 Binary files /dev/null and b/asset/icon/Icon16/default_value.png differ diff --git a/asset/icon/Icon16/define_name.png b/asset/icon/Icon16/define_name.png new file mode 100644 index 0000000..eb7519f Binary files /dev/null and b/asset/icon/Icon16/define_name.png differ diff --git a/asset/icon/Icon16/defoult_address.png b/asset/icon/Icon16/defoult_address.png new file mode 100644 index 0000000..8529d0a Binary files /dev/null and b/asset/icon/Icon16/defoult_address.png differ diff --git a/asset/icon/Icon16/delete.png b/asset/icon/Icon16/delete.png new file mode 100644 index 0000000..ace289e Binary files /dev/null and b/asset/icon/Icon16/delete.png differ diff --git a/asset/icon/Icon16/delete_dns_zone.png b/asset/icon/Icon16/delete_dns_zone.png new file mode 100644 index 0000000..462b6c6 Binary files /dev/null and b/asset/icon/Icon16/delete_dns_zone.png differ diff --git a/asset/icon/Icon16/delete_package.png b/asset/icon/Icon16/delete_package.png new file mode 100644 index 0000000..1132d67 Binary files /dev/null and b/asset/icon/Icon16/delete_package.png differ diff --git a/asset/icon/Icon16/delicious.png b/asset/icon/Icon16/delicious.png new file mode 100644 index 0000000..94536c8 Binary files /dev/null and b/asset/icon/Icon16/delicious.png differ diff --git a/asset/icon/Icon16/derivatives.png b/asset/icon/Icon16/derivatives.png new file mode 100644 index 0000000..e26ddd0 Binary files /dev/null and b/asset/icon/Icon16/derivatives.png differ diff --git a/asset/icon/Icon16/design_float.png b/asset/icon/Icon16/design_float.png new file mode 100644 index 0000000..fc2a95c Binary files /dev/null and b/asset/icon/Icon16/design_float.png differ diff --git a/asset/icon/Icon16/designmoo.png b/asset/icon/Icon16/designmoo.png new file mode 100644 index 0000000..e2021fa Binary files /dev/null and b/asset/icon/Icon16/designmoo.png differ diff --git a/asset/icon/Icon16/desktop.png b/asset/icon/Icon16/desktop.png new file mode 100644 index 0000000..6bee5ee Binary files /dev/null and b/asset/icon/Icon16/desktop.png differ diff --git a/asset/icon/Icon16/desktop_network.png b/asset/icon/Icon16/desktop_network.png new file mode 100644 index 0000000..d127043 Binary files /dev/null and b/asset/icon/Icon16/desktop_network.png differ diff --git a/asset/icon/Icon16/devianart.png b/asset/icon/Icon16/devianart.png new file mode 100644 index 0000000..f016d36 Binary files /dev/null and b/asset/icon/Icon16/devianart.png differ diff --git a/asset/icon/Icon16/diagnostic_chart.png b/asset/icon/Icon16/diagnostic_chart.png new file mode 100644 index 0000000..60713d1 Binary files /dev/null and b/asset/icon/Icon16/diagnostic_chart.png differ diff --git a/asset/icon/Icon16/diagramm.png b/asset/icon/Icon16/diagramm.png new file mode 100644 index 0000000..83f75d9 Binary files /dev/null and b/asset/icon/Icon16/diagramm.png differ diff --git a/asset/icon/Icon16/dialog.png b/asset/icon/Icon16/dialog.png new file mode 100644 index 0000000..dce2625 Binary files /dev/null and b/asset/icon/Icon16/dialog.png differ diff --git a/asset/icon/Icon16/diamond.png b/asset/icon/Icon16/diamond.png new file mode 100644 index 0000000..e25a716 Binary files /dev/null and b/asset/icon/Icon16/diamond.png differ diff --git a/asset/icon/Icon16/dice.png b/asset/icon/Icon16/dice.png new file mode 100644 index 0000000..3bbdbdf Binary files /dev/null and b/asset/icon/Icon16/dice.png differ diff --git a/asset/icon/Icon16/digg.png b/asset/icon/Icon16/digg.png new file mode 100644 index 0000000..0ec071c Binary files /dev/null and b/asset/icon/Icon16/digg.png differ diff --git a/asset/icon/Icon16/digit_separator.png b/asset/icon/Icon16/digit_separator.png new file mode 100644 index 0000000..aeb38ce Binary files /dev/null and b/asset/icon/Icon16/digit_separator.png differ diff --git a/asset/icon/Icon16/digital_signature.png b/asset/icon/Icon16/digital_signature.png new file mode 100644 index 0000000..7e3fd80 Binary files /dev/null and b/asset/icon/Icon16/digital_signature.png differ diff --git a/asset/icon/Icon16/digital_signature_pen.png b/asset/icon/Icon16/digital_signature_pen.png new file mode 100644 index 0000000..a55586b Binary files /dev/null and b/asset/icon/Icon16/digital_signature_pen.png differ diff --git a/asset/icon/Icon16/dinersclub.png b/asset/icon/Icon16/dinersclub.png new file mode 100644 index 0000000..3af0e1a Binary files /dev/null and b/asset/icon/Icon16/dinersclub.png differ diff --git a/asset/icon/Icon16/direction.png b/asset/icon/Icon16/direction.png new file mode 100644 index 0000000..668bece Binary files /dev/null and b/asset/icon/Icon16/direction.png differ diff --git a/asset/icon/Icon16/directory_listing.png b/asset/icon/Icon16/directory_listing.png new file mode 100644 index 0000000..0a85e44 Binary files /dev/null and b/asset/icon/Icon16/directory_listing.png differ diff --git a/asset/icon/Icon16/disable_enable_demo_mode.png b/asset/icon/Icon16/disable_enable_demo_mode.png new file mode 100644 index 0000000..8540833 Binary files /dev/null and b/asset/icon/Icon16/disable_enable_demo_mode.png differ diff --git a/asset/icon/Icon16/disconnect.png b/asset/icon/Icon16/disconnect.png new file mode 100644 index 0000000..7f23224 Binary files /dev/null and b/asset/icon/Icon16/disconnect.png differ diff --git a/asset/icon/Icon16/discover.png b/asset/icon/Icon16/discover.png new file mode 100644 index 0000000..79c4df8 Binary files /dev/null and b/asset/icon/Icon16/discover.png differ diff --git a/asset/icon/Icon16/dish.png b/asset/icon/Icon16/dish.png new file mode 100644 index 0000000..cccf186 Binary files /dev/null and b/asset/icon/Icon16/dish.png differ diff --git a/asset/icon/Icon16/disk.png b/asset/icon/Icon16/disk.png new file mode 100644 index 0000000..d0d400e Binary files /dev/null and b/asset/icon/Icon16/disk.png differ diff --git a/asset/icon/Icon16/disk_multiple.png b/asset/icon/Icon16/disk_multiple.png new file mode 100644 index 0000000..08c382f Binary files /dev/null and b/asset/icon/Icon16/disk_multiple.png differ diff --git a/asset/icon/Icon16/disk_space.png b/asset/icon/Icon16/disk_space.png new file mode 100644 index 0000000..0fc6866 Binary files /dev/null and b/asset/icon/Icon16/disk_space.png differ diff --git a/asset/icon/Icon16/distribution_partnerships.png b/asset/icon/Icon16/distribution_partnerships.png new file mode 100644 index 0000000..c0ab059 Binary files /dev/null and b/asset/icon/Icon16/distribution_partnerships.png differ diff --git a/asset/icon/Icon16/dns.png b/asset/icon/Icon16/dns.png new file mode 100644 index 0000000..c790aba Binary files /dev/null and b/asset/icon/Icon16/dns.png differ diff --git a/asset/icon/Icon16/dns_functions.png b/asset/icon/Icon16/dns_functions.png new file mode 100644 index 0000000..dcecc4e Binary files /dev/null and b/asset/icon/Icon16/dns_functions.png differ diff --git a/asset/icon/Icon16/dns_server.png b/asset/icon/Icon16/dns_server.png new file mode 100644 index 0000000..ebc2b06 Binary files /dev/null and b/asset/icon/Icon16/dns_server.png differ diff --git a/asset/icon/Icon16/dns_setting.png b/asset/icon/Icon16/dns_setting.png new file mode 100644 index 0000000..5cc61f2 Binary files /dev/null and b/asset/icon/Icon16/dns_setting.png differ diff --git a/asset/icon/Icon16/do_not_disturb.png b/asset/icon/Icon16/do_not_disturb.png new file mode 100644 index 0000000..d0ec472 Binary files /dev/null and b/asset/icon/Icon16/do_not_disturb.png differ diff --git a/asset/icon/Icon16/document_back.png b/asset/icon/Icon16/document_back.png new file mode 100644 index 0000000..3ec8e32 Binary files /dev/null and b/asset/icon/Icon16/document_back.png differ diff --git a/asset/icon/Icon16/document_background.png b/asset/icon/Icon16/document_background.png new file mode 100644 index 0000000..3cb08f0 Binary files /dev/null and b/asset/icon/Icon16/document_background.png differ diff --git a/asset/icon/Icon16/document_black.png b/asset/icon/Icon16/document_black.png new file mode 100644 index 0000000..ea5a2af Binary files /dev/null and b/asset/icon/Icon16/document_black.png differ diff --git a/asset/icon/Icon16/document_break.png b/asset/icon/Icon16/document_break.png new file mode 100644 index 0000000..b58c57d Binary files /dev/null and b/asset/icon/Icon16/document_break.png differ diff --git a/asset/icon/Icon16/document_center.png b/asset/icon/Icon16/document_center.png new file mode 100644 index 0000000..df5bedf Binary files /dev/null and b/asset/icon/Icon16/document_center.png differ diff --git a/asset/icon/Icon16/document_check_compatibility.png b/asset/icon/Icon16/document_check_compatibility.png new file mode 100644 index 0000000..c0efffb Binary files /dev/null and b/asset/icon/Icon16/document_check_compatibility.png differ diff --git a/asset/icon/Icon16/document_comment_above.png b/asset/icon/Icon16/document_comment_above.png new file mode 100644 index 0000000..52b4192 Binary files /dev/null and b/asset/icon/Icon16/document_comment_above.png differ diff --git a/asset/icon/Icon16/document_comment_behind.png b/asset/icon/Icon16/document_comment_behind.png new file mode 100644 index 0000000..568ce35 Binary files /dev/null and b/asset/icon/Icon16/document_comment_behind.png differ diff --git a/asset/icon/Icon16/document_comment_below.png b/asset/icon/Icon16/document_comment_below.png new file mode 100644 index 0000000..bfc689d Binary files /dev/null and b/asset/icon/Icon16/document_comment_below.png differ diff --git a/asset/icon/Icon16/document_comments.png b/asset/icon/Icon16/document_comments.png new file mode 100644 index 0000000..2562cf8 Binary files /dev/null and b/asset/icon/Icon16/document_comments.png differ diff --git a/asset/icon/Icon16/document_copies.png b/asset/icon/Icon16/document_copies.png new file mode 100644 index 0000000..32285ee Binary files /dev/null and b/asset/icon/Icon16/document_copies.png differ diff --git a/asset/icon/Icon16/document_editing.png b/asset/icon/Icon16/document_editing.png new file mode 100644 index 0000000..edb0d98 Binary files /dev/null and b/asset/icon/Icon16/document_editing.png differ diff --git a/asset/icon/Icon16/document_empty.png b/asset/icon/Icon16/document_empty.png new file mode 100644 index 0000000..711a8c1 Binary files /dev/null and b/asset/icon/Icon16/document_empty.png differ diff --git a/asset/icon/Icon16/document_export.png b/asset/icon/Icon16/document_export.png new file mode 100644 index 0000000..d28e843 Binary files /dev/null and b/asset/icon/Icon16/document_export.png differ diff --git a/asset/icon/Icon16/document_font.png b/asset/icon/Icon16/document_font.png new file mode 100644 index 0000000..f06ac73 Binary files /dev/null and b/asset/icon/Icon16/document_font.png differ diff --git a/asset/icon/Icon16/document_font_wizard.png b/asset/icon/Icon16/document_font_wizard.png new file mode 100644 index 0000000..b713f83 Binary files /dev/null and b/asset/icon/Icon16/document_font_wizard.png differ diff --git a/asset/icon/Icon16/document_green.png b/asset/icon/Icon16/document_green.png new file mode 100644 index 0000000..5624c3c Binary files /dev/null and b/asset/icon/Icon16/document_green.png differ diff --git a/asset/icon/Icon16/document_image.png b/asset/icon/Icon16/document_image.png new file mode 100644 index 0000000..9efb7f1 Binary files /dev/null and b/asset/icon/Icon16/document_image.png differ diff --git a/asset/icon/Icon16/document_image_hor.png b/asset/icon/Icon16/document_image_hor.png new file mode 100644 index 0000000..a6bf6bd Binary files /dev/null and b/asset/icon/Icon16/document_image_hor.png differ diff --git a/asset/icon/Icon16/document_image_ver.png b/asset/icon/Icon16/document_image_ver.png new file mode 100644 index 0000000..d903d8e Binary files /dev/null and b/asset/icon/Icon16/document_image_ver.png differ diff --git a/asset/icon/Icon16/document_import.png b/asset/icon/Icon16/document_import.png new file mode 100644 index 0000000..7a7227e Binary files /dev/null and b/asset/icon/Icon16/document_import.png differ diff --git a/asset/icon/Icon16/document_index.png b/asset/icon/Icon16/document_index.png new file mode 100644 index 0000000..95a4185 Binary files /dev/null and b/asset/icon/Icon16/document_index.png differ diff --git a/asset/icon/Icon16/document_info.png b/asset/icon/Icon16/document_info.png new file mode 100644 index 0000000..d6e5996 Binary files /dev/null and b/asset/icon/Icon16/document_info.png differ diff --git a/asset/icon/Icon16/document_insert.png b/asset/icon/Icon16/document_insert.png new file mode 100644 index 0000000..303bbd5 Binary files /dev/null and b/asset/icon/Icon16/document_insert.png differ diff --git a/asset/icon/Icon16/document_inspect.png b/asset/icon/Icon16/document_inspect.png new file mode 100644 index 0000000..9136d19 Binary files /dev/null and b/asset/icon/Icon16/document_inspect.png differ diff --git a/asset/icon/Icon16/document_inspector.png b/asset/icon/Icon16/document_inspector.png new file mode 100644 index 0000000..45f2d53 Binary files /dev/null and b/asset/icon/Icon16/document_inspector.png differ diff --git a/asset/icon/Icon16/document_layout.png b/asset/icon/Icon16/document_layout.png new file mode 100644 index 0000000..029379c Binary files /dev/null and b/asset/icon/Icon16/document_layout.png differ diff --git a/asset/icon/Icon16/document_margins.png b/asset/icon/Icon16/document_margins.png new file mode 100644 index 0000000..5b6a115 Binary files /dev/null and b/asset/icon/Icon16/document_margins.png differ diff --git a/asset/icon/Icon16/document_mark_as_final.png b/asset/icon/Icon16/document_mark_as_final.png new file mode 100644 index 0000000..f24ad0f Binary files /dev/null and b/asset/icon/Icon16/document_mark_as_final.png differ diff --git a/asset/icon/Icon16/document_move.png b/asset/icon/Icon16/document_move.png new file mode 100644 index 0000000..d57a19e Binary files /dev/null and b/asset/icon/Icon16/document_move.png differ diff --git a/asset/icon/Icon16/document_next.png b/asset/icon/Icon16/document_next.png new file mode 100644 index 0000000..5d698bf Binary files /dev/null and b/asset/icon/Icon16/document_next.png differ diff --git a/asset/icon/Icon16/document_notes.png b/asset/icon/Icon16/document_notes.png new file mode 100644 index 0000000..fa97908 Binary files /dev/null and b/asset/icon/Icon16/document_notes.png differ diff --git a/asset/icon/Icon16/document_page.png b/asset/icon/Icon16/document_page.png new file mode 100644 index 0000000..67fa5e0 Binary files /dev/null and b/asset/icon/Icon16/document_page.png differ diff --git a/asset/icon/Icon16/document_page_last.png b/asset/icon/Icon16/document_page_last.png new file mode 100644 index 0000000..c0cd021 Binary files /dev/null and b/asset/icon/Icon16/document_page_last.png differ diff --git a/asset/icon/Icon16/document_page_next.png b/asset/icon/Icon16/document_page_next.png new file mode 100644 index 0000000..f19efcd Binary files /dev/null and b/asset/icon/Icon16/document_page_next.png differ diff --git a/asset/icon/Icon16/document_page_previous.png b/asset/icon/Icon16/document_page_previous.png new file mode 100644 index 0000000..40bfafe Binary files /dev/null and b/asset/icon/Icon16/document_page_previous.png differ diff --git a/asset/icon/Icon16/document_plus.png b/asset/icon/Icon16/document_plus.png new file mode 100644 index 0000000..501d8e7 Binary files /dev/null and b/asset/icon/Icon16/document_plus.png differ diff --git a/asset/icon/Icon16/document_prepare.png b/asset/icon/Icon16/document_prepare.png new file mode 100644 index 0000000..4665ee4 Binary files /dev/null and b/asset/icon/Icon16/document_prepare.png differ diff --git a/asset/icon/Icon16/document_properties.png b/asset/icon/Icon16/document_properties.png new file mode 100644 index 0000000..4d73b8c Binary files /dev/null and b/asset/icon/Icon16/document_properties.png differ diff --git a/asset/icon/Icon16/document_protect.png b/asset/icon/Icon16/document_protect.png new file mode 100644 index 0000000..b41f0d4 Binary files /dev/null and b/asset/icon/Icon16/document_protect.png differ diff --git a/asset/icon/Icon16/document_quote.png b/asset/icon/Icon16/document_quote.png new file mode 100644 index 0000000..b6c638a Binary files /dev/null and b/asset/icon/Icon16/document_quote.png differ diff --git a/asset/icon/Icon16/document_red.png b/asset/icon/Icon16/document_red.png new file mode 100644 index 0000000..e9d7bef Binary files /dev/null and b/asset/icon/Icon16/document_red.png differ diff --git a/asset/icon/Icon16/document_redirect.png b/asset/icon/Icon16/document_redirect.png new file mode 100644 index 0000000..6094c89 Binary files /dev/null and b/asset/icon/Icon16/document_redirect.png differ diff --git a/asset/icon/Icon16/document_rename.png b/asset/icon/Icon16/document_rename.png new file mode 100644 index 0000000..b7a63d8 Binary files /dev/null and b/asset/icon/Icon16/document_rename.png differ diff --git a/asset/icon/Icon16/document_shapes.png b/asset/icon/Icon16/document_shapes.png new file mode 100644 index 0000000..1a283a2 Binary files /dev/null and b/asset/icon/Icon16/document_shapes.png differ diff --git a/asset/icon/Icon16/document_shred.png b/asset/icon/Icon16/document_shred.png new file mode 100644 index 0000000..75a4055 Binary files /dev/null and b/asset/icon/Icon16/document_shred.png differ diff --git a/asset/icon/Icon16/document_signature.png b/asset/icon/Icon16/document_signature.png new file mode 100644 index 0000000..dd2ab8e Binary files /dev/null and b/asset/icon/Icon16/document_signature.png differ diff --git a/asset/icon/Icon16/document_spacing.png b/asset/icon/Icon16/document_spacing.png new file mode 100644 index 0000000..618223f Binary files /dev/null and b/asset/icon/Icon16/document_spacing.png differ diff --git a/asset/icon/Icon16/document_split.png b/asset/icon/Icon16/document_split.png new file mode 100644 index 0000000..a9680c3 Binary files /dev/null and b/asset/icon/Icon16/document_split.png differ diff --git a/asset/icon/Icon16/document_stand.png b/asset/icon/Icon16/document_stand.png new file mode 100644 index 0000000..43d5210 Binary files /dev/null and b/asset/icon/Icon16/document_stand.png differ diff --git a/asset/icon/Icon16/document_tag(2).png b/asset/icon/Icon16/document_tag(2).png new file mode 100644 index 0000000..6eb786c Binary files /dev/null and b/asset/icon/Icon16/document_tag(2).png differ diff --git a/asset/icon/Icon16/document_tag.png b/asset/icon/Icon16/document_tag.png new file mode 100644 index 0000000..d0b4aac Binary files /dev/null and b/asset/icon/Icon16/document_tag.png differ diff --git a/asset/icon/Icon16/document_todo.png b/asset/icon/Icon16/document_todo.png new file mode 100644 index 0000000..ed7a0a5 Binary files /dev/null and b/asset/icon/Icon16/document_todo.png differ diff --git a/asset/icon/Icon16/document_torn.png b/asset/icon/Icon16/document_torn.png new file mode 100644 index 0000000..9a9c3af Binary files /dev/null and b/asset/icon/Icon16/document_torn.png differ diff --git a/asset/icon/Icon16/document_tree.png b/asset/icon/Icon16/document_tree.png new file mode 100644 index 0000000..a018c90 Binary files /dev/null and b/asset/icon/Icon16/document_tree.png differ diff --git a/asset/icon/Icon16/document_valid.png b/asset/icon/Icon16/document_valid.png new file mode 100644 index 0000000..e55d6f2 Binary files /dev/null and b/asset/icon/Icon16/document_valid.png differ diff --git a/asset/icon/Icon16/document_vertical.png b/asset/icon/Icon16/document_vertical.png new file mode 100644 index 0000000..84f8761 Binary files /dev/null and b/asset/icon/Icon16/document_vertical.png differ diff --git a/asset/icon/Icon16/document_view_book.png b/asset/icon/Icon16/document_view_book.png new file mode 100644 index 0000000..0043e5e Binary files /dev/null and b/asset/icon/Icon16/document_view_book.png differ diff --git a/asset/icon/Icon16/document_white_torn.png b/asset/icon/Icon16/document_white_torn.png new file mode 100644 index 0000000..f8bc5f9 Binary files /dev/null and b/asset/icon/Icon16/document_white_torn.png differ diff --git a/asset/icon/Icon16/document_yellow.png b/asset/icon/Icon16/document_yellow.png new file mode 100644 index 0000000..6c10bfd Binary files /dev/null and b/asset/icon/Icon16/document_yellow.png differ diff --git a/asset/icon/Icon16/documentation_tools.png b/asset/icon/Icon16/documentation_tools.png new file mode 100644 index 0000000..b7d5b85 Binary files /dev/null and b/asset/icon/Icon16/documentation_tools.png differ diff --git a/asset/icon/Icon16/documents_email.png b/asset/icon/Icon16/documents_email.png new file mode 100644 index 0000000..4cb221e Binary files /dev/null and b/asset/icon/Icon16/documents_email.png differ diff --git a/asset/icon/Icon16/dog.png b/asset/icon/Icon16/dog.png new file mode 100644 index 0000000..fb2dc26 Binary files /dev/null and b/asset/icon/Icon16/dog.png differ diff --git a/asset/icon/Icon16/domain_buying_selling.png b/asset/icon/Icon16/domain_buying_selling.png new file mode 100644 index 0000000..6eb2485 Binary files /dev/null and b/asset/icon/Icon16/domain_buying_selling.png differ diff --git a/asset/icon/Icon16/domain_controversies.png b/asset/icon/Icon16/domain_controversies.png new file mode 100644 index 0000000..d739fcc Binary files /dev/null and b/asset/icon/Icon16/domain_controversies.png differ diff --git a/asset/icon/Icon16/domain_legal_issues.png b/asset/icon/Icon16/domain_legal_issues.png new file mode 100644 index 0000000..efb71a1 Binary files /dev/null and b/asset/icon/Icon16/domain_legal_issues.png differ diff --git a/asset/icon/Icon16/domain_name_investment.png b/asset/icon/Icon16/domain_name_investment.png new file mode 100644 index 0000000..a3f04f8 Binary files /dev/null and b/asset/icon/Icon16/domain_name_investment.png differ diff --git a/asset/icon/Icon16/domain_name_monetization.png b/asset/icon/Icon16/domain_name_monetization.png new file mode 100644 index 0000000..58f6926 Binary files /dev/null and b/asset/icon/Icon16/domain_name_monetization.png differ diff --git a/asset/icon/Icon16/domain_names_advanced.png b/asset/icon/Icon16/domain_names_advanced.png new file mode 100644 index 0000000..489c987 Binary files /dev/null and b/asset/icon/Icon16/domain_names_advanced.png differ diff --git a/asset/icon/Icon16/domain_template.png b/asset/icon/Icon16/domain_template.png new file mode 100644 index 0000000..be2c7ee Binary files /dev/null and b/asset/icon/Icon16/domain_template.png differ diff --git a/asset/icon/Icon16/donut.png b/asset/icon/Icon16/donut.png new file mode 100644 index 0000000..438ea8d Binary files /dev/null and b/asset/icon/Icon16/donut.png differ diff --git a/asset/icon/Icon16/door.png b/asset/icon/Icon16/door.png new file mode 100644 index 0000000..6cb685a Binary files /dev/null and b/asset/icon/Icon16/door.png differ diff --git a/asset/icon/Icon16/door_in.png b/asset/icon/Icon16/door_in.png new file mode 100644 index 0000000..1903e23 Binary files /dev/null and b/asset/icon/Icon16/door_in.png differ diff --git a/asset/icon/Icon16/door_open.png b/asset/icon/Icon16/door_open.png new file mode 100644 index 0000000..2b4651e Binary files /dev/null and b/asset/icon/Icon16/door_open.png differ diff --git a/asset/icon/Icon16/door_out.png b/asset/icon/Icon16/door_out.png new file mode 100644 index 0000000..23805d2 Binary files /dev/null and b/asset/icon/Icon16/door_out.png differ diff --git a/asset/icon/Icon16/dopplr.png b/asset/icon/Icon16/dopplr.png new file mode 100644 index 0000000..86b1d03 Binary files /dev/null and b/asset/icon/Icon16/dopplr.png differ diff --git a/asset/icon/Icon16/down_jacket.png b/asset/icon/Icon16/down_jacket.png new file mode 100644 index 0000000..efe8b64 Binary files /dev/null and b/asset/icon/Icon16/down_jacket.png differ diff --git a/asset/icon/Icon16/download.png b/asset/icon/Icon16/download.png new file mode 100644 index 0000000..df01f33 Binary files /dev/null and b/asset/icon/Icon16/download.png differ diff --git a/asset/icon/Icon16/download_cloud.png b/asset/icon/Icon16/download_cloud.png new file mode 100644 index 0000000..a644e8c Binary files /dev/null and b/asset/icon/Icon16/download_cloud.png differ diff --git a/asset/icon/Icon16/download_for_linux.png b/asset/icon/Icon16/download_for_linux.png new file mode 100644 index 0000000..d30a0ad Binary files /dev/null and b/asset/icon/Icon16/download_for_linux.png differ diff --git a/asset/icon/Icon16/download_for_mac.png b/asset/icon/Icon16/download_for_mac.png new file mode 100644 index 0000000..f60f6f0 Binary files /dev/null and b/asset/icon/Icon16/download_for_mac.png differ diff --git a/asset/icon/Icon16/download_for_windows.png b/asset/icon/Icon16/download_for_windows.png new file mode 100644 index 0000000..f592993 Binary files /dev/null and b/asset/icon/Icon16/download_for_windows.png differ diff --git a/asset/icon/Icon16/draft.png b/asset/icon/Icon16/draft.png new file mode 100644 index 0000000..3319a46 Binary files /dev/null and b/asset/icon/Icon16/draft.png differ diff --git a/asset/icon/Icon16/draw_airbrush.png b/asset/icon/Icon16/draw_airbrush.png new file mode 100644 index 0000000..6fd1e0d Binary files /dev/null and b/asset/icon/Icon16/draw_airbrush.png differ diff --git a/asset/icon/Icon16/draw_calligraphic.png b/asset/icon/Icon16/draw_calligraphic.png new file mode 100644 index 0000000..7041cb8 Binary files /dev/null and b/asset/icon/Icon16/draw_calligraphic.png differ diff --git a/asset/icon/Icon16/draw_clone.png b/asset/icon/Icon16/draw_clone.png new file mode 100644 index 0000000..cca6727 Binary files /dev/null and b/asset/icon/Icon16/draw_clone.png differ diff --git a/asset/icon/Icon16/draw_convolve.png b/asset/icon/Icon16/draw_convolve.png new file mode 100644 index 0000000..0f23f0e Binary files /dev/null and b/asset/icon/Icon16/draw_convolve.png differ diff --git a/asset/icon/Icon16/draw_dodge_burn.png b/asset/icon/Icon16/draw_dodge_burn.png new file mode 100644 index 0000000..43804d9 Binary files /dev/null and b/asset/icon/Icon16/draw_dodge_burn.png differ diff --git a/asset/icon/Icon16/draw_ellipse.png b/asset/icon/Icon16/draw_ellipse.png new file mode 100644 index 0000000..e5f0921 Binary files /dev/null and b/asset/icon/Icon16/draw_ellipse.png differ diff --git a/asset/icon/Icon16/draw_eraser.png b/asset/icon/Icon16/draw_eraser.png new file mode 100644 index 0000000..f2eca21 Binary files /dev/null and b/asset/icon/Icon16/draw_eraser.png differ diff --git a/asset/icon/Icon16/draw_ink.png b/asset/icon/Icon16/draw_ink.png new file mode 100644 index 0000000..27a4ccb Binary files /dev/null and b/asset/icon/Icon16/draw_ink.png differ diff --git a/asset/icon/Icon16/draw_island.png b/asset/icon/Icon16/draw_island.png new file mode 100644 index 0000000..db4c71c Binary files /dev/null and b/asset/icon/Icon16/draw_island.png differ diff --git a/asset/icon/Icon16/draw_line.png b/asset/icon/Icon16/draw_line.png new file mode 100644 index 0000000..a4ba1b6 Binary files /dev/null and b/asset/icon/Icon16/draw_line.png differ diff --git a/asset/icon/Icon16/draw_path.png b/asset/icon/Icon16/draw_path.png new file mode 100644 index 0000000..10e1da2 Binary files /dev/null and b/asset/icon/Icon16/draw_path.png differ diff --git a/asset/icon/Icon16/draw_points.png b/asset/icon/Icon16/draw_points.png new file mode 100644 index 0000000..cc52dd4 Binary files /dev/null and b/asset/icon/Icon16/draw_points.png differ diff --git a/asset/icon/Icon16/draw_polygon.png b/asset/icon/Icon16/draw_polygon.png new file mode 100644 index 0000000..60a7a0d Binary files /dev/null and b/asset/icon/Icon16/draw_polygon.png differ diff --git a/asset/icon/Icon16/draw_polygon_curves.png b/asset/icon/Icon16/draw_polygon_curves.png new file mode 100644 index 0000000..3f2c44a Binary files /dev/null and b/asset/icon/Icon16/draw_polygon_curves.png differ diff --git a/asset/icon/Icon16/draw_polyline.png b/asset/icon/Icon16/draw_polyline.png new file mode 100644 index 0000000..94f5dd7 Binary files /dev/null and b/asset/icon/Icon16/draw_polyline.png differ diff --git a/asset/icon/Icon16/draw_ring.png b/asset/icon/Icon16/draw_ring.png new file mode 100644 index 0000000..935b30a Binary files /dev/null and b/asset/icon/Icon16/draw_ring.png differ diff --git a/asset/icon/Icon16/draw_smudge.png b/asset/icon/Icon16/draw_smudge.png new file mode 100644 index 0000000..13646c4 Binary files /dev/null and b/asset/icon/Icon16/draw_smudge.png differ diff --git a/asset/icon/Icon16/draw_spiral.png b/asset/icon/Icon16/draw_spiral.png new file mode 100644 index 0000000..51398cc Binary files /dev/null and b/asset/icon/Icon16/draw_spiral.png differ diff --git a/asset/icon/Icon16/draw_star.png b/asset/icon/Icon16/draw_star.png new file mode 100644 index 0000000..48485c3 Binary files /dev/null and b/asset/icon/Icon16/draw_star.png differ diff --git a/asset/icon/Icon16/draw_vertex.png b/asset/icon/Icon16/draw_vertex.png new file mode 100644 index 0000000..bf4d3a3 Binary files /dev/null and b/asset/icon/Icon16/draw_vertex.png differ diff --git a/asset/icon/Icon16/draw_wave.png b/asset/icon/Icon16/draw_wave.png new file mode 100644 index 0000000..09b7c22 Binary files /dev/null and b/asset/icon/Icon16/draw_wave.png differ diff --git a/asset/icon/Icon16/drawer.png b/asset/icon/Icon16/drawer.png new file mode 100644 index 0000000..ccae8b8 Binary files /dev/null and b/asset/icon/Icon16/drawer.png differ diff --git a/asset/icon/Icon16/drawer_open.png b/asset/icon/Icon16/drawer_open.png new file mode 100644 index 0000000..d25b03f Binary files /dev/null and b/asset/icon/Icon16/drawer_open.png differ diff --git a/asset/icon/Icon16/dribbble.png b/asset/icon/Icon16/dribbble.png new file mode 100644 index 0000000..60baf79 Binary files /dev/null and b/asset/icon/Icon16/dribbble.png differ diff --git a/asset/icon/Icon16/drill.png b/asset/icon/Icon16/drill.png new file mode 100644 index 0000000..392a26a Binary files /dev/null and b/asset/icon/Icon16/drill.png differ diff --git a/asset/icon/Icon16/drink.png b/asset/icon/Icon16/drink.png new file mode 100644 index 0000000..f2c33e7 Binary files /dev/null and b/asset/icon/Icon16/drink.png differ diff --git a/asset/icon/Icon16/drink_empty.png b/asset/icon/Icon16/drink_empty.png new file mode 100644 index 0000000..9fccc52 Binary files /dev/null and b/asset/icon/Icon16/drink_empty.png differ diff --git a/asset/icon/Icon16/drive.png b/asset/icon/Icon16/drive.png new file mode 100644 index 0000000..e3979a8 Binary files /dev/null and b/asset/icon/Icon16/drive.png differ diff --git a/asset/icon/Icon16/drive_add.png b/asset/icon/Icon16/drive_add.png new file mode 100644 index 0000000..0a6b97c Binary files /dev/null and b/asset/icon/Icon16/drive_add.png differ diff --git a/asset/icon/Icon16/drive_burn.png b/asset/icon/Icon16/drive_burn.png new file mode 100644 index 0000000..7959b08 Binary files /dev/null and b/asset/icon/Icon16/drive_burn.png differ diff --git a/asset/icon/Icon16/drive_cd.png b/asset/icon/Icon16/drive_cd.png new file mode 100644 index 0000000..df5afe9 Binary files /dev/null and b/asset/icon/Icon16/drive_cd.png differ diff --git a/asset/icon/Icon16/drive_cd_empty.png b/asset/icon/Icon16/drive_cd_empty.png new file mode 100644 index 0000000..e0a132e Binary files /dev/null and b/asset/icon/Icon16/drive_cd_empty.png differ diff --git a/asset/icon/Icon16/drive_delete.png b/asset/icon/Icon16/drive_delete.png new file mode 100644 index 0000000..11c8b95 Binary files /dev/null and b/asset/icon/Icon16/drive_delete.png differ diff --git a/asset/icon/Icon16/drive_disk.png b/asset/icon/Icon16/drive_disk.png new file mode 100644 index 0000000..ce24062 Binary files /dev/null and b/asset/icon/Icon16/drive_disk.png differ diff --git a/asset/icon/Icon16/drive_edit.png b/asset/icon/Icon16/drive_edit.png new file mode 100644 index 0000000..900c5cf Binary files /dev/null and b/asset/icon/Icon16/drive_edit.png differ diff --git a/asset/icon/Icon16/drive_error.png b/asset/icon/Icon16/drive_error.png new file mode 100644 index 0000000..ad05ad9 Binary files /dev/null and b/asset/icon/Icon16/drive_error.png differ diff --git a/asset/icon/Icon16/drive_go.png b/asset/icon/Icon16/drive_go.png new file mode 100644 index 0000000..06ff109 Binary files /dev/null and b/asset/icon/Icon16/drive_go.png differ diff --git a/asset/icon/Icon16/drive_key.png b/asset/icon/Icon16/drive_key.png new file mode 100644 index 0000000..97ddcdb Binary files /dev/null and b/asset/icon/Icon16/drive_key.png differ diff --git a/asset/icon/Icon16/drive_link.png b/asset/icon/Icon16/drive_link.png new file mode 100644 index 0000000..29d9c0a Binary files /dev/null and b/asset/icon/Icon16/drive_link.png differ diff --git a/asset/icon/Icon16/drive_magnify.png b/asset/icon/Icon16/drive_magnify.png new file mode 100644 index 0000000..e243067 Binary files /dev/null and b/asset/icon/Icon16/drive_magnify.png differ diff --git a/asset/icon/Icon16/drive_network.png b/asset/icon/Icon16/drive_network.png new file mode 100644 index 0000000..fadb808 Binary files /dev/null and b/asset/icon/Icon16/drive_network.png differ diff --git a/asset/icon/Icon16/drive_rename.png b/asset/icon/Icon16/drive_rename.png new file mode 100644 index 0000000..e7a8957 Binary files /dev/null and b/asset/icon/Icon16/drive_rename.png differ diff --git a/asset/icon/Icon16/drive_user.png b/asset/icon/Icon16/drive_user.png new file mode 100644 index 0000000..21cec4e Binary files /dev/null and b/asset/icon/Icon16/drive_user.png differ diff --git a/asset/icon/Icon16/drive_web.png b/asset/icon/Icon16/drive_web.png new file mode 100644 index 0000000..bf612f0 Binary files /dev/null and b/asset/icon/Icon16/drive_web.png differ diff --git a/asset/icon/Icon16/drop.png b/asset/icon/Icon16/drop.png new file mode 100644 index 0000000..7ec2054 Binary files /dev/null and b/asset/icon/Icon16/drop.png differ diff --git a/asset/icon/Icon16/drugs_com.png b/asset/icon/Icon16/drugs_com.png new file mode 100644 index 0000000..1e44f1c Binary files /dev/null and b/asset/icon/Icon16/drugs_com.png differ diff --git a/asset/icon/Icon16/drum.png b/asset/icon/Icon16/drum.png new file mode 100644 index 0000000..b5f5574 Binary files /dev/null and b/asset/icon/Icon16/drum.png differ diff --git a/asset/icon/Icon16/dvd.png b/asset/icon/Icon16/dvd.png new file mode 100644 index 0000000..837f217 Binary files /dev/null and b/asset/icon/Icon16/dvd.png differ diff --git a/asset/icon/Icon16/dvd_add.png b/asset/icon/Icon16/dvd_add.png new file mode 100644 index 0000000..9cf962f Binary files /dev/null and b/asset/icon/Icon16/dvd_add.png differ diff --git a/asset/icon/Icon16/dvd_delete.png b/asset/icon/Icon16/dvd_delete.png new file mode 100644 index 0000000..94ea86a Binary files /dev/null and b/asset/icon/Icon16/dvd_delete.png differ diff --git a/asset/icon/Icon16/dvd_edit.png b/asset/icon/Icon16/dvd_edit.png new file mode 100644 index 0000000..22bc884 Binary files /dev/null and b/asset/icon/Icon16/dvd_edit.png differ diff --git a/asset/icon/Icon16/dvd_error.png b/asset/icon/Icon16/dvd_error.png new file mode 100644 index 0000000..9cad0f9 Binary files /dev/null and b/asset/icon/Icon16/dvd_error.png differ diff --git a/asset/icon/Icon16/dvd_go.png b/asset/icon/Icon16/dvd_go.png new file mode 100644 index 0000000..f226e01 Binary files /dev/null and b/asset/icon/Icon16/dvd_go.png differ diff --git a/asset/icon/Icon16/dvd_key.png b/asset/icon/Icon16/dvd_key.png new file mode 100644 index 0000000..64b6672 Binary files /dev/null and b/asset/icon/Icon16/dvd_key.png differ diff --git a/asset/icon/Icon16/dvd_link.png b/asset/icon/Icon16/dvd_link.png new file mode 100644 index 0000000..2d30c6b Binary files /dev/null and b/asset/icon/Icon16/dvd_link.png differ diff --git a/asset/icon/Icon16/dynamite.png b/asset/icon/Icon16/dynamite.png new file mode 100644 index 0000000..18d8b11 Binary files /dev/null and b/asset/icon/Icon16/dynamite.png differ diff --git a/asset/icon/Icon16/e_book_reader_black.png b/asset/icon/Icon16/e_book_reader_black.png new file mode 100644 index 0000000..571f137 Binary files /dev/null and b/asset/icon/Icon16/e_book_reader_black.png differ diff --git a/asset/icon/Icon16/e_book_reader_white.png b/asset/icon/Icon16/e_book_reader_white.png new file mode 100644 index 0000000..7d533d3 Binary files /dev/null and b/asset/icon/Icon16/e_book_reader_white.png differ diff --git a/asset/icon/Icon16/ear_listen.png b/asset/icon/Icon16/ear_listen.png new file mode 100644 index 0000000..499c51a Binary files /dev/null and b/asset/icon/Icon16/ear_listen.png differ diff --git a/asset/icon/Icon16/earth_night.png b/asset/icon/Icon16/earth_night.png new file mode 100644 index 0000000..581058a Binary files /dev/null and b/asset/icon/Icon16/earth_night.png differ diff --git a/asset/icon/Icon16/ebay.png b/asset/icon/Icon16/ebay.png new file mode 100644 index 0000000..5de0736 Binary files /dev/null and b/asset/icon/Icon16/ebay.png differ diff --git a/asset/icon/Icon16/echeck.png b/asset/icon/Icon16/echeck.png new file mode 100644 index 0000000..94d6af4 Binary files /dev/null and b/asset/icon/Icon16/echeck.png differ diff --git a/asset/icon/Icon16/ecommerce_server.png b/asset/icon/Icon16/ecommerce_server.png new file mode 100644 index 0000000..8110bf1 Binary files /dev/null and b/asset/icon/Icon16/ecommerce_server.png differ diff --git a/asset/icon/Icon16/edit_button.png b/asset/icon/Icon16/edit_button.png new file mode 100644 index 0000000..e1ff2b7 Binary files /dev/null and b/asset/icon/Icon16/edit_button.png differ diff --git a/asset/icon/Icon16/edit_chain.png b/asset/icon/Icon16/edit_chain.png new file mode 100644 index 0000000..1071a51 Binary files /dev/null and b/asset/icon/Icon16/edit_chain.png differ diff --git a/asset/icon/Icon16/edit_diff.png b/asset/icon/Icon16/edit_diff.png new file mode 100644 index 0000000..b1f6b28 Binary files /dev/null and b/asset/icon/Icon16/edit_diff.png differ diff --git a/asset/icon/Icon16/edit_dns_zone.png b/asset/icon/Icon16/edit_dns_zone.png new file mode 100644 index 0000000..e800f88 Binary files /dev/null and b/asset/icon/Icon16/edit_dns_zone.png differ diff --git a/asset/icon/Icon16/edit_free.png b/asset/icon/Icon16/edit_free.png new file mode 100644 index 0000000..46e7446 Binary files /dev/null and b/asset/icon/Icon16/edit_free.png differ diff --git a/asset/icon/Icon16/edit_mathematics.png b/asset/icon/Icon16/edit_mathematics.png new file mode 100644 index 0000000..02793fd Binary files /dev/null and b/asset/icon/Icon16/edit_mathematics.png differ diff --git a/asset/icon/Icon16/edit_mx_entry.png b/asset/icon/Icon16/edit_mx_entry.png new file mode 100644 index 0000000..845519d Binary files /dev/null and b/asset/icon/Icon16/edit_mx_entry.png differ diff --git a/asset/icon/Icon16/edit_package.png b/asset/icon/Icon16/edit_package.png new file mode 100644 index 0000000..10a1322 Binary files /dev/null and b/asset/icon/Icon16/edit_package.png differ diff --git a/asset/icon/Icon16/edit_path.png b/asset/icon/Icon16/edit_path.png new file mode 100644 index 0000000..e670727 Binary files /dev/null and b/asset/icon/Icon16/edit_path.png differ diff --git a/asset/icon/Icon16/edit_recipient_list.png b/asset/icon/Icon16/edit_recipient_list.png new file mode 100644 index 0000000..bbebf96 Binary files /dev/null and b/asset/icon/Icon16/edit_recipient_list.png differ diff --git a/asset/icon/Icon16/edit_zone_templates.png b/asset/icon/Icon16/edit_zone_templates.png new file mode 100644 index 0000000..d2e0ddb Binary files /dev/null and b/asset/icon/Icon16/edit_zone_templates.png differ diff --git a/asset/icon/Icon16/education.png b/asset/icon/Icon16/education.png new file mode 100644 index 0000000..d621eff Binary files /dev/null and b/asset/icon/Icon16/education.png differ diff --git a/asset/icon/Icon16/egyptian_pyramid.png b/asset/icon/Icon16/egyptian_pyramid.png new file mode 100644 index 0000000..be158b7 Binary files /dev/null and b/asset/icon/Icon16/egyptian_pyramid.png differ diff --git a/asset/icon/Icon16/ehow.png b/asset/icon/Icon16/ehow.png new file mode 100644 index 0000000..64fff3c Binary files /dev/null and b/asset/icon/Icon16/ehow.png differ diff --git a/asset/icon/Icon16/electric_guitar.png b/asset/icon/Icon16/electric_guitar.png new file mode 100644 index 0000000..e3d253c Binary files /dev/null and b/asset/icon/Icon16/electric_guitar.png differ diff --git a/asset/icon/Icon16/elements.png b/asset/icon/Icon16/elements.png new file mode 100644 index 0000000..cda69d5 Binary files /dev/null and b/asset/icon/Icon16/elements.png differ diff --git a/asset/icon/Icon16/email.png b/asset/icon/Icon16/email.png new file mode 100644 index 0000000..8327873 Binary files /dev/null and b/asset/icon/Icon16/email.png differ diff --git a/asset/icon/Icon16/email_accounts.png b/asset/icon/Icon16/email_accounts.png new file mode 100644 index 0000000..df5820e Binary files /dev/null and b/asset/icon/Icon16/email_accounts.png differ diff --git a/asset/icon/Icon16/email_add.png b/asset/icon/Icon16/email_add.png new file mode 100644 index 0000000..2ffbdb0 Binary files /dev/null and b/asset/icon/Icon16/email_add.png differ diff --git a/asset/icon/Icon16/email_air.png b/asset/icon/Icon16/email_air.png new file mode 100644 index 0000000..a959983 Binary files /dev/null and b/asset/icon/Icon16/email_air.png differ diff --git a/asset/icon/Icon16/email_at_sign.png b/asset/icon/Icon16/email_at_sign.png new file mode 100644 index 0000000..12bd592 Binary files /dev/null and b/asset/icon/Icon16/email_at_sign.png differ diff --git a/asset/icon/Icon16/email_attach.png b/asset/icon/Icon16/email_attach.png new file mode 100644 index 0000000..5b800d5 Binary files /dev/null and b/asset/icon/Icon16/email_attach.png differ diff --git a/asset/icon/Icon16/email_authentication.png b/asset/icon/Icon16/email_authentication.png new file mode 100644 index 0000000..33ee8e5 Binary files /dev/null and b/asset/icon/Icon16/email_authentication.png differ diff --git a/asset/icon/Icon16/email_delete.png b/asset/icon/Icon16/email_delete.png new file mode 100644 index 0000000..e5f863c Binary files /dev/null and b/asset/icon/Icon16/email_delete.png differ diff --git a/asset/icon/Icon16/email_edit.png b/asset/icon/Icon16/email_edit.png new file mode 100644 index 0000000..63e026f Binary files /dev/null and b/asset/icon/Icon16/email_edit.png differ diff --git a/asset/icon/Icon16/email_error.png b/asset/icon/Icon16/email_error.png new file mode 100644 index 0000000..eee04da Binary files /dev/null and b/asset/icon/Icon16/email_error.png differ diff --git a/asset/icon/Icon16/email_forward.png b/asset/icon/Icon16/email_forward.png new file mode 100644 index 0000000..2f12f4a Binary files /dev/null and b/asset/icon/Icon16/email_forward.png differ diff --git a/asset/icon/Icon16/email_go.png b/asset/icon/Icon16/email_go.png new file mode 100644 index 0000000..1b3d933 Binary files /dev/null and b/asset/icon/Icon16/email_go.png differ diff --git a/asset/icon/Icon16/email_link.png b/asset/icon/Icon16/email_link.png new file mode 100644 index 0000000..dcc89d2 Binary files /dev/null and b/asset/icon/Icon16/email_link.png differ diff --git a/asset/icon/Icon16/email_open.png b/asset/icon/Icon16/email_open.png new file mode 100644 index 0000000..cf8c51a Binary files /dev/null and b/asset/icon/Icon16/email_open.png differ diff --git a/asset/icon/Icon16/email_open_image.png b/asset/icon/Icon16/email_open_image.png new file mode 100644 index 0000000..c6b20b9 Binary files /dev/null and b/asset/icon/Icon16/email_open_image.png differ diff --git a/asset/icon/Icon16/email_send_receive.png b/asset/icon/Icon16/email_send_receive.png new file mode 100644 index 0000000..320dfbf Binary files /dev/null and b/asset/icon/Icon16/email_send_receive.png differ diff --git a/asset/icon/Icon16/email_setting.png b/asset/icon/Icon16/email_setting.png new file mode 100644 index 0000000..e7d9d01 Binary files /dev/null and b/asset/icon/Icon16/email_setting.png differ diff --git a/asset/icon/Icon16/email_to_friend.png b/asset/icon/Icon16/email_to_friend.png new file mode 100644 index 0000000..f275cee Binary files /dev/null and b/asset/icon/Icon16/email_to_friend.png differ diff --git a/asset/icon/Icon16/email_trace.png b/asset/icon/Icon16/email_trace.png new file mode 100644 index 0000000..0d17792 Binary files /dev/null and b/asset/icon/Icon16/email_trace.png differ diff --git a/asset/icon/Icon16/emails.png b/asset/icon/Icon16/emails.png new file mode 100644 index 0000000..7bdeaf0 Binary files /dev/null and b/asset/icon/Icon16/emails.png differ diff --git a/asset/icon/Icon16/emails_stack.png b/asset/icon/Icon16/emails_stack.png new file mode 100644 index 0000000..cb75c23 Binary files /dev/null and b/asset/icon/Icon16/emails_stack.png differ diff --git a/asset/icon/Icon16/ember.png b/asset/icon/Icon16/ember.png new file mode 100644 index 0000000..1bf55a3 Binary files /dev/null and b/asset/icon/Icon16/ember.png differ diff --git a/asset/icon/Icon16/emotion_adore.png b/asset/icon/Icon16/emotion_adore.png new file mode 100644 index 0000000..046ecfb Binary files /dev/null and b/asset/icon/Icon16/emotion_adore.png differ diff --git a/asset/icon/Icon16/emotion_after_boom.png b/asset/icon/Icon16/emotion_after_boom.png new file mode 100644 index 0000000..f92feba Binary files /dev/null and b/asset/icon/Icon16/emotion_after_boom.png differ diff --git a/asset/icon/Icon16/emotion_ah.png b/asset/icon/Icon16/emotion_ah.png new file mode 100644 index 0000000..a830ea8 Binary files /dev/null and b/asset/icon/Icon16/emotion_ah.png differ diff --git a/asset/icon/Icon16/emotion_alien.png b/asset/icon/Icon16/emotion_alien.png new file mode 100644 index 0000000..42a4fe5 Binary files /dev/null and b/asset/icon/Icon16/emotion_alien.png differ diff --git a/asset/icon/Icon16/emotion_amazing.png b/asset/icon/Icon16/emotion_amazing.png new file mode 100644 index 0000000..0ca0c1f Binary files /dev/null and b/asset/icon/Icon16/emotion_amazing.png differ diff --git a/asset/icon/Icon16/emotion_angel.png b/asset/icon/Icon16/emotion_angel.png new file mode 100644 index 0000000..4465c36 Binary files /dev/null and b/asset/icon/Icon16/emotion_angel.png differ diff --git a/asset/icon/Icon16/emotion_anger.png b/asset/icon/Icon16/emotion_anger.png new file mode 100644 index 0000000..b6ce0ba Binary files /dev/null and b/asset/icon/Icon16/emotion_anger.png differ diff --git a/asset/icon/Icon16/emotion_angry.png b/asset/icon/Icon16/emotion_angry.png new file mode 100644 index 0000000..1afcc31 Binary files /dev/null and b/asset/icon/Icon16/emotion_angry.png differ diff --git a/asset/icon/Icon16/emotion_aqua.png b/asset/icon/Icon16/emotion_aqua.png new file mode 100644 index 0000000..a9b34e6 Binary files /dev/null and b/asset/icon/Icon16/emotion_aqua.png differ diff --git a/asset/icon/Icon16/emotion_baby.png b/asset/icon/Icon16/emotion_baby.png new file mode 100644 index 0000000..120304f Binary files /dev/null and b/asset/icon/Icon16/emotion_baby.png differ diff --git a/asset/icon/Icon16/emotion_bad_egg.png b/asset/icon/Icon16/emotion_bad_egg.png new file mode 100644 index 0000000..98559d7 Binary files /dev/null and b/asset/icon/Icon16/emotion_bad_egg.png differ diff --git a/asset/icon/Icon16/emotion_bad_smelly.png b/asset/icon/Icon16/emotion_bad_smelly.png new file mode 100644 index 0000000..9485f58 Binary files /dev/null and b/asset/icon/Icon16/emotion_bad_smelly.png differ diff --git a/asset/icon/Icon16/emotion_baffle.png b/asset/icon/Icon16/emotion_baffle.png new file mode 100644 index 0000000..a353715 Binary files /dev/null and b/asset/icon/Icon16/emotion_baffle.png differ diff --git a/asset/icon/Icon16/emotion_batman.png b/asset/icon/Icon16/emotion_batman.png new file mode 100644 index 0000000..fdee1ae Binary files /dev/null and b/asset/icon/Icon16/emotion_batman.png differ diff --git a/asset/icon/Icon16/emotion_beat_brick.png b/asset/icon/Icon16/emotion_beat_brick.png new file mode 100644 index 0000000..759acac Binary files /dev/null and b/asset/icon/Icon16/emotion_beat_brick.png differ diff --git a/asset/icon/Icon16/emotion_beaten.png b/asset/icon/Icon16/emotion_beaten.png new file mode 100644 index 0000000..eaa3893 Binary files /dev/null and b/asset/icon/Icon16/emotion_beaten.png differ diff --git a/asset/icon/Icon16/emotion_bigsmile.png b/asset/icon/Icon16/emotion_bigsmile.png new file mode 100644 index 0000000..b7d1d46 Binary files /dev/null and b/asset/icon/Icon16/emotion_bigsmile.png differ diff --git a/asset/icon/Icon16/emotion_blind.png b/asset/icon/Icon16/emotion_blind.png new file mode 100644 index 0000000..96d1fa5 Binary files /dev/null and b/asset/icon/Icon16/emotion_blind.png differ diff --git a/asset/icon/Icon16/emotion_bloody.png b/asset/icon/Icon16/emotion_bloody.png new file mode 100644 index 0000000..6b00d32 Binary files /dev/null and b/asset/icon/Icon16/emotion_bloody.png differ diff --git a/asset/icon/Icon16/emotion_blow_current.png b/asset/icon/Icon16/emotion_blow_current.png new file mode 100644 index 0000000..40468de Binary files /dev/null and b/asset/icon/Icon16/emotion_blow_current.png differ diff --git a/asset/icon/Icon16/emotion_boo.png b/asset/icon/Icon16/emotion_boo.png new file mode 100644 index 0000000..acf8e97 Binary files /dev/null and b/asset/icon/Icon16/emotion_boo.png differ diff --git a/asset/icon/Icon16/emotion_brains.png b/asset/icon/Icon16/emotion_brains.png new file mode 100644 index 0000000..0e51e95 Binary files /dev/null and b/asset/icon/Icon16/emotion_brains.png differ diff --git a/asset/icon/Icon16/emotion_bubblegum.png b/asset/icon/Icon16/emotion_bubblegum.png new file mode 100644 index 0000000..8b7c407 Binary files /dev/null and b/asset/icon/Icon16/emotion_bubblegum.png differ diff --git a/asset/icon/Icon16/emotion_bully.png b/asset/icon/Icon16/emotion_bully.png new file mode 100644 index 0000000..8127535 Binary files /dev/null and b/asset/icon/Icon16/emotion_bully.png differ diff --git a/asset/icon/Icon16/emotion_burn_joss_stick.png b/asset/icon/Icon16/emotion_burn_joss_stick.png new file mode 100644 index 0000000..ab14aa4 Binary files /dev/null and b/asset/icon/Icon16/emotion_burn_joss_stick.png differ diff --git a/asset/icon/Icon16/emotion_burnt.png b/asset/icon/Icon16/emotion_burnt.png new file mode 100644 index 0000000..95ba61b Binary files /dev/null and b/asset/icon/Icon16/emotion_burnt.png differ diff --git a/asset/icon/Icon16/emotion_bye_bye.png b/asset/icon/Icon16/emotion_bye_bye.png new file mode 100644 index 0000000..b8b3c1d Binary files /dev/null and b/asset/icon/Icon16/emotion_bye_bye.png differ diff --git a/asset/icon/Icon16/emotion_chinese.png b/asset/icon/Icon16/emotion_chinese.png new file mode 100644 index 0000000..11ffa9f Binary files /dev/null and b/asset/icon/Icon16/emotion_chinese.png differ diff --git a/asset/icon/Icon16/emotion_chupachups.png b/asset/icon/Icon16/emotion_chupachups.png new file mode 100644 index 0000000..38b32be Binary files /dev/null and b/asset/icon/Icon16/emotion_chupachups.png differ diff --git a/asset/icon/Icon16/emotion_clown.png b/asset/icon/Icon16/emotion_clown.png new file mode 100644 index 0000000..dc17422 Binary files /dev/null and b/asset/icon/Icon16/emotion_clown.png differ diff --git a/asset/icon/Icon16/emotion_cold.png b/asset/icon/Icon16/emotion_cold.png new file mode 100644 index 0000000..977f35a Binary files /dev/null and b/asset/icon/Icon16/emotion_cold.png differ diff --git a/asset/icon/Icon16/emotion_confident.png b/asset/icon/Icon16/emotion_confident.png new file mode 100644 index 0000000..da91715 Binary files /dev/null and b/asset/icon/Icon16/emotion_confident.png differ diff --git a/asset/icon/Icon16/emotion_confuse.png b/asset/icon/Icon16/emotion_confuse.png new file mode 100644 index 0000000..fcba07c Binary files /dev/null and b/asset/icon/Icon16/emotion_confuse.png differ diff --git a/asset/icon/Icon16/emotion_convict.png b/asset/icon/Icon16/emotion_convict.png new file mode 100644 index 0000000..43c01ab Binary files /dev/null and b/asset/icon/Icon16/emotion_convict.png differ diff --git a/asset/icon/Icon16/emotion_cool.png b/asset/icon/Icon16/emotion_cool.png new file mode 100644 index 0000000..333faa6 Binary files /dev/null and b/asset/icon/Icon16/emotion_cool.png differ diff --git a/asset/icon/Icon16/emotion_crazy.png b/asset/icon/Icon16/emotion_crazy.png new file mode 100644 index 0000000..a5e7060 Binary files /dev/null and b/asset/icon/Icon16/emotion_crazy.png differ diff --git a/asset/icon/Icon16/emotion_crazy_rabbit.png b/asset/icon/Icon16/emotion_crazy_rabbit.png new file mode 100644 index 0000000..56574a5 Binary files /dev/null and b/asset/icon/Icon16/emotion_crazy_rabbit.png differ diff --git a/asset/icon/Icon16/emotion_cry.png b/asset/icon/Icon16/emotion_cry.png new file mode 100644 index 0000000..db39134 Binary files /dev/null and b/asset/icon/Icon16/emotion_cry.png differ diff --git a/asset/icon/Icon16/emotion_cyclops.png b/asset/icon/Icon16/emotion_cyclops.png new file mode 100644 index 0000000..6ec135f Binary files /dev/null and b/asset/icon/Icon16/emotion_cyclops.png differ diff --git a/asset/icon/Icon16/emotion_daddy_cool.png b/asset/icon/Icon16/emotion_daddy_cool.png new file mode 100644 index 0000000..b867391 Binary files /dev/null and b/asset/icon/Icon16/emotion_daddy_cool.png differ diff --git a/asset/icon/Icon16/emotion_darth_wader.png b/asset/icon/Icon16/emotion_darth_wader.png new file mode 100644 index 0000000..189a215 Binary files /dev/null and b/asset/icon/Icon16/emotion_darth_wader.png differ diff --git a/asset/icon/Icon16/emotion_david_blaine.png b/asset/icon/Icon16/emotion_david_blaine.png new file mode 100644 index 0000000..43131b4 Binary files /dev/null and b/asset/icon/Icon16/emotion_david_blaine.png differ diff --git a/asset/icon/Icon16/emotion_dead.png b/asset/icon/Icon16/emotion_dead.png new file mode 100644 index 0000000..82804e5 Binary files /dev/null and b/asset/icon/Icon16/emotion_dead.png differ diff --git a/asset/icon/Icon16/emotion_detective.png b/asset/icon/Icon16/emotion_detective.png new file mode 100644 index 0000000..b3f1d3d Binary files /dev/null and b/asset/icon/Icon16/emotion_detective.png differ diff --git a/asset/icon/Icon16/emotion_devil.png b/asset/icon/Icon16/emotion_devil.png new file mode 100644 index 0000000..b317f9c Binary files /dev/null and b/asset/icon/Icon16/emotion_devil.png differ diff --git a/asset/icon/Icon16/emotion_diver.png b/asset/icon/Icon16/emotion_diver.png new file mode 100644 index 0000000..f539286 Binary files /dev/null and b/asset/icon/Icon16/emotion_diver.png differ diff --git a/asset/icon/Icon16/emotion_doubt.png b/asset/icon/Icon16/emotion_doubt.png new file mode 100644 index 0000000..671eda9 Binary files /dev/null and b/asset/icon/Icon16/emotion_doubt.png differ diff --git a/asset/icon/Icon16/emotion_doze.png b/asset/icon/Icon16/emotion_doze.png new file mode 100644 index 0000000..383df05 Binary files /dev/null and b/asset/icon/Icon16/emotion_doze.png differ diff --git a/asset/icon/Icon16/emotion_draw.png b/asset/icon/Icon16/emotion_draw.png new file mode 100644 index 0000000..9cb86e1 Binary files /dev/null and b/asset/icon/Icon16/emotion_draw.png differ diff --git a/asset/icon/Icon16/emotion_dribble.png b/asset/icon/Icon16/emotion_dribble.png new file mode 100644 index 0000000..5d0cc8e Binary files /dev/null and b/asset/icon/Icon16/emotion_dribble.png differ diff --git a/asset/icon/Icon16/emotion_drink.png b/asset/icon/Icon16/emotion_drink.png new file mode 100644 index 0000000..f8cefc3 Binary files /dev/null and b/asset/icon/Icon16/emotion_drink.png differ diff --git a/asset/icon/Icon16/emotion_drunkard.png b/asset/icon/Icon16/emotion_drunkard.png new file mode 100644 index 0000000..de71624 Binary files /dev/null and b/asset/icon/Icon16/emotion_drunkard.png differ diff --git a/asset/icon/Icon16/emotion_evilgrin.png b/asset/icon/Icon16/emotion_evilgrin.png new file mode 100644 index 0000000..7e16088 Binary files /dev/null and b/asset/icon/Icon16/emotion_evilgrin.png differ diff --git a/asset/icon/Icon16/emotion_evolution.png b/asset/icon/Icon16/emotion_evolution.png new file mode 100644 index 0000000..2c83cdb Binary files /dev/null and b/asset/icon/Icon16/emotion_evolution.png differ diff --git a/asset/icon/Icon16/emotion_exciting.png b/asset/icon/Icon16/emotion_exciting.png new file mode 100644 index 0000000..822af10 Binary files /dev/null and b/asset/icon/Icon16/emotion_exciting.png differ diff --git a/asset/icon/Icon16/emotion_eye.png b/asset/icon/Icon16/emotion_eye.png new file mode 100644 index 0000000..e81e6a0 Binary files /dev/null and b/asset/icon/Icon16/emotion_eye.png differ diff --git a/asset/icon/Icon16/emotion_eyes_droped.png b/asset/icon/Icon16/emotion_eyes_droped.png new file mode 100644 index 0000000..d6fec98 Binary files /dev/null and b/asset/icon/Icon16/emotion_eyes_droped.png differ diff --git a/asset/icon/Icon16/emotion_face_monkey.png b/asset/icon/Icon16/emotion_face_monkey.png new file mode 100644 index 0000000..5b0ef2f Binary files /dev/null and b/asset/icon/Icon16/emotion_face_monkey.png differ diff --git a/asset/icon/Icon16/emotion_face_panda.png b/asset/icon/Icon16/emotion_face_panda.png new file mode 100644 index 0000000..f3c63b1 Binary files /dev/null and b/asset/icon/Icon16/emotion_face_panda.png differ diff --git a/asset/icon/Icon16/emotion_fan.png b/asset/icon/Icon16/emotion_fan.png new file mode 100644 index 0000000..b0feb69 Binary files /dev/null and b/asset/icon/Icon16/emotion_fan.png differ diff --git a/asset/icon/Icon16/emotion_fire.png b/asset/icon/Icon16/emotion_fire.png new file mode 100644 index 0000000..9373365 Binary files /dev/null and b/asset/icon/Icon16/emotion_fire.png differ diff --git a/asset/icon/Icon16/emotion_flower_dead.png b/asset/icon/Icon16/emotion_flower_dead.png new file mode 100644 index 0000000..87571a8 Binary files /dev/null and b/asset/icon/Icon16/emotion_flower_dead.png differ diff --git a/asset/icon/Icon16/emotion_franken.png b/asset/icon/Icon16/emotion_franken.png new file mode 100644 index 0000000..b9e8a89 Binary files /dev/null and b/asset/icon/Icon16/emotion_franken.png differ diff --git a/asset/icon/Icon16/emotion_freak.png b/asset/icon/Icon16/emotion_freak.png new file mode 100644 index 0000000..d165b1c Binary files /dev/null and b/asset/icon/Icon16/emotion_freak.png differ diff --git a/asset/icon/Icon16/emotion_frost.png b/asset/icon/Icon16/emotion_frost.png new file mode 100644 index 0000000..2684133 Binary files /dev/null and b/asset/icon/Icon16/emotion_frost.png differ diff --git a/asset/icon/Icon16/emotion_gangs.png b/asset/icon/Icon16/emotion_gangs.png new file mode 100644 index 0000000..ed33d5c Binary files /dev/null and b/asset/icon/Icon16/emotion_gangs.png differ diff --git a/asset/icon/Icon16/emotion_gear.png b/asset/icon/Icon16/emotion_gear.png new file mode 100644 index 0000000..73f4fce Binary files /dev/null and b/asset/icon/Icon16/emotion_gear.png differ diff --git a/asset/icon/Icon16/emotion_ghost.png b/asset/icon/Icon16/emotion_ghost.png new file mode 100644 index 0000000..116cf6e Binary files /dev/null and b/asset/icon/Icon16/emotion_ghost.png differ diff --git a/asset/icon/Icon16/emotion_girl.png b/asset/icon/Icon16/emotion_girl.png new file mode 100644 index 0000000..0b8c5f9 Binary files /dev/null and b/asset/icon/Icon16/emotion_girl.png differ diff --git a/asset/icon/Icon16/emotion_go.png b/asset/icon/Icon16/emotion_go.png new file mode 100644 index 0000000..7bf568d Binary files /dev/null and b/asset/icon/Icon16/emotion_go.png differ diff --git a/asset/icon/Icon16/emotion_gourmand.png b/asset/icon/Icon16/emotion_gourmand.png new file mode 100644 index 0000000..7c5ef9f Binary files /dev/null and b/asset/icon/Icon16/emotion_gourmand.png differ diff --git a/asset/icon/Icon16/emotion_grad_green.png b/asset/icon/Icon16/emotion_grad_green.png new file mode 100644 index 0000000..b7d5028 Binary files /dev/null and b/asset/icon/Icon16/emotion_grad_green.png differ diff --git a/asset/icon/Icon16/emotion_grad_red.png b/asset/icon/Icon16/emotion_grad_red.png new file mode 100644 index 0000000..06d3c34 Binary files /dev/null and b/asset/icon/Icon16/emotion_grad_red.png differ diff --git a/asset/icon/Icon16/emotion_grad_yellow.png b/asset/icon/Icon16/emotion_grad_yellow.png new file mode 100644 index 0000000..5a18bb1 Binary files /dev/null and b/asset/icon/Icon16/emotion_grad_yellow.png differ diff --git a/asset/icon/Icon16/emotion_greedy.png b/asset/icon/Icon16/emotion_greedy.png new file mode 100644 index 0000000..3162cac Binary files /dev/null and b/asset/icon/Icon16/emotion_greedy.png differ diff --git a/asset/icon/Icon16/emotion_grin.png b/asset/icon/Icon16/emotion_grin.png new file mode 100644 index 0000000..d972aed Binary files /dev/null and b/asset/icon/Icon16/emotion_grin.png differ diff --git a/asset/icon/Icon16/emotion_haha.png b/asset/icon/Icon16/emotion_haha.png new file mode 100644 index 0000000..231ce9b Binary files /dev/null and b/asset/icon/Icon16/emotion_haha.png differ diff --git a/asset/icon/Icon16/emotion_hand_flower.png b/asset/icon/Icon16/emotion_hand_flower.png new file mode 100644 index 0000000..22cf649 Binary files /dev/null and b/asset/icon/Icon16/emotion_hand_flower.png differ diff --git a/asset/icon/Icon16/emotion_happy.png b/asset/icon/Icon16/emotion_happy.png new file mode 100644 index 0000000..dcbc0f4 Binary files /dev/null and b/asset/icon/Icon16/emotion_happy.png differ diff --git a/asset/icon/Icon16/emotion_harry_potter.png b/asset/icon/Icon16/emotion_harry_potter.png new file mode 100644 index 0000000..10417d1 Binary files /dev/null and b/asset/icon/Icon16/emotion_harry_potter.png differ diff --git a/asset/icon/Icon16/emotion_hatched.png b/asset/icon/Icon16/emotion_hatched.png new file mode 100644 index 0000000..dce075e Binary files /dev/null and b/asset/icon/Icon16/emotion_hatched.png differ diff --git a/asset/icon/Icon16/emotion_hidden.png b/asset/icon/Icon16/emotion_hidden.png new file mode 100644 index 0000000..bd9da24 Binary files /dev/null and b/asset/icon/Icon16/emotion_hidden.png differ diff --git a/asset/icon/Icon16/emotion_hitler.png b/asset/icon/Icon16/emotion_hitler.png new file mode 100644 index 0000000..b646f66 Binary files /dev/null and b/asset/icon/Icon16/emotion_hitler.png differ diff --git a/asset/icon/Icon16/emotion_horror.png b/asset/icon/Icon16/emotion_horror.png new file mode 100644 index 0000000..fd5a901 Binary files /dev/null and b/asset/icon/Icon16/emotion_horror.png differ diff --git a/asset/icon/Icon16/emotion_hot.png b/asset/icon/Icon16/emotion_hot.png new file mode 100644 index 0000000..f40295e Binary files /dev/null and b/asset/icon/Icon16/emotion_hot.png differ diff --git a/asset/icon/Icon16/emotion_hungry.png b/asset/icon/Icon16/emotion_hungry.png new file mode 100644 index 0000000..800bb32 Binary files /dev/null and b/asset/icon/Icon16/emotion_hungry.png differ diff --git a/asset/icon/Icon16/emotion_hypnotized.png b/asset/icon/Icon16/emotion_hypnotized.png new file mode 100644 index 0000000..fcf92b5 Binary files /dev/null and b/asset/icon/Icon16/emotion_hypnotized.png differ diff --git a/asset/icon/Icon16/emotion_injured.png b/asset/icon/Icon16/emotion_injured.png new file mode 100644 index 0000000..dbd571d Binary files /dev/null and b/asset/icon/Icon16/emotion_injured.png differ diff --git a/asset/icon/Icon16/emotion_japan.png b/asset/icon/Icon16/emotion_japan.png new file mode 100644 index 0000000..10b5852 Binary files /dev/null and b/asset/icon/Icon16/emotion_japan.png differ diff --git a/asset/icon/Icon16/emotion_jason.png b/asset/icon/Icon16/emotion_jason.png new file mode 100644 index 0000000..6916f90 Binary files /dev/null and b/asset/icon/Icon16/emotion_jason.png differ diff --git a/asset/icon/Icon16/emotion_juggler.png b/asset/icon/Icon16/emotion_juggler.png new file mode 100644 index 0000000..d8c1532 Binary files /dev/null and b/asset/icon/Icon16/emotion_juggler.png differ diff --git a/asset/icon/Icon16/emotion_kiddy.png b/asset/icon/Icon16/emotion_kiddy.png new file mode 100644 index 0000000..9e19f97 Binary files /dev/null and b/asset/icon/Icon16/emotion_kiddy.png differ diff --git a/asset/icon/Icon16/emotion_kiss.png b/asset/icon/Icon16/emotion_kiss.png new file mode 100644 index 0000000..edac2d7 Binary files /dev/null and b/asset/icon/Icon16/emotion_kiss.png differ diff --git a/asset/icon/Icon16/emotion_kissed.png b/asset/icon/Icon16/emotion_kissed.png new file mode 100644 index 0000000..168bfea Binary files /dev/null and b/asset/icon/Icon16/emotion_kissed.png differ diff --git a/asset/icon/Icon16/emotion_knight.png b/asset/icon/Icon16/emotion_knight.png new file mode 100644 index 0000000..564e132 Binary files /dev/null and b/asset/icon/Icon16/emotion_knight.png differ diff --git a/asset/icon/Icon16/emotion_lol.png b/asset/icon/Icon16/emotion_lol.png new file mode 100644 index 0000000..196801f Binary files /dev/null and b/asset/icon/Icon16/emotion_lol.png differ diff --git a/asset/icon/Icon16/emotion_lollipops.png b/asset/icon/Icon16/emotion_lollipops.png new file mode 100644 index 0000000..e5f493e Binary files /dev/null and b/asset/icon/Icon16/emotion_lollipops.png differ diff --git a/asset/icon/Icon16/emotion_love.png b/asset/icon/Icon16/emotion_love.png new file mode 100644 index 0000000..bf9a073 Binary files /dev/null and b/asset/icon/Icon16/emotion_love.png differ diff --git a/asset/icon/Icon16/emotion_mad.png b/asset/icon/Icon16/emotion_mad.png new file mode 100644 index 0000000..b7ecca0 Binary files /dev/null and b/asset/icon/Icon16/emotion_mad.png differ diff --git a/asset/icon/Icon16/emotion_mah_playlist.png b/asset/icon/Icon16/emotion_mah_playlist.png new file mode 100644 index 0000000..ace671a Binary files /dev/null and b/asset/icon/Icon16/emotion_mah_playlist.png differ diff --git a/asset/icon/Icon16/emotion_matrix.png b/asset/icon/Icon16/emotion_matrix.png new file mode 100644 index 0000000..b67e9dc Binary files /dev/null and b/asset/icon/Icon16/emotion_matrix.png differ diff --git a/asset/icon/Icon16/emotion_meaw.png b/asset/icon/Icon16/emotion_meaw.png new file mode 100644 index 0000000..dee5f19 Binary files /dev/null and b/asset/icon/Icon16/emotion_meaw.png differ diff --git a/asset/icon/Icon16/emotion_medic.png b/asset/icon/Icon16/emotion_medic.png new file mode 100644 index 0000000..df43f94 Binary files /dev/null and b/asset/icon/Icon16/emotion_medic.png differ diff --git a/asset/icon/Icon16/emotion_misdoubt.png b/asset/icon/Icon16/emotion_misdoubt.png new file mode 100644 index 0000000..c6fbdb3 Binary files /dev/null and b/asset/icon/Icon16/emotion_misdoubt.png differ diff --git a/asset/icon/Icon16/emotion_money.png b/asset/icon/Icon16/emotion_money.png new file mode 100644 index 0000000..c0c1ad3 Binary files /dev/null and b/asset/icon/Icon16/emotion_money.png differ diff --git a/asset/icon/Icon16/emotion_mummy.png b/asset/icon/Icon16/emotion_mummy.png new file mode 100644 index 0000000..ce60790 Binary files /dev/null and b/asset/icon/Icon16/emotion_mummy.png differ diff --git a/asset/icon/Icon16/emotion_musician.png b/asset/icon/Icon16/emotion_musician.png new file mode 100644 index 0000000..acca109 Binary files /dev/null and b/asset/icon/Icon16/emotion_musician.png differ diff --git a/asset/icon/Icon16/emotion_nerd.png b/asset/icon/Icon16/emotion_nerd.png new file mode 100644 index 0000000..36315b8 Binary files /dev/null and b/asset/icon/Icon16/emotion_nerd.png differ diff --git a/asset/icon/Icon16/emotion_ninja.png b/asset/icon/Icon16/emotion_ninja.png new file mode 100644 index 0000000..0e599a8 Binary files /dev/null and b/asset/icon/Icon16/emotion_ninja.png differ diff --git a/asset/icon/Icon16/emotion_nom_nom.png b/asset/icon/Icon16/emotion_nom_nom.png new file mode 100644 index 0000000..3b73276 Binary files /dev/null and b/asset/icon/Icon16/emotion_nom_nom.png differ diff --git a/asset/icon/Icon16/emotion_nose_pick.png b/asset/icon/Icon16/emotion_nose_pick.png new file mode 100644 index 0000000..7e75da4 Binary files /dev/null and b/asset/icon/Icon16/emotion_nose_pick.png differ diff --git a/asset/icon/Icon16/emotion_nosebleed.png b/asset/icon/Icon16/emotion_nosebleed.png new file mode 100644 index 0000000..fe29be1 Binary files /dev/null and b/asset/icon/Icon16/emotion_nosebleed.png differ diff --git a/asset/icon/Icon16/emotion_oddball.png b/asset/icon/Icon16/emotion_oddball.png new file mode 100644 index 0000000..2f326ad Binary files /dev/null and b/asset/icon/Icon16/emotion_oddball.png differ diff --git a/asset/icon/Icon16/emotion_party.png b/asset/icon/Icon16/emotion_party.png new file mode 100644 index 0000000..c718d9a Binary files /dev/null and b/asset/icon/Icon16/emotion_party.png differ diff --git a/asset/icon/Icon16/emotion_patient.png b/asset/icon/Icon16/emotion_patient.png new file mode 100644 index 0000000..6ec86ee Binary files /dev/null and b/asset/icon/Icon16/emotion_patient.png differ diff --git a/asset/icon/Icon16/emotion_pirate.png b/asset/icon/Icon16/emotion_pirate.png new file mode 100644 index 0000000..ef0d8e7 Binary files /dev/null and b/asset/icon/Icon16/emotion_pirate.png differ diff --git a/asset/icon/Icon16/emotion_pumpkin.png b/asset/icon/Icon16/emotion_pumpkin.png new file mode 100644 index 0000000..49eee04 Binary files /dev/null and b/asset/icon/Icon16/emotion_pumpkin.png differ diff --git a/asset/icon/Icon16/emotion_punk.png b/asset/icon/Icon16/emotion_punk.png new file mode 100644 index 0000000..13d96e8 Binary files /dev/null and b/asset/icon/Icon16/emotion_punk.png differ diff --git a/asset/icon/Icon16/emotion_question.png b/asset/icon/Icon16/emotion_question.png new file mode 100644 index 0000000..63c8d04 Binary files /dev/null and b/asset/icon/Icon16/emotion_question.png differ diff --git a/asset/icon/Icon16/emotion_rap.png b/asset/icon/Icon16/emotion_rap.png new file mode 100644 index 0000000..6a8199f Binary files /dev/null and b/asset/icon/Icon16/emotion_rap.png differ diff --git a/asset/icon/Icon16/emotion_razz.png b/asset/icon/Icon16/emotion_razz.png new file mode 100644 index 0000000..02c521a Binary files /dev/null and b/asset/icon/Icon16/emotion_razz.png differ diff --git a/asset/icon/Icon16/emotion_reading.png b/asset/icon/Icon16/emotion_reading.png new file mode 100644 index 0000000..6946670 Binary files /dev/null and b/asset/icon/Icon16/emotion_reading.png differ diff --git a/asset/icon/Icon16/emotion_red.png b/asset/icon/Icon16/emotion_red.png new file mode 100644 index 0000000..3f31fe6 Binary files /dev/null and b/asset/icon/Icon16/emotion_red.png differ diff --git a/asset/icon/Icon16/emotion_rocknroll.png b/asset/icon/Icon16/emotion_rocknroll.png new file mode 100644 index 0000000..d11e3d5 Binary files /dev/null and b/asset/icon/Icon16/emotion_rocknroll.png differ diff --git a/asset/icon/Icon16/emotion_sad.png b/asset/icon/Icon16/emotion_sad.png new file mode 100644 index 0000000..364b6e6 Binary files /dev/null and b/asset/icon/Icon16/emotion_sad.png differ diff --git a/asset/icon/Icon16/emotion_shame.png b/asset/icon/Icon16/emotion_shame.png new file mode 100644 index 0000000..e4f4e62 Binary files /dev/null and b/asset/icon/Icon16/emotion_shame.png differ diff --git a/asset/icon/Icon16/emotion_shave.png b/asset/icon/Icon16/emotion_shave.png new file mode 100644 index 0000000..1c6e906 Binary files /dev/null and b/asset/icon/Icon16/emotion_shave.png differ diff --git a/asset/icon/Icon16/emotion_shocked.png b/asset/icon/Icon16/emotion_shocked.png new file mode 100644 index 0000000..4130966 Binary files /dev/null and b/asset/icon/Icon16/emotion_shocked.png differ diff --git a/asset/icon/Icon16/emotion_sick.png b/asset/icon/Icon16/emotion_sick.png new file mode 100644 index 0000000..5b3db81 Binary files /dev/null and b/asset/icon/Icon16/emotion_sick.png differ diff --git a/asset/icon/Icon16/emotion_silent.png b/asset/icon/Icon16/emotion_silent.png new file mode 100644 index 0000000..2c4b42b Binary files /dev/null and b/asset/icon/Icon16/emotion_silent.png differ diff --git a/asset/icon/Icon16/emotion_skull.png b/asset/icon/Icon16/emotion_skull.png new file mode 100644 index 0000000..d75aa26 Binary files /dev/null and b/asset/icon/Icon16/emotion_skull.png differ diff --git a/asset/icon/Icon16/emotion_sleep.png b/asset/icon/Icon16/emotion_sleep.png new file mode 100644 index 0000000..e8b0b29 Binary files /dev/null and b/asset/icon/Icon16/emotion_sleep.png differ diff --git a/asset/icon/Icon16/emotion_smile.png b/asset/icon/Icon16/emotion_smile.png new file mode 100644 index 0000000..d7d39ff Binary files /dev/null and b/asset/icon/Icon16/emotion_smile.png differ diff --git a/asset/icon/Icon16/emotion_smokes_grass.png b/asset/icon/Icon16/emotion_smokes_grass.png new file mode 100644 index 0000000..694910d Binary files /dev/null and b/asset/icon/Icon16/emotion_smokes_grass.png differ diff --git a/asset/icon/Icon16/emotion_snooty.png b/asset/icon/Icon16/emotion_snooty.png new file mode 100644 index 0000000..9c85a42 Binary files /dev/null and b/asset/icon/Icon16/emotion_snooty.png differ diff --git a/asset/icon/Icon16/emotion_speaking.png b/asset/icon/Icon16/emotion_speaking.png new file mode 100644 index 0000000..8771871 Binary files /dev/null and b/asset/icon/Icon16/emotion_speaking.png differ diff --git a/asset/icon/Icon16/emotion_spiderman.png b/asset/icon/Icon16/emotion_spiderman.png new file mode 100644 index 0000000..34f7a31 Binary files /dev/null and b/asset/icon/Icon16/emotion_spiderman.png differ diff --git a/asset/icon/Icon16/emotion_spy.png b/asset/icon/Icon16/emotion_spy.png new file mode 100644 index 0000000..6c0d63c Binary files /dev/null and b/asset/icon/Icon16/emotion_spy.png differ diff --git a/asset/icon/Icon16/emotion_star.png b/asset/icon/Icon16/emotion_star.png new file mode 100644 index 0000000..8b7d181 Binary files /dev/null and b/asset/icon/Icon16/emotion_star.png differ diff --git a/asset/icon/Icon16/emotion_still_dreaming.png b/asset/icon/Icon16/emotion_still_dreaming.png new file mode 100644 index 0000000..dd16e47 Binary files /dev/null and b/asset/icon/Icon16/emotion_still_dreaming.png differ diff --git a/asset/icon/Icon16/emotion_stink.png b/asset/icon/Icon16/emotion_stink.png new file mode 100644 index 0000000..af51ed8 Binary files /dev/null and b/asset/icon/Icon16/emotion_stink.png differ diff --git a/asset/icon/Icon16/emotion_struggle.png b/asset/icon/Icon16/emotion_struggle.png new file mode 100644 index 0000000..12c1435 Binary files /dev/null and b/asset/icon/Icon16/emotion_struggle.png differ diff --git a/asset/icon/Icon16/emotion_stupid.png b/asset/icon/Icon16/emotion_stupid.png new file mode 100644 index 0000000..7c3b03d Binary files /dev/null and b/asset/icon/Icon16/emotion_stupid.png differ diff --git a/asset/icon/Icon16/emotion_superman.png b/asset/icon/Icon16/emotion_superman.png new file mode 100644 index 0000000..ef27835 Binary files /dev/null and b/asset/icon/Icon16/emotion_superman.png differ diff --git a/asset/icon/Icon16/emotion_suprised.png b/asset/icon/Icon16/emotion_suprised.png new file mode 100644 index 0000000..d2dbc5b Binary files /dev/null and b/asset/icon/Icon16/emotion_suprised.png differ diff --git a/asset/icon/Icon16/emotion_sure.png b/asset/icon/Icon16/emotion_sure.png new file mode 100644 index 0000000..d8aab09 Binary files /dev/null and b/asset/icon/Icon16/emotion_sure.png differ diff --git a/asset/icon/Icon16/emotion_surrender.png b/asset/icon/Icon16/emotion_surrender.png new file mode 100644 index 0000000..b6599df Binary files /dev/null and b/asset/icon/Icon16/emotion_surrender.png differ diff --git a/asset/icon/Icon16/emotion_sweat.png b/asset/icon/Icon16/emotion_sweat.png new file mode 100644 index 0000000..65881fb Binary files /dev/null and b/asset/icon/Icon16/emotion_sweat.png differ diff --git a/asset/icon/Icon16/emotion_terminator.png b/asset/icon/Icon16/emotion_terminator.png new file mode 100644 index 0000000..2435354 Binary files /dev/null and b/asset/icon/Icon16/emotion_terminator.png differ diff --git a/asset/icon/Icon16/emotion_tire.png b/asset/icon/Icon16/emotion_tire.png new file mode 100644 index 0000000..53eb25e Binary files /dev/null and b/asset/icon/Icon16/emotion_tire.png differ diff --git a/asset/icon/Icon16/emotion_tomato.png b/asset/icon/Icon16/emotion_tomato.png new file mode 100644 index 0000000..411f705 Binary files /dev/null and b/asset/icon/Icon16/emotion_tomato.png differ diff --git a/asset/icon/Icon16/emotion_tongue.png b/asset/icon/Icon16/emotion_tongue.png new file mode 100644 index 0000000..8b4f2d6 Binary files /dev/null and b/asset/icon/Icon16/emotion_tongue.png differ diff --git a/asset/icon/Icon16/emotion_too_sad.png b/asset/icon/Icon16/emotion_too_sad.png new file mode 100644 index 0000000..50a1b7f Binary files /dev/null and b/asset/icon/Icon16/emotion_too_sad.png differ diff --git a/asset/icon/Icon16/emotion_umbrella.png b/asset/icon/Icon16/emotion_umbrella.png new file mode 100644 index 0000000..20c98e5 Binary files /dev/null and b/asset/icon/Icon16/emotion_umbrella.png differ diff --git a/asset/icon/Icon16/emotion_unbelievable.png b/asset/icon/Icon16/emotion_unbelievable.png new file mode 100644 index 0000000..8d21e27 Binary files /dev/null and b/asset/icon/Icon16/emotion_unbelievable.png differ diff --git a/asset/icon/Icon16/emotion_unhappy(2).png b/asset/icon/Icon16/emotion_unhappy(2).png new file mode 100644 index 0000000..2e6b120 Binary files /dev/null and b/asset/icon/Icon16/emotion_unhappy(2).png differ diff --git a/asset/icon/Icon16/emotion_unhappy.png b/asset/icon/Icon16/emotion_unhappy.png new file mode 100644 index 0000000..f622a5b Binary files /dev/null and b/asset/icon/Icon16/emotion_unhappy.png differ diff --git a/asset/icon/Icon16/emotion_unshaven.png b/asset/icon/Icon16/emotion_unshaven.png new file mode 100644 index 0000000..03fca6b Binary files /dev/null and b/asset/icon/Icon16/emotion_unshaven.png differ diff --git a/asset/icon/Icon16/emotion_vampire.png b/asset/icon/Icon16/emotion_vampire.png new file mode 100644 index 0000000..e476cbc Binary files /dev/null and b/asset/icon/Icon16/emotion_vampire.png differ diff --git a/asset/icon/Icon16/emotion_victory.png b/asset/icon/Icon16/emotion_victory.png new file mode 100644 index 0000000..c8c4f10 Binary files /dev/null and b/asset/icon/Icon16/emotion_victory.png differ diff --git a/asset/icon/Icon16/emotion_viking.png b/asset/icon/Icon16/emotion_viking.png new file mode 100644 index 0000000..278b274 Binary files /dev/null and b/asset/icon/Icon16/emotion_viking.png differ diff --git a/asset/icon/Icon16/emotion_waaaht.png b/asset/icon/Icon16/emotion_waaaht.png new file mode 100644 index 0000000..9da41e7 Binary files /dev/null and b/asset/icon/Icon16/emotion_waaaht.png differ diff --git a/asset/icon/Icon16/emotion_waii.png b/asset/icon/Icon16/emotion_waii.png new file mode 100644 index 0000000..082cc35 Binary files /dev/null and b/asset/icon/Icon16/emotion_waii.png differ diff --git a/asset/icon/Icon16/emotion_watermelon.png b/asset/icon/Icon16/emotion_watermelon.png new file mode 100644 index 0000000..ae0f313 Binary files /dev/null and b/asset/icon/Icon16/emotion_watermelon.png differ diff --git a/asset/icon/Icon16/emotion_what.png b/asset/icon/Icon16/emotion_what.png new file mode 100644 index 0000000..60782ba Binary files /dev/null and b/asset/icon/Icon16/emotion_what.png differ diff --git a/asset/icon/Icon16/emotion_whew.png b/asset/icon/Icon16/emotion_whew.png new file mode 100644 index 0000000..eddd840 Binary files /dev/null and b/asset/icon/Icon16/emotion_whew.png differ diff --git a/asset/icon/Icon16/emotion_whist.png b/asset/icon/Icon16/emotion_whist.png new file mode 100644 index 0000000..d96bfa1 Binary files /dev/null and b/asset/icon/Icon16/emotion_whist.png differ diff --git a/asset/icon/Icon16/emotion_wink.png b/asset/icon/Icon16/emotion_wink.png new file mode 100644 index 0000000..8dc93c9 Binary files /dev/null and b/asset/icon/Icon16/emotion_wink.png differ diff --git a/asset/icon/Icon16/emotion_yuush.png b/asset/icon/Icon16/emotion_yuush.png new file mode 100644 index 0000000..d47fb99 Binary files /dev/null and b/asset/icon/Icon16/emotion_yuush.png differ diff --git a/asset/icon/Icon16/emotion_zedz.png b/asset/icon/Icon16/emotion_zedz.png new file mode 100644 index 0000000..c1b9748 Binary files /dev/null and b/asset/icon/Icon16/emotion_zedz.png differ diff --git a/asset/icon/Icon16/emotion_zingy.png b/asset/icon/Icon16/emotion_zingy.png new file mode 100644 index 0000000..a100bea Binary files /dev/null and b/asset/icon/Icon16/emotion_zingy.png differ diff --git a/asset/icon/Icon16/entity.png b/asset/icon/Icon16/entity.png new file mode 100644 index 0000000..9ab1e9b Binary files /dev/null and b/asset/icon/Icon16/entity.png differ diff --git a/asset/icon/Icon16/envelope.png b/asset/icon/Icon16/envelope.png new file mode 100644 index 0000000..9322c25 Binary files /dev/null and b/asset/icon/Icon16/envelope.png differ diff --git a/asset/icon/Icon16/envelope_string.png b/asset/icon/Icon16/envelope_string.png new file mode 100644 index 0000000..0df5af1 Binary files /dev/null and b/asset/icon/Icon16/envelope_string.png differ diff --git a/asset/icon/Icon16/envelopes.png b/asset/icon/Icon16/envelopes.png new file mode 100644 index 0000000..939d8ce Binary files /dev/null and b/asset/icon/Icon16/envelopes.png differ diff --git a/asset/icon/Icon16/error.png b/asset/icon/Icon16/error.png new file mode 100644 index 0000000..dbfda22 Binary files /dev/null and b/asset/icon/Icon16/error.png differ diff --git a/asset/icon/Icon16/error_add.png b/asset/icon/Icon16/error_add.png new file mode 100644 index 0000000..f2346cb Binary files /dev/null and b/asset/icon/Icon16/error_add.png differ diff --git a/asset/icon/Icon16/error_checking.png b/asset/icon/Icon16/error_checking.png new file mode 100644 index 0000000..8d7d010 Binary files /dev/null and b/asset/icon/Icon16/error_checking.png differ diff --git a/asset/icon/Icon16/error_delete.png b/asset/icon/Icon16/error_delete.png new file mode 100644 index 0000000..bedfa31 Binary files /dev/null and b/asset/icon/Icon16/error_delete.png differ diff --git a/asset/icon/Icon16/error_go.png b/asset/icon/Icon16/error_go.png new file mode 100644 index 0000000..3cd1f24 Binary files /dev/null and b/asset/icon/Icon16/error_go.png differ diff --git a/asset/icon/Icon16/error_log.png b/asset/icon/Icon16/error_log.png new file mode 100644 index 0000000..7e6245b Binary files /dev/null and b/asset/icon/Icon16/error_log.png differ diff --git a/asset/icon/Icon16/error_pages.png b/asset/icon/Icon16/error_pages.png new file mode 100644 index 0000000..707ca1a Binary files /dev/null and b/asset/icon/Icon16/error_pages.png differ diff --git a/asset/icon/Icon16/escimo_pie.png b/asset/icon/Icon16/escimo_pie.png new file mode 100644 index 0000000..e9220c0 Binary files /dev/null and b/asset/icon/Icon16/escimo_pie.png differ diff --git a/asset/icon/Icon16/evacuator.png b/asset/icon/Icon16/evacuator.png new file mode 100644 index 0000000..056a473 Binary files /dev/null and b/asset/icon/Icon16/evacuator.png differ diff --git a/asset/icon/Icon16/evaluate_formula.png b/asset/icon/Icon16/evaluate_formula.png new file mode 100644 index 0000000..1df37a1 Binary files /dev/null and b/asset/icon/Icon16/evaluate_formula.png differ diff --git a/asset/icon/Icon16/events.png b/asset/icon/Icon16/events.png new file mode 100644 index 0000000..949253a Binary files /dev/null and b/asset/icon/Icon16/events.png differ diff --git a/asset/icon/Icon16/evernote.png b/asset/icon/Icon16/evernote.png new file mode 100644 index 0000000..85e03fe Binary files /dev/null and b/asset/icon/Icon16/evernote.png differ diff --git a/asset/icon/Icon16/excel_exports.png b/asset/icon/Icon16/excel_exports.png new file mode 100644 index 0000000..889c63f Binary files /dev/null and b/asset/icon/Icon16/excel_exports.png differ diff --git a/asset/icon/Icon16/excel_imports.png b/asset/icon/Icon16/excel_imports.png new file mode 100644 index 0000000..2d44937 Binary files /dev/null and b/asset/icon/Icon16/excel_imports.png differ diff --git a/asset/icon/Icon16/exclamation.png b/asset/icon/Icon16/exclamation.png new file mode 100644 index 0000000..d49653a Binary files /dev/null and b/asset/icon/Icon16/exclamation.png differ diff --git a/asset/icon/Icon16/export_excel.png b/asset/icon/Icon16/export_excel.png new file mode 100644 index 0000000..9093f1a Binary files /dev/null and b/asset/icon/Icon16/export_excel.png differ diff --git a/asset/icon/Icon16/external.png b/asset/icon/Icon16/external.png new file mode 100644 index 0000000..26e25f3 Binary files /dev/null and b/asset/icon/Icon16/external.png differ diff --git a/asset/icon/Icon16/extract_foreground_objects.png b/asset/icon/Icon16/extract_foreground_objects.png new file mode 100644 index 0000000..8b84078 Binary files /dev/null and b/asset/icon/Icon16/extract_foreground_objects.png differ diff --git a/asset/icon/Icon16/eye.png b/asset/icon/Icon16/eye.png new file mode 100644 index 0000000..403aaa4 Binary files /dev/null and b/asset/icon/Icon16/eye.png differ diff --git a/asset/icon/Icon16/eye_close.png b/asset/icon/Icon16/eye_close.png new file mode 100644 index 0000000..687cad5 Binary files /dev/null and b/asset/icon/Icon16/eye_close.png differ diff --git a/asset/icon/Icon16/eye_half.png b/asset/icon/Icon16/eye_half.png new file mode 100644 index 0000000..bbffcdc Binary files /dev/null and b/asset/icon/Icon16/eye_half.png differ diff --git a/asset/icon/Icon16/eye_red.png b/asset/icon/Icon16/eye_red.png new file mode 100644 index 0000000..aba68da Binary files /dev/null and b/asset/icon/Icon16/eye_red.png differ diff --git a/asset/icon/Icon16/faberge_egg.png b/asset/icon/Icon16/faberge_egg.png new file mode 100644 index 0000000..bf28805 Binary files /dev/null and b/asset/icon/Icon16/faberge_egg.png differ diff --git a/asset/icon/Icon16/facebook.png b/asset/icon/Icon16/facebook.png new file mode 100644 index 0000000..42dac89 Binary files /dev/null and b/asset/icon/Icon16/facebook.png differ diff --git a/asset/icon/Icon16/factory.png b/asset/icon/Icon16/factory.png new file mode 100644 index 0000000..a27b9dd Binary files /dev/null and b/asset/icon/Icon16/factory.png differ diff --git a/asset/icon/Icon16/fatcow.png b/asset/icon/Icon16/fatcow.png new file mode 100644 index 0000000..c52ff04 Binary files /dev/null and b/asset/icon/Icon16/fatcow.png differ diff --git a/asset/icon/Icon16/fax.png b/asset/icon/Icon16/fax.png new file mode 100644 index 0000000..791f511 Binary files /dev/null and b/asset/icon/Icon16/fax.png differ diff --git a/asset/icon/Icon16/fedora.png b/asset/icon/Icon16/fedora.png new file mode 100644 index 0000000..18b715a Binary files /dev/null and b/asset/icon/Icon16/fedora.png differ diff --git a/asset/icon/Icon16/feed.png b/asset/icon/Icon16/feed.png new file mode 100644 index 0000000..99987a3 Binary files /dev/null and b/asset/icon/Icon16/feed.png differ diff --git a/asset/icon/Icon16/feed_add.png b/asset/icon/Icon16/feed_add.png new file mode 100644 index 0000000..d9dfbfc Binary files /dev/null and b/asset/icon/Icon16/feed_add.png differ diff --git a/asset/icon/Icon16/feed_delete.png b/asset/icon/Icon16/feed_delete.png new file mode 100644 index 0000000..b49a38d Binary files /dev/null and b/asset/icon/Icon16/feed_delete.png differ diff --git a/asset/icon/Icon16/feed_disk.png b/asset/icon/Icon16/feed_disk.png new file mode 100644 index 0000000..355e794 Binary files /dev/null and b/asset/icon/Icon16/feed_disk.png differ diff --git a/asset/icon/Icon16/feed_edit.png b/asset/icon/Icon16/feed_edit.png new file mode 100644 index 0000000..5616147 Binary files /dev/null and b/asset/icon/Icon16/feed_edit.png differ diff --git a/asset/icon/Icon16/feed_error.png b/asset/icon/Icon16/feed_error.png new file mode 100644 index 0000000..6e50982 Binary files /dev/null and b/asset/icon/Icon16/feed_error.png differ diff --git a/asset/icon/Icon16/feed_go.png b/asset/icon/Icon16/feed_go.png new file mode 100644 index 0000000..f799c8f Binary files /dev/null and b/asset/icon/Icon16/feed_go.png differ diff --git a/asset/icon/Icon16/feed_key.png b/asset/icon/Icon16/feed_key.png new file mode 100644 index 0000000..a482b00 Binary files /dev/null and b/asset/icon/Icon16/feed_key.png differ diff --git a/asset/icon/Icon16/feed_magnify.png b/asset/icon/Icon16/feed_magnify.png new file mode 100644 index 0000000..af79e89 Binary files /dev/null and b/asset/icon/Icon16/feed_magnify.png differ diff --git a/asset/icon/Icon16/female.png b/asset/icon/Icon16/female.png new file mode 100644 index 0000000..c61a09b Binary files /dev/null and b/asset/icon/Icon16/female.png differ diff --git a/asset/icon/Icon16/field_size.png b/asset/icon/Icon16/field_size.png new file mode 100644 index 0000000..5ff9846 Binary files /dev/null and b/asset/icon/Icon16/field_size.png differ diff --git a/asset/icon/Icon16/file_extension_3gp.png b/asset/icon/Icon16/file_extension_3gp.png new file mode 100644 index 0000000..4065bdf Binary files /dev/null and b/asset/icon/Icon16/file_extension_3gp.png differ diff --git a/asset/icon/Icon16/file_extension_7z.png b/asset/icon/Icon16/file_extension_7z.png new file mode 100644 index 0000000..81e33eb Binary files /dev/null and b/asset/icon/Icon16/file_extension_7z.png differ diff --git a/asset/icon/Icon16/file_extension_ace.png b/asset/icon/Icon16/file_extension_ace.png new file mode 100644 index 0000000..912abbd Binary files /dev/null and b/asset/icon/Icon16/file_extension_ace.png differ diff --git a/asset/icon/Icon16/file_extension_ai.png b/asset/icon/Icon16/file_extension_ai.png new file mode 100644 index 0000000..7623460 Binary files /dev/null and b/asset/icon/Icon16/file_extension_ai.png differ diff --git a/asset/icon/Icon16/file_extension_aif.png b/asset/icon/Icon16/file_extension_aif.png new file mode 100644 index 0000000..9edd1c0 Binary files /dev/null and b/asset/icon/Icon16/file_extension_aif.png differ diff --git a/asset/icon/Icon16/file_extension_aiff.png b/asset/icon/Icon16/file_extension_aiff.png new file mode 100644 index 0000000..6bd4ab7 Binary files /dev/null and b/asset/icon/Icon16/file_extension_aiff.png differ diff --git a/asset/icon/Icon16/file_extension_amr.png b/asset/icon/Icon16/file_extension_amr.png new file mode 100644 index 0000000..9fa5935 Binary files /dev/null and b/asset/icon/Icon16/file_extension_amr.png differ diff --git a/asset/icon/Icon16/file_extension_asf.png b/asset/icon/Icon16/file_extension_asf.png new file mode 100644 index 0000000..2ff894e Binary files /dev/null and b/asset/icon/Icon16/file_extension_asf.png differ diff --git a/asset/icon/Icon16/file_extension_asx.png b/asset/icon/Icon16/file_extension_asx.png new file mode 100644 index 0000000..28f610a Binary files /dev/null and b/asset/icon/Icon16/file_extension_asx.png differ diff --git a/asset/icon/Icon16/file_extension_bat.png b/asset/icon/Icon16/file_extension_bat.png new file mode 100644 index 0000000..1edba76 Binary files /dev/null and b/asset/icon/Icon16/file_extension_bat.png differ diff --git a/asset/icon/Icon16/file_extension_bin.png b/asset/icon/Icon16/file_extension_bin.png new file mode 100644 index 0000000..4c5411e Binary files /dev/null and b/asset/icon/Icon16/file_extension_bin.png differ diff --git a/asset/icon/Icon16/file_extension_bmp.png b/asset/icon/Icon16/file_extension_bmp.png new file mode 100644 index 0000000..42aa002 Binary files /dev/null and b/asset/icon/Icon16/file_extension_bmp.png differ diff --git a/asset/icon/Icon16/file_extension_bup.png b/asset/icon/Icon16/file_extension_bup.png new file mode 100644 index 0000000..ce04201 Binary files /dev/null and b/asset/icon/Icon16/file_extension_bup.png differ diff --git a/asset/icon/Icon16/file_extension_cab.png b/asset/icon/Icon16/file_extension_cab.png new file mode 100644 index 0000000..74aef83 Binary files /dev/null and b/asset/icon/Icon16/file_extension_cab.png differ diff --git a/asset/icon/Icon16/file_extension_cbr.png b/asset/icon/Icon16/file_extension_cbr.png new file mode 100644 index 0000000..9b79766 Binary files /dev/null and b/asset/icon/Icon16/file_extension_cbr.png differ diff --git a/asset/icon/Icon16/file_extension_cda.png b/asset/icon/Icon16/file_extension_cda.png new file mode 100644 index 0000000..e904544 Binary files /dev/null and b/asset/icon/Icon16/file_extension_cda.png differ diff --git a/asset/icon/Icon16/file_extension_cdl.png b/asset/icon/Icon16/file_extension_cdl.png new file mode 100644 index 0000000..e52bc64 Binary files /dev/null and b/asset/icon/Icon16/file_extension_cdl.png differ diff --git a/asset/icon/Icon16/file_extension_cdr.png b/asset/icon/Icon16/file_extension_cdr.png new file mode 100644 index 0000000..277b23d Binary files /dev/null and b/asset/icon/Icon16/file_extension_cdr.png differ diff --git a/asset/icon/Icon16/file_extension_chm.png b/asset/icon/Icon16/file_extension_chm.png new file mode 100644 index 0000000..3d7b07c Binary files /dev/null and b/asset/icon/Icon16/file_extension_chm.png differ diff --git a/asset/icon/Icon16/file_extension_dat.png b/asset/icon/Icon16/file_extension_dat.png new file mode 100644 index 0000000..758a0e1 Binary files /dev/null and b/asset/icon/Icon16/file_extension_dat.png differ diff --git a/asset/icon/Icon16/file_extension_divx.png b/asset/icon/Icon16/file_extension_divx.png new file mode 100644 index 0000000..204c9d0 Binary files /dev/null and b/asset/icon/Icon16/file_extension_divx.png differ diff --git a/asset/icon/Icon16/file_extension_dll.png b/asset/icon/Icon16/file_extension_dll.png new file mode 100644 index 0000000..49111a9 Binary files /dev/null and b/asset/icon/Icon16/file_extension_dll.png differ diff --git a/asset/icon/Icon16/file_extension_dmg.png b/asset/icon/Icon16/file_extension_dmg.png new file mode 100644 index 0000000..d8d6a81 Binary files /dev/null and b/asset/icon/Icon16/file_extension_dmg.png differ diff --git a/asset/icon/Icon16/file_extension_doc.png b/asset/icon/Icon16/file_extension_doc.png new file mode 100644 index 0000000..dfd46f9 Binary files /dev/null and b/asset/icon/Icon16/file_extension_doc.png differ diff --git a/asset/icon/Icon16/file_extension_dss.png b/asset/icon/Icon16/file_extension_dss.png new file mode 100644 index 0000000..4752a95 Binary files /dev/null and b/asset/icon/Icon16/file_extension_dss.png differ diff --git a/asset/icon/Icon16/file_extension_dvf.png b/asset/icon/Icon16/file_extension_dvf.png new file mode 100644 index 0000000..27e4c23 Binary files /dev/null and b/asset/icon/Icon16/file_extension_dvf.png differ diff --git a/asset/icon/Icon16/file_extension_dwg.png b/asset/icon/Icon16/file_extension_dwg.png new file mode 100644 index 0000000..9dd4c90 Binary files /dev/null and b/asset/icon/Icon16/file_extension_dwg.png differ diff --git a/asset/icon/Icon16/file_extension_eml.png b/asset/icon/Icon16/file_extension_eml.png new file mode 100644 index 0000000..e6f3174 Binary files /dev/null and b/asset/icon/Icon16/file_extension_eml.png differ diff --git a/asset/icon/Icon16/file_extension_eps.png b/asset/icon/Icon16/file_extension_eps.png new file mode 100644 index 0000000..919089b Binary files /dev/null and b/asset/icon/Icon16/file_extension_eps.png differ diff --git a/asset/icon/Icon16/file_extension_exe.png b/asset/icon/Icon16/file_extension_exe.png new file mode 100644 index 0000000..09bbde7 Binary files /dev/null and b/asset/icon/Icon16/file_extension_exe.png differ diff --git a/asset/icon/Icon16/file_extension_fla.png b/asset/icon/Icon16/file_extension_fla.png new file mode 100644 index 0000000..81f80e9 Binary files /dev/null and b/asset/icon/Icon16/file_extension_fla.png differ diff --git a/asset/icon/Icon16/file_extension_flv.png b/asset/icon/Icon16/file_extension_flv.png new file mode 100644 index 0000000..043623c Binary files /dev/null and b/asset/icon/Icon16/file_extension_flv.png differ diff --git a/asset/icon/Icon16/file_extension_gif.png b/asset/icon/Icon16/file_extension_gif.png new file mode 100644 index 0000000..efa8206 Binary files /dev/null and b/asset/icon/Icon16/file_extension_gif.png differ diff --git a/asset/icon/Icon16/file_extension_gz.png b/asset/icon/Icon16/file_extension_gz.png new file mode 100644 index 0000000..f391025 Binary files /dev/null and b/asset/icon/Icon16/file_extension_gz.png differ diff --git a/asset/icon/Icon16/file_extension_hqx.png b/asset/icon/Icon16/file_extension_hqx.png new file mode 100644 index 0000000..e1fe0be Binary files /dev/null and b/asset/icon/Icon16/file_extension_hqx.png differ diff --git a/asset/icon/Icon16/file_extension_htm.png b/asset/icon/Icon16/file_extension_htm.png new file mode 100644 index 0000000..bcd6f0e Binary files /dev/null and b/asset/icon/Icon16/file_extension_htm.png differ diff --git a/asset/icon/Icon16/file_extension_html.png b/asset/icon/Icon16/file_extension_html.png new file mode 100644 index 0000000..a78b68e Binary files /dev/null and b/asset/icon/Icon16/file_extension_html.png differ diff --git a/asset/icon/Icon16/file_extension_ifo.png b/asset/icon/Icon16/file_extension_ifo.png new file mode 100644 index 0000000..541c14e Binary files /dev/null and b/asset/icon/Icon16/file_extension_ifo.png differ diff --git a/asset/icon/Icon16/file_extension_indd.png b/asset/icon/Icon16/file_extension_indd.png new file mode 100644 index 0000000..812e3c0 Binary files /dev/null and b/asset/icon/Icon16/file_extension_indd.png differ diff --git a/asset/icon/Icon16/file_extension_iso.png b/asset/icon/Icon16/file_extension_iso.png new file mode 100644 index 0000000..f1e060e Binary files /dev/null and b/asset/icon/Icon16/file_extension_iso.png differ diff --git a/asset/icon/Icon16/file_extension_jar.png b/asset/icon/Icon16/file_extension_jar.png new file mode 100644 index 0000000..f77a21c Binary files /dev/null and b/asset/icon/Icon16/file_extension_jar.png differ diff --git a/asset/icon/Icon16/file_extension_jpeg.png b/asset/icon/Icon16/file_extension_jpeg.png new file mode 100644 index 0000000..a69dff9 Binary files /dev/null and b/asset/icon/Icon16/file_extension_jpeg.png differ diff --git a/asset/icon/Icon16/file_extension_jpg.png b/asset/icon/Icon16/file_extension_jpg.png new file mode 100644 index 0000000..6ec08d7 Binary files /dev/null and b/asset/icon/Icon16/file_extension_jpg.png differ diff --git a/asset/icon/Icon16/file_extension_lnk.png b/asset/icon/Icon16/file_extension_lnk.png new file mode 100644 index 0000000..8306dbb Binary files /dev/null and b/asset/icon/Icon16/file_extension_lnk.png differ diff --git a/asset/icon/Icon16/file_extension_log.png b/asset/icon/Icon16/file_extension_log.png new file mode 100644 index 0000000..ae294cf Binary files /dev/null and b/asset/icon/Icon16/file_extension_log.png differ diff --git a/asset/icon/Icon16/file_extension_m4a.png b/asset/icon/Icon16/file_extension_m4a.png new file mode 100644 index 0000000..9518f75 Binary files /dev/null and b/asset/icon/Icon16/file_extension_m4a.png differ diff --git a/asset/icon/Icon16/file_extension_m4b.png b/asset/icon/Icon16/file_extension_m4b.png new file mode 100644 index 0000000..f0888c7 Binary files /dev/null and b/asset/icon/Icon16/file_extension_m4b.png differ diff --git a/asset/icon/Icon16/file_extension_m4p.png b/asset/icon/Icon16/file_extension_m4p.png new file mode 100644 index 0000000..a7d8904 Binary files /dev/null and b/asset/icon/Icon16/file_extension_m4p.png differ diff --git a/asset/icon/Icon16/file_extension_m4v.png b/asset/icon/Icon16/file_extension_m4v.png new file mode 100644 index 0000000..cf0f2cf Binary files /dev/null and b/asset/icon/Icon16/file_extension_m4v.png differ diff --git a/asset/icon/Icon16/file_extension_mcd.png b/asset/icon/Icon16/file_extension_mcd.png new file mode 100644 index 0000000..403ecad Binary files /dev/null and b/asset/icon/Icon16/file_extension_mcd.png differ diff --git a/asset/icon/Icon16/file_extension_mdb.png b/asset/icon/Icon16/file_extension_mdb.png new file mode 100644 index 0000000..a74b16d Binary files /dev/null and b/asset/icon/Icon16/file_extension_mdb.png differ diff --git a/asset/icon/Icon16/file_extension_mid.png b/asset/icon/Icon16/file_extension_mid.png new file mode 100644 index 0000000..07887a0 Binary files /dev/null and b/asset/icon/Icon16/file_extension_mid.png differ diff --git a/asset/icon/Icon16/file_extension_mov.png b/asset/icon/Icon16/file_extension_mov.png new file mode 100644 index 0000000..75075c7 Binary files /dev/null and b/asset/icon/Icon16/file_extension_mov.png differ diff --git a/asset/icon/Icon16/file_extension_mp2.png b/asset/icon/Icon16/file_extension_mp2.png new file mode 100644 index 0000000..704a347 Binary files /dev/null and b/asset/icon/Icon16/file_extension_mp2.png differ diff --git a/asset/icon/Icon16/file_extension_mp4.png b/asset/icon/Icon16/file_extension_mp4.png new file mode 100644 index 0000000..ecc3d28 Binary files /dev/null and b/asset/icon/Icon16/file_extension_mp4.png differ diff --git a/asset/icon/Icon16/file_extension_mpeg.png b/asset/icon/Icon16/file_extension_mpeg.png new file mode 100644 index 0000000..6518619 Binary files /dev/null and b/asset/icon/Icon16/file_extension_mpeg.png differ diff --git a/asset/icon/Icon16/file_extension_mpg.png b/asset/icon/Icon16/file_extension_mpg.png new file mode 100644 index 0000000..d01440f Binary files /dev/null and b/asset/icon/Icon16/file_extension_mpg.png differ diff --git a/asset/icon/Icon16/file_extension_msi.png b/asset/icon/Icon16/file_extension_msi.png new file mode 100644 index 0000000..3f53d37 Binary files /dev/null and b/asset/icon/Icon16/file_extension_msi.png differ diff --git a/asset/icon/Icon16/file_extension_mswmm.png b/asset/icon/Icon16/file_extension_mswmm.png new file mode 100644 index 0000000..f8c4fc8 Binary files /dev/null and b/asset/icon/Icon16/file_extension_mswmm.png differ diff --git a/asset/icon/Icon16/file_extension_ogg.png b/asset/icon/Icon16/file_extension_ogg.png new file mode 100644 index 0000000..874915f Binary files /dev/null and b/asset/icon/Icon16/file_extension_ogg.png differ diff --git a/asset/icon/Icon16/file_extension_pdf.png b/asset/icon/Icon16/file_extension_pdf.png new file mode 100644 index 0000000..ef52e6a Binary files /dev/null and b/asset/icon/Icon16/file_extension_pdf.png differ diff --git a/asset/icon/Icon16/file_extension_png.png b/asset/icon/Icon16/file_extension_png.png new file mode 100644 index 0000000..76230d3 Binary files /dev/null and b/asset/icon/Icon16/file_extension_png.png differ diff --git a/asset/icon/Icon16/file_extension_pps.png b/asset/icon/Icon16/file_extension_pps.png new file mode 100644 index 0000000..3964c49 Binary files /dev/null and b/asset/icon/Icon16/file_extension_pps.png differ diff --git a/asset/icon/Icon16/file_extension_ps.png b/asset/icon/Icon16/file_extension_ps.png new file mode 100644 index 0000000..9bd9e03 Binary files /dev/null and b/asset/icon/Icon16/file_extension_ps.png differ diff --git a/asset/icon/Icon16/file_extension_psd.png b/asset/icon/Icon16/file_extension_psd.png new file mode 100644 index 0000000..d3f6ec5 Binary files /dev/null and b/asset/icon/Icon16/file_extension_psd.png differ diff --git a/asset/icon/Icon16/file_extension_pst.png b/asset/icon/Icon16/file_extension_pst.png new file mode 100644 index 0000000..5da647e Binary files /dev/null and b/asset/icon/Icon16/file_extension_pst.png differ diff --git a/asset/icon/Icon16/file_extension_ptb.png b/asset/icon/Icon16/file_extension_ptb.png new file mode 100644 index 0000000..8250def Binary files /dev/null and b/asset/icon/Icon16/file_extension_ptb.png differ diff --git a/asset/icon/Icon16/file_extension_pub.png b/asset/icon/Icon16/file_extension_pub.png new file mode 100644 index 0000000..806b8ba Binary files /dev/null and b/asset/icon/Icon16/file_extension_pub.png differ diff --git a/asset/icon/Icon16/file_extension_qbb.png b/asset/icon/Icon16/file_extension_qbb.png new file mode 100644 index 0000000..5e4d56b Binary files /dev/null and b/asset/icon/Icon16/file_extension_qbb.png differ diff --git a/asset/icon/Icon16/file_extension_qbw.png b/asset/icon/Icon16/file_extension_qbw.png new file mode 100644 index 0000000..7e20ff0 Binary files /dev/null and b/asset/icon/Icon16/file_extension_qbw.png differ diff --git a/asset/icon/Icon16/file_extension_qxd.png b/asset/icon/Icon16/file_extension_qxd.png new file mode 100644 index 0000000..577f6ef Binary files /dev/null and b/asset/icon/Icon16/file_extension_qxd.png differ diff --git a/asset/icon/Icon16/file_extension_ram.png b/asset/icon/Icon16/file_extension_ram.png new file mode 100644 index 0000000..18a73cd Binary files /dev/null and b/asset/icon/Icon16/file_extension_ram.png differ diff --git a/asset/icon/Icon16/file_extension_rar.png b/asset/icon/Icon16/file_extension_rar.png new file mode 100644 index 0000000..6a94dd8 Binary files /dev/null and b/asset/icon/Icon16/file_extension_rar.png differ diff --git a/asset/icon/Icon16/file_extension_rm.png b/asset/icon/Icon16/file_extension_rm.png new file mode 100644 index 0000000..ca0983b Binary files /dev/null and b/asset/icon/Icon16/file_extension_rm.png differ diff --git a/asset/icon/Icon16/file_extension_rmvb.png b/asset/icon/Icon16/file_extension_rmvb.png new file mode 100644 index 0000000..9c533a0 Binary files /dev/null and b/asset/icon/Icon16/file_extension_rmvb.png differ diff --git a/asset/icon/Icon16/file_extension_rtf.png b/asset/icon/Icon16/file_extension_rtf.png new file mode 100644 index 0000000..a7efed7 Binary files /dev/null and b/asset/icon/Icon16/file_extension_rtf.png differ diff --git a/asset/icon/Icon16/file_extension_sea.png b/asset/icon/Icon16/file_extension_sea.png new file mode 100644 index 0000000..03f87f8 Binary files /dev/null and b/asset/icon/Icon16/file_extension_sea.png differ diff --git a/asset/icon/Icon16/file_extension_ses.png b/asset/icon/Icon16/file_extension_ses.png new file mode 100644 index 0000000..a856386 Binary files /dev/null and b/asset/icon/Icon16/file_extension_ses.png differ diff --git a/asset/icon/Icon16/file_extension_sit.png b/asset/icon/Icon16/file_extension_sit.png new file mode 100644 index 0000000..98206fc Binary files /dev/null and b/asset/icon/Icon16/file_extension_sit.png differ diff --git a/asset/icon/Icon16/file_extension_sitx.png b/asset/icon/Icon16/file_extension_sitx.png new file mode 100644 index 0000000..3c3bb4c Binary files /dev/null and b/asset/icon/Icon16/file_extension_sitx.png differ diff --git a/asset/icon/Icon16/file_extension_ss.png b/asset/icon/Icon16/file_extension_ss.png new file mode 100644 index 0000000..7d056d0 Binary files /dev/null and b/asset/icon/Icon16/file_extension_ss.png differ diff --git a/asset/icon/Icon16/file_extension_swf.png b/asset/icon/Icon16/file_extension_swf.png new file mode 100644 index 0000000..5650971 Binary files /dev/null and b/asset/icon/Icon16/file_extension_swf.png differ diff --git a/asset/icon/Icon16/file_extension_tgz.png b/asset/icon/Icon16/file_extension_tgz.png new file mode 100644 index 0000000..5253aab Binary files /dev/null and b/asset/icon/Icon16/file_extension_tgz.png differ diff --git a/asset/icon/Icon16/file_extension_thm.png b/asset/icon/Icon16/file_extension_thm.png new file mode 100644 index 0000000..b3acbb1 Binary files /dev/null and b/asset/icon/Icon16/file_extension_thm.png differ diff --git a/asset/icon/Icon16/file_extension_tif.png b/asset/icon/Icon16/file_extension_tif.png new file mode 100644 index 0000000..a284f79 Binary files /dev/null and b/asset/icon/Icon16/file_extension_tif.png differ diff --git a/asset/icon/Icon16/file_extension_tmp.png b/asset/icon/Icon16/file_extension_tmp.png new file mode 100644 index 0000000..80c165b Binary files /dev/null and b/asset/icon/Icon16/file_extension_tmp.png differ diff --git a/asset/icon/Icon16/file_extension_torrent.png b/asset/icon/Icon16/file_extension_torrent.png new file mode 100644 index 0000000..09de7ab Binary files /dev/null and b/asset/icon/Icon16/file_extension_torrent.png differ diff --git a/asset/icon/Icon16/file_extension_ttf.png b/asset/icon/Icon16/file_extension_ttf.png new file mode 100644 index 0000000..51a0bbb Binary files /dev/null and b/asset/icon/Icon16/file_extension_ttf.png differ diff --git a/asset/icon/Icon16/file_extension_txt.png b/asset/icon/Icon16/file_extension_txt.png new file mode 100644 index 0000000..e3bed85 Binary files /dev/null and b/asset/icon/Icon16/file_extension_txt.png differ diff --git a/asset/icon/Icon16/file_extension_vcd.png b/asset/icon/Icon16/file_extension_vcd.png new file mode 100644 index 0000000..5380d08 Binary files /dev/null and b/asset/icon/Icon16/file_extension_vcd.png differ diff --git a/asset/icon/Icon16/file_extension_vob.png b/asset/icon/Icon16/file_extension_vob.png new file mode 100644 index 0000000..5a5dde8 Binary files /dev/null and b/asset/icon/Icon16/file_extension_vob.png differ diff --git a/asset/icon/Icon16/file_extension_wav.png b/asset/icon/Icon16/file_extension_wav.png new file mode 100644 index 0000000..6897534 Binary files /dev/null and b/asset/icon/Icon16/file_extension_wav.png differ diff --git a/asset/icon/Icon16/file_extension_wma.png b/asset/icon/Icon16/file_extension_wma.png new file mode 100644 index 0000000..63f5d34 Binary files /dev/null and b/asset/icon/Icon16/file_extension_wma.png differ diff --git a/asset/icon/Icon16/file_extension_wmv.png b/asset/icon/Icon16/file_extension_wmv.png new file mode 100644 index 0000000..4017f86 Binary files /dev/null and b/asset/icon/Icon16/file_extension_wmv.png differ diff --git a/asset/icon/Icon16/file_extension_wps.png b/asset/icon/Icon16/file_extension_wps.png new file mode 100644 index 0000000..69154a0 Binary files /dev/null and b/asset/icon/Icon16/file_extension_wps.png differ diff --git a/asset/icon/Icon16/file_extension_xls.png b/asset/icon/Icon16/file_extension_xls.png new file mode 100644 index 0000000..a5cb228 Binary files /dev/null and b/asset/icon/Icon16/file_extension_xls.png differ diff --git a/asset/icon/Icon16/file_extension_xpi.png b/asset/icon/Icon16/file_extension_xpi.png new file mode 100644 index 0000000..dea5e19 Binary files /dev/null and b/asset/icon/Icon16/file_extension_xpi.png differ diff --git a/asset/icon/Icon16/file_extension_zip.png b/asset/icon/Icon16/file_extension_zip.png new file mode 100644 index 0000000..f0756cd Binary files /dev/null and b/asset/icon/Icon16/file_extension_zip.png differ diff --git a/asset/icon/Icon16/file_manager.png b/asset/icon/Icon16/file_manager.png new file mode 100644 index 0000000..c9f7c80 Binary files /dev/null and b/asset/icon/Icon16/file_manager.png differ diff --git a/asset/icon/Icon16/fill.png b/asset/icon/Icon16/fill.png new file mode 100644 index 0000000..9afe7e5 Binary files /dev/null and b/asset/icon/Icon16/fill.png differ diff --git a/asset/icon/Icon16/fill_color.png b/asset/icon/Icon16/fill_color.png new file mode 100644 index 0000000..5a03959 Binary files /dev/null and b/asset/icon/Icon16/fill_color.png differ diff --git a/asset/icon/Icon16/film.png b/asset/icon/Icon16/film.png new file mode 100644 index 0000000..d612c8b Binary files /dev/null and b/asset/icon/Icon16/film.png differ diff --git a/asset/icon/Icon16/film_add.png b/asset/icon/Icon16/film_add.png new file mode 100644 index 0000000..e4d8bad Binary files /dev/null and b/asset/icon/Icon16/film_add.png differ diff --git a/asset/icon/Icon16/film_delete.png b/asset/icon/Icon16/film_delete.png new file mode 100644 index 0000000..0dc97f8 Binary files /dev/null and b/asset/icon/Icon16/film_delete.png differ diff --git a/asset/icon/Icon16/film_edit.png b/asset/icon/Icon16/film_edit.png new file mode 100644 index 0000000..3d5e30c Binary files /dev/null and b/asset/icon/Icon16/film_edit.png differ diff --git a/asset/icon/Icon16/film_error.png b/asset/icon/Icon16/film_error.png new file mode 100644 index 0000000..6d08728 Binary files /dev/null and b/asset/icon/Icon16/film_error.png differ diff --git a/asset/icon/Icon16/film_go.png b/asset/icon/Icon16/film_go.png new file mode 100644 index 0000000..088a52b Binary files /dev/null and b/asset/icon/Icon16/film_go.png differ diff --git a/asset/icon/Icon16/film_key.png b/asset/icon/Icon16/film_key.png new file mode 100644 index 0000000..9fd4342 Binary files /dev/null and b/asset/icon/Icon16/film_key.png differ diff --git a/asset/icon/Icon16/film_link.png b/asset/icon/Icon16/film_link.png new file mode 100644 index 0000000..345d4f6 Binary files /dev/null and b/asset/icon/Icon16/film_link.png differ diff --git a/asset/icon/Icon16/film_photo.png b/asset/icon/Icon16/film_photo.png new file mode 100644 index 0000000..84f1995 Binary files /dev/null and b/asset/icon/Icon16/film_photo.png differ diff --git a/asset/icon/Icon16/film_save.png b/asset/icon/Icon16/film_save.png new file mode 100644 index 0000000..1f0af6d Binary files /dev/null and b/asset/icon/Icon16/film_save.png differ diff --git a/asset/icon/Icon16/filter.png b/asset/icon/Icon16/filter.png new file mode 100644 index 0000000..227e843 Binary files /dev/null and b/asset/icon/Icon16/filter.png differ diff --git a/asset/icon/Icon16/filter_add.png b/asset/icon/Icon16/filter_add.png new file mode 100644 index 0000000..d63164e Binary files /dev/null and b/asset/icon/Icon16/filter_add.png differ diff --git a/asset/icon/Icon16/filter_advanced.png b/asset/icon/Icon16/filter_advanced.png new file mode 100644 index 0000000..5a945d4 Binary files /dev/null and b/asset/icon/Icon16/filter_advanced.png differ diff --git a/asset/icon/Icon16/filter_clear.png b/asset/icon/Icon16/filter_clear.png new file mode 100644 index 0000000..8ace7d7 Binary files /dev/null and b/asset/icon/Icon16/filter_clear.png differ diff --git a/asset/icon/Icon16/filter_delete.png b/asset/icon/Icon16/filter_delete.png new file mode 100644 index 0000000..7fa201d Binary files /dev/null and b/asset/icon/Icon16/filter_delete.png differ diff --git a/asset/icon/Icon16/filter_reapply.png b/asset/icon/Icon16/filter_reapply.png new file mode 100644 index 0000000..39eb451 Binary files /dev/null and b/asset/icon/Icon16/filter_reapply.png differ diff --git a/asset/icon/Icon16/finance.png b/asset/icon/Icon16/finance.png new file mode 100644 index 0000000..b8753fb Binary files /dev/null and b/asset/icon/Icon16/finance.png differ diff --git a/asset/icon/Icon16/financial_functions.png b/asset/icon/Icon16/financial_functions.png new file mode 100644 index 0000000..53acc64 Binary files /dev/null and b/asset/icon/Icon16/financial_functions.png differ diff --git a/asset/icon/Icon16/find.png b/asset/icon/Icon16/find.png new file mode 100644 index 0000000..1d6f4f1 Binary files /dev/null and b/asset/icon/Icon16/find.png differ diff --git a/asset/icon/Icon16/fingerprint.png b/asset/icon/Icon16/fingerprint.png new file mode 100644 index 0000000..50ba93a Binary files /dev/null and b/asset/icon/Icon16/fingerprint.png differ diff --git a/asset/icon/Icon16/finish_and_merge.png b/asset/icon/Icon16/finish_and_merge.png new file mode 100644 index 0000000..bcea95b Binary files /dev/null and b/asset/icon/Icon16/finish_and_merge.png differ diff --git a/asset/icon/Icon16/fire.png b/asset/icon/Icon16/fire.png new file mode 100644 index 0000000..0a2029f Binary files /dev/null and b/asset/icon/Icon16/fire.png differ diff --git a/asset/icon/Icon16/fire_damage.png b/asset/icon/Icon16/fire_damage.png new file mode 100644 index 0000000..2004a78 Binary files /dev/null and b/asset/icon/Icon16/fire_damage.png differ diff --git a/asset/icon/Icon16/fire_extinguisher.png b/asset/icon/Icon16/fire_extinguisher.png new file mode 100644 index 0000000..3129c9c Binary files /dev/null and b/asset/icon/Icon16/fire_extinguisher.png differ diff --git a/asset/icon/Icon16/firefox.png b/asset/icon/Icon16/firefox.png new file mode 100644 index 0000000..969abad Binary files /dev/null and b/asset/icon/Icon16/firefox.png differ diff --git a/asset/icon/Icon16/firewall.png b/asset/icon/Icon16/firewall.png new file mode 100644 index 0000000..8bf5b68 Binary files /dev/null and b/asset/icon/Icon16/firewall.png differ diff --git a/asset/icon/Icon16/firewall_burn.png b/asset/icon/Icon16/firewall_burn.png new file mode 100644 index 0000000..860e5ba Binary files /dev/null and b/asset/icon/Icon16/firewall_burn.png differ diff --git a/asset/icon/Icon16/fishfinder.png b/asset/icon/Icon16/fishfinder.png new file mode 100644 index 0000000..5ccd414 Binary files /dev/null and b/asset/icon/Icon16/fishfinder.png differ diff --git a/asset/icon/Icon16/flag_1.png b/asset/icon/Icon16/flag_1.png new file mode 100644 index 0000000..46bb194 Binary files /dev/null and b/asset/icon/Icon16/flag_1.png differ diff --git a/asset/icon/Icon16/flag_2.png b/asset/icon/Icon16/flag_2.png new file mode 100644 index 0000000..f6c9e63 Binary files /dev/null and b/asset/icon/Icon16/flag_2.png differ diff --git a/asset/icon/Icon16/flag_3.png b/asset/icon/Icon16/flag_3.png new file mode 100644 index 0000000..e9a40f1 Binary files /dev/null and b/asset/icon/Icon16/flag_3.png differ diff --git a/asset/icon/Icon16/flag_afghanistan.png b/asset/icon/Icon16/flag_afghanistan.png new file mode 100644 index 0000000..95e6e6d Binary files /dev/null and b/asset/icon/Icon16/flag_afghanistan.png differ diff --git a/asset/icon/Icon16/flag_airfield_vehicle_safety.png b/asset/icon/Icon16/flag_airfield_vehicle_safety.png new file mode 100644 index 0000000..e689494 Binary files /dev/null and b/asset/icon/Icon16/flag_airfield_vehicle_safety.png differ diff --git a/asset/icon/Icon16/flag_albania.png b/asset/icon/Icon16/flag_albania.png new file mode 100644 index 0000000..c67d3ae Binary files /dev/null and b/asset/icon/Icon16/flag_albania.png differ diff --git a/asset/icon/Icon16/flag_algeria.png b/asset/icon/Icon16/flag_algeria.png new file mode 100644 index 0000000..0ad0542 Binary files /dev/null and b/asset/icon/Icon16/flag_algeria.png differ diff --git a/asset/icon/Icon16/flag_american_samoa.png b/asset/icon/Icon16/flag_american_samoa.png new file mode 100644 index 0000000..1b782d5 Binary files /dev/null and b/asset/icon/Icon16/flag_american_samoa.png differ diff --git a/asset/icon/Icon16/flag_andorra.png b/asset/icon/Icon16/flag_andorra.png new file mode 100644 index 0000000..db2deed Binary files /dev/null and b/asset/icon/Icon16/flag_andorra.png differ diff --git a/asset/icon/Icon16/flag_angola.png b/asset/icon/Icon16/flag_angola.png new file mode 100644 index 0000000..749cfd7 Binary files /dev/null and b/asset/icon/Icon16/flag_angola.png differ diff --git a/asset/icon/Icon16/flag_anguilla.png b/asset/icon/Icon16/flag_anguilla.png new file mode 100644 index 0000000..b59b3ec Binary files /dev/null and b/asset/icon/Icon16/flag_anguilla.png differ diff --git a/asset/icon/Icon16/flag_antigua_and_barbuda.png b/asset/icon/Icon16/flag_antigua_and_barbuda.png new file mode 100644 index 0000000..7a52da9 Binary files /dev/null and b/asset/icon/Icon16/flag_antigua_and_barbuda.png differ diff --git a/asset/icon/Icon16/flag_argentina.png b/asset/icon/Icon16/flag_argentina.png new file mode 100644 index 0000000..75bd61f Binary files /dev/null and b/asset/icon/Icon16/flag_argentina.png differ diff --git a/asset/icon/Icon16/flag_armenia.png b/asset/icon/Icon16/flag_armenia.png new file mode 100644 index 0000000..de0ff8e Binary files /dev/null and b/asset/icon/Icon16/flag_armenia.png differ diff --git a/asset/icon/Icon16/flag_aruba.png b/asset/icon/Icon16/flag_aruba.png new file mode 100644 index 0000000..148c4e3 Binary files /dev/null and b/asset/icon/Icon16/flag_aruba.png differ diff --git a/asset/icon/Icon16/flag_australia.png b/asset/icon/Icon16/flag_australia.png new file mode 100644 index 0000000..a0a065e Binary files /dev/null and b/asset/icon/Icon16/flag_australia.png differ diff --git a/asset/icon/Icon16/flag_austria.png b/asset/icon/Icon16/flag_austria.png new file mode 100644 index 0000000..4f3f747 Binary files /dev/null and b/asset/icon/Icon16/flag_austria.png differ diff --git a/asset/icon/Icon16/flag_azerbaijan.png b/asset/icon/Icon16/flag_azerbaijan.png new file mode 100644 index 0000000..667151e Binary files /dev/null and b/asset/icon/Icon16/flag_azerbaijan.png differ diff --git a/asset/icon/Icon16/flag_bahamas.png b/asset/icon/Icon16/flag_bahamas.png new file mode 100644 index 0000000..2bac381 Binary files /dev/null and b/asset/icon/Icon16/flag_bahamas.png differ diff --git a/asset/icon/Icon16/flag_bahrain.png b/asset/icon/Icon16/flag_bahrain.png new file mode 100644 index 0000000..99186eb Binary files /dev/null and b/asset/icon/Icon16/flag_bahrain.png differ diff --git a/asset/icon/Icon16/flag_bangladesh.png b/asset/icon/Icon16/flag_bangladesh.png new file mode 100644 index 0000000..e5bff5e Binary files /dev/null and b/asset/icon/Icon16/flag_bangladesh.png differ diff --git a/asset/icon/Icon16/flag_barbados.png b/asset/icon/Icon16/flag_barbados.png new file mode 100644 index 0000000..c01a89d Binary files /dev/null and b/asset/icon/Icon16/flag_barbados.png differ diff --git a/asset/icon/Icon16/flag_belarus.png b/asset/icon/Icon16/flag_belarus.png new file mode 100644 index 0000000..52532fd Binary files /dev/null and b/asset/icon/Icon16/flag_belarus.png differ diff --git a/asset/icon/Icon16/flag_belgium.png b/asset/icon/Icon16/flag_belgium.png new file mode 100644 index 0000000..4d05e89 Binary files /dev/null and b/asset/icon/Icon16/flag_belgium.png differ diff --git a/asset/icon/Icon16/flag_belize.png b/asset/icon/Icon16/flag_belize.png new file mode 100644 index 0000000..69abcb7 Binary files /dev/null and b/asset/icon/Icon16/flag_belize.png differ diff --git a/asset/icon/Icon16/flag_benin.png b/asset/icon/Icon16/flag_benin.png new file mode 100644 index 0000000..4ab0b84 Binary files /dev/null and b/asset/icon/Icon16/flag_benin.png differ diff --git a/asset/icon/Icon16/flag_bermuda.png b/asset/icon/Icon16/flag_bermuda.png new file mode 100644 index 0000000..349a520 Binary files /dev/null and b/asset/icon/Icon16/flag_bermuda.png differ diff --git a/asset/icon/Icon16/flag_bhutan.png b/asset/icon/Icon16/flag_bhutan.png new file mode 100644 index 0000000..f7f90f0 Binary files /dev/null and b/asset/icon/Icon16/flag_bhutan.png differ diff --git a/asset/icon/Icon16/flag_blue.png b/asset/icon/Icon16/flag_blue.png new file mode 100644 index 0000000..1a79762 Binary files /dev/null and b/asset/icon/Icon16/flag_blue.png differ diff --git a/asset/icon/Icon16/flag_bolivia.png b/asset/icon/Icon16/flag_bolivia.png new file mode 100644 index 0000000..f90aeb4 Binary files /dev/null and b/asset/icon/Icon16/flag_bolivia.png differ diff --git a/asset/icon/Icon16/flag_bosnia.png b/asset/icon/Icon16/flag_bosnia.png new file mode 100644 index 0000000..0a2f595 Binary files /dev/null and b/asset/icon/Icon16/flag_bosnia.png differ diff --git a/asset/icon/Icon16/flag_botswana.png b/asset/icon/Icon16/flag_botswana.png new file mode 100644 index 0000000..fd67c2b Binary files /dev/null and b/asset/icon/Icon16/flag_botswana.png differ diff --git a/asset/icon/Icon16/flag_boy_scout.png b/asset/icon/Icon16/flag_boy_scout.png new file mode 100644 index 0000000..523be23 Binary files /dev/null and b/asset/icon/Icon16/flag_boy_scout.png differ diff --git a/asset/icon/Icon16/flag_brazil.png b/asset/icon/Icon16/flag_brazil.png new file mode 100644 index 0000000..e18222d Binary files /dev/null and b/asset/icon/Icon16/flag_brazil.png differ diff --git a/asset/icon/Icon16/flag_british_indian_ocean.png b/asset/icon/Icon16/flag_british_indian_ocean.png new file mode 100644 index 0000000..349ac7e Binary files /dev/null and b/asset/icon/Icon16/flag_british_indian_ocean.png differ diff --git a/asset/icon/Icon16/flag_british_virgin_islands.png b/asset/icon/Icon16/flag_british_virgin_islands.png new file mode 100644 index 0000000..5b2a554 Binary files /dev/null and b/asset/icon/Icon16/flag_british_virgin_islands.png differ diff --git a/asset/icon/Icon16/flag_brunei.png b/asset/icon/Icon16/flag_brunei.png new file mode 100644 index 0000000..dc4ca96 Binary files /dev/null and b/asset/icon/Icon16/flag_brunei.png differ diff --git a/asset/icon/Icon16/flag_bulgaria.png b/asset/icon/Icon16/flag_bulgaria.png new file mode 100644 index 0000000..0b140a0 Binary files /dev/null and b/asset/icon/Icon16/flag_bulgaria.png differ diff --git a/asset/icon/Icon16/flag_burkina_faso.png b/asset/icon/Icon16/flag_burkina_faso.png new file mode 100644 index 0000000..d34823b Binary files /dev/null and b/asset/icon/Icon16/flag_burkina_faso.png differ diff --git a/asset/icon/Icon16/flag_burma.png b/asset/icon/Icon16/flag_burma.png new file mode 100644 index 0000000..6295d88 Binary files /dev/null and b/asset/icon/Icon16/flag_burma.png differ diff --git a/asset/icon/Icon16/flag_burundi.png b/asset/icon/Icon16/flag_burundi.png new file mode 100644 index 0000000..72718b8 Binary files /dev/null and b/asset/icon/Icon16/flag_burundi.png differ diff --git a/asset/icon/Icon16/flag_cambodia.png b/asset/icon/Icon16/flag_cambodia.png new file mode 100644 index 0000000..75ca2a5 Binary files /dev/null and b/asset/icon/Icon16/flag_cambodia.png differ diff --git a/asset/icon/Icon16/flag_cameroon.png b/asset/icon/Icon16/flag_cameroon.png new file mode 100644 index 0000000..1250a70 Binary files /dev/null and b/asset/icon/Icon16/flag_cameroon.png differ diff --git a/asset/icon/Icon16/flag_canada.png b/asset/icon/Icon16/flag_canada.png new file mode 100644 index 0000000..8c120ab Binary files /dev/null and b/asset/icon/Icon16/flag_canada.png differ diff --git a/asset/icon/Icon16/flag_cayman_islands.png b/asset/icon/Icon16/flag_cayman_islands.png new file mode 100644 index 0000000..5be579a Binary files /dev/null and b/asset/icon/Icon16/flag_cayman_islands.png differ diff --git a/asset/icon/Icon16/flag_central_african_republic.png b/asset/icon/Icon16/flag_central_african_republic.png new file mode 100644 index 0000000..83f23b5 Binary files /dev/null and b/asset/icon/Icon16/flag_central_african_republic.png differ diff --git a/asset/icon/Icon16/flag_chad.png b/asset/icon/Icon16/flag_chad.png new file mode 100644 index 0000000..a91dc2b Binary files /dev/null and b/asset/icon/Icon16/flag_chad.png differ diff --git a/asset/icon/Icon16/flag_chile.png b/asset/icon/Icon16/flag_chile.png new file mode 100644 index 0000000..956adee Binary files /dev/null and b/asset/icon/Icon16/flag_chile.png differ diff --git a/asset/icon/Icon16/flag_china.png b/asset/icon/Icon16/flag_china.png new file mode 100644 index 0000000..2d05c63 Binary files /dev/null and b/asset/icon/Icon16/flag_china.png differ diff --git a/asset/icon/Icon16/flag_colombia.png b/asset/icon/Icon16/flag_colombia.png new file mode 100644 index 0000000..14a1705 Binary files /dev/null and b/asset/icon/Icon16/flag_colombia.png differ diff --git a/asset/icon/Icon16/flag_comoros.png b/asset/icon/Icon16/flag_comoros.png new file mode 100644 index 0000000..a793acf Binary files /dev/null and b/asset/icon/Icon16/flag_comoros.png differ diff --git a/asset/icon/Icon16/flag_congo_democratic_republic.png b/asset/icon/Icon16/flag_congo_democratic_republic.png new file mode 100644 index 0000000..032065e Binary files /dev/null and b/asset/icon/Icon16/flag_congo_democratic_republic.png differ diff --git a/asset/icon/Icon16/flag_congo_republic.png b/asset/icon/Icon16/flag_congo_republic.png new file mode 100644 index 0000000..68af124 Binary files /dev/null and b/asset/icon/Icon16/flag_congo_republic.png differ diff --git a/asset/icon/Icon16/flag_cook_islands.png b/asset/icon/Icon16/flag_cook_islands.png new file mode 100644 index 0000000..37b0f99 Binary files /dev/null and b/asset/icon/Icon16/flag_cook_islands.png differ diff --git a/asset/icon/Icon16/flag_cope_verde.png b/asset/icon/Icon16/flag_cope_verde.png new file mode 100644 index 0000000..d737b74 Binary files /dev/null and b/asset/icon/Icon16/flag_cope_verde.png differ diff --git a/asset/icon/Icon16/flag_costa_rica.png b/asset/icon/Icon16/flag_costa_rica.png new file mode 100644 index 0000000..87d5af1 Binary files /dev/null and b/asset/icon/Icon16/flag_costa_rica.png differ diff --git a/asset/icon/Icon16/flag_cote_divoire.png b/asset/icon/Icon16/flag_cote_divoire.png new file mode 100644 index 0000000..f510504 Binary files /dev/null and b/asset/icon/Icon16/flag_cote_divoire.png differ diff --git a/asset/icon/Icon16/flag_croatia.png b/asset/icon/Icon16/flag_croatia.png new file mode 100644 index 0000000..cce89f9 Binary files /dev/null and b/asset/icon/Icon16/flag_croatia.png differ diff --git a/asset/icon/Icon16/flag_cuba.png b/asset/icon/Icon16/flag_cuba.png new file mode 100644 index 0000000..b761d2a Binary files /dev/null and b/asset/icon/Icon16/flag_cuba.png differ diff --git a/asset/icon/Icon16/flag_cyprus.png b/asset/icon/Icon16/flag_cyprus.png new file mode 100644 index 0000000..dbdaaaf Binary files /dev/null and b/asset/icon/Icon16/flag_cyprus.png differ diff --git a/asset/icon/Icon16/flag_czech_republic.png b/asset/icon/Icon16/flag_czech_republic.png new file mode 100644 index 0000000..d79b3d9 Binary files /dev/null and b/asset/icon/Icon16/flag_czech_republic.png differ diff --git a/asset/icon/Icon16/flag_denmark.png b/asset/icon/Icon16/flag_denmark.png new file mode 100644 index 0000000..ec0c287 Binary files /dev/null and b/asset/icon/Icon16/flag_denmark.png differ diff --git a/asset/icon/Icon16/flag_djibouti.png b/asset/icon/Icon16/flag_djibouti.png new file mode 100644 index 0000000..d6b5b69 Binary files /dev/null and b/asset/icon/Icon16/flag_djibouti.png differ diff --git a/asset/icon/Icon16/flag_dominica.png b/asset/icon/Icon16/flag_dominica.png new file mode 100644 index 0000000..ffe83f6 Binary files /dev/null and b/asset/icon/Icon16/flag_dominica.png differ diff --git a/asset/icon/Icon16/flag_dominican_republic.png b/asset/icon/Icon16/flag_dominican_republic.png new file mode 100644 index 0000000..4500959 Binary files /dev/null and b/asset/icon/Icon16/flag_dominican_republic.png differ diff --git a/asset/icon/Icon16/flag_east_timor.png b/asset/icon/Icon16/flag_east_timor.png new file mode 100644 index 0000000..ece5d83 Binary files /dev/null and b/asset/icon/Icon16/flag_east_timor.png differ diff --git a/asset/icon/Icon16/flag_egypt.png b/asset/icon/Icon16/flag_egypt.png new file mode 100644 index 0000000..4ad7a3c Binary files /dev/null and b/asset/icon/Icon16/flag_egypt.png differ diff --git a/asset/icon/Icon16/flag_el_salvador.png b/asset/icon/Icon16/flag_el_salvador.png new file mode 100644 index 0000000..7dfef5f Binary files /dev/null and b/asset/icon/Icon16/flag_el_salvador.png differ diff --git a/asset/icon/Icon16/flag_england.png b/asset/icon/Icon16/flag_england.png new file mode 100644 index 0000000..d3f1f30 Binary files /dev/null and b/asset/icon/Icon16/flag_england.png differ diff --git a/asset/icon/Icon16/flag_equador.png b/asset/icon/Icon16/flag_equador.png new file mode 100644 index 0000000..fdfab03 Binary files /dev/null and b/asset/icon/Icon16/flag_equador.png differ diff --git a/asset/icon/Icon16/flag_equatorial_guinea.png b/asset/icon/Icon16/flag_equatorial_guinea.png new file mode 100644 index 0000000..45fcb99 Binary files /dev/null and b/asset/icon/Icon16/flag_equatorial_guinea.png differ diff --git a/asset/icon/Icon16/flag_eritrea.png b/asset/icon/Icon16/flag_eritrea.png new file mode 100644 index 0000000..442bdb7 Binary files /dev/null and b/asset/icon/Icon16/flag_eritrea.png differ diff --git a/asset/icon/Icon16/flag_estonia.png b/asset/icon/Icon16/flag_estonia.png new file mode 100644 index 0000000..233d097 Binary files /dev/null and b/asset/icon/Icon16/flag_estonia.png differ diff --git a/asset/icon/Icon16/flag_ethiopia.png b/asset/icon/Icon16/flag_ethiopia.png new file mode 100644 index 0000000..a4b89f1 Binary files /dev/null and b/asset/icon/Icon16/flag_ethiopia.png differ diff --git a/asset/icon/Icon16/flag_european_union.png b/asset/icon/Icon16/flag_european_union.png new file mode 100644 index 0000000..48719fd Binary files /dev/null and b/asset/icon/Icon16/flag_european_union.png differ diff --git a/asset/icon/Icon16/flag_falkland_islands.png b/asset/icon/Icon16/flag_falkland_islands.png new file mode 100644 index 0000000..e76d055 Binary files /dev/null and b/asset/icon/Icon16/flag_falkland_islands.png differ diff --git a/asset/icon/Icon16/flag_faroe_islands.png b/asset/icon/Icon16/flag_faroe_islands.png new file mode 100644 index 0000000..122c541 Binary files /dev/null and b/asset/icon/Icon16/flag_faroe_islands.png differ diff --git a/asset/icon/Icon16/flag_fiji.png b/asset/icon/Icon16/flag_fiji.png new file mode 100644 index 0000000..9a87cb4 Binary files /dev/null and b/asset/icon/Icon16/flag_fiji.png differ diff --git a/asset/icon/Icon16/flag_finish.png b/asset/icon/Icon16/flag_finish.png new file mode 100644 index 0000000..71695d3 Binary files /dev/null and b/asset/icon/Icon16/flag_finish.png differ diff --git a/asset/icon/Icon16/flag_finland.png b/asset/icon/Icon16/flag_finland.png new file mode 100644 index 0000000..a2e7faf Binary files /dev/null and b/asset/icon/Icon16/flag_finland.png differ diff --git a/asset/icon/Icon16/flag_france.png b/asset/icon/Icon16/flag_france.png new file mode 100644 index 0000000..2db5840 Binary files /dev/null and b/asset/icon/Icon16/flag_france.png differ diff --git a/asset/icon/Icon16/flag_french_polynesia.png b/asset/icon/Icon16/flag_french_polynesia.png new file mode 100644 index 0000000..117f69e Binary files /dev/null and b/asset/icon/Icon16/flag_french_polynesia.png differ diff --git a/asset/icon/Icon16/flag_gabon.png b/asset/icon/Icon16/flag_gabon.png new file mode 100644 index 0000000..9f1d337 Binary files /dev/null and b/asset/icon/Icon16/flag_gabon.png differ diff --git a/asset/icon/Icon16/flag_gambia.png b/asset/icon/Icon16/flag_gambia.png new file mode 100644 index 0000000..96f80f8 Binary files /dev/null and b/asset/icon/Icon16/flag_gambia.png differ diff --git a/asset/icon/Icon16/flag_georgia.png b/asset/icon/Icon16/flag_georgia.png new file mode 100644 index 0000000..7620445 Binary files /dev/null and b/asset/icon/Icon16/flag_georgia.png differ diff --git a/asset/icon/Icon16/flag_germany.png b/asset/icon/Icon16/flag_germany.png new file mode 100644 index 0000000..8deb4c9 Binary files /dev/null and b/asset/icon/Icon16/flag_germany.png differ diff --git a/asset/icon/Icon16/flag_ghana.png b/asset/icon/Icon16/flag_ghana.png new file mode 100644 index 0000000..e6e8809 Binary files /dev/null and b/asset/icon/Icon16/flag_ghana.png differ diff --git a/asset/icon/Icon16/flag_gibraltar.png b/asset/icon/Icon16/flag_gibraltar.png new file mode 100644 index 0000000..327a47c Binary files /dev/null and b/asset/icon/Icon16/flag_gibraltar.png differ diff --git a/asset/icon/Icon16/flag_great_britain.png b/asset/icon/Icon16/flag_great_britain.png new file mode 100644 index 0000000..e4f3d5b Binary files /dev/null and b/asset/icon/Icon16/flag_great_britain.png differ diff --git a/asset/icon/Icon16/flag_greece.png b/asset/icon/Icon16/flag_greece.png new file mode 100644 index 0000000..2cfc0fa Binary files /dev/null and b/asset/icon/Icon16/flag_greece.png differ diff --git a/asset/icon/Icon16/flag_green.png b/asset/icon/Icon16/flag_green.png new file mode 100644 index 0000000..c8c61b0 Binary files /dev/null and b/asset/icon/Icon16/flag_green.png differ diff --git a/asset/icon/Icon16/flag_greenland.png b/asset/icon/Icon16/flag_greenland.png new file mode 100644 index 0000000..2577e59 Binary files /dev/null and b/asset/icon/Icon16/flag_greenland.png differ diff --git a/asset/icon/Icon16/flag_grenada.png b/asset/icon/Icon16/flag_grenada.png new file mode 100644 index 0000000..75befaf Binary files /dev/null and b/asset/icon/Icon16/flag_grenada.png differ diff --git a/asset/icon/Icon16/flag_guam.png b/asset/icon/Icon16/flag_guam.png new file mode 100644 index 0000000..9a38942 Binary files /dev/null and b/asset/icon/Icon16/flag_guam.png differ diff --git a/asset/icon/Icon16/flag_guatemala.png b/asset/icon/Icon16/flag_guatemala.png new file mode 100644 index 0000000..ea28740 Binary files /dev/null and b/asset/icon/Icon16/flag_guatemala.png differ diff --git a/asset/icon/Icon16/flag_guernsey.png b/asset/icon/Icon16/flag_guernsey.png new file mode 100644 index 0000000..42a0ee1 Binary files /dev/null and b/asset/icon/Icon16/flag_guernsey.png differ diff --git a/asset/icon/Icon16/flag_guinea.png b/asset/icon/Icon16/flag_guinea.png new file mode 100644 index 0000000..fbfebcc Binary files /dev/null and b/asset/icon/Icon16/flag_guinea.png differ diff --git a/asset/icon/Icon16/flag_guinea_bissau.png b/asset/icon/Icon16/flag_guinea_bissau.png new file mode 100644 index 0000000..4b402f4 Binary files /dev/null and b/asset/icon/Icon16/flag_guinea_bissau.png differ diff --git a/asset/icon/Icon16/flag_guyana.png b/asset/icon/Icon16/flag_guyana.png new file mode 100644 index 0000000..374ce5e Binary files /dev/null and b/asset/icon/Icon16/flag_guyana.png differ diff --git a/asset/icon/Icon16/flag_haiti.png b/asset/icon/Icon16/flag_haiti.png new file mode 100644 index 0000000..939c3a8 Binary files /dev/null and b/asset/icon/Icon16/flag_haiti.png differ diff --git a/asset/icon/Icon16/flag_honduras.png b/asset/icon/Icon16/flag_honduras.png new file mode 100644 index 0000000..fd4c358 Binary files /dev/null and b/asset/icon/Icon16/flag_honduras.png differ diff --git a/asset/icon/Icon16/flag_hong_kong.png b/asset/icon/Icon16/flag_hong_kong.png new file mode 100644 index 0000000..e042248 Binary files /dev/null and b/asset/icon/Icon16/flag_hong_kong.png differ diff --git a/asset/icon/Icon16/flag_hot.png b/asset/icon/Icon16/flag_hot.png new file mode 100644 index 0000000..564334f Binary files /dev/null and b/asset/icon/Icon16/flag_hot.png differ diff --git a/asset/icon/Icon16/flag_hungary.png b/asset/icon/Icon16/flag_hungary.png new file mode 100644 index 0000000..67d5a46 Binary files /dev/null and b/asset/icon/Icon16/flag_hungary.png differ diff --git a/asset/icon/Icon16/flag_iceland.png b/asset/icon/Icon16/flag_iceland.png new file mode 100644 index 0000000..6982f33 Binary files /dev/null and b/asset/icon/Icon16/flag_iceland.png differ diff --git a/asset/icon/Icon16/flag_india.png b/asset/icon/Icon16/flag_india.png new file mode 100644 index 0000000..6b245e4 Binary files /dev/null and b/asset/icon/Icon16/flag_india.png differ diff --git a/asset/icon/Icon16/flag_indonesia.png b/asset/icon/Icon16/flag_indonesia.png new file mode 100644 index 0000000..5efd449 Binary files /dev/null and b/asset/icon/Icon16/flag_indonesia.png differ diff --git a/asset/icon/Icon16/flag_iran.png b/asset/icon/Icon16/flag_iran.png new file mode 100644 index 0000000..907dfa4 Binary files /dev/null and b/asset/icon/Icon16/flag_iran.png differ diff --git a/asset/icon/Icon16/flag_iraq.png b/asset/icon/Icon16/flag_iraq.png new file mode 100644 index 0000000..3940961 Binary files /dev/null and b/asset/icon/Icon16/flag_iraq.png differ diff --git a/asset/icon/Icon16/flag_ireland.png b/asset/icon/Icon16/flag_ireland.png new file mode 100644 index 0000000..4c451b2 Binary files /dev/null and b/asset/icon/Icon16/flag_ireland.png differ diff --git a/asset/icon/Icon16/flag_isle_of_man.png b/asset/icon/Icon16/flag_isle_of_man.png new file mode 100644 index 0000000..441ade4 Binary files /dev/null and b/asset/icon/Icon16/flag_isle_of_man.png differ diff --git a/asset/icon/Icon16/flag_israel.png b/asset/icon/Icon16/flag_israel.png new file mode 100644 index 0000000..d24512a Binary files /dev/null and b/asset/icon/Icon16/flag_israel.png differ diff --git a/asset/icon/Icon16/flag_italy.png b/asset/icon/Icon16/flag_italy.png new file mode 100644 index 0000000..19064f8 Binary files /dev/null and b/asset/icon/Icon16/flag_italy.png differ diff --git a/asset/icon/Icon16/flag_jamaica.png b/asset/icon/Icon16/flag_jamaica.png new file mode 100644 index 0000000..669a64b Binary files /dev/null and b/asset/icon/Icon16/flag_jamaica.png differ diff --git a/asset/icon/Icon16/flag_japan.png b/asset/icon/Icon16/flag_japan.png new file mode 100644 index 0000000..296e206 Binary files /dev/null and b/asset/icon/Icon16/flag_japan.png differ diff --git a/asset/icon/Icon16/flag_jersey.png b/asset/icon/Icon16/flag_jersey.png new file mode 100644 index 0000000..57fe955 Binary files /dev/null and b/asset/icon/Icon16/flag_jersey.png differ diff --git a/asset/icon/Icon16/flag_jordan.png b/asset/icon/Icon16/flag_jordan.png new file mode 100644 index 0000000..09128bb Binary files /dev/null and b/asset/icon/Icon16/flag_jordan.png differ diff --git a/asset/icon/Icon16/flag_kazakhstan.png b/asset/icon/Icon16/flag_kazakhstan.png new file mode 100644 index 0000000..2125320 Binary files /dev/null and b/asset/icon/Icon16/flag_kazakhstan.png differ diff --git a/asset/icon/Icon16/flag_kenya.png b/asset/icon/Icon16/flag_kenya.png new file mode 100644 index 0000000..241081a Binary files /dev/null and b/asset/icon/Icon16/flag_kenya.png differ diff --git a/asset/icon/Icon16/flag_kiribati.png b/asset/icon/Icon16/flag_kiribati.png new file mode 100644 index 0000000..0b807c3 Binary files /dev/null and b/asset/icon/Icon16/flag_kiribati.png differ diff --git a/asset/icon/Icon16/flag_kuwait.png b/asset/icon/Icon16/flag_kuwait.png new file mode 100644 index 0000000..77ce88b Binary files /dev/null and b/asset/icon/Icon16/flag_kuwait.png differ diff --git a/asset/icon/Icon16/flag_kyrgyzstan.png b/asset/icon/Icon16/flag_kyrgyzstan.png new file mode 100644 index 0000000..439fe5b Binary files /dev/null and b/asset/icon/Icon16/flag_kyrgyzstan.png differ diff --git a/asset/icon/Icon16/flag_laos.png b/asset/icon/Icon16/flag_laos.png new file mode 100644 index 0000000..32ab725 Binary files /dev/null and b/asset/icon/Icon16/flag_laos.png differ diff --git a/asset/icon/Icon16/flag_latvia.png b/asset/icon/Icon16/flag_latvia.png new file mode 100644 index 0000000..52e0389 Binary files /dev/null and b/asset/icon/Icon16/flag_latvia.png differ diff --git a/asset/icon/Icon16/flag_lebanon.png b/asset/icon/Icon16/flag_lebanon.png new file mode 100644 index 0000000..df6a725 Binary files /dev/null and b/asset/icon/Icon16/flag_lebanon.png differ diff --git a/asset/icon/Icon16/flag_lesotho.png b/asset/icon/Icon16/flag_lesotho.png new file mode 100644 index 0000000..58e7366 Binary files /dev/null and b/asset/icon/Icon16/flag_lesotho.png differ diff --git a/asset/icon/Icon16/flag_liberia.png b/asset/icon/Icon16/flag_liberia.png new file mode 100644 index 0000000..53a40b5 Binary files /dev/null and b/asset/icon/Icon16/flag_liberia.png differ diff --git a/asset/icon/Icon16/flag_libya.png b/asset/icon/Icon16/flag_libya.png new file mode 100644 index 0000000..ca1014a Binary files /dev/null and b/asset/icon/Icon16/flag_libya.png differ diff --git a/asset/icon/Icon16/flag_liechtenstein.png b/asset/icon/Icon16/flag_liechtenstein.png new file mode 100644 index 0000000..328a17f Binary files /dev/null and b/asset/icon/Icon16/flag_liechtenstein.png differ diff --git a/asset/icon/Icon16/flag_lithuania.png b/asset/icon/Icon16/flag_lithuania.png new file mode 100644 index 0000000..fbc7bf4 Binary files /dev/null and b/asset/icon/Icon16/flag_lithuania.png differ diff --git a/asset/icon/Icon16/flag_luxembourg.png b/asset/icon/Icon16/flag_luxembourg.png new file mode 100644 index 0000000..45a449f Binary files /dev/null and b/asset/icon/Icon16/flag_luxembourg.png differ diff --git a/asset/icon/Icon16/flag_macau.png b/asset/icon/Icon16/flag_macau.png new file mode 100644 index 0000000..c6c3ee8 Binary files /dev/null and b/asset/icon/Icon16/flag_macau.png differ diff --git a/asset/icon/Icon16/flag_macedonia.png b/asset/icon/Icon16/flag_macedonia.png new file mode 100644 index 0000000..d886f96 Binary files /dev/null and b/asset/icon/Icon16/flag_macedonia.png differ diff --git a/asset/icon/Icon16/flag_madagascar.png b/asset/icon/Icon16/flag_madagascar.png new file mode 100644 index 0000000..5384b43 Binary files /dev/null and b/asset/icon/Icon16/flag_madagascar.png differ diff --git a/asset/icon/Icon16/flag_malawi.png b/asset/icon/Icon16/flag_malawi.png new file mode 100644 index 0000000..807a953 Binary files /dev/null and b/asset/icon/Icon16/flag_malawi.png differ diff --git a/asset/icon/Icon16/flag_malaysia.png b/asset/icon/Icon16/flag_malaysia.png new file mode 100644 index 0000000..ad6207b Binary files /dev/null and b/asset/icon/Icon16/flag_malaysia.png differ diff --git a/asset/icon/Icon16/flag_maledives.png b/asset/icon/Icon16/flag_maledives.png new file mode 100644 index 0000000..a7e86d7 Binary files /dev/null and b/asset/icon/Icon16/flag_maledives.png differ diff --git a/asset/icon/Icon16/flag_mali.png b/asset/icon/Icon16/flag_mali.png new file mode 100644 index 0000000..5b3e901 Binary files /dev/null and b/asset/icon/Icon16/flag_mali.png differ diff --git a/asset/icon/Icon16/flag_malta.png b/asset/icon/Icon16/flag_malta.png new file mode 100644 index 0000000..d2bc11d Binary files /dev/null and b/asset/icon/Icon16/flag_malta.png differ diff --git a/asset/icon/Icon16/flag_marshall_islands.png b/asset/icon/Icon16/flag_marshall_islands.png new file mode 100644 index 0000000..9b6dcd5 Binary files /dev/null and b/asset/icon/Icon16/flag_marshall_islands.png differ diff --git a/asset/icon/Icon16/flag_martinique.png b/asset/icon/Icon16/flag_martinique.png new file mode 100644 index 0000000..68c871b Binary files /dev/null and b/asset/icon/Icon16/flag_martinique.png differ diff --git a/asset/icon/Icon16/flag_mauretania.png b/asset/icon/Icon16/flag_mauretania.png new file mode 100644 index 0000000..f9b1218 Binary files /dev/null and b/asset/icon/Icon16/flag_mauretania.png differ diff --git a/asset/icon/Icon16/flag_mauritius.png b/asset/icon/Icon16/flag_mauritius.png new file mode 100644 index 0000000..0388a89 Binary files /dev/null and b/asset/icon/Icon16/flag_mauritius.png differ diff --git a/asset/icon/Icon16/flag_mexico.png b/asset/icon/Icon16/flag_mexico.png new file mode 100644 index 0000000..18e6f32 Binary files /dev/null and b/asset/icon/Icon16/flag_mexico.png differ diff --git a/asset/icon/Icon16/flag_micronesia.png b/asset/icon/Icon16/flag_micronesia.png new file mode 100644 index 0000000..68a8c91 Binary files /dev/null and b/asset/icon/Icon16/flag_micronesia.png differ diff --git a/asset/icon/Icon16/flag_moldova.png b/asset/icon/Icon16/flag_moldova.png new file mode 100644 index 0000000..94ec1e6 Binary files /dev/null and b/asset/icon/Icon16/flag_moldova.png differ diff --git a/asset/icon/Icon16/flag_monaco.png b/asset/icon/Icon16/flag_monaco.png new file mode 100644 index 0000000..71d5ae2 Binary files /dev/null and b/asset/icon/Icon16/flag_monaco.png differ diff --git a/asset/icon/Icon16/flag_mongolia.png b/asset/icon/Icon16/flag_mongolia.png new file mode 100644 index 0000000..d28e0b9 Binary files /dev/null and b/asset/icon/Icon16/flag_mongolia.png differ diff --git a/asset/icon/Icon16/flag_montserrat.png b/asset/icon/Icon16/flag_montserrat.png new file mode 100644 index 0000000..542e1b0 Binary files /dev/null and b/asset/icon/Icon16/flag_montserrat.png differ diff --git a/asset/icon/Icon16/flag_morocco.png b/asset/icon/Icon16/flag_morocco.png new file mode 100644 index 0000000..d0dc3ce Binary files /dev/null and b/asset/icon/Icon16/flag_morocco.png differ diff --git a/asset/icon/Icon16/flag_mozambique.png b/asset/icon/Icon16/flag_mozambique.png new file mode 100644 index 0000000..5041c36 Binary files /dev/null and b/asset/icon/Icon16/flag_mozambique.png differ diff --git a/asset/icon/Icon16/flag_namibia.png b/asset/icon/Icon16/flag_namibia.png new file mode 100644 index 0000000..082cc61 Binary files /dev/null and b/asset/icon/Icon16/flag_namibia.png differ diff --git a/asset/icon/Icon16/flag_nato.png b/asset/icon/Icon16/flag_nato.png new file mode 100644 index 0000000..8a7942e Binary files /dev/null and b/asset/icon/Icon16/flag_nato.png differ diff --git a/asset/icon/Icon16/flag_nauru.png b/asset/icon/Icon16/flag_nauru.png new file mode 100644 index 0000000..ff2d108 Binary files /dev/null and b/asset/icon/Icon16/flag_nauru.png differ diff --git a/asset/icon/Icon16/flag_nepal.png b/asset/icon/Icon16/flag_nepal.png new file mode 100644 index 0000000..d13105d Binary files /dev/null and b/asset/icon/Icon16/flag_nepal.png differ diff --git a/asset/icon/Icon16/flag_netherlands.png b/asset/icon/Icon16/flag_netherlands.png new file mode 100644 index 0000000..4fd7abc Binary files /dev/null and b/asset/icon/Icon16/flag_netherlands.png differ diff --git a/asset/icon/Icon16/flag_netherlands_antilles.png b/asset/icon/Icon16/flag_netherlands_antilles.png new file mode 100644 index 0000000..130f03c Binary files /dev/null and b/asset/icon/Icon16/flag_netherlands_antilles.png differ diff --git a/asset/icon/Icon16/flag_new.png b/asset/icon/Icon16/flag_new.png new file mode 100644 index 0000000..31619f6 Binary files /dev/null and b/asset/icon/Icon16/flag_new.png differ diff --git a/asset/icon/Icon16/flag_new_zealand.png b/asset/icon/Icon16/flag_new_zealand.png new file mode 100644 index 0000000..2b8e858 Binary files /dev/null and b/asset/icon/Icon16/flag_new_zealand.png differ diff --git a/asset/icon/Icon16/flag_nicaragua.png b/asset/icon/Icon16/flag_nicaragua.png new file mode 100644 index 0000000..45e3223 Binary files /dev/null and b/asset/icon/Icon16/flag_nicaragua.png differ diff --git a/asset/icon/Icon16/flag_niger.png b/asset/icon/Icon16/flag_niger.png new file mode 100644 index 0000000..ec53493 Binary files /dev/null and b/asset/icon/Icon16/flag_niger.png differ diff --git a/asset/icon/Icon16/flag_nigeria.png b/asset/icon/Icon16/flag_nigeria.png new file mode 100644 index 0000000..5e567f7 Binary files /dev/null and b/asset/icon/Icon16/flag_nigeria.png differ diff --git a/asset/icon/Icon16/flag_niue.png b/asset/icon/Icon16/flag_niue.png new file mode 100644 index 0000000..07fdf97 Binary files /dev/null and b/asset/icon/Icon16/flag_niue.png differ diff --git a/asset/icon/Icon16/flag_norfolk_islands.png b/asset/icon/Icon16/flag_norfolk_islands.png new file mode 100644 index 0000000..8ec8624 Binary files /dev/null and b/asset/icon/Icon16/flag_norfolk_islands.png differ diff --git a/asset/icon/Icon16/flag_north_korea.png b/asset/icon/Icon16/flag_north_korea.png new file mode 100644 index 0000000..be64cd7 Binary files /dev/null and b/asset/icon/Icon16/flag_north_korea.png differ diff --git a/asset/icon/Icon16/flag_northern_mariana_islands.png b/asset/icon/Icon16/flag_northern_mariana_islands.png new file mode 100644 index 0000000..ae01063 Binary files /dev/null and b/asset/icon/Icon16/flag_northern_mariana_islands.png differ diff --git a/asset/icon/Icon16/flag_norway.png b/asset/icon/Icon16/flag_norway.png new file mode 100644 index 0000000..91f3970 Binary files /dev/null and b/asset/icon/Icon16/flag_norway.png differ diff --git a/asset/icon/Icon16/flag_olympic.png b/asset/icon/Icon16/flag_olympic.png new file mode 100644 index 0000000..bccb946 Binary files /dev/null and b/asset/icon/Icon16/flag_olympic.png differ diff --git a/asset/icon/Icon16/flag_oman.png b/asset/icon/Icon16/flag_oman.png new file mode 100644 index 0000000..9c20023 Binary files /dev/null and b/asset/icon/Icon16/flag_oman.png differ diff --git a/asset/icon/Icon16/flag_orange.png b/asset/icon/Icon16/flag_orange.png new file mode 100644 index 0000000..945dfa9 Binary files /dev/null and b/asset/icon/Icon16/flag_orange.png differ diff --git a/asset/icon/Icon16/flag_pakistan.png b/asset/icon/Icon16/flag_pakistan.png new file mode 100644 index 0000000..71f82d8 Binary files /dev/null and b/asset/icon/Icon16/flag_pakistan.png differ diff --git a/asset/icon/Icon16/flag_palau.png b/asset/icon/Icon16/flag_palau.png new file mode 100644 index 0000000..cab7771 Binary files /dev/null and b/asset/icon/Icon16/flag_palau.png differ diff --git a/asset/icon/Icon16/flag_panama.png b/asset/icon/Icon16/flag_panama.png new file mode 100644 index 0000000..002646a Binary files /dev/null and b/asset/icon/Icon16/flag_panama.png differ diff --git a/asset/icon/Icon16/flag_papua_new_guinea.png b/asset/icon/Icon16/flag_papua_new_guinea.png new file mode 100644 index 0000000..359db48 Binary files /dev/null and b/asset/icon/Icon16/flag_papua_new_guinea.png differ diff --git a/asset/icon/Icon16/flag_paraquay.png b/asset/icon/Icon16/flag_paraquay.png new file mode 100644 index 0000000..66ca9ba Binary files /dev/null and b/asset/icon/Icon16/flag_paraquay.png differ diff --git a/asset/icon/Icon16/flag_peru.png b/asset/icon/Icon16/flag_peru.png new file mode 100644 index 0000000..5608f85 Binary files /dev/null and b/asset/icon/Icon16/flag_peru.png differ diff --git a/asset/icon/Icon16/flag_philippines.png b/asset/icon/Icon16/flag_philippines.png new file mode 100644 index 0000000..6a704b6 Binary files /dev/null and b/asset/icon/Icon16/flag_philippines.png differ diff --git a/asset/icon/Icon16/flag_pink.png b/asset/icon/Icon16/flag_pink.png new file mode 100644 index 0000000..2cdae01 Binary files /dev/null and b/asset/icon/Icon16/flag_pink.png differ diff --git a/asset/icon/Icon16/flag_pitcairn_islands.png b/asset/icon/Icon16/flag_pitcairn_islands.png new file mode 100644 index 0000000..c5cb618 Binary files /dev/null and b/asset/icon/Icon16/flag_pitcairn_islands.png differ diff --git a/asset/icon/Icon16/flag_poland.png b/asset/icon/Icon16/flag_poland.png new file mode 100644 index 0000000..4dd7104 Binary files /dev/null and b/asset/icon/Icon16/flag_poland.png differ diff --git a/asset/icon/Icon16/flag_portugal.png b/asset/icon/Icon16/flag_portugal.png new file mode 100644 index 0000000..19cd33a Binary files /dev/null and b/asset/icon/Icon16/flag_portugal.png differ diff --git a/asset/icon/Icon16/flag_puerto_rico.png b/asset/icon/Icon16/flag_puerto_rico.png new file mode 100644 index 0000000..37929c1 Binary files /dev/null and b/asset/icon/Icon16/flag_puerto_rico.png differ diff --git a/asset/icon/Icon16/flag_purple.png b/asset/icon/Icon16/flag_purple.png new file mode 100644 index 0000000..0cb00ee Binary files /dev/null and b/asset/icon/Icon16/flag_purple.png differ diff --git a/asset/icon/Icon16/flag_qatar.png b/asset/icon/Icon16/flag_qatar.png new file mode 100644 index 0000000..507b8bd Binary files /dev/null and b/asset/icon/Icon16/flag_qatar.png differ diff --git a/asset/icon/Icon16/flag_red.png b/asset/icon/Icon16/flag_red.png new file mode 100644 index 0000000..b99e36b Binary files /dev/null and b/asset/icon/Icon16/flag_red.png differ diff --git a/asset/icon/Icon16/flag_red_cross.png b/asset/icon/Icon16/flag_red_cross.png new file mode 100644 index 0000000..8863c7a Binary files /dev/null and b/asset/icon/Icon16/flag_red_cross.png differ diff --git a/asset/icon/Icon16/flag_romania.png b/asset/icon/Icon16/flag_romania.png new file mode 100644 index 0000000..eb8cbe0 Binary files /dev/null and b/asset/icon/Icon16/flag_romania.png differ diff --git a/asset/icon/Icon16/flag_russia.png b/asset/icon/Icon16/flag_russia.png new file mode 100644 index 0000000..b4822ea Binary files /dev/null and b/asset/icon/Icon16/flag_russia.png differ diff --git a/asset/icon/Icon16/flag_rwanda.png b/asset/icon/Icon16/flag_rwanda.png new file mode 100644 index 0000000..d9cba67 Binary files /dev/null and b/asset/icon/Icon16/flag_rwanda.png differ diff --git a/asset/icon/Icon16/flag_saint_helena.png b/asset/icon/Icon16/flag_saint_helena.png new file mode 100644 index 0000000..63ad3b5 Binary files /dev/null and b/asset/icon/Icon16/flag_saint_helena.png differ diff --git a/asset/icon/Icon16/flag_saint_kitts_and_nevis.png b/asset/icon/Icon16/flag_saint_kitts_and_nevis.png new file mode 100644 index 0000000..59354a4 Binary files /dev/null and b/asset/icon/Icon16/flag_saint_kitts_and_nevis.png differ diff --git a/asset/icon/Icon16/flag_saint_lucia.png b/asset/icon/Icon16/flag_saint_lucia.png new file mode 100644 index 0000000..8b004a9 Binary files /dev/null and b/asset/icon/Icon16/flag_saint_lucia.png differ diff --git a/asset/icon/Icon16/flag_saint_pierre_and_miquelon.png b/asset/icon/Icon16/flag_saint_pierre_and_miquelon.png new file mode 100644 index 0000000..b339dbb Binary files /dev/null and b/asset/icon/Icon16/flag_saint_pierre_and_miquelon.png differ diff --git a/asset/icon/Icon16/flag_saint_vincent_and_grenadines.png b/asset/icon/Icon16/flag_saint_vincent_and_grenadines.png new file mode 100644 index 0000000..c7cf1b5 Binary files /dev/null and b/asset/icon/Icon16/flag_saint_vincent_and_grenadines.png differ diff --git a/asset/icon/Icon16/flag_samoa.png b/asset/icon/Icon16/flag_samoa.png new file mode 100644 index 0000000..316e147 Binary files /dev/null and b/asset/icon/Icon16/flag_samoa.png differ diff --git a/asset/icon/Icon16/flag_san_marino.png b/asset/icon/Icon16/flag_san_marino.png new file mode 100644 index 0000000..e86721b Binary files /dev/null and b/asset/icon/Icon16/flag_san_marino.png differ diff --git a/asset/icon/Icon16/flag_sao_tome_and_principe.png b/asset/icon/Icon16/flag_sao_tome_and_principe.png new file mode 100644 index 0000000..9cba4e3 Binary files /dev/null and b/asset/icon/Icon16/flag_sao_tome_and_principe.png differ diff --git a/asset/icon/Icon16/flag_saudi_arabia.png b/asset/icon/Icon16/flag_saudi_arabia.png new file mode 100644 index 0000000..3196f02 Binary files /dev/null and b/asset/icon/Icon16/flag_saudi_arabia.png differ diff --git a/asset/icon/Icon16/flag_scotland.png b/asset/icon/Icon16/flag_scotland.png new file mode 100644 index 0000000..3762bee Binary files /dev/null and b/asset/icon/Icon16/flag_scotland.png differ diff --git a/asset/icon/Icon16/flag_senegal.png b/asset/icon/Icon16/flag_senegal.png new file mode 100644 index 0000000..80eb1f1 Binary files /dev/null and b/asset/icon/Icon16/flag_senegal.png differ diff --git a/asset/icon/Icon16/flag_serbia_montenegro.png b/asset/icon/Icon16/flag_serbia_montenegro.png new file mode 100644 index 0000000..5d441c8 Binary files /dev/null and b/asset/icon/Icon16/flag_serbia_montenegro.png differ diff --git a/asset/icon/Icon16/flag_seychelles.png b/asset/icon/Icon16/flag_seychelles.png new file mode 100644 index 0000000..091995a Binary files /dev/null and b/asset/icon/Icon16/flag_seychelles.png differ diff --git a/asset/icon/Icon16/flag_sierra_leone.png b/asset/icon/Icon16/flag_sierra_leone.png new file mode 100644 index 0000000..a2ccddb Binary files /dev/null and b/asset/icon/Icon16/flag_sierra_leone.png differ diff --git a/asset/icon/Icon16/flag_singapore.png b/asset/icon/Icon16/flag_singapore.png new file mode 100644 index 0000000..a2a394d Binary files /dev/null and b/asset/icon/Icon16/flag_singapore.png differ diff --git a/asset/icon/Icon16/flag_slovakia.png b/asset/icon/Icon16/flag_slovakia.png new file mode 100644 index 0000000..8c4d813 Binary files /dev/null and b/asset/icon/Icon16/flag_slovakia.png differ diff --git a/asset/icon/Icon16/flag_slovenia.png b/asset/icon/Icon16/flag_slovenia.png new file mode 100644 index 0000000..0ea0b28 Binary files /dev/null and b/asset/icon/Icon16/flag_slovenia.png differ diff --git a/asset/icon/Icon16/flag_solomon_islands.png b/asset/icon/Icon16/flag_solomon_islands.png new file mode 100644 index 0000000..672724d Binary files /dev/null and b/asset/icon/Icon16/flag_solomon_islands.png differ diff --git a/asset/icon/Icon16/flag_somalia.png b/asset/icon/Icon16/flag_somalia.png new file mode 100644 index 0000000..18641c7 Binary files /dev/null and b/asset/icon/Icon16/flag_somalia.png differ diff --git a/asset/icon/Icon16/flag_south_africa.png b/asset/icon/Icon16/flag_south_africa.png new file mode 100644 index 0000000..029b5ec Binary files /dev/null and b/asset/icon/Icon16/flag_south_africa.png differ diff --git a/asset/icon/Icon16/flag_south_georgia.png b/asset/icon/Icon16/flag_south_georgia.png new file mode 100644 index 0000000..6a54027 Binary files /dev/null and b/asset/icon/Icon16/flag_south_georgia.png differ diff --git a/asset/icon/Icon16/flag_south_korea.png b/asset/icon/Icon16/flag_south_korea.png new file mode 100644 index 0000000..8066f21 Binary files /dev/null and b/asset/icon/Icon16/flag_south_korea.png differ diff --git a/asset/icon/Icon16/flag_spain.png b/asset/icon/Icon16/flag_spain.png new file mode 100644 index 0000000..d87283c Binary files /dev/null and b/asset/icon/Icon16/flag_spain.png differ diff --git a/asset/icon/Icon16/flag_sri_lanka.png b/asset/icon/Icon16/flag_sri_lanka.png new file mode 100644 index 0000000..46445d8 Binary files /dev/null and b/asset/icon/Icon16/flag_sri_lanka.png differ diff --git a/asset/icon/Icon16/flag_sudan.png b/asset/icon/Icon16/flag_sudan.png new file mode 100644 index 0000000..961ad80 Binary files /dev/null and b/asset/icon/Icon16/flag_sudan.png differ diff --git a/asset/icon/Icon16/flag_suriname.png b/asset/icon/Icon16/flag_suriname.png new file mode 100644 index 0000000..80a9dd6 Binary files /dev/null and b/asset/icon/Icon16/flag_suriname.png differ diff --git a/asset/icon/Icon16/flag_swaziland.png b/asset/icon/Icon16/flag_swaziland.png new file mode 100644 index 0000000..7ef4b09 Binary files /dev/null and b/asset/icon/Icon16/flag_swaziland.png differ diff --git a/asset/icon/Icon16/flag_sweden.png b/asset/icon/Icon16/flag_sweden.png new file mode 100644 index 0000000..6d00d9d Binary files /dev/null and b/asset/icon/Icon16/flag_sweden.png differ diff --git a/asset/icon/Icon16/flag_switzerland.png b/asset/icon/Icon16/flag_switzerland.png new file mode 100644 index 0000000..93664cd Binary files /dev/null and b/asset/icon/Icon16/flag_switzerland.png differ diff --git a/asset/icon/Icon16/flag_syria.png b/asset/icon/Icon16/flag_syria.png new file mode 100644 index 0000000..0df4fea Binary files /dev/null and b/asset/icon/Icon16/flag_syria.png differ diff --git a/asset/icon/Icon16/flag_taiwan.png b/asset/icon/Icon16/flag_taiwan.png new file mode 100644 index 0000000..3fc1590 Binary files /dev/null and b/asset/icon/Icon16/flag_taiwan.png differ diff --git a/asset/icon/Icon16/flag_tajikistan.png b/asset/icon/Icon16/flag_tajikistan.png new file mode 100644 index 0000000..d40f3f6 Binary files /dev/null and b/asset/icon/Icon16/flag_tajikistan.png differ diff --git a/asset/icon/Icon16/flag_tanzania.png b/asset/icon/Icon16/flag_tanzania.png new file mode 100644 index 0000000..5597926 Binary files /dev/null and b/asset/icon/Icon16/flag_tanzania.png differ diff --git a/asset/icon/Icon16/flag_thailand.png b/asset/icon/Icon16/flag_thailand.png new file mode 100644 index 0000000..b117815 Binary files /dev/null and b/asset/icon/Icon16/flag_thailand.png differ diff --git a/asset/icon/Icon16/flag_tibet.png b/asset/icon/Icon16/flag_tibet.png new file mode 100644 index 0000000..ab88e5a Binary files /dev/null and b/asset/icon/Icon16/flag_tibet.png differ diff --git a/asset/icon/Icon16/flag_togo.png b/asset/icon/Icon16/flag_togo.png new file mode 100644 index 0000000..232bc54 Binary files /dev/null and b/asset/icon/Icon16/flag_togo.png differ diff --git a/asset/icon/Icon16/flag_tonga.png b/asset/icon/Icon16/flag_tonga.png new file mode 100644 index 0000000..9a0c0f6 Binary files /dev/null and b/asset/icon/Icon16/flag_tonga.png differ diff --git a/asset/icon/Icon16/flag_trinidad_and_tobago.png b/asset/icon/Icon16/flag_trinidad_and_tobago.png new file mode 100644 index 0000000..f759747 Binary files /dev/null and b/asset/icon/Icon16/flag_trinidad_and_tobago.png differ diff --git a/asset/icon/Icon16/flag_tunisia.png b/asset/icon/Icon16/flag_tunisia.png new file mode 100644 index 0000000..7c788f3 Binary files /dev/null and b/asset/icon/Icon16/flag_tunisia.png differ diff --git a/asset/icon/Icon16/flag_turkey.png b/asset/icon/Icon16/flag_turkey.png new file mode 100644 index 0000000..6cdcb63 Binary files /dev/null and b/asset/icon/Icon16/flag_turkey.png differ diff --git a/asset/icon/Icon16/flag_turkmenistan.png b/asset/icon/Icon16/flag_turkmenistan.png new file mode 100644 index 0000000..61933a6 Binary files /dev/null and b/asset/icon/Icon16/flag_turkmenistan.png differ diff --git a/asset/icon/Icon16/flag_turks_and_caicos_islands.png b/asset/icon/Icon16/flag_turks_and_caicos_islands.png new file mode 100644 index 0000000..8793802 Binary files /dev/null and b/asset/icon/Icon16/flag_turks_and_caicos_islands.png differ diff --git a/asset/icon/Icon16/flag_tuvalu.png b/asset/icon/Icon16/flag_tuvalu.png new file mode 100644 index 0000000..7e93c95 Binary files /dev/null and b/asset/icon/Icon16/flag_tuvalu.png differ diff --git a/asset/icon/Icon16/flag_uganda.png b/asset/icon/Icon16/flag_uganda.png new file mode 100644 index 0000000..68957ff Binary files /dev/null and b/asset/icon/Icon16/flag_uganda.png differ diff --git a/asset/icon/Icon16/flag_ukraine.png b/asset/icon/Icon16/flag_ukraine.png new file mode 100644 index 0000000..639aa4a Binary files /dev/null and b/asset/icon/Icon16/flag_ukraine.png differ diff --git a/asset/icon/Icon16/flag_unesco.png b/asset/icon/Icon16/flag_unesco.png new file mode 100644 index 0000000..fe5d7a1 Binary files /dev/null and b/asset/icon/Icon16/flag_unesco.png differ diff --git a/asset/icon/Icon16/flag_united_arab_emirates.png b/asset/icon/Icon16/flag_united_arab_emirates.png new file mode 100644 index 0000000..a77ea63 Binary files /dev/null and b/asset/icon/Icon16/flag_united_arab_emirates.png differ diff --git a/asset/icon/Icon16/flag_united_nations.png b/asset/icon/Icon16/flag_united_nations.png new file mode 100644 index 0000000..16ccc90 Binary files /dev/null and b/asset/icon/Icon16/flag_united_nations.png differ diff --git a/asset/icon/Icon16/flag_uruquay.png b/asset/icon/Icon16/flag_uruquay.png new file mode 100644 index 0000000..6c03e9f Binary files /dev/null and b/asset/icon/Icon16/flag_uruquay.png differ diff --git a/asset/icon/Icon16/flag_usa.png b/asset/icon/Icon16/flag_usa.png new file mode 100644 index 0000000..f027ed8 Binary files /dev/null and b/asset/icon/Icon16/flag_usa.png differ diff --git a/asset/icon/Icon16/flag_uzbekistan.png b/asset/icon/Icon16/flag_uzbekistan.png new file mode 100644 index 0000000..4f98eaf Binary files /dev/null and b/asset/icon/Icon16/flag_uzbekistan.png differ diff --git a/asset/icon/Icon16/flag_vanuatu.png b/asset/icon/Icon16/flag_vanuatu.png new file mode 100644 index 0000000..a05e2ad Binary files /dev/null and b/asset/icon/Icon16/flag_vanuatu.png differ diff --git a/asset/icon/Icon16/flag_vatican_city.png b/asset/icon/Icon16/flag_vatican_city.png new file mode 100644 index 0000000..c873025 Binary files /dev/null and b/asset/icon/Icon16/flag_vatican_city.png differ diff --git a/asset/icon/Icon16/flag_venezuela.png b/asset/icon/Icon16/flag_venezuela.png new file mode 100644 index 0000000..b9a06d5 Binary files /dev/null and b/asset/icon/Icon16/flag_venezuela.png differ diff --git a/asset/icon/Icon16/flag_vietnam.png b/asset/icon/Icon16/flag_vietnam.png new file mode 100644 index 0000000..48f9b69 Binary files /dev/null and b/asset/icon/Icon16/flag_vietnam.png differ diff --git a/asset/icon/Icon16/flag_virgin_islands.png b/asset/icon/Icon16/flag_virgin_islands.png new file mode 100644 index 0000000..b00764f Binary files /dev/null and b/asset/icon/Icon16/flag_virgin_islands.png differ diff --git a/asset/icon/Icon16/flag_wales.png b/asset/icon/Icon16/flag_wales.png new file mode 100644 index 0000000..5f54c89 Binary files /dev/null and b/asset/icon/Icon16/flag_wales.png differ diff --git a/asset/icon/Icon16/flag_wallis_and_futuna.png b/asset/icon/Icon16/flag_wallis_and_futuna.png new file mode 100644 index 0000000..1680f91 Binary files /dev/null and b/asset/icon/Icon16/flag_wallis_and_futuna.png differ diff --git a/asset/icon/Icon16/flag_wto.png b/asset/icon/Icon16/flag_wto.png new file mode 100644 index 0000000..43f7a33 Binary files /dev/null and b/asset/icon/Icon16/flag_wto.png differ diff --git a/asset/icon/Icon16/flag_wwf.png b/asset/icon/Icon16/flag_wwf.png new file mode 100644 index 0000000..28f7a50 Binary files /dev/null and b/asset/icon/Icon16/flag_wwf.png differ diff --git a/asset/icon/Icon16/flag_yellow.png b/asset/icon/Icon16/flag_yellow.png new file mode 100644 index 0000000..8f087bb Binary files /dev/null and b/asset/icon/Icon16/flag_yellow.png differ diff --git a/asset/icon/Icon16/flag_yemen.png b/asset/icon/Icon16/flag_yemen.png new file mode 100644 index 0000000..3183e58 Binary files /dev/null and b/asset/icon/Icon16/flag_yemen.png differ diff --git a/asset/icon/Icon16/flag_zambia.png b/asset/icon/Icon16/flag_zambia.png new file mode 100644 index 0000000..12fe99b Binary files /dev/null and b/asset/icon/Icon16/flag_zambia.png differ diff --git a/asset/icon/Icon16/flag_zimbabwe.png b/asset/icon/Icon16/flag_zimbabwe.png new file mode 100644 index 0000000..4188967 Binary files /dev/null and b/asset/icon/Icon16/flag_zimbabwe.png differ diff --git a/asset/icon/Icon16/flamingo.png b/asset/icon/Icon16/flamingo.png new file mode 100644 index 0000000..ef7f10b Binary files /dev/null and b/asset/icon/Icon16/flamingo.png differ diff --git a/asset/icon/Icon16/flashdisk.png b/asset/icon/Icon16/flashdisk.png new file mode 100644 index 0000000..f2f37c3 Binary files /dev/null and b/asset/icon/Icon16/flashdisk.png differ diff --git a/asset/icon/Icon16/flashdisk_logo.png b/asset/icon/Icon16/flashdisk_logo.png new file mode 100644 index 0000000..7450003 Binary files /dev/null and b/asset/icon/Icon16/flashdisk_logo.png differ diff --git a/asset/icon/Icon16/flashlight.png b/asset/icon/Icon16/flashlight.png new file mode 100644 index 0000000..df4fcc3 Binary files /dev/null and b/asset/icon/Icon16/flashlight.png differ diff --git a/asset/icon/Icon16/flashlight_shine.png b/asset/icon/Icon16/flashlight_shine.png new file mode 100644 index 0000000..79c726c Binary files /dev/null and b/asset/icon/Icon16/flashlight_shine.png differ diff --git a/asset/icon/Icon16/flask.png b/asset/icon/Icon16/flask.png new file mode 100644 index 0000000..599c9a3 Binary files /dev/null and b/asset/icon/Icon16/flask.png differ diff --git a/asset/icon/Icon16/flask_empty.png b/asset/icon/Icon16/flask_empty.png new file mode 100644 index 0000000..0ffdced Binary files /dev/null and b/asset/icon/Icon16/flask_empty.png differ diff --git a/asset/icon/Icon16/flex.png b/asset/icon/Icon16/flex.png new file mode 100644 index 0000000..3542203 Binary files /dev/null and b/asset/icon/Icon16/flex.png differ diff --git a/asset/icon/Icon16/flex_builder.png b/asset/icon/Icon16/flex_builder.png new file mode 100644 index 0000000..4ea9e7b Binary files /dev/null and b/asset/icon/Icon16/flex_builder.png differ diff --git a/asset/icon/Icon16/flickr.png b/asset/icon/Icon16/flickr.png new file mode 100644 index 0000000..43f122a Binary files /dev/null and b/asset/icon/Icon16/flickr.png differ diff --git a/asset/icon/Icon16/flood_it.png b/asset/icon/Icon16/flood_it.png new file mode 100644 index 0000000..a351a9c Binary files /dev/null and b/asset/icon/Icon16/flood_it.png differ diff --git a/asset/icon/Icon16/flow.png b/asset/icon/Icon16/flow.png new file mode 100644 index 0000000..0b629e6 Binary files /dev/null and b/asset/icon/Icon16/flow.png differ diff --git a/asset/icon/Icon16/flower.png b/asset/icon/Icon16/flower.png new file mode 100644 index 0000000..ba4b0ab Binary files /dev/null and b/asset/icon/Icon16/flower.png differ diff --git a/asset/icon/Icon16/fog.png b/asset/icon/Icon16/fog.png new file mode 100644 index 0000000..a58e0ba Binary files /dev/null and b/asset/icon/Icon16/fog.png differ diff --git a/asset/icon/Icon16/folder.png b/asset/icon/Icon16/folder.png new file mode 100644 index 0000000..f1ed9ab Binary files /dev/null and b/asset/icon/Icon16/folder.png differ diff --git a/asset/icon/Icon16/folder_add.png b/asset/icon/Icon16/folder_add.png new file mode 100644 index 0000000..83761c2 Binary files /dev/null and b/asset/icon/Icon16/folder_add.png differ diff --git a/asset/icon/Icon16/folder_bell.png b/asset/icon/Icon16/folder_bell.png new file mode 100644 index 0000000..1a9efd0 Binary files /dev/null and b/asset/icon/Icon16/folder_bell.png differ diff --git a/asset/icon/Icon16/folder_black.png b/asset/icon/Icon16/folder_black.png new file mode 100644 index 0000000..cb1d414 Binary files /dev/null and b/asset/icon/Icon16/folder_black.png differ diff --git a/asset/icon/Icon16/folder_blue.png b/asset/icon/Icon16/folder_blue.png new file mode 100644 index 0000000..696561a Binary files /dev/null and b/asset/icon/Icon16/folder_blue.png differ diff --git a/asset/icon/Icon16/folder_brick.png b/asset/icon/Icon16/folder_brick.png new file mode 100644 index 0000000..e9c2a2f Binary files /dev/null and b/asset/icon/Icon16/folder_brick.png differ diff --git a/asset/icon/Icon16/folder_bug.png b/asset/icon/Icon16/folder_bug.png new file mode 100644 index 0000000..3873603 Binary files /dev/null and b/asset/icon/Icon16/folder_bug.png differ diff --git a/asset/icon/Icon16/folder_camera.png b/asset/icon/Icon16/folder_camera.png new file mode 100644 index 0000000..e6b6c13 Binary files /dev/null and b/asset/icon/Icon16/folder_camera.png differ diff --git a/asset/icon/Icon16/folder_database.png b/asset/icon/Icon16/folder_database.png new file mode 100644 index 0000000..7acd2ad Binary files /dev/null and b/asset/icon/Icon16/folder_database.png differ diff --git a/asset/icon/Icon16/folder_delete.png b/asset/icon/Icon16/folder_delete.png new file mode 100644 index 0000000..bb56a9e Binary files /dev/null and b/asset/icon/Icon16/folder_delete.png differ diff --git a/asset/icon/Icon16/folder_edit.png b/asset/icon/Icon16/folder_edit.png new file mode 100644 index 0000000..fe774a6 Binary files /dev/null and b/asset/icon/Icon16/folder_edit.png differ diff --git a/asset/icon/Icon16/folder_error.png b/asset/icon/Icon16/folder_error.png new file mode 100644 index 0000000..6667aac Binary files /dev/null and b/asset/icon/Icon16/folder_error.png differ diff --git a/asset/icon/Icon16/folder_explore.png b/asset/icon/Icon16/folder_explore.png new file mode 100644 index 0000000..c830338 Binary files /dev/null and b/asset/icon/Icon16/folder_explore.png differ diff --git a/asset/icon/Icon16/folder_feed.png b/asset/icon/Icon16/folder_feed.png new file mode 100644 index 0000000..fc9345a Binary files /dev/null and b/asset/icon/Icon16/folder_feed.png differ diff --git a/asset/icon/Icon16/folder_find.png b/asset/icon/Icon16/folder_find.png new file mode 100644 index 0000000..e5ab08f Binary files /dev/null and b/asset/icon/Icon16/folder_find.png differ diff --git a/asset/icon/Icon16/folder_go.png b/asset/icon/Icon16/folder_go.png new file mode 100644 index 0000000..3c36ef0 Binary files /dev/null and b/asset/icon/Icon16/folder_go.png differ diff --git a/asset/icon/Icon16/folder_green.png b/asset/icon/Icon16/folder_green.png new file mode 100644 index 0000000..68c3221 Binary files /dev/null and b/asset/icon/Icon16/folder_green.png differ diff --git a/asset/icon/Icon16/folder_heart.png b/asset/icon/Icon16/folder_heart.png new file mode 100644 index 0000000..01f04a5 Binary files /dev/null and b/asset/icon/Icon16/folder_heart.png differ diff --git a/asset/icon/Icon16/folder_image.png b/asset/icon/Icon16/folder_image.png new file mode 100644 index 0000000..43a31c4 Binary files /dev/null and b/asset/icon/Icon16/folder_image.png differ diff --git a/asset/icon/Icon16/folder_key.png b/asset/icon/Icon16/folder_key.png new file mode 100644 index 0000000..02e9416 Binary files /dev/null and b/asset/icon/Icon16/folder_key.png differ diff --git a/asset/icon/Icon16/folder_lightbulb.png b/asset/icon/Icon16/folder_lightbulb.png new file mode 100644 index 0000000..a3de275 Binary files /dev/null and b/asset/icon/Icon16/folder_lightbulb.png differ diff --git a/asset/icon/Icon16/folder_link.png b/asset/icon/Icon16/folder_link.png new file mode 100644 index 0000000..c01279c Binary files /dev/null and b/asset/icon/Icon16/folder_link.png differ diff --git a/asset/icon/Icon16/folder_page.png b/asset/icon/Icon16/folder_page.png new file mode 100644 index 0000000..502122a Binary files /dev/null and b/asset/icon/Icon16/folder_page.png differ diff --git a/asset/icon/Icon16/folder_page_white.png b/asset/icon/Icon16/folder_page_white.png new file mode 100644 index 0000000..54791db Binary files /dev/null and b/asset/icon/Icon16/folder_page_white.png differ diff --git a/asset/icon/Icon16/folder_palette.png b/asset/icon/Icon16/folder_palette.png new file mode 100644 index 0000000..36b680b Binary files /dev/null and b/asset/icon/Icon16/folder_palette.png differ diff --git a/asset/icon/Icon16/folder_picture.png b/asset/icon/Icon16/folder_picture.png new file mode 100644 index 0000000..06f3adc Binary files /dev/null and b/asset/icon/Icon16/folder_picture.png differ diff --git a/asset/icon/Icon16/folder_red.png b/asset/icon/Icon16/folder_red.png new file mode 100644 index 0000000..83cef08 Binary files /dev/null and b/asset/icon/Icon16/folder_red.png differ diff --git a/asset/icon/Icon16/folder_search.png b/asset/icon/Icon16/folder_search.png new file mode 100644 index 0000000..994bffd Binary files /dev/null and b/asset/icon/Icon16/folder_search.png differ diff --git a/asset/icon/Icon16/folder_stand.png b/asset/icon/Icon16/folder_stand.png new file mode 100644 index 0000000..a6eda6d Binary files /dev/null and b/asset/icon/Icon16/folder_stand.png differ diff --git a/asset/icon/Icon16/folder_star.png b/asset/icon/Icon16/folder_star.png new file mode 100644 index 0000000..ae8fded Binary files /dev/null and b/asset/icon/Icon16/folder_star.png differ diff --git a/asset/icon/Icon16/folder_table.png b/asset/icon/Icon16/folder_table.png new file mode 100644 index 0000000..8422499 Binary files /dev/null and b/asset/icon/Icon16/folder_table.png differ diff --git a/asset/icon/Icon16/folder_torn.png b/asset/icon/Icon16/folder_torn.png new file mode 100644 index 0000000..0743522 Binary files /dev/null and b/asset/icon/Icon16/folder_torn.png differ diff --git a/asset/icon/Icon16/folder_user.png b/asset/icon/Icon16/folder_user.png new file mode 100644 index 0000000..2cd2841 Binary files /dev/null and b/asset/icon/Icon16/folder_user.png differ diff --git a/asset/icon/Icon16/folder_vertical_document.png b/asset/icon/Icon16/folder_vertical_document.png new file mode 100644 index 0000000..6bff6a4 Binary files /dev/null and b/asset/icon/Icon16/folder_vertical_document.png differ diff --git a/asset/icon/Icon16/folder_vertical_open.png b/asset/icon/Icon16/folder_vertical_open.png new file mode 100644 index 0000000..7b97b9b Binary files /dev/null and b/asset/icon/Icon16/folder_vertical_open.png differ diff --git a/asset/icon/Icon16/folder_vertical_rename.png b/asset/icon/Icon16/folder_vertical_rename.png new file mode 100644 index 0000000..1931b17 Binary files /dev/null and b/asset/icon/Icon16/folder_vertical_rename.png differ diff --git a/asset/icon/Icon16/folder_vertical_torn.png b/asset/icon/Icon16/folder_vertical_torn.png new file mode 100644 index 0000000..738a6ae Binary files /dev/null and b/asset/icon/Icon16/folder_vertical_torn.png differ diff --git a/asset/icon/Icon16/folder_vertical_zipper.png b/asset/icon/Icon16/folder_vertical_zipper.png new file mode 100644 index 0000000..5e48fb9 Binary files /dev/null and b/asset/icon/Icon16/folder_vertical_zipper.png differ diff --git a/asset/icon/Icon16/folder_wrench.png b/asset/icon/Icon16/folder_wrench.png new file mode 100644 index 0000000..e2404b3 Binary files /dev/null and b/asset/icon/Icon16/folder_wrench.png differ diff --git a/asset/icon/Icon16/folders.png b/asset/icon/Icon16/folders.png new file mode 100644 index 0000000..729f084 Binary files /dev/null and b/asset/icon/Icon16/folders.png differ diff --git a/asset/icon/Icon16/folders_explorer.png b/asset/icon/Icon16/folders_explorer.png new file mode 100644 index 0000000..91457ff Binary files /dev/null and b/asset/icon/Icon16/folders_explorer.png differ diff --git a/asset/icon/Icon16/folding_fan.png b/asset/icon/Icon16/folding_fan.png new file mode 100644 index 0000000..19d2223 Binary files /dev/null and b/asset/icon/Icon16/folding_fan.png differ diff --git a/asset/icon/Icon16/font.png b/asset/icon/Icon16/font.png new file mode 100644 index 0000000..7047aea Binary files /dev/null and b/asset/icon/Icon16/font.png differ diff --git a/asset/icon/Icon16/font_add.png b/asset/icon/Icon16/font_add.png new file mode 100644 index 0000000..3fe60d2 Binary files /dev/null and b/asset/icon/Icon16/font_add.png differ diff --git a/asset/icon/Icon16/font_colors.png b/asset/icon/Icon16/font_colors.png new file mode 100644 index 0000000..0208d2d Binary files /dev/null and b/asset/icon/Icon16/font_colors.png differ diff --git a/asset/icon/Icon16/font_delete.png b/asset/icon/Icon16/font_delete.png new file mode 100644 index 0000000..d76cbef Binary files /dev/null and b/asset/icon/Icon16/font_delete.png differ diff --git a/asset/icon/Icon16/font_go.png b/asset/icon/Icon16/font_go.png new file mode 100644 index 0000000..0a9d8ba Binary files /dev/null and b/asset/icon/Icon16/font_go.png differ diff --git a/asset/icon/Icon16/font_red.png b/asset/icon/Icon16/font_red.png new file mode 100644 index 0000000..2d96c66 Binary files /dev/null and b/asset/icon/Icon16/font_red.png differ diff --git a/asset/icon/Icon16/font_red_delete.png b/asset/icon/Icon16/font_red_delete.png new file mode 100644 index 0000000..74fd0cb Binary files /dev/null and b/asset/icon/Icon16/font_red_delete.png differ diff --git a/asset/icon/Icon16/font_size_decrease.png b/asset/icon/Icon16/font_size_decrease.png new file mode 100644 index 0000000..ae9fd30 Binary files /dev/null and b/asset/icon/Icon16/font_size_decrease.png differ diff --git a/asset/icon/Icon16/font_size_increase.png b/asset/icon/Icon16/font_size_increase.png new file mode 100644 index 0000000..e6a9c6e Binary files /dev/null and b/asset/icon/Icon16/font_size_increase.png differ diff --git a/asset/icon/Icon16/font_subscript.png b/asset/icon/Icon16/font_subscript.png new file mode 100644 index 0000000..3c20016 Binary files /dev/null and b/asset/icon/Icon16/font_subscript.png differ diff --git a/asset/icon/Icon16/font_superscript.png b/asset/icon/Icon16/font_superscript.png new file mode 100644 index 0000000..93daebf Binary files /dev/null and b/asset/icon/Icon16/font_superscript.png differ diff --git a/asset/icon/Icon16/forklift.png b/asset/icon/Icon16/forklift.png new file mode 100644 index 0000000..59c83a0 Binary files /dev/null and b/asset/icon/Icon16/forklift.png differ diff --git a/asset/icon/Icon16/form(2).png b/asset/icon/Icon16/form(2).png new file mode 100644 index 0000000..c95e4e9 Binary files /dev/null and b/asset/icon/Icon16/form(2).png differ diff --git a/asset/icon/Icon16/form.png b/asset/icon/Icon16/form.png new file mode 100644 index 0000000..415ac21 Binary files /dev/null and b/asset/icon/Icon16/form.png differ diff --git a/asset/icon/Icon16/form_design.png b/asset/icon/Icon16/form_design.png new file mode 100644 index 0000000..7d1fdf8 Binary files /dev/null and b/asset/icon/Icon16/form_design.png differ diff --git a/asset/icon/Icon16/form_wizard.png b/asset/icon/Icon16/form_wizard.png new file mode 100644 index 0000000..28a9ae5 Binary files /dev/null and b/asset/icon/Icon16/form_wizard.png differ diff --git a/asset/icon/Icon16/format_conditional.png b/asset/icon/Icon16/format_conditional.png new file mode 100644 index 0000000..bfd5b1a Binary files /dev/null and b/asset/icon/Icon16/format_conditional.png differ diff --git a/asset/icon/Icon16/format_painter.png b/asset/icon/Icon16/format_painter.png new file mode 100644 index 0000000..e1ddab5 Binary files /dev/null and b/asset/icon/Icon16/format_painter.png differ diff --git a/asset/icon/Icon16/format_percentage.png b/asset/icon/Icon16/format_percentage.png new file mode 100644 index 0000000..030971b Binary files /dev/null and b/asset/icon/Icon16/format_percentage.png differ diff --git a/asset/icon/Icon16/formheading.png b/asset/icon/Icon16/formheading.png new file mode 100644 index 0000000..fa0c786 Binary files /dev/null and b/asset/icon/Icon16/formheading.png differ diff --git a/asset/icon/Icon16/forrst.png b/asset/icon/Icon16/forrst.png new file mode 100644 index 0000000..e1b5e49 Binary files /dev/null and b/asset/icon/Icon16/forrst.png differ diff --git a/asset/icon/Icon16/forwarders.png b/asset/icon/Icon16/forwarders.png new file mode 100644 index 0000000..9bf91b6 Binary files /dev/null and b/asset/icon/Icon16/forwarders.png differ diff --git a/asset/icon/Icon16/freebsd.png b/asset/icon/Icon16/freebsd.png new file mode 100644 index 0000000..01d67ee Binary files /dev/null and b/asset/icon/Icon16/freebsd.png differ diff --git a/asset/icon/Icon16/friendfeed.png b/asset/icon/Icon16/friendfeed.png new file mode 100644 index 0000000..dc0d236 Binary files /dev/null and b/asset/icon/Icon16/friendfeed.png differ diff --git a/asset/icon/Icon16/from_access.png b/asset/icon/Icon16/from_access.png new file mode 100644 index 0000000..3779863 Binary files /dev/null and b/asset/icon/Icon16/from_access.png differ diff --git a/asset/icon/Icon16/from_beginning.png b/asset/icon/Icon16/from_beginning.png new file mode 100644 index 0000000..38a4a4b Binary files /dev/null and b/asset/icon/Icon16/from_beginning.png differ diff --git a/asset/icon/Icon16/from_current_slide.png b/asset/icon/Icon16/from_current_slide.png new file mode 100644 index 0000000..fd2c945 Binary files /dev/null and b/asset/icon/Icon16/from_current_slide.png differ diff --git a/asset/icon/Icon16/from_other_resources.png b/asset/icon/Icon16/from_other_resources.png new file mode 100644 index 0000000..7d47ed1 Binary files /dev/null and b/asset/icon/Icon16/from_other_resources.png differ diff --git a/asset/icon/Icon16/from_text.png b/asset/icon/Icon16/from_text.png new file mode 100644 index 0000000..ea22697 Binary files /dev/null and b/asset/icon/Icon16/from_text.png differ diff --git a/asset/icon/Icon16/from_web.png b/asset/icon/Icon16/from_web.png new file mode 100644 index 0000000..6fa08eb Binary files /dev/null and b/asset/icon/Icon16/from_web.png differ diff --git a/asset/icon/Icon16/frontpage.png b/asset/icon/Icon16/frontpage.png new file mode 100644 index 0000000..1a6bd09 Binary files /dev/null and b/asset/icon/Icon16/frontpage.png differ diff --git a/asset/icon/Icon16/fruit_grape.png b/asset/icon/Icon16/fruit_grape.png new file mode 100644 index 0000000..b676d90 Binary files /dev/null and b/asset/icon/Icon16/fruit_grape.png differ diff --git a/asset/icon/Icon16/fruit_lime.png b/asset/icon/Icon16/fruit_lime.png new file mode 100644 index 0000000..0e0bd40 Binary files /dev/null and b/asset/icon/Icon16/fruit_lime.png differ diff --git a/asset/icon/Icon16/ftp.png b/asset/icon/Icon16/ftp.png new file mode 100644 index 0000000..2b88fda Binary files /dev/null and b/asset/icon/Icon16/ftp.png differ diff --git a/asset/icon/Icon16/ftp_accounts.png b/asset/icon/Icon16/ftp_accounts.png new file mode 100644 index 0000000..1636bf9 Binary files /dev/null and b/asset/icon/Icon16/ftp_accounts.png differ diff --git a/asset/icon/Icon16/ftp_session_control.png b/asset/icon/Icon16/ftp_session_control.png new file mode 100644 index 0000000..c05f237 Binary files /dev/null and b/asset/icon/Icon16/ftp_session_control.png differ diff --git a/asset/icon/Icon16/function.png b/asset/icon/Icon16/function.png new file mode 100644 index 0000000..139641a Binary files /dev/null and b/asset/icon/Icon16/function.png differ diff --git a/asset/icon/Icon16/function_recently_used.png b/asset/icon/Icon16/function_recently_used.png new file mode 100644 index 0000000..0e438c1 Binary files /dev/null and b/asset/icon/Icon16/function_recently_used.png differ diff --git a/asset/icon/Icon16/functions_arrays.png b/asset/icon/Icon16/functions_arrays.png new file mode 100644 index 0000000..5eb36dc Binary files /dev/null and b/asset/icon/Icon16/functions_arrays.png differ diff --git a/asset/icon/Icon16/game_monitor.png b/asset/icon/Icon16/game_monitor.png new file mode 100644 index 0000000..0b3afad Binary files /dev/null and b/asset/icon/Icon16/game_monitor.png differ diff --git a/asset/icon/Icon16/gamespot.png b/asset/icon/Icon16/gamespot.png new file mode 100644 index 0000000..ae63391 Binary files /dev/null and b/asset/icon/Icon16/gamespot.png differ diff --git a/asset/icon/Icon16/gas.png b/asset/icon/Icon16/gas.png new file mode 100644 index 0000000..b3fce1a Binary files /dev/null and b/asset/icon/Icon16/gas.png differ diff --git a/asset/icon/Icon16/gcp.png b/asset/icon/Icon16/gcp.png new file mode 100644 index 0000000..c971649 Binary files /dev/null and b/asset/icon/Icon16/gcp.png differ diff --git a/asset/icon/Icon16/gcp_rms.png b/asset/icon/Icon16/gcp_rms.png new file mode 100644 index 0000000..286a640 Binary files /dev/null and b/asset/icon/Icon16/gcp_rms.png differ diff --git a/asset/icon/Icon16/gear_in.png b/asset/icon/Icon16/gear_in.png new file mode 100644 index 0000000..eaf5df8 Binary files /dev/null and b/asset/icon/Icon16/gear_in.png differ diff --git a/asset/icon/Icon16/generate_ssl_certificate.png b/asset/icon/Icon16/generate_ssl_certificate.png new file mode 100644 index 0000000..892b8f2 Binary files /dev/null and b/asset/icon/Icon16/generate_ssl_certificate.png differ diff --git a/asset/icon/Icon16/gentoo_linux.png b/asset/icon/Icon16/gentoo_linux.png new file mode 100644 index 0000000..bd5a223 Binary files /dev/null and b/asset/icon/Icon16/gentoo_linux.png differ diff --git a/asset/icon/Icon16/geolocation.png b/asset/icon/Icon16/geolocation.png new file mode 100644 index 0000000..f5a18e3 Binary files /dev/null and b/asset/icon/Icon16/geolocation.png differ diff --git a/asset/icon/Icon16/georectify.png b/asset/icon/Icon16/georectify.png new file mode 100644 index 0000000..b482c86 Binary files /dev/null and b/asset/icon/Icon16/georectify.png differ diff --git a/asset/icon/Icon16/geotag.png b/asset/icon/Icon16/geotag.png new file mode 100644 index 0000000..8de9852 Binary files /dev/null and b/asset/icon/Icon16/geotag.png differ diff --git a/asset/icon/Icon16/getting_started_wizard.png b/asset/icon/Icon16/getting_started_wizard.png new file mode 100644 index 0000000..71ba181 Binary files /dev/null and b/asset/icon/Icon16/getting_started_wizard.png differ diff --git a/asset/icon/Icon16/gift_add.png b/asset/icon/Icon16/gift_add.png new file mode 100644 index 0000000..a8ad440 Binary files /dev/null and b/asset/icon/Icon16/gift_add.png differ diff --git a/asset/icon/Icon16/gingerbread_man.png b/asset/icon/Icon16/gingerbread_man.png new file mode 100644 index 0000000..a5febac Binary files /dev/null and b/asset/icon/Icon16/gingerbread_man.png differ diff --git a/asset/icon/Icon16/gingerbread_man_chocolate.png b/asset/icon/Icon16/gingerbread_man_chocolate.png new file mode 100644 index 0000000..b0c1531 Binary files /dev/null and b/asset/icon/Icon16/gingerbread_man_chocolate.png differ diff --git a/asset/icon/Icon16/glass_narrow.png b/asset/icon/Icon16/glass_narrow.png new file mode 100644 index 0000000..ff200e9 Binary files /dev/null and b/asset/icon/Icon16/glass_narrow.png differ diff --git a/asset/icon/Icon16/glass_of_milk.png b/asset/icon/Icon16/glass_of_milk.png new file mode 100644 index 0000000..5e44af4 Binary files /dev/null and b/asset/icon/Icon16/glass_of_milk.png differ diff --git a/asset/icon/Icon16/global_telecom.png b/asset/icon/Icon16/global_telecom.png new file mode 100644 index 0000000..71551d9 Binary files /dev/null and b/asset/icon/Icon16/global_telecom.png differ diff --git a/asset/icon/Icon16/globe_model.png b/asset/icon/Icon16/globe_model.png new file mode 100644 index 0000000..3e2a401 Binary files /dev/null and b/asset/icon/Icon16/globe_model.png differ diff --git a/asset/icon/Icon16/globe_network.png b/asset/icon/Icon16/globe_network.png new file mode 100644 index 0000000..7b19f4a Binary files /dev/null and b/asset/icon/Icon16/globe_network.png differ diff --git a/asset/icon/Icon16/globe_place.png b/asset/icon/Icon16/globe_place.png new file mode 100644 index 0000000..e106ffc Binary files /dev/null and b/asset/icon/Icon16/globe_place.png differ diff --git a/asset/icon/Icon16/gnupg_keys.png b/asset/icon/Icon16/gnupg_keys.png new file mode 100644 index 0000000..3d0a027 Binary files /dev/null and b/asset/icon/Icon16/gnupg_keys.png differ diff --git a/asset/icon/Icon16/google.png b/asset/icon/Icon16/google.png new file mode 100644 index 0000000..f83d734 Binary files /dev/null and b/asset/icon/Icon16/google.png differ diff --git a/asset/icon/Icon16/google_adsense.png b/asset/icon/Icon16/google_adsense.png new file mode 100644 index 0000000..2acf27d Binary files /dev/null and b/asset/icon/Icon16/google_adsense.png differ diff --git a/asset/icon/Icon16/google_custom_search.png b/asset/icon/Icon16/google_custom_search.png new file mode 100644 index 0000000..2c41621 Binary files /dev/null and b/asset/icon/Icon16/google_custom_search.png differ diff --git a/asset/icon/Icon16/google_map.png b/asset/icon/Icon16/google_map.png new file mode 100644 index 0000000..b440e72 Binary files /dev/null and b/asset/icon/Icon16/google_map.png differ diff --git a/asset/icon/Icon16/google_map_satellite.png b/asset/icon/Icon16/google_map_satellite.png new file mode 100644 index 0000000..a6d083a Binary files /dev/null and b/asset/icon/Icon16/google_map_satellite.png differ diff --git a/asset/icon/Icon16/google_new.png b/asset/icon/Icon16/google_new.png new file mode 100644 index 0000000..0f445e5 Binary files /dev/null and b/asset/icon/Icon16/google_new.png differ diff --git a/asset/icon/Icon16/google_plus.png b/asset/icon/Icon16/google_plus.png new file mode 100644 index 0000000..61dfbdb Binary files /dev/null and b/asset/icon/Icon16/google_plus.png differ diff --git a/asset/icon/Icon16/google_talk.png b/asset/icon/Icon16/google_talk.png new file mode 100644 index 0000000..58ba386 Binary files /dev/null and b/asset/icon/Icon16/google_talk.png differ diff --git a/asset/icon/Icon16/google_voice.png b/asset/icon/Icon16/google_voice.png new file mode 100644 index 0000000..6ec93ee Binary files /dev/null and b/asset/icon/Icon16/google_voice.png differ diff --git a/asset/icon/Icon16/google_wave.png b/asset/icon/Icon16/google_wave.png new file mode 100644 index 0000000..9cddffb Binary files /dev/null and b/asset/icon/Icon16/google_wave.png differ diff --git a/asset/icon/Icon16/google_web_elements.png b/asset/icon/Icon16/google_web_elements.png new file mode 100644 index 0000000..9e986f2 Binary files /dev/null and b/asset/icon/Icon16/google_web_elements.png differ diff --git a/asset/icon/Icon16/google_webmaster_tools.png b/asset/icon/Icon16/google_webmaster_tools.png new file mode 100644 index 0000000..0e9a9b2 Binary files /dev/null and b/asset/icon/Icon16/google_webmaster_tools.png differ diff --git a/asset/icon/Icon16/gowalla.png b/asset/icon/Icon16/gowalla.png new file mode 100644 index 0000000..d4693b7 Binary files /dev/null and b/asset/icon/Icon16/gowalla.png differ diff --git a/asset/icon/Icon16/gps_automotive.png b/asset/icon/Icon16/gps_automotive.png new file mode 100644 index 0000000..d293de3 Binary files /dev/null and b/asset/icon/Icon16/gps_automotive.png differ diff --git a/asset/icon/Icon16/gps_handheld.png b/asset/icon/Icon16/gps_handheld.png new file mode 100644 index 0000000..2061506 Binary files /dev/null and b/asset/icon/Icon16/gps_handheld.png differ diff --git a/asset/icon/Icon16/gps_handheld_protect.png b/asset/icon/Icon16/gps_handheld_protect.png new file mode 100644 index 0000000..c587c73 Binary files /dev/null and b/asset/icon/Icon16/gps_handheld_protect.png differ diff --git a/asset/icon/Icon16/grass.png b/asset/icon/Icon16/grass.png new file mode 100644 index 0000000..fa96f6e Binary files /dev/null and b/asset/icon/Icon16/grass.png differ diff --git a/asset/icon/Icon16/green.png b/asset/icon/Icon16/green.png new file mode 100644 index 0000000..4c97a3e Binary files /dev/null and b/asset/icon/Icon16/green.png differ diff --git a/asset/icon/Icon16/green_wormhole.png b/asset/icon/Icon16/green_wormhole.png new file mode 100644 index 0000000..33d6ccd Binary files /dev/null and b/asset/icon/Icon16/green_wormhole.png differ diff --git a/asset/icon/Icon16/green_yellow.png b/asset/icon/Icon16/green_yellow.png new file mode 100644 index 0000000..bc6cc73 Binary files /dev/null and b/asset/icon/Icon16/green_yellow.png differ diff --git a/asset/icon/Icon16/greeting_line.png b/asset/icon/Icon16/greeting_line.png new file mode 100644 index 0000000..e4fb049 Binary files /dev/null and b/asset/icon/Icon16/greeting_line.png differ diff --git a/asset/icon/Icon16/grenade.png b/asset/icon/Icon16/grenade.png new file mode 100644 index 0000000..0c8b249 Binary files /dev/null and b/asset/icon/Icon16/grenade.png differ diff --git a/asset/icon/Icon16/grid.png b/asset/icon/Icon16/grid.png new file mode 100644 index 0000000..1b3ea7e Binary files /dev/null and b/asset/icon/Icon16/grid.png differ diff --git a/asset/icon/Icon16/grooveshark.png b/asset/icon/Icon16/grooveshark.png new file mode 100644 index 0000000..1fcbf8d Binary files /dev/null and b/asset/icon/Icon16/grooveshark.png differ diff --git a/asset/icon/Icon16/group.png b/asset/icon/Icon16/group.png new file mode 100644 index 0000000..247af64 Binary files /dev/null and b/asset/icon/Icon16/group.png differ diff --git a/asset/icon/Icon16/group_add.png b/asset/icon/Icon16/group_add.png new file mode 100644 index 0000000..ad2ad52 Binary files /dev/null and b/asset/icon/Icon16/group_add.png differ diff --git a/asset/icon/Icon16/group_box.png b/asset/icon/Icon16/group_box.png new file mode 100644 index 0000000..69cd4ea Binary files /dev/null and b/asset/icon/Icon16/group_box.png differ diff --git a/asset/icon/Icon16/group_delete.png b/asset/icon/Icon16/group_delete.png new file mode 100644 index 0000000..0e3a9bf Binary files /dev/null and b/asset/icon/Icon16/group_delete.png differ diff --git a/asset/icon/Icon16/group_edit.png b/asset/icon/Icon16/group_edit.png new file mode 100644 index 0000000..755b876 Binary files /dev/null and b/asset/icon/Icon16/group_edit.png differ diff --git a/asset/icon/Icon16/group_error.png b/asset/icon/Icon16/group_error.png new file mode 100644 index 0000000..d0e1071 Binary files /dev/null and b/asset/icon/Icon16/group_error.png differ diff --git a/asset/icon/Icon16/group_gear.png b/asset/icon/Icon16/group_gear.png new file mode 100644 index 0000000..4c54593 Binary files /dev/null and b/asset/icon/Icon16/group_gear.png differ diff --git a/asset/icon/Icon16/group_go.png b/asset/icon/Icon16/group_go.png new file mode 100644 index 0000000..a08dba4 Binary files /dev/null and b/asset/icon/Icon16/group_go.png differ diff --git a/asset/icon/Icon16/group_key.png b/asset/icon/Icon16/group_key.png new file mode 100644 index 0000000..bb44031 Binary files /dev/null and b/asset/icon/Icon16/group_key.png differ diff --git a/asset/icon/Icon16/group_link.png b/asset/icon/Icon16/group_link.png new file mode 100644 index 0000000..bee6281 Binary files /dev/null and b/asset/icon/Icon16/group_link.png differ diff --git a/asset/icon/Icon16/group_stroke.png b/asset/icon/Icon16/group_stroke.png new file mode 100644 index 0000000..ec30268 Binary files /dev/null and b/asset/icon/Icon16/group_stroke.png differ diff --git a/asset/icon/Icon16/gun.png b/asset/icon/Icon16/gun.png new file mode 100644 index 0000000..d82807f Binary files /dev/null and b/asset/icon/Icon16/gun.png differ diff --git a/asset/icon/Icon16/half_moon.png b/asset/icon/Icon16/half_moon.png new file mode 100644 index 0000000..1a9211f Binary files /dev/null and b/asset/icon/Icon16/half_moon.png differ diff --git a/asset/icon/Icon16/hamburger.png b/asset/icon/Icon16/hamburger.png new file mode 100644 index 0000000..88ad775 Binary files /dev/null and b/asset/icon/Icon16/hamburger.png differ diff --git a/asset/icon/Icon16/hammer.png b/asset/icon/Icon16/hammer.png new file mode 100644 index 0000000..06d69a5 Binary files /dev/null and b/asset/icon/Icon16/hammer.png differ diff --git a/asset/icon/Icon16/hand.png b/asset/icon/Icon16/hand.png new file mode 100644 index 0000000..dc79299 Binary files /dev/null and b/asset/icon/Icon16/hand.png differ diff --git a/asset/icon/Icon16/hand_fuck.png b/asset/icon/Icon16/hand_fuck.png new file mode 100644 index 0000000..19549d7 Binary files /dev/null and b/asset/icon/Icon16/hand_fuck.png differ diff --git a/asset/icon/Icon16/hand_ily.png b/asset/icon/Icon16/hand_ily.png new file mode 100644 index 0000000..420e238 Binary files /dev/null and b/asset/icon/Icon16/hand_ily.png differ diff --git a/asset/icon/Icon16/hand_point.png b/asset/icon/Icon16/hand_point.png new file mode 100644 index 0000000..7efc7c6 Binary files /dev/null and b/asset/icon/Icon16/hand_point.png differ diff --git a/asset/icon/Icon16/hand_point_090.png b/asset/icon/Icon16/hand_point_090.png new file mode 100644 index 0000000..8c761f7 Binary files /dev/null and b/asset/icon/Icon16/hand_point_090.png differ diff --git a/asset/icon/Icon16/hand_point_180.png b/asset/icon/Icon16/hand_point_180.png new file mode 100644 index 0000000..cd36a6c Binary files /dev/null and b/asset/icon/Icon16/hand_point_180.png differ diff --git a/asset/icon/Icon16/hand_point_270.png b/asset/icon/Icon16/hand_point_270.png new file mode 100644 index 0000000..c66cf8a Binary files /dev/null and b/asset/icon/Icon16/hand_point_270.png differ diff --git a/asset/icon/Icon16/hand_property.png b/asset/icon/Icon16/hand_property.png new file mode 100644 index 0000000..8941d5c Binary files /dev/null and b/asset/icon/Icon16/hand_property.png differ diff --git a/asset/icon/Icon16/handbag.png b/asset/icon/Icon16/handbag.png new file mode 100644 index 0000000..ac67d8c Binary files /dev/null and b/asset/icon/Icon16/handbag.png differ diff --git a/asset/icon/Icon16/handout_master.png b/asset/icon/Icon16/handout_master.png new file mode 100644 index 0000000..93a93d5 Binary files /dev/null and b/asset/icon/Icon16/handout_master.png differ diff --git a/asset/icon/Icon16/hard_hat_military.png b/asset/icon/Icon16/hard_hat_military.png new file mode 100644 index 0000000..62542b7 Binary files /dev/null and b/asset/icon/Icon16/hard_hat_military.png differ diff --git a/asset/icon/Icon16/hardware_building_oem.png b/asset/icon/Icon16/hardware_building_oem.png new file mode 100644 index 0000000..6dfec70 Binary files /dev/null and b/asset/icon/Icon16/hardware_building_oem.png differ diff --git a/asset/icon/Icon16/hat.png b/asset/icon/Icon16/hat.png new file mode 100644 index 0000000..323994b Binary files /dev/null and b/asset/icon/Icon16/hat.png differ diff --git a/asset/icon/Icon16/hbox.png b/asset/icon/Icon16/hbox.png new file mode 100644 index 0000000..6cfc0ab Binary files /dev/null and b/asset/icon/Icon16/hbox.png differ diff --git a/asset/icon/Icon16/hd_1080.png b/asset/icon/Icon16/hd_1080.png new file mode 100644 index 0000000..e2f656f Binary files /dev/null and b/asset/icon/Icon16/hd_1080.png differ diff --git a/asset/icon/Icon16/hd_720.png b/asset/icon/Icon16/hd_720.png new file mode 100644 index 0000000..6670aba Binary files /dev/null and b/asset/icon/Icon16/hd_720.png differ diff --git a/asset/icon/Icon16/hd_ready.png b/asset/icon/Icon16/hd_ready.png new file mode 100644 index 0000000..68dd42b Binary files /dev/null and b/asset/icon/Icon16/hd_ready.png differ diff --git a/asset/icon/Icon16/hdividedbox.png b/asset/icon/Icon16/hdividedbox.png new file mode 100644 index 0000000..e393292 Binary files /dev/null and b/asset/icon/Icon16/hdividedbox.png differ diff --git a/asset/icon/Icon16/headphone.png b/asset/icon/Icon16/headphone.png new file mode 100644 index 0000000..68d35ed Binary files /dev/null and b/asset/icon/Icon16/headphone.png differ diff --git a/asset/icon/Icon16/headphone_mic.png b/asset/icon/Icon16/headphone_mic.png new file mode 100644 index 0000000..3dd18d8 Binary files /dev/null and b/asset/icon/Icon16/headphone_mic.png differ diff --git a/asset/icon/Icon16/health.png b/asset/icon/Icon16/health.png new file mode 100644 index 0000000..de43e4b Binary files /dev/null and b/asset/icon/Icon16/health.png differ diff --git a/asset/icon/Icon16/heart.png b/asset/icon/Icon16/heart.png new file mode 100644 index 0000000..53e1013 Binary files /dev/null and b/asset/icon/Icon16/heart.png differ diff --git a/asset/icon/Icon16/heart_add.png b/asset/icon/Icon16/heart_add.png new file mode 100644 index 0000000..4efeb6e Binary files /dev/null and b/asset/icon/Icon16/heart_add.png differ diff --git a/asset/icon/Icon16/heart_break.png b/asset/icon/Icon16/heart_break.png new file mode 100644 index 0000000..88bc639 Binary files /dev/null and b/asset/icon/Icon16/heart_break.png differ diff --git a/asset/icon/Icon16/heart_delete.png b/asset/icon/Icon16/heart_delete.png new file mode 100644 index 0000000..692ea6c Binary files /dev/null and b/asset/icon/Icon16/heart_delete.png differ diff --git a/asset/icon/Icon16/heart_empty.png b/asset/icon/Icon16/heart_empty.png new file mode 100644 index 0000000..18ae80d Binary files /dev/null and b/asset/icon/Icon16/heart_empty.png differ diff --git a/asset/icon/Icon16/heart_half.png b/asset/icon/Icon16/heart_half.png new file mode 100644 index 0000000..3386ccd Binary files /dev/null and b/asset/icon/Icon16/heart_half.png differ diff --git a/asset/icon/Icon16/helicopter.png b/asset/icon/Icon16/helicopter.png new file mode 100644 index 0000000..7bbd5c6 Binary files /dev/null and b/asset/icon/Icon16/helicopter.png differ diff --git a/asset/icon/Icon16/helmet.png b/asset/icon/Icon16/helmet.png new file mode 100644 index 0000000..5477809 Binary files /dev/null and b/asset/icon/Icon16/helmet.png differ diff --git a/asset/icon/Icon16/helmet_mine.png b/asset/icon/Icon16/helmet_mine.png new file mode 100644 index 0000000..1758792 Binary files /dev/null and b/asset/icon/Icon16/helmet_mine.png differ diff --git a/asset/icon/Icon16/help.png b/asset/icon/Icon16/help.png new file mode 100644 index 0000000..723c404 Binary files /dev/null and b/asset/icon/Icon16/help.png differ diff --git a/asset/icon/Icon16/hide_detail.png b/asset/icon/Icon16/hide_detail.png new file mode 100644 index 0000000..d8ea80a Binary files /dev/null and b/asset/icon/Icon16/hide_detail.png differ diff --git a/asset/icon/Icon16/hide_slide.png b/asset/icon/Icon16/hide_slide.png new file mode 100644 index 0000000..b200d39 Binary files /dev/null and b/asset/icon/Icon16/hide_slide.png differ diff --git a/asset/icon/Icon16/highlight_merge_fields.png b/asset/icon/Icon16/highlight_merge_fields.png new file mode 100644 index 0000000..1415495 Binary files /dev/null and b/asset/icon/Icon16/highlight_merge_fields.png differ diff --git a/asset/icon/Icon16/highlighter.png b/asset/icon/Icon16/highlighter.png new file mode 100644 index 0000000..8670944 Binary files /dev/null and b/asset/icon/Icon16/highlighter.png differ diff --git a/asset/icon/Icon16/highlighter_text.png b/asset/icon/Icon16/highlighter_text.png new file mode 100644 index 0000000..c23cf0b Binary files /dev/null and b/asset/icon/Icon16/highlighter_text.png differ diff --git a/asset/icon/Icon16/hippocampus.png b/asset/icon/Icon16/hippocampus.png new file mode 100644 index 0000000..c3fd25a Binary files /dev/null and b/asset/icon/Icon16/hippocampus.png differ diff --git a/asset/icon/Icon16/hlocchart.png b/asset/icon/Icon16/hlocchart.png new file mode 100644 index 0000000..ea67052 Binary files /dev/null and b/asset/icon/Icon16/hlocchart.png differ diff --git a/asset/icon/Icon16/holly.png b/asset/icon/Icon16/holly.png new file mode 100644 index 0000000..0a09fe8 Binary files /dev/null and b/asset/icon/Icon16/holly.png differ diff --git a/asset/icon/Icon16/home_page.png b/asset/icon/Icon16/home_page.png new file mode 100644 index 0000000..5b41dc4 Binary files /dev/null and b/asset/icon/Icon16/home_page.png differ diff --git a/asset/icon/Icon16/horizontal_list.png b/asset/icon/Icon16/horizontal_list.png new file mode 100644 index 0000000..ade1f07 Binary files /dev/null and b/asset/icon/Icon16/horizontal_list.png differ diff --git a/asset/icon/Icon16/horn.png b/asset/icon/Icon16/horn.png new file mode 100644 index 0000000..300148c Binary files /dev/null and b/asset/icon/Icon16/horn.png differ diff --git a/asset/icon/Icon16/horoscopes.png b/asset/icon/Icon16/horoscopes.png new file mode 100644 index 0000000..2282f9e Binary files /dev/null and b/asset/icon/Icon16/horoscopes.png differ diff --git a/asset/icon/Icon16/hospital.png b/asset/icon/Icon16/hospital.png new file mode 100644 index 0000000..fb8d63b Binary files /dev/null and b/asset/icon/Icon16/hospital.png differ diff --git a/asset/icon/Icon16/hostname.png b/asset/icon/Icon16/hostname.png new file mode 100644 index 0000000..b074283 Binary files /dev/null and b/asset/icon/Icon16/hostname.png differ diff --git a/asset/icon/Icon16/hot.png b/asset/icon/Icon16/hot.png new file mode 100644 index 0000000..261a7d9 Binary files /dev/null and b/asset/icon/Icon16/hot.png differ diff --git a/asset/icon/Icon16/hotjobs.png b/asset/icon/Icon16/hotjobs.png new file mode 100644 index 0000000..1074443 Binary files /dev/null and b/asset/icon/Icon16/hotjobs.png differ diff --git a/asset/icon/Icon16/hourglass.png b/asset/icon/Icon16/hourglass.png new file mode 100644 index 0000000..26535e5 Binary files /dev/null and b/asset/icon/Icon16/hourglass.png differ diff --git a/asset/icon/Icon16/hourglass_add.png b/asset/icon/Icon16/hourglass_add.png new file mode 100644 index 0000000..ebd43dd Binary files /dev/null and b/asset/icon/Icon16/hourglass_add.png differ diff --git a/asset/icon/Icon16/hourglass_delete.png b/asset/icon/Icon16/hourglass_delete.png new file mode 100644 index 0000000..bf8b182 Binary files /dev/null and b/asset/icon/Icon16/hourglass_delete.png differ diff --git a/asset/icon/Icon16/hourglass_go.png b/asset/icon/Icon16/hourglass_go.png new file mode 100644 index 0000000..6dd49bb Binary files /dev/null and b/asset/icon/Icon16/hourglass_go.png differ diff --git a/asset/icon/Icon16/hourglass_link.png b/asset/icon/Icon16/hourglass_link.png new file mode 100644 index 0000000..559d5da Binary files /dev/null and b/asset/icon/Icon16/hourglass_link.png differ diff --git a/asset/icon/Icon16/house.png b/asset/icon/Icon16/house.png new file mode 100644 index 0000000..da024e5 Binary files /dev/null and b/asset/icon/Icon16/house.png differ diff --git a/asset/icon/Icon16/house_go.png b/asset/icon/Icon16/house_go.png new file mode 100644 index 0000000..0020404 Binary files /dev/null and b/asset/icon/Icon16/house_go.png differ diff --git a/asset/icon/Icon16/house_link.png b/asset/icon/Icon16/house_link.png new file mode 100644 index 0000000..ba4ebd9 Binary files /dev/null and b/asset/icon/Icon16/house_link.png differ diff --git a/asset/icon/Icon16/house_one.png b/asset/icon/Icon16/house_one.png new file mode 100644 index 0000000..55c7680 Binary files /dev/null and b/asset/icon/Icon16/house_one.png differ diff --git a/asset/icon/Icon16/house_two.png b/asset/icon/Icon16/house_two.png new file mode 100644 index 0000000..9723cf0 Binary files /dev/null and b/asset/icon/Icon16/house_two.png differ diff --git a/asset/icon/Icon16/hrule.png b/asset/icon/Icon16/hrule.png new file mode 100644 index 0000000..7f31e38 Binary files /dev/null and b/asset/icon/Icon16/hrule.png differ diff --git a/asset/icon/Icon16/hslider.png b/asset/icon/Icon16/hslider.png new file mode 100644 index 0000000..c899f9c Binary files /dev/null and b/asset/icon/Icon16/hslider.png differ diff --git a/asset/icon/Icon16/html.png b/asset/icon/Icon16/html.png new file mode 100644 index 0000000..98cff2a Binary files /dev/null and b/asset/icon/Icon16/html.png differ diff --git a/asset/icon/Icon16/html_5.png b/asset/icon/Icon16/html_5.png new file mode 100644 index 0000000..13da0c6 Binary files /dev/null and b/asset/icon/Icon16/html_5.png differ diff --git a/asset/icon/Icon16/html_add.png b/asset/icon/Icon16/html_add.png new file mode 100644 index 0000000..b0084d7 Binary files /dev/null and b/asset/icon/Icon16/html_add.png differ diff --git a/asset/icon/Icon16/html_delete.png b/asset/icon/Icon16/html_delete.png new file mode 100644 index 0000000..a59350d Binary files /dev/null and b/asset/icon/Icon16/html_delete.png differ diff --git a/asset/icon/Icon16/html_go.png b/asset/icon/Icon16/html_go.png new file mode 100644 index 0000000..e940777 Binary files /dev/null and b/asset/icon/Icon16/html_go.png differ diff --git a/asset/icon/Icon16/html_valid.png b/asset/icon/Icon16/html_valid.png new file mode 100644 index 0000000..dd1fa7a Binary files /dev/null and b/asset/icon/Icon16/html_valid.png differ diff --git a/asset/icon/Icon16/http_server_apache.png b/asset/icon/Icon16/http_server_apache.png new file mode 100644 index 0000000..4dea1f7 Binary files /dev/null and b/asset/icon/Icon16/http_server_apache.png differ diff --git a/asset/icon/Icon16/http_status_not_found.png b/asset/icon/Icon16/http_status_not_found.png new file mode 100644 index 0000000..6b37dba Binary files /dev/null and b/asset/icon/Icon16/http_status_not_found.png differ diff --git a/asset/icon/Icon16/http_status_ok_success.png b/asset/icon/Icon16/http_status_ok_success.png new file mode 100644 index 0000000..86bbba8 Binary files /dev/null and b/asset/icon/Icon16/http_status_ok_success.png differ diff --git a/asset/icon/Icon16/http_status_permanent.png b/asset/icon/Icon16/http_status_permanent.png new file mode 100644 index 0000000..10db5e4 Binary files /dev/null and b/asset/icon/Icon16/http_status_permanent.png differ diff --git a/asset/icon/Icon16/http_status_server_error.png b/asset/icon/Icon16/http_status_server_error.png new file mode 100644 index 0000000..e4876f7 Binary files /dev/null and b/asset/icon/Icon16/http_status_server_error.png differ diff --git a/asset/icon/Icon16/http_status_temporary.png b/asset/icon/Icon16/http_status_temporary.png new file mode 100644 index 0000000..d973b37 Binary files /dev/null and b/asset/icon/Icon16/http_status_temporary.png differ diff --git a/asset/icon/Icon16/http_status_unavailable.png b/asset/icon/Icon16/http_status_unavailable.png new file mode 100644 index 0000000..123979a Binary files /dev/null and b/asset/icon/Icon16/http_status_unavailable.png differ diff --git a/asset/icon/Icon16/hummingbird.png b/asset/icon/Icon16/hummingbird.png new file mode 100644 index 0000000..e266dbf Binary files /dev/null and b/asset/icon/Icon16/hummingbird.png differ diff --git a/asset/icon/Icon16/ice_cube.png b/asset/icon/Icon16/ice_cube.png new file mode 100644 index 0000000..6fdbb03 Binary files /dev/null and b/asset/icon/Icon16/ice_cube.png differ diff --git a/asset/icon/Icon16/icecream.png b/asset/icon/Icon16/icecream.png new file mode 100644 index 0000000..7bab478 Binary files /dev/null and b/asset/icon/Icon16/icecream.png differ diff --git a/asset/icon/Icon16/ilike.png b/asset/icon/Icon16/ilike.png new file mode 100644 index 0000000..a7fffd7 Binary files /dev/null and b/asset/icon/Icon16/ilike.png differ diff --git a/asset/icon/Icon16/im_messenger.png b/asset/icon/Icon16/im_messenger.png new file mode 100644 index 0000000..8a373c8 Binary files /dev/null and b/asset/icon/Icon16/im_messenger.png differ diff --git a/asset/icon/Icon16/image.png b/asset/icon/Icon16/image.png new file mode 100644 index 0000000..032e177 Binary files /dev/null and b/asset/icon/Icon16/image.png differ diff --git a/asset/icon/Icon16/image_add.png b/asset/icon/Icon16/image_add.png new file mode 100644 index 0000000..224d294 Binary files /dev/null and b/asset/icon/Icon16/image_add.png differ diff --git a/asset/icon/Icon16/image_delete.png b/asset/icon/Icon16/image_delete.png new file mode 100644 index 0000000..ce1895b Binary files /dev/null and b/asset/icon/Icon16/image_delete.png differ diff --git a/asset/icon/Icon16/image_edit.png b/asset/icon/Icon16/image_edit.png new file mode 100644 index 0000000..46e44c8 Binary files /dev/null and b/asset/icon/Icon16/image_edit.png differ diff --git a/asset/icon/Icon16/image_link.png b/asset/icon/Icon16/image_link.png new file mode 100644 index 0000000..12552a6 Binary files /dev/null and b/asset/icon/Icon16/image_link.png differ diff --git a/asset/icon/Icon16/images.png b/asset/icon/Icon16/images.png new file mode 100644 index 0000000..cca9668 Binary files /dev/null and b/asset/icon/Icon16/images.png differ diff --git a/asset/icon/Icon16/images_flickr.png b/asset/icon/Icon16/images_flickr.png new file mode 100644 index 0000000..0e2f0e9 Binary files /dev/null and b/asset/icon/Icon16/images_flickr.png differ diff --git a/asset/icon/Icon16/imap_server.png b/asset/icon/Icon16/imap_server.png new file mode 100644 index 0000000..100f9eb Binary files /dev/null and b/asset/icon/Icon16/imap_server.png differ diff --git a/asset/icon/Icon16/import_email_accounts.png b/asset/icon/Icon16/import_email_accounts.png new file mode 100644 index 0000000..66bca45 Binary files /dev/null and b/asset/icon/Icon16/import_email_accounts.png differ diff --git a/asset/icon/Icon16/inbox_document.png b/asset/icon/Icon16/inbox_document.png new file mode 100644 index 0000000..8e4be39 Binary files /dev/null and b/asset/icon/Icon16/inbox_document.png differ diff --git a/asset/icon/Icon16/inbox_document_music.png b/asset/icon/Icon16/inbox_document_music.png new file mode 100644 index 0000000..92eb3dc Binary files /dev/null and b/asset/icon/Icon16/inbox_document_music.png differ diff --git a/asset/icon/Icon16/inbox_document_text.png b/asset/icon/Icon16/inbox_document_text.png new file mode 100644 index 0000000..74df20d Binary files /dev/null and b/asset/icon/Icon16/inbox_document_text.png differ diff --git a/asset/icon/Icon16/inbox_download.png b/asset/icon/Icon16/inbox_download.png new file mode 100644 index 0000000..4a72f05 Binary files /dev/null and b/asset/icon/Icon16/inbox_download.png differ diff --git a/asset/icon/Icon16/inbox_empty.png b/asset/icon/Icon16/inbox_empty.png new file mode 100644 index 0000000..9b7cd0a Binary files /dev/null and b/asset/icon/Icon16/inbox_empty.png differ diff --git a/asset/icon/Icon16/inbox_film.png b/asset/icon/Icon16/inbox_film.png new file mode 100644 index 0000000..11b6375 Binary files /dev/null and b/asset/icon/Icon16/inbox_film.png differ diff --git a/asset/icon/Icon16/inbox_images.png b/asset/icon/Icon16/inbox_images.png new file mode 100644 index 0000000..ef9b49a Binary files /dev/null and b/asset/icon/Icon16/inbox_images.png differ diff --git a/asset/icon/Icon16/inbox_slide.png b/asset/icon/Icon16/inbox_slide.png new file mode 100644 index 0000000..c10daeb Binary files /dev/null and b/asset/icon/Icon16/inbox_slide.png differ diff --git a/asset/icon/Icon16/inbox_table.png b/asset/icon/Icon16/inbox_table.png new file mode 100644 index 0000000..3c46e79 Binary files /dev/null and b/asset/icon/Icon16/inbox_table.png differ diff --git a/asset/icon/Icon16/inbox_upload.png b/asset/icon/Icon16/inbox_upload.png new file mode 100644 index 0000000..0d6c2ac Binary files /dev/null and b/asset/icon/Icon16/inbox_upload.png differ diff --git a/asset/icon/Icon16/index_manager.png b/asset/icon/Icon16/index_manager.png new file mode 100644 index 0000000..e096f4e Binary files /dev/null and b/asset/icon/Icon16/index_manager.png differ diff --git a/asset/icon/Icon16/info_rhombus.png b/asset/icon/Icon16/info_rhombus.png new file mode 100644 index 0000000..54f8075 Binary files /dev/null and b/asset/icon/Icon16/info_rhombus.png differ diff --git a/asset/icon/Icon16/infocard.png b/asset/icon/Icon16/infocard.png new file mode 100644 index 0000000..fd41d9d Binary files /dev/null and b/asset/icon/Icon16/infocard.png differ diff --git a/asset/icon/Icon16/information.png b/asset/icon/Icon16/information.png new file mode 100644 index 0000000..85c1876 Binary files /dev/null and b/asset/icon/Icon16/information.png differ diff --git a/asset/icon/Icon16/injection.png b/asset/icon/Icon16/injection.png new file mode 100644 index 0000000..0e0d7cc Binary files /dev/null and b/asset/icon/Icon16/injection.png differ diff --git a/asset/icon/Icon16/insert_caption.png b/asset/icon/Icon16/insert_caption.png new file mode 100644 index 0000000..5a8bbb8 Binary files /dev/null and b/asset/icon/Icon16/insert_caption.png differ diff --git a/asset/icon/Icon16/insert_citation.png b/asset/icon/Icon16/insert_citation.png new file mode 100644 index 0000000..66ac548 Binary files /dev/null and b/asset/icon/Icon16/insert_citation.png differ diff --git a/asset/icon/Icon16/insert_element.png b/asset/icon/Icon16/insert_element.png new file mode 100644 index 0000000..e9d4791 Binary files /dev/null and b/asset/icon/Icon16/insert_element.png differ diff --git a/asset/icon/Icon16/insert_endnote.png b/asset/icon/Icon16/insert_endnote.png new file mode 100644 index 0000000..d04fe55 Binary files /dev/null and b/asset/icon/Icon16/insert_endnote.png differ diff --git a/asset/icon/Icon16/insert_footnote.png b/asset/icon/Icon16/insert_footnote.png new file mode 100644 index 0000000..79581b7 Binary files /dev/null and b/asset/icon/Icon16/insert_footnote.png differ diff --git a/asset/icon/Icon16/insert_merge_field.png b/asset/icon/Icon16/insert_merge_field.png new file mode 100644 index 0000000..8dd2f21 Binary files /dev/null and b/asset/icon/Icon16/insert_merge_field.png differ diff --git a/asset/icon/Icon16/insert_object.png b/asset/icon/Icon16/insert_object.png new file mode 100644 index 0000000..a04b92b Binary files /dev/null and b/asset/icon/Icon16/insert_object.png differ diff --git a/asset/icon/Icon16/insert_table_for_analysis.png b/asset/icon/Icon16/insert_table_for_analysis.png new file mode 100644 index 0000000..3675c67 Binary files /dev/null and b/asset/icon/Icon16/insert_table_for_analysis.png differ diff --git a/asset/icon/Icon16/insert_table_of_authorities.png b/asset/icon/Icon16/insert_table_of_authorities.png new file mode 100644 index 0000000..5e94694 Binary files /dev/null and b/asset/icon/Icon16/insert_table_of_authorities.png differ diff --git a/asset/icon/Icon16/insert_text.png b/asset/icon/Icon16/insert_text.png new file mode 100644 index 0000000..71bf668 Binary files /dev/null and b/asset/icon/Icon16/insert_text.png differ diff --git a/asset/icon/Icon16/install_frontpage_extensions.png b/asset/icon/Icon16/install_frontpage_extensions.png new file mode 100644 index 0000000..6f4add8 Binary files /dev/null and b/asset/icon/Icon16/install_frontpage_extensions.png differ diff --git a/asset/icon/Icon16/install_frontpage_mail_extensions.png b/asset/icon/Icon16/install_frontpage_mail_extensions.png new file mode 100644 index 0000000..4d79510 Binary files /dev/null and b/asset/icon/Icon16/install_frontpage_mail_extensions.png differ diff --git a/asset/icon/Icon16/install_ssl_certificate.png b/asset/icon/Icon16/install_ssl_certificate.png new file mode 100644 index 0000000..eedd02d Binary files /dev/null and b/asset/icon/Icon16/install_ssl_certificate.png differ diff --git a/asset/icon/Icon16/installer_box.png b/asset/icon/Icon16/installer_box.png new file mode 100644 index 0000000..6b11859 Binary files /dev/null and b/asset/icon/Icon16/installer_box.png differ diff --git a/asset/icon/Icon16/interface_preferences.png b/asset/icon/Icon16/interface_preferences.png new file mode 100644 index 0000000..305e2ca Binary files /dev/null and b/asset/icon/Icon16/interface_preferences.png differ diff --git a/asset/icon/Icon16/internet_explorer.png b/asset/icon/Icon16/internet_explorer.png new file mode 100644 index 0000000..7dd5c45 Binary files /dev/null and b/asset/icon/Icon16/internet_explorer.png differ diff --git a/asset/icon/Icon16/investment_menu_quality.png b/asset/icon/Icon16/investment_menu_quality.png new file mode 100644 index 0000000..dc92b45 Binary files /dev/null and b/asset/icon/Icon16/investment_menu_quality.png differ diff --git a/asset/icon/Icon16/ip.png b/asset/icon/Icon16/ip.png new file mode 100644 index 0000000..72aafe4 Binary files /dev/null and b/asset/icon/Icon16/ip.png differ diff --git a/asset/icon/Icon16/ip_block.png b/asset/icon/Icon16/ip_block.png new file mode 100644 index 0000000..5467ecd Binary files /dev/null and b/asset/icon/Icon16/ip_block.png differ diff --git a/asset/icon/Icon16/ip_class.png b/asset/icon/Icon16/ip_class.png new file mode 100644 index 0000000..b04ec48 Binary files /dev/null and b/asset/icon/Icon16/ip_class.png differ diff --git a/asset/icon/Icon16/ip_telephone.png b/asset/icon/Icon16/ip_telephone.png new file mode 100644 index 0000000..c6b6123 Binary files /dev/null and b/asset/icon/Icon16/ip_telephone.png differ diff --git a/asset/icon/Icon16/ipad.png b/asset/icon/Icon16/ipad.png new file mode 100644 index 0000000..e751117 Binary files /dev/null and b/asset/icon/Icon16/ipad.png differ diff --git a/asset/icon/Icon16/ipad_protect.png b/asset/icon/Icon16/ipad_protect.png new file mode 100644 index 0000000..ec6946d Binary files /dev/null and b/asset/icon/Icon16/ipad_protect.png differ diff --git a/asset/icon/Icon16/iphone.png b/asset/icon/Icon16/iphone.png new file mode 100644 index 0000000..0b4db6f Binary files /dev/null and b/asset/icon/Icon16/iphone.png differ diff --git a/asset/icon/Icon16/iphone_protect.png b/asset/icon/Icon16/iphone_protect.png new file mode 100644 index 0000000..ad5027f Binary files /dev/null and b/asset/icon/Icon16/iphone_protect.png differ diff --git a/asset/icon/Icon16/ipod.png b/asset/icon/Icon16/ipod.png new file mode 100644 index 0000000..f458af9 Binary files /dev/null and b/asset/icon/Icon16/ipod.png differ diff --git a/asset/icon/Icon16/ipod_cast.png b/asset/icon/Icon16/ipod_cast.png new file mode 100644 index 0000000..ea1dd9f Binary files /dev/null and b/asset/icon/Icon16/ipod_cast.png differ diff --git a/asset/icon/Icon16/ipod_cast_add.png b/asset/icon/Icon16/ipod_cast_add.png new file mode 100644 index 0000000..1d8b4c9 Binary files /dev/null and b/asset/icon/Icon16/ipod_cast_add.png differ diff --git a/asset/icon/Icon16/ipod_cast_delete.png b/asset/icon/Icon16/ipod_cast_delete.png new file mode 100644 index 0000000..f6e88c9 Binary files /dev/null and b/asset/icon/Icon16/ipod_cast_delete.png differ diff --git a/asset/icon/Icon16/ipod_sound.png b/asset/icon/Icon16/ipod_sound.png new file mode 100644 index 0000000..50eb2af Binary files /dev/null and b/asset/icon/Icon16/ipod_sound.png differ diff --git a/asset/icon/Icon16/italy.png b/asset/icon/Icon16/italy.png new file mode 100644 index 0000000..2183567 Binary files /dev/null and b/asset/icon/Icon16/italy.png differ diff --git a/asset/icon/Icon16/jacket.png b/asset/icon/Icon16/jacket.png new file mode 100644 index 0000000..2eb55c4 Binary files /dev/null and b/asset/icon/Icon16/jacket.png differ diff --git a/asset/icon/Icon16/jar_empty.png b/asset/icon/Icon16/jar_empty.png new file mode 100644 index 0000000..8662344 Binary files /dev/null and b/asset/icon/Icon16/jar_empty.png differ diff --git a/asset/icon/Icon16/jar_open.png b/asset/icon/Icon16/jar_open.png new file mode 100644 index 0000000..c71d06b Binary files /dev/null and b/asset/icon/Icon16/jar_open.png differ diff --git a/asset/icon/Icon16/jason_mask.png b/asset/icon/Icon16/jason_mask.png new file mode 100644 index 0000000..b12f99d Binary files /dev/null and b/asset/icon/Icon16/jason_mask.png differ diff --git a/asset/icon/Icon16/jeans.png b/asset/icon/Icon16/jeans.png new file mode 100644 index 0000000..a20c845 Binary files /dev/null and b/asset/icon/Icon16/jeans.png differ diff --git a/asset/icon/Icon16/joystick.png b/asset/icon/Icon16/joystick.png new file mode 100644 index 0000000..ee165ef Binary files /dev/null and b/asset/icon/Icon16/joystick.png differ diff --git a/asset/icon/Icon16/joystick_add.png b/asset/icon/Icon16/joystick_add.png new file mode 100644 index 0000000..a722111 Binary files /dev/null and b/asset/icon/Icon16/joystick_add.png differ diff --git a/asset/icon/Icon16/joystick_delete.png b/asset/icon/Icon16/joystick_delete.png new file mode 100644 index 0000000..e276ceb Binary files /dev/null and b/asset/icon/Icon16/joystick_delete.png differ diff --git a/asset/icon/Icon16/joystick_error.png b/asset/icon/Icon16/joystick_error.png new file mode 100644 index 0000000..2e87cad Binary files /dev/null and b/asset/icon/Icon16/joystick_error.png differ diff --git a/asset/icon/Icon16/json.png b/asset/icon/Icon16/json.png new file mode 100644 index 0000000..476c73f Binary files /dev/null and b/asset/icon/Icon16/json.png differ diff --git a/asset/icon/Icon16/key.png b/asset/icon/Icon16/key.png new file mode 100644 index 0000000..b6ad1af Binary files /dev/null and b/asset/icon/Icon16/key.png differ diff --git a/asset/icon/Icon16/key_a.png b/asset/icon/Icon16/key_a.png new file mode 100644 index 0000000..6f4dc1b Binary files /dev/null and b/asset/icon/Icon16/key_a.png differ diff --git a/asset/icon/Icon16/key_add.png b/asset/icon/Icon16/key_add.png new file mode 100644 index 0000000..a30194b Binary files /dev/null and b/asset/icon/Icon16/key_add.png differ diff --git a/asset/icon/Icon16/key_b.png b/asset/icon/Icon16/key_b.png new file mode 100644 index 0000000..70001ae Binary files /dev/null and b/asset/icon/Icon16/key_b.png differ diff --git a/asset/icon/Icon16/key_c.png b/asset/icon/Icon16/key_c.png new file mode 100644 index 0000000..34b653f Binary files /dev/null and b/asset/icon/Icon16/key_c.png differ diff --git a/asset/icon/Icon16/key_d.png b/asset/icon/Icon16/key_d.png new file mode 100644 index 0000000..76066ae Binary files /dev/null and b/asset/icon/Icon16/key_d.png differ diff --git a/asset/icon/Icon16/key_delete.png b/asset/icon/Icon16/key_delete.png new file mode 100644 index 0000000..d69bf1e Binary files /dev/null and b/asset/icon/Icon16/key_delete.png differ diff --git a/asset/icon/Icon16/key_e.png b/asset/icon/Icon16/key_e.png new file mode 100644 index 0000000..3b034f5 Binary files /dev/null and b/asset/icon/Icon16/key_e.png differ diff --git a/asset/icon/Icon16/key_escape.png b/asset/icon/Icon16/key_escape.png new file mode 100644 index 0000000..de071d7 Binary files /dev/null and b/asset/icon/Icon16/key_escape.png differ diff --git a/asset/icon/Icon16/key_f.png b/asset/icon/Icon16/key_f.png new file mode 100644 index 0000000..72f3a52 Binary files /dev/null and b/asset/icon/Icon16/key_f.png differ diff --git a/asset/icon/Icon16/key_g.png b/asset/icon/Icon16/key_g.png new file mode 100644 index 0000000..6f157d0 Binary files /dev/null and b/asset/icon/Icon16/key_g.png differ diff --git a/asset/icon/Icon16/key_go.png b/asset/icon/Icon16/key_go.png new file mode 100644 index 0000000..de01047 Binary files /dev/null and b/asset/icon/Icon16/key_go.png differ diff --git a/asset/icon/Icon16/key_h.png b/asset/icon/Icon16/key_h.png new file mode 100644 index 0000000..42a973c Binary files /dev/null and b/asset/icon/Icon16/key_h.png differ diff --git a/asset/icon/Icon16/key_i.png b/asset/icon/Icon16/key_i.png new file mode 100644 index 0000000..84c21f6 Binary files /dev/null and b/asset/icon/Icon16/key_i.png differ diff --git a/asset/icon/Icon16/key_j.png b/asset/icon/Icon16/key_j.png new file mode 100644 index 0000000..e1188a5 Binary files /dev/null and b/asset/icon/Icon16/key_j.png differ diff --git a/asset/icon/Icon16/key_k.png b/asset/icon/Icon16/key_k.png new file mode 100644 index 0000000..f4708b8 Binary files /dev/null and b/asset/icon/Icon16/key_k.png differ diff --git a/asset/icon/Icon16/key_l.png b/asset/icon/Icon16/key_l.png new file mode 100644 index 0000000..72911ea Binary files /dev/null and b/asset/icon/Icon16/key_l.png differ diff --git a/asset/icon/Icon16/key_m.png b/asset/icon/Icon16/key_m.png new file mode 100644 index 0000000..5948edf Binary files /dev/null and b/asset/icon/Icon16/key_m.png differ diff --git a/asset/icon/Icon16/key_n.png b/asset/icon/Icon16/key_n.png new file mode 100644 index 0000000..608a3b4 Binary files /dev/null and b/asset/icon/Icon16/key_n.png differ diff --git a/asset/icon/Icon16/key_o.png b/asset/icon/Icon16/key_o.png new file mode 100644 index 0000000..4b9e9dc Binary files /dev/null and b/asset/icon/Icon16/key_o.png differ diff --git a/asset/icon/Icon16/key_p.png b/asset/icon/Icon16/key_p.png new file mode 100644 index 0000000..c758826 Binary files /dev/null and b/asset/icon/Icon16/key_p.png differ diff --git a/asset/icon/Icon16/key_q.png b/asset/icon/Icon16/key_q.png new file mode 100644 index 0000000..ea391fe Binary files /dev/null and b/asset/icon/Icon16/key_q.png differ diff --git a/asset/icon/Icon16/key_r.png b/asset/icon/Icon16/key_r.png new file mode 100644 index 0000000..823c3ad Binary files /dev/null and b/asset/icon/Icon16/key_r.png differ diff --git a/asset/icon/Icon16/key_s.png b/asset/icon/Icon16/key_s.png new file mode 100644 index 0000000..b391b72 Binary files /dev/null and b/asset/icon/Icon16/key_s.png differ diff --git a/asset/icon/Icon16/key_solid.png b/asset/icon/Icon16/key_solid.png new file mode 100644 index 0000000..1d7fe7d Binary files /dev/null and b/asset/icon/Icon16/key_solid.png differ diff --git a/asset/icon/Icon16/key_t.png b/asset/icon/Icon16/key_t.png new file mode 100644 index 0000000..94873f9 Binary files /dev/null and b/asset/icon/Icon16/key_t.png differ diff --git a/asset/icon/Icon16/key_u.png b/asset/icon/Icon16/key_u.png new file mode 100644 index 0000000..da20e32 Binary files /dev/null and b/asset/icon/Icon16/key_u.png differ diff --git a/asset/icon/Icon16/key_v.png b/asset/icon/Icon16/key_v.png new file mode 100644 index 0000000..32cbb36 Binary files /dev/null and b/asset/icon/Icon16/key_v.png differ diff --git a/asset/icon/Icon16/key_w.png b/asset/icon/Icon16/key_w.png new file mode 100644 index 0000000..a3f4f1c Binary files /dev/null and b/asset/icon/Icon16/key_w.png differ diff --git a/asset/icon/Icon16/key_x.png b/asset/icon/Icon16/key_x.png new file mode 100644 index 0000000..54dacad Binary files /dev/null and b/asset/icon/Icon16/key_x.png differ diff --git a/asset/icon/Icon16/key_y.png b/asset/icon/Icon16/key_y.png new file mode 100644 index 0000000..ab90ae3 Binary files /dev/null and b/asset/icon/Icon16/key_y.png differ diff --git a/asset/icon/Icon16/key_z.png b/asset/icon/Icon16/key_z.png new file mode 100644 index 0000000..b5341ea Binary files /dev/null and b/asset/icon/Icon16/key_z.png differ diff --git a/asset/icon/Icon16/keyboard.png b/asset/icon/Icon16/keyboard.png new file mode 100644 index 0000000..7714d47 Binary files /dev/null and b/asset/icon/Icon16/keyboard.png differ diff --git a/asset/icon/Icon16/keyboard_add.png b/asset/icon/Icon16/keyboard_add.png new file mode 100644 index 0000000..52db69f Binary files /dev/null and b/asset/icon/Icon16/keyboard_add.png differ diff --git a/asset/icon/Icon16/keyboard_delete.png b/asset/icon/Icon16/keyboard_delete.png new file mode 100644 index 0000000..207f422 Binary files /dev/null and b/asset/icon/Icon16/keyboard_delete.png differ diff --git a/asset/icon/Icon16/keyboard_magnify.png b/asset/icon/Icon16/keyboard_magnify.png new file mode 100644 index 0000000..a4365c8 Binary files /dev/null and b/asset/icon/Icon16/keyboard_magnify.png differ diff --git a/asset/icon/Icon16/kids.png b/asset/icon/Icon16/kids.png new file mode 100644 index 0000000..fdbb9d5 Binary files /dev/null and b/asset/icon/Icon16/kids.png differ diff --git a/asset/icon/Icon16/knot.png b/asset/icon/Icon16/knot.png new file mode 100644 index 0000000..fecdb13 Binary files /dev/null and b/asset/icon/Icon16/knot.png differ diff --git a/asset/icon/Icon16/label.png b/asset/icon/Icon16/label.png new file mode 100644 index 0000000..a95fc76 Binary files /dev/null and b/asset/icon/Icon16/label.png differ diff --git a/asset/icon/Icon16/label_link.png b/asset/icon/Icon16/label_link.png new file mode 100644 index 0000000..4b47e4a Binary files /dev/null and b/asset/icon/Icon16/label_link.png differ diff --git a/asset/icon/Icon16/labels(2).png b/asset/icon/Icon16/labels(2).png new file mode 100644 index 0000000..61173f8 Binary files /dev/null and b/asset/icon/Icon16/labels(2).png differ diff --git a/asset/icon/Icon16/labels.png b/asset/icon/Icon16/labels.png new file mode 100644 index 0000000..67579a3 Binary files /dev/null and b/asset/icon/Icon16/labels.png differ diff --git a/asset/icon/Icon16/ladybird.png b/asset/icon/Icon16/ladybird.png new file mode 100644 index 0000000..b1d0e1b Binary files /dev/null and b/asset/icon/Icon16/ladybird.png differ diff --git a/asset/icon/Icon16/landmarks.png b/asset/icon/Icon16/landmarks.png new file mode 100644 index 0000000..0467ed6 Binary files /dev/null and b/asset/icon/Icon16/landmarks.png differ diff --git a/asset/icon/Icon16/languange.png b/asset/icon/Icon16/languange.png new file mode 100644 index 0000000..9fac49c Binary files /dev/null and b/asset/icon/Icon16/languange.png differ diff --git a/asset/icon/Icon16/laptop.png b/asset/icon/Icon16/laptop.png new file mode 100644 index 0000000..ecf560e Binary files /dev/null and b/asset/icon/Icon16/laptop.png differ diff --git a/asset/icon/Icon16/large_tiles.png b/asset/icon/Icon16/large_tiles.png new file mode 100644 index 0000000..974079e Binary files /dev/null and b/asset/icon/Icon16/large_tiles.png differ diff --git a/asset/icon/Icon16/last_fm.png b/asset/icon/Icon16/last_fm.png new file mode 100644 index 0000000..793f833 Binary files /dev/null and b/asset/icon/Icon16/last_fm.png differ diff --git a/asset/icon/Icon16/latest_visitors.png b/asset/icon/Icon16/latest_visitors.png new file mode 100644 index 0000000..fcbf2f0 Binary files /dev/null and b/asset/icon/Icon16/latest_visitors.png differ diff --git a/asset/icon/Icon16/layer.png b/asset/icon/Icon16/layer.png new file mode 100644 index 0000000..38744ad Binary files /dev/null and b/asset/icon/Icon16/layer.png differ diff --git a/asset/icon/Icon16/layer_add.png b/asset/icon/Icon16/layer_add.png new file mode 100644 index 0000000..754bab4 Binary files /dev/null and b/asset/icon/Icon16/layer_add.png differ diff --git a/asset/icon/Icon16/layer_arrange.png b/asset/icon/Icon16/layer_arrange.png new file mode 100644 index 0000000..25c6ca2 Binary files /dev/null and b/asset/icon/Icon16/layer_arrange.png differ diff --git a/asset/icon/Icon16/layer_arrange_back.png b/asset/icon/Icon16/layer_arrange_back.png new file mode 100644 index 0000000..075c2e8 Binary files /dev/null and b/asset/icon/Icon16/layer_arrange_back.png differ diff --git a/asset/icon/Icon16/layer_aspect_arrow.png b/asset/icon/Icon16/layer_aspect_arrow.png new file mode 100644 index 0000000..a76a972 Binary files /dev/null and b/asset/icon/Icon16/layer_aspect_arrow.png differ diff --git a/asset/icon/Icon16/layer_cell_cats.png b/asset/icon/Icon16/layer_cell_cats.png new file mode 100644 index 0000000..ad307bc Binary files /dev/null and b/asset/icon/Icon16/layer_cell_cats.png differ diff --git a/asset/icon/Icon16/layer_chart.png b/asset/icon/Icon16/layer_chart.png new file mode 100644 index 0000000..e7ac70d Binary files /dev/null and b/asset/icon/Icon16/layer_chart.png differ diff --git a/asset/icon/Icon16/layer_command.png b/asset/icon/Icon16/layer_command.png new file mode 100644 index 0000000..34ffc08 Binary files /dev/null and b/asset/icon/Icon16/layer_command.png differ diff --git a/asset/icon/Icon16/layer_create.png b/asset/icon/Icon16/layer_create.png new file mode 100644 index 0000000..62a19b6 Binary files /dev/null and b/asset/icon/Icon16/layer_create.png differ diff --git a/asset/icon/Icon16/layer_database.png b/asset/icon/Icon16/layer_database.png new file mode 100644 index 0000000..511c056 Binary files /dev/null and b/asset/icon/Icon16/layer_database.png differ diff --git a/asset/icon/Icon16/layer_delete.png b/asset/icon/Icon16/layer_delete.png new file mode 100644 index 0000000..417d356 Binary files /dev/null and b/asset/icon/Icon16/layer_delete.png differ diff --git a/asset/icon/Icon16/layer_edit.png b/asset/icon/Icon16/layer_edit.png new file mode 100644 index 0000000..42b0c39 Binary files /dev/null and b/asset/icon/Icon16/layer_edit.png differ diff --git a/asset/icon/Icon16/layer_export.png b/asset/icon/Icon16/layer_export.png new file mode 100644 index 0000000..df5bdfd Binary files /dev/null and b/asset/icon/Icon16/layer_export.png differ diff --git a/asset/icon/Icon16/layer_gps.png b/asset/icon/Icon16/layer_gps.png new file mode 100644 index 0000000..7bd8e7d Binary files /dev/null and b/asset/icon/Icon16/layer_gps.png differ diff --git a/asset/icon/Icon16/layer_grid.png b/asset/icon/Icon16/layer_grid.png new file mode 100644 index 0000000..71c34af Binary files /dev/null and b/asset/icon/Icon16/layer_grid.png differ diff --git a/asset/icon/Icon16/layer_group.png b/asset/icon/Icon16/layer_group.png new file mode 100644 index 0000000..2166425 Binary files /dev/null and b/asset/icon/Icon16/layer_group.png differ diff --git a/asset/icon/Icon16/layer_his.png b/asset/icon/Icon16/layer_his.png new file mode 100644 index 0000000..b8b136f Binary files /dev/null and b/asset/icon/Icon16/layer_his.png differ diff --git a/asset/icon/Icon16/layer_histogram.png b/asset/icon/Icon16/layer_histogram.png new file mode 100644 index 0000000..0f145d4 Binary files /dev/null and b/asset/icon/Icon16/layer_histogram.png differ diff --git a/asset/icon/Icon16/layer_import.png b/asset/icon/Icon16/layer_import.png new file mode 100644 index 0000000..78521c5 Binary files /dev/null and b/asset/icon/Icon16/layer_import.png differ diff --git a/asset/icon/Icon16/layer_label.png b/asset/icon/Icon16/layer_label.png new file mode 100644 index 0000000..7981d78 Binary files /dev/null and b/asset/icon/Icon16/layer_label.png differ diff --git a/asset/icon/Icon16/layer_mask.png b/asset/icon/Icon16/layer_mask.png new file mode 100644 index 0000000..b144775 Binary files /dev/null and b/asset/icon/Icon16/layer_mask.png differ diff --git a/asset/icon/Icon16/layer_open.png b/asset/icon/Icon16/layer_open.png new file mode 100644 index 0000000..3c658b4 Binary files /dev/null and b/asset/icon/Icon16/layer_open.png differ diff --git a/asset/icon/Icon16/layer_raster.png b/asset/icon/Icon16/layer_raster.png new file mode 100644 index 0000000..9ce736c Binary files /dev/null and b/asset/icon/Icon16/layer_raster.png differ diff --git a/asset/icon/Icon16/layer_raster_3d.png b/asset/icon/Icon16/layer_raster_3d.png new file mode 100644 index 0000000..ee45f18 Binary files /dev/null and b/asset/icon/Icon16/layer_raster_3d.png differ diff --git a/asset/icon/Icon16/layer_redraw.png b/asset/icon/Icon16/layer_redraw.png new file mode 100644 index 0000000..21113ba Binary files /dev/null and b/asset/icon/Icon16/layer_redraw.png differ diff --git a/asset/icon/Icon16/layer_remove.png b/asset/icon/Icon16/layer_remove.png new file mode 100644 index 0000000..0cefc76 Binary files /dev/null and b/asset/icon/Icon16/layer_remove.png differ diff --git a/asset/icon/Icon16/layer_resize.png b/asset/icon/Icon16/layer_resize.png new file mode 100644 index 0000000..9178997 Binary files /dev/null and b/asset/icon/Icon16/layer_resize.png differ diff --git a/asset/icon/Icon16/layer_resize_actual.png b/asset/icon/Icon16/layer_resize_actual.png new file mode 100644 index 0000000..3770e7d Binary files /dev/null and b/asset/icon/Icon16/layer_resize_actual.png differ diff --git a/asset/icon/Icon16/layer_resize_replicate_h.png b/asset/icon/Icon16/layer_resize_replicate_h.png new file mode 100644 index 0000000..17e2073 Binary files /dev/null and b/asset/icon/Icon16/layer_resize_replicate_h.png differ diff --git a/asset/icon/Icon16/layer_resize_replicate_v.png b/asset/icon/Icon16/layer_resize_replicate_v.png new file mode 100644 index 0000000..9798aa7 Binary files /dev/null and b/asset/icon/Icon16/layer_resize_replicate_v.png differ diff --git a/asset/icon/Icon16/layer_rgb.png b/asset/icon/Icon16/layer_rgb.png new file mode 100644 index 0000000..32820b0 Binary files /dev/null and b/asset/icon/Icon16/layer_rgb.png differ diff --git a/asset/icon/Icon16/layer_save.png b/asset/icon/Icon16/layer_save.png new file mode 100644 index 0000000..3524c9a Binary files /dev/null and b/asset/icon/Icon16/layer_save.png differ diff --git a/asset/icon/Icon16/layer_select.png b/asset/icon/Icon16/layer_select.png new file mode 100644 index 0000000..c21f15a Binary files /dev/null and b/asset/icon/Icon16/layer_select.png differ diff --git a/asset/icon/Icon16/layer_shade.png b/asset/icon/Icon16/layer_shade.png new file mode 100644 index 0000000..16d8360 Binary files /dev/null and b/asset/icon/Icon16/layer_shade.png differ diff --git a/asset/icon/Icon16/layer_shaded_relief.png b/asset/icon/Icon16/layer_shaded_relief.png new file mode 100644 index 0000000..a5fdc02 Binary files /dev/null and b/asset/icon/Icon16/layer_shaded_relief.png differ diff --git a/asset/icon/Icon16/layer_shape.png b/asset/icon/Icon16/layer_shape.png new file mode 100644 index 0000000..fd16002 Binary files /dev/null and b/asset/icon/Icon16/layer_shape.png differ diff --git a/asset/icon/Icon16/layer_shape_ellipse.png b/asset/icon/Icon16/layer_shape_ellipse.png new file mode 100644 index 0000000..82ae80f Binary files /dev/null and b/asset/icon/Icon16/layer_shape_ellipse.png differ diff --git a/asset/icon/Icon16/layer_shape_polyline.png b/asset/icon/Icon16/layer_shape_polyline.png new file mode 100644 index 0000000..27a4b91 Binary files /dev/null and b/asset/icon/Icon16/layer_shape_polyline.png differ diff --git a/asset/icon/Icon16/layer_shape_round.png b/asset/icon/Icon16/layer_shape_round.png new file mode 100644 index 0000000..4dda7eb Binary files /dev/null and b/asset/icon/Icon16/layer_shape_round.png differ diff --git a/asset/icon/Icon16/layer_shape_text.png b/asset/icon/Icon16/layer_shape_text.png new file mode 100644 index 0000000..bc71966 Binary files /dev/null and b/asset/icon/Icon16/layer_shape_text.png differ diff --git a/asset/icon/Icon16/layer_shred.png b/asset/icon/Icon16/layer_shred.png new file mode 100644 index 0000000..8fa7d8b Binary files /dev/null and b/asset/icon/Icon16/layer_shred.png differ diff --git a/asset/icon/Icon16/layer_stack_arrange.png b/asset/icon/Icon16/layer_stack_arrange.png new file mode 100644 index 0000000..c387fd4 Binary files /dev/null and b/asset/icon/Icon16/layer_stack_arrange.png differ diff --git a/asset/icon/Icon16/layer_stack_arrange_back.png b/asset/icon/Icon16/layer_stack_arrange_back.png new file mode 100644 index 0000000..9c8d072 Binary files /dev/null and b/asset/icon/Icon16/layer_stack_arrange_back.png differ diff --git a/asset/icon/Icon16/layer_to_image_size.png b/asset/icon/Icon16/layer_to_image_size.png new file mode 100644 index 0000000..6869dc1 Binary files /dev/null and b/asset/icon/Icon16/layer_to_image_size.png differ diff --git a/asset/icon/Icon16/layer_transparent.png b/asset/icon/Icon16/layer_transparent.png new file mode 100644 index 0000000..892ff77 Binary files /dev/null and b/asset/icon/Icon16/layer_transparent.png differ diff --git a/asset/icon/Icon16/layer_vector.png b/asset/icon/Icon16/layer_vector.png new file mode 100644 index 0000000..e62fb22 Binary files /dev/null and b/asset/icon/Icon16/layer_vector.png differ diff --git a/asset/icon/Icon16/layer_wms.png b/asset/icon/Icon16/layer_wms.png new file mode 100644 index 0000000..32ebe0f Binary files /dev/null and b/asset/icon/Icon16/layer_wms.png differ diff --git a/asset/icon/Icon16/layered_pane.png b/asset/icon/Icon16/layered_pane.png new file mode 100644 index 0000000..3cb7bd3 Binary files /dev/null and b/asset/icon/Icon16/layered_pane.png differ diff --git a/asset/icon/Icon16/layers.png b/asset/icon/Icon16/layers.png new file mode 100644 index 0000000..8a483df Binary files /dev/null and b/asset/icon/Icon16/layers.png differ diff --git a/asset/icon/Icon16/layers_map.png b/asset/icon/Icon16/layers_map.png new file mode 100644 index 0000000..d25ff9c Binary files /dev/null and b/asset/icon/Icon16/layers_map.png differ diff --git a/asset/icon/Icon16/layout.png b/asset/icon/Icon16/layout.png new file mode 100644 index 0000000..c723e09 Binary files /dev/null and b/asset/icon/Icon16/layout.png differ diff --git a/asset/icon/Icon16/layout_add.png b/asset/icon/Icon16/layout_add.png new file mode 100644 index 0000000..7d4b6dc Binary files /dev/null and b/asset/icon/Icon16/layout_add.png differ diff --git a/asset/icon/Icon16/layout_content.png b/asset/icon/Icon16/layout_content.png new file mode 100644 index 0000000..0e4d3f5 Binary files /dev/null and b/asset/icon/Icon16/layout_content.png differ diff --git a/asset/icon/Icon16/layout_delete.png b/asset/icon/Icon16/layout_delete.png new file mode 100644 index 0000000..9653239 Binary files /dev/null and b/asset/icon/Icon16/layout_delete.png differ diff --git a/asset/icon/Icon16/layout_edit.png b/asset/icon/Icon16/layout_edit.png new file mode 100644 index 0000000..1a067c2 Binary files /dev/null and b/asset/icon/Icon16/layout_edit.png differ diff --git a/asset/icon/Icon16/layout_error.png b/asset/icon/Icon16/layout_error.png new file mode 100644 index 0000000..7b4b618 Binary files /dev/null and b/asset/icon/Icon16/layout_error.png differ diff --git a/asset/icon/Icon16/layout_header.png b/asset/icon/Icon16/layout_header.png new file mode 100644 index 0000000..33c131b Binary files /dev/null and b/asset/icon/Icon16/layout_header.png differ diff --git a/asset/icon/Icon16/layout_link.png b/asset/icon/Icon16/layout_link.png new file mode 100644 index 0000000..af9c810 Binary files /dev/null and b/asset/icon/Icon16/layout_link.png differ diff --git a/asset/icon/Icon16/layout_panel.png b/asset/icon/Icon16/layout_panel.png new file mode 100644 index 0000000..541bc14 Binary files /dev/null and b/asset/icon/Icon16/layout_panel.png differ diff --git a/asset/icon/Icon16/layout_sidebar.png b/asset/icon/Icon16/layout_sidebar.png new file mode 100644 index 0000000..c333e7b Binary files /dev/null and b/asset/icon/Icon16/layout_sidebar.png differ diff --git a/asset/icon/Icon16/layouts.png b/asset/icon/Icon16/layouts.png new file mode 100644 index 0000000..1768d1c Binary files /dev/null and b/asset/icon/Icon16/layouts.png differ diff --git a/asset/icon/Icon16/layouts_2.png b/asset/icon/Icon16/layouts_2.png new file mode 100644 index 0000000..bc672b4 Binary files /dev/null and b/asset/icon/Icon16/layouts_2.png differ diff --git a/asset/icon/Icon16/layouts_3.png b/asset/icon/Icon16/layouts_3.png new file mode 100644 index 0000000..a7cc596 Binary files /dev/null and b/asset/icon/Icon16/layouts_3.png differ diff --git a/asset/icon/Icon16/layouts_3_mix.png b/asset/icon/Icon16/layouts_3_mix.png new file mode 100644 index 0000000..9f13734 Binary files /dev/null and b/asset/icon/Icon16/layouts_3_mix.png differ diff --git a/asset/icon/Icon16/layouts_4.png b/asset/icon/Icon16/layouts_4.png new file mode 100644 index 0000000..f52e84d Binary files /dev/null and b/asset/icon/Icon16/layouts_4.png differ diff --git a/asset/icon/Icon16/layouts_6.png b/asset/icon/Icon16/layouts_6.png new file mode 100644 index 0000000..fd7308b Binary files /dev/null and b/asset/icon/Icon16/layouts_6.png differ diff --git a/asset/icon/Icon16/layouts_design.png b/asset/icon/Icon16/layouts_design.png new file mode 100644 index 0000000..4828130 Binary files /dev/null and b/asset/icon/Icon16/layouts_design.png differ diff --git a/asset/icon/Icon16/layouts_header.png b/asset/icon/Icon16/layouts_header.png new file mode 100644 index 0000000..002164b Binary files /dev/null and b/asset/icon/Icon16/layouts_header.png differ diff --git a/asset/icon/Icon16/layouts_header_2.png b/asset/icon/Icon16/layouts_header_2.png new file mode 100644 index 0000000..f50a07a Binary files /dev/null and b/asset/icon/Icon16/layouts_header_2.png differ diff --git a/asset/icon/Icon16/layouts_header_2_equal.png b/asset/icon/Icon16/layouts_header_2_equal.png new file mode 100644 index 0000000..1e70489 Binary files /dev/null and b/asset/icon/Icon16/layouts_header_2_equal.png differ diff --git a/asset/icon/Icon16/layouts_header_3.png b/asset/icon/Icon16/layouts_header_3.png new file mode 100644 index 0000000..504a2b5 Binary files /dev/null and b/asset/icon/Icon16/layouts_header_3.png differ diff --git a/asset/icon/Icon16/layouts_header_3_mix.png b/asset/icon/Icon16/layouts_header_3_mix.png new file mode 100644 index 0000000..0c5ca3f Binary files /dev/null and b/asset/icon/Icon16/layouts_header_3_mix.png differ diff --git a/asset/icon/Icon16/layouts_header_footer.png b/asset/icon/Icon16/layouts_header_footer.png new file mode 100644 index 0000000..8b13651 Binary files /dev/null and b/asset/icon/Icon16/layouts_header_footer.png differ diff --git a/asset/icon/Icon16/layouts_header_footer_2.png b/asset/icon/Icon16/layouts_header_footer_2.png new file mode 100644 index 0000000..06d4b48 Binary files /dev/null and b/asset/icon/Icon16/layouts_header_footer_2.png differ diff --git a/asset/icon/Icon16/layouts_header_footer_3.png b/asset/icon/Icon16/layouts_header_footer_3.png new file mode 100644 index 0000000..cedbfa7 Binary files /dev/null and b/asset/icon/Icon16/layouts_header_footer_3.png differ diff --git a/asset/icon/Icon16/layouts_hf_2_equal.png b/asset/icon/Icon16/layouts_hf_2_equal.png new file mode 100644 index 0000000..055cb89 Binary files /dev/null and b/asset/icon/Icon16/layouts_hf_2_equal.png differ diff --git a/asset/icon/Icon16/layouts_hf_3.png b/asset/icon/Icon16/layouts_hf_3.png new file mode 100644 index 0000000..ca821ce Binary files /dev/null and b/asset/icon/Icon16/layouts_hf_3.png differ diff --git a/asset/icon/Icon16/layouts_join.png b/asset/icon/Icon16/layouts_join.png new file mode 100644 index 0000000..46b5953 Binary files /dev/null and b/asset/icon/Icon16/layouts_join.png differ diff --git a/asset/icon/Icon16/layouts_join_vertical.png b/asset/icon/Icon16/layouts_join_vertical.png new file mode 100644 index 0000000..c9b801a Binary files /dev/null and b/asset/icon/Icon16/layouts_join_vertical.png differ diff --git a/asset/icon/Icon16/layouts_select.png b/asset/icon/Icon16/layouts_select.png new file mode 100644 index 0000000..bf58003 Binary files /dev/null and b/asset/icon/Icon16/layouts_select.png differ diff --git a/asset/icon/Icon16/layouts_select_content.png b/asset/icon/Icon16/layouts_select_content.png new file mode 100644 index 0000000..9ed7ceb Binary files /dev/null and b/asset/icon/Icon16/layouts_select_content.png differ diff --git a/asset/icon/Icon16/layouts_select_footer.png b/asset/icon/Icon16/layouts_select_footer.png new file mode 100644 index 0000000..c81dfcc Binary files /dev/null and b/asset/icon/Icon16/layouts_select_footer.png differ diff --git a/asset/icon/Icon16/layouts_select_sidebar.png b/asset/icon/Icon16/layouts_select_sidebar.png new file mode 100644 index 0000000..689590c Binary files /dev/null and b/asset/icon/Icon16/layouts_select_sidebar.png differ diff --git a/asset/icon/Icon16/layouts_split.png b/asset/icon/Icon16/layouts_split.png new file mode 100644 index 0000000..4494f48 Binary files /dev/null and b/asset/icon/Icon16/layouts_split.png differ diff --git a/asset/icon/Icon16/layouts_split_vertical.png b/asset/icon/Icon16/layouts_split_vertical.png new file mode 100644 index 0000000..035921e Binary files /dev/null and b/asset/icon/Icon16/layouts_split_vertical.png differ diff --git a/asset/icon/Icon16/lcd_tv.png b/asset/icon/Icon16/lcd_tv.png new file mode 100644 index 0000000..6f1ac24 Binary files /dev/null and b/asset/icon/Icon16/lcd_tv.png differ diff --git a/asset/icon/Icon16/lcd_tv_image.png b/asset/icon/Icon16/lcd_tv_image.png new file mode 100644 index 0000000..9bb42d1 Binary files /dev/null and b/asset/icon/Icon16/lcd_tv_image.png differ diff --git a/asset/icon/Icon16/lcd_tv_off.png b/asset/icon/Icon16/lcd_tv_off.png new file mode 100644 index 0000000..f084671 Binary files /dev/null and b/asset/icon/Icon16/lcd_tv_off.png differ diff --git a/asset/icon/Icon16/lcd_tv_test.png b/asset/icon/Icon16/lcd_tv_test.png new file mode 100644 index 0000000..d038eb2 Binary files /dev/null and b/asset/icon/Icon16/lcd_tv_test.png differ diff --git a/asset/icon/Icon16/leaf_plant.png b/asset/icon/Icon16/leaf_plant.png new file mode 100644 index 0000000..3203569 Binary files /dev/null and b/asset/icon/Icon16/leaf_plant.png differ diff --git a/asset/icon/Icon16/led.png b/asset/icon/Icon16/led.png new file mode 100644 index 0000000..21b42ab Binary files /dev/null and b/asset/icon/Icon16/led.png differ diff --git a/asset/icon/Icon16/leech_protect.png b/asset/icon/Icon16/leech_protect.png new file mode 100644 index 0000000..85660d6 Binary files /dev/null and b/asset/icon/Icon16/leech_protect.png differ diff --git a/asset/icon/Icon16/legend.png b/asset/icon/Icon16/legend.png new file mode 100644 index 0000000..8014955 Binary files /dev/null and b/asset/icon/Icon16/legend.png differ diff --git a/asset/icon/Icon16/license_key.png b/asset/icon/Icon16/license_key.png new file mode 100644 index 0000000..cbf58d2 Binary files /dev/null and b/asset/icon/Icon16/license_key.png differ diff --git a/asset/icon/Icon16/license_management.png b/asset/icon/Icon16/license_management.png new file mode 100644 index 0000000..7174b5d Binary files /dev/null and b/asset/icon/Icon16/license_management.png differ diff --git a/asset/icon/Icon16/life_vest.png b/asset/icon/Icon16/life_vest.png new file mode 100644 index 0000000..9d08e52 Binary files /dev/null and b/asset/icon/Icon16/life_vest.png differ diff --git a/asset/icon/Icon16/light_circle_green.png b/asset/icon/Icon16/light_circle_green.png new file mode 100644 index 0000000..9437312 Binary files /dev/null and b/asset/icon/Icon16/light_circle_green.png differ diff --git a/asset/icon/Icon16/lightbulb.png b/asset/icon/Icon16/lightbulb.png new file mode 100644 index 0000000..117285f Binary files /dev/null and b/asset/icon/Icon16/lightbulb.png differ diff --git a/asset/icon/Icon16/lightbulb_add.png b/asset/icon/Icon16/lightbulb_add.png new file mode 100644 index 0000000..d417d48 Binary files /dev/null and b/asset/icon/Icon16/lightbulb_add.png differ diff --git a/asset/icon/Icon16/lightbulb_delete.png b/asset/icon/Icon16/lightbulb_delete.png new file mode 100644 index 0000000..5785ba2 Binary files /dev/null and b/asset/icon/Icon16/lightbulb_delete.png differ diff --git a/asset/icon/Icon16/lightbulb_off.png b/asset/icon/Icon16/lightbulb_off.png new file mode 100644 index 0000000..5cf32c0 Binary files /dev/null and b/asset/icon/Icon16/lightbulb_off.png differ diff --git a/asset/icon/Icon16/lighthouse(2).png b/asset/icon/Icon16/lighthouse(2).png new file mode 100644 index 0000000..1e31b94 Binary files /dev/null and b/asset/icon/Icon16/lighthouse(2).png differ diff --git a/asset/icon/Icon16/lighthouse.png b/asset/icon/Icon16/lighthouse.png new file mode 100644 index 0000000..be1b9c7 Binary files /dev/null and b/asset/icon/Icon16/lighthouse.png differ diff --git a/asset/icon/Icon16/lightning.png b/asset/icon/Icon16/lightning.png new file mode 100644 index 0000000..c933224 Binary files /dev/null and b/asset/icon/Icon16/lightning.png differ diff --git a/asset/icon/Icon16/lightning_add.png b/asset/icon/Icon16/lightning_add.png new file mode 100644 index 0000000..816f6f5 Binary files /dev/null and b/asset/icon/Icon16/lightning_add.png differ diff --git a/asset/icon/Icon16/lightning_delete.png b/asset/icon/Icon16/lightning_delete.png new file mode 100644 index 0000000..8de97e6 Binary files /dev/null and b/asset/icon/Icon16/lightning_delete.png differ diff --git a/asset/icon/Icon16/lightning_go.png b/asset/icon/Icon16/lightning_go.png new file mode 100644 index 0000000..ed62c56 Binary files /dev/null and b/asset/icon/Icon16/lightning_go.png differ diff --git a/asset/icon/Icon16/limit_bandwidth_usage.png b/asset/icon/Icon16/limit_bandwidth_usage.png new file mode 100644 index 0000000..d558410 Binary files /dev/null and b/asset/icon/Icon16/limit_bandwidth_usage.png differ diff --git a/asset/icon/Icon16/line_height.png b/asset/icon/Icon16/line_height.png new file mode 100644 index 0000000..fc7949b Binary files /dev/null and b/asset/icon/Icon16/line_height.png differ diff --git a/asset/icon/Icon16/line_numbers.png b/asset/icon/Icon16/line_numbers.png new file mode 100644 index 0000000..2d8b627 Binary files /dev/null and b/asset/icon/Icon16/line_numbers.png differ diff --git a/asset/icon/Icon16/line_split.png b/asset/icon/Icon16/line_split.png new file mode 100644 index 0000000..676f007 Binary files /dev/null and b/asset/icon/Icon16/line_split.png differ diff --git a/asset/icon/Icon16/linechart.png b/asset/icon/Icon16/linechart.png new file mode 100644 index 0000000..64b9473 Binary files /dev/null and b/asset/icon/Icon16/linechart.png differ diff --git a/asset/icon/Icon16/link.png b/asset/icon/Icon16/link.png new file mode 100644 index 0000000..c4f00cb Binary files /dev/null and b/asset/icon/Icon16/link.png differ diff --git a/asset/icon/Icon16/link_add.png b/asset/icon/Icon16/link_add.png new file mode 100644 index 0000000..8cb6488 Binary files /dev/null and b/asset/icon/Icon16/link_add.png differ diff --git a/asset/icon/Icon16/link_break.png b/asset/icon/Icon16/link_break.png new file mode 100644 index 0000000..57bafcf Binary files /dev/null and b/asset/icon/Icon16/link_break.png differ diff --git a/asset/icon/Icon16/link_button.png b/asset/icon/Icon16/link_button.png new file mode 100644 index 0000000..00e18db Binary files /dev/null and b/asset/icon/Icon16/link_button.png differ diff --git a/asset/icon/Icon16/link_delete.png b/asset/icon/Icon16/link_delete.png new file mode 100644 index 0000000..509b5f3 Binary files /dev/null and b/asset/icon/Icon16/link_delete.png differ diff --git a/asset/icon/Icon16/link_edit.png b/asset/icon/Icon16/link_edit.png new file mode 100644 index 0000000..d8dc44f Binary files /dev/null and b/asset/icon/Icon16/link_edit.png differ diff --git a/asset/icon/Icon16/link_go.png b/asset/icon/Icon16/link_go.png new file mode 100644 index 0000000..37a839f Binary files /dev/null and b/asset/icon/Icon16/link_go.png differ diff --git a/asset/icon/Icon16/link_juice.png b/asset/icon/Icon16/link_juice.png new file mode 100644 index 0000000..b61fb0c Binary files /dev/null and b/asset/icon/Icon16/link_juice.png differ diff --git a/asset/icon/Icon16/link_unchain.png b/asset/icon/Icon16/link_unchain.png new file mode 100644 index 0000000..6dc2620 Binary files /dev/null and b/asset/icon/Icon16/link_unchain.png differ diff --git a/asset/icon/Icon16/linkbar.png b/asset/icon/Icon16/linkbar.png new file mode 100644 index 0000000..37a6e11 Binary files /dev/null and b/asset/icon/Icon16/linkbar.png differ diff --git a/asset/icon/Icon16/linkedin.png b/asset/icon/Icon16/linkedin.png new file mode 100644 index 0000000..f2b7dc8 Binary files /dev/null and b/asset/icon/Icon16/linkedin.png differ diff --git a/asset/icon/Icon16/linux_mint.png b/asset/icon/Icon16/linux_mint.png new file mode 100644 index 0000000..f7b0836 Binary files /dev/null and b/asset/icon/Icon16/linux_mint.png differ diff --git a/asset/icon/Icon16/list.png b/asset/icon/Icon16/list.png new file mode 100644 index 0000000..74104c7 Binary files /dev/null and b/asset/icon/Icon16/list.png differ diff --git a/asset/icon/Icon16/list_box.png b/asset/icon/Icon16/list_box.png new file mode 100644 index 0000000..e0180c9 Binary files /dev/null and b/asset/icon/Icon16/list_box.png differ diff --git a/asset/icon/Icon16/list_suspended_accounts.png b/asset/icon/Icon16/list_suspended_accounts.png new file mode 100644 index 0000000..06c53ef Binary files /dev/null and b/asset/icon/Icon16/list_suspended_accounts.png differ diff --git a/asset/icon/Icon16/livejournal.png b/asset/icon/Icon16/livejournal.png new file mode 100644 index 0000000..ecbaafd Binary files /dev/null and b/asset/icon/Icon16/livejournal.png differ diff --git a/asset/icon/Icon16/locale_xml.png b/asset/icon/Icon16/locale_xml.png new file mode 100644 index 0000000..f74d8c3 Binary files /dev/null and b/asset/icon/Icon16/locale_xml.png differ diff --git a/asset/icon/Icon16/locate.png b/asset/icon/Icon16/locate.png new file mode 100644 index 0000000..dbac8b3 Binary files /dev/null and b/asset/icon/Icon16/locate.png differ diff --git a/asset/icon/Icon16/location_pin.png b/asset/icon/Icon16/location_pin.png new file mode 100644 index 0000000..c457826 Binary files /dev/null and b/asset/icon/Icon16/location_pin.png differ diff --git a/asset/icon/Icon16/lock.png b/asset/icon/Icon16/lock.png new file mode 100644 index 0000000..ddf83d9 Binary files /dev/null and b/asset/icon/Icon16/lock.png differ diff --git a/asset/icon/Icon16/lock_add.png b/asset/icon/Icon16/lock_add.png new file mode 100644 index 0000000..5085b63 Binary files /dev/null and b/asset/icon/Icon16/lock_add.png differ diff --git a/asset/icon/Icon16/lock_break.png b/asset/icon/Icon16/lock_break.png new file mode 100644 index 0000000..c7f03aa Binary files /dev/null and b/asset/icon/Icon16/lock_break.png differ diff --git a/asset/icon/Icon16/lock_delete.png b/asset/icon/Icon16/lock_delete.png new file mode 100644 index 0000000..f009933 Binary files /dev/null and b/asset/icon/Icon16/lock_delete.png differ diff --git a/asset/icon/Icon16/lock_edit.png b/asset/icon/Icon16/lock_edit.png new file mode 100644 index 0000000..f08e2a7 Binary files /dev/null and b/asset/icon/Icon16/lock_edit.png differ diff --git a/asset/icon/Icon16/lock_go.png b/asset/icon/Icon16/lock_go.png new file mode 100644 index 0000000..63d4285 Binary files /dev/null and b/asset/icon/Icon16/lock_go.png differ diff --git a/asset/icon/Icon16/lock_open.png b/asset/icon/Icon16/lock_open.png new file mode 100644 index 0000000..b09e418 Binary files /dev/null and b/asset/icon/Icon16/lock_open.png differ diff --git a/asset/icon/Icon16/logic_functions.png b/asset/icon/Icon16/logic_functions.png new file mode 100644 index 0000000..df1f732 Binary files /dev/null and b/asset/icon/Icon16/logic_functions.png differ diff --git a/asset/icon/Icon16/lollipop.png b/asset/icon/Icon16/lollipop.png new file mode 100644 index 0000000..659c8fe Binary files /dev/null and b/asset/icon/Icon16/lollipop.png differ diff --git a/asset/icon/Icon16/lollypop.png b/asset/icon/Icon16/lollypop.png new file mode 100644 index 0000000..b485a19 Binary files /dev/null and b/asset/icon/Icon16/lollypop.png differ diff --git a/asset/icon/Icon16/lorry.png b/asset/icon/Icon16/lorry.png new file mode 100644 index 0000000..4ce7e9c Binary files /dev/null and b/asset/icon/Icon16/lorry.png differ diff --git a/asset/icon/Icon16/lorry_add.png b/asset/icon/Icon16/lorry_add.png new file mode 100644 index 0000000..a150a18 Binary files /dev/null and b/asset/icon/Icon16/lorry_add.png differ diff --git a/asset/icon/Icon16/lorry_box.png b/asset/icon/Icon16/lorry_box.png new file mode 100644 index 0000000..b1761e8 Binary files /dev/null and b/asset/icon/Icon16/lorry_box.png differ diff --git a/asset/icon/Icon16/lorry_delete.png b/asset/icon/Icon16/lorry_delete.png new file mode 100644 index 0000000..cec0e4d Binary files /dev/null and b/asset/icon/Icon16/lorry_delete.png differ diff --git a/asset/icon/Icon16/lorry_error.png b/asset/icon/Icon16/lorry_error.png new file mode 100644 index 0000000..8203a39 Binary files /dev/null and b/asset/icon/Icon16/lorry_error.png differ diff --git a/asset/icon/Icon16/lorry_flatbed.png b/asset/icon/Icon16/lorry_flatbed.png new file mode 100644 index 0000000..4b15248 Binary files /dev/null and b/asset/icon/Icon16/lorry_flatbed.png differ diff --git a/asset/icon/Icon16/lorry_go.png b/asset/icon/Icon16/lorry_go.png new file mode 100644 index 0000000..b767dd3 Binary files /dev/null and b/asset/icon/Icon16/lorry_go.png differ diff --git a/asset/icon/Icon16/lorry_link.png b/asset/icon/Icon16/lorry_link.png new file mode 100644 index 0000000..c02d02a Binary files /dev/null and b/asset/icon/Icon16/lorry_link.png differ diff --git a/asset/icon/Icon16/luggage.png b/asset/icon/Icon16/luggage.png new file mode 100644 index 0000000..ae4ada9 Binary files /dev/null and b/asset/icon/Icon16/luggage.png differ diff --git a/asset/icon/Icon16/luggage_brown.png b/asset/icon/Icon16/luggage_brown.png new file mode 100644 index 0000000..33257cb Binary files /dev/null and b/asset/icon/Icon16/luggage_brown.png differ diff --git a/asset/icon/Icon16/luggage_brown_tag.png b/asset/icon/Icon16/luggage_brown_tag.png new file mode 100644 index 0000000..cdb285b Binary files /dev/null and b/asset/icon/Icon16/luggage_brown_tag.png differ diff --git a/asset/icon/Icon16/magic_wand_2.png b/asset/icon/Icon16/magic_wand_2.png new file mode 100644 index 0000000..ea6091a Binary files /dev/null and b/asset/icon/Icon16/magic_wand_2.png differ diff --git a/asset/icon/Icon16/magnet.png b/asset/icon/Icon16/magnet.png new file mode 100644 index 0000000..43fcc27 Binary files /dev/null and b/asset/icon/Icon16/magnet.png differ diff --git a/asset/icon/Icon16/magnifier.png b/asset/icon/Icon16/magnifier.png new file mode 100644 index 0000000..b81b18d Binary files /dev/null and b/asset/icon/Icon16/magnifier.png differ diff --git a/asset/icon/Icon16/magnifier_zoom_in.png b/asset/icon/Icon16/magnifier_zoom_in.png new file mode 100644 index 0000000..01a4df5 Binary files /dev/null and b/asset/icon/Icon16/magnifier_zoom_in.png differ diff --git a/asset/icon/Icon16/magnifier_zoom_out.png b/asset/icon/Icon16/magnifier_zoom_out.png new file mode 100644 index 0000000..3d096c1 Binary files /dev/null and b/asset/icon/Icon16/magnifier_zoom_out.png differ diff --git a/asset/icon/Icon16/mail_black.png b/asset/icon/Icon16/mail_black.png new file mode 100644 index 0000000..790f750 Binary files /dev/null and b/asset/icon/Icon16/mail_black.png differ diff --git a/asset/icon/Icon16/mail_box.png b/asset/icon/Icon16/mail_box.png new file mode 100644 index 0000000..6266a96 Binary files /dev/null and b/asset/icon/Icon16/mail_box.png differ diff --git a/asset/icon/Icon16/mail_green.png b/asset/icon/Icon16/mail_green.png new file mode 100644 index 0000000..7e2c3f2 Binary files /dev/null and b/asset/icon/Icon16/mail_green.png differ diff --git a/asset/icon/Icon16/mail_red.png b/asset/icon/Icon16/mail_red.png new file mode 100644 index 0000000..e2e4b06 Binary files /dev/null and b/asset/icon/Icon16/mail_red.png differ diff --git a/asset/icon/Icon16/mail_server_exim.png b/asset/icon/Icon16/mail_server_exim.png new file mode 100644 index 0000000..979e437 Binary files /dev/null and b/asset/icon/Icon16/mail_server_exim.png differ diff --git a/asset/icon/Icon16/mail_server_setting.png b/asset/icon/Icon16/mail_server_setting.png new file mode 100644 index 0000000..dd1d688 Binary files /dev/null and b/asset/icon/Icon16/mail_server_setting.png differ diff --git a/asset/icon/Icon16/mail_torn.png b/asset/icon/Icon16/mail_torn.png new file mode 100644 index 0000000..0f4b8b6 Binary files /dev/null and b/asset/icon/Icon16/mail_torn.png differ diff --git a/asset/icon/Icon16/mail_yellow.png b/asset/icon/Icon16/mail_yellow.png new file mode 100644 index 0000000..91650cf Binary files /dev/null and b/asset/icon/Icon16/mail_yellow.png differ diff --git a/asset/icon/Icon16/mailing_list.png b/asset/icon/Icon16/mailing_list.png new file mode 100644 index 0000000..1868dae Binary files /dev/null and b/asset/icon/Icon16/mailing_list.png differ diff --git a/asset/icon/Icon16/mailing_list_manager_mailman.png b/asset/icon/Icon16/mailing_list_manager_mailman.png new file mode 100644 index 0000000..bfc6bb5 Binary files /dev/null and b/asset/icon/Icon16/mailing_list_manager_mailman.png differ diff --git a/asset/icon/Icon16/male.png b/asset/icon/Icon16/male.png new file mode 100644 index 0000000..0ebec83 Binary files /dev/null and b/asset/icon/Icon16/male.png differ diff --git a/asset/icon/Icon16/manage_sources.png b/asset/icon/Icon16/manage_sources.png new file mode 100644 index 0000000..4d6f9cf Binary files /dev/null and b/asset/icon/Icon16/manage_sources.png differ diff --git a/asset/icon/Icon16/manage_ssl_hosts.png b/asset/icon/Icon16/manage_ssl_hosts.png new file mode 100644 index 0000000..4fd1ad7 Binary files /dev/null and b/asset/icon/Icon16/manage_ssl_hosts.png differ diff --git a/asset/icon/Icon16/mandriva.png b/asset/icon/Icon16/mandriva.png new file mode 100644 index 0000000..07e67d3 Binary files /dev/null and b/asset/icon/Icon16/mandriva.png differ diff --git a/asset/icon/Icon16/map.png b/asset/icon/Icon16/map.png new file mode 100644 index 0000000..44d804d Binary files /dev/null and b/asset/icon/Icon16/map.png differ diff --git a/asset/icon/Icon16/map_add.png b/asset/icon/Icon16/map_add.png new file mode 100644 index 0000000..f01d97a Binary files /dev/null and b/asset/icon/Icon16/map_add.png differ diff --git a/asset/icon/Icon16/map_delete.png b/asset/icon/Icon16/map_delete.png new file mode 100644 index 0000000..b3db54a Binary files /dev/null and b/asset/icon/Icon16/map_delete.png differ diff --git a/asset/icon/Icon16/map_edit.png b/asset/icon/Icon16/map_edit.png new file mode 100644 index 0000000..aec30eb Binary files /dev/null and b/asset/icon/Icon16/map_edit.png differ diff --git a/asset/icon/Icon16/map_go.png b/asset/icon/Icon16/map_go.png new file mode 100644 index 0000000..112c8f3 Binary files /dev/null and b/asset/icon/Icon16/map_go.png differ diff --git a/asset/icon/Icon16/map_magnify.png b/asset/icon/Icon16/map_magnify.png new file mode 100644 index 0000000..44057ee Binary files /dev/null and b/asset/icon/Icon16/map_magnify.png differ diff --git a/asset/icon/Icon16/map_torn.png b/asset/icon/Icon16/map_torn.png new file mode 100644 index 0000000..804f170 Binary files /dev/null and b/asset/icon/Icon16/map_torn.png differ diff --git a/asset/icon/Icon16/mario.png b/asset/icon/Icon16/mario.png new file mode 100644 index 0000000..70e8fd4 Binary files /dev/null and b/asset/icon/Icon16/mario.png differ diff --git a/asset/icon/Icon16/mark_citation.png b/asset/icon/Icon16/mark_citation.png new file mode 100644 index 0000000..5d85dd4 Binary files /dev/null and b/asset/icon/Icon16/mark_citation.png differ diff --git a/asset/icon/Icon16/mark_entry.png b/asset/icon/Icon16/mark_entry.png new file mode 100644 index 0000000..529af74 Binary files /dev/null and b/asset/icon/Icon16/mark_entry.png differ diff --git a/asset/icon/Icon16/mark_to_download.png b/asset/icon/Icon16/mark_to_download.png new file mode 100644 index 0000000..75f6799 Binary files /dev/null and b/asset/icon/Icon16/mark_to_download.png differ diff --git a/asset/icon/Icon16/marketwatch.png b/asset/icon/Icon16/marketwatch.png new file mode 100644 index 0000000..049d3dd Binary files /dev/null and b/asset/icon/Icon16/marketwatch.png differ diff --git a/asset/icon/Icon16/markup_show_mode.png b/asset/icon/Icon16/markup_show_mode.png new file mode 100644 index 0000000..d47b67c Binary files /dev/null and b/asset/icon/Icon16/markup_show_mode.png differ diff --git a/asset/icon/Icon16/mask.png b/asset/icon/Icon16/mask.png new file mode 100644 index 0000000..bf4a565 Binary files /dev/null and b/asset/icon/Icon16/mask.png differ diff --git a/asset/icon/Icon16/master_card.png b/asset/icon/Icon16/master_card.png new file mode 100644 index 0000000..e56e6a4 Binary files /dev/null and b/asset/icon/Icon16/master_card.png differ diff --git a/asset/icon/Icon16/match_field.png b/asset/icon/Icon16/match_field.png new file mode 100644 index 0000000..0a9537d Binary files /dev/null and b/asset/icon/Icon16/match_field.png differ diff --git a/asset/icon/Icon16/math_functions.png b/asset/icon/Icon16/math_functions.png new file mode 100644 index 0000000..12b0ca7 Binary files /dev/null and b/asset/icon/Icon16/math_functions.png differ diff --git a/asset/icon/Icon16/measure.png b/asset/icon/Icon16/measure.png new file mode 100644 index 0000000..d82e568 Binary files /dev/null and b/asset/icon/Icon16/measure.png differ diff --git a/asset/icon/Icon16/measure_crop.png b/asset/icon/Icon16/measure_crop.png new file mode 100644 index 0000000..0d32d98 Binary files /dev/null and b/asset/icon/Icon16/measure_crop.png differ diff --git a/asset/icon/Icon16/medal_award_bronze.png b/asset/icon/Icon16/medal_award_bronze.png new file mode 100644 index 0000000..e3fc720 Binary files /dev/null and b/asset/icon/Icon16/medal_award_bronze.png differ diff --git a/asset/icon/Icon16/medal_award_gold.png b/asset/icon/Icon16/medal_award_gold.png new file mode 100644 index 0000000..e471b25 Binary files /dev/null and b/asset/icon/Icon16/medal_award_gold.png differ diff --git a/asset/icon/Icon16/medal_award_silver.png b/asset/icon/Icon16/medal_award_silver.png new file mode 100644 index 0000000..e2b309e Binary files /dev/null and b/asset/icon/Icon16/medal_award_silver.png differ diff --git a/asset/icon/Icon16/medal_bronze_1.png b/asset/icon/Icon16/medal_bronze_1.png new file mode 100644 index 0000000..60b3322 Binary files /dev/null and b/asset/icon/Icon16/medal_bronze_1.png differ diff --git a/asset/icon/Icon16/medal_bronze_2.png b/asset/icon/Icon16/medal_bronze_2.png new file mode 100644 index 0000000..cde1760 Binary files /dev/null and b/asset/icon/Icon16/medal_bronze_2.png differ diff --git a/asset/icon/Icon16/medal_bronze_3.png b/asset/icon/Icon16/medal_bronze_3.png new file mode 100644 index 0000000..83c06af Binary files /dev/null and b/asset/icon/Icon16/medal_bronze_3.png differ diff --git a/asset/icon/Icon16/medal_bronze_add.png b/asset/icon/Icon16/medal_bronze_add.png new file mode 100644 index 0000000..5cc12ec Binary files /dev/null and b/asset/icon/Icon16/medal_bronze_add.png differ diff --git a/asset/icon/Icon16/medal_bronze_delete.png b/asset/icon/Icon16/medal_bronze_delete.png new file mode 100644 index 0000000..b9c005e Binary files /dev/null and b/asset/icon/Icon16/medal_bronze_delete.png differ diff --git a/asset/icon/Icon16/medal_gold_1.png b/asset/icon/Icon16/medal_gold_1.png new file mode 100644 index 0000000..aba79c3 Binary files /dev/null and b/asset/icon/Icon16/medal_gold_1.png differ diff --git a/asset/icon/Icon16/medal_gold_2.png b/asset/icon/Icon16/medal_gold_2.png new file mode 100644 index 0000000..9fc59fb Binary files /dev/null and b/asset/icon/Icon16/medal_gold_2.png differ diff --git a/asset/icon/Icon16/medal_gold_3.png b/asset/icon/Icon16/medal_gold_3.png new file mode 100644 index 0000000..ab60c07 Binary files /dev/null and b/asset/icon/Icon16/medal_gold_3.png differ diff --git a/asset/icon/Icon16/medal_gold_add.png b/asset/icon/Icon16/medal_gold_add.png new file mode 100644 index 0000000..1177a6a Binary files /dev/null and b/asset/icon/Icon16/medal_gold_add.png differ diff --git a/asset/icon/Icon16/medal_gold_delete.png b/asset/icon/Icon16/medal_gold_delete.png new file mode 100644 index 0000000..ac9214b Binary files /dev/null and b/asset/icon/Icon16/medal_gold_delete.png differ diff --git a/asset/icon/Icon16/medal_silver_1.png b/asset/icon/Icon16/medal_silver_1.png new file mode 100644 index 0000000..7d0a858 Binary files /dev/null and b/asset/icon/Icon16/medal_silver_1.png differ diff --git a/asset/icon/Icon16/medal_silver_2.png b/asset/icon/Icon16/medal_silver_2.png new file mode 100644 index 0000000..bcf9fe9 Binary files /dev/null and b/asset/icon/Icon16/medal_silver_2.png differ diff --git a/asset/icon/Icon16/medal_silver_3.png b/asset/icon/Icon16/medal_silver_3.png new file mode 100644 index 0000000..1f970d4 Binary files /dev/null and b/asset/icon/Icon16/medal_silver_3.png differ diff --git a/asset/icon/Icon16/medal_silver_add.png b/asset/icon/Icon16/medal_silver_add.png new file mode 100644 index 0000000..053b39b Binary files /dev/null and b/asset/icon/Icon16/medal_silver_add.png differ diff --git a/asset/icon/Icon16/medal_silver_delete.png b/asset/icon/Icon16/medal_silver_delete.png new file mode 100644 index 0000000..71c549c Binary files /dev/null and b/asset/icon/Icon16/medal_silver_delete.png differ diff --git a/asset/icon/Icon16/medical_record.png b/asset/icon/Icon16/medical_record.png new file mode 100644 index 0000000..c812102 Binary files /dev/null and b/asset/icon/Icon16/medical_record.png differ diff --git a/asset/icon/Icon16/menu.png b/asset/icon/Icon16/menu.png new file mode 100644 index 0000000..b58ad8d Binary files /dev/null and b/asset/icon/Icon16/menu.png differ diff --git a/asset/icon/Icon16/menu_item.png b/asset/icon/Icon16/menu_item.png new file mode 100644 index 0000000..8572018 Binary files /dev/null and b/asset/icon/Icon16/menu_item.png differ diff --git a/asset/icon/Icon16/menubar.png b/asset/icon/Icon16/menubar.png new file mode 100644 index 0000000..730a37b Binary files /dev/null and b/asset/icon/Icon16/menubar.png differ diff --git a/asset/icon/Icon16/merge_cells.png b/asset/icon/Icon16/merge_cells.png new file mode 100644 index 0000000..998e744 Binary files /dev/null and b/asset/icon/Icon16/merge_cells.png differ diff --git a/asset/icon/Icon16/messenger.png b/asset/icon/Icon16/messenger.png new file mode 100644 index 0000000..1e1eccc Binary files /dev/null and b/asset/icon/Icon16/messenger.png differ diff --git a/asset/icon/Icon16/metro.png b/asset/icon/Icon16/metro.png new file mode 100644 index 0000000..90a0484 Binary files /dev/null and b/asset/icon/Icon16/metro.png differ diff --git a/asset/icon/Icon16/metronome.png b/asset/icon/Icon16/metronome.png new file mode 100644 index 0000000..83f2afc Binary files /dev/null and b/asset/icon/Icon16/metronome.png differ diff --git a/asset/icon/Icon16/micro_sd.png b/asset/icon/Icon16/micro_sd.png new file mode 100644 index 0000000..2d0c2fa Binary files /dev/null and b/asset/icon/Icon16/micro_sd.png differ diff --git a/asset/icon/Icon16/micro_sd_blue.png b/asset/icon/Icon16/micro_sd_blue.png new file mode 100644 index 0000000..474b5a2 Binary files /dev/null and b/asset/icon/Icon16/micro_sd_blue.png differ diff --git a/asset/icon/Icon16/microformats.png b/asset/icon/Icon16/microformats.png new file mode 100644 index 0000000..b837b7d Binary files /dev/null and b/asset/icon/Icon16/microformats.png differ diff --git a/asset/icon/Icon16/microphone.png b/asset/icon/Icon16/microphone.png new file mode 100644 index 0000000..4dcc904 Binary files /dev/null and b/asset/icon/Icon16/microphone.png differ diff --git a/asset/icon/Icon16/microscope.png b/asset/icon/Icon16/microscope.png new file mode 100644 index 0000000..c5567db Binary files /dev/null and b/asset/icon/Icon16/microscope.png differ diff --git a/asset/icon/Icon16/microwave.png b/asset/icon/Icon16/microwave.png new file mode 100644 index 0000000..483369c Binary files /dev/null and b/asset/icon/Icon16/microwave.png differ diff --git a/asset/icon/Icon16/milestone.png b/asset/icon/Icon16/milestone.png new file mode 100644 index 0000000..beb7b5d Binary files /dev/null and b/asset/icon/Icon16/milestone.png differ diff --git a/asset/icon/Icon16/milk.png b/asset/icon/Icon16/milk.png new file mode 100644 index 0000000..44ed5df Binary files /dev/null and b/asset/icon/Icon16/milk.png differ diff --git a/asset/icon/Icon16/mime_types.png b/asset/icon/Icon16/mime_types.png new file mode 100644 index 0000000..63e0b2a Binary files /dev/null and b/asset/icon/Icon16/mime_types.png differ diff --git a/asset/icon/Icon16/mixer.png b/asset/icon/Icon16/mixer.png new file mode 100644 index 0000000..2573164 Binary files /dev/null and b/asset/icon/Icon16/mixer.png differ diff --git a/asset/icon/Icon16/mixture.png b/asset/icon/Icon16/mixture.png new file mode 100644 index 0000000..af4290c Binary files /dev/null and b/asset/icon/Icon16/mixture.png differ diff --git a/asset/icon/Icon16/mixx.png b/asset/icon/Icon16/mixx.png new file mode 100644 index 0000000..0adfbb1 Binary files /dev/null and b/asset/icon/Icon16/mixx.png differ diff --git a/asset/icon/Icon16/mobile_me.png b/asset/icon/Icon16/mobile_me.png new file mode 100644 index 0000000..4318a94 Binary files /dev/null and b/asset/icon/Icon16/mobile_me.png differ diff --git a/asset/icon/Icon16/modify_cpanel_whm_news.png b/asset/icon/Icon16/modify_cpanel_whm_news.png new file mode 100644 index 0000000..c0f25ad Binary files /dev/null and b/asset/icon/Icon16/modify_cpanel_whm_news.png differ diff --git a/asset/icon/Icon16/modify_suspended_account_page.png b/asset/icon/Icon16/modify_suspended_account_page.png new file mode 100644 index 0000000..f755fb0 Binary files /dev/null and b/asset/icon/Icon16/modify_suspended_account_page.png differ diff --git a/asset/icon/Icon16/module.png b/asset/icon/Icon16/module.png new file mode 100644 index 0000000..4c6563e Binary files /dev/null and b/asset/icon/Icon16/module.png differ diff --git a/asset/icon/Icon16/molecule.png b/asset/icon/Icon16/molecule.png new file mode 100644 index 0000000..e82c3bc Binary files /dev/null and b/asset/icon/Icon16/molecule.png differ diff --git a/asset/icon/Icon16/money.png b/asset/icon/Icon16/money.png new file mode 100644 index 0000000..866a729 Binary files /dev/null and b/asset/icon/Icon16/money.png differ diff --git a/asset/icon/Icon16/money_add.png b/asset/icon/Icon16/money_add.png new file mode 100644 index 0000000..33aeb55 Binary files /dev/null and b/asset/icon/Icon16/money_add.png differ diff --git a/asset/icon/Icon16/money_bag.png b/asset/icon/Icon16/money_bag.png new file mode 100644 index 0000000..44d8ab9 Binary files /dev/null and b/asset/icon/Icon16/money_bag.png differ diff --git a/asset/icon/Icon16/money_bookers.png b/asset/icon/Icon16/money_bookers.png new file mode 100644 index 0000000..66113cd Binary files /dev/null and b/asset/icon/Icon16/money_bookers.png differ diff --git a/asset/icon/Icon16/money_delete.png b/asset/icon/Icon16/money_delete.png new file mode 100644 index 0000000..9e7baea Binary files /dev/null and b/asset/icon/Icon16/money_delete.png differ diff --git a/asset/icon/Icon16/money_dollar.png b/asset/icon/Icon16/money_dollar.png new file mode 100644 index 0000000..423cae1 Binary files /dev/null and b/asset/icon/Icon16/money_dollar.png differ diff --git a/asset/icon/Icon16/money_euro.png b/asset/icon/Icon16/money_euro.png new file mode 100644 index 0000000..fc0ab31 Binary files /dev/null and b/asset/icon/Icon16/money_euro.png differ diff --git a/asset/icon/Icon16/money_in_envelope.png b/asset/icon/Icon16/money_in_envelope.png new file mode 100644 index 0000000..92a040d Binary files /dev/null and b/asset/icon/Icon16/money_in_envelope.png differ diff --git a/asset/icon/Icon16/money_pound.png b/asset/icon/Icon16/money_pound.png new file mode 100644 index 0000000..a911071 Binary files /dev/null and b/asset/icon/Icon16/money_pound.png differ diff --git a/asset/icon/Icon16/money_yen.png b/asset/icon/Icon16/money_yen.png new file mode 100644 index 0000000..532f73f Binary files /dev/null and b/asset/icon/Icon16/money_yen.png differ diff --git a/asset/icon/Icon16/moneybox.png b/asset/icon/Icon16/moneybox.png new file mode 100644 index 0000000..8de8119 Binary files /dev/null and b/asset/icon/Icon16/moneybox.png differ diff --git a/asset/icon/Icon16/monitor.png b/asset/icon/Icon16/monitor.png new file mode 100644 index 0000000..c6ca8ee Binary files /dev/null and b/asset/icon/Icon16/monitor.png differ diff --git a/asset/icon/Icon16/monitor_add.png b/asset/icon/Icon16/monitor_add.png new file mode 100644 index 0000000..baa51ab Binary files /dev/null and b/asset/icon/Icon16/monitor_add.png differ diff --git a/asset/icon/Icon16/monitor_delete.png b/asset/icon/Icon16/monitor_delete.png new file mode 100644 index 0000000..a8767ae Binary files /dev/null and b/asset/icon/Icon16/monitor_delete.png differ diff --git a/asset/icon/Icon16/monitor_edit.png b/asset/icon/Icon16/monitor_edit.png new file mode 100644 index 0000000..4c3c196 Binary files /dev/null and b/asset/icon/Icon16/monitor_edit.png differ diff --git a/asset/icon/Icon16/monitor_error.png b/asset/icon/Icon16/monitor_error.png new file mode 100644 index 0000000..fd43f37 Binary files /dev/null and b/asset/icon/Icon16/monitor_error.png differ diff --git a/asset/icon/Icon16/monitor_go.png b/asset/icon/Icon16/monitor_go.png new file mode 100644 index 0000000..cca7f0a Binary files /dev/null and b/asset/icon/Icon16/monitor_go.png differ diff --git a/asset/icon/Icon16/monitor_lightning.png b/asset/icon/Icon16/monitor_lightning.png new file mode 100644 index 0000000..310744a Binary files /dev/null and b/asset/icon/Icon16/monitor_lightning.png differ diff --git a/asset/icon/Icon16/monitor_link.png b/asset/icon/Icon16/monitor_link.png new file mode 100644 index 0000000..e4ba988 Binary files /dev/null and b/asset/icon/Icon16/monitor_link.png differ diff --git a/asset/icon/Icon16/monitor_screensaver.png b/asset/icon/Icon16/monitor_screensaver.png new file mode 100644 index 0000000..01019c4 Binary files /dev/null and b/asset/icon/Icon16/monitor_screensaver.png differ diff --git a/asset/icon/Icon16/monitor_sidebar.png b/asset/icon/Icon16/monitor_sidebar.png new file mode 100644 index 0000000..8de6364 Binary files /dev/null and b/asset/icon/Icon16/monitor_sidebar.png differ diff --git a/asset/icon/Icon16/monitor_wallpaper.png b/asset/icon/Icon16/monitor_wallpaper.png new file mode 100644 index 0000000..07ab8e9 Binary files /dev/null and b/asset/icon/Icon16/monitor_wallpaper.png differ diff --git a/asset/icon/Icon16/monitor_window.png b/asset/icon/Icon16/monitor_window.png new file mode 100644 index 0000000..3d3a878 Binary files /dev/null and b/asset/icon/Icon16/monitor_window.png differ diff --git a/asset/icon/Icon16/monitor_window_3d.png b/asset/icon/Icon16/monitor_window_3d.png new file mode 100644 index 0000000..fa7f330 Binary files /dev/null and b/asset/icon/Icon16/monitor_window_3d.png differ diff --git a/asset/icon/Icon16/monitor_window_flow.png b/asset/icon/Icon16/monitor_window_flow.png new file mode 100644 index 0000000..fc5dd6a Binary files /dev/null and b/asset/icon/Icon16/monitor_window_flow.png differ diff --git a/asset/icon/Icon16/moon.png b/asset/icon/Icon16/moon.png new file mode 100644 index 0000000..f9900a1 Binary files /dev/null and b/asset/icon/Icon16/moon.png differ diff --git a/asset/icon/Icon16/more_exports.png b/asset/icon/Icon16/more_exports.png new file mode 100644 index 0000000..9a87a1e Binary files /dev/null and b/asset/icon/Icon16/more_exports.png differ diff --git a/asset/icon/Icon16/more_form.png b/asset/icon/Icon16/more_form.png new file mode 100644 index 0000000..6338dae Binary files /dev/null and b/asset/icon/Icon16/more_form.png differ diff --git a/asset/icon/Icon16/more_imports.png b/asset/icon/Icon16/more_imports.png new file mode 100644 index 0000000..d56ceff Binary files /dev/null and b/asset/icon/Icon16/more_imports.png differ diff --git a/asset/icon/Icon16/mosque.png b/asset/icon/Icon16/mosque.png new file mode 100644 index 0000000..e8d898e Binary files /dev/null and b/asset/icon/Icon16/mosque.png differ diff --git a/asset/icon/Icon16/motherboard.png b/asset/icon/Icon16/motherboard.png new file mode 100644 index 0000000..5174f20 Binary files /dev/null and b/asset/icon/Icon16/motherboard.png differ diff --git a/asset/icon/Icon16/mouse.png b/asset/icon/Icon16/mouse.png new file mode 100644 index 0000000..8bdc313 Binary files /dev/null and b/asset/icon/Icon16/mouse.png differ diff --git a/asset/icon/Icon16/mouse_2.png b/asset/icon/Icon16/mouse_2.png new file mode 100644 index 0000000..6e82633 Binary files /dev/null and b/asset/icon/Icon16/mouse_2.png differ diff --git a/asset/icon/Icon16/mouse_add.png b/asset/icon/Icon16/mouse_add.png new file mode 100644 index 0000000..33b71c0 Binary files /dev/null and b/asset/icon/Icon16/mouse_add.png differ diff --git a/asset/icon/Icon16/mouse_delete.png b/asset/icon/Icon16/mouse_delete.png new file mode 100644 index 0000000..72b4840 Binary files /dev/null and b/asset/icon/Icon16/mouse_delete.png differ diff --git a/asset/icon/Icon16/mouse_error.png b/asset/icon/Icon16/mouse_error.png new file mode 100644 index 0000000..0c7c945 Binary files /dev/null and b/asset/icon/Icon16/mouse_error.png differ diff --git a/asset/icon/Icon16/mouse_select_left.png b/asset/icon/Icon16/mouse_select_left.png new file mode 100644 index 0000000..40c70d3 Binary files /dev/null and b/asset/icon/Icon16/mouse_select_left.png differ diff --git a/asset/icon/Icon16/mouse_select_right.png b/asset/icon/Icon16/mouse_select_right.png new file mode 100644 index 0000000..c93a688 Binary files /dev/null and b/asset/icon/Icon16/mouse_select_right.png differ diff --git a/asset/icon/Icon16/mouse_select_scroll.png b/asset/icon/Icon16/mouse_select_scroll.png new file mode 100644 index 0000000..4b44567 Binary files /dev/null and b/asset/icon/Icon16/mouse_select_scroll.png differ diff --git a/asset/icon/Icon16/move_to_folder.png b/asset/icon/Icon16/move_to_folder.png new file mode 100644 index 0000000..7f76634 Binary files /dev/null and b/asset/icon/Icon16/move_to_folder.png differ diff --git a/asset/icon/Icon16/movies.png b/asset/icon/Icon16/movies.png new file mode 100644 index 0000000..db97e5b Binary files /dev/null and b/asset/icon/Icon16/movies.png differ diff --git a/asset/icon/Icon16/ms_exchange.png b/asset/icon/Icon16/ms_exchange.png new file mode 100644 index 0000000..be21ab3 Binary files /dev/null and b/asset/icon/Icon16/ms_exchange.png differ diff --git a/asset/icon/Icon16/ms_frontpage.png b/asset/icon/Icon16/ms_frontpage.png new file mode 100644 index 0000000..7aa6701 Binary files /dev/null and b/asset/icon/Icon16/ms_frontpage.png differ diff --git a/asset/icon/Icon16/msn_messenger.png b/asset/icon/Icon16/msn_messenger.png new file mode 100644 index 0000000..88c4077 Binary files /dev/null and b/asset/icon/Icon16/msn_messenger.png differ diff --git a/asset/icon/Icon16/multilevel_list.png b/asset/icon/Icon16/multilevel_list.png new file mode 100644 index 0000000..f6aa4b4 Binary files /dev/null and b/asset/icon/Icon16/multilevel_list.png differ diff --git a/asset/icon/Icon16/multiplied_by_10.png b/asset/icon/Icon16/multiplied_by_10.png new file mode 100644 index 0000000..70e0f39 Binary files /dev/null and b/asset/icon/Icon16/multiplied_by_10.png differ diff --git a/asset/icon/Icon16/multiplied_by_100.png b/asset/icon/Icon16/multiplied_by_100.png new file mode 100644 index 0000000..b63e03c Binary files /dev/null and b/asset/icon/Icon16/multiplied_by_100.png differ diff --git a/asset/icon/Icon16/multiplied_by_2.png b/asset/icon/Icon16/multiplied_by_2.png new file mode 100644 index 0000000..2a4eceb Binary files /dev/null and b/asset/icon/Icon16/multiplied_by_2.png differ diff --git a/asset/icon/Icon16/multiplied_by_3.png b/asset/icon/Icon16/multiplied_by_3.png new file mode 100644 index 0000000..0ea97ee Binary files /dev/null and b/asset/icon/Icon16/multiplied_by_3.png differ diff --git a/asset/icon/Icon16/multiplied_by_5.png b/asset/icon/Icon16/multiplied_by_5.png new file mode 100644 index 0000000..6ed911e Binary files /dev/null and b/asset/icon/Icon16/multiplied_by_5.png differ diff --git a/asset/icon/Icon16/multitool.png b/asset/icon/Icon16/multitool.png new file mode 100644 index 0000000..ef36098 Binary files /dev/null and b/asset/icon/Icon16/multitool.png differ diff --git a/asset/icon/Icon16/mushroom.png b/asset/icon/Icon16/mushroom.png new file mode 100644 index 0000000..f48428e Binary files /dev/null and b/asset/icon/Icon16/mushroom.png differ diff --git a/asset/icon/Icon16/music.png b/asset/icon/Icon16/music.png new file mode 100644 index 0000000..e8c20b9 Binary files /dev/null and b/asset/icon/Icon16/music.png differ diff --git a/asset/icon/Icon16/mustache.png b/asset/icon/Icon16/mustache.png new file mode 100644 index 0000000..56f74f7 Binary files /dev/null and b/asset/icon/Icon16/mustache.png differ diff --git a/asset/icon/Icon16/mx_entry.png b/asset/icon/Icon16/mx_entry.png new file mode 100644 index 0000000..6590abe Binary files /dev/null and b/asset/icon/Icon16/mx_entry.png differ diff --git a/asset/icon/Icon16/my_name_is_e.png b/asset/icon/Icon16/my_name_is_e.png new file mode 100644 index 0000000..3163c0b Binary files /dev/null and b/asset/icon/Icon16/my_name_is_e.png differ diff --git a/asset/icon/Icon16/myspace.png b/asset/icon/Icon16/myspace.png new file mode 100644 index 0000000..b09ba4f Binary files /dev/null and b/asset/icon/Icon16/myspace.png differ diff --git a/asset/icon/Icon16/mysql_wizard.png b/asset/icon/Icon16/mysql_wizard.png new file mode 100644 index 0000000..a61787c Binary files /dev/null and b/asset/icon/Icon16/mysql_wizard.png differ diff --git a/asset/icon/Icon16/name_manager.png b/asset/icon/Icon16/name_manager.png new file mode 100644 index 0000000..2c4f093 Binary files /dev/null and b/asset/icon/Icon16/name_manager.png differ diff --git a/asset/icon/Icon16/nameboard_open.png b/asset/icon/Icon16/nameboard_open.png new file mode 100644 index 0000000..238c266 Binary files /dev/null and b/asset/icon/Icon16/nameboard_open.png differ diff --git a/asset/icon/Icon16/named_macro.png b/asset/icon/Icon16/named_macro.png new file mode 100644 index 0000000..b7bf2df Binary files /dev/null and b/asset/icon/Icon16/named_macro.png differ diff --git a/asset/icon/Icon16/navigation.png b/asset/icon/Icon16/navigation.png new file mode 100644 index 0000000..10fca90 Binary files /dev/null and b/asset/icon/Icon16/navigation.png differ diff --git a/asset/icon/Icon16/navigator_pane.png b/asset/icon/Icon16/navigator_pane.png new file mode 100644 index 0000000..a00e502 Binary files /dev/null and b/asset/icon/Icon16/navigator_pane.png differ diff --git a/asset/icon/Icon16/netvibes.png b/asset/icon/Icon16/netvibes.png new file mode 100644 index 0000000..3489efa Binary files /dev/null and b/asset/icon/Icon16/netvibes.png differ diff --git a/asset/icon/Icon16/network_adapter.png b/asset/icon/Icon16/network_adapter.png new file mode 100644 index 0000000..76e6c2f Binary files /dev/null and b/asset/icon/Icon16/network_adapter.png differ diff --git a/asset/icon/Icon16/network_cloud.png b/asset/icon/Icon16/network_cloud.png new file mode 100644 index 0000000..51fce7e Binary files /dev/null and b/asset/icon/Icon16/network_cloud.png differ diff --git a/asset/icon/Icon16/network_clouds.png b/asset/icon/Icon16/network_clouds.png new file mode 100644 index 0000000..409da2b Binary files /dev/null and b/asset/icon/Icon16/network_clouds.png differ diff --git a/asset/icon/Icon16/network_ethernet.png b/asset/icon/Icon16/network_ethernet.png new file mode 100644 index 0000000..01b1d4c Binary files /dev/null and b/asset/icon/Icon16/network_ethernet.png differ diff --git a/asset/icon/Icon16/network_firewall.png b/asset/icon/Icon16/network_firewall.png new file mode 100644 index 0000000..a3add67 Binary files /dev/null and b/asset/icon/Icon16/network_firewall.png differ diff --git a/asset/icon/Icon16/network_folder.png b/asset/icon/Icon16/network_folder.png new file mode 100644 index 0000000..5d13101 Binary files /dev/null and b/asset/icon/Icon16/network_folder.png differ diff --git a/asset/icon/Icon16/network_hub.png b/asset/icon/Icon16/network_hub.png new file mode 100644 index 0000000..ea03cdc Binary files /dev/null and b/asset/icon/Icon16/network_hub.png differ diff --git a/asset/icon/Icon16/network_ip.png b/asset/icon/Icon16/network_ip.png new file mode 100644 index 0000000..0d01700 Binary files /dev/null and b/asset/icon/Icon16/network_ip.png differ diff --git a/asset/icon/Icon16/network_tools.png b/asset/icon/Icon16/network_tools.png new file mode 100644 index 0000000..8ee1561 Binary files /dev/null and b/asset/icon/Icon16/network_tools.png differ diff --git a/asset/icon/Icon16/network_wireless.png b/asset/icon/Icon16/network_wireless.png new file mode 100644 index 0000000..ec5fe7f Binary files /dev/null and b/asset/icon/Icon16/network_wireless.png differ diff --git a/asset/icon/Icon16/networking.png b/asset/icon/Icon16/networking.png new file mode 100644 index 0000000..b01070a Binary files /dev/null and b/asset/icon/Icon16/networking.png differ diff --git a/asset/icon/Icon16/networking_green.png b/asset/icon/Icon16/networking_green.png new file mode 100644 index 0000000..e99762b Binary files /dev/null and b/asset/icon/Icon16/networking_green.png differ diff --git a/asset/icon/Icon16/networking_red.png b/asset/icon/Icon16/networking_red.png new file mode 100644 index 0000000..924445e Binary files /dev/null and b/asset/icon/Icon16/networking_red.png differ diff --git a/asset/icon/Icon16/new.png b/asset/icon/Icon16/new.png new file mode 100644 index 0000000..eb81c5e Binary files /dev/null and b/asset/icon/Icon16/new.png differ diff --git a/asset/icon/Icon16/new_comment.png b/asset/icon/Icon16/new_comment.png new file mode 100644 index 0000000..cb0dc38 Binary files /dev/null and b/asset/icon/Icon16/new_comment.png differ diff --git a/asset/icon/Icon16/new_data.png b/asset/icon/Icon16/new_data.png new file mode 100644 index 0000000..e563fb3 Binary files /dev/null and b/asset/icon/Icon16/new_data.png differ diff --git a/asset/icon/Icon16/new_email.png b/asset/icon/Icon16/new_email.png new file mode 100644 index 0000000..98d2417 Binary files /dev/null and b/asset/icon/Icon16/new_email.png differ diff --git a/asset/icon/Icon16/new_slide.png b/asset/icon/Icon16/new_slide.png new file mode 100644 index 0000000..c65f1f2 Binary files /dev/null and b/asset/icon/Icon16/new_slide.png differ diff --git a/asset/icon/Icon16/new_window.png b/asset/icon/Icon16/new_window.png new file mode 100644 index 0000000..8da3ac4 Binary files /dev/null and b/asset/icon/Icon16/new_window.png differ diff --git a/asset/icon/Icon16/newspaper.png b/asset/icon/Icon16/newspaper.png new file mode 100644 index 0000000..22e5b23 Binary files /dev/null and b/asset/icon/Icon16/newspaper.png differ diff --git a/asset/icon/Icon16/newspaper_add.png b/asset/icon/Icon16/newspaper_add.png new file mode 100644 index 0000000..c2084aa Binary files /dev/null and b/asset/icon/Icon16/newspaper_add.png differ diff --git a/asset/icon/Icon16/newspaper_delete.png b/asset/icon/Icon16/newspaper_delete.png new file mode 100644 index 0000000..44c9c36 Binary files /dev/null and b/asset/icon/Icon16/newspaper_delete.png differ diff --git a/asset/icon/Icon16/newspaper_go.png b/asset/icon/Icon16/newspaper_go.png new file mode 100644 index 0000000..6400011 Binary files /dev/null and b/asset/icon/Icon16/newspaper_go.png differ diff --git a/asset/icon/Icon16/newspaper_link.png b/asset/icon/Icon16/newspaper_link.png new file mode 100644 index 0000000..e4d77e3 Binary files /dev/null and b/asset/icon/Icon16/newspaper_link.png differ diff --git a/asset/icon/Icon16/newsvine.png b/asset/icon/Icon16/newsvine.png new file mode 100644 index 0000000..d5a8915 Binary files /dev/null and b/asset/icon/Icon16/newsvine.png differ diff --git a/asset/icon/Icon16/next_comment.png b/asset/icon/Icon16/next_comment.png new file mode 100644 index 0000000..82f4b69 Binary files /dev/null and b/asset/icon/Icon16/next_comment.png differ diff --git a/asset/icon/Icon16/next_footnote.png b/asset/icon/Icon16/next_footnote.png new file mode 100644 index 0000000..451dd1b Binary files /dev/null and b/asset/icon/Icon16/next_footnote.png differ diff --git a/asset/icon/Icon16/next_markup.png b/asset/icon/Icon16/next_markup.png new file mode 100644 index 0000000..4c9d99d Binary files /dev/null and b/asset/icon/Icon16/next_markup.png differ diff --git a/asset/icon/Icon16/next_seven_days.png b/asset/icon/Icon16/next_seven_days.png new file mode 100644 index 0000000..a917f8a Binary files /dev/null and b/asset/icon/Icon16/next_seven_days.png differ diff --git a/asset/icon/Icon16/no_commercial.png b/asset/icon/Icon16/no_commercial.png new file mode 100644 index 0000000..e7ce444 Binary files /dev/null and b/asset/icon/Icon16/no_commercial.png differ diff --git a/asset/icon/Icon16/no_drm_trm.png b/asset/icon/Icon16/no_drm_trm.png new file mode 100644 index 0000000..4ec7599 Binary files /dev/null and b/asset/icon/Icon16/no_drm_trm.png differ diff --git a/asset/icon/Icon16/no_image.png b/asset/icon/Icon16/no_image.png new file mode 100644 index 0000000..3141756 Binary files /dev/null and b/asset/icon/Icon16/no_image.png differ diff --git a/asset/icon/Icon16/no_requirements.png b/asset/icon/Icon16/no_requirements.png new file mode 100644 index 0000000..03a65ef Binary files /dev/null and b/asset/icon/Icon16/no_requirements.png differ diff --git a/asset/icon/Icon16/no_smoking.png b/asset/icon/Icon16/no_smoking.png new file mode 100644 index 0000000..e37cd1e Binary files /dev/null and b/asset/icon/Icon16/no_smoking.png differ diff --git a/asset/icon/Icon16/node.png b/asset/icon/Icon16/node.png new file mode 100644 index 0000000..d6b7258 Binary files /dev/null and b/asset/icon/Icon16/node.png differ diff --git a/asset/icon/Icon16/node_design.png b/asset/icon/Icon16/node_design.png new file mode 100644 index 0000000..c2a0fa7 Binary files /dev/null and b/asset/icon/Icon16/node_design.png differ diff --git a/asset/icon/Icon16/node_magnifier.png b/asset/icon/Icon16/node_magnifier.png new file mode 100644 index 0000000..12c0c72 Binary files /dev/null and b/asset/icon/Icon16/node_magnifier.png differ diff --git a/asset/icon/Icon16/nokia_s60.png b/asset/icon/Icon16/nokia_s60.png new file mode 100644 index 0000000..62c9000 Binary files /dev/null and b/asset/icon/Icon16/nokia_s60.png differ diff --git a/asset/icon/Icon16/non_derivative.png b/asset/icon/Icon16/non_derivative.png new file mode 100644 index 0000000..1df3d1f Binary files /dev/null and b/asset/icon/Icon16/non_derivative.png differ diff --git a/asset/icon/Icon16/note.png b/asset/icon/Icon16/note.png new file mode 100644 index 0000000..a9db17a Binary files /dev/null and b/asset/icon/Icon16/note.png differ diff --git a/asset/icon/Icon16/note_add.png b/asset/icon/Icon16/note_add.png new file mode 100644 index 0000000..4ae3ae8 Binary files /dev/null and b/asset/icon/Icon16/note_add.png differ diff --git a/asset/icon/Icon16/note_delete.png b/asset/icon/Icon16/note_delete.png new file mode 100644 index 0000000..87b8c7a Binary files /dev/null and b/asset/icon/Icon16/note_delete.png differ diff --git a/asset/icon/Icon16/note_edit.png b/asset/icon/Icon16/note_edit.png new file mode 100644 index 0000000..93e1b62 Binary files /dev/null and b/asset/icon/Icon16/note_edit.png differ diff --git a/asset/icon/Icon16/note_error.png b/asset/icon/Icon16/note_error.png new file mode 100644 index 0000000..11ffd7a Binary files /dev/null and b/asset/icon/Icon16/note_error.png differ diff --git a/asset/icon/Icon16/note_go.png b/asset/icon/Icon16/note_go.png new file mode 100644 index 0000000..b6d72fc Binary files /dev/null and b/asset/icon/Icon16/note_go.png differ diff --git a/asset/icon/Icon16/note_pin.png b/asset/icon/Icon16/note_pin.png new file mode 100644 index 0000000..07d6c45 Binary files /dev/null and b/asset/icon/Icon16/note_pin.png differ diff --git a/asset/icon/Icon16/note_torn.png b/asset/icon/Icon16/note_torn.png new file mode 100644 index 0000000..f0758fd Binary files /dev/null and b/asset/icon/Icon16/note_torn.png differ diff --git a/asset/icon/Icon16/notes_pages.png b/asset/icon/Icon16/notes_pages.png new file mode 100644 index 0000000..e13d1f8 Binary files /dev/null and b/asset/icon/Icon16/notes_pages.png differ diff --git a/asset/icon/Icon16/notes_pin.png b/asset/icon/Icon16/notes_pin.png new file mode 100644 index 0000000..f1fcfaa Binary files /dev/null and b/asset/icon/Icon16/notes_pin.png differ diff --git a/asset/icon/Icon16/notes_styles.png b/asset/icon/Icon16/notes_styles.png new file mode 100644 index 0000000..0626a4e Binary files /dev/null and b/asset/icon/Icon16/notes_styles.png differ diff --git a/asset/icon/Icon16/numeric_stepper.png b/asset/icon/Icon16/numeric_stepper.png new file mode 100644 index 0000000..6ebb1d5 Binary files /dev/null and b/asset/icon/Icon16/numeric_stepper.png differ diff --git a/asset/icon/Icon16/object_dependencies.png b/asset/icon/Icon16/object_dependencies.png new file mode 100644 index 0000000..5a68a4a Binary files /dev/null and b/asset/icon/Icon16/object_dependencies.png differ diff --git a/asset/icon/Icon16/object_insert.png b/asset/icon/Icon16/object_insert.png new file mode 100644 index 0000000..d690e78 Binary files /dev/null and b/asset/icon/Icon16/object_insert.png differ diff --git a/asset/icon/Icon16/odata.png b/asset/icon/Icon16/odata.png new file mode 100644 index 0000000..7a0bc42 Binary files /dev/null and b/asset/icon/Icon16/odata.png differ diff --git a/asset/icon/Icon16/odbs_database.png b/asset/icon/Icon16/odbs_database.png new file mode 100644 index 0000000..f9f96b0 Binary files /dev/null and b/asset/icon/Icon16/odbs_database.png differ diff --git a/asset/icon/Icon16/office_apps.png b/asset/icon/Icon16/office_apps.png new file mode 100644 index 0000000..be087c4 Binary files /dev/null and b/asset/icon/Icon16/office_apps.png differ diff --git a/asset/icon/Icon16/oil.png b/asset/icon/Icon16/oil.png new file mode 100644 index 0000000..43d6618 Binary files /dev/null and b/asset/icon/Icon16/oil.png differ diff --git a/asset/icon/Icon16/oil_barrel.png b/asset/icon/Icon16/oil_barrel.png new file mode 100644 index 0000000..ffeb741 Binary files /dev/null and b/asset/icon/Icon16/oil_barrel.png differ diff --git a/asset/icon/Icon16/omelet.png b/asset/icon/Icon16/omelet.png new file mode 100644 index 0000000..bd97d22 Binary files /dev/null and b/asset/icon/Icon16/omelet.png differ diff --git a/asset/icon/Icon16/online_video_insert.png b/asset/icon/Icon16/online_video_insert.png new file mode 100644 index 0000000..e029a05 Binary files /dev/null and b/asset/icon/Icon16/online_video_insert.png differ diff --git a/asset/icon/Icon16/open_folder.png b/asset/icon/Icon16/open_folder.png new file mode 100644 index 0000000..6e7b40e Binary files /dev/null and b/asset/icon/Icon16/open_folder.png differ diff --git a/asset/icon/Icon16/open_share.png b/asset/icon/Icon16/open_share.png new file mode 100644 index 0000000..d3f0713 Binary files /dev/null and b/asset/icon/Icon16/open_share.png differ diff --git a/asset/icon/Icon16/open_source.png b/asset/icon/Icon16/open_source.png new file mode 100644 index 0000000..b5ff888 Binary files /dev/null and b/asset/icon/Icon16/open_source.png differ diff --git a/asset/icon/Icon16/open_suse.png b/asset/icon/Icon16/open_suse.png new file mode 100644 index 0000000..92b54a3 Binary files /dev/null and b/asset/icon/Icon16/open_suse.png differ diff --git a/asset/icon/Icon16/openid.png b/asset/icon/Icon16/openid.png new file mode 100644 index 0000000..f6716a4 Binary files /dev/null and b/asset/icon/Icon16/openid.png differ diff --git a/asset/icon/Icon16/opera.png b/asset/icon/Icon16/opera.png new file mode 100644 index 0000000..823d814 Binary files /dev/null and b/asset/icon/Icon16/opera.png differ diff --git a/asset/icon/Icon16/opml.png b/asset/icon/Icon16/opml.png new file mode 100644 index 0000000..07d67d5 Binary files /dev/null and b/asset/icon/Icon16/opml.png differ diff --git a/asset/icon/Icon16/ops.png b/asset/icon/Icon16/ops.png new file mode 100644 index 0000000..49a86d6 Binary files /dev/null and b/asset/icon/Icon16/ops.png differ diff --git a/asset/icon/Icon16/orbit.png b/asset/icon/Icon16/orbit.png new file mode 100644 index 0000000..9f92324 Binary files /dev/null and b/asset/icon/Icon16/orbit.png differ diff --git a/asset/icon/Icon16/origami.png b/asset/icon/Icon16/origami.png new file mode 100644 index 0000000..70def73 Binary files /dev/null and b/asset/icon/Icon16/origami.png differ diff --git a/asset/icon/Icon16/orkut.png b/asset/icon/Icon16/orkut.png new file mode 100644 index 0000000..1f09e0f Binary files /dev/null and b/asset/icon/Icon16/orkut.png differ diff --git a/asset/icon/Icon16/ornament_gold.png b/asset/icon/Icon16/ornament_gold.png new file mode 100644 index 0000000..9f64c98 Binary files /dev/null and b/asset/icon/Icon16/ornament_gold.png differ diff --git a/asset/icon/Icon16/orthodox_church.png b/asset/icon/Icon16/orthodox_church.png new file mode 100644 index 0000000..3a569c7 Binary files /dev/null and b/asset/icon/Icon16/orthodox_church.png differ diff --git a/asset/icon/Icon16/other_fields.png b/asset/icon/Icon16/other_fields.png new file mode 100644 index 0000000..60d82c2 Binary files /dev/null and b/asset/icon/Icon16/other_fields.png differ diff --git a/asset/icon/Icon16/other_functions.png b/asset/icon/Icon16/other_functions.png new file mode 100644 index 0000000..50ad2a2 Binary files /dev/null and b/asset/icon/Icon16/other_functions.png differ diff --git a/asset/icon/Icon16/other_phone.png b/asset/icon/Icon16/other_phone.png new file mode 100644 index 0000000..9a33362 Binary files /dev/null and b/asset/icon/Icon16/other_phone.png differ diff --git a/asset/icon/Icon16/outlook_calendar_day.png b/asset/icon/Icon16/outlook_calendar_day.png new file mode 100644 index 0000000..2bd46ab Binary files /dev/null and b/asset/icon/Icon16/outlook_calendar_day.png differ diff --git a/asset/icon/Icon16/outlook_calendar_month.png b/asset/icon/Icon16/outlook_calendar_month.png new file mode 100644 index 0000000..92eea9d Binary files /dev/null and b/asset/icon/Icon16/outlook_calendar_month.png differ diff --git a/asset/icon/Icon16/outlook_calendar_shedule_view.png b/asset/icon/Icon16/outlook_calendar_shedule_view.png new file mode 100644 index 0000000..f5fb1b2 Binary files /dev/null and b/asset/icon/Icon16/outlook_calendar_shedule_view.png differ diff --git a/asset/icon/Icon16/outlook_calendar_week.png b/asset/icon/Icon16/outlook_calendar_week.png new file mode 100644 index 0000000..ab5803a Binary files /dev/null and b/asset/icon/Icon16/outlook_calendar_week.png differ diff --git a/asset/icon/Icon16/outlook_calendar_work_week.png b/asset/icon/Icon16/outlook_calendar_work_week.png new file mode 100644 index 0000000..dfb8bdb Binary files /dev/null and b/asset/icon/Icon16/outlook_calendar_work_week.png differ diff --git a/asset/icon/Icon16/outlook_cancel_all.png b/asset/icon/Icon16/outlook_cancel_all.png new file mode 100644 index 0000000..960d29f Binary files /dev/null and b/asset/icon/Icon16/outlook_cancel_all.png differ diff --git a/asset/icon/Icon16/outlook_change_view.png b/asset/icon/Icon16/outlook_change_view.png new file mode 100644 index 0000000..2c9a0e5 Binary files /dev/null and b/asset/icon/Icon16/outlook_change_view.png differ diff --git a/asset/icon/Icon16/outlook_clean_up.png b/asset/icon/Icon16/outlook_clean_up.png new file mode 100644 index 0000000..f036ef7 Binary files /dev/null and b/asset/icon/Icon16/outlook_clean_up.png differ diff --git a/asset/icon/Icon16/outlook_delete_all.png b/asset/icon/Icon16/outlook_delete_all.png new file mode 100644 index 0000000..c561782 Binary files /dev/null and b/asset/icon/Icon16/outlook_delete_all.png differ diff --git a/asset/icon/Icon16/outlook_ignore_email.png b/asset/icon/Icon16/outlook_ignore_email.png new file mode 100644 index 0000000..a4eee78 Binary files /dev/null and b/asset/icon/Icon16/outlook_ignore_email.png differ diff --git a/asset/icon/Icon16/outlook_meeting.png b/asset/icon/Icon16/outlook_meeting.png new file mode 100644 index 0000000..d465e09 Binary files /dev/null and b/asset/icon/Icon16/outlook_meeting.png differ diff --git a/asset/icon/Icon16/outlook_more.png b/asset/icon/Icon16/outlook_more.png new file mode 100644 index 0000000..417cbb1 Binary files /dev/null and b/asset/icon/Icon16/outlook_more.png differ diff --git a/asset/icon/Icon16/outlook_new_items.png b/asset/icon/Icon16/outlook_new_items.png new file mode 100644 index 0000000..78a4f8d Binary files /dev/null and b/asset/icon/Icon16/outlook_new_items.png differ diff --git a/asset/icon/Icon16/outlook_new_meeting.png b/asset/icon/Icon16/outlook_new_meeting.png new file mode 100644 index 0000000..7ca9eed Binary files /dev/null and b/asset/icon/Icon16/outlook_new_meeting.png differ diff --git a/asset/icon/Icon16/outlook_reply.png b/asset/icon/Icon16/outlook_reply.png new file mode 100644 index 0000000..65851b1 Binary files /dev/null and b/asset/icon/Icon16/outlook_reply.png differ diff --git a/asset/icon/Icon16/outlook_reply_all.png b/asset/icon/Icon16/outlook_reply_all.png new file mode 100644 index 0000000..86412f8 Binary files /dev/null and b/asset/icon/Icon16/outlook_reply_all.png differ diff --git a/asset/icon/Icon16/outlook_reset_view.png b/asset/icon/Icon16/outlook_reset_view.png new file mode 100644 index 0000000..c199e38 Binary files /dev/null and b/asset/icon/Icon16/outlook_reset_view.png differ diff --git a/asset/icon/Icon16/outlook_rules.png b/asset/icon/Icon16/outlook_rules.png new file mode 100644 index 0000000..886ee81 Binary files /dev/null and b/asset/icon/Icon16/outlook_rules.png differ diff --git a/asset/icon/Icon16/outlook_show_progress.png b/asset/icon/Icon16/outlook_show_progress.png new file mode 100644 index 0000000..ea274f3 Binary files /dev/null and b/asset/icon/Icon16/outlook_show_progress.png differ diff --git a/asset/icon/Icon16/outlook_view_setting.png b/asset/icon/Icon16/outlook_view_setting.png new file mode 100644 index 0000000..b158824 Binary files /dev/null and b/asset/icon/Icon16/outlook_view_setting.png differ diff --git a/asset/icon/Icon16/package.png b/asset/icon/Icon16/package.png new file mode 100644 index 0000000..5c93c4f Binary files /dev/null and b/asset/icon/Icon16/package.png differ diff --git a/asset/icon/Icon16/package_add.png b/asset/icon/Icon16/package_add.png new file mode 100644 index 0000000..8016a13 Binary files /dev/null and b/asset/icon/Icon16/package_add.png differ diff --git a/asset/icon/Icon16/package_delete.png b/asset/icon/Icon16/package_delete.png new file mode 100644 index 0000000..6053e53 Binary files /dev/null and b/asset/icon/Icon16/package_delete.png differ diff --git a/asset/icon/Icon16/package_go.png b/asset/icon/Icon16/package_go.png new file mode 100644 index 0000000..cd66ee8 Binary files /dev/null and b/asset/icon/Icon16/package_go.png differ diff --git a/asset/icon/Icon16/package_green.png b/asset/icon/Icon16/package_green.png new file mode 100644 index 0000000..268e269 Binary files /dev/null and b/asset/icon/Icon16/package_green.png differ diff --git a/asset/icon/Icon16/package_link.png b/asset/icon/Icon16/package_link.png new file mode 100644 index 0000000..5b6a6ff Binary files /dev/null and b/asset/icon/Icon16/package_link.png differ diff --git a/asset/icon/Icon16/page.png b/asset/icon/Icon16/page.png new file mode 100644 index 0000000..018816b Binary files /dev/null and b/asset/icon/Icon16/page.png differ diff --git a/asset/icon/Icon16/page_add.png b/asset/icon/Icon16/page_add.png new file mode 100644 index 0000000..8bb66df Binary files /dev/null and b/asset/icon/Icon16/page_add.png differ diff --git a/asset/icon/Icon16/page_attach.png b/asset/icon/Icon16/page_attach.png new file mode 100644 index 0000000..0240b82 Binary files /dev/null and b/asset/icon/Icon16/page_attach.png differ diff --git a/asset/icon/Icon16/page_break.png b/asset/icon/Icon16/page_break.png new file mode 100644 index 0000000..c45ccec Binary files /dev/null and b/asset/icon/Icon16/page_break.png differ diff --git a/asset/icon/Icon16/page_code.png b/asset/icon/Icon16/page_code.png new file mode 100644 index 0000000..9773662 Binary files /dev/null and b/asset/icon/Icon16/page_code.png differ diff --git a/asset/icon/Icon16/page_copy.png b/asset/icon/Icon16/page_copy.png new file mode 100644 index 0000000..a61ec13 Binary files /dev/null and b/asset/icon/Icon16/page_copy.png differ diff --git a/asset/icon/Icon16/page_delete.png b/asset/icon/Icon16/page_delete.png new file mode 100644 index 0000000..09a10dd Binary files /dev/null and b/asset/icon/Icon16/page_delete.png differ diff --git a/asset/icon/Icon16/page_edit.png b/asset/icon/Icon16/page_edit.png new file mode 100644 index 0000000..4ac94c4 Binary files /dev/null and b/asset/icon/Icon16/page_edit.png differ diff --git a/asset/icon/Icon16/page_error.png b/asset/icon/Icon16/page_error.png new file mode 100644 index 0000000..4c8859b Binary files /dev/null and b/asset/icon/Icon16/page_error.png differ diff --git a/asset/icon/Icon16/page_excel.png b/asset/icon/Icon16/page_excel.png new file mode 100644 index 0000000..2db8d88 Binary files /dev/null and b/asset/icon/Icon16/page_excel.png differ diff --git a/asset/icon/Icon16/page_find.png b/asset/icon/Icon16/page_find.png new file mode 100644 index 0000000..3f933c2 Binary files /dev/null and b/asset/icon/Icon16/page_find.png differ diff --git a/asset/icon/Icon16/page_footer.png b/asset/icon/Icon16/page_footer.png new file mode 100644 index 0000000..ba395af Binary files /dev/null and b/asset/icon/Icon16/page_footer.png differ diff --git a/asset/icon/Icon16/page_gear.png b/asset/icon/Icon16/page_gear.png new file mode 100644 index 0000000..464c8c3 Binary files /dev/null and b/asset/icon/Icon16/page_gear.png differ diff --git a/asset/icon/Icon16/page_go.png b/asset/icon/Icon16/page_go.png new file mode 100644 index 0000000..fad87d7 Binary files /dev/null and b/asset/icon/Icon16/page_go.png differ diff --git a/asset/icon/Icon16/page_green.png b/asset/icon/Icon16/page_green.png new file mode 100644 index 0000000..2b6e274 Binary files /dev/null and b/asset/icon/Icon16/page_green.png differ diff --git a/asset/icon/Icon16/page_header.png b/asset/icon/Icon16/page_header.png new file mode 100644 index 0000000..c80941e Binary files /dev/null and b/asset/icon/Icon16/page_header.png differ diff --git a/asset/icon/Icon16/page_key.png b/asset/icon/Icon16/page_key.png new file mode 100644 index 0000000..f25bec6 Binary files /dev/null and b/asset/icon/Icon16/page_key.png differ diff --git a/asset/icon/Icon16/page_lightning.png b/asset/icon/Icon16/page_lightning.png new file mode 100644 index 0000000..c500eff Binary files /dev/null and b/asset/icon/Icon16/page_lightning.png differ diff --git a/asset/icon/Icon16/page_link.png b/asset/icon/Icon16/page_link.png new file mode 100644 index 0000000..cb468de Binary files /dev/null and b/asset/icon/Icon16/page_link.png differ diff --git a/asset/icon/Icon16/page_magnifier.png b/asset/icon/Icon16/page_magnifier.png new file mode 100644 index 0000000..81f8dc6 Binary files /dev/null and b/asset/icon/Icon16/page_magnifier.png differ diff --git a/asset/icon/Icon16/page_number.png b/asset/icon/Icon16/page_number.png new file mode 100644 index 0000000..619a9e3 Binary files /dev/null and b/asset/icon/Icon16/page_number.png differ diff --git a/asset/icon/Icon16/page_orientation.png b/asset/icon/Icon16/page_orientation.png new file mode 100644 index 0000000..cf432b6 Binary files /dev/null and b/asset/icon/Icon16/page_orientation.png differ diff --git a/asset/icon/Icon16/page_paintbrush.png b/asset/icon/Icon16/page_paintbrush.png new file mode 100644 index 0000000..d8ef87f Binary files /dev/null and b/asset/icon/Icon16/page_paintbrush.png differ diff --git a/asset/icon/Icon16/page_paste.png b/asset/icon/Icon16/page_paste.png new file mode 100644 index 0000000..92181c5 Binary files /dev/null and b/asset/icon/Icon16/page_paste.png differ diff --git a/asset/icon/Icon16/page_red.png b/asset/icon/Icon16/page_red.png new file mode 100644 index 0000000..bc6211a Binary files /dev/null and b/asset/icon/Icon16/page_red.png differ diff --git a/asset/icon/Icon16/page_refresh.png b/asset/icon/Icon16/page_refresh.png new file mode 100644 index 0000000..e01e8b3 Binary files /dev/null and b/asset/icon/Icon16/page_refresh.png differ diff --git a/asset/icon/Icon16/page_save.png b/asset/icon/Icon16/page_save.png new file mode 100644 index 0000000..b08686d Binary files /dev/null and b/asset/icon/Icon16/page_save.png differ diff --git a/asset/icon/Icon16/page_size.png b/asset/icon/Icon16/page_size.png new file mode 100644 index 0000000..224acbe Binary files /dev/null and b/asset/icon/Icon16/page_size.png differ diff --git a/asset/icon/Icon16/page_update.png b/asset/icon/Icon16/page_update.png new file mode 100644 index 0000000..31396d6 Binary files /dev/null and b/asset/icon/Icon16/page_update.png differ diff --git a/asset/icon/Icon16/page_white.png b/asset/icon/Icon16/page_white.png new file mode 100644 index 0000000..eda4488 Binary files /dev/null and b/asset/icon/Icon16/page_white.png differ diff --git a/asset/icon/Icon16/page_white_acrobat.png b/asset/icon/Icon16/page_white_acrobat.png new file mode 100644 index 0000000..f162783 Binary files /dev/null and b/asset/icon/Icon16/page_white_acrobat.png differ diff --git a/asset/icon/Icon16/page_white_actionscript.png b/asset/icon/Icon16/page_white_actionscript.png new file mode 100644 index 0000000..f8bb75c Binary files /dev/null and b/asset/icon/Icon16/page_white_actionscript.png differ diff --git a/asset/icon/Icon16/page_white_add.png b/asset/icon/Icon16/page_white_add.png new file mode 100644 index 0000000..af80a4d Binary files /dev/null and b/asset/icon/Icon16/page_white_add.png differ diff --git a/asset/icon/Icon16/page_white_c.png b/asset/icon/Icon16/page_white_c.png new file mode 100644 index 0000000..44045a9 Binary files /dev/null and b/asset/icon/Icon16/page_white_c.png differ diff --git a/asset/icon/Icon16/page_white_camera.png b/asset/icon/Icon16/page_white_camera.png new file mode 100644 index 0000000..5d3e0ef Binary files /dev/null and b/asset/icon/Icon16/page_white_camera.png differ diff --git a/asset/icon/Icon16/page_white_cd.png b/asset/icon/Icon16/page_white_cd.png new file mode 100644 index 0000000..58709e0 Binary files /dev/null and b/asset/icon/Icon16/page_white_cd.png differ diff --git a/asset/icon/Icon16/page_white_code.png b/asset/icon/Icon16/page_white_code.png new file mode 100644 index 0000000..931b0d6 Binary files /dev/null and b/asset/icon/Icon16/page_white_code.png differ diff --git a/asset/icon/Icon16/page_white_code_red.png b/asset/icon/Icon16/page_white_code_red.png new file mode 100644 index 0000000..5d30571 Binary files /dev/null and b/asset/icon/Icon16/page_white_code_red.png differ diff --git a/asset/icon/Icon16/page_white_compress.png b/asset/icon/Icon16/page_white_compress.png new file mode 100644 index 0000000..8713bd0 Binary files /dev/null and b/asset/icon/Icon16/page_white_compress.png differ diff --git a/asset/icon/Icon16/page_white_copy.png b/asset/icon/Icon16/page_white_copy.png new file mode 100644 index 0000000..9c71808 Binary files /dev/null and b/asset/icon/Icon16/page_white_copy.png differ diff --git a/asset/icon/Icon16/page_white_cplusplus.png b/asset/icon/Icon16/page_white_cplusplus.png new file mode 100644 index 0000000..d3f55ee Binary files /dev/null and b/asset/icon/Icon16/page_white_cplusplus.png differ diff --git a/asset/icon/Icon16/page_white_csharp.png b/asset/icon/Icon16/page_white_csharp.png new file mode 100644 index 0000000..8013020 Binary files /dev/null and b/asset/icon/Icon16/page_white_csharp.png differ diff --git a/asset/icon/Icon16/page_white_cup.png b/asset/icon/Icon16/page_white_cup.png new file mode 100644 index 0000000..16620e5 Binary files /dev/null and b/asset/icon/Icon16/page_white_cup.png differ diff --git a/asset/icon/Icon16/page_white_database.png b/asset/icon/Icon16/page_white_database.png new file mode 100644 index 0000000..44b3fd7 Binary files /dev/null and b/asset/icon/Icon16/page_white_database.png differ diff --git a/asset/icon/Icon16/page_white_delete.png b/asset/icon/Icon16/page_white_delete.png new file mode 100644 index 0000000..8fe8138 Binary files /dev/null and b/asset/icon/Icon16/page_white_delete.png differ diff --git a/asset/icon/Icon16/page_white_dvd.png b/asset/icon/Icon16/page_white_dvd.png new file mode 100644 index 0000000..3c4d0d5 Binary files /dev/null and b/asset/icon/Icon16/page_white_dvd.png differ diff --git a/asset/icon/Icon16/page_white_edit.png b/asset/icon/Icon16/page_white_edit.png new file mode 100644 index 0000000..8bc294f Binary files /dev/null and b/asset/icon/Icon16/page_white_edit.png differ diff --git a/asset/icon/Icon16/page_white_error.png b/asset/icon/Icon16/page_white_error.png new file mode 100644 index 0000000..3de13ba Binary files /dev/null and b/asset/icon/Icon16/page_white_error.png differ diff --git a/asset/icon/Icon16/page_white_excel.png b/asset/icon/Icon16/page_white_excel.png new file mode 100644 index 0000000..04e0332 Binary files /dev/null and b/asset/icon/Icon16/page_white_excel.png differ diff --git a/asset/icon/Icon16/page_white_find.png b/asset/icon/Icon16/page_white_find.png new file mode 100644 index 0000000..28f7c18 Binary files /dev/null and b/asset/icon/Icon16/page_white_find.png differ diff --git a/asset/icon/Icon16/page_white_flash.png b/asset/icon/Icon16/page_white_flash.png new file mode 100644 index 0000000..d66d476 Binary files /dev/null and b/asset/icon/Icon16/page_white_flash.png differ diff --git a/asset/icon/Icon16/page_white_gear.png b/asset/icon/Icon16/page_white_gear.png new file mode 100644 index 0000000..92953fe Binary files /dev/null and b/asset/icon/Icon16/page_white_gear.png differ diff --git a/asset/icon/Icon16/page_white_get.png b/asset/icon/Icon16/page_white_get.png new file mode 100644 index 0000000..7c6ed41 Binary files /dev/null and b/asset/icon/Icon16/page_white_get.png differ diff --git a/asset/icon/Icon16/page_white_go.png b/asset/icon/Icon16/page_white_go.png new file mode 100644 index 0000000..bc9740e Binary files /dev/null and b/asset/icon/Icon16/page_white_go.png differ diff --git a/asset/icon/Icon16/page_white_h.png b/asset/icon/Icon16/page_white_h.png new file mode 100644 index 0000000..3f7f539 Binary files /dev/null and b/asset/icon/Icon16/page_white_h.png differ diff --git a/asset/icon/Icon16/page_white_horizontal.png b/asset/icon/Icon16/page_white_horizontal.png new file mode 100644 index 0000000..a901c15 Binary files /dev/null and b/asset/icon/Icon16/page_white_horizontal.png differ diff --git a/asset/icon/Icon16/page_white_key.png b/asset/icon/Icon16/page_white_key.png new file mode 100644 index 0000000..06ffd1f Binary files /dev/null and b/asset/icon/Icon16/page_white_key.png differ diff --git a/asset/icon/Icon16/page_white_lightning.png b/asset/icon/Icon16/page_white_lightning.png new file mode 100644 index 0000000..c4974a1 Binary files /dev/null and b/asset/icon/Icon16/page_white_lightning.png differ diff --git a/asset/icon/Icon16/page_white_link.png b/asset/icon/Icon16/page_white_link.png new file mode 100644 index 0000000..fcb5f80 Binary files /dev/null and b/asset/icon/Icon16/page_white_link.png differ diff --git a/asset/icon/Icon16/page_white_magnify.png b/asset/icon/Icon16/page_white_magnify.png new file mode 100644 index 0000000..ef8c5e2 Binary files /dev/null and b/asset/icon/Icon16/page_white_magnify.png differ diff --git a/asset/icon/Icon16/page_white_medal.png b/asset/icon/Icon16/page_white_medal.png new file mode 100644 index 0000000..f849eeb Binary files /dev/null and b/asset/icon/Icon16/page_white_medal.png differ diff --git a/asset/icon/Icon16/page_white_office.png b/asset/icon/Icon16/page_white_office.png new file mode 100644 index 0000000..9234b10 Binary files /dev/null and b/asset/icon/Icon16/page_white_office.png differ diff --git a/asset/icon/Icon16/page_white_paint.png b/asset/icon/Icon16/page_white_paint.png new file mode 100644 index 0000000..ca55a48 Binary files /dev/null and b/asset/icon/Icon16/page_white_paint.png differ diff --git a/asset/icon/Icon16/page_white_paintbrush.png b/asset/icon/Icon16/page_white_paintbrush.png new file mode 100644 index 0000000..dfda50f Binary files /dev/null and b/asset/icon/Icon16/page_white_paintbrush.png differ diff --git a/asset/icon/Icon16/page_white_paste.png b/asset/icon/Icon16/page_white_paste.png new file mode 100644 index 0000000..bec6dff Binary files /dev/null and b/asset/icon/Icon16/page_white_paste.png differ diff --git a/asset/icon/Icon16/page_white_php.png b/asset/icon/Icon16/page_white_php.png new file mode 100644 index 0000000..4ac5618 Binary files /dev/null and b/asset/icon/Icon16/page_white_php.png differ diff --git a/asset/icon/Icon16/page_white_picture.png b/asset/icon/Icon16/page_white_picture.png new file mode 100644 index 0000000..1c3d505 Binary files /dev/null and b/asset/icon/Icon16/page_white_picture.png differ diff --git a/asset/icon/Icon16/page_white_powerpoint.png b/asset/icon/Icon16/page_white_powerpoint.png new file mode 100644 index 0000000..44bbf26 Binary files /dev/null and b/asset/icon/Icon16/page_white_powerpoint.png differ diff --git a/asset/icon/Icon16/page_white_put.png b/asset/icon/Icon16/page_white_put.png new file mode 100644 index 0000000..924ad29 Binary files /dev/null and b/asset/icon/Icon16/page_white_put.png differ diff --git a/asset/icon/Icon16/page_white_ruby.png b/asset/icon/Icon16/page_white_ruby.png new file mode 100644 index 0000000..f29349d Binary files /dev/null and b/asset/icon/Icon16/page_white_ruby.png differ diff --git a/asset/icon/Icon16/page_white_stack.png b/asset/icon/Icon16/page_white_stack.png new file mode 100644 index 0000000..86bc481 Binary files /dev/null and b/asset/icon/Icon16/page_white_stack.png differ diff --git a/asset/icon/Icon16/page_white_star.png b/asset/icon/Icon16/page_white_star.png new file mode 100644 index 0000000..afa5a44 Binary files /dev/null and b/asset/icon/Icon16/page_white_star.png differ diff --git a/asset/icon/Icon16/page_white_text.png b/asset/icon/Icon16/page_white_text.png new file mode 100644 index 0000000..f64dd01 Binary files /dev/null and b/asset/icon/Icon16/page_white_text.png differ diff --git a/asset/icon/Icon16/page_white_text_width.png b/asset/icon/Icon16/page_white_text_width.png new file mode 100644 index 0000000..10e934f Binary files /dev/null and b/asset/icon/Icon16/page_white_text_width.png differ diff --git a/asset/icon/Icon16/page_white_tux.png b/asset/icon/Icon16/page_white_tux.png new file mode 100644 index 0000000..e8f7cdd Binary files /dev/null and b/asset/icon/Icon16/page_white_tux.png differ diff --git a/asset/icon/Icon16/page_white_vector.png b/asset/icon/Icon16/page_white_vector.png new file mode 100644 index 0000000..b8bb775 Binary files /dev/null and b/asset/icon/Icon16/page_white_vector.png differ diff --git a/asset/icon/Icon16/page_white_visualstudio.png b/asset/icon/Icon16/page_white_visualstudio.png new file mode 100644 index 0000000..645fa7a Binary files /dev/null and b/asset/icon/Icon16/page_white_visualstudio.png differ diff --git a/asset/icon/Icon16/page_white_width.png b/asset/icon/Icon16/page_white_width.png new file mode 100644 index 0000000..3ae64da Binary files /dev/null and b/asset/icon/Icon16/page_white_width.png differ diff --git a/asset/icon/Icon16/page_white_word.png b/asset/icon/Icon16/page_white_word.png new file mode 100644 index 0000000..225c3b0 Binary files /dev/null and b/asset/icon/Icon16/page_white_word.png differ diff --git a/asset/icon/Icon16/page_white_world.png b/asset/icon/Icon16/page_white_world.png new file mode 100644 index 0000000..0a4fa8b Binary files /dev/null and b/asset/icon/Icon16/page_white_world.png differ diff --git a/asset/icon/Icon16/page_white_wrench.png b/asset/icon/Icon16/page_white_wrench.png new file mode 100644 index 0000000..9a4cb42 Binary files /dev/null and b/asset/icon/Icon16/page_white_wrench.png differ diff --git a/asset/icon/Icon16/page_white_zip.png b/asset/icon/Icon16/page_white_zip.png new file mode 100644 index 0000000..1584592 Binary files /dev/null and b/asset/icon/Icon16/page_white_zip.png differ diff --git a/asset/icon/Icon16/page_width.png b/asset/icon/Icon16/page_width.png new file mode 100644 index 0000000..af2ffc0 Binary files /dev/null and b/asset/icon/Icon16/page_width.png differ diff --git a/asset/icon/Icon16/page_word.png b/asset/icon/Icon16/page_word.png new file mode 100644 index 0000000..e76e0ab Binary files /dev/null and b/asset/icon/Icon16/page_word.png differ diff --git a/asset/icon/Icon16/page_world.png b/asset/icon/Icon16/page_world.png new file mode 100644 index 0000000..f1f3ad5 Binary files /dev/null and b/asset/icon/Icon16/page_world.png differ diff --git a/asset/icon/Icon16/paginator.png b/asset/icon/Icon16/paginator.png new file mode 100644 index 0000000..1305651 Binary files /dev/null and b/asset/icon/Icon16/paginator.png differ diff --git a/asset/icon/Icon16/paint_tube.png b/asset/icon/Icon16/paint_tube.png new file mode 100644 index 0000000..18adf8d Binary files /dev/null and b/asset/icon/Icon16/paint_tube.png differ diff --git a/asset/icon/Icon16/paintbrush.png b/asset/icon/Icon16/paintbrush.png new file mode 100644 index 0000000..8d4ee47 Binary files /dev/null and b/asset/icon/Icon16/paintbrush.png differ diff --git a/asset/icon/Icon16/paintcan.png b/asset/icon/Icon16/paintcan.png new file mode 100644 index 0000000..d4eb0e4 Binary files /dev/null and b/asset/icon/Icon16/paintcan.png differ diff --git a/asset/icon/Icon16/palette.png b/asset/icon/Icon16/palette.png new file mode 100644 index 0000000..9dbfe0a Binary files /dev/null and b/asset/icon/Icon16/palette.png differ diff --git a/asset/icon/Icon16/pandora.png b/asset/icon/Icon16/pandora.png new file mode 100644 index 0000000..b2e0568 Binary files /dev/null and b/asset/icon/Icon16/pandora.png differ diff --git a/asset/icon/Icon16/panel(2).png b/asset/icon/Icon16/panel(2).png new file mode 100644 index 0000000..7a135f4 Binary files /dev/null and b/asset/icon/Icon16/panel(2).png differ diff --git a/asset/icon/Icon16/panel.png b/asset/icon/Icon16/panel.png new file mode 100644 index 0000000..ed48460 Binary files /dev/null and b/asset/icon/Icon16/panel.png differ diff --git a/asset/icon/Icon16/panel_resize.png b/asset/icon/Icon16/panel_resize.png new file mode 100644 index 0000000..2a071f2 Binary files /dev/null and b/asset/icon/Icon16/panel_resize.png differ diff --git a/asset/icon/Icon16/panel_resize_actual.png b/asset/icon/Icon16/panel_resize_actual.png new file mode 100644 index 0000000..c4a6084 Binary files /dev/null and b/asset/icon/Icon16/panel_resize_actual.png differ diff --git a/asset/icon/Icon16/paper_airplane.png b/asset/icon/Icon16/paper_airplane.png new file mode 100644 index 0000000..85f4fbf Binary files /dev/null and b/asset/icon/Icon16/paper_airplane.png differ diff --git a/asset/icon/Icon16/paper_lantern.png b/asset/icon/Icon16/paper_lantern.png new file mode 100644 index 0000000..d571f19 Binary files /dev/null and b/asset/icon/Icon16/paper_lantern.png differ diff --git a/asset/icon/Icon16/paper_lantern_red.png b/asset/icon/Icon16/paper_lantern_red.png new file mode 100644 index 0000000..43eee51 Binary files /dev/null and b/asset/icon/Icon16/paper_lantern_red.png differ diff --git a/asset/icon/Icon16/paragraph_spacing.png b/asset/icon/Icon16/paragraph_spacing.png new file mode 100644 index 0000000..5298f77 Binary files /dev/null and b/asset/icon/Icon16/paragraph_spacing.png differ diff --git a/asset/icon/Icon16/parked_domains.png b/asset/icon/Icon16/parked_domains.png new file mode 100644 index 0000000..2e1ff95 Binary files /dev/null and b/asset/icon/Icon16/parked_domains.png differ diff --git a/asset/icon/Icon16/parrot.png b/asset/icon/Icon16/parrot.png new file mode 100644 index 0000000..bd7518e Binary files /dev/null and b/asset/icon/Icon16/parrot.png differ diff --git a/asset/icon/Icon16/participation_rate.png b/asset/icon/Icon16/participation_rate.png new file mode 100644 index 0000000..2cc266c Binary files /dev/null and b/asset/icon/Icon16/participation_rate.png differ diff --git a/asset/icon/Icon16/party_hat.png b/asset/icon/Icon16/party_hat.png new file mode 100644 index 0000000..3ec19b9 Binary files /dev/null and b/asset/icon/Icon16/party_hat.png differ diff --git a/asset/icon/Icon16/password_protect_directories.png b/asset/icon/Icon16/password_protect_directories.png new file mode 100644 index 0000000..e498aa8 Binary files /dev/null and b/asset/icon/Icon16/password_protect_directories.png differ diff --git a/asset/icon/Icon16/paste_plain.png b/asset/icon/Icon16/paste_plain.png new file mode 100644 index 0000000..ee4bd3e Binary files /dev/null and b/asset/icon/Icon16/paste_plain.png differ diff --git a/asset/icon/Icon16/paste_word.png b/asset/icon/Icon16/paste_word.png new file mode 100644 index 0000000..0adbba4 Binary files /dev/null and b/asset/icon/Icon16/paste_word.png differ diff --git a/asset/icon/Icon16/paypal(2).png b/asset/icon/Icon16/paypal(2).png new file mode 100644 index 0000000..d1d23f5 Binary files /dev/null and b/asset/icon/Icon16/paypal(2).png differ diff --git a/asset/icon/Icon16/paypal.png b/asset/icon/Icon16/paypal.png new file mode 100644 index 0000000..848c990 Binary files /dev/null and b/asset/icon/Icon16/paypal.png differ diff --git a/asset/icon/Icon16/pc_linux_os.png b/asset/icon/Icon16/pc_linux_os.png new file mode 100644 index 0000000..26bb7e3 Binary files /dev/null and b/asset/icon/Icon16/pc_linux_os.png differ diff --git a/asset/icon/Icon16/pci.png b/asset/icon/Icon16/pci.png new file mode 100644 index 0000000..b7fbeb7 Binary files /dev/null and b/asset/icon/Icon16/pci.png differ diff --git a/asset/icon/Icon16/pdf_exports.png b/asset/icon/Icon16/pdf_exports.png new file mode 100644 index 0000000..a6ac327 Binary files /dev/null and b/asset/icon/Icon16/pdf_exports.png differ diff --git a/asset/icon/Icon16/peacock.png b/asset/icon/Icon16/peacock.png new file mode 100644 index 0000000..36c73a9 Binary files /dev/null and b/asset/icon/Icon16/peacock.png differ diff --git a/asset/icon/Icon16/peak_cap.png b/asset/icon/Icon16/peak_cap.png new file mode 100644 index 0000000..8a6f1e5 Binary files /dev/null and b/asset/icon/Icon16/peak_cap.png differ diff --git a/asset/icon/Icon16/pearl.png b/asset/icon/Icon16/pearl.png new file mode 100644 index 0000000..10ea6a1 Binary files /dev/null and b/asset/icon/Icon16/pearl.png differ diff --git a/asset/icon/Icon16/pedestal.png b/asset/icon/Icon16/pedestal.png new file mode 100644 index 0000000..4a8e746 Binary files /dev/null and b/asset/icon/Icon16/pedestal.png differ diff --git a/asset/icon/Icon16/pencil.png b/asset/icon/Icon16/pencil.png new file mode 100644 index 0000000..d5ba3d5 Binary files /dev/null and b/asset/icon/Icon16/pencil.png differ diff --git a/asset/icon/Icon16/pencil_add.png b/asset/icon/Icon16/pencil_add.png new file mode 100644 index 0000000..edbebee Binary files /dev/null and b/asset/icon/Icon16/pencil_add.png differ diff --git a/asset/icon/Icon16/pencil_delete.png b/asset/icon/Icon16/pencil_delete.png new file mode 100644 index 0000000..fad2294 Binary files /dev/null and b/asset/icon/Icon16/pencil_delete.png differ diff --git a/asset/icon/Icon16/pencil_go.png b/asset/icon/Icon16/pencil_go.png new file mode 100644 index 0000000..4771ee5 Binary files /dev/null and b/asset/icon/Icon16/pencil_go.png differ diff --git a/asset/icon/Icon16/pencil_ruler.png b/asset/icon/Icon16/pencil_ruler.png new file mode 100644 index 0000000..aaf191b Binary files /dev/null and b/asset/icon/Icon16/pencil_ruler.png differ diff --git a/asset/icon/Icon16/people_pane.png b/asset/icon/Icon16/people_pane.png new file mode 100644 index 0000000..51d065f Binary files /dev/null and b/asset/icon/Icon16/people_pane.png differ diff --git a/asset/icon/Icon16/pepper.png b/asset/icon/Icon16/pepper.png new file mode 100644 index 0000000..016aa84 Binary files /dev/null and b/asset/icon/Icon16/pepper.png differ diff --git a/asset/icon/Icon16/perfomance.png b/asset/icon/Icon16/perfomance.png new file mode 100644 index 0000000..9c789fc Binary files /dev/null and b/asset/icon/Icon16/perfomance.png differ diff --git a/asset/icon/Icon16/perfomance_analysis.png b/asset/icon/Icon16/perfomance_analysis.png new file mode 100644 index 0000000..aee9c3e Binary files /dev/null and b/asset/icon/Icon16/perfomance_analysis.png differ diff --git a/asset/icon/Icon16/perl_modules.png b/asset/icon/Icon16/perl_modules.png new file mode 100644 index 0000000..698e523 Binary files /dev/null and b/asset/icon/Icon16/perl_modules.png differ diff --git a/asset/icon/Icon16/personal_finance.png b/asset/icon/Icon16/personal_finance.png new file mode 100644 index 0000000..57acb57 Binary files /dev/null and b/asset/icon/Icon16/personal_finance.png differ diff --git a/asset/icon/Icon16/personals.png b/asset/icon/Icon16/personals.png new file mode 100644 index 0000000..40f7c3c Binary files /dev/null and b/asset/icon/Icon16/personals.png differ diff --git a/asset/icon/Icon16/phone.png b/asset/icon/Icon16/phone.png new file mode 100644 index 0000000..eb83742 Binary files /dev/null and b/asset/icon/Icon16/phone.png differ diff --git a/asset/icon/Icon16/phone_Android.png b/asset/icon/Icon16/phone_Android.png new file mode 100644 index 0000000..c8ed8d2 Binary files /dev/null and b/asset/icon/Icon16/phone_Android.png differ diff --git a/asset/icon/Icon16/phone_add.png b/asset/icon/Icon16/phone_add.png new file mode 100644 index 0000000..0ba8d6a Binary files /dev/null and b/asset/icon/Icon16/phone_add.png differ diff --git a/asset/icon/Icon16/phone_delete.png b/asset/icon/Icon16/phone_delete.png new file mode 100644 index 0000000..62bcbda Binary files /dev/null and b/asset/icon/Icon16/phone_delete.png differ diff --git a/asset/icon/Icon16/phone_handset.png b/asset/icon/Icon16/phone_handset.png new file mode 100644 index 0000000..b38131d Binary files /dev/null and b/asset/icon/Icon16/phone_handset.png differ diff --git a/asset/icon/Icon16/phone_sound.png b/asset/icon/Icon16/phone_sound.png new file mode 100644 index 0000000..ba971d5 Binary files /dev/null and b/asset/icon/Icon16/phone_sound.png differ diff --git a/asset/icon/Icon16/phone_vintage.png b/asset/icon/Icon16/phone_vintage.png new file mode 100644 index 0000000..c1950a1 Binary files /dev/null and b/asset/icon/Icon16/phone_vintage.png differ diff --git a/asset/icon/Icon16/photo.png b/asset/icon/Icon16/photo.png new file mode 100644 index 0000000..f360dcc Binary files /dev/null and b/asset/icon/Icon16/photo.png differ diff --git a/asset/icon/Icon16/photo_add.png b/asset/icon/Icon16/photo_add.png new file mode 100644 index 0000000..c612b4a Binary files /dev/null and b/asset/icon/Icon16/photo_add.png differ diff --git a/asset/icon/Icon16/photo_album(2).png b/asset/icon/Icon16/photo_album(2).png new file mode 100644 index 0000000..bc6a157 Binary files /dev/null and b/asset/icon/Icon16/photo_album(2).png differ diff --git a/asset/icon/Icon16/photo_album.png b/asset/icon/Icon16/photo_album.png new file mode 100644 index 0000000..b7bed3e Binary files /dev/null and b/asset/icon/Icon16/photo_album.png differ diff --git a/asset/icon/Icon16/photo_delete.png b/asset/icon/Icon16/photo_delete.png new file mode 100644 index 0000000..dfd792e Binary files /dev/null and b/asset/icon/Icon16/photo_delete.png differ diff --git a/asset/icon/Icon16/photo_link.png b/asset/icon/Icon16/photo_link.png new file mode 100644 index 0000000..098d5af Binary files /dev/null and b/asset/icon/Icon16/photo_link.png differ diff --git a/asset/icon/Icon16/photos.png b/asset/icon/Icon16/photos.png new file mode 100644 index 0000000..a2fe11e Binary files /dev/null and b/asset/icon/Icon16/photos.png differ diff --git a/asset/icon/Icon16/php.png b/asset/icon/Icon16/php.png new file mode 100644 index 0000000..f652496 Binary files /dev/null and b/asset/icon/Icon16/php.png differ diff --git a/asset/icon/Icon16/php_configuration.png b/asset/icon/Icon16/php_configuration.png new file mode 100644 index 0000000..e926bbb Binary files /dev/null and b/asset/icon/Icon16/php_configuration.png differ diff --git a/asset/icon/Icon16/php_pear_package.png b/asset/icon/Icon16/php_pear_package.png new file mode 100644 index 0000000..d1c2bfe Binary files /dev/null and b/asset/icon/Icon16/php_pear_package.png differ diff --git a/asset/icon/Icon16/pi_math.png b/asset/icon/Icon16/pi_math.png new file mode 100644 index 0000000..0df622a Binary files /dev/null and b/asset/icon/Icon16/pi_math.png differ diff --git a/asset/icon/Icon16/piano.png b/asset/icon/Icon16/piano.png new file mode 100644 index 0000000..0d0dba7 Binary files /dev/null and b/asset/icon/Icon16/piano.png differ diff --git a/asset/icon/Icon16/picasa.png b/asset/icon/Icon16/picasa.png new file mode 100644 index 0000000..369c6f9 Binary files /dev/null and b/asset/icon/Icon16/picasa.png differ diff --git a/asset/icon/Icon16/picture.png b/asset/icon/Icon16/picture.png new file mode 100644 index 0000000..3b98f2d Binary files /dev/null and b/asset/icon/Icon16/picture.png differ diff --git a/asset/icon/Icon16/picture_add.png b/asset/icon/Icon16/picture_add.png new file mode 100644 index 0000000..ef26343 Binary files /dev/null and b/asset/icon/Icon16/picture_add.png differ diff --git a/asset/icon/Icon16/picture_delete.png b/asset/icon/Icon16/picture_delete.png new file mode 100644 index 0000000..19dd8b0 Binary files /dev/null and b/asset/icon/Icon16/picture_delete.png differ diff --git a/asset/icon/Icon16/picture_edit.png b/asset/icon/Icon16/picture_edit.png new file mode 100644 index 0000000..eeeff77 Binary files /dev/null and b/asset/icon/Icon16/picture_edit.png differ diff --git a/asset/icon/Icon16/picture_empty.png b/asset/icon/Icon16/picture_empty.png new file mode 100644 index 0000000..e457350 Binary files /dev/null and b/asset/icon/Icon16/picture_empty.png differ diff --git a/asset/icon/Icon16/picture_error.png b/asset/icon/Icon16/picture_error.png new file mode 100644 index 0000000..2990727 Binary files /dev/null and b/asset/icon/Icon16/picture_error.png differ diff --git a/asset/icon/Icon16/picture_frame.png b/asset/icon/Icon16/picture_frame.png new file mode 100644 index 0000000..91b5df7 Binary files /dev/null and b/asset/icon/Icon16/picture_frame.png differ diff --git a/asset/icon/Icon16/picture_go.png b/asset/icon/Icon16/picture_go.png new file mode 100644 index 0000000..db3be33 Binary files /dev/null and b/asset/icon/Icon16/picture_go.png differ diff --git a/asset/icon/Icon16/picture_insert.png b/asset/icon/Icon16/picture_insert.png new file mode 100644 index 0000000..feb4920 Binary files /dev/null and b/asset/icon/Icon16/picture_insert.png differ diff --git a/asset/icon/Icon16/picture_insert_from_web.png b/asset/icon/Icon16/picture_insert_from_web.png new file mode 100644 index 0000000..1a20d61 Binary files /dev/null and b/asset/icon/Icon16/picture_insert_from_web.png differ diff --git a/asset/icon/Icon16/picture_key.png b/asset/icon/Icon16/picture_key.png new file mode 100644 index 0000000..5a39855 Binary files /dev/null and b/asset/icon/Icon16/picture_key.png differ diff --git a/asset/icon/Icon16/picture_link.png b/asset/icon/Icon16/picture_link.png new file mode 100644 index 0000000..122ca9e Binary files /dev/null and b/asset/icon/Icon16/picture_link.png differ diff --git a/asset/icon/Icon16/picture_position.png b/asset/icon/Icon16/picture_position.png new file mode 100644 index 0000000..a12e041 Binary files /dev/null and b/asset/icon/Icon16/picture_position.png differ diff --git a/asset/icon/Icon16/picture_save.png b/asset/icon/Icon16/picture_save.png new file mode 100644 index 0000000..d74399f Binary files /dev/null and b/asset/icon/Icon16/picture_save.png differ diff --git a/asset/icon/Icon16/picture_sunset.png b/asset/icon/Icon16/picture_sunset.png new file mode 100644 index 0000000..030ec83 Binary files /dev/null and b/asset/icon/Icon16/picture_sunset.png differ diff --git a/asset/icon/Icon16/pictures.png b/asset/icon/Icon16/pictures.png new file mode 100644 index 0000000..5f7025a Binary files /dev/null and b/asset/icon/Icon16/pictures.png differ diff --git a/asset/icon/Icon16/piece_of_cake.png b/asset/icon/Icon16/piece_of_cake.png new file mode 100644 index 0000000..2718b0b Binary files /dev/null and b/asset/icon/Icon16/piece_of_cake.png differ diff --git a/asset/icon/Icon16/piechart.png b/asset/icon/Icon16/piechart.png new file mode 100644 index 0000000..d5e7084 Binary files /dev/null and b/asset/icon/Icon16/piechart.png differ diff --git a/asset/icon/Icon16/pilcrow.png b/asset/icon/Icon16/pilcrow.png new file mode 100644 index 0000000..aa6cd74 Binary files /dev/null and b/asset/icon/Icon16/pilcrow.png differ diff --git a/asset/icon/Icon16/pill.png b/asset/icon/Icon16/pill.png new file mode 100644 index 0000000..e24982b Binary files /dev/null and b/asset/icon/Icon16/pill.png differ diff --git a/asset/icon/Icon16/pill_add.png b/asset/icon/Icon16/pill_add.png new file mode 100644 index 0000000..27ba57b Binary files /dev/null and b/asset/icon/Icon16/pill_add.png differ diff --git a/asset/icon/Icon16/pill_delete.png b/asset/icon/Icon16/pill_delete.png new file mode 100644 index 0000000..0594906 Binary files /dev/null and b/asset/icon/Icon16/pill_delete.png differ diff --git a/asset/icon/Icon16/pill_go.png b/asset/icon/Icon16/pill_go.png new file mode 100644 index 0000000..7c958c6 Binary files /dev/null and b/asset/icon/Icon16/pill_go.png differ diff --git a/asset/icon/Icon16/pint.png b/asset/icon/Icon16/pint.png new file mode 100644 index 0000000..599bbfd Binary files /dev/null and b/asset/icon/Icon16/pint.png differ diff --git a/asset/icon/Icon16/pipette.png b/asset/icon/Icon16/pipette.png new file mode 100644 index 0000000..3a3fcf2 Binary files /dev/null and b/asset/icon/Icon16/pipette.png differ diff --git a/asset/icon/Icon16/pirate_flag.png b/asset/icon/Icon16/pirate_flag.png new file mode 100644 index 0000000..3eeab00 Binary files /dev/null and b/asset/icon/Icon16/pirate_flag.png differ diff --git a/asset/icon/Icon16/pizza.png b/asset/icon/Icon16/pizza.png new file mode 100644 index 0000000..c679d0b Binary files /dev/null and b/asset/icon/Icon16/pizza.png differ diff --git a/asset/icon/Icon16/places.png b/asset/icon/Icon16/places.png new file mode 100644 index 0000000..81c5e6a Binary files /dev/null and b/asset/icon/Icon16/places.png differ diff --git a/asset/icon/Icon16/plane.png b/asset/icon/Icon16/plane.png new file mode 100644 index 0000000..8b8be7a Binary files /dev/null and b/asset/icon/Icon16/plane.png differ diff --git a/asset/icon/Icon16/playstation.png b/asset/icon/Icon16/playstation.png new file mode 100644 index 0000000..157fd38 Binary files /dev/null and b/asset/icon/Icon16/playstation.png differ diff --git a/asset/icon/Icon16/plotchart.png b/asset/icon/Icon16/plotchart.png new file mode 100644 index 0000000..0ac86cb Binary files /dev/null and b/asset/icon/Icon16/plotchart.png differ diff --git a/asset/icon/Icon16/plugin.png b/asset/icon/Icon16/plugin.png new file mode 100644 index 0000000..3ca4d1b Binary files /dev/null and b/asset/icon/Icon16/plugin.png differ diff --git a/asset/icon/Icon16/plugin_add.png b/asset/icon/Icon16/plugin_add.png new file mode 100644 index 0000000..ac50aa4 Binary files /dev/null and b/asset/icon/Icon16/plugin_add.png differ diff --git a/asset/icon/Icon16/plugin_delete.png b/asset/icon/Icon16/plugin_delete.png new file mode 100644 index 0000000..5453ecd Binary files /dev/null and b/asset/icon/Icon16/plugin_delete.png differ diff --git a/asset/icon/Icon16/plugin_disabled.png b/asset/icon/Icon16/plugin_disabled.png new file mode 100644 index 0000000..cfaa078 Binary files /dev/null and b/asset/icon/Icon16/plugin_disabled.png differ diff --git a/asset/icon/Icon16/plugin_edit.png b/asset/icon/Icon16/plugin_edit.png new file mode 100644 index 0000000..7fb59e5 Binary files /dev/null and b/asset/icon/Icon16/plugin_edit.png differ diff --git a/asset/icon/Icon16/plugin_error.png b/asset/icon/Icon16/plugin_error.png new file mode 100644 index 0000000..bd128ca Binary files /dev/null and b/asset/icon/Icon16/plugin_error.png differ diff --git a/asset/icon/Icon16/plugin_go.png b/asset/icon/Icon16/plugin_go.png new file mode 100644 index 0000000..8ca75fe Binary files /dev/null and b/asset/icon/Icon16/plugin_go.png differ diff --git a/asset/icon/Icon16/plugin_link.png b/asset/icon/Icon16/plugin_link.png new file mode 100644 index 0000000..61d528f Binary files /dev/null and b/asset/icon/Icon16/plugin_link.png differ diff --git a/asset/icon/Icon16/plurk.png b/asset/icon/Icon16/plurk.png new file mode 100644 index 0000000..d6167ab Binary files /dev/null and b/asset/icon/Icon16/plurk.png differ diff --git a/asset/icon/Icon16/plus.png b/asset/icon/Icon16/plus.png new file mode 100644 index 0000000..473cc93 Binary files /dev/null and b/asset/icon/Icon16/plus.png differ diff --git a/asset/icon/Icon16/plus_button.png b/asset/icon/Icon16/plus_button.png new file mode 100644 index 0000000..6682eb5 Binary files /dev/null and b/asset/icon/Icon16/plus_button.png differ diff --git a/asset/icon/Icon16/plus_circle_frame.png b/asset/icon/Icon16/plus_circle_frame.png new file mode 100644 index 0000000..db64c98 Binary files /dev/null and b/asset/icon/Icon16/plus_circle_frame.png differ diff --git a/asset/icon/Icon16/plus_light_blue.png b/asset/icon/Icon16/plus_light_blue.png new file mode 100644 index 0000000..bea3d99 Binary files /dev/null and b/asset/icon/Icon16/plus_light_blue.png differ diff --git a/asset/icon/Icon16/plus_octagon.png b/asset/icon/Icon16/plus_octagon.png new file mode 100644 index 0000000..5dfd645 Binary files /dev/null and b/asset/icon/Icon16/plus_octagon.png differ diff --git a/asset/icon/Icon16/plus_octagon_frame.png b/asset/icon/Icon16/plus_octagon_frame.png new file mode 100644 index 0000000..c0acb65 Binary files /dev/null and b/asset/icon/Icon16/plus_octagon_frame.png differ diff --git a/asset/icon/Icon16/plus_shield.png b/asset/icon/Icon16/plus_shield.png new file mode 100644 index 0000000..8cf5d49 Binary files /dev/null and b/asset/icon/Icon16/plus_shield.png differ diff --git a/asset/icon/Icon16/point_bronze.png b/asset/icon/Icon16/point_bronze.png new file mode 100644 index 0000000..5e8a63c Binary files /dev/null and b/asset/icon/Icon16/point_bronze.png differ diff --git a/asset/icon/Icon16/point_gold.png b/asset/icon/Icon16/point_gold.png new file mode 100644 index 0000000..f56619f Binary files /dev/null and b/asset/icon/Icon16/point_gold.png differ diff --git a/asset/icon/Icon16/point_silver.png b/asset/icon/Icon16/point_silver.png new file mode 100644 index 0000000..e783a0c Binary files /dev/null and b/asset/icon/Icon16/point_silver.png differ diff --git a/asset/icon/Icon16/point_small.png b/asset/icon/Icon16/point_small.png new file mode 100644 index 0000000..0920d7f Binary files /dev/null and b/asset/icon/Icon16/point_small.png differ diff --git a/asset/icon/Icon16/points_small.png b/asset/icon/Icon16/points_small.png new file mode 100644 index 0000000..2d0fafd Binary files /dev/null and b/asset/icon/Icon16/points_small.png differ diff --git a/asset/icon/Icon16/poker.png b/asset/icon/Icon16/poker.png new file mode 100644 index 0000000..f942820 Binary files /dev/null and b/asset/icon/Icon16/poker.png differ diff --git a/asset/icon/Icon16/poo.png b/asset/icon/Icon16/poo.png new file mode 100644 index 0000000..d792d99 Binary files /dev/null and b/asset/icon/Icon16/poo.png differ diff --git a/asset/icon/Icon16/pop3_server.png b/asset/icon/Icon16/pop3_server.png new file mode 100644 index 0000000..fa495e7 Binary files /dev/null and b/asset/icon/Icon16/pop3_server.png differ diff --git a/asset/icon/Icon16/pop_mail.png b/asset/icon/Icon16/pop_mail.png new file mode 100644 index 0000000..35fdf68 Binary files /dev/null and b/asset/icon/Icon16/pop_mail.png differ diff --git a/asset/icon/Icon16/popcorn.png b/asset/icon/Icon16/popcorn.png new file mode 100644 index 0000000..197d2b0 Binary files /dev/null and b/asset/icon/Icon16/popcorn.png differ diff --git a/asset/icon/Icon16/port.png b/asset/icon/Icon16/port.png new file mode 100644 index 0000000..46e7ef9 Binary files /dev/null and b/asset/icon/Icon16/port.png differ diff --git a/asset/icon/Icon16/postage_stamp.png b/asset/icon/Icon16/postage_stamp.png new file mode 100644 index 0000000..e4d34ce Binary files /dev/null and b/asset/icon/Icon16/postage_stamp.png differ diff --git a/asset/icon/Icon16/posterous.png b/asset/icon/Icon16/posterous.png new file mode 100644 index 0000000..59fa4fc Binary files /dev/null and b/asset/icon/Icon16/posterous.png differ diff --git a/asset/icon/Icon16/power_supply.png b/asset/icon/Icon16/power_supply.png new file mode 100644 index 0000000..e677084 Binary files /dev/null and b/asset/icon/Icon16/power_supply.png differ diff --git a/asset/icon/Icon16/power_surge.png b/asset/icon/Icon16/power_surge.png new file mode 100644 index 0000000..6148838 Binary files /dev/null and b/asset/icon/Icon16/power_surge.png differ diff --git a/asset/icon/Icon16/preferences.png b/asset/icon/Icon16/preferences.png new file mode 100644 index 0000000..97bfc89 Binary files /dev/null and b/asset/icon/Icon16/preferences.png differ diff --git a/asset/icon/Icon16/premium_support.png b/asset/icon/Icon16/premium_support.png new file mode 100644 index 0000000..cc4be5c Binary files /dev/null and b/asset/icon/Icon16/premium_support.png differ diff --git a/asset/icon/Icon16/preview_results.png b/asset/icon/Icon16/preview_results.png new file mode 100644 index 0000000..ca01428 Binary files /dev/null and b/asset/icon/Icon16/preview_results.png differ diff --git a/asset/icon/Icon16/previous_footnote.png b/asset/icon/Icon16/previous_footnote.png new file mode 100644 index 0000000..26f16a5 Binary files /dev/null and b/asset/icon/Icon16/previous_footnote.png differ diff --git a/asset/icon/Icon16/previous_markup.png b/asset/icon/Icon16/previous_markup.png new file mode 100644 index 0000000..a0fce75 Binary files /dev/null and b/asset/icon/Icon16/previous_markup.png differ diff --git a/asset/icon/Icon16/price_alert.png b/asset/icon/Icon16/price_alert.png new file mode 100644 index 0000000..a9d37d4 Binary files /dev/null and b/asset/icon/Icon16/price_alert.png differ diff --git a/asset/icon/Icon16/price_comparison.png b/asset/icon/Icon16/price_comparison.png new file mode 100644 index 0000000..29b2d7e Binary files /dev/null and b/asset/icon/Icon16/price_comparison.png differ diff --git a/asset/icon/Icon16/price_watch.png b/asset/icon/Icon16/price_watch.png new file mode 100644 index 0000000..1fcf1ae Binary files /dev/null and b/asset/icon/Icon16/price_watch.png differ diff --git a/asset/icon/Icon16/print_size.png b/asset/icon/Icon16/print_size.png new file mode 100644 index 0000000..afe98e3 Binary files /dev/null and b/asset/icon/Icon16/print_size.png differ diff --git a/asset/icon/Icon16/print_tiles.png b/asset/icon/Icon16/print_tiles.png new file mode 100644 index 0000000..8195ead Binary files /dev/null and b/asset/icon/Icon16/print_tiles.png differ diff --git a/asset/icon/Icon16/printer.png b/asset/icon/Icon16/printer.png new file mode 100644 index 0000000..8a33e0a Binary files /dev/null and b/asset/icon/Icon16/printer.png differ diff --git a/asset/icon/Icon16/printer_add.png b/asset/icon/Icon16/printer_add.png new file mode 100644 index 0000000..3b1b554 Binary files /dev/null and b/asset/icon/Icon16/printer_add.png differ diff --git a/asset/icon/Icon16/printer_color.png b/asset/icon/Icon16/printer_color.png new file mode 100644 index 0000000..5899ca1 Binary files /dev/null and b/asset/icon/Icon16/printer_color.png differ diff --git a/asset/icon/Icon16/printer_delete.png b/asset/icon/Icon16/printer_delete.png new file mode 100644 index 0000000..7c88700 Binary files /dev/null and b/asset/icon/Icon16/printer_delete.png differ diff --git a/asset/icon/Icon16/printer_empty.png b/asset/icon/Icon16/printer_empty.png new file mode 100644 index 0000000..26e721a Binary files /dev/null and b/asset/icon/Icon16/printer_empty.png differ diff --git a/asset/icon/Icon16/printer_error.png b/asset/icon/Icon16/printer_error.png new file mode 100644 index 0000000..8c919ad Binary files /dev/null and b/asset/icon/Icon16/printer_error.png differ diff --git a/asset/icon/Icon16/printer_network.png b/asset/icon/Icon16/printer_network.png new file mode 100644 index 0000000..799ca74 Binary files /dev/null and b/asset/icon/Icon16/printer_network.png differ diff --git a/asset/icon/Icon16/printscreen_insert.png b/asset/icon/Icon16/printscreen_insert.png new file mode 100644 index 0000000..1576164 Binary files /dev/null and b/asset/icon/Icon16/printscreen_insert.png differ diff --git a/asset/icon/Icon16/private.png b/asset/icon/Icon16/private.png new file mode 100644 index 0000000..cc12c64 Binary files /dev/null and b/asset/icon/Icon16/private.png differ diff --git a/asset/icon/Icon16/process_marked_headers.png b/asset/icon/Icon16/process_marked_headers.png new file mode 100644 index 0000000..226148e Binary files /dev/null and b/asset/icon/Icon16/process_marked_headers.png differ diff --git a/asset/icon/Icon16/processor.png b/asset/icon/Icon16/processor.png new file mode 100644 index 0000000..a1c423e Binary files /dev/null and b/asset/icon/Icon16/processor.png differ diff --git a/asset/icon/Icon16/production_copyleft.png b/asset/icon/Icon16/production_copyleft.png new file mode 100644 index 0000000..a1d760b Binary files /dev/null and b/asset/icon/Icon16/production_copyleft.png differ diff --git a/asset/icon/Icon16/profiles.png b/asset/icon/Icon16/profiles.png new file mode 100644 index 0000000..dcf485a Binary files /dev/null and b/asset/icon/Icon16/profiles.png differ diff --git a/asset/icon/Icon16/progressbar.png b/asset/icon/Icon16/progressbar.png new file mode 100644 index 0000000..c9dee2b Binary files /dev/null and b/asset/icon/Icon16/progressbar.png differ diff --git a/asset/icon/Icon16/prohibition_button.png b/asset/icon/Icon16/prohibition_button.png new file mode 100644 index 0000000..d3c8e32 Binary files /dev/null and b/asset/icon/Icon16/prohibition_button.png differ diff --git a/asset/icon/Icon16/property_export.png b/asset/icon/Icon16/property_export.png new file mode 100644 index 0000000..8c1a9fd Binary files /dev/null and b/asset/icon/Icon16/property_export.png differ diff --git a/asset/icon/Icon16/property_import.png b/asset/icon/Icon16/property_import.png new file mode 100644 index 0000000..77d0be0 Binary files /dev/null and b/asset/icon/Icon16/property_import.png differ diff --git a/asset/icon/Icon16/protect_share_workbook.png b/asset/icon/Icon16/protect_share_workbook.png new file mode 100644 index 0000000..0e00f26 Binary files /dev/null and b/asset/icon/Icon16/protect_share_workbook.png differ diff --git a/asset/icon/Icon16/protect_sheet.png b/asset/icon/Icon16/protect_sheet.png new file mode 100644 index 0000000..d785233 Binary files /dev/null and b/asset/icon/Icon16/protect_sheet.png differ diff --git a/asset/icon/Icon16/protect_workbook.png b/asset/icon/Icon16/protect_workbook.png new file mode 100644 index 0000000..d7eded6 Binary files /dev/null and b/asset/icon/Icon16/protect_workbook.png differ diff --git a/asset/icon/Icon16/publisher_bookmark.png b/asset/icon/Icon16/publisher_bookmark.png new file mode 100644 index 0000000..2dd6dff Binary files /dev/null and b/asset/icon/Icon16/publisher_bookmark.png differ diff --git a/asset/icon/Icon16/purchase_install_ssl_certificate.png b/asset/icon/Icon16/purchase_install_ssl_certificate.png new file mode 100644 index 0000000..bc65ab8 Binary files /dev/null and b/asset/icon/Icon16/purchase_install_ssl_certificate.png differ diff --git a/asset/icon/Icon16/purse.png b/asset/icon/Icon16/purse.png new file mode 100644 index 0000000..41fb392 Binary files /dev/null and b/asset/icon/Icon16/purse.png differ diff --git a/asset/icon/Icon16/qik.png b/asset/icon/Icon16/qik.png new file mode 100644 index 0000000..728c903 Binary files /dev/null and b/asset/icon/Icon16/qik.png differ diff --git a/asset/icon/Icon16/qip_angry.png b/asset/icon/Icon16/qip_angry.png new file mode 100644 index 0000000..e640c6f Binary files /dev/null and b/asset/icon/Icon16/qip_angry.png differ diff --git a/asset/icon/Icon16/qip_at_home.png b/asset/icon/Icon16/qip_at_home.png new file mode 100644 index 0000000..d273a8e Binary files /dev/null and b/asset/icon/Icon16/qip_at_home.png differ diff --git a/asset/icon/Icon16/qip_at_work.png b/asset/icon/Icon16/qip_at_work.png new file mode 100644 index 0000000..2a5388a Binary files /dev/null and b/asset/icon/Icon16/qip_at_work.png differ diff --git a/asset/icon/Icon16/qip_away.png b/asset/icon/Icon16/qip_away.png new file mode 100644 index 0000000..937294c Binary files /dev/null and b/asset/icon/Icon16/qip_away.png differ diff --git a/asset/icon/Icon16/qip_bad_mood.png b/asset/icon/Icon16/qip_bad_mood.png new file mode 100644 index 0000000..7cf3d9e Binary files /dev/null and b/asset/icon/Icon16/qip_bad_mood.png differ diff --git a/asset/icon/Icon16/qip_dnd.png b/asset/icon/Icon16/qip_dnd.png new file mode 100644 index 0000000..9198ff0 Binary files /dev/null and b/asset/icon/Icon16/qip_dnd.png differ diff --git a/asset/icon/Icon16/qip_eating.png b/asset/icon/Icon16/qip_eating.png new file mode 100644 index 0000000..87cec92 Binary files /dev/null and b/asset/icon/Icon16/qip_eating.png differ diff --git a/asset/icon/Icon16/qip_free_for_chat.png b/asset/icon/Icon16/qip_free_for_chat.png new file mode 100644 index 0000000..d4ab892 Binary files /dev/null and b/asset/icon/Icon16/qip_free_for_chat.png differ diff --git a/asset/icon/Icon16/qip_invisible.png b/asset/icon/Icon16/qip_invisible.png new file mode 100644 index 0000000..cd33bcc Binary files /dev/null and b/asset/icon/Icon16/qip_invisible.png differ diff --git a/asset/icon/Icon16/qip_invisible_for_all.png b/asset/icon/Icon16/qip_invisible_for_all.png new file mode 100644 index 0000000..1494793 Binary files /dev/null and b/asset/icon/Icon16/qip_invisible_for_all.png differ diff --git a/asset/icon/Icon16/qip_not_available.png b/asset/icon/Icon16/qip_not_available.png new file mode 100644 index 0000000..7bb4d34 Binary files /dev/null and b/asset/icon/Icon16/qip_not_available.png differ diff --git a/asset/icon/Icon16/qip_occupied.png b/asset/icon/Icon16/qip_occupied.png new file mode 100644 index 0000000..3be3cfe Binary files /dev/null and b/asset/icon/Icon16/qip_occupied.png differ diff --git a/asset/icon/Icon16/qip_offline.png b/asset/icon/Icon16/qip_offline.png new file mode 100644 index 0000000..610cc9e Binary files /dev/null and b/asset/icon/Icon16/qip_offline.png differ diff --git a/asset/icon/Icon16/qip_online.png b/asset/icon/Icon16/qip_online.png new file mode 100644 index 0000000..6d37081 Binary files /dev/null and b/asset/icon/Icon16/qip_online.png differ diff --git a/asset/icon/Icon16/query_design.png b/asset/icon/Icon16/query_design.png new file mode 100644 index 0000000..84feccf Binary files /dev/null and b/asset/icon/Icon16/query_design.png differ diff --git a/asset/icon/Icon16/query_wizard.png b/asset/icon/Icon16/query_wizard.png new file mode 100644 index 0000000..d035dbd Binary files /dev/null and b/asset/icon/Icon16/query_wizard.png differ diff --git a/asset/icon/Icon16/question.png b/asset/icon/Icon16/question.png new file mode 100644 index 0000000..e33422d Binary files /dev/null and b/asset/icon/Icon16/question.png differ diff --git a/asset/icon/Icon16/quick_styles.png b/asset/icon/Icon16/quick_styles.png new file mode 100644 index 0000000..380edee Binary files /dev/null and b/asset/icon/Icon16/quick_styles.png differ diff --git a/asset/icon/Icon16/quill.png b/asset/icon/Icon16/quill.png new file mode 100644 index 0000000..8b508eb Binary files /dev/null and b/asset/icon/Icon16/quill.png differ diff --git a/asset/icon/Icon16/quota_modification.png b/asset/icon/Icon16/quota_modification.png new file mode 100644 index 0000000..46bad86 Binary files /dev/null and b/asset/icon/Icon16/quota_modification.png differ diff --git a/asset/icon/Icon16/rabbit.png b/asset/icon/Icon16/rabbit.png new file mode 100644 index 0000000..3c72564 Binary files /dev/null and b/asset/icon/Icon16/rabbit.png differ diff --git a/asset/icon/Icon16/radar_chart.png b/asset/icon/Icon16/radar_chart.png new file mode 100644 index 0000000..1057337 Binary files /dev/null and b/asset/icon/Icon16/radar_chart.png differ diff --git a/asset/icon/Icon16/radio_1.png b/asset/icon/Icon16/radio_1.png new file mode 100644 index 0000000..f8f57f3 Binary files /dev/null and b/asset/icon/Icon16/radio_1.png differ diff --git a/asset/icon/Icon16/radio_2.png b/asset/icon/Icon16/radio_2.png new file mode 100644 index 0000000..13576a5 Binary files /dev/null and b/asset/icon/Icon16/radio_2.png differ diff --git a/asset/icon/Icon16/radio_button.png b/asset/icon/Icon16/radio_button.png new file mode 100644 index 0000000..3ba2fed Binary files /dev/null and b/asset/icon/Icon16/radio_button.png differ diff --git a/asset/icon/Icon16/radioactivity.png b/asset/icon/Icon16/radioactivity.png new file mode 100644 index 0000000..21c51ea Binary files /dev/null and b/asset/icon/Icon16/radioactivity.png differ diff --git a/asset/icon/Icon16/radioactivity_drum.png b/asset/icon/Icon16/radioactivity_drum.png new file mode 100644 index 0000000..83e6007 Binary files /dev/null and b/asset/icon/Icon16/radioactivity_drum.png differ diff --git a/asset/icon/Icon16/radiobutton.png b/asset/icon/Icon16/radiobutton.png new file mode 100644 index 0000000..b32dbea Binary files /dev/null and b/asset/icon/Icon16/radiobutton.png differ diff --git a/asset/icon/Icon16/radiobutton_group.png b/asset/icon/Icon16/radiobutton_group.png new file mode 100644 index 0000000..2490060 Binary files /dev/null and b/asset/icon/Icon16/radiobutton_group.png differ diff --git a/asset/icon/Icon16/radiolocator.png b/asset/icon/Icon16/radiolocator.png new file mode 100644 index 0000000..6692393 Binary files /dev/null and b/asset/icon/Icon16/radiolocator.png differ diff --git a/asset/icon/Icon16/rain.png b/asset/icon/Icon16/rain.png new file mode 100644 index 0000000..db1687f Binary files /dev/null and b/asset/icon/Icon16/rain.png differ diff --git a/asset/icon/Icon16/rainbow.png b/asset/icon/Icon16/rainbow.png new file mode 100644 index 0000000..e0a3307 Binary files /dev/null and b/asset/icon/Icon16/rainbow.png differ diff --git a/asset/icon/Icon16/rainbow_cloud.png b/asset/icon/Icon16/rainbow_cloud.png new file mode 100644 index 0000000..312c769 Binary files /dev/null and b/asset/icon/Icon16/rainbow_cloud.png differ diff --git a/asset/icon/Icon16/raw_access_logs.png b/asset/icon/Icon16/raw_access_logs.png new file mode 100644 index 0000000..dc24d63 Binary files /dev/null and b/asset/icon/Icon16/raw_access_logs.png differ diff --git a/asset/icon/Icon16/readernaut.png b/asset/icon/Icon16/readernaut.png new file mode 100644 index 0000000..43e1c9a Binary files /dev/null and b/asset/icon/Icon16/readernaut.png differ diff --git a/asset/icon/Icon16/reading_view.png b/asset/icon/Icon16/reading_view.png new file mode 100644 index 0000000..1179106 Binary files /dev/null and b/asset/icon/Icon16/reading_view.png differ diff --git a/asset/icon/Icon16/real_estate.png b/asset/icon/Icon16/real_estate.png new file mode 100644 index 0000000..5c38b02 Binary files /dev/null and b/asset/icon/Icon16/real_estate.png differ diff --git a/asset/icon/Icon16/rearrange_account.png b/asset/icon/Icon16/rearrange_account.png new file mode 100644 index 0000000..896b2a2 Binary files /dev/null and b/asset/icon/Icon16/rearrange_account.png differ diff --git a/asset/icon/Icon16/receipt.png b/asset/icon/Icon16/receipt.png new file mode 100644 index 0000000..04a62a1 Binary files /dev/null and b/asset/icon/Icon16/receipt.png differ diff --git a/asset/icon/Icon16/receipt_excel.png b/asset/icon/Icon16/receipt_excel.png new file mode 100644 index 0000000..9848056 Binary files /dev/null and b/asset/icon/Icon16/receipt_excel.png differ diff --git a/asset/icon/Icon16/receipt_invoice.png b/asset/icon/Icon16/receipt_invoice.png new file mode 100644 index 0000000..c7d5f3a Binary files /dev/null and b/asset/icon/Icon16/receipt_invoice.png differ diff --git a/asset/icon/Icon16/receipt_share.png b/asset/icon/Icon16/receipt_share.png new file mode 100644 index 0000000..484b243 Binary files /dev/null and b/asset/icon/Icon16/receipt_share.png differ diff --git a/asset/icon/Icon16/receipt_stamp.png b/asset/icon/Icon16/receipt_stamp.png new file mode 100644 index 0000000..ab4a048 Binary files /dev/null and b/asset/icon/Icon16/receipt_stamp.png differ diff --git a/asset/icon/Icon16/recommended_chart.png b/asset/icon/Icon16/recommended_chart.png new file mode 100644 index 0000000..a3998d5 Binary files /dev/null and b/asset/icon/Icon16/recommended_chart.png differ diff --git a/asset/icon/Icon16/recommended_summart_table.png b/asset/icon/Icon16/recommended_summart_table.png new file mode 100644 index 0000000..40d42fb Binary files /dev/null and b/asset/icon/Icon16/recommended_summart_table.png differ diff --git a/asset/icon/Icon16/record_slide_show.png b/asset/icon/Icon16/record_slide_show.png new file mode 100644 index 0000000..288e27b Binary files /dev/null and b/asset/icon/Icon16/record_slide_show.png differ diff --git a/asset/icon/Icon16/recover_deleted_items.png b/asset/icon/Icon16/recover_deleted_items.png new file mode 100644 index 0000000..7da0279 Binary files /dev/null and b/asset/icon/Icon16/recover_deleted_items.png differ diff --git a/asset/icon/Icon16/recycle.png b/asset/icon/Icon16/recycle.png new file mode 100644 index 0000000..a777a9d Binary files /dev/null and b/asset/icon/Icon16/recycle.png differ diff --git a/asset/icon/Icon16/recycle_bag.png b/asset/icon/Icon16/recycle_bag.png new file mode 100644 index 0000000..05908ee Binary files /dev/null and b/asset/icon/Icon16/recycle_bag.png differ diff --git a/asset/icon/Icon16/red_line.png b/asset/icon/Icon16/red_line.png new file mode 100644 index 0000000..2a55ed7 Binary files /dev/null and b/asset/icon/Icon16/red_line.png differ diff --git a/asset/icon/Icon16/reddit.png b/asset/icon/Icon16/reddit.png new file mode 100644 index 0000000..66299ec Binary files /dev/null and b/asset/icon/Icon16/reddit.png differ diff --git a/asset/icon/Icon16/redirects.png b/asset/icon/Icon16/redirects.png new file mode 100644 index 0000000..aec151a Binary files /dev/null and b/asset/icon/Icon16/redirects.png differ diff --git a/asset/icon/Icon16/redo.png b/asset/icon/Icon16/redo.png new file mode 100644 index 0000000..bb7673c Binary files /dev/null and b/asset/icon/Icon16/redo.png differ diff --git a/asset/icon/Icon16/refresh_all.png b/asset/icon/Icon16/refresh_all.png new file mode 100644 index 0000000..a84219f Binary files /dev/null and b/asset/icon/Icon16/refresh_all.png differ diff --git a/asset/icon/Icon16/regular_expression.png b/asset/icon/Icon16/regular_expression.png new file mode 100644 index 0000000..2f2268b Binary files /dev/null and b/asset/icon/Icon16/regular_expression.png differ diff --git a/asset/icon/Icon16/regular_expression_delimiter.png b/asset/icon/Icon16/regular_expression_delimiter.png new file mode 100644 index 0000000..ddae276 Binary files /dev/null and b/asset/icon/Icon16/regular_expression_delimiter.png differ diff --git a/asset/icon/Icon16/regular_expression_search.png b/asset/icon/Icon16/regular_expression_search.png new file mode 100644 index 0000000..8fbf727 Binary files /dev/null and b/asset/icon/Icon16/regular_expression_search.png differ diff --git a/asset/icon/Icon16/regular_expression_search_light_blue.png b/asset/icon/Icon16/regular_expression_search_light_blue.png new file mode 100644 index 0000000..5f1cc7a Binary files /dev/null and b/asset/icon/Icon16/regular_expression_search_light_blue.png differ diff --git a/asset/icon/Icon16/rehearse_timing.png b/asset/icon/Icon16/rehearse_timing.png new file mode 100644 index 0000000..04dc5be Binary files /dev/null and b/asset/icon/Icon16/rehearse_timing.png differ diff --git a/asset/icon/Icon16/reject.png b/asset/icon/Icon16/reject.png new file mode 100644 index 0000000..001e98d Binary files /dev/null and b/asset/icon/Icon16/reject.png differ diff --git a/asset/icon/Icon16/relationships.png b/asset/icon/Icon16/relationships.png new file mode 100644 index 0000000..c8faa89 Binary files /dev/null and b/asset/icon/Icon16/relationships.png differ diff --git a/asset/icon/Icon16/remote.png b/asset/icon/Icon16/remote.png new file mode 100644 index 0000000..82a304d Binary files /dev/null and b/asset/icon/Icon16/remote.png differ diff --git a/asset/icon/Icon16/remote_sql.png b/asset/icon/Icon16/remote_sql.png new file mode 100644 index 0000000..75ef3d7 Binary files /dev/null and b/asset/icon/Icon16/remote_sql.png differ diff --git a/asset/icon/Icon16/remove_arrows.png b/asset/icon/Icon16/remove_arrows.png new file mode 100644 index 0000000..d6c789a Binary files /dev/null and b/asset/icon/Icon16/remove_arrows.png differ diff --git a/asset/icon/Icon16/report(2).png b/asset/icon/Icon16/report(2).png new file mode 100644 index 0000000..a0181e1 Binary files /dev/null and b/asset/icon/Icon16/report(2).png differ diff --git a/asset/icon/Icon16/report.png b/asset/icon/Icon16/report.png new file mode 100644 index 0000000..9ae5052 Binary files /dev/null and b/asset/icon/Icon16/report.png differ diff --git a/asset/icon/Icon16/report_add.png b/asset/icon/Icon16/report_add.png new file mode 100644 index 0000000..f278ca3 Binary files /dev/null and b/asset/icon/Icon16/report_add.png differ diff --git a/asset/icon/Icon16/report_delete.png b/asset/icon/Icon16/report_delete.png new file mode 100644 index 0000000..e0120e8 Binary files /dev/null and b/asset/icon/Icon16/report_delete.png differ diff --git a/asset/icon/Icon16/report_design.png b/asset/icon/Icon16/report_design.png new file mode 100644 index 0000000..bb9dab3 Binary files /dev/null and b/asset/icon/Icon16/report_design.png differ diff --git a/asset/icon/Icon16/report_disk.png b/asset/icon/Icon16/report_disk.png new file mode 100644 index 0000000..06a93f3 Binary files /dev/null and b/asset/icon/Icon16/report_disk.png differ diff --git a/asset/icon/Icon16/report_edit.png b/asset/icon/Icon16/report_edit.png new file mode 100644 index 0000000..fcbcdeb Binary files /dev/null and b/asset/icon/Icon16/report_edit.png differ diff --git a/asset/icon/Icon16/report_go.png b/asset/icon/Icon16/report_go.png new file mode 100644 index 0000000..05959ad Binary files /dev/null and b/asset/icon/Icon16/report_go.png differ diff --git a/asset/icon/Icon16/report_images.png b/asset/icon/Icon16/report_images.png new file mode 100644 index 0000000..186a54a Binary files /dev/null and b/asset/icon/Icon16/report_images.png differ diff --git a/asset/icon/Icon16/report_key.png b/asset/icon/Icon16/report_key.png new file mode 100644 index 0000000..fab9b0e Binary files /dev/null and b/asset/icon/Icon16/report_key.png differ diff --git a/asset/icon/Icon16/report_link.png b/asset/icon/Icon16/report_link.png new file mode 100644 index 0000000..b5e59ce Binary files /dev/null and b/asset/icon/Icon16/report_link.png differ diff --git a/asset/icon/Icon16/report_magnify.png b/asset/icon/Icon16/report_magnify.png new file mode 100644 index 0000000..0f6b207 Binary files /dev/null and b/asset/icon/Icon16/report_magnify.png differ diff --git a/asset/icon/Icon16/report_picture.png b/asset/icon/Icon16/report_picture.png new file mode 100644 index 0000000..2fed78f Binary files /dev/null and b/asset/icon/Icon16/report_picture.png differ diff --git a/asset/icon/Icon16/report_stack.png b/asset/icon/Icon16/report_stack.png new file mode 100644 index 0000000..5e502f4 Binary files /dev/null and b/asset/icon/Icon16/report_stack.png differ diff --git a/asset/icon/Icon16/report_torn.png b/asset/icon/Icon16/report_torn.png new file mode 100644 index 0000000..e3e14e9 Binary files /dev/null and b/asset/icon/Icon16/report_torn.png differ diff --git a/asset/icon/Icon16/report_user.png b/asset/icon/Icon16/report_user.png new file mode 100644 index 0000000..3b518ac Binary files /dev/null and b/asset/icon/Icon16/report_user.png differ diff --git a/asset/icon/Icon16/report_wizard.png b/asset/icon/Icon16/report_wizard.png new file mode 100644 index 0000000..6fa5c9b Binary files /dev/null and b/asset/icon/Icon16/report_wizard.png differ diff --git a/asset/icon/Icon16/report_word.png b/asset/icon/Icon16/report_word.png new file mode 100644 index 0000000..8a1a116 Binary files /dev/null and b/asset/icon/Icon16/report_word.png differ diff --git a/asset/icon/Icon16/reports.png b/asset/icon/Icon16/reports.png new file mode 100644 index 0000000..35984d3 Binary files /dev/null and b/asset/icon/Icon16/reports.png differ diff --git a/asset/icon/Icon16/research.png b/asset/icon/Icon16/research.png new file mode 100644 index 0000000..834d9a0 Binary files /dev/null and b/asset/icon/Icon16/research.png differ diff --git a/asset/icon/Icon16/reseller_account.png b/asset/icon/Icon16/reseller_account.png new file mode 100644 index 0000000..b8cae8a Binary files /dev/null and b/asset/icon/Icon16/reseller_account.png differ diff --git a/asset/icon/Icon16/reseller_account_template.png b/asset/icon/Icon16/reseller_account_template.png new file mode 100644 index 0000000..25b92fa Binary files /dev/null and b/asset/icon/Icon16/reseller_account_template.png differ diff --git a/asset/icon/Icon16/reseller_programm.png b/asset/icon/Icon16/reseller_programm.png new file mode 100644 index 0000000..f00dcd7 Binary files /dev/null and b/asset/icon/Icon16/reseller_programm.png differ diff --git a/asset/icon/Icon16/reset_dns_zone.png b/asset/icon/Icon16/reset_dns_zone.png new file mode 100644 index 0000000..00c0ed0 Binary files /dev/null and b/asset/icon/Icon16/reset_dns_zone.png differ diff --git a/asset/icon/Icon16/reset_slide.png b/asset/icon/Icon16/reset_slide.png new file mode 100644 index 0000000..832ae01 Binary files /dev/null and b/asset/icon/Icon16/reset_slide.png differ diff --git a/asset/icon/Icon16/reset_windows_position.png b/asset/icon/Icon16/reset_windows_position.png new file mode 100644 index 0000000..eb4a20d Binary files /dev/null and b/asset/icon/Icon16/reset_windows_position.png differ diff --git a/asset/icon/Icon16/resize_picture.png b/asset/icon/Icon16/resize_picture.png new file mode 100644 index 0000000..aa17ab4 Binary files /dev/null and b/asset/icon/Icon16/resize_picture.png differ diff --git a/asset/icon/Icon16/resource_usage.png b/asset/icon/Icon16/resource_usage.png new file mode 100644 index 0000000..72a8318 Binary files /dev/null and b/asset/icon/Icon16/resource_usage.png differ diff --git a/asset/icon/Icon16/resource_usage_protect.png b/asset/icon/Icon16/resource_usage_protect.png new file mode 100644 index 0000000..2f70888 Binary files /dev/null and b/asset/icon/Icon16/resource_usage_protect.png differ diff --git a/asset/icon/Icon16/resources.png b/asset/icon/Icon16/resources.png new file mode 100644 index 0000000..4e6ec6b Binary files /dev/null and b/asset/icon/Icon16/resources.png differ diff --git a/asset/icon/Icon16/restart_services.png b/asset/icon/Icon16/restart_services.png new file mode 100644 index 0000000..f271ef5 Binary files /dev/null and b/asset/icon/Icon16/restart_services.png differ diff --git a/asset/icon/Icon16/restaurant_menu.png b/asset/icon/Icon16/restaurant_menu.png new file mode 100644 index 0000000..6e32839 Binary files /dev/null and b/asset/icon/Icon16/restaurant_menu.png differ diff --git a/asset/icon/Icon16/resultset_first.png b/asset/icon/Icon16/resultset_first.png new file mode 100644 index 0000000..876b39a Binary files /dev/null and b/asset/icon/Icon16/resultset_first.png differ diff --git a/asset/icon/Icon16/resultset_last.png b/asset/icon/Icon16/resultset_last.png new file mode 100644 index 0000000..b8c4f09 Binary files /dev/null and b/asset/icon/Icon16/resultset_last.png differ diff --git a/asset/icon/Icon16/resultset_next.png b/asset/icon/Icon16/resultset_next.png new file mode 100644 index 0000000..59b58a4 Binary files /dev/null and b/asset/icon/Icon16/resultset_next.png differ diff --git a/asset/icon/Icon16/resultset_previous.png b/asset/icon/Icon16/resultset_previous.png new file mode 100644 index 0000000..73b8332 Binary files /dev/null and b/asset/icon/Icon16/resultset_previous.png differ diff --git a/asset/icon/Icon16/reviewing_pane.png b/asset/icon/Icon16/reviewing_pane.png new file mode 100644 index 0000000..37091a7 Binary files /dev/null and b/asset/icon/Icon16/reviewing_pane.png differ diff --git a/asset/icon/Icon16/ribbon(2).png b/asset/icon/Icon16/ribbon(2).png new file mode 100644 index 0000000..9700cdf Binary files /dev/null and b/asset/icon/Icon16/ribbon(2).png differ diff --git a/asset/icon/Icon16/ribbon.png b/asset/icon/Icon16/ribbon.png new file mode 100644 index 0000000..3613f52 Binary files /dev/null and b/asset/icon/Icon16/ribbon.png differ diff --git a/asset/icon/Icon16/richtext_editor.png b/asset/icon/Icon16/richtext_editor.png new file mode 100644 index 0000000..48b034f Binary files /dev/null and b/asset/icon/Icon16/richtext_editor.png differ diff --git a/asset/icon/Icon16/ring.png b/asset/icon/Icon16/ring.png new file mode 100644 index 0000000..dbb6eaf Binary files /dev/null and b/asset/icon/Icon16/ring.png differ diff --git a/asset/icon/Icon16/rip.png b/asset/icon/Icon16/rip.png new file mode 100644 index 0000000..274b595 Binary files /dev/null and b/asset/icon/Icon16/rip.png differ diff --git a/asset/icon/Icon16/road_sign(2).png b/asset/icon/Icon16/road_sign(2).png new file mode 100644 index 0000000..f999144 Binary files /dev/null and b/asset/icon/Icon16/road_sign(2).png differ diff --git a/asset/icon/Icon16/road_sign.png b/asset/icon/Icon16/road_sign.png new file mode 100644 index 0000000..8a11b53 Binary files /dev/null and b/asset/icon/Icon16/road_sign.png differ diff --git a/asset/icon/Icon16/roadworks.png b/asset/icon/Icon16/roadworks.png new file mode 100644 index 0000000..c9182ca Binary files /dev/null and b/asset/icon/Icon16/roadworks.png differ diff --git a/asset/icon/Icon16/robo_to.png b/asset/icon/Icon16/robo_to.png new file mode 100644 index 0000000..c7e0ee1 Binary files /dev/null and b/asset/icon/Icon16/robo_to.png differ diff --git a/asset/icon/Icon16/robot.png b/asset/icon/Icon16/robot.png new file mode 100644 index 0000000..5cec78c Binary files /dev/null and b/asset/icon/Icon16/robot.png differ diff --git a/asset/icon/Icon16/rocket.png b/asset/icon/Icon16/rocket.png new file mode 100644 index 0000000..31d184a Binary files /dev/null and b/asset/icon/Icon16/rocket.png differ diff --git a/asset/icon/Icon16/rocking_chair.png b/asset/icon/Icon16/rocking_chair.png new file mode 100644 index 0000000..ed51842 Binary files /dev/null and b/asset/icon/Icon16/rocking_chair.png differ diff --git a/asset/icon/Icon16/role.png b/asset/icon/Icon16/role.png new file mode 100644 index 0000000..512dc12 Binary files /dev/null and b/asset/icon/Icon16/role.png differ diff --git a/asset/icon/Icon16/rosette.png b/asset/icon/Icon16/rosette.png new file mode 100644 index 0000000..6dedc27 Binary files /dev/null and b/asset/icon/Icon16/rosette.png differ diff --git a/asset/icon/Icon16/rosette_2.png b/asset/icon/Icon16/rosette_2.png new file mode 100644 index 0000000..7d8e59a Binary files /dev/null and b/asset/icon/Icon16/rosette_2.png differ diff --git a/asset/icon/Icon16/rotate_90.png b/asset/icon/Icon16/rotate_90.png new file mode 100644 index 0000000..39c2c6d Binary files /dev/null and b/asset/icon/Icon16/rotate_90.png differ diff --git a/asset/icon/Icon16/router.png b/asset/icon/Icon16/router.png new file mode 100644 index 0000000..53742e0 Binary files /dev/null and b/asset/icon/Icon16/router.png differ diff --git a/asset/icon/Icon16/routing_around.png b/asset/icon/Icon16/routing_around.png new file mode 100644 index 0000000..4b5a9ed Binary files /dev/null and b/asset/icon/Icon16/routing_around.png differ diff --git a/asset/icon/Icon16/routing_forward.png b/asset/icon/Icon16/routing_forward.png new file mode 100644 index 0000000..414192b Binary files /dev/null and b/asset/icon/Icon16/routing_forward.png differ diff --git a/asset/icon/Icon16/routing_go_left.png b/asset/icon/Icon16/routing_go_left.png new file mode 100644 index 0000000..c4ab4e3 Binary files /dev/null and b/asset/icon/Icon16/routing_go_left.png differ diff --git a/asset/icon/Icon16/routing_go_right.png b/asset/icon/Icon16/routing_go_right.png new file mode 100644 index 0000000..48f6a89 Binary files /dev/null and b/asset/icon/Icon16/routing_go_right.png differ diff --git a/asset/icon/Icon16/routing_go_straight_left.png b/asset/icon/Icon16/routing_go_straight_left.png new file mode 100644 index 0000000..887f3cd Binary files /dev/null and b/asset/icon/Icon16/routing_go_straight_left.png differ diff --git a/asset/icon/Icon16/routing_go_straight_right.png b/asset/icon/Icon16/routing_go_straight_right.png new file mode 100644 index 0000000..64ac70c Binary files /dev/null and b/asset/icon/Icon16/routing_go_straight_right.png differ diff --git a/asset/icon/Icon16/routing_intersection_right.png b/asset/icon/Icon16/routing_intersection_right.png new file mode 100644 index 0000000..1e8ea42 Binary files /dev/null and b/asset/icon/Icon16/routing_intersection_right.png differ diff --git a/asset/icon/Icon16/routing_turn_arround_left.png b/asset/icon/Icon16/routing_turn_arround_left.png new file mode 100644 index 0000000..79a43ba Binary files /dev/null and b/asset/icon/Icon16/routing_turn_arround_left.png differ diff --git a/asset/icon/Icon16/routing_turn_arround_right.png b/asset/icon/Icon16/routing_turn_arround_right.png new file mode 100644 index 0000000..7880b46 Binary files /dev/null and b/asset/icon/Icon16/routing_turn_arround_right.png differ diff --git a/asset/icon/Icon16/routing_turn_left.png b/asset/icon/Icon16/routing_turn_left.png new file mode 100644 index 0000000..2b6d6a0 Binary files /dev/null and b/asset/icon/Icon16/routing_turn_left.png differ diff --git a/asset/icon/Icon16/routing_turn_left_2.png b/asset/icon/Icon16/routing_turn_left_2.png new file mode 100644 index 0000000..a08b91c Binary files /dev/null and b/asset/icon/Icon16/routing_turn_left_2.png differ diff --git a/asset/icon/Icon16/routing_turn_left_crossroads.png b/asset/icon/Icon16/routing_turn_left_crossroads.png new file mode 100644 index 0000000..0908225 Binary files /dev/null and b/asset/icon/Icon16/routing_turn_left_crossroads.png differ diff --git a/asset/icon/Icon16/routing_turn_right.png b/asset/icon/Icon16/routing_turn_right.png new file mode 100644 index 0000000..0d797c4 Binary files /dev/null and b/asset/icon/Icon16/routing_turn_right.png differ diff --git a/asset/icon/Icon16/routing_turn_right_2.png b/asset/icon/Icon16/routing_turn_right_2.png new file mode 100644 index 0000000..cb15c83 Binary files /dev/null and b/asset/icon/Icon16/routing_turn_right_2.png differ diff --git a/asset/icon/Icon16/routing_turn_u.png b/asset/icon/Icon16/routing_turn_u.png new file mode 100644 index 0000000..a7186d5 Binary files /dev/null and b/asset/icon/Icon16/routing_turn_u.png differ diff --git a/asset/icon/Icon16/routing_turnaround_left.png b/asset/icon/Icon16/routing_turnaround_left.png new file mode 100644 index 0000000..f4901c6 Binary files /dev/null and b/asset/icon/Icon16/routing_turnaround_left.png differ diff --git a/asset/icon/Icon16/routing_turnaround_right.png b/asset/icon/Icon16/routing_turnaround_right.png new file mode 100644 index 0000000..6ec621c Binary files /dev/null and b/asset/icon/Icon16/routing_turnaround_right.png differ diff --git a/asset/icon/Icon16/routing_turning_left.png b/asset/icon/Icon16/routing_turning_left.png new file mode 100644 index 0000000..b07869c Binary files /dev/null and b/asset/icon/Icon16/routing_turning_left.png differ diff --git a/asset/icon/Icon16/routing_turning_right.png b/asset/icon/Icon16/routing_turning_right.png new file mode 100644 index 0000000..d973851 Binary files /dev/null and b/asset/icon/Icon16/routing_turning_right.png differ diff --git a/asset/icon/Icon16/rss.png b/asset/icon/Icon16/rss.png new file mode 100644 index 0000000..1e0673a Binary files /dev/null and b/asset/icon/Icon16/rss.png differ diff --git a/asset/icon/Icon16/rss_add.png b/asset/icon/Icon16/rss_add.png new file mode 100644 index 0000000..e3b116b Binary files /dev/null and b/asset/icon/Icon16/rss_add.png differ diff --git a/asset/icon/Icon16/rss_delete.png b/asset/icon/Icon16/rss_delete.png new file mode 100644 index 0000000..d86553e Binary files /dev/null and b/asset/icon/Icon16/rss_delete.png differ diff --git a/asset/icon/Icon16/rss_go.png b/asset/icon/Icon16/rss_go.png new file mode 100644 index 0000000..023d5e6 Binary files /dev/null and b/asset/icon/Icon16/rss_go.png differ diff --git a/asset/icon/Icon16/rss_valid.png b/asset/icon/Icon16/rss_valid.png new file mode 100644 index 0000000..d36882f Binary files /dev/null and b/asset/icon/Icon16/rss_valid.png differ diff --git a/asset/icon/Icon16/rubber_duck.png b/asset/icon/Icon16/rubber_duck.png new file mode 100644 index 0000000..0ec3def Binary files /dev/null and b/asset/icon/Icon16/rubber_duck.png differ diff --git a/asset/icon/Icon16/ruby.png b/asset/icon/Icon16/ruby.png new file mode 100644 index 0000000..24755ce Binary files /dev/null and b/asset/icon/Icon16/ruby.png differ diff --git a/asset/icon/Icon16/ruby_add.png b/asset/icon/Icon16/ruby_add.png new file mode 100644 index 0000000..7390730 Binary files /dev/null and b/asset/icon/Icon16/ruby_add.png differ diff --git a/asset/icon/Icon16/ruby_delete.png b/asset/icon/Icon16/ruby_delete.png new file mode 100644 index 0000000..bac7582 Binary files /dev/null and b/asset/icon/Icon16/ruby_delete.png differ diff --git a/asset/icon/Icon16/ruby_gear.png b/asset/icon/Icon16/ruby_gear.png new file mode 100644 index 0000000..38dafc8 Binary files /dev/null and b/asset/icon/Icon16/ruby_gear.png differ diff --git a/asset/icon/Icon16/ruby_get.png b/asset/icon/Icon16/ruby_get.png new file mode 100644 index 0000000..614fd05 Binary files /dev/null and b/asset/icon/Icon16/ruby_get.png differ diff --git a/asset/icon/Icon16/ruby_go.png b/asset/icon/Icon16/ruby_go.png new file mode 100644 index 0000000..25a489e Binary files /dev/null and b/asset/icon/Icon16/ruby_go.png differ diff --git a/asset/icon/Icon16/ruby_key.png b/asset/icon/Icon16/ruby_key.png new file mode 100644 index 0000000..6b12a5b Binary files /dev/null and b/asset/icon/Icon16/ruby_key.png differ diff --git a/asset/icon/Icon16/ruby_link.png b/asset/icon/Icon16/ruby_link.png new file mode 100644 index 0000000..34f2697 Binary files /dev/null and b/asset/icon/Icon16/ruby_link.png differ diff --git a/asset/icon/Icon16/ruby_put.png b/asset/icon/Icon16/ruby_put.png new file mode 100644 index 0000000..8d11727 Binary files /dev/null and b/asset/icon/Icon16/ruby_put.png differ diff --git a/asset/icon/Icon16/rules.png b/asset/icon/Icon16/rules.png new file mode 100644 index 0000000..5d496e7 Binary files /dev/null and b/asset/icon/Icon16/rules.png differ diff --git a/asset/icon/Icon16/run_macros.png b/asset/icon/Icon16/run_macros.png new file mode 100644 index 0000000..37c66ea Binary files /dev/null and b/asset/icon/Icon16/run_macros.png differ diff --git a/asset/icon/Icon16/safari_browser.png b/asset/icon/Icon16/safari_browser.png new file mode 100644 index 0000000..6abed54 Binary files /dev/null and b/asset/icon/Icon16/safari_browser.png differ diff --git a/asset/icon/Icon16/safe.png b/asset/icon/Icon16/safe.png new file mode 100644 index 0000000..b2aeef6 Binary files /dev/null and b/asset/icon/Icon16/safe.png differ diff --git a/asset/icon/Icon16/sallary_deferrais.png b/asset/icon/Icon16/sallary_deferrais.png new file mode 100644 index 0000000..273b009 Binary files /dev/null and b/asset/icon/Icon16/sallary_deferrais.png differ diff --git a/asset/icon/Icon16/salver.png b/asset/icon/Icon16/salver.png new file mode 100644 index 0000000..13fcdc2 Binary files /dev/null and b/asset/icon/Icon16/salver.png differ diff --git a/asset/icon/Icon16/santa.png b/asset/icon/Icon16/santa.png new file mode 100644 index 0000000..a2e1c5c Binary files /dev/null and b/asset/icon/Icon16/santa.png differ diff --git a/asset/icon/Icon16/santa_hat.png b/asset/icon/Icon16/santa_hat.png new file mode 100644 index 0000000..c1ce171 Binary files /dev/null and b/asset/icon/Icon16/santa_hat.png differ diff --git a/asset/icon/Icon16/satellite.png b/asset/icon/Icon16/satellite.png new file mode 100644 index 0000000..635ce55 Binary files /dev/null and b/asset/icon/Icon16/satellite.png differ diff --git a/asset/icon/Icon16/satellite_dish.png b/asset/icon/Icon16/satellite_dish.png new file mode 100644 index 0000000..c16cf4c Binary files /dev/null and b/asset/icon/Icon16/satellite_dish.png differ diff --git a/asset/icon/Icon16/save_as.png b/asset/icon/Icon16/save_as.png new file mode 100644 index 0000000..49905d5 Binary files /dev/null and b/asset/icon/Icon16/save_as.png differ diff --git a/asset/icon/Icon16/save_data.png b/asset/icon/Icon16/save_data.png new file mode 100644 index 0000000..470bf48 Binary files /dev/null and b/asset/icon/Icon16/save_data.png differ diff --git a/asset/icon/Icon16/save_money.png b/asset/icon/Icon16/save_money.png new file mode 100644 index 0000000..eae8776 Binary files /dev/null and b/asset/icon/Icon16/save_money.png differ diff --git a/asset/icon/Icon16/saved_exports.png b/asset/icon/Icon16/saved_exports.png new file mode 100644 index 0000000..b8ed7ff Binary files /dev/null and b/asset/icon/Icon16/saved_exports.png differ diff --git a/asset/icon/Icon16/saved_imports.png b/asset/icon/Icon16/saved_imports.png new file mode 100644 index 0000000..ac21c10 Binary files /dev/null and b/asset/icon/Icon16/saved_imports.png differ diff --git a/asset/icon/Icon16/scale_image.png b/asset/icon/Icon16/scale_image.png new file mode 100644 index 0000000..0ede80a Binary files /dev/null and b/asset/icon/Icon16/scale_image.png differ diff --git a/asset/icon/Icon16/scalpel.png b/asset/icon/Icon16/scalpel.png new file mode 100644 index 0000000..5cfc96f Binary files /dev/null and b/asset/icon/Icon16/scalpel.png differ diff --git a/asset/icon/Icon16/scanner.png b/asset/icon/Icon16/scanner.png new file mode 100644 index 0000000..eae78a6 Binary files /dev/null and b/asset/icon/Icon16/scanner.png differ diff --git a/asset/icon/Icon16/scanner_working.png b/asset/icon/Icon16/scanner_working.png new file mode 100644 index 0000000..9a18c74 Binary files /dev/null and b/asset/icon/Icon16/scanner_working.png differ diff --git a/asset/icon/Icon16/screen_error.png b/asset/icon/Icon16/screen_error.png new file mode 100644 index 0000000..f743837 Binary files /dev/null and b/asset/icon/Icon16/screen_error.png differ diff --git a/asset/icon/Icon16/screwdriver.png b/asset/icon/Icon16/screwdriver.png new file mode 100644 index 0000000..485a136 Binary files /dev/null and b/asset/icon/Icon16/screwdriver.png differ diff --git a/asset/icon/Icon16/script.png b/asset/icon/Icon16/script.png new file mode 100644 index 0000000..ec93a22 Binary files /dev/null and b/asset/icon/Icon16/script.png differ diff --git a/asset/icon/Icon16/script_add.png b/asset/icon/Icon16/script_add.png new file mode 100644 index 0000000..8e3ca86 Binary files /dev/null and b/asset/icon/Icon16/script_add.png differ diff --git a/asset/icon/Icon16/script_binary.png b/asset/icon/Icon16/script_binary.png new file mode 100644 index 0000000..eef19a0 Binary files /dev/null and b/asset/icon/Icon16/script_binary.png differ diff --git a/asset/icon/Icon16/script_black.png b/asset/icon/Icon16/script_black.png new file mode 100644 index 0000000..7758d33 Binary files /dev/null and b/asset/icon/Icon16/script_black.png differ diff --git a/asset/icon/Icon16/script_bricks.png b/asset/icon/Icon16/script_bricks.png new file mode 100644 index 0000000..c1aefef Binary files /dev/null and b/asset/icon/Icon16/script_bricks.png differ diff --git a/asset/icon/Icon16/script_code.png b/asset/icon/Icon16/script_code.png new file mode 100644 index 0000000..4b98ad6 Binary files /dev/null and b/asset/icon/Icon16/script_code.png differ diff --git a/asset/icon/Icon16/script_code_red.png b/asset/icon/Icon16/script_code_red.png new file mode 100644 index 0000000..3a25198 Binary files /dev/null and b/asset/icon/Icon16/script_code_red.png differ diff --git a/asset/icon/Icon16/script_delete.png b/asset/icon/Icon16/script_delete.png new file mode 100644 index 0000000..2cca10f Binary files /dev/null and b/asset/icon/Icon16/script_delete.png differ diff --git a/asset/icon/Icon16/script_edit.png b/asset/icon/Icon16/script_edit.png new file mode 100644 index 0000000..7137e41 Binary files /dev/null and b/asset/icon/Icon16/script_edit.png differ diff --git a/asset/icon/Icon16/script_error.png b/asset/icon/Icon16/script_error.png new file mode 100644 index 0000000..8ac7176 Binary files /dev/null and b/asset/icon/Icon16/script_error.png differ diff --git a/asset/icon/Icon16/script_excel.png b/asset/icon/Icon16/script_excel.png new file mode 100644 index 0000000..5230252 Binary files /dev/null and b/asset/icon/Icon16/script_excel.png differ diff --git a/asset/icon/Icon16/script_export.png b/asset/icon/Icon16/script_export.png new file mode 100644 index 0000000..7caf718 Binary files /dev/null and b/asset/icon/Icon16/script_export.png differ diff --git a/asset/icon/Icon16/script_flash.png b/asset/icon/Icon16/script_flash.png new file mode 100644 index 0000000..de85bff Binary files /dev/null and b/asset/icon/Icon16/script_flash.png differ diff --git a/asset/icon/Icon16/script_gear.png b/asset/icon/Icon16/script_gear.png new file mode 100644 index 0000000..54805d4 Binary files /dev/null and b/asset/icon/Icon16/script_gear.png differ diff --git a/asset/icon/Icon16/script_globe.png b/asset/icon/Icon16/script_globe.png new file mode 100644 index 0000000..9c55a0b Binary files /dev/null and b/asset/icon/Icon16/script_globe.png differ diff --git a/asset/icon/Icon16/script_go.png b/asset/icon/Icon16/script_go.png new file mode 100644 index 0000000..b8d5442 Binary files /dev/null and b/asset/icon/Icon16/script_go.png differ diff --git a/asset/icon/Icon16/script_green.png b/asset/icon/Icon16/script_green.png new file mode 100644 index 0000000..12a8eb1 Binary files /dev/null and b/asset/icon/Icon16/script_green.png differ diff --git a/asset/icon/Icon16/script_import.png b/asset/icon/Icon16/script_import.png new file mode 100644 index 0000000..d3bf103 Binary files /dev/null and b/asset/icon/Icon16/script_import.png differ diff --git a/asset/icon/Icon16/script_key.png b/asset/icon/Icon16/script_key.png new file mode 100644 index 0000000..00fea4e Binary files /dev/null and b/asset/icon/Icon16/script_key.png differ diff --git a/asset/icon/Icon16/script_lightning.png b/asset/icon/Icon16/script_lightning.png new file mode 100644 index 0000000..4437792 Binary files /dev/null and b/asset/icon/Icon16/script_lightning.png differ diff --git a/asset/icon/Icon16/script_link.png b/asset/icon/Icon16/script_link.png new file mode 100644 index 0000000..7962dfc Binary files /dev/null and b/asset/icon/Icon16/script_link.png differ diff --git a/asset/icon/Icon16/script_office.png b/asset/icon/Icon16/script_office.png new file mode 100644 index 0000000..8361eef Binary files /dev/null and b/asset/icon/Icon16/script_office.png differ diff --git a/asset/icon/Icon16/script_palette.png b/asset/icon/Icon16/script_palette.png new file mode 100644 index 0000000..504eb54 Binary files /dev/null and b/asset/icon/Icon16/script_palette.png differ diff --git a/asset/icon/Icon16/script_php.png b/asset/icon/Icon16/script_php.png new file mode 100644 index 0000000..b90cfc1 Binary files /dev/null and b/asset/icon/Icon16/script_php.png differ diff --git a/asset/icon/Icon16/script_red.png b/asset/icon/Icon16/script_red.png new file mode 100644 index 0000000..bbeaa27 Binary files /dev/null and b/asset/icon/Icon16/script_red.png differ diff --git a/asset/icon/Icon16/script_save.png b/asset/icon/Icon16/script_save.png new file mode 100644 index 0000000..bad2273 Binary files /dev/null and b/asset/icon/Icon16/script_save.png differ diff --git a/asset/icon/Icon16/script_stamp.png b/asset/icon/Icon16/script_stamp.png new file mode 100644 index 0000000..68b6c2e Binary files /dev/null and b/asset/icon/Icon16/script_stamp.png differ diff --git a/asset/icon/Icon16/script_text.png b/asset/icon/Icon16/script_text.png new file mode 100644 index 0000000..296494d Binary files /dev/null and b/asset/icon/Icon16/script_text.png differ diff --git a/asset/icon/Icon16/script_torn.png b/asset/icon/Icon16/script_torn.png new file mode 100644 index 0000000..faeafb1 Binary files /dev/null and b/asset/icon/Icon16/script_torn.png differ diff --git a/asset/icon/Icon16/script_visual_studio.png b/asset/icon/Icon16/script_visual_studio.png new file mode 100644 index 0000000..cc7de31 Binary files /dev/null and b/asset/icon/Icon16/script_visual_studio.png differ diff --git a/asset/icon/Icon16/script_word.png b/asset/icon/Icon16/script_word.png new file mode 100644 index 0000000..b45ce2b Binary files /dev/null and b/asset/icon/Icon16/script_word.png differ diff --git a/asset/icon/Icon16/script_yellow.png b/asset/icon/Icon16/script_yellow.png new file mode 100644 index 0000000..802adfd Binary files /dev/null and b/asset/icon/Icon16/script_yellow.png differ diff --git a/asset/icon/Icon16/scripts(2).png b/asset/icon/Icon16/scripts(2).png new file mode 100644 index 0000000..c364714 Binary files /dev/null and b/asset/icon/Icon16/scripts(2).png differ diff --git a/asset/icon/Icon16/scripts.png b/asset/icon/Icon16/scripts.png new file mode 100644 index 0000000..d36a62b Binary files /dev/null and b/asset/icon/Icon16/scripts.png differ diff --git a/asset/icon/Icon16/scripts_text.png b/asset/icon/Icon16/scripts_text.png new file mode 100644 index 0000000..08bebd2 Binary files /dev/null and b/asset/icon/Icon16/scripts_text.png differ diff --git a/asset/icon/Icon16/scroll_bar.png b/asset/icon/Icon16/scroll_bar.png new file mode 100644 index 0000000..31da431 Binary files /dev/null and b/asset/icon/Icon16/scroll_bar.png differ diff --git a/asset/icon/Icon16/scroll_bar_horizontal.png b/asset/icon/Icon16/scroll_bar_horizontal.png new file mode 100644 index 0000000..3c65b8d Binary files /dev/null and b/asset/icon/Icon16/scroll_bar_horizontal.png differ diff --git a/asset/icon/Icon16/scroll_pane.png b/asset/icon/Icon16/scroll_pane.png new file mode 100644 index 0000000..d74ab0a Binary files /dev/null and b/asset/icon/Icon16/scroll_pane.png differ diff --git a/asset/icon/Icon16/scroll_pane_blog.png b/asset/icon/Icon16/scroll_pane_blog.png new file mode 100644 index 0000000..24f3f7b Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_blog.png differ diff --git a/asset/icon/Icon16/scroll_pane_both.png b/asset/icon/Icon16/scroll_pane_both.png new file mode 100644 index 0000000..c08c698 Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_both.png differ diff --git a/asset/icon/Icon16/scroll_pane_detail.png b/asset/icon/Icon16/scroll_pane_detail.png new file mode 100644 index 0000000..4b500a1 Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_detail.png differ diff --git a/asset/icon/Icon16/scroll_pane_form.png b/asset/icon/Icon16/scroll_pane_form.png new file mode 100644 index 0000000..b7507eb Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_form.png differ diff --git a/asset/icon/Icon16/scroll_pane_horizontal.png b/asset/icon/Icon16/scroll_pane_horizontal.png new file mode 100644 index 0000000..b927122 Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_horizontal.png differ diff --git a/asset/icon/Icon16/scroll_pane_icon.png b/asset/icon/Icon16/scroll_pane_icon.png new file mode 100644 index 0000000..8483465 Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_icon.png differ diff --git a/asset/icon/Icon16/scroll_pane_image.png b/asset/icon/Icon16/scroll_pane_image.png new file mode 100644 index 0000000..3e87740 Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_image.png differ diff --git a/asset/icon/Icon16/scroll_pane_list.png b/asset/icon/Icon16/scroll_pane_list.png new file mode 100644 index 0000000..139a25e Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_list.png differ diff --git a/asset/icon/Icon16/scroll_pane_table.png b/asset/icon/Icon16/scroll_pane_table.png new file mode 100644 index 0000000..f86af19 Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_table.png differ diff --git a/asset/icon/Icon16/scroll_pane_text.png b/asset/icon/Icon16/scroll_pane_text.png new file mode 100644 index 0000000..e85b656 Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_text.png differ diff --git a/asset/icon/Icon16/scroll_pane_text_image.png b/asset/icon/Icon16/scroll_pane_text_image.png new file mode 100644 index 0000000..3bf28af Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_text_image.png differ diff --git a/asset/icon/Icon16/scroll_pane_tree.png b/asset/icon/Icon16/scroll_pane_tree.png new file mode 100644 index 0000000..4c6d279 Binary files /dev/null and b/asset/icon/Icon16/scroll_pane_tree.png differ diff --git a/asset/icon/Icon16/scroller_bar.png b/asset/icon/Icon16/scroller_bar.png new file mode 100644 index 0000000..7e588bd Binary files /dev/null and b/asset/icon/Icon16/scroller_bar.png differ diff --git a/asset/icon/Icon16/scull.png b/asset/icon/Icon16/scull.png new file mode 100644 index 0000000..7eadc96 Binary files /dev/null and b/asset/icon/Icon16/scull.png differ diff --git a/asset/icon/Icon16/sd_memory_adapter.png b/asset/icon/Icon16/sd_memory_adapter.png new file mode 100644 index 0000000..c02119b Binary files /dev/null and b/asset/icon/Icon16/sd_memory_adapter.png differ diff --git a/asset/icon/Icon16/search_accounts.png b/asset/icon/Icon16/search_accounts.png new file mode 100644 index 0000000..fab7833 Binary files /dev/null and b/asset/icon/Icon16/search_accounts.png differ diff --git a/asset/icon/Icon16/search_field.png b/asset/icon/Icon16/search_field.png new file mode 100644 index 0000000..3ba4217 Binary files /dev/null and b/asset/icon/Icon16/search_field.png differ diff --git a/asset/icon/Icon16/search_minus.png b/asset/icon/Icon16/search_minus.png new file mode 100644 index 0000000..d4a1fc5 Binary files /dev/null and b/asset/icon/Icon16/search_minus.png differ diff --git a/asset/icon/Icon16/search_plus.png b/asset/icon/Icon16/search_plus.png new file mode 100644 index 0000000..c55215f Binary files /dev/null and b/asset/icon/Icon16/search_plus.png differ diff --git a/asset/icon/Icon16/security.png b/asset/icon/Icon16/security.png new file mode 100644 index 0000000..95102d0 Binary files /dev/null and b/asset/icon/Icon16/security.png differ diff --git a/asset/icon/Icon16/seek_bar.png b/asset/icon/Icon16/seek_bar.png new file mode 100644 index 0000000..10013ea Binary files /dev/null and b/asset/icon/Icon16/seek_bar.png differ diff --git a/asset/icon/Icon16/seek_bar_050.png b/asset/icon/Icon16/seek_bar_050.png new file mode 100644 index 0000000..5df309c Binary files /dev/null and b/asset/icon/Icon16/seek_bar_050.png differ diff --git a/asset/icon/Icon16/seek_bar_100.png b/asset/icon/Icon16/seek_bar_100.png new file mode 100644 index 0000000..8113217 Binary files /dev/null and b/asset/icon/Icon16/seek_bar_100.png differ diff --git a/asset/icon/Icon16/select.png b/asset/icon/Icon16/select.png new file mode 100644 index 0000000..1420726 Binary files /dev/null and b/asset/icon/Icon16/select.png differ diff --git a/asset/icon/Icon16/select_by_adding_to_selection.png b/asset/icon/Icon16/select_by_adding_to_selection.png new file mode 100644 index 0000000..e240a7c Binary files /dev/null and b/asset/icon/Icon16/select_by_adding_to_selection.png differ diff --git a/asset/icon/Icon16/select_by_color.png b/asset/icon/Icon16/select_by_color.png new file mode 100644 index 0000000..a6c84ed Binary files /dev/null and b/asset/icon/Icon16/select_by_color.png differ diff --git a/asset/icon/Icon16/select_by_difference.png b/asset/icon/Icon16/select_by_difference.png new file mode 100644 index 0000000..53cc04f Binary files /dev/null and b/asset/icon/Icon16/select_by_difference.png differ diff --git a/asset/icon/Icon16/select_by_intersection.png b/asset/icon/Icon16/select_by_intersection.png new file mode 100644 index 0000000..a09e84b Binary files /dev/null and b/asset/icon/Icon16/select_by_intersection.png differ diff --git a/asset/icon/Icon16/select_continuous_area.png b/asset/icon/Icon16/select_continuous_area.png new file mode 100644 index 0000000..d67adf1 Binary files /dev/null and b/asset/icon/Icon16/select_continuous_area.png differ diff --git a/asset/icon/Icon16/select_ellipse.png b/asset/icon/Icon16/select_ellipse.png new file mode 100644 index 0000000..9b0c3a8 Binary files /dev/null and b/asset/icon/Icon16/select_ellipse.png differ diff --git a/asset/icon/Icon16/select_invert.png b/asset/icon/Icon16/select_invert.png new file mode 100644 index 0000000..1cbc3c2 Binary files /dev/null and b/asset/icon/Icon16/select_invert.png differ diff --git a/asset/icon/Icon16/select_lasso.png b/asset/icon/Icon16/select_lasso.png new file mode 100644 index 0000000..e3a21d2 Binary files /dev/null and b/asset/icon/Icon16/select_lasso.png differ diff --git a/asset/icon/Icon16/select_php_version.png b/asset/icon/Icon16/select_php_version.png new file mode 100644 index 0000000..4463294 Binary files /dev/null and b/asset/icon/Icon16/select_php_version.png differ diff --git a/asset/icon/Icon16/select_recipient.png b/asset/icon/Icon16/select_recipient.png new file mode 100644 index 0000000..b9bed83 Binary files /dev/null and b/asset/icon/Icon16/select_recipient.png differ diff --git a/asset/icon/Icon16/select_restangular.png b/asset/icon/Icon16/select_restangular.png new file mode 100644 index 0000000..d6513ee Binary files /dev/null and b/asset/icon/Icon16/select_restangular.png differ diff --git a/asset/icon/Icon16/selection_pane.png b/asset/icon/Icon16/selection_pane.png new file mode 100644 index 0000000..6c3256d Binary files /dev/null and b/asset/icon/Icon16/selection_pane.png differ diff --git a/asset/icon/Icon16/selection_slide.png b/asset/icon/Icon16/selection_slide.png new file mode 100644 index 0000000..99b299d Binary files /dev/null and b/asset/icon/Icon16/selection_slide.png differ diff --git a/asset/icon/Icon16/send_receive_all_folders.png b/asset/icon/Icon16/send_receive_all_folders.png new file mode 100644 index 0000000..eabee64 Binary files /dev/null and b/asset/icon/Icon16/send_receive_all_folders.png differ diff --git a/asset/icon/Icon16/separator.png b/asset/icon/Icon16/separator.png new file mode 100644 index 0000000..ad1b900 Binary files /dev/null and b/asset/icon/Icon16/separator.png differ diff --git a/asset/icon/Icon16/separator_label.png b/asset/icon/Icon16/separator_label.png new file mode 100644 index 0000000..672a2ce Binary files /dev/null and b/asset/icon/Icon16/separator_label.png differ diff --git a/asset/icon/Icon16/sertificate.png b/asset/icon/Icon16/sertificate.png new file mode 100644 index 0000000..bb546c7 Binary files /dev/null and b/asset/icon/Icon16/sertificate.png differ diff --git a/asset/icon/Icon16/server.png b/asset/icon/Icon16/server.png new file mode 100644 index 0000000..7f9ee88 Binary files /dev/null and b/asset/icon/Icon16/server.png differ diff --git a/asset/icon/Icon16/server_add.png b/asset/icon/Icon16/server_add.png new file mode 100644 index 0000000..2de5f70 Binary files /dev/null and b/asset/icon/Icon16/server_add.png differ diff --git a/asset/icon/Icon16/server_chart.png b/asset/icon/Icon16/server_chart.png new file mode 100644 index 0000000..586db19 Binary files /dev/null and b/asset/icon/Icon16/server_chart.png differ diff --git a/asset/icon/Icon16/server_components.png b/asset/icon/Icon16/server_components.png new file mode 100644 index 0000000..2995656 Binary files /dev/null and b/asset/icon/Icon16/server_components.png differ diff --git a/asset/icon/Icon16/server_compress.png b/asset/icon/Icon16/server_compress.png new file mode 100644 index 0000000..1bcc043 Binary files /dev/null and b/asset/icon/Icon16/server_compress.png differ diff --git a/asset/icon/Icon16/server_configuration.png b/asset/icon/Icon16/server_configuration.png new file mode 100644 index 0000000..c1af518 Binary files /dev/null and b/asset/icon/Icon16/server_configuration.png differ diff --git a/asset/icon/Icon16/server_connect.png b/asset/icon/Icon16/server_connect.png new file mode 100644 index 0000000..efb6e3f Binary files /dev/null and b/asset/icon/Icon16/server_connect.png differ diff --git a/asset/icon/Icon16/server_database.png b/asset/icon/Icon16/server_database.png new file mode 100644 index 0000000..3bf1440 Binary files /dev/null and b/asset/icon/Icon16/server_database.png differ diff --git a/asset/icon/Icon16/server_delete.png b/asset/icon/Icon16/server_delete.png new file mode 100644 index 0000000..fcc88a0 Binary files /dev/null and b/asset/icon/Icon16/server_delete.png differ diff --git a/asset/icon/Icon16/server_edit.png b/asset/icon/Icon16/server_edit.png new file mode 100644 index 0000000..03198ba Binary files /dev/null and b/asset/icon/Icon16/server_edit.png differ diff --git a/asset/icon/Icon16/server_error.png b/asset/icon/Icon16/server_error.png new file mode 100644 index 0000000..ba37974 Binary files /dev/null and b/asset/icon/Icon16/server_error.png differ diff --git a/asset/icon/Icon16/server_go.png b/asset/icon/Icon16/server_go.png new file mode 100644 index 0000000..59fe5ba Binary files /dev/null and b/asset/icon/Icon16/server_go.png differ diff --git a/asset/icon/Icon16/server_information.png b/asset/icon/Icon16/server_information.png new file mode 100644 index 0000000..eeb5175 Binary files /dev/null and b/asset/icon/Icon16/server_information.png differ diff --git a/asset/icon/Icon16/server_key.png b/asset/icon/Icon16/server_key.png new file mode 100644 index 0000000..a4d682a Binary files /dev/null and b/asset/icon/Icon16/server_key.png differ diff --git a/asset/icon/Icon16/server_lightning.png b/asset/icon/Icon16/server_lightning.png new file mode 100644 index 0000000..862134d Binary files /dev/null and b/asset/icon/Icon16/server_lightning.png differ diff --git a/asset/icon/Icon16/server_link.png b/asset/icon/Icon16/server_link.png new file mode 100644 index 0000000..5330c55 Binary files /dev/null and b/asset/icon/Icon16/server_link.png differ diff --git a/asset/icon/Icon16/server_property.png b/asset/icon/Icon16/server_property.png new file mode 100644 index 0000000..765575b Binary files /dev/null and b/asset/icon/Icon16/server_property.png differ diff --git a/asset/icon/Icon16/server_stanchion.png b/asset/icon/Icon16/server_stanchion.png new file mode 100644 index 0000000..36938fb Binary files /dev/null and b/asset/icon/Icon16/server_stanchion.png differ diff --git a/asset/icon/Icon16/server_uncompress.png b/asset/icon/Icon16/server_uncompress.png new file mode 100644 index 0000000..a7b7a87 Binary files /dev/null and b/asset/icon/Icon16/server_uncompress.png differ diff --git a/asset/icon/Icon16/servers.png b/asset/icon/Icon16/servers.png new file mode 100644 index 0000000..922e0d4 Binary files /dev/null and b/asset/icon/Icon16/servers.png differ diff --git a/asset/icon/Icon16/servers_network.png b/asset/icon/Icon16/servers_network.png new file mode 100644 index 0000000..8d8967c Binary files /dev/null and b/asset/icon/Icon16/servers_network.png differ diff --git a/asset/icon/Icon16/service_status.png b/asset/icon/Icon16/service_status.png new file mode 100644 index 0000000..2f60605 Binary files /dev/null and b/asset/icon/Icon16/service_status.png differ diff --git a/asset/icon/Icon16/session_idle_time.png b/asset/icon/Icon16/session_idle_time.png new file mode 100644 index 0000000..fa29055 Binary files /dev/null and b/asset/icon/Icon16/session_idle_time.png differ diff --git a/asset/icon/Icon16/set_security_question.png b/asset/icon/Icon16/set_security_question.png new file mode 100644 index 0000000..d2d12b6 Binary files /dev/null and b/asset/icon/Icon16/set_security_question.png differ diff --git a/asset/icon/Icon16/setting_tools.png b/asset/icon/Icon16/setting_tools.png new file mode 100644 index 0000000..81857cd Binary files /dev/null and b/asset/icon/Icon16/setting_tools.png differ diff --git a/asset/icon/Icon16/setup_slide_show.png b/asset/icon/Icon16/setup_slide_show.png new file mode 100644 index 0000000..7f4185c Binary files /dev/null and b/asset/icon/Icon16/setup_slide_show.png differ diff --git a/asset/icon/Icon16/shading.png b/asset/icon/Icon16/shading.png new file mode 100644 index 0000000..bf80b60 Binary files /dev/null and b/asset/icon/Icon16/shading.png differ diff --git a/asset/icon/Icon16/shape_align_bottom.png b/asset/icon/Icon16/shape_align_bottom.png new file mode 100644 index 0000000..93db176 Binary files /dev/null and b/asset/icon/Icon16/shape_align_bottom.png differ diff --git a/asset/icon/Icon16/shape_align_center.png b/asset/icon/Icon16/shape_align_center.png new file mode 100644 index 0000000..f318a04 Binary files /dev/null and b/asset/icon/Icon16/shape_align_center.png differ diff --git a/asset/icon/Icon16/shape_align_left.png b/asset/icon/Icon16/shape_align_left.png new file mode 100644 index 0000000..82f04de Binary files /dev/null and b/asset/icon/Icon16/shape_align_left.png differ diff --git a/asset/icon/Icon16/shape_align_middle.png b/asset/icon/Icon16/shape_align_middle.png new file mode 100644 index 0000000..68e5cd5 Binary files /dev/null and b/asset/icon/Icon16/shape_align_middle.png differ diff --git a/asset/icon/Icon16/shape_align_right.png b/asset/icon/Icon16/shape_align_right.png new file mode 100644 index 0000000..266f6d2 Binary files /dev/null and b/asset/icon/Icon16/shape_align_right.png differ diff --git a/asset/icon/Icon16/shape_align_top.png b/asset/icon/Icon16/shape_align_top.png new file mode 100644 index 0000000..de50d23 Binary files /dev/null and b/asset/icon/Icon16/shape_align_top.png differ diff --git a/asset/icon/Icon16/shape_flip_horizontal.png b/asset/icon/Icon16/shape_flip_horizontal.png new file mode 100644 index 0000000..a0c25e9 Binary files /dev/null and b/asset/icon/Icon16/shape_flip_horizontal.png differ diff --git a/asset/icon/Icon16/shape_flip_vertical.png b/asset/icon/Icon16/shape_flip_vertical.png new file mode 100644 index 0000000..3618104 Binary files /dev/null and b/asset/icon/Icon16/shape_flip_vertical.png differ diff --git a/asset/icon/Icon16/shape_group.png b/asset/icon/Icon16/shape_group.png new file mode 100644 index 0000000..bb1c0d4 Binary files /dev/null and b/asset/icon/Icon16/shape_group.png differ diff --git a/asset/icon/Icon16/shape_handles.png b/asset/icon/Icon16/shape_handles.png new file mode 100644 index 0000000..7ab0765 Binary files /dev/null and b/asset/icon/Icon16/shape_handles.png differ diff --git a/asset/icon/Icon16/shape_insert.png b/asset/icon/Icon16/shape_insert.png new file mode 100644 index 0000000..f9675dc Binary files /dev/null and b/asset/icon/Icon16/shape_insert.png differ diff --git a/asset/icon/Icon16/shape_move_back.png b/asset/icon/Icon16/shape_move_back.png new file mode 100644 index 0000000..0dcfa57 Binary files /dev/null and b/asset/icon/Icon16/shape_move_back.png differ diff --git a/asset/icon/Icon16/shape_move_backwards.png b/asset/icon/Icon16/shape_move_backwards.png new file mode 100644 index 0000000..3d93311 Binary files /dev/null and b/asset/icon/Icon16/shape_move_backwards.png differ diff --git a/asset/icon/Icon16/shape_move_forwards.png b/asset/icon/Icon16/shape_move_forwards.png new file mode 100644 index 0000000..420f99e Binary files /dev/null and b/asset/icon/Icon16/shape_move_forwards.png differ diff --git a/asset/icon/Icon16/shape_move_front.png b/asset/icon/Icon16/shape_move_front.png new file mode 100644 index 0000000..95c6473 Binary files /dev/null and b/asset/icon/Icon16/shape_move_front.png differ diff --git a/asset/icon/Icon16/shape_rotate_anticlockwise.png b/asset/icon/Icon16/shape_rotate_anticlockwise.png new file mode 100644 index 0000000..dbc8921 Binary files /dev/null and b/asset/icon/Icon16/shape_rotate_anticlockwise.png differ diff --git a/asset/icon/Icon16/shape_rotate_clockwise.png b/asset/icon/Icon16/shape_rotate_clockwise.png new file mode 100644 index 0000000..dc04fb6 Binary files /dev/null and b/asset/icon/Icon16/shape_rotate_clockwise.png differ diff --git a/asset/icon/Icon16/shape_square.png b/asset/icon/Icon16/shape_square.png new file mode 100644 index 0000000..d2de0f6 Binary files /dev/null and b/asset/icon/Icon16/shape_square.png differ diff --git a/asset/icon/Icon16/shape_square_add.png b/asset/icon/Icon16/shape_square_add.png new file mode 100644 index 0000000..2d52b89 Binary files /dev/null and b/asset/icon/Icon16/shape_square_add.png differ diff --git a/asset/icon/Icon16/shape_square_delete.png b/asset/icon/Icon16/shape_square_delete.png new file mode 100644 index 0000000..8076def Binary files /dev/null and b/asset/icon/Icon16/shape_square_delete.png differ diff --git a/asset/icon/Icon16/shape_square_edit.png b/asset/icon/Icon16/shape_square_edit.png new file mode 100644 index 0000000..eabde08 Binary files /dev/null and b/asset/icon/Icon16/shape_square_edit.png differ diff --git a/asset/icon/Icon16/shape_square_error.png b/asset/icon/Icon16/shape_square_error.png new file mode 100644 index 0000000..545a78c Binary files /dev/null and b/asset/icon/Icon16/shape_square_error.png differ diff --git a/asset/icon/Icon16/shape_square_go.png b/asset/icon/Icon16/shape_square_go.png new file mode 100644 index 0000000..ee733b0 Binary files /dev/null and b/asset/icon/Icon16/shape_square_go.png differ diff --git a/asset/icon/Icon16/shape_square_key.png b/asset/icon/Icon16/shape_square_key.png new file mode 100644 index 0000000..c0f7027 Binary files /dev/null and b/asset/icon/Icon16/shape_square_key.png differ diff --git a/asset/icon/Icon16/shape_square_link.png b/asset/icon/Icon16/shape_square_link.png new file mode 100644 index 0000000..c7f912f Binary files /dev/null and b/asset/icon/Icon16/shape_square_link.png differ diff --git a/asset/icon/Icon16/shape_ungroup.png b/asset/icon/Icon16/shape_ungroup.png new file mode 100644 index 0000000..5d8fa5b Binary files /dev/null and b/asset/icon/Icon16/shape_ungroup.png differ diff --git a/asset/icon/Icon16/share(2).png b/asset/icon/Icon16/share(2).png new file mode 100644 index 0000000..5b76929 Binary files /dev/null and b/asset/icon/Icon16/share(2).png differ diff --git a/asset/icon/Icon16/share.png b/asset/icon/Icon16/share.png new file mode 100644 index 0000000..a5de192 Binary files /dev/null and b/asset/icon/Icon16/share.png differ diff --git a/asset/icon/Icon16/share_workbook.png b/asset/icon/Icon16/share_workbook.png new file mode 100644 index 0000000..36cb9bb Binary files /dev/null and b/asset/icon/Icon16/share_workbook.png differ diff --git a/asset/icon/Icon16/shared_private.png b/asset/icon/Icon16/shared_private.png new file mode 100644 index 0000000..2062122 Binary files /dev/null and b/asset/icon/Icon16/shared_private.png differ diff --git a/asset/icon/Icon16/sharepoint.png b/asset/icon/Icon16/sharepoint.png new file mode 100644 index 0000000..6bea3a4 Binary files /dev/null and b/asset/icon/Icon16/sharepoint.png differ diff --git a/asset/icon/Icon16/sharpen.png b/asset/icon/Icon16/sharpen.png new file mode 100644 index 0000000..a459af6 Binary files /dev/null and b/asset/icon/Icon16/sharpen.png differ diff --git a/asset/icon/Icon16/sheduled_task.png b/asset/icon/Icon16/sheduled_task.png new file mode 100644 index 0000000..75f2c63 Binary files /dev/null and b/asset/icon/Icon16/sheduled_task.png differ diff --git a/asset/icon/Icon16/shield.png b/asset/icon/Icon16/shield.png new file mode 100644 index 0000000..4eb8031 Binary files /dev/null and b/asset/icon/Icon16/shield.png differ diff --git a/asset/icon/Icon16/shield_add.png b/asset/icon/Icon16/shield_add.png new file mode 100644 index 0000000..4f45441 Binary files /dev/null and b/asset/icon/Icon16/shield_add.png differ diff --git a/asset/icon/Icon16/shield_delete.png b/asset/icon/Icon16/shield_delete.png new file mode 100644 index 0000000..eafb3c2 Binary files /dev/null and b/asset/icon/Icon16/shield_delete.png differ diff --git a/asset/icon/Icon16/shield_go.png b/asset/icon/Icon16/shield_go.png new file mode 100644 index 0000000..5ca49e5 Binary files /dev/null and b/asset/icon/Icon16/shield_go.png differ diff --git a/asset/icon/Icon16/shirt_polo.png b/asset/icon/Icon16/shirt_polo.png new file mode 100644 index 0000000..41e7409 Binary files /dev/null and b/asset/icon/Icon16/shirt_polo.png differ diff --git a/asset/icon/Icon16/shoe.png b/asset/icon/Icon16/shoe.png new file mode 100644 index 0000000..7b8f998 Binary files /dev/null and b/asset/icon/Icon16/shoe.png differ diff --git a/asset/icon/Icon16/shop.png b/asset/icon/Icon16/shop.png new file mode 100644 index 0000000..0e8f5a8 Binary files /dev/null and b/asset/icon/Icon16/shop.png differ diff --git a/asset/icon/Icon16/shop_closed.png b/asset/icon/Icon16/shop_closed.png new file mode 100644 index 0000000..a800930 Binary files /dev/null and b/asset/icon/Icon16/shop_closed.png differ diff --git a/asset/icon/Icon16/shop_network.png b/asset/icon/Icon16/shop_network.png new file mode 100644 index 0000000..5ef28a6 Binary files /dev/null and b/asset/icon/Icon16/shop_network.png differ diff --git a/asset/icon/Icon16/shop_open.png b/asset/icon/Icon16/shop_open.png new file mode 100644 index 0000000..56296f6 Binary files /dev/null and b/asset/icon/Icon16/shop_open.png differ diff --git a/asset/icon/Icon16/shopping.png b/asset/icon/Icon16/shopping.png new file mode 100644 index 0000000..43916a0 Binary files /dev/null and b/asset/icon/Icon16/shopping.png differ diff --git a/asset/icon/Icon16/shopping_cart_reset.png b/asset/icon/Icon16/shopping_cart_reset.png new file mode 100644 index 0000000..d82153b Binary files /dev/null and b/asset/icon/Icon16/shopping_cart_reset.png differ diff --git a/asset/icon/Icon16/shortcuts.png b/asset/icon/Icon16/shortcuts.png new file mode 100644 index 0000000..11e06e4 Binary files /dev/null and b/asset/icon/Icon16/shortcuts.png differ diff --git a/asset/icon/Icon16/shorts.png b/asset/icon/Icon16/shorts.png new file mode 100644 index 0000000..96304eb Binary files /dev/null and b/asset/icon/Icon16/shorts.png differ diff --git a/asset/icon/Icon16/show_accounts_over_quota.png b/asset/icon/Icon16/show_accounts_over_quota.png new file mode 100644 index 0000000..3bc4f71 Binary files /dev/null and b/asset/icon/Icon16/show_accounts_over_quota.png differ diff --git a/asset/icon/Icon16/show_comment.png b/asset/icon/Icon16/show_comment.png new file mode 100644 index 0000000..74541bd Binary files /dev/null and b/asset/icon/Icon16/show_comment.png differ diff --git a/asset/icon/Icon16/show_detail.png b/asset/icon/Icon16/show_detail.png new file mode 100644 index 0000000..7f9d394 Binary files /dev/null and b/asset/icon/Icon16/show_detail.png differ diff --git a/asset/icon/Icon16/show_formulas.png b/asset/icon/Icon16/show_formulas.png new file mode 100644 index 0000000..8942ac6 Binary files /dev/null and b/asset/icon/Icon16/show_formulas.png differ diff --git a/asset/icon/Icon16/show_in_favorites.png b/asset/icon/Icon16/show_in_favorites.png new file mode 100644 index 0000000..fc78118 Binary files /dev/null and b/asset/icon/Icon16/show_in_favorites.png differ diff --git a/asset/icon/Icon16/show_ink.png b/asset/icon/Icon16/show_ink.png new file mode 100644 index 0000000..9095905 Binary files /dev/null and b/asset/icon/Icon16/show_ink.png differ diff --git a/asset/icon/Icon16/show_notes.png b/asset/icon/Icon16/show_notes.png new file mode 100644 index 0000000..c70f6e4 Binary files /dev/null and b/asset/icon/Icon16/show_notes.png differ diff --git a/asset/icon/Icon16/show_source_documents.png b/asset/icon/Icon16/show_source_documents.png new file mode 100644 index 0000000..7c831ad Binary files /dev/null and b/asset/icon/Icon16/show_source_documents.png differ diff --git a/asset/icon/Icon16/showel.png b/asset/icon/Icon16/showel.png new file mode 100644 index 0000000..cfb010f Binary files /dev/null and b/asset/icon/Icon16/showel.png differ diff --git a/asset/icon/Icon16/shuriken.png b/asset/icon/Icon16/shuriken.png new file mode 100644 index 0000000..3be0adc Binary files /dev/null and b/asset/icon/Icon16/shuriken.png differ diff --git a/asset/icon/Icon16/sign.png b/asset/icon/Icon16/sign.png new file mode 100644 index 0000000..a1e22fc Binary files /dev/null and b/asset/icon/Icon16/sign.png differ diff --git a/asset/icon/Icon16/simple_dns_zone_editor.png b/asset/icon/Icon16/simple_dns_zone_editor.png new file mode 100644 index 0000000..dfe1bf9 Binary files /dev/null and b/asset/icon/Icon16/simple_dns_zone_editor.png differ diff --git a/asset/icon/Icon16/siren.png b/asset/icon/Icon16/siren.png new file mode 100644 index 0000000..d94a243 Binary files /dev/null and b/asset/icon/Icon16/siren.png differ diff --git a/asset/icon/Icon16/site_backup_and_restore.png b/asset/icon/Icon16/site_backup_and_restore.png new file mode 100644 index 0000000..467e441 Binary files /dev/null and b/asset/icon/Icon16/site_backup_and_restore.png differ diff --git a/asset/icon/Icon16/site_enhancer.png b/asset/icon/Icon16/site_enhancer.png new file mode 100644 index 0000000..a9dd841 Binary files /dev/null and b/asset/icon/Icon16/site_enhancer.png differ diff --git a/asset/icon/Icon16/sitemap(2).png b/asset/icon/Icon16/sitemap(2).png new file mode 100644 index 0000000..71ddfaf Binary files /dev/null and b/asset/icon/Icon16/sitemap(2).png differ diff --git a/asset/icon/Icon16/sitemap.png b/asset/icon/Icon16/sitemap.png new file mode 100644 index 0000000..5c5262e Binary files /dev/null and b/asset/icon/Icon16/sitemap.png differ diff --git a/asset/icon/Icon16/sitemap_application.png b/asset/icon/Icon16/sitemap_application.png new file mode 100644 index 0000000..f42c608 Binary files /dev/null and b/asset/icon/Icon16/sitemap_application.png differ diff --git a/asset/icon/Icon16/sitemap_application_blue.png b/asset/icon/Icon16/sitemap_application_blue.png new file mode 100644 index 0000000..189ab6f Binary files /dev/null and b/asset/icon/Icon16/sitemap_application_blue.png differ diff --git a/asset/icon/Icon16/sitemap_color.png b/asset/icon/Icon16/sitemap_color.png new file mode 100644 index 0000000..64f075b Binary files /dev/null and b/asset/icon/Icon16/sitemap_color.png differ diff --git a/asset/icon/Icon16/sitemap_image.png b/asset/icon/Icon16/sitemap_image.png new file mode 100644 index 0000000..20b75b9 Binary files /dev/null and b/asset/icon/Icon16/sitemap_image.png differ diff --git a/asset/icon/Icon16/size_horizontal.png b/asset/icon/Icon16/size_horizontal.png new file mode 100644 index 0000000..1a6e258 Binary files /dev/null and b/asset/icon/Icon16/size_horizontal.png differ diff --git a/asset/icon/Icon16/size_vertical.png b/asset/icon/Icon16/size_vertical.png new file mode 100644 index 0000000..e512bb2 Binary files /dev/null and b/asset/icon/Icon16/size_vertical.png differ diff --git a/asset/icon/Icon16/skate.png b/asset/icon/Icon16/skate.png new file mode 100644 index 0000000..b555532 Binary files /dev/null and b/asset/icon/Icon16/skate.png differ diff --git a/asset/icon/Icon16/skeleton_directory.png b/asset/icon/Icon16/skeleton_directory.png new file mode 100644 index 0000000..34b4948 Binary files /dev/null and b/asset/icon/Icon16/skeleton_directory.png differ diff --git a/asset/icon/Icon16/skins.png b/asset/icon/Icon16/skins.png new file mode 100644 index 0000000..87c4d62 Binary files /dev/null and b/asset/icon/Icon16/skins.png differ diff --git a/asset/icon/Icon16/skull_old.png b/asset/icon/Icon16/skull_old.png new file mode 100644 index 0000000..1de5049 Binary files /dev/null and b/asset/icon/Icon16/skull_old.png differ diff --git a/asset/icon/Icon16/skype.png b/asset/icon/Icon16/skype.png new file mode 100644 index 0000000..4708c21 Binary files /dev/null and b/asset/icon/Icon16/skype.png differ diff --git a/asset/icon/Icon16/slackware.png b/asset/icon/Icon16/slackware.png new file mode 100644 index 0000000..b93bcbe Binary files /dev/null and b/asset/icon/Icon16/slackware.png differ diff --git a/asset/icon/Icon16/slide_cut.png b/asset/icon/Icon16/slide_cut.png new file mode 100644 index 0000000..88c5b39 Binary files /dev/null and b/asset/icon/Icon16/slide_cut.png differ diff --git a/asset/icon/Icon16/slide_fade.png b/asset/icon/Icon16/slide_fade.png new file mode 100644 index 0000000..bc0ba19 Binary files /dev/null and b/asset/icon/Icon16/slide_fade.png differ diff --git a/asset/icon/Icon16/slide_layout.png b/asset/icon/Icon16/slide_layout.png new file mode 100644 index 0000000..995a9b6 Binary files /dev/null and b/asset/icon/Icon16/slide_layout.png differ diff --git a/asset/icon/Icon16/slide_master.png b/asset/icon/Icon16/slide_master.png new file mode 100644 index 0000000..7c2be51 Binary files /dev/null and b/asset/icon/Icon16/slide_master.png differ diff --git a/asset/icon/Icon16/slide_normal_view.png b/asset/icon/Icon16/slide_normal_view.png new file mode 100644 index 0000000..def8da9 Binary files /dev/null and b/asset/icon/Icon16/slide_normal_view.png differ diff --git a/asset/icon/Icon16/slide_notes_master.png b/asset/icon/Icon16/slide_notes_master.png new file mode 100644 index 0000000..ae0faa0 Binary files /dev/null and b/asset/icon/Icon16/slide_notes_master.png differ diff --git a/asset/icon/Icon16/slide_number.png b/asset/icon/Icon16/slide_number.png new file mode 100644 index 0000000..819bbdb Binary files /dev/null and b/asset/icon/Icon16/slide_number.png differ diff --git a/asset/icon/Icon16/slide_push.png b/asset/icon/Icon16/slide_push.png new file mode 100644 index 0000000..690ed8d Binary files /dev/null and b/asset/icon/Icon16/slide_push.png differ diff --git a/asset/icon/Icon16/slide_random.png b/asset/icon/Icon16/slide_random.png new file mode 100644 index 0000000..1b8068a Binary files /dev/null and b/asset/icon/Icon16/slide_random.png differ diff --git a/asset/icon/Icon16/slide_shape.png b/asset/icon/Icon16/slide_shape.png new file mode 100644 index 0000000..ab84f77 Binary files /dev/null and b/asset/icon/Icon16/slide_shape.png differ diff --git a/asset/icon/Icon16/slide_sorter.png b/asset/icon/Icon16/slide_sorter.png new file mode 100644 index 0000000..f8d67ed Binary files /dev/null and b/asset/icon/Icon16/slide_sorter.png differ diff --git a/asset/icon/Icon16/slide_sound.png b/asset/icon/Icon16/slide_sound.png new file mode 100644 index 0000000..1e6642d Binary files /dev/null and b/asset/icon/Icon16/slide_sound.png differ diff --git a/asset/icon/Icon16/slide_splite.png b/asset/icon/Icon16/slide_splite.png new file mode 100644 index 0000000..6b246af Binary files /dev/null and b/asset/icon/Icon16/slide_splite.png differ diff --git a/asset/icon/Icon16/slide_wipe.png b/asset/icon/Icon16/slide_wipe.png new file mode 100644 index 0000000..cfda9b1 Binary files /dev/null and b/asset/icon/Icon16/slide_wipe.png differ diff --git a/asset/icon/Icon16/slider.png b/asset/icon/Icon16/slider.png new file mode 100644 index 0000000..76d1daa Binary files /dev/null and b/asset/icon/Icon16/slider.png differ diff --git a/asset/icon/Icon16/slider_050.png b/asset/icon/Icon16/slider_050.png new file mode 100644 index 0000000..9063ec6 Binary files /dev/null and b/asset/icon/Icon16/slider_050.png differ diff --git a/asset/icon/Icon16/slider_100.png b/asset/icon/Icon16/slider_100.png new file mode 100644 index 0000000..70f23cf Binary files /dev/null and b/asset/icon/Icon16/slider_100.png differ diff --git a/asset/icon/Icon16/slider_vertical.png b/asset/icon/Icon16/slider_vertical.png new file mode 100644 index 0000000..5fc1f11 Binary files /dev/null and b/asset/icon/Icon16/slider_vertical.png differ diff --git a/asset/icon/Icon16/slider_vertical_050.png b/asset/icon/Icon16/slider_vertical_050.png new file mode 100644 index 0000000..25826b7 Binary files /dev/null and b/asset/icon/Icon16/slider_vertical_050.png differ diff --git a/asset/icon/Icon16/slider_vertical_100.png b/asset/icon/Icon16/slider_vertical_100.png new file mode 100644 index 0000000..627a477 Binary files /dev/null and b/asset/icon/Icon16/slider_vertical_100.png differ diff --git a/asset/icon/Icon16/slideshow.png b/asset/icon/Icon16/slideshow.png new file mode 100644 index 0000000..842eb7d Binary files /dev/null and b/asset/icon/Icon16/slideshow.png differ diff --git a/asset/icon/Icon16/slideshow_full_screen.png b/asset/icon/Icon16/slideshow_full_screen.png new file mode 100644 index 0000000..ac8b4fd Binary files /dev/null and b/asset/icon/Icon16/slideshow_full_screen.png differ diff --git a/asset/icon/Icon16/slideshow_next.png b/asset/icon/Icon16/slideshow_next.png new file mode 100644 index 0000000..b833fd2 Binary files /dev/null and b/asset/icon/Icon16/slideshow_next.png differ diff --git a/asset/icon/Icon16/slideshow_previous.png b/asset/icon/Icon16/slideshow_previous.png new file mode 100644 index 0000000..42d402d Binary files /dev/null and b/asset/icon/Icon16/slideshow_previous.png differ diff --git a/asset/icon/Icon16/small_business.png b/asset/icon/Icon16/small_business.png new file mode 100644 index 0000000..8e20851 Binary files /dev/null and b/asset/icon/Icon16/small_business.png differ diff --git a/asset/icon/Icon16/small_car.png b/asset/icon/Icon16/small_car.png new file mode 100644 index 0000000..959bbd2 Binary files /dev/null and b/asset/icon/Icon16/small_car.png differ diff --git a/asset/icon/Icon16/small_tiles.png b/asset/icon/Icon16/small_tiles.png new file mode 100644 index 0000000..168a332 Binary files /dev/null and b/asset/icon/Icon16/small_tiles.png differ diff --git a/asset/icon/Icon16/smart_art.png b/asset/icon/Icon16/smart_art.png new file mode 100644 index 0000000..1b1afd3 Binary files /dev/null and b/asset/icon/Icon16/smart_art.png differ diff --git a/asset/icon/Icon16/snail.png b/asset/icon/Icon16/snail.png new file mode 100644 index 0000000..02c737e Binary files /dev/null and b/asset/icon/Icon16/snail.png differ diff --git a/asset/icon/Icon16/snake_and_cup.png b/asset/icon/Icon16/snake_and_cup.png new file mode 100644 index 0000000..da4663b Binary files /dev/null and b/asset/icon/Icon16/snake_and_cup.png differ diff --git a/asset/icon/Icon16/snapshot.png b/asset/icon/Icon16/snapshot.png new file mode 100644 index 0000000..1146d12 Binary files /dev/null and b/asset/icon/Icon16/snapshot.png differ diff --git a/asset/icon/Icon16/sneakers.png b/asset/icon/Icon16/sneakers.png new file mode 100644 index 0000000..0833d06 Binary files /dev/null and b/asset/icon/Icon16/sneakers.png differ diff --git a/asset/icon/Icon16/snow_rain.png b/asset/icon/Icon16/snow_rain.png new file mode 100644 index 0000000..8849e1d Binary files /dev/null and b/asset/icon/Icon16/snow_rain.png differ diff --git a/asset/icon/Icon16/snowman.png b/asset/icon/Icon16/snowman.png new file mode 100644 index 0000000..cd243f0 Binary files /dev/null and b/asset/icon/Icon16/snowman.png differ diff --git a/asset/icon/Icon16/snowman_head.png b/asset/icon/Icon16/snowman_head.png new file mode 100644 index 0000000..d775cf9 Binary files /dev/null and b/asset/icon/Icon16/snowman_head.png differ diff --git a/asset/icon/Icon16/soap.png b/asset/icon/Icon16/soap.png new file mode 100644 index 0000000..00b79ae Binary files /dev/null and b/asset/icon/Icon16/soap.png differ diff --git a/asset/icon/Icon16/sofa.png b/asset/icon/Icon16/sofa.png new file mode 100644 index 0000000..36f2222 Binary files /dev/null and b/asset/icon/Icon16/sofa.png differ diff --git a/asset/icon/Icon16/soil_layers.png b/asset/icon/Icon16/soil_layers.png new file mode 100644 index 0000000..16bbb4c Binary files /dev/null and b/asset/icon/Icon16/soil_layers.png differ diff --git a/asset/icon/Icon16/solar.png b/asset/icon/Icon16/solar.png new file mode 100644 index 0000000..1dc4c30 Binary files /dev/null and b/asset/icon/Icon16/solar.png differ diff --git a/asset/icon/Icon16/sort.png b/asset/icon/Icon16/sort.png new file mode 100644 index 0000000..237b401 Binary files /dev/null and b/asset/icon/Icon16/sort.png differ diff --git a/asset/icon/Icon16/sort_add.png b/asset/icon/Icon16/sort_add.png new file mode 100644 index 0000000..fb23381 Binary files /dev/null and b/asset/icon/Icon16/sort_add.png differ diff --git a/asset/icon/Icon16/sort_alphabel.png b/asset/icon/Icon16/sort_alphabel.png new file mode 100644 index 0000000..dd70266 Binary files /dev/null and b/asset/icon/Icon16/sort_alphabel.png differ diff --git a/asset/icon/Icon16/sort_alphabel_column.png b/asset/icon/Icon16/sort_alphabel_column.png new file mode 100644 index 0000000..03bbace Binary files /dev/null and b/asset/icon/Icon16/sort_alphabel_column.png differ diff --git a/asset/icon/Icon16/sort_alphabel_descending.png b/asset/icon/Icon16/sort_alphabel_descending.png new file mode 100644 index 0000000..42e47c3 Binary files /dev/null and b/asset/icon/Icon16/sort_alphabel_descending.png differ diff --git a/asset/icon/Icon16/sort_ascending(2).png b/asset/icon/Icon16/sort_ascending(2).png new file mode 100644 index 0000000..8d2a45d Binary files /dev/null and b/asset/icon/Icon16/sort_ascending(2).png differ diff --git a/asset/icon/Icon16/sort_ascending.png b/asset/icon/Icon16/sort_ascending.png new file mode 100644 index 0000000..7e13fd9 Binary files /dev/null and b/asset/icon/Icon16/sort_ascending.png differ diff --git a/asset/icon/Icon16/sort_columns.png b/asset/icon/Icon16/sort_columns.png new file mode 100644 index 0000000..ccdf3c1 Binary files /dev/null and b/asset/icon/Icon16/sort_columns.png differ diff --git a/asset/icon/Icon16/sort_date.png b/asset/icon/Icon16/sort_date.png new file mode 100644 index 0000000..81c34b1 Binary files /dev/null and b/asset/icon/Icon16/sort_date.png differ diff --git a/asset/icon/Icon16/sort_date_descending.png b/asset/icon/Icon16/sort_date_descending.png new file mode 100644 index 0000000..e0e0d1b Binary files /dev/null and b/asset/icon/Icon16/sort_date_descending.png differ diff --git a/asset/icon/Icon16/sort_delete.png b/asset/icon/Icon16/sort_delete.png new file mode 100644 index 0000000..7be4e65 Binary files /dev/null and b/asset/icon/Icon16/sort_delete.png differ diff --git a/asset/icon/Icon16/sort_descending(2).png b/asset/icon/Icon16/sort_descending(2).png new file mode 100644 index 0000000..68681f5 Binary files /dev/null and b/asset/icon/Icon16/sort_descending(2).png differ diff --git a/asset/icon/Icon16/sort_descending.png b/asset/icon/Icon16/sort_descending.png new file mode 100644 index 0000000..f63a65f Binary files /dev/null and b/asset/icon/Icon16/sort_descending.png differ diff --git a/asset/icon/Icon16/sort_edit.png b/asset/icon/Icon16/sort_edit.png new file mode 100644 index 0000000..952d86a Binary files /dev/null and b/asset/icon/Icon16/sort_edit.png differ diff --git a/asset/icon/Icon16/sort_error.png b/asset/icon/Icon16/sort_error.png new file mode 100644 index 0000000..15ae0c9 Binary files /dev/null and b/asset/icon/Icon16/sort_error.png differ diff --git a/asset/icon/Icon16/sort_go.png b/asset/icon/Icon16/sort_go.png new file mode 100644 index 0000000..20d8d7d Binary files /dev/null and b/asset/icon/Icon16/sort_go.png differ diff --git a/asset/icon/Icon16/sort_number.png b/asset/icon/Icon16/sort_number.png new file mode 100644 index 0000000..59504cb Binary files /dev/null and b/asset/icon/Icon16/sort_number.png differ diff --git a/asset/icon/Icon16/sort_number_column.png b/asset/icon/Icon16/sort_number_column.png new file mode 100644 index 0000000..293dafc Binary files /dev/null and b/asset/icon/Icon16/sort_number_column.png differ diff --git a/asset/icon/Icon16/sort_number_descending.png b/asset/icon/Icon16/sort_number_descending.png new file mode 100644 index 0000000..8f39569 Binary files /dev/null and b/asset/icon/Icon16/sort_number_descending.png differ diff --git a/asset/icon/Icon16/sort_price.png b/asset/icon/Icon16/sort_price.png new file mode 100644 index 0000000..9d3f8b0 Binary files /dev/null and b/asset/icon/Icon16/sort_price.png differ diff --git a/asset/icon/Icon16/sort_price_descending.png b/asset/icon/Icon16/sort_price_descending.png new file mode 100644 index 0000000..7036130 Binary files /dev/null and b/asset/icon/Icon16/sort_price_descending.png differ diff --git a/asset/icon/Icon16/sort_quantity.png b/asset/icon/Icon16/sort_quantity.png new file mode 100644 index 0000000..1fb9b2b Binary files /dev/null and b/asset/icon/Icon16/sort_quantity.png differ diff --git a/asset/icon/Icon16/sort_quantity_descending.png b/asset/icon/Icon16/sort_quantity_descending.png new file mode 100644 index 0000000..39d5c96 Binary files /dev/null and b/asset/icon/Icon16/sort_quantity_descending.png differ diff --git a/asset/icon/Icon16/sort_rating.png b/asset/icon/Icon16/sort_rating.png new file mode 100644 index 0000000..3c90bae Binary files /dev/null and b/asset/icon/Icon16/sort_rating.png differ diff --git a/asset/icon/Icon16/sort_rating_descending.png b/asset/icon/Icon16/sort_rating_descending.png new file mode 100644 index 0000000..fbe42de Binary files /dev/null and b/asset/icon/Icon16/sort_rating_descending.png differ diff --git a/asset/icon/Icon16/sort_small.png b/asset/icon/Icon16/sort_small.png new file mode 100644 index 0000000..e256015 Binary files /dev/null and b/asset/icon/Icon16/sort_small.png differ diff --git a/asset/icon/Icon16/sound.png b/asset/icon/Icon16/sound.png new file mode 100644 index 0000000..bbb908e Binary files /dev/null and b/asset/icon/Icon16/sound.png differ diff --git a/asset/icon/Icon16/sound_add.png b/asset/icon/Icon16/sound_add.png new file mode 100644 index 0000000..f0a0835 Binary files /dev/null and b/asset/icon/Icon16/sound_add.png differ diff --git a/asset/icon/Icon16/sound_delete.png b/asset/icon/Icon16/sound_delete.png new file mode 100644 index 0000000..2020a0b Binary files /dev/null and b/asset/icon/Icon16/sound_delete.png differ diff --git a/asset/icon/Icon16/sound_low.png b/asset/icon/Icon16/sound_low.png new file mode 100644 index 0000000..7e813fd Binary files /dev/null and b/asset/icon/Icon16/sound_low.png differ diff --git a/asset/icon/Icon16/sound_mute.png b/asset/icon/Icon16/sound_mute.png new file mode 100644 index 0000000..8987120 Binary files /dev/null and b/asset/icon/Icon16/sound_mute.png differ diff --git a/asset/icon/Icon16/sound_none.png b/asset/icon/Icon16/sound_none.png new file mode 100644 index 0000000..3fef802 Binary files /dev/null and b/asset/icon/Icon16/sound_none.png differ diff --git a/asset/icon/Icon16/soup.png b/asset/icon/Icon16/soup.png new file mode 100644 index 0000000..3cd91de Binary files /dev/null and b/asset/icon/Icon16/soup.png differ diff --git a/asset/icon/Icon16/source_code.png b/asset/icon/Icon16/source_code.png new file mode 100644 index 0000000..45c1a22 Binary files /dev/null and b/asset/icon/Icon16/source_code.png differ diff --git a/asset/icon/Icon16/spacer.png b/asset/icon/Icon16/spacer.png new file mode 100644 index 0000000..0d4b725 Binary files /dev/null and b/asset/icon/Icon16/spacer.png differ diff --git a/asset/icon/Icon16/spam.png b/asset/icon/Icon16/spam.png new file mode 100644 index 0000000..c092b63 Binary files /dev/null and b/asset/icon/Icon16/spam.png differ diff --git a/asset/icon/Icon16/spam_assassin.png b/asset/icon/Icon16/spam_assassin.png new file mode 100644 index 0000000..cf1d230 Binary files /dev/null and b/asset/icon/Icon16/spam_assassin.png differ diff --git a/asset/icon/Icon16/spam_filter(2).png b/asset/icon/Icon16/spam_filter(2).png new file mode 100644 index 0000000..d2488f4 Binary files /dev/null and b/asset/icon/Icon16/spam_filter(2).png differ diff --git a/asset/icon/Icon16/spam_filter.png b/asset/icon/Icon16/spam_filter.png new file mode 100644 index 0000000..98f3088 Binary files /dev/null and b/asset/icon/Icon16/spam_filter.png differ diff --git a/asset/icon/Icon16/sparklines.png b/asset/icon/Icon16/sparklines.png new file mode 100644 index 0000000..46c8c0a Binary files /dev/null and b/asset/icon/Icon16/sparklines.png differ diff --git a/asset/icon/Icon16/speaker_network.png b/asset/icon/Icon16/speaker_network.png new file mode 100644 index 0000000..a04500e Binary files /dev/null and b/asset/icon/Icon16/speaker_network.png differ diff --git a/asset/icon/Icon16/speakers.png b/asset/icon/Icon16/speakers.png new file mode 100644 index 0000000..837f248 Binary files /dev/null and b/asset/icon/Icon16/speakers.png differ diff --git a/asset/icon/Icon16/spectrum.png b/asset/icon/Icon16/spectrum.png new file mode 100644 index 0000000..13e3d5a Binary files /dev/null and b/asset/icon/Icon16/spectrum.png differ diff --git a/asset/icon/Icon16/spectrum_absorption.png b/asset/icon/Icon16/spectrum_absorption.png new file mode 100644 index 0000000..a606418 Binary files /dev/null and b/asset/icon/Icon16/spectrum_absorption.png differ diff --git a/asset/icon/Icon16/spectrum_emission.png b/asset/icon/Icon16/spectrum_emission.png new file mode 100644 index 0000000..3ad7514 Binary files /dev/null and b/asset/icon/Icon16/spectrum_emission.png differ diff --git a/asset/icon/Icon16/speedometer.png b/asset/icon/Icon16/speedometer.png new file mode 100644 index 0000000..ecd620b Binary files /dev/null and b/asset/icon/Icon16/speedometer.png differ diff --git a/asset/icon/Icon16/spellcheck.png b/asset/icon/Icon16/spellcheck.png new file mode 100644 index 0000000..650a682 Binary files /dev/null and b/asset/icon/Icon16/spellcheck.png differ diff --git a/asset/icon/Icon16/spellcheck_error.png b/asset/icon/Icon16/spellcheck_error.png new file mode 100644 index 0000000..5add592 Binary files /dev/null and b/asset/icon/Icon16/spellcheck_error.png differ diff --git a/asset/icon/Icon16/spider_web.png b/asset/icon/Icon16/spider_web.png new file mode 100644 index 0000000..737a452 Binary files /dev/null and b/asset/icon/Icon16/spider_web.png differ diff --git a/asset/icon/Icon16/spill.png b/asset/icon/Icon16/spill.png new file mode 100644 index 0000000..13bbf24 Binary files /dev/null and b/asset/icon/Icon16/spill.png differ diff --git a/asset/icon/Icon16/spin.png b/asset/icon/Icon16/spin.png new file mode 100644 index 0000000..432a5d8 Binary files /dev/null and b/asset/icon/Icon16/spin.png differ diff --git a/asset/icon/Icon16/split_panel.png b/asset/icon/Icon16/split_panel.png new file mode 100644 index 0000000..60d27be Binary files /dev/null and b/asset/icon/Icon16/split_panel.png differ diff --git a/asset/icon/Icon16/split_panel_vertical.png b/asset/icon/Icon16/split_panel_vertical.png new file mode 100644 index 0000000..c35c8f5 Binary files /dev/null and b/asset/icon/Icon16/split_panel_vertical.png differ diff --git a/asset/icon/Icon16/splitter.png b/asset/icon/Icon16/splitter.png new file mode 100644 index 0000000..7645ba6 Binary files /dev/null and b/asset/icon/Icon16/splitter.png differ diff --git a/asset/icon/Icon16/splitter_horizontal.png b/asset/icon/Icon16/splitter_horizontal.png new file mode 100644 index 0000000..39f68b0 Binary files /dev/null and b/asset/icon/Icon16/splitter_horizontal.png differ diff --git a/asset/icon/Icon16/sport.png b/asset/icon/Icon16/sport.png new file mode 100644 index 0000000..68accb5 Binary files /dev/null and b/asset/icon/Icon16/sport.png differ diff --git a/asset/icon/Icon16/sport_8ball.png b/asset/icon/Icon16/sport_8ball.png new file mode 100644 index 0000000..05fffa9 Binary files /dev/null and b/asset/icon/Icon16/sport_8ball.png differ diff --git a/asset/icon/Icon16/sport_basketball.png b/asset/icon/Icon16/sport_basketball.png new file mode 100644 index 0000000..3ef48af Binary files /dev/null and b/asset/icon/Icon16/sport_basketball.png differ diff --git a/asset/icon/Icon16/sport_football.png b/asset/icon/Icon16/sport_football.png new file mode 100644 index 0000000..90d5f72 Binary files /dev/null and b/asset/icon/Icon16/sport_football.png differ diff --git a/asset/icon/Icon16/sport_golf.png b/asset/icon/Icon16/sport_golf.png new file mode 100644 index 0000000..7745eb6 Binary files /dev/null and b/asset/icon/Icon16/sport_golf.png differ diff --git a/asset/icon/Icon16/sport_raquet.png b/asset/icon/Icon16/sport_raquet.png new file mode 100644 index 0000000..dbab616 Binary files /dev/null and b/asset/icon/Icon16/sport_raquet.png differ diff --git a/asset/icon/Icon16/sport_shuttlecock.png b/asset/icon/Icon16/sport_shuttlecock.png new file mode 100644 index 0000000..91ba3a3 Binary files /dev/null and b/asset/icon/Icon16/sport_shuttlecock.png differ diff --git a/asset/icon/Icon16/sport_soccer.png b/asset/icon/Icon16/sport_soccer.png new file mode 100644 index 0000000..6df9523 Binary files /dev/null and b/asset/icon/Icon16/sport_soccer.png differ diff --git a/asset/icon/Icon16/sport_tennis.png b/asset/icon/Icon16/sport_tennis.png new file mode 100644 index 0000000..239365c Binary files /dev/null and b/asset/icon/Icon16/sport_tennis.png differ diff --git a/asset/icon/Icon16/spray.png b/asset/icon/Icon16/spray.png new file mode 100644 index 0000000..dbeee76 Binary files /dev/null and b/asset/icon/Icon16/spray.png differ diff --git a/asset/icon/Icon16/spray_color.png b/asset/icon/Icon16/spray_color.png new file mode 100644 index 0000000..6509a28 Binary files /dev/null and b/asset/icon/Icon16/spray_color.png differ diff --git a/asset/icon/Icon16/spring.png b/asset/icon/Icon16/spring.png new file mode 100644 index 0000000..6a56858 Binary files /dev/null and b/asset/icon/Icon16/spring.png differ diff --git a/asset/icon/Icon16/sql.png b/asset/icon/Icon16/sql.png new file mode 100644 index 0000000..6246888 Binary files /dev/null and b/asset/icon/Icon16/sql.png differ diff --git a/asset/icon/Icon16/sql_join.png b/asset/icon/Icon16/sql_join.png new file mode 100644 index 0000000..29d764d Binary files /dev/null and b/asset/icon/Icon16/sql_join.png differ diff --git a/asset/icon/Icon16/sql_join_inner.png b/asset/icon/Icon16/sql_join_inner.png new file mode 100644 index 0000000..a96ea64 Binary files /dev/null and b/asset/icon/Icon16/sql_join_inner.png differ diff --git a/asset/icon/Icon16/sql_join_left.png b/asset/icon/Icon16/sql_join_left.png new file mode 100644 index 0000000..2fdfc73 Binary files /dev/null and b/asset/icon/Icon16/sql_join_left.png differ diff --git a/asset/icon/Icon16/sql_join_left_exclude.png b/asset/icon/Icon16/sql_join_left_exclude.png new file mode 100644 index 0000000..06b1519 Binary files /dev/null and b/asset/icon/Icon16/sql_join_left_exclude.png differ diff --git a/asset/icon/Icon16/sql_join_outer.png b/asset/icon/Icon16/sql_join_outer.png new file mode 100644 index 0000000..88d33d4 Binary files /dev/null and b/asset/icon/Icon16/sql_join_outer.png differ diff --git a/asset/icon/Icon16/sql_join_outer_exclude.png b/asset/icon/Icon16/sql_join_outer_exclude.png new file mode 100644 index 0000000..4a4152a Binary files /dev/null and b/asset/icon/Icon16/sql_join_outer_exclude.png differ diff --git a/asset/icon/Icon16/sql_join_right.png b/asset/icon/Icon16/sql_join_right.png new file mode 100644 index 0000000..2fa78db Binary files /dev/null and b/asset/icon/Icon16/sql_join_right.png differ diff --git a/asset/icon/Icon16/sql_join_right_exclude.png b/asset/icon/Icon16/sql_join_right_exclude.png new file mode 100644 index 0000000..521c9e9 Binary files /dev/null and b/asset/icon/Icon16/sql_join_right_exclude.png differ diff --git a/asset/icon/Icon16/sql_server(2).png b/asset/icon/Icon16/sql_server(2).png new file mode 100644 index 0000000..3af5107 Binary files /dev/null and b/asset/icon/Icon16/sql_server(2).png differ diff --git a/asset/icon/Icon16/sql_server.png b/asset/icon/Icon16/sql_server.png new file mode 100644 index 0000000..d9439fd Binary files /dev/null and b/asset/icon/Icon16/sql_server.png differ diff --git a/asset/icon/Icon16/ssh_server.png b/asset/icon/Icon16/ssh_server.png new file mode 100644 index 0000000..db9571e Binary files /dev/null and b/asset/icon/Icon16/ssh_server.png differ diff --git a/asset/icon/Icon16/ssh_shell_access.png b/asset/icon/Icon16/ssh_shell_access.png new file mode 100644 index 0000000..ed410a1 Binary files /dev/null and b/asset/icon/Icon16/ssh_shell_access.png differ diff --git a/asset/icon/Icon16/ssl_certificates.png b/asset/icon/Icon16/ssl_certificates.png new file mode 100644 index 0000000..c81b52c Binary files /dev/null and b/asset/icon/Icon16/ssl_certificates.png differ diff --git a/asset/icon/Icon16/ssl_tls_manager.png b/asset/icon/Icon16/ssl_tls_manager.png new file mode 100644 index 0000000..3774c9e Binary files /dev/null and b/asset/icon/Icon16/ssl_tls_manager.png differ diff --git a/asset/icon/Icon16/stairs.png b/asset/icon/Icon16/stairs.png new file mode 100644 index 0000000..da003c0 Binary files /dev/null and b/asset/icon/Icon16/stairs.png differ diff --git a/asset/icon/Icon16/stamp_pattern.png b/asset/icon/Icon16/stamp_pattern.png new file mode 100644 index 0000000..5e0774d Binary files /dev/null and b/asset/icon/Icon16/stamp_pattern.png differ diff --git a/asset/icon/Icon16/star.png b/asset/icon/Icon16/star.png new file mode 100644 index 0000000..883e4de Binary files /dev/null and b/asset/icon/Icon16/star.png differ diff --git a/asset/icon/Icon16/statistics.png b/asset/icon/Icon16/statistics.png new file mode 100644 index 0000000..ae39b56 Binary files /dev/null and b/asset/icon/Icon16/statistics.png differ diff --git a/asset/icon/Icon16/status_away.png b/asset/icon/Icon16/status_away.png new file mode 100644 index 0000000..24849c9 Binary files /dev/null and b/asset/icon/Icon16/status_away.png differ diff --git a/asset/icon/Icon16/status_bar.png b/asset/icon/Icon16/status_bar.png new file mode 100644 index 0000000..f6d5d1d Binary files /dev/null and b/asset/icon/Icon16/status_bar.png differ diff --git a/asset/icon/Icon16/status_bar_light_blue.png b/asset/icon/Icon16/status_bar_light_blue.png new file mode 100644 index 0000000..bfa694a Binary files /dev/null and b/asset/icon/Icon16/status_bar_light_blue.png differ diff --git a/asset/icon/Icon16/status_busy.png b/asset/icon/Icon16/status_busy.png new file mode 100644 index 0000000..66c55f1 Binary files /dev/null and b/asset/icon/Icon16/status_busy.png differ diff --git a/asset/icon/Icon16/status_offline.png b/asset/icon/Icon16/status_offline.png new file mode 100644 index 0000000..e854d6c Binary files /dev/null and b/asset/icon/Icon16/status_offline.png differ diff --git a/asset/icon/Icon16/status_online.png b/asset/icon/Icon16/status_online.png new file mode 100644 index 0000000..815fb11 Binary files /dev/null and b/asset/icon/Icon16/status_online.png differ diff --git a/asset/icon/Icon16/steak_fish.png b/asset/icon/Icon16/steak_fish.png new file mode 100644 index 0000000..bd78be5 Binary files /dev/null and b/asset/icon/Icon16/steak_fish.png differ diff --git a/asset/icon/Icon16/steak_meat.png b/asset/icon/Icon16/steak_meat.png new file mode 100644 index 0000000..669f5ce Binary files /dev/null and b/asset/icon/Icon16/steak_meat.png differ diff --git a/asset/icon/Icon16/steering_wheel.png b/asset/icon/Icon16/steering_wheel.png new file mode 100644 index 0000000..8341744 Binary files /dev/null and b/asset/icon/Icon16/steering_wheel.png differ diff --git a/asset/icon/Icon16/steering_wheel_2.png b/asset/icon/Icon16/steering_wheel_2.png new file mode 100644 index 0000000..192e5f2 Binary files /dev/null and b/asset/icon/Icon16/steering_wheel_2.png differ diff --git a/asset/icon/Icon16/steering_wheel_3.png b/asset/icon/Icon16/steering_wheel_3.png new file mode 100644 index 0000000..25e96f1 Binary files /dev/null and b/asset/icon/Icon16/steering_wheel_3.png differ diff --git a/asset/icon/Icon16/stethoscope.png b/asset/icon/Icon16/stethoscope.png new file mode 100644 index 0000000..3475551 Binary files /dev/null and b/asset/icon/Icon16/stethoscope.png differ diff --git a/asset/icon/Icon16/stethoscope_vintage.png b/asset/icon/Icon16/stethoscope_vintage.png new file mode 100644 index 0000000..694c06d Binary files /dev/null and b/asset/icon/Icon16/stethoscope_vintage.png differ diff --git a/asset/icon/Icon16/stickman.png b/asset/icon/Icon16/stickman.png new file mode 100644 index 0000000..c130e70 Binary files /dev/null and b/asset/icon/Icon16/stickman.png differ diff --git a/asset/icon/Icon16/stop.png b/asset/icon/Icon16/stop.png new file mode 100644 index 0000000..2b60138 Binary files /dev/null and b/asset/icon/Icon16/stop.png differ diff --git a/asset/icon/Icon16/stopwatch_finish.png b/asset/icon/Icon16/stopwatch_finish.png new file mode 100644 index 0000000..48c3d8f Binary files /dev/null and b/asset/icon/Icon16/stopwatch_finish.png differ diff --git a/asset/icon/Icon16/stopwatch_pause.png b/asset/icon/Icon16/stopwatch_pause.png new file mode 100644 index 0000000..9f30726 Binary files /dev/null and b/asset/icon/Icon16/stopwatch_pause.png differ diff --git a/asset/icon/Icon16/stopwatch_start.png b/asset/icon/Icon16/stopwatch_start.png new file mode 100644 index 0000000..630d966 Binary files /dev/null and b/asset/icon/Icon16/stopwatch_start.png differ diff --git a/asset/icon/Icon16/storage.png b/asset/icon/Icon16/storage.png new file mode 100644 index 0000000..e4f7528 Binary files /dev/null and b/asset/icon/Icon16/storage.png differ diff --git a/asset/icon/Icon16/street_stall.png b/asset/icon/Icon16/street_stall.png new file mode 100644 index 0000000..39a3528 Binary files /dev/null and b/asset/icon/Icon16/street_stall.png differ diff --git a/asset/icon/Icon16/stumble_upon.png b/asset/icon/Icon16/stumble_upon.png new file mode 100644 index 0000000..ef15dd4 Binary files /dev/null and b/asset/icon/Icon16/stumble_upon.png differ diff --git a/asset/icon/Icon16/style.png b/asset/icon/Icon16/style.png new file mode 100644 index 0000000..6583959 Binary files /dev/null and b/asset/icon/Icon16/style.png differ diff --git a/asset/icon/Icon16/style_add.png b/asset/icon/Icon16/style_add.png new file mode 100644 index 0000000..0d17237 Binary files /dev/null and b/asset/icon/Icon16/style_add.png differ diff --git a/asset/icon/Icon16/style_delete.png b/asset/icon/Icon16/style_delete.png new file mode 100644 index 0000000..a0aa8c8 Binary files /dev/null and b/asset/icon/Icon16/style_delete.png differ diff --git a/asset/icon/Icon16/style_edit.png b/asset/icon/Icon16/style_edit.png new file mode 100644 index 0000000..afcf94a Binary files /dev/null and b/asset/icon/Icon16/style_edit.png differ diff --git a/asset/icon/Icon16/style_go.png b/asset/icon/Icon16/style_go.png new file mode 100644 index 0000000..164a3ef Binary files /dev/null and b/asset/icon/Icon16/style_go.png differ diff --git a/asset/icon/Icon16/subdomains.png b/asset/icon/Icon16/subdomains.png new file mode 100644 index 0000000..06bf74a Binary files /dev/null and b/asset/icon/Icon16/subdomains.png differ diff --git a/asset/icon/Icon16/submit_support_request.png b/asset/icon/Icon16/submit_support_request.png new file mode 100644 index 0000000..e563bed Binary files /dev/null and b/asset/icon/Icon16/submit_support_request.png differ diff --git a/asset/icon/Icon16/subtotal.png b/asset/icon/Icon16/subtotal.png new file mode 100644 index 0000000..b138e2d Binary files /dev/null and b/asset/icon/Icon16/subtotal.png differ diff --git a/asset/icon/Icon16/subversion.png b/asset/icon/Icon16/subversion.png new file mode 100644 index 0000000..a46fa39 Binary files /dev/null and b/asset/icon/Icon16/subversion.png differ diff --git a/asset/icon/Icon16/subwoofer.png b/asset/icon/Icon16/subwoofer.png new file mode 100644 index 0000000..b62bf2e Binary files /dev/null and b/asset/icon/Icon16/subwoofer.png differ diff --git a/asset/icon/Icon16/sum.png b/asset/icon/Icon16/sum.png new file mode 100644 index 0000000..96b95f1 Binary files /dev/null and b/asset/icon/Icon16/sum.png differ diff --git a/asset/icon/Icon16/summary_table.png b/asset/icon/Icon16/summary_table.png new file mode 100644 index 0000000..491b221 Binary files /dev/null and b/asset/icon/Icon16/summary_table.png differ diff --git a/asset/icon/Icon16/sun_cloudy.png b/asset/icon/Icon16/sun_cloudy.png new file mode 100644 index 0000000..b58b8e7 Binary files /dev/null and b/asset/icon/Icon16/sun_cloudy.png differ diff --git a/asset/icon/Icon16/sun_rain.png b/asset/icon/Icon16/sun_rain.png new file mode 100644 index 0000000..7d53dcd Binary files /dev/null and b/asset/icon/Icon16/sun_rain.png differ diff --git a/asset/icon/Icon16/support.png b/asset/icon/Icon16/support.png new file mode 100644 index 0000000..1ae1c84 Binary files /dev/null and b/asset/icon/Icon16/support.png differ diff --git a/asset/icon/Icon16/sushi.png b/asset/icon/Icon16/sushi.png new file mode 100644 index 0000000..c61a1e2 Binary files /dev/null and b/asset/icon/Icon16/sushi.png differ diff --git a/asset/icon/Icon16/suspend_unsuspend_account.png b/asset/icon/Icon16/suspend_unsuspend_account.png new file mode 100644 index 0000000..c4f7806 Binary files /dev/null and b/asset/icon/Icon16/suspend_unsuspend_account.png differ diff --git a/asset/icon/Icon16/swf_loader.png b/asset/icon/Icon16/swf_loader.png new file mode 100644 index 0000000..6d1db6e Binary files /dev/null and b/asset/icon/Icon16/swf_loader.png differ diff --git a/asset/icon/Icon16/switch.png b/asset/icon/Icon16/switch.png new file mode 100644 index 0000000..ecb9915 Binary files /dev/null and b/asset/icon/Icon16/switch.png differ diff --git a/asset/icon/Icon16/switch_120v.png b/asset/icon/Icon16/switch_120v.png new file mode 100644 index 0000000..0fb042f Binary files /dev/null and b/asset/icon/Icon16/switch_120v.png differ diff --git a/asset/icon/Icon16/switch_220v.png b/asset/icon/Icon16/switch_220v.png new file mode 100644 index 0000000..16af4af Binary files /dev/null and b/asset/icon/Icon16/switch_220v.png differ diff --git a/asset/icon/Icon16/switch_windows.png b/asset/icon/Icon16/switch_windows.png new file mode 100644 index 0000000..d6752d3 Binary files /dev/null and b/asset/icon/Icon16/switch_windows.png differ diff --git a/asset/icon/Icon16/sword.png b/asset/icon/Icon16/sword.png new file mode 100644 index 0000000..22eba1d Binary files /dev/null and b/asset/icon/Icon16/sword.png differ diff --git a/asset/icon/Icon16/synchronize_ftp_password.png b/asset/icon/Icon16/synchronize_ftp_password.png new file mode 100644 index 0000000..d63d833 Binary files /dev/null and b/asset/icon/Icon16/synchronize_ftp_password.png differ diff --git a/asset/icon/Icon16/synchronous_scrolling.png b/asset/icon/Icon16/synchronous_scrolling.png new file mode 100644 index 0000000..a6145ed Binary files /dev/null and b/asset/icon/Icon16/synchronous_scrolling.png differ diff --git a/asset/icon/Icon16/system_monitor.png b/asset/icon/Icon16/system_monitor.png new file mode 100644 index 0000000..ecfdd09 Binary files /dev/null and b/asset/icon/Icon16/system_monitor.png differ diff --git a/asset/icon/Icon16/system_time.png b/asset/icon/Icon16/system_time.png new file mode 100644 index 0000000..8f02b57 Binary files /dev/null and b/asset/icon/Icon16/system_time.png differ diff --git a/asset/icon/Icon16/t_shirt_print.png b/asset/icon/Icon16/t_shirt_print.png new file mode 100644 index 0000000..3a757a8 Binary files /dev/null and b/asset/icon/Icon16/t_shirt_print.png differ diff --git a/asset/icon/Icon16/tab.png b/asset/icon/Icon16/tab.png new file mode 100644 index 0000000..a9dee1a Binary files /dev/null and b/asset/icon/Icon16/tab.png differ diff --git a/asset/icon/Icon16/tab_add.png b/asset/icon/Icon16/tab_add.png new file mode 100644 index 0000000..4cc1d3f Binary files /dev/null and b/asset/icon/Icon16/tab_add.png differ diff --git a/asset/icon/Icon16/tab_content.png b/asset/icon/Icon16/tab_content.png new file mode 100644 index 0000000..4b9ed73 Binary files /dev/null and b/asset/icon/Icon16/tab_content.png differ diff --git a/asset/icon/Icon16/tab_content_vertical.png b/asset/icon/Icon16/tab_content_vertical.png new file mode 100644 index 0000000..d21a4dd Binary files /dev/null and b/asset/icon/Icon16/tab_content_vertical.png differ diff --git a/asset/icon/Icon16/tab_delete.png b/asset/icon/Icon16/tab_delete.png new file mode 100644 index 0000000..b39b142 Binary files /dev/null and b/asset/icon/Icon16/tab_delete.png differ diff --git a/asset/icon/Icon16/tab_edit.png b/asset/icon/Icon16/tab_edit.png new file mode 100644 index 0000000..2351d4c Binary files /dev/null and b/asset/icon/Icon16/tab_edit.png differ diff --git a/asset/icon/Icon16/tab_go.png b/asset/icon/Icon16/tab_go.png new file mode 100644 index 0000000..b733971 Binary files /dev/null and b/asset/icon/Icon16/tab_go.png differ diff --git a/asset/icon/Icon16/tab_side.png b/asset/icon/Icon16/tab_side.png new file mode 100644 index 0000000..db02476 Binary files /dev/null and b/asset/icon/Icon16/tab_side.png differ diff --git a/asset/icon/Icon16/tabbar.png b/asset/icon/Icon16/tabbar.png new file mode 100644 index 0000000..1bd649a Binary files /dev/null and b/asset/icon/Icon16/tabbar.png differ diff --git a/asset/icon/Icon16/table.png b/asset/icon/Icon16/table.png new file mode 100644 index 0000000..8a7c043 Binary files /dev/null and b/asset/icon/Icon16/table.png differ diff --git a/asset/icon/Icon16/table_add.png b/asset/icon/Icon16/table_add.png new file mode 100644 index 0000000..09662da Binary files /dev/null and b/asset/icon/Icon16/table_add.png differ diff --git a/asset/icon/Icon16/table_analysis.png b/asset/icon/Icon16/table_analysis.png new file mode 100644 index 0000000..98d4db7 Binary files /dev/null and b/asset/icon/Icon16/table_analysis.png differ diff --git a/asset/icon/Icon16/table_chart.png b/asset/icon/Icon16/table_chart.png new file mode 100644 index 0000000..5adbeab Binary files /dev/null and b/asset/icon/Icon16/table_chart.png differ diff --git a/asset/icon/Icon16/table_delete.png b/asset/icon/Icon16/table_delete.png new file mode 100644 index 0000000..e2f2a81 Binary files /dev/null and b/asset/icon/Icon16/table_delete.png differ diff --git a/asset/icon/Icon16/table_design.png b/asset/icon/Icon16/table_design.png new file mode 100644 index 0000000..1d279bd Binary files /dev/null and b/asset/icon/Icon16/table_design.png differ diff --git a/asset/icon/Icon16/table_edit.png b/asset/icon/Icon16/table_edit.png new file mode 100644 index 0000000..4944424 Binary files /dev/null and b/asset/icon/Icon16/table_edit.png differ diff --git a/asset/icon/Icon16/table_error.png b/asset/icon/Icon16/table_error.png new file mode 100644 index 0000000..74897bc Binary files /dev/null and b/asset/icon/Icon16/table_error.png differ diff --git a/asset/icon/Icon16/table_excel.png b/asset/icon/Icon16/table_excel.png new file mode 100644 index 0000000..3cf3f34 Binary files /dev/null and b/asset/icon/Icon16/table_excel.png differ diff --git a/asset/icon/Icon16/table_export.png b/asset/icon/Icon16/table_export.png new file mode 100644 index 0000000..7df7373 Binary files /dev/null and b/asset/icon/Icon16/table_export.png differ diff --git a/asset/icon/Icon16/table_filter.png b/asset/icon/Icon16/table_filter.png new file mode 100644 index 0000000..8979d8f Binary files /dev/null and b/asset/icon/Icon16/table_filter.png differ diff --git a/asset/icon/Icon16/table_format.png b/asset/icon/Icon16/table_format.png new file mode 100644 index 0000000..72cb08d Binary files /dev/null and b/asset/icon/Icon16/table_format.png differ diff --git a/asset/icon/Icon16/table_gear.png b/asset/icon/Icon16/table_gear.png new file mode 100644 index 0000000..bb938eb Binary files /dev/null and b/asset/icon/Icon16/table_gear.png differ diff --git a/asset/icon/Icon16/table_go.png b/asset/icon/Icon16/table_go.png new file mode 100644 index 0000000..b6edf3a Binary files /dev/null and b/asset/icon/Icon16/table_go.png differ diff --git a/asset/icon/Icon16/table_heatmap(2).png b/asset/icon/Icon16/table_heatmap(2).png new file mode 100644 index 0000000..f5b1782 Binary files /dev/null and b/asset/icon/Icon16/table_heatmap(2).png differ diff --git a/asset/icon/Icon16/table_heatmap.png b/asset/icon/Icon16/table_heatmap.png new file mode 100644 index 0000000..86a97bf Binary files /dev/null and b/asset/icon/Icon16/table_heatmap.png differ diff --git a/asset/icon/Icon16/table_import.png b/asset/icon/Icon16/table_import.png new file mode 100644 index 0000000..a442ed2 Binary files /dev/null and b/asset/icon/Icon16/table_import.png differ diff --git a/asset/icon/Icon16/table_insert.png b/asset/icon/Icon16/table_insert.png new file mode 100644 index 0000000..0192221 Binary files /dev/null and b/asset/icon/Icon16/table_insert.png differ diff --git a/asset/icon/Icon16/table_key.png b/asset/icon/Icon16/table_key.png new file mode 100644 index 0000000..ce6aabd Binary files /dev/null and b/asset/icon/Icon16/table_key.png differ diff --git a/asset/icon/Icon16/table_lightning.png b/asset/icon/Icon16/table_lightning.png new file mode 100644 index 0000000..3399d04 Binary files /dev/null and b/asset/icon/Icon16/table_lightning.png differ diff --git a/asset/icon/Icon16/table_link.png b/asset/icon/Icon16/table_link.png new file mode 100644 index 0000000..4e6bb17 Binary files /dev/null and b/asset/icon/Icon16/table_link.png differ diff --git a/asset/icon/Icon16/table_money.png b/asset/icon/Icon16/table_money.png new file mode 100644 index 0000000..7647521 Binary files /dev/null and b/asset/icon/Icon16/table_money.png differ diff --git a/asset/icon/Icon16/table_multiple.png b/asset/icon/Icon16/table_multiple.png new file mode 100644 index 0000000..82fafb2 Binary files /dev/null and b/asset/icon/Icon16/table_multiple.png differ diff --git a/asset/icon/Icon16/table_paint_can.png b/asset/icon/Icon16/table_paint_can.png new file mode 100644 index 0000000..03c8a14 Binary files /dev/null and b/asset/icon/Icon16/table_paint_can.png differ diff --git a/asset/icon/Icon16/table_refresh.png b/asset/icon/Icon16/table_refresh.png new file mode 100644 index 0000000..2c02abc Binary files /dev/null and b/asset/icon/Icon16/table_refresh.png differ diff --git a/asset/icon/Icon16/table_relationship.png b/asset/icon/Icon16/table_relationship.png new file mode 100644 index 0000000..bf6b2fc Binary files /dev/null and b/asset/icon/Icon16/table_relationship.png differ diff --git a/asset/icon/Icon16/table_replace.png b/asset/icon/Icon16/table_replace.png new file mode 100644 index 0000000..21bb0c9 Binary files /dev/null and b/asset/icon/Icon16/table_replace.png differ diff --git a/asset/icon/Icon16/table_row_delete.png b/asset/icon/Icon16/table_row_delete.png new file mode 100644 index 0000000..76ce700 Binary files /dev/null and b/asset/icon/Icon16/table_row_delete.png differ diff --git a/asset/icon/Icon16/table_row_insert.png b/asset/icon/Icon16/table_row_insert.png new file mode 100644 index 0000000..c143ae6 Binary files /dev/null and b/asset/icon/Icon16/table_row_insert.png differ diff --git a/asset/icon/Icon16/table_save.png b/asset/icon/Icon16/table_save.png new file mode 100644 index 0000000..b13494d Binary files /dev/null and b/asset/icon/Icon16/table_save.png differ diff --git a/asset/icon/Icon16/table_select(2).png b/asset/icon/Icon16/table_select(2).png new file mode 100644 index 0000000..9df7ff1 Binary files /dev/null and b/asset/icon/Icon16/table_select(2).png differ diff --git a/asset/icon/Icon16/table_select.png b/asset/icon/Icon16/table_select.png new file mode 100644 index 0000000..e4bea5f Binary files /dev/null and b/asset/icon/Icon16/table_select.png differ diff --git a/asset/icon/Icon16/table_select_all.png b/asset/icon/Icon16/table_select_all.png new file mode 100644 index 0000000..e027a0c Binary files /dev/null and b/asset/icon/Icon16/table_select_all.png differ diff --git a/asset/icon/Icon16/table_select_column.png b/asset/icon/Icon16/table_select_column.png new file mode 100644 index 0000000..fa01876 Binary files /dev/null and b/asset/icon/Icon16/table_select_column.png differ diff --git a/asset/icon/Icon16/table_select_row.png b/asset/icon/Icon16/table_select_row.png new file mode 100644 index 0000000..df33f44 Binary files /dev/null and b/asset/icon/Icon16/table_select_row.png differ diff --git a/asset/icon/Icon16/table_sheet.png b/asset/icon/Icon16/table_sheet.png new file mode 100644 index 0000000..59df833 Binary files /dev/null and b/asset/icon/Icon16/table_sheet.png differ diff --git a/asset/icon/Icon16/table_sort.png b/asset/icon/Icon16/table_sort.png new file mode 100644 index 0000000..d0a38e8 Binary files /dev/null and b/asset/icon/Icon16/table_sort.png differ diff --git a/asset/icon/Icon16/table_sort_filter.png b/asset/icon/Icon16/table_sort_filter.png new file mode 100644 index 0000000..6ff82f3 Binary files /dev/null and b/asset/icon/Icon16/table_sort_filter.png differ diff --git a/asset/icon/Icon16/table_split.png b/asset/icon/Icon16/table_split.png new file mode 100644 index 0000000..3bd9100 Binary files /dev/null and b/asset/icon/Icon16/table_split.png differ diff --git a/asset/icon/Icon16/table_sum.png b/asset/icon/Icon16/table_sum.png new file mode 100644 index 0000000..e92b11c Binary files /dev/null and b/asset/icon/Icon16/table_sum.png differ diff --git a/asset/icon/Icon16/table_tab.png b/asset/icon/Icon16/table_tab.png new file mode 100644 index 0000000..c3f4c34 Binary files /dev/null and b/asset/icon/Icon16/table_tab.png differ diff --git a/asset/icon/Icon16/table_tab_resize.png b/asset/icon/Icon16/table_tab_resize.png new file mode 100644 index 0000000..f1900f7 Binary files /dev/null and b/asset/icon/Icon16/table_tab_resize.png differ diff --git a/asset/icon/Icon16/table_tab_search.png b/asset/icon/Icon16/table_tab_search.png new file mode 100644 index 0000000..e3eeec9 Binary files /dev/null and b/asset/icon/Icon16/table_tab_search.png differ diff --git a/asset/icon/Icon16/table_torn.png b/asset/icon/Icon16/table_torn.png new file mode 100644 index 0000000..6b1d86e Binary files /dev/null and b/asset/icon/Icon16/table_torn.png differ diff --git a/asset/icon/Icon16/tablets.png b/asset/icon/Icon16/tablets.png new file mode 100644 index 0000000..cb96af1 Binary files /dev/null and b/asset/icon/Icon16/tablets.png differ diff --git a/asset/icon/Icon16/tabnavigator.png b/asset/icon/Icon16/tabnavigator.png new file mode 100644 index 0000000..b43eb55 Binary files /dev/null and b/asset/icon/Icon16/tabnavigator.png differ diff --git a/asset/icon/Icon16/tag.png b/asset/icon/Icon16/tag.png new file mode 100644 index 0000000..9740f8c Binary files /dev/null and b/asset/icon/Icon16/tag.png differ diff --git a/asset/icon/Icon16/tag_blue.png b/asset/icon/Icon16/tag_blue.png new file mode 100644 index 0000000..6fb1ca4 Binary files /dev/null and b/asset/icon/Icon16/tag_blue.png differ diff --git a/asset/icon/Icon16/tag_blue_add.png b/asset/icon/Icon16/tag_blue_add.png new file mode 100644 index 0000000..22ee0b6 Binary files /dev/null and b/asset/icon/Icon16/tag_blue_add.png differ diff --git a/asset/icon/Icon16/tag_blue_delete.png b/asset/icon/Icon16/tag_blue_delete.png new file mode 100644 index 0000000..d019f89 Binary files /dev/null and b/asset/icon/Icon16/tag_blue_delete.png differ diff --git a/asset/icon/Icon16/tag_blue_edit.png b/asset/icon/Icon16/tag_blue_edit.png new file mode 100644 index 0000000..357cd54 Binary files /dev/null and b/asset/icon/Icon16/tag_blue_edit.png differ diff --git a/asset/icon/Icon16/tag_green.png b/asset/icon/Icon16/tag_green.png new file mode 100644 index 0000000..48a7175 Binary files /dev/null and b/asset/icon/Icon16/tag_green.png differ diff --git a/asset/icon/Icon16/tag_hash.png b/asset/icon/Icon16/tag_hash.png new file mode 100644 index 0000000..58dfec6 Binary files /dev/null and b/asset/icon/Icon16/tag_hash.png differ diff --git a/asset/icon/Icon16/tag_orange.png b/asset/icon/Icon16/tag_orange.png new file mode 100644 index 0000000..7e75cba Binary files /dev/null and b/asset/icon/Icon16/tag_orange.png differ diff --git a/asset/icon/Icon16/tag_pink.png b/asset/icon/Icon16/tag_pink.png new file mode 100644 index 0000000..a1149fa Binary files /dev/null and b/asset/icon/Icon16/tag_pink.png differ diff --git a/asset/icon/Icon16/tag_purple.png b/asset/icon/Icon16/tag_purple.png new file mode 100644 index 0000000..5eb022f Binary files /dev/null and b/asset/icon/Icon16/tag_purple.png differ diff --git a/asset/icon/Icon16/tag_red.png b/asset/icon/Icon16/tag_red.png new file mode 100644 index 0000000..357842f Binary files /dev/null and b/asset/icon/Icon16/tag_red.png differ diff --git a/asset/icon/Icon16/tag_yellow.png b/asset/icon/Icon16/tag_yellow.png new file mode 100644 index 0000000..91de721 Binary files /dev/null and b/asset/icon/Icon16/tag_yellow.png differ diff --git a/asset/icon/Icon16/tags_cloud.png b/asset/icon/Icon16/tags_cloud.png new file mode 100644 index 0000000..deffb43 Binary files /dev/null and b/asset/icon/Icon16/tags_cloud.png differ diff --git a/asset/icon/Icon16/tea_cup.png b/asset/icon/Icon16/tea_cup.png new file mode 100644 index 0000000..c475c3c Binary files /dev/null and b/asset/icon/Icon16/tea_cup.png differ diff --git a/asset/icon/Icon16/teapot.png b/asset/icon/Icon16/teapot.png new file mode 100644 index 0000000..85e9915 Binary files /dev/null and b/asset/icon/Icon16/teapot.png differ diff --git a/asset/icon/Icon16/technorati.png b/asset/icon/Icon16/technorati.png new file mode 100644 index 0000000..1a57275 Binary files /dev/null and b/asset/icon/Icon16/technorati.png differ diff --git a/asset/icon/Icon16/teddy_bear.png b/asset/icon/Icon16/teddy_bear.png new file mode 100644 index 0000000..c341757 Binary files /dev/null and b/asset/icon/Icon16/teddy_bear.png differ diff --git a/asset/icon/Icon16/telephone.png b/asset/icon/Icon16/telephone.png new file mode 100644 index 0000000..e04ec63 Binary files /dev/null and b/asset/icon/Icon16/telephone.png differ diff --git a/asset/icon/Icon16/telephone_add.png b/asset/icon/Icon16/telephone_add.png new file mode 100644 index 0000000..923b8b0 Binary files /dev/null and b/asset/icon/Icon16/telephone_add.png differ diff --git a/asset/icon/Icon16/telephone_delete.png b/asset/icon/Icon16/telephone_delete.png new file mode 100644 index 0000000..aa2841e Binary files /dev/null and b/asset/icon/Icon16/telephone_delete.png differ diff --git a/asset/icon/Icon16/telephone_edit.png b/asset/icon/Icon16/telephone_edit.png new file mode 100644 index 0000000..b050db0 Binary files /dev/null and b/asset/icon/Icon16/telephone_edit.png differ diff --git a/asset/icon/Icon16/telephone_error.png b/asset/icon/Icon16/telephone_error.png new file mode 100644 index 0000000..ef626c9 Binary files /dev/null and b/asset/icon/Icon16/telephone_error.png differ diff --git a/asset/icon/Icon16/telephone_go.png b/asset/icon/Icon16/telephone_go.png new file mode 100644 index 0000000..7729203 Binary files /dev/null and b/asset/icon/Icon16/telephone_go.png differ diff --git a/asset/icon/Icon16/telephone_key.png b/asset/icon/Icon16/telephone_key.png new file mode 100644 index 0000000..f351577 Binary files /dev/null and b/asset/icon/Icon16/telephone_key.png differ diff --git a/asset/icon/Icon16/telephone_link.png b/asset/icon/Icon16/telephone_link.png new file mode 100644 index 0000000..339b92f Binary files /dev/null and b/asset/icon/Icon16/telephone_link.png differ diff --git a/asset/icon/Icon16/telephone_off.png b/asset/icon/Icon16/telephone_off.png new file mode 100644 index 0000000..a996eea Binary files /dev/null and b/asset/icon/Icon16/telephone_off.png differ diff --git a/asset/icon/Icon16/television.png b/asset/icon/Icon16/television.png new file mode 100644 index 0000000..fc38277 Binary files /dev/null and b/asset/icon/Icon16/television.png differ diff --git a/asset/icon/Icon16/television_add.png b/asset/icon/Icon16/television_add.png new file mode 100644 index 0000000..45428c7 Binary files /dev/null and b/asset/icon/Icon16/television_add.png differ diff --git a/asset/icon/Icon16/television_delete.png b/asset/icon/Icon16/television_delete.png new file mode 100644 index 0000000..964c254 Binary files /dev/null and b/asset/icon/Icon16/television_delete.png differ diff --git a/asset/icon/Icon16/temperature_1.png b/asset/icon/Icon16/temperature_1.png new file mode 100644 index 0000000..7e389d4 Binary files /dev/null and b/asset/icon/Icon16/temperature_1.png differ diff --git a/asset/icon/Icon16/temperature_2.png b/asset/icon/Icon16/temperature_2.png new file mode 100644 index 0000000..369352f Binary files /dev/null and b/asset/icon/Icon16/temperature_2.png differ diff --git a/asset/icon/Icon16/temperature_3.png b/asset/icon/Icon16/temperature_3.png new file mode 100644 index 0000000..e9f5b2d Binary files /dev/null and b/asset/icon/Icon16/temperature_3.png differ diff --git a/asset/icon/Icon16/temperature_4.png b/asset/icon/Icon16/temperature_4.png new file mode 100644 index 0000000..406afa9 Binary files /dev/null and b/asset/icon/Icon16/temperature_4.png differ diff --git a/asset/icon/Icon16/temperature_5.png b/asset/icon/Icon16/temperature_5.png new file mode 100644 index 0000000..e13a046 Binary files /dev/null and b/asset/icon/Icon16/temperature_5.png differ diff --git a/asset/icon/Icon16/terminal.png b/asset/icon/Icon16/terminal.png new file mode 100644 index 0000000..fac36a1 Binary files /dev/null and b/asset/icon/Icon16/terminal.png differ diff --git a/asset/icon/Icon16/terminal_seats_blue.png b/asset/icon/Icon16/terminal_seats_blue.png new file mode 100644 index 0000000..9868a51 Binary files /dev/null and b/asset/icon/Icon16/terminal_seats_blue.png differ diff --git a/asset/icon/Icon16/terminal_seats_red.png b/asset/icon/Icon16/terminal_seats_red.png new file mode 100644 index 0000000..2c55de6 Binary files /dev/null and b/asset/icon/Icon16/terminal_seats_red.png differ diff --git a/asset/icon/Icon16/text.png b/asset/icon/Icon16/text.png new file mode 100644 index 0000000..5c8a1ec Binary files /dev/null and b/asset/icon/Icon16/text.png differ diff --git a/asset/icon/Icon16/text_add.png b/asset/icon/Icon16/text_add.png new file mode 100644 index 0000000..2a397b4 Binary files /dev/null and b/asset/icon/Icon16/text_add.png differ diff --git a/asset/icon/Icon16/text_align_center.png b/asset/icon/Icon16/text_align_center.png new file mode 100644 index 0000000..0dc7d45 Binary files /dev/null and b/asset/icon/Icon16/text_align_center.png differ diff --git a/asset/icon/Icon16/text_align_justity.png b/asset/icon/Icon16/text_align_justity.png new file mode 100644 index 0000000..cd091db Binary files /dev/null and b/asset/icon/Icon16/text_align_justity.png differ diff --git a/asset/icon/Icon16/text_align_left.png b/asset/icon/Icon16/text_align_left.png new file mode 100644 index 0000000..58278c8 Binary files /dev/null and b/asset/icon/Icon16/text_align_left.png differ diff --git a/asset/icon/Icon16/text_align_right.png b/asset/icon/Icon16/text_align_right.png new file mode 100644 index 0000000..34a0787 Binary files /dev/null and b/asset/icon/Icon16/text_align_right.png differ diff --git a/asset/icon/Icon16/text_allcaps.png b/asset/icon/Icon16/text_allcaps.png new file mode 100644 index 0000000..71c608f Binary files /dev/null and b/asset/icon/Icon16/text_allcaps.png differ diff --git a/asset/icon/Icon16/text_area(2).png b/asset/icon/Icon16/text_area(2).png new file mode 100644 index 0000000..7f10361 Binary files /dev/null and b/asset/icon/Icon16/text_area(2).png differ diff --git a/asset/icon/Icon16/text_area.png b/asset/icon/Icon16/text_area.png new file mode 100644 index 0000000..4f20b67 Binary files /dev/null and b/asset/icon/Icon16/text_area.png differ diff --git a/asset/icon/Icon16/text_bold.png b/asset/icon/Icon16/text_bold.png new file mode 100644 index 0000000..0b59ee9 Binary files /dev/null and b/asset/icon/Icon16/text_bold.png differ diff --git a/asset/icon/Icon16/text_columns.png b/asset/icon/Icon16/text_columns.png new file mode 100644 index 0000000..d8cd221 Binary files /dev/null and b/asset/icon/Icon16/text_columns.png differ diff --git a/asset/icon/Icon16/text_document.png b/asset/icon/Icon16/text_document.png new file mode 100644 index 0000000..dadfcfd Binary files /dev/null and b/asset/icon/Icon16/text_document.png differ diff --git a/asset/icon/Icon16/text_document_wrap.png b/asset/icon/Icon16/text_document_wrap.png new file mode 100644 index 0000000..d4d8ae1 Binary files /dev/null and b/asset/icon/Icon16/text_document_wrap.png differ diff --git a/asset/icon/Icon16/text_drama.png b/asset/icon/Icon16/text_drama.png new file mode 100644 index 0000000..ffa8c74 Binary files /dev/null and b/asset/icon/Icon16/text_drama.png differ diff --git a/asset/icon/Icon16/text_dropcaps.png b/asset/icon/Icon16/text_dropcaps.png new file mode 100644 index 0000000..d041c57 Binary files /dev/null and b/asset/icon/Icon16/text_dropcaps.png differ diff --git a/asset/icon/Icon16/text_effects.png b/asset/icon/Icon16/text_effects.png new file mode 100644 index 0000000..3041112 Binary files /dev/null and b/asset/icon/Icon16/text_effects.png differ diff --git a/asset/icon/Icon16/text_exports.png b/asset/icon/Icon16/text_exports.png new file mode 100644 index 0000000..1232aff Binary files /dev/null and b/asset/icon/Icon16/text_exports.png differ diff --git a/asset/icon/Icon16/text_functions.png b/asset/icon/Icon16/text_functions.png new file mode 100644 index 0000000..4914d14 Binary files /dev/null and b/asset/icon/Icon16/text_functions.png differ diff --git a/asset/icon/Icon16/text_heading_1.png b/asset/icon/Icon16/text_heading_1.png new file mode 100644 index 0000000..632c113 Binary files /dev/null and b/asset/icon/Icon16/text_heading_1.png differ diff --git a/asset/icon/Icon16/text_heading_2.png b/asset/icon/Icon16/text_heading_2.png new file mode 100644 index 0000000..a2ef293 Binary files /dev/null and b/asset/icon/Icon16/text_heading_2.png differ diff --git a/asset/icon/Icon16/text_heading_3.png b/asset/icon/Icon16/text_heading_3.png new file mode 100644 index 0000000..b5a2b49 Binary files /dev/null and b/asset/icon/Icon16/text_heading_3.png differ diff --git a/asset/icon/Icon16/text_heading_4.png b/asset/icon/Icon16/text_heading_4.png new file mode 100644 index 0000000..e7718ae Binary files /dev/null and b/asset/icon/Icon16/text_heading_4.png differ diff --git a/asset/icon/Icon16/text_heading_5.png b/asset/icon/Icon16/text_heading_5.png new file mode 100644 index 0000000..8d7dd50 Binary files /dev/null and b/asset/icon/Icon16/text_heading_5.png differ diff --git a/asset/icon/Icon16/text_heading_6.png b/asset/icon/Icon16/text_heading_6.png new file mode 100644 index 0000000..56b2370 Binary files /dev/null and b/asset/icon/Icon16/text_heading_6.png differ diff --git a/asset/icon/Icon16/text_horizontalrule.png b/asset/icon/Icon16/text_horizontalrule.png new file mode 100644 index 0000000..a9af763 Binary files /dev/null and b/asset/icon/Icon16/text_horizontalrule.png differ diff --git a/asset/icon/Icon16/text_imports.png b/asset/icon/Icon16/text_imports.png new file mode 100644 index 0000000..9d47c5c Binary files /dev/null and b/asset/icon/Icon16/text_imports.png differ diff --git a/asset/icon/Icon16/text_indent.png b/asset/icon/Icon16/text_indent.png new file mode 100644 index 0000000..ecd8e3f Binary files /dev/null and b/asset/icon/Icon16/text_indent.png differ diff --git a/asset/icon/Icon16/text_indent_remove.png b/asset/icon/Icon16/text_indent_remove.png new file mode 100644 index 0000000..e308dfa Binary files /dev/null and b/asset/icon/Icon16/text_indent_remove.png differ diff --git a/asset/icon/Icon16/text_italic.png b/asset/icon/Icon16/text_italic.png new file mode 100644 index 0000000..ca00ca5 Binary files /dev/null and b/asset/icon/Icon16/text_italic.png differ diff --git a/asset/icon/Icon16/text_kerning.png b/asset/icon/Icon16/text_kerning.png new file mode 100644 index 0000000..ed0f3a4 Binary files /dev/null and b/asset/icon/Icon16/text_kerning.png differ diff --git a/asset/icon/Icon16/text_language.png b/asset/icon/Icon16/text_language.png new file mode 100644 index 0000000..e7f0761 Binary files /dev/null and b/asset/icon/Icon16/text_language.png differ diff --git a/asset/icon/Icon16/text_large_cap.png b/asset/icon/Icon16/text_large_cap.png new file mode 100644 index 0000000..df23a67 Binary files /dev/null and b/asset/icon/Icon16/text_large_cap.png differ diff --git a/asset/icon/Icon16/text_letter_omega.png b/asset/icon/Icon16/text_letter_omega.png new file mode 100644 index 0000000..e327975 Binary files /dev/null and b/asset/icon/Icon16/text_letter_omega.png differ diff --git a/asset/icon/Icon16/text_letterspacing.png b/asset/icon/Icon16/text_letterspacing.png new file mode 100644 index 0000000..ab35dc9 Binary files /dev/null and b/asset/icon/Icon16/text_letterspacing.png differ diff --git a/asset/icon/Icon16/text_linespacing.png b/asset/icon/Icon16/text_linespacing.png new file mode 100644 index 0000000..f4857c7 Binary files /dev/null and b/asset/icon/Icon16/text_linespacing.png differ diff --git a/asset/icon/Icon16/text_list_bullets.png b/asset/icon/Icon16/text_list_bullets.png new file mode 100644 index 0000000..f7ce7fa Binary files /dev/null and b/asset/icon/Icon16/text_list_bullets.png differ diff --git a/asset/icon/Icon16/text_list_numbers.png b/asset/icon/Icon16/text_list_numbers.png new file mode 100644 index 0000000..6777890 Binary files /dev/null and b/asset/icon/Icon16/text_list_numbers.png differ diff --git a/asset/icon/Icon16/text_lowercase.png b/asset/icon/Icon16/text_lowercase.png new file mode 100644 index 0000000..54f3520 Binary files /dev/null and b/asset/icon/Icon16/text_lowercase.png differ diff --git a/asset/icon/Icon16/text_move.png b/asset/icon/Icon16/text_move.png new file mode 100644 index 0000000..436333e Binary files /dev/null and b/asset/icon/Icon16/text_move.png differ diff --git a/asset/icon/Icon16/text_padding_bottom.png b/asset/icon/Icon16/text_padding_bottom.png new file mode 100644 index 0000000..5b53a67 Binary files /dev/null and b/asset/icon/Icon16/text_padding_bottom.png differ diff --git a/asset/icon/Icon16/text_padding_left.png b/asset/icon/Icon16/text_padding_left.png new file mode 100644 index 0000000..eed6749 Binary files /dev/null and b/asset/icon/Icon16/text_padding_left.png differ diff --git a/asset/icon/Icon16/text_padding_right.png b/asset/icon/Icon16/text_padding_right.png new file mode 100644 index 0000000..d271152 Binary files /dev/null and b/asset/icon/Icon16/text_padding_right.png differ diff --git a/asset/icon/Icon16/text_padding_top.png b/asset/icon/Icon16/text_padding_top.png new file mode 100644 index 0000000..9f2c9d6 Binary files /dev/null and b/asset/icon/Icon16/text_padding_top.png differ diff --git a/asset/icon/Icon16/text_pagination.png b/asset/icon/Icon16/text_pagination.png new file mode 100644 index 0000000..4f3e3ca Binary files /dev/null and b/asset/icon/Icon16/text_pagination.png differ diff --git a/asset/icon/Icon16/text_pagination_100.png b/asset/icon/Icon16/text_pagination_100.png new file mode 100644 index 0000000..46ac98f Binary files /dev/null and b/asset/icon/Icon16/text_pagination_100.png differ diff --git a/asset/icon/Icon16/text_position_slide.png b/asset/icon/Icon16/text_position_slide.png new file mode 100644 index 0000000..9f95a16 Binary files /dev/null and b/asset/icon/Icon16/text_position_slide.png differ diff --git a/asset/icon/Icon16/text_prose.png b/asset/icon/Icon16/text_prose.png new file mode 100644 index 0000000..7a407b5 Binary files /dev/null and b/asset/icon/Icon16/text_prose.png differ diff --git a/asset/icon/Icon16/text_replace.png b/asset/icon/Icon16/text_replace.png new file mode 100644 index 0000000..d2a99e5 Binary files /dev/null and b/asset/icon/Icon16/text_replace.png differ diff --git a/asset/icon/Icon16/text_resize.png b/asset/icon/Icon16/text_resize.png new file mode 100644 index 0000000..b3fca27 Binary files /dev/null and b/asset/icon/Icon16/text_resize.png differ diff --git a/asset/icon/Icon16/text_rotate.png b/asset/icon/Icon16/text_rotate.png new file mode 100644 index 0000000..8a35214 Binary files /dev/null and b/asset/icon/Icon16/text_rotate.png differ diff --git a/asset/icon/Icon16/text_signature.png b/asset/icon/Icon16/text_signature.png new file mode 100644 index 0000000..637afcb Binary files /dev/null and b/asset/icon/Icon16/text_signature.png differ diff --git a/asset/icon/Icon16/text_smallcaps.png b/asset/icon/Icon16/text_smallcaps.png new file mode 100644 index 0000000..d6b685a Binary files /dev/null and b/asset/icon/Icon16/text_smallcaps.png differ diff --git a/asset/icon/Icon16/text_strikethroungh.png b/asset/icon/Icon16/text_strikethroungh.png new file mode 100644 index 0000000..5f42b14 Binary files /dev/null and b/asset/icon/Icon16/text_strikethroungh.png differ diff --git a/asset/icon/Icon16/text_subscript.png b/asset/icon/Icon16/text_subscript.png new file mode 100644 index 0000000..5edffc2 Binary files /dev/null and b/asset/icon/Icon16/text_subscript.png differ diff --git a/asset/icon/Icon16/text_superscript.png b/asset/icon/Icon16/text_superscript.png new file mode 100644 index 0000000..49d31b4 Binary files /dev/null and b/asset/icon/Icon16/text_superscript.png differ diff --git a/asset/icon/Icon16/text_underline.png b/asset/icon/Icon16/text_underline.png new file mode 100644 index 0000000..56404a6 Binary files /dev/null and b/asset/icon/Icon16/text_underline.png differ diff --git a/asset/icon/Icon16/text_uppercase.png b/asset/icon/Icon16/text_uppercase.png new file mode 100644 index 0000000..dbe892d Binary files /dev/null and b/asset/icon/Icon16/text_uppercase.png differ diff --git a/asset/icon/Icon16/text_width.png b/asset/icon/Icon16/text_width.png new file mode 100644 index 0000000..fccf6cf Binary files /dev/null and b/asset/icon/Icon16/text_width.png differ diff --git a/asset/icon/Icon16/textfield.png b/asset/icon/Icon16/textfield.png new file mode 100644 index 0000000..a99b710 Binary files /dev/null and b/asset/icon/Icon16/textfield.png differ diff --git a/asset/icon/Icon16/textfield_add.png b/asset/icon/Icon16/textfield_add.png new file mode 100644 index 0000000..fc4d61c Binary files /dev/null and b/asset/icon/Icon16/textfield_add.png differ diff --git a/asset/icon/Icon16/textfield_clear.png b/asset/icon/Icon16/textfield_clear.png new file mode 100644 index 0000000..846234a Binary files /dev/null and b/asset/icon/Icon16/textfield_clear.png differ diff --git a/asset/icon/Icon16/textfield_delete.png b/asset/icon/Icon16/textfield_delete.png new file mode 100644 index 0000000..f00a73e Binary files /dev/null and b/asset/icon/Icon16/textfield_delete.png differ diff --git a/asset/icon/Icon16/textfield_format.png b/asset/icon/Icon16/textfield_format.png new file mode 100644 index 0000000..04a0836 Binary files /dev/null and b/asset/icon/Icon16/textfield_format.png differ diff --git a/asset/icon/Icon16/textfield_hidden.png b/asset/icon/Icon16/textfield_hidden.png new file mode 100644 index 0000000..3727c69 Binary files /dev/null and b/asset/icon/Icon16/textfield_hidden.png differ diff --git a/asset/icon/Icon16/textfield_key.png b/asset/icon/Icon16/textfield_key.png new file mode 100644 index 0000000..6b4e107 Binary files /dev/null and b/asset/icon/Icon16/textfield_key.png differ diff --git a/asset/icon/Icon16/textfield_password.png b/asset/icon/Icon16/textfield_password.png new file mode 100644 index 0000000..4ba50ec Binary files /dev/null and b/asset/icon/Icon16/textfield_password.png differ diff --git a/asset/icon/Icon16/textfield_password_green.png b/asset/icon/Icon16/textfield_password_green.png new file mode 100644 index 0000000..717bf0d Binary files /dev/null and b/asset/icon/Icon16/textfield_password_green.png differ diff --git a/asset/icon/Icon16/textfield_password_red.png b/asset/icon/Icon16/textfield_password_red.png new file mode 100644 index 0000000..a38c232 Binary files /dev/null and b/asset/icon/Icon16/textfield_password_red.png differ diff --git a/asset/icon/Icon16/textfield_password_yellow.png b/asset/icon/Icon16/textfield_password_yellow.png new file mode 100644 index 0000000..6ee9752 Binary files /dev/null and b/asset/icon/Icon16/textfield_password_yellow.png differ diff --git a/asset/icon/Icon16/textfield_rename.png b/asset/icon/Icon16/textfield_rename.png new file mode 100644 index 0000000..d5bf77c Binary files /dev/null and b/asset/icon/Icon16/textfield_rename.png differ diff --git a/asset/icon/Icon16/textfield_suggestion.png b/asset/icon/Icon16/textfield_suggestion.png new file mode 100644 index 0000000..269ccc9 Binary files /dev/null and b/asset/icon/Icon16/textfield_suggestion.png differ diff --git a/asset/icon/Icon16/theater.png b/asset/icon/Icon16/theater.png new file mode 100644 index 0000000..13053e0 Binary files /dev/null and b/asset/icon/Icon16/theater.png differ diff --git a/asset/icon/Icon16/things_beauty.png b/asset/icon/Icon16/things_beauty.png new file mode 100644 index 0000000..416494e Binary files /dev/null and b/asset/icon/Icon16/things_beauty.png differ diff --git a/asset/icon/Icon16/things_digital.png b/asset/icon/Icon16/things_digital.png new file mode 100644 index 0000000..acfd97d Binary files /dev/null and b/asset/icon/Icon16/things_digital.png differ diff --git a/asset/icon/Icon16/three_tags.png b/asset/icon/Icon16/three_tags.png new file mode 100644 index 0000000..46f5a7b Binary files /dev/null and b/asset/icon/Icon16/three_tags.png differ diff --git a/asset/icon/Icon16/thumb_down.png b/asset/icon/Icon16/thumb_down.png new file mode 100644 index 0000000..d4069f1 Binary files /dev/null and b/asset/icon/Icon16/thumb_down.png differ diff --git a/asset/icon/Icon16/thumb_up.png b/asset/icon/Icon16/thumb_up.png new file mode 100644 index 0000000..e0a27d2 Binary files /dev/null and b/asset/icon/Icon16/thumb_up.png differ diff --git a/asset/icon/Icon16/tick.png b/asset/icon/Icon16/tick.png new file mode 100644 index 0000000..c277e6b Binary files /dev/null and b/asset/icon/Icon16/tick.png differ diff --git a/asset/icon/Icon16/tick_button.png b/asset/icon/Icon16/tick_button.png new file mode 100644 index 0000000..cd23027 Binary files /dev/null and b/asset/icon/Icon16/tick_button.png differ diff --git a/asset/icon/Icon16/tick_circle_frame.png b/asset/icon/Icon16/tick_circle_frame.png new file mode 100644 index 0000000..fd69e8f Binary files /dev/null and b/asset/icon/Icon16/tick_circle_frame.png differ diff --git a/asset/icon/Icon16/tick_light_blue.png b/asset/icon/Icon16/tick_light_blue.png new file mode 100644 index 0000000..635230d Binary files /dev/null and b/asset/icon/Icon16/tick_light_blue.png differ diff --git a/asset/icon/Icon16/tick_octagon.png b/asset/icon/Icon16/tick_octagon.png new file mode 100644 index 0000000..b5a570f Binary files /dev/null and b/asset/icon/Icon16/tick_octagon.png differ diff --git a/asset/icon/Icon16/tick_octagon_frame.png b/asset/icon/Icon16/tick_octagon_frame.png new file mode 100644 index 0000000..448913e Binary files /dev/null and b/asset/icon/Icon16/tick_octagon_frame.png differ diff --git a/asset/icon/Icon16/tick_red.png b/asset/icon/Icon16/tick_red.png new file mode 100644 index 0000000..7bf8d63 Binary files /dev/null and b/asset/icon/Icon16/tick_red.png differ diff --git a/asset/icon/Icon16/tick_shield.png b/asset/icon/Icon16/tick_shield.png new file mode 100644 index 0000000..8d517a1 Binary files /dev/null and b/asset/icon/Icon16/tick_shield.png differ diff --git a/asset/icon/Icon16/ticket_stub.png b/asset/icon/Icon16/ticket_stub.png new file mode 100644 index 0000000..c1e2a8d Binary files /dev/null and b/asset/icon/Icon16/ticket_stub.png differ diff --git a/asset/icon/Icon16/tie.png b/asset/icon/Icon16/tie.png new file mode 100644 index 0000000..3fa3895 Binary files /dev/null and b/asset/icon/Icon16/tie.png differ diff --git a/asset/icon/Icon16/tilelist.png b/asset/icon/Icon16/tilelist.png new file mode 100644 index 0000000..4632d07 Binary files /dev/null and b/asset/icon/Icon16/tilelist.png differ diff --git a/asset/icon/Icon16/time.png b/asset/icon/Icon16/time.png new file mode 100644 index 0000000..f69c02d Binary files /dev/null and b/asset/icon/Icon16/time.png differ diff --git a/asset/icon/Icon16/time_add.png b/asset/icon/Icon16/time_add.png new file mode 100644 index 0000000..38ed645 Binary files /dev/null and b/asset/icon/Icon16/time_add.png differ diff --git a/asset/icon/Icon16/time_delete.png b/asset/icon/Icon16/time_delete.png new file mode 100644 index 0000000..50691fe Binary files /dev/null and b/asset/icon/Icon16/time_delete.png differ diff --git a/asset/icon/Icon16/time_go.png b/asset/icon/Icon16/time_go.png new file mode 100644 index 0000000..0bcb3cc Binary files /dev/null and b/asset/icon/Icon16/time_go.png differ diff --git a/asset/icon/Icon16/timeline.png b/asset/icon/Icon16/timeline.png new file mode 100644 index 0000000..7efacde Binary files /dev/null and b/asset/icon/Icon16/timeline.png differ diff --git a/asset/icon/Icon16/timeline_marker.png b/asset/icon/Icon16/timeline_marker.png new file mode 100644 index 0000000..c2b7480 Binary files /dev/null and b/asset/icon/Icon16/timeline_marker.png differ diff --git a/asset/icon/Icon16/tipper.png b/asset/icon/Icon16/tipper.png new file mode 100644 index 0000000..80acfe4 Binary files /dev/null and b/asset/icon/Icon16/tipper.png differ diff --git a/asset/icon/Icon16/tire.png b/asset/icon/Icon16/tire.png new file mode 100644 index 0000000..a158423 Binary files /dev/null and b/asset/icon/Icon16/tire.png differ diff --git a/asset/icon/Icon16/title_window.png b/asset/icon/Icon16/title_window.png new file mode 100644 index 0000000..ef9e1ed Binary files /dev/null and b/asset/icon/Icon16/title_window.png differ diff --git a/asset/icon/Icon16/to_do_bar.png b/asset/icon/Icon16/to_do_bar.png new file mode 100644 index 0000000..515c866 Binary files /dev/null and b/asset/icon/Icon16/to_do_bar.png differ diff --git a/asset/icon/Icon16/to_do_list.png b/asset/icon/Icon16/to_do_list.png new file mode 100644 index 0000000..bdd16cb Binary files /dev/null and b/asset/icon/Icon16/to_do_list.png differ diff --git a/asset/icon/Icon16/to_do_list_cheked_1.png b/asset/icon/Icon16/to_do_list_cheked_1.png new file mode 100644 index 0000000..e4e5270 Binary files /dev/null and b/asset/icon/Icon16/to_do_list_cheked_1.png differ diff --git a/asset/icon/Icon16/to_do_list_cheked_all.png b/asset/icon/Icon16/to_do_list_cheked_all.png new file mode 100644 index 0000000..0b24967 Binary files /dev/null and b/asset/icon/Icon16/to_do_list_cheked_all.png differ diff --git a/asset/icon/Icon16/toggle.png b/asset/icon/Icon16/toggle.png new file mode 100644 index 0000000..c438f9e Binary files /dev/null and b/asset/icon/Icon16/toggle.png differ diff --git a/asset/icon/Icon16/toggle_expand.png b/asset/icon/Icon16/toggle_expand.png new file mode 100644 index 0000000..b85379d Binary files /dev/null and b/asset/icon/Icon16/toggle_expand.png differ diff --git a/asset/icon/Icon16/toilet.png b/asset/icon/Icon16/toilet.png new file mode 100644 index 0000000..6d216e8 Binary files /dev/null and b/asset/icon/Icon16/toilet.png differ diff --git a/asset/icon/Icon16/toilet_pan.png b/asset/icon/Icon16/toilet_pan.png new file mode 100644 index 0000000..7be13d0 Binary files /dev/null and b/asset/icon/Icon16/toilet_pan.png differ diff --git a/asset/icon/Icon16/toolbar.png b/asset/icon/Icon16/toolbar.png new file mode 100644 index 0000000..c8615cb Binary files /dev/null and b/asset/icon/Icon16/toolbar.png differ diff --git a/asset/icon/Icon16/toolbar_add.png b/asset/icon/Icon16/toolbar_add.png new file mode 100644 index 0000000..64b9eaa Binary files /dev/null and b/asset/icon/Icon16/toolbar_add.png differ diff --git a/asset/icon/Icon16/toolbar_bookmark.png b/asset/icon/Icon16/toolbar_bookmark.png new file mode 100644 index 0000000..ce61450 Binary files /dev/null and b/asset/icon/Icon16/toolbar_bookmark.png differ diff --git a/asset/icon/Icon16/toolbar_delete.png b/asset/icon/Icon16/toolbar_delete.png new file mode 100644 index 0000000..8ff9018 Binary files /dev/null and b/asset/icon/Icon16/toolbar_delete.png differ diff --git a/asset/icon/Icon16/toolbar_edit.png b/asset/icon/Icon16/toolbar_edit.png new file mode 100644 index 0000000..8350e85 Binary files /dev/null and b/asset/icon/Icon16/toolbar_edit.png differ diff --git a/asset/icon/Icon16/toolbar_error.png b/asset/icon/Icon16/toolbar_error.png new file mode 100644 index 0000000..2f6ae2c Binary files /dev/null and b/asset/icon/Icon16/toolbar_error.png differ diff --git a/asset/icon/Icon16/toolbar_go.png b/asset/icon/Icon16/toolbar_go.png new file mode 100644 index 0000000..0025cb9 Binary files /dev/null and b/asset/icon/Icon16/toolbar_go.png differ diff --git a/asset/icon/Icon16/toolbox.png b/asset/icon/Icon16/toolbox.png new file mode 100644 index 0000000..ae4d8a9 Binary files /dev/null and b/asset/icon/Icon16/toolbox.png differ diff --git a/asset/icon/Icon16/tooltip.png b/asset/icon/Icon16/tooltip.png new file mode 100644 index 0000000..edb595f Binary files /dev/null and b/asset/icon/Icon16/tooltip.png differ diff --git a/asset/icon/Icon16/tooltip_baloon.png b/asset/icon/Icon16/tooltip_baloon.png new file mode 100644 index 0000000..0c9213c Binary files /dev/null and b/asset/icon/Icon16/tooltip_baloon.png differ diff --git a/asset/icon/Icon16/tooth.png b/asset/icon/Icon16/tooth.png new file mode 100644 index 0000000..ff2766e Binary files /dev/null and b/asset/icon/Icon16/tooth.png differ diff --git a/asset/icon/Icon16/torchere.png b/asset/icon/Icon16/torchere.png new file mode 100644 index 0000000..e966125 Binary files /dev/null and b/asset/icon/Icon16/torchere.png differ diff --git a/asset/icon/Icon16/tornado.png b/asset/icon/Icon16/tornado.png new file mode 100644 index 0000000..41040e1 Binary files /dev/null and b/asset/icon/Icon16/tornado.png differ diff --git a/asset/icon/Icon16/toster.png b/asset/icon/Icon16/toster.png new file mode 100644 index 0000000..bc22841 Binary files /dev/null and b/asset/icon/Icon16/toster.png differ diff --git a/asset/icon/Icon16/total_plan_cost.png b/asset/icon/Icon16/total_plan_cost.png new file mode 100644 index 0000000..3da1812 Binary files /dev/null and b/asset/icon/Icon16/total_plan_cost.png differ diff --git a/asset/icon/Icon16/toucan.png b/asset/icon/Icon16/toucan.png new file mode 100644 index 0000000..1d97063 Binary files /dev/null and b/asset/icon/Icon16/toucan.png differ diff --git a/asset/icon/Icon16/tower.png b/asset/icon/Icon16/tower.png new file mode 100644 index 0000000..3c1bc75 Binary files /dev/null and b/asset/icon/Icon16/tower.png differ diff --git a/asset/icon/Icon16/toxic.png b/asset/icon/Icon16/toxic.png new file mode 100644 index 0000000..81134af Binary files /dev/null and b/asset/icon/Icon16/toxic.png differ diff --git a/asset/icon/Icon16/trace_dependents.png b/asset/icon/Icon16/trace_dependents.png new file mode 100644 index 0000000..8b585f4 Binary files /dev/null and b/asset/icon/Icon16/trace_dependents.png differ diff --git a/asset/icon/Icon16/trace_precendents.png b/asset/icon/Icon16/trace_precendents.png new file mode 100644 index 0000000..a67797c Binary files /dev/null and b/asset/icon/Icon16/trace_precendents.png differ diff --git a/asset/icon/Icon16/track_changes.png b/asset/icon/Icon16/track_changes.png new file mode 100644 index 0000000..b1b40c4 Binary files /dev/null and b/asset/icon/Icon16/track_changes.png differ diff --git a/asset/icon/Icon16/tractor.png b/asset/icon/Icon16/tractor.png new file mode 100644 index 0000000..e6de396 Binary files /dev/null and b/asset/icon/Icon16/tractor.png differ diff --git a/asset/icon/Icon16/trade.png b/asset/icon/Icon16/trade.png new file mode 100644 index 0000000..022ff79 Binary files /dev/null and b/asset/icon/Icon16/trade.png differ diff --git a/asset/icon/Icon16/traffic_lights.png b/asset/icon/Icon16/traffic_lights.png new file mode 100644 index 0000000..8a56acd Binary files /dev/null and b/asset/icon/Icon16/traffic_lights.png differ diff --git a/asset/icon/Icon16/traffic_lights_green.png b/asset/icon/Icon16/traffic_lights_green.png new file mode 100644 index 0000000..bd8d864 Binary files /dev/null and b/asset/icon/Icon16/traffic_lights_green.png differ diff --git a/asset/icon/Icon16/traffic_lights_red.png b/asset/icon/Icon16/traffic_lights_red.png new file mode 100644 index 0000000..6078514 Binary files /dev/null and b/asset/icon/Icon16/traffic_lights_red.png differ diff --git a/asset/icon/Icon16/traffic_lights_yellow.png b/asset/icon/Icon16/traffic_lights_yellow.png new file mode 100644 index 0000000..cc741d8 Binary files /dev/null and b/asset/icon/Icon16/traffic_lights_yellow.png differ diff --git a/asset/icon/Icon16/traffic_usage.png b/asset/icon/Icon16/traffic_usage.png new file mode 100644 index 0000000..51df064 Binary files /dev/null and b/asset/icon/Icon16/traffic_usage.png differ diff --git a/asset/icon/Icon16/train.png b/asset/icon/Icon16/train.png new file mode 100644 index 0000000..fb67275 Binary files /dev/null and b/asset/icon/Icon16/train.png differ diff --git a/asset/icon/Icon16/train_metro.png b/asset/icon/Icon16/train_metro.png new file mode 100644 index 0000000..a839737 Binary files /dev/null and b/asset/icon/Icon16/train_metro.png differ diff --git a/asset/icon/Icon16/transform_crop.png b/asset/icon/Icon16/transform_crop.png new file mode 100644 index 0000000..746b1b4 Binary files /dev/null and b/asset/icon/Icon16/transform_crop.png differ diff --git a/asset/icon/Icon16/transform_crop_resize.png b/asset/icon/Icon16/transform_crop_resize.png new file mode 100644 index 0000000..4d9b50a Binary files /dev/null and b/asset/icon/Icon16/transform_crop_resize.png differ diff --git a/asset/icon/Icon16/transform_flip.png b/asset/icon/Icon16/transform_flip.png new file mode 100644 index 0000000..8a3bf68 Binary files /dev/null and b/asset/icon/Icon16/transform_flip.png differ diff --git a/asset/icon/Icon16/transform_layer.png b/asset/icon/Icon16/transform_layer.png new file mode 100644 index 0000000..424dbe2 Binary files /dev/null and b/asset/icon/Icon16/transform_layer.png differ diff --git a/asset/icon/Icon16/transform_move.png b/asset/icon/Icon16/transform_move.png new file mode 100644 index 0000000..6e13dd3 Binary files /dev/null and b/asset/icon/Icon16/transform_move.png differ diff --git a/asset/icon/Icon16/transform_path.png b/asset/icon/Icon16/transform_path.png new file mode 100644 index 0000000..f1d1916 Binary files /dev/null and b/asset/icon/Icon16/transform_path.png differ diff --git a/asset/icon/Icon16/transform_perspective.png b/asset/icon/Icon16/transform_perspective.png new file mode 100644 index 0000000..276f506 Binary files /dev/null and b/asset/icon/Icon16/transform_perspective.png differ diff --git a/asset/icon/Icon16/transform_rotate.png b/asset/icon/Icon16/transform_rotate.png new file mode 100644 index 0000000..9a470f7 Binary files /dev/null and b/asset/icon/Icon16/transform_rotate.png differ diff --git a/asset/icon/Icon16/transform_rotate_180.png b/asset/icon/Icon16/transform_rotate_180.png new file mode 100644 index 0000000..6ee4b81 Binary files /dev/null and b/asset/icon/Icon16/transform_rotate_180.png differ diff --git a/asset/icon/Icon16/transform_rotate_270.png b/asset/icon/Icon16/transform_rotate_270.png new file mode 100644 index 0000000..17ecc3b Binary files /dev/null and b/asset/icon/Icon16/transform_rotate_270.png differ diff --git a/asset/icon/Icon16/transform_rotate_90.png b/asset/icon/Icon16/transform_rotate_90.png new file mode 100644 index 0000000..9e2e331 Binary files /dev/null and b/asset/icon/Icon16/transform_rotate_90.png differ diff --git a/asset/icon/Icon16/transform_scale.png b/asset/icon/Icon16/transform_scale.png new file mode 100644 index 0000000..cc12f14 Binary files /dev/null and b/asset/icon/Icon16/transform_scale.png differ diff --git a/asset/icon/Icon16/transform_selection.png b/asset/icon/Icon16/transform_selection.png new file mode 100644 index 0000000..a87418c Binary files /dev/null and b/asset/icon/Icon16/transform_selection.png differ diff --git a/asset/icon/Icon16/transform_shear.png b/asset/icon/Icon16/transform_shear.png new file mode 100644 index 0000000..c7ee7e2 Binary files /dev/null and b/asset/icon/Icon16/transform_shear.png differ diff --git a/asset/icon/Icon16/transmit.png b/asset/icon/Icon16/transmit.png new file mode 100644 index 0000000..ae4cbdd Binary files /dev/null and b/asset/icon/Icon16/transmit.png differ diff --git a/asset/icon/Icon16/transmit_add.png b/asset/icon/Icon16/transmit_add.png new file mode 100644 index 0000000..b79d593 Binary files /dev/null and b/asset/icon/Icon16/transmit_add.png differ diff --git a/asset/icon/Icon16/transmit_blue.png b/asset/icon/Icon16/transmit_blue.png new file mode 100644 index 0000000..4191f42 Binary files /dev/null and b/asset/icon/Icon16/transmit_blue.png differ diff --git a/asset/icon/Icon16/transmit_delete.png b/asset/icon/Icon16/transmit_delete.png new file mode 100644 index 0000000..a9d0fac Binary files /dev/null and b/asset/icon/Icon16/transmit_delete.png differ diff --git a/asset/icon/Icon16/transmit_edit.png b/asset/icon/Icon16/transmit_edit.png new file mode 100644 index 0000000..60c5b7c Binary files /dev/null and b/asset/icon/Icon16/transmit_edit.png differ diff --git a/asset/icon/Icon16/transmit_error.png b/asset/icon/Icon16/transmit_error.png new file mode 100644 index 0000000..0dbc46d Binary files /dev/null and b/asset/icon/Icon16/transmit_error.png differ diff --git a/asset/icon/Icon16/transmit_go.png b/asset/icon/Icon16/transmit_go.png new file mode 100644 index 0000000..0330070 Binary files /dev/null and b/asset/icon/Icon16/transmit_go.png differ diff --git a/asset/icon/Icon16/travel.png b/asset/icon/Icon16/travel.png new file mode 100644 index 0000000..b002dc2 Binary files /dev/null and b/asset/icon/Icon16/travel.png differ diff --git a/asset/icon/Icon16/tree(2).png b/asset/icon/Icon16/tree(2).png new file mode 100644 index 0000000..70264e0 Binary files /dev/null and b/asset/icon/Icon16/tree(2).png differ diff --git a/asset/icon/Icon16/tree.png b/asset/icon/Icon16/tree.png new file mode 100644 index 0000000..7d5675e Binary files /dev/null and b/asset/icon/Icon16/tree.png differ diff --git a/asset/icon/Icon16/tree_bare.png b/asset/icon/Icon16/tree_bare.png new file mode 100644 index 0000000..45f39c8 Binary files /dev/null and b/asset/icon/Icon16/tree_bare.png differ diff --git a/asset/icon/Icon16/tree_red.png b/asset/icon/Icon16/tree_red.png new file mode 100644 index 0000000..1aae23c Binary files /dev/null and b/asset/icon/Icon16/tree_red.png differ diff --git a/asset/icon/Icon16/tree_white.png b/asset/icon/Icon16/tree_white.png new file mode 100644 index 0000000..997bc06 Binary files /dev/null and b/asset/icon/Icon16/tree_white.png differ diff --git a/asset/icon/Icon16/tree_yellow.png b/asset/icon/Icon16/tree_yellow.png new file mode 100644 index 0000000..c1fece4 Binary files /dev/null and b/asset/icon/Icon16/tree_yellow.png differ diff --git a/asset/icon/Icon16/trojan_horse.png b/asset/icon/Icon16/trojan_horse.png new file mode 100644 index 0000000..7ce14ac Binary files /dev/null and b/asset/icon/Icon16/trojan_horse.png differ diff --git a/asset/icon/Icon16/trolley.png b/asset/icon/Icon16/trolley.png new file mode 100644 index 0000000..559abce Binary files /dev/null and b/asset/icon/Icon16/trolley.png differ diff --git a/asset/icon/Icon16/tub.png b/asset/icon/Icon16/tub.png new file mode 100644 index 0000000..f2ef31a Binary files /dev/null and b/asset/icon/Icon16/tub.png differ diff --git a/asset/icon/Icon16/tubes.png b/asset/icon/Icon16/tubes.png new file mode 100644 index 0000000..85c7ae3 Binary files /dev/null and b/asset/icon/Icon16/tubes.png differ diff --git a/asset/icon/Icon16/tumblr.png b/asset/icon/Icon16/tumblr.png new file mode 100644 index 0000000..0a33313 Binary files /dev/null and b/asset/icon/Icon16/tumblr.png differ diff --git a/asset/icon/Icon16/turntable.png b/asset/icon/Icon16/turntable.png new file mode 100644 index 0000000..0c42bad Binary files /dev/null and b/asset/icon/Icon16/turntable.png differ diff --git a/asset/icon/Icon16/tux.png b/asset/icon/Icon16/tux.png new file mode 100644 index 0000000..f99c0fd Binary files /dev/null and b/asset/icon/Icon16/tux.png differ diff --git a/asset/icon/Icon16/twitter_1.png b/asset/icon/Icon16/twitter_1.png new file mode 100644 index 0000000..b6032a0 Binary files /dev/null and b/asset/icon/Icon16/twitter_1.png differ diff --git a/asset/icon/Icon16/twitter_2.png b/asset/icon/Icon16/twitter_2.png new file mode 100644 index 0000000..583e83d Binary files /dev/null and b/asset/icon/Icon16/twitter_2.png differ diff --git a/asset/icon/Icon16/ubuntu.png b/asset/icon/Icon16/ubuntu.png new file mode 100644 index 0000000..7210938 Binary files /dev/null and b/asset/icon/Icon16/ubuntu.png differ diff --git a/asset/icon/Icon16/ufo.png b/asset/icon/Icon16/ufo.png new file mode 100644 index 0000000..61088ee Binary files /dev/null and b/asset/icon/Icon16/ufo.png differ diff --git a/asset/icon/Icon16/umbrella.png b/asset/icon/Icon16/umbrella.png new file mode 100644 index 0000000..086fd35 Binary files /dev/null and b/asset/icon/Icon16/umbrella.png differ diff --git a/asset/icon/Icon16/umbrella_folded.png b/asset/icon/Icon16/umbrella_folded.png new file mode 100644 index 0000000..64efbed Binary files /dev/null and b/asset/icon/Icon16/umbrella_folded.png differ diff --git a/asset/icon/Icon16/underle_dictionary.png b/asset/icon/Icon16/underle_dictionary.png new file mode 100644 index 0000000..701c67a Binary files /dev/null and b/asset/icon/Icon16/underle_dictionary.png differ diff --git a/asset/icon/Icon16/understanding.png b/asset/icon/Icon16/understanding.png new file mode 100644 index 0000000..a6df1aa Binary files /dev/null and b/asset/icon/Icon16/understanding.png differ diff --git a/asset/icon/Icon16/undo.png b/asset/icon/Icon16/undo.png new file mode 100644 index 0000000..0c196ec Binary files /dev/null and b/asset/icon/Icon16/undo.png differ diff --git a/asset/icon/Icon16/ungroup_stroke.png b/asset/icon/Icon16/ungroup_stroke.png new file mode 100644 index 0000000..2f176ac Binary files /dev/null and b/asset/icon/Icon16/ungroup_stroke.png differ diff --git a/asset/icon/Icon16/unicorn.png b/asset/icon/Icon16/unicorn.png new file mode 100644 index 0000000..2626787 Binary files /dev/null and b/asset/icon/Icon16/unicorn.png differ diff --git a/asset/icon/Icon16/uninstall_frontpage_extensions.png b/asset/icon/Icon16/uninstall_frontpage_extensions.png new file mode 100644 index 0000000..c3aa6ed Binary files /dev/null and b/asset/icon/Icon16/uninstall_frontpage_extensions.png differ diff --git a/asset/icon/Icon16/universal_binary.png b/asset/icon/Icon16/universal_binary.png new file mode 100644 index 0000000..81ee125 Binary files /dev/null and b/asset/icon/Icon16/universal_binary.png differ diff --git a/asset/icon/Icon16/unmark_to_download.png b/asset/icon/Icon16/unmark_to_download.png new file mode 100644 index 0000000..5d37b1a Binary files /dev/null and b/asset/icon/Icon16/unmark_to_download.png differ diff --git a/asset/icon/Icon16/update.png b/asset/icon/Icon16/update.png new file mode 100644 index 0000000..b7639f1 Binary files /dev/null and b/asset/icon/Icon16/update.png differ diff --git a/asset/icon/Icon16/update_contact_info.png b/asset/icon/Icon16/update_contact_info.png new file mode 100644 index 0000000..6391555 Binary files /dev/null and b/asset/icon/Icon16/update_contact_info.png differ diff --git a/asset/icon/Icon16/upgrade_downgrade_account.png b/asset/icon/Icon16/upgrade_downgrade_account.png new file mode 100644 index 0000000..fed7c41 Binary files /dev/null and b/asset/icon/Icon16/upgrade_downgrade_account.png differ diff --git a/asset/icon/Icon16/upload_for_cloud.png b/asset/icon/Icon16/upload_for_cloud.png new file mode 100644 index 0000000..51cec72 Binary files /dev/null and b/asset/icon/Icon16/upload_for_cloud.png differ diff --git a/asset/icon/Icon16/upload_for_linux.png b/asset/icon/Icon16/upload_for_linux.png new file mode 100644 index 0000000..27bd262 Binary files /dev/null and b/asset/icon/Icon16/upload_for_linux.png differ diff --git a/asset/icon/Icon16/upload_for_mac.png b/asset/icon/Icon16/upload_for_mac.png new file mode 100644 index 0000000..e06bcea Binary files /dev/null and b/asset/icon/Icon16/upload_for_mac.png differ diff --git a/asset/icon/Icon16/upload_for_windows.png b/asset/icon/Icon16/upload_for_windows.png new file mode 100644 index 0000000..45c44dd Binary files /dev/null and b/asset/icon/Icon16/upload_for_windows.png differ diff --git a/asset/icon/Icon16/usb_3.png b/asset/icon/Icon16/usb_3.png new file mode 100644 index 0000000..1f9c944 Binary files /dev/null and b/asset/icon/Icon16/usb_3.png differ diff --git a/asset/icon/Icon16/use_in_formula.png b/asset/icon/Icon16/use_in_formula.png new file mode 100644 index 0000000..03a2cc9 Binary files /dev/null and b/asset/icon/Icon16/use_in_formula.png differ diff --git a/asset/icon/Icon16/user.png b/asset/icon/Icon16/user.png new file mode 100644 index 0000000..4166dbf Binary files /dev/null and b/asset/icon/Icon16/user.png differ diff --git a/asset/icon/Icon16/user_add.png b/asset/icon/Icon16/user_add.png new file mode 100644 index 0000000..2520e3f Binary files /dev/null and b/asset/icon/Icon16/user_add.png differ diff --git a/asset/icon/Icon16/user_alien.png b/asset/icon/Icon16/user_alien.png new file mode 100644 index 0000000..955bbec Binary files /dev/null and b/asset/icon/Icon16/user_alien.png differ diff --git a/asset/icon/Icon16/user_angel.png b/asset/icon/Icon16/user_angel.png new file mode 100644 index 0000000..9a105cc Binary files /dev/null and b/asset/icon/Icon16/user_angel.png differ diff --git a/asset/icon/Icon16/user_angel_black.png b/asset/icon/Icon16/user_angel_black.png new file mode 100644 index 0000000..28bc2c1 Binary files /dev/null and b/asset/icon/Icon16/user_angel_black.png differ diff --git a/asset/icon/Icon16/user_angel_female.png b/asset/icon/Icon16/user_angel_female.png new file mode 100644 index 0000000..cf1fc10 Binary files /dev/null and b/asset/icon/Icon16/user_angel_female.png differ diff --git a/asset/icon/Icon16/user_angel_female_black.png b/asset/icon/Icon16/user_angel_female_black.png new file mode 100644 index 0000000..496bd9c Binary files /dev/null and b/asset/icon/Icon16/user_angel_female_black.png differ diff --git a/asset/icon/Icon16/user_astronaut.png b/asset/icon/Icon16/user_astronaut.png new file mode 100644 index 0000000..cd1f568 Binary files /dev/null and b/asset/icon/Icon16/user_astronaut.png differ diff --git a/asset/icon/Icon16/user_ballplayer.png b/asset/icon/Icon16/user_ballplayer.png new file mode 100644 index 0000000..35da778 Binary files /dev/null and b/asset/icon/Icon16/user_ballplayer.png differ diff --git a/asset/icon/Icon16/user_ballplayer_black.png b/asset/icon/Icon16/user_ballplayer_black.png new file mode 100644 index 0000000..bb00d6c Binary files /dev/null and b/asset/icon/Icon16/user_ballplayer_black.png differ diff --git a/asset/icon/Icon16/user_banker.png b/asset/icon/Icon16/user_banker.png new file mode 100644 index 0000000..bad3739 Binary files /dev/null and b/asset/icon/Icon16/user_banker.png differ diff --git a/asset/icon/Icon16/user_bart.png b/asset/icon/Icon16/user_bart.png new file mode 100644 index 0000000..90609e8 Binary files /dev/null and b/asset/icon/Icon16/user_bart.png differ diff --git a/asset/icon/Icon16/user_batman.png b/asset/icon/Icon16/user_batman.png new file mode 100644 index 0000000..635947b Binary files /dev/null and b/asset/icon/Icon16/user_batman.png differ diff --git a/asset/icon/Icon16/user_beach_lifeguard.png b/asset/icon/Icon16/user_beach_lifeguard.png new file mode 100644 index 0000000..eaff6d9 Binary files /dev/null and b/asset/icon/Icon16/user_beach_lifeguard.png differ diff --git a/asset/icon/Icon16/user_beach_lifeguard_female.png b/asset/icon/Icon16/user_beach_lifeguard_female.png new file mode 100644 index 0000000..b090e84 Binary files /dev/null and b/asset/icon/Icon16/user_beach_lifeguard_female.png differ diff --git a/asset/icon/Icon16/user_bender.png b/asset/icon/Icon16/user_bender.png new file mode 100644 index 0000000..7fedbcb Binary files /dev/null and b/asset/icon/Icon16/user_bender.png differ diff --git a/asset/icon/Icon16/user_bishop.png b/asset/icon/Icon16/user_bishop.png new file mode 100644 index 0000000..70afde5 Binary files /dev/null and b/asset/icon/Icon16/user_bishop.png differ diff --git a/asset/icon/Icon16/user_blondy.png b/asset/icon/Icon16/user_blondy.png new file mode 100644 index 0000000..3fbd6ba Binary files /dev/null and b/asset/icon/Icon16/user_blondy.png differ diff --git a/asset/icon/Icon16/user_boxer.png b/asset/icon/Icon16/user_boxer.png new file mode 100644 index 0000000..4fac650 Binary files /dev/null and b/asset/icon/Icon16/user_boxer.png differ diff --git a/asset/icon/Icon16/user_boxer_black.png b/asset/icon/Icon16/user_boxer_black.png new file mode 100644 index 0000000..a94ace0 Binary files /dev/null and b/asset/icon/Icon16/user_boxer_black.png differ diff --git a/asset/icon/Icon16/user_buddhist.png b/asset/icon/Icon16/user_buddhist.png new file mode 100644 index 0000000..2b28625 Binary files /dev/null and b/asset/icon/Icon16/user_buddhist.png differ diff --git a/asset/icon/Icon16/user_c3po.png b/asset/icon/Icon16/user_c3po.png new file mode 100644 index 0000000..45a9c0f Binary files /dev/null and b/asset/icon/Icon16/user_c3po.png differ diff --git a/asset/icon/Icon16/user_catwomen.png b/asset/icon/Icon16/user_catwomen.png new file mode 100644 index 0000000..ad949d0 Binary files /dev/null and b/asset/icon/Icon16/user_catwomen.png differ diff --git a/asset/icon/Icon16/user_chief.png b/asset/icon/Icon16/user_chief.png new file mode 100644 index 0000000..f4b3eab Binary files /dev/null and b/asset/icon/Icon16/user_chief.png differ diff --git a/asset/icon/Icon16/user_chief_black.png b/asset/icon/Icon16/user_chief_black.png new file mode 100644 index 0000000..7ea668c Binary files /dev/null and b/asset/icon/Icon16/user_chief_black.png differ diff --git a/asset/icon/Icon16/user_chief_female.png b/asset/icon/Icon16/user_chief_female.png new file mode 100644 index 0000000..73b2285 Binary files /dev/null and b/asset/icon/Icon16/user_chief_female.png differ diff --git a/asset/icon/Icon16/user_chief_female_black.png b/asset/icon/Icon16/user_chief_female_black.png new file mode 100644 index 0000000..88064e9 Binary files /dev/null and b/asset/icon/Icon16/user_chief_female_black.png differ diff --git a/asset/icon/Icon16/user_clown.png b/asset/icon/Icon16/user_clown.png new file mode 100644 index 0000000..85ab459 Binary files /dev/null and b/asset/icon/Icon16/user_clown.png differ diff --git a/asset/icon/Icon16/user_comment.png b/asset/icon/Icon16/user_comment.png new file mode 100644 index 0000000..898b759 Binary files /dev/null and b/asset/icon/Icon16/user_comment.png differ diff --git a/asset/icon/Icon16/user_cook.png b/asset/icon/Icon16/user_cook.png new file mode 100644 index 0000000..35a4e45 Binary files /dev/null and b/asset/icon/Icon16/user_cook.png differ diff --git a/asset/icon/Icon16/user_cook_black.png b/asset/icon/Icon16/user_cook_black.png new file mode 100644 index 0000000..d806ed6 Binary files /dev/null and b/asset/icon/Icon16/user_cook_black.png differ diff --git a/asset/icon/Icon16/user_cook_female.png b/asset/icon/Icon16/user_cook_female.png new file mode 100644 index 0000000..f5aee9b Binary files /dev/null and b/asset/icon/Icon16/user_cook_female.png differ diff --git a/asset/icon/Icon16/user_cook_female_black.png b/asset/icon/Icon16/user_cook_female_black.png new file mode 100644 index 0000000..54ec6a4 Binary files /dev/null and b/asset/icon/Icon16/user_cook_female_black.png differ diff --git a/asset/icon/Icon16/user_cowboy.png b/asset/icon/Icon16/user_cowboy.png new file mode 100644 index 0000000..43402d8 Binary files /dev/null and b/asset/icon/Icon16/user_cowboy.png differ diff --git a/asset/icon/Icon16/user_cowboy_female.png b/asset/icon/Icon16/user_cowboy_female.png new file mode 100644 index 0000000..5550239 Binary files /dev/null and b/asset/icon/Icon16/user_cowboy_female.png differ diff --git a/asset/icon/Icon16/user_crabs.png b/asset/icon/Icon16/user_crabs.png new file mode 100644 index 0000000..bb9508a Binary files /dev/null and b/asset/icon/Icon16/user_crabs.png differ diff --git a/asset/icon/Icon16/user_darth_vader.png b/asset/icon/Icon16/user_darth_vader.png new file mode 100644 index 0000000..ed963dd Binary files /dev/null and b/asset/icon/Icon16/user_darth_vader.png differ diff --git a/asset/icon/Icon16/user_death.png b/asset/icon/Icon16/user_death.png new file mode 100644 index 0000000..bc44526 Binary files /dev/null and b/asset/icon/Icon16/user_death.png differ diff --git a/asset/icon/Icon16/user_delete.png b/asset/icon/Icon16/user_delete.png new file mode 100644 index 0000000..4e497e8 Binary files /dev/null and b/asset/icon/Icon16/user_delete.png differ diff --git a/asset/icon/Icon16/user_detective.png b/asset/icon/Icon16/user_detective.png new file mode 100644 index 0000000..9c766a1 Binary files /dev/null and b/asset/icon/Icon16/user_detective.png differ diff --git a/asset/icon/Icon16/user_detective_gray.png b/asset/icon/Icon16/user_detective_gray.png new file mode 100644 index 0000000..b5f928d Binary files /dev/null and b/asset/icon/Icon16/user_detective_gray.png differ diff --git a/asset/icon/Icon16/user_devil.png b/asset/icon/Icon16/user_devil.png new file mode 100644 index 0000000..a88b337 Binary files /dev/null and b/asset/icon/Icon16/user_devil.png differ diff --git a/asset/icon/Icon16/user_diver.png b/asset/icon/Icon16/user_diver.png new file mode 100644 index 0000000..3d25242 Binary files /dev/null and b/asset/icon/Icon16/user_diver.png differ diff --git a/asset/icon/Icon16/user_dracula.png b/asset/icon/Icon16/user_dracula.png new file mode 100644 index 0000000..a5dc665 Binary files /dev/null and b/asset/icon/Icon16/user_dracula.png differ diff --git a/asset/icon/Icon16/user_edit.png b/asset/icon/Icon16/user_edit.png new file mode 100644 index 0000000..22f9a4b Binary files /dev/null and b/asset/icon/Icon16/user_edit.png differ diff --git a/asset/icon/Icon16/user_egyptian.png b/asset/icon/Icon16/user_egyptian.png new file mode 100644 index 0000000..26e4c8f Binary files /dev/null and b/asset/icon/Icon16/user_egyptian.png differ diff --git a/asset/icon/Icon16/user_egyptian_female.png b/asset/icon/Icon16/user_egyptian_female.png new file mode 100644 index 0000000..dd29018 Binary files /dev/null and b/asset/icon/Icon16/user_egyptian_female.png differ diff --git a/asset/icon/Icon16/user_emo.png b/asset/icon/Icon16/user_emo.png new file mode 100644 index 0000000..8661140 Binary files /dev/null and b/asset/icon/Icon16/user_emo.png differ diff --git a/asset/icon/Icon16/user_eskimo.png b/asset/icon/Icon16/user_eskimo.png new file mode 100644 index 0000000..ce3021a Binary files /dev/null and b/asset/icon/Icon16/user_eskimo.png differ diff --git a/asset/icon/Icon16/user_eskimo_female.png b/asset/icon/Icon16/user_eskimo_female.png new file mode 100644 index 0000000..4207987 Binary files /dev/null and b/asset/icon/Icon16/user_eskimo_female.png differ diff --git a/asset/icon/Icon16/user_female.png b/asset/icon/Icon16/user_female.png new file mode 100644 index 0000000..f484110 Binary files /dev/null and b/asset/icon/Icon16/user_female.png differ diff --git a/asset/icon/Icon16/user_firefighter.png b/asset/icon/Icon16/user_firefighter.png new file mode 100644 index 0000000..c43ffd6 Binary files /dev/null and b/asset/icon/Icon16/user_firefighter.png differ diff --git a/asset/icon/Icon16/user_firefighter_black.png b/asset/icon/Icon16/user_firefighter_black.png new file mode 100644 index 0000000..2e540f3 Binary files /dev/null and b/asset/icon/Icon16/user_firefighter_black.png differ diff --git a/asset/icon/Icon16/user_freddy.png b/asset/icon/Icon16/user_freddy.png new file mode 100644 index 0000000..56f217b Binary files /dev/null and b/asset/icon/Icon16/user_freddy.png differ diff --git a/asset/icon/Icon16/user_geisha.png b/asset/icon/Icon16/user_geisha.png new file mode 100644 index 0000000..1d7c9e2 Binary files /dev/null and b/asset/icon/Icon16/user_geisha.png differ diff --git a/asset/icon/Icon16/user_gladiator.png b/asset/icon/Icon16/user_gladiator.png new file mode 100644 index 0000000..74a8b7e Binary files /dev/null and b/asset/icon/Icon16/user_gladiator.png differ diff --git a/asset/icon/Icon16/user_go.png b/asset/icon/Icon16/user_go.png new file mode 100644 index 0000000..e7e6f8b Binary files /dev/null and b/asset/icon/Icon16/user_go.png differ diff --git a/asset/icon/Icon16/user_gomer.png b/asset/icon/Icon16/user_gomer.png new file mode 100644 index 0000000..1334238 Binary files /dev/null and b/asset/icon/Icon16/user_gomer.png differ diff --git a/asset/icon/Icon16/user_goth.png b/asset/icon/Icon16/user_goth.png new file mode 100644 index 0000000..2d400c9 Binary files /dev/null and b/asset/icon/Icon16/user_goth.png differ diff --git a/asset/icon/Icon16/user_gray.png b/asset/icon/Icon16/user_gray.png new file mode 100644 index 0000000..ed9512c Binary files /dev/null and b/asset/icon/Icon16/user_gray.png differ diff --git a/asset/icon/Icon16/user_green.png b/asset/icon/Icon16/user_green.png new file mode 100644 index 0000000..6d89c47 Binary files /dev/null and b/asset/icon/Icon16/user_green.png differ diff --git a/asset/icon/Icon16/user_halk.png b/asset/icon/Icon16/user_halk.png new file mode 100644 index 0000000..447f949 Binary files /dev/null and b/asset/icon/Icon16/user_halk.png differ diff --git a/asset/icon/Icon16/user_hendrix.png b/asset/icon/Icon16/user_hendrix.png new file mode 100644 index 0000000..1d5b35c Binary files /dev/null and b/asset/icon/Icon16/user_hendrix.png differ diff --git a/asset/icon/Icon16/user_imprisoned.png b/asset/icon/Icon16/user_imprisoned.png new file mode 100644 index 0000000..1000e57 Binary files /dev/null and b/asset/icon/Icon16/user_imprisoned.png differ diff --git a/asset/icon/Icon16/user_imprisoned_black.png b/asset/icon/Icon16/user_imprisoned_black.png new file mode 100644 index 0000000..fead81f Binary files /dev/null and b/asset/icon/Icon16/user_imprisoned_black.png differ diff --git a/asset/icon/Icon16/user_imprisoned_female.png b/asset/icon/Icon16/user_imprisoned_female.png new file mode 100644 index 0000000..c88969e Binary files /dev/null and b/asset/icon/Icon16/user_imprisoned_female.png differ diff --git a/asset/icon/Icon16/user_imprisoned_female_black.png b/asset/icon/Icon16/user_imprisoned_female_black.png new file mode 100644 index 0000000..eb5fbcc Binary files /dev/null and b/asset/icon/Icon16/user_imprisoned_female_black.png differ diff --git a/asset/icon/Icon16/user_indian.png b/asset/icon/Icon16/user_indian.png new file mode 100644 index 0000000..787117b Binary files /dev/null and b/asset/icon/Icon16/user_indian.png differ diff --git a/asset/icon/Icon16/user_indian_female.png b/asset/icon/Icon16/user_indian_female.png new file mode 100644 index 0000000..2b257cf Binary files /dev/null and b/asset/icon/Icon16/user_indian_female.png differ diff --git a/asset/icon/Icon16/user_ironman.png b/asset/icon/Icon16/user_ironman.png new file mode 100644 index 0000000..e429fc0 Binary files /dev/null and b/asset/icon/Icon16/user_ironman.png differ diff --git a/asset/icon/Icon16/user_jason.png b/asset/icon/Icon16/user_jason.png new file mode 100644 index 0000000..01e916d Binary files /dev/null and b/asset/icon/Icon16/user_jason.png differ diff --git a/asset/icon/Icon16/user_jawa.png b/asset/icon/Icon16/user_jawa.png new file mode 100644 index 0000000..3990a72 Binary files /dev/null and b/asset/icon/Icon16/user_jawa.png differ diff --git a/asset/icon/Icon16/user_jester.png b/asset/icon/Icon16/user_jester.png new file mode 100644 index 0000000..2ff9c44 Binary files /dev/null and b/asset/icon/Icon16/user_jester.png differ diff --git a/asset/icon/Icon16/user_jew.png b/asset/icon/Icon16/user_jew.png new file mode 100644 index 0000000..6aa5523 Binary files /dev/null and b/asset/icon/Icon16/user_jew.png differ diff --git a/asset/icon/Icon16/user_judge.png b/asset/icon/Icon16/user_judge.png new file mode 100644 index 0000000..16f6437 Binary files /dev/null and b/asset/icon/Icon16/user_judge.png differ diff --git a/asset/icon/Icon16/user_judge_black.png b/asset/icon/Icon16/user_judge_black.png new file mode 100644 index 0000000..459e36e Binary files /dev/null and b/asset/icon/Icon16/user_judge_black.png differ diff --git a/asset/icon/Icon16/user_king.png b/asset/icon/Icon16/user_king.png new file mode 100644 index 0000000..109b8db Binary files /dev/null and b/asset/icon/Icon16/user_king.png differ diff --git a/asset/icon/Icon16/user_king_black.png b/asset/icon/Icon16/user_king_black.png new file mode 100644 index 0000000..37faa53 Binary files /dev/null and b/asset/icon/Icon16/user_king_black.png differ diff --git a/asset/icon/Icon16/user_knight.png b/asset/icon/Icon16/user_knight.png new file mode 100644 index 0000000..8f8af67 Binary files /dev/null and b/asset/icon/Icon16/user_knight.png differ diff --git a/asset/icon/Icon16/user_leprechaun.png b/asset/icon/Icon16/user_leprechaun.png new file mode 100644 index 0000000..877720c Binary files /dev/null and b/asset/icon/Icon16/user_leprechaun.png differ diff --git a/asset/icon/Icon16/user_level_filtering.png b/asset/icon/Icon16/user_level_filtering.png new file mode 100644 index 0000000..3ec1976 Binary files /dev/null and b/asset/icon/Icon16/user_level_filtering.png differ diff --git a/asset/icon/Icon16/user_lisa.png b/asset/icon/Icon16/user_lisa.png new file mode 100644 index 0000000..9a3d612 Binary files /dev/null and b/asset/icon/Icon16/user_lisa.png differ diff --git a/asset/icon/Icon16/user_maid.png b/asset/icon/Icon16/user_maid.png new file mode 100644 index 0000000..19b8cdc Binary files /dev/null and b/asset/icon/Icon16/user_maid.png differ diff --git a/asset/icon/Icon16/user_medical.png b/asset/icon/Icon16/user_medical.png new file mode 100644 index 0000000..700e67f Binary files /dev/null and b/asset/icon/Icon16/user_medical.png differ diff --git a/asset/icon/Icon16/user_medical_black.png b/asset/icon/Icon16/user_medical_black.png new file mode 100644 index 0000000..2dc3d5c Binary files /dev/null and b/asset/icon/Icon16/user_medical_black.png differ diff --git a/asset/icon/Icon16/user_medical_female.png b/asset/icon/Icon16/user_medical_female.png new file mode 100644 index 0000000..20aadcd Binary files /dev/null and b/asset/icon/Icon16/user_medical_female.png differ diff --git a/asset/icon/Icon16/user_medical_female_black.png b/asset/icon/Icon16/user_medical_female_black.png new file mode 100644 index 0000000..7e70c4e Binary files /dev/null and b/asset/icon/Icon16/user_medical_female_black.png differ diff --git a/asset/icon/Icon16/user_mexican.png b/asset/icon/Icon16/user_mexican.png new file mode 100644 index 0000000..29a0c87 Binary files /dev/null and b/asset/icon/Icon16/user_mexican.png differ diff --git a/asset/icon/Icon16/user_muslim.png b/asset/icon/Icon16/user_muslim.png new file mode 100644 index 0000000..dcfe705 Binary files /dev/null and b/asset/icon/Icon16/user_muslim.png differ diff --git a/asset/icon/Icon16/user_muslim_female.png b/asset/icon/Icon16/user_muslim_female.png new file mode 100644 index 0000000..4c7b953 Binary files /dev/null and b/asset/icon/Icon16/user_muslim_female.png differ diff --git a/asset/icon/Icon16/user_ninja.png b/asset/icon/Icon16/user_ninja.png new file mode 100644 index 0000000..27c8d55 Binary files /dev/null and b/asset/icon/Icon16/user_ninja.png differ diff --git a/asset/icon/Icon16/user_nude.png b/asset/icon/Icon16/user_nude.png new file mode 100644 index 0000000..3963f12 Binary files /dev/null and b/asset/icon/Icon16/user_nude.png differ diff --git a/asset/icon/Icon16/user_nude_black.png b/asset/icon/Icon16/user_nude_black.png new file mode 100644 index 0000000..b684155 Binary files /dev/null and b/asset/icon/Icon16/user_nude_black.png differ diff --git a/asset/icon/Icon16/user_nude_female.png b/asset/icon/Icon16/user_nude_female.png new file mode 100644 index 0000000..d5492f1 Binary files /dev/null and b/asset/icon/Icon16/user_nude_female.png differ diff --git a/asset/icon/Icon16/user_nude_female_black.png b/asset/icon/Icon16/user_nude_female_black.png new file mode 100644 index 0000000..a930b20 Binary files /dev/null and b/asset/icon/Icon16/user_nude_female_black.png differ diff --git a/asset/icon/Icon16/user_nun.png b/asset/icon/Icon16/user_nun.png new file mode 100644 index 0000000..9f6437a Binary files /dev/null and b/asset/icon/Icon16/user_nun.png differ diff --git a/asset/icon/Icon16/user_nun_black.png b/asset/icon/Icon16/user_nun_black.png new file mode 100644 index 0000000..aa1f14c Binary files /dev/null and b/asset/icon/Icon16/user_nun_black.png differ diff --git a/asset/icon/Icon16/user_officer.png b/asset/icon/Icon16/user_officer.png new file mode 100644 index 0000000..9558f21 Binary files /dev/null and b/asset/icon/Icon16/user_officer.png differ diff --git a/asset/icon/Icon16/user_officer_black.png b/asset/icon/Icon16/user_officer_black.png new file mode 100644 index 0000000..71037c9 Binary files /dev/null and b/asset/icon/Icon16/user_officer_black.png differ diff --git a/asset/icon/Icon16/user_oldman.png b/asset/icon/Icon16/user_oldman.png new file mode 100644 index 0000000..996416e Binary files /dev/null and b/asset/icon/Icon16/user_oldman.png differ diff --git a/asset/icon/Icon16/user_oldman_black.png b/asset/icon/Icon16/user_oldman_black.png new file mode 100644 index 0000000..f05d5f6 Binary files /dev/null and b/asset/icon/Icon16/user_oldman_black.png differ diff --git a/asset/icon/Icon16/user_oldwoman.png b/asset/icon/Icon16/user_oldwoman.png new file mode 100644 index 0000000..72f1927 Binary files /dev/null and b/asset/icon/Icon16/user_oldwoman.png differ diff --git a/asset/icon/Icon16/user_oldwoman_black.png b/asset/icon/Icon16/user_oldwoman_black.png new file mode 100644 index 0000000..c697309 Binary files /dev/null and b/asset/icon/Icon16/user_oldwoman_black.png differ diff --git a/asset/icon/Icon16/user_orange.png b/asset/icon/Icon16/user_orange.png new file mode 100644 index 0000000..6766bdc Binary files /dev/null and b/asset/icon/Icon16/user_orange.png differ diff --git a/asset/icon/Icon16/user_patrick.png b/asset/icon/Icon16/user_patrick.png new file mode 100644 index 0000000..7174e5d Binary files /dev/null and b/asset/icon/Icon16/user_patrick.png differ diff --git a/asset/icon/Icon16/user_pilot.png b/asset/icon/Icon16/user_pilot.png new file mode 100644 index 0000000..33a3d1a Binary files /dev/null and b/asset/icon/Icon16/user_pilot.png differ diff --git a/asset/icon/Icon16/user_pilot_civil.png b/asset/icon/Icon16/user_pilot_civil.png new file mode 100644 index 0000000..2d7c504 Binary files /dev/null and b/asset/icon/Icon16/user_pilot_civil.png differ diff --git a/asset/icon/Icon16/user_pirate.png b/asset/icon/Icon16/user_pirate.png new file mode 100644 index 0000000..7d4a97a Binary files /dev/null and b/asset/icon/Icon16/user_pirate.png differ diff --git a/asset/icon/Icon16/user_plankton.png b/asset/icon/Icon16/user_plankton.png new file mode 100644 index 0000000..60c50fe Binary files /dev/null and b/asset/icon/Icon16/user_plankton.png differ diff --git a/asset/icon/Icon16/user_police_england.png b/asset/icon/Icon16/user_police_england.png new file mode 100644 index 0000000..ce7fc79 Binary files /dev/null and b/asset/icon/Icon16/user_police_england.png differ diff --git a/asset/icon/Icon16/user_police_female.png b/asset/icon/Icon16/user_police_female.png new file mode 100644 index 0000000..c75c6b1 Binary files /dev/null and b/asset/icon/Icon16/user_police_female.png differ diff --git a/asset/icon/Icon16/user_police_female_black.png b/asset/icon/Icon16/user_police_female_black.png new file mode 100644 index 0000000..5291687 Binary files /dev/null and b/asset/icon/Icon16/user_police_female_black.png differ diff --git a/asset/icon/Icon16/user_policeman(2).png b/asset/icon/Icon16/user_policeman(2).png new file mode 100644 index 0000000..c130083 Binary files /dev/null and b/asset/icon/Icon16/user_policeman(2).png differ diff --git a/asset/icon/Icon16/user_policeman.png b/asset/icon/Icon16/user_policeman.png new file mode 100644 index 0000000..b8c370e Binary files /dev/null and b/asset/icon/Icon16/user_policeman.png differ diff --git a/asset/icon/Icon16/user_priest.png b/asset/icon/Icon16/user_priest.png new file mode 100644 index 0000000..ec6a521 Binary files /dev/null and b/asset/icon/Icon16/user_priest.png differ diff --git a/asset/icon/Icon16/user_priest_black.png b/asset/icon/Icon16/user_priest_black.png new file mode 100644 index 0000000..85f3c34 Binary files /dev/null and b/asset/icon/Icon16/user_priest_black.png differ diff --git a/asset/icon/Icon16/user_pumpkin.png b/asset/icon/Icon16/user_pumpkin.png new file mode 100644 index 0000000..936b0d8 Binary files /dev/null and b/asset/icon/Icon16/user_pumpkin.png differ diff --git a/asset/icon/Icon16/user_queen.png b/asset/icon/Icon16/user_queen.png new file mode 100644 index 0000000..6fbe5a2 Binary files /dev/null and b/asset/icon/Icon16/user_queen.png differ diff --git a/asset/icon/Icon16/user_queen_black.png b/asset/icon/Icon16/user_queen_black.png new file mode 100644 index 0000000..cbce672 Binary files /dev/null and b/asset/icon/Icon16/user_queen_black.png differ diff --git a/asset/icon/Icon16/user_r2d2.png b/asset/icon/Icon16/user_r2d2.png new file mode 100644 index 0000000..d9ed6ab Binary files /dev/null and b/asset/icon/Icon16/user_r2d2.png differ diff --git a/asset/icon/Icon16/user_racer.png b/asset/icon/Icon16/user_racer.png new file mode 100644 index 0000000..26d4990 Binary files /dev/null and b/asset/icon/Icon16/user_racer.png differ diff --git a/asset/icon/Icon16/user_rambo.png b/asset/icon/Icon16/user_rambo.png new file mode 100644 index 0000000..526e432 Binary files /dev/null and b/asset/icon/Icon16/user_rambo.png differ diff --git a/asset/icon/Icon16/user_red.png b/asset/icon/Icon16/user_red.png new file mode 100644 index 0000000..caacaea Binary files /dev/null and b/asset/icon/Icon16/user_red.png differ diff --git a/asset/icon/Icon16/user_redskin.png b/asset/icon/Icon16/user_redskin.png new file mode 100644 index 0000000..43e0b79 Binary files /dev/null and b/asset/icon/Icon16/user_redskin.png differ diff --git a/asset/icon/Icon16/user_robocop.png b/asset/icon/Icon16/user_robocop.png new file mode 100644 index 0000000..94085de Binary files /dev/null and b/asset/icon/Icon16/user_robocop.png differ diff --git a/asset/icon/Icon16/user_sailor.png b/asset/icon/Icon16/user_sailor.png new file mode 100644 index 0000000..bcbc1b5 Binary files /dev/null and b/asset/icon/Icon16/user_sailor.png differ diff --git a/asset/icon/Icon16/user_sailor_black.png b/asset/icon/Icon16/user_sailor_black.png new file mode 100644 index 0000000..cc14a37 Binary files /dev/null and b/asset/icon/Icon16/user_sailor_black.png differ diff --git a/asset/icon/Icon16/user_samurai.png b/asset/icon/Icon16/user_samurai.png new file mode 100644 index 0000000..d777d63 Binary files /dev/null and b/asset/icon/Icon16/user_samurai.png differ diff --git a/asset/icon/Icon16/user_scream.png b/asset/icon/Icon16/user_scream.png new file mode 100644 index 0000000..e9e2cff Binary files /dev/null and b/asset/icon/Icon16/user_scream.png differ diff --git a/asset/icon/Icon16/user_silhouette.png b/asset/icon/Icon16/user_silhouette.png new file mode 100644 index 0000000..ac76d70 Binary files /dev/null and b/asset/icon/Icon16/user_silhouette.png differ diff --git a/asset/icon/Icon16/user_soldier.png b/asset/icon/Icon16/user_soldier.png new file mode 100644 index 0000000..4c32709 Binary files /dev/null and b/asset/icon/Icon16/user_soldier.png differ diff --git a/asset/icon/Icon16/user_spiderman.png b/asset/icon/Icon16/user_spiderman.png new file mode 100644 index 0000000..05a74d3 Binary files /dev/null and b/asset/icon/Icon16/user_spiderman.png differ diff --git a/asset/icon/Icon16/user_sponge_bob.png b/asset/icon/Icon16/user_sponge_bob.png new file mode 100644 index 0000000..2ed78dd Binary files /dev/null and b/asset/icon/Icon16/user_sponge_bob.png differ diff --git a/asset/icon/Icon16/user_squidward.png b/asset/icon/Icon16/user_squidward.png new file mode 100644 index 0000000..79d027a Binary files /dev/null and b/asset/icon/Icon16/user_squidward.png differ diff --git a/asset/icon/Icon16/user_stewardess.png b/asset/icon/Icon16/user_stewardess.png new file mode 100644 index 0000000..5b277ea Binary files /dev/null and b/asset/icon/Icon16/user_stewardess.png differ diff --git a/asset/icon/Icon16/user_stewardess_black.png b/asset/icon/Icon16/user_stewardess_black.png new file mode 100644 index 0000000..cedc3d5 Binary files /dev/null and b/asset/icon/Icon16/user_stewardess_black.png differ diff --git a/asset/icon/Icon16/user_striper.png b/asset/icon/Icon16/user_striper.png new file mode 100644 index 0000000..5a576a8 Binary files /dev/null and b/asset/icon/Icon16/user_striper.png differ diff --git a/asset/icon/Icon16/user_striper_black.png b/asset/icon/Icon16/user_striper_black.png new file mode 100644 index 0000000..ee5e403 Binary files /dev/null and b/asset/icon/Icon16/user_striper_black.png differ diff --git a/asset/icon/Icon16/user_student.png b/asset/icon/Icon16/user_student.png new file mode 100644 index 0000000..90d1c95 Binary files /dev/null and b/asset/icon/Icon16/user_student.png differ diff --git a/asset/icon/Icon16/user_student_black.png b/asset/icon/Icon16/user_student_black.png new file mode 100644 index 0000000..11b8645 Binary files /dev/null and b/asset/icon/Icon16/user_student_black.png differ diff --git a/asset/icon/Icon16/user_student_female.png b/asset/icon/Icon16/user_student_female.png new file mode 100644 index 0000000..7445428 Binary files /dev/null and b/asset/icon/Icon16/user_student_female.png differ diff --git a/asset/icon/Icon16/user_student_female_black.png b/asset/icon/Icon16/user_student_female_black.png new file mode 100644 index 0000000..1382245 Binary files /dev/null and b/asset/icon/Icon16/user_student_female_black.png differ diff --git a/asset/icon/Icon16/user_suit.png b/asset/icon/Icon16/user_suit.png new file mode 100644 index 0000000..656c2a4 Binary files /dev/null and b/asset/icon/Icon16/user_suit.png differ diff --git a/asset/icon/Icon16/user_superman.png b/asset/icon/Icon16/user_superman.png new file mode 100644 index 0000000..466e3c7 Binary files /dev/null and b/asset/icon/Icon16/user_superman.png differ diff --git a/asset/icon/Icon16/user_swimmer.png b/asset/icon/Icon16/user_swimmer.png new file mode 100644 index 0000000..2e0a956 Binary files /dev/null and b/asset/icon/Icon16/user_swimmer.png differ diff --git a/asset/icon/Icon16/user_swimmer_black.png b/asset/icon/Icon16/user_swimmer_black.png new file mode 100644 index 0000000..a7bdfdd Binary files /dev/null and b/asset/icon/Icon16/user_swimmer_black.png differ diff --git a/asset/icon/Icon16/user_swimmer_female.png b/asset/icon/Icon16/user_swimmer_female.png new file mode 100644 index 0000000..2d11fe9 Binary files /dev/null and b/asset/icon/Icon16/user_swimmer_female.png differ diff --git a/asset/icon/Icon16/user_trooper.png b/asset/icon/Icon16/user_trooper.png new file mode 100644 index 0000000..ab1f881 Binary files /dev/null and b/asset/icon/Icon16/user_trooper.png differ diff --git a/asset/icon/Icon16/user_trooper_captain.png b/asset/icon/Icon16/user_trooper_captain.png new file mode 100644 index 0000000..1ef85ef Binary files /dev/null and b/asset/icon/Icon16/user_trooper_captain.png differ diff --git a/asset/icon/Icon16/user_vietnamese.png b/asset/icon/Icon16/user_vietnamese.png new file mode 100644 index 0000000..d0b05a3 Binary files /dev/null and b/asset/icon/Icon16/user_vietnamese.png differ diff --git a/asset/icon/Icon16/user_vietnamese_female.png b/asset/icon/Icon16/user_vietnamese_female.png new file mode 100644 index 0000000..7438281 Binary files /dev/null and b/asset/icon/Icon16/user_vietnamese_female.png differ diff --git a/asset/icon/Icon16/user_viking.png b/asset/icon/Icon16/user_viking.png new file mode 100644 index 0000000..a2d7349 Binary files /dev/null and b/asset/icon/Icon16/user_viking.png differ diff --git a/asset/icon/Icon16/user_viking_female.png b/asset/icon/Icon16/user_viking_female.png new file mode 100644 index 0000000..d798580 Binary files /dev/null and b/asset/icon/Icon16/user_viking_female.png differ diff --git a/asset/icon/Icon16/user_waiter.png b/asset/icon/Icon16/user_waiter.png new file mode 100644 index 0000000..9c1fb61 Binary files /dev/null and b/asset/icon/Icon16/user_waiter.png differ diff --git a/asset/icon/Icon16/user_waiter_female.png b/asset/icon/Icon16/user_waiter_female.png new file mode 100644 index 0000000..ace991a Binary files /dev/null and b/asset/icon/Icon16/user_waiter_female.png differ diff --git a/asset/icon/Icon16/user_waiter_female_black.png b/asset/icon/Icon16/user_waiter_female_black.png new file mode 100644 index 0000000..5ad5c3a Binary files /dev/null and b/asset/icon/Icon16/user_waiter_female_black.png differ diff --git a/asset/icon/Icon16/user_wicket.png b/asset/icon/Icon16/user_wicket.png new file mode 100644 index 0000000..8d5a33a Binary files /dev/null and b/asset/icon/Icon16/user_wicket.png differ diff --git a/asset/icon/Icon16/user_yoda.png b/asset/icon/Icon16/user_yoda.png new file mode 100644 index 0000000..72d6e03 Binary files /dev/null and b/asset/icon/Icon16/user_yoda.png differ diff --git a/asset/icon/Icon16/user_zorro.png b/asset/icon/Icon16/user_zorro.png new file mode 100644 index 0000000..4e5bd02 Binary files /dev/null and b/asset/icon/Icon16/user_zorro.png differ diff --git a/asset/icon/Icon16/validation.png b/asset/icon/Icon16/validation.png new file mode 100644 index 0000000..d3f6f68 Binary files /dev/null and b/asset/icon/Icon16/validation.png differ diff --git a/asset/icon/Icon16/validation_document.png b/asset/icon/Icon16/validation_document.png new file mode 100644 index 0000000..ec78493 Binary files /dev/null and b/asset/icon/Icon16/validation_document.png differ diff --git a/asset/icon/Icon16/validation_invalid.png b/asset/icon/Icon16/validation_invalid.png new file mode 100644 index 0000000..009f97e Binary files /dev/null and b/asset/icon/Icon16/validation_invalid.png differ diff --git a/asset/icon/Icon16/validation_invalid_document.png b/asset/icon/Icon16/validation_invalid_document.png new file mode 100644 index 0000000..bd8018d Binary files /dev/null and b/asset/icon/Icon16/validation_invalid_document.png differ diff --git a/asset/icon/Icon16/validation_label.png b/asset/icon/Icon16/validation_label.png new file mode 100644 index 0000000..25b7230 Binary files /dev/null and b/asset/icon/Icon16/validation_label.png differ diff --git a/asset/icon/Icon16/validation_label_html.png b/asset/icon/Icon16/validation_label_html.png new file mode 100644 index 0000000..b144b0c Binary files /dev/null and b/asset/icon/Icon16/validation_label_html.png differ diff --git a/asset/icon/Icon16/validation_label_html5.png b/asset/icon/Icon16/validation_label_html5.png new file mode 100644 index 0000000..9c391bc Binary files /dev/null and b/asset/icon/Icon16/validation_label_html5.png differ diff --git a/asset/icon/Icon16/validation_valid.png b/asset/icon/Icon16/validation_valid.png new file mode 100644 index 0000000..701510a Binary files /dev/null and b/asset/icon/Icon16/validation_valid.png differ diff --git a/asset/icon/Icon16/validation_valid_document.png b/asset/icon/Icon16/validation_valid_document.png new file mode 100644 index 0000000..5f7f445 Binary files /dev/null and b/asset/icon/Icon16/validation_valid_document.png differ diff --git a/asset/icon/Icon16/vase.png b/asset/icon/Icon16/vase.png new file mode 100644 index 0000000..8030b44 Binary files /dev/null and b/asset/icon/Icon16/vase.png differ diff --git a/asset/icon/Icon16/vbox.png b/asset/icon/Icon16/vbox.png new file mode 100644 index 0000000..5bde17a Binary files /dev/null and b/asset/icon/Icon16/vbox.png differ diff --git a/asset/icon/Icon16/vcard.png b/asset/icon/Icon16/vcard.png new file mode 100644 index 0000000..b8a9fea Binary files /dev/null and b/asset/icon/Icon16/vcard.png differ diff --git a/asset/icon/Icon16/vcard_add.png b/asset/icon/Icon16/vcard_add.png new file mode 100644 index 0000000..f3f340f Binary files /dev/null and b/asset/icon/Icon16/vcard_add.png differ diff --git a/asset/icon/Icon16/vcard_delete.png b/asset/icon/Icon16/vcard_delete.png new file mode 100644 index 0000000..0624c4a Binary files /dev/null and b/asset/icon/Icon16/vcard_delete.png differ diff --git a/asset/icon/Icon16/vcard_edit.png b/asset/icon/Icon16/vcard_edit.png new file mode 100644 index 0000000..452e35e Binary files /dev/null and b/asset/icon/Icon16/vcard_edit.png differ diff --git a/asset/icon/Icon16/vdividedbox.png b/asset/icon/Icon16/vdividedbox.png new file mode 100644 index 0000000..02a4f60 Binary files /dev/null and b/asset/icon/Icon16/vdividedbox.png differ diff --git a/asset/icon/Icon16/vector.png b/asset/icon/Icon16/vector.png new file mode 100644 index 0000000..8c150aa Binary files /dev/null and b/asset/icon/Icon16/vector.png differ diff --git a/asset/icon/Icon16/vector_add.png b/asset/icon/Icon16/vector_add.png new file mode 100644 index 0000000..e445bd6 Binary files /dev/null and b/asset/icon/Icon16/vector_add.png differ diff --git a/asset/icon/Icon16/vector_delete.png b/asset/icon/Icon16/vector_delete.png new file mode 100644 index 0000000..151cad6 Binary files /dev/null and b/asset/icon/Icon16/vector_delete.png differ diff --git a/asset/icon/Icon16/vhs.png b/asset/icon/Icon16/vhs.png new file mode 100644 index 0000000..9185d37 Binary files /dev/null and b/asset/icon/Icon16/vhs.png differ diff --git a/asset/icon/Icon16/viddler.png b/asset/icon/Icon16/viddler.png new file mode 100644 index 0000000..ca2d9a0 Binary files /dev/null and b/asset/icon/Icon16/viddler.png differ diff --git a/asset/icon/Icon16/video.png b/asset/icon/Icon16/video.png new file mode 100644 index 0000000..d720c4c Binary files /dev/null and b/asset/icon/Icon16/video.png differ diff --git a/asset/icon/Icon16/video_mode.png b/asset/icon/Icon16/video_mode.png new file mode 100644 index 0000000..238ca57 Binary files /dev/null and b/asset/icon/Icon16/video_mode.png differ diff --git a/asset/icon/Icon16/videodisplay.png b/asset/icon/Icon16/videodisplay.png new file mode 100644 index 0000000..7ae6bf6 Binary files /dev/null and b/asset/icon/Icon16/videodisplay.png differ diff --git a/asset/icon/Icon16/view_available_locales.png b/asset/icon/Icon16/view_available_locales.png new file mode 100644 index 0000000..8505ba9 Binary files /dev/null and b/asset/icon/Icon16/view_available_locales.png differ diff --git a/asset/icon/Icon16/view_bandwidth_usage.png b/asset/icon/Icon16/view_bandwidth_usage.png new file mode 100644 index 0000000..074d7ef Binary files /dev/null and b/asset/icon/Icon16/view_bandwidth_usage.png differ diff --git a/asset/icon/Icon16/view_relayers.png b/asset/icon/Icon16/view_relayers.png new file mode 100644 index 0000000..18fd351 Binary files /dev/null and b/asset/icon/Icon16/view_relayers.png differ diff --git a/asset/icon/Icon16/view_sent_summary.png b/asset/icon/Icon16/view_sent_summary.png new file mode 100644 index 0000000..121bf32 Binary files /dev/null and b/asset/icon/Icon16/view_sent_summary.png differ diff --git a/asset/icon/Icon16/view_side_by_side.png b/asset/icon/Icon16/view_side_by_side.png new file mode 100644 index 0000000..e148b67 Binary files /dev/null and b/asset/icon/Icon16/view_side_by_side.png differ diff --git a/asset/icon/Icon16/viewstack.png b/asset/icon/Icon16/viewstack.png new file mode 100644 index 0000000..95a27b2 Binary files /dev/null and b/asset/icon/Icon16/viewstack.png differ diff --git a/asset/icon/Icon16/vimeo.png b/asset/icon/Icon16/vimeo.png new file mode 100644 index 0000000..2e4acce Binary files /dev/null and b/asset/icon/Icon16/vimeo.png differ diff --git a/asset/icon/Icon16/virb.png b/asset/icon/Icon16/virb.png new file mode 100644 index 0000000..4201bd2 Binary files /dev/null and b/asset/icon/Icon16/virb.png differ diff --git a/asset/icon/Icon16/virus_protection.png b/asset/icon/Icon16/virus_protection.png new file mode 100644 index 0000000..06d8e92 Binary files /dev/null and b/asset/icon/Icon16/virus_protection.png differ diff --git a/asset/icon/Icon16/visa.png b/asset/icon/Icon16/visa.png new file mode 100644 index 0000000..dccd8d7 Binary files /dev/null and b/asset/icon/Icon16/visa.png differ diff --git a/asset/icon/Icon16/visa_2.png b/asset/icon/Icon16/visa_2.png new file mode 100644 index 0000000..25cb627 Binary files /dev/null and b/asset/icon/Icon16/visa_2.png differ diff --git a/asset/icon/Icon16/visa_electron.png b/asset/icon/Icon16/visa_electron.png new file mode 100644 index 0000000..f55df28 Binary files /dev/null and b/asset/icon/Icon16/visa_electron.png differ diff --git a/asset/icon/Icon16/visual_basic.png b/asset/icon/Icon16/visual_basic.png new file mode 100644 index 0000000..9be12d9 Binary files /dev/null and b/asset/icon/Icon16/visual_basic.png differ diff --git a/asset/icon/Icon16/vlc.png b/asset/icon/Icon16/vlc.png new file mode 100644 index 0000000..e5e6ea9 Binary files /dev/null and b/asset/icon/Icon16/vlc.png differ diff --git a/asset/icon/Icon16/vrule.png b/asset/icon/Icon16/vrule.png new file mode 100644 index 0000000..0ef1e6c Binary files /dev/null and b/asset/icon/Icon16/vrule.png differ diff --git a/asset/icon/Icon16/vslider.png b/asset/icon/Icon16/vslider.png new file mode 100644 index 0000000..e06676f Binary files /dev/null and b/asset/icon/Icon16/vslider.png differ diff --git a/asset/icon/Icon16/walk.png b/asset/icon/Icon16/walk.png new file mode 100644 index 0000000..c1d9561 Binary files /dev/null and b/asset/icon/Icon16/walk.png differ diff --git a/asset/icon/Icon16/wall.png b/asset/icon/Icon16/wall.png new file mode 100644 index 0000000..99b6b4d Binary files /dev/null and b/asset/icon/Icon16/wall.png differ diff --git a/asset/icon/Icon16/wall_breack.png b/asset/icon/Icon16/wall_breack.png new file mode 100644 index 0000000..5925c3b Binary files /dev/null and b/asset/icon/Icon16/wall_breack.png differ diff --git a/asset/icon/Icon16/wallet.png b/asset/icon/Icon16/wallet.png new file mode 100644 index 0000000..b744e68 Binary files /dev/null and b/asset/icon/Icon16/wallet.png differ diff --git a/asset/icon/Icon16/wand.png b/asset/icon/Icon16/wand.png new file mode 100644 index 0000000..1da4964 Binary files /dev/null and b/asset/icon/Icon16/wand.png differ diff --git a/asset/icon/Icon16/warning.png b/asset/icon/Icon16/warning.png new file mode 100644 index 0000000..2c39360 Binary files /dev/null and b/asset/icon/Icon16/warning.png differ diff --git a/asset/icon/Icon16/watch_window.png b/asset/icon/Icon16/watch_window.png new file mode 100644 index 0000000..4b3e95d Binary files /dev/null and b/asset/icon/Icon16/watch_window.png differ diff --git a/asset/icon/Icon16/watermark(2).png b/asset/icon/Icon16/watermark(2).png new file mode 100644 index 0000000..0446c18 Binary files /dev/null and b/asset/icon/Icon16/watermark(2).png differ diff --git a/asset/icon/Icon16/watermark.png b/asset/icon/Icon16/watermark.png new file mode 100644 index 0000000..1f4afc0 Binary files /dev/null and b/asset/icon/Icon16/watermark.png differ diff --git a/asset/icon/Icon16/weather_clouds.png b/asset/icon/Icon16/weather_clouds.png new file mode 100644 index 0000000..0b4c531 Binary files /dev/null and b/asset/icon/Icon16/weather_clouds.png differ diff --git a/asset/icon/Icon16/weather_cloudy.png b/asset/icon/Icon16/weather_cloudy.png new file mode 100644 index 0000000..4d4234b Binary files /dev/null and b/asset/icon/Icon16/weather_cloudy.png differ diff --git a/asset/icon/Icon16/weather_lightning.png b/asset/icon/Icon16/weather_lightning.png new file mode 100644 index 0000000..af25337 Binary files /dev/null and b/asset/icon/Icon16/weather_lightning.png differ diff --git a/asset/icon/Icon16/weather_moon_cloudy.png b/asset/icon/Icon16/weather_moon_cloudy.png new file mode 100644 index 0000000..1011f24 Binary files /dev/null and b/asset/icon/Icon16/weather_moon_cloudy.png differ diff --git a/asset/icon/Icon16/weather_moon_fog.png b/asset/icon/Icon16/weather_moon_fog.png new file mode 100644 index 0000000..6228859 Binary files /dev/null and b/asset/icon/Icon16/weather_moon_fog.png differ diff --git a/asset/icon/Icon16/weather_moon_half.png b/asset/icon/Icon16/weather_moon_half.png new file mode 100644 index 0000000..7101b1b Binary files /dev/null and b/asset/icon/Icon16/weather_moon_half.png differ diff --git a/asset/icon/Icon16/weather_rain.png b/asset/icon/Icon16/weather_rain.png new file mode 100644 index 0000000..7d7b2e5 Binary files /dev/null and b/asset/icon/Icon16/weather_rain.png differ diff --git a/asset/icon/Icon16/weather_rain_little.png b/asset/icon/Icon16/weather_rain_little.png new file mode 100644 index 0000000..da9779a Binary files /dev/null and b/asset/icon/Icon16/weather_rain_little.png differ diff --git a/asset/icon/Icon16/weather_snow.png b/asset/icon/Icon16/weather_snow.png new file mode 100644 index 0000000..0b6d52e Binary files /dev/null and b/asset/icon/Icon16/weather_snow.png differ diff --git a/asset/icon/Icon16/weather_snow_little.png b/asset/icon/Icon16/weather_snow_little.png new file mode 100644 index 0000000..e2ef03a Binary files /dev/null and b/asset/icon/Icon16/weather_snow_little.png differ diff --git a/asset/icon/Icon16/weather_sun.png b/asset/icon/Icon16/weather_sun.png new file mode 100644 index 0000000..b38797a Binary files /dev/null and b/asset/icon/Icon16/weather_sun.png differ diff --git a/asset/icon/Icon16/weather_sun_fog.png b/asset/icon/Icon16/weather_sun_fog.png new file mode 100644 index 0000000..a7ed882 Binary files /dev/null and b/asset/icon/Icon16/weather_sun_fog.png differ diff --git a/asset/icon/Icon16/web_concierge.png b/asset/icon/Icon16/web_concierge.png new file mode 100644 index 0000000..6621d97 Binary files /dev/null and b/asset/icon/Icon16/web_concierge.png differ diff --git a/asset/icon/Icon16/web_disk.png b/asset/icon/Icon16/web_disk.png new file mode 100644 index 0000000..4dbf0fa Binary files /dev/null and b/asset/icon/Icon16/web_disk.png differ diff --git a/asset/icon/Icon16/web_layout.png b/asset/icon/Icon16/web_layout.png new file mode 100644 index 0000000..c9abed0 Binary files /dev/null and b/asset/icon/Icon16/web_layout.png differ diff --git a/asset/icon/Icon16/web_template_editor.png b/asset/icon/Icon16/web_template_editor.png new file mode 100644 index 0000000..fbd412e Binary files /dev/null and b/asset/icon/Icon16/web_template_editor.png differ diff --git a/asset/icon/Icon16/webalizer_ftp.png b/asset/icon/Icon16/webalizer_ftp.png new file mode 100644 index 0000000..528bbb3 Binary files /dev/null and b/asset/icon/Icon16/webalizer_ftp.png differ diff --git a/asset/icon/Icon16/webcam.png b/asset/icon/Icon16/webcam.png new file mode 100644 index 0000000..a0b07d8 Binary files /dev/null and b/asset/icon/Icon16/webcam.png differ diff --git a/asset/icon/Icon16/webcam_add.png b/asset/icon/Icon16/webcam_add.png new file mode 100644 index 0000000..207570f Binary files /dev/null and b/asset/icon/Icon16/webcam_add.png differ diff --git a/asset/icon/Icon16/webcam_delete.png b/asset/icon/Icon16/webcam_delete.png new file mode 100644 index 0000000..1501ed1 Binary files /dev/null and b/asset/icon/Icon16/webcam_delete.png differ diff --git a/asset/icon/Icon16/webcam_error.png b/asset/icon/Icon16/webcam_error.png new file mode 100644 index 0000000..0845c60 Binary files /dev/null and b/asset/icon/Icon16/webcam_error.png differ diff --git a/asset/icon/Icon16/webhost_manager.png b/asset/icon/Icon16/webhost_manager.png new file mode 100644 index 0000000..02a3da8 Binary files /dev/null and b/asset/icon/Icon16/webhost_manager.png differ diff --git a/asset/icon/Icon16/webmail.png b/asset/icon/Icon16/webmail.png new file mode 100644 index 0000000..335b5e4 Binary files /dev/null and b/asset/icon/Icon16/webmail.png differ diff --git a/asset/icon/Icon16/weighing_mashine.png b/asset/icon/Icon16/weighing_mashine.png new file mode 100644 index 0000000..410cbf8 Binary files /dev/null and b/asset/icon/Icon16/weighing_mashine.png differ diff --git a/asset/icon/Icon16/weight.png b/asset/icon/Icon16/weight.png new file mode 100644 index 0000000..ec70a1c Binary files /dev/null and b/asset/icon/Icon16/weight.png differ diff --git a/asset/icon/Icon16/what_if_analysis.png b/asset/icon/Icon16/what_if_analysis.png new file mode 100644 index 0000000..d886bfa Binary files /dev/null and b/asset/icon/Icon16/what_if_analysis.png differ diff --git a/asset/icon/Icon16/whistle.png b/asset/icon/Icon16/whistle.png new file mode 100644 index 0000000..a4f324f Binary files /dev/null and b/asset/icon/Icon16/whistle.png differ diff --git a/asset/icon/Icon16/wi_fi.png b/asset/icon/Icon16/wi_fi.png new file mode 100644 index 0000000..7398252 Binary files /dev/null and b/asset/icon/Icon16/wi_fi.png differ diff --git a/asset/icon/Icon16/wi_fi_zone.png b/asset/icon/Icon16/wi_fi_zone.png new file mode 100644 index 0000000..9c8526f Binary files /dev/null and b/asset/icon/Icon16/wi_fi_zone.png differ diff --git a/asset/icon/Icon16/widescreen.png b/asset/icon/Icon16/widescreen.png new file mode 100644 index 0000000..ba7e1c4 Binary files /dev/null and b/asset/icon/Icon16/widescreen.png differ diff --git a/asset/icon/Icon16/widgets.png b/asset/icon/Icon16/widgets.png new file mode 100644 index 0000000..a9b1a38 Binary files /dev/null and b/asset/icon/Icon16/widgets.png differ diff --git a/asset/icon/Icon16/windy.png b/asset/icon/Icon16/windy.png new file mode 100644 index 0000000..7b9d5f1 Binary files /dev/null and b/asset/icon/Icon16/windy.png differ diff --git a/asset/icon/Icon16/wine_pairings.png b/asset/icon/Icon16/wine_pairings.png new file mode 100644 index 0000000..68b8350 Binary files /dev/null and b/asset/icon/Icon16/wine_pairings.png differ diff --git a/asset/icon/Icon16/winrar_add.png b/asset/icon/Icon16/winrar_add.png new file mode 100644 index 0000000..90a70a5 Binary files /dev/null and b/asset/icon/Icon16/winrar_add.png differ diff --git a/asset/icon/Icon16/winrar_extract.png b/asset/icon/Icon16/winrar_extract.png new file mode 100644 index 0000000..205d4a6 Binary files /dev/null and b/asset/icon/Icon16/winrar_extract.png differ diff --git a/asset/icon/Icon16/winrar_view.png b/asset/icon/Icon16/winrar_view.png new file mode 100644 index 0000000..913e5d8 Binary files /dev/null and b/asset/icon/Icon16/winrar_view.png differ diff --git a/asset/icon/Icon16/wishlist_add.png b/asset/icon/Icon16/wishlist_add.png new file mode 100644 index 0000000..4b9887f Binary files /dev/null and b/asset/icon/Icon16/wishlist_add.png differ diff --git a/asset/icon/Icon16/wizard.png b/asset/icon/Icon16/wizard.png new file mode 100644 index 0000000..39197fe Binary files /dev/null and b/asset/icon/Icon16/wizard.png differ diff --git a/asset/icon/Icon16/wizard_women.png b/asset/icon/Icon16/wizard_women.png new file mode 100644 index 0000000..82fbc86 Binary files /dev/null and b/asset/icon/Icon16/wizard_women.png differ diff --git a/asset/icon/Icon16/word_count.png b/asset/icon/Icon16/word_count.png new file mode 100644 index 0000000..d9025b2 Binary files /dev/null and b/asset/icon/Icon16/word_count.png differ diff --git a/asset/icon/Icon16/word_exports.png b/asset/icon/Icon16/word_exports.png new file mode 100644 index 0000000..922a427 Binary files /dev/null and b/asset/icon/Icon16/word_exports.png differ diff --git a/asset/icon/Icon16/word_imports.png b/asset/icon/Icon16/word_imports.png new file mode 100644 index 0000000..9b67c35 Binary files /dev/null and b/asset/icon/Icon16/word_imports.png differ diff --git a/asset/icon/Icon16/word_wrap.png b/asset/icon/Icon16/word_wrap.png new file mode 100644 index 0000000..3a5443f Binary files /dev/null and b/asset/icon/Icon16/word_wrap.png differ diff --git a/asset/icon/Icon16/wordpress.png b/asset/icon/Icon16/wordpress.png new file mode 100644 index 0000000..87c8ca9 Binary files /dev/null and b/asset/icon/Icon16/wordpress.png differ diff --git a/asset/icon/Icon16/wordpress_blog.png b/asset/icon/Icon16/wordpress_blog.png new file mode 100644 index 0000000..91e9259 Binary files /dev/null and b/asset/icon/Icon16/wordpress_blog.png differ diff --git a/asset/icon/Icon16/workspace.png b/asset/icon/Icon16/workspace.png new file mode 100644 index 0000000..e2543e4 Binary files /dev/null and b/asset/icon/Icon16/workspace.png differ diff --git a/asset/icon/Icon16/world.png b/asset/icon/Icon16/world.png new file mode 100644 index 0000000..8ec6efe Binary files /dev/null and b/asset/icon/Icon16/world.png differ diff --git a/asset/icon/Icon16/world_add.png b/asset/icon/Icon16/world_add.png new file mode 100644 index 0000000..22e45c1 Binary files /dev/null and b/asset/icon/Icon16/world_add.png differ diff --git a/asset/icon/Icon16/world_delete.png b/asset/icon/Icon16/world_delete.png new file mode 100644 index 0000000..3d03388 Binary files /dev/null and b/asset/icon/Icon16/world_delete.png differ diff --git a/asset/icon/Icon16/world_edit.png b/asset/icon/Icon16/world_edit.png new file mode 100644 index 0000000..f0e9b96 Binary files /dev/null and b/asset/icon/Icon16/world_edit.png differ diff --git a/asset/icon/Icon16/world_go.png b/asset/icon/Icon16/world_go.png new file mode 100644 index 0000000..af64adb Binary files /dev/null and b/asset/icon/Icon16/world_go.png differ diff --git a/asset/icon/Icon16/world_link.png b/asset/icon/Icon16/world_link.png new file mode 100644 index 0000000..e737026 Binary files /dev/null and b/asset/icon/Icon16/world_link.png differ diff --git a/asset/icon/Icon16/wrapping_behind.png b/asset/icon/Icon16/wrapping_behind.png new file mode 100644 index 0000000..c3db3a2 Binary files /dev/null and b/asset/icon/Icon16/wrapping_behind.png differ diff --git a/asset/icon/Icon16/wrapping_between.png b/asset/icon/Icon16/wrapping_between.png new file mode 100644 index 0000000..7749610 Binary files /dev/null and b/asset/icon/Icon16/wrapping_between.png differ diff --git a/asset/icon/Icon16/wrapping_edit.png b/asset/icon/Icon16/wrapping_edit.png new file mode 100644 index 0000000..56a0e35 Binary files /dev/null and b/asset/icon/Icon16/wrapping_edit.png differ diff --git a/asset/icon/Icon16/wrapping_in_front.png b/asset/icon/Icon16/wrapping_in_front.png new file mode 100644 index 0000000..ccbe4f4 Binary files /dev/null and b/asset/icon/Icon16/wrapping_in_front.png differ diff --git a/asset/icon/Icon16/wrapping_inline.png b/asset/icon/Icon16/wrapping_inline.png new file mode 100644 index 0000000..3877554 Binary files /dev/null and b/asset/icon/Icon16/wrapping_inline.png differ diff --git a/asset/icon/Icon16/wrapping_magazine.png b/asset/icon/Icon16/wrapping_magazine.png new file mode 100644 index 0000000..7adfc0e Binary files /dev/null and b/asset/icon/Icon16/wrapping_magazine.png differ diff --git a/asset/icon/Icon16/wrapping_square.png b/asset/icon/Icon16/wrapping_square.png new file mode 100644 index 0000000..a662a8f Binary files /dev/null and b/asset/icon/Icon16/wrapping_square.png differ diff --git a/asset/icon/Icon16/wrapping_tight.png b/asset/icon/Icon16/wrapping_tight.png new file mode 100644 index 0000000..675859b Binary files /dev/null and b/asset/icon/Icon16/wrapping_tight.png differ diff --git a/asset/icon/Icon16/wrench.png b/asset/icon/Icon16/wrench.png new file mode 100644 index 0000000..7c8cc7a Binary files /dev/null and b/asset/icon/Icon16/wrench.png differ diff --git a/asset/icon/Icon16/wrench_orange.png b/asset/icon/Icon16/wrench_orange.png new file mode 100644 index 0000000..a10dc9d Binary files /dev/null and b/asset/icon/Icon16/wrench_orange.png differ diff --git a/asset/icon/Icon16/www_page.png b/asset/icon/Icon16/www_page.png new file mode 100644 index 0000000..ae82ec2 Binary files /dev/null and b/asset/icon/Icon16/www_page.png differ diff --git a/asset/icon/Icon16/x_ray.png b/asset/icon/Icon16/x_ray.png new file mode 100644 index 0000000..1fc843f Binary files /dev/null and b/asset/icon/Icon16/x_ray.png differ diff --git a/asset/icon/Icon16/xfn.png b/asset/icon/Icon16/xfn.png new file mode 100644 index 0000000..f4efb1d Binary files /dev/null and b/asset/icon/Icon16/xfn.png differ diff --git a/asset/icon/Icon16/xhtml.png b/asset/icon/Icon16/xhtml.png new file mode 100644 index 0000000..5be5cac Binary files /dev/null and b/asset/icon/Icon16/xhtml.png differ diff --git a/asset/icon/Icon16/xhtml_add.png b/asset/icon/Icon16/xhtml_add.png new file mode 100644 index 0000000..653a66e Binary files /dev/null and b/asset/icon/Icon16/xhtml_add.png differ diff --git a/asset/icon/Icon16/xhtml_delete.png b/asset/icon/Icon16/xhtml_delete.png new file mode 100644 index 0000000..806f1a4 Binary files /dev/null and b/asset/icon/Icon16/xhtml_delete.png differ diff --git a/asset/icon/Icon16/xhtml_go.png b/asset/icon/Icon16/xhtml_go.png new file mode 100644 index 0000000..d7dc7ee Binary files /dev/null and b/asset/icon/Icon16/xhtml_go.png differ diff --git a/asset/icon/Icon16/xhtml_valid.png b/asset/icon/Icon16/xhtml_valid.png new file mode 100644 index 0000000..d5e0520 Binary files /dev/null and b/asset/icon/Icon16/xhtml_valid.png differ diff --git a/asset/icon/Icon16/xing.png b/asset/icon/Icon16/xing.png new file mode 100644 index 0000000..16fd40f Binary files /dev/null and b/asset/icon/Icon16/xing.png differ diff --git a/asset/icon/Icon16/xml_exports.png b/asset/icon/Icon16/xml_exports.png new file mode 100644 index 0000000..fdf0c0e Binary files /dev/null and b/asset/icon/Icon16/xml_exports.png differ diff --git a/asset/icon/Icon16/xml_imports.png b/asset/icon/Icon16/xml_imports.png new file mode 100644 index 0000000..7fdd7b0 Binary files /dev/null and b/asset/icon/Icon16/xml_imports.png differ diff --git a/asset/icon/Icon16/yacht.png b/asset/icon/Icon16/yacht.png new file mode 100644 index 0000000..f0f47be Binary files /dev/null and b/asset/icon/Icon16/yacht.png differ diff --git a/asset/icon/Icon16/yahoo_messenger.png b/asset/icon/Icon16/yahoo_messenger.png new file mode 100644 index 0000000..5020e97 Binary files /dev/null and b/asset/icon/Icon16/yahoo_messenger.png differ diff --git a/asset/icon/Icon16/yellow_submarine.png b/asset/icon/Icon16/yellow_submarine.png new file mode 100644 index 0000000..302c290 Binary files /dev/null and b/asset/icon/Icon16/yellow_submarine.png differ diff --git a/asset/icon/Icon16/yelp.png b/asset/icon/Icon16/yelp.png new file mode 100644 index 0000000..fa274fc Binary files /dev/null and b/asset/icon/Icon16/yelp.png differ diff --git a/asset/icon/Icon16/yin_yang.png b/asset/icon/Icon16/yin_yang.png new file mode 100644 index 0000000..79d994d Binary files /dev/null and b/asset/icon/Icon16/yin_yang.png differ diff --git a/asset/icon/Icon16/youtube.png b/asset/icon/Icon16/youtube.png new file mode 100644 index 0000000..8db4a8b Binary files /dev/null and b/asset/icon/Icon16/youtube.png differ diff --git a/asset/icon/Icon16/zodiac.png b/asset/icon/Icon16/zodiac.png new file mode 100644 index 0000000..8c657aa Binary files /dev/null and b/asset/icon/Icon16/zodiac.png differ diff --git a/asset/icon/Icon16/zodiac_aries.png b/asset/icon/Icon16/zodiac_aries.png new file mode 100644 index 0000000..5679cfe Binary files /dev/null and b/asset/icon/Icon16/zodiac_aries.png differ diff --git a/asset/icon/Icon16/zodiac_cancer.png b/asset/icon/Icon16/zodiac_cancer.png new file mode 100644 index 0000000..0366de1 Binary files /dev/null and b/asset/icon/Icon16/zodiac_cancer.png differ diff --git a/asset/icon/Icon16/zodiac_capricorn.png b/asset/icon/Icon16/zodiac_capricorn.png new file mode 100644 index 0000000..9acbfba Binary files /dev/null and b/asset/icon/Icon16/zodiac_capricorn.png differ diff --git a/asset/icon/Icon16/zodiac_gemini.png b/asset/icon/Icon16/zodiac_gemini.png new file mode 100644 index 0000000..bb4af06 Binary files /dev/null and b/asset/icon/Icon16/zodiac_gemini.png differ diff --git a/asset/icon/Icon16/zodiac_leo.png b/asset/icon/Icon16/zodiac_leo.png new file mode 100644 index 0000000..cf75407 Binary files /dev/null and b/asset/icon/Icon16/zodiac_leo.png differ diff --git a/asset/icon/Icon16/zodiac_libra.png b/asset/icon/Icon16/zodiac_libra.png new file mode 100644 index 0000000..a958bc3 Binary files /dev/null and b/asset/icon/Icon16/zodiac_libra.png differ diff --git a/asset/icon/Icon16/zodiac_pisces.png b/asset/icon/Icon16/zodiac_pisces.png new file mode 100644 index 0000000..0364b61 Binary files /dev/null and b/asset/icon/Icon16/zodiac_pisces.png differ diff --git a/asset/icon/Icon16/zodiac_sagittarius.png b/asset/icon/Icon16/zodiac_sagittarius.png new file mode 100644 index 0000000..c961766 Binary files /dev/null and b/asset/icon/Icon16/zodiac_sagittarius.png differ diff --git a/asset/icon/Icon16/zodiac_scorpio.png b/asset/icon/Icon16/zodiac_scorpio.png new file mode 100644 index 0000000..277e7db Binary files /dev/null and b/asset/icon/Icon16/zodiac_scorpio.png differ diff --git a/asset/icon/Icon16/zodiac_taurus.png b/asset/icon/Icon16/zodiac_taurus.png new file mode 100644 index 0000000..a26ac37 Binary files /dev/null and b/asset/icon/Icon16/zodiac_taurus.png differ diff --git a/asset/icon/Icon16/zodiac_virgo.png b/asset/icon/Icon16/zodiac_virgo.png new file mode 100644 index 0000000..ad69bea Binary files /dev/null and b/asset/icon/Icon16/zodiac_virgo.png differ diff --git a/asset/icon/Icon16/zone.png b/asset/icon/Icon16/zone.png new file mode 100644 index 0000000..19d0164 Binary files /dev/null and b/asset/icon/Icon16/zone.png differ diff --git a/asset/icon/Icon16/zone_money.png b/asset/icon/Icon16/zone_money.png new file mode 100644 index 0000000..a7b17e2 Binary files /dev/null and b/asset/icon/Icon16/zone_money.png differ diff --git a/asset/icon/Icon16/zone_resize.png b/asset/icon/Icon16/zone_resize.png new file mode 100644 index 0000000..c96de1b Binary files /dev/null and b/asset/icon/Icon16/zone_resize.png differ diff --git a/asset/icon/Icon16/zone_resize_actual.png b/asset/icon/Icon16/zone_resize_actual.png new file mode 100644 index 0000000..bafaedb Binary files /dev/null and b/asset/icon/Icon16/zone_resize_actual.png differ diff --git a/asset/icon/Icon16/zone_select.png b/asset/icon/Icon16/zone_select.png new file mode 100644 index 0000000..46f3dcd Binary files /dev/null and b/asset/icon/Icon16/zone_select.png differ diff --git a/asset/icon/Icon16/zoom.png b/asset/icon/Icon16/zoom.png new file mode 100644 index 0000000..3280a45 Binary files /dev/null and b/asset/icon/Icon16/zoom.png differ diff --git a/asset/icon/Icon16/zoom_actual.png b/asset/icon/Icon16/zoom_actual.png new file mode 100644 index 0000000..f1c202c Binary files /dev/null and b/asset/icon/Icon16/zoom_actual.png differ diff --git a/asset/icon/Icon16/zoom_actual_equal.png b/asset/icon/Icon16/zoom_actual_equal.png new file mode 100644 index 0000000..e0185a2 Binary files /dev/null and b/asset/icon/Icon16/zoom_actual_equal.png differ diff --git a/asset/icon/Icon16/zoom_extend.png b/asset/icon/Icon16/zoom_extend.png new file mode 100644 index 0000000..f3d1753 Binary files /dev/null and b/asset/icon/Icon16/zoom_extend.png differ diff --git a/asset/icon/Icon16/zoom_fit.png b/asset/icon/Icon16/zoom_fit.png new file mode 100644 index 0000000..168bcd5 Binary files /dev/null and b/asset/icon/Icon16/zoom_fit.png differ diff --git a/asset/icon/Icon16/zoom_in.png b/asset/icon/Icon16/zoom_in.png new file mode 100644 index 0000000..73924a7 Binary files /dev/null and b/asset/icon/Icon16/zoom_in.png differ diff --git a/asset/icon/Icon16/zoom_last.png b/asset/icon/Icon16/zoom_last.png new file mode 100644 index 0000000..11a3757 Binary files /dev/null and b/asset/icon/Icon16/zoom_last.png differ diff --git a/asset/icon/Icon16/zoom_layer.png b/asset/icon/Icon16/zoom_layer.png new file mode 100644 index 0000000..7ed636d Binary files /dev/null and b/asset/icon/Icon16/zoom_layer.png differ diff --git a/asset/icon/Icon16/zoom_out.png b/asset/icon/Icon16/zoom_out.png new file mode 100644 index 0000000..ab862b7 Binary files /dev/null and b/asset/icon/Icon16/zoom_out.png differ diff --git a/asset/icon/Icon16/zoom_refresh.png b/asset/icon/Icon16/zoom_refresh.png new file mode 100644 index 0000000..a686468 Binary files /dev/null and b/asset/icon/Icon16/zoom_refresh.png differ diff --git a/asset/icon/Icon16/zoom_selection.png b/asset/icon/Icon16/zoom_selection.png new file mode 100644 index 0000000..7097ccf Binary files /dev/null and b/asset/icon/Icon16/zoom_selection.png differ diff --git a/asset/icon/Icon16/zootool.png b/asset/icon/Icon16/zootool.png new file mode 100644 index 0000000..c672323 Binary files /dev/null and b/asset/icon/Icon16/zootool.png differ diff --git a/asset/icon/Icon32/32_bit.png b/asset/icon/Icon32/32_bit.png new file mode 100644 index 0000000..0f735e0 Binary files /dev/null and b/asset/icon/Icon32/32_bit.png differ diff --git a/asset/icon/Icon32/3d_glasses.png b/asset/icon/Icon32/3d_glasses.png new file mode 100644 index 0000000..0fafc03 Binary files /dev/null and b/asset/icon/Icon32/3d_glasses.png differ diff --git a/asset/icon/Icon32/64_bit.png b/asset/icon/Icon32/64_bit.png new file mode 100644 index 0000000..e28871b Binary files /dev/null and b/asset/icon/Icon32/64_bit.png differ diff --git a/asset/icon/Icon32/Plant.png b/asset/icon/Icon32/Plant.png new file mode 100644 index 0000000..b8d776c Binary files /dev/null and b/asset/icon/Icon32/Plant.png differ diff --git a/asset/icon/Icon32/Previous_comment.png b/asset/icon/Icon32/Previous_comment.png new file mode 100644 index 0000000..6b560ea Binary files /dev/null and b/asset/icon/Icon32/Previous_comment.png differ diff --git a/asset/icon/Icon32/Track_changes(2).png b/asset/icon/Icon32/Track_changes(2).png new file mode 100644 index 0000000..ba35425 Binary files /dev/null and b/asset/icon/Icon32/Track_changes(2).png differ diff --git a/asset/icon/Icon32/accept(2).png b/asset/icon/Icon32/accept(2).png new file mode 100644 index 0000000..1fc439b Binary files /dev/null and b/asset/icon/Icon32/accept(2).png differ diff --git a/asset/icon/Icon32/accept.png b/asset/icon/Icon32/accept.png new file mode 100644 index 0000000..7786ac7 Binary files /dev/null and b/asset/icon/Icon32/accept.png differ diff --git a/asset/icon/Icon32/access_exports.png b/asset/icon/Icon32/access_exports.png new file mode 100644 index 0000000..ed98444 Binary files /dev/null and b/asset/icon/Icon32/access_exports.png differ diff --git a/asset/icon/Icon32/access_imports.png b/asset/icon/Icon32/access_imports.png new file mode 100644 index 0000000..d509a1b Binary files /dev/null and b/asset/icon/Icon32/access_imports.png differ diff --git a/asset/icon/Icon32/accordion.png b/asset/icon/Icon32/accordion.png new file mode 100644 index 0000000..796ef33 Binary files /dev/null and b/asset/icon/Icon32/accordion.png differ diff --git a/asset/icon/Icon32/account_balances.png b/asset/icon/Icon32/account_balances.png new file mode 100644 index 0000000..dfeffdc Binary files /dev/null and b/asset/icon/Icon32/account_balances.png differ diff --git a/asset/icon/Icon32/account_functions.png b/asset/icon/Icon32/account_functions.png new file mode 100644 index 0000000..95090df Binary files /dev/null and b/asset/icon/Icon32/account_functions.png differ diff --git a/asset/icon/Icon32/account_level_filtering.png b/asset/icon/Icon32/account_level_filtering.png new file mode 100644 index 0000000..592ad8e Binary files /dev/null and b/asset/icon/Icon32/account_level_filtering.png differ diff --git a/asset/icon/Icon32/acorn.png b/asset/icon/Icon32/acorn.png new file mode 100644 index 0000000..4e2ee9b Binary files /dev/null and b/asset/icon/Icon32/acorn.png differ diff --git a/asset/icon/Icon32/acoustic_guitar.png b/asset/icon/Icon32/acoustic_guitar.png new file mode 100644 index 0000000..9c6a2fc Binary files /dev/null and b/asset/icon/Icon32/acoustic_guitar.png differ diff --git a/asset/icon/Icon32/action.png b/asset/icon/Icon32/action.png new file mode 100644 index 0000000..ad77b48 Binary files /dev/null and b/asset/icon/Icon32/action.png differ diff --git a/asset/icon/Icon32/action_log.png b/asset/icon/Icon32/action_log.png new file mode 100644 index 0000000..39681a4 Binary files /dev/null and b/asset/icon/Icon32/action_log.png differ diff --git a/asset/icon/Icon32/active_sessions.png b/asset/icon/Icon32/active_sessions.png new file mode 100644 index 0000000..6b5adcb Binary files /dev/null and b/asset/icon/Icon32/active_sessions.png differ diff --git a/asset/icon/Icon32/add.png b/asset/icon/Icon32/add.png new file mode 100644 index 0000000..60a7a29 Binary files /dev/null and b/asset/icon/Icon32/add.png differ diff --git a/asset/icon/Icon32/add_dns_zone.png b/asset/icon/Icon32/add_dns_zone.png new file mode 100644 index 0000000..ed7ced6 Binary files /dev/null and b/asset/icon/Icon32/add_dns_zone.png differ diff --git a/asset/icon/Icon32/add_on.png b/asset/icon/Icon32/add_on.png new file mode 100644 index 0000000..4da7bbb Binary files /dev/null and b/asset/icon/Icon32/add_on.png differ diff --git a/asset/icon/Icon32/add_package.png b/asset/icon/Icon32/add_package.png new file mode 100644 index 0000000..22b696a Binary files /dev/null and b/asset/icon/Icon32/add_package.png differ diff --git a/asset/icon/Icon32/addon_domains.png b/asset/icon/Icon32/addon_domains.png new file mode 100644 index 0000000..53580e0 Binary files /dev/null and b/asset/icon/Icon32/addon_domains.png differ diff --git a/asset/icon/Icon32/address_bar.png b/asset/icon/Icon32/address_bar.png new file mode 100644 index 0000000..059b076 Binary files /dev/null and b/asset/icon/Icon32/address_bar.png differ diff --git a/asset/icon/Icon32/address_bar_green.png b/asset/icon/Icon32/address_bar_green.png new file mode 100644 index 0000000..7c5ff2b Binary files /dev/null and b/asset/icon/Icon32/address_bar_green.png differ diff --git a/asset/icon/Icon32/address_bar_lock.png b/asset/icon/Icon32/address_bar_lock.png new file mode 100644 index 0000000..d273266 Binary files /dev/null and b/asset/icon/Icon32/address_bar_lock.png differ diff --git a/asset/icon/Icon32/address_bar_red.png b/asset/icon/Icon32/address_bar_red.png new file mode 100644 index 0000000..0cb2ed2 Binary files /dev/null and b/asset/icon/Icon32/address_bar_red.png differ diff --git a/asset/icon/Icon32/address_bar_yellow.png b/asset/icon/Icon32/address_bar_yellow.png new file mode 100644 index 0000000..3c93451 Binary files /dev/null and b/asset/icon/Icon32/address_bar_yellow.png differ diff --git a/asset/icon/Icon32/address_block.png b/asset/icon/Icon32/address_block.png new file mode 100644 index 0000000..981ef70 Binary files /dev/null and b/asset/icon/Icon32/address_block.png differ diff --git a/asset/icon/Icon32/administrator.png b/asset/icon/Icon32/administrator.png new file mode 100644 index 0000000..4594e3b Binary files /dev/null and b/asset/icon/Icon32/administrator.png differ diff --git a/asset/icon/Icon32/advanced_data_grid.png b/asset/icon/Icon32/advanced_data_grid.png new file mode 100644 index 0000000..a388898 Binary files /dev/null and b/asset/icon/Icon32/advanced_data_grid.png differ diff --git a/asset/icon/Icon32/advanced_dns_zone_editor.png b/asset/icon/Icon32/advanced_dns_zone_editor.png new file mode 100644 index 0000000..5930489 Binary files /dev/null and b/asset/icon/Icon32/advanced_dns_zone_editor.png differ diff --git a/asset/icon/Icon32/advertising.png b/asset/icon/Icon32/advertising.png new file mode 100644 index 0000000..300fc6f Binary files /dev/null and b/asset/icon/Icon32/advertising.png differ diff --git a/asset/icon/Icon32/after_delete.png b/asset/icon/Icon32/after_delete.png new file mode 100644 index 0000000..2142d89 Binary files /dev/null and b/asset/icon/Icon32/after_delete.png differ diff --git a/asset/icon/Icon32/after_insert.png b/asset/icon/Icon32/after_insert.png new file mode 100644 index 0000000..f04c836 Binary files /dev/null and b/asset/icon/Icon32/after_insert.png differ diff --git a/asset/icon/Icon32/after_update.png b/asset/icon/Icon32/after_update.png new file mode 100644 index 0000000..0cb92d5 Binary files /dev/null and b/asset/icon/Icon32/after_update.png differ diff --git a/asset/icon/Icon32/agp.png b/asset/icon/Icon32/agp.png new file mode 100644 index 0000000..57f15de Binary files /dev/null and b/asset/icon/Icon32/agp.png differ diff --git a/asset/icon/Icon32/aim_messenger.png b/asset/icon/Icon32/aim_messenger.png new file mode 100644 index 0000000..aa64010 Binary files /dev/null and b/asset/icon/Icon32/aim_messenger.png differ diff --git a/asset/icon/Icon32/alarm_bell.png b/asset/icon/Icon32/alarm_bell.png new file mode 100644 index 0000000..fe8c37b Binary files /dev/null and b/asset/icon/Icon32/alarm_bell.png differ diff --git a/asset/icon/Icon32/align.png b/asset/icon/Icon32/align.png new file mode 100644 index 0000000..405597b Binary files /dev/null and b/asset/icon/Icon32/align.png differ diff --git a/asset/icon/Icon32/align_above.png b/asset/icon/Icon32/align_above.png new file mode 100644 index 0000000..9dd06ea Binary files /dev/null and b/asset/icon/Icon32/align_above.png differ diff --git a/asset/icon/Icon32/align_bellow.png b/asset/icon/Icon32/align_bellow.png new file mode 100644 index 0000000..02ac829 Binary files /dev/null and b/asset/icon/Icon32/align_bellow.png differ diff --git a/asset/icon/Icon32/align_center.png b/asset/icon/Icon32/align_center.png new file mode 100644 index 0000000..6cef93e Binary files /dev/null and b/asset/icon/Icon32/align_center.png differ diff --git a/asset/icon/Icon32/align_compact.png b/asset/icon/Icon32/align_compact.png new file mode 100644 index 0000000..d88fccd Binary files /dev/null and b/asset/icon/Icon32/align_compact.png differ diff --git a/asset/icon/Icon32/align_left.png b/asset/icon/Icon32/align_left.png new file mode 100644 index 0000000..c4f3620 Binary files /dev/null and b/asset/icon/Icon32/align_left.png differ diff --git a/asset/icon/Icon32/align_middle.png b/asset/icon/Icon32/align_middle.png new file mode 100644 index 0000000..11c8612 Binary files /dev/null and b/asset/icon/Icon32/align_middle.png differ diff --git a/asset/icon/Icon32/align_none.png b/asset/icon/Icon32/align_none.png new file mode 100644 index 0000000..a84f1f1 Binary files /dev/null and b/asset/icon/Icon32/align_none.png differ diff --git a/asset/icon/Icon32/align_right.png b/asset/icon/Icon32/align_right.png new file mode 100644 index 0000000..91093b6 Binary files /dev/null and b/asset/icon/Icon32/align_right.png differ diff --git a/asset/icon/Icon32/alitalk.png b/asset/icon/Icon32/alitalk.png new file mode 100644 index 0000000..58d2f75 Binary files /dev/null and b/asset/icon/Icon32/alitalk.png differ diff --git a/asset/icon/Icon32/all_right_reserved.png b/asset/icon/Icon32/all_right_reserved.png new file mode 100644 index 0000000..2ca68cb Binary files /dev/null and b/asset/icon/Icon32/all_right_reserved.png differ diff --git a/asset/icon/Icon32/allow_users_edit_ranges.png b/asset/icon/Icon32/allow_users_edit_ranges.png new file mode 100644 index 0000000..3b69010 Binary files /dev/null and b/asset/icon/Icon32/allow_users_edit_ranges.png differ diff --git a/asset/icon/Icon32/american_express.png b/asset/icon/Icon32/american_express.png new file mode 100644 index 0000000..bbc8b5f Binary files /dev/null and b/asset/icon/Icon32/american_express.png differ diff --git a/asset/icon/Icon32/anchor.png b/asset/icon/Icon32/anchor.png new file mode 100644 index 0000000..fde7f95 Binary files /dev/null and b/asset/icon/Icon32/anchor.png differ diff --git a/asset/icon/Icon32/android.png b/asset/icon/Icon32/android.png new file mode 100644 index 0000000..d903727 Binary files /dev/null and b/asset/icon/Icon32/android.png differ diff --git a/asset/icon/Icon32/android_phone_protect.png b/asset/icon/Icon32/android_phone_protect.png new file mode 100644 index 0000000..ef51ca7 Binary files /dev/null and b/asset/icon/Icon32/android_phone_protect.png differ diff --git a/asset/icon/Icon32/angel.png b/asset/icon/Icon32/angel.png new file mode 100644 index 0000000..8e9ec07 Binary files /dev/null and b/asset/icon/Icon32/angel.png differ diff --git a/asset/icon/Icon32/anonymous_ftp_controls.png b/asset/icon/Icon32/anonymous_ftp_controls.png new file mode 100644 index 0000000..89488a1 Binary files /dev/null and b/asset/icon/Icon32/anonymous_ftp_controls.png differ diff --git a/asset/icon/Icon32/anti_xss.png b/asset/icon/Icon32/anti_xss.png new file mode 100644 index 0000000..33a9f67 Binary files /dev/null and b/asset/icon/Icon32/anti_xss.png differ diff --git a/asset/icon/Icon32/aol_mail.png b/asset/icon/Icon32/aol_mail.png new file mode 100644 index 0000000..8952510 Binary files /dev/null and b/asset/icon/Icon32/aol_mail.png differ diff --git a/asset/icon/Icon32/aol_messenger.png b/asset/icon/Icon32/aol_messenger.png new file mode 100644 index 0000000..2f362da Binary files /dev/null and b/asset/icon/Icon32/aol_messenger.png differ diff --git a/asset/icon/Icon32/apache_handlers.png b/asset/icon/Icon32/apache_handlers.png new file mode 100644 index 0000000..81b7eb6 Binary files /dev/null and b/asset/icon/Icon32/apache_handlers.png differ diff --git a/asset/icon/Icon32/apple.png b/asset/icon/Icon32/apple.png new file mode 100644 index 0000000..c5c3246 Binary files /dev/null and b/asset/icon/Icon32/apple.png differ diff --git a/asset/icon/Icon32/apple_corp.png b/asset/icon/Icon32/apple_corp.png new file mode 100644 index 0000000..1dd6a3d Binary files /dev/null and b/asset/icon/Icon32/apple_corp.png differ diff --git a/asset/icon/Icon32/apple_half.png b/asset/icon/Icon32/apple_half.png new file mode 100644 index 0000000..c6b747e Binary files /dev/null and b/asset/icon/Icon32/apple_half.png differ diff --git a/asset/icon/Icon32/application.png b/asset/icon/Icon32/application.png new file mode 100644 index 0000000..69d6132 Binary files /dev/null and b/asset/icon/Icon32/application.png differ diff --git a/asset/icon/Icon32/application_add.png b/asset/icon/Icon32/application_add.png new file mode 100644 index 0000000..cbdffb1 Binary files /dev/null and b/asset/icon/Icon32/application_add.png differ diff --git a/asset/icon/Icon32/application_cascade.png b/asset/icon/Icon32/application_cascade.png new file mode 100644 index 0000000..8cd88bc Binary files /dev/null and b/asset/icon/Icon32/application_cascade.png differ diff --git a/asset/icon/Icon32/application_control_bar.png b/asset/icon/Icon32/application_control_bar.png new file mode 100644 index 0000000..44a7bd6 Binary files /dev/null and b/asset/icon/Icon32/application_control_bar.png differ diff --git a/asset/icon/Icon32/application_delete.png b/asset/icon/Icon32/application_delete.png new file mode 100644 index 0000000..3f13369 Binary files /dev/null and b/asset/icon/Icon32/application_delete.png differ diff --git a/asset/icon/Icon32/application_double.png b/asset/icon/Icon32/application_double.png new file mode 100644 index 0000000..c8d22fd Binary files /dev/null and b/asset/icon/Icon32/application_double.png differ diff --git a/asset/icon/Icon32/application_edit.png b/asset/icon/Icon32/application_edit.png new file mode 100644 index 0000000..12dc94b Binary files /dev/null and b/asset/icon/Icon32/application_edit.png differ diff --git a/asset/icon/Icon32/application_error.png b/asset/icon/Icon32/application_error.png new file mode 100644 index 0000000..5b0fe3b Binary files /dev/null and b/asset/icon/Icon32/application_error.png differ diff --git a/asset/icon/Icon32/application_form.png b/asset/icon/Icon32/application_form.png new file mode 100644 index 0000000..bc6a856 Binary files /dev/null and b/asset/icon/Icon32/application_form.png differ diff --git a/asset/icon/Icon32/application_form_add.png b/asset/icon/Icon32/application_form_add.png new file mode 100644 index 0000000..09e8a87 Binary files /dev/null and b/asset/icon/Icon32/application_form_add.png differ diff --git a/asset/icon/Icon32/application_form_delete.png b/asset/icon/Icon32/application_form_delete.png new file mode 100644 index 0000000..c8990b2 Binary files /dev/null and b/asset/icon/Icon32/application_form_delete.png differ diff --git a/asset/icon/Icon32/application_form_edit.png b/asset/icon/Icon32/application_form_edit.png new file mode 100644 index 0000000..521887e Binary files /dev/null and b/asset/icon/Icon32/application_form_edit.png differ diff --git a/asset/icon/Icon32/application_form_magnify.png b/asset/icon/Icon32/application_form_magnify.png new file mode 100644 index 0000000..b541e6b Binary files /dev/null and b/asset/icon/Icon32/application_form_magnify.png differ diff --git a/asset/icon/Icon32/application_from_storage.png b/asset/icon/Icon32/application_from_storage.png new file mode 100644 index 0000000..78f6ebb Binary files /dev/null and b/asset/icon/Icon32/application_from_storage.png differ diff --git a/asset/icon/Icon32/application_get.png b/asset/icon/Icon32/application_get.png new file mode 100644 index 0000000..d88033c Binary files /dev/null and b/asset/icon/Icon32/application_get.png differ diff --git a/asset/icon/Icon32/application_go.png b/asset/icon/Icon32/application_go.png new file mode 100644 index 0000000..7485e34 Binary files /dev/null and b/asset/icon/Icon32/application_go.png differ diff --git a/asset/icon/Icon32/application_home.png b/asset/icon/Icon32/application_home.png new file mode 100644 index 0000000..5fea6f8 Binary files /dev/null and b/asset/icon/Icon32/application_home.png differ diff --git a/asset/icon/Icon32/application_key.png b/asset/icon/Icon32/application_key.png new file mode 100644 index 0000000..466a062 Binary files /dev/null and b/asset/icon/Icon32/application_key.png differ diff --git a/asset/icon/Icon32/application_lightning.png b/asset/icon/Icon32/application_lightning.png new file mode 100644 index 0000000..dab862e Binary files /dev/null and b/asset/icon/Icon32/application_lightning.png differ diff --git a/asset/icon/Icon32/application_link.png b/asset/icon/Icon32/application_link.png new file mode 100644 index 0000000..64573c4 Binary files /dev/null and b/asset/icon/Icon32/application_link.png differ diff --git a/asset/icon/Icon32/application_osx.png b/asset/icon/Icon32/application_osx.png new file mode 100644 index 0000000..a4971ef Binary files /dev/null and b/asset/icon/Icon32/application_osx.png differ diff --git a/asset/icon/Icon32/application_osx_terminal.png b/asset/icon/Icon32/application_osx_terminal.png new file mode 100644 index 0000000..bc7264e Binary files /dev/null and b/asset/icon/Icon32/application_osx_terminal.png differ diff --git a/asset/icon/Icon32/application_parts.png b/asset/icon/Icon32/application_parts.png new file mode 100644 index 0000000..d57b8f1 Binary files /dev/null and b/asset/icon/Icon32/application_parts.png differ diff --git a/asset/icon/Icon32/application_put.png b/asset/icon/Icon32/application_put.png new file mode 100644 index 0000000..fed81c8 Binary files /dev/null and b/asset/icon/Icon32/application_put.png differ diff --git a/asset/icon/Icon32/application_side_boxes.png b/asset/icon/Icon32/application_side_boxes.png new file mode 100644 index 0000000..e094217 Binary files /dev/null and b/asset/icon/Icon32/application_side_boxes.png differ diff --git a/asset/icon/Icon32/application_side_contract.png b/asset/icon/Icon32/application_side_contract.png new file mode 100644 index 0000000..cbc52a1 Binary files /dev/null and b/asset/icon/Icon32/application_side_contract.png differ diff --git a/asset/icon/Icon32/application_side_expand.png b/asset/icon/Icon32/application_side_expand.png new file mode 100644 index 0000000..687d74d Binary files /dev/null and b/asset/icon/Icon32/application_side_expand.png differ diff --git a/asset/icon/Icon32/application_side_list.png b/asset/icon/Icon32/application_side_list.png new file mode 100644 index 0000000..6cd8e06 Binary files /dev/null and b/asset/icon/Icon32/application_side_list.png differ diff --git a/asset/icon/Icon32/application_side_tree.png b/asset/icon/Icon32/application_side_tree.png new file mode 100644 index 0000000..24dd8c2 Binary files /dev/null and b/asset/icon/Icon32/application_side_tree.png differ diff --git a/asset/icon/Icon32/application_split.png b/asset/icon/Icon32/application_split.png new file mode 100644 index 0000000..e517c0c Binary files /dev/null and b/asset/icon/Icon32/application_split.png differ diff --git a/asset/icon/Icon32/application_tile_horizontal.png b/asset/icon/Icon32/application_tile_horizontal.png new file mode 100644 index 0000000..90960ac Binary files /dev/null and b/asset/icon/Icon32/application_tile_horizontal.png differ diff --git a/asset/icon/Icon32/application_tile_vertical.png b/asset/icon/Icon32/application_tile_vertical.png new file mode 100644 index 0000000..4e1ffc9 Binary files /dev/null and b/asset/icon/Icon32/application_tile_vertical.png differ diff --git a/asset/icon/Icon32/application_view_columns.png b/asset/icon/Icon32/application_view_columns.png new file mode 100644 index 0000000..deebfcf Binary files /dev/null and b/asset/icon/Icon32/application_view_columns.png differ diff --git a/asset/icon/Icon32/application_view_detail.png b/asset/icon/Icon32/application_view_detail.png new file mode 100644 index 0000000..2900198 Binary files /dev/null and b/asset/icon/Icon32/application_view_detail.png differ diff --git a/asset/icon/Icon32/application_view_gallery.png b/asset/icon/Icon32/application_view_gallery.png new file mode 100644 index 0000000..b67ae38 Binary files /dev/null and b/asset/icon/Icon32/application_view_gallery.png differ diff --git a/asset/icon/Icon32/application_view_icons.png b/asset/icon/Icon32/application_view_icons.png new file mode 100644 index 0000000..1dce258 Binary files /dev/null and b/asset/icon/Icon32/application_view_icons.png differ diff --git a/asset/icon/Icon32/application_view_list.png b/asset/icon/Icon32/application_view_list.png new file mode 100644 index 0000000..f25da3d Binary files /dev/null and b/asset/icon/Icon32/application_view_list.png differ diff --git a/asset/icon/Icon32/application_view_tile.png b/asset/icon/Icon32/application_view_tile.png new file mode 100644 index 0000000..3763e0b Binary files /dev/null and b/asset/icon/Icon32/application_view_tile.png differ diff --git a/asset/icon/Icon32/application_xp.png b/asset/icon/Icon32/application_xp.png new file mode 100644 index 0000000..192cf8e Binary files /dev/null and b/asset/icon/Icon32/application_xp.png differ diff --git a/asset/icon/Icon32/application_xp_terminal.png b/asset/icon/Icon32/application_xp_terminal.png new file mode 100644 index 0000000..cc1dd5e Binary files /dev/null and b/asset/icon/Icon32/application_xp_terminal.png differ diff --git a/asset/icon/Icon32/apply_to_all.png b/asset/icon/Icon32/apply_to_all.png new file mode 100644 index 0000000..ef16de3 Binary files /dev/null and b/asset/icon/Icon32/apply_to_all.png differ diff --git a/asset/icon/Icon32/arch_linux.png b/asset/icon/Icon32/arch_linux.png new file mode 100644 index 0000000..e0f008f Binary files /dev/null and b/asset/icon/Icon32/arch_linux.png differ diff --git a/asset/icon/Icon32/areachart.png b/asset/icon/Icon32/areachart.png new file mode 100644 index 0000000..008b661 Binary files /dev/null and b/asset/icon/Icon32/areachart.png differ diff --git a/asset/icon/Icon32/arrow_branch.png b/asset/icon/Icon32/arrow_branch.png new file mode 100644 index 0000000..d00c63c Binary files /dev/null and b/asset/icon/Icon32/arrow_branch.png differ diff --git a/asset/icon/Icon32/arrow_divide.png b/asset/icon/Icon32/arrow_divide.png new file mode 100644 index 0000000..b31f4c8 Binary files /dev/null and b/asset/icon/Icon32/arrow_divide.png differ diff --git a/asset/icon/Icon32/arrow_down.png b/asset/icon/Icon32/arrow_down.png new file mode 100644 index 0000000..2aa47f5 Binary files /dev/null and b/asset/icon/Icon32/arrow_down.png differ diff --git a/asset/icon/Icon32/arrow_in.png b/asset/icon/Icon32/arrow_in.png new file mode 100644 index 0000000..3702f29 Binary files /dev/null and b/asset/icon/Icon32/arrow_in.png differ diff --git a/asset/icon/Icon32/arrow_inout.png b/asset/icon/Icon32/arrow_inout.png new file mode 100644 index 0000000..69a1c3b Binary files /dev/null and b/asset/icon/Icon32/arrow_inout.png differ diff --git a/asset/icon/Icon32/arrow_join.png b/asset/icon/Icon32/arrow_join.png new file mode 100644 index 0000000..7dbeeb0 Binary files /dev/null and b/asset/icon/Icon32/arrow_join.png differ diff --git a/asset/icon/Icon32/arrow_left.png b/asset/icon/Icon32/arrow_left.png new file mode 100644 index 0000000..a7f6e91 Binary files /dev/null and b/asset/icon/Icon32/arrow_left.png differ diff --git a/asset/icon/Icon32/arrow_merge.png b/asset/icon/Icon32/arrow_merge.png new file mode 100644 index 0000000..4232acf Binary files /dev/null and b/asset/icon/Icon32/arrow_merge.png differ diff --git a/asset/icon/Icon32/arrow_out.png b/asset/icon/Icon32/arrow_out.png new file mode 100644 index 0000000..8a96a53 Binary files /dev/null and b/asset/icon/Icon32/arrow_out.png differ diff --git a/asset/icon/Icon32/arrow_redo.png b/asset/icon/Icon32/arrow_redo.png new file mode 100644 index 0000000..c80608a Binary files /dev/null and b/asset/icon/Icon32/arrow_redo.png differ diff --git a/asset/icon/Icon32/arrow_refresh.png b/asset/icon/Icon32/arrow_refresh.png new file mode 100644 index 0000000..fdf20e2 Binary files /dev/null and b/asset/icon/Icon32/arrow_refresh.png differ diff --git a/asset/icon/Icon32/arrow_refresh_small.png b/asset/icon/Icon32/arrow_refresh_small.png new file mode 100644 index 0000000..ce42c12 Binary files /dev/null and b/asset/icon/Icon32/arrow_refresh_small.png differ diff --git a/asset/icon/Icon32/arrow_repeat.png b/asset/icon/Icon32/arrow_repeat.png new file mode 100644 index 0000000..8a40b8f Binary files /dev/null and b/asset/icon/Icon32/arrow_repeat.png differ diff --git a/asset/icon/Icon32/arrow_repeat_once.png b/asset/icon/Icon32/arrow_repeat_once.png new file mode 100644 index 0000000..6a0ef15 Binary files /dev/null and b/asset/icon/Icon32/arrow_repeat_once.png differ diff --git a/asset/icon/Icon32/arrow_right.png b/asset/icon/Icon32/arrow_right.png new file mode 100644 index 0000000..036b9e2 Binary files /dev/null and b/asset/icon/Icon32/arrow_right.png differ diff --git a/asset/icon/Icon32/arrow_rotate_anticlockwise.png b/asset/icon/Icon32/arrow_rotate_anticlockwise.png new file mode 100644 index 0000000..204535a Binary files /dev/null and b/asset/icon/Icon32/arrow_rotate_anticlockwise.png differ diff --git a/asset/icon/Icon32/arrow_rotate_clockwise.png b/asset/icon/Icon32/arrow_rotate_clockwise.png new file mode 100644 index 0000000..9d9f348 Binary files /dev/null and b/asset/icon/Icon32/arrow_rotate_clockwise.png differ diff --git a/asset/icon/Icon32/arrow_switch.png b/asset/icon/Icon32/arrow_switch.png new file mode 100644 index 0000000..f47565b Binary files /dev/null and b/asset/icon/Icon32/arrow_switch.png differ diff --git a/asset/icon/Icon32/arrow_turn_left.png b/asset/icon/Icon32/arrow_turn_left.png new file mode 100644 index 0000000..c038436 Binary files /dev/null and b/asset/icon/Icon32/arrow_turn_left.png differ diff --git a/asset/icon/Icon32/arrow_turn_right.png b/asset/icon/Icon32/arrow_turn_right.png new file mode 100644 index 0000000..30ed09e Binary files /dev/null and b/asset/icon/Icon32/arrow_turn_right.png differ diff --git a/asset/icon/Icon32/arrow_undo.png b/asset/icon/Icon32/arrow_undo.png new file mode 100644 index 0000000..be4f8e9 Binary files /dev/null and b/asset/icon/Icon32/arrow_undo.png differ diff --git a/asset/icon/Icon32/arrow_up.png b/asset/icon/Icon32/arrow_up.png new file mode 100644 index 0000000..6c463bc Binary files /dev/null and b/asset/icon/Icon32/arrow_up.png differ diff --git a/asset/icon/Icon32/artwork.png b/asset/icon/Icon32/artwork.png new file mode 100644 index 0000000..c15a002 Binary files /dev/null and b/asset/icon/Icon32/artwork.png differ diff --git a/asset/icon/Icon32/ask_and_answer.png b/asset/icon/Icon32/ask_and_answer.png new file mode 100644 index 0000000..6bab9fd Binary files /dev/null and b/asset/icon/Icon32/ask_and_answer.png differ diff --git a/asset/icon/Icon32/assembled_diagram.png b/asset/icon/Icon32/assembled_diagram.png new file mode 100644 index 0000000..05476c7 Binary files /dev/null and b/asset/icon/Icon32/assembled_diagram.png differ diff --git a/asset/icon/Icon32/asterisk_orange.png b/asset/icon/Icon32/asterisk_orange.png new file mode 100644 index 0000000..12baca5 Binary files /dev/null and b/asset/icon/Icon32/asterisk_orange.png differ diff --git a/asset/icon/Icon32/asterisk_yellow.png b/asset/icon/Icon32/asterisk_yellow.png new file mode 100644 index 0000000..a41c783 Binary files /dev/null and b/asset/icon/Icon32/asterisk_yellow.png differ diff --git a/asset/icon/Icon32/at_sign.png b/asset/icon/Icon32/at_sign.png new file mode 100644 index 0000000..e34a156 Binary files /dev/null and b/asset/icon/Icon32/at_sign.png differ diff --git a/asset/icon/Icon32/atm.png b/asset/icon/Icon32/atm.png new file mode 100644 index 0000000..250e323 Binary files /dev/null and b/asset/icon/Icon32/atm.png differ diff --git a/asset/icon/Icon32/attach.png b/asset/icon/Icon32/attach.png new file mode 100644 index 0000000..398fabe Binary files /dev/null and b/asset/icon/Icon32/attach.png differ diff --git a/asset/icon/Icon32/attributes_display.png b/asset/icon/Icon32/attributes_display.png new file mode 100644 index 0000000..39af4be Binary files /dev/null and b/asset/icon/Icon32/attributes_display.png differ diff --git a/asset/icon/Icon32/attribution.png b/asset/icon/Icon32/attribution.png new file mode 100644 index 0000000..e4aae4b Binary files /dev/null and b/asset/icon/Icon32/attribution.png differ diff --git a/asset/icon/Icon32/auction_hammer_gavel.png b/asset/icon/Icon32/auction_hammer_gavel.png new file mode 100644 index 0000000..c27c3f5 Binary files /dev/null and b/asset/icon/Icon32/auction_hammer_gavel.png differ diff --git a/asset/icon/Icon32/autoarchieve_settings.png b/asset/icon/Icon32/autoarchieve_settings.png new file mode 100644 index 0000000..2c7b063 Binary files /dev/null and b/asset/icon/Icon32/autoarchieve_settings.png differ diff --git a/asset/icon/Icon32/autoresponders.png b/asset/icon/Icon32/autoresponders.png new file mode 100644 index 0000000..6df774d Binary files /dev/null and b/asset/icon/Icon32/autoresponders.png differ diff --git a/asset/icon/Icon32/autos.png b/asset/icon/Icon32/autos.png new file mode 100644 index 0000000..0da020a Binary files /dev/null and b/asset/icon/Icon32/autos.png differ diff --git a/asset/icon/Icon32/award_star_add.png b/asset/icon/Icon32/award_star_add.png new file mode 100644 index 0000000..4a735e8 Binary files /dev/null and b/asset/icon/Icon32/award_star_add.png differ diff --git a/asset/icon/Icon32/award_star_bronze_1.png b/asset/icon/Icon32/award_star_bronze_1.png new file mode 100644 index 0000000..af0644a Binary files /dev/null and b/asset/icon/Icon32/award_star_bronze_1.png differ diff --git a/asset/icon/Icon32/award_star_bronze_2.png b/asset/icon/Icon32/award_star_bronze_2.png new file mode 100644 index 0000000..7271c67 Binary files /dev/null and b/asset/icon/Icon32/award_star_bronze_2.png differ diff --git a/asset/icon/Icon32/award_star_bronze_3.png b/asset/icon/Icon32/award_star_bronze_3.png new file mode 100644 index 0000000..ad91e75 Binary files /dev/null and b/asset/icon/Icon32/award_star_bronze_3.png differ diff --git a/asset/icon/Icon32/award_star_delete.png b/asset/icon/Icon32/award_star_delete.png new file mode 100644 index 0000000..de30d25 Binary files /dev/null and b/asset/icon/Icon32/award_star_delete.png differ diff --git a/asset/icon/Icon32/award_star_gold_1.png b/asset/icon/Icon32/award_star_gold_1.png new file mode 100644 index 0000000..8282847 Binary files /dev/null and b/asset/icon/Icon32/award_star_gold_1.png differ diff --git a/asset/icon/Icon32/award_star_gold_2.png b/asset/icon/Icon32/award_star_gold_2.png new file mode 100644 index 0000000..c88f7ad Binary files /dev/null and b/asset/icon/Icon32/award_star_gold_2.png differ diff --git a/asset/icon/Icon32/award_star_gold_3.png b/asset/icon/Icon32/award_star_gold_3.png new file mode 100644 index 0000000..d9c6cb5 Binary files /dev/null and b/asset/icon/Icon32/award_star_gold_3.png differ diff --git a/asset/icon/Icon32/award_star_silver_1.png b/asset/icon/Icon32/award_star_silver_1.png new file mode 100644 index 0000000..3336d42 Binary files /dev/null and b/asset/icon/Icon32/award_star_silver_1.png differ diff --git a/asset/icon/Icon32/award_star_silver_2.png b/asset/icon/Icon32/award_star_silver_2.png new file mode 100644 index 0000000..31b96df Binary files /dev/null and b/asset/icon/Icon32/award_star_silver_2.png differ diff --git a/asset/icon/Icon32/award_star_silver_3.png b/asset/icon/Icon32/award_star_silver_3.png new file mode 100644 index 0000000..58a538d Binary files /dev/null and b/asset/icon/Icon32/award_star_silver_3.png differ diff --git a/asset/icon/Icon32/awstats.png b/asset/icon/Icon32/awstats.png new file mode 100644 index 0000000..02b5d54 Binary files /dev/null and b/asset/icon/Icon32/awstats.png differ diff --git a/asset/icon/Icon32/ax.png b/asset/icon/Icon32/ax.png new file mode 100644 index 0000000..4016286 Binary files /dev/null and b/asset/icon/Icon32/ax.png differ diff --git a/asset/icon/Icon32/baby_bottle.png b/asset/icon/Icon32/baby_bottle.png new file mode 100644 index 0000000..2e5630c Binary files /dev/null and b/asset/icon/Icon32/baby_bottle.png differ diff --git a/asset/icon/Icon32/backpack.png b/asset/icon/Icon32/backpack.png new file mode 100644 index 0000000..ba5286a Binary files /dev/null and b/asset/icon/Icon32/backpack.png differ diff --git a/asset/icon/Icon32/backup_manager.png b/asset/icon/Icon32/backup_manager.png new file mode 100644 index 0000000..584ee6a Binary files /dev/null and b/asset/icon/Icon32/backup_manager.png differ diff --git a/asset/icon/Icon32/backup_wizard.png b/asset/icon/Icon32/backup_wizard.png new file mode 100644 index 0000000..ef5b280 Binary files /dev/null and b/asset/icon/Icon32/backup_wizard.png differ diff --git a/asset/icon/Icon32/backups.png b/asset/icon/Icon32/backups.png new file mode 100644 index 0000000..41b14aa Binary files /dev/null and b/asset/icon/Icon32/backups.png differ diff --git a/asset/icon/Icon32/baggage_cart.png b/asset/icon/Icon32/baggage_cart.png new file mode 100644 index 0000000..3cc25f1 Binary files /dev/null and b/asset/icon/Icon32/baggage_cart.png differ diff --git a/asset/icon/Icon32/baggage_cart_box.png b/asset/icon/Icon32/baggage_cart_box.png new file mode 100644 index 0000000..5067dc5 Binary files /dev/null and b/asset/icon/Icon32/baggage_cart_box.png differ diff --git a/asset/icon/Icon32/balance.png b/asset/icon/Icon32/balance.png new file mode 100644 index 0000000..02a0116 Binary files /dev/null and b/asset/icon/Icon32/balance.png differ diff --git a/asset/icon/Icon32/balance_unbalance.png b/asset/icon/Icon32/balance_unbalance.png new file mode 100644 index 0000000..976a793 Binary files /dev/null and b/asset/icon/Icon32/balance_unbalance.png differ diff --git a/asset/icon/Icon32/ballon.png b/asset/icon/Icon32/ballon.png new file mode 100644 index 0000000..87c3c04 Binary files /dev/null and b/asset/icon/Icon32/ballon.png differ diff --git a/asset/icon/Icon32/baloon.png b/asset/icon/Icon32/baloon.png new file mode 100644 index 0000000..e6582c6 Binary files /dev/null and b/asset/icon/Icon32/baloon.png differ diff --git a/asset/icon/Icon32/baloon_2.png b/asset/icon/Icon32/baloon_2.png new file mode 100644 index 0000000..dc0ae8c Binary files /dev/null and b/asset/icon/Icon32/baloon_2.png differ diff --git a/asset/icon/Icon32/baloon_2_empty.png b/asset/icon/Icon32/baloon_2_empty.png new file mode 100644 index 0000000..b1772a1 Binary files /dev/null and b/asset/icon/Icon32/baloon_2_empty.png differ diff --git a/asset/icon/Icon32/bamboo.png b/asset/icon/Icon32/bamboo.png new file mode 100644 index 0000000..71a56f9 Binary files /dev/null and b/asset/icon/Icon32/bamboo.png differ diff --git a/asset/icon/Icon32/bamboos.png b/asset/icon/Icon32/bamboos.png new file mode 100644 index 0000000..fb9a4dd Binary files /dev/null and b/asset/icon/Icon32/bamboos.png differ diff --git a/asset/icon/Icon32/bandaid.png b/asset/icon/Icon32/bandaid.png new file mode 100644 index 0000000..a87c014 Binary files /dev/null and b/asset/icon/Icon32/bandaid.png differ diff --git a/asset/icon/Icon32/bandwith.png b/asset/icon/Icon32/bandwith.png new file mode 100644 index 0000000..9216261 Binary files /dev/null and b/asset/icon/Icon32/bandwith.png differ diff --git a/asset/icon/Icon32/bank.png b/asset/icon/Icon32/bank.png new file mode 100644 index 0000000..235bd00 Binary files /dev/null and b/asset/icon/Icon32/bank.png differ diff --git a/asset/icon/Icon32/barchart.png b/asset/icon/Icon32/barchart.png new file mode 100644 index 0000000..ca6b2a6 Binary files /dev/null and b/asset/icon/Icon32/barchart.png differ diff --git a/asset/icon/Icon32/barcode.png b/asset/icon/Icon32/barcode.png new file mode 100644 index 0000000..3360dd8 Binary files /dev/null and b/asset/icon/Icon32/barcode.png differ diff --git a/asset/icon/Icon32/barcode_2d.png b/asset/icon/Icon32/barcode_2d.png new file mode 100644 index 0000000..ce75d2d Binary files /dev/null and b/asset/icon/Icon32/barcode_2d.png differ diff --git a/asset/icon/Icon32/basic_cpanel_wmh_setup.png b/asset/icon/Icon32/basic_cpanel_wmh_setup.png new file mode 100644 index 0000000..ba261fc Binary files /dev/null and b/asset/icon/Icon32/basic_cpanel_wmh_setup.png differ diff --git a/asset/icon/Icon32/basket.png b/asset/icon/Icon32/basket.png new file mode 100644 index 0000000..edd35f1 Binary files /dev/null and b/asset/icon/Icon32/basket.png differ diff --git a/asset/icon/Icon32/basket_add.png b/asset/icon/Icon32/basket_add.png new file mode 100644 index 0000000..1fd75e0 Binary files /dev/null and b/asset/icon/Icon32/basket_add.png differ diff --git a/asset/icon/Icon32/basket_delete.png b/asset/icon/Icon32/basket_delete.png new file mode 100644 index 0000000..4ccce4d Binary files /dev/null and b/asset/icon/Icon32/basket_delete.png differ diff --git a/asset/icon/Icon32/basket_edit.png b/asset/icon/Icon32/basket_edit.png new file mode 100644 index 0000000..9d566af Binary files /dev/null and b/asset/icon/Icon32/basket_edit.png differ diff --git a/asset/icon/Icon32/basket_error.png b/asset/icon/Icon32/basket_error.png new file mode 100644 index 0000000..9581797 Binary files /dev/null and b/asset/icon/Icon32/basket_error.png differ diff --git a/asset/icon/Icon32/basket_full.png b/asset/icon/Icon32/basket_full.png new file mode 100644 index 0000000..314f2ac Binary files /dev/null and b/asset/icon/Icon32/basket_full.png differ diff --git a/asset/icon/Icon32/basket_go.png b/asset/icon/Icon32/basket_go.png new file mode 100644 index 0000000..fc63a9d Binary files /dev/null and b/asset/icon/Icon32/basket_go.png differ diff --git a/asset/icon/Icon32/basket_put.png b/asset/icon/Icon32/basket_put.png new file mode 100644 index 0000000..66e7fce Binary files /dev/null and b/asset/icon/Icon32/basket_put.png differ diff --git a/asset/icon/Icon32/basket_remove.png b/asset/icon/Icon32/basket_remove.png new file mode 100644 index 0000000..0d8c5a3 Binary files /dev/null and b/asset/icon/Icon32/basket_remove.png differ diff --git a/asset/icon/Icon32/basket_shopping.png b/asset/icon/Icon32/basket_shopping.png new file mode 100644 index 0000000..e430354 Binary files /dev/null and b/asset/icon/Icon32/basket_shopping.png differ diff --git a/asset/icon/Icon32/baton.png b/asset/icon/Icon32/baton.png new file mode 100644 index 0000000..5b4338c Binary files /dev/null and b/asset/icon/Icon32/baton.png differ diff --git a/asset/icon/Icon32/battery.png b/asset/icon/Icon32/battery.png new file mode 100644 index 0000000..57a95b8 Binary files /dev/null and b/asset/icon/Icon32/battery.png differ diff --git a/asset/icon/Icon32/battery_charge.png b/asset/icon/Icon32/battery_charge.png new file mode 100644 index 0000000..fd75a3a Binary files /dev/null and b/asset/icon/Icon32/battery_charge.png differ diff --git a/asset/icon/Icon32/battery_full.png b/asset/icon/Icon32/battery_full.png new file mode 100644 index 0000000..c9e051b Binary files /dev/null and b/asset/icon/Icon32/battery_full.png differ diff --git a/asset/icon/Icon32/battery_half.png b/asset/icon/Icon32/battery_half.png new file mode 100644 index 0000000..0ad5daa Binary files /dev/null and b/asset/icon/Icon32/battery_half.png differ diff --git a/asset/icon/Icon32/battery_low.png b/asset/icon/Icon32/battery_low.png new file mode 100644 index 0000000..da9b7e8 Binary files /dev/null and b/asset/icon/Icon32/battery_low.png differ diff --git a/asset/icon/Icon32/battery_plug.png b/asset/icon/Icon32/battery_plug.png new file mode 100644 index 0000000..65ce86b Binary files /dev/null and b/asset/icon/Icon32/battery_plug.png differ diff --git a/asset/icon/Icon32/beaker.png b/asset/icon/Icon32/beaker.png new file mode 100644 index 0000000..1fa9517 Binary files /dev/null and b/asset/icon/Icon32/beaker.png differ diff --git a/asset/icon/Icon32/beaker_empty.png b/asset/icon/Icon32/beaker_empty.png new file mode 100644 index 0000000..355222b Binary files /dev/null and b/asset/icon/Icon32/beaker_empty.png differ diff --git a/asset/icon/Icon32/bean.png b/asset/icon/Icon32/bean.png new file mode 100644 index 0000000..9faed42 Binary files /dev/null and b/asset/icon/Icon32/bean.png differ diff --git a/asset/icon/Icon32/bed.png b/asset/icon/Icon32/bed.png new file mode 100644 index 0000000..f9ac6cc Binary files /dev/null and b/asset/icon/Icon32/bed.png differ diff --git a/asset/icon/Icon32/bedo.png b/asset/icon/Icon32/bedo.png new file mode 100644 index 0000000..acad849 Binary files /dev/null and b/asset/icon/Icon32/bedo.png differ diff --git a/asset/icon/Icon32/beer.png b/asset/icon/Icon32/beer.png new file mode 100644 index 0000000..66b87d0 Binary files /dev/null and b/asset/icon/Icon32/beer.png differ diff --git a/asset/icon/Icon32/before_change.png b/asset/icon/Icon32/before_change.png new file mode 100644 index 0000000..50ebd62 Binary files /dev/null and b/asset/icon/Icon32/before_change.png differ diff --git a/asset/icon/Icon32/before_delete.png b/asset/icon/Icon32/before_delete.png new file mode 100644 index 0000000..69aeae6 Binary files /dev/null and b/asset/icon/Icon32/before_delete.png differ diff --git a/asset/icon/Icon32/bell.png b/asset/icon/Icon32/bell.png new file mode 100644 index 0000000..663e246 Binary files /dev/null and b/asset/icon/Icon32/bell.png differ diff --git a/asset/icon/Icon32/bell_add.png b/asset/icon/Icon32/bell_add.png new file mode 100644 index 0000000..0177886 Binary files /dev/null and b/asset/icon/Icon32/bell_add.png differ diff --git a/asset/icon/Icon32/bell_delete.png b/asset/icon/Icon32/bell_delete.png new file mode 100644 index 0000000..56b5d03 Binary files /dev/null and b/asset/icon/Icon32/bell_delete.png differ diff --git a/asset/icon/Icon32/bell_error.png b/asset/icon/Icon32/bell_error.png new file mode 100644 index 0000000..7c2cc2d Binary files /dev/null and b/asset/icon/Icon32/bell_error.png differ diff --git a/asset/icon/Icon32/bell_go.png b/asset/icon/Icon32/bell_go.png new file mode 100644 index 0000000..75342d0 Binary files /dev/null and b/asset/icon/Icon32/bell_go.png differ diff --git a/asset/icon/Icon32/bell_link.png b/asset/icon/Icon32/bell_link.png new file mode 100644 index 0000000..e824a58 Binary files /dev/null and b/asset/icon/Icon32/bell_link.png differ diff --git a/asset/icon/Icon32/bibliography.png b/asset/icon/Icon32/bibliography.png new file mode 100644 index 0000000..6755826 Binary files /dev/null and b/asset/icon/Icon32/bibliography.png differ diff --git a/asset/icon/Icon32/billboard_empty.png b/asset/icon/Icon32/billboard_empty.png new file mode 100644 index 0000000..2240c25 Binary files /dev/null and b/asset/icon/Icon32/billboard_empty.png differ diff --git a/asset/icon/Icon32/billboard_picture.png b/asset/icon/Icon32/billboard_picture.png new file mode 100644 index 0000000..54ddb8d Binary files /dev/null and b/asset/icon/Icon32/billboard_picture.png differ diff --git a/asset/icon/Icon32/billiard_marker.png b/asset/icon/Icon32/billiard_marker.png new file mode 100644 index 0000000..e7d0ef5 Binary files /dev/null and b/asset/icon/Icon32/billiard_marker.png differ diff --git a/asset/icon/Icon32/bin.png b/asset/icon/Icon32/bin.png new file mode 100644 index 0000000..8bb7f37 Binary files /dev/null and b/asset/icon/Icon32/bin.png differ diff --git a/asset/icon/Icon32/bin_closed.png b/asset/icon/Icon32/bin_closed.png new file mode 100644 index 0000000..18b0d91 Binary files /dev/null and b/asset/icon/Icon32/bin_closed.png differ diff --git a/asset/icon/Icon32/bin_empty.png b/asset/icon/Icon32/bin_empty.png new file mode 100644 index 0000000..9bb299d Binary files /dev/null and b/asset/icon/Icon32/bin_empty.png differ diff --git a/asset/icon/Icon32/bin_recycle.png b/asset/icon/Icon32/bin_recycle.png new file mode 100644 index 0000000..c11fbfb Binary files /dev/null and b/asset/icon/Icon32/bin_recycle.png differ diff --git a/asset/icon/Icon32/bios.png b/asset/icon/Icon32/bios.png new file mode 100644 index 0000000..25b6125 Binary files /dev/null and b/asset/icon/Icon32/bios.png differ diff --git a/asset/icon/Icon32/blackberry.png b/asset/icon/Icon32/blackberry.png new file mode 100644 index 0000000..a2db311 Binary files /dev/null and b/asset/icon/Icon32/blackberry.png differ diff --git a/asset/icon/Icon32/blackberry_messenger.png b/asset/icon/Icon32/blackberry_messenger.png new file mode 100644 index 0000000..39eee89 Binary files /dev/null and b/asset/icon/Icon32/blackberry_messenger.png differ diff --git a/asset/icon/Icon32/blackberry_protect.png b/asset/icon/Icon32/blackberry_protect.png new file mode 100644 index 0000000..9d7703b Binary files /dev/null and b/asset/icon/Icon32/blackberry_protect.png differ diff --git a/asset/icon/Icon32/blackberry_white.png b/asset/icon/Icon32/blackberry_white.png new file mode 100644 index 0000000..f8eb562 Binary files /dev/null and b/asset/icon/Icon32/blackberry_white.png differ diff --git a/asset/icon/Icon32/blackboard_drawing.png b/asset/icon/Icon32/blackboard_drawing.png new file mode 100644 index 0000000..ffad7cc Binary files /dev/null and b/asset/icon/Icon32/blackboard_drawing.png differ diff --git a/asset/icon/Icon32/blackboard_empty.png b/asset/icon/Icon32/blackboard_empty.png new file mode 100644 index 0000000..302d3ab Binary files /dev/null and b/asset/icon/Icon32/blackboard_empty.png differ diff --git a/asset/icon/Icon32/blackboard_steps.png b/asset/icon/Icon32/blackboard_steps.png new file mode 100644 index 0000000..92f68e6 Binary files /dev/null and b/asset/icon/Icon32/blackboard_steps.png differ diff --git a/asset/icon/Icon32/blackboard_sum.png b/asset/icon/Icon32/blackboard_sum.png new file mode 100644 index 0000000..43ad0ab Binary files /dev/null and b/asset/icon/Icon32/blackboard_sum.png differ diff --git a/asset/icon/Icon32/blank_report.png b/asset/icon/Icon32/blank_report.png new file mode 100644 index 0000000..d95eda1 Binary files /dev/null and b/asset/icon/Icon32/blank_report.png differ diff --git a/asset/icon/Icon32/blogger.png b/asset/icon/Icon32/blogger.png new file mode 100644 index 0000000..9a7bc55 Binary files /dev/null and b/asset/icon/Icon32/blogger.png differ diff --git a/asset/icon/Icon32/blogs.png b/asset/icon/Icon32/blogs.png new file mode 100644 index 0000000..a14118e Binary files /dev/null and b/asset/icon/Icon32/blogs.png differ diff --git a/asset/icon/Icon32/blueprint.png b/asset/icon/Icon32/blueprint.png new file mode 100644 index 0000000..0f9310c Binary files /dev/null and b/asset/icon/Icon32/blueprint.png differ diff --git a/asset/icon/Icon32/blueprint_horizontal.png b/asset/icon/Icon32/blueprint_horizontal.png new file mode 100644 index 0000000..05f7162 Binary files /dev/null and b/asset/icon/Icon32/blueprint_horizontal.png differ diff --git a/asset/icon/Icon32/blueprints.png b/asset/icon/Icon32/blueprints.png new file mode 100644 index 0000000..96d7e08 Binary files /dev/null and b/asset/icon/Icon32/blueprints.png differ diff --git a/asset/icon/Icon32/bluetooth.png b/asset/icon/Icon32/bluetooth.png new file mode 100644 index 0000000..1e9f313 Binary files /dev/null and b/asset/icon/Icon32/bluetooth.png differ diff --git a/asset/icon/Icon32/board_game.png b/asset/icon/Icon32/board_game.png new file mode 100644 index 0000000..33e3df8 Binary files /dev/null and b/asset/icon/Icon32/board_game.png differ diff --git a/asset/icon/Icon32/bomb.png b/asset/icon/Icon32/bomb.png new file mode 100644 index 0000000..096abd3 Binary files /dev/null and b/asset/icon/Icon32/bomb.png differ diff --git a/asset/icon/Icon32/book.png b/asset/icon/Icon32/book.png new file mode 100644 index 0000000..45c9edf Binary files /dev/null and b/asset/icon/Icon32/book.png differ diff --git a/asset/icon/Icon32/book_add.png b/asset/icon/Icon32/book_add.png new file mode 100644 index 0000000..4ac48cc Binary files /dev/null and b/asset/icon/Icon32/book_add.png differ diff --git a/asset/icon/Icon32/book_addresses.png b/asset/icon/Icon32/book_addresses.png new file mode 100644 index 0000000..7902464 Binary files /dev/null and b/asset/icon/Icon32/book_addresses.png differ diff --git a/asset/icon/Icon32/book_delete.png b/asset/icon/Icon32/book_delete.png new file mode 100644 index 0000000..11e81d1 Binary files /dev/null and b/asset/icon/Icon32/book_delete.png differ diff --git a/asset/icon/Icon32/book_edit.png b/asset/icon/Icon32/book_edit.png new file mode 100644 index 0000000..ca46fb7 Binary files /dev/null and b/asset/icon/Icon32/book_edit.png differ diff --git a/asset/icon/Icon32/book_error.png b/asset/icon/Icon32/book_error.png new file mode 100644 index 0000000..45dcf92 Binary files /dev/null and b/asset/icon/Icon32/book_error.png differ diff --git a/asset/icon/Icon32/book_go.png b/asset/icon/Icon32/book_go.png new file mode 100644 index 0000000..e0d7f5c Binary files /dev/null and b/asset/icon/Icon32/book_go.png differ diff --git a/asset/icon/Icon32/book_keeping.png b/asset/icon/Icon32/book_keeping.png new file mode 100644 index 0000000..2cafb89 Binary files /dev/null and b/asset/icon/Icon32/book_keeping.png differ diff --git a/asset/icon/Icon32/book_key.png b/asset/icon/Icon32/book_key.png new file mode 100644 index 0000000..fda457e Binary files /dev/null and b/asset/icon/Icon32/book_key.png differ diff --git a/asset/icon/Icon32/book_link.png b/asset/icon/Icon32/book_link.png new file mode 100644 index 0000000..e1cea3e Binary files /dev/null and b/asset/icon/Icon32/book_link.png differ diff --git a/asset/icon/Icon32/book_next.png b/asset/icon/Icon32/book_next.png new file mode 100644 index 0000000..c60fc86 Binary files /dev/null and b/asset/icon/Icon32/book_next.png differ diff --git a/asset/icon/Icon32/book_open.png b/asset/icon/Icon32/book_open.png new file mode 100644 index 0000000..1086fbe Binary files /dev/null and b/asset/icon/Icon32/book_open.png differ diff --git a/asset/icon/Icon32/book_picture.png b/asset/icon/Icon32/book_picture.png new file mode 100644 index 0000000..136bf03 Binary files /dev/null and b/asset/icon/Icon32/book_picture.png differ diff --git a/asset/icon/Icon32/book_previous.png b/asset/icon/Icon32/book_previous.png new file mode 100644 index 0000000..65bf1d0 Binary files /dev/null and b/asset/icon/Icon32/book_previous.png differ diff --git a/asset/icon/Icon32/book_spelling.png b/asset/icon/Icon32/book_spelling.png new file mode 100644 index 0000000..19d451b Binary files /dev/null and b/asset/icon/Icon32/book_spelling.png differ diff --git a/asset/icon/Icon32/bookmark.png b/asset/icon/Icon32/bookmark.png new file mode 100644 index 0000000..5b7a7ba Binary files /dev/null and b/asset/icon/Icon32/bookmark.png differ diff --git a/asset/icon/Icon32/bookmark_red.png b/asset/icon/Icon32/bookmark_red.png new file mode 100644 index 0000000..9896084 Binary files /dev/null and b/asset/icon/Icon32/bookmark_red.png differ diff --git a/asset/icon/Icon32/books.png b/asset/icon/Icon32/books.png new file mode 100644 index 0000000..9c520c3 Binary files /dev/null and b/asset/icon/Icon32/books.png differ diff --git a/asset/icon/Icon32/books_stack.png b/asset/icon/Icon32/books_stack.png new file mode 100644 index 0000000..3ae41ef Binary files /dev/null and b/asset/icon/Icon32/books_stack.png differ diff --git a/asset/icon/Icon32/bookshelf.png b/asset/icon/Icon32/bookshelf.png new file mode 100644 index 0000000..f4d8007 Binary files /dev/null and b/asset/icon/Icon32/bookshelf.png differ diff --git a/asset/icon/Icon32/boomerang.png b/asset/icon/Icon32/boomerang.png new file mode 100644 index 0000000..b7dbf9f Binary files /dev/null and b/asset/icon/Icon32/boomerang.png differ diff --git a/asset/icon/Icon32/border_1.png b/asset/icon/Icon32/border_1.png new file mode 100644 index 0000000..8d65ea5 Binary files /dev/null and b/asset/icon/Icon32/border_1.png differ diff --git a/asset/icon/Icon32/border_1_bottom.png b/asset/icon/Icon32/border_1_bottom.png new file mode 100644 index 0000000..1d607bc Binary files /dev/null and b/asset/icon/Icon32/border_1_bottom.png differ diff --git a/asset/icon/Icon32/border_1_hor.png b/asset/icon/Icon32/border_1_hor.png new file mode 100644 index 0000000..813d404 Binary files /dev/null and b/asset/icon/Icon32/border_1_hor.png differ diff --git a/asset/icon/Icon32/border_1_left.png b/asset/icon/Icon32/border_1_left.png new file mode 100644 index 0000000..edc5a69 Binary files /dev/null and b/asset/icon/Icon32/border_1_left.png differ diff --git a/asset/icon/Icon32/border_1_middle.png b/asset/icon/Icon32/border_1_middle.png new file mode 100644 index 0000000..6cbf6af Binary files /dev/null and b/asset/icon/Icon32/border_1_middle.png differ diff --git a/asset/icon/Icon32/border_1_none.png b/asset/icon/Icon32/border_1_none.png new file mode 100644 index 0000000..d8bc1cb Binary files /dev/null and b/asset/icon/Icon32/border_1_none.png differ diff --git a/asset/icon/Icon32/border_1_outer.png b/asset/icon/Icon32/border_1_outer.png new file mode 100644 index 0000000..fd23224 Binary files /dev/null and b/asset/icon/Icon32/border_1_outer.png differ diff --git a/asset/icon/Icon32/border_1_right.png b/asset/icon/Icon32/border_1_right.png new file mode 100644 index 0000000..a101f43 Binary files /dev/null and b/asset/icon/Icon32/border_1_right.png differ diff --git a/asset/icon/Icon32/border_1_top.png b/asset/icon/Icon32/border_1_top.png new file mode 100644 index 0000000..af90971 Binary files /dev/null and b/asset/icon/Icon32/border_1_top.png differ diff --git a/asset/icon/Icon32/border_1_ver.png b/asset/icon/Icon32/border_1_ver.png new file mode 100644 index 0000000..11e7278 Binary files /dev/null and b/asset/icon/Icon32/border_1_ver.png differ diff --git a/asset/icon/Icon32/border_1d_around.png b/asset/icon/Icon32/border_1d_around.png new file mode 100644 index 0000000..2d7eab9 Binary files /dev/null and b/asset/icon/Icon32/border_1d_around.png differ diff --git a/asset/icon/Icon32/border_1d_bottom.png b/asset/icon/Icon32/border_1d_bottom.png new file mode 100644 index 0000000..3820eb4 Binary files /dev/null and b/asset/icon/Icon32/border_1d_bottom.png differ diff --git a/asset/icon/Icon32/border_1d_left.png b/asset/icon/Icon32/border_1d_left.png new file mode 100644 index 0000000..26ab3be Binary files /dev/null and b/asset/icon/Icon32/border_1d_left.png differ diff --git a/asset/icon/Icon32/border_1d_right.png b/asset/icon/Icon32/border_1d_right.png new file mode 100644 index 0000000..5c731ef Binary files /dev/null and b/asset/icon/Icon32/border_1d_right.png differ diff --git a/asset/icon/Icon32/border_1d_top.png b/asset/icon/Icon32/border_1d_top.png new file mode 100644 index 0000000..a9e4fd4 Binary files /dev/null and b/asset/icon/Icon32/border_1d_top.png differ diff --git a/asset/icon/Icon32/border_2_bottom.png b/asset/icon/Icon32/border_2_bottom.png new file mode 100644 index 0000000..87f0097 Binary files /dev/null and b/asset/icon/Icon32/border_2_bottom.png differ diff --git a/asset/icon/Icon32/border_2_left.png b/asset/icon/Icon32/border_2_left.png new file mode 100644 index 0000000..5f07eb9 Binary files /dev/null and b/asset/icon/Icon32/border_2_left.png differ diff --git a/asset/icon/Icon32/border_2_outer.png b/asset/icon/Icon32/border_2_outer.png new file mode 100644 index 0000000..81ce12e Binary files /dev/null and b/asset/icon/Icon32/border_2_outer.png differ diff --git a/asset/icon/Icon32/border_2_right.png b/asset/icon/Icon32/border_2_right.png new file mode 100644 index 0000000..418730d Binary files /dev/null and b/asset/icon/Icon32/border_2_right.png differ diff --git a/asset/icon/Icon32/border_2_top.png b/asset/icon/Icon32/border_2_top.png new file mode 100644 index 0000000..d32c841 Binary files /dev/null and b/asset/icon/Icon32/border_2_top.png differ diff --git a/asset/icon/Icon32/border_color.png b/asset/icon/Icon32/border_color.png new file mode 100644 index 0000000..935f9cf Binary files /dev/null and b/asset/icon/Icon32/border_color.png differ diff --git a/asset/icon/Icon32/border_weight.png b/asset/icon/Icon32/border_weight.png new file mode 100644 index 0000000..382e462 Binary files /dev/null and b/asset/icon/Icon32/border_weight.png differ diff --git a/asset/icon/Icon32/borders_accent.png b/asset/icon/Icon32/borders_accent.png new file mode 100644 index 0000000..b7209cd Binary files /dev/null and b/asset/icon/Icon32/borders_accent.png differ diff --git a/asset/icon/Icon32/bow.png b/asset/icon/Icon32/bow.png new file mode 100644 index 0000000..7e48f7c Binary files /dev/null and b/asset/icon/Icon32/bow.png differ diff --git a/asset/icon/Icon32/box.png b/asset/icon/Icon32/box.png new file mode 100644 index 0000000..5fe4ad6 Binary files /dev/null and b/asset/icon/Icon32/box.png differ diff --git a/asset/icon/Icon32/box_closed.png b/asset/icon/Icon32/box_closed.png new file mode 100644 index 0000000..669b150 Binary files /dev/null and b/asset/icon/Icon32/box_closed.png differ diff --git a/asset/icon/Icon32/box_down.png b/asset/icon/Icon32/box_down.png new file mode 100644 index 0000000..9170c1d Binary files /dev/null and b/asset/icon/Icon32/box_down.png differ diff --git a/asset/icon/Icon32/box_front.png b/asset/icon/Icon32/box_front.png new file mode 100644 index 0000000..4f6e68f Binary files /dev/null and b/asset/icon/Icon32/box_front.png differ diff --git a/asset/icon/Icon32/box_open.png b/asset/icon/Icon32/box_open.png new file mode 100644 index 0000000..ed9a538 Binary files /dev/null and b/asset/icon/Icon32/box_open.png differ diff --git a/asset/icon/Icon32/box_resize.png b/asset/icon/Icon32/box_resize.png new file mode 100644 index 0000000..64dc841 Binary files /dev/null and b/asset/icon/Icon32/box_resize.png differ diff --git a/asset/icon/Icon32/box_resize_actual.png b/asset/icon/Icon32/box_resize_actual.png new file mode 100644 index 0000000..bdfa9ba Binary files /dev/null and b/asset/icon/Icon32/box_resize_actual.png differ diff --git a/asset/icon/Icon32/box_search.png b/asset/icon/Icon32/box_search.png new file mode 100644 index 0000000..6a52ce8 Binary files /dev/null and b/asset/icon/Icon32/box_search.png differ diff --git a/asset/icon/Icon32/boxing_glove.png b/asset/icon/Icon32/boxing_glove.png new file mode 100644 index 0000000..28364cd Binary files /dev/null and b/asset/icon/Icon32/boxing_glove.png differ diff --git a/asset/icon/Icon32/boxtrapper.png b/asset/icon/Icon32/boxtrapper.png new file mode 100644 index 0000000..3953c6a Binary files /dev/null and b/asset/icon/Icon32/boxtrapper.png differ diff --git a/asset/icon/Icon32/brain.png b/asset/icon/Icon32/brain.png new file mode 100644 index 0000000..f3e6482 Binary files /dev/null and b/asset/icon/Icon32/brain.png differ diff --git a/asset/icon/Icon32/brain_trainer.png b/asset/icon/Icon32/brain_trainer.png new file mode 100644 index 0000000..b07117d Binary files /dev/null and b/asset/icon/Icon32/brain_trainer.png differ diff --git a/asset/icon/Icon32/bread.png b/asset/icon/Icon32/bread.png new file mode 100644 index 0000000..4450678 Binary files /dev/null and b/asset/icon/Icon32/bread.png differ diff --git a/asset/icon/Icon32/breadcrumb.png b/asset/icon/Icon32/breadcrumb.png new file mode 100644 index 0000000..6e72912 Binary files /dev/null and b/asset/icon/Icon32/breadcrumb.png differ diff --git a/asset/icon/Icon32/breadcrumb_select.png b/asset/icon/Icon32/breadcrumb_select.png new file mode 100644 index 0000000..9d19269 Binary files /dev/null and b/asset/icon/Icon32/breadcrumb_select.png differ diff --git a/asset/icon/Icon32/breadcrumb_select_current.png b/asset/icon/Icon32/breadcrumb_select_current.png new file mode 100644 index 0000000..2700749 Binary files /dev/null and b/asset/icon/Icon32/breadcrumb_select_current.png differ diff --git a/asset/icon/Icon32/breadcrumb_select_perrent.png b/asset/icon/Icon32/breadcrumb_select_perrent.png new file mode 100644 index 0000000..4973419 Binary files /dev/null and b/asset/icon/Icon32/breadcrumb_select_perrent.png differ diff --git a/asset/icon/Icon32/breeze.png b/asset/icon/Icon32/breeze.png new file mode 100644 index 0000000..394ae94 Binary files /dev/null and b/asset/icon/Icon32/breeze.png differ diff --git a/asset/icon/Icon32/brick.png b/asset/icon/Icon32/brick.png new file mode 100644 index 0000000..b67b1b4 Binary files /dev/null and b/asset/icon/Icon32/brick.png differ diff --git a/asset/icon/Icon32/brick_add.png b/asset/icon/Icon32/brick_add.png new file mode 100644 index 0000000..2479d9b Binary files /dev/null and b/asset/icon/Icon32/brick_add.png differ diff --git a/asset/icon/Icon32/brick_delete.png b/asset/icon/Icon32/brick_delete.png new file mode 100644 index 0000000..c45eacb Binary files /dev/null and b/asset/icon/Icon32/brick_delete.png differ diff --git a/asset/icon/Icon32/brick_edit.png b/asset/icon/Icon32/brick_edit.png new file mode 100644 index 0000000..b8d94f0 Binary files /dev/null and b/asset/icon/Icon32/brick_edit.png differ diff --git a/asset/icon/Icon32/brick_error.png b/asset/icon/Icon32/brick_error.png new file mode 100644 index 0000000..6e84ea9 Binary files /dev/null and b/asset/icon/Icon32/brick_error.png differ diff --git a/asset/icon/Icon32/brick_go.png b/asset/icon/Icon32/brick_go.png new file mode 100644 index 0000000..cd7eee4 Binary files /dev/null and b/asset/icon/Icon32/brick_go.png differ diff --git a/asset/icon/Icon32/brick_link.png b/asset/icon/Icon32/brick_link.png new file mode 100644 index 0000000..661a958 Binary files /dev/null and b/asset/icon/Icon32/brick_link.png differ diff --git a/asset/icon/Icon32/bricks.png b/asset/icon/Icon32/bricks.png new file mode 100644 index 0000000..a453ca0 Binary files /dev/null and b/asset/icon/Icon32/bricks.png differ diff --git a/asset/icon/Icon32/briefcase.png b/asset/icon/Icon32/briefcase.png new file mode 100644 index 0000000..b47c0c3 Binary files /dev/null and b/asset/icon/Icon32/briefcase.png differ diff --git a/asset/icon/Icon32/brightkite.png b/asset/icon/Icon32/brightkite.png new file mode 100644 index 0000000..6dedc69 Binary files /dev/null and b/asset/icon/Icon32/brightkite.png differ diff --git a/asset/icon/Icon32/broadcast_slide_show.png b/asset/icon/Icon32/broadcast_slide_show.png new file mode 100644 index 0000000..2060846 Binary files /dev/null and b/asset/icon/Icon32/broadcast_slide_show.png differ diff --git a/asset/icon/Icon32/broom.png b/asset/icon/Icon32/broom.png new file mode 100644 index 0000000..10e62e6 Binary files /dev/null and b/asset/icon/Icon32/broom.png differ diff --git a/asset/icon/Icon32/brushes.png b/asset/icon/Icon32/brushes.png new file mode 100644 index 0000000..e8d423b Binary files /dev/null and b/asset/icon/Icon32/brushes.png differ diff --git a/asset/icon/Icon32/bubblechart.png b/asset/icon/Icon32/bubblechart.png new file mode 100644 index 0000000..64eaef8 Binary files /dev/null and b/asset/icon/Icon32/bubblechart.png differ diff --git a/asset/icon/Icon32/bucket_truck.png b/asset/icon/Icon32/bucket_truck.png new file mode 100644 index 0000000..281545f Binary files /dev/null and b/asset/icon/Icon32/bucket_truck.png differ diff --git a/asset/icon/Icon32/bug.png b/asset/icon/Icon32/bug.png new file mode 100644 index 0000000..563c364 Binary files /dev/null and b/asset/icon/Icon32/bug.png differ diff --git a/asset/icon/Icon32/bug_add.png b/asset/icon/Icon32/bug_add.png new file mode 100644 index 0000000..8bfe4a4 Binary files /dev/null and b/asset/icon/Icon32/bug_add.png differ diff --git a/asset/icon/Icon32/bug_delete.png b/asset/icon/Icon32/bug_delete.png new file mode 100644 index 0000000..5e1faac Binary files /dev/null and b/asset/icon/Icon32/bug_delete.png differ diff --git a/asset/icon/Icon32/bug_edit.png b/asset/icon/Icon32/bug_edit.png new file mode 100644 index 0000000..285c582 Binary files /dev/null and b/asset/icon/Icon32/bug_edit.png differ diff --git a/asset/icon/Icon32/bug_error.png b/asset/icon/Icon32/bug_error.png new file mode 100644 index 0000000..0d3f4c3 Binary files /dev/null and b/asset/icon/Icon32/bug_error.png differ diff --git a/asset/icon/Icon32/bug_go.png b/asset/icon/Icon32/bug_go.png new file mode 100644 index 0000000..a8f2686 Binary files /dev/null and b/asset/icon/Icon32/bug_go.png differ diff --git a/asset/icon/Icon32/bug_link.png b/asset/icon/Icon32/bug_link.png new file mode 100644 index 0000000..b19e665 Binary files /dev/null and b/asset/icon/Icon32/bug_link.png differ diff --git a/asset/icon/Icon32/building.png b/asset/icon/Icon32/building.png new file mode 100644 index 0000000..01688ea Binary files /dev/null and b/asset/icon/Icon32/building.png differ diff --git a/asset/icon/Icon32/building_add.png b/asset/icon/Icon32/building_add.png new file mode 100644 index 0000000..f033115 Binary files /dev/null and b/asset/icon/Icon32/building_add.png differ diff --git a/asset/icon/Icon32/building_delete.png b/asset/icon/Icon32/building_delete.png new file mode 100644 index 0000000..45824d0 Binary files /dev/null and b/asset/icon/Icon32/building_delete.png differ diff --git a/asset/icon/Icon32/building_edit.png b/asset/icon/Icon32/building_edit.png new file mode 100644 index 0000000..0aae59e Binary files /dev/null and b/asset/icon/Icon32/building_edit.png differ diff --git a/asset/icon/Icon32/building_error.png b/asset/icon/Icon32/building_error.png new file mode 100644 index 0000000..bc7e342 Binary files /dev/null and b/asset/icon/Icon32/building_error.png differ diff --git a/asset/icon/Icon32/building_go.png b/asset/icon/Icon32/building_go.png new file mode 100644 index 0000000..337683c Binary files /dev/null and b/asset/icon/Icon32/building_go.png differ diff --git a/asset/icon/Icon32/building_key.png b/asset/icon/Icon32/building_key.png new file mode 100644 index 0000000..d7d5229 Binary files /dev/null and b/asset/icon/Icon32/building_key.png differ diff --git a/asset/icon/Icon32/building_link.png b/asset/icon/Icon32/building_link.png new file mode 100644 index 0000000..057a81a Binary files /dev/null and b/asset/icon/Icon32/building_link.png differ diff --git a/asset/icon/Icon32/bulb.png b/asset/icon/Icon32/bulb.png new file mode 100644 index 0000000..ba8ddb3 Binary files /dev/null and b/asset/icon/Icon32/bulb.png differ diff --git a/asset/icon/Icon32/bullet_add.png b/asset/icon/Icon32/bullet_add.png new file mode 100644 index 0000000..b748150 Binary files /dev/null and b/asset/icon/Icon32/bullet_add.png differ diff --git a/asset/icon/Icon32/bullet_archive.png b/asset/icon/Icon32/bullet_archive.png new file mode 100644 index 0000000..33f27e6 Binary files /dev/null and b/asset/icon/Icon32/bullet_archive.png differ diff --git a/asset/icon/Icon32/bullet_arrow_bottom.png b/asset/icon/Icon32/bullet_arrow_bottom.png new file mode 100644 index 0000000..9af4c10 Binary files /dev/null and b/asset/icon/Icon32/bullet_arrow_bottom.png differ diff --git a/asset/icon/Icon32/bullet_arrow_down.png b/asset/icon/Icon32/bullet_arrow_down.png new file mode 100644 index 0000000..a690457 Binary files /dev/null and b/asset/icon/Icon32/bullet_arrow_down.png differ diff --git a/asset/icon/Icon32/bullet_arrow_left.png b/asset/icon/Icon32/bullet_arrow_left.png new file mode 100644 index 0000000..fb189d5 Binary files /dev/null and b/asset/icon/Icon32/bullet_arrow_left.png differ diff --git a/asset/icon/Icon32/bullet_arrow_left_2.png b/asset/icon/Icon32/bullet_arrow_left_2.png new file mode 100644 index 0000000..9d5923d Binary files /dev/null and b/asset/icon/Icon32/bullet_arrow_left_2.png differ diff --git a/asset/icon/Icon32/bullet_arrow_right.png b/asset/icon/Icon32/bullet_arrow_right.png new file mode 100644 index 0000000..fdb5c08 Binary files /dev/null and b/asset/icon/Icon32/bullet_arrow_right.png differ diff --git a/asset/icon/Icon32/bullet_arrow_right_2.png b/asset/icon/Icon32/bullet_arrow_right_2.png new file mode 100644 index 0000000..f4183a0 Binary files /dev/null and b/asset/icon/Icon32/bullet_arrow_right_2.png differ diff --git a/asset/icon/Icon32/bullet_arrow_top.png b/asset/icon/Icon32/bullet_arrow_top.png new file mode 100644 index 0000000..f6b01cf Binary files /dev/null and b/asset/icon/Icon32/bullet_arrow_top.png differ diff --git a/asset/icon/Icon32/bullet_arrow_up.png b/asset/icon/Icon32/bullet_arrow_up.png new file mode 100644 index 0000000..7d8ca90 Binary files /dev/null and b/asset/icon/Icon32/bullet_arrow_up.png differ diff --git a/asset/icon/Icon32/bullet_attach.png b/asset/icon/Icon32/bullet_attach.png new file mode 100644 index 0000000..aad61e4 Binary files /dev/null and b/asset/icon/Icon32/bullet_attach.png differ diff --git a/asset/icon/Icon32/bullet_back.png b/asset/icon/Icon32/bullet_back.png new file mode 100644 index 0000000..170fea8 Binary files /dev/null and b/asset/icon/Icon32/bullet_back.png differ diff --git a/asset/icon/Icon32/bullet_bell.png b/asset/icon/Icon32/bullet_bell.png new file mode 100644 index 0000000..5808cec Binary files /dev/null and b/asset/icon/Icon32/bullet_bell.png differ diff --git a/asset/icon/Icon32/bullet_black.png b/asset/icon/Icon32/bullet_black.png new file mode 100644 index 0000000..d448caa Binary files /dev/null and b/asset/icon/Icon32/bullet_black.png differ diff --git a/asset/icon/Icon32/bullet_blue.png b/asset/icon/Icon32/bullet_blue.png new file mode 100644 index 0000000..6753441 Binary files /dev/null and b/asset/icon/Icon32/bullet_blue.png differ diff --git a/asset/icon/Icon32/bullet_brush.png b/asset/icon/Icon32/bullet_brush.png new file mode 100644 index 0000000..8d1e339 Binary files /dev/null and b/asset/icon/Icon32/bullet_brush.png differ diff --git a/asset/icon/Icon32/bullet_bug.png b/asset/icon/Icon32/bullet_bug.png new file mode 100644 index 0000000..02adde2 Binary files /dev/null and b/asset/icon/Icon32/bullet_bug.png differ diff --git a/asset/icon/Icon32/bullet_bulb_off.png b/asset/icon/Icon32/bullet_bulb_off.png new file mode 100644 index 0000000..c2a95ce Binary files /dev/null and b/asset/icon/Icon32/bullet_bulb_off.png differ diff --git a/asset/icon/Icon32/bullet_bulb_on.png b/asset/icon/Icon32/bullet_bulb_on.png new file mode 100644 index 0000000..8137705 Binary files /dev/null and b/asset/icon/Icon32/bullet_bulb_on.png differ diff --git a/asset/icon/Icon32/bullet_burn.png b/asset/icon/Icon32/bullet_burn.png new file mode 100644 index 0000000..8534b21 Binary files /dev/null and b/asset/icon/Icon32/bullet_burn.png differ diff --git a/asset/icon/Icon32/bullet_camera.png b/asset/icon/Icon32/bullet_camera.png new file mode 100644 index 0000000..f359055 Binary files /dev/null and b/asset/icon/Icon32/bullet_camera.png differ diff --git a/asset/icon/Icon32/bullet_cd.png b/asset/icon/Icon32/bullet_cd.png new file mode 100644 index 0000000..8ba7966 Binary files /dev/null and b/asset/icon/Icon32/bullet_cd.png differ diff --git a/asset/icon/Icon32/bullet_chart.png b/asset/icon/Icon32/bullet_chart.png new file mode 100644 index 0000000..47833d8 Binary files /dev/null and b/asset/icon/Icon32/bullet_chart.png differ diff --git a/asset/icon/Icon32/bullet_code.png b/asset/icon/Icon32/bullet_code.png new file mode 100644 index 0000000..c3bf486 Binary files /dev/null and b/asset/icon/Icon32/bullet_code.png differ diff --git a/asset/icon/Icon32/bullet_code_red.png b/asset/icon/Icon32/bullet_code_red.png new file mode 100644 index 0000000..deafe6c Binary files /dev/null and b/asset/icon/Icon32/bullet_code_red.png differ diff --git a/asset/icon/Icon32/bullet_connect.png b/asset/icon/Icon32/bullet_connect.png new file mode 100644 index 0000000..5b720c9 Binary files /dev/null and b/asset/icon/Icon32/bullet_connect.png differ diff --git a/asset/icon/Icon32/bullet_database.png b/asset/icon/Icon32/bullet_database.png new file mode 100644 index 0000000..1d5cc8e Binary files /dev/null and b/asset/icon/Icon32/bullet_database.png differ diff --git a/asset/icon/Icon32/bullet_delete.png b/asset/icon/Icon32/bullet_delete.png new file mode 100644 index 0000000..3f60b25 Binary files /dev/null and b/asset/icon/Icon32/bullet_delete.png differ diff --git a/asset/icon/Icon32/bullet_disk.png b/asset/icon/Icon32/bullet_disk.png new file mode 100644 index 0000000..72f54ed Binary files /dev/null and b/asset/icon/Icon32/bullet_disk.png differ diff --git a/asset/icon/Icon32/bullet_document.png b/asset/icon/Icon32/bullet_document.png new file mode 100644 index 0000000..d80806f Binary files /dev/null and b/asset/icon/Icon32/bullet_document.png differ diff --git a/asset/icon/Icon32/bullet_down.png b/asset/icon/Icon32/bullet_down.png new file mode 100644 index 0000000..060af25 Binary files /dev/null and b/asset/icon/Icon32/bullet_down.png differ diff --git a/asset/icon/Icon32/bullet_dvd.png b/asset/icon/Icon32/bullet_dvd.png new file mode 100644 index 0000000..f0874e8 Binary files /dev/null and b/asset/icon/Icon32/bullet_dvd.png differ diff --git a/asset/icon/Icon32/bullet_edit.png b/asset/icon/Icon32/bullet_edit.png new file mode 100644 index 0000000..89ab00d Binary files /dev/null and b/asset/icon/Icon32/bullet_edit.png differ diff --git a/asset/icon/Icon32/bullet_error.png b/asset/icon/Icon32/bullet_error.png new file mode 100644 index 0000000..fa254c3 Binary files /dev/null and b/asset/icon/Icon32/bullet_error.png differ diff --git a/asset/icon/Icon32/bullet_excel.png b/asset/icon/Icon32/bullet_excel.png new file mode 100644 index 0000000..ed68fb8 Binary files /dev/null and b/asset/icon/Icon32/bullet_excel.png differ diff --git a/asset/icon/Icon32/bullet_feed.png b/asset/icon/Icon32/bullet_feed.png new file mode 100644 index 0000000..8924640 Binary files /dev/null and b/asset/icon/Icon32/bullet_feed.png differ diff --git a/asset/icon/Icon32/bullet_find.png b/asset/icon/Icon32/bullet_find.png new file mode 100644 index 0000000..49f4ef8 Binary files /dev/null and b/asset/icon/Icon32/bullet_find.png differ diff --git a/asset/icon/Icon32/bullet_flash.png b/asset/icon/Icon32/bullet_flash.png new file mode 100644 index 0000000..df477ff Binary files /dev/null and b/asset/icon/Icon32/bullet_flash.png differ diff --git a/asset/icon/Icon32/bullet_gear.png b/asset/icon/Icon32/bullet_gear.png new file mode 100644 index 0000000..9f9e0d8 Binary files /dev/null and b/asset/icon/Icon32/bullet_gear.png differ diff --git a/asset/icon/Icon32/bullet_go.png b/asset/icon/Icon32/bullet_go.png new file mode 100644 index 0000000..4fd63c1 Binary files /dev/null and b/asset/icon/Icon32/bullet_go.png differ diff --git a/asset/icon/Icon32/bullet_green.png b/asset/icon/Icon32/bullet_green.png new file mode 100644 index 0000000..f74a914 Binary files /dev/null and b/asset/icon/Icon32/bullet_green.png differ diff --git a/asset/icon/Icon32/bullet_key.png b/asset/icon/Icon32/bullet_key.png new file mode 100644 index 0000000..a165939 Binary files /dev/null and b/asset/icon/Icon32/bullet_key.png differ diff --git a/asset/icon/Icon32/bullet_lightning.png b/asset/icon/Icon32/bullet_lightning.png new file mode 100644 index 0000000..a082a8a Binary files /dev/null and b/asset/icon/Icon32/bullet_lightning.png differ diff --git a/asset/icon/Icon32/bullet_link.png b/asset/icon/Icon32/bullet_link.png new file mode 100644 index 0000000..cf4ec15 Binary files /dev/null and b/asset/icon/Icon32/bullet_link.png differ diff --git a/asset/icon/Icon32/bullet_magnify.png b/asset/icon/Icon32/bullet_magnify.png new file mode 100644 index 0000000..c5256f0 Binary files /dev/null and b/asset/icon/Icon32/bullet_magnify.png differ diff --git a/asset/icon/Icon32/bullet_medal.png b/asset/icon/Icon32/bullet_medal.png new file mode 100644 index 0000000..4fdd5be Binary files /dev/null and b/asset/icon/Icon32/bullet_medal.png differ diff --git a/asset/icon/Icon32/bullet_office.png b/asset/icon/Icon32/bullet_office.png new file mode 100644 index 0000000..ee8ae02 Binary files /dev/null and b/asset/icon/Icon32/bullet_office.png differ diff --git a/asset/icon/Icon32/bullet_orange.png b/asset/icon/Icon32/bullet_orange.png new file mode 100644 index 0000000..110facd Binary files /dev/null and b/asset/icon/Icon32/bullet_orange.png differ diff --git a/asset/icon/Icon32/bullet_palette.png b/asset/icon/Icon32/bullet_palette.png new file mode 100644 index 0000000..2edc59f Binary files /dev/null and b/asset/icon/Icon32/bullet_palette.png differ diff --git a/asset/icon/Icon32/bullet_php.png b/asset/icon/Icon32/bullet_php.png new file mode 100644 index 0000000..7b1723b Binary files /dev/null and b/asset/icon/Icon32/bullet_php.png differ diff --git a/asset/icon/Icon32/bullet_picture.png b/asset/icon/Icon32/bullet_picture.png new file mode 100644 index 0000000..c0ebc15 Binary files /dev/null and b/asset/icon/Icon32/bullet_picture.png differ diff --git a/asset/icon/Icon32/bullet_pink.png b/asset/icon/Icon32/bullet_pink.png new file mode 100644 index 0000000..a4608c6 Binary files /dev/null and b/asset/icon/Icon32/bullet_pink.png differ diff --git a/asset/icon/Icon32/bullet_powerpoint.png b/asset/icon/Icon32/bullet_powerpoint.png new file mode 100644 index 0000000..04adc16 Binary files /dev/null and b/asset/icon/Icon32/bullet_powerpoint.png differ diff --git a/asset/icon/Icon32/bullet_purple.png b/asset/icon/Icon32/bullet_purple.png new file mode 100644 index 0000000..0f1b989 Binary files /dev/null and b/asset/icon/Icon32/bullet_purple.png differ diff --git a/asset/icon/Icon32/bullet_red.png b/asset/icon/Icon32/bullet_red.png new file mode 100644 index 0000000..b6cfd0b Binary files /dev/null and b/asset/icon/Icon32/bullet_red.png differ diff --git a/asset/icon/Icon32/bullet_star.png b/asset/icon/Icon32/bullet_star.png new file mode 100644 index 0000000..3ac0a32 Binary files /dev/null and b/asset/icon/Icon32/bullet_star.png differ diff --git a/asset/icon/Icon32/bullet_table.png b/asset/icon/Icon32/bullet_table.png new file mode 100644 index 0000000..dc36f46 Binary files /dev/null and b/asset/icon/Icon32/bullet_table.png differ diff --git a/asset/icon/Icon32/bullet_textfield.png b/asset/icon/Icon32/bullet_textfield.png new file mode 100644 index 0000000..73f6990 Binary files /dev/null and b/asset/icon/Icon32/bullet_textfield.png differ diff --git a/asset/icon/Icon32/bullet_toggle_minus.png b/asset/icon/Icon32/bullet_toggle_minus.png new file mode 100644 index 0000000..7a6b790 Binary files /dev/null and b/asset/icon/Icon32/bullet_toggle_minus.png differ diff --git a/asset/icon/Icon32/bullet_toggle_plus.png b/asset/icon/Icon32/bullet_toggle_plus.png new file mode 100644 index 0000000..0908e24 Binary files /dev/null and b/asset/icon/Icon32/bullet_toggle_plus.png differ diff --git a/asset/icon/Icon32/bullet_up.png b/asset/icon/Icon32/bullet_up.png new file mode 100644 index 0000000..4d0f779 Binary files /dev/null and b/asset/icon/Icon32/bullet_up.png differ diff --git a/asset/icon/Icon32/bullet_user.png b/asset/icon/Icon32/bullet_user.png new file mode 100644 index 0000000..458663d Binary files /dev/null and b/asset/icon/Icon32/bullet_user.png differ diff --git a/asset/icon/Icon32/bullet_valid.png b/asset/icon/Icon32/bullet_valid.png new file mode 100644 index 0000000..16cd584 Binary files /dev/null and b/asset/icon/Icon32/bullet_valid.png differ diff --git a/asset/icon/Icon32/bullet_vector.png b/asset/icon/Icon32/bullet_vector.png new file mode 100644 index 0000000..38d7310 Binary files /dev/null and b/asset/icon/Icon32/bullet_vector.png differ diff --git a/asset/icon/Icon32/bullet_white.png b/asset/icon/Icon32/bullet_white.png new file mode 100644 index 0000000..c46cc39 Binary files /dev/null and b/asset/icon/Icon32/bullet_white.png differ diff --git a/asset/icon/Icon32/bullet_word.png b/asset/icon/Icon32/bullet_word.png new file mode 100644 index 0000000..9a8497d Binary files /dev/null and b/asset/icon/Icon32/bullet_word.png differ diff --git a/asset/icon/Icon32/bullet_world.png b/asset/icon/Icon32/bullet_world.png new file mode 100644 index 0000000..a4491e7 Binary files /dev/null and b/asset/icon/Icon32/bullet_world.png differ diff --git a/asset/icon/Icon32/bullet_wrench.png b/asset/icon/Icon32/bullet_wrench.png new file mode 100644 index 0000000..7dc90ab Binary files /dev/null and b/asset/icon/Icon32/bullet_wrench.png differ diff --git a/asset/icon/Icon32/bullet_yellow.png b/asset/icon/Icon32/bullet_yellow.png new file mode 100644 index 0000000..604e614 Binary files /dev/null and b/asset/icon/Icon32/bullet_yellow.png differ diff --git a/asset/icon/Icon32/burro.png b/asset/icon/Icon32/burro.png new file mode 100644 index 0000000..8dad22f Binary files /dev/null and b/asset/icon/Icon32/burro.png differ diff --git a/asset/icon/Icon32/bus.png b/asset/icon/Icon32/bus.png new file mode 100644 index 0000000..24dc1dd Binary files /dev/null and b/asset/icon/Icon32/bus.png differ diff --git a/asset/icon/Icon32/butterfly.png b/asset/icon/Icon32/butterfly.png new file mode 100644 index 0000000..2119959 Binary files /dev/null and b/asset/icon/Icon32/butterfly.png differ diff --git a/asset/icon/Icon32/button.png b/asset/icon/Icon32/button.png new file mode 100644 index 0000000..4b1eb80 Binary files /dev/null and b/asset/icon/Icon32/button.png differ diff --git a/asset/icon/Icon32/button_default.png b/asset/icon/Icon32/button_default.png new file mode 100644 index 0000000..a912cac Binary files /dev/null and b/asset/icon/Icon32/button_default.png differ diff --git a/asset/icon/Icon32/button_navigation.png b/asset/icon/Icon32/button_navigation.png new file mode 100644 index 0000000..1dde473 Binary files /dev/null and b/asset/icon/Icon32/button_navigation.png differ diff --git a/asset/icon/Icon32/button_navigation_back.png b/asset/icon/Icon32/button_navigation_back.png new file mode 100644 index 0000000..c11d11e Binary files /dev/null and b/asset/icon/Icon32/button_navigation_back.png differ diff --git a/asset/icon/Icon32/button_picture.png b/asset/icon/Icon32/button_picture.png new file mode 100644 index 0000000..f730ace Binary files /dev/null and b/asset/icon/Icon32/button_picture.png differ diff --git a/asset/icon/Icon32/button_toggle.png b/asset/icon/Icon32/button_toggle.png new file mode 100644 index 0000000..06118c1 Binary files /dev/null and b/asset/icon/Icon32/button_toggle.png differ diff --git a/asset/icon/Icon32/buttonbar.png b/asset/icon/Icon32/buttonbar.png new file mode 100644 index 0000000..7a639d1 Binary files /dev/null and b/asset/icon/Icon32/buttonbar.png differ diff --git a/asset/icon/Icon32/buttons.png b/asset/icon/Icon32/buttons.png new file mode 100644 index 0000000..691beb3 Binary files /dev/null and b/asset/icon/Icon32/buttons.png differ diff --git a/asset/icon/Icon32/buzz.png b/asset/icon/Icon32/buzz.png new file mode 100644 index 0000000..f71cad7 Binary files /dev/null and b/asset/icon/Icon32/buzz.png differ diff --git a/asset/icon/Icon32/cactus.png b/asset/icon/Icon32/cactus.png new file mode 100644 index 0000000..b0263be Binary files /dev/null and b/asset/icon/Icon32/cactus.png differ diff --git a/asset/icon/Icon32/cake.png b/asset/icon/Icon32/cake.png new file mode 100644 index 0000000..25c27e0 Binary files /dev/null and b/asset/icon/Icon32/cake.png differ diff --git a/asset/icon/Icon32/calculate_sheet.png b/asset/icon/Icon32/calculate_sheet.png new file mode 100644 index 0000000..9b4de33 Binary files /dev/null and b/asset/icon/Icon32/calculate_sheet.png differ diff --git a/asset/icon/Icon32/calculator.png b/asset/icon/Icon32/calculator.png new file mode 100644 index 0000000..ca39b38 Binary files /dev/null and b/asset/icon/Icon32/calculator.png differ diff --git a/asset/icon/Icon32/calculator_add.png b/asset/icon/Icon32/calculator_add.png new file mode 100644 index 0000000..8a54c18 Binary files /dev/null and b/asset/icon/Icon32/calculator_add.png differ diff --git a/asset/icon/Icon32/calculator_black.png b/asset/icon/Icon32/calculator_black.png new file mode 100644 index 0000000..d7228b8 Binary files /dev/null and b/asset/icon/Icon32/calculator_black.png differ diff --git a/asset/icon/Icon32/calculator_delete.png b/asset/icon/Icon32/calculator_delete.png new file mode 100644 index 0000000..eb6811f Binary files /dev/null and b/asset/icon/Icon32/calculator_delete.png differ diff --git a/asset/icon/Icon32/calculator_edit.png b/asset/icon/Icon32/calculator_edit.png new file mode 100644 index 0000000..df423a4 Binary files /dev/null and b/asset/icon/Icon32/calculator_edit.png differ diff --git a/asset/icon/Icon32/calculator_error.png b/asset/icon/Icon32/calculator_error.png new file mode 100644 index 0000000..1d99f12 Binary files /dev/null and b/asset/icon/Icon32/calculator_error.png differ diff --git a/asset/icon/Icon32/calculator_link.png b/asset/icon/Icon32/calculator_link.png new file mode 100644 index 0000000..7e6d5ac Binary files /dev/null and b/asset/icon/Icon32/calculator_link.png differ diff --git a/asset/icon/Icon32/calendar.png b/asset/icon/Icon32/calendar.png new file mode 100644 index 0000000..85e92bd Binary files /dev/null and b/asset/icon/Icon32/calendar.png differ diff --git a/asset/icon/Icon32/calendar_add.png b/asset/icon/Icon32/calendar_add.png new file mode 100644 index 0000000..fda6f42 Binary files /dev/null and b/asset/icon/Icon32/calendar_add.png differ diff --git a/asset/icon/Icon32/calendar_copy.png b/asset/icon/Icon32/calendar_copy.png new file mode 100644 index 0000000..ce8db42 Binary files /dev/null and b/asset/icon/Icon32/calendar_copy.png differ diff --git a/asset/icon/Icon32/calendar_delete.png b/asset/icon/Icon32/calendar_delete.png new file mode 100644 index 0000000..4f133dc Binary files /dev/null and b/asset/icon/Icon32/calendar_delete.png differ diff --git a/asset/icon/Icon32/calendar_edit.png b/asset/icon/Icon32/calendar_edit.png new file mode 100644 index 0000000..bccd429 Binary files /dev/null and b/asset/icon/Icon32/calendar_edit.png differ diff --git a/asset/icon/Icon32/calendar_link.png b/asset/icon/Icon32/calendar_link.png new file mode 100644 index 0000000..9dc662b Binary files /dev/null and b/asset/icon/Icon32/calendar_link.png differ diff --git a/asset/icon/Icon32/calendar_view_day.png b/asset/icon/Icon32/calendar_view_day.png new file mode 100644 index 0000000..2b5502d Binary files /dev/null and b/asset/icon/Icon32/calendar_view_day.png differ diff --git a/asset/icon/Icon32/calendar_view_month.png b/asset/icon/Icon32/calendar_view_month.png new file mode 100644 index 0000000..1db59e6 Binary files /dev/null and b/asset/icon/Icon32/calendar_view_month.png differ diff --git a/asset/icon/Icon32/calendar_view_week.png b/asset/icon/Icon32/calendar_view_week.png new file mode 100644 index 0000000..d6785a4 Binary files /dev/null and b/asset/icon/Icon32/calendar_view_week.png differ diff --git a/asset/icon/Icon32/camcorder.png b/asset/icon/Icon32/camcorder.png new file mode 100644 index 0000000..60e0534 Binary files /dev/null and b/asset/icon/Icon32/camcorder.png differ diff --git a/asset/icon/Icon32/camera.png b/asset/icon/Icon32/camera.png new file mode 100644 index 0000000..e8608c2 Binary files /dev/null and b/asset/icon/Icon32/camera.png differ diff --git a/asset/icon/Icon32/camera_add.png b/asset/icon/Icon32/camera_add.png new file mode 100644 index 0000000..0208f7e Binary files /dev/null and b/asset/icon/Icon32/camera_add.png differ diff --git a/asset/icon/Icon32/camera_black.png b/asset/icon/Icon32/camera_black.png new file mode 100644 index 0000000..3f05f09 Binary files /dev/null and b/asset/icon/Icon32/camera_black.png differ diff --git a/asset/icon/Icon32/camera_delete.png b/asset/icon/Icon32/camera_delete.png new file mode 100644 index 0000000..0561688 Binary files /dev/null and b/asset/icon/Icon32/camera_delete.png differ diff --git a/asset/icon/Icon32/camera_edit.png b/asset/icon/Icon32/camera_edit.png new file mode 100644 index 0000000..417284a Binary files /dev/null and b/asset/icon/Icon32/camera_edit.png differ diff --git a/asset/icon/Icon32/camera_error.png b/asset/icon/Icon32/camera_error.png new file mode 100644 index 0000000..f21c0d3 Binary files /dev/null and b/asset/icon/Icon32/camera_error.png differ diff --git a/asset/icon/Icon32/camera_go.png b/asset/icon/Icon32/camera_go.png new file mode 100644 index 0000000..893609a Binary files /dev/null and b/asset/icon/Icon32/camera_go.png differ diff --git a/asset/icon/Icon32/camera_lens.png b/asset/icon/Icon32/camera_lens.png new file mode 100644 index 0000000..85fea20 Binary files /dev/null and b/asset/icon/Icon32/camera_lens.png differ diff --git a/asset/icon/Icon32/camera_link.png b/asset/icon/Icon32/camera_link.png new file mode 100644 index 0000000..a83ba88 Binary files /dev/null and b/asset/icon/Icon32/camera_link.png differ diff --git a/asset/icon/Icon32/camera_small.png b/asset/icon/Icon32/camera_small.png new file mode 100644 index 0000000..436f98d Binary files /dev/null and b/asset/icon/Icon32/camera_small.png differ diff --git a/asset/icon/Icon32/cancel.png b/asset/icon/Icon32/cancel.png new file mode 100644 index 0000000..1b20ae0 Binary files /dev/null and b/asset/icon/Icon32/cancel.png differ diff --git a/asset/icon/Icon32/candle.png b/asset/icon/Icon32/candle.png new file mode 100644 index 0000000..1f0811b Binary files /dev/null and b/asset/icon/Icon32/candle.png differ diff --git a/asset/icon/Icon32/candle_2.png b/asset/icon/Icon32/candle_2.png new file mode 100644 index 0000000..b493900 Binary files /dev/null and b/asset/icon/Icon32/candle_2.png differ diff --git a/asset/icon/Icon32/candlestickchart.png b/asset/icon/Icon32/candlestickchart.png new file mode 100644 index 0000000..50dd0b8 Binary files /dev/null and b/asset/icon/Icon32/candlestickchart.png differ diff --git a/asset/icon/Icon32/candy_cane.png b/asset/icon/Icon32/candy_cane.png new file mode 100644 index 0000000..124edf1 Binary files /dev/null and b/asset/icon/Icon32/candy_cane.png differ diff --git a/asset/icon/Icon32/canvas.png b/asset/icon/Icon32/canvas.png new file mode 100644 index 0000000..9418691 Binary files /dev/null and b/asset/icon/Icon32/canvas.png differ diff --git a/asset/icon/Icon32/canvas_size.png b/asset/icon/Icon32/canvas_size.png new file mode 100644 index 0000000..667b1e2 Binary files /dev/null and b/asset/icon/Icon32/canvas_size.png differ diff --git a/asset/icon/Icon32/cap.png b/asset/icon/Icon32/cap.png new file mode 100644 index 0000000..ce4525f Binary files /dev/null and b/asset/icon/Icon32/cap.png differ diff --git a/asset/icon/Icon32/capitalization.png b/asset/icon/Icon32/capitalization.png new file mode 100644 index 0000000..36bc74b Binary files /dev/null and b/asset/icon/Icon32/capitalization.png differ diff --git a/asset/icon/Icon32/car.png b/asset/icon/Icon32/car.png new file mode 100644 index 0000000..e03b9c6 Binary files /dev/null and b/asset/icon/Icon32/car.png differ diff --git a/asset/icon/Icon32/car_add.png b/asset/icon/Icon32/car_add.png new file mode 100644 index 0000000..142341f Binary files /dev/null and b/asset/icon/Icon32/car_add.png differ diff --git a/asset/icon/Icon32/car_delete.png b/asset/icon/Icon32/car_delete.png new file mode 100644 index 0000000..0eccfc6 Binary files /dev/null and b/asset/icon/Icon32/car_delete.png differ diff --git a/asset/icon/Icon32/car_taxi.png b/asset/icon/Icon32/car_taxi.png new file mode 100644 index 0000000..ac87c26 Binary files /dev/null and b/asset/icon/Icon32/car_taxi.png differ diff --git a/asset/icon/Icon32/card_amazon.png b/asset/icon/Icon32/card_amazon.png new file mode 100644 index 0000000..16803eb Binary files /dev/null and b/asset/icon/Icon32/card_amazon.png differ diff --git a/asset/icon/Icon32/card_amex_gold.png b/asset/icon/Icon32/card_amex_gold.png new file mode 100644 index 0000000..7ce73d4 Binary files /dev/null and b/asset/icon/Icon32/card_amex_gold.png differ diff --git a/asset/icon/Icon32/card_amex_gray.png b/asset/icon/Icon32/card_amex_gray.png new file mode 100644 index 0000000..9fe13b4 Binary files /dev/null and b/asset/icon/Icon32/card_amex_gray.png differ diff --git a/asset/icon/Icon32/card_amex_green.png b/asset/icon/Icon32/card_amex_green.png new file mode 100644 index 0000000..89dd90f Binary files /dev/null and b/asset/icon/Icon32/card_amex_green.png differ diff --git a/asset/icon/Icon32/card_apple.png b/asset/icon/Icon32/card_apple.png new file mode 100644 index 0000000..205db37 Binary files /dev/null and b/asset/icon/Icon32/card_apple.png differ diff --git a/asset/icon/Icon32/card_back.png b/asset/icon/Icon32/card_back.png new file mode 100644 index 0000000..ca0015f Binary files /dev/null and b/asset/icon/Icon32/card_back.png differ diff --git a/asset/icon/Icon32/card_bank.png b/asset/icon/Icon32/card_bank.png new file mode 100644 index 0000000..0ebf237 Binary files /dev/null and b/asset/icon/Icon32/card_bank.png differ diff --git a/asset/icon/Icon32/card_chase.png b/asset/icon/Icon32/card_chase.png new file mode 100644 index 0000000..2f4a3bb Binary files /dev/null and b/asset/icon/Icon32/card_chase.png differ diff --git a/asset/icon/Icon32/card_chip_gold.png b/asset/icon/Icon32/card_chip_gold.png new file mode 100644 index 0000000..97d0471 Binary files /dev/null and b/asset/icon/Icon32/card_chip_gold.png differ diff --git a/asset/icon/Icon32/card_chip_silver.png b/asset/icon/Icon32/card_chip_silver.png new file mode 100644 index 0000000..f7653b9 Binary files /dev/null and b/asset/icon/Icon32/card_chip_silver.png differ diff --git a/asset/icon/Icon32/card_credit.png b/asset/icon/Icon32/card_credit.png new file mode 100644 index 0000000..cf28585 Binary files /dev/null and b/asset/icon/Icon32/card_credit.png differ diff --git a/asset/icon/Icon32/card_debit.png b/asset/icon/Icon32/card_debit.png new file mode 100644 index 0000000..2a0da4f Binary files /dev/null and b/asset/icon/Icon32/card_debit.png differ diff --git a/asset/icon/Icon32/card_discover_black.png b/asset/icon/Icon32/card_discover_black.png new file mode 100644 index 0000000..15a096e Binary files /dev/null and b/asset/icon/Icon32/card_discover_black.png differ diff --git a/asset/icon/Icon32/card_discover_novus.png b/asset/icon/Icon32/card_discover_novus.png new file mode 100644 index 0000000..7de0c91 Binary files /dev/null and b/asset/icon/Icon32/card_discover_novus.png differ diff --git a/asset/icon/Icon32/card_echeck.png b/asset/icon/Icon32/card_echeck.png new file mode 100644 index 0000000..711a282 Binary files /dev/null and b/asset/icon/Icon32/card_echeck.png differ diff --git a/asset/icon/Icon32/card_export.png b/asset/icon/Icon32/card_export.png new file mode 100644 index 0000000..790ad53 Binary files /dev/null and b/asset/icon/Icon32/card_export.png differ diff --git a/asset/icon/Icon32/card_front.png b/asset/icon/Icon32/card_front.png new file mode 100644 index 0000000..d6e8710 Binary files /dev/null and b/asset/icon/Icon32/card_front.png differ diff --git a/asset/icon/Icon32/card_gift.png b/asset/icon/Icon32/card_gift.png new file mode 100644 index 0000000..37b4409 Binary files /dev/null and b/asset/icon/Icon32/card_gift.png differ diff --git a/asset/icon/Icon32/card_gift_2.png b/asset/icon/Icon32/card_gift_2.png new file mode 100644 index 0000000..1e99c16 Binary files /dev/null and b/asset/icon/Icon32/card_gift_2.png differ diff --git a/asset/icon/Icon32/card_gold.png b/asset/icon/Icon32/card_gold.png new file mode 100644 index 0000000..3bdf577 Binary files /dev/null and b/asset/icon/Icon32/card_gold.png differ diff --git a/asset/icon/Icon32/card_import.png b/asset/icon/Icon32/card_import.png new file mode 100644 index 0000000..821db1c Binary files /dev/null and b/asset/icon/Icon32/card_import.png differ diff --git a/asset/icon/Icon32/card_ipod.png b/asset/icon/Icon32/card_ipod.png new file mode 100644 index 0000000..191d214 Binary files /dev/null and b/asset/icon/Icon32/card_ipod.png differ diff --git a/asset/icon/Icon32/card_miles.png b/asset/icon/Icon32/card_miles.png new file mode 100644 index 0000000..00ed26e Binary files /dev/null and b/asset/icon/Icon32/card_miles.png differ diff --git a/asset/icon/Icon32/card_money.png b/asset/icon/Icon32/card_money.png new file mode 100644 index 0000000..140d2d5 Binary files /dev/null and b/asset/icon/Icon32/card_money.png differ diff --git a/asset/icon/Icon32/card_sapphire.png b/asset/icon/Icon32/card_sapphire.png new file mode 100644 index 0000000..4eba906 Binary files /dev/null and b/asset/icon/Icon32/card_sapphire.png differ diff --git a/asset/icon/Icon32/card_save.png b/asset/icon/Icon32/card_save.png new file mode 100644 index 0000000..c1a4cb9 Binary files /dev/null and b/asset/icon/Icon32/card_save.png differ diff --git a/asset/icon/Icon32/card_solo.png b/asset/icon/Icon32/card_solo.png new file mode 100644 index 0000000..a4b33f4 Binary files /dev/null and b/asset/icon/Icon32/card_solo.png differ diff --git a/asset/icon/Icon32/cards(2).png b/asset/icon/Icon32/cards(2).png new file mode 100644 index 0000000..2bc6372 Binary files /dev/null and b/asset/icon/Icon32/cards(2).png differ diff --git a/asset/icon/Icon32/cards.png b/asset/icon/Icon32/cards.png new file mode 100644 index 0000000..adcea8b Binary files /dev/null and b/asset/icon/Icon32/cards.png differ diff --git a/asset/icon/Icon32/cards_bind_address.png b/asset/icon/Icon32/cards_bind_address.png new file mode 100644 index 0000000..8520609 Binary files /dev/null and b/asset/icon/Icon32/cards_bind_address.png differ diff --git a/asset/icon/Icon32/cards_binds.png b/asset/icon/Icon32/cards_binds.png new file mode 100644 index 0000000..b82e306 Binary files /dev/null and b/asset/icon/Icon32/cards_binds.png differ diff --git a/asset/icon/Icon32/cargo.png b/asset/icon/Icon32/cargo.png new file mode 100644 index 0000000..c7ae355 Binary files /dev/null and b/asset/icon/Icon32/cargo.png differ diff --git a/asset/icon/Icon32/cart.png b/asset/icon/Icon32/cart.png new file mode 100644 index 0000000..9130dff Binary files /dev/null and b/asset/icon/Icon32/cart.png differ diff --git a/asset/icon/Icon32/cart_add.png b/asset/icon/Icon32/cart_add.png new file mode 100644 index 0000000..de36c1e Binary files /dev/null and b/asset/icon/Icon32/cart_add.png differ diff --git a/asset/icon/Icon32/cart_delete.png b/asset/icon/Icon32/cart_delete.png new file mode 100644 index 0000000..da37a0d Binary files /dev/null and b/asset/icon/Icon32/cart_delete.png differ diff --git a/asset/icon/Icon32/cart_edit.png b/asset/icon/Icon32/cart_edit.png new file mode 100644 index 0000000..c27d1b6 Binary files /dev/null and b/asset/icon/Icon32/cart_edit.png differ diff --git a/asset/icon/Icon32/cart_error.png b/asset/icon/Icon32/cart_error.png new file mode 100644 index 0000000..7c38613 Binary files /dev/null and b/asset/icon/Icon32/cart_error.png differ diff --git a/asset/icon/Icon32/cart_full.png b/asset/icon/Icon32/cart_full.png new file mode 100644 index 0000000..dbafe4a Binary files /dev/null and b/asset/icon/Icon32/cart_full.png differ diff --git a/asset/icon/Icon32/cart_go.png b/asset/icon/Icon32/cart_go.png new file mode 100644 index 0000000..f41d66e Binary files /dev/null and b/asset/icon/Icon32/cart_go.png differ diff --git a/asset/icon/Icon32/cart_put.png b/asset/icon/Icon32/cart_put.png new file mode 100644 index 0000000..4f00b6a Binary files /dev/null and b/asset/icon/Icon32/cart_put.png differ diff --git a/asset/icon/Icon32/cart_remove.png b/asset/icon/Icon32/cart_remove.png new file mode 100644 index 0000000..071bdcf Binary files /dev/null and b/asset/icon/Icon32/cart_remove.png differ diff --git a/asset/icon/Icon32/cash_register.png b/asset/icon/Icon32/cash_register.png new file mode 100644 index 0000000..64a0c4e Binary files /dev/null and b/asset/icon/Icon32/cash_register.png differ diff --git a/asset/icon/Icon32/cash_register_2.png b/asset/icon/Icon32/cash_register_2.png new file mode 100644 index 0000000..5df2a99 Binary files /dev/null and b/asset/icon/Icon32/cash_register_2.png differ diff --git a/asset/icon/Icon32/cash_stack.png b/asset/icon/Icon32/cash_stack.png new file mode 100644 index 0000000..ee8e307 Binary files /dev/null and b/asset/icon/Icon32/cash_stack.png differ diff --git a/asset/icon/Icon32/cash_terminal.png b/asset/icon/Icon32/cash_terminal.png new file mode 100644 index 0000000..5a1807c Binary files /dev/null and b/asset/icon/Icon32/cash_terminal.png differ diff --git a/asset/icon/Icon32/cat.png b/asset/icon/Icon32/cat.png new file mode 100644 index 0000000..6f50dcb Binary files /dev/null and b/asset/icon/Icon32/cat.png differ diff --git a/asset/icon/Icon32/catalog_pages.png b/asset/icon/Icon32/catalog_pages.png new file mode 100644 index 0000000..380300a Binary files /dev/null and b/asset/icon/Icon32/catalog_pages.png differ diff --git a/asset/icon/Icon32/categories.png b/asset/icon/Icon32/categories.png new file mode 100644 index 0000000..d18f037 Binary files /dev/null and b/asset/icon/Icon32/categories.png differ diff --git a/asset/icon/Icon32/category.png b/asset/icon/Icon32/category.png new file mode 100644 index 0000000..ec02ade Binary files /dev/null and b/asset/icon/Icon32/category.png differ diff --git a/asset/icon/Icon32/category_group.png b/asset/icon/Icon32/category_group.png new file mode 100644 index 0000000..b4a05bb Binary files /dev/null and b/asset/icon/Icon32/category_group.png differ diff --git a/asset/icon/Icon32/category_group_select.png b/asset/icon/Icon32/category_group_select.png new file mode 100644 index 0000000..410f0ad Binary files /dev/null and b/asset/icon/Icon32/category_group_select.png differ diff --git a/asset/icon/Icon32/category_item.png b/asset/icon/Icon32/category_item.png new file mode 100644 index 0000000..0c6fb5f Binary files /dev/null and b/asset/icon/Icon32/category_item.png differ diff --git a/asset/icon/Icon32/category_item_select.png b/asset/icon/Icon32/category_item_select.png new file mode 100644 index 0000000..afdf4a6 Binary files /dev/null and b/asset/icon/Icon32/category_item_select.png differ diff --git a/asset/icon/Icon32/caterpillar.png b/asset/icon/Icon32/caterpillar.png new file mode 100644 index 0000000..0fc6d04 Binary files /dev/null and b/asset/icon/Icon32/caterpillar.png differ diff --git a/asset/icon/Icon32/cats_display.png b/asset/icon/Icon32/cats_display.png new file mode 100644 index 0000000..66ada7c Binary files /dev/null and b/asset/icon/Icon32/cats_display.png differ diff --git a/asset/icon/Icon32/caution_biohazard.png b/asset/icon/Icon32/caution_biohazard.png new file mode 100644 index 0000000..69024a8 Binary files /dev/null and b/asset/icon/Icon32/caution_biohazard.png differ diff --git a/asset/icon/Icon32/caution_board.png b/asset/icon/Icon32/caution_board.png new file mode 100644 index 0000000..d46c3e5 Binary files /dev/null and b/asset/icon/Icon32/caution_board.png differ diff --git a/asset/icon/Icon32/caution_high_voltage.png b/asset/icon/Icon32/caution_high_voltage.png new file mode 100644 index 0000000..2693b85 Binary files /dev/null and b/asset/icon/Icon32/caution_high_voltage.png differ diff --git a/asset/icon/Icon32/caution_radiation.png b/asset/icon/Icon32/caution_radiation.png new file mode 100644 index 0000000..d706aa3 Binary files /dev/null and b/asset/icon/Icon32/caution_radiation.png differ diff --git a/asset/icon/Icon32/cctv_camera.png b/asset/icon/Icon32/cctv_camera.png new file mode 100644 index 0000000..65521b3 Binary files /dev/null and b/asset/icon/Icon32/cctv_camera.png differ diff --git a/asset/icon/Icon32/cd.png b/asset/icon/Icon32/cd.png new file mode 100644 index 0000000..40e3ae9 Binary files /dev/null and b/asset/icon/Icon32/cd.png differ diff --git a/asset/icon/Icon32/cd_add.png b/asset/icon/Icon32/cd_add.png new file mode 100644 index 0000000..77eff36 Binary files /dev/null and b/asset/icon/Icon32/cd_add.png differ diff --git a/asset/icon/Icon32/cd_burn.png b/asset/icon/Icon32/cd_burn.png new file mode 100644 index 0000000..d00b382 Binary files /dev/null and b/asset/icon/Icon32/cd_burn.png differ diff --git a/asset/icon/Icon32/cd_case.png b/asset/icon/Icon32/cd_case.png new file mode 100644 index 0000000..4050ffa Binary files /dev/null and b/asset/icon/Icon32/cd_case.png differ diff --git a/asset/icon/Icon32/cd_case_empty.png b/asset/icon/Icon32/cd_case_empty.png new file mode 100644 index 0000000..6627e34 Binary files /dev/null and b/asset/icon/Icon32/cd_case_empty.png differ diff --git a/asset/icon/Icon32/cd_delete.png b/asset/icon/Icon32/cd_delete.png new file mode 100644 index 0000000..3ab3304 Binary files /dev/null and b/asset/icon/Icon32/cd_delete.png differ diff --git a/asset/icon/Icon32/cd_edit.png b/asset/icon/Icon32/cd_edit.png new file mode 100644 index 0000000..8b3c8b9 Binary files /dev/null and b/asset/icon/Icon32/cd_edit.png differ diff --git a/asset/icon/Icon32/cd_eject.png b/asset/icon/Icon32/cd_eject.png new file mode 100644 index 0000000..2297c44 Binary files /dev/null and b/asset/icon/Icon32/cd_eject.png differ diff --git a/asset/icon/Icon32/cd_go.png b/asset/icon/Icon32/cd_go.png new file mode 100644 index 0000000..9e19523 Binary files /dev/null and b/asset/icon/Icon32/cd_go.png differ diff --git a/asset/icon/Icon32/cell_clear.png b/asset/icon/Icon32/cell_clear.png new file mode 100644 index 0000000..4d842b6 Binary files /dev/null and b/asset/icon/Icon32/cell_clear.png differ diff --git a/asset/icon/Icon32/cell_copy.png b/asset/icon/Icon32/cell_copy.png new file mode 100644 index 0000000..040ca10 Binary files /dev/null and b/asset/icon/Icon32/cell_copy.png differ diff --git a/asset/icon/Icon32/cell_delete.png b/asset/icon/Icon32/cell_delete.png new file mode 100644 index 0000000..eb1f86c Binary files /dev/null and b/asset/icon/Icon32/cell_delete.png differ diff --git a/asset/icon/Icon32/cell_style.png b/asset/icon/Icon32/cell_style.png new file mode 100644 index 0000000..873128e Binary files /dev/null and b/asset/icon/Icon32/cell_style.png differ diff --git a/asset/icon/Icon32/celsius.png b/asset/icon/Icon32/celsius.png new file mode 100644 index 0000000..a0163ae Binary files /dev/null and b/asset/icon/Icon32/celsius.png differ diff --git a/asset/icon/Icon32/centos.png b/asset/icon/Icon32/centos.png new file mode 100644 index 0000000..fb03f30 Binary files /dev/null and b/asset/icon/Icon32/centos.png differ diff --git a/asset/icon/Icon32/centroid.png b/asset/icon/Icon32/centroid.png new file mode 100644 index 0000000..03d3796 Binary files /dev/null and b/asset/icon/Icon32/centroid.png differ diff --git a/asset/icon/Icon32/ceo.png b/asset/icon/Icon32/ceo.png new file mode 100644 index 0000000..857bd04 Binary files /dev/null and b/asset/icon/Icon32/ceo.png differ diff --git a/asset/icon/Icon32/cgi_center.png b/asset/icon/Icon32/cgi_center.png new file mode 100644 index 0000000..890e7e5 Binary files /dev/null and b/asset/icon/Icon32/cgi_center.png differ diff --git a/asset/icon/Icon32/chair.png b/asset/icon/Icon32/chair.png new file mode 100644 index 0000000..037bfcc Binary files /dev/null and b/asset/icon/Icon32/chair.png differ diff --git a/asset/icon/Icon32/chameleon.png b/asset/icon/Icon32/chameleon.png new file mode 100644 index 0000000..d252821 Binary files /dev/null and b/asset/icon/Icon32/chameleon.png differ diff --git a/asset/icon/Icon32/change_languange.png b/asset/icon/Icon32/change_languange.png new file mode 100644 index 0000000..858649f Binary files /dev/null and b/asset/icon/Icon32/change_languange.png differ diff --git a/asset/icon/Icon32/change_log.png b/asset/icon/Icon32/change_log.png new file mode 100644 index 0000000..f81e557 Binary files /dev/null and b/asset/icon/Icon32/change_log.png differ diff --git a/asset/icon/Icon32/change_password(2).png b/asset/icon/Icon32/change_password(2).png new file mode 100644 index 0000000..9016562 Binary files /dev/null and b/asset/icon/Icon32/change_password(2).png differ diff --git a/asset/icon/Icon32/change_password.png b/asset/icon/Icon32/change_password.png new file mode 100644 index 0000000..ea8f97a Binary files /dev/null and b/asset/icon/Icon32/change_password.png differ diff --git a/asset/icon/Icon32/change_whm_theme.png b/asset/icon/Icon32/change_whm_theme.png new file mode 100644 index 0000000..6ee7dcd Binary files /dev/null and b/asset/icon/Icon32/change_whm_theme.png differ diff --git a/asset/icon/Icon32/chart_bar.png b/asset/icon/Icon32/chart_bar.png new file mode 100644 index 0000000..a66163a Binary files /dev/null and b/asset/icon/Icon32/chart_bar.png differ diff --git a/asset/icon/Icon32/chart_bar_add.png b/asset/icon/Icon32/chart_bar_add.png new file mode 100644 index 0000000..138d853 Binary files /dev/null and b/asset/icon/Icon32/chart_bar_add.png differ diff --git a/asset/icon/Icon32/chart_bar_delete.png b/asset/icon/Icon32/chart_bar_delete.png new file mode 100644 index 0000000..287ada2 Binary files /dev/null and b/asset/icon/Icon32/chart_bar_delete.png differ diff --git a/asset/icon/Icon32/chart_bar_edit.png b/asset/icon/Icon32/chart_bar_edit.png new file mode 100644 index 0000000..5325eba Binary files /dev/null and b/asset/icon/Icon32/chart_bar_edit.png differ diff --git a/asset/icon/Icon32/chart_bar_error.png b/asset/icon/Icon32/chart_bar_error.png new file mode 100644 index 0000000..5b1e952 Binary files /dev/null and b/asset/icon/Icon32/chart_bar_error.png differ diff --git a/asset/icon/Icon32/chart_bar_link.png b/asset/icon/Icon32/chart_bar_link.png new file mode 100644 index 0000000..1a079c4 Binary files /dev/null and b/asset/icon/Icon32/chart_bar_link.png differ diff --git a/asset/icon/Icon32/chart_bullseye.png b/asset/icon/Icon32/chart_bullseye.png new file mode 100644 index 0000000..e5326da Binary files /dev/null and b/asset/icon/Icon32/chart_bullseye.png differ diff --git a/asset/icon/Icon32/chart_column.png b/asset/icon/Icon32/chart_column.png new file mode 100644 index 0000000..42395f2 Binary files /dev/null and b/asset/icon/Icon32/chart_column.png differ diff --git a/asset/icon/Icon32/chart_column_2.png b/asset/icon/Icon32/chart_column_2.png new file mode 100644 index 0000000..86632e0 Binary files /dev/null and b/asset/icon/Icon32/chart_column_2.png differ diff --git a/asset/icon/Icon32/chart_curve.png b/asset/icon/Icon32/chart_curve.png new file mode 100644 index 0000000..f51f8ff Binary files /dev/null and b/asset/icon/Icon32/chart_curve.png differ diff --git a/asset/icon/Icon32/chart_curve_add.png b/asset/icon/Icon32/chart_curve_add.png new file mode 100644 index 0000000..45b61c5 Binary files /dev/null and b/asset/icon/Icon32/chart_curve_add.png differ diff --git a/asset/icon/Icon32/chart_curve_delete.png b/asset/icon/Icon32/chart_curve_delete.png new file mode 100644 index 0000000..db432a9 Binary files /dev/null and b/asset/icon/Icon32/chart_curve_delete.png differ diff --git a/asset/icon/Icon32/chart_curve_edit.png b/asset/icon/Icon32/chart_curve_edit.png new file mode 100644 index 0000000..2012fba Binary files /dev/null and b/asset/icon/Icon32/chart_curve_edit.png differ diff --git a/asset/icon/Icon32/chart_curve_error.png b/asset/icon/Icon32/chart_curve_error.png new file mode 100644 index 0000000..5c550d6 Binary files /dev/null and b/asset/icon/Icon32/chart_curve_error.png differ diff --git a/asset/icon/Icon32/chart_curve_go.png b/asset/icon/Icon32/chart_curve_go.png new file mode 100644 index 0000000..6ddf244 Binary files /dev/null and b/asset/icon/Icon32/chart_curve_go.png differ diff --git a/asset/icon/Icon32/chart_curve_link.png b/asset/icon/Icon32/chart_curve_link.png new file mode 100644 index 0000000..3cc36b9 Binary files /dev/null and b/asset/icon/Icon32/chart_curve_link.png differ diff --git a/asset/icon/Icon32/chart_down_color.png b/asset/icon/Icon32/chart_down_color.png new file mode 100644 index 0000000..bad98dd Binary files /dev/null and b/asset/icon/Icon32/chart_down_color.png differ diff --git a/asset/icon/Icon32/chart_line.png b/asset/icon/Icon32/chart_line.png new file mode 100644 index 0000000..eaa1068 Binary files /dev/null and b/asset/icon/Icon32/chart_line.png differ diff --git a/asset/icon/Icon32/chart_line_add.png b/asset/icon/Icon32/chart_line_add.png new file mode 100644 index 0000000..d3d85b4 Binary files /dev/null and b/asset/icon/Icon32/chart_line_add.png differ diff --git a/asset/icon/Icon32/chart_line_delete.png b/asset/icon/Icon32/chart_line_delete.png new file mode 100644 index 0000000..f7feb5c Binary files /dev/null and b/asset/icon/Icon32/chart_line_delete.png differ diff --git a/asset/icon/Icon32/chart_line_edit.png b/asset/icon/Icon32/chart_line_edit.png new file mode 100644 index 0000000..7d47cb5 Binary files /dev/null and b/asset/icon/Icon32/chart_line_edit.png differ diff --git a/asset/icon/Icon32/chart_line_error.png b/asset/icon/Icon32/chart_line_error.png new file mode 100644 index 0000000..1d010a9 Binary files /dev/null and b/asset/icon/Icon32/chart_line_error.png differ diff --git a/asset/icon/Icon32/chart_line_link.png b/asset/icon/Icon32/chart_line_link.png new file mode 100644 index 0000000..55ea6a5 Binary files /dev/null and b/asset/icon/Icon32/chart_line_link.png differ diff --git a/asset/icon/Icon32/chart_organisation.png b/asset/icon/Icon32/chart_organisation.png new file mode 100644 index 0000000..5d408a3 Binary files /dev/null and b/asset/icon/Icon32/chart_organisation.png differ diff --git a/asset/icon/Icon32/chart_organisation_add.png b/asset/icon/Icon32/chart_organisation_add.png new file mode 100644 index 0000000..92b5fe1 Binary files /dev/null and b/asset/icon/Icon32/chart_organisation_add.png differ diff --git a/asset/icon/Icon32/chart_organisation_delete.png b/asset/icon/Icon32/chart_organisation_delete.png new file mode 100644 index 0000000..78cc3b9 Binary files /dev/null and b/asset/icon/Icon32/chart_organisation_delete.png differ diff --git a/asset/icon/Icon32/chart_pie(2).png b/asset/icon/Icon32/chart_pie(2).png new file mode 100644 index 0000000..ffb794b Binary files /dev/null and b/asset/icon/Icon32/chart_pie(2).png differ diff --git a/asset/icon/Icon32/chart_pie.png b/asset/icon/Icon32/chart_pie.png new file mode 100644 index 0000000..6d14c72 Binary files /dev/null and b/asset/icon/Icon32/chart_pie.png differ diff --git a/asset/icon/Icon32/chart_pie_add.png b/asset/icon/Icon32/chart_pie_add.png new file mode 100644 index 0000000..1afd6c3 Binary files /dev/null and b/asset/icon/Icon32/chart_pie_add.png differ diff --git a/asset/icon/Icon32/chart_pie_delete.png b/asset/icon/Icon32/chart_pie_delete.png new file mode 100644 index 0000000..b579718 Binary files /dev/null and b/asset/icon/Icon32/chart_pie_delete.png differ diff --git a/asset/icon/Icon32/chart_pie_edit.png b/asset/icon/Icon32/chart_pie_edit.png new file mode 100644 index 0000000..1bb6dec Binary files /dev/null and b/asset/icon/Icon32/chart_pie_edit.png differ diff --git a/asset/icon/Icon32/chart_pie_error.png b/asset/icon/Icon32/chart_pie_error.png new file mode 100644 index 0000000..543f084 Binary files /dev/null and b/asset/icon/Icon32/chart_pie_error.png differ diff --git a/asset/icon/Icon32/chart_pie_link.png b/asset/icon/Icon32/chart_pie_link.png new file mode 100644 index 0000000..e4d8de2 Binary files /dev/null and b/asset/icon/Icon32/chart_pie_link.png differ diff --git a/asset/icon/Icon32/chart_stock.png b/asset/icon/Icon32/chart_stock.png new file mode 100644 index 0000000..f1a0674 Binary files /dev/null and b/asset/icon/Icon32/chart_stock.png differ diff --git a/asset/icon/Icon32/chart_up_color.png b/asset/icon/Icon32/chart_up_color.png new file mode 100644 index 0000000..afb01cc Binary files /dev/null and b/asset/icon/Icon32/chart_up_color.png differ diff --git a/asset/icon/Icon32/chartplotter.png b/asset/icon/Icon32/chartplotter.png new file mode 100644 index 0000000..9deb2c7 Binary files /dev/null and b/asset/icon/Icon32/chartplotter.png differ diff --git a/asset/icon/Icon32/check_box.png b/asset/icon/Icon32/check_box.png new file mode 100644 index 0000000..4f5b922 Binary files /dev/null and b/asset/icon/Icon32/check_box.png differ diff --git a/asset/icon/Icon32/check_box_list.png b/asset/icon/Icon32/check_box_list.png new file mode 100644 index 0000000..7d36dbd Binary files /dev/null and b/asset/icon/Icon32/check_box_list.png differ diff --git a/asset/icon/Icon32/check_box_mix.png b/asset/icon/Icon32/check_box_mix.png new file mode 100644 index 0000000..265c8da Binary files /dev/null and b/asset/icon/Icon32/check_box_mix.png differ diff --git a/asset/icon/Icon32/check_box_uncheck.png b/asset/icon/Icon32/check_box_uncheck.png new file mode 100644 index 0000000..2b3ab4f Binary files /dev/null and b/asset/icon/Icon32/check_box_uncheck.png differ diff --git a/asset/icon/Icon32/check_boxes.png b/asset/icon/Icon32/check_boxes.png new file mode 100644 index 0000000..52230e3 Binary files /dev/null and b/asset/icon/Icon32/check_boxes.png differ diff --git a/asset/icon/Icon32/check_boxes_series.png b/asset/icon/Icon32/check_boxes_series.png new file mode 100644 index 0000000..b885027 Binary files /dev/null and b/asset/icon/Icon32/check_boxes_series.png differ diff --git a/asset/icon/Icon32/check_field.png b/asset/icon/Icon32/check_field.png new file mode 100644 index 0000000..a43ff47 Binary files /dev/null and b/asset/icon/Icon32/check_field.png differ diff --git a/asset/icon/Icon32/checkerboard.png b/asset/icon/Icon32/checkerboard.png new file mode 100644 index 0000000..9acc688 Binary files /dev/null and b/asset/icon/Icon32/checkerboard.png differ diff --git a/asset/icon/Icon32/cheese.png b/asset/icon/Icon32/cheese.png new file mode 100644 index 0000000..2ce7431 Binary files /dev/null and b/asset/icon/Icon32/cheese.png differ diff --git a/asset/icon/Icon32/chefs_hat.png b/asset/icon/Icon32/chefs_hat.png new file mode 100644 index 0000000..c52355c Binary files /dev/null and b/asset/icon/Icon32/chefs_hat.png differ diff --git a/asset/icon/Icon32/cheque.png b/asset/icon/Icon32/cheque.png new file mode 100644 index 0000000..79087a8 Binary files /dev/null and b/asset/icon/Icon32/cheque.png differ diff --git a/asset/icon/Icon32/chess_bishop.png b/asset/icon/Icon32/chess_bishop.png new file mode 100644 index 0000000..0e44100 Binary files /dev/null and b/asset/icon/Icon32/chess_bishop.png differ diff --git a/asset/icon/Icon32/chess_bishop_white.png b/asset/icon/Icon32/chess_bishop_white.png new file mode 100644 index 0000000..5ff0733 Binary files /dev/null and b/asset/icon/Icon32/chess_bishop_white.png differ diff --git a/asset/icon/Icon32/chess_horse.png b/asset/icon/Icon32/chess_horse.png new file mode 100644 index 0000000..7fb3d6c Binary files /dev/null and b/asset/icon/Icon32/chess_horse.png differ diff --git a/asset/icon/Icon32/chess_horse_white.png b/asset/icon/Icon32/chess_horse_white.png new file mode 100644 index 0000000..2300231 Binary files /dev/null and b/asset/icon/Icon32/chess_horse_white.png differ diff --git a/asset/icon/Icon32/chess_king.png b/asset/icon/Icon32/chess_king.png new file mode 100644 index 0000000..88a0499 Binary files /dev/null and b/asset/icon/Icon32/chess_king.png differ diff --git a/asset/icon/Icon32/chess_king_white.png b/asset/icon/Icon32/chess_king_white.png new file mode 100644 index 0000000..c0d52b7 Binary files /dev/null and b/asset/icon/Icon32/chess_king_white.png differ diff --git a/asset/icon/Icon32/chess_pawn.png b/asset/icon/Icon32/chess_pawn.png new file mode 100644 index 0000000..7e8d101 Binary files /dev/null and b/asset/icon/Icon32/chess_pawn.png differ diff --git a/asset/icon/Icon32/chess_pawn_white.png b/asset/icon/Icon32/chess_pawn_white.png new file mode 100644 index 0000000..da19144 Binary files /dev/null and b/asset/icon/Icon32/chess_pawn_white.png differ diff --git a/asset/icon/Icon32/chess_queen.png b/asset/icon/Icon32/chess_queen.png new file mode 100644 index 0000000..31b0c9c Binary files /dev/null and b/asset/icon/Icon32/chess_queen.png differ diff --git a/asset/icon/Icon32/chess_queen_white.png b/asset/icon/Icon32/chess_queen_white.png new file mode 100644 index 0000000..081bec3 Binary files /dev/null and b/asset/icon/Icon32/chess_queen_white.png differ diff --git a/asset/icon/Icon32/chess_tower.png b/asset/icon/Icon32/chess_tower.png new file mode 100644 index 0000000..1fbd6db Binary files /dev/null and b/asset/icon/Icon32/chess_tower.png differ diff --git a/asset/icon/Icon32/chess_tower_white.png b/asset/icon/Icon32/chess_tower_white.png new file mode 100644 index 0000000..85b96df Binary files /dev/null and b/asset/icon/Icon32/chess_tower_white.png differ diff --git a/asset/icon/Icon32/chiken_leg.png b/asset/icon/Icon32/chiken_leg.png new file mode 100644 index 0000000..33b65a4 Binary files /dev/null and b/asset/icon/Icon32/chiken_leg.png differ diff --git a/asset/icon/Icon32/children_cap.png b/asset/icon/Icon32/children_cap.png new file mode 100644 index 0000000..ff0b502 Binary files /dev/null and b/asset/icon/Icon32/children_cap.png differ diff --git a/asset/icon/Icon32/chinese_noodles.png b/asset/icon/Icon32/chinese_noodles.png new file mode 100644 index 0000000..fd94a67 Binary files /dev/null and b/asset/icon/Icon32/chinese_noodles.png differ diff --git a/asset/icon/Icon32/chocolate.png b/asset/icon/Icon32/chocolate.png new file mode 100644 index 0000000..8f89cf9 Binary files /dev/null and b/asset/icon/Icon32/chocolate.png differ diff --git a/asset/icon/Icon32/chocolate_bite.png b/asset/icon/Icon32/chocolate_bite.png new file mode 100644 index 0000000..57069a2 Binary files /dev/null and b/asset/icon/Icon32/chocolate_bite.png differ diff --git a/asset/icon/Icon32/chocolate_milk.png b/asset/icon/Icon32/chocolate_milk.png new file mode 100644 index 0000000..61df6f7 Binary files /dev/null and b/asset/icon/Icon32/chocolate_milk.png differ diff --git a/asset/icon/Icon32/choose_log_programs.png b/asset/icon/Icon32/choose_log_programs.png new file mode 100644 index 0000000..2ef6bd2 Binary files /dev/null and b/asset/icon/Icon32/choose_log_programs.png differ diff --git a/asset/icon/Icon32/christmas_tree.png b/asset/icon/Icon32/christmas_tree.png new file mode 100644 index 0000000..dc8104c Binary files /dev/null and b/asset/icon/Icon32/christmas_tree.png differ diff --git a/asset/icon/Icon32/church.png b/asset/icon/Icon32/church.png new file mode 100644 index 0000000..2a851b1 Binary files /dev/null and b/asset/icon/Icon32/church.png differ diff --git a/asset/icon/Icon32/cigarette.png b/asset/icon/Icon32/cigarette.png new file mode 100644 index 0000000..2f43055 Binary files /dev/null and b/asset/icon/Icon32/cigarette.png differ diff --git a/asset/icon/Icon32/cinema_ticket.png b/asset/icon/Icon32/cinema_ticket.png new file mode 100644 index 0000000..cf9ca96 Binary files /dev/null and b/asset/icon/Icon32/cinema_ticket.png differ diff --git a/asset/icon/Icon32/circus.png b/asset/icon/Icon32/circus.png new file mode 100644 index 0000000..2508128 Binary files /dev/null and b/asset/icon/Icon32/circus.png differ diff --git a/asset/icon/Icon32/cirrus.png b/asset/icon/Icon32/cirrus.png new file mode 100644 index 0000000..ec99679 Binary files /dev/null and b/asset/icon/Icon32/cirrus.png differ diff --git a/asset/icon/Icon32/class_module.png b/asset/icon/Icon32/class_module.png new file mode 100644 index 0000000..c308007 Binary files /dev/null and b/asset/icon/Icon32/class_module.png differ diff --git a/asset/icon/Icon32/clear_formatting.png b/asset/icon/Icon32/clear_formatting.png new file mode 100644 index 0000000..644b84d Binary files /dev/null and b/asset/icon/Icon32/clear_formatting.png differ diff --git a/asset/icon/Icon32/client_account_template.png b/asset/icon/Icon32/client_account_template.png new file mode 100644 index 0000000..0b868ef Binary files /dev/null and b/asset/icon/Icon32/client_account_template.png differ diff --git a/asset/icon/Icon32/clip_splitter.png b/asset/icon/Icon32/clip_splitter.png new file mode 100644 index 0000000..f2ab7f3 Binary files /dev/null and b/asset/icon/Icon32/clip_splitter.png differ diff --git a/asset/icon/Icon32/clipart_pane.png b/asset/icon/Icon32/clipart_pane.png new file mode 100644 index 0000000..aca19a7 Binary files /dev/null and b/asset/icon/Icon32/clipart_pane.png differ diff --git a/asset/icon/Icon32/clipboard_empty.png b/asset/icon/Icon32/clipboard_empty.png new file mode 100644 index 0000000..11c9fea Binary files /dev/null and b/asset/icon/Icon32/clipboard_empty.png differ diff --git a/asset/icon/Icon32/clipboard_invoice.png b/asset/icon/Icon32/clipboard_invoice.png new file mode 100644 index 0000000..8e0f6b5 Binary files /dev/null and b/asset/icon/Icon32/clipboard_invoice.png differ diff --git a/asset/icon/Icon32/clipboard_sign.png b/asset/icon/Icon32/clipboard_sign.png new file mode 100644 index 0000000..b2e1111 Binary files /dev/null and b/asset/icon/Icon32/clipboard_sign.png differ diff --git a/asset/icon/Icon32/clipboard_sign_out.png b/asset/icon/Icon32/clipboard_sign_out.png new file mode 100644 index 0000000..674111a Binary files /dev/null and b/asset/icon/Icon32/clipboard_sign_out.png differ diff --git a/asset/icon/Icon32/clock_.png b/asset/icon/Icon32/clock_.png new file mode 100644 index 0000000..58b4cf5 Binary files /dev/null and b/asset/icon/Icon32/clock_.png differ diff --git a/asset/icon/Icon32/clock_15.png b/asset/icon/Icon32/clock_15.png new file mode 100644 index 0000000..303a4b9 Binary files /dev/null and b/asset/icon/Icon32/clock_15.png differ diff --git a/asset/icon/Icon32/clock_45.png b/asset/icon/Icon32/clock_45.png new file mode 100644 index 0000000..63e07cf Binary files /dev/null and b/asset/icon/Icon32/clock_45.png differ diff --git a/asset/icon/Icon32/clock_add.png b/asset/icon/Icon32/clock_add.png new file mode 100644 index 0000000..c61c062 Binary files /dev/null and b/asset/icon/Icon32/clock_add.png differ diff --git a/asset/icon/Icon32/clock_delete.png b/asset/icon/Icon32/clock_delete.png new file mode 100644 index 0000000..2f8ffb8 Binary files /dev/null and b/asset/icon/Icon32/clock_delete.png differ diff --git a/asset/icon/Icon32/clock_edit.png b/asset/icon/Icon32/clock_edit.png new file mode 100644 index 0000000..b3a6138 Binary files /dev/null and b/asset/icon/Icon32/clock_edit.png differ diff --git a/asset/icon/Icon32/clock_error.png b/asset/icon/Icon32/clock_error.png new file mode 100644 index 0000000..1df7107 Binary files /dev/null and b/asset/icon/Icon32/clock_error.png differ diff --git a/asset/icon/Icon32/clock_go.png b/asset/icon/Icon32/clock_go.png new file mode 100644 index 0000000..ae4c9d9 Binary files /dev/null and b/asset/icon/Icon32/clock_go.png differ diff --git a/asset/icon/Icon32/clock_history_frame.png b/asset/icon/Icon32/clock_history_frame.png new file mode 100644 index 0000000..ce59927 Binary files /dev/null and b/asset/icon/Icon32/clock_history_frame.png differ diff --git a/asset/icon/Icon32/clock_link.png b/asset/icon/Icon32/clock_link.png new file mode 100644 index 0000000..3f15b19 Binary files /dev/null and b/asset/icon/Icon32/clock_link.png differ diff --git a/asset/icon/Icon32/clock_moon_phase.png b/asset/icon/Icon32/clock_moon_phase.png new file mode 100644 index 0000000..b16f592 Binary files /dev/null and b/asset/icon/Icon32/clock_moon_phase.png differ diff --git a/asset/icon/Icon32/clock_pause.png b/asset/icon/Icon32/clock_pause.png new file mode 100644 index 0000000..762682b Binary files /dev/null and b/asset/icon/Icon32/clock_pause.png differ diff --git a/asset/icon/Icon32/clock_play.png b/asset/icon/Icon32/clock_play.png new file mode 100644 index 0000000..6fc1c40 Binary files /dev/null and b/asset/icon/Icon32/clock_play.png differ diff --git a/asset/icon/Icon32/clock_red.png b/asset/icon/Icon32/clock_red.png new file mode 100644 index 0000000..63f8d0e Binary files /dev/null and b/asset/icon/Icon32/clock_red.png differ diff --git a/asset/icon/Icon32/clock_select_remain.png b/asset/icon/Icon32/clock_select_remain.png new file mode 100644 index 0000000..556445d Binary files /dev/null and b/asset/icon/Icon32/clock_select_remain.png differ diff --git a/asset/icon/Icon32/clock_stop.png b/asset/icon/Icon32/clock_stop.png new file mode 100644 index 0000000..2c9d7f6 Binary files /dev/null and b/asset/icon/Icon32/clock_stop.png differ diff --git a/asset/icon/Icon32/clown_fish.png b/asset/icon/Icon32/clown_fish.png new file mode 100644 index 0000000..faf7168 Binary files /dev/null and b/asset/icon/Icon32/clown_fish.png differ diff --git a/asset/icon/Icon32/co2.png b/asset/icon/Icon32/co2.png new file mode 100644 index 0000000..1fa7eb8 Binary files /dev/null and b/asset/icon/Icon32/co2.png differ diff --git a/asset/icon/Icon32/cocacola.png b/asset/icon/Icon32/cocacola.png new file mode 100644 index 0000000..648b294 Binary files /dev/null and b/asset/icon/Icon32/cocacola.png differ diff --git a/asset/icon/Icon32/code.png b/asset/icon/Icon32/code.png new file mode 100644 index 0000000..227d844 Binary files /dev/null and b/asset/icon/Icon32/code.png differ diff --git a/asset/icon/Icon32/cog.png b/asset/icon/Icon32/cog.png new file mode 100644 index 0000000..d53ebf1 Binary files /dev/null and b/asset/icon/Icon32/cog.png differ diff --git a/asset/icon/Icon32/cog_add.png b/asset/icon/Icon32/cog_add.png new file mode 100644 index 0000000..b79b69d Binary files /dev/null and b/asset/icon/Icon32/cog_add.png differ diff --git a/asset/icon/Icon32/cog_delete.png b/asset/icon/Icon32/cog_delete.png new file mode 100644 index 0000000..924e04d Binary files /dev/null and b/asset/icon/Icon32/cog_delete.png differ diff --git a/asset/icon/Icon32/cog_edit.png b/asset/icon/Icon32/cog_edit.png new file mode 100644 index 0000000..7b7cb83 Binary files /dev/null and b/asset/icon/Icon32/cog_edit.png differ diff --git a/asset/icon/Icon32/cog_error.png b/asset/icon/Icon32/cog_error.png new file mode 100644 index 0000000..973ce1f Binary files /dev/null and b/asset/icon/Icon32/cog_error.png differ diff --git a/asset/icon/Icon32/cog_go.png b/asset/icon/Icon32/cog_go.png new file mode 100644 index 0000000..360a239 Binary files /dev/null and b/asset/icon/Icon32/cog_go.png differ diff --git a/asset/icon/Icon32/coin_single_cooper.png b/asset/icon/Icon32/coin_single_cooper.png new file mode 100644 index 0000000..163a6ca Binary files /dev/null and b/asset/icon/Icon32/coin_single_cooper.png differ diff --git a/asset/icon/Icon32/coin_single_gold.png b/asset/icon/Icon32/coin_single_gold.png new file mode 100644 index 0000000..2ed2677 Binary files /dev/null and b/asset/icon/Icon32/coin_single_gold.png differ diff --git a/asset/icon/Icon32/coin_single_silver.png b/asset/icon/Icon32/coin_single_silver.png new file mode 100644 index 0000000..d2a16a5 Binary files /dev/null and b/asset/icon/Icon32/coin_single_silver.png differ diff --git a/asset/icon/Icon32/coin_stack_gold.png b/asset/icon/Icon32/coin_stack_gold.png new file mode 100644 index 0000000..4cb4460 Binary files /dev/null and b/asset/icon/Icon32/coin_stack_gold.png differ diff --git a/asset/icon/Icon32/coins.png b/asset/icon/Icon32/coins.png new file mode 100644 index 0000000..27d0722 Binary files /dev/null and b/asset/icon/Icon32/coins.png differ diff --git a/asset/icon/Icon32/coins_add.png b/asset/icon/Icon32/coins_add.png new file mode 100644 index 0000000..6f3ce53 Binary files /dev/null and b/asset/icon/Icon32/coins_add.png differ diff --git a/asset/icon/Icon32/coins_delete.png b/asset/icon/Icon32/coins_delete.png new file mode 100644 index 0000000..4e7afd2 Binary files /dev/null and b/asset/icon/Icon32/coins_delete.png differ diff --git a/asset/icon/Icon32/coins_in_hand.png b/asset/icon/Icon32/coins_in_hand.png new file mode 100644 index 0000000..aaceea1 Binary files /dev/null and b/asset/icon/Icon32/coins_in_hand.png differ diff --git a/asset/icon/Icon32/cold.png b/asset/icon/Icon32/cold.png new file mode 100644 index 0000000..3aadb7b Binary files /dev/null and b/asset/icon/Icon32/cold.png differ diff --git a/asset/icon/Icon32/collecting_data.png b/asset/icon/Icon32/collecting_data.png new file mode 100644 index 0000000..5391d32 Binary files /dev/null and b/asset/icon/Icon32/collecting_data.png differ diff --git a/asset/icon/Icon32/color_adjustment.png b/asset/icon/Icon32/color_adjustment.png new file mode 100644 index 0000000..c0ac60c Binary files /dev/null and b/asset/icon/Icon32/color_adjustment.png differ diff --git a/asset/icon/Icon32/color_adjustment_blue.png b/asset/icon/Icon32/color_adjustment_blue.png new file mode 100644 index 0000000..6b8bf40 Binary files /dev/null and b/asset/icon/Icon32/color_adjustment_blue.png differ diff --git a/asset/icon/Icon32/color_adjustment_green.png b/asset/icon/Icon32/color_adjustment_green.png new file mode 100644 index 0000000..5b743e4 Binary files /dev/null and b/asset/icon/Icon32/color_adjustment_green.png differ diff --git a/asset/icon/Icon32/color_adjustment_red.png b/asset/icon/Icon32/color_adjustment_red.png new file mode 100644 index 0000000..9e67eb5 Binary files /dev/null and b/asset/icon/Icon32/color_adjustment_red.png differ diff --git a/asset/icon/Icon32/color_gradient.png b/asset/icon/Icon32/color_gradient.png new file mode 100644 index 0000000..56d72b1 Binary files /dev/null and b/asset/icon/Icon32/color_gradient.png differ diff --git a/asset/icon/Icon32/color_management.png b/asset/icon/Icon32/color_management.png new file mode 100644 index 0000000..d9d7eb8 Binary files /dev/null and b/asset/icon/Icon32/color_management.png differ diff --git a/asset/icon/Icon32/color_picker(2).png b/asset/icon/Icon32/color_picker(2).png new file mode 100644 index 0000000..0b6310d Binary files /dev/null and b/asset/icon/Icon32/color_picker(2).png differ diff --git a/asset/icon/Icon32/color_picker.png b/asset/icon/Icon32/color_picker.png new file mode 100644 index 0000000..73e6cdf Binary files /dev/null and b/asset/icon/Icon32/color_picker.png differ diff --git a/asset/icon/Icon32/color_picker_default.png b/asset/icon/Icon32/color_picker_default.png new file mode 100644 index 0000000..039911d Binary files /dev/null and b/asset/icon/Icon32/color_picker_default.png differ diff --git a/asset/icon/Icon32/color_picker_switch.png b/asset/icon/Icon32/color_picker_switch.png new file mode 100644 index 0000000..2f39154 Binary files /dev/null and b/asset/icon/Icon32/color_picker_switch.png differ diff --git a/asset/icon/Icon32/color_picker_transparent.png b/asset/icon/Icon32/color_picker_transparent.png new file mode 100644 index 0000000..b607a2d Binary files /dev/null and b/asset/icon/Icon32/color_picker_transparent.png differ diff --git a/asset/icon/Icon32/color_swatch.png b/asset/icon/Icon32/color_swatch.png new file mode 100644 index 0000000..25ad9f1 Binary files /dev/null and b/asset/icon/Icon32/color_swatch.png differ diff --git a/asset/icon/Icon32/color_swatches.png b/asset/icon/Icon32/color_swatches.png new file mode 100644 index 0000000..2e61d75 Binary files /dev/null and b/asset/icon/Icon32/color_swatches.png differ diff --git a/asset/icon/Icon32/color_wheel.png b/asset/icon/Icon32/color_wheel.png new file mode 100644 index 0000000..7bc293a Binary files /dev/null and b/asset/icon/Icon32/color_wheel.png differ diff --git a/asset/icon/Icon32/column_double.png b/asset/icon/Icon32/column_double.png new file mode 100644 index 0000000..a4c1d96 Binary files /dev/null and b/asset/icon/Icon32/column_double.png differ diff --git a/asset/icon/Icon32/column_four.png b/asset/icon/Icon32/column_four.png new file mode 100644 index 0000000..e14ef33 Binary files /dev/null and b/asset/icon/Icon32/column_four.png differ diff --git a/asset/icon/Icon32/column_left.png b/asset/icon/Icon32/column_left.png new file mode 100644 index 0000000..14577ca Binary files /dev/null and b/asset/icon/Icon32/column_left.png differ diff --git a/asset/icon/Icon32/column_one.png b/asset/icon/Icon32/column_one.png new file mode 100644 index 0000000..00b14bb Binary files /dev/null and b/asset/icon/Icon32/column_one.png differ diff --git a/asset/icon/Icon32/column_right.png b/asset/icon/Icon32/column_right.png new file mode 100644 index 0000000..1263d7b Binary files /dev/null and b/asset/icon/Icon32/column_right.png differ diff --git a/asset/icon/Icon32/column_single.png b/asset/icon/Icon32/column_single.png new file mode 100644 index 0000000..4e2d817 Binary files /dev/null and b/asset/icon/Icon32/column_single.png differ diff --git a/asset/icon/Icon32/column_tree.png b/asset/icon/Icon32/column_tree.png new file mode 100644 index 0000000..ede68b8 Binary files /dev/null and b/asset/icon/Icon32/column_tree.png differ diff --git a/asset/icon/Icon32/column_two.png b/asset/icon/Icon32/column_two.png new file mode 100644 index 0000000..ecca8ee Binary files /dev/null and b/asset/icon/Icon32/column_two.png differ diff --git a/asset/icon/Icon32/column_wight.png b/asset/icon/Icon32/column_wight.png new file mode 100644 index 0000000..41a77b4 Binary files /dev/null and b/asset/icon/Icon32/column_wight.png differ diff --git a/asset/icon/Icon32/columnchart.png b/asset/icon/Icon32/columnchart.png new file mode 100644 index 0000000..463a8e0 Binary files /dev/null and b/asset/icon/Icon32/columnchart.png differ diff --git a/asset/icon/Icon32/combined_chart.png b/asset/icon/Icon32/combined_chart.png new file mode 100644 index 0000000..dcefbe7 Binary files /dev/null and b/asset/icon/Icon32/combined_chart.png differ diff --git a/asset/icon/Icon32/combo_box.png b/asset/icon/Icon32/combo_box.png new file mode 100644 index 0000000..87f56b8 Binary files /dev/null and b/asset/icon/Icon32/combo_box.png differ diff --git a/asset/icon/Icon32/combo_box_calendar.png b/asset/icon/Icon32/combo_box_calendar.png new file mode 100644 index 0000000..8459dcf Binary files /dev/null and b/asset/icon/Icon32/combo_box_calendar.png differ diff --git a/asset/icon/Icon32/combo_box_edit.png b/asset/icon/Icon32/combo_box_edit.png new file mode 100644 index 0000000..dec63f4 Binary files /dev/null and b/asset/icon/Icon32/combo_box_edit.png differ diff --git a/asset/icon/Icon32/combo_box_light_blue.png b/asset/icon/Icon32/combo_box_light_blue.png new file mode 100644 index 0000000..dec37ff Binary files /dev/null and b/asset/icon/Icon32/combo_box_light_blue.png differ diff --git a/asset/icon/Icon32/combo_boxes.png b/asset/icon/Icon32/combo_boxes.png new file mode 100644 index 0000000..6965498 Binary files /dev/null and b/asset/icon/Icon32/combo_boxes.png differ diff --git a/asset/icon/Icon32/comment.png b/asset/icon/Icon32/comment.png new file mode 100644 index 0000000..30968ff Binary files /dev/null and b/asset/icon/Icon32/comment.png differ diff --git a/asset/icon/Icon32/comment_add.png b/asset/icon/Icon32/comment_add.png new file mode 100644 index 0000000..a7c0a3a Binary files /dev/null and b/asset/icon/Icon32/comment_add.png differ diff --git a/asset/icon/Icon32/comment_box.png b/asset/icon/Icon32/comment_box.png new file mode 100644 index 0000000..b7803bd Binary files /dev/null and b/asset/icon/Icon32/comment_box.png differ diff --git a/asset/icon/Icon32/comment_delete.png b/asset/icon/Icon32/comment_delete.png new file mode 100644 index 0000000..3efd794 Binary files /dev/null and b/asset/icon/Icon32/comment_delete.png differ diff --git a/asset/icon/Icon32/comment_edit.png b/asset/icon/Icon32/comment_edit.png new file mode 100644 index 0000000..1abf524 Binary files /dev/null and b/asset/icon/Icon32/comment_edit.png differ diff --git a/asset/icon/Icon32/comment_facebook.png b/asset/icon/Icon32/comment_facebook.png new file mode 100644 index 0000000..d7a4bef Binary files /dev/null and b/asset/icon/Icon32/comment_facebook.png differ diff --git a/asset/icon/Icon32/comment_facebook_box.png b/asset/icon/Icon32/comment_facebook_box.png new file mode 100644 index 0000000..547941b Binary files /dev/null and b/asset/icon/Icon32/comment_facebook_box.png differ diff --git a/asset/icon/Icon32/comment_google.png b/asset/icon/Icon32/comment_google.png new file mode 100644 index 0000000..1a66bd6 Binary files /dev/null and b/asset/icon/Icon32/comment_google.png differ diff --git a/asset/icon/Icon32/comment_twitter.png b/asset/icon/Icon32/comment_twitter.png new file mode 100644 index 0000000..3bbd134 Binary files /dev/null and b/asset/icon/Icon32/comment_twitter.png differ diff --git a/asset/icon/Icon32/comment_twitter_box.png b/asset/icon/Icon32/comment_twitter_box.png new file mode 100644 index 0000000..dcacbb7 Binary files /dev/null and b/asset/icon/Icon32/comment_twitter_box.png differ diff --git a/asset/icon/Icon32/comment_twitter_retwit.png b/asset/icon/Icon32/comment_twitter_retwit.png new file mode 100644 index 0000000..d91b262 Binary files /dev/null and b/asset/icon/Icon32/comment_twitter_retwit.png differ diff --git a/asset/icon/Icon32/comment_white.png b/asset/icon/Icon32/comment_white.png new file mode 100644 index 0000000..3741ae6 Binary files /dev/null and b/asset/icon/Icon32/comment_white.png differ diff --git a/asset/icon/Icon32/comments.png b/asset/icon/Icon32/comments.png new file mode 100644 index 0000000..61ae64b Binary files /dev/null and b/asset/icon/Icon32/comments.png differ diff --git a/asset/icon/Icon32/comments_add.png b/asset/icon/Icon32/comments_add.png new file mode 100644 index 0000000..a9da02a Binary files /dev/null and b/asset/icon/Icon32/comments_add.png differ diff --git a/asset/icon/Icon32/comments_delete.png b/asset/icon/Icon32/comments_delete.png new file mode 100644 index 0000000..bab6bc2 Binary files /dev/null and b/asset/icon/Icon32/comments_delete.png differ diff --git a/asset/icon/Icon32/comments_facebook.png b/asset/icon/Icon32/comments_facebook.png new file mode 100644 index 0000000..7d33203 Binary files /dev/null and b/asset/icon/Icon32/comments_facebook.png differ diff --git a/asset/icon/Icon32/comments_twitter.png b/asset/icon/Icon32/comments_twitter.png new file mode 100644 index 0000000..4bd63cc Binary files /dev/null and b/asset/icon/Icon32/comments_twitter.png differ diff --git a/asset/icon/Icon32/company_generosity.png b/asset/icon/Icon32/company_generosity.png new file mode 100644 index 0000000..fa305d9 Binary files /dev/null and b/asset/icon/Icon32/company_generosity.png differ diff --git a/asset/icon/Icon32/compare.png b/asset/icon/Icon32/compare.png new file mode 100644 index 0000000..82b8088 Binary files /dev/null and b/asset/icon/Icon32/compare.png differ diff --git a/asset/icon/Icon32/compass.png b/asset/icon/Icon32/compass.png new file mode 100644 index 0000000..ee4f453 Binary files /dev/null and b/asset/icon/Icon32/compass.png differ diff --git a/asset/icon/Icon32/compile.png b/asset/icon/Icon32/compile.png new file mode 100644 index 0000000..b98581e Binary files /dev/null and b/asset/icon/Icon32/compile.png differ diff --git a/asset/icon/Icon32/compile_error.png b/asset/icon/Icon32/compile_error.png new file mode 100644 index 0000000..f7ede45 Binary files /dev/null and b/asset/icon/Icon32/compile_error.png differ diff --git a/asset/icon/Icon32/compile_warning.png b/asset/icon/Icon32/compile_warning.png new file mode 100644 index 0000000..741f75e Binary files /dev/null and b/asset/icon/Icon32/compile_warning.png differ diff --git a/asset/icon/Icon32/compress.png b/asset/icon/Icon32/compress.png new file mode 100644 index 0000000..d5216fb Binary files /dev/null and b/asset/icon/Icon32/compress.png differ diff --git a/asset/icon/Icon32/compress_repair.png b/asset/icon/Icon32/compress_repair.png new file mode 100644 index 0000000..b0a7309 Binary files /dev/null and b/asset/icon/Icon32/compress_repair.png differ diff --git a/asset/icon/Icon32/computer.png b/asset/icon/Icon32/computer.png new file mode 100644 index 0000000..8d207a8 Binary files /dev/null and b/asset/icon/Icon32/computer.png differ diff --git a/asset/icon/Icon32/computer_add.png b/asset/icon/Icon32/computer_add.png new file mode 100644 index 0000000..a08763b Binary files /dev/null and b/asset/icon/Icon32/computer_add.png differ diff --git a/asset/icon/Icon32/computer_delete.png b/asset/icon/Icon32/computer_delete.png new file mode 100644 index 0000000..5a4416e Binary files /dev/null and b/asset/icon/Icon32/computer_delete.png differ diff --git a/asset/icon/Icon32/computer_edit.png b/asset/icon/Icon32/computer_edit.png new file mode 100644 index 0000000..07a0101 Binary files /dev/null and b/asset/icon/Icon32/computer_edit.png differ diff --git a/asset/icon/Icon32/computer_error.png b/asset/icon/Icon32/computer_error.png new file mode 100644 index 0000000..721af66 Binary files /dev/null and b/asset/icon/Icon32/computer_error.png differ diff --git a/asset/icon/Icon32/computer_go.png b/asset/icon/Icon32/computer_go.png new file mode 100644 index 0000000..89e2b46 Binary files /dev/null and b/asset/icon/Icon32/computer_go.png differ diff --git a/asset/icon/Icon32/computer_key.png b/asset/icon/Icon32/computer_key.png new file mode 100644 index 0000000..6255bf0 Binary files /dev/null and b/asset/icon/Icon32/computer_key.png differ diff --git a/asset/icon/Icon32/computer_link.png b/asset/icon/Icon32/computer_link.png new file mode 100644 index 0000000..7112e46 Binary files /dev/null and b/asset/icon/Icon32/computer_link.png differ diff --git a/asset/icon/Icon32/configure_cluster.png b/asset/icon/Icon32/configure_cluster.png new file mode 100644 index 0000000..00d7ea2 Binary files /dev/null and b/asset/icon/Icon32/configure_cluster.png differ diff --git a/asset/icon/Icon32/configure_customer_contacts.png b/asset/icon/Icon32/configure_customer_contacts.png new file mode 100644 index 0000000..b185e48 Binary files /dev/null and b/asset/icon/Icon32/configure_customer_contacts.png differ diff --git a/asset/icon/Icon32/connect.png b/asset/icon/Icon32/connect.png new file mode 100644 index 0000000..203b5e2 Binary files /dev/null and b/asset/icon/Icon32/connect.png differ diff --git a/asset/icon/Icon32/connections.png b/asset/icon/Icon32/connections.png new file mode 100644 index 0000000..a382cdb Binary files /dev/null and b/asset/icon/Icon32/connections.png differ diff --git a/asset/icon/Icon32/consolidate.png b/asset/icon/Icon32/consolidate.png new file mode 100644 index 0000000..d6f76f2 Binary files /dev/null and b/asset/icon/Icon32/consolidate.png differ diff --git a/asset/icon/Icon32/construction.png b/asset/icon/Icon32/construction.png new file mode 100644 index 0000000..1f058e2 Binary files /dev/null and b/asset/icon/Icon32/construction.png differ diff --git a/asset/icon/Icon32/contact_email.png b/asset/icon/Icon32/contact_email.png new file mode 100644 index 0000000..726c911 Binary files /dev/null and b/asset/icon/Icon32/contact_email.png differ diff --git a/asset/icon/Icon32/contrast.png b/asset/icon/Icon32/contrast.png new file mode 100644 index 0000000..a0c083e Binary files /dev/null and b/asset/icon/Icon32/contrast.png differ diff --git a/asset/icon/Icon32/contrast_decrease.png b/asset/icon/Icon32/contrast_decrease.png new file mode 100644 index 0000000..1e466a9 Binary files /dev/null and b/asset/icon/Icon32/contrast_decrease.png differ diff --git a/asset/icon/Icon32/contrast_high.png b/asset/icon/Icon32/contrast_high.png new file mode 100644 index 0000000..165fcc6 Binary files /dev/null and b/asset/icon/Icon32/contrast_high.png differ diff --git a/asset/icon/Icon32/contrast_increase.png b/asset/icon/Icon32/contrast_increase.png new file mode 100644 index 0000000..44fd4cc Binary files /dev/null and b/asset/icon/Icon32/contrast_increase.png differ diff --git a/asset/icon/Icon32/contrast_low.png b/asset/icon/Icon32/contrast_low.png new file mode 100644 index 0000000..f630d14 Binary files /dev/null and b/asset/icon/Icon32/contrast_low.png differ diff --git a/asset/icon/Icon32/control_cursor.png b/asset/icon/Icon32/control_cursor.png new file mode 100644 index 0000000..f740e74 Binary files /dev/null and b/asset/icon/Icon32/control_cursor.png differ diff --git a/asset/icon/Icon32/control_cursor_blue.png b/asset/icon/Icon32/control_cursor_blue.png new file mode 100644 index 0000000..b4f4496 Binary files /dev/null and b/asset/icon/Icon32/control_cursor_blue.png differ diff --git a/asset/icon/Icon32/control_eject.png b/asset/icon/Icon32/control_eject.png new file mode 100644 index 0000000..16e6ea9 Binary files /dev/null and b/asset/icon/Icon32/control_eject.png differ diff --git a/asset/icon/Icon32/control_eject_blue.png b/asset/icon/Icon32/control_eject_blue.png new file mode 100644 index 0000000..3a528af Binary files /dev/null and b/asset/icon/Icon32/control_eject_blue.png differ diff --git a/asset/icon/Icon32/control_end.png b/asset/icon/Icon32/control_end.png new file mode 100644 index 0000000..457d602 Binary files /dev/null and b/asset/icon/Icon32/control_end.png differ diff --git a/asset/icon/Icon32/control_end_blue.png b/asset/icon/Icon32/control_end_blue.png new file mode 100644 index 0000000..7b8a6ed Binary files /dev/null and b/asset/icon/Icon32/control_end_blue.png differ diff --git a/asset/icon/Icon32/control_equalizer.png b/asset/icon/Icon32/control_equalizer.png new file mode 100644 index 0000000..960d61e Binary files /dev/null and b/asset/icon/Icon32/control_equalizer.png differ diff --git a/asset/icon/Icon32/control_equalizer_blue.png b/asset/icon/Icon32/control_equalizer_blue.png new file mode 100644 index 0000000..3a822f7 Binary files /dev/null and b/asset/icon/Icon32/control_equalizer_blue.png differ diff --git a/asset/icon/Icon32/control_fastforward.png b/asset/icon/Icon32/control_fastforward.png new file mode 100644 index 0000000..036baa5 Binary files /dev/null and b/asset/icon/Icon32/control_fastforward.png differ diff --git a/asset/icon/Icon32/control_fastforward_blue.png b/asset/icon/Icon32/control_fastforward_blue.png new file mode 100644 index 0000000..e348959 Binary files /dev/null and b/asset/icon/Icon32/control_fastforward_blue.png differ diff --git a/asset/icon/Icon32/control_panel.png b/asset/icon/Icon32/control_panel.png new file mode 100644 index 0000000..8697134 Binary files /dev/null and b/asset/icon/Icon32/control_panel.png differ diff --git a/asset/icon/Icon32/control_panel_access.png b/asset/icon/Icon32/control_panel_access.png new file mode 100644 index 0000000..e3464b7 Binary files /dev/null and b/asset/icon/Icon32/control_panel_access.png differ diff --git a/asset/icon/Icon32/control_panel_branding.png b/asset/icon/Icon32/control_panel_branding.png new file mode 100644 index 0000000..94aa563 Binary files /dev/null and b/asset/icon/Icon32/control_panel_branding.png differ diff --git a/asset/icon/Icon32/control_pause.png b/asset/icon/Icon32/control_pause.png new file mode 100644 index 0000000..186f361 Binary files /dev/null and b/asset/icon/Icon32/control_pause.png differ diff --git a/asset/icon/Icon32/control_pause_blue.png b/asset/icon/Icon32/control_pause_blue.png new file mode 100644 index 0000000..3ab8b69 Binary files /dev/null and b/asset/icon/Icon32/control_pause_blue.png differ diff --git a/asset/icon/Icon32/control_pause_record.png b/asset/icon/Icon32/control_pause_record.png new file mode 100644 index 0000000..eb0ee27 Binary files /dev/null and b/asset/icon/Icon32/control_pause_record.png differ diff --git a/asset/icon/Icon32/control_play.png b/asset/icon/Icon32/control_play.png new file mode 100644 index 0000000..3b64790 Binary files /dev/null and b/asset/icon/Icon32/control_play.png differ diff --git a/asset/icon/Icon32/control_play_blue.png b/asset/icon/Icon32/control_play_blue.png new file mode 100644 index 0000000..a1f7345 Binary files /dev/null and b/asset/icon/Icon32/control_play_blue.png differ diff --git a/asset/icon/Icon32/control_power.png b/asset/icon/Icon32/control_power.png new file mode 100644 index 0000000..2541502 Binary files /dev/null and b/asset/icon/Icon32/control_power.png differ diff --git a/asset/icon/Icon32/control_power_blue.png b/asset/icon/Icon32/control_power_blue.png new file mode 100644 index 0000000..ce2730b Binary files /dev/null and b/asset/icon/Icon32/control_power_blue.png differ diff --git a/asset/icon/Icon32/control_repeat.png b/asset/icon/Icon32/control_repeat.png new file mode 100644 index 0000000..9c9119e Binary files /dev/null and b/asset/icon/Icon32/control_repeat.png differ diff --git a/asset/icon/Icon32/control_repeat_blue.png b/asset/icon/Icon32/control_repeat_blue.png new file mode 100644 index 0000000..c8d0e60 Binary files /dev/null and b/asset/icon/Icon32/control_repeat_blue.png differ diff --git a/asset/icon/Icon32/control_rewind.png b/asset/icon/Icon32/control_rewind.png new file mode 100644 index 0000000..b61017f Binary files /dev/null and b/asset/icon/Icon32/control_rewind.png differ diff --git a/asset/icon/Icon32/control_rewind_blue.png b/asset/icon/Icon32/control_rewind_blue.png new file mode 100644 index 0000000..de9fc07 Binary files /dev/null and b/asset/icon/Icon32/control_rewind_blue.png differ diff --git a/asset/icon/Icon32/control_start.png b/asset/icon/Icon32/control_start.png new file mode 100644 index 0000000..3e629e3 Binary files /dev/null and b/asset/icon/Icon32/control_start.png differ diff --git a/asset/icon/Icon32/control_start_blue.png b/asset/icon/Icon32/control_start_blue.png new file mode 100644 index 0000000..b60086c Binary files /dev/null and b/asset/icon/Icon32/control_start_blue.png differ diff --git a/asset/icon/Icon32/control_stop.png b/asset/icon/Icon32/control_stop.png new file mode 100644 index 0000000..e296377 Binary files /dev/null and b/asset/icon/Icon32/control_stop.png differ diff --git a/asset/icon/Icon32/control_stop_blue.png b/asset/icon/Icon32/control_stop_blue.png new file mode 100644 index 0000000..f15bf69 Binary files /dev/null and b/asset/icon/Icon32/control_stop_blue.png differ diff --git a/asset/icon/Icon32/controlbar.png b/asset/icon/Icon32/controlbar.png new file mode 100644 index 0000000..55fa539 Binary files /dev/null and b/asset/icon/Icon32/controlbar.png differ diff --git a/asset/icon/Icon32/controller.png b/asset/icon/Icon32/controller.png new file mode 100644 index 0000000..4b37cf7 Binary files /dev/null and b/asset/icon/Icon32/controller.png differ diff --git a/asset/icon/Icon32/controller_add.png b/asset/icon/Icon32/controller_add.png new file mode 100644 index 0000000..031c3db Binary files /dev/null and b/asset/icon/Icon32/controller_add.png differ diff --git a/asset/icon/Icon32/controller_delete.png b/asset/icon/Icon32/controller_delete.png new file mode 100644 index 0000000..1b6c4cf Binary files /dev/null and b/asset/icon/Icon32/controller_delete.png differ diff --git a/asset/icon/Icon32/controller_error.png b/asset/icon/Icon32/controller_error.png new file mode 100644 index 0000000..095b389 Binary files /dev/null and b/asset/icon/Icon32/controller_error.png differ diff --git a/asset/icon/Icon32/conversion_of_currency.png b/asset/icon/Icon32/conversion_of_currency.png new file mode 100644 index 0000000..8679815 Binary files /dev/null and b/asset/icon/Icon32/conversion_of_currency.png differ diff --git a/asset/icon/Icon32/convert_color_to_gray.png b/asset/icon/Icon32/convert_color_to_gray.png new file mode 100644 index 0000000..3985d7f Binary files /dev/null and b/asset/icon/Icon32/convert_color_to_gray.png differ diff --git a/asset/icon/Icon32/convert_gray_to_color.png b/asset/icon/Icon32/convert_gray_to_color.png new file mode 100644 index 0000000..739457a Binary files /dev/null and b/asset/icon/Icon32/convert_gray_to_color.png differ diff --git a/asset/icon/Icon32/cookie_chocolate.png b/asset/icon/Icon32/cookie_chocolate.png new file mode 100644 index 0000000..01badee Binary files /dev/null and b/asset/icon/Icon32/cookie_chocolate.png differ diff --git a/asset/icon/Icon32/cookies.png b/asset/icon/Icon32/cookies.png new file mode 100644 index 0000000..5af4b7d Binary files /dev/null and b/asset/icon/Icon32/cookies.png differ diff --git a/asset/icon/Icon32/cooler.png b/asset/icon/Icon32/cooler.png new file mode 100644 index 0000000..b52ede5 Binary files /dev/null and b/asset/icon/Icon32/cooler.png differ diff --git a/asset/icon/Icon32/copying_and_distribution.png b/asset/icon/Icon32/copying_and_distribution.png new file mode 100644 index 0000000..eb8ea86 Binary files /dev/null and b/asset/icon/Icon32/copying_and_distribution.png differ diff --git a/asset/icon/Icon32/copyleft.png b/asset/icon/Icon32/copyleft.png new file mode 100644 index 0000000..21542c9 Binary files /dev/null and b/asset/icon/Icon32/copyleft.png differ diff --git a/asset/icon/Icon32/counter.png b/asset/icon/Icon32/counter.png new file mode 100644 index 0000000..4347e33 Binary files /dev/null and b/asset/icon/Icon32/counter.png differ diff --git a/asset/icon/Icon32/cpanel.png b/asset/icon/Icon32/cpanel.png new file mode 100644 index 0000000..05e1949 Binary files /dev/null and b/asset/icon/Icon32/cpanel.png differ diff --git a/asset/icon/Icon32/create_from_selection.png b/asset/icon/Icon32/create_from_selection.png new file mode 100644 index 0000000..16db656 Binary files /dev/null and b/asset/icon/Icon32/create_from_selection.png differ diff --git a/asset/icon/Icon32/creative_commons.png b/asset/icon/Icon32/creative_commons.png new file mode 100644 index 0000000..a344411 Binary files /dev/null and b/asset/icon/Icon32/creative_commons.png differ diff --git a/asset/icon/Icon32/credit.png b/asset/icon/Icon32/credit.png new file mode 100644 index 0000000..274f0f1 Binary files /dev/null and b/asset/icon/Icon32/credit.png differ diff --git a/asset/icon/Icon32/creditcards.png b/asset/icon/Icon32/creditcards.png new file mode 100644 index 0000000..79c5e88 Binary files /dev/null and b/asset/icon/Icon32/creditcards.png differ diff --git a/asset/icon/Icon32/cricket.png b/asset/icon/Icon32/cricket.png new file mode 100644 index 0000000..87b8283 Binary files /dev/null and b/asset/icon/Icon32/cricket.png differ diff --git a/asset/icon/Icon32/cross.png b/asset/icon/Icon32/cross.png new file mode 100644 index 0000000..4ee1253 Binary files /dev/null and b/asset/icon/Icon32/cross.png differ diff --git a/asset/icon/Icon32/cross_promotion_selling.png b/asset/icon/Icon32/cross_promotion_selling.png new file mode 100644 index 0000000..e854810 Binary files /dev/null and b/asset/icon/Icon32/cross_promotion_selling.png differ diff --git a/asset/icon/Icon32/cross_reference.png b/asset/icon/Icon32/cross_reference.png new file mode 100644 index 0000000..3576fa6 Binary files /dev/null and b/asset/icon/Icon32/cross_reference.png differ diff --git a/asset/icon/Icon32/cross_shield.png b/asset/icon/Icon32/cross_shield.png new file mode 100644 index 0000000..fee5c67 Binary files /dev/null and b/asset/icon/Icon32/cross_shield.png differ diff --git a/asset/icon/Icon32/crown_bronze.png b/asset/icon/Icon32/crown_bronze.png new file mode 100644 index 0000000..25aa392 Binary files /dev/null and b/asset/icon/Icon32/crown_bronze.png differ diff --git a/asset/icon/Icon32/crown_gold.png b/asset/icon/Icon32/crown_gold.png new file mode 100644 index 0000000..68c6bf4 Binary files /dev/null and b/asset/icon/Icon32/crown_gold.png differ diff --git a/asset/icon/Icon32/crown_silver.png b/asset/icon/Icon32/crown_silver.png new file mode 100644 index 0000000..e60468a Binary files /dev/null and b/asset/icon/Icon32/crown_silver.png differ diff --git a/asset/icon/Icon32/cruise_ship.png b/asset/icon/Icon32/cruise_ship.png new file mode 100644 index 0000000..4703a96 Binary files /dev/null and b/asset/icon/Icon32/cruise_ship.png differ diff --git a/asset/icon/Icon32/css.png b/asset/icon/Icon32/css.png new file mode 100644 index 0000000..eff6e49 Binary files /dev/null and b/asset/icon/Icon32/css.png differ diff --git a/asset/icon/Icon32/css_3.png b/asset/icon/Icon32/css_3.png new file mode 100644 index 0000000..4699467 Binary files /dev/null and b/asset/icon/Icon32/css_3.png differ diff --git a/asset/icon/Icon32/css_add.png b/asset/icon/Icon32/css_add.png new file mode 100644 index 0000000..1b6d366 Binary files /dev/null and b/asset/icon/Icon32/css_add.png differ diff --git a/asset/icon/Icon32/css_delete.png b/asset/icon/Icon32/css_delete.png new file mode 100644 index 0000000..439a4f2 Binary files /dev/null and b/asset/icon/Icon32/css_delete.png differ diff --git a/asset/icon/Icon32/css_go.png b/asset/icon/Icon32/css_go.png new file mode 100644 index 0000000..9d1b233 Binary files /dev/null and b/asset/icon/Icon32/css_go.png differ diff --git a/asset/icon/Icon32/css_valid.png b/asset/icon/Icon32/css_valid.png new file mode 100644 index 0000000..57ada95 Binary files /dev/null and b/asset/icon/Icon32/css_valid.png differ diff --git a/asset/icon/Icon32/cup.png b/asset/icon/Icon32/cup.png new file mode 100644 index 0000000..b9947e2 Binary files /dev/null and b/asset/icon/Icon32/cup.png differ diff --git a/asset/icon/Icon32/cup_add.png b/asset/icon/Icon32/cup_add.png new file mode 100644 index 0000000..1c95d63 Binary files /dev/null and b/asset/icon/Icon32/cup_add.png differ diff --git a/asset/icon/Icon32/cup_bronze.png b/asset/icon/Icon32/cup_bronze.png new file mode 100644 index 0000000..5ce2836 Binary files /dev/null and b/asset/icon/Icon32/cup_bronze.png differ diff --git a/asset/icon/Icon32/cup_delete.png b/asset/icon/Icon32/cup_delete.png new file mode 100644 index 0000000..f0a0157 Binary files /dev/null and b/asset/icon/Icon32/cup_delete.png differ diff --git a/asset/icon/Icon32/cup_edit.png b/asset/icon/Icon32/cup_edit.png new file mode 100644 index 0000000..d6cb9ee Binary files /dev/null and b/asset/icon/Icon32/cup_edit.png differ diff --git a/asset/icon/Icon32/cup_error.png b/asset/icon/Icon32/cup_error.png new file mode 100644 index 0000000..6d06969 Binary files /dev/null and b/asset/icon/Icon32/cup_error.png differ diff --git a/asset/icon/Icon32/cup_go.png b/asset/icon/Icon32/cup_go.png new file mode 100644 index 0000000..77a2c4e Binary files /dev/null and b/asset/icon/Icon32/cup_go.png differ diff --git a/asset/icon/Icon32/cup_gold.png b/asset/icon/Icon32/cup_gold.png new file mode 100644 index 0000000..5bc2001 Binary files /dev/null and b/asset/icon/Icon32/cup_gold.png differ diff --git a/asset/icon/Icon32/cup_key.png b/asset/icon/Icon32/cup_key.png new file mode 100644 index 0000000..ca794e1 Binary files /dev/null and b/asset/icon/Icon32/cup_key.png differ diff --git a/asset/icon/Icon32/cup_link.png b/asset/icon/Icon32/cup_link.png new file mode 100644 index 0000000..ed5d6f7 Binary files /dev/null and b/asset/icon/Icon32/cup_link.png differ diff --git a/asset/icon/Icon32/cup_silver.png b/asset/icon/Icon32/cup_silver.png new file mode 100644 index 0000000..32e2fc5 Binary files /dev/null and b/asset/icon/Icon32/cup_silver.png differ diff --git a/asset/icon/Icon32/curriculum_vitae.png b/asset/icon/Icon32/curriculum_vitae.png new file mode 100644 index 0000000..fe78b2d Binary files /dev/null and b/asset/icon/Icon32/curriculum_vitae.png differ diff --git a/asset/icon/Icon32/cursor.png b/asset/icon/Icon32/cursor.png new file mode 100644 index 0000000..2b28d3e Binary files /dev/null and b/asset/icon/Icon32/cursor.png differ diff --git a/asset/icon/Icon32/cursor_lifebuoy.png b/asset/icon/Icon32/cursor_lifebuoy.png new file mode 100644 index 0000000..a632cf8 Binary files /dev/null and b/asset/icon/Icon32/cursor_lifebuoy.png differ diff --git a/asset/icon/Icon32/curtain.png b/asset/icon/Icon32/curtain.png new file mode 100644 index 0000000..247e84d Binary files /dev/null and b/asset/icon/Icon32/curtain.png differ diff --git a/asset/icon/Icon32/cushion.png b/asset/icon/Icon32/cushion.png new file mode 100644 index 0000000..b2b9849 Binary files /dev/null and b/asset/icon/Icon32/cushion.png differ diff --git a/asset/icon/Icon32/custom_slide_show.png b/asset/icon/Icon32/custom_slide_show.png new file mode 100644 index 0000000..a53641a Binary files /dev/null and b/asset/icon/Icon32/custom_slide_show.png differ diff --git a/asset/icon/Icon32/cut.png b/asset/icon/Icon32/cut.png new file mode 100644 index 0000000..d986faf Binary files /dev/null and b/asset/icon/Icon32/cut.png differ diff --git a/asset/icon/Icon32/cut_red.png b/asset/icon/Icon32/cut_red.png new file mode 100644 index 0000000..40068c2 Binary files /dev/null and b/asset/icon/Icon32/cut_red.png differ diff --git a/asset/icon/Icon32/cutleries.png b/asset/icon/Icon32/cutleries.png new file mode 100644 index 0000000..5518fe4 Binary files /dev/null and b/asset/icon/Icon32/cutleries.png differ diff --git a/asset/icon/Icon32/cutlery.png b/asset/icon/Icon32/cutlery.png new file mode 100644 index 0000000..5b010fd Binary files /dev/null and b/asset/icon/Icon32/cutlery.png differ diff --git a/asset/icon/Icon32/cutter.png b/asset/icon/Icon32/cutter.png new file mode 100644 index 0000000..054c4dd Binary files /dev/null and b/asset/icon/Icon32/cutter.png differ diff --git a/asset/icon/Icon32/dashboard.png b/asset/icon/Icon32/dashboard.png new file mode 100644 index 0000000..12961f0 Binary files /dev/null and b/asset/icon/Icon32/dashboard.png differ diff --git a/asset/icon/Icon32/data_chooser.png b/asset/icon/Icon32/data_chooser.png new file mode 100644 index 0000000..a9315d7 Binary files /dev/null and b/asset/icon/Icon32/data_chooser.png differ diff --git a/asset/icon/Icon32/data_field.png b/asset/icon/Icon32/data_field.png new file mode 100644 index 0000000..264d45e Binary files /dev/null and b/asset/icon/Icon32/data_field.png differ diff --git a/asset/icon/Icon32/data_grid.png b/asset/icon/Icon32/data_grid.png new file mode 100644 index 0000000..af1c9bd Binary files /dev/null and b/asset/icon/Icon32/data_grid.png differ diff --git a/asset/icon/Icon32/data_sort.png b/asset/icon/Icon32/data_sort.png new file mode 100644 index 0000000..b3242c6 Binary files /dev/null and b/asset/icon/Icon32/data_sort.png differ diff --git a/asset/icon/Icon32/data_table.png b/asset/icon/Icon32/data_table.png new file mode 100644 index 0000000..dc8e55d Binary files /dev/null and b/asset/icon/Icon32/data_table.png differ diff --git a/asset/icon/Icon32/data_time_functions.png b/asset/icon/Icon32/data_time_functions.png new file mode 100644 index 0000000..2b80428 Binary files /dev/null and b/asset/icon/Icon32/data_time_functions.png differ diff --git a/asset/icon/Icon32/data_validation.png b/asset/icon/Icon32/data_validation.png new file mode 100644 index 0000000..7ef9025 Binary files /dev/null and b/asset/icon/Icon32/data_validation.png differ diff --git a/asset/icon/Icon32/database.png b/asset/icon/Icon32/database.png new file mode 100644 index 0000000..cb059cf Binary files /dev/null and b/asset/icon/Icon32/database.png differ diff --git a/asset/icon/Icon32/database_access.png b/asset/icon/Icon32/database_access.png new file mode 100644 index 0000000..5a02a6b Binary files /dev/null and b/asset/icon/Icon32/database_access.png differ diff --git a/asset/icon/Icon32/database_add.png b/asset/icon/Icon32/database_add.png new file mode 100644 index 0000000..97ac27e Binary files /dev/null and b/asset/icon/Icon32/database_add.png differ diff --git a/asset/icon/Icon32/database_black.png b/asset/icon/Icon32/database_black.png new file mode 100644 index 0000000..4bd1d46 Binary files /dev/null and b/asset/icon/Icon32/database_black.png differ diff --git a/asset/icon/Icon32/database_blue.png b/asset/icon/Icon32/database_blue.png new file mode 100644 index 0000000..3889660 Binary files /dev/null and b/asset/icon/Icon32/database_blue.png differ diff --git a/asset/icon/Icon32/database_connect.png b/asset/icon/Icon32/database_connect.png new file mode 100644 index 0000000..956ddfd Binary files /dev/null and b/asset/icon/Icon32/database_connect.png differ diff --git a/asset/icon/Icon32/database_delete.png b/asset/icon/Icon32/database_delete.png new file mode 100644 index 0000000..0e91cdd Binary files /dev/null and b/asset/icon/Icon32/database_delete.png differ diff --git a/asset/icon/Icon32/database_edit.png b/asset/icon/Icon32/database_edit.png new file mode 100644 index 0000000..b26919b Binary files /dev/null and b/asset/icon/Icon32/database_edit.png differ diff --git a/asset/icon/Icon32/database_error.png b/asset/icon/Icon32/database_error.png new file mode 100644 index 0000000..22344d2 Binary files /dev/null and b/asset/icon/Icon32/database_error.png differ diff --git a/asset/icon/Icon32/database_gear.png b/asset/icon/Icon32/database_gear.png new file mode 100644 index 0000000..373a0ad Binary files /dev/null and b/asset/icon/Icon32/database_gear.png differ diff --git a/asset/icon/Icon32/database_go.png b/asset/icon/Icon32/database_go.png new file mode 100644 index 0000000..c10b2fb Binary files /dev/null and b/asset/icon/Icon32/database_go.png differ diff --git a/asset/icon/Icon32/database_green.png b/asset/icon/Icon32/database_green.png new file mode 100644 index 0000000..2649970 Binary files /dev/null and b/asset/icon/Icon32/database_green.png differ diff --git a/asset/icon/Icon32/database_key.png b/asset/icon/Icon32/database_key.png new file mode 100644 index 0000000..0b5b82e Binary files /dev/null and b/asset/icon/Icon32/database_key.png differ diff --git a/asset/icon/Icon32/database_lightning.png b/asset/icon/Icon32/database_lightning.png new file mode 100644 index 0000000..373590b Binary files /dev/null and b/asset/icon/Icon32/database_lightning.png differ diff --git a/asset/icon/Icon32/database_link.png b/asset/icon/Icon32/database_link.png new file mode 100644 index 0000000..7586e12 Binary files /dev/null and b/asset/icon/Icon32/database_link.png differ diff --git a/asset/icon/Icon32/database_mysql_php.png b/asset/icon/Icon32/database_mysql_php.png new file mode 100644 index 0000000..8f56ea8 Binary files /dev/null and b/asset/icon/Icon32/database_mysql_php.png differ diff --git a/asset/icon/Icon32/database_red.png b/asset/icon/Icon32/database_red.png new file mode 100644 index 0000000..c5db1a5 Binary files /dev/null and b/asset/icon/Icon32/database_red.png differ diff --git a/asset/icon/Icon32/database_refresh.png b/asset/icon/Icon32/database_refresh.png new file mode 100644 index 0000000..bb0751e Binary files /dev/null and b/asset/icon/Icon32/database_refresh.png differ diff --git a/asset/icon/Icon32/database_save.png b/asset/icon/Icon32/database_save.png new file mode 100644 index 0000000..0fd47cd Binary files /dev/null and b/asset/icon/Icon32/database_save.png differ diff --git a/asset/icon/Icon32/database_server.png b/asset/icon/Icon32/database_server.png new file mode 100644 index 0000000..4d4f991 Binary files /dev/null and b/asset/icon/Icon32/database_server.png differ diff --git a/asset/icon/Icon32/database_table.png b/asset/icon/Icon32/database_table.png new file mode 100644 index 0000000..14bb068 Binary files /dev/null and b/asset/icon/Icon32/database_table.png differ diff --git a/asset/icon/Icon32/database_yellow.png b/asset/icon/Icon32/database_yellow.png new file mode 100644 index 0000000..2a369bf Binary files /dev/null and b/asset/icon/Icon32/database_yellow.png differ diff --git a/asset/icon/Icon32/date.png b/asset/icon/Icon32/date.png new file mode 100644 index 0000000..de88e67 Binary files /dev/null and b/asset/icon/Icon32/date.png differ diff --git a/asset/icon/Icon32/date_add.png b/asset/icon/Icon32/date_add.png new file mode 100644 index 0000000..2b62172 Binary files /dev/null and b/asset/icon/Icon32/date_add.png differ diff --git a/asset/icon/Icon32/date_delete.png b/asset/icon/Icon32/date_delete.png new file mode 100644 index 0000000..8fd809b Binary files /dev/null and b/asset/icon/Icon32/date_delete.png differ diff --git a/asset/icon/Icon32/date_edit.png b/asset/icon/Icon32/date_edit.png new file mode 100644 index 0000000..a8ae83f Binary files /dev/null and b/asset/icon/Icon32/date_edit.png differ diff --git a/asset/icon/Icon32/date_error.png b/asset/icon/Icon32/date_error.png new file mode 100644 index 0000000..a3ceb54 Binary files /dev/null and b/asset/icon/Icon32/date_error.png differ diff --git a/asset/icon/Icon32/date_go.png b/asset/icon/Icon32/date_go.png new file mode 100644 index 0000000..8602cd9 Binary files /dev/null and b/asset/icon/Icon32/date_go.png differ diff --git a/asset/icon/Icon32/date_link.png b/asset/icon/Icon32/date_link.png new file mode 100644 index 0000000..238fde8 Binary files /dev/null and b/asset/icon/Icon32/date_link.png differ diff --git a/asset/icon/Icon32/date_magnify.png b/asset/icon/Icon32/date_magnify.png new file mode 100644 index 0000000..844a217 Binary files /dev/null and b/asset/icon/Icon32/date_magnify.png differ diff --git a/asset/icon/Icon32/date_next.png b/asset/icon/Icon32/date_next.png new file mode 100644 index 0000000..fcf9784 Binary files /dev/null and b/asset/icon/Icon32/date_next.png differ diff --git a/asset/icon/Icon32/date_next_gray.png b/asset/icon/Icon32/date_next_gray.png new file mode 100644 index 0000000..d6a9ea3 Binary files /dev/null and b/asset/icon/Icon32/date_next_gray.png differ diff --git a/asset/icon/Icon32/date_previous.png b/asset/icon/Icon32/date_previous.png new file mode 100644 index 0000000..7f1ae56 Binary files /dev/null and b/asset/icon/Icon32/date_previous.png differ diff --git a/asset/icon/Icon32/date_previous_gray.png b/asset/icon/Icon32/date_previous_gray.png new file mode 100644 index 0000000..6965177 Binary files /dev/null and b/asset/icon/Icon32/date_previous_gray.png differ diff --git a/asset/icon/Icon32/date_relation.png b/asset/icon/Icon32/date_relation.png new file mode 100644 index 0000000..fb8d413 Binary files /dev/null and b/asset/icon/Icon32/date_relation.png differ diff --git a/asset/icon/Icon32/date_task.png b/asset/icon/Icon32/date_task.png new file mode 100644 index 0000000..b6d403d Binary files /dev/null and b/asset/icon/Icon32/date_task.png differ diff --git a/asset/icon/Icon32/ddr_memory.png b/asset/icon/Icon32/ddr_memory.png new file mode 100644 index 0000000..4757092 Binary files /dev/null and b/asset/icon/Icon32/ddr_memory.png differ diff --git a/asset/icon/Icon32/debian.png b/asset/icon/Icon32/debian.png new file mode 100644 index 0000000..7a8eebf Binary files /dev/null and b/asset/icon/Icon32/debian.png differ diff --git a/asset/icon/Icon32/decimal_less.png b/asset/icon/Icon32/decimal_less.png new file mode 100644 index 0000000..e1a7739 Binary files /dev/null and b/asset/icon/Icon32/decimal_less.png differ diff --git a/asset/icon/Icon32/decimal_more.png b/asset/icon/Icon32/decimal_more.png new file mode 100644 index 0000000..9a38da9 Binary files /dev/null and b/asset/icon/Icon32/decimal_more.png differ diff --git a/asset/icon/Icon32/default_value.png b/asset/icon/Icon32/default_value.png new file mode 100644 index 0000000..a6252bf Binary files /dev/null and b/asset/icon/Icon32/default_value.png differ diff --git a/asset/icon/Icon32/define_name.png b/asset/icon/Icon32/define_name.png new file mode 100644 index 0000000..bc2db0f Binary files /dev/null and b/asset/icon/Icon32/define_name.png differ diff --git a/asset/icon/Icon32/defoult_address.png b/asset/icon/Icon32/defoult_address.png new file mode 100644 index 0000000..5a93dac Binary files /dev/null and b/asset/icon/Icon32/defoult_address.png differ diff --git a/asset/icon/Icon32/delete.png b/asset/icon/Icon32/delete.png new file mode 100644 index 0000000..30a45b8 Binary files /dev/null and b/asset/icon/Icon32/delete.png differ diff --git a/asset/icon/Icon32/delete_dns_zone.png b/asset/icon/Icon32/delete_dns_zone.png new file mode 100644 index 0000000..885ae40 Binary files /dev/null and b/asset/icon/Icon32/delete_dns_zone.png differ diff --git a/asset/icon/Icon32/delete_package.png b/asset/icon/Icon32/delete_package.png new file mode 100644 index 0000000..f18461a Binary files /dev/null and b/asset/icon/Icon32/delete_package.png differ diff --git a/asset/icon/Icon32/delicious.png b/asset/icon/Icon32/delicious.png new file mode 100644 index 0000000..368ccae Binary files /dev/null and b/asset/icon/Icon32/delicious.png differ diff --git a/asset/icon/Icon32/derivatives.png b/asset/icon/Icon32/derivatives.png new file mode 100644 index 0000000..9c1cdf0 Binary files /dev/null and b/asset/icon/Icon32/derivatives.png differ diff --git a/asset/icon/Icon32/design_float.png b/asset/icon/Icon32/design_float.png new file mode 100644 index 0000000..5e3b913 Binary files /dev/null and b/asset/icon/Icon32/design_float.png differ diff --git a/asset/icon/Icon32/designmoo.png b/asset/icon/Icon32/designmoo.png new file mode 100644 index 0000000..58ef037 Binary files /dev/null and b/asset/icon/Icon32/designmoo.png differ diff --git a/asset/icon/Icon32/desktop.png b/asset/icon/Icon32/desktop.png new file mode 100644 index 0000000..b273132 Binary files /dev/null and b/asset/icon/Icon32/desktop.png differ diff --git a/asset/icon/Icon32/desktop_network.png b/asset/icon/Icon32/desktop_network.png new file mode 100644 index 0000000..519fd87 Binary files /dev/null and b/asset/icon/Icon32/desktop_network.png differ diff --git a/asset/icon/Icon32/devianart.png b/asset/icon/Icon32/devianart.png new file mode 100644 index 0000000..df60c34 Binary files /dev/null and b/asset/icon/Icon32/devianart.png differ diff --git a/asset/icon/Icon32/diagnostic_chart.png b/asset/icon/Icon32/diagnostic_chart.png new file mode 100644 index 0000000..649729d Binary files /dev/null and b/asset/icon/Icon32/diagnostic_chart.png differ diff --git a/asset/icon/Icon32/diagramm.png b/asset/icon/Icon32/diagramm.png new file mode 100644 index 0000000..9ff4b10 Binary files /dev/null and b/asset/icon/Icon32/diagramm.png differ diff --git a/asset/icon/Icon32/dialog.png b/asset/icon/Icon32/dialog.png new file mode 100644 index 0000000..4f0a4ce Binary files /dev/null and b/asset/icon/Icon32/dialog.png differ diff --git a/asset/icon/Icon32/diamond.png b/asset/icon/Icon32/diamond.png new file mode 100644 index 0000000..1ef2fd6 Binary files /dev/null and b/asset/icon/Icon32/diamond.png differ diff --git a/asset/icon/Icon32/dice.png b/asset/icon/Icon32/dice.png new file mode 100644 index 0000000..19e4fa6 Binary files /dev/null and b/asset/icon/Icon32/dice.png differ diff --git a/asset/icon/Icon32/digg.png b/asset/icon/Icon32/digg.png new file mode 100644 index 0000000..529c419 Binary files /dev/null and b/asset/icon/Icon32/digg.png differ diff --git a/asset/icon/Icon32/digit_separator.png b/asset/icon/Icon32/digit_separator.png new file mode 100644 index 0000000..319d5a5 Binary files /dev/null and b/asset/icon/Icon32/digit_separator.png differ diff --git a/asset/icon/Icon32/digital_signature.png b/asset/icon/Icon32/digital_signature.png new file mode 100644 index 0000000..c5f0e53 Binary files /dev/null and b/asset/icon/Icon32/digital_signature.png differ diff --git a/asset/icon/Icon32/digital_signature_pen.png b/asset/icon/Icon32/digital_signature_pen.png new file mode 100644 index 0000000..b024efb Binary files /dev/null and b/asset/icon/Icon32/digital_signature_pen.png differ diff --git a/asset/icon/Icon32/dinersclub.png b/asset/icon/Icon32/dinersclub.png new file mode 100644 index 0000000..9f82e8f Binary files /dev/null and b/asset/icon/Icon32/dinersclub.png differ diff --git a/asset/icon/Icon32/direction.png b/asset/icon/Icon32/direction.png new file mode 100644 index 0000000..7703854 Binary files /dev/null and b/asset/icon/Icon32/direction.png differ diff --git a/asset/icon/Icon32/directory_listing.png b/asset/icon/Icon32/directory_listing.png new file mode 100644 index 0000000..0361128 Binary files /dev/null and b/asset/icon/Icon32/directory_listing.png differ diff --git a/asset/icon/Icon32/disable_enable_demo_mode.png b/asset/icon/Icon32/disable_enable_demo_mode.png new file mode 100644 index 0000000..ed62812 Binary files /dev/null and b/asset/icon/Icon32/disable_enable_demo_mode.png differ diff --git a/asset/icon/Icon32/disconnect.png b/asset/icon/Icon32/disconnect.png new file mode 100644 index 0000000..93b5c0c Binary files /dev/null and b/asset/icon/Icon32/disconnect.png differ diff --git a/asset/icon/Icon32/discover.png b/asset/icon/Icon32/discover.png new file mode 100644 index 0000000..bb0442b Binary files /dev/null and b/asset/icon/Icon32/discover.png differ diff --git a/asset/icon/Icon32/dish.png b/asset/icon/Icon32/dish.png new file mode 100644 index 0000000..14e8540 Binary files /dev/null and b/asset/icon/Icon32/dish.png differ diff --git a/asset/icon/Icon32/disk.png b/asset/icon/Icon32/disk.png new file mode 100644 index 0000000..3a9dcf3 Binary files /dev/null and b/asset/icon/Icon32/disk.png differ diff --git a/asset/icon/Icon32/disk_multiple.png b/asset/icon/Icon32/disk_multiple.png new file mode 100644 index 0000000..bc6b442 Binary files /dev/null and b/asset/icon/Icon32/disk_multiple.png differ diff --git a/asset/icon/Icon32/disk_space.png b/asset/icon/Icon32/disk_space.png new file mode 100644 index 0000000..144c84b Binary files /dev/null and b/asset/icon/Icon32/disk_space.png differ diff --git a/asset/icon/Icon32/distribution_partnerships.png b/asset/icon/Icon32/distribution_partnerships.png new file mode 100644 index 0000000..26d8735 Binary files /dev/null and b/asset/icon/Icon32/distribution_partnerships.png differ diff --git a/asset/icon/Icon32/dns.png b/asset/icon/Icon32/dns.png new file mode 100644 index 0000000..4a9c765 Binary files /dev/null and b/asset/icon/Icon32/dns.png differ diff --git a/asset/icon/Icon32/dns_functions.png b/asset/icon/Icon32/dns_functions.png new file mode 100644 index 0000000..f62b33f Binary files /dev/null and b/asset/icon/Icon32/dns_functions.png differ diff --git a/asset/icon/Icon32/dns_server.png b/asset/icon/Icon32/dns_server.png new file mode 100644 index 0000000..784a7d2 Binary files /dev/null and b/asset/icon/Icon32/dns_server.png differ diff --git a/asset/icon/Icon32/dns_setting.png b/asset/icon/Icon32/dns_setting.png new file mode 100644 index 0000000..c2071da Binary files /dev/null and b/asset/icon/Icon32/dns_setting.png differ diff --git a/asset/icon/Icon32/do_not_disturb.png b/asset/icon/Icon32/do_not_disturb.png new file mode 100644 index 0000000..edcf4b8 Binary files /dev/null and b/asset/icon/Icon32/do_not_disturb.png differ diff --git a/asset/icon/Icon32/document_back.png b/asset/icon/Icon32/document_back.png new file mode 100644 index 0000000..496f0e0 Binary files /dev/null and b/asset/icon/Icon32/document_back.png differ diff --git a/asset/icon/Icon32/document_background.png b/asset/icon/Icon32/document_background.png new file mode 100644 index 0000000..d57a757 Binary files /dev/null and b/asset/icon/Icon32/document_background.png differ diff --git a/asset/icon/Icon32/document_black.png b/asset/icon/Icon32/document_black.png new file mode 100644 index 0000000..b894261 Binary files /dev/null and b/asset/icon/Icon32/document_black.png differ diff --git a/asset/icon/Icon32/document_break.png b/asset/icon/Icon32/document_break.png new file mode 100644 index 0000000..12b159b Binary files /dev/null and b/asset/icon/Icon32/document_break.png differ diff --git a/asset/icon/Icon32/document_center.png b/asset/icon/Icon32/document_center.png new file mode 100644 index 0000000..833c5ed Binary files /dev/null and b/asset/icon/Icon32/document_center.png differ diff --git a/asset/icon/Icon32/document_check_compatibility.png b/asset/icon/Icon32/document_check_compatibility.png new file mode 100644 index 0000000..2593a5c Binary files /dev/null and b/asset/icon/Icon32/document_check_compatibility.png differ diff --git a/asset/icon/Icon32/document_comment_above.png b/asset/icon/Icon32/document_comment_above.png new file mode 100644 index 0000000..86b8562 Binary files /dev/null and b/asset/icon/Icon32/document_comment_above.png differ diff --git a/asset/icon/Icon32/document_comment_behind.png b/asset/icon/Icon32/document_comment_behind.png new file mode 100644 index 0000000..baf4d99 Binary files /dev/null and b/asset/icon/Icon32/document_comment_behind.png differ diff --git a/asset/icon/Icon32/document_comment_below.png b/asset/icon/Icon32/document_comment_below.png new file mode 100644 index 0000000..5b2b7a6 Binary files /dev/null and b/asset/icon/Icon32/document_comment_below.png differ diff --git a/asset/icon/Icon32/document_comments.png b/asset/icon/Icon32/document_comments.png new file mode 100644 index 0000000..2bd4bdc Binary files /dev/null and b/asset/icon/Icon32/document_comments.png differ diff --git a/asset/icon/Icon32/document_copies.png b/asset/icon/Icon32/document_copies.png new file mode 100644 index 0000000..c975471 Binary files /dev/null and b/asset/icon/Icon32/document_copies.png differ diff --git a/asset/icon/Icon32/document_editing.png b/asset/icon/Icon32/document_editing.png new file mode 100644 index 0000000..76fbc36 Binary files /dev/null and b/asset/icon/Icon32/document_editing.png differ diff --git a/asset/icon/Icon32/document_empty.png b/asset/icon/Icon32/document_empty.png new file mode 100644 index 0000000..c6c9532 Binary files /dev/null and b/asset/icon/Icon32/document_empty.png differ diff --git a/asset/icon/Icon32/document_export.png b/asset/icon/Icon32/document_export.png new file mode 100644 index 0000000..e68c5d7 Binary files /dev/null and b/asset/icon/Icon32/document_export.png differ diff --git a/asset/icon/Icon32/document_font.png b/asset/icon/Icon32/document_font.png new file mode 100644 index 0000000..f6a6c93 Binary files /dev/null and b/asset/icon/Icon32/document_font.png differ diff --git a/asset/icon/Icon32/document_font_wizard.png b/asset/icon/Icon32/document_font_wizard.png new file mode 100644 index 0000000..81a8407 Binary files /dev/null and b/asset/icon/Icon32/document_font_wizard.png differ diff --git a/asset/icon/Icon32/document_green.png b/asset/icon/Icon32/document_green.png new file mode 100644 index 0000000..0cacbf6 Binary files /dev/null and b/asset/icon/Icon32/document_green.png differ diff --git a/asset/icon/Icon32/document_image.png b/asset/icon/Icon32/document_image.png new file mode 100644 index 0000000..2d2b446 Binary files /dev/null and b/asset/icon/Icon32/document_image.png differ diff --git a/asset/icon/Icon32/document_image_hor.png b/asset/icon/Icon32/document_image_hor.png new file mode 100644 index 0000000..509532c Binary files /dev/null and b/asset/icon/Icon32/document_image_hor.png differ diff --git a/asset/icon/Icon32/document_image_ver.png b/asset/icon/Icon32/document_image_ver.png new file mode 100644 index 0000000..0a9bb1b Binary files /dev/null and b/asset/icon/Icon32/document_image_ver.png differ diff --git a/asset/icon/Icon32/document_import.png b/asset/icon/Icon32/document_import.png new file mode 100644 index 0000000..d276f05 Binary files /dev/null and b/asset/icon/Icon32/document_import.png differ diff --git a/asset/icon/Icon32/document_index.png b/asset/icon/Icon32/document_index.png new file mode 100644 index 0000000..58c24ce Binary files /dev/null and b/asset/icon/Icon32/document_index.png differ diff --git a/asset/icon/Icon32/document_info.png b/asset/icon/Icon32/document_info.png new file mode 100644 index 0000000..d030bf5 Binary files /dev/null and b/asset/icon/Icon32/document_info.png differ diff --git a/asset/icon/Icon32/document_insert.png b/asset/icon/Icon32/document_insert.png new file mode 100644 index 0000000..1326c80 Binary files /dev/null and b/asset/icon/Icon32/document_insert.png differ diff --git a/asset/icon/Icon32/document_inspect.png b/asset/icon/Icon32/document_inspect.png new file mode 100644 index 0000000..9e7b6e5 Binary files /dev/null and b/asset/icon/Icon32/document_inspect.png differ diff --git a/asset/icon/Icon32/document_inspector.png b/asset/icon/Icon32/document_inspector.png new file mode 100644 index 0000000..67ee959 Binary files /dev/null and b/asset/icon/Icon32/document_inspector.png differ diff --git a/asset/icon/Icon32/document_layout.png b/asset/icon/Icon32/document_layout.png new file mode 100644 index 0000000..3b22de3 Binary files /dev/null and b/asset/icon/Icon32/document_layout.png differ diff --git a/asset/icon/Icon32/document_margins.png b/asset/icon/Icon32/document_margins.png new file mode 100644 index 0000000..a5075e6 Binary files /dev/null and b/asset/icon/Icon32/document_margins.png differ diff --git a/asset/icon/Icon32/document_mark_as_final.png b/asset/icon/Icon32/document_mark_as_final.png new file mode 100644 index 0000000..0a94812 Binary files /dev/null and b/asset/icon/Icon32/document_mark_as_final.png differ diff --git a/asset/icon/Icon32/document_move.png b/asset/icon/Icon32/document_move.png new file mode 100644 index 0000000..3c03e79 Binary files /dev/null and b/asset/icon/Icon32/document_move.png differ diff --git a/asset/icon/Icon32/document_next.png b/asset/icon/Icon32/document_next.png new file mode 100644 index 0000000..d668396 Binary files /dev/null and b/asset/icon/Icon32/document_next.png differ diff --git a/asset/icon/Icon32/document_notes.png b/asset/icon/Icon32/document_notes.png new file mode 100644 index 0000000..027720d Binary files /dev/null and b/asset/icon/Icon32/document_notes.png differ diff --git a/asset/icon/Icon32/document_page.png b/asset/icon/Icon32/document_page.png new file mode 100644 index 0000000..82a9d06 Binary files /dev/null and b/asset/icon/Icon32/document_page.png differ diff --git a/asset/icon/Icon32/document_page_last.png b/asset/icon/Icon32/document_page_last.png new file mode 100644 index 0000000..c844949 Binary files /dev/null and b/asset/icon/Icon32/document_page_last.png differ diff --git a/asset/icon/Icon32/document_page_next.png b/asset/icon/Icon32/document_page_next.png new file mode 100644 index 0000000..7022515 Binary files /dev/null and b/asset/icon/Icon32/document_page_next.png differ diff --git a/asset/icon/Icon32/document_page_previous.png b/asset/icon/Icon32/document_page_previous.png new file mode 100644 index 0000000..63e63c2 Binary files /dev/null and b/asset/icon/Icon32/document_page_previous.png differ diff --git a/asset/icon/Icon32/document_plus.png b/asset/icon/Icon32/document_plus.png new file mode 100644 index 0000000..9627d34 Binary files /dev/null and b/asset/icon/Icon32/document_plus.png differ diff --git a/asset/icon/Icon32/document_prepare.png b/asset/icon/Icon32/document_prepare.png new file mode 100644 index 0000000..cd4bb02 Binary files /dev/null and b/asset/icon/Icon32/document_prepare.png differ diff --git a/asset/icon/Icon32/document_properties.png b/asset/icon/Icon32/document_properties.png new file mode 100644 index 0000000..b59d510 Binary files /dev/null and b/asset/icon/Icon32/document_properties.png differ diff --git a/asset/icon/Icon32/document_protect.png b/asset/icon/Icon32/document_protect.png new file mode 100644 index 0000000..8ac3c36 Binary files /dev/null and b/asset/icon/Icon32/document_protect.png differ diff --git a/asset/icon/Icon32/document_quote.png b/asset/icon/Icon32/document_quote.png new file mode 100644 index 0000000..7f51e45 Binary files /dev/null and b/asset/icon/Icon32/document_quote.png differ diff --git a/asset/icon/Icon32/document_red.png b/asset/icon/Icon32/document_red.png new file mode 100644 index 0000000..c68bded Binary files /dev/null and b/asset/icon/Icon32/document_red.png differ diff --git a/asset/icon/Icon32/document_redirect.png b/asset/icon/Icon32/document_redirect.png new file mode 100644 index 0000000..8b4db5e Binary files /dev/null and b/asset/icon/Icon32/document_redirect.png differ diff --git a/asset/icon/Icon32/document_rename.png b/asset/icon/Icon32/document_rename.png new file mode 100644 index 0000000..c3f8a55 Binary files /dev/null and b/asset/icon/Icon32/document_rename.png differ diff --git a/asset/icon/Icon32/document_shapes.png b/asset/icon/Icon32/document_shapes.png new file mode 100644 index 0000000..89d23bb Binary files /dev/null and b/asset/icon/Icon32/document_shapes.png differ diff --git a/asset/icon/Icon32/document_shred.png b/asset/icon/Icon32/document_shred.png new file mode 100644 index 0000000..402baff Binary files /dev/null and b/asset/icon/Icon32/document_shred.png differ diff --git a/asset/icon/Icon32/document_signature.png b/asset/icon/Icon32/document_signature.png new file mode 100644 index 0000000..60155cf Binary files /dev/null and b/asset/icon/Icon32/document_signature.png differ diff --git a/asset/icon/Icon32/document_spacing.png b/asset/icon/Icon32/document_spacing.png new file mode 100644 index 0000000..931bacb Binary files /dev/null and b/asset/icon/Icon32/document_spacing.png differ diff --git a/asset/icon/Icon32/document_split.png b/asset/icon/Icon32/document_split.png new file mode 100644 index 0000000..17529ac Binary files /dev/null and b/asset/icon/Icon32/document_split.png differ diff --git a/asset/icon/Icon32/document_stand.png b/asset/icon/Icon32/document_stand.png new file mode 100644 index 0000000..9b5f04d Binary files /dev/null and b/asset/icon/Icon32/document_stand.png differ diff --git a/asset/icon/Icon32/document_tag(2).png b/asset/icon/Icon32/document_tag(2).png new file mode 100644 index 0000000..2b6c96f Binary files /dev/null and b/asset/icon/Icon32/document_tag(2).png differ diff --git a/asset/icon/Icon32/document_tag.png b/asset/icon/Icon32/document_tag.png new file mode 100644 index 0000000..82f32ef Binary files /dev/null and b/asset/icon/Icon32/document_tag.png differ diff --git a/asset/icon/Icon32/document_todo.png b/asset/icon/Icon32/document_todo.png new file mode 100644 index 0000000..bc024c8 Binary files /dev/null and b/asset/icon/Icon32/document_todo.png differ diff --git a/asset/icon/Icon32/document_torn.png b/asset/icon/Icon32/document_torn.png new file mode 100644 index 0000000..fe982ce Binary files /dev/null and b/asset/icon/Icon32/document_torn.png differ diff --git a/asset/icon/Icon32/document_tree.png b/asset/icon/Icon32/document_tree.png new file mode 100644 index 0000000..7062fde Binary files /dev/null and b/asset/icon/Icon32/document_tree.png differ diff --git a/asset/icon/Icon32/document_valid.png b/asset/icon/Icon32/document_valid.png new file mode 100644 index 0000000..387f7bb Binary files /dev/null and b/asset/icon/Icon32/document_valid.png differ diff --git a/asset/icon/Icon32/document_vertical.png b/asset/icon/Icon32/document_vertical.png new file mode 100644 index 0000000..5d9d9b4 Binary files /dev/null and b/asset/icon/Icon32/document_vertical.png differ diff --git a/asset/icon/Icon32/document_view_book.png b/asset/icon/Icon32/document_view_book.png new file mode 100644 index 0000000..8919a54 Binary files /dev/null and b/asset/icon/Icon32/document_view_book.png differ diff --git a/asset/icon/Icon32/document_white_torn.png b/asset/icon/Icon32/document_white_torn.png new file mode 100644 index 0000000..58c023e Binary files /dev/null and b/asset/icon/Icon32/document_white_torn.png differ diff --git a/asset/icon/Icon32/document_yellow.png b/asset/icon/Icon32/document_yellow.png new file mode 100644 index 0000000..098859c Binary files /dev/null and b/asset/icon/Icon32/document_yellow.png differ diff --git a/asset/icon/Icon32/documentation_tools.png b/asset/icon/Icon32/documentation_tools.png new file mode 100644 index 0000000..a9d9cdd Binary files /dev/null and b/asset/icon/Icon32/documentation_tools.png differ diff --git a/asset/icon/Icon32/documents_email.png b/asset/icon/Icon32/documents_email.png new file mode 100644 index 0000000..c5e20b9 Binary files /dev/null and b/asset/icon/Icon32/documents_email.png differ diff --git a/asset/icon/Icon32/dog.png b/asset/icon/Icon32/dog.png new file mode 100644 index 0000000..b84314b Binary files /dev/null and b/asset/icon/Icon32/dog.png differ diff --git a/asset/icon/Icon32/domain_buying_selling.png b/asset/icon/Icon32/domain_buying_selling.png new file mode 100644 index 0000000..42c8624 Binary files /dev/null and b/asset/icon/Icon32/domain_buying_selling.png differ diff --git a/asset/icon/Icon32/domain_controversies.png b/asset/icon/Icon32/domain_controversies.png new file mode 100644 index 0000000..c9dd4ea Binary files /dev/null and b/asset/icon/Icon32/domain_controversies.png differ diff --git a/asset/icon/Icon32/domain_legal_issues.png b/asset/icon/Icon32/domain_legal_issues.png new file mode 100644 index 0000000..540b426 Binary files /dev/null and b/asset/icon/Icon32/domain_legal_issues.png differ diff --git a/asset/icon/Icon32/domain_name_investment.png b/asset/icon/Icon32/domain_name_investment.png new file mode 100644 index 0000000..fff891a Binary files /dev/null and b/asset/icon/Icon32/domain_name_investment.png differ diff --git a/asset/icon/Icon32/domain_name_monetization.png b/asset/icon/Icon32/domain_name_monetization.png new file mode 100644 index 0000000..d95524c Binary files /dev/null and b/asset/icon/Icon32/domain_name_monetization.png differ diff --git a/asset/icon/Icon32/domain_names_advanced.png b/asset/icon/Icon32/domain_names_advanced.png new file mode 100644 index 0000000..82e552e Binary files /dev/null and b/asset/icon/Icon32/domain_names_advanced.png differ diff --git a/asset/icon/Icon32/domain_template.png b/asset/icon/Icon32/domain_template.png new file mode 100644 index 0000000..9cec852 Binary files /dev/null and b/asset/icon/Icon32/domain_template.png differ diff --git a/asset/icon/Icon32/donut.png b/asset/icon/Icon32/donut.png new file mode 100644 index 0000000..a01f629 Binary files /dev/null and b/asset/icon/Icon32/donut.png differ diff --git a/asset/icon/Icon32/door.png b/asset/icon/Icon32/door.png new file mode 100644 index 0000000..0ecc358 Binary files /dev/null and b/asset/icon/Icon32/door.png differ diff --git a/asset/icon/Icon32/door_in.png b/asset/icon/Icon32/door_in.png new file mode 100644 index 0000000..a65ed58 Binary files /dev/null and b/asset/icon/Icon32/door_in.png differ diff --git a/asset/icon/Icon32/door_open.png b/asset/icon/Icon32/door_open.png new file mode 100644 index 0000000..621377e Binary files /dev/null and b/asset/icon/Icon32/door_open.png differ diff --git a/asset/icon/Icon32/door_out.png b/asset/icon/Icon32/door_out.png new file mode 100644 index 0000000..e4efe06 Binary files /dev/null and b/asset/icon/Icon32/door_out.png differ diff --git a/asset/icon/Icon32/dopplr.png b/asset/icon/Icon32/dopplr.png new file mode 100644 index 0000000..f7725dd Binary files /dev/null and b/asset/icon/Icon32/dopplr.png differ diff --git a/asset/icon/Icon32/down_jacket.png b/asset/icon/Icon32/down_jacket.png new file mode 100644 index 0000000..96b218e Binary files /dev/null and b/asset/icon/Icon32/down_jacket.png differ diff --git a/asset/icon/Icon32/download.png b/asset/icon/Icon32/download.png new file mode 100644 index 0000000..e3e0377 Binary files /dev/null and b/asset/icon/Icon32/download.png differ diff --git a/asset/icon/Icon32/download_cloud.png b/asset/icon/Icon32/download_cloud.png new file mode 100644 index 0000000..a8999c2 Binary files /dev/null and b/asset/icon/Icon32/download_cloud.png differ diff --git a/asset/icon/Icon32/download_for_linux.png b/asset/icon/Icon32/download_for_linux.png new file mode 100644 index 0000000..2d00b11 Binary files /dev/null and b/asset/icon/Icon32/download_for_linux.png differ diff --git a/asset/icon/Icon32/download_for_mac.png b/asset/icon/Icon32/download_for_mac.png new file mode 100644 index 0000000..b134371 Binary files /dev/null and b/asset/icon/Icon32/download_for_mac.png differ diff --git a/asset/icon/Icon32/download_for_windows.png b/asset/icon/Icon32/download_for_windows.png new file mode 100644 index 0000000..884fb5f Binary files /dev/null and b/asset/icon/Icon32/download_for_windows.png differ diff --git a/asset/icon/Icon32/draft.png b/asset/icon/Icon32/draft.png new file mode 100644 index 0000000..931502b Binary files /dev/null and b/asset/icon/Icon32/draft.png differ diff --git a/asset/icon/Icon32/draw_airbrush.png b/asset/icon/Icon32/draw_airbrush.png new file mode 100644 index 0000000..b8e7a6b Binary files /dev/null and b/asset/icon/Icon32/draw_airbrush.png differ diff --git a/asset/icon/Icon32/draw_calligraphic.png b/asset/icon/Icon32/draw_calligraphic.png new file mode 100644 index 0000000..b7981a2 Binary files /dev/null and b/asset/icon/Icon32/draw_calligraphic.png differ diff --git a/asset/icon/Icon32/draw_clone.png b/asset/icon/Icon32/draw_clone.png new file mode 100644 index 0000000..9452ca3 Binary files /dev/null and b/asset/icon/Icon32/draw_clone.png differ diff --git a/asset/icon/Icon32/draw_convolve.png b/asset/icon/Icon32/draw_convolve.png new file mode 100644 index 0000000..3987593 Binary files /dev/null and b/asset/icon/Icon32/draw_convolve.png differ diff --git a/asset/icon/Icon32/draw_dodge_burn.png b/asset/icon/Icon32/draw_dodge_burn.png new file mode 100644 index 0000000..61a9f81 Binary files /dev/null and b/asset/icon/Icon32/draw_dodge_burn.png differ diff --git a/asset/icon/Icon32/draw_ellipse.png b/asset/icon/Icon32/draw_ellipse.png new file mode 100644 index 0000000..74fdefe Binary files /dev/null and b/asset/icon/Icon32/draw_ellipse.png differ diff --git a/asset/icon/Icon32/draw_eraser.png b/asset/icon/Icon32/draw_eraser.png new file mode 100644 index 0000000..bcef6b9 Binary files /dev/null and b/asset/icon/Icon32/draw_eraser.png differ diff --git a/asset/icon/Icon32/draw_ink.png b/asset/icon/Icon32/draw_ink.png new file mode 100644 index 0000000..17da612 Binary files /dev/null and b/asset/icon/Icon32/draw_ink.png differ diff --git a/asset/icon/Icon32/draw_island.png b/asset/icon/Icon32/draw_island.png new file mode 100644 index 0000000..1921fb9 Binary files /dev/null and b/asset/icon/Icon32/draw_island.png differ diff --git a/asset/icon/Icon32/draw_line.png b/asset/icon/Icon32/draw_line.png new file mode 100644 index 0000000..d6afad2 Binary files /dev/null and b/asset/icon/Icon32/draw_line.png differ diff --git a/asset/icon/Icon32/draw_path.png b/asset/icon/Icon32/draw_path.png new file mode 100644 index 0000000..3cfcd42 Binary files /dev/null and b/asset/icon/Icon32/draw_path.png differ diff --git a/asset/icon/Icon32/draw_points.png b/asset/icon/Icon32/draw_points.png new file mode 100644 index 0000000..c57f68f Binary files /dev/null and b/asset/icon/Icon32/draw_points.png differ diff --git a/asset/icon/Icon32/draw_polygon.png b/asset/icon/Icon32/draw_polygon.png new file mode 100644 index 0000000..51d2a8b Binary files /dev/null and b/asset/icon/Icon32/draw_polygon.png differ diff --git a/asset/icon/Icon32/draw_polygon_curves.png b/asset/icon/Icon32/draw_polygon_curves.png new file mode 100644 index 0000000..72deb41 Binary files /dev/null and b/asset/icon/Icon32/draw_polygon_curves.png differ diff --git a/asset/icon/Icon32/draw_polyline.png b/asset/icon/Icon32/draw_polyline.png new file mode 100644 index 0000000..25df8f4 Binary files /dev/null and b/asset/icon/Icon32/draw_polyline.png differ diff --git a/asset/icon/Icon32/draw_ring.png b/asset/icon/Icon32/draw_ring.png new file mode 100644 index 0000000..001241f Binary files /dev/null and b/asset/icon/Icon32/draw_ring.png differ diff --git a/asset/icon/Icon32/draw_smudge.png b/asset/icon/Icon32/draw_smudge.png new file mode 100644 index 0000000..8712707 Binary files /dev/null and b/asset/icon/Icon32/draw_smudge.png differ diff --git a/asset/icon/Icon32/draw_spiral.png b/asset/icon/Icon32/draw_spiral.png new file mode 100644 index 0000000..7580265 Binary files /dev/null and b/asset/icon/Icon32/draw_spiral.png differ diff --git a/asset/icon/Icon32/draw_star.png b/asset/icon/Icon32/draw_star.png new file mode 100644 index 0000000..beb4b05 Binary files /dev/null and b/asset/icon/Icon32/draw_star.png differ diff --git a/asset/icon/Icon32/draw_vertex.png b/asset/icon/Icon32/draw_vertex.png new file mode 100644 index 0000000..cc824cd Binary files /dev/null and b/asset/icon/Icon32/draw_vertex.png differ diff --git a/asset/icon/Icon32/draw_wave.png b/asset/icon/Icon32/draw_wave.png new file mode 100644 index 0000000..3125bfa Binary files /dev/null and b/asset/icon/Icon32/draw_wave.png differ diff --git a/asset/icon/Icon32/drawer.png b/asset/icon/Icon32/drawer.png new file mode 100644 index 0000000..edfe5e5 Binary files /dev/null and b/asset/icon/Icon32/drawer.png differ diff --git a/asset/icon/Icon32/drawer_open.png b/asset/icon/Icon32/drawer_open.png new file mode 100644 index 0000000..f102cb9 Binary files /dev/null and b/asset/icon/Icon32/drawer_open.png differ diff --git a/asset/icon/Icon32/dribbble.png b/asset/icon/Icon32/dribbble.png new file mode 100644 index 0000000..7ce3239 Binary files /dev/null and b/asset/icon/Icon32/dribbble.png differ diff --git a/asset/icon/Icon32/drill.png b/asset/icon/Icon32/drill.png new file mode 100644 index 0000000..29bb8ab Binary files /dev/null and b/asset/icon/Icon32/drill.png differ diff --git a/asset/icon/Icon32/drink.png b/asset/icon/Icon32/drink.png new file mode 100644 index 0000000..40d30ea Binary files /dev/null and b/asset/icon/Icon32/drink.png differ diff --git a/asset/icon/Icon32/drink_empty.png b/asset/icon/Icon32/drink_empty.png new file mode 100644 index 0000000..d977d8a Binary files /dev/null and b/asset/icon/Icon32/drink_empty.png differ diff --git a/asset/icon/Icon32/drive.png b/asset/icon/Icon32/drive.png new file mode 100644 index 0000000..1b21050 Binary files /dev/null and b/asset/icon/Icon32/drive.png differ diff --git a/asset/icon/Icon32/drive_add.png b/asset/icon/Icon32/drive_add.png new file mode 100644 index 0000000..666fced Binary files /dev/null and b/asset/icon/Icon32/drive_add.png differ diff --git a/asset/icon/Icon32/drive_burn.png b/asset/icon/Icon32/drive_burn.png new file mode 100644 index 0000000..6956ac7 Binary files /dev/null and b/asset/icon/Icon32/drive_burn.png differ diff --git a/asset/icon/Icon32/drive_cd.png b/asset/icon/Icon32/drive_cd.png new file mode 100644 index 0000000..18a97e2 Binary files /dev/null and b/asset/icon/Icon32/drive_cd.png differ diff --git a/asset/icon/Icon32/drive_cd_empty.png b/asset/icon/Icon32/drive_cd_empty.png new file mode 100644 index 0000000..5ffe8a7 Binary files /dev/null and b/asset/icon/Icon32/drive_cd_empty.png differ diff --git a/asset/icon/Icon32/drive_delete.png b/asset/icon/Icon32/drive_delete.png new file mode 100644 index 0000000..3398e05 Binary files /dev/null and b/asset/icon/Icon32/drive_delete.png differ diff --git a/asset/icon/Icon32/drive_disk.png b/asset/icon/Icon32/drive_disk.png new file mode 100644 index 0000000..35e7df5 Binary files /dev/null and b/asset/icon/Icon32/drive_disk.png differ diff --git a/asset/icon/Icon32/drive_edit.png b/asset/icon/Icon32/drive_edit.png new file mode 100644 index 0000000..5ea9491 Binary files /dev/null and b/asset/icon/Icon32/drive_edit.png differ diff --git a/asset/icon/Icon32/drive_error.png b/asset/icon/Icon32/drive_error.png new file mode 100644 index 0000000..744ec7a Binary files /dev/null and b/asset/icon/Icon32/drive_error.png differ diff --git a/asset/icon/Icon32/drive_go.png b/asset/icon/Icon32/drive_go.png new file mode 100644 index 0000000..4e039ae Binary files /dev/null and b/asset/icon/Icon32/drive_go.png differ diff --git a/asset/icon/Icon32/drive_key.png b/asset/icon/Icon32/drive_key.png new file mode 100644 index 0000000..8656ed6 Binary files /dev/null and b/asset/icon/Icon32/drive_key.png differ diff --git a/asset/icon/Icon32/drive_link.png b/asset/icon/Icon32/drive_link.png new file mode 100644 index 0000000..eb17aae Binary files /dev/null and b/asset/icon/Icon32/drive_link.png differ diff --git a/asset/icon/Icon32/drive_magnify.png b/asset/icon/Icon32/drive_magnify.png new file mode 100644 index 0000000..985cc23 Binary files /dev/null and b/asset/icon/Icon32/drive_magnify.png differ diff --git a/asset/icon/Icon32/drive_network.png b/asset/icon/Icon32/drive_network.png new file mode 100644 index 0000000..7f66c14 Binary files /dev/null and b/asset/icon/Icon32/drive_network.png differ diff --git a/asset/icon/Icon32/drive_rename.png b/asset/icon/Icon32/drive_rename.png new file mode 100644 index 0000000..6cceb64 Binary files /dev/null and b/asset/icon/Icon32/drive_rename.png differ diff --git a/asset/icon/Icon32/drive_user.png b/asset/icon/Icon32/drive_user.png new file mode 100644 index 0000000..6549793 Binary files /dev/null and b/asset/icon/Icon32/drive_user.png differ diff --git a/asset/icon/Icon32/drive_web.png b/asset/icon/Icon32/drive_web.png new file mode 100644 index 0000000..2db4029 Binary files /dev/null and b/asset/icon/Icon32/drive_web.png differ diff --git a/asset/icon/Icon32/drop.png b/asset/icon/Icon32/drop.png new file mode 100644 index 0000000..6cf5fc3 Binary files /dev/null and b/asset/icon/Icon32/drop.png differ diff --git a/asset/icon/Icon32/drugs_com.png b/asset/icon/Icon32/drugs_com.png new file mode 100644 index 0000000..8815211 Binary files /dev/null and b/asset/icon/Icon32/drugs_com.png differ diff --git a/asset/icon/Icon32/drum.png b/asset/icon/Icon32/drum.png new file mode 100644 index 0000000..f376e97 Binary files /dev/null and b/asset/icon/Icon32/drum.png differ diff --git a/asset/icon/Icon32/dvd.png b/asset/icon/Icon32/dvd.png new file mode 100644 index 0000000..9cffe49 Binary files /dev/null and b/asset/icon/Icon32/dvd.png differ diff --git a/asset/icon/Icon32/dvd_add.png b/asset/icon/Icon32/dvd_add.png new file mode 100644 index 0000000..8f467c7 Binary files /dev/null and b/asset/icon/Icon32/dvd_add.png differ diff --git a/asset/icon/Icon32/dvd_delete.png b/asset/icon/Icon32/dvd_delete.png new file mode 100644 index 0000000..6469caa Binary files /dev/null and b/asset/icon/Icon32/dvd_delete.png differ diff --git a/asset/icon/Icon32/dvd_edit.png b/asset/icon/Icon32/dvd_edit.png new file mode 100644 index 0000000..92009c9 Binary files /dev/null and b/asset/icon/Icon32/dvd_edit.png differ diff --git a/asset/icon/Icon32/dvd_error.png b/asset/icon/Icon32/dvd_error.png new file mode 100644 index 0000000..c33772b Binary files /dev/null and b/asset/icon/Icon32/dvd_error.png differ diff --git a/asset/icon/Icon32/dvd_go.png b/asset/icon/Icon32/dvd_go.png new file mode 100644 index 0000000..d7b13a1 Binary files /dev/null and b/asset/icon/Icon32/dvd_go.png differ diff --git a/asset/icon/Icon32/dvd_key.png b/asset/icon/Icon32/dvd_key.png new file mode 100644 index 0000000..5d65563 Binary files /dev/null and b/asset/icon/Icon32/dvd_key.png differ diff --git a/asset/icon/Icon32/dvd_link.png b/asset/icon/Icon32/dvd_link.png new file mode 100644 index 0000000..0f4758d Binary files /dev/null and b/asset/icon/Icon32/dvd_link.png differ diff --git a/asset/icon/Icon32/dynamite.png b/asset/icon/Icon32/dynamite.png new file mode 100644 index 0000000..ea9329c Binary files /dev/null and b/asset/icon/Icon32/dynamite.png differ diff --git a/asset/icon/Icon32/e_book_reader_black.png b/asset/icon/Icon32/e_book_reader_black.png new file mode 100644 index 0000000..2d9472b Binary files /dev/null and b/asset/icon/Icon32/e_book_reader_black.png differ diff --git a/asset/icon/Icon32/e_book_reader_white.png b/asset/icon/Icon32/e_book_reader_white.png new file mode 100644 index 0000000..e4e9a3a Binary files /dev/null and b/asset/icon/Icon32/e_book_reader_white.png differ diff --git a/asset/icon/Icon32/ear_listen.png b/asset/icon/Icon32/ear_listen.png new file mode 100644 index 0000000..bfc4541 Binary files /dev/null and b/asset/icon/Icon32/ear_listen.png differ diff --git a/asset/icon/Icon32/earth_night.png b/asset/icon/Icon32/earth_night.png new file mode 100644 index 0000000..58ac4d8 Binary files /dev/null and b/asset/icon/Icon32/earth_night.png differ diff --git a/asset/icon/Icon32/ebay.png b/asset/icon/Icon32/ebay.png new file mode 100644 index 0000000..b04e9e2 Binary files /dev/null and b/asset/icon/Icon32/ebay.png differ diff --git a/asset/icon/Icon32/echeck.png b/asset/icon/Icon32/echeck.png new file mode 100644 index 0000000..5c69065 Binary files /dev/null and b/asset/icon/Icon32/echeck.png differ diff --git a/asset/icon/Icon32/ecommerce_server.png b/asset/icon/Icon32/ecommerce_server.png new file mode 100644 index 0000000..487b501 Binary files /dev/null and b/asset/icon/Icon32/ecommerce_server.png differ diff --git a/asset/icon/Icon32/edit_button.png b/asset/icon/Icon32/edit_button.png new file mode 100644 index 0000000..84d2595 Binary files /dev/null and b/asset/icon/Icon32/edit_button.png differ diff --git a/asset/icon/Icon32/edit_chain.png b/asset/icon/Icon32/edit_chain.png new file mode 100644 index 0000000..7ba69eb Binary files /dev/null and b/asset/icon/Icon32/edit_chain.png differ diff --git a/asset/icon/Icon32/edit_diff.png b/asset/icon/Icon32/edit_diff.png new file mode 100644 index 0000000..c19728a Binary files /dev/null and b/asset/icon/Icon32/edit_diff.png differ diff --git a/asset/icon/Icon32/edit_dns_zone.png b/asset/icon/Icon32/edit_dns_zone.png new file mode 100644 index 0000000..6d75210 Binary files /dev/null and b/asset/icon/Icon32/edit_dns_zone.png differ diff --git a/asset/icon/Icon32/edit_free.png b/asset/icon/Icon32/edit_free.png new file mode 100644 index 0000000..0581f50 Binary files /dev/null and b/asset/icon/Icon32/edit_free.png differ diff --git a/asset/icon/Icon32/edit_mathematics.png b/asset/icon/Icon32/edit_mathematics.png new file mode 100644 index 0000000..d2ff051 Binary files /dev/null and b/asset/icon/Icon32/edit_mathematics.png differ diff --git a/asset/icon/Icon32/edit_mx_entry.png b/asset/icon/Icon32/edit_mx_entry.png new file mode 100644 index 0000000..bed5ad6 Binary files /dev/null and b/asset/icon/Icon32/edit_mx_entry.png differ diff --git a/asset/icon/Icon32/edit_package.png b/asset/icon/Icon32/edit_package.png new file mode 100644 index 0000000..42541d9 Binary files /dev/null and b/asset/icon/Icon32/edit_package.png differ diff --git a/asset/icon/Icon32/edit_path.png b/asset/icon/Icon32/edit_path.png new file mode 100644 index 0000000..5efc18a Binary files /dev/null and b/asset/icon/Icon32/edit_path.png differ diff --git a/asset/icon/Icon32/edit_recipient_list.png b/asset/icon/Icon32/edit_recipient_list.png new file mode 100644 index 0000000..8ca4e5c Binary files /dev/null and b/asset/icon/Icon32/edit_recipient_list.png differ diff --git a/asset/icon/Icon32/edit_zone_templates.png b/asset/icon/Icon32/edit_zone_templates.png new file mode 100644 index 0000000..2676914 Binary files /dev/null and b/asset/icon/Icon32/edit_zone_templates.png differ diff --git a/asset/icon/Icon32/education.png b/asset/icon/Icon32/education.png new file mode 100644 index 0000000..697672d Binary files /dev/null and b/asset/icon/Icon32/education.png differ diff --git a/asset/icon/Icon32/egyptian_pyramid.png b/asset/icon/Icon32/egyptian_pyramid.png new file mode 100644 index 0000000..1135c50 Binary files /dev/null and b/asset/icon/Icon32/egyptian_pyramid.png differ diff --git a/asset/icon/Icon32/ehow.png b/asset/icon/Icon32/ehow.png new file mode 100644 index 0000000..3435605 Binary files /dev/null and b/asset/icon/Icon32/ehow.png differ diff --git a/asset/icon/Icon32/electric_guitar.png b/asset/icon/Icon32/electric_guitar.png new file mode 100644 index 0000000..c97ebd6 Binary files /dev/null and b/asset/icon/Icon32/electric_guitar.png differ diff --git a/asset/icon/Icon32/elements.png b/asset/icon/Icon32/elements.png new file mode 100644 index 0000000..8e2b450 Binary files /dev/null and b/asset/icon/Icon32/elements.png differ diff --git a/asset/icon/Icon32/email.png b/asset/icon/Icon32/email.png new file mode 100644 index 0000000..98a99c2 Binary files /dev/null and b/asset/icon/Icon32/email.png differ diff --git a/asset/icon/Icon32/email_accounts.png b/asset/icon/Icon32/email_accounts.png new file mode 100644 index 0000000..8ebc5ae Binary files /dev/null and b/asset/icon/Icon32/email_accounts.png differ diff --git a/asset/icon/Icon32/email_add.png b/asset/icon/Icon32/email_add.png new file mode 100644 index 0000000..69029b5 Binary files /dev/null and b/asset/icon/Icon32/email_add.png differ diff --git a/asset/icon/Icon32/email_air.png b/asset/icon/Icon32/email_air.png new file mode 100644 index 0000000..0637d3c Binary files /dev/null and b/asset/icon/Icon32/email_air.png differ diff --git a/asset/icon/Icon32/email_at_sign.png b/asset/icon/Icon32/email_at_sign.png new file mode 100644 index 0000000..f192c84 Binary files /dev/null and b/asset/icon/Icon32/email_at_sign.png differ diff --git a/asset/icon/Icon32/email_attach.png b/asset/icon/Icon32/email_attach.png new file mode 100644 index 0000000..88aa403 Binary files /dev/null and b/asset/icon/Icon32/email_attach.png differ diff --git a/asset/icon/Icon32/email_authentication.png b/asset/icon/Icon32/email_authentication.png new file mode 100644 index 0000000..718471e Binary files /dev/null and b/asset/icon/Icon32/email_authentication.png differ diff --git a/asset/icon/Icon32/email_delete.png b/asset/icon/Icon32/email_delete.png new file mode 100644 index 0000000..30a2f9d Binary files /dev/null and b/asset/icon/Icon32/email_delete.png differ diff --git a/asset/icon/Icon32/email_edit.png b/asset/icon/Icon32/email_edit.png new file mode 100644 index 0000000..f186e88 Binary files /dev/null and b/asset/icon/Icon32/email_edit.png differ diff --git a/asset/icon/Icon32/email_error.png b/asset/icon/Icon32/email_error.png new file mode 100644 index 0000000..1a8d30f Binary files /dev/null and b/asset/icon/Icon32/email_error.png differ diff --git a/asset/icon/Icon32/email_forward.png b/asset/icon/Icon32/email_forward.png new file mode 100644 index 0000000..15ccf4d Binary files /dev/null and b/asset/icon/Icon32/email_forward.png differ diff --git a/asset/icon/Icon32/email_go.png b/asset/icon/Icon32/email_go.png new file mode 100644 index 0000000..f71e37a Binary files /dev/null and b/asset/icon/Icon32/email_go.png differ diff --git a/asset/icon/Icon32/email_link.png b/asset/icon/Icon32/email_link.png new file mode 100644 index 0000000..a6e4ac4 Binary files /dev/null and b/asset/icon/Icon32/email_link.png differ diff --git a/asset/icon/Icon32/email_open.png b/asset/icon/Icon32/email_open.png new file mode 100644 index 0000000..1c75642 Binary files /dev/null and b/asset/icon/Icon32/email_open.png differ diff --git a/asset/icon/Icon32/email_open_image.png b/asset/icon/Icon32/email_open_image.png new file mode 100644 index 0000000..8f3eefe Binary files /dev/null and b/asset/icon/Icon32/email_open_image.png differ diff --git a/asset/icon/Icon32/email_send_receive.png b/asset/icon/Icon32/email_send_receive.png new file mode 100644 index 0000000..0a76ded Binary files /dev/null and b/asset/icon/Icon32/email_send_receive.png differ diff --git a/asset/icon/Icon32/email_setting.png b/asset/icon/Icon32/email_setting.png new file mode 100644 index 0000000..5889e6d Binary files /dev/null and b/asset/icon/Icon32/email_setting.png differ diff --git a/asset/icon/Icon32/email_to_friend.png b/asset/icon/Icon32/email_to_friend.png new file mode 100644 index 0000000..a407d00 Binary files /dev/null and b/asset/icon/Icon32/email_to_friend.png differ diff --git a/asset/icon/Icon32/email_trace.png b/asset/icon/Icon32/email_trace.png new file mode 100644 index 0000000..410c367 Binary files /dev/null and b/asset/icon/Icon32/email_trace.png differ diff --git a/asset/icon/Icon32/emails.png b/asset/icon/Icon32/emails.png new file mode 100644 index 0000000..bd22afa Binary files /dev/null and b/asset/icon/Icon32/emails.png differ diff --git a/asset/icon/Icon32/emails_stack.png b/asset/icon/Icon32/emails_stack.png new file mode 100644 index 0000000..5ab195f Binary files /dev/null and b/asset/icon/Icon32/emails_stack.png differ diff --git a/asset/icon/Icon32/ember.png b/asset/icon/Icon32/ember.png new file mode 100644 index 0000000..365f37a Binary files /dev/null and b/asset/icon/Icon32/ember.png differ diff --git a/asset/icon/Icon32/emotion_adore.png b/asset/icon/Icon32/emotion_adore.png new file mode 100644 index 0000000..3d141af Binary files /dev/null and b/asset/icon/Icon32/emotion_adore.png differ diff --git a/asset/icon/Icon32/emotion_after_boom.png b/asset/icon/Icon32/emotion_after_boom.png new file mode 100644 index 0000000..134bbf0 Binary files /dev/null and b/asset/icon/Icon32/emotion_after_boom.png differ diff --git a/asset/icon/Icon32/emotion_ah.png b/asset/icon/Icon32/emotion_ah.png new file mode 100644 index 0000000..21ac851 Binary files /dev/null and b/asset/icon/Icon32/emotion_ah.png differ diff --git a/asset/icon/Icon32/emotion_alien.png b/asset/icon/Icon32/emotion_alien.png new file mode 100644 index 0000000..09345a7 Binary files /dev/null and b/asset/icon/Icon32/emotion_alien.png differ diff --git a/asset/icon/Icon32/emotion_amazing.png b/asset/icon/Icon32/emotion_amazing.png new file mode 100644 index 0000000..29664da Binary files /dev/null and b/asset/icon/Icon32/emotion_amazing.png differ diff --git a/asset/icon/Icon32/emotion_angel.png b/asset/icon/Icon32/emotion_angel.png new file mode 100644 index 0000000..58d771e Binary files /dev/null and b/asset/icon/Icon32/emotion_angel.png differ diff --git a/asset/icon/Icon32/emotion_anger.png b/asset/icon/Icon32/emotion_anger.png new file mode 100644 index 0000000..2b301cd Binary files /dev/null and b/asset/icon/Icon32/emotion_anger.png differ diff --git a/asset/icon/Icon32/emotion_angry.png b/asset/icon/Icon32/emotion_angry.png new file mode 100644 index 0000000..77dea31 Binary files /dev/null and b/asset/icon/Icon32/emotion_angry.png differ diff --git a/asset/icon/Icon32/emotion_aqua.png b/asset/icon/Icon32/emotion_aqua.png new file mode 100644 index 0000000..950da86 Binary files /dev/null and b/asset/icon/Icon32/emotion_aqua.png differ diff --git a/asset/icon/Icon32/emotion_baby.png b/asset/icon/Icon32/emotion_baby.png new file mode 100644 index 0000000..fed3bb4 Binary files /dev/null and b/asset/icon/Icon32/emotion_baby.png differ diff --git a/asset/icon/Icon32/emotion_bad_egg.png b/asset/icon/Icon32/emotion_bad_egg.png new file mode 100644 index 0000000..c2096d3 Binary files /dev/null and b/asset/icon/Icon32/emotion_bad_egg.png differ diff --git a/asset/icon/Icon32/emotion_bad_smelly.png b/asset/icon/Icon32/emotion_bad_smelly.png new file mode 100644 index 0000000..54f3129 Binary files /dev/null and b/asset/icon/Icon32/emotion_bad_smelly.png differ diff --git a/asset/icon/Icon32/emotion_baffle.png b/asset/icon/Icon32/emotion_baffle.png new file mode 100644 index 0000000..06a3ca2 Binary files /dev/null and b/asset/icon/Icon32/emotion_baffle.png differ diff --git a/asset/icon/Icon32/emotion_batman.png b/asset/icon/Icon32/emotion_batman.png new file mode 100644 index 0000000..17ddd8b Binary files /dev/null and b/asset/icon/Icon32/emotion_batman.png differ diff --git a/asset/icon/Icon32/emotion_beat_brick.png b/asset/icon/Icon32/emotion_beat_brick.png new file mode 100644 index 0000000..c814a9c Binary files /dev/null and b/asset/icon/Icon32/emotion_beat_brick.png differ diff --git a/asset/icon/Icon32/emotion_beaten.png b/asset/icon/Icon32/emotion_beaten.png new file mode 100644 index 0000000..318c4d0 Binary files /dev/null and b/asset/icon/Icon32/emotion_beaten.png differ diff --git a/asset/icon/Icon32/emotion_bigsmile.png b/asset/icon/Icon32/emotion_bigsmile.png new file mode 100644 index 0000000..c340630 Binary files /dev/null and b/asset/icon/Icon32/emotion_bigsmile.png differ diff --git a/asset/icon/Icon32/emotion_blind.png b/asset/icon/Icon32/emotion_blind.png new file mode 100644 index 0000000..b004ddb Binary files /dev/null and b/asset/icon/Icon32/emotion_blind.png differ diff --git a/asset/icon/Icon32/emotion_bloody.png b/asset/icon/Icon32/emotion_bloody.png new file mode 100644 index 0000000..85c2507 Binary files /dev/null and b/asset/icon/Icon32/emotion_bloody.png differ diff --git a/asset/icon/Icon32/emotion_blow_current.png b/asset/icon/Icon32/emotion_blow_current.png new file mode 100644 index 0000000..320b05e Binary files /dev/null and b/asset/icon/Icon32/emotion_blow_current.png differ diff --git a/asset/icon/Icon32/emotion_boo.png b/asset/icon/Icon32/emotion_boo.png new file mode 100644 index 0000000..e285f4f Binary files /dev/null and b/asset/icon/Icon32/emotion_boo.png differ diff --git a/asset/icon/Icon32/emotion_brains.png b/asset/icon/Icon32/emotion_brains.png new file mode 100644 index 0000000..c509193 Binary files /dev/null and b/asset/icon/Icon32/emotion_brains.png differ diff --git a/asset/icon/Icon32/emotion_bubblegum.png b/asset/icon/Icon32/emotion_bubblegum.png new file mode 100644 index 0000000..5ce2bb3 Binary files /dev/null and b/asset/icon/Icon32/emotion_bubblegum.png differ diff --git a/asset/icon/Icon32/emotion_bully.png b/asset/icon/Icon32/emotion_bully.png new file mode 100644 index 0000000..d0a4574 Binary files /dev/null and b/asset/icon/Icon32/emotion_bully.png differ diff --git a/asset/icon/Icon32/emotion_burn_joss_stick.png b/asset/icon/Icon32/emotion_burn_joss_stick.png new file mode 100644 index 0000000..7043bf8 Binary files /dev/null and b/asset/icon/Icon32/emotion_burn_joss_stick.png differ diff --git a/asset/icon/Icon32/emotion_burnt.png b/asset/icon/Icon32/emotion_burnt.png new file mode 100644 index 0000000..91d62ec Binary files /dev/null and b/asset/icon/Icon32/emotion_burnt.png differ diff --git a/asset/icon/Icon32/emotion_bye_bye.png b/asset/icon/Icon32/emotion_bye_bye.png new file mode 100644 index 0000000..7f00ed9 Binary files /dev/null and b/asset/icon/Icon32/emotion_bye_bye.png differ diff --git a/asset/icon/Icon32/emotion_chinese.png b/asset/icon/Icon32/emotion_chinese.png new file mode 100644 index 0000000..cc57d1b Binary files /dev/null and b/asset/icon/Icon32/emotion_chinese.png differ diff --git a/asset/icon/Icon32/emotion_chupachups.png b/asset/icon/Icon32/emotion_chupachups.png new file mode 100644 index 0000000..e682a04 Binary files /dev/null and b/asset/icon/Icon32/emotion_chupachups.png differ diff --git a/asset/icon/Icon32/emotion_clown.png b/asset/icon/Icon32/emotion_clown.png new file mode 100644 index 0000000..6352621 Binary files /dev/null and b/asset/icon/Icon32/emotion_clown.png differ diff --git a/asset/icon/Icon32/emotion_cold.png b/asset/icon/Icon32/emotion_cold.png new file mode 100644 index 0000000..52db693 Binary files /dev/null and b/asset/icon/Icon32/emotion_cold.png differ diff --git a/asset/icon/Icon32/emotion_confident.png b/asset/icon/Icon32/emotion_confident.png new file mode 100644 index 0000000..88ae6be Binary files /dev/null and b/asset/icon/Icon32/emotion_confident.png differ diff --git a/asset/icon/Icon32/emotion_confuse.png b/asset/icon/Icon32/emotion_confuse.png new file mode 100644 index 0000000..f852be2 Binary files /dev/null and b/asset/icon/Icon32/emotion_confuse.png differ diff --git a/asset/icon/Icon32/emotion_convict.png b/asset/icon/Icon32/emotion_convict.png new file mode 100644 index 0000000..c1fe806 Binary files /dev/null and b/asset/icon/Icon32/emotion_convict.png differ diff --git a/asset/icon/Icon32/emotion_cool.png b/asset/icon/Icon32/emotion_cool.png new file mode 100644 index 0000000..6bcec02 Binary files /dev/null and b/asset/icon/Icon32/emotion_cool.png differ diff --git a/asset/icon/Icon32/emotion_crazy.png b/asset/icon/Icon32/emotion_crazy.png new file mode 100644 index 0000000..bb18c7f Binary files /dev/null and b/asset/icon/Icon32/emotion_crazy.png differ diff --git a/asset/icon/Icon32/emotion_crazy_rabbit.png b/asset/icon/Icon32/emotion_crazy_rabbit.png new file mode 100644 index 0000000..1b38b5b Binary files /dev/null and b/asset/icon/Icon32/emotion_crazy_rabbit.png differ diff --git a/asset/icon/Icon32/emotion_cry.png b/asset/icon/Icon32/emotion_cry.png new file mode 100644 index 0000000..3fbbc3b Binary files /dev/null and b/asset/icon/Icon32/emotion_cry.png differ diff --git a/asset/icon/Icon32/emotion_cyclops.png b/asset/icon/Icon32/emotion_cyclops.png new file mode 100644 index 0000000..cb4cfe5 Binary files /dev/null and b/asset/icon/Icon32/emotion_cyclops.png differ diff --git a/asset/icon/Icon32/emotion_daddy_cool.png b/asset/icon/Icon32/emotion_daddy_cool.png new file mode 100644 index 0000000..9626341 Binary files /dev/null and b/asset/icon/Icon32/emotion_daddy_cool.png differ diff --git a/asset/icon/Icon32/emotion_darth_wader.png b/asset/icon/Icon32/emotion_darth_wader.png new file mode 100644 index 0000000..c3f5133 Binary files /dev/null and b/asset/icon/Icon32/emotion_darth_wader.png differ diff --git a/asset/icon/Icon32/emotion_david_blaine.png b/asset/icon/Icon32/emotion_david_blaine.png new file mode 100644 index 0000000..fdd41bb Binary files /dev/null and b/asset/icon/Icon32/emotion_david_blaine.png differ diff --git a/asset/icon/Icon32/emotion_dead.png b/asset/icon/Icon32/emotion_dead.png new file mode 100644 index 0000000..2225ba2 Binary files /dev/null and b/asset/icon/Icon32/emotion_dead.png differ diff --git a/asset/icon/Icon32/emotion_detective.png b/asset/icon/Icon32/emotion_detective.png new file mode 100644 index 0000000..c3288bf Binary files /dev/null and b/asset/icon/Icon32/emotion_detective.png differ diff --git a/asset/icon/Icon32/emotion_devil.png b/asset/icon/Icon32/emotion_devil.png new file mode 100644 index 0000000..cbe178f Binary files /dev/null and b/asset/icon/Icon32/emotion_devil.png differ diff --git a/asset/icon/Icon32/emotion_diver.png b/asset/icon/Icon32/emotion_diver.png new file mode 100644 index 0000000..f6942a4 Binary files /dev/null and b/asset/icon/Icon32/emotion_diver.png differ diff --git a/asset/icon/Icon32/emotion_doubt.png b/asset/icon/Icon32/emotion_doubt.png new file mode 100644 index 0000000..846ad69 Binary files /dev/null and b/asset/icon/Icon32/emotion_doubt.png differ diff --git a/asset/icon/Icon32/emotion_doze.png b/asset/icon/Icon32/emotion_doze.png new file mode 100644 index 0000000..17a7e79 Binary files /dev/null and b/asset/icon/Icon32/emotion_doze.png differ diff --git a/asset/icon/Icon32/emotion_draw.png b/asset/icon/Icon32/emotion_draw.png new file mode 100644 index 0000000..2ee4f78 Binary files /dev/null and b/asset/icon/Icon32/emotion_draw.png differ diff --git a/asset/icon/Icon32/emotion_dribble.png b/asset/icon/Icon32/emotion_dribble.png new file mode 100644 index 0000000..949c43f Binary files /dev/null and b/asset/icon/Icon32/emotion_dribble.png differ diff --git a/asset/icon/Icon32/emotion_drink.png b/asset/icon/Icon32/emotion_drink.png new file mode 100644 index 0000000..c020e14 Binary files /dev/null and b/asset/icon/Icon32/emotion_drink.png differ diff --git a/asset/icon/Icon32/emotion_drunkard.png b/asset/icon/Icon32/emotion_drunkard.png new file mode 100644 index 0000000..a264073 Binary files /dev/null and b/asset/icon/Icon32/emotion_drunkard.png differ diff --git a/asset/icon/Icon32/emotion_evilgrin.png b/asset/icon/Icon32/emotion_evilgrin.png new file mode 100644 index 0000000..50d11ce Binary files /dev/null and b/asset/icon/Icon32/emotion_evilgrin.png differ diff --git a/asset/icon/Icon32/emotion_evolution.png b/asset/icon/Icon32/emotion_evolution.png new file mode 100644 index 0000000..c018e22 Binary files /dev/null and b/asset/icon/Icon32/emotion_evolution.png differ diff --git a/asset/icon/Icon32/emotion_exciting.png b/asset/icon/Icon32/emotion_exciting.png new file mode 100644 index 0000000..adc15c0 Binary files /dev/null and b/asset/icon/Icon32/emotion_exciting.png differ diff --git a/asset/icon/Icon32/emotion_eye.png b/asset/icon/Icon32/emotion_eye.png new file mode 100644 index 0000000..f8086d3 Binary files /dev/null and b/asset/icon/Icon32/emotion_eye.png differ diff --git a/asset/icon/Icon32/emotion_eyes_droped.png b/asset/icon/Icon32/emotion_eyes_droped.png new file mode 100644 index 0000000..f12797c Binary files /dev/null and b/asset/icon/Icon32/emotion_eyes_droped.png differ diff --git a/asset/icon/Icon32/emotion_face_monkey.png b/asset/icon/Icon32/emotion_face_monkey.png new file mode 100644 index 0000000..9c123af Binary files /dev/null and b/asset/icon/Icon32/emotion_face_monkey.png differ diff --git a/asset/icon/Icon32/emotion_face_panda.png b/asset/icon/Icon32/emotion_face_panda.png new file mode 100644 index 0000000..982cf83 Binary files /dev/null and b/asset/icon/Icon32/emotion_face_panda.png differ diff --git a/asset/icon/Icon32/emotion_fan.png b/asset/icon/Icon32/emotion_fan.png new file mode 100644 index 0000000..98df0d0 Binary files /dev/null and b/asset/icon/Icon32/emotion_fan.png differ diff --git a/asset/icon/Icon32/emotion_fire.png b/asset/icon/Icon32/emotion_fire.png new file mode 100644 index 0000000..c33c306 Binary files /dev/null and b/asset/icon/Icon32/emotion_fire.png differ diff --git a/asset/icon/Icon32/emotion_flower_dead.png b/asset/icon/Icon32/emotion_flower_dead.png new file mode 100644 index 0000000..9f48244 Binary files /dev/null and b/asset/icon/Icon32/emotion_flower_dead.png differ diff --git a/asset/icon/Icon32/emotion_franken.png b/asset/icon/Icon32/emotion_franken.png new file mode 100644 index 0000000..7610ad1 Binary files /dev/null and b/asset/icon/Icon32/emotion_franken.png differ diff --git a/asset/icon/Icon32/emotion_freak.png b/asset/icon/Icon32/emotion_freak.png new file mode 100644 index 0000000..401c30d Binary files /dev/null and b/asset/icon/Icon32/emotion_freak.png differ diff --git a/asset/icon/Icon32/emotion_frost.png b/asset/icon/Icon32/emotion_frost.png new file mode 100644 index 0000000..66542f9 Binary files /dev/null and b/asset/icon/Icon32/emotion_frost.png differ diff --git a/asset/icon/Icon32/emotion_gangs.png b/asset/icon/Icon32/emotion_gangs.png new file mode 100644 index 0000000..0ed2702 Binary files /dev/null and b/asset/icon/Icon32/emotion_gangs.png differ diff --git a/asset/icon/Icon32/emotion_gear.png b/asset/icon/Icon32/emotion_gear.png new file mode 100644 index 0000000..d842f42 Binary files /dev/null and b/asset/icon/Icon32/emotion_gear.png differ diff --git a/asset/icon/Icon32/emotion_ghost.png b/asset/icon/Icon32/emotion_ghost.png new file mode 100644 index 0000000..613ba05 Binary files /dev/null and b/asset/icon/Icon32/emotion_ghost.png differ diff --git a/asset/icon/Icon32/emotion_girl.png b/asset/icon/Icon32/emotion_girl.png new file mode 100644 index 0000000..a473f90 Binary files /dev/null and b/asset/icon/Icon32/emotion_girl.png differ diff --git a/asset/icon/Icon32/emotion_go.png b/asset/icon/Icon32/emotion_go.png new file mode 100644 index 0000000..692fc5b Binary files /dev/null and b/asset/icon/Icon32/emotion_go.png differ diff --git a/asset/icon/Icon32/emotion_gourmand.png b/asset/icon/Icon32/emotion_gourmand.png new file mode 100644 index 0000000..f635617 Binary files /dev/null and b/asset/icon/Icon32/emotion_gourmand.png differ diff --git a/asset/icon/Icon32/emotion_grad_green.png b/asset/icon/Icon32/emotion_grad_green.png new file mode 100644 index 0000000..3dce96d Binary files /dev/null and b/asset/icon/Icon32/emotion_grad_green.png differ diff --git a/asset/icon/Icon32/emotion_grad_red.png b/asset/icon/Icon32/emotion_grad_red.png new file mode 100644 index 0000000..3f30be3 Binary files /dev/null and b/asset/icon/Icon32/emotion_grad_red.png differ diff --git a/asset/icon/Icon32/emotion_grad_yellow.png b/asset/icon/Icon32/emotion_grad_yellow.png new file mode 100644 index 0000000..5cba08a Binary files /dev/null and b/asset/icon/Icon32/emotion_grad_yellow.png differ diff --git a/asset/icon/Icon32/emotion_greedy.png b/asset/icon/Icon32/emotion_greedy.png new file mode 100644 index 0000000..c1ea6c2 Binary files /dev/null and b/asset/icon/Icon32/emotion_greedy.png differ diff --git a/asset/icon/Icon32/emotion_grin.png b/asset/icon/Icon32/emotion_grin.png new file mode 100644 index 0000000..9762662 Binary files /dev/null and b/asset/icon/Icon32/emotion_grin.png differ diff --git a/asset/icon/Icon32/emotion_haha.png b/asset/icon/Icon32/emotion_haha.png new file mode 100644 index 0000000..9e46268 Binary files /dev/null and b/asset/icon/Icon32/emotion_haha.png differ diff --git a/asset/icon/Icon32/emotion_hand_flower.png b/asset/icon/Icon32/emotion_hand_flower.png new file mode 100644 index 0000000..926c4f2 Binary files /dev/null and b/asset/icon/Icon32/emotion_hand_flower.png differ diff --git a/asset/icon/Icon32/emotion_happy.png b/asset/icon/Icon32/emotion_happy.png new file mode 100644 index 0000000..515f90d Binary files /dev/null and b/asset/icon/Icon32/emotion_happy.png differ diff --git a/asset/icon/Icon32/emotion_harry_potter.png b/asset/icon/Icon32/emotion_harry_potter.png new file mode 100644 index 0000000..faa4581 Binary files /dev/null and b/asset/icon/Icon32/emotion_harry_potter.png differ diff --git a/asset/icon/Icon32/emotion_hatched.png b/asset/icon/Icon32/emotion_hatched.png new file mode 100644 index 0000000..949061a Binary files /dev/null and b/asset/icon/Icon32/emotion_hatched.png differ diff --git a/asset/icon/Icon32/emotion_hidden.png b/asset/icon/Icon32/emotion_hidden.png new file mode 100644 index 0000000..b07beae Binary files /dev/null and b/asset/icon/Icon32/emotion_hidden.png differ diff --git a/asset/icon/Icon32/emotion_hitler.png b/asset/icon/Icon32/emotion_hitler.png new file mode 100644 index 0000000..b3c83b5 Binary files /dev/null and b/asset/icon/Icon32/emotion_hitler.png differ diff --git a/asset/icon/Icon32/emotion_horror.png b/asset/icon/Icon32/emotion_horror.png new file mode 100644 index 0000000..1372bb9 Binary files /dev/null and b/asset/icon/Icon32/emotion_horror.png differ diff --git a/asset/icon/Icon32/emotion_hot.png b/asset/icon/Icon32/emotion_hot.png new file mode 100644 index 0000000..71611f4 Binary files /dev/null and b/asset/icon/Icon32/emotion_hot.png differ diff --git a/asset/icon/Icon32/emotion_hungry.png b/asset/icon/Icon32/emotion_hungry.png new file mode 100644 index 0000000..0cbcbc2 Binary files /dev/null and b/asset/icon/Icon32/emotion_hungry.png differ diff --git a/asset/icon/Icon32/emotion_hypnotized.png b/asset/icon/Icon32/emotion_hypnotized.png new file mode 100644 index 0000000..041c007 Binary files /dev/null and b/asset/icon/Icon32/emotion_hypnotized.png differ diff --git a/asset/icon/Icon32/emotion_injured.png b/asset/icon/Icon32/emotion_injured.png new file mode 100644 index 0000000..7adaebf Binary files /dev/null and b/asset/icon/Icon32/emotion_injured.png differ diff --git a/asset/icon/Icon32/emotion_japan.png b/asset/icon/Icon32/emotion_japan.png new file mode 100644 index 0000000..749005c Binary files /dev/null and b/asset/icon/Icon32/emotion_japan.png differ diff --git a/asset/icon/Icon32/emotion_jason.png b/asset/icon/Icon32/emotion_jason.png new file mode 100644 index 0000000..fcd59d2 Binary files /dev/null and b/asset/icon/Icon32/emotion_jason.png differ diff --git a/asset/icon/Icon32/emotion_juggler.png b/asset/icon/Icon32/emotion_juggler.png new file mode 100644 index 0000000..1c2c039 Binary files /dev/null and b/asset/icon/Icon32/emotion_juggler.png differ diff --git a/asset/icon/Icon32/emotion_kiddy.png b/asset/icon/Icon32/emotion_kiddy.png new file mode 100644 index 0000000..c287938 Binary files /dev/null and b/asset/icon/Icon32/emotion_kiddy.png differ diff --git a/asset/icon/Icon32/emotion_kiss.png b/asset/icon/Icon32/emotion_kiss.png new file mode 100644 index 0000000..5aef6f3 Binary files /dev/null and b/asset/icon/Icon32/emotion_kiss.png differ diff --git a/asset/icon/Icon32/emotion_kissed.png b/asset/icon/Icon32/emotion_kissed.png new file mode 100644 index 0000000..fb6315d Binary files /dev/null and b/asset/icon/Icon32/emotion_kissed.png differ diff --git a/asset/icon/Icon32/emotion_knight.png b/asset/icon/Icon32/emotion_knight.png new file mode 100644 index 0000000..540d7f1 Binary files /dev/null and b/asset/icon/Icon32/emotion_knight.png differ diff --git a/asset/icon/Icon32/emotion_lol.png b/asset/icon/Icon32/emotion_lol.png new file mode 100644 index 0000000..cd9ac2b Binary files /dev/null and b/asset/icon/Icon32/emotion_lol.png differ diff --git a/asset/icon/Icon32/emotion_lollipops.png b/asset/icon/Icon32/emotion_lollipops.png new file mode 100644 index 0000000..8212c93 Binary files /dev/null and b/asset/icon/Icon32/emotion_lollipops.png differ diff --git a/asset/icon/Icon32/emotion_love.png b/asset/icon/Icon32/emotion_love.png new file mode 100644 index 0000000..a228df9 Binary files /dev/null and b/asset/icon/Icon32/emotion_love.png differ diff --git a/asset/icon/Icon32/emotion_mad.png b/asset/icon/Icon32/emotion_mad.png new file mode 100644 index 0000000..d61215d Binary files /dev/null and b/asset/icon/Icon32/emotion_mad.png differ diff --git a/asset/icon/Icon32/emotion_mah_playlist.png b/asset/icon/Icon32/emotion_mah_playlist.png new file mode 100644 index 0000000..7373f66 Binary files /dev/null and b/asset/icon/Icon32/emotion_mah_playlist.png differ diff --git a/asset/icon/Icon32/emotion_matrix.png b/asset/icon/Icon32/emotion_matrix.png new file mode 100644 index 0000000..b1dbfce Binary files /dev/null and b/asset/icon/Icon32/emotion_matrix.png differ diff --git a/asset/icon/Icon32/emotion_meaw.png b/asset/icon/Icon32/emotion_meaw.png new file mode 100644 index 0000000..9d749bd Binary files /dev/null and b/asset/icon/Icon32/emotion_meaw.png differ diff --git a/asset/icon/Icon32/emotion_medic.png b/asset/icon/Icon32/emotion_medic.png new file mode 100644 index 0000000..105d5f4 Binary files /dev/null and b/asset/icon/Icon32/emotion_medic.png differ diff --git a/asset/icon/Icon32/emotion_misdoubt.png b/asset/icon/Icon32/emotion_misdoubt.png new file mode 100644 index 0000000..be7e813 Binary files /dev/null and b/asset/icon/Icon32/emotion_misdoubt.png differ diff --git a/asset/icon/Icon32/emotion_money.png b/asset/icon/Icon32/emotion_money.png new file mode 100644 index 0000000..9c4e9ce Binary files /dev/null and b/asset/icon/Icon32/emotion_money.png differ diff --git a/asset/icon/Icon32/emotion_mummy.png b/asset/icon/Icon32/emotion_mummy.png new file mode 100644 index 0000000..7d2e768 Binary files /dev/null and b/asset/icon/Icon32/emotion_mummy.png differ diff --git a/asset/icon/Icon32/emotion_musician.png b/asset/icon/Icon32/emotion_musician.png new file mode 100644 index 0000000..e45355b Binary files /dev/null and b/asset/icon/Icon32/emotion_musician.png differ diff --git a/asset/icon/Icon32/emotion_nerd.png b/asset/icon/Icon32/emotion_nerd.png new file mode 100644 index 0000000..3d38d08 Binary files /dev/null and b/asset/icon/Icon32/emotion_nerd.png differ diff --git a/asset/icon/Icon32/emotion_ninja.png b/asset/icon/Icon32/emotion_ninja.png new file mode 100644 index 0000000..7be6c04 Binary files /dev/null and b/asset/icon/Icon32/emotion_ninja.png differ diff --git a/asset/icon/Icon32/emotion_nom_nom.png b/asset/icon/Icon32/emotion_nom_nom.png new file mode 100644 index 0000000..4fe860d Binary files /dev/null and b/asset/icon/Icon32/emotion_nom_nom.png differ diff --git a/asset/icon/Icon32/emotion_nose_pick.png b/asset/icon/Icon32/emotion_nose_pick.png new file mode 100644 index 0000000..36905e1 Binary files /dev/null and b/asset/icon/Icon32/emotion_nose_pick.png differ diff --git a/asset/icon/Icon32/emotion_nosebleed.png b/asset/icon/Icon32/emotion_nosebleed.png new file mode 100644 index 0000000..4655e3c Binary files /dev/null and b/asset/icon/Icon32/emotion_nosebleed.png differ diff --git a/asset/icon/Icon32/emotion_oddball.png b/asset/icon/Icon32/emotion_oddball.png new file mode 100644 index 0000000..6988f37 Binary files /dev/null and b/asset/icon/Icon32/emotion_oddball.png differ diff --git a/asset/icon/Icon32/emotion_party.png b/asset/icon/Icon32/emotion_party.png new file mode 100644 index 0000000..779905e Binary files /dev/null and b/asset/icon/Icon32/emotion_party.png differ diff --git a/asset/icon/Icon32/emotion_patient.png b/asset/icon/Icon32/emotion_patient.png new file mode 100644 index 0000000..230fc4f Binary files /dev/null and b/asset/icon/Icon32/emotion_patient.png differ diff --git a/asset/icon/Icon32/emotion_pirate.png b/asset/icon/Icon32/emotion_pirate.png new file mode 100644 index 0000000..d53b1a5 Binary files /dev/null and b/asset/icon/Icon32/emotion_pirate.png differ diff --git a/asset/icon/Icon32/emotion_pumpkin.png b/asset/icon/Icon32/emotion_pumpkin.png new file mode 100644 index 0000000..0b8848b Binary files /dev/null and b/asset/icon/Icon32/emotion_pumpkin.png differ diff --git a/asset/icon/Icon32/emotion_punk.png b/asset/icon/Icon32/emotion_punk.png new file mode 100644 index 0000000..8de8aba Binary files /dev/null and b/asset/icon/Icon32/emotion_punk.png differ diff --git a/asset/icon/Icon32/emotion_question.png b/asset/icon/Icon32/emotion_question.png new file mode 100644 index 0000000..c544327 Binary files /dev/null and b/asset/icon/Icon32/emotion_question.png differ diff --git a/asset/icon/Icon32/emotion_rap.png b/asset/icon/Icon32/emotion_rap.png new file mode 100644 index 0000000..0ae8482 Binary files /dev/null and b/asset/icon/Icon32/emotion_rap.png differ diff --git a/asset/icon/Icon32/emotion_razz.png b/asset/icon/Icon32/emotion_razz.png new file mode 100644 index 0000000..18398bc Binary files /dev/null and b/asset/icon/Icon32/emotion_razz.png differ diff --git a/asset/icon/Icon32/emotion_reading.png b/asset/icon/Icon32/emotion_reading.png new file mode 100644 index 0000000..4f501bb Binary files /dev/null and b/asset/icon/Icon32/emotion_reading.png differ diff --git a/asset/icon/Icon32/emotion_red.png b/asset/icon/Icon32/emotion_red.png new file mode 100644 index 0000000..26864b9 Binary files /dev/null and b/asset/icon/Icon32/emotion_red.png differ diff --git a/asset/icon/Icon32/emotion_rocknroll.png b/asset/icon/Icon32/emotion_rocknroll.png new file mode 100644 index 0000000..a788f77 Binary files /dev/null and b/asset/icon/Icon32/emotion_rocknroll.png differ diff --git a/asset/icon/Icon32/emotion_sad.png b/asset/icon/Icon32/emotion_sad.png new file mode 100644 index 0000000..ce14ea5 Binary files /dev/null and b/asset/icon/Icon32/emotion_sad.png differ diff --git a/asset/icon/Icon32/emotion_shame.png b/asset/icon/Icon32/emotion_shame.png new file mode 100644 index 0000000..7504879 Binary files /dev/null and b/asset/icon/Icon32/emotion_shame.png differ diff --git a/asset/icon/Icon32/emotion_shave.png b/asset/icon/Icon32/emotion_shave.png new file mode 100644 index 0000000..fc6c28d Binary files /dev/null and b/asset/icon/Icon32/emotion_shave.png differ diff --git a/asset/icon/Icon32/emotion_shocked.png b/asset/icon/Icon32/emotion_shocked.png new file mode 100644 index 0000000..971ed36 Binary files /dev/null and b/asset/icon/Icon32/emotion_shocked.png differ diff --git a/asset/icon/Icon32/emotion_sick.png b/asset/icon/Icon32/emotion_sick.png new file mode 100644 index 0000000..345f87f Binary files /dev/null and b/asset/icon/Icon32/emotion_sick.png differ diff --git a/asset/icon/Icon32/emotion_silent.png b/asset/icon/Icon32/emotion_silent.png new file mode 100644 index 0000000..46c6754 Binary files /dev/null and b/asset/icon/Icon32/emotion_silent.png differ diff --git a/asset/icon/Icon32/emotion_skull.png b/asset/icon/Icon32/emotion_skull.png new file mode 100644 index 0000000..d4e3b54 Binary files /dev/null and b/asset/icon/Icon32/emotion_skull.png differ diff --git a/asset/icon/Icon32/emotion_sleep.png b/asset/icon/Icon32/emotion_sleep.png new file mode 100644 index 0000000..83784a6 Binary files /dev/null and b/asset/icon/Icon32/emotion_sleep.png differ diff --git a/asset/icon/Icon32/emotion_smile.png b/asset/icon/Icon32/emotion_smile.png new file mode 100644 index 0000000..ad09a52 Binary files /dev/null and b/asset/icon/Icon32/emotion_smile.png differ diff --git a/asset/icon/Icon32/emotion_smokes_grass.png b/asset/icon/Icon32/emotion_smokes_grass.png new file mode 100644 index 0000000..2d15306 Binary files /dev/null and b/asset/icon/Icon32/emotion_smokes_grass.png differ diff --git a/asset/icon/Icon32/emotion_snooty.png b/asset/icon/Icon32/emotion_snooty.png new file mode 100644 index 0000000..53172c5 Binary files /dev/null and b/asset/icon/Icon32/emotion_snooty.png differ diff --git a/asset/icon/Icon32/emotion_speaking.png b/asset/icon/Icon32/emotion_speaking.png new file mode 100644 index 0000000..e6a4e73 Binary files /dev/null and b/asset/icon/Icon32/emotion_speaking.png differ diff --git a/asset/icon/Icon32/emotion_spiderman.png b/asset/icon/Icon32/emotion_spiderman.png new file mode 100644 index 0000000..da8929e Binary files /dev/null and b/asset/icon/Icon32/emotion_spiderman.png differ diff --git a/asset/icon/Icon32/emotion_spy.png b/asset/icon/Icon32/emotion_spy.png new file mode 100644 index 0000000..689a025 Binary files /dev/null and b/asset/icon/Icon32/emotion_spy.png differ diff --git a/asset/icon/Icon32/emotion_star.png b/asset/icon/Icon32/emotion_star.png new file mode 100644 index 0000000..aa0e762 Binary files /dev/null and b/asset/icon/Icon32/emotion_star.png differ diff --git a/asset/icon/Icon32/emotion_still_dreaming.png b/asset/icon/Icon32/emotion_still_dreaming.png new file mode 100644 index 0000000..7979ee3 Binary files /dev/null and b/asset/icon/Icon32/emotion_still_dreaming.png differ diff --git a/asset/icon/Icon32/emotion_stink.png b/asset/icon/Icon32/emotion_stink.png new file mode 100644 index 0000000..e583c28 Binary files /dev/null and b/asset/icon/Icon32/emotion_stink.png differ diff --git a/asset/icon/Icon32/emotion_struggle.png b/asset/icon/Icon32/emotion_struggle.png new file mode 100644 index 0000000..57a25a0 Binary files /dev/null and b/asset/icon/Icon32/emotion_struggle.png differ diff --git a/asset/icon/Icon32/emotion_stupid.png b/asset/icon/Icon32/emotion_stupid.png new file mode 100644 index 0000000..721bdfb Binary files /dev/null and b/asset/icon/Icon32/emotion_stupid.png differ diff --git a/asset/icon/Icon32/emotion_superman.png b/asset/icon/Icon32/emotion_superman.png new file mode 100644 index 0000000..7dbacea Binary files /dev/null and b/asset/icon/Icon32/emotion_superman.png differ diff --git a/asset/icon/Icon32/emotion_suprised.png b/asset/icon/Icon32/emotion_suprised.png new file mode 100644 index 0000000..fa50968 Binary files /dev/null and b/asset/icon/Icon32/emotion_suprised.png differ diff --git a/asset/icon/Icon32/emotion_sure.png b/asset/icon/Icon32/emotion_sure.png new file mode 100644 index 0000000..c79548e Binary files /dev/null and b/asset/icon/Icon32/emotion_sure.png differ diff --git a/asset/icon/Icon32/emotion_surrender.png b/asset/icon/Icon32/emotion_surrender.png new file mode 100644 index 0000000..9a1dd69 Binary files /dev/null and b/asset/icon/Icon32/emotion_surrender.png differ diff --git a/asset/icon/Icon32/emotion_sweat.png b/asset/icon/Icon32/emotion_sweat.png new file mode 100644 index 0000000..739fd16 Binary files /dev/null and b/asset/icon/Icon32/emotion_sweat.png differ diff --git a/asset/icon/Icon32/emotion_terminator.png b/asset/icon/Icon32/emotion_terminator.png new file mode 100644 index 0000000..7d5d2a3 Binary files /dev/null and b/asset/icon/Icon32/emotion_terminator.png differ diff --git a/asset/icon/Icon32/emotion_tire.png b/asset/icon/Icon32/emotion_tire.png new file mode 100644 index 0000000..35fbeeb Binary files /dev/null and b/asset/icon/Icon32/emotion_tire.png differ diff --git a/asset/icon/Icon32/emotion_tomato.png b/asset/icon/Icon32/emotion_tomato.png new file mode 100644 index 0000000..2157f8f Binary files /dev/null and b/asset/icon/Icon32/emotion_tomato.png differ diff --git a/asset/icon/Icon32/emotion_tongue.png b/asset/icon/Icon32/emotion_tongue.png new file mode 100644 index 0000000..d728e8e Binary files /dev/null and b/asset/icon/Icon32/emotion_tongue.png differ diff --git a/asset/icon/Icon32/emotion_too_sad.png b/asset/icon/Icon32/emotion_too_sad.png new file mode 100644 index 0000000..61e27bb Binary files /dev/null and b/asset/icon/Icon32/emotion_too_sad.png differ diff --git a/asset/icon/Icon32/emotion_umbrella.png b/asset/icon/Icon32/emotion_umbrella.png new file mode 100644 index 0000000..3905239 Binary files /dev/null and b/asset/icon/Icon32/emotion_umbrella.png differ diff --git a/asset/icon/Icon32/emotion_unbelievable.png b/asset/icon/Icon32/emotion_unbelievable.png new file mode 100644 index 0000000..2e8c99b Binary files /dev/null and b/asset/icon/Icon32/emotion_unbelievable.png differ diff --git a/asset/icon/Icon32/emotion_unhappy(2).png b/asset/icon/Icon32/emotion_unhappy(2).png new file mode 100644 index 0000000..bb8416e Binary files /dev/null and b/asset/icon/Icon32/emotion_unhappy(2).png differ diff --git a/asset/icon/Icon32/emotion_unhappy.png b/asset/icon/Icon32/emotion_unhappy.png new file mode 100644 index 0000000..d67e0f7 Binary files /dev/null and b/asset/icon/Icon32/emotion_unhappy.png differ diff --git a/asset/icon/Icon32/emotion_unshaven.png b/asset/icon/Icon32/emotion_unshaven.png new file mode 100644 index 0000000..e5c40b4 Binary files /dev/null and b/asset/icon/Icon32/emotion_unshaven.png differ diff --git a/asset/icon/Icon32/emotion_vampire.png b/asset/icon/Icon32/emotion_vampire.png new file mode 100644 index 0000000..a432b91 Binary files /dev/null and b/asset/icon/Icon32/emotion_vampire.png differ diff --git a/asset/icon/Icon32/emotion_victory.png b/asset/icon/Icon32/emotion_victory.png new file mode 100644 index 0000000..ba91d31 Binary files /dev/null and b/asset/icon/Icon32/emotion_victory.png differ diff --git a/asset/icon/Icon32/emotion_viking.png b/asset/icon/Icon32/emotion_viking.png new file mode 100644 index 0000000..5a0842b Binary files /dev/null and b/asset/icon/Icon32/emotion_viking.png differ diff --git a/asset/icon/Icon32/emotion_waaaht.png b/asset/icon/Icon32/emotion_waaaht.png new file mode 100644 index 0000000..a693614 Binary files /dev/null and b/asset/icon/Icon32/emotion_waaaht.png differ diff --git a/asset/icon/Icon32/emotion_waii.png b/asset/icon/Icon32/emotion_waii.png new file mode 100644 index 0000000..9e7d47f Binary files /dev/null and b/asset/icon/Icon32/emotion_waii.png differ diff --git a/asset/icon/Icon32/emotion_watermelon.png b/asset/icon/Icon32/emotion_watermelon.png new file mode 100644 index 0000000..6abc1e2 Binary files /dev/null and b/asset/icon/Icon32/emotion_watermelon.png differ diff --git a/asset/icon/Icon32/emotion_what.png b/asset/icon/Icon32/emotion_what.png new file mode 100644 index 0000000..fe69f38 Binary files /dev/null and b/asset/icon/Icon32/emotion_what.png differ diff --git a/asset/icon/Icon32/emotion_whew.png b/asset/icon/Icon32/emotion_whew.png new file mode 100644 index 0000000..f995c4c Binary files /dev/null and b/asset/icon/Icon32/emotion_whew.png differ diff --git a/asset/icon/Icon32/emotion_whist.png b/asset/icon/Icon32/emotion_whist.png new file mode 100644 index 0000000..fd996ba Binary files /dev/null and b/asset/icon/Icon32/emotion_whist.png differ diff --git a/asset/icon/Icon32/emotion_wink.png b/asset/icon/Icon32/emotion_wink.png new file mode 100644 index 0000000..87f3dfc Binary files /dev/null and b/asset/icon/Icon32/emotion_wink.png differ diff --git a/asset/icon/Icon32/emotion_yuush.png b/asset/icon/Icon32/emotion_yuush.png new file mode 100644 index 0000000..776f029 Binary files /dev/null and b/asset/icon/Icon32/emotion_yuush.png differ diff --git a/asset/icon/Icon32/emotion_zedz.png b/asset/icon/Icon32/emotion_zedz.png new file mode 100644 index 0000000..5a80463 Binary files /dev/null and b/asset/icon/Icon32/emotion_zedz.png differ diff --git a/asset/icon/Icon32/emotion_zingy.png b/asset/icon/Icon32/emotion_zingy.png new file mode 100644 index 0000000..2541956 Binary files /dev/null and b/asset/icon/Icon32/emotion_zingy.png differ diff --git a/asset/icon/Icon32/entity.png b/asset/icon/Icon32/entity.png new file mode 100644 index 0000000..dd0395d Binary files /dev/null and b/asset/icon/Icon32/entity.png differ diff --git a/asset/icon/Icon32/envelope.png b/asset/icon/Icon32/envelope.png new file mode 100644 index 0000000..6ba2686 Binary files /dev/null and b/asset/icon/Icon32/envelope.png differ diff --git a/asset/icon/Icon32/envelope_string.png b/asset/icon/Icon32/envelope_string.png new file mode 100644 index 0000000..25f46fd Binary files /dev/null and b/asset/icon/Icon32/envelope_string.png differ diff --git a/asset/icon/Icon32/envelopes.png b/asset/icon/Icon32/envelopes.png new file mode 100644 index 0000000..952fe13 Binary files /dev/null and b/asset/icon/Icon32/envelopes.png differ diff --git a/asset/icon/Icon32/error.png b/asset/icon/Icon32/error.png new file mode 100644 index 0000000..14776e2 Binary files /dev/null and b/asset/icon/Icon32/error.png differ diff --git a/asset/icon/Icon32/error_add.png b/asset/icon/Icon32/error_add.png new file mode 100644 index 0000000..18427a7 Binary files /dev/null and b/asset/icon/Icon32/error_add.png differ diff --git a/asset/icon/Icon32/error_checking.png b/asset/icon/Icon32/error_checking.png new file mode 100644 index 0000000..3af3af2 Binary files /dev/null and b/asset/icon/Icon32/error_checking.png differ diff --git a/asset/icon/Icon32/error_delete.png b/asset/icon/Icon32/error_delete.png new file mode 100644 index 0000000..43e1142 Binary files /dev/null and b/asset/icon/Icon32/error_delete.png differ diff --git a/asset/icon/Icon32/error_go.png b/asset/icon/Icon32/error_go.png new file mode 100644 index 0000000..7edfa42 Binary files /dev/null and b/asset/icon/Icon32/error_go.png differ diff --git a/asset/icon/Icon32/error_log.png b/asset/icon/Icon32/error_log.png new file mode 100644 index 0000000..041f8eb Binary files /dev/null and b/asset/icon/Icon32/error_log.png differ diff --git a/asset/icon/Icon32/error_pages.png b/asset/icon/Icon32/error_pages.png new file mode 100644 index 0000000..8287048 Binary files /dev/null and b/asset/icon/Icon32/error_pages.png differ diff --git a/asset/icon/Icon32/escimo_pie.png b/asset/icon/Icon32/escimo_pie.png new file mode 100644 index 0000000..4b8a71f Binary files /dev/null and b/asset/icon/Icon32/escimo_pie.png differ diff --git a/asset/icon/Icon32/evacuator.png b/asset/icon/Icon32/evacuator.png new file mode 100644 index 0000000..80a7aac Binary files /dev/null and b/asset/icon/Icon32/evacuator.png differ diff --git a/asset/icon/Icon32/evaluate_formula.png b/asset/icon/Icon32/evaluate_formula.png new file mode 100644 index 0000000..6496356 Binary files /dev/null and b/asset/icon/Icon32/evaluate_formula.png differ diff --git a/asset/icon/Icon32/events.png b/asset/icon/Icon32/events.png new file mode 100644 index 0000000..37d785c Binary files /dev/null and b/asset/icon/Icon32/events.png differ diff --git a/asset/icon/Icon32/evernote.png b/asset/icon/Icon32/evernote.png new file mode 100644 index 0000000..a1d847b Binary files /dev/null and b/asset/icon/Icon32/evernote.png differ diff --git a/asset/icon/Icon32/excel_exports.png b/asset/icon/Icon32/excel_exports.png new file mode 100644 index 0000000..6e42fa9 Binary files /dev/null and b/asset/icon/Icon32/excel_exports.png differ diff --git a/asset/icon/Icon32/excel_imports.png b/asset/icon/Icon32/excel_imports.png new file mode 100644 index 0000000..4c9b8ce Binary files /dev/null and b/asset/icon/Icon32/excel_imports.png differ diff --git a/asset/icon/Icon32/exclamation.png b/asset/icon/Icon32/exclamation.png new file mode 100644 index 0000000..8270104 Binary files /dev/null and b/asset/icon/Icon32/exclamation.png differ diff --git a/asset/icon/Icon32/export_excel.png b/asset/icon/Icon32/export_excel.png new file mode 100644 index 0000000..b749c03 Binary files /dev/null and b/asset/icon/Icon32/export_excel.png differ diff --git a/asset/icon/Icon32/external.png b/asset/icon/Icon32/external.png new file mode 100644 index 0000000..4774edd Binary files /dev/null and b/asset/icon/Icon32/external.png differ diff --git a/asset/icon/Icon32/extract_foreground_objects.png b/asset/icon/Icon32/extract_foreground_objects.png new file mode 100644 index 0000000..20cb991 Binary files /dev/null and b/asset/icon/Icon32/extract_foreground_objects.png differ diff --git a/asset/icon/Icon32/eye.png b/asset/icon/Icon32/eye.png new file mode 100644 index 0000000..72edb6b Binary files /dev/null and b/asset/icon/Icon32/eye.png differ diff --git a/asset/icon/Icon32/eye_close.png b/asset/icon/Icon32/eye_close.png new file mode 100644 index 0000000..d3f5b2c Binary files /dev/null and b/asset/icon/Icon32/eye_close.png differ diff --git a/asset/icon/Icon32/eye_half.png b/asset/icon/Icon32/eye_half.png new file mode 100644 index 0000000..b65b51d Binary files /dev/null and b/asset/icon/Icon32/eye_half.png differ diff --git a/asset/icon/Icon32/eye_red.png b/asset/icon/Icon32/eye_red.png new file mode 100644 index 0000000..8584627 Binary files /dev/null and b/asset/icon/Icon32/eye_red.png differ diff --git a/asset/icon/Icon32/faberge_egg.png b/asset/icon/Icon32/faberge_egg.png new file mode 100644 index 0000000..47e3e7b Binary files /dev/null and b/asset/icon/Icon32/faberge_egg.png differ diff --git a/asset/icon/Icon32/facebook.png b/asset/icon/Icon32/facebook.png new file mode 100644 index 0000000..930647b Binary files /dev/null and b/asset/icon/Icon32/facebook.png differ diff --git a/asset/icon/Icon32/factory.png b/asset/icon/Icon32/factory.png new file mode 100644 index 0000000..5326714 Binary files /dev/null and b/asset/icon/Icon32/factory.png differ diff --git a/asset/icon/Icon32/fatcow.png b/asset/icon/Icon32/fatcow.png new file mode 100644 index 0000000..7f38826 Binary files /dev/null and b/asset/icon/Icon32/fatcow.png differ diff --git a/asset/icon/Icon32/fax.png b/asset/icon/Icon32/fax.png new file mode 100644 index 0000000..79d9c30 Binary files /dev/null and b/asset/icon/Icon32/fax.png differ diff --git a/asset/icon/Icon32/fedora.png b/asset/icon/Icon32/fedora.png new file mode 100644 index 0000000..f0eba39 Binary files /dev/null and b/asset/icon/Icon32/fedora.png differ diff --git a/asset/icon/Icon32/feed.png b/asset/icon/Icon32/feed.png new file mode 100644 index 0000000..d69fc40 Binary files /dev/null and b/asset/icon/Icon32/feed.png differ diff --git a/asset/icon/Icon32/feed_add.png b/asset/icon/Icon32/feed_add.png new file mode 100644 index 0000000..1fcce0f Binary files /dev/null and b/asset/icon/Icon32/feed_add.png differ diff --git a/asset/icon/Icon32/feed_delete.png b/asset/icon/Icon32/feed_delete.png new file mode 100644 index 0000000..b268b82 Binary files /dev/null and b/asset/icon/Icon32/feed_delete.png differ diff --git a/asset/icon/Icon32/feed_disk.png b/asset/icon/Icon32/feed_disk.png new file mode 100644 index 0000000..40528c2 Binary files /dev/null and b/asset/icon/Icon32/feed_disk.png differ diff --git a/asset/icon/Icon32/feed_edit.png b/asset/icon/Icon32/feed_edit.png new file mode 100644 index 0000000..c78e880 Binary files /dev/null and b/asset/icon/Icon32/feed_edit.png differ diff --git a/asset/icon/Icon32/feed_error.png b/asset/icon/Icon32/feed_error.png new file mode 100644 index 0000000..f33eb5e Binary files /dev/null and b/asset/icon/Icon32/feed_error.png differ diff --git a/asset/icon/Icon32/feed_go.png b/asset/icon/Icon32/feed_go.png new file mode 100644 index 0000000..d7891f0 Binary files /dev/null and b/asset/icon/Icon32/feed_go.png differ diff --git a/asset/icon/Icon32/feed_key.png b/asset/icon/Icon32/feed_key.png new file mode 100644 index 0000000..00945b0 Binary files /dev/null and b/asset/icon/Icon32/feed_key.png differ diff --git a/asset/icon/Icon32/feed_magnify.png b/asset/icon/Icon32/feed_magnify.png new file mode 100644 index 0000000..4aca033 Binary files /dev/null and b/asset/icon/Icon32/feed_magnify.png differ diff --git a/asset/icon/Icon32/female.png b/asset/icon/Icon32/female.png new file mode 100644 index 0000000..f2b1bc9 Binary files /dev/null and b/asset/icon/Icon32/female.png differ diff --git a/asset/icon/Icon32/field_size.png b/asset/icon/Icon32/field_size.png new file mode 100644 index 0000000..5dd3758 Binary files /dev/null and b/asset/icon/Icon32/field_size.png differ diff --git a/asset/icon/Icon32/file_extension_3gp.png b/asset/icon/Icon32/file_extension_3gp.png new file mode 100644 index 0000000..35a05dd Binary files /dev/null and b/asset/icon/Icon32/file_extension_3gp.png differ diff --git a/asset/icon/Icon32/file_extension_7z.png b/asset/icon/Icon32/file_extension_7z.png new file mode 100644 index 0000000..5ed205b Binary files /dev/null and b/asset/icon/Icon32/file_extension_7z.png differ diff --git a/asset/icon/Icon32/file_extension_ace.png b/asset/icon/Icon32/file_extension_ace.png new file mode 100644 index 0000000..799604d Binary files /dev/null and b/asset/icon/Icon32/file_extension_ace.png differ diff --git a/asset/icon/Icon32/file_extension_ai.png b/asset/icon/Icon32/file_extension_ai.png new file mode 100644 index 0000000..078057f Binary files /dev/null and b/asset/icon/Icon32/file_extension_ai.png differ diff --git a/asset/icon/Icon32/file_extension_aif.png b/asset/icon/Icon32/file_extension_aif.png new file mode 100644 index 0000000..02ba441 Binary files /dev/null and b/asset/icon/Icon32/file_extension_aif.png differ diff --git a/asset/icon/Icon32/file_extension_aiff.png b/asset/icon/Icon32/file_extension_aiff.png new file mode 100644 index 0000000..45f6c27 Binary files /dev/null and b/asset/icon/Icon32/file_extension_aiff.png differ diff --git a/asset/icon/Icon32/file_extension_amr.png b/asset/icon/Icon32/file_extension_amr.png new file mode 100644 index 0000000..4c30c8c Binary files /dev/null and b/asset/icon/Icon32/file_extension_amr.png differ diff --git a/asset/icon/Icon32/file_extension_asf.png b/asset/icon/Icon32/file_extension_asf.png new file mode 100644 index 0000000..f65286f Binary files /dev/null and b/asset/icon/Icon32/file_extension_asf.png differ diff --git a/asset/icon/Icon32/file_extension_asx.png b/asset/icon/Icon32/file_extension_asx.png new file mode 100644 index 0000000..9ac440b Binary files /dev/null and b/asset/icon/Icon32/file_extension_asx.png differ diff --git a/asset/icon/Icon32/file_extension_bat.png b/asset/icon/Icon32/file_extension_bat.png new file mode 100644 index 0000000..ba72c7f Binary files /dev/null and b/asset/icon/Icon32/file_extension_bat.png differ diff --git a/asset/icon/Icon32/file_extension_bin.png b/asset/icon/Icon32/file_extension_bin.png new file mode 100644 index 0000000..adc7af3 Binary files /dev/null and b/asset/icon/Icon32/file_extension_bin.png differ diff --git a/asset/icon/Icon32/file_extension_bmp.png b/asset/icon/Icon32/file_extension_bmp.png new file mode 100644 index 0000000..485cde8 Binary files /dev/null and b/asset/icon/Icon32/file_extension_bmp.png differ diff --git a/asset/icon/Icon32/file_extension_bup.png b/asset/icon/Icon32/file_extension_bup.png new file mode 100644 index 0000000..5e25354 Binary files /dev/null and b/asset/icon/Icon32/file_extension_bup.png differ diff --git a/asset/icon/Icon32/file_extension_cab.png b/asset/icon/Icon32/file_extension_cab.png new file mode 100644 index 0000000..0e19a97 Binary files /dev/null and b/asset/icon/Icon32/file_extension_cab.png differ diff --git a/asset/icon/Icon32/file_extension_cbr.png b/asset/icon/Icon32/file_extension_cbr.png new file mode 100644 index 0000000..37d886a Binary files /dev/null and b/asset/icon/Icon32/file_extension_cbr.png differ diff --git a/asset/icon/Icon32/file_extension_cda.png b/asset/icon/Icon32/file_extension_cda.png new file mode 100644 index 0000000..c50b751 Binary files /dev/null and b/asset/icon/Icon32/file_extension_cda.png differ diff --git a/asset/icon/Icon32/file_extension_cdl.png b/asset/icon/Icon32/file_extension_cdl.png new file mode 100644 index 0000000..cb57905 Binary files /dev/null and b/asset/icon/Icon32/file_extension_cdl.png differ diff --git a/asset/icon/Icon32/file_extension_cdr.png b/asset/icon/Icon32/file_extension_cdr.png new file mode 100644 index 0000000..d6def9e Binary files /dev/null and b/asset/icon/Icon32/file_extension_cdr.png differ diff --git a/asset/icon/Icon32/file_extension_chm.png b/asset/icon/Icon32/file_extension_chm.png new file mode 100644 index 0000000..7a99361 Binary files /dev/null and b/asset/icon/Icon32/file_extension_chm.png differ diff --git a/asset/icon/Icon32/file_extension_dat.png b/asset/icon/Icon32/file_extension_dat.png new file mode 100644 index 0000000..9567f6a Binary files /dev/null and b/asset/icon/Icon32/file_extension_dat.png differ diff --git a/asset/icon/Icon32/file_extension_divx.png b/asset/icon/Icon32/file_extension_divx.png new file mode 100644 index 0000000..99cb983 Binary files /dev/null and b/asset/icon/Icon32/file_extension_divx.png differ diff --git a/asset/icon/Icon32/file_extension_dll.png b/asset/icon/Icon32/file_extension_dll.png new file mode 100644 index 0000000..7ac35c9 Binary files /dev/null and b/asset/icon/Icon32/file_extension_dll.png differ diff --git a/asset/icon/Icon32/file_extension_dmg.png b/asset/icon/Icon32/file_extension_dmg.png new file mode 100644 index 0000000..a2c644b Binary files /dev/null and b/asset/icon/Icon32/file_extension_dmg.png differ diff --git a/asset/icon/Icon32/file_extension_doc.png b/asset/icon/Icon32/file_extension_doc.png new file mode 100644 index 0000000..8738d2e Binary files /dev/null and b/asset/icon/Icon32/file_extension_doc.png differ diff --git a/asset/icon/Icon32/file_extension_dss.png b/asset/icon/Icon32/file_extension_dss.png new file mode 100644 index 0000000..d51df3c Binary files /dev/null and b/asset/icon/Icon32/file_extension_dss.png differ diff --git a/asset/icon/Icon32/file_extension_dvf.png b/asset/icon/Icon32/file_extension_dvf.png new file mode 100644 index 0000000..62bbb95 Binary files /dev/null and b/asset/icon/Icon32/file_extension_dvf.png differ diff --git a/asset/icon/Icon32/file_extension_dwg.png b/asset/icon/Icon32/file_extension_dwg.png new file mode 100644 index 0000000..0199681 Binary files /dev/null and b/asset/icon/Icon32/file_extension_dwg.png differ diff --git a/asset/icon/Icon32/file_extension_eml.png b/asset/icon/Icon32/file_extension_eml.png new file mode 100644 index 0000000..6c973fc Binary files /dev/null and b/asset/icon/Icon32/file_extension_eml.png differ diff --git a/asset/icon/Icon32/file_extension_eps.png b/asset/icon/Icon32/file_extension_eps.png new file mode 100644 index 0000000..009582c Binary files /dev/null and b/asset/icon/Icon32/file_extension_eps.png differ diff --git a/asset/icon/Icon32/file_extension_exe.png b/asset/icon/Icon32/file_extension_exe.png new file mode 100644 index 0000000..c9cec75 Binary files /dev/null and b/asset/icon/Icon32/file_extension_exe.png differ diff --git a/asset/icon/Icon32/file_extension_fla.png b/asset/icon/Icon32/file_extension_fla.png new file mode 100644 index 0000000..648b1d0 Binary files /dev/null and b/asset/icon/Icon32/file_extension_fla.png differ diff --git a/asset/icon/Icon32/file_extension_flv.png b/asset/icon/Icon32/file_extension_flv.png new file mode 100644 index 0000000..ccc1eb7 Binary files /dev/null and b/asset/icon/Icon32/file_extension_flv.png differ diff --git a/asset/icon/Icon32/file_extension_gif.png b/asset/icon/Icon32/file_extension_gif.png new file mode 100644 index 0000000..b1aa6c3 Binary files /dev/null and b/asset/icon/Icon32/file_extension_gif.png differ diff --git a/asset/icon/Icon32/file_extension_gz.png b/asset/icon/Icon32/file_extension_gz.png new file mode 100644 index 0000000..d4517e1 Binary files /dev/null and b/asset/icon/Icon32/file_extension_gz.png differ diff --git a/asset/icon/Icon32/file_extension_hqx.png b/asset/icon/Icon32/file_extension_hqx.png new file mode 100644 index 0000000..ae7cc06 Binary files /dev/null and b/asset/icon/Icon32/file_extension_hqx.png differ diff --git a/asset/icon/Icon32/file_extension_htm.png b/asset/icon/Icon32/file_extension_htm.png new file mode 100644 index 0000000..061ff46 Binary files /dev/null and b/asset/icon/Icon32/file_extension_htm.png differ diff --git a/asset/icon/Icon32/file_extension_html.png b/asset/icon/Icon32/file_extension_html.png new file mode 100644 index 0000000..d86548c Binary files /dev/null and b/asset/icon/Icon32/file_extension_html.png differ diff --git a/asset/icon/Icon32/file_extension_ifo.png b/asset/icon/Icon32/file_extension_ifo.png new file mode 100644 index 0000000..89b0166 Binary files /dev/null and b/asset/icon/Icon32/file_extension_ifo.png differ diff --git a/asset/icon/Icon32/file_extension_indd.png b/asset/icon/Icon32/file_extension_indd.png new file mode 100644 index 0000000..0cbaadc Binary files /dev/null and b/asset/icon/Icon32/file_extension_indd.png differ diff --git a/asset/icon/Icon32/file_extension_iso.png b/asset/icon/Icon32/file_extension_iso.png new file mode 100644 index 0000000..e8df06d Binary files /dev/null and b/asset/icon/Icon32/file_extension_iso.png differ diff --git a/asset/icon/Icon32/file_extension_jar.png b/asset/icon/Icon32/file_extension_jar.png new file mode 100644 index 0000000..383aea4 Binary files /dev/null and b/asset/icon/Icon32/file_extension_jar.png differ diff --git a/asset/icon/Icon32/file_extension_jpeg.png b/asset/icon/Icon32/file_extension_jpeg.png new file mode 100644 index 0000000..68e38ab Binary files /dev/null and b/asset/icon/Icon32/file_extension_jpeg.png differ diff --git a/asset/icon/Icon32/file_extension_jpg.png b/asset/icon/Icon32/file_extension_jpg.png new file mode 100644 index 0000000..39be818 Binary files /dev/null and b/asset/icon/Icon32/file_extension_jpg.png differ diff --git a/asset/icon/Icon32/file_extension_lnk.png b/asset/icon/Icon32/file_extension_lnk.png new file mode 100644 index 0000000..2b05f43 Binary files /dev/null and b/asset/icon/Icon32/file_extension_lnk.png differ diff --git a/asset/icon/Icon32/file_extension_log.png b/asset/icon/Icon32/file_extension_log.png new file mode 100644 index 0000000..bc99e85 Binary files /dev/null and b/asset/icon/Icon32/file_extension_log.png differ diff --git a/asset/icon/Icon32/file_extension_m4a.png b/asset/icon/Icon32/file_extension_m4a.png new file mode 100644 index 0000000..d7c86c3 Binary files /dev/null and b/asset/icon/Icon32/file_extension_m4a.png differ diff --git a/asset/icon/Icon32/file_extension_m4b.png b/asset/icon/Icon32/file_extension_m4b.png new file mode 100644 index 0000000..8a73d4e Binary files /dev/null and b/asset/icon/Icon32/file_extension_m4b.png differ diff --git a/asset/icon/Icon32/file_extension_m4p.png b/asset/icon/Icon32/file_extension_m4p.png new file mode 100644 index 0000000..f9d90b9 Binary files /dev/null and b/asset/icon/Icon32/file_extension_m4p.png differ diff --git a/asset/icon/Icon32/file_extension_m4v.png b/asset/icon/Icon32/file_extension_m4v.png new file mode 100644 index 0000000..c7b0b1f Binary files /dev/null and b/asset/icon/Icon32/file_extension_m4v.png differ diff --git a/asset/icon/Icon32/file_extension_mcd.png b/asset/icon/Icon32/file_extension_mcd.png new file mode 100644 index 0000000..c268b87 Binary files /dev/null and b/asset/icon/Icon32/file_extension_mcd.png differ diff --git a/asset/icon/Icon32/file_extension_mdb.png b/asset/icon/Icon32/file_extension_mdb.png new file mode 100644 index 0000000..7b7b836 Binary files /dev/null and b/asset/icon/Icon32/file_extension_mdb.png differ diff --git a/asset/icon/Icon32/file_extension_mid.png b/asset/icon/Icon32/file_extension_mid.png new file mode 100644 index 0000000..4d3e482 Binary files /dev/null and b/asset/icon/Icon32/file_extension_mid.png differ diff --git a/asset/icon/Icon32/file_extension_mov.png b/asset/icon/Icon32/file_extension_mov.png new file mode 100644 index 0000000..6a91865 Binary files /dev/null and b/asset/icon/Icon32/file_extension_mov.png differ diff --git a/asset/icon/Icon32/file_extension_mp2.png b/asset/icon/Icon32/file_extension_mp2.png new file mode 100644 index 0000000..bbc5f04 Binary files /dev/null and b/asset/icon/Icon32/file_extension_mp2.png differ diff --git a/asset/icon/Icon32/file_extension_mp4.png b/asset/icon/Icon32/file_extension_mp4.png new file mode 100644 index 0000000..caa154c Binary files /dev/null and b/asset/icon/Icon32/file_extension_mp4.png differ diff --git a/asset/icon/Icon32/file_extension_mpeg.png b/asset/icon/Icon32/file_extension_mpeg.png new file mode 100644 index 0000000..81994a2 Binary files /dev/null and b/asset/icon/Icon32/file_extension_mpeg.png differ diff --git a/asset/icon/Icon32/file_extension_mpg.png b/asset/icon/Icon32/file_extension_mpg.png new file mode 100644 index 0000000..948b643 Binary files /dev/null and b/asset/icon/Icon32/file_extension_mpg.png differ diff --git a/asset/icon/Icon32/file_extension_msi.png b/asset/icon/Icon32/file_extension_msi.png new file mode 100644 index 0000000..97a8a3b Binary files /dev/null and b/asset/icon/Icon32/file_extension_msi.png differ diff --git a/asset/icon/Icon32/file_extension_mswmm.png b/asset/icon/Icon32/file_extension_mswmm.png new file mode 100644 index 0000000..d70aaa7 Binary files /dev/null and b/asset/icon/Icon32/file_extension_mswmm.png differ diff --git a/asset/icon/Icon32/file_extension_ogg.png b/asset/icon/Icon32/file_extension_ogg.png new file mode 100644 index 0000000..a6b55f6 Binary files /dev/null and b/asset/icon/Icon32/file_extension_ogg.png differ diff --git a/asset/icon/Icon32/file_extension_pdf.png b/asset/icon/Icon32/file_extension_pdf.png new file mode 100644 index 0000000..04423b4 Binary files /dev/null and b/asset/icon/Icon32/file_extension_pdf.png differ diff --git a/asset/icon/Icon32/file_extension_png.png b/asset/icon/Icon32/file_extension_png.png new file mode 100644 index 0000000..76230d3 Binary files /dev/null and b/asset/icon/Icon32/file_extension_png.png differ diff --git a/asset/icon/Icon32/file_extension_pps.png b/asset/icon/Icon32/file_extension_pps.png new file mode 100644 index 0000000..44a2d2c Binary files /dev/null and b/asset/icon/Icon32/file_extension_pps.png differ diff --git a/asset/icon/Icon32/file_extension_ps.png b/asset/icon/Icon32/file_extension_ps.png new file mode 100644 index 0000000..0e4b20a Binary files /dev/null and b/asset/icon/Icon32/file_extension_ps.png differ diff --git a/asset/icon/Icon32/file_extension_psd.png b/asset/icon/Icon32/file_extension_psd.png new file mode 100644 index 0000000..b98ff86 Binary files /dev/null and b/asset/icon/Icon32/file_extension_psd.png differ diff --git a/asset/icon/Icon32/file_extension_pst.png b/asset/icon/Icon32/file_extension_pst.png new file mode 100644 index 0000000..4f5f61f Binary files /dev/null and b/asset/icon/Icon32/file_extension_pst.png differ diff --git a/asset/icon/Icon32/file_extension_ptb.png b/asset/icon/Icon32/file_extension_ptb.png new file mode 100644 index 0000000..a3568dd Binary files /dev/null and b/asset/icon/Icon32/file_extension_ptb.png differ diff --git a/asset/icon/Icon32/file_extension_pub.png b/asset/icon/Icon32/file_extension_pub.png new file mode 100644 index 0000000..4a71c01 Binary files /dev/null and b/asset/icon/Icon32/file_extension_pub.png differ diff --git a/asset/icon/Icon32/file_extension_qbb.png b/asset/icon/Icon32/file_extension_qbb.png new file mode 100644 index 0000000..24fc0ae Binary files /dev/null and b/asset/icon/Icon32/file_extension_qbb.png differ diff --git a/asset/icon/Icon32/file_extension_qbw.png b/asset/icon/Icon32/file_extension_qbw.png new file mode 100644 index 0000000..162b0fb Binary files /dev/null and b/asset/icon/Icon32/file_extension_qbw.png differ diff --git a/asset/icon/Icon32/file_extension_qxd.png b/asset/icon/Icon32/file_extension_qxd.png new file mode 100644 index 0000000..f5e46cf Binary files /dev/null and b/asset/icon/Icon32/file_extension_qxd.png differ diff --git a/asset/icon/Icon32/file_extension_ram.png b/asset/icon/Icon32/file_extension_ram.png new file mode 100644 index 0000000..a55ba84 Binary files /dev/null and b/asset/icon/Icon32/file_extension_ram.png differ diff --git a/asset/icon/Icon32/file_extension_rar.png b/asset/icon/Icon32/file_extension_rar.png new file mode 100644 index 0000000..934f182 Binary files /dev/null and b/asset/icon/Icon32/file_extension_rar.png differ diff --git a/asset/icon/Icon32/file_extension_rm.png b/asset/icon/Icon32/file_extension_rm.png new file mode 100644 index 0000000..639e180 Binary files /dev/null and b/asset/icon/Icon32/file_extension_rm.png differ diff --git a/asset/icon/Icon32/file_extension_rmvb.png b/asset/icon/Icon32/file_extension_rmvb.png new file mode 100644 index 0000000..362ffdf Binary files /dev/null and b/asset/icon/Icon32/file_extension_rmvb.png differ diff --git a/asset/icon/Icon32/file_extension_rtf.png b/asset/icon/Icon32/file_extension_rtf.png new file mode 100644 index 0000000..cae2c95 Binary files /dev/null and b/asset/icon/Icon32/file_extension_rtf.png differ diff --git a/asset/icon/Icon32/file_extension_sea.png b/asset/icon/Icon32/file_extension_sea.png new file mode 100644 index 0000000..d9906e2 Binary files /dev/null and b/asset/icon/Icon32/file_extension_sea.png differ diff --git a/asset/icon/Icon32/file_extension_ses.png b/asset/icon/Icon32/file_extension_ses.png new file mode 100644 index 0000000..b62459b Binary files /dev/null and b/asset/icon/Icon32/file_extension_ses.png differ diff --git a/asset/icon/Icon32/file_extension_sit.png b/asset/icon/Icon32/file_extension_sit.png new file mode 100644 index 0000000..629270d Binary files /dev/null and b/asset/icon/Icon32/file_extension_sit.png differ diff --git a/asset/icon/Icon32/file_extension_sitx.png b/asset/icon/Icon32/file_extension_sitx.png new file mode 100644 index 0000000..4c7a085 Binary files /dev/null and b/asset/icon/Icon32/file_extension_sitx.png differ diff --git a/asset/icon/Icon32/file_extension_ss.png b/asset/icon/Icon32/file_extension_ss.png new file mode 100644 index 0000000..a3a1dbc Binary files /dev/null and b/asset/icon/Icon32/file_extension_ss.png differ diff --git a/asset/icon/Icon32/file_extension_swf.png b/asset/icon/Icon32/file_extension_swf.png new file mode 100644 index 0000000..3de3713 Binary files /dev/null and b/asset/icon/Icon32/file_extension_swf.png differ diff --git a/asset/icon/Icon32/file_extension_tgz.png b/asset/icon/Icon32/file_extension_tgz.png new file mode 100644 index 0000000..b896b27 Binary files /dev/null and b/asset/icon/Icon32/file_extension_tgz.png differ diff --git a/asset/icon/Icon32/file_extension_thm.png b/asset/icon/Icon32/file_extension_thm.png new file mode 100644 index 0000000..0f6bbae Binary files /dev/null and b/asset/icon/Icon32/file_extension_thm.png differ diff --git a/asset/icon/Icon32/file_extension_tif.png b/asset/icon/Icon32/file_extension_tif.png new file mode 100644 index 0000000..c7d4da8 Binary files /dev/null and b/asset/icon/Icon32/file_extension_tif.png differ diff --git a/asset/icon/Icon32/file_extension_tmp.png b/asset/icon/Icon32/file_extension_tmp.png new file mode 100644 index 0000000..75e014e Binary files /dev/null and b/asset/icon/Icon32/file_extension_tmp.png differ diff --git a/asset/icon/Icon32/file_extension_torrent.png b/asset/icon/Icon32/file_extension_torrent.png new file mode 100644 index 0000000..6e8003c Binary files /dev/null and b/asset/icon/Icon32/file_extension_torrent.png differ diff --git a/asset/icon/Icon32/file_extension_ttf.png b/asset/icon/Icon32/file_extension_ttf.png new file mode 100644 index 0000000..dda399e Binary files /dev/null and b/asset/icon/Icon32/file_extension_ttf.png differ diff --git a/asset/icon/Icon32/file_extension_txt.png b/asset/icon/Icon32/file_extension_txt.png new file mode 100644 index 0000000..1e7c12f Binary files /dev/null and b/asset/icon/Icon32/file_extension_txt.png differ diff --git a/asset/icon/Icon32/file_extension_vcd.png b/asset/icon/Icon32/file_extension_vcd.png new file mode 100644 index 0000000..d066ecb Binary files /dev/null and b/asset/icon/Icon32/file_extension_vcd.png differ diff --git a/asset/icon/Icon32/file_extension_vob.png b/asset/icon/Icon32/file_extension_vob.png new file mode 100644 index 0000000..2de5bed Binary files /dev/null and b/asset/icon/Icon32/file_extension_vob.png differ diff --git a/asset/icon/Icon32/file_extension_wav.png b/asset/icon/Icon32/file_extension_wav.png new file mode 100644 index 0000000..a8d7b14 Binary files /dev/null and b/asset/icon/Icon32/file_extension_wav.png differ diff --git a/asset/icon/Icon32/file_extension_wma.png b/asset/icon/Icon32/file_extension_wma.png new file mode 100644 index 0000000..e699f0b Binary files /dev/null and b/asset/icon/Icon32/file_extension_wma.png differ diff --git a/asset/icon/Icon32/file_extension_wmv.png b/asset/icon/Icon32/file_extension_wmv.png new file mode 100644 index 0000000..98001f5 Binary files /dev/null and b/asset/icon/Icon32/file_extension_wmv.png differ diff --git a/asset/icon/Icon32/file_extension_wps.png b/asset/icon/Icon32/file_extension_wps.png new file mode 100644 index 0000000..0e7cbc0 Binary files /dev/null and b/asset/icon/Icon32/file_extension_wps.png differ diff --git a/asset/icon/Icon32/file_extension_xls.png b/asset/icon/Icon32/file_extension_xls.png new file mode 100644 index 0000000..4a394e5 Binary files /dev/null and b/asset/icon/Icon32/file_extension_xls.png differ diff --git a/asset/icon/Icon32/file_extension_xpi.png b/asset/icon/Icon32/file_extension_xpi.png new file mode 100644 index 0000000..4ff58d7 Binary files /dev/null and b/asset/icon/Icon32/file_extension_xpi.png differ diff --git a/asset/icon/Icon32/file_extension_zip.png b/asset/icon/Icon32/file_extension_zip.png new file mode 100644 index 0000000..3b1b54f Binary files /dev/null and b/asset/icon/Icon32/file_extension_zip.png differ diff --git a/asset/icon/Icon32/file_manager.png b/asset/icon/Icon32/file_manager.png new file mode 100644 index 0000000..cebd1dc Binary files /dev/null and b/asset/icon/Icon32/file_manager.png differ diff --git a/asset/icon/Icon32/fill.png b/asset/icon/Icon32/fill.png new file mode 100644 index 0000000..612bf54 Binary files /dev/null and b/asset/icon/Icon32/fill.png differ diff --git a/asset/icon/Icon32/fill_color.png b/asset/icon/Icon32/fill_color.png new file mode 100644 index 0000000..3257681 Binary files /dev/null and b/asset/icon/Icon32/fill_color.png differ diff --git a/asset/icon/Icon32/film.png b/asset/icon/Icon32/film.png new file mode 100644 index 0000000..70e5a68 Binary files /dev/null and b/asset/icon/Icon32/film.png differ diff --git a/asset/icon/Icon32/film_add.png b/asset/icon/Icon32/film_add.png new file mode 100644 index 0000000..28c17a8 Binary files /dev/null and b/asset/icon/Icon32/film_add.png differ diff --git a/asset/icon/Icon32/film_delete.png b/asset/icon/Icon32/film_delete.png new file mode 100644 index 0000000..5491a1a Binary files /dev/null and b/asset/icon/Icon32/film_delete.png differ diff --git a/asset/icon/Icon32/film_edit.png b/asset/icon/Icon32/film_edit.png new file mode 100644 index 0000000..01f52ad Binary files /dev/null and b/asset/icon/Icon32/film_edit.png differ diff --git a/asset/icon/Icon32/film_error.png b/asset/icon/Icon32/film_error.png new file mode 100644 index 0000000..f202a4b Binary files /dev/null and b/asset/icon/Icon32/film_error.png differ diff --git a/asset/icon/Icon32/film_go.png b/asset/icon/Icon32/film_go.png new file mode 100644 index 0000000..c61fb05 Binary files /dev/null and b/asset/icon/Icon32/film_go.png differ diff --git a/asset/icon/Icon32/film_key.png b/asset/icon/Icon32/film_key.png new file mode 100644 index 0000000..28fd088 Binary files /dev/null and b/asset/icon/Icon32/film_key.png differ diff --git a/asset/icon/Icon32/film_link.png b/asset/icon/Icon32/film_link.png new file mode 100644 index 0000000..f0896df Binary files /dev/null and b/asset/icon/Icon32/film_link.png differ diff --git a/asset/icon/Icon32/film_photo.png b/asset/icon/Icon32/film_photo.png new file mode 100644 index 0000000..01b3646 Binary files /dev/null and b/asset/icon/Icon32/film_photo.png differ diff --git a/asset/icon/Icon32/film_save.png b/asset/icon/Icon32/film_save.png new file mode 100644 index 0000000..3323fe8 Binary files /dev/null and b/asset/icon/Icon32/film_save.png differ diff --git a/asset/icon/Icon32/filter.png b/asset/icon/Icon32/filter.png new file mode 100644 index 0000000..dc486c4 Binary files /dev/null and b/asset/icon/Icon32/filter.png differ diff --git a/asset/icon/Icon32/filter_add.png b/asset/icon/Icon32/filter_add.png new file mode 100644 index 0000000..17928ce Binary files /dev/null and b/asset/icon/Icon32/filter_add.png differ diff --git a/asset/icon/Icon32/filter_advanced.png b/asset/icon/Icon32/filter_advanced.png new file mode 100644 index 0000000..a0bfc22 Binary files /dev/null and b/asset/icon/Icon32/filter_advanced.png differ diff --git a/asset/icon/Icon32/filter_clear.png b/asset/icon/Icon32/filter_clear.png new file mode 100644 index 0000000..a29aea6 Binary files /dev/null and b/asset/icon/Icon32/filter_clear.png differ diff --git a/asset/icon/Icon32/filter_delete.png b/asset/icon/Icon32/filter_delete.png new file mode 100644 index 0000000..65e2a5d Binary files /dev/null and b/asset/icon/Icon32/filter_delete.png differ diff --git a/asset/icon/Icon32/filter_reapply.png b/asset/icon/Icon32/filter_reapply.png new file mode 100644 index 0000000..84bbdd7 Binary files /dev/null and b/asset/icon/Icon32/filter_reapply.png differ diff --git a/asset/icon/Icon32/finance.png b/asset/icon/Icon32/finance.png new file mode 100644 index 0000000..9853354 Binary files /dev/null and b/asset/icon/Icon32/finance.png differ diff --git a/asset/icon/Icon32/financial_functions.png b/asset/icon/Icon32/financial_functions.png new file mode 100644 index 0000000..bbb9362 Binary files /dev/null and b/asset/icon/Icon32/financial_functions.png differ diff --git a/asset/icon/Icon32/find.png b/asset/icon/Icon32/find.png new file mode 100644 index 0000000..790c54a Binary files /dev/null and b/asset/icon/Icon32/find.png differ diff --git a/asset/icon/Icon32/fingerprint.png b/asset/icon/Icon32/fingerprint.png new file mode 100644 index 0000000..383cd4f Binary files /dev/null and b/asset/icon/Icon32/fingerprint.png differ diff --git a/asset/icon/Icon32/finish_and_merge.png b/asset/icon/Icon32/finish_and_merge.png new file mode 100644 index 0000000..70b2c50 Binary files /dev/null and b/asset/icon/Icon32/finish_and_merge.png differ diff --git a/asset/icon/Icon32/fire.png b/asset/icon/Icon32/fire.png new file mode 100644 index 0000000..93f9887 Binary files /dev/null and b/asset/icon/Icon32/fire.png differ diff --git a/asset/icon/Icon32/fire_damage.png b/asset/icon/Icon32/fire_damage.png new file mode 100644 index 0000000..ce6587c Binary files /dev/null and b/asset/icon/Icon32/fire_damage.png differ diff --git a/asset/icon/Icon32/fire_extinguisher.png b/asset/icon/Icon32/fire_extinguisher.png new file mode 100644 index 0000000..b453959 Binary files /dev/null and b/asset/icon/Icon32/fire_extinguisher.png differ diff --git a/asset/icon/Icon32/firefox.png b/asset/icon/Icon32/firefox.png new file mode 100644 index 0000000..b6bc272 Binary files /dev/null and b/asset/icon/Icon32/firefox.png differ diff --git a/asset/icon/Icon32/firewall.png b/asset/icon/Icon32/firewall.png new file mode 100644 index 0000000..79d98ea Binary files /dev/null and b/asset/icon/Icon32/firewall.png differ diff --git a/asset/icon/Icon32/firewall_burn.png b/asset/icon/Icon32/firewall_burn.png new file mode 100644 index 0000000..ec3d71b Binary files /dev/null and b/asset/icon/Icon32/firewall_burn.png differ diff --git a/asset/icon/Icon32/fishfinder.png b/asset/icon/Icon32/fishfinder.png new file mode 100644 index 0000000..59c12ae Binary files /dev/null and b/asset/icon/Icon32/fishfinder.png differ diff --git a/asset/icon/Icon32/flag_1.png b/asset/icon/Icon32/flag_1.png new file mode 100644 index 0000000..c93f2a3 Binary files /dev/null and b/asset/icon/Icon32/flag_1.png differ diff --git a/asset/icon/Icon32/flag_2.png b/asset/icon/Icon32/flag_2.png new file mode 100644 index 0000000..fe18853 Binary files /dev/null and b/asset/icon/Icon32/flag_2.png differ diff --git a/asset/icon/Icon32/flag_3.png b/asset/icon/Icon32/flag_3.png new file mode 100644 index 0000000..9825ca4 Binary files /dev/null and b/asset/icon/Icon32/flag_3.png differ diff --git a/asset/icon/Icon32/flag_afghanistan.png b/asset/icon/Icon32/flag_afghanistan.png new file mode 100644 index 0000000..b5e5093 Binary files /dev/null and b/asset/icon/Icon32/flag_afghanistan.png differ diff --git a/asset/icon/Icon32/flag_airfield_vehicle_safety.png b/asset/icon/Icon32/flag_airfield_vehicle_safety.png new file mode 100644 index 0000000..4bcc532 Binary files /dev/null and b/asset/icon/Icon32/flag_airfield_vehicle_safety.png differ diff --git a/asset/icon/Icon32/flag_albania.png b/asset/icon/Icon32/flag_albania.png new file mode 100644 index 0000000..63fe7a3 Binary files /dev/null and b/asset/icon/Icon32/flag_albania.png differ diff --git a/asset/icon/Icon32/flag_algeria.png b/asset/icon/Icon32/flag_algeria.png new file mode 100644 index 0000000..849828c Binary files /dev/null and b/asset/icon/Icon32/flag_algeria.png differ diff --git a/asset/icon/Icon32/flag_american_samoa.png b/asset/icon/Icon32/flag_american_samoa.png new file mode 100644 index 0000000..cf6d990 Binary files /dev/null and b/asset/icon/Icon32/flag_american_samoa.png differ diff --git a/asset/icon/Icon32/flag_andorra.png b/asset/icon/Icon32/flag_andorra.png new file mode 100644 index 0000000..4038ddc Binary files /dev/null and b/asset/icon/Icon32/flag_andorra.png differ diff --git a/asset/icon/Icon32/flag_angola.png b/asset/icon/Icon32/flag_angola.png new file mode 100644 index 0000000..c35ba57 Binary files /dev/null and b/asset/icon/Icon32/flag_angola.png differ diff --git a/asset/icon/Icon32/flag_anguilla.png b/asset/icon/Icon32/flag_anguilla.png new file mode 100644 index 0000000..9e697a1 Binary files /dev/null and b/asset/icon/Icon32/flag_anguilla.png differ diff --git a/asset/icon/Icon32/flag_antigua_and_barbuda.png b/asset/icon/Icon32/flag_antigua_and_barbuda.png new file mode 100644 index 0000000..f89a88a Binary files /dev/null and b/asset/icon/Icon32/flag_antigua_and_barbuda.png differ diff --git a/asset/icon/Icon32/flag_argentina.png b/asset/icon/Icon32/flag_argentina.png new file mode 100644 index 0000000..caf3c75 Binary files /dev/null and b/asset/icon/Icon32/flag_argentina.png differ diff --git a/asset/icon/Icon32/flag_armenia.png b/asset/icon/Icon32/flag_armenia.png new file mode 100644 index 0000000..ef535f0 Binary files /dev/null and b/asset/icon/Icon32/flag_armenia.png differ diff --git a/asset/icon/Icon32/flag_aruba.png b/asset/icon/Icon32/flag_aruba.png new file mode 100644 index 0000000..e85b94e Binary files /dev/null and b/asset/icon/Icon32/flag_aruba.png differ diff --git a/asset/icon/Icon32/flag_australia.png b/asset/icon/Icon32/flag_australia.png new file mode 100644 index 0000000..1d9f4a3 Binary files /dev/null and b/asset/icon/Icon32/flag_australia.png differ diff --git a/asset/icon/Icon32/flag_austria.png b/asset/icon/Icon32/flag_austria.png new file mode 100644 index 0000000..3ac76ec Binary files /dev/null and b/asset/icon/Icon32/flag_austria.png differ diff --git a/asset/icon/Icon32/flag_azerbaijan.png b/asset/icon/Icon32/flag_azerbaijan.png new file mode 100644 index 0000000..7ec8ca3 Binary files /dev/null and b/asset/icon/Icon32/flag_azerbaijan.png differ diff --git a/asset/icon/Icon32/flag_bahamas.png b/asset/icon/Icon32/flag_bahamas.png new file mode 100644 index 0000000..818b3ef Binary files /dev/null and b/asset/icon/Icon32/flag_bahamas.png differ diff --git a/asset/icon/Icon32/flag_bahrain.png b/asset/icon/Icon32/flag_bahrain.png new file mode 100644 index 0000000..3fdb3b2 Binary files /dev/null and b/asset/icon/Icon32/flag_bahrain.png differ diff --git a/asset/icon/Icon32/flag_bangladesh.png b/asset/icon/Icon32/flag_bangladesh.png new file mode 100644 index 0000000..44b3b26 Binary files /dev/null and b/asset/icon/Icon32/flag_bangladesh.png differ diff --git a/asset/icon/Icon32/flag_barbados.png b/asset/icon/Icon32/flag_barbados.png new file mode 100644 index 0000000..72f5d28 Binary files /dev/null and b/asset/icon/Icon32/flag_barbados.png differ diff --git a/asset/icon/Icon32/flag_belarus.png b/asset/icon/Icon32/flag_belarus.png new file mode 100644 index 0000000..840bb30 Binary files /dev/null and b/asset/icon/Icon32/flag_belarus.png differ diff --git a/asset/icon/Icon32/flag_belgium.png b/asset/icon/Icon32/flag_belgium.png new file mode 100644 index 0000000..532dcfa Binary files /dev/null and b/asset/icon/Icon32/flag_belgium.png differ diff --git a/asset/icon/Icon32/flag_belize.png b/asset/icon/Icon32/flag_belize.png new file mode 100644 index 0000000..75532ab Binary files /dev/null and b/asset/icon/Icon32/flag_belize.png differ diff --git a/asset/icon/Icon32/flag_benin.png b/asset/icon/Icon32/flag_benin.png new file mode 100644 index 0000000..aa35bbf Binary files /dev/null and b/asset/icon/Icon32/flag_benin.png differ diff --git a/asset/icon/Icon32/flag_bermuda.png b/asset/icon/Icon32/flag_bermuda.png new file mode 100644 index 0000000..f6a74c0 Binary files /dev/null and b/asset/icon/Icon32/flag_bermuda.png differ diff --git a/asset/icon/Icon32/flag_bhutan.png b/asset/icon/Icon32/flag_bhutan.png new file mode 100644 index 0000000..db669bf Binary files /dev/null and b/asset/icon/Icon32/flag_bhutan.png differ diff --git a/asset/icon/Icon32/flag_blue.png b/asset/icon/Icon32/flag_blue.png new file mode 100644 index 0000000..5556c94 Binary files /dev/null and b/asset/icon/Icon32/flag_blue.png differ diff --git a/asset/icon/Icon32/flag_bolivia.png b/asset/icon/Icon32/flag_bolivia.png new file mode 100644 index 0000000..66f72b7 Binary files /dev/null and b/asset/icon/Icon32/flag_bolivia.png differ diff --git a/asset/icon/Icon32/flag_bosnia.png b/asset/icon/Icon32/flag_bosnia.png new file mode 100644 index 0000000..3ef2e4d Binary files /dev/null and b/asset/icon/Icon32/flag_bosnia.png differ diff --git a/asset/icon/Icon32/flag_botswana.png b/asset/icon/Icon32/flag_botswana.png new file mode 100644 index 0000000..12f9953 Binary files /dev/null and b/asset/icon/Icon32/flag_botswana.png differ diff --git a/asset/icon/Icon32/flag_boy_scout.png b/asset/icon/Icon32/flag_boy_scout.png new file mode 100644 index 0000000..1fa839b Binary files /dev/null and b/asset/icon/Icon32/flag_boy_scout.png differ diff --git a/asset/icon/Icon32/flag_brazil.png b/asset/icon/Icon32/flag_brazil.png new file mode 100644 index 0000000..a311255 Binary files /dev/null and b/asset/icon/Icon32/flag_brazil.png differ diff --git a/asset/icon/Icon32/flag_british_indian_ocean.png b/asset/icon/Icon32/flag_british_indian_ocean.png new file mode 100644 index 0000000..3099840 Binary files /dev/null and b/asset/icon/Icon32/flag_british_indian_ocean.png differ diff --git a/asset/icon/Icon32/flag_british_virgin_islands.png b/asset/icon/Icon32/flag_british_virgin_islands.png new file mode 100644 index 0000000..dfeb892 Binary files /dev/null and b/asset/icon/Icon32/flag_british_virgin_islands.png differ diff --git a/asset/icon/Icon32/flag_brunei.png b/asset/icon/Icon32/flag_brunei.png new file mode 100644 index 0000000..325d5f8 Binary files /dev/null and b/asset/icon/Icon32/flag_brunei.png differ diff --git a/asset/icon/Icon32/flag_bulgaria.png b/asset/icon/Icon32/flag_bulgaria.png new file mode 100644 index 0000000..9024ea5 Binary files /dev/null and b/asset/icon/Icon32/flag_bulgaria.png differ diff --git a/asset/icon/Icon32/flag_burkina_faso.png b/asset/icon/Icon32/flag_burkina_faso.png new file mode 100644 index 0000000..558da90 Binary files /dev/null and b/asset/icon/Icon32/flag_burkina_faso.png differ diff --git a/asset/icon/Icon32/flag_burma.png b/asset/icon/Icon32/flag_burma.png new file mode 100644 index 0000000..e9bea35 Binary files /dev/null and b/asset/icon/Icon32/flag_burma.png differ diff --git a/asset/icon/Icon32/flag_burundi.png b/asset/icon/Icon32/flag_burundi.png new file mode 100644 index 0000000..bdad33c Binary files /dev/null and b/asset/icon/Icon32/flag_burundi.png differ diff --git a/asset/icon/Icon32/flag_cambodia.png b/asset/icon/Icon32/flag_cambodia.png new file mode 100644 index 0000000..77d4945 Binary files /dev/null and b/asset/icon/Icon32/flag_cambodia.png differ diff --git a/asset/icon/Icon32/flag_cameroon.png b/asset/icon/Icon32/flag_cameroon.png new file mode 100644 index 0000000..defe1fa Binary files /dev/null and b/asset/icon/Icon32/flag_cameroon.png differ diff --git a/asset/icon/Icon32/flag_canada.png b/asset/icon/Icon32/flag_canada.png new file mode 100644 index 0000000..808e89d Binary files /dev/null and b/asset/icon/Icon32/flag_canada.png differ diff --git a/asset/icon/Icon32/flag_cayman_islands.png b/asset/icon/Icon32/flag_cayman_islands.png new file mode 100644 index 0000000..2268496 Binary files /dev/null and b/asset/icon/Icon32/flag_cayman_islands.png differ diff --git a/asset/icon/Icon32/flag_central_african_republic.png b/asset/icon/Icon32/flag_central_african_republic.png new file mode 100644 index 0000000..51898a0 Binary files /dev/null and b/asset/icon/Icon32/flag_central_african_republic.png differ diff --git a/asset/icon/Icon32/flag_chad.png b/asset/icon/Icon32/flag_chad.png new file mode 100644 index 0000000..3c79bcd Binary files /dev/null and b/asset/icon/Icon32/flag_chad.png differ diff --git a/asset/icon/Icon32/flag_chile.png b/asset/icon/Icon32/flag_chile.png new file mode 100644 index 0000000..51181fa Binary files /dev/null and b/asset/icon/Icon32/flag_chile.png differ diff --git a/asset/icon/Icon32/flag_china.png b/asset/icon/Icon32/flag_china.png new file mode 100644 index 0000000..86e2674 Binary files /dev/null and b/asset/icon/Icon32/flag_china.png differ diff --git a/asset/icon/Icon32/flag_colombia.png b/asset/icon/Icon32/flag_colombia.png new file mode 100644 index 0000000..beb7ece Binary files /dev/null and b/asset/icon/Icon32/flag_colombia.png differ diff --git a/asset/icon/Icon32/flag_comoros.png b/asset/icon/Icon32/flag_comoros.png new file mode 100644 index 0000000..4a6d6d9 Binary files /dev/null and b/asset/icon/Icon32/flag_comoros.png differ diff --git a/asset/icon/Icon32/flag_congo_democratic_republic.png b/asset/icon/Icon32/flag_congo_democratic_republic.png new file mode 100644 index 0000000..f6c2dc9 Binary files /dev/null and b/asset/icon/Icon32/flag_congo_democratic_republic.png differ diff --git a/asset/icon/Icon32/flag_congo_republic.png b/asset/icon/Icon32/flag_congo_republic.png new file mode 100644 index 0000000..2191512 Binary files /dev/null and b/asset/icon/Icon32/flag_congo_republic.png differ diff --git a/asset/icon/Icon32/flag_cook_islands.png b/asset/icon/Icon32/flag_cook_islands.png new file mode 100644 index 0000000..288c4e7 Binary files /dev/null and b/asset/icon/Icon32/flag_cook_islands.png differ diff --git a/asset/icon/Icon32/flag_cope_verde.png b/asset/icon/Icon32/flag_cope_verde.png new file mode 100644 index 0000000..94ad222 Binary files /dev/null and b/asset/icon/Icon32/flag_cope_verde.png differ diff --git a/asset/icon/Icon32/flag_costa_rica.png b/asset/icon/Icon32/flag_costa_rica.png new file mode 100644 index 0000000..c23ca4e Binary files /dev/null and b/asset/icon/Icon32/flag_costa_rica.png differ diff --git a/asset/icon/Icon32/flag_cote_divoire.png b/asset/icon/Icon32/flag_cote_divoire.png new file mode 100644 index 0000000..6de279b Binary files /dev/null and b/asset/icon/Icon32/flag_cote_divoire.png differ diff --git a/asset/icon/Icon32/flag_croatia.png b/asset/icon/Icon32/flag_croatia.png new file mode 100644 index 0000000..0e9b4fe Binary files /dev/null and b/asset/icon/Icon32/flag_croatia.png differ diff --git a/asset/icon/Icon32/flag_cuba.png b/asset/icon/Icon32/flag_cuba.png new file mode 100644 index 0000000..3ab9308 Binary files /dev/null and b/asset/icon/Icon32/flag_cuba.png differ diff --git a/asset/icon/Icon32/flag_cyprus.png b/asset/icon/Icon32/flag_cyprus.png new file mode 100644 index 0000000..3c9d2d3 Binary files /dev/null and b/asset/icon/Icon32/flag_cyprus.png differ diff --git a/asset/icon/Icon32/flag_czech_republic.png b/asset/icon/Icon32/flag_czech_republic.png new file mode 100644 index 0000000..e29b1c8 Binary files /dev/null and b/asset/icon/Icon32/flag_czech_republic.png differ diff --git a/asset/icon/Icon32/flag_denmark.png b/asset/icon/Icon32/flag_denmark.png new file mode 100644 index 0000000..31a5acf Binary files /dev/null and b/asset/icon/Icon32/flag_denmark.png differ diff --git a/asset/icon/Icon32/flag_djibouti.png b/asset/icon/Icon32/flag_djibouti.png new file mode 100644 index 0000000..8b1a73b Binary files /dev/null and b/asset/icon/Icon32/flag_djibouti.png differ diff --git a/asset/icon/Icon32/flag_dominica.png b/asset/icon/Icon32/flag_dominica.png new file mode 100644 index 0000000..5a1f711 Binary files /dev/null and b/asset/icon/Icon32/flag_dominica.png differ diff --git a/asset/icon/Icon32/flag_dominican_republic.png b/asset/icon/Icon32/flag_dominican_republic.png new file mode 100644 index 0000000..3580ea2 Binary files /dev/null and b/asset/icon/Icon32/flag_dominican_republic.png differ diff --git a/asset/icon/Icon32/flag_east_timor.png b/asset/icon/Icon32/flag_east_timor.png new file mode 100644 index 0000000..6c7830e Binary files /dev/null and b/asset/icon/Icon32/flag_east_timor.png differ diff --git a/asset/icon/Icon32/flag_egypt.png b/asset/icon/Icon32/flag_egypt.png new file mode 100644 index 0000000..d364bfd Binary files /dev/null and b/asset/icon/Icon32/flag_egypt.png differ diff --git a/asset/icon/Icon32/flag_el_salvador.png b/asset/icon/Icon32/flag_el_salvador.png new file mode 100644 index 0000000..26d81e5 Binary files /dev/null and b/asset/icon/Icon32/flag_el_salvador.png differ diff --git a/asset/icon/Icon32/flag_england.png b/asset/icon/Icon32/flag_england.png new file mode 100644 index 0000000..49aee68 Binary files /dev/null and b/asset/icon/Icon32/flag_england.png differ diff --git a/asset/icon/Icon32/flag_equador.png b/asset/icon/Icon32/flag_equador.png new file mode 100644 index 0000000..d915021 Binary files /dev/null and b/asset/icon/Icon32/flag_equador.png differ diff --git a/asset/icon/Icon32/flag_equatorial_guinea.png b/asset/icon/Icon32/flag_equatorial_guinea.png new file mode 100644 index 0000000..3abb8b6 Binary files /dev/null and b/asset/icon/Icon32/flag_equatorial_guinea.png differ diff --git a/asset/icon/Icon32/flag_eritrea.png b/asset/icon/Icon32/flag_eritrea.png new file mode 100644 index 0000000..36771bc Binary files /dev/null and b/asset/icon/Icon32/flag_eritrea.png differ diff --git a/asset/icon/Icon32/flag_estonia.png b/asset/icon/Icon32/flag_estonia.png new file mode 100644 index 0000000..9feb1e6 Binary files /dev/null and b/asset/icon/Icon32/flag_estonia.png differ diff --git a/asset/icon/Icon32/flag_ethiopia.png b/asset/icon/Icon32/flag_ethiopia.png new file mode 100644 index 0000000..9419884 Binary files /dev/null and b/asset/icon/Icon32/flag_ethiopia.png differ diff --git a/asset/icon/Icon32/flag_european_union.png b/asset/icon/Icon32/flag_european_union.png new file mode 100644 index 0000000..7134da4 Binary files /dev/null and b/asset/icon/Icon32/flag_european_union.png differ diff --git a/asset/icon/Icon32/flag_falkland_islands.png b/asset/icon/Icon32/flag_falkland_islands.png new file mode 100644 index 0000000..682d9a2 Binary files /dev/null and b/asset/icon/Icon32/flag_falkland_islands.png differ diff --git a/asset/icon/Icon32/flag_faroe_islands.png b/asset/icon/Icon32/flag_faroe_islands.png new file mode 100644 index 0000000..f95e57e Binary files /dev/null and b/asset/icon/Icon32/flag_faroe_islands.png differ diff --git a/asset/icon/Icon32/flag_fiji.png b/asset/icon/Icon32/flag_fiji.png new file mode 100644 index 0000000..fbd6d86 Binary files /dev/null and b/asset/icon/Icon32/flag_fiji.png differ diff --git a/asset/icon/Icon32/flag_finish.png b/asset/icon/Icon32/flag_finish.png new file mode 100644 index 0000000..04bfa1d Binary files /dev/null and b/asset/icon/Icon32/flag_finish.png differ diff --git a/asset/icon/Icon32/flag_finland.png b/asset/icon/Icon32/flag_finland.png new file mode 100644 index 0000000..42ed293 Binary files /dev/null and b/asset/icon/Icon32/flag_finland.png differ diff --git a/asset/icon/Icon32/flag_france.png b/asset/icon/Icon32/flag_france.png new file mode 100644 index 0000000..5dbab86 Binary files /dev/null and b/asset/icon/Icon32/flag_france.png differ diff --git a/asset/icon/Icon32/flag_french_polynesia.png b/asset/icon/Icon32/flag_french_polynesia.png new file mode 100644 index 0000000..fa784dd Binary files /dev/null and b/asset/icon/Icon32/flag_french_polynesia.png differ diff --git a/asset/icon/Icon32/flag_gabon.png b/asset/icon/Icon32/flag_gabon.png new file mode 100644 index 0000000..e0b783b Binary files /dev/null and b/asset/icon/Icon32/flag_gabon.png differ diff --git a/asset/icon/Icon32/flag_gambia.png b/asset/icon/Icon32/flag_gambia.png new file mode 100644 index 0000000..774c713 Binary files /dev/null and b/asset/icon/Icon32/flag_gambia.png differ diff --git a/asset/icon/Icon32/flag_georgia.png b/asset/icon/Icon32/flag_georgia.png new file mode 100644 index 0000000..20ddf9f Binary files /dev/null and b/asset/icon/Icon32/flag_georgia.png differ diff --git a/asset/icon/Icon32/flag_germany.png b/asset/icon/Icon32/flag_germany.png new file mode 100644 index 0000000..dc23b6d Binary files /dev/null and b/asset/icon/Icon32/flag_germany.png differ diff --git a/asset/icon/Icon32/flag_ghana.png b/asset/icon/Icon32/flag_ghana.png new file mode 100644 index 0000000..ed981a9 Binary files /dev/null and b/asset/icon/Icon32/flag_ghana.png differ diff --git a/asset/icon/Icon32/flag_gibraltar.png b/asset/icon/Icon32/flag_gibraltar.png new file mode 100644 index 0000000..6dd1e92 Binary files /dev/null and b/asset/icon/Icon32/flag_gibraltar.png differ diff --git a/asset/icon/Icon32/flag_great_britain.png b/asset/icon/Icon32/flag_great_britain.png new file mode 100644 index 0000000..b52c9b5 Binary files /dev/null and b/asset/icon/Icon32/flag_great_britain.png differ diff --git a/asset/icon/Icon32/flag_greece.png b/asset/icon/Icon32/flag_greece.png new file mode 100644 index 0000000..f171ed6 Binary files /dev/null and b/asset/icon/Icon32/flag_greece.png differ diff --git a/asset/icon/Icon32/flag_green.png b/asset/icon/Icon32/flag_green.png new file mode 100644 index 0000000..e8734a1 Binary files /dev/null and b/asset/icon/Icon32/flag_green.png differ diff --git a/asset/icon/Icon32/flag_greenland.png b/asset/icon/Icon32/flag_greenland.png new file mode 100644 index 0000000..3060f1a Binary files /dev/null and b/asset/icon/Icon32/flag_greenland.png differ diff --git a/asset/icon/Icon32/flag_grenada.png b/asset/icon/Icon32/flag_grenada.png new file mode 100644 index 0000000..074e689 Binary files /dev/null and b/asset/icon/Icon32/flag_grenada.png differ diff --git a/asset/icon/Icon32/flag_guam.png b/asset/icon/Icon32/flag_guam.png new file mode 100644 index 0000000..1af8000 Binary files /dev/null and b/asset/icon/Icon32/flag_guam.png differ diff --git a/asset/icon/Icon32/flag_guatemala.png b/asset/icon/Icon32/flag_guatemala.png new file mode 100644 index 0000000..a00b749 Binary files /dev/null and b/asset/icon/Icon32/flag_guatemala.png differ diff --git a/asset/icon/Icon32/flag_guernsey.png b/asset/icon/Icon32/flag_guernsey.png new file mode 100644 index 0000000..98e3695 Binary files /dev/null and b/asset/icon/Icon32/flag_guernsey.png differ diff --git a/asset/icon/Icon32/flag_guinea.png b/asset/icon/Icon32/flag_guinea.png new file mode 100644 index 0000000..a48083f Binary files /dev/null and b/asset/icon/Icon32/flag_guinea.png differ diff --git a/asset/icon/Icon32/flag_guinea_bissau.png b/asset/icon/Icon32/flag_guinea_bissau.png new file mode 100644 index 0000000..b4dc9e4 Binary files /dev/null and b/asset/icon/Icon32/flag_guinea_bissau.png differ diff --git a/asset/icon/Icon32/flag_guyana.png b/asset/icon/Icon32/flag_guyana.png new file mode 100644 index 0000000..910fdf0 Binary files /dev/null and b/asset/icon/Icon32/flag_guyana.png differ diff --git a/asset/icon/Icon32/flag_haiti.png b/asset/icon/Icon32/flag_haiti.png new file mode 100644 index 0000000..071a000 Binary files /dev/null and b/asset/icon/Icon32/flag_haiti.png differ diff --git a/asset/icon/Icon32/flag_honduras.png b/asset/icon/Icon32/flag_honduras.png new file mode 100644 index 0000000..8a6f5ef Binary files /dev/null and b/asset/icon/Icon32/flag_honduras.png differ diff --git a/asset/icon/Icon32/flag_hong_kong.png b/asset/icon/Icon32/flag_hong_kong.png new file mode 100644 index 0000000..4f73598 Binary files /dev/null and b/asset/icon/Icon32/flag_hong_kong.png differ diff --git a/asset/icon/Icon32/flag_hot.png b/asset/icon/Icon32/flag_hot.png new file mode 100644 index 0000000..182ddfb Binary files /dev/null and b/asset/icon/Icon32/flag_hot.png differ diff --git a/asset/icon/Icon32/flag_hungary.png b/asset/icon/Icon32/flag_hungary.png new file mode 100644 index 0000000..0003157 Binary files /dev/null and b/asset/icon/Icon32/flag_hungary.png differ diff --git a/asset/icon/Icon32/flag_iceland.png b/asset/icon/Icon32/flag_iceland.png new file mode 100644 index 0000000..21fccc3 Binary files /dev/null and b/asset/icon/Icon32/flag_iceland.png differ diff --git a/asset/icon/Icon32/flag_india.png b/asset/icon/Icon32/flag_india.png new file mode 100644 index 0000000..a867adc Binary files /dev/null and b/asset/icon/Icon32/flag_india.png differ diff --git a/asset/icon/Icon32/flag_indonesia.png b/asset/icon/Icon32/flag_indonesia.png new file mode 100644 index 0000000..205818d Binary files /dev/null and b/asset/icon/Icon32/flag_indonesia.png differ diff --git a/asset/icon/Icon32/flag_iran.png b/asset/icon/Icon32/flag_iran.png new file mode 100644 index 0000000..12e4df5 Binary files /dev/null and b/asset/icon/Icon32/flag_iran.png differ diff --git a/asset/icon/Icon32/flag_iraq.png b/asset/icon/Icon32/flag_iraq.png new file mode 100644 index 0000000..e372db9 Binary files /dev/null and b/asset/icon/Icon32/flag_iraq.png differ diff --git a/asset/icon/Icon32/flag_ireland.png b/asset/icon/Icon32/flag_ireland.png new file mode 100644 index 0000000..838d3a9 Binary files /dev/null and b/asset/icon/Icon32/flag_ireland.png differ diff --git a/asset/icon/Icon32/flag_isle_of_man.png b/asset/icon/Icon32/flag_isle_of_man.png new file mode 100644 index 0000000..063c986 Binary files /dev/null and b/asset/icon/Icon32/flag_isle_of_man.png differ diff --git a/asset/icon/Icon32/flag_israel.png b/asset/icon/Icon32/flag_israel.png new file mode 100644 index 0000000..fa41675 Binary files /dev/null and b/asset/icon/Icon32/flag_israel.png differ diff --git a/asset/icon/Icon32/flag_italy.png b/asset/icon/Icon32/flag_italy.png new file mode 100644 index 0000000..2bea6db Binary files /dev/null and b/asset/icon/Icon32/flag_italy.png differ diff --git a/asset/icon/Icon32/flag_jamaica.png b/asset/icon/Icon32/flag_jamaica.png new file mode 100644 index 0000000..bddb7df Binary files /dev/null and b/asset/icon/Icon32/flag_jamaica.png differ diff --git a/asset/icon/Icon32/flag_japan.png b/asset/icon/Icon32/flag_japan.png new file mode 100644 index 0000000..9ceef98 Binary files /dev/null and b/asset/icon/Icon32/flag_japan.png differ diff --git a/asset/icon/Icon32/flag_jersey.png b/asset/icon/Icon32/flag_jersey.png new file mode 100644 index 0000000..2c3d3d2 Binary files /dev/null and b/asset/icon/Icon32/flag_jersey.png differ diff --git a/asset/icon/Icon32/flag_jordan.png b/asset/icon/Icon32/flag_jordan.png new file mode 100644 index 0000000..fbea10e Binary files /dev/null and b/asset/icon/Icon32/flag_jordan.png differ diff --git a/asset/icon/Icon32/flag_kazakhstan.png b/asset/icon/Icon32/flag_kazakhstan.png new file mode 100644 index 0000000..ced2f95 Binary files /dev/null and b/asset/icon/Icon32/flag_kazakhstan.png differ diff --git a/asset/icon/Icon32/flag_kenya.png b/asset/icon/Icon32/flag_kenya.png new file mode 100644 index 0000000..fcb9a1f Binary files /dev/null and b/asset/icon/Icon32/flag_kenya.png differ diff --git a/asset/icon/Icon32/flag_kiribati.png b/asset/icon/Icon32/flag_kiribati.png new file mode 100644 index 0000000..3fdfbad Binary files /dev/null and b/asset/icon/Icon32/flag_kiribati.png differ diff --git a/asset/icon/Icon32/flag_kuwait.png b/asset/icon/Icon32/flag_kuwait.png new file mode 100644 index 0000000..0936d24 Binary files /dev/null and b/asset/icon/Icon32/flag_kuwait.png differ diff --git a/asset/icon/Icon32/flag_kyrgyzstan.png b/asset/icon/Icon32/flag_kyrgyzstan.png new file mode 100644 index 0000000..245143d Binary files /dev/null and b/asset/icon/Icon32/flag_kyrgyzstan.png differ diff --git a/asset/icon/Icon32/flag_laos.png b/asset/icon/Icon32/flag_laos.png new file mode 100644 index 0000000..26f657d Binary files /dev/null and b/asset/icon/Icon32/flag_laos.png differ diff --git a/asset/icon/Icon32/flag_latvia.png b/asset/icon/Icon32/flag_latvia.png new file mode 100644 index 0000000..60b2dee Binary files /dev/null and b/asset/icon/Icon32/flag_latvia.png differ diff --git a/asset/icon/Icon32/flag_lebanon.png b/asset/icon/Icon32/flag_lebanon.png new file mode 100644 index 0000000..35b7a46 Binary files /dev/null and b/asset/icon/Icon32/flag_lebanon.png differ diff --git a/asset/icon/Icon32/flag_lesotho.png b/asset/icon/Icon32/flag_lesotho.png new file mode 100644 index 0000000..039e5c9 Binary files /dev/null and b/asset/icon/Icon32/flag_lesotho.png differ diff --git a/asset/icon/Icon32/flag_liberia.png b/asset/icon/Icon32/flag_liberia.png new file mode 100644 index 0000000..c8bd7c6 Binary files /dev/null and b/asset/icon/Icon32/flag_liberia.png differ diff --git a/asset/icon/Icon32/flag_libya.png b/asset/icon/Icon32/flag_libya.png new file mode 100644 index 0000000..9efaf62 Binary files /dev/null and b/asset/icon/Icon32/flag_libya.png differ diff --git a/asset/icon/Icon32/flag_liechtenstein.png b/asset/icon/Icon32/flag_liechtenstein.png new file mode 100644 index 0000000..addde19 Binary files /dev/null and b/asset/icon/Icon32/flag_liechtenstein.png differ diff --git a/asset/icon/Icon32/flag_lithuania.png b/asset/icon/Icon32/flag_lithuania.png new file mode 100644 index 0000000..8994288 Binary files /dev/null and b/asset/icon/Icon32/flag_lithuania.png differ diff --git a/asset/icon/Icon32/flag_luxembourg.png b/asset/icon/Icon32/flag_luxembourg.png new file mode 100644 index 0000000..59bbd9b Binary files /dev/null and b/asset/icon/Icon32/flag_luxembourg.png differ diff --git a/asset/icon/Icon32/flag_macau.png b/asset/icon/Icon32/flag_macau.png new file mode 100644 index 0000000..284022d Binary files /dev/null and b/asset/icon/Icon32/flag_macau.png differ diff --git a/asset/icon/Icon32/flag_macedonia.png b/asset/icon/Icon32/flag_macedonia.png new file mode 100644 index 0000000..f7dbeeb Binary files /dev/null and b/asset/icon/Icon32/flag_macedonia.png differ diff --git a/asset/icon/Icon32/flag_madagascar.png b/asset/icon/Icon32/flag_madagascar.png new file mode 100644 index 0000000..3c4b219 Binary files /dev/null and b/asset/icon/Icon32/flag_madagascar.png differ diff --git a/asset/icon/Icon32/flag_malawi.png b/asset/icon/Icon32/flag_malawi.png new file mode 100644 index 0000000..4946e1f Binary files /dev/null and b/asset/icon/Icon32/flag_malawi.png differ diff --git a/asset/icon/Icon32/flag_malaysia.png b/asset/icon/Icon32/flag_malaysia.png new file mode 100644 index 0000000..90e3c11 Binary files /dev/null and b/asset/icon/Icon32/flag_malaysia.png differ diff --git a/asset/icon/Icon32/flag_maledives.png b/asset/icon/Icon32/flag_maledives.png new file mode 100644 index 0000000..4961a2b Binary files /dev/null and b/asset/icon/Icon32/flag_maledives.png differ diff --git a/asset/icon/Icon32/flag_mali.png b/asset/icon/Icon32/flag_mali.png new file mode 100644 index 0000000..1ccf19e Binary files /dev/null and b/asset/icon/Icon32/flag_mali.png differ diff --git a/asset/icon/Icon32/flag_malta.png b/asset/icon/Icon32/flag_malta.png new file mode 100644 index 0000000..8e81488 Binary files /dev/null and b/asset/icon/Icon32/flag_malta.png differ diff --git a/asset/icon/Icon32/flag_marshall_islands.png b/asset/icon/Icon32/flag_marshall_islands.png new file mode 100644 index 0000000..90c452d Binary files /dev/null and b/asset/icon/Icon32/flag_marshall_islands.png differ diff --git a/asset/icon/Icon32/flag_martinique.png b/asset/icon/Icon32/flag_martinique.png new file mode 100644 index 0000000..0b8f696 Binary files /dev/null and b/asset/icon/Icon32/flag_martinique.png differ diff --git a/asset/icon/Icon32/flag_mauretania.png b/asset/icon/Icon32/flag_mauretania.png new file mode 100644 index 0000000..c4f5c63 Binary files /dev/null and b/asset/icon/Icon32/flag_mauretania.png differ diff --git a/asset/icon/Icon32/flag_mauritius.png b/asset/icon/Icon32/flag_mauritius.png new file mode 100644 index 0000000..3022457 Binary files /dev/null and b/asset/icon/Icon32/flag_mauritius.png differ diff --git a/asset/icon/Icon32/flag_mexico.png b/asset/icon/Icon32/flag_mexico.png new file mode 100644 index 0000000..2097498 Binary files /dev/null and b/asset/icon/Icon32/flag_mexico.png differ diff --git a/asset/icon/Icon32/flag_micronesia.png b/asset/icon/Icon32/flag_micronesia.png new file mode 100644 index 0000000..ca6eabb Binary files /dev/null and b/asset/icon/Icon32/flag_micronesia.png differ diff --git a/asset/icon/Icon32/flag_moldova.png b/asset/icon/Icon32/flag_moldova.png new file mode 100644 index 0000000..d45fd8c Binary files /dev/null and b/asset/icon/Icon32/flag_moldova.png differ diff --git a/asset/icon/Icon32/flag_monaco.png b/asset/icon/Icon32/flag_monaco.png new file mode 100644 index 0000000..4d1cdee Binary files /dev/null and b/asset/icon/Icon32/flag_monaco.png differ diff --git a/asset/icon/Icon32/flag_mongolia.png b/asset/icon/Icon32/flag_mongolia.png new file mode 100644 index 0000000..bf79af3 Binary files /dev/null and b/asset/icon/Icon32/flag_mongolia.png differ diff --git a/asset/icon/Icon32/flag_montserrat.png b/asset/icon/Icon32/flag_montserrat.png new file mode 100644 index 0000000..57ac7c4 Binary files /dev/null and b/asset/icon/Icon32/flag_montserrat.png differ diff --git a/asset/icon/Icon32/flag_morocco.png b/asset/icon/Icon32/flag_morocco.png new file mode 100644 index 0000000..ebeaeac Binary files /dev/null and b/asset/icon/Icon32/flag_morocco.png differ diff --git a/asset/icon/Icon32/flag_mozambique.png b/asset/icon/Icon32/flag_mozambique.png new file mode 100644 index 0000000..2bda56f Binary files /dev/null and b/asset/icon/Icon32/flag_mozambique.png differ diff --git a/asset/icon/Icon32/flag_namibia.png b/asset/icon/Icon32/flag_namibia.png new file mode 100644 index 0000000..61adc23 Binary files /dev/null and b/asset/icon/Icon32/flag_namibia.png differ diff --git a/asset/icon/Icon32/flag_nato.png b/asset/icon/Icon32/flag_nato.png new file mode 100644 index 0000000..1338394 Binary files /dev/null and b/asset/icon/Icon32/flag_nato.png differ diff --git a/asset/icon/Icon32/flag_nauru.png b/asset/icon/Icon32/flag_nauru.png new file mode 100644 index 0000000..2d2505f Binary files /dev/null and b/asset/icon/Icon32/flag_nauru.png differ diff --git a/asset/icon/Icon32/flag_nepal.png b/asset/icon/Icon32/flag_nepal.png new file mode 100644 index 0000000..ed149e2 Binary files /dev/null and b/asset/icon/Icon32/flag_nepal.png differ diff --git a/asset/icon/Icon32/flag_netherlands.png b/asset/icon/Icon32/flag_netherlands.png new file mode 100644 index 0000000..f2c3f67 Binary files /dev/null and b/asset/icon/Icon32/flag_netherlands.png differ diff --git a/asset/icon/Icon32/flag_netherlands_antilles.png b/asset/icon/Icon32/flag_netherlands_antilles.png new file mode 100644 index 0000000..50d43ba Binary files /dev/null and b/asset/icon/Icon32/flag_netherlands_antilles.png differ diff --git a/asset/icon/Icon32/flag_new.png b/asset/icon/Icon32/flag_new.png new file mode 100644 index 0000000..9451336 Binary files /dev/null and b/asset/icon/Icon32/flag_new.png differ diff --git a/asset/icon/Icon32/flag_new_zealand.png b/asset/icon/Icon32/flag_new_zealand.png new file mode 100644 index 0000000..eda2741 Binary files /dev/null and b/asset/icon/Icon32/flag_new_zealand.png differ diff --git a/asset/icon/Icon32/flag_nicaragua.png b/asset/icon/Icon32/flag_nicaragua.png new file mode 100644 index 0000000..b5638ea Binary files /dev/null and b/asset/icon/Icon32/flag_nicaragua.png differ diff --git a/asset/icon/Icon32/flag_niger.png b/asset/icon/Icon32/flag_niger.png new file mode 100644 index 0000000..a088702 Binary files /dev/null and b/asset/icon/Icon32/flag_niger.png differ diff --git a/asset/icon/Icon32/flag_nigeria.png b/asset/icon/Icon32/flag_nigeria.png new file mode 100644 index 0000000..5357417 Binary files /dev/null and b/asset/icon/Icon32/flag_nigeria.png differ diff --git a/asset/icon/Icon32/flag_niue.png b/asset/icon/Icon32/flag_niue.png new file mode 100644 index 0000000..a96f294 Binary files /dev/null and b/asset/icon/Icon32/flag_niue.png differ diff --git a/asset/icon/Icon32/flag_norfolk_islands.png b/asset/icon/Icon32/flag_norfolk_islands.png new file mode 100644 index 0000000..959b057 Binary files /dev/null and b/asset/icon/Icon32/flag_norfolk_islands.png differ diff --git a/asset/icon/Icon32/flag_north_korea.png b/asset/icon/Icon32/flag_north_korea.png new file mode 100644 index 0000000..6106c4f Binary files /dev/null and b/asset/icon/Icon32/flag_north_korea.png differ diff --git a/asset/icon/Icon32/flag_northern_mariana_islands.png b/asset/icon/Icon32/flag_northern_mariana_islands.png new file mode 100644 index 0000000..d8ef161 Binary files /dev/null and b/asset/icon/Icon32/flag_northern_mariana_islands.png differ diff --git a/asset/icon/Icon32/flag_norway.png b/asset/icon/Icon32/flag_norway.png new file mode 100644 index 0000000..cc3507b Binary files /dev/null and b/asset/icon/Icon32/flag_norway.png differ diff --git a/asset/icon/Icon32/flag_olympic.png b/asset/icon/Icon32/flag_olympic.png new file mode 100644 index 0000000..fd8934d Binary files /dev/null and b/asset/icon/Icon32/flag_olympic.png differ diff --git a/asset/icon/Icon32/flag_oman.png b/asset/icon/Icon32/flag_oman.png new file mode 100644 index 0000000..3a5d835 Binary files /dev/null and b/asset/icon/Icon32/flag_oman.png differ diff --git a/asset/icon/Icon32/flag_orange.png b/asset/icon/Icon32/flag_orange.png new file mode 100644 index 0000000..21595a8 Binary files /dev/null and b/asset/icon/Icon32/flag_orange.png differ diff --git a/asset/icon/Icon32/flag_pakistan.png b/asset/icon/Icon32/flag_pakistan.png new file mode 100644 index 0000000..e2b436f Binary files /dev/null and b/asset/icon/Icon32/flag_pakistan.png differ diff --git a/asset/icon/Icon32/flag_palau.png b/asset/icon/Icon32/flag_palau.png new file mode 100644 index 0000000..785097f Binary files /dev/null and b/asset/icon/Icon32/flag_palau.png differ diff --git a/asset/icon/Icon32/flag_panama.png b/asset/icon/Icon32/flag_panama.png new file mode 100644 index 0000000..b934e1c Binary files /dev/null and b/asset/icon/Icon32/flag_panama.png differ diff --git a/asset/icon/Icon32/flag_papua_new_guinea.png b/asset/icon/Icon32/flag_papua_new_guinea.png new file mode 100644 index 0000000..6c1cbe2 Binary files /dev/null and b/asset/icon/Icon32/flag_papua_new_guinea.png differ diff --git a/asset/icon/Icon32/flag_paraquay.png b/asset/icon/Icon32/flag_paraquay.png new file mode 100644 index 0000000..66c8705 Binary files /dev/null and b/asset/icon/Icon32/flag_paraquay.png differ diff --git a/asset/icon/Icon32/flag_peru.png b/asset/icon/Icon32/flag_peru.png new file mode 100644 index 0000000..0dc4051 Binary files /dev/null and b/asset/icon/Icon32/flag_peru.png differ diff --git a/asset/icon/Icon32/flag_philippines.png b/asset/icon/Icon32/flag_philippines.png new file mode 100644 index 0000000..59528dc Binary files /dev/null and b/asset/icon/Icon32/flag_philippines.png differ diff --git a/asset/icon/Icon32/flag_pink.png b/asset/icon/Icon32/flag_pink.png new file mode 100644 index 0000000..e0ba7f2 Binary files /dev/null and b/asset/icon/Icon32/flag_pink.png differ diff --git a/asset/icon/Icon32/flag_pitcairn_islands.png b/asset/icon/Icon32/flag_pitcairn_islands.png new file mode 100644 index 0000000..24a5ff3 Binary files /dev/null and b/asset/icon/Icon32/flag_pitcairn_islands.png differ diff --git a/asset/icon/Icon32/flag_poland.png b/asset/icon/Icon32/flag_poland.png new file mode 100644 index 0000000..9df47ee Binary files /dev/null and b/asset/icon/Icon32/flag_poland.png differ diff --git a/asset/icon/Icon32/flag_portugal.png b/asset/icon/Icon32/flag_portugal.png new file mode 100644 index 0000000..f6d9c09 Binary files /dev/null and b/asset/icon/Icon32/flag_portugal.png differ diff --git a/asset/icon/Icon32/flag_puerto_rico.png b/asset/icon/Icon32/flag_puerto_rico.png new file mode 100644 index 0000000..33a4aaa Binary files /dev/null and b/asset/icon/Icon32/flag_puerto_rico.png differ diff --git a/asset/icon/Icon32/flag_purple.png b/asset/icon/Icon32/flag_purple.png new file mode 100644 index 0000000..ed8eab4 Binary files /dev/null and b/asset/icon/Icon32/flag_purple.png differ diff --git a/asset/icon/Icon32/flag_qatar.png b/asset/icon/Icon32/flag_qatar.png new file mode 100644 index 0000000..dcb44db Binary files /dev/null and b/asset/icon/Icon32/flag_qatar.png differ diff --git a/asset/icon/Icon32/flag_red.png b/asset/icon/Icon32/flag_red.png new file mode 100644 index 0000000..d7094b6 Binary files /dev/null and b/asset/icon/Icon32/flag_red.png differ diff --git a/asset/icon/Icon32/flag_red_cross.png b/asset/icon/Icon32/flag_red_cross.png new file mode 100644 index 0000000..0685e9e Binary files /dev/null and b/asset/icon/Icon32/flag_red_cross.png differ diff --git a/asset/icon/Icon32/flag_romania.png b/asset/icon/Icon32/flag_romania.png new file mode 100644 index 0000000..ba24f07 Binary files /dev/null and b/asset/icon/Icon32/flag_romania.png differ diff --git a/asset/icon/Icon32/flag_russia.png b/asset/icon/Icon32/flag_russia.png new file mode 100644 index 0000000..f19fb12 Binary files /dev/null and b/asset/icon/Icon32/flag_russia.png differ diff --git a/asset/icon/Icon32/flag_rwanda.png b/asset/icon/Icon32/flag_rwanda.png new file mode 100644 index 0000000..2026bd3 Binary files /dev/null and b/asset/icon/Icon32/flag_rwanda.png differ diff --git a/asset/icon/Icon32/flag_saint_helena.png b/asset/icon/Icon32/flag_saint_helena.png new file mode 100644 index 0000000..8f1bc83 Binary files /dev/null and b/asset/icon/Icon32/flag_saint_helena.png differ diff --git a/asset/icon/Icon32/flag_saint_kitts_and_nevis.png b/asset/icon/Icon32/flag_saint_kitts_and_nevis.png new file mode 100644 index 0000000..d51c667 Binary files /dev/null and b/asset/icon/Icon32/flag_saint_kitts_and_nevis.png differ diff --git a/asset/icon/Icon32/flag_saint_lucia.png b/asset/icon/Icon32/flag_saint_lucia.png new file mode 100644 index 0000000..9247b09 Binary files /dev/null and b/asset/icon/Icon32/flag_saint_lucia.png differ diff --git a/asset/icon/Icon32/flag_saint_pierre_and_miquelon.png b/asset/icon/Icon32/flag_saint_pierre_and_miquelon.png new file mode 100644 index 0000000..2680e47 Binary files /dev/null and b/asset/icon/Icon32/flag_saint_pierre_and_miquelon.png differ diff --git a/asset/icon/Icon32/flag_saint_vincent_and_grenadines.png b/asset/icon/Icon32/flag_saint_vincent_and_grenadines.png new file mode 100644 index 0000000..def9927 Binary files /dev/null and b/asset/icon/Icon32/flag_saint_vincent_and_grenadines.png differ diff --git a/asset/icon/Icon32/flag_samoa.png b/asset/icon/Icon32/flag_samoa.png new file mode 100644 index 0000000..c752f4b Binary files /dev/null and b/asset/icon/Icon32/flag_samoa.png differ diff --git a/asset/icon/Icon32/flag_san_marino.png b/asset/icon/Icon32/flag_san_marino.png new file mode 100644 index 0000000..a79e3a2 Binary files /dev/null and b/asset/icon/Icon32/flag_san_marino.png differ diff --git a/asset/icon/Icon32/flag_sao_tome_and_principe.png b/asset/icon/Icon32/flag_sao_tome_and_principe.png new file mode 100644 index 0000000..30b883b Binary files /dev/null and b/asset/icon/Icon32/flag_sao_tome_and_principe.png differ diff --git a/asset/icon/Icon32/flag_saudi_arabia.png b/asset/icon/Icon32/flag_saudi_arabia.png new file mode 100644 index 0000000..b78b01f Binary files /dev/null and b/asset/icon/Icon32/flag_saudi_arabia.png differ diff --git a/asset/icon/Icon32/flag_scotland.png b/asset/icon/Icon32/flag_scotland.png new file mode 100644 index 0000000..7c1b8dd Binary files /dev/null and b/asset/icon/Icon32/flag_scotland.png differ diff --git a/asset/icon/Icon32/flag_senegal.png b/asset/icon/Icon32/flag_senegal.png new file mode 100644 index 0000000..711c868 Binary files /dev/null and b/asset/icon/Icon32/flag_senegal.png differ diff --git a/asset/icon/Icon32/flag_serbia_montenegro.png b/asset/icon/Icon32/flag_serbia_montenegro.png new file mode 100644 index 0000000..ab4dcaf Binary files /dev/null and b/asset/icon/Icon32/flag_serbia_montenegro.png differ diff --git a/asset/icon/Icon32/flag_seychelles.png b/asset/icon/Icon32/flag_seychelles.png new file mode 100644 index 0000000..522b879 Binary files /dev/null and b/asset/icon/Icon32/flag_seychelles.png differ diff --git a/asset/icon/Icon32/flag_sierra_leone.png b/asset/icon/Icon32/flag_sierra_leone.png new file mode 100644 index 0000000..9564b4e Binary files /dev/null and b/asset/icon/Icon32/flag_sierra_leone.png differ diff --git a/asset/icon/Icon32/flag_singapore.png b/asset/icon/Icon32/flag_singapore.png new file mode 100644 index 0000000..f78ce64 Binary files /dev/null and b/asset/icon/Icon32/flag_singapore.png differ diff --git a/asset/icon/Icon32/flag_slovakia.png b/asset/icon/Icon32/flag_slovakia.png new file mode 100644 index 0000000..66be423 Binary files /dev/null and b/asset/icon/Icon32/flag_slovakia.png differ diff --git a/asset/icon/Icon32/flag_slovenia.png b/asset/icon/Icon32/flag_slovenia.png new file mode 100644 index 0000000..6422081 Binary files /dev/null and b/asset/icon/Icon32/flag_slovenia.png differ diff --git a/asset/icon/Icon32/flag_solomon_islands.png b/asset/icon/Icon32/flag_solomon_islands.png new file mode 100644 index 0000000..ff4761b Binary files /dev/null and b/asset/icon/Icon32/flag_solomon_islands.png differ diff --git a/asset/icon/Icon32/flag_somalia.png b/asset/icon/Icon32/flag_somalia.png new file mode 100644 index 0000000..82d7da6 Binary files /dev/null and b/asset/icon/Icon32/flag_somalia.png differ diff --git a/asset/icon/Icon32/flag_south_africa.png b/asset/icon/Icon32/flag_south_africa.png new file mode 100644 index 0000000..1def26b Binary files /dev/null and b/asset/icon/Icon32/flag_south_africa.png differ diff --git a/asset/icon/Icon32/flag_south_georgia.png b/asset/icon/Icon32/flag_south_georgia.png new file mode 100644 index 0000000..b4b4bc3 Binary files /dev/null and b/asset/icon/Icon32/flag_south_georgia.png differ diff --git a/asset/icon/Icon32/flag_south_korea.png b/asset/icon/Icon32/flag_south_korea.png new file mode 100644 index 0000000..712d899 Binary files /dev/null and b/asset/icon/Icon32/flag_south_korea.png differ diff --git a/asset/icon/Icon32/flag_spain.png b/asset/icon/Icon32/flag_spain.png new file mode 100644 index 0000000..b0ea464 Binary files /dev/null and b/asset/icon/Icon32/flag_spain.png differ diff --git a/asset/icon/Icon32/flag_sri_lanka.png b/asset/icon/Icon32/flag_sri_lanka.png new file mode 100644 index 0000000..1d68fd7 Binary files /dev/null and b/asset/icon/Icon32/flag_sri_lanka.png differ diff --git a/asset/icon/Icon32/flag_sudan.png b/asset/icon/Icon32/flag_sudan.png new file mode 100644 index 0000000..5ba6499 Binary files /dev/null and b/asset/icon/Icon32/flag_sudan.png differ diff --git a/asset/icon/Icon32/flag_suriname.png b/asset/icon/Icon32/flag_suriname.png new file mode 100644 index 0000000..e414040 Binary files /dev/null and b/asset/icon/Icon32/flag_suriname.png differ diff --git a/asset/icon/Icon32/flag_swaziland.png b/asset/icon/Icon32/flag_swaziland.png new file mode 100644 index 0000000..761d134 Binary files /dev/null and b/asset/icon/Icon32/flag_swaziland.png differ diff --git a/asset/icon/Icon32/flag_sweden.png b/asset/icon/Icon32/flag_sweden.png new file mode 100644 index 0000000..7d7178f Binary files /dev/null and b/asset/icon/Icon32/flag_sweden.png differ diff --git a/asset/icon/Icon32/flag_switzerland.png b/asset/icon/Icon32/flag_switzerland.png new file mode 100644 index 0000000..d948765 Binary files /dev/null and b/asset/icon/Icon32/flag_switzerland.png differ diff --git a/asset/icon/Icon32/flag_syria.png b/asset/icon/Icon32/flag_syria.png new file mode 100644 index 0000000..dc75295 Binary files /dev/null and b/asset/icon/Icon32/flag_syria.png differ diff --git a/asset/icon/Icon32/flag_taiwan.png b/asset/icon/Icon32/flag_taiwan.png new file mode 100644 index 0000000..61ac583 Binary files /dev/null and b/asset/icon/Icon32/flag_taiwan.png differ diff --git a/asset/icon/Icon32/flag_tajikistan.png b/asset/icon/Icon32/flag_tajikistan.png new file mode 100644 index 0000000..a329845 Binary files /dev/null and b/asset/icon/Icon32/flag_tajikistan.png differ diff --git a/asset/icon/Icon32/flag_tanzania.png b/asset/icon/Icon32/flag_tanzania.png new file mode 100644 index 0000000..a84e518 Binary files /dev/null and b/asset/icon/Icon32/flag_tanzania.png differ diff --git a/asset/icon/Icon32/flag_thailand.png b/asset/icon/Icon32/flag_thailand.png new file mode 100644 index 0000000..a35aff1 Binary files /dev/null and b/asset/icon/Icon32/flag_thailand.png differ diff --git a/asset/icon/Icon32/flag_tibet.png b/asset/icon/Icon32/flag_tibet.png new file mode 100644 index 0000000..cf1d18d Binary files /dev/null and b/asset/icon/Icon32/flag_tibet.png differ diff --git a/asset/icon/Icon32/flag_togo.png b/asset/icon/Icon32/flag_togo.png new file mode 100644 index 0000000..8dfbd52 Binary files /dev/null and b/asset/icon/Icon32/flag_togo.png differ diff --git a/asset/icon/Icon32/flag_tonga.png b/asset/icon/Icon32/flag_tonga.png new file mode 100644 index 0000000..45a75be Binary files /dev/null and b/asset/icon/Icon32/flag_tonga.png differ diff --git a/asset/icon/Icon32/flag_trinidad_and_tobago.png b/asset/icon/Icon32/flag_trinidad_and_tobago.png new file mode 100644 index 0000000..22233a7 Binary files /dev/null and b/asset/icon/Icon32/flag_trinidad_and_tobago.png differ diff --git a/asset/icon/Icon32/flag_tunisia.png b/asset/icon/Icon32/flag_tunisia.png new file mode 100644 index 0000000..dd4ef17 Binary files /dev/null and b/asset/icon/Icon32/flag_tunisia.png differ diff --git a/asset/icon/Icon32/flag_turkey.png b/asset/icon/Icon32/flag_turkey.png new file mode 100644 index 0000000..91ad857 Binary files /dev/null and b/asset/icon/Icon32/flag_turkey.png differ diff --git a/asset/icon/Icon32/flag_turkmenistan.png b/asset/icon/Icon32/flag_turkmenistan.png new file mode 100644 index 0000000..f5b123f Binary files /dev/null and b/asset/icon/Icon32/flag_turkmenistan.png differ diff --git a/asset/icon/Icon32/flag_turks_and_caicos_islands.png b/asset/icon/Icon32/flag_turks_and_caicos_islands.png new file mode 100644 index 0000000..df488fe Binary files /dev/null and b/asset/icon/Icon32/flag_turks_and_caicos_islands.png differ diff --git a/asset/icon/Icon32/flag_tuvalu.png b/asset/icon/Icon32/flag_tuvalu.png new file mode 100644 index 0000000..a61341e Binary files /dev/null and b/asset/icon/Icon32/flag_tuvalu.png differ diff --git a/asset/icon/Icon32/flag_uganda.png b/asset/icon/Icon32/flag_uganda.png new file mode 100644 index 0000000..5aa1d8c Binary files /dev/null and b/asset/icon/Icon32/flag_uganda.png differ diff --git a/asset/icon/Icon32/flag_ukraine.png b/asset/icon/Icon32/flag_ukraine.png new file mode 100644 index 0000000..56003fd Binary files /dev/null and b/asset/icon/Icon32/flag_ukraine.png differ diff --git a/asset/icon/Icon32/flag_unesco.png b/asset/icon/Icon32/flag_unesco.png new file mode 100644 index 0000000..4df6252 Binary files /dev/null and b/asset/icon/Icon32/flag_unesco.png differ diff --git a/asset/icon/Icon32/flag_united_arab_emirates.png b/asset/icon/Icon32/flag_united_arab_emirates.png new file mode 100644 index 0000000..99c9223 Binary files /dev/null and b/asset/icon/Icon32/flag_united_arab_emirates.png differ diff --git a/asset/icon/Icon32/flag_united_nations.png b/asset/icon/Icon32/flag_united_nations.png new file mode 100644 index 0000000..fb0f632 Binary files /dev/null and b/asset/icon/Icon32/flag_united_nations.png differ diff --git a/asset/icon/Icon32/flag_uruquay.png b/asset/icon/Icon32/flag_uruquay.png new file mode 100644 index 0000000..70457ab Binary files /dev/null and b/asset/icon/Icon32/flag_uruquay.png differ diff --git a/asset/icon/Icon32/flag_usa.png b/asset/icon/Icon32/flag_usa.png new file mode 100644 index 0000000..d2d9aa3 Binary files /dev/null and b/asset/icon/Icon32/flag_usa.png differ diff --git a/asset/icon/Icon32/flag_uzbekistan.png b/asset/icon/Icon32/flag_uzbekistan.png new file mode 100644 index 0000000..3b06656 Binary files /dev/null and b/asset/icon/Icon32/flag_uzbekistan.png differ diff --git a/asset/icon/Icon32/flag_vanuatu.png b/asset/icon/Icon32/flag_vanuatu.png new file mode 100644 index 0000000..303ab81 Binary files /dev/null and b/asset/icon/Icon32/flag_vanuatu.png differ diff --git a/asset/icon/Icon32/flag_vatican_city.png b/asset/icon/Icon32/flag_vatican_city.png new file mode 100644 index 0000000..80ce07e Binary files /dev/null and b/asset/icon/Icon32/flag_vatican_city.png differ diff --git a/asset/icon/Icon32/flag_venezuela.png b/asset/icon/Icon32/flag_venezuela.png new file mode 100644 index 0000000..e9d44cc Binary files /dev/null and b/asset/icon/Icon32/flag_venezuela.png differ diff --git a/asset/icon/Icon32/flag_vietnam.png b/asset/icon/Icon32/flag_vietnam.png new file mode 100644 index 0000000..9fbe8b9 Binary files /dev/null and b/asset/icon/Icon32/flag_vietnam.png differ diff --git a/asset/icon/Icon32/flag_virgin_islands.png b/asset/icon/Icon32/flag_virgin_islands.png new file mode 100644 index 0000000..9612769 Binary files /dev/null and b/asset/icon/Icon32/flag_virgin_islands.png differ diff --git a/asset/icon/Icon32/flag_wales.png b/asset/icon/Icon32/flag_wales.png new file mode 100644 index 0000000..f6b04e1 Binary files /dev/null and b/asset/icon/Icon32/flag_wales.png differ diff --git a/asset/icon/Icon32/flag_wallis_and_futuna.png b/asset/icon/Icon32/flag_wallis_and_futuna.png new file mode 100644 index 0000000..cad1b20 Binary files /dev/null and b/asset/icon/Icon32/flag_wallis_and_futuna.png differ diff --git a/asset/icon/Icon32/flag_wto.png b/asset/icon/Icon32/flag_wto.png new file mode 100644 index 0000000..271ce47 Binary files /dev/null and b/asset/icon/Icon32/flag_wto.png differ diff --git a/asset/icon/Icon32/flag_wwf.png b/asset/icon/Icon32/flag_wwf.png new file mode 100644 index 0000000..e472d0a Binary files /dev/null and b/asset/icon/Icon32/flag_wwf.png differ diff --git a/asset/icon/Icon32/flag_yellow.png b/asset/icon/Icon32/flag_yellow.png new file mode 100644 index 0000000..19cb7e6 Binary files /dev/null and b/asset/icon/Icon32/flag_yellow.png differ diff --git a/asset/icon/Icon32/flag_yemen.png b/asset/icon/Icon32/flag_yemen.png new file mode 100644 index 0000000..19af462 Binary files /dev/null and b/asset/icon/Icon32/flag_yemen.png differ diff --git a/asset/icon/Icon32/flag_zambia.png b/asset/icon/Icon32/flag_zambia.png new file mode 100644 index 0000000..16607bd Binary files /dev/null and b/asset/icon/Icon32/flag_zambia.png differ diff --git a/asset/icon/Icon32/flag_zimbabwe.png b/asset/icon/Icon32/flag_zimbabwe.png new file mode 100644 index 0000000..05b1c88 Binary files /dev/null and b/asset/icon/Icon32/flag_zimbabwe.png differ diff --git a/asset/icon/Icon32/flamingo.png b/asset/icon/Icon32/flamingo.png new file mode 100644 index 0000000..cedf466 Binary files /dev/null and b/asset/icon/Icon32/flamingo.png differ diff --git a/asset/icon/Icon32/flashdisk.png b/asset/icon/Icon32/flashdisk.png new file mode 100644 index 0000000..db6dc5c Binary files /dev/null and b/asset/icon/Icon32/flashdisk.png differ diff --git a/asset/icon/Icon32/flashdisk_logo.png b/asset/icon/Icon32/flashdisk_logo.png new file mode 100644 index 0000000..cecf8a5 Binary files /dev/null and b/asset/icon/Icon32/flashdisk_logo.png differ diff --git a/asset/icon/Icon32/flashlight.png b/asset/icon/Icon32/flashlight.png new file mode 100644 index 0000000..6237f1c Binary files /dev/null and b/asset/icon/Icon32/flashlight.png differ diff --git a/asset/icon/Icon32/flashlight_shine.png b/asset/icon/Icon32/flashlight_shine.png new file mode 100644 index 0000000..948fc07 Binary files /dev/null and b/asset/icon/Icon32/flashlight_shine.png differ diff --git a/asset/icon/Icon32/flask.png b/asset/icon/Icon32/flask.png new file mode 100644 index 0000000..4e3d2ba Binary files /dev/null and b/asset/icon/Icon32/flask.png differ diff --git a/asset/icon/Icon32/flask_empty.png b/asset/icon/Icon32/flask_empty.png new file mode 100644 index 0000000..877893f Binary files /dev/null and b/asset/icon/Icon32/flask_empty.png differ diff --git a/asset/icon/Icon32/flex.png b/asset/icon/Icon32/flex.png new file mode 100644 index 0000000..e14d209 Binary files /dev/null and b/asset/icon/Icon32/flex.png differ diff --git a/asset/icon/Icon32/flex_builder.png b/asset/icon/Icon32/flex_builder.png new file mode 100644 index 0000000..a3980ea Binary files /dev/null and b/asset/icon/Icon32/flex_builder.png differ diff --git a/asset/icon/Icon32/flickr.png b/asset/icon/Icon32/flickr.png new file mode 100644 index 0000000..086085c Binary files /dev/null and b/asset/icon/Icon32/flickr.png differ diff --git a/asset/icon/Icon32/flood_it.png b/asset/icon/Icon32/flood_it.png new file mode 100644 index 0000000..f5d7edd Binary files /dev/null and b/asset/icon/Icon32/flood_it.png differ diff --git a/asset/icon/Icon32/flow.png b/asset/icon/Icon32/flow.png new file mode 100644 index 0000000..0ba6e3d Binary files /dev/null and b/asset/icon/Icon32/flow.png differ diff --git a/asset/icon/Icon32/flower.png b/asset/icon/Icon32/flower.png new file mode 100644 index 0000000..89dc0f8 Binary files /dev/null and b/asset/icon/Icon32/flower.png differ diff --git a/asset/icon/Icon32/fog.png b/asset/icon/Icon32/fog.png new file mode 100644 index 0000000..947f271 Binary files /dev/null and b/asset/icon/Icon32/fog.png differ diff --git a/asset/icon/Icon32/folder.png b/asset/icon/Icon32/folder.png new file mode 100644 index 0000000..f37bb3e Binary files /dev/null and b/asset/icon/Icon32/folder.png differ diff --git a/asset/icon/Icon32/folder_add.png b/asset/icon/Icon32/folder_add.png new file mode 100644 index 0000000..d881adf Binary files /dev/null and b/asset/icon/Icon32/folder_add.png differ diff --git a/asset/icon/Icon32/folder_bell.png b/asset/icon/Icon32/folder_bell.png new file mode 100644 index 0000000..457fa21 Binary files /dev/null and b/asset/icon/Icon32/folder_bell.png differ diff --git a/asset/icon/Icon32/folder_black.png b/asset/icon/Icon32/folder_black.png new file mode 100644 index 0000000..b2171ae Binary files /dev/null and b/asset/icon/Icon32/folder_black.png differ diff --git a/asset/icon/Icon32/folder_blue.png b/asset/icon/Icon32/folder_blue.png new file mode 100644 index 0000000..f587424 Binary files /dev/null and b/asset/icon/Icon32/folder_blue.png differ diff --git a/asset/icon/Icon32/folder_brick.png b/asset/icon/Icon32/folder_brick.png new file mode 100644 index 0000000..b2ce9f1 Binary files /dev/null and b/asset/icon/Icon32/folder_brick.png differ diff --git a/asset/icon/Icon32/folder_bug.png b/asset/icon/Icon32/folder_bug.png new file mode 100644 index 0000000..12c7214 Binary files /dev/null and b/asset/icon/Icon32/folder_bug.png differ diff --git a/asset/icon/Icon32/folder_camera.png b/asset/icon/Icon32/folder_camera.png new file mode 100644 index 0000000..819b052 Binary files /dev/null and b/asset/icon/Icon32/folder_camera.png differ diff --git a/asset/icon/Icon32/folder_database.png b/asset/icon/Icon32/folder_database.png new file mode 100644 index 0000000..874ac81 Binary files /dev/null and b/asset/icon/Icon32/folder_database.png differ diff --git a/asset/icon/Icon32/folder_delete.png b/asset/icon/Icon32/folder_delete.png new file mode 100644 index 0000000..f35b7a3 Binary files /dev/null and b/asset/icon/Icon32/folder_delete.png differ diff --git a/asset/icon/Icon32/folder_edit.png b/asset/icon/Icon32/folder_edit.png new file mode 100644 index 0000000..5baa64d Binary files /dev/null and b/asset/icon/Icon32/folder_edit.png differ diff --git a/asset/icon/Icon32/folder_error.png b/asset/icon/Icon32/folder_error.png new file mode 100644 index 0000000..02873eb Binary files /dev/null and b/asset/icon/Icon32/folder_error.png differ diff --git a/asset/icon/Icon32/folder_explore.png b/asset/icon/Icon32/folder_explore.png new file mode 100644 index 0000000..53cd115 Binary files /dev/null and b/asset/icon/Icon32/folder_explore.png differ diff --git a/asset/icon/Icon32/folder_feed.png b/asset/icon/Icon32/folder_feed.png new file mode 100644 index 0000000..306c8b9 Binary files /dev/null and b/asset/icon/Icon32/folder_feed.png differ diff --git a/asset/icon/Icon32/folder_find.png b/asset/icon/Icon32/folder_find.png new file mode 100644 index 0000000..dc50339 Binary files /dev/null and b/asset/icon/Icon32/folder_find.png differ diff --git a/asset/icon/Icon32/folder_go.png b/asset/icon/Icon32/folder_go.png new file mode 100644 index 0000000..47e1c0a Binary files /dev/null and b/asset/icon/Icon32/folder_go.png differ diff --git a/asset/icon/Icon32/folder_green.png b/asset/icon/Icon32/folder_green.png new file mode 100644 index 0000000..ad334fb Binary files /dev/null and b/asset/icon/Icon32/folder_green.png differ diff --git a/asset/icon/Icon32/folder_heart.png b/asset/icon/Icon32/folder_heart.png new file mode 100644 index 0000000..5a50cac Binary files /dev/null and b/asset/icon/Icon32/folder_heart.png differ diff --git a/asset/icon/Icon32/folder_image.png b/asset/icon/Icon32/folder_image.png new file mode 100644 index 0000000..4ffd36d Binary files /dev/null and b/asset/icon/Icon32/folder_image.png differ diff --git a/asset/icon/Icon32/folder_key.png b/asset/icon/Icon32/folder_key.png new file mode 100644 index 0000000..ac75a47 Binary files /dev/null and b/asset/icon/Icon32/folder_key.png differ diff --git a/asset/icon/Icon32/folder_lightbulb.png b/asset/icon/Icon32/folder_lightbulb.png new file mode 100644 index 0000000..76547ab Binary files /dev/null and b/asset/icon/Icon32/folder_lightbulb.png differ diff --git a/asset/icon/Icon32/folder_link.png b/asset/icon/Icon32/folder_link.png new file mode 100644 index 0000000..06e95f2 Binary files /dev/null and b/asset/icon/Icon32/folder_link.png differ diff --git a/asset/icon/Icon32/folder_page.png b/asset/icon/Icon32/folder_page.png new file mode 100644 index 0000000..959fa1f Binary files /dev/null and b/asset/icon/Icon32/folder_page.png differ diff --git a/asset/icon/Icon32/folder_page_white.png b/asset/icon/Icon32/folder_page_white.png new file mode 100644 index 0000000..b20277a Binary files /dev/null and b/asset/icon/Icon32/folder_page_white.png differ diff --git a/asset/icon/Icon32/folder_palette.png b/asset/icon/Icon32/folder_palette.png new file mode 100644 index 0000000..6ba2948 Binary files /dev/null and b/asset/icon/Icon32/folder_palette.png differ diff --git a/asset/icon/Icon32/folder_picture.png b/asset/icon/Icon32/folder_picture.png new file mode 100644 index 0000000..aad694c Binary files /dev/null and b/asset/icon/Icon32/folder_picture.png differ diff --git a/asset/icon/Icon32/folder_red.png b/asset/icon/Icon32/folder_red.png new file mode 100644 index 0000000..78be9c2 Binary files /dev/null and b/asset/icon/Icon32/folder_red.png differ diff --git a/asset/icon/Icon32/folder_search.png b/asset/icon/Icon32/folder_search.png new file mode 100644 index 0000000..a541964 Binary files /dev/null and b/asset/icon/Icon32/folder_search.png differ diff --git a/asset/icon/Icon32/folder_stand.png b/asset/icon/Icon32/folder_stand.png new file mode 100644 index 0000000..f1571ec Binary files /dev/null and b/asset/icon/Icon32/folder_stand.png differ diff --git a/asset/icon/Icon32/folder_star.png b/asset/icon/Icon32/folder_star.png new file mode 100644 index 0000000..d2a076a Binary files /dev/null and b/asset/icon/Icon32/folder_star.png differ diff --git a/asset/icon/Icon32/folder_table.png b/asset/icon/Icon32/folder_table.png new file mode 100644 index 0000000..2403593 Binary files /dev/null and b/asset/icon/Icon32/folder_table.png differ diff --git a/asset/icon/Icon32/folder_torn.png b/asset/icon/Icon32/folder_torn.png new file mode 100644 index 0000000..ba746fd Binary files /dev/null and b/asset/icon/Icon32/folder_torn.png differ diff --git a/asset/icon/Icon32/folder_user.png b/asset/icon/Icon32/folder_user.png new file mode 100644 index 0000000..0c78be2 Binary files /dev/null and b/asset/icon/Icon32/folder_user.png differ diff --git a/asset/icon/Icon32/folder_vertical_document.png b/asset/icon/Icon32/folder_vertical_document.png new file mode 100644 index 0000000..0147b5b Binary files /dev/null and b/asset/icon/Icon32/folder_vertical_document.png differ diff --git a/asset/icon/Icon32/folder_vertical_open.png b/asset/icon/Icon32/folder_vertical_open.png new file mode 100644 index 0000000..154bb9e Binary files /dev/null and b/asset/icon/Icon32/folder_vertical_open.png differ diff --git a/asset/icon/Icon32/folder_vertical_rename.png b/asset/icon/Icon32/folder_vertical_rename.png new file mode 100644 index 0000000..b234a97 Binary files /dev/null and b/asset/icon/Icon32/folder_vertical_rename.png differ diff --git a/asset/icon/Icon32/folder_vertical_torn.png b/asset/icon/Icon32/folder_vertical_torn.png new file mode 100644 index 0000000..8248132 Binary files /dev/null and b/asset/icon/Icon32/folder_vertical_torn.png differ diff --git a/asset/icon/Icon32/folder_vertical_zipper.png b/asset/icon/Icon32/folder_vertical_zipper.png new file mode 100644 index 0000000..5c5dab3 Binary files /dev/null and b/asset/icon/Icon32/folder_vertical_zipper.png differ diff --git a/asset/icon/Icon32/folder_wrench.png b/asset/icon/Icon32/folder_wrench.png new file mode 100644 index 0000000..3b52cac Binary files /dev/null and b/asset/icon/Icon32/folder_wrench.png differ diff --git a/asset/icon/Icon32/folders.png b/asset/icon/Icon32/folders.png new file mode 100644 index 0000000..27c2797 Binary files /dev/null and b/asset/icon/Icon32/folders.png differ diff --git a/asset/icon/Icon32/folders_explorer.png b/asset/icon/Icon32/folders_explorer.png new file mode 100644 index 0000000..e51a761 Binary files /dev/null and b/asset/icon/Icon32/folders_explorer.png differ diff --git a/asset/icon/Icon32/folding_fan.png b/asset/icon/Icon32/folding_fan.png new file mode 100644 index 0000000..e2be58b Binary files /dev/null and b/asset/icon/Icon32/folding_fan.png differ diff --git a/asset/icon/Icon32/font.png b/asset/icon/Icon32/font.png new file mode 100644 index 0000000..5b19cec Binary files /dev/null and b/asset/icon/Icon32/font.png differ diff --git a/asset/icon/Icon32/font_add.png b/asset/icon/Icon32/font_add.png new file mode 100644 index 0000000..4b9e807 Binary files /dev/null and b/asset/icon/Icon32/font_add.png differ diff --git a/asset/icon/Icon32/font_colors.png b/asset/icon/Icon32/font_colors.png new file mode 100644 index 0000000..9b65f7d Binary files /dev/null and b/asset/icon/Icon32/font_colors.png differ diff --git a/asset/icon/Icon32/font_delete.png b/asset/icon/Icon32/font_delete.png new file mode 100644 index 0000000..eeb7206 Binary files /dev/null and b/asset/icon/Icon32/font_delete.png differ diff --git a/asset/icon/Icon32/font_go.png b/asset/icon/Icon32/font_go.png new file mode 100644 index 0000000..7e5ae9c Binary files /dev/null and b/asset/icon/Icon32/font_go.png differ diff --git a/asset/icon/Icon32/font_red.png b/asset/icon/Icon32/font_red.png new file mode 100644 index 0000000..6d24f5a Binary files /dev/null and b/asset/icon/Icon32/font_red.png differ diff --git a/asset/icon/Icon32/font_red_delete.png b/asset/icon/Icon32/font_red_delete.png new file mode 100644 index 0000000..851c84a Binary files /dev/null and b/asset/icon/Icon32/font_red_delete.png differ diff --git a/asset/icon/Icon32/font_size_decrease.png b/asset/icon/Icon32/font_size_decrease.png new file mode 100644 index 0000000..eade752 Binary files /dev/null and b/asset/icon/Icon32/font_size_decrease.png differ diff --git a/asset/icon/Icon32/font_size_increase.png b/asset/icon/Icon32/font_size_increase.png new file mode 100644 index 0000000..6704f00 Binary files /dev/null and b/asset/icon/Icon32/font_size_increase.png differ diff --git a/asset/icon/Icon32/font_subscript.png b/asset/icon/Icon32/font_subscript.png new file mode 100644 index 0000000..2e7f730 Binary files /dev/null and b/asset/icon/Icon32/font_subscript.png differ diff --git a/asset/icon/Icon32/font_superscript.png b/asset/icon/Icon32/font_superscript.png new file mode 100644 index 0000000..6186753 Binary files /dev/null and b/asset/icon/Icon32/font_superscript.png differ diff --git a/asset/icon/Icon32/forklift.png b/asset/icon/Icon32/forklift.png new file mode 100644 index 0000000..1c8c271 Binary files /dev/null and b/asset/icon/Icon32/forklift.png differ diff --git a/asset/icon/Icon32/form(2).png b/asset/icon/Icon32/form(2).png new file mode 100644 index 0000000..2b88511 Binary files /dev/null and b/asset/icon/Icon32/form(2).png differ diff --git a/asset/icon/Icon32/form.png b/asset/icon/Icon32/form.png new file mode 100644 index 0000000..dc2dd3f Binary files /dev/null and b/asset/icon/Icon32/form.png differ diff --git a/asset/icon/Icon32/form_design.png b/asset/icon/Icon32/form_design.png new file mode 100644 index 0000000..1b4b883 Binary files /dev/null and b/asset/icon/Icon32/form_design.png differ diff --git a/asset/icon/Icon32/form_wizard.png b/asset/icon/Icon32/form_wizard.png new file mode 100644 index 0000000..8d6711e Binary files /dev/null and b/asset/icon/Icon32/form_wizard.png differ diff --git a/asset/icon/Icon32/format_conditional.png b/asset/icon/Icon32/format_conditional.png new file mode 100644 index 0000000..5d1fc10 Binary files /dev/null and b/asset/icon/Icon32/format_conditional.png differ diff --git a/asset/icon/Icon32/format_painter.png b/asset/icon/Icon32/format_painter.png new file mode 100644 index 0000000..701db4a Binary files /dev/null and b/asset/icon/Icon32/format_painter.png differ diff --git a/asset/icon/Icon32/format_percentage.png b/asset/icon/Icon32/format_percentage.png new file mode 100644 index 0000000..bf2d391 Binary files /dev/null and b/asset/icon/Icon32/format_percentage.png differ diff --git a/asset/icon/Icon32/formheading.png b/asset/icon/Icon32/formheading.png new file mode 100644 index 0000000..3b7a18c Binary files /dev/null and b/asset/icon/Icon32/formheading.png differ diff --git a/asset/icon/Icon32/forrst.png b/asset/icon/Icon32/forrst.png new file mode 100644 index 0000000..8d53edd Binary files /dev/null and b/asset/icon/Icon32/forrst.png differ diff --git a/asset/icon/Icon32/forwarders.png b/asset/icon/Icon32/forwarders.png new file mode 100644 index 0000000..62a4368 Binary files /dev/null and b/asset/icon/Icon32/forwarders.png differ diff --git a/asset/icon/Icon32/freebsd.png b/asset/icon/Icon32/freebsd.png new file mode 100644 index 0000000..75adbaa Binary files /dev/null and b/asset/icon/Icon32/freebsd.png differ diff --git a/asset/icon/Icon32/friendfeed.png b/asset/icon/Icon32/friendfeed.png new file mode 100644 index 0000000..ffb7980 Binary files /dev/null and b/asset/icon/Icon32/friendfeed.png differ diff --git a/asset/icon/Icon32/from_access.png b/asset/icon/Icon32/from_access.png new file mode 100644 index 0000000..694d554 Binary files /dev/null and b/asset/icon/Icon32/from_access.png differ diff --git a/asset/icon/Icon32/from_beginning.png b/asset/icon/Icon32/from_beginning.png new file mode 100644 index 0000000..c260f45 Binary files /dev/null and b/asset/icon/Icon32/from_beginning.png differ diff --git a/asset/icon/Icon32/from_current_slide.png b/asset/icon/Icon32/from_current_slide.png new file mode 100644 index 0000000..b350d70 Binary files /dev/null and b/asset/icon/Icon32/from_current_slide.png differ diff --git a/asset/icon/Icon32/from_other_resources.png b/asset/icon/Icon32/from_other_resources.png new file mode 100644 index 0000000..81dce3f Binary files /dev/null and b/asset/icon/Icon32/from_other_resources.png differ diff --git a/asset/icon/Icon32/from_text.png b/asset/icon/Icon32/from_text.png new file mode 100644 index 0000000..34d1a43 Binary files /dev/null and b/asset/icon/Icon32/from_text.png differ diff --git a/asset/icon/Icon32/from_web.png b/asset/icon/Icon32/from_web.png new file mode 100644 index 0000000..99901b2 Binary files /dev/null and b/asset/icon/Icon32/from_web.png differ diff --git a/asset/icon/Icon32/frontpage.png b/asset/icon/Icon32/frontpage.png new file mode 100644 index 0000000..87d35a6 Binary files /dev/null and b/asset/icon/Icon32/frontpage.png differ diff --git a/asset/icon/Icon32/fruit_grape.png b/asset/icon/Icon32/fruit_grape.png new file mode 100644 index 0000000..357924e Binary files /dev/null and b/asset/icon/Icon32/fruit_grape.png differ diff --git a/asset/icon/Icon32/fruit_lime.png b/asset/icon/Icon32/fruit_lime.png new file mode 100644 index 0000000..661c100 Binary files /dev/null and b/asset/icon/Icon32/fruit_lime.png differ diff --git a/asset/icon/Icon32/ftp.png b/asset/icon/Icon32/ftp.png new file mode 100644 index 0000000..957d7aa Binary files /dev/null and b/asset/icon/Icon32/ftp.png differ diff --git a/asset/icon/Icon32/ftp_accounts.png b/asset/icon/Icon32/ftp_accounts.png new file mode 100644 index 0000000..943112e Binary files /dev/null and b/asset/icon/Icon32/ftp_accounts.png differ diff --git a/asset/icon/Icon32/ftp_session_control.png b/asset/icon/Icon32/ftp_session_control.png new file mode 100644 index 0000000..ac6e657 Binary files /dev/null and b/asset/icon/Icon32/ftp_session_control.png differ diff --git a/asset/icon/Icon32/function.png b/asset/icon/Icon32/function.png new file mode 100644 index 0000000..78c47cf Binary files /dev/null and b/asset/icon/Icon32/function.png differ diff --git a/asset/icon/Icon32/function_recently_used.png b/asset/icon/Icon32/function_recently_used.png new file mode 100644 index 0000000..bb8c6fa Binary files /dev/null and b/asset/icon/Icon32/function_recently_used.png differ diff --git a/asset/icon/Icon32/functions_arrays.png b/asset/icon/Icon32/functions_arrays.png new file mode 100644 index 0000000..1798d6b Binary files /dev/null and b/asset/icon/Icon32/functions_arrays.png differ diff --git a/asset/icon/Icon32/game_monitor.png b/asset/icon/Icon32/game_monitor.png new file mode 100644 index 0000000..2ff2251 Binary files /dev/null and b/asset/icon/Icon32/game_monitor.png differ diff --git a/asset/icon/Icon32/gamespot.png b/asset/icon/Icon32/gamespot.png new file mode 100644 index 0000000..27df3a6 Binary files /dev/null and b/asset/icon/Icon32/gamespot.png differ diff --git a/asset/icon/Icon32/gas.png b/asset/icon/Icon32/gas.png new file mode 100644 index 0000000..b7ecf0d Binary files /dev/null and b/asset/icon/Icon32/gas.png differ diff --git a/asset/icon/Icon32/gcp.png b/asset/icon/Icon32/gcp.png new file mode 100644 index 0000000..11d9f6d Binary files /dev/null and b/asset/icon/Icon32/gcp.png differ diff --git a/asset/icon/Icon32/gcp_rms.png b/asset/icon/Icon32/gcp_rms.png new file mode 100644 index 0000000..e9380bf Binary files /dev/null and b/asset/icon/Icon32/gcp_rms.png differ diff --git a/asset/icon/Icon32/gear_in.png b/asset/icon/Icon32/gear_in.png new file mode 100644 index 0000000..ace46d8 Binary files /dev/null and b/asset/icon/Icon32/gear_in.png differ diff --git a/asset/icon/Icon32/generate_ssl_certificate.png b/asset/icon/Icon32/generate_ssl_certificate.png new file mode 100644 index 0000000..cf93064 Binary files /dev/null and b/asset/icon/Icon32/generate_ssl_certificate.png differ diff --git a/asset/icon/Icon32/gentoo_linux.png b/asset/icon/Icon32/gentoo_linux.png new file mode 100644 index 0000000..09ee3c5 Binary files /dev/null and b/asset/icon/Icon32/gentoo_linux.png differ diff --git a/asset/icon/Icon32/geolocation.png b/asset/icon/Icon32/geolocation.png new file mode 100644 index 0000000..eec295d Binary files /dev/null and b/asset/icon/Icon32/geolocation.png differ diff --git a/asset/icon/Icon32/georectify.png b/asset/icon/Icon32/georectify.png new file mode 100644 index 0000000..d9dff4f Binary files /dev/null and b/asset/icon/Icon32/georectify.png differ diff --git a/asset/icon/Icon32/geotag.png b/asset/icon/Icon32/geotag.png new file mode 100644 index 0000000..01fb003 Binary files /dev/null and b/asset/icon/Icon32/geotag.png differ diff --git a/asset/icon/Icon32/getting_started_wizard.png b/asset/icon/Icon32/getting_started_wizard.png new file mode 100644 index 0000000..2c7d91e Binary files /dev/null and b/asset/icon/Icon32/getting_started_wizard.png differ diff --git a/asset/icon/Icon32/gift_add.png b/asset/icon/Icon32/gift_add.png new file mode 100644 index 0000000..347d6b5 Binary files /dev/null and b/asset/icon/Icon32/gift_add.png differ diff --git a/asset/icon/Icon32/gingerbread_man.png b/asset/icon/Icon32/gingerbread_man.png new file mode 100644 index 0000000..9cc4628 Binary files /dev/null and b/asset/icon/Icon32/gingerbread_man.png differ diff --git a/asset/icon/Icon32/gingerbread_man_chocolate.png b/asset/icon/Icon32/gingerbread_man_chocolate.png new file mode 100644 index 0000000..be7b072 Binary files /dev/null and b/asset/icon/Icon32/gingerbread_man_chocolate.png differ diff --git a/asset/icon/Icon32/glass_narrow.png b/asset/icon/Icon32/glass_narrow.png new file mode 100644 index 0000000..c69b15d Binary files /dev/null and b/asset/icon/Icon32/glass_narrow.png differ diff --git a/asset/icon/Icon32/glass_of_milk.png b/asset/icon/Icon32/glass_of_milk.png new file mode 100644 index 0000000..07b880a Binary files /dev/null and b/asset/icon/Icon32/glass_of_milk.png differ diff --git a/asset/icon/Icon32/global_telecom.png b/asset/icon/Icon32/global_telecom.png new file mode 100644 index 0000000..b2ebc9c Binary files /dev/null and b/asset/icon/Icon32/global_telecom.png differ diff --git a/asset/icon/Icon32/globe_model.png b/asset/icon/Icon32/globe_model.png new file mode 100644 index 0000000..66a5c0b Binary files /dev/null and b/asset/icon/Icon32/globe_model.png differ diff --git a/asset/icon/Icon32/globe_network.png b/asset/icon/Icon32/globe_network.png new file mode 100644 index 0000000..bfd0120 Binary files /dev/null and b/asset/icon/Icon32/globe_network.png differ diff --git a/asset/icon/Icon32/globe_place.png b/asset/icon/Icon32/globe_place.png new file mode 100644 index 0000000..1987d7d Binary files /dev/null and b/asset/icon/Icon32/globe_place.png differ diff --git a/asset/icon/Icon32/gnupg_keys.png b/asset/icon/Icon32/gnupg_keys.png new file mode 100644 index 0000000..23cda1a Binary files /dev/null and b/asset/icon/Icon32/gnupg_keys.png differ diff --git a/asset/icon/Icon32/google.png b/asset/icon/Icon32/google.png new file mode 100644 index 0000000..faaf804 Binary files /dev/null and b/asset/icon/Icon32/google.png differ diff --git a/asset/icon/Icon32/google_adsense.png b/asset/icon/Icon32/google_adsense.png new file mode 100644 index 0000000..2bd6845 Binary files /dev/null and b/asset/icon/Icon32/google_adsense.png differ diff --git a/asset/icon/Icon32/google_custom_search.png b/asset/icon/Icon32/google_custom_search.png new file mode 100644 index 0000000..ac03ac8 Binary files /dev/null and b/asset/icon/Icon32/google_custom_search.png differ diff --git a/asset/icon/Icon32/google_map.png b/asset/icon/Icon32/google_map.png new file mode 100644 index 0000000..21c2931 Binary files /dev/null and b/asset/icon/Icon32/google_map.png differ diff --git a/asset/icon/Icon32/google_map_satellite.png b/asset/icon/Icon32/google_map_satellite.png new file mode 100644 index 0000000..4b6edcb Binary files /dev/null and b/asset/icon/Icon32/google_map_satellite.png differ diff --git a/asset/icon/Icon32/google_new.png b/asset/icon/Icon32/google_new.png new file mode 100644 index 0000000..fa09673 Binary files /dev/null and b/asset/icon/Icon32/google_new.png differ diff --git a/asset/icon/Icon32/google_plus.png b/asset/icon/Icon32/google_plus.png new file mode 100644 index 0000000..055c8d9 Binary files /dev/null and b/asset/icon/Icon32/google_plus.png differ diff --git a/asset/icon/Icon32/google_talk.png b/asset/icon/Icon32/google_talk.png new file mode 100644 index 0000000..1809c75 Binary files /dev/null and b/asset/icon/Icon32/google_talk.png differ diff --git a/asset/icon/Icon32/google_voice.png b/asset/icon/Icon32/google_voice.png new file mode 100644 index 0000000..6571ec8 Binary files /dev/null and b/asset/icon/Icon32/google_voice.png differ diff --git a/asset/icon/Icon32/google_wave.png b/asset/icon/Icon32/google_wave.png new file mode 100644 index 0000000..7ec8a81 Binary files /dev/null and b/asset/icon/Icon32/google_wave.png differ diff --git a/asset/icon/Icon32/google_web_elements.png b/asset/icon/Icon32/google_web_elements.png new file mode 100644 index 0000000..fdf9647 Binary files /dev/null and b/asset/icon/Icon32/google_web_elements.png differ diff --git a/asset/icon/Icon32/google_webmaster_tools.png b/asset/icon/Icon32/google_webmaster_tools.png new file mode 100644 index 0000000..5526326 Binary files /dev/null and b/asset/icon/Icon32/google_webmaster_tools.png differ diff --git a/asset/icon/Icon32/gowalla.png b/asset/icon/Icon32/gowalla.png new file mode 100644 index 0000000..5f0588c Binary files /dev/null and b/asset/icon/Icon32/gowalla.png differ diff --git a/asset/icon/Icon32/gps_automotive.png b/asset/icon/Icon32/gps_automotive.png new file mode 100644 index 0000000..15d2a9f Binary files /dev/null and b/asset/icon/Icon32/gps_automotive.png differ diff --git a/asset/icon/Icon32/gps_handheld.png b/asset/icon/Icon32/gps_handheld.png new file mode 100644 index 0000000..acad941 Binary files /dev/null and b/asset/icon/Icon32/gps_handheld.png differ diff --git a/asset/icon/Icon32/gps_handheld_protect.png b/asset/icon/Icon32/gps_handheld_protect.png new file mode 100644 index 0000000..5836b7d Binary files /dev/null and b/asset/icon/Icon32/gps_handheld_protect.png differ diff --git a/asset/icon/Icon32/grass.png b/asset/icon/Icon32/grass.png new file mode 100644 index 0000000..1e101e3 Binary files /dev/null and b/asset/icon/Icon32/grass.png differ diff --git a/asset/icon/Icon32/green.png b/asset/icon/Icon32/green.png new file mode 100644 index 0000000..f5f8789 Binary files /dev/null and b/asset/icon/Icon32/green.png differ diff --git a/asset/icon/Icon32/green_wormhole.png b/asset/icon/Icon32/green_wormhole.png new file mode 100644 index 0000000..87025c6 Binary files /dev/null and b/asset/icon/Icon32/green_wormhole.png differ diff --git a/asset/icon/Icon32/green_yellow.png b/asset/icon/Icon32/green_yellow.png new file mode 100644 index 0000000..ddc7657 Binary files /dev/null and b/asset/icon/Icon32/green_yellow.png differ diff --git a/asset/icon/Icon32/greeting_line.png b/asset/icon/Icon32/greeting_line.png new file mode 100644 index 0000000..e4bde74 Binary files /dev/null and b/asset/icon/Icon32/greeting_line.png differ diff --git a/asset/icon/Icon32/grenade.png b/asset/icon/Icon32/grenade.png new file mode 100644 index 0000000..a35b942 Binary files /dev/null and b/asset/icon/Icon32/grenade.png differ diff --git a/asset/icon/Icon32/grid.png b/asset/icon/Icon32/grid.png new file mode 100644 index 0000000..2f4436a Binary files /dev/null and b/asset/icon/Icon32/grid.png differ diff --git a/asset/icon/Icon32/grooveshark.png b/asset/icon/Icon32/grooveshark.png new file mode 100644 index 0000000..9009b55 Binary files /dev/null and b/asset/icon/Icon32/grooveshark.png differ diff --git a/asset/icon/Icon32/group.png b/asset/icon/Icon32/group.png new file mode 100644 index 0000000..bea2488 Binary files /dev/null and b/asset/icon/Icon32/group.png differ diff --git a/asset/icon/Icon32/group_add.png b/asset/icon/Icon32/group_add.png new file mode 100644 index 0000000..40b2044 Binary files /dev/null and b/asset/icon/Icon32/group_add.png differ diff --git a/asset/icon/Icon32/group_box.png b/asset/icon/Icon32/group_box.png new file mode 100644 index 0000000..2da8d0c Binary files /dev/null and b/asset/icon/Icon32/group_box.png differ diff --git a/asset/icon/Icon32/group_delete.png b/asset/icon/Icon32/group_delete.png new file mode 100644 index 0000000..72f9c03 Binary files /dev/null and b/asset/icon/Icon32/group_delete.png differ diff --git a/asset/icon/Icon32/group_edit.png b/asset/icon/Icon32/group_edit.png new file mode 100644 index 0000000..36a6153 Binary files /dev/null and b/asset/icon/Icon32/group_edit.png differ diff --git a/asset/icon/Icon32/group_error.png b/asset/icon/Icon32/group_error.png new file mode 100644 index 0000000..93df000 Binary files /dev/null and b/asset/icon/Icon32/group_error.png differ diff --git a/asset/icon/Icon32/group_gear.png b/asset/icon/Icon32/group_gear.png new file mode 100644 index 0000000..be8cf76 Binary files /dev/null and b/asset/icon/Icon32/group_gear.png differ diff --git a/asset/icon/Icon32/group_go.png b/asset/icon/Icon32/group_go.png new file mode 100644 index 0000000..1c15ff7 Binary files /dev/null and b/asset/icon/Icon32/group_go.png differ diff --git a/asset/icon/Icon32/group_key.png b/asset/icon/Icon32/group_key.png new file mode 100644 index 0000000..a41cfe8 Binary files /dev/null and b/asset/icon/Icon32/group_key.png differ diff --git a/asset/icon/Icon32/group_link.png b/asset/icon/Icon32/group_link.png new file mode 100644 index 0000000..402af39 Binary files /dev/null and b/asset/icon/Icon32/group_link.png differ diff --git a/asset/icon/Icon32/group_stroke.png b/asset/icon/Icon32/group_stroke.png new file mode 100644 index 0000000..ea527c3 Binary files /dev/null and b/asset/icon/Icon32/group_stroke.png differ diff --git a/asset/icon/Icon32/gun.png b/asset/icon/Icon32/gun.png new file mode 100644 index 0000000..187f5bb Binary files /dev/null and b/asset/icon/Icon32/gun.png differ diff --git a/asset/icon/Icon32/half_moon.png b/asset/icon/Icon32/half_moon.png new file mode 100644 index 0000000..4b69ed6 Binary files /dev/null and b/asset/icon/Icon32/half_moon.png differ diff --git a/asset/icon/Icon32/hamburger.png b/asset/icon/Icon32/hamburger.png new file mode 100644 index 0000000..02597de Binary files /dev/null and b/asset/icon/Icon32/hamburger.png differ diff --git a/asset/icon/Icon32/hammer.png b/asset/icon/Icon32/hammer.png new file mode 100644 index 0000000..a069c80 Binary files /dev/null and b/asset/icon/Icon32/hammer.png differ diff --git a/asset/icon/Icon32/hand.png b/asset/icon/Icon32/hand.png new file mode 100644 index 0000000..d431afa Binary files /dev/null and b/asset/icon/Icon32/hand.png differ diff --git a/asset/icon/Icon32/hand_fuck.png b/asset/icon/Icon32/hand_fuck.png new file mode 100644 index 0000000..75320ac Binary files /dev/null and b/asset/icon/Icon32/hand_fuck.png differ diff --git a/asset/icon/Icon32/hand_ily.png b/asset/icon/Icon32/hand_ily.png new file mode 100644 index 0000000..35235c8 Binary files /dev/null and b/asset/icon/Icon32/hand_ily.png differ diff --git a/asset/icon/Icon32/hand_point.png b/asset/icon/Icon32/hand_point.png new file mode 100644 index 0000000..540dcf8 Binary files /dev/null and b/asset/icon/Icon32/hand_point.png differ diff --git a/asset/icon/Icon32/hand_point_090.png b/asset/icon/Icon32/hand_point_090.png new file mode 100644 index 0000000..c5a5a6e Binary files /dev/null and b/asset/icon/Icon32/hand_point_090.png differ diff --git a/asset/icon/Icon32/hand_point_180.png b/asset/icon/Icon32/hand_point_180.png new file mode 100644 index 0000000..1f0c882 Binary files /dev/null and b/asset/icon/Icon32/hand_point_180.png differ diff --git a/asset/icon/Icon32/hand_point_270.png b/asset/icon/Icon32/hand_point_270.png new file mode 100644 index 0000000..4f6bd52 Binary files /dev/null and b/asset/icon/Icon32/hand_point_270.png differ diff --git a/asset/icon/Icon32/hand_property.png b/asset/icon/Icon32/hand_property.png new file mode 100644 index 0000000..fe4725e Binary files /dev/null and b/asset/icon/Icon32/hand_property.png differ diff --git a/asset/icon/Icon32/handbag.png b/asset/icon/Icon32/handbag.png new file mode 100644 index 0000000..85df2be Binary files /dev/null and b/asset/icon/Icon32/handbag.png differ diff --git a/asset/icon/Icon32/handout_master.png b/asset/icon/Icon32/handout_master.png new file mode 100644 index 0000000..4330919 Binary files /dev/null and b/asset/icon/Icon32/handout_master.png differ diff --git a/asset/icon/Icon32/hard_hat_military.png b/asset/icon/Icon32/hard_hat_military.png new file mode 100644 index 0000000..48fab41 Binary files /dev/null and b/asset/icon/Icon32/hard_hat_military.png differ diff --git a/asset/icon/Icon32/hardware_building_oem.png b/asset/icon/Icon32/hardware_building_oem.png new file mode 100644 index 0000000..4832b50 Binary files /dev/null and b/asset/icon/Icon32/hardware_building_oem.png differ diff --git a/asset/icon/Icon32/hat.png b/asset/icon/Icon32/hat.png new file mode 100644 index 0000000..81a2789 Binary files /dev/null and b/asset/icon/Icon32/hat.png differ diff --git a/asset/icon/Icon32/hbox.png b/asset/icon/Icon32/hbox.png new file mode 100644 index 0000000..95add23 Binary files /dev/null and b/asset/icon/Icon32/hbox.png differ diff --git a/asset/icon/Icon32/hd_1080.png b/asset/icon/Icon32/hd_1080.png new file mode 100644 index 0000000..dbffe06 Binary files /dev/null and b/asset/icon/Icon32/hd_1080.png differ diff --git a/asset/icon/Icon32/hd_720.png b/asset/icon/Icon32/hd_720.png new file mode 100644 index 0000000..a67ca0c Binary files /dev/null and b/asset/icon/Icon32/hd_720.png differ diff --git a/asset/icon/Icon32/hd_ready.png b/asset/icon/Icon32/hd_ready.png new file mode 100644 index 0000000..6673854 Binary files /dev/null and b/asset/icon/Icon32/hd_ready.png differ diff --git a/asset/icon/Icon32/hdividedbox.png b/asset/icon/Icon32/hdividedbox.png new file mode 100644 index 0000000..5cf2d43 Binary files /dev/null and b/asset/icon/Icon32/hdividedbox.png differ diff --git a/asset/icon/Icon32/headphone.png b/asset/icon/Icon32/headphone.png new file mode 100644 index 0000000..4db79e3 Binary files /dev/null and b/asset/icon/Icon32/headphone.png differ diff --git a/asset/icon/Icon32/headphone_mic.png b/asset/icon/Icon32/headphone_mic.png new file mode 100644 index 0000000..d7fce91 Binary files /dev/null and b/asset/icon/Icon32/headphone_mic.png differ diff --git a/asset/icon/Icon32/health.png b/asset/icon/Icon32/health.png new file mode 100644 index 0000000..e7a0bdc Binary files /dev/null and b/asset/icon/Icon32/health.png differ diff --git a/asset/icon/Icon32/heart.png b/asset/icon/Icon32/heart.png new file mode 100644 index 0000000..fa7092c Binary files /dev/null and b/asset/icon/Icon32/heart.png differ diff --git a/asset/icon/Icon32/heart_add.png b/asset/icon/Icon32/heart_add.png new file mode 100644 index 0000000..478d568 Binary files /dev/null and b/asset/icon/Icon32/heart_add.png differ diff --git a/asset/icon/Icon32/heart_break.png b/asset/icon/Icon32/heart_break.png new file mode 100644 index 0000000..2e4c67c Binary files /dev/null and b/asset/icon/Icon32/heart_break.png differ diff --git a/asset/icon/Icon32/heart_delete.png b/asset/icon/Icon32/heart_delete.png new file mode 100644 index 0000000..5862e45 Binary files /dev/null and b/asset/icon/Icon32/heart_delete.png differ diff --git a/asset/icon/Icon32/heart_empty.png b/asset/icon/Icon32/heart_empty.png new file mode 100644 index 0000000..63976c7 Binary files /dev/null and b/asset/icon/Icon32/heart_empty.png differ diff --git a/asset/icon/Icon32/heart_half.png b/asset/icon/Icon32/heart_half.png new file mode 100644 index 0000000..c882ce2 Binary files /dev/null and b/asset/icon/Icon32/heart_half.png differ diff --git a/asset/icon/Icon32/helicopter.png b/asset/icon/Icon32/helicopter.png new file mode 100644 index 0000000..9a2a73d Binary files /dev/null and b/asset/icon/Icon32/helicopter.png differ diff --git a/asset/icon/Icon32/helmet.png b/asset/icon/Icon32/helmet.png new file mode 100644 index 0000000..f06c80c Binary files /dev/null and b/asset/icon/Icon32/helmet.png differ diff --git a/asset/icon/Icon32/helmet_mine.png b/asset/icon/Icon32/helmet_mine.png new file mode 100644 index 0000000..73b113b Binary files /dev/null and b/asset/icon/Icon32/helmet_mine.png differ diff --git a/asset/icon/Icon32/help.png b/asset/icon/Icon32/help.png new file mode 100644 index 0000000..68f51ba Binary files /dev/null and b/asset/icon/Icon32/help.png differ diff --git a/asset/icon/Icon32/hide_detail.png b/asset/icon/Icon32/hide_detail.png new file mode 100644 index 0000000..40d46d4 Binary files /dev/null and b/asset/icon/Icon32/hide_detail.png differ diff --git a/asset/icon/Icon32/hide_slide.png b/asset/icon/Icon32/hide_slide.png new file mode 100644 index 0000000..9c950cb Binary files /dev/null and b/asset/icon/Icon32/hide_slide.png differ diff --git a/asset/icon/Icon32/highlight_merge_fields.png b/asset/icon/Icon32/highlight_merge_fields.png new file mode 100644 index 0000000..8e5fde3 Binary files /dev/null and b/asset/icon/Icon32/highlight_merge_fields.png differ diff --git a/asset/icon/Icon32/highlighter.png b/asset/icon/Icon32/highlighter.png new file mode 100644 index 0000000..f68246b Binary files /dev/null and b/asset/icon/Icon32/highlighter.png differ diff --git a/asset/icon/Icon32/highlighter_text.png b/asset/icon/Icon32/highlighter_text.png new file mode 100644 index 0000000..05bec0b Binary files /dev/null and b/asset/icon/Icon32/highlighter_text.png differ diff --git a/asset/icon/Icon32/hippocampus.png b/asset/icon/Icon32/hippocampus.png new file mode 100644 index 0000000..81cb1b8 Binary files /dev/null and b/asset/icon/Icon32/hippocampus.png differ diff --git a/asset/icon/Icon32/hlocchart.png b/asset/icon/Icon32/hlocchart.png new file mode 100644 index 0000000..e1960a2 Binary files /dev/null and b/asset/icon/Icon32/hlocchart.png differ diff --git a/asset/icon/Icon32/holly.png b/asset/icon/Icon32/holly.png new file mode 100644 index 0000000..3ae3f35 Binary files /dev/null and b/asset/icon/Icon32/holly.png differ diff --git a/asset/icon/Icon32/home_page.png b/asset/icon/Icon32/home_page.png new file mode 100644 index 0000000..382ab1d Binary files /dev/null and b/asset/icon/Icon32/home_page.png differ diff --git a/asset/icon/Icon32/horizontal_list.png b/asset/icon/Icon32/horizontal_list.png new file mode 100644 index 0000000..f318b27 Binary files /dev/null and b/asset/icon/Icon32/horizontal_list.png differ diff --git a/asset/icon/Icon32/horn.png b/asset/icon/Icon32/horn.png new file mode 100644 index 0000000..5ee8a6f Binary files /dev/null and b/asset/icon/Icon32/horn.png differ diff --git a/asset/icon/Icon32/horoscopes.png b/asset/icon/Icon32/horoscopes.png new file mode 100644 index 0000000..0ee2a63 Binary files /dev/null and b/asset/icon/Icon32/horoscopes.png differ diff --git a/asset/icon/Icon32/hospital.png b/asset/icon/Icon32/hospital.png new file mode 100644 index 0000000..2fe77b0 Binary files /dev/null and b/asset/icon/Icon32/hospital.png differ diff --git a/asset/icon/Icon32/hostname.png b/asset/icon/Icon32/hostname.png new file mode 100644 index 0000000..a20d472 Binary files /dev/null and b/asset/icon/Icon32/hostname.png differ diff --git a/asset/icon/Icon32/hot.png b/asset/icon/Icon32/hot.png new file mode 100644 index 0000000..fbc71a5 Binary files /dev/null and b/asset/icon/Icon32/hot.png differ diff --git a/asset/icon/Icon32/hotjobs.png b/asset/icon/Icon32/hotjobs.png new file mode 100644 index 0000000..4aee448 Binary files /dev/null and b/asset/icon/Icon32/hotjobs.png differ diff --git a/asset/icon/Icon32/hourglass.png b/asset/icon/Icon32/hourglass.png new file mode 100644 index 0000000..cd14446 Binary files /dev/null and b/asset/icon/Icon32/hourglass.png differ diff --git a/asset/icon/Icon32/hourglass_add.png b/asset/icon/Icon32/hourglass_add.png new file mode 100644 index 0000000..cc890c9 Binary files /dev/null and b/asset/icon/Icon32/hourglass_add.png differ diff --git a/asset/icon/Icon32/hourglass_delete.png b/asset/icon/Icon32/hourglass_delete.png new file mode 100644 index 0000000..57e4aa0 Binary files /dev/null and b/asset/icon/Icon32/hourglass_delete.png differ diff --git a/asset/icon/Icon32/hourglass_go.png b/asset/icon/Icon32/hourglass_go.png new file mode 100644 index 0000000..786772f Binary files /dev/null and b/asset/icon/Icon32/hourglass_go.png differ diff --git a/asset/icon/Icon32/hourglass_link.png b/asset/icon/Icon32/hourglass_link.png new file mode 100644 index 0000000..a3f9cee Binary files /dev/null and b/asset/icon/Icon32/hourglass_link.png differ diff --git a/asset/icon/Icon32/house.png b/asset/icon/Icon32/house.png new file mode 100644 index 0000000..51e3c50 Binary files /dev/null and b/asset/icon/Icon32/house.png differ diff --git a/asset/icon/Icon32/house_go.png b/asset/icon/Icon32/house_go.png new file mode 100644 index 0000000..75bdfd9 Binary files /dev/null and b/asset/icon/Icon32/house_go.png differ diff --git a/asset/icon/Icon32/house_link.png b/asset/icon/Icon32/house_link.png new file mode 100644 index 0000000..a53de06 Binary files /dev/null and b/asset/icon/Icon32/house_link.png differ diff --git a/asset/icon/Icon32/house_one.png b/asset/icon/Icon32/house_one.png new file mode 100644 index 0000000..8bf4e3f Binary files /dev/null and b/asset/icon/Icon32/house_one.png differ diff --git a/asset/icon/Icon32/house_two.png b/asset/icon/Icon32/house_two.png new file mode 100644 index 0000000..d241d99 Binary files /dev/null and b/asset/icon/Icon32/house_two.png differ diff --git a/asset/icon/Icon32/hrule.png b/asset/icon/Icon32/hrule.png new file mode 100644 index 0000000..4206379 Binary files /dev/null and b/asset/icon/Icon32/hrule.png differ diff --git a/asset/icon/Icon32/hslider.png b/asset/icon/Icon32/hslider.png new file mode 100644 index 0000000..3c24bac Binary files /dev/null and b/asset/icon/Icon32/hslider.png differ diff --git a/asset/icon/Icon32/html.png b/asset/icon/Icon32/html.png new file mode 100644 index 0000000..b872663 Binary files /dev/null and b/asset/icon/Icon32/html.png differ diff --git a/asset/icon/Icon32/html_5.png b/asset/icon/Icon32/html_5.png new file mode 100644 index 0000000..9e2f082 Binary files /dev/null and b/asset/icon/Icon32/html_5.png differ diff --git a/asset/icon/Icon32/html_add.png b/asset/icon/Icon32/html_add.png new file mode 100644 index 0000000..1b5edd2 Binary files /dev/null and b/asset/icon/Icon32/html_add.png differ diff --git a/asset/icon/Icon32/html_delete.png b/asset/icon/Icon32/html_delete.png new file mode 100644 index 0000000..c59fc7e Binary files /dev/null and b/asset/icon/Icon32/html_delete.png differ diff --git a/asset/icon/Icon32/html_go.png b/asset/icon/Icon32/html_go.png new file mode 100644 index 0000000..3063361 Binary files /dev/null and b/asset/icon/Icon32/html_go.png differ diff --git a/asset/icon/Icon32/html_valid.png b/asset/icon/Icon32/html_valid.png new file mode 100644 index 0000000..1b78228 Binary files /dev/null and b/asset/icon/Icon32/html_valid.png differ diff --git a/asset/icon/Icon32/http_server_apache.png b/asset/icon/Icon32/http_server_apache.png new file mode 100644 index 0000000..4b48c29 Binary files /dev/null and b/asset/icon/Icon32/http_server_apache.png differ diff --git a/asset/icon/Icon32/http_status_not_found.png b/asset/icon/Icon32/http_status_not_found.png new file mode 100644 index 0000000..c0c1a3f Binary files /dev/null and b/asset/icon/Icon32/http_status_not_found.png differ diff --git a/asset/icon/Icon32/http_status_ok_success.png b/asset/icon/Icon32/http_status_ok_success.png new file mode 100644 index 0000000..7fc05c4 Binary files /dev/null and b/asset/icon/Icon32/http_status_ok_success.png differ diff --git a/asset/icon/Icon32/http_status_permanent.png b/asset/icon/Icon32/http_status_permanent.png new file mode 100644 index 0000000..468c7ee Binary files /dev/null and b/asset/icon/Icon32/http_status_permanent.png differ diff --git a/asset/icon/Icon32/http_status_server_error.png b/asset/icon/Icon32/http_status_server_error.png new file mode 100644 index 0000000..7bdf28c Binary files /dev/null and b/asset/icon/Icon32/http_status_server_error.png differ diff --git a/asset/icon/Icon32/http_status_temporary.png b/asset/icon/Icon32/http_status_temporary.png new file mode 100644 index 0000000..ac414c7 Binary files /dev/null and b/asset/icon/Icon32/http_status_temporary.png differ diff --git a/asset/icon/Icon32/http_status_unavailable.png b/asset/icon/Icon32/http_status_unavailable.png new file mode 100644 index 0000000..5aba48e Binary files /dev/null and b/asset/icon/Icon32/http_status_unavailable.png differ diff --git a/asset/icon/Icon32/hummingbird.png b/asset/icon/Icon32/hummingbird.png new file mode 100644 index 0000000..f37144f Binary files /dev/null and b/asset/icon/Icon32/hummingbird.png differ diff --git a/asset/icon/Icon32/ice_cube.png b/asset/icon/Icon32/ice_cube.png new file mode 100644 index 0000000..f978028 Binary files /dev/null and b/asset/icon/Icon32/ice_cube.png differ diff --git a/asset/icon/Icon32/icecream.png b/asset/icon/Icon32/icecream.png new file mode 100644 index 0000000..11bd6d9 Binary files /dev/null and b/asset/icon/Icon32/icecream.png differ diff --git a/asset/icon/Icon32/ilike.png b/asset/icon/Icon32/ilike.png new file mode 100644 index 0000000..bc1d391 Binary files /dev/null and b/asset/icon/Icon32/ilike.png differ diff --git a/asset/icon/Icon32/im_messenger.png b/asset/icon/Icon32/im_messenger.png new file mode 100644 index 0000000..ee8d4cf Binary files /dev/null and b/asset/icon/Icon32/im_messenger.png differ diff --git a/asset/icon/Icon32/image.png b/asset/icon/Icon32/image.png new file mode 100644 index 0000000..00c0978 Binary files /dev/null and b/asset/icon/Icon32/image.png differ diff --git a/asset/icon/Icon32/image_add.png b/asset/icon/Icon32/image_add.png new file mode 100644 index 0000000..c2305dd Binary files /dev/null and b/asset/icon/Icon32/image_add.png differ diff --git a/asset/icon/Icon32/image_delete.png b/asset/icon/Icon32/image_delete.png new file mode 100644 index 0000000..580f81a Binary files /dev/null and b/asset/icon/Icon32/image_delete.png differ diff --git a/asset/icon/Icon32/image_edit.png b/asset/icon/Icon32/image_edit.png new file mode 100644 index 0000000..c398570 Binary files /dev/null and b/asset/icon/Icon32/image_edit.png differ diff --git a/asset/icon/Icon32/image_link.png b/asset/icon/Icon32/image_link.png new file mode 100644 index 0000000..b73dbc0 Binary files /dev/null and b/asset/icon/Icon32/image_link.png differ diff --git a/asset/icon/Icon32/images.png b/asset/icon/Icon32/images.png new file mode 100644 index 0000000..8908a88 Binary files /dev/null and b/asset/icon/Icon32/images.png differ diff --git a/asset/icon/Icon32/images_flickr.png b/asset/icon/Icon32/images_flickr.png new file mode 100644 index 0000000..289aa86 Binary files /dev/null and b/asset/icon/Icon32/images_flickr.png differ diff --git a/asset/icon/Icon32/imap_server.png b/asset/icon/Icon32/imap_server.png new file mode 100644 index 0000000..faadaba Binary files /dev/null and b/asset/icon/Icon32/imap_server.png differ diff --git a/asset/icon/Icon32/import_email_accounts.png b/asset/icon/Icon32/import_email_accounts.png new file mode 100644 index 0000000..b9e9a75 Binary files /dev/null and b/asset/icon/Icon32/import_email_accounts.png differ diff --git a/asset/icon/Icon32/inbox_document.png b/asset/icon/Icon32/inbox_document.png new file mode 100644 index 0000000..3758523 Binary files /dev/null and b/asset/icon/Icon32/inbox_document.png differ diff --git a/asset/icon/Icon32/inbox_document_music.png b/asset/icon/Icon32/inbox_document_music.png new file mode 100644 index 0000000..094f39c Binary files /dev/null and b/asset/icon/Icon32/inbox_document_music.png differ diff --git a/asset/icon/Icon32/inbox_document_text.png b/asset/icon/Icon32/inbox_document_text.png new file mode 100644 index 0000000..9674be5 Binary files /dev/null and b/asset/icon/Icon32/inbox_document_text.png differ diff --git a/asset/icon/Icon32/inbox_download.png b/asset/icon/Icon32/inbox_download.png new file mode 100644 index 0000000..af90840 Binary files /dev/null and b/asset/icon/Icon32/inbox_download.png differ diff --git a/asset/icon/Icon32/inbox_empty.png b/asset/icon/Icon32/inbox_empty.png new file mode 100644 index 0000000..3dfcf87 Binary files /dev/null and b/asset/icon/Icon32/inbox_empty.png differ diff --git a/asset/icon/Icon32/inbox_film.png b/asset/icon/Icon32/inbox_film.png new file mode 100644 index 0000000..8e69407 Binary files /dev/null and b/asset/icon/Icon32/inbox_film.png differ diff --git a/asset/icon/Icon32/inbox_images.png b/asset/icon/Icon32/inbox_images.png new file mode 100644 index 0000000..4eacc4e Binary files /dev/null and b/asset/icon/Icon32/inbox_images.png differ diff --git a/asset/icon/Icon32/inbox_slide.png b/asset/icon/Icon32/inbox_slide.png new file mode 100644 index 0000000..d3741df Binary files /dev/null and b/asset/icon/Icon32/inbox_slide.png differ diff --git a/asset/icon/Icon32/inbox_table.png b/asset/icon/Icon32/inbox_table.png new file mode 100644 index 0000000..bb515fa Binary files /dev/null and b/asset/icon/Icon32/inbox_table.png differ diff --git a/asset/icon/Icon32/inbox_upload.png b/asset/icon/Icon32/inbox_upload.png new file mode 100644 index 0000000..244c57b Binary files /dev/null and b/asset/icon/Icon32/inbox_upload.png differ diff --git a/asset/icon/Icon32/index_manager.png b/asset/icon/Icon32/index_manager.png new file mode 100644 index 0000000..3b638ce Binary files /dev/null and b/asset/icon/Icon32/index_manager.png differ diff --git a/asset/icon/Icon32/info_rhombus.png b/asset/icon/Icon32/info_rhombus.png new file mode 100644 index 0000000..036733e Binary files /dev/null and b/asset/icon/Icon32/info_rhombus.png differ diff --git a/asset/icon/Icon32/infocard.png b/asset/icon/Icon32/infocard.png new file mode 100644 index 0000000..874c8f3 Binary files /dev/null and b/asset/icon/Icon32/infocard.png differ diff --git a/asset/icon/Icon32/information.png b/asset/icon/Icon32/information.png new file mode 100644 index 0000000..93c67f2 Binary files /dev/null and b/asset/icon/Icon32/information.png differ diff --git a/asset/icon/Icon32/injection.png b/asset/icon/Icon32/injection.png new file mode 100644 index 0000000..71feed0 Binary files /dev/null and b/asset/icon/Icon32/injection.png differ diff --git a/asset/icon/Icon32/insert_caption.png b/asset/icon/Icon32/insert_caption.png new file mode 100644 index 0000000..78864bb Binary files /dev/null and b/asset/icon/Icon32/insert_caption.png differ diff --git a/asset/icon/Icon32/insert_citation.png b/asset/icon/Icon32/insert_citation.png new file mode 100644 index 0000000..3f23434 Binary files /dev/null and b/asset/icon/Icon32/insert_citation.png differ diff --git a/asset/icon/Icon32/insert_element.png b/asset/icon/Icon32/insert_element.png new file mode 100644 index 0000000..30226cc Binary files /dev/null and b/asset/icon/Icon32/insert_element.png differ diff --git a/asset/icon/Icon32/insert_endnote.png b/asset/icon/Icon32/insert_endnote.png new file mode 100644 index 0000000..5ca3afb Binary files /dev/null and b/asset/icon/Icon32/insert_endnote.png differ diff --git a/asset/icon/Icon32/insert_footnote.png b/asset/icon/Icon32/insert_footnote.png new file mode 100644 index 0000000..c7696db Binary files /dev/null and b/asset/icon/Icon32/insert_footnote.png differ diff --git a/asset/icon/Icon32/insert_merge_field.png b/asset/icon/Icon32/insert_merge_field.png new file mode 100644 index 0000000..5f75adb Binary files /dev/null and b/asset/icon/Icon32/insert_merge_field.png differ diff --git a/asset/icon/Icon32/insert_object.png b/asset/icon/Icon32/insert_object.png new file mode 100644 index 0000000..dd3e578 Binary files /dev/null and b/asset/icon/Icon32/insert_object.png differ diff --git a/asset/icon/Icon32/insert_table_for_analysis.png b/asset/icon/Icon32/insert_table_for_analysis.png new file mode 100644 index 0000000..5b48085 Binary files /dev/null and b/asset/icon/Icon32/insert_table_for_analysis.png differ diff --git a/asset/icon/Icon32/insert_table_of_authorities.png b/asset/icon/Icon32/insert_table_of_authorities.png new file mode 100644 index 0000000..09e9e75 Binary files /dev/null and b/asset/icon/Icon32/insert_table_of_authorities.png differ diff --git a/asset/icon/Icon32/insert_text.png b/asset/icon/Icon32/insert_text.png new file mode 100644 index 0000000..6d5c11d Binary files /dev/null and b/asset/icon/Icon32/insert_text.png differ diff --git a/asset/icon/Icon32/install_frontpage_extensions.png b/asset/icon/Icon32/install_frontpage_extensions.png new file mode 100644 index 0000000..7f60185 Binary files /dev/null and b/asset/icon/Icon32/install_frontpage_extensions.png differ diff --git a/asset/icon/Icon32/install_frontpage_mail_extensions.png b/asset/icon/Icon32/install_frontpage_mail_extensions.png new file mode 100644 index 0000000..2fd5afe Binary files /dev/null and b/asset/icon/Icon32/install_frontpage_mail_extensions.png differ diff --git a/asset/icon/Icon32/install_ssl_certificate.png b/asset/icon/Icon32/install_ssl_certificate.png new file mode 100644 index 0000000..c6d113e Binary files /dev/null and b/asset/icon/Icon32/install_ssl_certificate.png differ diff --git a/asset/icon/Icon32/installer_box.png b/asset/icon/Icon32/installer_box.png new file mode 100644 index 0000000..c6b7e8c Binary files /dev/null and b/asset/icon/Icon32/installer_box.png differ diff --git a/asset/icon/Icon32/interface_preferences.png b/asset/icon/Icon32/interface_preferences.png new file mode 100644 index 0000000..60026f3 Binary files /dev/null and b/asset/icon/Icon32/interface_preferences.png differ diff --git a/asset/icon/Icon32/internet_explorer.png b/asset/icon/Icon32/internet_explorer.png new file mode 100644 index 0000000..8f03f8e Binary files /dev/null and b/asset/icon/Icon32/internet_explorer.png differ diff --git a/asset/icon/Icon32/investment_menu_quality.png b/asset/icon/Icon32/investment_menu_quality.png new file mode 100644 index 0000000..e47cc17 Binary files /dev/null and b/asset/icon/Icon32/investment_menu_quality.png differ diff --git a/asset/icon/Icon32/ip.png b/asset/icon/Icon32/ip.png new file mode 100644 index 0000000..d913d31 Binary files /dev/null and b/asset/icon/Icon32/ip.png differ diff --git a/asset/icon/Icon32/ip_block.png b/asset/icon/Icon32/ip_block.png new file mode 100644 index 0000000..838112b Binary files /dev/null and b/asset/icon/Icon32/ip_block.png differ diff --git a/asset/icon/Icon32/ip_class.png b/asset/icon/Icon32/ip_class.png new file mode 100644 index 0000000..3a44125 Binary files /dev/null and b/asset/icon/Icon32/ip_class.png differ diff --git a/asset/icon/Icon32/ip_telephone.png b/asset/icon/Icon32/ip_telephone.png new file mode 100644 index 0000000..dca8a70 Binary files /dev/null and b/asset/icon/Icon32/ip_telephone.png differ diff --git a/asset/icon/Icon32/ipad.png b/asset/icon/Icon32/ipad.png new file mode 100644 index 0000000..580f13a Binary files /dev/null and b/asset/icon/Icon32/ipad.png differ diff --git a/asset/icon/Icon32/ipad_protect.png b/asset/icon/Icon32/ipad_protect.png new file mode 100644 index 0000000..2f06bdc Binary files /dev/null and b/asset/icon/Icon32/ipad_protect.png differ diff --git a/asset/icon/Icon32/iphone.png b/asset/icon/Icon32/iphone.png new file mode 100644 index 0000000..78fff79 Binary files /dev/null and b/asset/icon/Icon32/iphone.png differ diff --git a/asset/icon/Icon32/iphone_protect.png b/asset/icon/Icon32/iphone_protect.png new file mode 100644 index 0000000..91af93d Binary files /dev/null and b/asset/icon/Icon32/iphone_protect.png differ diff --git a/asset/icon/Icon32/ipod.png b/asset/icon/Icon32/ipod.png new file mode 100644 index 0000000..311d982 Binary files /dev/null and b/asset/icon/Icon32/ipod.png differ diff --git a/asset/icon/Icon32/ipod_cast.png b/asset/icon/Icon32/ipod_cast.png new file mode 100644 index 0000000..acdf98a Binary files /dev/null and b/asset/icon/Icon32/ipod_cast.png differ diff --git a/asset/icon/Icon32/ipod_cast_add.png b/asset/icon/Icon32/ipod_cast_add.png new file mode 100644 index 0000000..9478d85 Binary files /dev/null and b/asset/icon/Icon32/ipod_cast_add.png differ diff --git a/asset/icon/Icon32/ipod_cast_delete.png b/asset/icon/Icon32/ipod_cast_delete.png new file mode 100644 index 0000000..24cf089 Binary files /dev/null and b/asset/icon/Icon32/ipod_cast_delete.png differ diff --git a/asset/icon/Icon32/ipod_sound.png b/asset/icon/Icon32/ipod_sound.png new file mode 100644 index 0000000..13d76ab Binary files /dev/null and b/asset/icon/Icon32/ipod_sound.png differ diff --git a/asset/icon/Icon32/italy.png b/asset/icon/Icon32/italy.png new file mode 100644 index 0000000..4e175ad Binary files /dev/null and b/asset/icon/Icon32/italy.png differ diff --git a/asset/icon/Icon32/jacket.png b/asset/icon/Icon32/jacket.png new file mode 100644 index 0000000..3d862fb Binary files /dev/null and b/asset/icon/Icon32/jacket.png differ diff --git a/asset/icon/Icon32/jar_empty.png b/asset/icon/Icon32/jar_empty.png new file mode 100644 index 0000000..0d74b3d Binary files /dev/null and b/asset/icon/Icon32/jar_empty.png differ diff --git a/asset/icon/Icon32/jar_open.png b/asset/icon/Icon32/jar_open.png new file mode 100644 index 0000000..f225d36 Binary files /dev/null and b/asset/icon/Icon32/jar_open.png differ diff --git a/asset/icon/Icon32/jason_mask.png b/asset/icon/Icon32/jason_mask.png new file mode 100644 index 0000000..ba5f61e Binary files /dev/null and b/asset/icon/Icon32/jason_mask.png differ diff --git a/asset/icon/Icon32/jeans.png b/asset/icon/Icon32/jeans.png new file mode 100644 index 0000000..f0126dd Binary files /dev/null and b/asset/icon/Icon32/jeans.png differ diff --git a/asset/icon/Icon32/joystick.png b/asset/icon/Icon32/joystick.png new file mode 100644 index 0000000..c7fb11e Binary files /dev/null and b/asset/icon/Icon32/joystick.png differ diff --git a/asset/icon/Icon32/joystick_add.png b/asset/icon/Icon32/joystick_add.png new file mode 100644 index 0000000..77f94c0 Binary files /dev/null and b/asset/icon/Icon32/joystick_add.png differ diff --git a/asset/icon/Icon32/joystick_delete.png b/asset/icon/Icon32/joystick_delete.png new file mode 100644 index 0000000..a8bc4c8 Binary files /dev/null and b/asset/icon/Icon32/joystick_delete.png differ diff --git a/asset/icon/Icon32/joystick_error.png b/asset/icon/Icon32/joystick_error.png new file mode 100644 index 0000000..116562f Binary files /dev/null and b/asset/icon/Icon32/joystick_error.png differ diff --git a/asset/icon/Icon32/json.png b/asset/icon/Icon32/json.png new file mode 100644 index 0000000..04dab45 Binary files /dev/null and b/asset/icon/Icon32/json.png differ diff --git a/asset/icon/Icon32/key.png b/asset/icon/Icon32/key.png new file mode 100644 index 0000000..3cf460e Binary files /dev/null and b/asset/icon/Icon32/key.png differ diff --git a/asset/icon/Icon32/key_a.png b/asset/icon/Icon32/key_a.png new file mode 100644 index 0000000..eaed44b Binary files /dev/null and b/asset/icon/Icon32/key_a.png differ diff --git a/asset/icon/Icon32/key_add.png b/asset/icon/Icon32/key_add.png new file mode 100644 index 0000000..da22eb0 Binary files /dev/null and b/asset/icon/Icon32/key_add.png differ diff --git a/asset/icon/Icon32/key_b.png b/asset/icon/Icon32/key_b.png new file mode 100644 index 0000000..e1774ea Binary files /dev/null and b/asset/icon/Icon32/key_b.png differ diff --git a/asset/icon/Icon32/key_c.png b/asset/icon/Icon32/key_c.png new file mode 100644 index 0000000..9747dfa Binary files /dev/null and b/asset/icon/Icon32/key_c.png differ diff --git a/asset/icon/Icon32/key_d.png b/asset/icon/Icon32/key_d.png new file mode 100644 index 0000000..80c0f69 Binary files /dev/null and b/asset/icon/Icon32/key_d.png differ diff --git a/asset/icon/Icon32/key_delete.png b/asset/icon/Icon32/key_delete.png new file mode 100644 index 0000000..9462a12 Binary files /dev/null and b/asset/icon/Icon32/key_delete.png differ diff --git a/asset/icon/Icon32/key_e.png b/asset/icon/Icon32/key_e.png new file mode 100644 index 0000000..da0dd20 Binary files /dev/null and b/asset/icon/Icon32/key_e.png differ diff --git a/asset/icon/Icon32/key_escape.png b/asset/icon/Icon32/key_escape.png new file mode 100644 index 0000000..35303a7 Binary files /dev/null and b/asset/icon/Icon32/key_escape.png differ diff --git a/asset/icon/Icon32/key_f.png b/asset/icon/Icon32/key_f.png new file mode 100644 index 0000000..4242c4a Binary files /dev/null and b/asset/icon/Icon32/key_f.png differ diff --git a/asset/icon/Icon32/key_g.png b/asset/icon/Icon32/key_g.png new file mode 100644 index 0000000..1fe592f Binary files /dev/null and b/asset/icon/Icon32/key_g.png differ diff --git a/asset/icon/Icon32/key_go.png b/asset/icon/Icon32/key_go.png new file mode 100644 index 0000000..94400f1 Binary files /dev/null and b/asset/icon/Icon32/key_go.png differ diff --git a/asset/icon/Icon32/key_h.png b/asset/icon/Icon32/key_h.png new file mode 100644 index 0000000..b562391 Binary files /dev/null and b/asset/icon/Icon32/key_h.png differ diff --git a/asset/icon/Icon32/key_i.png b/asset/icon/Icon32/key_i.png new file mode 100644 index 0000000..cb2d3ad Binary files /dev/null and b/asset/icon/Icon32/key_i.png differ diff --git a/asset/icon/Icon32/key_j.png b/asset/icon/Icon32/key_j.png new file mode 100644 index 0000000..34b3f66 Binary files /dev/null and b/asset/icon/Icon32/key_j.png differ diff --git a/asset/icon/Icon32/key_k.png b/asset/icon/Icon32/key_k.png new file mode 100644 index 0000000..90340f0 Binary files /dev/null and b/asset/icon/Icon32/key_k.png differ diff --git a/asset/icon/Icon32/key_l.png b/asset/icon/Icon32/key_l.png new file mode 100644 index 0000000..8e2a4fc Binary files /dev/null and b/asset/icon/Icon32/key_l.png differ diff --git a/asset/icon/Icon32/key_m.png b/asset/icon/Icon32/key_m.png new file mode 100644 index 0000000..00f883c Binary files /dev/null and b/asset/icon/Icon32/key_m.png differ diff --git a/asset/icon/Icon32/key_n.png b/asset/icon/Icon32/key_n.png new file mode 100644 index 0000000..48f8f68 Binary files /dev/null and b/asset/icon/Icon32/key_n.png differ diff --git a/asset/icon/Icon32/key_o.png b/asset/icon/Icon32/key_o.png new file mode 100644 index 0000000..d533179 Binary files /dev/null and b/asset/icon/Icon32/key_o.png differ diff --git a/asset/icon/Icon32/key_p.png b/asset/icon/Icon32/key_p.png new file mode 100644 index 0000000..0ece9ed Binary files /dev/null and b/asset/icon/Icon32/key_p.png differ diff --git a/asset/icon/Icon32/key_q.png b/asset/icon/Icon32/key_q.png new file mode 100644 index 0000000..4456423 Binary files /dev/null and b/asset/icon/Icon32/key_q.png differ diff --git a/asset/icon/Icon32/key_r.png b/asset/icon/Icon32/key_r.png new file mode 100644 index 0000000..92a3a45 Binary files /dev/null and b/asset/icon/Icon32/key_r.png differ diff --git a/asset/icon/Icon32/key_s.png b/asset/icon/Icon32/key_s.png new file mode 100644 index 0000000..30ab7af Binary files /dev/null and b/asset/icon/Icon32/key_s.png differ diff --git a/asset/icon/Icon32/key_solid.png b/asset/icon/Icon32/key_solid.png new file mode 100644 index 0000000..bb48308 Binary files /dev/null and b/asset/icon/Icon32/key_solid.png differ diff --git a/asset/icon/Icon32/key_t.png b/asset/icon/Icon32/key_t.png new file mode 100644 index 0000000..decc5e0 Binary files /dev/null and b/asset/icon/Icon32/key_t.png differ diff --git a/asset/icon/Icon32/key_u.png b/asset/icon/Icon32/key_u.png new file mode 100644 index 0000000..72d9761 Binary files /dev/null and b/asset/icon/Icon32/key_u.png differ diff --git a/asset/icon/Icon32/key_v.png b/asset/icon/Icon32/key_v.png new file mode 100644 index 0000000..e377a38 Binary files /dev/null and b/asset/icon/Icon32/key_v.png differ diff --git a/asset/icon/Icon32/key_w.png b/asset/icon/Icon32/key_w.png new file mode 100644 index 0000000..ac7b814 Binary files /dev/null and b/asset/icon/Icon32/key_w.png differ diff --git a/asset/icon/Icon32/key_x.png b/asset/icon/Icon32/key_x.png new file mode 100644 index 0000000..e55cdbb Binary files /dev/null and b/asset/icon/Icon32/key_x.png differ diff --git a/asset/icon/Icon32/key_y.png b/asset/icon/Icon32/key_y.png new file mode 100644 index 0000000..f06a5b0 Binary files /dev/null and b/asset/icon/Icon32/key_y.png differ diff --git a/asset/icon/Icon32/key_z.png b/asset/icon/Icon32/key_z.png new file mode 100644 index 0000000..48a7142 Binary files /dev/null and b/asset/icon/Icon32/key_z.png differ diff --git a/asset/icon/Icon32/keyboard.png b/asset/icon/Icon32/keyboard.png new file mode 100644 index 0000000..882d48b Binary files /dev/null and b/asset/icon/Icon32/keyboard.png differ diff --git a/asset/icon/Icon32/keyboard_add.png b/asset/icon/Icon32/keyboard_add.png new file mode 100644 index 0000000..9f4bf78 Binary files /dev/null and b/asset/icon/Icon32/keyboard_add.png differ diff --git a/asset/icon/Icon32/keyboard_delete.png b/asset/icon/Icon32/keyboard_delete.png new file mode 100644 index 0000000..c73a7c0 Binary files /dev/null and b/asset/icon/Icon32/keyboard_delete.png differ diff --git a/asset/icon/Icon32/keyboard_magnify.png b/asset/icon/Icon32/keyboard_magnify.png new file mode 100644 index 0000000..8b063f6 Binary files /dev/null and b/asset/icon/Icon32/keyboard_magnify.png differ diff --git a/asset/icon/Icon32/kids.png b/asset/icon/Icon32/kids.png new file mode 100644 index 0000000..d8e5f1b Binary files /dev/null and b/asset/icon/Icon32/kids.png differ diff --git a/asset/icon/Icon32/knot.png b/asset/icon/Icon32/knot.png new file mode 100644 index 0000000..53583f6 Binary files /dev/null and b/asset/icon/Icon32/knot.png differ diff --git a/asset/icon/Icon32/label.png b/asset/icon/Icon32/label.png new file mode 100644 index 0000000..7c68272 Binary files /dev/null and b/asset/icon/Icon32/label.png differ diff --git a/asset/icon/Icon32/label_link.png b/asset/icon/Icon32/label_link.png new file mode 100644 index 0000000..d4c3e30 Binary files /dev/null and b/asset/icon/Icon32/label_link.png differ diff --git a/asset/icon/Icon32/labels(2).png b/asset/icon/Icon32/labels(2).png new file mode 100644 index 0000000..26b54ac Binary files /dev/null and b/asset/icon/Icon32/labels(2).png differ diff --git a/asset/icon/Icon32/labels.png b/asset/icon/Icon32/labels.png new file mode 100644 index 0000000..17b363f Binary files /dev/null and b/asset/icon/Icon32/labels.png differ diff --git a/asset/icon/Icon32/ladybird.png b/asset/icon/Icon32/ladybird.png new file mode 100644 index 0000000..e803eb1 Binary files /dev/null and b/asset/icon/Icon32/ladybird.png differ diff --git a/asset/icon/Icon32/landmarks.png b/asset/icon/Icon32/landmarks.png new file mode 100644 index 0000000..9c0a409 Binary files /dev/null and b/asset/icon/Icon32/landmarks.png differ diff --git a/asset/icon/Icon32/languange.png b/asset/icon/Icon32/languange.png new file mode 100644 index 0000000..093c436 Binary files /dev/null and b/asset/icon/Icon32/languange.png differ diff --git a/asset/icon/Icon32/laptop.png b/asset/icon/Icon32/laptop.png new file mode 100644 index 0000000..2ab8b49 Binary files /dev/null and b/asset/icon/Icon32/laptop.png differ diff --git a/asset/icon/Icon32/large_tiles.png b/asset/icon/Icon32/large_tiles.png new file mode 100644 index 0000000..05dc583 Binary files /dev/null and b/asset/icon/Icon32/large_tiles.png differ diff --git a/asset/icon/Icon32/last_fm.png b/asset/icon/Icon32/last_fm.png new file mode 100644 index 0000000..082ed78 Binary files /dev/null and b/asset/icon/Icon32/last_fm.png differ diff --git a/asset/icon/Icon32/latest_visitors.png b/asset/icon/Icon32/latest_visitors.png new file mode 100644 index 0000000..752699a Binary files /dev/null and b/asset/icon/Icon32/latest_visitors.png differ diff --git a/asset/icon/Icon32/layer.png b/asset/icon/Icon32/layer.png new file mode 100644 index 0000000..c1c46cb Binary files /dev/null and b/asset/icon/Icon32/layer.png differ diff --git a/asset/icon/Icon32/layer_add.png b/asset/icon/Icon32/layer_add.png new file mode 100644 index 0000000..86abd9a Binary files /dev/null and b/asset/icon/Icon32/layer_add.png differ diff --git a/asset/icon/Icon32/layer_arrange.png b/asset/icon/Icon32/layer_arrange.png new file mode 100644 index 0000000..076f8d6 Binary files /dev/null and b/asset/icon/Icon32/layer_arrange.png differ diff --git a/asset/icon/Icon32/layer_arrange_back.png b/asset/icon/Icon32/layer_arrange_back.png new file mode 100644 index 0000000..852bd35 Binary files /dev/null and b/asset/icon/Icon32/layer_arrange_back.png differ diff --git a/asset/icon/Icon32/layer_aspect_arrow.png b/asset/icon/Icon32/layer_aspect_arrow.png new file mode 100644 index 0000000..6fb10e7 Binary files /dev/null and b/asset/icon/Icon32/layer_aspect_arrow.png differ diff --git a/asset/icon/Icon32/layer_cell_cats.png b/asset/icon/Icon32/layer_cell_cats.png new file mode 100644 index 0000000..629f906 Binary files /dev/null and b/asset/icon/Icon32/layer_cell_cats.png differ diff --git a/asset/icon/Icon32/layer_chart.png b/asset/icon/Icon32/layer_chart.png new file mode 100644 index 0000000..b311c32 Binary files /dev/null and b/asset/icon/Icon32/layer_chart.png differ diff --git a/asset/icon/Icon32/layer_command.png b/asset/icon/Icon32/layer_command.png new file mode 100644 index 0000000..b7e359f Binary files /dev/null and b/asset/icon/Icon32/layer_command.png differ diff --git a/asset/icon/Icon32/layer_create.png b/asset/icon/Icon32/layer_create.png new file mode 100644 index 0000000..f9d9712 Binary files /dev/null and b/asset/icon/Icon32/layer_create.png differ diff --git a/asset/icon/Icon32/layer_database.png b/asset/icon/Icon32/layer_database.png new file mode 100644 index 0000000..3af8a3c Binary files /dev/null and b/asset/icon/Icon32/layer_database.png differ diff --git a/asset/icon/Icon32/layer_delete.png b/asset/icon/Icon32/layer_delete.png new file mode 100644 index 0000000..ee33541 Binary files /dev/null and b/asset/icon/Icon32/layer_delete.png differ diff --git a/asset/icon/Icon32/layer_edit.png b/asset/icon/Icon32/layer_edit.png new file mode 100644 index 0000000..3743275 Binary files /dev/null and b/asset/icon/Icon32/layer_edit.png differ diff --git a/asset/icon/Icon32/layer_export.png b/asset/icon/Icon32/layer_export.png new file mode 100644 index 0000000..4026deb Binary files /dev/null and b/asset/icon/Icon32/layer_export.png differ diff --git a/asset/icon/Icon32/layer_gps.png b/asset/icon/Icon32/layer_gps.png new file mode 100644 index 0000000..858dd2e Binary files /dev/null and b/asset/icon/Icon32/layer_gps.png differ diff --git a/asset/icon/Icon32/layer_grid.png b/asset/icon/Icon32/layer_grid.png new file mode 100644 index 0000000..1739a49 Binary files /dev/null and b/asset/icon/Icon32/layer_grid.png differ diff --git a/asset/icon/Icon32/layer_group.png b/asset/icon/Icon32/layer_group.png new file mode 100644 index 0000000..481b25d Binary files /dev/null and b/asset/icon/Icon32/layer_group.png differ diff --git a/asset/icon/Icon32/layer_his.png b/asset/icon/Icon32/layer_his.png new file mode 100644 index 0000000..23d0795 Binary files /dev/null and b/asset/icon/Icon32/layer_his.png differ diff --git a/asset/icon/Icon32/layer_histogram.png b/asset/icon/Icon32/layer_histogram.png new file mode 100644 index 0000000..371a62c Binary files /dev/null and b/asset/icon/Icon32/layer_histogram.png differ diff --git a/asset/icon/Icon32/layer_import.png b/asset/icon/Icon32/layer_import.png new file mode 100644 index 0000000..57d7076 Binary files /dev/null and b/asset/icon/Icon32/layer_import.png differ diff --git a/asset/icon/Icon32/layer_label.png b/asset/icon/Icon32/layer_label.png new file mode 100644 index 0000000..993b25d Binary files /dev/null and b/asset/icon/Icon32/layer_label.png differ diff --git a/asset/icon/Icon32/layer_mask.png b/asset/icon/Icon32/layer_mask.png new file mode 100644 index 0000000..aa458e7 Binary files /dev/null and b/asset/icon/Icon32/layer_mask.png differ diff --git a/asset/icon/Icon32/layer_open.png b/asset/icon/Icon32/layer_open.png new file mode 100644 index 0000000..1239fe8 Binary files /dev/null and b/asset/icon/Icon32/layer_open.png differ diff --git a/asset/icon/Icon32/layer_raster.png b/asset/icon/Icon32/layer_raster.png new file mode 100644 index 0000000..6e4a02f Binary files /dev/null and b/asset/icon/Icon32/layer_raster.png differ diff --git a/asset/icon/Icon32/layer_raster_3d.png b/asset/icon/Icon32/layer_raster_3d.png new file mode 100644 index 0000000..eef4a7b Binary files /dev/null and b/asset/icon/Icon32/layer_raster_3d.png differ diff --git a/asset/icon/Icon32/layer_redraw.png b/asset/icon/Icon32/layer_redraw.png new file mode 100644 index 0000000..eff6202 Binary files /dev/null and b/asset/icon/Icon32/layer_redraw.png differ diff --git a/asset/icon/Icon32/layer_remove.png b/asset/icon/Icon32/layer_remove.png new file mode 100644 index 0000000..b6fabbc Binary files /dev/null and b/asset/icon/Icon32/layer_remove.png differ diff --git a/asset/icon/Icon32/layer_resize.png b/asset/icon/Icon32/layer_resize.png new file mode 100644 index 0000000..0a7d9a9 Binary files /dev/null and b/asset/icon/Icon32/layer_resize.png differ diff --git a/asset/icon/Icon32/layer_resize_actual.png b/asset/icon/Icon32/layer_resize_actual.png new file mode 100644 index 0000000..de66350 Binary files /dev/null and b/asset/icon/Icon32/layer_resize_actual.png differ diff --git a/asset/icon/Icon32/layer_resize_replicate_h.png b/asset/icon/Icon32/layer_resize_replicate_h.png new file mode 100644 index 0000000..1eed9e0 Binary files /dev/null and b/asset/icon/Icon32/layer_resize_replicate_h.png differ diff --git a/asset/icon/Icon32/layer_resize_replicate_v.png b/asset/icon/Icon32/layer_resize_replicate_v.png new file mode 100644 index 0000000..2f1d5c6 Binary files /dev/null and b/asset/icon/Icon32/layer_resize_replicate_v.png differ diff --git a/asset/icon/Icon32/layer_rgb.png b/asset/icon/Icon32/layer_rgb.png new file mode 100644 index 0000000..846bd88 Binary files /dev/null and b/asset/icon/Icon32/layer_rgb.png differ diff --git a/asset/icon/Icon32/layer_save.png b/asset/icon/Icon32/layer_save.png new file mode 100644 index 0000000..ff8a511 Binary files /dev/null and b/asset/icon/Icon32/layer_save.png differ diff --git a/asset/icon/Icon32/layer_select.png b/asset/icon/Icon32/layer_select.png new file mode 100644 index 0000000..9970e1b Binary files /dev/null and b/asset/icon/Icon32/layer_select.png differ diff --git a/asset/icon/Icon32/layer_shade.png b/asset/icon/Icon32/layer_shade.png new file mode 100644 index 0000000..3689c9a Binary files /dev/null and b/asset/icon/Icon32/layer_shade.png differ diff --git a/asset/icon/Icon32/layer_shaded_relief.png b/asset/icon/Icon32/layer_shaded_relief.png new file mode 100644 index 0000000..9ff7811 Binary files /dev/null and b/asset/icon/Icon32/layer_shaded_relief.png differ diff --git a/asset/icon/Icon32/layer_shape.png b/asset/icon/Icon32/layer_shape.png new file mode 100644 index 0000000..7fa8d5b Binary files /dev/null and b/asset/icon/Icon32/layer_shape.png differ diff --git a/asset/icon/Icon32/layer_shape_ellipse.png b/asset/icon/Icon32/layer_shape_ellipse.png new file mode 100644 index 0000000..1b7bec6 Binary files /dev/null and b/asset/icon/Icon32/layer_shape_ellipse.png differ diff --git a/asset/icon/Icon32/layer_shape_polyline.png b/asset/icon/Icon32/layer_shape_polyline.png new file mode 100644 index 0000000..b0aed33 Binary files /dev/null and b/asset/icon/Icon32/layer_shape_polyline.png differ diff --git a/asset/icon/Icon32/layer_shape_round.png b/asset/icon/Icon32/layer_shape_round.png new file mode 100644 index 0000000..f17bfcc Binary files /dev/null and b/asset/icon/Icon32/layer_shape_round.png differ diff --git a/asset/icon/Icon32/layer_shape_text.png b/asset/icon/Icon32/layer_shape_text.png new file mode 100644 index 0000000..5df6bd3 Binary files /dev/null and b/asset/icon/Icon32/layer_shape_text.png differ diff --git a/asset/icon/Icon32/layer_shred.png b/asset/icon/Icon32/layer_shred.png new file mode 100644 index 0000000..072486d Binary files /dev/null and b/asset/icon/Icon32/layer_shred.png differ diff --git a/asset/icon/Icon32/layer_stack_arrange.png b/asset/icon/Icon32/layer_stack_arrange.png new file mode 100644 index 0000000..6019b58 Binary files /dev/null and b/asset/icon/Icon32/layer_stack_arrange.png differ diff --git a/asset/icon/Icon32/layer_stack_arrange_back.png b/asset/icon/Icon32/layer_stack_arrange_back.png new file mode 100644 index 0000000..c6a4ada Binary files /dev/null and b/asset/icon/Icon32/layer_stack_arrange_back.png differ diff --git a/asset/icon/Icon32/layer_to_image_size.png b/asset/icon/Icon32/layer_to_image_size.png new file mode 100644 index 0000000..e6f64b0 Binary files /dev/null and b/asset/icon/Icon32/layer_to_image_size.png differ diff --git a/asset/icon/Icon32/layer_transparent.png b/asset/icon/Icon32/layer_transparent.png new file mode 100644 index 0000000..8bef9bb Binary files /dev/null and b/asset/icon/Icon32/layer_transparent.png differ diff --git a/asset/icon/Icon32/layer_vector.png b/asset/icon/Icon32/layer_vector.png new file mode 100644 index 0000000..8f40ba0 Binary files /dev/null and b/asset/icon/Icon32/layer_vector.png differ diff --git a/asset/icon/Icon32/layer_wms.png b/asset/icon/Icon32/layer_wms.png new file mode 100644 index 0000000..e180850 Binary files /dev/null and b/asset/icon/Icon32/layer_wms.png differ diff --git a/asset/icon/Icon32/layered_pane.png b/asset/icon/Icon32/layered_pane.png new file mode 100644 index 0000000..b645414 Binary files /dev/null and b/asset/icon/Icon32/layered_pane.png differ diff --git a/asset/icon/Icon32/layers.png b/asset/icon/Icon32/layers.png new file mode 100644 index 0000000..2350284 Binary files /dev/null and b/asset/icon/Icon32/layers.png differ diff --git a/asset/icon/Icon32/layers_map.png b/asset/icon/Icon32/layers_map.png new file mode 100644 index 0000000..1d5e512 Binary files /dev/null and b/asset/icon/Icon32/layers_map.png differ diff --git a/asset/icon/Icon32/layout.png b/asset/icon/Icon32/layout.png new file mode 100644 index 0000000..2b2bb81 Binary files /dev/null and b/asset/icon/Icon32/layout.png differ diff --git a/asset/icon/Icon32/layout_add.png b/asset/icon/Icon32/layout_add.png new file mode 100644 index 0000000..acbe8ae Binary files /dev/null and b/asset/icon/Icon32/layout_add.png differ diff --git a/asset/icon/Icon32/layout_content.png b/asset/icon/Icon32/layout_content.png new file mode 100644 index 0000000..344811b Binary files /dev/null and b/asset/icon/Icon32/layout_content.png differ diff --git a/asset/icon/Icon32/layout_delete.png b/asset/icon/Icon32/layout_delete.png new file mode 100644 index 0000000..aea1fd9 Binary files /dev/null and b/asset/icon/Icon32/layout_delete.png differ diff --git a/asset/icon/Icon32/layout_edit.png b/asset/icon/Icon32/layout_edit.png new file mode 100644 index 0000000..629d8a6 Binary files /dev/null and b/asset/icon/Icon32/layout_edit.png differ diff --git a/asset/icon/Icon32/layout_error.png b/asset/icon/Icon32/layout_error.png new file mode 100644 index 0000000..5b82f5c Binary files /dev/null and b/asset/icon/Icon32/layout_error.png differ diff --git a/asset/icon/Icon32/layout_header.png b/asset/icon/Icon32/layout_header.png new file mode 100644 index 0000000..8ef5195 Binary files /dev/null and b/asset/icon/Icon32/layout_header.png differ diff --git a/asset/icon/Icon32/layout_link.png b/asset/icon/Icon32/layout_link.png new file mode 100644 index 0000000..1e54c33 Binary files /dev/null and b/asset/icon/Icon32/layout_link.png differ diff --git a/asset/icon/Icon32/layout_panel.png b/asset/icon/Icon32/layout_panel.png new file mode 100644 index 0000000..9b9fdc7 Binary files /dev/null and b/asset/icon/Icon32/layout_panel.png differ diff --git a/asset/icon/Icon32/layout_sidebar.png b/asset/icon/Icon32/layout_sidebar.png new file mode 100644 index 0000000..fff8da0 Binary files /dev/null and b/asset/icon/Icon32/layout_sidebar.png differ diff --git a/asset/icon/Icon32/layouts.png b/asset/icon/Icon32/layouts.png new file mode 100644 index 0000000..3b7eff2 Binary files /dev/null and b/asset/icon/Icon32/layouts.png differ diff --git a/asset/icon/Icon32/layouts_2.png b/asset/icon/Icon32/layouts_2.png new file mode 100644 index 0000000..74051af Binary files /dev/null and b/asset/icon/Icon32/layouts_2.png differ diff --git a/asset/icon/Icon32/layouts_3.png b/asset/icon/Icon32/layouts_3.png new file mode 100644 index 0000000..412b49f Binary files /dev/null and b/asset/icon/Icon32/layouts_3.png differ diff --git a/asset/icon/Icon32/layouts_3_mix.png b/asset/icon/Icon32/layouts_3_mix.png new file mode 100644 index 0000000..ad64ba5 Binary files /dev/null and b/asset/icon/Icon32/layouts_3_mix.png differ diff --git a/asset/icon/Icon32/layouts_4.png b/asset/icon/Icon32/layouts_4.png new file mode 100644 index 0000000..2473593 Binary files /dev/null and b/asset/icon/Icon32/layouts_4.png differ diff --git a/asset/icon/Icon32/layouts_6.png b/asset/icon/Icon32/layouts_6.png new file mode 100644 index 0000000..1b4f5b3 Binary files /dev/null and b/asset/icon/Icon32/layouts_6.png differ diff --git a/asset/icon/Icon32/layouts_design.png b/asset/icon/Icon32/layouts_design.png new file mode 100644 index 0000000..aeea6d9 Binary files /dev/null and b/asset/icon/Icon32/layouts_design.png differ diff --git a/asset/icon/Icon32/layouts_header.png b/asset/icon/Icon32/layouts_header.png new file mode 100644 index 0000000..181bf3e Binary files /dev/null and b/asset/icon/Icon32/layouts_header.png differ diff --git a/asset/icon/Icon32/layouts_header_2.png b/asset/icon/Icon32/layouts_header_2.png new file mode 100644 index 0000000..6416f8f Binary files /dev/null and b/asset/icon/Icon32/layouts_header_2.png differ diff --git a/asset/icon/Icon32/layouts_header_2_equal.png b/asset/icon/Icon32/layouts_header_2_equal.png new file mode 100644 index 0000000..96b6a69 Binary files /dev/null and b/asset/icon/Icon32/layouts_header_2_equal.png differ diff --git a/asset/icon/Icon32/layouts_header_3.png b/asset/icon/Icon32/layouts_header_3.png new file mode 100644 index 0000000..2372bf1 Binary files /dev/null and b/asset/icon/Icon32/layouts_header_3.png differ diff --git a/asset/icon/Icon32/layouts_header_3_mix.png b/asset/icon/Icon32/layouts_header_3_mix.png new file mode 100644 index 0000000..a385b97 Binary files /dev/null and b/asset/icon/Icon32/layouts_header_3_mix.png differ diff --git a/asset/icon/Icon32/layouts_header_footer.png b/asset/icon/Icon32/layouts_header_footer.png new file mode 100644 index 0000000..a601b93 Binary files /dev/null and b/asset/icon/Icon32/layouts_header_footer.png differ diff --git a/asset/icon/Icon32/layouts_header_footer_2.png b/asset/icon/Icon32/layouts_header_footer_2.png new file mode 100644 index 0000000..2bf0613 Binary files /dev/null and b/asset/icon/Icon32/layouts_header_footer_2.png differ diff --git a/asset/icon/Icon32/layouts_header_footer_3.png b/asset/icon/Icon32/layouts_header_footer_3.png new file mode 100644 index 0000000..30a9fb6 Binary files /dev/null and b/asset/icon/Icon32/layouts_header_footer_3.png differ diff --git a/asset/icon/Icon32/layouts_hf_2_equal.png b/asset/icon/Icon32/layouts_hf_2_equal.png new file mode 100644 index 0000000..70ea4b3 Binary files /dev/null and b/asset/icon/Icon32/layouts_hf_2_equal.png differ diff --git a/asset/icon/Icon32/layouts_hf_3.png b/asset/icon/Icon32/layouts_hf_3.png new file mode 100644 index 0000000..4f95d34 Binary files /dev/null and b/asset/icon/Icon32/layouts_hf_3.png differ diff --git a/asset/icon/Icon32/layouts_join.png b/asset/icon/Icon32/layouts_join.png new file mode 100644 index 0000000..f3cbd20 Binary files /dev/null and b/asset/icon/Icon32/layouts_join.png differ diff --git a/asset/icon/Icon32/layouts_join_vertical.png b/asset/icon/Icon32/layouts_join_vertical.png new file mode 100644 index 0000000..ef37340 Binary files /dev/null and b/asset/icon/Icon32/layouts_join_vertical.png differ diff --git a/asset/icon/Icon32/layouts_select.png b/asset/icon/Icon32/layouts_select.png new file mode 100644 index 0000000..9fa4be2 Binary files /dev/null and b/asset/icon/Icon32/layouts_select.png differ diff --git a/asset/icon/Icon32/layouts_select_content.png b/asset/icon/Icon32/layouts_select_content.png new file mode 100644 index 0000000..a97145b Binary files /dev/null and b/asset/icon/Icon32/layouts_select_content.png differ diff --git a/asset/icon/Icon32/layouts_select_footer.png b/asset/icon/Icon32/layouts_select_footer.png new file mode 100644 index 0000000..21602ef Binary files /dev/null and b/asset/icon/Icon32/layouts_select_footer.png differ diff --git a/asset/icon/Icon32/layouts_select_sidebar.png b/asset/icon/Icon32/layouts_select_sidebar.png new file mode 100644 index 0000000..27f31be Binary files /dev/null and b/asset/icon/Icon32/layouts_select_sidebar.png differ diff --git a/asset/icon/Icon32/layouts_split.png b/asset/icon/Icon32/layouts_split.png new file mode 100644 index 0000000..57e3b9d Binary files /dev/null and b/asset/icon/Icon32/layouts_split.png differ diff --git a/asset/icon/Icon32/layouts_split_vertical.png b/asset/icon/Icon32/layouts_split_vertical.png new file mode 100644 index 0000000..b279d03 Binary files /dev/null and b/asset/icon/Icon32/layouts_split_vertical.png differ diff --git a/asset/icon/Icon32/lcd_tv.png b/asset/icon/Icon32/lcd_tv.png new file mode 100644 index 0000000..369fee7 Binary files /dev/null and b/asset/icon/Icon32/lcd_tv.png differ diff --git a/asset/icon/Icon32/lcd_tv_image.png b/asset/icon/Icon32/lcd_tv_image.png new file mode 100644 index 0000000..5207500 Binary files /dev/null and b/asset/icon/Icon32/lcd_tv_image.png differ diff --git a/asset/icon/Icon32/lcd_tv_off.png b/asset/icon/Icon32/lcd_tv_off.png new file mode 100644 index 0000000..d1a4a71 Binary files /dev/null and b/asset/icon/Icon32/lcd_tv_off.png differ diff --git a/asset/icon/Icon32/lcd_tv_test.png b/asset/icon/Icon32/lcd_tv_test.png new file mode 100644 index 0000000..0b37f29 Binary files /dev/null and b/asset/icon/Icon32/lcd_tv_test.png differ diff --git a/asset/icon/Icon32/leaf_plant.png b/asset/icon/Icon32/leaf_plant.png new file mode 100644 index 0000000..d624bdd Binary files /dev/null and b/asset/icon/Icon32/leaf_plant.png differ diff --git a/asset/icon/Icon32/led.png b/asset/icon/Icon32/led.png new file mode 100644 index 0000000..c4df5c5 Binary files /dev/null and b/asset/icon/Icon32/led.png differ diff --git a/asset/icon/Icon32/leech_protect.png b/asset/icon/Icon32/leech_protect.png new file mode 100644 index 0000000..6e6b250 Binary files /dev/null and b/asset/icon/Icon32/leech_protect.png differ diff --git a/asset/icon/Icon32/legend.png b/asset/icon/Icon32/legend.png new file mode 100644 index 0000000..870380d Binary files /dev/null and b/asset/icon/Icon32/legend.png differ diff --git a/asset/icon/Icon32/license_key.png b/asset/icon/Icon32/license_key.png new file mode 100644 index 0000000..c0ebde4 Binary files /dev/null and b/asset/icon/Icon32/license_key.png differ diff --git a/asset/icon/Icon32/license_management.png b/asset/icon/Icon32/license_management.png new file mode 100644 index 0000000..42dbe9d Binary files /dev/null and b/asset/icon/Icon32/license_management.png differ diff --git a/asset/icon/Icon32/life_vest.png b/asset/icon/Icon32/life_vest.png new file mode 100644 index 0000000..6942916 Binary files /dev/null and b/asset/icon/Icon32/life_vest.png differ diff --git a/asset/icon/Icon32/light_circle_green.png b/asset/icon/Icon32/light_circle_green.png new file mode 100644 index 0000000..1b63419 Binary files /dev/null and b/asset/icon/Icon32/light_circle_green.png differ diff --git a/asset/icon/Icon32/lightbulb.png b/asset/icon/Icon32/lightbulb.png new file mode 100644 index 0000000..17181a9 Binary files /dev/null and b/asset/icon/Icon32/lightbulb.png differ diff --git a/asset/icon/Icon32/lightbulb_add.png b/asset/icon/Icon32/lightbulb_add.png new file mode 100644 index 0000000..7460ce3 Binary files /dev/null and b/asset/icon/Icon32/lightbulb_add.png differ diff --git a/asset/icon/Icon32/lightbulb_delete.png b/asset/icon/Icon32/lightbulb_delete.png new file mode 100644 index 0000000..eb3326a Binary files /dev/null and b/asset/icon/Icon32/lightbulb_delete.png differ diff --git a/asset/icon/Icon32/lightbulb_off.png b/asset/icon/Icon32/lightbulb_off.png new file mode 100644 index 0000000..9516ef3 Binary files /dev/null and b/asset/icon/Icon32/lightbulb_off.png differ diff --git a/asset/icon/Icon32/lighthouse(2).png b/asset/icon/Icon32/lighthouse(2).png new file mode 100644 index 0000000..e285aba Binary files /dev/null and b/asset/icon/Icon32/lighthouse(2).png differ diff --git a/asset/icon/Icon32/lighthouse.png b/asset/icon/Icon32/lighthouse.png new file mode 100644 index 0000000..dec7ff1 Binary files /dev/null and b/asset/icon/Icon32/lighthouse.png differ diff --git a/asset/icon/Icon32/lightning.png b/asset/icon/Icon32/lightning.png new file mode 100644 index 0000000..df8dffc Binary files /dev/null and b/asset/icon/Icon32/lightning.png differ diff --git a/asset/icon/Icon32/lightning_add.png b/asset/icon/Icon32/lightning_add.png new file mode 100644 index 0000000..0fbe328 Binary files /dev/null and b/asset/icon/Icon32/lightning_add.png differ diff --git a/asset/icon/Icon32/lightning_delete.png b/asset/icon/Icon32/lightning_delete.png new file mode 100644 index 0000000..9253d67 Binary files /dev/null and b/asset/icon/Icon32/lightning_delete.png differ diff --git a/asset/icon/Icon32/lightning_go.png b/asset/icon/Icon32/lightning_go.png new file mode 100644 index 0000000..33833b4 Binary files /dev/null and b/asset/icon/Icon32/lightning_go.png differ diff --git a/asset/icon/Icon32/limit_bandwidth_usage.png b/asset/icon/Icon32/limit_bandwidth_usage.png new file mode 100644 index 0000000..783aabc Binary files /dev/null and b/asset/icon/Icon32/limit_bandwidth_usage.png differ diff --git a/asset/icon/Icon32/line_height.png b/asset/icon/Icon32/line_height.png new file mode 100644 index 0000000..29aa549 Binary files /dev/null and b/asset/icon/Icon32/line_height.png differ diff --git a/asset/icon/Icon32/line_numbers.png b/asset/icon/Icon32/line_numbers.png new file mode 100644 index 0000000..1dbaac7 Binary files /dev/null and b/asset/icon/Icon32/line_numbers.png differ diff --git a/asset/icon/Icon32/line_split.png b/asset/icon/Icon32/line_split.png new file mode 100644 index 0000000..eccc258 Binary files /dev/null and b/asset/icon/Icon32/line_split.png differ diff --git a/asset/icon/Icon32/linechart.png b/asset/icon/Icon32/linechart.png new file mode 100644 index 0000000..67ceb52 Binary files /dev/null and b/asset/icon/Icon32/linechart.png differ diff --git a/asset/icon/Icon32/link.png b/asset/icon/Icon32/link.png new file mode 100644 index 0000000..b0c35b5 Binary files /dev/null and b/asset/icon/Icon32/link.png differ diff --git a/asset/icon/Icon32/link_add.png b/asset/icon/Icon32/link_add.png new file mode 100644 index 0000000..391234f Binary files /dev/null and b/asset/icon/Icon32/link_add.png differ diff --git a/asset/icon/Icon32/link_break.png b/asset/icon/Icon32/link_break.png new file mode 100644 index 0000000..5080d0e Binary files /dev/null and b/asset/icon/Icon32/link_break.png differ diff --git a/asset/icon/Icon32/link_button.png b/asset/icon/Icon32/link_button.png new file mode 100644 index 0000000..31917e6 Binary files /dev/null and b/asset/icon/Icon32/link_button.png differ diff --git a/asset/icon/Icon32/link_delete.png b/asset/icon/Icon32/link_delete.png new file mode 100644 index 0000000..b584c29 Binary files /dev/null and b/asset/icon/Icon32/link_delete.png differ diff --git a/asset/icon/Icon32/link_edit.png b/asset/icon/Icon32/link_edit.png new file mode 100644 index 0000000..816d654 Binary files /dev/null and b/asset/icon/Icon32/link_edit.png differ diff --git a/asset/icon/Icon32/link_go.png b/asset/icon/Icon32/link_go.png new file mode 100644 index 0000000..c5e04fa Binary files /dev/null and b/asset/icon/Icon32/link_go.png differ diff --git a/asset/icon/Icon32/link_juice.png b/asset/icon/Icon32/link_juice.png new file mode 100644 index 0000000..19e30e9 Binary files /dev/null and b/asset/icon/Icon32/link_juice.png differ diff --git a/asset/icon/Icon32/link_unchain.png b/asset/icon/Icon32/link_unchain.png new file mode 100644 index 0000000..fd7774e Binary files /dev/null and b/asset/icon/Icon32/link_unchain.png differ diff --git a/asset/icon/Icon32/linkbar.png b/asset/icon/Icon32/linkbar.png new file mode 100644 index 0000000..76a7e3c Binary files /dev/null and b/asset/icon/Icon32/linkbar.png differ diff --git a/asset/icon/Icon32/linkedin.png b/asset/icon/Icon32/linkedin.png new file mode 100644 index 0000000..47980c9 Binary files /dev/null and b/asset/icon/Icon32/linkedin.png differ diff --git a/asset/icon/Icon32/linux_mint.png b/asset/icon/Icon32/linux_mint.png new file mode 100644 index 0000000..3223884 Binary files /dev/null and b/asset/icon/Icon32/linux_mint.png differ diff --git a/asset/icon/Icon32/list.png b/asset/icon/Icon32/list.png new file mode 100644 index 0000000..6709703 Binary files /dev/null and b/asset/icon/Icon32/list.png differ diff --git a/asset/icon/Icon32/list_box.png b/asset/icon/Icon32/list_box.png new file mode 100644 index 0000000..bd5819f Binary files /dev/null and b/asset/icon/Icon32/list_box.png differ diff --git a/asset/icon/Icon32/list_suspended_accounts.png b/asset/icon/Icon32/list_suspended_accounts.png new file mode 100644 index 0000000..f2eee43 Binary files /dev/null and b/asset/icon/Icon32/list_suspended_accounts.png differ diff --git a/asset/icon/Icon32/livejournal.png b/asset/icon/Icon32/livejournal.png new file mode 100644 index 0000000..65a5710 Binary files /dev/null and b/asset/icon/Icon32/livejournal.png differ diff --git a/asset/icon/Icon32/locale_xml.png b/asset/icon/Icon32/locale_xml.png new file mode 100644 index 0000000..ed38a38 Binary files /dev/null and b/asset/icon/Icon32/locale_xml.png differ diff --git a/asset/icon/Icon32/locate.png b/asset/icon/Icon32/locate.png new file mode 100644 index 0000000..dd65538 Binary files /dev/null and b/asset/icon/Icon32/locate.png differ diff --git a/asset/icon/Icon32/location_pin.png b/asset/icon/Icon32/location_pin.png new file mode 100644 index 0000000..3b954dc Binary files /dev/null and b/asset/icon/Icon32/location_pin.png differ diff --git a/asset/icon/Icon32/lock.png b/asset/icon/Icon32/lock.png new file mode 100644 index 0000000..ceebba9 Binary files /dev/null and b/asset/icon/Icon32/lock.png differ diff --git a/asset/icon/Icon32/lock_add.png b/asset/icon/Icon32/lock_add.png new file mode 100644 index 0000000..0d4987b Binary files /dev/null and b/asset/icon/Icon32/lock_add.png differ diff --git a/asset/icon/Icon32/lock_break.png b/asset/icon/Icon32/lock_break.png new file mode 100644 index 0000000..5466f53 Binary files /dev/null and b/asset/icon/Icon32/lock_break.png differ diff --git a/asset/icon/Icon32/lock_delete.png b/asset/icon/Icon32/lock_delete.png new file mode 100644 index 0000000..ad5847c Binary files /dev/null and b/asset/icon/Icon32/lock_delete.png differ diff --git a/asset/icon/Icon32/lock_edit.png b/asset/icon/Icon32/lock_edit.png new file mode 100644 index 0000000..ff118fe Binary files /dev/null and b/asset/icon/Icon32/lock_edit.png differ diff --git a/asset/icon/Icon32/lock_go.png b/asset/icon/Icon32/lock_go.png new file mode 100644 index 0000000..7d3bb3f Binary files /dev/null and b/asset/icon/Icon32/lock_go.png differ diff --git a/asset/icon/Icon32/lock_open.png b/asset/icon/Icon32/lock_open.png new file mode 100644 index 0000000..3430e49 Binary files /dev/null and b/asset/icon/Icon32/lock_open.png differ diff --git a/asset/icon/Icon32/logic_functions.png b/asset/icon/Icon32/logic_functions.png new file mode 100644 index 0000000..043211e Binary files /dev/null and b/asset/icon/Icon32/logic_functions.png differ diff --git a/asset/icon/Icon32/lollipop.png b/asset/icon/Icon32/lollipop.png new file mode 100644 index 0000000..755746c Binary files /dev/null and b/asset/icon/Icon32/lollipop.png differ diff --git a/asset/icon/Icon32/lollypop.png b/asset/icon/Icon32/lollypop.png new file mode 100644 index 0000000..ac21adf Binary files /dev/null and b/asset/icon/Icon32/lollypop.png differ diff --git a/asset/icon/Icon32/lorry.png b/asset/icon/Icon32/lorry.png new file mode 100644 index 0000000..3627afc Binary files /dev/null and b/asset/icon/Icon32/lorry.png differ diff --git a/asset/icon/Icon32/lorry_add.png b/asset/icon/Icon32/lorry_add.png new file mode 100644 index 0000000..6b4bc4f Binary files /dev/null and b/asset/icon/Icon32/lorry_add.png differ diff --git a/asset/icon/Icon32/lorry_box.png b/asset/icon/Icon32/lorry_box.png new file mode 100644 index 0000000..5381c83 Binary files /dev/null and b/asset/icon/Icon32/lorry_box.png differ diff --git a/asset/icon/Icon32/lorry_delete.png b/asset/icon/Icon32/lorry_delete.png new file mode 100644 index 0000000..c347d1b Binary files /dev/null and b/asset/icon/Icon32/lorry_delete.png differ diff --git a/asset/icon/Icon32/lorry_error.png b/asset/icon/Icon32/lorry_error.png new file mode 100644 index 0000000..e270312 Binary files /dev/null and b/asset/icon/Icon32/lorry_error.png differ diff --git a/asset/icon/Icon32/lorry_flatbed.png b/asset/icon/Icon32/lorry_flatbed.png new file mode 100644 index 0000000..2a56cf6 Binary files /dev/null and b/asset/icon/Icon32/lorry_flatbed.png differ diff --git a/asset/icon/Icon32/lorry_go.png b/asset/icon/Icon32/lorry_go.png new file mode 100644 index 0000000..03486ec Binary files /dev/null and b/asset/icon/Icon32/lorry_go.png differ diff --git a/asset/icon/Icon32/lorry_link.png b/asset/icon/Icon32/lorry_link.png new file mode 100644 index 0000000..7522452 Binary files /dev/null and b/asset/icon/Icon32/lorry_link.png differ diff --git a/asset/icon/Icon32/luggage.png b/asset/icon/Icon32/luggage.png new file mode 100644 index 0000000..672f561 Binary files /dev/null and b/asset/icon/Icon32/luggage.png differ diff --git a/asset/icon/Icon32/luggage_brown.png b/asset/icon/Icon32/luggage_brown.png new file mode 100644 index 0000000..1156986 Binary files /dev/null and b/asset/icon/Icon32/luggage_brown.png differ diff --git a/asset/icon/Icon32/luggage_brown_tag.png b/asset/icon/Icon32/luggage_brown_tag.png new file mode 100644 index 0000000..7840ade Binary files /dev/null and b/asset/icon/Icon32/luggage_brown_tag.png differ diff --git a/asset/icon/Icon32/magic_wand_2.png b/asset/icon/Icon32/magic_wand_2.png new file mode 100644 index 0000000..d99eec4 Binary files /dev/null and b/asset/icon/Icon32/magic_wand_2.png differ diff --git a/asset/icon/Icon32/magnet.png b/asset/icon/Icon32/magnet.png new file mode 100644 index 0000000..35c0db5 Binary files /dev/null and b/asset/icon/Icon32/magnet.png differ diff --git a/asset/icon/Icon32/magnifier.png b/asset/icon/Icon32/magnifier.png new file mode 100644 index 0000000..9cbc361 Binary files /dev/null and b/asset/icon/Icon32/magnifier.png differ diff --git a/asset/icon/Icon32/magnifier_zoom_in.png b/asset/icon/Icon32/magnifier_zoom_in.png new file mode 100644 index 0000000..18e4383 Binary files /dev/null and b/asset/icon/Icon32/magnifier_zoom_in.png differ diff --git a/asset/icon/Icon32/magnifier_zoom_out.png b/asset/icon/Icon32/magnifier_zoom_out.png new file mode 100644 index 0000000..2bdc37a Binary files /dev/null and b/asset/icon/Icon32/magnifier_zoom_out.png differ diff --git a/asset/icon/Icon32/mail_black.png b/asset/icon/Icon32/mail_black.png new file mode 100644 index 0000000..5fe204b Binary files /dev/null and b/asset/icon/Icon32/mail_black.png differ diff --git a/asset/icon/Icon32/mail_box.png b/asset/icon/Icon32/mail_box.png new file mode 100644 index 0000000..44c59ca Binary files /dev/null and b/asset/icon/Icon32/mail_box.png differ diff --git a/asset/icon/Icon32/mail_green.png b/asset/icon/Icon32/mail_green.png new file mode 100644 index 0000000..8f68de8 Binary files /dev/null and b/asset/icon/Icon32/mail_green.png differ diff --git a/asset/icon/Icon32/mail_red.png b/asset/icon/Icon32/mail_red.png new file mode 100644 index 0000000..c71ad64 Binary files /dev/null and b/asset/icon/Icon32/mail_red.png differ diff --git a/asset/icon/Icon32/mail_server_exim.png b/asset/icon/Icon32/mail_server_exim.png new file mode 100644 index 0000000..1be96ac Binary files /dev/null and b/asset/icon/Icon32/mail_server_exim.png differ diff --git a/asset/icon/Icon32/mail_server_setting.png b/asset/icon/Icon32/mail_server_setting.png new file mode 100644 index 0000000..51407b1 Binary files /dev/null and b/asset/icon/Icon32/mail_server_setting.png differ diff --git a/asset/icon/Icon32/mail_torn.png b/asset/icon/Icon32/mail_torn.png new file mode 100644 index 0000000..2c6107a Binary files /dev/null and b/asset/icon/Icon32/mail_torn.png differ diff --git a/asset/icon/Icon32/mail_yellow.png b/asset/icon/Icon32/mail_yellow.png new file mode 100644 index 0000000..609572f Binary files /dev/null and b/asset/icon/Icon32/mail_yellow.png differ diff --git a/asset/icon/Icon32/mailing_list.png b/asset/icon/Icon32/mailing_list.png new file mode 100644 index 0000000..9b297ca Binary files /dev/null and b/asset/icon/Icon32/mailing_list.png differ diff --git a/asset/icon/Icon32/mailing_list_manager_mailman.png b/asset/icon/Icon32/mailing_list_manager_mailman.png new file mode 100644 index 0000000..4b5e1f0 Binary files /dev/null and b/asset/icon/Icon32/mailing_list_manager_mailman.png differ diff --git a/asset/icon/Icon32/male.png b/asset/icon/Icon32/male.png new file mode 100644 index 0000000..44d1164 Binary files /dev/null and b/asset/icon/Icon32/male.png differ diff --git a/asset/icon/Icon32/manage_sources.png b/asset/icon/Icon32/manage_sources.png new file mode 100644 index 0000000..e71f520 Binary files /dev/null and b/asset/icon/Icon32/manage_sources.png differ diff --git a/asset/icon/Icon32/manage_ssl_hosts.png b/asset/icon/Icon32/manage_ssl_hosts.png new file mode 100644 index 0000000..dfaac5f Binary files /dev/null and b/asset/icon/Icon32/manage_ssl_hosts.png differ diff --git a/asset/icon/Icon32/mandriva.png b/asset/icon/Icon32/mandriva.png new file mode 100644 index 0000000..73b204e Binary files /dev/null and b/asset/icon/Icon32/mandriva.png differ diff --git a/asset/icon/Icon32/map.png b/asset/icon/Icon32/map.png new file mode 100644 index 0000000..cd91315 Binary files /dev/null and b/asset/icon/Icon32/map.png differ diff --git a/asset/icon/Icon32/map_add.png b/asset/icon/Icon32/map_add.png new file mode 100644 index 0000000..e9a0db0 Binary files /dev/null and b/asset/icon/Icon32/map_add.png differ diff --git a/asset/icon/Icon32/map_delete.png b/asset/icon/Icon32/map_delete.png new file mode 100644 index 0000000..979b11a Binary files /dev/null and b/asset/icon/Icon32/map_delete.png differ diff --git a/asset/icon/Icon32/map_edit.png b/asset/icon/Icon32/map_edit.png new file mode 100644 index 0000000..46b12aa Binary files /dev/null and b/asset/icon/Icon32/map_edit.png differ diff --git a/asset/icon/Icon32/map_go.png b/asset/icon/Icon32/map_go.png new file mode 100644 index 0000000..8ca9320 Binary files /dev/null and b/asset/icon/Icon32/map_go.png differ diff --git a/asset/icon/Icon32/map_magnify.png b/asset/icon/Icon32/map_magnify.png new file mode 100644 index 0000000..a4b55f7 Binary files /dev/null and b/asset/icon/Icon32/map_magnify.png differ diff --git a/asset/icon/Icon32/map_torn.png b/asset/icon/Icon32/map_torn.png new file mode 100644 index 0000000..564def3 Binary files /dev/null and b/asset/icon/Icon32/map_torn.png differ diff --git a/asset/icon/Icon32/mario.png b/asset/icon/Icon32/mario.png new file mode 100644 index 0000000..21a3899 Binary files /dev/null and b/asset/icon/Icon32/mario.png differ diff --git a/asset/icon/Icon32/mark_citation.png b/asset/icon/Icon32/mark_citation.png new file mode 100644 index 0000000..dff5d76 Binary files /dev/null and b/asset/icon/Icon32/mark_citation.png differ diff --git a/asset/icon/Icon32/mark_entry.png b/asset/icon/Icon32/mark_entry.png new file mode 100644 index 0000000..2236dee Binary files /dev/null and b/asset/icon/Icon32/mark_entry.png differ diff --git a/asset/icon/Icon32/mark_to_download.png b/asset/icon/Icon32/mark_to_download.png new file mode 100644 index 0000000..7a6b5c1 Binary files /dev/null and b/asset/icon/Icon32/mark_to_download.png differ diff --git a/asset/icon/Icon32/marketwatch.png b/asset/icon/Icon32/marketwatch.png new file mode 100644 index 0000000..e620a8b Binary files /dev/null and b/asset/icon/Icon32/marketwatch.png differ diff --git a/asset/icon/Icon32/markup_show_mode.png b/asset/icon/Icon32/markup_show_mode.png new file mode 100644 index 0000000..28959c6 Binary files /dev/null and b/asset/icon/Icon32/markup_show_mode.png differ diff --git a/asset/icon/Icon32/mask.png b/asset/icon/Icon32/mask.png new file mode 100644 index 0000000..8a0495e Binary files /dev/null and b/asset/icon/Icon32/mask.png differ diff --git a/asset/icon/Icon32/master_card.png b/asset/icon/Icon32/master_card.png new file mode 100644 index 0000000..64603e3 Binary files /dev/null and b/asset/icon/Icon32/master_card.png differ diff --git a/asset/icon/Icon32/match_field.png b/asset/icon/Icon32/match_field.png new file mode 100644 index 0000000..b1dffec Binary files /dev/null and b/asset/icon/Icon32/match_field.png differ diff --git a/asset/icon/Icon32/math_functions.png b/asset/icon/Icon32/math_functions.png new file mode 100644 index 0000000..69c261a Binary files /dev/null and b/asset/icon/Icon32/math_functions.png differ diff --git a/asset/icon/Icon32/measure.png b/asset/icon/Icon32/measure.png new file mode 100644 index 0000000..95cdfd2 Binary files /dev/null and b/asset/icon/Icon32/measure.png differ diff --git a/asset/icon/Icon32/measure_crop.png b/asset/icon/Icon32/measure_crop.png new file mode 100644 index 0000000..82aff2f Binary files /dev/null and b/asset/icon/Icon32/measure_crop.png differ diff --git a/asset/icon/Icon32/medal_award_bronze.png b/asset/icon/Icon32/medal_award_bronze.png new file mode 100644 index 0000000..82fd0d1 Binary files /dev/null and b/asset/icon/Icon32/medal_award_bronze.png differ diff --git a/asset/icon/Icon32/medal_award_gold.png b/asset/icon/Icon32/medal_award_gold.png new file mode 100644 index 0000000..5290009 Binary files /dev/null and b/asset/icon/Icon32/medal_award_gold.png differ diff --git a/asset/icon/Icon32/medal_award_silver.png b/asset/icon/Icon32/medal_award_silver.png new file mode 100644 index 0000000..325955a Binary files /dev/null and b/asset/icon/Icon32/medal_award_silver.png differ diff --git a/asset/icon/Icon32/medal_bronze_1.png b/asset/icon/Icon32/medal_bronze_1.png new file mode 100644 index 0000000..c40ff1e Binary files /dev/null and b/asset/icon/Icon32/medal_bronze_1.png differ diff --git a/asset/icon/Icon32/medal_bronze_2.png b/asset/icon/Icon32/medal_bronze_2.png new file mode 100644 index 0000000..e667cb2 Binary files /dev/null and b/asset/icon/Icon32/medal_bronze_2.png differ diff --git a/asset/icon/Icon32/medal_bronze_3.png b/asset/icon/Icon32/medal_bronze_3.png new file mode 100644 index 0000000..abd59ed Binary files /dev/null and b/asset/icon/Icon32/medal_bronze_3.png differ diff --git a/asset/icon/Icon32/medal_bronze_add.png b/asset/icon/Icon32/medal_bronze_add.png new file mode 100644 index 0000000..38db4ac Binary files /dev/null and b/asset/icon/Icon32/medal_bronze_add.png differ diff --git a/asset/icon/Icon32/medal_bronze_delete.png b/asset/icon/Icon32/medal_bronze_delete.png new file mode 100644 index 0000000..bbdfa13 Binary files /dev/null and b/asset/icon/Icon32/medal_bronze_delete.png differ diff --git a/asset/icon/Icon32/medal_gold_1.png b/asset/icon/Icon32/medal_gold_1.png new file mode 100644 index 0000000..92c13c9 Binary files /dev/null and b/asset/icon/Icon32/medal_gold_1.png differ diff --git a/asset/icon/Icon32/medal_gold_2.png b/asset/icon/Icon32/medal_gold_2.png new file mode 100644 index 0000000..7d50e3e Binary files /dev/null and b/asset/icon/Icon32/medal_gold_2.png differ diff --git a/asset/icon/Icon32/medal_gold_3.png b/asset/icon/Icon32/medal_gold_3.png new file mode 100644 index 0000000..3d85cb0 Binary files /dev/null and b/asset/icon/Icon32/medal_gold_3.png differ diff --git a/asset/icon/Icon32/medal_gold_add.png b/asset/icon/Icon32/medal_gold_add.png new file mode 100644 index 0000000..b04c68e Binary files /dev/null and b/asset/icon/Icon32/medal_gold_add.png differ diff --git a/asset/icon/Icon32/medal_gold_delete.png b/asset/icon/Icon32/medal_gold_delete.png new file mode 100644 index 0000000..ae546e4 Binary files /dev/null and b/asset/icon/Icon32/medal_gold_delete.png differ diff --git a/asset/icon/Icon32/medal_silver_1.png b/asset/icon/Icon32/medal_silver_1.png new file mode 100644 index 0000000..e41cab9 Binary files /dev/null and b/asset/icon/Icon32/medal_silver_1.png differ diff --git a/asset/icon/Icon32/medal_silver_2.png b/asset/icon/Icon32/medal_silver_2.png new file mode 100644 index 0000000..ff9cb70 Binary files /dev/null and b/asset/icon/Icon32/medal_silver_2.png differ diff --git a/asset/icon/Icon32/medal_silver_3.png b/asset/icon/Icon32/medal_silver_3.png new file mode 100644 index 0000000..3b716ec Binary files /dev/null and b/asset/icon/Icon32/medal_silver_3.png differ diff --git a/asset/icon/Icon32/medal_silver_add.png b/asset/icon/Icon32/medal_silver_add.png new file mode 100644 index 0000000..88bda3b Binary files /dev/null and b/asset/icon/Icon32/medal_silver_add.png differ diff --git a/asset/icon/Icon32/medal_silver_delete.png b/asset/icon/Icon32/medal_silver_delete.png new file mode 100644 index 0000000..8f1bd98 Binary files /dev/null and b/asset/icon/Icon32/medal_silver_delete.png differ diff --git a/asset/icon/Icon32/medical_record.png b/asset/icon/Icon32/medical_record.png new file mode 100644 index 0000000..b7bb04b Binary files /dev/null and b/asset/icon/Icon32/medical_record.png differ diff --git a/asset/icon/Icon32/menu.png b/asset/icon/Icon32/menu.png new file mode 100644 index 0000000..c1ccc61 Binary files /dev/null and b/asset/icon/Icon32/menu.png differ diff --git a/asset/icon/Icon32/menu_item.png b/asset/icon/Icon32/menu_item.png new file mode 100644 index 0000000..df5cb1e Binary files /dev/null and b/asset/icon/Icon32/menu_item.png differ diff --git a/asset/icon/Icon32/menubar.png b/asset/icon/Icon32/menubar.png new file mode 100644 index 0000000..111e45a Binary files /dev/null and b/asset/icon/Icon32/menubar.png differ diff --git a/asset/icon/Icon32/merge_cells.png b/asset/icon/Icon32/merge_cells.png new file mode 100644 index 0000000..96e2b3d Binary files /dev/null and b/asset/icon/Icon32/merge_cells.png differ diff --git a/asset/icon/Icon32/messenger.png b/asset/icon/Icon32/messenger.png new file mode 100644 index 0000000..2a8c574 Binary files /dev/null and b/asset/icon/Icon32/messenger.png differ diff --git a/asset/icon/Icon32/metro.png b/asset/icon/Icon32/metro.png new file mode 100644 index 0000000..5c2a474 Binary files /dev/null and b/asset/icon/Icon32/metro.png differ diff --git a/asset/icon/Icon32/metronome.png b/asset/icon/Icon32/metronome.png new file mode 100644 index 0000000..ed241d3 Binary files /dev/null and b/asset/icon/Icon32/metronome.png differ diff --git a/asset/icon/Icon32/micro_sd.png b/asset/icon/Icon32/micro_sd.png new file mode 100644 index 0000000..1992fdd Binary files /dev/null and b/asset/icon/Icon32/micro_sd.png differ diff --git a/asset/icon/Icon32/micro_sd_blue.png b/asset/icon/Icon32/micro_sd_blue.png new file mode 100644 index 0000000..37fe030 Binary files /dev/null and b/asset/icon/Icon32/micro_sd_blue.png differ diff --git a/asset/icon/Icon32/microformats.png b/asset/icon/Icon32/microformats.png new file mode 100644 index 0000000..f8a173e Binary files /dev/null and b/asset/icon/Icon32/microformats.png differ diff --git a/asset/icon/Icon32/microphone.png b/asset/icon/Icon32/microphone.png new file mode 100644 index 0000000..93d89fb Binary files /dev/null and b/asset/icon/Icon32/microphone.png differ diff --git a/asset/icon/Icon32/microscope.png b/asset/icon/Icon32/microscope.png new file mode 100644 index 0000000..72d3a58 Binary files /dev/null and b/asset/icon/Icon32/microscope.png differ diff --git a/asset/icon/Icon32/microwave.png b/asset/icon/Icon32/microwave.png new file mode 100644 index 0000000..24a2b72 Binary files /dev/null and b/asset/icon/Icon32/microwave.png differ diff --git a/asset/icon/Icon32/milestone.png b/asset/icon/Icon32/milestone.png new file mode 100644 index 0000000..895b4cd Binary files /dev/null and b/asset/icon/Icon32/milestone.png differ diff --git a/asset/icon/Icon32/milk.png b/asset/icon/Icon32/milk.png new file mode 100644 index 0000000..8cf9efb Binary files /dev/null and b/asset/icon/Icon32/milk.png differ diff --git a/asset/icon/Icon32/mime_types.png b/asset/icon/Icon32/mime_types.png new file mode 100644 index 0000000..a7e4f94 Binary files /dev/null and b/asset/icon/Icon32/mime_types.png differ diff --git a/asset/icon/Icon32/mixer.png b/asset/icon/Icon32/mixer.png new file mode 100644 index 0000000..72a6cf6 Binary files /dev/null and b/asset/icon/Icon32/mixer.png differ diff --git a/asset/icon/Icon32/mixture.png b/asset/icon/Icon32/mixture.png new file mode 100644 index 0000000..5980c0a Binary files /dev/null and b/asset/icon/Icon32/mixture.png differ diff --git a/asset/icon/Icon32/mixx.png b/asset/icon/Icon32/mixx.png new file mode 100644 index 0000000..cb8480e Binary files /dev/null and b/asset/icon/Icon32/mixx.png differ diff --git a/asset/icon/Icon32/mobile_me.png b/asset/icon/Icon32/mobile_me.png new file mode 100644 index 0000000..1014b9a Binary files /dev/null and b/asset/icon/Icon32/mobile_me.png differ diff --git a/asset/icon/Icon32/modify_cpanel_whm_news.png b/asset/icon/Icon32/modify_cpanel_whm_news.png new file mode 100644 index 0000000..c07f79a Binary files /dev/null and b/asset/icon/Icon32/modify_cpanel_whm_news.png differ diff --git a/asset/icon/Icon32/modify_suspended_account_page.png b/asset/icon/Icon32/modify_suspended_account_page.png new file mode 100644 index 0000000..063205c Binary files /dev/null and b/asset/icon/Icon32/modify_suspended_account_page.png differ diff --git a/asset/icon/Icon32/module.png b/asset/icon/Icon32/module.png new file mode 100644 index 0000000..56ce3be Binary files /dev/null and b/asset/icon/Icon32/module.png differ diff --git a/asset/icon/Icon32/molecule.png b/asset/icon/Icon32/molecule.png new file mode 100644 index 0000000..aaedafb Binary files /dev/null and b/asset/icon/Icon32/molecule.png differ diff --git a/asset/icon/Icon32/money.png b/asset/icon/Icon32/money.png new file mode 100644 index 0000000..c8c5a11 Binary files /dev/null and b/asset/icon/Icon32/money.png differ diff --git a/asset/icon/Icon32/money_add.png b/asset/icon/Icon32/money_add.png new file mode 100644 index 0000000..62154f3 Binary files /dev/null and b/asset/icon/Icon32/money_add.png differ diff --git a/asset/icon/Icon32/money_bag.png b/asset/icon/Icon32/money_bag.png new file mode 100644 index 0000000..24a1a06 Binary files /dev/null and b/asset/icon/Icon32/money_bag.png differ diff --git a/asset/icon/Icon32/money_bookers.png b/asset/icon/Icon32/money_bookers.png new file mode 100644 index 0000000..2df84d6 Binary files /dev/null and b/asset/icon/Icon32/money_bookers.png differ diff --git a/asset/icon/Icon32/money_delete.png b/asset/icon/Icon32/money_delete.png new file mode 100644 index 0000000..d1a9cd0 Binary files /dev/null and b/asset/icon/Icon32/money_delete.png differ diff --git a/asset/icon/Icon32/money_dollar.png b/asset/icon/Icon32/money_dollar.png new file mode 100644 index 0000000..bab8f07 Binary files /dev/null and b/asset/icon/Icon32/money_dollar.png differ diff --git a/asset/icon/Icon32/money_euro.png b/asset/icon/Icon32/money_euro.png new file mode 100644 index 0000000..6ef253c Binary files /dev/null and b/asset/icon/Icon32/money_euro.png differ diff --git a/asset/icon/Icon32/money_in_envelope.png b/asset/icon/Icon32/money_in_envelope.png new file mode 100644 index 0000000..fff78ea Binary files /dev/null and b/asset/icon/Icon32/money_in_envelope.png differ diff --git a/asset/icon/Icon32/money_pound.png b/asset/icon/Icon32/money_pound.png new file mode 100644 index 0000000..f5fb6b0 Binary files /dev/null and b/asset/icon/Icon32/money_pound.png differ diff --git a/asset/icon/Icon32/money_yen.png b/asset/icon/Icon32/money_yen.png new file mode 100644 index 0000000..f758357 Binary files /dev/null and b/asset/icon/Icon32/money_yen.png differ diff --git a/asset/icon/Icon32/moneybox.png b/asset/icon/Icon32/moneybox.png new file mode 100644 index 0000000..ceeb44f Binary files /dev/null and b/asset/icon/Icon32/moneybox.png differ diff --git a/asset/icon/Icon32/monitor.png b/asset/icon/Icon32/monitor.png new file mode 100644 index 0000000..cc5207c Binary files /dev/null and b/asset/icon/Icon32/monitor.png differ diff --git a/asset/icon/Icon32/monitor_add.png b/asset/icon/Icon32/monitor_add.png new file mode 100644 index 0000000..9d4169b Binary files /dev/null and b/asset/icon/Icon32/monitor_add.png differ diff --git a/asset/icon/Icon32/monitor_delete.png b/asset/icon/Icon32/monitor_delete.png new file mode 100644 index 0000000..7d23fc2 Binary files /dev/null and b/asset/icon/Icon32/monitor_delete.png differ diff --git a/asset/icon/Icon32/monitor_edit.png b/asset/icon/Icon32/monitor_edit.png new file mode 100644 index 0000000..19084b1 Binary files /dev/null and b/asset/icon/Icon32/monitor_edit.png differ diff --git a/asset/icon/Icon32/monitor_error.png b/asset/icon/Icon32/monitor_error.png new file mode 100644 index 0000000..ec3d517 Binary files /dev/null and b/asset/icon/Icon32/monitor_error.png differ diff --git a/asset/icon/Icon32/monitor_go.png b/asset/icon/Icon32/monitor_go.png new file mode 100644 index 0000000..eef1516 Binary files /dev/null and b/asset/icon/Icon32/monitor_go.png differ diff --git a/asset/icon/Icon32/monitor_lightning.png b/asset/icon/Icon32/monitor_lightning.png new file mode 100644 index 0000000..c8b60e0 Binary files /dev/null and b/asset/icon/Icon32/monitor_lightning.png differ diff --git a/asset/icon/Icon32/monitor_link.png b/asset/icon/Icon32/monitor_link.png new file mode 100644 index 0000000..0aec0e6 Binary files /dev/null and b/asset/icon/Icon32/monitor_link.png differ diff --git a/asset/icon/Icon32/monitor_screensaver.png b/asset/icon/Icon32/monitor_screensaver.png new file mode 100644 index 0000000..7f0c842 Binary files /dev/null and b/asset/icon/Icon32/monitor_screensaver.png differ diff --git a/asset/icon/Icon32/monitor_sidebar.png b/asset/icon/Icon32/monitor_sidebar.png new file mode 100644 index 0000000..d263f08 Binary files /dev/null and b/asset/icon/Icon32/monitor_sidebar.png differ diff --git a/asset/icon/Icon32/monitor_wallpaper.png b/asset/icon/Icon32/monitor_wallpaper.png new file mode 100644 index 0000000..e2090cf Binary files /dev/null and b/asset/icon/Icon32/monitor_wallpaper.png differ diff --git a/asset/icon/Icon32/monitor_window.png b/asset/icon/Icon32/monitor_window.png new file mode 100644 index 0000000..a26f6ea Binary files /dev/null and b/asset/icon/Icon32/monitor_window.png differ diff --git a/asset/icon/Icon32/monitor_window_3d.png b/asset/icon/Icon32/monitor_window_3d.png new file mode 100644 index 0000000..025485e Binary files /dev/null and b/asset/icon/Icon32/monitor_window_3d.png differ diff --git a/asset/icon/Icon32/monitor_window_flow.png b/asset/icon/Icon32/monitor_window_flow.png new file mode 100644 index 0000000..735323c Binary files /dev/null and b/asset/icon/Icon32/monitor_window_flow.png differ diff --git a/asset/icon/Icon32/moon.png b/asset/icon/Icon32/moon.png new file mode 100644 index 0000000..cb4fc92 Binary files /dev/null and b/asset/icon/Icon32/moon.png differ diff --git a/asset/icon/Icon32/more_exports.png b/asset/icon/Icon32/more_exports.png new file mode 100644 index 0000000..17a01f2 Binary files /dev/null and b/asset/icon/Icon32/more_exports.png differ diff --git a/asset/icon/Icon32/more_form.png b/asset/icon/Icon32/more_form.png new file mode 100644 index 0000000..1bd8ca5 Binary files /dev/null and b/asset/icon/Icon32/more_form.png differ diff --git a/asset/icon/Icon32/more_imports.png b/asset/icon/Icon32/more_imports.png new file mode 100644 index 0000000..e0424f6 Binary files /dev/null and b/asset/icon/Icon32/more_imports.png differ diff --git a/asset/icon/Icon32/mosque.png b/asset/icon/Icon32/mosque.png new file mode 100644 index 0000000..4df5990 Binary files /dev/null and b/asset/icon/Icon32/mosque.png differ diff --git a/asset/icon/Icon32/motherboard.png b/asset/icon/Icon32/motherboard.png new file mode 100644 index 0000000..ce695b1 Binary files /dev/null and b/asset/icon/Icon32/motherboard.png differ diff --git a/asset/icon/Icon32/mouse.png b/asset/icon/Icon32/mouse.png new file mode 100644 index 0000000..a0d68eb Binary files /dev/null and b/asset/icon/Icon32/mouse.png differ diff --git a/asset/icon/Icon32/mouse_2.png b/asset/icon/Icon32/mouse_2.png new file mode 100644 index 0000000..d3c75d2 Binary files /dev/null and b/asset/icon/Icon32/mouse_2.png differ diff --git a/asset/icon/Icon32/mouse_add.png b/asset/icon/Icon32/mouse_add.png new file mode 100644 index 0000000..1d2c402 Binary files /dev/null and b/asset/icon/Icon32/mouse_add.png differ diff --git a/asset/icon/Icon32/mouse_delete.png b/asset/icon/Icon32/mouse_delete.png new file mode 100644 index 0000000..6a938dc Binary files /dev/null and b/asset/icon/Icon32/mouse_delete.png differ diff --git a/asset/icon/Icon32/mouse_error.png b/asset/icon/Icon32/mouse_error.png new file mode 100644 index 0000000..f3f04ae Binary files /dev/null and b/asset/icon/Icon32/mouse_error.png differ diff --git a/asset/icon/Icon32/mouse_select_left.png b/asset/icon/Icon32/mouse_select_left.png new file mode 100644 index 0000000..bcc0819 Binary files /dev/null and b/asset/icon/Icon32/mouse_select_left.png differ diff --git a/asset/icon/Icon32/mouse_select_right.png b/asset/icon/Icon32/mouse_select_right.png new file mode 100644 index 0000000..4848518 Binary files /dev/null and b/asset/icon/Icon32/mouse_select_right.png differ diff --git a/asset/icon/Icon32/mouse_select_scroll.png b/asset/icon/Icon32/mouse_select_scroll.png new file mode 100644 index 0000000..60ea5ea Binary files /dev/null and b/asset/icon/Icon32/mouse_select_scroll.png differ diff --git a/asset/icon/Icon32/move_to_folder.png b/asset/icon/Icon32/move_to_folder.png new file mode 100644 index 0000000..228ec90 Binary files /dev/null and b/asset/icon/Icon32/move_to_folder.png differ diff --git a/asset/icon/Icon32/movies.png b/asset/icon/Icon32/movies.png new file mode 100644 index 0000000..0cd43b4 Binary files /dev/null and b/asset/icon/Icon32/movies.png differ diff --git a/asset/icon/Icon32/ms_exchange.png b/asset/icon/Icon32/ms_exchange.png new file mode 100644 index 0000000..460f783 Binary files /dev/null and b/asset/icon/Icon32/ms_exchange.png differ diff --git a/asset/icon/Icon32/ms_frontpage.png b/asset/icon/Icon32/ms_frontpage.png new file mode 100644 index 0000000..ab82ab1 Binary files /dev/null and b/asset/icon/Icon32/ms_frontpage.png differ diff --git a/asset/icon/Icon32/msn_messenger.png b/asset/icon/Icon32/msn_messenger.png new file mode 100644 index 0000000..85dab04 Binary files /dev/null and b/asset/icon/Icon32/msn_messenger.png differ diff --git a/asset/icon/Icon32/multilevel_list.png b/asset/icon/Icon32/multilevel_list.png new file mode 100644 index 0000000..7be96d7 Binary files /dev/null and b/asset/icon/Icon32/multilevel_list.png differ diff --git a/asset/icon/Icon32/multiplied_by_10.png b/asset/icon/Icon32/multiplied_by_10.png new file mode 100644 index 0000000..2b5cc04 Binary files /dev/null and b/asset/icon/Icon32/multiplied_by_10.png differ diff --git a/asset/icon/Icon32/multiplied_by_100.png b/asset/icon/Icon32/multiplied_by_100.png new file mode 100644 index 0000000..9cc2675 Binary files /dev/null and b/asset/icon/Icon32/multiplied_by_100.png differ diff --git a/asset/icon/Icon32/multiplied_by_2.png b/asset/icon/Icon32/multiplied_by_2.png new file mode 100644 index 0000000..a6c18c6 Binary files /dev/null and b/asset/icon/Icon32/multiplied_by_2.png differ diff --git a/asset/icon/Icon32/multiplied_by_3.png b/asset/icon/Icon32/multiplied_by_3.png new file mode 100644 index 0000000..b7bbbcd Binary files /dev/null and b/asset/icon/Icon32/multiplied_by_3.png differ diff --git a/asset/icon/Icon32/multiplied_by_5.png b/asset/icon/Icon32/multiplied_by_5.png new file mode 100644 index 0000000..075e7d0 Binary files /dev/null and b/asset/icon/Icon32/multiplied_by_5.png differ diff --git a/asset/icon/Icon32/multitool.png b/asset/icon/Icon32/multitool.png new file mode 100644 index 0000000..a46eb55 Binary files /dev/null and b/asset/icon/Icon32/multitool.png differ diff --git a/asset/icon/Icon32/mushroom.png b/asset/icon/Icon32/mushroom.png new file mode 100644 index 0000000..8402774 Binary files /dev/null and b/asset/icon/Icon32/mushroom.png differ diff --git a/asset/icon/Icon32/music.png b/asset/icon/Icon32/music.png new file mode 100644 index 0000000..c00cac4 Binary files /dev/null and b/asset/icon/Icon32/music.png differ diff --git a/asset/icon/Icon32/mustache.png b/asset/icon/Icon32/mustache.png new file mode 100644 index 0000000..d8fd465 Binary files /dev/null and b/asset/icon/Icon32/mustache.png differ diff --git a/asset/icon/Icon32/mx_entry.png b/asset/icon/Icon32/mx_entry.png new file mode 100644 index 0000000..e087fc8 Binary files /dev/null and b/asset/icon/Icon32/mx_entry.png differ diff --git a/asset/icon/Icon32/my_name_is_e.png b/asset/icon/Icon32/my_name_is_e.png new file mode 100644 index 0000000..15f14f5 Binary files /dev/null and b/asset/icon/Icon32/my_name_is_e.png differ diff --git a/asset/icon/Icon32/myspace.png b/asset/icon/Icon32/myspace.png new file mode 100644 index 0000000..edee486 Binary files /dev/null and b/asset/icon/Icon32/myspace.png differ diff --git a/asset/icon/Icon32/mysql_wizard.png b/asset/icon/Icon32/mysql_wizard.png new file mode 100644 index 0000000..8160ee9 Binary files /dev/null and b/asset/icon/Icon32/mysql_wizard.png differ diff --git a/asset/icon/Icon32/name_manager.png b/asset/icon/Icon32/name_manager.png new file mode 100644 index 0000000..f68e9fc Binary files /dev/null and b/asset/icon/Icon32/name_manager.png differ diff --git a/asset/icon/Icon32/nameboard_open.png b/asset/icon/Icon32/nameboard_open.png new file mode 100644 index 0000000..3a3328c Binary files /dev/null and b/asset/icon/Icon32/nameboard_open.png differ diff --git a/asset/icon/Icon32/named_macro.png b/asset/icon/Icon32/named_macro.png new file mode 100644 index 0000000..7764c74 Binary files /dev/null and b/asset/icon/Icon32/named_macro.png differ diff --git a/asset/icon/Icon32/navigation.png b/asset/icon/Icon32/navigation.png new file mode 100644 index 0000000..e4ceb7e Binary files /dev/null and b/asset/icon/Icon32/navigation.png differ diff --git a/asset/icon/Icon32/navigator_pane.png b/asset/icon/Icon32/navigator_pane.png new file mode 100644 index 0000000..bdfb425 Binary files /dev/null and b/asset/icon/Icon32/navigator_pane.png differ diff --git a/asset/icon/Icon32/netvibes.png b/asset/icon/Icon32/netvibes.png new file mode 100644 index 0000000..f5373f3 Binary files /dev/null and b/asset/icon/Icon32/netvibes.png differ diff --git a/asset/icon/Icon32/network_adapter.png b/asset/icon/Icon32/network_adapter.png new file mode 100644 index 0000000..43b7a63 Binary files /dev/null and b/asset/icon/Icon32/network_adapter.png differ diff --git a/asset/icon/Icon32/network_cloud.png b/asset/icon/Icon32/network_cloud.png new file mode 100644 index 0000000..69583da Binary files /dev/null and b/asset/icon/Icon32/network_cloud.png differ diff --git a/asset/icon/Icon32/network_clouds.png b/asset/icon/Icon32/network_clouds.png new file mode 100644 index 0000000..e54b676 Binary files /dev/null and b/asset/icon/Icon32/network_clouds.png differ diff --git a/asset/icon/Icon32/network_ethernet.png b/asset/icon/Icon32/network_ethernet.png new file mode 100644 index 0000000..9df8b73 Binary files /dev/null and b/asset/icon/Icon32/network_ethernet.png differ diff --git a/asset/icon/Icon32/network_firewall.png b/asset/icon/Icon32/network_firewall.png new file mode 100644 index 0000000..b1b03a0 Binary files /dev/null and b/asset/icon/Icon32/network_firewall.png differ diff --git a/asset/icon/Icon32/network_folder.png b/asset/icon/Icon32/network_folder.png new file mode 100644 index 0000000..e44bb50 Binary files /dev/null and b/asset/icon/Icon32/network_folder.png differ diff --git a/asset/icon/Icon32/network_hub.png b/asset/icon/Icon32/network_hub.png new file mode 100644 index 0000000..380bcda Binary files /dev/null and b/asset/icon/Icon32/network_hub.png differ diff --git a/asset/icon/Icon32/network_ip.png b/asset/icon/Icon32/network_ip.png new file mode 100644 index 0000000..e42846b Binary files /dev/null and b/asset/icon/Icon32/network_ip.png differ diff --git a/asset/icon/Icon32/network_tools.png b/asset/icon/Icon32/network_tools.png new file mode 100644 index 0000000..2505eef Binary files /dev/null and b/asset/icon/Icon32/network_tools.png differ diff --git a/asset/icon/Icon32/network_wireless.png b/asset/icon/Icon32/network_wireless.png new file mode 100644 index 0000000..0832ce0 Binary files /dev/null and b/asset/icon/Icon32/network_wireless.png differ diff --git a/asset/icon/Icon32/networking.png b/asset/icon/Icon32/networking.png new file mode 100644 index 0000000..1167df7 Binary files /dev/null and b/asset/icon/Icon32/networking.png differ diff --git a/asset/icon/Icon32/networking_green.png b/asset/icon/Icon32/networking_green.png new file mode 100644 index 0000000..6422d79 Binary files /dev/null and b/asset/icon/Icon32/networking_green.png differ diff --git a/asset/icon/Icon32/networking_red.png b/asset/icon/Icon32/networking_red.png new file mode 100644 index 0000000..3f70ca3 Binary files /dev/null and b/asset/icon/Icon32/networking_red.png differ diff --git a/asset/icon/Icon32/new.png b/asset/icon/Icon32/new.png new file mode 100644 index 0000000..556d2b4 Binary files /dev/null and b/asset/icon/Icon32/new.png differ diff --git a/asset/icon/Icon32/new_comment.png b/asset/icon/Icon32/new_comment.png new file mode 100644 index 0000000..cf7ecc0 Binary files /dev/null and b/asset/icon/Icon32/new_comment.png differ diff --git a/asset/icon/Icon32/new_data.png b/asset/icon/Icon32/new_data.png new file mode 100644 index 0000000..67485d3 Binary files /dev/null and b/asset/icon/Icon32/new_data.png differ diff --git a/asset/icon/Icon32/new_email.png b/asset/icon/Icon32/new_email.png new file mode 100644 index 0000000..15600f1 Binary files /dev/null and b/asset/icon/Icon32/new_email.png differ diff --git a/asset/icon/Icon32/new_slide.png b/asset/icon/Icon32/new_slide.png new file mode 100644 index 0000000..5ca9fff Binary files /dev/null and b/asset/icon/Icon32/new_slide.png differ diff --git a/asset/icon/Icon32/new_window.png b/asset/icon/Icon32/new_window.png new file mode 100644 index 0000000..3ba12b1 Binary files /dev/null and b/asset/icon/Icon32/new_window.png differ diff --git a/asset/icon/Icon32/newspaper.png b/asset/icon/Icon32/newspaper.png new file mode 100644 index 0000000..06a2902 Binary files /dev/null and b/asset/icon/Icon32/newspaper.png differ diff --git a/asset/icon/Icon32/newspaper_add.png b/asset/icon/Icon32/newspaper_add.png new file mode 100644 index 0000000..0045d1e Binary files /dev/null and b/asset/icon/Icon32/newspaper_add.png differ diff --git a/asset/icon/Icon32/newspaper_delete.png b/asset/icon/Icon32/newspaper_delete.png new file mode 100644 index 0000000..40a90cf Binary files /dev/null and b/asset/icon/Icon32/newspaper_delete.png differ diff --git a/asset/icon/Icon32/newspaper_go.png b/asset/icon/Icon32/newspaper_go.png new file mode 100644 index 0000000..c5d00dc Binary files /dev/null and b/asset/icon/Icon32/newspaper_go.png differ diff --git a/asset/icon/Icon32/newspaper_link.png b/asset/icon/Icon32/newspaper_link.png new file mode 100644 index 0000000..8107c2f Binary files /dev/null and b/asset/icon/Icon32/newspaper_link.png differ diff --git a/asset/icon/Icon32/newsvine.png b/asset/icon/Icon32/newsvine.png new file mode 100644 index 0000000..96ddb20 Binary files /dev/null and b/asset/icon/Icon32/newsvine.png differ diff --git a/asset/icon/Icon32/next_comment.png b/asset/icon/Icon32/next_comment.png new file mode 100644 index 0000000..80ba5f9 Binary files /dev/null and b/asset/icon/Icon32/next_comment.png differ diff --git a/asset/icon/Icon32/next_footnote.png b/asset/icon/Icon32/next_footnote.png new file mode 100644 index 0000000..ecb44bd Binary files /dev/null and b/asset/icon/Icon32/next_footnote.png differ diff --git a/asset/icon/Icon32/next_markup.png b/asset/icon/Icon32/next_markup.png new file mode 100644 index 0000000..56b6258 Binary files /dev/null and b/asset/icon/Icon32/next_markup.png differ diff --git a/asset/icon/Icon32/next_seven_days.png b/asset/icon/Icon32/next_seven_days.png new file mode 100644 index 0000000..f2e1067 Binary files /dev/null and b/asset/icon/Icon32/next_seven_days.png differ diff --git a/asset/icon/Icon32/no_commercial.png b/asset/icon/Icon32/no_commercial.png new file mode 100644 index 0000000..a0b894c Binary files /dev/null and b/asset/icon/Icon32/no_commercial.png differ diff --git a/asset/icon/Icon32/no_drm_trm.png b/asset/icon/Icon32/no_drm_trm.png new file mode 100644 index 0000000..1d35a72 Binary files /dev/null and b/asset/icon/Icon32/no_drm_trm.png differ diff --git a/asset/icon/Icon32/no_image.png b/asset/icon/Icon32/no_image.png new file mode 100644 index 0000000..a37fc55 Binary files /dev/null and b/asset/icon/Icon32/no_image.png differ diff --git a/asset/icon/Icon32/no_requirements.png b/asset/icon/Icon32/no_requirements.png new file mode 100644 index 0000000..16b519e Binary files /dev/null and b/asset/icon/Icon32/no_requirements.png differ diff --git a/asset/icon/Icon32/no_smoking.png b/asset/icon/Icon32/no_smoking.png new file mode 100644 index 0000000..ab51a0f Binary files /dev/null and b/asset/icon/Icon32/no_smoking.png differ diff --git a/asset/icon/Icon32/node.png b/asset/icon/Icon32/node.png new file mode 100644 index 0000000..2da4774 Binary files /dev/null and b/asset/icon/Icon32/node.png differ diff --git a/asset/icon/Icon32/node_design.png b/asset/icon/Icon32/node_design.png new file mode 100644 index 0000000..b3ab387 Binary files /dev/null and b/asset/icon/Icon32/node_design.png differ diff --git a/asset/icon/Icon32/node_magnifier.png b/asset/icon/Icon32/node_magnifier.png new file mode 100644 index 0000000..b19d01b Binary files /dev/null and b/asset/icon/Icon32/node_magnifier.png differ diff --git a/asset/icon/Icon32/nokia_s60.png b/asset/icon/Icon32/nokia_s60.png new file mode 100644 index 0000000..be83cd8 Binary files /dev/null and b/asset/icon/Icon32/nokia_s60.png differ diff --git a/asset/icon/Icon32/non_derivative.png b/asset/icon/Icon32/non_derivative.png new file mode 100644 index 0000000..a79cda4 Binary files /dev/null and b/asset/icon/Icon32/non_derivative.png differ diff --git a/asset/icon/Icon32/note.png b/asset/icon/Icon32/note.png new file mode 100644 index 0000000..cee94b3 Binary files /dev/null and b/asset/icon/Icon32/note.png differ diff --git a/asset/icon/Icon32/note_add.png b/asset/icon/Icon32/note_add.png new file mode 100644 index 0000000..616a35e Binary files /dev/null and b/asset/icon/Icon32/note_add.png differ diff --git a/asset/icon/Icon32/note_delete.png b/asset/icon/Icon32/note_delete.png new file mode 100644 index 0000000..4bd14ac Binary files /dev/null and b/asset/icon/Icon32/note_delete.png differ diff --git a/asset/icon/Icon32/note_edit.png b/asset/icon/Icon32/note_edit.png new file mode 100644 index 0000000..1df9e1e Binary files /dev/null and b/asset/icon/Icon32/note_edit.png differ diff --git a/asset/icon/Icon32/note_error.png b/asset/icon/Icon32/note_error.png new file mode 100644 index 0000000..957a77a Binary files /dev/null and b/asset/icon/Icon32/note_error.png differ diff --git a/asset/icon/Icon32/note_go.png b/asset/icon/Icon32/note_go.png new file mode 100644 index 0000000..f82475c Binary files /dev/null and b/asset/icon/Icon32/note_go.png differ diff --git a/asset/icon/Icon32/note_pin.png b/asset/icon/Icon32/note_pin.png new file mode 100644 index 0000000..d9bfd9f Binary files /dev/null and b/asset/icon/Icon32/note_pin.png differ diff --git a/asset/icon/Icon32/note_torn.png b/asset/icon/Icon32/note_torn.png new file mode 100644 index 0000000..0a1773d Binary files /dev/null and b/asset/icon/Icon32/note_torn.png differ diff --git a/asset/icon/Icon32/notes_pages.png b/asset/icon/Icon32/notes_pages.png new file mode 100644 index 0000000..fb08d3b Binary files /dev/null and b/asset/icon/Icon32/notes_pages.png differ diff --git a/asset/icon/Icon32/notes_pin.png b/asset/icon/Icon32/notes_pin.png new file mode 100644 index 0000000..88c7bc1 Binary files /dev/null and b/asset/icon/Icon32/notes_pin.png differ diff --git a/asset/icon/Icon32/notes_styles.png b/asset/icon/Icon32/notes_styles.png new file mode 100644 index 0000000..1c74afc Binary files /dev/null and b/asset/icon/Icon32/notes_styles.png differ diff --git a/asset/icon/Icon32/numeric_stepper.png b/asset/icon/Icon32/numeric_stepper.png new file mode 100644 index 0000000..d86a1fa Binary files /dev/null and b/asset/icon/Icon32/numeric_stepper.png differ diff --git a/asset/icon/Icon32/object_dependencies.png b/asset/icon/Icon32/object_dependencies.png new file mode 100644 index 0000000..9ba7c1d Binary files /dev/null and b/asset/icon/Icon32/object_dependencies.png differ diff --git a/asset/icon/Icon32/object_insert.png b/asset/icon/Icon32/object_insert.png new file mode 100644 index 0000000..1beda9d Binary files /dev/null and b/asset/icon/Icon32/object_insert.png differ diff --git a/asset/icon/Icon32/odata.png b/asset/icon/Icon32/odata.png new file mode 100644 index 0000000..ba58bd7 Binary files /dev/null and b/asset/icon/Icon32/odata.png differ diff --git a/asset/icon/Icon32/odbs_database.png b/asset/icon/Icon32/odbs_database.png new file mode 100644 index 0000000..dd15781 Binary files /dev/null and b/asset/icon/Icon32/odbs_database.png differ diff --git a/asset/icon/Icon32/office_apps.png b/asset/icon/Icon32/office_apps.png new file mode 100644 index 0000000..dc4ed53 Binary files /dev/null and b/asset/icon/Icon32/office_apps.png differ diff --git a/asset/icon/Icon32/oil.png b/asset/icon/Icon32/oil.png new file mode 100644 index 0000000..a267436 Binary files /dev/null and b/asset/icon/Icon32/oil.png differ diff --git a/asset/icon/Icon32/oil_barrel.png b/asset/icon/Icon32/oil_barrel.png new file mode 100644 index 0000000..3d3d217 Binary files /dev/null and b/asset/icon/Icon32/oil_barrel.png differ diff --git a/asset/icon/Icon32/omelet.png b/asset/icon/Icon32/omelet.png new file mode 100644 index 0000000..aed4e3b Binary files /dev/null and b/asset/icon/Icon32/omelet.png differ diff --git a/asset/icon/Icon32/online_video_insert.png b/asset/icon/Icon32/online_video_insert.png new file mode 100644 index 0000000..b0b1b76 Binary files /dev/null and b/asset/icon/Icon32/online_video_insert.png differ diff --git a/asset/icon/Icon32/open_folder.png b/asset/icon/Icon32/open_folder.png new file mode 100644 index 0000000..ce5368c Binary files /dev/null and b/asset/icon/Icon32/open_folder.png differ diff --git a/asset/icon/Icon32/open_share.png b/asset/icon/Icon32/open_share.png new file mode 100644 index 0000000..5d04809 Binary files /dev/null and b/asset/icon/Icon32/open_share.png differ diff --git a/asset/icon/Icon32/open_source.png b/asset/icon/Icon32/open_source.png new file mode 100644 index 0000000..25b47b4 Binary files /dev/null and b/asset/icon/Icon32/open_source.png differ diff --git a/asset/icon/Icon32/open_suse.png b/asset/icon/Icon32/open_suse.png new file mode 100644 index 0000000..03f67dc Binary files /dev/null and b/asset/icon/Icon32/open_suse.png differ diff --git a/asset/icon/Icon32/openid.png b/asset/icon/Icon32/openid.png new file mode 100644 index 0000000..9038d1b Binary files /dev/null and b/asset/icon/Icon32/openid.png differ diff --git a/asset/icon/Icon32/opera.png b/asset/icon/Icon32/opera.png new file mode 100644 index 0000000..8fd1952 Binary files /dev/null and b/asset/icon/Icon32/opera.png differ diff --git a/asset/icon/Icon32/opml.png b/asset/icon/Icon32/opml.png new file mode 100644 index 0000000..e74fd02 Binary files /dev/null and b/asset/icon/Icon32/opml.png differ diff --git a/asset/icon/Icon32/ops.png b/asset/icon/Icon32/ops.png new file mode 100644 index 0000000..766bae9 Binary files /dev/null and b/asset/icon/Icon32/ops.png differ diff --git a/asset/icon/Icon32/orbit.png b/asset/icon/Icon32/orbit.png new file mode 100644 index 0000000..e388192 Binary files /dev/null and b/asset/icon/Icon32/orbit.png differ diff --git a/asset/icon/Icon32/origami.png b/asset/icon/Icon32/origami.png new file mode 100644 index 0000000..28f61c7 Binary files /dev/null and b/asset/icon/Icon32/origami.png differ diff --git a/asset/icon/Icon32/orkut.png b/asset/icon/Icon32/orkut.png new file mode 100644 index 0000000..1f1f279 Binary files /dev/null and b/asset/icon/Icon32/orkut.png differ diff --git a/asset/icon/Icon32/ornament_gold.png b/asset/icon/Icon32/ornament_gold.png new file mode 100644 index 0000000..d37f0f5 Binary files /dev/null and b/asset/icon/Icon32/ornament_gold.png differ diff --git a/asset/icon/Icon32/orthodox_church.png b/asset/icon/Icon32/orthodox_church.png new file mode 100644 index 0000000..4fb320f Binary files /dev/null and b/asset/icon/Icon32/orthodox_church.png differ diff --git a/asset/icon/Icon32/other_fields.png b/asset/icon/Icon32/other_fields.png new file mode 100644 index 0000000..bd4035d Binary files /dev/null and b/asset/icon/Icon32/other_fields.png differ diff --git a/asset/icon/Icon32/other_functions.png b/asset/icon/Icon32/other_functions.png new file mode 100644 index 0000000..1deb4e4 Binary files /dev/null and b/asset/icon/Icon32/other_functions.png differ diff --git a/asset/icon/Icon32/other_phone.png b/asset/icon/Icon32/other_phone.png new file mode 100644 index 0000000..3deb1c1 Binary files /dev/null and b/asset/icon/Icon32/other_phone.png differ diff --git a/asset/icon/Icon32/outlook_calendar_day.png b/asset/icon/Icon32/outlook_calendar_day.png new file mode 100644 index 0000000..6bc82cd Binary files /dev/null and b/asset/icon/Icon32/outlook_calendar_day.png differ diff --git a/asset/icon/Icon32/outlook_calendar_month.png b/asset/icon/Icon32/outlook_calendar_month.png new file mode 100644 index 0000000..f38bc70 Binary files /dev/null and b/asset/icon/Icon32/outlook_calendar_month.png differ diff --git a/asset/icon/Icon32/outlook_calendar_shedule_view.png b/asset/icon/Icon32/outlook_calendar_shedule_view.png new file mode 100644 index 0000000..9cc70c4 Binary files /dev/null and b/asset/icon/Icon32/outlook_calendar_shedule_view.png differ diff --git a/asset/icon/Icon32/outlook_calendar_week.png b/asset/icon/Icon32/outlook_calendar_week.png new file mode 100644 index 0000000..d06939f Binary files /dev/null and b/asset/icon/Icon32/outlook_calendar_week.png differ diff --git a/asset/icon/Icon32/outlook_calendar_work_week.png b/asset/icon/Icon32/outlook_calendar_work_week.png new file mode 100644 index 0000000..2ae7600 Binary files /dev/null and b/asset/icon/Icon32/outlook_calendar_work_week.png differ diff --git a/asset/icon/Icon32/outlook_cancel_all.png b/asset/icon/Icon32/outlook_cancel_all.png new file mode 100644 index 0000000..c77816f Binary files /dev/null and b/asset/icon/Icon32/outlook_cancel_all.png differ diff --git a/asset/icon/Icon32/outlook_change_view.png b/asset/icon/Icon32/outlook_change_view.png new file mode 100644 index 0000000..280cce4 Binary files /dev/null and b/asset/icon/Icon32/outlook_change_view.png differ diff --git a/asset/icon/Icon32/outlook_clean_up.png b/asset/icon/Icon32/outlook_clean_up.png new file mode 100644 index 0000000..1999587 Binary files /dev/null and b/asset/icon/Icon32/outlook_clean_up.png differ diff --git a/asset/icon/Icon32/outlook_delete_all.png b/asset/icon/Icon32/outlook_delete_all.png new file mode 100644 index 0000000..3956834 Binary files /dev/null and b/asset/icon/Icon32/outlook_delete_all.png differ diff --git a/asset/icon/Icon32/outlook_ignore_email.png b/asset/icon/Icon32/outlook_ignore_email.png new file mode 100644 index 0000000..f0b5424 Binary files /dev/null and b/asset/icon/Icon32/outlook_ignore_email.png differ diff --git a/asset/icon/Icon32/outlook_meeting.png b/asset/icon/Icon32/outlook_meeting.png new file mode 100644 index 0000000..d5a0840 Binary files /dev/null and b/asset/icon/Icon32/outlook_meeting.png differ diff --git a/asset/icon/Icon32/outlook_more.png b/asset/icon/Icon32/outlook_more.png new file mode 100644 index 0000000..43ee94e Binary files /dev/null and b/asset/icon/Icon32/outlook_more.png differ diff --git a/asset/icon/Icon32/outlook_new_items.png b/asset/icon/Icon32/outlook_new_items.png new file mode 100644 index 0000000..bbfa598 Binary files /dev/null and b/asset/icon/Icon32/outlook_new_items.png differ diff --git a/asset/icon/Icon32/outlook_new_meeting.png b/asset/icon/Icon32/outlook_new_meeting.png new file mode 100644 index 0000000..1e80dcb Binary files /dev/null and b/asset/icon/Icon32/outlook_new_meeting.png differ diff --git a/asset/icon/Icon32/outlook_reply.png b/asset/icon/Icon32/outlook_reply.png new file mode 100644 index 0000000..bf7dcca Binary files /dev/null and b/asset/icon/Icon32/outlook_reply.png differ diff --git a/asset/icon/Icon32/outlook_reply_all.png b/asset/icon/Icon32/outlook_reply_all.png new file mode 100644 index 0000000..df5972d Binary files /dev/null and b/asset/icon/Icon32/outlook_reply_all.png differ diff --git a/asset/icon/Icon32/outlook_reset_view.png b/asset/icon/Icon32/outlook_reset_view.png new file mode 100644 index 0000000..d544d3f Binary files /dev/null and b/asset/icon/Icon32/outlook_reset_view.png differ diff --git a/asset/icon/Icon32/outlook_rules.png b/asset/icon/Icon32/outlook_rules.png new file mode 100644 index 0000000..5c8794f Binary files /dev/null and b/asset/icon/Icon32/outlook_rules.png differ diff --git a/asset/icon/Icon32/outlook_show_progress.png b/asset/icon/Icon32/outlook_show_progress.png new file mode 100644 index 0000000..b8161bf Binary files /dev/null and b/asset/icon/Icon32/outlook_show_progress.png differ diff --git a/asset/icon/Icon32/outlook_view_setting.png b/asset/icon/Icon32/outlook_view_setting.png new file mode 100644 index 0000000..82e27dc Binary files /dev/null and b/asset/icon/Icon32/outlook_view_setting.png differ diff --git a/asset/icon/Icon32/package.png b/asset/icon/Icon32/package.png new file mode 100644 index 0000000..448681e Binary files /dev/null and b/asset/icon/Icon32/package.png differ diff --git a/asset/icon/Icon32/package_add.png b/asset/icon/Icon32/package_add.png new file mode 100644 index 0000000..91eb8f8 Binary files /dev/null and b/asset/icon/Icon32/package_add.png differ diff --git a/asset/icon/Icon32/package_delete.png b/asset/icon/Icon32/package_delete.png new file mode 100644 index 0000000..65d5de7 Binary files /dev/null and b/asset/icon/Icon32/package_delete.png differ diff --git a/asset/icon/Icon32/package_go.png b/asset/icon/Icon32/package_go.png new file mode 100644 index 0000000..ff6247f Binary files /dev/null and b/asset/icon/Icon32/package_go.png differ diff --git a/asset/icon/Icon32/package_green.png b/asset/icon/Icon32/package_green.png new file mode 100644 index 0000000..fa48063 Binary files /dev/null and b/asset/icon/Icon32/package_green.png differ diff --git a/asset/icon/Icon32/package_link.png b/asset/icon/Icon32/package_link.png new file mode 100644 index 0000000..545142c Binary files /dev/null and b/asset/icon/Icon32/package_link.png differ diff --git a/asset/icon/Icon32/page.png b/asset/icon/Icon32/page.png new file mode 100644 index 0000000..464caf2 Binary files /dev/null and b/asset/icon/Icon32/page.png differ diff --git a/asset/icon/Icon32/page_add.png b/asset/icon/Icon32/page_add.png new file mode 100644 index 0000000..bc3e615 Binary files /dev/null and b/asset/icon/Icon32/page_add.png differ diff --git a/asset/icon/Icon32/page_attach.png b/asset/icon/Icon32/page_attach.png new file mode 100644 index 0000000..31092d7 Binary files /dev/null and b/asset/icon/Icon32/page_attach.png differ diff --git a/asset/icon/Icon32/page_break.png b/asset/icon/Icon32/page_break.png new file mode 100644 index 0000000..5bede65 Binary files /dev/null and b/asset/icon/Icon32/page_break.png differ diff --git a/asset/icon/Icon32/page_code.png b/asset/icon/Icon32/page_code.png new file mode 100644 index 0000000..4d87eee Binary files /dev/null and b/asset/icon/Icon32/page_code.png differ diff --git a/asset/icon/Icon32/page_copy.png b/asset/icon/Icon32/page_copy.png new file mode 100644 index 0000000..7e387d6 Binary files /dev/null and b/asset/icon/Icon32/page_copy.png differ diff --git a/asset/icon/Icon32/page_delete.png b/asset/icon/Icon32/page_delete.png new file mode 100644 index 0000000..c7c33dd Binary files /dev/null and b/asset/icon/Icon32/page_delete.png differ diff --git a/asset/icon/Icon32/page_edit.png b/asset/icon/Icon32/page_edit.png new file mode 100644 index 0000000..49388eb Binary files /dev/null and b/asset/icon/Icon32/page_edit.png differ diff --git a/asset/icon/Icon32/page_error.png b/asset/icon/Icon32/page_error.png new file mode 100644 index 0000000..41feb65 Binary files /dev/null and b/asset/icon/Icon32/page_error.png differ diff --git a/asset/icon/Icon32/page_excel.png b/asset/icon/Icon32/page_excel.png new file mode 100644 index 0000000..15bf4a0 Binary files /dev/null and b/asset/icon/Icon32/page_excel.png differ diff --git a/asset/icon/Icon32/page_find.png b/asset/icon/Icon32/page_find.png new file mode 100644 index 0000000..8e3fd45 Binary files /dev/null and b/asset/icon/Icon32/page_find.png differ diff --git a/asset/icon/Icon32/page_footer.png b/asset/icon/Icon32/page_footer.png new file mode 100644 index 0000000..1b9162f Binary files /dev/null and b/asset/icon/Icon32/page_footer.png differ diff --git a/asset/icon/Icon32/page_gear.png b/asset/icon/Icon32/page_gear.png new file mode 100644 index 0000000..61704b9 Binary files /dev/null and b/asset/icon/Icon32/page_gear.png differ diff --git a/asset/icon/Icon32/page_go.png b/asset/icon/Icon32/page_go.png new file mode 100644 index 0000000..3470ab8 Binary files /dev/null and b/asset/icon/Icon32/page_go.png differ diff --git a/asset/icon/Icon32/page_green.png b/asset/icon/Icon32/page_green.png new file mode 100644 index 0000000..e245bbe Binary files /dev/null and b/asset/icon/Icon32/page_green.png differ diff --git a/asset/icon/Icon32/page_header.png b/asset/icon/Icon32/page_header.png new file mode 100644 index 0000000..9845226 Binary files /dev/null and b/asset/icon/Icon32/page_header.png differ diff --git a/asset/icon/Icon32/page_key.png b/asset/icon/Icon32/page_key.png new file mode 100644 index 0000000..111623c Binary files /dev/null and b/asset/icon/Icon32/page_key.png differ diff --git a/asset/icon/Icon32/page_lightning.png b/asset/icon/Icon32/page_lightning.png new file mode 100644 index 0000000..19c43a3 Binary files /dev/null and b/asset/icon/Icon32/page_lightning.png differ diff --git a/asset/icon/Icon32/page_link.png b/asset/icon/Icon32/page_link.png new file mode 100644 index 0000000..4f461c8 Binary files /dev/null and b/asset/icon/Icon32/page_link.png differ diff --git a/asset/icon/Icon32/page_magnifier.png b/asset/icon/Icon32/page_magnifier.png new file mode 100644 index 0000000..4d35564 Binary files /dev/null and b/asset/icon/Icon32/page_magnifier.png differ diff --git a/asset/icon/Icon32/page_number.png b/asset/icon/Icon32/page_number.png new file mode 100644 index 0000000..c6aec01 Binary files /dev/null and b/asset/icon/Icon32/page_number.png differ diff --git a/asset/icon/Icon32/page_orientation.png b/asset/icon/Icon32/page_orientation.png new file mode 100644 index 0000000..36bebd2 Binary files /dev/null and b/asset/icon/Icon32/page_orientation.png differ diff --git a/asset/icon/Icon32/page_paintbrush.png b/asset/icon/Icon32/page_paintbrush.png new file mode 100644 index 0000000..c095aef Binary files /dev/null and b/asset/icon/Icon32/page_paintbrush.png differ diff --git a/asset/icon/Icon32/page_paste.png b/asset/icon/Icon32/page_paste.png new file mode 100644 index 0000000..3ccd741 Binary files /dev/null and b/asset/icon/Icon32/page_paste.png differ diff --git a/asset/icon/Icon32/page_red.png b/asset/icon/Icon32/page_red.png new file mode 100644 index 0000000..cd337ce Binary files /dev/null and b/asset/icon/Icon32/page_red.png differ diff --git a/asset/icon/Icon32/page_refresh.png b/asset/icon/Icon32/page_refresh.png new file mode 100644 index 0000000..b96fc67 Binary files /dev/null and b/asset/icon/Icon32/page_refresh.png differ diff --git a/asset/icon/Icon32/page_save.png b/asset/icon/Icon32/page_save.png new file mode 100644 index 0000000..6405cf9 Binary files /dev/null and b/asset/icon/Icon32/page_save.png differ diff --git a/asset/icon/Icon32/page_size.png b/asset/icon/Icon32/page_size.png new file mode 100644 index 0000000..bcab22a Binary files /dev/null and b/asset/icon/Icon32/page_size.png differ diff --git a/asset/icon/Icon32/page_update.png b/asset/icon/Icon32/page_update.png new file mode 100644 index 0000000..b1268ae Binary files /dev/null and b/asset/icon/Icon32/page_update.png differ diff --git a/asset/icon/Icon32/page_white.png b/asset/icon/Icon32/page_white.png new file mode 100644 index 0000000..7f1997a Binary files /dev/null and b/asset/icon/Icon32/page_white.png differ diff --git a/asset/icon/Icon32/page_white_acrobat.png b/asset/icon/Icon32/page_white_acrobat.png new file mode 100644 index 0000000..6d03998 Binary files /dev/null and b/asset/icon/Icon32/page_white_acrobat.png differ diff --git a/asset/icon/Icon32/page_white_actionscript.png b/asset/icon/Icon32/page_white_actionscript.png new file mode 100644 index 0000000..303c61d Binary files /dev/null and b/asset/icon/Icon32/page_white_actionscript.png differ diff --git a/asset/icon/Icon32/page_white_add.png b/asset/icon/Icon32/page_white_add.png new file mode 100644 index 0000000..d33fc2b Binary files /dev/null and b/asset/icon/Icon32/page_white_add.png differ diff --git a/asset/icon/Icon32/page_white_c.png b/asset/icon/Icon32/page_white_c.png new file mode 100644 index 0000000..6c03b55 Binary files /dev/null and b/asset/icon/Icon32/page_white_c.png differ diff --git a/asset/icon/Icon32/page_white_camera.png b/asset/icon/Icon32/page_white_camera.png new file mode 100644 index 0000000..9e805c7 Binary files /dev/null and b/asset/icon/Icon32/page_white_camera.png differ diff --git a/asset/icon/Icon32/page_white_cd.png b/asset/icon/Icon32/page_white_cd.png new file mode 100644 index 0000000..4c52b21 Binary files /dev/null and b/asset/icon/Icon32/page_white_cd.png differ diff --git a/asset/icon/Icon32/page_white_code.png b/asset/icon/Icon32/page_white_code.png new file mode 100644 index 0000000..1528183 Binary files /dev/null and b/asset/icon/Icon32/page_white_code.png differ diff --git a/asset/icon/Icon32/page_white_code_red.png b/asset/icon/Icon32/page_white_code_red.png new file mode 100644 index 0000000..6ce7800 Binary files /dev/null and b/asset/icon/Icon32/page_white_code_red.png differ diff --git a/asset/icon/Icon32/page_white_compress.png b/asset/icon/Icon32/page_white_compress.png new file mode 100644 index 0000000..cee5a8d Binary files /dev/null and b/asset/icon/Icon32/page_white_compress.png differ diff --git a/asset/icon/Icon32/page_white_copy.png b/asset/icon/Icon32/page_white_copy.png new file mode 100644 index 0000000..4c21085 Binary files /dev/null and b/asset/icon/Icon32/page_white_copy.png differ diff --git a/asset/icon/Icon32/page_white_cplusplus.png b/asset/icon/Icon32/page_white_cplusplus.png new file mode 100644 index 0000000..39fe7f1 Binary files /dev/null and b/asset/icon/Icon32/page_white_cplusplus.png differ diff --git a/asset/icon/Icon32/page_white_csharp.png b/asset/icon/Icon32/page_white_csharp.png new file mode 100644 index 0000000..c28e1b5 Binary files /dev/null and b/asset/icon/Icon32/page_white_csharp.png differ diff --git a/asset/icon/Icon32/page_white_cup.png b/asset/icon/Icon32/page_white_cup.png new file mode 100644 index 0000000..cd53004 Binary files /dev/null and b/asset/icon/Icon32/page_white_cup.png differ diff --git a/asset/icon/Icon32/page_white_database.png b/asset/icon/Icon32/page_white_database.png new file mode 100644 index 0000000..b20b9a2 Binary files /dev/null and b/asset/icon/Icon32/page_white_database.png differ diff --git a/asset/icon/Icon32/page_white_delete.png b/asset/icon/Icon32/page_white_delete.png new file mode 100644 index 0000000..6c9f525 Binary files /dev/null and b/asset/icon/Icon32/page_white_delete.png differ diff --git a/asset/icon/Icon32/page_white_dvd.png b/asset/icon/Icon32/page_white_dvd.png new file mode 100644 index 0000000..c999be9 Binary files /dev/null and b/asset/icon/Icon32/page_white_dvd.png differ diff --git a/asset/icon/Icon32/page_white_edit.png b/asset/icon/Icon32/page_white_edit.png new file mode 100644 index 0000000..d197d1d Binary files /dev/null and b/asset/icon/Icon32/page_white_edit.png differ diff --git a/asset/icon/Icon32/page_white_error.png b/asset/icon/Icon32/page_white_error.png new file mode 100644 index 0000000..cbd98a8 Binary files /dev/null and b/asset/icon/Icon32/page_white_error.png differ diff --git a/asset/icon/Icon32/page_white_excel.png b/asset/icon/Icon32/page_white_excel.png new file mode 100644 index 0000000..4ce1583 Binary files /dev/null and b/asset/icon/Icon32/page_white_excel.png differ diff --git a/asset/icon/Icon32/page_white_find.png b/asset/icon/Icon32/page_white_find.png new file mode 100644 index 0000000..1d68522 Binary files /dev/null and b/asset/icon/Icon32/page_white_find.png differ diff --git a/asset/icon/Icon32/page_white_flash.png b/asset/icon/Icon32/page_white_flash.png new file mode 100644 index 0000000..c02f04f Binary files /dev/null and b/asset/icon/Icon32/page_white_flash.png differ diff --git a/asset/icon/Icon32/page_white_gear.png b/asset/icon/Icon32/page_white_gear.png new file mode 100644 index 0000000..7ae33c6 Binary files /dev/null and b/asset/icon/Icon32/page_white_gear.png differ diff --git a/asset/icon/Icon32/page_white_get.png b/asset/icon/Icon32/page_white_get.png new file mode 100644 index 0000000..d31b964 Binary files /dev/null and b/asset/icon/Icon32/page_white_get.png differ diff --git a/asset/icon/Icon32/page_white_go.png b/asset/icon/Icon32/page_white_go.png new file mode 100644 index 0000000..d8b9f2c Binary files /dev/null and b/asset/icon/Icon32/page_white_go.png differ diff --git a/asset/icon/Icon32/page_white_h.png b/asset/icon/Icon32/page_white_h.png new file mode 100644 index 0000000..aa2979f Binary files /dev/null and b/asset/icon/Icon32/page_white_h.png differ diff --git a/asset/icon/Icon32/page_white_horizontal.png b/asset/icon/Icon32/page_white_horizontal.png new file mode 100644 index 0000000..6480f35 Binary files /dev/null and b/asset/icon/Icon32/page_white_horizontal.png differ diff --git a/asset/icon/Icon32/page_white_key.png b/asset/icon/Icon32/page_white_key.png new file mode 100644 index 0000000..04f2c35 Binary files /dev/null and b/asset/icon/Icon32/page_white_key.png differ diff --git a/asset/icon/Icon32/page_white_lightning.png b/asset/icon/Icon32/page_white_lightning.png new file mode 100644 index 0000000..2f3cd79 Binary files /dev/null and b/asset/icon/Icon32/page_white_lightning.png differ diff --git a/asset/icon/Icon32/page_white_link.png b/asset/icon/Icon32/page_white_link.png new file mode 100644 index 0000000..9c48267 Binary files /dev/null and b/asset/icon/Icon32/page_white_link.png differ diff --git a/asset/icon/Icon32/page_white_magnify.png b/asset/icon/Icon32/page_white_magnify.png new file mode 100644 index 0000000..d44f9ec Binary files /dev/null and b/asset/icon/Icon32/page_white_magnify.png differ diff --git a/asset/icon/Icon32/page_white_medal.png b/asset/icon/Icon32/page_white_medal.png new file mode 100644 index 0000000..fc4bc31 Binary files /dev/null and b/asset/icon/Icon32/page_white_medal.png differ diff --git a/asset/icon/Icon32/page_white_office.png b/asset/icon/Icon32/page_white_office.png new file mode 100644 index 0000000..46fd1e2 Binary files /dev/null and b/asset/icon/Icon32/page_white_office.png differ diff --git a/asset/icon/Icon32/page_white_paint.png b/asset/icon/Icon32/page_white_paint.png new file mode 100644 index 0000000..33810dc Binary files /dev/null and b/asset/icon/Icon32/page_white_paint.png differ diff --git a/asset/icon/Icon32/page_white_paintbrush.png b/asset/icon/Icon32/page_white_paintbrush.png new file mode 100644 index 0000000..f484b80 Binary files /dev/null and b/asset/icon/Icon32/page_white_paintbrush.png differ diff --git a/asset/icon/Icon32/page_white_paste.png b/asset/icon/Icon32/page_white_paste.png new file mode 100644 index 0000000..79e5b59 Binary files /dev/null and b/asset/icon/Icon32/page_white_paste.png differ diff --git a/asset/icon/Icon32/page_white_php.png b/asset/icon/Icon32/page_white_php.png new file mode 100644 index 0000000..e1830d0 Binary files /dev/null and b/asset/icon/Icon32/page_white_php.png differ diff --git a/asset/icon/Icon32/page_white_picture.png b/asset/icon/Icon32/page_white_picture.png new file mode 100644 index 0000000..7226b1e Binary files /dev/null and b/asset/icon/Icon32/page_white_picture.png differ diff --git a/asset/icon/Icon32/page_white_powerpoint.png b/asset/icon/Icon32/page_white_powerpoint.png new file mode 100644 index 0000000..8f8b876 Binary files /dev/null and b/asset/icon/Icon32/page_white_powerpoint.png differ diff --git a/asset/icon/Icon32/page_white_put.png b/asset/icon/Icon32/page_white_put.png new file mode 100644 index 0000000..8359c0e Binary files /dev/null and b/asset/icon/Icon32/page_white_put.png differ diff --git a/asset/icon/Icon32/page_white_ruby.png b/asset/icon/Icon32/page_white_ruby.png new file mode 100644 index 0000000..a2317e4 Binary files /dev/null and b/asset/icon/Icon32/page_white_ruby.png differ diff --git a/asset/icon/Icon32/page_white_stack.png b/asset/icon/Icon32/page_white_stack.png new file mode 100644 index 0000000..b1469bc Binary files /dev/null and b/asset/icon/Icon32/page_white_stack.png differ diff --git a/asset/icon/Icon32/page_white_star.png b/asset/icon/Icon32/page_white_star.png new file mode 100644 index 0000000..32b4938 Binary files /dev/null and b/asset/icon/Icon32/page_white_star.png differ diff --git a/asset/icon/Icon32/page_white_text.png b/asset/icon/Icon32/page_white_text.png new file mode 100644 index 0000000..d0ba55a Binary files /dev/null and b/asset/icon/Icon32/page_white_text.png differ diff --git a/asset/icon/Icon32/page_white_text_width.png b/asset/icon/Icon32/page_white_text_width.png new file mode 100644 index 0000000..cc8af1b Binary files /dev/null and b/asset/icon/Icon32/page_white_text_width.png differ diff --git a/asset/icon/Icon32/page_white_tux.png b/asset/icon/Icon32/page_white_tux.png new file mode 100644 index 0000000..064104a Binary files /dev/null and b/asset/icon/Icon32/page_white_tux.png differ diff --git a/asset/icon/Icon32/page_white_vector.png b/asset/icon/Icon32/page_white_vector.png new file mode 100644 index 0000000..3c22a57 Binary files /dev/null and b/asset/icon/Icon32/page_white_vector.png differ diff --git a/asset/icon/Icon32/page_white_visualstudio.png b/asset/icon/Icon32/page_white_visualstudio.png new file mode 100644 index 0000000..b380357 Binary files /dev/null and b/asset/icon/Icon32/page_white_visualstudio.png differ diff --git a/asset/icon/Icon32/page_white_width.png b/asset/icon/Icon32/page_white_width.png new file mode 100644 index 0000000..2ccae7f Binary files /dev/null and b/asset/icon/Icon32/page_white_width.png differ diff --git a/asset/icon/Icon32/page_white_word.png b/asset/icon/Icon32/page_white_word.png new file mode 100644 index 0000000..6b4d1bb Binary files /dev/null and b/asset/icon/Icon32/page_white_word.png differ diff --git a/asset/icon/Icon32/page_white_world.png b/asset/icon/Icon32/page_white_world.png new file mode 100644 index 0000000..71127f9 Binary files /dev/null and b/asset/icon/Icon32/page_white_world.png differ diff --git a/asset/icon/Icon32/page_white_wrench.png b/asset/icon/Icon32/page_white_wrench.png new file mode 100644 index 0000000..b508a5a Binary files /dev/null and b/asset/icon/Icon32/page_white_wrench.png differ diff --git a/asset/icon/Icon32/page_white_zip.png b/asset/icon/Icon32/page_white_zip.png new file mode 100644 index 0000000..c8a0a96 Binary files /dev/null and b/asset/icon/Icon32/page_white_zip.png differ diff --git a/asset/icon/Icon32/page_width.png b/asset/icon/Icon32/page_width.png new file mode 100644 index 0000000..2db787b Binary files /dev/null and b/asset/icon/Icon32/page_width.png differ diff --git a/asset/icon/Icon32/page_word.png b/asset/icon/Icon32/page_word.png new file mode 100644 index 0000000..533bb21 Binary files /dev/null and b/asset/icon/Icon32/page_word.png differ diff --git a/asset/icon/Icon32/page_world.png b/asset/icon/Icon32/page_world.png new file mode 100644 index 0000000..60e4f16 Binary files /dev/null and b/asset/icon/Icon32/page_world.png differ diff --git a/asset/icon/Icon32/paginator.png b/asset/icon/Icon32/paginator.png new file mode 100644 index 0000000..30ffcab Binary files /dev/null and b/asset/icon/Icon32/paginator.png differ diff --git a/asset/icon/Icon32/painbrush.png b/asset/icon/Icon32/painbrush.png new file mode 100644 index 0000000..27fd06c Binary files /dev/null and b/asset/icon/Icon32/painbrush.png differ diff --git a/asset/icon/Icon32/paint_tube.png b/asset/icon/Icon32/paint_tube.png new file mode 100644 index 0000000..98ceca4 Binary files /dev/null and b/asset/icon/Icon32/paint_tube.png differ diff --git a/asset/icon/Icon32/paintcan.png b/asset/icon/Icon32/paintcan.png new file mode 100644 index 0000000..f8e5b8c Binary files /dev/null and b/asset/icon/Icon32/paintcan.png differ diff --git a/asset/icon/Icon32/palette.png b/asset/icon/Icon32/palette.png new file mode 100644 index 0000000..a42fdde Binary files /dev/null and b/asset/icon/Icon32/palette.png differ diff --git a/asset/icon/Icon32/pandora.png b/asset/icon/Icon32/pandora.png new file mode 100644 index 0000000..a6e2d99 Binary files /dev/null and b/asset/icon/Icon32/pandora.png differ diff --git a/asset/icon/Icon32/panel(2).png b/asset/icon/Icon32/panel(2).png new file mode 100644 index 0000000..7b5cab1 Binary files /dev/null and b/asset/icon/Icon32/panel(2).png differ diff --git a/asset/icon/Icon32/panel.png b/asset/icon/Icon32/panel.png new file mode 100644 index 0000000..22dffe8 Binary files /dev/null and b/asset/icon/Icon32/panel.png differ diff --git a/asset/icon/Icon32/panel_resize.png b/asset/icon/Icon32/panel_resize.png new file mode 100644 index 0000000..3662044 Binary files /dev/null and b/asset/icon/Icon32/panel_resize.png differ diff --git a/asset/icon/Icon32/panel_resize_actual.png b/asset/icon/Icon32/panel_resize_actual.png new file mode 100644 index 0000000..0de161b Binary files /dev/null and b/asset/icon/Icon32/panel_resize_actual.png differ diff --git a/asset/icon/Icon32/paper_airplane.png b/asset/icon/Icon32/paper_airplane.png new file mode 100644 index 0000000..226e001 Binary files /dev/null and b/asset/icon/Icon32/paper_airplane.png differ diff --git a/asset/icon/Icon32/paper_lantern.png b/asset/icon/Icon32/paper_lantern.png new file mode 100644 index 0000000..f23869e Binary files /dev/null and b/asset/icon/Icon32/paper_lantern.png differ diff --git a/asset/icon/Icon32/paper_lantern_red.png b/asset/icon/Icon32/paper_lantern_red.png new file mode 100644 index 0000000..9014ef5 Binary files /dev/null and b/asset/icon/Icon32/paper_lantern_red.png differ diff --git a/asset/icon/Icon32/paragraph_spacing.png b/asset/icon/Icon32/paragraph_spacing.png new file mode 100644 index 0000000..114f197 Binary files /dev/null and b/asset/icon/Icon32/paragraph_spacing.png differ diff --git a/asset/icon/Icon32/parked_domains.png b/asset/icon/Icon32/parked_domains.png new file mode 100644 index 0000000..a1e4cb1 Binary files /dev/null and b/asset/icon/Icon32/parked_domains.png differ diff --git a/asset/icon/Icon32/parrot.png b/asset/icon/Icon32/parrot.png new file mode 100644 index 0000000..a0945c5 Binary files /dev/null and b/asset/icon/Icon32/parrot.png differ diff --git a/asset/icon/Icon32/participation_rate.png b/asset/icon/Icon32/participation_rate.png new file mode 100644 index 0000000..1c30d07 Binary files /dev/null and b/asset/icon/Icon32/participation_rate.png differ diff --git a/asset/icon/Icon32/party_hat.png b/asset/icon/Icon32/party_hat.png new file mode 100644 index 0000000..364a5ba Binary files /dev/null and b/asset/icon/Icon32/party_hat.png differ diff --git a/asset/icon/Icon32/password_protect_directories.png b/asset/icon/Icon32/password_protect_directories.png new file mode 100644 index 0000000..15870fc Binary files /dev/null and b/asset/icon/Icon32/password_protect_directories.png differ diff --git a/asset/icon/Icon32/paste_plain.png b/asset/icon/Icon32/paste_plain.png new file mode 100644 index 0000000..c963ba6 Binary files /dev/null and b/asset/icon/Icon32/paste_plain.png differ diff --git a/asset/icon/Icon32/paste_word.png b/asset/icon/Icon32/paste_word.png new file mode 100644 index 0000000..14f9754 Binary files /dev/null and b/asset/icon/Icon32/paste_word.png differ diff --git a/asset/icon/Icon32/paypal(2).png b/asset/icon/Icon32/paypal(2).png new file mode 100644 index 0000000..a746d71 Binary files /dev/null and b/asset/icon/Icon32/paypal(2).png differ diff --git a/asset/icon/Icon32/paypal.png b/asset/icon/Icon32/paypal.png new file mode 100644 index 0000000..62eec45 Binary files /dev/null and b/asset/icon/Icon32/paypal.png differ diff --git a/asset/icon/Icon32/pc_linux_os.png b/asset/icon/Icon32/pc_linux_os.png new file mode 100644 index 0000000..6b484ce Binary files /dev/null and b/asset/icon/Icon32/pc_linux_os.png differ diff --git a/asset/icon/Icon32/pci.png b/asset/icon/Icon32/pci.png new file mode 100644 index 0000000..1d16b23 Binary files /dev/null and b/asset/icon/Icon32/pci.png differ diff --git a/asset/icon/Icon32/pdf_exports.png b/asset/icon/Icon32/pdf_exports.png new file mode 100644 index 0000000..e3b7580 Binary files /dev/null and b/asset/icon/Icon32/pdf_exports.png differ diff --git a/asset/icon/Icon32/peacock.png b/asset/icon/Icon32/peacock.png new file mode 100644 index 0000000..75e60dc Binary files /dev/null and b/asset/icon/Icon32/peacock.png differ diff --git a/asset/icon/Icon32/peak_cap.png b/asset/icon/Icon32/peak_cap.png new file mode 100644 index 0000000..d1c8db7 Binary files /dev/null and b/asset/icon/Icon32/peak_cap.png differ diff --git a/asset/icon/Icon32/pearl.png b/asset/icon/Icon32/pearl.png new file mode 100644 index 0000000..9d76cc7 Binary files /dev/null and b/asset/icon/Icon32/pearl.png differ diff --git a/asset/icon/Icon32/pedestal.png b/asset/icon/Icon32/pedestal.png new file mode 100644 index 0000000..fe38ec8 Binary files /dev/null and b/asset/icon/Icon32/pedestal.png differ diff --git a/asset/icon/Icon32/pencil.png b/asset/icon/Icon32/pencil.png new file mode 100644 index 0000000..0ee281c Binary files /dev/null and b/asset/icon/Icon32/pencil.png differ diff --git a/asset/icon/Icon32/pencil_add.png b/asset/icon/Icon32/pencil_add.png new file mode 100644 index 0000000..37a43b3 Binary files /dev/null and b/asset/icon/Icon32/pencil_add.png differ diff --git a/asset/icon/Icon32/pencil_delete.png b/asset/icon/Icon32/pencil_delete.png new file mode 100644 index 0000000..37b9ba6 Binary files /dev/null and b/asset/icon/Icon32/pencil_delete.png differ diff --git a/asset/icon/Icon32/pencil_go.png b/asset/icon/Icon32/pencil_go.png new file mode 100644 index 0000000..f83c3af Binary files /dev/null and b/asset/icon/Icon32/pencil_go.png differ diff --git a/asset/icon/Icon32/pencil_ruler.png b/asset/icon/Icon32/pencil_ruler.png new file mode 100644 index 0000000..8cb1f14 Binary files /dev/null and b/asset/icon/Icon32/pencil_ruler.png differ diff --git a/asset/icon/Icon32/people_pane.png b/asset/icon/Icon32/people_pane.png new file mode 100644 index 0000000..723e954 Binary files /dev/null and b/asset/icon/Icon32/people_pane.png differ diff --git a/asset/icon/Icon32/pepper.png b/asset/icon/Icon32/pepper.png new file mode 100644 index 0000000..cbc8861 Binary files /dev/null and b/asset/icon/Icon32/pepper.png differ diff --git a/asset/icon/Icon32/perfomance.png b/asset/icon/Icon32/perfomance.png new file mode 100644 index 0000000..bca67ce Binary files /dev/null and b/asset/icon/Icon32/perfomance.png differ diff --git a/asset/icon/Icon32/perfomance_analysis.png b/asset/icon/Icon32/perfomance_analysis.png new file mode 100644 index 0000000..4e9baac Binary files /dev/null and b/asset/icon/Icon32/perfomance_analysis.png differ diff --git a/asset/icon/Icon32/perl_modules.png b/asset/icon/Icon32/perl_modules.png new file mode 100644 index 0000000..caf8bc0 Binary files /dev/null and b/asset/icon/Icon32/perl_modules.png differ diff --git a/asset/icon/Icon32/personal_finance.png b/asset/icon/Icon32/personal_finance.png new file mode 100644 index 0000000..875f393 Binary files /dev/null and b/asset/icon/Icon32/personal_finance.png differ diff --git a/asset/icon/Icon32/personals.png b/asset/icon/Icon32/personals.png new file mode 100644 index 0000000..6e34808 Binary files /dev/null and b/asset/icon/Icon32/personals.png differ diff --git a/asset/icon/Icon32/phone.png b/asset/icon/Icon32/phone.png new file mode 100644 index 0000000..1ac9643 Binary files /dev/null and b/asset/icon/Icon32/phone.png differ diff --git a/asset/icon/Icon32/phone_Android.png b/asset/icon/Icon32/phone_Android.png new file mode 100644 index 0000000..7b51cef Binary files /dev/null and b/asset/icon/Icon32/phone_Android.png differ diff --git a/asset/icon/Icon32/phone_add.png b/asset/icon/Icon32/phone_add.png new file mode 100644 index 0000000..89ccaa9 Binary files /dev/null and b/asset/icon/Icon32/phone_add.png differ diff --git a/asset/icon/Icon32/phone_delete.png b/asset/icon/Icon32/phone_delete.png new file mode 100644 index 0000000..b8fa644 Binary files /dev/null and b/asset/icon/Icon32/phone_delete.png differ diff --git a/asset/icon/Icon32/phone_handset.png b/asset/icon/Icon32/phone_handset.png new file mode 100644 index 0000000..21e7946 Binary files /dev/null and b/asset/icon/Icon32/phone_handset.png differ diff --git a/asset/icon/Icon32/phone_sound.png b/asset/icon/Icon32/phone_sound.png new file mode 100644 index 0000000..cfc41f5 Binary files /dev/null and b/asset/icon/Icon32/phone_sound.png differ diff --git a/asset/icon/Icon32/phone_vintage.png b/asset/icon/Icon32/phone_vintage.png new file mode 100644 index 0000000..317196b Binary files /dev/null and b/asset/icon/Icon32/phone_vintage.png differ diff --git a/asset/icon/Icon32/photo.png b/asset/icon/Icon32/photo.png new file mode 100644 index 0000000..5d71b13 Binary files /dev/null and b/asset/icon/Icon32/photo.png differ diff --git a/asset/icon/Icon32/photo_add.png b/asset/icon/Icon32/photo_add.png new file mode 100644 index 0000000..96c5744 Binary files /dev/null and b/asset/icon/Icon32/photo_add.png differ diff --git a/asset/icon/Icon32/photo_album(2).png b/asset/icon/Icon32/photo_album(2).png new file mode 100644 index 0000000..0e574eb Binary files /dev/null and b/asset/icon/Icon32/photo_album(2).png differ diff --git a/asset/icon/Icon32/photo_album.png b/asset/icon/Icon32/photo_album.png new file mode 100644 index 0000000..6a97713 Binary files /dev/null and b/asset/icon/Icon32/photo_album.png differ diff --git a/asset/icon/Icon32/photo_delete.png b/asset/icon/Icon32/photo_delete.png new file mode 100644 index 0000000..b93d2bc Binary files /dev/null and b/asset/icon/Icon32/photo_delete.png differ diff --git a/asset/icon/Icon32/photo_link.png b/asset/icon/Icon32/photo_link.png new file mode 100644 index 0000000..12823e1 Binary files /dev/null and b/asset/icon/Icon32/photo_link.png differ diff --git a/asset/icon/Icon32/photos.png b/asset/icon/Icon32/photos.png new file mode 100644 index 0000000..e20a742 Binary files /dev/null and b/asset/icon/Icon32/photos.png differ diff --git a/asset/icon/Icon32/php.png b/asset/icon/Icon32/php.png new file mode 100644 index 0000000..06a0a48 Binary files /dev/null and b/asset/icon/Icon32/php.png differ diff --git a/asset/icon/Icon32/php_configuration.png b/asset/icon/Icon32/php_configuration.png new file mode 100644 index 0000000..cc13932 Binary files /dev/null and b/asset/icon/Icon32/php_configuration.png differ diff --git a/asset/icon/Icon32/php_pear_package.png b/asset/icon/Icon32/php_pear_package.png new file mode 100644 index 0000000..fd01e53 Binary files /dev/null and b/asset/icon/Icon32/php_pear_package.png differ diff --git a/asset/icon/Icon32/pi_math.png b/asset/icon/Icon32/pi_math.png new file mode 100644 index 0000000..e775604 Binary files /dev/null and b/asset/icon/Icon32/pi_math.png differ diff --git a/asset/icon/Icon32/piano.png b/asset/icon/Icon32/piano.png new file mode 100644 index 0000000..aa3a4ea Binary files /dev/null and b/asset/icon/Icon32/piano.png differ diff --git a/asset/icon/Icon32/picasa.png b/asset/icon/Icon32/picasa.png new file mode 100644 index 0000000..03be69b Binary files /dev/null and b/asset/icon/Icon32/picasa.png differ diff --git a/asset/icon/Icon32/picture.png b/asset/icon/Icon32/picture.png new file mode 100644 index 0000000..adcd7b2 Binary files /dev/null and b/asset/icon/Icon32/picture.png differ diff --git a/asset/icon/Icon32/picture_add.png b/asset/icon/Icon32/picture_add.png new file mode 100644 index 0000000..6cf8bf5 Binary files /dev/null and b/asset/icon/Icon32/picture_add.png differ diff --git a/asset/icon/Icon32/picture_delete.png b/asset/icon/Icon32/picture_delete.png new file mode 100644 index 0000000..5e50f9a Binary files /dev/null and b/asset/icon/Icon32/picture_delete.png differ diff --git a/asset/icon/Icon32/picture_edit.png b/asset/icon/Icon32/picture_edit.png new file mode 100644 index 0000000..32a5273 Binary files /dev/null and b/asset/icon/Icon32/picture_edit.png differ diff --git a/asset/icon/Icon32/picture_empty.png b/asset/icon/Icon32/picture_empty.png new file mode 100644 index 0000000..3c54ba6 Binary files /dev/null and b/asset/icon/Icon32/picture_empty.png differ diff --git a/asset/icon/Icon32/picture_error.png b/asset/icon/Icon32/picture_error.png new file mode 100644 index 0000000..5fc148d Binary files /dev/null and b/asset/icon/Icon32/picture_error.png differ diff --git a/asset/icon/Icon32/picture_frame.png b/asset/icon/Icon32/picture_frame.png new file mode 100644 index 0000000..a035f08 Binary files /dev/null and b/asset/icon/Icon32/picture_frame.png differ diff --git a/asset/icon/Icon32/picture_go.png b/asset/icon/Icon32/picture_go.png new file mode 100644 index 0000000..4e09d53 Binary files /dev/null and b/asset/icon/Icon32/picture_go.png differ diff --git a/asset/icon/Icon32/picture_insert.png b/asset/icon/Icon32/picture_insert.png new file mode 100644 index 0000000..1698db4 Binary files /dev/null and b/asset/icon/Icon32/picture_insert.png differ diff --git a/asset/icon/Icon32/picture_insert_from_web.png b/asset/icon/Icon32/picture_insert_from_web.png new file mode 100644 index 0000000..5d8ff87 Binary files /dev/null and b/asset/icon/Icon32/picture_insert_from_web.png differ diff --git a/asset/icon/Icon32/picture_key.png b/asset/icon/Icon32/picture_key.png new file mode 100644 index 0000000..75d63ee Binary files /dev/null and b/asset/icon/Icon32/picture_key.png differ diff --git a/asset/icon/Icon32/picture_link.png b/asset/icon/Icon32/picture_link.png new file mode 100644 index 0000000..3d5ae0c Binary files /dev/null and b/asset/icon/Icon32/picture_link.png differ diff --git a/asset/icon/Icon32/picture_position.png b/asset/icon/Icon32/picture_position.png new file mode 100644 index 0000000..0afd734 Binary files /dev/null and b/asset/icon/Icon32/picture_position.png differ diff --git a/asset/icon/Icon32/picture_save.png b/asset/icon/Icon32/picture_save.png new file mode 100644 index 0000000..a12d496 Binary files /dev/null and b/asset/icon/Icon32/picture_save.png differ diff --git a/asset/icon/Icon32/picture_sunset.png b/asset/icon/Icon32/picture_sunset.png new file mode 100644 index 0000000..d3f93b2 Binary files /dev/null and b/asset/icon/Icon32/picture_sunset.png differ diff --git a/asset/icon/Icon32/pictures.png b/asset/icon/Icon32/pictures.png new file mode 100644 index 0000000..c392e90 Binary files /dev/null and b/asset/icon/Icon32/pictures.png differ diff --git a/asset/icon/Icon32/piece_of_cake.png b/asset/icon/Icon32/piece_of_cake.png new file mode 100644 index 0000000..e0d1d69 Binary files /dev/null and b/asset/icon/Icon32/piece_of_cake.png differ diff --git a/asset/icon/Icon32/piechart.png b/asset/icon/Icon32/piechart.png new file mode 100644 index 0000000..516e2b5 Binary files /dev/null and b/asset/icon/Icon32/piechart.png differ diff --git a/asset/icon/Icon32/pilcrow.png b/asset/icon/Icon32/pilcrow.png new file mode 100644 index 0000000..f5ad844 Binary files /dev/null and b/asset/icon/Icon32/pilcrow.png differ diff --git a/asset/icon/Icon32/pill.png b/asset/icon/Icon32/pill.png new file mode 100644 index 0000000..d483c82 Binary files /dev/null and b/asset/icon/Icon32/pill.png differ diff --git a/asset/icon/Icon32/pill_add.png b/asset/icon/Icon32/pill_add.png new file mode 100644 index 0000000..032c690 Binary files /dev/null and b/asset/icon/Icon32/pill_add.png differ diff --git a/asset/icon/Icon32/pill_delete.png b/asset/icon/Icon32/pill_delete.png new file mode 100644 index 0000000..ae5b335 Binary files /dev/null and b/asset/icon/Icon32/pill_delete.png differ diff --git a/asset/icon/Icon32/pill_go.png b/asset/icon/Icon32/pill_go.png new file mode 100644 index 0000000..d51eeb6 Binary files /dev/null and b/asset/icon/Icon32/pill_go.png differ diff --git a/asset/icon/Icon32/pint.png b/asset/icon/Icon32/pint.png new file mode 100644 index 0000000..3f0f710 Binary files /dev/null and b/asset/icon/Icon32/pint.png differ diff --git a/asset/icon/Icon32/pipette.png b/asset/icon/Icon32/pipette.png new file mode 100644 index 0000000..98508b0 Binary files /dev/null and b/asset/icon/Icon32/pipette.png differ diff --git a/asset/icon/Icon32/pirate_flag.png b/asset/icon/Icon32/pirate_flag.png new file mode 100644 index 0000000..9618f1a Binary files /dev/null and b/asset/icon/Icon32/pirate_flag.png differ diff --git a/asset/icon/Icon32/pizza.png b/asset/icon/Icon32/pizza.png new file mode 100644 index 0000000..d027a96 Binary files /dev/null and b/asset/icon/Icon32/pizza.png differ diff --git a/asset/icon/Icon32/places.png b/asset/icon/Icon32/places.png new file mode 100644 index 0000000..df2085e Binary files /dev/null and b/asset/icon/Icon32/places.png differ diff --git a/asset/icon/Icon32/plane.png b/asset/icon/Icon32/plane.png new file mode 100644 index 0000000..1cab00b Binary files /dev/null and b/asset/icon/Icon32/plane.png differ diff --git a/asset/icon/Icon32/playstation.png b/asset/icon/Icon32/playstation.png new file mode 100644 index 0000000..3dafbb1 Binary files /dev/null and b/asset/icon/Icon32/playstation.png differ diff --git a/asset/icon/Icon32/plotchart.png b/asset/icon/Icon32/plotchart.png new file mode 100644 index 0000000..970be30 Binary files /dev/null and b/asset/icon/Icon32/plotchart.png differ diff --git a/asset/icon/Icon32/plugin.png b/asset/icon/Icon32/plugin.png new file mode 100644 index 0000000..c1ee68d Binary files /dev/null and b/asset/icon/Icon32/plugin.png differ diff --git a/asset/icon/Icon32/plugin_add.png b/asset/icon/Icon32/plugin_add.png new file mode 100644 index 0000000..3a16f20 Binary files /dev/null and b/asset/icon/Icon32/plugin_add.png differ diff --git a/asset/icon/Icon32/plugin_delete.png b/asset/icon/Icon32/plugin_delete.png new file mode 100644 index 0000000..56732c1 Binary files /dev/null and b/asset/icon/Icon32/plugin_delete.png differ diff --git a/asset/icon/Icon32/plugin_disabled.png b/asset/icon/Icon32/plugin_disabled.png new file mode 100644 index 0000000..cbb3bca Binary files /dev/null and b/asset/icon/Icon32/plugin_disabled.png differ diff --git a/asset/icon/Icon32/plugin_edit.png b/asset/icon/Icon32/plugin_edit.png new file mode 100644 index 0000000..d22923b Binary files /dev/null and b/asset/icon/Icon32/plugin_edit.png differ diff --git a/asset/icon/Icon32/plugin_error.png b/asset/icon/Icon32/plugin_error.png new file mode 100644 index 0000000..a59a916 Binary files /dev/null and b/asset/icon/Icon32/plugin_error.png differ diff --git a/asset/icon/Icon32/plugin_go.png b/asset/icon/Icon32/plugin_go.png new file mode 100644 index 0000000..8f5b5b7 Binary files /dev/null and b/asset/icon/Icon32/plugin_go.png differ diff --git a/asset/icon/Icon32/plugin_link.png b/asset/icon/Icon32/plugin_link.png new file mode 100644 index 0000000..2d6a00e Binary files /dev/null and b/asset/icon/Icon32/plugin_link.png differ diff --git a/asset/icon/Icon32/plurk.png b/asset/icon/Icon32/plurk.png new file mode 100644 index 0000000..342525a Binary files /dev/null and b/asset/icon/Icon32/plurk.png differ diff --git a/asset/icon/Icon32/plus.png b/asset/icon/Icon32/plus.png new file mode 100644 index 0000000..7f28bbd Binary files /dev/null and b/asset/icon/Icon32/plus.png differ diff --git a/asset/icon/Icon32/plus_button.png b/asset/icon/Icon32/plus_button.png new file mode 100644 index 0000000..2fd4b0b Binary files /dev/null and b/asset/icon/Icon32/plus_button.png differ diff --git a/asset/icon/Icon32/plus_circle_frame.png b/asset/icon/Icon32/plus_circle_frame.png new file mode 100644 index 0000000..64260a9 Binary files /dev/null and b/asset/icon/Icon32/plus_circle_frame.png differ diff --git a/asset/icon/Icon32/plus_light_blue.png b/asset/icon/Icon32/plus_light_blue.png new file mode 100644 index 0000000..841d758 Binary files /dev/null and b/asset/icon/Icon32/plus_light_blue.png differ diff --git a/asset/icon/Icon32/plus_octagon.png b/asset/icon/Icon32/plus_octagon.png new file mode 100644 index 0000000..ab44bec Binary files /dev/null and b/asset/icon/Icon32/plus_octagon.png differ diff --git a/asset/icon/Icon32/plus_octagon_frame.png b/asset/icon/Icon32/plus_octagon_frame.png new file mode 100644 index 0000000..7562d5a Binary files /dev/null and b/asset/icon/Icon32/plus_octagon_frame.png differ diff --git a/asset/icon/Icon32/plus_shield.png b/asset/icon/Icon32/plus_shield.png new file mode 100644 index 0000000..bdc721e Binary files /dev/null and b/asset/icon/Icon32/plus_shield.png differ diff --git a/asset/icon/Icon32/point_bronze.png b/asset/icon/Icon32/point_bronze.png new file mode 100644 index 0000000..52a1754 Binary files /dev/null and b/asset/icon/Icon32/point_bronze.png differ diff --git a/asset/icon/Icon32/point_gold.png b/asset/icon/Icon32/point_gold.png new file mode 100644 index 0000000..c8941f2 Binary files /dev/null and b/asset/icon/Icon32/point_gold.png differ diff --git a/asset/icon/Icon32/point_silver.png b/asset/icon/Icon32/point_silver.png new file mode 100644 index 0000000..0e49af3 Binary files /dev/null and b/asset/icon/Icon32/point_silver.png differ diff --git a/asset/icon/Icon32/point_small.png b/asset/icon/Icon32/point_small.png new file mode 100644 index 0000000..c133344 Binary files /dev/null and b/asset/icon/Icon32/point_small.png differ diff --git a/asset/icon/Icon32/points_small.png b/asset/icon/Icon32/points_small.png new file mode 100644 index 0000000..1da66bb Binary files /dev/null and b/asset/icon/Icon32/points_small.png differ diff --git a/asset/icon/Icon32/poker.png b/asset/icon/Icon32/poker.png new file mode 100644 index 0000000..64e1ecb Binary files /dev/null and b/asset/icon/Icon32/poker.png differ diff --git a/asset/icon/Icon32/poo.png b/asset/icon/Icon32/poo.png new file mode 100644 index 0000000..bd86f6a Binary files /dev/null and b/asset/icon/Icon32/poo.png differ diff --git a/asset/icon/Icon32/pop3_server.png b/asset/icon/Icon32/pop3_server.png new file mode 100644 index 0000000..b974276 Binary files /dev/null and b/asset/icon/Icon32/pop3_server.png differ diff --git a/asset/icon/Icon32/pop_mail.png b/asset/icon/Icon32/pop_mail.png new file mode 100644 index 0000000..7e20a45 Binary files /dev/null and b/asset/icon/Icon32/pop_mail.png differ diff --git a/asset/icon/Icon32/popcorn.png b/asset/icon/Icon32/popcorn.png new file mode 100644 index 0000000..5289879 Binary files /dev/null and b/asset/icon/Icon32/popcorn.png differ diff --git a/asset/icon/Icon32/port.png b/asset/icon/Icon32/port.png new file mode 100644 index 0000000..7e96c22 Binary files /dev/null and b/asset/icon/Icon32/port.png differ diff --git a/asset/icon/Icon32/postage_stamp.png b/asset/icon/Icon32/postage_stamp.png new file mode 100644 index 0000000..758faab Binary files /dev/null and b/asset/icon/Icon32/postage_stamp.png differ diff --git a/asset/icon/Icon32/posterous.png b/asset/icon/Icon32/posterous.png new file mode 100644 index 0000000..d9f62f3 Binary files /dev/null and b/asset/icon/Icon32/posterous.png differ diff --git a/asset/icon/Icon32/power_supply.png b/asset/icon/Icon32/power_supply.png new file mode 100644 index 0000000..22691c7 Binary files /dev/null and b/asset/icon/Icon32/power_supply.png differ diff --git a/asset/icon/Icon32/power_surge.png b/asset/icon/Icon32/power_surge.png new file mode 100644 index 0000000..f5e7649 Binary files /dev/null and b/asset/icon/Icon32/power_surge.png differ diff --git a/asset/icon/Icon32/preferences.png b/asset/icon/Icon32/preferences.png new file mode 100644 index 0000000..873da0c Binary files /dev/null and b/asset/icon/Icon32/preferences.png differ diff --git a/asset/icon/Icon32/premium_support.png b/asset/icon/Icon32/premium_support.png new file mode 100644 index 0000000..33d3bbf Binary files /dev/null and b/asset/icon/Icon32/premium_support.png differ diff --git a/asset/icon/Icon32/preview_results.png b/asset/icon/Icon32/preview_results.png new file mode 100644 index 0000000..d25bb02 Binary files /dev/null and b/asset/icon/Icon32/preview_results.png differ diff --git a/asset/icon/Icon32/previous_footnote.png b/asset/icon/Icon32/previous_footnote.png new file mode 100644 index 0000000..d889918 Binary files /dev/null and b/asset/icon/Icon32/previous_footnote.png differ diff --git a/asset/icon/Icon32/previous_markup.png b/asset/icon/Icon32/previous_markup.png new file mode 100644 index 0000000..fbe51fa Binary files /dev/null and b/asset/icon/Icon32/previous_markup.png differ diff --git a/asset/icon/Icon32/price_alert.png b/asset/icon/Icon32/price_alert.png new file mode 100644 index 0000000..bc8f29b Binary files /dev/null and b/asset/icon/Icon32/price_alert.png differ diff --git a/asset/icon/Icon32/price_comparison.png b/asset/icon/Icon32/price_comparison.png new file mode 100644 index 0000000..2d9094e Binary files /dev/null and b/asset/icon/Icon32/price_comparison.png differ diff --git a/asset/icon/Icon32/price_watch.png b/asset/icon/Icon32/price_watch.png new file mode 100644 index 0000000..4d3b030 Binary files /dev/null and b/asset/icon/Icon32/price_watch.png differ diff --git a/asset/icon/Icon32/print_size.png b/asset/icon/Icon32/print_size.png new file mode 100644 index 0000000..af8ad34 Binary files /dev/null and b/asset/icon/Icon32/print_size.png differ diff --git a/asset/icon/Icon32/print_tiles.png b/asset/icon/Icon32/print_tiles.png new file mode 100644 index 0000000..e4d7457 Binary files /dev/null and b/asset/icon/Icon32/print_tiles.png differ diff --git a/asset/icon/Icon32/printer.png b/asset/icon/Icon32/printer.png new file mode 100644 index 0000000..d094d2b Binary files /dev/null and b/asset/icon/Icon32/printer.png differ diff --git a/asset/icon/Icon32/printer_add.png b/asset/icon/Icon32/printer_add.png new file mode 100644 index 0000000..2fea9ae Binary files /dev/null and b/asset/icon/Icon32/printer_add.png differ diff --git a/asset/icon/Icon32/printer_color.png b/asset/icon/Icon32/printer_color.png new file mode 100644 index 0000000..a120009 Binary files /dev/null and b/asset/icon/Icon32/printer_color.png differ diff --git a/asset/icon/Icon32/printer_delete.png b/asset/icon/Icon32/printer_delete.png new file mode 100644 index 0000000..d0beb85 Binary files /dev/null and b/asset/icon/Icon32/printer_delete.png differ diff --git a/asset/icon/Icon32/printer_empty.png b/asset/icon/Icon32/printer_empty.png new file mode 100644 index 0000000..6e728fb Binary files /dev/null and b/asset/icon/Icon32/printer_empty.png differ diff --git a/asset/icon/Icon32/printer_error.png b/asset/icon/Icon32/printer_error.png new file mode 100644 index 0000000..1872f3d Binary files /dev/null and b/asset/icon/Icon32/printer_error.png differ diff --git a/asset/icon/Icon32/printer_network.png b/asset/icon/Icon32/printer_network.png new file mode 100644 index 0000000..6ea8329 Binary files /dev/null and b/asset/icon/Icon32/printer_network.png differ diff --git a/asset/icon/Icon32/printscreen_insert.png b/asset/icon/Icon32/printscreen_insert.png new file mode 100644 index 0000000..9818c77 Binary files /dev/null and b/asset/icon/Icon32/printscreen_insert.png differ diff --git a/asset/icon/Icon32/private.png b/asset/icon/Icon32/private.png new file mode 100644 index 0000000..4b00791 Binary files /dev/null and b/asset/icon/Icon32/private.png differ diff --git a/asset/icon/Icon32/process_marked_headers.png b/asset/icon/Icon32/process_marked_headers.png new file mode 100644 index 0000000..fba1f1f Binary files /dev/null and b/asset/icon/Icon32/process_marked_headers.png differ diff --git a/asset/icon/Icon32/processor.png b/asset/icon/Icon32/processor.png new file mode 100644 index 0000000..7360dd1 Binary files /dev/null and b/asset/icon/Icon32/processor.png differ diff --git a/asset/icon/Icon32/production_copyleft.png b/asset/icon/Icon32/production_copyleft.png new file mode 100644 index 0000000..c3af399 Binary files /dev/null and b/asset/icon/Icon32/production_copyleft.png differ diff --git a/asset/icon/Icon32/profiles.png b/asset/icon/Icon32/profiles.png new file mode 100644 index 0000000..88d2d4b Binary files /dev/null and b/asset/icon/Icon32/profiles.png differ diff --git a/asset/icon/Icon32/progressbar.png b/asset/icon/Icon32/progressbar.png new file mode 100644 index 0000000..0884614 Binary files /dev/null and b/asset/icon/Icon32/progressbar.png differ diff --git a/asset/icon/Icon32/prohibition_button.png b/asset/icon/Icon32/prohibition_button.png new file mode 100644 index 0000000..e901278 Binary files /dev/null and b/asset/icon/Icon32/prohibition_button.png differ diff --git a/asset/icon/Icon32/property_export.png b/asset/icon/Icon32/property_export.png new file mode 100644 index 0000000..ce3e38c Binary files /dev/null and b/asset/icon/Icon32/property_export.png differ diff --git a/asset/icon/Icon32/property_import.png b/asset/icon/Icon32/property_import.png new file mode 100644 index 0000000..7087f2c Binary files /dev/null and b/asset/icon/Icon32/property_import.png differ diff --git a/asset/icon/Icon32/protect_share_workbook.png b/asset/icon/Icon32/protect_share_workbook.png new file mode 100644 index 0000000..09cb1f3 Binary files /dev/null and b/asset/icon/Icon32/protect_share_workbook.png differ diff --git a/asset/icon/Icon32/protect_sheet.png b/asset/icon/Icon32/protect_sheet.png new file mode 100644 index 0000000..1400644 Binary files /dev/null and b/asset/icon/Icon32/protect_sheet.png differ diff --git a/asset/icon/Icon32/protect_workbook.png b/asset/icon/Icon32/protect_workbook.png new file mode 100644 index 0000000..1bc2f0e Binary files /dev/null and b/asset/icon/Icon32/protect_workbook.png differ diff --git a/asset/icon/Icon32/publisher_bookmark.png b/asset/icon/Icon32/publisher_bookmark.png new file mode 100644 index 0000000..75cebee Binary files /dev/null and b/asset/icon/Icon32/publisher_bookmark.png differ diff --git a/asset/icon/Icon32/purchase_install_ssl_certificate.png b/asset/icon/Icon32/purchase_install_ssl_certificate.png new file mode 100644 index 0000000..9236ad9 Binary files /dev/null and b/asset/icon/Icon32/purchase_install_ssl_certificate.png differ diff --git a/asset/icon/Icon32/purse.png b/asset/icon/Icon32/purse.png new file mode 100644 index 0000000..44e838c Binary files /dev/null and b/asset/icon/Icon32/purse.png differ diff --git a/asset/icon/Icon32/qik.png b/asset/icon/Icon32/qik.png new file mode 100644 index 0000000..0cd38b2 Binary files /dev/null and b/asset/icon/Icon32/qik.png differ diff --git a/asset/icon/Icon32/qip_angry.png b/asset/icon/Icon32/qip_angry.png new file mode 100644 index 0000000..402eedf Binary files /dev/null and b/asset/icon/Icon32/qip_angry.png differ diff --git a/asset/icon/Icon32/qip_at_home.png b/asset/icon/Icon32/qip_at_home.png new file mode 100644 index 0000000..565063e Binary files /dev/null and b/asset/icon/Icon32/qip_at_home.png differ diff --git a/asset/icon/Icon32/qip_at_work.png b/asset/icon/Icon32/qip_at_work.png new file mode 100644 index 0000000..2b8aa0d Binary files /dev/null and b/asset/icon/Icon32/qip_at_work.png differ diff --git a/asset/icon/Icon32/qip_away.png b/asset/icon/Icon32/qip_away.png new file mode 100644 index 0000000..1a422f9 Binary files /dev/null and b/asset/icon/Icon32/qip_away.png differ diff --git a/asset/icon/Icon32/qip_bad_mood.png b/asset/icon/Icon32/qip_bad_mood.png new file mode 100644 index 0000000..86375a6 Binary files /dev/null and b/asset/icon/Icon32/qip_bad_mood.png differ diff --git a/asset/icon/Icon32/qip_dnd.png b/asset/icon/Icon32/qip_dnd.png new file mode 100644 index 0000000..117caf7 Binary files /dev/null and b/asset/icon/Icon32/qip_dnd.png differ diff --git a/asset/icon/Icon32/qip_eating.png b/asset/icon/Icon32/qip_eating.png new file mode 100644 index 0000000..9d092fb Binary files /dev/null and b/asset/icon/Icon32/qip_eating.png differ diff --git a/asset/icon/Icon32/qip_free_for_chat.png b/asset/icon/Icon32/qip_free_for_chat.png new file mode 100644 index 0000000..2ce4a14 Binary files /dev/null and b/asset/icon/Icon32/qip_free_for_chat.png differ diff --git a/asset/icon/Icon32/qip_invisible.png b/asset/icon/Icon32/qip_invisible.png new file mode 100644 index 0000000..6f408bf Binary files /dev/null and b/asset/icon/Icon32/qip_invisible.png differ diff --git a/asset/icon/Icon32/qip_invisible_for_all.png b/asset/icon/Icon32/qip_invisible_for_all.png new file mode 100644 index 0000000..56beb05 Binary files /dev/null and b/asset/icon/Icon32/qip_invisible_for_all.png differ diff --git a/asset/icon/Icon32/qip_not_available.png b/asset/icon/Icon32/qip_not_available.png new file mode 100644 index 0000000..3a91625 Binary files /dev/null and b/asset/icon/Icon32/qip_not_available.png differ diff --git a/asset/icon/Icon32/qip_occupied.png b/asset/icon/Icon32/qip_occupied.png new file mode 100644 index 0000000..d52957e Binary files /dev/null and b/asset/icon/Icon32/qip_occupied.png differ diff --git a/asset/icon/Icon32/qip_offline.png b/asset/icon/Icon32/qip_offline.png new file mode 100644 index 0000000..8e4533a Binary files /dev/null and b/asset/icon/Icon32/qip_offline.png differ diff --git a/asset/icon/Icon32/qip_online.png b/asset/icon/Icon32/qip_online.png new file mode 100644 index 0000000..d458f09 Binary files /dev/null and b/asset/icon/Icon32/qip_online.png differ diff --git a/asset/icon/Icon32/query_design.png b/asset/icon/Icon32/query_design.png new file mode 100644 index 0000000..512bc51 Binary files /dev/null and b/asset/icon/Icon32/query_design.png differ diff --git a/asset/icon/Icon32/query_wizard.png b/asset/icon/Icon32/query_wizard.png new file mode 100644 index 0000000..a03637f Binary files /dev/null and b/asset/icon/Icon32/query_wizard.png differ diff --git a/asset/icon/Icon32/question.png b/asset/icon/Icon32/question.png new file mode 100644 index 0000000..e67fe63 Binary files /dev/null and b/asset/icon/Icon32/question.png differ diff --git a/asset/icon/Icon32/quick_styles.png b/asset/icon/Icon32/quick_styles.png new file mode 100644 index 0000000..c39b955 Binary files /dev/null and b/asset/icon/Icon32/quick_styles.png differ diff --git a/asset/icon/Icon32/quill.png b/asset/icon/Icon32/quill.png new file mode 100644 index 0000000..b09b064 Binary files /dev/null and b/asset/icon/Icon32/quill.png differ diff --git a/asset/icon/Icon32/quota_modification.png b/asset/icon/Icon32/quota_modification.png new file mode 100644 index 0000000..7f0ac57 Binary files /dev/null and b/asset/icon/Icon32/quota_modification.png differ diff --git a/asset/icon/Icon32/rabbit.png b/asset/icon/Icon32/rabbit.png new file mode 100644 index 0000000..8b09045 Binary files /dev/null and b/asset/icon/Icon32/rabbit.png differ diff --git a/asset/icon/Icon32/radar_chart.png b/asset/icon/Icon32/radar_chart.png new file mode 100644 index 0000000..c777ca3 Binary files /dev/null and b/asset/icon/Icon32/radar_chart.png differ diff --git a/asset/icon/Icon32/radio_1.png b/asset/icon/Icon32/radio_1.png new file mode 100644 index 0000000..b24b6f9 Binary files /dev/null and b/asset/icon/Icon32/radio_1.png differ diff --git a/asset/icon/Icon32/radio_2.png b/asset/icon/Icon32/radio_2.png new file mode 100644 index 0000000..3a6a1dd Binary files /dev/null and b/asset/icon/Icon32/radio_2.png differ diff --git a/asset/icon/Icon32/radio_button.png b/asset/icon/Icon32/radio_button.png new file mode 100644 index 0000000..21bdfa6 Binary files /dev/null and b/asset/icon/Icon32/radio_button.png differ diff --git a/asset/icon/Icon32/radioactivity.png b/asset/icon/Icon32/radioactivity.png new file mode 100644 index 0000000..ad5d534 Binary files /dev/null and b/asset/icon/Icon32/radioactivity.png differ diff --git a/asset/icon/Icon32/radioactivity_drum.png b/asset/icon/Icon32/radioactivity_drum.png new file mode 100644 index 0000000..92aa049 Binary files /dev/null and b/asset/icon/Icon32/radioactivity_drum.png differ diff --git a/asset/icon/Icon32/radiobutton.png b/asset/icon/Icon32/radiobutton.png new file mode 100644 index 0000000..7501ad5 Binary files /dev/null and b/asset/icon/Icon32/radiobutton.png differ diff --git a/asset/icon/Icon32/radiobutton_group.png b/asset/icon/Icon32/radiobutton_group.png new file mode 100644 index 0000000..7013d5a Binary files /dev/null and b/asset/icon/Icon32/radiobutton_group.png differ diff --git a/asset/icon/Icon32/radiolocator.png b/asset/icon/Icon32/radiolocator.png new file mode 100644 index 0000000..6f75f6f Binary files /dev/null and b/asset/icon/Icon32/radiolocator.png differ diff --git a/asset/icon/Icon32/rain.png b/asset/icon/Icon32/rain.png new file mode 100644 index 0000000..a767bda Binary files /dev/null and b/asset/icon/Icon32/rain.png differ diff --git a/asset/icon/Icon32/rainbow.png b/asset/icon/Icon32/rainbow.png new file mode 100644 index 0000000..dc1fee0 Binary files /dev/null and b/asset/icon/Icon32/rainbow.png differ diff --git a/asset/icon/Icon32/rainbow_cloud.png b/asset/icon/Icon32/rainbow_cloud.png new file mode 100644 index 0000000..a1b53b7 Binary files /dev/null and b/asset/icon/Icon32/rainbow_cloud.png differ diff --git a/asset/icon/Icon32/raw_access_logs.png b/asset/icon/Icon32/raw_access_logs.png new file mode 100644 index 0000000..260f897 Binary files /dev/null and b/asset/icon/Icon32/raw_access_logs.png differ diff --git a/asset/icon/Icon32/readernaut.png b/asset/icon/Icon32/readernaut.png new file mode 100644 index 0000000..e48516a Binary files /dev/null and b/asset/icon/Icon32/readernaut.png differ diff --git a/asset/icon/Icon32/reading_view.png b/asset/icon/Icon32/reading_view.png new file mode 100644 index 0000000..dcce837 Binary files /dev/null and b/asset/icon/Icon32/reading_view.png differ diff --git a/asset/icon/Icon32/real_estate.png b/asset/icon/Icon32/real_estate.png new file mode 100644 index 0000000..62c3889 Binary files /dev/null and b/asset/icon/Icon32/real_estate.png differ diff --git a/asset/icon/Icon32/rearrange_account.png b/asset/icon/Icon32/rearrange_account.png new file mode 100644 index 0000000..b8e79d3 Binary files /dev/null and b/asset/icon/Icon32/rearrange_account.png differ diff --git a/asset/icon/Icon32/receipt.png b/asset/icon/Icon32/receipt.png new file mode 100644 index 0000000..cc14701 Binary files /dev/null and b/asset/icon/Icon32/receipt.png differ diff --git a/asset/icon/Icon32/receipt_excel.png b/asset/icon/Icon32/receipt_excel.png new file mode 100644 index 0000000..6123bd5 Binary files /dev/null and b/asset/icon/Icon32/receipt_excel.png differ diff --git a/asset/icon/Icon32/receipt_invoice.png b/asset/icon/Icon32/receipt_invoice.png new file mode 100644 index 0000000..34d88a6 Binary files /dev/null and b/asset/icon/Icon32/receipt_invoice.png differ diff --git a/asset/icon/Icon32/receipt_share.png b/asset/icon/Icon32/receipt_share.png new file mode 100644 index 0000000..8f174c6 Binary files /dev/null and b/asset/icon/Icon32/receipt_share.png differ diff --git a/asset/icon/Icon32/receipt_stamp.png b/asset/icon/Icon32/receipt_stamp.png new file mode 100644 index 0000000..1ca5f87 Binary files /dev/null and b/asset/icon/Icon32/receipt_stamp.png differ diff --git a/asset/icon/Icon32/recommended_chart.png b/asset/icon/Icon32/recommended_chart.png new file mode 100644 index 0000000..b0dacd6 Binary files /dev/null and b/asset/icon/Icon32/recommended_chart.png differ diff --git a/asset/icon/Icon32/recommended_summart_table.png b/asset/icon/Icon32/recommended_summart_table.png new file mode 100644 index 0000000..50ee304 Binary files /dev/null and b/asset/icon/Icon32/recommended_summart_table.png differ diff --git a/asset/icon/Icon32/record_slide_show.png b/asset/icon/Icon32/record_slide_show.png new file mode 100644 index 0000000..6affe4c Binary files /dev/null and b/asset/icon/Icon32/record_slide_show.png differ diff --git a/asset/icon/Icon32/recover_deleted_items.png b/asset/icon/Icon32/recover_deleted_items.png new file mode 100644 index 0000000..14932b7 Binary files /dev/null and b/asset/icon/Icon32/recover_deleted_items.png differ diff --git a/asset/icon/Icon32/recycle.png b/asset/icon/Icon32/recycle.png new file mode 100644 index 0000000..1620042 Binary files /dev/null and b/asset/icon/Icon32/recycle.png differ diff --git a/asset/icon/Icon32/recycle_bag.png b/asset/icon/Icon32/recycle_bag.png new file mode 100644 index 0000000..71b72c4 Binary files /dev/null and b/asset/icon/Icon32/recycle_bag.png differ diff --git a/asset/icon/Icon32/red_line.png b/asset/icon/Icon32/red_line.png new file mode 100644 index 0000000..9ea785d Binary files /dev/null and b/asset/icon/Icon32/red_line.png differ diff --git a/asset/icon/Icon32/reddit.png b/asset/icon/Icon32/reddit.png new file mode 100644 index 0000000..d77994b Binary files /dev/null and b/asset/icon/Icon32/reddit.png differ diff --git a/asset/icon/Icon32/redirects.png b/asset/icon/Icon32/redirects.png new file mode 100644 index 0000000..c67eb3b Binary files /dev/null and b/asset/icon/Icon32/redirects.png differ diff --git a/asset/icon/Icon32/redo.png b/asset/icon/Icon32/redo.png new file mode 100644 index 0000000..e05a58f Binary files /dev/null and b/asset/icon/Icon32/redo.png differ diff --git a/asset/icon/Icon32/refresh_all.png b/asset/icon/Icon32/refresh_all.png new file mode 100644 index 0000000..0f4d261 Binary files /dev/null and b/asset/icon/Icon32/refresh_all.png differ diff --git a/asset/icon/Icon32/regular_expression.png b/asset/icon/Icon32/regular_expression.png new file mode 100644 index 0000000..51a147a Binary files /dev/null and b/asset/icon/Icon32/regular_expression.png differ diff --git a/asset/icon/Icon32/regular_expression_delimiter.png b/asset/icon/Icon32/regular_expression_delimiter.png new file mode 100644 index 0000000..94ef99e Binary files /dev/null and b/asset/icon/Icon32/regular_expression_delimiter.png differ diff --git a/asset/icon/Icon32/regular_expression_search.png b/asset/icon/Icon32/regular_expression_search.png new file mode 100644 index 0000000..95551d8 Binary files /dev/null and b/asset/icon/Icon32/regular_expression_search.png differ diff --git a/asset/icon/Icon32/regular_expression_search_light_blue.png b/asset/icon/Icon32/regular_expression_search_light_blue.png new file mode 100644 index 0000000..a72f189 Binary files /dev/null and b/asset/icon/Icon32/regular_expression_search_light_blue.png differ diff --git a/asset/icon/Icon32/rehearse_timing.png b/asset/icon/Icon32/rehearse_timing.png new file mode 100644 index 0000000..7cd4022 Binary files /dev/null and b/asset/icon/Icon32/rehearse_timing.png differ diff --git a/asset/icon/Icon32/reject.png b/asset/icon/Icon32/reject.png new file mode 100644 index 0000000..c401742 Binary files /dev/null and b/asset/icon/Icon32/reject.png differ diff --git a/asset/icon/Icon32/relationships.png b/asset/icon/Icon32/relationships.png new file mode 100644 index 0000000..b07db14 Binary files /dev/null and b/asset/icon/Icon32/relationships.png differ diff --git a/asset/icon/Icon32/remote.png b/asset/icon/Icon32/remote.png new file mode 100644 index 0000000..388f2a5 Binary files /dev/null and b/asset/icon/Icon32/remote.png differ diff --git a/asset/icon/Icon32/remote_sql.png b/asset/icon/Icon32/remote_sql.png new file mode 100644 index 0000000..ef6d199 Binary files /dev/null and b/asset/icon/Icon32/remote_sql.png differ diff --git a/asset/icon/Icon32/remove_arrows.png b/asset/icon/Icon32/remove_arrows.png new file mode 100644 index 0000000..7ab4837 Binary files /dev/null and b/asset/icon/Icon32/remove_arrows.png differ diff --git a/asset/icon/Icon32/report(2).png b/asset/icon/Icon32/report(2).png new file mode 100644 index 0000000..d55576c Binary files /dev/null and b/asset/icon/Icon32/report(2).png differ diff --git a/asset/icon/Icon32/report.png b/asset/icon/Icon32/report.png new file mode 100644 index 0000000..08c8e1e Binary files /dev/null and b/asset/icon/Icon32/report.png differ diff --git a/asset/icon/Icon32/report_add.png b/asset/icon/Icon32/report_add.png new file mode 100644 index 0000000..6395444 Binary files /dev/null and b/asset/icon/Icon32/report_add.png differ diff --git a/asset/icon/Icon32/report_delete.png b/asset/icon/Icon32/report_delete.png new file mode 100644 index 0000000..59b29de Binary files /dev/null and b/asset/icon/Icon32/report_delete.png differ diff --git a/asset/icon/Icon32/report_design.png b/asset/icon/Icon32/report_design.png new file mode 100644 index 0000000..6b7f84f Binary files /dev/null and b/asset/icon/Icon32/report_design.png differ diff --git a/asset/icon/Icon32/report_disk.png b/asset/icon/Icon32/report_disk.png new file mode 100644 index 0000000..6508896 Binary files /dev/null and b/asset/icon/Icon32/report_disk.png differ diff --git a/asset/icon/Icon32/report_edit.png b/asset/icon/Icon32/report_edit.png new file mode 100644 index 0000000..92bbef5 Binary files /dev/null and b/asset/icon/Icon32/report_edit.png differ diff --git a/asset/icon/Icon32/report_go.png b/asset/icon/Icon32/report_go.png new file mode 100644 index 0000000..80e91bb Binary files /dev/null and b/asset/icon/Icon32/report_go.png differ diff --git a/asset/icon/Icon32/report_images.png b/asset/icon/Icon32/report_images.png new file mode 100644 index 0000000..3819f1d Binary files /dev/null and b/asset/icon/Icon32/report_images.png differ diff --git a/asset/icon/Icon32/report_key.png b/asset/icon/Icon32/report_key.png new file mode 100644 index 0000000..fb7d90e Binary files /dev/null and b/asset/icon/Icon32/report_key.png differ diff --git a/asset/icon/Icon32/report_link.png b/asset/icon/Icon32/report_link.png new file mode 100644 index 0000000..c762857 Binary files /dev/null and b/asset/icon/Icon32/report_link.png differ diff --git a/asset/icon/Icon32/report_magnify.png b/asset/icon/Icon32/report_magnify.png new file mode 100644 index 0000000..c8b4078 Binary files /dev/null and b/asset/icon/Icon32/report_magnify.png differ diff --git a/asset/icon/Icon32/report_picture.png b/asset/icon/Icon32/report_picture.png new file mode 100644 index 0000000..8122a79 Binary files /dev/null and b/asset/icon/Icon32/report_picture.png differ diff --git a/asset/icon/Icon32/report_stack.png b/asset/icon/Icon32/report_stack.png new file mode 100644 index 0000000..240afc1 Binary files /dev/null and b/asset/icon/Icon32/report_stack.png differ diff --git a/asset/icon/Icon32/report_torn.png b/asset/icon/Icon32/report_torn.png new file mode 100644 index 0000000..57a9b1b Binary files /dev/null and b/asset/icon/Icon32/report_torn.png differ diff --git a/asset/icon/Icon32/report_user.png b/asset/icon/Icon32/report_user.png new file mode 100644 index 0000000..9f95aea Binary files /dev/null and b/asset/icon/Icon32/report_user.png differ diff --git a/asset/icon/Icon32/report_wizard.png b/asset/icon/Icon32/report_wizard.png new file mode 100644 index 0000000..78559cf Binary files /dev/null and b/asset/icon/Icon32/report_wizard.png differ diff --git a/asset/icon/Icon32/report_word.png b/asset/icon/Icon32/report_word.png new file mode 100644 index 0000000..5dbba7e Binary files /dev/null and b/asset/icon/Icon32/report_word.png differ diff --git a/asset/icon/Icon32/reports.png b/asset/icon/Icon32/reports.png new file mode 100644 index 0000000..5bcc00a Binary files /dev/null and b/asset/icon/Icon32/reports.png differ diff --git a/asset/icon/Icon32/research.png b/asset/icon/Icon32/research.png new file mode 100644 index 0000000..fe8d45f Binary files /dev/null and b/asset/icon/Icon32/research.png differ diff --git a/asset/icon/Icon32/reseller_account.png b/asset/icon/Icon32/reseller_account.png new file mode 100644 index 0000000..9db58af Binary files /dev/null and b/asset/icon/Icon32/reseller_account.png differ diff --git a/asset/icon/Icon32/reseller_account_template.png b/asset/icon/Icon32/reseller_account_template.png new file mode 100644 index 0000000..df777de Binary files /dev/null and b/asset/icon/Icon32/reseller_account_template.png differ diff --git a/asset/icon/Icon32/reseller_programm.png b/asset/icon/Icon32/reseller_programm.png new file mode 100644 index 0000000..8119aeb Binary files /dev/null and b/asset/icon/Icon32/reseller_programm.png differ diff --git a/asset/icon/Icon32/reset_dns_zone.png b/asset/icon/Icon32/reset_dns_zone.png new file mode 100644 index 0000000..823173b Binary files /dev/null and b/asset/icon/Icon32/reset_dns_zone.png differ diff --git a/asset/icon/Icon32/reset_slide.png b/asset/icon/Icon32/reset_slide.png new file mode 100644 index 0000000..874dea9 Binary files /dev/null and b/asset/icon/Icon32/reset_slide.png differ diff --git a/asset/icon/Icon32/reset_windows_position.png b/asset/icon/Icon32/reset_windows_position.png new file mode 100644 index 0000000..fb447cd Binary files /dev/null and b/asset/icon/Icon32/reset_windows_position.png differ diff --git a/asset/icon/Icon32/resize_picture.png b/asset/icon/Icon32/resize_picture.png new file mode 100644 index 0000000..2a0ab42 Binary files /dev/null and b/asset/icon/Icon32/resize_picture.png differ diff --git a/asset/icon/Icon32/resource_usage.png b/asset/icon/Icon32/resource_usage.png new file mode 100644 index 0000000..c0cfafb Binary files /dev/null and b/asset/icon/Icon32/resource_usage.png differ diff --git a/asset/icon/Icon32/resource_usage_protect.png b/asset/icon/Icon32/resource_usage_protect.png new file mode 100644 index 0000000..56d2c39 Binary files /dev/null and b/asset/icon/Icon32/resource_usage_protect.png differ diff --git a/asset/icon/Icon32/resources.png b/asset/icon/Icon32/resources.png new file mode 100644 index 0000000..c2a8ef4 Binary files /dev/null and b/asset/icon/Icon32/resources.png differ diff --git a/asset/icon/Icon32/restart_services.png b/asset/icon/Icon32/restart_services.png new file mode 100644 index 0000000..ce8e39d Binary files /dev/null and b/asset/icon/Icon32/restart_services.png differ diff --git a/asset/icon/Icon32/restaurant_menu.png b/asset/icon/Icon32/restaurant_menu.png new file mode 100644 index 0000000..5e74f0a Binary files /dev/null and b/asset/icon/Icon32/restaurant_menu.png differ diff --git a/asset/icon/Icon32/resultset_first.png b/asset/icon/Icon32/resultset_first.png new file mode 100644 index 0000000..eddd761 Binary files /dev/null and b/asset/icon/Icon32/resultset_first.png differ diff --git a/asset/icon/Icon32/resultset_last.png b/asset/icon/Icon32/resultset_last.png new file mode 100644 index 0000000..12581e3 Binary files /dev/null and b/asset/icon/Icon32/resultset_last.png differ diff --git a/asset/icon/Icon32/resultset_next.png b/asset/icon/Icon32/resultset_next.png new file mode 100644 index 0000000..cdf10c7 Binary files /dev/null and b/asset/icon/Icon32/resultset_next.png differ diff --git a/asset/icon/Icon32/resultset_previous.png b/asset/icon/Icon32/resultset_previous.png new file mode 100644 index 0000000..c8e5262 Binary files /dev/null and b/asset/icon/Icon32/resultset_previous.png differ diff --git a/asset/icon/Icon32/reviewing_pane.png b/asset/icon/Icon32/reviewing_pane.png new file mode 100644 index 0000000..d80a002 Binary files /dev/null and b/asset/icon/Icon32/reviewing_pane.png differ diff --git a/asset/icon/Icon32/ribbon(2).png b/asset/icon/Icon32/ribbon(2).png new file mode 100644 index 0000000..30278e1 Binary files /dev/null and b/asset/icon/Icon32/ribbon(2).png differ diff --git a/asset/icon/Icon32/ribbon.png b/asset/icon/Icon32/ribbon.png new file mode 100644 index 0000000..763c891 Binary files /dev/null and b/asset/icon/Icon32/ribbon.png differ diff --git a/asset/icon/Icon32/richtext_editor.png b/asset/icon/Icon32/richtext_editor.png new file mode 100644 index 0000000..812cf3e Binary files /dev/null and b/asset/icon/Icon32/richtext_editor.png differ diff --git a/asset/icon/Icon32/ring.png b/asset/icon/Icon32/ring.png new file mode 100644 index 0000000..8e24a09 Binary files /dev/null and b/asset/icon/Icon32/ring.png differ diff --git a/asset/icon/Icon32/rip.png b/asset/icon/Icon32/rip.png new file mode 100644 index 0000000..f4f5dca Binary files /dev/null and b/asset/icon/Icon32/rip.png differ diff --git a/asset/icon/Icon32/road_sign(2).png b/asset/icon/Icon32/road_sign(2).png new file mode 100644 index 0000000..11a8484 Binary files /dev/null and b/asset/icon/Icon32/road_sign(2).png differ diff --git a/asset/icon/Icon32/road_sign.png b/asset/icon/Icon32/road_sign.png new file mode 100644 index 0000000..9c664b9 Binary files /dev/null and b/asset/icon/Icon32/road_sign.png differ diff --git a/asset/icon/Icon32/roadworks.png b/asset/icon/Icon32/roadworks.png new file mode 100644 index 0000000..65b8fe3 Binary files /dev/null and b/asset/icon/Icon32/roadworks.png differ diff --git a/asset/icon/Icon32/robo_to.png b/asset/icon/Icon32/robo_to.png new file mode 100644 index 0000000..95c1de6 Binary files /dev/null and b/asset/icon/Icon32/robo_to.png differ diff --git a/asset/icon/Icon32/robot.png b/asset/icon/Icon32/robot.png new file mode 100644 index 0000000..09ea397 Binary files /dev/null and b/asset/icon/Icon32/robot.png differ diff --git a/asset/icon/Icon32/rocket.png b/asset/icon/Icon32/rocket.png new file mode 100644 index 0000000..6f3b167 Binary files /dev/null and b/asset/icon/Icon32/rocket.png differ diff --git a/asset/icon/Icon32/rocking_chair.png b/asset/icon/Icon32/rocking_chair.png new file mode 100644 index 0000000..c34ad93 Binary files /dev/null and b/asset/icon/Icon32/rocking_chair.png differ diff --git a/asset/icon/Icon32/role.png b/asset/icon/Icon32/role.png new file mode 100644 index 0000000..6a3b652 Binary files /dev/null and b/asset/icon/Icon32/role.png differ diff --git a/asset/icon/Icon32/rosette.png b/asset/icon/Icon32/rosette.png new file mode 100644 index 0000000..ecbcc0a Binary files /dev/null and b/asset/icon/Icon32/rosette.png differ diff --git a/asset/icon/Icon32/rosette_2.png b/asset/icon/Icon32/rosette_2.png new file mode 100644 index 0000000..ba85080 Binary files /dev/null and b/asset/icon/Icon32/rosette_2.png differ diff --git a/asset/icon/Icon32/rotate_90.png b/asset/icon/Icon32/rotate_90.png new file mode 100644 index 0000000..2bf4450 Binary files /dev/null and b/asset/icon/Icon32/rotate_90.png differ diff --git a/asset/icon/Icon32/router.png b/asset/icon/Icon32/router.png new file mode 100644 index 0000000..09ba9cb Binary files /dev/null and b/asset/icon/Icon32/router.png differ diff --git a/asset/icon/Icon32/routing_around.png b/asset/icon/Icon32/routing_around.png new file mode 100644 index 0000000..a6f8e35 Binary files /dev/null and b/asset/icon/Icon32/routing_around.png differ diff --git a/asset/icon/Icon32/routing_forward.png b/asset/icon/Icon32/routing_forward.png new file mode 100644 index 0000000..98fbd2d Binary files /dev/null and b/asset/icon/Icon32/routing_forward.png differ diff --git a/asset/icon/Icon32/routing_go_left.png b/asset/icon/Icon32/routing_go_left.png new file mode 100644 index 0000000..30055e6 Binary files /dev/null and b/asset/icon/Icon32/routing_go_left.png differ diff --git a/asset/icon/Icon32/routing_go_right.png b/asset/icon/Icon32/routing_go_right.png new file mode 100644 index 0000000..7197026 Binary files /dev/null and b/asset/icon/Icon32/routing_go_right.png differ diff --git a/asset/icon/Icon32/routing_go_straight_left.png b/asset/icon/Icon32/routing_go_straight_left.png new file mode 100644 index 0000000..218008a Binary files /dev/null and b/asset/icon/Icon32/routing_go_straight_left.png differ diff --git a/asset/icon/Icon32/routing_go_straight_right.png b/asset/icon/Icon32/routing_go_straight_right.png new file mode 100644 index 0000000..0fc558f Binary files /dev/null and b/asset/icon/Icon32/routing_go_straight_right.png differ diff --git a/asset/icon/Icon32/routing_intersection_right.png b/asset/icon/Icon32/routing_intersection_right.png new file mode 100644 index 0000000..9f73f3b Binary files /dev/null and b/asset/icon/Icon32/routing_intersection_right.png differ diff --git a/asset/icon/Icon32/routing_turn_arround_left.png b/asset/icon/Icon32/routing_turn_arround_left.png new file mode 100644 index 0000000..aec261d Binary files /dev/null and b/asset/icon/Icon32/routing_turn_arround_left.png differ diff --git a/asset/icon/Icon32/routing_turn_arround_right.png b/asset/icon/Icon32/routing_turn_arround_right.png new file mode 100644 index 0000000..13b7f0c Binary files /dev/null and b/asset/icon/Icon32/routing_turn_arround_right.png differ diff --git a/asset/icon/Icon32/routing_turn_left.png b/asset/icon/Icon32/routing_turn_left.png new file mode 100644 index 0000000..ddc6c00 Binary files /dev/null and b/asset/icon/Icon32/routing_turn_left.png differ diff --git a/asset/icon/Icon32/routing_turn_left_2.png b/asset/icon/Icon32/routing_turn_left_2.png new file mode 100644 index 0000000..7c2b8ed Binary files /dev/null and b/asset/icon/Icon32/routing_turn_left_2.png differ diff --git a/asset/icon/Icon32/routing_turn_left_crossroads.png b/asset/icon/Icon32/routing_turn_left_crossroads.png new file mode 100644 index 0000000..dc072b3 Binary files /dev/null and b/asset/icon/Icon32/routing_turn_left_crossroads.png differ diff --git a/asset/icon/Icon32/routing_turn_right.png b/asset/icon/Icon32/routing_turn_right.png new file mode 100644 index 0000000..5e76dd3 Binary files /dev/null and b/asset/icon/Icon32/routing_turn_right.png differ diff --git a/asset/icon/Icon32/routing_turn_right_2.png b/asset/icon/Icon32/routing_turn_right_2.png new file mode 100644 index 0000000..3efa4d0 Binary files /dev/null and b/asset/icon/Icon32/routing_turn_right_2.png differ diff --git a/asset/icon/Icon32/routing_turn_u.png b/asset/icon/Icon32/routing_turn_u.png new file mode 100644 index 0000000..f62e811 Binary files /dev/null and b/asset/icon/Icon32/routing_turn_u.png differ diff --git a/asset/icon/Icon32/routing_turnaround_left.png b/asset/icon/Icon32/routing_turnaround_left.png new file mode 100644 index 0000000..d51db8e Binary files /dev/null and b/asset/icon/Icon32/routing_turnaround_left.png differ diff --git a/asset/icon/Icon32/routing_turnaround_right.png b/asset/icon/Icon32/routing_turnaround_right.png new file mode 100644 index 0000000..b32858c Binary files /dev/null and b/asset/icon/Icon32/routing_turnaround_right.png differ diff --git a/asset/icon/Icon32/routing_turning_left.png b/asset/icon/Icon32/routing_turning_left.png new file mode 100644 index 0000000..5141c55 Binary files /dev/null and b/asset/icon/Icon32/routing_turning_left.png differ diff --git a/asset/icon/Icon32/routing_turning_right.png b/asset/icon/Icon32/routing_turning_right.png new file mode 100644 index 0000000..6a1a185 Binary files /dev/null and b/asset/icon/Icon32/routing_turning_right.png differ diff --git a/asset/icon/Icon32/rss.png b/asset/icon/Icon32/rss.png new file mode 100644 index 0000000..8b2c0d5 Binary files /dev/null and b/asset/icon/Icon32/rss.png differ diff --git a/asset/icon/Icon32/rss_add.png b/asset/icon/Icon32/rss_add.png new file mode 100644 index 0000000..865e92c Binary files /dev/null and b/asset/icon/Icon32/rss_add.png differ diff --git a/asset/icon/Icon32/rss_delete.png b/asset/icon/Icon32/rss_delete.png new file mode 100644 index 0000000..970b4b0 Binary files /dev/null and b/asset/icon/Icon32/rss_delete.png differ diff --git a/asset/icon/Icon32/rss_go.png b/asset/icon/Icon32/rss_go.png new file mode 100644 index 0000000..cd884c4 Binary files /dev/null and b/asset/icon/Icon32/rss_go.png differ diff --git a/asset/icon/Icon32/rss_valid.png b/asset/icon/Icon32/rss_valid.png new file mode 100644 index 0000000..19ce63e Binary files /dev/null and b/asset/icon/Icon32/rss_valid.png differ diff --git a/asset/icon/Icon32/rubber_duck.png b/asset/icon/Icon32/rubber_duck.png new file mode 100644 index 0000000..ecb5514 Binary files /dev/null and b/asset/icon/Icon32/rubber_duck.png differ diff --git a/asset/icon/Icon32/ruby.png b/asset/icon/Icon32/ruby.png new file mode 100644 index 0000000..766a413 Binary files /dev/null and b/asset/icon/Icon32/ruby.png differ diff --git a/asset/icon/Icon32/ruby_add.png b/asset/icon/Icon32/ruby_add.png new file mode 100644 index 0000000..aac1c4c Binary files /dev/null and b/asset/icon/Icon32/ruby_add.png differ diff --git a/asset/icon/Icon32/ruby_delete.png b/asset/icon/Icon32/ruby_delete.png new file mode 100644 index 0000000..5149775 Binary files /dev/null and b/asset/icon/Icon32/ruby_delete.png differ diff --git a/asset/icon/Icon32/ruby_gear.png b/asset/icon/Icon32/ruby_gear.png new file mode 100644 index 0000000..12b573f Binary files /dev/null and b/asset/icon/Icon32/ruby_gear.png differ diff --git a/asset/icon/Icon32/ruby_get.png b/asset/icon/Icon32/ruby_get.png new file mode 100644 index 0000000..39861dd Binary files /dev/null and b/asset/icon/Icon32/ruby_get.png differ diff --git a/asset/icon/Icon32/ruby_go.png b/asset/icon/Icon32/ruby_go.png new file mode 100644 index 0000000..98b06e3 Binary files /dev/null and b/asset/icon/Icon32/ruby_go.png differ diff --git a/asset/icon/Icon32/ruby_key.png b/asset/icon/Icon32/ruby_key.png new file mode 100644 index 0000000..477d8ee Binary files /dev/null and b/asset/icon/Icon32/ruby_key.png differ diff --git a/asset/icon/Icon32/ruby_link.png b/asset/icon/Icon32/ruby_link.png new file mode 100644 index 0000000..fe8b6a1 Binary files /dev/null and b/asset/icon/Icon32/ruby_link.png differ diff --git a/asset/icon/Icon32/ruby_put.png b/asset/icon/Icon32/ruby_put.png new file mode 100644 index 0000000..8e3d7a0 Binary files /dev/null and b/asset/icon/Icon32/ruby_put.png differ diff --git a/asset/icon/Icon32/rules.png b/asset/icon/Icon32/rules.png new file mode 100644 index 0000000..7359570 Binary files /dev/null and b/asset/icon/Icon32/rules.png differ diff --git a/asset/icon/Icon32/run_macros.png b/asset/icon/Icon32/run_macros.png new file mode 100644 index 0000000..0df3717 Binary files /dev/null and b/asset/icon/Icon32/run_macros.png differ diff --git a/asset/icon/Icon32/safari_browser.png b/asset/icon/Icon32/safari_browser.png new file mode 100644 index 0000000..f1d4c6c Binary files /dev/null and b/asset/icon/Icon32/safari_browser.png differ diff --git a/asset/icon/Icon32/safe.png b/asset/icon/Icon32/safe.png new file mode 100644 index 0000000..205f3d5 Binary files /dev/null and b/asset/icon/Icon32/safe.png differ diff --git a/asset/icon/Icon32/sallary_deferrais.png b/asset/icon/Icon32/sallary_deferrais.png new file mode 100644 index 0000000..a2abfa0 Binary files /dev/null and b/asset/icon/Icon32/sallary_deferrais.png differ diff --git a/asset/icon/Icon32/salver.png b/asset/icon/Icon32/salver.png new file mode 100644 index 0000000..51525a6 Binary files /dev/null and b/asset/icon/Icon32/salver.png differ diff --git a/asset/icon/Icon32/santa.png b/asset/icon/Icon32/santa.png new file mode 100644 index 0000000..27e85ab Binary files /dev/null and b/asset/icon/Icon32/santa.png differ diff --git a/asset/icon/Icon32/santa_hat.png b/asset/icon/Icon32/santa_hat.png new file mode 100644 index 0000000..6c38511 Binary files /dev/null and b/asset/icon/Icon32/santa_hat.png differ diff --git a/asset/icon/Icon32/satellite.png b/asset/icon/Icon32/satellite.png new file mode 100644 index 0000000..a76200c Binary files /dev/null and b/asset/icon/Icon32/satellite.png differ diff --git a/asset/icon/Icon32/satellite_dish.png b/asset/icon/Icon32/satellite_dish.png new file mode 100644 index 0000000..5850793 Binary files /dev/null and b/asset/icon/Icon32/satellite_dish.png differ diff --git a/asset/icon/Icon32/save_as.png b/asset/icon/Icon32/save_as.png new file mode 100644 index 0000000..915e280 Binary files /dev/null and b/asset/icon/Icon32/save_as.png differ diff --git a/asset/icon/Icon32/save_data.png b/asset/icon/Icon32/save_data.png new file mode 100644 index 0000000..aac28f1 Binary files /dev/null and b/asset/icon/Icon32/save_data.png differ diff --git a/asset/icon/Icon32/save_money.png b/asset/icon/Icon32/save_money.png new file mode 100644 index 0000000..1bf5862 Binary files /dev/null and b/asset/icon/Icon32/save_money.png differ diff --git a/asset/icon/Icon32/saved_exports.png b/asset/icon/Icon32/saved_exports.png new file mode 100644 index 0000000..c45fab1 Binary files /dev/null and b/asset/icon/Icon32/saved_exports.png differ diff --git a/asset/icon/Icon32/saved_imports.png b/asset/icon/Icon32/saved_imports.png new file mode 100644 index 0000000..b769d45 Binary files /dev/null and b/asset/icon/Icon32/saved_imports.png differ diff --git a/asset/icon/Icon32/scale_image.png b/asset/icon/Icon32/scale_image.png new file mode 100644 index 0000000..cd5c16b Binary files /dev/null and b/asset/icon/Icon32/scale_image.png differ diff --git a/asset/icon/Icon32/scalpel.png b/asset/icon/Icon32/scalpel.png new file mode 100644 index 0000000..50c0c7f Binary files /dev/null and b/asset/icon/Icon32/scalpel.png differ diff --git a/asset/icon/Icon32/scanner.png b/asset/icon/Icon32/scanner.png new file mode 100644 index 0000000..ace0be6 Binary files /dev/null and b/asset/icon/Icon32/scanner.png differ diff --git a/asset/icon/Icon32/scanner_working.png b/asset/icon/Icon32/scanner_working.png new file mode 100644 index 0000000..1a5cb2c Binary files /dev/null and b/asset/icon/Icon32/scanner_working.png differ diff --git a/asset/icon/Icon32/screen_error.png b/asset/icon/Icon32/screen_error.png new file mode 100644 index 0000000..2c7f224 Binary files /dev/null and b/asset/icon/Icon32/screen_error.png differ diff --git a/asset/icon/Icon32/screwdriver.png b/asset/icon/Icon32/screwdriver.png new file mode 100644 index 0000000..2b4cfa5 Binary files /dev/null and b/asset/icon/Icon32/screwdriver.png differ diff --git a/asset/icon/Icon32/script.png b/asset/icon/Icon32/script.png new file mode 100644 index 0000000..8755c17 Binary files /dev/null and b/asset/icon/Icon32/script.png differ diff --git a/asset/icon/Icon32/script_add.png b/asset/icon/Icon32/script_add.png new file mode 100644 index 0000000..572a5e3 Binary files /dev/null and b/asset/icon/Icon32/script_add.png differ diff --git a/asset/icon/Icon32/script_binary.png b/asset/icon/Icon32/script_binary.png new file mode 100644 index 0000000..6074f2a Binary files /dev/null and b/asset/icon/Icon32/script_binary.png differ diff --git a/asset/icon/Icon32/script_black.png b/asset/icon/Icon32/script_black.png new file mode 100644 index 0000000..a3657b9 Binary files /dev/null and b/asset/icon/Icon32/script_black.png differ diff --git a/asset/icon/Icon32/script_bricks.png b/asset/icon/Icon32/script_bricks.png new file mode 100644 index 0000000..19db65c Binary files /dev/null and b/asset/icon/Icon32/script_bricks.png differ diff --git a/asset/icon/Icon32/script_code.png b/asset/icon/Icon32/script_code.png new file mode 100644 index 0000000..e0c83d3 Binary files /dev/null and b/asset/icon/Icon32/script_code.png differ diff --git a/asset/icon/Icon32/script_code_red.png b/asset/icon/Icon32/script_code_red.png new file mode 100644 index 0000000..643faa5 Binary files /dev/null and b/asset/icon/Icon32/script_code_red.png differ diff --git a/asset/icon/Icon32/script_delete.png b/asset/icon/Icon32/script_delete.png new file mode 100644 index 0000000..9dfe0e6 Binary files /dev/null and b/asset/icon/Icon32/script_delete.png differ diff --git a/asset/icon/Icon32/script_edit.png b/asset/icon/Icon32/script_edit.png new file mode 100644 index 0000000..9a2d7da Binary files /dev/null and b/asset/icon/Icon32/script_edit.png differ diff --git a/asset/icon/Icon32/script_error.png b/asset/icon/Icon32/script_error.png new file mode 100644 index 0000000..6330260 Binary files /dev/null and b/asset/icon/Icon32/script_error.png differ diff --git a/asset/icon/Icon32/script_excel.png b/asset/icon/Icon32/script_excel.png new file mode 100644 index 0000000..3cecf35 Binary files /dev/null and b/asset/icon/Icon32/script_excel.png differ diff --git a/asset/icon/Icon32/script_export.png b/asset/icon/Icon32/script_export.png new file mode 100644 index 0000000..ff9b3e7 Binary files /dev/null and b/asset/icon/Icon32/script_export.png differ diff --git a/asset/icon/Icon32/script_flash.png b/asset/icon/Icon32/script_flash.png new file mode 100644 index 0000000..f46fa4e Binary files /dev/null and b/asset/icon/Icon32/script_flash.png differ diff --git a/asset/icon/Icon32/script_gear.png b/asset/icon/Icon32/script_gear.png new file mode 100644 index 0000000..da5b0d5 Binary files /dev/null and b/asset/icon/Icon32/script_gear.png differ diff --git a/asset/icon/Icon32/script_globe.png b/asset/icon/Icon32/script_globe.png new file mode 100644 index 0000000..ec96e55 Binary files /dev/null and b/asset/icon/Icon32/script_globe.png differ diff --git a/asset/icon/Icon32/script_go.png b/asset/icon/Icon32/script_go.png new file mode 100644 index 0000000..d3b52c9 Binary files /dev/null and b/asset/icon/Icon32/script_go.png differ diff --git a/asset/icon/Icon32/script_green.png b/asset/icon/Icon32/script_green.png new file mode 100644 index 0000000..e20142d Binary files /dev/null and b/asset/icon/Icon32/script_green.png differ diff --git a/asset/icon/Icon32/script_import.png b/asset/icon/Icon32/script_import.png new file mode 100644 index 0000000..ec5052f Binary files /dev/null and b/asset/icon/Icon32/script_import.png differ diff --git a/asset/icon/Icon32/script_key.png b/asset/icon/Icon32/script_key.png new file mode 100644 index 0000000..f6a0417 Binary files /dev/null and b/asset/icon/Icon32/script_key.png differ diff --git a/asset/icon/Icon32/script_lightning.png b/asset/icon/Icon32/script_lightning.png new file mode 100644 index 0000000..e5c963a Binary files /dev/null and b/asset/icon/Icon32/script_lightning.png differ diff --git a/asset/icon/Icon32/script_link.png b/asset/icon/Icon32/script_link.png new file mode 100644 index 0000000..3549d3b Binary files /dev/null and b/asset/icon/Icon32/script_link.png differ diff --git a/asset/icon/Icon32/script_office.png b/asset/icon/Icon32/script_office.png new file mode 100644 index 0000000..19abbb9 Binary files /dev/null and b/asset/icon/Icon32/script_office.png differ diff --git a/asset/icon/Icon32/script_palette.png b/asset/icon/Icon32/script_palette.png new file mode 100644 index 0000000..ec29f5f Binary files /dev/null and b/asset/icon/Icon32/script_palette.png differ diff --git a/asset/icon/Icon32/script_php.png b/asset/icon/Icon32/script_php.png new file mode 100644 index 0000000..465403a Binary files /dev/null and b/asset/icon/Icon32/script_php.png differ diff --git a/asset/icon/Icon32/script_red.png b/asset/icon/Icon32/script_red.png new file mode 100644 index 0000000..40041b5 Binary files /dev/null and b/asset/icon/Icon32/script_red.png differ diff --git a/asset/icon/Icon32/script_save.png b/asset/icon/Icon32/script_save.png new file mode 100644 index 0000000..fec5c79 Binary files /dev/null and b/asset/icon/Icon32/script_save.png differ diff --git a/asset/icon/Icon32/script_stamp.png b/asset/icon/Icon32/script_stamp.png new file mode 100644 index 0000000..4a0dd62 Binary files /dev/null and b/asset/icon/Icon32/script_stamp.png differ diff --git a/asset/icon/Icon32/script_text.png b/asset/icon/Icon32/script_text.png new file mode 100644 index 0000000..0b18bb8 Binary files /dev/null and b/asset/icon/Icon32/script_text.png differ diff --git a/asset/icon/Icon32/script_torn.png b/asset/icon/Icon32/script_torn.png new file mode 100644 index 0000000..e937ce6 Binary files /dev/null and b/asset/icon/Icon32/script_torn.png differ diff --git a/asset/icon/Icon32/script_visual_studio.png b/asset/icon/Icon32/script_visual_studio.png new file mode 100644 index 0000000..c752d32 Binary files /dev/null and b/asset/icon/Icon32/script_visual_studio.png differ diff --git a/asset/icon/Icon32/script_word.png b/asset/icon/Icon32/script_word.png new file mode 100644 index 0000000..930e668 Binary files /dev/null and b/asset/icon/Icon32/script_word.png differ diff --git a/asset/icon/Icon32/script_yellow.png b/asset/icon/Icon32/script_yellow.png new file mode 100644 index 0000000..ce219b6 Binary files /dev/null and b/asset/icon/Icon32/script_yellow.png differ diff --git a/asset/icon/Icon32/scripts(2).png b/asset/icon/Icon32/scripts(2).png new file mode 100644 index 0000000..949cfbc Binary files /dev/null and b/asset/icon/Icon32/scripts(2).png differ diff --git a/asset/icon/Icon32/scripts.png b/asset/icon/Icon32/scripts.png new file mode 100644 index 0000000..4c9a6a7 Binary files /dev/null and b/asset/icon/Icon32/scripts.png differ diff --git a/asset/icon/Icon32/scripts_text.png b/asset/icon/Icon32/scripts_text.png new file mode 100644 index 0000000..a5843d4 Binary files /dev/null and b/asset/icon/Icon32/scripts_text.png differ diff --git a/asset/icon/Icon32/scroll_bar.png b/asset/icon/Icon32/scroll_bar.png new file mode 100644 index 0000000..0736b8c Binary files /dev/null and b/asset/icon/Icon32/scroll_bar.png differ diff --git a/asset/icon/Icon32/scroll_bar_horizontal.png b/asset/icon/Icon32/scroll_bar_horizontal.png new file mode 100644 index 0000000..5f2b1fa Binary files /dev/null and b/asset/icon/Icon32/scroll_bar_horizontal.png differ diff --git a/asset/icon/Icon32/scroll_pane.png b/asset/icon/Icon32/scroll_pane.png new file mode 100644 index 0000000..5f84839 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane.png differ diff --git a/asset/icon/Icon32/scroll_pane_blog.png b/asset/icon/Icon32/scroll_pane_blog.png new file mode 100644 index 0000000..6ff7783 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_blog.png differ diff --git a/asset/icon/Icon32/scroll_pane_both.png b/asset/icon/Icon32/scroll_pane_both.png new file mode 100644 index 0000000..2f0b4c1 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_both.png differ diff --git a/asset/icon/Icon32/scroll_pane_detail.png b/asset/icon/Icon32/scroll_pane_detail.png new file mode 100644 index 0000000..c1c9296 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_detail.png differ diff --git a/asset/icon/Icon32/scroll_pane_form.png b/asset/icon/Icon32/scroll_pane_form.png new file mode 100644 index 0000000..20d5a14 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_form.png differ diff --git a/asset/icon/Icon32/scroll_pane_horizontal.png b/asset/icon/Icon32/scroll_pane_horizontal.png new file mode 100644 index 0000000..5976b4e Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_horizontal.png differ diff --git a/asset/icon/Icon32/scroll_pane_icon.png b/asset/icon/Icon32/scroll_pane_icon.png new file mode 100644 index 0000000..62de720 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_icon.png differ diff --git a/asset/icon/Icon32/scroll_pane_image.png b/asset/icon/Icon32/scroll_pane_image.png new file mode 100644 index 0000000..70d8af0 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_image.png differ diff --git a/asset/icon/Icon32/scroll_pane_list.png b/asset/icon/Icon32/scroll_pane_list.png new file mode 100644 index 0000000..5e29f7c Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_list.png differ diff --git a/asset/icon/Icon32/scroll_pane_table.png b/asset/icon/Icon32/scroll_pane_table.png new file mode 100644 index 0000000..dbf0ffe Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_table.png differ diff --git a/asset/icon/Icon32/scroll_pane_text.png b/asset/icon/Icon32/scroll_pane_text.png new file mode 100644 index 0000000..1d215d6 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_text.png differ diff --git a/asset/icon/Icon32/scroll_pane_text_image.png b/asset/icon/Icon32/scroll_pane_text_image.png new file mode 100644 index 0000000..be7b9f2 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_text_image.png differ diff --git a/asset/icon/Icon32/scroll_pane_tree.png b/asset/icon/Icon32/scroll_pane_tree.png new file mode 100644 index 0000000..5d47df0 Binary files /dev/null and b/asset/icon/Icon32/scroll_pane_tree.png differ diff --git a/asset/icon/Icon32/scroller_bar.png b/asset/icon/Icon32/scroller_bar.png new file mode 100644 index 0000000..943b6d0 Binary files /dev/null and b/asset/icon/Icon32/scroller_bar.png differ diff --git a/asset/icon/Icon32/scull.png b/asset/icon/Icon32/scull.png new file mode 100644 index 0000000..771370b Binary files /dev/null and b/asset/icon/Icon32/scull.png differ diff --git a/asset/icon/Icon32/sd_memory_adapter.png b/asset/icon/Icon32/sd_memory_adapter.png new file mode 100644 index 0000000..92d5d71 Binary files /dev/null and b/asset/icon/Icon32/sd_memory_adapter.png differ diff --git a/asset/icon/Icon32/search_accounts.png b/asset/icon/Icon32/search_accounts.png new file mode 100644 index 0000000..ebe63e5 Binary files /dev/null and b/asset/icon/Icon32/search_accounts.png differ diff --git a/asset/icon/Icon32/search_field.png b/asset/icon/Icon32/search_field.png new file mode 100644 index 0000000..f42c6df Binary files /dev/null and b/asset/icon/Icon32/search_field.png differ diff --git a/asset/icon/Icon32/search_minus.png b/asset/icon/Icon32/search_minus.png new file mode 100644 index 0000000..6432573 Binary files /dev/null and b/asset/icon/Icon32/search_minus.png differ diff --git a/asset/icon/Icon32/search_plus.png b/asset/icon/Icon32/search_plus.png new file mode 100644 index 0000000..82f36f6 Binary files /dev/null and b/asset/icon/Icon32/search_plus.png differ diff --git a/asset/icon/Icon32/security.png b/asset/icon/Icon32/security.png new file mode 100644 index 0000000..5669054 Binary files /dev/null and b/asset/icon/Icon32/security.png differ diff --git a/asset/icon/Icon32/seek_bar.png b/asset/icon/Icon32/seek_bar.png new file mode 100644 index 0000000..87b0bf0 Binary files /dev/null and b/asset/icon/Icon32/seek_bar.png differ diff --git a/asset/icon/Icon32/seek_bar_050.png b/asset/icon/Icon32/seek_bar_050.png new file mode 100644 index 0000000..15f8bac Binary files /dev/null and b/asset/icon/Icon32/seek_bar_050.png differ diff --git a/asset/icon/Icon32/seek_bar_100.png b/asset/icon/Icon32/seek_bar_100.png new file mode 100644 index 0000000..984c5e2 Binary files /dev/null and b/asset/icon/Icon32/seek_bar_100.png differ diff --git a/asset/icon/Icon32/select.png b/asset/icon/Icon32/select.png new file mode 100644 index 0000000..a8c5583 Binary files /dev/null and b/asset/icon/Icon32/select.png differ diff --git a/asset/icon/Icon32/select_by_adding_to_selection.png b/asset/icon/Icon32/select_by_adding_to_selection.png new file mode 100644 index 0000000..f2ca367 Binary files /dev/null and b/asset/icon/Icon32/select_by_adding_to_selection.png differ diff --git a/asset/icon/Icon32/select_by_color.png b/asset/icon/Icon32/select_by_color.png new file mode 100644 index 0000000..aefe8ec Binary files /dev/null and b/asset/icon/Icon32/select_by_color.png differ diff --git a/asset/icon/Icon32/select_by_difference.png b/asset/icon/Icon32/select_by_difference.png new file mode 100644 index 0000000..20645ac Binary files /dev/null and b/asset/icon/Icon32/select_by_difference.png differ diff --git a/asset/icon/Icon32/select_by_intersection.png b/asset/icon/Icon32/select_by_intersection.png new file mode 100644 index 0000000..b503188 Binary files /dev/null and b/asset/icon/Icon32/select_by_intersection.png differ diff --git a/asset/icon/Icon32/select_continuous_area.png b/asset/icon/Icon32/select_continuous_area.png new file mode 100644 index 0000000..988865b Binary files /dev/null and b/asset/icon/Icon32/select_continuous_area.png differ diff --git a/asset/icon/Icon32/select_ellipse.png b/asset/icon/Icon32/select_ellipse.png new file mode 100644 index 0000000..1b5c93f Binary files /dev/null and b/asset/icon/Icon32/select_ellipse.png differ diff --git a/asset/icon/Icon32/select_invert.png b/asset/icon/Icon32/select_invert.png new file mode 100644 index 0000000..b38b523 Binary files /dev/null and b/asset/icon/Icon32/select_invert.png differ diff --git a/asset/icon/Icon32/select_lasso.png b/asset/icon/Icon32/select_lasso.png new file mode 100644 index 0000000..f4f2187 Binary files /dev/null and b/asset/icon/Icon32/select_lasso.png differ diff --git a/asset/icon/Icon32/select_php_version.png b/asset/icon/Icon32/select_php_version.png new file mode 100644 index 0000000..3f98ade Binary files /dev/null and b/asset/icon/Icon32/select_php_version.png differ diff --git a/asset/icon/Icon32/select_recipient.png b/asset/icon/Icon32/select_recipient.png new file mode 100644 index 0000000..4dabeea Binary files /dev/null and b/asset/icon/Icon32/select_recipient.png differ diff --git a/asset/icon/Icon32/select_restangular.png b/asset/icon/Icon32/select_restangular.png new file mode 100644 index 0000000..8dc4e10 Binary files /dev/null and b/asset/icon/Icon32/select_restangular.png differ diff --git a/asset/icon/Icon32/selection_pane.png b/asset/icon/Icon32/selection_pane.png new file mode 100644 index 0000000..3b37a43 Binary files /dev/null and b/asset/icon/Icon32/selection_pane.png differ diff --git a/asset/icon/Icon32/selection_slide.png b/asset/icon/Icon32/selection_slide.png new file mode 100644 index 0000000..3a2b1ab Binary files /dev/null and b/asset/icon/Icon32/selection_slide.png differ diff --git a/asset/icon/Icon32/send_receive_all_folders.png b/asset/icon/Icon32/send_receive_all_folders.png new file mode 100644 index 0000000..7c060b4 Binary files /dev/null and b/asset/icon/Icon32/send_receive_all_folders.png differ diff --git a/asset/icon/Icon32/separator.png b/asset/icon/Icon32/separator.png new file mode 100644 index 0000000..ba061b9 Binary files /dev/null and b/asset/icon/Icon32/separator.png differ diff --git a/asset/icon/Icon32/separator_label.png b/asset/icon/Icon32/separator_label.png new file mode 100644 index 0000000..6e77f07 Binary files /dev/null and b/asset/icon/Icon32/separator_label.png differ diff --git a/asset/icon/Icon32/sertificate.png b/asset/icon/Icon32/sertificate.png new file mode 100644 index 0000000..a26648c Binary files /dev/null and b/asset/icon/Icon32/sertificate.png differ diff --git a/asset/icon/Icon32/server.png b/asset/icon/Icon32/server.png new file mode 100644 index 0000000..5b1fb2d Binary files /dev/null and b/asset/icon/Icon32/server.png differ diff --git a/asset/icon/Icon32/server_add.png b/asset/icon/Icon32/server_add.png new file mode 100644 index 0000000..210979f Binary files /dev/null and b/asset/icon/Icon32/server_add.png differ diff --git a/asset/icon/Icon32/server_chart.png b/asset/icon/Icon32/server_chart.png new file mode 100644 index 0000000..22df96b Binary files /dev/null and b/asset/icon/Icon32/server_chart.png differ diff --git a/asset/icon/Icon32/server_components.png b/asset/icon/Icon32/server_components.png new file mode 100644 index 0000000..d414e6b Binary files /dev/null and b/asset/icon/Icon32/server_components.png differ diff --git a/asset/icon/Icon32/server_compress.png b/asset/icon/Icon32/server_compress.png new file mode 100644 index 0000000..2319dda Binary files /dev/null and b/asset/icon/Icon32/server_compress.png differ diff --git a/asset/icon/Icon32/server_configuration.png b/asset/icon/Icon32/server_configuration.png new file mode 100644 index 0000000..dcf14ae Binary files /dev/null and b/asset/icon/Icon32/server_configuration.png differ diff --git a/asset/icon/Icon32/server_connect.png b/asset/icon/Icon32/server_connect.png new file mode 100644 index 0000000..faca1bc Binary files /dev/null and b/asset/icon/Icon32/server_connect.png differ diff --git a/asset/icon/Icon32/server_database.png b/asset/icon/Icon32/server_database.png new file mode 100644 index 0000000..5c953df Binary files /dev/null and b/asset/icon/Icon32/server_database.png differ diff --git a/asset/icon/Icon32/server_delete.png b/asset/icon/Icon32/server_delete.png new file mode 100644 index 0000000..a699864 Binary files /dev/null and b/asset/icon/Icon32/server_delete.png differ diff --git a/asset/icon/Icon32/server_edit.png b/asset/icon/Icon32/server_edit.png new file mode 100644 index 0000000..8f609e1 Binary files /dev/null and b/asset/icon/Icon32/server_edit.png differ diff --git a/asset/icon/Icon32/server_error.png b/asset/icon/Icon32/server_error.png new file mode 100644 index 0000000..588514e Binary files /dev/null and b/asset/icon/Icon32/server_error.png differ diff --git a/asset/icon/Icon32/server_go.png b/asset/icon/Icon32/server_go.png new file mode 100644 index 0000000..e2f744b Binary files /dev/null and b/asset/icon/Icon32/server_go.png differ diff --git a/asset/icon/Icon32/server_information.png b/asset/icon/Icon32/server_information.png new file mode 100644 index 0000000..ea418bc Binary files /dev/null and b/asset/icon/Icon32/server_information.png differ diff --git a/asset/icon/Icon32/server_key.png b/asset/icon/Icon32/server_key.png new file mode 100644 index 0000000..a4ae3f3 Binary files /dev/null and b/asset/icon/Icon32/server_key.png differ diff --git a/asset/icon/Icon32/server_lightning.png b/asset/icon/Icon32/server_lightning.png new file mode 100644 index 0000000..a429da4 Binary files /dev/null and b/asset/icon/Icon32/server_lightning.png differ diff --git a/asset/icon/Icon32/server_link.png b/asset/icon/Icon32/server_link.png new file mode 100644 index 0000000..8241eb5 Binary files /dev/null and b/asset/icon/Icon32/server_link.png differ diff --git a/asset/icon/Icon32/server_property.png b/asset/icon/Icon32/server_property.png new file mode 100644 index 0000000..8dce81d Binary files /dev/null and b/asset/icon/Icon32/server_property.png differ diff --git a/asset/icon/Icon32/server_stanchion.png b/asset/icon/Icon32/server_stanchion.png new file mode 100644 index 0000000..ea1e1e9 Binary files /dev/null and b/asset/icon/Icon32/server_stanchion.png differ diff --git a/asset/icon/Icon32/server_uncompress.png b/asset/icon/Icon32/server_uncompress.png new file mode 100644 index 0000000..02a7f63 Binary files /dev/null and b/asset/icon/Icon32/server_uncompress.png differ diff --git a/asset/icon/Icon32/servers.png b/asset/icon/Icon32/servers.png new file mode 100644 index 0000000..5294ada Binary files /dev/null and b/asset/icon/Icon32/servers.png differ diff --git a/asset/icon/Icon32/servers_network.png b/asset/icon/Icon32/servers_network.png new file mode 100644 index 0000000..72b9df4 Binary files /dev/null and b/asset/icon/Icon32/servers_network.png differ diff --git a/asset/icon/Icon32/service_status.png b/asset/icon/Icon32/service_status.png new file mode 100644 index 0000000..625aec3 Binary files /dev/null and b/asset/icon/Icon32/service_status.png differ diff --git a/asset/icon/Icon32/session_idle_time.png b/asset/icon/Icon32/session_idle_time.png new file mode 100644 index 0000000..6c88c2d Binary files /dev/null and b/asset/icon/Icon32/session_idle_time.png differ diff --git a/asset/icon/Icon32/set_security_question.png b/asset/icon/Icon32/set_security_question.png new file mode 100644 index 0000000..b2a4092 Binary files /dev/null and b/asset/icon/Icon32/set_security_question.png differ diff --git a/asset/icon/Icon32/setting_tools.png b/asset/icon/Icon32/setting_tools.png new file mode 100644 index 0000000..2a1e727 Binary files /dev/null and b/asset/icon/Icon32/setting_tools.png differ diff --git a/asset/icon/Icon32/setup_slide_show.png b/asset/icon/Icon32/setup_slide_show.png new file mode 100644 index 0000000..97c05dd Binary files /dev/null and b/asset/icon/Icon32/setup_slide_show.png differ diff --git a/asset/icon/Icon32/shading.png b/asset/icon/Icon32/shading.png new file mode 100644 index 0000000..01742d7 Binary files /dev/null and b/asset/icon/Icon32/shading.png differ diff --git a/asset/icon/Icon32/shape_align_bottom.png b/asset/icon/Icon32/shape_align_bottom.png new file mode 100644 index 0000000..640767e Binary files /dev/null and b/asset/icon/Icon32/shape_align_bottom.png differ diff --git a/asset/icon/Icon32/shape_align_center.png b/asset/icon/Icon32/shape_align_center.png new file mode 100644 index 0000000..f5663d1 Binary files /dev/null and b/asset/icon/Icon32/shape_align_center.png differ diff --git a/asset/icon/Icon32/shape_align_left.png b/asset/icon/Icon32/shape_align_left.png new file mode 100644 index 0000000..fbdc081 Binary files /dev/null and b/asset/icon/Icon32/shape_align_left.png differ diff --git a/asset/icon/Icon32/shape_align_middle.png b/asset/icon/Icon32/shape_align_middle.png new file mode 100644 index 0000000..b1efb14 Binary files /dev/null and b/asset/icon/Icon32/shape_align_middle.png differ diff --git a/asset/icon/Icon32/shape_align_right.png b/asset/icon/Icon32/shape_align_right.png new file mode 100644 index 0000000..64bee5b Binary files /dev/null and b/asset/icon/Icon32/shape_align_right.png differ diff --git a/asset/icon/Icon32/shape_align_top.png b/asset/icon/Icon32/shape_align_top.png new file mode 100644 index 0000000..00545c7 Binary files /dev/null and b/asset/icon/Icon32/shape_align_top.png differ diff --git a/asset/icon/Icon32/shape_flip_horizontal.png b/asset/icon/Icon32/shape_flip_horizontal.png new file mode 100644 index 0000000..8092ede Binary files /dev/null and b/asset/icon/Icon32/shape_flip_horizontal.png differ diff --git a/asset/icon/Icon32/shape_flip_vertical.png b/asset/icon/Icon32/shape_flip_vertical.png new file mode 100644 index 0000000..fadb938 Binary files /dev/null and b/asset/icon/Icon32/shape_flip_vertical.png differ diff --git a/asset/icon/Icon32/shape_group.png b/asset/icon/Icon32/shape_group.png new file mode 100644 index 0000000..d1922bc Binary files /dev/null and b/asset/icon/Icon32/shape_group.png differ diff --git a/asset/icon/Icon32/shape_handles.png b/asset/icon/Icon32/shape_handles.png new file mode 100644 index 0000000..2832ecb Binary files /dev/null and b/asset/icon/Icon32/shape_handles.png differ diff --git a/asset/icon/Icon32/shape_insert.png b/asset/icon/Icon32/shape_insert.png new file mode 100644 index 0000000..4ba54bd Binary files /dev/null and b/asset/icon/Icon32/shape_insert.png differ diff --git a/asset/icon/Icon32/shape_move_back.png b/asset/icon/Icon32/shape_move_back.png new file mode 100644 index 0000000..a913279 Binary files /dev/null and b/asset/icon/Icon32/shape_move_back.png differ diff --git a/asset/icon/Icon32/shape_move_backwards.png b/asset/icon/Icon32/shape_move_backwards.png new file mode 100644 index 0000000..ff4a440 Binary files /dev/null and b/asset/icon/Icon32/shape_move_backwards.png differ diff --git a/asset/icon/Icon32/shape_move_forwards.png b/asset/icon/Icon32/shape_move_forwards.png new file mode 100644 index 0000000..007715b Binary files /dev/null and b/asset/icon/Icon32/shape_move_forwards.png differ diff --git a/asset/icon/Icon32/shape_move_front.png b/asset/icon/Icon32/shape_move_front.png new file mode 100644 index 0000000..9b53faf Binary files /dev/null and b/asset/icon/Icon32/shape_move_front.png differ diff --git a/asset/icon/Icon32/shape_rotate_anticlockwise.png b/asset/icon/Icon32/shape_rotate_anticlockwise.png new file mode 100644 index 0000000..0c08cc3 Binary files /dev/null and b/asset/icon/Icon32/shape_rotate_anticlockwise.png differ diff --git a/asset/icon/Icon32/shape_rotate_clockwise.png b/asset/icon/Icon32/shape_rotate_clockwise.png new file mode 100644 index 0000000..fea987d Binary files /dev/null and b/asset/icon/Icon32/shape_rotate_clockwise.png differ diff --git a/asset/icon/Icon32/shape_square.png b/asset/icon/Icon32/shape_square.png new file mode 100644 index 0000000..f258b26 Binary files /dev/null and b/asset/icon/Icon32/shape_square.png differ diff --git a/asset/icon/Icon32/shape_square_add.png b/asset/icon/Icon32/shape_square_add.png new file mode 100644 index 0000000..0993af2 Binary files /dev/null and b/asset/icon/Icon32/shape_square_add.png differ diff --git a/asset/icon/Icon32/shape_square_delete.png b/asset/icon/Icon32/shape_square_delete.png new file mode 100644 index 0000000..5d1a30a Binary files /dev/null and b/asset/icon/Icon32/shape_square_delete.png differ diff --git a/asset/icon/Icon32/shape_square_edit.png b/asset/icon/Icon32/shape_square_edit.png new file mode 100644 index 0000000..3038cb2 Binary files /dev/null and b/asset/icon/Icon32/shape_square_edit.png differ diff --git a/asset/icon/Icon32/shape_square_error.png b/asset/icon/Icon32/shape_square_error.png new file mode 100644 index 0000000..d67cbed Binary files /dev/null and b/asset/icon/Icon32/shape_square_error.png differ diff --git a/asset/icon/Icon32/shape_square_go.png b/asset/icon/Icon32/shape_square_go.png new file mode 100644 index 0000000..e30ecd2 Binary files /dev/null and b/asset/icon/Icon32/shape_square_go.png differ diff --git a/asset/icon/Icon32/shape_square_key.png b/asset/icon/Icon32/shape_square_key.png new file mode 100644 index 0000000..089ed19 Binary files /dev/null and b/asset/icon/Icon32/shape_square_key.png differ diff --git a/asset/icon/Icon32/shape_square_link.png b/asset/icon/Icon32/shape_square_link.png new file mode 100644 index 0000000..dc9c4d2 Binary files /dev/null and b/asset/icon/Icon32/shape_square_link.png differ diff --git a/asset/icon/Icon32/shape_ungroup.png b/asset/icon/Icon32/shape_ungroup.png new file mode 100644 index 0000000..3813d00 Binary files /dev/null and b/asset/icon/Icon32/shape_ungroup.png differ diff --git a/asset/icon/Icon32/share(2).png b/asset/icon/Icon32/share(2).png new file mode 100644 index 0000000..98527e3 Binary files /dev/null and b/asset/icon/Icon32/share(2).png differ diff --git a/asset/icon/Icon32/share.png b/asset/icon/Icon32/share.png new file mode 100644 index 0000000..61bc012 Binary files /dev/null and b/asset/icon/Icon32/share.png differ diff --git a/asset/icon/Icon32/share_workbook.png b/asset/icon/Icon32/share_workbook.png new file mode 100644 index 0000000..22694e6 Binary files /dev/null and b/asset/icon/Icon32/share_workbook.png differ diff --git a/asset/icon/Icon32/shared_private.png b/asset/icon/Icon32/shared_private.png new file mode 100644 index 0000000..a1d60ff Binary files /dev/null and b/asset/icon/Icon32/shared_private.png differ diff --git a/asset/icon/Icon32/sharepoint.png b/asset/icon/Icon32/sharepoint.png new file mode 100644 index 0000000..1695cfb Binary files /dev/null and b/asset/icon/Icon32/sharepoint.png differ diff --git a/asset/icon/Icon32/sharpen.png b/asset/icon/Icon32/sharpen.png new file mode 100644 index 0000000..1c2082b Binary files /dev/null and b/asset/icon/Icon32/sharpen.png differ diff --git a/asset/icon/Icon32/sheduled_task.png b/asset/icon/Icon32/sheduled_task.png new file mode 100644 index 0000000..36e4e5d Binary files /dev/null and b/asset/icon/Icon32/sheduled_task.png differ diff --git a/asset/icon/Icon32/shield.png b/asset/icon/Icon32/shield.png new file mode 100644 index 0000000..a7d4146 Binary files /dev/null and b/asset/icon/Icon32/shield.png differ diff --git a/asset/icon/Icon32/shield_add.png b/asset/icon/Icon32/shield_add.png new file mode 100644 index 0000000..d018688 Binary files /dev/null and b/asset/icon/Icon32/shield_add.png differ diff --git a/asset/icon/Icon32/shield_delete.png b/asset/icon/Icon32/shield_delete.png new file mode 100644 index 0000000..c647922 Binary files /dev/null and b/asset/icon/Icon32/shield_delete.png differ diff --git a/asset/icon/Icon32/shield_go.png b/asset/icon/Icon32/shield_go.png new file mode 100644 index 0000000..c0ebaaf Binary files /dev/null and b/asset/icon/Icon32/shield_go.png differ diff --git a/asset/icon/Icon32/shirt_polo.png b/asset/icon/Icon32/shirt_polo.png new file mode 100644 index 0000000..2f4e478 Binary files /dev/null and b/asset/icon/Icon32/shirt_polo.png differ diff --git a/asset/icon/Icon32/shoe.png b/asset/icon/Icon32/shoe.png new file mode 100644 index 0000000..3e8b1df Binary files /dev/null and b/asset/icon/Icon32/shoe.png differ diff --git a/asset/icon/Icon32/shop.png b/asset/icon/Icon32/shop.png new file mode 100644 index 0000000..5e8c648 Binary files /dev/null and b/asset/icon/Icon32/shop.png differ diff --git a/asset/icon/Icon32/shop_closed.png b/asset/icon/Icon32/shop_closed.png new file mode 100644 index 0000000..3bc4dad Binary files /dev/null and b/asset/icon/Icon32/shop_closed.png differ diff --git a/asset/icon/Icon32/shop_network.png b/asset/icon/Icon32/shop_network.png new file mode 100644 index 0000000..3a55ee6 Binary files /dev/null and b/asset/icon/Icon32/shop_network.png differ diff --git a/asset/icon/Icon32/shop_open.png b/asset/icon/Icon32/shop_open.png new file mode 100644 index 0000000..b7c8c3d Binary files /dev/null and b/asset/icon/Icon32/shop_open.png differ diff --git a/asset/icon/Icon32/shopping.png b/asset/icon/Icon32/shopping.png new file mode 100644 index 0000000..69ea1db Binary files /dev/null and b/asset/icon/Icon32/shopping.png differ diff --git a/asset/icon/Icon32/shopping_cart_reset.png b/asset/icon/Icon32/shopping_cart_reset.png new file mode 100644 index 0000000..2f8d37e Binary files /dev/null and b/asset/icon/Icon32/shopping_cart_reset.png differ diff --git a/asset/icon/Icon32/shortcuts.png b/asset/icon/Icon32/shortcuts.png new file mode 100644 index 0000000..fa27994 Binary files /dev/null and b/asset/icon/Icon32/shortcuts.png differ diff --git a/asset/icon/Icon32/shorts.png b/asset/icon/Icon32/shorts.png new file mode 100644 index 0000000..bd1bef8 Binary files /dev/null and b/asset/icon/Icon32/shorts.png differ diff --git a/asset/icon/Icon32/show_accounts_over_quota.png b/asset/icon/Icon32/show_accounts_over_quota.png new file mode 100644 index 0000000..a85da60 Binary files /dev/null and b/asset/icon/Icon32/show_accounts_over_quota.png differ diff --git a/asset/icon/Icon32/show_comment.png b/asset/icon/Icon32/show_comment.png new file mode 100644 index 0000000..25f23ac Binary files /dev/null and b/asset/icon/Icon32/show_comment.png differ diff --git a/asset/icon/Icon32/show_detail.png b/asset/icon/Icon32/show_detail.png new file mode 100644 index 0000000..1c9dcb9 Binary files /dev/null and b/asset/icon/Icon32/show_detail.png differ diff --git a/asset/icon/Icon32/show_formulas.png b/asset/icon/Icon32/show_formulas.png new file mode 100644 index 0000000..2dc401c Binary files /dev/null and b/asset/icon/Icon32/show_formulas.png differ diff --git a/asset/icon/Icon32/show_in_favorites.png b/asset/icon/Icon32/show_in_favorites.png new file mode 100644 index 0000000..8621db9 Binary files /dev/null and b/asset/icon/Icon32/show_in_favorites.png differ diff --git a/asset/icon/Icon32/show_ink.png b/asset/icon/Icon32/show_ink.png new file mode 100644 index 0000000..4c01f82 Binary files /dev/null and b/asset/icon/Icon32/show_ink.png differ diff --git a/asset/icon/Icon32/show_notes.png b/asset/icon/Icon32/show_notes.png new file mode 100644 index 0000000..519dd64 Binary files /dev/null and b/asset/icon/Icon32/show_notes.png differ diff --git a/asset/icon/Icon32/show_source_documents.png b/asset/icon/Icon32/show_source_documents.png new file mode 100644 index 0000000..54482ca Binary files /dev/null and b/asset/icon/Icon32/show_source_documents.png differ diff --git a/asset/icon/Icon32/showel.png b/asset/icon/Icon32/showel.png new file mode 100644 index 0000000..4896511 Binary files /dev/null and b/asset/icon/Icon32/showel.png differ diff --git a/asset/icon/Icon32/shuriken.png b/asset/icon/Icon32/shuriken.png new file mode 100644 index 0000000..fc5e930 Binary files /dev/null and b/asset/icon/Icon32/shuriken.png differ diff --git a/asset/icon/Icon32/sign.png b/asset/icon/Icon32/sign.png new file mode 100644 index 0000000..d36f2ba Binary files /dev/null and b/asset/icon/Icon32/sign.png differ diff --git a/asset/icon/Icon32/simple_dns_zone_editor.png b/asset/icon/Icon32/simple_dns_zone_editor.png new file mode 100644 index 0000000..bdb3304 Binary files /dev/null and b/asset/icon/Icon32/simple_dns_zone_editor.png differ diff --git a/asset/icon/Icon32/siren.png b/asset/icon/Icon32/siren.png new file mode 100644 index 0000000..9714984 Binary files /dev/null and b/asset/icon/Icon32/siren.png differ diff --git a/asset/icon/Icon32/site_backup_and_restore.png b/asset/icon/Icon32/site_backup_and_restore.png new file mode 100644 index 0000000..ba3f440 Binary files /dev/null and b/asset/icon/Icon32/site_backup_and_restore.png differ diff --git a/asset/icon/Icon32/site_enhancer.png b/asset/icon/Icon32/site_enhancer.png new file mode 100644 index 0000000..87d8816 Binary files /dev/null and b/asset/icon/Icon32/site_enhancer.png differ diff --git a/asset/icon/Icon32/sitemap(2).png b/asset/icon/Icon32/sitemap(2).png new file mode 100644 index 0000000..a80dd5d Binary files /dev/null and b/asset/icon/Icon32/sitemap(2).png differ diff --git a/asset/icon/Icon32/sitemap.png b/asset/icon/Icon32/sitemap.png new file mode 100644 index 0000000..a12abdd Binary files /dev/null and b/asset/icon/Icon32/sitemap.png differ diff --git a/asset/icon/Icon32/sitemap_application.png b/asset/icon/Icon32/sitemap_application.png new file mode 100644 index 0000000..4b902a1 Binary files /dev/null and b/asset/icon/Icon32/sitemap_application.png differ diff --git a/asset/icon/Icon32/sitemap_application_blue.png b/asset/icon/Icon32/sitemap_application_blue.png new file mode 100644 index 0000000..6a61d71 Binary files /dev/null and b/asset/icon/Icon32/sitemap_application_blue.png differ diff --git a/asset/icon/Icon32/sitemap_color.png b/asset/icon/Icon32/sitemap_color.png new file mode 100644 index 0000000..4c0f39c Binary files /dev/null and b/asset/icon/Icon32/sitemap_color.png differ diff --git a/asset/icon/Icon32/sitemap_image.png b/asset/icon/Icon32/sitemap_image.png new file mode 100644 index 0000000..94f9ab3 Binary files /dev/null and b/asset/icon/Icon32/sitemap_image.png differ diff --git a/asset/icon/Icon32/size_horizontal.png b/asset/icon/Icon32/size_horizontal.png new file mode 100644 index 0000000..7237792 Binary files /dev/null and b/asset/icon/Icon32/size_horizontal.png differ diff --git a/asset/icon/Icon32/size_vertical.png b/asset/icon/Icon32/size_vertical.png new file mode 100644 index 0000000..25f1cc7 Binary files /dev/null and b/asset/icon/Icon32/size_vertical.png differ diff --git a/asset/icon/Icon32/skate.png b/asset/icon/Icon32/skate.png new file mode 100644 index 0000000..334f394 Binary files /dev/null and b/asset/icon/Icon32/skate.png differ diff --git a/asset/icon/Icon32/skeleton_directory.png b/asset/icon/Icon32/skeleton_directory.png new file mode 100644 index 0000000..d33bb4c Binary files /dev/null and b/asset/icon/Icon32/skeleton_directory.png differ diff --git a/asset/icon/Icon32/skins.png b/asset/icon/Icon32/skins.png new file mode 100644 index 0000000..5991937 Binary files /dev/null and b/asset/icon/Icon32/skins.png differ diff --git a/asset/icon/Icon32/skull_old.png b/asset/icon/Icon32/skull_old.png new file mode 100644 index 0000000..e8211db Binary files /dev/null and b/asset/icon/Icon32/skull_old.png differ diff --git a/asset/icon/Icon32/skype.png b/asset/icon/Icon32/skype.png new file mode 100644 index 0000000..a223ffa Binary files /dev/null and b/asset/icon/Icon32/skype.png differ diff --git a/asset/icon/Icon32/slackware.png b/asset/icon/Icon32/slackware.png new file mode 100644 index 0000000..fbf7daa Binary files /dev/null and b/asset/icon/Icon32/slackware.png differ diff --git a/asset/icon/Icon32/slide_cut.png b/asset/icon/Icon32/slide_cut.png new file mode 100644 index 0000000..de0d0cc Binary files /dev/null and b/asset/icon/Icon32/slide_cut.png differ diff --git a/asset/icon/Icon32/slide_fade.png b/asset/icon/Icon32/slide_fade.png new file mode 100644 index 0000000..24c09a3 Binary files /dev/null and b/asset/icon/Icon32/slide_fade.png differ diff --git a/asset/icon/Icon32/slide_layout.png b/asset/icon/Icon32/slide_layout.png new file mode 100644 index 0000000..2316556 Binary files /dev/null and b/asset/icon/Icon32/slide_layout.png differ diff --git a/asset/icon/Icon32/slide_master.png b/asset/icon/Icon32/slide_master.png new file mode 100644 index 0000000..a930bc4 Binary files /dev/null and b/asset/icon/Icon32/slide_master.png differ diff --git a/asset/icon/Icon32/slide_normal_view.png b/asset/icon/Icon32/slide_normal_view.png new file mode 100644 index 0000000..77d6802 Binary files /dev/null and b/asset/icon/Icon32/slide_normal_view.png differ diff --git a/asset/icon/Icon32/slide_notes_master.png b/asset/icon/Icon32/slide_notes_master.png new file mode 100644 index 0000000..b62c5b3 Binary files /dev/null and b/asset/icon/Icon32/slide_notes_master.png differ diff --git a/asset/icon/Icon32/slide_number.png b/asset/icon/Icon32/slide_number.png new file mode 100644 index 0000000..7eebff1 Binary files /dev/null and b/asset/icon/Icon32/slide_number.png differ diff --git a/asset/icon/Icon32/slide_push.png b/asset/icon/Icon32/slide_push.png new file mode 100644 index 0000000..3e6e4d8 Binary files /dev/null and b/asset/icon/Icon32/slide_push.png differ diff --git a/asset/icon/Icon32/slide_random.png b/asset/icon/Icon32/slide_random.png new file mode 100644 index 0000000..a76bb59 Binary files /dev/null and b/asset/icon/Icon32/slide_random.png differ diff --git a/asset/icon/Icon32/slide_shape.png b/asset/icon/Icon32/slide_shape.png new file mode 100644 index 0000000..854ac17 Binary files /dev/null and b/asset/icon/Icon32/slide_shape.png differ diff --git a/asset/icon/Icon32/slide_sorter.png b/asset/icon/Icon32/slide_sorter.png new file mode 100644 index 0000000..2bc0535 Binary files /dev/null and b/asset/icon/Icon32/slide_sorter.png differ diff --git a/asset/icon/Icon32/slide_sound.png b/asset/icon/Icon32/slide_sound.png new file mode 100644 index 0000000..f04b937 Binary files /dev/null and b/asset/icon/Icon32/slide_sound.png differ diff --git a/asset/icon/Icon32/slide_splite.png b/asset/icon/Icon32/slide_splite.png new file mode 100644 index 0000000..7a5c1d5 Binary files /dev/null and b/asset/icon/Icon32/slide_splite.png differ diff --git a/asset/icon/Icon32/slide_wipe.png b/asset/icon/Icon32/slide_wipe.png new file mode 100644 index 0000000..50d89d8 Binary files /dev/null and b/asset/icon/Icon32/slide_wipe.png differ diff --git a/asset/icon/Icon32/slider.png b/asset/icon/Icon32/slider.png new file mode 100644 index 0000000..6720f9a Binary files /dev/null and b/asset/icon/Icon32/slider.png differ diff --git a/asset/icon/Icon32/slider_050.png b/asset/icon/Icon32/slider_050.png new file mode 100644 index 0000000..4b73594 Binary files /dev/null and b/asset/icon/Icon32/slider_050.png differ diff --git a/asset/icon/Icon32/slider_100.png b/asset/icon/Icon32/slider_100.png new file mode 100644 index 0000000..94a040a Binary files /dev/null and b/asset/icon/Icon32/slider_100.png differ diff --git a/asset/icon/Icon32/slider_vertical.png b/asset/icon/Icon32/slider_vertical.png new file mode 100644 index 0000000..10d55b0 Binary files /dev/null and b/asset/icon/Icon32/slider_vertical.png differ diff --git a/asset/icon/Icon32/slider_vertical_050.png b/asset/icon/Icon32/slider_vertical_050.png new file mode 100644 index 0000000..dc7dd20 Binary files /dev/null and b/asset/icon/Icon32/slider_vertical_050.png differ diff --git a/asset/icon/Icon32/slider_vertical_100.png b/asset/icon/Icon32/slider_vertical_100.png new file mode 100644 index 0000000..5a584bb Binary files /dev/null and b/asset/icon/Icon32/slider_vertical_100.png differ diff --git a/asset/icon/Icon32/slideshow.png b/asset/icon/Icon32/slideshow.png new file mode 100644 index 0000000..909bc17 Binary files /dev/null and b/asset/icon/Icon32/slideshow.png differ diff --git a/asset/icon/Icon32/slideshow_full_screen.png b/asset/icon/Icon32/slideshow_full_screen.png new file mode 100644 index 0000000..60ab5f7 Binary files /dev/null and b/asset/icon/Icon32/slideshow_full_screen.png differ diff --git a/asset/icon/Icon32/slideshow_next.png b/asset/icon/Icon32/slideshow_next.png new file mode 100644 index 0000000..b509fa0 Binary files /dev/null and b/asset/icon/Icon32/slideshow_next.png differ diff --git a/asset/icon/Icon32/slideshow_previous.png b/asset/icon/Icon32/slideshow_previous.png new file mode 100644 index 0000000..c81d12f Binary files /dev/null and b/asset/icon/Icon32/slideshow_previous.png differ diff --git a/asset/icon/Icon32/small_business.png b/asset/icon/Icon32/small_business.png new file mode 100644 index 0000000..efd3c07 Binary files /dev/null and b/asset/icon/Icon32/small_business.png differ diff --git a/asset/icon/Icon32/small_car.png b/asset/icon/Icon32/small_car.png new file mode 100644 index 0000000..a2d5dce Binary files /dev/null and b/asset/icon/Icon32/small_car.png differ diff --git a/asset/icon/Icon32/small_tiles.png b/asset/icon/Icon32/small_tiles.png new file mode 100644 index 0000000..3086c0e Binary files /dev/null and b/asset/icon/Icon32/small_tiles.png differ diff --git a/asset/icon/Icon32/smart_art.png b/asset/icon/Icon32/smart_art.png new file mode 100644 index 0000000..3b09e17 Binary files /dev/null and b/asset/icon/Icon32/smart_art.png differ diff --git a/asset/icon/Icon32/snail.png b/asset/icon/Icon32/snail.png new file mode 100644 index 0000000..7cfc121 Binary files /dev/null and b/asset/icon/Icon32/snail.png differ diff --git a/asset/icon/Icon32/snake_and_cup.png b/asset/icon/Icon32/snake_and_cup.png new file mode 100644 index 0000000..0f9711b Binary files /dev/null and b/asset/icon/Icon32/snake_and_cup.png differ diff --git a/asset/icon/Icon32/snapshot.png b/asset/icon/Icon32/snapshot.png new file mode 100644 index 0000000..8047430 Binary files /dev/null and b/asset/icon/Icon32/snapshot.png differ diff --git a/asset/icon/Icon32/sneakers.png b/asset/icon/Icon32/sneakers.png new file mode 100644 index 0000000..2609eef Binary files /dev/null and b/asset/icon/Icon32/sneakers.png differ diff --git a/asset/icon/Icon32/snow_rain.png b/asset/icon/Icon32/snow_rain.png new file mode 100644 index 0000000..f9354fa Binary files /dev/null and b/asset/icon/Icon32/snow_rain.png differ diff --git a/asset/icon/Icon32/snowman.png b/asset/icon/Icon32/snowman.png new file mode 100644 index 0000000..af39a6b Binary files /dev/null and b/asset/icon/Icon32/snowman.png differ diff --git a/asset/icon/Icon32/snowman_head.png b/asset/icon/Icon32/snowman_head.png new file mode 100644 index 0000000..26af7e0 Binary files /dev/null and b/asset/icon/Icon32/snowman_head.png differ diff --git a/asset/icon/Icon32/soap.png b/asset/icon/Icon32/soap.png new file mode 100644 index 0000000..36762bd Binary files /dev/null and b/asset/icon/Icon32/soap.png differ diff --git a/asset/icon/Icon32/sofa.png b/asset/icon/Icon32/sofa.png new file mode 100644 index 0000000..ea41785 Binary files /dev/null and b/asset/icon/Icon32/sofa.png differ diff --git a/asset/icon/Icon32/soil_layers.png b/asset/icon/Icon32/soil_layers.png new file mode 100644 index 0000000..9a98876 Binary files /dev/null and b/asset/icon/Icon32/soil_layers.png differ diff --git a/asset/icon/Icon32/solar.png b/asset/icon/Icon32/solar.png new file mode 100644 index 0000000..3dd833d Binary files /dev/null and b/asset/icon/Icon32/solar.png differ diff --git a/asset/icon/Icon32/sort.png b/asset/icon/Icon32/sort.png new file mode 100644 index 0000000..aac3362 Binary files /dev/null and b/asset/icon/Icon32/sort.png differ diff --git a/asset/icon/Icon32/sort_add.png b/asset/icon/Icon32/sort_add.png new file mode 100644 index 0000000..683b94d Binary files /dev/null and b/asset/icon/Icon32/sort_add.png differ diff --git a/asset/icon/Icon32/sort_alphabel.png b/asset/icon/Icon32/sort_alphabel.png new file mode 100644 index 0000000..2219a32 Binary files /dev/null and b/asset/icon/Icon32/sort_alphabel.png differ diff --git a/asset/icon/Icon32/sort_alphabel_column.png b/asset/icon/Icon32/sort_alphabel_column.png new file mode 100644 index 0000000..d5f46a2 Binary files /dev/null and b/asset/icon/Icon32/sort_alphabel_column.png differ diff --git a/asset/icon/Icon32/sort_alphabel_descending.png b/asset/icon/Icon32/sort_alphabel_descending.png new file mode 100644 index 0000000..933b248 Binary files /dev/null and b/asset/icon/Icon32/sort_alphabel_descending.png differ diff --git a/asset/icon/Icon32/sort_ascending(2).png b/asset/icon/Icon32/sort_ascending(2).png new file mode 100644 index 0000000..ebcfdd0 Binary files /dev/null and b/asset/icon/Icon32/sort_ascending(2).png differ diff --git a/asset/icon/Icon32/sort_ascending.png b/asset/icon/Icon32/sort_ascending.png new file mode 100644 index 0000000..3a7f470 Binary files /dev/null and b/asset/icon/Icon32/sort_ascending.png differ diff --git a/asset/icon/Icon32/sort_columns.png b/asset/icon/Icon32/sort_columns.png new file mode 100644 index 0000000..605d897 Binary files /dev/null and b/asset/icon/Icon32/sort_columns.png differ diff --git a/asset/icon/Icon32/sort_date.png b/asset/icon/Icon32/sort_date.png new file mode 100644 index 0000000..051ea21 Binary files /dev/null and b/asset/icon/Icon32/sort_date.png differ diff --git a/asset/icon/Icon32/sort_date_descending.png b/asset/icon/Icon32/sort_date_descending.png new file mode 100644 index 0000000..bcd6996 Binary files /dev/null and b/asset/icon/Icon32/sort_date_descending.png differ diff --git a/asset/icon/Icon32/sort_delete.png b/asset/icon/Icon32/sort_delete.png new file mode 100644 index 0000000..f0dae74 Binary files /dev/null and b/asset/icon/Icon32/sort_delete.png differ diff --git a/asset/icon/Icon32/sort_descending(2).png b/asset/icon/Icon32/sort_descending(2).png new file mode 100644 index 0000000..4db3ebe Binary files /dev/null and b/asset/icon/Icon32/sort_descending(2).png differ diff --git a/asset/icon/Icon32/sort_descending.png b/asset/icon/Icon32/sort_descending.png new file mode 100644 index 0000000..e18333e Binary files /dev/null and b/asset/icon/Icon32/sort_descending.png differ diff --git a/asset/icon/Icon32/sort_edit.png b/asset/icon/Icon32/sort_edit.png new file mode 100644 index 0000000..b8fbdf9 Binary files /dev/null and b/asset/icon/Icon32/sort_edit.png differ diff --git a/asset/icon/Icon32/sort_error.png b/asset/icon/Icon32/sort_error.png new file mode 100644 index 0000000..f09281e Binary files /dev/null and b/asset/icon/Icon32/sort_error.png differ diff --git a/asset/icon/Icon32/sort_go.png b/asset/icon/Icon32/sort_go.png new file mode 100644 index 0000000..315a38e Binary files /dev/null and b/asset/icon/Icon32/sort_go.png differ diff --git a/asset/icon/Icon32/sort_number.png b/asset/icon/Icon32/sort_number.png new file mode 100644 index 0000000..fe80767 Binary files /dev/null and b/asset/icon/Icon32/sort_number.png differ diff --git a/asset/icon/Icon32/sort_number_column.png b/asset/icon/Icon32/sort_number_column.png new file mode 100644 index 0000000..9ac242a Binary files /dev/null and b/asset/icon/Icon32/sort_number_column.png differ diff --git a/asset/icon/Icon32/sort_number_descending.png b/asset/icon/Icon32/sort_number_descending.png new file mode 100644 index 0000000..a5dbd97 Binary files /dev/null and b/asset/icon/Icon32/sort_number_descending.png differ diff --git a/asset/icon/Icon32/sort_price.png b/asset/icon/Icon32/sort_price.png new file mode 100644 index 0000000..c2a43a9 Binary files /dev/null and b/asset/icon/Icon32/sort_price.png differ diff --git a/asset/icon/Icon32/sort_price_descending.png b/asset/icon/Icon32/sort_price_descending.png new file mode 100644 index 0000000..e5862ff Binary files /dev/null and b/asset/icon/Icon32/sort_price_descending.png differ diff --git a/asset/icon/Icon32/sort_quantity.png b/asset/icon/Icon32/sort_quantity.png new file mode 100644 index 0000000..8ab8965 Binary files /dev/null and b/asset/icon/Icon32/sort_quantity.png differ diff --git a/asset/icon/Icon32/sort_quantity_descending.png b/asset/icon/Icon32/sort_quantity_descending.png new file mode 100644 index 0000000..cf0c6cb Binary files /dev/null and b/asset/icon/Icon32/sort_quantity_descending.png differ diff --git a/asset/icon/Icon32/sort_rating.png b/asset/icon/Icon32/sort_rating.png new file mode 100644 index 0000000..d0e7ca4 Binary files /dev/null and b/asset/icon/Icon32/sort_rating.png differ diff --git a/asset/icon/Icon32/sort_rating_descending.png b/asset/icon/Icon32/sort_rating_descending.png new file mode 100644 index 0000000..189749a Binary files /dev/null and b/asset/icon/Icon32/sort_rating_descending.png differ diff --git a/asset/icon/Icon32/sort_small.png b/asset/icon/Icon32/sort_small.png new file mode 100644 index 0000000..f7878c0 Binary files /dev/null and b/asset/icon/Icon32/sort_small.png differ diff --git a/asset/icon/Icon32/sound.png b/asset/icon/Icon32/sound.png new file mode 100644 index 0000000..8c2baf0 Binary files /dev/null and b/asset/icon/Icon32/sound.png differ diff --git a/asset/icon/Icon32/sound_add.png b/asset/icon/Icon32/sound_add.png new file mode 100644 index 0000000..e9ba050 Binary files /dev/null and b/asset/icon/Icon32/sound_add.png differ diff --git a/asset/icon/Icon32/sound_delete.png b/asset/icon/Icon32/sound_delete.png new file mode 100644 index 0000000..4245250 Binary files /dev/null and b/asset/icon/Icon32/sound_delete.png differ diff --git a/asset/icon/Icon32/sound_low.png b/asset/icon/Icon32/sound_low.png new file mode 100644 index 0000000..2a2c31e Binary files /dev/null and b/asset/icon/Icon32/sound_low.png differ diff --git a/asset/icon/Icon32/sound_mute.png b/asset/icon/Icon32/sound_mute.png new file mode 100644 index 0000000..c683bc6 Binary files /dev/null and b/asset/icon/Icon32/sound_mute.png differ diff --git a/asset/icon/Icon32/sound_none.png b/asset/icon/Icon32/sound_none.png new file mode 100644 index 0000000..1144cd9 Binary files /dev/null and b/asset/icon/Icon32/sound_none.png differ diff --git a/asset/icon/Icon32/soup.png b/asset/icon/Icon32/soup.png new file mode 100644 index 0000000..cfee407 Binary files /dev/null and b/asset/icon/Icon32/soup.png differ diff --git a/asset/icon/Icon32/source_code.png b/asset/icon/Icon32/source_code.png new file mode 100644 index 0000000..3bf4b7c Binary files /dev/null and b/asset/icon/Icon32/source_code.png differ diff --git a/asset/icon/Icon32/spacer.png b/asset/icon/Icon32/spacer.png new file mode 100644 index 0000000..707f3ac Binary files /dev/null and b/asset/icon/Icon32/spacer.png differ diff --git a/asset/icon/Icon32/spam.png b/asset/icon/Icon32/spam.png new file mode 100644 index 0000000..73c21c3 Binary files /dev/null and b/asset/icon/Icon32/spam.png differ diff --git a/asset/icon/Icon32/spam_assassin.png b/asset/icon/Icon32/spam_assassin.png new file mode 100644 index 0000000..162788f Binary files /dev/null and b/asset/icon/Icon32/spam_assassin.png differ diff --git a/asset/icon/Icon32/spam_filter(2).png b/asset/icon/Icon32/spam_filter(2).png new file mode 100644 index 0000000..8038237 Binary files /dev/null and b/asset/icon/Icon32/spam_filter(2).png differ diff --git a/asset/icon/Icon32/spam_filter.png b/asset/icon/Icon32/spam_filter.png new file mode 100644 index 0000000..097af55 Binary files /dev/null and b/asset/icon/Icon32/spam_filter.png differ diff --git a/asset/icon/Icon32/sparklines.png b/asset/icon/Icon32/sparklines.png new file mode 100644 index 0000000..9233153 Binary files /dev/null and b/asset/icon/Icon32/sparklines.png differ diff --git a/asset/icon/Icon32/speaker_network.png b/asset/icon/Icon32/speaker_network.png new file mode 100644 index 0000000..c7234ec Binary files /dev/null and b/asset/icon/Icon32/speaker_network.png differ diff --git a/asset/icon/Icon32/speakers.png b/asset/icon/Icon32/speakers.png new file mode 100644 index 0000000..7e311b7 Binary files /dev/null and b/asset/icon/Icon32/speakers.png differ diff --git a/asset/icon/Icon32/spectrum.png b/asset/icon/Icon32/spectrum.png new file mode 100644 index 0000000..7b3222f Binary files /dev/null and b/asset/icon/Icon32/spectrum.png differ diff --git a/asset/icon/Icon32/spectrum_absorption.png b/asset/icon/Icon32/spectrum_absorption.png new file mode 100644 index 0000000..e3ae04a Binary files /dev/null and b/asset/icon/Icon32/spectrum_absorption.png differ diff --git a/asset/icon/Icon32/spectrum_emission.png b/asset/icon/Icon32/spectrum_emission.png new file mode 100644 index 0000000..0edd1fd Binary files /dev/null and b/asset/icon/Icon32/spectrum_emission.png differ diff --git a/asset/icon/Icon32/speedometer.png b/asset/icon/Icon32/speedometer.png new file mode 100644 index 0000000..83c1b96 Binary files /dev/null and b/asset/icon/Icon32/speedometer.png differ diff --git a/asset/icon/Icon32/spellcheck.png b/asset/icon/Icon32/spellcheck.png new file mode 100644 index 0000000..c500628 Binary files /dev/null and b/asset/icon/Icon32/spellcheck.png differ diff --git a/asset/icon/Icon32/spellcheck_error.png b/asset/icon/Icon32/spellcheck_error.png new file mode 100644 index 0000000..0b393c1 Binary files /dev/null and b/asset/icon/Icon32/spellcheck_error.png differ diff --git a/asset/icon/Icon32/spider_web.png b/asset/icon/Icon32/spider_web.png new file mode 100644 index 0000000..de23651 Binary files /dev/null and b/asset/icon/Icon32/spider_web.png differ diff --git a/asset/icon/Icon32/spill.png b/asset/icon/Icon32/spill.png new file mode 100644 index 0000000..65e3fca Binary files /dev/null and b/asset/icon/Icon32/spill.png differ diff --git a/asset/icon/Icon32/spin.png b/asset/icon/Icon32/spin.png new file mode 100644 index 0000000..2baa7c1 Binary files /dev/null and b/asset/icon/Icon32/spin.png differ diff --git a/asset/icon/Icon32/split_panel.png b/asset/icon/Icon32/split_panel.png new file mode 100644 index 0000000..847c76f Binary files /dev/null and b/asset/icon/Icon32/split_panel.png differ diff --git a/asset/icon/Icon32/split_panel_vertical.png b/asset/icon/Icon32/split_panel_vertical.png new file mode 100644 index 0000000..e04d9ca Binary files /dev/null and b/asset/icon/Icon32/split_panel_vertical.png differ diff --git a/asset/icon/Icon32/splitter.png b/asset/icon/Icon32/splitter.png new file mode 100644 index 0000000..9cff786 Binary files /dev/null and b/asset/icon/Icon32/splitter.png differ diff --git a/asset/icon/Icon32/splitter_horizontal.png b/asset/icon/Icon32/splitter_horizontal.png new file mode 100644 index 0000000..d8a2e33 Binary files /dev/null and b/asset/icon/Icon32/splitter_horizontal.png differ diff --git a/asset/icon/Icon32/sport.png b/asset/icon/Icon32/sport.png new file mode 100644 index 0000000..a3f78a4 Binary files /dev/null and b/asset/icon/Icon32/sport.png differ diff --git a/asset/icon/Icon32/sport_8ball.png b/asset/icon/Icon32/sport_8ball.png new file mode 100644 index 0000000..569049a Binary files /dev/null and b/asset/icon/Icon32/sport_8ball.png differ diff --git a/asset/icon/Icon32/sport_basketball.png b/asset/icon/Icon32/sport_basketball.png new file mode 100644 index 0000000..e20215d Binary files /dev/null and b/asset/icon/Icon32/sport_basketball.png differ diff --git a/asset/icon/Icon32/sport_football.png b/asset/icon/Icon32/sport_football.png new file mode 100644 index 0000000..f2bbcb9 Binary files /dev/null and b/asset/icon/Icon32/sport_football.png differ diff --git a/asset/icon/Icon32/sport_golf.png b/asset/icon/Icon32/sport_golf.png new file mode 100644 index 0000000..6162f2d Binary files /dev/null and b/asset/icon/Icon32/sport_golf.png differ diff --git a/asset/icon/Icon32/sport_raquet.png b/asset/icon/Icon32/sport_raquet.png new file mode 100644 index 0000000..d9d5659 Binary files /dev/null and b/asset/icon/Icon32/sport_raquet.png differ diff --git a/asset/icon/Icon32/sport_shuttlecock.png b/asset/icon/Icon32/sport_shuttlecock.png new file mode 100644 index 0000000..dd50223 Binary files /dev/null and b/asset/icon/Icon32/sport_shuttlecock.png differ diff --git a/asset/icon/Icon32/sport_soccer.png b/asset/icon/Icon32/sport_soccer.png new file mode 100644 index 0000000..3126499 Binary files /dev/null and b/asset/icon/Icon32/sport_soccer.png differ diff --git a/asset/icon/Icon32/sport_tennis.png b/asset/icon/Icon32/sport_tennis.png new file mode 100644 index 0000000..a1ac633 Binary files /dev/null and b/asset/icon/Icon32/sport_tennis.png differ diff --git a/asset/icon/Icon32/spray.png b/asset/icon/Icon32/spray.png new file mode 100644 index 0000000..8e0a5bf Binary files /dev/null and b/asset/icon/Icon32/spray.png differ diff --git a/asset/icon/Icon32/spray_color.png b/asset/icon/Icon32/spray_color.png new file mode 100644 index 0000000..1292882 Binary files /dev/null and b/asset/icon/Icon32/spray_color.png differ diff --git a/asset/icon/Icon32/spring.png b/asset/icon/Icon32/spring.png new file mode 100644 index 0000000..4fd39b8 Binary files /dev/null and b/asset/icon/Icon32/spring.png differ diff --git a/asset/icon/Icon32/sql.png b/asset/icon/Icon32/sql.png new file mode 100644 index 0000000..7b993af Binary files /dev/null and b/asset/icon/Icon32/sql.png differ diff --git a/asset/icon/Icon32/sql_join.png b/asset/icon/Icon32/sql_join.png new file mode 100644 index 0000000..8bb992f Binary files /dev/null and b/asset/icon/Icon32/sql_join.png differ diff --git a/asset/icon/Icon32/sql_join_inner.png b/asset/icon/Icon32/sql_join_inner.png new file mode 100644 index 0000000..c1c9c90 Binary files /dev/null and b/asset/icon/Icon32/sql_join_inner.png differ diff --git a/asset/icon/Icon32/sql_join_left.png b/asset/icon/Icon32/sql_join_left.png new file mode 100644 index 0000000..260a9a7 Binary files /dev/null and b/asset/icon/Icon32/sql_join_left.png differ diff --git a/asset/icon/Icon32/sql_join_left_exclude.png b/asset/icon/Icon32/sql_join_left_exclude.png new file mode 100644 index 0000000..4cad421 Binary files /dev/null and b/asset/icon/Icon32/sql_join_left_exclude.png differ diff --git a/asset/icon/Icon32/sql_join_outer.png b/asset/icon/Icon32/sql_join_outer.png new file mode 100644 index 0000000..4414389 Binary files /dev/null and b/asset/icon/Icon32/sql_join_outer.png differ diff --git a/asset/icon/Icon32/sql_join_outer_exclude.png b/asset/icon/Icon32/sql_join_outer_exclude.png new file mode 100644 index 0000000..d4e4638 Binary files /dev/null and b/asset/icon/Icon32/sql_join_outer_exclude.png differ diff --git a/asset/icon/Icon32/sql_join_right.png b/asset/icon/Icon32/sql_join_right.png new file mode 100644 index 0000000..321abfe Binary files /dev/null and b/asset/icon/Icon32/sql_join_right.png differ diff --git a/asset/icon/Icon32/sql_join_right_exclude.png b/asset/icon/Icon32/sql_join_right_exclude.png new file mode 100644 index 0000000..7df17aa Binary files /dev/null and b/asset/icon/Icon32/sql_join_right_exclude.png differ diff --git a/asset/icon/Icon32/sql_server(2).png b/asset/icon/Icon32/sql_server(2).png new file mode 100644 index 0000000..bdfc4a2 Binary files /dev/null and b/asset/icon/Icon32/sql_server(2).png differ diff --git a/asset/icon/Icon32/sql_server.png b/asset/icon/Icon32/sql_server.png new file mode 100644 index 0000000..5210a0c Binary files /dev/null and b/asset/icon/Icon32/sql_server.png differ diff --git a/asset/icon/Icon32/ssh_server.png b/asset/icon/Icon32/ssh_server.png new file mode 100644 index 0000000..f79c801 Binary files /dev/null and b/asset/icon/Icon32/ssh_server.png differ diff --git a/asset/icon/Icon32/ssh_shell_access.png b/asset/icon/Icon32/ssh_shell_access.png new file mode 100644 index 0000000..d7e0a61 Binary files /dev/null and b/asset/icon/Icon32/ssh_shell_access.png differ diff --git a/asset/icon/Icon32/ssl_certificates.png b/asset/icon/Icon32/ssl_certificates.png new file mode 100644 index 0000000..f6545d8 Binary files /dev/null and b/asset/icon/Icon32/ssl_certificates.png differ diff --git a/asset/icon/Icon32/ssl_tls_manager.png b/asset/icon/Icon32/ssl_tls_manager.png new file mode 100644 index 0000000..87d9486 Binary files /dev/null and b/asset/icon/Icon32/ssl_tls_manager.png differ diff --git a/asset/icon/Icon32/stairs.png b/asset/icon/Icon32/stairs.png new file mode 100644 index 0000000..939a30e Binary files /dev/null and b/asset/icon/Icon32/stairs.png differ diff --git a/asset/icon/Icon32/stamp_pattern.png b/asset/icon/Icon32/stamp_pattern.png new file mode 100644 index 0000000..470bd5a Binary files /dev/null and b/asset/icon/Icon32/stamp_pattern.png differ diff --git a/asset/icon/Icon32/star.png b/asset/icon/Icon32/star.png new file mode 100644 index 0000000..92865b1 Binary files /dev/null and b/asset/icon/Icon32/star.png differ diff --git a/asset/icon/Icon32/statistics.png b/asset/icon/Icon32/statistics.png new file mode 100644 index 0000000..3a840e6 Binary files /dev/null and b/asset/icon/Icon32/statistics.png differ diff --git a/asset/icon/Icon32/status_away.png b/asset/icon/Icon32/status_away.png new file mode 100644 index 0000000..3905eb2 Binary files /dev/null and b/asset/icon/Icon32/status_away.png differ diff --git a/asset/icon/Icon32/status_bar.png b/asset/icon/Icon32/status_bar.png new file mode 100644 index 0000000..09561b5 Binary files /dev/null and b/asset/icon/Icon32/status_bar.png differ diff --git a/asset/icon/Icon32/status_bar_light_blue.png b/asset/icon/Icon32/status_bar_light_blue.png new file mode 100644 index 0000000..cf7285d Binary files /dev/null and b/asset/icon/Icon32/status_bar_light_blue.png differ diff --git a/asset/icon/Icon32/status_busy.png b/asset/icon/Icon32/status_busy.png new file mode 100644 index 0000000..8d70bd1 Binary files /dev/null and b/asset/icon/Icon32/status_busy.png differ diff --git a/asset/icon/Icon32/status_offline.png b/asset/icon/Icon32/status_offline.png new file mode 100644 index 0000000..9d44a1d Binary files /dev/null and b/asset/icon/Icon32/status_offline.png differ diff --git a/asset/icon/Icon32/status_online.png b/asset/icon/Icon32/status_online.png new file mode 100644 index 0000000..eda3181 Binary files /dev/null and b/asset/icon/Icon32/status_online.png differ diff --git a/asset/icon/Icon32/steak_fish.png b/asset/icon/Icon32/steak_fish.png new file mode 100644 index 0000000..51539cd Binary files /dev/null and b/asset/icon/Icon32/steak_fish.png differ diff --git a/asset/icon/Icon32/steak_meat.png b/asset/icon/Icon32/steak_meat.png new file mode 100644 index 0000000..6a980fa Binary files /dev/null and b/asset/icon/Icon32/steak_meat.png differ diff --git a/asset/icon/Icon32/steering_wheel.png b/asset/icon/Icon32/steering_wheel.png new file mode 100644 index 0000000..f54ed93 Binary files /dev/null and b/asset/icon/Icon32/steering_wheel.png differ diff --git a/asset/icon/Icon32/steering_wheel_2.png b/asset/icon/Icon32/steering_wheel_2.png new file mode 100644 index 0000000..d49a94b Binary files /dev/null and b/asset/icon/Icon32/steering_wheel_2.png differ diff --git a/asset/icon/Icon32/steering_wheel_3.png b/asset/icon/Icon32/steering_wheel_3.png new file mode 100644 index 0000000..3f81609 Binary files /dev/null and b/asset/icon/Icon32/steering_wheel_3.png differ diff --git a/asset/icon/Icon32/stethoscope.png b/asset/icon/Icon32/stethoscope.png new file mode 100644 index 0000000..1223504 Binary files /dev/null and b/asset/icon/Icon32/stethoscope.png differ diff --git a/asset/icon/Icon32/stethoscope_vintage.png b/asset/icon/Icon32/stethoscope_vintage.png new file mode 100644 index 0000000..9acea77 Binary files /dev/null and b/asset/icon/Icon32/stethoscope_vintage.png differ diff --git a/asset/icon/Icon32/stickman.png b/asset/icon/Icon32/stickman.png new file mode 100644 index 0000000..3516a7d Binary files /dev/null and b/asset/icon/Icon32/stickman.png differ diff --git a/asset/icon/Icon32/stop.png b/asset/icon/Icon32/stop.png new file mode 100644 index 0000000..807117f Binary files /dev/null and b/asset/icon/Icon32/stop.png differ diff --git a/asset/icon/Icon32/stopwatch_finish.png b/asset/icon/Icon32/stopwatch_finish.png new file mode 100644 index 0000000..c13862a Binary files /dev/null and b/asset/icon/Icon32/stopwatch_finish.png differ diff --git a/asset/icon/Icon32/stopwatch_pause.png b/asset/icon/Icon32/stopwatch_pause.png new file mode 100644 index 0000000..3826c27 Binary files /dev/null and b/asset/icon/Icon32/stopwatch_pause.png differ diff --git a/asset/icon/Icon32/stopwatch_start.png b/asset/icon/Icon32/stopwatch_start.png new file mode 100644 index 0000000..765d518 Binary files /dev/null and b/asset/icon/Icon32/stopwatch_start.png differ diff --git a/asset/icon/Icon32/storage.png b/asset/icon/Icon32/storage.png new file mode 100644 index 0000000..b7777a9 Binary files /dev/null and b/asset/icon/Icon32/storage.png differ diff --git a/asset/icon/Icon32/street_stall.png b/asset/icon/Icon32/street_stall.png new file mode 100644 index 0000000..147f444 Binary files /dev/null and b/asset/icon/Icon32/street_stall.png differ diff --git a/asset/icon/Icon32/stumble_upon.png b/asset/icon/Icon32/stumble_upon.png new file mode 100644 index 0000000..95c4839 Binary files /dev/null and b/asset/icon/Icon32/stumble_upon.png differ diff --git a/asset/icon/Icon32/style.png b/asset/icon/Icon32/style.png new file mode 100644 index 0000000..40a15b6 Binary files /dev/null and b/asset/icon/Icon32/style.png differ diff --git a/asset/icon/Icon32/style_add.png b/asset/icon/Icon32/style_add.png new file mode 100644 index 0000000..a023ad0 Binary files /dev/null and b/asset/icon/Icon32/style_add.png differ diff --git a/asset/icon/Icon32/style_delete.png b/asset/icon/Icon32/style_delete.png new file mode 100644 index 0000000..502c641 Binary files /dev/null and b/asset/icon/Icon32/style_delete.png differ diff --git a/asset/icon/Icon32/style_edit.png b/asset/icon/Icon32/style_edit.png new file mode 100644 index 0000000..35b1238 Binary files /dev/null and b/asset/icon/Icon32/style_edit.png differ diff --git a/asset/icon/Icon32/style_go.png b/asset/icon/Icon32/style_go.png new file mode 100644 index 0000000..6b85cf1 Binary files /dev/null and b/asset/icon/Icon32/style_go.png differ diff --git a/asset/icon/Icon32/subdomains.png b/asset/icon/Icon32/subdomains.png new file mode 100644 index 0000000..80e9e50 Binary files /dev/null and b/asset/icon/Icon32/subdomains.png differ diff --git a/asset/icon/Icon32/submit_support_request.png b/asset/icon/Icon32/submit_support_request.png new file mode 100644 index 0000000..6824669 Binary files /dev/null and b/asset/icon/Icon32/submit_support_request.png differ diff --git a/asset/icon/Icon32/subtotal.png b/asset/icon/Icon32/subtotal.png new file mode 100644 index 0000000..1f56551 Binary files /dev/null and b/asset/icon/Icon32/subtotal.png differ diff --git a/asset/icon/Icon32/subversion.png b/asset/icon/Icon32/subversion.png new file mode 100644 index 0000000..0cab15f Binary files /dev/null and b/asset/icon/Icon32/subversion.png differ diff --git a/asset/icon/Icon32/subwoofer.png b/asset/icon/Icon32/subwoofer.png new file mode 100644 index 0000000..045748c Binary files /dev/null and b/asset/icon/Icon32/subwoofer.png differ diff --git a/asset/icon/Icon32/sum.png b/asset/icon/Icon32/sum.png new file mode 100644 index 0000000..1a5c7dd Binary files /dev/null and b/asset/icon/Icon32/sum.png differ diff --git a/asset/icon/Icon32/summary_table.png b/asset/icon/Icon32/summary_table.png new file mode 100644 index 0000000..2f8c71c Binary files /dev/null and b/asset/icon/Icon32/summary_table.png differ diff --git a/asset/icon/Icon32/sun_cloudy.png b/asset/icon/Icon32/sun_cloudy.png new file mode 100644 index 0000000..b1288dc Binary files /dev/null and b/asset/icon/Icon32/sun_cloudy.png differ diff --git a/asset/icon/Icon32/sun_rain.png b/asset/icon/Icon32/sun_rain.png new file mode 100644 index 0000000..d94e803 Binary files /dev/null and b/asset/icon/Icon32/sun_rain.png differ diff --git a/asset/icon/Icon32/support.png b/asset/icon/Icon32/support.png new file mode 100644 index 0000000..c003c0d Binary files /dev/null and b/asset/icon/Icon32/support.png differ diff --git a/asset/icon/Icon32/sushi.png b/asset/icon/Icon32/sushi.png new file mode 100644 index 0000000..161cd48 Binary files /dev/null and b/asset/icon/Icon32/sushi.png differ diff --git a/asset/icon/Icon32/suspend_unsuspend_account.png b/asset/icon/Icon32/suspend_unsuspend_account.png new file mode 100644 index 0000000..f5481dd Binary files /dev/null and b/asset/icon/Icon32/suspend_unsuspend_account.png differ diff --git a/asset/icon/Icon32/swf_loader.png b/asset/icon/Icon32/swf_loader.png new file mode 100644 index 0000000..e787285 Binary files /dev/null and b/asset/icon/Icon32/swf_loader.png differ diff --git a/asset/icon/Icon32/switch.png b/asset/icon/Icon32/switch.png new file mode 100644 index 0000000..da1b5d4 Binary files /dev/null and b/asset/icon/Icon32/switch.png differ diff --git a/asset/icon/Icon32/switch_120v.png b/asset/icon/Icon32/switch_120v.png new file mode 100644 index 0000000..4021ecf Binary files /dev/null and b/asset/icon/Icon32/switch_120v.png differ diff --git a/asset/icon/Icon32/switch_220v.png b/asset/icon/Icon32/switch_220v.png new file mode 100644 index 0000000..ad829f8 Binary files /dev/null and b/asset/icon/Icon32/switch_220v.png differ diff --git a/asset/icon/Icon32/switch_windows.png b/asset/icon/Icon32/switch_windows.png new file mode 100644 index 0000000..12b9943 Binary files /dev/null and b/asset/icon/Icon32/switch_windows.png differ diff --git a/asset/icon/Icon32/sword.png b/asset/icon/Icon32/sword.png new file mode 100644 index 0000000..6ee876c Binary files /dev/null and b/asset/icon/Icon32/sword.png differ diff --git a/asset/icon/Icon32/synchronize_ftp_password.png b/asset/icon/Icon32/synchronize_ftp_password.png new file mode 100644 index 0000000..5036eda Binary files /dev/null and b/asset/icon/Icon32/synchronize_ftp_password.png differ diff --git a/asset/icon/Icon32/synchronous_scrolling.png b/asset/icon/Icon32/synchronous_scrolling.png new file mode 100644 index 0000000..6533c1b Binary files /dev/null and b/asset/icon/Icon32/synchronous_scrolling.png differ diff --git a/asset/icon/Icon32/system_monitor.png b/asset/icon/Icon32/system_monitor.png new file mode 100644 index 0000000..80712a0 Binary files /dev/null and b/asset/icon/Icon32/system_monitor.png differ diff --git a/asset/icon/Icon32/system_time.png b/asset/icon/Icon32/system_time.png new file mode 100644 index 0000000..957c526 Binary files /dev/null and b/asset/icon/Icon32/system_time.png differ diff --git a/asset/icon/Icon32/t_shirt_print.png b/asset/icon/Icon32/t_shirt_print.png new file mode 100644 index 0000000..e40dc80 Binary files /dev/null and b/asset/icon/Icon32/t_shirt_print.png differ diff --git a/asset/icon/Icon32/tab.png b/asset/icon/Icon32/tab.png new file mode 100644 index 0000000..0bff3c4 Binary files /dev/null and b/asset/icon/Icon32/tab.png differ diff --git a/asset/icon/Icon32/tab_add.png b/asset/icon/Icon32/tab_add.png new file mode 100644 index 0000000..94a4dc9 Binary files /dev/null and b/asset/icon/Icon32/tab_add.png differ diff --git a/asset/icon/Icon32/tab_content.png b/asset/icon/Icon32/tab_content.png new file mode 100644 index 0000000..8db8078 Binary files /dev/null and b/asset/icon/Icon32/tab_content.png differ diff --git a/asset/icon/Icon32/tab_content_vertical.png b/asset/icon/Icon32/tab_content_vertical.png new file mode 100644 index 0000000..8364b54 Binary files /dev/null and b/asset/icon/Icon32/tab_content_vertical.png differ diff --git a/asset/icon/Icon32/tab_delete.png b/asset/icon/Icon32/tab_delete.png new file mode 100644 index 0000000..e2aec7a Binary files /dev/null and b/asset/icon/Icon32/tab_delete.png differ diff --git a/asset/icon/Icon32/tab_edit.png b/asset/icon/Icon32/tab_edit.png new file mode 100644 index 0000000..c9f99a8 Binary files /dev/null and b/asset/icon/Icon32/tab_edit.png differ diff --git a/asset/icon/Icon32/tab_go.png b/asset/icon/Icon32/tab_go.png new file mode 100644 index 0000000..b8f212d Binary files /dev/null and b/asset/icon/Icon32/tab_go.png differ diff --git a/asset/icon/Icon32/tab_side.png b/asset/icon/Icon32/tab_side.png new file mode 100644 index 0000000..e33edb4 Binary files /dev/null and b/asset/icon/Icon32/tab_side.png differ diff --git a/asset/icon/Icon32/tabbar.png b/asset/icon/Icon32/tabbar.png new file mode 100644 index 0000000..d013c93 Binary files /dev/null and b/asset/icon/Icon32/tabbar.png differ diff --git a/asset/icon/Icon32/table.png b/asset/icon/Icon32/table.png new file mode 100644 index 0000000..0d1e11a Binary files /dev/null and b/asset/icon/Icon32/table.png differ diff --git a/asset/icon/Icon32/table_add.png b/asset/icon/Icon32/table_add.png new file mode 100644 index 0000000..451c0a6 Binary files /dev/null and b/asset/icon/Icon32/table_add.png differ diff --git a/asset/icon/Icon32/table_analysis.png b/asset/icon/Icon32/table_analysis.png new file mode 100644 index 0000000..af1086c Binary files /dev/null and b/asset/icon/Icon32/table_analysis.png differ diff --git a/asset/icon/Icon32/table_chart.png b/asset/icon/Icon32/table_chart.png new file mode 100644 index 0000000..01a0a8d Binary files /dev/null and b/asset/icon/Icon32/table_chart.png differ diff --git a/asset/icon/Icon32/table_delete.png b/asset/icon/Icon32/table_delete.png new file mode 100644 index 0000000..3656ec9 Binary files /dev/null and b/asset/icon/Icon32/table_delete.png differ diff --git a/asset/icon/Icon32/table_design.png b/asset/icon/Icon32/table_design.png new file mode 100644 index 0000000..7f802c0 Binary files /dev/null and b/asset/icon/Icon32/table_design.png differ diff --git a/asset/icon/Icon32/table_edit.png b/asset/icon/Icon32/table_edit.png new file mode 100644 index 0000000..7a34105 Binary files /dev/null and b/asset/icon/Icon32/table_edit.png differ diff --git a/asset/icon/Icon32/table_error.png b/asset/icon/Icon32/table_error.png new file mode 100644 index 0000000..f73e2d5 Binary files /dev/null and b/asset/icon/Icon32/table_error.png differ diff --git a/asset/icon/Icon32/table_excel.png b/asset/icon/Icon32/table_excel.png new file mode 100644 index 0000000..b247758 Binary files /dev/null and b/asset/icon/Icon32/table_excel.png differ diff --git a/asset/icon/Icon32/table_export.png b/asset/icon/Icon32/table_export.png new file mode 100644 index 0000000..a96837e Binary files /dev/null and b/asset/icon/Icon32/table_export.png differ diff --git a/asset/icon/Icon32/table_filter.png b/asset/icon/Icon32/table_filter.png new file mode 100644 index 0000000..6927563 Binary files /dev/null and b/asset/icon/Icon32/table_filter.png differ diff --git a/asset/icon/Icon32/table_format.png b/asset/icon/Icon32/table_format.png new file mode 100644 index 0000000..2f56cdd Binary files /dev/null and b/asset/icon/Icon32/table_format.png differ diff --git a/asset/icon/Icon32/table_gear.png b/asset/icon/Icon32/table_gear.png new file mode 100644 index 0000000..ea40754 Binary files /dev/null and b/asset/icon/Icon32/table_gear.png differ diff --git a/asset/icon/Icon32/table_go.png b/asset/icon/Icon32/table_go.png new file mode 100644 index 0000000..b1946be Binary files /dev/null and b/asset/icon/Icon32/table_go.png differ diff --git a/asset/icon/Icon32/table_heatmap(2).png b/asset/icon/Icon32/table_heatmap(2).png new file mode 100644 index 0000000..cd564b5 Binary files /dev/null and b/asset/icon/Icon32/table_heatmap(2).png differ diff --git a/asset/icon/Icon32/table_heatmap.png b/asset/icon/Icon32/table_heatmap.png new file mode 100644 index 0000000..79e23df Binary files /dev/null and b/asset/icon/Icon32/table_heatmap.png differ diff --git a/asset/icon/Icon32/table_import.png b/asset/icon/Icon32/table_import.png new file mode 100644 index 0000000..5c25fad Binary files /dev/null and b/asset/icon/Icon32/table_import.png differ diff --git a/asset/icon/Icon32/table_insert.png b/asset/icon/Icon32/table_insert.png new file mode 100644 index 0000000..4ccc2ab Binary files /dev/null and b/asset/icon/Icon32/table_insert.png differ diff --git a/asset/icon/Icon32/table_key.png b/asset/icon/Icon32/table_key.png new file mode 100644 index 0000000..5d368d8 Binary files /dev/null and b/asset/icon/Icon32/table_key.png differ diff --git a/asset/icon/Icon32/table_lightning.png b/asset/icon/Icon32/table_lightning.png new file mode 100644 index 0000000..8ae5e42 Binary files /dev/null and b/asset/icon/Icon32/table_lightning.png differ diff --git a/asset/icon/Icon32/table_link.png b/asset/icon/Icon32/table_link.png new file mode 100644 index 0000000..b346953 Binary files /dev/null and b/asset/icon/Icon32/table_link.png differ diff --git a/asset/icon/Icon32/table_money.png b/asset/icon/Icon32/table_money.png new file mode 100644 index 0000000..24a7fe2 Binary files /dev/null and b/asset/icon/Icon32/table_money.png differ diff --git a/asset/icon/Icon32/table_multiple.png b/asset/icon/Icon32/table_multiple.png new file mode 100644 index 0000000..9f99fab Binary files /dev/null and b/asset/icon/Icon32/table_multiple.png differ diff --git a/asset/icon/Icon32/table_paint_can.png b/asset/icon/Icon32/table_paint_can.png new file mode 100644 index 0000000..3ca9c88 Binary files /dev/null and b/asset/icon/Icon32/table_paint_can.png differ diff --git a/asset/icon/Icon32/table_refresh.png b/asset/icon/Icon32/table_refresh.png new file mode 100644 index 0000000..25083fe Binary files /dev/null and b/asset/icon/Icon32/table_refresh.png differ diff --git a/asset/icon/Icon32/table_relationship.png b/asset/icon/Icon32/table_relationship.png new file mode 100644 index 0000000..c4dec9b Binary files /dev/null and b/asset/icon/Icon32/table_relationship.png differ diff --git a/asset/icon/Icon32/table_replace.png b/asset/icon/Icon32/table_replace.png new file mode 100644 index 0000000..0330ed2 Binary files /dev/null and b/asset/icon/Icon32/table_replace.png differ diff --git a/asset/icon/Icon32/table_row_delete.png b/asset/icon/Icon32/table_row_delete.png new file mode 100644 index 0000000..e70cd65 Binary files /dev/null and b/asset/icon/Icon32/table_row_delete.png differ diff --git a/asset/icon/Icon32/table_row_insert.png b/asset/icon/Icon32/table_row_insert.png new file mode 100644 index 0000000..2a08d68 Binary files /dev/null and b/asset/icon/Icon32/table_row_insert.png differ diff --git a/asset/icon/Icon32/table_save.png b/asset/icon/Icon32/table_save.png new file mode 100644 index 0000000..0440ef9 Binary files /dev/null and b/asset/icon/Icon32/table_save.png differ diff --git a/asset/icon/Icon32/table_select(2).png b/asset/icon/Icon32/table_select(2).png new file mode 100644 index 0000000..788c47d Binary files /dev/null and b/asset/icon/Icon32/table_select(2).png differ diff --git a/asset/icon/Icon32/table_select.png b/asset/icon/Icon32/table_select.png new file mode 100644 index 0000000..7a3f7c1 Binary files /dev/null and b/asset/icon/Icon32/table_select.png differ diff --git a/asset/icon/Icon32/table_select_all.png b/asset/icon/Icon32/table_select_all.png new file mode 100644 index 0000000..c290d09 Binary files /dev/null and b/asset/icon/Icon32/table_select_all.png differ diff --git a/asset/icon/Icon32/table_select_column.png b/asset/icon/Icon32/table_select_column.png new file mode 100644 index 0000000..95a7159 Binary files /dev/null and b/asset/icon/Icon32/table_select_column.png differ diff --git a/asset/icon/Icon32/table_select_row.png b/asset/icon/Icon32/table_select_row.png new file mode 100644 index 0000000..7ae3980 Binary files /dev/null and b/asset/icon/Icon32/table_select_row.png differ diff --git a/asset/icon/Icon32/table_sheet.png b/asset/icon/Icon32/table_sheet.png new file mode 100644 index 0000000..2e22292 Binary files /dev/null and b/asset/icon/Icon32/table_sheet.png differ diff --git a/asset/icon/Icon32/table_sort.png b/asset/icon/Icon32/table_sort.png new file mode 100644 index 0000000..f4a5eff Binary files /dev/null and b/asset/icon/Icon32/table_sort.png differ diff --git a/asset/icon/Icon32/table_sort_filter.png b/asset/icon/Icon32/table_sort_filter.png new file mode 100644 index 0000000..0d01294 Binary files /dev/null and b/asset/icon/Icon32/table_sort_filter.png differ diff --git a/asset/icon/Icon32/table_split.png b/asset/icon/Icon32/table_split.png new file mode 100644 index 0000000..fd59ca4 Binary files /dev/null and b/asset/icon/Icon32/table_split.png differ diff --git a/asset/icon/Icon32/table_sum.png b/asset/icon/Icon32/table_sum.png new file mode 100644 index 0000000..eb1831e Binary files /dev/null and b/asset/icon/Icon32/table_sum.png differ diff --git a/asset/icon/Icon32/table_tab.png b/asset/icon/Icon32/table_tab.png new file mode 100644 index 0000000..664c837 Binary files /dev/null and b/asset/icon/Icon32/table_tab.png differ diff --git a/asset/icon/Icon32/table_tab_resize.png b/asset/icon/Icon32/table_tab_resize.png new file mode 100644 index 0000000..ce47153 Binary files /dev/null and b/asset/icon/Icon32/table_tab_resize.png differ diff --git a/asset/icon/Icon32/table_tab_search.png b/asset/icon/Icon32/table_tab_search.png new file mode 100644 index 0000000..879d57c Binary files /dev/null and b/asset/icon/Icon32/table_tab_search.png differ diff --git a/asset/icon/Icon32/table_torn.png b/asset/icon/Icon32/table_torn.png new file mode 100644 index 0000000..442558b Binary files /dev/null and b/asset/icon/Icon32/table_torn.png differ diff --git a/asset/icon/Icon32/tablets.png b/asset/icon/Icon32/tablets.png new file mode 100644 index 0000000..86df613 Binary files /dev/null and b/asset/icon/Icon32/tablets.png differ diff --git a/asset/icon/Icon32/tabnavigator.png b/asset/icon/Icon32/tabnavigator.png new file mode 100644 index 0000000..c50b6c3 Binary files /dev/null and b/asset/icon/Icon32/tabnavigator.png differ diff --git a/asset/icon/Icon32/tag.png b/asset/icon/Icon32/tag.png new file mode 100644 index 0000000..0e05509 Binary files /dev/null and b/asset/icon/Icon32/tag.png differ diff --git a/asset/icon/Icon32/tag_blue.png b/asset/icon/Icon32/tag_blue.png new file mode 100644 index 0000000..f2ef7dd Binary files /dev/null and b/asset/icon/Icon32/tag_blue.png differ diff --git a/asset/icon/Icon32/tag_blue_add.png b/asset/icon/Icon32/tag_blue_add.png new file mode 100644 index 0000000..f924983 Binary files /dev/null and b/asset/icon/Icon32/tag_blue_add.png differ diff --git a/asset/icon/Icon32/tag_blue_delete.png b/asset/icon/Icon32/tag_blue_delete.png new file mode 100644 index 0000000..f3bf9e6 Binary files /dev/null and b/asset/icon/Icon32/tag_blue_delete.png differ diff --git a/asset/icon/Icon32/tag_blue_edit.png b/asset/icon/Icon32/tag_blue_edit.png new file mode 100644 index 0000000..e839eb4 Binary files /dev/null and b/asset/icon/Icon32/tag_blue_edit.png differ diff --git a/asset/icon/Icon32/tag_green.png b/asset/icon/Icon32/tag_green.png new file mode 100644 index 0000000..8de8fea Binary files /dev/null and b/asset/icon/Icon32/tag_green.png differ diff --git a/asset/icon/Icon32/tag_hash.png b/asset/icon/Icon32/tag_hash.png new file mode 100644 index 0000000..d33340f Binary files /dev/null and b/asset/icon/Icon32/tag_hash.png differ diff --git a/asset/icon/Icon32/tag_orange.png b/asset/icon/Icon32/tag_orange.png new file mode 100644 index 0000000..a86ba0a Binary files /dev/null and b/asset/icon/Icon32/tag_orange.png differ diff --git a/asset/icon/Icon32/tag_pink.png b/asset/icon/Icon32/tag_pink.png new file mode 100644 index 0000000..29bcdbe Binary files /dev/null and b/asset/icon/Icon32/tag_pink.png differ diff --git a/asset/icon/Icon32/tag_purple.png b/asset/icon/Icon32/tag_purple.png new file mode 100644 index 0000000..d079720 Binary files /dev/null and b/asset/icon/Icon32/tag_purple.png differ diff --git a/asset/icon/Icon32/tag_red.png b/asset/icon/Icon32/tag_red.png new file mode 100644 index 0000000..d68ace2 Binary files /dev/null and b/asset/icon/Icon32/tag_red.png differ diff --git a/asset/icon/Icon32/tag_yellow.png b/asset/icon/Icon32/tag_yellow.png new file mode 100644 index 0000000..55329cb Binary files /dev/null and b/asset/icon/Icon32/tag_yellow.png differ diff --git a/asset/icon/Icon32/tags_cloud.png b/asset/icon/Icon32/tags_cloud.png new file mode 100644 index 0000000..9c62dae Binary files /dev/null and b/asset/icon/Icon32/tags_cloud.png differ diff --git a/asset/icon/Icon32/tea_cup.png b/asset/icon/Icon32/tea_cup.png new file mode 100644 index 0000000..69f4b8c Binary files /dev/null and b/asset/icon/Icon32/tea_cup.png differ diff --git a/asset/icon/Icon32/teapot.png b/asset/icon/Icon32/teapot.png new file mode 100644 index 0000000..a55d49e Binary files /dev/null and b/asset/icon/Icon32/teapot.png differ diff --git a/asset/icon/Icon32/technorati.png b/asset/icon/Icon32/technorati.png new file mode 100644 index 0000000..9b94aaf Binary files /dev/null and b/asset/icon/Icon32/technorati.png differ diff --git a/asset/icon/Icon32/teddy_bear.png b/asset/icon/Icon32/teddy_bear.png new file mode 100644 index 0000000..c25936e Binary files /dev/null and b/asset/icon/Icon32/teddy_bear.png differ diff --git a/asset/icon/Icon32/telephone.png b/asset/icon/Icon32/telephone.png new file mode 100644 index 0000000..f4dd39c Binary files /dev/null and b/asset/icon/Icon32/telephone.png differ diff --git a/asset/icon/Icon32/telephone_add.png b/asset/icon/Icon32/telephone_add.png new file mode 100644 index 0000000..5086dd2 Binary files /dev/null and b/asset/icon/Icon32/telephone_add.png differ diff --git a/asset/icon/Icon32/telephone_delete.png b/asset/icon/Icon32/telephone_delete.png new file mode 100644 index 0000000..222050d Binary files /dev/null and b/asset/icon/Icon32/telephone_delete.png differ diff --git a/asset/icon/Icon32/telephone_edit.png b/asset/icon/Icon32/telephone_edit.png new file mode 100644 index 0000000..c58ba36 Binary files /dev/null and b/asset/icon/Icon32/telephone_edit.png differ diff --git a/asset/icon/Icon32/telephone_error.png b/asset/icon/Icon32/telephone_error.png new file mode 100644 index 0000000..2ac9dd6 Binary files /dev/null and b/asset/icon/Icon32/telephone_error.png differ diff --git a/asset/icon/Icon32/telephone_go.png b/asset/icon/Icon32/telephone_go.png new file mode 100644 index 0000000..3ffb2fe Binary files /dev/null and b/asset/icon/Icon32/telephone_go.png differ diff --git a/asset/icon/Icon32/telephone_key.png b/asset/icon/Icon32/telephone_key.png new file mode 100644 index 0000000..01e2710 Binary files /dev/null and b/asset/icon/Icon32/telephone_key.png differ diff --git a/asset/icon/Icon32/telephone_link.png b/asset/icon/Icon32/telephone_link.png new file mode 100644 index 0000000..ba1f3d2 Binary files /dev/null and b/asset/icon/Icon32/telephone_link.png differ diff --git a/asset/icon/Icon32/telephone_off.png b/asset/icon/Icon32/telephone_off.png new file mode 100644 index 0000000..0300999 Binary files /dev/null and b/asset/icon/Icon32/telephone_off.png differ diff --git a/asset/icon/Icon32/television.png b/asset/icon/Icon32/television.png new file mode 100644 index 0000000..4011633 Binary files /dev/null and b/asset/icon/Icon32/television.png differ diff --git a/asset/icon/Icon32/television_add.png b/asset/icon/Icon32/television_add.png new file mode 100644 index 0000000..4914ccb Binary files /dev/null and b/asset/icon/Icon32/television_add.png differ diff --git a/asset/icon/Icon32/television_delete.png b/asset/icon/Icon32/television_delete.png new file mode 100644 index 0000000..b855fb4 Binary files /dev/null and b/asset/icon/Icon32/television_delete.png differ diff --git a/asset/icon/Icon32/temperature_1.png b/asset/icon/Icon32/temperature_1.png new file mode 100644 index 0000000..ddc776b Binary files /dev/null and b/asset/icon/Icon32/temperature_1.png differ diff --git a/asset/icon/Icon32/temperature_2.png b/asset/icon/Icon32/temperature_2.png new file mode 100644 index 0000000..1a42003 Binary files /dev/null and b/asset/icon/Icon32/temperature_2.png differ diff --git a/asset/icon/Icon32/temperature_3.png b/asset/icon/Icon32/temperature_3.png new file mode 100644 index 0000000..a2d5584 Binary files /dev/null and b/asset/icon/Icon32/temperature_3.png differ diff --git a/asset/icon/Icon32/temperature_4.png b/asset/icon/Icon32/temperature_4.png new file mode 100644 index 0000000..b0466bd Binary files /dev/null and b/asset/icon/Icon32/temperature_4.png differ diff --git a/asset/icon/Icon32/temperature_5.png b/asset/icon/Icon32/temperature_5.png new file mode 100644 index 0000000..182f72f Binary files /dev/null and b/asset/icon/Icon32/temperature_5.png differ diff --git a/asset/icon/Icon32/terminal.png b/asset/icon/Icon32/terminal.png new file mode 100644 index 0000000..73a4e6f Binary files /dev/null and b/asset/icon/Icon32/terminal.png differ diff --git a/asset/icon/Icon32/terminal_seats_blue.png b/asset/icon/Icon32/terminal_seats_blue.png new file mode 100644 index 0000000..66f1bed Binary files /dev/null and b/asset/icon/Icon32/terminal_seats_blue.png differ diff --git a/asset/icon/Icon32/terminal_seats_red.png b/asset/icon/Icon32/terminal_seats_red.png new file mode 100644 index 0000000..b78607c Binary files /dev/null and b/asset/icon/Icon32/terminal_seats_red.png differ diff --git a/asset/icon/Icon32/text.png b/asset/icon/Icon32/text.png new file mode 100644 index 0000000..e5be01e Binary files /dev/null and b/asset/icon/Icon32/text.png differ diff --git a/asset/icon/Icon32/text_add.png b/asset/icon/Icon32/text_add.png new file mode 100644 index 0000000..a44c97a Binary files /dev/null and b/asset/icon/Icon32/text_add.png differ diff --git a/asset/icon/Icon32/text_align_center.png b/asset/icon/Icon32/text_align_center.png new file mode 100644 index 0000000..6166570 Binary files /dev/null and b/asset/icon/Icon32/text_align_center.png differ diff --git a/asset/icon/Icon32/text_align_justity.png b/asset/icon/Icon32/text_align_justity.png new file mode 100644 index 0000000..7db7b98 Binary files /dev/null and b/asset/icon/Icon32/text_align_justity.png differ diff --git a/asset/icon/Icon32/text_align_left.png b/asset/icon/Icon32/text_align_left.png new file mode 100644 index 0000000..6b9edb4 Binary files /dev/null and b/asset/icon/Icon32/text_align_left.png differ diff --git a/asset/icon/Icon32/text_align_right.png b/asset/icon/Icon32/text_align_right.png new file mode 100644 index 0000000..a021bdc Binary files /dev/null and b/asset/icon/Icon32/text_align_right.png differ diff --git a/asset/icon/Icon32/text_allcaps.png b/asset/icon/Icon32/text_allcaps.png new file mode 100644 index 0000000..6cbb210 Binary files /dev/null and b/asset/icon/Icon32/text_allcaps.png differ diff --git a/asset/icon/Icon32/text_area(2).png b/asset/icon/Icon32/text_area(2).png new file mode 100644 index 0000000..608d550 Binary files /dev/null and b/asset/icon/Icon32/text_area(2).png differ diff --git a/asset/icon/Icon32/text_area.png b/asset/icon/Icon32/text_area.png new file mode 100644 index 0000000..f248384 Binary files /dev/null and b/asset/icon/Icon32/text_area.png differ diff --git a/asset/icon/Icon32/text_bold.png b/asset/icon/Icon32/text_bold.png new file mode 100644 index 0000000..9acc46c Binary files /dev/null and b/asset/icon/Icon32/text_bold.png differ diff --git a/asset/icon/Icon32/text_columns.png b/asset/icon/Icon32/text_columns.png new file mode 100644 index 0000000..148fd33 Binary files /dev/null and b/asset/icon/Icon32/text_columns.png differ diff --git a/asset/icon/Icon32/text_document.png b/asset/icon/Icon32/text_document.png new file mode 100644 index 0000000..da86f0c Binary files /dev/null and b/asset/icon/Icon32/text_document.png differ diff --git a/asset/icon/Icon32/text_document_wrap.png b/asset/icon/Icon32/text_document_wrap.png new file mode 100644 index 0000000..b0248b1 Binary files /dev/null and b/asset/icon/Icon32/text_document_wrap.png differ diff --git a/asset/icon/Icon32/text_drama.png b/asset/icon/Icon32/text_drama.png new file mode 100644 index 0000000..b064e17 Binary files /dev/null and b/asset/icon/Icon32/text_drama.png differ diff --git a/asset/icon/Icon32/text_dropcaps.png b/asset/icon/Icon32/text_dropcaps.png new file mode 100644 index 0000000..5aa1fa3 Binary files /dev/null and b/asset/icon/Icon32/text_dropcaps.png differ diff --git a/asset/icon/Icon32/text_effects.png b/asset/icon/Icon32/text_effects.png new file mode 100644 index 0000000..af306c4 Binary files /dev/null and b/asset/icon/Icon32/text_effects.png differ diff --git a/asset/icon/Icon32/text_exports.png b/asset/icon/Icon32/text_exports.png new file mode 100644 index 0000000..ba28896 Binary files /dev/null and b/asset/icon/Icon32/text_exports.png differ diff --git a/asset/icon/Icon32/text_functions.png b/asset/icon/Icon32/text_functions.png new file mode 100644 index 0000000..197fc86 Binary files /dev/null and b/asset/icon/Icon32/text_functions.png differ diff --git a/asset/icon/Icon32/text_heading_1.png b/asset/icon/Icon32/text_heading_1.png new file mode 100644 index 0000000..970acb7 Binary files /dev/null and b/asset/icon/Icon32/text_heading_1.png differ diff --git a/asset/icon/Icon32/text_heading_2.png b/asset/icon/Icon32/text_heading_2.png new file mode 100644 index 0000000..ed5717c Binary files /dev/null and b/asset/icon/Icon32/text_heading_2.png differ diff --git a/asset/icon/Icon32/text_heading_3.png b/asset/icon/Icon32/text_heading_3.png new file mode 100644 index 0000000..8dc94ab Binary files /dev/null and b/asset/icon/Icon32/text_heading_3.png differ diff --git a/asset/icon/Icon32/text_heading_4.png b/asset/icon/Icon32/text_heading_4.png new file mode 100644 index 0000000..9e99b49 Binary files /dev/null and b/asset/icon/Icon32/text_heading_4.png differ diff --git a/asset/icon/Icon32/text_heading_5.png b/asset/icon/Icon32/text_heading_5.png new file mode 100644 index 0000000..2d87f3d Binary files /dev/null and b/asset/icon/Icon32/text_heading_5.png differ diff --git a/asset/icon/Icon32/text_heading_6.png b/asset/icon/Icon32/text_heading_6.png new file mode 100644 index 0000000..c58becf Binary files /dev/null and b/asset/icon/Icon32/text_heading_6.png differ diff --git a/asset/icon/Icon32/text_horizontalrule.png b/asset/icon/Icon32/text_horizontalrule.png new file mode 100644 index 0000000..7f99b4e Binary files /dev/null and b/asset/icon/Icon32/text_horizontalrule.png differ diff --git a/asset/icon/Icon32/text_imports.png b/asset/icon/Icon32/text_imports.png new file mode 100644 index 0000000..882661f Binary files /dev/null and b/asset/icon/Icon32/text_imports.png differ diff --git a/asset/icon/Icon32/text_indent.png b/asset/icon/Icon32/text_indent.png new file mode 100644 index 0000000..837c465 Binary files /dev/null and b/asset/icon/Icon32/text_indent.png differ diff --git a/asset/icon/Icon32/text_indent_remove.png b/asset/icon/Icon32/text_indent_remove.png new file mode 100644 index 0000000..e263c8a Binary files /dev/null and b/asset/icon/Icon32/text_indent_remove.png differ diff --git a/asset/icon/Icon32/text_italic.png b/asset/icon/Icon32/text_italic.png new file mode 100644 index 0000000..8da7283 Binary files /dev/null and b/asset/icon/Icon32/text_italic.png differ diff --git a/asset/icon/Icon32/text_kerning.png b/asset/icon/Icon32/text_kerning.png new file mode 100644 index 0000000..973e591 Binary files /dev/null and b/asset/icon/Icon32/text_kerning.png differ diff --git a/asset/icon/Icon32/text_language.png b/asset/icon/Icon32/text_language.png new file mode 100644 index 0000000..cff58cd Binary files /dev/null and b/asset/icon/Icon32/text_language.png differ diff --git a/asset/icon/Icon32/text_large_cap.png b/asset/icon/Icon32/text_large_cap.png new file mode 100644 index 0000000..be2eccf Binary files /dev/null and b/asset/icon/Icon32/text_large_cap.png differ diff --git a/asset/icon/Icon32/text_letter_omega.png b/asset/icon/Icon32/text_letter_omega.png new file mode 100644 index 0000000..701bef7 Binary files /dev/null and b/asset/icon/Icon32/text_letter_omega.png differ diff --git a/asset/icon/Icon32/text_letterspacing.png b/asset/icon/Icon32/text_letterspacing.png new file mode 100644 index 0000000..5256dd5 Binary files /dev/null and b/asset/icon/Icon32/text_letterspacing.png differ diff --git a/asset/icon/Icon32/text_linespacing.png b/asset/icon/Icon32/text_linespacing.png new file mode 100644 index 0000000..9790663 Binary files /dev/null and b/asset/icon/Icon32/text_linespacing.png differ diff --git a/asset/icon/Icon32/text_list_bullets.png b/asset/icon/Icon32/text_list_bullets.png new file mode 100644 index 0000000..b994525 Binary files /dev/null and b/asset/icon/Icon32/text_list_bullets.png differ diff --git a/asset/icon/Icon32/text_list_numbers.png b/asset/icon/Icon32/text_list_numbers.png new file mode 100644 index 0000000..0b95bee Binary files /dev/null and b/asset/icon/Icon32/text_list_numbers.png differ diff --git a/asset/icon/Icon32/text_lowercase.png b/asset/icon/Icon32/text_lowercase.png new file mode 100644 index 0000000..cb5c1e0 Binary files /dev/null and b/asset/icon/Icon32/text_lowercase.png differ diff --git a/asset/icon/Icon32/text_move.png b/asset/icon/Icon32/text_move.png new file mode 100644 index 0000000..4ec574b Binary files /dev/null and b/asset/icon/Icon32/text_move.png differ diff --git a/asset/icon/Icon32/text_padding_bottom.png b/asset/icon/Icon32/text_padding_bottom.png new file mode 100644 index 0000000..8ce2171 Binary files /dev/null and b/asset/icon/Icon32/text_padding_bottom.png differ diff --git a/asset/icon/Icon32/text_padding_left.png b/asset/icon/Icon32/text_padding_left.png new file mode 100644 index 0000000..bb61940 Binary files /dev/null and b/asset/icon/Icon32/text_padding_left.png differ diff --git a/asset/icon/Icon32/text_padding_right.png b/asset/icon/Icon32/text_padding_right.png new file mode 100644 index 0000000..a98bf6e Binary files /dev/null and b/asset/icon/Icon32/text_padding_right.png differ diff --git a/asset/icon/Icon32/text_padding_top.png b/asset/icon/Icon32/text_padding_top.png new file mode 100644 index 0000000..775fed3 Binary files /dev/null and b/asset/icon/Icon32/text_padding_top.png differ diff --git a/asset/icon/Icon32/text_pagination.png b/asset/icon/Icon32/text_pagination.png new file mode 100644 index 0000000..47e244f Binary files /dev/null and b/asset/icon/Icon32/text_pagination.png differ diff --git a/asset/icon/Icon32/text_pagination_100.png b/asset/icon/Icon32/text_pagination_100.png new file mode 100644 index 0000000..1b9c5c0 Binary files /dev/null and b/asset/icon/Icon32/text_pagination_100.png differ diff --git a/asset/icon/Icon32/text_position_slide.png b/asset/icon/Icon32/text_position_slide.png new file mode 100644 index 0000000..e2fc856 Binary files /dev/null and b/asset/icon/Icon32/text_position_slide.png differ diff --git a/asset/icon/Icon32/text_prose.png b/asset/icon/Icon32/text_prose.png new file mode 100644 index 0000000..341a03b Binary files /dev/null and b/asset/icon/Icon32/text_prose.png differ diff --git a/asset/icon/Icon32/text_replace.png b/asset/icon/Icon32/text_replace.png new file mode 100644 index 0000000..5bdfcb1 Binary files /dev/null and b/asset/icon/Icon32/text_replace.png differ diff --git a/asset/icon/Icon32/text_resize.png b/asset/icon/Icon32/text_resize.png new file mode 100644 index 0000000..4276f64 Binary files /dev/null and b/asset/icon/Icon32/text_resize.png differ diff --git a/asset/icon/Icon32/text_rotate.png b/asset/icon/Icon32/text_rotate.png new file mode 100644 index 0000000..ef48ba5 Binary files /dev/null and b/asset/icon/Icon32/text_rotate.png differ diff --git a/asset/icon/Icon32/text_signature.png b/asset/icon/Icon32/text_signature.png new file mode 100644 index 0000000..4147984 Binary files /dev/null and b/asset/icon/Icon32/text_signature.png differ diff --git a/asset/icon/Icon32/text_smallcaps.png b/asset/icon/Icon32/text_smallcaps.png new file mode 100644 index 0000000..7c3d7f6 Binary files /dev/null and b/asset/icon/Icon32/text_smallcaps.png differ diff --git a/asset/icon/Icon32/text_strikethroungh.png b/asset/icon/Icon32/text_strikethroungh.png new file mode 100644 index 0000000..38625f8 Binary files /dev/null and b/asset/icon/Icon32/text_strikethroungh.png differ diff --git a/asset/icon/Icon32/text_subscript.png b/asset/icon/Icon32/text_subscript.png new file mode 100644 index 0000000..75b001f Binary files /dev/null and b/asset/icon/Icon32/text_subscript.png differ diff --git a/asset/icon/Icon32/text_superscript.png b/asset/icon/Icon32/text_superscript.png new file mode 100644 index 0000000..181905a Binary files /dev/null and b/asset/icon/Icon32/text_superscript.png differ diff --git a/asset/icon/Icon32/text_underline.png b/asset/icon/Icon32/text_underline.png new file mode 100644 index 0000000..264a981 Binary files /dev/null and b/asset/icon/Icon32/text_underline.png differ diff --git a/asset/icon/Icon32/text_uppercase.png b/asset/icon/Icon32/text_uppercase.png new file mode 100644 index 0000000..f963d4e Binary files /dev/null and b/asset/icon/Icon32/text_uppercase.png differ diff --git a/asset/icon/Icon32/text_width.png b/asset/icon/Icon32/text_width.png new file mode 100644 index 0000000..05e2399 Binary files /dev/null and b/asset/icon/Icon32/text_width.png differ diff --git a/asset/icon/Icon32/textfield.png b/asset/icon/Icon32/textfield.png new file mode 100644 index 0000000..dc0b32e Binary files /dev/null and b/asset/icon/Icon32/textfield.png differ diff --git a/asset/icon/Icon32/textfield_add.png b/asset/icon/Icon32/textfield_add.png new file mode 100644 index 0000000..a89befa Binary files /dev/null and b/asset/icon/Icon32/textfield_add.png differ diff --git a/asset/icon/Icon32/textfield_clear.png b/asset/icon/Icon32/textfield_clear.png new file mode 100644 index 0000000..c75611c Binary files /dev/null and b/asset/icon/Icon32/textfield_clear.png differ diff --git a/asset/icon/Icon32/textfield_delete.png b/asset/icon/Icon32/textfield_delete.png new file mode 100644 index 0000000..1b0e5b4 Binary files /dev/null and b/asset/icon/Icon32/textfield_delete.png differ diff --git a/asset/icon/Icon32/textfield_format.png b/asset/icon/Icon32/textfield_format.png new file mode 100644 index 0000000..94acde5 Binary files /dev/null and b/asset/icon/Icon32/textfield_format.png differ diff --git a/asset/icon/Icon32/textfield_hidden.png b/asset/icon/Icon32/textfield_hidden.png new file mode 100644 index 0000000..f38c9f5 Binary files /dev/null and b/asset/icon/Icon32/textfield_hidden.png differ diff --git a/asset/icon/Icon32/textfield_key.png b/asset/icon/Icon32/textfield_key.png new file mode 100644 index 0000000..ef78685 Binary files /dev/null and b/asset/icon/Icon32/textfield_key.png differ diff --git a/asset/icon/Icon32/textfield_password.png b/asset/icon/Icon32/textfield_password.png new file mode 100644 index 0000000..c8de9db Binary files /dev/null and b/asset/icon/Icon32/textfield_password.png differ diff --git a/asset/icon/Icon32/textfield_password_green.png b/asset/icon/Icon32/textfield_password_green.png new file mode 100644 index 0000000..7aaff96 Binary files /dev/null and b/asset/icon/Icon32/textfield_password_green.png differ diff --git a/asset/icon/Icon32/textfield_password_red.png b/asset/icon/Icon32/textfield_password_red.png new file mode 100644 index 0000000..304e4ec Binary files /dev/null and b/asset/icon/Icon32/textfield_password_red.png differ diff --git a/asset/icon/Icon32/textfield_password_yellow.png b/asset/icon/Icon32/textfield_password_yellow.png new file mode 100644 index 0000000..fb50656 Binary files /dev/null and b/asset/icon/Icon32/textfield_password_yellow.png differ diff --git a/asset/icon/Icon32/textfield_rename.png b/asset/icon/Icon32/textfield_rename.png new file mode 100644 index 0000000..d35927f Binary files /dev/null and b/asset/icon/Icon32/textfield_rename.png differ diff --git a/asset/icon/Icon32/textfield_suggestion.png b/asset/icon/Icon32/textfield_suggestion.png new file mode 100644 index 0000000..8507f85 Binary files /dev/null and b/asset/icon/Icon32/textfield_suggestion.png differ diff --git a/asset/icon/Icon32/theater.png b/asset/icon/Icon32/theater.png new file mode 100644 index 0000000..002c734 Binary files /dev/null and b/asset/icon/Icon32/theater.png differ diff --git a/asset/icon/Icon32/things_beauty.png b/asset/icon/Icon32/things_beauty.png new file mode 100644 index 0000000..e52333d Binary files /dev/null and b/asset/icon/Icon32/things_beauty.png differ diff --git a/asset/icon/Icon32/things_digital.png b/asset/icon/Icon32/things_digital.png new file mode 100644 index 0000000..7292047 Binary files /dev/null and b/asset/icon/Icon32/things_digital.png differ diff --git a/asset/icon/Icon32/three_tags.png b/asset/icon/Icon32/three_tags.png new file mode 100644 index 0000000..8320169 Binary files /dev/null and b/asset/icon/Icon32/three_tags.png differ diff --git a/asset/icon/Icon32/thumb_down.png b/asset/icon/Icon32/thumb_down.png new file mode 100644 index 0000000..b63977f Binary files /dev/null and b/asset/icon/Icon32/thumb_down.png differ diff --git a/asset/icon/Icon32/thumb_up.png b/asset/icon/Icon32/thumb_up.png new file mode 100644 index 0000000..4800c05 Binary files /dev/null and b/asset/icon/Icon32/thumb_up.png differ diff --git a/asset/icon/Icon32/tick.png b/asset/icon/Icon32/tick.png new file mode 100644 index 0000000..71be0f6 Binary files /dev/null and b/asset/icon/Icon32/tick.png differ diff --git a/asset/icon/Icon32/tick_button.png b/asset/icon/Icon32/tick_button.png new file mode 100644 index 0000000..b1a3be2 Binary files /dev/null and b/asset/icon/Icon32/tick_button.png differ diff --git a/asset/icon/Icon32/tick_circle_frame.png b/asset/icon/Icon32/tick_circle_frame.png new file mode 100644 index 0000000..a1c080a Binary files /dev/null and b/asset/icon/Icon32/tick_circle_frame.png differ diff --git a/asset/icon/Icon32/tick_light_blue.png b/asset/icon/Icon32/tick_light_blue.png new file mode 100644 index 0000000..a7cff82 Binary files /dev/null and b/asset/icon/Icon32/tick_light_blue.png differ diff --git a/asset/icon/Icon32/tick_octagon.png b/asset/icon/Icon32/tick_octagon.png new file mode 100644 index 0000000..073626e Binary files /dev/null and b/asset/icon/Icon32/tick_octagon.png differ diff --git a/asset/icon/Icon32/tick_octagon_frame.png b/asset/icon/Icon32/tick_octagon_frame.png new file mode 100644 index 0000000..aec0ded Binary files /dev/null and b/asset/icon/Icon32/tick_octagon_frame.png differ diff --git a/asset/icon/Icon32/tick_red.png b/asset/icon/Icon32/tick_red.png new file mode 100644 index 0000000..ebec467 Binary files /dev/null and b/asset/icon/Icon32/tick_red.png differ diff --git a/asset/icon/Icon32/tick_shield.png b/asset/icon/Icon32/tick_shield.png new file mode 100644 index 0000000..af7b302 Binary files /dev/null and b/asset/icon/Icon32/tick_shield.png differ diff --git a/asset/icon/Icon32/ticket_stub.png b/asset/icon/Icon32/ticket_stub.png new file mode 100644 index 0000000..5d3b3bc Binary files /dev/null and b/asset/icon/Icon32/ticket_stub.png differ diff --git a/asset/icon/Icon32/tie.png b/asset/icon/Icon32/tie.png new file mode 100644 index 0000000..b25ac60 Binary files /dev/null and b/asset/icon/Icon32/tie.png differ diff --git a/asset/icon/Icon32/tilelist.png b/asset/icon/Icon32/tilelist.png new file mode 100644 index 0000000..fad3394 Binary files /dev/null and b/asset/icon/Icon32/tilelist.png differ diff --git a/asset/icon/Icon32/time.png b/asset/icon/Icon32/time.png new file mode 100644 index 0000000..1caaec2 Binary files /dev/null and b/asset/icon/Icon32/time.png differ diff --git a/asset/icon/Icon32/time_add.png b/asset/icon/Icon32/time_add.png new file mode 100644 index 0000000..10ba660 Binary files /dev/null and b/asset/icon/Icon32/time_add.png differ diff --git a/asset/icon/Icon32/time_delete.png b/asset/icon/Icon32/time_delete.png new file mode 100644 index 0000000..f744d54 Binary files /dev/null and b/asset/icon/Icon32/time_delete.png differ diff --git a/asset/icon/Icon32/time_go.png b/asset/icon/Icon32/time_go.png new file mode 100644 index 0000000..e0b47c7 Binary files /dev/null and b/asset/icon/Icon32/time_go.png differ diff --git a/asset/icon/Icon32/timeline.png b/asset/icon/Icon32/timeline.png new file mode 100644 index 0000000..eb27b9d Binary files /dev/null and b/asset/icon/Icon32/timeline.png differ diff --git a/asset/icon/Icon32/timeline_marker.png b/asset/icon/Icon32/timeline_marker.png new file mode 100644 index 0000000..9d7c3ab Binary files /dev/null and b/asset/icon/Icon32/timeline_marker.png differ diff --git a/asset/icon/Icon32/tipper.png b/asset/icon/Icon32/tipper.png new file mode 100644 index 0000000..f2b9bcd Binary files /dev/null and b/asset/icon/Icon32/tipper.png differ diff --git a/asset/icon/Icon32/tire.png b/asset/icon/Icon32/tire.png new file mode 100644 index 0000000..bf0f6e8 Binary files /dev/null and b/asset/icon/Icon32/tire.png differ diff --git a/asset/icon/Icon32/title_window.png b/asset/icon/Icon32/title_window.png new file mode 100644 index 0000000..ccde3c3 Binary files /dev/null and b/asset/icon/Icon32/title_window.png differ diff --git a/asset/icon/Icon32/to_do_bar.png b/asset/icon/Icon32/to_do_bar.png new file mode 100644 index 0000000..43554cc Binary files /dev/null and b/asset/icon/Icon32/to_do_bar.png differ diff --git a/asset/icon/Icon32/to_do_list.png b/asset/icon/Icon32/to_do_list.png new file mode 100644 index 0000000..0b4ab11 Binary files /dev/null and b/asset/icon/Icon32/to_do_list.png differ diff --git a/asset/icon/Icon32/to_do_list_cheked_1.png b/asset/icon/Icon32/to_do_list_cheked_1.png new file mode 100644 index 0000000..e0d6504 Binary files /dev/null and b/asset/icon/Icon32/to_do_list_cheked_1.png differ diff --git a/asset/icon/Icon32/to_do_list_cheked_all.png b/asset/icon/Icon32/to_do_list_cheked_all.png new file mode 100644 index 0000000..e1c1843 Binary files /dev/null and b/asset/icon/Icon32/to_do_list_cheked_all.png differ diff --git a/asset/icon/Icon32/toggle.png b/asset/icon/Icon32/toggle.png new file mode 100644 index 0000000..48056b3 Binary files /dev/null and b/asset/icon/Icon32/toggle.png differ diff --git a/asset/icon/Icon32/toggle_expand.png b/asset/icon/Icon32/toggle_expand.png new file mode 100644 index 0000000..6b1d536 Binary files /dev/null and b/asset/icon/Icon32/toggle_expand.png differ diff --git a/asset/icon/Icon32/toilet.png b/asset/icon/Icon32/toilet.png new file mode 100644 index 0000000..68cf020 Binary files /dev/null and b/asset/icon/Icon32/toilet.png differ diff --git a/asset/icon/Icon32/toilet_pan.png b/asset/icon/Icon32/toilet_pan.png new file mode 100644 index 0000000..e231087 Binary files /dev/null and b/asset/icon/Icon32/toilet_pan.png differ diff --git a/asset/icon/Icon32/toolbar.png b/asset/icon/Icon32/toolbar.png new file mode 100644 index 0000000..d348c8b Binary files /dev/null and b/asset/icon/Icon32/toolbar.png differ diff --git a/asset/icon/Icon32/toolbar_add.png b/asset/icon/Icon32/toolbar_add.png new file mode 100644 index 0000000..8f4074b Binary files /dev/null and b/asset/icon/Icon32/toolbar_add.png differ diff --git a/asset/icon/Icon32/toolbar_bookmark.png b/asset/icon/Icon32/toolbar_bookmark.png new file mode 100644 index 0000000..c4e887b Binary files /dev/null and b/asset/icon/Icon32/toolbar_bookmark.png differ diff --git a/asset/icon/Icon32/toolbar_delete.png b/asset/icon/Icon32/toolbar_delete.png new file mode 100644 index 0000000..3052432 Binary files /dev/null and b/asset/icon/Icon32/toolbar_delete.png differ diff --git a/asset/icon/Icon32/toolbar_edit.png b/asset/icon/Icon32/toolbar_edit.png new file mode 100644 index 0000000..5c39a8d Binary files /dev/null and b/asset/icon/Icon32/toolbar_edit.png differ diff --git a/asset/icon/Icon32/toolbar_error.png b/asset/icon/Icon32/toolbar_error.png new file mode 100644 index 0000000..533a74b Binary files /dev/null and b/asset/icon/Icon32/toolbar_error.png differ diff --git a/asset/icon/Icon32/toolbar_go.png b/asset/icon/Icon32/toolbar_go.png new file mode 100644 index 0000000..262b30b Binary files /dev/null and b/asset/icon/Icon32/toolbar_go.png differ diff --git a/asset/icon/Icon32/toolbox.png b/asset/icon/Icon32/toolbox.png new file mode 100644 index 0000000..0950701 Binary files /dev/null and b/asset/icon/Icon32/toolbox.png differ diff --git a/asset/icon/Icon32/tooltip.png b/asset/icon/Icon32/tooltip.png new file mode 100644 index 0000000..8565be8 Binary files /dev/null and b/asset/icon/Icon32/tooltip.png differ diff --git a/asset/icon/Icon32/tooltip_baloon.png b/asset/icon/Icon32/tooltip_baloon.png new file mode 100644 index 0000000..d669587 Binary files /dev/null and b/asset/icon/Icon32/tooltip_baloon.png differ diff --git a/asset/icon/Icon32/tooth.png b/asset/icon/Icon32/tooth.png new file mode 100644 index 0000000..7a310bb Binary files /dev/null and b/asset/icon/Icon32/tooth.png differ diff --git a/asset/icon/Icon32/torchere.png b/asset/icon/Icon32/torchere.png new file mode 100644 index 0000000..6305ee5 Binary files /dev/null and b/asset/icon/Icon32/torchere.png differ diff --git a/asset/icon/Icon32/tornado.png b/asset/icon/Icon32/tornado.png new file mode 100644 index 0000000..c60e94a Binary files /dev/null and b/asset/icon/Icon32/tornado.png differ diff --git a/asset/icon/Icon32/toster.png b/asset/icon/Icon32/toster.png new file mode 100644 index 0000000..8326068 Binary files /dev/null and b/asset/icon/Icon32/toster.png differ diff --git a/asset/icon/Icon32/total_plan_cost.png b/asset/icon/Icon32/total_plan_cost.png new file mode 100644 index 0000000..2b44834 Binary files /dev/null and b/asset/icon/Icon32/total_plan_cost.png differ diff --git a/asset/icon/Icon32/toucan.png b/asset/icon/Icon32/toucan.png new file mode 100644 index 0000000..c66eb75 Binary files /dev/null and b/asset/icon/Icon32/toucan.png differ diff --git a/asset/icon/Icon32/tower.png b/asset/icon/Icon32/tower.png new file mode 100644 index 0000000..055a08f Binary files /dev/null and b/asset/icon/Icon32/tower.png differ diff --git a/asset/icon/Icon32/toxic.png b/asset/icon/Icon32/toxic.png new file mode 100644 index 0000000..05908b1 Binary files /dev/null and b/asset/icon/Icon32/toxic.png differ diff --git a/asset/icon/Icon32/trace_dependents.png b/asset/icon/Icon32/trace_dependents.png new file mode 100644 index 0000000..5ceff85 Binary files /dev/null and b/asset/icon/Icon32/trace_dependents.png differ diff --git a/asset/icon/Icon32/trace_precendents.png b/asset/icon/Icon32/trace_precendents.png new file mode 100644 index 0000000..504aa80 Binary files /dev/null and b/asset/icon/Icon32/trace_precendents.png differ diff --git a/asset/icon/Icon32/track_changes.png b/asset/icon/Icon32/track_changes.png new file mode 100644 index 0000000..93f8aaa Binary files /dev/null and b/asset/icon/Icon32/track_changes.png differ diff --git a/asset/icon/Icon32/tractor.png b/asset/icon/Icon32/tractor.png new file mode 100644 index 0000000..01d5526 Binary files /dev/null and b/asset/icon/Icon32/tractor.png differ diff --git a/asset/icon/Icon32/trade.png b/asset/icon/Icon32/trade.png new file mode 100644 index 0000000..920550a Binary files /dev/null and b/asset/icon/Icon32/trade.png differ diff --git a/asset/icon/Icon32/traffic_lights.png b/asset/icon/Icon32/traffic_lights.png new file mode 100644 index 0000000..c05305b Binary files /dev/null and b/asset/icon/Icon32/traffic_lights.png differ diff --git a/asset/icon/Icon32/traffic_lights_green.png b/asset/icon/Icon32/traffic_lights_green.png new file mode 100644 index 0000000..bd53d89 Binary files /dev/null and b/asset/icon/Icon32/traffic_lights_green.png differ diff --git a/asset/icon/Icon32/traffic_lights_red.png b/asset/icon/Icon32/traffic_lights_red.png new file mode 100644 index 0000000..fd00be2 Binary files /dev/null and b/asset/icon/Icon32/traffic_lights_red.png differ diff --git a/asset/icon/Icon32/traffic_lights_yellow.png b/asset/icon/Icon32/traffic_lights_yellow.png new file mode 100644 index 0000000..54034fc Binary files /dev/null and b/asset/icon/Icon32/traffic_lights_yellow.png differ diff --git a/asset/icon/Icon32/traffic_usage.png b/asset/icon/Icon32/traffic_usage.png new file mode 100644 index 0000000..169fff7 Binary files /dev/null and b/asset/icon/Icon32/traffic_usage.png differ diff --git a/asset/icon/Icon32/train.png b/asset/icon/Icon32/train.png new file mode 100644 index 0000000..4823709 Binary files /dev/null and b/asset/icon/Icon32/train.png differ diff --git a/asset/icon/Icon32/train_metro.png b/asset/icon/Icon32/train_metro.png new file mode 100644 index 0000000..00b226e Binary files /dev/null and b/asset/icon/Icon32/train_metro.png differ diff --git a/asset/icon/Icon32/transform_crop.png b/asset/icon/Icon32/transform_crop.png new file mode 100644 index 0000000..2763117 Binary files /dev/null and b/asset/icon/Icon32/transform_crop.png differ diff --git a/asset/icon/Icon32/transform_crop_resize.png b/asset/icon/Icon32/transform_crop_resize.png new file mode 100644 index 0000000..07024c8 Binary files /dev/null and b/asset/icon/Icon32/transform_crop_resize.png differ diff --git a/asset/icon/Icon32/transform_flip.png b/asset/icon/Icon32/transform_flip.png new file mode 100644 index 0000000..f2f2719 Binary files /dev/null and b/asset/icon/Icon32/transform_flip.png differ diff --git a/asset/icon/Icon32/transform_layer.png b/asset/icon/Icon32/transform_layer.png new file mode 100644 index 0000000..5988490 Binary files /dev/null and b/asset/icon/Icon32/transform_layer.png differ diff --git a/asset/icon/Icon32/transform_move.png b/asset/icon/Icon32/transform_move.png new file mode 100644 index 0000000..2fcdc22 Binary files /dev/null and b/asset/icon/Icon32/transform_move.png differ diff --git a/asset/icon/Icon32/transform_path.png b/asset/icon/Icon32/transform_path.png new file mode 100644 index 0000000..f6fe9e0 Binary files /dev/null and b/asset/icon/Icon32/transform_path.png differ diff --git a/asset/icon/Icon32/transform_perspective.png b/asset/icon/Icon32/transform_perspective.png new file mode 100644 index 0000000..6b9c762 Binary files /dev/null and b/asset/icon/Icon32/transform_perspective.png differ diff --git a/asset/icon/Icon32/transform_rotate.png b/asset/icon/Icon32/transform_rotate.png new file mode 100644 index 0000000..13c29e3 Binary files /dev/null and b/asset/icon/Icon32/transform_rotate.png differ diff --git a/asset/icon/Icon32/transform_rotate_180.png b/asset/icon/Icon32/transform_rotate_180.png new file mode 100644 index 0000000..71d35b6 Binary files /dev/null and b/asset/icon/Icon32/transform_rotate_180.png differ diff --git a/asset/icon/Icon32/transform_rotate_270.png b/asset/icon/Icon32/transform_rotate_270.png new file mode 100644 index 0000000..78bcfb5 Binary files /dev/null and b/asset/icon/Icon32/transform_rotate_270.png differ diff --git a/asset/icon/Icon32/transform_rotate_90.png b/asset/icon/Icon32/transform_rotate_90.png new file mode 100644 index 0000000..4917321 Binary files /dev/null and b/asset/icon/Icon32/transform_rotate_90.png differ diff --git a/asset/icon/Icon32/transform_scale.png b/asset/icon/Icon32/transform_scale.png new file mode 100644 index 0000000..a5956ba Binary files /dev/null and b/asset/icon/Icon32/transform_scale.png differ diff --git a/asset/icon/Icon32/transform_selection.png b/asset/icon/Icon32/transform_selection.png new file mode 100644 index 0000000..b539164 Binary files /dev/null and b/asset/icon/Icon32/transform_selection.png differ diff --git a/asset/icon/Icon32/transform_shear.png b/asset/icon/Icon32/transform_shear.png new file mode 100644 index 0000000..73219fc Binary files /dev/null and b/asset/icon/Icon32/transform_shear.png differ diff --git a/asset/icon/Icon32/transmit.png b/asset/icon/Icon32/transmit.png new file mode 100644 index 0000000..c263253 Binary files /dev/null and b/asset/icon/Icon32/transmit.png differ diff --git a/asset/icon/Icon32/transmit_add.png b/asset/icon/Icon32/transmit_add.png new file mode 100644 index 0000000..b337fbf Binary files /dev/null and b/asset/icon/Icon32/transmit_add.png differ diff --git a/asset/icon/Icon32/transmit_blue.png b/asset/icon/Icon32/transmit_blue.png new file mode 100644 index 0000000..f0c06ca Binary files /dev/null and b/asset/icon/Icon32/transmit_blue.png differ diff --git a/asset/icon/Icon32/transmit_delete.png b/asset/icon/Icon32/transmit_delete.png new file mode 100644 index 0000000..f34531c Binary files /dev/null and b/asset/icon/Icon32/transmit_delete.png differ diff --git a/asset/icon/Icon32/transmit_edit.png b/asset/icon/Icon32/transmit_edit.png new file mode 100644 index 0000000..e7372a5 Binary files /dev/null and b/asset/icon/Icon32/transmit_edit.png differ diff --git a/asset/icon/Icon32/transmit_error.png b/asset/icon/Icon32/transmit_error.png new file mode 100644 index 0000000..6644f07 Binary files /dev/null and b/asset/icon/Icon32/transmit_error.png differ diff --git a/asset/icon/Icon32/transmit_go.png b/asset/icon/Icon32/transmit_go.png new file mode 100644 index 0000000..ac34187 Binary files /dev/null and b/asset/icon/Icon32/transmit_go.png differ diff --git a/asset/icon/Icon32/travel.png b/asset/icon/Icon32/travel.png new file mode 100644 index 0000000..808702e Binary files /dev/null and b/asset/icon/Icon32/travel.png differ diff --git a/asset/icon/Icon32/tree(2).png b/asset/icon/Icon32/tree(2).png new file mode 100644 index 0000000..d062b08 Binary files /dev/null and b/asset/icon/Icon32/tree(2).png differ diff --git a/asset/icon/Icon32/tree.png b/asset/icon/Icon32/tree.png new file mode 100644 index 0000000..649c6a9 Binary files /dev/null and b/asset/icon/Icon32/tree.png differ diff --git a/asset/icon/Icon32/tree_bare.png b/asset/icon/Icon32/tree_bare.png new file mode 100644 index 0000000..88f3a51 Binary files /dev/null and b/asset/icon/Icon32/tree_bare.png differ diff --git a/asset/icon/Icon32/tree_red.png b/asset/icon/Icon32/tree_red.png new file mode 100644 index 0000000..b67dde1 Binary files /dev/null and b/asset/icon/Icon32/tree_red.png differ diff --git a/asset/icon/Icon32/tree_white.png b/asset/icon/Icon32/tree_white.png new file mode 100644 index 0000000..6501e9d Binary files /dev/null and b/asset/icon/Icon32/tree_white.png differ diff --git a/asset/icon/Icon32/tree_yellow.png b/asset/icon/Icon32/tree_yellow.png new file mode 100644 index 0000000..4cd5879 Binary files /dev/null and b/asset/icon/Icon32/tree_yellow.png differ diff --git a/asset/icon/Icon32/trojan_horse.png b/asset/icon/Icon32/trojan_horse.png new file mode 100644 index 0000000..03b4b97 Binary files /dev/null and b/asset/icon/Icon32/trojan_horse.png differ diff --git a/asset/icon/Icon32/trolley.png b/asset/icon/Icon32/trolley.png new file mode 100644 index 0000000..ec29ff8 Binary files /dev/null and b/asset/icon/Icon32/trolley.png differ diff --git a/asset/icon/Icon32/tub.png b/asset/icon/Icon32/tub.png new file mode 100644 index 0000000..bdd67d3 Binary files /dev/null and b/asset/icon/Icon32/tub.png differ diff --git a/asset/icon/Icon32/tubes.png b/asset/icon/Icon32/tubes.png new file mode 100644 index 0000000..9fd79cb Binary files /dev/null and b/asset/icon/Icon32/tubes.png differ diff --git a/asset/icon/Icon32/tumblr.png b/asset/icon/Icon32/tumblr.png new file mode 100644 index 0000000..af5a0cc Binary files /dev/null and b/asset/icon/Icon32/tumblr.png differ diff --git a/asset/icon/Icon32/turntable.png b/asset/icon/Icon32/turntable.png new file mode 100644 index 0000000..0db8a41 Binary files /dev/null and b/asset/icon/Icon32/turntable.png differ diff --git a/asset/icon/Icon32/tux.png b/asset/icon/Icon32/tux.png new file mode 100644 index 0000000..2930487 Binary files /dev/null and b/asset/icon/Icon32/tux.png differ diff --git a/asset/icon/Icon32/twitter_1.png b/asset/icon/Icon32/twitter_1.png new file mode 100644 index 0000000..11e66a3 Binary files /dev/null and b/asset/icon/Icon32/twitter_1.png differ diff --git a/asset/icon/Icon32/twitter_2.png b/asset/icon/Icon32/twitter_2.png new file mode 100644 index 0000000..692e122 Binary files /dev/null and b/asset/icon/Icon32/twitter_2.png differ diff --git a/asset/icon/Icon32/ubuntu.png b/asset/icon/Icon32/ubuntu.png new file mode 100644 index 0000000..57704f3 Binary files /dev/null and b/asset/icon/Icon32/ubuntu.png differ diff --git a/asset/icon/Icon32/ufo.png b/asset/icon/Icon32/ufo.png new file mode 100644 index 0000000..3c23137 Binary files /dev/null and b/asset/icon/Icon32/ufo.png differ diff --git a/asset/icon/Icon32/umbrella.png b/asset/icon/Icon32/umbrella.png new file mode 100644 index 0000000..3eae87d Binary files /dev/null and b/asset/icon/Icon32/umbrella.png differ diff --git a/asset/icon/Icon32/umbrella_folded.png b/asset/icon/Icon32/umbrella_folded.png new file mode 100644 index 0000000..7029f66 Binary files /dev/null and b/asset/icon/Icon32/umbrella_folded.png differ diff --git a/asset/icon/Icon32/underle_dictionary.png b/asset/icon/Icon32/underle_dictionary.png new file mode 100644 index 0000000..59cad82 Binary files /dev/null and b/asset/icon/Icon32/underle_dictionary.png differ diff --git a/asset/icon/Icon32/understanding.png b/asset/icon/Icon32/understanding.png new file mode 100644 index 0000000..99a8d69 Binary files /dev/null and b/asset/icon/Icon32/understanding.png differ diff --git a/asset/icon/Icon32/undo.png b/asset/icon/Icon32/undo.png new file mode 100644 index 0000000..8d7e6f7 Binary files /dev/null and b/asset/icon/Icon32/undo.png differ diff --git a/asset/icon/Icon32/ungroup_stroke.png b/asset/icon/Icon32/ungroup_stroke.png new file mode 100644 index 0000000..e2b1b96 Binary files /dev/null and b/asset/icon/Icon32/ungroup_stroke.png differ diff --git a/asset/icon/Icon32/unicorn.png b/asset/icon/Icon32/unicorn.png new file mode 100644 index 0000000..9faeb64 Binary files /dev/null and b/asset/icon/Icon32/unicorn.png differ diff --git a/asset/icon/Icon32/uninstall_frontpage_extensions.png b/asset/icon/Icon32/uninstall_frontpage_extensions.png new file mode 100644 index 0000000..dddad0d Binary files /dev/null and b/asset/icon/Icon32/uninstall_frontpage_extensions.png differ diff --git a/asset/icon/Icon32/universal_binary.png b/asset/icon/Icon32/universal_binary.png new file mode 100644 index 0000000..548f28d Binary files /dev/null and b/asset/icon/Icon32/universal_binary.png differ diff --git a/asset/icon/Icon32/unmark_to_download.png b/asset/icon/Icon32/unmark_to_download.png new file mode 100644 index 0000000..bc37bd3 Binary files /dev/null and b/asset/icon/Icon32/unmark_to_download.png differ diff --git a/asset/icon/Icon32/update.png b/asset/icon/Icon32/update.png new file mode 100644 index 0000000..c1ab75d Binary files /dev/null and b/asset/icon/Icon32/update.png differ diff --git a/asset/icon/Icon32/update_contact_info.png b/asset/icon/Icon32/update_contact_info.png new file mode 100644 index 0000000..832ca9a Binary files /dev/null and b/asset/icon/Icon32/update_contact_info.png differ diff --git a/asset/icon/Icon32/upgrade_downgrade_account.png b/asset/icon/Icon32/upgrade_downgrade_account.png new file mode 100644 index 0000000..9e5fcbf Binary files /dev/null and b/asset/icon/Icon32/upgrade_downgrade_account.png differ diff --git a/asset/icon/Icon32/upload_for_cloud.png b/asset/icon/Icon32/upload_for_cloud.png new file mode 100644 index 0000000..affc090 Binary files /dev/null and b/asset/icon/Icon32/upload_for_cloud.png differ diff --git a/asset/icon/Icon32/upload_for_linux.png b/asset/icon/Icon32/upload_for_linux.png new file mode 100644 index 0000000..d7f0ea3 Binary files /dev/null and b/asset/icon/Icon32/upload_for_linux.png differ diff --git a/asset/icon/Icon32/upload_for_mac.png b/asset/icon/Icon32/upload_for_mac.png new file mode 100644 index 0000000..25b6bad Binary files /dev/null and b/asset/icon/Icon32/upload_for_mac.png differ diff --git a/asset/icon/Icon32/upload_for_windows.png b/asset/icon/Icon32/upload_for_windows.png new file mode 100644 index 0000000..daccbda Binary files /dev/null and b/asset/icon/Icon32/upload_for_windows.png differ diff --git a/asset/icon/Icon32/usb_3.png b/asset/icon/Icon32/usb_3.png new file mode 100644 index 0000000..2c0b1f7 Binary files /dev/null and b/asset/icon/Icon32/usb_3.png differ diff --git a/asset/icon/Icon32/use_in_formula.png b/asset/icon/Icon32/use_in_formula.png new file mode 100644 index 0000000..1c4fc52 Binary files /dev/null and b/asset/icon/Icon32/use_in_formula.png differ diff --git a/asset/icon/Icon32/user.png b/asset/icon/Icon32/user.png new file mode 100644 index 0000000..42b3810 Binary files /dev/null and b/asset/icon/Icon32/user.png differ diff --git a/asset/icon/Icon32/user_add.png b/asset/icon/Icon32/user_add.png new file mode 100644 index 0000000..dbfa800 Binary files /dev/null and b/asset/icon/Icon32/user_add.png differ diff --git a/asset/icon/Icon32/user_alien.png b/asset/icon/Icon32/user_alien.png new file mode 100644 index 0000000..6ba8c5b Binary files /dev/null and b/asset/icon/Icon32/user_alien.png differ diff --git a/asset/icon/Icon32/user_angel.png b/asset/icon/Icon32/user_angel.png new file mode 100644 index 0000000..2997bbe Binary files /dev/null and b/asset/icon/Icon32/user_angel.png differ diff --git a/asset/icon/Icon32/user_angel_black.png b/asset/icon/Icon32/user_angel_black.png new file mode 100644 index 0000000..96c236a Binary files /dev/null and b/asset/icon/Icon32/user_angel_black.png differ diff --git a/asset/icon/Icon32/user_angel_female.png b/asset/icon/Icon32/user_angel_female.png new file mode 100644 index 0000000..1b01d55 Binary files /dev/null and b/asset/icon/Icon32/user_angel_female.png differ diff --git a/asset/icon/Icon32/user_angel_female_black.png b/asset/icon/Icon32/user_angel_female_black.png new file mode 100644 index 0000000..ac0c1c2 Binary files /dev/null and b/asset/icon/Icon32/user_angel_female_black.png differ diff --git a/asset/icon/Icon32/user_astronaut.png b/asset/icon/Icon32/user_astronaut.png new file mode 100644 index 0000000..6331892 Binary files /dev/null and b/asset/icon/Icon32/user_astronaut.png differ diff --git a/asset/icon/Icon32/user_ballplayer.png b/asset/icon/Icon32/user_ballplayer.png new file mode 100644 index 0000000..7169b06 Binary files /dev/null and b/asset/icon/Icon32/user_ballplayer.png differ diff --git a/asset/icon/Icon32/user_ballplayer_black.png b/asset/icon/Icon32/user_ballplayer_black.png new file mode 100644 index 0000000..88585c0 Binary files /dev/null and b/asset/icon/Icon32/user_ballplayer_black.png differ diff --git a/asset/icon/Icon32/user_banker.png b/asset/icon/Icon32/user_banker.png new file mode 100644 index 0000000..c5e7747 Binary files /dev/null and b/asset/icon/Icon32/user_banker.png differ diff --git a/asset/icon/Icon32/user_bart.png b/asset/icon/Icon32/user_bart.png new file mode 100644 index 0000000..6c9ee27 Binary files /dev/null and b/asset/icon/Icon32/user_bart.png differ diff --git a/asset/icon/Icon32/user_batman.png b/asset/icon/Icon32/user_batman.png new file mode 100644 index 0000000..2dc3e3a Binary files /dev/null and b/asset/icon/Icon32/user_batman.png differ diff --git a/asset/icon/Icon32/user_beach_lifeguard.png b/asset/icon/Icon32/user_beach_lifeguard.png new file mode 100644 index 0000000..66e30ec Binary files /dev/null and b/asset/icon/Icon32/user_beach_lifeguard.png differ diff --git a/asset/icon/Icon32/user_beach_lifeguard_female.png b/asset/icon/Icon32/user_beach_lifeguard_female.png new file mode 100644 index 0000000..6ff819a Binary files /dev/null and b/asset/icon/Icon32/user_beach_lifeguard_female.png differ diff --git a/asset/icon/Icon32/user_bender.png b/asset/icon/Icon32/user_bender.png new file mode 100644 index 0000000..323014d Binary files /dev/null and b/asset/icon/Icon32/user_bender.png differ diff --git a/asset/icon/Icon32/user_bishop.png b/asset/icon/Icon32/user_bishop.png new file mode 100644 index 0000000..0f3726a Binary files /dev/null and b/asset/icon/Icon32/user_bishop.png differ diff --git a/asset/icon/Icon32/user_blondy.png b/asset/icon/Icon32/user_blondy.png new file mode 100644 index 0000000..c9cd23f Binary files /dev/null and b/asset/icon/Icon32/user_blondy.png differ diff --git a/asset/icon/Icon32/user_boxer.png b/asset/icon/Icon32/user_boxer.png new file mode 100644 index 0000000..21f1534 Binary files /dev/null and b/asset/icon/Icon32/user_boxer.png differ diff --git a/asset/icon/Icon32/user_boxer_black.png b/asset/icon/Icon32/user_boxer_black.png new file mode 100644 index 0000000..7f28ea4 Binary files /dev/null and b/asset/icon/Icon32/user_boxer_black.png differ diff --git a/asset/icon/Icon32/user_buddhist.png b/asset/icon/Icon32/user_buddhist.png new file mode 100644 index 0000000..a8ee7e7 Binary files /dev/null and b/asset/icon/Icon32/user_buddhist.png differ diff --git a/asset/icon/Icon32/user_c3po.png b/asset/icon/Icon32/user_c3po.png new file mode 100644 index 0000000..3247fd3 Binary files /dev/null and b/asset/icon/Icon32/user_c3po.png differ diff --git a/asset/icon/Icon32/user_catwomen.png b/asset/icon/Icon32/user_catwomen.png new file mode 100644 index 0000000..c4adb37 Binary files /dev/null and b/asset/icon/Icon32/user_catwomen.png differ diff --git a/asset/icon/Icon32/user_chief.png b/asset/icon/Icon32/user_chief.png new file mode 100644 index 0000000..43fa7d8 Binary files /dev/null and b/asset/icon/Icon32/user_chief.png differ diff --git a/asset/icon/Icon32/user_chief_black.png b/asset/icon/Icon32/user_chief_black.png new file mode 100644 index 0000000..785ccf7 Binary files /dev/null and b/asset/icon/Icon32/user_chief_black.png differ diff --git a/asset/icon/Icon32/user_chief_female.png b/asset/icon/Icon32/user_chief_female.png new file mode 100644 index 0000000..72de262 Binary files /dev/null and b/asset/icon/Icon32/user_chief_female.png differ diff --git a/asset/icon/Icon32/user_chief_female_black.png b/asset/icon/Icon32/user_chief_female_black.png new file mode 100644 index 0000000..981d9e5 Binary files /dev/null and b/asset/icon/Icon32/user_chief_female_black.png differ diff --git a/asset/icon/Icon32/user_clown.png b/asset/icon/Icon32/user_clown.png new file mode 100644 index 0000000..afdad35 Binary files /dev/null and b/asset/icon/Icon32/user_clown.png differ diff --git a/asset/icon/Icon32/user_comment.png b/asset/icon/Icon32/user_comment.png new file mode 100644 index 0000000..2abf413 Binary files /dev/null and b/asset/icon/Icon32/user_comment.png differ diff --git a/asset/icon/Icon32/user_cook.png b/asset/icon/Icon32/user_cook.png new file mode 100644 index 0000000..9ce7efa Binary files /dev/null and b/asset/icon/Icon32/user_cook.png differ diff --git a/asset/icon/Icon32/user_cook_black.png b/asset/icon/Icon32/user_cook_black.png new file mode 100644 index 0000000..7697628 Binary files /dev/null and b/asset/icon/Icon32/user_cook_black.png differ diff --git a/asset/icon/Icon32/user_cook_female.png b/asset/icon/Icon32/user_cook_female.png new file mode 100644 index 0000000..c235d1d Binary files /dev/null and b/asset/icon/Icon32/user_cook_female.png differ diff --git a/asset/icon/Icon32/user_cook_female_black.png b/asset/icon/Icon32/user_cook_female_black.png new file mode 100644 index 0000000..5e3dc8e Binary files /dev/null and b/asset/icon/Icon32/user_cook_female_black.png differ diff --git a/asset/icon/Icon32/user_cowboy.png b/asset/icon/Icon32/user_cowboy.png new file mode 100644 index 0000000..311a7ec Binary files /dev/null and b/asset/icon/Icon32/user_cowboy.png differ diff --git a/asset/icon/Icon32/user_cowboy_female.png b/asset/icon/Icon32/user_cowboy_female.png new file mode 100644 index 0000000..8dd887b Binary files /dev/null and b/asset/icon/Icon32/user_cowboy_female.png differ diff --git a/asset/icon/Icon32/user_crabs.png b/asset/icon/Icon32/user_crabs.png new file mode 100644 index 0000000..c510420 Binary files /dev/null and b/asset/icon/Icon32/user_crabs.png differ diff --git a/asset/icon/Icon32/user_darth_vader.png b/asset/icon/Icon32/user_darth_vader.png new file mode 100644 index 0000000..f60f747 Binary files /dev/null and b/asset/icon/Icon32/user_darth_vader.png differ diff --git a/asset/icon/Icon32/user_death.png b/asset/icon/Icon32/user_death.png new file mode 100644 index 0000000..faf937d Binary files /dev/null and b/asset/icon/Icon32/user_death.png differ diff --git a/asset/icon/Icon32/user_delete.png b/asset/icon/Icon32/user_delete.png new file mode 100644 index 0000000..ed02eba Binary files /dev/null and b/asset/icon/Icon32/user_delete.png differ diff --git a/asset/icon/Icon32/user_detective.png b/asset/icon/Icon32/user_detective.png new file mode 100644 index 0000000..39f228c Binary files /dev/null and b/asset/icon/Icon32/user_detective.png differ diff --git a/asset/icon/Icon32/user_detective_gray.png b/asset/icon/Icon32/user_detective_gray.png new file mode 100644 index 0000000..402da69 Binary files /dev/null and b/asset/icon/Icon32/user_detective_gray.png differ diff --git a/asset/icon/Icon32/user_devil.png b/asset/icon/Icon32/user_devil.png new file mode 100644 index 0000000..4f7885a Binary files /dev/null and b/asset/icon/Icon32/user_devil.png differ diff --git a/asset/icon/Icon32/user_diver.png b/asset/icon/Icon32/user_diver.png new file mode 100644 index 0000000..2c9865e Binary files /dev/null and b/asset/icon/Icon32/user_diver.png differ diff --git a/asset/icon/Icon32/user_dracula.png b/asset/icon/Icon32/user_dracula.png new file mode 100644 index 0000000..1fed566 Binary files /dev/null and b/asset/icon/Icon32/user_dracula.png differ diff --git a/asset/icon/Icon32/user_edit.png b/asset/icon/Icon32/user_edit.png new file mode 100644 index 0000000..1bf6259 Binary files /dev/null and b/asset/icon/Icon32/user_edit.png differ diff --git a/asset/icon/Icon32/user_egyptian.png b/asset/icon/Icon32/user_egyptian.png new file mode 100644 index 0000000..f579226 Binary files /dev/null and b/asset/icon/Icon32/user_egyptian.png differ diff --git a/asset/icon/Icon32/user_egyptian_female.png b/asset/icon/Icon32/user_egyptian_female.png new file mode 100644 index 0000000..11d1a23 Binary files /dev/null and b/asset/icon/Icon32/user_egyptian_female.png differ diff --git a/asset/icon/Icon32/user_emo.png b/asset/icon/Icon32/user_emo.png new file mode 100644 index 0000000..038ff80 Binary files /dev/null and b/asset/icon/Icon32/user_emo.png differ diff --git a/asset/icon/Icon32/user_eskimo.png b/asset/icon/Icon32/user_eskimo.png new file mode 100644 index 0000000..90f42f1 Binary files /dev/null and b/asset/icon/Icon32/user_eskimo.png differ diff --git a/asset/icon/Icon32/user_eskimo_female.png b/asset/icon/Icon32/user_eskimo_female.png new file mode 100644 index 0000000..ce8ad9b Binary files /dev/null and b/asset/icon/Icon32/user_eskimo_female.png differ diff --git a/asset/icon/Icon32/user_female.png b/asset/icon/Icon32/user_female.png new file mode 100644 index 0000000..38dde34 Binary files /dev/null and b/asset/icon/Icon32/user_female.png differ diff --git a/asset/icon/Icon32/user_firefighter.png b/asset/icon/Icon32/user_firefighter.png new file mode 100644 index 0000000..7543b4a Binary files /dev/null and b/asset/icon/Icon32/user_firefighter.png differ diff --git a/asset/icon/Icon32/user_firefighter_black.png b/asset/icon/Icon32/user_firefighter_black.png new file mode 100644 index 0000000..ffcacb3 Binary files /dev/null and b/asset/icon/Icon32/user_firefighter_black.png differ diff --git a/asset/icon/Icon32/user_freddy.png b/asset/icon/Icon32/user_freddy.png new file mode 100644 index 0000000..76f8dff Binary files /dev/null and b/asset/icon/Icon32/user_freddy.png differ diff --git a/asset/icon/Icon32/user_geisha.png b/asset/icon/Icon32/user_geisha.png new file mode 100644 index 0000000..8829248 Binary files /dev/null and b/asset/icon/Icon32/user_geisha.png differ diff --git a/asset/icon/Icon32/user_gladiator.png b/asset/icon/Icon32/user_gladiator.png new file mode 100644 index 0000000..6784130 Binary files /dev/null and b/asset/icon/Icon32/user_gladiator.png differ diff --git a/asset/icon/Icon32/user_go.png b/asset/icon/Icon32/user_go.png new file mode 100644 index 0000000..75f7580 Binary files /dev/null and b/asset/icon/Icon32/user_go.png differ diff --git a/asset/icon/Icon32/user_gomer.png b/asset/icon/Icon32/user_gomer.png new file mode 100644 index 0000000..566eb30 Binary files /dev/null and b/asset/icon/Icon32/user_gomer.png differ diff --git a/asset/icon/Icon32/user_goth.png b/asset/icon/Icon32/user_goth.png new file mode 100644 index 0000000..55d976e Binary files /dev/null and b/asset/icon/Icon32/user_goth.png differ diff --git a/asset/icon/Icon32/user_gray.png b/asset/icon/Icon32/user_gray.png new file mode 100644 index 0000000..9316c77 Binary files /dev/null and b/asset/icon/Icon32/user_gray.png differ diff --git a/asset/icon/Icon32/user_green.png b/asset/icon/Icon32/user_green.png new file mode 100644 index 0000000..c85812e Binary files /dev/null and b/asset/icon/Icon32/user_green.png differ diff --git a/asset/icon/Icon32/user_halk.png b/asset/icon/Icon32/user_halk.png new file mode 100644 index 0000000..89f922c Binary files /dev/null and b/asset/icon/Icon32/user_halk.png differ diff --git a/asset/icon/Icon32/user_hendrix.png b/asset/icon/Icon32/user_hendrix.png new file mode 100644 index 0000000..80ee782 Binary files /dev/null and b/asset/icon/Icon32/user_hendrix.png differ diff --git a/asset/icon/Icon32/user_imprisoned.png b/asset/icon/Icon32/user_imprisoned.png new file mode 100644 index 0000000..2209117 Binary files /dev/null and b/asset/icon/Icon32/user_imprisoned.png differ diff --git a/asset/icon/Icon32/user_imprisoned_black.png b/asset/icon/Icon32/user_imprisoned_black.png new file mode 100644 index 0000000..a656bde Binary files /dev/null and b/asset/icon/Icon32/user_imprisoned_black.png differ diff --git a/asset/icon/Icon32/user_imprisoned_female.png b/asset/icon/Icon32/user_imprisoned_female.png new file mode 100644 index 0000000..7d99fed Binary files /dev/null and b/asset/icon/Icon32/user_imprisoned_female.png differ diff --git a/asset/icon/Icon32/user_imprisoned_female_black.png b/asset/icon/Icon32/user_imprisoned_female_black.png new file mode 100644 index 0000000..c3e0dbc Binary files /dev/null and b/asset/icon/Icon32/user_imprisoned_female_black.png differ diff --git a/asset/icon/Icon32/user_indian.png b/asset/icon/Icon32/user_indian.png new file mode 100644 index 0000000..16c3230 Binary files /dev/null and b/asset/icon/Icon32/user_indian.png differ diff --git a/asset/icon/Icon32/user_indian_female.png b/asset/icon/Icon32/user_indian_female.png new file mode 100644 index 0000000..b5d1146 Binary files /dev/null and b/asset/icon/Icon32/user_indian_female.png differ diff --git a/asset/icon/Icon32/user_ironman.png b/asset/icon/Icon32/user_ironman.png new file mode 100644 index 0000000..58679f6 Binary files /dev/null and b/asset/icon/Icon32/user_ironman.png differ diff --git a/asset/icon/Icon32/user_jason.png b/asset/icon/Icon32/user_jason.png new file mode 100644 index 0000000..7632b12 Binary files /dev/null and b/asset/icon/Icon32/user_jason.png differ diff --git a/asset/icon/Icon32/user_jawa.png b/asset/icon/Icon32/user_jawa.png new file mode 100644 index 0000000..dabf369 Binary files /dev/null and b/asset/icon/Icon32/user_jawa.png differ diff --git a/asset/icon/Icon32/user_jester.png b/asset/icon/Icon32/user_jester.png new file mode 100644 index 0000000..c6b28e0 Binary files /dev/null and b/asset/icon/Icon32/user_jester.png differ diff --git a/asset/icon/Icon32/user_jew.png b/asset/icon/Icon32/user_jew.png new file mode 100644 index 0000000..a98cecc Binary files /dev/null and b/asset/icon/Icon32/user_jew.png differ diff --git a/asset/icon/Icon32/user_judge.png b/asset/icon/Icon32/user_judge.png new file mode 100644 index 0000000..68898d9 Binary files /dev/null and b/asset/icon/Icon32/user_judge.png differ diff --git a/asset/icon/Icon32/user_judge_black.png b/asset/icon/Icon32/user_judge_black.png new file mode 100644 index 0000000..ba86fa6 Binary files /dev/null and b/asset/icon/Icon32/user_judge_black.png differ diff --git a/asset/icon/Icon32/user_king.png b/asset/icon/Icon32/user_king.png new file mode 100644 index 0000000..5b84ba2 Binary files /dev/null and b/asset/icon/Icon32/user_king.png differ diff --git a/asset/icon/Icon32/user_king_black.png b/asset/icon/Icon32/user_king_black.png new file mode 100644 index 0000000..6fedacb Binary files /dev/null and b/asset/icon/Icon32/user_king_black.png differ diff --git a/asset/icon/Icon32/user_knight.png b/asset/icon/Icon32/user_knight.png new file mode 100644 index 0000000..da99c85 Binary files /dev/null and b/asset/icon/Icon32/user_knight.png differ diff --git a/asset/icon/Icon32/user_leprechaun.png b/asset/icon/Icon32/user_leprechaun.png new file mode 100644 index 0000000..9524b40 Binary files /dev/null and b/asset/icon/Icon32/user_leprechaun.png differ diff --git a/asset/icon/Icon32/user_level_filtering.png b/asset/icon/Icon32/user_level_filtering.png new file mode 100644 index 0000000..0070b3f Binary files /dev/null and b/asset/icon/Icon32/user_level_filtering.png differ diff --git a/asset/icon/Icon32/user_lisa.png b/asset/icon/Icon32/user_lisa.png new file mode 100644 index 0000000..2208483 Binary files /dev/null and b/asset/icon/Icon32/user_lisa.png differ diff --git a/asset/icon/Icon32/user_maid.png b/asset/icon/Icon32/user_maid.png new file mode 100644 index 0000000..d805a0d Binary files /dev/null and b/asset/icon/Icon32/user_maid.png differ diff --git a/asset/icon/Icon32/user_medical.png b/asset/icon/Icon32/user_medical.png new file mode 100644 index 0000000..87f6569 Binary files /dev/null and b/asset/icon/Icon32/user_medical.png differ diff --git a/asset/icon/Icon32/user_medical_black.png b/asset/icon/Icon32/user_medical_black.png new file mode 100644 index 0000000..fa94084 Binary files /dev/null and b/asset/icon/Icon32/user_medical_black.png differ diff --git a/asset/icon/Icon32/user_medical_female.png b/asset/icon/Icon32/user_medical_female.png new file mode 100644 index 0000000..5a0410c Binary files /dev/null and b/asset/icon/Icon32/user_medical_female.png differ diff --git a/asset/icon/Icon32/user_medical_female_black.png b/asset/icon/Icon32/user_medical_female_black.png new file mode 100644 index 0000000..3b076cd Binary files /dev/null and b/asset/icon/Icon32/user_medical_female_black.png differ diff --git a/asset/icon/Icon32/user_mexican.png b/asset/icon/Icon32/user_mexican.png new file mode 100644 index 0000000..0629c71 Binary files /dev/null and b/asset/icon/Icon32/user_mexican.png differ diff --git a/asset/icon/Icon32/user_muslim.png b/asset/icon/Icon32/user_muslim.png new file mode 100644 index 0000000..efe290b Binary files /dev/null and b/asset/icon/Icon32/user_muslim.png differ diff --git a/asset/icon/Icon32/user_muslim_female.png b/asset/icon/Icon32/user_muslim_female.png new file mode 100644 index 0000000..f6b8fc9 Binary files /dev/null and b/asset/icon/Icon32/user_muslim_female.png differ diff --git a/asset/icon/Icon32/user_ninja.png b/asset/icon/Icon32/user_ninja.png new file mode 100644 index 0000000..4c65302 Binary files /dev/null and b/asset/icon/Icon32/user_ninja.png differ diff --git a/asset/icon/Icon32/user_nude.png b/asset/icon/Icon32/user_nude.png new file mode 100644 index 0000000..e52179a Binary files /dev/null and b/asset/icon/Icon32/user_nude.png differ diff --git a/asset/icon/Icon32/user_nude_black.png b/asset/icon/Icon32/user_nude_black.png new file mode 100644 index 0000000..7ead03d Binary files /dev/null and b/asset/icon/Icon32/user_nude_black.png differ diff --git a/asset/icon/Icon32/user_nude_female.png b/asset/icon/Icon32/user_nude_female.png new file mode 100644 index 0000000..eae51b8 Binary files /dev/null and b/asset/icon/Icon32/user_nude_female.png differ diff --git a/asset/icon/Icon32/user_nude_female_black.png b/asset/icon/Icon32/user_nude_female_black.png new file mode 100644 index 0000000..600521c Binary files /dev/null and b/asset/icon/Icon32/user_nude_female_black.png differ diff --git a/asset/icon/Icon32/user_nun.png b/asset/icon/Icon32/user_nun.png new file mode 100644 index 0000000..aa1d33c Binary files /dev/null and b/asset/icon/Icon32/user_nun.png differ diff --git a/asset/icon/Icon32/user_nun_black.png b/asset/icon/Icon32/user_nun_black.png new file mode 100644 index 0000000..2758dcc Binary files /dev/null and b/asset/icon/Icon32/user_nun_black.png differ diff --git a/asset/icon/Icon32/user_officer.png b/asset/icon/Icon32/user_officer.png new file mode 100644 index 0000000..74a67ed Binary files /dev/null and b/asset/icon/Icon32/user_officer.png differ diff --git a/asset/icon/Icon32/user_officer_black.png b/asset/icon/Icon32/user_officer_black.png new file mode 100644 index 0000000..2529be9 Binary files /dev/null and b/asset/icon/Icon32/user_officer_black.png differ diff --git a/asset/icon/Icon32/user_oldman.png b/asset/icon/Icon32/user_oldman.png new file mode 100644 index 0000000..ce9224e Binary files /dev/null and b/asset/icon/Icon32/user_oldman.png differ diff --git a/asset/icon/Icon32/user_oldman_black.png b/asset/icon/Icon32/user_oldman_black.png new file mode 100644 index 0000000..11dcf19 Binary files /dev/null and b/asset/icon/Icon32/user_oldman_black.png differ diff --git a/asset/icon/Icon32/user_oldwoman.png b/asset/icon/Icon32/user_oldwoman.png new file mode 100644 index 0000000..87e0016 Binary files /dev/null and b/asset/icon/Icon32/user_oldwoman.png differ diff --git a/asset/icon/Icon32/user_oldwoman_black.png b/asset/icon/Icon32/user_oldwoman_black.png new file mode 100644 index 0000000..37e5a3a Binary files /dev/null and b/asset/icon/Icon32/user_oldwoman_black.png differ diff --git a/asset/icon/Icon32/user_orange.png b/asset/icon/Icon32/user_orange.png new file mode 100644 index 0000000..a1a071f Binary files /dev/null and b/asset/icon/Icon32/user_orange.png differ diff --git a/asset/icon/Icon32/user_patrick.png b/asset/icon/Icon32/user_patrick.png new file mode 100644 index 0000000..688e382 Binary files /dev/null and b/asset/icon/Icon32/user_patrick.png differ diff --git a/asset/icon/Icon32/user_pilot.png b/asset/icon/Icon32/user_pilot.png new file mode 100644 index 0000000..c7c9ed7 Binary files /dev/null and b/asset/icon/Icon32/user_pilot.png differ diff --git a/asset/icon/Icon32/user_pilot_civil.png b/asset/icon/Icon32/user_pilot_civil.png new file mode 100644 index 0000000..97ddca3 Binary files /dev/null and b/asset/icon/Icon32/user_pilot_civil.png differ diff --git a/asset/icon/Icon32/user_pirate.png b/asset/icon/Icon32/user_pirate.png new file mode 100644 index 0000000..2ad9583 Binary files /dev/null and b/asset/icon/Icon32/user_pirate.png differ diff --git a/asset/icon/Icon32/user_plankton.png b/asset/icon/Icon32/user_plankton.png new file mode 100644 index 0000000..c86487e Binary files /dev/null and b/asset/icon/Icon32/user_plankton.png differ diff --git a/asset/icon/Icon32/user_police_england.png b/asset/icon/Icon32/user_police_england.png new file mode 100644 index 0000000..bb4adc6 Binary files /dev/null and b/asset/icon/Icon32/user_police_england.png differ diff --git a/asset/icon/Icon32/user_police_female.png b/asset/icon/Icon32/user_police_female.png new file mode 100644 index 0000000..84806fe Binary files /dev/null and b/asset/icon/Icon32/user_police_female.png differ diff --git a/asset/icon/Icon32/user_police_female_black.png b/asset/icon/Icon32/user_police_female_black.png new file mode 100644 index 0000000..8cd8b85 Binary files /dev/null and b/asset/icon/Icon32/user_police_female_black.png differ diff --git a/asset/icon/Icon32/user_policeman(2).png b/asset/icon/Icon32/user_policeman(2).png new file mode 100644 index 0000000..45c347b Binary files /dev/null and b/asset/icon/Icon32/user_policeman(2).png differ diff --git a/asset/icon/Icon32/user_policeman.png b/asset/icon/Icon32/user_policeman.png new file mode 100644 index 0000000..97cf02c Binary files /dev/null and b/asset/icon/Icon32/user_policeman.png differ diff --git a/asset/icon/Icon32/user_priest.png b/asset/icon/Icon32/user_priest.png new file mode 100644 index 0000000..b9780dc Binary files /dev/null and b/asset/icon/Icon32/user_priest.png differ diff --git a/asset/icon/Icon32/user_priest_black.png b/asset/icon/Icon32/user_priest_black.png new file mode 100644 index 0000000..3b7e07b Binary files /dev/null and b/asset/icon/Icon32/user_priest_black.png differ diff --git a/asset/icon/Icon32/user_pumpkin.png b/asset/icon/Icon32/user_pumpkin.png new file mode 100644 index 0000000..bdc76ba Binary files /dev/null and b/asset/icon/Icon32/user_pumpkin.png differ diff --git a/asset/icon/Icon32/user_queen.png b/asset/icon/Icon32/user_queen.png new file mode 100644 index 0000000..b6ab800 Binary files /dev/null and b/asset/icon/Icon32/user_queen.png differ diff --git a/asset/icon/Icon32/user_queen_black.png b/asset/icon/Icon32/user_queen_black.png new file mode 100644 index 0000000..a9fc065 Binary files /dev/null and b/asset/icon/Icon32/user_queen_black.png differ diff --git a/asset/icon/Icon32/user_r2d2.png b/asset/icon/Icon32/user_r2d2.png new file mode 100644 index 0000000..9bb580c Binary files /dev/null and b/asset/icon/Icon32/user_r2d2.png differ diff --git a/asset/icon/Icon32/user_racer.png b/asset/icon/Icon32/user_racer.png new file mode 100644 index 0000000..010b258 Binary files /dev/null and b/asset/icon/Icon32/user_racer.png differ diff --git a/asset/icon/Icon32/user_rambo.png b/asset/icon/Icon32/user_rambo.png new file mode 100644 index 0000000..8f5d1da Binary files /dev/null and b/asset/icon/Icon32/user_rambo.png differ diff --git a/asset/icon/Icon32/user_red.png b/asset/icon/Icon32/user_red.png new file mode 100644 index 0000000..e03fd0f Binary files /dev/null and b/asset/icon/Icon32/user_red.png differ diff --git a/asset/icon/Icon32/user_redskin.png b/asset/icon/Icon32/user_redskin.png new file mode 100644 index 0000000..dc02dc1 Binary files /dev/null and b/asset/icon/Icon32/user_redskin.png differ diff --git a/asset/icon/Icon32/user_robocop.png b/asset/icon/Icon32/user_robocop.png new file mode 100644 index 0000000..b6c560d Binary files /dev/null and b/asset/icon/Icon32/user_robocop.png differ diff --git a/asset/icon/Icon32/user_sailor.png b/asset/icon/Icon32/user_sailor.png new file mode 100644 index 0000000..fe66038 Binary files /dev/null and b/asset/icon/Icon32/user_sailor.png differ diff --git a/asset/icon/Icon32/user_sailor_black.png b/asset/icon/Icon32/user_sailor_black.png new file mode 100644 index 0000000..6087c70 Binary files /dev/null and b/asset/icon/Icon32/user_sailor_black.png differ diff --git a/asset/icon/Icon32/user_samurai.png b/asset/icon/Icon32/user_samurai.png new file mode 100644 index 0000000..a24ea22 Binary files /dev/null and b/asset/icon/Icon32/user_samurai.png differ diff --git a/asset/icon/Icon32/user_scream.png b/asset/icon/Icon32/user_scream.png new file mode 100644 index 0000000..061d5fb Binary files /dev/null and b/asset/icon/Icon32/user_scream.png differ diff --git a/asset/icon/Icon32/user_silhouette.png b/asset/icon/Icon32/user_silhouette.png new file mode 100644 index 0000000..109d113 Binary files /dev/null and b/asset/icon/Icon32/user_silhouette.png differ diff --git a/asset/icon/Icon32/user_soldier.png b/asset/icon/Icon32/user_soldier.png new file mode 100644 index 0000000..e03a055 Binary files /dev/null and b/asset/icon/Icon32/user_soldier.png differ diff --git a/asset/icon/Icon32/user_spiderman.png b/asset/icon/Icon32/user_spiderman.png new file mode 100644 index 0000000..f0f189c Binary files /dev/null and b/asset/icon/Icon32/user_spiderman.png differ diff --git a/asset/icon/Icon32/user_sponge_bob.png b/asset/icon/Icon32/user_sponge_bob.png new file mode 100644 index 0000000..45e1fda Binary files /dev/null and b/asset/icon/Icon32/user_sponge_bob.png differ diff --git a/asset/icon/Icon32/user_squidward.png b/asset/icon/Icon32/user_squidward.png new file mode 100644 index 0000000..7f6a735 Binary files /dev/null and b/asset/icon/Icon32/user_squidward.png differ diff --git a/asset/icon/Icon32/user_stewardess.png b/asset/icon/Icon32/user_stewardess.png new file mode 100644 index 0000000..4f92957 Binary files /dev/null and b/asset/icon/Icon32/user_stewardess.png differ diff --git a/asset/icon/Icon32/user_stewardess_black.png b/asset/icon/Icon32/user_stewardess_black.png new file mode 100644 index 0000000..e5c57c7 Binary files /dev/null and b/asset/icon/Icon32/user_stewardess_black.png differ diff --git a/asset/icon/Icon32/user_striper.png b/asset/icon/Icon32/user_striper.png new file mode 100644 index 0000000..6753af0 Binary files /dev/null and b/asset/icon/Icon32/user_striper.png differ diff --git a/asset/icon/Icon32/user_striper_black.png b/asset/icon/Icon32/user_striper_black.png new file mode 100644 index 0000000..f93712c Binary files /dev/null and b/asset/icon/Icon32/user_striper_black.png differ diff --git a/asset/icon/Icon32/user_student.png b/asset/icon/Icon32/user_student.png new file mode 100644 index 0000000..dde1853 Binary files /dev/null and b/asset/icon/Icon32/user_student.png differ diff --git a/asset/icon/Icon32/user_student_black.png b/asset/icon/Icon32/user_student_black.png new file mode 100644 index 0000000..255adb5 Binary files /dev/null and b/asset/icon/Icon32/user_student_black.png differ diff --git a/asset/icon/Icon32/user_student_female.png b/asset/icon/Icon32/user_student_female.png new file mode 100644 index 0000000..15e526f Binary files /dev/null and b/asset/icon/Icon32/user_student_female.png differ diff --git a/asset/icon/Icon32/user_student_female_black.png b/asset/icon/Icon32/user_student_female_black.png new file mode 100644 index 0000000..c07080c Binary files /dev/null and b/asset/icon/Icon32/user_student_female_black.png differ diff --git a/asset/icon/Icon32/user_suit.png b/asset/icon/Icon32/user_suit.png new file mode 100644 index 0000000..bf9321d Binary files /dev/null and b/asset/icon/Icon32/user_suit.png differ diff --git a/asset/icon/Icon32/user_superman.png b/asset/icon/Icon32/user_superman.png new file mode 100644 index 0000000..6805ec8 Binary files /dev/null and b/asset/icon/Icon32/user_superman.png differ diff --git a/asset/icon/Icon32/user_swimmer.png b/asset/icon/Icon32/user_swimmer.png new file mode 100644 index 0000000..595aca2 Binary files /dev/null and b/asset/icon/Icon32/user_swimmer.png differ diff --git a/asset/icon/Icon32/user_swimmer_black.png b/asset/icon/Icon32/user_swimmer_black.png new file mode 100644 index 0000000..62f5f35 Binary files /dev/null and b/asset/icon/Icon32/user_swimmer_black.png differ diff --git a/asset/icon/Icon32/user_swimmer_female.png b/asset/icon/Icon32/user_swimmer_female.png new file mode 100644 index 0000000..82556b9 Binary files /dev/null and b/asset/icon/Icon32/user_swimmer_female.png differ diff --git a/asset/icon/Icon32/user_trooper.png b/asset/icon/Icon32/user_trooper.png new file mode 100644 index 0000000..f9a2ed5 Binary files /dev/null and b/asset/icon/Icon32/user_trooper.png differ diff --git a/asset/icon/Icon32/user_trooper_captain.png b/asset/icon/Icon32/user_trooper_captain.png new file mode 100644 index 0000000..d99bff7 Binary files /dev/null and b/asset/icon/Icon32/user_trooper_captain.png differ diff --git a/asset/icon/Icon32/user_vietnamese.png b/asset/icon/Icon32/user_vietnamese.png new file mode 100644 index 0000000..20e7671 Binary files /dev/null and b/asset/icon/Icon32/user_vietnamese.png differ diff --git a/asset/icon/Icon32/user_vietnamese_female.png b/asset/icon/Icon32/user_vietnamese_female.png new file mode 100644 index 0000000..614b076 Binary files /dev/null and b/asset/icon/Icon32/user_vietnamese_female.png differ diff --git a/asset/icon/Icon32/user_viking.png b/asset/icon/Icon32/user_viking.png new file mode 100644 index 0000000..65f83f4 Binary files /dev/null and b/asset/icon/Icon32/user_viking.png differ diff --git a/asset/icon/Icon32/user_viking_female.png b/asset/icon/Icon32/user_viking_female.png new file mode 100644 index 0000000..9e3ff20 Binary files /dev/null and b/asset/icon/Icon32/user_viking_female.png differ diff --git a/asset/icon/Icon32/user_waiter.png b/asset/icon/Icon32/user_waiter.png new file mode 100644 index 0000000..de7bf33 Binary files /dev/null and b/asset/icon/Icon32/user_waiter.png differ diff --git a/asset/icon/Icon32/user_waiter_female.png b/asset/icon/Icon32/user_waiter_female.png new file mode 100644 index 0000000..8094dc3 Binary files /dev/null and b/asset/icon/Icon32/user_waiter_female.png differ diff --git a/asset/icon/Icon32/user_waiter_female_black.png b/asset/icon/Icon32/user_waiter_female_black.png new file mode 100644 index 0000000..40b6514 Binary files /dev/null and b/asset/icon/Icon32/user_waiter_female_black.png differ diff --git a/asset/icon/Icon32/user_wicket.png b/asset/icon/Icon32/user_wicket.png new file mode 100644 index 0000000..5291389 Binary files /dev/null and b/asset/icon/Icon32/user_wicket.png differ diff --git a/asset/icon/Icon32/user_yoda.png b/asset/icon/Icon32/user_yoda.png new file mode 100644 index 0000000..39676ec Binary files /dev/null and b/asset/icon/Icon32/user_yoda.png differ diff --git a/asset/icon/Icon32/user_zorro.png b/asset/icon/Icon32/user_zorro.png new file mode 100644 index 0000000..42f2db2 Binary files /dev/null and b/asset/icon/Icon32/user_zorro.png differ diff --git a/asset/icon/Icon32/validation.png b/asset/icon/Icon32/validation.png new file mode 100644 index 0000000..4c3048b Binary files /dev/null and b/asset/icon/Icon32/validation.png differ diff --git a/asset/icon/Icon32/validation_document.png b/asset/icon/Icon32/validation_document.png new file mode 100644 index 0000000..bf6157f Binary files /dev/null and b/asset/icon/Icon32/validation_document.png differ diff --git a/asset/icon/Icon32/validation_invalid.png b/asset/icon/Icon32/validation_invalid.png new file mode 100644 index 0000000..1dce721 Binary files /dev/null and b/asset/icon/Icon32/validation_invalid.png differ diff --git a/asset/icon/Icon32/validation_invalid_document.png b/asset/icon/Icon32/validation_invalid_document.png new file mode 100644 index 0000000..43e0872 Binary files /dev/null and b/asset/icon/Icon32/validation_invalid_document.png differ diff --git a/asset/icon/Icon32/validation_label.png b/asset/icon/Icon32/validation_label.png new file mode 100644 index 0000000..89f9cde Binary files /dev/null and b/asset/icon/Icon32/validation_label.png differ diff --git a/asset/icon/Icon32/validation_label_html.png b/asset/icon/Icon32/validation_label_html.png new file mode 100644 index 0000000..ebaff10 Binary files /dev/null and b/asset/icon/Icon32/validation_label_html.png differ diff --git a/asset/icon/Icon32/validation_label_html5.png b/asset/icon/Icon32/validation_label_html5.png new file mode 100644 index 0000000..ef7916b Binary files /dev/null and b/asset/icon/Icon32/validation_label_html5.png differ diff --git a/asset/icon/Icon32/validation_valid.png b/asset/icon/Icon32/validation_valid.png new file mode 100644 index 0000000..2a11f0b Binary files /dev/null and b/asset/icon/Icon32/validation_valid.png differ diff --git a/asset/icon/Icon32/validation_valid_document.png b/asset/icon/Icon32/validation_valid_document.png new file mode 100644 index 0000000..7863f42 Binary files /dev/null and b/asset/icon/Icon32/validation_valid_document.png differ diff --git a/asset/icon/Icon32/vase.png b/asset/icon/Icon32/vase.png new file mode 100644 index 0000000..b554a1a Binary files /dev/null and b/asset/icon/Icon32/vase.png differ diff --git a/asset/icon/Icon32/vbox.png b/asset/icon/Icon32/vbox.png new file mode 100644 index 0000000..482709e Binary files /dev/null and b/asset/icon/Icon32/vbox.png differ diff --git a/asset/icon/Icon32/vcard.png b/asset/icon/Icon32/vcard.png new file mode 100644 index 0000000..63edef6 Binary files /dev/null and b/asset/icon/Icon32/vcard.png differ diff --git a/asset/icon/Icon32/vcard_add.png b/asset/icon/Icon32/vcard_add.png new file mode 100644 index 0000000..456bb44 Binary files /dev/null and b/asset/icon/Icon32/vcard_add.png differ diff --git a/asset/icon/Icon32/vcard_delete.png b/asset/icon/Icon32/vcard_delete.png new file mode 100644 index 0000000..cdba1ec Binary files /dev/null and b/asset/icon/Icon32/vcard_delete.png differ diff --git a/asset/icon/Icon32/vcard_edit.png b/asset/icon/Icon32/vcard_edit.png new file mode 100644 index 0000000..e27dfa5 Binary files /dev/null and b/asset/icon/Icon32/vcard_edit.png differ diff --git a/asset/icon/Icon32/vdividedbox.png b/asset/icon/Icon32/vdividedbox.png new file mode 100644 index 0000000..6c3c5e1 Binary files /dev/null and b/asset/icon/Icon32/vdividedbox.png differ diff --git a/asset/icon/Icon32/vector.png b/asset/icon/Icon32/vector.png new file mode 100644 index 0000000..7528afc Binary files /dev/null and b/asset/icon/Icon32/vector.png differ diff --git a/asset/icon/Icon32/vector_add.png b/asset/icon/Icon32/vector_add.png new file mode 100644 index 0000000..0b4b8cc Binary files /dev/null and b/asset/icon/Icon32/vector_add.png differ diff --git a/asset/icon/Icon32/vector_delete.png b/asset/icon/Icon32/vector_delete.png new file mode 100644 index 0000000..ac4c639 Binary files /dev/null and b/asset/icon/Icon32/vector_delete.png differ diff --git a/asset/icon/Icon32/vhs.png b/asset/icon/Icon32/vhs.png new file mode 100644 index 0000000..cd20ce0 Binary files /dev/null and b/asset/icon/Icon32/vhs.png differ diff --git a/asset/icon/Icon32/viddler.png b/asset/icon/Icon32/viddler.png new file mode 100644 index 0000000..bc55f47 Binary files /dev/null and b/asset/icon/Icon32/viddler.png differ diff --git a/asset/icon/Icon32/video.png b/asset/icon/Icon32/video.png new file mode 100644 index 0000000..46531e8 Binary files /dev/null and b/asset/icon/Icon32/video.png differ diff --git a/asset/icon/Icon32/video_mode.png b/asset/icon/Icon32/video_mode.png new file mode 100644 index 0000000..e5ee86c Binary files /dev/null and b/asset/icon/Icon32/video_mode.png differ diff --git a/asset/icon/Icon32/videodisplay.png b/asset/icon/Icon32/videodisplay.png new file mode 100644 index 0000000..0972f28 Binary files /dev/null and b/asset/icon/Icon32/videodisplay.png differ diff --git a/asset/icon/Icon32/view_available_locales.png b/asset/icon/Icon32/view_available_locales.png new file mode 100644 index 0000000..28fbb22 Binary files /dev/null and b/asset/icon/Icon32/view_available_locales.png differ diff --git a/asset/icon/Icon32/view_bandwidth_usage.png b/asset/icon/Icon32/view_bandwidth_usage.png new file mode 100644 index 0000000..22afb50 Binary files /dev/null and b/asset/icon/Icon32/view_bandwidth_usage.png differ diff --git a/asset/icon/Icon32/view_relayers.png b/asset/icon/Icon32/view_relayers.png new file mode 100644 index 0000000..5561b6d Binary files /dev/null and b/asset/icon/Icon32/view_relayers.png differ diff --git a/asset/icon/Icon32/view_sent_summary.png b/asset/icon/Icon32/view_sent_summary.png new file mode 100644 index 0000000..d0a1277 Binary files /dev/null and b/asset/icon/Icon32/view_sent_summary.png differ diff --git a/asset/icon/Icon32/view_side_by_side.png b/asset/icon/Icon32/view_side_by_side.png new file mode 100644 index 0000000..d787cbe Binary files /dev/null and b/asset/icon/Icon32/view_side_by_side.png differ diff --git a/asset/icon/Icon32/viewstack.png b/asset/icon/Icon32/viewstack.png new file mode 100644 index 0000000..4d99ab0 Binary files /dev/null and b/asset/icon/Icon32/viewstack.png differ diff --git a/asset/icon/Icon32/vimeo.png b/asset/icon/Icon32/vimeo.png new file mode 100644 index 0000000..8eb2995 Binary files /dev/null and b/asset/icon/Icon32/vimeo.png differ diff --git a/asset/icon/Icon32/virb.png b/asset/icon/Icon32/virb.png new file mode 100644 index 0000000..72a37a0 Binary files /dev/null and b/asset/icon/Icon32/virb.png differ diff --git a/asset/icon/Icon32/virus_protection.png b/asset/icon/Icon32/virus_protection.png new file mode 100644 index 0000000..292d2bf Binary files /dev/null and b/asset/icon/Icon32/virus_protection.png differ diff --git a/asset/icon/Icon32/visa.png b/asset/icon/Icon32/visa.png new file mode 100644 index 0000000..235f0f2 Binary files /dev/null and b/asset/icon/Icon32/visa.png differ diff --git a/asset/icon/Icon32/visa_2.png b/asset/icon/Icon32/visa_2.png new file mode 100644 index 0000000..04a3266 Binary files /dev/null and b/asset/icon/Icon32/visa_2.png differ diff --git a/asset/icon/Icon32/visa_electron.png b/asset/icon/Icon32/visa_electron.png new file mode 100644 index 0000000..9044a89 Binary files /dev/null and b/asset/icon/Icon32/visa_electron.png differ diff --git a/asset/icon/Icon32/visual_basic.png b/asset/icon/Icon32/visual_basic.png new file mode 100644 index 0000000..6f3e28c Binary files /dev/null and b/asset/icon/Icon32/visual_basic.png differ diff --git a/asset/icon/Icon32/vlc.png b/asset/icon/Icon32/vlc.png new file mode 100644 index 0000000..303c68d Binary files /dev/null and b/asset/icon/Icon32/vlc.png differ diff --git a/asset/icon/Icon32/vrule.png b/asset/icon/Icon32/vrule.png new file mode 100644 index 0000000..afada4b Binary files /dev/null and b/asset/icon/Icon32/vrule.png differ diff --git a/asset/icon/Icon32/vslider.png b/asset/icon/Icon32/vslider.png new file mode 100644 index 0000000..eb435e7 Binary files /dev/null and b/asset/icon/Icon32/vslider.png differ diff --git a/asset/icon/Icon32/walk.png b/asset/icon/Icon32/walk.png new file mode 100644 index 0000000..aa1ec75 Binary files /dev/null and b/asset/icon/Icon32/walk.png differ diff --git a/asset/icon/Icon32/wall.png b/asset/icon/Icon32/wall.png new file mode 100644 index 0000000..f43e78e Binary files /dev/null and b/asset/icon/Icon32/wall.png differ diff --git a/asset/icon/Icon32/wall_breack.png b/asset/icon/Icon32/wall_breack.png new file mode 100644 index 0000000..36d0e96 Binary files /dev/null and b/asset/icon/Icon32/wall_breack.png differ diff --git a/asset/icon/Icon32/wallet.png b/asset/icon/Icon32/wallet.png new file mode 100644 index 0000000..e22316b Binary files /dev/null and b/asset/icon/Icon32/wallet.png differ diff --git a/asset/icon/Icon32/wand.png b/asset/icon/Icon32/wand.png new file mode 100644 index 0000000..9b88b4f Binary files /dev/null and b/asset/icon/Icon32/wand.png differ diff --git a/asset/icon/Icon32/warning.png b/asset/icon/Icon32/warning.png new file mode 100644 index 0000000..311e726 Binary files /dev/null and b/asset/icon/Icon32/warning.png differ diff --git a/asset/icon/Icon32/watch_window.png b/asset/icon/Icon32/watch_window.png new file mode 100644 index 0000000..1b3f820 Binary files /dev/null and b/asset/icon/Icon32/watch_window.png differ diff --git a/asset/icon/Icon32/watermark(2).png b/asset/icon/Icon32/watermark(2).png new file mode 100644 index 0000000..1f0e007 Binary files /dev/null and b/asset/icon/Icon32/watermark(2).png differ diff --git a/asset/icon/Icon32/watermark.png b/asset/icon/Icon32/watermark.png new file mode 100644 index 0000000..80991d4 Binary files /dev/null and b/asset/icon/Icon32/watermark.png differ diff --git a/asset/icon/Icon32/weather_clouds.png b/asset/icon/Icon32/weather_clouds.png new file mode 100644 index 0000000..43b143e Binary files /dev/null and b/asset/icon/Icon32/weather_clouds.png differ diff --git a/asset/icon/Icon32/weather_cloudy.png b/asset/icon/Icon32/weather_cloudy.png new file mode 100644 index 0000000..e745035 Binary files /dev/null and b/asset/icon/Icon32/weather_cloudy.png differ diff --git a/asset/icon/Icon32/weather_lightning.png b/asset/icon/Icon32/weather_lightning.png new file mode 100644 index 0000000..18ba507 Binary files /dev/null and b/asset/icon/Icon32/weather_lightning.png differ diff --git a/asset/icon/Icon32/weather_moon_cloudy.png b/asset/icon/Icon32/weather_moon_cloudy.png new file mode 100644 index 0000000..118c9d5 Binary files /dev/null and b/asset/icon/Icon32/weather_moon_cloudy.png differ diff --git a/asset/icon/Icon32/weather_moon_fog.png b/asset/icon/Icon32/weather_moon_fog.png new file mode 100644 index 0000000..10ea34b Binary files /dev/null and b/asset/icon/Icon32/weather_moon_fog.png differ diff --git a/asset/icon/Icon32/weather_moon_half.png b/asset/icon/Icon32/weather_moon_half.png new file mode 100644 index 0000000..0a27ec2 Binary files /dev/null and b/asset/icon/Icon32/weather_moon_half.png differ diff --git a/asset/icon/Icon32/weather_rain.png b/asset/icon/Icon32/weather_rain.png new file mode 100644 index 0000000..2e659cd Binary files /dev/null and b/asset/icon/Icon32/weather_rain.png differ diff --git a/asset/icon/Icon32/weather_rain_little.png b/asset/icon/Icon32/weather_rain_little.png new file mode 100644 index 0000000..36fdeaa Binary files /dev/null and b/asset/icon/Icon32/weather_rain_little.png differ diff --git a/asset/icon/Icon32/weather_snow.png b/asset/icon/Icon32/weather_snow.png new file mode 100644 index 0000000..edfed19 Binary files /dev/null and b/asset/icon/Icon32/weather_snow.png differ diff --git a/asset/icon/Icon32/weather_snow_little.png b/asset/icon/Icon32/weather_snow_little.png new file mode 100644 index 0000000..34a84fd Binary files /dev/null and b/asset/icon/Icon32/weather_snow_little.png differ diff --git a/asset/icon/Icon32/weather_sun.png b/asset/icon/Icon32/weather_sun.png new file mode 100644 index 0000000..d9f87a5 Binary files /dev/null and b/asset/icon/Icon32/weather_sun.png differ diff --git a/asset/icon/Icon32/weather_sun_fog.png b/asset/icon/Icon32/weather_sun_fog.png new file mode 100644 index 0000000..bb00ff5 Binary files /dev/null and b/asset/icon/Icon32/weather_sun_fog.png differ diff --git a/asset/icon/Icon32/web_concierge.png b/asset/icon/Icon32/web_concierge.png new file mode 100644 index 0000000..3ec4d78 Binary files /dev/null and b/asset/icon/Icon32/web_concierge.png differ diff --git a/asset/icon/Icon32/web_disk.png b/asset/icon/Icon32/web_disk.png new file mode 100644 index 0000000..111269b Binary files /dev/null and b/asset/icon/Icon32/web_disk.png differ diff --git a/asset/icon/Icon32/web_layout.png b/asset/icon/Icon32/web_layout.png new file mode 100644 index 0000000..0519299 Binary files /dev/null and b/asset/icon/Icon32/web_layout.png differ diff --git a/asset/icon/Icon32/web_template_editor.png b/asset/icon/Icon32/web_template_editor.png new file mode 100644 index 0000000..6aeafee Binary files /dev/null and b/asset/icon/Icon32/web_template_editor.png differ diff --git a/asset/icon/Icon32/webalizer_ftp.png b/asset/icon/Icon32/webalizer_ftp.png new file mode 100644 index 0000000..0e19a19 Binary files /dev/null and b/asset/icon/Icon32/webalizer_ftp.png differ diff --git a/asset/icon/Icon32/webcam.png b/asset/icon/Icon32/webcam.png new file mode 100644 index 0000000..64c1101 Binary files /dev/null and b/asset/icon/Icon32/webcam.png differ diff --git a/asset/icon/Icon32/webcam_add.png b/asset/icon/Icon32/webcam_add.png new file mode 100644 index 0000000..5c3a862 Binary files /dev/null and b/asset/icon/Icon32/webcam_add.png differ diff --git a/asset/icon/Icon32/webcam_delete.png b/asset/icon/Icon32/webcam_delete.png new file mode 100644 index 0000000..def7446 Binary files /dev/null and b/asset/icon/Icon32/webcam_delete.png differ diff --git a/asset/icon/Icon32/webcam_error.png b/asset/icon/Icon32/webcam_error.png new file mode 100644 index 0000000..2453ef6 Binary files /dev/null and b/asset/icon/Icon32/webcam_error.png differ diff --git a/asset/icon/Icon32/webhost_manager.png b/asset/icon/Icon32/webhost_manager.png new file mode 100644 index 0000000..57b4289 Binary files /dev/null and b/asset/icon/Icon32/webhost_manager.png differ diff --git a/asset/icon/Icon32/webmail.png b/asset/icon/Icon32/webmail.png new file mode 100644 index 0000000..a812bd0 Binary files /dev/null and b/asset/icon/Icon32/webmail.png differ diff --git a/asset/icon/Icon32/weighing_mashine.png b/asset/icon/Icon32/weighing_mashine.png new file mode 100644 index 0000000..530207b Binary files /dev/null and b/asset/icon/Icon32/weighing_mashine.png differ diff --git a/asset/icon/Icon32/weight.png b/asset/icon/Icon32/weight.png new file mode 100644 index 0000000..f13a01d Binary files /dev/null and b/asset/icon/Icon32/weight.png differ diff --git a/asset/icon/Icon32/what_if_analysis.png b/asset/icon/Icon32/what_if_analysis.png new file mode 100644 index 0000000..18d97bf Binary files /dev/null and b/asset/icon/Icon32/what_if_analysis.png differ diff --git a/asset/icon/Icon32/whistle.png b/asset/icon/Icon32/whistle.png new file mode 100644 index 0000000..cda2e22 Binary files /dev/null and b/asset/icon/Icon32/whistle.png differ diff --git a/asset/icon/Icon32/wi_fi.png b/asset/icon/Icon32/wi_fi.png new file mode 100644 index 0000000..75d3b71 Binary files /dev/null and b/asset/icon/Icon32/wi_fi.png differ diff --git a/asset/icon/Icon32/wi_fi_zone.png b/asset/icon/Icon32/wi_fi_zone.png new file mode 100644 index 0000000..f1aee72 Binary files /dev/null and b/asset/icon/Icon32/wi_fi_zone.png differ diff --git a/asset/icon/Icon32/widescreen.png b/asset/icon/Icon32/widescreen.png new file mode 100644 index 0000000..60042ac Binary files /dev/null and b/asset/icon/Icon32/widescreen.png differ diff --git a/asset/icon/Icon32/widgets.png b/asset/icon/Icon32/widgets.png new file mode 100644 index 0000000..73e67cf Binary files /dev/null and b/asset/icon/Icon32/widgets.png differ diff --git a/asset/icon/Icon32/windy.png b/asset/icon/Icon32/windy.png new file mode 100644 index 0000000..3aa004f Binary files /dev/null and b/asset/icon/Icon32/windy.png differ diff --git a/asset/icon/Icon32/wine_pairings.png b/asset/icon/Icon32/wine_pairings.png new file mode 100644 index 0000000..e9bf24e Binary files /dev/null and b/asset/icon/Icon32/wine_pairings.png differ diff --git a/asset/icon/Icon32/winrar_add.png b/asset/icon/Icon32/winrar_add.png new file mode 100644 index 0000000..4c5b43f Binary files /dev/null and b/asset/icon/Icon32/winrar_add.png differ diff --git a/asset/icon/Icon32/winrar_extract.png b/asset/icon/Icon32/winrar_extract.png new file mode 100644 index 0000000..f5552c2 Binary files /dev/null and b/asset/icon/Icon32/winrar_extract.png differ diff --git a/asset/icon/Icon32/winrar_view.png b/asset/icon/Icon32/winrar_view.png new file mode 100644 index 0000000..3ec3b43 Binary files /dev/null and b/asset/icon/Icon32/winrar_view.png differ diff --git a/asset/icon/Icon32/wishlist_add.png b/asset/icon/Icon32/wishlist_add.png new file mode 100644 index 0000000..2251c34 Binary files /dev/null and b/asset/icon/Icon32/wishlist_add.png differ diff --git a/asset/icon/Icon32/wizard.png b/asset/icon/Icon32/wizard.png new file mode 100644 index 0000000..e4b1e77 Binary files /dev/null and b/asset/icon/Icon32/wizard.png differ diff --git a/asset/icon/Icon32/wizard_women.png b/asset/icon/Icon32/wizard_women.png new file mode 100644 index 0000000..26b086c Binary files /dev/null and b/asset/icon/Icon32/wizard_women.png differ diff --git a/asset/icon/Icon32/word_count.png b/asset/icon/Icon32/word_count.png new file mode 100644 index 0000000..fcf41bd Binary files /dev/null and b/asset/icon/Icon32/word_count.png differ diff --git a/asset/icon/Icon32/word_exports.png b/asset/icon/Icon32/word_exports.png new file mode 100644 index 0000000..7a2eb22 Binary files /dev/null and b/asset/icon/Icon32/word_exports.png differ diff --git a/asset/icon/Icon32/word_imports.png b/asset/icon/Icon32/word_imports.png new file mode 100644 index 0000000..4082bc2 Binary files /dev/null and b/asset/icon/Icon32/word_imports.png differ diff --git a/asset/icon/Icon32/word_wrap.png b/asset/icon/Icon32/word_wrap.png new file mode 100644 index 0000000..0b4eb43 Binary files /dev/null and b/asset/icon/Icon32/word_wrap.png differ diff --git a/asset/icon/Icon32/wordpress.png b/asset/icon/Icon32/wordpress.png new file mode 100644 index 0000000..ce600c0 Binary files /dev/null and b/asset/icon/Icon32/wordpress.png differ diff --git a/asset/icon/Icon32/wordpress_blog.png b/asset/icon/Icon32/wordpress_blog.png new file mode 100644 index 0000000..a698212 Binary files /dev/null and b/asset/icon/Icon32/wordpress_blog.png differ diff --git a/asset/icon/Icon32/workspace.png b/asset/icon/Icon32/workspace.png new file mode 100644 index 0000000..9845043 Binary files /dev/null and b/asset/icon/Icon32/workspace.png differ diff --git a/asset/icon/Icon32/world.png b/asset/icon/Icon32/world.png new file mode 100644 index 0000000..644d9d5 Binary files /dev/null and b/asset/icon/Icon32/world.png differ diff --git a/asset/icon/Icon32/world_add.png b/asset/icon/Icon32/world_add.png new file mode 100644 index 0000000..159b50f Binary files /dev/null and b/asset/icon/Icon32/world_add.png differ diff --git a/asset/icon/Icon32/world_delete.png b/asset/icon/Icon32/world_delete.png new file mode 100644 index 0000000..4a94c97 Binary files /dev/null and b/asset/icon/Icon32/world_delete.png differ diff --git a/asset/icon/Icon32/world_edit.png b/asset/icon/Icon32/world_edit.png new file mode 100644 index 0000000..8304b7f Binary files /dev/null and b/asset/icon/Icon32/world_edit.png differ diff --git a/asset/icon/Icon32/world_go.png b/asset/icon/Icon32/world_go.png new file mode 100644 index 0000000..7b800f1 Binary files /dev/null and b/asset/icon/Icon32/world_go.png differ diff --git a/asset/icon/Icon32/world_link.png b/asset/icon/Icon32/world_link.png new file mode 100644 index 0000000..5c1384a Binary files /dev/null and b/asset/icon/Icon32/world_link.png differ diff --git a/asset/icon/Icon32/wrapping_behind.png b/asset/icon/Icon32/wrapping_behind.png new file mode 100644 index 0000000..f4ad3f0 Binary files /dev/null and b/asset/icon/Icon32/wrapping_behind.png differ diff --git a/asset/icon/Icon32/wrapping_between.png b/asset/icon/Icon32/wrapping_between.png new file mode 100644 index 0000000..810c0d2 Binary files /dev/null and b/asset/icon/Icon32/wrapping_between.png differ diff --git a/asset/icon/Icon32/wrapping_edit.png b/asset/icon/Icon32/wrapping_edit.png new file mode 100644 index 0000000..8305d82 Binary files /dev/null and b/asset/icon/Icon32/wrapping_edit.png differ diff --git a/asset/icon/Icon32/wrapping_in_front.png b/asset/icon/Icon32/wrapping_in_front.png new file mode 100644 index 0000000..04ee96f Binary files /dev/null and b/asset/icon/Icon32/wrapping_in_front.png differ diff --git a/asset/icon/Icon32/wrapping_inline.png b/asset/icon/Icon32/wrapping_inline.png new file mode 100644 index 0000000..7519e7e Binary files /dev/null and b/asset/icon/Icon32/wrapping_inline.png differ diff --git a/asset/icon/Icon32/wrapping_magazine.png b/asset/icon/Icon32/wrapping_magazine.png new file mode 100644 index 0000000..ed4b9bc Binary files /dev/null and b/asset/icon/Icon32/wrapping_magazine.png differ diff --git a/asset/icon/Icon32/wrapping_square.png b/asset/icon/Icon32/wrapping_square.png new file mode 100644 index 0000000..e32f947 Binary files /dev/null and b/asset/icon/Icon32/wrapping_square.png differ diff --git a/asset/icon/Icon32/wrapping_tight.png b/asset/icon/Icon32/wrapping_tight.png new file mode 100644 index 0000000..abc8df9 Binary files /dev/null and b/asset/icon/Icon32/wrapping_tight.png differ diff --git a/asset/icon/Icon32/wrench.png b/asset/icon/Icon32/wrench.png new file mode 100644 index 0000000..f6e19eb Binary files /dev/null and b/asset/icon/Icon32/wrench.png differ diff --git a/asset/icon/Icon32/wrench_orange.png b/asset/icon/Icon32/wrench_orange.png new file mode 100644 index 0000000..f019d0b Binary files /dev/null and b/asset/icon/Icon32/wrench_orange.png differ diff --git a/asset/icon/Icon32/www_page.png b/asset/icon/Icon32/www_page.png new file mode 100644 index 0000000..38a1029 Binary files /dev/null and b/asset/icon/Icon32/www_page.png differ diff --git a/asset/icon/Icon32/x_ray.png b/asset/icon/Icon32/x_ray.png new file mode 100644 index 0000000..f8ac0f4 Binary files /dev/null and b/asset/icon/Icon32/x_ray.png differ diff --git a/asset/icon/Icon32/xfn.png b/asset/icon/Icon32/xfn.png new file mode 100644 index 0000000..ea49709 Binary files /dev/null and b/asset/icon/Icon32/xfn.png differ diff --git a/asset/icon/Icon32/xhtml.png b/asset/icon/Icon32/xhtml.png new file mode 100644 index 0000000..a1b9bd0 Binary files /dev/null and b/asset/icon/Icon32/xhtml.png differ diff --git a/asset/icon/Icon32/xhtml_add.png b/asset/icon/Icon32/xhtml_add.png new file mode 100644 index 0000000..562f3d7 Binary files /dev/null and b/asset/icon/Icon32/xhtml_add.png differ diff --git a/asset/icon/Icon32/xhtml_delete.png b/asset/icon/Icon32/xhtml_delete.png new file mode 100644 index 0000000..eb44af3 Binary files /dev/null and b/asset/icon/Icon32/xhtml_delete.png differ diff --git a/asset/icon/Icon32/xhtml_go.png b/asset/icon/Icon32/xhtml_go.png new file mode 100644 index 0000000..5e57cdd Binary files /dev/null and b/asset/icon/Icon32/xhtml_go.png differ diff --git a/asset/icon/Icon32/xhtml_valid.png b/asset/icon/Icon32/xhtml_valid.png new file mode 100644 index 0000000..1938938 Binary files /dev/null and b/asset/icon/Icon32/xhtml_valid.png differ diff --git a/asset/icon/Icon32/xing.png b/asset/icon/Icon32/xing.png new file mode 100644 index 0000000..5c037ca Binary files /dev/null and b/asset/icon/Icon32/xing.png differ diff --git a/asset/icon/Icon32/xml_exports.png b/asset/icon/Icon32/xml_exports.png new file mode 100644 index 0000000..afc0357 Binary files /dev/null and b/asset/icon/Icon32/xml_exports.png differ diff --git a/asset/icon/Icon32/xml_imports.png b/asset/icon/Icon32/xml_imports.png new file mode 100644 index 0000000..dbdca9b Binary files /dev/null and b/asset/icon/Icon32/xml_imports.png differ diff --git a/asset/icon/Icon32/yacht.png b/asset/icon/Icon32/yacht.png new file mode 100644 index 0000000..80d07aa Binary files /dev/null and b/asset/icon/Icon32/yacht.png differ diff --git a/asset/icon/Icon32/yahoo_messenger.png b/asset/icon/Icon32/yahoo_messenger.png new file mode 100644 index 0000000..d1801aa Binary files /dev/null and b/asset/icon/Icon32/yahoo_messenger.png differ diff --git a/asset/icon/Icon32/yellow_submarine.png b/asset/icon/Icon32/yellow_submarine.png new file mode 100644 index 0000000..c916e32 Binary files /dev/null and b/asset/icon/Icon32/yellow_submarine.png differ diff --git a/asset/icon/Icon32/yelp.png b/asset/icon/Icon32/yelp.png new file mode 100644 index 0000000..a44ee5f Binary files /dev/null and b/asset/icon/Icon32/yelp.png differ diff --git a/asset/icon/Icon32/yin_yang.png b/asset/icon/Icon32/yin_yang.png new file mode 100644 index 0000000..3cd2a02 Binary files /dev/null and b/asset/icon/Icon32/yin_yang.png differ diff --git a/asset/icon/Icon32/youtube.png b/asset/icon/Icon32/youtube.png new file mode 100644 index 0000000..5bead8d Binary files /dev/null and b/asset/icon/Icon32/youtube.png differ diff --git a/asset/icon/Icon32/zodiac.png b/asset/icon/Icon32/zodiac.png new file mode 100644 index 0000000..ffcb7fa Binary files /dev/null and b/asset/icon/Icon32/zodiac.png differ diff --git a/asset/icon/Icon32/zodiac_aries.png b/asset/icon/Icon32/zodiac_aries.png new file mode 100644 index 0000000..fab9c01 Binary files /dev/null and b/asset/icon/Icon32/zodiac_aries.png differ diff --git a/asset/icon/Icon32/zodiac_cancer.png b/asset/icon/Icon32/zodiac_cancer.png new file mode 100644 index 0000000..afa57cf Binary files /dev/null and b/asset/icon/Icon32/zodiac_cancer.png differ diff --git a/asset/icon/Icon32/zodiac_capricorn.png b/asset/icon/Icon32/zodiac_capricorn.png new file mode 100644 index 0000000..29c13c2 Binary files /dev/null and b/asset/icon/Icon32/zodiac_capricorn.png differ diff --git a/asset/icon/Icon32/zodiac_gemini.png b/asset/icon/Icon32/zodiac_gemini.png new file mode 100644 index 0000000..f419037 Binary files /dev/null and b/asset/icon/Icon32/zodiac_gemini.png differ diff --git a/asset/icon/Icon32/zodiac_leo.png b/asset/icon/Icon32/zodiac_leo.png new file mode 100644 index 0000000..d6e7f25 Binary files /dev/null and b/asset/icon/Icon32/zodiac_leo.png differ diff --git a/asset/icon/Icon32/zodiac_libra.png b/asset/icon/Icon32/zodiac_libra.png new file mode 100644 index 0000000..b5e9c00 Binary files /dev/null and b/asset/icon/Icon32/zodiac_libra.png differ diff --git a/asset/icon/Icon32/zodiac_pisces.png b/asset/icon/Icon32/zodiac_pisces.png new file mode 100644 index 0000000..dc81a9c Binary files /dev/null and b/asset/icon/Icon32/zodiac_pisces.png differ diff --git a/asset/icon/Icon32/zodiac_sagittarius.png b/asset/icon/Icon32/zodiac_sagittarius.png new file mode 100644 index 0000000..28f74a6 Binary files /dev/null and b/asset/icon/Icon32/zodiac_sagittarius.png differ diff --git a/asset/icon/Icon32/zodiac_scorpio.png b/asset/icon/Icon32/zodiac_scorpio.png new file mode 100644 index 0000000..7394e29 Binary files /dev/null and b/asset/icon/Icon32/zodiac_scorpio.png differ diff --git a/asset/icon/Icon32/zodiac_taurus.png b/asset/icon/Icon32/zodiac_taurus.png new file mode 100644 index 0000000..d106dd3 Binary files /dev/null and b/asset/icon/Icon32/zodiac_taurus.png differ diff --git a/asset/icon/Icon32/zodiac_virgo.png b/asset/icon/Icon32/zodiac_virgo.png new file mode 100644 index 0000000..75439c4 Binary files /dev/null and b/asset/icon/Icon32/zodiac_virgo.png differ diff --git a/asset/icon/Icon32/zone.png b/asset/icon/Icon32/zone.png new file mode 100644 index 0000000..2b45907 Binary files /dev/null and b/asset/icon/Icon32/zone.png differ diff --git a/asset/icon/Icon32/zone_money.png b/asset/icon/Icon32/zone_money.png new file mode 100644 index 0000000..21a67d9 Binary files /dev/null and b/asset/icon/Icon32/zone_money.png differ diff --git a/asset/icon/Icon32/zone_resize.png b/asset/icon/Icon32/zone_resize.png new file mode 100644 index 0000000..5ff3f98 Binary files /dev/null and b/asset/icon/Icon32/zone_resize.png differ diff --git a/asset/icon/Icon32/zone_resize_actual.png b/asset/icon/Icon32/zone_resize_actual.png new file mode 100644 index 0000000..e3a154c Binary files /dev/null and b/asset/icon/Icon32/zone_resize_actual.png differ diff --git a/asset/icon/Icon32/zone_select.png b/asset/icon/Icon32/zone_select.png new file mode 100644 index 0000000..5785ccd Binary files /dev/null and b/asset/icon/Icon32/zone_select.png differ diff --git a/asset/icon/Icon32/zoom.png b/asset/icon/Icon32/zoom.png new file mode 100644 index 0000000..47d2c7e Binary files /dev/null and b/asset/icon/Icon32/zoom.png differ diff --git a/asset/icon/Icon32/zoom_actual.png b/asset/icon/Icon32/zoom_actual.png new file mode 100644 index 0000000..bf28173 Binary files /dev/null and b/asset/icon/Icon32/zoom_actual.png differ diff --git a/asset/icon/Icon32/zoom_actual_equal.png b/asset/icon/Icon32/zoom_actual_equal.png new file mode 100644 index 0000000..cb4e964 Binary files /dev/null and b/asset/icon/Icon32/zoom_actual_equal.png differ diff --git a/asset/icon/Icon32/zoom_extend.png b/asset/icon/Icon32/zoom_extend.png new file mode 100644 index 0000000..1c68409 Binary files /dev/null and b/asset/icon/Icon32/zoom_extend.png differ diff --git a/asset/icon/Icon32/zoom_fit.png b/asset/icon/Icon32/zoom_fit.png new file mode 100644 index 0000000..3edef93 Binary files /dev/null and b/asset/icon/Icon32/zoom_fit.png differ diff --git a/asset/icon/Icon32/zoom_in.png b/asset/icon/Icon32/zoom_in.png new file mode 100644 index 0000000..922c8ef Binary files /dev/null and b/asset/icon/Icon32/zoom_in.png differ diff --git a/asset/icon/Icon32/zoom_last.png b/asset/icon/Icon32/zoom_last.png new file mode 100644 index 0000000..06b2e8e Binary files /dev/null and b/asset/icon/Icon32/zoom_last.png differ diff --git a/asset/icon/Icon32/zoom_layer.png b/asset/icon/Icon32/zoom_layer.png new file mode 100644 index 0000000..95bce65 Binary files /dev/null and b/asset/icon/Icon32/zoom_layer.png differ diff --git a/asset/icon/Icon32/zoom_out.png b/asset/icon/Icon32/zoom_out.png new file mode 100644 index 0000000..afca302 Binary files /dev/null and b/asset/icon/Icon32/zoom_out.png differ diff --git a/asset/icon/Icon32/zoom_refresh.png b/asset/icon/Icon32/zoom_refresh.png new file mode 100644 index 0000000..92684b6 Binary files /dev/null and b/asset/icon/Icon32/zoom_refresh.png differ diff --git a/asset/icon/Icon32/zoom_selection.png b/asset/icon/Icon32/zoom_selection.png new file mode 100644 index 0000000..0d4f191 Binary files /dev/null and b/asset/icon/Icon32/zoom_selection.png differ diff --git a/asset/icon/Icon32/zootool.png b/asset/icon/Icon32/zootool.png new file mode 100644 index 0000000..f6c34bb Binary files /dev/null and b/asset/icon/Icon32/zootool.png differ diff --git a/asset/icon/coder/css.png b/asset/icon/coder/css.png new file mode 100644 index 0000000..bb59404 Binary files /dev/null and b/asset/icon/coder/css.png differ diff --git a/asset/icon/coder/folder.png b/asset/icon/coder/folder.png new file mode 100644 index 0000000..5ea6aa4 Binary files /dev/null and b/asset/icon/coder/folder.png differ diff --git a/asset/icon/coder/ftl.png b/asset/icon/coder/ftl.png new file mode 100644 index 0000000..e1cdc77 Binary files /dev/null and b/asset/icon/coder/ftl.png differ diff --git a/asset/icon/coder/html.png b/asset/icon/coder/html.png new file mode 100644 index 0000000..4156205 Binary files /dev/null and b/asset/icon/coder/html.png differ diff --git a/asset/icon/coder/java.png b/asset/icon/coder/java.png new file mode 100644 index 0000000..cd862af Binary files /dev/null and b/asset/icon/coder/java.png differ diff --git a/asset/icon/coder/javac.png b/asset/icon/coder/javac.png new file mode 100644 index 0000000..fcfa197 Binary files /dev/null and b/asset/icon/coder/javac.png differ diff --git a/asset/icon/coder/javaf.png b/asset/icon/coder/javaf.png new file mode 100644 index 0000000..50f507b Binary files /dev/null and b/asset/icon/coder/javaf.png differ diff --git a/asset/icon/coder/js.png b/asset/icon/coder/js.png new file mode 100644 index 0000000..373c774 Binary files /dev/null and b/asset/icon/coder/js.png differ diff --git a/asset/icon/coder/jsp.png b/asset/icon/coder/jsp.png new file mode 100644 index 0000000..2d09601 Binary files /dev/null and b/asset/icon/coder/jsp.png differ diff --git a/asset/icon/coder/others.png b/asset/icon/coder/others.png new file mode 100644 index 0000000..b96d82c Binary files /dev/null and b/asset/icon/coder/others.png differ diff --git a/asset/icon/coder/pic.png b/asset/icon/coder/pic.png new file mode 100644 index 0000000..d6dd9f3 Binary files /dev/null and b/asset/icon/coder/pic.png differ diff --git a/asset/icon/coder/properties.png b/asset/icon/coder/properties.png new file mode 100644 index 0000000..38eda87 Binary files /dev/null and b/asset/icon/coder/properties.png differ diff --git a/asset/icon/coder/resources.png b/asset/icon/coder/resources.png new file mode 100644 index 0000000..6fcc78a Binary files /dev/null and b/asset/icon/coder/resources.png differ diff --git a/asset/icon/coder/webapp.png b/asset/icon/coder/webapp.png new file mode 100644 index 0000000..697188f Binary files /dev/null and b/asset/icon/coder/webapp.png differ diff --git a/asset/icon/coder/xml.png b/asset/icon/coder/xml.png new file mode 100644 index 0000000..a46e641 Binary files /dev/null and b/asset/icon/coder/xml.png differ diff --git a/asset/icon/图标文件.txt b/asset/icon/图标文件.txt new file mode 100644 index 0000000..4736e93 --- /dev/null +++ b/asset/icon/图标文件.txt @@ -0,0 +1 @@ +警告: \ No newline at end of file diff --git a/asset/image/avatars/0.png b/asset/image/avatars/0.png new file mode 100644 index 0000000..a7e93e9 Binary files /dev/null and b/asset/image/avatars/0.png differ diff --git a/asset/image/avatars/1.png b/asset/image/avatars/1.png new file mode 100644 index 0000000..c09db41 Binary files /dev/null and b/asset/image/avatars/1.png differ diff --git a/asset/image/avatars/2.png b/asset/image/avatars/2.png new file mode 100644 index 0000000..6287f95 Binary files /dev/null and b/asset/image/avatars/2.png differ diff --git a/asset/image/jcdp/logo/logo.ico b/asset/image/jcdp/logo/logo.ico new file mode 100644 index 0000000..54a08e6 Binary files /dev/null and b/asset/image/jcdp/logo/logo.ico differ diff --git a/asset/image/jcdp/logo/logo16.png b/asset/image/jcdp/logo/logo16.png new file mode 100644 index 0000000..6db25ca Binary files /dev/null and b/asset/image/jcdp/logo/logo16.png differ diff --git a/asset/image/jcdp/logo/logo32.png b/asset/image/jcdp/logo/logo32.png new file mode 100644 index 0000000..899c374 Binary files /dev/null and b/asset/image/jcdp/logo/logo32.png differ diff --git a/asset/image/jcdp/logo/logo512.png b/asset/image/jcdp/logo/logo512.png new file mode 100644 index 0000000..6e62d9d Binary files /dev/null and b/asset/image/jcdp/logo/logo512.png differ diff --git a/asset/image/jcdp/logo/logo64.png b/asset/image/jcdp/logo/logo64.png new file mode 100644 index 0000000..7dbcc08 Binary files /dev/null and b/asset/image/jcdp/logo/logo64.png differ diff --git a/asset/image/图片资源.txt b/asset/image/图片资源.txt new file mode 100644 index 0000000..4736e93 --- /dev/null +++ b/asset/image/图片资源.txt @@ -0,0 +1 @@ +警告: \ No newline at end of file diff --git a/asset/js/cetc54/exam/exam.js b/asset/js/cetc54/exam/exam.js new file mode 100644 index 0000000..14e36e2 --- /dev/null +++ b/asset/js/cetc54/exam/exam.js @@ -0,0 +1,620 @@ +//用户答题界面 +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/exam/exam/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +var editexamPage =rootUrl + 'editexampaperPage';//编辑页面地址 +var saveUrl = rootUrl + 'save';//保存添加数据地址 +var isNotSubmitUrl = rootUrl + 'isNotSubmit';//判断是否已提交试卷是否已答题 + +var titlename;//试卷名称 +var UserEdit_id;//试卷id +var sc;//考试时长 +var counttime;//总秒钟 +var submit_flag = 0;//未提交试卷0,已提交试卷1 +var vartt; + +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + + var userTestUrl = rootUrl + 'userTestList';//用户答题-答题-查询 + + var dialogSize = {width: 800, height: '80%'};//弹出窗口大小 + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + var grid = $('#grid'); + + var pg = "";//控制考试与调研页面交替,1考试2调研 + pg = $('#pg').val(); + +//-----------------------初始化-------------------------------------- + initexamsGrid(); + // addFilter(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function initexamsGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '试卷名称|试卷类别', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + queryParams:{pg: pg}, + defaultSortField: 'edittime' + }); + } + + //初始化表单 用户答题——答题 + var formeditexamInit = function () { + + var eqlist2 = $('#eqlist2'); + + eqlist2.uiGrid({ + autoFit: true, + border: false, + colFit: true, + gridTitleFix: false, + width: "100%", + height: "80%", + showHeader: false, + icon: 'list', + pageSize: 50, + url:userTestUrl, + queryParams: {UserEdit_id: grid.uiGrid('selectedData', 'id')[0]},//从前端获取,向后台传递参数 + + defaultSortField: 'num' + }); + + // daojishi(); + + }; + + //初始化弹出窗口 用户答题——答题 + var editexam_dialog = $('#editexam_dialog').uiDialog({ + title: '新建', + icon: 'list', + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: editexamPage, + queryParams:{pg: pg}, + onLoadComplete: formeditexamInit, + onOpen: function () { + var dialogP = $('#editexam_dialog').uiDialog('getUserParam'); + var id = dialogP.id; + + setTimeout( function(){ + setStatistic(); + },100); + }, + onClose:function(){ + window.clearTimeout(vartt);//停止倒计时 + }, + onPanelResize: function () { + // setStatistic();//将计算题数和总分的方法放在了组件改变大小时触发,不合理,考虑用SQL语句初始化出来 + }, + buttons: [ + // { + // id: 'btnOK', + // label: '保存', + // style: 'button_submit', + // icons: {left: 'icon_submit'}, + // disabled: false, + // onClick: function () { + // $.uiMessagebox.confirm({ + // title: '确认操作', + // content: "保存成功!请在考试时间内及时点击提交!", + // onClose: function (value) { + // if (value){ + // submitExam(); + // } + // } + // }); + // } + // }, + { + id: 'btnOK', + label: '提交', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + var content = ""; + if(pg == "2"){ + content = "确定提交问卷吗?提交后将关闭此次调研!"; + }else{ + content = "确定提交试卷吗?提交后将关闭考试!"; + } + var TorF = isMust(); + if(TorF){ + $.uiMessagebox.confirm({ + title: '确认操作', + content: content, + onClose: function (value) { + if (value){ + $.uiLoading.show({text: '数据正在加载……',width: 140,container:$('#editexam_dialog')});//窗口加遮罩 + submitExam();//提交考试 + window.clearTimeout(vartt);//停止倒计时 + } + } + }); + } + + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + var content = ""; + if(pg == "2"){ + content = "确定关闭问卷吗?关闭问卷后将清空已作答部分!"; + }else{ + content = "确定关闭考试吗?关闭考试后将清空答案!"; + } + $.uiMessagebox.confirm({ + title: '确认操作', + content: content, + onClose: function (value) { + if (value) { + editexam_dialog.uiDialog('close'); + window.clearTimeout(vartt);//停止倒计时 + } + } + }); + } + }, + { + id: 'btnStop', + label: '暂停', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + window.clearTimeout(vartt);//停止倒计时 + alert("考试暂停!点击确定继续答题!"); + window.setTimeout("daojishi()",1000);//开始倒计时 + } + } + // { + // id: 'btnContinue', + // label: '继续答题', + // icons: {left: 'icon_submit'}, + // disabled: false, + // style: 'button_submit', + // onClick: function () { + // window.setTimeout("daojishi()",1000);//开始倒计时 + // } + // } + ] + }); + + + function addEvents() { + + //答题 + $('#btn1').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + UserEdit_id = ids[0]; + //console.log(AndEdit_id); + if(ids.length == 0){ + showResult(false,'请选择要考试的试卷!','alert'); + } + else if(ids.length > 1){ + showResult(false,'请选择要考试的一张试卷,不支持同时选择多张试卷!','alert'); + } + else{ + $.ajax({ + type: 'post', + url: isNotSubmitUrl, + data:{'exam_id':UserEdit_id}, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if (result.data.rows.length > 0){ + alert("试卷已提交,不可继续答题!"); + } + else{ + editexam_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + editexam_dialog.uiDialog('button', 'btnOK').show(); + editexam_dialog.uiDialog('open'); + if(pg == "2"){ + editexam_dialog.uiDialog('title').html('调研'); + }else { + editexam_dialog.uiDialog('title').html('考试'); + } + + + $.ajax({ + type: 'post', + url: userTestUrl, + data:{'UserEdit_id':UserEdit_id}, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + //showResult(result.success, result.message); + + setTimeout( function(){ + if(result.data.rows.length > 0){ + var data=result.data.rows[0]; + titlename=data.name; + sc=data.sc; + $('#title_name').html(data.name);//将后台return的结果显示在前端 + $('#title_description').html(data.description); + + counttime=Number(sc)*3600;//总秒钟 + // counttime=parseFloat(sc)*3600; + daojishi(); + } + },100); + + // $('#eqlist2').uiGrid('loadData'); + }, + error:function() { + alert("获取数据失败"); + } + }); + } + }, + error:function() { + alert("查询是否已答题失败"); + } + }); + } + }); + + } + //arttemplate语法 + template.helper('judge', function (data, format) { + if (data!=undefined && data.indexOf(format)!=-1){ + return true; + }else { + return false;} + }); + +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + +} + +//编辑 +function editRow(id) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('button', 'btnOK').show(); +} + +// 删除 +function deleteRow(id) { + deleteData("此操作将删除试卷,可能会导致以往考试找不到试卷,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} + + +// var counttime=90*60;//总秒钟 + +function daojishi(){ + if(isNaN(counttime)){ + return; + } + + if(counttime>=0){ + var ms = counttime%60;//余数 89%60==29秒 + var mis = Math.floor(counttime/60);//分钟 + if(mis>=60){ + var hour=Math.floor(mis/60); + + mis=Math.floor((counttime-hour*60*60)/60); + $("#kssj").html(hour+"小时"+mis+"分"+ms+"秒"); + }else if(mis>=1){ + $("#kssj").html(mis+"分"+ms+"秒"); + }else{ + $("#kssj").html(ms+"秒"); + } + + counttime--; + window.clearTimeout(vartt);//先销毁再重新开始计时 + vartt = window.setTimeout("daojishi()",1000); + }else{ + window.clearTimeout(vartt); + submitExam(); + window.confirm("考试时间到,试卷已自动提交!"); + + } + +} + +//单项选择ABCD +function checkBox(e) { + var parent = $(e).parents().filter('tr:eq(0)'); + parent.find('#cbA').bind('click',function (){ + if(parent.find('#cbA').prop('checked')) + { + parent.find('#cbB').prop('checked',false); + parent.find('#cbC').prop('checked',false); + parent.find('#cbD').prop('checked',false); + } + }); + parent.find('#cbB').bind('click',function (){ + if(parent.find('#cbB').prop('checked')) + { + parent.find('#cbA').prop('checked',false); + parent.find('#cbC').prop('checked',false); + parent.find('#cbD').prop('checked',false); + } + }); + parent.find('#cbC').bind('click',function (){ + if(parent.find('#cbC').prop('checked')) + { + parent.find('#cbB').prop('checked',false); + parent.find('#cbA').prop('checked',false); + parent.find('#cbD').prop('checked',false); + } + }); + parent.find('#cbD').bind('click',function (){ + if(parent.find('#cbD').prop('checked')) + { + parent.find('#cbB').prop('checked',false); + parent.find('#cbC').prop('checked',false); + parent.find('#cbA').prop('checked',false); + } + }); +} + +//判断题 +function checkYesNo(e) { + var parent = $(e).parents().filter('tr:eq(0)'); + parent.find('#yes').bind('click',function (){ + if(parent.find('#yes').prop('checked')) + { + parent.find('#no').prop('checked',false); + } + }); + parent.find('#no').bind('click',function (){ + if(parent.find('#no').prop('checked')) + { + parent.find('#yes').prop('checked',false); + } + }); +} + +//提交考试 +function submitExam() { + + // var examInfo = []; + var examInfo = {id:'',question_id:'',exam_id:'',name:'',num:'',subject:'',type:'',ismust:'',score:'', + isParagraph:'',answer:'',user_answer:''};//定义对象 + var examArray = [];//定义数组 + + for (var i=1; i<$('#eqlist2').find('tr').length; i++){ + var parent=""; + var id=""; + var question_id=""; + var exam_id=""; + var name=""; + var num=""; + var subject=""; + var type=""; + var ismust=""; + var score=""; + var isParagraph = ""; + var answer=""; + var user_answer=""; + + parent=$('#eqlist2').find('tr:eq('+i+')'); + + // id=parent.find(".qid").html(); + // question_id=parent.find(".ques_id").html(); + question_id=parent.find(".qid").html(); + + exam_id=UserEdit_id; + name=titlename; + num=parent.find(".qxh").html(); + subject=parent.find(".qtm").html(); + type=parent.find(".qtype").html(); + ismust=parent.find(".qbd").html(); + score=parent.find(".score").html(); + isParagraph = 0; + // answer=parent.find(".subject_answer").html(); + + if(type == "单选题" || type == "多选题"){ + if(parent.find("#cbA").prop('checked')){ + user_answer += "A"; + } + if (parent.find("#cbB").prop('checked')){ + user_answer += "B"; + } + if (parent.find("#cbC").prop('checked')){ + user_answer += "C"; + } + if (parent.find("#cbD").prop('checked')){ + user_answer += "D"; + } + if (parent.find("#cbE").prop('checked')){ + user_answer += "E"; + } + if (parent.find("#cbF").prop('checked')){ + user_answer += "F"; + } + } + if(type == "判断题"){ + if(parent.find("#yes").prop('checked')){ + user_answer = "对"; + } + if (parent.find("#no").prop('checked')){ + user_answer = "错"; + } + } + if(type == "填空题") + { + user_answer = parent.find(".blank").val(); + } + if(type == "问答题") + { + user_answer = parent.find(".answer").val();//该方法可以获取最近的class为answer的标签的内容 + } + + if(user_answer.length > 2000){ + alert("答案限制2000个字符,请修改后保存!"); + return; + } + + examInfo.id=id; + examInfo.question_id= question_id; + examInfo.exam_id=exam_id; + examInfo.name=name; + examInfo.num=num; + examInfo.subject=subject; + examInfo.type=type; + examInfo.ismust=ismust; + examInfo.score=score; + examInfo.isParagraph=isParagraph; + examInfo.answer=answer; + examInfo.user_answer=user_answer; + + examArray.push(examInfo); + examInfo = {id:'',question_id:'',exam_id:'',name:'',num:'',subject:'',type:'',ismust:'',score:'', + isParagraph:'',answer:'',user_answer:''};//清空对象 + } + + $.ajax({ + type: 'post', + url: saveUrl, + // data: {'id':id,'question_id':question_id, 'exam_id':exam_id,'name':name,'num':num,'subject':subject,'type':type, + // 'ismust':ismust,'score':score,'isParagraph':isParagraph,'answer':answer,'user_answer':user_answer}, + data: {'examArray':JSON.stringify(examArray)}, + dataType: "json", + success: function (result) { + // if (result.success) { + // $('#eqlist2').uiGrid('loadData'); + // } + if (result.success) { + $.uiLoading.remove({container: $('#editexam_dialog')});//窗口移除遮罩 + $('#editexam_dialog').uiDialog('close'); + $('#grid').uiGrid('loadData'); + } + showResult(result.success, result.message); + }, + error:function() { + alert("提交考试失败"); + $.uiLoading.remove({container: $('#editexam_dialog')});//窗口移除遮罩 + } + }); + +} + +//计算题数和总分 +function setStatistic() { + var totalQuestion=""; + var totalScore=0; + var score=""; + for (var i=1; i<$('#eqlist2').find('tr').length; i++){ + var parent=""; + parent=$('#eqlist2').find('tr:eq('+i+')'); + score=parent.find(".score").html(); + totalScore +=Number(score); + } + totalQuestion = $('#eqlist2').find('tr').length - 1; + $('#sum').val(totalQuestion); + $('#sum_score').val(totalScore); +} + +//必答题必填 选答题选填 +function isMust() { + for (var i=1; i<$('#eqlist2').find('tr').length; i++){ + var parent=""; + var ismust=""; + var user_answer=""; + var type = ""; + + parent=$('#eqlist2').find('tr:eq('+i+')'); + ismust=parent.find(".qbd").html(); + type=parent.find(".qtype").html(); + if(type == "单选题" || type == "多选题"){ + if(parent.find("#cbA").prop('checked')){ + user_answer += "A"; + } + if (parent.find("#cbB").prop('checked')){ + user_answer += "B"; + } + if (parent.find("#cbC").prop('checked')){ + user_answer += "C"; + } + if (parent.find("#cbD").prop('checked')){ + user_answer += "D"; + } + if (parent.find("#cbE").prop('checked')){ + user_answer += "E"; + } + if (parent.find("#cbF").prop('checked')){ + user_answer += "F"; + } + } + if(type == "判断题"){ + if(parent.find("#yes").prop('checked')){ + user_answer = "对"; + } + if (parent.find("#no").prop('checked')){ + user_answer = "错"; + } + } + if(type == "填空题") + { + user_answer = parent.find(".blank").val(); + } + if(type == "问答题") + { + user_answer = parent.find(".answer").val();//该方法可以获取最近的class为answer的标签的内容 + } + + if(ismust == 1 && user_answer == ""){ + alert("请完成第"+i+"题必答题再提交!"); + return false; + } + } + return true; +} + diff --git a/asset/js/cetc54/exam/exampaper.js b/asset/js/cetc54/exam/exampaper.js new file mode 100644 index 0000000..87d8dd8 --- /dev/null +++ b/asset/js/cetc54/exam/exampaper.js @@ -0,0 +1,2652 @@ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/exam/exampaper/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +var editexamPage =rootUrl + 'editexamPage';//编辑页面地址 +var editexampaperPage =rootUrl + 'editexampaperPage';//编辑页面地址 +var importnewexampaperPage =rootUrl + 'importnewexampaperPage';//试卷导入页面地址 +var fileImportUrl = rootUrl + 'fileImport';//试卷导入按钮 +var fileImportQuestionUrl = rootUrl + 'fileImportQuestion';//试卷试题导入按钮 +var fileImportResearchUrl = rootUrl + 'fileImportResearch';//调研问卷导入按钮 +var fileImportQuestionUrl_R = rootUrl + 'fileImportQuestionR';//调研问卷试题导入按钮 +var saveHistoryUrl = rootUrl + 'saveHistoryExam';//保存历史问卷 +var randUrl = rootUrl + 'randExam';//随机添加试题 +var randNumUrl = rootUrl + 'randNum';//随机添加试题更新序号 +// var departmentComboxUrl = rootUrl+'departmentCombox';//部门下拉框 +var departmentAddUrl= rootUrl+'departmentAdd';//添加部门 +var departmentListUrl= rootUrl+'departmentList';//初始化添加部门列表 +// var courseComboxUrl = rootUrl+'courseCombox';//课程下拉框 +var deleteLimitationUrl = rootUrl + 'deleteLimitation';//发放范围——删除 + +var examId = "";//试卷id,想使用的历史问卷的id +var count = 0;//添加部门计数 +// var exam_id = "";//在该试卷上添加部门时使用的试卷id +var limitation = "";//指定发放范围,1全所2部门3人员4班级5课程 +var examState = {firstState:"未开始", secondState:"正在进行", thirdState:"已关闭", fourthState:"已撤销",fifthState:"线下考试"};//试卷状态 + +var limitationUrl = rootUrl + 'limitationList';//发放范围 grid list +// var departmentComboxUrl = rootUrl+'departmentCombox';//部门下拉框 +var departmentComboxUrl = webroot+'/train/createClass/GetOrgList?orgid=001001001'; +var classComboxUrl = rootUrl+'classCombox';//班级下拉框 +var courseComboxUrl = rootUrl+'courseCombox';//课程下拉框 +var saveLimitationUrl = rootUrl + 'saveLimitation';//发放范围save +var deleteOtherUrl = rootUrl + 'deleteOtherLimitation';//删除其他发放范围 +var saveCourseUrl = rootUrl + 'saveCourse';//发放范围save课程对应的人员 +var saveClassUrl = rootUrl + 'saveClass';//发放范围save班级对应的人员 +var deleteLimitationExampaperUrl = rootUrl + 'deleteLimitationExampaper';//依据试卷id删除limitation表中的全所部门人员课程班级 +var deletePersonUrl = rootUrl + 'deletePerson';//删除课程班级对应的人 +var exam_id = "";//临时试卷id +var temporary_exam = "临时试卷"; +var deleteTemporaryExamUrl = rootUrl + 'deleteTemporaryExam';//删除临时试卷 + +var exampaperReturnUrl = rootUrl + 'exampaperReturn';//查询返回试卷名称 试卷描述 试卷状态 试卷类别 +检查试卷能否发布 +var category_ = "";//试卷类别 +var categoryid_ = "";//试卷类别id + +var checkDeleteUrl = rootUrl + 'checkDelete';//检查未开始状态之外的的试卷不允许删除 +var personImportUrl = rootUrl + 'personImport';//发放范围 人员导入 + +var updateClassUrl = rootUrl + 'updateClass';//更新班级班级对应人的表的exam_id +var updateCourseUrl = rootUrl + 'updateCourse';//更新班级课程对应人的表的exam_id +var updateLimitationUrl = rootUrl + "updateLimitation";//更新limitation表中的试卷id +var deleteExamQuestionUrl = rootUrl + 'deleteExamQuestion';//删除试卷中的试题 + +var previewPageUrl = rootUrl + 'previewPage';//预览 试卷 问卷 +var previewUrl = rootUrl + 'preview';//预览 试卷 问卷 + +var detailUrl = rootUrl + 'detail';//考试调研详情 查看已答未答 + +var saveResitPaperUrl = rootUrl + 'saveResitPaper';//重新推送考试 保存原试卷试题至补考试卷中 +var exam_id_resit = "";//重新考试要用到的原试卷id +var srp = 0;//判断是否执行 重新推送考试 保存原试卷试题至补考试卷中的方法 0不执行1执行 + +var getUserNameAndCodeUrl= webroot + '/train/plantodo/pdcreateclass/' + 'getUserNameAndCode'; + + +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + + var dialogSize = {width: '95%', height: '95%'};//弹出窗口大小 + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var grid = $('#grid'); + var pg = "";//控制考试与调研页面交替,1考试2调研 + pg = $('#pg').val(); + + var list_editexampaper_Url = rootUrl + 'list_editexampaper';//编辑试卷内容 list地址 + //var save_editexampaper_Url = rootUrl + 'save_editexampaper';//编辑试卷内容 保存数据地址 + var comboxUrl=rootUrl+ 'examPaperCombox';//选择历史问卷 下拉框 + + var dialog_department = $('#dialog_department');//发放范围 部门 弹出窗口 + var grid_form_department = $('#grid_form_department');//发放范围 部门 弹出窗口 form + var dialog_person = $('#dialog_person');//发放范围 人员 弹出窗口 + var grid_form_person = $('#grid_form_person');//发放范围 人员 弹出窗口 form + var dialog_class = $('#dialog_class');//发放范围 班级 弹出窗口 + var grid_form_class = $('#grid_form_class');//发放范围 班级 弹出窗口 form + var dialog_course = $('#dialog_course');//发放范围 课程 弹出窗口 + var grid_form_course = $('#grid_form_course');//发放范围 课程 弹出窗口 form + var dialog_personimport = $('#dialog_personimport');//发放范围 人员导入 弹出窗口 + var grid_form_personimport = $('#grid_form_personimport');//发放范围 人员导入 弹出窗口 form + + var getQuestionNumUrl = rootUrl +'getQuestionNum';//判断试卷有无试题 + var resitUrl = rootUrl + 'resit';//重新考试存入缺考和不及格人员 + + +//-----------------------初始化-------------------------------------- + initExampapersGrid(); + initExampapersForm(); + // addFilter(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function initExampapersGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '试卷名称|试卷类别|部门', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + queryParams:{pg: pg}, + // localData:{rows:[ + // {id: '1',name:'试卷1',category:'项目管理',categoryid:'1',passpoints:'60',description:'这张试卷是关于项目管理考试的第一张试卷',edittime:'2019-01-01 11:15:10'}, + // {id: '2',name:'试卷2',category:'项目管理',categoryid:'1',passpoints:'60',description:'这张试卷是关于项目管理考试的第二张试卷',edittime:'2019-01-03 11:15:10'}, + // {id: '3',name:'试卷3',category:'质量管理',categoryid:'2',passpoints:'60',description:'这张试卷是关于质量管理考试的第一张试卷',edittime:'2019-01-05 11:15:10'}, + // {id: '4',name:'试卷4',category:'项目管理',categoryid:'1',passpoints:'60',description:'这张试卷是关于项目管理考试的第三张试卷',edittime:'2019-01-14 11:15:10'}, + // {id: '5',name:'试卷5',category:'项目管理',categoryid:'1',passpoints:'60',description:'这张试卷是关于项目管理考试的第四张试卷',edittime:'2019-01-19 11:15:10'}]}, + defaultSortField: 'edittime' + }); + + } + + function initExampapersForm() { + + //初始化 发放范围 + var formInit = function () { + + //初始化发放范围grid + $('#grid_limitation').uiGrid({ + url: limitationUrl + }); + + //初始化 发放范围-添加部门 弹出窗口dialog + $('#dialog_department').uiDialog({ + title: '添加', + icon: 'list', + width: "60%", + height: "60%", + mask: true, + showBtnBar: true, + lazyLoad: true, + updateOnOpen: true, + maskContainer: $('#dialog'), + onOpen: function () { + // $('#grid_form_limitation').uiForm('load');//为组件加载数据 + + var dialogP = $('#dialog_department').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + $('#grid_form_department').uiForm('load', $('#grid_limitation').uiGrid('selectedData')[0]); + break; + case 'add': + $('#grid_form_department').uiForm('load', {}); + break; + default : + break; + } + + }, + onClose:function () { + + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form_department').uiForm('submit', { + url: saveLimitationUrl, + onSubmit: function (param) { + param.id = $('#hdIDDepartment').val(); + param.user = $('#txtdepartment').uiCombo('getText'); + param.user_id = $('#txtdepartment').uiCombo('getValue'); + param.exam_id = exam_id; + param.exam = temporary_exam; + param.limitation = "2"; + + var isValid = $('#grid_form_department').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog_department.uiDialog('close');//保存成功后关闭对话框 + // grid_limitation.uiGrid('loadData');//保存成功后刷新界面,调用了后台的list方法 + $('#grid_limitation').uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog_department.uiDialog('close'); + } + } + ]}); + + //初始化 发放范围 添加部门 弹出窗口form + grid_form_department.uiForm({ + template: 'grid_form_temp_department', + onLoadSuccess: function (data) { + $('#txtdepartment').uiCombobox({ + mode: "remote", + url: departmentComboxUrl + }); + } + }); + + //初始化 发放范围-添加人员 弹出窗口 dialog + dialog_person.uiDialog({ + title: '添加', + icon: 'list', + width: "60%", + height: "60%", + mask: true, + showBtnBar: true, + lazyLoad: true, + updateOnOpen: true, + maskContainer: $('#dialog'), + onOpen: function () { + // $('#grid_form_limitation').uiForm('load');//为组件加载数据 + + var dialogP = $('#dialog_person').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + $('#grid_form_person').uiForm('load', $('#grid_limitation').uiGrid('selectedData')[0]); + break; + case 'add': + $('#grid_form_person').uiForm('load', {}); + break; + default : + break; + } + + }, + onClose:function () { + + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form_person').uiForm('submit', { + url: saveLimitationUrl, + onSubmit: function (param) { + param.id = $('#hdIDPerson').val(); + param.user = $('#txtperson').uiCombobox("getText"); + param.user_id = $('#txtcard').uiCombobox("getText"); + // var uuid = guid();//前端生成32位UUID + param.exam_id = exam_id; + param.exam = temporary_exam; + param.limitation = "3"; + + var isValid = $('#grid_form_person').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog_person.uiDialog('close');//保存成功后关闭对话框 + $('#grid_limitation').uiGrid('loadData');//保存成功后刷新界面,调用了后台的list方法 + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog_person.uiDialog('close'); + } + } + ]}); + + //初始化 发放范围-添加人员 弹出窗口 form + grid_form_person.uiForm({ + template: 'grid_form_temp_person', + onLoadSuccess: function (data) { + $('#txtperson').uiCombobox({ + mode: 'remote', + searchable: true, + loader: comboxLoad, + delay:500, + hasDownArrow:false, + url: getUserNameAndCodeUrl, + onLoadSuccess: function (data) { + $('#txtperson').uiCombobox("setText",$('#txtperson').val()); + }, + onSelect:function (data) { + var dataArray = data.usercode.split("|"); + var teacher = dataArray[0]; + var teacher_code = dataArray[1]; + $('#txtperson').uiCombobox("setText",teacher); + $('#txtcard').uiCombobox("setText",teacher_code); + } + }); + $('#txtcard').uiCombobox({ + mode: 'remote', + searchable: true, + loader: comboxLoad, + delay:500, + hasDownArrow:false, + url: getUserNameAndCodeUrl, + onLoadSuccess: function (data) { + $('#txtcard').uiCombobox("setText",$('#txtcard').val()); + }, + onSelect:function (data) { + var dataArray = data.usercode.split("|"); + var teacher = dataArray[0]; + var teacher_code = dataArray[1]; + $('#txtperson').uiCombobox("setText",teacher); + $('#txtcard').uiCombobox("setText",teacher_code); + } + }); + } + }); + + //初始化 发放范围-添加班级 弹出窗口dialog + $('#dialog_class').uiDialog({ + title: '添加', + icon: 'list', + width: "60%", + height: "60%", + mask: true, + showBtnBar: true, + lazyLoad: true, + updateOnOpen: true, + maskContainer: $('#dialog'), + onOpen: function () { + // $('#grid_form_limitation').uiForm('load');//为组件加载数据 + + var dialogP = $('#dialog_class').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + $('#grid_form_class').uiForm('load', $('#grid_limitation').uiGrid('selectedData')[0]); + break; + case 'add': + $('#grid_form_class').uiForm('load', {}); + break; + default : + break; + } + + }, + onClose:function () { + + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form_class').uiForm('submit', { + url: saveLimitationUrl, + onSubmit: function (param) { + param.id = $('#hdIDClass').val(); + param.user = $('#txtclass').uiCombo('getText'); + param.user_id = $('#txtclass').uiCombo('getValue'); + // var uuid = guid();//前端生成32位UUID + param.exam_id = exam_id; + param.exam = temporary_exam; + param.limitation = "4"; + + var isValid = $('#grid_form_class').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog_class.uiDialog('close');//保存成功后关闭对话框 + // grid_limitation.uiGrid('loadData');//保存成功后刷新界面,调用了后台的list方法 + $('#grid_limitation').uiGrid('loadData'); + } + + //通过班级id将对应的人和工资号存入limitation_class表的person和person_id + var limitation_id = ""; + if(result.data.id != undefined){ + limitation_id = result.data.id; + } + $.ajax({ + type: 'post', + url: saveClassUrl, + data: {'classid':$('#txtclass').uiCombo('getValue'), + 'exam_id':exam_id, + 'limitation_id':limitation_id + }, + dataType: "json", + success: function (result) { + if (result.success) { + // dialog_course.uiDialog('close');//保存成功后关闭对话框 + } + showResult(result.success, result.message); + }, + error:function() { + alert("提交失败"); + } + }); + + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog_class.uiDialog('close'); + } + } + ]}); + + //初始化 发放范围 添加班级 弹出窗口form + grid_form_class.uiForm({ + template: 'grid_form_temp_class', + onLoadSuccess: function (data) { + $('#txtclass').uiCombobox({ + mode: "remote", + searchable: true, + url: classComboxUrl + }); + } + }); + + //初始化 发放范围-添加课程 弹出窗口dialog + $('#dialog_course').uiDialog({ + title: '添加', + icon: 'list', + width: "60%", + height: "60%", + mask: true, + showBtnBar: true, + lazyLoad: true, + updateOnOpen: true, + maskContainer: $('#dialog'), + onOpen: function () { + // $('#grid_form_limitation').uiForm('load');//为组件加载数据 + + var dialogP = $('#dialog_course').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + $('#grid_form_course').uiForm('load', $('#grid_limitation').uiGrid('selectedData')[0]); + break; + case 'add': + $('#grid_form_course').uiForm('load', {}); + break; + default : + break; + } + + }, + onClose:function () { + + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form_course').uiForm('submit', { + url: saveLimitationUrl, + onSubmit: function (param) { + param.id = $('#hdIDCourse').val(); + param.user = $('#txtcourse').uiCombo('getText'); + param.user_id = $('#txtcourse').uiCombo('getValue'); + // var uuid = guid();//前端生成32位UUID + param.exam_id = exam_id; + param.exam = temporary_exam; + param.limitation = "5"; + + var isValid = $('#grid_form_course').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog_course.uiDialog('close');//保存成功后关闭对话框 + // grid_limitation.uiGrid('loadData');//保存成功后刷新界面,调用了后台的list方法 + $('#grid_limitation').uiGrid('loadData'); + } + + //通过课程id将对应的人和工资号存入limitation_course表的person和person_id + var limitation_id = ""; + if(result.data.id != undefined){ + limitation_id = result.data.id; + } + + $.ajax({ + type: 'post', + url: saveCourseUrl, + data: {'courseid':$('#txtcourse').uiCombo('getValue'), + 'exam_id':exam_id, + 'limitation_id':limitation_id + }, + dataType: "json", + success: function (result) { + if (result.success) { + // dialog_course.uiDialog('close');//保存成功后关闭对话框 + } + showResult(result.success, result.message); + }, + error:function() { + alert("提交失败"); + } + }); + + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog_course.uiDialog('close'); + } + } + ]}); + + //初始化 发放范围 添加课程 弹出窗口form + grid_form_course.uiForm({ + template: 'grid_form_temp_course', + onLoadSuccess: function (data) { + $('#txtcourse').uiCombobox({ + mode: "remote", + searchable: true, + url: courseComboxUrl + }); + } + }); + + //初始化 发放范围-人员导入 弹出窗口dialog + $('#dialog_personimport').uiDialog({ + title: '导入', + icon: 'list', + width: "60%", + height: "60%", + mask: true, + showBtnBar: true, + lazyLoad: true, + updateOnOpen: true, + maskContainer: $('#dialog'), + onOpen: function () { + // $('#grid_form_limitation').uiForm('load');//为组件加载数据 + + var dialogP = $('#dialog_personimport').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + $('#grid_form_personimport').uiForm('load', $('#grid_limitation').uiGrid('selectedData')[0]); + break; + case 'add': + $('#grid_form_personimport').uiForm('load', {}); + break; + default : + break; + } + + }, + onClose:function () { + + } + }); + + //初始化 发放范围 人员导入 弹出窗口form + grid_form_personimport.uiForm({ + template: 'grid_form_temp_perosnimport', + onLoadSuccess: function (data) { + $('#btnUpload_person').bind('click', function () { + $('#grid_form_personimport').uiForm('submit', { + url: personImportUrl, + dataType: "application/json", + onSubmit: function (params) { + params.exam_id = exam_id; + }, + success: function (result) { + if (result.success) { + $('#dialog_personimport').uiDialog('close');//保存成功后关闭对话框 + $('#grid_limitation').uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + }); + } + }); + + //添加部门按钮点击事件 + $('#btnDepartment').bind('click', function () { + dialog_department.uiDialog('title').html('添加'); + dialog_department.uiDialog('setUserParam', {action: 'add'}); + dialog_department.uiDialog('button', 'btnOK').show(); + dialog_department.uiDialog('button', 'btnSave').hide(); + dialog_department.uiDialog('open'); + }); + + //添加人员按钮点击事件 + $('#btnPerson').bind('click', function () { + dialog_person.uiDialog('title').html('添加'); + dialog_person.uiDialog('setUserParam', {action: 'add'}); + dialog_person.uiDialog('button', 'btnOK').show(); + dialog_person.uiDialog('button', 'btnSave').hide(); + dialog_person.uiDialog('open'); + }); + + //添加班级按钮点击事件 + $('#btnClass').bind('click', function () { + dialog_class.uiDialog('title').html('添加'); + dialog_class.uiDialog('setUserParam', {action: 'add'}); + dialog_class.uiDialog('button', 'btnOK').show(); + dialog_class.uiDialog('button', 'btnSave').hide(); + dialog_class.uiDialog('open'); + }); + + //添加课程按钮点击事件 + $('#btnCourse').bind('click', function () { + dialog_course.uiDialog('title').html('添加'); + dialog_course.uiDialog('setUserParam', {action: 'add'}); + dialog_course.uiDialog('button', 'btnOK').show(); + dialog_course.uiDialog('button', 'btnSave').hide(); + dialog_course.uiDialog('open'); + }); + + //删除 + $('#btnDelete').bind('click', function () { + var ids = $('#grid_limitation').uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteLimitationRow(ids); + } + }); + + //人员导入 按钮点击事件 + $('#btnImport').bind('click', function () { + dialog_personimport.uiDialog('title').html('添加'); + dialog_personimport.uiDialog('setUserParam', {action: 'add'}); + dialog_personimport.uiDialog('open'); + }); + + $('#grid_limitation').hide();//刚打开窗口时先隐藏 + }; + + dialog.uiDialog({ + title: '新建', + width: dialogSize.width, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + + $('#grid_limitation').uiGrid('loadData',{queryParams:{"exam_id": id}}); + $('#grid_limitation').show(); + limitationHide(); + + //查看时隐藏按钮等 + // $(':radio').attr('disabled', true);//隐藏所有按钮 + $('#cb3_l').attr('disabled', true); + $('#cb4_l').attr('disabled', true); + $('#cb5_l').attr('disabled', true); + $('#cb6_l').attr('disabled', true); + $('#cb7_l').attr('disabled', true); + setTimeout( function(){ + $("#grid_limitation .grid_toolbar table").find("tr").find("td:eq(0)").hide(); + $("#grid_limitation .grid_data table").find("tr").find("td:eq(1)").hide(); + },1000); + + break; + + case 'edit': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + + $('#grid_limitation').uiGrid('loadData',{queryParams:{"exam_id": id}}); + $('#grid_limitation').show(); + limitationHide(); + + $("#grid_limitation .grid_toolbar table").find("tr").find("td:eq(0)").show(); + $("#grid_limitation .grid_data table").find("tr").find("td:eq(1)").show(); + + break; + case 'add': + var roleType = 0; + grid_form.uiForm('load', {}); + break; + + case 'resit': + grid_form.uiForm('load', {}); + + $('#grid_limitation').uiGrid('loadData',{queryParams:{"exam_id": id}}); + $('#grid_limitation').show(); + + $('#cb3_l').hide(); + $('#cb4_l').hide(); + $('#cb5_l').show(); + $('#cb6_l').hide(); + $('#cb7_l').hide(); + $('#cb3_li').hide(); + $('#cb4_li').hide(); + $('#cb5_li').show(); + $('#cb6_li').hide(); + $('#cb7_li').hide(); + + $('#cb5_l').attr("checked",true); + $('#cb5_l').attr("disabled",true); + + $('#spanDepartment').hide(); + $('#spanPerson').show(); + $('#spanClass').hide(); + $('#spanCourse').hide(); + $('#btnDepartment').hide(); + $('#btnPerson').show(); + $('#btnClass').hide(); + $('#btnCourse').hide(); + $('#btnImport').show(); + + break; + + default : + break; + } + + }, + onLoadComplete: formInit, + onClose:function () { + setTimeout( function(){ + //关闭窗口将临时试卷清空 + $.ajax({ + type:'post', + url:deleteTemporaryExamUrl, + data:{"exam":temporary_exam, + "exam_id":exam_id + }, + dataType:'json', + success:function (result) { + + }, + error:function () { + alert("删除临时试卷失败"); + } + }); + },100); + + srp = 0;//关闭窗口,重新考试标志置为0 + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + + param.pg = $('#pg').val();//uiForm控件向后台传入参数,不是queryParams + param.id = $('#hdID').val(); + + //谷歌支持 + // var startDate = new Date($('#startdate').val()); + // var endtDate = new Date($('#enddate').val()); + // var now = new Date(new Date().toLocaleDateString()); + // var startMillisecond = startDate.getTime() - now;//时间差的毫秒数 + // var endMillisecond = endtDate.getTime() - now; + // var startDays=Math.floor(startMillisecond / (24*3600*1000));// 计算出相差天数 + // var endDays=Math.floor(endMillisecond / (24*3600*1000)); + + //IE支持 + var startDate = $('#startdate').val(); + var endtDate = $('#enddate').val(); + var now_ = new Date(); + var month = now_.getMonth() + 1; + var now = now_.getFullYear() + "/" + month + "/" + now_.getDate(); + var startMillisecond = Date.parse(startDate.replace(/-/g,"/")) - Date.parse(now);//时间差的毫秒数 + var endMillisecond = Date.parse(endtDate.replace(/-/g,"/")) - Date.parse(now); + var startDays=Math.floor(startMillisecond / (24*3600*1000));// 计算出相差天数 + var endDays=Math.floor(endMillisecond / (24*3600*1000)); + + if(endDays - startDays < 0 ) + { + alert("开放时间中的结束时间应大于开始时间!"); + return false; + } + if(startDays > 0 && endDays > 0){ + param.state = examState.firstState; + }else if (startDays <= 0 && endDays >= 0){ + // param.state = examState.secondState; + param.state = examState.firstState;//所有试卷初始状态都为“未开始”,点击发布按钮后,为“正在进行” + }else if (startDays < 0 && endDays < 0){ + // param.state = examState.thirdState; + alert("开放时间已过,请修改!"); + return false; + }else{ + param.state = "状态有误"; + } + + if($('input:radio[id="cb3_l"]:checked').val() == "on"){ + param.limitation = 1; + }else if($('input:radio[id="cb4_l"]:checked').val() == "on"){ + param.limitation = 2; + if($('[class=spanId]').length == 0){ + alert("请添加部门!"); + return false; + } + }else if($('input:radio[id="cb5_l"]:checked').val() == "on"){ + param.limitation = 3; + if($('[class=spanId]').length == 0){ + alert("请添加人员!"); + return false; + } + }else if($('input:radio[id="cb6_l"]:checked').val() == "on"){ + param.limitation = 4; + if($('[class=spanId]').length == 0){ + alert("请添加班级!"); + return false; + } + }else if($('input:radio[id="cb7_l"]:checked').val() == "on"){ + param.limitation = 5; + if($('[class=spanId]').length == 0){ + alert("请添加课程!"); + return false; + } + }else{ + alert("请指定试卷发放范围!"); + return false; + } + limitation=param.limitation; + var isValid = $('#grid_form').uiForm('validate'); + + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success === false){ + showResult(result.success, result.message); + return; + } + + if (result.success) { + + //试卷表操作成功后,更新发放范围limitation表 + var exam_id_ = ""; + if(result.data !== undefined){ + exam_id_ = result.data.examId; + } + if($('input:radio[id="cb3_l"]:checked').val() == "on"){ + var spanId = $('[class=spanId]:eq(0)').text(); + var user = "全所"; + var user_id = "1"; + var limitation = "1"; + var exam = ""; + $.ajax({ + type: 'post', + url: saveLimitationUrl, + data: {"id":spanId, + "user":user, + "user_id":user_id, + "exam_id":exam_id_, + "limitation":limitation, + "exam":exam + }, + dataType: "json", + success: function (result) { + }, + error:function() { + alert("插入试卷全所权限失败"); + } + }); + + }else{ + var exam = ""; + $.ajax({ + type: 'post', + url: updateLimitationUrl, + data: {"exam_id":exam_id, + "exam_id_":exam_id_, + "exam":exam + }, + dataType: "json", + success: function (result) { + }, + error:function() { + alert("更新试卷权限失败"); + } + }); + + // //var limitationArray = [];//批量更新 + // if($('[class=spanId]').length > 0){ + // var j = $('[class=spanId]').length; + // for (var i=0;i<$('[class=spanId]').length;i++){//应当改为更新条件为exam_id而不是id + // var spanId=$('[class=spanId]:eq('+i+')').text(); + // // var limitationInfo = {}; + // // limitationInfo.id = spanId; + // // limitationInfo.exam_id = exam_id; + // var exam = ""; + // + // $.ajax({ + // type: 'post', + // url: saveLimitationUrl, + // data: {"id":spanId, + // "exam_id":exam_id_, + // "exam":exam + // }, + // dataType: "json", + // success: function (result) { + // }, + // error:function() { + // alert("更新试卷权限失败"); + // } + // }); + // } + // } + + } + + //更新班级课程对应人的表的exam_id + if($('input:radio[id="cb6_l"]:checked').val() == "on"){ + $.ajax({ + type: 'post', + url: updateClassUrl, + data: {"exam_id":exam_id,//临时试卷id + "exam_id_":exam_id_//正式试卷id + }, + dataType: "json", + success: function (result) { + }, + error:function() { + alert("更新班级对应人的表的exam_id失败"); + } + }); + }else if($('input:radio[id="cb7_l"]:checked').val() == "on"){ + $.ajax({ + type: 'post', + url: updateCourseUrl, + data: {"exam_id":exam_id,//临时试卷id + "exam_id_":exam_id_//正式试卷id + }, + dataType: "json", + success: function (result) { + }, + error:function() { + alert("更新课程对应人的表的exam_id失败"); + } + }); + } + + if(srp == 1){ + saveResitPaper(exam_id_);//重新推送考试 保存原试卷试题至补考试卷中 + } + + dialog.uiDialog('close'); + grid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (data) { + + $('#txtcategory').dictCombobox(); + + $('#startdate').uiDate({ + required:true, + // dateFmt:'yyyy-MM-dd HH:mm:ss', + dateFmt:'yyyy-MM-dd', + disabled: false + }); + $('#enddate').uiDate({ + required:true, + // dateFmt:'yyyy-MM-dd HH:mm:ss', + dateFmt:'yyyy-MM-dd', + disabled: false + }); + + if($('#startdate').val()==='NaN-aN-aN') + { + $('#startdate').val(''); + } + if($('#enddate').val()==='NaN-aN-aN') + { + $('#enddate').val(''); + } + + var me = $(this); + switch (op) { + case 'view': + me.uiForm('setReadonly', true); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + + } + }); + } + + //初始化表单-编辑试卷内容 + var formeditexampaperInit = function () { + + var eqlist2 = $('#eqlist2'); + + eqlist2.uiGrid({ + autoFit: true, + border:false, + colFit:true, + gridTitleFix: false, + width:"100%", + height:"80%", + showHeader:false, + icon: 'list', + url: list_editexampaper_Url, + queryParams: {AndEdit_id: grid.uiGrid('selectedData', 'id')[0]},//从前端获取,向后台传递参数 + // localData:{rows:[ + // {id: '1', subject: '项目管理培训题目1?',type:'1',isMust:'1',score:'10',optionA:'选项A',optionB:'选项B',optionC:'选项C',optionD:'选项D',optionE:'',optionF:'',num:'11',isParagraph:'0'} + // // {id: '2', subject: '项目管理培训题目2?',type:'1',isMust:'0',score:'10',optionA:'选项A',optionB:'选项B',optionC:'选项C',optionD:'选项D',optionE:'',optionF:'',num:'2',isParagraph:'0'}, + // // {id: '3', subject: '项目管理培训题目3?',type:'2',isMust:'0',score:'10',optionA:'选项A',optionB:'选项B',optionC:'选项C',optionD:'选项D',optionE:'选项E',optionF:'选项F',num:'3',isParagraph:'0'}, + // // {id: '4', subject: '项目管理培训题目4?',type:'3',isMust:'0',score:'10',optionA:'',optionB:'',optionC:'',optionD:'',optionE:'',optionF:'',num:'4',isParagraph:'0'}, + // // {id: '5', subject: '项目管理培训题目5?',type:'4',isMust:'0',score:'10',optionA:'',optionB:'',optionC:'',optionD:'',optionE:'',optionF:'',num:'5',isParagraph:'0'} + // ]}, +//单选1,多选2,判断3,问答4 + defaultSortField: 'num' + }); + + //下拉框 选择历史问卷 + $('#name').uiCombobox({ + mode: 'remote', + searchable: true, + // delay :500, + // hasDownArrow:false, + loader: comboxLoad, + url: comboxUrl + "?pg=" + pg, + onSelect: function(record) { + examId = record.id; + eqlist2.uiGrid('loadData', {queryParams:{AndEdit_id: examId}}); + saveHistoryExam(); + } + }); + //下拉框 随机生成题目 + $('#categoryRand').dictCombobox(); + + //初始化Excel导入 + var importUrl = ""; + if(pg == "2"){ + importUrl = fileImportQuestionUrl_R; + }else{ + importUrl = fileImportQuestionUrl; + } + $('#fileform_edit').uiForm({ + template: 'grid_form_temp2_edit', + onLoadSuccess: function (data) { + $('#btnUpload_edit').bind('click', function () { + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确定导入该试卷吗?", + onClose: function (value) { + if (value) { + $('#fileform_edit').uiForm('submit', { + url: importUrl, + dataType: "application/json", + onSubmit: function (params) { + params.id = AndEdit_id; + }, + success: function (result) { + if (result.success) { + // $('#editexampaper_dialog').uiDialog('close');//保存成功后关闭对话框 + eqlist2.uiGrid('loadData'); + setTimeout( function(){ + setStatistic(); + },100); + } + showResult(result.success, result.message); + } + }); + } + } + }); + + }); + } + }); + + }; + + //初始化弹出窗口-编辑试卷内容 editexampaper_dialog在哪??? + var editexampaper_dialog = $('#editexampaper_dialog').uiDialog({ + title: '新建', + icon: 'list', + // width: dialogSize.width, + // height: dialogSize.height, + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: editexampaperPage, + queryParams:{pg: pg}, + onLoadComplete: formeditexampaperInit, + onOpen: function () { + $('#fileform_edit').uiForm('load');//为组件加载数据 + + // var dialogP = $('#editexampaper_dialog').uiDialog('getUserParam'); + // op = dialogP.action; + // var id = dialogP.id; + // switch (op) { + // case 'view': + // case 'edit': + // $('#fileform').uiForm('load', grid.uiGrid('selectedData')[0]); + // break; + // case 'add': + // $('#fileform').uiForm('load', {}); + // break; + // default : + // break; + // } + + setTimeout( function(){//延时等模板加载完毕再计算题数和总分 + setStatistic(); + },100); + }, + onPanelResize: function () { + // setStatistic();//将计算题数和总分的方法放在了组件改变大小时触发,不合理,考虑用SQL语句初始化出来,或者前端有什么方法可以初始化 + }, + buttons: [ + { + id: 'btnOK', + label: '完成编辑', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + + if(isComplete()){ + $('#editexampaper_dialog').uiDialog('close');//保存成功后关闭对话框 + showResult(true,"编辑完成!"); + } + + } + } + ] + }); + + //初始化表单——导入新试卷 + var formimportInit2 = function () { + // $('#btnUpload').uiButton(); + + // $('#btnUpload').uiButton({ + // style: 'button_submit', + // icons: {left: 'icon_edit'}, + // onClick:function () { + // $('#fileform').uiForm('submit', { + // url: fileImportUrl, + // onSubmit: function (params) { + // + // }, + // success: function (result) { + // if (result.success) { + // $('#importnewpaper_dialog').uiDialog('close');//保存成功后关闭对话框 + // } + // showResult(result.success, result.message); + // } + // }); + // } + // }); + + var importUrl = ""; + if(pg == "2"){ + importUrl = fileImportResearchUrl; + }else{ + importUrl = fileImportUrl; + } + + $('#fileform').uiForm({ + template: 'grid_form_temp2', + onLoadSuccess: function (data) { + $('#btnUpload').bind('click', function () { + $('#fileform').uiForm('submit', { + url: importUrl, + dataType: "application/json", + onSubmit: function (params) { + + }, + success: function (result) { + if (result.success) { + $('#importnewpaper_dialog').uiDialog('close');//保存成功后关闭对话框 + grid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + }); + } + }); + + }; + + //初始化弹出窗口——导入新试卷 + var importnewpaper_dialog = $('#importnewpaper_dialog').uiDialog({ + title: '导入', + icon: 'list', + width:"80%", + height:"60%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: importnewexampaperPage, + queryParams:{pg: pg}, + onLoadComplete: formimportInit2, + onOpen: function () { + var dialogP = $('#importnewpaper_dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + $('#fileform').uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + $('#fileform').uiForm('load', {}); + break; + default : + break; + } + + // $('#fileform').uiForm('load');//为组件加载数据 + } + }); + + //初始化表单 预览 试卷 问卷 + var formeditexamInit = function () { + + var eqlist2_preview = $('#eqlist2_preview'); + + eqlist2_preview.uiGrid({ + autoFit: true, + border: false, + colFit: true, + gridTitleFix: false, + width: "100%", + height: "80%", + showHeader: false, + icon: 'list', + pageSize: 50, + url:previewUrl, + queryParams: {'id': grid.uiGrid('selectedData', 'id')[0]},//从前端获取,向后台传递参数 + + defaultSortField: 'num' + }); + + }; + + //预览 试卷 问卷 + var dialog_preview = $('#dialog_preview').uiDialog({ + title: '新建', + icon: 'list', + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + // url: previewPageUrl, + onLoadComplete: formeditexamInit, + onOpen: function () { + if($('#eqlist2_preview').attr("class") != null){ + $('#eqlist2_preview').uiGrid('loadData', {queryParams:{'id': grid.uiGrid('selectedData', 'id')[0]}}); + } + + // var dialogP = $('#dialog_preview').uiDialog('getUserParam'); + // op = dialogP.action; + // var id = dialogP.id; + // switch (op) { + // case 'view': + // case 'edit': + // $('#fileform').uiForm('load', grid.uiGrid('selectedData')[0]); + // break; + // case 'add': + // $('#fileform').uiForm('load', {}); + // break; + // default : + // break; + // } + }, + onClose:function(){ + + }, + buttons: [ + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog_preview.uiDialog('close'); + } + } + ] + }); + + //初始化表单 考试调研详情 查看已答未答 + var detailInit = function () { + + if($('#grid_detail').attr("class") == null){ + $('#grid_detail').uiGrid({ + autoFit: true, + border: false, + colFit: true, + gridTitleFix: false, + width: "100%", + height: "80%", + showHeader: false, + icon: 'list', + pageSize: 50, + url: detailUrl, + queryParams: {'id': grid.uiGrid('selectedData', 'id')[0]}//从前端获取,向后台传递参数 + + }); + } + else{ + $('#grid_detail').uiGrid('loadData'); + } + }; + + //考试调研详情 查看已答未答 + var dialog_detail = $('#dialog_detail').uiDialog({ + title: '新建', + icon: 'list', + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + // onLoadComplete: detailInit, + onOpen: function () { + + if($('#grid_detail').attr("class") == null){ + $('#grid_detail').uiGrid({ + // autoFit: true, + // border: false, + // colFit: true, + // gridTitleFix: false, + // width: "100%", + // height: "80%", + // showHeader: false, + icon: 'list', + // pageSize: 50, + url: detailUrl, + queryParams: {'id': grid.uiGrid('selectedData', 'id')[0]}//从前端获取,向后台传递参数 + + }); + } + else{ + $('#grid_detail').uiGrid('loadData', {queryParams:{'id': grid.uiGrid('selectedData', 'id')[0]}}); + } + }, + onClose:function(){ + // window.location.reload(); + }, + buttons: [ + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog_detail.uiDialog('close'); + } + } + ] + }); + + function addEvents() { + //新建 + $('#btn1').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新建'); + + $('#grid_limitation').hide(); + exam_id = guid();//只要新建就生成临时文件id + + $("#grid_limitation .grid_toolbar table").find("tr").find("td:eq(0)").show(); + $("#grid_limitation .grid_data table").find("tr").find("td:eq(1)").show(); + }); + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + + //编辑试卷内容 + $('#btn3').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + AndEdit_id = ids[0]; + // console.log(AndEdit_id); + + if(ids.length == 0){ + showResult(false,'请选择要编辑的试卷!','alert'); + } + else if(ids.length > 1){ + showResult(false,'请选择要编辑的一张试卷,不支持同时选择多张试卷!','alert'); + } + else{ + editexampaper_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + editexampaper_dialog.uiDialog('button', 'btnOK').show(); + editexampaper_dialog.uiDialog('open'); + editexampaper_dialog.uiDialog('title').html('编辑试卷'); + // $('#eqlist2').uiGrid('loadData',{queryParams: {AndEdit_id: AndEdit_id}}); + + $.ajax({ + type: 'post', + url: exampaperReturnUrl, + data:{'AndEdit_id':AndEdit_id}, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + //showResult(result.success, result.message); + + setTimeout(function () { + if(result.data.rows.length > 0){ + var data=result.data.rows[0];//将后台return的结果显示在前端 + $('#title_name').html(data.name);//试卷名称 + $('#title_description').html(data.description);//试卷描述 + if(data.state == examState.secondState || data.state == examState.thirdState || data.state == examState.fourthState){ + editexampaper_dialog.uiDialog('close'); + alert("正在进行、已关闭和已撤销的试卷不允许编辑!"); + } + + category_ = data.category;//试卷类别 + categoryid_ = data.categoryid;//试卷类别id + } + },100); + + // $('#eqlist2').uiGrid('loadData'); + }, + error:function() { + alert("提交失败"); + } + }); + } + + }); + + //导入试卷 + $('#btn4').bind('click', function () { + importnewpaper_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + importnewpaper_dialog.uiDialog('button', 'btnOK').show(); + importnewpaper_dialog.uiDialog('open'); + importnewpaper_dialog.uiDialog('title').html('导入'); + }); + + //导出试卷 + $('#btn5').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if(pg == "1"){//考试 + if (ids.length == 0) { + showResult(false, '请选择要导出的试卷!', 'alert'); + } + else if(ids.length > 1){ + showResult(false,'请选择要导出的一张试卷,不支持同时选择多张试卷!','alert'); + } + else { + var j = ids[0]; + for (var i=1;i 1){ + showResult(false,'请选择要导出的一张问卷,不支持同时选择多张问卷!','alert'); + } + else { + var j = ids[0]; + for (var i=1;i 1){ + showResult(false,message2,'alert'); + } else{ + $.uiMessagebox.confirm({ + title: '确认操作', + content: message3, + onClose: function (value) { + if (value) { + var id = ids[0]; + var state = examState.fourthState; + + $.ajax({ + type: 'post', + url: saveUrl, + data:{'id':id, + 'state':state + }, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if(result.success){ + showResult(result.success, result.message); + grid.uiGrid('loadData'); + } + }, + error:function() { + alert("撤销失败"); + } + }); + } + } + }); + + } + }); + + //发布 + $('#btn7').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要发布的试卷!', 'alert'); + } else if(ids.length > 1){ + showResult(false,'请选择要发布的一张试卷,不支持同时选择多张试卷!','alert'); + } else{ + $.ajax({ + type: 'post', + url: exampaperReturnUrl, + data: {"AndEdit_id":ids[0]}, + dataType:'json', + success:function (result) { + if(result.success){ + if(result.data.rows.length > 0){ + + var timestamp = new Date().getTime();//获取当前时间戳的三种方式 + // var timestamp = (new Date()).valueOf(); + // var timestamp = Date.parse(new Date()); + + var data=result.data.rows[0];//将后台return的结果显示在前端 + if(data.state == examState.thirdState || data.state == examState.fourthState || data.state == examState.fifthState){ + alert("已关闭、已撤销、线下考试的试卷不允许再次发布!"); + }else if(data.startdate === undefined || data.enddate === undefined){ + alert("请修改试卷开放时间再发布!"); + }else if(timestamp < data.startdate){ + alert("试卷开始时间未到,请修改试卷开放时间再发布!"); + }else if(data.limitation === undefined){ + alert("请选择试卷发放范围再发布!"); + }else { + $.ajax({ + type: 'post', + url: getQuestionNumUrl, + data:{"AndEdit_id":ids[0] + }, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if(result.success){ + if(result.data.rows[0].num == 0){ + alert("请先编辑试卷内容,空试卷不能发布!"); + }else{ + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确认要发布试卷吗?", + onClose: function (value) { + if (value) { + var id = ids[0]; + var state = examState.secondState; + + $.ajax({ + type: 'post', + url: saveUrl, + data:{'id':id, + 'state':state + }, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if(result.success){ + showResult(result.success, result.message); + grid.uiGrid('loadData'); + } + }, + error:function() { + alert("发布试卷失败"); + } + }); + } + } + }); + } + + } + }, + error:function() { + alert("判断试卷有无试题失败"); + } + }); + } + } + } + }, + error:function () { + alert("检查发布试卷失败"); + } + }); + } + }); + + //调研信息汇总 + $('#btn8').bind('click', function () { + //get传参 + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要统计的一张调研问卷!', 'alert'); + }else if(ids.length > 1){ + showResult(false,'请选择要统计的一张调研问卷,不支持同时选择多张调研问卷!','alert'); + }else{ + var j = ids[0]; + for (var i=1;i 1){ + showResult(false,'请选择要预览的一张试卷,不支持同时选择多张试卷!','alert'); + } + else{ + dialog_preview.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog_preview.uiDialog('button', 'btnOK').show(); + dialog_preview.uiDialog('open'); + if(pg == "2"){ + dialog_preview.uiDialog('title').html('调研'); + }else { + dialog_preview.uiDialog('title').html('考试'); + } + + $.ajax({ + type: 'post', + url: previewUrl, + data:{'id':id + }, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if(result.success){ + + setTimeout( function(){ + if(result.data.rows.length > 0){ + var data=result.data.rows[0]; + + $('#title_name_p').html(data.name);//将后台return的结果显示在前端 + $('#title_description_p').html(data.description); + + setStatistic_preview(); + } + },100); + + } + }, + error:function() { + alert("预览试卷失败"); + } + }); + } + }); + + //考试调研详情 查看已答未答 + $('#btn10').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + var id = ids[0]; + + if(ids.length == 0){ + showResult(false,'请选择要查看的考试!','alert'); + } + else if(ids.length > 1){ + showResult(false,'请选择要查看的一场考试,不支持同时选择多场考试!','alert'); + } + else{ + dialog_detail.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog_detail.uiDialog('button', 'btnOK').show(); + dialog_detail.uiDialog('open'); + if(pg == "2"){ + dialog_detail.uiDialog('title').html('调研'); + }else { + dialog_detail.uiDialog('title').html('考试'); + } + } + }); + + //考试调研详情 查看已答未答 导出人员 + $('#btnExportPerson').bind('click', function () { + //get传参 + var ids = grid.uiGrid('selectedData', 'id'); + $.ajax({ + type: 'post', + url: exampaperReturnUrl, + data:{'AndEdit_id':ids[0] + }, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if(result.success){ + if(result.data.rows.length > 0){ + var data=result.data.rows[0];//将后台return的结果显示在前端 + if(data.limitation === '1'){ + var j1 = ids[0]; + var openurl1 =webroot+"/ReportServer?reportlet=detailInstitution.cpt"+'&id='+j1+'&format=excel'; + window.open(openurl1); + }else if(data.limitation === '2'){ + var j2 = ids[0]; + var openurl2 =webroot+"/ReportServer?reportlet=detailDepartment.cpt"+'&id='+j2+'&format=excel'; + window.open(openurl2); + }else if(data.limitation === '3'){ + var j3 = ids[0]; + var openurl3 =webroot+"/ReportServer?reportlet=detailPerson.cpt"+'&id='+j3+'&format=excel'; + window.open(openurl3); + }else if(data.limitation === '4'){ + var j4 = ids[0]; + var openurl4 =webroot+"/ReportServer?reportlet=detailClass.cpt"+'&id='+j4+'&format=excel'; + window.open(openurl4); + }else if(data.limitation === '5'){ + var j5 = ids[0]; + var openurl5 =webroot+"/ReportServer?reportlet=detailCourse.cpt"+'&id='+j5+'&format=excel'; + window.open(openurl5); + }else { + alert("导出人员异常"); + } + } + } + }, + error:function() { + alert("考试调研详情查看已答未答导出人员失败"); + } + }); + }); + + //重新考试 + $('#btn11').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + var id = ids[0]; + exam_id_resit = id;//重新考试要用到的原试卷id + + if(ids.length == 0){ + showResult(false,'请选择要重新考试的试卷!','alert'); + } + else if(ids.length > 1){ + showResult(false,'请选择要重新考试的一张试卷,不支持同时选择多张试卷!','alert'); + } + else{ + $.ajax({ + type: 'post', + url: exampaperReturnUrl, + data:{'AndEdit_id':id + }, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if(result.success){ + if(result.data.rows.length > 0) { + var data = result.data.rows[0];//将后台return的结果显示在前端 + if (data.state === examState.thirdState) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确定要为缺考和不及格的考生重新推送考试吗?", + onClose: function (value) { + if (value) { + + var passpoints = data.passpoints;//及格分 + var limitation = data.limitation;//发放范围 + var temporary_id = guid();//生成临时试卷id + exam_id = temporary_id; + + $.ajax({ + type: 'post', + url: resitUrl, + data:{'exam_id':id, + 'passpoints':passpoints, + 'limitation':limitation, + 'temporary_id':temporary_id + }, + dataType: "json", + success: function (result) { + dialog.uiDialog('setUserParam', {action: 'resit', id: temporary_id});//打开窗口可用编辑时的窗口里的方法拿过来 + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新建'); + + srp = 1;//打开窗口,重新考试标志置为1 + }, + error:function() { + alert("重新推送考试存入人员失败"); + } + }); + + } + } + }); + + }else{ + alert("只有已关闭状态的试卷允许重新推送考试!"); + } + } + } + }, + error:function() { + alert("检查重新推送考试失败"); + } + }); + + } + }); + + } + + //arttemplate语法 + template.helper('judge', function (data, format) { + if (data!=undefined && data.indexOf(format)!=-1){ + return true; + }else { + return false;} + }); + +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + dialog.uiDialog('button', 'btnSave').hide(); + + exam_id = id; +} + +//编辑 +function editRow(id) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('button', 'btnOK').show(); + + exam_id = id; +} + +//查看发放范围 +function viewLimitationRow(id) { + if($('input:radio[id="cb4_l"]:checked').val() == "on"){ + var dialog_department = $('#dialog_department'); + dialog_department.uiDialog('setUserParam', {action: 'view', id: id}); + // dialog_department.uiDialog('button', 'btnSave').hide(); + // dialog_department.uiDialog('button', 'btnOK').hide(); + dialog_department.uiDialog('open'); + }else if($('input:radio[id="cb5_l"]:checked').val() == "on"){ + var dialog_person = $('#dialog_person'); + dialog_person.uiDialog('setUserParam', {action: 'view', id: id}); + // dialog_person.uiDialog('button', 'btnSave').hide(); + // dialog_person.uiDialog('button', 'btnOK').hide(); + dialog_person.uiDialog('open'); + }else if($('input:radio[id="cb6_l"]:checked').val() == "on"){ + var dialog_class = $('#dialog_class'); + dialog_class.uiDialog('setUserParam', {action: 'view', id: id}); + // dialog_class.uiDialog('button', 'btnSave').hide(); + // dialog_class.uiDialog('button', 'btnOK').hide(); + dialog_class.uiDialog('open'); + }else if($('input:radio[id="cb7_l"]:checked').val() == "on"){ + var dialog_course = $('#dialog_person'); + dialog_course.uiDialog('setUserParam', {action: 'view', id: id}); + // dialog_course.uiDialog('button', 'btnSave').hide(); + // dialog_course.uiDialog('button', 'btnOK').hide(); + dialog_course.uiDialog('open'); + } +} +//编辑发放范围 +function editLimitationRow(id) { + if($('input:radio[id="cb4_l"]:checked').val() == "on"){ + var dialog_department = $('#dialog_department'); + dialog_department.uiDialog('title').html('编辑'); + dialog_department.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog_department.uiDialog('button', 'btnSave').show(); + dialog_department.uiDialog('button', 'btnOK').show(); + dialog_department.uiDialog('open'); + }else if($('input:radio[id="cb5_l"]:checked').val() == "on"){ + var dialog_person = $('#dialog_person'); + dialog_person.uiDialog('title').html('编辑'); + dialog_person.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog_person.uiDialog('button', 'btnSave').show(); + dialog_person.uiDialog('button', 'btnOK').show(); + dialog_person.uiDialog('open'); + }else if($('input:radio[id="cb6_l"]:checked').val() == "on"){ + var dialog_class = $('#dialog_class'); + dialog_class.uiDialog('title').html('编辑'); + dialog_class.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog_class.uiDialog('button', 'btnSave').show(); + dialog_class.uiDialog('button', 'btnOK').show(); + dialog_class.uiDialog('open'); + }else if($('input:radio[id="cb7_l"]:checked').val() == "on"){ + var dialog_course = $('#dialog_course'); + dialog_course.uiDialog('title').html('编辑'); + dialog_course.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog_course.uiDialog('button', 'btnSave').show(); + dialog_course.uiDialog('button', 'btnOK').show(); + dialog_course.uiDialog('open'); + } +} + +//删除 发放范围 +function deleteLimitationRow(id) { + deleteData_exampaper("确定要删除所选信息吗?", deleteLimitationUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid_limitation').uiGrid('loadData'); + deletePerson(id,2);//依据limitation id删除课程班级对应的人 + } + }); +} + +// 删除 +function deleteRow(id) { + $.ajax({ + type:'post', + url:checkDeleteUrl, + data:{"id":id}, + dataType:'json', + success:function (res) { + if(res.success){ + deleteData_exampaper("此操作将删除试卷,可能会导致以往考试找不到试卷,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + + deleteLimitation(id);//依据试卷id删除limitation表中的全所部门人员课程班级 + deletePerson(id,1);//依据试卷id删除课程班级对应的人 + deleteExamQuestion(id);//删除试卷中的试题 + } + }); + } + }, + error:function () { + alert("检查试卷能否删除失败!"); + } + }); +} + +//删除 +function deleteData_exampaper(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + height: 110, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} + +//依据试卷id删除limitation表中的全所部门人员课程班级 +function deleteLimitation(id) { + $.ajax({ + type: 'post', + url: deleteLimitationExampaperUrl, + data: {'id':id}, + dataType: "json", + success: function (result) { + }, + error:function() { + alert("依据试卷id删除limitation表中的全所部门人员课程班级失败!"); + } + }); +} + +//删除课程班级对应的人 +function deletePerson(id,num) {//num 1依据试卷id删 2依据limitation id删 + $.ajax({ + type: 'post', + url: deletePersonUrl, + data: {'id':id, + 'num':num}, + dataType: "json", + success: function (result) { + }, + error:function() { + alert("删除课程班级对应的人失败!"); + } + }); +} + +//删除试卷中的试题 +function deleteExamQuestion(id) { + $.ajax({ + type: 'post', + url: deleteExamQuestionUrl, + data: {'id':id}, + dataType: "json", + success: function (result) { + }, + error:function() { + alert("删除试卷中的试题失败!"); + } + }); +} + +//选择历史试卷 下拉框 +function comboxLoad(param, success, error) { + var opts = $(this).uiCombobox('options'); + if (!opts.url) return false; + $.ajax({ + type: opts.method, + url: opts.url, + showLoading: false, + data: param, + showAlert:false, + dataType: 'json', + success: function (result) { + if (result.success) { + success(result.data); + } + }, + error: function () { + error.apply(this, arguments); + } + }); +} + +//选择历史问卷 不从前端依次获取插入,在数据库中将题目复制插入到数据库中 +function saveHistoryExam() { + if($('#name').uiCombo('getText') == ""){ + alert("请选择历史试卷!"); + return; + } + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确定使用该历史问卷吗?", + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: saveHistoryUrl, + data: {'examId':examId,'id':AndEdit_id},//examId是想使用的历史问卷的id,AndEdit_id是正在编辑的试卷id + dataType: "json", + success: function (result) { + $('#eqlist2').uiGrid('loadData', {queryParams:{AndEdit_id: AndEdit_id}}); + showResult(result.success, result.message); + setStatistic(); + } + }); + }else{ + $('#eqlist2').uiGrid('loadData', {queryParams:{AndEdit_id: AndEdit_id}}); + $('#name').uiCombo('clear');//清除下拉框已选项 + } + } + }); + +} + +//选择历史问卷 从前端依次获取存入数据库中 未使用 +// function saveHistoryExam() { +// for (var i=1; i<$('#eqlist2').find('tr').length; i++){ +// var parent=""; +// // var history_id=""; +// var edit_id=""; +// var num=""; +// var subject=""; +// var type=""; +// var type_num=""; +// var ismust=""; +// var score=""; +// var a=""; +// var b=""; +// var c=""; +// var d=""; +// var ee=""; +// var f=""; +// var isParagraph = ""; +// var answer=""; +// +// parent=$('#eqlist2').find('tr:eq('+i+')'); +// // history_id=parent.find(".qid").html(); +// edit_id=AndEdit_id;//试卷的id +// num=parent.find(".qxh").html(); +// subject=parent.find(".qtm").html(); +// type=parent.find(".qtype").html(); +// if(type == "单选题"){ +// type_num = 1; +// }else if(type == "多选题"){ +// type_num = 2; +// }else if(type == "判断题"){ +// type_num = 3; +// }else if(type == "填空题"){ +// type_num = 4; +// }else if(type == "问答题"){ +// type_num = 5; +// } +// ismust=parent.find(".qbd").html(); +// score=parent.find(".score").html(); +// a=parent.find(".a").html(); +// b=parent.find(".b").html(); +// c=parent.find(".c").html(); +// d=parent.find(".d").html(); +// ee=parent.find(".e").html(); +// f=parent.find(".f").html(); +// isParagraph = 0; +// answer=parent.find(".answer").html(); +// +// $.ajax({ +// type: 'post', +// url: "", +// data: { +// // 'history_id':id, +// 'edit_id':edit_id, +// 'num':num, +// 'subject':subject, +// 'type':type, +// 'type_num':type_num, +// 'ismust':ismust, +// 'score':score, +// 'optionA':a, +// 'optionB':b, +// 'optionC':c, +// 'optionD':d, +// 'optionE':ee, +// 'optionF':f, +// 'isParagraph':isParagraph, +// 'answer':answer}, +// dataType: "json", +// success: function (result) { +// if (result.success) { +// $('#eqlist2').uiGrid('loadData'); +// } +// showResult(result.success, result.message); +// }, +// error:function() { +// alert("提交历史试卷失败"); +// } +// }); +// } +// } + +//发放范围——添加 +function addList(n) { + if(n == 2){ + + }else if(n == 3){ + + } + else if(n == 4){ + + } + else if(n == 5){ + + } + +} +//发放范围 显示 +function specifiedRange(num) { + if (num === 1){ + deleteOtherLimitation(); + $('#grid_limitation').hide(); + + }else if(num === 2){ + deleteOtherLimitation(); + $('#grid_limitation').uiGrid('loadData',{queryParams:{"exam_id": exam_id}}); + $('#grid_limitation').show(); + $('#spanDepartment').show(); + $('#spanPerson').hide(); + $('#spanClass').hide(); + $('#spanCourse').hide(); + $('#btnDepartment').show(); + $('#btnPerson').hide(); + $('#btnClass').hide(); + $('#btnCourse').hide(); + $('#btnImport').hide(); + + }else if(num === 3){ + deleteOtherLimitation(); + $('#grid_limitation').uiGrid('loadData',{queryParams:{"exam_id": exam_id}}); + $('#grid_limitation').show(); + $('#spanDepartment').hide(); + $('#spanPerson').show(); + $('#spanClass').hide(); + $('#spanCourse').hide(); + $('#btnDepartment').hide(); + $('#btnPerson').show(); + $('#btnClass').hide(); + $('#btnCourse').hide(); + $('#btnImport').show(); + + }else if(num === 4){ + deleteOtherLimitation(); + $('#grid_limitation').uiGrid('loadData',{queryParams:{"exam_id": exam_id}}); + $('#grid_limitation').show(); + $('#spanDepartment').hide(); + $('#spanPerson').hide(); + $('#spanClass').show(); + $('#spanCourse').hide(); + $('#btnDepartment').hide(); + $('#btnPerson').hide(); + $('#btnClass').show(); + $('#btnCourse').hide(); + $('#btnImport').hide(); + + }else if(num === 5){ + deleteOtherLimitation(); + $('#grid_limitation').uiGrid('loadData',{queryParams:{"exam_id": exam_id}}); + $('#grid_limitation').show(); + $('#spanDepartment').hide(); + $('#spanPerson').hide(); + $('#spanClass').hide(); + $('#spanCourse').show(); + $('#btnDepartment').hide(); + $('#btnPerson').hide(); + $('#btnClass').hide(); + $('#btnCourse').show(); + $('#btnImport').hide(); + + } +} + +//随机添加试题 +function randomAdd() { + var categoryRand = 0; + var singleNum = 0; + var multipleNum = 0; + var judgementNum = 0; + var essayNum = 0; + var blankNum = 0; + + if($('#categoryRand').uiCombo('getText') == ""){ + alert("请选择试卷类别!"); + return; + }else { + categoryRand = $('#categoryRand').uiCombo('getValue'); + } + if($('#singleNum').val() != ""){ + singleNum = $('#singleNum').val(); + } + if($('#multipleNum').val() != ""){ + multipleNum = $('#multipleNum').val(); + } + if($('#judgementNum').val() != ""){ + judgementNum = $('#judgementNum').val(); + } + if($('#essayNum').val() != ""){ + essayNum = $('#essayNum').val(); + } + if($('#blankNum').val() != ""){ + blankNum = $('#blankNum').val(); + } + + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确定随机添加试题吗?", + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: randUrl, + data: {'id':AndEdit_id, + 'categoryid':categoryRand, + 'singleNum':singleNum, + 'multipleNum':multipleNum, + 'judgementNum':judgementNum, + 'essayNum':essayNum, + 'blankNum':blankNum}, + dataType: "json", + success: function (result) { + if (result.success) { + $('#eqlist2').uiGrid('loadData'); + + setTimeout( function(){ + setStatistic(); + },100); + + } + showResult(result.success, result.message); + }, + error:function() { + alert("随机添加试题失败"); + } + }); + } + } + }); +} + +//删除其他的指定范围 +function deleteOtherLimitation(){ + $.ajax({ + type: 'post', + url: deleteOtherUrl, + data: {"exam_id": exam_id}, + dataType: "json", + success: function (result) { + deletePerson(exam_id,1);//依据试卷id删除课程班级对应的人 + $('#grid_limitation').uiGrid('loadData'); + }, + error:function() { + alert("删除其他的指定范围失败"); + } + }); +} + +//生成32位UUID +function S4() { + return (((1+Math.random())*0x10000)|0).toString(16).substring(1); +} +function guid() { + return (S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4()); +} + +//查看 编辑 指定范围 +function limitationHide() { + if($('input:radio[id="cb3_l"]:checked').val() == "on"){ + $('#grid_limitation').hide(); + // $('#tdRange').replaceWith("指定全所"); + + }else if($('input:radio[id="cb4_l"]:checked').val() == "on"){ + $('#spanDepartment').show(); + $('#spanPerson').hide(); + $('#spanClass').hide(); + $('#spanCourse').hide(); + $('#btnDepartment').show(); + $('#btnPerson').hide(); + $('#btnClass').hide(); + $('#btnCourse').hide(); + $('#btnImport').hide(); + // $('#tdRange').replaceWith("指定部门"); + + }else if($('input:radio[id="cb5_l"]:checked').val() == "on"){ + $('#spanDepartment').hide(); + $('#spanPerson').show(); + $('#spanClass').hide(); + $('#spanCourse').hide(); + $('#btnDepartment').hide(); + $('#btnPerson').show(); + $('#btnClass').hide(); + $('#btnCourse').hide(); + $('#btnImport').show(); + // $('#tdRange').replaceWith("指定人员"); + + }else if($('input:radio[id="cb6_l"]:checked').val() == "on"){ + $('#spanDepartment').hide(); + $('#spanPerson').hide(); + $('#spanClass').show(); + $('#spanCourse').hide(); + $('#btnDepartment').hide(); + $('#btnPerson').hide(); + $('#btnClass').show(); + $('#btnCourse').hide(); + $('#btnImport').hide(); + + }else if($('input:radio[id="cb7_l"]:checked').val() == "on"){ + $('#spanDepartment').hide(); + $('#spanPerson').hide(); + $('#spanClass').hide(); + $('#spanCourse').show(); + $('#btnDepartment').hide(); + $('#btnPerson').hide(); + $('#btnClass').hide(); + $('#btnCourse').show(); + $('#btnImport').hide(); + } +} + +function checkSize(ele){ + var size_m = (ele.files[0].size / 1024); + if(size_m >= 1024*1024*5){ + $('#hidFile').val(1); + return false; + } + $('#hidFile').val(0); + return true; +} + +//验证题目完整性 +function isComplete() { + var count=$('#eqlist2').find("button").length;//计算页面中有多少个button按钮,使用length方法 + if(count > 1) + { + alert("请先保存所有题目再点击完成编辑!"); + return false; + } + + for (var i=1; i<$('#eqlist2').find('tr').length; i++){ + var parent=""; + var qtm=""; + var score = ""; + var a = ""; + var b = ""; + var c = ""; + var d = ""; + var ee = ""; + var f = ""; + var answer = ""; + var type = ""; + + parent=$('#eqlist2').find('tr:eq('+i+')'); + type = parent.find('.qtype').text(); + qtm = parent.find('.qtm').text(); + if($.trim(qtm) == ''){//trim函数 去掉空格 + alert("请先填写第"+i+"题的题目再保存!"); + return false; + } + if(qtm.length > 200){ + alert("第"+i+"题的题目限制200个字符,请修改后保存!"); + return false; + } + if($('#pg').val() == "1"){ + score =parent.find('.score').text(); + if($.trim(score) == ''){//trim函数 去掉空格 + alert("请先设置第"+i+"题的分数再保存!"); + return false; + } + } + if(type == "单选题" || type == "多选题") { + if (typeof (parent.find('#a').html()) !== "undefined") { + a = parent.find("#a").text(); + if ($.trim(a) == '') {//trim函数 去掉空格 + alert("请先填写第" + i + "题的选项A再保存!"); + return false; + } + if (a.length > 100) { + alert("第" + i + "题的选项限制100个字符,请修改后保存!"); + return false; + } + } + if (typeof (parent.find('#b').html()) !== "undefined") { + b = parent.find("#b").text(); + if ($.trim(b) == '') {//trim函数 去掉空格 + alert("请先填写第" + i + "题的选项B再保存!"); + return false; + } + if (b.length > 100) { + alert("第" + i + "题的选项限制100个字符,请修改后保存!"); + return false; + } + } + if (typeof (parent.find('#c').html()) !== "undefined") { + c = parent.find("#c").text(); + if ($.trim(c) == '') {//trim函数 去掉空格 + alert("请先填写第" + i + "题的选项C再保存!"); + return false; + } + if (c.length > 100) { + alert("第" + i + "题的选项限制100个字符,请修改后保存!"); + return false; + } + } + if (typeof (parent.find('#d').html()) !== "undefined") { + d = parent.find("#d").text(); + if ($.trim(d) == '') {//trim函数 去掉空格 + alert("请先填写第" + i + "题的选项D再保存!"); + return false; + } + if (d.length > 100) { + alert("第" + i + "题的选项限制100个字符,请修改后保存!"); + return false; + } + } + } + if(type == "多选题") { + if (typeof (parent.find('#e').html()) !== "undefined") { + ee = parent.find("#e").text(); + if ($.trim(ee) == '') {//trim函数 去掉空格 + alert("请先填写第"+i+"题的选项E再保存!"); + return false; + } + if(ee.length > 100){ + alert("第"+i+"题的选项限制100个字符,请修改后保存!"); + return false; + } + } + if (typeof (parent.find('#f').html()) !== "undefined") { + f = parent.find("#f").text(); + if ($.trim(f) == '') {//trim函数 去掉空格 + alert("请先填写第"+i+"题的选项F再保存!"); + return false; + } + if(f.length > 100){ + alert("第"+i+"题的选项限制100个字符,请修改后保存!"); + return false; + } + } + } + // answer = parent.find(".answer").text();//取不到值? + // if($('#pg').val() == "1"){ + // if($.trim(answer) == ''){//trim函数 去掉空格 + // alert("请先填写第"+i+"题的答案再保存!"); + // return false; + // } + // if(answer.length > 2000){ + // alert("第"+i+"题的答案限制2000个字符,请修改后保存!"); + // return false; + // } + // } + + } + return true; +} + +//重新推送考试 保存原试卷试题至补考试卷中 +function saveResitPaper(exam_id_) { + $.ajax({ + type: 'post', + url: saveResitPaperUrl, + data:{'exam_id_':exam_id_, + 'exam_id_resit':exam_id_resit + }, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if(result.success){ + showResult(result.success, result.message); + } + }, + error:function() { + alert("重新推送考试,保存原试卷试题至补考试卷中失败"); + } + }); + + srp = 0; +} diff --git a/asset/js/cetc54/exam/exampaper_editexampaper.js b/asset/js/cetc54/exam/exampaper_editexampaper.js new file mode 100644 index 0000000..e1175bc --- /dev/null +++ b/asset/js/cetc54/exam/exampaper_editexampaper.js @@ -0,0 +1,1188 @@ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/exam/exampaper/'; +var save_editexampaper_Url = rootUrl + 'save_editexampaper';//编辑试卷内容 保存数据地址 +var delete_editexampaper_Url = rootUrl + 'delete_editexampaper';//编辑试卷内容 删除数据地址 +var countNumberUrl = rootUrl + 'countNumber';//编辑试卷内容 计算题目数量 +var calculateScoreUrl = rootUrl + 'calculateScore';//编辑试卷内容 计算分值 +var setNumberUrl = rootUrl + 'setNumber';//加题后 排序 +var setDeleteNumberUrl = rootUrl + 'setDeleteNumber';//删题后 排序 +var moveUpUrl = rootUrl + 'moveUp';//上移 +var moveDownUrl = rootUrl + 'moveDown';//下移 + +var isEditingFlag = false; //是否有题目处于正在编辑状态 +var addQ = 0; +var addP = 0; +var pg_ = "";//控制考试与调研页面交替,1考试2调研 +pg_ = $('#pg').val(); + +//此方法需要实现从后台获取到当前试卷增加新题目时,题目的题号 +function getNewQuestionNum() +{ + return 6+addQ++; +} + +//此方法需要实现从后台获取到当前试卷增加新题目或者段落时,其位置号 +function getNewPositionNum() +{ + return 6+addP++; +} + +var item = { + id: '', + subject: '', + type: '', + isMust: '', + optionA: '', + optionB: '', + optionC: '', + optionD: '', + optionE: '', + optionF: '', + score: '', + num: '', + isParagraph:'', + answer:'' +}; + +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + callback && callback.call(this, value); + // alert(value); + // return value; + // $.ajax({ + // type: 'post', + // url: url, + // data: data, + // dataType: "json", + // success: function (result) { + // callback && callback.call(this, result); + // } + // }); + + } + } + }); +} + +//编辑问题 +function editquestion(e) { + var count=$('#eqlist2').find("button").length;//计算页面中有多少个button按钮,使用length方法 + if(count > 1) + { + alert("请先保存上一题目再进行下一题的编辑!"); + return; + } + + isEditingFlag = true; + var itr = $(e).parents().filter('tr:eq(0)');//下标等于0的tr,即第1个tr + gettrdata(itr); + + var eqhtml=''+ + '
          '+ + ''+ + // 'Q'+ + 'Q'+ + //'Q'+item.num + + //' '+ + ' '+ + ' '+ + ' 必答'+ + // ' < style="width: 8%">'+ + // ' '+ + ''+item.type+''+ + // ''+ + ''+ + // '<#if pg=="1">'+ + ''+ + ''+ + // ''+ + //''+'分'+''+ + '
          '; + // if(item.type=="1" || item.type=="2") { + if(item.type=="单选题" || item.type=="多选题") { + if (item.optionA != null && item.optionA.length > 0) eqhtml += '
          A
          '; + if (item.optionB != null && item.optionB.length > 0) eqhtml += '
          B
          '; + if (item.optionC != null && item.optionC.length > 0) eqhtml += '
          C
          '; + if (item.optionD != null && item.optionD.length > 0) eqhtml += '
          D
          '; + if (item.optionE != null && item.optionE.length > 0) eqhtml += '
          E
          '; + if (item.optionF != null && item.optionF.length > 0) eqhtml += '
          F
          '; + } + + if(item.type=="问答题") eqhtml +='
          答案:

          '; + + if(item.type=="填空题") { + eqhtml +='输入完整的题目后,从题目开始按顺序依次选中需要填空的文字点击“设为空格”
          '+ + '答案:
          '; + } + if(item.type=="单选题") { + eqhtml += ''; + } + if(item.type=="多选题") { + eqhtml += ''; + } + if(item.type=="判断题"){ + eqhtml += '
          '+ + 'A 对'+ + ''+ + '
          '+ + '
          '+ + 'B 错'+ + ''+ + '
          ' + } + + eqhtml += ''; + eqhtml += ''; + eqhtml += ''; + + // if(item.isMust=="1") + // { + // $('#cb').prop('checked'); + // } + + // itr.parent().find("tr:eq("+ (item.order -1)+")").append(eqhtml); + itr.html(""); + itr.html(eqhtml); + + if(item.type=="单选题" || item.type=="判断题"){ + checkBox(); + } + + item = { + id: '', + subject: '', + type: '', + isMust: '', + optionA: '', + optionB: '', + optionC: '', + optionD: '', + optionE: '', + optionF: '', + score: '', + num: '', + isParagraph:'' + }; + + // alert(item.a1); + // itr.remove(); + + + // alert(this.find(div).id); + + // alert($("#"+id).attr("id")); + // $("#"+id).find("table").hide(); + // $("#xzt").show(); + // $("#"+id).append($("#xzt").html()) +} +//保存问题 +function savequestion(e,tk,sort) {//tk 1保存2存题库 sort 1排序2不排序 + + var parent = $(e).parents().filter('tr:eq(0)');//下标等于0的tr,即第1个tr + var editexampaper_id = parent.find(".qid").html();//每一题的id + + var edit_id=""; + var num=""; + var subject=""; + var type=""; + var type_num=""; + var ismust=""; + var score=""; + var a=""; + var b=""; + var c=""; + var d=""; + var ee=""; + var f=""; + var isParagraph = 0; + var answer=""; + + var category = "";//试卷类别 + var categoryid = "";//试卷类别id + category = category_; + categoryid = categoryid_; + + edit_id =AndEdit_id;//试卷的id + num = parent.find('#question_numid').val(); + subject = parent.find('#subject').val(); + if($.trim(subject) == ''){//trim函数 去掉空格 + alert("请先填写题目再保存!"); + return; + } + if(parent.find('#subject').val().length > 200){ + alert("题目限制200个字符,请修改后保存!"); + return; + } + type = parent.find('#questiontype').text(); + type_num; + if(type == "单选题"){ + type_num = 1; + }else if(type == "多选题"){ + type_num = 2; + }else if(type == "判断题"){ + type_num = 3; + }else if(type == "填空题"){ + type_num = 4; + }else if(type == "问答题"){ + type_num = 5; + } + + if(parent.find('#cb').prop('checked')){ + ismust = 1; + }else{ + ismust = 0; + } + + if($('#pg').val() == "1"){ + score =parent.find('#score').val(); + if($.trim(score) == ''){//trim函数 去掉空格 + alert("请先设置分数再保存!"); + return; + } + } + + if(typeof (parent.find('#a').val()) !== "undefined") { + a = parent.find("#a").val(); + if ($.trim(a) == '') {//trim函数 去掉空格 + alert("请先填写选项A再保存!"); + return; + } + if(a.length > 100){ + alert("选项限制100个字符,请修改后保存!"); + return; + } + } + if(typeof (parent.find('#b').val()) !== "undefined") { + b = parent.find("#b").val(); + if ($.trim(b) == '') {//trim函数 去掉空格 + alert("请先填写选项B再保存!"); + return; + } + if(b.length > 100){ + alert("选项限制100个字符,请修改后保存!"); + return; + } + } + if(typeof (parent.find('#c').val()) !== "undefined") { + c = parent.find("#c").val(); + if ($.trim(c) == '') {//trim函数 去掉空格 + alert("请先填写选项C再保存!"); + return; + } + if(c.length > 100){ + alert("选项限制100个字符,请修改后保存!"); + return; + } + } + if(typeof (parent.find('#d').val()) !== "undefined") { + d = parent.find("#d").val(); + if ($.trim(d) == '') {//trim函数 去掉空格 + alert("请先填写选项D再保存!"); + return; + } + if(d.length > 100){ + alert("选项限制100个字符,请修改后保存!"); + return; + } + } + if(type == "多选题") { + if (typeof (parent.find('#e').val()) !== "undefined") { + ee = parent.find("#e").val(); + if ($.trim(ee) == '') {//trim函数 去掉空格 + alert("请先填写选项E再保存!"); + return; + } + if(ee.length > 100){ + alert("选项限制100个字符,请修改后保存!"); + return; + } + } + if (typeof (parent.find('#f').val()) !== "undefined") { + f = parent.find("#f").val(); + if ($.trim(f) == '') {//trim函数 去掉空格 + alert("请先填写选项F再保存!"); + return; + } + if(f.length > 100){ + alert("选项限制100个字符,请修改后保存!"); + return; + } + } + } + + if(parent.find('#cbA').prop('checked')){ + answer += "A"; + if(type == "判断题") + { + answer = "对"; + } + } + if (parent.find('#cbB').prop('checked')){ + answer += "B"; + if(type == "判断题") + { + answer = "错"; + } + } + if (parent.find('#cbC').prop('checked')){ + answer += "C"; + } + if (parent.find('#cbD').prop('checked')){ + answer += "D"; + } + if (parent.find('#cbE').prop('checked')){ + answer += "E"; + } + if (parent.find('#cbF').prop('checked')){ + answer += "F"; + } + if(type == "问答题" || type == "填空题") + { + // answer = $('#answer').val();//页面中有多个id为answer的标签,该方法只能获取第一个的 + answer = parent.find(".answer").val();//该方法可以获取最近的class为q_iem的标签的内容 + } + if($('#pg').val() == "1"){ + if($.trim(answer) == ''){//trim函数 去掉空格 + alert("请先填写答案再保存!"); + return; + } + if(answer.length > 2000){ + alert("答案限制2000个字符,请修改后保存!"); + return; + } + } + + //保存题目 + $.ajax({ + type: 'post', + url: save_editexampaper_Url, + data: {'id':editexampaper_id, + 'edit_id':edit_id, + 'num':num, + 'subject':subject, + 'type':type, + 'type_num':type_num, + 'ismust':ismust, + 'score':score, + 'optionA':a, + 'optionB':b, + 'optionC':c, + 'optionD':d, + 'optionE':ee, + 'optionF':f, + 'isParagraph':isParagraph, + 'answer':answer, + 'tk':tk, + 'category':category, + 'categoryid':categoryid}, + dataType: "json", + success: function (result) { + if (result.success) { + if(sort == '1'){ + //排序 + $.ajax({ + type: 'post', + url: setNumberUrl, + data: {'id':result.data.questionId, + 'edit_id':edit_id, + 'num':num, + 'type_num':type_num}, + dataType: "json", + success: function (result) { + if (result.success) { + $('#eqlist2').uiGrid('loadData'); + } + showResult(result.success, result.message); + }, + error:function() { + alert("排序失败"); + } + }); + }else{ + $('#eqlist2').uiGrid('loadData'); + } + } + showResult(result.success, result.message); + }, + error:function() { + alert("保存题目失败"); + } + }); + + + + var itr = $(e).parents().filter('tr:eq(0)');//下标等于0的tr,即第1个tr + getinputdata(itr); + // var tname = ''; + // if(item.type==1) tname='单选题'; + // else if(item.type==2) tname='多选题'; + // else if(item.type==3) tname='判断题'; + // else if(item.type==4) tname='问答题'; + var tname = item.type; + + var eqhtml=''+ + '
          '+ + ''+ + // ''+ + 'Q'+item.num+' '+''+ + ''+item.subject+''+ + tname+ + ''+ + (item.isMust=="1"?"(必答)":"(选答)")+ + ''+ + ''+ + //''+ + ''+ + ''+ + // ''+ + ''+ + ''+ + ''+item.score+''+ + '
          '; + // if(item.type==1 || item.type==2) { + if(item.type=="单选题" || item.type=="多选题") { + if (item.optionA != null && item.optionA.length > 0) eqhtml += '
          A' +' '+ item.optionA + '
          '; + if (item.optionB != null && item.optionB.length > 0) eqhtml += '
          B' +' '+ item.optionB + '
          '; + if (item.optionC != null && item.optionC.length > 0) eqhtml += '
          C' +' '+ item.optionC + '
          '; + if (item.optionD != null && item.optionD.length > 0) eqhtml += '
          D' +' '+ item.optionD + '
          '; + if (item.optionE != null && item.optionE.length > 0) eqhtml += '
          E' +' '+ item.optionE + '
          '; + if (item.optionF != null && item.optionF.length > 0) eqhtml += '
          F' +' '+ item.optionF + '
          '; + } + + //if(item.qtype==4) eqhtml +='
          '; + } + + // itr.parent().find("tr:eq("+ (item.order -1)+")").append(eqhtml); + itr.html("");//将添加的题清空,保存成功之后会使用ajax里的$('#eqlist2').uiGrid('loadData')刷新并重新排列题目 + itr.html(eqhtml).hide();//隐藏掉是为了避免添加的题仍然存在 + item = { + id: '', + subject: '', + type: '', + isMust: '', + optionA: '', + optionB: '', + optionC: '', + optionD: '', + optionE: '', + optionF: '', + score: '', + num: '', + isParagraph:'' + }; + //保存成功后,将flag设为false + isEditingFlag = false; + + setStatistic(); +} +//添加选项 +function additem(e) { + var obj = $(e).parents().filter('td:eq(0)').find('.q_item').last(); + var n = obj[0].children[0].innerHTML; + var type = $(e).parents().find('#questiontype').html(); + if(type === "单选题" && n === "D"){ + alert("单选题最多支持4个候选项!"); + return; + } + if(type === "多选题" && n === "F"){ + alert("多选题最多支持6个候选项!"); + return; + } + var value_id = ''; + var value = ''; + switch(n){ + case 'A': + value_id='b'; + value = 'B';break; + case 'B': + value_id='c'; + value = 'C';break; + case 'C': + value_id='d'; + value = 'D';break; + case 'D': + value_id='e'; + value = 'E';break; + case 'E': + value_id='f'; + value = 'F';break; + case 'F': + return; + case '': + return; + } + var ihtml = '
          ' + + '' + value +'  '+ + '' + + ' ' + + '' + + '
          '; + obj.after(ihtml); +} + +//移除选项 可以视为更新,将某选项设置为空即可 +function deleteitem(e) { + + var parent = $(e).parents().filter('tr:eq(0)');//下标等于0的tr,即第1个tr + var editexampaper_id = parent.find(".qid").html();//每一题的id + + if(editexampaper_id == ""){ + var idiv = $(e).parents().filter('div:eq(0)'); + idiv.remove(); + } + else { + var idiv = $(e).parents().filter('div:eq(0)'); + idiv.remove(); + + var a = ""; + var b = ""; + var c = ""; + var d = ""; + var ee= ""; + var f = ""; + + if(typeof ($('#a').val()) !== "undefined") + { + a = $('#a').val(); + } + if(typeof ($('#b').val()) !== "undefined") + { + b = $('#b').val(); + } + if(typeof ($('#c').val()) !== "undefined") + { + c = $('#c').val(); + } + if(typeof ($('#d').val()) !== "undefined") + { + d = $('#d').val(); + } + if(typeof ($('#e').val()) !== "undefined") + { + ee = $('#e').val(); + } + if(typeof ($('#f').val()) !== "undefined") + { + f = $('#f').val(); + } + // var answer=""; + // if($('#cbA').prop('checked')){ + // answer += "A"; + // } + // if ($('#cbB').prop('checked')){ + // answer += "B"; + // } + // if ($('#cbC').prop('checked')){ + // answer += "C"; + // } + // if ($('#cbD').prop('checked')){ + // answer += "D"; + // } + // if ($('#cbE').prop('checked')){ + // answer += "E"; + // } + // if ($('#cbD').prop('checked')){ + // answer += "F"; + // } + + $.ajax({ + type: 'post', + url: save_editexampaper_Url, + data: {'id':editexampaper_id, + 'optionA':a, + 'optionB':b, + 'optionC':c, + 'optionD':d, + 'optionE':ee, + 'optionF':f + // 'answer':answer + }, + dataType: "json", + success: function (result) { + if (result.success) { + //$('#eqlist2').uiGrid('loadData'); + } + showResult(result.success, result.message); + }, + error:function() { + alert("提交失败"); + } + }); + } + +} + +//添加题目 +function addquestion(e, type) { + var count=$('#eqlist2').find("button").length;//计算页面中有多少个button按钮,使用length方法 + if(count > 0) + { + alert("请先保存上一题目再添加下一题!"); + return; + } + + isEditingFlag = true; + var nextnum = $("#eqlist2").find('tr').length + 1; + var qhtml = ' '; + if (type == "1") { + qhtml += $("#add1").html(); + } + if (type == "2") { + qhtml += $("#add2").html(); + } + if (type == "3" ) { + qhtml += $("#add3").html(); + } + if (type == "4" ) { + qhtml += $("#add4").html(); + } + if (type == "5" ) { + qhtml += $("#add5").html(); + } + qhtml += ''; + $("#eqlist2").find('tr').last().after(qhtml); + $("#eqlist2 .grid_data").last()[0].scrollTop = $("#eqlist2 .grid_data").last()[0].scrollHeight; + + if (type == "1" || type == "3"){ + checkBox(); + } + +} +//移除题目 +// function deletequestion(e,position) { +function deletequestion(e) { + var parent = $(e).parents().filter('tr:eq(0)');//下标等于0的tr,即第1个tr + var editexampaper_id = parent.find(".qid").html();//每一题的id + + var num = ""; + var edit_id = ""; + num = parent.find('#q_numid').text();//序号 + if(num == ""){ + num = parent.find('#q_numid').val();//序号 + } + edit_id = AndEdit_id;//试卷id + + if(editexampaper_id == ""){ + $(e).parents().filter('tr:eq(0)').remove(); + setStatistic();//计算题数和总分 + } + else { + $.uiMessagebox.confirm({ + title: '确认操作', + content: "此操作将删除信息,确定删除吗?", + onClose: function (value) { + if (value) { + + $.ajax({ + type: 'post', + url: delete_editexampaper_Url, + data: {ids: editexampaper_id}, + dataType: "json", + success: function (result) { + if(result.success){ + $('#eqlist2').uiGrid('loadData');//重新刷新查询时没有用queryParams传入参数,为什么可以查询成功? + + $(e).parents().filter('tr:eq(0)').remove(); + setStatistic();//计算题数和总分 + + //排序 + $.ajax({ + type: 'post', + url: setDeleteNumberUrl, + data: {'edit_id':edit_id, + 'num':num}, + dataType: "json", + success: function (result) { + if (result.success) { + $('#eqlist2').uiGrid('loadData'); + } + showResult(result.success, result.message); + }, + error:function() { + alert("排序失败"); + } + }); + } + showResult(result.success, result.message); + } + }); + } + } + }); + } + + // $(e).parents().filter('table:eq(0)').remove(); + +} + +//获取tr数据 编辑 +function gettrdata(e) { + item.id = e.find(".qid").html(); + item.num = e.find(".qxh").html(); + item.subject = e.find(".qtm").html(); + item.type = e.find(".qtype").html(); + item.isMust = e.find(".qbd").html(); + item.score = e.find(".score").html(); + item.isParagraph = 0; + item.answer = e.find(".answer").html(); + // item.answer = e.find(".q_item").html(); + item.optionA = e.find(".q_item:eq(0)").find("span").html(); + if (e.find(".q_item:eq(1)") != null) + item.optionB = e.find(".q_item:eq(1)").find("span").html(); + if (e.find(".q_item:eq(2)") != null) + item.optionC = e.find(".q_item:eq(2)").find("span").html(); + if (e.find(".q_item:eq(3)") != null) + item.optionD = e.find(".q_item:eq(3)").find("span").html(); + if (e.find(".q_item:eq(4)") != null) + item.optionE = e.find(".q_item:eq(4)").find("span").html(); + if (e.find(".q_item:eq(5)") != null) + item.optionF = e.find(".q_item:eq(5)").find("span").html(); +} + +//获取input数据 保存 +function getinputdata(e) { + item.id = e.find(".qid").html(); + item.num = e.find("#question_numid").val(); + item.subject = e.find("#subject").val(); + item.type = e.find("#questiontype").text(); + if($('#cb').prop('checked')){ + item.isMust = 1; + }else{ + item.isMust = 0; + } + item.score = e.find("#score").val(); + item.isParagraph = 0; + item.answer = e.find(".answer").html(); + item.optionA = e.find(".q_item:eq(0)").find("input").val(); + if(item.type=="单选题" || item.type=="多选题") { + if (e.find(".q_item:eq(1)") != null) + item.optionB = e.find(".q_item:eq(1)").find("input").val(); + if (e.find(".q_item:eq(2)") != null) + item.optionC = e.find(".q_item:eq(2)").find("input").val(); + if (e.find(".q_item:eq(3)") != null) + item.optionD = e.find(".q_item:eq(3)").find("input").val(); + if (e.find(".q_item:eq(4)") != null) + item.optionE = e.find(".q_item:eq(4)").find("input").val(); + if (e.find(".q_item:eq(5)") != null) + item.optionF = e.find(".q_item:eq(5)").find("input").val(); + } + + // item.id = e.find(".qid").html(); + // item.num = e.find(".qxh").html(); + // item.subject = e.find(".qtm").html(); + // item.type = e.find(".type").html(); + // item.isMust = e.find(".qbd").html(); + // item.optionA = e.find(".q_item:eq(0)").find("input").val(); + // if(item.qtype==1 || item.qtype==2) { + // if (e.find(".q_item:eq(1)") != null) + // item.optionB = e.find(".q_item:eq(1)").find("input").val(); + // if (e.find(".q_item:eq(2)") != null) + // item.optionC = e.find(".q_item:eq(2)").find("input").val(); + // if (e.find(".q_item:eq(3)") != null) + // item.optionD = e.find(".q_item:eq(3)").find("input").val(); + // if (e.find(".q_item:eq(4)") != null) + // item.optionE = e.find(".q_item:eq(4)").find("input").val(); + // if (e.find(".q_item:eq(5)") != null) + // item.optionF = e.find(".q_item:eq(5)").find("input").val(); + // } +} + +//选择添加题目方式 +function selectaddtype(type) { + switch(type) + { + case '0': + $('#exceldr').show(); + $('#sj').hide(); + $('#sls').hide(); + // $('#eqlist2').uiGrid('loadData'); + break; + case '1': + $('#exceldr').hide(); + $('#sj').show(); + $('#sls').hide(); + // $('#eqlist2').uiGrid('loadData'); + break; + case '2': + $('#exceldr').hide(); + $('#sj').hide(); + $('#sls').show(); + // $('#eqlist2').uiGrid('loadData'); + break; + } +} + +//单项选择ABCD +function checkBox() { + $('#cbA').bind('click',function (){ + if($('#cbA').prop('checked')) + { + $('#cbB').prop('checked',false); + $('#cbC').prop('checked',false); + $('#cbD').prop('checked',false); + } + }); + $('#cbB').bind('click',function (){ + if($('#cbB').prop('checked')) + { + $('#cbA').prop('checked',false); + $('#cbC').prop('checked',false); + $('#cbD').prop('checked',false); + } + }); + $('#cbC').bind('click',function (){ + if($('#cbC').prop('checked')) + { + $('#cbB').prop('checked',false); + $('#cbA').prop('checked',false); + $('#cbD').prop('checked',false); + } + }); + $('#cbD').bind('click',function (){ + if($('#cbD').prop('checked')) + { + $('#cbB').prop('checked',false); + $('#cbC').prop('checked',false); + $('#cbA').prop('checked',false); + } + }); +} + +//设为空格 +function setSpace(e) { + var parent = $(e).parents().filter('tr:eq(0)');//下标等于0的tr,即第1个tr + + // var t = $('#subject')[0]; + var t = parent.find("#subject")[0]; + //var t = $('#subject').get(0);//等同于$('#subject')[0] + //var t = document.getElementById('subject');//js写法,等同于$('#subject')[0]和$('#subject').get(0) + // if (window.getSelection) {//IE8不支持,谷歌等支持的写法 + if (document.selection) {//IE8支持,谷歌等不支持的写法 + // if (t.selectionStart != undefined && t.selectionEnd != undefined && t.selectionStart != t.selectionEnd) {//IE8不支持,谷歌等支持的写法 + if (document.selection.createRange().text != '' && document.selection.createRange().text != $('#txtsubject').val()) {//IE8支持,谷歌等不支持的写法 + // var previous_answer = $('#answer').val(); + var previous_answer = parent.find("#answer").val(); + // var answer = t.value.substring(t.selectionStart, t.selectionEnd);//IE8不支持,谷歌等支持的写法 + var answer = document.selection.createRange().text;//IE8支持,谷歌等不支持的写法 + if(previous_answer != "") + { + answer = previous_answer + "," + answer; + } + // $('#answer').val(answer); + parent.find("#answer").val(answer); + // var a = t.value.substring(t.selectionStart, t.selectionEnd);//IE8不支持,谷歌等支持的写法 + var a = document.selection.createRange().text;//IE8支持,谷歌等不支持的写法 + var b=t.value; + //t.val(b.replace(a,"__"));//错误 + // $('#subject').val(b.replace(a,"____")); + parent.find("#subject").val(b.replace(a,"____")); + } else { + return; + } + } else { + return; + } +} + +//计算题数和总分 +function setStatistic() { + var totalQuestion=""; + var totalScore=0; + var score=""; + + if($('#eqlist2').find('tbody tr').length == 0 && $('#eqlist2').find('thead tr').length == 2){//第一次添加题目时,tbody中没有tr,而在thead中有2个tr,所以单独做判断 + totalQuestion = $('#eqlist2').find('tbody tr').length + 1; + totalScore = $('#eqlist2').find('tr:eq(1)').find(".score").html(); + $('#sum').val(totalQuestion); + $('#sum_score').val(totalScore); + return; + } + + for (var i=0; i<$('#eqlist2').find('tbody tr').length; i++){ + var parent=""; + parent=$('#eqlist2').find('tbody tr:eq('+i+')'); + score=parent.find(".score").html(); + totalScore +=Number(score); + } + totalQuestion = $('#eqlist2').find('tbody tr').length; + $('#sum').val(totalQuestion); + $('#sum_score').val(totalScore); + + // for (var i=1; i<$('#eqlist2').find('tr').length; i++){ + // var parent=""; + // parent=$('#eqlist2').find('tr:eq('+i+')'); + // score=parent.find(".score").html(); + // totalScore +=Number(score); + // } + // totalQuestion = $('#eqlist2').find('tr').length - 1; + // $('#sum').val(totalQuestion); + // $('#sum_score').val(totalScore); +} + +//计算题数和总分 预览 +function setStatistic_preview() { + var totalQuestion=""; + var totalScore=0; + var score=""; + + for (var i=0; i<$('#eqlist2_preview').find('tbody tr').length; i++){ + var parent=""; + parent=$('#eqlist2_preview').find('tbody tr:eq('+i+')'); + score=parent.find(".score").html(); + totalScore +=Number(score); + } + totalQuestion = $('#eqlist2_preview').find('tbody tr').length; + $('#sum_preview').val(totalQuestion); + $('#sum_score_preview').val(totalScore); + +} + +//计算分值 未使用 +function setCalculate(e) { + var single=""; + var multiple=""; + var judgement=""; + var blank=""; + var essay=""; + var sum=""; + + var single_score=""; + var multiple_score=""; + var judgement_score=""; + var blank_score=""; + var essay_score=""; + var sum_score=""; + + var q_count1=-1; + var q_count2=-1; + var q_count3=-1; + var q_count4=-1; + var q_count5=-1; + + single=$('#single').val(); + multiple=$("#multiple").val(); + judgement=$("#judgement").val(); + blank=$("#blank").val(); + essay=$("#essay").val(); + + single_score=$("#single_score").val(); + multiple_score=$("#multiple_score").val(); + judgement_score=$("#judgement_score").val(); + blank_score=$("#blank_score").val(); + essay_score=$("#essay_score").val(); + + $.ajax({ + type: 'post', + url: countNumberUrl, + data:{'AndEdit_id':AndEdit_id}, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + //showResult(result.success, result.message); + var value=result.data.rows[0]; + q_count1=value.q_count1; + q_count2=value.q_count2; + q_count3=value.q_count3; + q_count4=value.q_count4; + q_count5=value.q_count5; + // $('#eqlist2').uiGrid('loadData'); + + if(single != q_count1){ + alert("输入的单选题数量与试卷中的单选题数量不符!请重新输入"); + return; + } + if(multiple != q_count2){ + alert("输入的多选题数量与试卷中的多选题数量不符!请重新输入"); + return; + } + if(judgement != q_count3){ + alert("输入的判断题数量与试卷中的判断题数量不符!请重新输入"); + return; + } + if(blank != q_count4){ + alert("输入的填空题数量与试卷中的填空题数量不符!请重新输入"); + return; + } + if(essay != q_count5){ + alert("输入的问答题数量与试卷中的问答题数量不符!请重新输入"); + return; + } + }, + error:function() { + alert("计算题目数量失败"); + } + }); + + sum=Number(single)+Number(multiple)+Number(judgement)+Number(blank)+Number(essay); + $('#sum').val(sum); + + var singleEachScore = single_score / single; + var multipleEachScore = multiple_score / multiple; + var judgementEachScore = judgement_score / judgement; + var blankEachScore = blank_score / blank; + var essayEachScore = essay_score / essay; + + var parent = $('#eqlist2').find('tr:eq('+i+')'); + var exampapereditInfo={id:[], score:[]}; + var i = 1; + for(i; i<=Number(single); i++){ + var parent = $('#eqlist2').find('tr:eq('+i+')'); + exampapereditInfo.id[i-1] = parent.find(".qid").html(); + exampapereditInfo.score[i-1] = singleEachScore; + } + for(i; i<=Number(single)+Number(multiple); i++){ + var parent = $('#eqlist2').find('tr:eq('+i+')'); + exampapereditInfo.id[i-1] = parent.find(".qid").html(); + exampapereditInfo.score[i-1] = multipleEachScore; + } + for(i; i<=Number(single)+Number(multiple)+Number(judgement); i++){ + var parent = $('#eqlist2').find('tr:eq('+i+')'); + exampapereditInfo.id[i-1] = parent.find(".qid").html(); + exampapereditInfo.score[i-1] = judgementEachScore; + } + for(i; i<=Number(single)+Number(multiple)+Number(judgement)+Number(blank); i++){ + var parent = $('#eqlist2').find('tr:eq('+i+')'); + exampapereditInfo.id[i-1] = parent.find(".qid").html(); + exampapereditInfo.score[i-1] = blankEachScore; + } + for(i; i<=Number(sum); i++){ + var parent = $('#eqlist2').find('tr:eq('+i+')'); + exampapereditInfo.id[i-1] = parent.find(".qid").html(); + exampapereditInfo.score[i-1] = essayEachScore; + } + + $.ajax({ + type: 'post', + url: calculateScoreUrl, + data:{'exampapereditInfoList':JSON.stringify(exampapereditInfo)}, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + + }, + error:function() { + alert("计算题目分值失败"); + } + }); + +} + +//取消 +function cancel() { + $('#eqlist2').uiGrid('loadData'); +} + +//上移 +function moveUp(e) { + var parent = $(e).parents().filter('tr:eq(0)');//下标等于0的tr,即第1个tr + var editexampaper_id = parent.find(".qid").html();//每一题的id + + var edit_id=""; + var num=""; + var type=""; + var type_num=""; + + type = parent.find('.qtype').text(); + type_num; + if(type == "单选题"){ + type_num = 1; + }else if(type == "多选题"){ + type_num = 2; + }else if(type == "判断题"){ + type_num = 3; + }else if(type == "填空题"){ + type_num = 4; + }else if(type == "问答题"){ + type_num = 5; + } + + edit_id =AndEdit_id;//试卷的id + num = parent.find('#q_numid').text();//序号 + if(num == "1"){ + alert("第一题不再允许上移!"); + return; + } + + $.ajax({ + type: 'post', + url: moveUpUrl, + data: {'id':editexampaper_id, + 'edit_id':edit_id, + 'num':num, + 'type_num':type_num}, + dataType: "json", + success: function (result) { + if (result.success) { + $('#eqlist2').uiGrid('loadData'); + } + showResult(result.success, result.message); + }, + error:function() { + alert("上移失败"); + } + }); +} + +//下移 +function moveDown(e) { + var parent = $(e).parents().filter('tr:eq(0)');//下标等于0的tr,即第1个tr + var editexampaper_id = parent.find(".qid").html();//每一题的id + + var edit_id=""; + var num=""; + var type=""; + var type_num=""; + + type = parent.find('.qtype').text(); + type_num; + if(type == "单选题"){ + type_num = 1; + }else if(type == "多选题"){ + type_num = 2; + }else if(type == "判断题"){ + type_num = 3; + }else if(type == "填空题"){ + type_num = 4; + }else if(type == "问答题"){ + type_num = 5; + } + + edit_id =AndEdit_id;//试卷的id + num = parent.find('#q_numid').text();//序号 + var totalQuestion = $('#eqlist2').find('tbody tr').length; + + if(num == totalQuestion){ + alert("最后一题不再允许下移!"); + return; + } + + $.ajax({ + type: 'post', + url: moveDownUrl, + data: {'id':editexampaper_id, + 'edit_id':edit_id, + 'num':num, + 'type_num':type_num}, + dataType: "json", + success: function (result) { + if (result.success) { + $('#eqlist2').uiGrid('loadData'); + } + showResult(result.success, result.message); + }, + error:function() { + alert("下移失败"); + } + }); +} + diff --git a/asset/js/cetc54/exam/exampaper_unused.js b/asset/js/cetc54/exam/exampaper_unused.js new file mode 100644 index 0000000..e2f5af9 --- /dev/null +++ b/asset/js/cetc54/exam/exampaper_unused.js @@ -0,0 +1,1351 @@ +//不再使用,替换为exampaper.js +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/exam/exampaper/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +var editexamPage =rootUrl + 'editexamPage';//编辑页面地址 +var editexampaperPage =rootUrl + 'editexampaperPage';//编辑页面地址 +var importnewexampaperPage =rootUrl + 'importnewexampaperPage';//试卷导入页面地址 +var saveHistoryUrl = rootUrl + 'saveHistoryExam';//保存历史问卷 +var randURL = rootUrl + 'randExam';//随机添加试题 +var departmentComboxUrl = rootUrl+'departmentCombox';//部门下拉框 +var departmentAddUrl= rootUrl+'departmentAdd';//添加部门 +var departmentListUrl= rootUrl+'departmentList';//初始化添加部门列表 +var courseComboxUrl = rootUrl+'courseCombox';//课程下拉框 +var deleteLimitationUrl = rootUrl + 'deleteLimitation';//发放范围——删除 + +var examId = "";//试卷id,想使用的历史问卷的id +var count = 0;//添加部门计数 +var exam_id = "";//在该试卷上添加部门时使用的试卷id +var limitation = "";//指定发放范围,1全所2部门3人员4班级5课程 +var examState = {firstState:"未开始", secondState:"正在进行", thirdState:"已关闭", fourthState:"已撤销"};//试卷状态 + +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + + var dialogSize = {width: '95%', height: '95%'};//弹出窗口大小 + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var grid = $('#grid'); + var pg = "";//控制考试与调研页面交替,1考试2调研 + pg = $('#pg').val(); + + + var list_editexampaper_Url = rootUrl + 'list_editexampaper';//编辑试卷内容 list地址 + //var save_editexampaper_Url = rootUrl + 'save_editexampaper';//编辑试卷内容 保存数据地址 + var comboxUrl=rootUrl+ 'examPaperCombox';//选择历史问卷 下拉框 +//-----------------------初始化-------------------------------------- + initExampapersGrid(); + initExampapersForm(); + // addFilter(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function initExampapersGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '试卷名称|试卷类别', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + queryParams:{pg: pg}, + // localData:{rows:[ + // {id: '1',name:'试卷1',category:'项目管理',categoryid:'1',passpoints:'60',description:'这张试卷是关于项目管理考试的第一张试卷',edittime:'2019-01-01 11:15:10'}, + // {id: '2',name:'试卷2',category:'项目管理',categoryid:'1',passpoints:'60',description:'这张试卷是关于项目管理考试的第二张试卷',edittime:'2019-01-03 11:15:10'}, + // {id: '3',name:'试卷3',category:'质量管理',categoryid:'2',passpoints:'60',description:'这张试卷是关于质量管理考试的第一张试卷',edittime:'2019-01-05 11:15:10'}, + // {id: '4',name:'试卷4',category:'项目管理',categoryid:'1',passpoints:'60',description:'这张试卷是关于项目管理考试的第三张试卷',edittime:'2019-01-14 11:15:10'}, + // {id: '5',name:'试卷5',category:'项目管理',categoryid:'1',passpoints:'60',description:'这张试卷是关于项目管理考试的第四张试卷',edittime:'2019-01-19 11:15:10'}]}, + defaultSortField: 'edittime' + }); + + } + + function initExampapersForm() { + dialog.uiDialog({ + title: '新建', + width: dialogSize.width, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + var roleType = 0; + grid_form.uiForm('load', {}); + break; + default : + break; + } + + }, + onLoadComplete:function(){ + // $('#txtdepartment').dictCombobox(); + // $('#txtdepartment').uiCombobox({ + // mode: "remote", + // url: departmentComboxUrl, + // onLoadSuccess: function (data) { + // + // }, + // onLoadError: function (data) { + // + // } + // }); + + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + //这个位置要增加编辑提示,后台检测有题目被历史试卷引用时,需要提醒。 + + param.pg = $('#pg').val();//uiForm控件向后台传入参数,不是queryParams + param.id = $('#hdID').val(); + + //谷歌支持 + // var startDate = new Date($('#startdate').val()); + // var endtDate = new Date($('#enddate').val()); + // var now = new Date(new Date().toLocaleDateString()); + // var startMillisecond = startDate.getTime() - now;//时间差的毫秒数 + // var endMillisecond = endtDate.getTime() - now; + // var startDays=Math.floor(startMillisecond / (24*3600*1000));// 计算出相差天数 + // var endDays=Math.floor(endMillisecond / (24*3600*1000)); + + //IE支持 + var startDate = $('#startdate').val(); + var endtDate = $('#enddate').val(); + var now_ = new Date(); + var month = now_.getMonth() + 1; + var now = now_.getFullYear() + "/" + month + "/" + now_.getDate(); + var startMillisecond = Date.parse(startDate.replace(/-/g,"/")) - Date.parse(now);//时间差的毫秒数 + var endMillisecond = Date.parse(endtDate.replace(/-/g,"/")) - Date.parse(now); + var startDays=Math.floor(startMillisecond / (24*3600*1000));// 计算出相差天数 + var endDays=Math.floor(endMillisecond / (24*3600*1000)); + + if(endDays - startDays <= 0 ) + { + alert("开放时间中的结束时间应大于开始时间!"); + return false; + } + if(startDays > 0 && endDays > 0){ + param.state = examState.firstState; + }else if (startDays <= 0 && endDays > 0){ + param.state = examState.secondState; + }else if (startDays < 0 && endDays <= 0){ + param.state = examState.thirdState; + }else{ + param.state = "状态有误"; + } + + if($('input:radio[id="cb3_l"]:checked').val() == "on"){ + param.limitation = 1; + }else if($('input:radio[id="cb4_l"]:checked').val() == "on"){ + param.limitation = 2; + }else if($('input:radio[id="cb5_l"]:checked').val() == "on"){ + param.limitation = 3; + }else if($('input:radio[id="cb6_l"]:checked').val() == "on"){ + param.limitation = 4; + }else if($('input:radio[id="cb7_l"]:checked').val() == "on"){ + param.limitation = 5; + }else{ + alert("请指定试卷发放范围!"); + return false; + } + limitation=param.limitation; + var isValid = $('#grid_form').uiForm('validate'); + + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success === false){ + showResult(result.success, result.message); + return; + } + + if(result.data !== undefined){ + exam_id = result.data.examId; + } + + if($('input:radio[id="cb3_l"]:checked').val() == "on"){ + + var instituteArray = []; + var instituteList = {}; + instituteList.id = $('.institute_id').text(); + instituteList.orgname = "全所"; + instituteList.orgcode = "1"; + instituteList.exam = $('#txtname').val(); + instituteList.exam_id = exam_id; + instituteList.limitation = limitation; + instituteArray.push(instituteList); + + $.ajax({ + type: 'post', + url: departmentAddUrl, + data: {'orgArray':JSON.stringify(instituteArray)}, + dataType: "json", + success: function (result) { + + }, + error:function() { + alert("添加全所失败"); + } + }); + }else if($('input:radio[id="cb4_l"]:checked').val() == "on"){ + // var size = $('#grid_add').find('select').length;//找到所有select + var orgArray = []; + for(var i=1; i 1){ + showResult(false,'请选择要编辑的一张试卷,不支持同时选择多张试卷!','alert'); + } + else{ + editexampaper_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + editexampaper_dialog.uiDialog('button', 'btnOK').show(); + editexampaper_dialog.uiDialog('open'); + editexampaper_dialog.uiDialog('title').html('编辑试卷'); + // $('#eqlist2').uiGrid('loadData',{queryParams: {AndEdit_id: AndEdit_id}}); + + $.ajax({ + type: 'post', + url: list_editexampaper_Url, + data:{'AndEdit_id':AndEdit_id}, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + //showResult(result.success, result.message); + if(result.data.rows.length > 0){ + var data=result.data.rows[0]; + $('#title_name').html(data.name);//将后台return的结果显示在前端 + $('#title_description').html(data.description); + if(data.state == examState.secondState || data.state == examState.thirdState || data.state == examState.fourthState){ + editexampaper_dialog.uiDialog('close'); + alert("正在进行、已关闭和已撤销的试卷不允许编辑!"); + } + } + // $('#eqlist2').uiGrid('loadData'); + }, + error:function() { + alert("提交失败"); + } + }); + } + + }); + + //导入试卷 + $('#btn4').bind('click', function () { + importnewpaper_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + importnewpaper_dialog.uiDialog('button', 'btnOK').show(); + importnewpaper_dialog.uiDialog('open'); + importnewpaper_dialog.uiDialog('title').html('导入'); + }); + + //导出试卷 + $('#btn5').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要导出的试卷!', 'alert'); + } else { + //导出试卷 + alert("试卷已导出。"); + } + }); + + //撤销调研问卷 + $('#btn6').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要撤销的调研问卷!', 'alert'); + } else if(ids.length > 1){ + showResult(false,'请选择要撤销的一张调研问卷,不支持同时选择多张调研问卷!','alert'); + } else{ + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确认要撤销调研问卷吗?", + onClose: function (value) { + if (value) { + var id = ids[0]; + var state = examState.fourthState; + + $.ajax({ + type: 'post', + url: saveUrl, + data:{'id':id, + 'state':state + }, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + if(result.success){ + showResult(result.success, result.message); + grid.uiGrid('loadData'); + } + }, + error:function() { + alert("撤销调研问卷失败"); + } + }); + } + } + }); + + } + }); + + //删除——发放范围 + $('#btnDelete').bind('click', function () { + var ids = $('#grid_add').uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteLimitation(ids); + } + }); + + } + +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + + exam_id = id; + for (var i=0; i'+ + ''+ + ''+ + ''+ + ''+ + ''+count+''+ + ''+ + // ''+ + ''+ + ''+ + ''; + last_tr.after(ihtml); + + // $('#'+j+'').dictCombobox(); + $('#'+j+'').uiCombobox({ + mode: "remote", + url: departmentComboxUrl, + onLoadSuccess: function (data) { + } + }); + $(".grid_data").css("overflow-y","auto");//加滚动条 + reorder();//重新排序 + + }else if(n == 3){ + var txtperson = "txtperson"; + var txtcard = "txtcard"; + count++; + var f = txtperson + count; + var g = txtcard + count; + var last_tr_p = $('#grid_add tr').last(); + var ihtml_p = + ''+ + ''+ + ''+ + ''+ + ''+ + ''+count+''+ + ''+ + '姓名:'+ + ''+ + // ''+ + // ''+ + ' 工资号:'+ + ''+ + ''+ + ''; + last_tr_p.after(ihtml_p); + reorder();//重新排序 + } + else if(n == 4){ + + } + else if(n == 5){ + var txtcourse = "txtcourse"; + count++; + var h = txtcourse + count; + var last_tr_c = $('#grid_add tr').last(); + var ihtml_c = + ''+ + ''+ + ''+ + ''+ + ''+ + ''+count+''+ + ''+ + ''+ + ''+ + ''; + last_tr_c.after(ihtml_c); + + $('#'+h+'').uiCombobox({ + mode: "remote", + url: courseComboxUrl, + onLoadSuccess: function (data) { + } + }); + $(".grid_data").css("overflow-y","auto");//加滚动条 + reorder();//重新排序 + } + +} +//发放范围 显示 +function specifiedRange(num) { + var grid_add = $('#grid_add'); + // if(grid_add.html().length < 1285)//通过判断标签大小判断标签是否被初始化 + if(grid_add.attr("class") == null)//判断是否存在css样式,借此判断标签是否被初始化,不重复初始化 + { + grid_add.uiGrid({ + url: departmentListUrl, + queryParams:{"exam_id": exam_id + // "limitation":limitation + } + }); + // $('#txtdepartment').dictCombobox();//需在grid_add.uiGrid初始化之后,再初始化下拉框 + // $('#txtdepartment').uiCombobox(); + }else{ + // $('#grid_add').uiGrid('loadData',{queryParams:{"exam_id": exam_id}}); + } + if(num == 1){ + for (var i=0; i 0){ + var j = $('[class=order]').length; + for (var i=0;i<$('[class=reorder]').length;i++){ + j = j + 1; + $('[class=reorder]:eq('+i+')').replaceWith(''+j+''); + } + }else{ + for (var i=0;i<$('[class=reorder]').length;i++){ + var j = i+1; + $('[class=reorder]:eq('+i+')').replaceWith(''+j+''); + } + } +} + +//随机添加试题 +function randomAdd() { + var categoryRand = 0; + var singleNum = 0; + var multipleNum = 0; + var judgementNum = 0; + var essayNum = 0; + var blankNum = 0; + + if($('#categoryRand').uiCombo('getText') == ""){ + alert("请选择试卷类别!"); + return; + }else { + categoryRand = $('#categoryRand').uiCombo('getValue'); + } + if($('#singleNum').val() != ""){ + singleNum = $('#singleNum').val(); + } + if($('#multipleNum').val() != ""){ + multipleNum = $('#multipleNum').val(); + } + if($('#judgementNum').val() != ""){ + judgementNum = $('#judgementNum').val(); + } + if($('#essayNum').val() != ""){ + essayNum = $('#essayNum').val(); + } + if($('#blankNum').val() != ""){ + blankNum = $('#blankNum').val(); + } + + $.ajax({ + type: 'post', + url: randURL, + data: {'id':AndEdit_id, + 'categoryid':categoryRand, + 'singleNum':singleNum, + 'multipleNum':multipleNum, + 'judgementNum':judgementNum, + 'essayNum':essayNum, + 'blankNum':blankNum}, + dataType: "json", + success: function (result) { + if (result.success) { + $('#eqlist2').uiGrid('loadData'); + } + showResult(result.success, result.message); + }, + error:function() { + alert("随机添加试题失败"); + } + }); +} diff --git a/asset/js/cetc54/exam/examresult.js b/asset/js/cetc54/exam/examresult.js new file mode 100644 index 0000000..96df373 --- /dev/null +++ b/asset/js/cetc54/exam/examresult.js @@ -0,0 +1,479 @@ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/exam/examresult/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +var editexamPage =rootUrl + 'editexampaperPage';//编辑页面地址 +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + var comboxUrl=rootUrl+ 'examResultCombox';//下拉框 + var examResultUrl=rootUrl+ 'examResultList';//考试判卷——判卷——List + var examResultImportUrl = rootUrl + 'examResultImport';//导入成绩 + var updateAnswerUrl = rootUrl + 'updateAnswer';//系统自动判卷-更新答案 + var updateUserScoreUrl = rootUrl + 'updateUserScore';//系统自动判卷-更新用户得分和判卷人 + + var dialogSize = {width: 800, height: '80%'};//弹出窗口大小 + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var grid = $('#grid'); + + var examId="";//试卷id + var userId="";//工资号 + +//-----------------------初始化-------------------------------------- + initexamsGrid(); + // addFilter(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function initexamsGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '答题人|部门|试卷名称', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + defaultSortField: 'user_time' + }); + + //下拉框 + $('#name').uiCombobox({ + mode: 'remote', + searchable: true, + delay :500, + hasDownArrow:false, + loader: comboxLoad, + url: comboxUrl, + onSelect: function(record) { + examId = record.id; + grid.uiGrid('loadData', {queryParams:{examId: examId}}); + }, + }); + } + + //初始化考试判卷编辑表单 + var formeditexamInit = function () { + + var eqlist2 = $('#eqlist2'); + + eqlist2.uiGrid({ + autoFit: true, + border: false, + colFit: true, + gridTitleFix: false, + width: "100%", + height: "80%", + showHeader: false, + icon: 'list', + url: examResultUrl, + queryParams: {'userId':userId, + 'examId':examId},//从前端获取,向后台传递参数 + defaultSortField: 'num' + }); + }; + + //初始化考试判卷弹出窗口 + var editexam_dialog = $('#editexam_dialog').uiDialog({ + title: '新建', + icon: 'list', + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: editexamPage, + onLoadComplete: formeditexamInit, + onOpen: function () { + var dialogP = $('#editexam_dialog').uiDialog('getUserParam'); + var id = dialogP.id; + + setTimeout( function(){ + setStatistic(); + userScore(); + },100); + }, + onPanelResize: function () { + // setStatistic();//将计算题数和总分的方法放在了组件改变大小时触发,不合理,考虑用SQL语句初始化出来 + // userScore(); + }, + buttons: [ + // { + // id: 'btnOK', + // label: '保存', + // style: 'button_submit', + // icons: {left: 'icon_submit'}, + // disabled: false, + // onClick: function () { + // editexam_dialog.uiDialog('close'); + // } + // }, + { + id: 'btnOK', + label: '提交', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确定提交批阅的试卷吗?", + onClose: function (value) { + if (value){ + // var totalScore = 0;//总分 + for (var i=1; i<$('#eqlist2').find('tr').length; i++){ + var parent = ""; + var user_score=""; + var id = ""; + var score = ""; + parent=$('#eqlist2').find('tr:eq('+i+')'); + user_score = parent.find(".user_score").val(); + id = parent.find(".qid").html(); + // totalScore += Number(user_score); + // score = parent.find("#score").html(); + // if(Number(user_score) > Number(score)) + // { + // alert("考生得分不应大于该题总分!"); + // return; + // } + + $.ajax({ + type: 'post', + url: saveUrl, + data: {'id':id, + 'user_score':user_score}, + dataType: "json", + success: function (result) { + if (result.success) { + grid.uiGrid('loadData', {queryParams:{examId: examId}}); + } + showResult(result.success, result.message); + $('#editexam_dialog').uiDialog('close'); + }, + error:function() { + alert("提交批阅试卷失败"); + } + }); + } + } + } + }); + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + editexam_dialog.uiDialog('close'); + } + }] + }); + + //初始化导入成绩编辑表单 + var formimportInit2 = function () { + $('#fileform').uiForm({ + template: 'grid_form_temp2', + onLoadSuccess: function (data) { + $('#btnUpload').bind('click', function () { + $('#fileform').uiForm('submit', { + url: examResultImportUrl, + dataType: "application/json", + onSubmit: function (params) { + + }, + success: function (result) { + if (result.success) { + $('#examresult_dialog').uiDialog('close');//保存成功后关闭对话框 + grid.uiGrid('loadData', {queryParams:{'examId': result.data.exam_id}}); + } + showResult(result.success, result.message); + } + }); + }); + } + }); + }; + + //初始化弹出窗口——导入成绩 + var examresult_dialog = $('#examresult_dialog').uiDialog({ + title: '导入', + icon: 'list', + width:"80%", + height:"60%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + onLoadComplete: formimportInit2, + onOpen: function () { + var dialogP = $('#examresult_dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + $('#fileform').uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + $('#fileform').uiForm('load', {}); + break; + default : + break; + } + + // $('#fileform').uiForm('load');//为组件加载数据 + } + }); + + function addEvents() { + + //考试判卷 + $('#btn1').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + userId = ids[0];//此处将工资号作为id + // console.log(AndEdit_id); + if(ids.length == 0){ + showResult(false,'请选择要批阅的试卷!','alert'); + } + else if(ids.length > 1){ + showResult(false,'请选择要批阅的一张试卷,不支持同时选择多张试卷!','alert'); + } + else{ + editexam_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + editexam_dialog.uiDialog('button', 'btnOK').show(); + editexam_dialog.uiDialog('open'); + editexam_dialog.uiDialog('title').html('判卷'); + // $('#eqlist2').uiGrid('loadData',{queryParams: {AndEdit_id: AndEdit_id}}); + + $.ajax({ + type: 'post', + url: examResultUrl, + data:{'userId':userId, + 'examId':examId}, + dataType: "json", + success: function (result) { //result是接收后台return的结果 + //showResult(result.success, result.message); + + if(result.data.rows.length > 0){ + var data=result.data.rows[0]; + if(data.state === "线下考试"){ + alert("线下考试不允许再次判卷!"); + editexam_dialog.uiDialog('close'); + } + } + + setTimeout(function () { + if(result.data.rows.length > 0){ + var data=result.data.rows[0]; + $('#title_name').html(data.name);//将后台return的结果显示在前端 + $('#title_description').html(data.description); + } + },100); + + // $('#eqlist2').uiGrid('loadData',{queryParams: {'userId':userId, 'examId':examId}}); + }, + error:function() { + alert("考试判卷提交失败"); + } + }); + } + + }); + + //导入成绩 + $('#btn2').bind('click', function () { + examresult_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + examresult_dialog.uiDialog('button', 'btnOK').show(); + examresult_dialog.uiDialog('open'); + examresult_dialog.uiDialog('title').html('导入'); + }); + + //导出成绩 + $('#btn3').bind('click', function () { + var ids = $('#name').uiCombo('getValue'); + + if (typeof(ids) == "undefined") { + showResult(false, '请选择试卷!', 'alert'); + } + else { + var j = ids; + var openurl =webroot+"/ReportServer?reportlet=examResult.cpt"+'&id='+j+"&format=excel"; + // var openurl="http://localhost:8075/WebReport/ReportServer?reportlet=exam.cpt&format=excel"; + window.open(openurl); + } + }); + + //自动判卷 + $('#btn4').bind('click', function () { + var exam_id = $('#name').uiCombo('getValue'); + + if (typeof(exam_id) == "undefined") { + showResult(false, '请选择试卷!', 'alert'); + } + else { + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确定使用客观题系统自动判卷吗?", + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: updateAnswerUrl, + data: {'exam_id':exam_id}, + dataType: "json", + success: function (result) { + if(result.success){ + $.ajax({ + type: 'post', + url: updateUserScoreUrl, + data: {'exam_id':exam_id}, + dataType: "json", + success: function () { + $('#grid').uiGrid('loadData'); + }, + error:function() { + alert("系统自动判卷更新用户得分和判卷人失败"); + } + }); + } + }, + error:function() { + alert("系统自动判卷更新答案失败"); + } + }); + } + } + }); + + } + }); + + } + + //选择要批阅的试卷 下拉框 + function comboxLoad(param, success, error) { + var opts = $(this).uiCombobox('options'); + if (!opts.url) return false; + $.ajax({ + type: opts.method, + url: opts.url, + showLoading: false, + data: param, + showAlert:false, + dataType: 'json', + success: function (result) { + if (result.success) { + success(result.data); + } + }, + error: function () { + error.apply(this, arguments); + } + }); + } + + //arttemplate语法 + template.helper('judge', function (data, format) { + if (data!=undefined && data.indexOf(format)!=-1){ + return true; + }else { + return false;} + }); +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + +} + +//编辑 +function editRow(id) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('button', 'btnOK').show(); +} + +// 删除 +function deleteRow(id) { + deleteData("此操作将删除试卷,可能会导致以往考试找不到试卷,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} + +//计算题数和总分 +function setStatistic() { + var totalQuestion=""; + var totalScore=0; + var score=""; + for (var i=1; i<$('#eqlist2').find('tr').length; i++){ + var parent=""; + parent=$('#eqlist2').find('tr:eq('+i+')'); + score=parent.find(".score").html(); + totalScore +=Number(score); + } + totalQuestion = $('#eqlist2').find('tr').length - 1; + $('#sum').val(totalQuestion); + $('#sum_score').val(totalScore); +} +//计算考生得分 +function userScore() { + var totalScore=0; + var score=""; + for (var i=1; i<$('#eqlist2').find('tr').length; i++){ + var parent=""; + parent=$('#eqlist2').find('tr:eq('+i+')'); + parent.find(".user_score").val(parent.find(".user_score").val().replace(/[^0-9]/g,'')); + score=parent.find(".user_score").val(); + totalScore +=Number(score); + } + $('#user_result').val(totalScore); +} + +function checkSize(ele){ + var size_m = (ele.files[0].size / 1024); + if(size_m >= 1024*1024*5){ + $('#hidFile').val(1); + return false; + } + $('#hidFile').val(0); + return true; +} diff --git a/asset/js/cetc54/exam/examscore.js b/asset/js/cetc54/exam/examscore.js new file mode 100644 index 0000000..68b1406 --- /dev/null +++ b/asset/js/cetc54/exam/examscore.js @@ -0,0 +1,23 @@ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/exam/examscore/'; + +$(function () { + + var listUrl = rootUrl + 'examScoreList';//我的成绩列表 + var grid = $('#grid'); + + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '试卷名称', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + defaultSortField: 'user_time' + }); + +}); \ No newline at end of file diff --git a/asset/js/cetc54/exam/question.js b/asset/js/cetc54/exam/question.js new file mode 100644 index 0000000..4d2a552 --- /dev/null +++ b/asset/js/cetc54/exam/question.js @@ -0,0 +1,648 @@ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/exam/question/'; +var deleteUrl = rootUrl + 'delete';//删除地址 + +var isNotLoginerURL = rootUrl + 'isNotLoginer';//判断当前登录用户是否有编辑权限 + +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + var importQuesPage = rootUrl + 'importQuesPage';//保存添加数据地址 + var dialogSize = {width: 900, height: '90%'};//弹出窗口大小 + + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var grid = $('#grid'); + + var questionImportUrl = rootUrl + 'questionImport';//批量导入试题 + +//-----------------------初始化-------------------------------------- + initQuestionsGrid(); + initQuestionsForm(); + // addFilter(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function initQuestionsGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '题目类型|题目|试卷类别', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + // localData:{rows:[ + // {id: '1', type: '1',subject:'单选题的第一道题目',category:'项目管理',categoryid:'1',description:'第一道单选题解析',answer:'A',edittime:'2019-01-01 11:15:10',optionA:'选项A',optionB:'选项B',optionC:'选项C',optionD:'选项D',optionE:'',optionF:''}, + // {id: '2', type: '2',subject:'多选题的第一道题目',category:'项目管理',categoryid:'1',description:'第一道多选题解析',answer:'ACD',edittime:'2019-01-03 11:15:10',optionA:'选项A',optionB:'选项B',optionC:'选项C',optionD:'选项D',optionE:'选项E',optionF:'选项F'}, + // {id: '3', type: '1',subject:'单选题的第二道题目',category:'质量管理',categoryid:'2',description:'第二道单选题解析',answer:'B',edittime:'2019-01-05 11:15:10',optionA:'选项A',optionB:'选项B',optionC:'选项C',optionD:'选项D',optionE:'',optionF:''}, + // {id: '4', type: '3',subject:'判断题的第一道题目',category:'项目管理',categoryid:'1',description:'第一道判断题解析',answer:'对',edittime:'2019-01-14 11:15:10',optionA:'',optionB:'',optionC:'',optionD:'',optionE:'',optionF:''}, + // {id: '5', type: '4',subject:'问答题的第一道题目',category:'项目管理',categoryid:'1',description:'第一道问答题解析',answer:'这是第一道问答题的答案',edittime:'2019-01-19 11:15:10',optionA:'a',optionB:'b',optionC:'c',optionD:'d',optionE:'e',optionF:'f'}]}, + defaultSortField: 'edittime' + }); + } + + function initQuestionsForm() { + dialog.uiDialog({ + title: '新建',//新增题目 + width: dialogSize.width, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + var roleType = 0; + grid_form.uiForm('load', {}); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + //这个位置要增加编辑提示,后台检测有题目被历史试卷引用时,需要提醒。 + // $('#txtcategory').uiCombo('getText') + + param.id = $('#hdID').val(); + var isValid = $('#grid_form').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog.uiDialog('close');//保存成功后关闭对话框 + grid.uiGrid('loadData');//保存成功后刷新界面,调用了后台的list方法 + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (data) { + initUI(); + var me = $(this); + switch (op) { + case 'view': + me.uiForm('setReadonly', true); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + //初始化——设为空格 + $('#btn_space').uiButton({ + style: 'button_submit', + icons: {left: 'icon_edit'}, + onClick:function () { + var t = $('#txtsubject')[0]; + //var t = $('#txtsubject').get(0);//等同于$('#txtsubject')[0] + //var t = document.getElementById('txtsubject');//js写法,等同于$('#txtsubject')[0]和$('#txtsubject').get(0) + // if (window.getSelection) {//IE8不支持,谷歌等支持的写法 + if (document.selection) {//IE8支持,谷歌等不支持的写法 + // if (t.selectionStart != undefined && t.selectionEnd != undefined && t.selectionStart != t.selectionEnd) {//IE8不支持,谷歌等支持的写法 + if (document.selection.createRange().text != '' && document.selection.createRange().text != $('#txtsubject').val()) {//IE8支持,谷歌等不支持的写法 + var previous_answer = $('#txtanswer').val(); + // var answer = t.value.substring(t.selectionStart, t.selectionEnd);//IE8不支持,谷歌等支持的写法 + var answer = document.selection.createRange().text;//IE8支持,谷歌等不支持的写法 + if(previous_answer != "") + { + answer = previous_answer + "," + answer; + } + setAnswer(answer); + // var a = t.value.substring(t.selectionStart, t.selectionEnd);//IE8不支持,谷歌等支持的写法 + var a = document.selection.createRange().text;//IE8支持,谷歌等不支持的写法 + var b = t.value; + //t.val(b.replace(a,"__"));//错误 + $('#txtsubject').val(b.replace(a,"____")); + } else { + return; + } + } else { + return; + } + } + }); + + //写到这里有效 + // $('#btn_space').bind('click',function(){ + // + // }); + } + }); + } + + + //初始化表单 + var formimportInit2 = function () { + // $('#btnUpload').uiButton(); + + $('#fileform').uiForm({ + template: 'grid_form_temp2', + onLoadSuccess: function (data) { + $('#btnUpload').bind('click', function () { + $('#fileform').uiForm('submit', { + url: questionImportUrl, + dataType: "application/json", + onSubmit: function (params) { + + }, + success: function (result) { + if (result.success) { + $('#importques_dialog').uiDialog('close');//保存成功后关闭对话框 + grid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + }); + } + }); + }; + + //初始化试题批量导入弹出窗口 + var importques_dialog = $('#importques_dialog').uiDialog({ + title: '导入', + icon: 'list', + width:"80%", + height:"60%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: importQuesPage, + onLoadComplete: formimportInit2, + onOpen: function () { + var dialogP = $('#importques_dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + $('#fileform').uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + $('#fileform').uiForm('load', {}); + break; + default : + break; + } + + // $('#fileform').uiForm('load');//为组件加载数据 + } + }); + + function addEvents() { + //新建 + $('#btn1').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新增题目');//与初始化中的title重复设置 + + hideAndShow_add(); + }); + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + //批量导入试题 + $('#btn3').bind('click', function () { + importques_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + importques_dialog.uiDialog('button', 'btnOK').show(); + importques_dialog.uiDialog('open'); + importques_dialog.uiDialog('title').html('导入'); + }); + + //不可实现,因为此方法(设为空格的点击事件)需要写到初始化的方法内才有效 + // $('#btn_space').bind('click',function(){ + // + // }); + } +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + + var value = $('#txttype').val(); + hideAndShow(value); + + $('#cbA').attr("disabled","disabled"); + $('#cbB').attr("disabled","disabled"); + $('#cbC').attr("disabled","disabled"); + $('#cbD').attr("disabled","disabled"); + $('#cbE').attr("disabled","disabled"); + $('#cbF').attr("disabled","disabled"); +} + +//编辑 +function editRow(id) { + + $.ajax({ + type: 'post', + url: isNotLoginerURL, + data: {id:id}, + dataType: "json", + success: function (result) { + if(result.success){ + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('button', 'btnOK').show(); + + var value = $('#txttype').val(); + hideAndShow(value); + + }else{ + $('#dialog').uiDialog('close'); + alert("您没有权限编辑其他人添加的试题"); + } + }, + error:function() { + alert("判断当前登录用户是否有编辑权限失败"); + } + }); + + + + // $('#grid_form').scrollTop(0); +} + +// 删除 +function deleteRow(id) { + deleteData("此操作将删除题目,可能会导致以往试卷找不到此题目,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} + +function initUI() +{ + $('#txttype').dictCombobox({ + onSelect: function () { + var value = $('#txttype').dictCombobox('getValue'); + switch(value){ + case '1': + clear(); + $('#rowA').show(); + $('#rowB').show(); + $('#rowC').show(); + $('#rowD').show(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#tap').hide(); + $('#cho').show(); + $('#blank_space').hide(); + break; + case '2': + clear(); + $('#rowA').show(); + $('#rowB').show(); + $('#rowC').show(); + $('#rowD').show(); + $('#rowE').show(); + $('#rowF').show(); + $('#tap').hide(); + $('#cho').show(); + $('#blank_space').hide(); + break; + case '3': + clear(); + $('#rowA').hide(); + $('#rowB').hide(); + $('#rowC').hide(); + $('#rowD').hide(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#tap').show(); + $('#cho').hide(); + $('#txtanswer').prop("disabled",false); + $('#txtanswer').innerText = '对'; + $('#blank_space').hide(); + break; + case '4': + clear(); + $('#rowA').hide(); + $('#rowB').hide(); + $('#rowC').hide(); + $('#rowD').hide(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#tap').hide(); + $('#cho').hide(); + $('#txtanswer').prop("disabled",false); + $('#blank_space').show(); + break; + case '5': + clear(); + $('#rowA').hide(); + $('#rowB').hide(); + $('#rowC').hide(); + $('#rowD').hide(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#tap').hide(); + $('#cho').hide(); + $('#txtanswer').prop("disabled",false); + $('#blank_space').hide(); + break; + } + } + });//.dictCombobox('select','1'); + $('#txtcategory').dictCombobox(); + $('#cbA').bind('click',function () { + if('1' == $('#txttype').dictCombobox('getValue')) + { + if($('#cbA').prop('checked')) + { + $('#cbB').prop('checked',false); + $('#cbC').prop('checked',false); + $('#cbD').prop('checked',false); + setAnswer('A'); + }else + { + setAnswer(' '); + } + }else + { + setAnswer(); + } + + }); + $('#cbB').bind('click',function () { + if('1' == $('#txttype').dictCombobox('getValue')) + { + if($('#cbB').prop('checked')) + { + $('#cbA').prop('checked',false); + $('#cbC').prop('checked',false); + $('#cbD').prop('checked',false); + setAnswer('B'); + }else + { + setAnswer(' '); + } + }else + { + setAnswer(); + } + }); + $('#cbC').bind('click',function () { + if('1' == $('#txttype').dictCombobox('getValue')) + { + if($('#cbC').prop('checked')) + { + $('#cbA').prop('checked',false); + $('#cbB').prop('checked',false); + $('#cbD').prop('checked',false); + setAnswer('C'); + }else + { + setAnswer(' '); + } + }else + { + setAnswer(); + } + }); + $('#cbD').bind('click',function () { + if('1' == $('#txttype').dictCombobox('getValue')) + { + if($('#cbD').prop('checked')) + { + $('#cbA').prop('checked',false); + $('#cbB').prop('checked',false); + $('#cbC').prop('checked',false); + setAnswer('D'); + }else + { + setAnswer(' '); + } + }else + { + setAnswer(); + } + }); + $('#cbE').bind('click',function () { + setAnswer(); + }); + $('#cbF').bind('click',function () { + setAnswer(); + }); +} +function clear() { + $('#cbA').prop('checked',false); + $('#cbB').prop('checked',false); + $('#cbC').prop('checked',false); + $('#cbD').prop('checked',false); + $('#cbE').prop('checked',false); + $('#cbF').prop('checked',false); + $('#txtanswer').val(''); +} +function setAnswer(ans) +{ + // $('#txtanswer').prop("disabled",true); + if(null != ans) + { + $('#txtanswer').val(ans); + return; + } + var answer = ''; + if($('#cbA').prop('checked')) + { + answer += 'A'; + } + if($('#cbB').prop('checked')) + { + answer += 'B'; + } + if($('#cbC').prop('checked')) + { + answer += 'C'; + } + if($('#cbD').prop('checked')) + { + answer += 'D'; + } + if($('#cbE').prop('checked')) + { + answer += 'E'; + } + if($('#cbF').prop('checked')) + { + answer += 'F'; + } + $('#txtanswer').val(answer); +} + +function hideAndShow(value) { + switch(value){ + case '1': + //clear(); + $('#rowA').show(); + $('#rowB').show(); + $('#rowC').show(); + $('#rowD').show(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#tap').hide(); + $('#cho').show(); + $('#blank_space').hide(); + break; + case '2': + //clear(); + $('#rowA').show(); + $('#rowB').show(); + $('#rowC').show(); + $('#rowD').show(); + $('#rowE').show(); + $('#rowF').show(); + $('#tap').hide(); + $('#cho').show(); + $('#blank_space').hide(); + break; + case '3': + //clear(); + $('#rowA').hide(); + $('#rowB').hide(); + $('#rowC').hide(); + $('#rowD').hide(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#tap').show(); + $('#cho').hide(); + $('#txtanswer').prop("disabled",false); + $('#txtanswer').innerText = '对'; + $('#blank_space').hide(); + break; + case '4': + //clear(); + $('#rowA').hide(); + $('#rowB').hide(); + $('#rowC').hide(); + $('#rowD').hide(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#tap').hide(); + $('#cho').hide(); + $('#txtanswer').prop("disabled",false); + $('#blank_space').show(); + break; + case '5': + //clear(); + $('#rowA').hide(); + $('#rowB').hide(); + $('#rowC').hide(); + $('#rowD').hide(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#tap').hide(); + $('#cho').hide(); + $('#txtanswer').prop("disabled",false); + $('#blank_space').hide(); + break; + } +} + +//添加题目时仅显示共有部分,隐藏其他部分 +function hideAndShow_add() { + $('#cho').hide(); + $('#rowA').hide(); + $('#rowB').hide(); + $('#rowC').hide(); + $('#rowD').hide(); + $('#rowE').hide(); + $('#rowF').hide(); + $('#blank_space').hide(); + $('#tap').hide(); +} + +//设为空格 +// function setSpace() { +// +// //不可实现,需要写到初始化的方法内才有效,如果想要写成一个方法,写到这里,可以参考exampaper_editexampaper.js中的setSpace()写法 +// // $('#btn_space').uiButton({ +// // onClick: function () { +// +// // } +// // }); +// } + +function checkSize(ele){ + var size_m = (ele.files[0].size / 1024); + if(size_m >= 1024*1024*5){ + $('#hidFile').val(1); + return false; + } + $('#hidFile').val(0); + return true; +} \ No newline at end of file diff --git a/asset/js/cetc54/globalConfig.js b/asset/js/cetc54/globalConfig.js new file mode 100644 index 0000000..1b3689c --- /dev/null +++ b/asset/js/cetc54/globalConfig.js @@ -0,0 +1,309 @@ +//屏蔽浏览器右键 +//$(function () { +// $(document).bind('contextmenu', function (e) { +// return false; +// }); +//}); +$.cetc54 = { + officeKey: "CETC54" +}; +$.fn.uiOfficeControl.defaults = $.extend($.fn.uiOfficeControl.defaults, { + classid: '6AA93C0B-D450-4a80-876E-3909055B0640', + makerCaption: '中国电子科技集团公司第五十四研究所', + makerKey: 'B441164A78B3CA7F2D4C7F2706617EDAE267C0CC', + productCaption: 'JAVA快速开发平台', + productKey: '2592FF2524683EFF9F624D8A21E949E3F6C49C7A', + cabVersion: '5,0,2,8' +}); +//$.fn.uiValidate.defaults = $.extend($.fn.uiValidate.defaults, { +// tipPosition: 'bottom', +// tipOffset: [0, 0] +//}); +//$.fn.uiCombo.defaults = $.extend($.fn.uiCombo.defaults, { +// delay: 500 +//}); +$.fn.uiGrid.defaults = $.extend($.fn.uiGrid.defaults, { + autoFit: true, + border: false, + colFit: true, + colFitAllTime: false, + gridTitleFix: true, + showCellTip: false, + showHeader: false, + icon: 'list' +}); +$.fn.uiPanel.defaults = $.extend({},$.fn.uiPanel.defaults, { + /** + * @type Boolean + * @default false + * @summary true时,页面需要引用animate.css + */ + animate:true, + /** + * @type String + * @default "" + * @summary 打开时的动画样式名称 + */ + animateOpen:'fadeIn', + /** + * @type String + * @default "" + * @summary 关闭时的动画样式名称 + */ + animateClose:'fadeOut' +}); +$.fn.uiDialog.defaults = $.extend($.fn.uiDialog.defaults, { + icon: 'list', + width: '80%', + height: '80%', + mask: true, + maskContainer: $(document.body), + showBtnBar: true, + lazyLoad: true +}); +/** + * 扩展验证方法 + * @type {*|Object|void|vjs.CoreObject} + */ +$.fn.uiValidate.defaults.rules = $.extend({}, $.fn.uiValidate.defaults.rules, { + idCard: { + validator: function (val) { + //身份证正则表达式(15位) + isIDCard1 = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/; + //身份证正则表达式(18位) + isIDCard2 = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}[0-9xX]$/; + return (isIDCard1.test(val) || isIDCard2.test(val)); + }, message: '请输入15位或18位身份证号!' + }, + postcode: { + validator: function (val) { + //邮政编码正则表达式 + isPostcode = /^\d{6}$/; + return isPostcode.test(val); + }, message: '请输入正确的邮政编码格式!' + }, + number: { + validator: function (val) { + //数字判断包含小数 + return !isNaN(val); + }, message: '请输入数字!' + }, + integer_p: { + validator: function (val) { + var reg = /^[+]?\d*$/; + return reg.test(val); + }, message: '请输入正整数!' + }, + english: { + validator: function (val) { + //数字判断包含小数 + return $.regexs.english.test(val); + }, message: '请输入字母A~Z' + }, + AboveAndEqualZero: { + validator: function (val) { + isAboveAndEqualZero = /^([1-9]\d*|0)\.\d*$|^0\.\d*[1-9]\d*$|^([1-9]\d*|0)$/; + return isAboveAndEqualZero.test(val); + }, message: '请输入大于等于0的数' + }, + positiveNumber: { + validator: function (val) { + isPositiveNumber = /^[1-9]\d*\.\d*$|^0\.\d*[1-9]\d*$|^[1-9]\d*$/; + return isPositiveNumber.test(val); + }, message: '请输入正数' + }, + positiveInteger: { + validator: function (val) { + isPositiveInteger = /^[1-9]\d*$/; + return isPositiveInteger.test(val); + }, message: '请输入正整数' + }, + monthNum: { + validator: function (val) { + isMonthNum = /^([1-9]|1[0-2])$/; + return isMonthNum.test(val); + }, message: '请输入每年正确的工作时间(1-12)' + }, + moreThanFive: { + validator: function (val) { + moreThanFive = /^[5-9]\d(\.\d+)?$/; + return moreThanFive.test(val); + }, message: '请输入大于5的正数' + }, + pointNum: { + validator: function (val) { + // isPointNum = /^[0-9]+(.[0-9]{0,6})?$/; + isPointNum = /^\d+(\.\d{0,2})?$/ + return isPointNum.test(val); + }, message: '请输入不多于两位小数的正数或正整数' + }, + Email: { + validator: function (val) { + isEmail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + return isEmail.test(val); + }, message: '请输入正确的电子邮件编码格式' + } +}); + +/** + * 数据字典路径 + * @type {string} + */ +var dictBaseUrl = $('#hdWebroot').val() + '/dict/dict/getDictList?dictKey='; +/** + * 数据字典缓存hd前缀 + * @type {string} + */ +var dict_prefix = 'hdDict_'; + +/** + * 日期转换 + */ +template.helper('dateTimeFilter', function (value) { + var d = new Date(value); + return d == "Invalid Date" ? "" : d.format("yyyy-MM-dd hh:mm:ss"); +}); +/** + * 日期转换 + */ +template.helper('dateFilter', function (value) { + var d = new Date(value); + return d == "Invalid Date" ? "" : d.format("yyyy-MM-dd"); +}); +template.helper('customDateFilter', function (value) { + return getCustomTime(value); +}); + +template.helper('istrueFilter', function (value) { + return gridColFilter('istrue', value); +}); +template.helper('isenableFilter', function (value) { + return gridColFilter('isenable', value); +}); +template.helper('sexFilter', function (value) { + return gridColFilter('sex', value); +}); +/** + * 数据表格列带数据字典的转换 + * @param dictKey 字典Key + * @param value 列值 + * @returns {*} + */ +function gridColFilter(dictKey, value) { + var hdName = dict_prefix + dictKey; + var res; + if (window[hdName]) { + res = window[hdName]; + } else { + $.ajax({ + type: 'post', + async: false, + url: dictBaseUrl + dictKey, + dataType: 'json', + success: function (result) { + if (result.success) { + window[hdName] = result.data; + res = result.data; + } + } + }); + } + return findValue(res, value); + + function findValue(data, value) { + var res = value; + if (data != null) { + for (var i = 0; i < data.length; i++) { + var item = data[i]; + if (item.value == value) { + res = item.name; + break; + } + } + } + return res; + } +} +/** + * 获取当前日期 + * @returns {string} + */ +function getDateNow(dateSp) { + dateSp = dateSp || '-'; + var date = new Date(); + return dat.format("yyyy" + dateSp + "MM" + dateSp + "dd"); +} +/** + * 获取当前时间(日期和时间) + * @param dateSp 日期分隔符 + * @param timeSp 时间分隔符 + * @param sp 日期和时间之间的分隔符 + * @param withMs 是否带毫秒 true带毫秒 + */ +function getDateAndTime(dateSp, timeSp, sp, withMs) { + if (dateSp == undefined) { + dateSp = '-'; + } + if (timeSp == undefined) { + timeSp = ':'; + } + if (sp == undefined) { + sp = ' '; + } + var format = "yyyy" + dateSp + "MM" + dateSp + "dd" + sp + "hh" + timeSp + "mm" + timeSp + "ss"; + + if (withMs) { + format += timeSp + "S"; + } + var date = new Date(); + return date.format(format); +} + +function getCustomTime(date) { + var tempTime; + var dateTime1 = new Date();; + var dateTime2 =new Date(date); + if (dateTime1.getFullYear() == dateTime2.getFullYear()) { + if (dateTime1.getMonth() == dateTime2.getMonth()) { + if (dateTime1.getDay() == dateTime2.getDay()) { + tempTime = dateTime2.format("hh:mm"); + } else { + if (dateTime1.getDay() - dateTime2.getDay() == 1) { + tempTime = dateTime2.format("昨天 hh:mm"); + } else { + tempTime = dateTime2.format("M-dd hh:mm"); + } + } + } else + tempTime = dateTime2.format("M-dd hh:mm"); + } else { + tempTime = dateTime2.format("yyyy-M-dd"); + } + + return tempTime; +} + +function showErrorContent(container, content, width, height) { + var html = $('
          '); + container.html(html); + html.uiPanel({ + panelStyle: 'ui_panel_danger', + title: '提示', + content: '
          ' + content + '
          ', + width: width, + height: height + }); + html.uiPosition({ + vertical: 'center', + horizontal: 'center' + }); +} +$(document).unbind(".shortcut").bind("mousedown.shortcut", function (e) { + var target= $(e.target).closest(".shortcut"); + try { + var shortcut = top.$('#shortcut'); + if (target.length == 0 && shortcut && shortcut.hasClass("fadeInDown")) { + shortcut.removeClass('fadeInDown').addClass('slideOutUp fast'); + } + }catch(e){} +}); \ No newline at end of file diff --git a/asset/js/cetc54/groups/groups.js b/asset/js/cetc54/groups/groups.js new file mode 100644 index 0000000..0140e87 --- /dev/null +++ b/asset/js/cetc54/groups/groups.js @@ -0,0 +1,206 @@ +/** + * Created by jinxs on 2016.07.06. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/groups/groups/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + var dialogSize = {width: 540, height: '80%'};//弹出窗口大小 + + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var grid = $('#grid'); + +//-----------------------初始化-------------------------------------- + initGroupsGrid(); + initGroupsForm(); + // addFilter(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function initGroupsGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '用户组名称|创建人姓名|创建人账号', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + defaultSortField: 'creater_time' + }); + } + + function initGroupsForm() { + dialog.uiDialog({ + title: '新建', + width: dialogSize.width, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + var roleType = 0; + grid_form.uiForm('load', {}); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + param.id = $('#hdID').val(); + var isValid = $('#grid_form').uiForm('validate'); + + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog.uiDialog('close'); + grid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (data) { + var me = $(this); + switch (op) { + case 'view': + me.uiForm('setReadonly', true); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + } + }); + } + + function addEvents() { + //新建 + $('#btn1').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新增用户组'); + }); + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + + } + // + // function addFilter() { + // template.defaults.imports.statusFilter = function (value) { + // var text = gridColFilter('isenable', value); + // var span = ''; + // break; + // case 0: + // span += 'danger">'; + // break; + // } + // text = span + text + ''; + // return text; + // }; + // } +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + +} + +//编辑 +function editRow(id) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('button', 'btnOK').show(); +} + +// 删除 +function deleteRow(id) { + deleteData("此操作将删除用户组信息,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/chat/appVersion.js b/asset/js/cetc54/jcdp/chat/appVersion.js new file mode 100644 index 0000000..4e39ab2 --- /dev/null +++ b/asset/js/cetc54/jcdp/chat/appVersion.js @@ -0,0 +1,282 @@ +/** + * Created by erc on 2017/9/8. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/chat/AppVersion/'; +var deleteUrl = rootUrl + "delete"; +$(function () { + var firstLoad_ad = true; + var firstLoad_ios = true; + var listUrl = rootUrl + "getAppList"; + var saveUrl = rootUrl + "save"; + var dialogSize = {width: 540, height: '80%'};//弹出窗口大小 +//----------------------------------------------------------------------- + var grid = $('#grid'); + var grid1 = $('#grid1'); + var grid2 = $('#grid2'); + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var tab = $('#tabForm').uiTabs({ + onSelect: function (id, index) { + if (id == "android" && firstLoad_ad) { + initAndroid(); + firstLoad_ad = false; + } + if (id == "ios"&&firstLoad_ios) { + initIOS(); + firstLoad_ios=false; + } + } + }); + initWindows(); + initBaseInfoForm(); + addEvents(); +//----------------------------------------------------------------------- + function initWindows() { + //初始化grid + grid.uiGrid({ + url: listUrl, + queryParams: {pkgType: 1}, + defaultSortField: 'publishdate', + }); + } + + function initAndroid() { + //初始化grid + grid1.uiGrid({ + url: listUrl, + queryParams: {pkgType: 2}, + defaultSortField: 'publishdate' + }); + } + function initIOS() { + //初始化grid + grid2.uiGrid({ + url: listUrl, + queryParams: {pkgType: 3}, + defaultSortField: 'publishdate' + }); + } + + function initBaseInfoForm() { + dialog.uiDialog({ + title: '查看', + width: dialogSize.width, + height: dialogSize.height, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + var op = dialogP.action; + var type = dialogP.type; + var selGrid; + if (type == 1) { + selGrid = grid; + } + if (type == 2) { + selGrid = grid1; + } + if (type == 3) { + selGrid = grid2; + } + switch (op) { + case 'view': + case 'edit': + grid_form.uiForm('load', selGrid.uiGrid('selectedData')[0]); + break; + case 'add': + grid_form.uiForm('load', {publishdate: new Date(), pkgtype: type, islastversion: 1}); + break; + default : + break; + } + }, + onClose: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + var type = dialogP.type; + if (type == 1) { + + } + if (type == 2) { + + } + if (type == 3) { + + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + var isValid = $('#grid_form').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog.uiDialog('close'); + var dialogP = $('#dialog').uiDialog('getUserParam'); + var type = dialogP.type; + var selGrid; + if (type == 1) { + selGrid = grid; + } + if (type == 2) { + selGrid = grid1; + } + if (type == 3) { + selGrid = grid2; + } + selGrid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (data) { + $('#isupdatepkg').dictCombobox(); + var publishdate = $('#publishdate'); + publishdate.uiDate(); + switch ($('#dialog').uiDialog('getUserParam').action) { + case 'view': + $('#grid_form').uiForm('setReadonly', true); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + } + }); + } + + function addEvents() { + $('#btnAdd_w').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0, type: 1}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('添加Windows应用包'); + }); + $('#btnDelete_w').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids, grid); + } + }); + $('#btnAdd_a').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0, type: 2}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('添加Android应用包'); + }); + $('#btnDelete_a').bind('click', function () { + var ids = grid1.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids, grid1); + } + }); + $('#btnAdd_i').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0, type: 3}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('添加IOS应用包'); + }); + $('#btnDelete_i').bind('click', function () { + var ids = grid2.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids, grid2); + } + }); + } + +//----------------------------------------------------------------------- + +}); + +template.helper('updatepkgFilter',function (value) { + return gridColFilter('isupdatepkg', value); +}); +//查看 +function viewRow(id, type) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id, type: type}); + dialog.uiDialog('button', 'btnOK').hide(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('查看'); + +} +//编辑 +function editRow(id, type) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id, type: type}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); +} +// 删除 +function deleteRow(id, grid) { + deleteData("确定要删除所选应用信息吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + if (grid == 1) { + $("#grid").uiGrid('loadData'); + } else if (grid == 2) { + $("#grid1").uiGrid('loadData'); + }else if (grid == 3) { + $("#grid2").uiGrid('loadData'); + } + else { + grid.uiGrid('loadData'); + } + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/downloadApp.js b/asset/js/cetc54/jcdp/downloadApp.js new file mode 100644 index 0000000..87cc9ff --- /dev/null +++ b/asset/js/cetc54/jcdp/downloadApp.js @@ -0,0 +1,112 @@ +/** + * Created by erc on 2017/9/4. + */ +$(function () { + var webroot = $("#hdWebroot").val(); + var webrootHttps = $("#hdWebrootHttps").val()+"/index/login"; + var logUrl=webroot+"/chat/AppVersion/getPkgList?pkgType="; + var routerUrl=webroot+"/index/downloadRouter"; + var androidUrl=webroot+"/chat/AppVersion/downFile?pkgType=2&isUpdatePkg=0"; + var iosUrl=webroot+"/chat/AppVersion/downFile?pkgType=3&isUpdatePkg=0"; + var winUrl=webroot+"/chat/AppVersion/downFile?pkgType=1&isUpdatePkg=0"; + createQr(); + getLogList(); + $(".listLi").bind("mouseover",function (e) { + var div= this; + var divDl=$(".divDl",div); + var divQr=$(".divQr",div); + divDl.hide(); + divQr.show(); + }).bind("mouseout",function (e) { + var div= this; + var divDl=$(".divDl",div); + var divQr=$(".divQr",div); + divDl.show(); + divQr.hide(); + }); + $("#down-android").bind("click",function () { + if(androidUrl!="") { + location.href = androidUrl; + location.target="_blank"; + } + }); + $("#down-ios").bind("click",function () { + if(iosUrl!=""){ + location.href=iosUrl; + } + }); + $("#down-win").bind("click",function () { + if(winUrl!="") { + location.href = winUrl; + } + }); + $("#gotoIndex").bind("click",function () { + location.href=webrootHttps; + }); + function createQr() { + var config={ + text: androidUrl, + width: 120, + height: 120, + colorDark : "#000000", + colorLight : "#ffffff", + correctLevel : QRCode.CorrectLevel.H + }; + var qr_android; + var qr_ios; + var qr=new QRCode(document.getElementById("side_code"),$.extend({},config,{ + text:routerUrl, + width: 150, + height: 150, + }) ); + if(androidUrl!="") { + qr_android = new QRCode(document.getElementById("qr_android"), $.extend({},config,{ + text:androidUrl + }) ); + }else { + $("#qr_android").html("即将上线"); + } + if(iosUrl!=""){ + qr_ios = new QRCode(document.getElementById("qr_ios"),$.extend({},config,{ + text:iosUrl + }) ); + }else { + $("#qr_ios").html("即将上线"); + } + } + function getLogList() { + getData(1); + getData(2); + getData(3); + function getData(type) { + $.ajax({ + type: 'post', + url: logUrl+type, + success: function (result) { + if (result.success) { + var data = result.data; + var html = template('logList_Temp', data); + var div; + switch(type){ + case 2: + div=$("#log_android"); + break; + case 3: + div=$("#log_ios"); + break; + case 1: + div=$("#log_win"); + break; + } + div.append(html); + } + } + }); + } + } +}); +function showLog(item,e) { + var div=$(item); + div.find(".fa-angle-up,.fa-angle-down").toggle(); + div.parent().find(".logContent").toggle(); +} diff --git a/asset/js/cetc54/jcdp/feedback/feedback.js b/asset/js/cetc54/jcdp/feedback/feedback.js new file mode 100644 index 0000000..5a18f55 --- /dev/null +++ b/asset/js/cetc54/jcdp/feedback/feedback.js @@ -0,0 +1,220 @@ +/** + * Created by on 2017-06-14. + */ + +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/feedback/feedback/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + + var dialogSize = {width: 600, height: '80%'};//弹出窗口大小 + + var dialog = $('#dialog'); + var dialog_empty = $('#dialog_empty'); + var grid_form = $('#grid_form'); + + var grid = $('#grid'); + + + +//-----------------------初始化-------------------------------------- + initUserGrid(); + initUserForm(); + loadGrid(); + addFilter(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function loadGrid() { + grid.uiGrid('loadData', { + url: listUrl, + pageIndex: 1 + }); + } + + function initUserGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + prompt: '反馈人', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid(); + } + + function initUserForm() { + dialog.uiDialog({ + title: '查看', + width: dialogSize.width, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + op = dialogP.action; + // var id = dialogP.id; + var ids = grid.uiGrid('selectedData','id'); + grid_form.uiForm('load',grid.uiGrid('selectedData')[0]); + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + param.id = $('#hdID').val(); + var isValid = $('#grid_form').uiForm('validate'); + + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog.uiDialog('close'); + grid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + //弹出图片窗口 + dialog_empty.uiDialog({ + title: '', + maximized:true, + onOpen: function () { + var dialogP = $('#dialog_empty').uiDialog('getUserParam'); + var src = dialogP.src; + $('#showPic').attr("src",src); + }, + buttons: [ + { + id: 'btnClose', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog_empty.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onBeforeCompile:function (data) { + data.imgs = eval(data.imgs); + }, + onLoadSuccess: function (data) { + var t = JSON.parse(data.deviceinfo); + var json = JSON.stringify(t,null,4); + $('#deviceInfo').html(json); + + var me = $(this); + switch (op) { + case 'view': + me.uiForm('setReadonly', true); + break; + case 'edit': + me.uiForm('setReadonly', false); + break; + case 'add': + me.uiForm('setReadonly', false); + break; + default : + break; + } + + } + }); + } + + + function addEvents() { + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + } + + function addFilter() { + + } +}); +function viewPic(src){ + var dialog_empty = $('#dialog_empty'); + dialog_empty.uiDialog('setUserParam', {src: src}); + dialog_empty.uiDialog('open'); +} +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('button', 'btnOK').hide(); + dialog.uiDialog('open'); +} + +//编辑 +function editRow(id) { + var dialog = $('#dialog'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); +} + +// 删除 +function deleteRow(id) { + deleteData("确定要删除所选用户信息吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} diff --git a/asset/js/cetc54/jcdp/inbox.js b/asset/js/cetc54/jcdp/inbox.js new file mode 100644 index 0000000..d13ef2a --- /dev/null +++ b/asset/js/cetc54/jcdp/inbox.js @@ -0,0 +1,212 @@ +/** + * Created by jinxs on 2016.08.02. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/Inbox/'; +var deleteUrl = rootUrl + "delete"; +$(function () { + var firstLoad = true; + var listUrl = rootUrl + "list"; + var changeStatus = rootUrl + "changeMsgStatus"; + var dialogSize = {width: 540, height: '80%'};//弹出窗口大小 +//----------------------------------------------------------------------- + var grid = $('#grid'); + var grid1 = $('#grid1'); + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var tab = $('#tabForm').uiTabs({ + onSelect: function (id, index) { + if (id == "modifyPass" && firstLoad) { + initReadGrid(); + firstLoad = false; + } + } + }); + initNoReadGrid(); + initBaseInfoForm(); + addEvents(); +//----------------------------------------------------------------------- + function initNoReadGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '标题|内容|发送人', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + queryParams: {msgstatus: 0}, + defaultSortField: 'list.sendtime', + }); + } + + function initReadGrid() { + //初始化搜索框 + $('#searchbox1').uiSearchbox({ + width: 240, + prompt: '标题|内容|发送人', + searcher: function (v) { + grid1.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid1.uiGrid({ + url: listUrl, + queryParams: {msgstatus: 1}, + defaultSortField: 'list.sendtime' + }); + } + + function initBaseInfoForm() { + dialog.uiDialog({ + title: '查看', + width: dialogSize.width, + height:dialogSize.height, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + var type = dialogP.type; + var selGrid; + if(type==0){ + selGrid=grid; + }else{ + selGrid=grid1; + } + grid_form.uiForm('load', selGrid.uiGrid('selectedData')[0]); + }, + onClose:function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + var type = dialogP.type; + if(type==0){ + var ids = grid.uiGrid('selectedData', 'id'); + ajaxChangeStatus(ids,1); + } + }, + buttons: [ + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (data) { + } + }); + } + + function addEvents() { + $('#btnRead').bind('click', function () { + changeMsgStatus(grid, 1); + }); + $('#btnDelete').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids, grid); + } + }); + $('#btnNoRead').bind('click', function () { + changeMsgStatus(grid1, 0); + }); + $('#btnDeleteRead').bind('click', function () { + var ids = grid1.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids, grid1); + } + }); + } + + function changeMsgStatus(currentGrid, status) { + var ids = currentGrid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要操作的行!', 'alert'); + return; + } + var confirmText = ''; + if (status == 1) { + confirmText = '已读'; + } + if (status == 0) { + confirmText = '未读'; + } + confirmText = '确定将选中的【' + ids.length + '】个消息设置为' + confirmText + '吗?'; + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + ajaxChangeStatus(ids,status); + } + } + }); + + } + function ajaxChangeStatus(ids,status) { + $.ajax({ + type: 'post', + url: changeStatus, + data: {ids: ids, status: status}, + dataType: "json", + success: function (result) { + grid.uiGrid('loadData'); + grid1.uiGrid('loadData'); + } + }); + } + +//----------------------------------------------------------------------- + +}); + +//查看 +function viewRow(id, type) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {type: type}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('查看消息'); + +} +// 删除 +function deleteRow(id, grid) { + deleteData("确定要删除这些消息吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + grid.uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/index.js b/asset/js/cetc54/jcdp/index.js new file mode 100644 index 0000000..56a6f30 --- /dev/null +++ b/asset/js/cetc54/jcdp/index.js @@ -0,0 +1,181 @@ +/** + * Created by jinxs on 2016.06.17. + */ +var webroot = $("#hdWebroot").val(); +$(function () { + //------------------------属性------------------------------------- + var menuUrl = webroot + '/index/getMenu'; + var switchOrgUrl = webroot + '/user/userProfile/switchOrg'; + var logoutUrl = "index/logout"; + var layout = $('#layout'); + var tabs = $('#tabs'); + var btnFullscreen = $('#fullscreen'); + var btnLogout = $('#logout'); + var loginInfo = $('#loginInfo'); + var showShortcut = $('#show-shortcut'); + var leftNav=$('#leftNav'); + var nav = $('#nav'); + var menu = $("#ulMenu"); + var shortcut = $('#shortcut'); + var selUserOrg = $('#selUserOrg'); + var setting = { + data: { + simpleData: { + enable: true, + pIdKey: 'parent_id', + rootPid: 'root' + } + }, + view: { + selectedMulti: false, + showLine: true + }, + async: { + enable: true, + url: menuUrl + }, + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载项目目录失败!" + errorThrown); + }, + onAsyncSuccess: function (event, treeId, treeNode, msg) { + }, + beforeClick: function (treeId, treeNode, clickFlag) { + var zTree = $.fn.zTree.getZTreeObj("ulMenu"); + if (treeNode.isParent) { + zTree.expandNode(treeNode); + return false; + } + }, + onClick: function (event, treeId, treeNode) { + var url = treeNode.href; + switch (treeNode.moduletype) { + case 1: + url = '.' + url; + break; + } + tabs.uiTabs('add', { + id: 'tabs-' + treeNode.id, + icon: treeNode.icon, + title: treeNode.name, + iniframe: true, + url: url, + padding: '5px', + closable: true, + collapsible: false + }); + } + } + }; +//-----------------------初始化-------------------------------------- + if (_IE) { + btnFullscreen.remove(); + if (_IEunder8) { + btnLogout.addClass('header_btn_ie'); + btnLogout.find('a').html('退出系统'); + } + } + layout.uiLayout(); + tabs.uiTabs({ + tabWidth: 'auto' + }); + clacMenuHeight(); + $.fn.zTree.init(menu, setting); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function clacMenuHeight() { + leftNav.css({width:'100%',height:'100%'}) + nav.outerHeight(leftNav.height() - 70); + var iframe = $("#main-iframe"); + if(iframe.length>0){ + iframe.css({width:'100%',height:'100%'}); + } + } + + function addEvents() { + btnFullscreen.bind('click', function () { + var t = $(this); + if ($.uiFullScreen.supportsFullScreen) { + if ($.uiFullScreen.isFullScreen()) { + btnFullscreen.removeClass("header_btn_focus"); + $.uiFullScreen.cancelFullScreen(); + } else { + btnFullscreen.addClass("header_btn_focus"); + $.uiFullScreen.requestFullScreen(); + } + } else { + var msg = "当前浏览器不支持全屏 API,请更换至最新的 Chrome/Firefox/Safari 浏览器或通过 F11 快捷键进行操作。"; + $.uiMessagetip.show({ + animate: true, + width: 400, + height: 80, + title: '消息提示', + content: msg, + vertical: 'top', + horizontal: 'center', + timeout: 3500 + }); + } + }); + btnLogout.bind('click', function () { + $.uiMessagebox.confirm({ + title: '确认操作', + content: '确定要退出系统吗?', + onClose: function (flag) { + if (flag) { + $.post(logoutUrl, function (rs) { + if (rs.success) { + window.location.replace('index/login'); + } else { + showResult(false, '退出系统失败!', 'error'); + } + }); + } + } + }); + }); + $(window).bind('resize.menu', function () { + clacMenuHeight(); + }); + showShortcut.bind('click', function (e) { + $('#shortcut').removeClass('slideOutUp').addClass('animated fadeInDown fast').show(); + }); + selUserOrg.bind('change', function (e) { + var orgid = selUserOrg.val(); + $.ajax({ + type: 'post', + url: switchOrgUrl, + data: {orgid: orgid}, + success: function (result) { + } + }); + }); + } +}); +function toShortcut(e, li, id, title, icon, href) { + var updateOnOpen = false; + if (id == "4dbf4801f6c74c05b07629d037c072ba") { + updateOnOpen = true; + } + $('#tabs').uiTabs('add', { + id: 'tabs-' + id, + fontIcon: {icon: icon, color: '#000'}, + icon: 'list', + title: title, + iniframe: true, + updateOnOpen: updateOnOpen, + url: href, + padding: '5px', + closable: true, + collapsible: false + }); + hideShortcut(); +} +function hideShortcut() { + if (_IEunder9) { + $('#shortcut').hide(); + } else { + $('#shortcut').removeClass('fadeInDown').addClass('slideOutUp fast'); + } +} \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/log/log.js b/asset/js/cetc54/jcdp/log/log.js new file mode 100644 index 0000000..2a8dfe8 --- /dev/null +++ b/asset/js/cetc54/jcdp/log/log.js @@ -0,0 +1,30 @@ +/** + * Created by jinxs on 2016.07.06. + */ +$(function () { + //------------------------属性------------------------------------- + var webroot = $("#hdWebroot").val(); + var rootUrl = webroot + '/log/log/'; + var listUrl = rootUrl + 'list';//分页数据地址 + var grid = $('#grid'); +//-----------------------初始化-------------------------------------- + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width:200, + prompt: '登录账号|用户姓名|会话ID', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + colFit:false, + defaultSortField:'createtime', + url:listUrl + }); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function addEvents() { + } +}); \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/log/session.js b/asset/js/cetc54/jcdp/log/session.js new file mode 100644 index 0000000..735c0ff --- /dev/null +++ b/asset/js/cetc54/jcdp/log/session.js @@ -0,0 +1,65 @@ +/** + * Created by jinxs on 2016.07.06. + */ +$(function () { + //------------------------属性------------------------------------- + var webroot = $("#hdWebroot").val(); + var rootUrl = webroot + '/log/session/'; + var listUrl = rootUrl + 'list';//分页数据地址 + var offlineUrl=rootUrl+'offineUser'; + var grid = $('#grid'); +//-----------------------初始化-------------------------------------- + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 200, + prompt: '登录账号|用户姓名', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + colFit: false, + defaultSortField: 'createtime', + url: listUrl + }); + template.helper('stateFilter', function(value){ + return gridColFilter('sessionstate', value); + }); + template.helper('userAgentFilter', function(value){ + var ua = new uaDevice(value); + var html = template("userAgent_temp", ua); + return html; + }); + + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function addEvents() { + $("#btnOffline").bind("click", function (e) { + var ids = grid.uiGrid('selectedData', 'sessionid'); + if (ids.length == 0) { + showResult(false, '请选择要强制下线的会话!', 'alert'); + } else { + $.uiMessagebox.confirm({ + title: '确认操作', + content: "确定要将所选会话强制下线吗?", + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: offlineUrl, + data: {ids:ids}, + success: function (result) { + if(result.success){ + grid.uiGrid("loadData"); + } + } + }); + } + } + }); + } + }) + } +}); \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/login.js b/asset/js/cetc54/jcdp/login.js new file mode 100644 index 0000000..2ac7e5d --- /dev/null +++ b/asset/js/cetc54/jcdp/login.js @@ -0,0 +1,78 @@ +$(function () { + var webroot = $("#hdWebroot").val(); + var webrootHttp = $("#hdWebrootHttp").val(); + var appdownload=eval('(' + $("#hdapp").val() + ')'); + var forward=$("#forward").val(); + var loginUrl = webroot + "/user/user/validate"; + var downloadUrl=webrootHttp+"/index/downloadPage"; + + var txtName = $("#txtName").uiValidate({ + star:{show:false}, + width:260, + required: true, + showTitleTip: true + }); + txtName.focus(); + var txtPwd = $("#txtPwd").uiValidate({ + star:{show:false}, + width:260, + required: true, + showTitleTip: true + }); + var formLogin = $('#formLogin').uiForm(); + $("#btnLogin").bind("click", login); + $("#btnApp").bind("click",function(){ + if(appdownload.custom){ + window.open(appdownload.customurl,"_blank"); + }else{ + location.href=downloadUrl; + } + }); + txtPwd.bind("keydown", function (e) { + if (e.which == $.keyCode.ENTER) { + login(); + return false; + } + }); + var divBrowser = $('#divBrowser'); + if (_IEunder9) { + divBrowser.append('
          为了获得更好的用户体验,强烈建议您安装使用firefox/Chrome浏览器!
          '); + } + + if (divBrowser.html() == "") { + divBrowser.remove(); + } + + function login() { + formLogin.uiForm('submit', { + url: loginUrl, + method: 'post', + onSubmit: function (params) { + var isValid = formLogin.uiForm('validate'); + if (!isValid) { + showResult(false, '请输入用户名和密码!'); + } + params.userPwd=md5(txtPwd.val()); + return isValid; // 返回false终止表单提交 + }, + success: function (data) { + if (data.success) { + window.location.href=webroot+forward; + } else { + $.uiMessagebox.alert({ + width: 300, + height: 120, + type: 'alert', + title: '消息提示', + content: data.message, + timeout:3500, + onClose:function(){ + $("#txtPwd").val('').focus(); + } + }); + } + } + }); + return false; + } +}); diff --git a/asset/js/cetc54/jcdp/portal.js b/asset/js/cetc54/jcdp/portal.js new file mode 100644 index 0000000..9b5c39e --- /dev/null +++ b/asset/js/cetc54/jcdp/portal.js @@ -0,0 +1,304 @@ +/** + * Created by jinxs on 2016.08.02. + */ +var webroot = $("#hdWebroot").val(); +var taskDataCache; +var applyDataCache; +$(function () { + var msgListUrl = webroot + "/Inbox/list"; + var taskListUrl=webroot+"/Task/tasklist"; + var applyListUrl=webroot+"/Task/applyList"; + var changeStatus = webroot + "/Inbox/changeMsgStatus"; + var divTop = $("#top"); + var customIframe = $("#customIframe"); + var linkMyTask = $("#linkMyTask"); + var linkMsgCount = $("#linkMsgCount"); + var linkTaskCount = $("#linkTaskCount"); + var linkApplyCount = $("#linkApplyCount"); + var divMyTask = $("#divMyTask"); + + var divMsg = $("#divMsg"); + var divTask = $("#divTask"); + var divApply = $("#divApply"); + + var divCustom = $("#divCustom"); + var divMyTask_close = $("#divMyTask_close"); + var dialogSize = {width: 540, height: '80%'}; + + var dialogApply = $('#dialogApply'); + var form_apply = $('#form_apply'); + + var dialogTask = $('#dialogTask'); + var form_task = $('#form_task'); + + divCustomAutoFit(); + initPalMsg(); + initPalTask(); + initPalApply(); + initMsgDialog(); + initTaskDialog(); + initApplyDialog(); + addEvents(); +//----------------------------------------------------------------------- + function showMsgCount(count) { + if(count>99){ + return "99+"; + }else{ + return count+""; + } + } + function initPalMsg() { + $.ajax({ + type: 'post', + url: msgListUrl, + data: {msgstatus: 0, orderField: 'list.sendtime', descended: true, pageIndex: 1, pageSize: 5}, + success: function (result) { + var data = result.data; + var temp = template("msg_temp", data); + divMsg.html(temp); + linkMsgCount.html(showMsgCount(data.total)); + if (data.total == 0) { + $("#msgList").html("
          没有未读消息
          "); + } + } + }); + } + function initPalTask() { + $.ajax({ + type: 'post', + url: taskListUrl, + data: {orderField: 'tl.APPLYTIME',type:0, descended: true, pageIndex: 1, pageSize: 5}, + success: function (result) { + var data = result.data; + taskDataCache=data.rows; + var temp = template("task_temp", data); + divTask.html(temp); + linkTaskCount.html(showMsgCount(data.total)); + if (data.total == 0) { + $("#taskList").html("
          没有待办任务
          "); + } + } + }); + } + function initPalApply() { + $.ajax({ + type: 'post', + url: applyListUrl, + data: {type: 0, orderField: 'APPLYTIME', descended: true, pageIndex: 1, pageSize: 5}, + success: function (result) { + var data = result.data; + applyDataCache=data.rows; + var temp = template("apply_temp", data); + divApply.html(temp); + linkApplyCount.html(showMsgCount(data.total)); + if (data.total == 0) { + $("#applyList").html("
          没有未完成的申请
          "); + } + } + }); + } + + function divCustomAutoFit() { + divCustom.autoFit(true); + customIframe.css({width: divCustom.width(), height: divCustom.height()}); + } + + function initMsgDialog() { + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + dialog.uiDialog({ + title: '查看', + width: dialogSize.width, + height: dialogSize.height, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + var msg = dialogP.msg; + grid_form.uiForm('load', msg); + }, + onClose: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + var id = dialogP.msg.id; + ajaxChangeStatus(id); + }, + buttons: [ + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (data) { + } + }); + } + + function ajaxChangeStatus(ids) { + $.ajax({ + type: 'post', + url: changeStatus, + data: {ids: ids, status: 1}, + dataType: "json", + success: function (result) { + initPalMsg(); + } + }); + } + + + function initTaskDialog() { + dialogTask.uiDialog({ + title: '查看', + width: dialogSize.width, + height: dialogSize.height, + showBtnBar:false, + maximized: true, + onOpen: function () { + var dialogP = dialogTask.uiDialog('getUserParam'); + var task = dialogP.task; + form_task.uiForm('load', task); + }, + onPanelResize:function () { + divTaskIframeAutoSize(); + } + }); + + form_task.uiForm({ + template: 'form_task_temp', + onLoadSuccess: function (data) { + divTaskIframeAutoSize(); + } + }); + function divTaskIframeAutoSize() { + var height = dialogTask.uiPanel("content").height(); + $("#divTaskIframe").height(height-64); + } + } + function initApplyDialog() { + dialogApply.uiDialog({ + title: '查看', + width: dialogSize.width, + height: dialogSize.height, + showBtnBar: false, + maximized: true, + onOpen: function () { + var dialogP = dialogApply.uiDialog('getUserParam'); + var apply = dialogP.apply; + form_apply.uiForm('load', apply); + }, + onPanelResize: function () { + divApplyIframeAutoSize(); + } + }); + + form_apply.uiForm({ + template: 'form_apply_temp', + onLoadSuccess: function (data) { + divApplyIframeAutoSize(); + } + }); + function divApplyIframeAutoSize() { + var height = dialogApply.uiPanel("content").height(); + $("#divApplyIframe").height(height - 64); + } + } + + function addEvents() { + linkMyTask.bind("mouseover", function (e) { + if (!divMyTask.is(":visible") || divMyTask.hasClass("slideOutUp")) { + divMyTask.removeClass('animated slideOutUp').addClass('animated fadeInDown fast').show(); + } + }); + divMyTask_close.bind("click", function () { + divMyTask.removeClass('animated fadeInDown').addClass('animated slideOutUp fast'); + setTimeout(function () { + divMyTask.hide(); + },500); + }); + $(document).unbind(".myTask").bind("mousedown.myTask", function (e) { + var targetlink = $(e.target).closest(".linkMyTask"); + var target = $(e.target).closest(".divMyTask"); + var targetDialog = $(e.target).closest(".ui_dialog"); + if (targetlink==0&&target.length == 0 && targetDialog.length == 0) { + divMyTask_close.click(); + } + }); + $(window).bind('resize', function () { + divCustomAutoFit(); + }); + } +}); +function showMoreMsg() { + openTab('tabs-4dbf4801f6c74c05b07629d037c072ba','fa-inbox','消息','/inbox',true); +} +function showMoreTask() { + openTab('tabs-1cacf210910640a58c2f3fe190122711','fa-tasks','我的待办','/task/myTask',true); +} +function showMoreApply() { + openTab('tabs-1cb2fb93db774202bdd2532fa57d9bff','fa-inbox','我的申请','/task/myApply',true); +} +function showMyInfo() { +openTab('tabs-b0a68ab9eb434f77843ed1e6a02eb2d1','fa-user','个人信息','/user/userProfile/index') +} + +function openTab(id,icon,title,url,updateOnOpen) { + if (top.$('#tabs')) { + if(updateOnOpen==undefined){ + updateOnOpen=false; + } + top.$('#tabs').uiTabs('add', { + id: id, + fontIcon: {icon: icon, color: '#000'}, + icon: 'list', + title: title, + iniframe: true, + url: webroot+url, + updateOnOpen: updateOnOpen, + padding: '5px', + closable: true, + collapsible: false + }); + } +} +//查看 +function viewMsg(id, msgtitle, username, usercode, sendtime, msgcontent) { + var dialog = $('#dialog'); + var msg = { + id: id, + msgtitle: msgtitle, + username: username, + usercode: usercode, + sendtime: sendtime, + msgcontent: msgcontent + } + dialog.uiDialog('setUserParam', {msg: msg}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('查看消息'); + +} +//查看 +function viewTask(data) { + var dialog = $('#dialogTask'); + var task = taskDataCache[data]; + dialog.uiDialog('setUserParam', {task: task}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('待办任务'); + +} +//查看 +function viewApply(data) { + var dialog = $('#dialogApply'); + var apply = $.extend({},applyDataCache[data],{type:0}); + dialog.uiDialog('setUserParam', {apply: apply}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('未完成申请'); + +} \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/portal_custom.js b/asset/js/cetc54/jcdp/portal_custom.js new file mode 100644 index 0000000..453bcdd --- /dev/null +++ b/asset/js/cetc54/jcdp/portal_custom.js @@ -0,0 +1,11 @@ +/** + * Created by Administrator on 2017/7/26. + */ +$(function () { + $(document).unbind(".myTask").bind("mousedown.myTask", function (e) { + var target = parent.$(".divMyTask"); + if (target.length > 0&&target.hasClass("fadeInDown")) { + parent.$("#divMyTask_close").click(); + } + }); +}); \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/task/myApply.js b/asset/js/cetc54/jcdp/task/myApply.js new file mode 100644 index 0000000..4cf3831 --- /dev/null +++ b/asset/js/cetc54/jcdp/task/myApply.js @@ -0,0 +1,114 @@ +/** + * Created by Administrator on 2017/7/26. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/Task/'; +var deleteUrl = rootUrl + "delete"; +$(function () { + var firstLoad = true; + var listUrl = rootUrl + "applyList"; + var dialogSize = {width: 540, height: '80%'};//弹出窗口大小 +//----------------------------------------------------------------------- + var grid = $('#grid'); + var grid1 = $('#grid1'); + var dialogApply = $('#dialogApply'); + var form_apply = $('#form_apply'); + + var tab = $('#tabForm').uiTabs({ + onSelect: function (id, index) { + if (id == "modifyPass" && firstLoad) { + initReadGrid(); + firstLoad = false; + } + } + }); + initTaskGrid(); + initBaseInfoForm(); +//----------------------------------------------------------------------- + function initTaskGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '任务名称', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + queryParams: {type: 0}, + defaultSortField: 'applytime', + }); + } + + function initReadGrid() { + //初始化搜索框 + $('#searchbox1').uiSearchbox({ + width: 240, + prompt: '任务名称', + searcher: function (v) { + grid1.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid1.uiGrid({ + url: listUrl, + queryParams: {type: 1}, + defaultSortField: 'applytime', + }); + } + + function initBaseInfoForm() { + dialogApply.uiDialog({ + title: '查看', + width: dialogSize.width, + height:dialogSize.height, + showBtnBar:false, + maximized: true, + onOpen: function () { + var dialogP = dialogApply.uiDialog('getUserParam'); + var type = dialogP.type; + var selGrid; + if(type==0){ + selGrid=grid; + }else{ + selGrid=grid1; + } + form_apply.uiForm('load',$.extend({},selGrid.uiGrid('selectedData')[0],{type:type})); + }, + onPanelResize:function () { + divApplyIframeAutoSize(); + } + }); + + form_apply.uiForm({ + template: 'form_apply_temp', + onLoadSuccess: function (data) { + divApplyIframeAutoSize(); + } + }); + function divApplyIframeAutoSize() { + var height = dialogApply.uiPanel("content").height(); + $("#divApplyIframe").height(height-64); + } + } +//----------------------------------------------------------------------- + +}); +template.helper('userTimeFilter', function (value) { + var time=Math.round(value/(1000*60*60)); + return time; +}); +//查看 +function viewRow(id, type) { + var dialog = $('#dialogApply'); + dialog.uiDialog('setUserParam', {type: type}); + dialog.uiDialog('open'); + var title="未完成申请"; + if (type == 1) { + title="已完成申请"; + } + dialog.uiDialog('title').html(title); + +} \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/task/myTask.js b/asset/js/cetc54/jcdp/task/myTask.js new file mode 100644 index 0000000..177d7a3 --- /dev/null +++ b/asset/js/cetc54/jcdp/task/myTask.js @@ -0,0 +1,109 @@ +/** + * Created by Administrator on 2017/7/26. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/Task/'; +var deleteUrl = rootUrl + "delete"; +$(function () { + var firstLoad = true; + var listUrl = rootUrl + "tasklist"; + var changeStatus = rootUrl + "changeMsgStatus"; + var dialogSize = {width: 540, height: '80%'};//弹出窗口大小 +//----------------------------------------------------------------------- + var grid = $('#grid'); + var grid1 = $('#grid1'); + var dialogTask = $('#dialogTask'); + var form_task = $('#form_task'); + + var tab = $('#tabForm').uiTabs({ + onSelect: function (id, index) { + if (id == "modifyPass" && firstLoad) { + initReadGrid(); + firstLoad = false; + } + } + }); + initTaskGrid(); + initBaseInfoForm(); +//----------------------------------------------------------------------- + function initTaskGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '任务名称', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + queryParams: {type: 0}, + defaultSortField: 'tl.applytime', + }); + } + + function initReadGrid() { + //初始化搜索框 + $('#searchbox1').uiSearchbox({ + width: 240, + prompt: '任务名称', + searcher: function (v) { + grid1.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid1.uiGrid({ + url: listUrl, + queryParams: {type: 1}, + defaultSortField: 'tl.applytime', + }); + } + + function initBaseInfoForm() { + dialogTask.uiDialog({ + title: '查看', + width: dialogSize.width, + height: dialogSize.height, + showBtnBar:false, + maximized: true, + onOpen: function () { + var dialogP = dialogTask.uiDialog('getUserParam'); + var type = dialogP.type; + var selGrid; + if (type == 0) { + selGrid = grid; + } else { + selGrid = grid1; + } + form_task.uiForm('load', selGrid.uiGrid('selectedData')[0]); + }, + onPanelResize:function () { + divTaskIframeAutoSize(); + } + }); + + form_task.uiForm({ + template: 'form_task_temp', + onLoadSuccess: function (data) { + divTaskIframeAutoSize(); + } + }); + function divTaskIframeAutoSize() { + var height = dialogTask.uiPanel("content").height(); + $("#divTaskIframe").height(height-64); + } + } +//----------------------------------------------------------------------- +}); +//查看 +function viewRow(id, type) { + var dialog = $('#dialogTask'); + dialog.uiDialog('setUserParam', {type: type}); + dialog.uiDialog('open'); + var title="待办任务"; + if (type == 1) { + title="已完成任务"; + } + dialog.uiDialog('title').html(title); +} \ No newline at end of file diff --git a/asset/js/cetc54/jcdp/toolkit/icon.js b/asset/js/cetc54/jcdp/toolkit/icon.js new file mode 100644 index 0000000..9d9459a --- /dev/null +++ b/asset/js/cetc54/jcdp/toolkit/icon.js @@ -0,0 +1,81 @@ +/** + * Created by jinxs on 2016.06.07. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/toolkit/icon/'; +$(function () { + var getIconUrl = rootUrl + 'getIcon'; + var divList = $('#divList'); + var btnIcon16 = $('#btnIcon16'); + var btnIcon32 = $('#btnIcon32'); + var txtIcon = $('#txtIcon'); + var searchbox=$('#searchbox') + var pageSet=$('#pageSet'); + var layout = $('#layout').uiLayout(); + var selected=16; + searchbox.uiSearchbox({ + prompt: '名称', + searcher: function (v) { + getIconList(selected,1,100,$.trim(v)); + } + }); + addEvents(); + divList.autoFit(true,false); + btnIcon16.click(); + //-------------------------------------方法-------------------------------------------------------- + function addEvents() { + btnIcon16.bind('click', function () { + var key=searchbox.uiSearchbox('getValue'); + getIconList(16,1,100,key); + selected=16; + }); + btnIcon32.bind('click', function () { + var key=searchbox.uiSearchbox('getValue'); + getIconList(32,1,100,key); + selected=32; + }); + pageSet.uiPagination({ + pageSize: 100, + pageIndex: 1, + pageList: [100, 200, 300, 500], + onSelectPage: function (pageIndex, pageSize) { + var key=searchbox.uiSearchbox('getValue'); + getIconList(selected,pageIndex,pageSize,key); + }, + onRefresh: function (pageIndex, pageSize) { + var key=searchbox.uiSearchbox('getValue'); + getIconList(selected,pageIndex,pageSize,key); + }, + onChangePageSize: function (pageSize) { + var key=searchbox.uiSearchbox('getValue'); + getIconList(selected,1,pageSize,key); + } + }); + } + + function getIconList(iconSize,pageIndex,pageSize,key) { + $.ajax({ + type: 'post', + url: getIconUrl, + data: {iconSize: iconSize,pageIndex:pageIndex,pageSize:pageSize,key:key}, + success: function (result) { + if (result.success) { + var data = result.data; + var html = template('listTemp', data); + divList.html(html); + $('#iconCount').html(data.total); + divList.find('button').each(function (index, domEle) { + var btn = $(domEle); + var config = btn.parseUIConfig(); + btn.config=config; + btn.bind('click', function () { + var cfg=btn.config; + txtIcon.val(cfg.iconname); + }); + }); + pageSet.uiPagination('refresh',{total:data.total,pageIndex:pageIndex,pageSize:pageSize}); + } + } + }); + } +}); \ No newline at end of file diff --git a/asset/js/cetc54/module/module.js b/asset/js/cetc54/module/module.js new file mode 100644 index 0000000..1c794d3 --- /dev/null +++ b/asset/js/cetc54/module/module.js @@ -0,0 +1,357 @@ +/** + * Created by jinxs on 2016.06.23. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/module/module/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +var pageTreeBaseUrl = rootUrl + 'getCActionTreeJson'; +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + var loadFormUrl = rootUrl + 'get/';//加载表单数据地址 + var menuUrl = rootUrl + 'getModuleList'; + var controllerList = rootUrl + 'controllerList'; + var updateModuleUrl=rootUrl+'updateAllModule'; + var dialogSize = {width: 540, height: '80%'};//弹出窗口大小 + var dialog = $('#dialog'); + var layout = $('#layout'); + var menu = $("#ulMenu"); + var pageTree = $("#pageTree"); + var grid = $('#grid'); + var grid_form = $('#grid_form'); + var cbIsShowAll = $('#cbIsShowAll'); + var btnUpdateModule=$('#btnUpdateModule'); + var selectedNode;//选中的节点 + var op = '';//用于表单中树的操作 + var setting = { + data: { + simpleData: { + enable: true, + pIdKey: 'parent_id', + rootPid: 'root' + } + }, + view: { + selectedMulti: false, + showLine: true + }, + async: { + enable: true, + url: menuUrl + }, + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载模块目录失败!" + errorThrown); + }, + onAsyncSuccess: function (event, treeId, treeNode, msg) { + zTree.expandAll(true); + if (selectedNode && selectedNode != null) { + var node = zTree.getNodeByParam("id", selectedNode.id); + zTree.selectNode(node); + }else { + selectedNode=zTree.getNodeByTId('root_1'); + zTree.selectNode(selectedNode); + } + selectLeftModuleNode(); + }, + onClick: function (event, treeId, treeNode) { + selectedNode = zTree.getSelectedNodes()[0]; + selectLeftModuleNode(); + } + } + }; + var form_setting = $.extend({}, setting, { + callback: { + onClick: function (event, treeId, treeNode) { + $('#parent_id').uiCombo('setValue', treeNode.id).uiCombo('setText', treeNode.name).uiCombo('hidePanel'); + } + } + }); +//-----------------------初始化-------------------------------------- + layout.uiLayout(); + $.fn.zTree.init(menu, setting); + var zTree = $.fn.zTree.getZTreeObj("ulMenu"); + loadControllerList(); + initGrid(); + initForm(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function selectLeftModuleNode(){ + grid.uiGrid('loadData', { + url: listUrl, + queryParams: { + pid: selectedNode.id, + cascade_id: selectedNode.cascade_id, + iscascade: cbIsShowAll.is(':checked') + }, + pageIndex: 1 + }); + } + function initGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + prompt: '模块名称', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + defaultSortField:'cascade_id' + }); + } + + function initForm() { + + dialog.uiDialog({ + width: dialogSize.width, + height: dialogSize.height, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + grid_form.uiForm('load'); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + param.id = $('#hdID').val(); + param.parent_name = $('#parent_id').uiCombo('getText'); + var parentid = $('#parent_id').uiCombo('getValue'); + if (parentid == param.id) { + showResult(false, '上级菜单不允许选择当前菜单'); + return false; + } + var isValid = $('#grid_form').uiForm('validate'); + + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + zTree.reAsyncChildNodes(null, 'refresh'); + dialog.uiDialog('close'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function () { + var me = $(this); + $('#is_auto_expand').uiCombobox(); + $('#status').uiCombobox(); + $('#display').uiCombobox(); + $('#moduletype').uiCombobox(); + $('#parent_id').uiCombo(); + $('#name').uiCombo(); + $.fn.zTree.init($('#pn_tree'), form_setting, zTree.getNodes()); + $.fn.zTree.getZTreeObj("pn_tree").expandAll(true); + $('#parent_id').uiCombo('panel').html($('#pn_tree').show()); + $('#name_panel').removeClass('hide-away').appendTo($('#name').uiCombo('panel')); + + + switch (op) { + case 'view': + parentTree_view(); + me.uiForm('setReadonly', true); + break; + case 'edit': + parentTree_view(); + break; + case 'add': + parentTree_add(); + me.uiForm('setReadonly', false); + break; + default : + break; + } + function parentTree_add() { + if (selectedNode && selectedNode != null) { + $('#parent_id').uiCombo('setValue', selectedNode.id).uiCombo('setText', selectedNode.name); + } + } + + function parentTree_view() { + var data = grid.uiGrid('selectedData')[0]; + $('#parent_id').uiCombo('setValue', data.parent_id).uiCombo('setText', data.parent_name); + $('#name').uiCombo('setValue', data.name).uiCombo('setText', data.name); + } + } + }); + } + + function addEvents() { + //新建 + $('#btn1').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新增功能模块').show(); + }); + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + cbIsShowAll.bind('click', function () { + var selectedNode = zTree.getSelectedNodes()[0]; + if (selectedNode) { + grid.uiGrid('loadData', { + url: listUrl, + queryParams: { + pid: selectedNode.id, + cascade_id: selectedNode.cascade_id, + iscascade: cbIsShowAll.is(':checked') + }, + pageIndex: 1 + }); + } + }); + btnUpdateModule.bind('click', function () { + $.ajax({ + type: 'post', + url: updateModuleUrl + }); + }); + } + + function loadControllerList() { + $.ajax({ + type: 'post', + url: controllerList, + showLoading:false, + success: function (result) { + $('#grid_controller').uiGrid({ + localData: result.data + }); + }, + error: function () { + showResult(false, '获取Action列表失败!', 'error'); + return false; + } + }); + } +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + title = '-' + title || ''; + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('button', 'btnOK').hide(); + dialog.uiDialog('title').html('查看' + title); +} + +//编辑 +function editRow(id,title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑-'+title).show(); +} + +// 删除 +function deleteRow(id) { + deleteData("此操作将其子节点一起删除,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $.fn.zTree.getZTreeObj("ulMenu").reAsyncChildNodes(null, 'refresh'); + } + }); +} + + +//选择action +var pageTree_setting = { + data: { + simpleData: { + enable: true, + pIdKey: 'parent_id', + } + }, + view: { + selectedMulti: false, + showLine: true + }, + async: { + enable: true, + url: pageTreeBaseUrl + }, + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载模块页面与数据信息失败!" + errorThrown); + }, + onAsyncSuccess: function (event, treeId, treeNode, msg) { + var tree = $.fn.zTree.getZTreeObj("pageTree"); + tree.expandAll(true); + } + } +}; +function selectRow(displayName, url) { + $('#name').uiCombo('setValue', displayName).uiCombo('setText', displayName).uiCombo('hidePanel'); + $('#href').val(url); + $('#moduletype').uiCombobox('setValue',1); + $('#divPageTree').show(); + pageTree_setting.async.otherParam = {path: url}; + $.fn.zTree.init($('#pageTree'), pageTree_setting); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/parameter/category.js b/asset/js/cetc54/parameter/category.js new file mode 100644 index 0000000..d2f2bdf --- /dev/null +++ b/asset/js/cetc54/parameter/category.js @@ -0,0 +1,181 @@ +/** + * Created by jinxs on 2016.06.23. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/dict/category/'; +$(function () { + //------------------------属性------------------------------ + var saveUrl = rootUrl + 'save'; + var menuUrl = rootUrl + 'list'; + var deleteUrl = rootUrl + 'delete'; + var layout = $('#layout'); + var menu = $("#ulMenu"); + var grid_form = $('#grid_form'); + var selectedNode;//选中的节点 + var $notice; + var setting = { + data: { + simpleData: { + enable: true, + pIdKey: 'pid', + rootPid: '' + } + }, + view: { + selectedMulti: false, + showLine: true + }, + async: { + enable: true, + url: menuUrl, + autoParam: ["code"] + }, + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载项目目录失败!" + errorThrown); + }, + onAsyncSuccess: function (event, treeId, treeNode, msg) { + zTree.expandAll(true); + if (selectedNode) { + selectedNode = zTree.getNodeByParam("id", selectedNode.id, null); + zTree.selectNode(selectedNode); + } + }, + onClick: function (event, treeId, treeNode) { + selectedNode = treeNode; + $('#id').val(treeNode.id); + $('#name').val(treeNode.name); + $('#pid').val(treeNode.pid); + $('#iconname').val(treeNode.iconname); + $('#code').val(treeNode.code); + var categorytype=$('#categorytype'); + pNode=treeNode.getParentNode(); + if(pNode!=null&&pNode.pid!=null){ + categorytype.uiCombobox("setReadonly",true); + }else { + categorytype.uiCombobox("setReadonly",false); + } + categorytype.uiCombobox("setValue",treeNode.categorytype); + $('#codeRow').toggle(treeNode.getParentNode() == null); + $('#typeRow').toggle(treeNode.getParentNode() != null); + $notice.text('编辑结点[' + treeNode.name + ']'); + } + } + }; + var form_setting = $.extend({}, setting, { + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载项目目录失败!" + errorThrown); + }, + beforeClick: function (treeId, treeNode, clickFlag) { + }, + onClick: function (event, treeId, treeNode) { + $('#parent_id').uiCombo('setValue', treeNode.id).uiCombo('setText', treeNode.name).uiCombo('hidePanel'); + } + } + }); +//-----------------------初始化-------------------------------------- + layout.uiLayout(); + $.fn.zTree.init(menu, setting); + var zTree = $.fn.zTree.getZTreeObj("ulMenu"); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function () { + $notice = $("#notice"); + var categorytype = $('#categorytype'); + categorytype.uiCombobox({ + width: 400 + }); + $('#typeRow').hide(); + } + }).uiForm("load"); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function addEvents() { + //新建 + $('#btnAdd').uiButton({ + onClick: function () { + if(selectedNode==undefined){ + showResult(false, "请选择父节点!"); + return; + } + grid_form.each(function () { + this.reset(); + $('#pid').val(selectedNode.id); + $('#code').val(selectedNode.code); + $('#id').val(''); + if(selectedNode.pid!=null){ + var categorytype = $('#categorytype'); + categorytype.uiCombobox("setValue",selectedNode.categorytype); + categorytype.uiCombobox("setReadonly",true); + } + }); + $("#name").focus(); + $('#codeRow').hide(); + $('#typeRow').show(); + $notice.text('新增结点至[' + selectedNode.name + ']'); + } + }); + $('#btnSave').uiButton({ + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + // 返回false终止表单提交 + return $('#grid_form').uiForm('validate'); + }, + success: function (result) { + if (result.success) { + var pNode = null; + + if (selectedNode) { + pNode = selectedNode.getParentNode(); + } + grid_form.uiForm('reset'); + zTree.reAsyncChildNodes(pNode, 'refresh'); + } + showResult(result.success, result.message); + } + }); + } + }); + //删除 + $('#btnDelete').uiButton({ + onClick: function () { + deleteData( + "确定要删除结点[" + selectedNode.name + "]及其子结点吗?", + deleteUrl, + {code: selectedNode.code}, + function (result) { + if (result.success) { + grid_form.uiForm('reset'); + zTree.reAsyncChildNodes(selectedNode.getParentNode(), 'refresh'); + } + } + ); + } + }); + } + + //删除 + function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); + } +}); diff --git a/asset/js/cetc54/parameter/dict.js b/asset/js/cetc54/parameter/dict.js new file mode 100644 index 0000000..09031ab --- /dev/null +++ b/asset/js/cetc54/parameter/dict.js @@ -0,0 +1,412 @@ +/** + * Created by jinxs on 2016.06.23. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/dict/dict/'; +var itemRoot = webroot + '/dict/dictItem/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +var deleteItemUrl = itemRoot + 'delete';//删除地址 +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var itemUrl = itemRoot + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + var saveItemUrl = itemRoot + 'save';//保存添加数据地址 + var menuUrl = webroot + '/dict/category/list?code=d&self=true'; + var dialogSize = {width: 540, height: 240};//弹出窗口大小 + var layout = $('#layout'); + var menu = $("#ulMenu"); + var grid = $('#grid'); + var itemGrid = $('#itemGrid'); + var grid_form = $('#grid_form'); + var itemForm = $('#itemForm'); + var selectedNode;//选中的节点 + var setting = { + data: { + simpleData: { + enable: true, + pIdKey: 'pid', + rootPid: 'root' + } + }, + view: { + selectedMulti: false, + showLine: true + }, + async: { + enable: true, + url: menuUrl + }, + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载项目目录失败!" + errorThrown); + }, + onAsyncSuccess: function (event, treeId, treeNode, msg) { + zTree.expandAll(true); + }, + onClick: function (event, treeId, treeNode) { + selectedNode = treeNode; + grid.uiGrid('loadData', {queryParams: {category: selectedNode.id}, pageIndex: 1}); + itemGrid.uiGrid('setData', []); + } + } + }; + var form_setting = $.extend({}, setting, { + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载项目目录失败!" + errorThrown); + }, + beforeClick: function (treeId, treeNode, clickFlag) { + }, + onClick: function (event, treeId, treeNode) { + $('#category').uiCombo('setValue', treeNode.id).uiCombo('setText', treeNode.name).uiCombo('hidePanel'); + } + } + }); +//-----------------------初始化-------------------------------------- + layout.uiLayout(); + $('#contentPanel').uiLayout(); + $.fn.zTree.init(menu, setting); + var zTree = $.fn.zTree.getZTreeObj("ulMenu"); + //初始化搜索框 + $('#searchbox').uiSearchbox({ + prompt: '字典名称|标识', + searcher: function (v) { + grid.uiGrid('loadData', { + queryParams: { + key: $.trim(v), + category: selectedNode.id + }, + pageIndex: 1 + }); + } + }); + $('#itemSBox').uiSearchbox({ + prompt: '项目名称|值', + searcher: function (v) { + var dictIds = grid.uiGrid('selectedData', 'id'); + if(dictIds.length > 0) { + itemGrid.uiGrid('loadData', { + queryParams: { + key: $.trim(v), + dictId: dictIds[0] + }, + pageIndex: 1 + }); + } + } + }); + + //初始化grid + grid.uiGrid({ + url: listUrl, + defaultSortField:'keykey', + onSelectRow:function(){ + var dictIds = grid.uiGrid('selectedData', 'id'); + + if(dictIds.length > 0) { + itemGrid.uiGrid('loadData', { + queryParams: { + dictId: dictIds[0] + }, + pageIndex: 1 + }); + } + } + }); + itemGrid.uiGrid({ + url: itemUrl + }); + var dialog = $('#dialog').uiDialog({ + title: '新建', + width: dialogSize.width, + height: dialogSize.height, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + + switch (dialogP.action) { + case 'view': + case 'edit': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + grid_form.uiForm('load'); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + return this.uiForm('validate'); // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog.uiDialog('close'); + grid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + var itemDialog = $('#itemDialog').uiDialog({ + title: '新建', + width: dialogSize.width, + height: dialogSize.height, + onOpen: function () { + var dialogP = $('#itemDialog').uiDialog('getUserParam'); + + switch (dialogP.action) { + case 'view': + case 'edit': + itemForm.uiForm('load', itemGrid.uiGrid('selectedData')[0]); + break; + case 'add': + itemForm.uiForm('load',{status:1}); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#itemForm').uiForm('submit', { + url: saveItemUrl, + onSubmit: function (param) { + return this.uiForm('validate'); // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + itemDialog.uiDialog('close'); + itemGrid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + itemDialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function () { + var me = $(this); + var cg = $('#category').uiCombobox(); + var dialogP = $('#dialog').uiDialog('getUserParam'); + + $('#pn_panel').appendTo(cg.uiCombo('panel')); + $.fn.zTree.init($('#pn_tree'), form_setting, zTree.getNodes()); + $.fn.zTree.getZTreeObj("pn_tree").expandAll(true); + + switch (dialogP.action) { + case 'view': + parentTree_view(); + me.uiForm('setReadonly', true); + break; + case 'edit': + parentTree_view(); + break; + case 'add': + parentTree_add(); + me.uiForm('setReadonly', false); + break; + default : + break; + } + function parentTree_add() { + if (selectedNode && selectedNode != null) { + $('#category').uiCombo('setValue', selectedNode.id).uiCombo('setText', selectedNode.name); + } + } + + function parentTree_view() { + var data = grid.uiGrid('selectedData')[0]; + $('#category').uiCombo('setValue', data.category).uiCombo('setText', data.categoryname); + } + } + }); + itemForm.uiForm({ + template: 'grid_form_item', + onLoadSuccess: function () { + var me = $(this); + var dialogP = itemDialog.uiDialog('getUserParam'); + + $('#status').dictCombobox(); + switch (dialogP.action) { + case 'view': + me.uiForm('setReadonly', true); + break; + case 'edit': + break; + case 'add': + $('#dictId').val(dialogP.id); + me.uiForm('setReadonly', false); + break; + default : + break; + } + } + }); + template.helper('statusFilter', function(value){ + return {0:'停用',1:'启用'}[value]||value; + }); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function addEvents() { + //新建 + $('#btn1').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新增字典'); + }); + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + //新建 + $('#btnAddItem').bind('click', function () { + var dictIds = grid.uiGrid('selectedData', 'id'); + + if(dictIds.length==0){ + showResult(false, '请先选择字典!'); + return; + } + itemDialog.uiDialog('setUserParam', {action: 'add', id: dictIds[0]}); + itemDialog.uiDialog('button', 'btnOK').show(); + itemDialog.uiDialog('open'); + itemDialog.uiDialog('title').html('新增项目'); + }); + //删除 + $('#btnDeleteItem').bind('click', function () { + var ids = itemGrid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteItem(ids); + } + }); + } +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + title = '-' + title || ''; + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('button', 'btnOK').hide(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('查看' + title); +} +//查看 +function viewItem(id, title) { + var dialog = $('#itemDialog'); + title = '-' + title || ''; + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('button', 'btnOK').hide(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('查看' + title); +} + +//编辑 +function editRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑-'+title); +} +//编辑 +function editItem(id, title) { + var dialog = $('#itemDialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑-'+title); +} + +// 删除 +function deleteRow(ids) { + deleteData("确定要删除所选信息吗?", deleteUrl, {ids: ids}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + $('#itemGrid').uiGrid('loadData',[]); + } + }); +} + +// 删除 +function deleteItem(ids) { + deleteData("确定要删除所选信息吗?", deleteItemUrl, {ids: ids}, function (result) { + if (result.success) { + $('#itemGrid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/parameter/parameter.js b/asset/js/cetc54/parameter/parameter.js new file mode 100644 index 0000000..846fa79 --- /dev/null +++ b/asset/js/cetc54/parameter/parameter.js @@ -0,0 +1,249 @@ +/** + * Created by jinxs on 2016.06.23. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/dict/SysParameter/'; +var deleteUrl = rootUrl + 'delete';//删除地址 +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + var menuUrl = webroot + '/dict/category/list?code=p&self=true'; + var dialogSize = {width: 540, height: 300};//弹出窗口大小 + var layout = $('#layout'); + var menu = $("#ulMenu"); + var grid = $('#grid'); + var grid_form = $('#grid_form'); + var selectedNode;//选中的节点 + var op = '';//用于表单中树的操作 + var setting = { + data: { + simpleData: { + enable: true, + pIdKey: 'pid', + rootPid: 'root' + } + }, + view: { + selectedMulti: false, + showLine: true + }, + async: { + enable: true, + url: menuUrl + }, + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载项目目录失败!" + errorThrown); + }, + onAsyncSuccess: function (event, treeId, treeNode, msg) { + zTree.expandAll(true); + if (selectedNode) { + grid.uiGrid('loadData', {url: listUrl, queryParams: {category: selectedNode.id}, pageIndex: 1}); + } else { + grid.uiGrid('loadData', {url: listUrl, pageIndex: 1}); + } + }, + onClick: function (event, treeId, treeNode) { + selectedNode = treeNode; + grid.uiGrid('loadData', {queryParams: {category: selectedNode.id}, pageIndex: 1}); + } + } + }; + var form_setting = $.extend({}, setting, { + callback: { + onAsyncError: function (event, treeId, treeNode, XMLHttpRequest, textStatus, errorThrown) { + alert("加载项目目录失败!" + errorThrown); + }, + beforeClick: function (treeId, treeNode, clickFlag) { + }, + onClick: function (event, treeId, treeNode) { + $('#category').uiCombo('setValue', treeNode.id).uiCombo('setText', treeNode.name).uiCombo('hidePanel'); + } + } + }); +//-----------------------初始化-------------------------------------- + layout.uiLayout(); + $.fn.zTree.init(menu, setting); + var zTree = $.fn.zTree.getZTreeObj("ulMenu"); + //初始化搜索框 + $('#searchbox').uiSearchbox({ + prompt: '参数名称|键|值', + searcher: function (v) { + grid.uiGrid('loadData', { + queryParams: { + key: $.trim(v), + category: selectedNode.id + }, + pageIndex: 1 + }); + } + }); + + //初始化grid + grid.uiGrid({ + colFit: false + }); + var dialog = $('#dialog').uiDialog({ + title: '新建', + width: dialogSize.width, + height: dialogSize.height, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + grid_form.uiForm('load'); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + return this.uiForm('validate'); // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog.uiDialog('close'); + grid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function () { + var me = $(this); + var cg = $('#category').uiCombobox(); + + $('#pn_panel').appendTo(cg.uiCombo('panel')); + $.fn.zTree.init($('#pn_tree'), form_setting, zTree.getNodes()); + $.fn.zTree.getZTreeObj("pn_tree").expandAll(true); + + switch (op) { + case 'view': + parentTree_view(); + me.uiForm('setReadonly', true); + break; + case 'edit': + parentTree_view(); + break; + case 'add': + parentTree_add(); + me.uiForm('setReadonly', false); + break; + default : + break; + } + function parentTree_add() { + if (selectedNode && selectedNode != null) { + $('#category').uiCombo('setValue', selectedNode.id).uiCombo('setText', selectedNode.name); + } + } + + function parentTree_view() { + var data = grid.uiGrid('selectedData')[0]; + $('#category').uiCombo('setValue', data.category).uiCombo('setText', data.categoryname); + } + } + }); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function addEvents() { + //新建 + $('#btn1').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新增参数'); + }); + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + } +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + title = '-' + title || ''; + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('button', 'btnOK').hide(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('查看' + title); +} + +//编辑 +function editRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑-'+title); +} + +// 删除 +function deleteRow(ids) { + deleteData("确定要删除所选信息吗?", deleteUrl, {ids: ids}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/personalcenter/mylaunch.js b/asset/js/cetc54/personalcenter/mylaunch.js new file mode 100644 index 0000000..3bdccc1 --- /dev/null +++ b/asset/js/cetc54/personalcenter/mylaunch.js @@ -0,0 +1,92 @@ +/** + * Created by Administrator on 2017/7/26. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/personalcenter/mylaunch/'; + +$(function () { + var firstLoad = true; + var listUrl = rootUrl + "list"; + var dialogSize = {width: 540, height: '80%'};//弹出窗口大小 +//----------------------------------------------------------------------- + var grid = $('#grid'); + var dialogTask = $('#dialogTask'); + var form_task = $('#form_task'); + + var tab = $('#tabForm').uiTabs({ + onSelect: function (id, index) { + if (id == "modifyPass" && firstLoad) { + initReadGrid(); + firstLoad = false; + } + } + }); + initTaskGrid(); + initBaseInfoForm(); +//----------------------------------------------------------------------- + function initTaskGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '任务名称', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl + }); + } + + function initReadGrid() { + + } + + function initBaseInfoForm() { + dialogTask.uiDialog({ + title: '查看', + width: dialogSize.width, + height: dialogSize.height, + showBtnBar:false, + maximized: true, + onOpen: function () { + var dialogP = dialogTask.uiDialog('getUserParam'); + var type = dialogP.type; + var selGrid; + if (type == 0) { + selGrid = grid; + } else { + selGrid = grid1; + } + form_task.uiForm('load', selGrid.uiGrid('selectedData')[0]); + }, + onPanelResize:function () { + divTaskIframeAutoSize(); + } + }); + + form_task.uiForm({ + template: 'form_task_temp', + onLoadSuccess: function (data) { + divTaskIframeAutoSize(); + } + }); + function divTaskIframeAutoSize() { + var height = dialogTask.uiPanel("content").height(); + $("#divTaskIframe").height(height-64); + } + } +//----------------------------------------------------------------------- +}); +//查看 +function viewRow(id, type) { + var dialog = $('#dialogTask'); + dialog.uiDialog('setUserParam', {type: type}); + dialog.uiDialog('open'); + var title="发起任务"; + if (type == 1) { + title="已完成任务"; + } + dialog.uiDialog('title').html(title); +} \ No newline at end of file diff --git a/asset/js/cetc54/personalcenter/mymanage.js b/asset/js/cetc54/personalcenter/mymanage.js new file mode 100644 index 0000000..4175935 --- /dev/null +++ b/asset/js/cetc54/personalcenter/mymanage.js @@ -0,0 +1,158 @@ +//我的经办 +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/personalcenter/mymanage/'; +var spjlPage= webroot + '/train/trainsp/';//审批记录查看页 +var dialog_spjl = $('#dialog_spjl');//审批记录框 +// 状态对应描述 +var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'待主管院领导审批'},{"status":3,"zt":'审批完成'},{"status":-1,"zt":'驳回'}]; + +$(function () { + var listUrl = rootUrl + 'list';//分页数据地址 + + var grid = $('#grid'); + + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '申请单位', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + + //初始化grid + grid.uiGrid({ + url: listUrl, + defaultSortField: 'spdate' + }); + + //审批结果标识 + template.helper('spresultFilter',function(value){ + var result = "驳回"; + if(value=="1") return "通过"; + return result; + + }); + + //审批记录查看 + var formspInit = function () { + $('#grid_spjlform').uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (result) { + var dialogP = $('#dialog_spjl').uiDialog('getUserParam'); + var id = dialogP.id; + var tid = dialogP.tid; + var tname = dialogP.tname; + if(tname === 'et_train_gipgroup'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'审批完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_gop'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'待院级管理员审核'}, + {"status":3,"zt":'待部门主管院领导审核'},{"status":4,"zt":'待人力资源部领导审核'},{"status":5,"zt":'审核完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_ipgroup'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'审批完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_gip_bg'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'待院级管理员审批'},{"status":3,"zt":'审批完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_ipf_bg'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'待主管院领导审批'},{"status":3,"zt":'审批完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_ysgroup'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'待院级管理员确认'},{"status":3,"zt":'审批完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_ysistgroup'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'待院级管理员确认'},{"status":3,"zt":'审批完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_ot'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'待院级管理员审核'}, + {"status":3,"zt":'待部门主管院领导审核'},{"status":4,"zt":'待人力资源部领导审核'},{"status":5,"zt":'审核完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_ot_pxdj'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'部门领导审批通过'},{"status":3,"zt":'待院级管理员审核'}, + {"status":4,"zt":'审核完成'},{"status":-1,"zt":'驳回'}]; + }else if(tname === 'et_train_ot_del'){ + var statusarr=[{"status":0,"zt":'未提交'},{"status":1,"zt":'待部门领导审批'},{"status":2,"zt":'待院级管理员审核'}, + {"status":3,"zt":'审核完成'},{"status":-1,"zt":'驳回'}]; + } + + //审批状态标识 + template.helper('spresultFilter',function(value){ + var result = "驳回"; + if(value=="1") return "通过"; + return result; + }); + + //业务状态标识 + template.helper('ywstatusFilter',function(value){ + var result = "数据异常"; + for(var i=0;i'; + // return text; + // }; + // } +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + +} + +//编辑 +function editRow(id) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('button', 'btnOK').show(); +} + +// 删除 +function deleteRow(id) { + deleteData("此操作将删除任职资格信息,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/qualification/qualificationjob.js b/asset/js/cetc54/qualification/qualificationjob.js new file mode 100644 index 0000000..4b5c844 --- /dev/null +++ b/asset/js/cetc54/qualification/qualificationjob.js @@ -0,0 +1,234 @@ +/** + * Created by jinxs on 2016.07.06. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/qualification/qualificationjob/'; +var deleteUrl = rootUrl + 'delete';//删除地址 + + +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + var dialogSize = {width: '95%', height: '95%'};//弹出窗口大小 + + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var grid = $('#grid'); + + // var departmentComboxUrl = webroot + '/exam/exampaper/'+'departmentCombox';//部门下拉框 + +//-----------------------初始化-------------------------------------- + initGroupsGrid(); + initGroupsForm(); + // addFilter(); + addEvents(); + +//-------------------------------------方法-------------------------------------------------------- + function initGroupsGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '课程序列|战术培训名称|级别', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + // localData:{rows:[ + // {id: '1',kcxl:'管理',zsmc:'系统生产',level:'中级',pxkc:'1.拓展训练\n2.商务礼仪培训\n3.保密安全培训\n4.PDM培训\n5.质量管理系统使用培训\n6.信息化系统培训\n7.项目管理培训',zsyq:'可靠性工程技术培训' }, + // + // {id: '2',kcxl:'管理',zsmc:'系统生产',level:'高级',pxkc:'1.拓展训练\n2.商务礼仪培训\n3.保密安全培训\n4.PDM培训\n5.质量管理系统使用培训\n6.信息化系统培训\n7.项目管理培训',zsyq:'可靠性工程技术培训\n项目管理培训' }, + // {id: '3',kcxl:'管理',zsmc:'系统生产',level:'资深',pxkc:'1.拓展训练\n2.商务礼仪培训\n3.保密安全培训\n4.PDM培训\n5.质量管理系统使用培训\n6.信息化系统培训\n7.项目管理培训',zsyq:'可靠性工程技术培训\n项目管理培训' }]}, + + defaultSortField: 'zsmc' + }); + } + + function initGroupsForm() { + dialog.uiDialog({ + title: '新建', + width: dialogSize.width, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + op = dialogP.action; + var id = dialogP.id; + switch (op) { + case 'view': + case 'edit': + grid_form.uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'add': + var roleType = 0; + grid_form.uiForm('load', {}); + break; + default : + break; + } + + + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_submit'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (param) { + param.kcxl = $('#kcxl').uiCombo('getValue'); + + param.id = $('#hdID').val(); + var isValid = $('#grid_form').uiForm('validate'); + + return isValid; // 返回false终止表单提交 + }, + success: function (result) { + if (result.success) { + dialog.uiDialog('close'); + grid.uiGrid('loadData'); + } + showResult(result.success, result.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '关闭', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + grid_form.uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (data) { + var me = $(this); + switch (op) { + case 'view': + me.uiForm('setReadonly', true); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + + $('#kcxl').uiCombobox({ + + }); + $('#level').uiCombobox({ + + }); + + // $('#kcxl').uiCombobox({ + // mode: "remote", + // url: departmentComboxUrl + // }); + } + }); + + + } + + function addEvents() { + //新建 + $('#btn1').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新增岗位体系信息'); + }); + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + + } + // + // function addFilter() { + // template.defaults.imports.statusFilter = function (value) { + // var text = gridColFilter('isenable', value); + // var span = ''; + // break; + // case 0: + // span += 'danger">'; + // break; + // } + // text = span + text + ''; + // return text; + // }; + // } +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '-' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + +} + +//编辑 +function editRow(id) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('button', 'btnOK').show(); +} + +// 删除 +function deleteRow(id) { + deleteData("此操作将删除岗位体系信息,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/research/research_project_exam_main.js b/asset/js/cetc54/research/research_project_exam_main.js new file mode 100644 index 0000000..fcb733a --- /dev/null +++ b/asset/js/cetc54/research/research_project_exam_main.js @@ -0,0 +1,652 @@ +/** + * Created by jinxs on 2016.07.06. + */ +var webroot = $("#hdWebroot").val(); +var rootUrl = webroot + '/research/research/'; +var deleteUrl = rootUrl + 'delete';//删除地址 + +var editPage= rootUrl + 'editexamPage';//编辑页面地址 +var loadFormUrl = rootUrl + 'getById?id=';//加载表单数据地址 +var addusersPage= rootUrl + 'addusersPage';//编辑页面地址 +var addexamPage= rootUrl + 'addexamPage';//编辑页面地址 +var addksPage= rootUrl + 'addksPage';//编辑页面地址 +var exportksPage= rootUrl + 'exportksPage';//编辑页面地址 +var ksresultPage= rootUrl + 'ksresultPage';//编辑页面地址 + +var comboxUrl=rootUrl+ 'combox';//下拉框 +//var researchExamUrl=rootUrl+ 'researchExam';//制作调查问卷 + +$(function () { + //------------------------属性------------------------------------- + var listUrl = rootUrl + 'list';//分页数据地址 + var saveUrl = rootUrl + 'save';//保存添加数据地址 + var dialogSize = {width: 540, height: '80%'};//弹出窗口大小 + + var dialog = $('#dialog'); + var grid_form = $('#grid_form'); + + var grid = $('#grid'); + + + function comboxLoad(param, success, error) { + var opts = $(this).uiCombobox('options'); + if (!opts.url) return false; + $.ajax({ + type: opts.method, + url: opts.url, + showLoading: false, + data: param, + showAlert:false, + dataType: 'json', + success: function (result) { + if (result.success) { + success(result.data); + } + }, + error: function () { + error.apply(this, arguments); + } + }); + } + +//-----------------------初始化-------------------------------------- + initGrid(); + // addFilter(); + addEvents(); + + + +//-------------------------------------方法-------------------------------------------------------- + function initGrid() { + //初始化搜索框 + $('#searchbox').uiSearchbox({ + width: 240, + prompt: '名称', + searcher: function (v) { + grid.uiGrid('loadData', {queryParams: {key: $.trim(v)}, pageIndex: 1}); + } + }); + //初始化grid + grid.uiGrid({ + url: listUrl, + // localData:{rows:[ + // {id: '1', name: '新员工入职调研',wjmc:'2019新员工入职培训需求调查',wjsm:'各位同学:您好!为了更好的了解您对企业新员工入职培训的看法和自身需求,以便进行准确的分析,从而向企业提供更加适宜的培训方案和建议。在此,请允许我们占用您宝贵的时间完成该问卷,请仔细阅读题目,并选择您认为最合适的选项,对于您的理解和支持,我们不胜感激。我们将对你提供的信息严格保密,祝您工作愉快!',username:'宁志全',orgname:'管理信息化事业部',creater_time:'2019-01-01 11:15:10',state:'问卷未发放'}, + // {id: '2', name: '质量师培训调研',wjmc:'2019质量师培训调研',wjsm:'',username:'宁志全',orgname:'管理信息化事业部',creater_time:'2019-01-01 11:15:10',state:'问卷已发放'}, + // {id: '3', name: '主任设计师调研',wjmc:'2019主任师培训调研',wjsm:'',username:'宁志全',orgname:'管理信息化事业部',creater_time:'2019-01-01 11:15:10',state:'答题已结束'}, + // {id: '4', name: '项目管理培训调研',wjmc:'2019项目管理培训调研',wjsm:'',username:'宁志全',orgname:'管理信息化事业部',creater_time:'2019-01-01 11:15:10',state:'活动已撤销'}]}, + defaultSortField: 'id' + }); + } + + //初始化表单 + var formInit = function () { + $('#grid_form').uiForm({ + template: 'grid_form_temp', + onLoadSuccess: function (data) { + + switch ("add") { + case 'view': + // list_corp.uiGrid('toolbar').hide(); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + + //下拉框 + $('#name').uiCombobox({ + mode: 'remote', + // searchable: true, + // delay :500, + // hasDownArrow:false, + loader: comboxLoad, + url: comboxUrl + }); + } + }); + }; + + //初始化弹出窗口 + dialog = $('#dialog').uiDialog({ + title: '新建', + icon: 'list', + // width: dialogSize.width, + // height: dialogSize.height, + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: editPage, + onLoadComplete: formInit, + onOpen: function () { + var dialogP = $('#dialog').uiDialog('getUserParam'); + var id = dialogP.id; + switch (dialogP.action) { + case 'view': + // $('#grid_form').uiForm('load', loadFormUrl + id);//加载远程数据 + $('#grid_form').uiForm('load', grid.uiGrid('selectedData')[0]); + break; + case 'edit': + $('#grid_form').uiForm('load', grid.uiGrid('selectedData')[0]); + // $('#grid_form').uiForm('load', loadFormUrl+id);//加载远程数据 + break; + case 'add': + $('#grid_form').uiForm('load'); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_add'}, + disabled: false, + onClick: function () { + $('#grid_form').uiForm('submit', { + url: saveUrl, + onSubmit: function (params) { + params.id = $('#hdID').val(); + var isValid = $('#grid_form').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (data) { + dialog.uiDialog('close'); + grid.uiGrid('loadData'); + showResult(true, data.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '取消', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + dialog.uiDialog('close'); + } + } + ] + }); + + //初始化增加人员表单 + var formadduserInit = function () { + $('#grid_form2').uiForm({ + template: 'grid_form_temp2', + onLoadSuccess: function (result) { + // var div_corpList = $('#div_corpList'); + // var list_corp = $('#list_corp'); + // list_corp.css("position","static"); + // div_corpList.append(list_corp.detach()); + // // ; + // list_corp.uiGrid({ + // localData:{rows:[ + // {id: '1', name: '宁志全'}, + // {id: '2', name: '龚兴兴'}, + // {id: '3', name: '赵简'}]}, + // defaultSortField: 'id' + // }); + $('#startDate').uiDate({ + required:true, + dateFmt:'yyyy-MM-dd HH:mm', + disabled: false + }); + $('#endDate').uiDate({ + required:true, + dateFmt:'yyyy-MM-dd HH:mm', + disabled: false + }); + // list_corp.uiGrid('loadData', {queryParams: {id: id}, url: contactorlistUrl}); + switch ("add") { + case 'view': + // list_corp.uiGrid('toolbar').hide(); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + // list_corp.triggerHandler('_resize'); + } + }); + }; + + + //初始化增加人员弹出窗口 + addusers_dialog = $('#addusers_dialog').uiDialog({ + title: '新建', + icon: 'list', + // width: dialogSize.width, + // height: dialogSize.height, + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: addusersPage, + onLoadComplete: formadduserInit, + onOpen: function () { + var dialogP = $('#addusers_dialog').uiDialog('getUserParam'); + var id = dialogP.id; + switch (dialogP.action) { + case 'view': + $('#grid_form2').uiForm('load', loadFormUrl + id);//加载远程数据 + break; + case 'edit': + $('#grid_form2').uiForm('load', loadFormUrl+id);//加载远程数据 + break; + case 'add': + $('#grid_form2').uiForm('load'); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '保存', + style: 'button_submit', + icons: {left: 'icon_add'}, + disabled: false, + onClick: function () { + $('#grid_form2').uiForm('submit', { + url: saveUrl, + onSubmit: function (params) { + params.id = $('#hdID').val(); + var isValid = $('#grid_form2').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (data) { + report_dialog.uiDialog('close'); + grid.uiGrid('loadData'); + showResult(true, data.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '取消', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + addusers_dialog.uiDialog('close'); + } + } + ] + }); + + + + //初始化调研问卷管理表单——制作调查问卷 + var formaddexamInit = function () { + + var eqlist = $('#eqlist'); + + eqlist.uiGrid({ + autoFit: true, + border:false, + colFit:true, + gridTitleFix: false, + width:"100%", + height:"100%", + showHeader:false, + icon: 'list', + + //url:researchExamUrl, + localData:{rows:[ + {id: '1', tm: '您对培训讲师最基本的要求是?',qtype:'0',bd:'1',a1:'PPT演示文稿制作精致',a2:'授课形式丰富,互动性强',a3:'合理安排授课时间',a4:'幽默风趣会调动气氛',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'1'}, + {id: '2', tm: '您认为最有效的培训方式是?',qtype:'1',bd:'0',a1:'文稿制作精致',a2:'互动性强',a3:'时间',a4:'调动气氛',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'2'}, + {id: '3', tm: '您认为最有效的培训方式是?',qtype:'0',bd:'0',a1:'文稿制作精致',a2:'互动性强',a3:'时间',a4:'调动气氛',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'3'}, + {id: '4', tm: '填写段落说明-后10题为选择题',qtype:'3',bd:'-1',a1:'文稿制作精致',a2:'互动性强',a3:'时间',a4:'调动气氛',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'4'}, + {id: '5', tm: '您认为最有效的培训方式是?',qtype:'2',bd:'0',a1:'',a2:'',a3:'',a4:'',a5:'',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'5'}, + {id: '6', tm: '您认为最有效的培训方式是',qtype:'1',bd:'1',a1:'PPT',a2:'授课',a3:'合理安排',a4:'幽默',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'6'}] + ,dlcount:0 + + }, +//单选0,多选1,问答2,段落说明3, + defaultSortField: 'order' + }); + switch ("add") { + case 'view': + // list_corp.uiGrid('toolbar').hide(); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + + }; + + + //初始化调研问卷弹出窗口 + addexam_dialog = $('#addexam_dialog').uiDialog({ + title: '新建', + icon: 'list', + // width: dialogSize.width, + // height: dialogSize.height, + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: addexamPage, + onLoadComplete: formaddexamInit, + onOpen: function () { + var dialogP = $('#addexam_dialog').uiDialog('getUserParam'); + var id = dialogP.id; + switch (dialogP.action) { + case 'view': + //$('#grid_form3').uiForm('load', loadFormUrl + id);//加载远程数据 + break; + case 'edit': + //$('#grid_form3').uiForm('load', loadFormUrl+id);//加载远程数据 + break; + case 'add': + // $('#grid_form3').uiForm('load'); + break; + default : + break; + } + } + + }); + + + //初始化考试管理表单---用户答题 + var formksInit = function () { + + var eqlist = $('#eqlist'); + + eqlist.uiGrid({ + autoFit: true, + border:false, + colFit:true, + gridTitleFix: false, + width:"100%", + height:"100%", + showHeader:false, + icon: 'list', + localData:{rows:[ + {id: '1', tm: '您对培训讲师最基本的要求是?',qtype:'0',bd:'1',a1:'PPT演示文稿制作精致',a2:'授课形式丰富,互动性强',a3:'合理安排授课时间',a4:'幽默风趣会调动气氛',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'1'}, + {id: '2', tm: '您认为最有效的培训方式是?',qtype:'1',bd:'0',a1:'文稿制作精致',a2:'互动性强',a3:'时间',a4:'调动气氛',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'2'}, + {id: '3', tm: '您认为最有效的培训方式是?',qtype:'0',bd:'0',a1:'文稿制作精致',a2:'互动性强',a3:'时间',a4:'调动气氛',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'3'}, + {id: '4', tm: '填写段落说明-后10题为选择题',qtype:'3',bd:'-1',a1:'文稿制作精致',a2:'互动性强',a3:'时间',a4:'调动气氛',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'4'}, + {id: '5', tm: '您认为最有效的培训方式是?',qtype:'2',bd:'0',a1:'',a2:'',a3:'',a4:'',a5:'',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'5'}, + {id: '6', tm: '您认为最有效的培训方式是',qtype:'1',bd:'1',a1:'PPT',a2:'授课',a3:'合理安排',a4:'幽默',a5:'其它',a6:'',a7:'',a8:'',a9:'',a10:'',a11:'',order:'6'}] + ,dlcount:0 + + }, +//单选0,多选1,问答2,段落说明3, + defaultSortField: 'order' + }); + switch ("add") { + case 'view': + // list_corp.uiGrid('toolbar').hide(); + break; + case 'edit': + break; + case 'add': + break; + default : + break; + } + + }; + + + //初始化考试弹出窗口 + ks_dialog = $('#ks_dialog').uiDialog({ + title: '新建', + icon: 'list', + // width: dialogSize.width, + // height: dialogSize.height, + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: addksPage, + onLoadComplete: formksInit, + onOpen: function () { + var dialogP = $('#ks_dialog').uiDialog('getUserParam'); + var id = dialogP.id; + switch (dialogP.action) { + case 'view': + //$('#grid_form3').uiForm('load', loadFormUrl + id);//加载远程数据 + break; + case 'edit': + //$('#grid_form3').uiForm('load', loadFormUrl+id);//加载远程数据 + break; + case 'add': + // $('#grid_form3').uiForm('load'); + break; + default : + break; + } + }, + buttons: [ + { + id: 'btnOK', + label: '提交试卷', + style: 'button_submit', + icons: {left: 'icon_add'}, + disabled: false, + onClick: function () { + $('#grid_form2').uiForm('submit', { + url: saveUrl, + onSubmit: function (params) { + params.id = $('#hdID').val(); + var isValid = $('#grid_form2').uiForm('validate'); + return isValid; // 返回false终止表单提交 + }, + success: function (data) { + report_dialog.uiDialog('close'); + grid.uiGrid('loadData'); + showResult(true, data.message); + } + }); + return false; + } + }, + { + id: 'btnCancel', + label: '取消', + icons: {left: 'icon_cancel'}, + disabled: false, + style: 'button_cancel', + onClick: function () { + ks_dialog.uiDialog('close'); + } + } + ] + + }); + + + //初始化考试弹出窗口 + export_kj_dialog = $('#export_kj_dialog').uiDialog({ + title: '新建', + icon: 'list', + // width: dialogSize.width, + // height: dialogSize.height, + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: exportksPage, + // onLoadComplete: formksInit, + onOpen: function () { + // var dialogP = $('#export_kj_dialog').uiDialog('getUserParam'); + // var id = dialogP.id; + switch (dialogP.action) { + case 'view': + //$('#grid_form3').uiForm('load', loadFormUrl + id);//加载远程数据 + break; + case 'edit': + //$('#grid_form3').uiForm('load', loadFormUrl+id);//加载远程数据 + break; + case 'add': + // $('#grid_form3').uiForm('load'); + break; + default : + break; + } + } + + }); + + //初始化考试弹出窗口 + ks_result_dialog = $('#ks_result_dialog').uiDialog({ + title: '新建', + icon: 'list', + // width: dialogSize.width, + // height: dialogSize.height, + width:"95%", + height:"95%", + mask: true, + showBtnBar: true, + updateOnOpen: true, + lazyLoad: true, + url: ksresultPage, + // onLoadComplete: formksInit, + onOpen: function () { + + } + + }); + + + + function addEvents() { + //添加 + $('#btn1').bind('click', function () { + dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + dialog.uiDialog('button', 'btnOK').show(); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('新增'); + }); + //删除 + $('#btn2').bind('click', function () { + var ids = grid.uiGrid('selectedData', 'id'); + if (ids.length == 0) { + showResult(false, '请选择要删除的行!', 'alert'); + } else { + deleteRow(ids); + } + }); + + //制作调查问卷 + $('#btn3').bind('click', function () { + addexam_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + addexam_dialog.uiDialog('button', 'btnOK').show(); + addexam_dialog.uiDialog('open'); + addexam_dialog.uiDialog('title').html('新增'); + }); + + //指定调研对象 + $('#btn4').bind('click', function () { + addusers_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + addusers_dialog.uiDialog('button', 'btnOK').show(); + addusers_dialog.uiDialog('open'); + addusers_dialog.uiDialog('title').html('新增'); + }); + + //进行答卷 + $('#btn5').bind('click', function () { + ks_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + ks_dialog.uiDialog('button', 'btnOK').show(); + ks_dialog.uiDialog('open'); + ks_dialog.uiDialog('title').html('考试'); + }); + + //导出问卷 + $('#btnexport').bind('click', function () { + export_kj_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + export_kj_dialog.uiDialog('button', 'btnOK').show(); + export_kj_dialog.uiDialog('open'); + export_kj_dialog.uiDialog('title').html('考卷'); + }); + + //查看汇总结果 + $('#btn51').bind('click', function () { + ks_result_dialog.uiDialog('setUserParam', {action: 'add', id: 0}); + ks_result_dialog.uiDialog('button', 'btnOK').show(); + ks_result_dialog.uiDialog('open'); + ks_result_dialog.uiDialog('title').html('结果'); + }); + } + +}); +//查看 +function viewRow(id, title) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'view', id: id}); + dialog.uiDialog('open'); + title = '' + title || ''; + dialog.uiDialog('title').html('查看' + title); + dialog.uiDialog('button', 'btnOK').hide(); + +} + +//编辑 +function editRow(id) { + var dialog = $('#dialog'); + dialog.uiDialog('setUserParam', {action: 'edit', id: id}); + dialog.uiDialog('open'); + dialog.uiDialog('title').html('编辑'); + dialog.uiDialog('button', 'btnOK').show(); +} + +// 删除 +function deleteRow(id) { + deleteData("此操作将删除信息,确定删除吗?", deleteUrl, {ids: id}, function (result) { + if (result.success) { + $('#grid').uiGrid('loadData'); + } + }); +} + +//删除 +function deleteData(confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + $.ajax({ + type: 'post', + url: url, + data: data, + dataType: "json", + success: function (result) { + callback && callback.call(this, result); + } + }); + } + } + }); +} \ No newline at end of file diff --git a/asset/js/cetc54/research/research_project_examadd.js b/asset/js/cetc54/research/research_project_examadd.js new file mode 100644 index 0000000..0145e0b --- /dev/null +++ b/asset/js/cetc54/research/research_project_examadd.js @@ -0,0 +1,344 @@ +/** + * Created by ningzq on 2019.06.10 + */ +//删除 + +var item = { + id: '', + tm: '', + qtype: '', + bd: '', + a1: '', + a2: '', + a3: '', + a4: '', + a5: '', + a6: '', + a7: '', + a8: '', + a9: '', + a10: '', + a11: '', + order:'', + xh:'' +} + +function deleteData_1 (confirmText, url, data, callback) { + $.uiMessagebox.confirm({ + title: '确认操作', + content: confirmText, + onClose: function (value) { + if (value) { + callback && callback.call(this, value); + // alert(value); + // return value; + // $.ajax({ + // type: 'post', + // url: url, + // data: data, + // dataType: "json", + // success: function (result) { + // callback && callback.call(this, result); + // } + // }); + } + } + }); +} + +function editquestion(e) { + + var itr = $(e).parents().filter('tr:eq(0)'); + gettrdata(itr); + + var eqhtml=''+ + '
          '+ + ''+ + ''+ + 'Q8'+ + ' '+ + ' '+ + ' '+ + ' 必答'+ + ' '+ + ' '+ + ' '+ + '
          '; + if(item.qtype==0 || item.qtype==1) { + if (item.a1 != null && item.a1.length > 0) eqhtml += '
          A
          '; + if (item.a2 != null && item.a2.length > 0) eqhtml += '
          B
          '; + if (item.a3 != null && item.a3.length > 0) eqhtml += '
          C
          '; + if (item.a4 != null && item.a4.length > 0) eqhtml += '
          D
          '; + if (item.a5 != null && item.a5.length > 0) eqhtml += '
          E
          '; + if (item.a6 != null && item.a6.length > 0) eqhtml += '
          F
          '; + if (item.a7 != null && item.a7.length > 0) eqhtml += '
          G
          '; + if (item.a8 != null && item.a8.length > 0) eqhtml += '
          H
          '; + if (item.a9 != null && item.a9.length > 0) eqhtml += '
          I
          '; + if (item.a10 != null && item.a10.length > 0) eqhtml += '
          J
          '; + } + if(item.qtype==2) eqhtml +='' + } + , + uiCheckbox: { + cbHtml: '', + wrapperHtml: '
          ', + wrapperID: 'wrapper', cbID: 'cb' + } + } +})(jQuery); +/** + * Created by jinxs on 2015.08.28. + */ +(function($){ + //全屏模块 + var fullScreen = { + supports: false, eventName: "", prefix: "", prefixes: "webkit moz o ms khtml".split(" "), + isFullScreen: function () { + }, requestFullScreen: function () { + }, cancelFullScreen: function () { + } + }; + if (typeof document.cancelFullScreen != "undefined") { + fullScreen.supports = true; + } else { + for (var i = 0; i < fullScreen.prefixes.length; i++) { + fullScreen.prefix = fullScreen.prefixes[i]; + if (typeof document[fullScreen.prefix + "CancelFullScreen"] != "undefined") { + fullScreen.supports = true; + break; + } + } + } + if (fullScreen.supports) { + fullScreen.eventName = fullScreen.prefix + "fullscreenchange"; + fullScreen.isFullScreen = function () { + switch (this.prefix) { + case "": + return document.fullScreen; + case "webkit": + return document.webkitIsFullScreen; + default: + return document[this.prefix + "FullScreen"]; + } + }; + fullScreen.requestFullScreen = function (elem) { + return (this.prefix === "") ? elem.requestFullScreen() : elem[this.prefix + "RequestFullScreen"](); + }; + fullScreen.cancelFullScreen = function (elem) { + return (this.prefix === "") ? document.cancelFullScreen() : document[this.prefix + "CancelFullScreen"](); + }; + } + $.uiFullScreen = { + supportsFullScreen: fullScreen.supports + , fullScreenEventName: fullScreen.eventName + , fullScreen: fullScreen + , isFullScreen: function () { + return fullScreen.isFullScreen(); + } + , requestFullScreen: function (selector) { + if (selector == null || selector == undefined) { + selector = document.documentElement; + } + selector = $(selector); + return selector.each(function () { + if (fullScreen.supports) { + fullScreen.requestFullScreen(this); + } + }); + } + , cancelFullScreen: function (selector) { + if (selector == null || selector == undefined) { + selector = document.documentElement; + } + selector = $(selector); + return selector.each(function () { + if (fullScreen.supports) { + fullScreen.cancelFullScreen(this); + } + }); + } + , toggleFullScreen: function (selector) { + if (selector == null || selector == undefined) { + selector = document.documentElement; + } + selector = $(selector); + return selector.each(function () { + if (fullScreen.supports) { + if ($.util.isFullScreen()) { + fullScreen.cancelFullScreen(this); + } else { + fullScreen.requestFullScreen(this); + } + } + }); + } + }; +})(jQuery); +/** + * Created by jinxs on 14-7-8. + * 依赖 + * ui.core.js + */ +(function ($) { + var _cacheName = 'uiMask'; + /** + * @class 遮罩组件 + * @constructor uiMask + * @type {{alert: Function, confirm: Function, prompt: Function}} + */ + $.uiMask = { + /** + * @summary 添加遮罩 + * @name uiMask#add + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + add: function (options) { + options = options || {}; + options = $.extend({}, $.uiMask.defaults, options); + return _add(options); + }, + /** + * @summary 显示遮罩 + * @name uiMask#show + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + show: function (options) { + options = options || {}; + options = $.extend({}, $.uiMask.defaults, options); + return _show(options); + }, + /** + * @summary 隐藏遮罩 + * @name uiMask#hide + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + hide: function (options) { + options = options || {}; + options = $.extend({}, $.uiMask.defaults, options); + var container = options.container; + var contID = container.getElemID(); + var mask = $.getByParentID(contID, options.maskID); + if (mask.length > 0) { + var maskCache = mask.data(_cacheName); + mask.hide(); + container.css({position: maskCache.parentPos, overflow: maskCache.parentOverflow}); + } + container.zIndexHack(true, options.excludeSelector); + return mask; + }, + /** + * @summary 移除遮罩 + * @name uiMask#remove + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + remove: function (options) { + var mask = $.uiMask.hide(options); + mask.remove(); + return mask; + } + }; + /** + * 默认配置 + * @lends uiMask.prototype + */ + $.uiMask.defaults = { + /** + * @type Object + * @default body + * @summary 组件父容器 + */ + container: $('body') + /** + * 在uiMask显示/隐藏时会对指定container下的OBJECT、IFRAME对象进行隐藏/显示 + * 有时需要排除对某些组件的这种控制 + * @type String + * @default null + * @summary 在container中要排除的对象选择器 + */ + , excludeSelector: null + , maskID: 'mask' + , zIndex: 888 + } + var _add = function (options) { + var container = options.container; + container.setElemID(); + var elem = container[0]; + var contID = container.getElemID(); + var mask = $.getByParentID(contID, options.maskID); + if (mask.length > 0) { + } else { + mask = $($.uiTemplate.mask) + .appendTo(container).attr("id", $.getIDByParentID(contID, options.maskID)); + $(window).bind('resize', function () { + if (mask.is(':visible')) { + mask.width(elem.scrollWidth).height(elem.scrollHeight); + } + }); + } + return mask; + }; + var _show = function (options) { + var mask = _add(options); + var container = options.container; + var cache = {}; + cache.parentPos = container.css('position'); + cache.parentOverflow = container.css('overflow'); + container.zIndexHack(false, options.excludeSelector); + mask.data(_cacheName, cache); + container.css({position: 'absolute', overflow: 'hidden'}); + mask.css({zIndex: options.zIndex, width: container[0].scrollWidth, height: container[0].scrollHeight}); + mask.show(); + return mask; + } +})(jQuery); +/** +* Created by jinxs on 14-7-8. +* 依赖 +* ui.core.js +* ui.mask.js +* ui.position.js +*/ +(function ($) { + /** + * @class Loading组件 + * @constructor uiLoading + * @type {{alert: Function, confirm: Function, prompt: Function}} + */ + $.uiLoading = { + /** + * @summary 添加loading + * @name uiLoading#add + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + add: function (options) { + options = options || {}; + options = $.extend({}, $.uiLoading.defaults, options); + return _add(options); + }, + /** + * @summary 显示loading + * @name uiLoading#show + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + show: function (options) { + options = options || {}; + options = $.extend({}, $.uiLoading.defaults, options); + var loading = _show(options); + return loading; + }, + /** + * @summary 隐藏loading + * @name uiLoading#hide + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + hide: function (options) { + options = options || {}; + options = $.extend({}, $.uiLoading.defaults, options); + var container = options.container; + var contID=container.getElemID(); + var loading = $.getByParentID(contID,options.loadingID); + if (loading.length > 0) { + loading.hide(); + if (container[0].uiposition != undefined) { + container.css('position', container[0].uiposition); + } + } + container.zIndexHack(true, options.excludeSelector); + return loading; + }, + /** + * @summary 移除loading + * @name uiLoading#remove + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + remove: function (options) { + var loading= $.uiLoading.hide(options); + loading.remove(); + loading = null; + } + }; + /** + * 默认配置 + * @lends uiLoading.prototype + */ + $.uiLoading.defaults = { + /** + * @type Object + * @default body + * @summary 组件父容器 + */ + container: $('body') + /** + * 在uiLoading显示/隐藏时会对指定container下的OBJECT、IFRAME对象进行隐藏/显示 + * 有时需要排除对某些组件的这种控制 + * @type String + * @default null + * @summary 在container中要排除的对象选择器 + */ + ,excludeSelector:null + /** + * 延时显示,对于加载时间较短的可以阻止遮罩显示 + * @type Number + * @default 200 + * @summary 延时显示,对于加载时间较短的可以阻止遮罩显示 + */ + ,delay:200 + /** + * @type String + * @default "loading" + * @summary 后缀标识ID + */ + ,loadingID:'loading' + /** + * @type Number + * @default 120 + * @summary 组件宽度 + */ + ,width: 120 + /** + * @type Number + * @default 30 + * @summary 组件高度 + */ + ,height: 30 + /** + * @type String + * @default "" + * @summary 文本内容 + */ + ,text: '' + /** + * @type String + * @default "" + * @summary 显示层级 + */ + ,zIndex:888 + } + var _add = function (options) { + var container = options.container; + container.setElemID(); + var contID=container.getElemID(); + var loading = $.getByParentID(contID,options.loadingID); + if (loading.length > 0) { + } else { + loading = $('
          ') + .appendTo(options.container).attr("id",$.getIDByParentID(contID,options.loadingID)) + .hide(); + if (container[0].tagName == 'BODY') { + loading.css({ top: 0, left: 0 }); + } + var mask = $.uiMask.add({ + container: loading + ,zIndex:options.zIndex + }); + var content = $($.uiTemplate.loading).appendTo(loading) + .css({ width: options.width, height: options.height, zIndex: parseInt(mask.css('zIndex')) + 1 }) + if (options.text != '') { + content.find('span.ui_loading_text').html(options.text); + } + $(window).bind('resize', function () { + if (mask.is(':visible')) { + var content = loading.find('.ui_loading_content'); + content.uiPosition({ horizontal: 'center', vertical: 'center', container: loading }); + } + }); + } + loading.hide(); + return loading; + }; + var _show = function (options) { + var container = options.container; + var loading = _add(options); + if (container.css('position') != 'relative' && container.css('position') != 'absolute') { + container[0].uiposition = container.css('position'); + container.css('position', 'absolute'); + } + loading.css({ width: container.width()<=10?'100%':container.width(), height: container.height()<=10?'100%':container.height() }); + var content = loading.find('.ui_loading_content'); + content.css({ width: options.width, height: options.height }) + if (options.text != '') { + content.find('span.ui_loading_text').html(options.text); + } + setTimeout(function(){ + content.uiPosition({ horizontal: 'center', vertical: 'center', container: loading }); + content=null; + },0); + loading.children('.ui_mask').show(); + loading.show(); + container.zIndexHack(false, options.excludeSelector); + } +})(jQuery); +/** +* Created by jinxs on 14-6-26. +* * 修改自easyUI +*/ +(function ($) { + + var _cacheName = 'droppable'; + + /** + * @class 拖放组件 + * @constructor droppable + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的方法的参数 + * @example + * // 构件组件 + * $('#div').droppable({ + * axis:'h', + * onStopDrag: function(e){ + * alert(this[0]==e.data.target[0]); + * } + * }); + * // 调用组件方法options + * $('#div').droppable("options"); + */ + $.fn.droppable = function (options, param) { + if (this.length > 0 && typeof options == 'string') { + return $.fn.droppable.methods[options](this.fire(), param); + } + return this.each(function () { + var me = $(this); + var state = me.data( _cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + } else { + _init(me); + me.data(_cacheName, { + options: $.extend({}, $.fn.droppable.defaults, me.parseUIConfig(), options) + }); + } + }); + }; + + /** + * 方法 + * @lends droppable.prototype + */ + $.fn.droppable.methods = { + /** + * @summary 获得组件的配置对象 + * @name droppable#options + * @function + * @returns {Object} 组件的配置对象 + */ + options: function (jq) { + return $.data(jq[0], _cacheName).options; + }, + /** + * @summary 启用拖放 + * @name droppable#enable + * @function + * @returns {jQuery} 方法调用者 + * @example + * $('#div').droppable("enable") + * 或 + * $('#div').droppable({disabled: false}) + */ + enable: function (jq) { + return jq.each(function () { + $(this).droppable({ disabled: false }); + }); + }, + /** + * @summary 禁用拖放 + * @name droppable#disable + * @function + * @returns {jQuery} 方法调用者 + */ + disable: function (jq) { + return jq.each(function () { + $(this).droppable({ disabled: true }); + }); + } + }; + /** + * 默认配置 + * @lends droppable.prototype + */ + $.fn.droppable.defaults = { + /** + *TODO:what is the options name + */ + accept: null, + /** + * @type Boolean + * @default false + * @summary 是否禁用 + */ + disabled: false, + /** + * @summary 在对象拖进时触发的方法。 + * @event + * @name droppable#onDragEnter + * @param e {Object} 事件对象 + * @param source {Object} 数据源 + * @default emptyFn + */ + onDragEnter: function (e, source) { + }, + /** + * @summary 在对象拖放时触发的方法。 + * @event + * @name droppable#onDragOver + * @param e {Object} 事件对象 + * @param source {Object} 数据源 + * @default emptyFn + */ + onDragOver: function (e, source) { + }, + /** + * @summary 在对象拖出时中触发的方法。 + * @event + * @name droppable#onDragLeave + * @param e {Object} 事件对象 + * @param source {Object} 数据源 + * @default emptyFn + */ + onDragLeave: function (e, source) { + }, + /** + * @summary 在对象拖放过程中触发的方法。 + * @event + * @name droppable#onDrag + * @param e {Object} 事件对象 + * @param source {Object} 数据源 + * @default emptyFn + */ + onDrop: function (e, source) { + } + }; + + var _init = function (target) { + var options = target.data(_cacheName); + + target.addClass('droppable').bind('_dragenter', function (e, source) { + options.onDragEnter.apply(this, [e, source]); + }).bind('_dragleave', function (e, source) { + options.onDragLeave.apply(this, [e, source]); + }).bind('_dragover', function (e, source) { + options.onDragOver.apply(this, [e, source]); + }).bind('_drop', function (e, source) { + options.onDrop.apply(this, [e, source]); + }); + } +})(jQuery); +/** + * Created by jinxs on 14-6-26. + * 修改自easyUI + */ +(function ($) { + var _cacheName = 'draggable'; + + /** + * @class 拖拽组件 + * @constructor draggable + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的方法的参数 + * @example + * // 构件组件 + * $('#div').draggable({ + * axis:'h', + * onStopDrag: function(e){ + * alert(this[0]==e.data.target[0]); + * } + * }); + * // 调用组件方法options + * $('#div').draggable("options"); + */ + $.fn.draggable = function (options, param) { + if (typeof options == 'string') { + return $.fn.draggable.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + var opts; + + options = options || {}; + if (cache) { + cache.handle.unbind('.draggable'); + opts = $.extend(cache.options, options); + } else { + opts = $.extend({}, $.fn.draggable.defaults,me.parseUIConfig(), options); + } + var handle = opts.handle ? (typeof opts.handle == 'string' ? $(opts.handle, me) : opts.handle) : me; + + me.data(_cacheName, { + options: opts, + handle: handle + }); + + if (opts.disabled) { + me.css('cursor', ''); + return; + } + + handle.unbind('.draggable') + .bind('mouseover.draggable', {target: me}, function (e) { + if ($.fn.draggable.isDragging){return} + $('body').css('cursor', opts.cursor); + }) + .bind('mouseleave.draggable', {target: me}, function (e) { + $('body').css('cursor', ''); + }) + .bind('mousemove.draggable', {target: me}, function (e) { + $.fn.draggable.mousemove = true; + }) + .bind('mousedown.draggable', {target: me}, function (e) { + var target = e.data.target; + var parent = target.parent(); + var scrollLeft = parent.scrollLeft(); + var scrollTop = parent.scrollTop(); + var position = target.position(); + var offset = target.offset(); + var doc=$(document); + var data = { + startPosition: target.css('position'), + startLeft: position.left + scrollLeft, + startTop: position.top + scrollTop, + left: position.left, + top: position.top, + startX: e.pageX, + startY: e.pageY, + offsetWidth: (e.pageX - offset.left), + offsetHeight: (e.pageY - offset.top), + target: target, + parent: parent[0] + }; + + $.fn.draggable.mousedown = true; + $.extend(e.data, data); + var opts = target.data(_cacheName).options; + if (opts.onBeforeDrag.call(target, e) == false) return; + + doc.bind('mousedown.draggable', e.data, _doDown); + doc.bind('mousemove.draggable', e.data, _doMove); + doc.bind('mouseup.draggable', e.data, _doUp); + + $.fn.draggable.timer = setTimeout(function(){ + $.fn.draggable.isDragging = true; + _doDown(e); + }, opts.delay); + return false; + }); + }); + }; + + $.fn.draggable.isDragging = false; + + /** + * 方法 + * @lends draggable.prototype + */ + $.fn.draggable.methods = { + /** + * @summary 获得组件的配置对象 + * @name draggable#options + * @function + * @returns {Object} 组件的配置对象 + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 获得拖拽对象的代理 + * @name draggable#proxy + * @function + * @returns {jQuery} 拖拽对象的代理 + */ + proxy: function (target) { + return $.data(target[0], _cacheName).proxy; + }, + /** + * @summary 启用拖拽 + * @name draggable#enable + * @function + * @returns {jQuery} 方法调用者 + * @example + * $('#div').draggable("enable") + * 或 + * $('#div').draggable({disabled: false}) + */ + enable: function (target) { + return target.draggable({disabled: false}); + }, + /** + * @summary 禁用拖拽 + * @name draggable#disable + * @function + * @returns {jQuery} 方法调用者 + */ + disable: function (target) { + return target.draggable({disabled: true}); + } + }; + /** + * 默认配置 + * @lends draggable.prototype + */ + $.fn.draggable.defaults = { + /** + * @type String|Function + * @default null + * @summary 拖拽的代理对象 + * @example + * // 以#div下的#head为代理对象 + * $("#div").draggable({ + * proxy:"#head" + * }); + * // 等同于 + * $("#div").draggable({ + * proxy: function(){ + * return this.find("#head"); + * } + * }); + */ + proxy: null, + /** + * 拖动时鼠标样式 + * @type String + * @default "move" + */ + cursor:'move', + delay:100, + /** + * @type Boolean + * @default false + * @summary 指示拖拽后是否回到初始位置 + */ + revert: false, + /** + * @type Number + * @default null + * @summary 拖拽的X方向步长 + */ + deltaX: null, + /** + * @type Number + * @default null + * @summary 拖拽的Y方向步长 + */ + deltaY: null, + /** + * @type String|jQuery + * @default null + * @summary 拖拽的对象 + */ + handle: null, + /** + * @type Boolean + * @default false + * @summary 是否禁用 + */ + disabled: false, + edge: 0, + /** + * 值可以为v, h, vh + * @type String + * @default "vh" + * @summary 可拖拽的方向 + */ + axis: 'vh', + + /** + * 可通过返回false取消拖拽动作 + * @summary 在对象开始拖拽前触发的方法。 + * @event + * @name draggable#onBeforeDrag + * @param e {Object} 事件对象 + * @this jQuery对象 + * @default emptyFn + */ + onBeforeDrag: function (e) { + }, + /** + * @summary 在对象开始拖拽时触发的方法。 + * @event + * @name draggable#onStartDrag + * @param e {Object} 事件对象 + * @this jQuery对象 + * @default emptyFn + */ + onStartDrag: function (e) { + }, + /** + * @summary 在对象拖拽过程中触发的方法。 + * @event + * @name draggable#onDrag + * @param e {Object} 事件对象 + * @this jQuery对象 + * @default emptyFn + */ + onDrag: function (e) { + }, + /** + * @summary 在对象拖拽结束时触发的方法。 + * @event + * @name draggable#onStopDrag + * @param e {Object} 事件对象 + * @this jQuery对象 + * @default emptyFn + */ + onStopDrag: function (e) { + } + }; + var _doDown = function (e) { + if (!$.fn.draggable.isDragging){return false;} + var target = e.data.target; + var state = target.data(_cacheName); + var opts = state.options; + + state.droppables = $('.droppable').filter(function () { + return target != this; + }).filter(function () { + var accept = $.data(this[0], "draggable").options.accept; + if (accept) { + return $(accept).filter(function () { + return this == target; + }).length > 0; + } else { + return true; + } + }); + + var proxy = state.proxy; + if (!proxy) { + if (opts.proxy) { + if (opts.proxy == 'clone') { + proxy = $(target).clone().insertAfter(target); + } else { + proxy = opts.proxy.call(target,target); + } + state.proxy = proxy; + } else { + proxy = $(target); + } + } + + proxy.css('position', 'absolute'); + _drag(e); + _applyDrag(e); + + opts.onStartDrag.call(target, e); + return false; + } + + var _doMove = function (e) { + if (!$.fn.draggable.isDragging){return false;} + var state = $.data(e.data.target[0], _cacheName); + _drag(e); + if (state.options.onDrag.call(e.data.target, e) != false) { + _applyDrag(e); + } + + var source = e.data.target; + state.droppables.each(function () { + var dropObj = $(this); + if (dropObj.droppable('options').disabled) { + return; + } + + var p2 = dropObj.offset(); + if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() + && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()) { + if (!this.entered) { + $(this).trigger('_dragenter', [source]); + this.entered = true; + } + $(this).trigger('_dragover', [source]); + } else { + if (this.entered) { + $(this).trigger('_dragleave', [source]); + this.entered = false; + } + } + }); + + return false; + } + + var _doUp = function (e) { + if (!$.fn.draggable.isDragging){ + _clearDragging(); + return false; + } + _doMove(e); + + var target = e.data.target; + var state = target.data(_cacheName); + var proxy = state.proxy; + var opts = state.options; + if (opts.revert) { + if (_checkDrop(e) == true) { + target.css({ + position: e.data.startPosition, + left: e.data.startLeft, + top: e.data.startTop + }); + } else { + if (proxy) { + var left, top; + if (proxy.parent()[0] == document.body) { + left = e.data.startX - e.data.offsetWidth; + top = e.data.startY - e.data.offsetHeight; + } else { + left = e.data.startLeft; + top = e.data.startTop; + } + proxy.animate({ + left: left, + top: top + }, function () { + _removeProxy(state,proxy); + }); + } else { + target.animate({ + left: e.data.startLeft, + top: e.data.startTop + }, function () { + target.css('position', e.data.startPosition); + }); + } + } + } else { + var parent=target.parent(); + var pos={left:0,top:0}; + var doc = $(document); + if(e.data.startPosition=='fixed') { + if (parent.is('body')) { + pos.left = doc.scrollLeft(); + pos.top = doc.scrollTop(); + } else { + pos.left = doc.scrollLeft() - parent.scrollLeft(); + pos.top = doc.scrollTop() - parent.scrollTop(); + } + }else{ + if(!parent.is('body')) { + pos.left = doc.scrollLeft() - parent.scrollLeft(); + pos.top = doc.scrollTop() - parent.scrollTop(); + } + } + target.css({ + position: e.data.startPosition, + left: e.data.left-pos.left, + top: e.data.top-pos.top + }); + _checkDrop(e); + } + opts.onStopDrag.call(target, e); + _clearDragging(); + return false; + } + + var _clearDragging=function(){ + if ($.fn.draggable.timer){ + clearTimeout($.fn.draggable.timer); + $.fn.draggable.timer = undefined; + } + $(document).unbind('.draggable'); + $.fn.draggable.isDragging = false; + setTimeout(function(){ + $('body').css('cursor',''); + },100); + } + + var _drag = function (e) { + var state = $.data(e.data.target[0], _cacheName); + var opts = state.options; + var proxy = state.proxy; + + var dragData = e.data; + var left = dragData.startLeft + e.pageX - dragData.startX; + var top = dragData.startTop + e.pageY - dragData.startY; + + if (proxy) { + if (proxy.parent()[0] == document.body) { + if (opts.deltaX != null && opts.deltaX != undefined) { + left = e.pageX + opts.deltaX; + } else { + left = e.pageX - e.data.offsetWidth; + } + if (opts.deltaY != null && opts.deltaY != undefined) { + top = e.pageY + opts.deltaY; + } else { + top = e.pageY - e.data.offsetHeight; + } + } else { + if (opts.deltaX != null && opts.deltaX != undefined) { + left += e.data.offsetWidth + opts.deltaX; + } + if (opts.deltaY != null && opts.deltaY != undefined) { + top += e.data.offsetHeight + opts.deltaY; + } + } + } + + if (opts.axis.indexOf('h') != -1) { + dragData.left = left; + } + if (opts.axis.indexOf('v') != -1) { + dragData.top = top; + } + } + + var _applyDrag = function (e) { + var state = $.data(e.data.target[0], _cacheName); + var opts = state.options; + var css = {}; + var proxy = state.proxy; + if (!proxy) { + proxy = $(e.data.target); + } + if(opts.axis.indexOf('h') != -1){ + css.left = e.data.left; + } + if(opts.axis.indexOf('v') != -1){ + css.top = e.data.top; + } + proxy.css(css); + $('body').css('cursor',opts.cursor); + } + + var _checkDrop = function (e) { + var state = $.data(e.data.target[0], _cacheName); + var opts = state.options; + var proxy = state.proxy; + var dropped = false; + try { + state.droppables.each(function () { + var dropObj = $(this); + if (dropObj.droppable('options').disabled) { + return; + } + var p2 = dropObj.offset(); + if (e.pageX > p2.left && e.pageX < p2.left + dropObj.outerWidth() + && e.pageY > p2.top && e.pageY < p2.top + dropObj.outerHeight()) { + if (opts.revert) { + $(e.data.target).css({ + position: e.data.startPosition, + left: e.data.startLeft, + top: e.data.startTop + }); + } + $(this).trigger('_drop', [e.data.target]); + _removeProxy(state,proxy); + dropped = true; + this.entered = false; + return false; + } + }); + } catch(e) { + } + if (!dropped && !opts.revert) { + _removeProxy(state,proxy); + } + return dropped; + } + var _removeProxy=function(state,proxy){ + if (proxy){ + proxy.remove(); + } + state.proxy = null; + } +})(jQuery); + +/** + * Created by jinxs on 14-6-25. + * 基于easyui.resizable + */ +(function ($) { + + var _cacheName = 'resizable'; + /** + * @class 调整大小组件 + * @constructor resizable + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + */ + $.fn.resizable = function (options, param) { + if (typeof options == 'string') { + return $.fn.resizable.methods[options](this, param); + } + return this.each(function () { + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + me.unbind('.resizable'); + $.extend(cache.options, options); + } else { + options = $.extend({}, $.fn.resizable.defaults, me.parseUIConfig(), options); + me.data(_cacheName, {options: options}); + } + if (options.disabled == true) { + return; + } + me.bind('mousemove.resizable', {target: me}, function (e) { + if ($.fn.resizable.isResizing) { + return; + } + _setCursor(e, _getDirection(e)); + }).bind('mouseleave.resizable', {target: me}, function (e) { + _setCursor(e, ''); + }) + .bind('mousedown.resizable', {target: me}, function (e) { + var dir = _getDirection(e); + _setCursor(e, dir); + if (dir == '') return; + var targ = $(e.data.target); + var data = { + target: targ, + parent: targ.parent()[0], + dir: dir, + startLeft: _getCssValue(e, 'left'), + startTop: _getCssValue(e, 'top'), + left: _getCssValue(e, 'left'), + top: _getCssValue(e, 'top'), + startX: e.pageX, + startY: e.pageY, + startWidth: targ.outerWidth(), + startHeight: targ.outerHeight(), + width: targ.outerWidth(), + height: targ.outerHeight(), + deltaWidth: targ.outerWidth() - targ.width(), + deltaHeight: targ.outerHeight() - targ.height() + }; + $(document).bind('mousedown.resizable', data, _doDown); + $(document).bind('mousemove.resizable', data, _doMove); + $(document).bind('mouseup.resizable', data, _doUp); + $('body').css('cursor', dir + '-resize'); + }); + }); + }; + /** + * 方法 + * @lends resizable.prototype + */ + $.fn.resizable.methods = { + /** + * @summary 获得组件的配置对象 + * @name resizable#options + * @function + * @returns {Object} 组件的配置对象 + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * 启用组件。 + * @name resizable#enable + * @function + * @example + * $('#input').resizable("enable") + */ + enable: function (target) { + target.resizable({disabled: false}); + return target; + }, + /** + * 禁用组件。 + * @name resizable#disable + * @function + * @example + * $('#input').resizable("disable") + */ + disable: function (target) { + target.resizable({disabled: true}); + return target; + } + }; + /** + * 默认配置 + * @lends resizable.prototype + */ + $.fn.resizable.defaults = { + /** + * 是否禁用组件。 + * @default false + * @type Boolean + * @example + * $('#input').disabled({disabled:false}); + */ + disabled: false, + /** + * @type "" + * @default n, e, s, w, ne, se, sw, nw, all + * @summary 调整大小时可拖动的范围 + */ + handles: 'n, e, s, w, ne, se, sw, nw, all', + /** + * @type Number + * @default 10 + * @summary 组件的最小宽度 + */ + minWidth: 10, + /** + * @type Number + * @default 10 + * @summary 组件的最小高度度 + */ + minHeight: 10, + /** + * @type Number + * @default 10000 + * @summary 组件的最大宽度 + */ + maxWidth: 10000, //$(document).width(), + /** + * @type Number + * @default 10000 + * @summary 组件的最大高度 + */ + maxHeight: 10000, //$(document).height(), + /** + * @type Number + * @default 5 + * @summary handles的宽度 + */ + edge: 5, + /** + * @summary 在开始调整大小时触发的方法 + * @name resizable#onStartResize + * @event + * @default emptyFn + */ + onStartResize: function (e) { + }, + /** + * @summary 在调整大小时触发的方法 + * @name resizable#onResize + * @event + * @default emptyFn + */ + onResize: function (e) { + }, + /** + * @summary 在结束调整大小时触发的方法 + * @name resizable#onStopResize + * @event + * @default emptyFn + */ + onStopResize: function (e) { + } + }; + + $.fn.resizable.isResizing = false; + + var _resize = function (e) { + var resizeData = e.data; + var options = $.data(resizeData.target[0], _cacheName).options; + if (resizeData.dir.indexOf('e') != -1) { + var width = resizeData.startWidth + e.pageX - resizeData.startX; + width = Math.min( + Math.max(width, options.minWidth), + options.maxWidth + ); + resizeData.width = width; + } + if (resizeData.dir.indexOf('s') != -1) { + var height = resizeData.startHeight + e.pageY - resizeData.startY; + height = Math.min( + Math.max(height, options.minHeight), + options.maxHeight + ); + resizeData.height = height; + } + if (resizeData.dir.indexOf('w') != -1) { + var width = resizeData.startWidth - e.pageX + resizeData.startX; + width = Math.min( + Math.max(width, options.minWidth), + options.maxWidth + ); + resizeData.width = width; + resizeData.left = resizeData.startLeft + resizeData.startWidth - resizeData.width; + } + if (resizeData.dir.indexOf('n') != -1) { + var height = resizeData.startHeight - e.pageY + resizeData.startY; + height = Math.min( + Math.max(height, options.minHeight), + options.maxHeight + ); + resizeData.height = height; + resizeData.top = resizeData.startTop + resizeData.startHeight - resizeData.height; + } + } + + var _applySize = function (e) { + var resizeData = e.data; + var t = $(resizeData.target); + t.css({ + left: resizeData.left, + top: resizeData.top + }); + if (t.outerWidth() != resizeData.width) { + t.outerWidth(resizeData.width) + } + if (t.outerHeight() != resizeData.height) { + t.outerHeight(resizeData.height) + } + } + + var _doDown = function (e) { + $.fn.resizable.isResizing = true; + $.data(e.data.target[0], _cacheName).options.onStartResize.call(e.data.target, e); + return false; + } + + var _doMove = function (e) { + _resize(e); + if ($.data(e.data.target[0], _cacheName).options.onResize.call(e.data.target, e) != false) { + _applySize(e) + } + return false; + } + + var _doUp = function (e) { + $.fn.resizable.isResizing = false; + _resize(e, true); + if ($.data(e.data.target[0], _cacheName).options.onStopResize.call(e.data.target, e) != false) { + _applySize(e); + } + $(document).unbind('.resizable'); + $('body').css('cursor', ''); + return false; + } + + var _getDirection = function (e) { + var tt = $(e.data.target); + var opts = $.data(e.data.target[0], _cacheName).options; + var dir = ''; + var offset = tt.offset(); + var width = tt.outerWidth(); + var height = tt.outerHeight(); + var edge = opts.edge; + if (e.pageY > offset.top && e.pageY < offset.top + edge) { + dir += 'n'; + } else if (e.pageY < offset.top + height && e.pageY > offset.top + height - edge) { + dir += 's'; + } + if (e.pageX > offset.left && e.pageX < offset.left + edge) { + dir += 'w'; + } else if (e.pageX < offset.left + width && e.pageX > offset.left + width - edge) { + dir += 'e'; + } + + var handles = opts.handles.split(','); + for (var i = 0; i < handles.length; i++) { + var handle = handles[i].replace(/(^\s*)|(\s*$)/g, ''); + if (handle == 'all' || handle == dir) { + return dir; + } + } + return ''; + } + var _getCssValue = function (e, css) { + var val = parseInt($(e.data.target).css(css)); + if (isNaN(val)) { + return 0; + } else { + return val; + } + } + var _setCursor = function (e, dir) { + if (dir == '') { + $(e.data.target).css('cursor', ''); + } else { + $(e.data.target).css('cursor', dir + '-resize'); + } + } +})(jQuery); +/** + * Created by jinxs on 14-7-2. + * 依赖 + * ui.core.js + */ +(function ($) { + /** + * @class 位置组件 + * @requires {@link uiCore} + * @constructor uiPosition + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * $('position').uiPosition({horizontal:3}); + */ + $.fn.uiPosition = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiPosition.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + _init(me, $.extend({}, $.fn.uiPosition.defaults, me.parseUIConfig(), options||{})); + }); + }; + /** + * 默认配置 + * @lends uiPosition.prototype + */ + $.fn.uiPosition.defaults = { + /** + * @type Object + * @default body + * @summary 组件的父容器 + */ + container: $('body'), + /** + * @type Boolean + * @default false + * @summary 是否位置固定 + */ + fixed: false, + /** + * @type Number + * @default 0 + * @summary 组件的垂直坐标 + */ + top: 0, + /** + * @type Number + * @default 0 + * @summary 组件的水平坐标 + */ + left: 0, + /** + * 位置枚举:

          + * + * + * + * + * + * + * + *
          名称说明
          left水平靠左
          center水平中间
          right水平靠右
          + * @type String + * @default "" + * @summary 组件的水平位置 + */ + horizontal: '', + /** + * 位置枚举:

          + * + * + * + * + * + * + * + *
          名称说明
          top垂直靠上
          center垂直靠中
          bottom垂直靠下
          + * @type String + * @default "" + * @summary 组件的垂直位置 + */ + vertical: '' + }; +//////--------------------------------内部方法------------------------------ + /** + * 初始化 + * @param target 目标对象 + * @param options + */ + var _init = function (target, options) { + var container = options.container; + var isBody = $.nodeName(container[0], 'body'); + var parentW, parentH, top, left; + + if (container.css('position') === 'static') { + container.css('position', 'absolute'); + } + target.offsetParent().each(function () { + if (this !== container[0]) { + container.append(target.detach()); + } + }); + if (isBody) { + parentW = $('body').width(); + parentH = $('body').height(); + } else { + parentW = container.outerWidth(); + parentH = container.outerHeight(); + } + if (options.horizontal != "") { + switch (options.horizontal) { + case 'left': + left = 0; + break; + case 'center': + left = (parentW - target.outerWidth()) / 2; + break; + case 'right': + left = parentW - target.outerWidth(); + break; + } + } else { + left = options.left || 0; + } + if (options.vertical != "") { + switch (options.vertical) { + case 'top': + top = 0; + break; + case 'center': + top = (parentH - target.outerHeight()) / 2; + break; + case 'bottom': + top = parentH - target.outerHeight(); + break; + } + } else { + top = options.top || 0; + } + var hasScroll = container.hasScroll(); + if (!isBody && hasScroll.indexOf('x') > -1 && options.horizontal == 'right') { + left -= 20; + } + if (!isBody && hasScroll.indexOf('y') > -1 && options.vertical == 'bottom') { + top -= 20; + } + if (options.fixed) { + if (_IEunder6) { + var style = target[0].style; + style.position = 'absolute'; + style.removeExpression('left'); + style.removeExpression('top'); + if (isBody) { + style.setExpression('left', 'eval(document.documentElement.scrollLeft + ' + + left + ') +"px"'); + style.setExpression('top', 'eval(document.documentElement.scrollTop + ' + + top + ') +"px"'); + } else { + style.setExpression('left', 'eval(this.parentNode.scrollLeft + ' + + left + ') +"px"'); + style.setExpression('top', 'eval(this.parentNode.scrollTop + ' + + top + ') +"px"'); + } + } else { + var pos = container.position(); + top += pos.top; + left += pos.left; + target.css({position: 'fixed', left: left, top: top}); + } + } else { + if (isBody) { + top += $(document).scrollTop(); + left += $(document).scrollLeft(); + } else { + top += container.scrollTop(); + left += container.scrollLeft(); + } + target.css({position: 'absolute', left: left, top: top}); + } + return target; + }; +})(jQuery); +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiButton'; + /** + * @name uiButton + * @class 按钮 + * @constructor + * @summary 构造函数 + * @param {Object|String} options 如果为Object,则表示组件配置,如果为String,则调用组件方法 + * @param {Object} param 当options为String时,可以传入方法参数 + * @returns {jQuery} jQuery对象 + * @example + * //采用默认值 + * $('#btn').uiButton(); + * //设置组件参数 + * $('#btn').uiButton({id:'btn',label:'提交'}); + * //调用组件方法 + * $('#btn').uiButton('setLabel','保存'); + */ + $.fn.uiButton = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiButton.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var state = me.data(_cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiButton.defaults, me.parseUIConfig(), options) + }); + } + _init(me); + }); + }; + /** + * 方法 + * @lends uiButton.prototype + */ + $.fn.uiButton.methods = { + /** + * @summary 获取组件配置参数 + * @function + * @name uiButton#options + * @returns {Object} + * @example + * $('#btn').uiButton('options'); + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 设置按钮的样式类 + * @function + * @name uiButton#setStyle + * @param style {String} + * @example + * $('#btn').uiButton('setStyle', 'myClassName'); + */ + setStyle: function (target, style) { + _setStyle(target, style); + }, + /** + * @summary 设置按钮的显示文本 + * @function + * @name uiButton#setLabel + * @param text {String} 显示文本 + * @example + * $('#btn').uiButton('setLabel', '提交'); + */ + setLabel: function (target, text) { + _setLabel(target, text); + }, + /** + * @summary 获取按钮的显示文本 + * @function + * @name uiButton#getLabel + * @returns {String} 显示文本 + */ + getLabel: function (target) { + return $.data(target[0], _cacheName).options.label; + }, + /** + * @summary 设置按钮的图标 + * @function + * @name uiButton#setIcons + * @param icons {Object} 图标样式 + * @example + * $('#btn').uiButton('setIcons', {left:'add',right:'delete'}); + */ + setIcons: function (target, icons) { + _setIcon(target, icons); + }, + /** + * @summary 启用组件 + * @function + * @name uiButton#enable + * @returns {jQuery} 方法调用者 + */ + enable: function (target) { + _setDisabled(target, false); + return target; + }, + /** + * @summary 禁用组件 + * @function + * @name uiButton#disable + * @returns {jQuery} 方法调用者 + */ + disable: function (target) { + _setDisabled(target, true); + return target; + }, + /** + * @summary 设置是否禁用组件 + * @function + * @name uiButton#setDisabled + * @param disabled {Boolean} 是否禁用 + * @returns {jQuery} 方法调用者 + */ + setDisabled: function (target, disabled) { + _setDisabled(target, !!disabled); + return target; + } + }; + /** + * 默认配置 + * @lends uiButton.prototype + */ + $.fn.uiButton.defaults = + { + /** + * @summary 唯一标识 + * @type String + * @default "" + * @example + * $('').uiButton({id:'btnOK'}); + */ + id: '', + /** + * @summary 显示按钮图标,left表示左图标,right表示右图标,取值均为样式类。 + * @type Object + * @default {left: '', right: ''} + */ + icons: {left: '', right: ''}, + /** + * 属性说明:(左侧图标:left;右侧图标:right)

          + * + * + * + * + * + * + * + *
          属性说明
          icon图标样式
          color颜色
          size大小(像素)
          + * @type Object + * @default {left: {}, right: {}} + * @summary 使用奥森字体图标,示例{left: {icon:'fa-comments-o',color:'#FF0000',size:20}} + */ + fontIcon: {left: {}, right: {}}, + /** + * @summary 显示文本(可以为HTML) + * @type String + * @default '' + */ + label: '', + /** + * @summary 按钮样式 + * @type String + * @default '' + */ + style: 'button', + /** + * @summary 是否禁用 + * @type Boolean + * @default false + */ + disabled: false, + /** + * @summary 按钮单击时触发的方法 + * @name uiButton#onClick + * @event + * @default emptyFn + */ + onClick: function () { + } + }; +//////--------------------------------内部方法------------------------------ + /** + * 创建按钮 + * @param target 目标对象 + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + var content = target.contents(); + options.id = options.id || target[0].id; + target.attr("id", options.id); + if (_IEunder7) { + target.attr("hidefocus", true);//去掉焦点时的虚线框 + } + if (options.onClick) { + target.unbind('.' + _cacheName).bind('click.' + _cacheName, options.onClick); + } + //当按钮内没有内容时配置生效 + if (content.length == 0) { + if (options.label) { + $('' + options.label + '').appendTo(target); + } + } + else { + var lab = target.find("span.btnLabel"); + if (lab.length > 0) { + options.label = lab.html(); + } + else { + options.label = target.text(); + if (options.label) { + target.wrapInner(''); + } + } + } + _setIcon(target, options.icons, options.fontIcon); + _setDisabled(target, options.disabled); + return target; + }; + + var _setLabel = function (target, text) { + var options = $.data(target[0], _cacheName).options; + options.label = text; + var lab = target.find('span.btnLabel'); + lab.html(text); + }; + + var _setIcon = function (target, icons, fontIcons) { + fontIcons = fontIcons || {}; + var options = $.data(target[0], _cacheName).options; + if (icons || fontIcons) { + var lab = target.find('span.btnLabel'); + var icoDisabledClass = ""; + if (options.disabled) { + icoDisabledClass = " iconDisabled"; + } + function setIcon(region) { + var iconsRegion, fontIconsRegion, iconsOpts, fontIconsOpts; + if (region == 'left') { + iconsRegion = icons.left; + fontIconsRegion = fontIcons.left; + iconsOpts = options.icons.left; + fontIconsOpts = options.fontIcon.left; + } else if (region == 'right') { + iconsRegion = icons.right; + fontIconsRegion = fontIcons.right; + iconsOpts = options.icons.right; + fontIconsOpts = options.fontIcon.right; + } + if (iconsRegion || fontIconsRegion) { + var icon = target.find('span.icon_' + region); + if (icon.length > 0) { + icon.removeClass().addClass("icon_" + region + " " + icoDisabledClass); + } + else { + var icon = $(''); + if (lab.length > 0) { + if (region == 'left') { + lab.before(icon); + } else if (region == 'right') { + lab.after(icon); + } + } + else { + target.append(icon); + } + } + if (fontIconsRegion && fontIconsRegion.icon && !_IEunder6) { + fontIconsOpts.size = fontIconsRegion.size || 16; + fontIconsOpts.color = fontIconsRegion.color || 'inherit'; + icon.addClass('fa').addClass(fontIconsRegion.icon) + .css({fontSize: fontIconsOpts.size, color: fontIconsOpts.color}); + } else { + if (iconsRegion) { + iconsOpts = iconsRegion; + icon.addClass('icon ' + iconsRegion); + } + } + } + } + + setIcon('left'); + setIcon('right'); + } + }; + + /** + * 设置不可用状态 + * @param target 目标对象 + * @param disabled + */ + var _setDisabled = function (target, disabled) { + var options = $.data(target[0], _cacheName).options; + var ico_l = target.find('span.icon_left'); + var ico_r = target.find('span.icon_right'); + //不可用时 + if (disabled || target.attr('disabled') == 'disabled') { + options.disabled = true; + target.attr('disabled', true); + ico_l.addClass('iconDisabled'); + ico_r.addClass('iconDisabled'); + } + if (!disabled) { + options.disabled = false; + target.attr('disabled', false); + ico_l.removeClass('iconDisabled'); + ico_r.removeClass('iconDisabled'); + } + _setStyle(target, options.style); + }; + /** + * 设置样式 + * @param target 目标对象 + * @private + * @param style + */ + var _setStyle = function (target, style) { + var options = $.data(target[0], _cacheName).options; + var disabled = options.disabled; + //不可用时 + if (disabled) { + target.removeClass().addClass('button button_disabled'); + } + else { + if (style) { + options.style = style; + if (style == "button") { + target.removeClass().addClass('button'); + } + else { + target.removeClass().addClass('button ' + style); + } + } + } + if (!target.is("button")) { + target.addClass('buttonHack'); + } + } +})(jQuery); +/** + * Created by jinxs on 14-6-20. + * ui.button.js + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiButtonBar'; + + /** + * @class 按钮栏 + * @requires {@link uiButton} + * @constructor uiButtonBar + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * // 构件组件 + * $('#divBtnBar').uiButtonBar({direction: 'left'}); + * // 调用组件方法options + * $('#divBtnBar').uiButtonBar("options"); + */ + $.fn.uiButtonBar = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiButtonBar.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiButtonBar.defaults, me.parseUIConfig(), options) + }); + } + _init(me); + }); + }; + + /** + * 方法 + * @lends uiButtonBar.prototype + */ + $.fn.uiButtonBar.methods = { + /** + * @summary 获得组件的配置对象 + * @name uiButtonBar#options + * @function + * @returns {Object} 组件的配置对象 + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 设置为可用 + * @function + * @name uiButtonBar#enable + * @returns {jQuery} 方法调用者 + */ + enable: function (target) { + _setDisabled(target, false); + return target; + }, + /** + * @summary 设置为不可用 + * @function + * @name uiButtonBar#disable + * @returns {jQuery} 方法调用者 + */ + disable: function (target) { + _setDisabled(target, true); + return target; + } + }; + + /** + * 默认配置 + * @lends uiButtonBar.prototype + */ + $.fn.uiButtonBar.defaults = { + /** + * @type String + * @default "" + * @summary 背景颜色 + */ + backgroundColor: '', + /** + * @type Boolean + * @default false + * @summary 是否显示边框 + */ + buttonBorder: false, + /** + * @type Number + * @default null + * @summary 组件宽度 + */ + width: null, + /** + * @type Number + * @default null + * @summary 组件高度 + */ + height: null, + /** + * 可选值:left,right,center + * @type String + * @default "left" + * @summary 组件对齐方式 + */ + direction: 'left', + /** + * @summary 是否禁用 + * @type Boolean + * @default false + */ + disabled: false + }; +//////--------------------------------内部方法------------------------------ + /** + * 创建按钮 + * @param target 目标对象 + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + var bar = $(target); + //当按钮内没有内容时配置生效 + if (options.width) { + bar.width(options.width); + } + if (options.height) { + bar.height(options.height); + } + else { + options.height = bar.height(); + } + if (options.direction) { + bar.css("text-align", options.direction); + } + bar.addClass('buttonbar'); + if (options.backgroundColor != "") { + bar.css("background-color", options.backgroundColor); + } + var buttons = target.find('button'); + buttons.each(function (index, domEle) { + var btn = $(domEle); + var uiConfig = $.fn.parseUIConfig(btn); + if (btn.attr("id") || uiConfig.id) { + } + else { + btn.attr("id", bar.attr("id") + "_" + index); + } + if ($.fn.uiButton) { + if (!options.buttonBorder) { + btn.css('border', 'none'); + } + btn.uiButton(uiConfig); + } + }); + return target; + }; + + /** + * 设置不可用状态 + * @param target 目标对象 + * @param disabled + */ + var _setDisabled = function (target, disabled) { + var options = $.data(target[0], _cacheName).options; + var children = target.find('button'); + + //不可用时 + if (disabled || target.attr('disabled') == 'disabled') { + options.disabled = true; + children.each(function (index, domEle) { + var btn = $(domEle); + btn.uiButton('disable'); + btn.addClass('button_dis'); + }); + } + else { + options.disabled = false; + children.each(function (index, domEle) { + var btn = $(domEle); + btn.uiButton('enable'); + }); + } + }; +})(jQuery); +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiMenu'; + /** + * @class 菜单组件 + * @constructor uiMenu + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @returns {jQuery} jQuery对象 + * @example + * //采用默认值 + * $('#menu_simple').uiMenu(); + * //设置组件参数 + * $('#menu_simple').uiMenu({maxWidth:'200',minWidth:'100'}); + * //调用组件方法 + * $('#menu_simple').uiMenu('show',this); + */ + $.fn.uiMenu = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiMenu.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiMenu.defaults, me.parseUIConfig(), options) + }); + } + _init(me); + }); + }; + /** + * 方法 + * @lends uiMenu.prototype + */ + $.fn.uiMenu.methods = { + /** + * @summary 获取所有配置 + * @param target + * @returns {Json} + * @example + * $('#btn').uiMenu('options'); + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 显示menu,menu不会自己显示,必须调用show方法才能显示 + * @name uiMenu#show + * @function + * @param triggerObject 触发显示事件的对象,如点击的button触发的就是button对象 + * @example + * //通过点击button显示menu + * $('#btn').click(function(){ + * $('#menu_simple').uiMenu('show',this); + *}); + */ + show: function (target, triggerObject) { + return _show(target, triggerObject); + }, + /** + * @summary 隐藏组件 + * @name uiMenu#hide + * @function + * @returns {jQuery} 方法调用者 + */ + hide: function (target) { + return _hide({data:target}); + }, + /** + * @summary 将某个menuitem设置为disabled,设置之后menuitem将不会触发事件,如果有子菜单将不能打开子菜单,必须有menuItem。 + * @name uiMenu#disableItem + * @function + * @param itemId menuItem的ID + * @example + * //调用disableItem方法 + * $('#btn').click(function(){ + * $('#menu_simple').uiMenu('disableItem','001'); + *}); + */ + disableItem: function (target, itemId) { + return _disableItem(target, itemId); + }, + /** + * @summary 将某个menuitem设置为enable。 + * @name uiMenu#enableItem + * @function + * @param itemId menuItem的ID + * @example + * //调用enableItem方法 + * $('#btn').click(function(){ + * $('#menu_simple').uiMenu('enableItem','001'); + *}); + */ + enableItem: function (target, itemId) { + return _enableItem(target, itemId); + }, + /** + * @summary 移除组件 + * @name uiMenu#destroy + * @function + * @returns {jQuery} 方法调用者 + */ + destroy: function () { + return _destroy(); + } + }; + /** + * 默认配置 + * @lends uiMenu.prototype + */ + $.fn.uiMenu.defaults = + { + /** + * @summary 是否为右键菜单 + * @type Boolean + * @default false + * @example + * $("#menu_1").uiMenu({contextMenu:true}); + */ + contextMenu: false, + + /** + * @summary 最大宽度,如果menuItem文字长度超出了最大宽度,将会隐藏,鼠标移动到上面会有全文提示 + * @type Number + * @default 200 + * @example + * $("#menu_1").uiMenu({maxWidth:150}); + */ + maxWidth: 200, + + /** + * @summary 最小宽度,如果menuItem文字长度少于minWidth,则将使用空白填充。 + * @type Number + * @default 100 + * @example + * $("#menu_1").uiMenu({minWidth:50}); + */ + minWidth: 100, + + /** + * @summary 数据源,可以设置为json数据,也可以是url,如果不设置则为local,默认使用页面的dom元素生成Menu + * @type String + * @default local + * @example + * $("#menu_1").uiMenu({dataSource:'menuData.json'}); + */ + dataSource: 'local', + + /** + * @summary 当点击选择menu的时候触发的事件,item包含当前menuItem的所有数据。 + * @name uiMenu#onSelect + * @event + * @param item 当前menuItem的所有数据 + * @param event jQuery.Event对象 + * @type Function + * @default 无 + * @example + * $("#menu_1").uiMenu({ + * onSelect:function(item,event){ + * location.href = item.url; + * } + * }); + */ + onSelect: function (item, event) { + } + }; + //////--------------------------------内部方法------------------------------ + /** + * 初始化 + * @param target 目标对象 + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + target.setElemID(); + target.css({"minWidth": options.minWidth, "maxWidth": options.maxWidth}); + if (_IEunder6) { + target.css("width", options.minWidth); + } + if (_IE && webUI_browser().version == 7) { + target.css("width", options.maxWidth); + } + _create(target); + return target; + }; + var _create = function (target) { + // uiMenu 对 options 重设置支持不够全面,实际上也无多大必要 + var options = $.data(target[0], _cacheName).options; + var source = options.dataSource; + target.addClass('ui_menu-container ui_menu-content'); + target.css('position', 'absolute'); + if (source) { + if (source != 'local') { + if (typeof source == 'string') { + _ajaxLoad(target, source); + } else if (typeof source == 'object') { + target.append(_appendNodes(target, source)); + _bindEvent(target); + } + } else { + var firstMenu = target.children("ul").addClass("ui_menu"); + _parseDuiMenu(target, firstMenu); + _bindEvent(target); + } + } + }; + var _show = function (target, trigger) { + var options = $.data(target[0], _cacheName).options; + var top, left; + var triggerObject; + if (trigger.triggerObject) { + triggerObject = trigger.triggerObject; + options.triggerData = trigger.triggerData; + } else { + triggerObject = trigger; + } + var offSet = $(triggerObject).offset(); + if (options.contextMenu) { + options.triggerObject = triggerObject.target; + top = triggerObject.pageY; + left = triggerObject.pageX; + triggerObject.preventDefault(); + triggerObject.stopPropagation(); + triggerObject.cancelBubble = true; //IE + } else { + var bottomWidth = parseInt($(triggerObject).css('borderBottomWidth')); + top = offSet.top + $(triggerObject).height() + (bottomWidth != 'NaN' ? bottomWidth : 0) + 1; //1px作为调节距离 + left = offSet.left + 1; + } + var parent = target.parent(); + while (parent.css('position') == 'static' && parent[0].nodeName != 'BODY') { + parent = parent.parent(); + } + top -= parent.offset().top; + left -= parent.offset().left; + + target.children("ul.ui_menu").show(); + var width = target.width() * 0.7; + target.children("ul.ui_menu").children().each(function (index, li) { + var lic = $(li); + var lic_first = lic.find("span:first"); + if (lic_first.hasClass('ui_menu-item-sep')) { + lic_first.width('98%'); //分隔条宽度 + } else { + if (lic_first.width() > width) { + lic_first.width(lic.attr('aria-haspopup') ? width - 15 : width); + } + } + }); + if ((left + target.outerWidth()) > document.documentElement.clientWidth) { //当右边距离过短的时候会将提示框调整到左边 + left = left - target.outerWidth() - 5; + } + if ((top + target.outerHeight()) > document.documentElement.clientHeight) { //当下边距离过短的时候会将提示框调整到上边 + top = top - target.outerHeight() - 5; + } + target.css({"top": top, 'left': left}).show(); + $(document).bind('mousedown.uiMenu',target, _hide); + return target; + }; + var _disableItem = function (target, itemId) { + target.find("#" + itemId) + .addClass("ui_menu-disabled") + .unbind(".menuItem"); + return target; + }; + var _enableItem = function (target, itemId) { + var cli = target.find("#" + itemId); + cli.removeClass("ui_menu-disabled"); + _bindLiEvent(target, cli); + return target; + }; + var _destroy = function () { + var $doc = $(document), + handler; + while (handler = this.globalEvent.pop()) { + $doc.unbind(".uiMenu", handler); + } + }; + var _ajaxLoad = function (target, source) { + $.ajax({ + url: source, + method: 'GET', + dataType: 'json', + showLoading:false, + success: function (data) { + target.append(_appendNodes(target, data)); + _bindEvent(target); + return false; + } + }); + }; + var _appendNodes = function (target, source, index) { + var menuHtml = []; + var ulClass = (index == undefined) ? 'ui_menu' : 'ui_menu-content'; + var display = (index == undefined) ? 'block' : 'none'; + var imgClass = 'ui_menu-icon'; + menuHtml.push('
            '); + var childrenHtml = []; + $(source).each(function (index, item) { + var liID = target.getElemID() + '_' + item.id; + + function createItemHtml() { + var itemHtml = []; + if (item.icon || item.fontIcon) { + if (item.fontIcon && !_IEunder6) { + item.fontIcon.size = item.fontIcon.size || 16; + item.fontIcon.color = item.fontIcon.color || 'inherit'; + itemHtml.push(''); + } else { + itemHtml.push(''); + } + itemHtml.push('' + item.label + ''); + }else{ + itemHtml.push('' + item.label + ''); + } + return itemHtml.join(''); + } + + if (item.children != null) { + if (item.disabled === true || item.disabled == "true") { + childrenHtml.push('
          • '); + } else { + childrenHtml.push('
          • '); + } + childrenHtml.push(''); + //--TO-DO + childrenHtml.push(createItemHtml()); + childrenHtml.push(''); + childrenHtml.push(''); + childrenHtml.push(_appendNodes(target, item.children, index++)); + childrenHtml.push("
          • "); + } else { + if (item.disabled === true || item.disabled == "true") { + childrenHtml.push('
          • '); + } else { + childrenHtml.push('
          • '); + } + childrenHtml.push(''); + //--TO-DO + childrenHtml.push(createItemHtml()); + childrenHtml.push(''); + childrenHtml.push('
          • '); + } + if (item.seperator == "true" || item.seperator == true) { + childrenHtml.push('
          •  
          • '); + } + $.data(target[0], liID, item); + }); + menuHtml.push(childrenHtml.join('')); + menuHtml.push('
          '); + return menuHtml.join(''); + }; + + //处理页面编写dom节点的情况 + var _parseDuiMenu = function (target, element) { + if (element.parent().attr("aria-haspopup") == "true") { //判断是否为第一帧 + element.addClass("ui_menu-content"); + } + element.css('display', 'none'); + var lis = element.children(); + for (var i = 0; i < lis.length; i++) { + var li = $(lis[i]), liCul = li.children("ul"); + liCul.remove(); + var label = li.text(); + li.empty(); + if (liCul.length) { + li.append(liCul); + } + var liOpts = li.parseUIConfig(); + var liID = target.getElemID() + '_' + liOpts.id; + li[0].id = liID; + $.data(target[0], liID, liOpts); + var html = []; + html.push(''); + var imgClass = 'ui_menu-icon'; + if (liOpts.icon || liOpts.fontIcon) { + if (liOpts.fontIcon && !_IEunder6) { + liOpts.fontIcon.size = liOpts.fontIcon.size || 16; + liOpts.fontIcon.color = liOpts.fontIcon.color ||'inherit'; + html.push(''); + } else { + html.push(''); + } + html.push('' + label + ''); + }else{ + html.push('' + label + ''); + } + + if (liCul.length > 0) { + li.attr("aria-haspopup", "true"); + html.push(''); + _parseDuiMenu(target, liCul); + } + html.push(''); + li.prepend(html.join('')); + } + }; + var _showChildren = function (target, li) { + var options = $.data(target[0], _cacheName).options; + if (li && li.length > 0) { + var li_child_ul = li.children("ul").eq(0); + var left = li.width(); + if ((2 * left + li.offset().left) > document.documentElement.clientWidth) { //当右边距离过短的时候会将提示框调整到左边 + left = -left; + } + li_child_ul.css({minWidth: options.minWidth, left: left}); + li_child_ul.show(); + + li_child_ul.children().each(function (index, li) { + var lic = $(this); + if (lic.find("span:first").hasClass('ui_menu-item-sep')) { + lic.find("span:first").width('98%'); //分隔条宽度 + } else { + if (li_child_ul.width() > options.maxWidth) { + li_child_ul.width(options.maxWidth); + } else { + if (li_child_ul.attr('hasShow') == undefined) { + li_child_ul.width(li_child_ul.find('li:eq(0)>a:eq(0)').width() + 15); + li_child_ul.attr('hasShow', true); + } + } + lic.find("span.ui_menu-text").width(lic.width() - 45); + } + }); + } + }; + var _bindLiEvent = function (target, li) { + var options = $.data(target[0], _cacheName).options; + var lic = $(li); + var item = $.data(target[0], lic[0].id); //bug + lic.unbind('.menuItem') + .bind("mouseenter.menuItem", function () { + var self_li = $(this); + var width = self_li.parent().width(); + self_li.addClass("ui_menu-item-hover"); + if (_IE && webUI_browser().version == 9) { //解决bug AOM-576 + self_li.parent().width(width); + } + if (self_li.attr("aria-haspopup")) { + setTimeout(function () { + _showChildren(target, self_li); + }, 200); + } + }) + .bind("mouseleave.menuItem", function () { + var self_li = $(this); + self_li.removeClass("ui_menu-item-hover"); + setTimeout(function () { + self_li.children("ul").hide(); + }, 200); + }) + .bind("click.menuItem", function (event) { + if (options.onSelect) { + options.onSelect.call(target, item, event); + } + event.stopPropagation(); + }); + }; + + var _bindEvent = function (target) { + var uls = target.find("ul"), + lis = target.find("li"); + for (var i = 0; i < lis.length; i++) { + if (!$(lis[i]).hasClass("ui_menu-disabled") && !$(lis[i]).hasClass("ui_menu-sep-li")) { + _bindLiEvent(target, lis[i]); + } + } + for (var j = 0; j < uls.length; j++) { + $(uls[j]).bind("mouseleave.menuContainer", function () { + var ul = $(this); + if (ul.parent().attr("aria-haspopup") == "true") { + ul.hide(); + } + }); + } + }; + + var _hide = function (e) { + var target = e.data; + if($(e.target).closest(target).length == 0) { + target.find("ul").css("display", "none"); + target.find("li.ui_menu-item-hover").each(function (index, item) { + $(item).removeClass("ui_menu-item-hover"); + }); + target.hide(); + $(document).unbind('mousedown.uiMenu'); + } + }; +})(jQuery); +/** + * Created by jinxs on 14-6-24. + * 依赖: + * ui.core.js + * ui.button.js + * ui.buttonbar.js + * ui.draggable.js + * ui.resizable.js + * ui.mask.js + * ui.loading.js + * ui.position.js + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiPanel'; + var loadingID = 'palLoading'; + /** + * @class 面板 + * @requires {@link uiButton} + * @constructor uiPanel + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * // 构件组件 + * $('#divMenu').uiPanel({width: 160, height: 500}); + * // 调用组件方法{@link options} + * $('#divMenu').uiPanel("options"); + */ + $.fn.uiPanel = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiPanel.methods[options](this, param); + } + return this.each(function () { + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiPanel.defaults, $.fn.parseUIConfig(me, null), options) + }); + } + _init(me); + }); + }; + /** + * 方法 + * @lends uiPanel.prototype + */ + $.fn.uiPanel.methods = { + /** + * @summary 获得组件的数据 + * @name uiPanel#data + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + data: function (target) { + return $.data(target[0], _cacheName); + }, + /** + * @summary 获得组件的面板对象 + * @name uiPanel#options + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + options: function (target) { + return target.data(_cacheName).options; + }, + /** + * @summary 获得组件的面板对象 + * @name uiPanel#panel + * @function + * @returns {jQuery} 组件的面板对象的内容 + */ + panel: function (target) { + return target; + }, + /** + * @summary 获得组件的标题对象 + * @name uiPanel#header + * @function + * @returns {jQuery} 组件的面板对象的内容 + */ + header: function (target) { + return $.getByParentID(target.getElemID(), $.uiTemplate.panel.header); + }, + /** + * @summary 设置组件的图标 + * @name uiPanel#icon + * @function + * @returns {jQuery} 组件的面板对象的内容 + */ + icon: function (target) { + return $.getByParentID(target.getElemID(), $.uiTemplate.panel.icon); + }, + /** + * @summary 获得组件的标题文本 + * @name uiPanel#title + * @function + * @returns {jQuery} 组件的面板对象的内容 + */ + title: function (target) { + return $.getByParentID(target.getElemID(), $.uiTemplate.panel.title); + }, + /** + * @summary 获得组件的工具栏 + * @name uiPanel#toolbar + * @function + * @returns {jQuery} 组件的面板对象的内容 + */ + toolbar: function (target) { + return $.getByParentID(target.getElemID(), $.uiTemplate.panel.toolbar); + }, + /** + * @summary 获得组件的内容 + * @name uiPanel#content + * @function + * @returns {jQuery} 组件的面板对象的内容 + */ + content: function (target) { + return $.getByParentID(target.getElemID(), $.uiTemplate.panel.content); + }, + /** + * @summary 获得组件的按钮栏 + * @name uiPanel#buttonbar + * @function + * @returns {jQuery} 组件的面板对象的内容 + */ + buttonbar: function (target) { + return $.getByParentID(target.getElemID(), $.uiTemplate.panel.buttonbar); + }, + /** + * @summary 设置组件是否显示内容区边框 + * @name uiPanel#border + * @param show {boolean}是否显示边框 + * @function + * @returns {Object} 组件的面板对象 + */ + border: function (target, show, borderWidth) { + _contentBorder(target, show, borderWidth); + return target; + }, + /** + * @summary 刷新组件 + * @name uiPanel#refresh + * @param url {String} 地址 + * @function + * @returns {Object} 组件的面板对象 + */ + refresh: function (target, url) { + if (url) { + $.data(target[0], _cacheName).options.url = url; + } + _renderContent(target, true); + return target; + }, + /** + * @summary 折叠组件 + * @name uiPanel#collapse + * @param target + * @param animate {boolean}是否有动画 + * @returns {Object} 组件的面板对象 + */ + collapse: function (target, animate) { + _collapsed(target, animate); + return target; + }, + /** + * @summary 展开组件 + * @name uiPanel#collapse + * @param target + * @param animate {boolean}是否有动画 + * @returns {Object} 组件的面板对象 + */ + expand: function (target, animate) { + _expand(target, animate); + return target; + }, + /** + * @summary 调整组件的大小 + * @name uiPanel#resize + * @param target + * @param position {String} 位置 + * @returns {Object} 组件的面板对象 + */ + resize: function (target, position) { + var opts = $.data(target[0], _cacheName).options; + if (position != undefined) { + if (position.left != undefined) { + opts.left = position.left; + } + if (position.top != undefined) { + opts.top = position.top; + } + if (position.width != undefined) { + opts.width = position.width; + } + if (position.height != undefined) { + opts.height = position.height; + } + if (position.zIndex != undefined) { + opts.zIndex = position.zIndex; + } + } + _resize(target); + return target; + }, + /** + * @summary 打开组件 + * @name uiPanel#open + * @param target + * @param forceOpen {boolean}是否强制打开 + * @returns {Object} 组件的面板对象 + */ + open: function (target, forceOpen) { + _open(target, forceOpen); + return target; + }, + /** + * @summary 关闭组件 + * @name uiPanel#close + * @param target + * @param forceClose {Boolean}是否强制关闭 + * @returns {Object} 组件的面板对象 + */ + close: function (target, forceClose) { + _close(target, forceClose); + return target; + }, + /** + * @summary 移除组件 + * @name uiPanel#destroy + * @param target + * @param forceDestroy {Boolean} 在'forceDestroy'参数设置为true的时候,销毁面板时将跳过'onBeforeDestory'回调函数。 + * @returns {Object} 组件的面板对象 + */ + destroy: function (target, forceDestroy) { + _destory(target, forceDestroy); + return target; + } + }; + /** + * 默认配置 + * @lends uiPanel.prototype + */ + $.fn.uiPanel.defaults = { + /** + * @type String + * @default "" + * @summary 设置组件的ID + */ + id: '', + /** + * @type Boolean + * @default false + * @summary true时,页面需要引用animate.css + */ + animate:true, + /** + * @type String + * @default "" + * @summary 打开时的动画样式名称 + */ + animateOpen:'fadeIn', + /** + * @type String + * @default "" + * @summary 关闭时的动画样式名称 + */ + animateClose:'fadeOut', + /** + * @type Boolean + * @default true + * @summary true时,panel只能在父容器边框内,false时,panel可以超出父容器边框 + */ + inContainer: true, + /** + * 样式枚举:

          + * + * + * + * + * + * + * + * + * + *
          名称说明
          ui_panel_primary主样式
          ui_panel_success成功样式
          ui_panel_info信息样式
          ui_panel_warning警告样式
          ui_panel_danger危险样式
          + * @type String + * @default "" + * @summary 设置组件的风格 + */ + panelStyle: '', + /** + * @type Boolean + * @default false + * @summary 设置组件是否自动填充 + */ + autoFit: false, + /** + * @type String + * @default "" + * @summary 指示组件图标 + */ + icon: '', + /** + * 属性说明:

          + * + * + * + * + * + * + * + *
          属性说明
          icon图标样式
          color颜色
          size大小(像素)
          + * @type Object + * @default null + * @summary 使用奥森字体图标,示例{ icon:'fa-comments-o',color:'#FF0000',size:20} + */ + fontIcon: null, + /** + * @type Object + * @default null + * @summary 指示组件的上边距(支持Number、百分比) + */ + top: null, + /** + * @type Object + * @default null + * @summary 指示组件的左边距(支持Number、百分比) + */ + left: null, + /** + * @type String + * @default "" + * @summary 指示组件标题 + */ + title: '', + showTitle: true, + /** + * @type Boolean + * @default false + * @summary 是否初始化组件的框架内容 + */ + iniframe: false, + /** + * 可选值有get, post + * @type String + * @default "post" + * @summary 向指定的url请求数据时使用的方法 + */ + method: 'get', + /** + * @type String + * @default "" + * @summary 指定远程数据加载的url + */ + url: '', + /** + * @type Boolean + * @default true + * @summary 指示组件在加载远程数据时是否显示加载进度条 + */ + showLoading: true, + /** + * @type Boolean + * @default false + * @summary 请求框架内容时是否设置随机参数 + */ + urlRandomParam: false, + /** + * @type Boolean + * @default false + * @summary 设置组件是否打开时刷新 + */ + updateOnOpen: false, + /** + * @type Boolean + * @default false + * @summary 设置组件是否延时加载 + */ + lazyLoad: false, + /** + * @type Boolean + * @default true + * @summary 设置组件是否只有首次时加载 + */ + firstLoad: true, + /** + * @type Object + * @default {} + * @summary 指示组件的请求参数 + */ + queryParams: {}, + /** + * @type String + * @default "" + * @summary 指示组件的内容 + */ + content: '', + /** + * @type Boolean + * @default true + * @summary 设置组件是否显示边框 + */ + border: true, + /** + * @type Number + * @default 1 + * @summary 设置组件边框宽度,仅border为ture时有效 + */ + borderWidth: 1, + /** + * @type String + * @default 0px + * @summary 设置组件内边距 + */ + padding: '0px', + /** + * @type Object + * @default 0 + * @summary 指示组件的最小宽度(支持Number、百分比) + */ + minWidth: 0, + /** + * @type Object + * @default 0 + * @summary 指示组件的最小高度(支持Number、百分比) + */ + minHeight: 0, + /** + * @type Object + * @default 0 + * @summary 指示组件的宽度(支持Number、百分比) + */ + width: 0, + /** + * @type Object + * @default 0 + * @summary 指示组件的高度(支持Number、百分比) + */ + height: 0, + /** + * @type Boolean + * @default true + * @summary 指示组件是否显示标题栏 + */ + showHeader: true, + /** + * @type Boolean + * @default false + * @summary 指示组件是否显示按钮栏 + */ + showBtnBar: false, + /** + * @type Array + * @default [] + * @summary 设置组件的buttons值 + */ + buttons: [], + /** + * 可选值:left,right,center + * @type String + * @default "center" + * @summary 组件按钮栏的对齐方式 + */ + btnBarDir: 'center', + /** + * @type Boolean + * @default false + * @summary 指示组件是否可拖拽 + */ + draggable: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否可调整大小 + */ + resizable: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否可关闭 + */ + closable: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否默认关闭 + */ + closed: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否可最大化 + */ + maximizable: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否默认最大化 + */ + maximized: false, + /** + * @type Array + * @default [15,15,15,15] + * @summary 组件最大化时与父容器的间距(上、左、下、右) + */ + maxPadding: [0, 0, 0, 0], + /** + * @type Boolean + * @default false + * @summary 指示组件是否可折叠 + */ + collapsible: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否默认折叠 + */ + collapsed: false, + /** + * @type object + * @default null + * @summary 指示组件拖拽的对象 + */ + dragHandle: null, + /** + * @type Number + * @default 0 + * @summary 指示组件的zIndex + */ + zIndex: 0, + /** + * @event + * @name uiPanel#onBeforeCollapse + * @type function + * @default function () { } + * @summary 设置组件折叠之前的事件 + */ + onBeforeCollapse: function () { + }, + /** + * @event + * @name uiPanel#onCollapse + * @type function + * @default function () { } + * @summary 设置组件折叠时的事件 + */ + onCollapse: function () { + }, + /** + * @event + * @name uiPanel#onBeforeExpand + * @type function + * @default function () { } + * @summary 设置组件展开之前的事件 + */ + onBeforeExpand: function () { + }, + /** + * @event + * @name uiPanel#onExpand + * @type function + * @default function () { } + * @summary 设置组件展开时的事件 + */ + onExpand: function () { + }, + /** + * @event + * @name uiPanel#onBeforeOpen + * @type function + * @default function () { } + * @summary 设置组件打开之前的事件 + */ + onBeforeOpen: function () { + }, + /** + * @event + * @name uiPanel#onOpen + * @type function + * @default function () { } + * @summary 设置组件打开时的事件 + */ + onOpen: function () { + }, + /** + * @event + * @name uiPanel#onBeforeClose + * @type function + * @default function () { } + * @summary 设置组件关闭之前的事件 + */ + onBeforeClose: function () { + }, + /** + * @event + * @name uiPanel#onClose + * @type function + * @default function () { } + * @summary 设置组件关闭时的事件 + */ + onClose: function () { + }, + /** + * @event + * @name uiPanel#onBeforeDestroy + * @type function + * @default function () { } + * @summary 设置组件移除之前的事件 + */ + onBeforeDestroy: function () { + }, + /** + * @event + * @name uiPanel#onDestroy + * @type function + * @default function () { } + * @summary 设置组件移除时的事件 + */ + onDestroy: function () { + }, + /** + * @event + * @name uiPanel#onBeforeLoad + * @type function + * @default function () { } + * @summary 设置组件加载之前的事件 + */ + onBeforeLoad: function () { + }, + /** + * 若函数返回false,将不执行默认的错误处理 + * @event + * @name uiPanel#onLoadError + * @type function + * @default function () { } + * @summary 设置组件加载失败的事件,参数参见$.ajax.error + */ + onLoadError: function () { + }, + /** + * @event + * @name uiPanel#onLoadComplete + * @type function + * @default function () { } + * @summary 设置组件加载完成的事件 + */ + onLoadComplete: function () { + }, + /** + * @event + * @name uiPanel#onPanelResize + * @type function + * @default function () { } + * @summary 组件改变大小时触发 + */ + onPanelResize: function () { + } + }; + //////--------------------------------内部方法------------------------------ + /** + * 创建按钮 + * @param target 目标对象 + */ + var _init = function (target) { + var options = target.data(_cacheName).options; + var targetID; + if (options.id != '') { + target[0].id = options.id; + targetID = options.id; + } else { + target.setElemID(); + targetID = target.getElemID(); + options.id = targetID; + } + + var header, content, toolbar; + if (target.find('.ui_panel_content').length == 0) { + var contentHtml = target.children().detach(); + target.addClass('ui_panel'); + var reg = new RegExp('({palID})', 'g'); + target.append($.uiTemplate.panel.html.replace(reg, targetID)); + content = $.getByParentID(targetID, $.uiTemplate.panel.content); + content.append(contentHtml); + } else { + header = target.find('.ui_panel_header').setIDByParentID(targetID, $.uiTemplate.panel.header); + header.find('.ui_panel_icon').setIDByParentID(targetID, $.uiTemplate.panel.icon); + header.find('.ui_panel_title').setIDByParentID(targetID, $.uiTemplate.panel.title); + target.find('.ui_panel_content').setIDByParentID(targetID, $.uiTemplate.panel.content); + target.find('.ui_panel_buttonbar').setIDByParentID(targetID, $.uiTemplate.panel.buttonbar); + toolbar = target.find('.ui_panel_toolbar').setIDByParentID(targetID, $.uiTemplate.panel.toolbar); + toolbar.find('.ui_panel_toolbar_close').setIDByParentID(targetID, $.uiTemplate.panel.btnClose); + toolbar.find('.ui_panel_toolbar_max').setIDByParentID(targetID, $.uiTemplate.panel.btnMax); + } + if (options.panelStyle != '') { + target.addClass(options.panelStyle); + } + if (options.zIndex > 0) { + target.css('zIndex', options.zIndex); + } + _renderBtnBar(target);//兼容考虑 + if (options.closed == true) { + _close(target, true, true); + } else { + _open(target); + } + + return target; + }; + var _renderHeader = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var header = $.getByParentID(targetID, $.uiTemplate.panel.header); + var icon = $.getByParentID(targetID, $.uiTemplate.panel.icon); + var title = $.getByParentID(targetID, $.uiTemplate.panel.title); + if (!options.showHeader) { + header.remove(); + } + else { + icon.removeClass(); + if (options.fontIcon && !_IEunder6) { + options.fontIcon.size = options.fontIcon.size || 16; + options.fontIcon.color = options.fontIcon.color || 'inherit'; + icon.addClass('ui_panel_fontIcon fa').addClass(options.fontIcon.icon) + .css({color: options.fontIcon.color, fontSize: options.fontIcon.size}); + } else { + if (options.icon) { + if (options.icon.indexOf('.') > 0) { + icon.addClass('icon ui_panel_icon').html(""); + } else { + icon.addClass('icon ui_panel_icon ' + $.uiTemplate.iconStyle_Pre + options.icon); + } + } else { + icon.hide(); + } + } + if (options.showTitle) { + if (options.title) { + title.html(options.title); + } else { + title.hide(); + } + } else { + title.remove(); + } + } + }; + var _renderBtnBar = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var btnbar = $.getByParentID(targetID, $.uiTemplate.panel.buttonbar); + if (btnbar.length > 0 && options.showBtnBar) { + var buttons = options.buttons; + if (buttons.length > 0) { + for (var i = 0; i < buttons.length; i++) { + var btnOpts = buttons[i]; + var btn = $('').appendTo(btnbar); + btn.uiButton(btnOpts); + } + } + btnbar.uiButtonBar({direction: options.btnBarDir, height: 28, buttonBorder: true}); + } else { + btnbar.remove(); + } + }; + var _renderContent = function (target, refresh) { + refresh = refresh === undefined ? false : refresh; + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + if (options.padding != '') { + content.css('padding', options.padding); + } + options.onBeforeLoad.call(target); + if (!refresh && $.trim(content.html()) != "") { + content.addClass('overflowAuto'); + } else { + if (options.url != '') { + if (refresh) { + _loadContent(target); + } + } else { + content.addClass('overflowAuto'); + if (options.content) { + content.append(options.content); + } + options.onLoadComplete.call(target); + options.onOpen.call(target); + } + } + }; + var _loadContent = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var excludeId = '#' + targetID; + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + var tempHref = options.url; + + if (options.urlRandomParam) { + tempHref = $.urlAddRandom(options.url); + } + if (options.iniframe) { + content.removeClass('overflowAuto'); + var ifrm = $.getByParentID(targetID, 'iframe'); + var params = $.param(options.queryParams); + + if (params) { + tempHref += /\?/.test(tempHref) ? '&' : '?' + params; + } + if (options.showLoading) { + $.uiLoading.show({container: target, loadingID: loadingID, excludeSelector: excludeId}); + } + if (ifrm.length > 0) { + ifrm[0].src = tempHref; + } else { + var iframeID = $.getIDByParentID(targetID, 'iframe'); + ifrm = $(''); + ifrm.load(function () { + options.onLoadComplete.call(target); + options.onOpen.call(target); + if (options.showLoading) { + $.uiLoading.hide({container: target, loadingID: loadingID, excludeSelector: excludeId}); + } + }).appendTo(content); + } + } + else { + content.addClass('overflowAuto'); + $.ajax({ + type: options.method, + url: tempHref, + cache: true, + showLoading: false, + data: options.queryParams, + dataType: "html", + success: function (data) { + content.empty(); + content.append(data); + return false; + }, + complete: function () { + options.onLoadComplete.call(target); + options.onOpen.call(target); + }, + error: function (xhr) { + if (options.onLoadError.apply(target, arguments) !== false) { + content.append(xhr.responseText); + } + return false; + } + }); + } + }; + var _resizable = function (target) { + var options = $.data(target[0], _cacheName).options; + if (options.resizable) { + var targetID = target.getElemID(); + var btnbar = $.getByParentID(targetID, $.uiTemplate.panel.buttonbar); + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + var header = $.getByParentID(targetID, $.uiTemplate.panel.header); + var resizeHand = $('
          ').setIDByParentID(targetID, $.uiTemplate.panel.resizeHand).appendTo(target) + .css({zIndex: parseInt(target.css("zIndex")) + 1, position: 'absolute', right: 0, bottom: 0}); + target.resizable({ + minWidth: $.parseWH('minWidth', options.minWidth, target.parent()), + minHeight: $.parseWH('minHeight', options.minHeight, target.parent()), + onStartResize: function () { + target.addClass('ui_panel_proxy'); + content.height(0); + }, + onResize: function () { + }, + onStopResize: function (e) { + target.removeClass('ui_panel_proxy'); + var pos = target.position(); + options.top = pos.top; + options.left = pos.left; + options.width = target.width(); + options.height = target.height(); + if (options.inContainer) { + var d = e.data; + var tar = $(d.target); + var par = $(d.parent); + if (d.left + tar.outerWidth() > par.width()) { + options.width = par.width() - d.left; + } + if (d.top + tar.outerHeight() > par.height()) { + options.height = par.height() - d.top; + } + } + _resize(target); + return false; + } + }); + } + }; + var _draggable = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var header = $.getByParentID(targetID, $.uiTemplate.panel.header); + var title = $.getByParentID(targetID, $.uiTemplate.panel.title); + if (options.draggable) { + if (!options.dragHandle) { + if (options.showHeader) { + options.dragHandle = title; + } + } + target.draggable({ + handle: options.dragHandle, + proxy: function (source) { + var p = $('
          '); + p.appendTo('body'); + return p; + }, + onStartDrag: function () { + target.hide(); + }, + onStopDrag: function (e) { + if (options.inContainer) { + var d = e.data; + if (d.left < 0) { + d.left = 0 + } + if (d.top < 0) { + d.top = 0 + } + if (d.left + $(d.target).outerWidth() > $(d.parent).width()) { + d.left = $(d.parent).width() - $(d.target).outerWidth(); + } + if (d.top + $(d.target).outerHeight() > $(d.parent).height()) { + d.top = $(d.parent).height() - $(d.target).outerHeight(); + } + target.css({ + left: d.left, + top: d.top + }); + } + options.top = parseInt(target.css("top")); + options.left = parseInt(target.css("left")); + target.show(); + } + }); + } + }; + var _maximizable = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var btnMax = $.getByParentID(targetID, $.uiTemplate.panel.btnMax); + var toolbar = $.getByParentID(targetID, $.uiTemplate.panel.toolbar); + var header = $.getByParentID(targetID, $.uiTemplate.panel.header); + if (options.maximizable) { + if (btnMax.length > 0) { + btnMax.show(); + } else { + btnMax = $('' + + '') + .setIDByParentID(targetID, $.uiTemplate.panel.btnMax).appendTo(toolbar); + } + btnMax.unbind("click.panel").bind("click.panel", function (e) { + if (options.maximized) { + options.maximized = false; + _isMax(target, false); + } + else { + options.maximized = true; + _isMax(target, true); + } + _resize(target); + e.stopPropagation(); + }); + header.unbind("dblclick").bind("dblclick", function (e) { + btnMax.click(); + e.stopPropagation(); + }); + } + else { + if (btnMax.length > 0) { + btnMax.hide(); + } + } + }; + var _isMax = function (target, isMax) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + if (options.maximizable) { + var btnMax_icon = $.getByParentID(targetID, $.uiTemplate.panel.btnMax_Icon); + var resizeHand = $.getByParentID(targetID, $.uiTemplate.panel.resizeHand); + if (isMax) { + btnMax_icon.removeClass('icon_pal_max').addClass('icon_pal_min'); + if (options.draggable) { + target.draggable("disable"); + } + if (options.resizable) { + target.resizable("disable"); + resizeHand.hide(); + } + } + else { + btnMax_icon.removeClass('icon_pal_min').addClass('icon_pal_max'); + if (options.draggable) { + target.draggable("enable"); + } + if (options.resizable) { + target.resizable("disable"); + target.resizable("enable"); + resizeHand.show(); + } + } + } + }; + var _closeable = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var btnClose = $.getByParentID(targetID, $.uiTemplate.panel.btnClose); + var toolbar = $.getByParentID(targetID, $.uiTemplate.panel.toolbar); + if (options.closable) { + if (btnClose.length > 0) { + btnClose.show(); + } else { + btnClose = $('' + + '') + .setIDByParentID(targetID, $.uiTemplate.panel.btnClose).appendTo(toolbar); + } + btnClose.unbind("click").bind("click", function (e) { + _close(target); + e.stopPropagation(); + }); + } + else { + if (btnClose.length > 0) { + btnClose.hide(); + } + } + }; + var _collapsible = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var btnColl = $.getByParentID(targetID, $.uiTemplate.panel.btnColl); + var toolbar = $.getByParentID(targetID, $.uiTemplate.panel.toolbar); + var header = $.getByParentID(targetID, $.uiTemplate.panel.header); + if (options.collapsible) { + if (btnColl.length > 0) { + btnColl.show(); + } else { + var iconClass = 'icon_pal_col'; + var iconTitle = '收缩'; + if (options.collapsed) { + iconClass = 'icon_pal_exp'; + iconTitle = '展开'; + } + btnColl = $('' + + '') + .setIDByParentID(targetID, $.uiTemplate.panel.btnColl).appendTo(toolbar); + } + var btnColl_icon = $.getByParentID(targetID, $.uiTemplate.panel.btnColl_Icon); + btnColl.unbind("click.panel").bind("click.panel", function (e) { + if (options.collapsed) { + btnColl_icon.removeClass('icon_pal_exp').addClass('icon_pal_col').attr('title', '收缩'); + _expand(target, false); + } + else { + btnColl_icon.removeClass('icon_pal_col').addClass('icon_pal_exp').attr('title', '展开'); + _collapsed(target, false); + } + e.stopPropagation(); + }); + header.unbind("click").bind("click", function (e) { + btnColl.click(); + // 这会阻止layout 上下的click事件使Panel不能展开 + //e.stopPropagation(); + }); + } + else { + if (btnColl.length > 0) { + btnColl.remove(); + } + } + }; + var _resize = function (target) { + var targetID = target.getElemID(); + var header = $.getByParentID(targetID, $.uiTemplate.panel.header); + var icon = $.getByParentID(targetID, $.uiTemplate.panel.icon); + var title = $.getByParentID(targetID, $.uiTemplate.panel.title); + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + var btnbar = $.getByParentID(targetID, $.uiTemplate.panel.buttonbar); + var toolbar = $.getByParentID(targetID, $.uiTemplate.panel.toolbar); + var options = $.data(target[0], _cacheName).options; + _contentBorder(target, options.border, options.borderWidth); + + var parent = target.parent(); + if (options.maximized) { + var pos = {left: 0, top: 0}; + pos.left = parent.scrollLeft(); + pos.top = parent.scrollTop(); + target.outerWidth(parent.width() - options.maxPadding[1] - options.maxPadding[3]); + target.outerHeight(parent.height() - options.maxPadding[0] - options.maxPadding[2]); + target.css('top', options.maxPadding[0] + pos.top); + target.css('left', options.maxPadding[1] + pos.left); + } else { + if (options.top) { + target.css('top', options.top); + } + if (options.left) { + target.css('left', options.left); + } + if (options.autoFit) { + target.autoFit(true, false); + } else { + target.autoFit(false); + options.width = $.parseWH("width", options.width, parent); + options.minWidth = $.parseWH("minWidth", options.minWidth, parent); + options.height = $.parseWH("height", options.height, parent); + options.minHeight = $.parseWH("minHeight", options.minHeight, parent); + var width = Math.max(Math.max(options.width, 0), options.minWidth || 0); + var height = Math.max(Math.max(options.height, 0), options.minHeight || 0); + target.outerWidth(width); + if (!options.collapsed) { + target.outerHeight(height); + } + } + } + var contentH = target.height(); + if (header.length > 0) { + contentH -= header.outerHeight(); + } + if (btnbar.length > 0 && options.showBtnBar) { + contentH -= btnbar.outerHeight(); + } + content.outerHeight(contentH); + content.outerWidth(target.width()); + _contentChildrenResize(content); + options.onPanelResize.call(target); + }; + var _open = function (target, forceOpen) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + if (forceOpen != true) { + if (options.onBeforeOpen.call(target) == false) { + return; + } + } + options.closed = false; + target.show(); + target.attr('closed', false); + content.attr('closed', false); + if (options.firstLoad) { + _renderHeader(target); + _draggable(target); + _resizable(target); + _maximizable(target); + _closeable(target); + _collapsible(target); + if (options.maximized) { + _resize(target); + _isMax(target, true); + } else { + _resize(target); + } + _renderContent(target, true); + + if (options.collapsed) { + var btnColl_icon = $.getByParentID(targetID, $.uiTemplate.panel.btnColl_Icon); + options.collapsed = false; + btnColl_icon.removeClass('icon_pal_col').addClass('icon_pal_exp').attr('title', '展开'); + _collapsed(target, false); + } + + target.bind("_resize", function () { + if (target.attr('closed') !== 'true' && options.maximized) { + _resize(target); + } + }); + options.firstLoad = false; + } + else { + target.width(options.tempWidth).height(options.tempHeight); + if (options.url != '' && options.updateOnOpen) { + _loadContent(target); + } else { + options.onOpen.call(target); + } + } + if(options.animate){ + target.removeClass('animated '+options.animateClose).addClass('animated '+options.animateOpen+' fast'); + } + + }; + var _close = function (target, forceClose, firstLoad) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + + if(options.closed){ + return; + } + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + if (forceClose != true) { + if (options.onBeforeClose.call(target) == false) { + return; + } + } + target.attr('closed', true); + content.attr('closed', true); + if (firstLoad) { + target.hide(); + return target; + } + options.closed = true; + var height=target.height(); + if(height>0) { + options.tempWidth = target.width(); + options.tempHeight = target.height(); + } + if(options.animate){ + target.removeClass('animated '+options.animateOpen).addClass('animated '+options.animateClose+' fast'); + setTimeout(function(){ + target.width(0).height(0); + options.onClose.call(target); + },500); + }else { + target.width(0).height(0); + options.onClose.call(target); + } + return target; + }; + var _destory = function (target, forceDestroy) { + var options = $.data(target[0], _cacheName).options; + if (forceDestroy != true) { + if (options.onBeforeDestroy.call(target) == false) { + return; + } + } + var content = target.uiPanel($.uiTemplate.panel.content); + content.destroyIframe(); + target.remove(); + options.onDestroy.call(target); + }; + var _contentBorder = function (target, showBorder, borderWidth) { + if (showBorder) { + target.css('borderWidth', borderWidth); + } else { + target.css('borderWidth', 0); + } + }; + var _collapsed = function (target, animate) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var header = $.getByParentID(targetID, $.uiTemplate.panel.header); + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + if (options.collapsed == true) { + return; + } + content.stop(true, true); + if (options.onBeforeCollapse.call(target) == false) { + return; + } + if (animate == true) { + target.animate({height: header.outerHeight()}, 'fast', function () { + _collControl(target, options, true); + options.onCollapse.call(target); + }); + } else { + target.outerHeight(header.outerHeight()); + _collControl(target, options, true); + options.onCollapse.call(target); + } + }; + var _expand = function (target, animate) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + if (options.collapsed == false) { + return; + } + content.stop(true, true); + if (options.onBeforeExpand.call(target) == false) { + return; + } + if (animate == true) { + target.animate({height: options.height}, 'fast', function () { + options.collapsed = false; + options.onExpand.call(target); + }); + } else { + target.outerHeight(options.height); + _collControl(target, options, false); + options.onExpand.call(target); + } + }; + var _collControl = function (target, options, coll) { + var targetID = target.getElemID(); + var content = $.getByParentID(targetID, $.uiTemplate.panel.content); + var btnbar = $.getByParentID(targetID, $.uiTemplate.panel.buttonbar); + var resizeHand = $.getByParentID(targetID, $.uiTemplate.panel.resizeHand); + var objs = content.find('OBJECT,IFRAME').length; + if (coll) { + btnbar.hide(); + resizeHand.hide(); + if (objs == 0) { + content.hide(); + } else { + content.width(0).height(0); + } + content.attr('closed', true); + options.collapsed = true; + } else { + btnbar.show(); + resizeHand.show(); + if (objs == 0) { + content.show(); + } + content.attr('closed', false); + content.autoFit(true, false); + options.collapsed = false; + _contentChildrenResize(content); + } + }; + var _contentChildrenResize = function (content) { + content.children().each(function () { + var elem = $(this); + elem.triggerHandler('_resize'); + }); + } +})(jQuery); + +/** + * Created by jinxs on 14-6-25. + * 依赖 + * ui.core.js + * ui.position.js + * ui.panel.js + */ +(function ($) { + /** + * @class 消息提示组件 + * @constructor uiMessagetip + * @type {{show: Function}} + */ + $.uiMessagetip = { + show: function (options, param) { + options = options || {}; + options = $.extend({}, $.uiMessagetip.defaults, options); + options.title = options.title || '提示'; + _show(options); + } + }; + /** + * 默认配置 + * @lends uiMessagetip.prototype + */ + $.uiMessagetip.defaults = { + /** + * @type String + * @default ui_panel_primary + * @summary 指示组件的面板风格 + */ + panelStyle: 'ui_panel_primary', + showHeader: true, + /** + * @type String + * @default "" + * @summary 指示组件的标题 + */ + title: '', + /** + * @type String + * @default "" + * @summary 指示组件的内容 + */ + content: '', + /** + * @type Number + * @default 200 + * @summary 指示组件的宽度 + */ + width: 200, + /** + * @type Number + * @default 100 + * @summary 指示组件的高度 + */ + height: 120, + /** + * @type Number + * @default 0 + * @summary 与容器之间的间隔 + */ + padding: 0, + /** + * @type Boolean + * @default true + * @summary 指示组件是否有动画效果 + */ + animate: true, + /** + * @type Boolean + * @default true + * @summary 指示组件是否固定 + */ + fixed: true, + /** + * @type Object + * @default $(document.body) + * @summary 指示组件的父容器 + */ + container: $(document.body), + /** + * @type String + * @default bottom + * @summary 指示组件的垂直位置 + */ + vertical: 'bottom', + /** + * @type String + * @default right + * @summary 指示组件的水平位置 + */ + horizontal: 'right', + /** + * @type Number + * @default 3000 + * @summary 指示组件的延时关闭时间 + */ + timeout: 3000, + /** + * @event + * @name uiMessagetip#onClose + * @type function + * @default function () { } + * @summary 指示组件的关闭事件 + */ + onClose: function () { + } + , zIndex: 99999 + } + var _close = function (messagebox, handler) { + handler ? handler() : jQuery.noop(); + messagebox.remove(); + }; + var _show = function (options) { + var onClose = options.onClose; + var messageBox = $('
          ').appendTo(options.container).hide(); + var msgboxWidth = options.width || 200; + var msgboxHeight = options.height || 120; + + var cont='
          ' + options.content + '
          '; + if ($.fn.uiPanel) { + messageBox.uiPanel({ + zIndex: options.zIndex, + icon: 'messagebox', + width: msgboxWidth, + height: msgboxHeight, + closable: true, + showHeader: options.showHeader, + title: options.title, + content: cont, + onClose: function () { + _close(messageBox, onClose); + } + }); + } + messageBox.addClass(options.panelStyle + " ui_messagetip"); + if (!options.showHeader) { + var divContent = messageBox.uiPanel("content"); + var btnClose = $('' + + '') + .setIDByParentID(messageBox[0].id, $.uiTemplate.panel.btnClose).appendTo(divContent); + btnClose.bind("click", function () { + messageBox.uiPanel("close"); + }); + switch (options.panelStyle) { + case "ui_panel_primary": + divContent.addClass("content_primary"); + break; + case "ui_panel_success": + divContent.addClass("content_success"); + break; + case "ui_panel_info": + divContent.addClass("content_info"); + break; + case "ui_panel_warning": + divContent.addClass("content_warning"); + break; + case "ui_panel_danger": + divContent.addClass("content_danger"); + break; + } + } + messageBox + .bind("keydown.messagebox", function (event) { + if (event.which == $.keyCode.ESCAPE) { + _close(messageBox, onClose); + } + }).hide(); + if (!options.animate || (_IE && _IEunder6)) { + messageBox.uiPosition({ + horizontal: options.horizontal, + vertical: options.vertical, + container: options.container, + fixed: options.fixed + }).show(); + } else { + switch (options.vertical) { + case 'top': + messageBox.uiPosition({ + horizontal: options.horizontal, + vertical: options.vertical, + container: options.container, + fixed: options.fixed + }).show(); + var top = parseInt(messageBox.css('top')) + options.padding; + messageBox.css({top: top - messageBox.height(), opacity: 0}); + if(options.horizontal=="left"){ + messageBox.animate({top: top,left:options.padding, opacity: 1}, 600); + }else{ + messageBox.animate({top: top,right:options.padding, opacity: 1}, 600); + } + break; + case 'center': + messageBox.uiPosition({ + horizontal: options.horizontal, + vertical: options.vertical, + container: options.container, + fixed: options.fixed + }).fadeIn(); + break; + case 'bottom': + messageBox.uiPosition({ + horizontal: options.horizontal, + vertical: options.vertical, + container: options.container, + fixed: options.fixed + }).show(); + var top = parseInt(messageBox.css('top')) - options.padding; + messageBox.css({top: top + messageBox.height(), opacity: 0}); + if(options.horizontal=="left"){ + messageBox.animate({top: top,left:options.padding, opacity: 1}, 600); + }else{ + messageBox.animate({top: top,right:options.padding, opacity: 1}, 600); + } + + break; + } + } + + var timer; + + function timeout(time) { + timer = setInterval(function () { + if (!options.animate || (_IE && _IEunder6)) { + _close(messageBox, onClose); + } else { + switch (options.vertical) { + case 'top': + var tmp_top = parseInt(messageBox.css('top')); + messageBox.animate({top: tmp_top - messageBox.height(), opacity: 0}, function () { + _close(messageBox, onClose); + }); + break; + case 'center': + messageBox.fadeOut(function () { + _close(messageBox, onClose); + }); + break; + case 'bottom': + var tmp_top = parseInt(messageBox.css('top')); + messageBox.animate({top: tmp_top + messageBox.height(), opacity: 0}, function () { + _close(messageBox, onClose); + }); + break; + } + } + clearInterval(timer); + }, time); + } + + if (options.timeout > 0) { //定时关闭 + timeout(options.timeout); + } + + messageBox.bind('mouseover', function () { + clearInterval(timer); + }).bind('mouseout', function () { + if (timer) { + timeout(options.timeout); + } + }); + $(window).bind("resize", function () { + if (messageBox.width > 0 && messageBox.height > 0) { + messageBox.uiPosition({ + horizontal: options.horizontal, + vertical: options.vertical, + container: options.container, + fixed: options.fixed + }); + } + }); + }; + +})(jQuery); +/** + * Created by jinxs on 14-6-25. + * 依赖 + * ui.core.js + * ui.button.js + * ui.buttonbar.js + * ui.draggable.js + * ui.resizable.js + * ui.position.js + * ui.panel.js + */ +(function ($) { + /** + * @class 消息框组件 + * @constructor uiMessagebox + * @type {{alert: Function, confirm: Function, prompt: Function}} + */ + $.uiMessagebox = { + /** + * @summary 显示提示消息框 + * @name uiMessagebox#alert + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + alert: function (options, param) { + options = options || {}; + options = $.extend({}, $.uiMessagebox.defaults, options); + options.title = options.title || '提示'; + options.type = options.type || 'alert'; + _show(options); + }, + /** + * @summary 显示确认消息框 + * @name uiMessagebox#confirm + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + confirm: function (options, param) { + options = options || {}; + options = $.extend({}, $.uiMessagebox.defaults, options); + options.title = options.title || '确认'; + options.type = 'confirm'; + _show(options); + }, + /** + * @summary 显示输入提示消息框 + * @name uiMessagebox#confirm + * @function + * @param options {Object} 组件的配置对象 + * @returns {jQuery} 组件对象 + */ + prompt: function (options, param) { + options = options || {}; + options = $.extend({}, $.uiMessagebox.defaults, options); + options.title = options.title || '请输入'; + options.type = 'prompt'; + _show(options); + } + }; + /** + * 默认配置 + * @lends uiMessagebox.prototype + */ + $.uiMessagebox.defaults = { + /** + * @type String + * @default alert + * @summary 指示消息框的类型 + */ + type: 'alert', + /** + * @type String + * @default "" + * @summary 指示消息框的标题 + */ + title: '', + maskID: 'mask', + /** + * @type String + * @default "" + * @summary 指示消息框的内容 + */ + content: '', + /** + * @type Boolean + * @default true + * @summary 指示消息框是否有动画效果 + */ + animate: true, + /** + * @type Number + * @default 2000 + * @summary 消息框动画持续的时间 + */ + timeout: 2000, + /** + * @type Object + * @default $(document.body) + * @summary 指示消息框打开后遮罩的范围 + */ + container: $(document.body), + /** + * @type Number + * @default null + * @summary 消息框的宽度 + */ + width: null, + /** + * @type Number + * @default null + * @summary 消息框的高度 + */ + height: null, + /** + * @type Boolean + * @default true + * @summary 指示消息框是否可拖拽 + */ + draggable: false, + maximizable: false, + zIndex: 889, + /** + * @event + * @name uiMessagebox#onClose + * @type function + * @default function () { } + * @summary 指示消息框关闭事件 + */ + onClose: function () { + } + }; + + var timer; + var _close = function (options, messageBox, mask, handler, value) { + timer && clearInterval(timer); + timer = null; + handler ? handler(value) : jQuery.noop(); + messageBox.remove(); + $.uiMask.remove({container: options.container, maskID: options.maskID}); + }; + var _show = function (options) { + var palID = 'msgBox_' + guidGenerator(); + options.maskID = palID + '-' + options.maskID; + var onClose = options.onClose; + var mask = $.uiMask.show({container: options.container, zIndex: options.zIndex, maskID: options.maskID}); + var okbtnHtml = $(''); + var cancelbtnHtml = $(''); + cancelbtnHtml.uiButton({ + onClick: function () { + _close(options, messageBox, mask, onClose, false); + } + }); + var msgboxWidth = 0; + var msgboxHeight = 0; + if ($.fn.uiButton) { + switch (options.type) { + case 'confirm': + msgboxWidth = options.width || 300; + msgboxHeight = options.height || 100; + okbtnHtml.uiButton({ + onClick: function () { + _close(options, messageBox, mask, onClose, true); + } + }); + break; + case 'prompt': + msgboxWidth = options.width || 250; + msgboxHeight = options.height || 120; + okbtnHtml.uiButton({ + onClick: function () { + var returnValue = onClose ? onClose($('#' + inputID).val()) : jQuery.noop(); + if (!returnValue) { + messageBox.remove(); + mask.remove(); + } + } + }); + break; + default: + msgboxWidth = options.width || 250; + msgboxHeight = options.height || 100; + okbtnHtml.uiButton({ + onClick: function () { + _close(options, messageBox, mask, onClose, true); + } + }); + if (options.timeout > 0 && options.type != 'error') { //定时关闭 + timeout(options.timeout); + } + } + } + var input = ''; + var inputID = guidGenerator(); + if (options.type == 'prompt') { + input = '
          '; + } + var content = '' + + '
          ' + options.content + input + '
          '; + + var messageBox = $('
          ').appendTo(options.container).hide().uiPanel({ + id: palID, + zIndex: options.zIndex + 1, + icon: 'messagebox', + draggable: options.draggable, + maximizable: options.maximizable, + maxPadding: [10, 10, 10, 10], + showBtnBar: true, + width: msgboxWidth, + height: msgboxHeight, + closable: true, + title: options.title, + content: content, + onClose: function () { + _close(options, messageBox, mask, onClose, false); + } + }); + var btnbars = messageBox.uiPanel('buttonbar'); + okbtnHtml.appendTo(btnbars); + switch (options.type) { + case 'alert': + messageBox.addClass('ui_panel_primary'); + break; + case 'success': + messageBox.addClass('ui_panel_success'); + okbtnHtml.addClass('button_success'); + break; + case 'error': + messageBox.addClass('ui_panel_danger'); + okbtnHtml.addClass('button_cancel'); + okbtnHtml.uiButton('setIcons', {left: 'icon_close'}); + okbtnHtml.uiButton('setLabel', '关闭'); + break; + case 'question': + messageBox.addClass('ui_panel_info'); + break; + case 'warning': + messageBox.addClass('ui_panel_warning'); + okbtnHtml.addClass('button_warning'); + break; + case 'confirm': + messageBox.addClass('ui_panel_primary'); + okbtnHtml.addClass('button_submit'); + cancelbtnHtml.appendTo(btnbars); + break; + case 'prompt': + messageBox.addClass('ui_panel_primary'); + okbtnHtml.addClass('button_submit'); + cancelbtnHtml.appendTo(btnbars); + break; + default: + messageBox.addClass('ui_panel_primary'); + break; + } + messageBox.bind("keydown.messagebox", function (event) { + if (event.which == $.keyCode.ESCAPE) { + _close(options, messageBox, mask, onClose, false); + } + }).fadeIn().uiPosition({ + horizontal: 'center', + vertical: 'center', + container: options.container, + fixed: false + }); + $(window).bind("resize", function () { + if (mask.is(':visible')) { + messageBox.uiPosition({ + horizontal: 'center', + vertical: 'center', + container: options.container, + fixed: options.fixed + }); + } + }); + + function timeout(time) { + timer && clearInterval(timer); + timer = setInterval(function () { + if (!options.animate || _IEunder6) { + _close(options, messageBox, mask, onClose, false); + } else { + messageBox.fadeOut(function () { + _close(options, messageBox, mask, onClose, false); + }); + } + clearInterval(timer); + timer = null; + }, time); + } + + messageBox.bind('mouseover', function () { + timer && clearInterval(timer); + timer = null; + }).bind('mouseout', function () { + if (options.timeout > 0 && options.type != 'error') { //定时关闭 + timeout(options.timeout); + } + }); + okbtnHtml.focus(); + }; +})(jQuery); +/** + * Created by jinxs on 14-6-25. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiDialog'; + + /** + * @class 对话框 + * @extends uiPanel + * @requires {@link uiPanel} + * @constructor uiDialog + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * // 构件组件 + * $('#divDialog').uiDialog({title: '面板测试', width: 160, height: 500}); + * // 调用组件方法open + * $('#divDialog').uiDialog("open"); + */ + $.fn.uiDialog = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiDialog.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiDialog.defaults, $.fn.parseUIConfig(me, null), options) + }); + } + _init(me); + }); + }; + + $.fn.uiDialog.methods = $.extend({}, $.fn.uiPanel.methods, + /** + * 方法 + * @lends uiDialog.prototype + */ + { + /** + * @summary 打开对话框 + * @name uiDialog#open + * @function + * @param [opts] {Object} 配置对象,具有属性forceOpen、horizontal、vertical,url + * @returns {jQuery} 方法调用者 + */ + open: function (target, opts) { + opts = opts || {}; + var options = $.data(target[0], _cacheName).options; + var palOpts = target.uiPanel('options'); + var id = '#' + target.attr('id'); + palOpts = $.extend(palOpts, opts); + if (palOpts.maximized) { + target.width(palOpts.width).height(palOpts.height); + setPos(); + palOpts.left = parseInt(target.css('left')); + palOpts.top = parseInt(target.css('top')); + target.uiPanel('open', palOpts.forceOpen); + setPos(); + } + else { + target.uiPanel('open', palOpts.forceOpen); + setPos(); + palOpts.left = parseInt(target.css('left')); + palOpts.top = parseInt(target.css('top')); + } + function setPos() { + target.uiPosition({ + horizontal: palOpts.horizontal == undefined ? 'center' : palOpts.horizontal, + vertical: palOpts.vertical == undefined ? 'center' : palOpts.vertical, + container: options.maskContainer, + fixed: false + }); + } + + return target; + }, + /** + * @summary 关闭对话框 + * @name uiDialog#close + * @function + * @param forceClose {Boolean} 是否强制关闭(忽略onBeforeClose事件返回的false) + * @returns {jQuery} 方法调用者 + */ + close: function (target, forceClose) { + var options = $.data(target[0], _cacheName).options; + var id = '#' + target.attr('id'); + target.uiPanel('close', forceClose); + return target; + }, + /** + * @summary 添加对话框按钮 + * @name uiDialog#buttonbar + * @function + * @param buttonConfig {Array} 按钮配置列表 + * @returns {jQuery} 方法调用者 + */ + buttonbar: function (target, buttonConfig) { + _renderBtnbar(target, buttonConfig); + return target; + }, + /** + * @summary 获取对话框按钮对象 + * @name uiDialog#button + * @param buttonID {String} 按钮ID + * @function + * @returns {jQuery} 按钮 + */ + button: function (target, buttonID) { + return $('#' + buttonID); + }, + /** + * TODO: + * @summary setUserParam + * @name uiDialog#setUserParam + * @function + * @returns {jQuery} 方法调用者 + */ + setUserParam: function (target, userparam) { + return target.each(function(){ + $.data(this, _cacheName).options.userParam = userparam; + }); + }, + /** + * TODO: + * @summary getUserParam + * @name uiDialog#getUserParam + * @function + * @returns {Object} 按钮 + */ + getUserParam: function (target, userparam) { + var options = $.data(target[0], _cacheName).options; + return options.userParam; + } + }); + + $.fn.uiDialog.defaults = $.extend({}, $.fn.uiPanel.defaults, + /** + * 默认配置 + * @lends uiDialog.prototype + */ + { + /** + * @type String + * @default ui_panel + * @summary 对话框面板样式 + */ + panelStyle: 'ui_panel', + /** + * @type Array + * @default [15,15,15,15] + * @summary 组件最大化时与父容器的间距(上、左、下、右) + */ + maxPadding: [15, 15, 15, 15], + /** + * @type Boolean + * @default true + * @summary 对话框是否可拖动 + */ + draggable: true, + /** + * @type Boolean + * @default true + * @summary 对话框是否可改变大小 + */ + resizable: true, + /** + * @type Boolean + * @default true + * @summary 对话框是否可关闭 + */ + closable: true, + /** + * @type Boolean + * @default true + * @summary 对话框是否可最大化 + */ + maximizable: true, + /** + * @type Boolean + * @default false + * @summary 对话框是否包含遮罩 + */ + mask: false, + /** + * @type jQuery + * @default $("body") + * @summary 对话框遮罩范围对象 + */ + maskContainer: null, + /** + * @type Array + * @default [] + * @summary 对话框按钮配置对象列表 + */ + buttons: [] + , zIndex: 888 + }); +//////--------------------------------内部方法------------------------------ + /** + * 创建按钮 + * @param target 目标对象 + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + var content = target.children();//.detach(); // detach 后无法在uiPanel中显示 + var btnVisible = false; + var btnLen = options.buttons.length; + target.addClass('ui_dialog'); + if (options.maskContainer == null) { + options.maskContainer = target.parent(); + } + if (btnLen > 0) { + btnVisible = true; + } + var id = '#' + target.attr('id'); + var maskID = target.getElemID() + '-dialog_mask'; + + function showMask() { + if (options.mask) { + $.uiMask.show({ + container: options.maskContainer, + maskID: maskID, + zIndex: options.zIndex - 1, + excludeSelector: id + }); + } + } + + function hideMask() { + if (options.mask) { + $.uiMask.hide({container: options.maskContainer, maskID: maskID, excludeSelector: id}); + } + } + + target.uiPanel($.extend({}, options, { + showBtnBar: btnVisible || options.showBtnBar, + closed: true, + content: content, + onBeforeOpen: function () { + options.onBeforeOpen.call(target); + showMask(); + }, + onClose: function () { + options.onClose.call(target); + hideMask(); + } + })); + $(window).bind("resize", function () { + if (target.attr('closed') == 'false') { + target.uiPosition({horizontal: 'center', vertical: 'center', container: options.maskContainer}); + } + }); + return target; + }; +})(jQuery);/** + * Created by jinxs on 14-7-11. + * 基于easyui.pagination源码 + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiPagination'; + /** + * @class 分页组件 + * @constructor uiPagination + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * //采用默认值 + * $('#pag').uiPagination(); + * //设置组件参数 + * $('#pag').uiPagination({total:'1',pageSize:'20'}); + * //调用组件方法 + * $('#pag').uiPagination('refresh',[options]); + */ + $.fn.uiPagination = function (options, param) { + if (this.length > 0 && typeof options == "string") { + return $.fn.uiPagination.methods[options](this.first(), param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiPagination.defaults, me.parseUIConfig(), options) + }); + } + _init(me); + _calc(me); + }); + }; + /** + * 方法 + * @lends uiAccordion.prototype + */ + $.fn.uiPagination.methods = { + /** + * @summary 获得组件的配置对象 + * @name uiPagination#options + * @function + * @returns {Object} 组件的配置对象 + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 在组件加载时触发的方法。 + * @event + * @name uiPagination#loading + * @this 组件jQuery对象 + * @default function (target) + */ + loading: function (target) { + _loadState(target, true); + return target; + }, + /** + * @summary 在组件加载完触发的方法。 + * @event + * @name uiPagination#loaded + * @this 组件jQuery对象 + * @default function (target) + */ + loaded: function (target) { + _loadState(target, false); + return target; + }, + /** + * @summary 在组件刷新时触发的方法。 + * @event + * @name uiPagination#refresh + * @this 组件jQuery对象 + * @default function (target) + */ + refresh: function (target, options) { + _calc(target, options); + return target; + }, + /** + * @summary 在选择数据时触发的方法。 + * @event + * @name uiPagination#refresh + * @this 组件jQuery对象 + * @default function (target) + */ + select: function (target, pageIndex) { + _selectPageEvent(target, pageIndex); + return target; + } + }; + /** + * 默认配置 + * @lends uiPagination.prototype + */ + $.fn.uiPagination.defaults = { + + /** + * @type Number + * @default 1 + * @summary 指示记录总数 + */ + total: 0, + /** + * @type Number + * @default 20 + * @summary 指示组件的页面大小 + */ + pageSize: 20, + /** + * @type Array + * @default 1 + * @summary 指示组件的起始页 + */ + pageIndex: 1, + /** + * @type Array + * @default [10,20,30,50] + * @summary 指示组件的页面大小选择项 + */ + pageList: [10, 20, 30, 50], + /** + * @type Boolean + * @default true + * @summary 指示组件是否加载数据 + */ + loading: false, + /** + * @type Boolean + * @default true + * @summary 指示组件是否显示页数列表 + */ + showPageList: true, + /** + * @type Boolean + * @default true + * @summary 指示组件是否显示刷新 + */ + showRefresh: true, + /** + * @type String + * @default "" + * @summary 指示组件显示的消息 + */ + displayMsg: '', + /** + * @type String + * @default "" + * @summary 指示组件页数之前显示的文本 + */ + beforePageText: '', + /** + * @type String + * @default "" + * @summary 指示组件页数之后显示的文本 + */ + afterPageText: '', + /** + * @summary 在选择页数时触发的方法。 + * @event + * @name uiPagination#onSelectPage + * @this 组件jQuery对象 + * @default emptyFn + */ + onSelectPage: function (pageIndex, pageSize) { + }, + /** + * @summary 在组件刷新之前触发的方法。 + * @event + * @name uiPagination#onBeforeRefresh + * @this 组件jQuery对象 + * @default emptyFn + */ + onBeforeRefresh: function (pageIndex, pageSize) { + }, + /** + * @summary 在组件刷新时触发的方法。 + * @event + * @name uiPagination#onRefresh + * @this 组件jQuery对象 + * @default emptyFn + */ + onRefresh: function (pageIndex, pageSize) { + }, + /** + * @summary 在页面大小发生变化时触发的方法。 + * @event + * @name uiPagination#onChangePageSize + * @this 组件jQuery对象 + * @default emptyFn + */ + onChangePageSize: function (pageSize) { + } + }; + var _init = function (target) { + var cache = $.data(target[0], _cacheName); + var options = cache.options; + target.setElemID().addClass('ui_pagination'); + var targId = target.getElemID(); + var reg=new RegExp('({pageID})','g'); + target.html($($.uiTemplate.pagination.replace(reg, targId)).html()); + var pageInput = $.getByParentID(targId, 'input'); + var sel_pagesize = $.getByParentID(targId, 'pagesize'); + var btnFirst = $.getByParentID(targId, 'first'); + var btnPrev = $.getByParentID(targId, 'prev'); + var btnNext = $.getByParentID(targId, 'next'); + var btnLast = $.getByParentID(targId, 'last'); + var btnLoad = $.getByParentID(targId, 'load'); + var pagination_info = $.getByParentID(targId, 'info'); + var pagination_after = $.getByParentID(targId, 'after'); + sel_pagesize.bind("change", function () { + options.pageSize = parseInt($(this).val()); + options.onChangePageSize.call(target, options.pageSize); + //_selectPageEvent(target, options.pageIndex); + }); + for (var i = 0; i < options.pageList.length; i++) { + $("").text(options.pageList[i]).appendTo(sel_pagesize); + } + + pageInput.unbind(".pagination").bind("keydown.pagination", function (e) { + if (e.keyCode == $.keyCode.ENTER) { + var pageIndex = parseInt($(this).val()) || 1; + _selectPageEvent(target, pageIndex); + return false; + } + }); + btnFirst.unbind('.pagination').bind('click.pagination', function () { + if(btnFirst.attr('disabled')){ + return; + } + _selectPageEvent(target, 1); + }); + btnPrev.unbind('.pagination').bind('click.pagination', function () { + if(btnPrev.attr('disabled')){ + return; + } + if (options.pageIndex > 1) { + _selectPageEvent(target, options.pageIndex - 1); + } + }); + btnNext.unbind('.pagination').bind('click.pagination', function () { + if(btnNext.attr('disabled')){ + return; + } + var pageCount = Math.ceil(options.total / options.pageSize); + if (options.pageIndex < pageCount) { + _selectPageEvent(target, options.pageIndex + 1); + } + }); + btnLast.unbind('.pagination').bind('click.pagination', function () { + if(btnLast.attr('disabled')){ + return; + } + var pageCount = Math.ceil(options.total / options.pageSize); + if (options.pageIndex < pageCount) { + _selectPageEvent(target, pageCount); + } + }); + btnLoad.unbind('.pagination').bind('click.pagination', function () { + if (options.onBeforeRefresh.call(this, options.pageIndex, options.pageSize) != false) { + _selectPageEvent(target, options.pageIndex); + options.onRefresh.call(target, options.pageIndex, options.pageSize); + } + }); + + options.displayMsg = pagination_info.html(); + options.afterPageText = pagination_after.html(); + }; + + var _selectPageEvent = function (target, pageIndex) { + var cache = $.data(target[0], _cacheName).options; + _calc(target, {pageIndex: pageIndex}); + cache.onSelectPage.call(target, cache.pageIndex, cache.pageSize); + }; + + var _calc = function (target, opts) { + var cache = $.data(target[0], _cacheName); + var targId=target.getElemID(); + var options = cache.options; + $.extend(options, opts || {}); + var sel_pagesize = $.getByParentID(targId, 'pagesize'); + if (sel_pagesize.length) { + sel_pagesize.val(options.pageSize + ""); + options.pageSize = parseInt(sel_pagesize.val()); + } + var pageindex = Math.ceil(options.total / options.pageSize) || 1; + if (options.pageIndex < 1) { + options.pageIndex = 1; + } + if (options.pageIndex > pageindex) { + options.pageIndex = pageindex; + } + var pageInput = $.getByParentID(targId, 'input'); + pageInput.val(options.pageIndex); + var pagination_info = $.getByParentID(targId, 'info'); + var displayMsg = options.displayMsg; + displayMsg = displayMsg.replace(/{from}/, options.total == 0 ? 0 : options.pageSize * (options.pageIndex - 1) + 1); + displayMsg = displayMsg.replace(/{to}/, Math.min(options.pageSize * (options.pageIndex), options.total)); + displayMsg = displayMsg.replace(/{total}/, options.total); + pagination_info.html(displayMsg); + + var pagination_after = $.getByParentID(targId, 'after'); + var pages = options.afterPageText; + pages = pages.replace(/{pages}/, Math.ceil(options.total / options.pageSize)); + pagination_after.html(pages); + + var btnFirst = $.getByParentID(targId, 'first'); + var btnPrev = $.getByParentID(targId, 'prev'); + var btnNext = $.getByParentID(targId, 'next'); + var btnLast = $.getByParentID(targId, 'last'); + btnFirst.attr('disabled', (options.pageIndex == 1)); + btnPrev.attr('disabled', (options.pageIndex == 1)); + btnNext.attr('disabled', (options.pageIndex == pageindex)); + btnLast.attr('disabled', (options.pageIndex == pageindex)); + _btnDisabled(btnFirst); + _btnDisabled(btnPrev); + _btnDisabled(btnNext); + _btnDisabled(btnLast); + _loadState(target, options.loading); + }; + var _loadState = function (target, loading) { + var cache = $.data(target[0], _cacheName); + var options = cache.options; + options.loading = loading; + var btnLoad = $.getByParentID(target.getElemID(), 'load'); + if (options.showRefresh && btnLoad) { + if (options.loading) { + btnLoad.removeClass('ui_pagination_load').addClass('ui_pagination_loading'); + } + else { + btnLoad.removeClass('ui_pagination_loading').addClass('ui_pagination_load'); + } + } + }; + var _btnDisabled = function (target) { + if (target.attr('disabled')) { + target.addClass('iconDisabled'); + } else { + target.removeClass('iconDisabled'); + } + } +})(jQuery); +/** + * Created by jinxs on 14-7-4. + *依赖 + * ui.mask.js + * ui.loading.js + * ui.position.js + * ui.panel.js + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiGrid'; + var _idFieldName = 'idField'; + + /** + * @class 表单-基类 + * @requires {@link panel} + * @constructor uiGrid + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * // 构件组件 + * $('#selectAge').uiGrid({direction: 'left'}); + * // 调用组件方法options + * $('#selectAge').uiGrid("options"); + */ + $.fn.uiGrid = function (options, param) { + if (this.length > 0 && typeof options == 'string') { + return $.fn.uiGrid.methods[options](this.first(), param); + } + return this.each(function () { + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + var opts = $.extend(true, {}, $.fn.uiGrid.defaults, me.parseUIConfig(), options); + me.data(_cacheName, {options: opts}); + } + _init(me); + }); + }; + /** + * 方法 + * @lends uiGrid.prototype + */ + $.fn.uiGrid.methods = { + /** + * @summary 获取所有配置 + * @name uiGrid#options + * @function + * @param target {jQuery} + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + } + /** + * @summary 获取grid的数据源 + * @name uiGrid#gridData + * @function + * @param target {jQuery} + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + , gridData: function (target) { + return $.data(target[0], _cacheName).options.gridData; + } + /** + * @summary 加载数据 + * @name uiGrid#loadData + * @function + * @param target {jQuery} + * @param opts {String} + * @returns {Array} + */ + , loadData: function (target, opts) { + var options = $.data(target[0], _cacheName).options; + $.extend(true, options, opts); + var palContent = target.uiPanel('content'); + var grid_data = palContent.children('.grid_data'); + _renderGridBody(target, palContent, grid_data); + } + /** + * @summary 设置数据并加载 + * @name uiGrid#setData + * @function + * @param target {jQuery} + * @param data {String} + * @returns {jQuery} target + */ + , setData: function (target, data) { + var palContent = target.uiPanel('content'); + var grid_data = palContent.children('.grid_data'); + + _getData(target, palContent, grid_data, data); + return target; + } + /** + * @summary获取工具栏 + * @name uiGrid#toolbar + * @function + * @param target {jQuery} + * @param opts {String} + * @returns {Array} + */ + , toolbar: function (target) { + var palContent = target.uiPanel('content'); + return palContent.children('.grid_toolbar'); + } + /** + * @summary 获取已选择的数据信息 + * @name uiGrid#selectedData + * @function + * @param target {jQuery} + * @param field {String} 用于筛选要返回的字段名 + * @returns {Array} + */ + , selectedData: function (target, field) { + var options = target.data(_cacheName).options; + var selectedRows = options._selectedRows; + var cacheData = options._cacheData.rows; + var data = []; + + if (selectedRows.length > 0) { + $.each(selectedRows, function (i, n) { + if (!field) { + data[i] = cacheData[n]; + } + else { + data[i] = cacheData[n][field]; + } + }); + } + return data; + } + /** + * @summary 获取表格指定列的样式定义 + * @name uiGrid#getColumnStyle + * @function + * @param target {jQuery} + * @param columnIndex {Number} 指定列,从0开始 + * @returns {CSSStyleDeclaration} 表格指定列的样式定义或null + */ + , getColumnStyle: function (target, columnIndex) { + var options = target.data(_cacheName).options; + + return options._colStyles[columnIndex]; + } + }; + /** + * 默认配置 + * @lends uiGrid.prototype + */ + $.fn.uiGrid.defaults = { + /** + * @type Boolean + * @default false + * @summary 指示组件是否只设置样式(应用于已经生成好数据表的情况) + */ + onlyStyle: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否自动适应 + */ + autoFit: false, + /** + * 表格的列宽在初始化时会根据内容进行计算(除非在表头的列指定了固定宽度, + * 此时若该列包含样式auto-width,则固定宽度可以为百分比且该列的宽度会再根据表格整体宽度进行比例缩放)。 + * @type Boolean + * @default false + * @summary 指示表格列宽是否适应 + */ + colFit: false, + /** + * @type Boolean + * @default false + * @summary 指示表格列宽是否一直适应 + */ + colFitAllTime: false, + /** + * @type Boolean + * @default false + * @summary 指示表格标题是否固定 + */ + gridTitleFix: false, + /** + * @type Boolean + * @default true + * @summary 指示组件是否显示边框 + */ + border: true, + /** + * @type String + * @default "" + * @summary 指示组件图标 + */ + icon: '', + /** + * @type String + * @default "" + * @summary 指示组件标题 + */ + title: '', + /** + * @type Number + * @default 400 + * @summary 指示组件宽度 + */ + width: 0, + /** + * @type Number + * @default 300 + * @summary 指示组件高度 + */ + height: 0, + /** + * @type Boolean + * @default true + * @summary 指示组件是否显示标题栏 + */ + showHeader: true, + /** + * @type String + * @default "" + * @summary 为组件加载的提示信息 + */ + loadMsg: '', + /** + * @type String + * @default null + * @summary 为组件加载数据 + */ + localData: null, + /** + * @type Boolean + * @default false + * @summary 是否延迟加载远程数据 + */ + lazyLoad: false, + /** + * @type String + * @default id + * @summary 指示组件信息主键的字段名 + */ + idField: 'id', + /** + * 可选值有get, post + * @type String + * @default "post" + * @summary 向指定的url请求数据时使用的方法 + */ + method: 'get', + /** + * @type String + * @default "" + * @summary 指定远程数据加载的url + */ + url: '', + + tpl_head: '', + + tpl_body: '', + /** + * @type Object + * @default {} + * @summary 指示组件的请求参数 + */ + queryParams: {}, + defaultSortField:'', + defaultOrder:'desc', + paramSort:'orderField', + paramOrder:'descended', + paramPageIndex:'pageIndex', + paramPageSize:'pageSize', + /** + * @type Number + * @default 1 + * @summary 指示组件是的起始页 + */ + pageIndex: 1, + /** + * @type Number + * @default 20 + * @summary 指示组件的页面大小 + */ + pageSize: 20, + /** + * @type Array + * @default [20, 40, 50, 100, 200] + * @summary 指示组件的页面大小选择项 + */ + pageList: [20, 40, 50, 100, 200], + /** + * @summary 在行选择时触发的方法。 + * @event + * @name uiGrid#onSelectRow + * @this 组件jQuery对象 + * @default null + */ + onSelectRow: function (selectedIndexs, selectedIds) { + }, + /** + * @type Boolean + * @default false + * @summary 加载数据时是否自动选择上一次选中的行 + */ + autoSelectedOnLoad: false, + /** + * @type Boolean + * @default true + * @summary 指示组件是否支持行多选 + */ + multiSelect: true, + + /** + * @type Boolean + * @default true + * @summary 指示组件的列是否可调整大小 + */ + colResizable: true, + /** + * @type Number + * @default 0 + * @summary 指示组件的最小列宽 + */ + minColWidth: 0, + /** + * @type Number + * @default 1000 + * @summary 指示组件的最大列宽 + */ + maxColWidth: 1000, + /** + * @type Boolean + * @default true + * @summary 指示数据加载完全时组件是否可本地排序 + */ + localSortable: false, + _cacheData: {}, + _selectedRows: [], + _colStyles: [], + selectedIds: [], + /** + * @event + * @name uiGrid#dataFilter + * @type function + * @default function () { return data;} + * @summary 数据过滤 + */ + dataFilter:function(data){ + return data; + }, + /** + * @event + * @name uiGrid#onBeforeLoad + * @type function + * @default function () { } + * @summary 设置组件加载数据之前的事件 + */ + onBeforeLoadData: function () { + } + /** + * @event + * @name uiGrid#onLoadError + * @type function + * @default function () { } + * @summary 设置组件加载数据失败的事件 + */ + , onLoadDataError: function () { + } + /** + * @event + * @name uiGrid#onLoadComplete + * @type function + * @default function () { } + * @summary 设置组件加载数据完成的事件 + */ + , onLoadDataSuccess: function (result) { + } + }; +//////--------------------------------内部方法------------------------------ + /** + * 初始化 + * @param target 目标对象 + */ + var _init = function (target) { + var options = target.data(_cacheName).options; + target.addClass('grid'); + var onlyStyle = options.onlyStyle; + var grid_data = target.children('table.grid_data').wrap('
          ').parent(); + var content; + var palContent; + + grid_data.find('tbody tr:first-child').children().each(function (i) { + $(this).addClass('col_' + i); + }); + options.tpl_head = $('thead', grid_data).html(); + options.tpl_body = $('tbody', grid_data).html(); + grid_data.empty(); + content = target.children().detach(); + target.uiPanel({ + autoFit: options.autoFit, + icon: options.icon, + title: options.title, + width: options.width, + height: options.height, + border: options.border, + minWidth: 0, + minHeight: 0, + showHeader: options.showHeader, + showBtnBar: false + }); + palContent = target.uiPanel('content').append(content); + $.uiLoading.add({ + container: palContent, + text: options.loadMsg || $.uiLoading.defaults.text + }); + + if (!onlyStyle) { + _renderTpl(target); + } + _renderToolbar(palContent); + _renderPagination(target, palContent, grid_data); + _renderGridStyle(target, grid_data); + _gridFit(target, grid_data); + _renderGridBody(target, palContent, grid_data, true); + target.bind('_resize', function () { + var me = $(this); + target.uiPanel('resize'); + var gridData = me.find('div.grid_data'); + _gridFit(me, gridData); + _renderView(me, gridData, me.data(_cacheName).options.colFitAllTime); + }); + return target; + }; + var _renderTpl = function (target) { + var options = target.data(_cacheName).options; + options.tpl_body = '{{each rows as value i}}' + options.tpl_body + '{{/each}}'; + options._tplBodyFn = template.compile(options.tpl_body); + }; + /** + * 渲染grid的标题 + * @param target + * @param grid_data + * @private + */ + var _renderGridStyle = function (target, grid_data) { + var options = $.data(target[0], _cacheName).options; + var onlyStyle = options.onlyStyle; + if (options.gridTitleFix) { + var gridHeader = $('
          ' + options.tpl_head + '
          '); + var gridBody = $('
          ' + (onlyStyle ? options.tpl_body : '') + '
          '); + var tmpScrollTop; + + gridHeader.appendTo(grid_data); + gridBody.appendTo(grid_data); + tmpScrollTop = gridBody.scrollTop(); + gridBody.unbind('scroll').bind('scroll', function () { + //防止垂直滚动时计算 + if (tmpScrollTop != gridBody.scrollTop()) { + tmpScrollTop = gridBody.scrollTop(); + return; + } + gridHeader.scrollLeft(gridBody.scrollLeft()); + }); + } else { + var table = $('' + options.tpl_head + '
          '); + table.appendTo(grid_data); + table.find('thead tr:last-child td').addClass('ui_grid_head_border'); + if (options.colFit) { + table.css('width', '98%'); + } + grid_data.css('overflow', 'auto'); + } + }; + var _renderGridBody = function (target, palContent, grid_data, isInit) { + var options = $.data(target[0], _cacheName).options; + + if (options.onlyStyle) { + _renderView(target, grid_data); + return; + } + if (options.localData) { + options.onBeforeLoadData.call(target); + options.gridData = options.dataFilter.call(target,options.localData); + _getData(target, palContent, grid_data, options.gridData); + options.onLoadDataSuccess.call(target, options.gridData); + } else if (!isInit || !options.lazyLoad) { + if (options.url != '') { + var pagination = palContent.find('.grid_pagination'); + var ajaxData = options.queryParams; + + if(options.defaultSortField && !ajaxData[options.paramSort]){ + ajaxData[options.paramSort] = options.defaultSortField; + ajaxData[options.paramOrder] = options.defaultOrder=='desc'; + } + if (pagination.length > 0) { + var obj = {}; + obj[options.paramPageIndex] = options.pageIndex; + obj[options.paramPageSize] = options.pageSize; + $.extend(ajaxData, obj); + } + $.ajax({ + type: options.method, + url: options.url, + cache: false, + showLoading:false, + data: ajaxData, + dataType: "json", + beforeSend: function () { + $.uiLoading.show({ + container: palContent + }); + options.onBeforeLoadData.call(target); + }, + success: function (result) { + if (result.success) { + options.gridData =options.dataFilter.call(target, result.data); + _getData(target, palContent, grid_data, options.gridData); + options.onLoadDataSuccess.call(target, options.gridData); + return false; + } + }, + complete: function () { + $.uiLoading.hide({container: palContent}); + }, + error: function () { + options.onLoadDataError.call(target, arguments); + alert('加载远程数据' + options.url + '失败!'); + return false; + } + }); + } + } + }; + var _getData = function (target, palContent, grid_data, data) { + var options = target.data(_cacheName).options; + var dataHtml, tbody; + var pagination = palContent.find('.grid_pagination'); + if (pagination.length > 0) { + pagination.uiPagination('refresh', $.extend(options,{total: data.total})); + } + options._cacheData = data; + options._selectedRows = []; + target.find('thead :checkbox.grid_selector').each(function () { + this.checked = false; + }); + dataHtml = $(options._tplBodyFn(data)); + if (options.gridTitleFix) { + tbody = grid_data.find('div.ui_grid_data table.ui_grid tbody'); + } else { + tbody = grid_data.find('table.ui_grid tbody'); + } + tbody.html(dataHtml); + _renderView(target, grid_data); + _renderSelection(target, tbody); + }; + + var _gridFit = function (target, grid_data) { + var options = $.data(target[0], _cacheName).options; + var size = grid_data.autoFit(true, false); + if (options.gridTitleFix) { + grid_data.find('div.ui_grid_data').autoFit(true, false, true, '.ui_grid_head'); + } + }; + /** + * + * @param target + * @param grid_data + * @param resetWidth 是否重新计算列宽 + * @private + */ + var _renderView = function (target, grid_data, resetWidth) { + var options = target.data(_cacheName).options; + var gridHeader = grid_data.children('div.ui_grid_head'); + var headTable = gridHeader.find('.ui_grid'); + var headTrs_last_tds = headTable.find('tr:last-child td'); + var targetId = target.attr('id'); + var colStyles = options._colStyles; + var colWidths = options._colWidths; + var inited = colStyles.length > 0; + + if (!inited) { + resetWidth = true; + colStyles = options._colStyles = []; + colWidths = options._colWidths = []; + // ##colresizer + if (options.colResizable) { + $('
          ').setIDByParentID(targetId, $.uiTemplate.uiGrid.colresizer).appendTo(grid_data); + } + // #colresizer + // ##grid_sort + if (headTrs_last_tds.length == 0) { + headTrs_last_tds = grid_data.find('thead tr:last-child td'); + } + headTrs_last_tds.each(function () { + var td = $(this); + if (td.attr('sortfield')) { + var div = td.children('div'); + if (div.length > 0) { + div.addClass('icon_sort'); + } + else { + td.wrapInner('
          '); + } + td.addClass('sortable').click(function () { + var opt = $('#' + targetId).data(_cacheName).options; + var data = opt.localData || opt._cacheData; + var me = $(this); + var sort = me.attr('sortfield'); + var order = 'asc'; + if (me.hasClass('asc')) { + order = 'desc'; + me.removeClass('asc').addClass(order); + } + else if (me.hasClass('desc')) { + if(opt.defaultSortField){ + sort = opt.defaultSortField; + order = opt.defaultOrder; + } + else { + order = ''; + } + me.removeClass('desc'); + } + else { + me.addClass(order).siblings('.asc,.desc').removeClass('asc desc'); + } + if (order == '') { + delete opt.queryParams[opt.paramSort]; + delete opt.queryParams[opt.paramOrder]; + } + else { + opt.queryParams[opt.paramSort] = sort; + opt.queryParams[opt.paramOrder] = order=='desc'; + } + if (!!opt.localData || (opt.localSortable && data.total == data.rows.length)) { + if (order == '' || data._sorted) { + var tmp = data.rows; + data.rows = data._rows; + data._rows = tmp; + data._sorted = !data._sorted; + } + if (order != '') { + if (!data._rows) { + data._rows = $.map(data.rows, function (a) { + return a; + }); + } + data.rows.sort(function (a, b) { + var v1 = a[sort] || ''; + var v2 = b[sort] || ''; + var c = 0; + + if (typeof v1 === 'number') { + c = v1 - v2; + } + else { + c = v1.localeCompare(v2); + } + return order == 'asc' ? c : -c; + }); + } + _getData(target, target.uiPanel('content'), grid_data, data); + } + else { + _renderGridBody(target, target.uiPanel('content'), grid_data); + } + }); + } + }); + // #grid_sort + } + if (options.gridTitleFix && resetWidth === true) { + var gridBody = grid_data.children('div.ui_grid_data'); + var bodyTable = gridBody.find('.ui_grid'); + var trs = bodyTable.children().children(); + if (trs.length > 0) { + var bodytd = trs.eq(0).children(); + var tableWidth = 0; + var staticWidth = 0; + var padWidth = bodytd.outerWidth() - bodytd.width(); + var fitCols = []; + var gridWidth = grid_data.width() - 21; + + bodytd.each(function (index) { + var me = $(this); + var td = headTrs_last_tds.eq(index); + var maxWidth = 0; + var isFixed; + + if (!inited) { + isFixed = !td.hasClass('auto-width') && !!td[0].style.width; + // ##colresizer + if (options.colResizable) { + td.resizable({ + handles: 'e', + minWidth: options.minColWidth, + maxWidth: options.maxColWidth, + onStartResize: function (e) { + var resizer = $.getByParentID(targetId, $.uiTemplate.uiGrid.colresizer); + var dl = resizer.parent().offset().left; + resizer.css('left', e.pageX - dl).show(); + return false; + }, + onResize: function (e) { + var resizer = $.getByParentID(targetId, $.uiTemplate.uiGrid.colresizer); + var dl = resizer.parent().offset().left; + resizer.css('left', e.pageX - dl); + return false; + }, + onStopResize: function (e) { + var cw = e.data.width - e.data.startWidth; + if (cw != 0) { + var opt = $('#' + targetId).data(_cacheName).options; + var colWidths = opt._colWidths; + var idx = this.index(); + + if (opt.colFitAllTime) { + var tw = 0; + $.each(colWidths, function (i, n) { + tw += n; + }); + cw = Math.floor(cw * tw / (this.parent().width())); + } + colWidths[idx] += cw; + if (colWidths[idx] < 0) { + colWidths[idx] = 0; + } + _renderView(target, grid_data, true); + } + $.getByParentID(targetId, $.uiTemplate.uiGrid.colresizer).hide(); + return false; + } + }); + } + // #colresizer + if (!isFixed) { + maxWidth = Math.max(td.width(), td.hasClass('auto-width')?0:me.width()); + if (!options.colFit) { + colStyles[index] = $.globalCSS('#' + targetId + ' .col_' + index, 'width:' + maxWidth + 'px;'); + } + } + else { + maxWidth = parseFloat(td[0].style.width); + td.addClass('fixed-width'); + colStyles[index] = $.globalCSS('#' + targetId + ' .col_' + index, 'width:' + maxWidth+'px'); + } + colWidths[index] = maxWidth; + td.addClass('col_' + index).css('width', ''); + } + else { + isFixed = td.hasClass('fixed-width'); + maxWidth = colWidths[index]; + if (isFixed || !options.colFitAllTime) { + colStyles[index].style.width = maxWidth + 'px'; + } + } + tableWidth += maxWidth + padWidth; + if (isFixed) { + staticWidth += maxWidth + padWidth; + } + else if ((!inited && options.colFit) || options.colFitAllTime) { + fitCols[fitCols.length] = {index: index, width: maxWidth}; + } + }); + if ((!inited && options.colFit) || options.colFitAllTime) { + var ext = gridWidth - staticWidth; + var pct = (tableWidth - staticWidth) / ext; + for (var i = 0; i < fitCols.length; i++) { + var index = fitCols[i].index; + var w = Math.floor((fitCols[i].width + padWidth) / pct); + ext -= w; + staticWidth += w; + w -= padWidth; + if (i == fitCols.length - 1) { + w += ext; + staticWidth += ext; + } + if (!inited) { + colStyles[index] = $.globalCSS('#' + targetId + ' .col_' + index, 'width:' + w + 'px;'); + if (!options.colFitAllTime) { + colWidths[index] = w; + } + } + else if (w > 0) { + colStyles[index].style.width = w + 'px'; + } + } + tableWidth = gridWidth; + } + gridHeader.children('.ui_grid_head1').width(tableWidth + 21); + gridBody.children().width(tableWidth); + if (!inited) { + headTable.css('table-layout', 'fixed'); + bodyTable.css('table-layout', 'fixed'); + } + headTable.width(tableWidth); + bodyTable.width(tableWidth); + } + } + }; + var _renderSelection = function (target, gridTBody) { + var cks = gridTBody.find(':checkbox.grid_selector'), + targetId = target.attr('id'), + options = target.data(_cacheName).options, + selectedRows = options._selectedRows, + onSelectRow = options.onSelectRow, + selectedIds = options.selectedIds, + autoSelect = options.autoSelectedOnLoad, + fn = function (e) { + var ck = $(this), + tr = ck, + isTr = !ck.is(':checkbox'), + ckAll = tr.closest('div.grid_data').find('thead :checkbox.grid_selector'); + if (!isTr) { + tr = ck.closest('tr'); + } + else { + ck = tr.find(':checkbox.grid_selector'); + } + if (!options.multiSelect || (isTr && !e.ctrlKey)) { + tr.siblings('.selected').removeClass('selected') + .find(':checked.grid_selector').each(function () { + this.checked = false; + }); + } + if (!isTr || e.ctrlKey) { + var cked = false; + cked = tr.hasClass('selected'); + tr.toggleClass('selected', !cked); + ck[0].checked = !cked; + } + else { + ck[0].checked = true; + tr.addClass('selected'); + } + selectedRows.splice(0, selectedRows.length); + selectedIds.splice(0, selectedIds.length); + tr.parent().children().each(function (i) { + if (!$(this).hasClass('selected')) { + cked = false; + } + else { + selectedRows[selectedRows.length] = i; + if (autoSelect&&tr.attr('idField')) { + selectedIds[selectedIds.length] = tr.attr('idField'); + } + } + }); + ckAll.each(function () { + this.checked = cked; + cked = null; + }); + if (typeof onSelectRow === 'function') { + onSelectRow.call(target, selectedRows, selectedIds); + } + if (isTr && e.ctrlKey) { + return false; + } + }; + cks.each(function(index, ck) { + var me = $(ck); + var tr = me.closest('tr'); + me.change(fn).mousedown(function () { + return false; + }); + tr.mousedown(fn); + if (autoSelect) { + var val = tr.attr(_idFieldName); + if (val) { + for (var i = 0; i < selectedIds.length; i++) { + if (val == selectedIds[i]) { + selectedRows[selectedRows.length] = index; + selectedIds.splice(0,0,selectedIds[i++]); + tr.addClass('selected'); + ck.checked = true; + } + } + } + } + }); + if (autoSelect) { + if(selectedIds.length > 0){ + //selectedIds.splice(selectedRows.length, selectedIds.length - selectedRows.length); + selectedIds.length = selectedRows.length; + } + if(typeof onSelectRow === 'function') { + onSelectRow.call(target, selectedRows, selectedIds); + } + } + target.find('thead :checkbox.grid_selector').unbind('change').change(function () { + var me = $(this), + grid = $('#' + targetId), + cked = this.checked, + opt = grid.data(_cacheName).options, + trs = me.closest('div.grid_data').find('table tbody tr'); + if (!opt.multiSelect) { + return false; + } + selectedRows.splice(0, selectedRows.length); + selectedIds.splice(0, selectedIds.length); + var j=0; + trs.each(function (i) { + var tr = $(this); + var ckCount = tr.find("input.grid_selector").length; + if(ckCount>0) { + if (cked) { + selectedRows[j] = i; + j++; + if (opt.autoSelectedOnLoad) { + selectedIds[selectedIds.length] = tr.attr('idField'); + } + } + tr.toggleClass('selected', cked).find(':checkbox.grid_selector').each(function () { + this.checked = cked; + }); + } + }); + if (typeof onSelectRow === 'function') { + onSelectRow.call(grid, selectedRows, selectedIds); + } + }); + }; + var _renderToolbar = function (palContent) { + var toolbar = palContent.children('.grid_toolbar'); + if (toolbar.length > 0) { + toolbar.uiButtonBar(); + toolbar.css('marginLeft', -1); + } + }; + var _renderPagination = function (target, palContent, grid_data) { + var pagination = palContent.find('.grid_pagination'); + if (pagination.length > 0) { + var options = $.data(target[0], _cacheName).options; + pagination.uiPagination({ + pageIndex: options.pageIndex, + pageSize: options.pageSize, + pageList: options.pageList, + onSelectPage: function (pageIndex, pageSize) { + options = $.data(target[0], _cacheName).options; + options.pageIndex = pageIndex; + options.pageSize = pageSize; + _renderGridBody(target, palContent, grid_data); + }, + onChangePageSize: function (pageSize) { + options = $.data(target[0], _cacheName).options; + options.pageIndex = 1; + options.pageSize = pageSize; + _renderGridBody(target, palContent, grid_data); + } + }); + } + }; +})(jQuery); +/** + * Created by jinxs on 14-6-25. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiTooltip'; + + /** + * @class 提示信息组件 + * @constructor uiTooltip + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * //采用默认值 + * $('#scb').uiTooltip(); + * //设置组件参数 + * $('#scb').uiTooltip({region:'right'}); + * //调用组件方法 + * $('#scb').uiTooltip('hide'); + */ + $.fn.uiTooltip = function (options, param) { + if (typeof options == "string") { + return $.fn.uiTooltip.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiTooltip.defaults, me.parseUIConfig(), options), + tip: null + }); + _init(me); + } + _bindEvent(me); + _update(me); + }); + }; + /** + * 方法 + * @lends uiTooltip.prototype + */ + $.fn.uiTooltip.methods = { + /** + * @summary 获取所有配置 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 获取提示jquery对象 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + tip: function (target) { + return $.getByParentID(target.getElemID(), $.uiTemplate.tooltip.tip); + }, + /** + * @summary 获取提示箭头jquery对象 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + arrow: function (target) { + return target.uiTooltip("tip").children(".ui_tooltip-arrow-outer,.ui_tooltip-arrow"); + }, + /** + * @summary 获取提示内容jquery对象 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + content: function (target) { + return $.getByParentID($(target).getElemID(), $.uiTemplate.tooltip.content); + }, + /** + * @summary 显示提示 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + show: function (target, e) { + _show(target, e); + }, + /** + * @summary 隐藏提示 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + hide: function (target, e) { + _hide(target, e); + }, + /** + * @summary 更新提示 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + update: function (target, content) { + _update(target, content); + }, + /** + * @summary 重置提示框位置。 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + reposition: function (target) { + _reposition(target); + }, + /** + * @summary 删除提示对象 + * @param target + * @returns {*|Function|HTMLOptionsCollection|options|options} + */ + destroy: function (target) { + _destroy(target); + } + }; + /** + * 默认配置 + * @lends uiTooltip.prototype + */ + $.fn.uiTooltip.defaults = { + /** + * @type String + * @default 'right' + * @summary 消息框位置。可用值有:"left","right","top","bottom" + */ + region: "right", + /** + * @type String|Object + * @default null + * @summary 消息框内容 + */ + content: null, + /** + * @type Boolean + * @default false + * @summary 为true时,允许提示框跟着鼠标移动 + */ + trackMouse: false, + /** + * @type Array + * @default [0,0] + * @summary [水平方向提示框的位置,垂直方向提示框的位置] + */ + offset: [0, 0], + /** + * @type String + * @default mouseenter + * @summary 触发提示显示的事件 + */ + showOn: "mouseenter", + /** + * @type String + * @default mouseleave + * @summary 触发提示隐藏的事件 + */ + hideOn: "mouseleave", + /** + * @type Boolean + * @default true + * @summary 为false时,通过程序控制其隐藏 + */ + autoHide: true, + /** + * @type Boolean + * @default true + * @summary 为false时,通过程序控制其显示 + */ + autoShow:true, + /** + * @type Number + * @default 200 + * @summary 延时多少秒显示提示框 + */ + showDelay: 200, + /** + * @type Number + * @default 100 + * @summary 延时多少秒隐藏提示框 + */ + hideDelay: 100, + /** + * @event + * @name uiTooltip#onShow + * @type function + * @default function () { } + * @summary 在显示提示框的时候触发。 + */ + onShow: function (e) { + }, + /** + * @event + * @name uiTooltip#onHide + * @type function + * @default function () { } + * @summary 在隐藏提示框的时候触发。 + */ + onHide: function (e) { + }, + /** + * @event + * @name uiTooltip#onUpdate + * @type function + * @default function () { } + * @summary 在提示框内容更新的时候触发。 + */ + onUpdate: function (content) { + }, + /** + * @event + * @name uiTooltip#onPosition + * @type function + * @default function () { } + * @summary 在提示框位置改变的时候触发。 + */ + onPosition: function (left, top) { + }, + /** + * @event + * @name uiTooltip#onDestroy + * @type function + * @default function () { } + * @summary 在提示框被销毁的时候触发。 + */ + onDestroy: function () { + } + }; + //////--------------------------------内部方法------------------------------ + /** + * 初始化方法,主要设置高宽,加载内容 + */ + var _init = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + target.setElemID(); + var title = target.attr('title'); + if (title != undefined && title != '' && !options.content) { + options.content = title; + target.removeAttr('title'); + } + return target; + }; + + function _show(target, e) { + var state = $.data(target[0], _cacheName); + var options = state.options; + var tip = $.getByParentID(target.getElemID(), $.uiTemplate.tooltip.tip); + if (tip.length == 0) { + var targetID = target.getElemID(); + var reg = new RegExp('({target})', 'g'); + tip = $($.uiTemplate.tooltip.html.replace(reg, targetID)).appendTo('body'); + _update(target); + } + tip.removeClass("ui_tooltip-top ui_tooltip-bottom ui_tooltip-left ui_tooltip-right").addClass("ui_tooltip-" + options.region); + _setTimer(target); + state.showTimer = setTimeout(function () { + _reposition(target); + tip.show(); + options.onShow.call(target, e); + var arrowOuter = $.getByParentID(targetID, $.uiTemplate.tooltip.tipAouter); + var arrow = $.getByParentID(targetID, $.uiTemplate.tooltip.arrow); + var borderColor = "border-" + options.region + "-color"; + arrowOuter.add(arrow).css({ + borderTopColor: "", + borderBottomColor: "", + borderLeftColor: "", + borderRightColor: "" + }); + arrowOuter.css(borderColor, tip.css(borderColor)); + arrow.css(borderColor, tip.css("backgroundColor")); + }, options.showDelay); + tip.unbind('mouseover.uiTooltip').bind('mouseover.uiTooltip', function (e) { + if (state.hideTimer) { + clearTimeout(state.hideTimer); + state.hideTimer = null; + } + }); + if (options.autoHide) { + tip.unbind('mouseleave.uiTooltip').bind('mouseleave.uiTooltip', function (e) { + setTimeout(function () { + _hide(target, e); + }, options.hideDelay); + }); + } + }; + function _bindEvent(target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + target.unbind(".uiTooltip"); + if (options.autoShow) { + target.bind(options.showOn + ".uiTooltip", function (e) { + _show(target, e); + }); + } + if (options.autoHide) { + target.bind(options.hideOn + ".uiTooltip", function (e) { + _hide(target, e); + }); + } + target.bind("mousemove.uiTooltip", function (e) { + if (options.trackMouse) { + options.trackMouseX = e.pageX; + options.trackMouseY = e.pageY; + _reposition(target); + } + }); + }; + function _setTimer(target) { + var state = $.data(target[0], _cacheName); + if (state.showTimer) { + clearTimeout(state.showTimer); + state.showTimer = null; + } + if (state.hideTimer) { + clearTimeout(state.hideTimer); + state.hideTimer = null; + } + }; + function _reposition(target) { + var state = $.data(target[0], _cacheName); + var tip = $.getByParentID(target.getElemID(), $.uiTemplate.tooltip.tip); + if (!state || tip.length == 0) { + return; + } + var options = state.options; + var left, top, t; + if (options.trackMouse) { + t = $(); + left = options.trackMouseX + options.offset[0]; + top = options.trackMouseY + options.offset[1]; + } else { + var t = $(target); + left = t.offset().left + options.offset[0]; + top = t.offset().top + options.offset[1]; + } + switch (options.region) { + case $.uiTemplate.tooltip.region.right: + left += t.outerWidth() + 12 + (options.trackMouse ? 12 : 0); + top -= (tip.outerHeight() - t.outerHeight()) / 2; + break; + case $.uiTemplate.tooltip.region.left: + left -= tip.outerWidth() + 12 + (options.trackMouse ? 12 : 0); + top -= (tip.outerHeight() - t.outerHeight()) / 2; + break; + case $.uiTemplate.tooltip.region.top: + left -= (tip.outerWidth() - t.outerWidth()) / 2; + top -= tip.outerHeight() + 12 + (options.trackMouse ? 12 : 0); + break; + case $.uiTemplate.tooltip.region.bottom: + left -= (tip.outerWidth() - t.outerWidth()) / 2; + top += t.outerHeight() + 12 + (options.trackMouse ? 12 : 0); + break; + } + if (!$(target).is(":visible")) { + left = -100000; + top = -100000; + } + tip.css({ + left: left, + top: top, + zIndex: (options.zIndex != undefined ? options.zIndex : ($.fn.uiDialog ? $.fn.uiDialog.defaults.zIndex++ : "")) + }); + options.onPosition.call(target, left, top); + }; + function _hide(target, e) { + var state = $.data(target[0], _cacheName); + var tip = $.getByParentID(target.getElemID(), $.uiTemplate.tooltip.tip); + if (state && tip.length > 0) { + _setTimer(target); + state.hideTimer = setTimeout(function () { + var tip = $.getByParentID(target.getElemID(), $.uiTemplate.tooltip.tip); + tip.hide(); + state.options.onHide.call(target, e); + }, state.options.hideDelay); + } + }; + function _update(target, content) { + var state = $.data(target[0], _cacheName); + var options = state.options; + if (content) { + options.content = content; + } + var tip = $.getByParentID(target.getElemID(), $.uiTemplate.tooltip.tip); + if (tip.length == 0) { + return; + } + var cont = typeof options.content == "function" ? options.content.call(target) : options.content; + $.getByParentID($(target).getElemID(), $.uiTemplate.tooltip.content).html(cont); + options.onUpdate.call(target, cont); + }; + function _destroy(target) { + var state = $.data(target[0], _cacheName); + if (state) { + _setTimer(target); + var options = state.options; + var tip = $.getByParentID(target.getElemID(), $.uiTemplate.tooltip.tip); + if (tip.length > 0) { + tip.remove(); + } + if (options.content) { + $(target).attr("title", options.content); + } + $.removeData(target, _cacheName); + $(target).unbind(".uiTooltip"); + options.onDestroy.call(target); + } + }; +})(jQuery); +/** + * Created by jinxs on 14-7-15. + * 基于easyui.layout源码 + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiLayout'; + var _resizing = false; + var pal_region = { + top: 'top', + bottom: 'bottom', + right: 'right', + left: 'left', + center: 'center' + }; + /** + * @class 布局组件 + * @constructor uiLayout + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的方法的参数 + * @example + * // 构件组件 + * $('#div').uiLayout({ + * axis:'h', + * onStopDrag: function(e){ + * alert(this[0]==e.data.target[0]); + * } + * }); + * // 调用组件方法options + * $('#div').uiLayout("options"); + */ + $.fn.uiLayout = function (options, params) { + if (typeof options == "string") { + return $.fn.uiLayout.methods[options](this, params); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiLayout.defaults, me.parseUIConfig(), options), + panels: {center: $(), top: $(), bottom: $(), right: $(), left: $()} + }); + _init(me); + } + _resize(me); + _collapsePanels(me); + }); + }; + /** + * 方法 + * @lends uiLayout.prototype + */ + $.fn.uiLayout.methods = { + /** + * @summary 根据配置重置控件的大小 + * @name uiLayout#resize + * @function + * @returns {jQuery} 方法调用者 + */ + resize: function (target) { + _resize(target); + return target; + }, + /** + * @summary 获得组件的面板对象 + * @name uiLayout#panel + * @function + * @param palPosition {Number} 面板位置 + * @returns uiPanel 组件的面板对象 + */ + panel: function (target, palPosition) { + return $.data(target[0], _cacheName).panels[palPosition]; + }, + /** + * @summary 折叠组件 + * @name uiLayout#collapse + * @function + * @param region {Object} 折叠区域 + * @returns {jQuery} 方法调用者 + */ + collapse: function (target, region) { + _collapsePanel(target, region); + return target; + }, + /** + * @summary 展开组件 + * @name uiLayout#expand + * @function + * @param region {Object} 展开区域 + * @returns {jQuery} 方法调用者 + */ + expand: function (target, region) { + _expandPanel(target, region); + return target; + }, + /** + * @summary 为组件添加面板对象 + * @name uiLayout#add + * @function + * @param palOption {Object} 面板参数 + * @returns {jQuery} 方法调用者 + */ + add: function (target, palOption) { + _addPanel(target, palOption); + _resize(target); + if (target.uiLayout('panel', palOption.region).uiPanel('options').collapsed) { + _collapsePanel(target, palOption.region, 0); + } + return target; + }, + /** + * @summary 移除指定的组件的面板对象 + * @name uiLayout#remove + * @function + * @param region {String} 方向参数 + * @returns {jQuery} 方法调用者 + * @example + * $('#divMenu').uiLayout("remove", 'left'); + */ + remove: function (target, region) { + _remove(target, region); + _resize(target); + return target; + } + }; + $.fn.uiLayout.defaults = {autoFit: false}; + + $.fn.uiLayout.paneldefaults = $.extend({}, $.fn.uiPanel.defaults, + /** + * 默认配置 + * @lends uiLayout.prototype + */ + { + /** + * @type String + * @default null + * @summary 组件区域 + */ + region: null, + /** + * @type Boolean + * @default true + * @summary 指示组件是否显示边框 + */ + border: true, + /** + * @type Boolean + * @default false + * @summary 指示组件是否显示按钮栏 + */ + showBtnBar: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否可分割 + */ + split: false, + /** + * @type Boolean + * @default true + * @summary 指示组件是否可折叠 + */ + collapsible: true, + /** + * @type Number + * @default 30 + * @summary 指示组件可折叠的大小 + */ + collapsedSize: 30, + /** + * @type Number + * @default 10 + * @summary 指示组件的最小宽度 + */ + minWidth: 10, + /** + * @type Number + * @default 10 + * @summary 指示组件的最小高度 + */ + minHeight: 10, + /** + * @type Number + * @default 10000 + * @summary 指示组件的最大宽度 + */ + maxWidth: 10000, + /** + * @type Number + * @default 10000 + * @summary 指示组件的最大高度 + */ + maxHeight: 10000 + }); + + var _init = function (target) { + target.addClass("ui_layout"); + var _addPal = function (target) { + target.children("div").each(function () { + var palOpts = $.extend({}, $.fn.uiLayout.paneldefaults, $(this).parseUIConfig()); + if ("top,bottom,right,left,center".indexOf(palOpts.region) >= 0) { + _addPanel(target, palOpts, this); + } + }); + }; + target.children("form").length ? _addPal(target.children("form")) : _addPal(target); + target.append("
          "); + target.bind("_resize", function () { + var opts = $.data(target[0], _cacheName).options; + if (opts.autoFit == true) { + _resize(target); + } + }); + }; + + var _collapsePanels = function (target) { + var panels = $.data(target[0], _cacheName).panels; + if (panels.right.length > 0 && panels.right.uiPanel("options").collapsed) { + _collapsePanel(target, pal_region.right, 0); + } + if (panels.left.length > 0 && panels.left.uiPanel("options").collapsed) { + _collapsePanel(target, pal_region.left, 0); + } + if (panels.top.length > 0 && panels.top.uiPanel("options").collapsed) { + _collapsePanel(target, pal_region.top, 0); + } + if (panels.bottom.length > 0 && panels.bottom.uiPanel("options").collapsed) { + _collapsePanel(target, pal_region.bottom, 0); + } + }; + + var _resize = function (target) { + var opts = $.data(target[0], _cacheName); + var options = opts.options; + var pals = opts.panels; + if (target[0].tagName == "BODY") { + target.autoFit(true, true); + } else { + options.autoFit ? target.autoFit(true, true) : target.autoFit(false); + } + var sizeOpts = {top: 0, left: 0, width: target.width(), height: target.height()}; + _calcNS(_palVisible(pals.expandTop) ? pals.expandTop : pals.top, "n"); + _calcNS(_palVisible(pals.expandBottom) ? pals.expandBottom : pals.bottom, "s"); + _calcEW(_palVisible(pals.expandRight) ? pals.expandRight : pals.right, "e"); + _calcEW(_palVisible(pals.expandLeft) ? pals.expandLeft : pals.left, "w"); + if (_IEunder9 && !pals.center.uiPanel('options').border) { + sizeOpts.width += 4; + sizeOpts.height += 4; + } + pals.center.each(function () { + $(this).uiPanel("resize", sizeOpts); + }); + function _getPalHeight(pal) { + var pal_opts = pal.uiPanel("options"); + return Math.min(Math.max(pal_opts.height||pal.outerHeight(), pal_opts.minHeight||0), pal_opts.maxHeight); + } + + function _getPalWidth(pal) { + var pal_opts = pal.uiPanel("options"); + return Math.min(Math.max(pal_opts.width||pal.outerWidth(), pal_opts.minWidth||0), pal_opts.maxWidth); + } + + function _calcNS(pal, dir) { + if (!pal.length || !_palVisible(pal)) { + return; + } + var opts = pal.uiPanel("options"); + var height = _getPalHeight(pal); + var top = (dir == "n" ? 0 : target.height() - height); + pal.uiPanel("resize", {width: target.width(), height: height, left: 0, top: top}); + sizeOpts.height -= height; + if (dir == "n") { + sizeOpts.top += height; + if (!opts.split && opts.border) { + sizeOpts.top -= 1; + } + } + if (!opts.split && opts.border) { + sizeOpts.height += 1; + } + } + + function _calcEW(pal, dir) { + if (!pal.length || !_palVisible(pal)) { + return; + } + var opts = pal.uiPanel("options"); + var width = _getPalWidth(pal); + var left = (dir == "e" ? target.width() - width : 0); + pal.uiPanel("resize", {width: width, height: sizeOpts.height, left: left, top: sizeOpts.top}); + sizeOpts.width -= width; + if (dir == "w") { + sizeOpts.left += width; + if (!opts.split && opts.border) { + sizeOpts.left -= 1; + } + } + if (!opts.split && opts.border) { + sizeOpts.width += 1; + } + } + }; + + var _addPanel = function (target, palOptions, panel) { + palOptions.region = palOptions.region || pal_region.center; + var panels = $.data(target[0], _cacheName).panels; + var region = palOptions.region; + if (panels[region].length) { + return; + } + var pal = $(panel); + if (!pal.length) { + pal = $("
          ").appendTo(target); + } + var palOpts = $.extend({}, $.fn.uiLayout.paneldefaults, { + width: (pal.length ? parseInt(pal[0].style.width) || pal.width() : "auto"), + height: (pal.length ? parseInt(pal[0].style.height) || pal.height() : "auto"), + collapsible: true + }, palOptions); + palOpts = $.extend(palOpts, { + onOpen: function () { + var toolbar = $(this).uiPanel("toolbar").empty(); + var btnDir = {top: "up", bottom: "down", right: "right", left: "left"}; + if (!btnDir[region]) { + return; + } + var btnClass = "ui_layout_btn_" + btnDir[region]; + var btn = toolbar.children("." + btnClass); + if (!btn.length) { + btn = $('').addClass('ui_layout_btn').addClass(btnClass).appendTo(toolbar); + btn.bind("click", {dir: region}, function (e) { + _collapsePanel(target, e.data.dir); + return false; + }); + } + $(this).uiPanel("options").collapsible ? btn.show() : btn.hide(); + } + }); + pal.uiPanel(palOpts); + pal.addClass('ui_layout_panel ui_layout_panel_' + region); + panels[region] = pal; + if (pal.uiPanel("options").split) { + pal = pal.uiPanel("panel"); + pal.addClass("ui_layout_split_" + region); + pal.uiPanel('content').addClass("ui_layout_split_content_" + region); + var dir = ''; + switch (region) { + case pal_region.top: + dir = 's'; + break; + case pal_region.bottom: + dir = 'n'; + break; + case pal_region.right: + dir = 'w'; + break; + case pal_region.left: + dir = 'e'; + break; + } + var split_proxy; + pal.resizable($.extend({}, { + handles: dir, + onStartResize: function (e) { + _resizing = true; + if (region == pal_region.top || region == pal_region.bottom) { + split_proxy = target.children('div.ui_layout_split_proxy_v'); + } else { + split_proxy = target.children('div.ui_layout_split_proxy_h'); + } + var mask = $.uiMask.show({container: target, maskID: 'layout'}); + var pos = { + display: 'block', + top: 0, + left: 0, + width: 0, + height: 0, + zIndex: parseInt(mask.css('zIndex')) + 1 + }; + switch (region) { + case pal_region.top: + pos.top = parseInt(pal.css('top')) + pal.outerHeight() - split_proxy.height(); + pos.left = parseInt(pal.css('left')); + pos.width = pal.width(); + pos.height = split_proxy.height(); + break; + case pal_region.bottom: + pos.top = parseInt(pal.css('top')); + pos.left = parseInt(pal.css('left')); + pos.width = pal.width(); + pos.height = split_proxy.height(); + break; + case pal_region.right: + pos.top = parseInt(pal.css('top')) || 0; + pos.left = parseInt(pal.css('left')) || 0; + pos.width = split_proxy.width(); + pos.height = pal.height(); + break; + case pal_region.left: + pos.top = parseInt(pal.css('top')) || 0; + pos.left = pal.outerWidth() - split_proxy.width(); + pos.width = split_proxy.width(); + pos.height = pal.height(); + break; + } + split_proxy.css(pos); + }, + onResize: function (e) { + if (region == pal_region.top || region == pal_region.bottom) { + split_proxy.css('top', e.pageY - $(target).offset().top - split_proxy.height() / 2); + } else { + split_proxy.css('left', e.pageX - $(target).offset().left - split_proxy.width() / 2); + } + return false; + }, + onStopResize: function (e) { + split_proxy.hide(); + split_proxy = null; + pal.uiPanel('resize', e.data); + _resize(target); + _resizing = false; + $.uiMask.remove({container: target, maskID: 'layout'}); + } + }, palOptions)); + } + }; + + function _remove(target, region) { + var panels = $.data(target[0], _cacheName).panels; + if (panels[region].length > 0) { + panels[region].panel('destroy'); + panels[region] = $(); + var expandPalName = 'expand' + region.substring(0, 1).toUpperCase() + region.substring(1); + if (panels[expandPalName]) { + panels[expandPalName].panel('destroy'); + panels[expandPalName] = undefined; + } + } + } + /** + * + * @param target + * @param region + * @param duration 默认值: 'normal', 三种预定速度的字符串('slow', 'normal', 或 'fast')或表示动画时长的毫秒数值(如:1000) + * @private + */ + var _collapsePanel = function (target, region, duration) { + if (duration == undefined) { + duration = 'normal'; + } + var panels = $.data(target[0], _cacheName).panels; + var pal = panels[region]; + var pal_opts = pal.uiPanel('options'); + if (pal_opts.onBeforeCollapse.call(pal) == false) { + return; + } + var expandPalName = 'expand' + region.substring(0, 1).toUpperCase() + region.substring(1); + if (!panels[expandPalName]) { + panels[expandPalName] = _createPanel(pal_opts, region); + panels[expandPalName].uiPanel('panel').bind('click', function () { + var colPalOpts = coll_Opts(); + pal.uiPanel('open').uiPanel('expand', false).uiPanel('resize', colPalOpts.collapse); + pal.uiPanel('panel').animate(colPalOpts.expand, function () { + $(this).unbind('.layout').bind('mouseleave.layout', {region: region}, function (e) { + if (_resizing == true) { + return; + } + _collapsePanel(target, e.data.region); + }); + }); + }); + } + var colPalOpts = coll_Opts(); + if (!_palVisible(panels[expandPalName])) { + panels.center.uiPanel('resize', colPalOpts.resizeC); + } + pal.uiPanel('panel').animate(colPalOpts.collapse, duration, function () { + pal.uiPanel('close').uiPanel('collapse', false); + panels[expandPalName].uiPanel('open').uiPanel('resize', colPalOpts.expandP); + $(this).unbind('.layout'); + }); + function _createPanel(pal_opts, region) { + var btnCollapse; + var title = ''; + var icon = ''; + switch (region) { + case pal_region.right: + btnCollapse = 'ui_layout_btn_left1'; + break; + case pal_region.left: + btnCollapse = 'ui_layout_btn_right1'; + break; + case pal_region.top: + title = pal_opts.title; + icon = pal_opts.icon; + btnCollapse = 'ui_layout_btn_down1'; + break; + case pal_region.bottom: + title = pal_opts.title; + icon = pal_opts.icon; + btnCollapse = 'ui_layout_btn_up1'; + break; + } + var collPal = $('
          ').appendTo(target); + collPal.uiPanel($.extend({}, $.fn.uiLayout.paneldefaults, + {title: title, icon: icon, closed: true, minWidth: 0, minHeight: 0})); + var pal_toolbar = collPal.uiPanel('toolbar').empty(); + var btn = pal_toolbar.children('.' + btnCollapse); + if (!btn.length) { + btn = $('').addClass('ui_layout_btn').addClass(btnCollapse).appendTo(pal_toolbar); + btn.bind('click', {dir: region}, function (e) { + _expandPanel(target, region); + return false; + }); + } + collPal.addClass('ui_layout_expand ui_layout_expand_' + region); + if (region == pal_region.left || region == pal_region.right) { + var collPal_content = collPal.uiPanel('content'); + collPal_content.html('
          ' + pal_opts.title + '
          '); + } else { + collPal.uiPanel('title').css('color', 'black'); + } + collPal.uiPanel('panel').hover(function () { + $(this).addClass('ui_layout_expand_over'); + }, function () { + $(this).removeClass('ui_layout_expand_over'); + }); + return collPal; + } + + function coll_Opts() { + var centerPal_Opts = panels.center.uiPanel('options'); + var pal_collSize = pal_opts.collapsedSize; + switch (region) { + case pal_region.right: + var centerWidth = centerPal_Opts.width + pal_opts.width - pal_collSize; + if (pal_opts.split) { + centerWidth++; + } + return { + resizeC: {width: centerWidth}, + expand: {left: target.width() - pal_opts.width}, + expandP: { + top: centerPal_Opts.top, + left: target.width() - pal_collSize, + width: pal_collSize, + height: centerPal_Opts.height + }, + collapse: {left: target.width(), top: centerPal_Opts.top, height: centerPal_Opts.height} + }; + break; + case pal_region.left: + var centerWidth = centerPal_Opts.width + pal_opts.width - pal_collSize; + if (pal_opts.split || !pal_opts.border) { + centerWidth++; + } + return { + resizeC: {width: centerWidth, left: pal_collSize - 1}, + expand: {left: 0}, + expandP: {left: 0, top: centerPal_Opts.top, width: pal_collSize, height: centerPal_Opts.height}, + collapse: {left: -pal_opts.width, top: centerPal_Opts.top, height: centerPal_Opts.height} + }; + break; + case pal_region.top: + var centerHeight = centerPal_Opts.height; + if (!_palVisible(panels.expandTop)) { + centerHeight += pal_opts.height - pal_collSize + ((pal_opts.split || !pal_opts.border) ? 1 : 0); + } + panels.right.add(panels.left).add(panels.expandRight).add(panels.expandLeft).each(function () { + $(this).uiPanel('resize', {top: pal_collSize - 1, height: centerHeight}); + }); + return { + resizeC: {top: pal_collSize - 1, height: centerHeight}, + expand: {top: 0}, expandP: {top: 0, left: 0, width: target.width(), height: pal_collSize}, + collapse: {top: -pal_opts.height, width: target.width()} + }; + break; + case pal_region.bottom: + var centerHeight = centerPal_Opts.height; + if (!_palVisible(panels.expandBottom)) { + centerHeight += pal_opts.height - pal_collSize + ((pal_opts.split || !pal_opts.border) ? 1 : 0); + } + panels.right.add(panels.left).add(panels.expandRight).add(panels.expandLeft).each(function () { + $(this).uiPanel('resize', {height: centerHeight}); + }); + return { + resizeC: {height: centerHeight}, + expand: {top: target.height() - pal_opts.height}, + expandP: { + top: target.height() - pal_collSize, + left: 0, + width: target.width(), + height: pal_collSize + }, + collapse: {top: target.height(), width: target.width()} + }; + break; + } + } + }; + var _expandPanel = function (target, region) { + var panels = $.data(target[0], _cacheName).panels; + var panel = panels[region]; + var pal_opts = panel.uiPanel('options'); + if (pal_opts.onBeforeExpand.call(panel) === false) { + return; + } + var palOpts = setPalOptions(); + var expandPalName = 'expand' + region.substring(0, 1).toUpperCase() + region.substring(1); + if (panels[expandPalName]) { + panels[expandPalName].uiPanel('close'); + panel.uiPanel('panel').stop(true, true); + panel.uiPanel('open').uiPanel('expand', false).uiPanel('resize', palOpts.collapse); + panel.uiPanel('panel').animate(palOpts.expand, function () { + _resize(target); + }); + } + + function setPalOptions() { + var cPal_opts = panels.center.uiPanel('options'); + if (region == pal_region.right && panels.expandRight) { + return { + collapse: {left: target.width(), top: cPal_opts.top, height: cPal_opts.height}, + expand: {left: target.width() - panels[pal_region.right].uiPanel('options').width} + }; + } else { + if (region == pal_region.left && panels.expandLeft) { + return { + collapse: { + left: -panels[pal_region.left].uiPanel('options').width, + top: cPal_opts.top, + height: cPal_opts.height + }, + expand: {left: 0} + }; + } else { + if (region == pal_region.top && panels.expandTop) { + return { + collapse: {top: -panels[pal_region.top].uiPanel('options').height, width: target.width()}, + expand: {top: 0} + }; + } else { + if (region == pal_region.bottom && panels.expandBottom) { + return { + collapse: {top: target.height(), width: target.width()}, + expand: {top: target.height() - panels[pal_region.bottom].uiPanel('options').height} + }; + } + } + } + } + } + }; + + var _palVisible = function (uiPanel) { + if (!uiPanel) { + return false; + } + if (uiPanel.length > 0) { + return uiPanel.attr('closed') == 'false'; + } else { + return false; + } + }; +})(jQuery); +/** + * Created by jinxs on 14-7-22. + * 基于easyui.tabs源码 + * 依赖 + * ui.core.js + * ui.panel.js + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiTabs'; + /** + * @class 标签页组件 + * @requires {@link uiPanel} + * @constructor uiTabs + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * //采用默认值 + * $('#tab').uiTabs(); + * //设置组件参数 + * $('#tab').uiTabs({height:'20',width:'auto'}); + * //调用组件方法 + * $('#tab').uiTabs('close',''); + */ + $.fn.uiTabs = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiTabs.methods[options](this, param); + } + return this.each(function () { + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiTabs.defaults, me.parseUIConfig(), options), + tabs: [], + selectHis: [] + }); + _init(me); + } + _setProperties(me); + _setSize(me); + _bindEvents(me); + _doFirstSelect(me); + }); + }; + /** + * 方法 + * @lends uiTabs.prototype + */ + $.fn.uiTabs.methods = { + /** + * @summary 获得组件的配置对象 + * @name uiTabs#options + * @function + * @returns {Object} 组件的配置对象 + */ + options: function (target) { + var opts = $.data(target[0], _cacheName).options; + var tab = _getSelectedTab(target); + opts.selected = tab ? _getTabIndex(target, tab) : -1; + return opts; + }, + /** + * @summary 获得组件 + * @name uiTabs#tabs + * @function + * @returns {jQuery} 组件对象 + */ + tabs: function (target) { + return $.data(target[0], _cacheName).tabs; + }, + /** + * @summary 设置组件的大小 + * @name uiTabs#resize + * @function + * @returns {jQuery} 方法调用者 + */ + resize: function (target) { + _setSize(target); + _setSelectedSize(target); + return target; + }, + /** + * @summary 添加标签页 + * @name uiTabs#add + * @function + * @param options {Object} 标签页配置参数 + * @returns {jQuery} 组件对象 + */ + add: function (target, options) { + _addTab(target, options); + return target; + }, + /** + * @summary 关闭标签页 + * @name uiTabs#close + * @function + * @param which {Number} 标签页索引 + * @returns {jQuery} 组件对象 + */ + close: function (target, which) { + _closeTab(target, which); + return target; + }, + /** + * @summary 获得指定标签页 + * @name uiTabs#getTab + * @function + * @param which {Number} 标签页索引 + * @returns {Object} 标签页组件 + */ + getTab: function (target, which) { + return _getTab(target, which); + }, + /** + * @summary 获得标签页Index + * @name uiTabs#getTabIndex + * @function + * @param tab {Object} 需要获取Index的标签页 + * @returns {Object} 标签页组件 + */ + getTabIndex: function (target, tab) { + return _getTabIndex(target, tab); + }, + /** + * @summary 获得已选择的标签页 + * @name uiTabs#getSelected + * @function + * @returns {Object} 标签页组件 + */ + getSelected: function (target) { + return _getSelectedTab(target); + }, + /** + * @summary 选择指定的标签页 + * @name uiTabs#select + * @function + * @param which {Number} 标签页索引 + * @returns {jQuery} 组件对象 + */ + select: function (target, which) { + _selectTab(target, which); + return target; + }, + /** + * @summary 取消选择指定的标签页 + * @name uiTabs#unselect + * @function + * @param which {Number} 标签页索引 + * @returns {jQuery} 组件对象 + */ + unselect: function (target, which) { + _unselectTab(target, which); + return target; + }, + /** + * @summary 是否存在指定的标签页 + * @name uiTabs#exists + * @function + * @param which {Number} 标签页索引 + * @returns {jQuery} 组件对象 + */ + exists: function (target, which) { + return _exists(target, which); + }, + /** + * @summary 更新标签页 + * @name uiTabs#update + * @function + * @param options {Object} 标签页配置参数 + * @returns {jQuery} 组件对象 + */ + update: function (target, options) { + _updateTab(target, options, true); + return target; + }, + /** + * @summary 启用指定标签页 + * @name uiTabs#enableTab + * @function + * @param which {Number} 标签页索引 + * @returns {jQuery} 组件对象 + */ + enableTab: function (target, which) { + var tab = target.uiTabs('getTab', which).uiPanel('options').tab; + tab.removeClass('tabs-disabled'); + return target; + }, + /** + * @summary 禁用指定标签页 + * @name uiTabs#disableTab + * @function + * @param which {Number} 标签页索引 + * @returns {jQuery} 组件对象 + */ + disableTab: function (target, which) { + var tab = target.uiTabs('getTab', which).uiPanel('options').tab; + tab.addClass('tabs-disabled'); + return target; + }, + /** + * @summary 根据偏移量滚动 + * @name uiTabs#scrollBy + * @function + * @param deltaX 偏移量 + * @returns {jQuery} 组件对象 + */ + scrollBy: function (target, deltaX) { + var opts = target.uiTabs('options'); + var targetID = target.getElemID(); + var headerTabs = $.getByParentID(targetID, $.uiTemplate.tabs.headerCenter); + var pos = Math.min(headerTabs.scrollLeft() + deltaX, getMaxScrollWidth()); + headerTabs.animate({scrollLeft: pos}, opts.scrollDuration); + + function getMaxScrollWidth() { + var width = 0; + var ul = $.getByParentID(targetID, $.uiTemplate.tabs.headerTabs); + ul.children('li').each(function () { + width += $(this).outerWidth(true); + }); + return width - headerTabs.width() + (ul.outerWidth() - ul.width()); + } + } + }; + /** + * 默认配置 + * @lends uiTabs.prototype + */ + $.fn.uiTabs.defaults = { + /** + * @type Number + * @default 0 + * @summary 组件宽度 + */ + width: 0, + /** + * @type Number + * @default 0 + * @summary 组件高度 + */ + height: 0, + /** + * @type Number + * @default 150 + * @summary 组件标头宽度 + */ + headerWidth: 150, + /** + * @type String + * @default auto + * @summary 标签宽度 + */ + tabWidth: 'auto', + /** + * @type String + * @default 200 + * @summary 标签页最大宽度 + */ + tabMaxWidth: 200, + /** + * @type Number + * @default 0 + * @summary 选中的标签页索引 + */ + selected: 0, + /** + * @type Boolean + * @default false + * @summary 指示组件是否自动填充 + */ + autoFit: false, + /** + * @type Boolean + * @default true + * @summary 指示组件是否显示边框 + */ + border: true, + /** + * @type Number + * @default 0 + * @summary 最大标签数 + */ + maxTabNumber: 0, + + /** + * 值可为click(鼠标点击切换), mouseover(鼠标滑过切换) + * @type String + * @default click + * @summary 页签切换的模式 + */ + switchMode: 'click', + /** + * @type Boolean + * @default true + * @summary 是否自动循环切换页签 + */ + autoPlay: false, + /** + * @type Number + * @default 2000 + * @summary 自动切换间隔时间 + */ + autoPlayTime: 2000, + /** + * 是否懒加载,当该属性为true时,只有在页签被单击选中时才尝试加载标签页正文区。 + */ + /** + * @type Boolean + * @default false + * @summary 是否延迟加载 + */ + lazyLoad: false, + /** + * @type String + * @default top + * @summary 标签页位置 + */ + tabPosition: 'top', + /** + * @type Number + * @default 100 + * @summary 滚动的步长 + */ + scrollIncrement: 100, + /** + * @type Number + * @default 400 + * @summary 滚动持续时间 + */ + scrollDuration: 400, + /** + * @type Boolean + * @default false + * @summary 是否启用右击菜单 + */ + enableContextMenu: false, + /** + * @type Array + * @default [ + {id: 1, icon: 'update', label: '刷新标签'}, + {id: 2, icon: 'close', label: '关闭标签'}, + {id: 3, icon: 'closeo', label: '关闭其他'}, + {id: 4, icon: 'closea', label: '关闭所有'} + ] + * @summary 右键菜单数据,支持自定义(1~4为系统菜单ID),自定义事件为click,{id: 5, icon: 'closea', label: '关闭所有',onSelect:function(item,triggerData){alert(item.id)}}) + */ + contextData: [ + {id: 1, icon: 'update', label: '刷新标签'}, + {id: 2, icon: 'close', label: '关闭标签'}, + {id: 3, icon: 'closeo', label: '关闭其他'}, + {id: 4, icon: 'closea', label: '关闭所有'} + ], + /** + * @summary 在加载时触发的方法。 + * @event + * @name uiTabs#onLoad + * @param id {String} 所选标签页的id + * @default emptyFn + */ + onLoad: function (panel) { + }, + /** + * @summary 在选择标签页时触发的方法。 + * @event + * @name uiTabs#onSelect + * @param id {String} 所选标签页的id + * @param index {Number} 所选标签页的索引 + * @default emptyFn + */ + onSelect: function (id, index) { + }, + /** + * @summary 取消选择标签页时触发的方法。 + * @event + * @name uiTabs#onUnselect + * @param id {String} 所选标签页的id + * @param index {Number} 所选标签页的索引 + * @default emptyFn + */ + onUnselect: function (id, index) { + }, + /** + * @summary 在关闭标签页之前触发的方法。 + * @event + * @name uiTabs#onBeforeClose + * @param id {String} 所选标签页的id + * @param index {Number} 所选标签页的索引 + * @default emptyFn + */ + onBeforeClose: function (id, index) { + }, + /** + * @summary 在关闭标签页时触发的方法。 + * @event + * @name uiTabs#onClose + * @param id {String} 所选标签页的id + * @param index {Number} 所选标签页的索引 + * @default emptyFn + */ + onClose: function (id, index) { + }, + /** + * @summary 在添加标签页时触发的方法。 + * @event + * @name uiTabs#onAdd + * @param id {String} 所选标签页的id + * @param index {Number} 所选标签页的索引 + * @default emptyFn + */ + onAdd: function (id, index) { + }, + /** + * @summary 在更新标签页时触发的方法。 + * @event + * @name uiTabs#onUpdate + * @param id {String} 所选标签页的id + * @param index {Number} 所选标签页的索引 + * @default emptyFn + */ + onUpdate: function (id, index) { + }, + /** + * @summary 标签页右击时触发的方法。 + * @event + * @name uiTabs#onContextMenu + * @param e {String} + * @param id {String} 所选标签页的id + * @param index {Number} 所选标签页的索引 + * @default emptyFn + */ + onContextMenu: function (e, id, index) { + } + }; + + /** + * 初始化 + * @param target + * @private + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + var tabs = $.data(target[0], _cacheName).tabs; + target.setElemID(); + var targetID = target.getElemID(); + target.addClass('ui_tabs'); + var divs = target.children('div'); + target.empty(); + var reg = new RegExp('({tabs})', 'g'); + target.append($($.uiTemplate.tabs.html.replace(reg, targetID)).html()); + var panels = $.getByParentID(targetID, $.uiTemplate.tabs.panels); + divs.each(function (index, value) { + this.id = targetID + '-' + $.uiTemplate.tabs.panels + '-' + index; + var pal = $(this); + pal.appendTo(panels); + var opts = $.extend({}, pal.parseUIConfig(), { + selected: (pal.attr('selected') ? true : undefined) + }); + tabs.push(pal); + _createTab(target, pal, opts); + }); + $.getByParentID(targetID, $.uiTemplate.tabs.headerLeft) + .add($.getByParentID(targetID, $.uiTemplate.tabs.headerRight)) + .hover( + function () { + $(this).addClass('ui_tabs_scroller_over'); + }, + function () { + $(this).removeClass('ui_tabs_scroller_over'); + } + ); + target.bind("_resize", function () { + var opts = $.data(target[0], _cacheName).options; + if (opts.autoFit == true) { + _setSize(target); + _setSelectedSize(target); + } + }); + _contextMenu(target); + }; + + var _createTab = function (target, pal, palOptions) { + var state = $.data(target[0], _cacheName); + palOptions = palOptions || {}; + var targetID = target.getElemID(); + palOptions = $.extend(true, {}, { + border: false, + padding: '0px', + closed: true, + showHeader: false, + showBtnBar: false, + draggable: false, + resizable: false, + maximizable: false, + collapsible: false, + // 解决panel内容被加载两次的问题 + //content: pal.html(), + onLoad: function () { + if (palOptions.onLoad) { + palOptions.onLoad.call(this, arguments); + } + state.options.onLoad.call(target, $(this)); + } + }, palOptions); + var tabs = $.getByParentID(targetID, $.uiTemplate.tabs.headerTabs); + var reg = new RegExp('({tab})', 'g'); + if (palOptions.id != undefined && palOptions.id != '') { + pal[0].id = palOptions.id; + } else { + palOptions.id = pal[0].id; + } + palOptions.tab = $($.uiTemplate.tabs.tabHtml.replace(reg, pal[0].id)).appendTo(tabs); + _updateTab(target, {tab: pal, options: palOptions}); + }; + + /** + *更新标签页 + * @param target + * @param param + */ + var _updateTab = function (target, param, update) { + update = update == undefined ? false : update; + var selectHis = $.data(target[0], _cacheName).selectHis; + var pal = param.tab; + var palID = pal[0].id; + var palOptions = param.options; + var oldID = ''; + try { + var oldOpts = pal.uiPanel('options'); + oldID = oldOpts.id; + palOptions = $.extend(oldOpts, palOptions); + } catch (e) { + oldID = palOptions.id; + } + if (update) { + pal.uiPanel('refresh', pal.uiPanel('options').url); + } else { + pal.uiPanel(palOptions); + } + var opts = pal.uiPanel('options'); + var tab = opts.tab; + + var tab_title = $.getByParentID(palID, $.uiTemplate.tabs.tab_linkTitle); + var tab_icon = $.getByParentID(palID, $.uiTemplate.tabs.tab_linkIcon); + var tab_close = $.getByParentID(palID, $.uiTemplate.tabs.tab_close); + tab_title.html(opts.title); + tab.attr('title', opts.title); + if (opts.closable) { + if (tab_close.length == 0) { + $('').appendTo(tab); + } + } else { + if (tab_close.length > 0) { + tab_close.remove(); + } + } + if (opts.fontIcon && !_IEunder6) { + opts.fontIcon.size = opts.fontIcon.size || 16; + opts.fontIcon.color = opts.fontIcon.color || 'inherit'; + tab_icon.addClass('ui_panel_fontIcon fa').addClass(opts.fontIcon.icon) + .css({color: opts.fontIcon.color, fontSize: opts.fontIcon.size}); + } else { + if (opts.icon) { + if(opts.icon.indexOf('.')>0){ + tab_icon.addClass('icon').html(""); + }else{ + tab_icon.addClass('icon ' + $.uiTemplate.iconStyle_Pre + opts.icon); + } + } else { + tab_icon.removeClass(); + } + } + if (oldID != opts.id) { + for (var i = 0; i < selectHis.length; i++) { + if (selectHis[i] == oldID) { + selectHis[i] = opts.id; + } + } + } + $.data(target[0], _cacheName).options.onUpdate.call(target, opts.id, _getTabIndex(target, pal)); + }; + + + var _setProperties = function (target) { + var opts = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var header = $.getByParentID(targetID, $.uiTemplate.tabs.header); + var panels = $.getByParentID(targetID, $.uiTemplate.tabs.panels); + + header.removeClass('ui_tabs_header-top ui_tabs_header-bottom ui_tabs_header-left ui_tabs_header-right'); + panels.removeClass('ui_tabs_panels-top ui_tabs_panels-bottom ui_tabs_panels-left ui_tabs_panels-right'); + if (opts.tabPosition == 'top') { + header.insertBefore(panels); + header.addClass('ui_tabs_header-top'); + panels.addClass('ui_tabs_panels-bottom'); + } else if (opts.tabPosition == 'bottom') { + header.insertAfter(panels); + header.addClass('ui_tabs_header-bottom'); + panels.addClass('ui_tabs_panels-top'); + } else if (opts.tabPosition == 'left') { + header.addClass('ui_tabs_header-left'); + panels.addClass('ui_tabs_panels-right'); + } else if (opts.tabPosition == 'right') { + header.addClass('ui_tabs_header-right'); + panels.addClass('ui_tabs_panels-left'); + } + + if (opts.border == true) { + header.removeClass('ui_tabs_header_noborder'); + panels.removeClass('ui_tabs_panels_noborder'); + } else { + header.addClass('ui_tabs_header_noborder'); + panels.addClass('ui_tabs_panels_noborder'); + } + }; + + var _setSize = function (target) { + var state = $.data(target[0], _cacheName); + var opts = state.options; + if (opts.autoFit) { + target.autoFit(true, false); + } else { + target.width(opts.width).height(opts.height); + } + var targetID = target.getElemID(); + var header = $.getByParentID(targetID, $.uiTemplate.tabs.header); + var panels = $.getByParentID(targetID, $.uiTemplate.tabs.panels); + var headerCenter = $.getByParentID(targetID, $.uiTemplate.tabs.headerCenter); + var ul = $.getByParentID(targetID, $.uiTemplate.tabs.headerTabs); + for (var index = 0; index < state.tabs.length; index++) { + var pal = state.tabs[index]; + var pal_opts = pal.uiPanel('options'); + var tab_title = $.getByParentID(pal.getElemID(), $.uiTemplate.tabs.tab_link); + var tab_title_t = $.getByParentID(pal.getElemID(), $.uiTemplate.tabs.tab_linkTitle); + var iconw = 0; + var closew = 0; + if (pal_opts.icon != '' || (pal_opts.fontIcon != null && !_IEunder6)) { + iconw = 20; + tab_title_t.css({left: 20}); + } + if (pal_opts.closable) { + closew = 5; + } + var tabW = parseInt(opts.tabWidth); + opts.tabWidth=opts.tabWidth+''; + if (opts.tabWidth.indexOf("%") > 0) { + tabW = target.width() * tabW / 100; + } + if (tabW && tabW > 0) { + pal_opts.tabWidth = tabW; + tab_title.width(tabW); + tab_title_t.outerWidth(tab_title.width() - iconw - closew); + } else { + var titleW = tab_title_t.outerWidth(); + if (_IEunder9) { + titleW = tab_title_t.text().length * 14; + } + var w = titleW + iconw + closew; + if (w > opts.tabMaxWidth) { + w = opts.tabMaxWidth; + tab_title_t.outerWidth(opts.tabMaxWidth - iconw - closew); + } + pal_opts.tabWidth = w; + tab_title.width(w); + } + } + if (opts.tabPosition == 'left' || opts.tabPosition == 'right') { + header.outerWidth(opts.headerWidth); + panels.outerWidth(target.width() - header.outerWidth()); + panels.outerHeight(target.height()); + header.add(panels).outerHeight(target.height()); + headerCenter.outerWidth(header.width()).outerHeight(target.height()); + ul.outerWidth(headerCenter.width()); + } else { + var scroller_link = $.getByParentID(targetID, $.uiTemplate.tabs.headerLeft) + .add($.getByParentID(targetID, $.uiTemplate.tabs.headerRight)); + header.outerWidth(target.width()); + scroller_link.show(); + ul.outerHeight(opts.tabHeight).css('width', ''); + _setScrollers(target); + panels.outerHeight(target.height() - header.outerHeight()); + panels.outerWidth(target.width()); + } + }; + + + /** + * 是否显示tab左右滚动链接 + * @param target + * @private + */ + var _setScrollers = function (target) { + var opts = $.data(target[0], _cacheName).options; + if (opts.tabPosition == 'left' || opts.tabPosition == 'right') { + return; + } + var targetID = target.getElemID(); + var header = $.getByParentID(targetID, $.uiTemplate.tabs.header); + var headerCenter = $.getByParentID(targetID, $.uiTemplate.tabs.headerCenter); + var sLeft = $.getByParentID(targetID, $.uiTemplate.tabs.headerLeft); + var sRight = $.getByParentID(targetID, $.uiTemplate.tabs.headerRight); + var headerTabs = $.getByParentID(targetID, $.uiTemplate.tabs.headerTabs); + + var tHeight = header.outerHeight(); + var tabsWidth = 0; + headerTabs.children('li').each(function () { + tabsWidth += $(this).outerWidth(true); + }); + var cWidth = header.width(); + + if (tabsWidth > cWidth) { + sLeft.add(sRight).show().outerHeight(tHeight); + headerCenter.css({ + marginLeft: sLeft.outerWidth(), + marginRight: sRight.outerWidth(), + width: cWidth - sLeft.outerWidth() - sRight.outerWidth() + }); + } else { + sLeft.add(sRight).hide(); + headerCenter.css({ + marginLeft: 0, + marginRight: 0, + width: cWidth + }); + } + }; + + /** + * 设置选中的标签页面板的大小 + * @param target + * @private + */ + var _setSelectedSize = function (target) { + var opts = $.data(target[0], _cacheName).options; + var tab = _getSelectedTab(target); + if (tab) { + var panels = $.getByParentID(target.getElemID(), $.uiTemplate.tabs.panels); + var width = panels.width(); + var height = panels.height(); + tab.uiPanel('resize', { + width: width, + height: height + }); + } + }; + + var _bindEvents = function (target) { + var state = $.data(target[0], _cacheName); + var opts = state.options; + var targetID = target.getElemID(); + var header = $.getByParentID(targetID, $.uiTemplate.tabs.header); + var ul = $.getByParentID(targetID, $.uiTemplate.tabs.headerTabs); + header.unbind().bind(opts.switchMode, function (e) { + if (e.target.id == header[0].id || e.target.id == ul[0].id) { + } else if (e.target.id == $.getIDByParentID(targetID, $.uiTemplate.tabs.headerLeft)) { + target.uiTabs('scrollBy', -opts.scrollIncrement); + } else if (e.target.id == $.getIDByParentID(targetID, $.uiTemplate.tabs.headerRight)) { + target.uiTabs('scrollBy', opts.scrollIncrement); + } else { + var evTarget = $(e.target); + var li = evTarget.closest('li'); + if (li.hasClass('tabs-disabled')) { + return; + } + if (li.length) { + var tabIndex = getLiIndex(li); + if (evTarget.hasClass('ui_tab_close')||e.button==1) { + _closeTab(target, tabIndex); + return; + } + var popts = state.tabs[tabIndex].uiPanel('options'); + if (popts.collapsible) { + popts.closed ? _selectTab(target, tabIndex) : _unselectTab(target, tabIndex); + } else { + _selectTab(target, tabIndex); + } + } + } + }); + if (opts.enableContextMenu) { + header.unbind('contextmenu').bind('contextmenu', function (e) { + var li = $(e.target).closest('li'); + if (li.hasClass('tabs-disabled')) { + return; + } + if (li.length) { + var tabIndex = getLiIndex(li); + var tab = target.uiTabs('getTab', tabIndex); + var menu = $.getByParentID(targetID, $.uiTemplate.tabs.tabContextMenu); + var mId = menu.attr('id'); + var mOpt = tab.uiPanel('options'); + + opts.onContextMenu.call(target, e, li[0].id, tabIndex); + menu.uiMenu('show', {triggerObject: e, triggerData: {tabIndex: tabIndex, tabID: tab[0].id}}); + // 没有Iframe时禁用刷新菜单项 + if (!mOpt.iniframe) { + menu.uiMenu('disableItem', mId + '_1'); + } else { + menu.uiMenu('enableItem', mId + '_1'); + } + if (!mOpt.closable) { + menu.uiMenu('disableItem', mId + '_2'); + } else { + menu.uiMenu('enableItem', mId + '_2'); + } + } + }); + } + function getLiIndex(li) { + var index = 0; + ul.children('li').each(function (i) { + if (li[0].id == this.id) { + index = i; + return false; + } + }); + return index; + } + }; + + var _addTab = function (target, options) { + var opts = $.data(target[0], _cacheName).options; + var tabs = $.data(target[0], _cacheName).tabs; + if (options.selected == undefined) options.selected = true; + + if (options.id != undefined && options.id != '') { + var tab = _getTab(target, options.id); + if (tab) { + _selectTab(target, options.id); + return; + } + } else { + options.id = guidGenerator(); + } + var panel = $('
          ').appendTo($.getByParentID(target.getElemID(), $.uiTemplate.tabs.panels)); + tabs.push(panel); + _createTab(target, panel, options); + opts.onAdd.call(target, options.id, tabs.length - 1); + _setSize(target); + if (options.selected) { + _selectTab(target, tabs.length - 1); + } + }; + + /** + * 关闭指定标签页 + * @param target + * @param which + * @private + */ + var _closeTab = function (target, which) { + var opts = $.data(target[0], _cacheName).options; + var tabs = $.data(target[0], _cacheName).tabs; + var selectHis = $.data(target[0], _cacheName).selectHis; + + if (!_exists(target, which)) return; + + var tab = _getTab(target, which); + var id = tab[0].id; + var index = tab[0].index; + + if (opts.onBeforeClose.call(target, id, index) == false) return; + + tabs.splice(index, 1); + tab.uiPanel('options').tab.remove(); + tab.uiPanel('destroy'); + opts.onClose.call(target, id, index); + _setSize(target); + for (var i = 0; i < selectHis.length; i++) { + if (selectHis[i] == id) { + selectHis.splice(i, 1); + i--; + } + } + var hisID = selectHis.pop(); + if (hisID) { + _selectTab(target, hisID); + } else { + _selectTab(target, 0); + } + }; + + /** + * 获取指定的标签页 + */ + var _getTab = function (target, which, removeit) { + var tabs = $.data(target[0], _cacheName).tabs; + if (typeof which == 'number') { + if (which < 0 || which >= tabs.length) { + return null; + } else { + var tab = tabs[which]; + if (removeit) { + tabs.splice(which, 1); + } + tab[0].index = which; + return tab; + } + } + for (var i = 0; i < tabs.length; i++) { + var tab = tabs[i]; + if (tab[0].id == which) { + if (removeit) { + tabs.splice(i, 1); + } + tab[0].index = i; + return tab; + } + } + return null; + }; + + var _getTabIndex = function (target, tab) { + var tabs = $.data(target[0], _cacheName).tabs; + for (var i = 0; i < tabs.length; i++) { + if (tabs[i][0].id == $(tab)[0].id) { + return i; + } + } + return -1; + }; + + var _getSelectedTab = function (target) { + var tabs = $.data(target[0], _cacheName).tabs; + for (var i = 0; i < tabs.length; i++) { + var tab = tabs[i]; + if (tab.uiPanel('options').closed == false) { + return tab; + } + } + return null; + }; + + /** + * 设置第一个选中的标签页 + * @param target + * @private + */ + var _doFirstSelect = function (target) { + var state = $.data(target[0], _cacheName) + _selectTab(target, state.options.selected); + }; + + var _selectTab = function (target, which) { + var state = $.data(target[0], _cacheName); + var opts = state.options; + var tabs = state.tabs; + var selectHis = state.selectHis; + + if (tabs.length == 0) { + return; + } + + var panel = _getTab(target, which); + if (!panel) { + return; + } + var selected = _getSelectedTab(target); + if (selected) { + if (panel[0].id == selected[0].id) { + return; + } + _unselectTab(target, _getTabIndex(target, selected)); + if (!selected.uiPanel('options').closed) { + return; + } + } + + panel.uiPanel('open'); + var palID = panel[0].id; + selectHis.push(palID); + var tab = panel.uiPanel('options').tab; + tab.addClass('tabs_selected'); + + var header = $.getByParentID(target.getElemID(), $.uiTemplate.tabs.header); + var left = tab.position().left; + var right = left + tab.outerWidth(); + if (left < 0 || right > header.width()) { + var deltaX = left - (header.width() - tab.width()) / 2; + $(target).uiTabs('scrollBy', deltaX); + } else { + $(target).uiTabs('scrollBy', 0); + } + + _setSelectedSize(target); + + opts.onSelect.call(target, palID, _getTabIndex(target, panel)); + }; + + var _unselectTab = function (target, which) { + var state = $.data(target[0], _cacheName); + var pal = _getTab(target, which); + if (pal) { + var opts = pal.uiPanel('options'); + if (!opts.closed) { + pal.uiPanel('close'); + if (opts.closed) { + opts.tab.removeClass('tabs_selected'); + state.options.onUnselect.call(target, pal[0].id, _getTabIndex(target, pal)); + } + } + } + }; + + /** + * 判断标签页是否存在 + * @param target + * @param which + * @returns {boolean} + * @private + */ + var _exists = function (target, which) { + return _getTab(target, which) != null; + }; + var _contextMenu = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + if (options.enableContextMenu) { + var menu = $('
          ').appendTo(target); + menu.uiMenu({ + contextMenu: true, + minWidth: 120, + maxWidth: 120, + dataSource: options.contextData, + onSelect: function (item, e) { + var triggerData = menu.uiMenu('options').triggerData; + var tabIndex = triggerData.tabIndex; + var tabID = triggerData.tabID; + switch (item.id) { + case 1: + target.uiTabs('select', tabIndex); + var tab = target.uiTabs('getSelected'); + tab.uiPanel('refresh', tab.uiPanel('options').url); + break; + case 2: + target.uiTabs('close', tabIndex); + break; + case 3: + var tabs = target.uiTabs('tabs'); + for (var i = 0; i < tabs.length; i++) { + var tab = tabs[i]; + if (tabID != tab[0].id && tab.uiPanel('options').closable == true) { + target.uiTabs('close', tab[0].id); + i--; + } + } + break; + case 4: + var tabs = target.uiTabs('tabs'); + for (var i = 0; i < tabs.length; i++) { + var tab = tabs[i]; + if (tab.uiPanel('options').closable == true) { + target.uiTabs('close', i); + i--; + } + } + break; + default : + item.onSelect.call(target, item, triggerData); + break; + } + menu.uiMenu('hide'); + } + }); + } + }; +})(jQuery); +/** + * Created by jinxs on 14-8-7. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiAccordion'; + /** + * @class 手风琴选项卡 + * @requires {@link uiPanel} + * @constructor uiAccordion + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * // 构件组件 + * $('#divMenu').uiAccordion({width: 160, height: 500}); + * // 调用组件方法options + * $('#divMenu').uiAccordion("options"); + */ + $.fn.uiAccordion = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiAccordion.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiAccordion.defaults, me.parseUIConfig(), options) + }); + _setProperties(me); + _init(me); + } + _setSize(me); + _doFirstSelect(me); + }); + }; + + /** + * 方法 + * @lends uiAccordion.prototype + */ + $.fn.uiAccordion.methods = { + /** + * @summary 获得组件的配置对象 + * @name uiAccordion#options + * @function + * @returns {Object} 组件的配置对象 + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 获得组件的面板对象列表 + * @name uiAccordion#panels + * @function + * @returns {Array} 组件的面板对象列表 + */ + panels: function (target) { + return $.data(target[0], _cacheName).panels; + }, + /** + * @summary 根据配置重置控件的大小 + * @name uiAccordion#resize + * @function + * @returns {jQuery} 方法调用者 + */ + resize: function (target) { + _setSize(target); + return target; + }, + /** + * @summary 获得选择的面板对象列表 + * @name uiAccordion#getSelections + * @function + * @returns {Array} 获得选择的面板对象列表 + */ + getSelections: function (target) { + return _getSelections(target); + }, + /** + * @summary 获得选择的第一个面板对象 + * @name uiAccordion#getSelected + * @function + * @returns {Array} 获得选择的第一个面板对象 + */ + getSelected: function (target) { + return _getSelected(target); + }, + /** + * @summary 根据面板索引获得组件的面板对象 + * @name uiAccordion#getPanel + * @function + * @param which {Number} 面板索引 + * @returns {uiPanel|null} 组件的面板对象,若未找到则返回null + * @example + * $('#divMenu').uiAccordion("getPanel", 0); + */ + getPanel: function (target, which) { + return _getPanel(target, which); + }, + /** + * @summary 根据组件面板对象获得的面板索引 + * @name uiAccordion#getPanelIndex + * @function + * @param panel {uiPanel} 面板索引 + * @returns {Number} 组件的面板索引,若未找到则返回-1 + * @example + * $('#divMenu').uiAccordion("getPanelIndex", panel); + */ + getPanelIndex: function (target, panel) { + return _getPanelIndex(target, panel); + }, + /** + * @summary 选择指定的组件的面板对象 + * @name uiAccordion#select + * @function + * @param which {Number} 面板索引 + * @returns {jQuery} 方法调用者 + * @example + * $('#divMenu').uiAccordion("select", 0); + */ + select: function (target, which) { + _select(target, which); + return target; + }, + /** + * @summary 取消选择指定的组件的面板对象 + * @name uiAccordion#unselect + * @function + * @param which {Number} 面板索引 + * @returns {jQuery} 方法调用者 + * @example + * $('#divMenu').uiAccordion("unselect", 0); + */ + unselect: function (target, which) { + _unselect(target, which); + return target; + }, + /** + * @summary 为组件添加面板对象 + * @name uiAccordion#add + * @function + * @param options {Object} 面板配置参数 + * @returns {jQuery} 方法调用者 + */ + add: function (target, options) { + _add(target, options); + return target; + }, + /** + * @summary 移除指定的组件的面板对象 + * @name uiAccordion#remove + * @function + * @param which {Number} 面板索引 + * @returns {jQuery} 方法调用者 + * @example + * $('#divMenu').uiAccordion("remove", 0); + */ + remove: function (target, which) { + _remove(target, which); + return target; + } + }; + + /** + * 默认配置 + * @lends uiAccordion.prototype + */ + $.fn.uiAccordion.defaults = { + /** + * @type Number + * @default 0 + * @summary 组件宽度 + */ + width: 0, + /** + * @type Number + * @default 0 + * @summary 组件高度 + */ + height: 0, + /** + * @type Boolean + * @default false + * @summary 是否自适应宽高 + */ + autoFit: false, + /** + * @type Boolean + * @default true + * @summary 是否显示边框 + */ + border: true, + /** + * @type Boolean + * @default false + * @summary 是否可展开多个面板 + */ + multiple: false, + /** + * @type Number + * @default 0 + * @summary 默认展开的面板索引 + */ + selected: 0, + /** + * @summary 在面板展开时触发的方法。 + * @event + * @name uiAccordion#onSelect + * @param title {String} 所选面板的标题 + * @param index {Number} 所选面板的索引 + * @default emptyFn + */ + onSelect: function (title, index) {}, + /** + * @summary 在面板收缩时触发的方法。 + * @event + * @name uiAccordion#onUnselect + * @param title {String} 所选面板的标题 + * @param index {Number} 所选面板的索引 + * @default emptyFn + */ + onUnselect: function (title, index) {}, + /** + * @summary 在面板被添加时触发的方法。 + * @event + * @name uiAccordion#onAdd + * @param title {String} 所选面板的标题 + * @param index {Number} 所选面板的索引 + * @default emptyFn + */ + onAdd: function (title, index) {}, + /** + * 若方法返回false,则移除操作将撤销 + * @summary 在面板被移除前触发的方法。 + * @event + * @name uiAccordion#onBeforeRemove + * @param title {String} 所选面板的标题 + * @param index {Number} 所选面板的索引 + * @default emptyFn + */ + onBeforeRemove: function (title, index) {}, + /** + * @summary 在面板被移除后触发的方法。 + * @event + * @name uiAccordion#onRemove + * @param title {String} 所选面板的标题 + * @param index {Number} 所选面板的索引 + * @default emptyFn + */ + onRemove: function (title, index) {} + }; + var _init = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + target.setElemID(); + target.addClass('ui_accordion'); + var targetID = target.getElemID(); + if (options.autoFit) { + target.autoFit(true, false); + } else { + target.autoFit(false); + if (!isNaN(options.width)) { + target.outerWidth(options.width); + } else { + target.css('width', ''); + } + if (!isNaN(options.height)) { + target.outerHeight(options.height); + } else { + target.css('height', ''); + } + } + if(options.multiple){ + target.css({overflow:'scroll',overflowX:'hidden'}); + } + state.panels = []; + target.children('div').each(function (index) { + var pal = $(this); + pal.addClass('ui_accordion-panel'); + pal.setIDByParentID(targetID, index); + var opts = $.extend({}, pal.parseUIConfig(), { + selected: (pal.attr('selected') ? true : undefined) + }); + state.panels.push(pal); + _createPanel(target, pal, opts); + }); + + target.bind('_resize', function (e, force) { + if (options.autoFit == true || force) { + target.autoFit(true, false); + _setSize(target); + } + return false; + }); + } + + var _createPanel = function (target, pal, palOptions) { + var opts = $.data(target[0], _cacheName).options; + pal.uiPanel($.extend({}, { + collapsible: true, + width: target.width(), + height: 27, + border: false, + minimizable: false, + maximizable: false, + closable: false, + collapsed: true + }, palOptions, { + onBeforeExpand: function () { + if (!opts.multiple) { + var all = $.grep(_getSelections(target), function (p) { + return p.uiPanel('options').collapsible; + }); + for (var i = 0; i < all.length; i++) { + _unselect(target, _getPanelIndex(target, all[i])); + } + } + var header = $(this).uiPanel('header'); + header.addClass('ui_accordion-header-selected'); + var btnColl_icon = $.getByParentID(palID, $.uiTemplate.panel.btnColl_Icon); + btnColl_icon.removeClass('icon_pal_exp').addClass('icon_pal_col').attr('title', '收缩'); + }, + onExpand: function () { + opts.onSelect.call(target, $(this).uiPanel('options').title, _getPanelIndex(target, this)); + }, + onBeforeCollapse: function () { + var header = $(this).uiPanel('header'); + header.removeClass('ui_accordion-header-selected'); + var btnColl_icon = $.getByParentID(palID, $.uiTemplate.panel.btnColl_Icon); + btnColl_icon.removeClass('icon_pal_col').addClass('icon_pal_exp').attr('title', '展开'); + }, + onCollapse: function () { + opts.onUnselect.call(target, $(this).uiPanel('options').title, _getPanelIndex(target, this)); + } + })); + var palOpts = pal.uiPanel('options'); + if (palOpts.collapsible) { + var palID = pal.getElemID(); + var header = pal.uiPanel('header'); + header.css('cursor', 'pointer'); + var btnColl = $.getByParentID(palID, $.uiTemplate.panel.btnColl); + btnColl.unbind('click.panel').bind('click.accordion', function () { + if (palOpts.collapsed) { + pal.uiPanel('expand', false); + } else { + if (opts.multiple) { + pal.uiPanel('collapse', false); + } else { + if (!header.hasClass('ui_accordion-header-selected')) { + pal.uiPanel('collapse', false); + } + } + } + return false; + }); + } + } + + var _setSize = function (target) { + var state = $.data(target[0], _cacheName); + var panels = state.panels; + var headerHeight = 0; + var bodyHeight = 0; + var headers = target.find('>div.ui_panel>div.ui_panel_header'); + if (headers.length) { + headerHeight = $(headers[0]).outerHeight(); + } + bodyHeight = target.height() - headerHeight * headers.length; + _resize(true, bodyHeight - _resize(false)); + + function _resize(collapsible, height) { + var totalHeight = 0; + for (var i = 0; i < panels.length; i++) { + var p = panels[i]; + var h = p.uiPanel('header').outerHeight(headerHeight); + if (p.uiPanel('options').collapsible == collapsible) { + var pheight = isNaN(height) ? undefined : (height + headerHeight * h.length); + p.uiPanel('resize', { + width: state.options.multiple?target[0].clientWidth:target.width(), + height: (collapsible ? pheight : undefined) + }); + totalHeight += p.uiPanel('panel').outerHeight() - headerHeight; + } + } + return totalHeight; + } + } + var _findBy = function (target, property, value, all) { + var panels = $.data(target[0], _cacheName).panels; + var pp = []; + for (var i = 0; i < panels.length; i++) { + var p = panels[i]; + if (property) { + if (p.uiPanel('options')[property] == value) { + pp.push(p); + } + } else { + if (p[0] == $(value)[0]) { + return i; + } + } + } + if (property) { + return all ? pp : (pp.length ? pp[0] : null); + } else { + return -1; + } + } + + var _getSelections = function (target) { + return _findBy(target, 'collapsed', false, true); + } + + var _getSelected = function (target) { + var pp = _getSelections(target); + return pp.length ? pp[0] : null; + } + + /** + * get panel index, start with 0 + */ + var _getPanelIndex = function (target, panel) { + return _findBy(target, null, panel); + } + + /** + * get the specified panel. + */ + var _getPanel = function (target, which) { + var panels = $.data(target[0], _cacheName).panels; + if (typeof which == 'number') { + if (which < 0 || which >= panels.length) { + return null; + } else { + return panels[which]; + } + } + return _findBy(target, 'title', which); + } + + var _setProperties = function (target) { + var opts = $.data(target[0], _cacheName).options; + if (opts.border) { + target.removeClass('ui_accordion-noborder'); + } else { + target.addClass('ui_accordion-noborder'); + } + } + + /** + * select and set the specified panel active + */ + var _select = function (target, which) { + var p = _getPanel(target, which); + if (!p) { + return + } + p.uiPanel('expand', false); + } + + var _unselect = function (target, which) { + var pal = _getPanel(target, which); + if (!pal) { + return + } + pal.uiPanel('collapse', false); + } + + var _doFirstSelect = function (target) { + var opts = $.data(target[0], _cacheName).options; + var pal = _findBy(target, 'selected', true); + if (pal) { + _selectP(_getPanelIndex(target, pal)); + } else { + _selectP(opts.selected); + } + + function _selectP(index) { + _select(target, index); + } + } + + var _add = function (target, options) { + var state = $.data(target[0], _cacheName); + var opts = state.options; + var panels = state.panels; + if (options.selected == undefined) options.selected = true; + + var pal = $('
          ').appendTo(target); + panels.push(pal); + _createPanel(target, pal, options); + _setSize(target); + + opts.onAdd.call(target, options.title, panels.length - 1); + + if (options.selected) { + _select(target, panels.length - 1); + } + } + + var _remove = function (target, which) { + var state = $.data(target[0], _cacheName); + var opts = state.options; + var panels = state.panels; + + var panel = _getPanel(target, which); + var title = panel.uiPanel('options').title; + var index = _getPanelIndex(target, panel); + + if (!panel) { + return + } + if (opts.onBeforeRemove.call(target, title, index) == false) { + return + } + panels.splice(index, 1); + panel.uiPanel('destroy'); + if (panels.length) { + _setSize(target); + var curr = _getSelected(target); + if (!curr) { + _select(target, 0); + } + } + opts.onRemove.call(target, title, index); + } +})(jQuery);/** + * Created by jinxs on 14-8-11. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiNumberbox'; + /** + * @name uiNumberbox + * @class 数字输入框组件,只能输入数字,字符自动过滤掉。
          + * @constructor uiNumberbox + * @description 构造函数. + * @param options 组件配置参数:{} + * @example + * $('numberbox').uiNumberbox({decimalPrecision:3}); + */ + $.fn.uiNumberbox = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiNumberbox.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiNumberbox.defaults, me.parseUIConfig(), options), + character: '', + allowed: '' + }); + } + _init(me); + }); + }; + /** + * 方法 + * @lends uiNumberbox.prototype + */ + $.fn.uiNumberbox.methods = { + /** + * @summary 启用组件。 + * @name uiNumberbox#enable + * @function + * @example + * $('#input').uiNumberbox("enable") + */ + enable: function (target) { + _enable(target); + return target; + }, + /** + * @summary 禁用组件。 + * @name uiNumberbox#disable + * @function + * @example + * $('#input').uiNumberbox("disable") + */ + disable: function (target) { + _disable(target); + return target; + } + }; + /** + * 默认配置 + * @lends uiNumberbox.prototype + */ + $.fn.uiNumberbox.defaults = + { + /** + * @summary 是否允许输入小数。 + * @default true + * @type Boolean + * @example + * $('#input').uiNumberbox({allowDecimals:true}); + */ + allowDecimals: true, //是否允许输入小数 + /** + * @summary 是否允许输入负数。 + * @default true + * @type Boolean + * @example + * $('#input').uiNumberbox({allowNegative:true}); + */ + allowNegative: true, //是否允许输入负数 + /** + * @summary 精确到小数点后几位。 + * @default 2 + * @type Number + * @example + * $('#input').uiNumberbox({decimalPrecision:2}); + */ + decimalPrecision: 2, //精确到小数点后几位 + /** + * @summary 是否禁用组件。 + * @default false + * @type Boolean + * @example + * $('#input').uiNumberbox({disabled:true}); + */ + disabled: false, + /** + * @summary 在输入框失去焦点时触发的方法。 + * @event + * @param value 当前输入框的值 + * @param event jQuery.Event对象 + * @default emptyFn + * @example + * $('#input').uiNumberbox({onBlur:function(value,event){alert(value);}}); + */ + onBlur: function (value) { + }, + /** + * @summary 是否只读。 + * @default false + * @type Boolean + * @example + * $('#input').uiNumberbox({readOnly:true}); + */ + readOnly: false + }; +//////--------------------------------内部方法------------------------------ + /** + * 创建按钮 + * @param target 目标对象 + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + options.id = options.id || target[0].id; + target.attr("id", options.id); + + if (typeof options.disabled !== "boolean") { + options.disabled = target.attr("disabled"); + } + + if (options.readOnly) { + target.attr("readonly", "readonly"); + } + _buildAllowChars(target); + _create(target); + if (options.disabled) { + _disable(target); + } else { + _enable(target); + } + return target; + }; + // 设置小数精度 + var _fixPrecision = function (value, c, p) { + var v = value.indexOf("."); + if (isNaN(value) && value != ".") { + for (; isNaN(value);) { + value = value.substring(0, value.length - 1); + } + } + if (!p.allowNegative && value.indexOf("-") != -1) { + var array = value.split("-"); + value = array.join(""); + } + if (!p.allowDecimals && v != -1 || value.charAt(value.length - 1) === '.') { + return value.substring(0, v); + } + if (v != -1) { + value = value.substring(0, v + p.decimalPrecision + 1); + } + return value.length > 0 ? parseFloat(value) : ""; + }; + var _create = function (target) { + var options = $.data(target[0], _cacheName).options; + target.addClass("ui_numberbox") + .css("ime-mode", "disabled"); + + target.keypress(function (e) { + if (e.which == null && (e.charCode != null || e.keyCode != null)) { + e.which = e.charCode != null ? e.charCode : e.keyCode; + } + var k = e.which; + if (k === 8 || (k == 46 && e.button == -1) || k === 0) { + return; + } + var character = String.fromCharCode(k); + $.data(target[0], _cacheName).character = character; + var allowed = $.data(target[0], _cacheName).allowed; + if (allowed.indexOf(character) === -1 || ($(this).val().indexOf("-") !== -1 && character == "-") + || ($(this).val().indexOf(".") !== -1 && character == ".")) { + e.preventDefault(); + } + }).focus(function () { + target.addClass('ui-focus'); + }).blur(function (e) { + target.removeClass('ui-focus'); + var character = $.data(target[0], _cacheName).character; + target[0].value = _fixPrecision(this.value, character, options); + target.trigger("onBlur", e, this.value); + }).keydown(function (e) { + _checkLast(target); + + //Chrome并不支持css属性ime-mode,无法阻止拼音输入,但当使用输入法时,事件的e.which===229恒成立. + if (229 === e.which) { + e.preventDefault(); + } + }).keyup(function (e) {//在Chrome中文输入法下,输入 ,。等字符不会触发input框的keypress事件 + _checkLast(target); + }).bind('cut paste', function (e) { + return false; + }); + }; + var _checkLast = function (target) { + var v = target[0].value, + len = v.length; + if (v && $.data(target[0], _cacheName).allowed.indexOf(v.charAt(len - 1)) === -1 + || v.indexOf('.') != v.lastIndexOf('.') + || v.indexOf('-') != v.lastIndexOf('-')) { + target[0].value = v = v.substring(0, (len--) - 1); + } + }; + + var _buildAllowChars = function (target) { + var options = $.data(target[0], _cacheName).options; + var allowed = "0123456789"; + // 允许输入的字符 + if (options.allowDecimals) { + allowed = allowed + "."; + } + if (options.allowNegative) { + allowed = allowed + "-"; + } + if (options.readOnly) { + allowed = ""; + } + $.data(target[0], _cacheName).allowed = allowed; + }; + var _disable = function (target) { + target.attr("disabled", true) + .addClass("ui-disabled"); + }; + var _enable = function (target) { + target.attr("disabled", false) + .removeClass("ui-disabled"); + }; +})(jQuery);/** + * Created by jinxs on 14-8-11. + */ +(function ($) { + /** + * 缓存名称 + * @type {String} + * @private + */ + var _cacheName = 'uiDate'; + /** + * @class 日期输入框 + * @requires {@link My97DatePicker} + * @constructor uiDate + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的方法的参数 + * @example + * // 构件组件 + * $('#numberbox').uiDate({dateFmt: 'yyyy-MM-dd'}); + * // 调用组件方法enable + * $('#numberbox').uiDate("enable"); + */ + $.fn.uiDate = function (options, param) { + if (this.length > 0 && typeof options == 'string') { + return $.fn.uiDate.methods[options](this.first(), param); + } + return this.each(function(){ + var me = $(this); + var cache = me.data(_cacheName); + + options = options || {}; + if (cache) { + $.extend(cache.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiDate.defaults, me.parseUIConfig(), options) + }); + } + _init(me); + }); + }; + /** + * 方法 + * @lends uiDate.prototype + */ + $.fn.uiDate.methods = { + /** + * @summary 启用组件 + * @name uiDate#enable + * @function + * @returns {jQuery} 方法调用者 + * @example + * $('#input').uiDate("enable") + */ + enable: function (target) { + _enable(target); + return target; + }, + /** + * @summary 禁用组件。 + * @name uiDate#disable + * @function + * @returns {jQuery} 方法调用者 + * @example + * $('#input').uiDate("disable") + */ + disable: function (target) { + _disable(target); + return target; + }, + setReadonly:function(target,readonly){ + _setReadonly(target,readonly); + return target; + } + }; + /** + * 默认配置 + * @lends uiDate.prototype + */ + $.fn.uiDate.defaults = + { + /** + * @type Boolean + * @default false + * @summary 是否必填 + */ + required: false, + /** + * @type Number + * @default 150 + * @summary 控件宽度 + */ + width: 150, + skin: 'default', + /** + * 设置初始化时显示的日期值,若不设置则为当前日期,可结合参数alwaysUseStartDate使用 + * @name uiDate#startDate + * @type String + * @default '' + * @summary 默认开始日期 + */ + startDate: '', + /** + * 若为true,则控件初始化时,无论输入框的值是否为空都将使用开始日期作为默认值 + * @type Boolean + * @default false + * @summary 是否始终使用默认开始日期 + */ + alwaysUseStartDate: false, + /** + * @type Boolean + * @default false + * @summary 双日历 + */ + doubleCalendar: false, + /** + * 若不设置,最小日期为1900-01-01 00:00:00
          + * 其它特性同maxDate + * @type String + * @default '' + * @summary 限制最小日期 + */ + minDate: '', + /** + * 若不设置,最大日期为2099-12-31 23:59:59
          + * 可以通过系统给出的动态变量,如%y(当前年),%M(当前月)等来限度日期范围,你还可以通过{}进行表达式运算,如:{%d+1}:表示明天
          + * 动态变量表:
          + * + * + * + * + * + * + * + * + * + * + * + * + * + *
          格式说明
          %y当前年
          %M当前月
          %d当前日
          %ld本月最后一天
          %H当前时
          %m当前分
          %s当前秒
          {}运算表达式,如:{%d+1}:表示明天
          #F{}{}之间是函数可写自定义JS代码
          + * @type String + * @default '' + * @summary 限制最大日期 + */ + maxDate: '', + /** + * 设置为true时,无效天和无效日期变成有效天和有效日期 + * 使用无效天和无效日期可以很方便的禁用不可用的日期,但是在只需要启用少部分日期的情况下,有效天和有效日期的功能就非常适合了
          + * @type Boolean + * @default false + * @summary 有效天与有效日期反转 + */ + opposite: false, + /** + * 可以使用此功能禁用周日至周六所对应的日期(0至6 分别代表 周日至周六) + * @type Array + * @default [] + * @summary 设置不可用的天 + */ + disabledDays: [], + /** + * 可以使用此功能禁用,所指定的一个或多个日期,只要你熟悉正则表达式,你可以尽情发挥
          + * ['2008-02-01','2008-02-29'] 表示禁用 2008-02-01 和 2008-02-29
          + * ['2008-..-01','2008-02-29'] 表示禁用 2008-所有月份-01 和 2008-02-29
          + * ['200[0-8]]-02-01','2008-02-29'] 表示禁用 [2000至2008]-02-01 和 2008-02-29
          + * ['^2006'] 表示禁用 2006年的所有日期
          + * 此外,您还可以使用 %y %M %d %H %m %s 等变量, 用法同动态日期限制 注意:%ld不能使用
          + * ['....-..-01','%y-%M-%d'] 表示禁用 所有年份和所有月份的第一天和今天
          + * ['%y-%M-{%d-1}','%y-%M-{%d+1}'] 表示禁用 昨天和明天
          + * 当然,除了可以限制日期以外,您还可以限制时间
          + * ['....-..-.. 10\:00\:00'] 表示禁用 每天10点 (注意 : 需要 使用 \: ) + * @type Array + * @default [] + * @summary 设置不可用的日期 + */ + disabledDates: [], + /** + * @type Array + * @default [] + * @summary 设置特殊的天 + */ + specialDays: [], + /** + * @type Array + * @default [] + * @summary 设置特殊的日期 + */ + specialDates: [], + /** + * 纠错处理可设置为3种模式:提示(默认) 自动纠错 标记,当日期框中的值不符合格式时,系统会尝试自动修复, + * 如果修复失败会根据您设置的纠错处理模式进行处理,错误判断功能非常智能它可以保证用户输入的值是一个合法的值 + * 使用默认容错模式 提示模式 errDealMode = 0 在输入错误日期时,会先提示 + * 自动纠错模式 errDealMode = 1 在输入错误日期时,自动恢复前一次正确的值 + * 标记模式 errDealMode = 2 在输入错误日期时,不做提示和更改,只是做一个标记,但此时日期框不会马上隐藏 + * @type Number + * @default 1 + * @summary 自动纠错功能 + */ + errDealMode: 1, + /** +

          yMdHmswW分别代表年月日时分秒星期周,你可以任意组合这些元素来自定义你个性化的日期格式.


          日期格式表 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          格式说明
          y将年份表示为最多两位数字。如果年份多于两位数,则结果中仅显示两位低位数。
          yy 同上,如果小于两位数,前面补零。
          yyy将年份表示为三位数字。如果少于三位数,前面补零。
          yyyy将年份表示为四位数字。如果少于四位数,前面补零。
          M将月份表示为从 1 至 12 的数字
          MM同上,如果小于两位数,前面补零。
          MMM返回月份的缩写 一月 至 十二月 (英文状态下 Jan to Dec) 。
          MMMM返回月份的全称 一月 至 十二月 (英文状态下 January to December) 。
          d将月中日期表示为从 1 至 31 的数字。
          dd同上,如果小于两位数,前面补零。
          H 将小时表示为从 0 至 23 的数字。
          HH同上,如果小于两位数,前面补零。
          m将分钟表示为从 0 至 59 的数字。
          mm同上,如果小于两位数,前面补零。
          s将秒表示为从 0 至 59 的数字。
          ss同上,如果小于两位数,前面补零。
          w返回星期对应的数字 0 (星期天) - 6 (星期六) 。
          D返回星期的缩写 一 至 六 (英文状态下 Sun to Sat) 。
          DD返回星期的全称 星期一 至 星期六 (英文状态下 Sunday to Saturday) 。
          W返回周对应的数字 (1 - 53) 。
          WW同上,如果小于两位数,前面补零 (01 - 53) 。

          示例
          + + + + + + + + + + + + + + + + + + + + + + + + + +
          格式字符串
          yyyy-MM-dd HH:mm:ss2008-03-12 19:20:00
          yy年M月08年3月
          yyyyMMdd20080312
          今天是:yyyy年M年d HH时mm分 今天是:2008年3月12日 19时20分
          H:m:s19:20:0
          y年8年
          MMMM d, yyyy三月 12, 2008
          + * @type String + * @default 'yyyy-MM-dd' + * @summary 日期格式 + */ + dateFmt: 'yyyy-MM-dd', + /** + * @default false + * @type Boolean + * @summary 是否禁用组件 + * @example + * $('#input').uiDate({disabled:true}); + */ + disabled: false, + /** + * 如果日期格式里不包含 d(天) 这个元素时,快速选择将一直显示 + * @default true + * @type Boolean + * @summary 是否启用快速选择功能 + */ + qsEnabled: true, + /** + * 可以传入5个快速选择日期 + * 日期格式必须与 realDateFmt realTimeFmt 相匹配 + * 除了使用静态的日期值以外,还可以使用动态参数(如:%y,%M分别表示当前年和月) + * @default [] + * @type Array + * @summary 快速选择数据 + */ + quickSel: [], + /** + * @default false + * @type Boolean + * @example + * $('#input').uiDate({readonly:true}); + * @summary 是否只读 + */ + readonly: false, + /** + * 可以通过配置此属性决定是否限制周,并且在返回日期的时候还可以通过自带的自定义事件和API函数返回选择的周 + * @default false + * @type Boolean + * @summary 是否显示周 + * @example + * $('#input').uiDate({isShowWeek:true,onpicked:function(){$dp.$('d122_1').value=$dp.cal.getP('W','W');$dp.$('d122_2').value=$dp.cal.getP('W','WW');}}); + */ + isShowWeek: false, + /** + * @default true + * @type Boolean + * @summary 是否高亮周末 + */ + highLineWeekDay: true, + /** + * @default true + * @type Boolean + * @summary 是否显示清空按钮 + */ + isShowClear: true, + /** + * @default true + * @type Boolean + * @summary 是否显示今天按钮 + */ + isShowToday: true, + /** + * 例如{left:100,top:100} + * @default {} + * @type Object + * @summary 自定义换件的显示位置 + */ + position: {}, + /** + * 各个国家的习惯不同,有些喜欢以星期日作为第一天,有些以星期一作为第一天. + * 相关属性:firstDayOfWeek: 可设置 0 - 6 的任意一个数字,0:星期日 1:星期一 以此类推 + * @default 1 + * @type Number + * @summary 自定义星期的第一天 + */ + firstDayOfWeek: 1, + /** + * 在输入框失去焦点时触发的方法。 + * @event + * @name uiDate#onpicking + * @param dp {Object} 控件API + * @default emptyFn + * @example + * $('#input').uiDate({onpicking:function(dp){ + * if(!confirm('日期框原来的值为: '+dp.cal.getDateStr()+', 要用新选择的值:' + dp.cal.getNewDateStr() + '覆盖吗?')) + * return true; + * }}); + * @summary 在输入框失去焦点时触发 + */ + onpicking: function (dp) {}, + /** + * @summary 在输入框失去焦点时触发的方法。 + * @event + * @name uiDate#onpicked + * @param dp {Object} 控件API + * @default emptyFn + * @example + * 选择第一个日期的时候,第二个日期选择框自动弹出 + * 注意:下面第一个控件代码的写法 + * + * 至 + * + * 注意:$dp.$是一个内置函数,相当于document.getElementById + */ + onpicked: function (dp) {}, + /** + * 当函数返回true时,系统的清空事件将被取消 + * @summary 在输入框的值被清空时触发的方法。 + * @event + * @name uiDate#onclearing + * @default emptyFn + */ + onclearing: function () { + }, + /** + * @summary 在输入框的值被清空后触发的方法。 + * @param dp {Object} 控件API + * @event + * @name uiDate#oncleared + * @default emptyFn + */ + oncleared: function (dp) {}, + /** + * 在方法内可使用$dp.cal.date和$dp.cal.newdate获得更改前后的日期对象
          + * 类似的事件有Mchanging、dchanging、Hchanging、mchanging和schanging + * @event + * @summary 年份更改时触发的事件 + * @name uiDate#ychanging + * @default emptyFn + */ + ychanging: function () {}, + /** + * 在方法内可使用$dp.cal.date和$dp.cal.newdate获得更改前后的日期对象
          + * 类似的事件有Mchanged、dchanged、Hchanged、mchanged和schanged + * @event + * @summary 年份更改后触发的事件 + * @name uiDate#ychanged + * @default emptyFn + */ + ychanged: function () {}, + Mchanging: function () {}, + Mchanged: function () {}, + dchanging: function () {}, + dchanged: function () {}, + Hchanging: function () {}, + Hchanged: function () {}, + mchanging: function () {}, + mchanged: function () {}, + schanging: function () {}, + schanged: function () {} + }; +//////--------------------------------内部方法------------------------------ + /** + * 创建按钮 + * @param target 目标对象 + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + target.setElemID().addClass('ui_date'); + var targetID = target.getElemID(); + if (typeof options.disabled !== "boolean") { + options.disabled = target.attr("disabled"); + } + var span = $($.uiTemplate.datepicker.pickerHtml).setIDByParentID(targetID, $.uiTemplate.datepicker.pickerSpan); + target.wrap(span); + var icon = $($.uiTemplate.datepicker.iconHtml).setIDByParentID(targetID, $.uiTemplate.datepicker.icon); + target.after(icon); + _setReadonly(target,options.readonly); + if(_IEunder7) { + target.outerWidth(options.width - icon.outerWidth()); + }else{ + target.outerWidth(options.width - icon.outerWidth()+2); + } + + return target; + }; + var _disable = function (target) { + var icon = $.getByParentID(target.getElemID(), $.uiTemplate.datepicker.icon); + target.attr("disabled", true) + .addClass("ui-disabled"); + target.unbind('.uiDate'); + icon.unbind('.uiDate'); + }; + var _enable = function (target) { + var options = $.data(target[0], _cacheName).options; + target.attr("disabled", false) + .removeClass("ui-disabled"); + var icon = $.getByParentID(target.getElemID(), $.uiTemplate.datepicker.icon); + var span = $.getByParentID(target.getElemID(), $.uiTemplate.datepicker.pickerSpan); + icon.unbind('.uiDate').bind('click.uiDate', function () { + target.focus(); + }); + target.unbind('.uiDate').bind('focus.uiDate',function () { + span.addClass('ui_date-focus'); + WdatePicker(options); + }).bind('blur.uiDate', function () { + span.removeClass('ui_date-focus'); + }); + if (options.required) { + target.uiValidate({ + required: true, + tipOffset: [20, 0], + afterValidate: function (validate) { + if (!validate) { + span.addClass('ui_date-invalid'); + } else { + span.removeClass('ui_date-invalid'); + } + } + }); + target.css('border','0'); + } + }; + var _setReadonly = function (target, readonly) { + var options = $.data(target[0], _cacheName).options; + var icon = $.getByParentID(target.getElemID(), $.uiTemplate.datepicker.icon); + var span = $.getByParentID(target.getElemID(), $.uiTemplate.datepicker.pickerSpan); + var input = span.find('.ui_date'); + if (readonly) { + span.addClass('ui_validate_disabled'); + icon.hide(); + input.width(input.width() + 20); + target.attr('readonly',true); + target.unbind('.uiDate'); + icon.unbind('.uiDate'); + var starId=target.attr('id')+'-star'; + $('#'+starId).remove(); + } else { + span.removeClass('ui_validate_disabled'); + icon.show(); + input.width(input.width() - 20); + if (options.disabled) { + _disable(target); + } else { + _enable(target); + } + } + } +})(jQuery);/** + * Created by jinxs on 14-8-13. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiValidate'; + /** + * @class 验证组件 + * @constructor uiValidate + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * //采用默认值 + * $('#tab').uiValidate(); + * //设置组件参数 + * $('#tab').uiValidate({delay:'200',width:'150'}); + * //调用组件方法 + * $('#tab').uiValidate('destroy',''); + */ + $.fn.uiValidate = function (options, param) { + if (this.length > 0 && typeof options == 'string') { + return $.fn.uiValidate.methods[options](this, param); + } + return this.each(function () { + var me = $(this); + var state = me.data(_cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + } else { + me.data(_cacheName, {options: $.extend({}, $.fn.uiValidate.defaults, me.parseUIConfig(), options)}); + _init(me); + } + _isValidate(me); + _isValid(me); + setTimeout(function () { + _hideTip(me); + }, options.delay); + $.getByParentID(me.attr('id'), $.uiTemplate.uiValidate.lenDiv).hide(); + }); + }; + /** + * 方法 + * @lends uiValidate.prototype + */ + $.fn.uiValidate.methods = { + /** + * @summary 获取组件配置参数 + * @function + * @name uiValidate#options + * @returns {Object} + * @example + * $('#btn').uiValidate('options'); + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 移除组件 + * @name uiValidate#destroy + * @function + * @returns {jQuery} 组件对象 + */ + destroy: function (target) { + _destroy(target); + }, + /** + * @summary 验证 + * @name uiValidate#validate + * @function + * @returns {jQuery} 组件对象 + */ + validate: function (target) { + _isValid(target); + return target; + }, + /** + * @summary 是否合法 + * @name uiValidate#isValid + * @function + * @returns {Boolean} + */ + isValid: function (target) { + return _isValid(target); + }, + /** + * @summary 启用验证功能 + * @name uiValidate#enableValidation + * @function + * @returns {jQuery} 组件对象 + */ + enableValidation: function (target) { + _isValidate(target, false); + return target; + }, + /** + * @summary 禁用验证功能 + * @name uiValidate#disableValidation + * @function + * @returns {jQuery} 组件对象 + */ + disableValidation: function (target) { + _isValidate(target, true); + return target; + }, + /** + * @summary 启用组件 + * @name uiValidate#enable + * @function + * @returns {jQuery} 组件对象 + */ + enable: function (target) { + target.attr('readonly', false).removeClass('ui_validate_disabled'); + _isValidate(target, false); + return target; + }, + /** + * @summary 禁用组件 + * @name uiValidate#disable + * @function + * @returns {jQuery} 组件对象 + */ + disable: function (target) { + _isValidate(target, true); + return target; + }, + /** + * @summary 设置组件是否为只读 + * @name uiValidate#setReadonly + * @function + * @param readonly {Boolean} 是否为只读 + * @returns {jQuery} 组件对象 + */ + setReadonly: function (target, readonly) { + _setReadonly(target, readonly); + return target; + } + }; + /** + * 默认配置 + * @lends uiValidate.prototype + */ + $.fn.uiValidate.defaults = { + /** + * @type Number + * @default 150 + * @summary 组件宽度 + */ + width: 150, + /** + * @type Boolean + * @default false + * @summary 是否必填 + */ + required: false, + star: {show: true, front: false}, + /** + * @type Boolean + * @default false + * @summary 指示组件是否禁用 + */ + disabled: false, + readonly: false, + /** + * @type String + * @default null + * @summary 空值 + */ + nullValue: null, + /** + * 验证规则包含:

          + * + * + * + * + * + * + * + * + * + * + * + *
          属性说明
          username姓名
          phone电话
          mobile移动电话
          email邮箱
          urlURL
          length输入文本的长度:用法:length[0,10]
          remote远程
          + * @type String + * @default null + * @summary 验证类型 + */ + validType: null, + /** + * @type String + * @default null + * @summary 验证参数 + */ + validParams: null, + /** + * @type Boolean + * @default false + * @summary 是否输入完即验证 + */ + tipAfterInput: false, + /** + * @type Boolean + * @default false + * @summary 是否以html Title的形式显示提示信息 + */ + showTitleTip: false, + /** + * @type Number + * @default 200 + * @summary 组件输入框在编辑后执行验证前的延迟毫秒数 + */ + delay: 200, + /** + * @type String + * @default 必填项! + * @summary 必填提示消息 + */ + missingMessage: '必填项!', + tipMessage:'', + /** + * @type String + * @default "" + * @summary 无效提示消息 + */ + invalidMessage: '', + /** + * @type String + * @default right + * @summary 提示消息的位置 + */ + tipPosition: 'right', + /** + * @type String + * @default [0, 19] + * @summary 提示消息的偏移量 + */ + tipOffset: [0, 0], + /** + * @type Boolean + * @default false + * @summary 是否显示验证后的效果 + */ + novalidate: false, + /** + * @summary 在验证之后触发的方法。 + * @event + * @name uiValidate#afterValidate + * @param isValidate {Boolean} 是否验证 + * @default emptyFn + */ + afterValidate: function (isValidate) { + }, + /** + * 验证规则包含:

          + * + * + * + * + * + * + * + * + * + * + * + *
          属性说明
          username姓名
          phone电话
          mobile移动电话
          email邮箱
          urlURL
          length输入文本的长度
          remote远程
          + * @summary 验证规则定义,通过validType调用,可通过扩展该方法实现更多的验证规则 + * @name uiValidate#rules + */ + rules: { + username: { + validator: function (val) { + return $.regexs.username.test(val); + }, message: '请输入合法的用户名!' + }, + phone: { + validator: function (val) { + return $.regexs.phone.test(val); + }, message: '电话格式错误!' + }, + mobile: { + validator: function (val) { + return $.regexs.mobile.test(val); + }, message: '手机号码格式错误!' + }, + email: { + validator: function (val) { + return $.regexs.email.test(val); + }, message: "请输入有效的邮箱地址!" + }, + url: { + validator: function (val) { + return $.regexs.url.test(val); + }, message: "请输入合法的URL!" + }, + length: { + validator: function (val, len) { + var valLen = $.trim(val).length; + var lenDivName = $.uiTemplate.uiValidate.lenDiv; + var lenDiv = $.getByParentID(this[0].id, lenDivName); + if (lenDiv.length == 0) { + lenDiv = $('
          '); + this.after(lenDiv); + } + lenDiv.html('字数:' + valLen); + if (_IEunder9) { + lenDiv.width(80); + } + var pos = this.position(); + lenDiv.css({ + top: pos.top + this.outerHeight(), + left: pos.left + this.outerWidth() - lenDiv.outerWidth() + }); + return valLen >= len[0] && valLen <= len[1]; + }, message: "长度必须介于{0}~{1}。" + }, + remote: { + validator: function (val, params) { + var date = {}; + date[params[1]] = val; + var responseText = $.ajax({ + url: params[0], + dataType: "json", + data: date, + async: false, + cache: false, + type: "post" + }).responseText; + return responseText == "true"; + }, message: "请确认信息的正确性!" + } + } + }; + var _init = function (target) { + target.each(function () { + var me = $(this); + if (this.style.width == '' && me.attr("cols") === undefined) { + me.width(me.data(_cacheName).options.width); + } + me.setElemID(); + me.addClass("ui_validate"); + }); + }; + + var _destroy = function (target) { + target.each(function () { + var me = $(this); + var state = me.data(_cacheName); + state.validating = false; + if (state.timer) { + clearTimeout(state.timer); + } + me.tooltip("destroy"); + me.remove(); + }); + }; + + function _bindEvents(target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + target.unbind(".uiValidate"); + if (options.novalidate) { + return; + } + target.bind("focus.uiValidate", function () { + state.validating = true; + state.value = undefined; + target.addClass('ui-focus'); + if (options.tipAfterInput) { + (function () { + if (state.validating) { + if (state.value != target.val()) { + state.value = target.val(); + if (state.timer) { + clearTimeout(state.timer); + } + state.timer = setTimeout(function () { + vali(); + }, state.options.delay); + } else { + _reShowTip(target); + } + setTimeout(arguments.callee, 200); //递归调用 + } + })(); + } else { + vali(); + } + + function vali() { + var vali = target.uiValidate("isValid"); + } + + var lenDiv = $.getByParentID(target[0].id, $.uiTemplate.uiValidate.lenDiv); + lenDiv.show(); + }) + .bind("blur.uiValidate", function () { + target.removeClass('ui-focus'); + if (state.timer) { + clearTimeout(state.timer); + state.timer = undefined; + } + state.validating = false; + if (!options.tipAfterInput) { + target.uiValidate("validate"); + } + _hideTip(target); + var lenDiv = $.getByParentID(target[0].id, $.uiTemplate.uiValidate.lenDiv); + lenDiv.hide(); + }) + .bind("mouseover.uiValidate", function () { + if(options.tipMessage!=''){ + state.message=options.tipMessage; + _showTip(target); + } + if (target.hasClass("ui_validate-invalid")) { + _showTip(target); + } + }) + .bind("mouseleave.uiValidate", function () { + if (!state.validating) { + _hideTip(target); + } + }); + }; + var _showTip = function (target) { + target.each(function () { + var me = $(this); + var state = me.data(_cacheName); + var options = state.options; + if (_IEunder6 || options.showTitleTip) { + me[0].title = state.message; + state.tip = true; + return; + } + me.uiTooltip({content: state.message, region: options.tipPosition, offset: options.tipOffset}) + .uiTooltip('show'); + state.tip = true; + }); + }; + + var _reShowTip = function (target) { + var state = $.data(target[0], _cacheName); + if (state) { + if (_IEunder6 || state.options.showTitleTip) { + target[0].title = state.message; + return; + } + if (state.tip) { + var targetID = target.getElemID(); + var tipContent = $.getByParentID(targetID, $.uiTemplate.tooltip.content); + if (tipContent.length > 0 && tipContent.is(':visible')) { + tipContent.html(state.message); + } + } + } + }; + var _hideTip = function (target) { + target.each(function () { + var me = $(this); + var state = me.data(_cacheName); + if (_IEunder6 || state.options.showTitleTip) { + return; + } + state.tip = false; + me.uiTooltip('hide'); + }); + }; + + var _isValid = function (target) { + var rs = true; + target.each(function () { + var me = $(this); + var state = me.data(_cacheName); + var options = state.options; + var val = me.val(); + if (options.novalidate || me.is(":disabled")) { + me.removeClass("ui_validate-invalid"); + _hideTip(me); + me[0].title = ''; + return true; + } + if (options.required) { + me[0].title = ''; + if ($.trim(val) == "" || val == options.nullValue) { + me.addClass("ui_validate-invalid"); + _setMsg(options.missingMessage); + if (state.validating) { + _showTip(me); + } + options.afterValidate.call(me, false); + rs = false; + return true; + } + options.afterValidate.call(me, true); + } + if (options.validType) { + if ($.isArray(options.validType)) { + for (var i = 0; i < options.validType.length; i++) { + if (!_valid(options.validType[i])) { + options.afterValidate.call(me, false); + rs = false; + return true; + } + } + } else { + if (typeof options.validType == "string") { + if (!_valid(options.validType)) { + options.afterValidate.call(me, false); + rs = false; + return true; + } + } else { + for (var typeName in options.validType) { + var valid = options.validType[typeName]; + if (!_valid(typeName, valid)) { + options.afterValidate.call(me, false); + rs = false; + return true; + } + } + } + } + } + me.removeClass("ui_validate-invalid"); + _hideTip(me); + options.afterValidate.call(me, true); + + function _setMsg(msg) { + state.message = msg; + } + + function _valid(typeName, validOpts) { + me[0].title = ''; + var params = /([a-zA-Z_]+)(.*)/.exec(typeName); + var rule = options.rules[params[1]]; + if (rule && val) { + var valid_options = validOpts || options.validParams || eval(params[2]); + if (!rule["validator"].call(me, val, valid_options)) { + me.addClass("ui_validate-invalid"); + var msg = rule["message"]; + if (valid_options) { + for (var i = 0; i < valid_options.length; i++) { + msg = msg.replace(new RegExp("\\{" + i + "\\}", "g"), valid_options[i]); + } + } + _setMsg(options.invalidMessage || msg); + if (state.validating) { + _showTip(me); + } + return false; + } + } + return true; + } + }); + return rs; + }; + + var _isValidate = function (target, novalidate) { + target.each(function () { + var me = $(this); + if (me.data(_cacheName)) { + var options = me.data(_cacheName).options; + if (novalidate != undefined) { + options.novalidate = novalidate; + } + var starId = me.attr('id') + '-star'; + if (options.novalidate) { + me.removeClass("ui_validate-invalid"); + _hideTip(me); + if (options.star.show) { + $('#' + starId).remove(); + } + } else { + if (options.star.show && options.required && !options.readonly) { + var star = '*'; + var tar = me; + if (tar.hasClass('ui_combo-text') || tar.hasClass('ui_date') || tar.hasClass('ui_ueditor')) { + tar = me.parent(); + addStar(); + }else{ + if(!me.attr("readonly")){ + addStar(); + } + } + function addStar() { + if ($('#' + starId).length == 0) { + if (options.star.front) { + tar.before(star); + } else { + tar.after(star); + } + } + } + } else { + $('#' + starId).remove(); + } + } + _bindEvents(me); + } + }); + }; + var _setReadonly = function (target, readonly) { + target.each(function () { + var me = $(this); + if (me.data(_cacheName)) { + var options = me.data(_cacheName).options; + options.readonly=readonly == undefined ? false : readonly; + } + }); + _isValidate(target, readonly); + if (readonly) { + target.attr('readonly', true).addClass('ui_validate_disabled'); + } else { + target.attr('readonly', false).removeClass('ui_validate_disabled'); + } + } +})(jQuery); +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiForm'; + /** + * @class 表单组件 + * @constructor uiForm + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的方法的参数 + * @example + * // 构件组件 + * $('#div').uiForm({ + * axis:'h', + * onStopDrag: function(e){ + * alert(this[0]==e.data.target[0]); + * } + * }); + * // 调用组件方法options + * $('#div').uiForm("options"); + */ + $.fn.uiForm = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiForm.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + options = options || {}; + if (!me.data(_cacheName)) { + me.data(_cacheName,{ + options: $.extend({}, $.fn.uiForm.defaults, options) + }); + _setForm(me); + } + }); + }; + /** + * 方法 + * @lends uiForm.prototype + */ + $.fn.uiForm.methods = { + /** + * @summary 获得组件的数据对象 + * @name uiForm#data + * @function + * @returns {Array} 组件的数据对象 + */ + data: function (target) { + try { + return $.data(this[0], _cacheName); + } catch (e) { + return undefined; + } + }, + /** + * @summary 提交组件的数据 + * @name uiForm#submit + * @function + * @param options {Object} 面板配置参数 + * @returns {jQuery} 方法调用者 + */ + submit: function (target, options) { + var opts = $.extend({}, + $.fn.uiForm.defaults, + $.data(target[0], _cacheName) ? $.data(target[0], _cacheName).options : {}, options || {} + ); + _ajaxSubmit(target, opts); + return target; + }, + /** + * @summary 为组件加载数据 + * @name uiForm#load + * @function + * @param data {Object} 数据 + * @returns {jQuery} 方法调用者 + */ + load: function (target, data) { + _load(target, data); + return target; + }, + /** + * @summary 清除组件的已选值 + * @name uiForm#clear + * @function + * @returns {jQuery} 组件对象 + */ + clear: function (target) { + _clear(target); + return target; + }, + /** + * @summary 重置组件的值 + * @name uiForm#reset + * @function + * @returns {jQuery} 组件对象 + */ + reset: function (target) { + _reset(target); + return target; + }, + /** + * @summary 验证组件的值 + * @name uiForm#validate + * @function + * @returns {jQuery} 组件对象 + */ + validate: function (target) { + return _validate(target); + }, + /** + * @summary 禁止验证 + * @name uiForm#disableValidation + * @function + * @returns {jQuery} 组件对象 + */ + disableValidation: function (target) { + _setValidation(target, true); + return target; + }, + /** + * @summary 启用验证 + * @name uiForm#enableValidation + * @function + * @returns {jQuery} 组件对象 + */ + enableValidation: function (target) { + _setValidation(this, false); + return target; + }, + /** + * @summary 设置只读 + * @name uiForm#setReadonly + * @function + * @param readonly {Boolean} 是否只读 + * @returns {jQuery} 组件对象 + */ + setReadonly: function (target, readonly) { + _setReadonly(target, readonly); + } + }; + /** + * 默认配置 + * @lends uiForm.prototype + */ + $.fn.uiForm.defaults = { + /** + * @type String + * @default "" + * @summary 指示组件的模板 + */ + template: '', + /** + * @type String + * @default null + * @summary 指定远程数据加载的url + */ + url: null, + /** + * @summary 在对象提交时触发的方法。 + * @event + * @name uiForm#onSubmit + * @param param {Object} 参数 + * @this jQuery对象 + * @default emptyFn + */ + onSubmit: function (param) { + return $(this).uiForm('validate'); + }, + success: function (data) { + }, + /** + * @summary 在对象加载之前触发的方法。 + * @event + * @name uiForm#onBeforeLoad + * @param param {Object} 参数 + * @this jQuery对象 + * @default emptyFn + */ + onBeforeLoad: function (param) { + }, + /** + * @summary 在对象加载成功时触发的方法。 + * @event + * @name uiForm#onLoadSuccess + * @param data {Object} 数据 + * @default emptyFn + */ + onLoadSuccess: function (result) { + if (result.success == undefined) { + } else { + if (!result.success) { + alert(result.message); + } + } + }, + /** + * @summary 在对象加载失败时触发的方法。 + * @event + * @name uiForm#onLoadError + * @default emptyFn + */ + onLoadError: function () { + }, + /** + * @summary 在模板编译前触发的方法。 + * @event + * @name uiForm#onBeforeCompile + * @default emptyFn + */ + onBeforeCompile: function (data) { + + } + }; + var _setForm = function (target) { + var options = $.data(target[0], _cacheName).options; + target.setElemID(); + if (options.template != "") { + var temp = $('#' + options.template); + options.formTemp = temp.html(); + temp.remove(); + } else { + + } + target.unbind('.uiForm').bind('submit.uiForm', function () { + setTimeout(function () { + _ajaxSubmit(target, options); + }, 0); + return false; + }); + }; + var _ajaxSubmit = function (target, options) { + options = options || {}; + var param = {ajax:true}; + if (options.onSubmit) { + if (options.onSubmit.call(target, param) == false) { + return; + } + } + if (options.url) { + target.attr('action', options.url); + } + var frameId = $.getIDByParentID(target.getElemID(), $.uiTemplate.uiForm.iframe); + var frame = $('') + .attr('src', window.ActiveXObject ? 'javascript:false' : 'about:blank') + .css({ + position: 'absolute', + top: -1000, + left: -1000 + }); + var targetUrl = target.attr('target'), targetAction = target.attr('action'); + target.attr('target', frameId); + + var paramFields = $(); + try { + frame.appendTo('body'); + frame.bind('load', cb); + for (var n in param) { + var f = $('').val(param[n]).appendTo(target); + paramFields = paramFields.add(f); + } + checkState(); + target[0].submit(); + } finally { + target.attr('action', targetAction); + targetUrl ? target.attr('target', targetUrl) : target.removeAttr('target'); + paramFields.remove(); + } + + function checkState() { + var f = $('#' + frameId); + if (!f.length) { + return + } + try { + var s = f.contents()[0].readyState; + if (s && s.toLowerCase() == 'uninitialized') { + setTimeout(checkState, 100); + } + } catch (e) { + cb(); + } + } + + var checkCount = 10; + + function cb() { + var frame = $('#' + frameId); + if (!frame.length) { + return + } + frame.unbind(); + var data = ''; + try { + var body = frame.contents().find('body'); + data = body.html(); + if (data == '') { + if (--checkCount) { + setTimeout(cb, 100); + return; + } + } + var ta = body.find('>textarea'); + if (ta.length) { + data = ta.val(); + } else { + var pre = body.find('>pre'); + if (pre.length) { + data = pre.html(); + } + } + } catch (e) { + + } + if (options.success) { + try { + data = JSON.parse(data); + } catch (e) { + } + options.success(data); + } + setTimeout(function () { + frame.unbind(); + try { + frame.contentWindow.document.write(''); + frame.contentWindow.close(); + } catch (e) { + } + frame.remove(); + if (_IE) { + CollectGarbage(); + } + frame = null; + }, 100); + } + } + + var _load = function (target, data) { + if (!$.data(target[0], _cacheName)) { + $.data(target[0], _cacheName, { + options: $.extend({}, $.fn.uiForm.defaults) + }); + } + var opts = $.data(target[0], _cacheName).options; + + if (typeof data == 'string') { + var param = {}; + if (opts.onBeforeLoad.call(target, param) == false) return; + + $.ajax({ + url: data, + data: param, + showAlert:false, + dataType: 'json', + success: function (result) { + _loadTemp(result); + }, + error: function () { + opts.onLoadError.apply(target, arguments); + } + }); + } else { + _loadTemp(data); + } + + function _loadTemp(result) { + var data = result; + if (data && result.data) { + data = result.data || {}; + } else { + data = data || {}; + } + if(opts.onBeforeCompile.call(target, result)==false){ + return; + } + if (opts.template != "") { + target.html(template.compile(opts.formTemp)(data)); + } + opts.onLoadSuccess.call(target, result); + _validate(target); + } + } + + var _clear = function (target) { + $('input,select,textarea', target).each(function () { + var t = this.type, tag = this.tagName.toLowerCase(); + if (t == 'text' || t == 'hidden' || t == 'password' || tag == 'textarea') { + if (!$(this).hasClass('ui_validate_disabled')) { + this.value = ''; + } + } else if (t == 'file') { + var file = $(this); + var newfile = file.clone().val(''); + newfile.insertAfter(file); + if (file.data('uiValidate')) { + file.uiValidate('destroy'); + newfile.uiValidate(); + } else { + file.remove(); + } + } else if (t == 'checkbox' || t == 'radio') { + this.checked = false; + } else if (tag == 'select') { + this.selectedIndex = -1; + } + + }); + + var t = $(target); + var plugins = ['ui_combo']; + for (var i = 0; i < plugins.length; i++) { + var plugin = plugins[i]; + var r = t.find('.' + plugin + 'Origin'); + if (r.length && r[plugin]) { + r[plugin]('clear'); + } + } + _validate(target); + } + + var _reset = function (target) { + target[0].reset(); + var plugins = ['ui_combo']; + for (var i = 0; i < plugins.length; i++) { + var plugin = plugins[i]; + var r = target.find('.' + plugin + 'Origin'); + if (r.length && r[plugin]) { + r[plugin]('reset'); + } + } + _validate(target); + } + + var _validate = function (target, objList) { + if (objList == undefined) { + objList = target.find('.ui_validate:not(:disabled)'); + } + objList.each(function (index) { + var ele = $(this); + if ($.trim(ele.val()) == '') { + ele.val(''); + } + try { + ele.uiValidate('validate'); + } catch (e) { + ele.uiValidate(); + } + }); + var invalidbox = target.find('.ui_validate-invalid'); + if (invalidbox.length > 0) { + $(invalidbox[0]).focus(); + return false; + } + return true; + } + + var _setValidation = function (target, novalidate) { + target.find('.ui_validate:not(:disabled)').each(function () { + $(this).uiValidate(novalidate ? 'disableValidation' : 'enableValidation'); + }); + } + var _setReadonly = function (target, readonly) { + target.find('.ui_validate').each(function () { + var obj = $(this); + $(this).uiValidate('setReadonly', readonly); + if (this.tagName == 'TEXTAREA') { + obj.addClass('ui_validate_disabled_tt'); + } else { + obj.removeClass('ui_validate_disabled_tt'); + } + removeStar(readonly); + }); + target.find('.ui_comboOrigin').each(function () { + $(this).uiCombo('setReadonly', readonly); + }); + target.find('.ui_date').each(function () { + $(this).uiDate('setReadonly', readonly); + }); + target.find('.ui_ueditor').each(function () { + $(this).uiUEditor('setReadonly', readonly); + }); + + function removeStar(t,readonly) { + if(readonly){ + var starId=t.attr('id')+'-star'; + $('#'+starId).remove(); + } + } + } +})(jQuery); +/** + * Created by jinxs on 14-8-13. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiCombo'; + /** + * @class 下拉框-基类 + * @requires {@link uiPanel} + * @constructor uiCombo + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * // 构件组件 + * $('#selectAge').uiCombo({direction: 'left'}); + * // 调用组件方法options + * $('#selectAge').uiCombo("options"); + */ + $.fn.uiCombo = function (options, param) { + if (typeof options == "string") { + return $.fn.uiCombo.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + options = options || {}; + + var state = me.data(_cacheName); + if (state) { + $.extend(state.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiCombo.defaults, me.parseUIConfig(), options), + previousValue: null + }); + _init(me); + me.removeAttr("disabled"); + } + _create(me); + _bindEvent(me); + _addValidate(me); + _resizeWidth(me); + _setInitValues(me); + }); + }; + + /** + * 方法 + * @lends uiCombo.prototype + */ + $.fn.uiCombo.methods = { + /** + * @summary 获得组件的配置对象 + * @name uiCombo#options + * @function + * @returns {Object} 组件的配置对象 + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 获得组件的面板对象 + * @name uiCombo#panel + * @function + * @returns {jQuery} 组件的面板对象的内容 + */ + panel: function (target) { + var targetID = target.getElemID(); + var panel = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboPanel); + return panel.uiPanel('content'); + }, + panelBar: function (target) { + var targetID = target.getElemID(); + var panel = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboPanel); + return panel.uiPanel('buttonbar'); + }, + /** + * @summary 获得组件的文本框 + * @name uiCombo#textbox + * @function + * @returns {jQuery} 组件的文本框 + */ + combo: function (target) { + var targetID = target.getElemID(); + return $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + }, + /** + * @summary 获得组件的文本框 + * @name uiCombo#textbox + * @function + * @returns {jQuery} 组件的文本框 + */ + textbox: function (target) { + var targetID = target.getElemID(); + return $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + }, + /** + * @summary 移除并返回组件 + * @name uiCombo#destroy + * @function + * @returns {jQuery} 组件对象 + */ + destroy: function (target) { + _destory(target); + return target; + }, + /** + * @summary 设置控件的宽度 + * @name uiCombo#resize + * @function + * @param width {Number} 宽度大小 + * @returns {jQuery} 方法调用者 + */ + resize: function (target, width) { + _resizeWidth(target, width); + return target; + }, + /** + * @summary 显示组件的面板 + * @name uiCombo#showPanel + * @function + * @returns {jQuery} 组件对象 + */ + showPanel: function (target) { + _showPanel(target); + return target; + }, + /** + * @summary 隐藏组件的面板 + * @name uiCombo#hidePanel + * @function + * @returns {jQuery} 组件对象 + */ + hidePanel: function (target) { + _closeThisPal(target); + return target; + }, + /** + * @summary 禁用组件 + * @name uiCombo#disable + * @function + * @returns {jQuery} 组件对象 + */ + disable: function (target) { + _setDisabled(target, true); + _bindEvent(target); + return target; + }, + /** + * @summary 启用组件 + * @name uiCombo#enable + * @function + * @returns {jQuery} 组件对象 + */ + enable: function (target) { + _setDisabled(target, false); + _bindEvent(target); + return target; + }, + /** + * @summary 设置组件是否为只读 + * @name uiCombo#setReadonly + * @function + * @param readonly {Boolean} 是否为只读 + * @returns {jQuery} 组件对象 + */ + setReadonly: function (target, readonly) { + _setReadonly(target, readonly); + _bindEvent(target); + return target; + }, + /** + * @summary 验证组件值的正确性 + * @name uiCombo#isValid + * @function + * @returns {Boolean} 组件值是否正确 + */ + isValid: function (target) { + var targetID = target.getElemID(); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + comboText.uiValidate('options').nullValue = target.uiCombo('options').nullValue; + var valid = comboText.uiValidate("isValid"); + if (!valid) { + combo.addClass('ui_combo-invalid'); + } else { + combo.removeClass('ui_combo-invalid'); + } + return valid; + }, + enableValidation: function (target) { + var targetID = target.getElemID(); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + comboText.uiValidate("enableValidation"); + return target; + }, + disableValidation: function (target) { + var targetID = target.getElemID(); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + comboText.uiValidate("disableValidation"); + combo.removeClass('ui_combo-invalid'); + return target; + }, + /** + * @summary 清除组件的已选值 + * @name uiCombo#clear + * @function + * @returns {jQuery} 组件对象 + */ + clear: function (target) { + _clear(target); + return target; + }, + /** + * @summary 重置组件的值 + * @name uiCombo#reset + * @function + * @returns {jQuery} 组件对象 + */ + reset: function (target) { + var options = $.data(target[0], _cacheName).options; + if (options.multiple) { + target.uiCombo("setValues", options.originalValue); + } else { + target.uiCombo("setValue", options.originalValue); + } + return target; + }, + /** + * @summary 获取组件的显示文本 + * @name uiCombo#getText + * @function + * @returns {String} 组件的显示文本 + */ + getText: function (target) { + return _getText(target); + }, + /** + * @summary 设置组件的显示文本 + * @name uiCombo#setText + * @function + * @param text {String} 组件的显示文本 + * @returns {jQuery} 组件对象 + */ + setText: function (target, text) { + _setText(target, text); + return target; + }, + /** + * @summary 获取组件的值 + * @name uiCombo#getValues + * @function + * @returns {Array} 组件的值列表 + */ + getValues: function (target) { + return _getValues(target); + }, + /** + * @summary 设置组件的值 + * @name uiCombo#setValues + * @function + * @param values {Array} 组件的值列表 + * @returns {jQuery} 组件对象 + */ + setValues: function (target, values) { + _setValues(target, values); + return target; + }, + /** + * @summary 获取组件的第一个选中值 + * @name uiCombo#getValue + * @function + * @returns {String} 组件的值 + */ + getValue: function (target) { + return _getValue(target); + }, + /** + * @summary 设置组件的值 + * @name uiCombo#setValue + * @function + * @param value {String} 组件的值 + * @returns {jQuery} 组件对象 + */ + setValue: function (target, value) { + _setValue(target, value); + return target; + } + }; + + $.fn.uiCombo.defaults = $.extend({}, $.fn.uiValidate.defaults, + /** + * 默认配置 + * @lends uiCombo.prototype + */ + { + /** + * @type Boolean + * @default true + * @summary 是否将下列面板渲染至body中 + */ + renderInBody: true, + showPanelBar: false, + /** + * @type Number + * @default 22 + * @summary 组件高度 + */ + height: 25, + /** + * @type Number + * @default null + * @summary 组件下拉面板宽度 + */ + panelWidth: null, + /** + * @type Array + * @default [0,33] + * @summary 提示信息相对于组件的位置 + */ + tipOffset: [20, 0], + /** + * @type String + * @default right + * @summary 提示消息的位置 + */ + tipPosition: 'right', + /** + * @type Number + * @default 自动 + * @summary 组件下拉面板高度 + */ + panelHeight: 0, + /** + * 值可为left, right, center + * @type String + * @default "left" + * @summary 组件下拉面板对齐方式 + */ + panelAlign: "left", + /** + * @type Boolean + * @default false + * @summary 指示组件是否可多选 + */ + multiple: false, + /** + * TODO: summary + * @type Boolean + * @default false + * @summary X + */ + selectOnNavigation: true, + /** + * @type String + * @default "," + * @summary 组件多个值的分隔符 + */ + separator: ",", + /** + * @type Boolean + * @default false + * @summary 指示组件是否可编辑 + */ + editable: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否可输入查询 + */ + searchable: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否禁用 + */ + disabled: false, + /** + * @type Boolean + * @default false + * @summary 指示组件是否为只读 + */ + readonly: false, + /** + * @type Boolean + * @default true + * @summary 指示组件是否显示下拉图标 + */ + hasDownArrow: true, + /** + * @type String + * @default "" + * @summary 组件初始值 + */ + value: "", + /** + * @type Number + * @default 200 + * @summary 组件输入框在编辑后执行查询前的延迟毫秒数 + */ + delay: 200, + /** + * TODO: summary + * @type Number + * @default 19 + * @summary X + */ + deltaX: 19, + /** + * 每个事件方法的this指向组件jQuery对象,事件可包含:

          + * + * + * + * + * + * + * + * + * + * + *
          事件说明
          up键盘上方向键按下时触发,方法包含一个参数e(事件对象)
          down键盘下方向键按下时触发,方法包含一个参数e(事件对象)
          left键盘左方向键按下时触发,方法包含一个参数e(事件对象)
          right键盘右方向键按下时触发,方法包含一个参数e(事件对象)
          enter键盘回车键按下时触发,方法包含一个参数e(事件对象)
          query执行查询时时触发,方法包含两个参数val, e(组件输入框的值,事件对象)
          + * @summary 在组件输入框有键盘事件时触发的一系列方法。 + * @name uiCombo#keyHandler + * @default {} + */ + keyHandler: { + up: function (e) { + }, + down: function (e) { + }, + left: function (e) { + }, + right: function (e) { + }, + enter: function (e) { + }, + query: function (q, e) { + return true; + } + }, + /** + * @summary 在组件面板显示时触发的方法。 + * @event + * @name uiCombo#onShowPanel + * @this 组件jQuery对象 + * @default emptyFn + */ + onShowPanel: function () { + }, + /** + * @summary 在组件面板隐藏时触发的方法。 + * @event + * @name uiCombo#onHidePanel + * @this 组件jQuery对象 + * @default emptyFn + */ + onHidePanel: function () { + }, + /** + * @summary 在组件值改变时触发的方法。 + * @event + * @name uiCombo#onChange + * @param newValue {String} 组件新的值 + * @param oldValue {String} 组件旧的值 + * @this 组件jQuery对象 + * @default emptyFn + */ + onChange: function (newValue, oldValue) { + }, + addButton: null + }); + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + if (isNaN(options.width)) { + options.width = target.outerWidth(); + } + if (_IEunder6) { + setTimeout(function () { + target.addClass("ui_comboOrigin"); + }, 100); + } else { + target.addClass("ui_comboOrigin"); + } + target.setElemID(); + var targetID = target.getElemID(); + var reg = new RegExp('({comboID})', 'g'); + var combo = $($.uiTemplate.uiCombo.html.replace(reg, targetID)).insertAfter(target); + combo.addClass('ui-default'); + var panel = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboPanel); + if (panel && panel.length > 0) { + + } else { + panel = $($.uiTemplate.uiCombo.panelHtml.replace(reg, targetID)); + options.renderInBody ? panel.appendTo('body') : panel.appendTo(target.parent()); + var buttons = []; + var showButton = false; + if (options.addButton) { + buttons = [options.addButton]; + showButton = true; + } + panel.uiPanel({ + width: (options.panelWidth ? options.panelWidth : options.width), + height: options.panelHeight, + zIndex: 10001, + showHeader: false, + showBtnBar: showButton || options.showPanelBar, + buttons: buttons, + closed: true, + onBeforeClose: function () { + _closePanel(target); + }, onClose: function () { + var state = $.data(target[0], _cacheName); + if (state) { + state.options.onHidePanel.call(target); + } + } + }); + } + var targetName = $(target).attr("name"); + var comboValue = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboValue); + if (targetName) { + comboValue.attr("name", targetName); + target.removeAttr("name").attr("comboName", targetName); + } + }; + var _create = function (target) { + var targetID = target.getElemID(); + var options = $.data(target[0], _cacheName).options; + var arrow = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboArrow); + if (options.hasDownArrow) { + arrow.show(); + } else { + arrow.hide(); + } + _setDisabled(target, options.disabled); + _setReadonly(target, options.readonly); + }; + var _setDisabled = function (target, disabled) { + var targetID = target.getElemID(); + var options = $.data(target[0], _cacheName).options; + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + var comboValue = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboValue); + if (disabled) { + options.disabled = true; + target.attr("disabled", true); + comboValue.attr("disabled", true); + comboText.attr("disabled", true); + } else { + options.disabled = false; + target.removeAttr("disabled"); + comboValue.removeAttr("disabled"); + comboText.removeAttr("disabled"); + } + }; + + var _setReadonly = function (target, readonly) { + var targetID = target.getElemID(); + var options = $.data(target[0], _cacheName).options; + options.readonly = readonly == undefined ? false : readonly; + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + var comboArrow = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboArrow); + if (options.readonly) { + combo.addClass('ui_validate_disabled'); + comboText.attr("readonly", options.readonly).css("cursor", ""); + comboArrow.css('display', 'none'); + var starId=target.attr('id')+'-star'; + $('#'+starId).remove(); + } else { + combo.removeClass('ui_validate_disabled'); + comboText.attr("readonly", options.readonly).css("cursor", "pointer"); + comboArrow.css('display', 'inline-block'); + } + }; + var _resizeWidth = function (target, width) { + var targetID = target.getElemID(); + var options = $.data(target[0], _cacheName).options; + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + if (width) { + options.width = width; + } + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + var comboArrow = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboArrow); + var arrowWidth = options.hasDownArrow ? comboArrow.outerWidth() : 0; + if(_IEunder7) { + combo.width(options.width).height(options.height); + }else{ + combo.width(options.width+2).height(options.height); + } + comboText.css({ + height: combo.height() + "px", + lineHeight: combo.height() + "px", + width: options.width - arrowWidth + }); + comboArrow.outerHeight(combo.height()); + }; + + var _destory = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + var panel = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboPanel); + comboText.uiValidate("destroy"); + panel.uiPanel("destroy"); + combo.remove(); + target.remove(); + }; + + var _closePanel = function (target) { + target.find(".ui_comboOrigin").each(function () { + var p = $.getByParentID(this.id, $.uiTemplate.uiCombo.comboPanel); + if (p.is(":visible")) { + p.uiPanel("close"); + } + }); + }; + var _bindEvent = function (target) { + var targetID = target.getElemID(); + var state = $.data(target[0], _cacheName); + var options = state.options; + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + var panel = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboPanel); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + var comboArrow = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboArrow); + $(document).unbind(".uiCombo").bind("mousedown.uiCombo", function (e) { + var p = $(e.target).closest("span.ui_combo,div.ui_combo-panel"); + if (p.length) { + _closePanel(target); + return; + } + $("body>div.ui_combo-panel:visible").each(function () { + $(this).uiPanel("close"); + }); + }); + comboText.unbind(".uiCombo"); + comboArrow.unbind(".uiCombo"); + if (!options.disabled && !options.readonly) { + combo.bind('mouseover.uiCombo', function (e) { + combo.addClass('ui-hover'); + }) + .bind('mouseleave.uiCombo', function (e) { + combo.removeClass('ui-hover'); + }) + comboText.bind("click.uiCombo", function (e) { + if (!options.editable) { + _show.call(this); + } else { + var p = $(this).closest("div.ui_combo-panel"); + $("div.ui_combo-panel").not(panel).not(p).each(function () { + $(this).uiPanel("close"); + }) + } + }) + .bind("keydown.uiCombo paste.uiCombo drop.uiCombo", function (e) { + switch (e.which) { + case $.keyCode.UP: + options.keyHandler.up.call(target, e); + break; + case $.keyCode.DOWN: + options.keyHandler.down.call(target, e); + break; + case $.keyCode.LEFT: + options.keyHandler.left.call(target, e); + break; + case $.keyCode.RIGHT: + options.keyHandler.right.call(target, e); + break; + case $.keyCode.ENTER: + e.preventDefault(); + options.keyHandler.enter.call(target, e); + return false; + case $.keyCode.TAB: + case $.keyCode.ESCAPE: + _closeThisPal(target); + break; + default: + if (options.editable || options.searchable) { + if (state.timer) { + clearTimeout(state.timer); + } + state.timer = setTimeout(function () { + var txt = comboText.val(); + if (state.previousValue != txt) { + state.previousValue = txt; + target.uiCombo("showPanel"); + options.keyHandler.query.call(target, comboText.val(), e); + target.uiCombo("isValid"); + } + }, options.delay); + } + } + }); + if (webUI_browser().gecko) { + comboText.bind('input', function (e) { + comboText.keydown(); + }); + } + comboArrow.bind("click.uiCombo", function () { + _show.call(this); + }) + .bind("mouseenter.uiCombo", function () { + $(this).addClass("ui_combo-arrow-hover"); + }) + .bind("mouseleave.combo", function () { + $(this).removeClass("ui_combo-arrow-hover"); + }); + } + function _show() { + if (panel.attr('closed') == 'false') { + _closeThisPal(target); + } else { + var p = $(this).closest("div.ui_combo-panel"); + var panels = $("div.ui_combo-panel").not(panel).not(p); + if (panels.length > 0) { + panels.each(function () { + $(this).uiPanel("close"); + }) + } + $(target).uiCombo("showPanel"); + } + } + + if (!options.editable && !options.searchable) { + comboText.attr('readonly', true); + } + }; + + function _showPanel(target) { + var targetID = target.getElemID(); + var options = $.data(target[0], _cacheName).options; + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + var panel = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboPanel); + panel.css({left: _calcLeft(), top: calcTop()}); + if (panel.uiPanel("options").closed) { + panel.uiPanel("open"); + options.onShowPanel.call(target); + } + (function () { + if (panel.attr('closed') == 'false') { + panel.css({left: _calcLeft(), top: calcTop()}); + setTimeout(arguments.callee, 200); + } + })(); + function _calcLeft() { + if (options.renderInBody) { + //如果添加到body的算法 + var left = combo.offset().left; + if (options.panelAlign == "right") { + left += combo.outerWidth() - panel.outerWidth(); + } + if (left + panel.outerWidth() > $(window).outerWidth() + $(document).scrollLeft()) { + left = $(window).outerWidth() + $(document).scrollLeft() - panel.outerWidth(); + } + if (left < 0) { + left = 0; + } + } else { + //如果添加到target的父容器中 + var left = combo.position().left + combo.closest('div').scrollLeft(); + } + return left; + } + + function calcTop() { + if (options.renderInBody) { + //如果添加到body的算法 + var comboTop = combo.offset().top; + var top = combo.offset().top + combo.outerHeight(); + if (top + panel.outerHeight() > $(window).outerHeight() + $(document).scrollTop()) { + top = comboTop - panel.outerHeight(); + } + if (top < $(document).scrollTop()) { + top = comboTop + combo.outerHeight(); + } + } else { + //如果添加到target的父容器中 + var top = combo.position().top + combo.outerHeight() + combo.closest('div').scrollTop(); + } + return top; + } + } + + var _closeThisPal = function (target) { + var targetID = target.getElemID(); + var panel = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboPanel); + panel.uiPanel("close"); + }; + + var _addValidate = function (target) { + var targetID = target.getElemID(); + var options = $.data(target[0], _cacheName).options; + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + comboText.uiValidate(options); + if (comboText.hasClass('ui_validate-invalid')) { + combo.addClass('ui_combo-invalid'); + } + }; + + var _clear = function (target) { + var targetID = target.getElemID(); + var options = $.data(target[0], _cacheName).options; + var combo = $.getByParentID(targetID, $.uiTemplate.uiCombo.combo); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + var comboValue = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboValue); + comboValue.val(""); + comboText.val(""); + }; + + var _getText = function (target) { + var targetID = target.getElemID(); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + return comboText.val(); + }; + + var _setText = function (target, text) { + var targetID = target.getElemID(); + var state = $.data(target[0], _cacheName); + var comboText = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboText); + if (comboText.val() != text) { + comboText.val(text); + target.uiCombo("isValid"); + state.previousValue = text; + } + }; + var _getValues = function (target) { + var options = $.data(target[0], _cacheName).options; + var values = []; + var targetID = target.getElemID(); + var comboValues = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboValue).val(); + var valueList = comboValues.split(options.separator); + for (var i = 0; i < valueList.length; i++) { + var val = valueList[i]; + if ($.trim(val) != '') { + values.push(valueList[i]); + } + } + return values; + }; + + var _setValues = function (target, values) { + var state = $.data(target[0], _cacheName); + var options = state.options; + var targetID = target.getElemID(); + var oldValues = _getValues(target); + var comboName = target.attr("comboName"); + var comboValue = $.getByParentID(targetID, $.uiTemplate.uiCombo.comboValue); + if (comboName) { + comboValue.attr("name", comboName); + } + var selValues = ''; + for (var i = 0; i < values.length; i++) { + var val = values[i]; + if ($.trim(val) != '') { + selValues += values[i] + options.separator; + } + } + comboValue.val(selValues.substr(0, selValues.length - 1)); + var tmp = []; + for (var i = 0; i < oldValues.length; i++) { + tmp[i] = oldValues[i]; + } + var newValues = []; + for (var i = 0; i < values.length; i++) { + for (var j = 0; j < tmp.length; j++) { + if (values[i] == tmp[j]) { + newValues.push(values[i]); + tmp.splice(j, 1); + break; + } + } + } + if (newValues.length != values.length || values.length != oldValues.length) { + options.value = values; + if (options.multiple) { + options.onChange.call(target, values, oldValues); + } else { + options.onChange.call(target, values[0], oldValues[0]); + } + } + }; + + var _getValue = function (target) { + var values = _getValues(target); + return values[0]; + }; + var _setValue = function (target, comboValue) { + _setValues(target, [comboValue]); + }; + var _setInitValues = function (target) { + var options = $.data(target[0], _cacheName).options; + var fn = options.onChange; + options.onChange = function () { + }; + if (options.multiple) { + if (options.value) { + if (typeof options.value == "object") { + _setValues(target, options.value); + options.originalValue = options.value; + } else { + _setValue(target, options.value); + options.originalValue = _getValues(target); + } + } else { + _setValues(target, []); + options.originalValue = []; + } + } else { + _setValue(target, options.value); + options.originalValue = options.value; + } + options.onChange = fn; + }; +})(jQuery);/** + * Created by jinxs on 14-8-19. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiCombobox'; + /** + * @class 下拉框 + * @extends uiCombo + * @requires {@link uiCombo} + * @constructor uiCombobox + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * // 构件组件 + * $('#selectAge').uiCombobox({direction: 'left'}); + * // 调用组件方法options + * $('#selectAge').uiCombobox("options"); + */ + $.fn.uiCombobox = function (options, param) { + if (typeof options == 'string') { + var method = $.fn.uiCombobox.methods[options]; + if (method) { + return method(this, param); + } else { + return this.uiCombo(options, param); + } + } + return this.each(function () { + var me = $(this); + var state = me.data(_cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + _init(me); + } else { + state = { + options: $.extend({}, $.fn.uiCombobox.defaults, me.parseUIConfig(), options), + data: [] + }; + me.data(_cacheName, state); + _init(me); + var data = _parseData(me); + if (data.length) { + _loadData(me, data); + } + } + if (state.options.data) { + _loadData(me, state.options.data); + } + _request(me); + }); + }; + + /** + * 方法 + * @lends uiCombobox.prototype + */ + $.fn.uiCombobox.methods = { + /** + * @summary 获得组件的配置副本对象 + * @name uiCombobox#options + * @function + * @returns {Object} 组件的配置副本对象 + */ + options: function (target) { + var copts = target.uiCombo('options'); + return $.extend($.data(target[0], _cacheName).options, { + originalValue: copts.originalValue, + disabled: copts.disabled, + readonly: copts.readonly + }); + }, + /** + * @summary 获得组件的数据对象 + * @name uiCombobox#getData + * @function + * @returns {Array} 组件的数据对象 + * @example + * var option = #("selectAge").uiCombobox("options"); + * var data = #("selectAge").uiCombobox("getData"); + * var age = data[0][option.textField]; + * alert(age > 28); + */ + getData: function (target) { + return $.data(target[0], _cacheName).data; + }, + /** + * @summary 设置组件的值 + * @name uiCombobox#setValues + * @function + * @param values {Array} 组件的值列表 + * @returns {jQuery} 组件对象 + */ + setValues: function (target, values) { + _setValues(target, values); + return target; + }, + /** + * @summary 设置组件的值 + * @name uiCombobox#setValue + * @function + * @param value {String} 要设置的值 + * @returns {jQuery} 组件对象 + */ + setValue: function (target, value) { + _setValues(target, [value]); + return target; + }, + /** + * @summary 清除组件的已选值 + * @name uiCombobox#clear + * @function + */ + clear: function (target) { + target.uiCombo('clear'); + var panel = target.uiCombo('panel'); + panel.find('div.ui_combobox-item-selected').removeClass('ui_combobox-item-selected'); + }, + /** + * @summary 重置组件的值 + * @name uiCombobox#reset + * @function + * @returns {jQuery} 组件对象 + */ + reset: function (target) { + var opts = target.uiCombobox('options'); + if (opts.multiple) { + target.uiCombobox('setValues', opts.originalValue); + } else { + target.uiCombobox('setValue', opts.originalValue); + } + return target; + }, + /** + * @summary 加载组件的选项列表 + * @name uiCombobox#loadData + * @function + * @param data {Array} 组件的值列表 + * @returns {jQuery} 组件对象 + * @example + * var box = #("selectAge").uiCombobox({ + * multiple:true + * }); + * var data=[{text:'young',value:18},{text:'old',value:48}]; + * box.uiCombobox("loadData", data); + */ + loadData: function (target, data) { + _loadData(target, data); + return target; + }, + /** + * 若不指定url的值,将使用配置对象的url + * @summary 根据数据地址加载组件的选项列表 + * @name uiCombobox#reload + * @function + * @param [url] {String} 数据地址 + * @returns {jQuery} 组件对象 + */ + reload: function (target, url) { + _request(target, url); + return target; + }, + /** + * @summary 设置组件的选择值 + * @name uiCombobox#select + * @function + * @param value {String} 要选择的值 + * @returns {jQuery} 组件对象 + */ + select: function (target, value) { + _select(target, value); + return target; + }, + /** + * @summary 取消设置组件的选择值 + * @name uiCombobox#unselect + * @function + * @param value {String} 要取消选择的值 + * @returns {jQuery} 组件对象 + */ + unselect: function (target, value) { + _unselect(target, value); + return target; + }, + /** + * @summary 通过Value获取行索引 + * @name uiCombobox#getRowIndex + * @function + * @param value {String} value值 + * @returns {jQuery} 组件对象 + */ + getRowIndex: function (target, value) { + return _getRowIndex(target, value); + } + }; + $.fn.uiCombobox.defaults = $.extend({}, $.fn.uiCombo.defaults, + /** + * 默认配置 + * @lends uiCombobox.prototype + */ + { + /** + * @type String + * @default "value" + * @summary 组件数据"值"字段 + */ + valueField: 'value', + /** + * @type String + * @default "text" + * @summary 组件数据"文本"字段 + */ + textField: 'text', + /** + * @type String + * @default null + * @summary 组件数据"组"字段 + */ + groupField: null, + /** + * @type Function + * @name uiCombobox#groupFormatter + * @param group {String} 分组的值 + * @default 默认不转换 + * @summary 将分组值转换为显示文本方法 + */ + groupFormatter: function (group) { + return group; + }, + /** + * @type String + * @default null + * @summary 默认空值 + */ + nullValue: null, + /** + * 可选值有local(使用本地数据),remote(根据给定的URL加载) + * @type String + * @default "local" + * @summary 组件数据加载模式 + */ + mode: 'local', + /** + * 可选值有get, post + * @type String + * @default "post" + * @summary 向指定的url请求数据时使用的方法 + */ + method: 'post', + /** + * 可选值有get, post + * @type String + * @default null + * @summary 指定远程数据加载的url + */ + url: null, + /** + * 可选值有get, post + * @type Array + * @default null + * @summary 指定组件的本地数据 + */ + data: null, + /** + * @type Number + * @default 0 + * @summary 组件输入框在编辑事当大于等于queryMin执行查询 + */ + queryMin: 0, + /** + * 每个事件方法的this指向组件jQuery对象,事件可包含:

          + * + * + * + * + * + * + * + * + * + * + *
          事件说明
          up键盘上方向键按下时触发,方法包含一个参数e(事件对象)
          down键盘下方向键按下时触发,方法包含一个参数e(事件对象)
          left键盘左方向键按下时触发,方法包含一个参数e(事件对象)
          right键盘右方向键按下时触发,方法包含一个参数e(事件对象)
          enter键盘回车键按下时触发,方法包含一个参数e(事件对象)
          query执行查询时时触发,方法包含两个参数val, e(组件输入框的值,事件对象)
          + * @summary 在组件输入框有键盘事件时触发的一系列方法。 + * @name uiCombobox#keyHandler + * @default {} + */ + keyHandler: { + up: function (e) { + _nav(this, 'prev'); + e.preventDefault() + }, + down: function (e) { + _nav(this, 'next'); + e.preventDefault() + }, + left: function (e) { + }, + right: function (e) { + }, + enter: function (e) { + _doEnter(this) + }, + query: function (input, e) { + _doQuery(this, input) + } + }, + /** + * 返回true表示row所表示的值满足查询 + * @type Function + * @name uiCombobox#filter + * @param input {String} 组件输入框的值 + * @param row {Object} 组件数据对象,如{text:'young',value:18} + * @default 见示例 + * @summary 组件执行查询时的数据筛选方法 + * @example + * var box = #("selectAge").uiCombobox({ + * multiple:true, + * filter:function (input, row) { + * var opts = $(this).uiCombobox('options'); + * return row[opts.textField].toLowerCase().indexOf(input.toLowerCase()) > -1; + * } + * }); + */ + filter: function (input, row) { + var opts = $(this).uiCombobox('options'); + return row[opts.textField].toLowerCase().indexOf(input.toLowerCase()) > -1; + }, + /** + * @type Function + * @name uiCombobox#formatter + * @param row {Object} 组件数据对象,如{text:'young',value:18} + * @default 见示例 + * @summary 根据组件数据对象设置显示文本方法 + * @example + * var box = #("selectAge").uiCombobox({ + * multiple:true, + * formatter:function (row) { + * var opts = $(this).uiCombobox('options'); + * return row[opts.textField]; + * } + * }); + */ + formatter: function (row) { + var opts = $(this).uiCombobox('options'); + return row[opts.textField]; + }, + /** + * @type Function + * @name uiCombobox#loader + * @param param {String} 数据请求参数 + * @param success {Function} 数据请求成功执行的方法 + * @param error {Function} 数据请求失败执行的方法 + * @default 见示例 + * @summary 设置组件数据加载的方法 + * @example + * var box = #("selectAge").uiCombobox({ + * multiple:true, + * loader:function (param, success, error) { + * var opts = $(this).uiCombobox('options'); + * if (!opts.url) return false; + * $.ajax({ + * type: opts.method, + * url: opts.url, + * data: param, + * dataType: 'json', + * success: function (data) { + * success(data); + * }, + * error: function () { + * error.apply(this, arguments); + * } + * }); + * } + * }); + */ + loader: function (param, success, error) { + var opts = $(this).uiCombobox('options'); + if (!opts.url) return false; + $.ajax({ + type: opts.method, + url: opts.url, + data: param, + showAlert: false, + dataType: 'json', + success: function (result) { + if (result.success) { + success(result.data); + } + }, + error: function () { + error.apply(this, arguments); + } + }); + }, + /** + * @type Function + * @name uiCombobox#loadFilter + * @param data {Array} 数据对象列表 + * @default 默认不筛选 + * @summary 数据加载时进行筛选的方法 + */ + loadFilter: function (data) { + return data; + }, + /** + * 可包含getEl和getRow两个方法 + * @summary 设置组件查找页面选项元素和选项数据的方法 + * @type Object + * @name uiCombobox#finder + * @default 见源码 + */ + finder: { + /** + * TODO: how to describe this kind of properties + * @type Function + * @name uiCombobox#finder.getEl + * @param target {jQuery} 组件对象 + * @param value {String} 给定的值 + * @default 见源码 + * @summary 设置组件查找页面选项元素的方法 + */ + getEl: function (target, value) { + var index = _getRowIndex(target, value); + var id = $.data(target[0], _cacheName).itemIdPrefix + '_' + index; + return $('#' + id); + }, + /** + * @type Function + * @name uiCombobox#finder.getRow + * @param target {jQuery} 组件对象 + * @param p {String|jQuery} 给定的值|选项元素 + * @default 见源码 + * @summary 设置组件查找选项数据的方法 + */ + getRow: function (target, p) { + var state = $.data(target[0], _cacheName); + var index = (p instanceof jQuery) ? p.attr('id').substr(state.itemIdPrefix.length + 1) : _getRowIndex(target, p); + if (index != undefined && index > -1) { + return state.data[parseInt(index)]; + } else { + return undefined; + } + } + }, + onHidePanel: function () { + var target = $(this); + var opts = target.uiCombobox('options'); + if (opts.searchable && target.uiCombobox('getText') != "" && target.uiCombobox('getValues').length == 0) { + _setValues(target, [], false); + } + }, + + /** + * @summary 在组件数据加载前触发的方法。 + * @event + * @name uiCombobox#onBeforeLoad + * @param param {String} 数据请求的参数 + * @this 组件jQuery对象 + * @default emptyFn + */ + onBeforeLoad: function (param) { + }, + /** + * @summary 在组件数据加载成功时触发的方法。 + * @event + * @name uiCombobox#onLoadSuccess + * @param data {Array} 所加载的数据列表 + * @this 组件jQuery对象 + * @default emptyFn + */ + onLoadSuccess: function (data) { + }, + /** + * @summary 在组件数据加载失败时触发的方法。 + * @event + * @name uiCombobox#onLoadError + * @param param {String} 数据请求参数 + * @param success {Function} 数据请求成功执行的方法 + * @param error {Function} 数据请求失败执行的方法 + * @default emptyFn + */ + onLoadError: function (param, success, error) { + }, + /** + * @summary 在组件选择选项时触发的方法。 + * @event + * @name uiCombobox#onSelect + * @param record {String} 所选择的数据对象 + * @this 组件jQuery对象 + * @default emptyFn + */ + onSelect: function (record) { + }, + /** + * @summary 在组件取消选择选项时触发的方法。 + * @event + * @name uiCombobox#onUnselect + * @param record {String} 所选择的数据对象 + * @this 组件jQuery对象 + * @default emptyFn + */ + onUnselect: function (record) { + } + }); + + var _init = function (target) { + var state = $.data(target[0], _cacheName); + var opts = state.options; + target.setElemID(); + var targetID = target.getElemID(); + state.itemIdPrefix = targetID + '_combobox_i'; + state.groupIdPrefix = targetID + '_combobox_g'; + if (target.attr('value')) { + opts.value = target.attr('value'); + } + target.uiCombo($.extend({}, opts, { + onShowPanel: function () { + target.uiCombo('panel').find('div.ui_combobox-item,div.ui_combobox-group').show(); + _scrollTo(target, target.uiCombobox('getValue')); + opts.onShowPanel.call(target); + } + })); + target.uiCombobox('panel').unbind().bind('mouseover', function (e) { + $(this).children('div.ui_combobox-item-hover').removeClass('ui_combobox-item-hover'); + var item = $(e.target).closest('div.ui_combobox-item'); + if (!item.hasClass('ui_combobox-item-disabled')) { + item.addClass('ui_combobox-item-hover'); + } + e.stopPropagation(); + }).bind('mouseout', function (e) { + $(e.target).closest('div.ui_combobox-item').removeClass('ui_combobox-item-hover'); + e.stopPropagation(); + }).bind('click', function (e) { + var item = $(e.target).closest('div.ui_combobox-item'); + if (!item.length || item.hasClass('ui_combobox-item-disabled')) { + return + } + var row = opts.finder.getRow(target, item); + if (!row) { + return + } + var value = row[opts.valueField]; + if (opts.multiple) { + if (item.hasClass('ui_combobox-item-selected')) { + _unselect(target, value); + } else { + _select(target, value); + } + } else { + _select(target, value); + target.uiCombo('hidePanel'); + } + e.stopPropagation(); + }); + } + + var _getRowIndex = function (target, value) { + if (value == undefined) { + return -1; + } + var state = $.data(target[0], _cacheName); + var opts = state.options; + var data = state.data || []; + for (var i = 0; i < data.length; i++) { + if (data[i][opts.valueField] == value) { + return i; + } + } + return -1; + } + + var _scrollTo = function (target, value) { + var opts = $.data(target[0], _cacheName).options; + var panel = target.uiCombo('panel'); + var item = opts.finder.getEl(target, value); + if (item.length) { + var h; + if (item.position().top <= 0) { + h = panel.scrollTop() + item.position().top; + } else if (item.position().top + item.outerHeight() > panel.height()) { + h = panel.scrollTop() + item.position().top + item.outerHeight() - panel.height(); + } + panel.scrollTop(h); + } + } + + var _parseData = function (target) { + var data = []; + var opts = target.uiCombobox('options'); + target.children().each(function () { + if (this.tagName.toLowerCase() == 'optgroup') { + var group = $(this).attr('label'); + $(this).children().each(function () { + _parseItem(this, group); + }); + } else { + _parseItem(this); + } + }); + return data; + + function _parseItem(el, group) { + var t = $(el); + var row = {}; + row[opts.valueField] = t.attr('value') != undefined ? t.attr('value') : t.text(); + row[opts.textField] = t.text(); + if (opts.value == '') { + row['selected'] = t.is(':selected'); + } + row['disabled'] = t.is(':disabled'); + if (group) { + opts.groupField = opts.groupField || 'group'; + row[opts.groupField] = group; + } + data.push(row); + } + }; + + var _nav = function (target, dir) { + var opts = $.data(target[0], _cacheName).options; + var panel = target.uiCombobox('panel'); + var item = panel.children('div.ui_combobox-item-hover'); + if (!item.length) { + item = panel.children('div.ui_combobox-item-selected'); + } + item.removeClass('ui_combobox-item-hover'); + var firstSelector = 'div.ui_combobox-item:visible:not(.ui_combobox-item-disabled):first'; + var lastSelector = 'div.ui_combobox-item:visible:not(.ui_combobox-item-disabled):last'; + if (!item.length) { + item = panel.children(dir == 'next' ? firstSelector : lastSelector); + } else { + if (dir == 'next') { + item = item.nextAll(firstSelector); + if (!item.length) { + item = panel.children(firstSelector); + } + } else { + item = item.prevAll(firstSelector); + if (!item.length) { + item = panel.children(lastSelector); + } + } + } + if (item.length) { + item.addClass('ui_combobox-item-hover'); + var row = opts.finder.getRow(target, item); + if (row) { + _scrollTo(target, row[opts.valueField]); + if (opts.selectOnNavigation) { + _select(target, row[opts.valueField]); + } + } + } + } + + var _select = function (target, value) { + var opts = $.data(target[0], _cacheName).options; + var values = target.uiCombo('getValues'); + if ($.inArray(value + '', values) == -1) { + if (opts.multiple) { + values.push(value); + } else { + values = [value]; + } + _setValues(target, values); + opts.onSelect.call(target, opts.finder.getRow(target, value)); + } + } + + var _unselect = function (target, value) { + var opts = $.data(target[0], _cacheName).options; + var values = target.uiCombo('getValues'); + var index = $.inArray(value + '', values); + if (index >= 0) { + values.splice(index, 1); + _setValues(target, values); + opts.onUnselect.call(target, opts.finder.getRow(target, value)); + } + } + + var _setValues = function (target, values, remainText) { + var opts = $.data(target[0], _cacheName).options; + var panel = target.uiCombo('panel'); + + panel.find('div.ui_combobox-item-selected').removeClass('ui_combobox-item-selected'); + var vv = [], ss = []; + if (opts.searchable) { + for (var i = 0; i < values.length; i++) { + var v = values[i]; + opts.finder.getEl(target, v).addClass('ui_combobox-item-selected'); + var row = opts.finder.getRow(target, v); + if (row) { + s = row[opts.textField]; + if (opts.searchable) { + ss.push($('
          ' + s + '
          ').text()); + vv.push(v); + } + } + } + } else { + for (var i = 0; i < values.length; i++) { + var v = values[i]; + var s = v; + opts.finder.getEl(target, v).addClass('ui_combobox-item-selected'); + var row = opts.finder.getRow(target, v); + if (row) { + s = row[opts.textField]; + } + vv.push(v); + ss.push($('
          ' + s + '
          ').text()); + } + } + target.uiCombo('setValues', vv); + if (!remainText) { + target.uiCombo('options').nullValue = opts.nullValue; + target.uiCombo('setText', ss.join(opts.separator)); + } + var comboText = target.uiCombo('textbox'); + comboText.attr('title', comboText.val()); + + } + + var _loadData = function (target, data, remainText) { + var state = $.data(target[0], _cacheName); + var opts = state.options; + state.data = opts.loadFilter.call(target, data); + state.groups = []; + data = state.data || []; + + var selected = target.uiCombobox('getValues'); + var dd = []; + var group = undefined; + for (var i = 0; i < data.length; i++) { + var row = data[i]; + var v = row[opts.valueField] + ''; + var s = row[opts.textField]; + var g = row[opts.groupField]; + if (opts.nullValue && opts.nullValue == v) { + opts.nullValue = s; + } + + if (g) { + if (group != g) { + group = g; + state.groups.push(g); + var text = opts.groupFormatter ? opts.groupFormatter.call(target, g) : g; + dd.push('
          '); + dd.push(text); + dd.push('
          '); + } + } else { + group = undefined; + } + + var cls = 'ui_combobox-item' + (row.disabled ? ' ui_combobox-item-disabled' : '') + (g ? ' ui_combobox-gitem' : ''); + var rowText = opts.formatter ? opts.formatter.call(target, row) : s; + var title = $('
          ' + rowText + '
          ').text(); + dd.push('
          '); + dd.push(rowText); + dd.push('
          '); + if (row['selected'] && $.inArray(v, selected) == -1) { + selected.push(v); + } + } + var comboPal = target.uiCombo('panel'); + comboPal.addClass('overflowY'); + comboPal.html(dd.join('')); + + if (opts.multiple) { + _setValues(target, selected, remainText); + } else { + _setValues(target, selected.length > 0 ? [selected[selected.length - 1]] : [], remainText); + } + opts.onLoadSuccess.call(target, data); + } + + var _request = function (target, url, param, remainText) { + var opts = $.data(target[0], _cacheName).options; + if (url) { + opts.url = url; + } + param = param || {}; + + if (opts.onBeforeLoad.call(target, param) == false) return; + + opts.loader.call(target, param, function (data) { + _loadData(target, data, remainText); + }, function () { + opts.onLoadError.apply(this, arguments); + }); + } + + var _doQuery = function (target, input) { + var state = $.data(target[0], _cacheName); + var opts = state.options; + if (opts.multiple && !input) { + _setValues(target, [], true); + } else { + _setValues(target, [input], true); + } + + if (opts.mode == 'remote') { + var mi = opts.queryMin; + if (typeof mi == "number") { + if ($.trim(input).length >= mi) { + _request(target, null, {input: input}, true); + } + } + if (typeof mi == "object") { + if (!isChinese(input) && $.trim(input).length >= mi[0]) { + _request(target, null, {input: input}, true); + } + if (isChinese(input) && $.trim(input).length >= mi[1]) { + _request(target, null, {input: input}, true); + } + } + } else { + var panel = target.uiCombo('panel'); + panel.find('div.ui_combobox-item-selected,div.ui_combobox-item-hover').removeClass('ui_combobox-item-selected ui_combobox-item-hover'); + panel.find('div.ui_combobox-item,div.ui_combobox-group').hide(); + var data = state.data; + var vv = []; + var qq = opts.multiple ? input.split(opts.separator) : [input]; + var isOnlyOne = false; + $.map(qq, function (q) { + q = $.trim(q); + var group = undefined; + for (var i = 0; i < data.length; i++) { + var row = data[i]; + if (opts.filter.call(target, q, row)) { + var v = row[opts.valueField]; + var s = row[opts.textField]; + var g = row[opts.groupField]; + var item = opts.finder.getEl(target, v).show(); + if (item) { + vv.push(v); + st = $('
          ' + s + '
          ').text(); + if (st.toLowerCase() == q.toLowerCase()) { + isOnlyOne = true; + } + } + if (opts.groupField && group != g) { + $('#' + state.groupIdPrefix + '_' + $.inArray(g, state.groups)).show(); + group = g; + } + } + } + }); + if (vv.length == 1 && isOnlyOne) { + _select(target, vv[0]); + target.uiCombobox('hidePanel'); + } + } + } + + var _doEnter = function (target) { + var opts = target.uiCombobox('options'); + var panel = target.uiCombobox('panel'); + var item = panel.children('div.ui_combobox-item-hover'); + if (item.length) { + var row = opts.finder.getRow(target, item); + var value = row[opts.valueField]; + if (opts.multiple) { + if (item.hasClass('ui_combobox-item-selected')) { + target.uiCombobox('unselect', value); + } else { + target.uiCombobox('select', value); + } + } else { + target.uiCombobox('select', value); + } + } + var vv = []; + $.map(target.uiCombobox('getValues'), function (v) { + if (_getRowIndex(target, v) >= 0) { + vv.push(v); + } + }); + target.uiCombobox('setValues', vv); + if (!opts.multiple) { + target.uiCombobox('hidePanel'); + } + } +})(jQuery);/** +* Created by jinxs on 14-9-1. +*/ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiSearchbox'; + /** + * @name uiSearchbox + * @class 搜索框 + * @constructor uiSearchbox + * @description 构造函数. + * @param options 组件配置参数:{} + * @example + * //采用默认值 + * $('#scb').uiSearchbox(); + * //设置组件参数 + * $('#scb').uiSearchbox({height:'20',width:'auto'}); + * //调用组件方法 + * $('#scb').uiSearchbox('clear',''); + */ + $.fn.uiSearchbox = function (options, param) { + if (typeof options == "string") { + return $.fn.uiSearchbox.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var state = me.data(_cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + } else { + state = { + options: $.extend({}, $.fn.uiSearchbox.defaults, me.parseUIConfig(),options) + }; + me.data(_cacheName, state); + _init(me); + } + _setPrompt(me); + _bindEvent(me); + _setDisable(me, state.options.disabled); + _setWidth(me); + }); + }; + /** + * 方法 + * @lends uiSearchbox.prototype + */ + $.fn.uiSearchbox.methods = { + /** + * @summary 获取组件配置参数 + * @function + * @name uiSearchbox#options + * @returns {Object} + * @example + * $('#btn').uiSearchbox('options'); + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 获取组件菜单 + * @function + * @name uiSearchbox#menu + * @returns {Object} 菜单 + */ + menu: function (target) { + return $.data(target[0], _cacheName).menu; + }, + /** + * @summary 获取组件的文本框 + * @function + * @name uiSearchbox#textbox + * @returns {Object} 文本框 + */ + textbox: function (target) { + var targetID = target.getElemID(); + var input = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchText); + return input; + }, + /** + * @summary 获取组件的值 + * @function + * @name uiSearchbox#getValue + * @returns {String} + */ + getValue: function (target) { + return $.data(target[0], _cacheName).options.value; + }, + /** + * @summary 设置组件的值 + * @name uiSearchbox#setValues + * @function + * @param values {Array} 组件的值列表 + * @returns {jQuery} 组件对象 + */ + setValue: function (target, value) { + target.uiSearchbox("options").value = value; + target.uiSearchbox("textbox").val(value); + target.uiSearchbox("textbox").blur(); + return target; + }, + /** + * @summary 清除组件的值 + * @name uiSearchbox#clear + * @function + * @returns {jQuery} 组件对象 + */ + clear: function (target) { + target.uiSearchbox("setValue", ""); + return target; + }, + /** + * @summary 重置组件的值 + * @name uiSearchbox#reset + * @function + * @returns {jQuery} 组件对象 + */ + reset: function (target) { + var options = $(this).uiSearchbox("options"); + target.uiSearchbox("setValue", options.originalValue); + return target; + }, + /** + * @summary 获取组件搜索文本框的控件名 + * @function + * @name uiSearchbox#getName + * @returns {String} + */ + getName: function (target) { + var targetID = target.getElemID(); + var input = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchText); + return input.attr('name'); + }, + /** + * @summary 移除并返回组件 + * @name uiSearchbox#destroy + * @function + * @returns {jQuery} 组件对象 + */ + destroy: function (target) { + var targetID = target.getElemID(); + var searchbox = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchSapn); + searchbox.remove(); + target.remove(); + return target; + }, + /** + * @summary 设置控件的宽度 + * @name uiSearchbox#resize + * @function + * @param width {Number} 宽度大小 + * @returns {jQuery} 方法调用者 + */ + resize: function (target, width) { + _setWidth(target, width); + return target; + }, + /** + * @summary 禁用组件 + * @name uiSearchbox#disable + * @function + * @returns {jQuery} 组件对象 + */ + disable: function (target) { + _setDisable(target, true); + _bindEvent(target); + return target; + }, + /** + * @summary 启用组件 + * @name uiSearchbox#enable + * @function + * @returns {jQuery} 组件对象 + */ + enable: function (target) { + _setDisable(target, false); + _bindEvent(target); + return target; + } + }; + /** + * 默认配置 + * @lends uiSearchbox.prototype + */ + $.fn.uiSearchbox.defaults = { + /** + * @type String + * @default auto + * @summary 组件宽度 + */ + width: "auto", + /** + * @type Number + * @default 20 + * @summary 组件高度 + */ + height: 20, + searchBtnRight:true, + searchBtnClass:"", + /** + * @type String + * @default "" + * @summary 组件的提示信息 + */ + prompt: "", + /** + * @type String + * @default "" + * @summary 提示信息样式 + */ + Style:"", + /** + * @type String + * @default "" + * @summary 组件的值 + */ + value: "", + /** + * @type Object + * @default null + * @summary 组件的菜单 + */ + menu: null, + /** + * @type Boolean + * @default false + * @summary 指示组件是否禁用 + */ + disabled: false, + /** + * @summary 在组件值改变时触发的方法。 + * @event + * @name uiSearchbox#searcher + * @param value {String} 组件的值 + * @default emptyFn + */ + searcher: function (value) { + } + }; + var _init = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + target.addClass("ui_searchboxOrigin").hide(); + target.setElemID(); + var reg = new RegExp('({search})', 'g'); + var targetID = target.getElemID(); + $($.uiTemplate.uiSearchbox.html.replace(reg, targetID)).insertAfter(target); + + var name = target.attr("name"); + var input = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchText); + if (name) { + input.attr("name", name); + target.removeAttr("name").attr("searchboxName", name); + } + var searchbox = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchSapn); + searchbox.addClass(options.style); + if(!options.searchBtnRight){ + searchbox.append(input.detach()); + } + var btn = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchBtn); + btn.addClass(options.searchBtnClass); + }; + var _setPrompt = function (target) { + var state = $.data(target[0], _cacheName); + var targetID = target.getElemID(); + var options = state.options; + var input = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchText); + options.originalValue = options.value; + if (options.value) { + input.val(options.value); + input.removeClass("ui_searchbox-prompt"); + } else { + input.val(options.prompt); + input.addClass("ui_searchbox-prompt"); + } + }; + var _bindEvent = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + var targetID = target.getElemID(); + var searchbox = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchSapn); + var input = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchText); + var btn = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchBtn); + input.unbind(".uiSearchbox"); + btn.unbind(".uiSearchbox"); + if (!options.disabled) { + input.bind("blur.uiSearchbox", function (e) { + searchbox.removeClass('ui_searchbox-hover'); + options.value = $(this).val(); + if (options.value == "") { + $(this).val(options.prompt); + $(this).addClass("ui_searchbox-prompt"); + } else { + $(this).removeClass("ui_searchbox-prompt"); + } + }).bind("focus.uiSearchbox", function (e) { + searchbox.addClass('ui_searchbox-hover'); + if ($(this).val() != options.value) { + $(this).val(options.value); + } + $(this).removeClass("ui_searchbox-prompt"); + }).bind("keydown.uiSearchbox", function (e) { + if (e.which == $.keyCode.ENTER) { + e.preventDefault(); + options.value = $(this).val(); + target.val(options.value); + options.searcher.call(target, options.value); + return false; + } + }); + btn.bind("click.uiSearchbox", function () { + target.val(options.value); + options.searcher.call(target, options.value); + }).bind("mouseenter.uiSearchbox", function () { + $(this).addClass("ui_searchbox-button-hover"); + }).bind("mouseleave.uiSearchbox", function () { + $(this).removeClass("ui_searchbox-button-hover"); + }); + } + }; + + var _setWidth = function (target, width) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + var searchbox = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchSapn); + if (width) { + options.width = width; + } + if (options.width) { + searchbox.width(options.width); + }else{ + options.width = searchbox.outerWidth(); + } + var input = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchText); + var btn = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchBtn); + var _b = searchbox.find("a.uiSearchbox-menu"); + input.outerWidth(searchbox.width() - _b.outerWidth() - btn.outerWidth()) + .outerHeight(options.height).css('line-height', options.height + 'px'); + _b.outerHeight(options.height); + btn.outerHeight(options.height); + var _d = _b.find("span.l-btn-left"); + _d.outerHeight(options.height); + _d.find("span.l-btn-text").css({ height: _d.height() + "px", lineHeight: _d.height() + "px" }); + }; + var _setDisable = function (target, disable) { + var state = $.data(target[0], _cacheName); + var options = state.options; + var targetID = target.getElemID(); + var input = $.getByParentID(targetID, $.uiTemplate.uiSearchbox.searchText); + if (disable) { + options.disabled = true; + target.attr("disabled", true); + input.attr("disabled", true); + } else { + options.disabled = false; + target.removeAttr("disabled"); + input.removeAttr("disabled"); + } + }; +})(jQuery);/** + * Created by jinxs on 14-11-11. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiOfficeControl'; + /** + * @class Office控制组件 + * @constructor uiOfficeControl + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * // 构件组件 + * $('#divMenu').uiOfficeControl({width: 160, height: 500}); + * // 调用组件方法options + * $('#divMenu').uiOfficeControl("options"); + */ + $.fn.uiOfficeControl = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiOfficeControl.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var state = me.data(_cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiOfficeControl.defaults, me.parseUIConfig(), options) + }); + } + _init(me); + _resize(me); + }); + }; + /** + * 方法 + * @lends uiOfficeControl.prototype + */ + $.fn.uiOfficeControl.methods = { + /** + * @summary 获取组件配置参数 + * @function + * @name uiOfficeControl#options + * @returns {Object} + * @example + * $('#btn').uiOfficeControl('options'); + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 获取组件对象 + * @name uiOfficeControl#getCab + * @function + * @returns {jQuery} 方法调用者 + */ + getCab: function (target) { + var targetID = target.getElemID(); + return $.getByParentID(targetID, $.uiTemplate.uiNTOK.NTOK_ID)[0]; + } + }; + /** + * 默认配置 + * @lends uiOfficeControl.prototype + */ + $.fn.uiOfficeControl.defaults = + { + /** + * @type Boolean + * @default true + * @summary 是否自适应大小 + */ + autoFit: true, + /** + * @type String + * @default "Office在线文档" + * @summary 标题 + */ + caption: 'Office在线文档', + classid: '', + /** + * @type String + * @default "" + * @summary 版权所有说明 + */ + makerCaption: '', + /** + * @type String + * @default "" + * @summary 版权所Key + */ + makerKey: '', + /** + * @type String + * @default "" + * @summary 产品说明 + */ + productCaption: '', + /** + * @type String + * @default "" + * @summary 产品Key + */ + productKey: '', + /** + * @type String + * @default "" + * @summary 组件所在的URL路径 + */ + cabRoot: '', + cabName: 'OfficeControl.cab', + /** + * @type String + * @default "5,0,2,8" + * @summary 组件版本号 + */ + cabVersion: '5,0,2,8', + /** + * @type String + * @default "0" + * @summary 标题栏的文本颜色 + */ + titlebarTextColor: '0', + /** + * @type String + * @default "16777215" + * @summary 菜单栏颜色 + */ + menubarColor: '16777215', + /** + * @type String + * @default "16180947" + * @summary 菜单栏按钮颜色 + */ + menuButtonColor: '16180947', + /** + * @type String + * @default "14540253" + * @summary 边框颜色 + */ + borderColor: '14540253', + /** + * @type String + * @default "16119285" + * @summary 标题栏颜色 + */ + titlebarColor: '16119285', + /** + * @type String + * @default "0" + * @summary 菜单栏风格 + */ + menuBarStyle: '0', + /** + * @type String + * @default "7" + * @summary 菜单栏按钮风格 + */ + menuButtonStyle: '7', + /** + * @type String + * @default "NTKO" + * @summary 互联网用户名 + */ + webUserName: 'NTKO', + /** + * @type String + * @default "-1" + * @summary 是否使用UTF8URL + */ + isUseUTF8URL: '-1', + /** + * @type String + * @default "-1" + * @summary 是否使用UTF8Data + */ + isUseUTF8Data: '-1', + /** + * @type String + * @default "0" + * @summary 边框风格 + */ + borderStyle: '0' + }; + //////--------------------------------内部方法------------------------------ + /** + * 创建 + * @param target 目标对象 + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + target.setElemID(); + var targetID = target.getElemID(); + var html = []; + html.push(''); + html.push(' '); + html.push(' '); + html.push(' '); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(''); + html.push(' '); + html.push('不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置。 '); + } else { + html.push('clsid="{' + options.classid + '}"'); + html.push('type="application/ntko-plug"'); + html.push('_MakerCaption="' + options.makerCaption + '"'); + html.push('_wmode="Opaque"'); + html.push('_MakerKey="' + options.makerKey + '"'); + html.push('_ProductCaption="' + options.productCaption + '"'); + html.push('_ProductKey="' + options.productKey + '"'); + html.push('_Caption="' + options.caption + '"'); + html.push('_TitlebarTextColor="' + options.titlebarTextColor + '"'); + html.push('_MenubarColor="' + options.menubarColor + '"'); + html.push('_MenuButtonColor="' + options.menuButtonColor + '"'); + html.push('_BorderColor="' + options.borderColor + '"'); + html.push('_TitlebarColor="' + options.titlebarColor + '"'); + html.push('_MenuBarStyle="' + options.menuBarStyle + '"'); + html.push('_MenuButtonStyle="' + options.menuButtonStyle + '"'); + html.push('_WebUserName="' + options.webUserName + '"'); + html.push('_IsUseUTF8URL="' + options.isUseUTF8URL + '"'); + html.push('_IsUseUTF8Data="' + options.isUseUTF8Data + '"'); + html.push('_BorderStyle="' + options.borderStyle + '"'); + html.push('>'); + if (webUI_browser().chrome) { + html.push('尚未安装Office文档插件。请点击安装组件 '); + } else if (webUI_browser().firefox) { + html.push('尚未安装Office文档插件。请点击安装组件 '); + } else { + html.push('不能装载文档控件。浏览器不支持!支持的浏览器:IE、Firefox、Chrome '); + } + } + html.push(''); + target.append(html.join('')); + target.bind('_resize', function () { + _resize(target); + }); + return target; + }; + var _resize = function (target) { + var options = $.data(target[0], _cacheName).options; + if (options.autoFit) { + target.autoFit(true, false); + var cab = $(target.uiOfficeControl('getCab')); + cab.width(target.width()); + cab.height(target.height()); + } + }; +})(jQuery); +/** + * Created by jinxs on 14-11-12. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiUEditor'; + /** + * @class 富文本编辑器组件 + * @constructor uiUEditor + * @summary 构造函数 + * @param [options] {Object|String} 组件配置参数|要调用的组件方法名 + * @param [param] {Object} 表示要调用的组件方法的参数 + * @example + * //采用默认值 + * $('#tab').uiUEditor(); + * //设置组件参数 + * $('#tab').uiUEditor({autoFit:'true'}); + * //调用组件方法 + * $('#tab').uiUEditor('getEditor',''); + */ + $.fn.uiUEditor = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiUEditor.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var state = me.data(_cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiUEditor.defaults, me.parseUIConfig(), options) + }); + } + _init(me); + _resize(me); + }); + }; + /** + * 方法 + * @lends uiUEditor.prototype + */ + $.fn.uiUEditor.methods = { + /** + * @summary 获取组件配置参数 + * @function + * @name uiUEditor#options + * @returns {Object} + * @example + * $('#btn').uiUEditor('options'); + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 获取编辑器 + * @function + * @name uiUEditor#getEditor + * @returns {Object} + */ + getEditor: function (target, config) { + var targetID = target.getElemID(); + config = config || {}; + return UE.getEditor($.getIDByParentID(targetID, $.uiTemplate.uiUEditor.editorID), config); + } + , enable: function (target) { + var editor=target.uiUEditor('getEditor'); + editor.ready(function () { + editor.setEnabled(); + }); + return target; + } + , disable: function (target, except) { + var editor=target.uiUEditor('getEditor'); + editor.ready(function () { + editor.setDisabled(except); + }); + return target; + } + , setReadonly: function (target, readonly) { + var targetID = target.getElemID(); + var editor=target.uiUEditor('getEditor'); + editor.ready(function () { + var content = editor.getContent(); + if(readonly) { + var reg = new RegExp('({uiUEditor})', 'g'); + var cont=$($.uiTemplate.uiUEditor.contentHtml.replace(reg, targetID)); + cont.append(content); + target.append(cont); + editor.setHide(); + var starId=target.attr('id')+'-star'; + $('#'+starId).remove(); + }else{ + $.getByParentID(targetID, $.uiTemplate.uiUEditor.contentID).remove(); + editor.setShow(); + } + }); + return target; + } + , destroy: function (target) { + var editor=target.uiUEditor('getEditor'); + editor.ready(function () { + target.uiUEditor('getEditor').destroy(); + target.empty(); + }); + return target; + } + }; + /** + * 默认配置 + * @lends uiUEditor.prototype + */ + $.fn.uiUEditor.defaults = + { + /** + * @type Boolean + * @default true + * @summary 是否自适应宽高 + */ + autoFit: true, + config: {} + }; + //////--------------------------------内部方法------------------------------ + /** + * 创建 + * @param target 目标对象 + */ + var _init = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + target.setElemID(); + target.addClass('ui_ueditor'); + var content=target.html(); + target.empty(); + var targetID = target.getElemID(); + var reg = new RegExp('({uiUEditor})', 'g'); + target.append($.uiTemplate.uiUEditor.editorHtml.replace(reg, targetID)); + options.config.initialContent=content; + target.uiUEditor('getEditor', options.config); + target.bind('_resize', function () { + _resize(target); + }); + return target; + }; + var _resize = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + if (options.autoFit) { + target.autoFit(true, false); + target.uiUEditor('getEditor').ready(function () { + var targetID = target.getElemID(); + var list = $.getByParentID(targetID, $.uiTemplate.uiUEditor.editorID); + var toolbarbox = list.find(".edui-editor-toolbarbox"); + var iframeholder = list.find(".edui-editor-iframeholder"); + var bottomContainer = list.find(".edui-editor-bottomContainer"); + list.add(list.children()).width(target.width()); + iframeholder.height(target.height() - toolbarbox.height() - bottomContainer.height()); + }); + } + }; +})(jQuery); +/** + * Created by jinxs on 2014.12.24. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiWizard'; + /** + * @name uiWizard + * @class 向导组件 + * @constructor + * @summary 构造函数 + * @param {Object|String} options 如果为Object,则表示组件配置,如果为String,则调用组件方法 + * @param {Object} param 当options为String时,可以传入方法参数 + * @returns {jQuery} jQuery对象 + * @example + * //采用默认值 + * $('#ul').uiWizard(); + * //设置组件参数 + * $('#ul').uiWizard({selectedItem: {step:1}}); + * //调用组件方法 + * $('#ul').uiWizard('options'); + */ + $.fn.uiWizard = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiWizard.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var state = me.data(_cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + } else { + me.data(_cacheName, { + options: $.extend({}, $.fn.uiWizard.defaults, me.parseUIConfig(), options) + }); + } + _init(me); + }); + }; + /** + * 方法 + * @lends uiWizard.prototype + */ + $.fn.uiWizard.methods = { + /** + * @summary 获取组件配置参数 + * @function + * @name uiWizard#options + * @returns {Object} + * @example + * $('#ul').uiWizard('options'); + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 到上一步 + * @function + * @name uiWizard#previous + * @returns {Object} + * @example + * $('#ul').uiWizard('previous'); + */ + previous: function (target) { + _previous(target); + }, + /** + * @summary 到下一步 + * @function + * @name uiWizard#next + * @returns {Object} + * @example + * $('#ul').uiWizard('next'); + */ + next: function (target) { + _next(target); + }, + /** + * @summary 转到指定步骤 + * @function + * @name uiWizard#selectedItem + * @returns {Object} + * @example + * //获取当前步骤 ,返回值{step:xx} + * $('#ul').uiWizard('selectedItem'); + * //转到指定步骤1 + * $('#ul').uiWizard('selectedItem',{step:1}); + */ + selectedItem: function (target, selectedItem) { + return _selectedItem(target, selectedItem); + } + }; + /** + * 默认配置 + * @lends uiWizard.prototype + */ + $.fn.uiWizard.defaults = + { + /** + * @summary 选中的步骤 + * @type String + * @default "" + */ + selectedItem: {step: 1}, + /** + * @summary 上一步按钮 + * @type Jquery对象 + * @default null + */ + buttonPrev: null, + /** + * @summary 下一步按钮 + * @type Jquery对象 + * @default null + */ + buttonNext: null, + /** + * @summary 不允许返回上一步 + * @type boolean + * @default false + */ + disablePreviousStep: false, + /** + * @summary 最后一步显示文字 + * @type String + * @default 完成 + */ + lastText: '完成', + /** + * @summary 在步骤改变前触发。 + * @event + * @name uiWizard#onBeforeStepChange + * @param currStep {Int} 当前所在步骤 + * * @param type {Int} 触发来源 -1:步骤点击 0:上一步 1:下一步 + * @this 组件jQuery对象 + * @default emptyFn + */ + onBeforeStepChange: function (currStep,type) { + }, + /** + * @summary 在步骤改变后触发。 + * @event + * @name uiWizard#onStepChanged + * @param currStep {Int} 改变后所在步骤 + * @this 组件jQuery对象 + * @default emptyFn + */ + onStepChanged: function (currStep) { + } + ,onFinished:function(){ + + } + }; +//////--------------------------------内部方法------------------------------ + var _init = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + target.addClass('ui_wizard'); + if (_IE8) { + target.addClass('ui_wizard_IE8'); + } + if (_IEunder8) { + var children = target.children(); + children.css('width', Math.floor(90 / children.length) + '%'); + } + options.currentStep = options.selectedItem.step; + options.numSteps = target.find('> li').length; + var prevBtn = options.buttonPrev; + var nextBtn = options.buttonNext; + options.nextText = nextBtn.uiButton('getLabel'); + + prevBtn.on('click', function (e) { + _previous(target); + } + ); + nextBtn.on('click', function (e) { + _next(target); + }); + target.on('click', 'li.complete', function (e) { + _stepClicked(target, e); + }); + + if (options.currentStep > 1) { + _selectedItem(target, options.selectedItem); + } else { + _setState(target); + } + + if (options.disablePreviousStep) { + prevBtn.uiButton('setDisabled', true); + target.addClass('previous-disabled'); + } + return target; + }; + var _setState = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + var canMovePrev = (options.currentStep > 1); + var firstStep = (options.currentStep === 1); + var lastStep = (options.currentStep === options.numSteps); + + var prevBtn = options.buttonPrev; + var nextBtn = options.buttonNext; + if (!options.disablePreviousStep) { + prevBtn.uiButton('setDisabled', (firstStep === true || canMovePrev === false)); + } + + if (options.lastText !== '') { + var text = (lastStep !== true) ? options.nextText : options.lastText; + nextBtn.text(text); + } + + var steps = target.find('> li'); + steps.removeClass('active').removeClass('complete').removeClass('completeIE8'); + + var prevSelector = '> li:lt(' + (options.currentStep - 1) + ')'; + var prevSteps = target.find(prevSelector); + prevSteps.addClass('complete'); + if (_IE8) { + prevSteps.addClass('completeIE8'); + } + + var currentSelector = '> li:eq(' + (options.currentStep - 1) + ')'; + var currentStep = target.find(currentSelector); + currentStep.addClass('active'); + options.onStepChanged.call(target, options.currentStep); + }; + + var _stepClicked = function (target, e) { + var state = $.data(target[0], _cacheName); + var options = state.options; + var li = $(e.currentTarget); + var index = target.find('>li').index(li); + var canMovePrev = true; + + if (options.disablePreviousStep) { + if (index < options.currentStep) { + canMovePrev = false; + } + } + + if (canMovePrev) { + if (options.onBeforeStepChange.call(target, options.currentStep,-1) == false) { + return; + } + options.currentStep = (index + 1); + _setState(target); + } + }; + var _previous = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + var canMovePrev = (options.currentStep > 1); + if (options.disablePreviousStep) { + canMovePrev = false; + } + if (canMovePrev) { + if (options.onBeforeStepChange.call(target, options.currentStep,0) == false) { + return; + } + options.currentStep -= 1; + _setState(target); + } + } + var _next = function (target) { + var state = $.data(target[0], _cacheName); + var options = state.options; + + var canMoveNext = (options.currentStep + 1 <= options.numSteps); + var lastStep = (options.currentStep === options.numSteps); + + if (canMoveNext) { + if (options.onBeforeStepChange.call(target, options.currentStep,1) == false) { + return; + } + options.currentStep += 1; + _setState(target); + } + else if (lastStep) { + options.onFinished.call(target); + } + }; + var _selectedItem = function (target, selectedItem) { + var state = $.data(target[0], _cacheName); + var options = state.options; + var retVal, step; + + if (selectedItem) { + + step = selectedItem.step || -1; + + if (step >= 1 && step <= options.numSteps) { + options.currentStep = step; + _setState(target); + } + + retVal = target; + } + else { + retVal = {step: options.currentStep}; + } + + return retVal; + } +}) +(jQuery);/** + * Created by jinxs on 2015.01.27. + */ +(function ($) { + /** + * 缓存名称 + * @type {string} + * @private + */ + var _cacheName = 'uiCheckbox'; + /** + * @name uiCheckbox + * @class 复选框 + * @constructor + * @summary 构造函数 + * @param {Object|String} options 如果为Object,则表示组件配置,如果为String,则调用组件方法 + * @param {Object} param 当options为String时,可以传入方法参数 + * @returns {jQuery} jQuery对象 + * @example + * //采用默认值 + * $('#cb').uiCheckbox(); + * //设置组件参数 + * $('#cb').uiCheckbox({id:'cb',label:'提交'}); + * //调用组件方法 + * $('#cb').uiCheckbox('setLabel','保存'); + */ + $.fn.uiCheckbox = function (options, param) { + if (typeof options == 'string') { + return $.fn.uiCheckbox.methods[options](this, param); + } + return this.each(function(){ + var me = $(this); + var state = me.data(_cacheName); + + options = options || {}; + if (state) { + $.extend(state.options, options); + } else { + me.data(_cacheName, { + options: $.extend(true, {}, $.fn.uiCheckbox.defaults, me.parseUIConfig(), options) + }); + } + _init(me) + }); + }; + /** + * 方法 + * @lends uiCheckbox.prototype + */ + $.fn.uiCheckbox.methods = { + /** + * @summary 获取组件配置参数 + * @function + * @name uiCheckbox#options + * @returns {Object} + * @example + * $('#cb').uiCheckbox('options'); + */ + options: function (target) { + return $.data(target[0], _cacheName).options; + }, + /** + * @summary 启用组件 + * @function + * @name uiCheckbox#enable + * @returns {jQuery} 方法调用者 + */ + enable: function (target) { + _setDisabled(target, false); + return target; + }, + /** + * @summary 禁用组件 + * @function + * @name uiCheckbox#disable + * @returns {jQuery} 方法调用者 + */ + disable: function (target) { + _setDisabled(target, true); + return target; + }, + /** + * @summary 设置是否禁用组件 + * @function + * @name uiCheckbox#setDisabled + * @param disabled {Boolean} 是否禁用 + * @returns {jQuery} 方法调用者 + */ + setDisabled: function (target, disabled) { + _setDisabled(target, !!disabled); + return target; + } + }; + /** + * 默认配置 + * @lends uiCheckbox.prototype + */ + $.fn.uiCheckbox.defaults = + { + disabled: false, + readonly: false, + beforeClick: function () { + }, + onChanged:function(checked){ + } + }; + + //////--------------------------------内部方法------------------------------ + /** + * 创建按钮 + * @param target 目标对象 + */ + var _init = function (target) { + var options = $.data(target[0], _cacheName).options; + target.setElemID(); + var targetID = target.getElemID(); + + target.addClass('ui_checkboxOrigin'); + var reg = new RegExp('({uiCheckbox})', 'g'); + target.wrap($($.uiTemplate.uiCheckbox.wrapperHtml.replace(reg, targetID))); + target.before($($.uiTemplate.uiCheckbox.cbHtml.replace(reg, targetID))); + + var wrapper = $.getByParentID(targetID, $.uiTemplate.uiCheckbox.wrapperID); + var cb = $.getByParentID(targetID, $.uiTemplate.uiCheckbox.cbID); + cb.click(function () { + if (target.attr('disabled') || target.attr('readonly')) { + return false; + } + if (options.disabled || options.readonly) return false; + if (options.beforeClick.call(target) == false) return false; + if ($(this).hasClass("ui_checkbox-checked")) { + _setValue(target, false); + } + else { + _setValue(target, true); + } + target.trigger("change"); + options.onChanged.call(target,_getValue(target)); + }); + wrapper.hover(function () { + if (!options.disabled) + $(this).addClass("checkbox_over"); + }, function () { + $(this).removeClass("checkbox_over"); + }); + _updateStyle(target); + } + + var _updateStyle = function (target) { + var options = $.data(target[0], _cacheName).options; + var targetID = target.getElemID(); + if (target.attr('disabled')) { + var wrapper = $.getByParentID(targetID, $.uiTemplate.uiCheckbox.wrapperID); + wrapper.addClass("checkbox-disabled"); + options.disabled = true; + } + var cb = $.getByParentID(targetID, $.uiTemplate.uiCheckbox.cbID); + if (target[0].checked) { + cb.addClass('ui_checkbox-checked'); + } + else { + cb.removeClass('ui_checkbox-checked'); + } + }; + var _setValue = function (target, value) { + var targetID = target.getElemID(); + var cb = $.getByParentID(targetID, $.uiTemplate.uiCheckbox.cbID); + if (!value) { + target[0].checked = false; + cb.removeClass('ui_checkbox-checked'); + } + else { + target[0].checked = true; + cb.addClass('ui_checkbox-checked'); + } + }; + var _setDisabled = function (target, value) { + var targetID = target.getElemID(); + var wrapper = $.getByParentID(targetID, $.uiTemplate.uiCheckbox.wrapperID); + if (value) { + target.attr('disabled', true); + wrapper.addClass("checkbox-disabled"); + } + else { + target.attr('disabled', false); + wrapper.removeClass("checkbox-disabled"); + } + }; + var _getValue = function (target) { + return target[0].checked; + }; +})(jQuery); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/cetc54.ui.all.min.js b/asset/thirdlib/CECT54.WebUI/cetc54.ui.all.min.js new file mode 100644 index 0000000..9738b46 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/cetc54.ui.all.min.js @@ -0,0 +1 @@ +var _IE=webUI_browser().ie;var _IE8=(_IE&&webUI_browser().version==8);var _IEunder6=(_IE&&webUI_browser().version<7);var _IEunder7=(_IE&&webUI_browser().version<8);var _IEunder8=(_IE&&webUI_browser().version<9);var _IEunder9=(_IE&&webUI_browser().version<10);if(_IEunder6){document.execCommand("BackgroundImageCache",false,true);var bg="backgroundAttachment";if($("html").css(bg)!=="fixed"&&$("body").css(bg)!=="fixed"){$("html").css({zoom:1,backgroundImage:"url(about:blank)",backgroundAttachment:"fixed"})}}function isChinese(a){if(escape(a).indexOf("%u")<0){return false}else{return true}}function showResult(d,c,a){if(d){$.uiMessagetip.show({animate:true,panelStyle:"ui_panel_success",height:40,showHeader:false,padding:10,title:"消息提示",content:c,vertical:"top",horizontal:"center",timeout:1500})}else{var b=2000;if(a===undefined){a="error"}else{if(a=="error"){b=0}}$.uiMessagebox.alert({width:300,height:114,draggable:true,maximizable:true,type:a,title:"消息提示",content:c,timeout:b})}}$(function(){$._ajax=$.ajax;$.ajax=function(a){var b={showLoading:true,dataType:"json",beforeSend:function(c){},error:function(d,e,c){},success:function(c,d){}};$.extend(b,a||{});$.extend(a,{beforeSend:function(c){if(b.beforeSend(c)===false){return false}else{if(b.showLoading){$.uiLoading.show()}}},error:function(d,e,c){$.uiLoading.hide();if(b.error(d,e,c)!==false){showResult(false,"服务器端错误:"+d.responseText)}},success:function(c,d){$.uiLoading.hide();if(b.success(c,d)!==false){if(!!c.message){showResult(c.success,c.message)}}}});return $._ajax(a)};$(window).unbind(".resize").bind("resize.resize",function(){$("body").children().each(function(){var a=$(this);if(a.is(":visible")||(a.attr("closed")&&a.attr("closed")=="false")){a.triggerHandler("_resize")}})})});function guidGenerator(){var a=function(){return(((1+Math.random()*65536)|0).toString(16).substring(1))};return a()}function GUID(){return(guidGenerator()+guidGenerator()+guidGenerator()+guidGenerator()+guidGenerator()+guidGenerator()+guidGenerator()+guidGenerator())}function iframeLoaded(c,b){var a=document.getElementById(c);if(_IE){a.onload=function(){b}}else{a.onreadystatechange=function(){if(a.readyState=="complete"){b}}}}Date.prototype.format=function(b){var c={"M+":this.getMonth()+1,"d+":this.getDate(),"h+":this.getHours(),"m+":this.getMinutes(),"s+":this.getSeconds(),"q+":Math.floor((this.getMonth()+3)/3),S:this.getMilliseconds()};if(/(y+)/.test(b)){b=b.replace(RegExp.$1,(this.getFullYear()+"").substr(4-RegExp.$1.length))}for(var a in c){if(new RegExp("("+a+")").test(b)){b=b.replace(RegExp.$1,RegExp.$1.length==1?c[a]:("00"+c[a]).substr((""+c[a]).length))}}return b};function getQueryString(a){var b=new RegExp("(^|&)"+a+"=([^&]*)(&|$)","i");var c=window.location.search.substr(1).match(b);if(c!=null){return unescape(c[2]);return null}}function webUI_browser(){var d=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(d),opera:(!!b&&b.version),webkit:(d.indexOf(" applewebkit/")>-1),firefox:(d.indexOf("firefox")>-1),mac:(d.indexOf("macintosh")>-1),quirks:(document.compatMode=="BackCompat")};c.gecko=(navigator.product=="Gecko"&&!c.webkit&&!c.opera&&!c.ie);var a=0;if(c.ie){a=(d.match(/(msie\s|trident.*rv:)([\w.]+)/)[2]||0)*1;c.ie11Compat=document.documentMode==11;c.ie9Compat=document.documentMode==9;c.ie8=!!document.documentMode;c.ie8Compat=document.documentMode==8;c.ie7Compat=((a==7&&!document.documentMode)||document.documentMode==7);c.ie6Compat=(a<7||c.quirks);c.ie9above=a>8;c.ie9below=a<9}if(c.gecko){var e=d.match(/rv:([\d\.]+)/);if(e){e=e[1].split(".");a=e[0]*10000+(e[1]||0)*100+(e[2]||0)*1}}if(/chrome\/(\d+\.\d)/i.test(d)){c.chrome=+RegExp["\x241"]}if(/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(d)&&!/chrome/i.test(d)){c.safari=+(RegExp["\x241"]||RegExp["\x242"])}if(c.opera){a=parseFloat(b.version())}if(c.webkit){a=parseFloat(d.match(/ applewebkit\/(\d+)/)[1])}c.version=a;return c}(function(a){a.regexs={require:/.+/,email:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,phone:/^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,mobile:/^((\(\d{2,3}\))|(\d{3}\-))?(\d{11})$/,url:/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"])*$/,ip:/^(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5]).(0|[1-9]\d?|[0-1]\d{2}|2[0-4]\d|25[0-5])$/,currency:/^\d+(\.\d+)?$/,number:/^\d+$/,zip:/^[1-9]\d{5}$/,qq:/^[1-9]\d{4,8}$/,english:/^[A-Za-z]+$/,chinese:/^[\u0391-\uFFE5]+$/,username:/^[a-zA-Z]\w{3,19}$/i,integer:/^[-\+]?\d+$/,"double":/^[-\+]?\d+(\.\d+)?$/,rx_space:/^[ \s\u200b\ufeff]*$/}})(jQuery);(function(a){a.keyCode={TAB:9,ENTER:13,ESCAPE:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40}})(jQuery);(function(b){b.fn.setElemID=function(){var c=this;if(!this instanceof jQuery){c=b(this)}if(!c.attr("id")){c.attr("id",guidGenerator())}return c};b.fn.getElemID=function(){var c=this;if(!this instanceof jQuery){c=b(this)}return c.attr("id")};b.fn.setIDByParentID=function(e,c){var d=this;if(!this instanceof jQuery){d=b(this)}if(d.length>0){d.attr("id",b.getIDByParentID(e,c))}return d};b.fn.parseUIConfig=function(e){var d=b(this);var c={};var f=b.trim(d.attr("ui-config"));d.removeAttr("ui-config");if(f){if(f.substring(0,1)!="{"){f="{"+f+"}"}c=(new Function("return "+f))()}return c};b.fn.destroyIframe=function(){b("iframe,frame",this).each(function(){try{if(this.contentWindow&&this.contentWindow.document&&this.contentWindow.close){this.contentWindow.document.write("");this.contentWindow.close()}if(_IE){CollectGarbage()}}catch(c){}}).remove()};b.fn.zIndexHack=function(d,c){return this.each(function(){var e=b(this);if(_IEunder6){e.find("SELECT").toggle(d)}e.find("OBJECT,IFRAME").each(function(){var g=b(this);if(!c||g.closest(c).length==0){if(d){var f=parseInt(g.attr("org_h"));if(f>0){g.height(f)}else{g.css("height","")}g.removeAttr("org_h")}else{if(g.attr("org_h")==undefined){g.attr("org_h",g.height())}g.height(0)}}})})};b.fn.hasScroll=function(){var c="";var e=false;var d=false;var f=this[0];if(f.scrollHeight!=this.height()){e=true}if(f.scrollWidth!=this.width()){d=true}if(e&&d){c="x,y"}else{if(!e&&!d){c=""}else{if(e){c="x"}if(d){c="y"}}}return c};b.fn.autoFit=function(h,d,g,c){var e=this[0];var j=(e.tagName=="BODY"?this:this.parent());var l=j[0].fcount===undefined?0:j[0].fcount;h=h===undefined?true:h;if(h){var f=0;var k=0;if(!e.fitted){e.fitted=true;e.fitParent=d;j[0].fcount=l+1;if(j[0].overflow==undefined){j[0].overflow=j.css("overflow")}j[0].style.overflow="hidden";if(j[0].tagName=="BODY"){b("html").addClass("autoFit")}}f=j.width();k=j.height();if(!d){var i=[" ui_mask "," ui_loading "," ui_dialog "," ui_messagebox "," ui_messagetip "," ui_tip "," icon_draghandler "];g=g===undefined?true:g;c=c===undefined?":visible":c;this.siblings(c).each(function(){var p=b(this);var n=(" "+this.className+" ").replace(/[\t\r\n\f]/g," ");var m=true;for(var o=i.length-1;o>=0;o--){if(n.indexOf(i[o])>=0){m=false;break}}if(m&&this.tagName!="SCRIPT"){if(g){k-=p.outerHeight(true)}else{f-=p.outerWidth(true)}}})}else{this.css({top:0,left:0})}this.outerWidth(f,true);this.outerHeight(k,true)}else{if(e.fitted){e.fitted=false;j[0].fcount=l-1;if(j[0].fcount==0){j[0].style.overflow=j[0].overflow;if(j[0].tagName=="BODY"){b("html").removeClass("autoFit")}}}}return{width:j.width(),height:j.height()}};b.parseWH=function(g,f,e,h){h=h||0;var d=b.trim(String(f||""));var c=d.substr(d.length-1,1);if(c=="%"){d=parseInt(d.substr(0,d.length-1));if(g.toLowerCase().indexOf("width")>=0){d=Math.floor((e.width()-h)*d/100)}else{d=Math.floor((e.height()-h)*d/100)}}else{d=parseInt(d)||undefined}return d};b.getByParentID=function(e,d,c){if(c!=null&&c!=undefined){return b("#"+b.getIDByParentID(e,d),c)}else{return b("#"+b.getIDByParentID(e,d))}};b.getIDByParentID=function(d,c){return d+"-"+c};b.urlAddRandom=function(c){var e=guidGenerator();var f="";if(c.indexOf("?")>-1){var d=c.indexOf("&ref");if(d>-1){if(c.indexOf("?",d)>-1){f=c+"*rand="+e}else{f=c+"?rand="+e}}else{f=c+"&rand="+e}}else{f=c+"?rand="+e}return f};var a=null;b.globalCSS=function(f,p,n){var c=!p;n=n||0;if(!a){a=document.createElement("style");a.type="text/css";document.getElementsByTagName("head")[0].appendChild(a);for(var h=0,q=document.styleSheets,e=q.length;h=0;g--){j=h[g];if(!j.nextSibling&&j.previousSibling){j.parentNode.removeChild(j);h.splice(g,1)}else{break}}}})};b.clearSelection=!window.getSelection?function(){document.selection.empty()}:function(){window.getSelection().removeAllRanges()}})(jQuery);(function(a){a.uiTemplate={iconStyle_Pre:"icon_",mask:'
          ',loading:'
          正在加载……
          ',datepicker:{iconHtml:'',icon:"icon",pickerHtml:'',pickerSpan:"span"},dateRange:{drHtml:'
          '},tooltip:{html:'
          ',region:{right:"right",top:"top",left:"left",bottom:"bottom"},tip:"tip",tipAouter:"tipAouter",arrow:"arrow",content:"tipContent"},panel:{html:'
          ',header:"header",icon:"icon",title:"title",toolbar:"toolbar",content:"content",buttonbar:"buttonbar",btnClose:"close",btnMax:"max",btnMax_Icon:"maxIcon",resizeHand:"resizeHand",btnColl:"coll",btnColl_Icon:"collIcon"},pagination:'
          页,共{pages}页
          共{total}条数据,显示{from}-{to}条
          ',tabs:{html:'
            ',tabHtml:'
          • ',header:"header",headerLeft:"headerLeft",headerRight:"headerRight",headerCenter:"headerCenter",headerTabs:"headerTabs",panels:"panels",tab_li:"li",tab_link:"link",tab_linkIcon:"linkIcon",tab_linkTitle:"linkTitle",tab_close:"tabClose",tabContextMenu:"contextMenu"},uiForm:{iframe:"formIframe"},uiCombo:{html:'',panelHtml:'
            ',comboValueHtml:'',combo:"combo",comboText:"text",comboArrow:"arrow",comboValue:"value",comboPanel:"panel"},uiValidate:{lenDiv:"lenDiv"},uiSearchbox:{html:'',searchSapn:"span",searchText:"text",searchBtn:"btn"},uiGrid:{colresizer:"colresizer"},uiNTOK:{NTOK_ID:"ntko"},uiUEditor:{editorID:"editor",contentID:"conent",contentHtml:'
            ',editorHtml:''},uiCheckbox:{cbHtml:'',wrapperHtml:'
            ',wrapperID:"wrapper",cbID:"cb"}}})(jQuery);(function(c){var b={supports:false,eventName:"",prefix:"",prefixes:"webkit moz o ms khtml".split(" "),isFullScreen:function(){},requestFullScreen:function(){},cancelFullScreen:function(){}};if(typeof document.cancelFullScreen!="undefined"){b.supports=true}else{for(var a=0;a0){var h=e.data(d);e.hide();f.css({position:h.parentPos,overflow:h.parentOverflow})}f.zIndexHack(true,g.excludeSelector);return e},remove:function(f){var e=a.uiMask.hide(f);e.remove();return e}};a.uiMask.defaults={container:a("body"),excludeSelector:null,maskID:"mask",zIndex:888};var b=function(g){var f=g.container;f.setElemID();var i=f[0];var h=f.getElemID();var e=a.getByParentID(h,g.maskID);if(e.length>0){}else{e=a(a.uiTemplate.mask).appendTo(f).attr("id",a.getIDByParentID(h,g.maskID));a(window).bind("resize",function(){if(e.is(":visible")){e.width(i.scrollWidth).height(i.scrollHeight)}})}return e};var c=function(h){var f=b(h);var e=h.container;var g={};g.parentPos=e.css("position");g.parentOverflow=e.css("overflow");e.zIndexHack(false,h.excludeSelector);f.data(d,g);e.css({position:"absolute",overflow:"hidden"});f.css({zIndex:h.zIndex,width:e[0].scrollWidth,height:e[0].scrollHeight});f.show();return f}})(jQuery);(function(a){a.uiLoading={add:function(d){d=d||{};d=a.extend({},a.uiLoading.defaults,d);return b(d)},show:function(d){d=d||{};d=a.extend({},a.uiLoading.defaults,d);var e=c(d);return e},hide:function(e){e=e||{};e=a.extend({},a.uiLoading.defaults,e);var d=e.container;var f=d.getElemID();var g=a.getByParentID(f,e.loadingID);if(g.length>0){g.hide();if(d[0].uiposition!=undefined){d.css("position",d[0].uiposition)}}d.zIndexHack(true,e.excludeSelector);return g},remove:function(d){var e=a.uiLoading.hide(d);e.remove();e=null}};a.uiLoading.defaults={container:a("body"),excludeSelector:null,delay:200,loadingID:"loading",width:120,height:30,text:"",zIndex:888};var b=function(f){var e=f.container;e.setElemID();var h=e.getElemID();var i=a.getByParentID(h,f.loadingID);if(i.length>0){}else{i=a('
            ').appendTo(f.container).attr("id",a.getIDByParentID(h,f.loadingID)).hide();if(e[0].tagName=="BODY"){i.css({top:0,left:0})}var d=a.uiMask.add({container:i,zIndex:f.zIndex});var g=a(a.uiTemplate.loading).appendTo(i).css({width:f.width,height:f.height,zIndex:parseInt(d.css("zIndex"))+1});if(f.text!=""){g.find("span.ui_loading_text").html(f.text)}a(window).bind("resize",function(){if(d.is(":visible")){var j=i.find(".ui_loading_content");j.uiPosition({horizontal:"center",vertical:"center",container:i})}})}i.hide();return i};var c=function(e){var d=e.container;var g=b(e);if(d.css("position")!="relative"&&d.css("position")!="absolute"){d[0].uiposition=d.css("position");d.css("position","absolute")}g.css({width:d.width()<=10?"100%":d.width(),height:d.height()<=10?"100%":d.height()});var f=g.find(".ui_loading_content");f.css({width:e.width,height:e.height});if(e.text!=""){f.find("span.ui_loading_text").html(e.text)}setTimeout(function(){f.uiPosition({horizontal:"center",vertical:"center",container:g});f=null},0);g.children(".ui_mask").show();g.show();d.zIndexHack(false,e.excludeSelector)}})(jQuery);(function(b){var c="droppable";b.fn.droppable=function(d,e){if(this.length>0&&typeof d=="string"){return b.fn.droppable.methods[d](this.fire(),e)}return this.each(function(){var f=b(this);var g=f.data(c);d=d||{};if(g){b.extend(g.options,d)}else{a(f);f.data(c,{options:b.extend({},b.fn.droppable.defaults,f.parseUIConfig(),d)})}})};b.fn.droppable.methods={options:function(d){return b.data(d[0],c).options},enable:function(d){return d.each(function(){b(this).droppable({disabled:false})})},disable:function(d){return d.each(function(){b(this).droppable({disabled:true})})}};b.fn.droppable.defaults={accept:null,disabled:false,onDragEnter:function(f,d){},onDragOver:function(f,d){},onDragLeave:function(f,d){},onDrop:function(f,d){}};var a=function(e){var d=e.data(c);e.addClass("droppable").bind("_dragenter",function(g,f){d.onDragEnter.apply(this,[g,f])}).bind("_dragleave",function(g,f){d.onDragLeave.apply(this,[g,f])}).bind("_dragover",function(g,f){d.onDragOver.apply(this,[g,f])}).bind("_drop",function(g,f){d.onDrop.apply(this,[g,f])})}})(jQuery);(function(g){var j="draggable";g.fn.draggable=function(k,l){if(typeof k=="string"){return g.fn.draggable.methods[k](this,l)}return this.each(function(){var o=g(this);var m=o.data(j);var n;k=k||{};if(m){m.handle.unbind(".draggable");n=g.extend(m.options,k)}else{n=g.extend({},g.fn.draggable.defaults,o.parseUIConfig(),k)}var p=n.handle?(typeof n.handle=="string"?g(n.handle,o):n.handle):o;o.data(j,{options:n,handle:p});if(n.disabled){o.css("cursor","");return}p.unbind(".draggable").bind("mouseover.draggable",{target:o},function(q){if(g.fn.draggable.isDragging){return}g("body").css("cursor",n.cursor)}).bind("mouseleave.draggable",{target:o},function(q){g("body").css("cursor","")}).bind("mousemove.draggable",{target:o},function(q){g.fn.draggable.mousemove=true}).bind("mousedown.draggable",{target:o},function(w){var x=w.data.target;var z=x.parent();var s=z.scrollLeft();var r=z.scrollTop();var v=x.position();var t=x.offset();var y=g(document);var u={startPosition:x.css("position"),startLeft:v.left+s,startTop:v.top+r,left:v.left,top:v.top,startX:w.pageX,startY:w.pageY,offsetWidth:(w.pageX-t.left),offsetHeight:(w.pageY-t.top),target:x,parent:z[0]};g.fn.draggable.mousedown=true;g.extend(w.data,u);var q=x.data(j).options;if(q.onBeforeDrag.call(x,w)==false){return}y.bind("mousedown.draggable",w.data,i);y.bind("mousemove.draggable",w.data,a);y.bind("mouseup.draggable",w.data,e);g.fn.draggable.timer=setTimeout(function(){g.fn.draggable.isDragging=true;i(w)},q.delay);return false})})};g.fn.draggable.isDragging=false;g.fn.draggable.methods={options:function(k){return g.data(k[0],j).options},proxy:function(k){return g.data(k[0],j).proxy},enable:function(k){return k.draggable({disabled:false})},disable:function(k){return k.draggable({disabled:true})}};g.fn.draggable.defaults={proxy:null,cursor:"move",delay:100,revert:false,deltaX:null,deltaY:null,handle:null,disabled:false,edge:0,axis:"vh",onBeforeDrag:function(k){},onStartDrag:function(k){},onDrag:function(k){},onStopDrag:function(k){}};var i=function(o){if(!g.fn.draggable.isDragging){return false}var n=o.data.target;var m=n.data(j);var l=m.options;m.droppables=g(".droppable").filter(function(){return n!=this}).filter(function(){var p=g.data(this[0],"draggable").options.accept;if(p){return g(p).filter(function(){return this==n}).length>0}else{return true}});var k=m.proxy;if(!k){if(l.proxy){if(l.proxy=="clone"){k=g(n).clone().insertAfter(n)}else{k=l.proxy.call(n,n)}m.proxy=k}else{k=g(n)}}k.css("position","absolute");d(o);b(o);l.onStartDrag.call(n,o);return false};var a=function(m){if(!g.fn.draggable.isDragging){return false}var l=g.data(m.data.target[0],j);d(m);if(l.options.onDrag.call(m.data.target,m)!=false){b(m)}var k=m.data.target;l.droppables.each(function(){var o=g(this);if(o.droppable("options").disabled){return}var n=o.offset();if(m.pageX>n.left&&m.pageXn.top&&m.pageYp.left&&n.pageXp.top&&n.pageYo.top&&r.pageYo.top+u-m){n+="s"}}if(r.pageX>o.left&&r.pageXo.left+l-m){n+="e"}}var t=k.handles.split(",");for(var p=0;p-1&&m.horizontal=="right"){f-=20}if(!e&&k.indexOf("y")>-1&&m.vertical=="bottom"){j-=20}if(m.fixed){if(_IEunder6){var c=g[0].style;c.position="absolute";c.removeExpression("left");c.removeExpression("top");if(e){c.setExpression("left","eval(document.documentElement.scrollLeft + "+f+') +"px"');c.setExpression("top","eval(document.documentElement.scrollTop + "+j+') +"px"')}else{c.setExpression("left","eval(this.parentNode.scrollLeft + "+f+') +"px"');c.setExpression("top","eval(this.parentNode.scrollTop + "+j+') +"px"')}}else{var i=d.position();j+=i.top;f+=i.left;g.css({position:"fixed",left:f,top:j})}}else{if(e){j+=b(document).scrollTop();f+=b(document).scrollLeft()}else{j+=d.scrollTop();f+=d.scrollLeft()}g.css({position:"absolute",left:f,top:j})}return g}})(jQuery);(function(d){var g="uiButton";d.fn.uiButton=function(h,i){if(typeof h=="string"){return d.fn.uiButton.methods[h](this,i)}return this.each(function(){var j=d(this);var k=j.data(g);h=h||{};if(k){d.extend(k.options,h)}else{j.data(g,{options:d.extend({},d.fn.uiButton.defaults,j.parseUIConfig(),h)})}c(j)})};d.fn.uiButton.methods={options:function(h){return d.data(h[0],g).options},setStyle:function(i,h){e(i,h)},setLabel:function(h,i){b(h,i)},getLabel:function(h){return d.data(h[0],g).options.label},setIcons:function(i,h){f(i,h)},enable:function(h){a(h,false);return h},disable:function(h){a(h,true);return h},setDisabled:function(i,h){a(i,!!h);return i}};d.fn.uiButton.defaults={id:"",icons:{left:"",right:""},fontIcon:{left:{},right:{}},label:"",style:"button",disabled:false,onClick:function(){}};var c=function(k){var h=d.data(k[0],g).options;var j=k.contents();h.id=h.id||k[0].id;k.attr("id",h.id);if(_IEunder7){k.attr("hidefocus",true)}if(h.onClick){k.unbind("."+g).bind("click."+g,h.onClick)}if(j.length==0){if(h.label){d(''+h.label+"").appendTo(k)}}else{var i=k.find("span.btnLabel");if(i.length>0){h.label=i.html()}else{h.label=k.text();if(h.label){k.wrapInner('')}}}f(k,h.icons,h.fontIcon);a(k,h.disabled);return k};var b=function(j,k){var h=d.data(j[0],g).options;h.label=k;var i=j.find("span.btnLabel");i.html(k)};var f=function(m,k,l){l=l||{};var i=d.data(m[0],g).options;if(k||l){var j=m.find("span.btnLabel");var h="";if(i.disabled){h=" iconDisabled"}function n(s){var q,p,t,r;if(s=="left"){q=k.left;p=l.left;t=i.icons.left;r=i.fontIcon.left}else{if(s=="right"){q=k.right;p=l.right;t=i.icons.right;r=i.fontIcon.right}}if(q||p){var o=m.find("span.icon_"+s);if(o.length>0){o.removeClass().addClass("icon_"+s+" "+h)}else{var o=d('');if(j.length>0){if(s=="left"){j.before(o)}else{if(s=="right"){j.after(o)}}}else{m.append(o)}}if(p&&p.icon&&!_IEunder6){r.size=p.size||16;r.color=p.color||"inherit";o.addClass("fa").addClass(p.icon).css({fontSize:r.size,color:r.color})}else{if(q){t=q;o.addClass("icon "+q)}}}}n("left");n("right")}};var a=function(l,j){var i=d.data(l[0],g).options;var h=l.find("span.icon_left");var k=l.find("span.icon_right");if(j||l.attr("disabled")=="disabled"){i.disabled=true;l.attr("disabled",true);h.addClass("iconDisabled");k.addClass("iconDisabled")}if(!j){i.disabled=false;l.attr("disabled",false);h.removeClass("iconDisabled");k.removeClass("iconDisabled")}e(l,i.style)};var e=function(k,j){var h=d.data(k[0],g).options;var i=h.disabled;if(i){k.removeClass().addClass("button button_disabled")}else{if(j){h.style=j;if(j=="button"){k.removeClass().addClass("button")}else{k.removeClass().addClass("button "+j)}}}if(!k.is("button")){k.addClass("buttonHack")}}})(jQuery);(function(c){var d="uiButtonBar";c.fn.uiButtonBar=function(e,f){if(typeof e=="string"){return c.fn.uiButtonBar.methods[e](this,f)}return this.each(function(){var h=c(this);var g=h.data(d);e=e||{};if(g){c.extend(g.options,e)}else{h.data(d,{options:c.extend({},c.fn.uiButtonBar.defaults,h.parseUIConfig(),e)})}b(h)})};c.fn.uiButtonBar.methods={options:function(e){return c.data(e[0],d).options},enable:function(e){a(e,false);return e},disable:function(e){a(e,true);return e}};c.fn.uiButtonBar.defaults={backgroundColor:"",buttonBorder:false,width:null,height:null,direction:"left",disabled:false};var b=function(h){var e=c.data(h[0],d).options;var g=c(h);if(e.width){g.width(e.width)}if(e.height){g.height(e.height)}else{e.height=g.height()}if(e.direction){g.css("text-align",e.direction)}g.addClass("buttonbar");if(e.backgroundColor!=""){g.css("background-color",e.backgroundColor)}var f=h.find("button");f.each(function(k,j){var l=c(j);var i=c.fn.parseUIConfig(l);if(l.attr("id")||i.id){}else{l.attr("id",g.attr("id")+"_"+k)}if(c.fn.uiButton){if(!e.buttonBorder){l.css("border","none")}l.uiButton(i)}});return h};var a=function(h,g){var e=c.data(h[0],d).options;var f=h.find("button");if(g||h.attr("disabled")=="disabled"){e.disabled=true;f.each(function(j,i){var k=c(i);k.uiButton("disable");k.addClass("button_dis")})}else{e.disabled=false;f.each(function(j,i){var k=c(i);k.uiButton("enable")})}}})(jQuery);(function(d){var n="uiMenu";d.fn.uiMenu=function(p,q){if(typeof p=="string"){return d.fn.uiMenu.methods[p](this,q)}return this.each(function(){var s=d(this);var r=s.data(n);p=p||{};if(r){d.extend(r.options,p)}else{s.data(n,{options:d.extend({},d.fn.uiMenu.defaults,s.parseUIConfig(),p)})}k(s)})};d.fn.uiMenu.methods={options:function(p){return d.data(p[0],n).options},show:function(q,p){return g(q,p)},hide:function(p){return b({data:p})},disableItem:function(p,q){return c(p,q)},enableItem:function(p,q){return i(p,q)},destroy:function(){return m()}};d.fn.uiMenu.defaults={contextMenu:false,maxWidth:200,minWidth:100,dataSource:"local",onSelect:function(q,p){}};var k=function(q){var p=d.data(q[0],n).options;q.setElemID();q.css({minWidth:p.minWidth,maxWidth:p.maxWidth});if(_IEunder6){q.css("width",p.minWidth)}if(_IE&&webUI_browser().version==7){q.css("width",p.maxWidth)}o(q);return q};var o=function(s){var q=d.data(s[0],n).options;var r=q.dataSource;s.addClass("ui_menu-container ui_menu-content");s.css("position","absolute");if(r){if(r!="local"){if(typeof r=="string"){h(s,r)}else{if(typeof r=="object"){s.append(a(s,r));j(s)}}}else{var p=s.children("ul").addClass("ui_menu");f(s,p);j(s)}}};var g=function(t,q){var y=d.data(t[0],n).options;var u,r;var x;if(q.triggerObject){x=q.triggerObject;y.triggerData=q.triggerData}else{x=q}var s=d(x).offset();if(y.contextMenu){y.triggerObject=x.target;u=x.pageY;r=x.pageX;x.preventDefault();x.stopPropagation();x.cancelBubble=true}else{var w=parseInt(d(x).css("borderBottomWidth"));u=s.top+d(x).height()+(w!="NaN"?w:0)+1;r=s.left+1}var v=t.parent();while(v.css("position")=="static"&&v[0].nodeName!="BODY"){v=v.parent()}u-=v.offset().top;r-=v.offset().left;t.children("ul.ui_menu").show();var p=t.width()*0.7;t.children("ul.ui_menu").children().each(function(A,z){var C=d(z);var B=C.find("span:first");if(B.hasClass("ui_menu-item-sep")){B.width("98%")}else{if(B.width()>p){B.width(C.attr("aria-haspopup")?p-15:p)}}});if((r+t.outerWidth())>document.documentElement.clientWidth){r=r-t.outerWidth()-5}if((u+t.outerHeight())>document.documentElement.clientHeight){u=u-t.outerHeight()-5}t.css({top:u,left:r}).show();d(document).bind("mousedown.uiMenu",t,b);return t};var c=function(p,q){p.find("#"+q).addClass("ui_menu-disabled").unbind(".menuItem");return p};var i=function(q,r){var p=q.find("#"+r);p.removeClass("ui_menu-disabled");e(q,p);return q};var m=function(){var q=d(document),p;while(p=this.globalEvent.pop()){q.unbind(".uiMenu",p)}};var h=function(q,p){d.ajax({url:p,method:"GET",dataType:"json",showLoading:false,success:function(r){q.append(a(q,r));j(q);return false}})};var a=function(w,u,q){var p=[];var s=(q==undefined)?"ui_menu":"ui_menu-content";var v=(q==undefined)?"block":"none";var r="ui_menu-icon";p.push('
              ');var t=[];d(u).each(function(x,z){var y=w.getElemID()+"_"+z.id;function A(){var B=[];if(z.icon||z.fontIcon){if(z.fontIcon&&!_IEunder6){z.fontIcon.size=z.fontIcon.size||16;z.fontIcon.color=z.fontIcon.color||"inherit";B.push('')}else{B.push('')}B.push(''+z.label+"")}else{B.push(''+z.label+"")}return B.join("")}if(z.children!=null){if(z.disabled===true||z.disabled=="true"){t.push('
            • ')}else{t.push('
            • ')}t.push('');t.push(A());t.push('');t.push("");t.push(a(w,z.children,x++));t.push("
            • ")}else{if(z.disabled===true||z.disabled=="true"){t.push('
            • ')}else{t.push('
            • ')}t.push('');t.push(A());t.push("");t.push("
            • ")}if(z.seperator=="true"||z.seperator==true){t.push('
            •  
            • ')}d.data(w[0],y,z)});p.push(t.join(""));p.push("
            ");return p.join("")};var f=function(v,s){if(s.parent().attr("aria-haspopup")=="true"){s.addClass("ui_menu-content")}s.css("display","none");var z=s.children();for(var t=0;t');var y="ui_menu-icon";if(q.icon||q.fontIcon){if(q.fontIcon&&!_IEunder6){q.fontIcon.size=q.fontIcon.size||16;q.fontIcon.color=q.fontIcon.color||"inherit";u.push('')}else{u.push('')}u.push(''+w+"")}else{u.push(''+w+"")}if(r.length>0){x.attr("aria-haspopup","true");u.push('');f(v,r)}u.push("");x.prepend(u.join(""))}};var l=function(s,p){var q=d.data(s[0],n).options;if(p&&p.length>0){var t=p.children("ul").eq(0);var r=p.width();if((2*r+p.offset().left)>document.documentElement.clientWidth){r=-r}t.css({minWidth:q.minWidth,left:r});t.show();t.children().each(function(v,u){var w=d(this);if(w.find("span:first").hasClass("ui_menu-item-sep")){w.find("span:first").width("98%")}else{if(t.width()>q.maxWidth){t.width(q.maxWidth)}else{if(t.attr("hasShow")==undefined){t.width(t.find("li:eq(0)>a:eq(0)").width()+15);t.attr("hasShow",true)}}w.find("span.ui_menu-text").width(w.width()-45)}})}};var e=function(t,p){var q=d.data(t[0],n).options;var s=d(p);var r=d.data(t[0],s[0].id);s.unbind(".menuItem").bind("mouseenter.menuItem",function(){var u=d(this);var v=u.parent().width();u.addClass("ui_menu-item-hover");if(_IE&&webUI_browser().version==9){u.parent().width(v)}if(u.attr("aria-haspopup")){setTimeout(function(){l(t,u)},200)}}).bind("mouseleave.menuItem",function(){var u=d(this);u.removeClass("ui_menu-item-hover");setTimeout(function(){u.children("ul").hide()},200)}).bind("click.menuItem",function(u){if(q.onSelect){q.onSelect.call(t,r,u)}u.stopPropagation()})};var j=function(t){var s=t.find("ul"),q=t.find("li");for(var r=0;r0){C.css("zIndex",y.zIndex)}o(C);if(y.closed==true){f(C,true,true)}else{e(C)}return C};var h=function(A){var y=g.data(A[0],u).options;var x=A.getElemID();var C=g.getByParentID(x,g.uiTemplate.panel.header);var z=g.getByParentID(x,g.uiTemplate.panel.icon);var B=g.getByParentID(x,g.uiTemplate.panel.title);if(!y.showHeader){C.remove()}else{z.removeClass();if(y.fontIcon&&!_IEunder6){y.fontIcon.size=y.fontIcon.size||16;y.fontIcon.color=y.fontIcon.color||"inherit";z.addClass("ui_panel_fontIcon fa").addClass(y.fontIcon.icon).css({color:y.fontIcon.color,fontSize:y.fontIcon.size})}else{if(y.icon){if(y.icon.indexOf(".")>0){z.addClass("icon ui_panel_icon").html("")}else{z.addClass("icon ui_panel_icon "+g.uiTemplate.iconStyle_Pre+y.icon)}}else{z.hide()}}if(y.showTitle){if(y.title){B.html(y.title)}else{B.hide()}}else{B.remove()}}};var o=function(E){var A=g.data(E[0],u).options;var z=E.getElemID();var x=g.getByParentID(z,g.uiTemplate.panel.buttonbar);if(x.length>0&&A.showBtnBar){var D=A.buttons;if(D.length>0){for(var C=0;C').appendTo(x);B.uiButton(y)}}x.uiButtonBar({direction:A.btnBarDir,height:28,buttonBorder:true})}else{x.remove()}};var d=function(B,z){z=z===undefined?false:z;var y=g.data(B[0],u).options;var x=B.getElemID();var A=g.getByParentID(x,g.uiTemplate.panel.content);if(y.padding!=""){A.css("padding",y.padding)}y.onBeforeLoad.call(B);if(!z&&g.trim(A.html())!=""){A.addClass("overflowAuto")}else{if(y.url!=""){if(z){m(B)}}else{A.addClass("overflowAuto");if(y.content){A.append(y.content)}y.onLoadComplete.call(B);y.onOpen.call(B)}}};var m=function(C){var F=g.data(C[0],u).options;var z=C.getElemID();var E="#"+z;var D=g.getByParentID(z,g.uiTemplate.panel.content);var y=F.url;if(F.urlRandomParam){y=g.urlAddRandom(F.url)}if(F.iniframe){D.removeClass("overflowAuto");var B=g.getByParentID(z,"iframe");var A=g.param(F.queryParams);if(A){y+=/\?/.test(y)?"&":"?"+A}if(F.showLoading){g.uiLoading.show({container:C,loadingID:v,excludeSelector:E})}if(B.length>0){B[0].src=y}else{var x=g.getIDByParentID(z,"iframe");B=g('');B.load(function(){F.onLoadComplete.call(C);F.onOpen.call(C);if(F.showLoading){g.uiLoading.hide({container:C,loadingID:v,excludeSelector:E})}}).appendTo(D)}}else{D.addClass("overflowAuto");g.ajax({type:F.method,url:y,cache:true,showLoading:false,data:F.queryParams,dataType:"html",success:function(G){D.empty();D.append(G);return false},complete:function(){F.onLoadComplete.call(C);F.onOpen.call(C)},error:function(G){if(F.onLoadError.apply(C,arguments)!==false){D.append(G.responseText)}return false}})}};var c=function(C){var A=g.data(C[0],u).options;if(A.resizable){var y=C.getElemID();var x=g.getByParentID(y,g.uiTemplate.panel.buttonbar);var B=g.getByParentID(y,g.uiTemplate.panel.content);var D=g.getByParentID(y,g.uiTemplate.panel.header);var z=g('
            ').setIDByParentID(y,g.uiTemplate.panel.resizeHand).appendTo(C).css({zIndex:parseInt(C.css("zIndex"))+1,position:"absolute",right:0,bottom:0});C.resizable({minWidth:g.parseWH("minWidth",A.minWidth,C.parent()),minHeight:g.parseWH("minHeight",A.minHeight,C.parent()),onStartResize:function(){C.addClass("ui_panel_proxy");B.height(0)},onResize:function(){},onStopResize:function(G){C.removeClass("ui_panel_proxy");var I=C.position();A.top=I.top;A.left=I.left;A.width=C.width();A.height=C.height();if(A.inContainer){var H=G.data;var E=g(H.target);var F=g(H.parent);if(H.left+E.outerWidth()>F.width()){A.width=F.width()-H.left}if(H.top+E.outerHeight()>F.height()){A.height=F.height()-H.top}}j(C);return false}})}};var a=function(z){var y=g.data(z[0],u).options;var x=z.getElemID();var B=g.getByParentID(x,g.uiTemplate.panel.header);var A=g.getByParentID(x,g.uiTemplate.panel.title);if(y.draggable){if(!y.dragHandle){if(y.showHeader){y.dragHandle=A}}z.draggable({handle:y.dragHandle,proxy:function(C){var D=g('
            ');D.appendTo("body");return D},onStartDrag:function(){z.hide()},onStopDrag:function(C){if(y.inContainer){var D=C.data;if(D.left<0){D.left=0}if(D.top<0){D.top=0}if(D.left+g(D.target).outerWidth()>g(D.parent).width()){D.left=g(D.parent).width()-g(D.target).outerWidth()}if(D.top+g(D.target).outerHeight()>g(D.parent).height()){D.top=g(D.parent).height()-g(D.target).outerHeight()}z.css({left:D.left,top:D.top})}y.top=parseInt(z.css("top"));y.left=parseInt(z.css("left"));z.show()}})}};var p=function(B){var z=g.data(B[0],u).options;var y=B.getElemID();var x=g.getByParentID(y,g.uiTemplate.panel.btnMax);var A=g.getByParentID(y,g.uiTemplate.panel.toolbar);var C=g.getByParentID(y,g.uiTemplate.panel.header);if(z.maximizable){if(x.length>0){x.show()}else{x=g('').setIDByParentID(y,g.uiTemplate.panel.btnMax).appendTo(A)}x.unbind("click.panel").bind("click.panel",function(D){if(z.maximized){z.maximized=false;r(B,false)}else{z.maximized=true;r(B,true)}j(B);D.stopPropagation()});C.unbind("dblclick").bind("dblclick",function(D){x.click();D.stopPropagation()})}else{if(x.length>0){x.hide()}}};var r=function(C,B){var z=g.data(C[0],u).options;var x=C.getElemID();if(z.maximizable){var A=g.getByParentID(x,g.uiTemplate.panel.btnMax_Icon);var y=g.getByParentID(x,g.uiTemplate.panel.resizeHand);if(B){A.removeClass("icon_pal_max").addClass("icon_pal_min");if(z.draggable){C.draggable("disable")}if(z.resizable){C.resizable("disable");y.hide()}}else{A.removeClass("icon_pal_min").addClass("icon_pal_max");if(z.draggable){C.draggable("enable")}if(z.resizable){C.resizable("disable");C.resizable("enable");y.show()}}}};var n=function(A){var y=g.data(A[0],u).options;var x=A.getElemID();var B=g.getByParentID(x,g.uiTemplate.panel.btnClose);var z=g.getByParentID(x,g.uiTemplate.panel.toolbar);if(y.closable){if(B.length>0){B.show()}else{B=g('').setIDByParentID(x,g.uiTemplate.panel.btnClose).appendTo(z)}B.unbind("click").bind("click",function(C){f(A);C.stopPropagation()})}else{if(B.length>0){B.hide()}}};var s=function(A){var F=g.data(A[0],u).options;var y=A.getElemID();var B=g.getByParentID(y,g.uiTemplate.panel.btnColl);var D=g.getByParentID(y,g.uiTemplate.panel.toolbar);var z=g.getByParentID(y,g.uiTemplate.panel.header);if(F.collapsible){if(B.length>0){B.show()}else{var C="icon_pal_col";var x="收缩";if(F.collapsed){C="icon_pal_exp";x="展开"}B=g('').setIDByParentID(y,g.uiTemplate.panel.btnColl).appendTo(D)}var E=g.getByParentID(y,g.uiTemplate.panel.btnColl_Icon);B.unbind("click.panel").bind("click.panel",function(G){if(F.collapsed){E.removeClass("icon_pal_exp").addClass("icon_pal_col").attr("title","收缩");l(A,false)}else{E.removeClass("icon_pal_col").addClass("icon_pal_exp").attr("title","展开");b(A,false)}G.stopPropagation()});z.unbind("click").bind("click",function(G){B.click()})}else{if(B.length>0){B.remove()}}};var j=function(B){var z=B.getElemID();var A=g.getByParentID(z,g.uiTemplate.panel.header);var E=g.getByParentID(z,g.uiTemplate.panel.icon);var F=g.getByParentID(z,g.uiTemplate.panel.title);var C=g.getByParentID(z,g.uiTemplate.panel.content);var J=g.getByParentID(z,g.uiTemplate.panel.buttonbar);var G=g.getByParentID(z,g.uiTemplate.panel.toolbar);var K=g.data(B[0],u).options;q(B,K.border,K.borderWidth);var H=B.parent();if(K.maximized){var D={left:0,top:0};D.left=H.scrollLeft();D.top=H.scrollTop();B.outerWidth(H.width()-K.maxPadding[1]-K.maxPadding[3]);B.outerHeight(H.height()-K.maxPadding[0]-K.maxPadding[2]);B.css("top",K.maxPadding[0]+D.top);B.css("left",K.maxPadding[1]+D.left)}else{if(K.top){B.css("top",K.top)}if(K.left){B.css("left",K.left)}if(K.autoFit){B.autoFit(true,false)}else{B.autoFit(false);K.width=g.parseWH("width",K.width,H);K.minWidth=g.parseWH("minWidth",K.minWidth,H);K.height=g.parseWH("height",K.height,H);K.minHeight=g.parseWH("minHeight",K.minHeight,H);var y=Math.max(Math.max(K.width,0),K.minWidth||0);var I=Math.max(Math.max(K.height,0),K.minHeight||0);B.outerWidth(y);if(!K.collapsed){B.outerHeight(I)}}}var x=B.height();if(A.length>0){x-=A.outerHeight()}if(J.length>0&&K.showBtnBar){x-=J.outerHeight()}C.outerHeight(x);C.outerWidth(B.width());w(C);K.onPanelResize.call(B)};var e=function(C,A){var y=g.data(C[0],u).options;var x=C.getElemID();var B=g.getByParentID(x,g.uiTemplate.panel.content);if(A!=true){if(y.onBeforeOpen.call(C)==false){return}}y.closed=false;C.show();C.attr("closed",false);B.attr("closed",false);if(y.firstLoad){h(C);a(C);c(C);p(C);n(C);s(C);if(y.maximized){j(C);r(C,true)}else{j(C)}d(C,true);if(y.collapsed){var z=g.getByParentID(x,g.uiTemplate.panel.btnColl_Icon);y.collapsed=false;z.removeClass("icon_pal_col").addClass("icon_pal_exp").attr("title","展开");b(C,false)}C.bind("_resize",function(){if(C.attr("closed")!=="true"&&y.maximized){j(C)}});y.firstLoad=false}else{C.width(y.tempWidth).height(y.tempHeight);if(y.url!=""&&y.updateOnOpen){m(C)}else{y.onOpen.call(C)}}if(y.animate){C.removeClass("animated "+y.animateClose).addClass("animated "+y.animateOpen+" fast")}};var f=function(C,B,D){var z=g.data(C[0],u).options;var y=C.getElemID();if(z.closed){return}var A=g.getByParentID(y,g.uiTemplate.panel.content);if(B!=true){if(z.onBeforeClose.call(C)==false){return}}C.attr("closed",true);A.attr("closed",true);if(D){C.hide();return C}z.closed=true;var x=C.height();if(x>0){z.tempWidth=C.width();z.tempHeight=C.height()}if(z.animate){C.removeClass("animated "+z.animateOpen).addClass("animated "+z.animateClose+" fast");setTimeout(function(){C.width(0).height(0);z.onClose.call(C)},500)}else{C.width(0).height(0);z.onClose.call(C)}return C};var t=function(A,z){var x=g.data(A[0],u).options;if(z!=true){if(x.onBeforeDestroy.call(A)==false){return}}var y=A.uiPanel(g.uiTemplate.panel.content);y.destroyIframe();A.remove();x.onDestroy.call(A)};var q=function(z,x,y){if(x){z.css("borderWidth",y)}else{z.css("borderWidth",0)}};var b=function(B,y){var z=g.data(B[0],u).options;var x=B.getElemID();var C=g.getByParentID(x,g.uiTemplate.panel.header);var A=g.getByParentID(x,g.uiTemplate.panel.content);if(z.collapsed==true){return}A.stop(true,true);if(z.onBeforeCollapse.call(B)==false){return}if(y==true){B.animate({height:C.outerHeight()},"fast",function(){i(B,z,true);z.onCollapse.call(B)})}else{B.outerHeight(C.outerHeight());i(B,z,true);z.onCollapse.call(B)}};var l=function(B,y){var z=g.data(B[0],u).options;var x=B.getElemID();var A=g.getByParentID(x,g.uiTemplate.panel.content);if(z.collapsed==false){return}A.stop(true,true);if(z.onBeforeExpand.call(B)==false){return}if(y==true){B.animate({height:z.height},"fast",function(){z.collapsed=false;z.onExpand.call(B)})}else{B.outerHeight(z.height);i(B,z,false);z.onExpand.call(B)}};var i=function(D,A,B){var y=D.getElemID();var C=g.getByParentID(y,g.uiTemplate.panel.content);var x=g.getByParentID(y,g.uiTemplate.panel.buttonbar);var z=g.getByParentID(y,g.uiTemplate.panel.resizeHand);var E=C.find("OBJECT,IFRAME").length;if(B){x.hide();z.hide();if(E==0){C.hide()}else{C.width(0).height(0)}C.attr("closed",true);A.collapsed=true}else{x.show();z.show();if(E==0){C.show()}C.attr("closed",false);C.autoFit(true,false);A.collapsed=false;w(C)}};var w=function(x){x.children().each(function(){var y=g(this);y.triggerHandler("_resize")})}})(jQuery);(function(b){b.uiMessagetip={show:function(d,e){d=d||{};d=b.extend({},b.uiMessagetip.defaults,d);d.title=d.title||"提示";c(d)}};b.uiMessagetip.defaults={panelStyle:"ui_panel_primary",showHeader:true,title:"",content:"",width:200,height:120,padding:0,animate:true,fixed:true,container:b(document.body),vertical:"bottom",horizontal:"right",timeout:3000,onClose:function(){},zIndex:99999};var a=function(d,e){e?e():jQuery.noop();d.remove()};var c=function(m){var l=m.onClose;var e=b("
            ").appendTo(m.container).hide();var h=m.width||200;var f=m.height||120;var n='
            ";if(b.fn.uiPanel){e.uiPanel({zIndex:m.zIndex,icon:"messagebox",width:h,height:f,closable:true,showHeader:m.showHeader,title:m.title,content:n,onClose:function(){a(e,l)}})}e.addClass(m.panelStyle+" ui_messagetip");if(!m.showHeader){var g=e.uiPanel("content");var i=b('').setIDByParentID(e[0].id,b.uiTemplate.panel.btnClose).appendTo(g);i.bind("click",function(){e.uiPanel("close")});switch(m.panelStyle){case"ui_panel_primary":g.addClass("content_primary");break;case"ui_panel_success":g.addClass("content_success");break;case"ui_panel_info":g.addClass("content_info");break;case"ui_panel_warning":g.addClass("content_warning");break;case"ui_panel_danger":g.addClass("content_danger");break}}e.bind("keydown.messagebox",function(o){if(o.which==b.keyCode.ESCAPE){a(e,l)}}).hide();if(!m.animate||(_IE&&_IEunder6)){e.uiPosition({horizontal:m.horizontal,vertical:m.vertical,container:m.container,fixed:m.fixed}).show()}else{switch(m.vertical){case"top":e.uiPosition({horizontal:m.horizontal,vertical:m.vertical,container:m.container,fixed:m.fixed}).show();var k=parseInt(e.css("top"))+m.padding;e.css({top:k-e.height(),opacity:0});if(m.horizontal=="left"){e.animate({top:k,left:m.padding,opacity:1},600)}else{e.animate({top:k,right:m.padding,opacity:1},600)}break;case"center":e.uiPosition({horizontal:m.horizontal,vertical:m.vertical,container:m.container,fixed:m.fixed}).fadeIn();break;case"bottom":e.uiPosition({horizontal:m.horizontal,vertical:m.vertical,container:m.container,fixed:m.fixed}).show();var k=parseInt(e.css("top"))-m.padding;e.css({top:k+e.height(),opacity:0});if(m.horizontal=="left"){e.animate({top:k,left:m.padding,opacity:1},600)}else{e.animate({top:k,right:m.padding,opacity:1},600)}break}}var d;function j(o){d=setInterval(function(){if(!m.animate||(_IE&&_IEunder6)){a(e,l)}else{switch(m.vertical){case"top":var p=parseInt(e.css("top"));e.animate({top:p-e.height(),opacity:0},function(){a(e,l)});break;case"center":e.fadeOut(function(){a(e,l)});break;case"bottom":var p=parseInt(e.css("top"));e.animate({top:p+e.height(),opacity:0},function(){a(e,l)});break}}clearInterval(d)},o)}if(m.timeout>0){j(m.timeout)}e.bind("mouseover",function(){clearInterval(d)}).bind("mouseout",function(){if(d){j(m.timeout)}});b(window).bind("resize",function(){if(e.width>0&&e.height>0){e.uiPosition({horizontal:m.horizontal,vertical:m.vertical,container:m.container,fixed:m.fixed})}})}})(jQuery);(function(b){b.uiMessagebox={alert:function(e,f){e=e||{};e=b.extend({},b.uiMessagebox.defaults,e);e.title=e.title||"提示";e.type=e.type||"alert";c(e)},confirm:function(e,f){e=e||{};e=b.extend({},b.uiMessagebox.defaults,e);e.title=e.title||"确认";e.type="confirm";c(e)},prompt:function(e,f){e=e||{};e=b.extend({},b.uiMessagebox.defaults,e);e.title=e.title||"请输入";e.type="prompt";c(e)}};b.uiMessagebox.defaults={type:"alert",title:"",maskID:"mask",content:"",animate:true,timeout:2000,container:b(document.body),width:null,height:null,draggable:false,maximizable:false,zIndex:889,onClose:function(){}};var d;var a=function(f,i,e,g,h){d&&clearInterval(d);d=null;g?g(h):jQuery.noop();i.remove();b.uiMask.remove({container:f.container,maskID:f.maskID})};var c=function(q){var e="msgBox_"+guidGenerator();q.maskID=e+"-"+q.maskID;var m=q.onClose;var r=b.uiMask.show({container:q.container,zIndex:q.zIndex,maskID:q.maskID});var p=b("");var o=b("");o.uiButton({onClick:function(){a(q,h,r,m,false)}});var k=0;var i=0;if(b.fn.uiButton){switch(q.type){case"confirm":k=q.width||300;i=q.height||100;p.uiButton({onClick:function(){a(q,h,r,m,true)}});break;case"prompt":k=q.width||250;i=q.height||120;p.uiButton({onClick:function(){var s=m?m(b("#"+g).val()):jQuery.noop();if(!s){h.remove();r.remove()}}});break;default:k=q.width||250;i=q.height||100;p.uiButton({onClick:function(){a(q,h,r,m,true)}});if(q.timeout>0&&q.type!="error"){l(q.timeout)}}}var n="";var g=guidGenerator();if(q.type=="prompt"){n='
            '}var j='
            '+q.content+n+"
            ";var h=b("
            ").appendTo(q.container).hide().uiPanel({id:e,zIndex:q.zIndex+1,icon:"messagebox",draggable:q.draggable,maximizable:q.maximizable,maxPadding:[10,10,10,10],showBtnBar:true,width:k,height:i,closable:true,title:q.title,content:j,onClose:function(){a(q,h,r,m,false)}});var f=h.uiPanel("buttonbar");p.appendTo(f);switch(q.type){case"alert":h.addClass("ui_panel_primary");break;case"success":h.addClass("ui_panel_success");p.addClass("button_success");break;case"error":h.addClass("ui_panel_danger");p.addClass("button_cancel");p.uiButton("setIcons",{left:"icon_close"});p.uiButton("setLabel","关闭");break;case"question":h.addClass("ui_panel_info");break;case"warning":h.addClass("ui_panel_warning");p.addClass("button_warning");break;case"confirm":h.addClass("ui_panel_primary");p.addClass("button_submit");o.appendTo(f);break;case"prompt":h.addClass("ui_panel_primary");p.addClass("button_submit");o.appendTo(f);break;default:h.addClass("ui_panel_primary");break}h.bind("keydown.messagebox",function(s){if(s.which==b.keyCode.ESCAPE){a(q,h,r,m,false)}}).fadeIn().uiPosition({horizontal:"center",vertical:"center",container:q.container,fixed:false});b(window).bind("resize",function(){if(r.is(":visible")){h.uiPosition({horizontal:"center",vertical:"center",container:q.container,fixed:q.fixed})}});function l(s){d&&clearInterval(d);d=setInterval(function(){if(!q.animate||_IEunder6){a(q,h,r,m,false)}else{h.fadeOut(function(){a(q,h,r,m,false)})}clearInterval(d);d=null},s)}h.bind("mouseover",function(){d&&clearInterval(d);d=null}).bind("mouseout",function(){if(q.timeout>0&&q.type!="error"){l(q.timeout)}});p.focus()}})(jQuery);(function(b){var c="uiDialog";b.fn.uiDialog=function(d,e){if(typeof d=="string"){return b.fn.uiDialog.methods[d](this,e)}return this.each(function(){var g=b(this);var f=g.data(c);d=d||{};if(f){b.extend(f.options,d)}else{g.data(c,{options:b.extend({},b.fn.uiDialog.defaults,b.fn.parseUIConfig(g,null),d)})}a(g)})};b.fn.uiDialog.methods=b.extend({},b.fn.uiPanel.methods,{open:function(h,f){f=f||{};var e=b.data(h[0],c).options;var d=h.uiPanel("options");var i="#"+h.attr("id");d=b.extend(d,f);if(d.maximized){h.width(d.width).height(d.height);g();d.left=parseInt(h.css("left"));d.top=parseInt(h.css("top"));h.uiPanel("open",d.forceOpen);g()}else{h.uiPanel("open",d.forceOpen);g();d.left=parseInt(h.css("left"));d.top=parseInt(h.css("top"))}function g(){h.uiPosition({horizontal:d.horizontal==undefined?"center":d.horizontal,vertical:d.vertical==undefined?"center":d.vertical,container:e.maskContainer,fixed:false})}return h},close:function(f,e){var d=b.data(f[0],c).options;var g="#"+f.attr("id");f.uiPanel("close",e);return f},buttonbar:function(e,d){_renderBtnbar(e,d);return e},button:function(e,d){return b("#"+d)},setUserParam:function(e,d){return e.each(function(){b.data(this,c).options.userParam=d})},getUserParam:function(f,e){var d=b.data(f[0],c).options;return d.userParam}});b.fn.uiDialog.defaults=b.extend({},b.fn.uiPanel.defaults,{panelStyle:"ui_panel",maxPadding:[15,15,15,15],draggable:true,resizable:true,closable:true,maximizable:true,mask:false,maskContainer:null,buttons:[],zIndex:888});var a=function(g){var l=b.data(g[0],c).options;var h=g.children();var e=false;var k=l.buttons.length;g.addClass("ui_dialog");if(l.maskContainer==null){l.maskContainer=g.parent()}if(k>0){e=true}var d="#"+g.attr("id");var j=g.getElemID()+"-dialog_mask";function i(){if(l.mask){b.uiMask.show({container:l.maskContainer,maskID:j,zIndex:l.zIndex-1,excludeSelector:d})}}function f(){if(l.mask){b.uiMask.hide({container:l.maskContainer,maskID:j,excludeSelector:d})}}g.uiPanel(b.extend({},l,{showBtnBar:e||l.showBtnBar,closed:true,content:h,onBeforeOpen:function(){l.onBeforeOpen.call(g);i()},onClose:function(){l.onClose.call(g);f()}}));b(window).bind("resize",function(){if(g.attr("closed")=="false"){g.uiPosition({horizontal:"center",vertical:"center",container:l.maskContainer})}});return g}})(jQuery);(function(f){var g="uiPagination";f.fn.uiPagination=function(h,i){if(this.length>0&&typeof h=="string"){return f.fn.uiPagination.methods[h](this.first(),i)}return this.each(function(){var k=f(this);var j=k.data(g);h=h||{};if(j){f.extend(j.options,h)}else{k.data(g,{options:f.extend({},f.fn.uiPagination.defaults,k.parseUIConfig(),h)})}e(k);b(k)})};f.fn.uiPagination.methods={options:function(h){return f.data(h[0],g).options},loading:function(h){d(h,true);return h},loaded:function(h){d(h,false);return h},refresh:function(i,h){b(i,h);return i},select:function(i,h){a(i,h);return i}};f.fn.uiPagination.defaults={total:0,pageSize:20,pageIndex:1,pageList:[10,20,30,50],loading:false,showPageList:true,showRefresh:true,displayMsg:"",beforePageText:"",afterPageText:"",onSelectPage:function(h,i){},onBeforeRefresh:function(h,i){},onRefresh:function(h,i){},onChangePageSize:function(h){}};var e=function(t){var h=f.data(t[0],g);var w=h.options;t.setElemID().addClass("ui_pagination");var j=t.getElemID();var n=new RegExp("({pageID})","g");t.html(f(f.uiTemplate.pagination.replace(n,j)).html());var q=f.getByParentID(j,"input");var k=f.getByParentID(j,"pagesize");var o=f.getByParentID(j,"first");var v=f.getByParentID(j,"prev");var l=f.getByParentID(j,"next");var s=f.getByParentID(j,"last");var r=f.getByParentID(j,"load");var u=f.getByParentID(j,"info");var m=f.getByParentID(j,"after");k.bind("change",function(){w.pageSize=parseInt(f(this).val());w.onChangePageSize.call(t,w.pageSize)});for(var p=0;p").text(w.pageList[p]).appendTo(k)}q.unbind(".pagination").bind("keydown.pagination",function(x){if(x.keyCode==f.keyCode.ENTER){var i=parseInt(f(this).val())||1;a(t,i);return false}});o.unbind(".pagination").bind("click.pagination",function(){if(o.attr("disabled")){return}a(t,1)});v.unbind(".pagination").bind("click.pagination",function(){if(v.attr("disabled")){return}if(w.pageIndex>1){a(t,w.pageIndex-1)}});l.unbind(".pagination").bind("click.pagination",function(){if(l.attr("disabled")){return}var i=Math.ceil(w.total/w.pageSize);if(w.pageIndexq){w.pageIndex=q}var p=f.getByParentID(j,"input");p.val(w.pageIndex);var t=f.getByParentID(j,"info");var v=w.displayMsg;v=v.replace(/{from}/,w.total==0?0:w.pageSize*(w.pageIndex-1)+1);v=v.replace(/{to}/,Math.min(w.pageSize*(w.pageIndex),w.total));v=v.replace(/{total}/,w.total);t.html(v);var m=f.getByParentID(j,"after");var o=w.afterPageText;o=o.replace(/{pages}/,Math.ceil(w.total/w.pageSize));m.html(o);var n=f.getByParentID(j,"first");var u=f.getByParentID(j,"prev");var l=f.getByParentID(j,"next");var r=f.getByParentID(j,"last");n.attr("disabled",(w.pageIndex==1));u.attr("disabled",(w.pageIndex==1));l.attr("disabled",(w.pageIndex==q));r.attr("disabled",(w.pageIndex==q));c(n);c(u);c(l);c(r);d(s,w.loading)};var d=function(k,l){var h=f.data(k[0],g);var j=h.options;j.loading=l;var i=f.getByParentID(k.getElemID(),"load");if(j.showRefresh&&i){if(j.loading){i.removeClass("ui_pagination_load").addClass("ui_pagination_loading")}else{i.removeClass("ui_pagination_loading").addClass("ui_pagination_load")}}};var c=function(h){if(h.attr("disabled")){h.addClass("iconDisabled")}else{h.removeClass("iconDisabled")}}})(jQuery);(function(f){var l="uiGrid";var m="idField";f.fn.uiGrid=function(n,o){if(this.length>0&&typeof n=="string"){return f.fn.uiGrid.methods[n](this.first(),o)}return this.each(function(){var r=f(this);var p=r.data(l);n=n||{};if(p){f.extend(p.options,n)}else{var q=f.extend(true,{},f.fn.uiGrid.defaults,r.parseUIConfig(),n);r.data(l,{options:q})}j(r)})};f.fn.uiGrid.methods={options:function(n){return f.data(n[0],l).options},gridData:function(n){return f.data(n[0],l).options.gridData},loadData:function(q,p){var o=f.data(q[0],l).options;f.extend(true,o,p);var r=q.uiPanel("content");var n=r.children(".grid_data");a(q,r,n)},setData:function(p,o){var q=p.uiPanel("content");var n=q.children(".grid_data");i(p,q,n,o);return p},toolbar:function(n){var o=n.uiPanel("content");return o.children(".grid_toolbar")},selectedData:function(s,r){var o=s.data(l).options;var q=o._selectedRows;var n=o._cacheData.rows;var p=[];if(q.length>0){f.each(q,function(t,u){if(!r){p[t]=n[u]}else{p[t]=n[u][r]}})}return p},getColumnStyle:function(p,o){var n=p.data(l).options;return n._colStyles[o]}};f.fn.uiGrid.defaults={onlyStyle:false,autoFit:false,colFit:false,colFitAllTime:false,gridTitleFix:false,border:true,icon:"",title:"",width:0,height:0,showHeader:true,loadMsg:"",localData:null,lazyLoad:false,idField:"id",method:"get",url:"",tpl_head:"",tpl_body:"",queryParams:{},defaultSortField:"",defaultOrder:"desc",paramSort:"orderField",paramOrder:"descended",paramPageIndex:"pageIndex",paramPageSize:"pageSize",pageIndex:1,pageSize:20,pageList:[20,40,50,100,200],onSelectRow:function(o,n){},autoSelectedOnLoad:false,multiSelect:true,colResizable:true,minColWidth:0,maxColWidth:1000,localSortable:false,_cacheData:{},_selectedRows:[],_colStyles:[],selectedIds:[],dataFilter:function(n){return n},onBeforeLoadData:function(){},onLoadDataError:function(){},onLoadDataSuccess:function(n){}};var j=function(r){var o=r.data(l).options;r.addClass("grid");var p=o.onlyStyle;var n=r.children("table.grid_data").wrap('
            ').parent();var q;var s;n.find("tbody tr:first-child").children().each(function(t){f(this).addClass("col_"+t)});o.tpl_head=f("thead",n).html();o.tpl_body=f("tbody",n).html();n.empty();q=r.children().detach();r.uiPanel({autoFit:o.autoFit,icon:o.icon,title:o.title,width:o.width,height:o.height,border:o.border,minWidth:0,minHeight:0,showHeader:o.showHeader,showBtnBar:false});s=r.uiPanel("content").append(q);f.uiLoading.add({container:s,text:o.loadMsg||f.uiLoading.defaults.text});if(!p){k(r)}b(s);d(r,s,n);h(r,n);c(r,n);a(r,s,n,true);r.bind("_resize",function(){var u=f(this);r.uiPanel("resize");var t=u.find("div.grid_data");c(u,t);e(u,t,u.data(l).options.colFitAllTime)});return r};var k=function(o){var n=o.data(l).options;n.tpl_body="{{each rows as value i}}"+n.tpl_body+"{{/each}}";n._tplBodyFn=template.compile(n.tpl_body)};var h=function(u,n){var o=f.data(u[0],l).options;var q=o.onlyStyle;if(o.gridTitleFix){var r=f('
            '+o.tpl_head+"
            ");var t=f('
            '+(q?o.tpl_body:"")+"
            ");var p;r.appendTo(n);t.appendTo(n);p=t.scrollTop();t.unbind("scroll").bind("scroll",function(){if(p!=t.scrollTop()){p=t.scrollTop();return}r.scrollLeft(t.scrollLeft())})}else{var s=f(''+o.tpl_head+"
            ");s.appendTo(n);s.find("thead tr:last-child td").addClass("ui_grid_head_border");if(o.colFit){s.css("width","98%")}n.css("overflow","auto")}};var a=function(s,t,p,u){var q=f.data(s[0],l).options;if(q.onlyStyle){e(s,p);return}if(q.localData){q.onBeforeLoadData.call(s);q.gridData=q.dataFilter.call(s,q.localData);i(s,t,p,q.gridData);q.onLoadDataSuccess.call(s,q.gridData)}else{if(!u||!q.lazyLoad){if(q.url!=""){var o=t.find(".grid_pagination");var n=q.queryParams;if(q.defaultSortField&&!n[q.paramSort]){n[q.paramSort]=q.defaultSortField;n[q.paramOrder]=q.defaultOrder=="desc"}if(o.length>0){var r={};r[q.paramPageIndex]=q.pageIndex;r[q.paramPageSize]=q.pageSize;f.extend(n,r)}f.ajax({type:q.method,url:q.url,cache:false,showLoading:false,data:n,dataType:"json",beforeSend:function(){f.uiLoading.show({container:t});q.onBeforeLoadData.call(s)},success:function(v){if(v.success){q.gridData=q.dataFilter.call(s,v.data);i(s,t,p,q.gridData);q.onLoadDataSuccess.call(s,q.gridData);return false}},complete:function(){f.uiLoading.hide({container:t})},error:function(){q.onLoadDataError.call(s,arguments);alert("加载远程数据"+q.url+"失败!");return false}})}}}};var i=function(t,u,p,s){var r=t.data(l).options;var o,q;var n=u.find(".grid_pagination");if(n.length>0){n.uiPagination("refresh",f.extend(r,{total:s.total}))}r._cacheData=s;r._selectedRows=[];t.find("thead :checkbox.grid_selector").each(function(){this.checked=false});o=f(r._tplBodyFn(s));if(r.gridTitleFix){q=p.find("div.ui_grid_data table.ui_grid tbody")}else{q=p.find("table.ui_grid tbody")}q.html(o);e(t,p);g(t,q)};var c=function(q,n){var o=f.data(q[0],l).options;var p=n.autoFit(true,false);if(o.gridTitleFix){n.find("div.ui_grid_data").autoFit(true,false,true,".ui_grid_head")}};var e=function(L,z,t){var r=L.data(l).options;var D=z.children("div.ui_grid_head");var n=D.find(".ui_grid");var M=n.find("tr:last-child td");var p=L.attr("id");var J=r._colStyles;var K=r._colWidths;var F=J.length>0;if(!F){t=true;J=r._colStyles=[];K=r._colWidths=[];if(r.colResizable){f('
            ').setIDByParentID(p,f.uiTemplate.uiGrid.colresizer).appendTo(z)}if(M.length==0){M=z.find("thead tr:last-child td")}M.each(function(){var N=f(this);if(N.attr("sortfield")){var w=N.children("div");if(w.length>0){w.addClass("icon_sort")}else{N.wrapInner('
            ')}N.addClass("sortable").click(function(){var R=f("#"+p).data(l).options;var T=R.localData||R._cacheData;var S=f(this);var Q=S.attr("sortfield");var O="asc";if(S.hasClass("asc")){O="desc";S.removeClass("asc").addClass(O)}else{if(S.hasClass("desc")){if(R.defaultSortField){Q=R.defaultSortField;O=R.defaultOrder}else{O=""}S.removeClass("desc")}else{S.addClass(O).siblings(".asc,.desc").removeClass("asc desc")}}if(O==""){delete R.queryParams[R.paramSort];delete R.queryParams[R.paramOrder]}else{R.queryParams[R.paramSort]=Q;R.queryParams[R.paramOrder]=O=="desc"}if(!!R.localData||(R.localSortable&&T.total==T.rows.length)){if(O==""||T._sorted){var P=T.rows;T.rows=T._rows;T._rows=P;T._sorted=!T._sorted}if(O!=""){if(!T._rows){T._rows=f.map(T.rows,function(U){return U})}T.rows.sort(function(V,U){var Y=V[Q]||"";var W=U[Q]||"";var X=0;if(typeof Y==="number"){X=Y-W}else{X=Y.localeCompare(W)}return O=="asc"?X:-X})}i(L,L.uiPanel("content"),z,T)}else{a(L,L.uiPanel("content"),z)}})}})}if(r.gridTitleFix&&t===true){var x=z.children("div.ui_grid_data");var o=x.find(".ui_grid");var A=o.children().children();if(A.length>0){var C=A.eq(0).children();var I=0;var G=0;var u=C.outerWidth()-C.width();var B=[];var H=z.width()-21;C.each(function(w){var O=f(this);var Q=M.eq(w);var N=0;var P;if(!F){P=!Q.hasClass("auto-width")&&!!Q[0].style.width;if(r.colResizable){Q.resizable({handles:"e",minWidth:r.minColWidth,maxWidth:r.maxColWidth,onStartResize:function(S){var T=f.getByParentID(p,f.uiTemplate.uiGrid.colresizer);var R=T.parent().offset().left;T.css("left",S.pageX-R).show();return false},onResize:function(S){var T=f.getByParentID(p,f.uiTemplate.uiGrid.colresizer);var R=T.parent().offset().left;T.css("left",S.pageX-R);return false},onStopResize:function(W){var S=W.data.width-W.data.startWidth;if(S!=0){var V=f("#"+p).data(l).options;var U=V._colWidths;var R=this.index();if(V.colFitAllTime){var T=0;f.each(U,function(X,Y){T+=Y});S=Math.floor(S*T/(this.parent().width()))}U[R]+=S;if(U[R]<0){U[R]=0}e(L,z,true)}f.getByParentID(p,f.uiTemplate.uiGrid.colresizer).hide();return false}})}if(!P){N=Math.max(Q.width(),Q.hasClass("auto-width")?0:O.width());if(!r.colFit){J[w]=f.globalCSS("#"+p+" .col_"+w,"width:"+N+"px;")}}else{N=parseFloat(Q[0].style.width);Q.addClass("fixed-width");J[w]=f.globalCSS("#"+p+" .col_"+w,"width:"+N+"px")}K[w]=N;Q.addClass("col_"+w).css("width","")}else{P=Q.hasClass("fixed-width");N=K[w];if(P||!r.colFitAllTime){J[w].style.width=N+"px"}}I+=N+u;if(P){G+=N+u}else{if((!F&&r.colFit)||r.colFitAllTime){B[B.length]={index:w,width:N}}}});if((!F&&r.colFit)||r.colFitAllTime){var s=H-G;var q=(I-G)/s;for(var E=0;E0){J[v].style.width=y+"px"}}}I=H}D.children(".ui_grid_head1").width(I+21);x.children().width(I);if(!F){n.css("table-layout","fixed");o.css("table-layout","fixed")}n.width(I);o.width(I)}}};var g=function(q,n){var o=n.find(":checkbox.grid_selector"),v=q.attr("id"),w=q.data(l).options,p=w._selectedRows,u=w.onSelectRow,r=w.selectedIds,t=w.autoSelectedOnLoad,s=function(B){var x=f(this),A=x,z=!x.is(":checkbox"),C=A.closest("div.grid_data").find("thead :checkbox.grid_selector");if(!z){A=x.closest("tr")}else{x=A.find(":checkbox.grid_selector")}if(!w.multiSelect||(z&&!B.ctrlKey)){A.siblings(".selected").removeClass("selected").find(":checked.grid_selector").each(function(){this.checked=false})}if(!z||B.ctrlKey){var y=false;y=A.hasClass("selected");A.toggleClass("selected",!y);x[0].checked=!y}else{x[0].checked=true;A.addClass("selected")}p.splice(0,p.length);r.splice(0,r.length);A.parent().children().each(function(D){if(!f(this).hasClass("selected")){y=false}else{p[p.length]=D;if(t&&A.attr("idField")){r[r.length]=A.attr("idField")}}});C.each(function(){this.checked=y;y=null});if(typeof u==="function"){u.call(q,p,r)}if(z&&B.ctrlKey){return false}};o.each(function(y,x){var A=f(x);var B=A.closest("tr");A.change(s).mousedown(function(){return false});B.mousedown(s);if(t){var C=B.attr(m);if(C){for(var z=0;z0){r.length=p.length}if(typeof u==="function"){u.call(q,p,r)}}q.find("thead :checkbox.grid_selector").unbind("change").change(function(){var C=f(this),B=f("#"+v),z=this.checked,A=B.data(l).options,x=C.closest("div.grid_data").find("table tbody tr");if(!A.multiSelect){return false}p.splice(0,p.length);r.splice(0,r.length);var y=0;x.each(function(E){var F=f(this);var D=F.find("input.grid_selector").length;if(D>0){if(z){p[y]=E;y++;if(A.autoSelectedOnLoad){r[r.length]=F.attr("idField")}}F.toggleClass("selected",z).find(":checkbox.grid_selector").each(function(){this.checked=z})}});if(typeof u==="function"){u.call(B,p,r)}})};var b=function(o){var n=o.children(".grid_toolbar");if(n.length>0){n.uiButtonBar();n.css("marginLeft",-1)}};var d=function(q,r,o){var n=r.find(".grid_pagination");if(n.length>0){var p=f.data(q[0],l).options;n.uiPagination({pageIndex:p.pageIndex,pageSize:p.pageSize,pageList:p.pageList,onSelectPage:function(s,t){p=f.data(q[0],l).options;p.pageIndex=s;p.pageSize=t;a(q,r,o)},onChangePageSize:function(s){p=f.data(q[0],l).options;p.pageIndex=1;p.pageSize=s;a(q,r,o)}})}}})(jQuery);(function(c){var i="uiTooltip";c.fn.uiTooltip=function(k,l){if(typeof k=="string"){return c.fn.uiTooltip.methods[k](this,l)}return this.each(function(){var n=c(this);var m=n.data(i);k=k||{};if(m){c.extend(m.options,k)}else{n.data(i,{options:c.extend({},c.fn.uiTooltip.defaults,n.parseUIConfig(),k),tip:null});f(n)}e(n);j(n)})};c.fn.uiTooltip.methods={options:function(k){return c.data(k[0],i).options},tip:function(k){return c.getByParentID(k.getElemID(),c.uiTemplate.tooltip.tip)},arrow:function(k){return k.uiTooltip("tip").children(".ui_tooltip-arrow-outer,.ui_tooltip-arrow")},content:function(k){return c.getByParentID(c(k).getElemID(),c.uiTemplate.tooltip.content)},show:function(l,k){d(l,k)},hide:function(l,k){b(l,k)},update:function(l,k){j(l,k)},reposition:function(k){a(k)},destroy:function(k){h(k)}};c.fn.uiTooltip.defaults={region:"right",content:null,trackMouse:false,offset:[0,0],showOn:"mouseenter",hideOn:"mouseleave",autoHide:true,autoShow:true,showDelay:200,hideDelay:100,onShow:function(k){},onHide:function(k){},onUpdate:function(k){},onPosition:function(l,k){},onDestroy:function(){}};var f=function(m){var l=c.data(m[0],i);var k=l.options;m.setElemID();var n=m.attr("title");if(n!=undefined&&n!=""&&!k.content){k.content=n;m.removeAttr("title")}return m};function d(q,p){var o=c.data(q[0],i);var l=o.options;var n=c.getByParentID(q.getElemID(),c.uiTemplate.tooltip.tip);if(n.length==0){var k=q.getElemID();var m=new RegExp("({target})","g");n=c(c.uiTemplate.tooltip.html.replace(m,k)).appendTo("body");j(q)}n.removeClass("ui_tooltip-top ui_tooltip-bottom ui_tooltip-left ui_tooltip-right").addClass("ui_tooltip-"+l.region);g(q);o.showTimer=setTimeout(function(){a(q);n.show();l.onShow.call(q,p);var r=c.getByParentID(k,c.uiTemplate.tooltip.tipAouter);var s=c.getByParentID(k,c.uiTemplate.tooltip.arrow);var t="border-"+l.region+"-color";r.add(s).css({borderTopColor:"",borderBottomColor:"",borderLeftColor:"",borderRightColor:""});r.css(t,n.css(t));s.css(t,n.css("backgroundColor"))},l.showDelay);n.unbind("mouseover.uiTooltip").bind("mouseover.uiTooltip",function(r){if(o.hideTimer){clearTimeout(o.hideTimer);o.hideTimer=null}});if(l.autoHide){n.unbind("mouseleave.uiTooltip").bind("mouseleave.uiTooltip",function(r){setTimeout(function(){b(q,r)},l.hideDelay)})}}function e(m){var l=c.data(m[0],i);var k=l.options;m.unbind(".uiTooltip");if(k.autoShow){m.bind(k.showOn+".uiTooltip",function(n){d(m,n)})}if(k.autoHide){m.bind(k.hideOn+".uiTooltip",function(n){b(m,n)})}m.bind("mousemove.uiTooltip",function(n){if(k.trackMouse){k.trackMouseX=n.pageX;k.trackMouseY=n.pageY;a(m)}})}function g(l){var k=c.data(l[0],i);if(k.showTimer){clearTimeout(k.showTimer);k.showTimer=null}if(k.hideTimer){clearTimeout(k.hideTimer);k.hideTimer=null}}function a(q){var n=c.data(q[0],i);var m=c.getByParentID(q.getElemID(),c.uiTemplate.tooltip.tip);if(!n||m.length==0){return}var k=n.options;var p,o,l;if(k.trackMouse){l=c();p=k.trackMouseX+k.offset[0];o=k.trackMouseY+k.offset[1]}else{var l=c(q);p=l.offset().left+k.offset[0];o=l.offset().top+k.offset[1]}switch(k.region){case c.uiTemplate.tooltip.region.right:p+=l.outerWidth()+12+(k.trackMouse?12:0);o-=(m.outerHeight()-l.outerHeight())/2;break;case c.uiTemplate.tooltip.region.left:p-=m.outerWidth()+12+(k.trackMouse?12:0);o-=(m.outerHeight()-l.outerHeight())/2;break;case c.uiTemplate.tooltip.region.top:p-=(m.outerWidth()-l.outerWidth())/2;o-=m.outerHeight()+12+(k.trackMouse?12:0);break;case c.uiTemplate.tooltip.region.bottom:p-=(m.outerWidth()-l.outerWidth())/2;o+=l.outerHeight()+12+(k.trackMouse?12:0);break}if(!c(q).is(":visible")){p=-100000;o=-100000}m.css({left:p,top:o,zIndex:(k.zIndex!=undefined?k.zIndex:(c.fn.uiDialog?c.fn.uiDialog.defaults.zIndex++:""))});k.onPosition.call(q,p,o)}function b(n,m){var l=c.data(n[0],i);var k=c.getByParentID(n.getElemID(),c.uiTemplate.tooltip.tip);if(l&&k.length>0){g(n);l.hideTimer=setTimeout(function(){var o=c.getByParentID(n.getElemID(),c.uiTemplate.tooltip.tip);o.hide();l.options.onHide.call(n,m)},l.options.hideDelay)}}function j(p,m){var o=c.data(p[0],i);var l=o.options;if(m){l.content=m}var n=c.getByParentID(p.getElemID(),c.uiTemplate.tooltip.tip);if(n.length==0){return}var k=typeof l.content=="function"?l.content.call(p):l.content;c.getByParentID(c(p).getElemID(),c.uiTemplate.tooltip.content).html(k);l.onUpdate.call(p,k)}function h(n){var m=c.data(n[0],i);if(m){g(n);var k=m.options;var l=c.getByParentID(n.getElemID(),c.uiTemplate.tooltip.tip);if(l.length>0){l.remove()}if(k.content){c(n).attr("title",k.content)}c.removeData(n,i);c(n).unbind(".uiTooltip");k.onDestroy.call(n)}}})(jQuery);(function(c){var j="uiLayout";var i=false;var k={top:"top",bottom:"bottom",right:"right",left:"left",center:"center"};c.fn.uiLayout=function(m,n){if(typeof m=="string"){return c.fn.uiLayout.methods[m](this,n)}return this.each(function(){var p=c(this);var o=p.data(j);m=m||{};if(o){c.extend(o.options,m)}else{p.data(j,{options:c.extend({},c.fn.uiLayout.defaults,p.parseUIConfig(),m),panels:{center:c(),top:c(),bottom:c(),right:c(),left:c()}});h(p)}f(p);a(p)})};c.fn.uiLayout.methods={resize:function(m){f(m);return m},panel:function(n,m){return c.data(n[0],j).panels[m]},collapse:function(n,m){g(n,m);return n},expand:function(n,m){b(n,m);return n},add:function(m,n){d(m,n);f(m);if(m.uiLayout("panel",n.region).uiPanel("options").collapsed){g(m,n.region,0)}return m},remove:function(n,m){l(n,m);f(n);return n}};c.fn.uiLayout.defaults={autoFit:false};c.fn.uiLayout.paneldefaults=c.extend({},c.fn.uiPanel.defaults,{region:null,border:true,showBtnBar:false,split:false,collapsible:true,collapsedSize:30,minWidth:10,minHeight:10,maxWidth:10000,maxHeight:10000});var h=function(n){n.addClass("ui_layout");var m=function(o){o.children("div").each(function(){var p=c.extend({},c.fn.uiLayout.paneldefaults,c(this).parseUIConfig());if("top,bottom,right,left,center".indexOf(p.region)>=0){d(o,p,this)}})};n.children("form").length?m(n.children("form")):m(n);n.append('
            ');n.bind("_resize",function(){var o=c.data(n[0],j).options;if(o.autoFit==true){f(n)}})};var a=function(n){var m=c.data(n[0],j).panels;if(m.right.length>0&&m.right.uiPanel("options").collapsed){g(n,k.right,0)}if(m.left.length>0&&m.left.uiPanel("options").collapsed){g(n,k.left,0)}if(m.top.length>0&&m.top.uiPanel("options").collapsed){g(n,k.top,0)}if(m.bottom.length>0&&m.bottom.uiPanel("options").collapsed){g(n,k.bottom,0)}};var f=function(s){var m=c.data(s[0],j);var u=m.options;var p=m.panels;if(s[0].tagName=="BODY"){s.autoFit(true,true)}else{u.autoFit?s.autoFit(true,true):s.autoFit(false)}var q={top:0,left:0,width:s.width(),height:s.height()};n(e(p.expandTop)?p.expandTop:p.top,"n");n(e(p.expandBottom)?p.expandBottom:p.bottom,"s");t(e(p.expandRight)?p.expandRight:p.right,"e");t(e(p.expandLeft)?p.expandLeft:p.left,"w");if(_IEunder9&&!p.center.uiPanel("options").border){q.width+=4;q.height+=4}p.center.each(function(){c(this).uiPanel("resize",q)});function r(v){var w=v.uiPanel("options");return Math.min(Math.max(w.height||v.outerHeight(),w.minHeight||0),w.maxHeight)}function o(v){var w=v.uiPanel("options");return Math.min(Math.max(w.width||v.outerWidth(),w.minWidth||0),w.maxWidth)}function n(w,x){if(!w.length||!e(w)){return}var y=w.uiPanel("options");var v=r(w);var z=(x=="n"?0:s.height()-v);w.uiPanel("resize",{width:s.width(),height:v,left:0,top:z});q.height-=v;if(x=="n"){q.top+=v;if(!y.split&&y.border){q.top-=1}}if(!y.split&&y.border){q.height+=1}}function t(v,w){if(!v.length||!e(v)){return}var y=v.uiPanel("options");var x=o(v);var z=(w=="e"?s.width()-x:0);v.uiPanel("resize",{width:x,height:q.height,left:z,top:q.top});q.width-=x;if(w=="w"){q.left+=x;if(!y.split&&y.border){q.left-=1}}if(!y.split&&y.border){q.width+=1}}};var d=function(r,n,m){n.region=n.region||k.center;var s=c.data(r[0],j).panels;var t=n.region;if(s[t].length){return}var u=c(m);if(!u.length){u=c("
            ").appendTo(r)}var p=c.extend({},c.fn.uiLayout.paneldefaults,{width:(u.length?parseInt(u[0].style.width)||u.width():"auto"),height:(u.length?parseInt(u[0].style.height)||u.height():"auto"),collapsible:true},n);p=c.extend(p,{onOpen:function(){var x=c(this).uiPanel("toolbar").empty();var w={top:"up",bottom:"down",right:"right",left:"left"};if(!w[t]){return}var y="ui_layout_btn_"+w[t];var v=x.children("."+y);if(!v.length){v=c('').addClass("ui_layout_btn").addClass(y).appendTo(x);v.bind("click",{dir:t},function(z){g(r,z.data.dir);return false})}c(this).uiPanel("options").collapsible?v.show():v.hide()}});u.uiPanel(p);u.addClass("ui_layout_panel ui_layout_panel_"+t);s[t]=u;if(u.uiPanel("options").split){u=u.uiPanel("panel");u.addClass("ui_layout_split_"+t);u.uiPanel("content").addClass("ui_layout_split_content_"+t);var o="";switch(t){case k.top:o="s";break;case k.bottom:o="n";break;case k.right:o="w";break;case k.left:o="e";break}var q;u.resizable(c.extend({},{handles:o,onStartResize:function(w){i=true;if(t==k.top||t==k.bottom){q=r.children("div.ui_layout_split_proxy_v")}else{q=r.children("div.ui_layout_split_proxy_h")}var v=c.uiMask.show({container:r,maskID:"layout"});var x={display:"block",top:0,left:0,width:0,height:0,zIndex:parseInt(v.css("zIndex"))+1};switch(t){case k.top:x.top=parseInt(u.css("top"))+u.outerHeight()-q.height();x.left=parseInt(u.css("left"));x.width=u.width();x.height=q.height();break;case k.bottom:x.top=parseInt(u.css("top"));x.left=parseInt(u.css("left"));x.width=u.width();x.height=q.height();break;case k.right:x.top=parseInt(u.css("top"))||0;x.left=parseInt(u.css("left"))||0;x.width=q.width();x.height=u.height();break;case k.left:x.top=parseInt(u.css("top"))||0;x.left=u.outerWidth()-q.width();x.width=q.width();x.height=u.height();break}q.css(x)},onResize:function(v){if(t==k.top||t==k.bottom){q.css("top",v.pageY-c(r).offset().top-q.height()/2)}else{q.css("left",v.pageX-c(r).offset().left-q.width()/2)}return false},onStopResize:function(v){q.hide();q=null;u.uiPanel("resize",v.data);f(r);i=false;c.uiMask.remove({container:r,maskID:"layout"})}},n))}};function l(p,o){var n=c.data(p[0],j).panels;if(n[o].length>0){n[o].panel("destroy");n[o]=c();var m="expand"+o.substring(0,1).toUpperCase()+o.substring(1);if(n[m]){n[m].panel("destroy");n[m]=undefined}}}var g=function(r,u,o){if(o==undefined){o="normal"}var s=c.data(r[0],j).panels;var v=s[u];var p=v.uiPanel("options");if(p.onBeforeCollapse.call(v)==false){return}var n="expand"+u.substring(0,1).toUpperCase()+u.substring(1);if(!s[n]){s[n]=m(p,u);s[n].uiPanel("panel").bind("click",function(){var w=t();v.uiPanel("open").uiPanel("expand",false).uiPanel("resize",w.collapse);v.uiPanel("panel").animate(w.expand,function(){c(this).unbind(".layout").bind("mouseleave.layout",{region:u},function(x){if(i==true){return}g(r,x.data.region)})})})}var q=t();if(!e(s[n])){s.center.uiPanel("resize",q.resizeC)}v.uiPanel("panel").animate(q.collapse,o,function(){v.uiPanel("close").uiPanel("collapse",false);s[n].uiPanel("open").uiPanel("resize",q.expandP);c(this).unbind(".layout")});function m(A,B){var y;var D="";var C="";switch(B){case k.right:y="ui_layout_btn_left1";break;case k.left:y="ui_layout_btn_right1";break;case k.top:D=A.title;C=A.icon;y="ui_layout_btn_down1";break;case k.bottom:D=A.title;C=A.icon;y="ui_layout_btn_up1";break}var x=c("
            ").appendTo(r);x.uiPanel(c.extend({},c.fn.uiLayout.paneldefaults,{title:D,icon:C,closed:true,minWidth:0,minHeight:0}));var w=x.uiPanel("toolbar").empty();var z=w.children("."+y);if(!z.length){z=c('').addClass("ui_layout_btn").addClass(y).appendTo(w);z.bind("click",{dir:B},function(F){b(r,B);return false})}x.addClass("ui_layout_expand ui_layout_expand_"+B);if(B==k.left||B==k.right){var E=x.uiPanel("content");E.html('
            '+A.title+"
            ")}else{x.uiPanel("title").css("color","black")}x.uiPanel("panel").hover(function(){c(this).addClass("ui_layout_expand_over")},function(){c(this).removeClass("ui_layout_expand_over")});return x}function t(){var y=s.center.uiPanel("options");var z=p.collapsedSize;switch(u){case k.right:var x=y.width+p.width-z;if(p.split){x++}return{resizeC:{width:x},expand:{left:r.width()-p.width},expandP:{top:y.top,left:r.width()-z,width:z,height:y.height},collapse:{left:r.width(),top:y.top,height:y.height}};break;case k.left:var x=y.width+p.width-z;if(p.split||!p.border){x++}return{resizeC:{width:x,left:z-1},expand:{left:0},expandP:{left:0,top:y.top,width:z,height:y.height},collapse:{left:-p.width,top:y.top,height:y.height}};break;case k.top:var w=y.height;if(!e(s.expandTop)){w+=p.height-z+((p.split||!p.border)?1:0)}s.right.add(s.left).add(s.expandRight).add(s.expandLeft).each(function(){c(this).uiPanel("resize",{top:z-1,height:w})});return{resizeC:{top:z-1,height:w},expand:{top:0},expandP:{top:0,left:0,width:r.width(),height:z},collapse:{top:-p.height,width:r.width()}};break;case k.bottom:var w=y.height;if(!e(s.expandBottom)){w+=p.height-z+((p.split||!p.border)?1:0)}s.right.add(s.left).add(s.expandRight).add(s.expandLeft).each(function(){c(this).uiPanel("resize",{height:w})});return{resizeC:{height:w},expand:{top:r.height()-p.height},expandP:{top:r.height()-z,left:0,width:r.width(),height:z},collapse:{top:r.height(),width:r.width()}};break}}};var b=function(s,r){var p=c.data(s[0],j).panels;var m=p[r];var t=m.uiPanel("options");if(t.onBeforeExpand.call(m)===false){return}var o=q();var n="expand"+r.substring(0,1).toUpperCase()+r.substring(1);if(p[n]){p[n].uiPanel("close");m.uiPanel("panel").stop(true,true);m.uiPanel("open").uiPanel("expand",false).uiPanel("resize",o.collapse);m.uiPanel("panel").animate(o.expand,function(){f(s)})}function q(){var u=p.center.uiPanel("options");if(r==k.right&&p.expandRight){return{collapse:{left:s.width(),top:u.top,height:u.height},expand:{left:s.width()-p[k.right].uiPanel("options").width}}}else{if(r==k.left&&p.expandLeft){return{collapse:{left:-p[k.left].uiPanel("options").width,top:u.top,height:u.height},expand:{left:0}}}else{if(r==k.top&&p.expandTop){return{collapse:{top:-p[k.top].uiPanel("options").height,width:s.width()},expand:{top:0}}}else{if(r==k.bottom&&p.expandBottom){return{collapse:{top:s.height(),width:s.width()},expand:{top:s.height()-p[k.bottom].uiPanel("options").height}}}}}}}};var e=function(m){if(!m){return false}if(m.length>0){return m.attr("closed")=="false"}else{return false}}})(jQuery);(function(g){var p="uiTabs";g.fn.uiTabs=function(u,v){if(typeof u=="string"){return g.fn.uiTabs.methods[u](this,v)}return this.each(function(){var x=g(this);var w=x.data(p);u=u||{};if(w){g.extend(w.options,u)}else{x.data(p,{options:g.extend({},g.fn.uiTabs.defaults,x.parseUIConfig(),u),tabs:[],selectHis:[]});j(x)}k(x);o(x);s(x);d(x)})};g.fn.uiTabs.methods={options:function(w){var v=g.data(w[0],p).options;var u=r(w);v.selected=u?a(w,u):-1;return v},tabs:function(u){return g.data(u[0],p).tabs},resize:function(u){o(u);l(u);return u},add:function(v,u){f(v,u);return v},close:function(u,v){n(u,v);return u},getTab:function(u,v){return t(u,v)},getTabIndex:function(v,u){return a(v,u)},getSelected:function(u){return r(u)},select:function(u,v){i(u,v);return u},unselect:function(u,v){e(u,v);return u},exists:function(u,v){return b(u,v)},update:function(v,u){m(v,u,true);return v},enableTab:function(v,w){var u=v.uiTabs("getTab",w).uiPanel("options").tab;u.removeClass("tabs-disabled");return v},disableTab:function(v,w){var u=v.uiTabs("getTab",w).uiPanel("options").tab;u.addClass("tabs-disabled");return v},scrollBy:function(y,v){var x=y.uiTabs("options");var w=y.getElemID();var u=g.getByParentID(w,g.uiTemplate.tabs.headerCenter);var A=Math.min(u.scrollLeft()+v,z());u.animate({scrollLeft:A},x.scrollDuration);function z(){var C=0;var B=g.getByParentID(w,g.uiTemplate.tabs.headerTabs);B.children("li").each(function(){C+=g(this).outerWidth(true)});return C-u.width()+(B.outerWidth()-B.width())}}};g.fn.uiTabs.defaults={width:0,height:0,headerWidth:150,tabWidth:"auto",tabMaxWidth:200,selected:0,autoFit:false,border:true,maxTabNumber:0,switchMode:"click",autoPlay:false,autoPlayTime:2000,lazyLoad:false,tabPosition:"top",scrollIncrement:100,scrollDuration:400,enableContextMenu:false,contextData:[{id:1,icon:"update",label:"刷新标签"},{id:2,icon:"close",label:"关闭标签"},{id:3,icon:"closeo",label:"关闭其他"},{id:4,icon:"closea",label:"关闭所有"}],onLoad:function(u){},onSelect:function(v,u){},onUnselect:function(v,u){},onBeforeClose:function(v,u){},onClose:function(v,u){},onAdd:function(v,u){},onUpdate:function(v,u){},onContextMenu:function(v,w,u){}};var j=function(A){var w=g.data(A[0],p).options;var x=g.data(A[0],p).tabs;A.setElemID();var u=A.getElemID();A.addClass("ui_tabs");var z=A.children("div");A.empty();var y=new RegExp("({tabs})","g");A.append(g(g.uiTemplate.tabs.html.replace(y,u)).html());var v=g.getByParentID(u,g.uiTemplate.tabs.panels);z.each(function(C,E){this.id=u+"-"+g.uiTemplate.tabs.panels+"-"+C;var B=g(this);B.appendTo(v);var D=g.extend({},B.parseUIConfig(),{selected:(B.attr("selected")?true:undefined)});x.push(B);h(A,B,D)});g.getByParentID(u,g.uiTemplate.tabs.headerLeft).add(g.getByParentID(u,g.uiTemplate.tabs.headerRight)).hover(function(){g(this).addClass("ui_tabs_scroller_over")},function(){g(this).removeClass("ui_tabs_scroller_over")});A.bind("_resize",function(){var B=g.data(A[0],p).options;if(B.autoFit==true){o(A);l(A)}});q(A)};var h=function(A,u,y){var z=g.data(A[0],p);y=y||{};var v=A.getElemID();y=g.extend(true,{},{border:false,padding:"0px",closed:true,showHeader:false,showBtnBar:false,draggable:false,resizable:false,maximizable:false,collapsible:false,onLoad:function(){if(y.onLoad){y.onLoad.call(this,arguments)}z.options.onLoad.call(A,g(this))}},y);var w=g.getByParentID(v,g.uiTemplate.tabs.headerTabs);var x=new RegExp("({tab})","g");if(y.id!=undefined&&y.id!=""){u[0].id=y.id}else{y.id=u[0].id}y.tab=g(g.uiTemplate.tabs.tabHtml.replace(x,u[0].id)).appendTo(w);m(A,{tab:u,options:y})};var m=function(G,z,B){B=B==undefined?false:B;var D=g.data(G[0],p).selectHis;var J=z.tab;var x=J[0].id;var w=z.options;var E="";try{var v=J.uiPanel("options");E=v.id;w=g.extend(v,w)}catch(F){E=w.id}if(B){J.uiPanel("refresh",J.uiPanel("options").url)}else{J.uiPanel(w)}var u=J.uiPanel("options");var y=u.tab;var H=g.getByParentID(x,g.uiTemplate.tabs.tab_linkTitle);var A=g.getByParentID(x,g.uiTemplate.tabs.tab_linkIcon);var I=g.getByParentID(x,g.uiTemplate.tabs.tab_close);H.html(u.title);y.attr("title",u.title);if(u.closable){if(I.length==0){g('').appendTo(y)}}else{if(I.length>0){I.remove()}}if(u.fontIcon&&!_IEunder6){u.fontIcon.size=u.fontIcon.size||16;u.fontIcon.color=u.fontIcon.color||"inherit";A.addClass("ui_panel_fontIcon fa").addClass(u.fontIcon.icon).css({color:u.fontIcon.color,fontSize:u.fontIcon.size})}else{if(u.icon){if(u.icon.indexOf(".")>0){A.addClass("icon").html("")}else{A.addClass("icon "+g.uiTemplate.iconStyle_Pre+u.icon)}}else{A.removeClass()}}if(E!=u.id){for(var C=0;C0){B=N.width()*B/100}if(B&&B>0){G.tabWidth=B;D.width(B);y.outerWidth(D.width()-L-J)}else{var H=y.outerWidth();if(_IEunder9){H=y.text().length*14}var C=H+L+J;if(C>F.tabMaxWidth){C=F.tabMaxWidth;y.outerWidth(F.tabMaxWidth-L-J)}G.tabWidth=C;D.width(C)}}if(F.tabPosition=="left"||F.tabPosition=="right"){K.outerWidth(F.headerWidth);x.outerWidth(N.width()-K.outerWidth());x.outerHeight(N.height());K.add(x).outerHeight(N.height());v.outerWidth(K.width()).outerHeight(N.height());E.outerWidth(v.width())}else{var u=g.getByParentID(M,g.uiTemplate.tabs.headerLeft).add(g.getByParentID(M,g.uiTemplate.tabs.headerRight));K.outerWidth(N.width());u.show();E.outerHeight(F.tabHeight).css("width","");c(N);x.outerHeight(N.height()-K.outerHeight());x.outerWidth(N.width())}};var c=function(B){var u=g.data(B[0],p).options;if(u.tabPosition=="left"||u.tabPosition=="right"){return}var w=B.getElemID();var z=g.getByParentID(w,g.uiTemplate.tabs.header);var A=g.getByParentID(w,g.uiTemplate.tabs.headerCenter);var C=g.getByParentID(w,g.uiTemplate.tabs.headerLeft);var E=g.getByParentID(w,g.uiTemplate.tabs.headerRight);var y=g.getByParentID(w,g.uiTemplate.tabs.headerTabs);var D=z.outerHeight();var v=0;y.children("li").each(function(){v+=g(this).outerWidth(true)});var x=z.width();if(v>x){C.add(E).show().outerHeight(D);A.css({marginLeft:C.outerWidth(),marginRight:E.outerWidth(),width:x-C.outerWidth()-E.outerWidth()})}else{C.add(E).hide();A.css({marginLeft:0,marginRight:0,width:x})}};var l=function(z){var y=g.data(z[0],p).options;var x=r(z);if(x){var v=g.getByParentID(z.getElemID(),g.uiTemplate.tabs.panels);var w=v.width();var u=v.height();x.uiPanel("resize",{width:w,height:u})}};var s=function(z){var y=g.data(z[0],p);var x=y.options;var u=z.getElemID();var A=g.getByParentID(u,g.uiTemplate.tabs.header);var w=g.getByParentID(u,g.uiTemplate.tabs.headerTabs);A.unbind().bind(x.switchMode,function(F){if(F.target.id==A[0].id||F.target.id==w[0].id){}else{if(F.target.id==g.getIDByParentID(u,g.uiTemplate.tabs.headerLeft)){z.uiTabs("scrollBy",-x.scrollIncrement)}else{if(F.target.id==g.getIDByParentID(u,g.uiTemplate.tabs.headerRight)){z.uiTabs("scrollBy",x.scrollIncrement)}else{var D=g(F.target);var C=D.closest("li");if(C.hasClass("tabs-disabled")){return}if(C.length){var B=v(C);if(D.hasClass("ui_tab_close")||F.button==1){n(z,B);return}var E=y.tabs[B].uiPanel("options");if(E.collapsible){E.closed?i(z,B):e(z,B)}else{i(z,B)}}}}}});if(x.enableContextMenu){A.unbind("contextmenu").bind("contextmenu",function(G){var C=g(G.target).closest("li");if(C.hasClass("tabs-disabled")){return}if(C.length){var B=v(C);var F=z.uiTabs("getTab",B);var H=g.getByParentID(u,g.uiTemplate.tabs.tabContextMenu);var E=H.attr("id");var D=F.uiPanel("options");x.onContextMenu.call(z,G,C[0].id,B);H.uiMenu("show",{triggerObject:G,triggerData:{tabIndex:B,tabID:F[0].id}});if(!D.iniframe){H.uiMenu("disableItem",E+"_1")}else{H.uiMenu("enableItem",E+"_1")}if(!D.closable){H.uiMenu("disableItem",E+"_2")}else{H.uiMenu("enableItem",E+"_2")}}})}function v(B){var C=0;w.children("li").each(function(D){if(B[0].id==this.id){C=D;return false}});return C}};var f=function(z,v){var y=g.data(z[0],p).options;var w=g.data(z[0],p).tabs;if(v.selected==undefined){v.selected=true}if(v.id!=undefined&&v.id!=""){var x=t(z,v.id);if(x){i(z,v.id);return}}else{v.id=guidGenerator()}var u=g("
            ").appendTo(g.getByParentID(z.getElemID(),g.uiTemplate.tabs.panels));w.push(u);h(z,u,v);y.onAdd.call(z,v.id,w.length-1);o(z);if(v.selected){i(z,w.length-1)}};var n=function(C,y){var u=g.data(C[0],p).options;var D=g.data(C[0],p).tabs;var A=g.data(C[0],p).selectHis;if(!b(C,y)){return}var x=t(C,y);var v=x[0].id;var B=x[0].index;if(u.onBeforeClose.call(C,v,B)==false){return}D.splice(B,1);x.uiPanel("options").tab.remove();x.uiPanel("destroy");u.onClose.call(C,v,B);o(C);for(var z=0;z=v.length){return null}else{var x=v[z];if(w){v.splice(z,1)}x[0].index=z;return x}}for(var u=0;uD.width()){var A=z-(D.width()-y.width())/2;g(F).uiTabs("scrollBy",A)}else{g(F).uiTabs("scrollBy",0)}l(F);u.onSelect.call(F,w,a(F,v))};var e=function(x,y){var w=g.data(x[0],p);var u=t(x,y);if(u){var v=u.uiPanel("options");if(!v.closed){u.uiPanel("close");if(v.closed){v.tab.removeClass("tabs_selected");w.options.onUnselect.call(x,u[0].id,a(x,u))}}}};var b=function(u,v){return t(u,v)!=null};var q=function(w){var v=g.data(w[0],p).options;var u=w.getElemID();if(v.enableContextMenu){var x=g('
            ').appendTo(w);x.uiMenu({contextMenu:true,minWidth:120,maxWidth:120,dataSource:v.contextData,onSelect:function(E,F){var D=x.uiMenu("options").triggerData;var y=D.tabIndex;var z=D.tabID;switch(E.id){case 1:w.uiTabs("select",y);var C=w.uiTabs("getSelected");C.uiPanel("refresh",C.uiPanel("options").url);break;case 2:w.uiTabs("close",y);break;case 3:var B=w.uiTabs("tabs");for(var A=0;Adiv.ui_panel>div.ui_panel_header");if(v.length){q=g(v[0]).outerHeight()}w=u.height()-q*v.length;s(true,w-s(false));function s(B,x){var z=0;for(var y=0;y=q.length){return null}else{return q[s]}}return h(r,"title",s)};var p=function(r){var q=g.data(r[0],n).options;if(q.border){r.removeClass("ui_accordion-noborder")}else{r.addClass("ui_accordion-noborder")}};var e=function(r,s){var q=k(r,s);if(!q){return}q.uiPanel("expand",false)};var j=function(r,s){var q=k(r,s);if(!q){return}q.uiPanel("collapse",false)};var f=function(t){var s=g.data(t[0],n).options;var q=h(t,"selected",true);if(q){r(i(t,q))}else{r(s.selected)}function r(u){e(t,u)}};var d=function(v,s){var u=g.data(v[0],n);var t=u.options;var r=u.panels;if(s.selected==undefined){s.selected=true}var q=g("
            ").appendTo(v);r.push(q);a(v,q,s);l(v);t.onAdd.call(v,s.title,r.length-1);if(s.selected){e(v,r.length-1)}};var o=function(v,t){var s=g.data(v[0],n);var q=s.options;var w=s.panels;var r=k(v,t);var x=r.uiPanel("options").title;var u=i(v,r);if(!r){return}if(q.onBeforeRemove.call(v,x,u)==false){return}w.splice(u,1);r.uiPanel("destroy");if(w.length){l(v);var y=c(v);if(!y){e(v,0)}}q.onRemove.call(v,x,u)}})(jQuery);(function(d){var g="uiNumberbox";d.fn.uiNumberbox=function(j,k){if(typeof j=="string"){return d.fn.uiNumberbox.methods[j](this,k)}return this.each(function(){var m=d(this);var l=m.data(g);j=j||{};if(l){d.extend(l.options,j)}else{m.data(g,{options:d.extend({},d.fn.uiNumberbox.defaults,m.parseUIConfig(),j),character:"",allowed:""})}e(m)})};d.fn.uiNumberbox.methods={enable:function(j){h(j);return j},disable:function(j){c(j);return j}};d.fn.uiNumberbox.defaults={allowDecimals:true,allowNegative:true,decimalPrecision:2,disabled:false,onBlur:function(j){},readOnly:false};var e=function(k){var j=d.data(k[0],g).options;j.id=j.id||k[0].id;k.attr("id",j.id);if(typeof j.disabled!=="boolean"){j.disabled=k.attr("disabled")}if(j.readOnly){k.attr("readonly","readonly")}a(k);i(k);if(j.disabled){c(k)}else{h(k)}return k};var f=function(k,n,l){var j=k.indexOf(".");if(isNaN(k)&&k!="."){for(;isNaN(k);){k=k.substring(0,k.length-1)}}if(!l.allowNegative&&k.indexOf("-")!=-1){var m=k.split("-");k=m.join("")}if(!l.allowDecimals&&j!=-1||k.charAt(k.length-1)==="."){return k.substring(0,j)}if(j!=-1){k=k.substring(0,j+l.decimalPrecision+1)}return k.length>0?parseFloat(k):""};var i=function(k){var j=d.data(k[0],g).options;k.addClass("ui_numberbox").css("ime-mode","disabled");k.keypress(function(n){if(n.which==null&&(n.charCode!=null||n.keyCode!=null)){n.which=n.charCode!=null?n.charCode:n.keyCode}var l=n.which;if(l===8||(l==46&&n.button==-1)||l===0){return}var m=String.fromCharCode(l);d.data(k[0],g).character=m;var o=d.data(k[0],g).allowed;if(o.indexOf(m)===-1||(d(this).val().indexOf("-")!==-1&&m=="-")||(d(this).val().indexOf(".")!==-1&&m==".")){n.preventDefault()}}).focus(function(){k.addClass("ui-focus")}).blur(function(m){k.removeClass("ui-focus");var l=d.data(k[0],g).character;k[0].value=f(this.value,l,j);k.trigger("onBlur",m,this.value)}).keydown(function(l){b(k);if(229===l.which){l.preventDefault()}}).keyup(function(l){b(k)}).bind("cut paste",function(l){return false})};var b=function(l){var k=l[0].value,j=k.length;if(k&&d.data(l[0],g).allowed.indexOf(k.charAt(j-1))===-1||k.indexOf(".")!=k.lastIndexOf(".")||k.indexOf("-")!=k.lastIndexOf("-")){l[0].value=k=k.substring(0,(j--)-1)}};var a=function(k){var j=d.data(k[0],g).options;var l="0123456789";if(j.allowDecimals){l=l+"."}if(j.allowNegative){l=l+"-"}if(j.readOnly){l=""}d.data(k[0],g).allowed=l};var c=function(j){j.attr("disabled",true).addClass("ui-disabled")};var h=function(j){j.attr("disabled",false).removeClass("ui-disabled")}})(jQuery);(function(e){var f="uiDate";e.fn.uiDate=function(g,h){if(this.length>0&&typeof g=="string"){return e.fn.uiDate.methods[g](this.first(),h)}return this.each(function(){var j=e(this);var i=j.data(f);g=g||{};if(i){e.extend(i.options,g)}else{j.data(f,{options:e.extend({},e.fn.uiDate.defaults,j.parseUIConfig(),g)})}d(j)})};e.fn.uiDate.methods={enable:function(g){c(g);return g},disable:function(g){b(g);return g},setReadonly:function(h,g){a(h,g);return h}};e.fn.uiDate.defaults={required:false,width:150,skin:"default",startDate:"",alwaysUseStartDate:false,doubleCalendar:false,minDate:"",maxDate:"",opposite:false,disabledDays:[],disabledDates:[],specialDays:[],specialDates:[],errDealMode:1,dateFmt:"yyyy-MM-dd",disabled:false,qsEnabled:true,quickSel:[],readonly:false,isShowWeek:false,highLineWeekDay:true,isShowClear:true,isShowToday:true,position:{},firstDayOfWeek:1,onpicking:function(g){},onpicked:function(g){},onclearing:function(){},oncleared:function(g){},ychanging:function(){},ychanged:function(){},Mchanging:function(){},Mchanged:function(){},dchanging:function(){},dchanged:function(){},Hchanging:function(){},Hchanged:function(){},mchanging:function(){},mchanged:function(){},schanging:function(){},schanged:function(){}};var d=function(k){var h=e.data(k[0],f).options;k.setElemID().addClass("ui_date");var g=k.getElemID();if(typeof h.disabled!=="boolean"){h.disabled=k.attr("disabled")}var j=e(e.uiTemplate.datepicker.pickerHtml).setIDByParentID(g,e.uiTemplate.datepicker.pickerSpan);k.wrap(j);var i=e(e.uiTemplate.datepicker.iconHtml).setIDByParentID(g,e.uiTemplate.datepicker.icon);k.after(i);a(k,h.readonly);if(_IEunder7){k.outerWidth(h.width-i.outerWidth())}else{k.outerWidth(h.width-i.outerWidth()+2)}return k};var b=function(h){var g=e.getByParentID(h.getElemID(),e.uiTemplate.datepicker.icon);h.attr("disabled",true).addClass("ui-disabled");h.unbind(".uiDate");g.unbind(".uiDate")};var c=function(j){var g=e.data(j[0],f).options;j.attr("disabled",false).removeClass("ui-disabled");var i=e.getByParentID(j.getElemID(),e.uiTemplate.datepicker.icon);var h=e.getByParentID(j.getElemID(),e.uiTemplate.datepicker.pickerSpan);i.unbind(".uiDate").bind("click.uiDate",function(){j.focus()});j.unbind(".uiDate").bind("focus.uiDate",function(){h.addClass("ui_date-focus");WdatePicker(g)}).bind("blur.uiDate",function(){h.removeClass("ui_date-focus")});if(g.required){j.uiValidate({required:true,tipOffset:[20,0],afterValidate:function(k){if(!k){h.addClass("ui_date-invalid")}else{h.removeClass("ui_date-invalid")}}});j.css("border","0")}};var a=function(m,i){var j=e.data(m[0],f).options;var l=e.getByParentID(m.getElemID(),e.uiTemplate.datepicker.icon);var k=e.getByParentID(m.getElemID(),e.uiTemplate.datepicker.pickerSpan);var h=k.find(".ui_date");if(i){k.addClass("ui_validate_disabled");l.hide();h.width(h.width()+20);m.attr("readonly",true);m.unbind(".uiDate");l.unbind(".uiDate");var g=m.attr("id")+"-star";e("#"+g).remove()}else{k.removeClass("ui_validate_disabled");l.show();h.width(h.width()-20);if(j.disabled){b(m)}else{c(m)}}}})(jQuery);(function($){var _cacheName="uiValidate";$.fn.uiValidate=function(options,param){if(this.length>0&&typeof options=="string"){return $.fn.uiValidate.methods[options](this,param)}return this.each(function(){var me=$(this);var state=me.data(_cacheName);options=options||{};if(state){$.extend(state.options,options)}else{me.data(_cacheName,{options:$.extend({},$.fn.uiValidate.defaults,me.parseUIConfig(),options)});_init(me)}_isValidate(me);_isValid(me);setTimeout(function(){_hideTip(me)},options.delay);$.getByParentID(me.attr("id"),$.uiTemplate.uiValidate.lenDiv).hide()})};$.fn.uiValidate.methods={options:function(target){return $.data(target[0],_cacheName).options},destroy:function(target){_destroy(target)},validate:function(target){_isValid(target);return target},isValid:function(target){return _isValid(target)},enableValidation:function(target){_isValidate(target,false);return target},disableValidation:function(target){_isValidate(target,true);return target},enable:function(target){target.attr("readonly",false).removeClass("ui_validate_disabled");_isValidate(target,false);return target},disable:function(target){_isValidate(target,true);return target},setReadonly:function(target,readonly){_setReadonly(target,readonly);return target}};$.fn.uiValidate.defaults={width:150,required:false,star:{show:true,front:false},disabled:false,readonly:false,nullValue:null,validType:null,validParams:null,tipAfterInput:false,showTitleTip:false,delay:200,missingMessage:"必填项!",tipMessage:"",invalidMessage:"",tipPosition:"right",tipOffset:[0,0],novalidate:false,afterValidate:function(isValidate){},rules:{username:{validator:function(val){return $.regexs.username.test(val)},message:"请输入合法的用户名!"},phone:{validator:function(val){return $.regexs.phone.test(val)},message:"电话格式错误!"},mobile:{validator:function(val){return $.regexs.mobile.test(val)},message:"手机号码格式错误!"},email:{validator:function(val){return $.regexs.email.test(val)},message:"请输入有效的邮箱地址!"},url:{validator:function(val){return $.regexs.url.test(val)},message:"请输入合法的URL!"},length:{validator:function(val,len){var valLen=$.trim(val).length;var lenDivName=$.uiTemplate.uiValidate.lenDiv;var lenDiv=$.getByParentID(this[0].id,lenDivName);if(lenDiv.length==0){lenDiv=$('
            ');this.after(lenDiv)}lenDiv.html("字数:"+valLen);if(_IEunder9){lenDiv.width(80)}var pos=this.position();lenDiv.css({top:pos.top+this.outerHeight(),left:pos.left+this.outerWidth()-lenDiv.outerWidth()});return valLen>=len[0]&&valLen<=len[1]},message:"长度必须介于{0}~{1}。"},remote:{validator:function(val,params){var date={};date[params[1]]=val;var responseText=$.ajax({url:params[0],dataType:"json",data:date,async:false,cache:false,type:"post"}).responseText;return responseText=="true"},message:"请确认信息的正确性!"}}};var _init=function(target){target.each(function(){var me=$(this);if(this.style.width==""&&me.attr("cols")===undefined){me.width(me.data(_cacheName).options.width)}me.setElemID();me.addClass("ui_validate")})};var _destroy=function(target){target.each(function(){var me=$(this);var state=me.data(_cacheName);state.validating=false;if(state.timer){clearTimeout(state.timer)}me.tooltip("destroy");me.remove()})};function _bindEvents(target){var state=$.data(target[0],_cacheName);var options=state.options;target.unbind(".uiValidate");if(options.novalidate){return}target.bind("focus.uiValidate",function(){state.validating=true;state.value=undefined;target.addClass("ui-focus");if(options.tipAfterInput){(function(){if(state.validating){if(state.value!=target.val()){state.value=target.val();if(state.timer){clearTimeout(state.timer)}state.timer=setTimeout(function(){vali()},state.options.delay)}else{_reShowTip(target)}setTimeout(arguments.callee,200)}})()}else{vali()}function vali(){var vali=target.uiValidate("isValid")}var lenDiv=$.getByParentID(target[0].id,$.uiTemplate.uiValidate.lenDiv);lenDiv.show()}).bind("blur.uiValidate",function(){target.removeClass("ui-focus");if(state.timer){clearTimeout(state.timer);state.timer=undefined}state.validating=false;if(!options.tipAfterInput){target.uiValidate("validate")}_hideTip(target);var lenDiv=$.getByParentID(target[0].id,$.uiTemplate.uiValidate.lenDiv);lenDiv.hide()}).bind("mouseover.uiValidate",function(){if(options.tipMessage!=""){state.message=options.tipMessage;_showTip(target)}if(target.hasClass("ui_validate-invalid")){_showTip(target)}}).bind("mouseleave.uiValidate",function(){if(!state.validating){_hideTip(target)}})}var _showTip=function(target){target.each(function(){var me=$(this);var state=me.data(_cacheName);var options=state.options;if(_IEunder6||options.showTitleTip){me[0].title=state.message;state.tip=true;return}me.uiTooltip({content:state.message,region:options.tipPosition,offset:options.tipOffset}).uiTooltip("show");state.tip=true})};var _reShowTip=function(target){var state=$.data(target[0],_cacheName);if(state){if(_IEunder6||state.options.showTitleTip){target[0].title=state.message;return}if(state.tip){var targetID=target.getElemID();var tipContent=$.getByParentID(targetID,$.uiTemplate.tooltip.content);if(tipContent.length>0&&tipContent.is(":visible")){tipContent.html(state.message)}}}};var _hideTip=function(target){target.each(function(){var me=$(this);var state=me.data(_cacheName);if(_IEunder6||state.options.showTitleTip){return}state.tip=false;me.uiTooltip("hide")})};var _isValid=function(target){var rs=true;target.each(function(){var me=$(this);var state=me.data(_cacheName);var options=state.options;var val=me.val();if(options.novalidate||me.is(":disabled")){me.removeClass("ui_validate-invalid");_hideTip(me);me[0].title="";return true}if(options.required){me[0].title="";if($.trim(val)==""||val==options.nullValue){me.addClass("ui_validate-invalid");_setMsg(options.missingMessage);if(state.validating){_showTip(me)}options.afterValidate.call(me,false);rs=false;return true}options.afterValidate.call(me,true)}if(options.validType){if($.isArray(options.validType)){for(var i=0;i*';var tar=me;if(tar.hasClass("ui_combo-text")||tar.hasClass("ui_date")||tar.hasClass("ui_ueditor")){tar=me.parent();addStar()}else{if(!me.attr("readonly")){addStar()}}function addStar(){if($("#"+starId).length==0){if(options.star.front){tar.before(star)}else{tar.after(star)}}}}else{$("#"+starId).remove()}}_bindEvents(me)}})};var _setReadonly=function(target,readonly){target.each(function(){var me=$(this);if(me.data(_cacheName)){var options=me.data(_cacheName).options;options.readonly=readonly==undefined?false:readonly}});_isValidate(target,readonly);if(readonly){target.attr("readonly",true).addClass("ui_validate_disabled")}else{target.attr("readonly",false).removeClass("ui_validate_disabled")}}})(jQuery);(function(b){var g="uiForm";b.fn.uiForm=function(k,l){if(typeof k=="string"){return b.fn.uiForm.methods[k](this,l)}return this.each(function(){var m=b(this);k=k||{};if(!m.data(g)){m.data(g,{options:b.extend({},b.fn.uiForm.defaults,k)});h(m)}})};b.fn.uiForm.methods={data:function(l){try{return b.data(this[0],g)}catch(k){return undefined}},submit:function(m,k){var l=b.extend({},b.fn.uiForm.defaults,b.data(m[0],g)?b.data(m[0],g).options:{},k||{});a(m,l);return m},load:function(l,k){c(l,k);return l},clear:function(k){e(k);return k},reset:function(k){f(k);return k},validate:function(k){return i(k)},disableValidation:function(k){d(k,true);return k},enableValidation:function(k){d(this,false);return k},setReadonly:function(l,k){j(l,k)}};b.fn.uiForm.defaults={template:"",url:null,onSubmit:function(k){return b(this).uiForm("validate")},success:function(k){},onBeforeLoad:function(k){},onLoadSuccess:function(k){if(k.success==undefined){}else{if(!k.success){alert(k.message)}}},onLoadError:function(){},onBeforeCompile:function(k){}};var h=function(m){var l=b.data(m[0],g).options;m.setElemID();if(l.template!=""){var k=b("#"+l.template);l.formTemp=k.html();k.remove()}else{}m.unbind(".uiForm").bind("submit.uiForm",function(){setTimeout(function(){a(m,l)},0);return false})};var a=function(t,x){x=x||{};var o={ajax:true};if(x.onSubmit){if(x.onSubmit.call(t,o)==false){return}}if(x.url){t.attr("action",x.url)}var u=b.getIDByParentID(t.getElemID(),b.uiTemplate.uiForm.iframe);var k=b("").attr("src",window.ActiveXObject?"javascript:false":"about:blank").css({position:"absolute",top:-1000,left:-1000});var m=t.attr("target"),w=t.attr("action");t.attr("target",u);var q=b();try{k.appendTo("body");k.bind("load",p);for(var l in o){var s=b('').val(o[l]).appendTo(t);q=q.add(s)}v();t[0].submit()}finally{t.attr("action",w);m?t.attr("target",m):t.removeAttr("target");q.remove()}function v(){var y=b("#"+u);if(!y.length){return}try{var n=y.contents()[0].readyState;if(n&&n.toLowerCase()=="uninitialized"){setTimeout(v,100)}}catch(z){p()}}var r=10;function p(){var C=b("#"+u);if(!C.length){return}C.unbind();var z="";try{var n=C.contents().find("body");z=n.html();if(z==""){if(--r){setTimeout(p,100);return}}var y=n.find(">textarea");if(y.length){z=y.val()}else{var B=n.find(">pre");if(B.length){z=B.html()}}}catch(A){}if(x.success){try{z=JSON.parse(z)}catch(A){}x.success(z)}setTimeout(function(){C.unbind();try{C.contentWindow.document.write("");C.contentWindow.close()}catch(D){}C.remove();if(_IE){CollectGarbage()}C=null},100)}};var c=function(n,m){if(!b.data(n[0],g)){b.data(n[0],g,{options:b.extend({},b.fn.uiForm.defaults)})}var k=b.data(n[0],g).options;if(typeof m=="string"){var o={};if(k.onBeforeLoad.call(n,o)==false){return}b.ajax({url:m,data:o,showAlert:false,dataType:"json",success:function(p){l(p)},error:function(){k.onLoadError.apply(n,arguments)}})}else{l(m)}function l(p){var q=p;if(q&&p.data){q=p.data||{}}else{q=q||{}}if(k.onBeforeCompile.call(n,p)==false){return}if(k.template!=""){n.html(template.compile(k.formTemp)(q))}k.onLoadSuccess.call(n,p);i(n)}};var e=function(p){b("input,select,textarea",p).each(function(){var s=this.type,q=this.tagName.toLowerCase();if(s=="text"||s=="hidden"||s=="password"||q=="textarea"){if(!b(this).hasClass("ui_validate_disabled")){this.value=""}}else{if(s=="file"){var r=b(this);var u=r.clone().val("");u.insertAfter(r);if(r.data("uiValidate")){r.uiValidate("destroy");u.uiValidate()}else{r.remove()}}else{if(s=="checkbox"||s=="radio"){this.checked=false}else{if(q=="select"){this.selectedIndex=-1}}}}});var m=b(p);var k=["ui_combo"];for(var l=0;l0){b(m[0]).focus();return false}return true};var d=function(l,k){l.find(".ui_validate:not(:disabled)").each(function(){b(this).uiValidate(k?"disableValidation":"enableValidation")})};var j=function(l,k){l.find(".ui_validate").each(function(){var n=b(this);b(this).uiValidate("setReadonly",k);if(this.tagName=="TEXTAREA"){n.addClass("ui_validate_disabled_tt")}else{n.removeClass("ui_validate_disabled_tt")}m(k)});l.find(".ui_comboOrigin").each(function(){b(this).uiCombo("setReadonly",k)});l.find(".ui_date").each(function(){b(this).uiDate("setReadonly",k)});l.find(".ui_ueditor").each(function(){b(this).uiUEditor("setReadonly",k)});function m(p,o){if(o){var n=p.attr("id")+"-star";b("#"+n).remove()}}}})(jQuery);(function(e){var q="uiCombo";e.fn.uiCombo=function(v,w){if(typeof v=="string"){return e.fn.uiCombo.methods[v](this,w)}return this.each(function(){var x=e(this);v=v||{};var y=x.data(q);if(y){e.extend(y.options,v)}else{x.data(q,{options:e.extend({},e.fn.uiCombo.defaults,x.parseUIConfig(),v),previousValue:null});i(x);x.removeAttr("disabled")}r(x);m(x);d(x);a(x);s(x)})};e.fn.uiCombo.methods={options:function(v){return e.data(v[0],q).options},panel:function(x){var w=x.getElemID();var v=e.getByParentID(w,e.uiTemplate.uiCombo.comboPanel);return v.uiPanel("content")},panelBar:function(x){var w=x.getElemID();var v=e.getByParentID(w,e.uiTemplate.uiCombo.comboPanel);return v.uiPanel("buttonbar")},combo:function(w){var v=w.getElemID();return e.getByParentID(v,e.uiTemplate.uiCombo.combo)},textbox:function(w){var v=w.getElemID();return e.getByParentID(v,e.uiTemplate.uiCombo.comboText)},destroy:function(v){o(v);return v},resize:function(w,v){a(w,v);return w},showPanel:function(v){h(v);return v},hidePanel:function(v){k(v);return v},disable:function(v){p(v,true);m(v);return v},enable:function(v){p(v,false);m(v);return v},setReadonly:function(w,v){l(w,v);m(w);return w},isValid:function(z){var v=z.getElemID();var w=e.getByParentID(v,e.uiTemplate.uiCombo.comboText);var y=e.getByParentID(v,e.uiTemplate.uiCombo.combo);w.uiValidate("options").nullValue=z.uiCombo("options").nullValue;var x=w.uiValidate("isValid");if(!x){y.addClass("ui_combo-invalid")}else{y.removeClass("ui_combo-invalid")}return x},enableValidation:function(x){var v=x.getElemID();var w=e.getByParentID(v,e.uiTemplate.uiCombo.comboText);w.uiValidate("enableValidation");return x},disableValidation:function(y){var v=y.getElemID();var w=e.getByParentID(v,e.uiTemplate.uiCombo.comboText);var x=e.getByParentID(v,e.uiTemplate.uiCombo.combo);w.uiValidate("disableValidation");x.removeClass("ui_combo-invalid");return y},clear:function(v){c(v);return v},reset:function(w){var v=e.data(w[0],q).options;if(v.multiple){w.uiCombo("setValues",v.originalValue)}else{w.uiCombo("setValue",v.originalValue)}return w},getText:function(v){return u(v)},setText:function(v,w){n(v,w);return v},getValues:function(v){return j(v)},setValues:function(w,v){b(w,v);return w},getValue:function(v){return g(v)},setValue:function(w,v){f(w,v);return w}};e.fn.uiCombo.defaults=e.extend({},e.fn.uiValidate.defaults,{renderInBody:true,showPanelBar:false,height:25,panelWidth:null,tipOffset:[20,0],tipPosition:"right",panelHeight:0,panelAlign:"left",multiple:false,selectOnNavigation:true,separator:",",editable:false,searchable:false,disabled:false,readonly:false,hasDownArrow:true,value:"",delay:200,deltaX:19,keyHandler:{up:function(v){},down:function(v){},left:function(v){},right:function(v){},enter:function(v){},query:function(v,w){return true}},onShowPanel:function(){},onHidePanel:function(){},onChange:function(w,v){},addButton:null});var i=function(B){var E=e.data(B[0],q).options;if(isNaN(E.width)){E.width=B.outerWidth()}if(_IEunder6){setTimeout(function(){B.addClass("ui_comboOrigin")},100)}else{B.addClass("ui_comboOrigin")}B.setElemID();var y=B.getElemID();var w=new RegExp("({comboID})","g");var x=e(e.uiTemplate.uiCombo.html.replace(w,y)).insertAfter(B);x.addClass("ui-default");var v=e.getByParentID(y,e.uiTemplate.uiCombo.comboPanel);if(v&&v.length>0){}else{v=e(e.uiTemplate.uiCombo.panelHtml.replace(w,y));E.renderInBody?v.appendTo("body"):v.appendTo(B.parent());var C=[];var A=false;if(E.addButton){C=[E.addButton];A=true}v.uiPanel({width:(E.panelWidth?E.panelWidth:E.width),height:E.panelHeight,zIndex:10001,showHeader:false,showBtnBar:A||E.showPanelBar,buttons:C,closed:true,onBeforeClose:function(){t(B)},onClose:function(){var F=e.data(B[0],q);if(F){F.options.onHidePanel.call(B)}}})}var z=e(B).attr("name");var D=e.getByParentID(y,e.uiTemplate.uiCombo.comboValue);if(z){D.attr("name",z);B.removeAttr("name").attr("comboName",z)}};var r=function(y){var v=y.getElemID();var w=e.data(y[0],q).options;var x=e.getByParentID(v,e.uiTemplate.uiCombo.comboArrow);if(w.hasDownArrow){x.show()}else{x.hide()}p(y,w.disabled);l(y,w.readonly)};var p=function(A,z){var w=A.getElemID();var x=e.data(A[0],q).options;var y=e.getByParentID(w,e.uiTemplate.uiCombo.comboText);var v=e.getByParentID(w,e.uiTemplate.uiCombo.comboValue);if(z){x.disabled=true;A.attr("disabled",true);v.attr("disabled",true);y.attr("disabled",true)}else{x.disabled=false;A.removeAttr("disabled");v.removeAttr("disabled");y.removeAttr("disabled")}};var l=function(C,y){var x=C.getElemID();var z=e.data(C[0],q).options;z.readonly=y==undefined?false:y;var B=e.getByParentID(x,e.uiTemplate.uiCombo.combo);var A=e.getByParentID(x,e.uiTemplate.uiCombo.comboText);var v=e.getByParentID(x,e.uiTemplate.uiCombo.comboArrow);if(z.readonly){B.addClass("ui_validate_disabled");A.attr("readonly",z.readonly).css("cursor","");v.css("display","none");var w=C.attr("id")+"-star";e("#"+w).remove()}else{B.removeClass("ui_validate_disabled");A.attr("readonly",z.readonly).css("cursor","pointer");v.css("display","inline-block")}};var a=function(C,A){var x=C.getElemID();var y=e.data(C[0],q).options;var B=e.getByParentID(x,e.uiTemplate.uiCombo.combo);if(A){y.width=A}var z=e.getByParentID(x,e.uiTemplate.uiCombo.comboText);var v=e.getByParentID(x,e.uiTemplate.uiCombo.comboArrow);var w=y.hasDownArrow?v.outerWidth():0;if(_IEunder7){B.width(y.width).height(y.height)}else{B.width(y.width+2).height(y.height)}z.css({height:B.height()+"px",lineHeight:B.height()+"px",width:y.width-w});v.outerHeight(B.height())};var o=function(A){var x=e.data(A[0],q).options;var w=A.getElemID();var y=e.getByParentID(w,e.uiTemplate.uiCombo.comboText);var z=e.getByParentID(w,e.uiTemplate.uiCombo.combo);var v=e.getByParentID(w,e.uiTemplate.uiCombo.comboPanel);y.uiValidate("destroy");v.uiPanel("destroy");z.remove();A.remove()};var t=function(v){v.find(".ui_comboOrigin").each(function(){var w=e.getByParentID(this.id,e.uiTemplate.uiCombo.comboPanel);if(w.is(":visible")){w.uiPanel("close")}})};var m=function(A){var y=A.getElemID();var w=e.data(A[0],q);var D=w.options;var x=e.getByParentID(y,e.uiTemplate.uiCombo.combo);var v=e.getByParentID(y,e.uiTemplate.uiCombo.comboPanel);var B=e.getByParentID(y,e.uiTemplate.uiCombo.comboText);var C=e.getByParentID(y,e.uiTemplate.uiCombo.comboArrow);e(document).unbind(".uiCombo").bind("mousedown.uiCombo",function(F){var E=e(F.target).closest("span.ui_combo,div.ui_combo-panel");if(E.length){t(A);return}e("body>div.ui_combo-panel:visible").each(function(){e(this).uiPanel("close")})});B.unbind(".uiCombo");C.unbind(".uiCombo");if(!D.disabled&&!D.readonly){x.bind("mouseover.uiCombo",function(E){x.addClass("ui-hover")}).bind("mouseleave.uiCombo",function(E){x.removeClass("ui-hover")});B.bind("click.uiCombo",function(F){if(!D.editable){z.call(this)}else{var E=e(this).closest("div.ui_combo-panel");e("div.ui_combo-panel").not(v).not(E).each(function(){e(this).uiPanel("close")})}}).bind("keydown.uiCombo paste.uiCombo drop.uiCombo",function(E){switch(E.which){case e.keyCode.UP:D.keyHandler.up.call(A,E);break;case e.keyCode.DOWN:D.keyHandler.down.call(A,E);break;case e.keyCode.LEFT:D.keyHandler.left.call(A,E);break;case e.keyCode.RIGHT:D.keyHandler.right.call(A,E);break;case e.keyCode.ENTER:E.preventDefault();D.keyHandler.enter.call(A,E);return false;case e.keyCode.TAB:case e.keyCode.ESCAPE:k(A);break;default:if(D.editable||D.searchable){if(w.timer){clearTimeout(w.timer)}w.timer=setTimeout(function(){var F=B.val();if(w.previousValue!=F){w.previousValue=F;A.uiCombo("showPanel");D.keyHandler.query.call(A,B.val(),E);A.uiCombo("isValid")}},D.delay)}}});if(webUI_browser().gecko){B.bind("input",function(E){B.keydown()})}C.bind("click.uiCombo",function(){z.call(this)}).bind("mouseenter.uiCombo",function(){e(this).addClass("ui_combo-arrow-hover")}).bind("mouseleave.combo",function(){e(this).removeClass("ui_combo-arrow-hover")})}function z(){if(v.attr("closed")=="false"){k(A)}else{var F=e(this).closest("div.ui_combo-panel");var E=e("div.ui_combo-panel").not(v).not(F);if(E.length>0){E.each(function(){e(this).uiPanel("close")})}e(A).uiCombo("showPanel")}}if(!D.editable&&!D.searchable){B.attr("readonly",true)}};function h(B){var x=B.getElemID();var y=e.data(B[0],q).options;var A=e.getByParentID(x,e.uiTemplate.uiCombo.combo);var w=e.getByParentID(x,e.uiTemplate.uiCombo.comboPanel);w.css({left:z(),top:v()});if(w.uiPanel("options").closed){w.uiPanel("open");y.onShowPanel.call(B)}(function(){if(w.attr("closed")=="false"){w.css({left:z(),top:v()});setTimeout(arguments.callee,200)}})();function z(){if(y.renderInBody){var C=A.offset().left;if(y.panelAlign=="right"){C+=A.outerWidth()-w.outerWidth()}if(C+w.outerWidth()>e(window).outerWidth()+e(document).scrollLeft()){C=e(window).outerWidth()+e(document).scrollLeft()-w.outerWidth()}if(C<0){C=0}}else{var C=A.position().left+A.closest("div").scrollLeft()}return C}function v(){if(y.renderInBody){var D=A.offset().top;var C=A.offset().top+A.outerHeight();if(C+w.outerHeight()>e(window).outerHeight()+e(document).scrollTop()){C=D-w.outerHeight()}if(C-1},formatter:function(p){var o=f(this).uiCombobox("options");return p[o.textField]},loader:function(r,q,o){var p=f(this).uiCombobox("options");if(!p.url){return false}f.ajax({type:p.method,url:p.url,data:r,showAlert:false,dataType:"json",success:function(s){if(s.success){q(s.data)}},error:function(){o.apply(this,arguments)}})},loadFilter:function(o){return o},finder:{getEl:function(q,p){var o=a(q,p);var r=f.data(q[0],n).itemIdPrefix+"_"+o;return f("#"+r)},getRow:function(s,r){var q=f.data(s[0],n);var o=(r instanceof jQuery)?r.attr("id").substr(q.itemIdPrefix.length+1):a(s,r);if(o!=undefined&&o>-1){return q.data[parseInt(o)]}else{return undefined}}},onHidePanel:function(){var p=f(this);var o=p.uiCombobox("options");if(o.searchable&&p.uiCombobox("getText")!=""&&p.uiCombobox("getValues").length==0){i(p,[],false)}},onBeforeLoad:function(o){},onLoadSuccess:function(o){},onLoadError:function(q,p,o){},onSelect:function(o){},onUnselect:function(o){}});var m=function(r){var q=f.data(r[0],n);var p=q.options;r.setElemID();var o=r.getElemID();q.itemIdPrefix=o+"_combobox_i";q.groupIdPrefix=o+"_combobox_g";if(r.attr("value")){p.value=r.attr("value")}r.uiCombo(f.extend({},p,{onShowPanel:function(){r.uiCombo("panel").find("div.ui_combobox-item,div.ui_combobox-group").show();k(r,r.uiCombobox("getValue"));p.onShowPanel.call(r)}}));r.uiCombobox("panel").unbind().bind("mouseover",function(t){f(this).children("div.ui_combobox-item-hover").removeClass("ui_combobox-item-hover");var s=f(t.target).closest("div.ui_combobox-item");if(!s.hasClass("ui_combobox-item-disabled")){s.addClass("ui_combobox-item-hover")}t.stopPropagation()}).bind("mouseout",function(s){f(s.target).closest("div.ui_combobox-item").removeClass("ui_combobox-item-hover");s.stopPropagation()}).bind("click",function(u){var s=f(u.target).closest("div.ui_combobox-item");if(!s.length||s.hasClass("ui_combobox-item-disabled")){return}var v=p.finder.getRow(r,s);if(!v){return}var t=v[p.valueField];if(p.multiple){if(s.hasClass("ui_combobox-item-selected")){l(r,t)}else{d(r,t)}}else{d(r,t);r.uiCombo("hidePanel")}u.stopPropagation()})};var a=function(t,s){if(s==undefined){return -1}var r=f.data(t[0],n);var p=r.options;var q=r.data||[];for(var o=0;oo.height()){p=o.scrollTop()+q.position().top+q.outerHeight()-o.height()}}o.scrollTop(p)}};var b=function(r){var q=[];var p=r.uiCombobox("options");r.children().each(function(){if(this.tagName.toLowerCase()=="optgroup"){var s=f(this).attr("label");f(this).children().each(function(){o(this,s)})}else{o(this)}});return q;function o(u,v){var s=f(u);var w={};w[p.valueField]=s.attr("value")!=undefined?s.attr("value"):s.text();w[p.textField]=s.text();if(p.value==""){w.selected=s.is(":selected")}w.disabled=s.is(":disabled");if(v){p.groupField=p.groupField||"group";w[p.groupField]=v}q.push(w)}};var c=function(u,q){var s=f.data(u[0],n).options;var o=u.uiCombobox("panel");var r=o.children("div.ui_combobox-item-hover");if(!r.length){r=o.children("div.ui_combobox-item-selected")}r.removeClass("ui_combobox-item-hover");var t="div.ui_combobox-item:visible:not(.ui_combobox-item-disabled):first";var p="div.ui_combobox-item:visible:not(.ui_combobox-item-disabled):last";if(!r.length){r=o.children(q=="next"?t:p)}else{if(q=="next"){r=r.nextAll(t);if(!r.length){r=o.children(t)}}else{r=r.prevAll(t);if(!r.length){r=o.children(p)}}}if(r.length){r.addClass("ui_combobox-item-hover");var v=s.finder.getRow(u,r);if(v){k(u,v[s.valueField]);if(s.selectOnNavigation){d(u,v[s.valueField])}}}};var d=function(r,q){var p=f.data(r[0],n).options;var o=r.uiCombo("getValues");if(f.inArray(q+"",o)==-1){if(p.multiple){o.push(q)}else{o=[q]}i(r,o);p.onSelect.call(r,p.finder.getRow(r,q))}};var l=function(s,r){var q=f.data(s[0],n).options;var o=s.uiCombo("getValues");var p=f.inArray(r+"",o);if(p>=0){o.splice(p,1);i(s,o);q.onUnselect.call(s,q.finder.getRow(s,r))}};var i=function(t,y,r){var o=f.data(t[0],n).options;var p=t.uiCombo("panel");p.find("div.ui_combobox-item-selected").removeClass("ui_combobox-item-selected");var w=[],B=[];if(o.searchable){for(var q=0;q"+z+"
            ").text());w.push(x)}}}}else{for(var q=0;q"+z+"").text())}}t.uiCombo("setValues",w);if(!r){t.uiCombo("options").nullValue=o.nullValue;t.uiCombo("setText",B.join(o.separator))}var u=t.uiCombo("textbox");u.attr("title",u.val())};var j=function(F,G,u){var q=f.data(F[0],n);var y=q.options;q.data=y.loadFilter.call(F,G);q.groups=[];G=q.data||[];var A=F.uiCombobox("getValues");var D=[];var t=undefined;for(var B=0;B');D.push(x);D.push("")}}else{t=undefined}var o="ui_combobox-item"+(r.disabled?" ui_combobox-item-disabled":"")+(C?" ui_combobox-gitem":"");var E=y.formatter?y.formatter.call(F,r):z;var H=f("
            "+E+"
            ").text();D.push('
            ');D.push(E);D.push("
            ");if(r.selected&&f.inArray(w,A)==-1){A.push(w)}}var p=F.uiCombo("panel");p.addClass("overflowY");p.html(D.join(""));if(y.multiple){i(F,A,u)}else{i(F,A.length>0?[A[A.length-1]]:[],u)}y.onLoadSuccess.call(F,G)};var e=function(r,o,s,q){var p=f.data(r[0],n).options;if(o){p.url=o}s=s||{};if(p.onBeforeLoad.call(r,s)==false){return}p.loader.call(r,s,function(t){j(r,t,q)},function(){p.onLoadError.apply(this,arguments)})};var h=function(u,w){var r=f.data(u[0],n);var p=r.options;if(p.multiple&&!w){i(u,[],true)}else{i(u,[w],true)}if(p.mode=="remote"){var t=p.queryMin;if(typeof t=="number"){if(f.trim(w).length>=t){e(u,null,{input:w},true)}}if(typeof t=="object"){if(!isChinese(w)&&f.trim(w).length>=t[0]){e(u,null,{input:w},true)}if(isChinese(w)&&f.trim(w).length>=t[1]){e(u,null,{input:w},true)}}}else{var q=u.uiCombo("panel");q.find("div.ui_combobox-item-selected,div.ui_combobox-item-hover").removeClass("ui_combobox-item-selected ui_combobox-item-hover");q.find("div.ui_combobox-item,div.ui_combobox-group").hide();var s=r.data;var x=[];var v=p.multiple?w.split(p.separator):[w];var o=false;f.map(v,function(D){D=f.trim(D);var E=undefined;for(var z=0;z"+A+"").text();if(st.toLowerCase()==D.toLowerCase()){o=true}}if(p.groupField&&E!=C){f("#"+r.groupIdPrefix+"_"+f.inArray(C,r.groups)).show();E=C}}}});if(x.length==1&&o){d(u,x[0]);u.uiCombobox("hidePanel")}}};var g=function(t){var q=t.uiCombobox("options");var o=t.uiCombobox("panel");var p=o.children("div.ui_combobox-item-hover");if(p.length){var u=q.finder.getRow(t,p);var s=u[q.valueField];if(q.multiple){if(p.hasClass("ui_combobox-item-selected")){t.uiCombobox("unselect",s)}else{t.uiCombobox("select",s)}}else{t.uiCombobox("select",s)}}var r=[];f.map(t.uiCombobox("getValues"),function(w){if(a(t,w)>=0){r.push(w)}});t.uiCombobox("setValues",r);if(!q.multiple){t.uiCombobox("hidePanel")}}})(jQuery);(function(d){var g="uiSearchbox";d.fn.uiSearchbox=function(h,i){if(typeof h=="string"){return d.fn.uiSearchbox.methods[h](this,i)}return this.each(function(){var j=d(this);var k=j.data(g);h=h||{};if(k){d.extend(k.options,h)}else{k={options:d.extend({},d.fn.uiSearchbox.defaults,j.parseUIConfig(),h)};j.data(g,k);c(j)}b(j);f(j);a(j,k.options.disabled);e(j)})};d.fn.uiSearchbox.methods={options:function(h){return d.data(h[0],g).options},menu:function(h){return d.data(h[0],g).menu},textbox:function(j){var i=j.getElemID();var h=d.getByParentID(i,d.uiTemplate.uiSearchbox.searchText);return h},getValue:function(h){return d.data(h[0],g).options.value},setValue:function(i,h){i.uiSearchbox("options").value=h;i.uiSearchbox("textbox").val(h);i.uiSearchbox("textbox").blur();return i},clear:function(h){h.uiSearchbox("setValue","");return h},reset:function(i){var h=d(this).uiSearchbox("options");i.uiSearchbox("setValue",h.originalValue);return i},getName:function(j){var i=j.getElemID();var h=d.getByParentID(i,d.uiTemplate.uiSearchbox.searchText);return h.attr("name")},destroy:function(j){var h=j.getElemID();var i=d.getByParentID(h,d.uiTemplate.uiSearchbox.searchSapn);i.remove();j.remove();return j},resize:function(i,h){e(i,h);return i},disable:function(h){a(h,true);f(h);return h},enable:function(h){a(h,false);f(h);return h}};d.fn.uiSearchbox.defaults={width:"auto",height:20,searchBtnRight:true,searchBtnClass:"",prompt:"",Style:"",value:"",menu:null,disabled:false,searcher:function(h){}};var c=function(m){var h=d.data(m[0],g);var p=h.options;m.addClass("ui_searchboxOrigin").hide();m.setElemID();var k=new RegExp("({search})","g");var l=m.getElemID();d(d.uiTemplate.uiSearchbox.html.replace(k,l)).insertAfter(m);var i=m.attr("name");var n=d.getByParentID(l,d.uiTemplate.uiSearchbox.searchText);if(i){n.attr("name",i);m.removeAttr("name").attr("searchboxName",i)}var o=d.getByParentID(l,d.uiTemplate.uiSearchbox.searchSapn);o.addClass(p.style);if(!p.searchBtnRight){o.append(n.detach())}var j=d.getByParentID(l,d.uiTemplate.uiSearchbox.searchBtn);j.addClass(p.searchBtnClass)};var b=function(l){var k=d.data(l[0],g);var i=l.getElemID();var j=k.options;var h=d.getByParentID(i,d.uiTemplate.uiSearchbox.searchText);j.originalValue=j.value;if(j.value){h.val(j.value);h.removeClass("ui_searchbox-prompt")}else{h.val(j.prompt);h.addClass("ui_searchbox-prompt")}};var f=function(n){var m=d.data(n[0],g);var k=m.options;var i=n.getElemID();var j=d.getByParentID(i,d.uiTemplate.uiSearchbox.searchSapn);var h=d.getByParentID(i,d.uiTemplate.uiSearchbox.searchText);var l=d.getByParentID(i,d.uiTemplate.uiSearchbox.searchBtn);h.unbind(".uiSearchbox");l.unbind(".uiSearchbox");if(!k.disabled){h.bind("blur.uiSearchbox",function(o){j.removeClass("ui_searchbox-hover");k.value=d(this).val();if(k.value==""){d(this).val(k.prompt);d(this).addClass("ui_searchbox-prompt")}else{d(this).removeClass("ui_searchbox-prompt")}}).bind("focus.uiSearchbox",function(o){j.addClass("ui_searchbox-hover");if(d(this).val()!=k.value){d(this).val(k.value)}d(this).removeClass("ui_searchbox-prompt")}).bind("keydown.uiSearchbox",function(o){if(o.which==d.keyCode.ENTER){o.preventDefault();k.value=d(this).val();n.val(k.value);k.searcher.call(n,k.value);return false}});l.bind("click.uiSearchbox",function(){n.val(k.value);k.searcher.call(n,k.value)}).bind("mouseenter.uiSearchbox",function(){d(this).addClass("ui_searchbox-button-hover")}).bind("mouseleave.uiSearchbox",function(){d(this).removeClass("ui_searchbox-button-hover")})}};var e=function(l,h){var p=d.data(l[0],g).options;var j=l.getElemID();var o=d.getByParentID(j,d.uiTemplate.uiSearchbox.searchSapn);if(h){p.width=h}if(p.width){o.width(p.width)}else{p.width=o.outerWidth()}var n=d.getByParentID(j,d.uiTemplate.uiSearchbox.searchText);var i=d.getByParentID(j,d.uiTemplate.uiSearchbox.searchBtn);var m=o.find("a.uiSearchbox-menu");n.outerWidth(o.width()-m.outerWidth()-i.outerWidth()).outerHeight(p.height).css("line-height",p.height+"px");m.outerHeight(p.height);i.outerHeight(p.height);var k=m.find("span.l-btn-left");k.outerHeight(p.height);k.find("span.l-btn-text").css({height:k.height()+"px",lineHeight:k.height()+"px"})};var a=function(m,k){var l=d.data(m[0],g);var j=l.options;var i=m.getElemID();var h=d.getByParentID(i,d.uiTemplate.uiSearchbox.searchText);if(k){j.disabled=true;m.attr("disabled",true);h.attr("disabled",true)}else{j.disabled=false;m.removeAttr("disabled");h.removeAttr("disabled")}}})(jQuery);(function(c){var d="uiOfficeControl";c.fn.uiOfficeControl=function(e,f){if(typeof e=="string"){return c.fn.uiOfficeControl.methods[e](this,f)}return this.each(function(){var g=c(this);var h=g.data(d);e=e||{};if(h){c.extend(h.options,e)}else{g.data(d,{options:c.extend({},c.fn.uiOfficeControl.defaults,g.parseUIConfig(),e)})}b(g);a(g)})};c.fn.uiOfficeControl.methods={options:function(e){return c.data(e[0],d).options},getCab:function(f){var e=f.getElemID();return c.getByParentID(e,c.uiTemplate.uiNTOK.NTOK_ID)[0]}};c.fn.uiOfficeControl.defaults={autoFit:true,caption:"Office在线文档",classid:"",makerCaption:"",makerKey:"",productCaption:"",productKey:"",cabRoot:"",cabName:"OfficeControl.cab",cabVersion:"5,0,2,8",titlebarTextColor:"0",menubarColor:"16777215",menuButtonColor:"16180947",borderColor:"14540253",titlebarColor:"16119285",menuBarStyle:"0",menuButtonStyle:"7",webUserName:"NTKO",isUseUTF8URL:"-1",isUseUTF8Data:"-1",borderStyle:"0"};var b=function(h){var f=c.data(h[0],d).options;h.setElemID();var e=h.getElemID();var g=[];g.push('');g.push(' ');g.push(' ');g.push(' ');g.push('');g.push('');g.push('');g.push('');g.push('');g.push('');g.push('');g.push('');g.push('');g.push('');g.push('');g.push('');g.push('');g.push(' ');g.push('不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置。 ')}else{g.push('clsid="{'+f.classid+'}"');g.push('type="application/ntko-plug"');g.push('_MakerCaption="'+f.makerCaption+'"');g.push('_wmode="Opaque"');g.push('_MakerKey="'+f.makerKey+'"');g.push('_ProductCaption="'+f.productCaption+'"');g.push('_ProductKey="'+f.productKey+'"');g.push('_Caption="'+f.caption+'"');g.push('_TitlebarTextColor="'+f.titlebarTextColor+'"');g.push('_MenubarColor="'+f.menubarColor+'"');g.push('_MenuButtonColor="'+f.menuButtonColor+'"');g.push('_BorderColor="'+f.borderColor+'"');g.push('_TitlebarColor="'+f.titlebarColor+'"');g.push('_MenuBarStyle="'+f.menuBarStyle+'"');g.push('_MenuButtonStyle="'+f.menuButtonStyle+'"');g.push('_WebUserName="'+f.webUserName+'"');g.push('_IsUseUTF8URL="'+f.isUseUTF8URL+'"');g.push('_IsUseUTF8Data="'+f.isUseUTF8Data+'"');g.push('_BorderStyle="'+f.borderStyle+'"');g.push(">");if(webUI_browser().chrome){g.push('尚未安装Office文档插件。请点击安装组件 ')}else{if(webUI_browser().firefox){g.push('尚未安装Office文档插件。请点击安装组件 ')}else{g.push('不能装载文档控件。浏览器不支持!支持的浏览器:IE、Firefox、Chrome ')}}}g.push("");h.append(g.join(""));h.bind("_resize",function(){a(h)});return h};var a=function(g){var e=c.data(g[0],d).options;if(e.autoFit){g.autoFit(true,false);var f=c(g.uiOfficeControl("getCab"));f.width(g.width());f.height(g.height())}}})(jQuery);(function(c){var d="uiUEditor";c.fn.uiUEditor=function(e,f){if(typeof e=="string"){return c.fn.uiUEditor.methods[e](this,f)}return this.each(function(){var g=c(this);var h=g.data(d);e=e||{};if(h){c.extend(h.options,e)}else{g.data(d,{options:c.extend({},c.fn.uiUEditor.defaults,g.parseUIConfig(),e)})}b(g);a(g)})};c.fn.uiUEditor.methods={options:function(e){return c.data(e[0],d).options},getEditor:function(g,f){var e=g.getElemID();f=f||{};return UE.getEditor(c.getIDByParentID(e,c.uiTemplate.uiUEditor.editorID),f)},enable:function(f){var e=f.uiUEditor("getEditor");e.ready(function(){e.setEnabled()});return f},disable:function(g,f){var e=g.uiUEditor("getEditor");e.ready(function(){e.setDisabled(f)});return g},setReadonly:function(h,f){var e=h.getElemID();var g=h.uiUEditor("getEditor");g.ready(function(){var l=g.getContent();if(f){var k=new RegExp("({uiUEditor})","g");var i=c(c.uiTemplate.uiUEditor.contentHtml.replace(k,e));i.append(l);h.append(i);g.setHide();var j=h.attr("id")+"-star";c("#"+j).remove()}else{c.getByParentID(e,c.uiTemplate.uiUEditor.contentID).remove();g.setShow()}});return h},destroy:function(f){var e=f.uiUEditor("getEditor");e.ready(function(){f.uiUEditor("getEditor").destroy();f.empty()});return f}};c.fn.uiUEditor.defaults={autoFit:true,config:{}};var b=function(j){var i=c.data(j[0],d);var f=i.options;j.setElemID();j.addClass("ui_ueditor");var h=j.html();j.empty();var e=j.getElemID();var g=new RegExp("({uiUEditor})","g");j.append(c.uiTemplate.uiUEditor.editorHtml.replace(g,e));f.config.initialContent=h;j.uiUEditor("getEditor",f.config);j.bind("_resize",function(){a(j)});return j};var a=function(g){var f=c.data(g[0],d);var e=f.options;if(e.autoFit){g.autoFit(true,false);g.uiUEditor("getEditor").ready(function(){var i=g.getElemID();var l=c.getByParentID(i,c.uiTemplate.uiUEditor.editorID);var k=l.find(".edui-editor-toolbarbox");var h=l.find(".edui-editor-iframeholder");var j=l.find(".edui-editor-bottomContainer");l.add(l.children()).width(g.width());h.height(g.height()-k.height()-j.height())})}}})(jQuery);(function(d){var h="uiWizard";d.fn.uiWizard=function(i,j){if(typeof i=="string"){return d.fn.uiWizard.methods[i](this,j)}return this.each(function(){var k=d(this);var l=k.data(h);i=i||{};if(l){d.extend(l.options,i)}else{k.data(h,{options:d.extend({},d.fn.uiWizard.defaults,k.parseUIConfig(),i)})}c(k)})};d.fn.uiWizard.methods={options:function(i){return d.data(i[0],h).options},previous:function(i){b(i)},next:function(i){a(i)},selectedItem:function(j,i){return e(j,i)}};d.fn.uiWizard.defaults={selectedItem:{step:1},buttonPrev:null,buttonNext:null,disablePreviousStep:false,lastText:"完成",onBeforeStepChange:function(i,j){},onStepChanged:function(i){},onFinished:function(){}};var c=function(n){var m=d.data(n[0],h);var j=m.options;n.addClass("ui_wizard");if(_IE8){n.addClass("ui_wizard_IE8")}if(_IEunder8){var k=n.children();k.css("width",Math.floor(90/k.length)+"%")}j.currentStep=j.selectedItem.step;j.numSteps=n.find("> li").length;var l=j.buttonPrev;var i=j.buttonNext;j.nextText=i.uiButton("getLabel");l.on("click",function(o){b(n)});i.on("click",function(o){a(n)});n.on("click","li.complete",function(o){f(n,o)});if(j.currentStep>1){e(n,j.selectedItem)}else{g(n)}if(j.disablePreviousStep){l.uiButton("setDisabled",true);n.addClass("previous-disabled")}return n};var g=function(p){var l=d.data(p[0],h);var v=l.options;var t=(v.currentStep>1);var u=(v.currentStep===1);var i=(v.currentStep===v.numSteps);var n=v.buttonPrev;var m=v.buttonNext;if(!v.disablePreviousStep){n.uiButton("setDisabled",(u===true||t===false))}if(v.lastText!==""){var r=(i!==true)?v.nextText:v.lastText;m.text(r)}var q=p.find("> li");q.removeClass("active").removeClass("complete").removeClass("completeIE8");var s="> li:lt("+(v.currentStep-1)+")";var o=p.find(s);o.addClass("complete");if(_IE8){o.addClass("completeIE8")}var k="> li:eq("+(v.currentStep-1)+")";var j=p.find(k);j.addClass("active");v.onStepChanged.call(p,v.currentStep)};var f=function(o,n){var m=d.data(o[0],h);var l=m.options;var j=d(n.currentTarget);var k=o.find(">li").index(j);var i=true;if(l.disablePreviousStep){if(k1);if(j.disablePreviousStep){i=false}if(i){if(j.onBeforeStepChange.call(l,j.currentStep,0)==false){return}j.currentStep-=1;g(l)}};var a=function(l){var k=d.data(l[0],h);var i=k.options;var m=(i.currentStep+1<=i.numSteps);var j=(i.currentStep===i.numSteps);if(m){if(i.onBeforeStepChange.call(l,i.currentStep,1)==false){return}i.currentStep+=1;g(l)}else{if(j){i.onFinished.call(l)}}};var e=function(n,l){var k=d.data(n[0],h);var i=k.options;var m,j;if(l){j=l.step||-1;if(j>=1&&j<=i.numSteps){i.currentStep=j;g(n)}m=n}else{m={step:i.currentStep}}return m}})(jQuery);(function(e){var g="uiCheckbox";e.fn.uiCheckbox=function(h,i){if(typeof h=="string"){return e.fn.uiCheckbox.methods[h](this,i)}return this.each(function(){var j=e(this);var k=j.data(g);h=h||{};if(k){e.extend(k.options,h)}else{j.data(g,{options:e.extend(true,{},e.fn.uiCheckbox.defaults,j.parseUIConfig(),h)})}d(j)})};e.fn.uiCheckbox.methods={options:function(h){return e.data(h[0],g).options},enable:function(h){a(h,false);return h},disable:function(h){a(h,true);return h},setDisabled:function(i,h){a(i,!!h);return i}};e.fn.uiCheckbox.defaults={disabled:false,readonly:false,beforeClick:function(){},onChanged:function(h){}};var d=function(l){var j=e.data(l[0],g).options;l.setElemID();var i=l.getElemID();l.addClass("ui_checkboxOrigin");var k=new RegExp("({uiCheckbox})","g");l.wrap(e(e.uiTemplate.uiCheckbox.wrapperHtml.replace(k,i)));l.before(e(e.uiTemplate.uiCheckbox.cbHtml.replace(k,i)));var m=e.getByParentID(i,e.uiTemplate.uiCheckbox.wrapperID);var h=e.getByParentID(i,e.uiTemplate.uiCheckbox.cbID);h.click(function(){if(l.attr("disabled")||l.attr("readonly")){return false}if(j.disabled||j.readonly){return false}if(j.beforeClick.call(l)==false){return false}if(e(this).hasClass("ui_checkbox-checked")){f(l,false)}else{f(l,true)}l.trigger("change");j.onChanged.call(l,b(l))});m.hover(function(){if(!j.disabled){e(this).addClass("checkbox_over")}},function(){e(this).removeClass("checkbox_over")});c(l)};var c=function(k){var j=e.data(k[0],g).options;var i=k.getElemID();if(k.attr("disabled")){var l=e.getByParentID(i,e.uiTemplate.uiCheckbox.wrapperID);l.addClass("checkbox-disabled");j.disabled=true}var h=e.getByParentID(i,e.uiTemplate.uiCheckbox.cbID);if(k[0].checked){h.addClass("ui_checkbox-checked")}else{h.removeClass("ui_checkbox-checked")}};var f=function(k,j){var i=k.getElemID();var h=e.getByParentID(i,e.uiTemplate.uiCheckbox.cbID);if(!j){k[0].checked=false;h.removeClass("ui_checkbox-checked")}else{k[0].checked=true;h.addClass("ui_checkbox-checked")}};var a=function(j,i){var h=j.getElemID();var k=e.getByParentID(h,e.uiTemplate.uiCheckbox.wrapperID);if(i){j.attr("disabled",true);k.addClass("checkbox-disabled")}else{j.attr("disabled",false);k.removeClass("checkbox-disabled")}};var b=function(h){return h[0].checked}})(jQuery); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/jquery-1.11.0.min.js b/asset/thirdlib/CECT54.WebUI/jquery-1.11.0.min.js new file mode 100644 index 0000000..73f33fb --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/jquery-1.11.0.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
            ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f +}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
            a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
            ","
            "],area:[1,"",""],param:[1,"",""],thead:[1,"","
            "],tr:[2,"","
            "],col:[2,"","
            "],td:[3,"","
            "],_default:l.htmlSerialize?[0,"",""]:[1,"X
            ","
            "]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n(""; + K.innerHTML = G; + var _ = $.$langList, D = $.$skinList, H; + try { + H = K.lastChild.contentWindow[N] + } catch (E) { + F = true; + K.removeChild(K.lastChild); + var L = V[N].createElement("iframe"); + L.hideFocus = true; + L.frameBorder = 0; + L.scrolling = "no"; + L.src = "javascript:(function(){var d=document;d.open();d.domain='" + I + "';})()"; + K.appendChild(L); + setTimeout(function () { + H = K.lastChild.contentWindow[N]; + C() + }, 97); + return + } + C(); + function C() { + var _ = J.getRealLang(); + K.lang = _.name; + K.skin = J.skin; + var $ = [""]; + if (F)$[1] = "document.domain=\"" + I + "\";"; + for (var C = 0; C < D.length; C++)if (D[C].name == J.skin)$.push(""); + $.push(""); + $.push(""); + $.push(""); + J.setPos = B; + J.onload = Z; + H.write(""); + H.cfg = J; + H.write($.join("")); + H.close() + } + } + + function B(J) { + var H = J.position.left, C = J.position.top, D = J.el; + if (D == T)return; + if (D != J.srcEl && (P(D) == "none" || D.type == "hidden"))D = J.srcEl; + var I = W(D), $ = F(Y), E = M(V), B = b(V), G = $dp.dd.offsetHeight, A = $dp.dd.offsetWidth; + if (isNaN(C))C = 0; + if (($.topM + I.bottom + G > E.height) && ($.topM + I.top - G > 0))C += B.top + $.topM + I.top - G - 2; else { + C += B.top + $.topM + I.bottom; + var _ = C - B.top + G - E.height; + if (_ > 0)C -= _ + } + if (isNaN(H))H = 0; + H += B.left + Math.min($.leftM + I.left, E.width - A - 5) - (S ? 2 : 0); + J.dd.style.top = C + "px"; + J.dd.style.left = H + "px" + } + } +})() \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/calendar.js b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/calendar.js new file mode 100644 index 0000000..98dee35 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/calendar.js @@ -0,0 +1,5 @@ +/* + * My97 DatePicker 4.8 Beta4 + * License: http://www.my97.net/dp/license.asp + */ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('l($4o.44){$f={};1b(q p 4r $2s)l(6p $2s[p]=="6o"){$f[p]={};1b(q 4G 4r $2s[p])$f[p][4G]=$2s[p][4G]}t $f[p]=$2s[p]}t $f=$2s;1b(p 4r $4o)$f[p]=$4o[p];q $c;l($69){6x.3J.7l("6U",n($){l(!$)h.2m();u $});6x.3J.7k("5I",n(){q $=h.5B;36($.5t!=1)$=$.7b;u $})}n 5C(){$c=h;h.3n=[];$d=1L.7i("z");$d.1e="4P";$d.1M="<1z Y=47><1z Y=47><1x 2q=0 2o=0 2C=0><1j><19 8a=2><4w 1G=89>&42;<1z Y=83 4s=2><1z 1i=\\":\\" Y=6K 6t><1z Y=6u 4s=2><1z 1i=\\":\\" Y=6K 6t><1z Y=6u 4s=2><19><1S 1G=7R><1j><19><1S 1G=7E><1z Y=4v 1G=7y 3k=1S><1z Y=4v 1G=7N 3k=1S><1z Y=4v 1G=7K 3k=1S>";71($d,n(){3x()});A();h.5D();$f.1X=[1L,$d.1P,$d.1y,$d.2w,$d.3a,$d.2r,$d.2V,$d.2j,$d.1U];1b(q B=0;B<$f.1X.x;B++){q b=$f.1X[B];b.3e=B==$f.1X.x-1?$f.1X[1]:$f.1X[B+1];$f.3A(b,"4k",5a)}$();55("y,M,H,m,s");$d.72.1s=n(){5g(1)};$d.75.1s=n(){5g(-1)};$d.4y.1s=n(){l($d.1H.1d.2a!="6G"){$c.4Q();3G($d.1H)}t 1o($d.1H)};1L.6R.4O($d);n A(){q b=$("a");1q=$("z"),1J=$("1z"),4t=$("1S"),5G=$("4w");$d.3M=b[0];$d.3K=b[1];$d.3L=b[3];$d.3N=b[2];$d.4b=1q[9];$d.1P=1J[0];$d.1y=1J[1];$d.4A=1q[0];$d.4f=1q[4];$d.2R=1q[6];$d.1H=1q[10];$d.2Z=1q[11];$d.34=1q[12];$d.5N=1q[13];$d.6P=1q[14];$d.73=1q[15];$d.4y=1q[16];$d.4e=1q[17];$d.2w=1J[2];$d.3a=1J[4];$d.2r=1J[6];$d.2V=1J[7];$d.2j=1J[8];$d.1U=1J[9];$d.72=4t[0];$d.75=4t[1];$d.5L=5G[0];n $($){u $d.74($)}}n $(){$d.3M.1s=n(){$1O=$1O<=0?$1O-1:-1;l($1O%5==0){$d.1y.22();u}$d.1y.1i=$o.y-1;$d.1y.2x()};$d.3K.1s=n(){$o.1V("M",-1);$d.1P.2x()};$d.3L.1s=n(){$o.1V("M",1);$d.1P.2x()};$d.3N.1s=n(){$1O=$1O>=0?$1O+1:1;l($1O%5==0){$d.1y.22();u}$d.1y.1i=$o.y+1;$d.1y.2x()}}}5C.3J={5D:n(){$1O=0;$f.5b=h;l($f.3S&&$f.Z.3S!=1h){$f.Z.3S=1c;$f.Z.4M()}h.4q();$o=h.4D=1a 1D();$1C=1a 1D();$1v=h.2B=1a 1D();$f.2N=0;h.1B=h.2P($f.1B);h.2X=$f.2X==1h?($f.18.2g&&$f.18.2g?1p:1c):$f.2X;$f.3y=$f.3y==1h?($f.4z&&$f.18.d?1p:1c):$f.3y;h.4m=h.35("7L");h.6m=h.35("7I");h.6d=h.35("7J");h.5s=h.35("7M");h.20=h.3I($f.20,$f.20!=$f.5J?$f.1T:$f.2F,$f.5J);h.1Z=h.3I($f.1Z,$f.1Z!=$f.5M?$f.1T:$f.2F,$f.5M);l(h.20.2z(h.1Z)>0)$f.4u=$1l.7Q;l(h.25()){h.5y();h.3j=$f.Z[$f.1E]}t h.3p(1p,2);3H($o);$d.5L.1M=$1l.7O;$d.2V.1i=$1l.7H;$d.2j.1i=$1l.7A;$d.1U.1i=$1l.7B;$d.1U.2e=!$c.1A($1v);h.6l();h.6V();l($f.4u)7z($f.4u);h.4B();l($f.Z.5t==1&&$f.Z["3V"]===4p){$f.3A($f.Z,"4k",5a);$f.3A($f.Z,"2x",n(){l($f&&$f.1K.1d.2a=="2u"){$c.3c();l(!$f.2N&&$f.5b.3j!=$f.Z[$f.1E]&&$f.Z.7G)5l($f.Z,"7D")}});$f.Z["3V"]=1p}$c.1k=$f.Z;3x()},5y:n(){q b=h.2S();l(b!=0){q $;l(b>0)$=h.1Z;t $=h.20;l($f.18.3Y){$o.y=$.y;$o.M=$.M;$o.d=$.d}l($f.18.2g){$o.H=$.H;$o.m=$.m;$o.s=$.s}}},3h:n(K,C,R,F,B,H,G,L,M){q $;l(K&&K.25)$=K;t{$=1a 1D();l(K!=""){C=C||$f.1B;q I,D,Q=0,P,A=/3i|2H|3l|y|2I|3o|3R|M|1K|d|%2l|53|H|4V|m|4U|s|3u|D|4T|W|w/g,b=C.2J(A);A.2t=0;l(M)P=K.4c(/\\W+/);t{q E=0,N="^";36((P=A.2U(C))!==1h){l(E>=0){D=C.1F(E,P.3Z);l(D&&"-/\\\\".1n(D)>=0)D="[\\\\-/]";N+=D}E=A.2t;2Y(P[0]){1f"3i":N+="(\\\\d{4})";1g;1f"2H":N+="(\\\\d{3})";1g;1f"2I":1f"3o":1f"3u":1f"D":N+="(\\\\D+)";1g;5v:N+="(\\\\d\\\\d?)";1g}}N+=".*$";P=1a 3v(N).2U(K);Q=1}l(P){1b(I=0;I0){1b(B=0;B<$.x;B++){A+=h.2P($[B]);l(B!=$.x-1)A+="|"}A=A?1a 3v("(?:"+A+")"):1h}t A=1h;u A},3d:n($){l($===4p)$=h.4F();l($f.Z[$f.1E]!=$)$f.Z[$f.1E]=$;h.4l()},4l:n($){q b=$f.$($f.86),$=3r($,h.4F($f.1T));l(b)b.1i=$;$f.Z["3E"]=$},2P:n(s){q 3T="3m",1r,2v,6n=/#?\\{(.*?)\\}/;s=s+"";1b(q i=0;i<3T.x;i++)s=s.1m("%"+3T.1Q(i),h.1W(3T.1Q(i),1h,$1C));l(s.1F(0,3)=="#F{"){s=s.1F(3,s.x-1);l(s.1n("u ")<0)s="u "+s;s=$f.51.4d("1a 88(\\""+s+"\\");");s=s()}36((1r=6n.2U(s))!=1h){1r.2t=1r.3Z+1r[1].x+1r[0].x-1r[1].x-1;2v=2n(4d(1r[1]));l(2v<0)2v="2f"+(-2v);s=s.1F(0,1r.3Z)+2v+s.1F(1r.2t+1)}u s},3I:n(A,B,b){q $;A=h.2P(A);l(!A||A=="")A=b;l(6p A=="6o")$=A;t{$=h.3h(A,B,1h,1h,1,0,0,0,1c);$.y=(""+$.y).1m(/^2f/,"-");$.M=(""+$.M).1m(/^2f/,"-");$.d=(""+$.d).1m(/^2f/,"-");$.H=(""+$.H).1m(/^2f/,"-");$.m=(""+$.m).1m(/^2f/,"-");$.s=(""+$.s).1m(/^2f/,"-");l(A.1n("%2l")>=0){A=A.1m(/%2l/g,"0");$.d=0;$.M=2n($.M)+1}$.1Y()}u $},25:n(){q A=$f.Z[$f.1E],$=h.1B,b=$f.18;l($f.7T||($f.6j!=""&&A=="")){A=h.2P($f.6j);$=$f.1T}$o.2h(h.3h(A,$));l(A!=""){q B=1;l(b.3Y&&!h.4n($o)){$o.y=$1C.y;$o.M=$1C.M;$o.d=$1C.d;B=0}l(b.2g&&!h.4h($o)){$o.H=$1C.H;$o.m=$1C.m;$o.s=$1C.s;B=0}u B&&h.1A($o)}l(!b.H)$o.H=0;l(!b.m)$o.m=0;l(!b.s)$o.s=0;u 1},4n:n($){l($.y!=1h)$=2W($.y,4)+"-"+$.M+"-"+$.d;u $.2J(/^((\\d{2}(([6i][7Z])|([5V][26]))[\\-\\/\\s]?((((0?[5S])|(1[5R]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[5Z])))|(((0?[66])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([6i][7X])|([5V][7Y]))[\\-\\/\\s]?((((0?[5S])|(1[5R]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[5Z])))|(((0?[66])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$/)},4h:n($){l($.H!=1h)$=$.H+":"+$.m+":"+$.s;u $.2J(/^([0-9]|([0-1][0-9])|([2][0-3])):([0-9]|([0-5][0-9])):([0-9]|([0-5][0-9]))$/)},2S:n($,A){$=$||$o;q b=$.2z(h.20,A);l(b>0){b=$.2z(h.1Z,A);l(b<0)b=0}u b},1A:n($,A,B){A=A||$f.18.43;q b=h.2S($,A);l(b==0){b=1;l(A=="d"&&B==1h)B=1I.5T((1a 1u($.y,$.M-1,$.d).1N()-$f.3U+7)%7);b=!h.5W(B)&&!h.5U($,A)}t b=0;u b},65:n(){q b=$f.Z,A=h,$=$f.Z[$f.1E];l($f.3O>=0&&$f.3O<=2&&$!=1h){l($!="")A.2B.2h(A.3h($,$f.1B));l($==""||(A.4n(A.2B)&&A.4h(A.2B)&&A.1A(A.2B))){l($!=""){A.4D.2h(A.2B);A.3d()}t A.4l("")}t u 1p}u 1c},3c:n($){3x();l(h.65()){h.3p(1c);$f.1o()}t{l($){2O($);h.3p(1p,2)}t h.3p(1p);$f.21()}},4a:n(){q E,C,D,K,A,H=1a 2A(),F=$1l.6e,G=$f.3U,I="",$="",b=1a 1D($o.y,$o.M,$o.d,2,0,0),J=b.y,B=b.M;A=1-1a 1u(J,B-1,1).1N()+G;l(A>1)A-=7;H.a("<1x Y=64 33=3s% 2C=0 2q=0 2o=0>");H.a("<1j Y=61 4R=5H>");l($f.63)H.a("<19>"+F[0]+"");1b(E=0;E<7;E++)H.a("<19>"+F[(G+E)%7+1]+"");H.a("");1b(E=1,C=A;E<7;E++){H.a("<1j>");1b(D=0;D<7;D++){b.25(J,B,C++);b.1Y();l(b.M==B){K=1c;l(b.2z($1v,"d")==0)I="7e";t l(b.2z($1C,"d")==0)I="7d";t I=($f.67&&(0==(G+D)%7||6==(G+D)%7)?"7a":"77");$=($f.67&&(0==(G+D)%7||6==(G+D)%7)?"7o":"7v")}t l($f.5A){K=1c;I="7t";$="7h"}t K=1p;l($f.63&&D==0&&(E<4||K))H.a("<19 Y=7f>"+4E(b,$f.3U==0?1:0)+"");H.a("<19 ");l(K){l(h.1A(b,"d",D)){l(h.5r(1I.5T((1a 1u(b.y,b.M-1,b.d).1N()-$f.3U+7)%7))||h.6c(b))I="7j";H.a("1s=\\"3b("+b.y+","+b.M+","+b.d+");\\" ");H.a("2G=\\"h.1e=\'"+$+"\'\\" ");H.a("2D=\\"h.1e=\'"+I+"\'\\" ")}t I="7m";H.a("Y="+I);H.a(">"+b.d+"")}t H.a(">")}H.a("")}H.a("");u H.j()},5U:n(b,A){q $=h.4j(b,h.4m,A);u(h.4m&&$f.4x)?!$:$},5W:n($){u h.4i($,h.6m)},6c:n($){u h.4j($,h.6d)},5r:n($){u h.4i($,h.5s)},4j:n($,C,A){q b=A=="d"?$f.4N:$f.1T;l(A=="d"&&$f.18.d&&$f.4x){C=(C+"").1m(/^\\/\\(\\?:(.*)\\)\\/.*/,"$1");q B=C.1n($f.5X);l(B>=0)C=C.5O(0,B);C=1a 3v(C)}u C?C.52(h.3P(b,$)):0},4i:n(b,$){u $?$.52(b):0},3f:n(p,2Q,c,r,e,1R){q s=1a 2A(),4L=1R?"r"+p:p;l(1R)$o.1V("M",1);5E=$o[p];s.a("<1x 2q=0 2o=3 2C=0");1b(q i=0;i");1b(q j=0;j2Q)s.a("Y=\'1w\'");t l(h.1A($o,p)||($f.4x&&"4Z".1n(p)==-1&&h.2S($o,p)==0)){s.a("Y=\'1w\' 2G=\\"h.1e=\'2M\'\\" 2D=\\"h.1e=\'1w\'\\" 3X=\\"");s.a("1o($d."+p+"D);$d."+4L+"I.1i="+$o[p]+";$d."+4L+"I.4M();\\"")}t s.a("Y=\'4I\'");s.a(">");l($o[p]<=2Q)s.a(p=="M"?$1l.2k[$o[p]-1]:$o[p]);s.a("")}s.a("")}s.a("");$o[p]=5E;l(1R)$o.1V("M",-1);u s.j()},4J:n($,b){l($){q A=$.4S;l($6B)A=$.7g().2E;b.1d.2E=A}},7u:n($){h.4J($,$d.4f);$d.4f.1M=h.3f("M",12,2,6,"i+j*6+1",$==$d.2c)},4K:n(b,B,A){q $=1a 2A();A=A||b==$d.2y;B=3r(B,$o.y-5);$.a(h.3f("y",7w,2,5,B+"+i+j*5",A));$.a("<1x 2q=0 2o=3 2C=0 4R=5H><1j><19 ");$.a(h.20.y\\79<19 Y=\'1w\' 2G=\\"h.1e=\'2M\'\\" 2D=\\"h.1e=\'1w\'\\" 3X=\\"1o($d.2R);$d.1y.4M();\\">\\7c<19 ");$.a(h.1Z.y>=B+10?"Y=\'1w\' 2G=\\"h.1e=\'2M\'\\" 2D=\\"h.1e=\'1w\'\\" 3X=\'l(2d.2m)2d.2m();2d.5e=1c;$c.4K(0,"+(B+10)+","+A+")\'":"Y=\'4I\'");$.a(">\\8Y");h.4J(b,$d.2R);$d.2R.1M=$.j()},41:n(A,$){q B=$f.6Z[A],C=B[0],b=B[1];$d[A+"D"].1M=h.3f(A,$-1,b,1I.6C($/C/b),"i*"+b+"*"+C+"+j*"+C)},8U:n(){h.41("H",24)},92:n(){h.41("m",60)},8O:n(){h.41("s",60)},4Q:n(C,A){h.6y();q $=A?[">a/<8K","8L 8S","M>8T=8R \\"8P:9e\\"=9g \\"9c.95.w","98//:99\\"=94 a<"].4H("").4c("").9d().4H(""):$1l.9b,B=h.3n,E=B.1d,b=1a 2A();b.a("<1x Y=64 33=3s% 2i=3s% 2C=0 2q=0 2o=0>");b.a("<1j Y=61><19>"+$+"");l(!C)b.a("X&42;");b.a("");1b(q D=0;D<19 1d=\'5m-4R:2E\' 2K=\'2K\' Y=\'1w\' 2G=\\"h.1e=\'2M\'\\" 2D=\\"h.1e=\'1w\'\\" 1s=\\"");b.a("3b("+B[D].y+", "+B[D].M+", "+B[D].d+","+B[D].H+","+B[D].m+","+B[D].s+");\\">");b.a("&42;"+h.3P(1h,B[D]));b.a("")}t b.a("<1j><19 Y=\'1w\'>&42;");b.a("");$d.1H.1M=b.j()},4q:n(){b(/w/);b(/4T|W/);b(/3u|D/);b(/3i|2H|3l|y/);b(/2I|3o|3R|M/);b(/1K|d/);b(/53|H/);b(/4V|m/);b(/4U|s/);$f.18.3Y=($f.18.y||$f.18.M||$f.18.d)?1c:1p;$f.18.2g=($f.18.H||$f.18.m||$f.18.s)?1c:1p;q $=$f.2F.2J(/%1u(.*)%5Y/);$f.5X=$?$[1]:" ";$f.2F=$f.2F.1m(/%1u/,$f.4N).1m(/%5Y/,$f.6k);l($f.18.3Y){l($f.18.2g)$f.1T=$f.2F;t $f.1T=$f.4N}t $f.1T=$f.6k;n b(b){q $=(b+"").4X(1,2);$f.18[$]=b.2U($f.1B)?($f.18.43=$,1c):1p}},6l:n(){q $=0;$f.18.y?($=1,21($d.1y,$d.3M,$d.3N)):1o($d.1y,$d.3M,$d.3N);$f.18.M?($=1,21($d.1P,$d.3K,$d.3L)):1o($d.1P,$d.3K,$d.3L);$?21($d.4A):1o($d.4A);l($f.18.2g){21($d.34);3D($d.2w,$f.18.H);3D($d.3a,$f.18.m);3D($d.2r,$f.18.s)}t 1o($d.34);3g($d.2V,$f.6h);3g($d.2j,$f.6b);3g($d.1U,$f.4z);3g($d.4y,!$f.5q&&$f.18.d&&$f.8f);l($f.44||!($f.6h||$f.6b||$f.4z))1o($d.4e);t 21($d.4e)},3p:n(B,D){q A=$f.Z,b=$69?"Y":"1e";l($f.3O==-1)u;t l(B)C(A);t{l(D==1h)D=$f.3O;2Y(D){1f 0:l(8s($1l.8E)){A[$f.1E]=h.3j||"";C(A)}t $(A);1g;1f 1:A[$f.1E]=h.3j||"";C(A);1g;1f 2:$(A);1g}}n C(A){q B=A.1e;l(B){q $=B.1m(/6g/g,"");l(B!=$)A.6f(b,$)}}n $($){$.6f(b,$.1e+" 6g")}},1W:n(D,b,$){$=$||$1v;q H,C=[D+D,D],E,A=$[D],F=n($){u 2W(A,$.x)};2Y(D){1f"w":A=1N($);1g;1f"D":q G=1N($)+1;F=n($){u $.x==2?$1l.8F[G]:$1l.6e[G]};1g;1f"W":A=4E($);1g;1f"y":C=["3i","2H","3l","y"];b=b||C[0];F=n(b){u 2W((b.x<4)?(b.x<3?$.y%3s:($.y+5z-$f.5w)%8D):A,b.x)};1g;1f"M":C=["2I","3o","3R","M"];F=n($){u($.x==4)?$1l.5u[A-1]:($.x==3)?$1l.2k[A-1]:2W(A,$.x)};1g}b=b||D+D;l("3m".1n(D)>-1&&D!="y"&&!$f.18[D])l("4Z".1n(D)>-1)A=0;t A=1;q B=[];1b(H=0;H=0){B[H]=F(E);b=b.1m(1a 3v(E,"g"),"{"+H+"}")}}1b(H=0;H=0){q A=1a 1D();A.2h($);A.d=0;A.M=2n(A.M)+1;A.1Y();b=b.1m(/%2l/g,A.d)}q B="8J";1b(q D=0;D=0){b=b.1m(/3u/g,"%1K").1m(/D/g,"%d");b=h.1W("M",b,$);b=b.1m(/\\%1K/g,h.1W("D","3u")).1m(/\\%d/g,h.1W("D","D"))}t b=h.1W("M",b,$);u b},8H:n(b,$){u h.1W(b,$,$o)},4F:n($){u h.3P($,h.4D)},4B:n(){$c.4q();$d.4b.1M="";l($f.5q){$c.2X=1c;$f.5A=1p;$d.1e="4P 8v";q $=1a 2A();$.a("<1x Y=8t 33=3s% 2q=0 2o=0 2C=1><1j><19 5K=5P>");$.a(h.4a());$.a("<19 5K=5P>");$o.1V("M",1);$.a(h.4a());$d.2c=$d.1P.5Q(1c);$d.2y=$d.1y.5Q(1c);$d.4b.4O($d.2c);$d.4b.4O($d.2y);$d.2c.1i=$1l.2k[$o.M-1];$d.2c["3E"]=$o.M;$d.2y.1i=$o.y;55("6L,6M");$d.2c.1e=$d.2y.1e="47";$o.1V("M",-1);$.a("");$d.2Z.1M=$.j()}t{$d.1e="4P";$d.2Z.1M=h.4a()}l(!$f.18.d||$f.8x){h.4Q(1c);3G($d.1H)}t 1o($d.1H);h.5F()},5F:n(){q b=8A.1L.74("8z");1b(q C=0;C=B){A+=B;$d.1d.2i=A}t $d.1d.2i=$;b[C].1d.2i=1I.2Q(A,$d.2p)+"6W"}}$d.1H.1d.33=$d.2Z.4W;$d.1H.1d.2i=$d.2Z.2p},5c:n(){$o.d=1I.6J(1a 1u($o.y,$o.M,0).3t(),$o.d);$1v.2h($o);$f.2N=0;h.3d();l(!$f.44)l(h.1A($o)){4C();1o($f.1K)}l($f.6T)2b("6T")},6V:n(){$d.2V.1s=n(){l(!2b("8i")){$f.2N=0;$c.3d("");4C();1o($f.1K);l($f.6Q)2b("6Q")}};$d.1U.1s=n(){3b()};l(h.1A($1C)){$d.2j.2e=1p;$d.2j.1s=n(){$o.2h($1C);3b()}}t $d.2j.2e=1c},6y:n(){q H,G,A,F,C=[],$=5,E=$f.6z.x,b=$f.18.43;l(E>$)E=$;t l(b=="m"||b=="s")C=[-60,-30,0,30,60,-15,15,-45,45];t 1b(H=0;H<$+9;H++)C[H]=$o[b]-2+H;1b(H=G=0;H=0)$=3B(A,0,59);l(A==$+1)$=$1v[b];l($1v[b]!=$&&!2b(b+"9a")){q B=$c.2S();l(B==0)28(b,$);t l(B<0)3H($c.20);t l(B>0)3H($c.1Z);$d.1U.2e=!$c.1A($1v);l("8M".1n(b)>=0)$c.4B();2b(b+"90")}}n 3H($){28("y",$.y);28("M",$.M);28("d",$.d);28("H",$.H);28("m",$.m);28("s",$.s)}n 3b(F,B,b,D,C,A){q $=1a 1D($o.y,$o.M,$o.d,$o.H,$o.m,$o.s);$o.25(F,B,b,D,C,A);l(!2b("93")){q E=$.y==F&&$.M==B&&$.d==b;l(!E&&2L.x!=0){c("y",F);c("M",B);c("d",b);$c.1k=$f.Z;49()}l($c.2X||E||2L.x==0)$c.5c()}t $o=$}n 49(){l($f.3y){$c.3d();$f.Z.22()}}n 2b($){q b;l($f[$])b=$f[$].5d($f.Z,$f);u b}n 28(b,$){l($==1h)$=$o[b];$1v[b]=$o[b]=$;l("8W".1n(b)>=0)$d[b+"I"].1i=$;l(b=="M"){$d.1P["3E"]=$;$d.1P.1i=$1l.2k[$-1]}}n 3B(b,$,A){l(b<$)b=$;t l(b>A)b=A;u b}n 71($,b){$f.3A($,"4k",n($){$=$||2d,k=($.56==4p)?$.54:$.56;l(k==9)b()})}n 2W($,b){$=$+"";36($.x=0?C:5;1b(q D=0;D<=C;D++){B=A.1Q(D);b=h[B]-$[B];l(b>0)u 1;t l(b<0)u-1}u 0},1Y:n(){q $=1a 1u(h.y,h.M-1,h.d,h.H,h.m,h.s);h.y=$.5k();h.M=$.5h()+1;h.d=$.3t();h.H=$.5p();h.m=$.5i();h.s=$.5n();u!6w(h.y)},1V:n(b,$){l("3m".1n(b)>=0){q A=h.d;l(b=="M")h.d=1;h[b]+=$;h.1Y();h.d=A}}};n 2n($){u 8V($,10)}n 3z($,b){u 3r(2n($),b)}n 1t($,A,b){u 3z($,3r(A,b))}n 3r($,b){u $==1h||6w($)?b:$}n 5l(A,$){l($6B)A.5l("91"+$);t{q b=1L.8Z("8N");b.8Q($,1c,1c);A.97(b)}}n 4g($){q A,B,b="y,M,H,m,s,6M,6L".4c(",");1b(B=0;B=0){b.1d.8k=1I.6J(h.4S,$d.2r.4S+60-b.4W);b.1d.8e=h.8b-b.2p-2}}n 3Q(70){q p=4g(h),1R,5f,v=h.1i,6A=$o[p];l(p==0)u;$o[p]=6r(v)>=0?6r(v):$o[p];l(p=="y"){1R=h==$d.2y;l(1R&&$o.M==12)$o.y-=1}t l(p=="M"){1R=h==$d.2c;l(1R){5f=$1l.2k[$o[p]-1];l(6A==12)$o.y+=1;$o.1V("M",-1)}l($1v.M==$o.M)h.1i=5f||$1l.2k[$o[p]-1];l(($1v.y!=$o.y))c("y",$o.y)}4d("c(\\""+p+"\\","+$o[p]+")");l(70!==1c){l(p=="y"||p=="M")h.1e="47";1o($d[p+"D"])}49()}n 2O($){l($.2m){$.2m();$.8g()}t{$.5e=1c;$.6U=1p}l($5x)$.54=0}n 55($){q A=$.4c(",");1b(q B=0;B=96&&Q<=8y)Q-=48;l($f.8r&&5j){l(!H.3e){H.3e=$f.1X[1];$c.1k=$f.Z}l(H==$f.Z)$c.1k=$f.Z;l(Q==27)l(H==$f.Z){$c.3c();u}t $f.Z.22();l(Q>=37&&Q<=40){q U;l($c.1k==$f.Z||$c.1k==$d.1U)l($f.18.d){U="d";l(Q==38)$o[U]-=7;t l(Q==39)$o[U]+=1;t l(Q==37)$o[U]-=1;t $o[U]+=7;$o.1Y();c("y",$o["y"]);c("M",$o["M"]);c("d",$o[U]);2O(M);u}t{U=$f.18.43;$d[U+"I"].22()}U=U||4g($c.1k);l(U){l(Q==38||Q==39)$o[U]+=1;t $o[U]-=1;$o.1Y();$c.1k.1i=$o[U];3Q.5d($c.1k,1c);$c.1k.5o()}}t l(Q==9){q D=H.3e;1b(q R=0;R<$f.1X.x;R++)l(D.2e==1c||D.2p==0)D=D.3e;t 1g;l($c.1k!=D){$c.1k=D;D.22()}}t l(Q==13){3Q.5d($c.1k);l($c.1k.3k=="1S")$c.1k.8B();t l($f.5b.3j==$f.Z[$f.1E])$c.5c();t $c.3c();$c.1k=$f.Z}}t l(Q==9&&H==$f.Z)$c.3c();l($f.8G&&!$5x&&!$f.3S&&$c.1k==$f.Z&&(Q>=48&&Q<=57)){q T=$f.Z,S=T.1i,F=E(T),I={29:"",1r:[]},R=0,K,N=0,X=0,O=0,J,b=/3i|2H|3l|y|3R|M|1K|d|%2l|53|H|4V|m|4U|s|4T|W|w/g,L=$f.1B.2J(b),B,A,$,V,W,G,J=0;l(S!=""){O=S.2J(/[0-9]/g);O=O==1h?0:O.x;1b(R=0;R=0?1:0;l(O==1&&F>=S.x)F=S.x-1}S=S.1F(0,F)+8h.8c(Q)+S.1F(F+O);F++;1b(R=0;R=0){S+=$f.1B.1F(N,X);l(F>=N+J&&F<=X+J)F+=X-N}N=b.2t;G=N-X;B=I.29.1F(0,G);A=K[0].1Q(0);$=2n(B.1Q(0));l(I.29.x>1){V=I.29.1Q(1);W=$*10+2n(V)}t{V="";W=$}l(I.1r[X+1]||A=="M"&&W>12||A=="d"&&W>31||A=="H"&&W>23||"68".1n(A)>=0&&W>59){l(K[0].x==2)B="0"+$;t B=$;F++}t l(G==1){B=W;G++;J++}S+=B;I.29=I.29.1F(G);l(I.29=="")1g}T.1i=S;P(T,F);2O(M)}l(5j&&$c.1k!=$f.Z&&!((Q>=48&&Q<=57)||Q==8||Q==46))2O(M);n E(A){q b=0;l($f.51.1L.6a){q B=$f.51.1L.6a.82(),$=B.5m.x;B.6I("4Y",-A.1i.x);b=B.5m.x-$}t l(A.58||A.58=="0")b=A.58;u b}n P(b,A){l(b.6S){b.22();b.6S(A,A)}t l(b.6O){q $=b.6O();$.7P(1c);$.85("4Y",A);$.6I("4Y",A);$.5o()}}}1L.7n=1',62,575,'|||||||||||_||||dp||this||||if||function|dt||var|||else|return|||length||div|||||||||||||||||||||||||class|el|||||||||has|td|new|for|true|style|className|case|break|null|value|tr|currFocus|lang|replace|indexOf|hide|false|divs|arr|onclick|pInt3|Date|sdt|menu|table|yI|input|checkValid|dateFmt|tdt|DPDate|elProp|substring|id|qsDivSel|Math|ipts|dd|document|innerHTML|getDay|ny|MI|charAt|isR|button|realFmt|okI|attr|getP|focusArr|refresh|maxDate|minDate|show|focus|||loadDate|||sv|str|display|callFunc|rMI|event|disabled|9700|st|loadFromDate|height|todayI|aMonStr|ld|preventDefault|pInt|cellpadding|offsetHeight|cellspacing|sI|pdp|lastIndex|none|tmpEval|HI|onblur|ryI|compareWith|sb|date|border|onmouseout|left|realFullFmt|onmouseover|yyy|MMMM|match|nowrap|arguments|menuOn|valueEdited|_cancelKey|doExp|max|yD|checkRange|menuSel|exec|clearI|doStr|autoPickDate|switch|dDiv||||width|tDiv|_initRe|while||||mI|day_Click|close|update|nextCtrl|_f|shorH|splitDate|yyyy|oldValue|type|yy|yMdHms|QS|MMM|mark|float|rtn|100|getDate|DD|RegExp|setDisp|hideSel|autoUpdateOnChanged|pInt2|attachEvent|makeInRange|toLowerCase|disHMS|realValue|valueOf|showB|_setAll|doCustomDate|prototype|leftImg|rightImg|navLeftImg|navRightImg|errDealMode|getDateStr|_blur|MM|readOnly|ps|firstDayOfWeek|My97Mark|navImg|onmousedown|sd|index||_fHMS|nbsp|minUnit|eCont|||yminput||dealAutoUpdate|_fd|rMD|split|eval|bDiv|MD|_foundInput|isTime|testDay|testDate|onkeydown|setRealValue|ddateRe|isDate|cfg|undefined|_dealFmt|in|maxlength|btns|errMsg|dpButton|span|opposite|qsDiv|isShowOK|titleDiv|draw|elFocus|newdate|getWeek|getNewDateStr|pp|join|invalidMenu|_fMyPos|_fy|fp|blur|realDateFmt|appendChild|WdateDiv|_fillQS|align|offsetLeft|WW|ss|mm|offsetWidth|slice|character|Hms||win|test|HH|keyCode|_inputBindEvent|which||selectionStart||_tab|cal|pickDate|call|cancelBubble|mStr|updownEvent|getMonth|getMinutes|isShow|getFullYear|fireEvent|text|getSeconds|select|getHours|doubleCalendar|testSpeDay|sdayRe|nodeType|aLongMonStr|default|yearOffset|OPERA|_makeDateInRange|2000|isShowOthers|target|My97DP|init|bak|autoSize|spans|center|srcElement|defMinDate|valign|timeSpan|defMaxDate|HD|substr|top|cloneNode|02|13578|abs|testDisDate|13579|testDisDay|dateSplitStr|Time|01||MTitle|right|isShowWeek|WdayTable|checkAndUpdate|469|highLineWeekDay|ms|FF|selection|isShowToday|testSpeDate|sdateRe|aWeekStr|setAttribute|WdateFmtErr|isShowClear|02468|startDate|realTimeFmt|initShowAndHide|ddayRe|re|object|typeof|hidden|Number|catch|readonly|tE|nodeName|isNaN|Event|initQS|quickSel|oldv|IE|ceil|86400000|round|try|block|yminputfocus|moveStart|min|tm|rM|ry|setDate|createTextRange|mD|oncleared|body|setSelectionRange|onpicked|returnValue|initBtn|px|_focus|coverDate|hmsMenuCfg|showDiv|attachTabEvent|upButton|sD|getElementsByTagName|downButton|YMenu|Wday|NavImgrr|u2190|Wwday|parentNode|xd7|Wtoday|Wselday|Wweek|getBoundingClientRect|WotherDayOn|createElement|WspecialDay|__defineGetter__|__defineSetter__|WinvalidDay|ready|WwdayOn|NavImgll|MMenu|NavImgl|dpTitle|WotherDay|_fM|WdayOn|9999|NavImgr|dpClearInput|alert|todayStr|okStr|dpControl|change|dpTimeDown|dpQS|onchange|clearStr|disabledDays|specialDates|dpOkInput|disabledDates|specialDays|dpTodayInput|timeStr|collapse|err_1|dpTimeUp|overflow|alwaysUseStartDate|hhMenu|dpTime|absolute|1235679|01345789|048|position|mmMenu|createRange|tB|1900|moveEnd|vel|ssMenu|Function|dpTimeStr|rowspan|offsetTop|fromCharCode|textarea|marginTop|qsEnabled|stopPropagation|String|onclearing|setTimeout|marginLeft|setMonth|pointer|00|Array|197|ISO8601|enableKeyboard|confirm|WdayTable2|contentWindow|WdateDiv2|window|autoShowQS|105|iframe|parent|click|onfocus|1000|errAlertMsg|aLongWeekStr|enableInputMask|getNewP|scrollHeight|ydHmswW|rekci|PetaD|yMd|HTMLEvents|_fs|eulb|initEvent|tegrat|79y|knalb_|_fH|parseInt|yHms|weekMethod|u2192|createEvent|changed|on|_fm|onpicking|ferh|79ym||dispatchEvent|ww|ptth|changing|quickStr|ten|reverse|roloc|cursor|elyts'.split('|'),0,{})) \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/lang/zh-cn.js b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/lang/zh-cn.js new file mode 100644 index 0000000..70e5e4f --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/lang/zh-cn.js @@ -0,0 +1,14 @@ +var $lang={ +errAlertMsg: "\u4E0D\u5408\u6CD5\u7684\u65E5\u671F\u683C\u5F0F\u6216\u8005\u65E5\u671F\u8D85\u51FA\u9650\u5B9A\u8303\u56F4,\u9700\u8981\u64A4\u9500\u5417?", +aWeekStr: ["\u5468","\u65E5","\u4E00","\u4E8C","\u4E09","\u56DB","\u4E94","\u516D"], +aLongWeekStr:["\u5468","\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"], +aMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00","\u5341\u4E8C"], +aLongMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"], +clearStr: "\u6E05\u7A7A", +todayStr: "\u4ECA\u5929", +okStr: "\u786E\u5B9A", +updateStr: "\u786E\u5B9A", +timeStr: "\u65F6\u95F4", +quickStr: "\u5FEB\u901F\u9009\u62E9", +err_1: '\u6700\u5C0F\u65E5\u671F\u4E0D\u80FD\u5927\u4E8E\u6700\u5927\u65E5\u671F!' +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/skin/WdatePicker.css b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/skin/WdatePicker.css new file mode 100644 index 0000000..e69de29 diff --git a/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/skin/default/datepicker.css b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/skin/default/datepicker.css new file mode 100644 index 0000000..a26dc63 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/skin/default/datepicker.css @@ -0,0 +1,279 @@ +/* + * My97 DatePicker 4.8 + */ + +.WdateDiv { + width: 180px; + background-color: #FFFFFF; + border: #a5a5a5 1px solid; + padding: 2px; +} + +.WdateDiv2 { + width: 360px; +} + +.WdateDiv * { + font-size: 9pt; +} + +.WdateDiv .NavImg a { + display: block; + cursor: pointer; + height: 16px; + width: 16px; +} + +.WdateDiv .NavImgll a { + float: left; + background: transparent url(img.gif) no-repeat scroll 0 0; +} + +.WdateDiv .NavImgl a { + float: left; + background: transparent url(img.gif) no-repeat scroll -16px 0; +} + +.WdateDiv .NavImgr a { + float: right; + background: transparent url(img.gif) no-repeat scroll -32px 0; +} + +.WdateDiv .NavImgrr a { + float: right; + background: transparent url(img.gif) no-repeat scroll -48px 0; +} + +.WdateDiv #dpTitle { + height: 24px; + margin-bottom: 2px; + padding: 1px; +} + +.WdateDiv .yminput { + margin-top: 2px; + text-align: center; + height: 20px; + border: 0px; + width: 50px; + cursor: pointer; +} + +.WdateDiv .yminputfocus { + margin-top: 2px; + text-align: center; + font-weight: bold; + height: 20px; + color: blue; + border: #157FCC 1px solid; + width: 50px; +} + +.WdateDiv .menuSel { + z-index: 1; + position: absolute; + background-color: #FFFFFF; + border: #157FCC 1px solid; + display: none; +} + +.WdateDiv .menu { + cursor: pointer; + background-color: #fff; +} + +.WdateDiv .menuOn { + cursor: pointer; + color: #FFFFFF; + background-color: #1c9fff; +} + +.WdateDiv .invalidMenu { + color: #aaa; +} + +.WdateDiv .YMenu { + margin-top: 20px; + +} + +.WdateDiv .MMenu { + margin-top: 20px; + *width: 62px; +} + +.WdateDiv .hhMenu { + margin-top: -90px; + margin-left: 26px; +} + +.WdateDiv .mmMenu { + margin-top: -46px; + margin-left: 26px; +} + +.WdateDiv .ssMenu { + margin-top: -24px; + margin-left: 26px; +} + +.WdateDiv .Wweek { + text-align: center; + background: #e8f3fb; + border-right: #dfeaf2 1px solid; +} + +.WdateDiv .MTitle { + color: #FFFFFF; + font-weight: bold; + background-color: #157FCC; +} + +.WdateDiv .WdayTable2 { + border-collapse: collapse; + border: #157FCC 1px solid; +} + +.WdateDiv .WdayTable2 table { + border: 0; +} + +.WdateDiv .WdayTable { + line-height: 20px; + border: #d3d3d3 1px solid; +} + +.WdateDiv .WdayTable td { + text-align: center; +} + +.WdateDiv .Wday { + cursor: pointer; +} + +.WdateDiv .WdayOn { + cursor: pointer; + color: #FFFFFF; + background-color: #1aa1ff; +} + +.WdateDiv .Wwday { + cursor: pointer; + color: #FF2F2F; +} + +.WdateDiv .WwdayOn { + cursor: pointer; + color: #FFFFFF; + background-color: #157FCC; +} + +.WdateDiv .Wtoday { + cursor: pointer; + color: blue; +} + +.WdateDiv .Wselday { + color: #FFFFFF; + background-color: #157FCC; +} + +.WdateDiv .WspecialDay { + background-color: #66F4DF; +} + +.WdateDiv .WotherDay { + cursor: pointer; + color: #c5c5c5; +} + +.WdateDiv .WotherDayOn { + cursor: pointer; + color: #FFFFFF; + background-color: #157FCC; +} + +.WdateDiv .WinvalidDay { + color: #aaa; +} + +.WdateDiv #dpTime { + float: left; + margin-top: 3px; + margin-right: 30px; +} + +.WdateDiv #dpTime #dpTimeStr { + margin-left: 1px; +} + +.WdateDiv #dpTime input { + width: 18px; + height: 20px; + text-align: center; + color: #000; + border: #157FCC 1px solid; +} + +.WdateDiv #dpTime .tB { + border-right: 0px; +} + +.WdateDiv #dpTime .tE { + border-left: 0; + border-right: 0; +} + +.WdateDiv #dpTime .tm { + width: 7px; + border-left: 0; + border-right: 0; +} + +.WdateDiv #dpTime #dpTimeUp { + height: 10px; + width: 13px; + border: 0px; + background: url(img.gif) no-repeat -32px -16px; +} + +.WdateDiv #dpTime #dpTimeDown { + height: 10px; + width: 13px; + border: 0px; + background: url(img.gif) no-repeat -48px -16px; +} + +.WdateDiv #dpQS { + float: left; + margin-right: 3px; + margin-top: 3px; + background: url(img.gif) no-repeat 0px -16px; + width: 20px; + height: 20px; + cursor: pointer; +} + +.WdateDiv #dpControl { + text-align: right; +} + +.WdateDiv .dpButton { + height: 20px; + width: 45px; + cursor: pointer; + margin-top: 2px; + margin-right: 1px; + color: white; + background-color: #408EC6; + border-radius: 5px; + border: 1px solid #126DAF; +} +.WdateDiv .dpButton:hover, +.WdateDiv .dpButton:focus { + cursor: hand; + outline: none; + hidefocus:true; + background-color: #5dade2; + box-shadow: 0px 0px 5px #5dade2; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/skin/default/img.gif b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/skin/default/img.gif new file mode 100644 index 0000000..f75980d Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/My97DatePicker/skin/default/img.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.common.js b/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.common.js new file mode 100644 index 0000000..fed2765 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.common.js @@ -0,0 +1,36612 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["echarts"] = factory(); + else + root["echarts"] = factory(); +})(this, function() { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Export echarts as CommonJS module + */ + module.exports = __webpack_require__(1); + + __webpack_require__(91); + __webpack_require__(127); + __webpack_require__(132); + __webpack_require__(141); + __webpack_require__(268); + __webpack_require__(262); + + __webpack_require__(106); + __webpack_require__(285); + + __webpack_require__(315); + __webpack_require__(319); + __webpack_require__(286); + __webpack_require__(331); + + __webpack_require__(345); + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + /*! + * ECharts, a javascript interactive chart library. + * + * Copyright (c) 2015, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/echarts/blob/master/LICENSE.txt + */ + + /** + * @module echarts + */ + + + var GlobalModel = __webpack_require__(2); + var ExtensionAPI = __webpack_require__(24); + var CoordinateSystemManager = __webpack_require__(25); + var OptionManager = __webpack_require__(26); + + var ComponentModel = __webpack_require__(19); + var SeriesModel = __webpack_require__(27); + + var ComponentView = __webpack_require__(28); + var ChartView = __webpack_require__(41); + var graphic = __webpack_require__(42); + + var zrender = __webpack_require__(77); + var zrUtil = __webpack_require__(3); + var colorTool = __webpack_require__(38); + var env = __webpack_require__(78); + var Eventful = __webpack_require__(32); + + var each = zrUtil.each; + + var VISUAL_CODING_STAGES = ['echarts', 'chart', 'component']; + + // TODO Transform first or filter first + var PROCESSOR_STAGES = ['transform', 'filter', 'statistic']; + + function createRegisterEventWithLowercaseName(method) { + return function (eventName, handler, context) { + // Event name is all lowercase + eventName = eventName && eventName.toLowerCase(); + Eventful.prototype[method].call(this, eventName, handler, context); + }; + } + /** + * @module echarts~MessageCenter + */ + function MessageCenter() { + Eventful.call(this); + } + MessageCenter.prototype.on = createRegisterEventWithLowercaseName('on'); + MessageCenter.prototype.off = createRegisterEventWithLowercaseName('off'); + MessageCenter.prototype.one = createRegisterEventWithLowercaseName('one'); + zrUtil.mixin(MessageCenter, Eventful); + /** + * @module echarts~ECharts + */ + function ECharts (dom, theme, opts) { + opts = opts || {}; + + // Get theme by name + if (typeof theme === 'string') { + theme = themeStorage[theme]; + } + + if (theme) { + each(optionPreprocessorFuncs, function (preProcess) { + preProcess(theme); + }); + } + /** + * @type {string} + */ + this.id; + /** + * Group id + * @type {string} + */ + this.group; + /** + * @type {HTMLDomElement} + * @private + */ + this._dom = dom; + /** + * @type {module:zrender/ZRender} + * @private + */ + this._zr = zrender.init(dom, { + renderer: opts.renderer || 'canvas', + devicePixelRatio: opts.devicePixelRatio + }); + + /** + * @type {Object} + * @private + */ + this._theme = zrUtil.clone(theme); + + /** + * @type {Array.} + * @private + */ + this._chartsViews = []; + + /** + * @type {Object.} + * @private + */ + this._chartsMap = {}; + + /** + * @type {Array.} + * @private + */ + this._componentsViews = []; + + /** + * @type {Object.} + * @private + */ + this._componentsMap = {}; + + /** + * @type {module:echarts/ExtensionAPI} + * @private + */ + this._api = new ExtensionAPI(this); + + /** + * @type {module:echarts/CoordinateSystem} + * @private + */ + this._coordSysMgr = new CoordinateSystemManager(); + + Eventful.call(this); + + /** + * @type {module:echarts~MessageCenter} + * @private + */ + this._messageCenter = new MessageCenter(); + + // Init mouse events + this._initEvents(); + + // In case some people write `window.onresize = chart.resize` + this.resize = zrUtil.bind(this.resize, this); + } + + var echartsProto = ECharts.prototype; + + /** + * @return {HTMLDomElement} + */ + echartsProto.getDom = function () { + return this._dom; + }; + + /** + * @return {module:zrender~ZRender} + */ + echartsProto.getZr = function () { + return this._zr; + }; + + /** + * @param {Object} option + * @param {boolean} notMerge + * @param {boolean} [notRefreshImmediately=false] Useful when setOption frequently. + */ + echartsProto.setOption = function (option, notMerge, notRefreshImmediately) { + if (!this._model || notMerge) { + this._model = new GlobalModel( + null, null, this._theme, new OptionManager(this._api) + ); + } + + this._model.setOption(option, optionPreprocessorFuncs); + + updateMethods.prepareAndUpdate.call(this); + + !notRefreshImmediately && this._zr.refreshImmediately(); + }; + + /** + * @DEPRECATED + */ + echartsProto.setTheme = function () { + console.log('ECharts#setTheme() is DEPRECATED in ECharts 3.0'); + }; + + /** + * @return {module:echarts/model/Global} + */ + echartsProto.getModel = function () { + return this._model; + }; + + /** + * @return {Object} + */ + echartsProto.getOption = function () { + return this._model.getOption(); + }; + + /** + * @return {number} + */ + echartsProto.getWidth = function () { + return this._zr.getWidth(); + }; + + /** + * @return {number} + */ + echartsProto.getHeight = function () { + return this._zr.getHeight(); + }; + + /** + * Get canvas which has all thing rendered + * @param {Object} opts + * @param {string} [opts.backgroundColor] + */ + echartsProto.getRenderedCanvas = function (opts) { + if (!env.canvasSupported) { + return; + } + opts = opts || {}; + opts.pixelRatio = opts.pixelRatio || 1; + opts.backgroundColor = opts.backgroundColor + || this._model.get('backgroundColor'); + var zr = this._zr; + var list = zr.storage.getDisplayList(); + // Stop animations + zrUtil.each(list, function (el) { + el.stopAnimation(true); + }); + return zr.painter.getRenderedCanvas(opts); + }; + /** + * @return {string} + * @param {Object} opts + * @param {string} [opts.type='png'] + * @param {string} [opts.pixelRatio=1] + * @param {string} [opts.backgroundColor] + */ + echartsProto.getDataURL = function (opts) { + opts = opts || {}; + var excludeComponents = opts.excludeComponents; + var ecModel = this._model; + var excludesComponentViews = []; + var self = this; + + each(excludeComponents, function (componentType) { + ecModel.eachComponent({ + mainType: componentType + }, function (component) { + var view = self._componentsMap[component.__viewId]; + if (!view.group.ignore) { + excludesComponentViews.push(view); + view.group.ignore = true; + } + }); + }); + + var url = this.getRenderedCanvas(opts).toDataURL( + 'image/' + (opts && opts.type || 'png') + ); + + each(excludesComponentViews, function (view) { + view.group.ignore = false; + }); + return url; + }; + + + /** + * @return {string} + * @param {Object} opts + * @param {string} [opts.type='png'] + * @param {string} [opts.pixelRatio=1] + * @param {string} [opts.backgroundColor] + */ + echartsProto.getConnectedDataURL = function (opts) { + if (!env.canvasSupported) { + return; + } + var groupId = this.group; + var mathMin = Math.min; + var mathMax = Math.max; + var MAX_NUMBER = Infinity; + if (connectedGroups[groupId]) { + var left = MAX_NUMBER; + var top = MAX_NUMBER; + var right = -MAX_NUMBER; + var bottom = -MAX_NUMBER; + var canvasList = []; + var dpr = (opts && opts.pixelRatio) || 1; + for (var id in instances) { + var chart = instances[id]; + if (chart.group === groupId) { + var canvas = chart.getRenderedCanvas( + zrUtil.clone(opts) + ); + var boundingRect = chart.getDom().getBoundingClientRect(); + left = mathMin(boundingRect.left, left); + top = mathMin(boundingRect.top, top); + right = mathMax(boundingRect.right, right); + bottom = mathMax(boundingRect.bottom, bottom); + canvasList.push({ + dom: canvas, + left: boundingRect.left, + top: boundingRect.top + }); + } + } + + left *= dpr; + top *= dpr; + right *= dpr; + bottom *= dpr; + var width = right - left; + var height = bottom - top; + var targetCanvas = zrUtil.createCanvas(); + targetCanvas.width = width; + targetCanvas.height = height; + var zr = zrender.init(targetCanvas); + + each(canvasList, function (item) { + var img = new graphic.Image({ + style: { + x: item.left * dpr - left, + y: item.top * dpr - top, + image: item.dom + } + }); + zr.add(img); + }); + zr.refreshImmediately(); + + return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png')); + } + else { + return this.getDataURL(opts); + } + }; + + var updateMethods = { + + /** + * @param {Object} payload + * @private + */ + update: function (payload) { + // console.time && console.time('update'); + + var ecModel = this._model; + var api = this._api; + var coordSysMgr = this._coordSysMgr; + // update before setOption + if (!ecModel) { + return; + } + + ecModel.restoreData(); + + // TODO + // Save total ecModel here for undo/redo (after restoring data and before processing data). + // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call. + + // Create new coordinate system each update + // In LineView may save the old coordinate system and use it to get the orignal point + coordSysMgr.create(this._model, this._api); + + processData.call(this, ecModel, api); + + stackSeriesData.call(this, ecModel); + + coordSysMgr.update(ecModel, api); + + doLayout.call(this, ecModel, payload); + + doVisualCoding.call(this, ecModel, payload); + + doRender.call(this, ecModel, payload); + + // Set background + var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; + + var painter = this._zr.painter; + // TODO all use clearColor ? + if (painter.isSingleCanvas && painter.isSingleCanvas()) { + this._zr.configLayer(0, { + clearColor: backgroundColor + }); + } + else { + // In IE8 + if (!env.canvasSupported) { + var colorArr = colorTool.parse(backgroundColor); + backgroundColor = colorTool.stringify(colorArr, 'rgb'); + if (colorArr[3] === 0) { + backgroundColor = 'transparent'; + } + } + backgroundColor = backgroundColor; + this._dom.style.backgroundColor = backgroundColor; + } + + // console.time && console.timeEnd('update'); + }, + + // PENDING + /** + * @param {Object} payload + * @private + */ + updateView: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doLayout.call(this, ecModel, payload); + + doVisualCoding.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateView', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + updateVisual: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doVisualCoding.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateVisual', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + updateLayout: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doLayout.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateLayout', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + highlight: function (payload) { + toggleHighlight.call(this, 'highlight', payload); + }, + + /** + * @param {Object} payload + * @private + */ + downplay: function (payload) { + toggleHighlight.call(this, 'downplay', payload); + }, + + /** + * @param {Object} payload + * @private + */ + prepareAndUpdate: function (payload) { + var ecModel = this._model; + + prepareView.call(this, 'component', ecModel); + + prepareView.call(this, 'chart', ecModel); + + updateMethods.update.call(this, payload); + } + }; + + /** + * @param {Object} payload + * @private + */ + function toggleHighlight(method, payload) { + var ecModel = this._model; + + // dispatchAction before setOption + if (!ecModel) { + return; + } + + ecModel.eachComponent( + {mainType: 'series', query: payload}, + function (seriesModel, index) { + var chartView = this._chartsMap[seriesModel.__viewId]; + if (chartView && chartView.__alive) { + chartView[method]( + seriesModel, ecModel, this._api, payload + ); + } + }, + this + ); + } + + /** + * Resize the chart + */ + echartsProto.resize = function () { + this._zr.resize(); + + var optionChanged = this._model && this._model.resetOption('media'); + updateMethods[optionChanged ? 'prepareAndUpdate' : 'update'].call(this); + + // Resize loading effect + this._loadingFX && this._loadingFX.resize(); + }; + + var defaultLoadingEffect = __webpack_require__(87); + /** + * Show loading effect + * @param {string} [name='default'] + * @param {Object} [cfg] + */ + echartsProto.showLoading = function (name, cfg) { + if (zrUtil.isObject(name)) { + cfg = name; + name = 'default'; + } + this.hideLoading(); + var el = defaultLoadingEffect(this._api, cfg); + var zr = this._zr; + this._loadingFX = el; + + zr.add(el); + }; + + /** + * Hide loading effect + */ + echartsProto.hideLoading = function () { + this._loadingFX && this._zr.remove(this._loadingFX); + this._loadingFX = null; + }; + + /** + * @param {Object} eventObj + * @return {Object} + */ + echartsProto.makeActionFromEvent = function (eventObj) { + var payload = zrUtil.extend({}, eventObj); + payload.type = eventActionMap[eventObj.type]; + return payload; + }; + + /** + * @pubilc + * @param {Object} payload + * @param {string} [payload.type] Action type + * @param {boolean} [silent=false] Whether trigger event. + */ + echartsProto.dispatchAction = function (payload, silent) { + var actionWrap = actions[payload.type]; + if (actionWrap) { + var actionInfo = actionWrap.actionInfo; + var updateMethod = actionInfo.update || 'update'; + + var payloads = [payload]; + var batched = false; + // Batch action + if (payload.batch) { + batched = true; + payloads = zrUtil.map(payload.batch, function (item) { + item = zrUtil.defaults(zrUtil.extend({}, item), payload); + item.batch = null; + return item; + }); + } + + var eventObjBatch = []; + var eventObj; + var isHighlightOrDownplay = payload.type === 'highlight' || payload.type === 'downplay'; + for (var i = 0; i < payloads.length; i++) { + var batchItem = payloads[i]; + // Action can specify the event by return it. + eventObj = actionWrap.action(batchItem, this._model); + // Emit event outside + eventObj = eventObj || zrUtil.extend({}, batchItem); + // Convert type to eventType + eventObj.type = actionInfo.event || eventObj.type; + eventObjBatch.push(eventObj); + + // Highlight and downplay are special. + isHighlightOrDownplay && updateMethods[updateMethod].call(this, batchItem); + } + + (updateMethod !== 'none' && !isHighlightOrDownplay) + && updateMethods[updateMethod].call(this, payload); + + if (!silent) { + // Follow the rule of action batch + if (batched) { + eventObj = { + type: actionInfo.event || payload.type, + batch: eventObjBatch + }; + } + else { + eventObj = eventObjBatch[0]; + } + this._messageCenter.trigger(eventObj.type, eventObj); + } + } + }; + + /** + * Register event + * @method + */ + echartsProto.on = createRegisterEventWithLowercaseName('on'); + echartsProto.off = createRegisterEventWithLowercaseName('off'); + echartsProto.one = createRegisterEventWithLowercaseName('one'); + + /** + * @param {string} methodName + * @private + */ + function invokeUpdateMethod(methodName, ecModel, payload) { + var api = this._api; + + // Update all components + each(this._componentsViews, function (component) { + var componentModel = component.__model; + component[methodName](componentModel, ecModel, api, payload); + + updateZ(componentModel, component); + }, this); + + // Upate all charts + ecModel.eachSeries(function (seriesModel, idx) { + var chart = this._chartsMap[seriesModel.__viewId]; + chart[methodName](seriesModel, ecModel, api, payload); + + updateZ(seriesModel, chart); + }, this); + + } + + /** + * Prepare view instances of charts and components + * @param {module:echarts/model/Global} ecModel + * @private + */ + function prepareView(type, ecModel) { + var isComponent = type === 'component'; + var viewList = isComponent ? this._componentsViews : this._chartsViews; + var viewMap = isComponent ? this._componentsMap : this._chartsMap; + var zr = this._zr; + + for (var i = 0; i < viewList.length; i++) { + viewList[i].__alive = false; + } + + ecModel[isComponent ? 'eachComponent' : 'eachSeries'](function (componentType, model) { + if (isComponent) { + if (componentType === 'series') { + return; + } + } + else { + model = componentType; + } + + // Consider: id same and type changed. + var viewId = model.id + '_' + model.type; + var view = viewMap[viewId]; + if (!view) { + var classType = ComponentModel.parseClassType(model.type); + var Clazz = isComponent + ? ComponentView.getClass(classType.main, classType.sub) + : ChartView.getClass(classType.sub); + if (Clazz) { + view = new Clazz(); + view.init(ecModel, this._api); + viewMap[viewId] = view; + viewList.push(view); + zr.add(view.group); + } + else { + // Error + return; + } + } + + model.__viewId = viewId; + view.__alive = true; + view.__id = viewId; + view.__model = model; + }, this); + + for (var i = 0; i < viewList.length;) { + var view = viewList[i]; + if (!view.__alive) { + zr.remove(view.group); + view.dispose(ecModel, this._api); + viewList.splice(i, 1); + delete viewMap[view.__id]; + } + else { + i++; + } + } + } + + /** + * Processor data in each series + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function processData(ecModel, api) { + each(PROCESSOR_STAGES, function (stage) { + each(dataProcessorFuncs[stage] || [], function (process) { + process(ecModel, api); + }); + }); + } + + /** + * @private + */ + function stackSeriesData(ecModel) { + var stackedDataMap = {}; + ecModel.eachSeries(function (series) { + var stack = series.get('stack'); + var data = series.getData(); + if (stack && data.type === 'list') { + var previousStack = stackedDataMap[stack]; + if (previousStack) { + data.stackedOn = previousStack; + } + stackedDataMap[stack] = data; + } + }); + } + + /** + * Layout before each chart render there series, after visual coding and data processing + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function doLayout(ecModel, payload) { + var api = this._api; + each(layoutFuncs, function (layout) { + layout(ecModel, api, payload); + }); + } + + /** + * Code visual infomation from data after data processing + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function doVisualCoding(ecModel, payload) { + each(VISUAL_CODING_STAGES, function (stage) { + each(visualCodingFuncs[stage] || [], function (visualCoding) { + visualCoding(ecModel, payload); + }); + }); + } + + /** + * Render each chart and component + * @private + */ + function doRender(ecModel, payload) { + var api = this._api; + // Render all components + each(this._componentsViews, function (componentView) { + var componentModel = componentView.__model; + componentView.render(componentModel, ecModel, api, payload); + + updateZ(componentModel, componentView); + }, this); + + each(this._chartsViews, function (chart) { + chart.__alive = false; + }, this); + + // Render all charts + ecModel.eachSeries(function (seriesModel, idx) { + var chartView = this._chartsMap[seriesModel.__viewId]; + chartView.__alive = true; + chartView.render(seriesModel, ecModel, api, payload); + + updateZ(seriesModel, chartView); + }, this); + + // Remove groups of unrendered charts + each(this._chartsViews, function (chart) { + if (!chart.__alive) { + chart.remove(ecModel, api); + } + }, this); + } + + var MOUSE_EVENT_NAMES = [ + 'click', 'dblclick', 'mouseover', 'mouseout', 'mousedown', 'mouseup', 'globalout' + ]; + /** + * @private + */ + echartsProto._initEvents = function () { + var zr = this._zr; + each(MOUSE_EVENT_NAMES, function (eveName) { + zr.on(eveName, function (e) { + var ecModel = this.getModel(); + var el = e.target; + if (el && el.dataIndex != null) { + var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex); + var params = dataModel && dataModel.getDataParams(el.dataIndex) || {}; + params.event = e; + params.type = eveName; + this.trigger(eveName, params); + } + }, this); + }, this); + + each(eventActionMap, function (actionType, eventType) { + this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, this); + }, this); + }; + + /** + * @return {boolean} + */ + echartsProto.isDisposed = function () { + return this._disposed; + }; + + /** + * Clear + */ + echartsProto.clear = function () { + this.setOption({}, true); + }; + /** + * Dispose instance + */ + echartsProto.dispose = function () { + this._disposed = true; + var api = this._api; + var ecModel = this._model; + + each(this._componentsViews, function (component) { + component.dispose(ecModel, api); + }); + each(this._chartsViews, function (chart) { + chart.dispose(ecModel, api); + }); + + this._zr.dispose(); + + delete instances[this.id]; + }; + + zrUtil.mixin(ECharts, Eventful); + + /** + * @param {module:echarts/model/Series|module:echarts/model/Component} model + * @param {module:echarts/view/Component|module:echarts/view/Chart} view + * @return {string} + */ + function updateZ(model, view) { + var z = model.get('z'); + var zlevel = model.get('zlevel'); + // Set z and zlevel + view.group.traverse(function (el) { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + }); + } + /** + * @type {Array.} + * @inner + */ + var actions = []; + + /** + * Map eventType to actionType + * @type {Object} + */ + var eventActionMap = {}; + + /** + * @type {Array.} + * @inner + */ + var layoutFuncs = []; + + /** + * Data processor functions of each stage + * @type {Array.>} + * @inner + */ + var dataProcessorFuncs = {}; + + /** + * @type {Array.} + * @inner + */ + var optionPreprocessorFuncs = []; + + /** + * Visual coding functions of each stage + * @type {Array.>} + * @inner + */ + var visualCodingFuncs = {}; + /** + * Theme storage + * @type {Object.} + */ + var themeStorage = {}; + + + var instances = {}; + var connectedGroups = {}; + + var idBase = new Date() - 0; + var groupIdBase = new Date() - 0; + var DOM_ATTRIBUTE_KEY = '_echarts_instance_'; + /** + * @alias module:echarts + */ + var echarts = { + /** + * @type {number} + */ + version: '3.1.6', + dependencies: { + zrender: '3.0.7' + } + }; + + function enableConnect(chart) { + + var STATUS_PENDING = 0; + var STATUS_UPDATING = 1; + var STATUS_UPDATED = 2; + var STATUS_KEY = '__connectUpdateStatus'; + function updateConnectedChartsStatus(charts, status) { + for (var i = 0; i < charts.length; i++) { + var otherChart = charts[i]; + otherChart[STATUS_KEY] = status; + } + } + zrUtil.each(eventActionMap, function (actionType, eventType) { + chart._messageCenter.on(eventType, function (event) { + if (connectedGroups[chart.group] && chart[STATUS_KEY] !== STATUS_PENDING) { + var action = chart.makeActionFromEvent(event); + var otherCharts = []; + for (var id in instances) { + var otherChart = instances[id]; + if (otherChart !== chart && otherChart.group === chart.group) { + otherCharts.push(otherChart); + } + } + updateConnectedChartsStatus(otherCharts, STATUS_PENDING); + each(otherCharts, function (otherChart) { + if (otherChart[STATUS_KEY] !== STATUS_UPDATING) { + otherChart.dispatchAction(action); + } + }); + updateConnectedChartsStatus(otherCharts, STATUS_UPDATED); + } + }); + }); + + } + /** + * @param {HTMLDomElement} dom + * @param {Object} [theme] + * @param {Object} opts + */ + echarts.init = function (dom, theme, opts) { + // Check version + if ((zrender.version.replace('.', '') - 0) < (echarts.dependencies.zrender.replace('.', '') - 0)) { + throw new Error( + 'ZRender ' + zrender.version + + ' is too old for ECharts ' + echarts.version + + '. Current version need ZRender ' + + echarts.dependencies.zrender + '+' + ); + } + if (!dom) { + throw new Error('Initialize failed: invalid dom.'); + } + + var chart = new ECharts(dom, theme, opts); + chart.id = 'ec_' + idBase++; + instances[chart.id] = chart; + + dom.setAttribute && + dom.setAttribute(DOM_ATTRIBUTE_KEY, chart.id); + + enableConnect(chart); + + return chart; + }; + + /** + * @return {string|Array.} groupId + */ + echarts.connect = function (groupId) { + // Is array of charts + if (zrUtil.isArray(groupId)) { + var charts = groupId; + groupId = null; + // If any chart has group + zrUtil.each(charts, function (chart) { + if (chart.group != null) { + groupId = chart.group; + } + }); + groupId = groupId || ('g_' + groupIdBase++); + zrUtil.each(charts, function (chart) { + chart.group = groupId; + }); + } + connectedGroups[groupId] = true; + return groupId; + }; + + /** + * @return {string} groupId + */ + echarts.disConnect = function (groupId) { + connectedGroups[groupId] = false; + }; + + /** + * Dispose a chart instance + * @param {module:echarts~ECharts|HTMLDomElement|string} chart + */ + echarts.dispose = function (chart) { + if (zrUtil.isDom(chart)) { + chart = echarts.getInstanceByDom(chart); + } + else if (typeof chart === 'string') { + chart = instances[chart]; + } + if ((chart instanceof ECharts) && !chart.isDisposed()) { + chart.dispose(); + } + }; + + /** + * @param {HTMLDomElement} dom + * @return {echarts~ECharts} + */ + echarts.getInstanceByDom = function (dom) { + var key = dom.getAttribute(DOM_ATTRIBUTE_KEY); + return instances[key]; + }; + /** + * @param {string} key + * @return {echarts~ECharts} + */ + echarts.getInstanceById = function (key) { + return instances[key]; + }; + + /** + * Register theme + */ + echarts.registerTheme = function (name, theme) { + themeStorage[name] = theme; + }; + + /** + * Register option preprocessor + * @param {Function} preprocessorFunc + */ + echarts.registerPreprocessor = function (preprocessorFunc) { + optionPreprocessorFuncs.push(preprocessorFunc); + }; + + /** + * @param {string} stage + * @param {Function} processorFunc + */ + echarts.registerProcessor = function (stage, processorFunc) { + if (zrUtil.indexOf(PROCESSOR_STAGES, stage) < 0) { + throw new Error('stage should be one of ' + PROCESSOR_STAGES); + } + var funcs = dataProcessorFuncs[stage] || (dataProcessorFuncs[stage] = []); + funcs.push(processorFunc); + }; + + /** + * Usage: + * registerAction('someAction', 'someEvent', function () { ... }); + * registerAction('someAction', function () { ... }); + * registerAction( + * {type: 'someAction', event: 'someEvent', update: 'updateView'}, + * function () { ... } + * ); + * + * @param {(string|Object)} actionInfo + * @param {string} actionInfo.type + * @param {string} [actionInfo.event] + * @param {string} [actionInfo.update] + * @param {string} [eventName] + * @param {Function} action + */ + echarts.registerAction = function (actionInfo, eventName, action) { + if (typeof eventName === 'function') { + action = eventName; + eventName = ''; + } + var actionType = zrUtil.isObject(actionInfo) + ? actionInfo.type + : ([actionInfo, actionInfo = { + event: eventName + }][0]); + + // Event name is all lowercase + actionInfo.event = (actionInfo.event || actionType).toLowerCase(); + eventName = actionInfo.event; + + if (!actions[actionType]) { + actions[actionType] = {action: action, actionInfo: actionInfo}; + } + eventActionMap[eventName] = actionType; + }; + + /** + * @param {string} type + * @param {*} CoordinateSystem + */ + echarts.registerCoordinateSystem = function (type, CoordinateSystem) { + CoordinateSystemManager.register(type, CoordinateSystem); + }; + + /** + * @param {*} layout + */ + echarts.registerLayout = function (layout) { + // PENDING All functions ? + if (zrUtil.indexOf(layoutFuncs, layout) < 0) { + layoutFuncs.push(layout); + } + }; + + /** + * @param {string} stage + * @param {Function} visualCodingFunc + */ + echarts.registerVisualCoding = function (stage, visualCodingFunc) { + if (zrUtil.indexOf(VISUAL_CODING_STAGES, stage) < 0) { + throw new Error('stage should be one of ' + VISUAL_CODING_STAGES); + } + var funcs = visualCodingFuncs[stage] || (visualCodingFuncs[stage] = []); + funcs.push(visualCodingFunc); + }; + + /** + * @param {Object} opts + */ + echarts.extendChartView = function (opts) { + return ChartView.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendComponentModel = function (opts) { + return ComponentModel.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendSeriesModel = function (opts) { + return SeriesModel.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendComponentView = function (opts) { + return ComponentView.extend(opts); + }; + + /** + * ZRender need a canvas context to do measureText. + * But in node environment canvas may be created by node-canvas. + * So we need to specify how to create a canvas instead of using document.createElement('canvas') + * + * Be careful of using it in the browser. + * + * @param {Function} creator + * @example + * var Canvas = require('canvas'); + * var echarts = require('echarts'); + * echarts.setCanvasCreator(function () { + * // Small size is enough. + * return new Canvas(32, 32); + * }); + */ + echarts.setCanvasCreator = function (creator) { + zrUtil.createCanvas = creator; + }; + + echarts.registerVisualCoding('echarts', zrUtil.curry( + __webpack_require__(88), '', 'itemStyle' + )); + echarts.registerPreprocessor(__webpack_require__(89)); + + // Default action + echarts.registerAction({ + type: 'highlight', + event: 'highlight', + update: 'highlight' + }, zrUtil.noop); + echarts.registerAction({ + type: 'downplay', + event: 'downplay', + update: 'downplay' + }, zrUtil.noop); + + + // -------- + // Exports + // -------- + + echarts.graphic = __webpack_require__(42); + echarts.number = __webpack_require__(7); + echarts.format = __webpack_require__(6); + echarts.matrix = __webpack_require__(17); + echarts.vector = __webpack_require__(16); + + echarts.util = {}; + each([ + 'map', 'each', 'filter', 'indexOf', 'inherits', + 'reduce', 'filter', 'bind', 'curry', 'isArray', + 'isString', 'isObject', 'isFunction', 'extend' + ], + function (name) { + echarts.util[name] = zrUtil[name]; + } + ); + + module.exports = echarts; + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * ECharts global model + * + * @module {echarts/model/Global} + * + */ + + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var Model = __webpack_require__(8); + var each = zrUtil.each; + var filter = zrUtil.filter; + var map = zrUtil.map; + var isArray = zrUtil.isArray; + var indexOf = zrUtil.indexOf; + var isObject = zrUtil.isObject; + + var ComponentModel = __webpack_require__(19); + + var globalDefault = __webpack_require__(23); + + var OPTION_INNER_KEY = '\0_ec_inner'; + + /** + * @alias module:echarts/model/Global + * + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {Object} theme + */ + var GlobalModel = Model.extend({ + + constructor: GlobalModel, + + init: function (option, parentModel, theme, optionManager) { + theme = theme || {}; + + this.option = null; // Mark as not initialized. + + /** + * @type {module:echarts/model/Model} + * @private + */ + this._theme = new Model(theme); + + /** + * @type {module:echarts/model/OptionManager} + */ + this._optionManager = optionManager; + }, + + setOption: function (option, optionPreprocessorFuncs) { + zrUtil.assert( + !(OPTION_INNER_KEY in option), + 'please use chart.getOption()' + ); + + this._optionManager.setOption(option, optionPreprocessorFuncs); + + this.resetOption(); + }, + + /** + * @param {string} type null/undefined: reset all. + * 'recreate': force recreate all. + * 'timeline': only reset timeline option + * 'media': only reset media query option + * @return {boolean} Whether option changed. + */ + resetOption: function (type) { + var optionChanged = false; + var optionManager = this._optionManager; + + if (!type || type === 'recreate') { + var baseOption = optionManager.mountOption(type === 'recreate'); + + if (!this.option || type === 'recreate') { + initBase.call(this, baseOption); + } + else { + this.restoreData(); + this.mergeOption(baseOption); + } + optionChanged = true; + } + + if (type === 'timeline' || type === 'media') { + this.restoreData(); + } + + if (!type || type === 'recreate' || type === 'timeline') { + var timelineOption = optionManager.getTimelineOption(this); + timelineOption && (this.mergeOption(timelineOption), optionChanged = true); + } + + if (!type || type === 'recreate' || type === 'media') { + var mediaOptions = optionManager.getMediaOption(this, this._api); + if (mediaOptions.length) { + each(mediaOptions, function (mediaOption) { + this.mergeOption(mediaOption, optionChanged = true); + }, this); + } + } + + return optionChanged; + }, + + /** + * @protected + */ + mergeOption: function (newOption) { + var option = this.option; + var componentsMap = this._componentsMap; + var newCptTypes = []; + + // 如果不存在对应的 component model 则直接 merge + each(newOption, function (componentOption, mainType) { + if (componentOption == null) { + return; + } + + if (!ComponentModel.hasClass(mainType)) { + option[mainType] = option[mainType] == null + ? zrUtil.clone(componentOption) + : zrUtil.merge(option[mainType], componentOption, true); + } + else { + newCptTypes.push(mainType); + } + }); + + // FIXME OPTION 同步是否要改回原来的 + ComponentModel.topologicalTravel( + newCptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this + ); + + function visitComponent(mainType, dependencies) { + var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]); + + var mapResult = modelUtil.mappingToExists( + componentsMap[mainType], newCptOptionList + ); + + makeKeyInfo(mainType, mapResult); + + var dependentModels = getComponentsByTypes( + componentsMap, dependencies + ); + + option[mainType] = []; + componentsMap[mainType] = []; + + each(mapResult, function (resultItem, index) { + var componentModel = resultItem.exist; + var newCptOption = resultItem.option; + + zrUtil.assert( + isObject(newCptOption) || componentModel, + 'Empty component definition' + ); + + // Consider where is no new option and should be merged using {}, + // see removeEdgeAndAdd in topologicalTravel and + // ComponentModel.getAllClassMainTypes. + if (!newCptOption) { + componentModel.mergeOption({}, this); + componentModel.optionUpdated(this); + } + else { + var ComponentModelClass = ComponentModel.getClass( + mainType, resultItem.keyInfo.subType, true + ); + + if (componentModel && componentModel instanceof ComponentModelClass) { + componentModel.mergeOption(newCptOption, this); + componentModel.optionUpdated(this); + } + else { + // PENDING Global as parent ? + componentModel = new ComponentModelClass( + newCptOption, this, this, + zrUtil.extend( + { + dependentModels: dependentModels, + componentIndex: index + }, + resultItem.keyInfo + ) + ); + // Call optionUpdated after init + componentModel.optionUpdated(this); + } + } + + componentsMap[mainType][index] = componentModel; + option[mainType][index] = componentModel.option; + }, this); + + // Backup series for filtering. + if (mainType === 'series') { + this._seriesIndices = createSeriesIndices(componentsMap.series); + } + } + }, + + /** + * Get option for output (cloned option and inner info removed) + * @public + * @return {Object} + */ + getOption: function () { + var option = zrUtil.clone(this.option); + + each(option, function (opts, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = modelUtil.normalizeToArray(opts); + for (var i = opts.length - 1; i >= 0; i--) { + // Remove options with inner id. + if (modelUtil.isIdInner(opts[i])) { + opts.splice(i, 1); + } + } + option[mainType] = opts; + } + }); + + delete option[OPTION_INNER_KEY]; + + return option; + }, + + /** + * @return {module:echarts/model/Model} + */ + getTheme: function () { + return this._theme; + }, + + /** + * @param {string} mainType + * @param {number} [idx=0] + * @return {module:echarts/model/Component} + */ + getComponent: function (mainType, idx) { + var list = this._componentsMap[mainType]; + if (list) { + return list[idx || 0]; + } + }, + + /** + * @param {Object} condition + * @param {string} condition.mainType + * @param {string} [condition.subType] If ignore, only query by mainType + * @param {number} [condition.index] Either input index or id or name. + * @param {string} [condition.id] Either input index or id or name. + * @param {string} [condition.name] Either input index or id or name. + * @return {Array.} + */ + queryComponents: function (condition) { + var mainType = condition.mainType; + if (!mainType) { + return []; + } + + var index = condition.index; + var id = condition.id; + var name = condition.name; + + var cpts = this._componentsMap[mainType]; + + if (!cpts || !cpts.length) { + return []; + } + + var result; + + if (index != null) { + if (!isArray(index)) { + index = [index]; + } + result = filter(map(index, function (idx) { + return cpts[idx]; + }), function (val) { + return !!val; + }); + } + else if (id != null) { + var isIdArray = isArray(id); + result = filter(cpts, function (cpt) { + return (isIdArray && indexOf(id, cpt.id) >= 0) + || (!isIdArray && cpt.id === id); + }); + } + else if (name != null) { + var isNameArray = isArray(name); + result = filter(cpts, function (cpt) { + return (isNameArray && indexOf(name, cpt.name) >= 0) + || (!isNameArray && cpt.name === name); + }); + } + + return filterBySubType(result, condition); + }, + + /** + * The interface is different from queryComponents, + * which is convenient for inner usage. + * + * @usage + * var result = findComponents( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}} + * ); + * var result = findComponents( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}} + * ); + * var result = findComponents( + * {mainType: 'series'}, + * function (model, index) {...} + * ); + * // result like [component0, componnet1, ...] + * + * @param {Object} condition + * @param {string} condition.mainType Mandatory. + * @param {string} [condition.subType] Optional. + * @param {Object} [condition.query] like {xxxIndex, xxxId, xxxName}, + * where xxx is mainType. + * If query attribute is null/undefined or has no index/id/name, + * do not filtering by query conditions, which is convenient for + * no-payload situations or when target of action is global. + * @param {Function} [condition.filter] parameter: component, return boolean. + * @return {Array.} + */ + findComponents: function (condition) { + var query = condition.query; + var mainType = condition.mainType; + + var queryCond = getQueryCond(query); + var result = queryCond + ? this.queryComponents(queryCond) + : this._componentsMap[mainType]; + + return doFilter(filterBySubType(result, condition)); + + function getQueryCond(q) { + var indexAttr = mainType + 'Index'; + var idAttr = mainType + 'Id'; + var nameAttr = mainType + 'Name'; + return q && ( + q.hasOwnProperty(indexAttr) + || q.hasOwnProperty(idAttr) + || q.hasOwnProperty(nameAttr) + ) + ? { + mainType: mainType, + // subType will be filtered finally. + index: q[indexAttr], + id: q[idAttr], + name: q[nameAttr] + } + : null; + } + + function doFilter(res) { + return condition.filter + ? filter(res, condition.filter) + : res; + } + }, + + /** + * @usage + * eachComponent('legend', function (legendModel, index) { + * ... + * }); + * eachComponent(function (componentType, model, index) { + * // componentType does not include subType + * // (componentType is 'xxx' but not 'xxx.aa') + * }); + * eachComponent( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}, + * function (model, index) {...} + * ); + * eachComponent( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}, + * function (model, index) {...} + * ); + * + * @param {string|Object=} mainType When mainType is object, the definition + * is the same as the method 'findComponents'. + * @param {Function} cb + * @param {*} context + */ + eachComponent: function (mainType, cb, context) { + var componentsMap = this._componentsMap; + + if (typeof mainType === 'function') { + context = cb; + cb = mainType; + each(componentsMap, function (components, componentType) { + each(components, function (component, index) { + cb.call(context, componentType, component, index); + }); + }); + } + else if (zrUtil.isString(mainType)) { + each(componentsMap[mainType], cb, context); + } + else if (isObject(mainType)) { + var queryResult = this.findComponents(mainType); + each(queryResult, cb, context); + } + }, + + /** + * @param {string} name + * @return {Array.} + */ + getSeriesByName: function (name) { + var series = this._componentsMap.series; + return filter(series, function (oneSeries) { + return oneSeries.name === name; + }); + }, + + /** + * @param {number} seriesIndex + * @return {module:echarts/model/Series} + */ + getSeriesByIndex: function (seriesIndex) { + return this._componentsMap.series[seriesIndex]; + }, + + /** + * @param {string} subType + * @return {Array.} + */ + getSeriesByType: function (subType) { + var series = this._componentsMap.series; + return filter(series, function (oneSeries) { + return oneSeries.subType === subType; + }); + }, + + /** + * @return {Array.} + */ + getSeries: function () { + return this._componentsMap.series.slice(); + }, + + /** + * After filtering, series may be different + * frome raw series. + * + * @param {Function} cb + * @param {*} context + */ + eachSeries: function (cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.series[rawSeriesIndex]; + cb.call(context, series, rawSeriesIndex); + }, this); + }, + + /** + * Iterate raw series before filtered. + * + * @param {Function} cb + * @param {*} context + */ + eachRawSeries: function (cb, context) { + each(this._componentsMap.series, cb, context); + }, + + /** + * After filtering, series may be different. + * frome raw series. + * + * @parma {string} subType + * @param {Function} cb + * @param {*} context + */ + eachSeriesByType: function (subType, cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.series[rawSeriesIndex]; + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }, + + /** + * Iterate raw series before filtered of given type. + * + * @parma {string} subType + * @param {Function} cb + * @param {*} context + */ + eachRawSeriesByType: function (subType, cb, context) { + return each(this.getSeriesByType(subType), cb, context); + }, + + /** + * @param {module:echarts/model/Series} seriesModel + */ + isSeriesFiltered: function (seriesModel) { + assertSeriesInitialized(this); + return zrUtil.indexOf(this._seriesIndices, seriesModel.componentIndex) < 0; + }, + + /** + * @param {Function} cb + * @param {*} context + */ + filterSeries: function (cb, context) { + assertSeriesInitialized(this); + var filteredSeries = filter( + this._componentsMap.series, cb, context + ); + this._seriesIndices = createSeriesIndices(filteredSeries); + }, + + restoreData: function () { + var componentsMap = this._componentsMap; + + this._seriesIndices = createSeriesIndices(componentsMap.series); + + var componentTypes = []; + each(componentsMap, function (components, componentType) { + componentTypes.push(componentType); + }); + + ComponentModel.topologicalTravel( + componentTypes, + ComponentModel.getAllClassMainTypes(), + function (componentType, dependencies) { + each(componentsMap[componentType], function (component) { + component.restoreData(); + }); + } + ); + } + + }); + + /** + * @inner + */ + function mergeTheme(option, theme) { + for (var name in theme) { + // 如果有 component model 则把具体的 merge 逻辑交给该 model 处理 + if (!ComponentModel.hasClass(name)) { + if (typeof theme[name] === 'object') { + option[name] = !option[name] + ? zrUtil.clone(theme[name]) + : zrUtil.merge(option[name], theme[name], false); + } + else { + if (option[name] == null) { + option[name] = theme[name]; + } + } + } + } + } + + function initBase(baseOption) { + baseOption = baseOption; + + // Using OPTION_INNER_KEY to mark that this option can not be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbiden. + this.option = {}; + this.option[OPTION_INNER_KEY] = 1; + + /** + * @type {Object.>} + * @private + */ + this._componentsMap = {}; + + /** + * Mapping between filtered series list and raw series list. + * key: filtered series indices, value: raw series indices. + * @type {Array.} + * @private + */ + this._seriesIndices = null; + + mergeTheme(baseOption, this._theme.option); + + // TODO Needs clone when merging to the unexisted property + zrUtil.merge(baseOption, globalDefault, false); + + this.mergeOption(baseOption); + } + + /** + * @inner + * @param {Array.|string} types model types + * @return {Object} key: {string} type, value: {Array.} models + */ + function getComponentsByTypes(componentsMap, types) { + if (!zrUtil.isArray(types)) { + types = types ? [types] : []; + } + + var ret = {}; + each(types, function (type) { + ret[type] = (componentsMap[type] || []).slice(); + }); + + return ret; + } + + /** + * @inner + */ + function makeKeyInfo(mainType, mapResult) { + // We use this id to hash component models and view instances + // in echarts. id can be specified by user, or auto generated. + + // The id generation rule ensures new view instance are able + // to mapped to old instance when setOption are called in + // no-merge mode. So we generate model id by name and plus + // type in view id. + + // name can be duplicated among components, which is convenient + // to specify multi components (like series) by one name. + + // Ensure that each id is distinct. + var idMap = {}; + + each(mapResult, function (item, index) { + var existCpt = item.exist; + existCpt && (idMap[existCpt.id] = item); + }); + + each(mapResult, function (item, index) { + var opt = item.option; + + zrUtil.assert( + !opt || opt.id == null || !idMap[opt.id] || idMap[opt.id] === item, + 'id duplicates: ' + (opt && opt.id) + ); + + opt && opt.id != null && (idMap[opt.id] = item); + + // Complete subType + if (isObject(opt)) { + var subType = determineSubType(mainType, opt, item.exist); + item.keyInfo = {mainType: mainType, subType: subType}; + } + }); + + // Make name and id. + each(mapResult, function (item, index) { + var existCpt = item.exist; + var opt = item.option; + var keyInfo = item.keyInfo; + + if (!isObject(opt)) { + return; + } + + // name can be overwitten. Consider case: axis.name = '20km'. + // But id generated by name will not be changed, which affect + // only in that case: setOption with 'not merge mode' and view + // instance will be recreated, which can be accepted. + keyInfo.name = opt.name != null + ? opt.name + '' + : existCpt + ? existCpt.name + : '\0-'; + + if (existCpt) { + keyInfo.id = existCpt.id; + } + else if (opt.id != null) { + keyInfo.id = opt.id + ''; + } + else { + // Consider this situatoin: + // optionA: [{name: 'a'}, {name: 'a'}, {..}] + // optionB [{..}, {name: 'a'}, {name: 'a'}] + // Series with the same name between optionA and optionB + // should be mapped. + var idNum = 0; + do { + keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++; + } + while (idMap[keyInfo.id]); + } + + idMap[keyInfo.id] = item; + }); + } + + /** + * @inner + */ + function determineSubType(mainType, newCptOption, existComponent) { + var subType = newCptOption.type + ? newCptOption.type + : existComponent + ? existComponent.subType + // Use determineSubType only when there is no existComponent. + : ComponentModel.determineSubType(mainType, newCptOption); + + // tooltip, markline, markpoint may always has no subType + return subType; + } + + /** + * @inner + */ + function createSeriesIndices(seriesModels) { + return map(seriesModels, function (series) { + return series.componentIndex; + }) || []; + } + + /** + * @inner + */ + function filterBySubType(components, condition) { + // Using hasOwnProperty for restrict. Consider + // subType is undefined in user payload. + return condition.hasOwnProperty('subType') + ? filter(components, function (cpt) { + return cpt.subType === condition.subType; + }) + : components; + } + + /** + * @inner + */ + function assertSeriesInitialized(ecModel) { + // Components that use _seriesIndices should depends on series component, + // which make sure that their initialization is after series. + if (!ecModel._seriesIndices) { + throw new Error('Series has not been initialized yet.'); + } + } + + module.exports = GlobalModel; + + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/core/util + */ + + var Gradient = __webpack_require__(4); + // 用于处理merge时无法遍历Date等对象的问题 + var BUILTIN_OBJECT = { + '[object Function]': 1, + '[object RegExp]': 1, + '[object Date]': 1, + '[object Error]': 1, + '[object CanvasGradient]': 1 + }; + + var objToString = Object.prototype.toString; + + var arrayProto = Array.prototype; + var nativeForEach = arrayProto.forEach; + var nativeFilter = arrayProto.filter; + var nativeSlice = arrayProto.slice; + var nativeMap = arrayProto.map; + var nativeReduce = arrayProto.reduce; + + /** + * @param {*} source + * @return {*} 拷贝后的新对象 + */ + function clone(source) { + if (typeof source == 'object' && source !== null) { + var result = source; + if (source instanceof Array) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + else if ( + !isBuildInObject(source) + // 是否为 dom 对象 + && !isDom(source) + ) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key)) { + result[key] = clone(source[key]); + } + } + } + + return result; + } + + return source; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} target + * @param {*} source + * @param {boolean} [overwrite=false] + */ + function merge(target, source, overwrite) { + // We should escapse that source is string + // and enter for ... in ... + if (!isObject(source) || !isObject(target)) { + return overwrite ? clone(source) : target; + } + + for (var key in source) { + if (source.hasOwnProperty(key)) { + var targetProp = target[key]; + var sourceProp = source[key]; + + if (isObject(sourceProp) + && isObject(targetProp) + && !isArray(sourceProp) + && !isArray(targetProp) + && !isDom(sourceProp) + && !isDom(targetProp) + && !isBuildInObject(sourceProp) + && !isBuildInObject(targetProp) + ) { + // 如果需要递归覆盖,就递归调用merge + merge(targetProp, sourceProp, overwrite); + } + else if (overwrite || !(key in target)) { + // 否则只处理overwrite为true,或者在目标对象中没有此属性的情况 + // NOTE,在 target[key] 不存在的时候也是直接覆盖 + target[key] = clone(source[key], true); + } + } + } + + return target; + } + + /** + * @param {Array} targetAndSources The first item is target, and the rests are source. + * @param {boolean} [overwrite=false] + * @return {*} target + */ + function mergeAll(targetAndSources, overwrite) { + var result = targetAndSources[0]; + for (var i = 1, len = targetAndSources.length; i < len; i++) { + result = merge(result, targetAndSources[i], overwrite); + } + return result; + } + + /** + * @param {*} target + * @param {*} source + * @memberOf module:zrender/core/util + */ + function extend(target, source) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + target[key] = source[key]; + } + } + return target; + } + + /** + * @param {*} target + * @param {*} source + * @param {boolen} [overlay=false] + * @memberOf module:zrender/core/util + */ + function defaults(target, source, overlay) { + for (var key in source) { + if (source.hasOwnProperty(key) + && (overlay ? source[key] != null : target[key] == null) + ) { + target[key] = source[key]; + } + } + return target; + } + + function createCanvas() { + return document.createElement('canvas'); + } + // FIXME + var _ctx; + function getContext() { + if (!_ctx) { + // Use util.createCanvas instead of createCanvas + // because createCanvas may be overwritten in different environment + _ctx = util.createCanvas().getContext('2d'); + } + return _ctx; + } + + /** + * 查询数组中元素的index + * @memberOf module:zrender/core/util + */ + function indexOf(array, value) { + if (array) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + } + return -1; + } + + /** + * 构造类继承关系 + * + * @memberOf module:zrender/core/util + * @param {Function} clazz 源类 + * @param {Function} baseClazz 基类 + */ + function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + function F() {} + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + + for (var prop in clazzPrototype) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; + } + + /** + * @memberOf module:zrender/core/util + * @param {Object|Function} target + * @param {Object|Function} sorce + * @param {boolean} overlay + */ + function mixin(target, source, overlay) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + + defaults(target, source, overlay); + } + + /** + * @param {Array|TypedArray} data + */ + function isArrayLike(data) { + if (! data) { + return; + } + if (typeof data == 'string') { + return false; + } + return typeof data.length == 'number'; + } + + /** + * 数组或对象遍历 + * @memberOf module:zrender/core/util + * @param {Object|Array} obj + * @param {Function} cb + * @param {*} [context] + */ + function each(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.forEach && obj.forEach === nativeForEach) { + obj.forEach(cb, context); + } + else if (obj.length === +obj.length) { + for (var i = 0, len = obj.length; i < len; i++) { + cb.call(context, obj[i], i, obj); + } + } + else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + cb.call(context, obj[key], key, obj); + } + } + } + } + + /** + * 数组映射 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function map(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.map && obj.map === nativeMap) { + return obj.map(cb, context); + } + else { + var result = []; + for (var i = 0, len = obj.length; i < len; i++) { + result.push(cb.call(context, obj[i], i, obj)); + } + return result; + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {Object} [memo] + * @param {*} [context] + * @return {Array} + */ + function reduce(obj, cb, memo, context) { + if (!(obj && cb)) { + return; + } + if (obj.reduce && obj.reduce === nativeReduce) { + return obj.reduce(cb, memo, context); + } + else { + for (var i = 0, len = obj.length; i < len; i++) { + memo = cb.call(context, memo, obj[i], i, obj); + } + return memo; + } + } + + /** + * 数组过滤 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function filter(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.filter && obj.filter === nativeFilter) { + return obj.filter(cb, context); + } + else { + var result = []; + for (var i = 0, len = obj.length; i < len; i++) { + if (cb.call(context, obj[i], i, obj)) { + result.push(obj[i]); + } + } + return result; + } + } + + /** + * 数组项查找 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function find(obj, cb, context) { + if (!(obj && cb)) { + return; + } + for (var i = 0, len = obj.length; i < len; i++) { + if (cb.call(context, obj[i], i, obj)) { + return obj[i]; + } + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Function} func + * @param {*} context + * @return {Function} + */ + function bind(func, context) { + var args = nativeSlice.call(arguments, 2); + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; + } + + /** + * @memberOf module:zrender/core/util + * @param {Function} func + * @return {Function} + */ + function curry(func) { + var args = nativeSlice.call(arguments, 1); + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isArray(value) { + return objToString.call(value) === '[object Array]'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isFunction(value) { + return typeof value === 'function'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isString(value) { + return objToString.call(value) === '[object String]'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return type === 'function' || (!!value && type == 'object'); + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isBuildInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)] + || (value instanceof Gradient); + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isDom(value) { + return value && value.nodeType === 1 + && typeof(value.nodeName) == 'string'; + } + + /** + * If value1 is not null, then return value1, otherwise judget rest of values. + * @memberOf module:zrender/core/util + * @return {*} Final value + */ + function retrieve(values) { + for (var i = 0, len = arguments.length; i < len; i++) { + if (arguments[i] != null) { + return arguments[i]; + } + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Array} arr + * @param {number} startIndex + * @param {number} endIndex + * @return {Array} + */ + function slice() { + return Function.call.apply(nativeSlice, arguments); + } + + /** + * @memberOf module:zrender/core/util + * @param {boolean} condition + * @param {string} message + */ + function assert(condition, message) { + if (!condition) { + throw new Error(message); + } + } + + var util = { + inherits: inherits, + mixin: mixin, + clone: clone, + merge: merge, + mergeAll: mergeAll, + extend: extend, + defaults: defaults, + getContext: getContext, + createCanvas: createCanvas, + indexOf: indexOf, + slice: slice, + find: find, + isArrayLike: isArrayLike, + each: each, + map: map, + reduce: reduce, + filter: filter, + bind: bind, + curry: curry, + isArray: isArray, + isString: isString, + isObject: isObject, + isFunction: isFunction, + isBuildInObject: isBuildInObject, + isDom: isDom, + retrieve: retrieve, + assert: assert, + noop: function () {} + }; + module.exports = util; + + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + + + /** + * @param {Array.} colorStops + */ + var Gradient = function (colorStops) { + + this.colorStops = colorStops || []; + }; + + Gradient.prototype = { + + constructor: Gradient, + + addColorStop: function (offset, color) { + this.colorStops.push({ + + offset: offset, + + color: color + }); + } + }; + + module.exports = Gradient; + + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + + + var formatUtil = __webpack_require__(6); + var nubmerUtil = __webpack_require__(7); + var zrUtil = __webpack_require__(3); + + var Model = __webpack_require__(8); + + var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle']; + + var modelUtil = {}; + + /** + * Create "each" method to iterate names. + * + * @pubilc + * @param {Array.} names + * @param {Array.=} attrs + * @return {Function} + */ + modelUtil.createNameEach = function (names, attrs) { + names = names.slice(); + var capitalNames = zrUtil.map(names, modelUtil.capitalFirst); + attrs = (attrs || []).slice(); + var capitalAttrs = zrUtil.map(attrs, modelUtil.capitalFirst); + + return function (callback, context) { + zrUtil.each(names, function (name, index) { + var nameObj = {name: name, capital: capitalNames[index]}; + + for (var j = 0; j < attrs.length; j++) { + nameObj[attrs[j]] = name + capitalAttrs[j]; + } + + callback.call(context, nameObj); + }); + }; + }; + + /** + * @public + */ + modelUtil.capitalFirst = function (str) { + return str ? str.charAt(0).toUpperCase() + str.substr(1) : str; + }; + + /** + * Iterate each dimension name. + * + * @public + * @param {Function} callback The parameter is like: + * { + * name: 'angle', + * capital: 'Angle', + * axis: 'angleAxis', + * axisIndex: 'angleAixs', + * index: 'angleIndex' + * } + * @param {Object} context + */ + modelUtil.eachAxisDim = modelUtil.createNameEach(AXIS_DIMS, ['axisIndex', 'axis', 'index']); + + /** + * If value is not array, then translate it to array. + * @param {*} value + * @return {Array} [value] or value + */ + modelUtil.normalizeToArray = function (value) { + return zrUtil.isArray(value) + ? value + : value == null + ? [] + : [value]; + }; + + /** + * If tow dataZoomModels has the same axis controlled, we say that they are 'linked'. + * dataZoomModels and 'links' make up one or more graphics. + * This function finds the graphic where the source dataZoomModel is in. + * + * @public + * @param {Function} forEachNode Node iterator. + * @param {Function} forEachEdgeType edgeType iterator + * @param {Function} edgeIdGetter Giving node and edgeType, return an array of edge id. + * @return {Function} Input: sourceNode, Output: Like {nodes: [], dims: {}} + */ + modelUtil.createLinkedNodesFinder = function (forEachNode, forEachEdgeType, edgeIdGetter) { + + return function (sourceNode) { + var result = { + nodes: [], + records: {} // key: edgeType.name, value: Object (key: edge id, value: boolean). + }; + + forEachEdgeType(function (edgeType) { + result.records[edgeType.name] = {}; + }); + + if (!sourceNode) { + return result; + } + + absorb(sourceNode, result); + + var existsLink; + do { + existsLink = false; + forEachNode(processSingleNode); + } + while (existsLink); + + function processSingleNode(node) { + if (!isNodeAbsorded(node, result) && isLinked(node, result)) { + absorb(node, result); + existsLink = true; + } + } + + return result; + }; + + function isNodeAbsorded(node, result) { + return zrUtil.indexOf(result.nodes, node) >= 0; + } + + function isLinked(node, result) { + var hasLink = false; + forEachEdgeType(function (edgeType) { + zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) { + result.records[edgeType.name][edgeId] && (hasLink = true); + }); + }); + return hasLink; + } + + function absorb(node, result) { + result.nodes.push(node); + forEachEdgeType(function (edgeType) { + zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) { + result.records[edgeType.name][edgeId] = true; + }); + }); + } + }; + + /** + * Sync default option between normal and emphasis like `position` and `show` + * In case some one will write code like + * label: { + * normal: { + * show: false, + * position: 'outside', + * textStyle: { + * fontSize: 18 + * } + * }, + * emphasis: { + * show: true + * } + * } + * @param {Object} opt + * @param {Array.} subOpts + */ + modelUtil.defaultEmphasis = function (opt, subOpts) { + if (opt) { + var emphasisOpt = opt.emphasis = opt.emphasis || {}; + var normalOpt = opt.normal = opt.normal || {}; + + // Default emphasis option from normal + zrUtil.each(subOpts, function (subOptName) { + var val = zrUtil.retrieve(emphasisOpt[subOptName], normalOpt[subOptName]); + if (val != null) { + emphasisOpt[subOptName] = val; + } + }); + } + }; + + /** + * Create a model proxy to be used in tooltip for edge data, markLine data, markPoint data. + * @param {Object} opt + * @param {string} [opt.seriesIndex] + * @param {Object} [opt.name] + * @param {module:echarts/data/List} data + * @param {Array.} rawData + */ + modelUtil.createDataFormatModel = function (opt, data, rawData) { + var model = new Model(); + zrUtil.mixin(model, modelUtil.dataFormatMixin); + model.seriesIndex = opt.seriesIndex; + model.name = opt.name || ''; + + model.getData = function () { + return data; + }; + model.getRawDataArray = function () { + return rawData; + }; + return model; + }; + + /** + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method retieves value from data. + * @param {string|number|Date|Array|Object} dataItem + * @return {number|string|Date|Array.} + */ + modelUtil.getDataItemValue = function (dataItem) { + // Performance sensitive. + return dataItem && (dataItem.value == null ? dataItem : dataItem.value); + }; + + /** + * This helper method convert value in data. + * @param {string|number|Date} value + * @param {Object|string} [dimInfo] If string (like 'x'), dimType defaults 'number'. + */ + modelUtil.converDataValue = function (value, dimInfo) { + // Performance sensitive. + var dimType = dimInfo && dimInfo.type; + if (dimType === 'ordinal') { + return value; + } + + if (dimType === 'time' && !isFinite(value) && value != null && value !== '-') { + value = +nubmerUtil.parseDate(value); + } + + // dimType defaults 'number'. + // If dimType is not ordinal and value is null or undefined or NaN or '-', + // parse to NaN. + return (value == null || value === '') + ? NaN : +value; // If string (like '-'), using '+' parse to NaN + }; + + modelUtil.dataFormatMixin = { + /** + * Get params for formatter + * @param {number} dataIndex + * @return {Object} + */ + getDataParams: function (dataIndex) { + var data = this.getData(); + + var seriesIndex = this.seriesIndex; + var seriesName = this.name; + + var rawValue = this.getRawValue(dataIndex); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex, true); + + // Data may not exists in the option given by user + var rawDataArray = this.getRawDataArray(); + var itemOpt = rawDataArray && rawDataArray[rawDataIndex]; + + return { + seriesIndex: seriesIndex, + seriesName: seriesName, + name: name, + dataIndex: rawDataIndex, + data: itemOpt, + value: rawValue, + color: data.getItemVisual(dataIndex, 'color'), + + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ['seriesName', 'name', 'value'] + }; + }, + + /** + * Format label + * @param {number} dataIndex + * @param {string} [status='normal'] 'normal' or 'emphasis' + * @param {Function|string} [formatter] Default use the `itemStyle[status].label.formatter` + * @return {string} + */ + getFormattedLabel: function (dataIndex, status, formatter) { + status = status || 'normal'; + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + + var params = this.getDataParams(dataIndex); + if (formatter == null) { + formatter = itemModel.get(['label', status, 'formatter']); + } + + if (typeof formatter === 'function') { + params.status = status; + return formatter(params); + } + else if (typeof formatter === 'string') { + return formatUtil.formatTpl(formatter, params); + } + }, + + /** + * Get raw value in option + * @param {number} idx + * @return {Object} + */ + getRawValue: function (idx) { + var itemModel = this.getData().getItemModel(idx); + if (itemModel && itemModel.option != null) { + var dataItem = itemModel.option; + return (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem)) + ? dataItem.value : dataItem; + } + } + }; + + /** + * Mapping to exists for merge. + * + * @public + * @param {Array.|Array.} exists + * @param {Object|Array.} newCptOptions + * @return {Array.} Result, like [{exist: ..., option: ...}, {}], + * which order is the same as exists. + */ + modelUtil.mappingToExists = function (exists, newCptOptions) { + // Mapping by the order by original option (but not order of + // new option) in merge mode. Because we should ensure + // some specified index (like xAxisIndex) is consistent with + // original option, which is easy to understand, espatially in + // media query. And in most case, merge option is used to + // update partial option but not be expected to change order. + newCptOptions = (newCptOptions || []).slice(); + + var result = zrUtil.map(exists || [], function (obj, index) { + return {exist: obj}; + }); + + // Mapping by id or name if specified. + zrUtil.each(newCptOptions, function (cptOption, index) { + if (!zrUtil.isObject(cptOption)) { + return; + } + + for (var i = 0; i < result.length; i++) { + var exist = result[i].exist; + if (!result[i].option // Consider name: two map to one. + && ( + // id has highest priority. + (cptOption.id != null && exist.id === cptOption.id + '') + || (cptOption.name != null + && !modelUtil.isIdInner(cptOption) + && !modelUtil.isIdInner(exist) + && exist.name === cptOption.name + '' + ) + ) + ) { + result[i].option = cptOption; + newCptOptions[index] = null; + break; + } + } + }); + + // Otherwise mapping by index. + zrUtil.each(newCptOptions, function (cptOption, index) { + if (!zrUtil.isObject(cptOption)) { + return; + } + + var i = 0; + for (; i < result.length; i++) { + var exist = result[i].exist; + if (!result[i].option + && !modelUtil.isIdInner(exist) + // Caution: + // Do not overwrite id. But name can be overwritten, + // because axis use name as 'show label text'. + // 'exist' always has id and name and we dont + // need to check it. + && cptOption.id == null + ) { + result[i].option = cptOption; + break; + } + } + + if (i >= result.length) { + result.push({option: cptOption}); + } + }); + + return result; + }; + + /** + * @public + * @param {Object} cptOption + * @return {boolean} + */ + modelUtil.isIdInner = function (cptOption) { + return zrUtil.isObject(cptOption) + && cptOption.id + && (cptOption.id + '').indexOf('\0_ec_\0') === 0; + }; + + module.exports = modelUtil; + + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + + /** + * 每三位默认加,格式化 + * @type {string|number} x + */ + function addCommas(x) { + if (isNaN(x)) { + return '-'; + } + x = (x + '').split('.'); + return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,') + + (x.length > 1 ? ('.' + x[1]) : ''); + } + + /** + * @param {string} str + * @return {string} str + */ + function toCamelCase(str) { + return str.toLowerCase().replace(/-(.)/g, function(match, group1) { + return group1.toUpperCase(); + }); + } + + /** + * Normalize css liked array configuration + * e.g. + * 3 => [3, 3, 3, 3] + * [4, 2] => [4, 2, 4, 2] + * [4, 3, 2] => [4, 3, 2, 3] + * @param {number|Array.} val + */ + function normalizeCssArray(val) { + var len = val.length; + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + else if (len === 2) { + // vertical | horizontal + return [val[0], val[1], val[0], val[1]]; + } + else if (len === 3) { + // top | horizontal | bottom + return [val[0], val[1], val[2], val[1]]; + } + return val; + } + + function encodeHTML(source) { + return String(source) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + + function wrapVar(varName, seriesIdx) { + return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}'; + } + /** + * Template formatter + * @param {string} tpl + * @param {Array.|Object} paramsList + * @return {string} + */ + function formatTpl(tpl, paramsList) { + if (!zrUtil.isArray(paramsList)) { + paramsList = [paramsList]; + } + var seriesLen = paramsList.length; + if (!seriesLen) { + return ''; + } + + var $vars = paramsList[0].$vars; + for (var i = 0; i < $vars.length; i++) { + var alias = TPL_VAR_ALIAS[i]; + tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); + } + for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { + for (var k = 0; k < $vars.length; k++) { + tpl = tpl.replace( + wrapVar(TPL_VAR_ALIAS[k], seriesIdx), + paramsList[seriesIdx][$vars[k]] + ); + } + } + + return tpl; + } + + /** + * ISO Date format + * @param {string} tpl + * @param {number} value + * @inner + */ + function formatTime(tpl, value) { + if (tpl === 'week' + || tpl === 'month' + || tpl === 'quarter' + || tpl === 'half-year' + || tpl === 'year' + ) { + tpl = 'MM-dd\nyyyy'; + } + + var date = numberUtil.parseDate(value); + var y = date.getFullYear(); + var M = date.getMonth() + 1; + var d = date.getDate(); + var h = date.getHours(); + var m = date.getMinutes(); + var s = date.getSeconds(); + + tpl = tpl.replace('MM', s2d(M)) + .toLowerCase() + .replace('yyyy', y) + .replace('yy', y % 100) + .replace('dd', s2d(d)) + .replace('d', d) + .replace('hh', s2d(h)) + .replace('h', h) + .replace('mm', s2d(m)) + .replace('m', m) + .replace('ss', s2d(s)) + .replace('s', s); + + return tpl; + } + + /** + * @param {string} str + * @return {string} + * @inner + */ + function s2d(str) { + return str < 10 ? ('0' + str) : str; + } + + module.exports = { + + normalizeCssArray: normalizeCssArray, + + addCommas: addCommas, + + toCamelCase: toCamelCase, + + encodeHTML: encodeHTML, + + formatTpl: formatTpl, + + formatTime: formatTime + }; + + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + + /** + * 数值处理模块 + * @module echarts/util/number + */ + + + + var number = {}; + + var RADIAN_EPSILON = 1e-4; + + function _trim(str) { + return str.replace(/^\s+/, '').replace(/\s+$/, ''); + } + + /** + * Linear mapping a value from domain to range + * @memberOf module:echarts/util/number + * @param {(number|Array.)} val + * @param {Array.} domain Domain extent domain[0] can be bigger than domain[1] + * @param {Array.} range Range extent range[0] can be bigger than range[1] + * @param {boolean} clamp + * @return {(number|Array.} + */ + number.linearMap = function (val, domain, range, clamp) { + + var sub = domain[1] - domain[0]; + + if (sub === 0) { + return (range[0] + range[1]) / 2; + } + var t = (val - domain[0]) / sub; + + if (clamp) { + t = Math.min(Math.max(t, 0), 1); + } + + return t * (range[1] - range[0]) + range[0]; + }; + + /** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + * @memberOf module:echarts/util/number + * @param {string|number} percent + * @param {number} all + * @return {number} + */ + number.parsePercent = function(percent, all) { + switch (percent) { + case 'center': + case 'middle': + percent = '50%'; + break; + case 'left': + case 'top': + percent = '0%'; + break; + case 'right': + case 'bottom': + percent = '100%'; + break; + } + if (typeof percent === 'string') { + if (_trim(percent).match(/%$/)) { + return parseFloat(percent) / 100 * all; + } + + return parseFloat(percent); + } + + return percent == null ? NaN : +percent; + }; + + /** + * Fix rounding error of float numbers + * @param {number} x + * @return {number} + */ + number.round = function (x) { + // PENDING + return +(+x).toFixed(12); + }; + + number.asc = function (arr) { + arr.sort(function (a, b) { + return a - b; + }); + return arr; + }; + + /** + * Get precision + * @param {number} val + */ + number.getPrecision = function (val) { + if (isNaN(val)) { + return 0; + } + // It is much faster than methods converting number to string as follows + // var tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + var e = 1; + var count = 0; + while (Math.round(val * e) / e !== val) { + e *= 10; + count++; + } + return count; + }; + + /** + * @param {Array.} dataExtent + * @param {Array.} pixelExtent + * @return {number} precision + */ + number.getPixelPrecision = function (dataExtent, pixelExtent) { + var log = Math.log; + var LN10 = Math.LN10; + var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); + var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); + return Math.max( + -dataQuantity + sizeQuantity, + 0 + ); + }; + + // Number.MAX_SAFE_INTEGER, ie do not support. + number.MAX_SAFE_INTEGER = 9007199254740991; + + /** + * To 0 - 2 * PI, considering negative radian. + * @param {number} radian + * @return {number} + */ + number.remRadian = function (radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; + }; + + /** + * @param {type} radian + * @return {boolean} + */ + number.isRadianAroundZero = function (val) { + return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; + }; + + /** + * @param {string|Date|number} value + * @return {number} timestamp + */ + number.parseDate = function (value) { + return value instanceof Date + ? value + : new Date( + typeof value === 'string' + ? value.replace(/-/g, '/') + : Math.round(value) + ); + }; + + // "Nice Numbers for Graph Labels" of Graphic Gems + /** + * find a “nice” number approximately equal to x. Round the number if round = true, take ceiling if round = false + * The primary observation is that the “nicest” numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers. + * @param {number} val + * @param {boolean} round + * @return {number} + */ + number.nice = function (val, round) { + var exp = Math.floor(Math.log(val) / Math.LN10); + var exp10 = Math.pow(10, exp); + var f = val / exp10; // between 1 and 10 + var nf; + if (round) { + if (f < 1.5) { nf = 1; } + else if (f < 2.5) { nf = 2; } + else if (f < 4) { nf = 3; } + else if (f < 7) { nf = 5; } + else { nf = 10; } + } + else { + if (f < 1) { nf = 1; } + else if (f < 2) { nf = 2; } + else if (f < 3) { nf = 3; } + else if (f < 5) { nf = 5; } + else { nf = 10; } + } + return nf * exp10; + }; + + module.exports = number; + + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/model/Model + */ + + + var zrUtil = __webpack_require__(3); + var clazzUtil = __webpack_require__(9); + + /** + * @alias module:echarts/model/Model + * @constructor + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {module:echarts/model/Global} ecModel + * @param {Object} extraOpt + */ + function Model(option, parentModel, ecModel, extraOpt) { + /** + * @type {module:echarts/model/Model} + * @readOnly + */ + this.parentModel = parentModel; + + /** + * @type {module:echarts/model/Global} + * @readOnly + */ + this.ecModel = ecModel; + + /** + * @type {Object} + * @protected + */ + this.option = option; + + // Simple optimization + if (this.init) { + if (arguments.length <= 4) { + this.init(option, parentModel, ecModel, extraOpt); + } + else { + this.init.apply(this, arguments); + } + } + } + + Model.prototype = { + + constructor: Model, + + /** + * Model 的初始化函数 + * @param {Object} option + */ + init: null, + + /** + * 从新的 Option merge + */ + mergeOption: function (option) { + zrUtil.merge(this.option, option, true); + }, + + /** + * @param {string} path + * @param {boolean} [ignoreParent=false] + * @return {*} + */ + get: function (path, ignoreParent) { + if (!path) { + return this.option; + } + + if (typeof path === 'string') { + path = path.split('.'); + } + + var obj = this.option; + var parentModel = this.parentModel; + for (var i = 0; i < path.length; i++) { + // obj could be number/string/... (like 0) + obj = (obj && typeof obj === 'object') ? obj[path[i]] : null; + if (obj == null) { + break; + } + } + if (obj == null && parentModel && !ignoreParent) { + obj = parentModel.get(path); + } + return obj; + }, + + /** + * @param {string} key + * @param {boolean} [ignoreParent=false] + * @return {*} + */ + getShallow: function (key, ignoreParent) { + var option = this.option; + var val = option && option[key]; + var parentModel = this.parentModel; + if (val == null && parentModel && !ignoreParent) { + val = parentModel.getShallow(key); + } + return val; + }, + + /** + * @param {string} path + * @param {module:echarts/model/Model} [parentModel] + * @return {module:echarts/model/Model} + */ + getModel: function (path, parentModel) { + var obj = this.get(path, true); + var thisParentModel = this.parentModel; + var model = new Model( + obj, parentModel || (thisParentModel && thisParentModel.getModel(path)), + this.ecModel + ); + return model; + }, + + /** + * If model has option + */ + isEmpty: function () { + return this.option == null; + }, + + restoreData: function () {}, + + // Pending + clone: function () { + var Ctor = this.constructor; + return new Ctor(zrUtil.clone(this.option)); + }, + + setReadOnly: function (properties) { + clazzUtil.setReadOnly(this, properties); + } + }; + + // Enable Model.extend. + clazzUtil.enableClassExtend(Model); + + var mixin = zrUtil.mixin; + mixin(Model, __webpack_require__(10)); + mixin(Model, __webpack_require__(12)); + mixin(Model, __webpack_require__(13)); + mixin(Model, __webpack_require__(18)); + + module.exports = Model; + + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var clazz = {}; + + var TYPE_DELIMITER = '.'; + var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___'; + /** + * @public + */ + var parseClassType = clazz.parseClassType = function (componentType) { + var ret = {main: '', sub: ''}; + if (componentType) { + componentType = componentType.split(TYPE_DELIMITER); + ret.main = componentType[0] || ''; + ret.sub = componentType[1] || ''; + } + return ret; + }; + /** + * @public + */ + clazz.enableClassExtend = function (RootClass, preConstruct) { + RootClass.extend = function (proto) { + var ExtendedClass = function () { + preConstruct && preConstruct.apply(this, arguments); + RootClass.apply(this, arguments); + }; + + zrUtil.extend(ExtendedClass.prototype, proto); + + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + zrUtil.inherits(ExtendedClass, this); + ExtendedClass.superClass = this; + + return ExtendedClass; + }; + }; + + // superCall should have class info, which can not be fetch from 'this'. + // Consider this case: + // class A has method f, + // class B inherits class A, overrides method f, f call superApply('f'), + // class C inherits class B, do not overrides method f, + // then when method of class C is called, dead loop occured. + function superCall(context, methodName) { + var args = zrUtil.slice(arguments, 2); + return this.superClass.prototype[methodName].apply(context, args); + } + + function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); + } + + /** + * @param {Object} entity + * @param {Object} options + * @param {boolean} [options.registerWhenExtend] + * @public + */ + clazz.enableClassManagement = function (entity, options) { + options = options || {}; + + /** + * Component model classes + * key: componentType, + * value: + * componentClass, when componentType is 'xxx' + * or Object., when componentType is 'xxx.yy' + * @type {Object} + */ + var storage = {}; + + entity.registerClass = function (Clazz, componentType) { + if (componentType) { + componentType = parseClassType(componentType); + + if (!componentType.sub) { + if (storage[componentType.main]) { + throw new Error(componentType.main + 'exists.'); + } + storage[componentType.main] = Clazz; + } + else if (componentType.sub !== IS_CONTAINER) { + var container = makeContainer(componentType); + container[componentType.sub] = Clazz; + } + } + return Clazz; + }; + + entity.getClass = function (componentTypeMain, subType, throwWhenNotFound) { + var Clazz = storage[componentTypeMain]; + + if (Clazz && Clazz[IS_CONTAINER]) { + Clazz = subType ? Clazz[subType] : null; + } + + if (throwWhenNotFound && !Clazz) { + throw new Error( + 'Component ' + componentTypeMain + '.' + (subType || '') + ' not exists. Load it first.' + ); + } + + return Clazz; + }; + + entity.getClassesByMainType = function (componentType) { + componentType = parseClassType(componentType); + + var result = []; + var obj = storage[componentType.main]; + + if (obj && obj[IS_CONTAINER]) { + zrUtil.each(obj, function (o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } + else { + result.push(obj); + } + + return result; + }; + + entity.hasClass = function (componentType) { + // Just consider componentType.main. + componentType = parseClassType(componentType); + return !!storage[componentType.main]; + }; + + /** + * @return {Array.} Like ['aa', 'bb'], but can not be ['aa.xx'] + */ + entity.getAllClassMainTypes = function () { + var types = []; + zrUtil.each(storage, function (obj, type) { + types.push(type); + }); + return types; + }; + + /** + * If a main type is container and has sub types + * @param {string} mainType + * @return {boolean} + */ + entity.hasSubTypes = function (componentType) { + componentType = parseClassType(componentType); + var obj = storage[componentType.main]; + return obj && obj[IS_CONTAINER]; + }; + + entity.parseClassType = parseClassType; + + function makeContainer(componentType) { + var container = storage[componentType.main]; + if (!container || !container[IS_CONTAINER]) { + container = storage[componentType.main] = {}; + container[IS_CONTAINER] = true; + } + return container; + } + + if (options.registerWhenExtend) { + var originalExtend = entity.extend; + if (originalExtend) { + entity.extend = function (proto) { + var ExtendedClass = originalExtend.call(this, proto); + return entity.registerClass(ExtendedClass, proto.type); + }; + } + } + + return entity; + }; + + /** + * @param {string|Array.} properties + */ + clazz.setReadOnly = function (obj, properties) { + // FIXME It seems broken in IE8 simulation of IE11 + // if (!zrUtil.isArray(properties)) { + // properties = properties != null ? [properties] : []; + // } + // zrUtil.each(properties, function (prop) { + // var value = obj[prop]; + + // Object.defineProperty + // && Object.defineProperty(obj, prop, { + // value: value, writable: false + // }); + // zrUtil.isArray(obj[prop]) + // && Object.freeze + // && Object.freeze(obj[prop]); + // }); + }; + + module.exports = clazz; + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + + var getLineStyle = __webpack_require__(11)( + [ + ['lineWidth', 'width'], + ['stroke', 'color'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ); + module.exports = { + getLineStyle: function (excludes) { + var style = getLineStyle.call(this, excludes); + var lineDash = this.getLineDash(); + lineDash && (style.lineDash = lineDash); + return style; + }, + + getLineDash: function () { + var lineType = this.get('type'); + return (lineType === 'solid' || lineType == null) ? null + : (lineType === 'dashed' ? [5, 5] : [1, 1]); + } + }; + + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + // TODO Parse shadow style + // TODO Only shallow path support + + var zrUtil = __webpack_require__(3); + + module.exports = function (properties) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + return function (excludes) { + var style = {}; + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + if (excludes && zrUtil.indexOf(excludes, propName) >= 0) { + continue; + } + var val = this.getShallow(propName); + if (val != null) { + style[properties[i][0]] = val; + } + } + return style; + }; + }; + + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getAreaStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['opacity'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + + + var textContain = __webpack_require__(14); + + function getShallow(model, path) { + return model && model.getShallow(path); + } + + module.exports = { + /** + * Get color property or get color from option.textStyle.color + * @return {string} + */ + getTextColor: function () { + var ecModel = this.ecModel; + return this.getShallow('color') + || (ecModel && ecModel.get('textStyle.color')); + }, + + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + getFont: function () { + var ecModel = this.ecModel; + var gTextStyleModel = ecModel && ecModel.getModel('textStyle'); + return [ + // FIXME in node-canvas fontWeight is before fontStyle + this.getShallow('fontStyle') || getShallow(gTextStyleModel, 'fontStyle'), + this.getShallow('fontWeight') || getShallow(gTextStyleModel, 'fontWeight'), + (this.getShallow('fontSize') || getShallow(gTextStyleModel, 'fontSize') || 12) + 'px', + this.getShallow('fontFamily') || getShallow(gTextStyleModel, 'fontFamily') || 'sans-serif' + ].join(' '); + }, + + getTextRect: function (text) { + var textStyle = this.get('textStyle') || {}; + return textContain.getBoundingRect( + text, + this.getFont(), + textStyle.align, + textStyle.baseline + ); + }, + + ellipsis: function (text, containerWidth, options) { + return textContain.ellipsis( + text, this.getFont(), containerWidth, options + ); + } + }; + + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + + + var textWidthCache = {}; + var textWidthCacheCounter = 0; + var TEXT_CACHE_MAX = 5000; + + var util = __webpack_require__(3); + var BoundingRect = __webpack_require__(15); + + function getTextWidth(text, textFont) { + var key = text + ':' + textFont; + if (textWidthCache[key]) { + return textWidthCache[key]; + } + + var textLines = (text + '').split('\n'); + var width = 0; + + for (var i = 0, l = textLines.length; i < l; i++) { + // measureText 可以被覆盖以兼容不支持 Canvas 的环境 + width = Math.max(textContain.measureText(textLines[i], textFont).width, width); + } + + if (textWidthCacheCounter > TEXT_CACHE_MAX) { + textWidthCacheCounter = 0; + textWidthCache = {}; + } + textWidthCacheCounter++; + textWidthCache[key] = width; + + return width; + } + + function getTextRect(text, textFont, textAlign, textBaseline) { + var textLineLen = ((text || '') + '').split('\n').length; + + var width = getTextWidth(text, textFont); + // FIXME 高度计算比较粗暴 + var lineHeight = getTextWidth('国', textFont); + var height = textLineLen * lineHeight; + + var rect = new BoundingRect(0, 0, width, height); + // Text has a special line height property + rect.lineHeight = lineHeight; + + switch (textBaseline) { + case 'bottom': + case 'alphabetic': + rect.y -= lineHeight; + break; + case 'middle': + rect.y -= lineHeight / 2; + break; + // case 'hanging': + // case 'top': + } + + // FIXME Right to left language + switch (textAlign) { + case 'end': + case 'right': + rect.x -= rect.width; + break; + case 'center': + rect.x -= rect.width / 2; + break; + // case 'start': + // case 'left': + } + + return rect; + } + + function adjustTextPositionOnRect(textPosition, rect, textRect, distance) { + + var x = rect.x; + var y = rect.y; + + var height = rect.height; + var width = rect.width; + + var textHeight = textRect.height; + + var halfHeight = height / 2 - textHeight / 2; + + var textAlign = 'left'; + + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textAlign = 'left'; + break; + case 'top': + x += width / 2; + y -= distance + textHeight; + textAlign = 'center'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textAlign = 'left'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - textHeight - distance; + textAlign = 'center'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + textAlign = 'left'; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - textHeight - distance; + break; + case 'insideBottomRight': + x += width - distance; + y += height - textHeight - distance; + textAlign = 'right'; + break; + } + + return { + x: x, + y: y, + textAlign: textAlign, + textBaseline: 'top' + }; + } + + /** + * Show ellipsis if overflow. + * + * @param {string} text + * @param {string} textFont + * @param {string} containerWidth + * @param {Object} [options] + * @param {number} [options.ellipsis='...'] + * @param {number} [options.maxIterations=3] + * @param {number} [options.minCharacters=3] + * @return {string} + */ + function textEllipsis(text, textFont, containerWidth, options) { + if (!containerWidth) { + return ''; + } + + options = util.defaults({ + ellipsis: '...', + minCharacters: 3, + maxIterations: 3, + cnCharWidth: getTextWidth('国', textFont), + // FIXME + // 未考虑非等宽字体 + ascCharWidth: getTextWidth('a', textFont) + }, options, true); + + containerWidth -= getTextWidth(options.ellipsis); + + var textLines = (text + '').split('\n'); + + for (var i = 0, len = textLines.length; i < len; i++) { + textLines[i] = textLineTruncate( + textLines[i], textFont, containerWidth, options + ); + } + + return textLines.join('\n'); + } + + function textLineTruncate(text, textFont, containerWidth, options) { + // FIXME + // 粗糙得写的,尚未考虑性能和各种语言、字体的效果。 + for (var i = 0;; i++) { + var lineWidth = getTextWidth(text, textFont); + + if (lineWidth < containerWidth || i >= options.maxIterations) { + text += options.ellipsis; + break; + } + + var subLength = i === 0 + ? estimateLength(text, containerWidth, options) + : Math.floor(text.length * containerWidth / lineWidth); + + if (subLength < options.minCharacters) { + text = ''; + break; + } + + text = text.substr(0, subLength); + } + + return text; + } + + function estimateLength(text, containerWidth, options) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < containerWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) + ? options.ascCharWidth : options.cnCharWidth; + } + return i; + } + + var textContain = { + + getWidth: getTextWidth, + + getBoundingRect: getTextRect, + + adjustTextPositionOnRect: adjustTextPositionOnRect, + + ellipsis: textEllipsis, + + measureText: function (text, textFont) { + var ctx = util.getContext(); + ctx.font = textFont; + return ctx.measureText(text); + } + }; + + module.exports = textContain; + + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module echarts/core/BoundingRect + */ + + + var vec2 = __webpack_require__(16); + var matrix = __webpack_require__(17); + + var v2ApplyTransform = vec2.applyTransform; + var mathMin = Math.min; + var mathAbs = Math.abs; + var mathMax = Math.max; + /** + * @alias module:echarts/core/BoundingRect + */ + function BoundingRect(x, y, width, height) { + /** + * @type {number} + */ + this.x = x; + /** + * @type {number} + */ + this.y = y; + /** + * @type {number} + */ + this.width = width; + /** + * @type {number} + */ + this.height = height; + } + + BoundingRect.prototype = { + + constructor: BoundingRect, + + /** + * @param {module:echarts/core/BoundingRect} other + */ + union: function (other) { + var x = mathMin(other.x, this.x); + var y = mathMin(other.y, this.y); + + this.width = mathMax( + other.x + other.width, + this.x + this.width + ) - x; + this.height = mathMax( + other.y + other.height, + this.y + this.height + ) - y; + this.x = x; + this.y = y; + }, + + /** + * @param {Array.} m + * @methods + */ + applyTransform: (function () { + var min = []; + var max = []; + return function (m) { + // In case usage like this + // el.getBoundingRect().applyTransform(el.transform) + // And element has no transform + if (!m) { + return; + } + min[0] = this.x; + min[1] = this.y; + max[0] = this.x + this.width; + max[1] = this.y + this.height; + + v2ApplyTransform(min, min, m); + v2ApplyTransform(max, max, m); + + this.x = mathMin(min[0], max[0]); + this.y = mathMin(min[1], max[1]); + this.width = mathAbs(max[0] - min[0]); + this.height = mathAbs(max[1] - min[1]); + }; + })(), + + /** + * Calculate matrix of transforming from self to target rect + * @param {module:zrender/core/BoundingRect} b + * @return {Array.} + */ + calculateTransform: function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + + var m = matrix.create(); + + // 矩阵右乘 + matrix.translate(m, m, [-a.x, -a.y]); + matrix.scale(m, m, [sx, sy]); + matrix.translate(m, m, [b.x, b.y]); + + return m; + }, + + /** + * @param {(module:echarts/core/BoundingRect|Object)} b + * @return {boolean} + */ + intersect: function (b) { + var a = this; + var ax0 = a.x; + var ax1 = a.x + a.width; + var ay0 = a.y; + var ay1 = a.y + a.height; + + var bx0 = b.x; + var bx1 = b.x + b.width; + var by0 = b.y; + var by1 = b.y + b.height; + + return ! (ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + }, + + contain: function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }, + + /** + * @return {module:echarts/core/BoundingRect} + */ + clone: function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }, + + /** + * Copy from another rect + */ + copy: function (other) { + this.x = other.x; + this.y = other.y; + this.width = other.width; + this.height = other.height; + } + }; + + module.exports = BoundingRect; + + +/***/ }, +/* 16 */ +/***/ function(module, exports) { + + + var ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + + /** + * @typedef {Float32Array|Array.} Vector2 + */ + /** + * 二维向量类 + * @exports zrender/tool/vector + */ + var vector = { + /** + * 创建一个向量 + * @param {number} [x=0] + * @param {number} [y=0] + * @return {Vector2} + */ + create: function (x, y) { + var out = new ArrayCtor(2); + out[0] = x || 0; + out[1] = y || 0; + return out; + }, + + /** + * 复制向量数据 + * @param {Vector2} out + * @param {Vector2} v + * @return {Vector2} + */ + copy: function (out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + }, + + /** + * 克隆一个向量 + * @param {Vector2} v + * @return {Vector2} + */ + clone: function (v) { + var out = new ArrayCtor(2); + out[0] = v[0]; + out[1] = v[1]; + return out; + }, + + /** + * 设置向量的两个项 + * @param {Vector2} out + * @param {number} a + * @param {number} b + * @return {Vector2} 结果 + */ + set: function (out, a, b) { + out[0] = a; + out[1] = b; + return out; + }, + + /** + * 向量相加 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + add: function (out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + }, + + /** + * 向量缩放后相加 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + * @param {number} a + */ + scaleAndAdd: function (out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + }, + + /** + * 向量相减 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + sub: function (out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + }, + + /** + * 向量长度 + * @param {Vector2} v + * @return {number} + */ + len: function (v) { + return Math.sqrt(this.lenSquare(v)); + }, + + /** + * 向量长度平方 + * @param {Vector2} v + * @return {number} + */ + lenSquare: function (v) { + return v[0] * v[0] + v[1] * v[1]; + }, + + /** + * 向量乘法 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + mul: function (out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + }, + + /** + * 向量除法 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + div: function (out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + }, + + /** + * 向量点乘 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + dot: function (v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + }, + + /** + * 向量缩放 + * @param {Vector2} out + * @param {Vector2} v + * @param {number} s + */ + scale: function (out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + }, + + /** + * 向量归一化 + * @param {Vector2} out + * @param {Vector2} v + */ + normalize: function (out, v) { + var d = vector.len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } + else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; + }, + + /** + * 计算向量间距离 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + distance: function (v1, v2) { + return Math.sqrt( + (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]) + ); + }, + + /** + * 向量距离平方 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + distanceSquare: function (v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); + }, + + /** + * 求负向量 + * @param {Vector2} out + * @param {Vector2} v + */ + negate: function (out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + }, + + /** + * 插值两个点 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + * @param {number} t + */ + lerp: function (out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + }, + + /** + * 矩阵左乘向量 + * @param {Vector2} out + * @param {Vector2} v + * @param {Vector2} m + */ + applyTransform: function (out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + }, + /** + * 求两个向量最小值 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + min: function (out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + }, + /** + * 求两个向量最大值 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + max: function (out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + }; + + vector.length = vector.len; + vector.lengthSquare = vector.lenSquare; + vector.dist = vector.distance; + vector.distSquare = vector.distanceSquare; + + module.exports = vector; + + + +/***/ }, +/* 17 */ +/***/ function(module, exports) { + + + var ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + /** + * 3x2矩阵操作类 + * @exports zrender/tool/matrix + */ + var matrix = { + /** + * 创建一个单位矩阵 + * @return {Float32Array|Array.} + */ + create : function() { + var out = new ArrayCtor(6); + matrix.identity(out); + + return out; + }, + /** + * 设置矩阵为单位矩阵 + * @param {Float32Array|Array.} out + */ + identity : function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + }, + /** + * 复制矩阵 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} m + */ + copy: function(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; + }, + /** + * 矩阵相乘 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} m1 + * @param {Float32Array|Array.} m2 + */ + mul : function (out, m1, m2) { + // Consider matrix.mul(m, m2, m); + // where out is the same as m2. + // So use temp variable to escape error. + var out0 = m1[0] * m2[0] + m1[2] * m2[1]; + var out1 = m1[1] * m2[0] + m1[3] * m2[1]; + var out2 = m1[0] * m2[2] + m1[2] * m2[3]; + var out3 = m1[1] * m2[2] + m1[3] * m2[3]; + var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = out3; + out[4] = out4; + out[5] = out5; + return out; + }, + /** + * 平移变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {Float32Array|Array.} v + */ + translate : function(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; + }, + /** + * 旋转变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {number} rad + */ + rotate : function(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; + }, + /** + * 缩放变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {Float32Array|Array.} v + */ + scale : function(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; + }, + /** + * 求逆矩阵 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + */ + invert : function(out, a) { + + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + }; + + module.exports = matrix; + + + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getItemStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['stroke', 'borderColor'], + ['lineWidth', 'borderWidth'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Component model + * + * @module echarts/model/Component + */ + + + var Model = __webpack_require__(8); + var zrUtil = __webpack_require__(3); + var arrayPush = Array.prototype.push; + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + var layout = __webpack_require__(21); + + /** + * @alias module:echarts/model/Component + * @constructor + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {module:echarts/model/Model} ecModel + */ + var ComponentModel = Model.extend({ + + type: 'component', + + /** + * @readOnly + * @type {string} + */ + id: '', + + /** + * @readOnly + */ + name: '', + + /** + * @readOnly + * @type {string} + */ + mainType: '', + + /** + * @readOnly + * @type {string} + */ + subType: '', + + /** + * @readOnly + * @type {number} + */ + componentIndex: 0, + + /** + * @type {Object} + * @protected + */ + defaultOption: null, + + /** + * @type {module:echarts/model/Global} + * @readOnly + */ + ecModel: null, + + /** + * key: componentType + * value: Component model list, can not be null. + * @type {Object.>} + * @readOnly + */ + dependentModels: [], + + /** + * @type {string} + * @readOnly + */ + uid: null, + + /** + * Support merge layout params. + * Only support 'box' now (left/right/top/bottom/width/height). + * @type {string|Object} Object can be {ignoreSize: true} + * @readOnly + */ + layoutMode: null, + + + init: function (option, parentModel, ecModel, extraOpt) { + this.mergeDefaultAndTheme(this.option, this.ecModel); + }, + + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? layout.getLayoutParams(option) : {}; + + var themeModel = ecModel.getTheme(); + zrUtil.merge(option, themeModel.get(this.mainType)); + zrUtil.merge(option, this.getDefaultOption()); + + if (layoutMode) { + layout.mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + mergeOption: function (option) { + zrUtil.merge(this.option, option, true); + + var layoutMode = this.layoutMode; + if (layoutMode) { + layout.mergeLayoutParam(this.option, option, layoutMode); + } + }, + + // Hooker after init or mergeOption + optionUpdated: function (ecModel) {}, + + getDefaultOption: function () { + if (!this.hasOwnProperty('__defaultOption')) { + var optList = []; + var Class = this.constructor; + while (Class) { + var opt = Class.prototype.defaultOption; + opt && optList.push(opt); + Class = Class.superClass; + } + + var defaultOption = {}; + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = zrUtil.merge(defaultOption, optList[i], true); + } + this.__defaultOption = defaultOption; + } + return this.__defaultOption; + } + + }); + + // Reset ComponentModel.extend, add preConstruct. + clazzUtil.enableClassExtend( + ComponentModel, + function (option, parentModel, ecModel, extraOpt) { + // Set dependentModels, componentIndex, name, id, mainType, subType. + zrUtil.extend(this, extraOpt); + + this.uid = componentUtil.getUID('componentModel'); + + // this.setReadOnly([ + // 'type', 'id', 'uid', 'name', 'mainType', 'subType', + // 'dependentModels', 'componentIndex' + // ]); + } + ); + + // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement( + ComponentModel, {registerWhenExtend: true} + ); + componentUtil.enableSubTypeDefaulter(ComponentModel); + + // Add capability of ComponentModel.topologicalTravel. + componentUtil.enableTopologicalTravel(ComponentModel, getDependencies); + + function getDependencies(componentType) { + var deps = []; + zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) { + arrayPush.apply(deps, Clazz.prototype.dependencies || []); + }); + // Ensure main type + return zrUtil.map(deps, function (type) { + return clazzUtil.parseClassType(type).main; + }); + } + + zrUtil.mixin(ComponentModel, __webpack_require__(22)); + + module.exports = ComponentModel; + + +/***/ }, +/* 20 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var clazz = __webpack_require__(9); + + var parseClassType = clazz.parseClassType; + + var base = 0; + + var componentUtil = {}; + + var DELIMITER = '_'; + + /** + * @public + * @param {string} type + * @return {string} + */ + componentUtil.getUID = function (type) { + // Considering the case of crossing js context, + // use Math.random to make id as unique as possible. + return [(type || ''), base++, Math.random()].join(DELIMITER); + }; + + /** + * @inner + */ + componentUtil.enableSubTypeDefaulter = function (entity) { + + var subTypeDefaulters = {}; + + entity.registerSubTypeDefaulter = function (componentType, defaulter) { + componentType = parseClassType(componentType); + subTypeDefaulters[componentType.main] = defaulter; + }; + + entity.determineSubType = function (componentType, option) { + var type = option.type; + if (!type) { + var componentTypeMain = parseClassType(componentType).main; + if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + return type; + }; + + return entity; + }; + + /** + * Topological travel on Activity Network (Activity On Vertices). + * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis']. + * + * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology. + * + * If there is circle dependencey, Error will be thrown. + * + */ + componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) { + + /** + * @public + * @param {Array.} targetNameList Target Component type list. + * Can be ['aa', 'bb', 'aa.xx'] + * @param {Array.} fullNameList By which we can build dependency graph. + * @param {Function} callback Params: componentType, dependencies. + * @param {Object} context Scope of callback. + */ + entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var stack = result.noEntryList; + + var targetNameSet = {}; + zrUtil.each(targetNameList, function (name) { + targetNameSet[name] = true; + }); + + while (stack.length) { + var currComponentType = stack.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + zrUtil.each( + currVertex.successor, + isInTargetNameSet ? removeEdgeAndAdd : removeEdge + ); + } + + zrUtil.each(targetNameSet, function () { + throw new Error('Circle dependency may exists'); + }); + + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + if (graph[succComponentType].entryCount === 0) { + stack.push(succComponentType); + } + } + + // Consider this case: legend depends on series, and we call + // chart.setOption({series: [...]}), where only series is in option. + // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will + // not be called, but only sereis.mergeOption is called. Thus legend + // have no chance to update its local record about series (like which + // name of series is available in legend). + function removeEdgeAndAdd(succComponentType) { + targetNameSet[succComponentType] = true; + removeEdge(succComponentType); + } + }; + + /** + * DepndencyGraph: {Object} + * key: conponentType, + * value: { + * successor: [conponentTypes...], + * originalDeps: [conponentTypes...], + * entryCount: {number} + * } + */ + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + + zrUtil.each(fullNameList, function (name) { + + var thisItem = createDependencyGraphItem(graph, name); + var originalDeps = thisItem.originalDeps = dependencyGetter(name); + + var availableDeps = getAvailableDependencies(originalDeps, fullNameList); + thisItem.entryCount = availableDeps.length; + if (thisItem.entryCount === 0) { + noEntryList.push(name); + } + + zrUtil.each(availableDeps, function (dependentName) { + if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + var thatItem = createDependencyGraphItem(graph, dependentName); + if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) { + thatItem.successor.push(name); + } + }); + }); + + return {graph: graph, noEntryList: noEntryList}; + } + + function createDependencyGraphItem(graph, name) { + if (!graph[name]) { + graph[name] = {predecessor: [], successor: []}; + } + return graph[name]; + } + + function getAvailableDependencies(originalDeps, fullNameList) { + var availableDeps = []; + zrUtil.each(originalDeps, function (dep) { + zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } + }; + + module.exports = componentUtil; + + +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Layout helpers for each component positioning + + + var zrUtil = __webpack_require__(3); + var BoundingRect = __webpack_require__(15); + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + var parsePercent = numberUtil.parsePercent; + var each = zrUtil.each; + + var layout = {}; + + var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height']; + + function boxLayout(orient, group, gap, maxWidth, maxHeight) { + var x = 0; + var y = 0; + if (maxWidth == null) { + maxWidth = Infinity; + } + if (maxHeight == null) { + maxHeight = Infinity; + } + var currentLineMaxSize = 0; + group.eachChild(function (child, idx) { + var position = child.position; + var rect = child.getBoundingRect(); + var nextChild = group.childAt(idx + 1); + var nextChildRect = nextChild && nextChild.getBoundingRect(); + var nextX; + var nextY; + if (orient === 'horizontal') { + var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0); + nextX = x + moveX; + // Wrap when width exceeds maxWidth or meet a `newline` group + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } + else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); + } + } + else { + var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0); + nextY = y + moveY; + // Wrap when width exceeds maxHeight or meet a `newline` group + if (nextY > maxHeight || child.newline) { + x += currentLineMaxSize + gap; + y = 0; + nextY = moveY; + currentLineMaxSize = rect.width; + } + else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); + } + } + + if (child.newline) { + return; + } + + position[0] = x; + position[1] = y; + + orient === 'horizontal' + ? (x = nextX + gap) + : (y = nextY + gap); + }); + } + + /** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.box = boxLayout; + + /** + * VBox layouting + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.vbox = zrUtil.curry(boxLayout, 'vertical'); + + /** + * HBox layouting + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.hbox = zrUtil.curry(boxLayout, 'horizontal'); + + /** + * If x or x2 is not specified or 'center' 'left' 'right', + * the width would be as long as possible. + * If y or y2 is not specified or 'middle' 'top' 'bottom', + * the height would be as long as possible. + * + * @param {Object} positionInfo + * @param {number|string} [positionInfo.x] + * @param {number|string} [positionInfo.y] + * @param {number|string} [positionInfo.x2] + * @param {number|string} [positionInfo.y2] + * @param {Object} containerRect + * @param {string|number} margin + * @return {Object} {width, height} + */ + layout.getAvailableSize = function (positionInfo, containerRect, margin) { + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + + var x = parsePercent(positionInfo.x, containerWidth); + var y = parsePercent(positionInfo.y, containerHeight); + var x2 = parsePercent(positionInfo.x2, containerWidth); + var y2 = parsePercent(positionInfo.y2, containerHeight); + + (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0); + (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth); + (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0); + (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight); + + margin = formatUtil.normalizeCssArray(margin || 0); + + return { + width: Math.max(x2 - x - margin[1] - margin[3], 0), + height: Math.max(y2 - y - margin[0] - margin[2], 0) + }; + }; + + /** + * Parse position info. + * + * @param {Object} positionInfo + * @param {number|string} [positionInfo.left] + * @param {number|string} [positionInfo.top] + * @param {number|string} [positionInfo.right] + * @param {number|string} [positionInfo.bottom] + * @param {number|string} [positionInfo.width] + * @param {number|string} [positionInfo.height] + * @param {number|string} [positionInfo.aspect] Aspect is width / height + * @param {Object} containerRect + * @param {string|number} [margin] + * + * @return {module:zrender/core/BoundingRect} + */ + layout.getLayoutRect = function ( + positionInfo, containerRect, margin + ) { + margin = formatUtil.normalizeCssArray(margin || 0); + + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + + var left = parsePercent(positionInfo.left, containerWidth); + var top = parsePercent(positionInfo.top, containerHeight); + var right = parsePercent(positionInfo.right, containerWidth); + var bottom = parsePercent(positionInfo.bottom, containerHeight); + var width = parsePercent(positionInfo.width, containerWidth); + var height = parsePercent(positionInfo.height, containerHeight); + + var verticalMargin = margin[2] + margin[0]; + var horizontalMargin = margin[1] + margin[3]; + var aspect = positionInfo.aspect; + + // If width is not specified, calculate width from left and right + if (isNaN(width)) { + width = containerWidth - right - horizontalMargin - left; + } + if (isNaN(height)) { + height = containerHeight - bottom - verticalMargin - top; + } + + // If width and height are not given + // 1. Graph should not exceeds the container + // 2. Aspect must be keeped + // 3. Graph should take the space as more as possible + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } + else { + height = containerHeight * 0.8; + } + } + + if (aspect != null) { + // Calculate width or height with given aspect + if (isNaN(width)) { + width = aspect * height; + } + if (isNaN(height)) { + height = width / aspect; + } + } + + // If left is not specified, calculate left from right and width + if (isNaN(left)) { + left = containerWidth - right - width - horizontalMargin; + } + if (isNaN(top)) { + top = containerHeight - bottom - height - verticalMargin; + } + + // Align left and top + switch (positionInfo.left || positionInfo.right) { + case 'center': + left = containerWidth / 2 - width / 2 - margin[3]; + break; + case 'right': + left = containerWidth - width - horizontalMargin; + break; + } + switch (positionInfo.top || positionInfo.bottom) { + case 'middle': + case 'center': + top = containerHeight / 2 - height / 2 - margin[0]; + break; + case 'bottom': + top = containerHeight - height - verticalMargin; + break; + } + // If something is wrong and left, top, width, height are calculated as NaN + left = left || 0; + top = top || 0; + if (isNaN(width)) { + // Width may be NaN if only one value is given except width + width = containerWidth - left - (right || 0); + } + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - top - (bottom || 0); + } + + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; + }; + + /** + * Position group of component in viewport + * Group position is specified by either + * {left, top}, {right, bottom} + * If all properties exists, right and bottom will be igonred. + * + * @param {module:zrender/container/Group} group + * @param {Object} positionInfo + * @param {number|string} [positionInfo.left] + * @param {number|string} [positionInfo.top] + * @param {number|string} [positionInfo.right] + * @param {number|string} [positionInfo.bottom] + * @param {Object} containerRect + * @param {string|number} margin + */ + layout.positionGroup = function ( + group, positionInfo, containerRect, margin + ) { + var groupRect = group.getBoundingRect(); + + positionInfo = zrUtil.extend(zrUtil.clone(positionInfo), { + width: groupRect.width, + height: groupRect.height + }); + + positionInfo = layout.getLayoutRect( + positionInfo, containerRect, margin + ); + + group.position = [ + positionInfo.x - groupRect.x, + positionInfo.y - groupRect.y + ]; + }; + + /** + * Consider Case: + * When defulat option has {left: 0, width: 100}, and we set {right: 0} + * through setOption or media query, using normal zrUtil.merge will cause + * {right: 0} does not take effect. + * + * @example + * ComponentModel.extend({ + * init: function () { + * ... + * var inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param {Object} targetOption + * @param {Object} newOption + * @param {Object|string} [opt] + * @param {boolean} [opt.ignoreSize=false] Some component must has width and height. + */ + layout.mergeLayoutParam = function (targetOption, newOption, opt) { + !zrUtil.isObject(opt) && (opt = {}); + var hNames = ['width', 'left', 'right']; // Order by priority. + var vNames = ['height', 'top', 'bottom']; // Order by priority. + var hResult = merge(hNames); + var vResult = merge(vNames); + + copy(hNames, targetOption, hResult); + copy(vNames, targetOption, vResult); + + function merge(names) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = opt.ignoreSize ? 1 : 2; + + each(names, function (name) { + merged[name] = targetOption[name]; + }); + each(names, function (name) { + // Consider case: newOption.width is null, which is + // set by user for removing width setting. + hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); + hasValue(newParams, name) && newValueCount++; + hasValue(merged, name) && mergedValueCount++; + }); + + // Case: newOption: {width: ..., right: ...}, + // or targetOption: {right: ...} and newOption: {width: ...}, + // There is no conflict when merged only has params count + // little than enoughParamNumber. + if (mergedValueCount === enoughParamNumber || !newValueCount) { + return merged; + } + // Case: newOption: {width: ..., right: ...}, + // Than we can make sure user only want those two, and ignore + // all origin params in targetOption. + else if (newValueCount >= enoughParamNumber) { + return newParams; + } + else { + // Chose another param from targetOption by priority. + // When 'ignoreSize', enoughParamNumber is 1 and those will not happen. + for (var i = 0; i < names.length; i++) { + var name = names[i]; + if (!hasProp(newParams, name) && hasProp(targetOption, name)) { + newParams[name] = targetOption[name]; + break; + } + } + return newParams; + } + } + + function hasProp(obj, name) { + return obj.hasOwnProperty(name); + } + + function hasValue(obj, name) { + return obj[name] != null && obj[name] !== 'auto'; + } + + function copy(names, target, source) { + each(names, function (name) { + target[name] = source[name]; + }); + } + }; + + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + layout.getLayoutParams = function (source) { + return layout.copyLayoutParams({}, source); + }; + + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + layout.copyLayoutParams = function (target, source) { + source && target && each(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; + }; + + module.exports = layout; + + +/***/ }, +/* 22 */ +/***/ function(module, exports) { + + + + module.exports = { + getBoxLayoutParams: function () { + return { + left: this.get('left'), + top: this.get('top'), + right: this.get('right'), + bottom: this.get('bottom'), + width: this.get('width'), + height: this.get('height') + }; + } + }; + + +/***/ }, +/* 23 */ +/***/ function(module, exports) { + + + var platform = ''; + // Navigator not exists in node + if (typeof navigator !== 'undefined') { + platform = navigator.platform || ''; + } + module.exports = { + // 全图默认背景 + // backgroundColor: 'rgba(0,0,0,0)', + + // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization + // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'], + // 浅色 + // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'], + // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'], + // 深色 + color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83', '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'], + + // 默认需要 Grid 配置项 + grid: {}, + // 主题,主题 + textStyle: { + // color: '#000', + // decoration: 'none', + // PENDING + fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif', + // fontFamily: 'Arial, Verdana, sans-serif', + fontSize: 12, + fontStyle: 'normal', + fontWeight: 'normal' + }, + // 主题,默认标志图形类型列表 + // symbolList: [ + // 'circle', 'rectangle', 'triangle', 'diamond', + // 'emptyCircle', 'emptyRectangle', 'emptyTriangle', 'emptyDiamond' + // ], + animation: true, // 过渡动画是否开启 + animationThreshold: 2000, // 动画元素阀值,产生的图形原素超过2000不出动画 + animationDuration: 1000, // 过渡动画参数:进入 + animationDurationUpdate: 300, // 过渡动画参数:更新 + animationEasing: 'exponentialOut', //BounceOut + animationEasingUpdate: 'cubicOut' + }; + + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var echartsAPIList = [ + 'getDom', 'getZr', 'getWidth', 'getHeight', 'dispatchAction', + 'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption' + ]; + + function ExtensionAPI(chartInstance) { + zrUtil.each(echartsAPIList, function (name) { + this[name] = zrUtil.bind(chartInstance[name], chartInstance); + }, this); + } + + module.exports = ExtensionAPI; + + +/***/ }, +/* 25 */ +/***/ function(module, exports) { + + 'use strict'; + + + // var zrUtil = require('zrender/lib/core/util'); + var coordinateSystemCreators = {}; + + function CoordinateSystemManager() { + + this._coordinateSystems = []; + } + + CoordinateSystemManager.prototype = { + + constructor: CoordinateSystemManager, + + create: function (ecModel, api) { + var coordinateSystems = []; + for (var type in coordinateSystemCreators) { + var list = coordinateSystemCreators[type].create(ecModel, api); + list && (coordinateSystems = coordinateSystems.concat(list)); + } + + this._coordinateSystems = coordinateSystems; + }, + + update: function (ecModel, api) { + var coordinateSystems = this._coordinateSystems; + for (var i = 0; i < coordinateSystems.length; i++) { + // FIXME MUST have + coordinateSystems[i].update && coordinateSystems[i].update(ecModel, api); + } + } + }; + + CoordinateSystemManager.register = function (type, coordinateSystemCreator) { + coordinateSystemCreators[type] = coordinateSystemCreator; + }; + + CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; + }; + + module.exports = CoordinateSystemManager; + + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * ECharts option manager + * + * @module {echarts/model/OptionManager} + */ + + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var ComponentModel = __webpack_require__(19); + var each = zrUtil.each; + var clone = zrUtil.clone; + var map = zrUtil.map; + var merge = zrUtil.merge; + + var QUERY_REG = /^(min|max)?(.+)$/; + + /** + * TERM EXPLANATIONS: + * + * [option]: + * + * An object that contains definitions of components. For example: + * var option = { + * title: {...}, + * legend: {...}, + * visualMap: {...}, + * series: [ + * {data: [...]}, + * {data: [...]}, + * ... + * ] + * }; + * + * [rawOption]: + * + * An object input to echarts.setOption. 'rawOption' may be an + * 'option', or may be an object contains multi-options. For example: + * var option = { + * baseOption: { + * title: {...}, + * legend: {...}, + * series: [ + * {data: [...]}, + * {data: [...]}, + * ... + * ] + * }, + * timeline: {...}, + * options: [ + * {title: {...}, series: {data: [...]}}, + * {title: {...}, series: {data: [...]}}, + * ... + * ], + * media: [ + * { + * query: {maxWidth: 320}, + * option: {series: {x: 20}, visualMap: {show: false}} + * }, + * { + * query: {minWidth: 320, maxWidth: 720}, + * option: {series: {x: 500}, visualMap: {show: true}} + * }, + * { + * option: {series: {x: 1200}, visualMap: {show: true}} + * } + * ] + * }; + * + * @alias module:echarts/model/OptionManager + * @param {module:echarts/ExtensionAPI} api + */ + function OptionManager(api) { + + /** + * @private + * @type {module:echarts/ExtensionAPI} + */ + this._api = api; + + /** + * @private + * @type {Array.} + */ + this._timelineOptions = []; + + /** + * @private + * @type {Array.} + */ + this._mediaList = []; + + /** + * @private + * @type {Object} + */ + this._mediaDefault; + + /** + * -1, means default. + * empty means no media. + * @private + * @type {Array.} + */ + this._currentMediaIndices = []; + + /** + * @private + * @type {Object} + */ + this._optionBackup; + + /** + * @private + * @type {Object} + */ + this._newOptionBackup; + } + + // timeline.notMerge is not supported in ec3. Firstly there is rearly + // case that notMerge is needed. Secondly supporting 'notMerge' requires + // rawOption cloned and backuped when timeline changed, which does no + // good to performance. What's more, that both timeline and setOption + // method supply 'notMerge' brings complex and some problems. + // Consider this case: + // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false); + // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false); + + OptionManager.prototype = { + + constructor: OptionManager, + + /** + * @public + * @param {Object} rawOption Raw option. + * @param {module:echarts/model/Global} ecModel + * @param {Array.} optionPreprocessorFuncs + * @return {Object} Init option + */ + setOption: function (rawOption, optionPreprocessorFuncs) { + rawOption = clone(rawOption, true); + + // FIXME + // 如果 timeline options 或者 media 中设置了某个属性,而baseOption中没有设置,则进行警告。 + + var oldOptionBackup = this._optionBackup; + var newOptionBackup = this._newOptionBackup = parseRawOption.call( + this, rawOption, optionPreprocessorFuncs + ); + + // For setOption at second time (using merge mode); + if (oldOptionBackup) { + // Only baseOption can be merged. + mergeOption(oldOptionBackup.baseOption, newOptionBackup.baseOption); + + if (newOptionBackup.timelineOptions.length) { + oldOptionBackup.timelineOptions = newOptionBackup.timelineOptions; + } + if (newOptionBackup.mediaList.length) { + oldOptionBackup.mediaList = newOptionBackup.mediaList; + } + if (newOptionBackup.mediaDefault) { + oldOptionBackup.mediaDefault = newOptionBackup.mediaDefault; + } + } + else { + this._optionBackup = newOptionBackup; + } + }, + + /** + * @param {boolean} isRecreate + * @return {Object} + */ + mountOption: function (isRecreate) { + var optionBackup = isRecreate + // this._optionBackup can be only used when recreate. + // In other cases we use model.mergeOption to handle merge. + ? this._optionBackup : this._newOptionBackup; + + // FIXME + // 如果没有reset功能则不clone。 + + this._timelineOptions = map(optionBackup.timelineOptions, clone); + this._mediaList = map(optionBackup.mediaList, clone); + this._mediaDefault = clone(optionBackup.mediaDefault); + this._currentMediaIndices = []; + + return clone(optionBackup.baseOption); + }, + + /** + * @param {module:echarts/model/Global} ecModel + * @return {Object} + */ + getTimelineOption: function (ecModel) { + var option; + var timelineOptions = this._timelineOptions; + + if (timelineOptions.length) { + // getTimelineOption can only be called after ecModel inited, + // so we can get currentIndex from timelineModel. + var timelineModel = ecModel.getComponent('timeline'); + if (timelineModel) { + option = clone( + timelineOptions[timelineModel.getCurrentIndex()], + true + ); + } + } + + return option; + }, + + /** + * @param {module:echarts/model/Global} ecModel + * @return {Array.} + */ + getMediaOption: function (ecModel) { + var ecWidth = this._api.getWidth(); + var ecHeight = this._api.getHeight(); + var mediaList = this._mediaList; + var mediaDefault = this._mediaDefault; + var indices = []; + var result = []; + + // No media defined. + if (!mediaList.length && !mediaDefault) { + return result; + } + + // Multi media may be applied, the latter defined media has higher priority. + for (var i = 0, len = mediaList.length; i < len; i++) { + if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { + indices.push(i); + } + } + + // FIXME + // 是否mediaDefault应该强制用户设置,否则可能修改不能回归。 + if (!indices.length && mediaDefault) { + indices = [-1]; + } + + if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { + result = map(indices, function (index) { + return clone( + index === -1 ? mediaDefault.option : mediaList[index].option + ); + }); + } + // Otherwise return nothing. + + this._currentMediaIndices = indices; + + return result; + } + }; + + function parseRawOption(rawOption, optionPreprocessorFuncs) { + var timelineOptions = []; + var mediaList = []; + var mediaDefault; + var baseOption; + + // Compatible with ec2. + var timelineOpt = rawOption.timeline; + + if (rawOption.baseOption) { + baseOption = rawOption.baseOption; + } + + // For timeline + if (timelineOpt || rawOption.options) { + baseOption = baseOption || {}; + timelineOptions = (rawOption.options || []).slice(); + } + // For media query + if (rawOption.media) { + baseOption = baseOption || {}; + var media = rawOption.media; + each(media, function (singleMedia) { + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } + else if (!mediaDefault) { + // Use the first media default. + mediaDefault = singleMedia; + } + } + }); + } + + // For normal option + if (!baseOption) { + baseOption = rawOption; + } + + // Set timelineOpt to baseOption in ec3, + // which is convenient for merge option. + if (!baseOption.timeline) { + baseOption.timeline = timelineOpt; + } + + // Preprocess. + each([baseOption].concat(timelineOptions) + .concat(zrUtil.map(mediaList, function (media) { + return media.option; + })), + function (option) { + each(optionPreprocessorFuncs, function (preProcess) { + preProcess(option); + }); + } + ); + + return { + baseOption: baseOption, + timelineOptions: timelineOptions, + mediaDefault: mediaDefault, + mediaList: mediaList + }; + } + + /** + * @see + * Support: width, height, aspectRatio + * Can use max or min as prefix. + */ + function applyMediaQuery(query, ecWidth, ecHeight) { + var realMap = { + width: ecWidth, + height: ecHeight, + aspectratio: ecWidth / ecHeight // lowser case for convenientce. + }; + + var applicatable = true; + + zrUtil.each(query, function (value, attr) { + var matched = attr.match(QUERY_REG); + + if (!matched || !matched[1] || !matched[2]) { + return; + } + + var operator = matched[1]; + var realAttr = matched[2].toLowerCase(); + + if (!compare(realMap[realAttr], value, operator)) { + applicatable = false; + } + }); + + return applicatable; + } + + function compare(real, expect, operator) { + if (operator === 'min') { + return real >= expect; + } + else if (operator === 'max') { + return real <= expect; + } + else { // Equals + return real === expect; + } + } + + function indicesEquals(indices1, indices2) { + // indices is always order by asc and has only finite number. + return indices1.join(',') === indices2.join(','); + } + + /** + * Consider case: + * `chart.setOption(opt1);` + * Then user do some interaction like dataZoom, dataView changing. + * `chart.setOption(opt2);` + * Then user press 'reset button' in toolbox. + * + * After doing that all of the interaction effects should be reset, the + * chart should be the same as the result of invoke + * `chart.setOption(opt1); chart.setOption(opt2);`. + * + * Although it is not able ensure that + * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to + * `chart.setOption(merge(opt1, opt2));` exactly, + * this might be the only simple way to implement that feature. + * + * MEMO: We've considered some other approaches: + * 1. Each model handle its self restoration but not uniform treatment. + * (Too complex in logic and error-prone) + * 2. Use a shadow ecModel. (Performace expensive) + */ + function mergeOption(oldOption, newOption) { + newOption = newOption || {}; + + each(newOption, function (newCptOpt, mainType) { + if (newCptOpt == null) { + return; + } + + var oldCptOpt = oldOption[mainType]; + + if (!ComponentModel.hasClass(mainType)) { + oldOption[mainType] = merge(oldCptOpt, newCptOpt, true); + } + else { + newCptOpt = modelUtil.normalizeToArray(newCptOpt); + oldCptOpt = modelUtil.normalizeToArray(oldCptOpt); + + var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt); + + oldOption[mainType] = map(mapResult, function (item) { + return (item.option && item.exist) + ? merge(item.exist, item.option, true) + : (item.exist || item.option); + }); + } + }); + } + + module.exports = OptionManager; + + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var formatUtil = __webpack_require__(6); + var modelUtil = __webpack_require__(5); + var ComponentModel = __webpack_require__(19); + + var encodeHTML = formatUtil.encodeHTML; + var addCommas = formatUtil.addCommas; + + var SeriesModel = ComponentModel.extend({ + + type: 'series.__base__', + + /** + * @readOnly + */ + seriesIndex: 0, + + // coodinateSystem will be injected in the echarts/CoordinateSystem + coordinateSystem: null, + + /** + * @type {Object} + * @protected + */ + defaultOption: null, + + /** + * Data provided for legend + * @type {Function} + */ + // PENDING + legendDataProvider: null, + + init: function (option, parentModel, ecModel, extraOpt) { + + /** + * @type {number} + * @readOnly + */ + this.seriesIndex = this.componentIndex; + + this.mergeDefaultAndTheme(option, ecModel); + + /** + * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph} + * @private + */ + this._dataBeforeProcessed = this.getInitialData(option, ecModel); + + // When using module:echarts/data/Tree or module:echarts/data/Graph, + // cloneShallow will cause this._data.graph.data pointing to new data list. + // Wo we make this._dataBeforeProcessed first, and then make this._data. + this._data = this._dataBeforeProcessed.cloneShallow(); + }, + + /** + * Util for merge default and theme to option + * @param {Object} option + * @param {module:echarts/model/Global} ecModel + */ + mergeDefaultAndTheme: function (option, ecModel) { + zrUtil.merge( + option, + ecModel.getTheme().get(this.subType) + ); + zrUtil.merge(option, this.getDefaultOption()); + + // Default label emphasis `position` and `show` + modelUtil.defaultEmphasis( + option.label, ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + + // Default data label emphasis `position` and `show` + // FIXME Tree structure data ? + var data = option.data || []; + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + modelUtil.defaultEmphasis( + data[i].label, ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + } + } + }, + + mergeOption: function (newSeriesOption, ecModel) { + newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true); + + var data = this.getInitialData(newSeriesOption, ecModel); + // TODO Merge data? + if (data) { + this._data = data; + this._dataBeforeProcessed = data.cloneShallow(); + } + }, + + /** + * Init a data structure from data related option in series + * Must be overwritten + */ + getInitialData: function () {}, + + /** + * @return {module:echarts/data/List} + */ + getData: function () { + return this._data; + }, + + /** + * @param {module:echarts/data/List} data + */ + setData: function (data) { + this._data = data; + }, + + /** + * Get data before processed + * @return {module:echarts/data/List} + */ + getRawData: function () { + return this._dataBeforeProcessed; + }, + + /** + * Get raw data array given by user + * @return {Array.} + */ + getRawDataArray: function () { + return this.option.data; + }, + + /** + * Coord dimension to data dimension. + * + * By default the result is the same as dimensions of series data. + * But some series dimensions are different from coord dimensions (i.e. + * candlestick and boxplot). Override this method to handle those cases. + * + * Coord dimension to data dimension can be one-to-many + * + * @param {string} coordDim + * @return {Array.} dimensions on the axis. + */ + coordDimToDataDim: function (coordDim) { + return [coordDim]; + }, + + /** + * Convert data dimension to coord dimension. + * + * @param {string|number} dataDim + * @return {string} + */ + dataDimToCoordDim: function (dataDim) { + return dataDim; + }, + + /** + * Get base axis if has coordinate system and has axis. + * By default use coordSys.getBaseAxis(); + * Can be overrided for some chart. + * @return {type} description + */ + getBaseAxis: function () { + var coordSys = this.coordinateSystem; + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }, + + // FIXME + /** + * Default tooltip formatter + * + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + */ + formatTooltip: function (dataIndex, multipleSeries) { + var data = this._data; + var value = this.getRawValue(dataIndex); + var formattedValue = zrUtil.isArray(value) + ? zrUtil.map(value, addCommas).join(', ') : addCommas(value); + var name = data.getName(dataIndex); + var color = data.getItemVisual(dataIndex, 'color'); + var colorEl = ''; + + return !multipleSeries + ? (encodeHTML(this.name) + '
            ' + colorEl + + (name + ? encodeHTML(name) + ' : ' + formattedValue + : formattedValue) + ) + : (colorEl + encodeHTML(this.name) + ' : ' + formattedValue); + }, + + restoreData: function () { + this._data = this._dataBeforeProcessed.cloneShallow(); + } + }); + + zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin); + + module.exports = SeriesModel; + + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Group = __webpack_require__(29); + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + + var Component = function () { + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = componentUtil.getUID('viewComponent'); + }; + + Component.prototype = { + + constructor: Component, + + init: function (ecModel, api) {}, + + render: function (componentModel, ecModel, api, payload) {}, + + dispose: function () {} + }; + + var componentProto = Component.prototype; + componentProto.updateView + = componentProto.updateLayout + = componentProto.updateVisual + = function (seriesModel, ecModel, api, payload) { + // Do nothing; + }; + // Enable Component.extend. + clazzUtil.enableClassExtend(Component); + + // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement(Component, {registerWhenExtend: true}); + + module.exports = Component; + + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Group是一个容器,可以插入子节点,Group的变换也会被应用到子节点上 + * @module zrender/graphic/Group + * @example + * var Group = require('zrender/lib/container/Group'); + * var Circle = require('zrender/lib/graphic/shape/Circle'); + * var g = new Group(); + * g.position[0] = 100; + * g.position[1] = 100; + * g.add(new Circle({ + * style: { + * x: 100, + * y: 100, + * r: 20, + * } + * })); + * zr.add(g); + */ + + + var zrUtil = __webpack_require__(3); + var Element = __webpack_require__(30); + var BoundingRect = __webpack_require__(15); + + /** + * @alias module:zrender/graphic/Group + * @constructor + * @extends module:zrender/mixin/Transformable + * @extends module:zrender/mixin/Eventful + */ + var Group = function (opts) { + + opts = opts || {}; + + Element.call(this, opts); + + for (var key in opts) { + this[key] = opts[key]; + } + + this._children = []; + + this.__storage = null; + + this.__dirty = true; + }; + + Group.prototype = { + + constructor: Group, + + /** + * @type {string} + */ + type: 'group', + + /** + * @return {Array.} + */ + children: function () { + return this._children.slice(); + }, + + /** + * 获取指定 index 的儿子节点 + * @param {number} idx + * @return {module:zrender/Element} + */ + childAt: function (idx) { + return this._children[idx]; + }, + + /** + * 获取指定名字的儿子节点 + * @param {string} name + * @return {module:zrender/Element} + */ + childOfName: function (name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }, + + /** + * @return {number} + */ + childCount: function () { + return this._children.length; + }, + + /** + * 添加子节点到最后 + * @param {module:zrender/Element} child + */ + add: function (child) { + if (child && child !== this && child.parent !== this) { + + this._children.push(child); + + this._doAdd(child); + } + + return this; + }, + + /** + * 添加子节点在 nextSibling 之前 + * @param {module:zrender/Element} child + * @param {module:zrender/Element} nextSibling + */ + addBefore: function (child, nextSibling) { + if (child && child !== this && child.parent !== this + && nextSibling && nextSibling.parent === this) { + + var children = this._children; + var idx = children.indexOf(nextSibling); + + if (idx >= 0) { + children.splice(idx, 0, child); + this._doAdd(child); + } + } + + return this; + }, + + _doAdd: function (child) { + if (child.parent) { + child.parent.remove(child); + } + + child.parent = this; + + var storage = this.__storage; + var zr = this.__zr; + if (storage && storage !== child.__storage) { + + storage.addToMap(child); + + if (child instanceof Group) { + child.addChildrenToStorage(storage); + } + } + + zr && zr.refresh(); + }, + + /** + * 移除子节点 + * @param {module:zrender/Element} child + */ + remove: function (child) { + var zr = this.__zr; + var storage = this.__storage; + var children = this._children; + + var idx = zrUtil.indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + + child.parent = null; + + if (storage) { + + storage.delFromMap(child.id); + + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + + zr && zr.refresh(); + + return this; + }, + + /** + * 移除所有子节点 + */ + removeAll: function () { + var children = this._children; + var storage = this.__storage; + var child; + var i; + for (i = 0; i < children.length; i++) { + child = children[i]; + if (storage) { + storage.delFromMap(child.id); + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + child.parent = null; + } + children.length = 0; + + return this; + }, + + /** + * 遍历所有子节点 + * @param {Function} cb + * @param {} context + */ + eachChild: function (cb, context) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + cb.call(context, child, i); + } + return this; + }, + + /** + * 深度优先遍历所有子孙节点 + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + cb.call(context, child); + + if (child.type === 'group') { + child.traverse(cb, context); + } + } + return this; + }, + + addChildrenToStorage: function (storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.addToMap(child); + if (child instanceof Group) { + child.addChildrenToStorage(storage); + } + } + }, + + delChildrenFromStorage: function (storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.delFromMap(child.id); + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + }, + + dirty: function () { + this.__dirty = true; + this.__zr && this.__zr.refresh(); + return this; + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function (includeChildren) { + // TODO Caching + // TODO Transform + var rect = null; + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.ignore || child.invisible) { + continue; + } + + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + tmpRect.copy(childRect); + tmpRect.applyTransform(transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + } + }; + + zrUtil.inherits(Group, Element); + + module.exports = Group; + + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module zrender/Element + */ + + + var guid = __webpack_require__(31); + var Eventful = __webpack_require__(32); + var Transformable = __webpack_require__(33); + var Animatable = __webpack_require__(34); + var zrUtil = __webpack_require__(3); + + /** + * @alias module:zrender/Element + * @constructor + * @extends {module:zrender/mixin/Animatable} + * @extends {module:zrender/mixin/Transformable} + * @extends {module:zrender/mixin/Eventful} + */ + var Element = function (opts) { + + Transformable.call(this, opts); + Eventful.call(this, opts); + Animatable.call(this, opts); + + /** + * 画布元素ID + * @type {string} + */ + this.id = opts.id || guid(); + }; + + Element.prototype = { + + /** + * 元素类型 + * Element type + * @type {string} + */ + type: 'element', + + /** + * 元素名字 + * Element name + * @type {string} + */ + name: '', + + /** + * ZRender 实例对象,会在 element 添加到 zrender 实例中后自动赋值 + * ZRender instance will be assigned when element is associated with zrender + * @name module:/zrender/Element#__zr + * @type {module:zrender/ZRender} + */ + __zr: null, + + /** + * 图形是否忽略,为true时忽略图形的绘制以及事件触发 + * If ignore drawing and events of the element object + * @name module:/zrender/Element#ignore + * @type {boolean} + * @default false + */ + ignore: false, + + /** + * 用于裁剪的路径(shape),所有 Group 内的路径在绘制时都会被这个路径裁剪 + * 该路径会继承被裁减对象的变换 + * @type {module:zrender/graphic/Path} + * @see http://www.w3.org/TR/2dcontext/#clipping-region + * @readOnly + */ + clipPath: null, + + /** + * Drift element + * @param {number} dx dx on the global space + * @param {number} dy dy on the global space + */ + drift: function (dx, dy) { + switch (this.draggable) { + case 'horizontal': + dy = 0; + break; + case 'vertical': + dx = 0; + break; + } + + var m = this.transform; + if (!m) { + m = this.transform = [1, 0, 0, 1, 0, 0]; + } + m[4] += dx; + m[5] += dy; + + this.decomposeTransform(); + this.dirty(); + }, + + /** + * Hook before update + */ + beforeUpdate: function () {}, + /** + * Hook after update + */ + afterUpdate: function () {}, + /** + * Update each frame + */ + update: function () { + this.updateTransform(); + }, + + /** + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) {}, + + /** + * @protected + */ + attrKV: function (key, value) { + if (key === 'position' || key === 'scale' || key === 'origin') { + // Copy the array + if (value) { + var target = this[key]; + if (!target) { + target = this[key] = []; + } + target[0] = value[0]; + target[1] = value[1]; + } + } + else { + this[key] = value; + } + }, + + /** + * Hide the element + */ + hide: function () { + this.ignore = true; + this.__zr && this.__zr.refresh(); + }, + + /** + * Show the element + */ + show: function () { + this.ignore = false; + this.__zr && this.__zr.refresh(); + }, + + /** + * @param {string|Object} key + * @param {*} value + */ + attr: function (key, value) { + if (typeof key === 'string') { + this.attrKV(key, value); + } + else if (zrUtil.isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.attrKV(name, key[name]); + } + } + } + this.dirty(); + + return this; + }, + + /** + * @param {module:zrender/graphic/Path} clipPath + */ + setClipPath: function (clipPath) { + var zr = this.__zr; + if (zr) { + clipPath.addSelfToZr(zr); + } + + // Remove previous clip path + if (this.clipPath && this.clipPath !== clipPath) { + this.removeClipPath(); + } + + this.clipPath = clipPath; + clipPath.__zr = zr; + clipPath.__clipTarget = this; + + this.dirty(); + }, + + /** + */ + removeClipPath: function () { + var clipPath = this.clipPath; + if (clipPath) { + if (clipPath.__zr) { + clipPath.removeSelfFromZr(clipPath.__zr); + } + + clipPath.__zr = null; + clipPath.__clipTarget = null; + this.clipPath = null; + + this.dirty(); + } + }, + + /** + * Add self from zrender instance. + * Not recursively because it will be invoked when element added to storage. + * @param {module:zrender/ZRender} zr + */ + addSelfToZr: function (zr) { + this.__zr = zr; + // 添加动画 + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.addAnimator(animators[i]); + } + } + + if (this.clipPath) { + this.clipPath.addSelfToZr(zr); + } + }, + + /** + * Remove self from zrender instance. + * Not recursively because it will be invoked when element added to storage. + * @param {module:zrender/ZRender} zr + */ + removeSelfFromZr: function (zr) { + this.__zr = null; + // 移除动画 + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.removeAnimator(animators[i]); + } + } + + if (this.clipPath) { + this.clipPath.removeSelfFromZr(zr); + } + } + }; + + zrUtil.mixin(Element, Animatable); + zrUtil.mixin(Element, Transformable); + zrUtil.mixin(Element, Eventful); + + module.exports = Element; + + +/***/ }, +/* 31 */ +/***/ function(module, exports) { + + /** + * zrender: 生成唯一id + * + * @author errorrik (errorrik@gmail.com) + */ + + + var idStart = 0x0907; + + module.exports = function () { + return 'zr_' + (idStart++); + }; + + + +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 事件扩展 + * @module zrender/mixin/Eventful + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * pissang (https://www.github.com/pissang) + */ + + + var arrySlice = Array.prototype.slice; + var zrUtil = __webpack_require__(3); + var indexOf = zrUtil.indexOf; + + /** + * 事件分发器 + * @alias module:zrender/mixin/Eventful + * @constructor + */ + var Eventful = function () { + this._$handlers = {}; + }; + + Eventful.prototype = { + + constructor: Eventful, + + /** + * 单次触发绑定,trigger后销毁 + * + * @param {string} event 事件名 + * @param {Function} handler 响应函数 + * @param {Object} context + */ + one: function (event, handler, context) { + var _h = this._$handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + if (indexOf(_h[event], event) >= 0) { + return this; + } + + _h[event].push({ + h: handler, + one: true, + ctx: context || this + }); + + return this; + }, + + /** + * 绑定事件 + * @param {string} event 事件名 + * @param {Function} handler 事件处理函数 + * @param {Object} [context] + */ + on: function (event, handler, context) { + var _h = this._$handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + h: handler, + one: false, + ctx: context || this + }); + + return this; + }, + + /** + * 是否绑定了事件 + * @param {string} event + * @return {boolean} + */ + isSilent: function (event) { + var _h = this._$handlers; + return _h[event] && _h[event].length; + }, + + /** + * 解绑事件 + * @param {string} event 事件名 + * @param {Function} [handler] 事件处理函数 + */ + off: function (event, handler) { + var _h = this._$handlers; + + if (!event) { + this._$handlers = {}; + return this; + } + + if (handler) { + if (_h[event]) { + var newList = []; + for (var i = 0, l = _h[event].length; i < l; i++) { + if (_h[event][i]['h'] != handler) { + newList.push(_h[event][i]); + } + } + _h[event] = newList; + } + + if (_h[event] && _h[event].length === 0) { + delete _h[event]; + } + } + else { + delete _h[event]; + } + + return this; + }, + + /** + * 事件分发 + * + * @param {string} type 事件类型 + */ + trigger: function (type) { + if (this._$handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 3) { + args = arrySlice.call(args, 1); + } + + var _h = this._$handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(_h[i]['ctx']); + break; + case 2: + _h[i]['h'].call(_h[i]['ctx'], args[1]); + break; + case 3: + _h[i]['h'].call(_h[i]['ctx'], args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(_h[i]['ctx'], args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } + else { + i++; + } + } + } + + return this; + }, + + /** + * 带有context的事件分发, 最后一个参数是事件回调的context + * @param {string} type 事件类型 + */ + triggerWithContext: function (type) { + if (this._$handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 4) { + args = arrySlice.call(args, 1, args.length - 1); + } + var ctx = args[args.length - 1]; + + var _h = this._$handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(ctx); + break; + case 2: + _h[i]['h'].call(ctx, args[1]); + break; + case 3: + _h[i]['h'].call(ctx, args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(ctx, args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } + else { + i++; + } + } + } + + return this; + } + }; + + // 对象可以通过 onxxxx 绑定事件 + /** + * @event module:zrender/mixin/Eventful#onclick + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseover + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseout + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousemove + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousewheel + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousedown + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseup + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragstart + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragend + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragenter + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragleave + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragover + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondrop + * @type {Function} + * @default null + */ + + module.exports = Eventful; + + + +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 提供变换扩展 + * @module zrender/mixin/Transformable + * @author pissang (https://www.github.com/pissang) + */ + + + var matrix = __webpack_require__(17); + var vector = __webpack_require__(16); + var mIdentity = matrix.identity; + + var EPSILON = 5e-5; + + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + + /** + * @alias module:zrender/mixin/Transformable + * @constructor + */ + var Transformable = function (opts) { + opts = opts || {}; + // If there are no given position, rotation, scale + if (!opts.position) { + /** + * 平移 + * @type {Array.} + * @default [0, 0] + */ + this.position = [0, 0]; + } + if (opts.rotation == null) { + /** + * 旋转 + * @type {Array.} + * @default 0 + */ + this.rotation = 0; + } + if (!opts.scale) { + /** + * 缩放 + * @type {Array.} + * @default [1, 1] + */ + this.scale = [1, 1]; + } + /** + * 旋转和缩放的原点 + * @type {Array.} + * @default null + */ + this.origin = this.origin || null; + }; + + var transformableProto = Transformable.prototype; + transformableProto.transform = null; + + /** + * 判断是否需要有坐标变换 + * 如果有坐标变换, 则从position, rotation, scale以及父节点的transform计算出自身的transform矩阵 + */ + transformableProto.needLocalTransform = function () { + return isNotAroundZero(this.rotation) + || isNotAroundZero(this.position[0]) + || isNotAroundZero(this.position[1]) + || isNotAroundZero(this.scale[0] - 1) + || isNotAroundZero(this.scale[1] - 1); + }; + + transformableProto.updateTransform = function () { + var parent = this.parent; + var parentHasTransform = parent && parent.transform; + var needLocalTransform = this.needLocalTransform(); + + var m = this.transform; + if (!(needLocalTransform || parentHasTransform)) { + m && mIdentity(m); + return; + } + + m = m || matrix.create(); + + if (needLocalTransform) { + this.getLocalTransform(m); + } + else { + mIdentity(m); + } + + // 应用父节点变换 + if (parentHasTransform) { + if (needLocalTransform) { + matrix.mul(m, parent.transform, m); + } + else { + matrix.copy(m, parent.transform); + } + } + // 保存这个变换矩阵 + this.transform = m; + + this.invTransform = this.invTransform || matrix.create(); + matrix.invert(this.invTransform, m); + }; + + transformableProto.getLocalTransform = function (m) { + m = m || []; + mIdentity(m); + + var origin = this.origin; + + var scale = this.scale; + var rotation = this.rotation; + var position = this.position; + if (origin) { + // Translate to origin + m[4] -= origin[0]; + m[5] -= origin[1]; + } + matrix.scale(m, m, scale); + if (rotation) { + matrix.rotate(m, m, rotation); + } + if (origin) { + // Translate back from origin + m[4] += origin[0]; + m[5] += origin[1]; + } + + m[4] += position[0]; + m[5] += position[1]; + + return m; + }; + /** + * 将自己的transform应用到context上 + * @param {Context2D} ctx + */ + transformableProto.setTransform = function (ctx) { + var m = this.transform; + if (m) { + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + }; + + var tmpTransform = []; + + /** + * 分解`transform`矩阵到`position`, `rotation`, `scale` + */ + transformableProto.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + // Get local transform and decompose them to position, scale, rotation + matrix.mul(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + var position = this.position; + var scale = this.scale; + if (isNotAroundZero(sx - 1)) { + sx = Math.sqrt(sx); + } + if (isNotAroundZero(sy - 1)) { + sy = Math.sqrt(sy); + } + if (m[0] < 0) { + sx = -sx; + } + if (m[3] < 0) { + sy = -sy; + } + position[0] = m[4]; + position[1] = m[5]; + scale[0] = sx; + scale[1] = sy; + this.rotation = Math.atan2(-m[1] / sy, m[0] / sx); + }; + + /** + * 变换坐标位置到 shape 的局部坐标空间 + * @method + * @param {number} x + * @param {number} y + * @return {Array.} + */ + transformableProto.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + vector.applyTransform(v2, v2, invTransform); + } + return v2; + }; + + /** + * 变换局部坐标位置到全局坐标空间 + * @method + * @param {number} x + * @param {number} y + * @return {Array.} + */ + transformableProto.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + vector.applyTransform(v2, v2, transform); + } + return v2; + }; + + module.exports = Transformable; + + + +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module zrender/mixin/Animatable + */ + + + var Animator = __webpack_require__(35); + var util = __webpack_require__(3); + var isString = util.isString; + var isFunction = util.isFunction; + var isObject = util.isObject; + var log = __webpack_require__(39); + + /** + * @alias modue:zrender/mixin/Animatable + * @constructor + */ + var Animatable = function () { + + /** + * @type {Array.} + * @readOnly + */ + this.animators = []; + }; + + Animatable.prototype = { + + constructor: Animatable, + + /** + * 动画 + * + * @param {string} path 需要添加动画的属性获取路径,可以通过a.b.c来获取深层的属性 + * @param {boolean} [loop] 动画是否循环 + * @return {module:zrender/animation/Animator} + * @example: + * el.animate('style', false) + * .when(1000, {x: 10} ) + * .done(function(){ // Animation done }) + * .start() + */ + animate: function (path, loop) { + var target; + var animatingShape = false; + var el = this; + var zr = this.__zr; + if (path) { + var pathSplitted = path.split('.'); + var prop = el; + // If animating shape + animatingShape = pathSplitted[0] === 'shape'; + for (var i = 0, l = pathSplitted.length; i < l; i++) { + if (!prop) { + continue; + } + prop = prop[pathSplitted[i]]; + } + if (prop) { + target = prop; + } + } + else { + target = el; + } + + if (!target) { + log( + 'Property "' + + path + + '" is not existed in element ' + + el.id + ); + return; + } + + var animators = el.animators; + + var animator = new Animator(target, loop); + + animator.during(function (target) { + el.dirty(animatingShape); + }) + .done(function () { + // FIXME Animator will not be removed if use `Animator#stop` to stop animation + animators.splice(util.indexOf(animators, animator), 1); + }); + + animators.push(animator); + + // If animate after added to the zrender + if (zr) { + zr.animation.addAnimator(animator); + } + + return animator; + }, + + /** + * 停止动画 + * @param {boolean} forwardToLast If move to last frame before stop + */ + stopAnimation: function (forwardToLast) { + var animators = this.animators; + var len = animators.length; + for (var i = 0; i < len; i++) { + animators[i].stop(forwardToLast); + } + animators.length = 0; + + return this; + }, + + /** + * @param {Object} target + * @param {number} [time=500] Time in ms + * @param {string} [easing='linear'] + * @param {number} [delay=0] + * @param {Function} [callback] + * + * @example + * // Animate position + * el.animateTo({ + * position: [10, 10] + * }, function () { // done }) + * + * // Animate shape, style and position in 100ms, delayed 100ms, with cubicOut easing + * el.animateTo({ + * shape: { + * width: 500 + * }, + * style: { + * fill: 'red' + * } + * position: [10, 10] + * }, 100, 100, 'cubicOut', function () { // done }) + */ + // TODO Return animation key + animateTo: function (target, time, delay, easing, callback) { + // animateTo(target, time, easing, callback); + if (isString(delay)) { + callback = easing; + easing = delay; + delay = 0; + } + // animateTo(target, time, delay, callback); + else if (isFunction(easing)) { + callback = easing; + easing = 'linear'; + delay = 0; + } + // animateTo(target, time, callback); + else if (isFunction(delay)) { + callback = delay; + delay = 0; + } + // animateTo(target, callback) + else if (isFunction(time)) { + callback = time; + time = 500; + } + // animateTo(target) + else if (!time) { + time = 500; + } + // Stop all previous animations + this.stopAnimation(); + this._animateToShallow('', this, target, time, delay, easing, callback); + + // Animators may be removed immediately after start + // if there is nothing to animate + var animators = this.animators.slice(); + var count = animators.length; + function done() { + count--; + if (!count) { + callback && callback(); + } + } + + // No animators. This should be checked before animators[i].start(), + // because 'done' may be executed immediately if no need to animate. + if (!count) { + callback && callback(); + } + // Start after all animators created + // Incase any animator is done immediately when all animation properties are not changed + for (var i = 0; i < animators.length; i++) { + animators[i] + .done(done) + .start(easing); + } + }, + + /** + * @private + * @param {string} path='' + * @param {Object} source=this + * @param {Object} target + * @param {number} [time=500] + * @param {number} [delay=0] + * + * @example + * // Animate position + * el._animateToShallow({ + * position: [10, 10] + * }) + * + * // Animate shape, style and position in 100ms, delayed 100ms + * el._animateToShallow({ + * shape: { + * width: 500 + * }, + * style: { + * fill: 'red' + * } + * position: [10, 10] + * }, 100, 100) + */ + _animateToShallow: function (path, source, target, time, delay) { + var objShallow = {}; + var propertyCount = 0; + for (var name in target) { + if (source[name] != null) { + if (isObject(target[name]) && !util.isArrayLike(target[name])) { + this._animateToShallow( + path ? path + '.' + name : name, + source[name], + target[name], + time, + delay + ); + } + else { + objShallow[name] = target[name]; + propertyCount++; + } + } + else if (target[name] != null) { + // Attr directly if not has property + // FIXME, if some property not needed for element ? + if (!path) { + this.attr(name, target[name]); + } + else { // Shape or style + var props = {}; + props[path] = {}; + props[path][name] = target[name]; + this.attr(props); + } + } + } + + if (propertyCount > 0) { + this.animate(path, false) + .when(time == null ? 500 : time, objShallow) + .delay(delay || 0); + } + + return this; + } + }; + + module.exports = Animatable; + + +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/animation/Animator + */ + + + var Clip = __webpack_require__(36); + var color = __webpack_require__(38); + var util = __webpack_require__(3); + var isArrayLike = util.isArrayLike; + + var arraySlice = Array.prototype.slice; + + function defaultGetter(target, key) { + return target[key]; + } + + function defaultSetter(target, key, value) { + target[key] = value; + } + + /** + * @param {number} p0 + * @param {number} p1 + * @param {number} percent + * @return {number} + */ + function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + + /** + * @param {string} p0 + * @param {string} p1 + * @param {number} percent + * @return {string} + */ + function interpolateString(p0, p1, percent) { + return percent > 0.5 ? p1 : p0; + } + + /** + * @param {Array} p0 + * @param {Array} p1 + * @param {number} percent + * @param {Array} out + * @param {number} arrDim + */ + function interpolateArray(p0, p1, percent, out, arrDim) { + var len = p0.length; + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber(p0[i], p1[i], percent); + } + } + else { + var len2 = p0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber( + p0[i][j], p1[i][j], percent + ); + } + } + } + } + + function fillArr(arr0, arr1, arrDim) { + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len === arr1Len) { + return; + } + // FIXME Not work for TypedArray + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + // Cut the previous + arr0.length = arr1Len; + } + else { + // Fill the previous + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push( + arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]) + ); + } + } + } + + /** + * @param {Array} arr0 + * @param {Array} arr1 + * @param {number} arrDim + * @return {boolean} + */ + function isArraySame(arr0, arr1, arrDim) { + if (arr0 === arr1) { + return true; + } + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + if (arrDim === 1) { + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + } + else { + var len2 = arr0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + if (arr0[i][j] !== arr1[i][j]) { + return false; + } + } + } + } + return true; + } + + /** + * Catmull Rom interpolate array + * @param {Array} p0 + * @param {Array} p1 + * @param {Array} p2 + * @param {Array} p3 + * @param {number} t + * @param {number} t2 + * @param {number} t3 + * @param {Array} out + * @param {number} arrDim + */ + function catmullRomInterpolateArray( + p0, p1, p2, p3, t, t2, t3, out, arrDim + ) { + var len = p0.length; + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = catmullRomInterpolate( + p0[i], p1[i], p2[i], p3[i], t, t2, t3 + ); + } + } + else { + var len2 = p0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = catmullRomInterpolate( + p0[i][j], p1[i][j], p2[i][j], p3[i][j], + t, t2, t3 + ); + } + } + } + } + + /** + * Catmull Rom interpolate number + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @param {number} t2 + * @param {number} t3 + * @return {number} + */ + function catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; + } + + function cloneValue(value) { + if (isArrayLike(value)) { + var len = value.length; + if (isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } + + return arraySlice.call(value); + } + + return value; + } + + function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]); + rgba[1] = Math.floor(rgba[1]); + rgba[2] = Math.floor(rgba[2]); + + return 'rgba(' + rgba.join(',') + ')'; + } + + function createTrackClip (animator, easing, oneTrackDone, keyframes, propName) { + var getter = animator._getter; + var setter = animator._setter; + var useSpline = easing === 'spline'; + + var trackLen = keyframes.length; + if (!trackLen) { + return; + } + // Guess data type + var firstVal = keyframes[0].value; + var isValueArray = isArrayLike(firstVal); + var isValueColor = false; + var isValueString = false; + + // For vertices morphing + var arrDim = ( + isValueArray + && isArrayLike(firstVal[0]) + ) + ? 2 : 1; + var trackMaxTime; + // Sort keyframe as ascending + keyframes.sort(function(a, b) { + return a.time - b.time; + }); + + trackMaxTime = keyframes[trackLen - 1].time; + // Percents of each keyframe + var kfPercents = []; + // Value of each keyframe + var kfValues = []; + var prevValue = keyframes[0].value; + var isAllValueEqual = true; + for (var i = 0; i < trackLen; i++) { + kfPercents.push(keyframes[i].time / trackMaxTime); + // Assume value is a color when it is a string + var value = keyframes[i].value; + + // Check if value is equal, deep check if value is array + if (!((isValueArray && isArraySame(value, prevValue, arrDim)) + || (!isValueArray && value === prevValue))) { + isAllValueEqual = false; + } + prevValue = value; + + // Try converting a string to a color array + if (typeof value == 'string') { + var colorArray = color.parse(value); + if (colorArray) { + value = colorArray; + isValueColor = true; + } + else { + isValueString = true; + } + } + kfValues.push(value); + } + if (isAllValueEqual) { + return; + } + + if (isValueArray) { + var lastValue = kfValues[trackLen - 1]; + // Polyfill array + for (var i = 0; i < trackLen - 1; i++) { + fillArr(kfValues[i], lastValue, arrDim); + } + fillArr(getter(animator._target, propName), lastValue, arrDim); + } + + // Cache the key of last frame to speed up when + // animation playback is sequency + var lastFrame = 0; + var lastFramePercent = 0; + var start; + var w; + var p0; + var p1; + var p2; + var p3; + + if (isValueColor) { + var rgba = [0, 0, 0, 0]; + } + + var onframe = function (target, percent) { + // Find the range keyframes + // kf1-----kf2---------current--------kf3 + // find kf2 and kf3 and do interpolation + var frame; + if (percent < lastFramePercent) { + // Start from next key + start = Math.min(lastFrame + 1, trackLen - 1); + for (frame = start; frame >= 0; frame--) { + if (kfPercents[frame] <= percent) { + break; + } + } + frame = Math.min(frame, trackLen - 2); + } + else { + for (frame = lastFrame; frame < trackLen; frame++) { + if (kfPercents[frame] > percent) { + break; + } + } + frame = Math.min(frame - 1, trackLen - 2); + } + lastFrame = frame; + lastFramePercent = percent; + + var range = (kfPercents[frame + 1] - kfPercents[frame]); + if (range === 0) { + return; + } + else { + w = (percent - kfPercents[frame]) / range; + } + if (useSpline) { + p1 = kfValues[frame]; + p0 = kfValues[frame === 0 ? frame : frame - 1]; + p2 = kfValues[frame > trackLen - 2 ? trackLen - 1 : frame + 1]; + p3 = kfValues[frame > trackLen - 3 ? trackLen - 1 : frame + 2]; + if (isValueArray) { + catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + getter(target, propName), + arrDim + ); + } + else { + var value; + if (isValueColor) { + value = catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + rgba, 1 + ); + value = rgba2String(rgba); + } + else if (isValueString) { + // String is step(0.5) + return interpolateString(p1, p2, w); + } + else { + value = catmullRomInterpolate( + p0, p1, p2, p3, w, w * w, w * w * w + ); + } + setter( + target, + propName, + value + ); + } + } + else { + if (isValueArray) { + interpolateArray( + kfValues[frame], kfValues[frame + 1], w, + getter(target, propName), + arrDim + ); + } + else { + var value; + if (isValueColor) { + interpolateArray( + kfValues[frame], kfValues[frame + 1], w, + rgba, 1 + ); + value = rgba2String(rgba); + } + else if (isValueString) { + // String is step(0.5) + return interpolateString(kfValues[frame], kfValues[frame + 1], w); + } + else { + value = interpolateNumber(kfValues[frame], kfValues[frame + 1], w); + } + setter( + target, + propName, + value + ); + } + } + }; + + var clip = new Clip({ + target: animator._target, + life: trackMaxTime, + loop: animator._loop, + delay: animator._delay, + onframe: onframe, + ondestroy: oneTrackDone + }); + + if (easing && easing !== 'spline') { + clip.easing = easing; + } + + return clip; + } + + /** + * @alias module:zrender/animation/Animator + * @constructor + * @param {Object} target + * @param {boolean} loop + * @param {Function} getter + * @param {Function} setter + */ + var Animator = function(target, loop, getter, setter) { + this._tracks = {}; + this._target = target; + + this._loop = loop || false; + + this._getter = getter || defaultGetter; + this._setter = setter || defaultSetter; + + this._clipCount = 0; + + this._delay = 0; + + this._doneList = []; + + this._onframeList = []; + + this._clipList = []; + }; + + Animator.prototype = { + /** + * 设置动画关键帧 + * @param {number} time 关键帧时间,单位是ms + * @param {Object} props 关键帧的属性值,key-value表示 + * @return {module:zrender/animation/Animator} + */ + when: function(time /* ms */, props) { + var tracks = this._tracks; + for (var propName in props) { + if (!tracks[propName]) { + tracks[propName] = []; + // Invalid value + var value = this._getter(this._target, propName); + if (value == null) { + // zrLog('Invalid property ' + propName); + continue; + } + // If time is 0 + // Then props is given initialize value + // Else + // Initialize value from current prop value + if (time !== 0) { + tracks[propName].push({ + time: 0, + value: cloneValue(value) + }); + } + } + tracks[propName].push({ + time: time, + value: props[propName] + }); + } + return this; + }, + /** + * 添加动画每一帧的回调函数 + * @param {Function} callback + * @return {module:zrender/animation/Animator} + */ + during: function (callback) { + this._onframeList.push(callback); + return this; + }, + + _doneCallback: function () { + // Clear all tracks + this._tracks = {}; + // Clear all clips + this._clipList.length = 0; + + var doneList = this._doneList; + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + }, + /** + * 开始执行动画 + * @param {string|Function} easing + * 动画缓动函数,详见{@link module:zrender/animation/easing} + * @return {module:zrender/animation/Animator} + */ + start: function (easing) { + + var self = this; + var clipCount = 0; + + var oneTrackDone = function() { + clipCount--; + if (!clipCount) { + self._doneCallback(); + } + }; + + var lastClip; + for (var propName in this._tracks) { + var clip = createTrackClip( + this, easing, oneTrackDone, + this._tracks[propName], propName + ); + if (clip) { + this._clipList.push(clip); + clipCount++; + + // If start after added to animation + if (this.animation) { + this.animation.addClip(clip); + } + + lastClip = clip; + } + } + + // Add during callback on the last clip + if (lastClip) { + var oldOnFrame = lastClip.onframe; + lastClip.onframe = function (target, percent) { + oldOnFrame(target, percent); + + for (var i = 0; i < self._onframeList.length; i++) { + self._onframeList[i](target, percent); + } + }; + } + + if (!clipCount) { + this._doneCallback(); + } + return this; + }, + /** + * 停止动画 + * @param {boolean} forwardToLast If move to last frame before stop + */ + stop: function (forwardToLast) { + var clipList = this._clipList; + var animation = this.animation; + for (var i = 0; i < clipList.length; i++) { + var clip = clipList[i]; + if (forwardToLast) { + // Move to last frame before stop + clip.onframe(this._target, 1); + } + animation && animation.removeClip(clip); + } + clipList.length = 0; + }, + /** + * 设置动画延迟开始的时间 + * @param {number} time 单位ms + * @return {module:zrender/animation/Animator} + */ + delay: function (time) { + this._delay = time; + return this; + }, + /** + * 添加动画结束的回调 + * @param {Function} cb + * @return {module:zrender/animation/Animator} + */ + done: function(cb) { + if (cb) { + this._doneList.push(cb); + } + return this; + }, + + /** + * @return {Array.} + */ + getClips: function () { + return this._clipList; + } + }; + + module.exports = Animator; + + +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 动画主控制器 + * @config target 动画对象,可以是数组,如果是数组的话会批量分发onframe等事件 + * @config life(1000) 动画时长 + * @config delay(0) 动画延迟时间 + * @config loop(true) + * @config gap(0) 循环的间隔时间 + * @config onframe + * @config easing(optional) + * @config ondestroy(optional) + * @config onrestart(optional) + * + * TODO pause + */ + + + var easingFuncs = __webpack_require__(37); + + function Clip(options) { + + this._target = options.target; + + // 生命周期 + this._life = options.life || 1000; + // 延时 + this._delay = options.delay || 0; + // 开始时间 + // this._startTime = new Date().getTime() + this._delay;// 单位毫秒 + this._initialized = false; + + // 是否循环 + this.loop = options.loop == null ? false : options.loop; + + this.gap = options.gap || 0; + + this.easing = options.easing || 'Linear'; + + this.onframe = options.onframe; + this.ondestroy = options.ondestroy; + this.onrestart = options.onrestart; + } + + Clip.prototype = { + + constructor: Clip, + + step: function (time) { + // Set startTime on first step, or _startTime may has milleseconds different between clips + // PENDING + if (!this._initialized) { + this._startTime = new Date().getTime() + this._delay; + this._initialized = true; + } + + var percent = (time - this._startTime) / this._life; + + // 还没开始 + if (percent < 0) { + return; + } + + percent = Math.min(percent, 1); + + var easing = this.easing; + var easingFunc = typeof easing == 'string' ? easingFuncs[easing] : easing; + var schedule = typeof easingFunc === 'function' + ? easingFunc(percent) + : percent; + + this.fire('frame', schedule); + + // 结束 + if (percent == 1) { + if (this.loop) { + this.restart(); + // 重新开始周期 + // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件 + return 'restart'; + } + + // 动画完成将这个控制器标识为待删除 + // 在Animation.update中进行批量删除 + this._needsRemove = true; + return 'destroy'; + } + + return null; + }, + + restart: function() { + var time = new Date().getTime(); + var remainder = (time - this._startTime) % this._life; + this._startTime = new Date().getTime() - remainder + this.gap; + + this._needsRemove = false; + }, + + fire: function(eventType, arg) { + eventType = 'on' + eventType; + if (this[eventType]) { + this[eventType](this._target, arg); + } + } + }; + + module.exports = Clip; + + + +/***/ }, +/* 37 */ +/***/ function(module, exports) { + + /** + * 缓动代码来自 https://github.com/sole/tween.js/blob/master/src/Tween.js + * @see http://sole.github.io/tween.js/examples/03_graphs.html + * @exports zrender/animation/easing + */ + + var easing = { + /** + * @param {number} k + * @return {number} + */ + linear: function (k) { + return k; + }, + + /** + * @param {number} k + * @return {number} + */ + quadraticIn: function (k) { + return k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quadraticOut: function (k) { + return k * (2 - k); + }, + /** + * @param {number} k + * @return {number} + */ + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + + // 三次方的缓动(t^3) + /** + * @param {number} k + * @return {number} + */ + cubicIn: function (k) { + return k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + cubicOut: function (k) { + return --k * k * k + 1; + }, + /** + * @param {number} k + * @return {number} + */ + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + + // 四次方的缓动(t^4) + /** + * @param {number} k + * @return {number} + */ + quarticIn: function (k) { + return k * k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + /** + * @param {number} k + * @return {number} + */ + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + + // 五次方的缓动(t^5) + /** + * @param {number} k + * @return {number} + */ + quinticIn: function (k) { + return k * k * k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + /** + * @param {number} k + * @return {number} + */ + quinticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }, + + // 正弦曲线的缓动(sin(t)) + /** + * @param {number} k + * @return {number} + */ + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + /** + * @param {number} k + * @return {number} + */ + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + /** + * @param {number} k + * @return {number} + */ + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + + // 指数曲线的缓动(2^t) + /** + * @param {number} k + * @return {number} + */ + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + /** + * @param {number} k + * @return {number} + */ + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + /** + * @param {number} k + * @return {number} + */ + exponentialInOut: function (k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }, + + // 圆形曲线的缓动(sqrt(1-t^2)) + /** + * @param {number} k + * @return {number} + */ + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + /** + * @param {number} k + * @return {number} + */ + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + /** + * @param {number} k + * @return {number} + */ + circularInOut: function (k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }, + + // 创建类似于弹簧在停止前来回振荡的动画 + /** + * @param {number} k + * @return {number} + */ + elasticIn: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) * + Math.sin((k - s) * (2 * Math.PI) / p)); + }, + /** + * @param {number} k + * @return {number} + */ + elasticOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) * + Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }, + /** + * @param {number} k + * @return {number} + */ + elasticInOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + + }, + + // 在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动 + /** + * @param {number} k + * @return {number} + */ + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + /** + * @param {number} k + * @return {number} + */ + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + /** + * @param {number} k + * @return {number} + */ + backInOut: function (k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }, + + // 创建弹跳效果 + /** + * @param {number} k + * @return {number} + */ + bounceIn: function (k) { + return 1 - easing.bounceOut(1 - k); + }, + /** + * @param {number} k + * @return {number} + */ + bounceOut: function (k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } + else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } + else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } + else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }, + /** + * @param {number} k + * @return {number} + */ + bounceInOut: function (k) { + if (k < 0.5) { + return easing.bounceIn(k * 2) * 0.5; + } + return easing.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } + }; + + module.exports = easing; + + + + +/***/ }, +/* 38 */ +/***/ function(module, exports) { + + /** + * @module zrender/tool/color + */ + + + var kCSSColorTable = { + 'transparent': [0,0,0,0], 'aliceblue': [240,248,255,1], + 'antiquewhite': [250,235,215,1], 'aqua': [0,255,255,1], + 'aquamarine': [127,255,212,1], 'azure': [240,255,255,1], + 'beige': [245,245,220,1], 'bisque': [255,228,196,1], + 'black': [0,0,0,1], 'blanchedalmond': [255,235,205,1], + 'blue': [0,0,255,1], 'blueviolet': [138,43,226,1], + 'brown': [165,42,42,1], 'burlywood': [222,184,135,1], + 'cadetblue': [95,158,160,1], 'chartreuse': [127,255,0,1], + 'chocolate': [210,105,30,1], 'coral': [255,127,80,1], + 'cornflowerblue': [100,149,237,1], 'cornsilk': [255,248,220,1], + 'crimson': [220,20,60,1], 'cyan': [0,255,255,1], + 'darkblue': [0,0,139,1], 'darkcyan': [0,139,139,1], + 'darkgoldenrod': [184,134,11,1], 'darkgray': [169,169,169,1], + 'darkgreen': [0,100,0,1], 'darkgrey': [169,169,169,1], + 'darkkhaki': [189,183,107,1], 'darkmagenta': [139,0,139,1], + 'darkolivegreen': [85,107,47,1], 'darkorange': [255,140,0,1], + 'darkorchid': [153,50,204,1], 'darkred': [139,0,0,1], + 'darksalmon': [233,150,122,1], 'darkseagreen': [143,188,143,1], + 'darkslateblue': [72,61,139,1], 'darkslategray': [47,79,79,1], + 'darkslategrey': [47,79,79,1], 'darkturquoise': [0,206,209,1], + 'darkviolet': [148,0,211,1], 'deeppink': [255,20,147,1], + 'deepskyblue': [0,191,255,1], 'dimgray': [105,105,105,1], + 'dimgrey': [105,105,105,1], 'dodgerblue': [30,144,255,1], + 'firebrick': [178,34,34,1], 'floralwhite': [255,250,240,1], + 'forestgreen': [34,139,34,1], 'fuchsia': [255,0,255,1], + 'gainsboro': [220,220,220,1], 'ghostwhite': [248,248,255,1], + 'gold': [255,215,0,1], 'goldenrod': [218,165,32,1], + 'gray': [128,128,128,1], 'green': [0,128,0,1], + 'greenyellow': [173,255,47,1], 'grey': [128,128,128,1], + 'honeydew': [240,255,240,1], 'hotpink': [255,105,180,1], + 'indianred': [205,92,92,1], 'indigo': [75,0,130,1], + 'ivory': [255,255,240,1], 'khaki': [240,230,140,1], + 'lavender': [230,230,250,1], 'lavenderblush': [255,240,245,1], + 'lawngreen': [124,252,0,1], 'lemonchiffon': [255,250,205,1], + 'lightblue': [173,216,230,1], 'lightcoral': [240,128,128,1], + 'lightcyan': [224,255,255,1], 'lightgoldenrodyellow': [250,250,210,1], + 'lightgray': [211,211,211,1], 'lightgreen': [144,238,144,1], + 'lightgrey': [211,211,211,1], 'lightpink': [255,182,193,1], + 'lightsalmon': [255,160,122,1], 'lightseagreen': [32,178,170,1], + 'lightskyblue': [135,206,250,1], 'lightslategray': [119,136,153,1], + 'lightslategrey': [119,136,153,1], 'lightsteelblue': [176,196,222,1], + 'lightyellow': [255,255,224,1], 'lime': [0,255,0,1], + 'limegreen': [50,205,50,1], 'linen': [250,240,230,1], + 'magenta': [255,0,255,1], 'maroon': [128,0,0,1], + 'mediumaquamarine': [102,205,170,1], 'mediumblue': [0,0,205,1], + 'mediumorchid': [186,85,211,1], 'mediumpurple': [147,112,219,1], + 'mediumseagreen': [60,179,113,1], 'mediumslateblue': [123,104,238,1], + 'mediumspringgreen': [0,250,154,1], 'mediumturquoise': [72,209,204,1], + 'mediumvioletred': [199,21,133,1], 'midnightblue': [25,25,112,1], + 'mintcream': [245,255,250,1], 'mistyrose': [255,228,225,1], + 'moccasin': [255,228,181,1], 'navajowhite': [255,222,173,1], + 'navy': [0,0,128,1], 'oldlace': [253,245,230,1], + 'olive': [128,128,0,1], 'olivedrab': [107,142,35,1], + 'orange': [255,165,0,1], 'orangered': [255,69,0,1], + 'orchid': [218,112,214,1], 'palegoldenrod': [238,232,170,1], + 'palegreen': [152,251,152,1], 'paleturquoise': [175,238,238,1], + 'palevioletred': [219,112,147,1], 'papayawhip': [255,239,213,1], + 'peachpuff': [255,218,185,1], 'peru': [205,133,63,1], + 'pink': [255,192,203,1], 'plum': [221,160,221,1], + 'powderblue': [176,224,230,1], 'purple': [128,0,128,1], + 'red': [255,0,0,1], 'rosybrown': [188,143,143,1], + 'royalblue': [65,105,225,1], 'saddlebrown': [139,69,19,1], + 'salmon': [250,128,114,1], 'sandybrown': [244,164,96,1], + 'seagreen': [46,139,87,1], 'seashell': [255,245,238,1], + 'sienna': [160,82,45,1], 'silver': [192,192,192,1], + 'skyblue': [135,206,235,1], 'slateblue': [106,90,205,1], + 'slategray': [112,128,144,1], 'slategrey': [112,128,144,1], + 'snow': [255,250,250,1], 'springgreen': [0,255,127,1], + 'steelblue': [70,130,180,1], 'tan': [210,180,140,1], + 'teal': [0,128,128,1], 'thistle': [216,191,216,1], + 'tomato': [255,99,71,1], 'turquoise': [64,224,208,1], + 'violet': [238,130,238,1], 'wheat': [245,222,179,1], + 'white': [255,255,255,1], 'whitesmoke': [245,245,245,1], + 'yellow': [255,255,0,1], 'yellowgreen': [154,205,50,1] + }; + + function clampCssByte(i) { // Clamp to integer 0 .. 255. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 255 ? 255 : i; + } + + function clampCssAngle(i) { // Clamp to integer 0 .. 360. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 360 ? 360 : i; + } + + function clampCssFloat(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; + } + + function parseCssInt(str) { // int or percentage. + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); + } + + function parseCssFloat(str) { // float or percentage. + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssFloat(parseFloat(str) / 100); + } + return clampCssFloat(parseFloat(str)); + } + + function cssHueToRgb(m1, m2, h) { + if (h < 0) { + h += 1; + } + else if (h > 1) { + h -= 1; + } + + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2/3 - h) * 6; + } + return m1; + } + + function lerp(a, b, p) { + return a + (b - a) * p; + } + + /** + * @param {string} colorStr + * @return {Array.} + * @memberOf module:zrender/util/color + */ + function parse(colorStr) { + if (!colorStr) { + return; + } + // colorStr may be not string + colorStr = colorStr + ''; + // Remove all whitespace, not compliant, but should just be more accepting. + var str = colorStr.replace(/ /g, '').toLowerCase(); + + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) { + return kCSSColorTable[str].slice(); // dup. + } + + // #abc and #abc123 syntax. + if (str.charAt(0) === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xfff)) { + return; // Covers NaN. + } + return [ + ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), + (iv & 0xf0) | ((iv & 0xf0) >> 4), + (iv & 0xf) | ((iv & 0xf) << 4), + 1 + ]; + } + else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xffffff)) { + return; // Covers NaN. + } + return [ + (iv & 0xff0000) >> 16, + (iv & 0xff00) >> 8, + iv & 0xff, + 1 + ]; + } + + return; + } + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; // To allow case fallthrough. + switch (fname) { + case 'rgba': + if (params.length !== 4) { + return; + } + alpha = parseCssFloat(params.pop()); // jshint ignore:line + // Fall through. + case 'rgb': + if (params.length !== 3) { + return; + } + return [ + parseCssInt(params[0]), + parseCssInt(params[1]), + parseCssInt(params[2]), + alpha + ]; + case 'hsla': + if (params.length !== 4) { + return; + } + params[3] = parseCssFloat(params[3]); + return hsla2rgba(params); + case 'hsl': + if (params.length !== 3) { + return; + } + return hsla2rgba(params); + default: + return; + } + } + + return; + } + + /** + * @param {Array.} hsla + * @return {Array.} rgba + */ + function hsla2rgba(hsla) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; // 0 .. 1 + // NOTE(deanm): According to the CSS spec s/l should only be + // percentages, but we don't bother and let float or percentage. + var s = parseCssFloat(hsla[1]); + var l = parseCssFloat(hsla[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + + var rgba = [ + clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), + clampCssByte(cssHueToRgb(m1, m2, h) * 255), + clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255) + ]; + + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + + return rgba; + } + + /** + * @param {Array.} rgba + * @return {Array.} hsla + */ + function rgba2hsla(rgba) { + if (!rgba) { + return; + } + + // RGB from 0 to 255 + var R = rgba[0] / 255; + var G = rgba[1] / 255; + var B = rgba[2] / 255; + + var vMin = Math.min(R, G, B); // Min. value of RGB + var vMax = Math.max(R, G, B); // Max. value of RGB + var delta = vMax - vMin; // Delta RGB value + + var L = (vMax + vMin) / 2; + var H; + var S; + // HSL results from 0 to 1 + if (delta === 0) { + H = 0; + S = 0; + } + else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } + else { + S = delta / (2 - vMax - vMin); + } + + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + + if (R === vMax) { + H = deltaB - deltaG; + } + else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } + else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + + if (H < 0) { + H += 1; + } + + if (H > 1) { + H -= 1; + } + } + + var hsla = [H * 360, S, L]; + + if (rgba[3] != null) { + hsla.push(rgba[3]); + } + + return hsla; + } + + /** + * @param {string} color + * @param {number} level + * @return {string} + * @memberOf module:zrender/util/color + */ + function lift(color, level) { + var colorArr = parse(color); + if (colorArr) { + for (var i = 0; i < 3; i++) { + if (level < 0) { + colorArr[i] = colorArr[i] * (1 - level) | 0; + } + else { + colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } + } + + /** + * @param {string} color + * @return {string} + * @memberOf module:zrender/util/color + */ + function toHex(color, level) { + var colorArr = parse(color); + if (colorArr) { + return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1); + } + } + + /** + * Map value to color. Faster than mapToColor methods because color is represented by rgba array + * @param {number} normalizedValue A float between 0 and 1. + * @param {Array.>} colors List of rgba color array + * @param {Array.} [out] Mapped gba color array + * @return {Array.} + */ + function fastMapToColor(normalizedValue, colors, out) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1) + ) { + return; + } + out = out || [0, 0, 0, 0]; + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = colors[leftIndex]; + var rightColor = colors[rightIndex]; + var dv = value - leftIndex; + out[0] = clampCssByte(lerp(leftColor[0], rightColor[0], dv)); + out[1] = clampCssByte(lerp(leftColor[1], rightColor[1], dv)); + out[2] = clampCssByte(lerp(leftColor[2], rightColor[2], dv)); + out[3] = clampCssByte(lerp(leftColor[3], rightColor[3], dv)); + return out; + } + /** + * @param {number} normalizedValue A float between 0 and 1. + * @param {Array.} colors Color list. + * @param {boolean=} fullOutput Default false. + * @return {(string|Object)} Result color. If fullOutput, + * return {color: ..., leftIndex: ..., rightIndex: ..., value: ...}, + * @memberOf module:zrender/util/color + */ + function mapToColor(normalizedValue, colors, fullOutput) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1) + ) { + return; + } + + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = parse(colors[leftIndex]); + var rightColor = parse(colors[rightIndex]); + var dv = value - leftIndex; + + var color = stringify( + [ + clampCssByte(lerp(leftColor[0], rightColor[0], dv)), + clampCssByte(lerp(leftColor[1], rightColor[1], dv)), + clampCssByte(lerp(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerp(leftColor[3], rightColor[3], dv)) + ], + 'rgba' + ); + + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; + } + + /** + * @param {Array} interval Array length === 2, + * each item is normalized value ([0, 1]). + * @param {Array.} colors Color list. + * @return {Array.} colors corresponding to the interval, + * each item is {color: 'xxx', offset: ...} + * where offset is between 0 and 1. + * @memberOf module:zrender/util/color + */ + function mapIntervalToColor(interval, colors) { + if (interval.length !== 2 || interval[1] < interval[0]) { + return; + } + + var info0 = mapToColor(interval[0], colors, true); + var info1 = mapToColor(interval[1], colors, true); + + var result = [{color: info0.color, offset: 0}]; + + var during = info1.value - info0.value; + var start = Math.max(info0.value, info0.rightIndex); + var end = Math.min(info1.value, info1.leftIndex); + + for (var i = start; during > 0 && i <= end; i++) { + result.push({ + color: colors[i], + offset: (i - info0.value) / during + }); + } + result.push({color: info1.color, offset: 1}); + + return result; + } + + /** + * @param {string} color + * @param {number=} h 0 ~ 360, ignore when null. + * @param {number=} s 0 ~ 1, ignore when null. + * @param {number=} l 0 ~ 1, ignore when null. + * @return {string} Color string in rgba format. + * @memberOf module:zrender/util/color + */ + function modifyHSL(color, h, s, l) { + color = parse(color); + + if (color) { + color = rgba2hsla(color); + h != null && (color[0] = clampCssAngle(h)); + s != null && (color[1] = parseCssFloat(s)); + l != null && (color[2] = parseCssFloat(l)); + + return stringify(hsla2rgba(color), 'rgba'); + } + } + + /** + * @param {string} color + * @param {number=} alpha 0 ~ 1 + * @return {string} Color string in rgba format. + * @memberOf module:zrender/util/color + */ + function modifyAlpha(color, alpha) { + color = parse(color); + + if (color && alpha != null) { + color[3] = clampCssFloat(alpha); + return stringify(color, 'rgba'); + } + } + + /** + * @param {Array.} colors Color list. + * @param {string} type 'rgba', 'hsva', ... + * @return {string} Result color. + */ + function stringify(arrColor, type) { + if (type === 'rgb' || type === 'hsv' || type === 'hsl') { + arrColor = arrColor.slice(0, 3); + } + return type + '(' + arrColor.join(',') + ')'; + } + + module.exports = { + parse: parse, + lift: lift, + toHex: toHex, + fastMapToColor: fastMapToColor, + mapToColor: mapToColor, + mapIntervalToColor: mapIntervalToColor, + modifyHSL: modifyHSL, + modifyAlpha: modifyAlpha, + stringify: stringify + }; + + + + +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { + + + var config = __webpack_require__(40); + + /** + * @exports zrender/tool/log + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + module.exports = function() { + if (config.debugMode === 0) { + return; + } + else if (config.debugMode == 1) { + for (var k in arguments) { + throw new Error(arguments[k]); + } + } + else if (config.debugMode > 1) { + for (var k in arguments) { + console.log(arguments[k]); + } + } + }; + + /* for debug + return function(mes) { + document.getElementById('wrong-message').innerHTML = + mes + ' ' + (new Date() - 0) + + '
            ' + + document.getElementById('wrong-message').innerHTML; + }; + */ + + + +/***/ }, +/* 40 */ +/***/ function(module, exports) { + + + var dpr = 1; + // If in browser environment + if (typeof window !== 'undefined') { + dpr = Math.max(window.devicePixelRatio || 1, 1); + } + /** + * config默认配置项 + * @exports zrender/config + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + var config = { + /** + * debug日志选项:catchBrushException为true下有效 + * 0 : 不生成debug数据,发布用 + * 1 : 异常抛出,调试用 + * 2 : 控制台输出,调试用 + */ + debugMode: 0, + + // retina 屏幕优化 + devicePixelRatio: dpr + }; + module.exports = config; + + + + +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Group = __webpack_require__(29); + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + + function Chart() { + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = componentUtil.getUID('viewChart'); + } + + Chart.prototype = { + + type: 'chart', + + /** + * Init the chart + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + init: function (ecModel, api) {}, + + /** + * Render the chart + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + render: function (seriesModel, ecModel, api, payload) {}, + + /** + * Highlight series or specified data item + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + highlight: function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'emphasis'); + }, + + /** + * Downplay series or specified data item + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + downplay: function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'normal'); + }, + + /** + * Remove self + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + remove: function (ecModel, api) { + this.group.removeAll(); + }, + + /** + * Dispose self + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + dispose: function () {} + }; + + var chartProto = Chart.prototype; + chartProto.updateView + = chartProto.updateLayout + = chartProto.updateVisual + = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + + /** + * Set state of single element + * @param {module:zrender/Element} el + * @param {string} state + */ + function elSetState(el, state) { + if (el) { + el.trigger(state); + if (el.type === 'group') { + for (var i = 0; i < el.childCount(); i++) { + elSetState(el.childAt(i), state); + } + } + } + } + /** + * @param {module:echarts/data/List} data + * @param {Object} payload + * @param {string} state 'normal'|'emphasis' + * @inner + */ + function toggleHighlight(data, payload, state) { + if (payload.dataIndex != null) { + var el = data.getItemGraphicEl(payload.dataIndex); + elSetState(el, state); + } + else if (payload.name) { + var dataIndex = data.indexOfName(payload.name); + var el = data.getItemGraphicEl(dataIndex); + elSetState(el, state); + } + else { + data.eachItemGraphicEl(function (el) { + elSetState(el, state); + }); + } + } + + // Enable Chart.extend. + clazzUtil.enableClassExtend(Chart); + + // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true}); + + module.exports = Chart; + + +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var pathTool = __webpack_require__(43); + var round = Math.round; + var Path = __webpack_require__(44); + var colorTool = __webpack_require__(38); + var matrix = __webpack_require__(17); + var vector = __webpack_require__(16); + var Gradient = __webpack_require__(4); + + var graphic = {}; + + graphic.Group = __webpack_require__(29); + + graphic.Image = __webpack_require__(59); + + graphic.Text = __webpack_require__(62); + + graphic.Circle = __webpack_require__(63); + + graphic.Sector = __webpack_require__(64); + + graphic.Ring = __webpack_require__(65); + + graphic.Polygon = __webpack_require__(66); + + graphic.Polyline = __webpack_require__(70); + + graphic.Rect = __webpack_require__(71); + + graphic.Line = __webpack_require__(72); + + graphic.BezierCurve = __webpack_require__(73); + + graphic.Arc = __webpack_require__(74); + + graphic.LinearGradient = __webpack_require__(75); + + graphic.RadialGradient = __webpack_require__(76); + + graphic.BoundingRect = __webpack_require__(15); + + /** + * Extend shape with parameters + */ + graphic.extendShape = function (opts) { + return Path.extend(opts); + }; + + /** + * Extend path + */ + graphic.extendPath = function (pathData, opts) { + return pathTool.extendFromString(pathData, opts); + }; + + /** + * Create a path element from path data string + * @param {string} pathData + * @param {Object} opts + * @param {module:zrender/core/BoundingRect} rect + * @param {string} [layout=cover] 'center' or 'cover' + */ + graphic.makePath = function (pathData, opts, rect, layout) { + var path = pathTool.createFromString(pathData, opts); + var boundingRect = path.getBoundingRect(); + if (rect) { + var aspect = boundingRect.width / boundingRect.height; + + if (layout === 'center') { + // Set rect to center, keep width / height ratio. + var width = rect.height * aspect; + var height; + if (width <= rect.width) { + height = rect.height; + } + else { + width = rect.width; + height = width / aspect; + } + var cx = rect.x + rect.width / 2; + var cy = rect.y + rect.height / 2; + + rect.x = cx - width / 2; + rect.y = cy - height / 2; + rect.width = width; + rect.height = height; + } + + this.resizePath(path, rect); + } + return path; + }; + + graphic.mergePath = pathTool.mergePath, + + /** + * Resize a path to fit the rect + * @param {module:zrender/graphic/Path} path + * @param {Object} rect + */ + graphic.resizePath = function (path, rect) { + if (!path.applyTransform) { + return; + } + + var pathRect = path.getBoundingRect(); + + var m = pathRect.calculateTransform(rect); + + path.applyTransform(m); + }; + + /** + * Sub pixel optimize line for canvas + * + * @param {Object} param + * @param {Object} [param.shape] + * @param {number} [param.shape.x1] + * @param {number} [param.shape.y1] + * @param {number} [param.shape.x2] + * @param {number} [param.shape.y2] + * @param {Object} [param.style] + * @param {number} [param.style.lineWidth] + * @return {Object} Modified param + */ + graphic.subPixelOptimizeLine = function (param) { + var subPixelOptimize = graphic.subPixelOptimize; + var shape = param.shape; + var lineWidth = param.style.lineWidth; + + if (round(shape.x1 * 2) === round(shape.x2 * 2)) { + shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true); + } + if (round(shape.y1 * 2) === round(shape.y2 * 2)) { + shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true); + } + return param; + }; + + /** + * Sub pixel optimize rect for canvas + * + * @param {Object} param + * @param {Object} [param.shape] + * @param {number} [param.shape.x] + * @param {number} [param.shape.y] + * @param {number} [param.shape.width] + * @param {number} [param.shape.height] + * @param {Object} [param.style] + * @param {number} [param.style.lineWidth] + * @return {Object} Modified param + */ + graphic.subPixelOptimizeRect = function (param) { + var subPixelOptimize = graphic.subPixelOptimize; + var shape = param.shape; + var lineWidth = param.style.lineWidth; + var originX = shape.x; + var originY = shape.y; + var originWidth = shape.width; + var originHeight = shape.height; + shape.x = subPixelOptimize(shape.x, lineWidth, true); + shape.y = subPixelOptimize(shape.y, lineWidth, true); + shape.width = Math.max( + subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x, + originWidth === 0 ? 0 : 1 + ); + shape.height = Math.max( + subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y, + originHeight === 0 ? 0 : 1 + ); + return param; + }; + + /** + * Sub pixel optimize for canvas + * + * @param {number} position Coordinate, such as x, y + * @param {number} lineWidth Should be nonnegative integer. + * @param {boolean=} positiveOrNegative Default false (negative). + * @return {number} Optimized position. + */ + graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) { + // Assure that (position + lineWidth / 2) is near integer edge, + // otherwise line will be fuzzy in canvas. + var doubledPosition = round(position * 2); + return (doubledPosition + round(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; + }; + + /** + * @private + */ + function doSingleEnterHover(el) { + if (el.__isHover) { + return; + } + if (el.__hoverStlDirty) { + var stroke = el.style.stroke; + var fill = el.style.fill; + + // Create hoverStyle on mouseover + var hoverStyle = el.__hoverStl; + var lift = colorTool.lift; + hoverStyle.fill = hoverStyle.fill + || (fill && (fill instanceof Gradient ? fill : lift(fill, -0.1))); + hoverStyle.stroke = hoverStyle.stroke + || (stroke && (stroke instanceof Gradient ? stroke : lift(stroke, -0.1))); + + var normalStyle = {}; + for (var name in hoverStyle) { + if (hoverStyle.hasOwnProperty(name)) { + normalStyle[name] = el.style[name]; + } + } + + el.__normalStl = normalStyle; + + el.__hoverStlDirty = false; + } + el.setStyle(el.__hoverStl); + el.z2 += 1; + + el.__isHover = true; + } + + /** + * @inner + */ + function doSingleLeaveHover(el) { + if (!el.__isHover) { + return; + } + + var normalStl = el.__normalStl; + normalStl && el.setStyle(normalStl); + el.z2 -= 1; + + el.__isHover = false; + } + + /** + * @inner + */ + function doEnterHover(el) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + doSingleEnterHover(child); + } + }) + : doSingleEnterHover(el); + } + + function doLeaveHover(el) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + doSingleLeaveHover(child); + } + }) + : doSingleLeaveHover(el); + } + + /** + * @inner + */ + function setElementHoverStl(el, hoverStl) { + // If element has sepcified hoverStyle, then use it instead of given hoverStyle + // Often used when item group has a label element and it's hoverStyle is different + el.__hoverStl = el.hoverStyle || hoverStl || {}; + el.__hoverStlDirty = true; + } + + /** + * @inner + */ + function onElementMouseOver() { + // Only if element is not in emphasis status + !this.__isEmphasis && doEnterHover(this); + } + + /** + * @inner + */ + function onElementMouseOut() { + // Only if element is not in emphasis status + !this.__isEmphasis && doLeaveHover(this); + } + + /** + * @inner + */ + function enterEmphasis() { + this.__isEmphasis = true; + doEnterHover(this); + } + + /** + * @inner + */ + function leaveEmphasis() { + this.__isEmphasis = false; + doLeaveHover(this); + } + + /** + * Set hover style of element + * @param {module:zrender/Element} el + * @param {Object} [hoverStyle] + */ + graphic.setHoverStyle = function (el, hoverStyle) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + setElementHoverStl(child, hoverStyle); + } + }) + : setElementHoverStl(el, hoverStyle); + // Remove previous bound handlers + el.on('mouseover', onElementMouseOver) + .on('mouseout', onElementMouseOut); + + // Emphasis, normal can be triggered manually + el.on('emphasis', enterEmphasis) + .on('normal', leaveEmphasis); + }; + + /** + * Set text option in the style + * @param {Object} textStyle + * @param {module:echarts/model/Model} labelModel + * @param {string} color + */ + graphic.setText = function (textStyle, labelModel, color) { + var labelPosition = labelModel.getShallow('position') || 'inside'; + var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color; + var textStyleModel = labelModel.getModel('textStyle'); + zrUtil.extend(textStyle, { + textDistance: labelModel.getShallow('distance') || 5, + textFont: textStyleModel.getFont(), + textPosition: labelPosition, + textFill: textStyleModel.getTextColor() || labelColor + }); + }; + + function animateOrSetProps(isUpdate, el, props, animatableModel, cb) { + var postfix = isUpdate ? 'Update' : ''; + var duration = animatableModel + && animatableModel.getShallow('animationDuration' + postfix); + var animationEasing = animatableModel + && animatableModel.getShallow('animationEasing' + postfix); + + animatableModel && animatableModel.getShallow('animation') + ? el.animateTo(props, duration, animationEasing, cb) + : (el.attr(props), cb && cb()); + } + /** + * Update graphic element properties with or without animation according to the configuration in series + * @param {module:zrender/Element} el + * @param {Object} props + * @param {module:echarts/model/Model} [animatableModel] + * @param {Function} cb + */ + graphic.updateProps = zrUtil.curry(animateOrSetProps, true); + + /** + * Init graphic element properties with or without animation according to the configuration in series + * @param {module:zrender/Element} el + * @param {Object} props + * @param {module:echarts/model/Model} [animatableModel] + * @param {Function} cb + */ + graphic.initProps = zrUtil.curry(animateOrSetProps, false); + + /** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param {module:zrender/mixin/Transformable} target + * @param {module:zrender/mixin/Transformable} ancestor + */ + graphic.getTransform = function (target, ancestor) { + var mat = matrix.identity([]); + + while (target && target !== ancestor) { + matrix.mul(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + return mat; + }; + + /** + * Apply transform to an vertex. + * @param {Array.} vertex [x, y] + * @param {Array.} transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param {boolean=} invert Whether use invert matrix. + * @return {Array.} [x, y] + */ + graphic.applyTransform = function (vertex, transform, invert) { + if (invert) { + transform = matrix.invert([], transform); + } + return vector.applyTransform([], vertex, transform); + }; + + /** + * @param {string} direction 'left' 'right' 'top' 'bottom' + * @param {Array.} transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param {boolean=} invert Whether use invert matrix. + * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom' + */ + graphic.transformDirection = function (direction, transform, invert) { + + // Pick a base, ensure that transform result will not be (0, 0). + var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0) + ? 1 : Math.abs(2 * transform[4] / transform[0]); + var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0) + ? 1 : Math.abs(2 * transform[4] / transform[2]); + + var vertex = [ + direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, + direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0 + ]; + + vertex = graphic.applyTransform(vertex, transform, invert); + + return Math.abs(vertex[0]) > Math.abs(vertex[1]) + ? (vertex[0] > 0 ? 'right' : 'left') + : (vertex[1] > 0 ? 'bottom' : 'top'); + }; + + module.exports = graphic; + + +/***/ }, +/* 43 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Path = __webpack_require__(44); + var PathProxy = __webpack_require__(48); + var transformPath = __webpack_require__(58); + var matrix = __webpack_require__(17); + + // command chars + var cc = [ + 'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', + 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A' + ]; + + var mathSqrt = Math.sqrt; + var mathSin = Math.sin; + var mathCos = Math.cos; + var PI = Math.PI; + + var vMag = function(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); + }; + var vRatio = function(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); + }; + var vAngle = function(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) + * Math.acos(vRatio(u, v)); + }; + + function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { + var psi = psiDeg * (PI / 180.0); + var xp = mathCos(psi) * (x1 - x2) / 2.0 + + mathSin(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0 + + mathCos(psi) * (y1 - y2) / 2.0; + + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + + if (lambda > 1) { + rx *= mathSqrt(lambda); + ry *= mathSqrt(lambda); + } + + var f = (fa === fs ? -1 : 1) + * mathSqrt((((rx * rx) * (ry * ry)) + - ((rx * rx) * (yp * yp)) + - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + + (ry * ry) * (xp * xp)) + ) || 0; + + var cxp = f * rx * yp / ry; + var cyp = f * -ry * xp / rx; + + var cx = (x1 + x2) / 2.0 + + mathCos(psi) * cxp + - mathSin(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin(psi) * cxp + + mathCos(psi) * cyp; + + var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]); + var u = [ (xp - cxp) / rx, (yp - cyp) / ry ]; + var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ]; + var dTheta = vAngle(u, v); + + if (vRatio(u, v) <= -1) { + dTheta = PI; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (fs === 0 && dTheta > 0) { + dTheta = dTheta - 2 * PI; + } + if (fs === 1 && dTheta < 0) { + dTheta = dTheta + 2 * PI; + } + + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); + } + + function createPathProxyFromString(data) { + if (!data) { + return []; + } + + // command string + var cs = data.replace(/-/g, ' -') + .replace(/ /g, ' ') + .replace(/ /g, ',') + .replace(/,,/g, ','); + + var n; + // create pipes so that we can split the data + for (n = 0; n < cc.length; n++) { + cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]); + } + + // create array + var arr = cs.split('|'); + // init context point + var cpx = 0; + var cpy = 0; + + var path = new PathProxy(); + var CMD = PathProxy.CMD; + + var prevCmd; + for (n = 1; n < arr.length; n++) { + var str = arr[n]; + var c = str.charAt(0); + var off = 0; + var p = str.slice(1).replace(/e,-/g, 'e-').split(','); + var cmd; + + if (p.length > 0 && p[0] === '') { + p.shift(); + } + + for (var i = 0; i < p.length; i++) { + p[i] = parseFloat(p[i]); + } + while (off < p.length && !isNaN(p[off])) { + if (isNaN(p[0])) { + break; + } + var ctlPtx; + var ctlPty; + + var rx; + var ry; + var psi; + var fa; + var fs; + + var x1 = cpx; + var y1 = cpy; + + // convert l, H, h, V, and v to L + switch (c) { + case 'l': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'L': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'm': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + c = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + c = 'L'; + break; + case 'h': + cpx += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'H': + cpx = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'v': + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'V': + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'C': + cmd = CMD.C; + path.addData( + cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++] + ); + cpx = p[off - 2]; + cpy = p[off - 1]; + break; + case 'c': + cmd = CMD.C; + path.addData( + cmd, + p[off++] + cpx, p[off++] + cpy, + p[off++] + cpx, p[off++] + cpy, + p[off++] + cpx, p[off++] + cpy + ); + cpx += p[off - 2]; + cpy += p[off - 1]; + break; + case 'S': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 's': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = cpx + p[off++]; + y1 = cpy + p[off++]; + cpx += p[off++]; + cpy += p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 'Q': + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'q': + x1 = p[off++] + cpx; + y1 = p[off++] + cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'T': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 't': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 'A': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + + x1 = cpx, y1 = cpy; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.A; + processArc( + x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path + ); + break; + case 'a': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + + x1 = cpx, y1 = cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.A; + processArc( + x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path + ); + break; + } + } + + if (c === 'z' || c === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + } + + prevCmd = cmd; + } + + path.toStatic(); + + return path; + } + + // TODO Optimize double memory cost problem + function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + var transform; + opts = opts || {}; + opts.buildPath = function (path) { + path.setData(pathProxy.data); + transform && transformPath(path, transform); + // Svg and vml renderer don't have context + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx); + } + }; + + opts.applyTransform = function (m) { + if (!transform) { + transform = matrix.create(); + } + matrix.mul(transform, m, transform); + }; + + return opts; + } + + module.exports = { + /** + * Create a Path object from path string data + * http://www.w3.org/TR/SVG/paths.html#PathData + * @param {Object} opts Other options + */ + createFromString: function (str, opts) { + return new Path(createPathOptions(str, opts)); + }, + + /** + * Create a Path class from path string data + * @param {string} str + * @param {Object} opts Other options + */ + extendFromString: function (str, opts) { + return Path.extend(createPathOptions(str, opts)); + }, + + /** + * Merge multiple paths + */ + // TODO Apply transform + // TODO stroke dash + // TODO Optimize double memory cost problem + mergePath: function (pathEls, opts) { + var pathList = []; + var len = pathEls.length; + var pathEl; + var i; + for (i = 0; i < len; i++) { + pathEl = pathEls[i]; + if (pathEl.__dirty) { + pathEl.buildPath(pathEl.path, pathEl.shape); + } + pathList.push(pathEl.path); + } + + var pathBundle = new Path(opts); + pathBundle.buildPath = function (path) { + path.appendPath(pathList); + // Svg and vml renderer don't have context + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx); + } + }; + + return pathBundle; + } + }; + + +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Path element + * @module zrender/graphic/Path + */ + + + + var Displayable = __webpack_require__(45); + var zrUtil = __webpack_require__(3); + var PathProxy = __webpack_require__(48); + var pathContain = __webpack_require__(51); + + var Gradient = __webpack_require__(4); + + function pathHasFill(style) { + var fill = style.fill; + return fill != null && fill !== 'none'; + } + + function pathHasStroke(style) { + var stroke = style.stroke; + return stroke != null && stroke !== 'none' && style.lineWidth > 0; + } + + var abs = Math.abs; + + /** + * @alias module:zrender/graphic/Path + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + function Path(opts) { + Displayable.call(this, opts); + + /** + * @type {module:zrender/core/PathProxy} + * @readOnly + */ + this.path = new PathProxy(); + } + + Path.prototype = { + + constructor: Path, + + type: 'path', + + __dirtyPath: true, + + strokeContainThreshold: 5, + + brush: function (ctx) { + ctx.save(); + + var style = this.style; + var path = this.path; + var hasStroke = pathHasStroke(style); + var hasFill = pathHasFill(style); + + if (this.__dirtyPath) { + // Update gradient because bounding rect may changed + if (hasFill && (style.fill instanceof Gradient)) { + style.fill.updateCanvasGradient(this, ctx); + } + if (hasStroke && (style.stroke instanceof Gradient)) { + style.stroke.updateCanvasGradient(this, ctx); + } + } + + style.bind(ctx, this); + this.setTransform(ctx); + + var lineDash = style.lineDash; + var lineDashOffset = style.lineDashOffset; + + var ctxLineDash = !!ctx.setLineDash; + + // Proxy context + // Rebuild path in following 2 cases + // 1. Path is dirty + // 2. Path needs javascript implemented lineDash stroking. + // In this case, lineDash information will not be saved in PathProxy + if (this.__dirtyPath || ( + lineDash && !ctxLineDash && hasStroke + )) { + path = this.path.beginPath(ctx); + + // Setting line dash before build path + if (lineDash && !ctxLineDash) { + path.setLineDash(lineDash); + path.setLineDashOffset(lineDashOffset); + } + + this.buildPath(path, this.shape); + + // Clear path dirty flag + this.__dirtyPath = false; + } + else { + // Replay path building + ctx.beginPath(); + this.path.rebuildPath(ctx); + } + + hasFill && path.fill(ctx); + + if (lineDash && ctxLineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + + hasStroke && path.stroke(ctx); + + // Draw rect text + if (style.text != null) { + // var rect = this.getBoundingRect(); + this.drawRectText(ctx, this.getBoundingRect()); + } + + ctx.restore(); + }, + + buildPath: function (ctx, shapeCfg) {}, + + getBoundingRect: function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var path = this.path; + if (this.__dirtyPath) { + path.beginPath(); + this.buildPath(path, this.shape); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + + if (pathHasStroke(style)) { + // Needs update rect with stroke lineWidth when + // 1. Element changes scale or lineWidth + // 2. Shape is changed + var rectWithStroke = this._rectWithStroke; + if (this.__dirty || needsUpdateRect) { + var rectWithStroke = this._rectWithStroke + || (this._rectWithStroke = rect.clone()); + rectWithStroke.copy(rect); + // FIXME Must after updateTransform + var w = style.lineWidth; + // PENDING, Min line width is needed when line is horizontal or vertical + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + + // Only add extra hover lineWidth when there are no fill + if (!pathHasFill(style)) { + w = Math.max(w, this.strokeContainThreshold); + } + // Consider line width + // Line scale can't be 0; + if (lineScale > 1e-10) { + rectWithStroke.width += w / lineScale; + rectWithStroke.height += w / lineScale; + rectWithStroke.x -= w / lineScale / 2; + rectWithStroke.y -= w / lineScale / 2; + } + } + + // Return rect with stroke + return rectWithStroke; + } + + return rect; + }, + + contain: function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + var style = this.style; + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + var pathData = this.path.data; + if (pathHasStroke(style)) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + // Line scale can't be 0; + if (lineScale > 1e-10) { + // Only add extra hover lineWidth when there are no fill + if (!pathHasFill(style)) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (pathContain.containStroke( + pathData, lineWidth / lineScale, x, y + )) { + return true; + } + } + } + if (pathHasFill(style)) { + return pathContain.contain(pathData, x, y); + } + } + return false; + }, + + /** + * @param {boolean} dirtyPath + */ + dirty: function (dirtyPath) { + if (arguments.length ===0) { + dirtyPath = true; + } + // Only mark dirty, not mark clean + if (dirtyPath) { + this.__dirtyPath = dirtyPath; + this._rect = null; + } + + this.__dirty = true; + + this.__zr && this.__zr.refresh(); + + // Used as a clipping path + if (this.__clipTarget) { + this.__clipTarget.dirty(); + } + }, + + /** + * Alias for animate('shape') + * @param {boolean} loop + */ + animateShape: function (loop) { + return this.animate('shape', loop); + }, + + // Overwrite attrKV + attrKV: function (key, value) { + // FIXME + if (key === 'shape') { + this.setShape(value); + } + else { + Displayable.prototype.attrKV.call(this, key, value); + } + }, + + /** + * @param {Object|string} key + * @param {*} value + */ + setShape: function (key, value) { + var shape = this.shape; + // Path from string may not have shape + if (shape) { + if (zrUtil.isObject(key)) { + for (var name in key) { + shape[name] = key[name]; + } + } + else { + shape[key] = value; + } + this.dirty(true); + } + return this; + }, + + getLineScale: function () { + var m = this.transform; + // Get the line scale. + // Determinant of `m` means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 + ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) + : 1; + } + }; + + /** + * 扩展一个 Path element, 比如星形,圆等。 + * Extend a path element + * @param {Object} props + * @param {string} props.type Path type + * @param {Function} props.init Initialize + * @param {Function} props.buildPath Overwrite buildPath method + * @param {Object} [props.style] Extended default style config + * @param {Object} [props.shape] Extended default shape config + */ + Path.extend = function (defaults) { + var Sub = function (opts) { + Path.call(this, opts); + + if (defaults.style) { + // Extend default style + this.style.extendFrom(defaults.style, false); + } + + // Extend default shape + var defaultShape = defaults.shape; + if (defaultShape) { + this.shape = this.shape || {}; + var thisShape = this.shape; + for (var name in defaultShape) { + if ( + ! thisShape.hasOwnProperty(name) + && defaultShape.hasOwnProperty(name) + ) { + thisShape[name] = defaultShape[name]; + } + } + } + + defaults.init && defaults.init.call(this, opts); + }; + + zrUtil.inherits(Sub, Path); + + // FIXME 不能 extend position, rotation 等引用对象 + for (var name in defaults) { + // Extending prototype values and methods + if (name !== 'style' && name !== 'shape') { + Sub.prototype[name] = defaults[name]; + } + } + + return Sub; + }; + + zrUtil.inherits(Path, Displayable); + + module.exports = Path; + + +/***/ }, +/* 45 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 可绘制的图形基类 + * Base class of all displayable graphic objects + * @module zrender/graphic/Displayable + */ + + + + var zrUtil = __webpack_require__(3); + + var Style = __webpack_require__(46); + + var Element = __webpack_require__(30); + var RectText = __webpack_require__(47); + // var Stateful = require('./mixin/Stateful'); + + /** + * @alias module:zrender/graphic/Displayable + * @extends module:zrender/Element + * @extends module:zrender/graphic/mixin/RectText + */ + function Displayable(opts) { + + opts = opts || {}; + + Element.call(this, opts); + + // Extend properties + for (var name in opts) { + if ( + opts.hasOwnProperty(name) && + name !== 'style' + ) { + this[name] = opts[name]; + } + } + + /** + * @type {module:zrender/graphic/Style} + */ + this.style = new Style(opts.style); + + this._rect = null; + // Shapes for cascade clipping. + this.__clipPaths = []; + + // FIXME Stateful must be mixined after style is setted + // Stateful.call(this, opts); + } + + Displayable.prototype = { + + constructor: Displayable, + + type: 'displayable', + + /** + * Displayable 是否为脏,Painter 中会根据该标记判断是否需要是否需要重新绘制 + * Dirty flag. From which painter will determine if this displayable object needs brush + * @name module:zrender/graphic/Displayable#__dirty + * @type {boolean} + */ + __dirty: true, + + /** + * 图形是否可见,为true时不绘制图形,但是仍能触发鼠标事件 + * If ignore drawing of the displayable object. Mouse event will still be triggered + * @name module:/zrender/graphic/Displayable#invisible + * @type {boolean} + * @default false + */ + invisible: false, + + /** + * @name module:/zrender/graphic/Displayable#z + * @type {number} + * @default 0 + */ + z: 0, + + /** + * @name module:/zrender/graphic/Displayable#z + * @type {number} + * @default 0 + */ + z2: 0, + + /** + * z层level,决定绘画在哪层canvas中 + * @name module:/zrender/graphic/Displayable#zlevel + * @type {number} + * @default 0 + */ + zlevel: 0, + + /** + * 是否可拖拽 + * @name module:/zrender/graphic/Displayable#draggable + * @type {boolean} + * @default false + */ + draggable: false, + + /** + * 是否正在拖拽 + * @name module:/zrender/graphic/Displayable#draggable + * @type {boolean} + * @default false + */ + dragging: false, + + /** + * 是否相应鼠标事件 + * @name module:/zrender/graphic/Displayable#silent + * @type {boolean} + * @default false + */ + silent: false, + + /** + * If enable culling + * @type {boolean} + * @default false + */ + culling: false, + + /** + * Mouse cursor when hovered + * @name module:/zrender/graphic/Displayable#cursor + * @type {string} + */ + cursor: 'pointer', + + /** + * If hover area is bounding rect + * @name module:/zrender/graphic/Displayable#rectHover + * @type {string} + */ + rectHover: false, + + beforeBrush: function (ctx) {}, + + afterBrush: function (ctx) {}, + + /** + * 图形绘制方法 + * @param {Canvas2DRenderingContext} ctx + */ + // Interface + brush: function (ctx) {}, + + /** + * 获取最小包围盒 + * @return {module:zrender/core/BoundingRect} + */ + // Interface + getBoundingRect: function () {}, + + /** + * 判断坐标 x, y 是否在图形上 + * If displayable element contain coord x, y + * @param {number} x + * @param {number} y + * @return {boolean} + */ + contain: function (x, y) { + return this.rectContain(x, y); + }, + + /** + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) { + cb.call(context, this); + }, + + /** + * 判断坐标 x, y 是否在图形的包围盒上 + * If bounding rect of element contain coord x, y + * @param {number} x + * @param {number} y + * @return {boolean} + */ + rectContain: function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }, + + /** + * 标记图形元素为脏,并且在下一帧重绘 + * Mark displayable element dirty and refresh next frame + */ + dirty: function () { + this.__dirty = true; + + this._rect = null; + + this.__zr && this.__zr.refresh(); + }, + + /** + * 图形是否会触发事件 + * If displayable object binded any event + * @return {boolean} + */ + // TODO, 通过 bind 绑定的事件 + // isSilent: function () { + // return !( + // this.hoverable || this.draggable + // || this.onmousemove || this.onmouseover || this.onmouseout + // || this.onmousedown || this.onmouseup || this.onclick + // || this.ondragenter || this.ondragover || this.ondragleave + // || this.ondrop + // ); + // }, + /** + * Alias for animate('style') + * @param {boolean} loop + */ + animateStyle: function (loop) { + return this.animate('style', loop); + }, + + attrKV: function (key, value) { + if (key !== 'style') { + Element.prototype.attrKV.call(this, key, value); + } + else { + this.style.set(value); + } + }, + + /** + * @param {Object|string} key + * @param {*} value + */ + setStyle: function (key, value) { + this.style.set(key, value); + this.dirty(false); + return this; + } + }; + + zrUtil.inherits(Displayable, Element); + + zrUtil.mixin(Displayable, RectText); + // zrUtil.mixin(Displayable, Stateful); + + module.exports = Displayable; + + +/***/ }, +/* 46 */ +/***/ function(module, exports) { + + /** + * @module zrender/graphic/Style + */ + + + + var STYLE_LIST_COMMON = [ + 'lineCap', 'lineJoin', 'miterLimit', + 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'shadowColor' + ]; + + var Style = function (opts) { + this.extendFrom(opts); + }; + + Style.prototype = { + + constructor: Style, + + /** + * @type {string} + */ + fill: '#000000', + + /** + * @type {string} + */ + stroke: null, + + /** + * @type {number} + */ + opacity: 1, + + /** + * @type {Array.} + */ + lineDash: null, + + /** + * @type {number} + */ + lineDashOffset: 0, + + /** + * @type {number} + */ + shadowBlur: 0, + + /** + * @type {number} + */ + shadowOffsetX: 0, + + /** + * @type {number} + */ + shadowOffsetY: 0, + + /** + * @type {number} + */ + lineWidth: 1, + + /** + * If stroke ignore scale + * @type {Boolean} + */ + strokeNoScale: false, + + // Bounding rect text configuration + // Not affected by element transform + /** + * @type {string} + */ + text: null, + + /** + * @type {string} + */ + textFill: '#000', + + /** + * @type {string} + */ + textStroke: null, + + /** + * 'inside', 'left', 'right', 'top', 'bottom' + * [x, y] + * @type {string|Array.} + * @default 'inside' + */ + textPosition: 'inside', + + /** + * @type {string} + */ + textBaseline: null, + + /** + * @type {string} + */ + textAlign: null, + + /** + * @type {string} + */ + textVerticalAlign: null, + + /** + * @type {number} + */ + textDistance: 5, + + /** + * @type {number} + */ + textShadowBlur: 0, + + /** + * @type {number} + */ + textShadowOffsetX: 0, + + /** + * @type {number} + */ + textShadowOffsetY: 0, + + /** + * @param {CanvasRenderingContext2D} ctx + */ + bind: function (ctx, el) { + var fill = this.fill; + var stroke = this.stroke; + for (var i = 0; i < STYLE_LIST_COMMON.length; i++) { + var styleName = STYLE_LIST_COMMON[i]; + + if (this[styleName] != null) { + ctx[styleName] = this[styleName]; + } + } + if (stroke != null) { + var lineWidth = this.lineWidth; + ctx.lineWidth = lineWidth / ( + (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1 + ); + } + if (fill != null) { + // Use canvas gradient if has + ctx.fillStyle = fill.canvasGradient ? fill.canvasGradient : fill; + } + if (stroke != null) { + // Use canvas gradient if has + ctx.strokeStyle = stroke.canvasGradient ? stroke.canvasGradient : stroke; + } + this.opacity != null && (ctx.globalAlpha = this.opacity); + }, + + /** + * Extend from other style + * @param {zrender/graphic/Style} otherStyle + * @param {boolean} overwrite + */ + extendFrom: function (otherStyle, overwrite) { + if (otherStyle) { + var target = this; + for (var name in otherStyle) { + if (otherStyle.hasOwnProperty(name) + && (overwrite || ! target.hasOwnProperty(name)) + ) { + target[name] = otherStyle[name]; + } + } + } + }, + + /** + * Batch setting style with a given object + * @param {Object|string} obj + * @param {*} [obj] + */ + set: function (obj, value) { + if (typeof obj === 'string') { + this[obj] = value; + } + else { + this.extendFrom(obj, true); + } + }, + + /** + * Clone + * @return {zrender/graphic/Style} [description] + */ + clone: function () { + var newStyle = new this.constructor(); + newStyle.extendFrom(this, true); + return newStyle; + } + }; + + var styleProto = Style.prototype; + var name; + var i; + for (i = 0; i < STYLE_LIST_COMMON.length; i++) { + name = STYLE_LIST_COMMON[i]; + if (!(name in styleProto)) { + styleProto[name] = null; + } + } + + module.exports = Style; + + +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Mixin for drawing text in a element bounding rect + * @module zrender/mixin/RectText + */ + + + + var textContain = __webpack_require__(14); + var BoundingRect = __webpack_require__(15); + + var tmpRect = new BoundingRect(); + + var RectText = function () {}; + + function parsePercent(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + } + + function setTransform(ctx, m) { + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + + RectText.prototype = { + + constructor: RectText, + + /** + * Draw text in a rect with specified position. + * @param {CanvasRenderingContext} ctx + * @param {Object} rect Displayable rect + * @return {Object} textRect Alternative precalculated text bounding rect + */ + drawRectText: function (ctx, rect, textRect) { + var style = this.style; + var text = style.text; + // Convert to string + text != null && (text += ''); + if (!text) { + return; + } + var x; + var y; + var textPosition = style.textPosition; + var distance = style.textDistance; + var align = style.textAlign; + var font = style.textFont || style.font; + var baseline = style.textBaseline; + var verticalAlign = style.textVerticalAlign; + + textRect = textRect || textContain.getBoundingRect(text, font, align, baseline); + + // Transform rect to view space + var transform = this.transform; + var invTransform = this.invTransform; + if (transform) { + tmpRect.copy(rect); + tmpRect.applyTransform(transform); + rect = tmpRect; + // Transform back + setTransform(ctx, invTransform); + } + + // Text position represented by coord + if (textPosition instanceof Array) { + // Percent + x = rect.x + parsePercent(textPosition[0], rect.width); + y = rect.y + parsePercent(textPosition[1], rect.height); + align = align || 'left'; + baseline = baseline || 'top'; + } + else { + var res = textContain.adjustTextPositionOnRect( + textPosition, rect, textRect, distance + ); + x = res.x; + y = res.y; + // Default align and baseline when has textPosition + align = align || res.textAlign; + baseline = baseline || res.textBaseline; + } + + ctx.textAlign = align; + if (verticalAlign) { + switch (verticalAlign) { + case 'middle': + y -= textRect.height / 2; + break; + case 'bottom': + y -= textRect.height; + break; + // 'top' + } + // Ignore baseline + ctx.textBaseline = 'top'; + } + else { + ctx.textBaseline = baseline; + } + + var textFill = style.textFill; + var textStroke = style.textStroke; + textFill && (ctx.fillStyle = textFill); + textStroke && (ctx.strokeStyle = textStroke); + ctx.font = font; + + // Text shadow + ctx.shadowColor = style.textShadowColor; + ctx.shadowBlur = style.textShadowBlur; + ctx.shadowOffsetX = style.textShadowOffsetX; + ctx.shadowOffsetY = style.textShadowOffsetY; + + var textLines = text.split('\n'); + for (var i = 0; i < textLines.length; i++) { + textFill && ctx.fillText(textLines[i], x, y); + textStroke && ctx.strokeText(textLines[i], x, y); + y += textRect.lineHeight; + } + + // Transform again + transform && setTransform(ctx, transform); + } + }; + + module.exports = RectText; + + +/***/ }, +/* 48 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Path 代理,可以在`buildPath`中用于替代`ctx`, 会保存每个path操作的命令到pathCommands属性中 + * 可以用于 isInsidePath 判断以及获取boundingRect + * + * @module zrender/core/PathProxy + * @author Yi Shen (http://www.github.com/pissang) + */ + + // TODO getTotalLength, getPointAtLength + + + var curve = __webpack_require__(49); + var vec2 = __webpack_require__(16); + var bbox = __webpack_require__(50); + var BoundingRect = __webpack_require__(15); + + var CMD = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + // Rect + R: 7 + }; + + var min = []; + var max = []; + var min2 = []; + var max2 = []; + var mathMin = Math.min; + var mathMax = Math.max; + var mathCos = Math.cos; + var mathSin = Math.sin; + var mathSqrt = Math.sqrt; + + var hasTypedArray = typeof Float32Array != 'undefined'; + + /** + * @alias module:zrender/core/PathProxy + * @constructor + */ + var PathProxy = function () { + + /** + * Path data. Stored as flat array + * @type {Array.} + */ + this.data = []; + + this._len = 0; + + this._ctx = null; + + this._xi = 0; + this._yi = 0; + + this._x0 = 0; + this._y0 = 0; + }; + + /** + * 快速计算Path包围盒(并不是最小包围盒) + * @return {Object} + */ + PathProxy.prototype = { + + constructor: PathProxy, + + _lineDash: null, + + _dashOffset: 0, + + _dashIdx: 0, + + _dashSum: 0, + + getContext: function () { + return this._ctx; + }, + + /** + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + beginPath: function (ctx) { + this._ctx = ctx; + + ctx && ctx.beginPath(); + + // Reset + this._len = 0; + + if (this._lineDash) { + this._lineDash = null; + + this._dashOffset = 0; + } + + return this; + }, + + /** + * @param {number} x + * @param {number} y + * @return {module:zrender/core/PathProxy} + */ + moveTo: function (x, y) { + this.addData(CMD.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + + // x0, y0, xi, yi 是记录在 _dashedXXXXTo 方法中使用 + // xi, yi 记录当前点, x0, y0 在 closePath 的时候回到起始点。 + // 有可能在 beginPath 之后直接调用 lineTo,这时候 x0, y0 需要 + // 在 lineTo 方法中记录,这里先不考虑这种情况,dashed line 也只在 IE10- 中不支持 + this._x0 = x; + this._y0 = y; + + this._xi = x; + this._yi = y; + + return this; + }, + + /** + * @param {number} x + * @param {number} y + * @return {module:zrender/core/PathProxy} + */ + lineTo: function (x, y) { + this.addData(CMD.L, x, y); + if (this._ctx) { + this._needsDash() ? this._dashedLineTo(x, y) + : this._ctx.lineTo(x, y); + } + this._xi = x; + this._yi = y; + return this; + }, + + /** + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @return {module:zrender/core/PathProxy} + */ + bezierCurveTo: function (x1, y1, x2, y2, x3, y3) { + this.addData(CMD.C, x1, y1, x2, y2, x3, y3); + if (this._ctx) { + this._needsDash() ? this._dashedBezierTo(x1, y1, x2, y2, x3, y3) + : this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + this._xi = x3; + this._yi = y3; + return this; + }, + + /** + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @return {module:zrender/core/PathProxy} + */ + quadraticCurveTo: function (x1, y1, x2, y2) { + this.addData(CMD.Q, x1, y1, x2, y2); + if (this._ctx) { + this._needsDash() ? this._dashedQuadraticTo(x1, y1, x2, y2) + : this._ctx.quadraticCurveTo(x1, y1, x2, y2); + } + this._xi = x2; + this._yi = y2; + return this; + }, + + /** + * @param {number} cx + * @param {number} cy + * @param {number} r + * @param {number} startAngle + * @param {number} endAngle + * @param {boolean} anticlockwise + * @return {module:zrender/core/PathProxy} + */ + arc: function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this.addData( + CMD.A, cx, cy, r, r, startAngle, endAngle - startAngle, 0, anticlockwise ? 0 : 1 + ); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + + this._xi = mathCos(endAngle) * r + cx; + this._xi = mathSin(endAngle) * r + cx; + return this; + }, + + // TODO + arcTo: function (x1, y1, x2, y2, radius) { + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }, + + // TODO + rect: function (x, y, w, h) { + this._ctx && this._ctx.rect(x, y, w, h); + this.addData(CMD.R, x, y, w, h); + return this; + }, + + /** + * @return {module:zrender/core/PathProxy} + */ + closePath: function () { + this.addData(CMD.Z); + + var ctx = this._ctx; + var x0 = this._x0; + var y0 = this._y0; + if (ctx) { + this._needsDash() && this._dashedLineTo(x0, y0); + ctx.closePath(); + } + + this._xi = x0; + this._yi = y0; + return this; + }, + + /** + * Context 从外部传入,因为有可能是 rebuildPath 完之后再 fill。 + * stroke 同样 + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + fill: function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }, + + /** + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + stroke: function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }, + + /** + * 必须在其它绘制命令前调用 + * Must be invoked before all other path drawing methods + * @return {module:zrender/core/PathProxy} + */ + setLineDash: function (lineDash) { + if (lineDash instanceof Array) { + this._lineDash = lineDash; + + this._dashIdx = 0; + + var lineDashSum = 0; + for (var i = 0; i < lineDash.length; i++) { + lineDashSum += lineDash[i]; + } + this._dashSum = lineDashSum; + } + return this; + }, + + /** + * 必须在其它绘制命令前调用 + * Must be invoked before all other path drawing methods + * @return {module:zrender/core/PathProxy} + */ + setLineDashOffset: function (offset) { + this._dashOffset = offset; + return this; + }, + + /** + * + * @return {boolean} + */ + len: function () { + return this._len; + }, + + /** + * 直接设置 Path 数据 + */ + setData: function (data) { + + var len = data.length; + + if (! (this.data && this.data.length == len) && hasTypedArray) { + this.data = new Float32Array(len); + } + + for (var i = 0; i < len; i++) { + this.data[i] = data[i]; + } + + this._len = len; + }, + + /** + * 添加子路径 + * @param {module:zrender/core/PathProxy|Array.} path + */ + appendPath: function (path) { + if (!(path instanceof Array)) { + path = [path]; + } + var len = path.length; + var appendSize = 0; + var offset = this._len; + for (var i = 0; i < len; i++) { + appendSize += path[i].len(); + } + if (hasTypedArray && (this.data instanceof Float32Array)) { + this.data = new Float32Array(offset + appendSize); + } + for (var i = 0; i < len; i++) { + var appendPathData = path[i].data; + for (var k = 0; k < appendPathData.length; k++) { + this.data[offset++] = appendPathData[k]; + } + } + this._len = offset; + }, + + /** + * 填充 Path 数据。 + * 尽量复用而不申明新的数组。大部分图形重绘的指令数据长度都是不变的。 + */ + addData: function (cmd) { + var data = this.data; + if (this._len + arguments.length > data.length) { + // 因为之前的数组已经转换成静态的 Float32Array + // 所以不够用时需要扩展一个新的动态数组 + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + + this._prevCmd = cmd; + }, + + _expandData: function () { + // Only if data is Float32Array + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }, + + /** + * If needs js implemented dashed line + * @return {boolean} + * @private + */ + _needsDash: function () { + return this._lineDash; + }, + + _dashedLineTo: function (x1, y1) { + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var ctx = this._ctx; + + var x0 = this._xi; + var y0 = this._yi; + var dx = x1 - x0; + var dy = y1 - y0; + var dist = mathSqrt(dx * dx + dy * dy); + var x = x0; + var y = y0; + var dash; + var nDash = lineDash.length; + var idx; + dx /= dist; + dy /= dist; + + if (offset < 0) { + // Convert to positive offset + offset = dashSum + offset; + } + offset %= dashSum; + x -= offset * dx; + y -= offset * dy; + + while ((dx >= 0 && x <= x1) || (dx < 0 && x > x1)) { + idx = this._dashIdx; + dash = lineDash[idx]; + x += dx * dash; + y += dy * dash; + this._dashIdx = (idx + 1) % nDash; + // Skip positive offset + if ((dx > 0 && x < x0) || (dx < 0 && x > x0)) { + continue; + } + ctx[idx % 2 ? 'moveTo' : 'lineTo']( + dx >= 0 ? mathMin(x, x1) : mathMax(x, x1), + dy >= 0 ? mathMin(y, y1) : mathMax(y, y1) + ); + } + // Offset for next lineTo + dx = x - x1; + dy = y - y1; + this._dashOffset = -mathSqrt(dx * dx + dy * dy); + }, + + // Not accurate dashed line to + _dashedBezierTo: function (x1, y1, x2, y2, x3, y3) { + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var ctx = this._ctx; + + var x0 = this._xi; + var y0 = this._yi; + var t; + var dx; + var dy; + var cubicAt = curve.cubicAt; + var bezierLen = 0; + var idx = this._dashIdx; + var nDash = lineDash.length; + + var x; + var y; + + var tmpLen = 0; + + if (offset < 0) { + // Convert to positive offset + offset = dashSum + offset; + } + offset %= dashSum; + // Bezier approx length + for (t = 0; t < 1; t += 0.1) { + dx = cubicAt(x0, x1, x2, x3, t + 0.1) + - cubicAt(x0, x1, x2, x3, t); + dy = cubicAt(y0, y1, y2, y3, t + 0.1) + - cubicAt(y0, y1, y2, y3, t); + bezierLen += mathSqrt(dx * dx + dy * dy); + } + + // Find idx after add offset + for (; idx < nDash; idx++) { + tmpLen += lineDash[idx]; + if (tmpLen > offset) { + break; + } + } + t = (tmpLen - offset) / bezierLen; + + while (t <= 1) { + + x = cubicAt(x0, x1, x2, x3, t); + y = cubicAt(y0, y1, y2, y3, t); + + // Use line to approximate dashed bezier + // Bad result if dash is long + idx % 2 ? ctx.moveTo(x, y) + : ctx.lineTo(x, y); + + t += lineDash[idx] / bezierLen; + + idx = (idx + 1) % nDash; + } + + // Finish the last segment and calculate the new offset + (idx % 2 !== 0) && ctx.lineTo(x3, y3); + dx = x3 - x; + dy = y3 - y; + this._dashOffset = -mathSqrt(dx * dx + dy * dy); + }, + + _dashedQuadraticTo: function (x1, y1, x2, y2) { + // Convert quadratic to cubic using degree elevation + var x3 = x2; + var y3 = y2; + x2 = (x2 + 2 * x1) / 3; + y2 = (y2 + 2 * y1) / 3; + x1 = (this._xi + 2 * x1) / 3; + y1 = (this._yi + 2 * y1) / 3; + + this._dashedBezierTo(x1, y1, x2, y2, x3, y3); + }, + + /** + * 转成静态的 Float32Array 减少堆内存占用 + * Convert dynamic array to static Float32Array + */ + toStatic: function () { + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray) { + this.data = new Float32Array(data); + } + } + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function () { + min[0] = min[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max[0] = max[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = data[i]; + yi = data[i + 1]; + + x0 = xi; + y0 = yi; + } + + switch (cmd) { + case CMD.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD.L: + bbox.fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + bbox.fromCubic( + xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + min2, max2 + ); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + bbox.fromQuadratic( + xi, yi, data[i++], data[i++], data[i], data[i + 1], + min2, max2 + ); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + // TODO Arc 旋转 + var psi = data[i++]; + var anticlockwise = 1 - data[i++]; + + if (i == 1) { + // 直接使用 arc 命令 + // 第一个命令起点还未定义 + x0 = mathCos(startAngle) * rx + cx; + y0 = mathSin(startAngle) * ry + cy; + } + + bbox.fromArc( + cx, cy, rx, ry, startAngle, endAngle, + anticlockwise, min2, max2 + ); + + xi = mathCos(endAngle) * rx + cx; + yi = mathSin(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + // Use fromLine + bbox.fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD.Z: + xi = x0; + yi = y0; + break; + } + + // Union + vec2.min(min, min, min2); + vec2.max(max, max, max2); + } + + // No data + if (i === 0) { + min[0] = min[1] = max[0] = max[1] = 0; + } + + return new BoundingRect( + min[0], min[1], max[0] - min[0], max[1] - min[1] + ); + }, + + /** + * Rebuild path from current data + * Rebuild path will not consider javascript implemented line dash. + * @param {CanvasRenderingContext} ctx + */ + rebuildPath: function (ctx) { + var d = this.data; + for (var i = 0; i < this._len;) { + var cmd = d[i++]; + switch (cmd) { + case CMD.M: + ctx.moveTo(d[i++], d[i++]); + break; + case CMD.L: + ctx.lineTo(d[i++], d[i++]); + break; + case CMD.C: + ctx.bezierCurveTo( + d[i++], d[i++], d[i++], d[i++], d[i++], d[i++] + ); + break; + case CMD.Q: + ctx.quadraticCurveTo(d[i++], d[i++], d[i++], d[i++]); + break; + case CMD.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var theta = d[i++]; + var dTheta = d[i++]; + var psi = d[i++]; + var fs = d[i++]; + var r = (rx > ry) ? rx : ry; + var scaleX = (rx > ry) ? 1 : rx / ry; + var scaleY = (rx > ry) ? ry / rx : 1; + var isEllipse = Math.abs(rx - ry) > 1e-3; + if (isEllipse) { + ctx.translate(cx, cy); + ctx.rotate(psi); + ctx.scale(scaleX, scaleY); + ctx.arc(0, 0, r, theta, theta + dTheta, 1 - fs); + ctx.scale(1 / scaleX, 1 / scaleY); + ctx.rotate(-psi); + ctx.translate(-cx, -cy); + } + else { + ctx.arc(cx, cy, r, theta, theta + dTheta, 1 - fs); + } + break; + case CMD.R: + ctx.rect(d[i++], d[i++], d[i++], d[i++]); + break; + case CMD.Z: + ctx.closePath(); + } + } + } + }; + + PathProxy.CMD = CMD; + + module.exports = PathProxy; + + +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 曲线辅助模块 + * @module zrender/core/curve + * @author pissang(https://www.github.com/pissang) + */ + + + var vec2 = __webpack_require__(16); + var v2Create = vec2.create; + var v2DistSquare = vec2.distSquare; + var mathPow = Math.pow; + var mathSqrt = Math.sqrt; + + var EPSILON = 1e-8; + var EPSILON_NUMERIC = 1e-4; + + var THREE_SQRT = mathSqrt(3); + var ONE_THIRD = 1 / 3; + + // 临时变量 + var _v0 = v2Create(); + var _v1 = v2Create(); + var _v2 = v2Create(); + // var _v3 = vec2.create(); + + function isAroundZero(val) { + return val > -EPSILON && val < EPSILON; + } + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + /** + * 计算三次贝塞尔值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @return {number} + */ + function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); + } + + /** + * 计算三次贝塞尔导数值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @return {number} + */ + function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * ( + ((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t + ); + } + + /** + * 计算三次贝塞尔方程根,使用盛金公式 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} val + * @param {Array.} roots + * @return {number} 有效根数目 + */ + function cubicRootAt(p0, p1, p2, p3, val, roots) { + // Evaluate roots of cubic functions + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + + var n = 0; + + if (isAroundZero(A) && isAroundZero(B)) { + if (isAroundZero(b)) { + roots[0] = 0; + } + else { + var t1 = -c / b; //t1, t2, t3, b is not zero + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = B * B - 4 * A * C; + + if (isAroundZero(disc)) { + var K = B / A; + var t1 = -b / a + K; // t1, a is not zero + var t2 = -K / 2; // t2, t3 + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -mathPow(-Y1, ONE_THIRD); + } + else { + Y1 = mathPow(Y1, ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -mathPow(-Y2, ONE_THIRD); + } + else { + Y2 = mathPow(Y2, ONE_THIRD); + } + var t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else { + var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = mathSqrt(A); + var tmp = Math.cos(theta); + + var t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a); + var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; + } + + /** + * 计算三次贝塞尔方程极限值的位置 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {Array.} extrema + * @return {number} 有效数目 + */ + function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <=1) { + extrema[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; + } + + /** + * 细分三次贝塞尔曲线 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @param {Array.} out + */ + function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + + var p0123 = (p123 - p012) * t + p012; + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + // Seg1 + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + + /** + * 投射点到三次贝塞尔曲线上,返回投射距离。 + * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {number} x + * @param {number} y + * @param {Array.} [out] 投射点 + * @return {number} + */ + function cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, out + ) { + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = cubicAt(x0, x1, x2, x3, _t); + _v1[1] = cubicAt(y0, y1, y2, y3, _t); + d1 = v2DistSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + // t - interval + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + + d1 = v2DistSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + // t + interval + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = v2DistSquare(_v2, _v0); + + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = cubicAt(x0, x1, x2, x3, t); + out[1] = cubicAt(y0, y1, y2, y3, t); + } + // console.log(interval, i); + return mathSqrt(d); + } + + /** + * 计算二次方贝塞尔值 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @return {number} + */ + function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + + /** + * 计算二次方贝塞尔导数值 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @return {number} + */ + function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + + /** + * 计算二次方贝塞尔方程根 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @param {Array.} roots + * @return {number} 有效根数目 + */ + function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + var t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; + } + + /** + * 计算二次贝塞尔方程极限值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @return {number} + */ + function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + // p1 is center of p0 and p2 + return 0.5; + } + else { + return (p0 - p1) / divider; + } + } + + /** + * 细分二次贝塞尔曲线 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @param {Array.} out + */ + function quadraticSubdivide(p0, p1, p2, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p012 = (p12 - p01) * t + p01; + + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + + // Seg1 + out[3] = p012; + out[4] = p12; + out[5] = p2; + } + + /** + * 投射点到二次贝塞尔曲线上,返回投射距离。 + * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x + * @param {number} y + * @param {Array.} out 投射点 + * @return {number} + */ + function quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, out + ) { + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = quadraticAt(x0, x1, x2, _t); + _v1[1] = quadraticAt(y0, y1, y2, _t); + var d1 = v2DistSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + // t - interval + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + + var d1 = v2DistSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + // t + interval + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = v2DistSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = quadraticAt(x0, x1, x2, t); + out[1] = quadraticAt(y0, y1, y2, t); + } + // console.log(interval, i); + return mathSqrt(d); + } + + module.exports = { + + cubicAt: cubicAt, + + cubicDerivativeAt: cubicDerivativeAt, + + cubicRootAt: cubicRootAt, + + cubicExtrema: cubicExtrema, + + cubicSubdivide: cubicSubdivide, + + cubicProjectPoint: cubicProjectPoint, + + quadraticAt: quadraticAt, + + quadraticDerivativeAt: quadraticDerivativeAt, + + quadraticRootAt: quadraticRootAt, + + quadraticExtremum: quadraticExtremum, + + quadraticSubdivide: quadraticSubdivide, + + quadraticProjectPoint: quadraticProjectPoint + }; + + +/***/ }, +/* 50 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @author Yi Shen(https://github.com/pissang) + */ + + + var vec2 = __webpack_require__(16); + var curve = __webpack_require__(49); + + var bbox = {}; + var mathMin = Math.min; + var mathMax = Math.max; + var mathSin = Math.sin; + var mathCos = Math.cos; + + var start = vec2.create(); + var end = vec2.create(); + var extremity = vec2.create(); + + var PI2 = Math.PI * 2; + /** + * 从顶点数组中计算出最小包围盒,写入`min`和`max`中 + * @module zrender/core/bbox + * @param {Array} points 顶点数组 + * @param {number} min + * @param {number} max + */ + bbox.fromPoints = function(points, min, max) { + if (points.length === 0) { + return; + } + var p = points[0]; + var left = p[0]; + var right = p[0]; + var top = p[1]; + var bottom = p[1]; + var i; + + for (i = 1; i < points.length; i++) { + p = points[i]; + left = mathMin(left, p[0]); + right = mathMax(right, p[0]); + top = mathMin(top, p[1]); + bottom = mathMax(bottom, p[1]); + } + + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + }; + + /** + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromLine = function (x0, y0, x1, y1, min, max) { + min[0] = mathMin(x0, x1); + min[1] = mathMin(y0, y1); + max[0] = mathMax(x0, x1); + max[1] = mathMax(y0, y1); + }; + + var xDim = []; + var yDim = []; + /** + * 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒,写入`min`和`max`中 + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromCubic = function( + x0, y0, x1, y1, x2, y2, x3, y3, min, max + ) { + var cubicExtrema = curve.cubicExtrema; + var cubicAt = curve.cubicAt; + var i; + var n = cubicExtrema(x0, x1, x2, x3, xDim); + min[0] = Infinity; + min[1] = Infinity; + max[0] = -Infinity; + max[1] = -Infinity; + + for (i = 0; i < n; i++) { + var x = cubicAt(x0, x1, x2, x3, xDim[i]); + min[0] = mathMin(x, min[0]); + max[0] = mathMax(x, max[0]); + } + n = cubicExtrema(y0, y1, y2, y3, yDim); + for (i = 0; i < n; i++) { + var y = cubicAt(y0, y1, y2, y3, yDim[i]); + min[1] = mathMin(y, min[1]); + max[1] = mathMax(y, max[1]); + } + + min[0] = mathMin(x0, min[0]); + max[0] = mathMax(x0, max[0]); + min[0] = mathMin(x3, min[0]); + max[0] = mathMax(x3, max[0]); + + min[1] = mathMin(y0, min[1]); + max[1] = mathMax(y0, max[1]); + min[1] = mathMin(y3, min[1]); + max[1] = mathMax(y3, max[1]); + }; + + /** + * 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒,写入`min`和`max`中 + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromQuadratic = function(x0, y0, x1, y1, x2, y2, min, max) { + var quadraticExtremum = curve.quadraticExtremum; + var quadraticAt = curve.quadraticAt; + // Find extremities, where derivative in x dim or y dim is zero + var tx = + mathMax( + mathMin(quadraticExtremum(x0, x1, x2), 1), 0 + ); + var ty = + mathMax( + mathMin(quadraticExtremum(y0, y1, y2), 1), 0 + ); + + var x = quadraticAt(x0, x1, x2, tx); + var y = quadraticAt(y0, y1, y2, ty); + + min[0] = mathMin(x0, x2, x); + min[1] = mathMin(y0, y2, y); + max[0] = mathMax(x0, x2, x); + max[1] = mathMax(y0, y2, y); + }; + + /** + * 从圆弧中计算出最小包围盒,写入`min`和`max`中 + * @method + * @memberOf module:zrender/core/bbox + * @param {number} x + * @param {number} y + * @param {number} rx + * @param {number} ry + * @param {number} startAngle + * @param {number} endAngle + * @param {number} anticlockwise + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromArc = function ( + x, y, rx, ry, startAngle, endAngle, anticlockwise, min, max + ) { + var vec2Min = vec2.min; + var vec2Max = vec2.max; + + var diff = Math.abs(startAngle - endAngle); + + + if (diff % PI2 < 1e-4 && diff > 1e-4) { + // Is a circle + min[0] = x - rx; + min[1] = y - ry; + max[0] = x + rx; + max[1] = y + ry; + return; + } + + start[0] = mathCos(startAngle) * rx + x; + start[1] = mathSin(startAngle) * ry + y; + + end[0] = mathCos(endAngle) * rx + x; + end[1] = mathSin(endAngle) * ry + y; + + vec2Min(min, start, end); + vec2Max(max, start, end); + + // Thresh to [0, Math.PI * 2] + startAngle = startAngle % (PI2); + if (startAngle < 0) { + startAngle = startAngle + PI2; + } + endAngle = endAngle % (PI2); + if (endAngle < 0) { + endAngle = endAngle + PI2; + } + + if (startAngle > endAngle && !anticlockwise) { + endAngle += PI2; + } + else if (startAngle < endAngle && anticlockwise) { + startAngle += PI2; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + + // var number = 0; + // var step = (anticlockwise ? -Math.PI : Math.PI) / 2; + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = mathCos(angle) * rx + x; + extremity[1] = mathSin(angle) * ry + y; + + vec2Min(min, extremity, min); + vec2Max(max, extremity, max); + } + } + }; + + module.exports = bbox; + + + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var CMD = __webpack_require__(48).CMD; + var line = __webpack_require__(52); + var cubic = __webpack_require__(53); + var quadratic = __webpack_require__(54); + var arc = __webpack_require__(55); + var normalizeRadian = __webpack_require__(56).normalizeRadian; + var curve = __webpack_require__(49); + + var windingLine = __webpack_require__(57); + + var containStroke = line.containStroke; + + var PI2 = Math.PI * 2; + + var EPSILON = 1e-4; + + function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON; + } + + // 临时数组 + var roots = [-1, -1, -1]; + var extrema = [-1, -1]; + + function swapExtrema() { + var tmp = extrema[0]; + extrema[0] = extrema[1]; + extrema[1] = tmp; + } + + function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + // Quick reject + if ( + (y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3) + ) { + return 0; + } + var nRoots = curve.cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var w = 0; + var nExtrema = -1; + var y0_, y1_; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var x_ = curve.cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { // Quick reject + continue; + } + if (nExtrema < 0) { + nExtrema = curve.cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = curve.cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = curve.cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema == 2) { + // 分成三段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } + else if (t < extrema[1]) { + w += y1_ < y0_ ? 1 : -1; + } + else { + w += y3 < y1_ ? 1 : -1; + } + } + else { + // 分成两段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } + else { + w += y3 < y0_ ? 1 : -1; + } + } + } + return w; + } + } + + function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + // Quick reject + if ( + (y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2) + ) { + return 0; + } + var nRoots = curve.quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var t = curve.quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = curve.quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + var x_ = curve.quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { // Quick reject + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? 1 : -1; + } + else { + w += y2 < y_ ? 1 : -1; + } + } + return w; + } + else { + var x_ = curve.quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { // Quick reject + return 0; + } + return y2 < y0 ? 1 : -1; + } + } + } + + // TODO + // Arc 旋转 + function windingArc( + cx, cy, r, startAngle, endAngle, anticlockwise, x, y + ) { + y -= cy; + if (y > r || y < -r) { + return 0; + } + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + + var diff = Math.abs(startAngle - endAngle); + if (diff < 1e-4) { + return 0; + } + if (diff % PI2 < 1e-4) { + // Is a circle + startAngle = 0; + endAngle = PI2; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } else { + return 0; + } + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } + else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2; + } + + var w = 0; + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + var dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2 + angle; + } + if ( + (angle >= startAngle && angle <= endAngle) + || (angle + PI2 >= startAngle && angle + PI2 <= endAngle) + ) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; + } + + function containPath(data, lineWidth, isStroke, x, y) { + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + // Begin a new subpath + if (cmd === CMD.M && i > 1) { + // Close previous subpath + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + // 如果被任何一个 subpath 包含 + if (w !== 0) { + return true; + } + } + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = data[i]; + yi = data[i + 1]; + + x0 = xi; + y0 = yi; + } + + switch (cmd) { + case CMD.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD.L: + if (isStroke) { + if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + // NOTE 在第一个命令为 L, C, Q 的时候会计算出 NaN + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + if (isStroke) { + if (cubic.containStroke(xi, yi, + data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + lineWidth, x, y + )) { + return true; + } + } + else { + w += windingCubic( + xi, yi, + data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + x, y + ) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + if (isStroke) { + if (quadratic.containStroke(xi, yi, + data[i++], data[i++], data[i], data[i + 1], + lineWidth, x, y + )) { + return true; + } + } + else { + w += windingQuadratic( + xi, yi, + data[i++], data[i++], data[i], data[i + 1], + x, y + ) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + // TODO Arc 旋转 + var psi = data[i++]; + var anticlockwise = 1 - data[i++]; + var x1 = Math.cos(theta) * rx + cx; + var y1 = Math.sin(theta) * ry + cy; + // 不是直接使用 arc 命令 + if (i > 1) { + w += windingLine(xi, yi, x1, y1, x, y); + } + else { + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } + // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (arc.containStroke( + cx, cy, ry, theta, theta + dTheta, anticlockwise, + lineWidth, _x, y + )) { + return true; + } + } + else { + w += windingArc( + cx, cy, ry, theta, theta + dTheta, anticlockwise, + _x, y + ); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + var x1 = x0 + width; + var y1 = y0 + height; + if (isStroke) { + if (containStroke(x0, y0, x1, y0, lineWidth, x, y) + || containStroke(x1, y0, x1, y1, lineWidth, x, y) + || containStroke(x1, y1, x0, y1, lineWidth, x, y) + || containStroke(x0, y1, x1, y1, lineWidth, x, y) + ) { + return true; + } + } + else { + // FIXME Clockwise ? + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD.Z: + if (isStroke) { + if (containStroke( + xi, yi, x0, y0, lineWidth, x, y + )) { + return true; + } + } + else { + // Close a subpath + w += windingLine(xi, yi, x0, y0, x, y); + // 如果被任何一个 subpath 包含 + if (w !== 0) { + return true; + } + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; + } + + module.exports = { + contain: function (pathData, x, y) { + return containPath(pathData, 0, false, x, y); + }, + + containStroke: function (pathData, lineWidth, x, y) { + return containPath(pathData, lineWidth, true, x, y); + } + }; + + +/***/ }, +/* 52 */ +/***/ function(module, exports) { + + + module.exports = { + /** + * 线段包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function (x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l) + ) { + return false; + } + + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1) ; + } + else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; + } + }; + + +/***/ }, +/* 53 */ +/***/ function(module, exports, __webpack_require__) { + + + + var curve = __webpack_require__(49); + + module.exports = { + /** + * 三次贝塞尔曲线描边包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l) + ) { + return false; + } + var d = curve.cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, null + ); + return d <= _l / 2; + } + }; + + +/***/ }, +/* 54 */ +/***/ function(module, exports, __webpack_require__) { + + + + var curve = __webpack_require__(49); + + module.exports = { + /** + * 二次贝塞尔曲线描边包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function (x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l) + ) { + return false; + } + var d = curve.quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, null + ); + return d <= _l / 2; + } + }; + + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + + + + var normalizeRadian = __webpack_require__(56).normalizeRadian; + var PI2 = Math.PI * 2; + + module.exports = { + /** + * 圆弧描边包含判断 + * @param {number} cx + * @param {number} cy + * @param {number} r + * @param {number} startAngle + * @param {number} endAngle + * @param {boolean} anticlockwise + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {Boolean} + */ + containStroke: function ( + cx, cy, r, startAngle, endAngle, anticlockwise, + lineWidth, x, y + ) { + + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) { + // Is a circle + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2; + } + + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2 >= startAngle && angle + PI2 <= endAngle); + } + }; + + +/***/ }, +/* 56 */ +/***/ function(module, exports) { + + + + var PI2 = Math.PI * 2; + module.exports = { + normalizeRadian: function(angle) { + angle %= PI2; + if (angle < 0) { + angle += PI2; + } + return angle; + } + }; + + +/***/ }, +/* 57 */ +/***/ function(module, exports) { + + + module.exports = function windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + if (y1 === y0) { + return 0; + } + var dir = y1 < y0 ? 1 : -1; + var t = (y - y0) / (y1 - y0); + var x_ = t * (x1 - x0) + x0; + + return x_ > x ? dir : 0; + }; + + +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { + + + + var CMD = __webpack_require__(48).CMD; + var vec2 = __webpack_require__(16); + var v2ApplyTransform = vec2.applyTransform; + + var points = [[], [], []]; + var mathSqrt = Math.sqrt; + var mathAtan2 = Math.atan2; + function transformPath(path, m) { + var data = path.data; + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + + var M = CMD.M; + var C = CMD.C; + var L = CMD.L; + var R = CMD.R; + var A = CMD.A; + var Q = CMD.Q; + + for (i = 0, j = 0; i < data.length;) { + cmd = data[i++]; + j = i; + nPoint = 0; + + switch (cmd) { + case M: + nPoint = 1; + break; + case L: + nPoint = 1; + break; + case C: + nPoint = 3; + break; + case Q: + nPoint = 2; + break; + case A: + var x = m[4]; + var y = m[5]; + var sx = mathSqrt(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + // cx + data[i++] += x; + // cy + data[i++] += y; + // Scale rx and ry + // FIXME Assume psi is 0 here + data[i++] *= sx; + data[i++] *= sy; + + // Start angle + data[i++] += angle; + // end angle + data[i++] += angle; + // FIXME psi + i += 2; + j = i; + break; + case R: + // x0, y0 + p[0] = data[i++]; + p[1] = data[i++]; + v2ApplyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + // x1, y1 + p[0] += data[i++]; + p[1] += data[i++]; + v2ApplyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + + for (k = 0; k < nPoint; k++) { + var p = points[k]; + p[0] = data[i++]; + p[1] = data[i++]; + + v2ApplyTransform(p, p, m); + // Write back + data[j++] = p[0]; + data[j++] = p[1]; + } + } + } + + module.exports = transformPath; + + +/***/ }, +/* 59 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Image element + * @module zrender/graphic/Image + */ + + + + var Displayable = __webpack_require__(45); + var BoundingRect = __webpack_require__(15); + var zrUtil = __webpack_require__(3); + var roundRectHelper = __webpack_require__(60); + + var LRU = __webpack_require__(61); + var globalImageCache = new LRU(50); + /** + * @alias zrender/graphic/Image + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + function ZImage(opts) { + Displayable.call(this, opts); + } + + ZImage.prototype = { + + constructor: ZImage, + + type: 'image', + + brush: function (ctx) { + var style = this.style; + var src = style.image; + var image; + // style.image is a url string + if (typeof src === 'string') { + image = this._image; + } + // style.image is an HTMLImageElement or HTMLCanvasElement or Canvas + else { + image = src; + } + // FIXME Case create many images with src + if (!image && src) { + // Try get from global image cache + var cachedImgObj = globalImageCache.get(src); + if (!cachedImgObj) { + // Create a new image + image = new Image(); + image.onload = function () { + image.onload = null; + for (var i = 0; i < cachedImgObj.pending.length; i++) { + cachedImgObj.pending[i].dirty(); + } + }; + cachedImgObj = { + image: image, + pending: [this] + }; + image.src = src; + globalImageCache.put(src, cachedImgObj); + this._image = image; + return; + } + else { + image = cachedImgObj.image; + this._image = image; + // Image is not complete finish, add to pending list + if (!image.width || !image.height) { + cachedImgObj.pending.push(this); + return; + } + } + } + + if (image) { + // 图片已经加载完成 + // if (image.nodeName.toUpperCase() == 'IMG') { + // if (!image.complete) { + // return; + // } + // } + // Else is canvas + + var width = style.width || image.width; + var height = style.height || image.height; + var x = style.x || 0; + var y = style.y || 0; + // 图片加载失败 + if (!image.width || !image.height) { + return; + } + + ctx.save(); + + style.bind(ctx); + + // 设置transform + this.setTransform(ctx); + + if (style.r) { + // Border radius clipping + // FIXME + ctx.beginPath(); + roundRectHelper.buildPath(ctx, style); + ctx.clip(); + } + + if (style.sWidth && style.sHeight) { + var sx = style.sx || 0; + var sy = style.sy || 0; + ctx.drawImage( + image, + sx, sy, style.sWidth, style.sHeight, + x, y, width, height + ); + } + else if (style.sx && style.sy) { + var sx = style.sx; + var sy = style.sy; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage( + image, + sx, sy, sWidth, sHeight, + x, y, width, height + ); + } + else { + ctx.drawImage(image, x, y, width, height); + } + + // 如果没设置宽和高的话自动根据图片宽高设置 + if (style.width == null) { + style.width = width; + } + if (style.height == null) { + style.height = height; + } + + // Draw rect text + if (style.text != null) { + this.drawRectText(ctx, this.getBoundingRect()); + } + + ctx.restore(); + } + }, + + getBoundingRect: function () { + var style = this.style; + if (! this._rect) { + this._rect = new BoundingRect( + style.x || 0, style.y || 0, style.width || 0, style.height || 0 + ); + } + return this._rect; + } + }; + + zrUtil.inherits(ZImage, Displayable); + + module.exports = ZImage; + + +/***/ }, +/* 60 */ +/***/ function(module, exports) { + + + + module.exports = { + buildPath: function (ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + var r = shape.r; + var r1; + var r2; + var r3; + var r4; + + // Convert width and height to positive for better borderRadius + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } + else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } + else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } + else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } + else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } + else { + r1 = r2 = r3 = r4 = 0; + } + + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.quadraticCurveTo( + x + width, y, x + width, y + r2 + ); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.quadraticCurveTo( + x + width, y + height, x + width - r3, y + height + ); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.quadraticCurveTo( + x, y + height, x, y + height - r4 + ); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.quadraticCurveTo(x, y, x + r1, y); + } + }; + + +/***/ }, +/* 61 */ +/***/ function(module, exports) { + + // Simple LRU cache use doubly linked list + // @module zrender/core/LRU + + + /** + * Simple double linked list. Compared with array, it has O(1) remove operation. + * @constructor + */ + var LinkedList = function() { + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.head = null; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.tail = null; + + this._len = 0; + }; + + var linkedListProto = LinkedList.prototype; + /** + * Insert a new value at the tail + * @param {} val + * @return {module:zrender/core/LRU~Entry} + */ + linkedListProto.insert = function(val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; + }; + + /** + * Insert an entry at the tail + * @param {module:zrender/core/LRU~Entry} entry + */ + linkedListProto.insertEntry = function(entry) { + if (!this.head) { + this.head = this.tail = entry; + } + else { + this.tail.next = entry; + entry.prev = this.tail; + this.tail = entry; + } + this._len++; + }; + + /** + * Remove entry. + * @param {module:zrender/core/LRU~Entry} entry + */ + linkedListProto.remove = function(entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } + else { + // Is head + this.head = next; + } + if (next) { + next.prev = prev; + } + else { + // Is tail + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; + }; + + /** + * @return {number} + */ + linkedListProto.len = function() { + return this._len; + }; + + /** + * @constructor + * @param {} val + */ + var Entry = function(val) { + /** + * @type {} + */ + this.value = val; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.next; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.prev; + }; + + /** + * LRU Cache + * @constructor + * @alias module:zrender/core/LRU + */ + var LRU = function(maxSize) { + + this._list = new LinkedList(); + + this._map = {}; + + this._maxSize = maxSize || 10; + }; + + var LRUProto = LRU.prototype; + + /** + * @param {string} key + * @param {} value + */ + LRUProto.put = function(key, value) { + var list = this._list; + var map = this._map; + if (map[key] == null) { + var len = list.len(); + if (len >= this._maxSize && len > 0) { + // Remove the least recently used + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + } + + var entry = list.insert(value); + entry.key = key; + map[key] = entry; + } + }; + + /** + * @param {string} key + * @return {} + */ + LRUProto.get = function(key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + // Put the latest used entry in the tail + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + + return entry.value; + } + }; + + /** + * Clear the cache + */ + LRUProto.clear = function() { + this._list.clear(); + this._map = {}; + }; + + module.exports = LRU; + + +/***/ }, +/* 62 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Text element + * @module zrender/graphic/Text + * + * TODO Wrapping + */ + + + + var Displayable = __webpack_require__(45); + var zrUtil = __webpack_require__(3); + var textContain = __webpack_require__(14); + + /** + * @alias zrender/graphic/Text + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + var Text = function (opts) { + Displayable.call(this, opts); + }; + + Text.prototype = { + + constructor: Text, + + type: 'text', + + brush: function (ctx) { + var style = this.style; + var x = style.x || 0; + var y = style.y || 0; + // Convert to string + var text = style.text; + var textFill = style.fill; + var textStroke = style.stroke; + + // Convert to string + text != null && (text += ''); + + if (text) { + ctx.save(); + + this.style.bind(ctx); + this.setTransform(ctx); + + textFill && (ctx.fillStyle = textFill); + textStroke && (ctx.strokeStyle = textStroke); + + ctx.font = style.textFont || style.font; + ctx.textAlign = style.textAlign; + + if (style.textVerticalAlign) { + var rect = textContain.getBoundingRect( + text, ctx.font, style.textAlign, 'top' + ); + // Ignore textBaseline + ctx.textBaseline = 'top'; + switch (style.textVerticalAlign) { + case 'middle': + y -= rect.height / 2; + break; + case 'bottom': + y -= rect.height; + break; + // 'top' + } + } + else { + ctx.textBaseline = style.textBaseline; + } + var lineHeight = textContain.measureText('国', ctx.font).width; + + var textLines = text.split('\n'); + for (var i = 0; i < textLines.length; i++) { + textFill && ctx.fillText(textLines[i], x, y); + textStroke && ctx.strokeText(textLines[i], x, y); + y += lineHeight; + } + + ctx.restore(); + } + }, + + getBoundingRect: function () { + if (!this._rect) { + var style = this.style; + var textVerticalAlign = style.textVerticalAlign; + var rect = textContain.getBoundingRect( + style.text + '', style.textFont || style.font, style.textAlign, + textVerticalAlign ? 'top' : style.textBaseline + ); + switch (textVerticalAlign) { + case 'middle': + rect.y -= rect.height / 2; + break; + case 'bottom': + rect.y -= rect.height; + break; + } + rect.x += style.x || 0; + rect.y += style.y || 0; + this._rect = rect; + } + return this._rect; + } + }; + + zrUtil.inherits(Text, Displayable); + + module.exports = Text; + + +/***/ }, +/* 63 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 圆形 + * @module zrender/shape/Circle + */ + + + + module.exports = __webpack_require__(44).extend({ + + type: 'circle', + + shape: { + cx: 0, + cy: 0, + r: 0 + }, + + buildPath : function (ctx, shape) { + // Better stroking in ShapeBundle + ctx.moveTo(shape.cx + shape.r, shape.cy); + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2, true); + return; + } + }); + + + +/***/ }, +/* 64 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 扇形 + * @module zrender/graphic/shape/Sector + */ + + // FIXME clockwise seems wrong + + + module.exports = __webpack_require__(44).extend({ + + type: 'sector', + + shape: { + + cx: 0, + + cy: 0, + + r0: 0, + + r: 0, + + startAngle: 0, + + endAngle: Math.PI * 2, + + clockwise: true + }, + + buildPath: function (ctx, shape) { + + var x = shape.cx; + var y = shape.cy; + var r0 = Math.max(shape.r0 || 0, 0); + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + + ctx.moveTo(unitX * r0 + x, unitY * r0 + y); + + ctx.lineTo(unitX * r + x, unitY * r + y); + + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + + ctx.lineTo( + Math.cos(endAngle) * r0 + x, + Math.sin(endAngle) * r0 + y + ); + + if (r0 !== 0) { + ctx.arc(x, y, r0, endAngle, startAngle, clockwise); + } + + ctx.closePath(); + } + }); + + + +/***/ }, +/* 65 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 圆环 + * @module zrender/graphic/shape/Ring + */ + + + module.exports = __webpack_require__(44).extend({ + + type: 'ring', + + shape: { + cx: 0, + cy: 0, + r: 0, + r0: 0 + }, + + buildPath: function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var PI2 = Math.PI * 2; + ctx.moveTo(x + shape.r, y); + ctx.arc(x, y, shape.r, 0, PI2, false); + ctx.moveTo(x + shape.r0, y); + ctx.arc(x, y, shape.r0, 0, PI2, true); + } + }); + + + +/***/ }, +/* 66 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 多边形 + * @module zrender/shape/Polygon + */ + + + var polyHelper = __webpack_require__(67); + + module.exports = __webpack_require__(44).extend({ + + type: 'polygon', + + shape: { + points: null, + + smooth: false, + + smoothConstraint: null + }, + + buildPath: function (ctx, shape) { + polyHelper.buildPath(ctx, shape, true); + } + }); + + +/***/ }, +/* 67 */ +/***/ function(module, exports, __webpack_require__) { + + + + var smoothSpline = __webpack_require__(68); + var smoothBezier = __webpack_require__(69); + + module.exports = { + buildPath: function (ctx, shape, closePath) { + var points = shape.points; + var smooth = shape.smooth; + if (points && points.length >= 2) { + if (smooth && smooth !== 'spline') { + var controlPoints = smoothBezier( + points, smooth, closePath, shape.smoothConstraint + ); + + ctx.moveTo(points[0][0], points[0][1]); + var len = points.length; + for (var i = 0; i < (closePath ? len : len - 1); i++) { + var cp1 = controlPoints[i * 2]; + var cp2 = controlPoints[i * 2 + 1]; + var p = points[(i + 1) % len]; + ctx.bezierCurveTo( + cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1] + ); + } + } + else { + if (smooth === 'spline') { + points = smoothSpline(points, closePath); + } + + ctx.moveTo(points[0][0], points[0][1]); + for (var i = 1, l = points.length; i < l; i++) { + ctx.lineTo(points[i][0], points[i][1]); + } + } + + closePath && ctx.closePath(); + } + } + }; + + +/***/ }, +/* 68 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Catmull-Rom spline 插值折线 + * @module zrender/shape/util/smoothSpline + * @author pissang (https://www.github.com/pissang) + * Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + */ + + var vec2 = __webpack_require__(16); + + /** + * @inner + */ + function interpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; + } + + /** + * @alias module:zrender/shape/util/smoothSpline + * @param {Array} points 线段顶点数组 + * @param {boolean} isLoop + * @return {Array} + */ + module.exports = function (points, isLoop) { + var len = points.length; + var ret = []; + + var distance = 0; + for (var i = 1; i < len; i++) { + distance += vec2.distance(points[i - 1], points[i]); + } + + var segs = distance / 2; + segs = segs < len ? len : segs; + for (var i = 0; i < segs; i++) { + var pos = i / (segs - 1) * (isLoop ? len : len - 1); + var idx = Math.floor(pos); + + var w = pos - idx; + + var p0; + var p1 = points[idx % len]; + var p2; + var p3; + if (!isLoop) { + p0 = points[idx === 0 ? idx : idx - 1]; + p2 = points[idx > len - 2 ? len - 1 : idx + 1]; + p3 = points[idx > len - 3 ? len - 1 : idx + 2]; + } + else { + p0 = points[(idx - 1 + len) % len]; + p2 = points[(idx + 1) % len]; + p3 = points[(idx + 2) % len]; + } + + var w2 = w * w; + var w3 = w * w2; + + ret.push([ + interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3), + interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3) + ]); + } + return ret; + }; + + + +/***/ }, +/* 69 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 贝塞尔平滑曲线 + * @module zrender/shape/util/smoothBezier + * @author pissang (https://www.github.com/pissang) + * Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + */ + + + var vec2 = __webpack_require__(16); + var v2Min = vec2.min; + var v2Max = vec2.max; + var v2Scale = vec2.scale; + var v2Distance = vec2.distance; + var v2Add = vec2.add; + + /** + * 贝塞尔平滑曲线 + * @alias module:zrender/shape/util/smoothBezier + * @param {Array} points 线段顶点数组 + * @param {number} smooth 平滑等级, 0-1 + * @param {boolean} isLoop + * @param {Array} constraint 将计算出来的控制点约束在一个包围盒内 + * 比如 [[0, 0], [100, 100]], 这个包围盒会与 + * 整个折线的包围盒做一个并集用来约束控制点。 + * @param {Array} 计算出来的控制点数组 + */ + module.exports = function (points, smooth, isLoop, constraint) { + var cps = []; + + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + + var min, max; + if (constraint) { + min = [Infinity, Infinity]; + max = [-Infinity, -Infinity]; + for (var i = 0, len = points.length; i < len; i++) { + v2Min(min, min, points[i]); + v2Max(max, max, points[i]); + } + // 与指定的包围盒做并集 + v2Min(min, min, constraint[0]); + v2Max(max, max, constraint[1]); + } + + for (var i = 0, len = points.length; i < len; i++) { + var point = points[i]; + + if (isLoop) { + prevPoint = points[i ? i - 1 : len - 1]; + nextPoint = points[(i + 1) % len]; + } + else { + if (i === 0 || i === len - 1) { + cps.push(vec2.clone(points[i])); + continue; + } + else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + + vec2.sub(v, nextPoint, prevPoint); + + // use degree to scale the handle length + v2Scale(v, v, smooth); + + var d0 = v2Distance(point, prevPoint); + var d1 = v2Distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + + v2Scale(v1, v, -d0); + v2Scale(v2, v, d1); + var cp0 = v2Add([], point, v1); + var cp1 = v2Add([], point, v2); + if (constraint) { + v2Max(cp0, cp0, min); + v2Min(cp0, cp0, max); + v2Max(cp1, cp1, min); + v2Min(cp1, cp1, max); + } + cps.push(cp0); + cps.push(cp1); + } + + if (isLoop) { + cps.push(cps.shift()); + } + + return cps; + }; + + + +/***/ }, +/* 70 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/graphic/shape/Polyline + */ + + + var polyHelper = __webpack_require__(67); + + module.exports = __webpack_require__(44).extend({ + + type: 'polyline', + + shape: { + points: null, + + smooth: false, + + smoothConstraint: null + }, + + style: { + stroke: '#000', + + fill: null + }, + + buildPath: function (ctx, shape) { + polyHelper.buildPath(ctx, shape, false); + } + }); + + +/***/ }, +/* 71 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 矩形 + * @module zrender/graphic/shape/Rect + */ + + + var roundRectHelper = __webpack_require__(60); + + module.exports = __webpack_require__(44).extend({ + + type: 'rect', + + shape: { + // 左上、右上、右下、左下角的半径依次为r1、r2、r3、r4 + // r缩写为1 相当于 [1, 1, 1, 1] + // r缩写为[1] 相当于 [1, 1, 1, 1] + // r缩写为[1, 2] 相当于 [1, 2, 1, 2] + // r缩写为[1, 2, 3] 相当于 [1, 2, 3, 2] + r: 0, + + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + if (!shape.r) { + ctx.rect(x, y, width, height); + } + else { + roundRectHelper.buildPath(ctx, shape); + } + ctx.closePath(); + return; + } + }); + + + +/***/ }, +/* 72 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 直线 + * @module zrender/graphic/shape/Line + */ + + module.exports = __webpack_require__(44).extend({ + + type: 'line', + + shape: { + // Start point + x1: 0, + y1: 0, + // End point + x2: 0, + y2: 0, + + percent: 1 + }, + + style: { + stroke: '#000', + fill: null + }, + + buildPath: function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var percent = shape.percent; + + if (percent === 0) { + return; + } + + ctx.moveTo(x1, y1); + + if (percent < 1) { + x2 = x1 * (1 - percent) + x2 * percent; + y2 = y1 * (1 - percent) + y2 * percent; + } + ctx.lineTo(x2, y2); + }, + + /** + * Get point at percent + * @param {number} percent + * @return {Array.} + */ + pointAt: function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + } + }); + + + +/***/ }, +/* 73 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 贝塞尔曲线 + * @module zrender/shape/BezierCurve + */ + + + var curveTool = __webpack_require__(49); + var quadraticSubdivide = curveTool.quadraticSubdivide; + var cubicSubdivide = curveTool.cubicSubdivide; + var quadraticAt = curveTool.quadraticAt; + var cubicAt = curveTool.cubicAt; + + var out = []; + module.exports = __webpack_require__(44).extend({ + + type: 'bezier-curve', + + shape: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + cpx1: 0, + cpy1: 0, + // cpx2: 0, + // cpy2: 0 + + // Curve show percent, for animating + percent: 1 + }, + + style: { + stroke: '#000', + fill: null + }, + + buildPath: function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var cpx1 = shape.cpx1; + var cpy1 = shape.cpy1; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + var percent = shape.percent; + if (percent === 0) { + return; + } + + ctx.moveTo(x1, y1); + + if (cpx2 == null || cpy2 == null) { + if (percent < 1) { + quadraticSubdivide( + x1, cpx1, x2, percent, out + ); + cpx1 = out[1]; + x2 = out[2]; + quadraticSubdivide( + y1, cpy1, y2, percent, out + ); + cpy1 = out[1]; + y2 = out[2]; + } + + ctx.quadraticCurveTo( + cpx1, cpy1, + x2, y2 + ); + } + else { + if (percent < 1) { + cubicSubdivide( + x1, cpx1, cpx2, x2, percent, out + ); + cpx1 = out[1]; + cpx2 = out[2]; + x2 = out[3]; + cubicSubdivide( + y1, cpy1, cpy2, y2, percent, out + ); + cpy1 = out[1]; + cpy2 = out[2]; + y2 = out[3]; + } + ctx.bezierCurveTo( + cpx1, cpy1, + cpx2, cpy2, + x2, y2 + ); + } + }, + + /** + * Get point at percent + * @param {number} percent + * @return {Array.} + */ + pointAt: function (p) { + var shape = this.shape; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 === null || cpy2 === null) { + return [ + quadraticAt(shape.x1, shape.cpx1, shape.x2, p), + quadraticAt(shape.y1, shape.cpy1, shape.y2, p) + ]; + } + else { + return [ + cubicAt(shape.x1, shape.cpx1, shape.cpx1, shape.x2, p), + cubicAt(shape.y1, shape.cpy1, shape.cpy1, shape.y2, p) + ]; + } + } + }); + + + +/***/ }, +/* 74 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 圆弧 + * @module zrender/graphic/shape/Arc + */ + + + module.exports = __webpack_require__(44).extend({ + + type: 'arc', + + shape: { + + cx: 0, + + cy: 0, + + r: 0, + + startAngle: 0, + + endAngle: Math.PI * 2, + + clockwise: true + }, + + style: { + + stroke: '#000', + + fill: null + }, + + buildPath: function (ctx, shape) { + + var x = shape.cx; + var y = shape.cy; + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + + ctx.moveTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + } + }); + + +/***/ }, +/* 75 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var Gradient = __webpack_require__(4); + + /** + * x, y, x2, y2 are all percent from 0 to 1 + * @param {number} [x=0] + * @param {number} [y=0] + * @param {number} [x2=1] + * @param {number} [y2=0] + * @param {Array.} colorStops + */ + var LinearGradient = function (x, y, x2, y2, colorStops) { + this.x = x == null ? 0 : x; + + this.y = y == null ? 0 : y; + + this.x2 = x2 == null ? 1 : x2; + + this.y2 = y2 == null ? 0 : y2; + + Gradient.call(this, colorStops); + }; + + LinearGradient.prototype = { + + constructor: LinearGradient, + + type: 'linear', + + updateCanvasGradient: function (shape, ctx) { + var rect = shape.getBoundingRect(); + // var size = + var x = this.x * rect.width + rect.x; + var x2 = this.x2 * rect.width + rect.x; + var y = this.y * rect.height + rect.y; + var y2 = this.y2 * rect.height + rect.y; + + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + + var colorStops = this.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop( + colorStops[i].offset, colorStops[i].color + ); + } + + this.canvasGradient = canvasGradient; + } + + }; + + zrUtil.inherits(LinearGradient, Gradient); + + module.exports = LinearGradient; + + +/***/ }, +/* 76 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var Gradient = __webpack_require__(4); + + /** + * x, y, r are all percent from 0 to 1 + * @param {number} [x=0.5] + * @param {number} [y=0.5] + * @param {number} [r=0.5] + * @param {Array.} [colorStops] + */ + var RadialGradient = function (x, y, r, colorStops) { + this.x = x == null ? 0.5 : x; + + this.y = y == null ? 0.5 : y; + + this.r = r == null ? 0.5 : r; + + Gradient.call(this, colorStops); + }; + + RadialGradient.prototype = { + + constructor: RadialGradient, + + type: 'radial', + + updateCanvasGradient: function (shape, ctx) { + var rect = shape.getBoundingRect(); + + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + // var max = Math.max(width, height); + + var x = this.x * width + rect.x; + var y = this.y * height + rect.y; + var r = this.r * min; + + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + + var colorStops = this.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop( + colorStops[i].offset, colorStops[i].color + ); + } + + this.canvasGradient = canvasGradient; + } + }; + + zrUtil.inherits(RadialGradient, Gradient); + + module.exports = RadialGradient; + + +/***/ }, +/* 77 */ +/***/ function(module, exports, __webpack_require__) { + + /*! + * ZRender, a high performance 2d drawing library. + * + * Copyright (c) 2013, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt + */ + // Global defines + + var guid = __webpack_require__(31); + var env = __webpack_require__(78); + + var Handler = __webpack_require__(79); + var Storage = __webpack_require__(83); + var Animation = __webpack_require__(84); + + var useVML = !env.canvasSupported; + + var painterCtors = { + canvas: __webpack_require__(85) + }; + + var instances = {}; // ZRender实例map索引 + + var zrender = {}; + /** + * @type {string} + */ + zrender.version = '3.0.7'; + + /** + * Initializing a zrender instance + * @param {HTMLElement} dom + * @param {Object} opts + * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg' + * @param {number} [opts.devicePixelRatio] + * @return {module:zrender/ZRender} + */ + zrender.init = function(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances[zr.id] = zr; + return zr; + }; + + /** + * Dispose zrender instance + * @param {module:zrender/ZRender} zr + */ + zrender.dispose = function (zr) { + if (zr) { + zr.dispose(); + } + else { + for (var key in instances) { + instances[key].dispose(); + } + instances = {}; + } + + return zrender; + }; + + /** + * Get zrender instance by id + * @param {string} id zrender instance id + * @return {module:zrender/ZRender} + */ + zrender.getInstance = function (id) { + return instances[id]; + }; + + zrender.registerPainter = function (name, Ctor) { + painterCtors[name] = Ctor; + }; + + function delInstance(id) { + delete instances[id]; + } + + /** + * @module zrender/ZRender + */ + /** + * @constructor + * @alias module:zrender/ZRender + * @param {string} id + * @param {HTMLDomElement} dom + * @param {Object} opts + * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg' + * @param {number} [opts.devicePixelRatio] + */ + var ZRender = function(id, dom, opts) { + + opts = opts || {}; + + /** + * @type {HTMLDomElement} + */ + this.dom = dom; + + /** + * @type {string} + */ + this.id = id; + + var self = this; + var storage = new Storage(); + + var rendererType = opts.renderer; + if (useVML) { + if (!painterCtors.vml) { + throw new Error('You need to require \'zrender/vml/vml\' to support IE8'); + } + rendererType = 'vml'; + } + else if (!rendererType || !painterCtors[rendererType]) { + rendererType = 'canvas'; + } + var painter = new painterCtors[rendererType](dom, storage, opts); + + this.storage = storage; + this.painter = painter; + if (!env.node) { + this.handler = new Handler(painter.getViewportRoot(), storage, painter); + } + + /** + * @type {module:zrender/animation/Animation} + */ + this.animation = new Animation({ + stage: { + update: function () { + if (self._needsRefresh) { + self.refreshImmediately(); + } + } + } + }); + this.animation.start(); + + /** + * @type {boolean} + * @private + */ + this._needsRefresh; + + // 修改 storage.delFromMap, 每次删除元素之前删除动画 + // FIXME 有点ugly + var oldDelFromMap = storage.delFromMap; + var oldAddToMap = storage.addToMap; + + storage.delFromMap = function (elId) { + var el = storage.get(elId); + + oldDelFromMap.call(storage, elId); + + el && el.removeSelfFromZr(self); + }; + + storage.addToMap = function (el) { + oldAddToMap.call(storage, el); + + el.addSelfToZr(self); + }; + }; + + ZRender.prototype = { + + constructor: ZRender, + /** + * 获取实例唯一标识 + * @return {string} + */ + getId: function () { + return this.id; + }, + + /** + * 添加元素 + * @param {string|module:zrender/Element} el + */ + add: function (el) { + this.storage.addRoot(el); + this._needsRefresh = true; + }, + + /** + * 删除元素 + * @param {string|module:zrender/Element} el + */ + remove: function (el) { + this.storage.delRoot(el); + this._needsRefresh = true; + }, + + /** + * Change configuration of layer + * @param {string} zLevel + * @param {Object} config + * @param {string} [config.clearColor=0] Clear color + * @param {string} [config.motionBlur=false] If enable motion blur + * @param {number} [config.lastFrameAlpha=0.7] Motion blur factor. Larger value cause longer trailer + */ + configLayer: function (zLevel, config) { + this.painter.configLayer(zLevel, config); + this._needsRefresh = true; + }, + + /** + * Repaint the canvas immediately + */ + refreshImmediately: function () { + // Clear needsRefresh ahead to avoid something wrong happens in refresh + // Or it will cause zrender refreshes again and again. + this._needsRefresh = false; + this.painter.refresh(); + /** + * Avoid trigger zr.refresh in Element#beforeUpdate hook + */ + this._needsRefresh = false; + }, + + /** + * Mark and repaint the canvas in the next frame of browser + */ + refresh: function() { + this._needsRefresh = true; + }, + + /** + * Resize the canvas. + * Should be invoked when container size is changed + */ + resize: function() { + this.painter.resize(); + this.handler && this.handler.resize(); + }, + + /** + * Stop and clear all animation immediately + */ + clearAnimation: function () { + this.animation.clear(); + }, + + /** + * Get container width + */ + getWidth: function() { + return this.painter.getWidth(); + }, + + /** + * Get container height + */ + getHeight: function() { + return this.painter.getHeight(); + }, + + /** + * Export the canvas as Base64 URL + * @param {string} type + * @param {string} [backgroundColor='#fff'] + * @return {string} Base64 URL + */ + toDataURL: function(type, backgroundColor, args) { + return this.painter.toDataURL(type, backgroundColor, args); + }, + + /** + * Converting a path to image. + * It has much better performance of drawing image rather than drawing a vector path. + * @param {module:zrender/graphic/Path} e + * @param {number} width + * @param {number} height + */ + pathToImage: function(e, width, height) { + var id = guid(); + return this.painter.pathToImage(id, e, width, height); + }, + + /** + * Set default cursor + * @param {string} cursorStyle 例如 crosshair + */ + setDefaultCursorStyle: function (cursorStyle) { + this.handler.setDefaultCursorStyle(cursorStyle); + }, + + /** + * Bind event + * + * @param {string} eventName Event name + * @param {Function} eventHandler Handler function + * @param {Object} [context] Context object + */ + on: function(eventName, eventHandler, context) { + this.handler && this.handler.on(eventName, eventHandler, context); + }, + + /** + * Unbind event + * @param {string} eventName Event name + * @param {Function} [eventHandler] Handler function + */ + off: function(eventName, eventHandler) { + this.handler && this.handler.off(eventName, eventHandler); + }, + + /** + * Trigger event manually + * + * @param {string} eventName Event name + * @param {event=} event Event object + */ + trigger: function (eventName, event) { + this.handler && this.handler.trigger(eventName, event); + }, + + + /** + * Clear all objects and the canvas. + */ + clear: function () { + this.storage.delRoot(); + this.painter.clear(); + }, + + /** + * Dispose self. + */ + dispose: function () { + this.animation.stop(); + + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler && this.handler.dispose(); + + this.animation = + this.storage = + this.painter = + this.handler = null; + + delInstance(this.id); + } + }; + + module.exports = zrender; + + + +/***/ }, +/* 78 */ +/***/ function(module, exports) { + + /** + * echarts设备环境识别 + * + * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 + * @author firede[firede@firede.us] + * @desc thanks zepto. + */ + + var env = {}; + if (typeof navigator === 'undefined') { + // In node + env = { + browser: {}, + os: {}, + node: true, + // Assume canvas is supported + canvasSupported: true + }; + } + else { + env = detect(navigator.userAgent); + } + + module.exports = env; + + // Zepto.js + // (c) 2010-2013 Thomas Fuchs + // Zepto.js may be freely distributed under the MIT license. + + function detect(ua) { + var os = {}; + var browser = {}; + var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/); + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); + var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/); + var touchpad = webos && ua.match(/TouchPad/); + var kindle = ua.match(/Kindle\/([\d.]+)/); + var silk = ua.match(/Silk\/([\d._]+)/); + var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); + var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/); + var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/); + var playbook = ua.match(/PlayBook/); + var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/); + var firefox = ua.match(/Firefox\/([\d.]+)/); + var safari = webkit && ua.match(/Mobile\//) && !chrome; + var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome; + var ie = ua.match(/MSIE\s([\d.]+)/) + // IE 11 Trident/7.0; rv:11.0 + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge\/([\d.]+)/); // IE 12 and 12+ + + // Todo: clean this up with a better OS/browser seperation: + // - discern (more) between multiple browsers on android + // - decide if kindle fire in silk mode is android or not + // - Firefox on Android doesn't specify the Android version + // - possibly devide in os, device and browser hashes + + if (browser.webkit = !!webkit) browser.version = webkit[1]; + + if (android) os.android = true, os.version = android[2]; + if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.'); + if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.'); + if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + if (webos) os.webos = true, os.version = webos[2]; + if (touchpad) os.touchpad = true; + if (blackberry) os.blackberry = true, os.version = blackberry[2]; + if (bb10) os.bb10 = true, os.version = bb10[2]; + if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2]; + if (playbook) browser.playbook = true; + if (kindle) os.kindle = true, os.version = kindle[1]; + if (silk) browser.silk = true, browser.version = silk[1]; + if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true; + if (chrome) browser.chrome = true, browser.version = chrome[1]; + if (firefox) browser.firefox = true, browser.version = firefox[1]; + if (ie) browser.ie = true, browser.version = ie[1]; + if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true; + if (webview) browser.webview = true; + if (ie) browser.ie = true, browser.version = ie[1]; + if (edge) browser.edge = true, browser.version = edge[1]; + + os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || + (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/))); + os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || blackberry || bb10 || + (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || + (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/)))); + + return { + browser: browser, + os: os, + node: false, + // 原生canvas支持,改极端点了 + // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9) + canvasSupported : document.createElement('canvas').getContext ? true : false, + // @see + // works on most browsers + // IE10/11 does not support touch event, and MS Edge supports them but not by + // default, so we dont check navigator.maxTouchPoints for them here. + touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge, + // . + pointerEventsSupported: 'onpointerdown' in window + // Firefox supports pointer but not by default, + // only MS browsers are reliable on pointer events currently. + && (browser.edge || (browser.ie && browser.version >= 10)) + }; + } + + +/***/ }, +/* 79 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Handler + * @module zrender/Handler + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + * pissang (shenyi.914@gmail.com) + */ + + + var env = __webpack_require__(78); + var eventTool = __webpack_require__(80); + var util = __webpack_require__(3); + var Draggable = __webpack_require__(81); + var GestureMgr = __webpack_require__(82); + + var Eventful = __webpack_require__(32); + + var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout' + ]; + !usePointerEvent() && mouseHandlerNames.push( + 'mouseup', 'mousedown', 'mousemove' + ); + + var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' + ]; + + var pointerHandlerNames = [ + 'pointerdown', 'pointerup', 'pointermove' + ]; + + var TOUCH_CLICK_DELAY = 300; + + // touch指尖错觉的尝试偏移量配置 + // var MOBILE_TOUCH_OFFSETS = [ + // { x: 10 }, + // { x: -20 }, + // { x: 10, y: 10 }, + // { y: -20 } + // ]; + + var addEventListener = eventTool.addEventListener; + var removeEventListener = eventTool.removeEventListener; + var normalizeEvent = eventTool.normalizeEvent; + + function makeEventPacket(eveType, target, event) { + return { + type: eveType, + event: event, + target: target, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta + }; + } + + var domHandlers = { + /** + * Mouse move handler + * @inner + * @param {Event} event + */ + mousemove: function (event) { + event = normalizeEvent(this.root, event); + + var x = event.zrX; + var y = event.zrY; + + var hovered = this.findHover(x, y, null); + var lastHovered = this._hovered; + + this._hovered = hovered; + + this.root.style.cursor = hovered ? hovered.cursor : this._defaultCursorStyle; + // Mouse out on previous hovered element + if (lastHovered && hovered !== lastHovered && lastHovered.__zr) { + this._dispatchProxy(lastHovered, 'mouseout', event); + } + + // Mouse moving on one element + this._dispatchProxy(hovered, 'mousemove', event); + + // Mouse over on a new element + if (hovered && hovered !== lastHovered) { + this._dispatchProxy(hovered, 'mouseover', event); + } + }, + + /** + * Mouse out handler + * @inner + * @param {Event} event + */ + mouseout: function (event) { + event = normalizeEvent(this.root, event); + + var element = event.toElement || event.relatedTarget; + if (element != this.root) { + while (element && element.nodeType != 9) { + // 忽略包含在root中的dom引起的mouseOut + if (element === this.root) { + return; + } + + element = element.parentNode; + } + } + + this._dispatchProxy(this._hovered, 'mouseout', event); + + this.trigger('globalout', { + event: event + }); + }, + + /** + * Touch开始响应函数 + * @inner + * @param {Event} event + */ + touchstart: function (event) { + // FIXME + // 移动端可能需要default行为,例如静态图表时。 + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + this._lastTouchMoment = new Date(); + + processGesture(this, event, 'start'); + + // 平板补充一次findHover + // this._mobileFindFixed(event); + // Trigger mousemove and mousedown + domHandlers.mousemove.call(this, event); + + domHandlers.mousedown.call(this, event); + + setTouchTimer(this); + }, + + /** + * Touch移动响应函数 + * @inner + * @param {Event} event + */ + touchmove: function (event) { + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + processGesture(this, event, 'change'); + + // Mouse move should always be triggered no matter whether + // there is gestrue event, because mouse move and pinch may + // be used at the same time. + domHandlers.mousemove.call(this, event); + + setTouchTimer(this); + }, + + /** + * Touch结束响应函数 + * @inner + * @param {Event} event + */ + touchend: function (event) { + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + processGesture(this, event, 'end'); + + domHandlers.mouseup.call(this, event); + + // click event should always be triggered no matter whether + // there is gestrue event. System click can not be prevented. + if (+new Date() - this._lastTouchMoment < TOUCH_CLICK_DELAY) { + // this._mobileFindFixed(event); + domHandlers.click.call(this, event); + } + + setTouchTimer(this); + } + }; + + // Common handlers + util.each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick'], function (name) { + domHandlers[name] = function (event) { + event = normalizeEvent(this.root, event); + // Find hover again to avoid click event is dispatched manually. Or click is triggered without mouseover + var hovered = this.findHover(event.zrX, event.zrY, null); + this._dispatchProxy(hovered, name, event); + }; + }); + + // Pointer event handlers + // util.each(['pointerdown', 'pointermove', 'pointerup'], function (name) { + // domHandlers[name] = function (event) { + // var mouseName = name.replace('pointer', 'mouse'); + // domHandlers[mouseName].call(this, event); + // }; + // }); + + function processGesture(zrHandler, event, stage) { + var gestureMgr = zrHandler._gestureMgr; + + stage === 'start' && gestureMgr.clear(); + + var gestureInfo = gestureMgr.recognize( + event, + zrHandler.findHover(event.zrX, event.zrY, null) + ); + + stage === 'end' && gestureMgr.clear(); + + if (gestureInfo) { + // eventTool.stop(event); + var type = gestureInfo.type; + event.gestureEvent = type; + + zrHandler._dispatchProxy(gestureInfo.target, type, gestureInfo.event); + } + } + + /** + * 为控制类实例初始化dom 事件处理函数 + * + * @inner + * @param {module:zrender/Handler} instance 控制类实例 + */ + function initDomHandler(instance) { + var handlerNames = touchHandlerNames.concat(pointerHandlerNames); + for (var i = 0; i < handlerNames.length; i++) { + var name = handlerNames[i]; + instance._handlers[name] = util.bind(domHandlers[name], instance); + } + + for (var i = 0; i < mouseHandlerNames.length; i++) { + var name = mouseHandlerNames[i]; + instance._handlers[name] = makeMouseHandler(domHandlers[name], instance); + } + + function makeMouseHandler(fn, instance) { + return function () { + if (instance._touching) { + return; + } + return fn.apply(instance, arguments); + }; + } + } + + /** + * @alias module:zrender/Handler + * @constructor + * @extends module:zrender/mixin/Eventful + * @param {HTMLElement} root Main HTML element for painting. + * @param {module:zrender/Storage} storage Storage instance. + * @param {module:zrender/Painter} painter Painter instance. + */ + var Handler = function(root, storage, painter) { + Eventful.call(this); + + this.root = root; + this.storage = storage; + this.painter = painter; + + /** + * @private + * @type {boolean} + */ + this._hovered; + + /** + * @private + * @type {Date} + */ + this._lastTouchMoment; + + /** + * @private + * @type {number} + */ + this._lastX; + + /** + * @private + * @type {number} + */ + this._lastY; + + /** + * @private + * @type {string} + */ + this._defaultCursorStyle = 'default'; + + /** + * @private + * @type {module:zrender/core/GestureMgr} + */ + this._gestureMgr = new GestureMgr(); + + /** + * @private + * @type {Array.} + */ + this._handlers = []; + + /** + * @private + * @type {boolean} + */ + this._touching = false; + + /** + * @private + * @type {number} + */ + this._touchTimer; + + initDomHandler(this); + + if (usePointerEvent()) { + mountHandlers(pointerHandlerNames, this); + } + else if (useTouchEvent()) { + mountHandlers(touchHandlerNames, this); + + // Handler of 'mouseout' event is needed in touch mode, which will be mounted below. + // addEventListener(root, 'mouseout', this._mouseoutHandler); + } + + // Considering some devices that both enable touch and mouse event (like MS Surface + // and lenovo X240, @see #2350), we make mouse event be always listened, otherwise + // mouse event can not be handle in those devices. + mountHandlers(mouseHandlerNames, this); + + Draggable.call(this); + + function mountHandlers(handlerNames, instance) { + util.each(handlerNames, function (name) { + addEventListener(root, eventNameFix(name), instance._handlers[name]); + }, instance); + } + }; + + Handler.prototype = { + + constructor: Handler, + + /** + * Resize + */ + resize: function (event) { + this._hovered = null; + }, + + /** + * Dispatch event + * @param {string} eventName + * @param {event=} eventArgs + */ + dispatch: function (eventName, eventArgs) { + var handler = this._handlers[eventName]; + handler && handler.call(this, eventArgs); + }, + + /** + * Dispose + */ + dispose: function () { + var root = this.root; + + var handlerNames = mouseHandlerNames.concat(touchHandlerNames); + + for (var i = 0; i < handlerNames.length; i++) { + var name = handlerNames[i]; + removeEventListener(root, eventNameFix(name), this._handlers[name]); + } + + this.root = + this.storage = + this.painter = null; + }, + + /** + * 设置默认的cursor style + * @param {string} cursorStyle 例如 crosshair + */ + setDefaultCursorStyle: function (cursorStyle) { + this._defaultCursorStyle = cursorStyle; + }, + + /** + * 事件分发代理 + * + * @private + * @param {Object} targetEl 目标图形元素 + * @param {string} eventName 事件名称 + * @param {Object} event 事件对象 + */ + _dispatchProxy: function (targetEl, eventName, event) { + var eventHandler = 'on' + eventName; + var eventPacket = makeEventPacket(eventName, targetEl, event); + + var el = targetEl; + + while (el) { + el[eventHandler] + && (eventPacket.cancelBubble = el[eventHandler].call(el, eventPacket)); + + el.trigger(eventName, eventPacket); + + el = el.parent; + + if (eventPacket.cancelBubble) { + break; + } + } + + if (!eventPacket.cancelBubble) { + // 冒泡到顶级 zrender 对象 + this.trigger(eventName, eventPacket); + // 分发事件到用户自定义层 + // 用户有可能在全局 click 事件中 dispose,所以需要判断下 painter 是否存在 + this.painter && this.painter.eachOtherLayer(function (layer) { + if (typeof(layer[eventHandler]) == 'function') { + layer[eventHandler].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + }, + + /** + * @private + * @param {number} x + * @param {number} y + * @param {module:zrender/graphic/Displayable} exclude + * @method + */ + findHover: function(x, y, exclude) { + var list = this.storage.getDisplayList(); + for (var i = list.length - 1; i >= 0 ; i--) { + if (!list[i].silent + && list[i] !== exclude + // getDisplayList may include ignored item in VML mode + && !list[i].ignore + && isHover(list[i], x, y)) { + return list[i]; + } + } + } + }; + + function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var p = displayable.parent; + while (p) { + if (p.clipPath && !p.clipPath.contain(x, y)) { + // Clipped by parents + return false; + } + p = p.parent; + } + return true; + } + + return false; + } + + /** + * Prevent mouse event from being dispatched after Touch Events action + * @see + * 1. Mobile browsers dispatch mouse events 300ms after touchend. + * 2. Chrome for Android dispatch mousedown for long-touch about 650ms + * Result: Blocking Mouse Events for 700ms. + */ + function setTouchTimer(instance) { + instance._touching = true; + clearTimeout(instance._touchTimer); + instance._touchTimer = setTimeout(function () { + instance._touching = false; + }, 700); + } + + /** + * Althought MS Surface support screen touch, IE10/11 do not support + * touch event and MS Edge supported them but not by default (but chrome + * and firefox do). Thus we use Pointer event on MS browsers to handle touch. + */ + function usePointerEvent() { + // TODO + // pointermove event dont trigger when using finger. + // We may figger it out latter. + return false; + // return env.pointerEventsSupported + // In no-touch device we dont use pointer evnets but just + // use mouse event for avoiding problems. + // && window.navigator.maxTouchPoints; + } + + function useTouchEvent() { + return env.touchEventsSupported; + } + + function eventNameFix(name) { + return (name === 'mousewheel' && env.browser.firefox) ? 'DOMMouseScroll' : name; + } + + util.mixin(Handler, Eventful); + util.mixin(Handler, Draggable); + + module.exports = Handler; + + +/***/ }, +/* 80 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 事件辅助类 + * @module zrender/core/event + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + + + var Eventful = __webpack_require__(32); + + var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener; + + function getBoundingClientRect(el) { + // BlackBerry 5, iOS 3 (original iPhone) don't have getBoundingRect + return el.getBoundingClientRect ? el.getBoundingClientRect() : { left: 0, top: 0}; + } + /** + * 如果存在第三方嵌入的一些dom触发的事件,或touch事件,需要转换一下事件坐标 + */ + function normalizeEvent(el, e) { + + e = e || window.event; + + if (e.zrX != null) { + return e; + } + + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + + if (!isTouch) { + var box = getBoundingClientRect(el); + e.zrX = e.clientX - box.left; + e.zrY = e.clientY - box.top; + e.zrDelta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3; + } + else { + var touch = eventType != 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + if (touch) { + var rBounding = getBoundingClientRect(el); + // touch事件坐标是全屏的~ + e.zrX = touch.clientX - rBounding.left; + e.zrY = touch.clientY - rBounding.top; + } + } + + return e; + } + + function addEventListener(el, name, handler) { + if (isDomLevel2) { + el.addEventListener(name, handler); + } + else { + el.attachEvent('on' + name, handler); + } + } + + function removeEventListener(el, name, handler) { + if (isDomLevel2) { + el.removeEventListener(name, handler); + } + else { + el.detachEvent('on' + name, handler); + } + } + + /** + * 停止冒泡和阻止默认行为 + * @memberOf module:zrender/core/event + * @method + * @param {Event} e : event对象 + */ + var stop = isDomLevel2 + ? function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + } + : function (e) { + e.returnValue = false; + e.cancelBubble = true; + }; + + module.exports = { + normalizeEvent: normalizeEvent, + addEventListener: addEventListener, + removeEventListener: removeEventListener, + + stop: stop, + // 做向上兼容 + Dispatcher: Eventful + }; + + + +/***/ }, +/* 81 */ +/***/ function(module, exports) { + + // TODO Draggable for group + // FIXME Draggable on element which has parent rotation or scale + + function Draggable() { + + this.on('mousedown', this._dragStart, this); + this.on('mousemove', this._drag, this); + this.on('mouseup', this._dragEnd, this); + this.on('globalout', this._dragEnd, this); + // this._dropTarget = null; + // this._draggingTarget = null; + + // this._x = 0; + // this._y = 0; + } + + Draggable.prototype = { + + constructor: Draggable, + + _dragStart: function (e) { + var draggingTarget = e.target; + if (draggingTarget && draggingTarget.draggable) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + + this._dispatchProxy(draggingTarget, 'dragstart', e.event); + } + }, + + _drag: function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + + var x = e.offsetX; + var y = e.offsetY; + + var dx = x - this._x; + var dy = y - this._y; + this._x = x; + this._y = y; + + draggingTarget.drift(dx, dy, e); + this._dispatchProxy(draggingTarget, 'drag', e.event); + + var dropTarget = this.findHover(x, y, draggingTarget); + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this._dispatchProxy(lastDropTarget, 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this._dispatchProxy(dropTarget, 'dragenter', e.event); + } + } + } + }, + + _dragEnd: function (e) { + var draggingTarget = this._draggingTarget; + + if (draggingTarget) { + draggingTarget.dragging = false; + } + + this._dispatchProxy(draggingTarget, 'dragend', e.event); + + if (this._dropTarget) { + this._dispatchProxy(this._dropTarget, 'drop', e.event); + } + + this._draggingTarget = null; + this._dropTarget = null; + } + + }; + + module.exports = Draggable; + + +/***/ }, +/* 82 */ +/***/ function(module, exports) { + + 'use strict'; + /** + * Only implements needed gestures for mobile. + */ + + + var GestureMgr = function () { + + /** + * @private + * @type {Array.} + */ + this._track = []; + }; + + GestureMgr.prototype = { + + constructor: GestureMgr, + + recognize: function (event, target) { + this._doTrack(event, target); + return this._recognize(event); + }, + + clear: function () { + this._track.length = 0; + return this; + }, + + _doTrack: function (event, target) { + var touches = event.touches; + + if (!touches) { + return; + } + + var trackItem = { + points: [], + touches: [], + target: target, + event: event + }; + + for (var i = 0, len = touches.length; i < len; i++) { + var touch = touches[i]; + trackItem.points.push([touch.clientX, touch.clientY]); + trackItem.touches.push(touch); + } + + this._track.push(trackItem); + }, + + _recognize: function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + } + }; + + function dist(pointPair) { + var dx = pointPair[1][0] - pointPair[0][0]; + var dy = pointPair[1][1] - pointPair[0][1]; + + return Math.sqrt(dx * dx + dy * dy); + } + + function center(pointPair) { + return [ + (pointPair[0][0] + pointPair[1][0]) / 2, + (pointPair[0][1] + pointPair[1][1]) / 2 + ]; + } + + var recognizers = { + + pinch: function (track, event) { + var trackLen = track.length; + + if (!trackLen) { + return; + } + + var pinchEnd = (track[trackLen - 1] || {}).points; + var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd; + + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1 + ) { + var pinchScale = dist(pinchEnd) / dist(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + + event.pinchScale = pinchScale; + + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + + return { + type: 'pinch', + target: track[0].target, + event: event + }; + } + } + + // Only pinch currently. + }; + + module.exports = GestureMgr; + + + +/***/ }, +/* 83 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Storage内容仓库模块 + * @module zrender/Storage + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * @author errorrik (errorrik@gmail.com) + * @author pissang (https://github.com/pissang/) + */ + + + var util = __webpack_require__(3); + + var Group = __webpack_require__(29); + + function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + if (a.z2 === b.z2) { + return a.__renderidx - b.__renderidx; + } + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; + } + /** + * 内容仓库 (M) + * @alias module:zrender/Storage + * @constructor + */ + var Storage = function () { + // 所有常规形状,id索引的map + this._elements = {}; + + this._roots = []; + + this._displayList = []; + + this._displayListLen = 0; + }; + + Storage.prototype = { + + constructor: Storage, + + /** + * 返回所有图形的绘制队列 + * @param {boolean} [update=false] 是否在返回前更新该数组 + * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组, 在 update 为 true 的时候有效 + * + * 详见{@link module:zrender/graphic/Displayable.prototype.updateDisplayList} + * @return {Array.} + */ + getDisplayList: function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + if (update) { + this.updateDisplayList(includeIgnore); + } + return this._displayList; + }, + + /** + * 更新图形的绘制队列。 + * 每次绘制前都会调用,该方法会先深度优先遍历整个树,更新所有Group和Shape的变换并且把所有可见的Shape保存到数组中, + * 最后根据绘制的优先级(zlevel > z > 插入顺序)排序得到绘制队列 + * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组 + */ + updateDisplayList: function (includeIgnore) { + this._displayListLen = 0; + var roots = this._roots; + var displayList = this._displayList; + for (var i = 0, len = roots.length; i < len; i++) { + this._updateAndAddDisplayable(roots[i], null, includeIgnore); + } + displayList.length = this._displayListLen; + + for (var i = 0, len = displayList.length; i < len; i++) { + displayList[i].__renderidx = i; + } + + displayList.sort(shapeCompareFunc); + }, + + _updateAndAddDisplayable: function (el, clipPaths, includeIgnore) { + + if (el.ignore && !includeIgnore) { + return; + } + + el.beforeUpdate(); + + el.update(); + + el.afterUpdate(); + + var clipPath = el.clipPath; + if (clipPath) { + // clipPath 的变换是基于 group 的变换 + clipPath.parent = el; + clipPath.updateTransform(); + + // FIXME 效率影响 + if (clipPaths) { + clipPaths = clipPaths.slice(); + clipPaths.push(clipPath); + } + else { + clipPaths = [clipPath]; + } + } + + if (el.type == 'group') { + var children = el._children; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + + // Force to mark as dirty if group is dirty + // FIXME __dirtyPath ? + child.__dirty = el.__dirty || child.__dirty; + + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + + // Mark group clean here + el.__dirty = false; + + } + else { + el.__clipPaths = clipPaths; + + this._displayList[this._displayListLen++] = el; + } + }, + + /** + * 添加图形(Shape)或者组(Group)到根节点 + * @param {module:zrender/Element} el + */ + addRoot: function (el) { + // Element has been added + if (this._elements[el.id]) { + return; + } + + if (el instanceof Group) { + el.addChildrenToStorage(this); + } + + this.addToMap(el); + this._roots.push(el); + }, + + /** + * 删除指定的图形(Shape)或者组(Group) + * @param {string|Array.} [elId] 如果为空清空整个Storage + */ + delRoot: function (elId) { + if (elId == null) { + // 不指定elId清空 + for (var i = 0; i < this._roots.length; i++) { + var root = this._roots[i]; + if (root instanceof Group) { + root.delChildrenFromStorage(this); + } + } + + this._elements = {}; + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + + return; + } + + if (elId instanceof Array) { + for (var i = 0, l = elId.length; i < l; i++) { + this.delRoot(elId[i]); + } + return; + } + + var el; + if (typeof(elId) == 'string') { + el = this._elements[elId]; + } + else { + el = elId; + } + + var idx = util.indexOf(this._roots, el); + if (idx >= 0) { + this.delFromMap(el.id); + this._roots.splice(idx, 1); + if (el instanceof Group) { + el.delChildrenFromStorage(this); + } + } + }, + + addToMap: function (el) { + if (el instanceof Group) { + el.__storage = this; + } + el.dirty(); + + this._elements[el.id] = el; + + return this; + }, + + get: function (elId) { + return this._elements[elId]; + }, + + delFromMap: function (elId) { + var elements = this._elements; + var el = elements[elId]; + if (el) { + delete elements[elId]; + if (el instanceof Group) { + el.__storage = null; + } + } + + return this; + }, + + /** + * 清空并且释放Storage + */ + dispose: function () { + this._elements = + this._renderList = + this._roots = null; + } + }; + + module.exports = Storage; + + + +/***/ }, +/* 84 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 动画主类, 调度和管理所有动画控制器 + * + * @module zrender/animation/Animation + * @author pissang(https://github.com/pissang) + */ + // TODO Additive animation + // http://iosoteric.com/additive-animations-animatewithduration-in-ios-8/ + // https://developer.apple.com/videos/wwdc2014/#236 + + + var util = __webpack_require__(3); + var Dispatcher = __webpack_require__(80).Dispatcher; + + var requestAnimationFrame = (typeof window !== 'undefined' && + (window.requestAnimationFrame + || window.msRequestAnimationFrame + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame)) + || function (func) { + setTimeout(func, 16); + }; + + var Animator = __webpack_require__(35); + /** + * @typedef {Object} IZRenderStage + * @property {Function} update + */ + + /** + * @alias module:zrender/animation/Animation + * @constructor + * @param {Object} [options] + * @param {Function} [options.onframe] + * @param {IZRenderStage} [options.stage] + * @example + * var animation = new Animation(); + * var obj = { + * x: 100, + * y: 100 + * }; + * animation.animate(node.position) + * .when(1000, { + * x: 500, + * y: 500 + * }) + * .when(2000, { + * x: 100, + * y: 100 + * }) + * .start('spline'); + */ + var Animation = function (options) { + + options = options || {}; + + this.stage = options.stage || {}; + + this.onframe = options.onframe || function() {}; + + // private properties + this._clips = []; + + this._running = false; + + this._time = 0; + + Dispatcher.call(this); + }; + + Animation.prototype = { + + constructor: Animation, + /** + * 添加 clip + * @param {module:zrender/animation/Clip} clip + */ + addClip: function (clip) { + this._clips.push(clip); + }, + /** + * 添加 animator + * @param {module:zrender/animation/Animator} animator + */ + addAnimator: function (animator) { + animator.animation = this; + var clips = animator.getClips(); + for (var i = 0; i < clips.length; i++) { + this.addClip(clips[i]); + } + }, + /** + * 删除动画片段 + * @param {module:zrender/animation/Clip} clip + */ + removeClip: function(clip) { + var idx = util.indexOf(this._clips, clip); + if (idx >= 0) { + this._clips.splice(idx, 1); + } + }, + + /** + * 删除动画片段 + * @param {module:zrender/animation/Animator} animator + */ + removeAnimator: function (animator) { + var clips = animator.getClips(); + for (var i = 0; i < clips.length; i++) { + this.removeClip(clips[i]); + } + animator.animation = null; + }, + + _update: function() { + + var time = new Date().getTime(); + var delta = time - this._time; + var clips = this._clips; + var len = clips.length; + + var deferredEvents = []; + var deferredClips = []; + for (var i = 0; i < len; i++) { + var clip = clips[i]; + var e = clip.step(time); + // Throw out the events need to be called after + // stage.update, like destroy + if (e) { + deferredEvents.push(e); + deferredClips.push(clip); + } + } + + // Remove the finished clip + for (var i = 0; i < len;) { + if (clips[i]._needsRemove) { + clips[i] = clips[len - 1]; + clips.pop(); + len--; + } + else { + i++; + } + } + + len = deferredEvents.length; + for (var i = 0; i < len; i++) { + deferredClips[i].fire(deferredEvents[i]); + } + + this._time = time; + + this.onframe(delta); + + this.trigger('frame', delta); + + if (this.stage.update) { + this.stage.update(); + } + }, + /** + * 开始运行动画 + */ + start: function () { + var self = this; + + this._running = true; + + function step() { + if (self._running) { + + requestAnimationFrame(step); + + self._update(); + } + } + + this._time = new Date().getTime(); + requestAnimationFrame(step); + }, + /** + * 停止运行动画 + */ + stop: function () { + this._running = false; + }, + /** + * 清除所有动画片段 + */ + clear: function () { + this._clips = []; + }, + /** + * 对一个目标创建一个animator对象,可以指定目标中的属性使用动画 + * @param {Object} target + * @param {Object} options + * @param {boolean} [options.loop=false] 是否循环播放动画 + * @param {Function} [options.getter=null] + * 如果指定getter函数,会通过getter函数取属性值 + * @param {Function} [options.setter=null] + * 如果指定setter函数,会通过setter函数设置属性值 + * @return {module:zrender/animation/Animation~Animator} + */ + animate: function (target, options) { + options = options || {}; + var animator = new Animator( + target, + options.loop, + options.getter, + options.setter + ); + + return animator; + } + }; + + util.mixin(Animation, Dispatcher); + + module.exports = Animation; + + + +/***/ }, +/* 85 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Default canvas painter + * @module zrender/Painter + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + * pissang (https://www.github.com/pissang) + */ + + + var config = __webpack_require__(40); + var util = __webpack_require__(3); + var log = __webpack_require__(39); + var BoundingRect = __webpack_require__(15); + + var Layer = __webpack_require__(86); + + function parseInt10(val) { + return parseInt(val, 10); + } + + function isLayerValid(layer) { + if (!layer) { + return false; + } + + if (layer.isBuildin) { + return true; + } + + if (typeof(layer.resize) !== 'function' + || typeof(layer.refresh) !== 'function' + ) { + return false; + } + + return true; + } + + function preProcessLayer(layer) { + layer.__unusedCount++; + } + + function postProcessLayer(layer) { + layer.__dirty = false; + if (layer.__unusedCount == 1) { + layer.clear(); + } + } + + var tmpRect = new BoundingRect(0, 0, 0, 0); + var viewRect = new BoundingRect(0, 0, 0, 0); + function isDisplayableCulled(el, width, height) { + tmpRect.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect.applyTransform(el.transform); + } + viewRect.width = width; + viewRect.height = height; + return !tmpRect.intersect(viewRect); + } + + function isClipPathChanged(clipPaths, prevClipPaths) { + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } + } + + function doClip(clipPaths, ctx) { + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + var m; + if (clipPath.transform) { + m = clipPath.transform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + var path = clipPath.path; + path.beginPath(ctx); + clipPath.buildPath(path, clipPath.shape); + ctx.clip(); + // Transform back + if (clipPath.transform) { + m = clipPath.invTransform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + } + } + + /** + * @alias module:zrender/Painter + * @constructor + * @param {HTMLElement} root 绘图容器 + * @param {module:zrender/Storage} storage + * @param {Ojbect} opts + */ + var Painter = function (root, storage, opts) { + var singleCanvas = !root.nodeName // In node ? + || root.nodeName.toUpperCase() === 'CANVAS'; + + opts = opts || {}; + + /** + * @type {number} + */ + this.dpr = opts.devicePixelRatio || config.devicePixelRatio; + /** + * @type {boolean} + * @private + */ + this._singleCanvas = singleCanvas; + /** + * 绘图容器 + * @type {HTMLElement} + */ + this.root = root; + + var rootStyle = root.style; + + // In node environment using node-canvas + if (rootStyle) { + rootStyle['-webkit-tap-highlight-color'] = 'transparent'; + rootStyle['-webkit-user-select'] = 'none'; + rootStyle['user-select'] = 'none'; + rootStyle['-webkit-touch-callout'] = 'none'; + + root.innerHTML = ''; + } + + /** + * @type {module:zrender/Storage} + */ + this.storage = storage; + + if (!singleCanvas) { + var width = this._getWidth(); + var height = this._getHeight(); + this._width = width; + this._height = height; + + var domRoot = document.createElement('div'); + this._domRoot = domRoot; + var domRootStyle = domRoot.style; + + // domRoot.onselectstart = returnFalse; // 避免页面选中的尴尬 + domRootStyle.position = 'relative'; + domRootStyle.overflow = 'hidden'; + domRootStyle.width = this._width + 'px'; + domRootStyle.height = this._height + 'px'; + root.appendChild(domRoot); + + /** + * @type {Object.} + * @private + */ + this._layers = {}; + /** + * @type {Array.} + * @private + */ + this._zlevelList = []; + } + else { + // Use canvas width and height directly + var width = root.width; + var height = root.height; + this._width = width; + this._height = height; + + // Create layer if only one given canvas + // Device pixel ratio is fixed to 1 because given canvas has its specified width and height + var mainLayer = new Layer(root, this, 1); + mainLayer.initContext(); + // FIXME Use canvas width and height + // mainLayer.resize(width, height); + this._layers = { + 0: mainLayer + }; + this._zlevelList = [0]; + } + + this._layerConfig = {}; + + this.pathToImage = this._createPathToImage(); + }; + + Painter.prototype = { + + constructor: Painter, + + /** + * If painter use a single canvas + * @return {boolean} + */ + isSingleCanvas: function () { + return this._singleCanvas; + }, + /** + * @return {HTMLDivElement} + */ + getViewportRoot: function () { + return this._singleCanvas ? this._layers[0].dom : this._domRoot; + }, + + /** + * 刷新 + * @param {boolean} [paintAll=false] 强制绘制所有displayable + */ + refresh: function (paintAll) { + var list = this.storage.getDisplayList(true); + var zlevelList = this._zlevelList; + + this._paintList(list, paintAll); + + // Paint custum layers + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.isBuildin && layer.refresh) { + layer.refresh(); + } + } + + return this; + }, + + _paintList: function (list, paintAll) { + + if (paintAll == null) { + paintAll = false; + } + + this._updateLayerStatus(list); + + var currentLayer; + var currentZLevel; + var ctx; + + var viewWidth = this._width; + var viewHeight = this._height; + + this.eachBuildinLayer(preProcessLayer); + + // var invTransform = []; + var prevElClipPaths = null; + + for (var i = 0, l = list.length; i < l; i++) { + var el = list[i]; + var elZLevel = this._singleCanvas ? 0 : el.zlevel; + // Change draw layer + if (currentZLevel !== elZLevel) { + // Only 0 zlevel if only has one canvas + currentZLevel = elZLevel; + currentLayer = this.getLayer(currentZLevel); + + if (!currentLayer.isBuildin) { + log( + 'ZLevel ' + currentZLevel + + ' has been used by unkown layer ' + currentLayer.id + ); + } + + ctx = currentLayer.ctx; + + // Reset the count + currentLayer.__unusedCount = 0; + + if (currentLayer.__dirty || paintAll) { + currentLayer.clear(); + } + } + + if ( + (currentLayer.__dirty || paintAll) + // Ignore invisible element + && !el.invisible + // Ignore transparent element + && el.style.opacity !== 0 + // Ignore scale 0 element, in some environment like node-canvas + // Draw a scale 0 element can cause all following draw wrong + && el.scale[0] && el.scale[1] + // Ignore culled element + && !(el.culling && isDisplayableCulled(el, viewWidth, viewHeight)) + ) { + var clipPaths = el.__clipPaths; + + // Optimize when clipping on group with several elements + if (isClipPathChanged(clipPaths, prevElClipPaths)) { + // If has previous clipping state, restore from it + if (prevElClipPaths) { + ctx.restore(); + } + // New clipping state + if (clipPaths) { + ctx.save(); + doClip(clipPaths, ctx); + } + prevElClipPaths = clipPaths; + } + el.beforeBrush && el.beforeBrush(ctx); + el.brush(ctx, false); + el.afterBrush && el.afterBrush(ctx); + } + + el.__dirty = false; + } + + // If still has clipping state + if (prevElClipPaths) { + ctx.restore(); + } + + this.eachBuildinLayer(postProcessLayer); + }, + + /** + * 获取 zlevel 所在层,如果不存在则会创建一个新的层 + * @param {number} zlevel + * @return {module:zrender/Layer} + */ + getLayer: function (zlevel) { + if (this._singleCanvas) { + return this._layers[0]; + } + + var layer = this._layers[zlevel]; + if (!layer) { + // Create a new layer + layer = new Layer('zr_' + zlevel, this, this.dpr); + layer.isBuildin = true; + + if (this._layerConfig[zlevel]) { + util.merge(layer, this._layerConfig[zlevel], true); + } + + this.insertLayer(zlevel, layer); + + // Context is created after dom inserted to document + // Or excanvas will get 0px clientWidth and clientHeight + layer.initContext(); + } + + return layer; + }, + + insertLayer: function (zlevel, layer) { + + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var prevLayer = null; + var i = -1; + var domRoot = this._domRoot; + + if (layersMap[zlevel]) { + log('ZLevel ' + zlevel + ' has been used already'); + return; + } + // Check if is a valid layer + if (!isLayerValid(layer)) { + log('Layer of zlevel ' + zlevel + ' is not valid'); + return; + } + + if (len > 0 && zlevel > zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if ( + zlevelList[i] < zlevel + && zlevelList[i + 1] > zlevel + ) { + break; + } + } + prevLayer = layersMap[zlevelList[i]]; + } + zlevelList.splice(i + 1, 0, zlevel); + + if (prevLayer) { + var prevDom = prevLayer.dom; + if (prevDom.nextSibling) { + domRoot.insertBefore( + layer.dom, + prevDom.nextSibling + ); + } + else { + domRoot.appendChild(layer.dom); + } + } + else { + if (domRoot.firstChild) { + domRoot.insertBefore(layer.dom, domRoot.firstChild); + } + else { + domRoot.appendChild(layer.dom); + } + } + + layersMap[zlevel] = layer; + }, + + // Iterate each layer + eachLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }, + + // Iterate each buildin layer + eachBuildinLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var layer; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + layer = this._layers[z]; + if (layer.isBuildin) { + cb.call(context, layer, z); + } + } + }, + + // Iterate each other layer except buildin layer + eachOtherLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var layer; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + layer = this._layers[z]; + if (! layer.isBuildin) { + cb.call(context, layer, z); + } + } + }, + + /** + * 获取所有已创建的层 + * @param {Array.} [prevLayer] + */ + getLayers: function () { + return this._layers; + }, + + _updateLayerStatus: function (list) { + + var layers = this._layers; + + var elCounts = {}; + + this.eachBuildinLayer(function (layer, z) { + elCounts[z] = layer.elCount; + layer.elCount = 0; + }); + + for (var i = 0, l = list.length; i < l; i++) { + var el = list[i]; + var zlevel = this._singleCanvas ? 0 : el.zlevel; + var layer = layers[zlevel]; + if (layer) { + layer.elCount++; + // 已经被标记为需要刷新 + if (layer.__dirty) { + continue; + } + layer.__dirty = el.__dirty; + } + } + + // 层中的元素数量有发生变化 + this.eachBuildinLayer(function (layer, z) { + if (elCounts[z] !== layer.elCount) { + layer.__dirty = true; + } + }); + }, + + /** + * 清除hover层外所有内容 + */ + clear: function () { + this.eachBuildinLayer(this._clearLayer); + return this; + }, + + _clearLayer: function (layer) { + layer.clear(); + }, + + /** + * 修改指定zlevel的绘制参数 + * + * @param {string} zlevel + * @param {Object} config 配置对象 + * @param {string} [config.clearColor=0] 每次清空画布的颜色 + * @param {string} [config.motionBlur=false] 是否开启动态模糊 + * @param {number} [config.lastFrameAlpha=0.7] + * 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + */ + configLayer: function (zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } + else { + util.merge(layerConfig[zlevel], config, true); + } + + var layer = this._layers[zlevel]; + + if (layer) { + util.merge(layer, layerConfig[zlevel], true); + } + } + }, + + /** + * 删除指定层 + * @param {number} zlevel 层所在的zlevel + */ + delLayer: function (zlevel) { + var layers = this._layers; + var zlevelList = this._zlevelList; + var layer = layers[zlevel]; + if (!layer) { + return; + } + layer.dom.parentNode.removeChild(layer.dom); + delete layers[zlevel]; + + zlevelList.splice(util.indexOf(zlevelList, zlevel), 1); + }, + + /** + * 区域大小变化后重绘 + */ + resize: function (width, height) { + var domRoot = this._domRoot; + // FIXME Why ? + domRoot.style.display = 'none'; + + width = width || this._getWidth(); + height = height || this._getHeight(); + + domRoot.style.display = ''; + + // 优化没有实际改变的resize + if (this._width != width || height != this._height) { + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + + for (var id in this._layers) { + this._layers[id].resize(width, height); + } + + this.refresh(true); + } + + this._width = width; + this._height = height; + + return this; + }, + + /** + * 清除单独的一个层 + * @param {number} zlevel + */ + clearLayer: function (zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }, + + /** + * 释放 + */ + dispose: function () { + this.root.innerHTML = ''; + + this.root = + this.storage = + + this._domRoot = + this._layers = null; + }, + + /** + * Get canvas which has all thing rendered + * @param {Object} opts + * @param {string} [opts.backgroundColor] + */ + getRenderedCanvas: function (opts) { + opts = opts || {}; + if (this._singleCanvas) { + return this._layers[0].dom; + } + + var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + + var ctx = imageLayer.ctx; + imageLayer.clearColor = opts.backgroundColor; + imageLayer.clear(); + + var displayList = this.storage.getDisplayList(true); + + for (var i = 0; i < displayList.length; i++) { + var el = displayList[i]; + if (!el.invisible) { + el.beforeBrush && el.beforeBrush(ctx); + // TODO Check image cross origin + el.brush(ctx, false); + el.afterBrush && el.afterBrush(ctx); + } + } + + return imageLayer.dom; + }, + /** + * 获取绘图区域宽度 + */ + getWidth: function () { + return this._width; + }, + + /** + * 获取绘图区域高度 + */ + getHeight: function () { + return this._height; + }, + + _getWidth: function () { + var root = this.root; + var stl = document.defaultView.getComputedStyle(root); + + // FIXME Better way to get the width and height when element has not been append to the document + return ((root.clientWidth || parseInt10(stl.width) || parseInt10(root.style.width)) + - (parseInt10(stl.paddingLeft) || 0) + - (parseInt10(stl.paddingRight) || 0)) | 0; + }, + + _getHeight: function () { + var root = this.root; + var stl = document.defaultView.getComputedStyle(root); + + return ((root.clientHeight || parseInt10(stl.height) || parseInt10(root.style.height)) + - (parseInt10(stl.paddingTop) || 0) + - (parseInt10(stl.paddingBottom) || 0)) | 0; + }, + + _pathToImage: function (id, path, width, height, dpr) { + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + canvas.width = width * dpr; + canvas.height = height * dpr; + + ctx.clearRect(0, 0, width * dpr, height * dpr); + + var pathTransform = { + position: path.position, + rotation: path.rotation, + scale: path.scale + }; + path.position = [0, 0, 0]; + path.rotation = 0; + path.scale = [1, 1]; + if (path) { + path.brush(ctx); + } + + var ImageShape = __webpack_require__(59); + var imgShape = new ImageShape({ + id: id, + style: { + x: 0, + y: 0, + image: canvas + } + }); + + if (pathTransform.position != null) { + imgShape.position = path.position = pathTransform.position; + } + + if (pathTransform.rotation != null) { + imgShape.rotation = path.rotation = pathTransform.rotation; + } + + if (pathTransform.scale != null) { + imgShape.scale = path.scale = pathTransform.scale; + } + + return imgShape; + }, + + _createPathToImage: function () { + var me = this; + + return function (id, e, width, height) { + return me._pathToImage( + id, e, width, height, me.dpr + ); + }; + } + }; + + module.exports = Painter; + + + +/***/ }, +/* 86 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/Layer + * @author pissang(https://www.github.com/pissang) + */ + + + var util = __webpack_require__(3); + var config = __webpack_require__(40); + + function returnFalse() { + return false; + } + + /** + * 创建dom + * + * @inner + * @param {string} id dom id 待用 + * @param {string} type dom type,such as canvas, div etc. + * @param {Painter} painter painter instance + * @param {number} number + */ + function createDom(id, type, painter, dpr) { + var newDom = document.createElement(type); + var width = painter.getWidth(); + var height = painter.getHeight(); + + var newDomStyle = newDom.style; + // 没append呢,请原谅我这样写,清晰~ + newDomStyle.position = 'absolute'; + newDomStyle.left = 0; + newDomStyle.top = 0; + newDomStyle.width = width + 'px'; + newDomStyle.height = height + 'px'; + newDom.width = width * dpr; + newDom.height = height * dpr; + + // id不作为索引用,避免可能造成的重名,定义为私有属性 + newDom.setAttribute('data-zr-dom-id', id); + return newDom; + } + + /** + * @alias module:zrender/Layer + * @constructor + * @extends module:zrender/mixin/Transformable + * @param {string} id + * @param {module:zrender/Painter} painter + * @param {number} [dpr] + */ + var Layer = function(id, painter, dpr) { + var dom; + dpr = dpr || config.devicePixelRatio; + if (typeof id === 'string') { + dom = createDom(id, 'canvas', painter, dpr); + } + // Not using isDom because in node it will return false + else if (util.isObject(id)) { + dom = id; + id = dom.id; + } + this.id = id; + this.dom = dom; + + var domStyle = dom.style; + if (domStyle) { // Not in node + dom.onselectstart = returnFalse; // 避免页面选中的尴尬 + domStyle['-webkit-user-select'] = 'none'; + domStyle['user-select'] = 'none'; + domStyle['-webkit-touch-callout'] = 'none'; + domStyle['-webkit-tap-highlight-color'] = 'rgba(0,0,0,0)'; + } + + this.domBack = null; + this.ctxBack = null; + + this.painter = painter; + + this.config = null; + + // Configs + /** + * 每次清空画布的颜色 + * @type {string} + * @default 0 + */ + this.clearColor = 0; + /** + * 是否开启动态模糊 + * @type {boolean} + * @default false + */ + this.motionBlur = false; + /** + * 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + * @type {number} + * @default 0.7 + */ + this.lastFrameAlpha = 0.7; + + /** + * Layer dpr + * @type {number} + */ + this.dpr = dpr; + }; + + Layer.prototype = { + + constructor: Layer, + + elCount: 0, + + __dirty: true, + + initContext: function () { + this.ctx = this.dom.getContext('2d'); + + var dpr = this.dpr; + if (dpr != 1) { + this.ctx.scale(dpr, dpr); + } + }, + + createBackBuffer: function () { + var dpr = this.dpr; + + this.domBack = createDom('back-' + this.id, 'canvas', this.painter, dpr); + this.ctxBack = this.domBack.getContext('2d'); + + if (dpr != 1) { + this.ctxBack.scale(dpr, dpr); + } + }, + + /** + * @param {number} width + * @param {number} height + */ + resize: function (width, height) { + var dpr = this.dpr; + + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + + dom.width = width * dpr; + dom.height = height * dpr; + + if (dpr != 1) { + this.ctx.scale(dpr, dpr); + } + + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + + if (dpr != 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }, + + /** + * 清空该层画布 + * @param {boolean} clearAll Clear all with out motion blur + */ + clear: function (clearAll) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + + var haveClearColor = this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + + var dpr = this.dpr; + + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage( + dom, 0, 0, + width / dpr, + height / dpr + ); + } + + ctx.clearRect(0, 0, width / dpr, height / dpr); + if (haveClearColor) { + ctx.save(); + ctx.fillStyle = this.clearColor; + ctx.fillRect(0, 0, width / dpr, height / dpr); + ctx.restore(); + } + + if (haveMotionBLur) { + var domBack = this.domBack; + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, 0, 0, width / dpr, height / dpr); + ctx.restore(); + } + } + }; + + module.exports = Layer; + + +/***/ }, +/* 87 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var PI = Math.PI; + /** + * @param {module:echarts/ExtensionAPI} api + * @param {Object} [opts] + * @param {string} [opts.text] + * @param {string} [opts.color] + * @param {string} [opts.textColor] + * @return {module:zrender/Element} + */ + module.exports = function (api, opts) { + opts = opts || {}; + zrUtil.defaults(opts, { + text: 'loading', + color: '#c23531', + textColor: '#000', + maskColor: 'rgba(255, 255, 255, 0.8)', + zlevel: 0 + }); + var mask = new graphic.Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + var arc = new graphic.Arc({ + shape: { + startAngle: -PI / 2, + endAngle: -PI / 2 + 0.1, + r: 10 + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: 5 + }, + zlevel: opts.zlevel, + z: 10001 + }); + var labelRect = new graphic.Rect({ + style: { + fill: 'none', + text: opts.text, + textPosition: 'right', + textDistance: 10, + textFill: opts.textColor + }, + zlevel: opts.zlevel, + z: 10001 + }); + + arc.animateShape(true) + .when(1000, { + endAngle: PI * 3 / 2 + }) + .start('circularInOut'); + arc.animateShape(true) + .when(1000, { + startAngle: PI * 3 / 2 + }) + .delay(300) + .start('circularInOut'); + + var group = new graphic.Group(); + group.add(arc); + group.add(labelRect); + group.add(mask); + // Inject resize + group.resize = function () { + var cx = api.getWidth() / 2; + var cy = api.getHeight() / 2; + arc.setShape({ + cx: cx, + cy: cy + }); + var r = arc.shape.r; + labelRect.setShape({ + x: cx - r, + y: cy - r, + width: r * 2, + height: r * 2 + }); + + mask.setShape({ + x: 0, + y: 0, + width: api.getWidth(), + height: api.getHeight() + }); + }; + group.resize(); + return group; + }; + + +/***/ }, +/* 88 */ +/***/ function(module, exports, __webpack_require__) { + + + var Gradient = __webpack_require__(4); + module.exports = function (seriesType, styleType, ecModel) { + function encodeColor(seriesModel) { + var colorAccessPath = [styleType, 'normal', 'color']; + var colorList = ecModel.get('color'); + var data = seriesModel.getData(); + var color = seriesModel.get(colorAccessPath) // Set in itemStyle + || colorList[seriesModel.seriesIndex % colorList.length]; // Default color + + // FIXME Set color function or use the platte color + data.setVisual('color', color); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + if (typeof color === 'function' && !(color instanceof Gradient)) { + data.each(function (idx) { + data.setItemVisual( + idx, 'color', color(seriesModel.getDataParams(idx)) + ); + }); + } + + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var color = itemModel.get(colorAccessPath, true); + if (color != null) { + data.setItemVisual(idx, 'color', color); + } + }); + } + } + seriesType ? ecModel.eachSeriesByType(seriesType, encodeColor) + : ecModel.eachSeries(encodeColor); + }; + + +/***/ }, +/* 89 */ +/***/ function(module, exports, __webpack_require__) { + + // Compatitable with 2.0 + + + var zrUtil = __webpack_require__(3); + var compatStyle = __webpack_require__(90); + + function get(opt, path) { + path = path.split(','); + var obj = opt; + for (var i = 0; i < path.length; i++) { + obj = obj && obj[path[i]]; + if (obj == null) { + break; + } + } + return obj; + } + + function set(opt, path, val, overwrite) { + path = path.split(','); + var obj = opt; + var key; + for (var i = 0; i < path.length - 1; i++) { + key = path[i]; + if (obj[key] == null) { + obj[key] = {}; + } + obj = obj[key]; + } + if (overwrite || obj[path[i]] == null) { + obj[path[i]] = val; + } + } + + function compatLayoutProperties(option) { + each(LAYOUT_PROPERTIES, function (prop) { + if (prop[0] in option && !(prop[1] in option)) { + option[prop[1]] = option[prop[0]]; + } + }); + } + + var LAYOUT_PROPERTIES = [ + ['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom'] + ]; + + var COMPATITABLE_COMPONENTS = [ + 'grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline' + ]; + + var COMPATITABLE_SERIES = [ + 'bar', 'boxplot', 'candlestick', 'chord', 'effectScatter', + 'funnel', 'gauge', 'lines', 'graph', 'heatmap', 'line', 'map', 'parallel', + 'pie', 'radar', 'sankey', 'scatter', 'treemap' + ]; + + var each = zrUtil.each; + + module.exports = function (option) { + each(option.series, function (seriesOpt) { + if (!zrUtil.isObject(seriesOpt)) { + return; + } + + var seriesType = seriesOpt.type; + + compatStyle(seriesOpt); + + if (seriesType === 'pie' || seriesType === 'gauge') { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + } + } + if (seriesType === 'gauge') { + var pointerColor = get(seriesOpt, 'pointer.color'); + pointerColor != null + && set(seriesOpt, 'itemStyle.normal.color', pointerColor); + } + + for (var i = 0; i < COMPATITABLE_SERIES.length; i++) { + if (COMPATITABLE_SERIES[i] === seriesOpt.type) { + compatLayoutProperties(seriesOpt); + break; + } + } + }); + + // dataRange has changed to visualMap + if (option.dataRange) { + option.visualMap = option.dataRange; + } + + each(COMPATITABLE_COMPONENTS, function (componentName) { + var options = option[componentName]; + if (options) { + if (!zrUtil.isArray(options)) { + options = [options]; + } + each(options, function (option) { + compatLayoutProperties(option); + }); + } + }); + }; + + +/***/ }, +/* 90 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var POSSIBLE_STYLES = [ + 'areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', + 'chordStyle', 'label', 'labelLine' + ]; + + function compatItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + if (itemStyleOpt) { + zrUtil.each(POSSIBLE_STYLES, function (styleName) { + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } + else { + zrUtil.merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + normalItemStyleOpt[styleName] = null; + } + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } + else { + zrUtil.merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + emphasisItemStyleOpt[styleName] = null; + } + }); + } + } + + module.exports = function (seriesOpt) { + if (!seriesOpt) { + return; + } + compatItemStyle(seriesOpt); + compatItemStyle(seriesOpt.markPoint); + compatItemStyle(seriesOpt.markLine); + var data = seriesOpt.data; + if (data) { + for (var i = 0; i < data.length; i++) { + compatItemStyle(data[i]); + } + // mark point data + var markPoint = seriesOpt.markPoint; + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + for (var i = 0; i < mpData.length; i++) { + compatItemStyle(mpData[i]); + } + } + // mark line data + var markLine = seriesOpt.markLine; + if (markLine && markLine.data) { + var mlData = markLine.data; + for (var i = 0; i < mlData.length; i++) { + if (zrUtil.isArray(mlData[i])) { + compatItemStyle(mlData[i][0]); + compatItemStyle(mlData[i][1]); + } + else { + compatItemStyle(mlData[i]); + } + } + } + } + }; + + +/***/ }, +/* 91 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(92); + __webpack_require__(97); + + echarts.registerVisualCoding('chart', zrUtil.curry( + __webpack_require__(103), 'line', 'circle', 'line' + )); + echarts.registerLayout(zrUtil.curry( + __webpack_require__(104), 'line' + )); + + // Down sample after filter + echarts.registerProcessor('statistic', zrUtil.curry( + __webpack_require__(105), 'line' + )); + + // In case developer forget to include grid component + __webpack_require__(106); + + +/***/ }, +/* 92 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var createListFromArray = __webpack_require__(93); + var SeriesModel = __webpack_require__(27); + + module.exports = SeriesModel.extend({ + + type: 'series.line', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + return createListFromArray(option.data, this, ecModel); + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + + hoverAnimation: true, + // stack: null + xAxisIndex: 0, + yAxisIndex: 0, + + polarIndex: 0, + + // If clip the overflow value + clipOverflow: true, + + label: { + normal: { + // show: false, + position: 'top' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + } + // emphasis: { + // show: false, + // position: 'top' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // } + }, + // itemStyle: { + // normal: { + // // color: 各异 + // }, + // emphasis: { + // // color: 各异, + // } + // }, + lineStyle: { + normal: { + width: 2, + type: 'solid' + } + }, + // areaStyle: { + // }, + // smooth: false, + // smoothMonotone: null, + // 拐点图形类型 + symbol: 'emptyCircle', + // 拐点图形大小 + symbolSize: 4, + // 拐点图形旋转控制 + // symbolRotate: null, + + // 是否显示 symbol, 只有在 tooltip hover 的时候显示 + showSymbol: true, + // 标志图形默认只有主轴显示(随主轴标签间隔隐藏策略) + // showAllSymbol: false + // + // 大数据过滤,'average', 'max', 'min', 'sum' + // sampling: 'none' + + animationEasing: 'linear' + } + }); + + +/***/ }, +/* 93 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var completeDimensions = __webpack_require__(96); + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var CoordinateSystem = __webpack_require__(25); + var getDataItemValue = modelUtil.getDataItemValue; + var converDataValue = modelUtil.converDataValue; + + function firstDataNotNull(data) { + var i = 0; + while (i < data.length && data[i] == null) { + i++; + } + return data[i]; + } + function ifNeedCompleteOrdinalData(data) { + var sampleItem = firstDataNotNull(data); + return sampleItem != null + && !zrUtil.isArray(getDataItemValue(sampleItem)); + } + + /** + * Helper function to create a list from option data + */ + function createListFromArray(data, seriesModel, ecModel) { + // If data is undefined + data = data || []; + + var coordSysName = seriesModel.get('coordinateSystem'); + var creator = creators[coordSysName]; + var registeredCoordSys = CoordinateSystem.get(coordSysName); + // FIXME + var result = creator && creator(data, seriesModel, ecModel); + var dimensions = result && result.dimensions; + if (!dimensions) { + // Get dimensions from registered coordinate system + dimensions = (registeredCoordSys && registeredCoordSys.dimensions) || ['x', 'y']; + dimensions = completeDimensions(dimensions, data, dimensions.concat(['value'])); + } + var categoryAxisModel = result && result.categoryAxisModel; + + var categoryDimIndex = dimensions[0].type === 'ordinal' + ? 0 : (dimensions[1].type === 'ordinal' ? 1 : -1); + + var list = new List(dimensions, seriesModel); + + var nameList = createNameList(result, data); + + var dimValueGetter = (categoryAxisModel && ifNeedCompleteOrdinalData(data)) + ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === categoryDimIndex + ? dataIndex + : converDataValue(getDataItemValue(itemOpt), dimensions[dimIndex]); + } + : function (itemOpt, dimName, dataIndex, dimIndex) { + var val = getDataItemValue(itemOpt); + return converDataValue(val && val[dimIndex], dimensions[dimIndex]); + }; + + list.initData(data, nameList, dimValueGetter); + + return list; + } + + function isStackable(axisType) { + return axisType !== 'category' && axisType !== 'time'; + } + + function getDimTypeByAxis(axisType) { + return axisType === 'category' + ? 'ordinal' + : axisType === 'time' + ? 'time' + : 'float'; + } + + /** + * Creaters for each coord system. + * @return {Object} {dimensions, categoryAxisModel}; + */ + var creators = { + + cartesian2d: function (data, seriesModel, ecModel) { + var xAxisModel = ecModel.getComponent('xAxis', seriesModel.get('xAxisIndex')); + var yAxisModel = ecModel.getComponent('yAxis', seriesModel.get('yAxisIndex')); + var xAxisType = xAxisModel.get('type'); + var yAxisType = yAxisModel.get('type'); + + var dimensions = [ + { + name: 'x', + type: getDimTypeByAxis(xAxisType), + stackable: isStackable(xAxisType) + }, + { + name: 'y', + // If two category axes + type: getDimTypeByAxis(yAxisType), + stackable: isStackable(yAxisType) + } + ]; + + var isXAxisCateogry = xAxisType === 'category'; + + completeDimensions(dimensions, data, ['x', 'y', 'z']); + + return { + dimensions: dimensions, + categoryIndex: isXAxisCateogry ? 0 : 1, + categoryAxisModel: isXAxisCateogry + ? xAxisModel + : (yAxisType === 'category' ? yAxisModel : null) + }; + }, + + polar: function (data, seriesModel, ecModel) { + var polarIndex = seriesModel.get('polarIndex') || 0; + + var axisFinder = function (axisModel) { + return axisModel.get('polarIndex') === polarIndex; + }; + + var angleAxisModel = ecModel.findComponents({ + mainType: 'angleAxis', filter: axisFinder + })[0]; + var radiusAxisModel = ecModel.findComponents({ + mainType: 'radiusAxis', filter: axisFinder + })[0]; + + var radiusAxisType = radiusAxisModel.get('type'); + var angleAxisType = angleAxisModel.get('type'); + + var dimensions = [ + { + name: 'radius', + type: getDimTypeByAxis(radiusAxisType), + stackable: isStackable(radiusAxisType) + }, + { + name: 'angle', + type: getDimTypeByAxis(angleAxisType), + stackable: isStackable(angleAxisType) + } + ]; + var isAngleAxisCateogry = angleAxisType === 'category'; + + completeDimensions(dimensions, data, ['radius', 'angle', 'value']); + + return { + dimensions: dimensions, + categoryIndex: isAngleAxisCateogry ? 1 : 0, + categoryAxisModel: isAngleAxisCateogry + ? angleAxisModel + : (radiusAxisType === 'category' ? radiusAxisModel : null) + }; + }, + + geo: function (data, seriesModel, ecModel) { + // TODO Region + // 多个散点图系列在同一个地区的时候 + return { + dimensions: completeDimensions([ + {name: 'lng'}, + {name: 'lat'} + ], data, ['lng', 'lat', 'value']) + }; + } + }; + + function createNameList(result, data) { + var nameList = []; + + if (result && result.categoryAxisModel) { + // FIXME Two category axis + var categories = result.categoryAxisModel.getCategories(); + if (categories) { + var dataLen = data.length; + // Ordered data is given explicitly like + // [[3, 0.2], [1, 0.3], [2, 0.15]] + // or given scatter data, + // pick the category + if (zrUtil.isArray(data[0]) && data[0].length > 1) { + nameList = []; + for (var i = 0; i < dataLen; i++) { + nameList[i] = categories[data[i][result.categoryIndex || 0]]; + } + } + else { + nameList = categories.slice(0); + } + } + } + + return nameList; + } + + module.exports = createListFromArray; + + + +/***/ }, +/* 94 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(global) {/** + * List for data storage + * @module echarts/data/List + */ + + + var UNDEFINED = 'undefined'; + var globalObj = typeof window === 'undefined' ? global : window; + var Float64Array = typeof globalObj.Float64Array === UNDEFINED + ? Array : globalObj.Float64Array; + var Int32Array = typeof globalObj.Int32Array === UNDEFINED + ? Array : globalObj.Int32Array; + + var dataCtors = { + 'float': Float64Array, + 'int': Int32Array, + // Ordinal data type can be string or int + 'ordinal': Array, + 'number': Array, + 'time': Array + }; + + var Model = __webpack_require__(8); + var DataDiffer = __webpack_require__(95); + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var isObject = zrUtil.isObject; + + var IMMUTABLE_PROPERTIES = [ + 'stackedOn', '_nameList', '_idList', '_rawData' + ]; + + var transferImmuProperties = function (a, b, wrappedMethod) { + zrUtil.each(IMMUTABLE_PROPERTIES.concat(wrappedMethod || []), function (propName) { + if (b.hasOwnProperty(propName)) { + a[propName] = b[propName]; + } + }); + }; + + /** + * @constructor + * @alias module:echarts/data/List + * + * @param {Array.} dimensions + * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius + * @param {module:echarts/model/Model} hostModel + */ + var List = function (dimensions, hostModel) { + + dimensions = dimensions || ['x', 'y']; + + var dimensionInfos = {}; + var dimensionNames = []; + for (var i = 0; i < dimensions.length; i++) { + var dimensionName; + var dimensionInfo = {}; + if (typeof dimensions[i] === 'string') { + dimensionName = dimensions[i]; + dimensionInfo = { + name: dimensionName, + stackable: false, + // Type can be 'float', 'int', 'number' + // Default is number, Precision of float may not enough + type: 'number' + }; + } + else { + dimensionInfo = dimensions[i]; + dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || 'number'; + } + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + } + /** + * @readOnly + * @type {Array.} + */ + this.dimensions = dimensionNames; + + /** + * Infomation of each data dimension, like data type. + * @type {Object} + */ + this._dimensionInfos = dimensionInfos; + + /** + * @type {module:echarts/model/Model} + */ + this.hostModel = hostModel; + + /** + * Indices stores the indices of data subset after filtered. + * This data subset will be used in chart. + * @type {Array.} + * @readOnly + */ + this.indices = []; + + /** + * Data storage + * @type {Object.} + * @private + */ + this._storage = {}; + + /** + * @type {Array.} + */ + this._nameList = []; + /** + * @type {Array.} + */ + this._idList = []; + /** + * Models of data option is stored sparse for optimizing memory cost + * @type {Array.} + * @private + */ + this._optionModels = []; + + /** + * @param {module:echarts/data/List} + */ + this.stackedOn = null; + + /** + * Global visual properties after visual coding + * @type {Object} + * @private + */ + this._visual = {}; + + /** + * Globel layout properties. + * @type {Object} + * @private + */ + this._layout = {}; + + /** + * Item visual properties after visual coding + * @type {Array.} + * @private + */ + this._itemVisuals = []; + + /** + * Item layout properties after layout + * @type {Array.} + * @private + */ + this._itemLayouts = []; + + /** + * Graphic elemnents + * @type {Array.} + * @private + */ + this._graphicEls = []; + + /** + * @type {Array.} + * @private + */ + this._rawData; + + /** + * @type {Object} + * @private + */ + this._extent; + }; + + var listProto = List.prototype; + + listProto.type = 'list'; + + /** + * Get dimension name + * @param {string|number} dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + listProto.getDimension = function (dim) { + if (!isNaN(dim)) { + dim = this.dimensions[dim] || dim; + } + return dim; + }; + /** + * Get type and stackable info of particular dimension + * @param {string|number} dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + listProto.getDimensionInfo = function (dim) { + return zrUtil.clone(this._dimensionInfos[this.getDimension(dim)]); + }; + + /** + * Initialize from data + * @param {Array.} data + * @param {Array.} [nameList] + * @param {Function} [dimValueGetter] (dataItem, dimName, dataIndex, dimIndex) => number + */ + listProto.initData = function (data, nameList, dimValueGetter) { + data = data || []; + + this._rawData = data; + + // Clear + var storage = this._storage = {}; + var indices = this.indices = []; + + var dimensions = this.dimensions; + var size = data.length; + var dimensionInfoMap = this._dimensionInfos; + + var idList = []; + var nameRepeatCount = {}; + + nameList = nameList || []; + + // Init storage + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = dimensionInfoMap[dimensions[i]]; + var DataCtor = dataCtors[dimInfo.type]; + storage[dimensions[i]] = new DataCtor(size); + } + + // Default dim value getter + dimValueGetter = dimValueGetter || function (dataItem, dimName, dataIndex, dimIndex) { + var value = modelUtil.getDataItemValue(dataItem); + return modelUtil.converDataValue( + zrUtil.isArray(value) + ? value[dimIndex] + // If value is a single number or something else not array. + : value, + dimensionInfoMap[dimName] + ); + }; + + for (var idx = 0; idx < data.length; idx++) { + var dataItem = data[idx]; + // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of cateogry + // Use a tempValue to normalize the value to be a (x, y) value + + // Store the data by dimensions + for (var k = 0; k < dimensions.length; k++) { + var dim = dimensions[k]; + var dimStorage = storage[dim]; + // PENDING NULL is empty or zero + dimStorage[idx] = dimValueGetter(dataItem, dim, idx, k); + } + + indices.push(idx); + } + + // Use the name in option and create id + for (var i = 0; i < data.length; i++) { + var id = ''; + if (!nameList[i]) { + nameList[i] = data[i].name; + // Try using the id in option + id = data[i].id; + } + var name = nameList[i] || ''; + if (!id && name) { + // Use name as id and add counter to avoid same name + nameRepeatCount[name] = nameRepeatCount[name] || 0; + id = name; + if (nameRepeatCount[name] > 0) { + id += '__ec__' + nameRepeatCount[name]; + } + nameRepeatCount[name]++; + } + id && (idList[i] = id); + } + + this._nameList = nameList; + this._idList = idList; + }; + + /** + * @return {number} + */ + listProto.count = function () { + return this.indices.length; + }; + + /** + * Get value. Return NaN if idx is out of range. + * @param {string} dim Dim must be concrete name. + * @param {number} idx + * @param {boolean} stack + * @return {number} + */ + listProto.get = function (dim, idx, stack) { + var storage = this._storage; + var dataIndex = this.indices[idx]; + + // If value not exists + if (dataIndex == null) { + return NaN; + } + + var value = storage[dim] && storage[dim][dataIndex]; + // FIXME ordinal data type is not stackable + if (stack) { + var dimensionInfo = this._dimensionInfos[dim]; + if (dimensionInfo && dimensionInfo.stackable) { + var stackedOn = this.stackedOn; + while (stackedOn) { + // Get no stacked data of stacked on + var stackedValue = stackedOn.get(dim, idx); + // Considering positive stack, negative stack and empty data + if ((value >= 0 && stackedValue > 0) // Positive stack + || (value <= 0 && stackedValue < 0) // Negative stack + ) { + value += stackedValue; + } + stackedOn = stackedOn.stackedOn; + } + } + } + return value; + }; + + /** + * Get value for multi dimensions. + * @param {Array.} [dimensions] If ignored, using all dimensions. + * @param {number} idx + * @param {boolean} stack + * @return {number} + */ + listProto.getValues = function (dimensions, idx, stack) { + var values = []; + + if (!zrUtil.isArray(dimensions)) { + stack = idx; + idx = dimensions; + dimensions = this.dimensions; + } + + for (var i = 0, len = dimensions.length; i < len; i++) { + values.push(this.get(dimensions[i], idx, stack)); + } + + return values; + }; + + /** + * If value is NaN. Inlcuding '-' + * @param {string} dim + * @param {number} idx + * @return {number} + */ + listProto.hasValue = function (idx) { + var dimensions = this.dimensions; + var dimensionInfos = this._dimensionInfos; + for (var i = 0, len = dimensions.length; i < len; i++) { + if ( + // Ordinal type can be string or number + dimensionInfos[dimensions[i]].type !== 'ordinal' + && isNaN(this.get(dimensions[i], idx)) + ) { + return false; + } + } + return true; + }; + + /** + * Get extent of data in one dimension + * @param {string} dim + * @param {boolean} stack + */ + listProto.getDataExtent = function (dim, stack) { + var dimData = this._storage[dim]; + var dimInfo = this.getDimensionInfo(dim); + stack = (dimInfo && dimInfo.stackable) && stack; + var dimExtent = (this._extent || (this._extent = {}))[dim + (!!stack)]; + var value; + if (dimExtent) { + return dimExtent; + } + // var dimInfo = this._dimensionInfos[dim]; + if (dimData) { + var min = Infinity; + var max = -Infinity; + // var isOrdinal = dimInfo.type === 'ordinal'; + for (var i = 0, len = this.count(); i < len; i++) { + value = this.get(dim, i, stack); + // FIXME + // if (isOrdinal && typeof value === 'string') { + // value = zrUtil.indexOf(dimData, value); + // console.log(value); + // } + value < min && (min = value); + value > max && (max = value); + } + return (this._extent[dim + stack] = [min, max]); + } + else { + return [Infinity, -Infinity]; + } + }; + + /** + * Get sum of data in one dimension + * @param {string} dim + * @param {boolean} stack + */ + listProto.getSum = function (dim, stack) { + var dimData = this._storage[dim]; + var sum = 0; + if (dimData) { + for (var i = 0, len = this.count(); i < len; i++) { + var value = this.get(dim, i, stack); + if (!isNaN(value)) { + sum += value; + } + } + } + return sum; + }; + + /** + * Retreive the index with given value + * @param {number} idx + * @param {number} value + * @return {number} + */ + // FIXME Precision of float value + listProto.indexOf = function (dim, value) { + var storage = this._storage; + var dimData = storage[dim]; + var indices = this.indices; + + if (dimData) { + for (var i = 0, len = indices.length; i < len; i++) { + var rawIndex = indices[i]; + if (dimData[rawIndex] === value) { + return i; + } + } + } + return -1; + }; + + /** + * Retreive the index with given name + * @param {number} idx + * @param {number} name + * @return {number} + */ + listProto.indexOfName = function (name) { + var indices = this.indices; + var nameList = this._nameList; + + for (var i = 0, len = indices.length; i < len; i++) { + var rawIndex = indices[i]; + if (nameList[rawIndex] === name) { + return i; + } + } + + return -1; + }; + + /** + * Retreive the index of nearest value + * @param {string>} dim + * @param {number} value + * @param {boolean} stack If given value is after stacked + * @return {number} + */ + listProto.indexOfNearest = function (dim, value, stack) { + var storage = this._storage; + var dimData = storage[dim]; + + if (dimData) { + var minDist = Number.MAX_VALUE; + var nearestIdx = -1; + for (var i = 0, len = this.count(); i < len; i++) { + var diff = value - this.get(dim, i, stack); + var dist = Math.abs(diff); + if (dist < minDist + // For the case of two data are same on xAxis, which has sequence data. + // Show the nearest index + // https://github.com/ecomfe/echarts/issues/2869 + || (dist === minDist && diff > 0) + ) { + minDist = dist; + nearestIdx = i; + } + } + return nearestIdx; + } + return -1; + }; + + /** + * Get raw data index + * @param {number} idx + * @return {number} + */ + listProto.getRawIndex = function (idx) { + var rawIdx = this.indices[idx]; + return rawIdx == null ? -1 : rawIdx; + }; + + /** + * @param {number} idx + * @param {boolean} [notDefaultIdx=false] + * @return {string} + */ + listProto.getName = function (idx) { + return this._nameList[this.indices[idx]] || ''; + }; + + /** + * @param {number} idx + * @param {boolean} [notDefaultIdx=false] + * @return {string} + */ + listProto.getId = function (idx) { + return this._idList[this.indices[idx]] || (this.getRawIndex(idx) + ''); + }; + + + function normalizeDimensions(dimensions) { + if (!zrUtil.isArray(dimensions)) { + dimensions = [dimensions]; + } + return dimensions; + } + + /** + * Data iteration + * @param {string|Array.} + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * + * @example + * list.each('x', function (x, idx) {}); + * list.each(['x', 'y'], function (x, y, idx) {}); + * list.each(function (idx) {}) + */ + listProto.each = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var value = []; + var dimSize = dimensions.length; + var indices = this.indices; + + context = context || this; + + for (var i = 0; i < indices.length; i++) { + if (dimSize === 0) { + cb.call(context, i); + } + // Simple optimization + else if (dimSize === 1) { + cb.call(context, this.get(dimensions[0], i, stack), i); + } + else { + for (var k = 0; k < dimSize; k++) { + value[k] = this.get(dimensions[k], i, stack); + } + // Index + value[k] = i; + cb.apply(context, value); + } + } + }; + + /** + * Data filter + * @param {string|Array.} + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + */ + listProto.filterSelf = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var newIndices = []; + var value = []; + var dimSize = dimensions.length; + var indices = this.indices; + + context = context || this; + + for (var i = 0; i < indices.length; i++) { + var keep; + // Simple optimization + if (dimSize === 1) { + keep = cb.call( + context, this.get(dimensions[0], i, stack), i + ); + } + else { + for (var k = 0; k < dimSize; k++) { + value[k] = this.get(dimensions[k], i, stack); + } + value[k] = i; + keep = cb.apply(context, value); + } + if (keep) { + newIndices.push(indices[i]); + } + } + + this.indices = newIndices; + + // Reset data extent + this._extent = {}; + + return this; + }; + + /** + * Data mapping to a plain array + * @param {string|Array.} [dimensions] + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * @return {Array} + */ + listProto.mapArray = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + var result = []; + this.each(dimensions, function () { + result.push(cb && cb.apply(this, arguments)); + }, stack, context); + return result; + }; + + function cloneListForMapAndSample(original, excludeDimensions) { + var allDimensions = original.dimensions; + var list = new List( + zrUtil.map(allDimensions, original.getDimensionInfo, original), + original.hostModel + ); + // FIXME If needs stackedOn, value may already been stacked + transferImmuProperties(list, original, original._wrappedMethods); + + var storage = list._storage = {}; + var originalStorage = original._storage; + // Init storage + for (var i = 0; i < allDimensions.length; i++) { + var dim = allDimensions[i]; + var dimStore = originalStorage[dim]; + if (zrUtil.indexOf(excludeDimensions, dim) >= 0) { + storage[dim] = new dimStore.constructor( + originalStorage[dim].length + ); + } + else { + // Direct reference for other dimensions + storage[dim] = originalStorage[dim]; + } + } + return list; + } + + /** + * Data mapping to a new List with given dimensions + * @param {string|Array.} dimensions + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * @return {Array} + */ + listProto.map = function (dimensions, cb, stack, context) { + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var list = cloneListForMapAndSample(this, dimensions); + // Following properties are all immutable. + // So we can reference to the same value + var indices = list.indices = this.indices; + + var storage = list._storage; + + var tmpRetValue = []; + this.each(dimensions, function () { + var idx = arguments[arguments.length - 1]; + var retValue = cb && cb.apply(this, arguments); + if (retValue != null) { + // a number + if (typeof retValue === 'number') { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + for (var i = 0; i < retValue.length; i++) { + var dim = dimensions[i]; + var dimStore = storage[dim]; + var rawIdx = indices[idx]; + if (dimStore) { + dimStore[rawIdx] = retValue[i]; + } + } + } + }, stack, context); + + return list; + }; + + /** + * Large data down sampling on given dimension + * @param {string} dimension + * @param {number} rate + * @param {Function} sampleValue + * @param {Function} sampleIndex Sample index for name and id + */ + listProto.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this, [dimension]); + var storage = this._storage; + var targetStorage = list._storage; + + var originalIndices = this.indices; + var indices = list.indices = []; + + var frameValues = []; + var frameIndices = []; + var frameSize = Math.floor(1 / rate); + + var dimStore = targetStorage[dimension]; + var len = this.count(); + // Copy data from original data + for (var i = 0; i < storage[dimension].length; i++) { + targetStorage[dimension][i] = storage[dimension][i]; + } + for (var i = 0; i < len; i += frameSize) { + // Last frame + if (frameSize > len - i) { + frameSize = len - i; + frameValues.length = frameSize; + } + for (var k = 0; k < frameSize; k++) { + var idx = originalIndices[i + k]; + frameValues[k] = dimStore[idx]; + frameIndices[k] = idx; + } + var value = sampleValue(frameValues); + var idx = frameIndices[sampleIndex(frameValues, value) || 0]; + // Only write value on the filtered data + dimStore[idx] = value; + indices.push(idx); + } + return list; + }; + + /** + * Get model of one data item. + * + * @param {number} idx + */ + // FIXME Model proxy ? + listProto.getItemModel = function (idx) { + var hostModel = this.hostModel; + idx = this.indices[idx]; + return new Model(this._rawData[idx], hostModel, hostModel.ecModel); + }; + + /** + * Create a data differ + * @param {module:echarts/data/List} otherList + * @return {module:echarts/data/DataDiffer} + */ + listProto.diff = function (otherList) { + var idList = this._idList; + var otherIdList = otherList && otherList._idList; + return new DataDiffer( + otherList ? otherList.indices : [], this.indices, function (idx) { + return otherIdList[idx] || (idx + ''); + }, function (idx) { + return idList[idx] || (idx + ''); + } + ); + }; + /** + * Get visual property. + * @param {string} key + */ + listProto.getVisual = function (key) { + var visual = this._visual; + return visual && visual[key]; + }; + + /** + * Set visual property + * @param {string|Object} key + * @param {*} [value] + * + * @example + * setVisual('color', color); + * setVisual({ + * 'color': color + * }); + */ + listProto.setVisual = function (key, val) { + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.setVisual(name, key[name]); + } + } + return; + } + this._visual = this._visual || {}; + this._visual[key] = val; + }; + + /** + * Set layout property. + * @param {string} key + * @param {*} [val] + */ + listProto.setLayout = function (key, val) { + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.setLayout(name, key[name]); + } + } + return; + } + this._layout[key] = val; + }; + + /** + * Get layout property. + * @param {string} key. + * @return {*} + */ + listProto.getLayout = function (key) { + return this._layout[key]; + }; + + /** + * Get layout of single data item + * @param {number} idx + */ + listProto.getItemLayout = function (idx) { + return this._itemLayouts[idx]; + }, + + /** + * Set layout of single data item + * @param {number} idx + * @param {Object} layout + * @param {boolean=} [merge=false] + */ + listProto.setItemLayout = function (idx, layout, merge) { + this._itemLayouts[idx] = merge + ? zrUtil.extend(this._itemLayouts[idx] || {}, layout) + : layout; + }, + + /** + * Get visual property of single data item + * @param {number} idx + * @param {string} key + * @param {boolean} ignoreParent + */ + listProto.getItemVisual = function (idx, key, ignoreParent) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + if (val == null && !ignoreParent) { + // Use global visual property + return this.getVisual(key); + } + return val; + }, + + /** + * Set visual property of single data item + * + * @param {number} idx + * @param {string|Object} key + * @param {*} [value] + * + * @example + * setItemVisual(0, 'color', color); + * setItemVisual(0, { + * 'color': color + * }); + */ + listProto.setItemVisual = function (idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + this._itemVisuals[idx] = itemVisual; + + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + itemVisual[name] = key[name]; + } + } + return; + } + itemVisual[key] = value; + }; + + var setItemDataAndSeriesIndex = function (child) { + child.seriesIndex = this.seriesIndex; + child.dataIndex = this.dataIndex; + }; + /** + * Set graphic element relative to data. It can be set as null + * @param {number} idx + * @param {module:zrender/Element} [el] + */ + listProto.setItemGraphicEl = function (idx, el) { + var hostModel = this.hostModel; + + if (el) { + // Add data index and series index for indexing the data by element + // Useful in tooltip + el.dataIndex = idx; + el.seriesIndex = hostModel && hostModel.seriesIndex; + if (el.type === 'group') { + el.traverse(setItemDataAndSeriesIndex, el); + } + } + + this._graphicEls[idx] = el; + }; + + /** + * @param {number} idx + * @return {module:zrender/Element} + */ + listProto.getItemGraphicEl = function (idx) { + return this._graphicEls[idx]; + }; + + /** + * @param {Function} cb + * @param {*} context + */ + listProto.eachItemGraphicEl = function (cb, context) { + zrUtil.each(this._graphicEls, function (el, idx) { + if (el) { + cb && cb.call(context, el, idx); + } + }); + }; + + /** + * Shallow clone a new list except visual and layout properties, and graph elements. + * New list only change the indices. + */ + listProto.cloneShallow = function () { + var dimensionInfoList = zrUtil.map(this.dimensions, this.getDimensionInfo, this); + var list = new List(dimensionInfoList, this.hostModel); + + // FIXME + list._storage = this._storage; + + transferImmuProperties(list, this, this._wrappedMethods); + + list.indices = this.indices.slice(); + + return list; + }; + + /** + * Wrap some method to add more feature + * @param {string} methodName + * @param {Function} injectFunction + */ + listProto.wrapMethod = function (methodName, injectFunction) { + var originalMethod = this[methodName]; + if (typeof originalMethod !== 'function') { + return; + } + this._wrappedMethods = this._wrappedMethods || []; + this._wrappedMethods.push(methodName); + this[methodName] = function () { + var res = originalMethod.apply(this, arguments); + return injectFunction.call(this, res); + }; + }; + + module.exports = List; + + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ }, +/* 95 */ +/***/ function(module, exports) { + + 'use strict'; + + + function defaultKeyGetter(item) { + return item; + } + + function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter) { + this._old = oldArr; + this._new = newArr; + + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; + } + + DataDiffer.prototype = { + + constructor: DataDiffer, + + /** + * Callback function when add a data + */ + add: function (func) { + this._add = func; + return this; + }, + + /** + * Callback function when update a data + */ + update: function (func) { + this._update = func; + return this; + }, + + /** + * Callback function when remove a data + */ + remove: function (func) { + this._remove = func; + return this; + }, + + execute: function () { + var oldArr = this._old; + var newArr = this._new; + var oldKeyGetter = this._oldKeyGetter; + var newKeyGetter = this._newKeyGetter; + + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var i; + + initIndexMap(oldArr, oldDataIndexMap, oldKeyGetter); + initIndexMap(newArr, newDataIndexMap, newKeyGetter); + + // Travel by inverted order to make sure order consistency + // when duplicate keys exists (consider newDataIndex.pop() below). + // For performance consideration, these code below do not look neat. + for (i = 0; i < oldArr.length; i++) { + var key = oldKeyGetter(oldArr[i]); + var idx = newDataIndexMap[key]; + + // idx can never be empty array here. see 'set null' logic below. + if (idx != null) { + // Consider there is duplicate key (for example, use dataItem.name as key). + // We should make sure every item in newArr and oldArr can be visited. + var len = idx.length; + if (len) { + len === 1 && (newDataIndexMap[key] = null); + idx = idx.unshift(); + } + else { + newDataIndexMap[key] = null; + } + this._update && this._update(idx, i); + } + else { + this._remove && this._remove(i); + } + } + + for (var key in newDataIndexMap) { + if (newDataIndexMap.hasOwnProperty(key)) { + var idx = newDataIndexMap[key]; + if (idx == null) { + continue; + } + // idx can never be empty array here. see 'set null' logic above. + if (!idx.length) { + this._add && this._add(idx); + } + else { + for (var i = 0, len = idx.length; i < len; i++) { + this._add && this._add(idx[i]); + } + } + } + } + } + }; + + function initIndexMap(arr, map, keyGetter) { + for (var i = 0; i < arr.length; i++) { + var key = keyGetter(arr[i]); + var existence = map[key]; + if (existence == null) { + map[key] = i; + } + else { + if (!existence.length) { + map[key] = existence = [existence]; + } + existence.push(i); + } + } + } + + module.exports = DataDiffer; + + +/***/ }, +/* 96 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Complete dimensions by data (guess dimension). + */ + + + var zrUtil = __webpack_require__(3); + + /** + * Complete the dimensions array guessed from the data structure. + * @param {Array.} dimensions Necessary dimensions, like ['x', 'y'] + * @param {Array} data Data list. [[1, 2, 3], [2, 3, 4]] + * @param {Array.} defaultNames Default names to fill not necessary dimensions, like ['value'] + * @param {string} extraPrefix Prefix of name when filling the left dimensions. + * @return {Array.} + */ + function completeDimensions(dimensions, data, defaultNames, extraPrefix) { + if (!data) { + return dimensions; + } + + var value0 = retrieveValue(data[0]); + var dimSize = zrUtil.isArray(value0) && value0.length || 1; + + defaultNames = defaultNames || []; + extraPrefix = extraPrefix || 'extra'; + for (var i = 0; i < dimSize; i++) { + if (!dimensions[i]) { + var name = defaultNames[i] || (extraPrefix + (i - defaultNames.length)); + dimensions[i] = guessOrdinal(data, i) + ? {type: 'ordinal', name: name} + : name; + } + } + + return dimensions; + } + + // The rule should not be complex, otherwise user might not + // be able to known where the data is wrong. + function guessOrdinal(data, dimIndex) { + for (var i = 0, len = data.length; i < len; i++) { + var value = retrieveValue(data[i]); + + if (!zrUtil.isArray(value)) { + return false; + } + + var value = value[dimIndex]; + if (value != null && isFinite(value)) { + return false; + } + else if (zrUtil.isString(value) && value !== '-') { + return true; + } + } + return false; + } + + function retrieveValue(o) { + return zrUtil.isArray(o) ? o : zrUtil.isObject(o) ? o.value: o; + } + + module.exports = completeDimensions; + + + +/***/ }, +/* 97 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var SymbolDraw = __webpack_require__(98); + var Symbol = __webpack_require__(99); + var lineAnimationDiff = __webpack_require__(101); + var graphic = __webpack_require__(42); + + var polyHelper = __webpack_require__(102); + + var ChartView = __webpack_require__(41); + + function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + for (var i = 0; i < points1.length; i++) { + var p1 = points1[i]; + var p2 = points2[i]; + if (p1[0] !== p2[0] || p1[1] !== p2[1]) { + return; + } + } + return true; + } + + function getSmooth(smooth) { + return typeof (smooth) === 'number' ? smooth : (smooth ? 0.3 : 0); + } + + function getAxisExtentWithGap(axis) { + var extent = axis.getGlobalExtent(); + if (axis.onBand) { + // Remove extra 1px to avoid line miter in clipped edge + var halfBandWidth = axis.getBandWidth() / 2 - 1; + var dir = extent[1] > extent[0] ? 1 : -1; + extent[0] += dir * halfBandWidth; + extent[1] -= dir * halfBandWidth; + } + return extent; + } + + function sign(val) { + return val >= 0 ? 1 : -1; + } + /** + * @param {module:echarts/coord/cartesian/Cartesian2D|module:echarts/coord/polar/Polar} coordSys + * @param {module:echarts/data/List} data + * @param {Array.>} points + * @private + */ + function getStackedOnPoints(coordSys, data) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = baseAxis.onZero + ? 0 : valueAxis.scale.getExtent()[0]; + + var valueDim = valueAxis.dim; + + var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0; + + return data.mapArray([valueDim], function (val, idx) { + var stackedOnSameSign; + var stackedOn = data.stackedOn; + // Find first stacked value with same sign + while (stackedOn && + sign(stackedOn.get(valueDim, idx)) === sign(val) + ) { + stackedOnSameSign = stackedOn; + break; + } + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseAxis.dim, idx); + stackedData[1 - baseDataOffset] = stackedOnSameSign + ? stackedOnSameSign.get(valueDim, idx, true) : valueStart; + + return coordSys.dataToPoint(stackedData); + }, true); + } + + function queryDataIndex(data, payload) { + if (payload.dataIndex != null) { + return payload.dataIndex; + } + else if (payload.name != null) { + return data.indexOfName(payload.name); + } + } + + function createGridClipShape(cartesian, hasAnimation, seriesModel) { + var xExtent = getAxisExtentWithGap(cartesian.getAxis('x')); + var yExtent = getAxisExtentWithGap(cartesian.getAxis('y')); + var isHorizontal = cartesian.getBaseAxis().isHorizontal(); + + var x = xExtent[0]; + var y = yExtent[0]; + var width = xExtent[1] - x; + var height = yExtent[1] - y; + // Expand clip shape to avoid line value exceeds axis + if (!seriesModel.get('clipOverflow')) { + if (isHorizontal) { + y -= height; + height *= 3; + } + else { + x -= width; + width *= 3; + } + } + var clipPath = new graphic.Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + + if (hasAnimation) { + clipPath.shape[isHorizontal ? 'width' : 'height'] = 0; + graphic.initProps(clipPath, { + shape: { + width: width, + height: height + } + }, seriesModel); + } + + return clipPath; + } + + function createPolarClipShape(polar, hasAnimation, seriesModel) { + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); + + var radiusExtent = radiusAxis.getExtent(); + var angleExtent = angleAxis.getExtent(); + + var RADIAN = Math.PI / 180; + + var clipPath = new graphic.Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: radiusExtent[0], + r: radiusExtent[1], + startAngle: -angleExtent[0] * RADIAN, + endAngle: -angleExtent[1] * RADIAN, + clockwise: angleAxis.inverse + } + }); + + if (hasAnimation) { + clipPath.shape.endAngle = -angleExtent[0] * RADIAN; + graphic.initProps(clipPath, { + shape: { + endAngle: -angleExtent[1] * RADIAN + } + }, seriesModel); + } + + return clipPath; + } + + function createClipShape(coordSys, hasAnimation, seriesModel) { + return coordSys.type === 'polar' + ? createPolarClipShape(coordSys, hasAnimation, seriesModel) + : createGridClipShape(coordSys, hasAnimation, seriesModel); + } + + module.exports = ChartView.extend({ + + type: 'line', + + init: function () { + var lineGroup = new graphic.Group(); + + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + }, + + render: function (seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel('lineStyle.normal'); + var areaStyleModel = seriesModel.getModel('areaStyle.normal'); + + var points = data.mapArray(data.getItemLayout, true); + + var isCoordSysPolar = coordSys.type === 'polar'; + var prevCoordSys = this._coordSys; + + var symbolDraw = this._symbolDraw; + var polyline = this._polyline; + var polygon = this._polygon; + + var lineGroup = this._lineGroup; + + var hasAnimation = seriesModel.get('animation'); + + var isAreaChart = !areaStyleModel.isEmpty(); + var stackedOnPoints = getStackedOnPoints(coordSys, data); + + var showSymbol = seriesModel.get('showSymbol'); + + var isSymbolIgnore = showSymbol && !isCoordSysPolar && !seriesModel.get('showAllSymbol') + && this._getSymbolIgnoreFunc(data, coordSys); + + // Remove temporary symbols + var oldData = this._data; + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + + // Remove previous created symbols if showSymbol changed to false + if (!showSymbol) { + symbolDraw.remove(); + } + + group.add(lineGroup); + + // Initialization animation or coordinate system changed + if ( + !(polyline && prevCoordSys.type === coordSys.type) + ) { + showSymbol && symbolDraw.updateData(data, isSymbolIgnore); + + polyline = this._newPolyline(points, coordSys, hasAnimation); + if (isAreaChart) { + polygon = this._newPolygon( + points, stackedOnPoints, + coordSys, hasAnimation + ); + } + lineGroup.setClipPath(createClipShape(coordSys, true, seriesModel)); + } + else { + if (isAreaChart && !polygon) { + // If areaStyle is added + polygon = this._newPolygon( + points, stackedOnPoints, + coordSys, hasAnimation + ); + } + else if (polygon && !isAreaChart) { + // If areaStyle is removed + lineGroup.remove(polygon); + polygon = this._polygon = null; + } + + // Update clipPath + lineGroup.setClipPath(createClipShape(coordSys, false, seriesModel)); + + // Always update, or it is wrong in the case turning on legend + // because points are not changed + showSymbol && symbolDraw.updateData(data, isSymbolIgnore); + + // Stop symbol animation and sync with line points + // FIXME performance? + data.eachItemGraphicEl(function (el) { + el.stopAnimation(true); + }); + + // In the case data zoom triggerred refreshing frequently + // Data may not change if line has a category axis. So it should animate nothing + if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) + || !isPointsSame(this._points, points) + ) { + if (hasAnimation) { + this._updateAnimation( + data, stackedOnPoints, coordSys, api + ); + } + else { + polyline.setShape({ + points: points + }); + polygon && polygon.setShape({ + points: points, + stackedOnPoints: stackedOnPoints + }); + } + } + } + + polyline.setStyle(zrUtil.defaults( + // Use color in lineStyle first + lineStyleModel.getLineStyle(), + { + stroke: data.getVisual('color'), + lineJoin: 'bevel' + } + )); + + var smooth = seriesModel.get('smooth'); + smooth = getSmooth(seriesModel.get('smooth')); + polyline.setShape({ + smooth: smooth, + smoothMonotone: seriesModel.get('smoothMonotone') + }); + + if (polygon) { + var stackedOn = data.stackedOn; + var stackedOnSmooth = 0; + + polygon.style.opacity = 0.7; + polygon.setStyle(zrUtil.defaults( + areaStyleModel.getAreaStyle(), + { + fill: data.getVisual('color'), + lineJoin: 'bevel' + } + )); + + if (stackedOn) { + var stackedOnSeries = stackedOn.hostModel; + stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth')); + } + + polygon.setShape({ + smooth: smooth, + stackedOnSmooth: stackedOnSmooth, + smoothMonotone: seriesModel.get('smoothMonotone') + }); + } + + this._data = data; + // Save the coordinate system for transition animation when data changed + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + }, + + highlight: function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (!symbol) { + // Create a temporary symbol if it is not exists + var pt = data.getItemLayout(dataIndex); + symbol = new Symbol(data, dataIndex, api); + symbol.position = pt; + symbol.setZ( + seriesModel.get('zlevel'), + seriesModel.get('z') + ); + symbol.ignore = isNaN(pt[0]) || isNaN(pt[1]); + symbol.__temp = true; + data.setItemGraphicEl(dataIndex, symbol); + + // Stop scale animation + symbol.stopSymbolAnimation(true); + + this.group.add(symbol); + } + symbol.highlight(); + } + else { + // Highlight whole series + ChartView.prototype.highlight.call( + this, seriesModel, ecModel, api, payload + ); + } + }, + + downplay: function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (symbol) { + if (symbol.__temp) { + data.setItemGraphicEl(dataIndex, null); + this.group.remove(symbol); + } + else { + symbol.downplay(); + } + } + } + else { + // Downplay whole series + ChartView.prototype.downplay.call( + this, seriesModel, ecModel, api, payload + ); + } + }, + + /** + * @param {module:zrender/container/Group} group + * @param {Array.>} points + * @private + */ + _newPolyline: function (points) { + var polyline = this._polyline; + // Remove previous created polyline + if (polyline) { + this._lineGroup.remove(polyline); + } + + polyline = new polyHelper.Polyline({ + shape: { + points: points + }, + silent: true, + z2: 10 + }); + + this._lineGroup.add(polyline); + + this._polyline = polyline; + + return polyline; + }, + + /** + * @param {module:zrender/container/Group} group + * @param {Array.>} stackedOnPoints + * @param {Array.>} points + * @private + */ + _newPolygon: function (points, stackedOnPoints) { + var polygon = this._polygon; + // Remove previous created polygon + if (polygon) { + this._lineGroup.remove(polygon); + } + + polygon = new polyHelper.Polygon({ + shape: { + points: points, + stackedOnPoints: stackedOnPoints + }, + silent: true + }); + + this._lineGroup.add(polygon); + + this._polygon = polygon; + return polygon; + }, + /** + * @private + */ + _getSymbolIgnoreFunc: function (data, coordSys) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + // `getLabelInterval` is provided by echarts/component/axis + if (categoryAxis && categoryAxis.isLabelIgnored) { + return zrUtil.bind(categoryAxis.isLabelIgnored, categoryAxis); + } + }, + + /** + * @private + */ + // FIXME Two value axis + _updateAnimation: function (data, stackedOnPoints, coordSys, api) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + + var diff = lineAnimationDiff( + this._data, data, + this._stackedOnPoints, stackedOnPoints, + this._coordSys, coordSys + ); + polyline.shape.points = diff.current; + + graphic.updateProps(polyline, { + shape: { + points: diff.next + } + }, seriesModel); + + if (polygon) { + polygon.setShape({ + points: diff.current, + stackedOnPoints: diff.stackedOnCurrent + }); + graphic.updateProps(polygon, { + shape: { + points: diff.next, + stackedOnPoints: diff.stackedOnNext + } + }, seriesModel); + } + + var updatedDataInfo = []; + var diffStatus = diff.status; + + for (var i = 0; i < diffStatus.length; i++) { + var cmd = diffStatus[i].cmd; + if (cmd === '=') { + var el = data.getItemGraphicEl(diffStatus[i].idx1); + if (el) { + updatedDataInfo.push({ + el: el, + ptIdx: i // Index of points + }); + } + } + } + + if (polyline.animators && polyline.animators.length) { + polyline.animators[0].during(function () { + for (var i = 0; i < updatedDataInfo.length; i++) { + var el = updatedDataInfo[i].el; + el.attr('position', polyline.shape.points[updatedDataInfo[i].ptIdx]); + } + }); + } + }, + + remove: function (ecModel) { + var group = this.group; + var oldData = this._data; + this._lineGroup.removeAll(); + this._symbolDraw.remove(true); + // Remove temporary created elements when highlighting + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + + this._polyline = + this._polygon = + this._coordSys = + this._points = + this._stackedOnPoints = + this._data = null; + } + }); + + +/***/ }, +/* 98 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/SymbolDraw + */ + + + var graphic = __webpack_require__(42); + var Symbol = __webpack_require__(99); + + /** + * @constructor + * @alias module:echarts/chart/helper/SymbolDraw + * @param {module:zrender/graphic/Group} [symbolCtor] + */ + function SymbolDraw(symbolCtor) { + this.group = new graphic.Group(); + + this._symbolCtor = symbolCtor || Symbol; + } + + var symbolDrawProto = SymbolDraw.prototype; + + function symbolNeedsDraw(data, idx, isIgnore) { + var point = data.getItemLayout(idx); + return point && !isNaN(point[0]) && !isNaN(point[1]) && !(isIgnore && isIgnore(idx)) + && data.getItemVisual(idx, 'symbol') !== 'none'; + } + /** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + * @param {Array.} [isIgnore] + */ + symbolDrawProto.updateData = function (data, isIgnore) { + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + + var SymbolCtor = this._symbolCtor; + + data.diff(oldData) + .add(function (newIdx) { + var point = data.getItemLayout(newIdx); + if (symbolNeedsDraw(data, newIdx, isIgnore)) { + var symbolEl = new SymbolCtor(data, newIdx); + symbolEl.attr('position', point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }) + .update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = data.getItemLayout(newIdx); + if (!symbolNeedsDraw(data, newIdx, isIgnore)) { + group.remove(symbolEl); + return; + } + if (!symbolEl) { + symbolEl = new SymbolCtor(data, newIdx); + symbolEl.attr('position', point); + } + else { + symbolEl.updateData(data, newIdx); + graphic.updateProps(symbolEl, { + position: point + }, seriesModel); + } + + // Add back + group.add(symbolEl); + + data.setItemGraphicEl(newIdx, symbolEl); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && el.fadeOut(function () { + group.remove(el); + }); + }) + .execute(); + + this._data = data; + }; + + symbolDrawProto.updateLayout = function () { + var data = this._data; + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + el.attr('position', data.getItemLayout(idx)); + }); + } + }; + + symbolDrawProto.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; + if (data) { + if (enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }); + }); + } + else { + group.removeAll(); + } + } + }; + + module.exports = SymbolDraw; + + +/***/ }, +/* 99 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/Symbol + */ + + + var zrUtil = __webpack_require__(3); + var symbolUtil = __webpack_require__(100); + var graphic = __webpack_require__(42); + var numberUtil = __webpack_require__(7); + + function normalizeSymbolSize(symbolSize) { + if (!zrUtil.isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + return symbolSize; + } + + /** + * @constructor + * @alias {module:echarts/chart/helper/Symbol} + * @param {module:echarts/data/List} data + * @param {number} idx + * @extends {module:zrender/graphic/Group} + */ + function Symbol(data, idx) { + graphic.Group.call(this); + + this.updateData(data, idx); + } + + var symbolProto = Symbol.prototype; + + function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); + } + + symbolProto._createSymbol = function (symbolType, data, idx) { + // Remove paths created before + this.removeAll(); + + var seriesModel = data.hostModel; + var color = data.getItemVisual(idx, 'color'); + + var symbolPath = symbolUtil.createSymbol( + symbolType, -0.5, -0.5, 1, 1, color + ); + + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + culling: true, + scale: [0, 0] + }); + // Rewrite drift method + symbolPath.drift = driftSymbol; + + var size = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + + graphic.initProps(symbolPath, { + scale: size + }, seriesModel); + + this._symbolType = symbolType; + + this.add(symbolPath); + }; + + /** + * Stop animation + * @param {boolean} toLastFrame + */ + symbolProto.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(toLastFrame); + }; + + /** + * Get scale(aka, current symbol size). + * Including the change caused by animation + * @param {Array.} toLastFrame + */ + symbolProto.getScale = function () { + return this.childAt(0).scale; + }; + + /** + * Highlight symbol + */ + symbolProto.highlight = function () { + this.childAt(0).trigger('emphasis'); + }; + + /** + * Downplay symbol + */ + symbolProto.downplay = function () { + this.childAt(0).trigger('normal'); + }; + + /** + * @param {number} zlevel + * @param {number} z + */ + symbolProto.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; + }; + + symbolProto.setDraggable = function (draggable) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = draggable ? 'move' : 'pointer'; + }; + /** + * Update symbol properties + * @param {module:echarts/data/List} data + * @param {number} idx + */ + symbolProto.updateData = function (data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + if (symbolType !== this._symbolType) { + this._createSymbol(symbolType, data, idx); + } + else { + var symbolPath = this.childAt(0); + graphic.updateProps(symbolPath, { + scale: symbolSize + }, seriesModel); + } + this._updateCommon(data, idx, symbolSize); + + this._seriesModel = seriesModel; + }; + + // Update common properties + var normalStyleAccessPath = ['itemStyle', 'normal']; + var emphasisStyleAccessPath = ['itemStyle', 'emphasis']; + var normalLabelAccessPath = ['label', 'normal']; + var emphasisLabelAccessPath = ['label', 'emphasis']; + + symbolProto._updateCommon = function (data, idx, symbolSize) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath); + var color = data.getItemVisual(idx, 'color'); + + var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle(); + + symbolPath.rotation = itemModel.getShallow('symbolRotate') * Math.PI / 180 || 0; + + var symbolOffset = itemModel.getShallow('symbolOffset'); + if (symbolOffset) { + var pos = symbolPath.position; + pos[0] = numberUtil.parsePercent(symbolOffset[0], symbolSize[0]); + pos[1] = numberUtil.parsePercent(symbolOffset[1], symbolSize[1]); + } + + symbolPath.setColor(color); + + zrUtil.extend( + symbolPath.style, + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + normalItemStyleModel.getItemStyle(['color']) + ); + + var labelModel = itemModel.getModel(normalLabelAccessPath); + var hoverLabelModel = itemModel.getModel(emphasisLabelAccessPath); + + var elStyle = symbolPath.style; + + // Get last value dim + var dimensions = data.dimensions.slice(); + var valueDim = dimensions.pop(); + var dataType; + while ( + ((dataType = data.getDimensionInfo(valueDim).type) === 'ordinal') + || (dataType === 'time') + ) { + valueDim = dimensions.pop(); + } + + if (labelModel.get('show')) { + graphic.setText(elStyle, labelModel, color); + elStyle.text = zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'normal'), + data.get(valueDim, idx) + ); + } + else { + elStyle.text = ''; + } + + if (hoverLabelModel.getShallow('show')) { + graphic.setText(hoverStyle, hoverLabelModel, color); + hoverStyle.text = zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'emphasis'), + data.get(valueDim, idx) + ); + } + else { + hoverStyle.text = ''; + } + + var size = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + + symbolPath.off('mouseover') + .off('mouseout') + .off('emphasis') + .off('normal'); + + graphic.setHoverStyle(symbolPath, hoverStyle); + + if (itemModel.getShallow('hoverAnimation')) { + var onEmphasis = function() { + var ratio = size[1] / size[0]; + this.animateTo({ + scale: [ + Math.max(size[0] * 1.1, size[0] + 3), + Math.max(size[1] * 1.1, size[1] + 3 * ratio) + ] + }, 400, 'elasticOut'); + }; + var onNormal = function() { + this.animateTo({ + scale: size + }, 400, 'elasticOut'); + }; + symbolPath.on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + } + }; + + symbolProto.fadeOut = function (cb) { + var symbolPath = this.childAt(0); + // Not show text when animating + symbolPath.style.text = ''; + graphic.updateProps(symbolPath, { + scale: [0, 0] + }, this._seriesModel, cb); + }; + + zrUtil.inherits(Symbol, graphic.Group); + + module.exports = Symbol; + + +/***/ }, +/* 100 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Symbol factory + + + var graphic = __webpack_require__(42); + var BoundingRect = __webpack_require__(15); + + /** + * Triangle shape + * @inner + */ + var Triangle = graphic.extendShape({ + type: 'triangle', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy + height); + path.lineTo(cx - width, cy + height); + path.closePath(); + } + }); + /** + * Diamond shape + * @inner + */ + var Diamond = graphic.extendShape({ + type: 'diamond', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy); + path.lineTo(cx, cy + height); + path.lineTo(cx - width, cy); + path.closePath(); + } + }); + + /** + * Pin shape + * @inner + */ + var Pin = graphic.extendShape({ + type: 'pin', + shape: { + // x, y on the cusp + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (path, shape) { + var x = shape.x; + var y = shape.y; + var w = shape.width / 5 * 3; + // Height must be larger than width + var h = Math.max(w, shape.height); + var r = w / 2; + + // Dist on y with tangent point and circle center + var dy = r * r / (h - r); + var cy = y - h + r + dy; + var angle = Math.asin(dy / r); + // Dist on x with tangent point and circle center + var dx = Math.cos(angle) * r; + + var tanX = Math.sin(angle); + var tanY = Math.cos(angle); + + path.arc( + x, cy, r, + Math.PI - angle, + Math.PI * 2 + angle + ); + + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + path.bezierCurveTo( + x + dx - tanX * cpLen, cy + dy + tanY * cpLen, + x, y - cpLen2, + x, y + ); + path.bezierCurveTo( + x, y - cpLen2, + x - dx + tanX * cpLen, cy + dy + tanY * cpLen, + x - dx, cy + dy + ); + path.closePath(); + } + }); + + /** + * Arrow shape + * @inner + */ + var Arrow = graphic.extendShape({ + + type: 'arrow', + + shape: { + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (ctx, shape) { + var height = shape.height; + var width = shape.width; + var x = shape.x; + var y = shape.y; + var dx = width / 3 * 2; + ctx.moveTo(x, y); + ctx.lineTo(x + dx, y + height); + ctx.lineTo(x, y + height / 4 * 3); + ctx.lineTo(x - dx, y + height); + ctx.lineTo(x, y); + ctx.closePath(); + } + }); + + /** + * Map of path contructors + * @type {Object.} + */ + var symbolCtors = { + line: graphic.Line, + + rect: graphic.Rect, + + roundRect: graphic.Rect, + + square: graphic.Rect, + + circle: graphic.Circle, + + diamond: Diamond, + + pin: Pin, + + arrow: Arrow, + + triangle: Triangle + }; + + var symbolShapeMakers = { + + line: function (x, y, w, h, shape) { + // FIXME + shape.x1 = x; + shape.y1 = y + h / 2; + shape.x2 = x + w; + shape.y2 = y + h / 2; + }, + + rect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + }, + + roundRect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + shape.r = Math.min(w, h) / 4; + }, + + square: function (x, y, w, h, shape) { + var size = Math.min(w, h); + shape.x = x; + shape.y = y; + shape.width = size; + shape.height = size; + }, + + circle: function (x, y, w, h, shape) { + // Put circle in the center of square + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.r = Math.min(w, h) / 2; + }, + + diamond: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + }, + + pin: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + + arrow: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + + triangle: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + } + }; + + var symbolBuildProxies = {}; + for (var name in symbolCtors) { + symbolBuildProxies[name] = new symbolCtors[name](); + } + + var Symbol = graphic.extendShape({ + + type: 'symbol', + + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + + beforeBrush: function () { + var style = this.style; + var shape = this.shape; + // FIXME + if (shape.symbolType === 'pin' && style.textPosition === 'inside') { + style.textPosition = ['50%', '40%']; + style.textAlign = 'center'; + style.textVerticalAlign = 'middle'; + } + }, + + buildPath: function (ctx, shape) { + var symbolType = shape.symbolType; + var proxySymbol = symbolBuildProxies[symbolType]; + if (shape.symbolType !== 'none') { + if (!proxySymbol) { + // Default rect + symbolType = 'rect'; + proxySymbol = symbolBuildProxies[symbolType]; + } + symbolShapeMakers[symbolType]( + shape.x, shape.y, shape.width, shape.height, proxySymbol.shape + ); + proxySymbol.buildPath(ctx, proxySymbol.shape); + } + } + }); + + // Provide setColor helper method to avoid determine if set the fill or stroke outside + var symbolPathSetColor = function (color) { + if (this.type !== 'image') { + var symbolStyle = this.style; + var symbolShape = this.shape; + if (symbolShape && symbolShape.symbolType === 'line') { + symbolStyle.stroke = color; + } + else if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = '#fff'; + } + else { + // FIXME 判断图形默认是填充还是描边,使用 onlyStroke ? + symbolStyle.fill && (symbolStyle.fill = color); + symbolStyle.stroke && (symbolStyle.stroke = color); + } + this.dirty(); + } + }; + + var symbolUtil = { + /** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + * @param {string} symbolType + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + * @param {string} color + */ + createSymbol: function (symbolType, x, y, w, h, color) { + var isEmpty = symbolType.indexOf('empty') === 0; + if (isEmpty) { + symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); + } + var symbolPath; + + if (symbolType.indexOf('image://') === 0) { + symbolPath = new graphic.Image({ + style: { + image: symbolType.slice(8), + x: x, + y: y, + width: w, + height: h + } + }); + } + else if (symbolType.indexOf('path://') === 0) { + symbolPath = graphic.makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h)); + } + else { + symbolPath = new Symbol({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + + symbolPath.__isEmptyBrush = isEmpty; + + symbolPath.setColor = symbolPathSetColor; + + symbolPath.setColor(color); + + return symbolPath; + } + }; + + module.exports = symbolUtil; + + +/***/ }, +/* 101 */ +/***/ function(module, exports) { + + + + // var arrayDiff = require('zrender/lib/core/arrayDiff'); + // 'zrender/core/arrayDiff' has been used before, but it did + // not do well in performance when roam with fixed dataZoom window. + + function sign(val) { + return val >= 0 ? 1 : -1; + } + + function getStackedOnPoint(coordSys, data, idx) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = baseAxis.onZero + ? 0 : valueAxis.scale.getExtent()[0]; + + var valueDim = valueAxis.dim; + var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0; + + var stackedOnSameSign; + var stackedOn = data.stackedOn; + var val = data.get(valueDim, idx); + // Find first stacked value with same sign + while (stackedOn && + sign(stackedOn.get(valueDim, idx)) === sign(val) + ) { + stackedOnSameSign = stackedOn; + break; + } + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseAxis.dim, idx); + stackedData[1 - baseDataOffset] = stackedOnSameSign + ? stackedOnSameSign.get(valueDim, idx, true) : valueStart; + + return coordSys.dataToPoint(stackedData); + } + + // function convertToIntId(newIdList, oldIdList) { + // // Generate int id instead of string id. + // // Compare string maybe slow in score function of arrDiff + + // // Assume id in idList are all unique + // var idIndicesMap = {}; + // var idx = 0; + // for (var i = 0; i < newIdList.length; i++) { + // idIndicesMap[newIdList[i]] = idx; + // newIdList[i] = idx++; + // } + // for (var i = 0; i < oldIdList.length; i++) { + // var oldId = oldIdList[i]; + // // Same with newIdList + // if (idIndicesMap[oldId]) { + // oldIdList[i] = idIndicesMap[oldId]; + // } + // else { + // oldIdList[i] = idx++; + // } + // } + // } + + function diffData(oldData, newData) { + var diffResult = []; + + newData.diff(oldData) + .add(function (idx) { + diffResult.push({cmd: '+', idx: idx}); + }) + .update(function (newIdx, oldIdx) { + diffResult.push({cmd: '=', idx: oldIdx, idx1: newIdx}); + }) + .remove(function (idx) { + diffResult.push({cmd: '-', idx: idx}); + }) + .execute(); + + return diffResult; + } + + module.exports = function ( + oldData, newData, + oldStackedOnPoints, newStackedOnPoints, + oldCoordSys, newCoordSys + ) { + var diff = diffData(oldData, newData); + + // var newIdList = newData.mapArray(newData.getId); + // var oldIdList = oldData.mapArray(oldData.getId); + + // convertToIntId(newIdList, oldIdList); + + // // FIXME One data ? + // diff = arrayDiff(oldIdList, newIdList); + + var currPoints = []; + var nextPoints = []; + // Points for stacking base line + var currStackedPoints = []; + var nextStackedPoints = []; + + var status = []; + var sortedIndices = []; + var rawIndices = []; + var dims = newCoordSys.dimensions; + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + + // FIXME, animation is not so perfect when dataZoom window moves fast + // Which is in case remvoing or add more than one data in the tail or head + switch (diffItem.cmd) { + case '=': + var currentPt = oldData.getItemLayout(diffItem.idx); + var nextPt = newData.getItemLayout(diffItem.idx1); + // If previous data is NaN, use next point directly + if (isNaN(currentPt[0]) || isNaN(currentPt[1])) { + currentPt = nextPt.slice(); + } + currPoints.push(currentPt); + nextPoints.push(nextPt); + + currStackedPoints.push(oldStackedOnPoints[diffItem.idx]); + nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]); + + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + case '+': + var idx = diffItem.idx; + currPoints.push( + oldCoordSys.dataToPoint([ + newData.get(dims[0], idx, true), newData.get(dims[1], idx, true) + ]) + ); + + nextPoints.push(newData.getItemLayout(idx).slice()); + + currStackedPoints.push( + getStackedOnPoint(oldCoordSys, newData, idx) + ); + nextStackedPoints.push(newStackedOnPoints[idx]); + + rawIndices.push(newData.getRawIndex(idx)); + break; + case '-': + var idx = diffItem.idx; + var rawIndex = oldData.getRawIndex(idx); + // Data is replaced. In the case of dynamic data queue + // FIXME FIXME FIXME + if (rawIndex !== idx) { + currPoints.push(oldData.getItemLayout(idx)); + nextPoints.push(newCoordSys.dataToPoint([ + oldData.get(dims[0], idx, true), oldData.get(dims[1], idx, true) + ])); + + currStackedPoints.push(oldStackedOnPoints[idx]); + nextStackedPoints.push( + getStackedOnPoint( + newCoordSys, oldData, idx + ) + ); + + rawIndices.push(rawIndex); + } + else { + pointAdded = false; + } + } + + // Original indices + if (pointAdded) { + status.push(diffItem); + sortedIndices.push(sortedIndices.length); + } + } + + // Diff result may be crossed if all items are changed + // Sort by data index + sortedIndices.sort(function (a, b) { + return rawIndices[a] - rawIndices[b]; + }); + + var sortedCurrPoints = []; + var sortedNextPoints = []; + + var sortedCurrStackedPoints = []; + var sortedNextStackedPoints = []; + + var sortedStatus = []; + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + sortedCurrPoints[i] = currPoints[idx]; + sortedNextPoints[i] = nextPoints[idx]; + + sortedCurrStackedPoints[i] = currStackedPoints[idx]; + sortedNextStackedPoints[i] = nextStackedPoints[idx]; + + sortedStatus[i] = status[idx]; + } + + return { + current: sortedCurrPoints, + next: sortedNextPoints, + + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + + status: sortedStatus + }; + }; + + +/***/ }, +/* 102 */ +/***/ function(module, exports, __webpack_require__) { + + // Poly path support NaN point + + + var Path = __webpack_require__(44); + var vec2 = __webpack_require__(16); + + var vec2Min = vec2.min; + var vec2Max = vec2.max; + + var scaleAndAdd = vec2.scaleAndAdd; + var v2Copy = vec2.copy; + + // Temporary variable + var v = []; + var cp0 = []; + var cp1 = []; + + function drawSegment( + ctx, points, start, stop, len, + dir, smoothMin, smoothMax, smooth, smoothMonotone + ) { + var idx = start; + for (var k = 0; k < len; k++) { + var p = points[idx]; + if (idx >= stop || idx < 0 || isNaN(p[0]) || isNaN(p[1])) { + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]); + v2Copy(cp0, p); + } + else { + if (smooth > 0) { + var prevIdx = idx - dir; + var nextIdx = idx + dir; + + var ratioNextSeg = 0.5; + var prevP = points[prevIdx]; + var nextP = points[nextIdx]; + // Last point + if ((dir > 0 && (idx === len - 1 || isNaN(nextP[0]) || isNaN(nextP[1]))) + || (dir <= 0 && (idx === 0 || isNaN(nextP[0]) || isNaN(nextP[1]))) + ) { + v2Copy(cp1, p); + } + else { + // If next data is null + if (isNaN(nextP[0]) || isNaN(nextP[1])) { + nextP = p; + } + + vec2.sub(v, nextP, prevP); + + var lenPrevSeg; + var lenNextSeg; + if (smoothMonotone === 'x' || smoothMonotone === 'y') { + var dim = smoothMonotone === 'x' ? 0 : 1; + lenPrevSeg = Math.abs(p[dim] - prevP[dim]); + lenNextSeg = Math.abs(p[dim] - nextP[dim]); + } + else { + lenPrevSeg = vec2.dist(p, prevP); + lenNextSeg = vec2.dist(p, nextP); + } + + // Use ratio of seg length + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + + scaleAndAdd(cp1, p, v, -smooth * (1 - ratioNextSeg)); + } + // Smooth constraint + vec2Min(cp0, cp0, smoothMax); + vec2Max(cp0, cp0, smoothMin); + vec2Min(cp1, cp1, smoothMax); + vec2Max(cp1, cp1, smoothMin); + + ctx.bezierCurveTo( + cp0[0], cp0[1], + cp1[0], cp1[1], + p[0], p[1] + ); + // cp0 of next segment + scaleAndAdd(cp0, p, v, smooth * ratioNextSeg); + } + else { + ctx.lineTo(p[0], p[1]); + } + } + + idx += dir; + } + + return k; + } + + function getBoundingBox(points, smoothConstraint) { + var ptMin = [Infinity, Infinity]; + var ptMax = [-Infinity, -Infinity]; + if (smoothConstraint) { + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + if (pt[0] < ptMin[0]) { ptMin[0] = pt[0]; } + if (pt[1] < ptMin[1]) { ptMin[1] = pt[1]; } + if (pt[0] > ptMax[0]) { ptMax[0] = pt[0]; } + if (pt[1] > ptMax[1]) { ptMax[1] = pt[1]; } + } + } + return { + min: smoothConstraint ? ptMin : ptMax, + max: smoothConstraint ? ptMax : ptMin + }; + } + + module.exports = { + + Polyline: Path.extend({ + + type: 'ec-polyline', + + shape: { + points: [], + + smooth: 0, + + smoothConstraint: true, + + smoothMonotone: null + }, + + style: { + fill: null, + + stroke: '#000' + }, + + buildPath: function (ctx, shape) { + var points = shape.points; + + var i = 0; + var len = points.length; + + var result = getBoundingBox(points, shape.smoothConstraint); + + while (i < len) { + i += drawSegment( + ctx, points, i, len, len, + 1, result.min, result.max, shape.smooth, + shape.smoothMonotone + ) + 1; + } + } + }), + + Polygon: Path.extend({ + + type: 'ec-polygon', + + shape: { + points: [], + + // Offset between stacked base points and points + stackedOnPoints: [], + + smooth: 0, + + stackedOnSmooth: 0, + + smoothConstraint: true, + + smoothMonotone: null + }, + + buildPath: function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + + var i = 0; + var len = points.length; + var smoothMonotone = shape.smoothMonotone; + var bbox = getBoundingBox(points, shape.smoothConstraint); + var stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint); + while (i < len) { + var k = drawSegment( + ctx, points, i, len, len, + 1, bbox.min, bbox.max, shape.smooth, + smoothMonotone + ); + drawSegment( + ctx, stackedOnPoints, i + k - 1, len, k, + -1, stackedOnBBox.min, stackedOnBBox.max, shape.stackedOnSmooth, + smoothMonotone + ); + i += k + 1; + + ctx.closePath(); + } + } + }) + }; + + +/***/ }, +/* 103 */ +/***/ function(module, exports) { + + + + module.exports = function (seriesType, defaultSymbolType, legendSymbol, ecModel, api) { + + // Encoding visual for all series include which is filtered for legend drawing + ecModel.eachRawSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + + var symbolType = seriesModel.get('symbol') || defaultSymbolType; + var symbolSize = seriesModel.get('symbolSize'); + + data.setVisual({ + legendSymbol: legendSymbol || symbolType, + symbol: symbolType, + symbolSize: symbolSize + }); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + if (typeof symbolSize === 'function') { + data.each(function (idx) { + var rawValue = seriesModel.getRawValue(idx); + // FIXME + var params = seriesModel.getDataParams(idx); + data.setItemVisual(idx, 'symbolSize', symbolSize(rawValue, params)); + }); + } + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var itemSymbolType = itemModel.get('symbol', true); + var itemSymbolSize = itemModel.get('symbolSize', true); + // If has item symbol + if (itemSymbolType != null) { + data.setItemVisual(idx, 'symbol', itemSymbolType); + } + if (itemSymbolSize != null) { + // PENDING Transform symbolSize ? + data.setItemVisual(idx, 'symbolSize', itemSymbolSize); + } + }); + } + }); + }; + + +/***/ }, +/* 104 */ +/***/ function(module, exports) { + + + + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + + var dims = coordSys.dimensions; + data.each(dims, function (x, y, idx) { + var point; + if (!isNaN(x) && !isNaN(y)) { + point = coordSys.dataToPoint([x, y]); + } + else { + // Also {Array.}, not undefined to avoid if...else... statement + point = [NaN, NaN]; + } + + data.setItemLayout(idx, point); + }, true); + }); + }; + + +/***/ }, +/* 105 */ +/***/ function(module, exports) { + + + var samplers = { + average: function (frame) { + var sum = 0; + var count = 0; + for (var i = 0; i < frame.length; i++) { + if (!isNaN(frame[i])) { + sum += frame[i]; + count++; + } + } + // Return NaN if count is 0 + return count === 0 ? NaN : sum / count; + }, + sum: function (frame) { + var sum = 0; + for (var i = 0; i < frame.length; i++) { + // Ignore NaN + sum += frame[i] || 0; + } + return sum; + }, + max: function (frame) { + var max = -Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] > max && (max = frame[i]); + } + return max; + }, + min: function (frame) { + var min = Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } + return min; + } + }; + + var indexSampler = function (frame, value) { + return Math.round(frame.length / 2); + }; + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + // Only cartesian2d support down sampling + if (coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + // Coordinste system has been resized + var size = extent[1] - extent[0]; + var rate = Math.round(data.count() / size); + if (rate > 1) { + var sampler; + if (typeof sampling === 'string') { + sampler = samplers[sampling]; + } + else if (typeof sampling === 'function') { + sampler = sampling; + } + if (sampler) { + data = data.downSample( + valueAxis.dim, 1 / rate, sampler, indexSampler + ); + seriesModel.setData(data); + } + } + } + }, this); + }; + + +/***/ }, +/* 106 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + __webpack_require__(107); + + __webpack_require__(124); + + // Grid view + __webpack_require__(1).extendComponentView({ + + type: 'grid', + + render: function (gridModel, ecModel) { + this.group.removeAll(); + if (gridModel.get('show')) { + this.group.add(new graphic.Rect({ + shape:gridModel.coordinateSystem.getRect(), + style: zrUtil.defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true + })); + } + } + }); + + +/***/ }, +/* 107 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Grid is a region which contains at most 4 cartesian systems + * + * TODO Default cartesian + */ + var factory = exports; + + var layout = __webpack_require__(21); + var axisHelper = __webpack_require__(108); + + var zrUtil = __webpack_require__(3); + var Cartesian2D = __webpack_require__(114); + var Axis2D = __webpack_require__(116); + + var each = zrUtil.each; + + var ifAxisCrossZero = axisHelper.ifAxisCrossZero; + var niceScaleExtent = axisHelper.niceScaleExtent; + + // 依赖 GridModel, AxisModel 做预处理 + __webpack_require__(119); + + /** + * Check if the axis is used in the specified grid + * @inner + */ + function isAxisUsedInTheGrid(axisModel, gridModel, ecModel) { + return ecModel.getComponent('grid', axisModel.get('gridIndex')) === gridModel; + } + + function getLabelUnionRect(axis) { + var axisModel = axis.model; + var labels = axisModel.getFormattedLabels(); + var rect; + var step = 1; + var labelCount = labels.length; + if (labelCount > 40) { + // Simple optimization for large amount of labels + step = Math.ceil(labelCount / 40); + } + for (var i = 0; i < labelCount; i += step) { + if (!axis.isLabelIgnored(i)) { + var singleRect = axisModel.getTextRect(labels[i]); + // FIXME consider label rotate + rect ? rect.union(singleRect) : (rect = singleRect); + } + } + return rect; + } + + function Grid(gridModel, ecModel, api) { + /** + * @type {Object.} + * @private + */ + this._coordsMap = {}; + + /** + * @type {Array.} + * @private + */ + this._coordsList = []; + + /** + * @type {Object.} + * @private + */ + this._axesMap = {}; + + /** + * @type {Array.} + * @private + */ + this._axesList = []; + + this._initCartesian(gridModel, ecModel, api); + + this._model = gridModel; + } + + var gridProto = Grid.prototype; + + gridProto.type = 'grid'; + + gridProto.getRect = function () { + return this._rect; + }; + + gridProto.update = function (ecModel, api) { + + var axesMap = this._axesMap; + + this._updateScale(ecModel, this._model); + + function ifAxisCanNotOnZero(otherAxisDim) { + var axes = axesMap[otherAxisDim]; + for (var idx in axes) { + var axis = axes[idx]; + if (axis && (axis.type === 'category' || !ifAxisCrossZero(axis))) { + return true; + } + } + return false; + } + + each(axesMap.x, function (xAxis) { + niceScaleExtent(xAxis, xAxis.model); + }); + each(axesMap.y, function (yAxis) { + niceScaleExtent(yAxis, yAxis.model); + }); + // Fix configuration + each(axesMap.x, function (xAxis) { + // onZero can not be enabled in these two situations + // 1. When any other axis is a category axis + // 2. When any other axis not across 0 point + if (ifAxisCanNotOnZero('y')) { + xAxis.onZero = false; + } + }); + each(axesMap.y, function (yAxis) { + if (ifAxisCanNotOnZero('x')) { + yAxis.onZero = false; + } + }); + + // Resize again if containLabel is enabled + // FIXME It may cause getting wrong grid size in data processing stage + this.resize(this._model, api); + }; + + /** + * Resize the grid + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {module:echarts/ExtensionAPI} api + */ + gridProto.resize = function (gridModel, api) { + + var gridRect = layout.getLayoutRect( + gridModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + + this._rect = gridRect; + + var axesList = this._axesList; + + adjustAxes(); + + // Minus label size + if (gridModel.get('containLabel')) { + each(axesList, function (axis) { + if (!axis.model.get('axisLabel.inside')) { + var labelUnionRect = getLabelUnionRect(axis); + if (labelUnionRect) { + var dim = axis.isHorizontal() ? 'height' : 'width'; + var margin = axis.model.get('axisLabel.margin'); + gridRect[dim] -= labelUnionRect[dim] + margin; + if (axis.position === 'top') { + gridRect.y += labelUnionRect.height + margin; + } + else if (axis.position === 'left') { + gridRect.x += labelUnionRect.width + margin; + } + } + } + }); + + adjustAxes(); + } + + function adjustAxes() { + each(axesList, function (axis) { + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + updateAxisTransfrom(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } + }; + + /** + * @param {string} axisType + * @param {ndumber} [axisIndex] + */ + gridProto.getAxis = function (axisType, axisIndex) { + var axesMapOnDim = this._axesMap[axisType]; + if (axesMapOnDim != null) { + if (axisIndex == null) { + // Find first axis + for (var name in axesMapOnDim) { + return axesMapOnDim[name]; + } + } + return axesMapOnDim[axisIndex]; + } + }; + + gridProto.getCartesian = function (xAxisIndex, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + return this._coordsMap[key]; + }; + + /** + * Initialize cartesian coordinate systems + * @private + */ + gridProto._initCartesian = function (gridModel, ecModel, api) { + var axisPositionUsed = { + left: false, + right: false, + top: false, + bottom: false + }; + + var axesMap = { + x: {}, + y: {} + }; + var axesCount = { + x: 0, + y: 0 + }; + + /// Create axis + ecModel.eachComponent('xAxis', createAxisCreator('x'), this); + ecModel.eachComponent('yAxis', createAxisCreator('y'), this); + + if (!axesCount.x || !axesCount.y) { + // Roll back when there no either x or y axis + this._axesMap = {}; + this._axesList = []; + return; + } + + this._axesMap = axesMap; + + /// Create cartesian2d + each(axesMap.x, function (xAxis, xAxisIndex) { + each(axesMap.y, function (yAxis, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + var cartesian = new Cartesian2D(key); + + cartesian.grid = this; + + this._coordsMap[key] = cartesian; + this._coordsList.push(cartesian); + + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }, this); + }, this); + + function createAxisCreator(axisType) { + return function (axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel, ecModel)) { + return; + } + + var axisPosition = axisModel.get('position'); + if (axisType === 'x') { + // Fix position + if (axisPosition !== 'top' && axisPosition !== 'bottom') { + // Default bottom of X + axisPosition = 'bottom'; + } + if (axisPositionUsed[axisPosition]) { + axisPosition = axisPosition === 'top' ? 'bottom' : 'top'; + } + } + else { + // Fix position + if (axisPosition !== 'left' && axisPosition !== 'right') { + // Default left of Y + axisPosition = 'left'; + } + if (axisPositionUsed[axisPosition]) { + axisPosition = axisPosition === 'left' ? 'right' : 'left'; + } + } + axisPositionUsed[axisPosition] = true; + + var axis = new Axis2D( + axisType, axisHelper.createScaleByModel(axisModel), + [0, 0], + axisModel.get('type'), + axisPosition + ); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + + axis.onZero = axisModel.get('axisLine.onZero'); + + // Inject axis into axisModel + axisModel.axis = axis; + + // Inject axisModel into axis + axis.model = axisModel; + + // Index of axis, can be used as key + axis.index = idx; + + this._axesList.push(axis); + + axesMap[axisType][idx] = axis; + axesCount[axisType]++; + }; + } + }; + + /** + * Update cartesian properties from series + * @param {module:echarts/model/Option} option + * @private + */ + gridProto._updateScale = function (ecModel, gridModel) { + // Reset scale + zrUtil.each(this._axesList, function (axis) { + axis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'cartesian2d') { + var xAxisIndex = seriesModel.get('xAxisIndex'); + var yAxisIndex = seriesModel.get('yAxisIndex'); + + var xAxisModel = ecModel.getComponent('xAxis', xAxisIndex); + var yAxisModel = ecModel.getComponent('yAxis', yAxisIndex); + + if (!isAxisUsedInTheGrid(xAxisModel, gridModel, ecModel) + || !isAxisUsedInTheGrid(yAxisModel, gridModel, ecModel) + ) { + return; + } + + var cartesian = this.getCartesian(xAxisIndex, yAxisIndex); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + + if (data.type === 'list') { + unionExtent(data, xAxis, seriesModel); + unionExtent(data, yAxis, seriesModel); + } + } + }, this); + + function unionExtent(data, axis, seriesModel) { + each(seriesModel.coordDimToDataDim(axis.dim), function (dim) { + axis.scale.unionExtent(data.getDataExtent( + dim, axis.scale.type !== 'ordinal' + )); + }); + } + }; + + /** + * @inner + */ + function updateAxisTransfrom(axis, coordBase) { + var axisExtent = axis.getExtent(); + var axisExtentSum = axisExtent[0] + axisExtent[1]; + + // Fast transform + axis.toGlobalCoord = axis.dim === 'x' + ? function (coord) { + return coord + coordBase; + } + : function (coord) { + return axisExtentSum - coord + coordBase; + }; + axis.toLocalCoord = axis.dim === 'x' + ? function (coord) { + return coord - coordBase; + } + : function (coord) { + return axisExtentSum - coord + coordBase; + }; + } + + Grid.create = function (ecModel, api) { + var grids = []; + ecModel.eachComponent('grid', function (gridModel, idx) { + var grid = new Grid(gridModel, ecModel, api); + grid.name = 'grid_' + idx; + grid.resize(gridModel, api); + + gridModel.coordinateSystem = grid; + + grids.push(grid); + }); + + // Inject the coordinateSystems into seriesModel + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') !== 'cartesian2d') { + return; + } + var xAxisIndex = seriesModel.get('xAxisIndex'); + // TODO Validate + var xAxisModel = ecModel.getComponent('xAxis', xAxisIndex); + var grid = grids[xAxisModel.get('gridIndex')]; + seriesModel.coordinateSystem = grid.getCartesian( + xAxisIndex, seriesModel.get('yAxisIndex') + ); + }); + + return grids; + }; + + // For deciding which dimensions to use when creating list data + Grid.dimensions = Cartesian2D.prototype.dimensions; + + __webpack_require__(25).register('cartesian2d', Grid); + + module.exports = Grid; + + +/***/ }, +/* 108 */ +/***/ function(module, exports, __webpack_require__) { + + + + var OrdinalScale = __webpack_require__(109); + var IntervalScale = __webpack_require__(111); + __webpack_require__(112); + __webpack_require__(113); + var Scale = __webpack_require__(110); + + var numberUtil = __webpack_require__(7); + var zrUtil = __webpack_require__(3); + var textContain = __webpack_require__(14); + var axisHelper = {}; + + /** + * Get axis scale extent before niced. + */ + axisHelper.getScaleExtent = function (axis, model) { + var scale = axis.scale; + var originalExtent = scale.getExtent(); + var span = originalExtent[1] - originalExtent[0]; + if (scale.type === 'ordinal') { + // If series has no data, scale extent may be wrong + if (!isFinite(span)) { + return [0, 0]; + } + else { + return originalExtent; + } + } + var min = model.getMin ? model.getMin() : model.get('min'); + var max = model.getMax ? model.getMax() : model.get('max'); + var crossZero = model.getNeedCrossZero + ? model.getNeedCrossZero() : !model.get('scale'); + var boundaryGap = model.get('boundaryGap'); + if (!zrUtil.isArray(boundaryGap)) { + boundaryGap = [boundaryGap || 0, boundaryGap || 0]; + } + boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1); + boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1); + var fixMin = true; + var fixMax = true; + // Add boundary gap + if (min == null) { + min = originalExtent[0] - boundaryGap[0] * span; + fixMin = false; + } + if (max == null) { + max = originalExtent[1] + boundaryGap[1] * span; + fixMax = false; + } + // TODO Only one data + if (min === 'dataMin') { + min = originalExtent[0]; + } + if (max === 'dataMax') { + max = originalExtent[1]; + } + // Evaluate if axis needs cross zero + if (crossZero) { + // Axis is over zero and min is not set + if (min > 0 && max > 0 && !fixMin) { + min = 0; + } + // Axis is under zero and max is not set + if (min < 0 && max < 0 && !fixMax) { + max = 0; + } + } + return [min, max]; + }; + + axisHelper.niceScaleExtent = function (axis, model) { + var scale = axis.scale; + var extent = axisHelper.getScaleExtent(axis, model); + var fixMin = (model.getMin ? model.getMin() : model.get('min')) != null; + var fixMax = (model.getMax ? model.getMax() : model.get('max')) != null; + scale.setExtent(extent[0], extent[1]); + scale.niceExtent(model.get('splitNumber'), fixMin, fixMax); + + // If some one specified the min, max. And the default calculated interval + // is not good enough. He can specify the interval. It is often appeared + // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard + // to be 60. + // FIXME + var interval = model.get('interval'); + if (interval != null) { + scale.setInterval && scale.setInterval(interval); + } + }; + + /** + * @param {module:echarts/model/Model} model + * @param {string} [axisType] Default retrieve from model.type + * @return {module:echarts/scale/*} + */ + axisHelper.createScaleByModel = function(model, axisType) { + axisType = axisType || model.get('type'); + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale( + model.getCategories(), [Infinity, -Infinity] + ); + case 'value': + return new IntervalScale(); + // Extended scale, like time and log + default: + return (Scale.getClass(axisType) || IntervalScale).create(model); + } + } + }; + + /** + * Check if the axis corss 0 + */ + axisHelper.ifAxisCrossZero = function (axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !((min > 0 && max > 0) || (min < 0 && max < 0)); + }; + + /** + * @param {Array.} tickCoords In axis self coordinate. + * @param {Array.} labels + * @param {string} font + * @param {boolean} isAxisHorizontal + * @return {number} + */ + axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) { + // FIXME + // 不同角的axis和label,不只是horizontal和vertical. + + var textSpaceTakenRect; + var autoLabelInterval = 0; + var accumulatedLabelInterval = 0; + + var step = 1; + if (labels.length > 40) { + // Simple optimization for large amount of labels + step = Math.round(labels.length / 40); + } + for (var i = 0; i < tickCoords.length; i += step) { + var tickCoord = tickCoords[i]; + var rect = textContain.getBoundingRect( + labels[i], font, 'center', 'top' + ); + rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord; + rect[isAxisHorizontal ? 'width' : 'height'] *= 1.5; + if (!textSpaceTakenRect) { + textSpaceTakenRect = rect.clone(); + } + // There is no space for current label; + else if (textSpaceTakenRect.intersect(rect)) { + accumulatedLabelInterval++; + autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval); + } + else { + textSpaceTakenRect.union(rect); + // Reset + accumulatedLabelInterval = 0; + } + } + if (autoLabelInterval === 0 && step > 1) { + return step; + } + return autoLabelInterval * step; + }; + + /** + * @param {Object} axis + * @param {Function} labelFormatter + * @return {Array.} + */ + axisHelper.getFormattedLabels = function (axis, labelFormatter) { + var scale = axis.scale; + var labels = scale.getTicksLabels(); + var ticks = scale.getTicks(); + if (typeof labelFormatter === 'string') { + labelFormatter = (function (tpl) { + return function (val) { + return tpl.replace('{value}', val); + }; + })(labelFormatter); + return zrUtil.map(labels, labelFormatter); + } + else if (typeof labelFormatter === 'function') { + return zrUtil.map(ticks, function (tick, idx) { + return labelFormatter( + axis.type === 'category' ? scale.getLabel(tick) : tick, + idx + ); + }, this); + } + else { + return labels; + } + }; + + module.exports = axisHelper; + + +/***/ }, +/* 109 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Linear continuous scale + * @module echarts/coord/scale/Ordinal + * + * http://en.wikipedia.org/wiki/Level_of_measurement + */ + + // FIXME only one data + + + var zrUtil = __webpack_require__(3); + var Scale = __webpack_require__(110); + + var scaleProto = Scale.prototype; + + var OrdinalScale = Scale.extend({ + + type: 'ordinal', + + init: function (data, extent) { + this._data = data; + this._extent = extent || [0, data.length - 1]; + }, + + parse: function (val) { + return typeof val === 'string' + ? zrUtil.indexOf(this._data, val) + // val might be float. + : Math.round(val); + }, + + contain: function (rank) { + rank = this.parse(rank); + return scaleProto.contain.call(this, rank) + && this._data[rank] != null; + }, + + /** + * Normalize given rank or name to linear [0, 1] + * @param {number|string} [val] + * @return {number} + */ + normalize: function (val) { + return scaleProto.normalize.call(this, this.parse(val)); + }, + + scale: function (val) { + return Math.round(scaleProto.scale.call(this, val)); + }, + + /** + * @return {Array} + */ + getTicks: function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + + while (rank <= extent[1]) { + ticks.push(rank); + rank++; + } + + return ticks; + }, + + /** + * Get item on rank n + * @param {number} n + * @return {string} + */ + getLabel: function (n) { + return this._data[n]; + }, + + /** + * @return {number} + */ + count: function () { + return this._extent[1] - this._extent[0] + 1; + }, + + niceTicks: zrUtil.noop, + niceExtent: zrUtil.noop + }); + + /** + * @return {module:echarts/scale/Time} + */ + OrdinalScale.create = function () { + return new OrdinalScale(); + }; + + module.exports = OrdinalScale; + + +/***/ }, +/* 110 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * // Scale class management + * @module echarts/scale/Scale + */ + + + var clazzUtil = __webpack_require__(9); + + function Scale() { + /** + * Extent + * @type {Array.} + * @protected + */ + this._extent = [Infinity, -Infinity]; + + /** + * Step is calculated in adjustExtent + * @type {Array.} + * @protected + */ + this._interval = 0; + + this.init && this.init.apply(this, arguments); + } + + var scaleProto = Scale.prototype; + + /** + * Parse input val to valid inner number. + * @param {*} val + * @return {number} + */ + scaleProto.parse = function (val) { + // Notice: This would be a trap here, If the implementation + // of this method depends on extent, and this method is used + // before extent set (like in dataZoom), it would be wrong. + // Nevertheless, parse does not depend on extent generally. + return val; + }; + + scaleProto.contain = function (val) { + var extent = this._extent; + return val >= extent[0] && val <= extent[1]; + }; + + /** + * Normalize value to linear [0, 1], return 0.5 if extent span is 0 + * @param {number} val + * @return {number} + */ + scaleProto.normalize = function (val) { + var extent = this._extent; + if (extent[1] === extent[0]) { + return 0.5; + } + return (val - extent[0]) / (extent[1] - extent[0]); + }; + + /** + * Scale normalized value + * @param {number} val + * @return {number} + */ + scaleProto.scale = function (val) { + var extent = this._extent; + return val * (extent[1] - extent[0]) + extent[0]; + }; + + /** + * Set extent from data + * @param {Array.} other + */ + scaleProto.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); + }; + + /** + * Get extent + * @return {Array.} + */ + scaleProto.getExtent = function () { + return this._extent.slice(); + }; + + /** + * Set extent + * @param {number} start + * @param {number} end + */ + scaleProto.setExtent = function (start, end) { + var thisExtent = this._extent; + if (!isNaN(start)) { + thisExtent[0] = start; + } + if (!isNaN(end)) { + thisExtent[1] = end; + } + }; + + /** + * @return {Array.} + */ + scaleProto.getTicksLabels = function () { + var labels = []; + var ticks = this.getTicks(); + for (var i = 0; i < ticks.length; i++) { + labels.push(this.getLabel(ticks[i])); + } + return labels; + }; + + clazzUtil.enableClassExtend(Scale); + clazzUtil.enableClassManagement(Scale, { + registerWhenExtend: true + }); + + module.exports = Scale; + + +/***/ }, +/* 111 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Interval scale + * @module echarts/scale/Interval + */ + + + + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + var Scale = __webpack_require__(110); + + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + /** + * @alias module:echarts/coord/scale/Interval + * @constructor + */ + var IntervalScale = Scale.extend({ + + type: 'interval', + + _interval: 0, + + setExtent: function (start, end) { + var thisExtent = this._extent; + //start,end may be a Number like '25',so... + if (!isNaN(start)) { + thisExtent[0] = parseFloat(start); + } + if (!isNaN(end)) { + thisExtent[1] = parseFloat(end); + } + }, + + unionExtent: function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + + // unionExtent may called by it's sub classes + IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]); + }, + /** + * Get interval + */ + getInterval: function () { + if (!this._interval) { + this.niceTicks(); + } + return this._interval; + }, + + /** + * Set interval + */ + setInterval: function (interval) { + this._interval = interval; + // Dropped auto calculated niceExtent and use user setted extent + // We assume user wan't to set both interval, min, max to get a better result + this._niceExtent = this._extent.slice(); + }, + + /** + * @return {Array.} + */ + getTicks: function () { + if (!this._interval) { + this.niceTicks(); + } + var interval = this._interval; + var extent = this._extent; + var ticks = []; + + // Consider this case: using dataZoom toolbox, zoom and zoom. + var safeLimit = 10000; + + if (interval) { + var niceExtent = this._niceExtent; + if (extent[0] < niceExtent[0]) { + ticks.push(extent[0]); + } + var tick = niceExtent[0]; + while (tick <= niceExtent[1]) { + ticks.push(tick); + // Avoid rounding error + tick = numberUtil.round(tick + interval); + if (ticks.length > safeLimit) { + return []; + } + } + if (extent[1] > niceExtent[1]) { + ticks.push(extent[1]); + } + } + + return ticks; + }, + + /** + * @return {Array.} + */ + getTicksLabels: function () { + var labels = []; + var ticks = this.getTicks(); + for (var i = 0; i < ticks.length; i++) { + labels.push(this.getLabel(ticks[i])); + } + return labels; + }, + + /** + * @param {number} n + * @return {number} + */ + getLabel: function (data) { + return formatUtil.addCommas(data); + }, + + /** + * Update interval and extent of intervals for nice ticks + * + * @param {number} [splitNumber = 5] Desired number of ticks + */ + niceTicks: function (splitNumber) { + splitNumber = splitNumber || 5; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (!isFinite(span)) { + return; + } + // User may set axis min 0 and data are all negative + // FIXME If it needs to reverse ? + if (span < 0) { + span = -span; + extent.reverse(); + } + + // From "Nice Numbers for Graph Labels" of Graphic Gems + // var niceSpan = numberUtil.nice(span, false); + var step = numberUtil.nice(span / splitNumber, true); + + // Niced extent inside original extent + var niceExtent = [ + numberUtil.round(mathCeil(extent[0] / step) * step), + numberUtil.round(mathFloor(extent[1] / step) * step) + ]; + + this._interval = step; + this._niceExtent = niceExtent; + }, + + /** + * Nice extent. + * @param {number} [splitNumber = 5] Given approx tick number + * @param {boolean} [fixMin=false] + * @param {boolean} [fixMax=false] + */ + niceExtent: function (splitNumber, fixMin, fixMax) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + if (extent[0] !== 0) { + // Expand extent + var expandSize = extent[0] / 2; + extent[0] -= expandSize; + extent[1] += expandSize; + } + else { + extent[1] = 1; + } + } + var span = extent[1] - extent[0]; + // If there are no data and extent are [Infinity, -Infinity] + if (!isFinite(span)) { + extent[0] = 0; + extent[1] = 1; + } + + this.niceTicks(splitNumber); + + // var extent = this._extent; + var interval = this._interval; + + if (!fixMin) { + extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval); + } + if (!fixMax) { + extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval); + } + } + }); + + /** + * @return {module:echarts/scale/Time} + */ + IntervalScale.create = function () { + return new IntervalScale(); + }; + + module.exports = IntervalScale; + + + +/***/ }, +/* 112 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Interval scale + * @module echarts/coord/scale/Time + */ + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + + var IntervalScale = __webpack_require__(111); + + var intervalScaleProto = IntervalScale.prototype; + + var mathCeil = Math.ceil; + var mathFloor = Math.floor; + var ONE_DAY = 3600000 * 24; + + // FIXME 公用? + var bisect = function (a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + if (a[mid][2] < x) { + lo = mid + 1; + } + else { + hi = mid; + } + } + return lo; + }; + + /** + * @alias module:echarts/coord/scale/Time + * @constructor + */ + var TimeScale = IntervalScale.extend({ + type: 'time', + + // Overwrite + getLabel: function (val) { + var stepLvl = this._stepLvl; + + var date = new Date(val); + + return formatUtil.formatTime(stepLvl[0], date); + }, + + // Overwrite + niceExtent: function (approxTickNum, fixMin, fixMax) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + // Expand extent + extent[0] -= ONE_DAY; + extent[1] += ONE_DAY; + } + // If there are no data and extent are [Infinity, -Infinity] + if (extent[1] === -Infinity && extent[0] === Infinity) { + var d = new Date(); + extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate()); + extent[0] = extent[1] - ONE_DAY; + } + + this.niceTicks(approxTickNum, fixMin, fixMax); + + // var extent = this._extent; + var interval = this._interval; + + if (!fixMin) { + extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval); + } + if (!fixMax) { + extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval); + } + }, + + // Overwrite + niceTicks: function (approxTickNum) { + approxTickNum = approxTickNum || 10; + + var extent = this._extent; + var span = extent[1] - extent[0]; + var approxInterval = span / approxTickNum; + var scaleLevelsLen = scaleLevels.length; + var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen); + + var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)]; + var interval = level[2]; + // Same with interval scale if span is much larger than 1 year + if (level[0] === 'year') { + var yearSpan = span / interval; + + // From "Nice Numbers for Graph Labels" of Graphic Gems + // var niceYearSpan = numberUtil.nice(yearSpan, false); + var yearStep = numberUtil.nice(yearSpan / approxTickNum, true); + + interval *= yearStep; + } + + var niceExtent = [ + mathCeil(extent[0] / interval) * interval, + mathFloor(extent[1] / interval) * interval + ]; + + this._stepLvl = level; + // Interval will be used in getTicks + this._interval = interval; + this._niceExtent = niceExtent; + }, + + parse: function (val) { + // val might be float. + return +numberUtil.parseDate(val); + } + }); + + zrUtil.each(['contain', 'normalize'], function (methodName) { + TimeScale.prototype[methodName] = function (val) { + return intervalScaleProto[methodName].call(this, this.parse(val)); + }; + }); + + // Steps from d3 + var scaleLevels = [ + // Format step interval + ['hh:mm:ss', 1, 1000], // 1s + ['hh:mm:ss', 5, 1000 * 5], // 5s + ['hh:mm:ss', 10, 1000 * 10], // 10s + ['hh:mm:ss', 15, 1000 * 15], // 15s + ['hh:mm:ss', 30, 1000 * 30], // 30s + ['hh:mm\nMM-dd',1, 60000], // 1m + ['hh:mm\nMM-dd',5, 60000 * 5], // 5m + ['hh:mm\nMM-dd',10, 60000 * 10], // 10m + ['hh:mm\nMM-dd',15, 60000 * 15], // 15m + ['hh:mm\nMM-dd',30, 60000 * 30], // 30m + ['hh:mm\nMM-dd',1, 3600000], // 1h + ['hh:mm\nMM-dd',2, 3600000 * 2], // 2h + ['hh:mm\nMM-dd',6, 3600000 * 6], // 6h + ['hh:mm\nMM-dd',12, 3600000 * 12], // 12h + ['MM-dd\nyyyy', 1, ONE_DAY], // 1d + ['week', 7, ONE_DAY * 7], // 7d + ['month', 1, ONE_DAY * 31], // 1M + ['quarter', 3, ONE_DAY * 380 / 4], // 3M + ['half-year', 6, ONE_DAY * 380 / 2], // 6M + ['year', 1, ONE_DAY * 380] // 1Y + ]; + + /** + * @return {module:echarts/scale/Time} + */ + TimeScale.create = function () { + return new TimeScale(); + }; + + module.exports = TimeScale; + + +/***/ }, +/* 113 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Log scale + * @module echarts/scale/Log + */ + + + var zrUtil = __webpack_require__(3); + var Scale = __webpack_require__(110); + var numberUtil = __webpack_require__(7); + + // Use some method of IntervalScale + var IntervalScale = __webpack_require__(111); + + var scaleProto = Scale.prototype; + var intervalScaleProto = IntervalScale.prototype; + + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + var mathPow = Math.pow; + + var LOG_BASE = 10; + var mathLog = Math.log; + + var LogScale = Scale.extend({ + + type: 'log', + + /** + * @return {Array.} + */ + getTicks: function () { + return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) { + return numberUtil.round(mathPow(LOG_BASE, val)); + }); + }, + + /** + * @param {number} val + * @return {string} + */ + getLabel: intervalScaleProto.getLabel, + + /** + * @param {number} val + * @return {number} + */ + scale: function (val) { + val = scaleProto.scale.call(this, val); + return mathPow(LOG_BASE, val); + }, + + /** + * @param {number} start + * @param {number} end + */ + setExtent: function (start, end) { + start = mathLog(start) / mathLog(LOG_BASE); + end = mathLog(end) / mathLog(LOG_BASE); + intervalScaleProto.setExtent.call(this, start, end); + }, + + /** + * @return {number} end + */ + getExtent: function () { + var extent = scaleProto.getExtent.call(this); + extent[0] = mathPow(LOG_BASE, extent[0]); + extent[1] = mathPow(LOG_BASE, extent[1]); + return extent; + }, + + /** + * @param {Array.} extent + */ + unionExtent: function (extent) { + extent[0] = mathLog(extent[0]) / mathLog(LOG_BASE); + extent[1] = mathLog(extent[1]) / mathLog(LOG_BASE); + scaleProto.unionExtent.call(this, extent); + }, + + /** + * Update interval and extent of intervals for nice ticks + * @param {number} [approxTickNum = 10] Given approx tick number + */ + niceTicks: function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (span === Infinity || span <= 0) { + return; + } + + var interval = mathPow(10, mathFloor(mathLog(span / approxTickNum) / Math.LN10)); + var err = approxTickNum / span * interval; + + // Filter ticks to get closer to the desired count. + if (err <= 0.5) { + interval *= 10; + } + var niceExtent = [ + numberUtil.round(mathCeil(extent[0] / interval) * interval), + numberUtil.round(mathFloor(extent[1] / interval) * interval) + ]; + + this._interval = interval; + this._niceExtent = niceExtent; + }, + + /** + * Nice extent. + * @param {number} [approxTickNum = 10] Given approx tick number + * @param {boolean} [fixMin=false] + * @param {boolean} [fixMax=false] + */ + niceExtent: intervalScaleProto.niceExtent + }); + + zrUtil.each(['contain', 'normalize'], function (methodName) { + LogScale.prototype[methodName] = function (val) { + val = mathLog(val) / mathLog(LOG_BASE); + return scaleProto[methodName].call(this, val); + }; + }); + + LogScale.create = function () { + return new LogScale(); + }; + + module.exports = LogScale; + + +/***/ }, +/* 114 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var Cartesian = __webpack_require__(115); + + function Cartesian2D(name) { + + Cartesian.call(this, name); + } + + Cartesian2D.prototype = { + + constructor: Cartesian2D, + + type: 'cartesian2d', + + /** + * @type {Array.} + * @readOnly + */ + dimensions: ['x', 'y'], + + /** + * Base axis will be used on stacking. + * + * @return {module:echarts/coord/cartesian/Axis2D} + */ + getBaseAxis: function () { + return this.getAxesByScale('ordinal')[0] + || this.getAxesByScale('time')[0] + || this.getAxis('x'); + }, + + /** + * If contain point + * @param {Array.} point + * @return {boolean} + */ + containPoint: function (point) { + var axisX = this.getAxis('x'); + var axisY = this.getAxis('y'); + return axisX.contain(axisX.toLocalCoord(point[0])) + && axisY.contain(axisY.toLocalCoord(point[1])); + }, + + /** + * If contain data + * @param {Array.} data + * @return {boolean} + */ + containData: function (data) { + return this.getAxis('x').containData(data[0]) + && this.getAxis('y').containData(data[1]); + }, + + /** + * Convert series data to an array of points + * @param {module:echarts/data/List} data + * @param {boolean} stack + * @return {Array} + * Return array of points. For example: + * `[[10, 10], [20, 20], [30, 30]]` + */ + dataToPoints: function (data, stack) { + return data.mapArray(['x', 'y'], function (x, y) { + return this.dataToPoint([x, y]); + }, stack, this); + }, + + /** + * @param {Array.} data + * @param {boolean} [clamp=false] + * @return {Array.} + */ + dataToPoint: function (data, clamp) { + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + return [ + xAxis.toGlobalCoord(xAxis.dataToCoord(data[0], clamp)), + yAxis.toGlobalCoord(yAxis.dataToCoord(data[1], clamp)) + ]; + }, + + /** + * @param {Array.} point + * @param {boolean} [clamp=false] + * @return {Array.} + */ + pointToData: function (point, clamp) { + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + return [ + xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp), + yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp) + ]; + }, + + /** + * Get other axis + * @param {module:echarts/coord/cartesian/Axis2D} axis + */ + getOtherAxis: function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + } + }; + + zrUtil.inherits(Cartesian2D, Cartesian); + + module.exports = Cartesian2D; + + +/***/ }, +/* 115 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Cartesian coordinate system + * @module echarts/coord/Cartesian + * + */ + + + var zrUtil = __webpack_require__(3); + + function dimAxisMapper(dim) { + return this._axes[dim]; + } + + /** + * @alias module:echarts/coord/Cartesian + * @constructor + */ + var Cartesian = function (name) { + this._axes = {}; + + this._dimList = []; + + /** + * @type {string} + */ + this.name = name || ''; + }; + + Cartesian.prototype = { + + constructor: Cartesian, + + type: 'cartesian', + + /** + * Get axis + * @param {number|string} dim + * @return {module:echarts/coord/Cartesian~Axis} + */ + getAxis: function (dim) { + return this._axes[dim]; + }, + + /** + * Get axes list + * @return {Array.} + */ + getAxes: function () { + return zrUtil.map(this._dimList, dimAxisMapper, this); + }, + + /** + * Get axes list by given scale type + */ + getAxesByScale: function (scaleType) { + scaleType = scaleType.toLowerCase(); + return zrUtil.filter( + this.getAxes(), + function (axis) { + return axis.scale.type === scaleType; + } + ); + }, + + /** + * Add axis + * @param {module:echarts/coord/Cartesian.Axis} + */ + addAxis: function (axis) { + var dim = axis.dim; + + this._axes[dim] = axis; + + this._dimList.push(dim); + }, + + /** + * Convert data to coord in nd space + * @param {Array.|Object.} val + * @return {Array.|Object.} + */ + dataToCoord: function (val) { + return this._dataCoordConvert(val, 'dataToCoord'); + }, + + /** + * Convert coord in nd space to data + * @param {Array.|Object.} val + * @return {Array.|Object.} + */ + coordToData: function (val) { + return this._dataCoordConvert(val, 'coordToData'); + }, + + _dataCoordConvert: function (input, method) { + var dimList = this._dimList; + + var output = input instanceof Array ? [] : {}; + + for (var i = 0; i < dimList.length; i++) { + var dim = dimList[i]; + var axis = this._axes[dim]; + + output[dim] = axis[method](input[dim]); + } + + return output; + } + }; + + module.exports = Cartesian; + + +/***/ }, +/* 116 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var Axis = __webpack_require__(117); + var axisLabelInterval = __webpack_require__(118); + + /** + * Extend axis 2d + * @constructor module:echarts/coord/cartesian/Axis2D + * @extends {module:echarts/coord/cartesian/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.} coordExtent + * @param {string} axisType + * @param {string} position + */ + var Axis2D = function (dim, scale, coordExtent, axisType, position) { + Axis.call(this, dim, scale, coordExtent); + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * Axis position + * - 'top' + * - 'bottom' + * - 'left' + * - 'right' + */ + this.position = position || 'bottom'; + }; + + Axis2D.prototype = { + + constructor: Axis2D, + + /** + * Index of axis, can be used as key + */ + index: 0, + /** + * If axis is on the zero position of the other axis + * @type {boolean} + */ + onZero: false, + + /** + * Axis model + * @param {module:echarts/coord/cartesian/AxisModel} + */ + model: null, + + isHorizontal: function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }, + + getGlobalExtent: function () { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + return ret; + }, + + /** + * @return {number} + */ + getLabelInterval: function () { + var labelInterval = this._labelInterval; + if (!labelInterval) { + labelInterval = this._labelInterval = axisLabelInterval(this); + } + return labelInterval; + }, + + /** + * If label is ignored. + * Automatically used when axis is category and label can not be all shown + * @param {number} idx + * @return {boolean} + */ + isLabelIgnored: function (idx) { + if (this.type === 'category') { + var labelInterval = this.getLabelInterval(); + return ((typeof labelInterval === 'function') + && !labelInterval(idx, this.scale.getLabel(idx))) + || idx % (labelInterval + 1); + } + }, + + /** + * Transform global coord to local coord, + * i.e. var localCoord = axis.toLocalCoord(80); + * designate by module:echarts/coord/cartesian/Grid. + * @type {Function} + */ + toLocalCoord: null, + + /** + * Transform global coord to local coord, + * i.e. var globalCoord = axis.toLocalCoord(40); + * designate by module:echarts/coord/cartesian/Grid. + * @type {Function} + */ + toGlobalCoord: null + + }; + zrUtil.inherits(Axis2D, Axis); + + module.exports = Axis2D; + + +/***/ }, +/* 117 */ +/***/ function(module, exports, __webpack_require__) { + + + + var numberUtil = __webpack_require__(7); + var linearMap = numberUtil.linearMap; + var zrUtil = __webpack_require__(3); + + function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; + } + + var normalizedExtent = [0, 1]; + /** + * @name module:echarts/coord/CartesianAxis + * @constructor + */ + var Axis = function (dim, scale, extent) { + + /** + * Axis dimension. Such as 'x', 'y', 'z', 'angle', 'radius' + * @type {string} + */ + this.dim = dim; + + /** + * Axis scale + * @type {module:echarts/coord/scale/*} + */ + this.scale = scale; + + /** + * @type {Array.} + * @private + */ + this._extent = extent || [0, 0]; + + /** + * @type {boolean} + */ + this.inverse = false; + + /** + * Usually true when axis has a ordinal scale + * @type {boolean} + */ + this.onBand = false; + }; + + Axis.prototype = { + + constructor: Axis, + + /** + * If axis extent contain given coord + * @param {number} coord + * @return {boolean} + */ + contain: function (coord) { + var extent = this._extent; + var min = Math.min(extent[0], extent[1]); + var max = Math.max(extent[0], extent[1]); + return coord >= min && coord <= max; + }, + + /** + * If axis extent contain given data + * @param {number} data + * @return {boolean} + */ + containData: function (data) { + return this.contain(this.dataToCoord(data)); + }, + + /** + * Get coord extent. + * @return {Array.} + */ + getExtent: function () { + var ret = this._extent.slice(); + return ret; + }, + + /** + * Get precision used for formatting + * @param {Array.} [dataExtent] + * @return {number} + */ + getPixelPrecision: function (dataExtent) { + return numberUtil.getPixelPrecision( + dataExtent || this.scale.getExtent(), + this._extent + ); + }, + + /** + * Set coord extent + * @param {number} start + * @param {number} end + */ + setExtent: function (start, end) { + var extent = this._extent; + extent[0] = start; + extent[1] = end; + }, + + /** + * Convert data to coord. Data is the rank if it has a ordinal scale + * @param {number} data + * @param {boolean} clamp + * @return {number} + */ + dataToCoord: function (data, clamp) { + var extent = this._extent; + var scale = this.scale; + data = scale.normalize(data); + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + return linearMap(data, normalizedExtent, extent, clamp); + }, + + /** + * Convert coord to data. Data is the rank if it has a ordinal scale + * @param {number} coord + * @param {boolean} clamp + * @return {number} + */ + coordToData: function (coord, clamp) { + var extent = this._extent; + var scale = this.scale; + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + var t = linearMap(coord, extent, normalizedExtent, clamp); + + return this.scale.scale(t); + }, + /** + * @return {Array.} + */ + getTicksCoords: function () { + if (this.onBand) { + var bands = this.getBands(); + var coords = []; + for (var i = 0; i < bands.length; i++) { + coords.push(bands[i][0]); + } + if (bands[i - 1]) { + coords.push(bands[i - 1][1]); + } + return coords; + } + else { + return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this); + } + }, + + /** + * Coords of labels are on the ticks or on the middle of bands + * @return {Array.} + */ + getLabelsCoords: function () { + if (this.onBand) { + var bands = this.getBands(); + var coords = []; + var band; + for (var i = 0; i < bands.length; i++) { + band = bands[i]; + coords.push((band[0] + band[1]) / 2); + } + return coords; + } + else { + return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this); + } + }, + + /** + * Get bands. + * + * If axis has labels [1, 2, 3, 4]. Bands on the axis are + * |---1---|---2---|---3---|---4---|. + * + * @return {Array} + */ + // FIXME Situation when labels is on ticks + getBands: function () { + var extent = this.getExtent(); + var bands = []; + var len = this.scale.count(); + var start = extent[0]; + var end = extent[1]; + var span = end - start; + + for (var i = 0; i < len; i++) { + bands.push([ + span * i / len + start, + span * (i + 1) / len + start + ]); + } + return bands; + }, + + /** + * Get width of band + * @return {number} + */ + getBandWidth: function () { + var axisExtent = this._extent; + var dataExtent = this.scale.getExtent(); + + var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); + // Fix #2728, avoid NaN when only one data. + len === 0 && (len = 1); + + var size = Math.abs(axisExtent[1] - axisExtent[0]); + + return Math.abs(size) / len; + } + }; + + module.exports = Axis; + + +/***/ }, +/* 118 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Helper function for axisLabelInterval calculation + */ + + + + var zrUtil = __webpack_require__(3); + var axisHelper = __webpack_require__(108); + + module.exports = function (axis) { + var axisModel = axis.model; + var labelModel = axisModel.getModel('axisLabel'); + var labelInterval = labelModel.get('interval'); + if (!(axis.type === 'category' && labelInterval === 'auto')) { + return labelInterval === 'auto' ? 0 : labelInterval; + } + + return axisHelper.getAxisLabelInterval( + zrUtil.map(axis.scale.getTicks(), axis.dataToCoord, axis), + axisModel.getFormattedLabels(), + labelModel.getModel('textStyle').getFont(), + axis.isHorizontal() + ); + }; + + +/***/ }, +/* 119 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Grid 是在有直角坐标系的时候必须要存在的 + // 所以这里也要被 Cartesian2D 依赖 + + + __webpack_require__(120); + var ComponentModel = __webpack_require__(19); + + module.exports = ComponentModel.extend({ + + type: 'grid', + + dependencies: ['xAxis', 'yAxis'], + + layoutMode: 'box', + + /** + * @type {module:echarts/coord/cartesian/Grid} + */ + coordinateSystem: null, + + defaultOption: { + show: false, + zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 60, + // If grid size contain label + containLabel: false, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 1, + borderColor: '#ccc' + } + }); + + +/***/ }, +/* 120 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var ComponentModel = __webpack_require__(19); + var zrUtil = __webpack_require__(3); + var axisModelCreator = __webpack_require__(121); + + var AxisModel = ComponentModel.extend({ + + type: 'cartesian2dAxis', + + /** + * @type {module:echarts/coord/cartesian/Axis2D} + */ + axis: null, + + /** + * @override + */ + init: function () { + AxisModel.superApply(this, 'init', arguments); + this._resetRange(); + }, + + /** + * @override + */ + mergeOption: function () { + AxisModel.superApply(this, 'mergeOption', arguments); + this._resetRange(); + }, + + /** + * @override + */ + restoreData: function () { + AxisModel.superApply(this, 'restoreData', arguments); + this._resetRange(); + }, + + /** + * @public + * @param {number} rangeStart + * @param {number} rangeEnd + */ + setRange: function (rangeStart, rangeEnd) { + this.option.rangeStart = rangeStart; + this.option.rangeEnd = rangeEnd; + }, + + /** + * @public + * @return {Array.} + */ + getMin: function () { + var option = this.option; + return option.rangeStart != null ? option.rangeStart : option.min; + }, + + /** + * @public + * @return {Array.} + */ + getMax: function () { + var option = this.option; + return option.rangeEnd != null ? option.rangeEnd : option.max; + }, + + /** + * @public + * @return {boolean} + */ + getNeedCrossZero: function () { + var option = this.option; + return (option.rangeStart != null || option.rangeEnd != null) + ? false : !option.scale; + }, + + /** + * @private + */ + _resetRange: function () { + // rangeStart and rangeEnd is readonly. + this.option.rangeStart = this.option.rangeEnd = null; + } + + }); + + function getAxisType(axisDim, option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); + } + + zrUtil.merge(AxisModel.prototype, __webpack_require__(123)); + + var extraOption = { + gridIndex: 0 + }; + + axisModelCreator('x', AxisModel, getAxisType, extraOption); + axisModelCreator('y', AxisModel, getAxisType, extraOption); + + module.exports = AxisModel; + + +/***/ }, +/* 121 */ +/***/ function(module, exports, __webpack_require__) { + + + + var axisDefault = __webpack_require__(122); + var zrUtil = __webpack_require__(3); + var ComponentModel = __webpack_require__(19); + var layout = __webpack_require__(21); + + // FIXME axisType is fixed ? + var AXIS_TYPES = ['value', 'category', 'time', 'log']; + + /** + * Generate sub axis model class + * @param {string} axisName 'x' 'y' 'radius' 'angle' 'parallel' + * @param {module:echarts/model/Component} BaseAxisModelClass + * @param {Function} axisTypeDefaulter + * @param {Object} [extraDefaultOption] + */ + module.exports = function (axisName, BaseAxisModelClass, axisTypeDefaulter, extraDefaultOption) { + + zrUtil.each(AXIS_TYPES, function (axisType) { + + BaseAxisModelClass.extend({ + + type: axisName + 'Axis.' + axisType, + + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? layout.getLayoutParams(option) : {}; + + var themeModel = ecModel.getTheme(); + zrUtil.merge(option, themeModel.get(axisType + 'Axis')); + zrUtil.merge(option, this.getDefaultOption()); + + option.type = axisTypeDefaulter(axisName, option); + + if (layoutMode) { + layout.mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + defaultOption: zrUtil.mergeAll( + [ + {}, + axisDefault[axisType + 'Axis'], + extraDefaultOption + ], + true + ) + }); + }); + + ComponentModel.registerSubTypeDefaulter( + axisName + 'Axis', + zrUtil.curry(axisTypeDefaulter, axisName) + ); + }; + + +/***/ }, +/* 122 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var defaultOption = { + show: true, + zlevel: 0, // 一级层叠 + z: 0, // 二级层叠 + // 反向坐标轴 + inverse: false, + // 坐标轴名字,默认为空 + name: '', + // 坐标轴名字位置,支持'start' | 'middle' | 'end' + nameLocation: 'end', + // 坐标轴文字样式,默认取全局样式 + nameTextStyle: {}, + // 文字与轴线距离 + nameGap: 15, + // 坐标轴线 + axisLine: { + // 默认显示,属性show控制显示与否 + show: true, + onZero: true, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#333', + width: 1, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认显示 + show: true, + // 控制小标记是否在grid里 + inside: false, + // 属性length控制线长 + length: 5, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#333', + width: 1 + } + }, + // 坐标轴文本标签,详见axis.axisLabel + axisLabel: { + show: true, + // 控制文本标签是否在grid里 + inside: false, + rotate: 0, + margin: 8, + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + textStyle: { + color: '#333', + fontSize: 12 + } + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: ['#ccc'], + width: 1, + type: 'solid' + } + }, + // 分隔区域 + splitArea: { + // 默认不显示,属性show控制显示与否 + show: false, + // 属性areaStyle(详见areaStyle)控制区域样式 + areaStyle: { + color: ['rgba(250,250,250,0.3)','rgba(200,200,200,0.3)'] + } + } + }; + + var categoryAxis = zrUtil.merge({ + // 类目起始和结束两端空白策略 + boundaryGap: true, + // 坐标轴小标记 + axisTick: { + interval: 'auto' + }, + // 坐标轴文本标签,详见axis.axisLabel + axisLabel: { + interval: 'auto' + } + }, defaultOption); + + var valueAxis = zrUtil.defaults({ + // 数值起始和结束两端空白策略 + boundaryGap: [0, 0], + // 最小值, 设置成 'dataMin' 则从数据中计算最小值 + // min: null, + // 最大值,设置成 'dataMax' 则从数据中计算最大值 + // max: null, + // Readonly prop, specifies start value of the range when using data zoom. + // rangeStart: null + // Readonly prop, specifies end value of the range when using data zoom. + // rangeEnd: null + // 脱离0值比例,放大聚焦到最终_min,_max区间 + // scale: false, + // 分割段数,默认为5 + splitNumber: 5 + }, defaultOption); + + // FIXME + var timeAxis = zrUtil.defaults({ + scale: true, + min: 'dataMin', + max: 'dataMax' + }, valueAxis); + var logAxis = zrUtil.defaults({}, valueAxis); + logAxis.scale = true; + + module.exports = { + categoryAxis: categoryAxis, + valueAxis: valueAxis, + timeAxis: timeAxis, + logAxis: logAxis + }; + + +/***/ }, +/* 123 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var axisHelper = __webpack_require__(108); + + function getName(obj) { + if (zrUtil.isObject(obj) && obj.value != null) { + return obj.value; + } + else { + return obj; + } + } + /** + * Get categories + */ + function getCategories() { + return this.get('type') === 'category' + && zrUtil.map(this.get('data'), getName); + } + + /** + * Format labels + * @return {Array.} + */ + function getFormattedLabels() { + return axisHelper.getFormattedLabels( + this.axis, + this.get('axisLabel.formatter') + ); + } + + module.exports = { + + getFormattedLabels: getFormattedLabels, + + getCategories: getCategories + }; + + +/***/ }, +/* 124 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // TODO boundaryGap + + + __webpack_require__(120); + + __webpack_require__(125); + + +/***/ }, +/* 125 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var AxisBuilder = __webpack_require__(126); + var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick; + var getInterval = AxisBuilder.getInterval; + + var axisBuilderAttrs = [ + 'axisLine', 'axisLabel', 'axisTick', 'axisName' + ]; + var selfBuilderAttrs = [ + 'splitLine', 'splitArea' + ]; + + var AxisView = __webpack_require__(1).extendComponentView({ + + type: 'axis', + + render: function (axisModel, ecModel) { + + this.group.removeAll(); + + if (!axisModel.get('show')) { + return; + } + + var gridModel = ecModel.getComponent('grid', axisModel.get('gridIndex')); + + var layout = layoutAxis(gridModel, axisModel); + + var axisBuilder = new AxisBuilder(axisModel, layout); + + zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + + this.group.add(axisBuilder.getGroup()); + + zrUtil.each(selfBuilderAttrs, function (name) { + if (axisModel.get(name +'.show')) { + this['_' + name](axisModel, gridModel, layout.labelInterval); + } + }, this); + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {number|Function} labelInterval + * @private + */ + _splitLine: function (axisModel, gridModel, labelInterval) { + var axis = axisModel.axis; + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineWidth = lineStyleModel.get('width'); + var lineColors = lineStyleModel.get('color'); + + var lineInterval = getInterval(splitLineModel, labelInterval); + + lineColors = zrUtil.isArray(lineColors) ? lineColors : [lineColors]; + + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + + var splitLines = []; + var lineCount = 0; + + var ticksCoords = axis.getTicksCoords(); + + var p1 = []; + var p2 = []; + for (var i = 0; i < ticksCoords.length; i++) { + if (ifIgnoreOnTick(axis, i, lineInterval)) { + continue; + } + + var tickCoord = axis.toGlobalCoord(ticksCoords[i]); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } + else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = (lineCount++) % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new graphic.Line(graphic.subPixelOptimizeLine({ + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: { + lineWidth: lineWidth + }, + silent: true + }))); + } + + // Simple optimization + // Batching the lines if color are the same + var lineStyle = lineStyleModel.getLineStyle(); + for (var i = 0; i < splitLines.length; i++) { + this.group.add(graphic.mergePath(splitLines[i], { + style: zrUtil.defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyle), + silent: true + })); + } + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {number|Function} labelInterval + * @private + */ + _splitArea: function (axisModel, gridModel, labelInterval) { + var axis = axisModel.axis; + + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + + var gridRect = gridModel.coordinateSystem.getRect(); + var ticksCoords = axis.getTicksCoords(); + + var prevX = axis.toGlobalCoord(ticksCoords[0]); + var prevY = axis.toGlobalCoord(ticksCoords[0]); + + var splitAreaRects = []; + var count = 0; + + var areaInterval = getInterval(splitAreaModel, labelInterval); + + areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors]; + + for (var i = 1; i < ticksCoords.length; i++) { + if (ifIgnoreOnTick(axis, i, areaInterval)) { + continue; + } + + var tickCoord = axis.toGlobalCoord(ticksCoords[i]); + + var x; + var y; + var width; + var height; + if (axis.isHorizontal()) { + x = prevX; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + } + else { + x = gridRect.x; + y = prevY; + width = gridRect.width; + height = tickCoord - y; + } + + var colorIndex = (count++) % areaColors.length; + splitAreaRects[colorIndex] = splitAreaRects[colorIndex] || []; + splitAreaRects[colorIndex].push(new graphic.Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + }, + silent: true + })); + + prevX = x + width; + prevY = y + height; + } + + // Simple optimization + // Batching the rects if color are the same + var areaStyle = areaStyleModel.getAreaStyle(); + for (var i = 0; i < splitAreaRects.length; i++) { + this.group.add(graphic.mergePath(splitAreaRects[i], { + style: zrUtil.defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyle), + silent: true + })); + } + } + }); + + AxisView.extend({ + type: 'xAxis' + }); + AxisView.extend({ + type: 'yAxis' + }); + + /** + * @inner + */ + function layoutAxis(gridModel, axisModel) { + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + + var rawAxisPosition = axis.position; + var axisPosition = axis.onZero ? 'onZero' : rawAxisPosition; + var axisDim = axis.dim; + + // [left, right, top, bottom] + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + + var posMap = { + x: {top: rectBound[2], bottom: rectBound[3]}, + y: {left: rectBound[0], right: rectBound[1]} + }; + posMap.x.onZero = Math.max(Math.min(getZero('y'), posMap.x.bottom), posMap.x.top); + posMap.y.onZero = Math.max(Math.min(getZero('x'), posMap.y.right), posMap.y.left); + + function getZero(dim, val) { + var theAxis = grid.getAxis(dim); + return theAxis.toGlobalCoord(theAxis.dataToCoord(0)); + } + + // Axis position + layout.position = [ + axisDim === 'y' ? posMap.y[axisPosition] : rectBound[0], + axisDim === 'x' ? posMap.x[axisPosition] : rectBound[3] + ]; + + // Axis rotation + var r = {x: 0, y: 1}; + layout.rotation = Math.PI / 2 * r[axisDim]; + + // Tick and label direction, x y is axisDim + var dirMap = {top: -1, bottom: 1, left: -1, right: 1}; + + layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition]; + if (axis.onZero) { + layout.labelOffset = posMap[axisDim][rawAxisPosition] - posMap[axisDim].onZero; + } + + if (axisModel.getModel('axisTick').get('inside')) { + layout.tickDirection = -layout.tickDirection; + } + if (axisModel.getModel('axisLabel').get('inside')) { + layout.labelDirection = -layout.labelDirection; + } + + // Special label rotation + var labelRotation = axisModel.getModel('axisLabel').get('rotate'); + layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation; + + // label interval when auto mode. + layout.labelInterval = axis.getLabelInterval(); + + // Over splitLine and splitArea + layout.z2 = 1; + + return layout; + } + + +/***/ }, +/* 126 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var Model = __webpack_require__(8); + var numberUtil = __webpack_require__(7); + var remRadian = numberUtil.remRadian; + var isRadianAroundZero = numberUtil.isRadianAroundZero; + + var PI = Math.PI; + + /** + * A final axis is translated and rotated from a "standard axis". + * So opt.position and opt.rotation is required. + * + * A standard axis is and axis from [0, 0] to [0, axisExtent[1]], + * for example: (0, 0) ------------> (0, 50) + * + * nameDirection or tickDirection or labelDirection is 1 means tick + * or label is below the standard axis, whereas is -1 means above + * the standard axis. labelOffset means offset between label and axis, + * which is useful when 'onZero', where axisLabel is in the grid and + * label in outside grid. + * + * Tips: like always, + * positive rotation represents anticlockwise, and negative rotation + * represents clockwise. + * The direction of position coordinate is the same as the direction + * of screen coordinate. + * + * Do not need to consider axis 'inverse', which is auto processed by + * axis extent. + * + * @param {module:zrender/container/Group} group + * @param {Object} axisModel + * @param {Object} opt Standard axis parameters. + * @param {Array.} opt.position [x, y] + * @param {number} opt.rotation by radian + * @param {number} [opt.nameDirection=1] 1 or -1 Used when nameLocation is 'middle'. + * @param {number} [opt.tickDirection=1] 1 or -1 + * @param {number} [opt.labelDirection=1] 1 or -1 + * @param {number} [opt.labelOffset=0] Usefull when onZero. + * @param {string} [opt.axisName] default get from axisModel. + * @param {number} [opt.labelRotation] by degree, default get from axisModel. + * @param {number} [opt.labelInterval] Default label interval when label + * interval from model is null or 'auto'. + * @param {number} [opt.strokeContainThreshold] Default label interval when label + * @param {number} [opt.silent=true] + */ + var AxisBuilder = function (axisModel, opt) { + + /** + * @readOnly + */ + this.opt = opt; + + /** + * @readOnly + */ + this.axisModel = axisModel; + + // Default value + zrUtil.defaults( + opt, + { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true + } + ); + + /** + * @readOnly + */ + this.group = new graphic.Group({ + position: opt.position.slice(), + rotation: opt.rotation + }); + }; + + AxisBuilder.prototype = { + + constructor: AxisBuilder, + + hasBuilder: function (name) { + return !!builders[name]; + }, + + add: function (name) { + builders[name].call(this); + }, + + getGroup: function () { + return this.group; + } + + }; + + var builders = { + + /** + * @private + */ + axisLine: function () { + var opt = this.opt; + var axisModel = this.axisModel; + + if (!axisModel.get('axisLine.show')) { + return; + } + + var extent = this.axisModel.axis.getExtent(); + + this.group.add(new graphic.Line({ + shape: { + x1: extent[0], + y1: 0, + x2: extent[1], + y2: 0 + }, + style: zrUtil.extend( + {lineCap: 'round'}, + axisModel.getModel('axisLine.lineStyle').getLineStyle() + ), + strokeContainThreshold: opt.strokeContainThreshold, + silent: !!opt.silent, + z2: 1 + })); + }, + + /** + * @private + */ + axisTick: function () { + var axisModel = this.axisModel; + + if (!axisModel.get('axisTick.show')) { + return; + } + + var axis = axisModel.axis; + var tickModel = axisModel.getModel('axisTick'); + var opt = this.opt; + + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickLen = tickModel.get('length'); + var tickInterval = getInterval(tickModel, opt.labelInterval); + var ticksCoords = axis.getTicksCoords(); + var tickLines = []; + + for (var i = 0; i < ticksCoords.length; i++) { + // Only ordinal scale support tick interval + if (ifIgnoreOnTick(axis, i, tickInterval)) { + continue; + } + + var tickCoord = ticksCoords[i]; + + // Tick line + tickLines.push(new graphic.Line(graphic.subPixelOptimizeLine({ + shape: { + x1: tickCoord, + y1: 0, + x2: tickCoord, + y2: opt.tickDirection * tickLen + }, + style: { + lineWidth: lineStyleModel.get('width') + }, + silent: true + }))); + } + + this.group.add(graphic.mergePath(tickLines, { + style: lineStyleModel.getLineStyle(), + z2: 2, + silent: true + })); + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @private + */ + axisLabel: function () { + var axisModel = this.axisModel; + + if (!axisModel.get('axisLabel.show')) { + return; + } + + var opt = this.opt; + var axis = axisModel.axis; + var labelModel = axisModel.getModel('axisLabel'); + var textStyleModel = labelModel.getModel('textStyle'); + var labelMargin = labelModel.get('margin'); + var ticks = axis.scale.getTicks(); + var labels = axisModel.getFormattedLabels(); + + // Special label rotate. + var labelRotation = opt.labelRotation; + if (labelRotation == null) { + labelRotation = labelModel.get('rotate') || 0; + } + // To radian. + labelRotation = labelRotation * PI / 180; + + var labelLayout = innerTextLayout(opt, labelRotation, opt.labelDirection); + var categoryData = axisModel.get('data'); + + var textEls = []; + for (var i = 0; i < ticks.length; i++) { + if (ifIgnoreOnTick(axis, i, opt.labelInterval)) { + continue; + } + + var itemTextStyleModel = textStyleModel; + if (categoryData && categoryData[i] && categoryData[i].textStyle) { + itemTextStyleModel = new Model( + categoryData[i].textStyle, textStyleModel, axisModel.ecModel + ); + } + + var tickCoord = axis.dataToCoord(ticks[i]); + var pos = [ + tickCoord, + opt.labelOffset + opt.labelDirection * labelMargin + ]; + + var textEl = new graphic.Text({ + style: { + text: labels[i], + textAlign: itemTextStyleModel.get('align', true) || labelLayout.textAlign, + textVerticalAlign: itemTextStyleModel.get('baseline', true) || labelLayout.verticalAlign, + textFont: itemTextStyleModel.getFont(), + fill: itemTextStyleModel.getTextColor() + }, + position: pos, + rotation: labelLayout.rotation, + silent: true, + z2: 10 + }); + textEls.push(textEl); + this.group.add(textEl); + } + + function isTwoLabelOverlapped(current, next) { + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + if (firstRect && nextRect) { + firstRect.applyTransform(current.getLocalTransform()); + nextRect.applyTransform(next.getLocalTransform()); + return firstRect.intersect(nextRect); + } + } + if (axis.type !== 'category') { + // If min or max are user set, we need to check + // If the tick on min(max) are overlap on their neighbour tick + // If they are overlapped, we need to hide the min(max) tick label + if (axisModel.getMin ? axisModel.getMin() : axisModel.get('min')) { + var firstLabel = textEls[0]; + var nextLabel = textEls[1]; + if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + firstLabel.ignore = true; + } + } + if (axisModel.getMax ? axisModel.getMax() : axisModel.get('max')) { + var lastLabel = textEls[textEls.length - 1]; + var prevLabel = textEls[textEls.length - 2]; + if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + lastLabel.ignore = true; + } + } + } + }, + + /** + * @private + */ + axisName: function () { + var opt = this.opt; + var axisModel = this.axisModel; + + var name = this.opt.axisName; + // If name is '', do not get name from axisMode. + if (name == null) { + name = axisModel.get('name'); + } + + if (!name) { + return; + } + + var nameLocation = axisModel.get('nameLocation'); + var nameDirection = opt.nameDirection; + var textStyleModel = axisModel.getModel('nameTextStyle'); + var gap = axisModel.get('nameGap') || 0; + + var extent = this.axisModel.axis.getExtent(); + var gapSignal = extent[0] > extent[1] ? -1 : 1; + var pos = [ + nameLocation === 'start' + ? extent[0] - gapSignal * gap + : nameLocation === 'end' + ? extent[1] + gapSignal * gap + : (extent[0] + extent[1]) / 2, // 'middle' + // Reuse labelOffset. + nameLocation === 'middle' ? opt.labelOffset + nameDirection * gap : 0 + ]; + + var labelLayout; + + if (nameLocation === 'middle') { + labelLayout = innerTextLayout(opt, opt.rotation, nameDirection); + } + else { + labelLayout = endTextLayout(opt, nameLocation, extent); + } + + this.group.add(new graphic.Text({ + style: { + text: name, + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + || axisModel.get('axisLine.lineStyle.color'), + textAlign: labelLayout.textAlign, + textVerticalAlign: labelLayout.verticalAlign + }, + position: pos, + rotation: labelLayout.rotation, + silent: true, + z2: 1 + })); + } + + }; + + /** + * @inner + */ + function innerTextLayout(opt, textRotation, direction) { + var rotationDiff = remRadian(textRotation - opt.rotation); + var textAlign; + var verticalAlign; + + if (isRadianAroundZero(rotationDiff)) { // Label is parallel with axis line. + verticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } + else if (isRadianAroundZero(rotationDiff - PI)) { // Label is inverse parallel with axis line. + verticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } + else { + verticalAlign = 'middle'; + + if (rotationDiff > 0 && rotationDiff < PI) { + textAlign = direction > 0 ? 'right' : 'left'; + } + else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + verticalAlign: verticalAlign + }; + } + + /** + * @inner + */ + function endTextLayout(opt, textPosition, extent) { + var rotationDiff = remRadian(-opt.rotation); + var textAlign; + var verticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = (textPosition === 'start' && !inverse) + || (textPosition !== 'start' && inverse); + + if (isRadianAroundZero(rotationDiff - PI / 2)) { + verticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } + else if (isRadianAroundZero(rotationDiff - PI * 1.5)) { + verticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } + else { + verticalAlign = 'middle'; + if (rotationDiff < PI * 1.5 && rotationDiff > PI / 2) { + textAlign = onLeft ? 'left' : 'right'; + } + else { + textAlign = onLeft ? 'right' : 'left'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + verticalAlign: verticalAlign + }; + } + + /** + * @static + */ + var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick = function (axis, i, interval) { + var rawTick; + var scale = axis.scale; + return scale.type === 'ordinal' + && ( + typeof interval === 'function' + ? ( + rawTick = scale.getTicks()[i], + !interval(rawTick, scale.getLabel(rawTick)) + ) + : i % (interval + 1) + ); + }; + + /** + * @static + */ + var getInterval = AxisBuilder.getInterval = function (model, labelInterval) { + var interval = model.get('interval'); + if (interval == null || interval == 'auto') { + interval = labelInterval; + } + return interval; + }; + + module.exports = AxisBuilder; + + + +/***/ }, +/* 127 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + __webpack_require__(107); + + __webpack_require__(128); + __webpack_require__(129); + + var barLayoutGrid = __webpack_require__(131); + var echarts = __webpack_require__(1); + + echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'bar')); + // Visual coding for legend + echarts.registerVisualCoding('chart', function (ecModel) { + ecModel.eachSeriesByType('bar', function (seriesModel) { + var data = seriesModel.getData(); + data.setVisual('legendSymbol', 'roundRect'); + }); + }); + + // In case developer forget to include grid component + __webpack_require__(106); + + +/***/ }, +/* 128 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var SeriesModel = __webpack_require__(27); + var createListFromArray = __webpack_require__(93); + + module.exports = SeriesModel.extend({ + + type: 'series.bar', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + return createListFromArray(option.data, this, ecModel); + }, + + getMarkerPosition: function (value) { + var coordSys = this.coordinateSystem; + if (coordSys) { + var pt = coordSys.dataToPoint(value); + var data = this.getData(); + var offset = data.getLayout('offset'); + var size = data.getLayout('size'); + var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1; + pt[offsetIndex] += offset + size / 2; + return pt; + } + return [NaN, NaN]; + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // stack: null + + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + // 最小高度改为0 + barMinHeight: 0, + + // barMaxWidth: null, + // 默认自适应 + // barWidth: null, + // 柱间距离,默认为柱形宽度的30%,可设固定值 + // barGap: '30%', + // 类目间柱形距离,默认为类目间距的20%,可设固定值 + // barCategoryGap: '20%', + // label: { + // normal: { + // show: false + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + // // 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // // 'inside' | 'insideleft' | 'insideTop' | 'insideRight' | 'insideBottom' | + // // 'outside' |'left' | 'right'|'top'|'bottom' + // position: + + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // } + // }, + itemStyle: { + normal: { + // color: '各异', + // 柱条边线 + barBorderColor: '#fff', + // 柱条边线线宽,单位px,默认为1 + barBorderWidth: 0 + }, + emphasis: { + // color: '各异', + // 柱条边线 + barBorderColor: '#fff', + // 柱条边线线宽,单位px,默认为1 + barBorderWidth: 0 + } + } + } + }); + + +/***/ }, +/* 129 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + + zrUtil.extend(__webpack_require__(8).prototype, __webpack_require__(130)); + + function fixLayoutWithLineWidth(layout, lineWidth) { + var signX = layout.width > 0 ? 1 : -1; + var signY = layout.height > 0 ? 1 : -1; + // In case width or height are too small. + lineWidth = Math.min(lineWidth, Math.abs(layout.width), Math.abs(layout.height)); + layout.x += signX * lineWidth / 2; + layout.y += signY * lineWidth / 2; + layout.width -= signX * lineWidth; + layout.height -= signY * lineWidth; + } + + module.exports = __webpack_require__(1).extendChartView({ + + type: 'bar', + + render: function (seriesModel, ecModel, api) { + var coordinateSystemType = seriesModel.get('coordinateSystem'); + + if (coordinateSystemType === 'cartesian2d') { + this._renderOnCartesian(seriesModel, ecModel, api); + } + + return this.group; + }, + + _renderOnCartesian: function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + + var enableAnimation = seriesModel.get('animation'); + + var barBorderWidthQuery = ['itemStyle', 'normal', 'barBorderWidth']; + + function createRect(dataIndex, isUpdate) { + var layout = data.getItemLayout(dataIndex); + var lineWidth = data.getItemModel(dataIndex).get(barBorderWidthQuery) || 0; + fixLayoutWithLineWidth(layout, lineWidth); + + var rect = new graphic.Rect({ + shape: zrUtil.extend({}, layout) + }); + // Animation + if (enableAnimation) { + var rectShape = rect.shape; + var animateProperty = isHorizontal ? 'height' : 'width'; + var animateTarget = {}; + rectShape[animateProperty] = 0; + animateTarget[animateProperty] = layout[animateProperty]; + graphic[isUpdate? 'updateProps' : 'initProps'](rect, { + shape: animateTarget + }, seriesModel); + } + return rect; + } + data.diff(oldData) + .add(function (dataIndex) { + // 空数据 + if (!data.hasValue(dataIndex)) { + return; + } + + var rect = createRect(dataIndex); + + data.setItemGraphicEl(dataIndex, rect); + + group.add(rect); + + }) + .update(function (newIndex, oldIndex) { + var rect = oldData.getItemGraphicEl(oldIndex); + // 空数据 + if (!data.hasValue(newIndex)) { + group.remove(rect); + return; + } + if (!rect) { + rect = createRect(newIndex, true); + } + + var layout = data.getItemLayout(newIndex); + var lineWidth = data.getItemModel(newIndex).get(barBorderWidthQuery) || 0; + fixLayoutWithLineWidth(layout, lineWidth); + + graphic.updateProps(rect, { + shape: layout + }, seriesModel); + + data.setItemGraphicEl(newIndex, rect); + + // Add back + group.add(rect); + }) + .remove(function (idx) { + var rect = oldData.getItemGraphicEl(idx); + if (rect) { + // Not show text when animating + rect.style.text = ''; + graphic.updateProps(rect, { + shape: { + width: 0 + } + }, seriesModel, function () { + group.remove(rect); + }); + } + }) + .execute(); + + this._updateStyle(seriesModel, data, isHorizontal); + + this._data = data; + }, + + _updateStyle: function (seriesModel, data, isHorizontal) { + function setLabel(style, model, color, labelText, labelPositionOutside) { + graphic.setText(style, model, color); + style.text = labelText; + if (style.textPosition === 'outside') { + style.textPosition = labelPositionOutside; + } + } + + data.eachItemGraphicEl(function (rect, idx) { + var itemModel = data.getItemModel(idx); + var color = data.getItemVisual(idx, 'color'); + var layout = data.getItemLayout(idx); + var itemStyleModel = itemModel.getModel('itemStyle.normal'); + + var hoverStyle = itemModel.getModel('itemStyle.emphasis').getBarItemStyle(); + + rect.setShape('r', itemStyleModel.get('barBorderRadius') || 0); + + rect.setStyle(zrUtil.defaults( + { + fill: color + }, + itemStyleModel.getBarItemStyle() + )); + + var labelPositionOutside = isHorizontal + ? (layout.height > 0 ? 'bottom' : 'top') + : (layout.width > 0 ? 'left' : 'right'); + + var labelModel = itemModel.getModel('label.normal'); + var hoverLabelModel = itemModel.getModel('label.emphasis'); + var rectStyle = rect.style; + if (labelModel.get('show')) { + setLabel( + rectStyle, labelModel, color, + zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'normal'), + seriesModel.getRawValue(idx) + ), + labelPositionOutside + ); + } + else { + rectStyle.text = ''; + } + if (hoverLabelModel.get('show')) { + setLabel( + hoverStyle, hoverLabelModel, color, + zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'emphasis'), + seriesModel.getRawValue(idx) + ), + labelPositionOutside + ); + } + else { + hoverStyle.text = ''; + } + graphic.setHoverStyle(rect, hoverStyle); + }); + }, + + remove: function (ecModel, api) { + var group = this.group; + if (ecModel.get('animation')) { + if (this._data) { + this._data.eachItemGraphicEl(function (el) { + // Not show text when animating + el.style.text = ''; + graphic.updateProps(el, { + shape: { + width: 0 + } + }, ecModel, function () { + group.remove(el); + }); + }); + } + } + else { + group.removeAll(); + } + } + }); + + +/***/ }, +/* 130 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getBarItemStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['stroke', 'borderColor'], + ['lineWidth', 'borderWidth'], + // Compatitable with 2 + ['stroke', 'barBorderColor'], + ['lineWidth', 'barBorderWidth'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 131 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + + function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex; + } + + function calBarWidthAndOffset(barSeries, api) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + + zrUtil.each(barSeries, function (seriesModel, idx) { + var cartesian = seriesModel.coordinateSystem; + + var baseAxis = cartesian.getBaseAxis(); + + var columnsOnAxis = columnsMap[baseAxis.index] || { + remainedWidth: baseAxis.getBandWidth(), + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + axis: baseAxis, + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[baseAxis.index] = columnsOnAxis; + + var stackId = getSeriesStackId(seriesModel); + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + + var barWidth = seriesModel.get('barWidth'); + var barMaxWidth = seriesModel.get('barMaxWidth'); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + // TODO + if (barWidth && ! stacks[stackId].width) { + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + stacks[stackId].width = barWidth; + columnsOnAxis.remainedWidth -= barWidth; + } + + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + (barGap != null) && (columnsOnAxis.gap = barGap); + (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap); + }); + + var result = {}; + + zrUtil.each(columnsMap, function (columnsOnAxis, coordSysName) { + + result[coordSysName] = {}; + + var stacks = columnsOnAxis.stacks; + var baseAxis = columnsOnAxis.axis; + var bandWidth = baseAxis.getBandWidth(); + var categoryGap = parsePercent(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent(columnsOnAxis.gap, 1); + + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + // Find if any auto calculated bar exceeded maxBarWidth + zrUtil.each(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + if (!column.width && maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + remainedWidth -= maxWidth; + column.width = maxWidth; + autoWidthCount--; + } + }); + + // Recalculate width again + autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + var widthSum = 0; + var lastColumn; + zrUtil.each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + zrUtil.each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + + offset += column.width * (1 + barGapPercent); + }); + }); + + return result; + } + + /** + * @param {string} seriesType + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + function barLayoutGrid(seriesType, ecModel, api) { + + var barWidthAndOffset = calBarWidthAndOffset( + zrUtil.filter( + ecModel.getSeriesByType(seriesType), + function (seriesModel) { + return !ecModel.isSeriesFiltered(seriesModel) + && seriesModel.coordinateSystem + && seriesModel.coordinateSystem.type === 'cartesian2d'; + } + ) + ); + + var lastStackCoords = {}; + + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + + var stackId = getSeriesStackId(seriesModel); + var columnLayoutInfo = barWidthAndOffset[baseAxis.index][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = cartesian.getOtherAxis(baseAxis); + + var barMinHeight = seriesModel.get('barMinHeight') || 0; + + var valueAxisStart = baseAxis.onZero + ? valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)) + : valueAxis.getGlobalExtent()[0]; + + var coords = cartesian.dataToPoints(data, true); + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + + data.setLayout({ + offset: columnOffset, + size: columnWidth + }); + data.each(valueAxis.dim, function (value, idx) { + // 空数据 + if (isNaN(value)) { + return; + } + if (!lastStackCoords[stackId][idx]) { + lastStackCoords[stackId][idx] = { + // Positive stack + p: valueAxisStart, + // Negative stack + n: valueAxisStart + }; + } + var sign = value >= 0 ? 'p' : 'n'; + var coord = coords[idx]; + var lastCoord = lastStackCoords[stackId][idx][sign]; + var x, y, width, height; + if (valueAxis.isHorizontal()) { + x = lastCoord; + y = coord[1] + columnOffset; + width = coord[0] - lastCoord; + height = columnWidth; + + if (Math.abs(width) < barMinHeight) { + width = (width < 0 ? -1 : 1) * barMinHeight; + } + lastStackCoords[stackId][idx][sign] += width; + } + else { + x = coord[0] + columnOffset; + y = lastCoord; + width = columnWidth; + height = coord[1] - lastCoord; + if (Math.abs(height) < barMinHeight) { + // Include zero to has a positive bar + height = (height <= 0 ? -1 : 1) * barMinHeight; + } + lastStackCoords[stackId][idx][sign] += height; + } + + data.setItemLayout(idx, { + x: x, + y: y, + width: width, + height: height + }); + }, true); + + }, this); + } + + module.exports = barLayoutGrid; + + +/***/ }, +/* 132 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(133); + __webpack_require__(135); + + __webpack_require__(136)('pie', [{ + type: 'pieToggleSelect', + event: 'pieselectchanged', + method: 'toggleSelected' + }, { + type: 'pieSelect', + event: 'pieselected', + method: 'select' + }, { + type: 'pieUnSelect', + event: 'pieunselected', + method: 'unSelect' + }]); + + echarts.registerVisualCoding( + 'chart', zrUtil.curry(__webpack_require__(137), 'pie') + ); + + echarts.registerLayout(zrUtil.curry( + __webpack_require__(138), 'pie' + )); + + echarts.registerProcessor( + 'filter', zrUtil.curry(__webpack_require__(140), 'pie') + ); + + +/***/ }, +/* 133 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var completeDimensions = __webpack_require__(96); + + var dataSelectableMixin = __webpack_require__(134); + + var PieSeries = __webpack_require__(1).extendSeriesModel({ + + type: 'series.pie', + + // Overwrite + init: function (option) { + PieSeries.superApply(this, 'init', arguments); + + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this._dataBeforeProcessed; + }; + + this.updateSelectedMap(); + + this._defaultLabelLine(option); + }, + + // Overwrite + mergeOption: function (newOption) { + PieSeries.superCall(this, 'mergeOption', newOption); + this.updateSelectedMap(); + }, + + getInitialData: function (option, ecModel) { + var dimensions = completeDimensions(['value'], option.data); + var list = new List(dimensions, this); + list.initData(option.data); + return list; + }, + + // Overwrite + getDataParams: function (dataIndex) { + var data = this._data; + var params = PieSeries.superCall(this, 'getDataParams', dataIndex); + var sum = data.getSum('value'); + // FIXME toFixed? + // + // Percent is 0 if sum is 0 + params.percent = !sum ? 0 : +(data.get('value', dataIndex) / sum * 100).toFixed(2); + + params.$vars.push('percent'); + return params; + }, + + _defaultLabelLine: function (option) { + // Extend labelLine emphasis + modelUtil.defaultEmphasis(option.labelLine, ['show']); + + var labelLineNormalOpt = option.labelLine.normal; + var labelLineEmphasisOpt = option.labelLine.emphasis; + // Not show label line if `label.normal.show = false` + labelLineNormalOpt.show = labelLineNormalOpt.show + && option.label.normal.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show + && option.label.emphasis.show; + }, + + defaultOption: { + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // 选中是扇区偏移量 + selectedOffset: 10, + + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + + label: { + normal: { + // If rotate around circle + rotate: false, + show: true, + // 'outer', 'inside', 'center' + position: 'outer' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + }, + emphasis: {} + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + normal: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + } + }, + itemStyle: { + normal: { + // color: 各异, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 1 + }, + emphasis: { + // color: 各异, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 1 + } + }, + + animationEasing: 'cubicOut', + + data: [] + } + }); + + zrUtil.mixin(PieSeries, dataSelectableMixin); + + module.exports = PieSeries; + + +/***/ }, +/* 134 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Data selectable mixin for chart series. + * To eanble data select, option of series must have `selectedMode`. + * And each data item will use `selected` to toggle itself selected status + * + * @module echarts/chart/helper/DataSelectable + */ + + + var zrUtil = __webpack_require__(3); + + module.exports = { + + updateSelectedMap: function () { + var option = this.option; + this._dataOptMap = zrUtil.reduce(option.data, function (dataOptMap, dataOpt) { + dataOptMap[dataOpt.name] = dataOpt; + return dataOptMap; + }, {}); + }, + /** + * @param {string} name + */ + // PENGING If selectedMode is null ? + select: function (name) { + var dataOptMap = this._dataOptMap; + var dataOpt = dataOptMap[name]; + var selectedMode = this.get('selectedMode'); + if (selectedMode === 'single') { + zrUtil.each(dataOptMap, function (dataOpt) { + dataOpt.selected = false; + }); + } + dataOpt && (dataOpt.selected = true); + }, + + /** + * @param {string} name + */ + unSelect: function (name) { + var dataOpt = this._dataOptMap[name]; + // var selectedMode = this.get('selectedMode'); + // selectedMode !== 'single' && dataOpt && (dataOpt.selected = false); + dataOpt && (dataOpt.selected = false); + }, + + /** + * @param {string} name + */ + toggleSelected: function (name) { + var dataOpt = this._dataOptMap[name]; + if (dataOpt != null) { + this[dataOpt.selected ? 'unSelect' : 'select'](name); + return dataOpt.selected; + } + }, + + /** + * @param {string} name + */ + isSelected: function (name) { + var dataOpt = this._dataOptMap[name]; + return dataOpt && dataOpt.selected; + } + }; + + +/***/ }, +/* 135 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + /** + * @param {module:echarts/model/Series} seriesModel + * @param {boolean} hasAnimation + * @inner + */ + function updateDataSelected(uid, seriesModel, hasAnimation, api) { + var data = seriesModel.getData(); + var dataIndex = this.dataIndex; + var name = data.getName(dataIndex); + var selectedOffset = seriesModel.get('selectedOffset'); + + api.dispatchAction({ + type: 'pieToggleSelect', + from: uid, + name: name, + seriesId: seriesModel.id + }); + + data.each(function (idx) { + toggleItemSelected( + data.getItemGraphicEl(idx), + data.getItemLayout(idx), + seriesModel.isSelected(data.getName(idx)), + selectedOffset, + hasAnimation + ); + }); + } + + /** + * @param {module:zrender/graphic/Sector} el + * @param {Object} layout + * @param {boolean} isSelected + * @param {number} selectedOffset + * @param {boolean} hasAnimation + * @inner + */ + function toggleItemSelected(el, layout, isSelected, selectedOffset, hasAnimation) { + var midAngle = (layout.startAngle + layout.endAngle) / 2; + + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var offset = isSelected ? selectedOffset : 0; + var position = [dx * offset, dy * offset]; + + hasAnimation + // animateTo will stop revious animation like update transition + ? el.animate() + .when(200, { + position: position + }) + .start('bounceOut') + : el.attr('position', position); + } + + /** + * Piece of pie including Sector, Label, LabelLine + * @constructor + * @extends {module:zrender/graphic/Group} + */ + function PiePiece(data, idx) { + + graphic.Group.call(this); + + var sector = new graphic.Sector({ + z2: 2 + }); + var polyline = new graphic.Polyline(); + var text = new graphic.Text(); + this.add(sector); + this.add(polyline); + this.add(text); + + this.updateData(data, idx, true); + + // Hover to change label and labelLine + function onEmphasis() { + polyline.ignore = polyline.hoverIgnore; + text.ignore = text.hoverIgnore; + } + function onNormal() { + polyline.ignore = polyline.normalIgnore; + text.ignore = text.normalIgnore; + } + this.on('emphasis', onEmphasis) + .on('normal', onNormal) + .on('mouseover', onEmphasis) + .on('mouseout', onNormal); + } + + var piePieceProto = PiePiece.prototype; + + function getLabelStyle(data, idx, state, labelModel, labelPosition) { + var textStyleModel = labelModel.getModel('textStyle'); + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + return { + fill: textStyleModel.getTextColor() + || (isLabelInside ? '#fff' : data.getItemVisual(idx, 'color')), + textFont: textStyleModel.getFont(), + text: zrUtil.retrieve( + data.hostModel.getFormattedLabel(idx, state), data.getName(idx) + ) + }; + } + + piePieceProto.updateData = function (data, idx, firstCreate) { + + var sector = this.childAt(0); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var sectorShape = zrUtil.extend({}, layout); + sectorShape.label = null; + if (firstCreate) { + sector.setShape(sectorShape); + sector.shape.endAngle = layout.startAngle; + graphic.updateProps(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel); + } + else { + graphic.updateProps(sector, { + shape: sectorShape + }, seriesModel); + } + + // Update common style + var itemStyleModel = itemModel.getModel('itemStyle'); + var visualColor = data.getItemVisual(idx, 'color'); + + sector.setStyle( + zrUtil.defaults( + { + fill: visualColor + }, + itemStyleModel.getModel('normal').getItemStyle() + ) + ); + sector.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle(); + + // Toggle selected + toggleItemSelected( + this, + data.getItemLayout(idx), + itemModel.get('selected'), + seriesModel.get('selectedOffset'), + seriesModel.get('animation') + ); + + function onEmphasis() { + // Sector may has animation of updating data. Force to move to the last frame + // Or it may stopped on the wrong shape + sector.stopAnimation(true); + sector.animateTo({ + shape: { + r: layout.r + 10 + } + }, 300, 'elasticOut'); + } + function onNormal() { + sector.stopAnimation(true); + sector.animateTo({ + shape: { + r: layout.r + } + }, 300, 'elasticOut'); + } + sector.off('mouseover').off('mouseout').off('emphasis').off('normal'); + if (itemModel.get('hoverAnimation')) { + sector + .on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + } + + this._updateLabel(data, idx); + + graphic.setHoverStyle(this); + }; + + piePieceProto._updateLabel = function (data, idx) { + + var labelLine = this.childAt(1); + var labelText = this.childAt(2); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var visualColor = data.getItemVisual(idx, 'color'); + + graphic.updateProps(labelLine, { + shape: { + points: labelLayout.linePoints || [ + [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y] + ] + } + }, seriesModel); + + graphic.updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel); + labelText.attr({ + style: { + textVerticalAlign: labelLayout.verticalAlign, + textAlign: labelLayout.textAlign, + textFont: labelLayout.font + }, + rotation: labelLayout.rotation, + origin: [labelLayout.x, labelLayout.y], + z2: 10 + }); + + var labelModel = itemModel.getModel('label.normal'); + var labelHoverModel = itemModel.getModel('label.emphasis'); + var labelLineModel = itemModel.getModel('labelLine.normal'); + var labelLineHoverModel = itemModel.getModel('labelLine.emphasis'); + var labelPosition = labelModel.get('position') || labelHoverModel.get('position'); + + labelText.setStyle(getLabelStyle(data, idx, 'normal', labelModel, labelPosition)); + + labelText.ignore = labelText.normalIgnore = !labelModel.get('show'); + labelText.hoverIgnore = !labelHoverModel.get('show'); + + labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show'); + labelLine.hoverIgnore = !labelLineHoverModel.get('show'); + + // Default use item visual color + labelLine.setStyle({ + stroke: visualColor + }); + labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle()); + + labelText.hoverStyle = getLabelStyle(data, idx, 'emphasis', labelHoverModel, labelPosition); + labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle(); + + var smooth = labelLineModel.get('smooth'); + if (smooth && smooth === true) { + smooth = 0.4; + } + labelLine.setShape({ + smooth: smooth + }); + }; + + zrUtil.inherits(PiePiece, graphic.Group); + + + // Pie view + var Pie = __webpack_require__(41).extend({ + + type: 'pie', + + init: function () { + var sectorGroup = new graphic.Group(); + this._sectorGroup = sectorGroup; + }, + + render: function (seriesModel, ecModel, api, payload) { + if (payload && (payload.from === this.uid)) { + return; + } + + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + + var hasAnimation = ecModel.get('animation'); + var isFirstRender = !oldData; + + var onSectorClick = zrUtil.curry( + updateDataSelected, this.uid, seriesModel, hasAnimation, api + ); + + var selectedMode = seriesModel.get('selectedMode'); + + data.diff(oldData) + .add(function (idx) { + var piePiece = new PiePiece(data, idx); + if (isFirstRender) { + piePiece.eachChild(function (child) { + child.stopAnimation(true); + }); + } + + selectedMode && piePiece.on('click', onSectorClick); + + data.setItemGraphicEl(idx, piePiece); + + group.add(piePiece); + }) + .update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + + piePiece.updateData(data, newIdx); + + piePiece.off('click'); + selectedMode && piePiece.on('click', onSectorClick); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }) + .remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + group.remove(piePiece); + }) + .execute(); + + if (hasAnimation && isFirstRender && data.count() > 0) { + var shape = data.getItemLayout(0); + var r = Math.max(api.getWidth(), api.getHeight()) / 2; + + var removeClipPath = zrUtil.bind(group.removeClipPath, group); + group.setClipPath(this._createClipPath( + shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel + )); + } + + this._data = data; + }, + + _createClipPath: function ( + cx, cy, r, startAngle, clockwise, cb, seriesModel + ) { + var clipPath = new graphic.Sector({ + shape: { + cx: cx, + cy: cy, + r0: 0, + r: r, + startAngle: startAngle, + endAngle: startAngle, + clockwise: clockwise + } + }); + + graphic.initProps(clipPath, { + shape: { + endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2 + } + }, seriesModel, cb); + + return clipPath; + } + }); + + module.exports = Pie; + + +/***/ }, +/* 136 */ +/***/ function(module, exports, __webpack_require__) { + + + var echarts = __webpack_require__(1); + var zrUtil = __webpack_require__(3); + module.exports = function (seriesType, actionInfos) { + zrUtil.each(actionInfos, function (actionInfo) { + actionInfo.update = 'updateView'; + /** + * @payload + * @property {string} seriesName + * @property {string} name + */ + echarts.registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + ecModel.eachComponent( + {mainType: 'series', subType: seriesType, query: payload}, + function (seriesModel) { + if (seriesModel[actionInfo.method]) { + seriesModel[actionInfo.method](payload.name); + } + var data = seriesModel.getData(); + // Create selected map + data.each(function (idx) { + var name = data.getName(idx); + selected[name] = seriesModel.isSelected(name) || false; + }); + } + ); + return { + name: payload.name, + selected: selected + }; + }); + }); + }; + + +/***/ }, +/* 137 */ +/***/ function(module, exports) { + + // Pick color from palette for each data item + + + module.exports = function (seriesType, ecModel) { + var globalColorList = ecModel.get('color'); + var offset = 0; + ecModel.eachRawSeriesByType(seriesType, function (seriesModel) { + var colorList = seriesModel.get('color', true); + var dataAll = seriesModel.getRawData(); + if (!ecModel.isSeriesFiltered(seriesModel)) { + var data = seriesModel.getData(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var rawIdx = data.getRawIndex(idx); + // If series.itemStyle.normal.color is a function. itemVisual may be encoded + var singleDataColor = data.getItemVisual(idx, 'color', true); + if (!singleDataColor) { + var paletteColor = colorList ? colorList[rawIdx % colorList.length] + : globalColorList[(rawIdx + offset) % globalColorList.length]; + var color = itemModel.get('itemStyle.normal.color') || paletteColor; + // Legend may use the visual info in data before processed + dataAll.setItemVisual(rawIdx, 'color', color); + data.setItemVisual(idx, 'color', color); + } + else { + // Set data all color for legend + dataAll.setItemVisual(rawIdx, 'color', singleDataColor); + } + }); + } + offset += dataAll.count(); + }); + }; + + +/***/ }, +/* 138 */ +/***/ function(module, exports, __webpack_require__) { + + // TODO minAngle + + + + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + var labelLayout = __webpack_require__(139); + var zrUtil = __webpack_require__(3); + + var PI2 = Math.PI * 2; + var RADIAN = Math.PI / 180; + + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!zrUtil.isArray(radius)) { + radius = [0, radius]; + } + if (!zrUtil.isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent(center[0], width); + var cy = parsePercent(center[1], height); + var r0 = parsePercent(radius[0], size / 2); + var r = parsePercent(radius[1], size / 2); + + var data = seriesModel.getData(); + + var startAngle = -seriesModel.get('startAngle') * RADIAN; + + var minAngle = seriesModel.get('minAngle') * RADIAN; + + var sum = data.getSum('value'); + // Sum may be 0 + var unitRadian = Math.PI / (sum || data.count()) * 2; + + var clockwise = seriesModel.get('clockwise'); + + var roseType = seriesModel.get('roseType'); + + // [0...max] + var extent = data.getDataExtent('value'); + extent[0] = 0; + + // In the case some sector angle is smaller than minAngle + var restAngle = PI2; + var valueSumLargerThanMinAngle = 0; + + var currentAngle = startAngle; + + var dir = clockwise ? 1 : -1; + data.each('value', function (value, idx) { + var angle; + // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + if (roseType !== 'area') { + angle = sum === 0 ? unitRadian : (value * unitRadian); + } + else { + angle = PI2 / (data.count() || 1); + } + + if (angle < minAngle) { + angle = minAngle; + restAngle -= minAngle; + } + else { + valueSumLargerThanMinAngle += value; + } + + var endAngle = currentAngle + dir * angle; + data.setItemLayout(idx, { + angle: angle, + startAngle: currentAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType + ? numberUtil.linearMap(value, extent, [r0, r]) + : r + }); + + currentAngle = endAngle; + }, true); + + // Some sector is constrained by minAngle + // Rest sectors needs recalculate angle + if (restAngle < PI2) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle + if (restAngle <= 1e-3) { + var angle = PI2 / data.count(); + data.each(function (idx) { + var layout = data.getItemLayout(idx); + layout.startAngle = startAngle + dir * idx * angle; + layout.endAngle = startAngle + dir * (idx + 1) * angle; + }); + } + else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each('value', function (value, idx) { + var layout = data.getItemLayout(idx); + var angle = layout.angle === minAngle + ? minAngle : value * unitRadian; + layout.startAngle = currentAngle; + layout.endAngle = currentAngle + dir * angle; + currentAngle += angle; + }); + } + } + + labelLayout(seriesModel, r, width, height); + }); + }; + + +/***/ }, +/* 139 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // FIXME emphasis label position is not same with normal label position + + + var textContain = __webpack_require__(14); + + function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) { + list.sort(function (a, b) { + return a.y - b.y; + }); + + // 压 + function shiftDown(start, end, delta, dir) { + for (var j = start; j < end; j++) { + list[j].y += delta; + if (j > start + && j + 1 < end + && list[j + 1].y > list[j].y + list[j].height + ) { + shiftUp(j, delta / 2); + return; + } + } + + shiftUp(end - 1, delta / 2); + } + + // 弹 + function shiftUp(end, delta) { + for (var j = end; j >= 0; j--) { + list[j].y -= delta; + if (j > 0 + && list[j].y > list[j - 1].y + list[j - 1].height + ) { + break; + } + } + } + + function changeX(list, isDownList, cx, cy, r, dir) { + var lastDeltaX = dir > 0 + ? isDownList // 右侧 + ? Number.MAX_VALUE // 下 + : 0 // 上 + : isDownList // 左侧 + ? Number.MAX_VALUE // 下 + : 0; // 上 + + for (var i = 0, l = list.length; i < l; i++) { + // Not change x for center label + if (list[i].position === 'center') { + continue; + } + var deltaY = Math.abs(list[i].y - cy); + var length = list[i].len; + var length2 = list[i].len2; + var deltaX = (deltaY < r + length) + ? Math.sqrt( + (r + length + length2) * (r + length + length2) + - deltaY * deltaY + ) + : Math.abs(list[i].x - cx); + if (isDownList && deltaX >= lastDeltaX) { + // 右下,左下 + deltaX = lastDeltaX - 10; + } + if (!isDownList && deltaX <= lastDeltaX) { + // 右上,左上 + deltaX = lastDeltaX + 10; + } + + list[i].x = cx + deltaX * dir; + lastDeltaX = deltaX; + } + } + + var lastY = 0; + var delta; + var len = list.length; + var upList = []; + var downList = []; + for (var i = 0; i < len; i++) { + delta = list[i].y - lastY; + if (delta < 0) { + shiftDown(i, len, -delta, dir); + } + lastY = list[i].y + list[i].height; + } + if (viewHeight - lastY < 0) { + shiftUp(len - 1, lastY - viewHeight); + } + for (var i = 0; i < len; i++) { + if (list[i].y >= cy) { + downList.push(list[i]); + } + else { + upList.push(list[i]); + } + } + changeX(upList, false, cx, cy, r, dir); + changeX(downList, true, cx, cy, r, dir); + } + + function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) { + var leftList = []; + var rightList = []; + for (var i = 0; i < labelLayoutList.length; i++) { + if (labelLayoutList[i].x < cx) { + leftList.push(labelLayoutList[i]); + } + else { + rightList.push(labelLayoutList[i]); + } + } + + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight); + + for (var i = 0; i < labelLayoutList.length; i++) { + var linePoints = labelLayoutList[i].linePoints; + if (linePoints) { + var dist = linePoints[1][0] - linePoints[2][0]; + if (labelLayoutList[i].x < cx) { + linePoints[2][0] = labelLayoutList[i].x + 3; + } + else { + linePoints[2][0] = labelLayoutList[i].x - 3; + } + linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y; + linePoints[1][0] = linePoints[2][0] + dist; + } + } + } + + module.exports = function (seriesModel, r, viewWidth, viewHeight) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + + data.each(function (idx) { + var layout = data.getItemLayout(idx); + + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label.normal'); + // Use position in normal or emphasis + var labelPosition = labelModel.get('position') || itemModel.get('label.emphasis.position'); + + var labelLineModel = itemModel.getModel('labelLine.normal'); + var labelLineLen = labelLineModel.get('length'); + var labelLineLen2 = labelLineModel.get('length2'); + + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var textX; + var textY; + var linePoints; + var textAlign; + + cx = layout.cx; + cy = layout.cy; + + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + if (labelPosition === 'center') { + textX = layout.cx; + textY = layout.cy; + textAlign = 'center'; + } + else { + var x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx; + var y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy; + + textX = x1 + dx * 3; + textY = y1 + dy * 3; + + if (!isLabelInside) { + // For roseType + var x2 = x1 + dx * (labelLineLen + r - layout.r); + var y2 = y1 + dy * (labelLineLen + r - layout.r); + var x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2); + var y3 = y2; + + textX = x3 + (dx < 0 ? -5 : 5); + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + + textAlign = isLabelInside ? 'center' : (dx > 0 ? 'left' : 'right'); + } + var font = labelModel.getModel('textStyle').getFont(); + + var labelRotate = labelModel.get('rotate') + ? (dx < 0 ? -midAngle + Math.PI : -midAngle) : 0; + var text = seriesModel.getFormattedLabel(idx, 'normal') + || data.getName(idx); + var textRect = textContain.getBoundingRect( + text, font, textAlign, 'top' + ); + hasLabelRotate = !!labelRotate; + layout.label = { + x: textX, + y: textY, + position: labelPosition, + height: textRect.height, + len: labelLineLen, + len2: labelLineLen2, + linePoints: linePoints, + textAlign: textAlign, + verticalAlign: 'middle', + font: font, + rotation: labelRotate + }; + + // Not layout the inside label + if (!isLabelInside) { + labelLayoutList.push(layout.label); + } + }); + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight); + } + }; + + +/***/ }, +/* 140 */ +/***/ function(module, exports) { + + + module.exports = function (seriesType, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (!legendModels || !legendModels.length) { + return; + } + ecModel.eachSeriesByType(seriesType, function (series) { + var data = series.getData(); + data.filterSelf(function (idx) { + var name = data.getName(idx); + // If in any legend component the status is not selected. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(name)) { + return false; + } + } + return true; + }, this); + }, this); + }; + + +/***/ }, +/* 141 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(142); + __webpack_require__(143); + + echarts.registerVisualCoding('chart', zrUtil.curry( + __webpack_require__(103), 'scatter', 'circle', null + )); + echarts.registerLayout(zrUtil.curry( + __webpack_require__(104), 'scatter' + )); + + // In case developer forget to include grid component + __webpack_require__(106); + + +/***/ }, +/* 142 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var createListFromArray = __webpack_require__(93); + var SeriesModel = __webpack_require__(27); + + module.exports = SeriesModel.extend({ + + type: 'series.scatter', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + var list = createListFromArray(option.data, this, ecModel); + return list; + }, + + defaultOption: { + coordinateSystem: 'cartesian2d', + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + // Polar coordinate system + polarIndex: 0, + + // Geo coordinate system + geoIndex: 0, + + // symbol: null, // 图形类型 + symbolSize: 10, // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + // symbolRotate: null, // 图形旋转控制 + + large: false, + // Available when large is true + largeThreshold: 2000, + + // label: { + // normal: { + // show: false + // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // } + // }, + itemStyle: { + normal: { + opacity: 0.8 + // color: 各异 + } + } + } + }); + + +/***/ }, +/* 143 */ +/***/ function(module, exports, __webpack_require__) { + + + + var SymbolDraw = __webpack_require__(98); + var LargeSymbolDraw = __webpack_require__(144); + + __webpack_require__(1).extendChartView({ + + type: 'scatter', + + init: function () { + this._normalSymbolDraw = new SymbolDraw(); + this._largeSymbolDraw = new LargeSymbolDraw(); + }, + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var largeSymbolDraw = this._largeSymbolDraw; + var normalSymbolDraw = this._normalSymbolDraw; + var group = this.group; + + var symbolDraw = seriesModel.get('large') && data.count() > seriesModel.get('largeThreshold') + ? largeSymbolDraw : normalSymbolDraw; + + this._symbolDraw = symbolDraw; + symbolDraw.updateData(data); + group.add(symbolDraw.group); + + group.remove( + symbolDraw === largeSymbolDraw + ? normalSymbolDraw.group : largeSymbolDraw.group + ); + }, + + updateLayout: function (seriesModel) { + this._symbolDraw.updateLayout(seriesModel); + }, + + remove: function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(api, true); + } + }); + + +/***/ }, +/* 144 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var symbolUtil = __webpack_require__(100); + var zrUtil = __webpack_require__(3); + + var LargeSymbolPath = graphic.extendShape({ + shape: { + points: null, + sizes: null + }, + + symbolProxy: null, + + buildPath: function (path, shape) { + var points = shape.points; + var sizes = shape.sizes; + + var symbolProxy = this.symbolProxy; + var symbolProxyShape = symbolProxy.shape; + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + var size = sizes[i]; + if (size[0] < 4) { + // Optimize for small symbol + path.rect( + pt[0] - size[0] / 2, pt[1] - size[1] / 2, + size[0], size[1] + ); + } + else { + symbolProxyShape.x = pt[0] - size[0] / 2; + symbolProxyShape.y = pt[1] - size[1] / 2; + symbolProxyShape.width = size[0]; + symbolProxyShape.height = size[1]; + + symbolProxy.buildPath(path, symbolProxyShape); + } + } + } + }); + + function LargeSymbolDraw() { + this.group = new graphic.Group(); + + this._symbolEl = new LargeSymbolPath({ + silent: true + }); + } + + var largeSymbolProto = LargeSymbolDraw.prototype; + + /** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + */ + largeSymbolProto.updateData = function (data) { + this.group.removeAll(); + + var symbolEl = this._symbolEl; + + var seriesModel = data.hostModel; + + symbolEl.setShape({ + points: data.mapArray(data.getItemLayout), + sizes: data.mapArray( + function (idx) { + var size = data.getItemVisual(idx, 'symbolSize'); + if (!zrUtil.isArray(size)) { + size = [size, size]; + } + return size; + } + ) + }); + + // Create symbolProxy to build path for each data + symbolEl.symbolProxy = symbolUtil.createSymbol( + data.getVisual('symbol'), 0, 0, 0, 0 + ); + // Use symbolProxy setColor method + symbolEl.setColor = symbolEl.symbolProxy.setColor; + + symbolEl.setStyle( + seriesModel.getModel('itemStyle.normal').getItemStyle(['color']) + ); + + var visualColor = data.getVisual('color'); + if (visualColor) { + symbolEl.setColor(visualColor); + } + + // Add back + this.group.add(this._symbolEl); + }; + + largeSymbolProto.updateLayout = function (seriesModel) { + var data = seriesModel.getData(); + this._symbolEl.setShape({ + points: data.mapArray(data.getItemLayout) + }); + }; + + largeSymbolProto.remove = function () { + this.group.removeAll(); + }; + + module.exports = LargeSymbolDraw; + + +/***/ }, +/* 145 */, +/* 146 */, +/* 147 */, +/* 148 */, +/* 149 */, +/* 150 */, +/* 151 */, +/* 152 */, +/* 153 */, +/* 154 */, +/* 155 */, +/* 156 */, +/* 157 */, +/* 158 */, +/* 159 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/component/helper/RoamController + */ + + + + var Eventful = __webpack_require__(32); + var zrUtil = __webpack_require__(3); + var eventTool = __webpack_require__(80); + var interactionMutex = __webpack_require__(160); + + function mousedown(e) { + if (e.target && e.target.draggable) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + var rect = this.rect; + if (rect && rect.contain(x, y)) { + this._x = x; + this._y = y; + this._dragging = true; + } + } + + function mousemove(e) { + if (!this._dragging) { + return; + } + + eventTool.stop(e.event); + + if (e.gestureEvent !== 'pinch') { + + if (interactionMutex.isTaken('globalPan', this._zr)) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + + var dx = x - this._x; + var dy = y - this._y; + + this._x = x; + this._y = y; + + var target = this.target; + + if (target) { + var pos = target.position; + pos[0] += dx; + pos[1] += dy; + target.dirty(); + } + + eventTool.stop(e.event); + this.trigger('pan', dx, dy); + } + } + + function mouseup(e) { + this._dragging = false; + } + + function mousewheel(e) { + eventTool.stop(e.event); + // Convenience: + // Mac and VM Windows on Mac: scroll up: zoom out. + // Windows: scroll up: zoom in. + var zoomDelta = e.wheelDelta > 0 ? 1.1 : 1 / 1.1; + zoom.call(this, e, zoomDelta, e.offsetX, e.offsetY); + } + + function pinch(e) { + if (interactionMutex.isTaken('globalPan', this._zr)) { + return; + } + + eventTool.stop(e.event); + var zoomDelta = e.pinchScale > 1 ? 1.1 : 1 / 1.1; + zoom.call(this, e, zoomDelta, e.pinchX, e.pinchY); + } + + function zoom(e, zoomDelta, zoomX, zoomY) { + var rect = this.rect; + + if (rect && rect.contain(zoomX, zoomY)) { + + var target = this.target; + var zoomLimit = this.zoomLimit; + + if (target) { + var pos = target.position; + var scale = target.scale; + + var newZoom = this.zoom = this.zoom || 1; + newZoom *= zoomDelta; + if (zoomLimit) { + newZoom = Math.max( + Math.min(zoomLimit.max, newZoom), + zoomLimit.min + ); + } + var zoomScale = newZoom / this.zoom; + this.zoom = newZoom; + // Keep the mouse center when scaling + pos[0] -= (zoomX - pos[0]) * (zoomScale - 1); + pos[1] -= (zoomY - pos[1]) * (zoomScale - 1); + scale[0] *= zoomScale; + scale[1] *= zoomScale; + + target.dirty(); + } + + this.trigger('zoom', zoomDelta, zoomX, zoomY); + } + } + + /** + * @alias module:echarts/component/helper/RoamController + * @constructor + * @mixin {module:zrender/mixin/Eventful} + * + * @param {module:zrender/zrender~ZRender} zr + * @param {module:zrender/Element} target + * @param {module:zrender/core/BoundingRect} rect + */ + function RoamController(zr, target, rect) { + + /** + * @type {module:zrender/Element} + */ + this.target = target; + + /** + * @type {module:zrender/core/BoundingRect} + */ + this.rect = rect; + + /** + * { min: 1, max: 2 } + * @type {Object} + */ + this.zoomLimit; + + /** + * @type {number} + */ + this.zoom; + /** + * @type {module:zrender} + */ + this._zr = zr; + + // Avoid two roamController bind the same handler + var bind = zrUtil.bind; + var mousedownHandler = bind(mousedown, this); + var mousemoveHandler = bind(mousemove, this); + var mouseupHandler = bind(mouseup, this); + var mousewheelHandler = bind(mousewheel, this); + var pinchHandler = bind(pinch, this); + + Eventful.call(this); + + /** + * Notice: only enable needed types. For example, if 'zoom' + * is not needed, 'zoom' should not be enabled, otherwise + * default mousewheel behaviour (scroll page) will be disabled. + * + * @param {boolean|string} [controlType=true] Specify the control type, + * which can be null/undefined or true/false + * or 'pan/move' or 'zoom'/'scale' + */ + this.enable = function (controlType) { + // Disable previous first + this.disable(); + + if (controlType == null) { + controlType = true; + } + + if (controlType === true || (controlType === 'move' || controlType === 'pan')) { + zr.on('mousedown', mousedownHandler); + zr.on('mousemove', mousemoveHandler); + zr.on('mouseup', mouseupHandler); + } + if (controlType === true || (controlType === 'scale' || controlType === 'zoom')) { + zr.on('mousewheel', mousewheelHandler); + zr.on('pinch', pinchHandler); + } + }; + + this.disable = function () { + zr.off('mousedown', mousedownHandler); + zr.off('mousemove', mousemoveHandler); + zr.off('mouseup', mouseupHandler); + zr.off('mousewheel', mousewheelHandler); + zr.off('pinch', pinchHandler); + }; + + this.dispose = this.disable; + + this.isDragging = function () { + return this._dragging; + }; + + this.isPinching = function () { + return this._pinching; + }; + } + + zrUtil.mixin(RoamController, Eventful); + + module.exports = RoamController; + + +/***/ }, +/* 160 */ +/***/ function(module, exports) { + + + + var ATTR = '\0_ec_interaction_mutex'; + + var interactionMutex = { + + take: function (key, zr) { + getStore(zr)[key] = true; + }, + + release: function (key, zr) { + getStore(zr)[key] = false; + }, + + isTaken: function (key, zr) { + return !!getStore(zr)[key]; + } + }; + + function getStore(zr) { + return zr[ATTR] || (zr[ATTR] = {}); + } + + module.exports = interactionMutex; + + +/***/ }, +/* 161 */, +/* 162 */, +/* 163 */, +/* 164 */, +/* 165 */, +/* 166 */, +/* 167 */, +/* 168 */, +/* 169 */, +/* 170 */, +/* 171 */, +/* 172 */, +/* 173 */, +/* 174 */, +/* 175 */, +/* 176 */, +/* 177 */, +/* 178 */, +/* 179 */, +/* 180 */, +/* 181 */, +/* 182 */, +/* 183 */, +/* 184 */, +/* 185 */, +/* 186 */, +/* 187 */, +/* 188 */, +/* 189 */, +/* 190 */, +/* 191 */, +/* 192 */, +/* 193 */, +/* 194 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/LineDraw + */ + + + var graphic = __webpack_require__(42); + var LineGroup = __webpack_require__(195); + + /** + * @alias module:echarts/component/marker/LineDraw + * @constructor + */ + function LineDraw(ctor) { + this._ctor = ctor || LineGroup; + this.group = new graphic.Group(); + } + + var lineDrawProto = LineDraw.prototype; + + /** + * @param {module:echarts/data/List} lineData + * @param {module:echarts/data/List} [fromData] + * @param {module:echarts/data/List} [toData] + */ + lineDrawProto.updateData = function (lineData, fromData, toData) { + + var oldLineData = this._lineData; + var group = this.group; + var LineCtor = this._ctor; + + lineData.diff(oldLineData) + .add(function (idx) { + var lineGroup = new LineCtor(lineData, fromData, toData, idx); + + lineData.setItemGraphicEl(idx, lineGroup); + + group.add(lineGroup); + }) + .update(function (newIdx, oldIdx) { + var lineGroup = oldLineData.getItemGraphicEl(oldIdx); + lineGroup.updateData(lineData, fromData, toData, newIdx); + + lineData.setItemGraphicEl(newIdx, lineGroup); + + group.add(lineGroup); + }) + .remove(function (idx) { + group.remove(oldLineData.getItemGraphicEl(idx)); + }) + .execute(); + + this._lineData = lineData; + this._fromData = fromData; + this._toData = toData; + }; + + lineDrawProto.updateLayout = function () { + var lineData = this._lineData; + lineData.eachItemGraphicEl(function (el, idx) { + el.updateLayout(lineData, this._fromData, this._toData, idx); + }, this); + }; + + lineDrawProto.remove = function () { + this.group.removeAll(); + }; + + module.exports = LineDraw; + + +/***/ }, +/* 195 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/Line + */ + + + var symbolUtil = __webpack_require__(100); + var vector = __webpack_require__(16); + var LinePath = __webpack_require__(196); + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + + /** + * @inner + */ + function createSymbol(name, data, idx) { + var color = data.getItemVisual(idx, 'color'); + var symbolType = data.getItemVisual(idx, 'symbol'); + var symbolSize = data.getItemVisual(idx, 'symbolSize'); + + if (symbolType === 'none') { + return; + } + + if (!zrUtil.isArray(symbolSize)) { + symbolSize = [symbolSize, symbolSize]; + } + var symbolPath = symbolUtil.createSymbol( + symbolType, -symbolSize[0] / 2, -symbolSize[1] / 2, + symbolSize[0], symbolSize[1], color + ); + symbolPath.name = name; + + return symbolPath; + } + + function createLine(points) { + var line = new LinePath({ + name: 'line', + style: { + strokeNoScale: true + } + }); + setLinePoints(line.shape, points); + return line; + } + + function setLinePoints(targetShape, points) { + var p1 = points[0]; + var p2 = points[1]; + var cp1 = points[2]; + targetShape.x1 = p1[0]; + targetShape.y1 = p1[1]; + targetShape.x2 = p2[0]; + targetShape.y2 = p2[1]; + targetShape.percent = 1; + + if (cp1) { + targetShape.cpx1 = cp1[0]; + targetShape.cpy1 = cp1[1]; + } + } + + function isSymbolArrow(symbol) { + return symbol.type === 'symbol' && symbol.shape.symbolType === 'arrow'; + } + + function updateSymbolBeforeLineUpdate () { + var lineGroup = this; + var line = lineGroup.childOfName('line'); + // If line not changed + if (!this.__dirty && !line.__dirty) { + return; + } + var symbolFrom = lineGroup.childOfName('fromSymbol'); + var symbolTo = lineGroup.childOfName('toSymbol'); + var label = lineGroup.childOfName('label'); + var fromPos = line.pointAt(0); + var toPos = line.pointAt(line.shape.percent); + + var d = vector.sub([], toPos, fromPos); + vector.normalize(d, d); + + if (symbolFrom) { + symbolFrom.attr('position', fromPos); + // Rotate the arrow + // FIXME Hard coded ? + if (isSymbolArrow(symbolFrom)) { + symbolFrom.attr('rotation', tangentRotation(toPos, fromPos)); + } + } + if (symbolTo) { + symbolTo.attr('position', toPos); + if (isSymbolArrow(symbolTo)) { + symbolTo.attr('rotation', tangentRotation(fromPos, toPos)); + } + } + + label.attr('position', toPos); + + var textPosition; + var textAlign; + var textVerticalAlign; + // End + if (label.__position === 'end') { + textPosition = [d[0] * 5 + toPos[0], d[1] * 5 + toPos[1]]; + textAlign = d[0] > 0.8 ? 'left' : (d[0] < -0.8 ? 'right' : 'center'); + textVerticalAlign = d[1] > 0.8 ? 'top' : (d[1] < -0.8 ? 'bottom' : 'middle'); + } + // Start + else { + textPosition = [-d[0] * 5 + fromPos[0], -d[1] * 5 + fromPos[1]]; + textAlign = d[0] > 0.8 ? 'right' : (d[0] < -0.8 ? 'left' : 'center'); + textVerticalAlign = d[1] > 0.8 ? 'bottom' : (d[1] < -0.8 ? 'top' : 'middle'); + } + label.attr({ + style: { + // Use the user specified text align and baseline first + textVerticalAlign: label.__verticalAlign || textVerticalAlign, + textAlign: label.__textAlign || textAlign + }, + position: textPosition + }); + } + + function tangentRotation(p1, p2) { + return -Math.PI / 2 - Math.atan2( + p2[1] - p1[1], p2[0] - p1[0] + ); + } + + /** + * @constructor + * @extends {module:zrender/graphic/Group} + * @alias {module:echarts/chart/helper/Line} + */ + function Line(lineData, fromData, toData, idx) { + graphic.Group.call(this); + + this._createLine(lineData, fromData, toData, idx); + } + + var lineProto = Line.prototype; + + // Update symbol position and rotation + lineProto.beforeUpdate = updateSymbolBeforeLineUpdate; + + lineProto._createLine = function (lineData, fromData, toData, idx) { + var seriesModel = lineData.hostModel; + var linePoints = lineData.getItemLayout(idx); + + var line = createLine(linePoints); + line.shape.percent = 0; + graphic.initProps(line, { + shape: { + percent: 1 + } + }, seriesModel); + + this.add(line); + + var label = new graphic.Text({ + name: 'label' + }); + this.add(label); + + if (fromData) { + var symbolFrom = createSymbol('fromSymbol', fromData, idx); + // symbols must added after line to make sure + // it will be updated after line#update. + // Or symbol position and rotation update in line#beforeUpdate will be one frame slow + this.add(symbolFrom); + + this._fromSymbolType = fromData.getItemVisual(idx, 'symbol'); + } + if (toData) { + var symbolTo = createSymbol('toSymbol', toData, idx); + this.add(symbolTo); + + this._toSymbolType = toData.getItemVisual(idx, 'symbol'); + } + + this._updateCommonStl(lineData, fromData, toData, idx); + }; + + lineProto.updateData = function (lineData, fromData, toData, idx) { + var seriesModel = lineData.hostModel; + + var line = this.childOfName('line'); + var linePoints = lineData.getItemLayout(idx); + var target = { + shape: {} + }; + setLinePoints(target.shape, linePoints); + graphic.updateProps(line, target, seriesModel); + + // Symbol changed + if (fromData) { + var fromSymbolType = fromData.getItemVisual(idx, 'symbol'); + if (this._fromSymbolType !== fromSymbolType) { + var symbolFrom = createSymbol('fromSymbol', fromData, idx); + this.remove(this.childOfName('fromSymbol')); + this.add(symbolFrom); + } + this._fromSymbolType = fromSymbolType; + } + if (toData) { + var toSymbolType = toData.getItemVisual(idx, 'symbol'); + // Symbol changed + if (toSymbolType !== this._toSymbolType) { + var symbolTo = createSymbol('toSymbol', toData, idx); + this.remove(this.childOfName('toSymbol')); + this.add(symbolTo); + } + this._toSymbolType = toSymbolType; + } + + this._updateCommonStl(lineData, fromData, toData, idx); + }; + + lineProto._updateCommonStl = function (lineData, fromData, toData, idx) { + var seriesModel = lineData.hostModel; + + var line = this.childOfName('line'); + var itemModel = lineData.getItemModel(idx); + + var labelModel = itemModel.getModel('label.normal'); + var textStyleModel = labelModel.getModel('textStyle'); + var labelHoverModel = itemModel.getModel('label.emphasis'); + var textStyleHoverModel = labelHoverModel.getModel('textStyle'); + + var defaultText = numberUtil.round(seriesModel.getRawValue(idx)); + if (isNaN(defaultText)) { + // Use name + defaultText = lineData.getName(idx); + } + line.setStyle(zrUtil.extend( + { + stroke: lineData.getItemVisual(idx, 'color') + }, + itemModel.getModel('lineStyle.normal').getLineStyle() + )); + + var label = this.childOfName('label'); + label.setStyle({ + text: labelModel.get('show') + ? zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'normal'), + defaultText + ) + : '', + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() || lineData.getItemVisual(idx, 'color') + }); + label.hoverStyle = { + text: labelHoverModel.get('show') + ? zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'emphasis'), + defaultText + ) + : '', + textFont: textStyleHoverModel.getFont(), + fill: textStyleHoverModel.getTextColor() + }; + label.__textAlign = textStyleModel.get('align'); + label.__verticalAlign = textStyleModel.get('baseline'); + label.__position = labelModel.get('position'); + + graphic.setHoverStyle( + this, itemModel.getModel('lineStyle.emphasis').getLineStyle() + ); + }; + + lineProto.updateLayout = function (lineData, fromData, toData, idx) { + var points = lineData.getItemLayout(idx); + var linePath = this.childOfName('line'); + setLinePoints(linePath.shape, points); + linePath.dirty(true); + // var fromEl = fromData && fromData.getItemGraphicEl(idx); + // var toEl = toData && toData.getItemGraphicEl(idx); + // fromEl && fromEl.attr('position', points[0]); + // toEl && toEl.attr('position', points[1]); + }; + + zrUtil.inherits(Line, graphic.Group); + + module.exports = Line; + + +/***/ }, +/* 196 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Line path for bezier and straight line draw + */ + + var graphic = __webpack_require__(42); + + var straightLineProto = graphic.Line.prototype; + var bezierCurveProto = graphic.BezierCurve.prototype; + + module.exports = graphic.extendShape({ + + type: 'ec-line', + + style: { + stroke: '#000', + fill: null + }, + + shape: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + percent: 1, + cpx1: null, + cpy1: null + }, + + buildPath: function (ctx, shape) { + (shape.cpx1 == null || shape.cpy1 == null + ? straightLineProto : bezierCurveProto).buildPath(ctx, shape); + }, + + pointAt: function (t) { + var shape = this.shape; + return shape.cpx1 == null || shape.cpy1 == null + ? straightLineProto.pointAt.call(this, t) + : bezierCurveProto.pointAt.call(this, t); + } + }); + + +/***/ }, +/* 197 */, +/* 198 */, +/* 199 */, +/* 200 */, +/* 201 */, +/* 202 */, +/* 203 */, +/* 204 */, +/* 205 */, +/* 206 */, +/* 207 */, +/* 208 */, +/* 209 */, +/* 210 */, +/* 211 */, +/* 212 */, +/* 213 */, +/* 214 */, +/* 215 */, +/* 216 */, +/* 217 */, +/* 218 */, +/* 219 */, +/* 220 */, +/* 221 */, +/* 222 */, +/* 223 */, +/* 224 */, +/* 225 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Box selection tool. + * + * @module echarts/component/helper/SelectController + */ + + + + var Eventful = __webpack_require__(32); + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var bind = zrUtil.bind; + var each = zrUtil.each; + var mathMin = Math.min; + var mathMax = Math.max; + var mathPow = Math.pow; + + var COVER_Z = 10000; + var UNSELECT_THRESHOLD = 2; + var EVENTS = ['mousedown', 'mousemove', 'mouseup']; + + /** + * @alias module:echarts/component/helper/SelectController + * @constructor + * @mixin {module:zrender/mixin/Eventful} + * + * @param {string} type 'line', 'rect' + * @param {module:zrender/zrender~ZRender} zr + * @param {Object} [opt] + * @param {number} [opt.width] + * @param {number} [opt.lineWidth] + * @param {string} [opt.stroke] + * @param {string} [opt.fill] + */ + function SelectController(type, zr, opt) { + + Eventful.call(this); + + /** + * @type {string} + * @readOnly + */ + this.type = type; + + /** + * @type {module:zrender/zrender~ZRender} + */ + this.zr = zr; + + /** + * @type {Object} + * @readOnly + */ + this.opt = zrUtil.clone(opt); + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new graphic.Group(); + + /** + * @type {module:zrender/core/BoundingRect} + */ + this._containerRect = null; + + /** + * @type {Array.} + * @private + */ + this._track = []; + + /** + * @type {boolean} + */ + this._dragging; + + /** + * @type {module:zrender/Element} + * @private + */ + this._cover; + + /** + * @type {boolean} + * @private + */ + this._disabled = true; + + /** + * @type {Object} + * @private + */ + this._handlers = { + mousedown: bind(mousedown, this), + mousemove: bind(mousemove, this), + mouseup: bind(mouseup, this) + }; + + each(EVENTS, function (eventName) { + this.zr.on(eventName, this._handlers[eventName]); + }, this); + } + + SelectController.prototype = { + + constructor: SelectController, + + /** + * @param {module:zrender/mixin/Transformable} container + * @param {module:zrender/core/BoundingRect|boolean} [rect] If not specified, + * use container.getBoundingRect(). + * If false, do not use containerRect. + */ + enable: function (container, rect) { + + this._disabled = false; + + // Remove from old container. + removeGroup.call(this); + + // boundingRect will change when dragging, so we have + // to keep initial boundingRect. + this._containerRect = rect !== false + ? (rect || container.getBoundingRect()) : null; + + // Add to new container. + container.add(this.group); + }, + + /** + * Update cover location. + * @param {Array.|Object} ranges If null/undefined, remove cover. + */ + update: function (ranges) { + // TODO + // Only support one interval yet. + renderCover.call(this, ranges && zrUtil.clone(ranges)); + }, + + disable: function () { + this._disabled = true; + + removeGroup.call(this); + }, + + dispose: function () { + this.disable(); + + each(EVENTS, function (eventName) { + this.zr.off(eventName, this._handlers[eventName]); + }, this); + } + }; + + + zrUtil.mixin(SelectController, Eventful); + + function updateZ(group) { + group.traverse(function (el) { + el.z = COVER_Z; + }); + } + + function isInContainer(x, y) { + var localPos = this.group.transformCoordToLocal(x, y); + return !this._containerRect + || this._containerRect.contain(localPos[0], localPos[1]); + } + + function preventDefault(e) { + var rawE = e.event; + rawE.preventDefault && rawE.preventDefault(); + } + + function mousedown(e) { + if (this._disabled || (e.target && e.target.draggable)) { + return; + } + + preventDefault(e); + + var x = e.offsetX; + var y = e.offsetY; + + if (isInContainer.call(this, x, y)) { + this._dragging = true; + this._track = [[x, y]]; + } + } + + function mousemove(e) { + if (!this._dragging || this._disabled) { + return; + } + + preventDefault(e); + + updateViewByCursor.call(this, e); + } + + function mouseup(e) { + if (!this._dragging || this._disabled) { + return; + } + + preventDefault(e); + + updateViewByCursor.call(this, e, true); + + this._dragging = false; + this._track = []; + } + + function updateViewByCursor(e, isEnd) { + var x = e.offsetX; + var y = e.offsetY; + + if (isInContainer.call(this, x, y)) { + this._track.push([x, y]); + + // Create or update cover. + var ranges = shouldShowCover.call(this) + ? coverRenderers[this.type].getRanges.call(this) + // Remove cover. + : []; + + renderCover.call(this, ranges); + + this.trigger('selected', zrUtil.clone(ranges)); + + if (isEnd) { + this.trigger('selectEnd', zrUtil.clone(ranges)); + } + } + } + + function shouldShowCover() { + var track = this._track; + + if (!track.length) { + return false; + } + + var p2 = track[track.length - 1]; + var p1 = track[0]; + var dx = p2[0] - p1[0]; + var dy = p2[1] - p1[1]; + var dist = mathPow(dx * dx + dy * dy, 0.5); + + return dist > UNSELECT_THRESHOLD; + } + + function renderCover(ranges) { + var coverRenderer = coverRenderers[this.type]; + + if (ranges && ranges.length) { + if (!this._cover) { + this._cover = coverRenderer.create.call(this); + this.group.add(this._cover); + } + coverRenderer.update.call(this, ranges); + } + else { + this.group.remove(this._cover); + this._cover = null; + } + + updateZ(this.group); + } + + function removeGroup() { + // container may 'removeAll' outside. + var group = this.group; + var container = group.parent; + if (container) { + container.remove(group); + } + } + + function createRectCover() { + var opt = this.opt; + return new graphic.Rect({ + // FIXME + // customize style. + style: { + stroke: opt.stroke, + fill: opt.fill, + lineWidth: opt.lineWidth, + opacity: opt.opacity + } + }); + } + + function getLocalTrack() { + return zrUtil.map(this._track, function (point) { + return this.group.transformCoordToLocal(point[0], point[1]); + }, this); + } + + function getLocalTrackEnds() { + var localTrack = getLocalTrack.call(this); + var tail = localTrack.length - 1; + tail < 0 && (tail = 0); + return [localTrack[0], localTrack[tail]]; + } + + /** + * key: this.type + * @type {Object} + */ + var coverRenderers = { + + line: { + + create: createRectCover, + + getRanges: function () { + var ends = getLocalTrackEnds.call(this); + var min = mathMin(ends[0][0], ends[1][0]); + var max = mathMax(ends[0][0], ends[1][0]); + + return [[min, max]]; + }, + + update: function (ranges) { + var range = ranges[0]; + var width = this.opt.width; + this._cover.setShape({ + x: range[0], + y: -width / 2, + width: range[1] - range[0], + height: width + }); + } + }, + + rect: { + + create: createRectCover, + + getRanges: function () { + var ends = getLocalTrackEnds.call(this); + + var min = [ + mathMin(ends[1][0], ends[0][0]), + mathMin(ends[1][1], ends[0][1]) + ]; + var max = [ + mathMax(ends[1][0], ends[0][0]), + mathMax(ends[1][1], ends[0][1]) + ]; + + return [[ + [min[0], max[0]], // x range + [min[1], max[1]] // y range + ]]; + }, + + update: function (ranges) { + var range = ranges[0]; + this._cover.setShape({ + x: range[0][0], + y: range[1][0], + width: range[0][1] - range[0][0], + height: range[1][1] - range[1][0] + }); + } + } + }; + + module.exports = SelectController; + + +/***/ }, +/* 226 */, +/* 227 */, +/* 228 */, +/* 229 */, +/* 230 */, +/* 231 */, +/* 232 */, +/* 233 */, +/* 234 */, +/* 235 */, +/* 236 */, +/* 237 */, +/* 238 */, +/* 239 */, +/* 240 */, +/* 241 */, +/* 242 */, +/* 243 */, +/* 244 */, +/* 245 */, +/* 246 */, +/* 247 */, +/* 248 */, +/* 249 */, +/* 250 */, +/* 251 */, +/* 252 */, +/* 253 */, +/* 254 */, +/* 255 */, +/* 256 */, +/* 257 */, +/* 258 */, +/* 259 */, +/* 260 */, +/* 261 */, +/* 262 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Legend component entry file8 + */ + + + __webpack_require__(263); + __webpack_require__(264); + __webpack_require__(265); + + var echarts = __webpack_require__(1); + // Series Filter + echarts.registerProcessor('filter', __webpack_require__(267)); + + +/***/ }, +/* 263 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var Model = __webpack_require__(8); + + var LegendModel = __webpack_require__(1).extendComponentModel({ + + type: 'legend', + + dependencies: ['series'], + + layoutMode: { + type: 'box', + ignoreSize: true + }, + + init: function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + + option.selected = option.selected || {}; + + this._updateData(ecModel); + + var legendData = this._data; + // If has any selected in option.selected + var selectedMap = this.option.selected; + // If selectedMode is single, try to select one + if (legendData[0] && this.get('selectedMode') === 'single') { + var hasSelected = false; + for (var name in selectedMap) { + if (selectedMap[name]) { + this.select(name); + hasSelected = true; + } + } + // Try select the first if selectedMode is single + !hasSelected && this.select(legendData[0].get('name')); + } + }, + + mergeOption: function (option) { + LegendModel.superCall(this, 'mergeOption', option); + + this._updateData(this.ecModel); + }, + + _updateData: function (ecModel) { + var legendData = zrUtil.map(this.get('data') || [], function (dataItem) { + if (typeof dataItem === 'string') { + dataItem = { + name: dataItem + }; + } + return new Model(dataItem, this, this.ecModel); + }, this); + this._data = legendData; + + var availableNames = zrUtil.map(ecModel.getSeries(), function (series) { + return series.name; + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.legendDataProvider) { + var data = seriesModel.legendDataProvider(); + availableNames = availableNames.concat(data.mapArray(data.getName)); + } + }); + /** + * @type {Array.} + * @private + */ + this._availableNames = availableNames; + }, + + /** + * @return {Array.} + */ + getData: function () { + return this._data; + }, + + /** + * @param {string} name + */ + select: function (name) { + var selected = this.option.selected; + var selectedMode = this.get('selectedMode'); + if (selectedMode === 'single') { + var data = this._data; + zrUtil.each(data, function (dataItem) { + selected[dataItem.get('name')] = false; + }); + } + selected[name] = true; + }, + + /** + * @param {string} name + */ + unSelect: function (name) { + if (this.get('selectedMode') !== 'single') { + this.option.selected[name] = false; + } + }, + + /** + * @param {string} name + */ + toggleSelected: function (name) { + var selected = this.option.selected; + // Default is true + if (!(name in selected)) { + selected[name] = true; + } + this[selected[name] ? 'unSelect' : 'select'](name); + }, + + /** + * @param {string} name + */ + isSelected: function (name) { + var selected = this.option.selected; + return !((name in selected) && !selected[name]) + && zrUtil.indexOf(this._availableNames, name) >= 0; + }, + + defaultOption: { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 4, + show: true, + + // 布局方式,默认为水平布局,可选为: + // 'horizontal' | 'vertical' + orient: 'horizontal', + + left: 'center', + // right: 'center', + + top: 'top', + // bottom: 'top', + + // 水平对齐 + // 'auto' | 'left' | 'right' + // 默认为 'auto', 根据 x 的位置判断是左对齐还是右对齐 + align: 'auto', + + backgroundColor: 'rgba(0,0,0,0)', + // 图例边框颜色 + borderColor: '#ccc', + // 图例边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + // 图例内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + // 各个item之间的间隔,单位px,默认为10, + // 横向布局时为水平间隔,纵向布局时为纵向间隔 + itemGap: 10, + // 图例图形宽度 + itemWidth: 25, + // 图例图形高度 + itemHeight: 14, + textStyle: { + // 图例文字颜色 + color: '#333' + }, + // formatter: '', + // 选择模式,默认开启图例开关 + selectedMode: true + // 配置默认选中状态,可配合LEGEND.SELECTED事件做动态数据载入 + // selected: null, + // 图例内容(详见legend.data,数组中每一项代表一个item + // data: [], + } + }); + + module.exports = LegendModel; + + +/***/ }, +/* 264 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Legend action + */ + + + var echarts = __webpack_require__(1); + var zrUtil = __webpack_require__(3); + + function legendSelectActionHandler(methodName, payload, ecModel) { + var selectedMap = {}; + var isToggleSelect = methodName === 'toggleSelected'; + var isSelected; + // Update all legend components + ecModel.eachComponent('legend', function (legendModel) { + if (isToggleSelect && isSelected != null) { + // Force other legend has same selected status + // Or the first is toggled to true and other are toggled to false + // In the case one legend has some item unSelected in option. And if other legend + // doesn't has the item, they will assume it is selected. + legendModel[isSelected ? 'select' : 'unSelect'](payload.name); + } + else { + legendModel[methodName](payload.name); + isSelected = legendModel.isSelected(payload.name); + } + var legendData = legendModel.getData(); + zrUtil.each(legendData, function (model) { + var name = model.get('name'); + // Wrap element + if (name === '\n' || name === '') { + return; + } + var isItemSelected = legendModel.isSelected(name); + if (name in selectedMap) { + // Unselected if any legend is unselected + selectedMap[name] = selectedMap[name] && isItemSelected; + } + else { + selectedMap[name] = isItemSelected; + } + }); + }); + // Return the event explicitly + return { + name: payload.name, + selected: selectedMap + }; + } + /** + * @event legendToggleSelect + * @type {Object} + * @property {string} type 'legendToggleSelect' + * @property {string} [from] + * @property {string} name Series name or data item name + */ + echarts.registerAction( + 'legendToggleSelect', 'legendselectchanged', + zrUtil.curry(legendSelectActionHandler, 'toggleSelected') + ); + + /** + * @event legendSelect + * @type {Object} + * @property {string} type 'legendSelect' + * @property {string} name Series name or data item name + */ + echarts.registerAction( + 'legendSelect', 'legendselected', + zrUtil.curry(legendSelectActionHandler, 'select') + ); + + /** + * @event legendUnSelect + * @type {Object} + * @property {string} type 'legendUnSelect' + * @property {string} name Series name or data item name + */ + echarts.registerAction( + 'legendUnSelect', 'legendunselected', + zrUtil.curry(legendSelectActionHandler, 'unSelect') + ); + + +/***/ }, +/* 265 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var symbolCreator = __webpack_require__(100); + var graphic = __webpack_require__(42); + var listComponentHelper = __webpack_require__(266); + + var curry = zrUtil.curry; + + var LEGEND_DISABLE_COLOR = '#ccc'; + + function dispatchSelectAction(name, api) { + api.dispatchAction({ + type: 'legendToggleSelect', + name: name + }); + } + + function dispatchHighlightAction(seriesModel, dataName, api) { + seriesModel.get('legendHoverLink') && api.dispatchAction({ + type: 'highlight', + seriesName: seriesModel.name, + name: dataName + }); + } + + function dispatchDownplayAction(seriesModel, dataName, api) { + seriesModel.get('legendHoverLink') && api.dispatchAction({ + type: 'downplay', + seriesName: seriesModel.name, + name: dataName + }); + } + + module.exports = __webpack_require__(1).extendComponentView({ + + type: 'legend', + + init: function () { + this._symbolTypeStore = {}; + }, + + render: function (legendModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + if (!legendModel.get('show')) { + return; + } + + var selectMode = legendModel.get('selectedMode'); + var itemAlign = legendModel.get('align'); + + if (itemAlign === 'auto') { + itemAlign = (legendModel.get('left') === 'right' + && legendModel.get('orient') === 'vertical') + ? 'right' : 'left'; + } + + var legendItemMap = {}; + var legendDrawedMap = {}; + zrUtil.each(legendModel.getData(), function (itemModel) { + var seriesName = itemModel.get('name'); + // Use empty string or \n as a newline string + if (seriesName === '' || seriesName === '\n') { + group.add(new graphic.Group({ + newline: true + })); + } + + var seriesModel = ecModel.getSeriesByName(seriesName)[0]; + + legendItemMap[seriesName] = itemModel; + + if (!seriesModel || legendDrawedMap[seriesName]) { + // Series not exists + return; + } + + var data = seriesModel.getData(); + var color = data.getVisual('color'); + + // If color is a callback function + if (typeof color === 'function') { + // Use the first data + color = color(seriesModel.getDataParams(0)); + } + + // Using rect symbol defaultly + var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect'; + var symbolType = data.getVisual('symbol'); + + var itemGroup = this._createItem( + seriesName, itemModel, legendModel, + legendSymbolType, symbolType, + itemAlign, color, + selectMode + ); + + itemGroup.on('click', curry(dispatchSelectAction, seriesName, api)) + .on('mouseover', curry(dispatchHighlightAction, seriesModel, '', api)) + .on('mouseout', curry(dispatchDownplayAction, seriesModel, '', api)); + + legendDrawedMap[seriesName] = true; + }, this); + + ecModel.eachRawSeries(function (seriesModel) { + if (seriesModel.legendDataProvider) { + var data = seriesModel.legendDataProvider(); + data.each(function (idx) { + var name = data.getName(idx); + + // Avoid mutiple series use the same data name + if (!legendItemMap[name] || legendDrawedMap[name]) { + return; + } + + var color = data.getItemVisual(idx, 'color'); + + var legendSymbolType = 'roundRect'; + + var itemGroup = this._createItem( + name, legendItemMap[name], legendModel, + legendSymbolType, null, + itemAlign, color, + selectMode + ); + + itemGroup.on('click', curry(dispatchSelectAction, name, api)) + // FIXME Should not specify the series name + .on('mouseover', curry(dispatchHighlightAction, seriesModel, name, api)) + .on('mouseout', curry(dispatchDownplayAction, seriesModel, name, api)); + + legendDrawedMap[name] = true; + }, false, this); + } + }, this); + + listComponentHelper.layout(group, legendModel, api); + // Render background after group is layout + // FIXME + listComponentHelper.addBackground(group, legendModel); + }, + + _createItem: function ( + name, itemModel, legendModel, + legendSymbolType, symbolType, + itemAlign, color, selectMode + ) { + var itemWidth = legendModel.get('itemWidth'); + var itemHeight = legendModel.get('itemHeight'); + + var isSelected = legendModel.isSelected(name); + var itemGroup = new graphic.Group(); + + var textStyleModel = itemModel.getModel('textStyle'); + + var itemIcon = itemModel.get('icon'); + + // Use user given icon first + legendSymbolType = itemIcon || legendSymbolType; + itemGroup.add(symbolCreator.createSymbol( + legendSymbolType, 0, 0, itemWidth, itemHeight, isSelected ? color : LEGEND_DISABLE_COLOR + )); + + // Compose symbols + // PENDING + if (!itemIcon && symbolType + // At least show one symbol, can't be all none + && ((symbolType !== legendSymbolType) || symbolType == 'none') + ) { + var size = itemHeight * 0.8; + if (symbolType === 'none') { + symbolType = 'circle'; + } + // Put symbol in the center + itemGroup.add(symbolCreator.createSymbol( + symbolType, (itemWidth - size) / 2, (itemHeight - size) / 2, size, size, + isSelected ? color : LEGEND_DISABLE_COLOR + )); + } + + // Text + var textX = itemAlign === 'left' ? itemWidth + 5 : -5; + var textAlign = itemAlign; + + var formatter = legendModel.get('formatter'); + if (typeof formatter === 'string' && formatter) { + name = formatter.replace('{name}', name); + } + else if (typeof formatter === 'function') { + name = formatter(name); + } + + var text = new graphic.Text({ + style: { + text: name, + x: textX, + y: itemHeight / 2, + fill: isSelected ? textStyleModel.getTextColor() : LEGEND_DISABLE_COLOR, + textFont: textStyleModel.getFont(), + textAlign: textAlign, + textVerticalAlign: 'middle' + } + }); + itemGroup.add(text); + + // Add a invisible rect to increase the area of mouse hover + itemGroup.add(new graphic.Rect({ + shape: itemGroup.getBoundingRect(), + invisible: true + })); + + itemGroup.eachChild(function (child) { + child.silent = !selectMode; + }); + + this.group.add(itemGroup); + + graphic.setHoverStyle(itemGroup); + + return itemGroup; + } + }); + + +/***/ }, +/* 266 */ +/***/ function(module, exports, __webpack_require__) { + + + // List layout + var layout = __webpack_require__(21); + var formatUtil = __webpack_require__(6); + var graphic = __webpack_require__(42); + + function positionGroup(group, model, api) { + layout.positionGroup( + group, model.getBoxLayoutParams(), + { + width: api.getWidth(), + height: api.getHeight() + }, + model.get('padding') + ); + } + + module.exports = { + /** + * Layout list like component. + * It will box layout each items in group of component and then position the whole group in the viewport + * @param {module:zrender/group/Group} group + * @param {module:echarts/model/Component} componentModel + * @param {module:echarts/ExtensionAPI} + */ + layout: function (group, componentModel, api) { + var rect = layout.getLayoutRect(componentModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }, componentModel.get('padding')); + layout.box( + componentModel.get('orient'), + group, + componentModel.get('itemGap'), + rect.width, + rect.height + ); + + positionGroup(group, componentModel, api); + }, + + addBackground: function (group, componentModel) { + var padding = formatUtil.normalizeCssArray( + componentModel.get('padding') + ); + var boundingRect = group.getBoundingRect(); + var style = componentModel.getItemStyle(['color', 'opacity']); + style.fill = componentModel.get('backgroundColor'); + var rect = new graphic.Rect({ + shape: { + x: boundingRect.x - padding[3], + y: boundingRect.y - padding[0], + width: boundingRect.width + padding[1] + padding[3], + height: boundingRect.height + padding[0] + padding[2] + }, + style: style, + silent: true, + z2: -1 + }); + graphic.subPixelOptimizeRect(rect); + + group.add(rect); + } + }; + + +/***/ }, +/* 267 */ +/***/ function(module, exports) { + + + module.exports = function (ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (legendModels && legendModels.length) { + ecModel.filterSeries(function (series) { + // If in any legend component the status is not selected. + // Because in legend series is assumed selected when it is not in the legend data. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(series.name)) { + return false; + } + } + return true; + }); + } + }; + + +/***/ }, +/* 268 */ +/***/ function(module, exports, __webpack_require__) { + + // FIXME Better way to pack data in graphic element + + + __webpack_require__(269); + + __webpack_require__(270); + + // Show tip action + /** + * @action + * @property {string} type + * @property {number} seriesIndex + * @property {number} dataIndex + * @property {number} [x] + * @property {number} [y] + */ + __webpack_require__(1).registerAction( + { + type: 'showTip', + event: 'showTip', + update: 'none' + }, + // noop + function () {} + ); + // Hide tip action + __webpack_require__(1).registerAction( + { + type: 'hideTip', + event: 'hideTip', + update: 'none' + }, + // noop + function () {} + ); + + +/***/ }, +/* 269 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(1).extendComponentModel({ + + type: 'tooltip', + + defaultOption: { + zlevel: 0, + + z: 8, + + show: true, + + // tooltip主体内容 + showContent: true, + + // 触发类型,默认数据触发,见下图,可选为:'item' ¦ 'axis' + trigger: 'item', + + // 触发条件,支持 'click' | 'mousemove' + triggerOn: 'mousemove', + + // 是否永远显示 content + alwaysShowContent: false, + + // 位置 {Array} | {Function} + // position: null + + // 内容格式器:{string}(Template) ¦ {Function} + // formatter: null + + // 隐藏延迟,单位ms + hideDelay: 100, + + // 动画变换时间,单位s + transitionDuration: 0.4, + + enterable: false, + + // 提示背景颜色,默认为透明度为0.7的黑色 + backgroundColor: 'rgba(50,50,50,0.7)', + + // 提示边框颜色 + borderColor: '#333', + + // 提示边框圆角,单位px,默认为4 + borderRadius: 4, + + // 提示边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + + // 提示内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + + // Extra css text + extraCssText: '', + + // 坐标轴指示器,坐标轴触发有效 + axisPointer: { + // 默认为直线 + // 可选为:'line' | 'shadow' | 'cross' + type: 'line', + + // type 为 line 的时候有效,指定 tooltip line 所在的轴,可选 + // 可选 'x' | 'y' | 'angle' | 'radius' | 'auto' + // 默认 'auto',会选择类型为 cateogry 的轴,对于双数值轴,笛卡尔坐标系会默认选择 x 轴 + // 极坐标系会默认选择 angle 轴 + axis: 'auto', + + animation: true, + animationDurationUpdate: 200, + animationEasingUpdate: 'exponentialOut', + + // 直线指示器样式设置 + lineStyle: { + color: '#555', + width: 1, + type: 'solid' + }, + + crossStyle: { + color: '#555', + width: 1, + type: 'dashed', + + // TODO formatter + textStyle: {} + }, + + // 阴影指示器样式设置 + shadowStyle: { + color: 'rgba(150,150,150,0.3)' + } + }, + textStyle: { + color: '#fff', + fontSize: 14 + } + } + }); + + +/***/ }, +/* 270 */ +/***/ function(module, exports, __webpack_require__) { + + + + var TooltipContent = __webpack_require__(271); + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var formatUtil = __webpack_require__(6); + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + var env = __webpack_require__(78); + + function dataEqual(a, b) { + if (!a || !b) { + return false; + } + var round = numberUtil.round; + return round(a[0]) === round(b[0]) + && round(a[1]) === round(b[1]); + } + /** + * @inner + */ + function makeLineShape(x1, y1, x2, y2) { + return { + x1: x1, + y1: y1, + x2: x2, + y2: y2 + }; + } + + /** + * @inner + */ + function makeRectShape(x, y, width, height) { + return { + x: x, + y: y, + width: width, + height: height + }; + } + + /** + * @inner + */ + function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) { + return { + cx: cx, + cy: cy, + r0: r0, + r: r, + startAngle: startAngle, + endAngle: endAngle, + clockwise: true + }; + } + + function refixTooltipPosition(x, y, el, viewWidth, viewHeight) { + var width = el.clientWidth; + var height = el.clientHeight; + var gap = 20; + + if (x + width + gap > viewWidth) { + x -= width + gap; + } + else { + x += gap; + } + if (y + height + gap > viewHeight) { + y -= height + gap; + } + else { + y += gap; + } + return [x, y]; + } + + function calcTooltipPosition(position, rect, dom) { + var domWidth = dom.clientWidth; + var domHeight = dom.clientHeight; + var gap = 5; + var x = 0; + var y = 0; + var rectWidth = rect.width; + var rectHeight = rect.height; + switch (position) { + case 'inside': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + case 'top': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y - domHeight - gap; + break; + case 'bottom': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight + gap; + break; + case 'left': + x = rect.x - domWidth - gap; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + case 'right': + x = rect.x + rectWidth + gap; + y = rect.y + rectHeight / 2 - domHeight / 2; + } + return [x, y]; + } + + /** + * @param {string|Function|Array.} positionExpr + * @param {number} x Mouse x + * @param {number} y Mouse y + * @param {module:echarts/component/tooltip/TooltipContent} content + * @param {Object|} params + * @param {module:zrender/Element} el target element + * @param {module:echarts/ExtensionAPI} api + * @return {Array.} + */ + function updatePosition(positionExpr, x, y, content, params, el, api) { + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + + var rect = el && el.getBoundingRect().clone(); + el && rect.applyTransform(el.transform); + if (typeof positionExpr === 'function') { + // Callback of position can be an array or a string specify the positiont + positionExpr = positionExpr([x, y], params, rect); + } + + if (zrUtil.isArray(positionExpr)) { + x = parsePercent(positionExpr[0], viewWidth); + y = parsePercent(positionExpr[1], viewHeight); + } + // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element + else if (typeof positionExpr === 'string' && el) { + var pos = calcTooltipPosition( + positionExpr, rect, content.el + ); + x = pos[0]; + y = pos[1]; + } + else { + var pos = refixTooltipPosition( + x, y, content.el, viewWidth, viewHeight + ); + x = pos[0]; + y = pos[1]; + } + + content.moveTo(x, y); + } + + function ifSeriesSupportAxisTrigger(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var trigger = seriesModel.get('tooltip.trigger', true); + // Ignore series use item tooltip trigger and series coordinate system is not cartesian or + return !(!coordSys + || (coordSys.type !== 'cartesian2d' && coordSys.type !== 'polar' && coordSys.type !== 'single') + || trigger === 'item'); + } + + __webpack_require__(1).extendComponentView({ + + type: 'tooltip', + + _axisPointers: {}, + + init: function (ecModel, api) { + if (env.node) { + return; + } + var tooltipContent = new TooltipContent(api.getDom(), api); + this._tooltipContent = tooltipContent; + + api.on('showTip', this._manuallyShowTip, this); + api.on('hideTip', this._manuallyHideTip, this); + }, + + render: function (tooltipModel, ecModel, api) { + if (env.node) { + return; + } + + // Reset + this.group.removeAll(); + + /** + * @type {Object} + * @private + */ + this._axisPointers = {}; + + /** + * @private + * @type {module:echarts/component/tooltip/TooltipModel} + */ + this._tooltipModel = tooltipModel; + + /** + * @private + * @type {module:echarts/model/Global} + */ + this._ecModel = ecModel; + + /** + * @private + * @type {module:echarts/ExtensionAPI} + */ + this._api = api; + + /** + * @type {Object} + * @private + */ + this._lastHover = { + // data + // payloadBatch + }; + + var tooltipContent = this._tooltipContent; + tooltipContent.update(); + tooltipContent.enterable = tooltipModel.get('enterable'); + this._alwaysShowContent = tooltipModel.get('alwaysShowContent'); + + /** + * @type {Object.} + */ + this._seriesGroupByAxis = this._prepareAxisTriggerData( + tooltipModel, ecModel + ); + + var crossText = this._crossText; + if (crossText) { + this.group.add(crossText); + } + + // Try to keep the tooltip show when refreshing + if (this._lastX != null && this._lastY != null) { + var self = this; + clearTimeout(this._refreshUpdateTimeout); + this._refreshUpdateTimeout = setTimeout(function () { + // Show tip next tick after other charts are rendered + // In case highlight action has wrong result + // FIXME + self._manuallyShowTip({ + x: self._lastX, + y: self._lastY + }); + }); + } + + var zr = this._api.getZr(); + var tryShow = this._tryShow; + zr.off('click', tryShow); + zr.off('mousemove', tryShow); + zr.off('mouseout', this._hide); + if (tooltipModel.get('triggerOn') === 'click') { + zr.on('click', tryShow, this); + } + else { + zr.on('mousemove', tryShow, this); + zr.on('mouseout', this._hide, this); + } + + }, + + /** + * Show tip manually by + * dispatchAction({ + * type: 'showTip', + * x: 10, + * y: 10 + * }); + * Or + * dispatchAction({ + * type: 'showTip', + * seriesIndex: 0, + * dataIndex: 1 + * }); + * + * TODO Batch + */ + _manuallyShowTip: function (event) { + // From self + if (event.from === this.uid) { + return; + } + + var ecModel = this._ecModel; + var seriesIndex = event.seriesIndex; + var dataIndex = event.dataIndex; + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + var api = this._api; + + if (event.x == null || event.y == null) { + if (!seriesModel) { + // Find the first series can use axis trigger + ecModel.eachSeries(function (_series) { + if (ifSeriesSupportAxisTrigger(_series) && !seriesModel) { + seriesModel = _series; + } + }); + } + if (seriesModel) { + var data = seriesModel.getData(); + if (dataIndex == null) { + dataIndex = data.indexOfName(event.name); + } + var el = data.getItemGraphicEl(dataIndex); + var cx, cy; + // Try to get the point in coordinate system + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.dataToPoint) { + var point = coordSys.dataToPoint( + data.getValues(coordSys.dimensions, dataIndex, true) + ); + cx = point && point[0]; + cy = point && point[1]; + } + else if (el) { + // Use graphic bounding rect + var rect = el.getBoundingRect().clone(); + rect.applyTransform(el.transform); + cx = rect.x + rect.width / 2; + cy = rect.y + rect.height / 2; + } + if (cx != null && cy != null) { + this._tryShow({ + offsetX: cx, + offsetY: cy, + target: el, + event: {} + }); + } + } + } + else { + var el = api.getZr().handler.findHover(event.x, event.y); + this._tryShow({ + offsetX: event.x, + offsetY: event.y, + target: el, + event: {} + }); + } + }, + + _manuallyHideTip: function (e) { + if (e.from === this.uid) { + return; + } + + this._hide(); + }, + + _prepareAxisTriggerData: function (tooltipModel, ecModel) { + // Prepare data for axis trigger + var seriesGroupByAxis = {}; + ecModel.eachSeries(function (seriesModel) { + if (ifSeriesSupportAxisTrigger(seriesModel)) { + var coordSys = seriesModel.coordinateSystem; + var baseAxis; + var key; + + // Only cartesian2d, polar and single support axis trigger + if (coordSys.type === 'cartesian2d') { + // FIXME `axisPointer.axis` is not baseAxis + baseAxis = coordSys.getBaseAxis(); + key = baseAxis.dim + baseAxis.index; + } + else if (coordSys.type === 'single') { + baseAxis = coordSys.getAxis(); + key = baseAxis.dim + baseAxis.type; + } + else { + baseAxis = coordSys.getBaseAxis(); + key = baseAxis.dim + coordSys.name; + } + + seriesGroupByAxis[key] = seriesGroupByAxis[key] || { + coordSys: [], + series: [] + }; + seriesGroupByAxis[key].coordSys.push(coordSys); + seriesGroupByAxis[key].series.push(seriesModel); + } + }, this); + + return seriesGroupByAxis; + }, + + /** + * mousemove handler + * @param {Object} e + * @private + */ + _tryShow: function (e) { + var el = e.target; + var tooltipModel = this._tooltipModel; + var globalTrigger = tooltipModel.get('trigger'); + var ecModel = this._ecModel; + var api = this._api; + + if (!tooltipModel) { + return; + } + + // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed + this._lastX = e.offsetX; + this._lastY = e.offsetY; + + // Always show item tooltip if mouse is on the element with dataIndex + if (el && el.dataIndex != null) { + // Use dataModel in element if possible + // Used when mouseover on a element like markPoint or edge + // In which case, the data is not main data in series. + var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex); + var dataIndex = el.dataIndex; + var itemModel = dataModel.getData().getItemModel(dataIndex); + // Series or single data may use item trigger when global is axis trigger + if ((itemModel.get('tooltip.trigger') || globalTrigger) === 'axis') { + this._showAxisTooltip(tooltipModel, ecModel, e); + } + else { + // Reset ticket + this._ticket = ''; + // If either single data or series use item trigger + this._hideAxisPointer(); + // Reset last hover and dispatch downplay action + this._resetLastHover(); + + this._showItemTooltipContent(dataModel, dataIndex, e); + } + + api.dispatchAction({ + type: 'showTip', + from: this.uid, + dataIndex: el.dataIndex, + seriesIndex: el.seriesIndex + }); + } + else { + if (globalTrigger === 'item') { + this._hide(); + } + else { + // Try show axis tooltip + this._showAxisTooltip(tooltipModel, ecModel, e); + } + + // Action of cross pointer + // other pointer types will trigger action in _dispatchAndShowSeriesTooltipContent method + if (tooltipModel.get('axisPointer.type') === 'cross') { + api.dispatchAction({ + type: 'showTip', + from: this.uid, + x: e.offsetX, + y: e.offsetY + }); + } + } + }, + + /** + * Show tooltip on axis + * @param {module:echarts/component/tooltip/TooltipModel} tooltipModel + * @param {module:echarts/model/Global} ecModel + * @param {Object} e + * @private + */ + _showAxisTooltip: function (tooltipModel, ecModel, e) { + var axisPointerModel = tooltipModel.getModel('axisPointer'); + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType === 'cross') { + var el = e.target; + if (el && el.dataIndex != null) { + var seriesModel = ecModel.getSeriesByIndex(el.seriesIndex); + var dataIndex = el.dataIndex; + this._showItemTooltipContent(seriesModel, dataIndex, e); + } + } + + this._showAxisPointer(); + var allNotShow = true; + zrUtil.each(this._seriesGroupByAxis, function (seriesCoordSysSameAxis) { + // Try show the axis pointer + var allCoordSys = seriesCoordSysSameAxis.coordSys; + var coordSys = allCoordSys[0]; + + // If mouse position is not in the grid or polar + var point = [e.offsetX, e.offsetY]; + + if (!coordSys.containPoint(point)) { + // Hide axis pointer + this._hideAxisPointer(coordSys.name); + return; + } + + allNotShow = false; + // Make sure point is discrete on cateogry axis + var dimensions = coordSys.dimensions; + var value = coordSys.pointToData(point, true); + point = coordSys.dataToPoint(value); + var baseAxis = coordSys.getBaseAxis(); + var axisType = axisPointerModel.get('axis'); + if (axisType === 'auto') { + axisType = baseAxis.dim; + } + + var contentNotChange = false; + var lastHover = this._lastHover; + if (axisPointerType === 'cross') { + // If hover data not changed + // Possible when two axes are all category + if (dataEqual(lastHover.data, value)) { + contentNotChange = true; + } + lastHover.data = value; + } + else { + var valIndex = zrUtil.indexOf(dimensions, axisType); + + // If hover data not changed on the axis dimension + if (lastHover.data === value[valIndex]) { + contentNotChange = true; + } + lastHover.data = value[valIndex]; + } + + if (coordSys.type === 'cartesian2d' && !contentNotChange) { + this._showCartesianPointer( + axisPointerModel, coordSys, axisType, point + ); + } + else if (coordSys.type === 'polar' && !contentNotChange) { + this._showPolarPointer( + axisPointerModel, coordSys, axisType, point + ); + } + else if (coordSys.type === 'single' && !contentNotChange) { + this._showSinglePointer( + axisPointerModel, coordSys, axisType, point + ); + } + + if (axisPointerType !== 'cross') { + this._dispatchAndShowSeriesTooltipContent( + coordSys, seriesCoordSysSameAxis.series, point, value, contentNotChange + ); + } + }, this); + + if (allNotShow) { + this._hide(); + } + }, + + /** + * Show tooltip on axis of cartesian coordinate + * @param {module:echarts/model/Model} axisPointerModel + * @param {module:echarts/coord/cartesian/Cartesian2D} cartesians + * @param {string} axisType + * @param {Array.} point + * @private + */ + _showCartesianPointer: function (axisPointerModel, cartesian, axisType, point) { + var self = this; + + var axisPointerType = axisPointerModel.get('type'); + var moveAnimation = axisPointerType !== 'cross'; + + if (axisPointerType === 'cross') { + moveGridLine('x', point, cartesian.getAxis('y').getGlobalExtent()); + moveGridLine('y', point, cartesian.getAxis('x').getGlobalExtent()); + + this._updateCrossText(cartesian, point, axisPointerModel); + } + else { + var otherAxis = cartesian.getAxis(axisType === 'x' ? 'y' : 'x'); + var otherExtent = otherAxis.getGlobalExtent(); + + if (cartesian.type === 'cartesian2d') { + (axisPointerType === 'line' ? moveGridLine : moveGridShadow)( + axisType, point, otherExtent + ); + } + } + + /** + * @inner + */ + function moveGridLine(axisType, point, otherExtent) { + var targetShape = axisType === 'x' + ? makeLineShape(point[0], otherExtent[0], point[0], otherExtent[1]) + : makeLineShape(otherExtent[0], point[1], otherExtent[1], point[1]); + + var pointerEl = self._getPointerElement( + cartesian, axisPointerModel, axisType, targetShape + ); + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + + /** + * @inner + */ + function moveGridShadow(axisType, point, otherExtent) { + var axis = cartesian.getAxis(axisType); + var bandWidth = axis.getBandWidth(); + var span = otherExtent[1] - otherExtent[0]; + var targetShape = axisType === 'x' + ? makeRectShape(point[0] - bandWidth / 2, otherExtent[0], bandWidth, span) + : makeRectShape(otherExtent[0], point[1] - bandWidth / 2, span, bandWidth); + + var pointerEl = self._getPointerElement( + cartesian, axisPointerModel, axisType, targetShape + ); + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + }, + + _showSinglePointer: function (axisPointerModel, single, axisType, point) { + var self = this; + var axisPointerType = axisPointerModel.get('type'); + var moveAnimation = axisPointerType !== 'cross'; + var rect = single.getRect(); + var otherExtent = [rect.y, rect.y + rect.height]; + + moveSingleLine(axisType, point, otherExtent); + + /** + * @inner + */ + function moveSingleLine(axisType, point, otherExtent) { + var axis = single.getAxis(); + var orient = axis.orient; + + var targetShape = orient === 'horizontal' + ? makeLineShape(point[0], otherExtent[0], point[0], otherExtent[1]) + : makeLineShape(otherExtent[0], point[1], otherExtent[1], point[1]); + + var pointerEl = self._getPointerElement( + single, axisPointerModel, axisType, targetShape + ); + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + + }, + + /** + * Show tooltip on axis of polar coordinate + * @param {module:echarts/model/Model} axisPointerModel + * @param {Array.} polar + * @param {string} axisType + * @param {Array.} point + */ + _showPolarPointer: function (axisPointerModel, polar, axisType, point) { + var self = this; + + var axisPointerType = axisPointerModel.get('type'); + + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); + + var moveAnimation = axisPointerType !== 'cross'; + + if (axisPointerType === 'cross') { + movePolarLine('angle', point, radiusAxis.getExtent()); + movePolarLine('radius', point, angleAxis.getExtent()); + + this._updateCrossText(polar, point, axisPointerModel); + } + else { + var otherAxis = polar.getAxis(axisType === 'radius' ? 'angle' : 'radius'); + var otherExtent = otherAxis.getExtent(); + + (axisPointerType === 'line' ? movePolarLine : movePolarShadow)( + axisType, point, otherExtent + ); + } + /** + * @inner + */ + function movePolarLine(axisType, point, otherExtent) { + var mouseCoord = polar.pointToCoord(point); + + var targetShape; + + if (axisType === 'angle') { + var p1 = polar.coordToPoint([otherExtent[0], mouseCoord[1]]); + var p2 = polar.coordToPoint([otherExtent[1], mouseCoord[1]]); + targetShape = makeLineShape(p1[0], p1[1], p2[0], p2[1]); + } + else { + targetShape = { + cx: polar.cx, + cy: polar.cy, + r: mouseCoord[0] + }; + } + + var pointerEl = self._getPointerElement( + polar, axisPointerModel, axisType, targetShape + ); + + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + + /** + * @inner + */ + function movePolarShadow(axisType, point, otherExtent) { + var axis = polar.getAxis(axisType); + var bandWidth = axis.getBandWidth(); + + var mouseCoord = polar.pointToCoord(point); + + var targetShape; + + var radian = Math.PI / 180; + + if (axisType === 'angle') { + targetShape = makeSectorShape( + polar.cx, polar.cy, + otherExtent[0], otherExtent[1], + // In ECharts y is negative if angle is positive + (-mouseCoord[1] - bandWidth / 2) * radian, + (-mouseCoord[1] + bandWidth / 2) * radian + ); + } + else { + targetShape = makeSectorShape( + polar.cx, polar.cy, + mouseCoord[0] - bandWidth / 2, + mouseCoord[0] + bandWidth / 2, + 0, Math.PI * 2 + ); + } + + var pointerEl = self._getPointerElement( + polar, axisPointerModel, axisType, targetShape + ); + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + }, + + _updateCrossText: function (coordSys, point, axisPointerModel) { + var crossStyleModel = axisPointerModel.getModel('crossStyle'); + var textStyleModel = crossStyleModel.getModel('textStyle'); + + var tooltipModel = this._tooltipModel; + + var text = this._crossText; + if (!text) { + text = this._crossText = new graphic.Text({ + style: { + textAlign: 'left', + textVerticalAlign: 'bottom' + } + }); + this.group.add(text); + } + + var value = coordSys.pointToData(point); + + var dims = coordSys.dimensions; + value = zrUtil.map(value, function (val, idx) { + var axis = coordSys.getAxis(dims[idx]); + if (axis.type === 'category' || axis.type === 'time') { + val = axis.scale.getLabel(val); + } + else { + val = formatUtil.addCommas( + val.toFixed(axis.getPixelPrecision()) + ); + } + return val; + }); + + text.setStyle({ + fill: textStyleModel.getTextColor() || crossStyleModel.get('color'), + textFont: textStyleModel.getFont(), + text: value.join(', '), + x: point[0] + 5, + y: point[1] - 5 + }); + text.z = tooltipModel.get('z'); + text.zlevel = tooltipModel.get('zlevel'); + }, + + _getPointerElement: function (coordSys, pointerModel, axisType, initShape) { + var tooltipModel = this._tooltipModel; + var z = tooltipModel.get('z'); + var zlevel = tooltipModel.get('zlevel'); + var axisPointers = this._axisPointers; + var coordSysName = coordSys.name; + axisPointers[coordSysName] = axisPointers[coordSysName] || {}; + if (axisPointers[coordSysName][axisType]) { + return axisPointers[coordSysName][axisType]; + } + + // Create if not exists + var pointerType = pointerModel.get('type'); + var styleModel = pointerModel.getModel(pointerType + 'Style'); + var isShadow = pointerType === 'shadow'; + var style = styleModel[isShadow ? 'getAreaStyle' : 'getLineStyle'](); + + var elementType = coordSys.type === 'polar' + ? (isShadow ? 'Sector' : (axisType === 'radius' ? 'Circle' : 'Line')) + : (isShadow ? 'Rect' : 'Line'); + + isShadow ? (style.stroke = null) : (style.fill = null); + + var el = axisPointers[coordSysName][axisType] = new graphic[elementType]({ + style: style, + z: z, + zlevel: zlevel, + silent: true, + shape: initShape + }); + + this.group.add(el); + return el; + }, + + /** + * Dispatch actions and show tooltip on series + * @param {Array.} seriesList + * @param {Array.} point + * @param {Array.} value + * @param {boolean} contentNotChange + * @param {Object} e + */ + _dispatchAndShowSeriesTooltipContent: function ( + coordSys, seriesList, point, value, contentNotChange + ) { + + var rootTooltipModel = this._tooltipModel; + var tooltipContent = this._tooltipContent; + + var baseAxis = coordSys.getBaseAxis(); + + var payloadBatch = zrUtil.map(seriesList, function (series) { + return { + seriesIndex: series.seriesIndex, + dataIndex: series.getAxisTooltipDataIndex + ? series.getAxisTooltipDataIndex(series.coordDimToDataDim(baseAxis.dim), value, baseAxis) + : series.getData().indexOfNearest( + series.coordDimToDataDim(baseAxis.dim)[0], + value[baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1] + ) + }; + }); + + var lastHover = this._lastHover; + var api = this._api; + // Dispatch downplay action + if (lastHover.payloadBatch && !contentNotChange) { + api.dispatchAction({ + type: 'downplay', + batch: lastHover.payloadBatch + }); + } + // Dispatch highlight action + if (!contentNotChange) { + api.dispatchAction({ + type: 'highlight', + batch: payloadBatch + }); + lastHover.payloadBatch = payloadBatch; + } + // Dispatch showTip action + api.dispatchAction({ + type: 'showTip', + dataIndex: payloadBatch[0].dataIndex, + seriesIndex: payloadBatch[0].seriesIndex, + from: this.uid + }); + + if (baseAxis && rootTooltipModel.get('showContent')) { + + var formatter = rootTooltipModel.get('formatter'); + var positionExpr = rootTooltipModel.get('position'); + var html; + + var paramsList = zrUtil.map(seriesList, function (series, index) { + return series.getDataParams(payloadBatch[index].dataIndex); + }); + // If only one series + // FIXME + // if (paramsList.length === 1) { + // paramsList = paramsList[0]; + // } + + tooltipContent.show(rootTooltipModel); + + // Update html content + var firstDataIndex = payloadBatch[0].dataIndex; + if (!contentNotChange) { + // Reset ticket + this._ticket = ''; + if (!formatter) { + // Default tooltip content + // FIXME + // (1) shold be the first data which has name? + // (2) themeRiver, firstDataIndex is array, and first line is unnecessary. + var firstLine = seriesList[0].getData().getName(firstDataIndex); + html = (firstLine ? firstLine + '
            ' : '') + + zrUtil.map(seriesList, function (series, index) { + return series.formatTooltip(payloadBatch[index].dataIndex, true); + }).join('
            '); + } + else { + if (typeof formatter === 'string') { + html = formatUtil.formatTpl(formatter, paramsList); + } + else if (typeof formatter === 'function') { + var self = this; + var ticket = 'axis_' + coordSys.name + '_' + firstDataIndex; + var callback = function (cbTicket, html) { + if (cbTicket === self._ticket) { + tooltipContent.setContent(html); + + updatePosition( + positionExpr, point[0], point[1], + tooltipContent, paramsList, null, api + ); + } + }; + self._ticket = ticket; + html = formatter(paramsList, ticket, callback); + } + } + + tooltipContent.setContent(html); + } + + updatePosition( + positionExpr, point[0], point[1], + tooltipContent, paramsList, null, api + ); + } + }, + + /** + * Show tooltip on item + * @param {module:echarts/model/Series} seriesModel + * @param {number} dataIndex + * @param {Object} e + */ + _showItemTooltipContent: function (seriesModel, dataIndex, e) { + // FIXME Graph data + var api = this._api; + var data = seriesModel.getData(); + var itemModel = data.getItemModel(dataIndex); + + var rootTooltipModel = this._tooltipModel; + + var tooltipContent = this._tooltipContent; + + var tooltipModel = itemModel.getModel('tooltip'); + + // If series model + if (tooltipModel.parentModel) { + tooltipModel.parentModel.parentModel = rootTooltipModel; + } + else { + tooltipModel.parentModel = this._tooltipModel; + } + + if (tooltipModel.get('showContent')) { + var formatter = tooltipModel.get('formatter'); + var positionExpr = tooltipModel.get('position'); + var params = seriesModel.getDataParams(dataIndex); + var html; + if (!formatter) { + html = seriesModel.formatTooltip(dataIndex); + } + else { + if (typeof formatter === 'string') { + html = formatUtil.formatTpl(formatter, params); + } + else if (typeof formatter === 'function') { + var self = this; + var ticket = 'item_' + seriesModel.name + '_' + dataIndex; + var callback = function (cbTicket, html) { + if (cbTicket === self._ticket) { + tooltipContent.setContent(html); + + updatePosition( + positionExpr, e.offsetX, e.offsetY, + tooltipContent, params, e.target, api + ); + } + }; + self._ticket = ticket; + html = formatter(params, ticket, callback); + } + } + + tooltipContent.show(tooltipModel); + tooltipContent.setContent(html); + + updatePosition( + positionExpr, e.offsetX, e.offsetY, + tooltipContent, params, e.target, api + ); + } + }, + + /** + * Show axis pointer + * @param {string} [coordSysName] + */ + _showAxisPointer: function (coordSysName) { + if (coordSysName) { + var axisPointers = this._axisPointers[coordSysName]; + axisPointers && zrUtil.each(axisPointers, function (el) { + el.show(); + }); + } + else { + this.group.eachChild(function (child) { + child.show(); + }); + this.group.show(); + } + }, + + _resetLastHover: function () { + var lastHover = this._lastHover; + if (lastHover.payloadBatch) { + this._api.dispatchAction({ + type: 'downplay', + batch: lastHover.payloadBatch + }); + } + // Reset lastHover + this._lastHover = {}; + }, + /** + * Hide axis pointer + * @param {string} [coordSysName] + */ + _hideAxisPointer: function (coordSysName) { + if (coordSysName) { + var axisPointers = this._axisPointers[coordSysName]; + axisPointers && zrUtil.each(axisPointers, function (el) { + el.hide(); + }); + } + else { + this.group.hide(); + } + }, + + _hide: function () { + this._hideAxisPointer(); + this._resetLastHover(); + if (!this._alwaysShowContent) { + this._tooltipContent.hideLater(this._tooltipModel.get('hideDelay')); + } + + this._api.dispatchAction({ + type: 'hideTip', + from: this.uid + }); + }, + + dispose: function (ecModel, api) { + if (env.node) { + return; + } + var zr = api.getZr(); + this._tooltipContent.hide(); + + zr.off('click', this._tryShow); + zr.off('mousemove', this._tryShow); + zr.off('mouseout', this._hide); + + api.off('showTip', this._manuallyShowTip); + api.off('hideTip', this._manuallyHideTip); + } + }); + + +/***/ }, +/* 271 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/component/tooltip/TooltipContent + */ + + + var zrUtil = __webpack_require__(3); + var zrColor = __webpack_require__(38); + var eventUtil = __webpack_require__(80); + var formatUtil = __webpack_require__(6); + var each = zrUtil.each; + var toCamelCase = formatUtil.toCamelCase; + + var vendors = ['', '-webkit-', '-moz-', '-o-']; + + var gCssText = 'position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;'; + + /** + * @param {number} duration + * @return {string} + * @inner + */ + function assembleTransition(duration) { + var transitionCurve = 'cubic-bezier(0.23, 1, 0.32, 1)'; + var transitionText = 'left ' + duration + 's ' + transitionCurve + ',' + + 'top ' + duration + 's ' + transitionCurve; + return zrUtil.map(vendors, function (vendorPrefix) { + return vendorPrefix + 'transition:' + transitionText; + }).join(';'); + } + + /** + * @param {Object} textStyle + * @return {string} + * @inner + */ + function assembleFont(textStyleModel) { + var cssText = []; + + var fontSize = textStyleModel.get('fontSize'); + var color = textStyleModel.getTextColor(); + + color && cssText.push('color:' + color); + + cssText.push('font:' + textStyleModel.getFont()); + + fontSize && + cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px'); + + each(['decoration', 'align'], function (name) { + var val = textStyleModel.get(name); + val && cssText.push('text-' + name + ':' + val); + }); + + return cssText.join(';'); + } + + /** + * @param {Object} tooltipModel + * @return {string} + * @inner + */ + function assembleCssText(tooltipModel) { + + tooltipModel = tooltipModel; + + var cssText = []; + + var transitionDuration = tooltipModel.get('transitionDuration'); + var backgroundColor = tooltipModel.get('backgroundColor'); + var textStyleModel = tooltipModel.getModel('textStyle'); + var padding = tooltipModel.get('padding'); + + // Animation transition + transitionDuration && + cssText.push(assembleTransition(transitionDuration)); + + if (backgroundColor) { + // for ie + cssText.push( + 'background-Color:' + zrColor.toHex(backgroundColor) + ); + cssText.push('filter:alpha(opacity=70)'); + cssText.push('background-Color:' + backgroundColor); + } + + // Border style + each(['width', 'color', 'radius'], function (name) { + var borderName = 'border-' + name; + var camelCase = toCamelCase(borderName); + var val = tooltipModel.get(camelCase); + val != null && + cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px')); + }); + + // Text style + cssText.push(assembleFont(textStyleModel)); + + // Padding + if (padding != null) { + cssText.push('padding:' + formatUtil.normalizeCssArray(padding).join('px ') + 'px'); + } + + return cssText.join(';') + ';'; + } + + /** + * @alias module:echarts/component/tooltip/TooltipContent + * @constructor + */ + function TooltipContent(container, api) { + var el = document.createElement('div'); + var zr = api.getZr(); + + this.el = el; + + this._x = api.getWidth() / 2; + this._y = api.getHeight() / 2; + + container.appendChild(el); + + this._container = container; + + this._show = false; + + /** + * @private + */ + this._hideTimeout; + + var self = this; + el.onmouseenter = function () { + // clear the timeout in hideLater and keep showing tooltip + if (self.enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + self._inContent = true; + }; + el.onmousemove = function (e) { + if (!self.enterable) { + // Try trigger zrender event to avoid mouse + // in and out shape too frequently + var handler = zr.handler; + eventUtil.normalizeEvent(container, e); + handler.dispatch('mousemove', e); + } + }; + el.onmouseleave = function () { + if (self.enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + self._inContent = false; + }; + + compromiseMobile(el, container); + } + + function compromiseMobile(tooltipContentEl, container) { + // Prevent default behavior on mobile. For example, + // defuault pinch gesture will cause browser zoom. + // We do not preventing event on tooltip contnet el, + // because user may need customization in tooltip el. + eventUtil.addEventListener(container, 'touchstart', preventDefault); + eventUtil.addEventListener(container, 'touchmove', preventDefault); + eventUtil.addEventListener(container, 'touchend', preventDefault); + + function preventDefault(e) { + if (contains(e.target)) { + e.preventDefault(); + } + } + + function contains(targetEl) { + while (targetEl && targetEl !== container) { + if (targetEl === tooltipContentEl) { + return true; + } + targetEl = targetEl.parentNode; + } + } + } + + TooltipContent.prototype = { + + constructor: TooltipContent, + + enterable: true, + + /** + * Update when tooltip is rendered + */ + update: function () { + var container = this._container; + var stl = container.currentStyle + || document.defaultView.getComputedStyle(container); + var domStyle = container.style; + if (domStyle.position !== 'absolute' && stl.position !== 'absolute') { + domStyle.position = 'relative'; + } + // Hide the tooltip + // PENDING + // this.hide(); + }, + + show: function (tooltipModel) { + clearTimeout(this._hideTimeout); + + this.el.style.cssText = gCssText + assembleCssText(tooltipModel) + // http://stackoverflow.com/questions/21125587/css3-transition-not-working-in-chrome-anymore + + ';left:' + this._x + 'px;top:' + this._y + 'px;' + + (tooltipModel.get('extraCssText') || ''); + + this._show = true; + }, + + setContent: function (content) { + var el = this.el; + el.innerHTML = content; + el.style.display = content ? 'block' : 'none'; + }, + + moveTo: function (x, y) { + var style = this.el.style; + style.left = x + 'px'; + style.top = y + 'px'; + + this._x = x; + this._y = y; + }, + + hide: function () { + this.el.style.display = 'none'; + this._show = false; + }, + + // showLater: function () + + hideLater: function (time) { + if (this._show && !(this._inContent && this.enterable)) { + if (time) { + this._hideDelay = time; + // Set show false to avoid invoke hideLater mutiple times + this._show = false; + this._hideTimeout = setTimeout(zrUtil.bind(this.hide, this), time); + } + else { + this.hide(); + } + } + }, + + isShow: function () { + return this._show; + } + }; + + module.exports = TooltipContent; + + +/***/ }, +/* 272 */, +/* 273 */, +/* 274 */, +/* 275 */, +/* 276 */, +/* 277 */, +/* 278 */, +/* 279 */, +/* 280 */, +/* 281 */, +/* 282 */, +/* 283 */, +/* 284 */, +/* 285 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var echarts = __webpack_require__(1); + var graphic = __webpack_require__(42); + var layout = __webpack_require__(21); + + // Model + echarts.extendComponentModel({ + + type: 'title', + + layoutMode: {type: 'box', ignoreSize: true}, + + defaultOption: { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 6, + show: true, + + text: '', + // 超链接跳转 + // link: null, + // 仅支持self | blank + target: 'blank', + subtext: '', + + // 超链接跳转 + // sublink: null, + // 仅支持self | blank + subtarget: 'blank', + + // 'center' ¦ 'left' ¦ 'right' + // ¦ {number}(x坐标,单位px) + left: 0, + // 'top' ¦ 'bottom' ¦ 'center' + // ¦ {number}(y坐标,单位px) + top: 0, + + // 水平对齐 + // 'auto' | 'left' | 'right' + // 默认根据 x 的位置判断是左对齐还是右对齐 + //textAlign: null + + backgroundColor: 'rgba(0,0,0,0)', + + // 标题边框颜色 + borderColor: '#ccc', + + // 标题边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + + // 标题内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + + // 主副标题纵向间隔,单位px,默认为10, + itemGap: 10, + textStyle: { + fontSize: 18, + fontWeight: 'bolder', + // 主标题文字颜色 + color: '#333' + }, + subtextStyle: { + // 副标题文字颜色 + color: '#aaa' + } + } + }); + + // View + echarts.extendComponentView({ + + type: 'title', + + render: function (titleModel, ecModel, api) { + this.group.removeAll(); + + if (!titleModel.get('show')) { + return; + } + + var group = this.group; + + var textStyleModel = titleModel.getModel('textStyle'); + var subtextStyleModel = titleModel.getModel('subtextStyle'); + + var textAlign = titleModel.get('textAlign'); + + var textEl = new graphic.Text({ + style: { + text: titleModel.get('text'), + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor(), + textBaseline: 'top' + }, + z2: 10 + }); + + var textRect = textEl.getBoundingRect(); + + var subText = titleModel.get('subtext'); + var subTextEl = new graphic.Text({ + style: { + text: subText, + textFont: subtextStyleModel.getFont(), + fill: subtextStyleModel.getTextColor(), + y: textRect.height + titleModel.get('itemGap'), + textBaseline: 'top' + }, + z2: 10 + }); + + var link = titleModel.get('link'); + var sublink = titleModel.get('sublink'); + + textEl.silent = !link; + subTextEl.silent = !sublink; + + if (link) { + textEl.on('click', function () { + window.open(link, titleModel.get('target')); + }); + } + if (sublink) { + subTextEl.on('click', function () { + window.open(sublink, titleModel.get('subtarget')); + }); + } + + group.add(textEl); + subText && group.add(subTextEl); + // If no subText, but add subTextEl, there will be an empty line. + + var groupRect = group.getBoundingRect(); + var layoutOption = titleModel.getBoxLayoutParams(); + layoutOption.width = groupRect.width; + layoutOption.height = groupRect.height; + var layoutRect = layout.getLayoutRect( + layoutOption, { + width: api.getWidth(), + height: api.getHeight() + }, titleModel.get('padding') + ); + // Adjust text align based on position + if (!textAlign) { + // Align left if title is on the left. center and right is same + textAlign = titleModel.get('left') || titleModel.get('right'); + if (textAlign === 'middle') { + textAlign = 'center'; + } + // Adjust layout by text align + if (textAlign === 'right') { + layoutRect.x += layoutRect.width; + } + else if (textAlign === 'center') { + layoutRect.x += layoutRect.width / 2; + } + } + group.position = [layoutRect.x, layoutRect.y]; + textEl.setStyle('textAlign', textAlign); + subTextEl.setStyle('textAlign', textAlign); + + // Render background + // Get groupRect again because textAlign has been changed + groupRect = group.getBoundingRect(); + var padding = layoutRect.margin; + var style = titleModel.getItemStyle(['color', 'opacity']); + style.fill = titleModel.get('backgroundColor'); + var rect = new graphic.Rect({ + shape: { + x: groupRect.x - padding[3], + y: groupRect.y - padding[0], + width: groupRect.width + padding[1] + padding[3], + height: groupRect.height + padding[0] + padding[2] + }, + style: style, + silent: true + }); + graphic.subPixelOptimizeRect(rect); + + group.add(rect); + } + }); + + +/***/ }, +/* 286 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * DataZoom component entry + */ + + + __webpack_require__(287); + + __webpack_require__(288); + __webpack_require__(290); + + __webpack_require__(291); + __webpack_require__(292); + + __webpack_require__(295); + __webpack_require__(296); + + __webpack_require__(298); + __webpack_require__(299); + + + +/***/ }, +/* 287 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(19).registerSubTypeDefaulter('dataZoom', function (option) { + // Default 'slider' when no type specified. + return 'slider'; + }); + + + +/***/ }, +/* 288 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + var zrUtil = __webpack_require__(3); + var env = __webpack_require__(78); + var echarts = __webpack_require__(1); + var modelUtil = __webpack_require__(5); + var AxisProxy = __webpack_require__(289); + var each = zrUtil.each; + var eachAxisDim = modelUtil.eachAxisDim; + + var DataZoomModel = echarts.extendComponentModel({ + + type: 'dataZoom', + + dependencies: [ + 'xAxis', 'yAxis', 'zAxis', 'radiusAxis', 'angleAxis', 'series' + ], + + /** + * @protected + */ + defaultOption: { + zlevel: 0, + z: 4, // Higher than normal component (z: 2). + orient: null, // Default auto by axisIndex. Possible value: 'horizontal', 'vertical'. + xAxisIndex: null, // Default all horizontal category axis. + yAxisIndex: null, // Default all vertical category axis. + angleAxisIndex: null, + radiusAxisIndex: null, + filterMode: 'filter', // Possible values: 'filter' or 'empty'. + // 'filter': data items which are out of window will be removed. + // This option is applicable when filtering outliers. + // 'empty': data items which are out of window will be set to empty. + // This option is applicable when user should not neglect + // that there are some data items out of window. + // Taking line chart as an example, line will be broken in + // the filtered points when filterModel is set to 'empty', but + // be connected when set to 'filter'. + + throttle: 100, // Dispatch action by the fixed rate, avoid frequency. + // default 100. Do not throttle when use null/undefined. + start: 0, // Start percent. 0 ~ 100 + end: 100, // End percent. 0 ~ 100 + startValue: null, // Start value. If startValue specified, start is ignored. + endValue: null // End value. If endValue specified, end is ignored. + }, + + /** + * @override + */ + init: function (option, parentModel, ecModel) { + + /** + * key like x_0, y_1 + * @private + * @type {Object} + */ + this._dataIntervalByAxis = {}; + + /** + * @private + */ + this._dataInfo = {}; + + /** + * key like x_0, y_1 + * @private + */ + this._axisProxies = {}; + + /** + * @readOnly + */ + this.textStyleModel; + + var rawOption = retrieveRaw(option); + + this.mergeDefaultAndTheme(option, ecModel); + + this.doInit(rawOption); + }, + + /** + * @override + */ + mergeOption: function (newOption) { + var rawOption = retrieveRaw(newOption); + + //FIX #2591 + zrUtil.merge(this.option, newOption, true); + + this.doInit(rawOption); + }, + + /** + * @protected + */ + doInit: function (rawOption) { + var thisOption = this.option; + + // Disable realtime view update if canvas is not supported. + if (!env.canvasSupported) { + thisOption.realtime = false; + } + + processRangeProp('start', 'startValue', rawOption, thisOption); + processRangeProp('end', 'endValue', rawOption, thisOption); + + this.textStyleModel = this.getModel('textStyle'); + + this._resetTarget(); + + this._giveAxisProxies(); + }, + + /** + * @private + */ + _giveAxisProxies: function () { + var axisProxies = this._axisProxies; + + this.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel, ecModel) { + var axisModel = this.dependentModels[dimNames.axis][axisIndex]; + + // If exists, share axisProxy with other dataZoomModels. + var axisProxy = axisModel.__dzAxisProxy || ( + // Use the first dataZoomModel as the main model of axisProxy. + axisModel.__dzAxisProxy = new AxisProxy( + dimNames.name, axisIndex, this, ecModel + ) + ); + // FIXME + // dispose __dzAxisProxy + + axisProxies[dimNames.name + '_' + axisIndex] = axisProxy; + }, this); + }, + + /** + * @private + */ + _resetTarget: function () { + var thisOption = this.option; + + var autoMode = this._judgeAutoMode(); + + eachAxisDim(function (dimNames) { + var axisIndexName = dimNames.axisIndex; + thisOption[axisIndexName] = modelUtil.normalizeToArray( + thisOption[axisIndexName] + ); + }, this); + + if (autoMode === 'axisIndex') { + this._autoSetAxisIndex(); + } + else if (autoMode === 'orient') { + this._autoSetOrient(); + } + }, + + /** + * @private + */ + _judgeAutoMode: function () { + // Auto set only works for setOption at the first time. + // The following is user's reponsibility. So using merged + // option is OK. + var thisOption = this.option; + + var hasIndexSpecified = false; + eachAxisDim(function (dimNames) { + // When user set axisIndex as a empty array, we think that user specify axisIndex + // but do not want use auto mode. Because empty array may be encountered when + // some error occured. + if (thisOption[dimNames.axisIndex] != null) { + hasIndexSpecified = true; + } + }, this); + + var orient = thisOption.orient; + + if (orient == null && hasIndexSpecified) { + return 'orient'; + } + else if (!hasIndexSpecified) { + if (orient == null) { + thisOption.orient = 'horizontal'; + } + return 'axisIndex'; + } + }, + + /** + * @private + */ + _autoSetAxisIndex: function () { + var autoAxisIndex = true; + var orient = this.get('orient', true); + var thisOption = this.option; + + if (autoAxisIndex) { + // Find axis that parallel to dataZoom as default. + var dimNames = orient === 'vertical' + ? {dim: 'y', axisIndex: 'yAxisIndex', axis: 'yAxis'} + : {dim: 'x', axisIndex: 'xAxisIndex', axis: 'xAxis'}; + + if (this.dependentModels[dimNames.axis].length) { + thisOption[dimNames.axisIndex] = [0]; + autoAxisIndex = false; + } + } + + if (autoAxisIndex) { + // Find the first category axis as default. (consider polar) + eachAxisDim(function (dimNames) { + if (!autoAxisIndex) { + return; + } + var axisIndices = []; + var axisModels = this.dependentModels[dimNames.axis]; + if (axisModels.length && !axisIndices.length) { + for (var i = 0, len = axisModels.length; i < len; i++) { + if (axisModels[i].get('type') === 'category') { + axisIndices.push(i); + } + } + } + thisOption[dimNames.axisIndex] = axisIndices; + if (axisIndices.length) { + autoAxisIndex = false; + } + }, this); + } + + if (autoAxisIndex) { + // FIXME + // 这里是兼容ec2的写法(没指定xAxisIndex和yAxisIndex时把scatter和双数值轴折柱纳入dataZoom控制), + // 但是实际是否需要Grid.js#getScaleByOption来判断(考虑time,log等axis type)? + + // If both dataZoom.xAxisIndex and dataZoom.yAxisIndex is not specified, + // dataZoom component auto adopts series that reference to + // both xAxis and yAxis which type is 'value'. + this.ecModel.eachSeries(function (seriesModel) { + if (this._isSeriesHasAllAxesTypeOf(seriesModel, 'value')) { + eachAxisDim(function (dimNames) { + var axisIndices = thisOption[dimNames.axisIndex]; + var axisIndex = seriesModel.get(dimNames.axisIndex); + if (zrUtil.indexOf(axisIndices, axisIndex) < 0) { + axisIndices.push(axisIndex); + } + }); + } + }, this); + } + }, + + /** + * @private + */ + _autoSetOrient: function () { + var dim; + + // Find the first axis + this.eachTargetAxis(function (dimNames) { + !dim && (dim = dimNames.name); + }, this); + + this.option.orient = dim === 'y' ? 'vertical' : 'horizontal'; + }, + + /** + * @private + */ + _isSeriesHasAllAxesTypeOf: function (seriesModel, axisType) { + // FIXME + // 需要series的xAxisIndex和yAxisIndex都首先自动设置上。 + // 例如series.type === scatter时。 + + var is = true; + eachAxisDim(function (dimNames) { + var seriesAxisIndex = seriesModel.get(dimNames.axisIndex); + var axisModel = this.dependentModels[dimNames.axis][seriesAxisIndex]; + + if (!axisModel || axisModel.get('type') !== axisType) { + is = false; + } + }, this); + return is; + }, + + /** + * @public + */ + getFirstTargetAxisModel: function () { + var firstAxisModel; + eachAxisDim(function (dimNames) { + if (firstAxisModel == null) { + var indices = this.get(dimNames.axisIndex); + if (indices.length) { + firstAxisModel = this.dependentModels[dimNames.axis][indices[0]]; + } + } + }, this); + + return firstAxisModel; + }, + + /** + * @public + * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel + */ + eachTargetAxis: function (callback, context) { + var ecModel = this.ecModel; + eachAxisDim(function (dimNames) { + each( + this.get(dimNames.axisIndex), + function (axisIndex) { + callback.call(context, dimNames, axisIndex, this, ecModel); + }, + this + ); + }, this); + }, + + getAxisProxy: function (dimName, axisIndex) { + return this._axisProxies[dimName + '_' + axisIndex]; + }, + + /** + * If not specified, set to undefined. + * + * @public + * @param {Object} opt + * @param {number} [opt.start] + * @param {number} [opt.end] + * @param {number} [opt.startValue] + * @param {number} [opt.endValue] + */ + setRawRange: function (opt) { + each(['start', 'end', 'startValue', 'endValue'], function (name) { + // If any of those prop is null/undefined, we should alos set + // them, because only one pair between start/end and + // startValue/endValue can work. + this.option[name] = opt[name]; + }, this); + }, + + /** + * @public + * @return {Array.} [startPercent, endPercent] + */ + getPercentRange: function () { + var axisProxy = this.findRepresentativeAxisProxy(); + if (axisProxy) { + return axisProxy.getDataPercentWindow(); + } + }, + + /** + * @public + * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0); + * + * @param {string} [axisDimName] + * @param {number} [axisIndex] + * @return {Array.} [startValue, endValue] + */ + getValueRange: function (axisDimName, axisIndex) { + if (axisDimName == null && axisIndex == null) { + var axisProxy = this.findRepresentativeAxisProxy(); + if (axisProxy) { + return axisProxy.getDataValueWindow(); + } + } + else { + return this.getAxisProxy(axisDimName, axisIndex).getDataValueWindow(); + } + }, + + /** + * @public + * @return {module:echarts/component/dataZoom/AxisProxy} + */ + findRepresentativeAxisProxy: function () { + // Find the first hosted axisProxy + var axisProxies = this._axisProxies; + for (var key in axisProxies) { + if (axisProxies.hasOwnProperty(key) && axisProxies[key].hostedBy(this)) { + return axisProxies[key]; + } + } + + // If no hosted axis find not hosted axisProxy. + // Consider this case: dataZoomModel1 and dataZoomModel2 control the same axis, + // and the option.start or option.end settings are different. The percentRange + // should follow axisProxy. + // (We encounter this problem in toolbox data zoom.) + for (var key in axisProxies) { + if (axisProxies.hasOwnProperty(key) && !axisProxies[key].hostedBy(this)) { + return axisProxies[key]; + } + } + } + + }); + + function retrieveRaw(option) { + var ret = {}; + each( + ['start', 'end', 'startValue', 'endValue'], + function (name) { + ret[name] = option[name]; + } + ); + return ret; + } + + function processRangeProp(percentProp, valueProp, rawOption, thisOption) { + // start/end has higher priority over startValue/endValue, + // but we should make chart.setOption({endValue: 1000}) effective, + // rather than chart.setOption({endValue: 1000, end: null}). + if (rawOption[valueProp] != null && rawOption[percentProp] == null) { + thisOption[percentProp] = null; + } + // Otherwise do nothing and use the merge result. + } + + module.exports = DataZoomModel; + + + +/***/ }, +/* 289 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Axis operator + */ + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var each = zrUtil.each; + var asc = numberUtil.asc; + + /** + * Operate single axis. + * One axis can only operated by one axis operator. + * Different dataZoomModels may be defined to operate the same axis. + * (i.e. 'inside' data zoom and 'slider' data zoom components) + * So dataZoomModels share one axisProxy in that case. + * + * @class + */ + var AxisProxy = function (dimName, axisIndex, dataZoomModel, ecModel) { + + /** + * @private + * @type {string} + */ + this._dimName = dimName; + + /** + * @private + */ + this._axisIndex = axisIndex; + + /** + * @private + * @type {Array.} + */ + this._valueWindow; + + /** + * @private + * @type {Array.} + */ + this._percentWindow; + + /** + * @private + * @type {Array.} + */ + this._dataExtent; + + /** + * @readOnly + * @type {module: echarts/model/Global} + */ + this.ecModel = ecModel; + + /** + * @private + * @type {module: echarts/component/dataZoom/DataZoomModel} + */ + this._dataZoomModel = dataZoomModel; + }; + + AxisProxy.prototype = { + + constructor: AxisProxy, + + /** + * Whether the axisProxy is hosted by dataZoomModel. + * + * @public + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + * @return {boolean} + */ + hostedBy: function (dataZoomModel) { + return this._dataZoomModel === dataZoomModel; + }, + + /** + * @return {Array.} + */ + getDataExtent: function () { + return this._dataExtent.slice(); + }, + + /** + * @return {Array.} + */ + getDataValueWindow: function () { + return this._valueWindow.slice(); + }, + + /** + * @return {Array.} + */ + getDataPercentWindow: function () { + return this._percentWindow.slice(); + }, + + /** + * @public + * @param {number} axisIndex + * @return {Array} seriesModels + */ + getTargetSeriesModels: function () { + var seriesModels = []; + + this.ecModel.eachSeries(function (seriesModel) { + if (this._axisIndex === seriesModel.get(this._dimName + 'AxisIndex')) { + seriesModels.push(seriesModel); + } + }, this); + + return seriesModels; + }, + + getAxisModel: function () { + return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex); + }, + + getOtherAxisModel: function () { + var axisDim = this._dimName; + var ecModel = this.ecModel; + var axisModel = this.getAxisModel(); + var isCartesian = axisDim === 'x' || axisDim === 'y'; + var otherAxisDim; + var coordSysIndexName; + if (isCartesian) { + coordSysIndexName = 'gridIndex'; + otherAxisDim = axisDim === 'x' ? 'y' : 'x'; + } + else { + coordSysIndexName = 'polarIndex'; + otherAxisDim = axisDim === 'angle' ? 'radius' : 'angle'; + } + var foundOtherAxisModel; + ecModel.eachComponent(otherAxisDim + 'Axis', function (otherAxisModel) { + if ((otherAxisModel.get(coordSysIndexName) || 0) + === (axisModel.get(coordSysIndexName) || 0)) { + foundOtherAxisModel = otherAxisModel; + } + }); + return foundOtherAxisModel; + }, + + /** + * Notice: reset should not be called before series.restoreData() called, + * so it is recommanded to be called in "process stage" but not "model init + * stage". + * + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + reset: function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + // Culculate data window and data extent, and record them. + var dataExtent = this._dataExtent = calculateDataExtent( + this._dimName, this.getTargetSeriesModels() + ); + var dataWindow = calculateDataWindow( + dataZoomModel.option, dataExtent, this + ); + this._valueWindow = dataWindow.valueWindow; + this._percentWindow = dataWindow.percentWindow; + + // Update axis setting then. + setAxisModel(this); + }, + + /** + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + restore: function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + this._valueWindow = this._percentWindow = null; + setAxisModel(this, true); + }, + + /** + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + filterData: function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var axisDim = this._dimName; + var seriesModels = this.getTargetSeriesModels(); + var filterMode = dataZoomModel.get('filterMode'); + var valueWindow = this._valueWindow; + + // FIXME + // Toolbox may has dataZoom injected. And if there are stacked bar chart + // with NaN data. NaN will be filtered and stack will be wrong. + // So we need to force the mode to be set empty + var otherAxisModel = this.getOtherAxisModel(); + if (dataZoomModel.get('$fromToolbox') + && otherAxisModel && otherAxisModel.get('type') === 'category') { + filterMode = 'empty'; + } + // Process series data + each(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + if (!seriesData) { + return; + } + + each(seriesModel.coordDimToDataDim(axisDim), function (dim) { + if (filterMode === 'empty') { + seriesModel.setData( + seriesData.map(dim, function (value) { + return !isInWindow(value) ? NaN : value; + }) + ); + } + else { + seriesData.filterSelf(dim, isInWindow); + } + }); + }); + + function isInWindow(value) { + return value >= valueWindow[0] && value <= valueWindow[1]; + } + } + }; + + function calculateDataExtent(axisDim, seriesModels) { + var dataExtent = [Infinity, -Infinity]; + + each(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + if (seriesData) { + each(seriesModel.coordDimToDataDim(axisDim), function (dim) { + var seriesExtent = seriesData.getDataExtent(dim); + seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]); + seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]); + }); + } + }, this); + + return dataExtent; + } + + function calculateDataWindow(opt, dataExtent, axisProxy) { + var axisModel = axisProxy.getAxisModel(); + var scale = axisModel.axis.scale; + var percentExtent = [0, 100]; + var percentWindow = [ + opt.start, + opt.end + ]; + var valueWindow = []; + + // In percent range is used and axis min/max/scale is set, + // window should be based on min/max/0, but should not be + // based on the extent of filtered data. + dataExtent = dataExtent.slice(); + fixExtendByAxis(dataExtent, axisModel, scale); + + each(['startValue', 'endValue'], function (prop) { + valueWindow.push( + opt[prop] != null + ? scale.parse(opt[prop]) + : null + ); + }); + + // Normalize bound. + each([0, 1], function (idx) { + var boundValue = valueWindow[idx]; + var boundPercent = percentWindow[idx]; + + // start/end has higher priority over startValue/endValue, + // because start/end can be consistent among different type + // of axis but startValue/endValue not. + + if (boundPercent != null || boundValue == null) { + if (boundPercent == null) { + boundPercent = percentExtent[idx]; + } + // Use scale.parse to math round for category or time axis. + boundValue = scale.parse(numberUtil.linearMap( + boundPercent, percentExtent, dataExtent, true + )); + } + else { // boundPercent == null && boundValue != null + boundPercent = numberUtil.linearMap( + boundValue, dataExtent, percentExtent, true + ); + } + // Avoid rounding error + valueWindow[idx] = numberUtil.round(boundValue); + percentWindow[idx] = numberUtil.round(boundPercent); + }); + + return { + valueWindow: asc(valueWindow), + percentWindow: asc(percentWindow) + }; + } + + function fixExtendByAxis(dataExtent, axisModel, scale) { + each(['min', 'max'], function (minMax, index) { + var axisMax = axisModel.get(minMax, true); + // Consider 'dataMin', 'dataMax' + if (axisMax != null && (axisMax + '').toLowerCase() !== 'data' + minMax) { + dataExtent[index] = scale.parse(axisMax); + } + }); + + if (!axisModel.get('scale', true)) { + dataExtent[0] > 0 && (dataExtent[0] = 0); + dataExtent[1] < 0 && (dataExtent[1] = 0); + } + + return dataExtent; + } + + function setAxisModel(axisProxy, isRestore) { + var axisModel = axisProxy.getAxisModel(); + + var percentWindow = axisProxy._percentWindow; + var valueWindow = axisProxy._valueWindow; + + if (!percentWindow) { + return; + } + + var isFull = isRestore || (percentWindow[0] === 0 && percentWindow[1] === 100); + // [0, 500]: arbitrary value, guess axis extent. + var precision = !isRestore && numberUtil.getPixelPrecision(valueWindow, [0, 500]); + // toFixed() digits argument must be between 0 and 20 + var invalidPrecision = !isRestore && !(precision < 20 && precision >= 0); + + var useOrigin = isRestore || isFull || invalidPrecision; + + axisModel.setRange && axisModel.setRange( + useOrigin ? null : +valueWindow[0].toFixed(precision), + useOrigin ? null : +valueWindow[1].toFixed(precision) + ); + } + + module.exports = AxisProxy; + + + +/***/ }, +/* 290 */ +/***/ function(module, exports, __webpack_require__) { + + + + var ComponentView = __webpack_require__(28); + + module.exports = ComponentView.extend({ + + type: 'dataZoom', + + render: function (dataZoomModel, ecModel, api, payload) { + this.dataZoomModel = dataZoomModel; + this.ecModel = ecModel; + this.api = api; + }, + + /** + * Find the first target coordinate system. + * + * @protected + * @return {Object} { + * cartesians: [ + * {model: coord0, axisModels: [axis1, axis3], coordIndex: 1}, + * {model: coord1, axisModels: [axis0, axis2], coordIndex: 0}, + * ... + * ], // cartesians must not be null/undefined. + * polars: [ + * {model: coord0, axisModels: [axis4], coordIndex: 0}, + * ... + * ], // polars must not be null/undefined. + * axisModels: [axis0, axis1, axis2, axis3, axis4] + * // axisModels must not be null/undefined. + * } + */ + getTargetInfo: function () { + var dataZoomModel = this.dataZoomModel; + var ecModel = this.ecModel; + var cartesians = []; + var polars = []; + var axisModels = []; + + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) { + var axisModel = ecModel.getComponent(dimNames.axis, axisIndex); + if (axisModel) { + axisModels.push(axisModel); + + var gridIndex = axisModel.get('gridIndex'); + var polarIndex = axisModel.get('polarIndex'); + + if (gridIndex != null) { + var coordModel = ecModel.getComponent('grid', gridIndex); + save(coordModel, axisModel, cartesians, gridIndex); + } + else if (polarIndex != null) { + var coordModel = ecModel.getComponent('polar', polarIndex); + save(coordModel, axisModel, polars, polarIndex); + } + } + }, this); + + function save(coordModel, axisModel, store, coordIndex) { + var item; + for (var i = 0; i < store.length; i++) { + if (store[i].model === coordModel) { + item = store[i]; + break; + } + } + if (!item) { + store.push(item = { + model: coordModel, axisModels: [], coordIndex: coordIndex + }); + } + item.axisModels.push(axisModel); + } + + return { + cartesians: cartesians, + polars: polars, + axisModels: axisModels + }; + } + + }); + + + +/***/ }, +/* 291 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + var DataZoomModel = __webpack_require__(288); + var layout = __webpack_require__(21); + var zrUtil = __webpack_require__(3); + + var SliderZoomModel = DataZoomModel.extend({ + + type: 'dataZoom.slider', + + layoutMode: 'box', + + /** + * @protected + */ + defaultOption: { + show: true, + + // ph => placeholder. Using placehoder here because + // deault value can only be drived in view stage. + right: 'ph', // Default align to grid rect. + top: 'ph', // Default align to grid rect. + width: 'ph', // Default align to grid rect. + height: 'ph', // Default align to grid rect. + left: null, // Default align to grid rect. + bottom: null, // Default align to grid rect. + + backgroundColor: 'rgba(47,69,84,0)', // Background of slider zoom component. + dataBackgroundColor: '#ddd', // Background of data shadow. + fillerColor: 'rgba(47,69,84,0.15)', // Color of selected area. + handleColor: 'rgba(148,164,165,0.95)', // Color of handle. + handleSize: 10, + + labelPrecision: null, + labelFormatter: null, + showDetail: true, + showDataShadow: 'auto', // Default auto decision. + realtime: true, + zoomLock: false, // Whether disable zoom. + textStyle: { + color: '#333' + } + }, + + /** + * @override + */ + mergeOption: function (option) { + SliderZoomModel.superApply(this, 'mergeOption', arguments); + } + + }); + + module.exports = SliderZoomModel; + + + +/***/ }, +/* 292 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var throttle = __webpack_require__(293); + var DataZoomView = __webpack_require__(290); + var Rect = graphic.Rect; + var numberUtil = __webpack_require__(7); + var linearMap = numberUtil.linearMap; + var layout = __webpack_require__(21); + var sliderMove = __webpack_require__(294); + var asc = numberUtil.asc; + var bind = zrUtil.bind; + var mathRound = Math.round; + var mathMax = Math.max; + var each = zrUtil.each; + + // Constants + var DEFAULT_LOCATION_EDGE_GAP = 7; + var DEFAULT_FRAME_BORDER_WIDTH = 1; + var DEFAULT_FILLER_SIZE = 30; + var HORIZONTAL = 'horizontal'; + var VERTICAL = 'vertical'; + var LABEL_GAP = 5; + var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter']; + + var SliderZoomView = DataZoomView.extend({ + + type: 'dataZoom.slider', + + init: function (ecModel, api) { + + /** + * @private + * @type {Object} + */ + this._displayables = {}; + + /** + * @private + * @type {string} + */ + this._orient; + + /** + * [0, 100] + * @private + */ + this._range; + + /** + * [coord of the first handle, coord of the second handle] + * @private + */ + this._handleEnds; + + /** + * [length, thick] + * @private + * @type {Array.} + */ + this._size; + + /** + * @private + * @type {number} + */ + this._halfHandleSize; + + /** + * @private + */ + this._location; + + /** + * @private + */ + this._dragging; + + /** + * @private + */ + this._dataShadowInfo; + + this.api = api; + }, + + /** + * @override + */ + render: function (dataZoomModel, ecModel, api, payload) { + SliderZoomView.superApply(this, 'render', arguments); + + throttle.createOrUpdate( + this, + '_dispatchZoomAction', + this.dataZoomModel.get('throttle'), + 'fixRate' + ); + + this._orient = dataZoomModel.get('orient'); + this._halfHandleSize = mathRound(dataZoomModel.get('handleSize') / 2); + + if (this.dataZoomModel.get('show') === false) { + this.group.removeAll(); + return; + } + + // Notice: this._resetInterval() should not be executed when payload.type + // is 'dataZoom', origin this._range should be maintained, otherwise 'pan' + // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction, + if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) { + this._buildView(); + } + + this._updateView(); + }, + + /** + * @override + */ + remove: function () { + SliderZoomView.superApply(this, 'remove', arguments); + throttle.clear(this, '_dispatchZoomAction'); + }, + + /** + * @override + */ + dispose: function () { + SliderZoomView.superApply(this, 'dispose', arguments); + throttle.clear(this, '_dispatchZoomAction'); + }, + + _buildView: function () { + var thisGroup = this.group; + + thisGroup.removeAll(); + + this._resetLocation(); + this._resetInterval(); + + var barGroup = this._displayables.barGroup = new graphic.Group(); + + this._renderBackground(); + this._renderDataShadow(); + this._renderHandle(); + + thisGroup.add(barGroup); + + this._positionGroup(); + }, + + /** + * @private + */ + _resetLocation: function () { + var dataZoomModel = this.dataZoomModel; + var api = this.api; + + // If some of x/y/width/height are not specified, + // auto-adapt according to target grid. + var coordRect = this._findCoordRect(); + var ecSize = {width: api.getWidth(), height: api.getHeight()}; + // Default align by coordinate system rect. + var positionInfo = this._orient === HORIZONTAL + ? { + // Why using 'right', because right should be used in vertical, + // and it is better to be consistent for dealing with position param merge. + right: ecSize.width - coordRect.x - coordRect.width, + top: (ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP), + width: coordRect.width, + height: DEFAULT_FILLER_SIZE + } + : { // vertical + right: DEFAULT_LOCATION_EDGE_GAP, + top: coordRect.y, + width: DEFAULT_FILLER_SIZE, + height: coordRect.height + }; + + // Do not write back to option and replace value 'ph', because + // the 'ph' value should be recalculated when resize. + var layoutParams = layout.getLayoutParams(dataZoomModel.option); + + // Replace the placeholder value. + zrUtil.each(['right', 'top', 'width', 'height'], function (name) { + if (layoutParams[name] === 'ph') { + layoutParams[name] = positionInfo[name]; + } + }); + + var layoutRect = layout.getLayoutRect( + layoutParams, + ecSize, + dataZoomModel.padding + ); + + this._location = {x: layoutRect.x, y: layoutRect.y}; + this._size = [layoutRect.width, layoutRect.height]; + this._orient === VERTICAL && this._size.reverse(); + }, + + /** + * @private + */ + _positionGroup: function () { + var thisGroup = this.group; + var location = this._location; + var orient = this._orient; + + // Just use the first axis to determine mapping. + var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel(); + var inverse = targetAxisModel && targetAxisModel.get('inverse'); + + var barGroup = this._displayables.barGroup; + var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; + + // Transform barGroup. + barGroup.attr( + (orient === HORIZONTAL && !inverse) + ? {scale: otherAxisInverse ? [1, 1] : [1, -1]} + : (orient === HORIZONTAL && inverse) + ? {scale: otherAxisInverse ? [-1, 1] : [-1, -1]} + : (orient === VERTICAL && !inverse) + ? {scale: otherAxisInverse ? [1, -1] : [1, 1], rotation: Math.PI / 2} + // Dont use Math.PI, considering shadow direction. + : {scale: otherAxisInverse ? [-1, -1] : [-1, 1], rotation: Math.PI / 2} + ); + + // Position barGroup + var rect = thisGroup.getBoundingRect([barGroup]); + thisGroup.position[0] = location.x - rect.x; + thisGroup.position[1] = location.y - rect.y; + }, + + /** + * @private + */ + _getViewExtent: function () { + // View total length. + var halfHandleSize = this._halfHandleSize; + var totalLength = mathMax(this._size[0], halfHandleSize * 4); + var extent = [halfHandleSize, totalLength - halfHandleSize]; + + return extent; + }, + + _renderBackground : function () { + var dataZoomModel = this.dataZoomModel; + var size = this._size; + + this._displayables.barGroup.add(new Rect({ + silent: true, + shape: { + x: 0, y: 0, width: size[0], height: size[1] + }, + style: { + fill: dataZoomModel.get('backgroundColor') + } + })); + }, + + _renderDataShadow: function () { + var info = this._dataShadowInfo = this._prepareDataShadowInfo(); + + if (!info) { + return; + } + + var size = this._size; + var seriesModel = info.series; + var data = seriesModel.getRawData(); + var otherDim = seriesModel.getShadowDim + ? seriesModel.getShadowDim() // @see candlestick + : info.otherDim; + + var otherDataExtent = data.getDataExtent(otherDim); + // Nice extent. + var otherOffset = (otherDataExtent[1] - otherDataExtent[0]) * 0.3; + otherDataExtent = [ + otherDataExtent[0] - otherOffset, + otherDataExtent[1] + otherOffset + ]; + var otherShadowExtent = [0, size[1]]; + + var thisShadowExtent = [0, size[0]]; + + var points = [[size[0], 0], [0, 0]]; + var step = thisShadowExtent[1] / (data.count() - 1); + var thisCoord = 0; + + // Optimize for large data shadow + var stride = Math.round(data.count() / size[0]); + data.each([otherDim], function (value, index) { + if (stride > 0 && (index % stride)) { + thisCoord += step; + return; + } + // FIXME + // 应该使用统计的空判断?还是在list里进行空判断? + var otherCoord = (value == null || isNaN(value) || value === '') + ? null + : linearMap(value, otherDataExtent, otherShadowExtent, true); + otherCoord != null && points.push([thisCoord, otherCoord]); + + thisCoord += step; + }); + + this._displayables.barGroup.add(new graphic.Polyline({ + shape: {points: points}, + style: {fill: this.dataZoomModel.get('dataBackgroundColor'), lineWidth: 0}, + silent: true, + z2: -20 + })); + }, + + _prepareDataShadowInfo: function () { + var dataZoomModel = this.dataZoomModel; + var showDataShadow = dataZoomModel.get('showDataShadow'); + + if (showDataShadow === false) { + return; + } + + // Find a representative series. + var result; + var ecModel = this.ecModel; + + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) { + var seriesModels = dataZoomModel + .getAxisProxy(dimNames.name, axisIndex) + .getTargetSeriesModels(); + + zrUtil.each(seriesModels, function (seriesModel) { + if (result) { + return; + } + + if (showDataShadow !== true && zrUtil.indexOf( + SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type') + ) < 0 + ) { + return; + } + + var otherDim = getOtherDim(dimNames.name); + + var thisAxis = ecModel.getComponent(dimNames.axis, axisIndex).axis; + + result = { + thisAxis: thisAxis, + series: seriesModel, + thisDim: dimNames.name, + otherDim: otherDim, + otherAxisInverse: seriesModel + .coordinateSystem.getOtherAxis(thisAxis).inverse + }; + + }, this); + + }, this); + + return result; + }, + + _renderHandle: function () { + var displaybles = this._displayables; + var handles = displaybles.handles = []; + var handleLabels = displaybles.handleLabels = []; + var barGroup = this._displayables.barGroup; + var size = this._size; + + barGroup.add(displaybles.filler = new Rect({ + draggable: true, + cursor: 'move', + drift: bind(this._onDragMove, this, 'all'), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false), + style: { + fill: this.dataZoomModel.get('fillerColor'), + // text: ':::', + textPosition : 'inside' + } + })); + + // Frame border. + barGroup.add(new Rect(graphic.subPixelOptimizeRect({ + silent: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + stroke: this.dataZoomModel.get('dataBackgroundColor'), + lineWidth: DEFAULT_FRAME_BORDER_WIDTH, + fill: 'rgba(0,0,0,0)' + } + }))); + + each([0, 1], function (handleIndex) { + + barGroup.add(handles[handleIndex] = new Rect({ + style: { + fill: this.dataZoomModel.get('handleColor') + }, + cursor: 'move', + draggable: true, + drift: bind(this._onDragMove, this, handleIndex), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false) + })); + + var textStyleModel = this.dataZoomModel.textStyleModel; + + this.group.add( + handleLabels[handleIndex] = new graphic.Text({ + silent: true, + invisible: true, + style: { + x: 0, y: 0, text: '', + textVerticalAlign: 'middle', + textAlign: 'center', + fill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont() + } + })); + + }, this); + }, + + /** + * @private + */ + _resetInterval: function () { + var range = this._range = this.dataZoomModel.getPercentRange(); + var viewExtent = this._getViewExtent(); + + this._handleEnds = [ + linearMap(range[0], [0, 100], viewExtent, true), + linearMap(range[1], [0, 100], viewExtent, true) + ]; + }, + + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} dx + * @param {number} dy + */ + _updateInterval: function (handleIndex, delta) { + var handleEnds = this._handleEnds; + var viewExtend = this._getViewExtent(); + + sliderMove( + delta, + handleEnds, + viewExtend, + (handleIndex === 'all' || this.dataZoomModel.get('zoomLock')) + ? 'rigid' : 'cross', + handleIndex + ); + + this._range = asc([ + linearMap(handleEnds[0], viewExtend, [0, 100], true), + linearMap(handleEnds[1], viewExtend, [0, 100], true) + ]); + }, + + /** + * @private + */ + _updateView: function () { + var displaybles = this._displayables; + var handleEnds = this._handleEnds; + var handleInterval = asc(handleEnds.slice()); + var size = this._size; + var halfHandleSize = this._halfHandleSize; + + each([0, 1], function (handleIndex) { + + // Handles + var handle = displaybles.handles[handleIndex]; + handle.setShape({ + x: handleEnds[handleIndex] - halfHandleSize, + y: -1, + width: halfHandleSize * 2, + height: size[1] + 2, + r: 1 + }); + + }, this); + + // Filler + displaybles.filler.setShape({ + x: handleInterval[0], + y: 0, + width: handleInterval[1] - handleInterval[0], + height: this._size[1] + }); + + this._updateDataInfo(); + }, + + /** + * @private + */ + _updateDataInfo: function () { + var dataZoomModel = this.dataZoomModel; + var displaybles = this._displayables; + var handleLabels = displaybles.handleLabels; + var orient = this._orient; + var labelTexts = ['', '']; + + // FIXME + // date型,支持formatter,autoformatter(ec2 date.getAutoFormatter) + if (dataZoomModel.get('showDetail')) { + var dataInterval; + var axis; + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) { + // Using dataInterval of the first axis. + if (!dataInterval) { + dataInterval = dataZoomModel + .getAxisProxy(dimNames.name, axisIndex) + .getDataValueWindow(); + axis = this.ecModel.getComponent(dimNames.axis, axisIndex).axis; + } + }, this); + + if (dataInterval) { + labelTexts = [ + this._formatLabel(dataInterval[0], axis), + this._formatLabel(dataInterval[1], axis) + ]; + } + } + + var orderedHandleEnds = asc(this._handleEnds.slice()); + + setLabel.call(this, 0); + setLabel.call(this, 1); + + function setLabel(handleIndex) { + // Label + // Text should not transform by barGroup. + var barTransform = graphic.getTransform( + displaybles.handles[handleIndex], this.group + ); + var direction = graphic.transformDirection( + handleIndex === 0 ? 'right' : 'left', barTransform + ); + var offset = this._halfHandleSize + LABEL_GAP; + var textPoint = graphic.applyTransform( + [ + orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), + this._size[1] / 2 + ], + barTransform + ); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + textVerticalAlign: orient === HORIZONTAL ? 'middle' : direction, + textAlign: orient === HORIZONTAL ? direction : 'center', + text: labelTexts[handleIndex] + }); + } + }, + + /** + * @private + */ + _formatLabel: function (value, axis) { + var dataZoomModel = this.dataZoomModel; + var labelFormatter = dataZoomModel.get('labelFormatter'); + if (zrUtil.isFunction(labelFormatter)) { + return labelFormatter(value); + } + + var labelPrecision = dataZoomModel.get('labelPrecision'); + if (labelPrecision == null || labelPrecision === 'auto') { + labelPrecision = axis.getPixelPrecision(); + } + + value = (value == null && isNaN(value)) + ? '' + // FIXME Glue code + : (axis.type === 'category' || axis.type === 'time') + ? axis.scale.getLabel(Math.round(value)) + // param of toFixed should less then 20. + : value.toFixed(Math.min(labelPrecision, 20)); + + if (zrUtil.isString(labelFormatter)) { + value = labelFormatter.replace('{value}', value); + } + + return value; + }, + + /** + * @private + * @param {boolean} showOrHide true: show, false: hide + */ + _showDataInfo: function (showOrHide) { + // Always show when drgging. + showOrHide = this._dragging || showOrHide; + + var handleLabels = this._displayables.handleLabels; + handleLabels[0].attr('invisible', !showOrHide); + handleLabels[1].attr('invisible', !showOrHide); + }, + + _onDragMove: function (handleIndex, dx, dy) { + this._dragging = true; + + // Transform dx, dy to bar coordination. + var vertex = this._applyBarTransform([dx, dy], true); + + this._updateInterval(handleIndex, vertex[0]); + this._updateView(); + + if (this.dataZoomModel.get('realtime')) { + this._dispatchZoomAction(); + } + }, + + _onDragEnd: function () { + this._dragging = false; + this._showDataInfo(false); + this._dispatchZoomAction(); + }, + + /** + * This action will be throttled. + * @private + */ + _dispatchZoomAction: function () { + var range = this._range; + + this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + dataZoomId: this.dataZoomModel.id, + start: range[0], + end: range[1] + }); + }, + + /** + * @private + */ + _applyBarTransform: function (vertex, inverse) { + var barTransform = this._displayables.barGroup.getLocalTransform(); + return graphic.applyTransform(vertex, barTransform, inverse); + }, + + /** + * @private + */ + _findCoordRect: function () { + // Find the grid coresponding to the first axis referred by dataZoom. + var targetInfo = this.getTargetInfo(); + + // FIXME + // 判断是catesian还是polar + var rect; + if (targetInfo.cartesians.length) { + rect = targetInfo.cartesians[0].model.coordinateSystem.getRect(); + } + else { // Polar + // FIXME + // 暂时随便写的 + var width = this.api.getWidth(); + var height = this.api.getHeight(); + rect = { + x: width * 0.2, + y: height * 0.2, + width: width * 0.6, + height: height * 0.6 + }; + } + + return rect; + } + + }); + + function getOtherDim(thisDim) { + // FIXME + // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好 + return thisDim === 'x' ? 'y' : 'x'; + } + + module.exports = SliderZoomView; + + + +/***/ }, +/* 293 */ +/***/ function(module, exports) { + + + + var lib = {}; + + var ORIGIN_METHOD = '\0__throttleOriginMethod'; + var RATE = '\0__throttleRate'; + + /** + * 频率控制 返回函数连续调用时,fn 执行频率限定为每多少时间执行一次 + * 例如常见效果: + * notifyWhenChangesStop + * 频繁调用时,只保证最后一次执行 + * 配成:trailing:true;debounce:true 即可 + * notifyAtFixRate + * 频繁调用时,按规律心跳执行 + * 配成:trailing:true;debounce:false 即可 + * 注意: + * 根据model更新view的时候,可以使用throttle, + * 但是根据view更新model的时候,避免使用这种延迟更新的方式。 + * 因为这可能导致model和server同步出现问题。 + * + * @public + * @param {(Function|Array.)} fn 需要调用的函数 + * 如果fn为array,则表示可以对多个函数进行throttle。 + * 他们共享同一个timer。 + * @param {number} delay 延迟时间,单位毫秒 + * @param {bool} trailing 是否保证最后一次触发的执行 + * true:表示保证最后一次调用会触发执行。 + * 但任何调用后不可能立即执行,总会delay。 + * false:表示不保证最后一次调用会触发执行。 + * 但只要间隔大于delay,调用就会立即执行。 + * @param {bool} debounce 节流 + * true:表示:频繁调用(间隔小于delay)时,根本不执行 + * false:表示:频繁调用(间隔小于delay)时,按规律心跳执行 + * @return {(Function|Array.)} 实际调用函数。 + * 当输入的fn为array时,返回值也为array。 + * 每项是Function。 + */ + lib.throttle = function (fn, delay, trailing, debounce) { + + var currCall = (new Date()).getTime(); + var lastCall = 0; + var lastExec = 0; + var timer = null; + var diff; + var scope; + var args; + var isSingle = typeof fn === 'function'; + delay = delay || 0; + + if (isSingle) { + return createCallback(); + } + else { + var ret = []; + for (var i = 0; i < fn.length; i++) { + ret[i] = createCallback(i); + } + return ret; + } + + function createCallback(index) { + + function exec() { + lastExec = (new Date()).getTime(); + timer = null; + (isSingle ? fn : fn[index]).apply(scope, args || []); + } + + var cb = function () { + currCall = (new Date()).getTime(); + scope = this; + args = arguments; + diff = currCall - (debounce ? lastCall : lastExec) - delay; + + clearTimeout(timer); + + if (debounce) { + if (trailing) { + timer = setTimeout(exec, delay); + } + else if (diff >= 0) { + exec(); + } + } + else { + if (diff >= 0) { + exec(); + } + else if (trailing) { + timer = setTimeout(exec, -diff); + } + } + + lastCall = currCall; + }; + + /** + * Clear throttle. + * @public + */ + cb.clear = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + }; + + return cb; + } + }; + + /** + * 按一定频率执行,最后一次调用总归会执行 + * + * @public + */ + lib.fixRate = function (fn, delay) { + return delay != null + ? lib.throttle(fn, delay, true, false) + : fn; + }; + + /** + * 直到不频繁调用了才会执行,最后一次调用总归会执行 + * + * @public + */ + lib.debounce = function (fn, delay) { + return delay != null + ? lib.throttle(fn, delay, true, true) + : fn; + }; + + + /** + * Create throttle method or update throttle rate. + * + * @example + * ComponentView.prototype.render = function () { + * ... + * throttle.createOrUpdate( + * this, + * '_dispatchAction', + * this.model.get('throttle'), + * 'fixRate' + * ); + * }; + * ComponentView.prototype.remove = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * ComponentView.prototype.dispose = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * + * @public + * @param {Object} obj + * @param {string} fnAttr + * @param {number} rate + * @param {string} throttleType 'fixRate' or 'debounce' + */ + lib.createOrUpdate = function (obj, fnAttr, rate, throttleType) { + var fn = obj[fnAttr]; + + if (!fn || rate == null || !throttleType) { + return; + } + + var originFn = fn[ORIGIN_METHOD] || fn; + var lastRate = fn[RATE]; + + if (lastRate !== rate) { + fn = obj[fnAttr] = lib[throttleType](originFn, rate); + fn[ORIGIN_METHOD] = originFn; + fn[RATE] = rate; + } + }; + + /** + * Clear throttle. Example see throttle.createOrUpdate. + * + * @public + * @param {Object} obj + * @param {string} fnAttr + */ + lib.clear = function (obj, fnAttr) { + var fn = obj[fnAttr]; + if (fn && fn[ORIGIN_METHOD]) { + obj[fnAttr] = fn[ORIGIN_METHOD]; + } + }; + + module.exports = lib; + + + +/***/ }, +/* 294 */ +/***/ function(module, exports) { + + + + /** + * Calculate slider move result. + * + * @param {number} delta Move length. + * @param {Array.} handleEnds handleEnds[0] and be bigger then handleEnds[1]. + * handleEnds will be modified in this method. + * @param {Array.} extent handleEnds is restricted by extent. + * extent[0] should less or equals than extent[1]. + * @param {string} mode 'rigid': Math.abs(handleEnds[0] - handleEnds[1]) remain unchanged, + * 'cross' handleEnds[0] can be bigger then handleEnds[1], + * 'push' handleEnds[0] can not be bigger then handleEnds[1], + * when they touch, one push other. + * @param {number} handleIndex If mode is 'rigid', handleIndex is not required. + * @param {Array.} The input handleEnds. + */ + module.exports = function (delta, handleEnds, extent, mode, handleIndex) { + if (!delta) { + return handleEnds; + } + + if (mode === 'rigid') { + delta = getRealDelta(delta, handleEnds, extent); + handleEnds[0] += delta; + handleEnds[1] += delta; + } + else { + delta = getRealDelta(delta, handleEnds[handleIndex], extent); + handleEnds[handleIndex] += delta; + + if (mode === 'push' && handleEnds[0] > handleEnds[1]) { + handleEnds[1 - handleIndex] = handleEnds[handleIndex]; + } + } + + return handleEnds; + + function getRealDelta(delta, handleEnds, extent) { + var handleMinMax = !handleEnds.length + ? [handleEnds, handleEnds] + : handleEnds.slice(); + handleEnds[0] > handleEnds[1] && handleMinMax.reverse(); + + if (delta < 0 && handleMinMax[0] + delta < extent[0]) { + delta = extent[0] - handleMinMax[0]; + } + if (delta > 0 && handleMinMax[1] + delta > extent[1]) { + delta = extent[1] - handleMinMax[1]; + } + return delta; + } + }; + + +/***/ }, +/* 295 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + module.exports = __webpack_require__(288).extend({ + + type: 'dataZoom.inside', + + /** + * @protected + */ + defaultOption: { + zoomLock: false // Whether disable zoom but only pan. + } + }); + + +/***/ }, +/* 296 */ +/***/ function(module, exports, __webpack_require__) { + + + + var DataZoomView = __webpack_require__(290); + var zrUtil = __webpack_require__(3); + var sliderMove = __webpack_require__(294); + var roams = __webpack_require__(297); + var bind = zrUtil.bind; + + var InsideZoomView = DataZoomView.extend({ + + type: 'dataZoom.inside', + + /** + * @override + */ + init: function (ecModel, api) { + /** + * 'throttle' is used in this.dispatchAction, so we save range + * to avoid missing some 'pan' info. + * @private + * @type {Array.} + */ + this._range; + }, + + /** + * @override + */ + render: function (dataZoomModel, ecModel, api, payload) { + InsideZoomView.superApply(this, 'render', arguments); + + // Notice: origin this._range should be maintained, and should not be re-fetched + // from dataZoomModel when payload.type is 'dataZoom', otherwise 'pan' or 'zoom' + // info will be missed because of 'throttle' of this.dispatchAction. + if (roams.shouldRecordRange(payload, dataZoomModel.id)) { + this._range = dataZoomModel.getPercentRange(); + } + + // Reset controllers. + var coordInfoList = this.getTargetInfo().cartesians; + var allCoordIds = zrUtil.map(coordInfoList, function (coordInfo) { + return roams.generateCoordId(coordInfo.model); + }); + zrUtil.each(coordInfoList, function (coordInfo) { + var coordModel = coordInfo.model; + roams.register( + api, + { + coordId: roams.generateCoordId(coordModel), + allCoordIds: allCoordIds, + coordinateSystem: coordModel.coordinateSystem, + dataZoomId: dataZoomModel.id, + throttleRage: dataZoomModel.get('throttle', true), + panGetRange: bind(this._onPan, this, coordInfo), + zoomGetRange: bind(this._onZoom, this, coordInfo) + } + ); + }, this); + + // TODO + // polar支持 + }, + + /** + * @override + */ + remove: function () { + roams.unregister(this.api, this.dataZoomModel.id); + InsideZoomView.superApply(this, 'remove', arguments); + this._range = null; + }, + + /** + * @override + */ + dispose: function () { + roams.unregister(this.api, this.dataZoomModel.id); + InsideZoomView.superApply(this, 'dispose', arguments); + this._range = null; + }, + + /** + * @private + */ + _onPan: function (coordInfo, controller, dx, dy) { + return ( + this._range = panCartesian( + [dx, dy], this._range, controller, coordInfo + ) + ); + }, + + /** + * @private + */ + _onZoom: function (coordInfo, controller, scale, mouseX, mouseY) { + var dataZoomModel = this.dataZoomModel; + + if (dataZoomModel.option.zoomLock) { + return this._range; + } + + return ( + this._range = scaleCartesian( + 1 / scale, [mouseX, mouseY], this._range, + controller, coordInfo, dataZoomModel + ) + ); + } + + }); + + function panCartesian(pixelDeltas, range, controller, coordInfo) { + range = range.slice(); + + // Calculate transform by the first axis. + var axisModel = coordInfo.axisModels[0]; + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo(pixelDeltas, axisModel, controller); + + var percentDelta = directionInfo.signal + * (range[1] - range[0]) + * directionInfo.pixel / directionInfo.pixelLength; + + sliderMove( + percentDelta, + range, + [0, 100], + 'rigid' + ); + + return range; + } + + function scaleCartesian(scale, mousePoint, range, controller, coordInfo, dataZoomModel) { + range = range.slice(); + + // Calculate transform by the first axis. + var axisModel = coordInfo.axisModels[0]; + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo(mousePoint, axisModel, controller); + + var mouse = directionInfo.pixel - directionInfo.pixelStart; + var percentPoint = mouse / directionInfo.pixelLength * (range[1] - range[0]) + range[0]; + + scale = Math.max(scale, 0); + range[0] = (range[0] - percentPoint) * scale + percentPoint; + range[1] = (range[1] - percentPoint) * scale + percentPoint; + + return fixRange(range); + } + + function getDirectionInfo(xy, axisModel, controller) { + var axis = axisModel.axis; + var rect = controller.rect; + var ret = {}; + + if (axis.dim === 'x') { + ret.pixel = xy[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } + else { // axis.dim === 'y' + ret.pixel = xy[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + } + + function fixRange(range) { + // Clamp, using !(<= or >=) to handle NaN. + // jshint ignore:start + var bound = [0, 100]; + !(range[0] <= bound[1]) && (range[0] = bound[1]); + !(range[1] <= bound[1]) && (range[1] = bound[1]); + !(range[0] >= bound[0]) && (range[0] = bound[0]); + !(range[1] >= bound[0]) && (range[1] = bound[0]); + // jshint ignore:end + + return range; + } + + module.exports = InsideZoomView; + + +/***/ }, +/* 297 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Roam controller manager. + */ + + + // Only create one roam controller for each coordinate system. + // one roam controller might be refered by two inside data zoom + // components (for example, one for x and one for y). When user + // pan or zoom, only dispatch one action for those data zoom + // components. + + var zrUtil = __webpack_require__(3); + var RoamController = __webpack_require__(159); + var throttle = __webpack_require__(293); + var curry = zrUtil.curry; + + var ATTR = '\0_ec_dataZoom_roams'; + + var roams = { + + /** + * @public + * @param {module:echarts/ExtensionAPI} api + * @param {Object} dataZoomInfo + * @param {string} dataZoomInfo.coordId + * @param {Object} dataZoomInfo.coordinateSystem + * @param {Array.} dataZoomInfo.allCoordIds + * @param {string} dataZoomInfo.dataZoomId + * @param {number} dataZoomInfo.throttleRate + * @param {Function} dataZoomInfo.panGetRange + * @param {Function} dataZoomInfo.zoomGetRange + */ + register: function (api, dataZoomInfo) { + var store = giveStore(api); + var theDataZoomId = dataZoomInfo.dataZoomId; + var theCoordId = dataZoomInfo.coordId; + + // Do clean when a dataZoom changes its target coordnate system. + zrUtil.each(store, function (record, coordId) { + var dataZoomInfos = record.dataZoomInfos; + if (dataZoomInfos[theDataZoomId] + && zrUtil.indexOf(dataZoomInfo.allCoordIds, theCoordId) < 0 + ) { + delete dataZoomInfos[theDataZoomId]; + record.count--; + } + }); + + cleanStore(store); + + var record = store[theCoordId]; + + // Create if needed. + if (!record) { + record = store[theCoordId] = { + coordId: theCoordId, + dataZoomInfos: {}, + count: 0 + }; + record.controller = createController(api, dataZoomInfo, record); + record.dispatchAction = zrUtil.curry(dispatchAction, api); + } + + // Consider resize, area should be always updated. + record.controller.rect = dataZoomInfo.coordinateSystem.getRect().clone(); + + // Update throttle. + throttle.createOrUpdate( + record, + 'dispatchAction', + dataZoomInfo.throttleRate, + 'fixRate' + ); + + // Update reference of dataZoom. + !(record.dataZoomInfos[theDataZoomId]) && record.count++; + record.dataZoomInfos[theDataZoomId] = dataZoomInfo; + }, + + /** + * @public + * @param {module:echarts/ExtensionAPI} api + * @param {string} dataZoomId + */ + unregister: function (api, dataZoomId) { + var store = giveStore(api); + + zrUtil.each(store, function (record) { + var dataZoomInfos = record.dataZoomInfos; + if (dataZoomInfos[dataZoomId]) { + delete dataZoomInfos[dataZoomId]; + record.count--; + } + }); + + cleanStore(store); + }, + + /** + * @public + */ + shouldRecordRange: function (payload, dataZoomId) { + if (payload && payload.type === 'dataZoom' && payload.batch) { + for (var i = 0, len = payload.batch.length; i < len; i++) { + if (payload.batch[i].dataZoomId === dataZoomId) { + return false; + } + } + } + return true; + }, + + /** + * @public + */ + generateCoordId: function (coordModel) { + return coordModel.type + '\0_' + coordModel.id; + } + }; + + /** + * Key: coordId, value: {dataZoomInfos: [], count, controller} + * @type {Array.} + */ + function giveStore(api) { + // Mount store on zrender instance, so that we do not + // need to worry about dispose. + var zr = api.getZr(); + return zr[ATTR] || (zr[ATTR] = {}); + } + + function createController(api, dataZoomInfo, newRecord) { + var controller = new RoamController(api.getZr()); + controller.enable(); + controller.on('pan', curry(onPan, newRecord)); + controller.on('zoom', curry(onZoom, newRecord)); + + return controller; + } + + function cleanStore(store) { + zrUtil.each(store, function (record, coordId) { + if (!record.count) { + record.controller.off('pan').off('zoom'); + delete store[coordId]; + } + }); + } + + function onPan(record, dx, dy) { + wrapAndDispatch(record, function (info) { + return info.panGetRange(record.controller, dx, dy); + }); + } + + function onZoom(record, scale, mouseX, mouseY) { + wrapAndDispatch(record, function (info) { + return info.zoomGetRange(record.controller, scale, mouseX, mouseY); + }); + } + + function wrapAndDispatch(record, getRange) { + var batch = []; + + zrUtil.each(record.dataZoomInfos, function (info) { + var range = getRange(info); + range && batch.push({ + dataZoomId: info.dataZoomId, + start: range[0], + end: range[1] + }); + }); + + record.dispatchAction(batch); + } + + /** + * This action will be throttled. + */ + function dispatchAction(api, batch) { + api.dispatchAction({ + type: 'dataZoom', + batch: batch + }); + } + + module.exports = roams; + + + +/***/ }, +/* 298 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom processor + */ + + + var echarts = __webpack_require__(1); + + echarts.registerProcessor('filter', function (ecModel, api) { + + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // We calculate window and reset axis here but not in model + // init stage and not after action dispatch handler, because + // reset should be called after seriesData.restoreData. + dataZoomModel.eachTargetAxis(resetSingleAxis); + + // Caution: data zoom filtering is order sensitive when using + // percent range and no min/max/scale set on axis. + // For example, we have dataZoom definition: + // [ + // {xAxisIndex: 0, start: 30, end: 70}, + // {yAxisIndex: 0, start: 20, end: 80} + // ] + // In this case, [20, 80] of y-dataZoom should be based on data + // that have filtered by x-dataZoom using range of [30, 70], + // but should not be based on full raw data. Thus sliding + // x-dataZoom will change both ranges of xAxis and yAxis, + // while sliding y-dataZoom will only change the range of yAxis. + // So we should filter x-axis after reset x-axis immediately, + // and then reset y-axis and filter y-axis. + dataZoomModel.eachTargetAxis(filterSingleAxis); + }); + + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // Fullfill all of the range props so that user + // is able to get them from chart.getOption(). + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + var percentRange = axisProxy.getDataPercentWindow(); + var valueRange = axisProxy.getDataValueWindow(); + dataZoomModel.setRawRange({ + start: percentRange[0], + end: percentRange[1], + startValue: valueRange[0], + endValue: valueRange[1] + }); + }); + }); + + function resetSingleAxis(dimNames, axisIndex, dataZoomModel) { + dataZoomModel.getAxisProxy(dimNames.name, axisIndex).reset(dataZoomModel); + } + + function filterSingleAxis(dimNames, axisIndex, dataZoomModel) { + dataZoomModel.getAxisProxy(dimNames.name, axisIndex).filterData(dataZoomModel); + } + + + + +/***/ }, +/* 299 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom action + */ + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var echarts = __webpack_require__(1); + + + echarts.registerAction('dataZoom', function (payload, ecModel) { + + var linkedNodesFinder = modelUtil.createLinkedNodesFinder( + zrUtil.bind(ecModel.eachComponent, ecModel, 'dataZoom'), + modelUtil.eachAxisDim, + function (model, dimNames) { + return model.get(dimNames.axisIndex); + } + ); + + var effectedModels = []; + + ecModel.eachComponent( + {mainType: 'dataZoom', query: payload}, + function (model, index) { + effectedModels.push.apply( + effectedModels, linkedNodesFinder(model).nodes + ); + } + ); + + zrUtil.each(effectedModels, function (dataZoomModel, index) { + dataZoomModel.setRawRange({ + start: payload.start, + end: payload.end, + startValue: payload.startValue, + endValue: payload.endValue + }); + }); + + }); + + + +/***/ }, +/* 300 */, +/* 301 */, +/* 302 */, +/* 303 */, +/* 304 */, +/* 305 */, +/* 306 */, +/* 307 */, +/* 308 */, +/* 309 */, +/* 310 */, +/* 311 */, +/* 312 */, +/* 313 */, +/* 314 */, +/* 315 */ +/***/ function(module, exports, __webpack_require__) { + + // HINT Markpoint can't be used too much + + + __webpack_require__(316); + __webpack_require__(317); + + __webpack_require__(1).registerPreprocessor(function (opt) { + // Make sure markPoint component is enabled + opt.markPoint = opt.markPoint || {}; + }); + + +/***/ }, +/* 316 */ +/***/ function(module, exports, __webpack_require__) { + + + // Default enable markPoint + // var globalDefault = require('../../model/globalDefault'); + var modelUtil = __webpack_require__(5); + // // Force to load markPoint component + // globalDefault.markPoint = {}; + + var MarkPointModel = __webpack_require__(1).extendComponentModel({ + + type: 'markPoint', + + dependencies: ['series', 'grid', 'polar'], + /** + * @overrite + */ + init: function (option, parentModel, ecModel, extraOpt) { + this.mergeDefaultAndTheme(option, ecModel); + this.mergeOption(option, ecModel, extraOpt.createdBySelf, true); + }, + + mergeOption: function (newOpt, ecModel, createdBySelf, isInit) { + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + var markPointOpt = seriesModel.get('markPoint'); + var mpModel = seriesModel.markPointModel; + if (!markPointOpt || !markPointOpt.data) { + seriesModel.markPointModel = null; + return; + } + if (!mpModel) { + if (isInit) { + // Default label emphasis `position` and `show` + modelUtil.defaultEmphasis( + markPointOpt.label, + ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + } + var opt = { + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }; + mpModel = new MarkPointModel( + markPointOpt, this, ecModel, opt + ); + } + else { + mpModel.mergeOption(markPointOpt, ecModel, true); + } + seriesModel.markPointModel = mpModel; + }, this); + } + }, + + defaultOption: { + zlevel: 0, + z: 5, + symbol: 'pin', // 标注类型 + symbolSize: 50, // 标注大小 + // symbolRotate: null, // 标注旋转控制 + tooltip: { + trigger: 'item' + }, + label: { + normal: { + show: true, + // 标签文本格式器,同Tooltip.formatter,不支持回调 + // formatter: null, + // 可选为'left'|'right'|'top'|'bottom' + position: 'inside' + // 默认使用全局文本样式,详见TEXTSTYLE + // textStyle: null + }, + emphasis: { + show: true + // 标签文本格式器,同Tooltip.formatter,不支持回调 + // formatter: null, + // position: 'inside' // 'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + } + }, + itemStyle: { + normal: { + // color: 各异, + // 标注边线颜色,优先于color + // borderColor: 各异, + // 标注边线线宽,单位px,默认为1 + borderWidth: 2 + }, + emphasis: { + // color: 各异 + } + } + } + }); + + module.exports = MarkPointModel; + + +/***/ }, +/* 317 */ +/***/ function(module, exports, __webpack_require__) { + + + + var SymbolDraw = __webpack_require__(98); + var zrUtil = __webpack_require__(3); + var formatUtil = __webpack_require__(6); + var modelUtil = __webpack_require__(5); + var numberUtil = __webpack_require__(7); + + var addCommas = formatUtil.addCommas; + var encodeHTML = formatUtil.encodeHTML; + + var List = __webpack_require__(94); + + var markerHelper = __webpack_require__(318); + + function updateMarkerLayout(mpData, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var point; + var xPx = itemModel.getShallow('x'); + var yPx = itemModel.getShallow('y'); + if (xPx != null && yPx != null) { + point = [ + numberUtil.parsePercent(xPx, api.getWidth()), + numberUtil.parsePercent(yPx, api.getHeight()) + ]; + } + // Chart like bar may have there own marker positioning logic + else if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition( + mpData.getValues(mpData.dimensions, idx) + ); + } + else if (coordSys) { + var x = mpData.get(coordSys.dimensions[0], idx); + var y = mpData.get(coordSys.dimensions[1], idx); + point = coordSys.dataToPoint([x, y]); + } + + mpData.setItemLayout(idx, point); + }); + } + + // FIXME + var markPointFormatMixin = { + getRawDataArray: function () { + return this.option.data; + }, + + formatTooltip: function (dataIndex) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var formattedValue = zrUtil.isArray(value) + ? zrUtil.map(value, addCommas).join(', ') : addCommas(value); + var name = data.getName(dataIndex); + return this.name + '
            ' + + ((name ? encodeHTML(name) + ' : ' : '') + formattedValue); + }, + + getData: function () { + return this._data; + }, + + setData: function (data) { + this._data = data; + } + }; + + zrUtil.defaults(markPointFormatMixin, modelUtil.dataFormatMixin); + + __webpack_require__(1).extendComponentView({ + + type: 'markPoint', + + init: function () { + this._symbolDrawMap = {}; + }, + + render: function (markPointModel, ecModel, api) { + var symbolDrawMap = this._symbolDrawMap; + for (var name in symbolDrawMap) { + symbolDrawMap[name].__keep = false; + } + + ecModel.eachSeries(function (seriesModel) { + var mpModel = seriesModel.markPointModel; + mpModel && this._renderSeriesMP(seriesModel, mpModel, api); + }, this); + + for (var name in symbolDrawMap) { + if (!symbolDrawMap[name].__keep) { + symbolDrawMap[name].remove(); + this.group.remove(symbolDrawMap[name].group); + } + } + }, + + updateLayout: function (markPointModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mpModel = seriesModel.markPointModel; + if (mpModel) { + updateMarkerLayout(mpModel.getData(), seriesModel, api); + this._symbolDrawMap[seriesModel.name].updateLayout(mpModel); + } + }, this); + }, + + _renderSeriesMP: function (seriesModel, mpModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesName = seriesModel.name; + var seriesData = seriesModel.getData(); + + var symbolDrawMap = this._symbolDrawMap; + var symbolDraw = symbolDrawMap[seriesName]; + if (!symbolDraw) { + symbolDraw = symbolDrawMap[seriesName] = new SymbolDraw(); + } + + var mpData = createList(coordSys, seriesModel, mpModel); + + // FIXME + zrUtil.mixin(mpModel, markPointFormatMixin); + mpModel.setData(mpData); + + updateMarkerLayout(mpModel.getData(), seriesModel, api); + + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var symbolSize = itemModel.getShallow('symbolSize'); + if (typeof symbolSize === 'function') { + // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据? + symbolSize = symbolSize( + mpModel.getRawValue(idx), mpModel.getDataParams(idx) + ); + } + mpData.setItemVisual(idx, { + symbolSize: symbolSize, + color: itemModel.get('itemStyle.normal.color') + || seriesData.getVisual('color'), + symbol: itemModel.getShallow('symbol') + }); + }); + + // TODO Text are wrong + symbolDraw.updateData(mpData); + this.group.add(symbolDraw.group); + + // Set host model for tooltip + // FIXME + mpData.eachItemGraphicEl(function (el) { + el.traverse(function (child) { + child.dataModel = mpModel; + }); + }); + + symbolDraw.__keep = true; + } + }); + + /** + * @inner + * @param {module:echarts/coord/*} [coordSys] + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Model} mpModel + */ + function createList(coordSys, seriesModel, mpModel) { + var coordDimsInfos; + if (coordSys) { + coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo( + seriesModel.coordDimToDataDim(coordDim)[0] + ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + info.name = coordDim; + return info; + }); + } + else { + coordDimsInfos =[{ + name: 'value', + type: 'float' + }]; + } + + var mpData = new List(coordDimsInfos, mpModel); + var dataOpt = zrUtil.map(mpModel.get('data'), zrUtil.curry( + markerHelper.dataTransform, seriesModel + )); + if (coordSys) { + dataOpt = zrUtil.filter( + dataOpt, zrUtil.curry(markerHelper.dataFilter, coordSys) + ); + } + + mpData.initData(dataOpt, null, + coordSys ? markerHelper.dimValueGetter : function (item) { + return item.value; + } + ); + return mpData; + } + + + +/***/ }, +/* 318 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var indexOf = zrUtil.indexOf; + + function getPrecision(data, valueAxisDim, dataIndex) { + var precision = -1; + do { + precision = Math.max( + numberUtil.getPrecision(data.get( + valueAxisDim, dataIndex + )), + precision + ); + data = data.stackedOn; + } while (data); + + return precision; + } + + function markerTypeCalculatorWithExtent( + mlType, data, baseDataDim, valueDataDim, baseCoordIndex, valueCoordIndex + ) { + var coordArr = []; + var value = numCalculate(data, valueDataDim, mlType); + + var dataIndex = data.indexOfNearest(valueDataDim, value, true); + coordArr[baseCoordIndex] = data.get(baseDataDim, dataIndex, true); + coordArr[valueCoordIndex] = data.get(valueDataDim, dataIndex, true); + + var precision = getPrecision(data, valueDataDim, dataIndex); + if (precision >= 0) { + coordArr[valueCoordIndex] = +coordArr[valueCoordIndex].toFixed(precision); + } + + return coordArr; + } + + var curry = zrUtil.curry; + // TODO Specified percent + var markerTypeCalculator = { + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + min: curry(markerTypeCalculatorWithExtent, 'min'), + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + max: curry(markerTypeCalculatorWithExtent, 'max'), + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + average: curry(markerTypeCalculatorWithExtent, 'average') + }; + + /** + * Transform markPoint data item to format used in List by do the following + * 1. Calculate statistic like `max`, `min`, `average` + * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/coord/*} [coordSys] + * @param {Object} item + * @return {Object} + */ + var dataTransform = function (seriesModel, item) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + + // 1. If not specify the position with pixel directly + // 2. If `coord` is not a data array. Which uses `xAxis`, + // `yAxis` to specify the coord on each dimension + if ((isNaN(item.x) || isNaN(item.y)) + && !zrUtil.isArray(item.coord) + && coordSys + ) { + var axisInfo = getAxisInfo(item, data, coordSys, seriesModel); + + // Clone the option + // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value + item = zrUtil.clone(item); + + if (item.type + && markerTypeCalculator[item.type] + && axisInfo.baseAxis && axisInfo.valueAxis + ) { + var dims = coordSys.dimensions; + var baseCoordIndex = indexOf(dims, axisInfo.baseAxis.dim); + var valueCoordIndex = indexOf(dims, axisInfo.valueAxis.dim); + + item.coord = markerTypeCalculator[item.type]( + data, axisInfo.baseDataDim, axisInfo.valueDataDim, + baseCoordIndex, valueCoordIndex + ); + // Force to use the value of calculated value. + item.value = item.coord[valueCoordIndex]; + } + else { + // FIXME Only has one of xAxis and yAxis. + item.coord = [ + item.xAxis != null ? item.xAxis : item.radiusAxis, + item.yAxis != null ? item.yAxis : item.angleAxis + ]; + } + } + return item; + }; + + var getAxisInfo = function (item, data, coordSys, seriesModel) { + var ret = {}; + + if (item.valueIndex != null || item.valueDim != null) { + ret.valueDataDim = item.valueIndex != null + ? data.getDimension(item.valueIndex) : item.valueDim; + ret.valueAxis = coordSys.getAxis(seriesModel.dataDimToCoordDim(ret.valueDataDim)); + ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis); + ret.baseDataDim = seriesModel.coordDimToDataDim(ret.baseAxis.dim)[0]; + } + else { + ret.baseAxis = seriesModel.getBaseAxis(); + ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis); + ret.baseDataDim = seriesModel.coordDimToDataDim(ret.baseAxis.dim)[0]; + ret.valueDataDim = seriesModel.coordDimToDataDim(ret.valueAxis.dim)[0]; + } + + return ret; + }; + + /** + * Filter data which is out of coordinateSystem range + * [dataFilter description] + * @param {module:echarts/coord/*} [coordSys] + * @param {Object} item + * @return {boolean} + */ + var dataFilter = function (coordSys, item) { + // Alwalys return true if there is no coordSys + return (coordSys && coordSys.containData && item.coord && (item.x == null || item.y == null)) + ? coordSys.containData(item.coord) : true; + }; + + var dimValueGetter = function (item, dimName, dataIndex, dimIndex) { + // x, y, radius, angle + if (dimIndex < 2) { + return item.coord && item.coord[dimIndex]; + } + else { + return item.value; + } + }; + + var numCalculate = function (data, valueDataDim, mlType) { + return mlType === 'average' + ? data.getSum(valueDataDim, true) / data.count() + : data.getDataExtent(valueDataDim, true)[mlType === 'max' ? 1 : 0]; + }; + + module.exports = { + dataTransform: dataTransform, + dataFilter: dataFilter, + dimValueGetter: dimValueGetter, + getAxisInfo: getAxisInfo, + numCalculate: numCalculate + }; + + +/***/ }, +/* 319 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(320); + __webpack_require__(321); + + __webpack_require__(1).registerPreprocessor(function (opt) { + // Make sure markLine component is enabled + opt.markLine = opt.markLine || {}; + }); + + +/***/ }, +/* 320 */ +/***/ function(module, exports, __webpack_require__) { + + + + // Default enable markLine + // var globalDefault = require('../../model/globalDefault'); + var modelUtil = __webpack_require__(5); + + // // Force to load markLine component + // globalDefault.markLine = {}; + + var MarkLineModel = __webpack_require__(1).extendComponentModel({ + + type: 'markLine', + + dependencies: ['series', 'grid', 'polar'], + /** + * @overrite + */ + init: function (option, parentModel, ecModel, extraOpt) { + this.mergeDefaultAndTheme(option, ecModel); + this.mergeOption(option, ecModel, extraOpt.createdBySelf, true); + }, + + mergeOption: function (newOpt, ecModel, createdBySelf, isInit) { + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + var markLineOpt = seriesModel.get('markLine'); + var mlModel = seriesModel.markLineModel; + if (!markLineOpt || !markLineOpt.data) { + seriesModel.markLineModel = null; + return; + } + if (!mlModel) { + if (isInit) { + // Default label emphasis `position` and `show` + modelUtil.defaultEmphasis( + markLineOpt.label, + ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + } + var opt = { + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }; + mlModel = new MarkLineModel( + markLineOpt, this, ecModel, opt + ); + } + else { + mlModel.mergeOption(markLineOpt, ecModel, true); + } + seriesModel.markLineModel = mlModel; + }, this); + } + }, + + defaultOption: { + zlevel: 0, + z: 5, + // 标线起始和结束的symbol介绍类型,如果都一样,可以直接传string + symbol: ['circle', 'arrow'], + // 标线起始和结束的symbol大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + symbolSize: [8, 16], + // 标线起始和结束的symbol旋转控制 + //symbolRotate: null, + //smooth: false, + precision: 2, + tooltip: { + trigger: 'item' + }, + label: { + normal: { + show: true, + // 标签文本格式器,同Tooltip.formatter,不支持回调 + // formatter: null, + // 可选为 'start'|'end'|'left'|'right'|'top'|'bottom' + position: 'end' + // 默认使用全局文本样式,详见TEXTSTYLE + // textStyle: null + }, + emphasis: { + show: true + } + }, + lineStyle: { + normal: { + // color + // width + type: 'dashed' + // shadowColor: 'rgba(0,0,0,0)', + // shadowBlur: 0, + // shadowOffsetX: 0, + // shadowOffsetY: 0 + }, + emphasis: { + width: 3 + } + }, + animationEasing: 'linear' + } + }); + + module.exports = MarkLineModel; + + +/***/ }, +/* 321 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var List = __webpack_require__(94); + var formatUtil = __webpack_require__(6); + var modelUtil = __webpack_require__(5); + var numberUtil = __webpack_require__(7); + + var addCommas = formatUtil.addCommas; + var encodeHTML = formatUtil.encodeHTML; + + var markerHelper = __webpack_require__(318); + + var LineDraw = __webpack_require__(194); + + var markLineTransform = function (seriesModel, coordSys, mlModel, item) { + var data = seriesModel.getData(); + // Special type markLine like 'min', 'max', 'average' + var mlType = item.type; + + if (!zrUtil.isArray(item) + && (mlType === 'min' || mlType === 'max' || mlType === 'average') + ) { + var axisInfo = markerHelper.getAxisInfo(item, data, coordSys, seriesModel); + + var baseAxisKey = axisInfo.baseAxis.dim + 'Axis'; + var valueAxisKey = axisInfo.valueAxis.dim + 'Axis'; + var baseScaleExtent = axisInfo.baseAxis.scale.getExtent(); + + var mlFrom = zrUtil.clone(item); + var mlTo = {}; + + mlFrom.type = null; + + // FIXME Polar should use circle + mlFrom[baseAxisKey] = baseScaleExtent[0]; + mlTo[baseAxisKey] = baseScaleExtent[1]; + + var value = markerHelper.numCalculate(data, axisInfo.valueDataDim, mlType); + + // Round if axis is cateogry + value = axisInfo.valueAxis.coordToData(axisInfo.valueAxis.dataToCoord(value)); + + var precision = mlModel.get('precision'); + if (precision >= 0) { + value = +value.toFixed(precision); + } + + mlFrom[valueAxisKey] = mlTo[valueAxisKey] = value; + + item = [mlFrom, mlTo, { // Extra option for tooltip and label + type: mlType, + valueIndex: item.valueIndex, + // Force to use the value of calculated value. + value: value + }]; + } + + item = [ + markerHelper.dataTransform(seriesModel, item[0]), + markerHelper.dataTransform(seriesModel, item[1]), + zrUtil.extend({}, item[2]) + ]; + + // Avoid line data type is extended by from(to) data type + item[2].type = item[2].type || ''; + + // Merge from option and to option into line option + zrUtil.merge(item[2], item[0]); + zrUtil.merge(item[2], item[1]); + + return item; + }; + + function markLineFilter(coordSys, item) { + return markerHelper.dataFilter(coordSys, item[0]) + && markerHelper.dataFilter(coordSys, item[1]); + } + + function updateSingleMarkerEndLayout( + data, idx, isFrom, mlType, valueIndex, seriesModel, api + ) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + + var point; + var xPx = itemModel.get('x'); + var yPx = itemModel.get('y'); + if (xPx != null && yPx != null) { + point = [ + numberUtil.parsePercent(xPx, api.getWidth()), + numberUtil.parsePercent(yPx, api.getHeight()) + ]; + } + else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition( + data.getValues(data.dimensions, idx) + ); + } + else { + var dims = coordSys.dimensions; + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + point = coordSys.dataToPoint([x, y]); + } + // Expand min, max, average line to the edge of grid + // FIXME Glue code + if (mlType && coordSys.type === 'cartesian2d') { + var mlOnAxis = valueIndex != null + ? coordSys.getAxis(valueIndex === 1 ? 'x' : 'y') + : coordSys.getAxesByScale('ordinal')[0]; + if (mlOnAxis && mlOnAxis.onBand) { + point[mlOnAxis.dim === 'x' ? 0 : 1] = + mlOnAxis.toGlobalCoord(mlOnAxis.getExtent()[isFrom ? 0 : 1]); + } + } + } + + data.setItemLayout(idx, point); + } + + var markLineFormatMixin = { + formatTooltip: function (dataIndex) { + var data = this._data; + var value = this.getRawValue(dataIndex); + var formattedValue = zrUtil.isArray(value) + ? zrUtil.map(value, addCommas).join(', ') : addCommas(value); + var name = data.getName(dataIndex); + return this.name + '
            ' + + ((name ? encodeHTML(name) + ' : ' : '') + formattedValue); + }, + + getRawDataArray: function () { + return this.option.data; + }, + + getData: function () { + return this._data; + }, + + setData: function (data) { + this._data = data; + } + }; + + zrUtil.defaults(markLineFormatMixin, modelUtil.dataFormatMixin); + + __webpack_require__(1).extendComponentView({ + + type: 'markLine', + + init: function () { + /** + * Markline grouped by series + * @private + * @type {Object} + */ + this._markLineMap = {}; + }, + + render: function (markLineModel, ecModel, api) { + var lineDrawMap = this._markLineMap; + for (var name in lineDrawMap) { + lineDrawMap[name].__keep = false; + } + + ecModel.eachSeries(function (seriesModel) { + var mlModel = seriesModel.markLineModel; + mlModel && this._renderSeriesML(seriesModel, mlModel, ecModel, api); + }, this); + + for (var name in lineDrawMap) { + if (!lineDrawMap[name].__keep) { + this.group.remove(lineDrawMap[name].group); + } + } + }, + + updateLayout: function (markLineModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mlModel = seriesModel.markLineModel; + if (mlModel) { + var mlData = mlModel.getData(); + var fromData = mlModel.__from; + var toData = mlModel.__to; + // Update visual and layout of from symbol and to symbol + fromData.each(function (idx) { + var lineModel = mlData.getItemModel(idx); + var mlType = lineModel.get('type'); + var valueIndex = lineModel.get('valueIndex'); + updateSingleMarkerEndLayout(fromData, idx, true, mlType, valueIndex, seriesModel, api); + updateSingleMarkerEndLayout(toData, idx, false, mlType, valueIndex, seriesModel, api); + }); + // Update layout of line + mlData.each(function (idx) { + mlData.setItemLayout(idx, [ + fromData.getItemLayout(idx), + toData.getItemLayout(idx) + ]); + }); + + this._markLineMap[seriesModel.name].updateLayout(); + } + }, this); + }, + + _renderSeriesML: function (seriesModel, mlModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesName = seriesModel.name; + var seriesData = seriesModel.getData(); + + var lineDrawMap = this._markLineMap; + var lineDraw = lineDrawMap[seriesName]; + if (!lineDraw) { + lineDraw = lineDrawMap[seriesName] = new LineDraw(); + } + this.group.add(lineDraw.group); + + var mlData = createList(coordSys, seriesModel, mlModel); + + var fromData = mlData.from; + var toData = mlData.to; + var lineData = mlData.line; + + mlModel.__from = fromData; + mlModel.__to = toData; + // Line data for tooltip and formatter + zrUtil.extend(mlModel, markLineFormatMixin); + mlModel.setData(lineData); + + var symbolType = mlModel.get('symbol'); + var symbolSize = mlModel.get('symbolSize'); + if (!zrUtil.isArray(symbolType)) { + symbolType = [symbolType, symbolType]; + } + if (typeof symbolSize === 'number') { + symbolSize = [symbolSize, symbolSize]; + } + + // Update visual and layout of from symbol and to symbol + mlData.from.each(function (idx) { + var lineModel = lineData.getItemModel(idx); + var mlType = lineModel.get('type'); + var valueIndex = lineModel.get('valueIndex'); + updateDataVisualAndLayout(fromData, idx, true, mlType, valueIndex); + updateDataVisualAndLayout(toData, idx, false, mlType, valueIndex); + }); + + // Update visual and layout of line + lineData.each(function (idx) { + var lineColor = lineData.getItemModel(idx).get('lineStyle.normal.color'); + lineData.setItemVisual(idx, { + color: lineColor || fromData.getItemVisual(idx, 'color') + }); + lineData.setItemLayout(idx, [ + fromData.getItemLayout(idx), + toData.getItemLayout(idx) + ]); + }); + + lineDraw.updateData(lineData, fromData, toData); + + // Set host model for tooltip + // FIXME + mlData.line.eachItemGraphicEl(function (el, idx) { + el.traverse(function (child) { + child.dataModel = mlModel; + }); + }); + + function updateDataVisualAndLayout(data, idx, isFrom, mlType, valueIndex) { + var itemModel = data.getItemModel(idx); + + updateSingleMarkerEndLayout( + data, idx, isFrom, mlType, valueIndex, seriesModel, api + ); + + data.setItemVisual(idx, { + symbolSize: itemModel.get('symbolSize') + || symbolSize[isFrom ? 0 : 1], + symbol: itemModel.get('symbol', true) + || symbolType[isFrom ? 0 : 1], + color: itemModel.get('itemStyle.normal.color') + || seriesData.getVisual('color') + }); + } + + lineDraw.__keep = true; + } + }); + + /** + * @inner + * @param {module:echarts/coord/*} coordSys + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Model} mpModel + */ + function createList(coordSys, seriesModel, mlModel) { + + var coordDimsInfos; + if (coordSys) { + coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo( + seriesModel.coordDimToDataDim(coordDim)[0] + ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + info.name = coordDim; + return info; + }); + } + else { + coordDimsInfos =[{ + name: 'value', + type: 'float' + }]; + } + + var fromData = new List(coordDimsInfos, mlModel); + var toData = new List(coordDimsInfos, mlModel); + // No dimensions + var lineData = new List([], mlModel); + + var optData = zrUtil.map(mlModel.get('data'), zrUtil.curry( + markLineTransform, seriesModel, coordSys, mlModel + )); + if (coordSys) { + optData = zrUtil.filter( + optData, zrUtil.curry(markLineFilter, coordSys) + ); + } + var dimValueGetter = coordSys ? markerHelper.dimValueGetter : function (item) { + return item.value; + }; + fromData.initData( + zrUtil.map(optData, function (item) { return item[0]; }), + null, dimValueGetter + ); + toData.initData( + zrUtil.map(optData, function (item) { return item[1]; }), + null, dimValueGetter + ); + lineData.initData( + zrUtil.map(optData, function (item) { return item[2]; }) + ); + return { + from: fromData, + to: toData, + line: lineData + }; + } + + +/***/ }, +/* 322 */, +/* 323 */, +/* 324 */, +/* 325 */, +/* 326 */, +/* 327 */, +/* 328 */, +/* 329 */, +/* 330 */, +/* 331 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(332); + __webpack_require__(334); + + __webpack_require__(336); + __webpack_require__(337); + __webpack_require__(338); + __webpack_require__(339); + __webpack_require__(344); + + +/***/ }, +/* 332 */ +/***/ function(module, exports, __webpack_require__) { + + + + var featureManager = __webpack_require__(333); + var zrUtil = __webpack_require__(3); + + var ToolboxModel = __webpack_require__(1).extendComponentModel({ + + type: 'toolbox', + + layoutMode: { + type: 'box', + ignoreSize: true + }, + + mergeDefaultAndTheme: function (option) { + ToolboxModel.superApply(this, 'mergeDefaultAndTheme', arguments); + + zrUtil.each(this.option.feature, function (featureOpt, featureName) { + var Feature = featureManager.get(featureName); + Feature && zrUtil.merge(featureOpt, Feature.defaultOption); + }); + }, + + defaultOption: { + + show: true, + + z: 6, + + zlevel: 0, + + orient: 'horizontal', + + left: 'right', + + top: 'top', + + // right + // bottom + + backgroundColor: 'transparent', + + borderColor: '#ccc', + + borderWidth: 0, + + padding: 5, + + itemSize: 15, + + itemGap: 8, + + showTitle: true, + + iconStyle: { + normal: { + borderColor: '#666', + color: 'none' + }, + emphasis: { + borderColor: '#3E98C5' + } + } + // textStyle: {}, + + // feature + } + }); + + module.exports = ToolboxModel; + + +/***/ }, +/* 333 */ +/***/ function(module, exports) { + + 'use strict'; + + + var features = {}; + + module.exports = { + register: function (name, ctor) { + features[name] = ctor; + }, + + get: function (name) { + return features[name]; + } + }; + + +/***/ }, +/* 334 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) { + + var featureManager = __webpack_require__(333); + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var Model = __webpack_require__(8); + var DataDiffer = __webpack_require__(95); + var listComponentHelper = __webpack_require__(266); + var textContain = __webpack_require__(14); + + module.exports = __webpack_require__(1).extendComponentView({ + + type: 'toolbox', + + render: function (toolboxModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + if (!toolboxModel.get('show')) { + return; + } + + var itemSize = +toolboxModel.get('itemSize'); + var featureOpts = toolboxModel.get('feature') || {}; + var features = this._features || (this._features = {}); + + var featureNames = []; + zrUtil.each(featureOpts, function (opt, name) { + featureNames.push(name); + }); + + (new DataDiffer(this._featureNames || [], featureNames)) + .add(process) + .update(process) + .remove(zrUtil.curry(process, null)) + .execute(); + + // Keep for diff. + this._featureNames = featureNames; + + function process(newIndex, oldIndex) { + var featureName = featureNames[newIndex]; + var oldName = featureNames[oldIndex]; + var featureOpt = featureOpts[featureName]; + var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); + var feature; + + if (featureName && !oldName) { // Create + if (isUserFeatureName(featureName)) { + feature = { + model: featureModel, + onclick: featureModel.option.onclick, + featureName: featureName + }; + } + else { + var Feature = featureManager.get(featureName); + if (!Feature) { + return; + } + feature = new Feature(featureModel); + } + features[featureName] = feature; + } + else { + feature = features[oldName]; + // If feature does not exsit. + if (!feature) { + return; + } + feature.model = featureModel; + } + + if (!featureName && oldName) { + feature.dispose && feature.dispose(ecModel, api); + return; + } + + if (!featureModel.get('show') || feature.unusable) { + feature.remove && feature.remove(ecModel, api); + return; + } + + createIconPaths(featureModel, feature, featureName); + + featureModel.setIconStatus = function (iconName, status) { + var option = this.option; + var iconPaths = this.iconPaths; + option.iconStatus = option.iconStatus || {}; + option.iconStatus[iconName] = status; + // FIXME + iconPaths[iconName] && iconPaths[iconName].trigger(status); + }; + + if (feature.render) { + feature.render(featureModel, ecModel, api); + } + } + + function createIconPaths(featureModel, feature, featureName) { + var iconStyleModel = featureModel.getModel('iconStyle'); + + // If one feature has mutiple icon. they are orginaized as + // { + // icon: { + // foo: '', + // bar: '' + // }, + // title: { + // foo: '', + // bar: '' + // } + // } + var icons = feature.getIcons ? feature.getIcons() : featureModel.get('icon'); + var titles = featureModel.get('title') || {}; + if (typeof icons === 'string') { + var icon = icons; + var title = titles; + icons = {}; + titles = {}; + icons[featureName] = icon; + titles[featureName] = title; + } + var iconPaths = featureModel.iconPaths = {}; + zrUtil.each(icons, function (icon, iconName) { + var normalStyle = iconStyleModel.getModel('normal').getItemStyle(); + var hoverStyle = iconStyleModel.getModel('emphasis').getItemStyle(); + + var style = { + x: -itemSize / 2, + y: -itemSize / 2, + width: itemSize, + height: itemSize + }; + var path = icon.indexOf('image://') === 0 + ? ( + style.image = icon.slice(8), + new graphic.Image({style: style}) + ) + : graphic.makePath( + icon.replace('path://', ''), + { + style: normalStyle, + hoverStyle: hoverStyle, + rectHover: true + }, + style, + 'center' + ); + + graphic.setHoverStyle(path); + + if (toolboxModel.get('showTitle')) { + path.__title = titles[iconName]; + path.on('mouseover', function () { + path.setStyle({ + text: titles[iconName], + textPosition: hoverStyle.textPosition || 'bottom', + textFill: hoverStyle.fill || hoverStyle.stroke || '#000', + textAlign: hoverStyle.textAlign || 'center' + }); + }) + .on('mouseout', function () { + path.setStyle({ + textFill: null + }); + }); + } + path.trigger(featureModel.get('iconStatus.' + iconName) || 'normal'); + + group.add(path); + path.on('click', zrUtil.bind( + feature.onclick, feature, ecModel, api, iconName + )); + + iconPaths[iconName] = path; + }); + } + + listComponentHelper.layout(group, toolboxModel, api); + // Render background after group is layout + // FIXME + listComponentHelper.addBackground(group, toolboxModel); + + // Adjust icon title positions to avoid them out of screen + group.eachChild(function (icon) { + var titleText = icon.__title; + var hoverStyle = icon.hoverStyle; + // May be background element + if (hoverStyle && titleText) { + var rect = textContain.getBoundingRect( + titleText, hoverStyle.font + ); + var offsetX = icon.position[0] + group.position[0]; + var offsetY = icon.position[1] + group.position[1] + itemSize; + + var needPutOnTop = false; + if (offsetY + rect.height > api.getHeight()) { + hoverStyle.textPosition = 'top'; + needPutOnTop = true; + } + var topOffset = needPutOnTop ? (-5 - rect.height) : (itemSize + 8); + if (offsetX + rect.width / 2 > api.getWidth()) { + hoverStyle.textPosition = ['100%', topOffset]; + hoverStyle.textAlign = 'right'; + } + else if (offsetX - rect.width / 2 < 0) { + hoverStyle.textPosition = [0, topOffset]; + hoverStyle.textAlign = 'left'; + } + } + }); + }, + + remove: function (ecModel, api) { + zrUtil.each(this._features, function (feature) { + feature.remove && feature.remove(ecModel, api); + }); + this.group.removeAll(); + }, + + dispose: function (ecModel, api) { + zrUtil.each(this._features, function (feature) { + feature.dispose && feature.dispose(ecModel, api); + }); + } + }); + + function isUserFeatureName(featureName) { + return featureName.indexOf('my') === 0; + } + + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(335))) + +/***/ }, +/* 335 */ +/***/ function(module, exports) { + + // shim for using process in browser + + var process = module.exports = {}; + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } + }; + + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { return '/' }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function() { return 0; }; + + +/***/ }, +/* 336 */ +/***/ function(module, exports, __webpack_require__) { + + + + var env = __webpack_require__(78); + + function SaveAsImage (model) { + this.model = model; + } + + SaveAsImage.defaultOption = { + show: true, + icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0', + title: '保存为图片', + type: 'png', + // Default use option.backgroundColor + // backgroundColor: '#fff', + name: '', + excludeComponents: ['toolbox'], + pixelRatio: 1, + lang: ['右键另存为图片'] + }; + + SaveAsImage.prototype.unusable = !env.canvasSupported; + + var proto = SaveAsImage.prototype; + + proto.onclick = function (ecModel, api) { + var model = this.model; + var title = model.get('name') || ecModel.get('title.0.text') || 'echarts'; + var $a = document.createElement('a'); + var type = model.get('type', true) || 'png'; + $a.download = title + '.' + type; + $a.target = '_blank'; + var url = api.getConnectedDataURL({ + type: type, + backgroundColor: model.get('backgroundColor', true) + || ecModel.get('backgroundColor') || '#fff', + excludeComponents: model.get('excludeComponents'), + pixelRatio: model.get('pixelRatio') + }); + $a.href = url; + // Chrome and Firefox + if (typeof MouseEvent === 'function') { + var evt = new MouseEvent('click', { + view: window, + bubbles: true, + cancelable: false + }); + $a.dispatchEvent(evt); + } + // IE + else { + var lang = model.get('lang'); + var html = '' + + '' + + '' + + ''; + var tab = window.open(); + tab.document.write(html); + } + }; + + __webpack_require__(333).register( + 'saveAsImage', SaveAsImage + ); + + module.exports = SaveAsImage; + + +/***/ }, +/* 337 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + function MagicType(model) { + this.model = model; + } + + MagicType.defaultOption = { + show: true, + type: [], + // Icon group + icon: { + line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4', + bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7', + stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z', // jshint ignore:line + tiled: 'M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z' + }, + title: { + line: '切换为折线图', + bar: '切换为柱状图', + stack: '切换为堆叠', + tiled: '切换为平铺' + }, + option: {}, + seriesIndex: {} + }; + + var proto = MagicType.prototype; + + proto.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon'); + var icons = {}; + zrUtil.each(model.get('type'), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + var seriesOptGenreator = { + 'line': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'bar') { + return zrUtil.merge({ + id: seriesId, + type: 'line', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get('option.line') || {}, true); + } + }, + 'bar': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line') { + return zrUtil.merge({ + id: seriesId, + type: 'bar', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get('option.bar') || {}, true); + } + }, + 'stack': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line' || seriesType === 'bar') { + return zrUtil.merge({ + id: seriesId, + stack: '__ec_magicType_stack__' + }, model.get('option.stack') || {}, true); + } + }, + 'tiled': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line' || seriesType === 'bar') { + return zrUtil.merge({ + id: seriesId, + stack: '' + }, model.get('option.tiled') || {}, true); + } + } + }; + + var radioTypes = [ + ['line', 'bar'], + ['stack', 'tiled'] + ]; + + proto.onclick = function (ecModel, api, type) { + var model = this.model; + var seriesIndex = model.get('seriesIndex.' + type); + // Not supported magicType + if (!seriesOptGenreator[type]) { + return; + } + var newOption = { + series: [] + }; + var generateNewSeriesTypes = function (seriesModel) { + var seriesType = seriesModel.subType; + var seriesId = seriesModel.id; + var newSeriesOpt = seriesOptGenreator[type]( + seriesType, seriesId, seriesModel, model + ); + if (newSeriesOpt) { + // PENDING If merge original option? + zrUtil.defaults(newSeriesOpt, seriesModel.option); + newOption.series.push(newSeriesOpt); + } + // Modify boundaryGap + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + if (categoryAxis) { + var axisDim = categoryAxis.dim; + var axisIndex = seriesModel.get(axisDim + 'AxisIndex'); + var axisKey = axisDim + 'Axis'; + newOption[axisKey] = newOption[axisKey] || []; + for (var i = 0; i <= axisIndex; i++) { + newOption[axisKey][axisIndex] = newOption[axisKey][axisIndex] || {}; + } + newOption[axisKey][axisIndex].boundaryGap = type === 'bar' ? true : false; + } + } + }; + + zrUtil.each(radioTypes, function (radio) { + if (zrUtil.indexOf(radio, type) >= 0) { + zrUtil.each(radio, function (item) { + model.setIconStatus(item, 'normal'); + }); + } + }); + + model.setIconStatus(type, 'emphasis'); + + ecModel.eachComponent( + { + mainType: 'series', + query: seriesIndex == null ? null : { + seriesIndex: seriesIndex + } + }, generateNewSeriesTypes + ); + api.dispatchAction({ + type: 'changeMagicType', + currentType: type, + newOption: newOption + }); + }; + + var echarts = __webpack_require__(1); + echarts.registerAction({ + type: 'changeMagicType', + event: 'magicTypeChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.mergeOption(payload.newOption); + }); + + __webpack_require__(333).register('magicType', MagicType); + + module.exports = MagicType; + + +/***/ }, +/* 338 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/component/toolbox/feature/DataView + */ + + + + var zrUtil = __webpack_require__(3); + var eventTool = __webpack_require__(80); + + + var BLOCK_SPLITER = new Array(60).join('-'); + var ITEM_SPLITER = '\t'; + /** + * Group series into two types + * 1. on category axis, like line, bar + * 2. others, like scatter, pie + * @param {module:echarts/model/Global} ecModel + * @return {Object} + * @inner + */ + function groupSeries(ecModel) { + var seriesGroupByCategoryAxis = {}; + var otherSeries = []; + var meta = []; + ecModel.eachRawSeries(function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) { + var baseAxis = coordSys.getBaseAxis(); + if (baseAxis.type === 'category') { + var key = baseAxis.dim + '_' + baseAxis.index; + if (!seriesGroupByCategoryAxis[key]) { + seriesGroupByCategoryAxis[key] = { + categoryAxis: baseAxis, + valueAxis: coordSys.getOtherAxis(baseAxis), + series: [] + }; + meta.push({ + axisDim: baseAxis.dim, + axisIndex: baseAxis.index + }); + } + seriesGroupByCategoryAxis[key].series.push(seriesModel); + } + else { + otherSeries.push(seriesModel); + } + } + else { + otherSeries.push(seriesModel); + } + }); + + return { + seriesGroupByCategoryAxis: seriesGroupByCategoryAxis, + other: otherSeries, + meta: meta + }; + } + + /** + * Assemble content of series on cateogory axis + * @param {Array.} series + * @return {string} + * @inner + */ + function assembleSeriesWithCategoryAxis(series) { + var tables = []; + zrUtil.each(series, function (group, key) { + var categoryAxis = group.categoryAxis; + var valueAxis = group.valueAxis; + var valueAxisDim = valueAxis.dim; + + var headers = [' '].concat(zrUtil.map(group.series, function (series) { + return series.name; + })); + var columns = [categoryAxis.model.getCategories()]; + zrUtil.each(group.series, function (series) { + columns.push(series.getRawData().mapArray(valueAxisDim, function (val) { + return val; + })); + }); + // Assemble table content + var lines = [headers.join(ITEM_SPLITER)]; + for (var i = 0; i < columns[0].length; i++) { + var items = []; + for (var j = 0; j < columns.length; j++) { + items.push(columns[j][i]); + } + lines.push(items.join(ITEM_SPLITER)); + } + tables.push(lines.join('\n')); + }); + return tables.join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + + /** + * Assemble content of other series + * @param {Array.} series + * @return {string} + * @inner + */ + function assembleOtherSeries(series) { + return zrUtil.map(series, function (series) { + var data = series.getRawData(); + var lines = [series.name]; + var vals = []; + data.each(data.dimensions, function () { + var argLen = arguments.length; + var dataIndex = arguments[argLen - 1]; + var name = data.getName(dataIndex); + for (var i = 0; i < argLen - 1; i++) { + vals[i] = arguments[i]; + } + lines.push((name ? (name + ITEM_SPLITER) : '') + vals.join(ITEM_SPLITER)); + }); + return lines.join('\n'); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + + /** + * @param {module:echarts/model/Global} + * @return {string} + * @inner + */ + function getContentFromModel(ecModel) { + + var result = groupSeries(ecModel); + + return { + value: zrUtil.filter([ + assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), + assembleOtherSeries(result.other) + ], function (str) { + return str.replace(/[\n\t\s]/g, ''); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'), + + meta: result.meta + }; + } + + + function trim(str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + /** + * If a block is tsv format + */ + function isTSVFormat(block) { + // Simple method to find out if a block is tsv format + var firstLine = block.slice(0, block.indexOf('\n')); + if (firstLine.indexOf(ITEM_SPLITER) >= 0) { + return true; + } + } + + var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g'); + /** + * @param {string} tsv + * @return {Array.} + */ + function parseTSVContents(tsv) { + var tsvLines = tsv.split(/\n+/g); + var headers = trim(tsvLines.shift()).split(itemSplitRegex); + + var categories = []; + var series = zrUtil.map(headers, function (header) { + return { + name: header, + data: [] + }; + }); + for (var i = 0; i < tsvLines.length; i++) { + var items = trim(tsvLines[i]).split(itemSplitRegex); + categories.push(items.shift()); + for (var j = 0; j < items.length; j++) { + series[j] && (series[j].data[i] = items[j]); + } + } + return { + series: series, + categories: categories + }; + } + + /** + * @param {string} str + * @return {Array.} + * @inner + */ + function parseListContents(str) { + var lines = str.split(/\n+/g); + var seriesName = trim(lines.shift()); + + var data = []; + for (var i = 0; i < lines.length; i++) { + var items = trim(lines[i]).split(itemSplitRegex); + var name = ''; + var value; + var hasName = false; + if (isNaN(items[0])) { // First item is name + hasName = true; + name = items[0]; + items = items.slice(1); + data[i] = { + name: name, + value: [] + }; + value = data[i].value; + } + else { + value = data[i] = []; + } + for (var j = 0; j < items.length; j++) { + value.push(+items[j]); + } + if (value.length === 1) { + hasName ? (data[i].value = value[0]) : (data[i] = value[0]); + } + } + + return { + name: seriesName, + data: data + }; + } + + /** + * @param {string} str + * @param {Array.} blockMetaList + * @return {Object} + * @inner + */ + function parseContents(str, blockMetaList) { + var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g')); + var newOption = { + series: [] + }; + zrUtil.each(blocks, function (block, idx) { + if (isTSVFormat(block)) { + var result = parseTSVContents(block); + var blockMeta = blockMetaList[idx]; + var axisKey = blockMeta.axisDim + 'Axis'; + + if (blockMeta) { + newOption[axisKey] = newOption[axisKey] || []; + newOption[axisKey][blockMeta.axisIndex] = { + data: result.categories + }; + newOption.series = newOption.series.concat(result.series); + } + } + else { + var result = parseListContents(block); + newOption.series.push(result); + } + }); + return newOption; + } + + /** + * @alias {module:echarts/component/toolbox/feature/DataView} + * @constructor + * @param {module:echarts/model/Model} model + */ + function DataView(model) { + + this._dom = null; + + this.model = model; + } + + DataView.defaultOption = { + show: true, + readOnly: false, + optionToContent: null, + contentToOption: null, + + icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28', + title: '数据视图', + lang: ['数据视图', '关闭', '刷新'], + backgroundColor: '#fff', + textColor: '#000', + textareaColor: '#fff', + textareaBorderColor: '#333', + buttonColor: '#c23531', + buttonTextColor: '#fff' + }; + + DataView.prototype.onclick = function (ecModel, api) { + var container = api.getDom(); + var model = this.model; + if (this._dom) { + container.removeChild(this._dom); + } + var root = document.createElement('div'); + root.style.cssText = 'position:absolute;left:5px;top:5px;bottom:5px;right:5px;'; + root.style.backgroundColor = model.get('backgroundColor') || '#fff'; + + // Create elements + var header = document.createElement('h4'); + var lang = model.get('lang') || []; + header.innerHTML = lang[0] || model.get('title'); + header.style.cssText = 'margin: 10px 20px;'; + header.style.color = model.get('textColor'); + + var viewMain = document.createElement('div'); + var textarea = document.createElement('textarea'); + viewMain.style.cssText = 'display:block;width:100%;overflow:hidden;'; + + var optionToContent = model.get('optionToContent'); + var contentToOption = model.get('contentToOption'); + var result = getContentFromModel(ecModel); + if (typeof optionToContent === 'function') { + var htmlOrDom = optionToContent(api.getOption()); + if (typeof htmlOrDom === 'string') { + viewMain.innerHTML = htmlOrDom; + } + else if (zrUtil.isDom(htmlOrDom)) { + viewMain.appendChild(htmlOrDom); + } + } + else { + // Use default textarea + viewMain.appendChild(textarea); + textarea.readOnly = model.get('readOnly'); + textarea.style.cssText = 'width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;'; + textarea.style.color = model.get('textColor'); + textarea.style.borderColor = model.get('textareaBorderColor'); + textarea.style.backgroundColor = model.get('textareaColor'); + textarea.value = result.value; + } + + var blockMetaList = result.meta; + + var buttonContainer = document.createElement('div'); + buttonContainer.style.cssText = 'position:absolute;bottom:0;left:0;right:0;'; + + var buttonStyle = 'float:right;margin-right:20px;border:none;' + + 'cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px'; + var closeButton = document.createElement('div'); + var refreshButton = document.createElement('div'); + + buttonStyle += ';background-color:' + model.get('buttonColor'); + buttonStyle += ';color:' + model.get('buttonTextColor'); + + var self = this; + + function close() { + container.removeChild(root); + self._dom = null; + } + eventTool.addEventListener(closeButton, 'click', close); + + eventTool.addEventListener(refreshButton, 'click', function () { + var newOption; + try { + if (typeof contentToOption === 'function') { + newOption = contentToOption(viewMain, api.getOption()); + } + else { + newOption = parseContents(textarea.value, blockMetaList); + } + } + catch (e) { + close(); + throw new Error('Data view format error ' + e); + } + if (newOption) { + api.dispatchAction({ + type: 'changeDataView', + newOption: newOption + }); + } + + close(); + }); + + closeButton.innerHTML = lang[1]; + refreshButton.innerHTML = lang[2]; + refreshButton.style.cssText = buttonStyle; + closeButton.style.cssText = buttonStyle; + + !model.get('readOnly') && buttonContainer.appendChild(refreshButton); + buttonContainer.appendChild(closeButton); + + // http://stackoverflow.com/questions/6637341/use-tab-to-indent-in-textarea + eventTool.addEventListener(textarea, 'keydown', function (e) { + if ((e.keyCode || e.which) === 9) { + // get caret position/selection + var val = this.value; + var start = this.selectionStart; + var end = this.selectionEnd; + + // set textarea value to: text before caret + tab + text after caret + this.value = val.substring(0, start) + ITEM_SPLITER + val.substring(end); + + // put caret at right position again + this.selectionStart = this.selectionEnd = start + 1; + + // prevent the focus lose + eventTool.stop(e); + } + }); + + root.appendChild(header); + root.appendChild(viewMain); + root.appendChild(buttonContainer); + + viewMain.style.height = (container.clientHeight - 80) + 'px'; + + container.appendChild(root); + this._dom = root; + }; + + DataView.prototype.remove = function (ecModel, api) { + this._dom && api.getDom().removeChild(this._dom); + }; + + DataView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); + }; + + /** + * @inner + */ + function tryMergeDataOption(newData, originalData) { + return zrUtil.map(newData, function (newVal, idx) { + var original = originalData && originalData[idx]; + if (zrUtil.isObject(original) && !zrUtil.isArray(original)) { + if (zrUtil.isObject(newVal) && !zrUtil.isArray(newVal)) { + newVal = newVal.value; + } + // Original data has option + return zrUtil.defaults({ + value: newVal + }, original); + } + else { + return newVal; + } + }); + } + + __webpack_require__(333).register('dataView', DataView); + + __webpack_require__(1).registerAction({ + type: 'changeDataView', + event: 'dataViewChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + var newSeriesOptList = []; + zrUtil.each(payload.newOption.series, function (seriesOpt) { + var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; + if (!seriesModel) { + // New created series + // Geuss the series type + newSeriesOptList.push(zrUtil.extend({ + // Default is scatter + type: 'scatter' + }, seriesOpt)); + } + else { + var originalData = seriesModel.get('data'); + newSeriesOptList.push({ + name: seriesOpt.name, + data: tryMergeDataOption(seriesOpt.data, originalData) + }); + } + }); + + ecModel.mergeOption(zrUtil.defaults({ + series: newSeriesOptList + }, payload.newOption)); + }); + + module.exports = DataView; + + +/***/ }, +/* 339 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var SelectController = __webpack_require__(225); + var BoundingRect = __webpack_require__(15); + var Group = __webpack_require__(29); + var history = __webpack_require__(340); + var interactionMutex = __webpack_require__(160); + + var each = zrUtil.each; + var asc = numberUtil.asc; + + // Use dataZoomSelect + __webpack_require__(341); + + // Spectial component id start with \0ec\0, see echarts/model/Global.js~hasInnerId + var DATA_ZOOM_ID_BASE = '\0_ec_\0toolbox-dataZoom_'; + + function DataZoom(model) { + this.model = model; + + /** + * @private + * @type {module:zrender/container/Group} + */ + this._controllerGroup; + + /** + * @private + * @type {module:echarts/component/helper/SelectController} + */ + this._controller; + + /** + * Is zoom active. + * @private + * @type {Object} + */ + this._isZoomActive; + } + + DataZoom.defaultOption = { + show: true, + // Icon group + icon: { + zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1', + back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26' + }, + title: { + zoom: '区域缩放', + back: '区域缩放还原' + } + }; + + var proto = DataZoom.prototype; + + proto.render = function (featureModel, ecModel, api) { + updateBackBtnStatus(featureModel, ecModel); + }; + + proto.onclick = function (ecModel, api, type) { + var controllerGroup = this._controllerGroup; + if (!this._controllerGroup) { + controllerGroup = this._controllerGroup = new Group(); + api.getZr().add(controllerGroup); + } + + handlers[type].call(this, controllerGroup, this.model, ecModel, api); + }; + + proto.remove = function (ecModel, api) { + this._disposeController(); + interactionMutex.release('globalPan', api.getZr()); + }; + + proto.dispose = function (ecModel, api) { + var zr = api.getZr(); + interactionMutex.release('globalPan', zr); + this._disposeController(); + this._controllerGroup && zr.remove(this._controllerGroup); + }; + + /** + * @private + */ + var handlers = { + + zoom: function (controllerGroup, featureModel, ecModel, api) { + var isZoomActive = this._isZoomActive = !this._isZoomActive; + var zr = api.getZr(); + + interactionMutex[isZoomActive ? 'take' : 'release']('globalPan', zr); + + featureModel.setIconStatus('zoom', isZoomActive ? 'emphasis' : 'normal'); + + if (isZoomActive) { + zr.setDefaultCursorStyle('crosshair'); + + this._createController( + controllerGroup, featureModel, ecModel, api + ); + } + else { + zr.setDefaultCursorStyle('default'); + this._disposeController(); + } + }, + + back: function (controllerGroup, featureModel, ecModel, api) { + this._dispatchAction(history.pop(ecModel), api); + } + }; + + /** + * @private + */ + proto._createController = function ( + controllerGroup, featureModel, ecModel, api + ) { + var controller = this._controller = new SelectController( + 'rect', + api.getZr(), + { + // FIXME + lineWidth: 3, + stroke: '#333', + fill: 'rgba(0,0,0,0.2)' + } + ); + controller.on( + 'selectEnd', + zrUtil.bind( + this._onSelected, this, controller, + featureModel, ecModel, api + ) + ); + controller.enable(controllerGroup, false); + }; + + proto._disposeController = function () { + var controller = this._controller; + if (controller) { + controller.off('selected'); + controller.dispose(); + } + }; + + function prepareCoordInfo(grid, ecModel) { + // Default use the first axis. + // FIXME + var coordInfo = [ + {axisModel: grid.getAxis('x').model, axisIndex: 0}, // x + {axisModel: grid.getAxis('y').model, axisIndex: 0} // y + ]; + coordInfo.grid = grid; + + ecModel.eachComponent( + {mainType: 'dataZoom', subType: 'select'}, + function (dzModel, dataZoomIndex) { + if (isTheAxis('xAxis', coordInfo[0].axisModel, dzModel, ecModel)) { + coordInfo[0].dataZoomModel = dzModel; + } + if (isTheAxis('yAxis', coordInfo[1].axisModel, dzModel, ecModel)) { + coordInfo[1].dataZoomModel = dzModel; + } + } + ); + + return coordInfo; + } + + function isTheAxis(axisName, axisModel, dataZoomModel, ecModel) { + var axisIndex = dataZoomModel.get(axisName + 'Index'); + return axisIndex != null + && ecModel.getComponent(axisName, axisIndex) === axisModel; + } + + /** + * @private + */ + proto._onSelected = function (controller, featureModel, ecModel, api, selRanges) { + if (!selRanges.length) { + return; + } + var selRange = selRanges[0]; + + controller.update(); // remove cover + + var snapshot = {}; + + // FIXME + // polar + + ecModel.eachComponent('grid', function (gridModel, gridIndex) { + var grid = gridModel.coordinateSystem; + var coordInfo = prepareCoordInfo(grid, ecModel); + var selDataRange = pointToDataInCartesian(selRange, coordInfo); + + if (selDataRange) { + var xBatchItem = scaleCartesianAxis(selDataRange, coordInfo, 0, 'x'); + var yBatchItem = scaleCartesianAxis(selDataRange, coordInfo, 1, 'y'); + + xBatchItem && (snapshot[xBatchItem.dataZoomId] = xBatchItem); + yBatchItem && (snapshot[yBatchItem.dataZoomId] = yBatchItem); + } + }, this); + + history.push(ecModel, snapshot); + + this._dispatchAction(snapshot, api); + }; + + function pointToDataInCartesian(selRange, coordInfo) { + var grid = coordInfo.grid; + + var selRect = new BoundingRect( + selRange[0][0], + selRange[1][0], + selRange[0][1] - selRange[0][0], + selRange[1][1] - selRange[1][0] + ); + if (!selRect.intersect(grid.getRect())) { + return; + } + var cartesian = grid.getCartesian(coordInfo[0].axisIndex, coordInfo[1].axisIndex); + var dataLeftTop = cartesian.pointToData([selRange[0][0], selRange[1][0]], true); + var dataRightBottom = cartesian.pointToData([selRange[0][1], selRange[1][1]], true); + + return [ + asc([dataLeftTop[0], dataRightBottom[0]]), // x, using asc to handle inverse + asc([dataLeftTop[1], dataRightBottom[1]]) // y, using asc to handle inverse + ]; + } + + function scaleCartesianAxis(selDataRange, coordInfo, dimIdx, dimName) { + var dimCoordInfo = coordInfo[dimIdx]; + var dataZoomModel = dimCoordInfo.dataZoomModel; + + if (dataZoomModel) { + return { + dataZoomId: dataZoomModel.id, + startValue: selDataRange[dimIdx][0], + endValue: selDataRange[dimIdx][1] + }; + } + } + + /** + * @private + */ + proto._dispatchAction = function (snapshot, api) { + var batch = []; + + each(snapshot, function (batchItem) { + batch.push(batchItem); + }); + + batch.length && api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + batch: zrUtil.clone(batch, true) + }); + }; + + function updateBackBtnStatus(featureModel, ecModel) { + featureModel.setIconStatus( + 'back', + history.count(ecModel) > 1 ? 'emphasis' : 'normal' + ); + } + + + __webpack_require__(333).register('dataZoom', DataZoom); + + + // Create special dataZoom option for select + __webpack_require__(1).registerPreprocessor(function (option) { + if (!option) { + return; + } + + var dataZoomOpts = option.dataZoom || (option.dataZoom = []); + if (!zrUtil.isArray(dataZoomOpts)) { + dataZoomOpts = [dataZoomOpts]; + } + + var toolboxOpt = option.toolbox; + if (toolboxOpt) { + // Assume there is only one toolbox + if (zrUtil.isArray(toolboxOpt)) { + toolboxOpt = toolboxOpt[0]; + } + + if (toolboxOpt && toolboxOpt.feature) { + var dataZoomOpt = toolboxOpt.feature.dataZoom; + addForAxis('xAxis', dataZoomOpt); + addForAxis('yAxis', dataZoomOpt); + } + } + + function addForAxis(axisName, dataZoomOpt) { + if (!dataZoomOpt) { + return; + } + + var axisIndicesName = axisName + 'Index'; + var givenAxisIndices = dataZoomOpt[axisIndicesName]; + if (givenAxisIndices != null && !zrUtil.isArray(givenAxisIndices)) { + givenAxisIndices = givenAxisIndices === false ? [] : [givenAxisIndices]; + } + + forEachComponent(axisName, function (axisOpt, axisIndex) { + if (givenAxisIndices != null + && zrUtil.indexOf(givenAxisIndices, axisIndex) === -1 + ) { + return; + } + var newOpt = { + type: 'select', + $fromToolbox: true, + // Id for merge mapping. + id: DATA_ZOOM_ID_BASE + axisName + axisIndex + }; + // FIXME + // Only support one axis now. + newOpt[axisIndicesName] = axisIndex; + dataZoomOpts.push(newOpt); + }); + } + + function forEachComponent(mainType, cb) { + var opts = option[mainType]; + if (!zrUtil.isArray(opts)) { + opts = opts ? [opts] : []; + } + each(opts, cb); + } + }); + + module.exports = DataZoom; + + +/***/ }, +/* 340 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file History manager. + */ + + + var zrUtil = __webpack_require__(3); + var each = zrUtil.each; + + var ATTR = '\0_ec_hist_store'; + + var history = { + + /** + * @public + * @param {module:echarts/model/Global} ecModel + * @param {Object} newSnapshot {dataZoomId, batch: [payloadInfo, ...]} + */ + push: function (ecModel, newSnapshot) { + var store = giveStore(ecModel); + + // If previous dataZoom can not be found, + // complete an range with current range. + each(newSnapshot, function (batchItem, dataZoomId) { + var i = store.length - 1; + for (; i >= 0; i--) { + var snapshot = store[i]; + if (snapshot[dataZoomId]) { + break; + } + } + if (i < 0) { + // No origin range set, create one by current range. + var dataZoomModel = ecModel.queryComponents( + {mainType: 'dataZoom', subType: 'select', id: dataZoomId} + )[0]; + if (dataZoomModel) { + var percentRange = dataZoomModel.getPercentRange(); + store[0][dataZoomId] = { + dataZoomId: dataZoomId, + start: percentRange[0], + end: percentRange[1] + }; + } + } + }); + + store.push(newSnapshot); + }, + + /** + * @public + * @param {module:echarts/model/Global} ecModel + * @return {Object} snapshot + */ + pop: function (ecModel) { + var store = giveStore(ecModel); + var head = store[store.length - 1]; + store.length > 1 && store.pop(); + + // Find top for all dataZoom. + var snapshot = {}; + each(head, function (batchItem, dataZoomId) { + for (var i = store.length - 1; i >= 0; i--) { + var batchItem = store[i][dataZoomId]; + if (batchItem) { + snapshot[dataZoomId] = batchItem; + break; + } + } + }); + + return snapshot; + }, + + /** + * @public + */ + clear: function (ecModel) { + ecModel[ATTR] = null; + }, + + /** + * @public + * @param {module:echarts/model/Global} ecModel + * @return {number} records. always >= 1. + */ + count: function (ecModel) { + return giveStore(ecModel).length; + } + + }; + + /** + * [{key: dataZoomId, value: {dataZoomId, range}}, ...] + * History length of each dataZoom may be different. + * this._history[0] is used to store origin range. + * @type {Array.} + */ + function giveStore(ecModel) { + var store = ecModel[ATTR]; + if (!store) { + store = ecModel[ATTR] = [{}]; + } + return store; + } + + module.exports = history; + + + +/***/ }, +/* 341 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * DataZoom component entry + */ + + + __webpack_require__(287); + + __webpack_require__(288); + __webpack_require__(290); + + __webpack_require__(342); + __webpack_require__(343); + + __webpack_require__(298); + __webpack_require__(299); + + + +/***/ }, +/* 342 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + var DataZoomModel = __webpack_require__(288); + + module.exports = DataZoomModel.extend({ + + type: 'dataZoom.select' + + }); + + + +/***/ }, +/* 343 */ +/***/ function(module, exports, __webpack_require__) { + + + + module.exports = __webpack_require__(290).extend({ + + type: 'dataZoom.select' + + }); + + + +/***/ }, +/* 344 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var history = __webpack_require__(340); + + function Restore(model) { + this.model = model; + } + + Restore.defaultOption = { + show: true, + icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5', + title: '还原' + }; + + var proto = Restore.prototype; + + proto.onclick = function (ecModel, api, type) { + history.clear(ecModel); + + api.dispatchAction({ + type: 'restore', + from: this.uid + }); + }; + + + __webpack_require__(333).register('restore', Restore); + + + __webpack_require__(1).registerAction( + {type: 'restore', event: 'restore', update: 'prepareAndUpdate'}, + function (payload, ecModel) { + ecModel.resetOption('recreate'); + } + ); + + module.exports = Restore; + + +/***/ }, +/* 345 */ +/***/ function(module, exports, __webpack_require__) { + + + __webpack_require__(346); + __webpack_require__(77).registerPainter('vml', __webpack_require__(348)); + + +/***/ }, +/* 346 */ +/***/ function(module, exports, __webpack_require__) { + + // http://www.w3.org/TR/NOTE-VML + // TODO Use proxy like svg instead of overwrite brush methods + + + if (!__webpack_require__(78).canvasSupported) { + var vec2 = __webpack_require__(16); + var BoundingRect = __webpack_require__(15); + var CMD = __webpack_require__(48).CMD; + var colorTool = __webpack_require__(38); + var textContain = __webpack_require__(14); + var RectText = __webpack_require__(47); + var Displayable = __webpack_require__(45); + var ZImage = __webpack_require__(59); + var Text = __webpack_require__(62); + var Path = __webpack_require__(44); + + var Gradient = __webpack_require__(4); + + var vmlCore = __webpack_require__(347); + + var round = Math.round; + var sqrt = Math.sqrt; + var abs = Math.abs; + var cos = Math.cos; + var sin = Math.sin; + var mathMax = Math.max; + + var applyTransform = vec2.applyTransform; + + var comma = ','; + var imageTransformPrefix = 'progid:DXImageTransform.Microsoft'; + + var Z = 21600; + var Z2 = Z / 2; + + var ZLEVEL_BASE = 100000; + var Z_BASE = 1000; + + var initRootElStyle = function (el) { + el.style.cssText = 'position:absolute;left:0;top:0;width:1px;height:1px;'; + el.coordsize = Z + ',' + Z; + el.coordorigin = '0,0'; + }; + + var encodeHtmlAttribute = function (s) { + return String(s).replace(/&/g, '&').replace(/"/g, '"'); + }; + + var rgb2Str = function (r, g, b) { + return 'rgb(' + [r, g, b].join(',') + ')'; + }; + + var append = function (parent, child) { + if (child && parent && child.parentNode !== parent) { + parent.appendChild(child); + } + }; + + var remove = function (parent, child) { + if (child && parent && child.parentNode === parent) { + parent.removeChild(child); + } + }; + + var getZIndex = function (zlevel, z, z2) { + // z 的取值范围为 [0, 1000] + return (parseFloat(zlevel) || 0) * ZLEVEL_BASE + (parseFloat(z) || 0) * Z_BASE + z2; + }; + + var parsePercent = function (value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + }; + + /*************************************************** + * PATH + **************************************************/ + + var setColorAndOpacity = function (el, color, opacity) { + var colorArr = colorTool.parse(color); + opacity = +opacity; + if (isNaN(opacity)) { + opacity = 1; + } + if (colorArr) { + el.color = rgb2Str(colorArr[0], colorArr[1], colorArr[2]); + el.opacity = opacity * colorArr[3]; + } + }; + + var getColorAndAlpha = function (color) { + var colorArr = colorTool.parse(color); + return [ + rgb2Str(colorArr[0], colorArr[1], colorArr[2]), + colorArr[3] + ]; + }; + + var updateFillNode = function (el, style, zrEl) { + // TODO pattern + var fill = style.fill; + if (fill != null) { + // Modified from excanvas + if (fill instanceof Gradient) { + var gradientType; + var angle = 0; + var focus = [0, 0]; + // additional offset + var shift = 0; + // scale factor for offset + var expansion = 1; + var rect = zrEl.getBoundingRect(); + var rectWidth = rect.width; + var rectHeight = rect.height; + if (fill.type === 'linear') { + gradientType = 'gradient'; + var transform = zrEl.transform; + var p0 = [fill.x * rectWidth, fill.y * rectHeight]; + var p1 = [fill.x2 * rectWidth, fill.y2 * rectHeight]; + if (transform) { + applyTransform(p0, p0, transform); + applyTransform(p1, p1, transform); + } + var dx = p1[0] - p0[0]; + var dy = p1[1] - p0[1]; + angle = Math.atan2(dx, dy) * 180 / Math.PI; + // The angle should be a non-negative number. + if (angle < 0) { + angle += 360; + } + + // Very small angles produce an unexpected result because they are + // converted to a scientific notation string. + if (angle < 1e-6) { + angle = 0; + } + } + else { + gradientType = 'gradientradial'; + var p0 = [fill.x * rectWidth, fill.y * rectHeight]; + var transform = zrEl.transform; + var scale = zrEl.scale; + var width = rectWidth; + var height = rectHeight; + focus = [ + // Percent in bounding rect + (p0[0] - rect.x) / width, + (p0[1] - rect.y) / height + ]; + if (transform) { + applyTransform(p0, p0, transform); + } + + width /= scale[0] * Z; + height /= scale[1] * Z; + var dimension = mathMax(width, height); + shift = 2 * 0 / dimension; + expansion = 2 * fill.r / dimension - shift; + } + + // We need to sort the color stops in ascending order by offset, + // otherwise IE won't interpret it correctly. + var stops = fill.colorStops.slice(); + stops.sort(function(cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + var length = stops.length; + // Color and alpha list of first and last stop + var colorAndAlphaList = []; + var colors = []; + for (var i = 0; i < length; i++) { + var stop = stops[i]; + var colorAndAlpha = getColorAndAlpha(stop.color); + colors.push(stop.offset * expansion + shift + ' ' + colorAndAlpha[0]); + if (i === 0 || i === length - 1) { + colorAndAlphaList.push(colorAndAlpha); + } + } + + if (length >= 2) { + var color1 = colorAndAlphaList[0][0]; + var color2 = colorAndAlphaList[1][0]; + var opacity1 = colorAndAlphaList[0][1] * style.opacity; + var opacity2 = colorAndAlphaList[1][1] * style.opacity; + + el.type = gradientType; + el.method = 'none'; + el.focus = '100%'; + el.angle = angle; + el.color = color1; + el.color2 = color2; + el.colors = colors.join(','); + // When colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + el.opacity = opacity2; + // FIXME g_o_:opacity ? + el.opacity2 = opacity1; + } + if (gradientType === 'radial') { + el.focusposition = focus.join(','); + } + } + else { + // FIXME Change from Gradient fill to color fill + setColorAndOpacity(el, fill, style.opacity); + } + } + }; + + var updateStrokeNode = function (el, style) { + if (style.lineJoin != null) { + el.joinstyle = style.lineJoin; + } + if (style.miterLimit != null) { + el.miterlimit = style.miterLimit * Z; + } + if (style.lineCap != null) { + el.endcap = style.lineCap; + } + if (style.lineDash != null) { + el.dashstyle = style.lineDash.join(' '); + } + if (style.stroke != null && !(style.stroke instanceof Gradient)) { + setColorAndOpacity(el, style.stroke, style.opacity); + } + }; + + var updateFillAndStroke = function (vmlEl, type, style, zrEl) { + var isFill = type == 'fill'; + var el = vmlEl.getElementsByTagName(type)[0]; + // Stroke must have lineWidth + if (style[type] != null && style[type] !== 'none' && (isFill || (!isFill && style.lineWidth))) { + vmlEl[isFill ? 'filled' : 'stroked'] = 'true'; + // FIXME Remove before updating, or set `colors` will throw error + if (style[type] instanceof Gradient) { + remove(vmlEl, el); + } + if (!el) { + el = vmlCore.createNode(type); + } + + isFill ? updateFillNode(el, style, zrEl) : updateStrokeNode(el, style); + append(vmlEl, el); + } + else { + vmlEl[isFill ? 'filled' : 'stroked'] = 'false'; + remove(vmlEl, el); + } + }; + + var points = [[], [], []]; + var pathDataToString = function (data, m) { + var M = CMD.M; + var C = CMD.C; + var L = CMD.L; + var A = CMD.A; + var Q = CMD.Q; + + var str = []; + var nPoint; + var cmdStr; + var cmd; + var i; + var xi; + var yi; + for (i = 0; i < data.length;) { + cmd = data[i++]; + cmdStr = ''; + nPoint = 0; + switch (cmd) { + case M: + cmdStr = ' m '; + nPoint = 1; + xi = data[i++]; + yi = data[i++]; + points[0][0] = xi; + points[0][1] = yi; + break; + case L: + cmdStr = ' l '; + nPoint = 1; + xi = data[i++]; + yi = data[i++]; + points[0][0] = xi; + points[0][1] = yi; + break; + case Q: + case C: + cmdStr = ' c '; + nPoint = 3; + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + var x3; + var y3; + if (cmd === Q) { + // Convert quadratic to cubic using degree elevation + x3 = x2; + y3 = y2; + x2 = (x2 + 2 * x1) / 3; + y2 = (y2 + 2 * y1) / 3; + x1 = (xi + 2 * x1) / 3; + y1 = (yi + 2 * y1) / 3; + } + else { + x3 = data[i++]; + y3 = data[i++]; + } + points[0][0] = x1; + points[0][1] = y1; + points[1][0] = x2; + points[1][1] = y2; + points[2][0] = x3; + points[2][1] = y3; + + xi = x3; + yi = y3; + break; + case A: + var x = 0; + var y = 0; + var sx = 1; + var sy = 1; + var angle = 0; + if (m) { + // Extract SRT from matrix + x = m[4]; + y = m[5]; + sx = sqrt(m[0] * m[0] + m[1] * m[1]); + sy = sqrt(m[2] * m[2] + m[3] * m[3]); + angle = Math.atan2(-m[1] / sy, m[0] / sx); + } + + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++] + angle; + var endAngle = data[i++] + startAngle + angle; + // FIXME + // var psi = data[i++]; + i++; + var clockwise = data[i++]; + + var x0 = cx + cos(startAngle) * rx; + var y0 = cy + sin(startAngle) * ry; + + var x1 = cx + cos(endAngle) * rx; + var y1 = cy + sin(endAngle) * ry; + + var type = clockwise ? ' wa ' : ' at '; + // IE won't render arches drawn counter clockwise if x0 == x1. + if (Math.abs(x0 - x1) < 1e-10 && clockwise) { + // Offset x0 by 1/80 of a pixel. Use something + // that can be represented in binary + x0 += 270 / Z; + } + str.push( + type, + round(((cx - rx) * sx + x) * Z - Z2), comma, + round(((cy - ry) * sy + y) * Z - Z2), comma, + round(((cx + rx) * sx + x) * Z - Z2), comma, + round(((cy + ry) * sy + y) * Z - Z2), comma, + round((x0 * sx + x) * Z - Z2), comma, + round((y0 * sy + y) * Z - Z2), comma, + round((x1 * sx + x) * Z - Z2), comma, + round((y1 * sy + y) * Z - Z2) + ); + + xi = x1; + yi = y1; + break; + case CMD.R: + var p0 = points[0]; + var p1 = points[1]; + // x0, y0 + p0[0] = data[i++]; + p0[1] = data[i++]; + // x1, y1 + p1[0] = p0[0] + data[i++]; + p1[1] = p0[1] + data[i++]; + + if (m) { + applyTransform(p0, p0, m); + applyTransform(p1, p1, m); + } + + p0[0] = round(p0[0] * Z - Z2); + p1[0] = round(p1[0] * Z - Z2); + p0[1] = round(p0[1] * Z - Z2); + p1[1] = round(p1[1] * Z - Z2); + str.push( + // x0, y0 + ' m ', p0[0], comma, p0[1], + // x1, y0 + ' l ', p1[0], comma, p0[1], + // x1, y1 + ' l ', p1[0], comma, p1[1], + // x0, y1 + ' l ', p0[0], comma, p1[1] + ); + break; + case CMD.Z: + // FIXME Update xi, yi + str.push(' x '); + } + + if (nPoint > 0) { + str.push(cmdStr); + for (var k = 0; k < nPoint; k++) { + var p = points[k]; + + m && applyTransform(p, p, m); + // 不 round 会非常慢 + str.push( + round(p[0] * Z - Z2), comma, round(p[1] * Z - Z2), + k < nPoint - 1 ? comma : '' + ); + } + } + } + return str.join(''); + }; + + // Rewrite the original path method + Path.prototype.brushVML = function (vmlRoot) { + var style = this.style; + + var vmlEl = this._vmlEl; + if (!vmlEl) { + vmlEl = vmlCore.createNode('shape'); + initRootElStyle(vmlEl); + + this._vmlEl = vmlEl; + } + + updateFillAndStroke(vmlEl, 'fill', style, this); + updateFillAndStroke(vmlEl, 'stroke', style, this); + + var m = this.transform; + var needTransform = m != null; + var strokeEl = vmlEl.getElementsByTagName('stroke')[0]; + if (strokeEl) { + var lineWidth = style.lineWidth; + // Get the line scale. + // Determinant of this.m_ means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + if (needTransform && !style.strokeNoScale) { + var det = m[0] * m[3] - m[1] * m[2]; + lineWidth *= sqrt(abs(det)); + } + strokeEl.weight = lineWidth + 'px'; + } + + var path = this.path; + if (this.__dirtyPath) { + path.beginPath(); + this.buildPath(path, this.shape); + this.__dirtyPath = false; + } + + vmlEl.path = pathDataToString(path.data, this.transform); + + vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Append to root + append(vmlRoot, vmlEl); + + // Text + if (style.text) { + this.drawRectText(vmlRoot, this.getBoundingRect()); + } + }; + + Path.prototype.onRemove = function (vmlRoot) { + remove(vmlRoot, this._vmlEl); + this.removeRectText(vmlRoot); + }; + + Path.prototype.onAdd = function (vmlRoot) { + append(vmlRoot, this._vmlEl); + this.appendRectText(vmlRoot); + }; + + /*************************************************** + * IMAGE + **************************************************/ + var isImage = function (img) { + // FIXME img instanceof Image 如果 img 是一个字符串的时候,IE8 下会报错 + return (typeof img === 'object') && img.tagName && img.tagName.toUpperCase() === 'IMG'; + // return img instanceof Image; + }; + + // Rewrite the original path method + ZImage.prototype.brushVML = function (vmlRoot) { + var style = this.style; + var image = style.image; + + // Image original width, height + var ow; + var oh; + + if (isImage(image)) { + var src = image.src; + if (src === this._imageSrc) { + ow = this._imageWidth; + oh = this._imageHeight; + } + else { + var imageRuntimeStyle = image.runtimeStyle; + var oldRuntimeWidth = imageRuntimeStyle.width; + var oldRuntimeHeight = imageRuntimeStyle.height; + imageRuntimeStyle.width = 'auto'; + imageRuntimeStyle.height = 'auto'; + + // get the original size + ow = image.width; + oh = image.height; + + // and remove overides + imageRuntimeStyle.width = oldRuntimeWidth; + imageRuntimeStyle.height = oldRuntimeHeight; + + // Caching image original width, height and src + this._imageSrc = src; + this._imageWidth = ow; + this._imageHeight = oh; + } + image = src; + } + else { + if (image === this._imageSrc) { + ow = this._imageWidth; + oh = this._imageHeight; + } + } + if (!image) { + return; + } + + var x = style.x || 0; + var y = style.y || 0; + + var dw = style.width; + var dh = style.height; + + var sw = style.sWidth; + var sh = style.sHeight; + var sx = style.sx || 0; + var sy = style.sy || 0; + + var hasCrop = sw && sh; + + var vmlEl = this._vmlEl; + if (!vmlEl) { + // FIXME 使用 group 在 left, top 都不是 0 的时候就无法显示了。 + // vmlEl = vmlCore.createNode('group'); + vmlEl = vmlCore.doc.createElement('div'); + initRootElStyle(vmlEl); + + this._vmlEl = vmlEl; + } + + var vmlElStyle = vmlEl.style; + var hasRotation = false; + var m; + var scaleX = 1; + var scaleY = 1; + if (this.transform) { + m = this.transform; + scaleX = sqrt(m[0] * m[0] + m[1] * m[1]); + scaleY = sqrt(m[2] * m[2] + m[3] * m[3]); + + hasRotation = m[1] || m[2]; + } + if (hasRotation) { + // If filters are necessary (rotation exists), create them + // filters are bog-slow, so only create them if abbsolutely necessary + // The following check doesn't account for skews (which don't exist + // in the canvas spec (yet) anyway. + // From excanvas + var p0 = [x, y]; + var p1 = [x + dw, y]; + var p2 = [x, y + dh]; + var p3 = [x + dw, y + dh]; + applyTransform(p0, p0, m); + applyTransform(p1, p1, m); + applyTransform(p2, p2, m); + applyTransform(p3, p3, m); + + var maxX = mathMax(p0[0], p1[0], p2[0], p3[0]); + var maxY = mathMax(p0[1], p1[1], p2[1], p3[1]); + + var transformFilter = []; + transformFilter.push('M11=', m[0] / scaleX, comma, + 'M12=', m[2] / scaleY, comma, + 'M21=', m[1] / scaleX, comma, + 'M22=', m[3] / scaleY, comma, + 'Dx=', round(x * scaleX + m[4]), comma, + 'Dy=', round(y * scaleY + m[5])); + + vmlElStyle.padding = '0 ' + round(maxX) + 'px ' + round(maxY) + 'px 0'; + // FIXME DXImageTransform 在 IE11 的兼容模式下不起作用 + vmlElStyle.filter = imageTransformPrefix + '.Matrix(' + + transformFilter.join('') + ', SizingMethod=clip)'; + + } + else { + if (m) { + x = x * scaleX + m[4]; + y = y * scaleY + m[5]; + } + vmlElStyle.filter = ''; + vmlElStyle.left = round(x) + 'px'; + vmlElStyle.top = round(y) + 'px'; + } + + var imageEl = this._imageEl; + var cropEl = this._cropEl; + + if (! imageEl) { + imageEl = vmlCore.doc.createElement('div'); + this._imageEl = imageEl; + } + var imageELStyle = imageEl.style; + if (hasCrop) { + // Needs know image original width and height + if (! (ow && oh)) { + var tmpImage = new Image(); + var self = this; + tmpImage.onload = function () { + tmpImage.onload = null; + ow = tmpImage.width; + oh = tmpImage.height; + // Adjust image width and height to fit the ratio destinationSize / sourceSize + imageELStyle.width = round(scaleX * ow * dw / sw) + 'px'; + imageELStyle.height = round(scaleY * oh * dh / sh) + 'px'; + + // Caching image original width, height and src + self._imageWidth = ow; + self._imageHeight = oh; + self._imageSrc = image; + }; + tmpImage.src = image; + } + else { + imageELStyle.width = round(scaleX * ow * dw / sw) + 'px'; + imageELStyle.height = round(scaleY * oh * dh / sh) + 'px'; + } + + if (! cropEl) { + cropEl = vmlCore.doc.createElement('div'); + cropEl.style.overflow = 'hidden'; + this._cropEl = cropEl; + } + var cropElStyle = cropEl.style; + cropElStyle.width = round((dw + sx * dw / sw) * scaleX); + cropElStyle.height = round((dh + sy * dh / sh) * scaleY); + cropElStyle.filter = imageTransformPrefix + '.Matrix(Dx=' + + (-sx * dw / sw * scaleX) + ',Dy=' + (-sy * dh / sh * scaleY) + ')'; + + if (! cropEl.parentNode) { + vmlEl.appendChild(cropEl); + } + if (imageEl.parentNode != cropEl) { + cropEl.appendChild(imageEl); + } + } + else { + imageELStyle.width = round(scaleX * dw) + 'px'; + imageELStyle.height = round(scaleY * dh) + 'px'; + + vmlEl.appendChild(imageEl); + + if (cropEl && cropEl.parentNode) { + vmlEl.removeChild(cropEl); + this._cropEl = null; + } + } + + var filterStr = ''; + var alpha = style.opacity; + if (alpha < 1) { + filterStr += '.Alpha(opacity=' + round(alpha * 100) + ') '; + } + filterStr += imageTransformPrefix + '.AlphaImageLoader(src=' + image + ', SizingMethod=scale)'; + + imageELStyle.filter = filterStr; + + vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Append to root + append(vmlRoot, vmlEl); + + // Text + if (style.text) { + this.drawRectText(vmlRoot, this.getBoundingRect()); + } + }; + + ZImage.prototype.onRemove = function (vmlRoot) { + remove(vmlRoot, this._vmlEl); + + this._vmlEl = null; + this._cropEl = null; + this._imageEl = null; + + this.removeRectText(vmlRoot); + }; + + ZImage.prototype.onAdd = function (vmlRoot) { + append(vmlRoot, this._vmlEl); + this.appendRectText(vmlRoot); + }; + + + /*************************************************** + * TEXT + **************************************************/ + + var DEFAULT_STYLE_NORMAL = 'normal'; + + var fontStyleCache = {}; + var fontStyleCacheCount = 0; + var MAX_FONT_CACHE_SIZE = 100; + var fontEl = document.createElement('div'); + + var getFontStyle = function (fontString) { + var fontStyle = fontStyleCache[fontString]; + if (!fontStyle) { + // Clear cache + if (fontStyleCacheCount > MAX_FONT_CACHE_SIZE) { + fontStyleCacheCount = 0; + fontStyleCache = {}; + } + + var style = fontEl.style; + var fontFamily; + try { + style.font = fontString; + fontFamily = style.fontFamily.split(',')[0]; + } + catch (e) { + } + + fontStyle = { + style: style.fontStyle || DEFAULT_STYLE_NORMAL, + variant: style.fontVariant || DEFAULT_STYLE_NORMAL, + weight: style.fontWeight || DEFAULT_STYLE_NORMAL, + size: parseFloat(style.fontSize || 12) | 0, + family: fontFamily || 'Microsoft YaHei' + }; + + fontStyleCache[fontString] = fontStyle; + fontStyleCacheCount++; + } + return fontStyle; + }; + + var textMeasureEl; + // Overwrite measure text method + textContain.measureText = function (text, textFont) { + var doc = vmlCore.doc; + if (!textMeasureEl) { + textMeasureEl = doc.createElement('div'); + textMeasureEl.style.cssText = 'position:absolute;top:-20000px;left:0;' + + 'padding:0;margin:0;border:none;white-space:pre;'; + vmlCore.doc.body.appendChild(textMeasureEl); + } + + try { + textMeasureEl.style.font = textFont; + } catch (ex) { + // Ignore failures to set to invalid font. + } + textMeasureEl.innerHTML = ''; + // Don't use innerHTML or innerText because they allow markup/whitespace. + textMeasureEl.appendChild(doc.createTextNode(text)); + return { + width: textMeasureEl.offsetWidth + }; + }; + + var tmpRect = new BoundingRect(); + + var drawRectText = function (vmlRoot, rect, textRect, fromTextEl) { + + var style = this.style; + var text = style.text; + if (!text) { + return; + } + + var x; + var y; + var align = style.textAlign; + var fontStyle = getFontStyle(style.textFont); + // FIXME encodeHtmlAttribute ? + var font = fontStyle.style + ' ' + fontStyle.variant + ' ' + fontStyle.weight + ' ' + + fontStyle.size + 'px "' + fontStyle.family + '"'; + var baseline = style.textBaseline; + var verticalAlign = style.textVerticalAlign; + + textRect = textRect || textContain.getBoundingRect(text, font, align, baseline); + + // Transform rect to view space + var m = this.transform; + // Ignore transform for text in other element + if (m && !fromTextEl) { + tmpRect.copy(rect); + tmpRect.applyTransform(m); + rect = tmpRect; + } + + if (!fromTextEl) { + var textPosition = style.textPosition; + var distance = style.textDistance; + // Text position represented by coord + if (textPosition instanceof Array) { + x = rect.x + parsePercent(textPosition[0], rect.width); + y = rect.y + parsePercent(textPosition[1], rect.height); + + align = align || 'left'; + baseline = baseline || 'top'; + } + else { + var res = textContain.adjustTextPositionOnRect( + textPosition, rect, textRect, distance + ); + x = res.x; + y = res.y; + + // Default align and baseline when has textPosition + align = align || res.textAlign; + baseline = baseline || res.textBaseline; + } + } + else { + x = rect.x; + y = rect.y; + } + if (verticalAlign) { + switch (verticalAlign) { + case 'middle': + y -= textRect.height / 2; + break; + case 'bottom': + y -= textRect.height; + break; + // 'top' + } + // Ignore baseline + baseline = 'top'; + } + + var fontSize = fontStyle.size; + // 1.75 is an arbitrary number, as there is no info about the text baseline + switch (baseline) { + case 'hanging': + case 'top': + y += fontSize / 1.75; + break; + case 'middle': + break; + default: + // case null: + // case 'alphabetic': + // case 'ideographic': + // case 'bottom': + y -= fontSize / 2.25; + break; + } + switch (align) { + case 'left': + break; + case 'center': + x -= textRect.width / 2; + break; + case 'right': + x -= textRect.width; + break; + // case 'end': + // align = elementStyle.direction == 'ltr' ? 'right' : 'left'; + // break; + // case 'start': + // align = elementStyle.direction == 'rtl' ? 'right' : 'left'; + // break; + // default: + // align = 'left'; + } + + var createNode = vmlCore.createNode; + + var textVmlEl = this._textVmlEl; + var pathEl; + var textPathEl; + var skewEl; + if (!textVmlEl) { + textVmlEl = createNode('line'); + pathEl = createNode('path'); + textPathEl = createNode('textpath'); + skewEl = createNode('skew'); + + // FIXME Why here is not cammel case + // Align 'center' seems wrong + textPathEl.style['v-text-align'] = 'left'; + + initRootElStyle(textVmlEl); + + pathEl.textpathok = true; + textPathEl.on = true; + + textVmlEl.from = '0 0'; + textVmlEl.to = '1000 0.05'; + + append(textVmlEl, skewEl); + append(textVmlEl, pathEl); + append(textVmlEl, textPathEl); + + this._textVmlEl = textVmlEl; + } + else { + // 这里是在前面 appendChild 保证顺序的前提下 + skewEl = textVmlEl.firstChild; + pathEl = skewEl.nextSibling; + textPathEl = pathEl.nextSibling; + } + + var coords = [x, y]; + var textVmlElStyle = textVmlEl.style; + // Ignore transform for text in other element + if (m && fromTextEl) { + applyTransform(coords, coords, m); + + skewEl.on = true; + + skewEl.matrix = m[0].toFixed(3) + comma + m[2].toFixed(3) + comma + + m[1].toFixed(3) + comma + m[3].toFixed(3) + ',0,0'; + + // Text position + skewEl.offset = (round(coords[0]) || 0) + ',' + (round(coords[1]) || 0); + // Left top point as origin + skewEl.origin = '0 0'; + + textVmlElStyle.left = '0px'; + textVmlElStyle.top = '0px'; + } + else { + skewEl.on = false; + textVmlElStyle.left = round(x) + 'px'; + textVmlElStyle.top = round(y) + 'px'; + } + + textPathEl.string = encodeHtmlAttribute(text); + // TODO + try { + textPathEl.style.font = font; + } + // Error font format + catch (e) {} + + updateFillAndStroke(textVmlEl, 'fill', { + fill: fromTextEl ? style.fill : style.textFill, + opacity: style.opacity + }, this); + updateFillAndStroke(textVmlEl, 'stroke', { + stroke: fromTextEl ? style.stroke : style.textStroke, + opacity: style.opacity, + lineDash: style.lineDash + }, this); + + textVmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Attached to root + append(vmlRoot, textVmlEl); + }; + + var removeRectText = function (vmlRoot) { + remove(vmlRoot, this._textVmlEl); + this._textVmlEl = null; + }; + + var appendRectText = function (vmlRoot) { + append(vmlRoot, this._textVmlEl); + }; + + var list = [RectText, Displayable, ZImage, Path, Text]; + + // In case Displayable has been mixed in RectText + for (var i = 0; i < list.length; i++) { + var proto = list[i].prototype; + proto.drawRectText = drawRectText; + proto.removeRectText = removeRectText; + proto.appendRectText = appendRectText; + } + + Text.prototype.brushVML = function (root) { + var style = this.style; + if (style.text) { + this.drawRectText(root, { + x: style.x || 0, y: style.y || 0, + width: 0, height: 0 + }, this.getBoundingRect(), true); + } + }; + + Text.prototype.onRemove = function (vmlRoot) { + this.removeRectText(vmlRoot); + }; + + Text.prototype.onAdd = function (vmlRoot) { + this.appendRectText(vmlRoot); + }; + } + + +/***/ }, +/* 347 */ +/***/ function(module, exports, __webpack_require__) { + + + + if (!__webpack_require__(78).canvasSupported) { + var urn = 'urn:schemas-microsoft-com:vml'; + + var createNode; + var win = window; + var doc = win.document; + + var vmlInited = false; + + try { + !doc.namespaces.zrvml && doc.namespaces.add('zrvml', urn); + createNode = function (tagName) { + return doc.createElement(''); + }; + } + catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="' + urn + '" class="zrvml">'); + }; + } + + // From raphael + var initVML = function () { + if (vmlInited) { + return; + } + vmlInited = true; + + var styleSheets = doc.styleSheets; + if (styleSheets.length < 31) { + doc.createStyleSheet().addRule('.zrvml', 'behavior:url(#default#VML)'); + } + else { + // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx + styleSheets[0].addRule('.zrvml', 'behavior:url(#default#VML)'); + } + }; + + // Not useing return to avoid error when converting to CommonJS module + module.exports = { + doc: doc, + initVML: initVML, + createNode: createNode + }; + } + + +/***/ }, +/* 348 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * VML Painter. + * + * @module zrender/vml/Painter + */ + + + + var zrLog = __webpack_require__(39); + var vmlCore = __webpack_require__(347); + + function parseInt10(val) { + return parseInt(val, 10); + } + + /** + * @alias module:zrender/vml/Painter + */ + function VMLPainter(root, storage) { + + vmlCore.initVML(); + + this.root = root; + + this.storage = storage; + + var vmlViewport = document.createElement('div'); + + var vmlRoot = document.createElement('div'); + + vmlViewport.style.cssText = 'display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;'; + + vmlRoot.style.cssText = 'position:absolute;left:0;top:0;'; + + root.appendChild(vmlViewport); + + this._vmlRoot = vmlRoot; + this._vmlViewport = vmlViewport; + + this.resize(); + + // Modify storage + var oldDelFromMap = storage.delFromMap; + var oldAddToMap = storage.addToMap; + storage.delFromMap = function (elId) { + var el = storage.get(elId); + + oldDelFromMap.call(storage, elId); + + if (el) { + el.onRemove && el.onRemove(vmlRoot); + } + }; + + storage.addToMap = function (el) { + // Displayable already has a vml node + el.onAdd && el.onAdd(vmlRoot); + + oldAddToMap.call(storage, el); + }; + + this._firstPaint = true; + } + + VMLPainter.prototype = { + + constructor: VMLPainter, + + /** + * @return {HTMLDivElement} + */ + getViewportRoot: function () { + return this._vmlViewport; + }, + + /** + * 刷新 + */ + refresh: function () { + + var list = this.storage.getDisplayList(true, true); + + this._paintList(list); + }, + + _paintList: function (list) { + var vmlRoot = this._vmlRoot; + for (var i = 0; i < list.length; i++) { + var el = list[i]; + if (el.invisible || el.ignore) { + if (!el.__alreadyNotVisible) { + el.onRemove(vmlRoot); + } + // Set as already invisible + el.__alreadyNotVisible = true; + } + else { + if (el.__alreadyNotVisible) { + el.onAdd(vmlRoot); + } + el.__alreadyNotVisible = false; + if (el.__dirty) { + el.beforeBrush && el.beforeBrush(); + (el.brushVML || el.brush).call(el, vmlRoot); + el.afterBrush && el.afterBrush(); + } + } + el.__dirty = false; + } + + if (this._firstPaint) { + // Detached from document at first time + // to avoid page refreshing too many times + + // FIXME 如果每次都先 removeChild 可能会导致一些填充和描边的效果改变 + this._vmlViewport.appendChild(vmlRoot); + this._firstPaint = false; + } + }, + + resize: function () { + var width = this._getWidth(); + var height = this._getHeight(); + + if (this._width != width && this._height != height) { + this._width = width; + this._height = height; + + var vmlViewportStyle = this._vmlViewport.style; + vmlViewportStyle.width = width + 'px'; + vmlViewportStyle.height = height + 'px'; + } + }, + + dispose: function () { + this.root.innerHTML = ''; + + this._vmlRoot = + this._vmlViewport = + this.storage = null; + }, + + getWidth: function () { + return this._width; + }, + + getHeight: function () { + return this._height; + }, + + _getWidth: function () { + var root = this.root; + var stl = root.currentStyle; + + return ((root.clientWidth || parseInt10(stl.width)) + - parseInt10(stl.paddingLeft) + - parseInt10(stl.paddingRight)) | 0; + }, + + _getHeight: function () { + var root = this.root; + var stl = root.currentStyle; + + return ((root.clientHeight || parseInt10(stl.height)) + - parseInt10(stl.paddingTop) + - parseInt10(stl.paddingBottom)) | 0; + } + }; + + // Not supported methods + function createMethodNotSupport(method) { + return function () { + zrLog('In IE8.0 VML mode painter not support method "' + method + '"'); + }; + } + + var notSupportedMethods = [ + 'getLayer', 'insertLayer', 'eachLayer', 'eachBuildinLayer', 'eachOtherLayer', 'getLayers', + 'modLayer', 'delLayer', 'clearLayer', 'toDataURL', 'pathToImage' + ]; + + for (var i = 0; i < notSupportedMethods.length; i++) { + var name = notSupportedMethods[i]; + VMLPainter.prototype[name] = createMethodNotSupport(name); + } + + module.exports = VMLPainter; + + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.common.min.js b/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.common.min.js new file mode 100644 index 0000000..1b80053 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.common.min.js @@ -0,0 +1,27 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(n){if(i[n])return i[n].exports;var r=i[n]={exports:{},id:n,loaded:!1};return t[n].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){t.exports=i(2),i(85),i(79),i(90),i(163),i(196),i(176),i(34),i(187),i(182),i(181),i(166),i(188),i(204)},function(t,e,i){function n(t){if("object"==typeof t&&null!==t){var e=t;if(t instanceof Array){e=[];for(var i=0,r=t.length;r>i;i++)e[i]=n(t[i])}else if(!A(t)&&!T(t)){e={};for(var o in t)t.hasOwnProperty(o)&&(e[o]=n(t[o]))}return e}return t}function r(t,e,i){if(!S(e)||!S(t))return i?n(e):t;for(var o in e)if(e.hasOwnProperty(o)){var a=t[o],s=e[o];!S(s)||!S(a)||b(s)||b(a)||T(s)||T(a)||A(s)||A(a)?!i&&o in t||(t[o]=n(e[o],!0)):r(a,s,i)}return t}function o(t,e){for(var i=t[0],n=1,o=t.length;o>n;n++)i=r(i,t[n],e);return i}function a(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function s(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function l(){return document.createElement("canvas")}function h(){return L||(L=F.createCanvas().getContext("2d")),L}function c(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i}return-1}function u(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,t.prototype=new i;for(var r in n)t.prototype[r]=n[r];t.prototype.constructor=t,t.superClass=e}function d(t,e,i){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,s(t,e,i)}function f(t){return t?"string"==typeof t?!1:"number"==typeof t.length:void 0}function p(t,e,i){if(t&&e)if(t.forEach&&t.forEach===E)t.forEach(e,i);else if(t.length===+t.length)for(var n=0,r=t.length;r>n;n++)e.call(i,t[n],n,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(i,t[o],o,t)}function g(t,e,i){if(t&&e){if(t.map&&t.map===N)return t.map(e,i);for(var n=[],r=0,o=t.length;o>r;r++)n.push(e.call(i,t[r],r,t));return n}}function m(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===V)return t.reduce(e,i,n);for(var r=0,o=t.length;o>r;r++)i=e.call(n,i,t[r],r,t);return i}}function v(t,e,i){if(t&&e){if(t.filter&&t.filter===R)return t.filter(e,i);for(var n=[],r=0,o=t.length;o>r;r++)e.call(i,t[r],r,t)&&n.push(t[r]);return n}}function y(t,e,i){if(t&&e)for(var n=0,r=t.length;r>n;n++)if(e.call(i,t[n],n,t))return t[n]}function x(t,e){var i=B.call(arguments,2);return function(){return t.apply(e,i.concat(B.call(arguments)))}}function _(t){var e=B.call(arguments,1);return function(){return t.apply(this,e.concat(B.call(arguments)))}}function b(t){return"[object Array]"===z.call(t)}function w(t){return"function"==typeof t}function M(t){return"[object String]"===z.call(t)}function S(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function A(t){return!!P[z.call(t)]||t instanceof D}function T(t){return t&&1===t.nodeType&&"string"==typeof t.nodeName}function C(t){for(var e=0,i=arguments.length;i>e;e++)if(null!=arguments[e])return arguments[e]}function I(){return Function.call.apply(B,arguments)}function k(t,e){if(!t)throw new Error(e)}var L,D=i(16),P={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1},z=Object.prototype.toString,O=Array.prototype,E=O.forEach,R=O.filter,B=O.slice,N=O.map,V=O.reduce,F={inherits:u,mixin:d,clone:n,merge:r,mergeAll:o,extend:a,defaults:s,getContext:h,createCanvas:l,indexOf:c,slice:I,find:y,isArrayLike:f,each:p,map:g,reduce:m,filter:v,bind:x,curry:_,isArray:b,isString:M,isObject:S,isFunction:w,isBuildInObject:A,isDom:T,retrieve:C,assert:k,noop:function(){}};t.exports=F},function(t,e,i){function n(t){return function(e,i,n){e=e&&e.toLowerCase(),k.prototype[t].call(this,e,i,n)}}function r(){k.call(this)}function o(t,e,i){i=i||{},"string"==typeof e&&(e=Z[e]),e&&L(G,function(t){t(e)}),this.id,this.group,this._dom=t,this._zr=A.init(t,{renderer:i.renderer||"canvas",devicePixelRatio:i.devicePixelRatio}),this._theme=T.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._api=new v(this),this._coordSysMgr=new y,k.call(this),this._messageCenter=new r,this._initEvents(),this.resize=T.bind(this.resize,this)}function a(t,e){var i=this._model;i&&i.eachComponent({mainType:"series",query:e},function(n,r){var o=this._chartsMap[n.__viewId];o&&o.__alive&&o[t](n,i,this._api,e)},this)}function s(t,e,i){var n=this._api;L(this._componentsViews,function(r){var o=r.__model;r[t](o,e,n,i),p(o,r)},this),e.eachSeries(function(r,o){var a=this._chartsMap[r.__viewId];a[t](r,e,n,i),p(r,a)},this)}function l(t,e){for(var i="component"===t,n=i?this._componentsViews:this._chartsViews,r=i?this._componentsMap:this._chartsMap,o=this._zr,a=0;a=0?"white":i,o=e.getModel("textStyle");f.extend(t,{textDistance:e.getShallow("distance")||5,textFont:o.getFont(),textPosition:n,textFill:o.getTextColor()||r})},b.updateProps=f.curry(d,!0),b.initProps=f.curry(d,!1),b.getTransform=function(t,e){for(var i=y.identity([]);t&&t!==e;)y.mul(i,t.getLocalTransform(),i),t=t.parent;return i},b.applyTransform=function(t,e,i){return i&&(e=y.invert([],e)),x.applyTransform([],t,e)},b.transformDirection=function(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-n:"right"===t?n:0,"top"===t?-r:"bottom"===t?r:0];return o=b.applyTransform(o,e,i),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"},t.exports=b},function(t,e){function i(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}var n={},r=1e-4;n.linearMap=function(t,e,i,n){var r=e[1]-e[0];if(0===r)return(i[0]+i[1])/2;var o=(t-e[0])/r;return n&&(o=Math.min(Math.max(o,0),1)),o*(i[1]-i[0])+i[0]},n.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?i(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},n.round=function(t){return+(+t).toFixed(12)},n.asc=function(t){return t.sort(function(t,e){return t-e}),t},n.getPrecision=function(t){if(isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i},n.getPixelPrecision=function(t,e){var i=Math.log,n=Math.LN10,r=Math.floor(i(t[1]-t[0])/n),o=Math.round(i(Math.abs(e[1]-e[0]))/n);return Math.max(-r+o,0)},n.MAX_SAFE_INTEGER=9007199254740991,n.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},n.isRadianAroundZero=function(t){return t>-r&&r>t},n.parseDate=function(t){return t instanceof Date?t:new Date("string"==typeof t?t.replace(/-/g,"/"):Math.round(t))},n.nice=function(t,e){var i,n=Math.floor(Math.log(t)/Math.LN10),r=Math.pow(10,n),o=t/r;return i=e?1.5>o?1:2.5>o?2:4>o?3:7>o?5:10:1>o?1:2>o?2:3>o?3:5>o?5:10,i*r},t.exports=n},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(t,e){var n=new i(2);return n[0]=t||0,n[1]=e||0,n},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new i(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,i){return t[0]=e,t[1]=i,t},add:function(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t},scaleAndAdd:function(t,e,i,n){return t[0]=e[0]+i[0]*n,t[1]=e[1]+i[1]*n,t},sub:function(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t},div:function(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t},normalize:function(t,e){var i=n.len(e);return 0===i?(t[0]=0,t[1]=0):(t[0]=e[0]/i,t[1]=e[1]/i),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,i,n){return t[0]=e[0]+n*(i[0]-e[0]),t[1]=e[1]+n*(i[1]-e[1]),t},applyTransform:function(t,e,i){var n=e[0],r=e[1];return t[0]=i[0]*n+i[2]*r+i[4],t[1]=i[1]*n+i[3]*r+i[5],t},min:function(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t},max:function(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t}};n.length=n.len,n.lengthSquare=n.lenSquare,n.dist=n.distance,n.distSquare=n.distanceSquare,t.exports=n},function(t,e,i){function n(t){var e=t.fill;return null!=e&&"none"!==e}function r(t){var e=t.stroke;return null!=e&&"none"!==e&&t.lineWidth>0}function o(t){a.call(this,t),this.path=new l}var a=i(35),s=i(1),l=i(27),h=i(137),c=i(16),u=Math.abs;o.prototype={constructor:o,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t){t.save();var e=this.style,i=this.path,o=r(e),a=n(e);this.__dirtyPath&&(a&&e.fill instanceof c&&e.fill.updateCanvasGradient(this,t),o&&e.stroke instanceof c&&e.stroke.updateCanvasGradient(this,t)),e.bind(t,this),this.setTransform(t);var s=e.lineDash,l=e.lineDashOffset,h=!!t.setLineDash;this.__dirtyPath||s&&!h&&o?(i=this.path.beginPath(t),s&&!h&&(i.setLineDash(s),i.setLineDashOffset(l)),this.buildPath(i,this.shape),this.__dirtyPath=!1):(t.beginPath(),this.path.rebuildPath(t)),a&&i.fill(t),s&&h&&(t.setLineDash(s),t.lineDashOffset=l),o&&i.stroke(t),null!=e.text&&this.drawRectText(t,this.getBoundingRect()),t.restore()},buildPath:function(t,e){},getBoundingRect:function(){var t=this._rect,e=this.style,i=!t;if(i){var o=this.path;this.__dirtyPath&&(o.beginPath(),this.buildPath(o,this.shape)),t=o.getBoundingRect()}if(this._rect=t,r(e)){var a=this._rectWithStroke;if(this.__dirty||i){var a=this._rectWithStroke||(this._rectWithStroke=t.clone());a.copy(t);var s=e.lineWidth,l=e.strokeNoScale?this.getLineScale():1;n(e)||(s=Math.max(s,this.strokeContainThreshold)),l>1e-10&&(a.width+=s/l,a.height+=s/l,a.x-=s/l/2,a.y-=s/l/2)}return a}return t},contain:function(t,e){var i=this.transformCoordToLocal(t,e),o=this.getBoundingRect(),a=this.style;if(t=i[0],e=i[1],o.contain(t,e)){var s=this.path.data;if(r(a)){var l=a.lineWidth,c=a.strokeNoScale?this.getLineScale():1;if(c>1e-10&&(n(a)||(l=Math.max(l,this.strokeContainThreshold)),h.containStroke(s,l/c,t,e)))return!0}if(n(a))return h.contain(s,t,e)}return!1},dirty:function(t){0===arguments.length&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?this.setShape(e):a.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(s.isObject(t))for(var n in t)i[n]=t[n];else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&u(t[0]-1)>1e-10&&u(t[3]-1)>1e-10?Math.sqrt(u(t[0]*t[3]-t[2]*t[1])):1}},o.extend=function(t){var e=function(e){o.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var n=this.shape;for(var r in i)!n.hasOwnProperty(r)&&i.hasOwnProperty(r)&&(n[r]=i[r])}t.init&&t.init.call(this,e)};s.inherits(e,o);for(var i in t)"style"!==i&&"shape"!==i&&(e.prototype[i]=t[i]);return e},s.inherits(o,a),t.exports=o},function(t,e,i){var n=i(9),r=i(4),o=i(1),a=i(12),s=["x","y","z","radius","angle"],l={};l.createNameEach=function(t,e){t=t.slice();var i=o.map(t,l.capitalFirst);e=(e||[]).slice();var n=o.map(e,l.capitalFirst);return function(r,a){o.each(t,function(t,o){for(var s={name:t,capital:i[o]},l=0;l=0}function r(t,n){var r=!1;return e(function(e){o.each(i(t,e)||[],function(t){n.records[e.name][t]&&(r=!0)})}),r}function a(t,n){n.nodes.push(t),e(function(e){o.each(i(t,e)||[],function(t){n.records[e.name][t]=!0})})}return function(i){function o(t){!n(t,s)&&r(t,s)&&(a(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!i)return s;a(i,s);var l;do l=!1,t(o);while(l);return s}},l.defaultEmphasis=function(t,e){if(t){var i=t.emphasis=t.emphasis||{},n=t.normal=t.normal||{};o.each(e,function(t){var e=o.retrieve(i[t],n[t]);null!=e&&(i[t]=e)})}},l.createDataFormatModel=function(t,e,i){var n=new a;return o.mixin(n,l.dataFormatMixin),n.seriesIndex=t.seriesIndex,n.name=t.name||"",n.getData=function(){return e},n.getRawDataArray=function(){return i},n},l.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},l.converDataValue=function(t,e){var i=e&&e.type;return"ordinal"===i?t:("time"!==i||isFinite(t)||null==t||"-"===t||(t=+r.parseDate(t)),null==t||""===t?NaN:+t)},l.dataFormatMixin={getDataParams:function(t){var e=this.getData(),i=this.seriesIndex,n=this.name,r=this.getRawValue(t),o=e.getRawIndex(t),a=e.getName(t,!0),s=this.getRawDataArray(),l=s&&s[o];return{seriesIndex:i,seriesName:n,name:a,dataIndex:o,data:l,value:r,color:e.getItemVisual(t,"color"),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,i){e=e||"normal";var r=this.getData(),o=r.getItemModel(t),a=this.getDataParams(t);return null==i&&(i=o.get(["label",e,"formatter"])),"function"==typeof i?(a.status=e,i(a)):"string"==typeof i?n.formatTpl(i,a):void 0},getRawValue:function(t){var e=this.getData().getItemModel(t);if(e&&null!=e.option){var i=e.option;return o.isObject(i)&&!o.isArray(i)?i.value:i}}},l.mappingToExists=function(t,e){e=(e||[]).slice();var i=o.map(t||[],function(t,e){return{exist:t}});return o.each(e,function(t,n){if(o.isObject(t))for(var r=0;r=i.length&&i.push({option:t})}}),i},l.isIdInner=function(t){return o.isObject(t)&&t.id&&0===(t.id+"").indexOf("\x00_ec_\x00")},t.exports=l},function(t,e,i){"use strict";function n(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n}var r=i(5),o=i(19),a=r.applyTransform,s=Math.min,l=Math.abs,h=Math.max;n.prototype={constructor:n,union:function(t){var e=s(t.x,this.x),i=s(t.y,this.y);this.width=h(t.x+t.width,this.x+this.width)-e,this.height=h(t.y+t.height,this.y+this.height)-i,this.x=e,this.y=i},applyTransform:function(){var t=[],e=[];return function(i){i&&(t[0]=this.x,t[1]=this.y,e[0]=this.x+this.width,e[1]=this.y+this.height,a(t,t,i),a(e,e,i),this.x=s(t[0],e[0]),this.y=s(t[1],e[1]),this.width=l(e[0]-t[0]),this.height=l(e[1]-t[1]))}}(),calculateTransform:function(t){var e=this,i=t.width/e.width,n=t.height/e.height,r=o.create();return o.translate(r,r,[-e.x,-e.y]),o.scale(r,r,[i,n]),o.translate(r,r,[t.x,t.y]),r},intersect:function(t){var e=this,i=e.x,n=e.x+e.width,r=e.y,o=e.y+e.height,a=t.x,s=t.x+t.width,l=t.y,h=t.y+t.height;return!(a>n||i>s||l>o||r>h)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new n(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height}},t.exports=n},function(t,e,i){function n(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))}function r(t){return t.toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()})}function o(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function a(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function s(t,e){return"{"+t+(null==e?"":e)+"}"}function l(t,e){u.isArray(e)||(e=[e]);var i=e.length;if(!i)return"";for(var n=e[0].$vars,r=0;ra;a++)for(var l=0;lt?"0"+t:t}var u=i(1),d=i(4),f=["a","b","c","d","e","f","g"];t.exports={normalizeCssArray:o,addCommas:n,toCamelCase:r,encodeHTML:a,formatTpl:l,formatTime:h}},function(t,e,i){function n(t){var e=[];return o.each(c.getClassesByMainType(t),function(t){a.apply(e,t.prototype.dependencies||[])}),o.map(e,function(t){return l.parseClassType(t).main})}var r=i(12),o=i(1),a=Array.prototype.push,s=i(41),l=i(20),h=i(11),c=r.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,init:function(t,e,i,n){this.mergeDefaultAndTheme(this.option,this.ecModel)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?h.getLayoutParams(t):{},r=e.getTheme();o.merge(t,r.get(this.mainType)),o.merge(t,this.getDefaultOption()),i&&h.mergeLayoutParam(t,n,i)},mergeOption:function(t){o.merge(this.option,t,!0);var e=this.layoutMode;e&&h.mergeLayoutParam(this.option,t,e)},optionUpdated:function(t){},getDefaultOption:function(){if(!this.hasOwnProperty("__defaultOption")){for(var t=[],e=this.constructor;e;){var i=e.prototype.defaultOption;i&&t.push(i),e=e.superClass}for(var n={},r=t.length-1;r>=0;r--)n=o.merge(n,t[r],!0);this.__defaultOption=n}return this.__defaultOption}});l.enableClassExtend(c,function(t,e,i,n){o.extend(this,n),this.uid=s.getUID("componentModel")}),l.enableClassManagement(c,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(c),s.enableTopologicalTravel(c,n),o.mixin(c,i(116)),t.exports=c},function(t,e,i){"use strict";function n(t,e,i,n,r){var o=0,a=0;null==n&&(n=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,h){var c,u,d=l.position,f=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);c=o+m,c>n||l.newline?(o=0,c=m,a+=s+i,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);u=a+v,u>r||l.newline?(o+=s+i,a=0,u=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=a,"horizontal"===t?o=c+i:a=u+i)})}var r=i(1),o=i(8),a=i(4),s=i(9),l=a.parsePercent,h=r.each,c={},u=["left","right","top","bottom","width","height"];c.box=n,c.vbox=r.curry(n,"vertical"),c.hbox=r.curry(n,"horizontal"),c.getAvailableSize=function(t,e,i){var n=e.width,r=e.height,o=l(t.x,n),a=l(t.y,r),h=l(t.x2,n),c=l(t.y2,r);return(isNaN(o)||isNaN(parseFloat(t.x)))&&(o=0),(isNaN(h)||isNaN(parseFloat(t.x2)))&&(h=n),(isNaN(a)||isNaN(parseFloat(t.y)))&&(a=0),(isNaN(c)||isNaN(parseFloat(t.y2)))&&(c=r),i=s.normalizeCssArray(i||0),{width:Math.max(h-o-i[1]-i[3],0),height:Math.max(c-a-i[0]-i[2],0)}},c.getLayoutRect=function(t,e,i){i=s.normalizeCssArray(i||0);var n=e.width,r=e.height,a=l(t.left,n),h=l(t.top,r),c=l(t.right,n),u=l(t.bottom,r),d=l(t.width,n),f=l(t.height,r),p=i[2]+i[0],g=i[1]+i[3],m=t.aspect;switch(isNaN(d)&&(d=n-c-g-a),isNaN(f)&&(f=r-u-p-h),isNaN(d)&&isNaN(f)&&(m>n/r?d=.8*n:f=.8*r),null!=m&&(isNaN(d)&&(d=m*f),isNaN(f)&&(f=d/m)),isNaN(a)&&(a=n-c-d-g),isNaN(h)&&(h=r-u-f-p),t.left||t.right){case"center":a=n/2-d/2-i[3];break;case"right":a=n-d-g}switch(t.top||t.bottom){case"middle":case"center":h=r/2-f/2-i[0];break;case"bottom":h=r-f-p}a=a||0,h=h||0,isNaN(d)&&(d=n-a-(c||0)),isNaN(f)&&(f=r-h-(u||0));var v=new o(a+i[3],h+i[0],d,f);return v.margin=i,v},c.positionGroup=function(t,e,i,n){var o=t.getBoundingRect();e=r.extend(r.clone(e),{width:o.width,height:o.height}),e=c.getLayoutRect(e,i,n),t.position=[e.x-o.x,e.y-o.y]},c.mergeLayoutParam=function(t,e,i){function n(n){var r={},s=0,l={},c=0,u=i.ignoreSize?1:2;if(h(n,function(e){l[e]=t[e]}),h(n,function(t){o(e,t)&&(r[t]=l[t]=e[t]),a(r,t)&&s++,a(l,t)&&c++}),c!==u&&s){if(s>=u)return r;for(var d=0;d';return e?c+s(this.name)+" : "+o:s(this.name)+"
            "+c+(a?s(a)+" : "+o:o)},restoreData:function(){this._data=this._dataBeforeProcessed.cloneShallow()}});n.mixin(h,o.dataFormatMixin),t.exports=h},function(t,e,i){(function(e){function n(t){return d.isArray(t)||(t=[t]),t}function r(t,e){var i=t.dimensions,n=new v(d.map(i,t.getDimensionInfo,t),t.hostModel);m(n,t,t._wrappedMethods);for(var r=n._storage={},o=t._storage,a=0;a=0?r[s]=new l.constructor(o[s].length):r[s]=o[s]}return n}var o="undefined",a="undefined"==typeof window?e:window,s=typeof a.Float64Array===o?Array:a.Float64Array,l=typeof a.Int32Array===o?Array:a.Int32Array,h={"float":s,"int":l,ordinal:Array,number:Array,time:Array},c=i(12),u=i(52),d=i(1),f=i(7),p=d.isObject,g=["stackedOn","_nameList","_idList","_rawData"],m=function(t,e,i){d.each(g.concat(i||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])})},v=function(t,e){t=t||["x","y"];for(var i={},n=[],r=0;r0&&(b+="__ec__"+c[w]),c[w]++),b&&(l[u]=b)}this._nameList=e,this._idList=l},y.count=function(){return this.indices.length},y.get=function(t,e,i){var n=this._storage,r=this.indices[e];if(null==r)return NaN;var o=n[t]&&n[t][r];if(i){var a=this._dimensionInfos[t];if(a&&a.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(o>=0&&l>0||0>=o&&0>l)&&(o+=l),s=s.stackedOn}}return o},y.getValues=function(t,e,i){var n=[];d.isArray(t)||(i=e,e=t,t=this.dimensions);for(var r=0,o=t.length;o>r;r++)n.push(this.get(t[r],e,i));return n},y.hasValue=function(t){for(var e=this.dimensions,i=this._dimensionInfos,n=0,r=e.length;r>n;n++)if("ordinal"!==i[e[n]].type&&isNaN(this.get(e[n],t)))return!1;return!0},y.getDataExtent=function(t,e){var i=this._storage[t],n=this.getDimensionInfo(t);e=n&&n.stackable&&e;var r,o=(this._extent||(this._extent={}))[t+!!e];if(o)return o;if(i){for(var a=1/0,s=-(1/0),l=0,h=this.count();h>l;l++)r=this.get(t,l,e),a>r&&(a=r),r>s&&(s=r);return this._extent[t+e]=[a,s]}return[1/0,-(1/0)]},y.getSum=function(t,e){var i=this._storage[t],n=0;if(i)for(var r=0,o=this.count();o>r;r++){ +var a=this.get(t,r,e);isNaN(a)||(n+=a)}return n},y.indexOf=function(t,e){var i=this._storage,n=i[t],r=this.indices;if(n)for(var o=0,a=r.length;a>o;o++){var s=r[o];if(n[s]===e)return o}return-1},y.indexOfName=function(t){for(var e=this.indices,i=this._nameList,n=0,r=e.length;r>n;n++){var o=e[n];if(i[o]===t)return n}return-1},y.indexOfNearest=function(t,e,i){var n=this._storage,r=n[t];if(r){for(var o=Number.MAX_VALUE,a=-1,s=0,l=this.count();l>s;s++){var h=e-this.get(t,s,i),c=Math.abs(h);(o>c||c===o&&h>0)&&(o=c,a=s)}return a}return-1},y.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},y.getName=function(t){return this._nameList[this.indices[t]]||""},y.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},y.each=function(t,e,i,r){"function"==typeof t&&(r=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var o=[],a=t.length,s=this.indices;r=r||this;for(var l=0;lh;h++)o[h]=this.get(t[h],l,i);o[h]=l,e.apply(r,o)}},y.filterSelf=function(t,e,i,r){"function"==typeof t&&(r=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var o=[],a=[],s=t.length,l=this.indices;r=r||this;for(var h=0;hu;u++)a[u]=this.get(t[u],h,i);a[u]=h,c=e.apply(r,a)}c&&o.push(l[h])}return this.indices=o,this._extent={},this},y.mapArray=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},i,n),r},y.map=function(t,e,i,o){t=d.map(n(t),this.getDimension,this);var a=r(this,t),s=a.indices=this.indices,l=a._storage,h=[];return this.each(t,function(){var i=arguments[arguments.length-1],n=e&&e.apply(this,arguments);if(null!=n){"number"==typeof n&&(h[0]=n,n=h);for(var r=0;rg;g+=d){d>p-g&&(d=p-g,c.length=d);for(var m=0;d>m;m++){var v=l[g+m];c[m]=f[v],u[m]=v}var y=i(c),v=u[n(c,y)||0];f[v]=y,h.push(v)}return o},y.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new c(this._rawData[t],e,e.ecModel)},y.diff=function(t){var e=this._idList,i=t&&t._idList;return new u(t?t.indices:[],this.indices,function(t){return i[t]||t+""},function(t){return e[t]||t+""})},y.getVisual=function(t){var e=this._visual;return e&&e[t]},y.setVisual=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},y.setLayout=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},y.getLayout=function(t){return this._layout[t]},y.getItemLayout=function(t){return this._itemLayouts[t]},y.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?d.extend(this._itemLayouts[t]||{},e):e},y.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],r=n&&n[e];return null!=r||i?r:this.getVisual(e)},y.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{};if(this._itemVisuals[t]=n,p(e))for(var r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);else n[e]=i};var x=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex};y.setItemGraphicEl=function(t,e){var i=this.hostModel;e&&(e.dataIndex=t,e.seriesIndex=i&&i.seriesIndex,"group"===e.type&&e.traverse(x,e)),this._graphicEls[t]=e},y.getItemGraphicEl=function(t){return this._graphicEls[t]},y.eachItemGraphicEl=function(t,e){d.each(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},y.cloneShallow=function(){var t=d.map(this.dimensions,this.getDimensionInfo,this),e=new v(t,this.hostModel);return e._storage=this._storage,m(e,this,this._wrappedMethods),e.indices=this.indices.slice(),e},y.wrapMethod=function(t,e){var i=this[t];"function"==typeof i&&(this._wrappedMethods=this._wrappedMethods||[],this._wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.call(this,t)})},t.exports=v}).call(e,function(){return this}())},function(t,e){function i(t){var e={},i={},n=t.match(/Web[kK]it[\/]{0,1}([\d.]+)/),r=t.match(/(Android);?[\s\/]+([\d.]+)?/),o=t.match(/(iPad).*OS\s([\d_]+)/),a=t.match(/(iPod)(.*OS\s([\d_]+))?/),s=!o&&t.match(/(iPhone\sOS)\s([\d_]+)/),l=t.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),h=l&&t.match(/TouchPad/),c=t.match(/Kindle\/([\d.]+)/),u=t.match(/Silk\/([\d._]+)/),d=t.match(/(BlackBerry).*Version\/([\d.]+)/),f=t.match(/(BB10).*Version\/([\d.]+)/),p=t.match(/(RIM\sTablet\sOS)\s([\d.]+)/),g=t.match(/PlayBook/),m=t.match(/Chrome\/([\d.]+)/)||t.match(/CriOS\/([\d.]+)/),v=t.match(/Firefox\/([\d.]+)/),y=n&&t.match(/Mobile\//)&&!m,x=t.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!m,_=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),b=t.match(/Edge\/([\d.]+)/);return(i.webkit=!!n)&&(i.version=n[1]),r&&(e.android=!0,e.version=r[2]),s&&!a&&(e.ios=e.iphone=!0,e.version=s[2].replace(/_/g,".")),o&&(e.ios=e.ipad=!0,e.version=o[2].replace(/_/g,".")),a&&(e.ios=e.ipod=!0,e.version=a[3]?a[3].replace(/_/g,"."):null),l&&(e.webos=!0,e.version=l[2]),h&&(e.touchpad=!0),d&&(e.blackberry=!0,e.version=d[2]),f&&(e.bb10=!0,e.version=f[2]),p&&(e.rimtabletos=!0,e.version=p[2]),g&&(i.playbook=!0),c&&(e.kindle=!0,e.version=c[1]),u&&(i.silk=!0,i.version=u[1]),!u&&e.android&&t.match(/Kindle Fire/)&&(i.silk=!0),m&&(i.chrome=!0,i.version=m[1]),v&&(i.firefox=!0,i.version=v[1]),_&&(i.ie=!0,i.version=_[1]),y&&(t.match(/Safari/)||e.ios)&&(i.safari=!0),x&&(i.webview=!0),_&&(i.ie=!0,i.version=_[1]),b&&(i.edge=!0,i.version=b[1]),e.tablet=!!(o||g||r&&!t.match(/Mobile/)||v&&t.match(/Tablet/)||_&&!t.match(/Phone/)&&t.match(/Touch/)),e.phone=!(e.tablet||e.ipod||!(r||s||l||d||f||m&&t.match(/Android/)||m&&t.match(/CriOS\/([\d.]+)/)||v&&t.match(/Mobile/)||_&&t.match(/Touch/))),{browser:i,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!i.ie&&!i.edge,pointerEventsSupported:"onpointerdown"in window&&(i.edge||i.ie&&i.version>=10)}}var n={};n="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:i(navigator.userAgent),t.exports=n},function(t,e){var i=function(t){this.colorStops=t||[]};i.prototype={constructor:i,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=i},function(t,e,i){function n(t,e){var i=t+":"+e;if(h[i])return h[i];for(var n=(t+"").split("\n"),r=0,o=0,a=n.length;a>o;o++)r=Math.max(p.measureText(n[o],e).width,r);return c>u&&(c=0,h={}),c++,h[i]=r,r}function r(t,e,i,r){var o=((t||"")+"").split("\n").length,a=n(t,e),s=n("国",e),l=o*s,h=new f(0,0,a,l);switch(h.lineHeight=s,r){case"bottom":case"alphabetic":h.y-=s;break;case"middle":h.y-=s/2}switch(i){case"end":case"right":h.x-=h.width;break;case"center":h.x-=h.width/2}return h}function o(t,e,i,n){var r=e.x,o=e.y,a=e.height,s=e.width,l=i.height,h=a/2-l/2,c="left";switch(t){case"left":r-=n,o+=h,c="right";break;case"right":r+=n+s,o+=h,c="left";break;case"top":r+=s/2,o-=n+l,c="center";break;case"bottom":r+=s/2,o+=a+n,c="center";break;case"inside":r+=s/2,o+=h,c="center";break;case"insideLeft":r+=n,o+=h,c="left";break;case"insideRight":r+=s-n,o+=h,c="right";break;case"insideTop":r+=s/2,o+=n,c="center";break;case"insideBottom":r+=s/2,o+=a-l-n,c="center";break;case"insideTopLeft":r+=n,o+=n,c="left";break;case"insideTopRight":r+=s-n,o+=n,c="right";break;case"insideBottomLeft":r+=n,o+=a-l-n;break;case"insideBottomRight":r+=s-n,o+=a-l-n,c="right"}return{x:r,y:o,textAlign:c,textBaseline:"top"}}function a(t,e,i,r){if(!i)return"";r=d.defaults({ellipsis:"...",minCharacters:3,maxIterations:3,cnCharWidth:n("国",e),ascCharWidth:n("a",e)},r,!0),i-=n(r.ellipsis);for(var o=(t+"").split("\n"),a=0,l=o.length;l>a;a++)o[a]=s(o[a],e,i,r);return o.join("\n")}function s(t,e,i,r){for(var o=0;;o++){var a=n(t,e);if(i>a||o>=r.maxIterations){t+=r.ellipsis;break}var s=0===o?l(t,i,r):Math.floor(t.length*i/a);if(sr&&e>n;r++){var a=t.charCodeAt(r);n+=a>=0&&127>=a?i.ascCharWidth:i.cnCharWidth}return r}var h={},c=0,u=5e3,d=i(1),f=i(8),p={getWidth:n,getBoundingRect:r,adjustTextPositionOnRect:o,ellipsis:a,measureText:function(t,e){var i=d.getContext();return i.font=e,i.measureText(t)}};t.exports=p},function(t,e,i){"use strict";function n(t){return t>-w&&w>t}function r(t){return t>w||-w>t}function o(t,e,i,n,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*n+3*o*i)}function a(t,e,i,n,r){var o=1-r;return 3*(((e-t)*o+2*(i-e)*r)*o+(n-i)*r*r)}function s(t,e,i,r,o,a){var s=r+3*(e-i)-t,l=3*(i-2*e+t),h=3*(e-t),c=t-o,u=l*l-3*s*h,d=l*h-9*s*c,f=h*h-3*l*c,p=0;if(n(u)&&n(d))if(n(l))a[0]=0;else{var g=-h/l;g>=0&&1>=g&&(a[p++]=g)}else{var m=d*d-4*u*f;if(n(m)){var v=d/u,g=-l/s+v,y=-v/2;g>=0&&1>=g&&(a[p++]=g),y>=0&&1>=y&&(a[p++]=y)}else if(m>0){var x=b(m),w=u*l+1.5*s*(-d+x),M=u*l+1.5*s*(-d-x);w=0>w?-_(-w,A):_(w,A),M=0>M?-_(-M,A):_(M,A);var g=(-l-(w+M))/(3*s);g>=0&&1>=g&&(a[p++]=g)}else{var T=(2*u*l-3*s*d)/(2*b(u*u*u)),C=Math.acos(T)/3,I=b(u),k=Math.cos(C),g=(-l-2*I*k)/(3*s),y=(-l+I*(k+S*Math.sin(C)))/(3*s),L=(-l+I*(k-S*Math.sin(C)))/(3*s);g>=0&&1>=g&&(a[p++]=g),y>=0&&1>=y&&(a[p++]=y),L>=0&&1>=L&&(a[p++]=L)}}return p}function l(t,e,i,o,a){var s=6*i-12*e+6*t,l=9*e+3*o-3*t-9*i,h=3*e-3*t,c=0;if(n(l)){if(r(s)){var u=-h/s;u>=0&&1>=u&&(a[c++]=u)}}else{var d=s*s-4*l*h;if(n(d))a[0]=-s/(2*l);else if(d>0){var f=b(d),u=(-s+f)/(2*l),p=(-s-f)/(2*l);u>=0&&1>=u&&(a[c++]=u),p>=0&&1>=p&&(a[c++]=p)}}return c}function h(t,e,i,n,r,o){var a=(e-t)*r+t,s=(i-e)*r+e,l=(n-i)*r+i,h=(s-a)*r+a,c=(l-s)*r+s,u=(c-h)*r+h;o[0]=t,o[1]=a,o[2]=h,o[3]=u,o[4]=u,o[5]=c,o[6]=l,o[7]=n}function c(t,e,i,n,r,a,s,l,h,c,u){var d,f,p,g,m,v=.005,y=1/0;T[0]=h,T[1]=c;for(var _=0;1>_;_+=.05)C[0]=o(t,i,r,s,_),C[1]=o(e,n,a,l,_),g=x(T,C),y>g&&(d=_,y=g);y=1/0;for(var w=0;32>w&&!(M>v);w++)f=d-v,p=d+v,C[0]=o(t,i,r,s,f),C[1]=o(e,n,a,l,f),g=x(C,T),f>=0&&y>g?(d=f,y=g):(I[0]=o(t,i,r,s,p),I[1]=o(e,n,a,l,p),m=x(I,T),1>=p&&y>m?(d=p,y=m):v*=.5);return u&&(u[0]=o(t,i,r,s,d),u[1]=o(e,n,a,l,d)),b(y)}function u(t,e,i,n){var r=1-n;return r*(r*t+2*n*e)+n*n*i}function d(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function f(t,e,i,o,a){var s=t-2*e+i,l=2*(e-t),h=t-o,c=0;if(n(s)){if(r(l)){var u=-h/l;u>=0&&1>=u&&(a[c++]=u)}}else{var d=l*l-4*s*h;if(n(d)){var u=-l/(2*s);u>=0&&1>=u&&(a[c++]=u)}else if(d>0){var f=b(d),u=(-l+f)/(2*s),p=(-l-f)/(2*s);u>=0&&1>=u&&(a[c++]=u),p>=0&&1>=p&&(a[c++]=p)}}return c}function p(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function g(t,e,i,n,r){var o=(e-t)*n+t,a=(i-e)*n+e,s=(a-o)*n+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=i}function m(t,e,i,n,r,o,a,s,l){var h,c=.005,d=1/0;T[0]=a,T[1]=s;for(var f=0;1>f;f+=.05){C[0]=u(t,i,r,f),C[1]=u(e,n,o,f);var p=x(T,C);d>p&&(h=f,d=p)}d=1/0;for(var g=0;32>g&&!(M>c);g++){var m=h-c,v=h+c;C[0]=u(t,i,r,m),C[1]=u(e,n,o,m);var p=x(C,T);if(m>=0&&d>p)h=m,d=p;else{I[0]=u(t,i,r,v),I[1]=u(e,n,o,v);var y=x(I,T);1>=v&&d>y?(h=v,d=y):c*=.5}}return l&&(l[0]=u(t,i,r,h),l[1]=u(e,n,o,h)),b(d)}var v=i(5),y=v.create,x=v.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,M=1e-4,S=b(3),A=1/3,T=y(),C=y(),I=y();t.exports={cubicAt:o,cubicDerivativeAt:a,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:h,cubicProjectPoint:c,quadraticAt:u,quadraticDerivativeAt:d,quadraticRootAt:f,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:m}},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(){var t=new i(6);return n.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,i){var n=e[0]*i[0]+e[2]*i[1],r=e[1]*i[0]+e[3]*i[1],o=e[0]*i[2]+e[2]*i[3],a=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],l=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t},translate:function(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t},rotate:function(t,e,i){var n=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],h=Math.sin(i),c=Math.cos(i);return t[0]=n*c+a*h,t[1]=-n*h+a*c,t[2]=r*c+s*h,t[3]=-r*h+c*s,t[4]=c*o+h*l,t[5]=c*l-h*o,t},scale:function(t,e,i){var n=i[0],r=i[1];return t[0]=e[0]*n,t[1]=e[1]*r,t[2]=e[2]*n,t[3]=e[3]*r,t[4]=e[4]*n,t[5]=e[5]*r,t},invert:function(t,e){var i=e[0],n=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=i*a-o*n;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-n*l,t[3]=i*l,t[4]=(n*s-a*r)*l,t[5]=(o*r-i*s)*l,t):null}};t.exports=n},function(t,e,i){function n(t,e){var i=o.slice(arguments,2);return this.superClass.prototype[e].apply(t,i)}function r(t,e,i){return this.superClass.prototype[e].apply(t,i)}var o=i(1),a={},s=".",l="___EC__COMPONENT__CONTAINER___",h=a.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(s),e.main=t[0]||"",e.sub=t[1]||""),e};a.enableClassExtend=function(t,e){t.extend=function(i){var a=function(){e&&e.apply(this,arguments),t.apply(this,arguments)};return o.extend(a.prototype,i),a.extend=this.extend,a.superCall=n,a.superApply=r,o.inherits(a,this),a.superClass=this,a}},a.enableClassManagement=function(t,e){function i(t){var e=n[t.main];return e&&e[l]||(e=n[t.main]={},e[l]=!0),e}e=e||{};var n={};if(t.registerClass=function(t,e){if(e)if(e=h(e),e.sub){if(e.sub!==l){var r=i(e);r[e.sub]=t}}else{if(n[e.main])throw new Error(e.main+"exists.");n[e.main]=t}return t},t.getClass=function(t,e,i){var r=n[t];if(r&&r[l]&&(r=e?r[e]:null),i&&!r)throw new Error("Component "+t+"."+(e||"")+" not exists. Load it first.");return r},t.getClassesByMainType=function(t){t=h(t);var e=[],i=n[t.main];return i&&i[l]?o.each(i,function(t,i){i!==l&&e.push(t)}):e.push(i),e},t.hasClass=function(t){return t=h(t),!!n[t.main]},t.getAllClassMainTypes=function(){var t=[];return o.each(n,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=h(t);var e=n[t.main];return e&&e[l]},t.parseClassType=h,e.registerWhenExtend){var r=t.extend;r&&(t.extend=function(e){var i=r.call(this,e);return t.registerClass(i,e.type)})}return t},a.setReadOnly=function(t,e){},t.exports=a},function(t,e,i){var n=Array.prototype.slice,r=i(1),o=r.indexOf,a=function(){this._$handlers={}};a.prototype={constructor:a,one:function(t,e,i){var n=this._$handlers;return e&&t?(n[t]||(n[t]=[]),o(n[t],t)>=0?this:(n[t].push({h:e,one:!0,ctx:i||this}),this)):this},on:function(t,e,i){var n=this._$handlers;return e&&t?(n[t]||(n[t]=[]),n[t].push({h:e,one:!1,ctx:i||this}),this):this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var i=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(i[t]){for(var n=[],r=0,o=i[t].length;o>r;r++)i[t][r].h!=e&&n.push(i[t][r]);i[t]=n}i[t]&&0===i[t].length&&delete i[t]}else delete i[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>3&&(e=n.call(e,1));for(var r=this._$handlers[t],o=r.length,a=0;o>a;){switch(i){case 1:r[a].h.call(r[a].ctx);break;case 2:r[a].h.call(r[a].ctx,e[1]);break;case 3:r[a].h.call(r[a].ctx,e[1],e[2]);break;default:r[a].h.apply(r[a].ctx,e)}r[a].one?(r.splice(a,1),o--):a++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>4&&(e=n.call(e,1,e.length-1));for(var r=e[e.length-1],o=this._$handlers[t],a=o.length,s=0;a>s;){switch(i){case 1:o[s].h.call(r);break;case 2:o[s].h.call(r,e[1]);break;case 3:o[s].h.call(r,e[1],e[2]);break;default:o[s].h.apply(r,e)}o[s].one?(o.splice(s,1),a--):s++}}return this}},t.exports=a},function(t,e){function i(t){return t=Math.round(t),0>t?0:t>255?255:t}function n(t){return t=Math.round(t),0>t?0:t>360?360:t}function r(t){return 0>t?0:t>1?1:t}function o(t){return i(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function a(t){return r(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function s(t,e,i){return 0>i?i+=1:i>1&&(i-=1),1>6*i?t+(e-t)*i*6:1>2*i?e:2>3*i?t+(e-t)*(2/3-i)*6:t}function l(t,e,i){return t+(e-t)*i}function h(t){if(t){t+="";var e=t.replace(/ /g,"").toLowerCase();if(e in _)return _[e].slice();if("#"!==e.charAt(0)){var i=e.indexOf("("),n=e.indexOf(")");if(-1!==i&&n+1===e.length){var r=e.substr(0,i),s=e.substr(i+1,n-(i+1)).split(","),l=1;switch(r){case"rgba":if(4!==s.length)return;l=a(s.pop());case"rgb":if(3!==s.length)return;return[o(s[0]),o(s[1]),o(s[2]),l];case"hsla":if(4!==s.length)return;return s[3]=a(s[3]),c(s);case"hsl":if(3!==s.length)return;return c(s);default:return}}}else{if(4===e.length){var h=parseInt(e.substr(1),16);if(!(h>=0&&4095>=h))return;return[(3840&h)>>4|(3840&h)>>8,240&h|(240&h)>>4,15&h|(15&h)<<4,1]}if(7===e.length){var h=parseInt(e.substr(1),16);if(!(h>=0&&16777215>=h))return;return[(16711680&h)>>16,(65280&h)>>8,255&h,1]}}}}function c(t){var e=(parseFloat(t[0])%360+360)%360/360,n=a(t[1]),r=a(t[2]),o=.5>=r?r*(n+1):r+n-r*n,l=2*r-o,h=[i(255*s(l,o,e+1/3)),i(255*s(l,o,e)),i(255*s(l,o,e-1/3))];return 4===t.length&&(h[3]=t[3]),h}function u(t){if(t){var e,i,n=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(n,r,o),s=Math.max(n,r,o),l=s-a,h=(s+a)/2;if(0===l)e=0,i=0;else{i=.5>h?l/(s+a):l/(2-s-a);var c=((s-n)/6+l/2)/l,u=((s-r)/6+l/2)/l,d=((s-o)/6+l/2)/l;n===s?e=d-u:r===s?e=1/3+c-d:o===s&&(e=2/3+u-c),0>e&&(e+=1),e>1&&(e-=1)}var f=[360*e,i,h];return null!=t[3]&&f.push(t[3]),f}}function d(t,e){var i=h(t);if(i){for(var n=0;3>n;n++)0>e?i[n]=i[n]*(1-e)|0:i[n]=(255-i[n])*e+i[n]|0;return x(i,4===i.length?"rgba":"rgb")}}function f(t,e){var i=h(t);return i?((1<<24)+(i[0]<<16)+(i[1]<<8)+ +i[2]).toString(16).slice(1):void 0}function p(t,e,n){if(e&&e.length&&t>=0&&1>=t){n=n||[0,0,0,0];var r=t*(e.length-1),o=Math.floor(r),a=Math.ceil(r),s=e[o],h=e[a],c=r-o;return n[0]=i(l(s[0],h[0],c)),n[1]=i(l(s[1],h[1],c)),n[2]=i(l(s[2],h[2],c)),n[3]=i(l(s[3],h[3],c)),n}}function g(t,e,n){if(e&&e.length&&t>=0&&1>=t){var o=t*(e.length-1),a=Math.floor(o),s=Math.ceil(o),c=h(e[a]),u=h(e[s]),d=o-a,f=x([i(l(c[0],u[0],d)),i(l(c[1],u[1],d)),i(l(c[2],u[2],d)),r(l(c[3],u[3],d))],"rgba");return n?{color:f,leftIndex:a,rightIndex:s,value:o}:f}}function m(t,e){if(!(2!==t.length||t[1]0&&s>=l;l++)r.push({color:e[l],offset:(l-i.value)/o});return r.push({color:n.color,offset:1}),r}}function v(t,e,i,r){return t=h(t),t?(t=u(t),null!=e&&(t[0]=n(e)),null!=i&&(t[1]=a(i)),null!=r&&(t[2]=a(r)),x(c(t),"rgba")):void 0}function y(t,e){return t=h(t),t&&null!=e?(t[3]=r(e),x(t,"rgba")):void 0}function x(t,e){return"rgb"!==e&&"hsv"!==e&&"hsl"!==e||(t=t.slice(0,3)),e+"("+t.join(",")+")"}var _={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};t.exports={parse:h,lift:d,toHex:f,fastMapToColor:p,mapToColor:g,mapIntervalToColor:m,modifyHSL:v,modifyAlpha:y,stringify:x}},function(t,e,i){var n=i(124),r=i(37);i(125),i(123);var o=i(32),a=i(4),s=i(1),l=i(17),h={};h.getScaleExtent=function(t,e){var i=t.scale,n=i.getExtent(),r=n[1]-n[0];if("ordinal"===i.type)return isFinite(r)?n:[0,0];var o=e.getMin?e.getMin():e.get("min"),l=e.getMax?e.getMax():e.get("max"),h=e.getNeedCrossZero?e.getNeedCrossZero():!e.get("scale"),c=e.get("boundaryGap");s.isArray(c)||(c=[c||0,c||0]),c[0]=a.parsePercent(c[0],1),c[1]=a.parsePercent(c[1],1);var u=!0,d=!0;return null==o&&(o=n[0]-c[0]*r,u=!1),null==l&&(l=n[1]+c[1]*r,d=!1),"dataMin"===o&&(o=n[0]),"dataMax"===l&&(l=n[1]),h&&(o>0&&l>0&&!u&&(o=0),0>o&&0>l&&!d&&(l=0)),[o,l]},h.niceScaleExtent=function(t,e){var i=t.scale,n=h.getScaleExtent(t,e),r=null!=(e.getMin?e.getMin():e.get("min")),o=null!=(e.getMax?e.getMax():e.get("max"));i.setExtent(n[0],n[1]),i.niceExtent(e.get("splitNumber"),r,o);var a=e.get("interval");null!=a&&i.setInterval&&i.setInterval(a)},h.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new n(t.getCategories(),[1/0,-(1/0)]);case"value":return new r;default:return(o.getClass(e)||r).create(t)}},h.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(i>0&&n>0||0>i&&0>n)},h.getAxisLabelInterval=function(t,e,i,n){var r,o=0,a=0,s=1;e.length>40&&(s=Math.round(e.length/40));for(var h=0;h1?s:o*s},h.getFormattedLabels=function(t,e){var i=t.scale,n=i.getTicksLabels(),r=i.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",e)}}(e),s.map(n,e)):"function"==typeof e?s.map(r,function(n,r){return e("category"===t.type?i.getLabel(n):n,r)},this):n},t.exports=h},function(t,e,i){"use strict";var n=i(3),r=i(8),o=n.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+r,n+o),t.lineTo(i-r,n+o),t.closePath()}}),a=n.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+r,n),t.lineTo(i,n+o),t.lineTo(i-r,n),t.closePath()}}),s=n.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=n-o+a+s,h=Math.asin(s/a),c=Math.cos(h)*a,u=Math.sin(h),d=Math.cos(h);t.arc(i,l,a,Math.PI-h,2*Math.PI+h);var f=.6*a,p=.7*a;t.bezierCurveTo(i+c-u*f,l+s+d*f,i,n-p,i,n),t.bezierCurveTo(i,n-p,i-c+u*f,l+s+d*f,i-c,l+s),t.closePath()}}),l=n.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.height,n=e.width,r=e.x,o=e.y,a=n/3*2;t.moveTo(r,o),t.lineTo(r+a,o+i),t.lineTo(r,o+i/4*3),t.lineTo(r-a,o+i),t.lineTo(r,o),t.closePath()}}),h={line:n.Line,rect:n.Rect,roundRect:n.Rect,square:n.Rect,circle:n.Circle,diamond:a,pin:s,arrow:l,triangle:o},c={line:function(t,e,i,n,r){r.x1=t,r.y1=e+n/2,r.x2=t+i,r.y2=e+n/2},rect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r.height=n},roundRect:function(t,e,i,n,r){r.x=t,r.y=e,r.width=i,r.height=n,r.r=Math.min(i,n)/4},square:function(t,e,i,n,r){var o=Math.min(i,n);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.r=Math.min(i,n)/2},diamond:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r.height=n},pin:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r.height=n},arrow:function(t,e,i,n,r){r.x=t+i/2,r.y=e+n/2,r.width=i,r.height=n},triangle:function(t,e,i,n,r){r.cx=t+i/2,r.cy=e+n/2,r.width=i,r.height=n}},u={};for(var d in h)u[d]=new h[d];var f=n.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e){var i=e.symbolType,n=u[i];"none"!==e.symbolType&&(n||(i="rect",n=u[i]),c[i](e.x,e.y,e.width,e.height,n.shape),n.buildPath(t,n.shape))}}),p=function(t){if("image"!==this.type){var e=this.style,i=this.shape;i&&"line"===i.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty()}},g={createSymbol:function(t,e,i,o,a,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var h;return h=0===t.indexOf("image://")?new n.Image({style:{image:t.slice(8),x:e,y:i,width:o,height:a}}):0===t.indexOf("path://")?n.makePath(t.slice(7),{},new r(e,i,o,a)):new f({shape:{symbolType:t,x:e,y:i,width:o,height:a}}),h.__isEmptyBrush=l,h.setColor=p,h.setColor(s),h}};t.exports=g},function(t,e,i){function n(){this.group=new a,this.uid=s.getUID("viewChart")}function r(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var i=0;i=0&&(i.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToMap(t),t instanceof a&&t.addChildrenToStorage(e)),i&&i.refresh()},remove:function(t){var e=this.__zr,i=this.__storage,r=this._children,o=n.indexOf(r,t);return 0>o?this:(r.splice(o,1),t.parent=null,i&&(i.delFromMap(t.id),t instanceof a&&t.delChildrenFromStorage(i)),e&&e.refresh(),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;ei;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,i=0,n=this._len,r=0;e>r;r++)i+=t[r].len();v&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(var r=0;e>r;r++)for(var o=t[r].data,a=0;ae.length&&(this._expandData(),e=this.data);for(var i=0;io&&(o=r+o),o%=r,g-=o*c,v-=o*u;c>=0&&t>=g||0>c&&g>t;)n=this._dashIdx,i=a[n],g+=c*i,v+=u*i,this._dashIdx=(n+1)%y,c>0&&l>g||0>c&&g>l||s[n%2?"moveTo":"lineTo"](c>=0?d(g,t):f(g,t),u>=0?d(v,e):f(v,e));c=g-t,u=v-e,this._dashOffset=-m(c*c+u*u)},_dashedBezierTo:function(t,e,i,r,o,a){var s,l,h,c,u,d=this._dashSum,f=this._dashOffset,p=this._lineDash,g=this._ctx,v=this._xi,y=this._yi,x=n.cubicAt,_=0,b=this._dashIdx,w=p.length,M=0;for(0>f&&(f=d+f),f%=d,s=0;1>s;s+=.1)l=x(v,t,i,o,s+.1)-x(v,t,i,o,s),h=x(y,e,r,a,s+.1)-x(y,e,r,a,s),_+=m(l*l+h*h);for(;w>b&&(M+=p[b],!(M>f));b++);for(s=(M-f)/_;1>=s;)c=x(v,t,i,o,s),u=x(y,e,r,a,s),b%2?g.moveTo(c,u):g.lineTo(c,u),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(o,a),l=o-c,h=a-u,this._dashOffset=-m(l*l+h*h)},_dashedQuadraticTo:function(t,e,i,n){var r=i,o=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,r,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,v&&(this.data=new Float32Array(t)))},getBoundingRect:function(){l[0]=l[1]=c[0]=c[1]=Number.MAX_VALUE,h[0]=h[1]=u[0]=u[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,i=0,n=0,d=0,f=0;fl?a:l,p=a>l?1:a/l,g=a>l?l/a:1,m=Math.abs(a-l)>.001;m?(t.translate(r,o),t.rotate(u),t.scale(p,g),t.arc(0,0,f,h,h+c,1-d),t.scale(1/p,1/g),t.rotate(-u),t.translate(-r,-o)):t.arc(r,o,f,h,h+c,1-d);break;case s.R:t.rect(e[i++],e[i++],e[i++],e[i++]);break;case s.Z:t.closePath()}}}},y.CMD=s,t.exports=y},function(t,e){"use strict";function i(){this._coordinateSystems=[]}var n={};i.prototype={constructor:i,create:function(t,e){var i=[];for(var r in n){var o=n[r].create(t,e);o&&(i=i.concat(o))}this._coordinateSystems=i},update:function(t,e){for(var i=this._coordinateSystems,n=0;n=0)){var a=this.getShallow(o);null!=a&&(i[t[r][0]]=a)}}return i}}},function(t,e,i){function n(t,e,i,n){if(!e)return t;var s=o(e[0]),l=a.isArray(s)&&s.length||1;i=i||[],n=n||"extra";for(var h=0;l>h;h++)if(!t[h]){var c=i[h]||n+(h-i.length);t[h]=r(e,h)?{type:"ordinal",name:c}:c}return t}function r(t,e){for(var i=0,n=t.length;n>i;i++){var r=o(t[i]);if(!a.isArray(r))return!1;var r=r[e];if(null!=r&&isFinite(r))return!1;if(a.isString(r)&&"-"!==r)return!0}return!1}function o(t){return a.isArray(t)?t:a.isObject(t)?t.value:t}var a=i(1);t.exports=n},function(t,e,i){function n(){this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var r=i(20),o=n.prototype;o.parse=function(t){return t},o.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},o.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},o.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},o.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1])},o.getExtent=function(){return this._extent.slice()},o.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},o.getTicksLabels=function(){for(var t=[],e=this.getTicks(),i=0;i=0;if(r){var o="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];if(o){var a=n(t);e.zrX=o.clientX-a.left,e.zrY=o.clientY-a.top}}else{var s=n(t);e.zrX=e.clientX-s.left,e.zrY=e.clientY-s.top,e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3}return e}function o(t,e,i){l?t.addEventListener(e,i):t.attachEvent("on"+e,i)}function a(t,e,i){l?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}var s=i(21),l="undefined"!=typeof window&&!!window.addEventListener,h=l?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={normalizeEvent:r,addEventListener:o,removeEventListener:a,stop:h,Dispatcher:s}},function(t,e,i){"use strict";var n=i(3),r=i(1);i(51),i(96),i(2).extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new n.Rect({shape:t.coordinateSystem.getRect(),style:r.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0}))}})},function(t,e,i){function n(t){t=t||{},a.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new o(t.style),this._rect=null,this.__clipPaths=[]}var r=i(1),o=i(142),a=i(55),s=i(66);n.prototype={constructor:n,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect();return n.contain(i[0],i[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?a.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this}},r.inherits(n,a),r.mixin(n,s),t.exports=n},function(t,e,i){"use strict";function n(t){for(var e=0;e1){i=[];for(var o=0;r>o;o++)i[o]=n[e[o][t.categoryIndex||0]]}else i=n.slice(0)}}return i}var h=i(14),c=i(31),u=i(1),d=i(7),f=i(28),p=d.getDataItemValue,g=d.converDataValue,m={cartesian2d:function(t,e,i){var n=i.getComponent("xAxis",e.get("xAxisIndex")),r=i.getComponent("yAxis",e.get("yAxisIndex")),o=n.get("type"),l=r.get("type"),h=[{name:"x",type:s(o),stackable:a(o)},{name:"y",type:s(l),stackable:a(l)}],u="category"===o;return c(h,t,["x","y","z"]),{dimensions:h,categoryIndex:u?0:1,categoryAxisModel:u?n:"category"===l?r:null}},polar:function(t,e,i){var n=e.get("polarIndex")||0,r=function(t){return t.get("polarIndex")===n},o=i.findComponents({mainType:"angleAxis",filter:r})[0],l=i.findComponents({mainType:"radiusAxis",filter:r})[0],h=l.get("type"),u=o.get("type"),d=[{name:"radius",type:s(h),stackable:a(h)},{name:"angle",type:s(u),stackable:a(u)}],f="category"===u;return c(d,t,["radius","angle","value"]),{dimensions:d,categoryIndex:f?1:0,categoryAxisModel:f?o:"category"===h?l:null}},geo:function(t,e,i){return{dimensions:c([{name:"lng"},{name:"lat"}],t,["lng","lat","value"])}}};t.exports=o},function(t,e,i){var n=i(4),r=i(9),o=i(32),a=Math.floor,s=Math.ceil,l=o.extend({type:"interval",_interval:0,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),l.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){this._interval||this.niceTicks();var t=this._interval,e=this._extent,i=[],r=1e4;if(t){var o=this._niceExtent;e[0]r)return[];e[1]>o[1]&&i.push(e[1])}return i},getTicksLabels:function(){for(var t=[],e=this.getTicks(),i=0;ii&&(i=-i,e.reverse());var r=n.nice(i/t,!0),o=[n.round(s(e[0]/r)*r),n.round(a(e[1]/r)*r)];this._interval=r,this._niceExtent=o}},niceExtent:function(t,e,i){var r=this._extent;if(r[0]===r[1])if(0!==r[0]){var o=r[0]/2;r[0]-=o,r[1]+=o}else r[1]=1;var l=r[1]-r[0];isFinite(l)||(r[0]=0,r[1]=1),this.niceTicks(t);var h=this._interval;e||(r[0]=n.round(a(r[0]/h)*h)),i||(r[1]=n.round(s(r[1]/h)*h))}});l.create=function(){return new l},t.exports=l},function(t,e,i){function n(t){this.group=new o.Group,this._symbolCtor=t||a}function r(t,e,i){var n=t.getItemLayout(e);return n&&!isNaN(n[0])&&!isNaN(n[1])&&!(i&&i(e))&&"none"!==t.getItemVisual(e,"symbol")}var o=i(3),a=i(47),s=n.prototype;s.updateData=function(t,e){var i=this.group,n=t.hostModel,a=this._data,s=this._symbolCtor;t.diff(a).add(function(n){var o=t.getItemLayout(n);if(r(t,n,e)){var a=new s(t,n);a.attr("position",o),t.setItemGraphicEl(n,a),i.add(a)}}).update(function(l,h){var c=a.getItemGraphicEl(h),u=t.getItemLayout(l);return r(t,l,e)?(c?(c.updateData(t,l),o.updateProps(c,{position:u},n)):(c=new s(t,l),c.attr("position",u)),i.add(c),void t.setItemGraphicEl(l,c)):void i.remove(c)}).remove(function(t){var e=a.getItemGraphicEl(t);e&&e.fadeOut(function(){i.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,i){e.attr("position",t.getItemLayout(i))})},s.remove=function(t){var e=this.group,i=this._data;i&&(t?i.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=n},function(t,e,i){function n(t){var e={};return c(["start","end","startValue","endValue"],function(i){e[i]=t[i]}),e}function r(t,e,i,n){null!=i[e]&&null==i[t]&&(n[t]=null)}var o=i(1),a=i(15),s=i(2),l=i(7),h=i(167),c=o.each,u=l.eachAxisDim,d=s.extendComponentModel({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,angleAxisIndex:null,radiusAxisIndex:null,filterMode:"filter",throttle:100,start:0,end:100,startValue:null,endValue:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel;var r=n(t);this.mergeDefaultAndTheme(t,i),this.doInit(r)},mergeOption:function(t){var e=n(t);o.merge(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;a.canvasSupported||(e.realtime=!1),r("start","startValue",t,e),r("end","endValue",t,e),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,i,n,r){var o=this.dependentModels[e.axis][i],a=o.__dzAxisProxy||(o.__dzAxisProxy=new h(e.name,i,this,r));t[e.name+"_"+i]=a},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();u(function(e){var i=e.axisIndex;t[i]=l.normalizeToArray(t[i])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;u(function(i){null!=t[i.axisIndex]&&(e=!0)},this);var i=t.orient;return null==i&&e?"orient":e?void 0:(null==i&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),i=this.option;if(t){var n="vertical"===e?{dim:"y",axisIndex:"yAxisIndex",axis:"yAxis"}:{dim:"x",axisIndex:"xAxisIndex",axis:"xAxis"};this.dependentModels[n.axis].length&&(i[n.axisIndex]=[0],t=!1)}t&&u(function(e){if(t){var n=[],r=this.dependentModels[e.axis];if(r.length&&!n.length)for(var o=0,a=r.length;a>o;o++)"category"===r[o].get("type")&&n.push(o);i[e.axisIndex]=n,n.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&u(function(e){var n=i[e.axisIndex],r=t.get(e.axisIndex);o.indexOf(n,r)<0&&n.push(r)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var i=!0;return u(function(n){var r=t.get(n.axisIndex),o=this.dependentModels[n.axis][r];o&&o.get("type")===e||(i=!1)},this),i},getFirstTargetAxisModel:function(){var t;return u(function(e){if(null==t){var i=this.get(e.axisIndex);i.length&&(t=this.dependentModels[e.axis][i[0]])}},this),t},eachTargetAxis:function(t,e){var i=this.ecModel;u(function(n){c(this.get(n.axisIndex),function(r){t.call(e,n,r,this,i)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},setRawRange:function(t){c(["start","end","startValue","endValue"],function(e){this.option[e]=t[e]},this)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();return t?t.getDataPercentWindow():void 0},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var i=this.findRepresentativeAxisProxy();return i?i.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(){var t=this._axisProxies;for(var e in t)if(t.hasOwnProperty(e)&&t[e].hostedBy(this))return t[e];for(var e in t)if(t.hasOwnProperty(e)&&!t[e].hostedBy(this))return t[e]}});t.exports=d},function(t,e,i){var n=i(54);t.exports=n.extend({type:"dataZoom",render:function(t,e,i,n){this.dataZoomModel=t,this.ecModel=e,this.api=i},getTargetInfo:function(){function t(t,e,i,n){for(var r,o=0;o=0&&i.push(t)}),i}t.topologicalTravel=function(t,e,r,o){function a(t){h[t].entryCount--,0===h[t].entryCount&&c.push(t)}function s(t){u[t]=!0,a(t)}if(t.length){var l=i(e),h=l.graph,c=l.noEntryList,u={};for(n.each(t,function(t){u[t]=!0});c.length;){var d=c.pop(),f=h[d],p=!!u[d];p&&(r.call(o,d,f.originalDeps.slice()),delete u[d]),n.each(f.successor,p?s:a)}n.each(u,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){var i=1;"undefined"!=typeof window&&(i=Math.max(window.devicePixelRatio||1,1));var n={debugMode:0,devicePixelRatio:i};t.exports=n},function(t,e,i){function n(t,e){var i=t[1]-t[0],n=e,r=i/n/2;t[0]+=r,t[1]-=r}var r=i(4),o=r.linearMap,a=i(1),s=[0,1],l=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1};l.prototype={constructor:l,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&n>=t},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return r.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,e){var i=this._extent,r=this.scale;return t=r.normalize(t),this.onBand&&"ordinal"===r.type&&(i=i.slice(),n(i,r.count())),o(t,s,i,e)},coordToData:function(t,e){var i=this._extent,r=this.scale;this.onBand&&"ordinal"===r.type&&(i=i.slice(),n(i,r.count()));var a=o(t,i,s,e);return this.scale.scale(a)},getTicksCoords:function(){if(this.onBand){for(var t=this.getBands(),e=[],i=0;ia;a++)e.push([o*a/i+n,o*(a+1)/i+n]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0);0===i&&(i=1);var n=Math.abs(t[1]-t[0]);return Math.abs(n)/i}},t.exports=l},function(t,e){t.exports=function(t,e,i,n,r){n.eachRawSeriesByType(t,function(t){var r=t.getData(),o=t.get("symbol")||e,a=t.get("symbolSize");r.setVisual({legendSymbol:i||o,symbol:o,symbolSize:a}),n.isSeriesFiltered(t)||("function"==typeof a&&r.each(function(e){var i=t.getRawValue(e),n=t.getDataParams(e);r.setItemVisual(e,"symbolSize",a(i,n))}),r.each(function(t){var e=r.getItemModel(t),i=e.get("symbol",!0),n=e.get("symbolSize",!0);null!=i&&r.setItemVisual(t,"symbol",i),null!=n&&r.setItemVisual(t,"symbolSize",n)}))})}},function(t,e,i){var n=i(42);t.exports=function(){if(0!==n.debugMode)if(1==n.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(n.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,i){function n(t){r.call(this,t)}var r=i(35),o=i(8),a=i(1),s=i(60),l=i(140),h=new l(50);n.prototype={constructor:n,type:"image",brush:function(t){var e,i=this.style,n=i.image;if(e="string"==typeof n?this._image:n,!e&&n){var r=h.get(n);if(!r)return e=new Image,e.onload=function(){e.onload=null;for(var t=0;t0?"top":"bottom",n="center"):c(o-u)?(r=i>0?"bottom":"top",n="center"):(r="middle",n=o>0&&u>o?i>0?"right":"left":i>0?"left":"right"),{rotation:o,textAlign:n,verticalAlign:r}}function r(t,e,i){var n,r,o=h(-t.rotation),a=i[0]>i[1],s="start"===e&&!a||"start"!==e&&a;return c(o-u/2)?(r=s?"bottom":"top",n="center"):c(o-1.5*u)?(r=s?"top":"bottom",n="center"):(r="middle",n=1.5*u>o&&o>u/2?s?"left":"right":s?"right":"left"),{rotation:o,textAlign:n,verticalAlign:r}}var o=i(1),a=i(3),s=i(12),l=i(4),h=l.remRadian,c=l.isRadianAroundZero,u=Math.PI,d=function(t,e){this.opt=e,this.axisModel=t,o.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new a.Group({position:e.position.slice(),rotation:e.rotation})};d.prototype={constructor:d,hasBuilder:function(t){return!!f[t]},add:function(t){f[t].call(this)},getGroup:function(){return this.group}};var f={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var i=this.axisModel.axis.getExtent();this.group.add(new a.Line({shape:{x1:i[0],y1:0,x2:i[1],y2:0},style:o.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold,silent:!!t.silent,z2:1}))}},axisTick:function(){var t=this.axisModel;if(t.get("axisTick.show")){for(var e=t.axis,i=t.getModel("axisTick"),n=this.opt,r=i.getModel("lineStyle"),o=i.get("length"),s=g(i,n.labelInterval),l=e.getTicksCoords(),h=[],c=0;cu[1]?-1:1,f=["start"===s?u[0]-d*c:"end"===s?u[1]+d*c:(u[0]+u[1])/2,"middle"===s?t.labelOffset+l*c:0];o="middle"===s?n(t,t.rotation,l):r(t,s,u),this.group.add(new a.Text({style:{text:i,textFont:h.getFont(),fill:h.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:o.textAlign,textVerticalAlign:o.verticalAlign},position:f,rotation:o.rotation,silent:!0,z2:1}))}}},p=d.ifIgnoreOnTick=function(t,e,i){var n,r=t.scale;return"ordinal"===r.type&&("function"==typeof i?(n=r.getTicks()[e],!i(n,r.getLabel(n))):e%(i+1))},g=d.getInterval=function(t,e){var i=t.get("interval");return null!=i&&"auto"!=i||(i=e),i};t.exports=d},function(t,e,i){function n(t){return a.isObject(t)&&null!=t.value?t.value:t}function r(){return"category"===this.get("type")&&a.map(this.get("data"),n)}function o(){return s.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))}var a=i(1),s=i(23);t.exports={getFormattedLabels:o,getCategories:r}},function(t,e,i){"use strict";function n(t,e){return e.type||(e.data?"category":"value")}var r=i(10),o=i(1),a=i(61),s=r.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this._resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this._resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this._resetRange()},setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},getMin:function(){var t=this.option;return null!=t.rangeStart?t.rangeStart:t.min},getMax:function(){var t=this.option;return null!=t.rangeEnd?t.rangeEnd:t.max},getNeedCrossZero:function(){var t=this.option;return null!=t.rangeStart||null!=t.rangeEnd?!1:!t.scale},_resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}});o.merge(s.prototype,i(49));var l={gridIndex:0};a("x",s,n,l),a("y",s,n,l),t.exports=s},function(t,e,i){function n(t,e,i){return i.getComponent("grid",t.get("gridIndex"))===e}function r(t){var e,i=t.model,n=i.getFormattedLabels(),r=1,o=n.length;o>40&&(r=Math.ceil(o/40));for(var a=0;o>a;a+=r)if(!t.isLabelIgnored(a)){var s=i.getTextRect(n[a]);e?e.union(s):e=s}return e}function o(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this._model=t}function a(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}}var s=i(11),l=i(23),h=i(1),c=i(107),u=i(105),d=h.each,f=l.ifAxisCrossZero,p=l.niceScaleExtent;i(108);var g=o.prototype;g.type="grid",g.getRect=function(){return this._rect},g.update=function(t,e){function i(t){var e=n[t];for(var i in e){var r=e[i];if(r&&("category"===r.type||!f(r)))return!0}return!1}var n=this._axesMap;this._updateScale(t,this._model),d(n.x,function(t){p(t,t.model)}),d(n.y,function(t){p(t,t.model)}),d(n.x,function(t){i("y")&&(t.onZero=!1)}),d(n.y,function(t){i("x")&&(t.onZero=!1)}),this.resize(this._model,e)},g.resize=function(t,e){function i(){d(o,function(t){var e=t.isHorizontal(),i=e?[0,n.width]:[0,n.height],r=t.inverse?1:0;t.setExtent(i[r],i[1-r]),a(t,e?n.x:n.y)})}var n=s.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=n;var o=this._axesList;i(),t.get("containLabel")&&(d(o,function(t){if(!t.model.get("axisLabel.inside")){var e=r(t);if(e){var i=t.isHorizontal()?"height":"width",o=t.model.get("axisLabel.margin");n[i]-=e[i]+o,"top"===t.position?n.y+=e.height+o:"left"===t.position&&(n.x+=e.width+o)}}}),i())},g.getAxis=function(t,e){var i=this._axesMap[t];if(null!=i){if(null==e)for(var n in i)return i[n];return i[e]}},g.getCartesian=function(t,e){var i="x"+t+"y"+e;return this._coordsMap[i]},g._initCartesian=function(t,e,i){function r(i){return function(r,h){if(n(r,t,e)){var c=r.get("position");"x"===i?("top"!==c&&"bottom"!==c&&(c="bottom"),o[c]&&(c="top"===c?"bottom":"top")):("left"!==c&&"right"!==c&&(c="left"),o[c]&&(c="left"===c?"right":"left")),o[c]=!0;var d=new u(i,l.createScaleByModel(r),[0,0],r.get("type"),c),f="category"===d.type;d.onBand=f&&r.get("boundaryGap"),d.inverse=r.get("inverse"),d.onZero=r.get("axisLine.onZero"),r.axis=d,d.model=r,d.index=h,this._axesList.push(d), +a[i][h]=d,s[i]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},a={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",r("x"),this),e.eachComponent("yAxis",r("y"),this),s.x&&s.y?(this._axesMap=a,void d(a.x,function(t,e){d(a.y,function(i,n){var r="x"+e+"y"+n,o=new c(r);o.grid=this,this._coordsMap[r]=o,this._coordsList.push(o),o.addAxis(t),o.addAxis(i)},this)},this)):(this._axesMap={},void(this._axesList=[]))},g._updateScale=function(t,e){function i(t,e,i){d(i.coordDimToDataDim(e.dim),function(i){e.scale.unionExtent(t.getDataExtent(i,"ordinal"!==e.scale.type))})}h.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(r){if("cartesian2d"===r.get("coordinateSystem")){var o=r.get("xAxisIndex"),a=r.get("yAxisIndex"),s=t.getComponent("xAxis",o),l=t.getComponent("yAxis",a);if(!n(s,e,t)||!n(l,e,t))return;var h=this.getCartesian(o,a),c=r.getData(),u=h.getAxis("x"),d=h.getAxis("y");"list"===c.type&&(i(c,u,r),i(c,d,r))}},this)},o.create=function(t,e){var i=[];return t.eachComponent("grid",function(n,r){var a=new o(n,t,e);a.name="grid_"+r,a.resize(n,e),n.coordinateSystem=a,i.push(a)}),t.eachSeries(function(e){if("cartesian2d"===e.get("coordinateSystem")){var n=e.get("xAxisIndex"),r=t.getComponent("xAxis",n),o=i[r.get("gridIndex")];e.coordinateSystem=o.getCartesian(n,e.get("yAxisIndex"))}}),i},o.dimensions=c.prototype.dimensions,i(28).register("cartesian2d",o),t.exports=o},function(t,e){"use strict";function i(t){return t}function n(t,e,n,r){this._old=t,this._new=e,this._oldKeyGetter=n||i,this._newKeyGetter=r||i}function r(t,e,i){for(var n=0;nt;t++)this._add&&this._add(h[t]);else this._add&&this._add(h)}}},t.exports=n},function(t,e){t.exports=function(t,e,i){e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem,n=i.dimensions;e.each(n,function(t,n,r){var o;o=isNaN(t)||isNaN(n)?[NaN,NaN]:i.dataToPoint([t,n]),e.setItemLayout(r,o)},!0)})}},function(t,e,i){var n=i(26),r=i(41),o=i(20),a=function(){this.group=new n,this.uid=r.getUID("viewComponent")};a.prototype={constructor:a,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){}};var s=a.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,i,n){},o.enableClassExtend(a),o.enableClassManagement(a,{registerWhenExtend:!0}),t.exports=a},function(t,e,i){"use strict";var n=i(58),r=i(21),o=i(77),a=i(154),s=i(1),l=function(t){o.call(this,t),r.call(this,t),a.call(this,t),this.id=t.id||n()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty()},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty()},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty())},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;i.5?e:t}function s(t,e,i,n,r){var a=t.length;if(1==r)for(var s=0;a>s;s++)n[s]=o(t[s],e[s],i);else for(var l=t[0].length,s=0;a>s;s++)for(var h=0;l>h;h++)n[s][h]=o(t[s][h],e[s][h],i)}function l(t,e,i){var n=t.length,r=e.length;if(n!==r){var o=n>r;if(o)t.length=r;else for(var a=n;r>a;a++)t.push(1===i?e[a]:x.call(e[a]))}}function h(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)return!1;if(1===i){for(var r=0;n>r;r++)if(t[r]!==e[r])return!1}else for(var o=t[0].length,r=0;n>r;r++)for(var a=0;o>a;a++)if(t[r][a]!==e[r][a])return!1;return!0}function c(t,e,i,n,r,o,a,s,l){var h=t.length;if(1==l)for(var c=0;h>c;c++)s[c]=u(t[c],e[c],i[c],n[c],r,o,a);else for(var d=t[0].length,c=0;h>c;c++)for(var f=0;d>f;f++)s[c][f]=u(t[c][f],e[c][f],i[c][f],n[c][f],r,o,a)}function u(t,e,i,n,r,o,a){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*a+(-3*(e-i)-2*s-l)*o+s*r+e}function d(t){if(y(t)){var e=t.length;if(y(t[0])){for(var i=[],n=0;e>n;n++)i.push(x.call(t[n]));return i}return x.call(t)}return t}function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t,e,i,n,r){var d=t._getter,p=t._setter,v="spline"===e,x=n.length;if(x){var _,b=n[0].value,w=y(b),M=!1,S=!1,A=w&&y(b[0])?2:1;n.sort(function(t,e){return t.time-e.time}),_=n[x-1].time;for(var T=[],C=[],I=n[0].value,k=!0,L=0;x>L;L++){T.push(n[L].time/_);var D=n[L].value;if(w&&h(D,I,A)||!w&&D===I||(k=!1),I=D,"string"==typeof D){var P=m.parse(D);P?(D=P,M=!0):S=!0}C.push(D)}if(!k){if(w){for(var z=C[x-1],L=0;x-1>L;L++)l(C[L],z,A);l(d(t._target,r),z,A)}var O,E,R,B,N,V,F=0,G=0;if(M)var W=[0,0,0,0];var Z=function(t,e){var i;if(G>e){for(O=Math.min(F+1,x-1),i=O;i>=0&&!(T[i]<=e);i--);i=Math.min(i,x-2)}else{for(i=F;x>i&&!(T[i]>e);i++);i=Math.min(i-1,x-2)}F=i,G=e;var n=T[i+1]-T[i];if(0!==n)if(E=(e-T[i])/n,v)if(B=C[i],R=C[0===i?i:i-1],N=C[i>x-2?x-1:i+1],V=C[i>x-3?x-1:i+2],w)c(R,B,N,V,E,E*E,E*E*E,d(t,r),A);else{var l;if(M)l=c(R,B,N,V,E,E*E,E*E*E,W,1),l=f(W);else{if(S)return a(B,N,E);l=u(R,B,N,V,E,E*E,E*E*E)}p(t,r,l)}else if(w)s(C[i],C[i+1],E,d(t,r),A);else{var l;if(M)s(C[i],C[i+1],E,W,1),l=f(W);else{if(S)return a(C[i],C[i+1],E);l=o(C[i],C[i+1],E)}p(t,r,l)}},H=new g({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:Z,ondestroy:i});return e&&"spline"!==e&&(H.easing=e),H}}}var g=i(132),m=i(22),v=i(1),y=v.isArrayLike,x=Array.prototype.slice,_=function(t,e,i,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||n,this._setter=o||r,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var i=this._tracks;for(var n in e){if(!i[n]){i[n]=[];var r=this._getter(this._target,n);if(null==r)continue;0!==t&&i[n].push({time:0,value:d(r)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,i=0;e>i;i++)t[i].call(this)},start:function(t){var e,i=this,n=0,r=function(){n--,n||i._doneCallback()};for(var o in this._tracks){var a=p(this,t,r,this._tracks[o],o);a&&(this._clipList.push(a),n++,this.animation&&this.animation.addClip(a),e=a)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var n=0;nt&&(t+=i),t}}},function(t,e){var i=2311;t.exports=function(){return"zr_"+i++}},function(t,e,i){var n=i(144),r=i(143);t.exports={buildPath:function(t,e,i){var o=e.points,a=e.smooth;if(o&&o.length>=2){if(a&&"spline"!==a){var s=r(o,a,i,e.smoothConstraint);t.moveTo(o[0][0],o[0][1]);for(var l=o.length,h=0;(i?l:l-1)>h;h++){var c=s[2*h],u=s[2*h+1],d=o[(h+1)%l];t.bezierCurveTo(c[0],c[1],u[0],u[1],d[0],d[1])}}else{"spline"===a&&(o=n(o,i)),t.moveTo(o[0][0],o[0][1]);for(var h=1,f=o.length;f>h;h++)t.lineTo(o[h][0],o[h][1])}i&&t.closePath()}}}},function(t,e){t.exports={buildPath:function(t,e){var i,n,r,o,a=e.x,s=e.y,l=e.width,h=e.height,c=e.r;0>l&&(a+=l,l=-l),0>h&&(s+=h,h=-h),"number"==typeof c?i=n=r=o=c:c instanceof Array?1===c.length?i=n=r=o=c[0]:2===c.length?(i=r=c[0],n=o=c[1]):3===c.length?(i=c[0],n=o=c[1],r=c[2]):(i=c[0],n=c[1],r=c[2],o=c[3]):i=n=r=o=0;var u;i+n>l&&(u=i+n,i*=l/u,n*=l/u),r+o>l&&(u=r+o,r*=l/u,o*=l/u),n+r>h&&(u=n+r,n*=h/u,r*=h/u),i+o>h&&(u=i+o,i*=h/u,o*=h/u),t.moveTo(a+i,s),t.lineTo(a+l-n,s),0!==n&&t.quadraticCurveTo(a+l,s,a+l,s+n),t.lineTo(a+l,s+h-r),0!==r&&t.quadraticCurveTo(a+l,s+h,a+l-r,s+h),t.lineTo(a+o,s+h),0!==o&&t.quadraticCurveTo(a,s+h,a,s+h-o),t.lineTo(a,s+i),0!==i&&t.quadraticCurveTo(a,s,a+i,s)}}},function(t,e,i){var n=i(72),r=i(1),o=i(10),a=i(11),s=["value","category","time","log"];t.exports=function(t,e,i,l){r.each(s,function(o){e.extend({type:t+"Axis."+o,mergeDefaultAndTheme:function(e,n){var s=this.layoutMode,l=s?a.getLayoutParams(e):{},h=n.getTheme();r.merge(e,h.get(o+"Axis")),r.merge(e,this.getDefaultOption()),e.type=i(t,e),s&&a.mergeLayoutParam(e,l,s)},defaultOption:r.mergeAll([{},n[o+"Axis"],l],!0)})}),o.registerSubTypeDefaulter(t+"Axis",r.curry(i,t))}},function(t,e){t.exports=function(t,e){var i=e.findComponents({mainType:"legend"});i&&i.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var n=e.getName(t),r=0;rf;f++){var x=v(t,i,o,h,p[f]);u[0]=a(x,u[0]),d[0]=s(x,d[0])}for(y=m(e,n,l,c,g),f=0;y>f;f++){var _=v(e,n,l,c,g[f]);u[1]=a(_,u[1]),d[1]=s(_,d[1])}u[0]=a(t,u[0]),d[0]=s(t,d[0]),u[0]=a(h,u[0]),d[0]=s(h,d[0]),u[1]=a(e,u[1]),d[1]=s(e,d[1]),u[1]=a(c,u[1]),d[1]=s(c,d[1])},o.fromQuadratic=function(t,e,i,n,o,l,h,c){var u=r.quadraticExtremum,d=r.quadraticAt,f=s(a(u(t,i,o),1),0),p=s(a(u(e,n,l),1),0),g=d(t,i,o,f),m=d(e,n,l,p);h[0]=a(t,o,g),h[1]=a(e,l,m),c[0]=s(t,o,g),c[1]=s(e,l,m)},o.fromArc=function(t,e,i,r,o,a,s,p,g){var m=n.min,v=n.max,y=Math.abs(o-a);if(1e-4>y%f&&y>1e-4)return p[0]=t-i,p[1]=e-r,g[0]=t+i,void(g[1]=e+r);if(c[0]=h(o)*i+t,c[1]=l(o)*r+e,u[0]=h(a)*i+t,u[1]=l(a)*r+e,m(p,c,u),v(g,c,u),o%=f,0>o&&(o+=f),a%=f,0>a&&(a+=f),o>a&&!s?a+=f:a>o&&s&&(o+=f),s){var x=a;a=o,o=x}for(var _=0;a>_;_+=Math.PI/2)_>o&&(d[0]=h(_)*i+t,d[1]=l(_)*r+e,m(p,d,p),v(g,d,g))},t.exports=o},function(t,e,i){var n=i(35),r=i(1),o=i(17),a=function(t){n.call(this,t)};a.prototype={constructor:a,type:"text",brush:function(t){var e=this.style,i=e.x||0,n=e.y||0,r=e.text,a=e.fill,s=e.stroke;if(null!=r&&(r+=""),r){if(t.save(),this.style.bind(t),this.setTransform(t),a&&(t.fillStyle=a),s&&(t.strokeStyle=s),t.font=e.textFont||e.font,t.textAlign=e.textAlign,e.textVerticalAlign){var l=o.getBoundingRect(r,t.font,e.textAlign,"top");switch(t.textBaseline="top",e.textVerticalAlign){case"middle":n-=l.height/2;break;case"bottom":n-=l.height}}else t.textBaseline=e.textBaseline;for(var h=o.measureText("国",t.font).width,c=r.split("\n"),u=0;u=0?parseFloat(t)/100*e:parseFloat(t):t}function r(t,e){t.transform(e[0],e[1],e[2],e[3],e[4],e[5])}var o=i(17),a=i(8),s=new a,l=function(){};l.prototype={constructor:l,drawRectText:function(t,e,i){var a=this.style,l=a.text;if(null!=l&&(l+=""),l){var h,c,u=a.textPosition,d=a.textDistance,f=a.textAlign,p=a.textFont||a.font,g=a.textBaseline,m=a.textVerticalAlign;i=i||o.getBoundingRect(l,p,f,g);var v=this.transform,y=this.invTransform;if(v&&(s.copy(e),s.applyTransform(v),e=s,r(t,y)),u instanceof Array)h=e.x+n(u[0],e.width),c=e.y+n(u[1],e.height),f=f||"left",g=g||"top";else{var x=o.adjustTextPositionOnRect(u,e,i,d);h=x.x,c=x.y,f=f||x.textAlign,g=g||x.textBaseline}if(t.textAlign=f,m){switch(m){case"middle":c-=i.height/2;break;case"bottom":c-=i.height}t.textBaseline="top"}else t.textBaseline=g;var _=a.textFill,b=a.textStroke;_&&(t.fillStyle=_),b&&(t.strokeStyle=b),t.font=p,t.shadowColor=a.textShadowColor,t.shadowBlur=a.textShadowBlur,t.shadowOffsetX=a.textShadowOffsetX,t.shadowOffsetY=a.textShadowOffsetY;for(var w=l.split("\n"),M=0;M0?1.1:1/1.1;l.call(this,t,e,t.offsetX,t.offsetY)}function s(t){if(!f.isTaken("globalPan",this._zr)){d.stop(t.event);var e=t.pinchScale>1?1.1:1/1.1;l.call(this,t,e,t.pinchX,t.pinchY)}}function l(t,e,i,n){var r=this.rect;if(r&&r.contain(i,n)){var o=this.target,a=this.zoomLimit;if(o){var s=o.position,l=o.scale,h=this.zoom=this.zoom||1;h*=e,a&&(h=Math.max(Math.min(a.max,h),a.min));var c=h/this.zoom;this.zoom=h,s[0]-=(i-s[0])*(c-1),s[1]-=(n-s[1])*(c-1),l[0]*=c,l[1]*=c,o.dirty()}this.trigger("zoom",e,i,n)}}function h(t,e,i){this.target=e,this.rect=i,this.zoomLimit,this.zoom,this._zr=t;var l=u.bind,h=l(n,this),d=l(r,this),f=l(o,this),p=l(a,this),g=l(s,this);c.call(this),this.enable=function(e){this.disable(),null==e&&(e=!0),e!==!0&&"move"!==e&&"pan"!==e||(t.on("mousedown",h),t.on("mousemove",d),t.on("mouseup",f)),e!==!0&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",p),t.on("pinch",g))},this.disable=function(){t.off("mousedown",h),t.off("mousemove",d),t.off("mouseup",f),t.off("mousewheel",p),t.off("pinch",g)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}var c=i(21),u=i(1),d=i(33),f=i(102);u.mixin(h,c),t.exports=h},function(t,e){t.exports=function(t,e,i,n,r){function o(t,e,i){var n=e.length?e.slice():[e,e];return e[0]>e[1]&&n.reverse(),0>t&&n[0]+t0&&n[1]+t>i[1]&&(t=i[1]-n[1]),t}return t?("rigid"===n?(t=o(t,e,i),e[0]+=t,e[1]+=t):(t=o(t,e[r],i),e[r]+=t,"push"===n&&e[0]>e[1]&&(e[1-r]=e[r])),e):e}},function(t,e,i){var n=i(1),r={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameTextStyle:{},nameGap:15,axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{color:"#333",width:1}},axisLabel:{show:!0,inside:!1,rotate:0,margin:8,textStyle:{color:"#333",fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},o=n.merge({boundaryGap:!0,axisTick:{interval:"auto"},axisLabel:{interval:"auto"}},r),a=n.defaults({boundaryGap:[0,0],splitNumber:5},r),s=n.defaults({scale:!0,min:"dataMin",max:"dataMax"},a),l=n.defaults({},a);l.scale=!0,t.exports={categoryAxis:o,valueAxis:a,timeAxis:s,logAxis:l}},,function(t,e,i){var n=i(16);t.exports=function(t,e,i){function r(t){var r=[e,"normal","color"],o=i.get("color"),a=t.getData(),s=t.get(r)||o[t.seriesIndex%o.length];a.setVisual("color",s),i.isSeriesFiltered(t)||("function"!=typeof s||s instanceof n||a.each(function(e){a.setItemVisual(e,"color",s(t.getDataParams(e)))}),a.each(function(t){var e=a.getItemModel(t),i=e.get(r,!0);null!=i&&a.setItemVisual(t,"color",i)}))}t?i.eachSeriesByType(t,r):i.eachSeries(r)}},function(t,e){t.exports=function(t,e,i,n,r,o){if(o>e&&o>n||e>o&&n>o)return 0;if(n===e)return 0;var a=e>n?1:-1,s=(o-e)/(n-e),l=s*(i-t)+t;return l>r?a:0}},function(t,e,i){"use strict";var n=i(1),r=i(16),o=function(t,e,i,n,o){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==i?1:i,this.y2=null==n?0:n,r.call(this,o)};o.prototype={constructor:o,type:"linear",updateCanvasGradient:function(t,e){for(var i=t.getBoundingRect(),n=this.x*i.width+i.x,r=this.x2*i.width+i.x,o=this.y*i.height+i.y,a=this.y2*i.height+i.y,s=e.createLinearGradient(n,o,r,a),l=this.colorStops,h=0;hs||-s>t}var r=i(19),o=i(5),a=r.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},h=l.prototype;h.transform=null,h.needLocalTransform=function(){return n(this.rotation)||n(this.position[0])||n(this.position[1])||n(this.scale[0]-1)||n(this.scale[1]-1)},h.updateTransform=function(){var t=this.parent,e=t&&t.transform,i=this.needLocalTransform(),n=this.transform;return i||e?(n=n||r.create(),i?this.getLocalTransform(n):a(n),e&&(i?r.mul(n,t.transform,n):r.copy(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||r.create(),void r.invert(this.invTransform,n)):void(n&&a(n))},h.getLocalTransform=function(t){t=t||[],a(t);var e=this.origin,i=this.scale,n=this.rotation,o=this.position;return e&&(t[4]-=e[0],t[5]-=e[1]),r.scale(t,t,i),n&&r.rotate(t,t,n),e&&(t[4]+=e[0],t[5]+=e[1]),t[4]+=o[0],t[5]+=o[1],t},h.setTransform=function(t){var e=this.transform;e&&t.transform(e[0],e[1],e[2],e[3],e[4],e[5])};var c=[];h.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(r.mul(c,t.invTransform,e),e=c);var i=e[0]*e[0]+e[1]*e[1],o=e[2]*e[2]+e[3]*e[3],a=this.position,s=this.scale;n(i-1)&&(i=Math.sqrt(i)),n(o-1)&&(o=Math.sqrt(o)),e[0]<0&&(i=-i),e[3]<0&&(o=-o),a[0]=e[4],a[1]=e[5],s[0]=i,s[1]=o,this.rotation=Math.atan2(-e[1]/o,e[0]/i)}},h.transformCoordToLocal=function(t,e){var i=[t,e],n=this.invTransform;return n&&o.applyTransform(i,i,n),i},h.transformCoordToGlobal=function(t,e){var i=[t,e],n=this.transform;return n&&o.applyTransform(i,i,n),i},t.exports=l},function(t,e,i){"use strict";function n(t){r.each(o,function(e){this[e]=r.bind(t[e],t)},this)}var r=i(1),o=["getDom","getZr","getWidth","getHeight","dispatchAction","on","off","getDataURL","getConnectedDataURL","getModel","getOption"];t.exports=n},function(t,e,i){var n=i(1);i(51),i(80),i(81);var r=i(110),o=i(2);o.registerLayout(n.curry(r,"bar")),o.registerVisualCoding("chart",function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),i(34)},function(t,e,i){"use strict";var n=i(13),r=i(36);t.exports=n.extend({type:"series.bar",dependencies:["grid","polar"],getInitialData:function(t,e){return r(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var i=e.dataToPoint(t),n=this.getData(),r=n.getLayout("offset"),o=n.getLayout("size"),a=e.getBaseAxis().isHorizontal()?0:1;return i[a]+=r+o/2,i}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,barMinHeight:0,itemStyle:{normal:{barBorderColor:"#fff",barBorderWidth:0},emphasis:{barBorderColor:"#fff",barBorderWidth:0}}}})},function(t,e,i){"use strict";function n(t,e){var i=t.width>0?1:-1,n=t.height>0?1:-1;e=Math.min(e,Math.abs(t.width),Math.abs(t.height)),t.x+=i*e/2,t.y+=n*e/2,t.width-=i*e,t.height-=n*e}var r=i(1),o=i(3);r.extend(i(12).prototype,i(82)),t.exports=i(2).extendChartView({type:"bar",render:function(t,e,i){var n=t.get("coordinateSystem");return"cartesian2d"===n&&this._renderOnCartesian(t,e,i),this.group},_renderOnCartesian:function(t,e,i){function a(e,i){var a=l.getItemLayout(e),s=l.getItemModel(e).get(p)||0;n(a,s);var h=new o.Rect({shape:r.extend({},a)});if(f){var c=h.shape,u=d?"height":"width",g={};c[u]=0,g[u]=a[u],o[i?"updateProps":"initProps"](h,{shape:g},t)}return h}var s=this.group,l=t.getData(),h=this._data,c=t.coordinateSystem,u=c.getBaseAxis(),d=u.isHorizontal(),f=t.get("animation"),p=["itemStyle","normal","barBorderWidth"];l.diff(h).add(function(t){if(l.hasValue(t)){var e=a(t);l.setItemGraphicEl(t,e),s.add(e)}}).update(function(e,i){var r=h.getItemGraphicEl(i);if(!l.hasValue(e))return void s.remove(r);r||(r=a(e,!0));var c=l.getItemLayout(e),u=l.getItemModel(e).get(p)||0;n(c,u),o.updateProps(r,{shape:c},t),l.setItemGraphicEl(e,r),s.add(r)}).remove(function(e){var i=h.getItemGraphicEl(e);i&&(i.style.text="",o.updateProps(i,{shape:{width:0}},t,function(){s.remove(i)}))}).execute(),this._updateStyle(t,l,d),this._data=l},_updateStyle:function(t,e,i){function n(t,e,i,n,r){o.setText(t,e,i),t.text=n,"outside"===t.textPosition&&(t.textPosition=r)}e.eachItemGraphicEl(function(a,s){var l=e.getItemModel(s),h=e.getItemVisual(s,"color"),c=e.getItemLayout(s),u=l.getModel("itemStyle.normal"),d=l.getModel("itemStyle.emphasis").getBarItemStyle();a.setShape("r",u.get("barBorderRadius")||0),a.setStyle(r.defaults({fill:h},u.getBarItemStyle()));var f=i?c.height>0?"bottom":"top":c.width>0?"left":"right",p=l.getModel("label.normal"),g=l.getModel("label.emphasis"),m=a.style;p.get("show")?n(m,p,h,r.retrieve(t.getFormattedLabel(s,"normal"),t.getRawValue(s)),f):m.text="",g.get("show")?n(d,g,h,r.retrieve(t.getFormattedLabel(s,"emphasis"),t.getRawValue(s)),f):d.text="",o.setHoverStyle(a,d)})},remove:function(t,e){var i=this.group;t.get("animation")?this._data&&this._data.eachItemGraphicEl(function(e){e.style.text="",o.updateProps(e,{shape:{width:0}},t,function(){i.remove(e)})}):i.removeAll()}})},function(t,e,i){t.exports={getBarItemStyle:i(30)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]])}},function(t,e,i){function n(t,e,i){var n=e.getItemVisual(i,"color"),r=e.getItemVisual(i,"symbol"),o=e.getItemVisual(i,"symbolSize");if("none"!==r){p.isArray(o)||(o=[o,o]);var a=c.createSymbol(r,-o[0]/2,-o[1]/2,o[0],o[1],n);return a.name=t,a}}function r(t){var e=new d({name:"line",style:{strokeNoScale:!0}});return o(e.shape,t),e}function o(t,e){var i=e[0],n=e[1],r=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t.y2=n[1],t.percent=1,r&&(t.cpx1=r[0],t.cpy1=r[1])}function a(t){return"symbol"===t.type&&"arrow"===t.shape.symbolType}function s(){var t=this,e=t.childOfName("line");if(this.__dirty||e.__dirty){var i=t.childOfName("fromSymbol"),n=t.childOfName("toSymbol"),r=t.childOfName("label"),o=e.pointAt(0),s=e.pointAt(e.shape.percent),h=u.sub([],s,o);u.normalize(h,h),i&&(i.attr("position",o),a(i)&&i.attr("rotation",l(s,o))),n&&(n.attr("position",s),a(n)&&n.attr("rotation",l(o,s))),r.attr("position",s);var c,d,f;"end"===r.__position?(c=[5*h[0]+s[0],5*h[1]+s[1]],d=h[0]>.8?"left":h[0]<-.8?"right":"center",f=h[1]>.8?"top":h[1]<-.8?"bottom":"middle"):(c=[5*-h[0]+o[0],5*-h[1]+o[1]],d=h[0]>.8?"right":h[0]<-.8?"left":"center",f=h[1]>.8?"bottom":h[1]<-.8?"top":"middle"),r.attr({style:{textVerticalAlign:r.__verticalAlign||f,textAlign:r.__textAlign||d},position:c})}}function l(t,e){return-Math.PI/2-Math.atan2(e[1]-t[1],e[0]-t[0])}function h(t,e,i,n){f.Group.call(this),this._createLine(t,e,i,n)}var c=i(24),u=i(5),d=i(162),f=i(3),p=i(1),g=i(4),m=h.prototype;m.beforeUpdate=s,m._createLine=function(t,e,i,o){var a=t.hostModel,s=t.getItemLayout(o),l=r(s);l.shape.percent=0,f.initProps(l,{shape:{percent:1}},a),this.add(l);var h=new f.Text({name:"label"});if(this.add(h),e){var c=n("fromSymbol",e,o);this.add(c),this._fromSymbolType=e.getItemVisual(o,"symbol")}if(i){var u=n("toSymbol",i,o);this.add(u),this._toSymbolType=i.getItemVisual(o,"symbol")}this._updateCommonStl(t,e,i,o)},m.updateData=function(t,e,i,r){var a=t.hostModel,s=this.childOfName("line"),l=t.getItemLayout(r),h={shape:{}};if(o(h.shape,l),f.updateProps(s,h,a),e){var c=e.getItemVisual(r,"symbol");if(this._fromSymbolType!==c){var u=n("fromSymbol",e,r);this.remove(this.childOfName("fromSymbol")),this.add(u)}this._fromSymbolType=c}if(i){var d=i.getItemVisual(r,"symbol");if(d!==this._toSymbolType){var p=n("toSymbol",i,r);this.remove(this.childOfName("toSymbol")),this.add(p)}this._toSymbolType=d}this._updateCommonStl(t,e,i,r)},m._updateCommonStl=function(t,e,i,n){var r=t.hostModel,o=this.childOfName("line"),a=t.getItemModel(n),s=a.getModel("label.normal"),l=s.getModel("textStyle"),h=a.getModel("label.emphasis"),c=h.getModel("textStyle"),u=g.round(r.getRawValue(n));isNaN(u)&&(u=t.getName(n)),o.setStyle(p.extend({stroke:t.getItemVisual(n,"color")},a.getModel("lineStyle.normal").getLineStyle()));var d=this.childOfName("label");d.setStyle({text:s.get("show")?p.retrieve(r.getFormattedLabel(n,"normal"),u):"",textFont:l.getFont(),fill:l.getTextColor()||t.getItemVisual(n,"color")}),d.hoverStyle={text:h.get("show")?p.retrieve(r.getFormattedLabel(n,"emphasis"),u):"",textFont:c.getFont(),fill:c.getTextColor()},d.__textAlign=l.get("align"),d.__verticalAlign=l.get("baseline"),d.__position=s.get("position"),f.setHoverStyle(this,a.getModel("lineStyle.emphasis").getLineStyle())},m.updateLayout=function(t,e,i,n){var r=t.getItemLayout(n),a=this.childOfName("line");o(a.shape,r),a.dirty(!0)},p.inherits(h,f.Group),t.exports=h},function(t,e,i){function n(t){this._ctor=t||o,this.group=new r.Group}var r=i(3),o=i(83),a=n.prototype;a.updateData=function(t,e,i){var n=this._lineData,r=this.group,o=this._ctor;t.diff(n).add(function(n){var a=new o(t,e,i,n);t.setItemGraphicEl(n,a),r.add(a)}).update(function(o,a){var s=n.getItemGraphicEl(a);s.updateData(t,e,i,o),t.setItemGraphicEl(o,s),r.add(s)}).remove(function(t){r.remove(n.getItemGraphicEl(t))}).execute(),this._lineData=t,this._fromData=e,this._toData=i},a.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,i){e.updateLayout(t,this._fromData,this._toData,i)},this)},a.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){var n=i(1),r=i(2);i(86),i(87),r.registerVisualCoding("chart",n.curry(i(44),"line","circle","line")),r.registerLayout(n.curry(i(53),"line")),r.registerProcessor("statistic",n.curry(i(122),"line")),i(34)},function(t,e,i){"use strict";var n=i(36),r=i(13);t.exports=r.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return n(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,polarIndex:0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},symbol:"emptyCircle",symbolSize:4,showSymbol:!0,animationEasing:"linear"}})},function(t,e,i){"use strict";function n(t,e){if(t.length===e.length){for(var i=0;ie[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function a(t){return t>=0?1:-1}function s(t,e){var i=t.getBaseAxis(),n=t.getOtherAxis(i),r=i.onZero?0:n.scale.getExtent()[0],o=n.dim,s="x"===o||"radius"===o?1:0;return e.mapArray([o],function(n,l){for(var h,c=e.stackedOn;c&&a(c.get(o,l))===a(n);){h=c;break}var u=[];return u[s]=e.get(i.dim,l),u[1-s]=h?h.get(o,l,!0):r,t.dataToPoint(u)},!0)}function l(t,e){return null!=e.dataIndex?e.dataIndex:null!=e.name?t.indexOfName(e.name):void 0}function h(t,e,i){var n=o(t.getAxis("x")),r=o(t.getAxis("y")),a=t.getBaseAxis().isHorizontal(),s=n[0],l=r[0],h=n[1]-s,c=r[1]-l;i.get("clipOverflow")||(a?(l-=c,c*=3):(s-=h,h*=3));var u=new m.Rect({shape:{x:s,y:l,width:h,height:c}});return e&&(u.shape[a?"width":"height"]=0,m.initProps(u,{shape:{width:h,height:c}},i)),u}function c(t,e,i){var n=t.getAngleAxis(),r=t.getRadiusAxis(),o=r.getExtent(),a=n.getExtent(),s=Math.PI/180,l=new m.Sector({shape:{cx:t.cx,cy:t.cy,r0:o[0],r:o[1],startAngle:-a[0]*s,endAngle:-a[1]*s,clockwise:n.inverse}});return e&&(l.shape.endAngle=-a[0]*s,m.initProps(l,{shape:{endAngle:-a[1]*s}},i)),l}function u(t,e,i){return"polar"===t.type?c(t,e,i):h(t,e,i)}var d=i(1),f=i(38),p=i(47),g=i(88),m=i(3),v=i(89),y=i(25);t.exports=y.extend({type:"line",init:function(){var t=new m.Group,e=new f;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var o=t.coordinateSystem,a=this.group,l=t.getData(),h=t.getModel("lineStyle.normal"),c=t.getModel("areaStyle.normal"),f=l.mapArray(l.getItemLayout,!0),p="polar"===o.type,g=this._coordSys,m=this._symbolDraw,v=this._polyline,y=this._polygon,x=this._lineGroup,_=t.get("animation"),b=!c.isEmpty(),w=s(o,l),M=t.get("showSymbol"),S=M&&!p&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,o),A=this._data;A&&A.eachItemGraphicEl(function(t,e){t.__temp&&(a.remove(t),A.setItemGraphicEl(e,null))}),M||m.remove(),a.add(x),v&&g.type===o.type?(b&&!y?y=this._newPolygon(f,w,o,_):y&&!b&&(x.remove(y),y=this._polygon=null),x.setClipPath(u(o,!1,t)),M&&m.updateData(l,S),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),n(this._stackedOnPoints,w)&&n(this._points,f)||(_?this._updateAnimation(l,w,o,i):(v.setShape({points:f}),y&&y.setShape({points:f,stackedOnPoints:w})))):(M&&m.updateData(l,S),v=this._newPolyline(f,o,_),b&&(y=this._newPolygon(f,w,o,_)),x.setClipPath(u(o,!0,t))),v.setStyle(d.defaults(h.getLineStyle(),{stroke:l.getVisual("color"),lineJoin:"bevel"}));var T=t.get("smooth");if(T=r(t.get("smooth")),v.setShape({smooth:T,smoothMonotone:t.get("smoothMonotone")}),y){var C=l.stackedOn,I=0;if(y.style.opacity=.7,y.setStyle(d.defaults(c.getAreaStyle(),{fill:l.getVisual("color"),lineJoin:"bevel"})),C){var k=C.hostModel;I=r(k.get("smooth"))}y.setShape({smooth:T,stackedOnSmooth:I,smoothMonotone:t.get("smoothMonotone")})}this._data=l,this._coordSys=o,this._stackedOnPoints=w,this._points=f},highlight:function(t,e,i,n){var r=t.getData(),o=l(r,n);if(null!=o&&o>=0){var a=r.getItemGraphicEl(o);if(!a){var s=r.getItemLayout(o);a=new p(r,o,i),a.position=s,a.setZ(t.get("zlevel"),t.get("z")),a.ignore=isNaN(s[0])||isNaN(s[1]),a.__temp=!0,r.setItemGraphicEl(o,a),a.stopSymbolAnimation(!0),this.group.add(a)}a.highlight()}else y.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var r=t.getData(),o=l(r,n);if(null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else y.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new v.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new v.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i,i},_getSymbolIgnoreFunc:function(t,e){var i=e.getAxesByScale("ordinal")[0];return i&&i.isLabelIgnored?d.bind(i.isLabelIgnored,i):void 0},_updateAnimation:function(t,e,i,n){var r=this._polyline,o=this._polygon,a=t.hostModel,s=g(this._data,t,this._stackedOnPoints,e,this._coordSys,i);r.shape.points=s.current,m.updateProps(r,{shape:{points:s.next}},a),o&&(o.setShape({points:s.current,stackedOnPoints:s.stackedOnCurrent}),m.updateProps(o,{shape:{points:s.next,stackedOnPoints:s.stackedOnNext}},a));for(var l=[],h=s.status,c=0;c=0?1:-1}function n(t,e,n){for(var r,o=t.getBaseAxis(),a=t.getOtherAxis(o),s=o.onZero?0:a.scale.getExtent()[0],l=a.dim,h="x"===l||"radius"===l?1:0,c=e.stackedOn,u=e.get(l,n);c&&i(c.get(l,n))===i(u);){r=c;break}var d=[];return d[h]=e.get(o.dim,n),d[1-h]=r?r.get(l,n,!0):s,t.dataToPoint(d)}function r(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}t.exports=function(t,e,i,o,a,s){for(var l=r(t,e),h=[],c=[],u=[],d=[],f=[],p=[],g=[],m=s.dimensions,v=0;vx;x++){var _=e[y];if(y>=n||0>y||isNaN(_[0])||isNaN(_[1]))break;if(y===i)t[o>0?"moveTo":"lineTo"](_[0],_[1]),c(d,_);else if(m>0){var b=y-o,w=y+o,M=.5,S=e[b],A=e[w];if(o>0&&(y===r-1||isNaN(A[0])||isNaN(A[1]))||0>=o&&(0===y||isNaN(A[0])||isNaN(A[1])))c(f,_);else{(isNaN(A[0])||isNaN(A[1]))&&(A=_),a.sub(u,A,S);var T,C;if("x"===v||"y"===v){var I="x"===v?0:1;T=Math.abs(_[I]-S[I]),C=Math.abs(_[I]-A[I])}else T=a.dist(_,S),C=a.dist(_,A);M=C/(C+T),h(f,_,u,-m*(1-M))}s(d,d,g),l(d,d,p),s(f,f,g),l(f,f,p),t.bezierCurveTo(d[0],d[1],f[0],f[1],_[0],_[1]),h(d,_,u,m*M)}else t.lineTo(_[0],_[1]);y+=o}return x}function r(t,e){var i=[1/0,1/0],n=[-(1/0),-(1/0)];if(e)for(var r=0;rn[0]&&(n[0]=o[0]),o[1]>n[1]&&(n[1]=o[1])}return{min:e?i:n,max:e?n:i}}var o=i(6),a=i(5),s=a.min,l=a.max,h=a.scaleAndAdd,c=a.copy,u=[],d=[],f=[];t.exports={Polyline:o.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null},style:{fill:null,stroke:"#000"},buildPath:function(t,e){for(var i=e.points,o=0,a=i.length,s=r(i,e.smoothConstraint);a>o;)o+=n(t,i,o,a,a,1,s.min,s.max,e.smooth,e.smoothMonotone)+1}}),Polygon:o.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null},buildPath:function(t,e){for(var i=e.points,o=e.stackedOnPoints,a=0,s=i.length,l=e.smoothMonotone,h=r(i,e.smoothConstraint),c=r(o,e.smoothConstraint);s>a;){var u=n(t,i,a,s,s,1,h.min,h.max,e.smooth,l);n(t,o,a+u-1,s,u,-1,c.min,c.max,e.stackedOnSmooth,l),a+=u+1,t.closePath()}}})}},function(t,e,i){var n=i(1),r=i(2);i(91),i(92),i(68)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),r.registerVisualCoding("chart",n.curry(i(63),"pie")),r.registerLayout(n.curry(i(94),"pie")),r.registerProcessor("filter",n.curry(i(62),"pie"))},function(t,e,i){"use strict";var n=i(14),r=i(1),o=i(7),a=i(31),s=i(69),l=i(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._dataBeforeProcessed},this.updateSelectedMap(),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap()},getInitialData:function(t,e){var i=a(["value"],t.data),r=new n(i,this);return r.initData(t.data),r},getDataParams:function(t){var e=this._data,i=l.superCall(this,"getDataParams",t),n=e.getSum("value");return i.percent=n?+(e.get("value",t)/n*100).toFixed(2):0,i.$vars.push("percent"),i},_defaultLabelLine:function(t){o.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1}},animationEasing:"cubicOut",data:[]}});r.mixin(l,s),t.exports=l},function(t,e,i){function n(t,e,i,n){var o=e.getData(),a=this.dataIndex,s=o.getName(a),l=e.get("selectedOffset");n.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),o.each(function(t){r(o.getItemGraphicEl(t),o.getItemLayout(t),e.isSelected(o.getName(t)),l,i)})}function r(t,e,i,n,r){var o=(e.startAngle+e.endAngle)/2,a=Math.cos(o),s=Math.sin(o),l=i?n:0,h=[a*l,s*l];r?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function o(t,e){function i(){o.ignore=o.hoverIgnore,a.ignore=a.hoverIgnore}function n(){o.ignore=o.normalIgnore,a.ignore=a.normalIgnore}s.Group.call(this);var r=new s.Sector({z2:2}),o=new s.Polyline,a=new s.Text;this.add(r),this.add(o),this.add(a),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function a(t,e,i,n,r){var o=n.getModel("textStyle"),a="inside"===r||"inner"===r;return{fill:o.getTextColor()||(a?"#fff":t.getItemVisual(e,"color")),textFont:o.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var s=i(3),l=i(1),h=o.prototype;h.updateData=function(t,e,i){function n(){a.stopAnimation(!0),a.animateTo({shape:{r:u.r+10}},300,"elasticOut")}function o(){a.stopAnimation(!0),a.animateTo({shape:{r:u.r}},300,"elasticOut")}var a=this.childAt(0),h=t.hostModel,c=t.getItemModel(e),u=t.getItemLayout(e),d=l.extend({},u);d.label=null,i?(a.setShape(d),a.shape.endAngle=u.startAngle,s.updateProps(a,{shape:{endAngle:u.endAngle}},h)):s.updateProps(a,{shape:d},h);var f=c.getModel("itemStyle"),p=t.getItemVisual(e,"color");a.setStyle(l.defaults({fill:p},f.getModel("normal").getItemStyle())),a.hoverStyle=f.getModel("emphasis").getItemStyle(),r(this,t.getItemLayout(e),c.get("selected"),h.get("selectedOffset"),h.get("animation")),a.off("mouseover").off("mouseout").off("emphasis").off("normal"),c.get("hoverAnimation")&&a.on("mouseover",n).on("mouseout",o).on("emphasis",n).on("normal",o),this._updateLabel(t,e),s.setHoverStyle(this)},h._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),r=t.hostModel,o=t.getItemModel(e),l=t.getItemLayout(e),h=l.label,c=t.getItemVisual(e,"color");s.updateProps(i,{shape:{points:h.linePoints||[[h.x,h.y],[h.x,h.y],[h.x,h.y]]}},r),s.updateProps(n,{style:{x:h.x,y:h.y}},r),n.attr({style:{textVerticalAlign:h.verticalAlign,textAlign:h.textAlign,textFont:h.font},rotation:h.rotation,origin:[h.x,h.y],z2:10});var u=o.getModel("label.normal"),d=o.getModel("label.emphasis"),f=o.getModel("labelLine.normal"),p=o.getModel("labelLine.emphasis"),g=u.get("position")||d.get("position");n.setStyle(a(t,e,"normal",u,g)),n.ignore=n.normalIgnore=!u.get("show"),n.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:c}),i.setStyle(f.getModel("lineStyle").getLineStyle()),n.hoverStyle=a(t,e,"emphasis",d,g),i.hoverStyle=p.getModel("lineStyle").getLineStyle();var m=f.get("smooth");m&&m===!0&&(m=.4),i.setShape({smooth:m})},l.inherits(o,s.Group);var c=i(25).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,i,r){if(!r||r.from!==this.uid){var a=t.getData(),s=this._data,h=this.group,c=e.get("animation"),u=!s,d=l.curry(n,this.uid,t,c,i),f=t.get("selectedMode");if(a.diff(s).add(function(t){var e=new o(a,t);u&&e.eachChild(function(t){t.stopAnimation(!0)}),f&&e.on("click",d),a.setItemGraphicEl(t,e),h.add(e)}).update(function(t,e){var i=s.getItemGraphicEl(e);i.updateData(a,t),i.off("click"),f&&i.on("click",d),h.add(i),a.setItemGraphicEl(t,i)}).remove(function(t){var e=s.getItemGraphicEl(t);h.remove(e)}).execute(),c&&u&&a.count()>0){var p=a.getItemLayout(0),g=Math.max(i.getWidth(),i.getHeight())/2,m=l.bind(h.removeClipPath,h);h.setClipPath(this._createClipPath(p.cx,p.cy,g,p.startAngle,p.clockwise,m,t))}this._data=a}},_createClipPath:function(t,e,i,n,r,o,a){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:i,startAngle:n,endAngle:n,clockwise:r}});return s.initProps(l,{shape:{endAngle:n+(r?1:-1)*Math.PI*2}},a,o),l}});t.exports=c},function(t,e,i){"use strict";function n(t,e,i,n,r,o,a){function s(e,i,n,r){for(var o=e;i>o;o++)if(t[o].y+=n,o>e&&i>o+1&&t[o+1].y>t[o].y+t[o].height)return void l(o,n/2);l(i-1,n/2)}function l(e,i){for(var n=e;n>=0&&(t[n].y-=i,!(n>0&&t[n].y>t[n-1].y+t[n-1].height));n--);}function h(t,e,i,n,r,o){for(var a=o>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;l>s;s++)if("center"!==t[s].position){var h=Math.abs(t[s].y-n),c=t[s].len,u=t[s].len2,d=r+c>h?Math.sqrt((r+c+u)*(r+c+u)-h*h):Math.abs(t[s].x-i);e&&d>=a&&(d=a-10),!e&&a>=d&&(d=a+10),t[s].x=i+d*o,a=d}}t.sort(function(t,e){ +return t.y-e.y});for(var c,u=0,d=t.length,f=[],p=[],g=0;d>g;g++)c=t[g].y-u,0>c&&s(g,d,-c,r),u=t[g].y+t[g].height;0>a-u&&l(d-1,u-a);for(var g=0;d>g;g++)t[g].y>=i?p.push(t[g]):f.push(t[g]);h(f,!1,e,i,n,r),h(p,!0,e,i,n,r)}function r(t,e,i,r,o,a){for(var s=[],l=[],h=0;hb?-1:1)*x,k=C;n=I+(0>b?-5:5),r=k,u=[[S,A],[T,C],[I,k]]}d=M?"center":b>0?"left":"right"}var L=g.getModel("textStyle").getFont(),D=g.get("rotate")?0>b?-_+Math.PI:-_:0,P=t.getFormattedLabel(i,"normal")||l.getName(i),z=o.getBoundingRect(P,L,d,"top");c=!!D,f.label={x:n,y:r,position:m,height:z.height,len:y,len2:x,linePoints:u,textAlign:d,verticalAlign:"middle",font:L,rotation:D},M||h.push(f.label)}),!c&&t.get("avoidLabelOverlap")&&r(h,a,s,e,i,n)}},function(t,e,i){var n=i(4),r=n.parsePercent,o=i(93),a=i(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,i){e.eachSeriesByType(t,function(t){var e=t.get("center"),h=t.get("radius");a.isArray(h)||(h=[0,h]),a.isArray(e)||(e=[e,e]);var c=i.getWidth(),u=i.getHeight(),d=Math.min(c,u),f=r(e[0],c),p=r(e[1],u),g=r(h[0],d/2),m=r(h[1],d/2),v=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=v.getSum("value"),b=Math.PI/(_||v.count())*2,w=t.get("clockwise"),M=t.get("roseType"),S=v.getDataExtent("value");S[0]=0;var A=s,T=0,C=y,I=w?1:-1;if(v.each("value",function(t,e){var i;i="area"!==M?0===_?b:t*b:s/(v.count()||1),x>i?(i=x,A-=x):T+=t;var r=C+I*i;v.setItemLayout(e,{angle:i,startAngle:C,endAngle:r,clockwise:w,cx:f,cy:p,r0:g,r:M?n.linearMap(t,S,[g,m]):m}),C=r},!0),s>A)if(.001>=A){var k=s/v.count();v.each(function(t){var e=v.getItemLayout(t);e.startAngle=y+I*t*k,e.endAngle=y+I*(t+1)*k})}else b=A/T,C=y,v.each("value",function(t,e){var i=v.getItemLayout(e),n=i.angle===x?x:t*b;i.startAngle=C,i.endAngle=C+I*n,C+=n});o(t,m,c,u)})}},,function(t,e,i){"use strict";i(50),i(97)},function(t,e,i){function n(t,e){function i(t,e){var i=n.getAxis(t);return i.toGlobalCoord(i.dataToCoord(0))}var n=t.coordinateSystem,r=e.axis,o={},a=r.position,s=r.onZero?"onZero":a,l=r.dim,h=n.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],u={x:{top:c[2],bottom:c[3]},y:{left:c[0],right:c[1]}};u.x.onZero=Math.max(Math.min(i("y"),u.x.bottom),u.x.top),u.y.onZero=Math.max(Math.min(i("x"),u.y.right),u.y.left),o.position=["y"===l?u.y[s]:c[0],"x"===l?u.x[s]:c[3]];var d={x:0,y:1};o.rotation=Math.PI/2*d[l];var f={top:-1,bottom:1,left:-1,right:1};o.labelDirection=o.tickDirection=o.nameDirection=f[a],r.onZero&&(o.labelOffset=u[l][a]-u[l].onZero),e.getModel("axisTick").get("inside")&&(o.tickDirection=-o.tickDirection),e.getModel("axisLabel").get("inside")&&(o.labelDirection=-o.labelDirection);var p=e.getModel("axisLabel").get("rotate");return o.labelRotation="top"===s?-p:p,o.labelInterval=r.getLabelInterval(),o.z2=1,o}var r=i(1),o=i(3),a=i(48),s=a.ifIgnoreOnTick,l=a.getInterval,h=["axisLine","axisLabel","axisTick","axisName"],c=["splitLine","splitArea"],u=i(2).extendComponentView({type:"axis",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=e.getComponent("grid",t.get("gridIndex")),o=n(i,t),s=new a(t,o);r.each(h,s.add,s),this.group.add(s.getGroup()),r.each(c,function(e){t.get(e+".show")&&this["_"+e](t,i,o.labelInterval)},this)}},_splitLine:function(t,e,i){var n=t.axis,a=t.getModel("splitLine"),h=a.getModel("lineStyle"),c=h.get("width"),u=h.get("color"),d=l(a,i);u=r.isArray(u)?u:[u];for(var f=e.coordinateSystem.getRect(),p=n.isHorizontal(),g=[],m=0,v=n.getTicksCoords(),y=[],x=[],_=0;_=0;r--){var o=i[r];if(o[n])break}if(0>r){var a=t.queryComponents({mainType:"dataZoom",subType:"select",id:n})[0];if(a){var s=a.getPercentRange();i[0][n]={dataZoomId:n,start:s[0],end:s[1]}}}}),i.push(e)},pop:function(t){var e=n(t),i=e[e.length-1];e.length>1&&e.pop();var r={};return o(i,function(t,i){for(var n=e.length-1;n>=0;n--){var t=e[n][i];if(t){r[i]=t;break}}}),r},clear:function(t){t[a]=null},count:function(t){return n(t).length}};t.exports=s},function(t,e,i){i(10).registerSubTypeDefaulter("dataZoom",function(t){return"slider"})},function(t,e){function i(t){return t[n]||(t[n]={})}var n="\x00_ec_interaction_mutex",r={take:function(t,e){i(e)[t]=!0},release:function(t,e){i(e)[t]=!1},isTaken:function(t,e){return!!i(e)[t]}};t.exports=r},function(t,e,i){function n(t,e,i){r.positionGroup(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"))}var r=i(11),o=i(9),a=i(3);t.exports={layout:function(t,e,i){var o=r.getLayoutRect(e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"));r.box(e.get("orient"),t,e.get("itemGap"),o.width,o.height),n(t,e,i)},addBackground:function(t,e){var i=o.normalizeCssArray(e.get("padding")),n=t.getBoundingRect(),r=e.getItemStyle(["color","opacity"]);r.fill=e.get("backgroundColor");var s=new a.Rect({shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[1]+i[3],height:n.height+i[0]+i[2]},style:r,silent:!0,z2:-1});a.subPixelOptimizeRect(s),t.add(s)}}},function(t,e,i){function n(t,e,i){var n=-1;do n=Math.max(a.getPrecision(t.get(e,i)),n),t=t.stackedOn;while(t);return n}function r(t,e,i,r,o,a){var s=[],l=p(e,r,t),h=e.indexOfNearest(r,l,!0);s[o]=e.get(i,h,!0),s[a]=e.get(r,h,!0);var c=n(e,r,h);return c>=0&&(s[a]=+s[a].toFixed(c)),s}var o=i(1),a=i(4),s=o.indexOf,l=o.curry,h={min:l(r,"min"),max:l(r,"max"),average:l(r,"average")},c=function(t,e){var i=t.getData(),n=t.coordinateSystem;if((isNaN(e.x)||isNaN(e.y))&&!o.isArray(e.coord)&&n){var r=u(e,i,n,t);if(e=o.clone(e),e.type&&h[e.type]&&r.baseAxis&&r.valueAxis){var a=n.dimensions,l=s(a,r.baseAxis.dim),c=s(a,r.valueAxis.dim);e.coord=h[e.type](i,r.baseDataDim,r.valueDataDim,l,c),e.value=e.coord[c]}else e.coord=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis]}return e},u=function(t,e,i,n){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=i.getAxis(n.dataDimToCoordDim(r.valueDataDim)),r.baseAxis=i.getOtherAxis(r.valueAxis),r.baseDataDim=n.coordDimToDataDim(r.baseAxis.dim)[0]):(r.baseAxis=n.getBaseAxis(),r.valueAxis=i.getOtherAxis(r.baseAxis),r.baseDataDim=n.coordDimToDataDim(r.baseAxis.dim)[0],r.valueDataDim=n.coordDimToDataDim(r.valueAxis.dim)[0]),r},d=function(t,e){return t&&t.containData&&e.coord&&(null==e.x||null==e.y)?t.containData(e.coord):!0},f=function(t,e,i,n){return 2>n?t.coord&&t.coord[n]:t.value},p=function(t,e,i){return"average"===i?t.getSum(e,!0)/t.count():t.getDataExtent(e,!0)["max"===i?1:0]};t.exports={dataTransform:c,dataFilter:d,dimValueGetter:f,getAxisInfo:u,numCalculate:p}},function(t,e,i){var n=i(1),r=i(43),o=i(109),a=function(t,e,i,n,o){r.call(this,t,e,i),this.type=n||"value",this.position=o||"bottom"};a.prototype={constructor:a,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(){var t=this.getExtent();return t[0]=this.toGlobalCoord(t[0]),t[1]=this.toGlobalCoord(t[1]),t},getLabelInterval:function(){var t=this._labelInterval;return t||(t=this._labelInterval=o(this)),t},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},toLocalCoord:null,toGlobalCoord:null},n.inherits(a,r),t.exports=a},function(t,e,i){"use strict";function n(t){return this._axes[t]}var r=i(1),o=function(t){this._axes={},this._dimList=[],this.name=t||""};o.prototype={constructor:o,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return r.map(this._dimList,n,this)},getAxesByScale:function(t){return t=t.toLowerCase(),r.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},r=0;ri&&(i=Math.min(i,c),c-=i,t.width=i,u--)}),d=(c-s)/(u+(u-1)*h),d=Math.max(d,0);var f,p=0;a.each(i,function(t,e){t.width||(t.width=d),f=t,p+=t.width*(1+h)}),f&&(p-=f.width*h);var g=-p/2;a.each(i,function(t,i){r[e][i]=r[e][i]||{offset:g,width:t.width},g+=t.width*(1+h)})}),r}function o(t,e,i){var o=r(a.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),s={};e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem,r=i.getBaseAxis(),a=n(t),l=o[r.index][a],h=l.offset,c=l.width,u=i.getOtherAxis(r),d=t.get("barMinHeight")||0,f=r.onZero?u.toGlobalCoord(u.dataToCoord(0)):u.getGlobalExtent()[0],p=i.dataToPoints(e,!0);s[a]=s[a]||[],e.setLayout({offset:h,size:c}),e.each(u.dim,function(t,i){if(!isNaN(t)){s[a][i]||(s[a][i]={p:f,n:f});var n,r,o,l,g=t>=0?"p":"n",m=p[i],v=s[a][i][g];u.isHorizontal()?(n=v,r=m[1]+h,o=m[0]-v,l=c,Math.abs(o)o?-1:1)*d),s[a][i][g]+=o):(n=m[0]+h,r=v,o=c,l=m[1]-v,Math.abs(l)=l?-1:1)*d),s[a][i][g]+=l),e.setItemLayout(i,{x:n,y:r,width:o,height:l})}},!0)},this)}var a=i(1),s=i(4),l=s.parsePercent;t.exports=o},function(t,e,i){var n=i(3),r=i(1),o=Math.PI;t.exports=function(t,e){e=e||{},r.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var i=new n.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),a=new n.Arc({shape:{startAngle:-o/2,endAngle:-o/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new n.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});a.animateShape(!0).when(1e3,{endAngle:3*o/2}).start("circularInOut"),a.animateShape(!0).when(1e3,{startAngle:3*o/2}).delay(300).start("circularInOut");var l=new n.Group;return l.add(a),l.add(s),l.add(i),l.resize=function(){var e=t.getWidth()/2,n=t.getHeight()/2;a.setShape({cx:e,cy:n});var r=a.shape.r;s.setShape({x:e-r,y:n-r,width:2*r,height:2*r}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,i){function n(t,e){for(var i in e)_.hasClass(i)||("object"==typeof e[i]?t[i]=t[i]?u.merge(t[i],e[i],!1):u.clone(e[i]):null==t[i]&&(t[i]=e[i]))}function r(t){t=t,this.option={},this.option[w]=1,this._componentsMap={},this._seriesIndices=null,n(t,this._theme.option),u.merge(t,b,!1),this.mergeOption(t)}function o(t,e){u.isArray(e)||(e=e?[e]:[]);var i={};return p(e,function(e){i[e]=(t[e]||[]).slice()}),i}function a(t,e){var i={};p(e,function(t,e){var n=t.exist;n&&(i[n.id]=t)}),p(e,function(e,n){var r=e.option;if(u.assert(!r||null==r.id||!i[r.id]||i[r.id]===e,"id duplicates: "+(r&&r.id)),r&&null!=r.id&&(i[r.id]=e),x(r)){var o=s(t,r,e.exist);e.keyInfo={mainType:t,subType:o}}}),p(e,function(t,e){var n=t.exist,r=t.option,o=t.keyInfo;if(x(r)){if(o.name=null!=r.name?r.name+"":n?n.name:"\x00-",n)o.id=n.id;else if(null!=r.id)o.id=r.id+"";else{var a=0;do o.id="\x00"+o.name+"\x00"+a++;while(i[o.id])}i[o.id]=t}})}function s(t,e,i){var n=e.type?e.type:i?i.subType:_.determineSubType(t,e);return n}function l(t){return m(t,function(t){return t.componentIndex})||[]}function h(t,e){return e.hasOwnProperty("subType")?g(t,function(t){return t.subType===e.subType}):t}function c(t){if(!t._seriesIndices)throw new Error("Series has not been initialized yet.")}var u=i(1),d=i(7),f=i(12),p=u.each,g=u.filter,m=u.map,v=u.isArray,y=u.indexOf,x=u.isObject,_=i(10),b=i(114),w="\x00_ec_inner",M=f.extend({constructor:M,init:function(t,e,i,n){i=i||{},this.option=null,this._theme=new f(i),this._optionManager=n},setOption:function(t,e){u.assert(!(w in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption()},resetOption:function(t){var e=!1,i=this._optionManager;if(!t||"recreate"===t){var n=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(n)):r.call(this,n),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(this.mergeOption(o),e=!0)}if(!t||"recreate"===t||"media"===t){var a=i.getMediaOption(this,this._api);a.length&&p(a,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,r){var s=d.normalizeToArray(t[e]),h=d.mappingToExists(n[e],s);a(e,h);var c=o(n,r);i[e]=[],n[e]=[],p(h,function(t,r){var o=t.exist,a=t.option;if(u.assert(x(a)||o,"Empty component definition"),a){var s=_.getClass(e,t.keyInfo.subType,!0);o&&o instanceof s?(o.mergeOption(a,this),o.optionUpdated(this)):(o=new s(a,this,this,u.extend({dependentModels:c,componentIndex:r},t.keyInfo)),o.optionUpdated(this))}else o.mergeOption({},this),o.optionUpdated(this);n[e][r]=o,i[e][r]=o.option},this),"series"===e&&(this._seriesIndices=l(n.series))}var i=this.option,n=this._componentsMap,r=[];p(t,function(t,e){null!=t&&(_.hasClass(e)?r.push(e):i[e]=null==i[e]?u.clone(t):u.merge(i[e],t,!0))}),_.topologicalTravel(r,_.getAllClassMainTypes(),e,this)},getOption:function(){var t=u.clone(this.option);return p(t,function(e,i){if(_.hasClass(i)){for(var e=d.normalizeToArray(e),n=e.length-1;n>=0;n--)d.isIdInner(e[n])&&e.splice(n,1);t[i]=e}}),delete t[w],t},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap[t];return i?i[e||0]:void 0},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,r=t.name,o=this._componentsMap[e];if(!o||!o.length)return[];var a;if(null!=i)v(i)||(i=[i]),a=g(m(i,function(t){return o[t]}),function(t){return!!t});else if(null!=n){var s=v(n);a=g(o,function(t){return s&&y(n,t.id)>=0||!s&&t.id===n})}else if(null!=r){var l=v(r);a=g(o,function(t){return l&&y(r,t.name)>=0||!l&&t.name===r})}return h(a,t)},findComponents:function(t){function e(t){var e=r+"Index",i=r+"Id",n=r+"Name";return t&&(t.hasOwnProperty(e)||t.hasOwnProperty(i)||t.hasOwnProperty(n))?{mainType:r,index:t[e],id:t[i],name:t[n]}:null}function i(e){return t.filter?g(e,t.filter):e}var n=t.query,r=t.mainType,o=e(n),a=o?this.queryComponents(o):this._componentsMap[r];return i(h(a,t))},eachComponent:function(t,e,i){var n=this._componentsMap;if("function"==typeof t)i=e,e=t,p(n,function(t,n){p(t,function(t,r){e.call(i,n,t,r)})});else if(u.isString(t))p(n[t],e,i);else if(x(t)){var r=this.findComponents(t);p(r,e,i)}},getSeriesByName:function(t){var e=this._componentsMap.series;return g(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return g(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){c(this),p(this._seriesIndices,function(i){var n=this._componentsMap.series[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){p(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,i){c(this),p(this._seriesIndices,function(n){var r=this._componentsMap.series[n];r.subType===t&&e.call(i,r,n)},this)},eachRawSeriesByType:function(t,e,i){return p(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return c(this),u.indexOf(this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){c(this);var i=g(this._componentsMap.series,t,e);this._seriesIndices=l(i)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=l(t.series);var e=[];p(t,function(t,i){e.push(i)}),_.topologicalTravel(e,_.getAllClassMainTypes(),function(e,i){p(t[e],function(t){t.restoreData()})})}});t.exports=M},function(t,e,i){function n(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newOptionBackup}function r(t,e){var i,n,r=[],o=[],a=t.timeline;if(t.baseOption&&(n=t.baseOption),(a||t.options)&&(n=n||{},r=(t.options||[]).slice()),t.media){n=n||{};var s=t.media;d(s,function(t){t&&t.option&&(t.query?o.push(t):i||(i=t))})}return n||(n=t),n.timeline||(n.timeline=a),d([n].concat(r).concat(h.map(o,function(t){return t.option})),function(t){d(e,function(e){e(t)})}),{baseOption:n,timelineOptions:r,mediaDefault:i,mediaList:o}}function o(t,e,i){var n={width:e,height:i,aspectratio:e/i},r=!0;return h.each(t,function(t,e){var i=e.match(m);if(i&&i[1]&&i[2]){var o=i[1],s=i[2].toLowerCase();a(n[s],t,o)||(r=!1)}}),r}function a(t,e,i){return"min"===i?t>=e:"max"===i?e>=t:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},d(e,function(e,i){if(null!=e){var n=t[i];if(u.hasClass(i)){e=c.normalizeToArray(e),n=c.normalizeToArray(n);var r=c.mappingToExists(n,e);t[i]=p(r,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[i]=g(n,e,!0)}})}var h=i(1),c=i(7),u=i(10),d=h.each,f=h.clone,p=h.map,g=h.merge,m=/^(min|max)?(.+)$/;n.prototype={constructor:n,setOption:function(t,e){t=f(t,!0);var i=this._optionBackup,n=this._newOptionBackup=r.call(this,t,e);i?(l(i.baseOption,n.baseOption),n.timelineOptions.length&&(i.timelineOptions=n.timelineOptions),n.mediaList.length&&(i.mediaList=n.mediaList),n.mediaDefault&&(i.mediaDefault=n.mediaDefault)):this._optionBackup=n},mountOption:function(t){var e=t?this._optionBackup:this._newOptionBackup;return this._timelineOptions=p(e.timelineOptions,f),this._mediaList=p(e.mediaList,f),this._mediaDefault=f(e.mediaDefault),this._currentMediaIndices=[],f(e.baseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i.length){var n=t.getComponent("timeline");n&&(e=f(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),i=this._api.getHeight(),n=this._mediaList,r=this._mediaDefault,a=[],l=[];if(!n.length&&!r)return l;for(var h=0,c=n.length;c>h;h++)o(n[h].query,e,i)&&a.push(h);return!a.length&&r&&(a=[-1]),a.length&&!s(a,this._currentMediaIndices)&&(l=p(a,function(t){return f(-1===t?r.option:n[t].option)})),this._currentMediaIndices=a,l}},t.exports=n},function(t,e){var i="";"undefined"!=typeof navigator&&(i=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],grid:{},textStyle:{fontFamily:i.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},animation:!0,animationThreshold:2e3,animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut"}},function(t,e,i){t.exports={getAreaStyle:i(30)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,i){t.exports={getItemStyle:i(30)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]])}},function(t,e,i){var n=i(30)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=n.call(this,t),i=this.getLineDash();return i&&(e.lineDash=i),e},getLineDash:function(){var t=this.get("type");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,i){function n(t,e){return t&&t.getShallow(e)}var r=i(17);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){var t=this.ecModel,e=t&&t.getModel("textStyle");return[this.getShallow("fontStyle")||n(e,"fontStyle"),this.getShallow("fontWeight")||n(e,"fontWeight"),(this.getShallow("fontSize")||n(e,"fontSize")||12)+"px",this.getShallow("fontFamily")||n(e,"fontFamily")||"sans-serif"].join(" ")},getTextRect:function(t){var e=this.get("textStyle")||{};return r.getBoundingRect(t,this.getFont(),e.align,e.baseline)},ellipsis:function(t,e,i){return r.ellipsis(t,this.getFont(),e,i)}}},function(t,e,i){function n(t,e){e=e.split(",");for(var i=t,n=0;ne&&(e=t[i]);return e},min:function(t){for(var e=1/0,i=0;i1){var u;"string"==typeof r?u=i[r]:"function"==typeof r&&(u=r),u&&(e=e.downSample(s.dim,1/c,u,n),t.setData(e))}}},this)}},function(t,e,i){var n=i(1),r=i(32),o=i(4),a=i(37),s=r.prototype,l=a.prototype,h=Math.floor,c=Math.ceil,u=Math.pow,d=10,f=Math.log,p=r.extend({type:"log",getTicks:function(){return n.map(l.getTicks.call(this),function(t){return o.round(u(d,t))})},getLabel:l.getLabel,scale:function(t){return t=s.scale.call(this,t),u(d,t)},setExtent:function(t,e){t=f(t)/f(d),e=f(e)/f(d),l.setExtent.call(this,t,e)},getExtent:function(){var t=s.getExtent.call(this);return t[0]=u(d,t[0]),t[1]=u(d,t[1]),t},unionExtent:function(t){t[0]=f(t[0])/f(d),t[1]=f(t[1])/f(d),s.unionExtent.call(this,t)},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(i===1/0||0>=i)){var n=u(10,h(f(i/t)/Math.LN10)),r=t/i*n;.5>=r&&(n*=10);var a=[o.round(c(e[0]/n)*n),o.round(h(e[1]/n)*n)];this._interval=n,this._niceExtent=a}},niceExtent:l.niceExtent});n.each(["contain","normalize"],function(t){p.prototype[t]=function(e){return e=f(e)/f(d),s[t].call(this,e)}}),p.create=function(){return new p},t.exports=p},function(t,e,i){var n=i(1),r=i(32),o=r.prototype,a=r.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?n.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),o.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return o.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(o.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},niceTicks:n.noop,niceExtent:n.noop});a.create=function(){return new a},t.exports=a},function(t,e,i){var n=i(1),r=i(4),o=i(9),a=i(37),s=a.prototype,l=Math.ceil,h=Math.floor,c=864e5,u=function(t,e,i,n){for(;n>i;){var r=i+n>>>1;t[r][2]=0&&f():o>=0?f():i&&(u=setTimeout(f,-o)),h=l};return p.clear=function(){u&&(clearTimeout(u),u=null)},p}var o,a,s,l=(new Date).getTime(),h=0,c=0,u=null,d="function"==typeof t;if(e=e||0,d)return r();for(var f=[],p=0;p=0;r--)if(!n[r].silent&&n[r]!==i&&!n[r].ignore&&a(n[r],t,e))return n[r]}},f.mixin(A,m),f.mixin(A,p),t.exports=A},function(t,e,i){function n(){return!1}function r(t,e,i,n){var r=document.createElement(e),o=i.getWidth(),a=i.getHeight(),s=r.style;return s.position="absolute",s.left=0,s.top=0,s.width=o+"px",s.height=a+"px",r.width=o*n,r.height=a*n,r.setAttribute("data-zr-dom-id",t),r}var o=i(1),a=i(42),s=function(t,e,i){var s;i=i||a.devicePixelRatio,"string"==typeof t?s=r(t,"canvas",e,i):o.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=n,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)"),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=i};s.prototype={constructor:s,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d");var t=this.dpr;1!=t&&this.ctx.scale(t,t)},createBackBuffer:function(){var t=this.dpr;this.domBack=r("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var i=this.dpr,n=this.dom,r=n.style,o=this.domBack;r.width=t+"px",r.height=e+"px",n.width=t*i,n.height=e*i,1!=i&&this.ctx.scale(i,i),o&&(o.width=t*i,o.height=e*i,1!=i&&this.ctxBack.scale(i,i))},clear:function(t){var e=this.dom,i=this.ctx,n=e.width,r=e.height,o=this.clearColor,a=this.motionBlur&&!t,s=this.lastFrameAlpha,l=this.dpr;if(a&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,n/l,r/l)),i.clearRect(0,0,n/l,r/l),o&&(i.save(),i.fillStyle=this.clearColor,i.fillRect(0,0,n/l,r/l),i.restore()),a){var h=this.domBack;i.save(),i.globalAlpha=s,i.drawImage(h,0,0,n/l,r/l),i.restore()}}},t.exports=s},function(t,e,i){"use strict";function n(t){return parseInt(t,10)}function r(t){return t?t.isBuildin?!0:"function"==typeof t.resize&&"function"==typeof t.refresh:!1}function o(t){t.__unusedCount++}function a(t){t.__dirty=!1,1==t.__unusedCount&&t.clear()}function s(t,e,i){return g.copy(t.getBoundingRect()),t.transform&&g.applyTransform(t.transform),m.width=e,m.height=i,!g.intersect(m)}function l(t,e){if(!t||!e||t.length!==e.length)return!0;for(var i=0;ip;p++){var m=t[p],v=this._singleCanvas?0:m.zlevel;if(n!==v&&(n=v,i=this.getLayer(n),i.isBuildin||d("ZLevel "+n+" has been used by unkown layer "+i.id),r=i.ctx,i.__unusedCount=0,(i.__dirty||e)&&i.clear()),(i.__dirty||e)&&!m.invisible&&0!==m.style.opacity&&m.scale[0]&&m.scale[1]&&(!m.culling||!s(m,c,u))){var y=m.__clipPaths;l(y,f)&&(f&&r.restore(),y&&(r.save(),h(y,r)),f=y),m.beforeBrush&&m.beforeBrush(r),m.brush(r,!1),m.afterBrush&&m.afterBrush(r)}m.__dirty=!1}f&&r.restore(),this.eachBuildinLayer(a)},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new p("zr_"+t,this,this.dpr),e.isBuildin=!0,this._layerConfig[t]&&u.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var i=this._layers,n=this._zlevelList,o=n.length,a=null,s=-1,l=this._domRoot;if(i[t])return void d("ZLevel "+t+" has been used already");if(!r(e))return void d("Layer of zlevel "+t+" is not valid");if(o>0&&t>n[0]){for(s=0;o-1>s&&!(n[s]t);s++);a=i[n[s]]}if(n.splice(s+1,0,t),a){var h=a.dom;h.nextSibling?l.insertBefore(e.dom,h.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom);i[t]=e},eachLayer:function(t,e){var i,n,r=this._zlevelList;for(n=0;nn;n++){var o=t[n],a=this._singleCanvas?0:o.zlevel,s=e[a];if(s){if(s.elCount++,s.__dirty)continue;s.__dirty=o.__dirty}}this.eachBuildinLayer(function(t,e){i[e]!==t.elCount&&(t.__dirty=!0)})},clear:function(){return this.eachBuildinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?u.merge(i[t],e,!0):i[t]=e;var n=this._layers[t];n&&u.merge(n,i[t],!0)}},delLayer:function(t){var e=this._layers,i=this._zlevelList,n=e[t];n&&(n.dom.parentNode.removeChild(n.dom),delete e[t],i.splice(u.indexOf(i,t),1))},resize:function(t,e){var i=this._domRoot;if(i.style.display="none",t=t||this._getWidth(),e=e||this._getHeight(),i.style.display="",this._width!=t||e!=this._height){i.style.width=t+"px",i.style.height=e+"px";for(var n in this._layers)this._layers[n].resize(t,e);this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new p("image",this,t.pixelRatio||this.dpr);e.initContext();var i=e.ctx;e.clearColor=t.backgroundColor,e.clear();for(var n=this.storage.getDisplayList(!0),r=0;rr;r++)this._updateAndAddDisplayable(e[r],null,t);i.length=this._displayListLen;for(var r=0,o=i.length;o>r;r++)i[r].__renderidx=r;i.sort(n)},_updateAndAddDisplayable:function(t,e,i){if(!t.ignore||i){t.beforeUpdate(),t.update(),t.afterUpdate();var n=t.clipPath;if(n&&(n.parent=t,n.updateTransform(),e?(e=e.slice(),e.push(n)):e=[n]),"group"==t.type){for(var r=t._children,o=0;oe;e++)this.delRoot(t[e]);else{var a;a="string"==typeof t?this._elements[t]:t;var s=r.indexOf(this._roots,a);s>=0&&(this.delFromMap(a.id),this._roots.splice(s,1),a instanceof o&&a.delChildrenFromStorage(this))}},addToMap:function(t){return t instanceof o&&(t.__storage=this),t.dirty(),this._elements[t.id]=t,this},get:function(t){return this._elements[t]},delFromMap:function(t){var e=this._elements,i=e[t];return i&&(delete e[t],i instanceof o&&(i.__storage=null)),this},dispose:function(){this._elements=this._renderList=this._roots=null}},t.exports=a},function(t,e,i){"use strict";var n=i(1),r=i(33).Dispatcher,o="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},a=i(56),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time=0,r.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),i=0;i=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;ia;a++){var s=i[a],l=s.step(t);l&&(r.push(l),o.push(s))}for(var a=0;n>a;)i[a]._needsRemove?(i[a]=i[n-1],i.pop(),n--):a++;n=r.length;for(var a=0;n>a;a++)o[a].fire(r[a]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},start:function(){function t(){e._running&&(o(t),e._update())}var e=this;this._running=!0,this._time=(new Date).getTime(),o(t)},stop:function(){this._running=!1},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var i=new a(t,e.loop,e.getter,e.setter);return i}},n.mixin(s,r),t.exports=s},function(t,e,i){function n(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null==t.loop?!1:t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}var r=i(133);n.prototype={constructor:n,step:function(t){this._initialized||(this._startTime=(new Date).getTime()+this._delay,this._initialized=!0);var e=(t-this._startTime)/this._life;if(!(0>e)){e=Math.min(e,1);var i=this.easing,n="string"==typeof i?r[i]:i,o="function"==typeof n?n(e):e;return this.fire("frame",o),1==e?this.loop?(this.restart(),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(){var t=(new Date).getTime(),e=(t-this._startTime)%this._life;this._startTime=(new Date).getTime()-e+this.gap,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)}},t.exports=n},function(t,e){var i={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)))},elasticOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},elasticInOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-i.bounceOut(1-t)},bounceOut:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return.5>t?.5*i.bounceIn(2*t):.5*i.bounceOut(2*t-1)+.5}};t.exports=i},function(t,e,i){var n=i(57).normalizeRadian,r=2*Math.PI;t.exports={containStroke:function(t,e,i,o,a,s,l,h,c){if(0===l)return!1;var u=l;h-=t,c-=e;var d=Math.sqrt(h*h+c*c);if(d-u>i||i>d+u)return!1;if(Math.abs(o-a)%r<1e-4)return!0;if(s){var f=o;o=n(a),a=n(f)}else o=n(o),a=n(a);o>a&&(a+=r);var p=Math.atan2(c,h);return 0>p&&(p+=r),p>=o&&a>=p||p+r>=o&&a>=p+r}}},function(t,e,i){var n=i(18);t.exports={containStroke:function(t,e,i,r,o,a,s,l,h,c,u){if(0===h)return!1;var d=h;if(u>e+d&&u>r+d&&u>a+d&&u>l+d||e-d>u&&r-d>u&&a-d>u&&l-d>u||c>t+d&&c>i+d&&c>o+d&&c>s+d||t-d>c&&i-d>c&&o-d>c&&s-d>c)return!1;var f=n.cubicProjectPoint(t,e,i,r,o,a,s,l,c,u,null);return d/2>=f}}},function(t,e){t.exports={containStroke:function(t,e,i,n,r,o,a){if(0===r)return!1;var s=r,l=0,h=t;if(a>e+s&&a>n+s||e-s>a&&n-s>a||o>t+s&&o>i+s||t-s>o&&i-s>o)return!1;if(t===i)return Math.abs(o-t)<=s/2;l=(e-n)/(t-i),h=(t*n-i*e)/(t-i);var c=l*o-a+h,u=c*c/(l*l+1);return s/2*s/2>=u}}},function(t,e,i){"use strict";function n(t,e){return Math.abs(t-e)e&&c>n&&c>a&&c>l||e>c&&n>c&&a>c&&l>c)return 0;var u=g.cubicRootAt(e,n,a,l,c,_);if(0===u)return 0;for(var d,f,p=0,m=-1,v=0;u>v;v++){var y=_[v],x=g.cubicAt(t,i,o,s,y);h>x||(0>m&&(m=g.cubicExtrema(e,n,a,l,b),b[1]1&&r(),d=g.cubicAt(e,n,a,l,b[0]),m>1&&(f=g.cubicAt(e,n,a,l,b[1]))),p+=2==m?yd?1:-1:yf?1:-1:f>l?1:-1:yd?1:-1:d>l?1:-1)}return p}function a(t,e,i,n,r,o,a,s){if(s>e&&s>n&&s>o||e>s&&n>s&&o>s)return 0;var l=g.quadraticRootAt(e,n,o,s,_);if(0===l)return 0;var h=g.quadraticExtremum(e,n,o);if(h>=0&&1>=h){for(var c=0,u=g.quadraticAt(e,n,o,h),d=0;l>d;d++){var f=g.quadraticAt(t,i,r,_[d]);a>f||(c+=_[d]u?1:-1:u>o?1:-1)}return c}var f=g.quadraticAt(t,i,r,_[0]);return a>f?0:e>o?1:-1}function s(t,e,i,n,r,o,a,s){if(s-=e,s>i||-i>s)return 0;var l=Math.sqrt(i*i-s*s);_[0]=-l,_[1]=l;var h=Math.abs(n-r);if(1e-4>h)return 0;if(1e-4>h%y){n=0,r=y;var c=o?1:-1;return a>=_[0]+t&&a<=_[1]+t?c:0}if(o){var l=n;n=p(r),r=p(l)}else n=p(n),r=p(r);n>r&&(r+=y);for(var u=0,d=0;2>d;d++){var f=_[d];if(f+t>a){var g=Math.atan2(s,f),c=o?1:-1;0>g&&(g=y+g),(g>=n&&r>=g||g+y>=n&&r>=g+y)&&(g>Math.PI/2&&g<1.5*Math.PI&&(c=-c),u+=c)}}return u}function l(t,e,i,r,l){for(var c=0,p=0,g=0,y=0,x=0,_=0;_1&&(i||(c+=m(p,g,y,x,r,l)),0!==c))return!0;switch(1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case h.M:y=t[_++],x=t[_++],p=y,g=x;break;case h.L:if(i){if(v(p,g,t[_],t[_+1],e,r,l))return!0}else c+=m(p,g,t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.C:if(i){if(u.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else c+=o(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.Q:if(i){if(d.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,r,l))return!0}else c+=a(p,g,t[_++],t[_++],t[_],t[_+1],r,l)||0;p=t[_++],g=t[_++];break;case h.A:var w=t[_++],M=t[_++],S=t[_++],A=t[_++],T=t[_++],C=t[_++],I=(t[_++],1-t[_++]),k=Math.cos(T)*S+w,L=Math.sin(T)*A+M;_>1?c+=m(p,g,k,L,r,l):(y=k,x=L);var D=(r-w)*A/S+w;if(i){if(f.containStroke(w,M,A,T,T+C,I,e,D,l))return!0}else c+=s(w,M,A,T,T+C,I,D,l);p=Math.cos(T+C)*S+w,g=Math.sin(T+C)*A+M;break;case h.R:y=p=t[_++],x=g=t[_++];var P=t[_++],z=t[_++],k=y+P,L=x+z;if(i){if(v(y,x,k,x,e,r,l)||v(k,x,k,L,e,r,l)||v(k,L,y,L,e,r,l)||v(y,L,k,L,e,r,l))return!0}else c+=m(k,x,k,L,r,l),c+=m(y,L,y,x,r,l);break;case h.Z:if(i){if(v(p,g,y,x,e,r,l))return!0}else if(c+=m(p,g,y,x,r,l),0!==c)return!0;p=y,g=x}}return i||n(g,x)||(c+=m(p,g,y,x,r,l)||0),0!==c}var h=i(27).CMD,c=i(136),u=i(135),d=i(138),f=i(134),p=i(57).normalizeRadian,g=i(18),m=i(75),v=c.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,i){return l(t,0,!1,e,i)},containStroke:function(t,e,i,n){return l(t,e,!0,i,n)}}},function(t,e,i){var n=i(18);t.exports={containStroke:function(t,e,i,r,o,a,s,l,h){if(0===s)return!1;var c=s;if(h>e+c&&h>r+c&&h>a+c||e-c>h&&r-c>h&&a-c>h||l>t+c&&l>i+c&&l>o+c||t-c>l&&i-c>l&&o-c>l)return!1;var u=n.quadraticProjectPoint(t,e,i,r,o,a,l,h,null);return c/2>=u}}},function(t,e){"use strict";function i(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}function n(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var r=function(){this._track=[]};r.prototype={constructor:r,recognize:function(t,e){return this._doTrack(t,e),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e){var i=t.touches;if(i){for(var n={points:[],touches:[],target:e,event:t},r=0,o=i.length;o>r;r++){var a=i[r];n.points.push([a.clientX,a.clientY]),n.touches.push(a)}this._track.push(n)}},_recognize:function(t){for(var e in o)if(o.hasOwnProperty(e)){var i=o[e](this._track,t);if(i)return i}}};var o={pinch:function(t,e){var r=t.length;if(r){var o=(t[r-1]||{}).points,a=(t[r-2]||{}).points||o;if(a&&a.length>1&&o&&o.length>1){var s=i(o)/i(a);!isFinite(s)&&(s=1),e.pinchScale=s;var l=n(o);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=r},function(t,e){var i=function(){this.head=null,this.tail=null,this._len=0},n=i.prototype;n.insert=function(t){var e=new r(t);return this.insertEntry(e),e},n.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this._len++},n.remove=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},n.len=function(){return this._len};var r=function(t){this.value=t,this.next,this.prev},o=function(t){this._list=new i,this._map={},this._maxSize=t||10},a=o.prototype;a.put=function(t,e){var i=this._list,n=this._map;if(null==n[t]){var r=i.len();if(r>=this._maxSize&&r>0){var o=i.head;i.remove(o),delete n[o.key]}var a=i.insert(e);a.key=t,n[t]=a}},a.get=function(t){var e=this._map[t],i=this._list;return null!=e?(e!==i.tail&&(i.remove(e),i.insertEntry(e)),e.value):void 0},a.clear=function(){this._list.clear(),this._map={}},t.exports=o},function(t,e,i){"use strict";var n=i(1),r=i(16),o=function(t,e,i,n){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==i?.5:i,r.call(this,n)};o.prototype={constructor:o,type:"radial",updateCanvasGradient:function(t,e){for(var i=t.getBoundingRect(),n=i.width,r=i.height,o=Math.min(n,r),a=this.x*n+i.x,s=this.y*r+i.y,l=this.r*o,h=e.createRadialGradient(a,s,0,a,s,l),c=this.colorStops,u=0;uy;y++)r(d,d,t[y]),o(f,f,t[y]);r(d,d,h[0]),o(f,f,h[1])}for(var y=0,x=t.length;x>y;y++){var _=t[y];if(i)c=t[y?y-1:x-1],u=t[(y+1)%x];else{if(0===y||y===x-1){p.push(n.clone(t[y]));continue}c=t[y-1],u=t[y+1]}n.sub(g,u,c),a(g,g,e);var b=s(_,c),w=s(_,u),M=b+w;0!==M&&(b/=M,w/=M),a(m,g,-b),a(v,g,w);var S=l([],_,m),A=l([],_,v);h&&(o(S,S,d),r(S,S,f),o(A,A,d),r(A,A,f)),p.push(S),p.push(A)}return i&&p.push(p.shift()),p}},function(t,e,i){function n(t,e,i,n,r,o,a){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*a+(-3*(e-i)-2*s-l)*o+s*r+e}var r=i(5);t.exports=function(t,e){for(var i=t.length,o=[],a=0,s=1;i>s;s++)a+=r.distance(t[s-1],t[s]);var l=a/2;l=i>l?i:l;for(var s=0;l>s;s++){var h,c,u,d=s/(l-1)*(e?i:i-1),f=Math.floor(d),p=d-f,g=t[f%i];e?(h=t[(f-1+i)%i],c=t[(f+1)%i],u=t[(f+2)%i]):(h=t[0===f?f:f-1],c=t[f>i-2?i-1:f+1],u=t[f>i-3?i-1:f+2]);var m=p*p,v=p*m;o.push([n(h[0],g[0],c[0],u[0],p,m,v),n(h[1],g[1],c[1],u[1],p,m,v)])}return o}},function(t,e,i){t.exports=i(6).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),h=Math.sin(o);t.moveTo(l*r+i,h*r+n),t.arc(i,n,r,o,a,!s)}})},function(t,e,i){"use strict";var n=i(18),r=n.quadraticSubdivide,o=n.cubicSubdivide,a=n.quadraticAt,s=n.cubicAt,l=[];t.exports=i(6).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,a=e.x2,s=e.y2,h=e.cpx1,c=e.cpy1,u=e.cpx2,d=e.cpy2,f=e.percent;0!==f&&(t.moveTo(i,n),null==u||null==d?(1>f&&(r(i,h,a,f,l),h=l[1],a=l[2],r(n,c,s,f,l),c=l[1],s=l[2]),t.quadraticCurveTo(h,c,a,s)):(1>f&&(o(i,h,u,a,f,l),h=l[1],u=l[2],a=l[3],o(n,c,d,s,f,l),c=l[1],d=l[2],s=l[3]),t.bezierCurveTo(h,c,u,d,a,s)))},pointAt:function(t){var e=this.shape,i=e.cpx2,n=e.cpy2;return null===i||null===n?[a(e.x1,e.cpx1,e.x2,t),a(e.y1,e.cpy1,e.y2,t)]:[s(e.x1,e.cpx1,e.cpx1,e.x2,t),s(e.y1,e.cpy1,e.cpy1,e.y2,t)]}})},function(t,e,i){"use strict";t.exports=i(6).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e){t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,i){t.exports=i(6).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,o=e.y2,a=e.percent;0!==a&&(t.moveTo(i,n),1>a&&(r=i*(1-a)+r*a,o=n*(1-a)+o*a),t.lineTo(r,o))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,i){var n=i(59);t.exports=i(6).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){n.buildPath(t,e,!0)}})},function(t,e,i){var n=i(59);t.exports=i(6).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){n.buildPath(t,e,!1)}})},function(t,e,i){var n=i(60);t.exports=i(6).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,r=e.y,o=e.width,a=e.height;e.r?n.buildPath(t,e):t.rect(i,r,o,a),t.closePath()}})},function(t,e,i){t.exports=i(6).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=2*Math.PI;t.moveTo(i+e.r,n),t.arc(i,n,e.r,0,r,!1),t.moveTo(i+e.r0,n),t.arc(i,n,e.r0,0,r,!0)}})},function(t,e,i){t.exports=i(6).extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},buildPath:function(t,e){var i=e.cx,n=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(a),c=Math.sin(a);t.moveTo(h*r+i,c*r+n),t.lineTo(h*o+i,c*o+n),t.arc(i,n,o,a,s,!l),t.lineTo(Math.cos(s)*r+i,Math.sin(s)*r+n),0!==r&&t.arc(i,n,r,s,a,l),t.closePath()}})},function(t,e,i){"use strict";var n=i(56),r=i(1),o=r.isString,a=r.isFunction,s=r.isObject,l=i(45),h=function(){this.animators=[]};h.prototype={constructor:h,animate:function(t,e){var i,o=!1,a=this,s=this.__zr;if(t){var h=t.split("."),c=a;o="shape"===h[0];for(var u=0,d=h.length;d>u;u++)c&&(c=c[h[u]]);c&&(i=c)}else i=a;if(!i)return void l('Property "'+t+'" is not existed in element '+a.id);var f=a.animators,p=new n(i,e);return p.during(function(t){a.dirty(o)}).done(function(){f.splice(r.indexOf(f,p),1)}),f.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,i=e.length,n=0;i>n;n++)e[n].stop(t);return e.length=0,this},animateTo:function(t,e,i,n,r){function s(){h--,h||r&&r()}o(i)?(r=n,n=i,i=0):a(n)?(r=n,n="linear",i=0):a(i)?(r=i,i=0):a(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,i,n,r);var l=this.animators.slice(),h=l.length;h||r&&r();for(var c=0;c0&&this.animate(t,!1).when(null==n?500:n,a).delay(o||0),this}},t.exports=h},function(t,e){function i(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}i.prototype={constructor:i,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e, +e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this._dispatchProxy(e,"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,n=t.offsetY,r=i-this._x,o=n-this._y;this._x=i,this._y=n,e.drift(r,o,t),this._dispatchProxy(e,"drag",t.event);var a=this.findHover(i,n,e),s=this._dropTarget;this._dropTarget=a,e!==a&&(s&&a!==s&&this._dispatchProxy(s,"dragleave",t.event),a&&a!==s&&this._dispatchProxy(a,"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this._dispatchProxy(e,"dragend",t.event),this._dropTarget&&this._dispatchProxy(this._dropTarget,"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=i},function(t,e,i){function n(t,e,i,n,r,o,a,s,l,h,c){var g=l*(p/180),y=f(g)*(t-i)/2+d(g)*(e-n)/2,x=-1*d(g)*(t-i)/2+f(g)*(e-n)/2,_=y*y/(a*a)+x*x/(s*s);_>1&&(a*=u(_),s*=u(_));var b=(r===o?-1:1)*u((a*a*(s*s)-a*a*(x*x)-s*s*(y*y))/(a*a*(x*x)+s*s*(y*y)))||0,w=b*a*x/s,M=b*-s*y/a,S=(t+i)/2+f(g)*w-d(g)*M,A=(e+n)/2+d(g)*w+f(g)*M,T=v([1,0],[(y-w)/a,(x-M)/s]),C=[(y-w)/a,(x-M)/s],I=[(-1*y-w)/a,(-1*x-M)/s],k=v(C,I);m(C,I)<=-1&&(k=p),m(C,I)>=1&&(k=0),0===o&&k>0&&(k-=2*p),1===o&&0>k&&(k+=2*p),c.addData(h,S,A,a,s,T,k,g,o)}function r(t){if(!t)return[];var e,i=t.replace(/-/g," -").replace(/ /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e0&&""===m[0]&&m.shift();for(var v=0;vn;n++)i=t[n],i.__dirty&&i.buildPath(i.path,i.shape),r.push(i.path);var s=new a(e);return s.buildPath=function(t){t.appendPath(r);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,i){function n(t,e){var i,n,o,c,u,d,f=t.data,p=r.M,g=r.C,m=r.L,v=r.R,y=r.A,x=r.Q;for(o=0,c=0;ou;u++){var d=s[u];d[0]=f[o++],d[1]=f[o++],a(d,d,e),f[c++]=d[0],f[c++]=d[1]}}}var r=i(27).CMD,o=i(5),a=o.applyTransform,s=[[],[],[]],l=Math.sqrt,h=Math.atan2;t.exports=n},function(t,e,i){if(!i(15).canvasSupported){var n,r="urn:schemas-microsoft-com:vml",o=window,a=o.document,s=!1;try{!a.namespaces.zrvml&&a.namespaces.add("zrvml",r),n=function(t){return a.createElement("')}}catch(l){n=function(t){return a.createElement("<"+t+' xmlns="'+r+'" class="zrvml">')}}var h=function(){if(!s){s=!0;var t=a.styleSheets;t.length<31?a.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}};t.exports={doc:a,initVML:h,createNode:n}}},,function(t,e,i){function n(t,e,i){v.call(this),this.type=t,this.zr=e,this.opt=y.clone(i),this.group=new x.Group,this._containerRect=null,this._track=[],this._dragging,this._cover,this._disabled=!0,this._handlers={mousedown:_(s,this),mousemove:_(l,this),mouseup:_(h,this)},b(C,function(t){this.zr.on(t,this._handlers[t])},this)}function r(t){t.traverse(function(t){t.z=A})}function o(t,e){var i=this.group.transformCoordToLocal(t,e);return!this._containerRect||this._containerRect.contain(i[0],i[1])}function a(t){var e=t.event;e.preventDefault&&e.preventDefault()}function s(t){if(!(this._disabled||t.target&&t.target.draggable)){a(t);var e=t.offsetX,i=t.offsetY;o.call(this,e,i)&&(this._dragging=!0,this._track=[[e,i]])}}function l(t){this._dragging&&!this._disabled&&(a(t),c.call(this,t))}function h(t){this._dragging&&!this._disabled&&(a(t),c.call(this,t,!0),this._dragging=!1,this._track=[])}function c(t,e){var i=t.offsetX,n=t.offsetY;if(o.call(this,i,n)){this._track.push([i,n]);var r=u.call(this)?I[this.type].getRanges.call(this):[];d.call(this,r),this.trigger("selected",y.clone(r)),e&&this.trigger("selectEnd",y.clone(r))}}function u(){var t=this._track;if(!t.length)return!1;var e=t[t.length-1],i=t[0],n=e[0]-i[0],r=e[1]-i[1],o=S(n*n+r*r,.5);return o>T}function d(t){var e=I[this.type];t&&t.length?(this._cover||(this._cover=e.create.call(this),this.group.add(this._cover)),e.update.call(this,t)):(this.group.remove(this._cover),this._cover=null),r(this.group)}function f(){var t=this.group,e=t.parent;e&&e.remove(t)}function p(){var t=this.opt;return new x.Rect({style:{stroke:t.stroke,fill:t.fill,lineWidth:t.lineWidth,opacity:t.opacity}})}function g(){return y.map(this._track,function(t){return this.group.transformCoordToLocal(t[0],t[1])},this)}function m(){var t=g.call(this),e=t.length-1;return 0>e&&(e=0),[t[0],t[e]]}var v=i(21),y=i(1),x=i(3),_=y.bind,b=y.each,w=Math.min,M=Math.max,S=Math.pow,A=1e4,T=2,C=["mousedown","mousemove","mouseup"];n.prototype={constructor:n,enable:function(t,e){this._disabled=!1,f.call(this),this._containerRect=e!==!1?e||t.getBoundingRect():null,t.add(this.group)},update:function(t){d.call(this,t&&y.clone(t))},disable:function(){this._disabled=!0,f.call(this)},dispose:function(){this.disable(),b(C,function(t){this.zr.off(t,this._handlers[t])},this)}},y.mixin(n,v);var I={line:{create:p,getRanges:function(){var t=m.call(this),e=w(t[0][0],t[1][0]),i=M(t[0][0],t[1][0]);return[[e,i]]},update:function(t){var e=t[0],i=this.opt.width;this._cover.setShape({x:e[0],y:-i/2,width:e[1]-e[0],height:i})}},rect:{create:p,getRanges:function(){var t=m.call(this),e=[w(t[1][0],t[0][0]),w(t[1][1],t[0][1])],i=[M(t[1][0],t[0][0]),M(t[1][1],t[0][1])];return[[[e[0],i[0]],[e[1],i[1]]]]},update:function(t){var e=t[0];this._cover.setShape({x:e[0][0],y:e[1][0],width:e[0][1]-e[0][0],height:e[1][1]-e[1][0]})}}};t.exports=n},function(t,e,i){function n(){this.group=new r.Group,this._symbolEl=new s({silent:!0})}var r=i(3),o=i(24),a=i(1),s=r.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(t,e){for(var i=e.points,n=e.sizes,r=this.symbolProxy,o=r.shape,a=0;at.get("largeThreshold")?r:o;this._symbolDraw=s,s.updateData(n),a.add(s.group),a.remove(s===r?o.group:r.group)},updateLayout:function(t){this._symbolDraw.updateLayout(t)},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e,!0)}})},function(t,e,i){i(101),i(39),i(40),i(172),i(173),i(168),i(169),i(99),i(98)},function(t,e,i){function n(t,e){var i=[1/0,-(1/0)];return h(e,function(e){var n=e.getData();n&&h(e.coordDimToDataDim(t),function(t){var e=n.getDataExtent(t);e[0]i[1]&&(i[1]=e[1])})},this),i}function r(t,e,i){var n=i.getAxisModel(),r=n.axis.scale,a=[0,100],s=[t.start,t.end],u=[];return e=e.slice(),o(e,n,r),h(["startValue","endValue"],function(e){u.push(null!=t[e]?r.parse(t[e]):null)}),h([0,1],function(t){var i=u[t],n=s[t];null!=n||null==i?(null==n&&(n=a[t]),i=r.parse(l.linearMap(n,a,e,!0))):n=l.linearMap(i,e,a,!0),u[t]=l.round(i),s[t]=l.round(n)}),{valueWindow:c(u),percentWindow:c(s)}}function o(t,e,i){return h(["min","max"],function(n,r){var o=e.get(n,!0);null!=o&&(o+"").toLowerCase()!=="data"+n&&(t[r]=i.parse(o))}),e.get("scale",!0)||(t[0]>0&&(t[0]=0),t[1]<0&&(t[1]=0)),t}function a(t,e){var i=t.getAxisModel(),n=t._percentWindow,r=t._valueWindow;if(n){var o=e||0===n[0]&&100===n[1],a=!e&&l.getPixelPrecision(r,[0,500]),s=!(e||20>a&&a>=0),h=e||o||s;i.setRange&&i.setRange(h?null:+r[0].toFixed(a),h?null:+r[1].toFixed(a))}}var s=i(1),l=i(4),h=s.each,c=l.asc,u=function(t,e,i,n){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this.ecModel=n,this._dataZoomModel=i};u.prototype={constructor:u,hostedBy:function(t){return this._dataZoomModel===t},getDataExtent:function(){return this._dataExtent.slice()},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[];return this.ecModel.eachSeries(function(e){this._axisIndex===e.get(this._dimName+"AxisIndex")&&t.push(e)},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,i=this._dimName,n=this.ecModel,r=this.getAxisModel(),o="x"===i||"y"===i;o?(e="gridIndex",t="x"===i?"y":"x"):(e="polarIndex",t="angle"===i?"radius":"angle");var a;return n.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(r.get(e)||0)&&(a=t)}),a},reset:function(t){if(t===this._dataZoomModel){var e=this._dataExtent=n(this._dimName,this.getTargetSeriesModels()),i=r(t.option,e,this);this._valueWindow=i.valueWindow,this._percentWindow=i.percentWindow,a(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,a(this,!0))},filterData:function(t){function e(t){return t>=o[0]&&t<=o[1]}if(t===this._dataZoomModel){var i=this._dimName,n=this.getTargetSeriesModels(),r=t.get("filterMode"),o=this._valueWindow,a=this.getOtherAxisModel();t.get("$fromToolbox")&&a&&"category"===a.get("type")&&(r="empty"),h(n,function(t){var n=t.getData();n&&h(t.coordDimToDataDim(i),function(i){"empty"===r?t.setData(n.map(i,function(t){return e(t)?t:NaN})):n.filterSelf(i,e)})})}}},t.exports=u},function(t,e,i){t.exports=i(39).extend({type:"dataZoom.inside",defaultOption:{zoomLock:!1}})},function(t,e,i){function n(t,e,i,n){e=e.slice();var r=n.axisModels[0];if(r){var a=o(t,r,i),s=a.signal*(e[1]-e[0])*a.pixel/a.pixelLength;return h(s,e,[0,100],"rigid"),e}}function r(t,e,i,n,r,s){i=i.slice();var l=r.axisModels[0];if(l){var h=o(e,l,n),c=h.pixel-h.pixelStart,u=c/h.pixelLength*(i[1]-i[0])+i[0];return t=Math.max(t,0),i[0]=(i[0]-u)*t+u,i[1]=(i[1]-u)*t+u,a(i)}}function o(t,e,i){var n=e.axis,r=i.rect,o={};return"x"===n.dim?(o.pixel=t[0],o.pixelLength=r.width,o.pixelStart=r.x,o.signal=n.inverse?1:-1):(o.pixel=t[1],o.pixelLength=r.height,o.pixelStart=r.y,o.signal=n.inverse?-1:1),o}function a(t){var e=[0,100];return!(t[0]<=e[1])&&(t[0]=e[1]),!(t[1]<=e[1])&&(t[1]=e[1]),!(t[0]>=e[0])&&(t[0]=e[0]),!(t[1]>=e[0])&&(t[1]=e[0]),t}var s=i(40),l=i(1),h=i(71),c=i(174),u=l.bind,d=s.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,i,n){d.superApply(this,"render",arguments),c.shouldRecordRange(n,t.id)&&(this._range=t.getPercentRange());var r=this.getTargetInfo().cartesians,o=l.map(r,function(t){return c.generateCoordId(t.model)});l.each(r,function(e){var n=e.model;c.register(i,{coordId:c.generateCoordId(n),allCoordIds:o,coordinateSystem:n.coordinateSystem,dataZoomId:t.id,throttleRage:t.get("throttle",!0),panGetRange:u(this._onPan,this,e),zoomGetRange:u(this._onZoom,this,e)})},this)},remove:function(){c.unregister(this.api,this.dataZoomModel.id),d.superApply(this,"remove",arguments),this._range=null},dispose:function(){c.unregister(this.api,this.dataZoomModel.id),d.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,i,r){return this._range=n([i,r],this._range,e,t)},_onZoom:function(t,e,i,n,o){var a=this.dataZoomModel;return a.option.zoomLock?this._range:this._range=r(1/i,[n,o],this._range,e,t,a)}});t.exports=d},function(t,e,i){var n=i(39);t.exports=n.extend({type:"dataZoom.select"})},function(t,e,i){t.exports=i(40).extend({type:"dataZoom.select"})},function(t,e,i){var n=i(39),r=(i(11),i(1),n.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackgroundColor:"#ddd",fillerColor:"rgba(47,69,84,0.15)",handleColor:"rgba(148,164,165,0.95)",handleSize:10,labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}},mergeOption:function(t){r.superApply(this,"mergeOption",arguments)}}));t.exports=r},function(t,e,i){function n(t){return"x"===t?"y":"x"}var r=i(1),o=i(3),a=i(126),s=i(40),l=o.Rect,h=i(4),c=h.linearMap,u=i(11),d=i(71),f=h.asc,p=r.bind,g=Math.round,m=Math.max,v=r.each,y=7,x=1,_=30,b="horizontal",w="vertical",M=5,S=["line","bar","candlestick","scatter"],A=s.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._halfHandleSize,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){return A.superApply(this,"render",arguments),a.createOrUpdate(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),this._halfHandleSize=g(t.get("handleSize")/2),this.dataZoomModel.get("show")===!1?void this.group.removeAll():(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),void this._updateView())},remove:function(){A.superApply(this,"remove",arguments),a.clear(this,"_dispatchZoomAction")},dispose:function(){A.superApply(this,"dispose",arguments),a.clear(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new o.Group;this._renderBackground(),this._renderDataShadow(),this._renderHandle(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},o=this._orient===b?{right:n.width-i.x-i.width,top:n.height-_-y,width:i.width,height:_}:{right:y,top:i.y,width:_,height:i.height},a=u.getLayoutParams(t.option);r.each(["right","top","width","height"],function(t){"ph"===a[t]&&(a[t]=o[t])});var s=u.getLayoutRect(a,n,t.padding);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===w&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),r=n&&n.get("inverse"),o=this._displayables.barGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(i!==b||r?i===b&&r?{scale:a?[-1,1]:[-1,-1]}:i!==w||r?{scale:a?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:a?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:a?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.position[0]=e.x-s.x,t.position[1]=e.y-s.y},_getViewExtent:function(){var t=this._halfHandleSize,e=m(this._size[0],4*t),i=[t,e-t];return i},_renderBackground:function(){var t=this.dataZoomModel,e=this._size;this._displayables.barGroup.add(new l({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")}}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),r=i.getShadowDim?i.getShadowDim():t.otherDim,a=n.getDataExtent(r),s=.3*(a[1]-a[0]);a=[a[0]-s,a[1]+s];var l=[0,e[1]],h=[0,e[0]],u=[[e[0],0],[0,0]],d=h[1]/(n.count()-1),f=0,p=Math.round(n.count()/e[0]);n.each([r],function(t,e){if(p>0&&e%p)return void(f+=d);var i=null==t||isNaN(t)||""===t?null:c(t,a,l,!0);null!=i&&u.push([f,i]),f+=d}),this._displayables.barGroup.add(new o.Polyline({shape:{points:u},style:{fill:this.dataZoomModel.get("dataBackgroundColor"),lineWidth:0},silent:!0,z2:-20}))}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(e!==!1){var i,o=this.ecModel;return t.eachTargetAxis(function(a,s){var l=t.getAxisProxy(a.name,s).getTargetSeriesModels();r.each(l,function(t){if(!(i||e!==!0&&r.indexOf(S,t.get("type"))<0)){var l=n(a.name),h=o.getComponent(a.axis,s).axis;i={thisAxis:h,series:t,thisDim:a.name,otherDim:l,otherAxisInverse:t.coordinateSystem.getOtherAxis(h).inverse}}},this)},this),i}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],i=t.handleLabels=[],n=this._displayables.barGroup,r=this._size;n.add(t.filler=new l({draggable:!0,cursor:"move",drift:p(this._onDragMove,this,"all"),ondragend:p(this._onDragEnd,this),onmouseover:p(this._showDataInfo,this,!0),onmouseout:p(this._showDataInfo,this,!1),style:{fill:this.dataZoomModel.get("fillerColor"),textPosition:"inside"}})),n.add(new l(o.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:r[0],height:r[1]},style:{stroke:this.dataZoomModel.get("dataBackgroundColor"),lineWidth:x,fill:"rgba(0,0,0,0)"}}))),v([0,1],function(t){n.add(e[t]=new l({style:{fill:this.dataZoomModel.get("handleColor")},cursor:"move",draggable:!0,drift:p(this._onDragMove,this,t),ondragend:p(this._onDragEnd,this),onmouseover:p(this._showDataInfo,this,!0),onmouseout:p(this._showDataInfo,this,!1)}));var r=this.dataZoomModel.textStyleModel;this.group.add(i[t]=new o.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",fill:r.getTextColor(),textFont:r.getFont()}}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[c(t[0],[0,100],e,!0),c(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var i=this._handleEnds,n=this._getViewExtent();d(e,i,n,"all"===t||this.dataZoomModel.get("zoomLock")?"rigid":"cross",t),this._range=f([c(i[0],n,[0,100],!0),c(i[1],n,[0,100],!0)])},_updateView:function(){var t=this._displayables,e=this._handleEnds,i=f(e.slice()),n=this._size,r=this._halfHandleSize;v([0,1],function(i){var o=t.handles[i];o.setShape({x:e[i]-r,y:-1,width:2*r,height:n[1]+2,r:1})},this),t.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:this._size[1]}),this._updateDataInfo()},_updateDataInfo:function(){function t(t){var e=o.getTransform(i.handles[t],this.group),s=o.transformDirection(0===t?"right":"left",e),l=this._halfHandleSize+M,c=o.applyTransform([h[t]+(0===t?-l:l),this._size[1]/2],e);n[t].setStyle({x:c[0],y:c[1],textVerticalAlign:r===b?"middle":s,textAlign:r===b?s:"center",text:a[t]})}var e=this.dataZoomModel,i=this._displayables,n=i.handleLabels,r=this._orient,a=["",""];if(e.get("showDetail")){var s,l;e.eachTargetAxis(function(t,i){s||(s=e.getAxisProxy(t.name,i).getDataValueWindow(),l=this.ecModel.getComponent(t.axis,i).axis)},this),s&&(a=[this._formatLabel(s[0],l),this._formatLabel(s[1],l)])}var h=f(this._handleEnds.slice());t.call(this,0),t.call(this,1)},_formatLabel:function(t,e){var i=this.dataZoomModel,n=i.get("labelFormatter");if(r.isFunction(n))return n(t);var o=i.get("labelPrecision");return null!=o&&"auto"!==o||(o=e.getPixelPrecision()),t=null==t&&isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(o,20)),r.isString(n)&&(t=n.replace("{value}",t)),t},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,i){this._dragging=!0;var n=this._applyBarTransform([e,i],!0);this._updateInterval(t,n[0]),this._updateView(),this.dataZoomModel.get("realtime")&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_applyBarTransform:function(t,e){var i=this._displayables.barGroup.getLocalTransform();return o.applyTransform(t,i,e)},_findCoordRect:function(){var t,e=this.getTargetInfo();if(e.cartesians.length)t=e.cartesians[0].model.coordinateSystem.getRect();else{var i=this.api.getWidth(),n=this.api.getHeight();t={x:.2*i,y:.2*n,width:.6*i,height:.6*n}}return t}});t.exports=A},function(t,e,i){function n(t){var e=t.getZr();return e[p]||(e[p]={})}function r(t,e,i){var n=new u(t.getZr());return n.enable(),n.on("pan",f(a,i)),n.on("zoom",f(s,i)),n}function o(t){c.each(t,function(e,i){e.count||(e.controller.off("pan").off("zoom"),delete t[i])})}function a(t,e,i){l(t,function(n){return n.panGetRange(t.controller,e,i)})}function s(t,e,i,n){l(t,function(r){return r.zoomGetRange(t.controller,e,i,n)})}function l(t,e){var i=[];c.each(t.dataZoomInfos,function(t){var n=e(t);n&&i.push({dataZoomId:t.dataZoomId,start:n[0],end:n[1]})}),t.dispatchAction(i)}function h(t,e){t.dispatchAction({type:"dataZoom",batch:e})}var c=i(1),u=i(70),d=i(126),f=c.curry,p="\x00_ec_dataZoom_roams",g={register:function(t,e){var i=n(t),a=e.dataZoomId,s=e.coordId;c.each(i,function(t,i){var n=t.dataZoomInfos;n[a]&&c.indexOf(e.allCoordIds,s)<0&&(delete n[a],t.count--)}),o(i);var l=i[s];l||(l=i[s]={coordId:s,dataZoomInfos:{},count:0},l.controller=r(t,e,l),l.dispatchAction=c.curry(h,t)),l.controller.rect=e.coordinateSystem.getRect().clone(),d.createOrUpdate(l,"dispatchAction",e.throttleRate,"fixRate"),!l.dataZoomInfos[a]&&l.count++,l.dataZoomInfos[a]=e},unregister:function(t,e){var i=n(t);c.each(i,function(t){var i=t.dataZoomInfos;i[e]&&(delete i[e],t.count--)}),o(i)},shouldRecordRange:function(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var i=0,n=t.batch.length;n>i;i++)if(t.batch[i].dataZoomId===e)return!1;return!0},generateCoordId:function(t){return t.type+"\x00_"+t.id}};t.exports=g},function(t,e,i){i(101),i(39),i(40),i(170),i(171),i(99),i(98)},function(t,e,i){i(177),i(179),i(178);var n=i(2);n.registerProcessor("filter",i(180))},function(t,e,i){"use strict";var n=i(1),r=i(12),o=i(2).extendComponentModel({type:"legend",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,i){this.mergeDefaultAndTheme(t,i),t.selected=t.selected||{},this._updateData(i);var n=this._data,r=this.option.selected;if(n[0]&&"single"===this.get("selectedMode")){var o=!1;for(var a in r)r[a]&&(this.select(a),o=!0);!o&&this.select(n[0].get("name"))}},mergeOption:function(t){o.superCall(this,"mergeOption",t),this._updateData(this.ecModel)},_updateData:function(t){var e=n.map(this.get("data")||[],function(t){return"string"==typeof t&&(t={name:t}),new r(t,this,this.ecModel)},this);this._data=e;var i=n.map(t.getSeries(),function(t){return t.name});t.eachSeries(function(t){if(t.legendDataProvider){var e=t.legendDataProvider();i=i.concat(e.mapArray(e.getName))}}),this._availableNames=i},getData:function(){return this._data},select:function(t){var e=this.option.selected,i=this.get("selectedMode");if("single"===i){var r=this._data;n.each(r,function(t){e[t.get("name")]=!1})}e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;t in e||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(t in e&&!e[t])&&n.indexOf(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:"top",align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,textStyle:{color:"#333"},selectedMode:!0}});t.exports=o},function(t,e,i){function n(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function r(t,e,i){t.get("legendHoverLink")&&i.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function o(t,e,i){t.get("legendHoverLink")&&i.dispatchAction({type:"downplay",seriesName:t.name,name:e})}var a=i(1),s=i(24),l=i(3),h=i(103),c=a.curry,u="#ccc";t.exports=i(2).extendComponentView({type:"legend",init:function(){this._symbolTypeStore={}},render:function(t,e,i){var s=this.group;if(s.removeAll(),t.get("show")){var u=t.get("selectedMode"),d=t.get("align");"auto"===d&&(d="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left");var f={},p={};a.each(t.getData(),function(a){var h=a.get("name");""!==h&&"\n"!==h||s.add(new l.Group({newline:!0}));var g=e.getSeriesByName(h)[0];if(f[h]=a,g&&!p[h]){var m=g.getData(),v=m.getVisual("color");"function"==typeof v&&(v=v(g.getDataParams(0)));var y=m.getVisual("legendSymbol")||"roundRect",x=m.getVisual("symbol"),_=this._createItem(h,a,t,y,x,d,v,u);_.on("click",c(n,h,i)).on("mouseover",c(r,g,"",i)).on("mouseout",c(o,g,"",i)),p[h]=!0}},this),e.eachRawSeries(function(e){if(e.legendDataProvider){var a=e.legendDataProvider();a.each(function(s){var l=a.getName(s);if(f[l]&&!p[l]){var h=a.getItemVisual(s,"color"),g="roundRect",m=this._createItem(l,f[l],t,g,null,d,h,u);m.on("click",c(n,l,i)).on("mouseover",c(r,e,l,i)).on("mouseout",c(o,e,l,i)),p[l]=!0}},!1,this)}},this),h.layout(s,t,i),h.addBackground(s,t)}},_createItem:function(t,e,i,n,r,o,a,h){var c=i.get("itemWidth"),d=i.get("itemHeight"),f=i.isSelected(t),p=new l.Group,g=e.getModel("textStyle"),m=e.get("icon");if(n=m||n,p.add(s.createSymbol(n,0,0,c,d,f?a:u)),!m&&r&&(r!==n||"none"==r)){var v=.8*d;"none"===r&&(r="circle"),p.add(s.createSymbol(r,(c-v)/2,(d-v)/2,v,v,f?a:u))}var y="left"===o?c+5:-5,x=o,_=i.get("formatter");"string"==typeof _&&_?t=_.replace("{name}",t):"function"==typeof _&&(t=_(t));var b=new l.Text({style:{text:t,x:y,y:d/2,fill:f?g.getTextColor():u,textFont:g.getFont(),textAlign:x,textVerticalAlign:"middle"}});return p.add(b),p.add(new l.Rect({shape:p.getBoundingRect(),invisible:!0})),p.eachChild(function(t){t.silent=!h}),this.group.add(p),l.setHoverStyle(p),p}})},function(t,e,i){function n(t,e,i){var n,r={},a="toggleSelected"===t;return i.eachComponent("legend",function(i){a&&null!=n?i[n?"select":"unSelect"](e.name):(i[t](e.name),n=i.isSelected(e.name));var s=i.getData();o.each(s,function(t){var e=t.get("name");if("\n"!==e&&""!==e){var n=i.isSelected(e);e in r?r[e]=r[e]&&n:r[e]=n}})}),{name:e.name,selected:r}}var r=i(2),o=i(1);r.registerAction("legendToggleSelect","legendselectchanged",o.curry(n,"toggleSelected")),r.registerAction("legendSelect","legendselected",o.curry(n,"select")),r.registerAction("legendUnSelect","legendunselected",o.curry(n,"unSelect"))},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var i=0;i=0&&(p=+p.toFixed(g)),u[h]=d[h]=p,n=[u,d,{type:o,valueIndex:n.valueIndex,value:p}]}return n=[f.dataTransform(t,n[0]),f.dataTransform(t,n[1]),a.extend({},n[2])],n[2].type=n[2].type||"",a.merge(n[2],n[0]),a.merge(n[2],n[1]),n},m={formatTooltip:function(t){var e=this._data,i=this.getRawValue(t),n=a.isArray(i)?a.map(i,u).join(", "):u(i),r=e.getName(t);return this.name+"
            "+((r?d(r)+" : ":"")+n)},getRawDataArray:function(){return this.option.data},getData:function(){return this._data},setData:function(t){this._data=t}};a.defaults(m,h.dataFormatMixin),i(2).extendComponentView({type:"markLine",init:function(){this._markLineMap={}},render:function(t,e,i){var n=this._markLineMap;for(var r in n)n[r].__keep=!1;e.eachSeries(function(t){var n=t.markLineModel;n&&this._renderSeriesML(t,n,e,i)},this);for(var r in n)n[r].__keep||this.group.remove(n[r].group)},updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markLineModel;if(e){var n=e.getData(),o=e.__from,a=e.__to;o.each(function(e){var s=n.getItemModel(e),l=s.get("type"),h=s.get("valueIndex");r(o,e,!0,l,h,t,i),r(a,e,!1,l,h,t,i)}),n.each(function(t){n.setItemLayout(t,[o.getItemLayout(t),a.getItemLayout(t)])}),this._markLineMap[t.name].updateLayout()}},this)},_renderSeriesML:function(t,e,i,n){function s(e,i,o,a,s){var l=e.getItemModel(i);r(e,i,o,a,s,t,n),e.setItemVisual(i,{symbolSize:l.get("symbolSize")||_[o?0:1],symbol:l.get("symbol",!0)||x[o?0:1],color:l.get("itemStyle.normal.color")||c.getVisual("color")})}var l=t.coordinateSystem,h=t.name,c=t.getData(),u=this._markLineMap,d=u[h];d||(d=u[h]=new p),this.group.add(d.group);var f=o(l,t,e),g=f.from,v=f.to,y=f.line;e.__from=g,e.__to=v,a.extend(e,m),e.setData(y);var x=e.get("symbol"),_=e.get("symbolSize");a.isArray(x)||(x=[x,x]),"number"==typeof _&&(_=[_,_]),f.from.each(function(t){var e=y.getItemModel(t),i=e.get("type"),n=e.get("valueIndex");s(g,t,!0,i,n),s(v,t,!1,i,n)}),y.each(function(t){var e=y.getItemModel(t).get("lineStyle.normal.color");y.setItemVisual(t,{color:e||g.getItemVisual(t,"color")}),y.setItemLayout(t,[g.getItemLayout(t),v.getItemLayout(t)])}),d.updateData(y,g,v),f.line.eachItemGraphicEl(function(t,i){t.traverse(function(t){t.dataModel=e})}),d.__keep=!0}})},function(t,e,i){var n=i(7),r=i(2).extendComponentModel({type:"markPoint",dependencies:["series","grid","polar"],init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,i,n.createdBySelf,!0)},mergeOption:function(t,e,i,o){i||e.eachSeries(function(t){var i=t.get("markPoint"),a=t.markPointModel;if(!i||!i.data)return void(t.markPointModel=null);if(a)a.mergeOption(i,e,!0);else{o&&n.defaultEmphasis(i.label,["position","show","textStyle","distance","formatter"]);var s={seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0};a=new r(i,this,e,s)}t.markPointModel=a},this)},defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2},emphasis:{}}}});t.exports=r},function(t,e,i){function n(t,e,i){var n=e.coordinateSystem;t.each(function(r){var o,a=t.getItemModel(r),s=a.getShallow("x"),l=a.getShallow("y");if(null!=s&&null!=l)o=[h.parsePercent(s,i.getWidth()),h.parsePercent(l,i.getHeight())];else if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(n){var c=t.get(n.dimensions[0],r),u=t.get(n.dimensions[1],r);o=n.dataToPoint([c,u])}t.setItemLayout(r,o)})}function r(t,e,i){var n;n=t?a.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:"value",type:"float"}];var r=new d(n,i),o=a.map(i.get("data"),a.curry(f.dataTransform,e));return t&&(o=a.filter(o,a.curry(f.dataFilter,t))),r.initData(o,null,t?f.dimValueGetter:function(t){return t.value}),r}var o=i(38),a=i(1),s=i(9),l=i(7),h=i(4),c=s.addCommas,u=s.encodeHTML,d=i(14),f=i(104),p={getRawDataArray:function(){return this.option.data},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=a.isArray(i)?a.map(i,c).join(", "):c(i),r=e.getName(t);return this.name+"
            "+((r?u(r)+" : ":"")+n)},getData:function(){return this._data},setData:function(t){this._data=t}};a.defaults(p,l.dataFormatMixin),i(2).extendComponentView({type:"markPoint",init:function(){this._symbolDrawMap={}},render:function(t,e,i){var n=this._symbolDrawMap;for(var r in n)n[r].__keep=!1;e.eachSeries(function(t){var e=t.markPointModel;e&&this._renderSeriesMP(t,e,i)},this);for(var r in n)n[r].__keep||(n[r].remove(),this.group.remove(n[r].group))},updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markPointModel;e&&(n(e.getData(),t,i),this._symbolDrawMap[t.name].updateLayout(e))},this)},_renderSeriesMP:function(t,e,i){var s=t.coordinateSystem,l=t.name,h=t.getData(),c=this._symbolDrawMap,u=c[l];u||(u=c[l]=new o);var d=r(s,t,e);a.mixin(e,p),e.setData(d),n(e.getData(),t,i),d.each(function(t){var i=d.getItemModel(t),n=i.getShallow("symbolSize");"function"==typeof n&&(n=n(e.getRawValue(t),e.getDataParams(t))),d.setItemVisual(t,{symbolSize:n,color:i.get("itemStyle.normal.color")||h.getVisual("color"),symbol:i.getShallow("symbol")})}),u.updateData(d),this.group.add(u.group),d.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),u.__keep=!0}})},function(t,e,i){"use strict";var n=i(2),r=i(3),o=i(11);n.extendComponentModel({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),n.extendComponentView({type:"title",render:function(t,e,i){if(this.group.removeAll(),t.get("show")){var n=this.group,a=t.getModel("textStyle"),s=t.getModel("subtextStyle"),l=t.get("textAlign"),h=new r.Text({style:{text:t.get("text"),textFont:a.getFont(),fill:a.getTextColor(),textBaseline:"top"},z2:10}),c=h.getBoundingRect(),u=t.get("subtext"),d=new r.Text({style:{text:u,textFont:s.getFont(),fill:s.getTextColor(),y:c.height+t.get("itemGap"),textBaseline:"top"},z2:10}),f=t.get("link"),p=t.get("sublink");h.silent=!f,d.silent=!p,f&&h.on("click",function(){window.open(f,t.get("target"))}),p&&d.on("click",function(){window.open(p,t.get("subtarget"))}),n.add(h),u&&n.add(d);var g=n.getBoundingRect(),m=t.getBoxLayoutParams();m.width=g.width,m.height=g.height;var v=o.getLayoutRect(m,{width:i.getWidth(),height:i.getHeight()},t.get("padding"));l||(l=t.get("left")||t.get("right"),"middle"===l&&(l="center"),"right"===l?v.x+=v.width:"center"===l&&(v.x+=v.width/2)),n.position=[v.x,v.y],h.setStyle("textAlign",l),d.setStyle("textAlign",l),g=n.getBoundingRect();var y=v.margin,x=t.getItemStyle(["color","opacity"]);x.fill=t.get("backgroundColor");var _=new r.Rect({shape:{x:g.x-y[3],y:g.y-y[0],width:g.width+y[1]+y[3],height:g.height+y[0]+y[2]},style:x,silent:!0});r.subPixelOptimizeRect(_),n.add(_)}}})},function(t,e,i){i(189),i(190),i(195),i(193),i(191),i(192),i(194)},function(t,e,i){var n=i(29),r=i(1),o=i(2).extendComponentModel({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){o.superApply(this,"mergeDefaultAndTheme",arguments),r.each(this.option.feature,function(t,e){var i=n.get(e);i&&r.merge(t,i.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:"#666",color:"none"},emphasis:{borderColor:"#3E98C5"}}}});t.exports=o},function(t,e,i){(function(e){function n(t){return 0===t.indexOf("my")}var r=i(29),o=i(1),a=i(3),s=i(12),l=i(52),h=i(103),c=i(17);t.exports=i(2).extendComponentView({type:"toolbox",render:function(t,e,i){function u(o,a){var l,h=v[o],c=v[a],u=g[h],f=new s(u,t,t.ecModel);if(h&&!c){if(n(h))l={model:f,onclick:f.option.onclick,featureName:h};else{var p=r.get(h);if(!p)return;l=new p(f)}m[h]=l}else{if(l=m[c],!l)return;l.model=f}return!h&&c?void(l.dispose&&l.dispose(e,i)):!f.get("show")||l.unusable?void(l.remove&&l.remove(e,i)):(d(f,l,h),f.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},void(l.render&&l.render(f,e,i)))}function d(n,r,s){var l=n.getModel("iconStyle"),h=r.getIcons?r.getIcons():n.get("icon"),c=n.get("title")||{};if("string"==typeof h){var u=h,d=c;h={},c={},h[s]=u,c[s]=d}var g=n.iconPaths={};o.each(h,function(s,h){var u=l.getModel("normal").getItemStyle(),d=l.getModel("emphasis").getItemStyle(),m={x:-p/2,y:-p/2,width:p,height:p},v=0===s.indexOf("image://")?(m.image=s.slice(8),new a.Image({style:m})):a.makePath(s.replace("path://",""),{style:u,hoverStyle:d,rectHover:!0},m,"center");a.setHoverStyle(v),t.get("showTitle")&&(v.__title=c[h],v.on("mouseover",function(){v.setStyle({text:c[h],textPosition:d.textPosition||"bottom",textFill:d.fill||d.stroke||"#000",textAlign:d.textAlign||"center"})}).on("mouseout",function(){v.setStyle({textFill:null})})),v.trigger(n.get("iconStatus."+h)||"normal"),f.add(v),v.on("click",o.bind(r.onclick,r,e,i,h)),g[h]=v})}var f=this.group;if(f.removeAll(),t.get("show")){var p=+t.get("itemSize"),g=t.get("feature")||{},m=this._features||(this._features={}),v=[];o.each(g,function(t,e){v.push(e)}),new l(this._featureNames||[],v).add(u).update(u).remove(o.curry(u,null)).execute(),this._featureNames=v,h.layout(f,t,i),h.addBackground(f,t),f.eachChild(function(t){var e=t.__title,n=t.hoverStyle;if(n&&e){var r=c.getBoundingRect(e,n.font),o=t.position[0]+f.position[0],a=t.position[1]+f.position[1]+p,s=!1;a+r.height>i.getHeight()&&(n.textPosition="top",s=!0);var l=s?-5-r.height:p+8;o+r.width/2>i.getWidth()?(n.textPosition=["100%",l],n.textAlign="right"):o-r.width/2<0&&(n.textPosition=[0,l],n.textAlign="left")}})}},remove:function(t,e){o.each(this._features,function(i){i.remove&&i.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){o.each(this._features,function(i){i.dispose&&i.dispose(t,e)})}})}).call(e,i(201))},function(t,e,i){function n(t){var e={},i=[],n=[];return t.eachRawSeries(function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)i.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},n.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else i.push(t)}}),{seriesGroupByCategoryAxis:e,other:i,meta:n}}function r(t){var e=[];return p.each(t,function(t,i){var n=t.categoryAxis,r=t.valueAxis,o=r.dim,a=[" "].concat(p.map(t.series,function(t){return t.name})),s=[n.model.getCategories()];p.each(t.series,function(t){s.push(t.getRawData().mapArray(o,function(t){return t}))});for(var l=[a.join(v)],h=0;ha;a++)n[a]=arguments[a];i.push((o?o+v:"")+n.join(v))}),i.join("\n")}).join("\n\n"+m+"\n\n")}function a(t){var e=n(t);return{value:p.filter([r(e.seriesGroupByCategoryAxis),o(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+m+"\n\n"),meta:e.meta}}function s(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function l(t){var e=t.slice(0,t.indexOf("\n"));return e.indexOf(v)>=0?!0:void 0}function h(t){for(var e=t.split(/\n+/g),i=s(e.shift()).split(y),n=[],r=p.map(i,function(t){return{name:t,data:[]}}),o=0;o1?"emphasis":"normal")}var h=i(1),c=i(4),u=i(160),d=i(8),f=i(26),p=i(100),g=i(102),m=h.each,v=c.asc;i(175);var y="\x00_ec_\x00toolbox-dataZoom_";n.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:{zoom:"区域缩放",back:"区域缩放还原"}};var x=n.prototype;x.render=function(t,e,i){l(t,e)},x.onclick=function(t,e,i){var n=this._controllerGroup;this._controllerGroup||(n=this._controllerGroup=new f,e.getZr().add(n)),_[i].call(this,n,this.model,t,e)},x.remove=function(t,e){this._disposeController(),g.release("globalPan",e.getZr())},x.dispose=function(t,e){var i=e.getZr();g.release("globalPan",i),this._disposeController(),this._controllerGroup&&i.remove(this._controllerGroup)};var _={zoom:function(t,e,i,n){var r=this._isZoomActive=!this._isZoomActive,o=n.getZr();g[r?"take":"release"]("globalPan",o),e.setIconStatus("zoom",r?"emphasis":"normal"),r?(o.setDefaultCursorStyle("crosshair"),this._createController(t,e,i,n)):(o.setDefaultCursorStyle("default"),this._disposeController())},back:function(t,e,i,n){this._dispatchAction(p.pop(i),n)}};x._createController=function(t,e,i,n){var r=this._controller=new u("rect",n.getZr(),{lineWidth:3,stroke:"#333",fill:"rgba(0,0,0,0.2)"});r.on("selectEnd",h.bind(this._onSelected,this,r,e,i,n)),r.enable(t,!1)},x._disposeController=function(){var t=this._controller;t&&(t.off("selected"),t.dispose())},x._onSelected=function(t,e,i,n,o){if(o.length){var l=o[0];t.update();var h={};i.eachComponent("grid",function(t,e){var n=t.coordinateSystem,o=r(n,i),c=a(l,o);if(c){var u=s(c,o,0,"x"),d=s(c,o,1,"y");u&&(h[u.dataZoomId]=u),d&&(h[d.dataZoomId]=d)}},this),p.push(i,h),this._dispatchAction(h,n)}},x._dispatchAction=function(t,e){var i=[];m(t,function(t){i.push(t)}),i.length&&e.dispatchAction({type:"dataZoom",from:this.uid,batch:h.clone(i,!0)})},i(29).register("dataZoom",n),i(2).registerPreprocessor(function(t){function e(t,e){if(e){var r=t+"Index",o=e[r];null==o||h.isArray(o)||(o=o===!1?[]:[o]),i(t,function(e,i){if(null==o||-1!==h.indexOf(o,i)){var a={type:"select",$fromToolbox:!0,id:y+t+i};a[r]=i,n.push(a)}})}}function i(e,i){var n=t[e];h.isArray(n)||(n=n?[n]:[]),m(n,i)}if(t){var n=t.dataZoom||(t.dataZoom=[]);h.isArray(n)||(n=[n]);var r=t.toolbox;if(r&&(h.isArray(r)&&(r=r[0]),r&&r.feature)){var o=r.feature.dataZoom;e("xAxis",o),e("yAxis",o)}}}),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var r=i(1);n.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"},option:{},seriesIndex:{}};var o=n.prototype;o.getIcons=function(){var t=this.model,e=t.get("icon"),i={};return r.each(t.get("type"),function(t){e[t]&&(i[t]=e[t])}),i};var a={line:function(t,e,i,n){return"bar"===t?r.merge({id:e,type:"line",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.line")||{},!0):void 0},bar:function(t,e,i,n){return"line"===t?r.merge({id:e,type:"bar",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.bar")||{},!0):void 0},stack:function(t,e,i,n){return"line"===t||"bar"===t?r.merge({id:e,stack:"__ec_magicType_stack__"},n.get("option.stack")||{},!0):void 0},tiled:function(t,e,i,n){return"line"===t||"bar"===t?r.merge({id:e,stack:""},n.get("option.tiled")||{},!0):void 0}},s=[["line","bar"],["stack","tiled"]];o.onclick=function(t,e,i){var n=this.model,o=n.get("seriesIndex."+i);if(a[i]){var l={series:[]},h=function(t){var e=t.subType,o=t.id,s=a[i](e,o,t,n);s&&(r.defaults(s,t.option),l.series.push(s));var h=t.coordinateSystem;if(h&&"cartesian2d"===h.type&&("line"===i||"bar"===i)){var c=h.getAxesByScale("ordinal")[0];if(c){var u=c.dim,d=t.get(u+"AxisIndex"),f=u+"Axis";l[f]=l[f]||[];for(var p=0;d>=p;p++)l[f][d]=l[f][d]||{};l[f][d].boundaryGap="bar"===i}}};r.each(s,function(t){r.indexOf(t,i)>=0&&r.each(t,function(t){n.setIconStatus(t,"normal")})}),n.setIconStatus(i,"emphasis"),t.eachComponent({mainType:"series",query:null==o?null:{seriesIndex:o}},h),e.dispatchAction({type:"changeMagicType",currentType:i,newOption:l})}};var l=i(2);l.registerAction({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),i(29).register("magicType",n),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var r=i(100);n.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:"还原"};var o=n.prototype;o.onclick=function(t,e,i){r.clear(t),e.dispatchAction({type:"restore",from:this.uid})},i(29).register("restore",n),i(2).registerAction({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")}),t.exports=n},function(t,e,i){function n(t){this.model=t}var r=i(15);n.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:"保存为图片",type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:["右键另存为图片"]},n.prototype.unusable=!r.canvasSupported;var o=n.prototype;o.onclick=function(t,e){var i=this.model,n=i.get("name")||t.get("title.0.text")||"echarts",r=document.createElement("a"),o=i.get("type",!0)||"png";r.download=n+"."+o,r.target="_blank";var a=e.getConnectedDataURL({type:o,backgroundColor:i.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:i.get("excludeComponents"),pixelRatio:i.get("pixelRatio")});if(r.href=a,"function"==typeof MouseEvent){var s=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});r.dispatchEvent(s)}else{var l=i.get("lang"),h='',c=window.open();c.document.write(h)}},i(29).register("saveAsImage",n),t.exports=n},function(t,e,i){i(198),i(199),i(2).registerAction({type:"showTip",event:"showTip",update:"none"},function(){}),i(2).registerAction({type:"hideTip",event:"hideTip",update:"none"},function(){})},function(t,e,i){function n(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",i="left "+t+"s "+e+",top "+t+"s "+e;return l.map(p,function(t){return t+"transition:"+i}).join(";")}function r(t){var e=[],i=t.get("fontSize"),n=t.getTextColor();return n&&e.push("color:"+n),e.push("font:"+t.getFont()),i&&e.push("line-height:"+Math.round(3*i/2)+"px"),d(["decoration","align"],function(i){var n=t.get(i);n&&e.push("text-"+i+":"+n)}),e.join(";")}function o(t){t=t;var e=[],i=t.get("transitionDuration"),o=t.get("backgroundColor"),a=t.getModel("textStyle"),s=t.get("padding");return i&&e.push(n(i)),o&&(e.push("background-Color:"+h.toHex(o)),e.push("filter:alpha(opacity=70)"),e.push("background-Color:"+o)),d(["width","color","radius"],function(i){var n="border-"+i,r=f(n),o=t.get(r);null!=o&&e.push(n+":"+o+("color"===i?"":"px"))}),e.push(r(a)),null!=s&&e.push("padding:"+u.normalizeCssArray(s).join("px ")+"px"),e.join(";")+";"}function a(t,e){var i=document.createElement("div"),n=e.getZr();this.el=i,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(i),this._container=t,this._show=!1,this._hideTimeout;var r=this;i.onmouseenter=function(){r.enterable&&(clearTimeout(r._hideTimeout),r._show=!0),r._inContent=!0},i.onmousemove=function(e){if(!r.enterable){var i=n.handler;c.normalizeEvent(t,e),i.dispatch("mousemove",e)}},i.onmouseleave=function(){r.enterable&&r._show&&r.hideLater(r._hideDelay),r._inContent=!1},s(i,t)}function s(t,e){function i(t){n(t.target)&&t.preventDefault()}function n(i){for(;i&&i!==e;){if(i===t)return!0;i=i.parentNode}}c.addEventListener(e,"touchstart",i),c.addEventListener(e,"touchmove",i),c.addEventListener(e,"touchend",i)}var l=i(1),h=i(22),c=i(33),u=i(9),d=l.each,f=u.toCamelCase,p=["","-webkit-","-moz-","-o-"],g="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;";a.prototype={constructor:a,enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),i=t.style;"absolute"!==i.position&&"absolute"!==e.position&&(i.position="relative")},show:function(t){clearTimeout(this._hideTimeout),this.el.style.cssText=g+o(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),this._show=!0},setContent:function(t){var e=this.el;e.innerHTML=t,e.style.display=t?"block":"none"},moveTo:function(t,e){var i=this.el.style;i.left=t+"px",i.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this.enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(l.bind(this.hide,this),t)):this.hide())},isShow:function(){return this._show}},t.exports=a},function(t,e,i){i(2).extendComponentModel({type:"tooltip",defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove",alwaysShowContent:!1,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:!0,animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",lineStyle:{color:"#555",width:1,type:"solid"},crossStyle:{color:"#555",width:1,type:"dashed",textStyle:{}},shadowStyle:{color:"rgba(150,150,150,0.3)"}},textStyle:{color:"#fff",fontSize:14}}})},function(t,e,i){function n(t,e){if(!t||!e)return!1;var i=g.round;return i(t[0])===i(e[0])&&i(t[1])===i(e[1])}function r(t,e,i,n){return{x1:t,y1:e,x2:i,y2:n}}function o(t,e,i,n){return{x:t,y:e,width:i,height:n}}function a(t,e,i,n,r,o){return{cx:t,cy:e,r0:i,r:n,startAngle:r,endAngle:o,clockwise:!0}}function s(t,e,i,n,r){var o=i.clientWidth,a=i.clientHeight,s=20;return t+o+s>n?t-=o+s:t+=s,e+a+s>r?e-=a+s:e+=s,[t,e]}function l(t,e,i){var n=i.clientWidth,r=i.clientHeight,o=5,a=0,s=0,l=e.width,h=e.height;switch(t){case"inside":a=e.x+l/2-n/2,s=e.y+h/2-r/2;break;case"top":a=e.x+l/2-n/2,s=e.y-r-o;break;case"bottom":a=e.x+l/2-n/2,s=e.y+h+o;break;case"left":a=e.x-n-o,s=e.y+h/2-r/2;break;case"right":a=e.x+l+o,s=e.y+h/2-r/2}return[a,s]}function h(t,e,i,n,r,o,a){var h=a.getWidth(),c=a.getHeight(),u=o&&o.getBoundingRect().clone();if(o&&u.applyTransform(o.transform),"function"==typeof t&&(t=t([e,i],r,u)),f.isArray(t))e=m(t[0],h),i=m(t[1],c);else if("string"==typeof t&&o){var d=l(t,u,n.el);e=d[0],i=d[1]}else{var d=s(e,i,n.el,h,c);e=d[0],i=d[1]}n.moveTo(e,i)}function c(t){var e=t.coordinateSystem,i=t.get("tooltip.trigger",!0);return!(!e||"cartesian2d"!==e.type&&"polar"!==e.type&&"single"!==e.type||"item"===i)}var u=i(197),d=i(3),f=i(1),p=i(9),g=i(4),m=g.parsePercent,v=i(15);i(2).extendComponentView({type:"tooltip",_axisPointers:{},init:function(t,e){if(!v.node){var i=new u(e.getDom(),e);this._tooltipContent=i,e.on("showTip",this._manuallyShowTip,this),e.on("hideTip",this._manuallyHideTip,this)}},render:function(t,e,i){if(!v.node){this.group.removeAll(),this._axisPointers={},this._tooltipModel=t,this._ecModel=e,this._api=i,this._lastHover={};var n=this._tooltipContent;n.update(),n.enterable=t.get("enterable"),this._alwaysShowContent=t.get("alwaysShowContent"),this._seriesGroupByAxis=this._prepareAxisTriggerData(t,e);var r=this._crossText;if(r&&this.group.add(r),null!=this._lastX&&null!=this._lastY){var o=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){o._manuallyShowTip({x:o._lastX,y:o._lastY})})}var a=this._api.getZr(),s=this._tryShow;a.off("click",s),a.off("mousemove",s),a.off("mouseout",this._hide),"click"===t.get("triggerOn")?a.on("click",s,this):(a.on("mousemove",s,this),a.on("mouseout",this._hide,this))}},_manuallyShowTip:function(t){if(t.from!==this.uid){var e=this._ecModel,i=t.seriesIndex,n=t.dataIndex,r=e.getSeriesByIndex(i),o=this._api;if(null==t.x||null==t.y){if(r||e.eachSeries(function(t){c(t)&&!r&&(r=t)}),r){var a=r.getData();null==n&&(n=a.indexOfName(t.name));var s,l,h=a.getItemGraphicEl(n),u=r.coordinateSystem;if(u&&u.dataToPoint){var d=u.dataToPoint(a.getValues(u.dimensions,n,!0));s=d&&d[0],l=d&&d[1]}else if(h){var f=h.getBoundingRect().clone();f.applyTransform(h.transform),s=f.x+f.width/2,l=f.y+f.height/2}null!=s&&null!=l&&this._tryShow({offsetX:s,offsetY:l,target:h,event:{}})}}else{var h=o.getZr().handler.findHover(t.x,t.y);this._tryShow({offsetX:t.x,offsetY:t.y,target:h,event:{}})}}},_manuallyHideTip:function(t){t.from!==this.uid&&this._hide()},_prepareAxisTriggerData:function(t,e){var i={};return e.eachSeries(function(t){if(c(t)){var e,n,r=t.coordinateSystem;"cartesian2d"===r.type?(e=r.getBaseAxis(),n=e.dim+e.index):"single"===r.type?(e=r.getAxis(),n=e.dim+e.type):(e=r.getBaseAxis(),n=e.dim+r.name),i[n]=i[n]||{coordSys:[],series:[]},i[n].coordSys.push(r),i[n].series.push(t)}},this),i},_tryShow:function(t){var e=t.target,i=this._tooltipModel,n=i.get("trigger"),r=this._ecModel,o=this._api;if(i)if(this._lastX=t.offsetX,this._lastY=t.offsetY,e&&null!=e.dataIndex){var a=e.dataModel||r.getSeriesByIndex(e.seriesIndex),s=e.dataIndex,l=a.getData().getItemModel(s);"axis"===(l.get("tooltip.trigger")||n)?this._showAxisTooltip(i,r,t):(this._ticket="",this._hideAxisPointer(),this._resetLastHover(),this._showItemTooltipContent(a,s,t)),o.dispatchAction({type:"showTip",from:this.uid,dataIndex:e.dataIndex,seriesIndex:e.seriesIndex})}else"item"===n?this._hide():this._showAxisTooltip(i,r,t),"cross"===i.get("axisPointer.type")&&o.dispatchAction({type:"showTip",from:this.uid,x:t.offsetX,y:t.offsetY})},_showAxisTooltip:function(t,e,i){var r=t.getModel("axisPointer"),o=r.get("type");if("cross"===o){var a=i.target;if(a&&null!=a.dataIndex){var s=e.getSeriesByIndex(a.seriesIndex),l=a.dataIndex;this._showItemTooltipContent(s,l,i)}}this._showAxisPointer();var h=!0;f.each(this._seriesGroupByAxis,function(t){var e=t.coordSys,a=e[0],s=[i.offsetX,i.offsetY];if(!a.containPoint(s))return void this._hideAxisPointer(a.name);h=!1;var l=a.dimensions,c=a.pointToData(s,!0); +s=a.dataToPoint(c);var u=a.getBaseAxis(),d=r.get("axis");"auto"===d&&(d=u.dim);var p=!1,g=this._lastHover;if("cross"===o)n(g.data,c)&&(p=!0),g.data=c;else{var m=f.indexOf(l,d);g.data===c[m]&&(p=!0),g.data=c[m]}"cartesian2d"!==a.type||p?"polar"!==a.type||p?"single"!==a.type||p||this._showSinglePointer(r,a,d,s):this._showPolarPointer(r,a,d,s):this._showCartesianPointer(r,a,d,s),"cross"!==o&&this._dispatchAndShowSeriesTooltipContent(a,t.series,s,c,p)},this),h&&this._hide()},_showCartesianPointer:function(t,e,i,n){function a(i,n,o){var a="x"===i?r(n[0],o[0],n[0],o[1]):r(o[0],n[1],o[1],n[1]),s=l._getPointerElement(e,t,i,a);c?d.updateProps(s,{shape:a},t):s.attr({shape:a})}function s(i,n,r){var a=e.getAxis(i),s=a.getBandWidth(),h=r[1]-r[0],u="x"===i?o(n[0]-s/2,r[0],s,h):o(r[0],n[1]-s/2,h,s),f=l._getPointerElement(e,t,i,u);c?d.updateProps(f,{shape:u},t):f.attr({shape:u})}var l=this,h=t.get("type"),c="cross"!==h;if("cross"===h)a("x",n,e.getAxis("y").getGlobalExtent()),a("y",n,e.getAxis("x").getGlobalExtent()),this._updateCrossText(e,n,t);else{var u=e.getAxis("x"===i?"y":"x"),f=u.getGlobalExtent();"cartesian2d"===e.type&&("line"===h?a:s)(i,n,f)}},_showSinglePointer:function(t,e,i,n){function o(i,n,o){var s=e.getAxis(),h=s.orient,c="horizontal"===h?r(n[0],o[0],n[0],o[1]):r(o[0],n[1],o[1],n[1]),u=a._getPointerElement(e,t,i,c);l?d.updateProps(u,{shape:c},t):u.attr({shape:c})}var a=this,s=t.get("type"),l="cross"!==s,h=e.getRect(),c=[h.y,h.y+h.height];o(i,n,c)},_showPolarPointer:function(t,e,i,n){function o(i,n,o){var a,s=e.pointToCoord(n);if("angle"===i){var h=e.coordToPoint([o[0],s[1]]),c=e.coordToPoint([o[1],s[1]]);a=r(h[0],h[1],c[0],c[1])}else a={cx:e.cx,cy:e.cy,r:s[0]};var u=l._getPointerElement(e,t,i,a);f?d.updateProps(u,{shape:a},t):u.attr({shape:a})}function s(i,n,r){var o,s=e.getAxis(i),h=s.getBandWidth(),c=e.pointToCoord(n),u=Math.PI/180;o="angle"===i?a(e.cx,e.cy,r[0],r[1],(-c[1]-h/2)*u,(-c[1]+h/2)*u):a(e.cx,e.cy,c[0]-h/2,c[0]+h/2,0,2*Math.PI);var p=l._getPointerElement(e,t,i,o);f?d.updateProps(p,{shape:o},t):p.attr({shape:o})}var l=this,h=t.get("type"),c=e.getAngleAxis(),u=e.getRadiusAxis(),f="cross"!==h;if("cross"===h)o("angle",n,u.getExtent()),o("radius",n,c.getExtent()),this._updateCrossText(e,n,t);else{var p=e.getAxis("radius"===i?"angle":"radius"),g=p.getExtent();("line"===h?o:s)(i,n,g)}},_updateCrossText:function(t,e,i){var n=i.getModel("crossStyle"),r=n.getModel("textStyle"),o=this._tooltipModel,a=this._crossText;a||(a=this._crossText=new d.Text({style:{textAlign:"left",textVerticalAlign:"bottom"}}),this.group.add(a));var s=t.pointToData(e),l=t.dimensions;s=f.map(s,function(e,i){var n=t.getAxis(l[i]);return e="category"===n.type||"time"===n.type?n.scale.getLabel(e):p.addCommas(e.toFixed(n.getPixelPrecision()))}),a.setStyle({fill:r.getTextColor()||n.get("color"),textFont:r.getFont(),text:s.join(", "),x:e[0]+5,y:e[1]-5}),a.z=o.get("z"),a.zlevel=o.get("zlevel")},_getPointerElement:function(t,e,i,n){var r=this._tooltipModel,o=r.get("z"),a=r.get("zlevel"),s=this._axisPointers,l=t.name;if(s[l]=s[l]||{},s[l][i])return s[l][i];var h=e.get("type"),c=e.getModel(h+"Style"),u="shadow"===h,f=c[u?"getAreaStyle":"getLineStyle"](),p="polar"===t.type?u?"Sector":"radius"===i?"Circle":"Line":u?"Rect":"Line";u?f.stroke=null:f.fill=null;var g=s[l][i]=new d[p]({style:f,z:o,zlevel:a,silent:!0,shape:n});return this.group.add(g),g},_dispatchAndShowSeriesTooltipContent:function(t,e,i,n,r){var o=this._tooltipModel,a=this._tooltipContent,s=t.getBaseAxis(),l=f.map(e,function(t){return{seriesIndex:t.seriesIndex,dataIndex:t.getAxisTooltipDataIndex?t.getAxisTooltipDataIndex(t.coordDimToDataDim(s.dim),n,s):t.getData().indexOfNearest(t.coordDimToDataDim(s.dim)[0],n["x"===s.dim||"radius"===s.dim?0:1])}}),c=this._lastHover,u=this._api;if(c.payloadBatch&&!r&&u.dispatchAction({type:"downplay",batch:c.payloadBatch}),r||(u.dispatchAction({type:"highlight",batch:l}),c.payloadBatch=l),u.dispatchAction({type:"showTip",dataIndex:l[0].dataIndex,seriesIndex:l[0].seriesIndex,from:this.uid}),s&&o.get("showContent")){var d,g=o.get("formatter"),m=o.get("position"),v=f.map(e,function(t,e){return t.getDataParams(l[e].dataIndex)});a.show(o);var y=l[0].dataIndex;if(!r){if(this._ticket="",g){if("string"==typeof g)d=p.formatTpl(g,v);else if("function"==typeof g){var x=this,_="axis_"+t.name+"_"+y,b=function(t,e){t===x._ticket&&(a.setContent(e),h(m,i[0],i[1],a,v,null,u))};x._ticket=_,d=g(v,_,b)}}else{var w=e[0].getData().getName(y);d=(w?w+"
            ":"")+f.map(e,function(t,e){return t.formatTooltip(l[e].dataIndex,!0)}).join("
            ")}a.setContent(d)}h(m,i[0],i[1],a,v,null,u)}},_showItemTooltipContent:function(t,e,i){var n=this._api,r=t.getData(),o=r.getItemModel(e),a=this._tooltipModel,s=this._tooltipContent,l=o.getModel("tooltip");if(l.parentModel?l.parentModel.parentModel=a:l.parentModel=this._tooltipModel,l.get("showContent")){var c,u=l.get("formatter"),d=l.get("position"),f=t.getDataParams(e);if(u){if("string"==typeof u)c=p.formatTpl(u,f);else if("function"==typeof u){var g=this,m="item_"+t.name+"_"+e,v=function(t,e){t===g._ticket&&(s.setContent(e),h(d,i.offsetX,i.offsetY,s,f,i.target,n))};g._ticket=m,c=u(f,m,v)}}else c=t.formatTooltip(e);s.show(l),s.setContent(c),h(d,i.offsetX,i.offsetY,s,f,i.target,n)}},_showAxisPointer:function(t){if(t){var e=this._axisPointers[t];e&&f.each(e,function(t){t.show()})}else this.group.eachChild(function(t){t.show()}),this.group.show()},_resetLastHover:function(){var t=this._lastHover;t.payloadBatch&&this._api.dispatchAction({type:"downplay",batch:t.payloadBatch}),this._lastHover={}},_hideAxisPointer:function(t){if(t){var e=this._axisPointers[t];e&&f.each(e,function(t){t.hide()})}else this.group.hide()},_hide:function(){this._hideAxisPointer(),this._resetLastHover(),this._alwaysShowContent||this._tooltipContent.hideLater(this._tooltipModel.get("hideDelay")),this._api.dispatchAction({type:"hideTip",from:this.uid})},dispose:function(t,e){if(!v.node){var i=e.getZr();this._tooltipContent.hide(),i.off("click",this._tryShow),i.off("mousemove",this._tryShow),i.off("mouseout",this._hide),e.off("showTip",this._manuallyShowTip),e.off("hideTip",this._manuallyHideTip)}}})},,function(t,e){function i(){h=!1,a.length?l=a.concat(l):c=-1,l.length&&n()}function n(){if(!h){var t=setTimeout(i);h=!0;for(var e=l.length;e;){for(a=l,l=[];++c1)for(var i=1;i=0?parseFloat(t)/100*e:parseFloat(t):t},E=function(t,e,i){var n=a.parse(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=L(n[0],n[1],n[2]),t.opacity=i*n[3])},R=function(t){var e=a.parse(t);return[L(e[0],e[1],e[2]),e[3]]},B=function(t,e,i){var n=e.fill;if(null!=n)if(n instanceof f){var r,o=0,a=[0,0],s=0,l=1,h=i.getBoundingRect(),c=h.width,u=h.height;if("linear"===n.type){r="gradient";var d=i.transform,p=[n.x*c,n.y*u],g=[n.x2*c,n.y2*u];d&&(b(p,p,d),b(g,g,d));var m=g[0]-p[0],v=g[1]-p[1];o=180*Math.atan2(m,v)/Math.PI,0>o&&(o+=360),1e-6>o&&(o=0)}else{r="gradientradial";var p=[n.x*c,n.y*u],d=i.transform,y=i.scale,x=c,w=u;a=[(p[0]-h.x)/x,(p[1]-h.y)/w],d&&b(p,p,d),x/=y[0]*S,w/=y[1]*S;var M=_(x,w);s=0/M,l=2*n.r/M-s}var A=n.colorStops.slice();A.sort(function(t,e){return t.offset-e.offset});for(var T=A.length,C=[],I=[],k=0;T>k;k++){var L=A[k],D=R(L.color);I.push(L.offset*l+s+" "+D[0]),0!==k&&k!==T-1||C.push(D)}if(T>=2){var P=C[0][0],z=C[1][0],O=C[0][1]*e.opacity,B=C[1][1]*e.opacity;t.type=r,t.method="none",t.focus="100%",t.angle=o,t.color=P,t.color2=z,t.colors=I.join(","),t.opacity=B,t.opacity2=O}"radial"===r&&(t.focusposition=a.join(","))}else E(t,n,e.opacity)},N=function(t,e){null!=e.lineJoin&&(t.joinstyle=e.lineJoin),null!=e.miterLimit&&(t.miterlimit=e.miterLimit*S),null!=e.lineCap&&(t.endcap=e.lineCap),null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof f||E(t,e.stroke,e.opacity)},V=function(t,e,i,n){var r="fill"==e,o=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(r||!r&&i.lineWidth)?(t[r?"filled":"stroked"]="true",i[e]instanceof f&&P(t,o),o||(o=p.createNode(e)),r?B(o,i,n):N(o,i),D(t,o)):(t[r?"filled":"stroked"]="false",P(t,o))},F=[[],[],[]],G=function(t,e){var i,n,r,a,s,l,h=o.M,c=o.C,u=o.L,d=o.A,f=o.Q,p=[];for(a=0;a0){p.push(n);for(var X=0;i>X;X++){var U=F[X];e&&b(U,U,e),p.push(g(U[0]*S-A),w,g(U[1]*S-A),i-1>X?w:"")}}}return p.join("")};d.prototype.brushVML=function(t){var e=this.style,i=this._vmlEl;i||(i=p.createNode("shape"),I(i),this._vmlEl=i),V(i,"fill",e,this),V(i,"stroke",e,this);var n=this.transform,r=null!=n,o=i.getElementsByTagName("stroke")[0];if(o){var a=e.lineWidth;if(r&&!e.strokeNoScale){var s=n[0]*n[3]-n[1]*n[2];a*=m(v(s))}o.weight=a+"px"}var l=this.path;this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),this.__dirtyPath=!1),i.path=G(l.data,this.transform),i.style.zIndex=z(this.zlevel,this.z,this.z2),D(t,i),e.text&&this.drawRectText(t,this.getBoundingRect())},d.prototype.onRemove=function(t){P(t,this._vmlEl),this.removeRectText(t)},d.prototype.onAdd=function(t){D(t,this._vmlEl),this.appendRectText(t)};var W=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};c.prototype.brushVML=function(t){var e,i,n=this.style,r=n.image;if(W(r)){var o=r.src;if(o===this._imageSrc)e=this._imageWidth,i=this._imageHeight;else{var a=r.runtimeStyle,s=a.width,l=a.height;a.width="auto",a.height="auto",e=r.width,i=r.height,a.width=s,a.height=l,this._imageSrc=o,this._imageWidth=e,this._imageHeight=i}r=o}else r===this._imageSrc&&(e=this._imageWidth,i=this._imageHeight);if(r){var h=n.x||0,c=n.y||0,u=n.width,d=n.height,f=n.sWidth,v=n.sHeight,y=n.sx||0,x=n.sy||0,S=f&&v,A=this._vmlEl;A||(A=p.doc.createElement("div"),I(A),this._vmlEl=A);var T,C=A.style,k=!1,L=1,P=1;if(this.transform&&(T=this.transform,L=m(T[0]*T[0]+T[1]*T[1]),P=m(T[2]*T[2]+T[3]*T[3]),k=T[1]||T[2]),k){var O=[h,c],E=[h+u,c],R=[h,c+d],B=[h+u,c+d];b(O,O,T),b(E,E,T),b(R,R,T),b(B,B,T);var N=_(O[0],E[0],R[0],B[0]),V=_(O[1],E[1],R[1],B[1]),F=[];F.push("M11=",T[0]/L,w,"M12=",T[2]/P,w,"M21=",T[1]/L,w,"M22=",T[3]/P,w,"Dx=",g(h*L+T[4]),w,"Dy=",g(c*P+T[5])),C.padding="0 "+g(N)+"px "+g(V)+"px 0",C.filter=M+".Matrix("+F.join("")+", SizingMethod=clip)"}else T&&(h=h*L+T[4],c=c*P+T[5]),C.filter="",C.left=g(h)+"px",C.top=g(c)+"px";var G=this._imageEl,Z=this._cropEl;G||(G=p.doc.createElement("div"),this._imageEl=G);var H=G.style;if(S){if(e&&i)H.width=g(L*e*u/f)+"px",H.height=g(P*i*d/v)+"px";else{var q=new Image,j=this;q.onload=function(){q.onload=null,e=q.width,i=q.height,H.width=g(L*e*u/f)+"px",H.height=g(P*i*d/v)+"px",j._imageWidth=e,j._imageHeight=i,j._imageSrc=r},q.src=r}Z||(Z=p.doc.createElement("div"),Z.style.overflow="hidden",this._cropEl=Z);var X=Z.style;X.width=g((u+y*u/f)*L),X.height=g((d+x*d/v)*P),X.filter=M+".Matrix(Dx="+-y*u/f*L+",Dy="+-x*d/v*P+")",Z.parentNode||A.appendChild(Z),G.parentNode!=Z&&Z.appendChild(G)}else H.width=g(L*u)+"px",H.height=g(P*d)+"px",A.appendChild(G),Z&&Z.parentNode&&(A.removeChild(Z),this._cropEl=null);var U="",Y=n.opacity;1>Y&&(U+=".Alpha(opacity="+g(100*Y)+") "),U+=M+".AlphaImageLoader(src="+r+", SizingMethod=scale)",H.filter=U,A.style.zIndex=z(this.zlevel,this.z,this.z2),D(t,A),n.text&&this.drawRectText(t,this.getBoundingRect())}},c.prototype.onRemove=function(t){P(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},c.prototype.onAdd=function(t){D(t,this._vmlEl),this.appendRectText(t)};var Z,H="normal",q={},j=0,X=100,U=document.createElement("div"),Y=function(t){var e=q[t];if(!e){j>X&&(j=0,q={});var i,n=U.style;try{n.font=t,i=n.fontFamily.split(",")[0]}catch(r){}e={style:n.fontStyle||H,variant:n.fontVariant||H,weight:n.fontWeight||H,size:0|parseFloat(n.fontSize||12),family:i||"Microsoft YaHei"},q[t]=e,j++}return e};s.measureText=function(t,e){var i=p.doc;Z||(Z=i.createElement("div"),Z.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",p.doc.body.appendChild(Z));try{Z.style.font=e}catch(n){}return Z.innerHTML="",Z.appendChild(i.createTextNode(t)),{width:Z.offsetWidth}};for(var $=new r,Q=function(t,e,i,n){var r=this.style,o=r.text;if(o){var a,l,h=r.textAlign,c=Y(r.textFont),u=c.style+" "+c.variant+" "+c.weight+" "+c.size+'px "'+c.family+'"',d=r.textBaseline,f=r.textVerticalAlign;i=i||s.getBoundingRect(o,u,h,d);var m=this.transform;if(m&&!n&&($.copy(e),$.applyTransform(m),e=$),n)a=e.x,l=e.y;else{var v=r.textPosition,y=r.textDistance;if(v instanceof Array)a=e.x+O(v[0],e.width),l=e.y+O(v[1],e.height),h=h||"left",d=d||"top";else{var x=s.adjustTextPositionOnRect(v,e,i,y);a=x.x,l=x.y,h=h||x.textAlign,d=d||x.textBaseline}}if(f){switch(f){case"middle":l-=i.height/2;break;case"bottom":l-=i.height}d="top"}var _=c.size;switch(d){case"hanging":case"top":l+=_/1.75;break;case"middle":break;default:l-=_/2.25}switch(h){case"left":break;case"center":a-=i.width/2;break;case"right":a-=i.width}var M,S,A,T=p.createNode,C=this._textVmlEl;C?(A=C.firstChild,M=A.nextSibling,S=M.nextSibling):(C=T("line"),M=T("path"),S=T("textpath"),A=T("skew"),S.style["v-text-align"]="left",I(C),M.textpathok=!0,S.on=!0,C.from="0 0",C.to="1000 0.05",D(C,A),D(C,M),D(C,S),this._textVmlEl=C);var L=[a,l],P=C.style;m&&n?(b(L,L,m),A.on=!0,A.matrix=m[0].toFixed(3)+w+m[2].toFixed(3)+w+m[1].toFixed(3)+w+m[3].toFixed(3)+",0,0",A.offset=(g(L[0])||0)+","+(g(L[1])||0),A.origin="0 0",P.left="0px",P.top="0px"):(A.on=!1,P.left=g(a)+"px",P.top=g(l)+"px"),S.string=k(o);try{S.style.font=u}catch(E){}V(C,"fill",{fill:n?r.fill:r.textFill,opacity:r.opacity},this),V(C,"stroke",{stroke:n?r.stroke:r.textStroke,opacity:r.opacity,lineDash:r.lineDash},this),C.style.zIndex=z(this.zlevel,this.z,this.z2),D(t,C)}},K=function(t){P(t,this._textVmlEl),this._textVmlEl=null},J=function(t){D(t,this._textVmlEl)},tt=[l,h,c,d,u],et=0;et} + * @private + */ + this._chartsViews = []; + + /** + * @type {Object.} + * @private + */ + this._chartsMap = {}; + + /** + * @type {Array.} + * @private + */ + this._componentsViews = []; + + /** + * @type {Object.} + * @private + */ + this._componentsMap = {}; + + /** + * @type {module:echarts/ExtensionAPI} + * @private + */ + this._api = new ExtensionAPI(this); + + /** + * @type {module:echarts/CoordinateSystem} + * @private + */ + this._coordSysMgr = new CoordinateSystemManager(); + + Eventful.call(this); + + /** + * @type {module:echarts~MessageCenter} + * @private + */ + this._messageCenter = new MessageCenter(); + + // Init mouse events + this._initEvents(); + + // In case some people write `window.onresize = chart.resize` + this.resize = zrUtil.bind(this.resize, this); + } + + var echartsProto = ECharts.prototype; + + /** + * @return {HTMLDomElement} + */ + echartsProto.getDom = function () { + return this._dom; + }; + + /** + * @return {module:zrender~ZRender} + */ + echartsProto.getZr = function () { + return this._zr; + }; + + /** + * @param {Object} option + * @param {boolean} notMerge + * @param {boolean} [notRefreshImmediately=false] Useful when setOption frequently. + */ + echartsProto.setOption = function (option, notMerge, notRefreshImmediately) { + if (!this._model || notMerge) { + this._model = new GlobalModel( + null, null, this._theme, new OptionManager(this._api) + ); + } + + this._model.setOption(option, optionPreprocessorFuncs); + + updateMethods.prepareAndUpdate.call(this); + + !notRefreshImmediately && this._zr.refreshImmediately(); + }; + + /** + * @DEPRECATED + */ + echartsProto.setTheme = function () { + console.log('ECharts#setTheme() is DEPRECATED in ECharts 3.0'); + }; + + /** + * @return {module:echarts/model/Global} + */ + echartsProto.getModel = function () { + return this._model; + }; + + /** + * @return {Object} + */ + echartsProto.getOption = function () { + return this._model.getOption(); + }; + + /** + * @return {number} + */ + echartsProto.getWidth = function () { + return this._zr.getWidth(); + }; + + /** + * @return {number} + */ + echartsProto.getHeight = function () { + return this._zr.getHeight(); + }; + + /** + * Get canvas which has all thing rendered + * @param {Object} opts + * @param {string} [opts.backgroundColor] + */ + echartsProto.getRenderedCanvas = function (opts) { + if (!env.canvasSupported) { + return; + } + opts = opts || {}; + opts.pixelRatio = opts.pixelRatio || 1; + opts.backgroundColor = opts.backgroundColor + || this._model.get('backgroundColor'); + var zr = this._zr; + var list = zr.storage.getDisplayList(); + // Stop animations + zrUtil.each(list, function (el) { + el.stopAnimation(true); + }); + return zr.painter.getRenderedCanvas(opts); + }; + /** + * @return {string} + * @param {Object} opts + * @param {string} [opts.type='png'] + * @param {string} [opts.pixelRatio=1] + * @param {string} [opts.backgroundColor] + */ + echartsProto.getDataURL = function (opts) { + opts = opts || {}; + var excludeComponents = opts.excludeComponents; + var ecModel = this._model; + var excludesComponentViews = []; + var self = this; + + each(excludeComponents, function (componentType) { + ecModel.eachComponent({ + mainType: componentType + }, function (component) { + var view = self._componentsMap[component.__viewId]; + if (!view.group.ignore) { + excludesComponentViews.push(view); + view.group.ignore = true; + } + }); + }); + + var url = this.getRenderedCanvas(opts).toDataURL( + 'image/' + (opts && opts.type || 'png') + ); + + each(excludesComponentViews, function (view) { + view.group.ignore = false; + }); + return url; + }; + + + /** + * @return {string} + * @param {Object} opts + * @param {string} [opts.type='png'] + * @param {string} [opts.pixelRatio=1] + * @param {string} [opts.backgroundColor] + */ + echartsProto.getConnectedDataURL = function (opts) { + if (!env.canvasSupported) { + return; + } + var groupId = this.group; + var mathMin = Math.min; + var mathMax = Math.max; + var MAX_NUMBER = Infinity; + if (connectedGroups[groupId]) { + var left = MAX_NUMBER; + var top = MAX_NUMBER; + var right = -MAX_NUMBER; + var bottom = -MAX_NUMBER; + var canvasList = []; + var dpr = (opts && opts.pixelRatio) || 1; + for (var id in instances) { + var chart = instances[id]; + if (chart.group === groupId) { + var canvas = chart.getRenderedCanvas( + zrUtil.clone(opts) + ); + var boundingRect = chart.getDom().getBoundingClientRect(); + left = mathMin(boundingRect.left, left); + top = mathMin(boundingRect.top, top); + right = mathMax(boundingRect.right, right); + bottom = mathMax(boundingRect.bottom, bottom); + canvasList.push({ + dom: canvas, + left: boundingRect.left, + top: boundingRect.top + }); + } + } + + left *= dpr; + top *= dpr; + right *= dpr; + bottom *= dpr; + var width = right - left; + var height = bottom - top; + var targetCanvas = zrUtil.createCanvas(); + targetCanvas.width = width; + targetCanvas.height = height; + var zr = zrender.init(targetCanvas); + + each(canvasList, function (item) { + var img = new graphic.Image({ + style: { + x: item.left * dpr - left, + y: item.top * dpr - top, + image: item.dom + } + }); + zr.add(img); + }); + zr.refreshImmediately(); + + return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png')); + } + else { + return this.getDataURL(opts); + } + }; + + var updateMethods = { + + /** + * @param {Object} payload + * @private + */ + update: function (payload) { + // console.time && console.time('update'); + + var ecModel = this._model; + var api = this._api; + var coordSysMgr = this._coordSysMgr; + // update before setOption + if (!ecModel) { + return; + } + + ecModel.restoreData(); + + // TODO + // Save total ecModel here for undo/redo (after restoring data and before processing data). + // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call. + + // Create new coordinate system each update + // In LineView may save the old coordinate system and use it to get the orignal point + coordSysMgr.create(this._model, this._api); + + processData.call(this, ecModel, api); + + stackSeriesData.call(this, ecModel); + + coordSysMgr.update(ecModel, api); + + doLayout.call(this, ecModel, payload); + + doVisualCoding.call(this, ecModel, payload); + + doRender.call(this, ecModel, payload); + + // Set background + var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; + + var painter = this._zr.painter; + // TODO all use clearColor ? + if (painter.isSingleCanvas && painter.isSingleCanvas()) { + this._zr.configLayer(0, { + clearColor: backgroundColor + }); + } + else { + // In IE8 + if (!env.canvasSupported) { + var colorArr = colorTool.parse(backgroundColor); + backgroundColor = colorTool.stringify(colorArr, 'rgb'); + if (colorArr[3] === 0) { + backgroundColor = 'transparent'; + } + } + backgroundColor = backgroundColor; + this._dom.style.backgroundColor = backgroundColor; + } + + // console.time && console.timeEnd('update'); + }, + + // PENDING + /** + * @param {Object} payload + * @private + */ + updateView: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doLayout.call(this, ecModel, payload); + + doVisualCoding.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateView', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + updateVisual: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doVisualCoding.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateVisual', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + updateLayout: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doLayout.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateLayout', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + highlight: function (payload) { + toggleHighlight.call(this, 'highlight', payload); + }, + + /** + * @param {Object} payload + * @private + */ + downplay: function (payload) { + toggleHighlight.call(this, 'downplay', payload); + }, + + /** + * @param {Object} payload + * @private + */ + prepareAndUpdate: function (payload) { + var ecModel = this._model; + + prepareView.call(this, 'component', ecModel); + + prepareView.call(this, 'chart', ecModel); + + updateMethods.update.call(this, payload); + } + }; + + /** + * @param {Object} payload + * @private + */ + function toggleHighlight(method, payload) { + var ecModel = this._model; + + // dispatchAction before setOption + if (!ecModel) { + return; + } + + ecModel.eachComponent( + {mainType: 'series', query: payload}, + function (seriesModel, index) { + var chartView = this._chartsMap[seriesModel.__viewId]; + if (chartView && chartView.__alive) { + chartView[method]( + seriesModel, ecModel, this._api, payload + ); + } + }, + this + ); + } + + /** + * Resize the chart + */ + echartsProto.resize = function () { + this._zr.resize(); + + var optionChanged = this._model && this._model.resetOption('media'); + updateMethods[optionChanged ? 'prepareAndUpdate' : 'update'].call(this); + + // Resize loading effect + this._loadingFX && this._loadingFX.resize(); + }; + + var defaultLoadingEffect = __webpack_require__(87); + /** + * Show loading effect + * @param {string} [name='default'] + * @param {Object} [cfg] + */ + echartsProto.showLoading = function (name, cfg) { + if (zrUtil.isObject(name)) { + cfg = name; + name = 'default'; + } + this.hideLoading(); + var el = defaultLoadingEffect(this._api, cfg); + var zr = this._zr; + this._loadingFX = el; + + zr.add(el); + }; + + /** + * Hide loading effect + */ + echartsProto.hideLoading = function () { + this._loadingFX && this._zr.remove(this._loadingFX); + this._loadingFX = null; + }; + + /** + * @param {Object} eventObj + * @return {Object} + */ + echartsProto.makeActionFromEvent = function (eventObj) { + var payload = zrUtil.extend({}, eventObj); + payload.type = eventActionMap[eventObj.type]; + return payload; + }; + + /** + * @pubilc + * @param {Object} payload + * @param {string} [payload.type] Action type + * @param {boolean} [silent=false] Whether trigger event. + */ + echartsProto.dispatchAction = function (payload, silent) { + var actionWrap = actions[payload.type]; + if (actionWrap) { + var actionInfo = actionWrap.actionInfo; + var updateMethod = actionInfo.update || 'update'; + + var payloads = [payload]; + var batched = false; + // Batch action + if (payload.batch) { + batched = true; + payloads = zrUtil.map(payload.batch, function (item) { + item = zrUtil.defaults(zrUtil.extend({}, item), payload); + item.batch = null; + return item; + }); + } + + var eventObjBatch = []; + var eventObj; + var isHighlightOrDownplay = payload.type === 'highlight' || payload.type === 'downplay'; + for (var i = 0; i < payloads.length; i++) { + var batchItem = payloads[i]; + // Action can specify the event by return it. + eventObj = actionWrap.action(batchItem, this._model); + // Emit event outside + eventObj = eventObj || zrUtil.extend({}, batchItem); + // Convert type to eventType + eventObj.type = actionInfo.event || eventObj.type; + eventObjBatch.push(eventObj); + + // Highlight and downplay are special. + isHighlightOrDownplay && updateMethods[updateMethod].call(this, batchItem); + } + + (updateMethod !== 'none' && !isHighlightOrDownplay) + && updateMethods[updateMethod].call(this, payload); + + if (!silent) { + // Follow the rule of action batch + if (batched) { + eventObj = { + type: actionInfo.event || payload.type, + batch: eventObjBatch + }; + } + else { + eventObj = eventObjBatch[0]; + } + this._messageCenter.trigger(eventObj.type, eventObj); + } + } + }; + + /** + * Register event + * @method + */ + echartsProto.on = createRegisterEventWithLowercaseName('on'); + echartsProto.off = createRegisterEventWithLowercaseName('off'); + echartsProto.one = createRegisterEventWithLowercaseName('one'); + + /** + * @param {string} methodName + * @private + */ + function invokeUpdateMethod(methodName, ecModel, payload) { + var api = this._api; + + // Update all components + each(this._componentsViews, function (component) { + var componentModel = component.__model; + component[methodName](componentModel, ecModel, api, payload); + + updateZ(componentModel, component); + }, this); + + // Upate all charts + ecModel.eachSeries(function (seriesModel, idx) { + var chart = this._chartsMap[seriesModel.__viewId]; + chart[methodName](seriesModel, ecModel, api, payload); + + updateZ(seriesModel, chart); + }, this); + + } + + /** + * Prepare view instances of charts and components + * @param {module:echarts/model/Global} ecModel + * @private + */ + function prepareView(type, ecModel) { + var isComponent = type === 'component'; + var viewList = isComponent ? this._componentsViews : this._chartsViews; + var viewMap = isComponent ? this._componentsMap : this._chartsMap; + var zr = this._zr; + + for (var i = 0; i < viewList.length; i++) { + viewList[i].__alive = false; + } + + ecModel[isComponent ? 'eachComponent' : 'eachSeries'](function (componentType, model) { + if (isComponent) { + if (componentType === 'series') { + return; + } + } + else { + model = componentType; + } + + // Consider: id same and type changed. + var viewId = model.id + '_' + model.type; + var view = viewMap[viewId]; + if (!view) { + var classType = ComponentModel.parseClassType(model.type); + var Clazz = isComponent + ? ComponentView.getClass(classType.main, classType.sub) + : ChartView.getClass(classType.sub); + if (Clazz) { + view = new Clazz(); + view.init(ecModel, this._api); + viewMap[viewId] = view; + viewList.push(view); + zr.add(view.group); + } + else { + // Error + return; + } + } + + model.__viewId = viewId; + view.__alive = true; + view.__id = viewId; + view.__model = model; + }, this); + + for (var i = 0; i < viewList.length;) { + var view = viewList[i]; + if (!view.__alive) { + zr.remove(view.group); + view.dispose(ecModel, this._api); + viewList.splice(i, 1); + delete viewMap[view.__id]; + } + else { + i++; + } + } + } + + /** + * Processor data in each series + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function processData(ecModel, api) { + each(PROCESSOR_STAGES, function (stage) { + each(dataProcessorFuncs[stage] || [], function (process) { + process(ecModel, api); + }); + }); + } + + /** + * @private + */ + function stackSeriesData(ecModel) { + var stackedDataMap = {}; + ecModel.eachSeries(function (series) { + var stack = series.get('stack'); + var data = series.getData(); + if (stack && data.type === 'list') { + var previousStack = stackedDataMap[stack]; + if (previousStack) { + data.stackedOn = previousStack; + } + stackedDataMap[stack] = data; + } + }); + } + + /** + * Layout before each chart render there series, after visual coding and data processing + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function doLayout(ecModel, payload) { + var api = this._api; + each(layoutFuncs, function (layout) { + layout(ecModel, api, payload); + }); + } + + /** + * Code visual infomation from data after data processing + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function doVisualCoding(ecModel, payload) { + each(VISUAL_CODING_STAGES, function (stage) { + each(visualCodingFuncs[stage] || [], function (visualCoding) { + visualCoding(ecModel, payload); + }); + }); + } + + /** + * Render each chart and component + * @private + */ + function doRender(ecModel, payload) { + var api = this._api; + // Render all components + each(this._componentsViews, function (componentView) { + var componentModel = componentView.__model; + componentView.render(componentModel, ecModel, api, payload); + + updateZ(componentModel, componentView); + }, this); + + each(this._chartsViews, function (chart) { + chart.__alive = false; + }, this); + + // Render all charts + ecModel.eachSeries(function (seriesModel, idx) { + var chartView = this._chartsMap[seriesModel.__viewId]; + chartView.__alive = true; + chartView.render(seriesModel, ecModel, api, payload); + + updateZ(seriesModel, chartView); + }, this); + + // Remove groups of unrendered charts + each(this._chartsViews, function (chart) { + if (!chart.__alive) { + chart.remove(ecModel, api); + } + }, this); + } + + var MOUSE_EVENT_NAMES = [ + 'click', 'dblclick', 'mouseover', 'mouseout', 'mousedown', 'mouseup', 'globalout' + ]; + /** + * @private + */ + echartsProto._initEvents = function () { + var zr = this._zr; + each(MOUSE_EVENT_NAMES, function (eveName) { + zr.on(eveName, function (e) { + var ecModel = this.getModel(); + var el = e.target; + if (el && el.dataIndex != null) { + var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex); + var params = dataModel && dataModel.getDataParams(el.dataIndex) || {}; + params.event = e; + params.type = eveName; + this.trigger(eveName, params); + } + }, this); + }, this); + + each(eventActionMap, function (actionType, eventType) { + this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, this); + }, this); + }; + + /** + * @return {boolean} + */ + echartsProto.isDisposed = function () { + return this._disposed; + }; + + /** + * Clear + */ + echartsProto.clear = function () { + this.setOption({}, true); + }; + /** + * Dispose instance + */ + echartsProto.dispose = function () { + this._disposed = true; + var api = this._api; + var ecModel = this._model; + + each(this._componentsViews, function (component) { + component.dispose(ecModel, api); + }); + each(this._chartsViews, function (chart) { + chart.dispose(ecModel, api); + }); + + this._zr.dispose(); + + delete instances[this.id]; + }; + + zrUtil.mixin(ECharts, Eventful); + + /** + * @param {module:echarts/model/Series|module:echarts/model/Component} model + * @param {module:echarts/view/Component|module:echarts/view/Chart} view + * @return {string} + */ + function updateZ(model, view) { + var z = model.get('z'); + var zlevel = model.get('zlevel'); + // Set z and zlevel + view.group.traverse(function (el) { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + }); + } + /** + * @type {Array.} + * @inner + */ + var actions = []; + + /** + * Map eventType to actionType + * @type {Object} + */ + var eventActionMap = {}; + + /** + * @type {Array.} + * @inner + */ + var layoutFuncs = []; + + /** + * Data processor functions of each stage + * @type {Array.>} + * @inner + */ + var dataProcessorFuncs = {}; + + /** + * @type {Array.} + * @inner + */ + var optionPreprocessorFuncs = []; + + /** + * Visual coding functions of each stage + * @type {Array.>} + * @inner + */ + var visualCodingFuncs = {}; + /** + * Theme storage + * @type {Object.} + */ + var themeStorage = {}; + + + var instances = {}; + var connectedGroups = {}; + + var idBase = new Date() - 0; + var groupIdBase = new Date() - 0; + var DOM_ATTRIBUTE_KEY = '_echarts_instance_'; + /** + * @alias module:echarts + */ + var echarts = { + /** + * @type {number} + */ + version: '3.1.6', + dependencies: { + zrender: '3.0.7' + } + }; + + function enableConnect(chart) { + + var STATUS_PENDING = 0; + var STATUS_UPDATING = 1; + var STATUS_UPDATED = 2; + var STATUS_KEY = '__connectUpdateStatus'; + function updateConnectedChartsStatus(charts, status) { + for (var i = 0; i < charts.length; i++) { + var otherChart = charts[i]; + otherChart[STATUS_KEY] = status; + } + } + zrUtil.each(eventActionMap, function (actionType, eventType) { + chart._messageCenter.on(eventType, function (event) { + if (connectedGroups[chart.group] && chart[STATUS_KEY] !== STATUS_PENDING) { + var action = chart.makeActionFromEvent(event); + var otherCharts = []; + for (var id in instances) { + var otherChart = instances[id]; + if (otherChart !== chart && otherChart.group === chart.group) { + otherCharts.push(otherChart); + } + } + updateConnectedChartsStatus(otherCharts, STATUS_PENDING); + each(otherCharts, function (otherChart) { + if (otherChart[STATUS_KEY] !== STATUS_UPDATING) { + otherChart.dispatchAction(action); + } + }); + updateConnectedChartsStatus(otherCharts, STATUS_UPDATED); + } + }); + }); + + } + /** + * @param {HTMLDomElement} dom + * @param {Object} [theme] + * @param {Object} opts + */ + echarts.init = function (dom, theme, opts) { + // Check version + if ((zrender.version.replace('.', '') - 0) < (echarts.dependencies.zrender.replace('.', '') - 0)) { + throw new Error( + 'ZRender ' + zrender.version + + ' is too old for ECharts ' + echarts.version + + '. Current version need ZRender ' + + echarts.dependencies.zrender + '+' + ); + } + if (!dom) { + throw new Error('Initialize failed: invalid dom.'); + } + + var chart = new ECharts(dom, theme, opts); + chart.id = 'ec_' + idBase++; + instances[chart.id] = chart; + + dom.setAttribute && + dom.setAttribute(DOM_ATTRIBUTE_KEY, chart.id); + + enableConnect(chart); + + return chart; + }; + + /** + * @return {string|Array.} groupId + */ + echarts.connect = function (groupId) { + // Is array of charts + if (zrUtil.isArray(groupId)) { + var charts = groupId; + groupId = null; + // If any chart has group + zrUtil.each(charts, function (chart) { + if (chart.group != null) { + groupId = chart.group; + } + }); + groupId = groupId || ('g_' + groupIdBase++); + zrUtil.each(charts, function (chart) { + chart.group = groupId; + }); + } + connectedGroups[groupId] = true; + return groupId; + }; + + /** + * @return {string} groupId + */ + echarts.disConnect = function (groupId) { + connectedGroups[groupId] = false; + }; + + /** + * Dispose a chart instance + * @param {module:echarts~ECharts|HTMLDomElement|string} chart + */ + echarts.dispose = function (chart) { + if (zrUtil.isDom(chart)) { + chart = echarts.getInstanceByDom(chart); + } + else if (typeof chart === 'string') { + chart = instances[chart]; + } + if ((chart instanceof ECharts) && !chart.isDisposed()) { + chart.dispose(); + } + }; + + /** + * @param {HTMLDomElement} dom + * @return {echarts~ECharts} + */ + echarts.getInstanceByDom = function (dom) { + var key = dom.getAttribute(DOM_ATTRIBUTE_KEY); + return instances[key]; + }; + /** + * @param {string} key + * @return {echarts~ECharts} + */ + echarts.getInstanceById = function (key) { + return instances[key]; + }; + + /** + * Register theme + */ + echarts.registerTheme = function (name, theme) { + themeStorage[name] = theme; + }; + + /** + * Register option preprocessor + * @param {Function} preprocessorFunc + */ + echarts.registerPreprocessor = function (preprocessorFunc) { + optionPreprocessorFuncs.push(preprocessorFunc); + }; + + /** + * @param {string} stage + * @param {Function} processorFunc + */ + echarts.registerProcessor = function (stage, processorFunc) { + if (zrUtil.indexOf(PROCESSOR_STAGES, stage) < 0) { + throw new Error('stage should be one of ' + PROCESSOR_STAGES); + } + var funcs = dataProcessorFuncs[stage] || (dataProcessorFuncs[stage] = []); + funcs.push(processorFunc); + }; + + /** + * Usage: + * registerAction('someAction', 'someEvent', function () { ... }); + * registerAction('someAction', function () { ... }); + * registerAction( + * {type: 'someAction', event: 'someEvent', update: 'updateView'}, + * function () { ... } + * ); + * + * @param {(string|Object)} actionInfo + * @param {string} actionInfo.type + * @param {string} [actionInfo.event] + * @param {string} [actionInfo.update] + * @param {string} [eventName] + * @param {Function} action + */ + echarts.registerAction = function (actionInfo, eventName, action) { + if (typeof eventName === 'function') { + action = eventName; + eventName = ''; + } + var actionType = zrUtil.isObject(actionInfo) + ? actionInfo.type + : ([actionInfo, actionInfo = { + event: eventName + }][0]); + + // Event name is all lowercase + actionInfo.event = (actionInfo.event || actionType).toLowerCase(); + eventName = actionInfo.event; + + if (!actions[actionType]) { + actions[actionType] = {action: action, actionInfo: actionInfo}; + } + eventActionMap[eventName] = actionType; + }; + + /** + * @param {string} type + * @param {*} CoordinateSystem + */ + echarts.registerCoordinateSystem = function (type, CoordinateSystem) { + CoordinateSystemManager.register(type, CoordinateSystem); + }; + + /** + * @param {*} layout + */ + echarts.registerLayout = function (layout) { + // PENDING All functions ? + if (zrUtil.indexOf(layoutFuncs, layout) < 0) { + layoutFuncs.push(layout); + } + }; + + /** + * @param {string} stage + * @param {Function} visualCodingFunc + */ + echarts.registerVisualCoding = function (stage, visualCodingFunc) { + if (zrUtil.indexOf(VISUAL_CODING_STAGES, stage) < 0) { + throw new Error('stage should be one of ' + VISUAL_CODING_STAGES); + } + var funcs = visualCodingFuncs[stage] || (visualCodingFuncs[stage] = []); + funcs.push(visualCodingFunc); + }; + + /** + * @param {Object} opts + */ + echarts.extendChartView = function (opts) { + return ChartView.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendComponentModel = function (opts) { + return ComponentModel.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendSeriesModel = function (opts) { + return SeriesModel.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendComponentView = function (opts) { + return ComponentView.extend(opts); + }; + + /** + * ZRender need a canvas context to do measureText. + * But in node environment canvas may be created by node-canvas. + * So we need to specify how to create a canvas instead of using document.createElement('canvas') + * + * Be careful of using it in the browser. + * + * @param {Function} creator + * @example + * var Canvas = require('canvas'); + * var echarts = require('echarts'); + * echarts.setCanvasCreator(function () { + * // Small size is enough. + * return new Canvas(32, 32); + * }); + */ + echarts.setCanvasCreator = function (creator) { + zrUtil.createCanvas = creator; + }; + + echarts.registerVisualCoding('echarts', zrUtil.curry( + __webpack_require__(88), '', 'itemStyle' + )); + echarts.registerPreprocessor(__webpack_require__(89)); + + // Default action + echarts.registerAction({ + type: 'highlight', + event: 'highlight', + update: 'highlight' + }, zrUtil.noop); + echarts.registerAction({ + type: 'downplay', + event: 'downplay', + update: 'downplay' + }, zrUtil.noop); + + + // -------- + // Exports + // -------- + + echarts.graphic = __webpack_require__(42); + echarts.number = __webpack_require__(7); + echarts.format = __webpack_require__(6); + echarts.matrix = __webpack_require__(17); + echarts.vector = __webpack_require__(16); + + echarts.util = {}; + each([ + 'map', 'each', 'filter', 'indexOf', 'inherits', + 'reduce', 'filter', 'bind', 'curry', 'isArray', + 'isString', 'isObject', 'isFunction', 'extend' + ], + function (name) { + echarts.util[name] = zrUtil[name]; + } + ); + + module.exports = echarts; + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * ECharts global model + * + * @module {echarts/model/Global} + * + */ + + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var Model = __webpack_require__(8); + var each = zrUtil.each; + var filter = zrUtil.filter; + var map = zrUtil.map; + var isArray = zrUtil.isArray; + var indexOf = zrUtil.indexOf; + var isObject = zrUtil.isObject; + + var ComponentModel = __webpack_require__(19); + + var globalDefault = __webpack_require__(23); + + var OPTION_INNER_KEY = '\0_ec_inner'; + + /** + * @alias module:echarts/model/Global + * + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {Object} theme + */ + var GlobalModel = Model.extend({ + + constructor: GlobalModel, + + init: function (option, parentModel, theme, optionManager) { + theme = theme || {}; + + this.option = null; // Mark as not initialized. + + /** + * @type {module:echarts/model/Model} + * @private + */ + this._theme = new Model(theme); + + /** + * @type {module:echarts/model/OptionManager} + */ + this._optionManager = optionManager; + }, + + setOption: function (option, optionPreprocessorFuncs) { + zrUtil.assert( + !(OPTION_INNER_KEY in option), + 'please use chart.getOption()' + ); + + this._optionManager.setOption(option, optionPreprocessorFuncs); + + this.resetOption(); + }, + + /** + * @param {string} type null/undefined: reset all. + * 'recreate': force recreate all. + * 'timeline': only reset timeline option + * 'media': only reset media query option + * @return {boolean} Whether option changed. + */ + resetOption: function (type) { + var optionChanged = false; + var optionManager = this._optionManager; + + if (!type || type === 'recreate') { + var baseOption = optionManager.mountOption(type === 'recreate'); + + if (!this.option || type === 'recreate') { + initBase.call(this, baseOption); + } + else { + this.restoreData(); + this.mergeOption(baseOption); + } + optionChanged = true; + } + + if (type === 'timeline' || type === 'media') { + this.restoreData(); + } + + if (!type || type === 'recreate' || type === 'timeline') { + var timelineOption = optionManager.getTimelineOption(this); + timelineOption && (this.mergeOption(timelineOption), optionChanged = true); + } + + if (!type || type === 'recreate' || type === 'media') { + var mediaOptions = optionManager.getMediaOption(this, this._api); + if (mediaOptions.length) { + each(mediaOptions, function (mediaOption) { + this.mergeOption(mediaOption, optionChanged = true); + }, this); + } + } + + return optionChanged; + }, + + /** + * @protected + */ + mergeOption: function (newOption) { + var option = this.option; + var componentsMap = this._componentsMap; + var newCptTypes = []; + + // 如果不存在对应的 component model 则直接 merge + each(newOption, function (componentOption, mainType) { + if (componentOption == null) { + return; + } + + if (!ComponentModel.hasClass(mainType)) { + option[mainType] = option[mainType] == null + ? zrUtil.clone(componentOption) + : zrUtil.merge(option[mainType], componentOption, true); + } + else { + newCptTypes.push(mainType); + } + }); + + // FIXME OPTION 同步是否要改回原来的 + ComponentModel.topologicalTravel( + newCptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this + ); + + function visitComponent(mainType, dependencies) { + var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]); + + var mapResult = modelUtil.mappingToExists( + componentsMap[mainType], newCptOptionList + ); + + makeKeyInfo(mainType, mapResult); + + var dependentModels = getComponentsByTypes( + componentsMap, dependencies + ); + + option[mainType] = []; + componentsMap[mainType] = []; + + each(mapResult, function (resultItem, index) { + var componentModel = resultItem.exist; + var newCptOption = resultItem.option; + + zrUtil.assert( + isObject(newCptOption) || componentModel, + 'Empty component definition' + ); + + // Consider where is no new option and should be merged using {}, + // see removeEdgeAndAdd in topologicalTravel and + // ComponentModel.getAllClassMainTypes. + if (!newCptOption) { + componentModel.mergeOption({}, this); + componentModel.optionUpdated(this); + } + else { + var ComponentModelClass = ComponentModel.getClass( + mainType, resultItem.keyInfo.subType, true + ); + + if (componentModel && componentModel instanceof ComponentModelClass) { + componentModel.mergeOption(newCptOption, this); + componentModel.optionUpdated(this); + } + else { + // PENDING Global as parent ? + componentModel = new ComponentModelClass( + newCptOption, this, this, + zrUtil.extend( + { + dependentModels: dependentModels, + componentIndex: index + }, + resultItem.keyInfo + ) + ); + // Call optionUpdated after init + componentModel.optionUpdated(this); + } + } + + componentsMap[mainType][index] = componentModel; + option[mainType][index] = componentModel.option; + }, this); + + // Backup series for filtering. + if (mainType === 'series') { + this._seriesIndices = createSeriesIndices(componentsMap.series); + } + } + }, + + /** + * Get option for output (cloned option and inner info removed) + * @public + * @return {Object} + */ + getOption: function () { + var option = zrUtil.clone(this.option); + + each(option, function (opts, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = modelUtil.normalizeToArray(opts); + for (var i = opts.length - 1; i >= 0; i--) { + // Remove options with inner id. + if (modelUtil.isIdInner(opts[i])) { + opts.splice(i, 1); + } + } + option[mainType] = opts; + } + }); + + delete option[OPTION_INNER_KEY]; + + return option; + }, + + /** + * @return {module:echarts/model/Model} + */ + getTheme: function () { + return this._theme; + }, + + /** + * @param {string} mainType + * @param {number} [idx=0] + * @return {module:echarts/model/Component} + */ + getComponent: function (mainType, idx) { + var list = this._componentsMap[mainType]; + if (list) { + return list[idx || 0]; + } + }, + + /** + * @param {Object} condition + * @param {string} condition.mainType + * @param {string} [condition.subType] If ignore, only query by mainType + * @param {number} [condition.index] Either input index or id or name. + * @param {string} [condition.id] Either input index or id or name. + * @param {string} [condition.name] Either input index or id or name. + * @return {Array.} + */ + queryComponents: function (condition) { + var mainType = condition.mainType; + if (!mainType) { + return []; + } + + var index = condition.index; + var id = condition.id; + var name = condition.name; + + var cpts = this._componentsMap[mainType]; + + if (!cpts || !cpts.length) { + return []; + } + + var result; + + if (index != null) { + if (!isArray(index)) { + index = [index]; + } + result = filter(map(index, function (idx) { + return cpts[idx]; + }), function (val) { + return !!val; + }); + } + else if (id != null) { + var isIdArray = isArray(id); + result = filter(cpts, function (cpt) { + return (isIdArray && indexOf(id, cpt.id) >= 0) + || (!isIdArray && cpt.id === id); + }); + } + else if (name != null) { + var isNameArray = isArray(name); + result = filter(cpts, function (cpt) { + return (isNameArray && indexOf(name, cpt.name) >= 0) + || (!isNameArray && cpt.name === name); + }); + } + + return filterBySubType(result, condition); + }, + + /** + * The interface is different from queryComponents, + * which is convenient for inner usage. + * + * @usage + * var result = findComponents( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}} + * ); + * var result = findComponents( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}} + * ); + * var result = findComponents( + * {mainType: 'series'}, + * function (model, index) {...} + * ); + * // result like [component0, componnet1, ...] + * + * @param {Object} condition + * @param {string} condition.mainType Mandatory. + * @param {string} [condition.subType] Optional. + * @param {Object} [condition.query] like {xxxIndex, xxxId, xxxName}, + * where xxx is mainType. + * If query attribute is null/undefined or has no index/id/name, + * do not filtering by query conditions, which is convenient for + * no-payload situations or when target of action is global. + * @param {Function} [condition.filter] parameter: component, return boolean. + * @return {Array.} + */ + findComponents: function (condition) { + var query = condition.query; + var mainType = condition.mainType; + + var queryCond = getQueryCond(query); + var result = queryCond + ? this.queryComponents(queryCond) + : this._componentsMap[mainType]; + + return doFilter(filterBySubType(result, condition)); + + function getQueryCond(q) { + var indexAttr = mainType + 'Index'; + var idAttr = mainType + 'Id'; + var nameAttr = mainType + 'Name'; + return q && ( + q.hasOwnProperty(indexAttr) + || q.hasOwnProperty(idAttr) + || q.hasOwnProperty(nameAttr) + ) + ? { + mainType: mainType, + // subType will be filtered finally. + index: q[indexAttr], + id: q[idAttr], + name: q[nameAttr] + } + : null; + } + + function doFilter(res) { + return condition.filter + ? filter(res, condition.filter) + : res; + } + }, + + /** + * @usage + * eachComponent('legend', function (legendModel, index) { + * ... + * }); + * eachComponent(function (componentType, model, index) { + * // componentType does not include subType + * // (componentType is 'xxx' but not 'xxx.aa') + * }); + * eachComponent( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}, + * function (model, index) {...} + * ); + * eachComponent( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}, + * function (model, index) {...} + * ); + * + * @param {string|Object=} mainType When mainType is object, the definition + * is the same as the method 'findComponents'. + * @param {Function} cb + * @param {*} context + */ + eachComponent: function (mainType, cb, context) { + var componentsMap = this._componentsMap; + + if (typeof mainType === 'function') { + context = cb; + cb = mainType; + each(componentsMap, function (components, componentType) { + each(components, function (component, index) { + cb.call(context, componentType, component, index); + }); + }); + } + else if (zrUtil.isString(mainType)) { + each(componentsMap[mainType], cb, context); + } + else if (isObject(mainType)) { + var queryResult = this.findComponents(mainType); + each(queryResult, cb, context); + } + }, + + /** + * @param {string} name + * @return {Array.} + */ + getSeriesByName: function (name) { + var series = this._componentsMap.series; + return filter(series, function (oneSeries) { + return oneSeries.name === name; + }); + }, + + /** + * @param {number} seriesIndex + * @return {module:echarts/model/Series} + */ + getSeriesByIndex: function (seriesIndex) { + return this._componentsMap.series[seriesIndex]; + }, + + /** + * @param {string} subType + * @return {Array.} + */ + getSeriesByType: function (subType) { + var series = this._componentsMap.series; + return filter(series, function (oneSeries) { + return oneSeries.subType === subType; + }); + }, + + /** + * @return {Array.} + */ + getSeries: function () { + return this._componentsMap.series.slice(); + }, + + /** + * After filtering, series may be different + * frome raw series. + * + * @param {Function} cb + * @param {*} context + */ + eachSeries: function (cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.series[rawSeriesIndex]; + cb.call(context, series, rawSeriesIndex); + }, this); + }, + + /** + * Iterate raw series before filtered. + * + * @param {Function} cb + * @param {*} context + */ + eachRawSeries: function (cb, context) { + each(this._componentsMap.series, cb, context); + }, + + /** + * After filtering, series may be different. + * frome raw series. + * + * @parma {string} subType + * @param {Function} cb + * @param {*} context + */ + eachSeriesByType: function (subType, cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.series[rawSeriesIndex]; + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }, + + /** + * Iterate raw series before filtered of given type. + * + * @parma {string} subType + * @param {Function} cb + * @param {*} context + */ + eachRawSeriesByType: function (subType, cb, context) { + return each(this.getSeriesByType(subType), cb, context); + }, + + /** + * @param {module:echarts/model/Series} seriesModel + */ + isSeriesFiltered: function (seriesModel) { + assertSeriesInitialized(this); + return zrUtil.indexOf(this._seriesIndices, seriesModel.componentIndex) < 0; + }, + + /** + * @param {Function} cb + * @param {*} context + */ + filterSeries: function (cb, context) { + assertSeriesInitialized(this); + var filteredSeries = filter( + this._componentsMap.series, cb, context + ); + this._seriesIndices = createSeriesIndices(filteredSeries); + }, + + restoreData: function () { + var componentsMap = this._componentsMap; + + this._seriesIndices = createSeriesIndices(componentsMap.series); + + var componentTypes = []; + each(componentsMap, function (components, componentType) { + componentTypes.push(componentType); + }); + + ComponentModel.topologicalTravel( + componentTypes, + ComponentModel.getAllClassMainTypes(), + function (componentType, dependencies) { + each(componentsMap[componentType], function (component) { + component.restoreData(); + }); + } + ); + } + + }); + + /** + * @inner + */ + function mergeTheme(option, theme) { + for (var name in theme) { + // 如果有 component model 则把具体的 merge 逻辑交给该 model 处理 + if (!ComponentModel.hasClass(name)) { + if (typeof theme[name] === 'object') { + option[name] = !option[name] + ? zrUtil.clone(theme[name]) + : zrUtil.merge(option[name], theme[name], false); + } + else { + if (option[name] == null) { + option[name] = theme[name]; + } + } + } + } + } + + function initBase(baseOption) { + baseOption = baseOption; + + // Using OPTION_INNER_KEY to mark that this option can not be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbiden. + this.option = {}; + this.option[OPTION_INNER_KEY] = 1; + + /** + * @type {Object.>} + * @private + */ + this._componentsMap = {}; + + /** + * Mapping between filtered series list and raw series list. + * key: filtered series indices, value: raw series indices. + * @type {Array.} + * @private + */ + this._seriesIndices = null; + + mergeTheme(baseOption, this._theme.option); + + // TODO Needs clone when merging to the unexisted property + zrUtil.merge(baseOption, globalDefault, false); + + this.mergeOption(baseOption); + } + + /** + * @inner + * @param {Array.|string} types model types + * @return {Object} key: {string} type, value: {Array.} models + */ + function getComponentsByTypes(componentsMap, types) { + if (!zrUtil.isArray(types)) { + types = types ? [types] : []; + } + + var ret = {}; + each(types, function (type) { + ret[type] = (componentsMap[type] || []).slice(); + }); + + return ret; + } + + /** + * @inner + */ + function makeKeyInfo(mainType, mapResult) { + // We use this id to hash component models and view instances + // in echarts. id can be specified by user, or auto generated. + + // The id generation rule ensures new view instance are able + // to mapped to old instance when setOption are called in + // no-merge mode. So we generate model id by name and plus + // type in view id. + + // name can be duplicated among components, which is convenient + // to specify multi components (like series) by one name. + + // Ensure that each id is distinct. + var idMap = {}; + + each(mapResult, function (item, index) { + var existCpt = item.exist; + existCpt && (idMap[existCpt.id] = item); + }); + + each(mapResult, function (item, index) { + var opt = item.option; + + zrUtil.assert( + !opt || opt.id == null || !idMap[opt.id] || idMap[opt.id] === item, + 'id duplicates: ' + (opt && opt.id) + ); + + opt && opt.id != null && (idMap[opt.id] = item); + + // Complete subType + if (isObject(opt)) { + var subType = determineSubType(mainType, opt, item.exist); + item.keyInfo = {mainType: mainType, subType: subType}; + } + }); + + // Make name and id. + each(mapResult, function (item, index) { + var existCpt = item.exist; + var opt = item.option; + var keyInfo = item.keyInfo; + + if (!isObject(opt)) { + return; + } + + // name can be overwitten. Consider case: axis.name = '20km'. + // But id generated by name will not be changed, which affect + // only in that case: setOption with 'not merge mode' and view + // instance will be recreated, which can be accepted. + keyInfo.name = opt.name != null + ? opt.name + '' + : existCpt + ? existCpt.name + : '\0-'; + + if (existCpt) { + keyInfo.id = existCpt.id; + } + else if (opt.id != null) { + keyInfo.id = opt.id + ''; + } + else { + // Consider this situatoin: + // optionA: [{name: 'a'}, {name: 'a'}, {..}] + // optionB [{..}, {name: 'a'}, {name: 'a'}] + // Series with the same name between optionA and optionB + // should be mapped. + var idNum = 0; + do { + keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++; + } + while (idMap[keyInfo.id]); + } + + idMap[keyInfo.id] = item; + }); + } + + /** + * @inner + */ + function determineSubType(mainType, newCptOption, existComponent) { + var subType = newCptOption.type + ? newCptOption.type + : existComponent + ? existComponent.subType + // Use determineSubType only when there is no existComponent. + : ComponentModel.determineSubType(mainType, newCptOption); + + // tooltip, markline, markpoint may always has no subType + return subType; + } + + /** + * @inner + */ + function createSeriesIndices(seriesModels) { + return map(seriesModels, function (series) { + return series.componentIndex; + }) || []; + } + + /** + * @inner + */ + function filterBySubType(components, condition) { + // Using hasOwnProperty for restrict. Consider + // subType is undefined in user payload. + return condition.hasOwnProperty('subType') + ? filter(components, function (cpt) { + return cpt.subType === condition.subType; + }) + : components; + } + + /** + * @inner + */ + function assertSeriesInitialized(ecModel) { + // Components that use _seriesIndices should depends on series component, + // which make sure that their initialization is after series. + if (!ecModel._seriesIndices) { + throw new Error('Series has not been initialized yet.'); + } + } + + module.exports = GlobalModel; + + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/core/util + */ + + var Gradient = __webpack_require__(4); + // 用于处理merge时无法遍历Date等对象的问题 + var BUILTIN_OBJECT = { + '[object Function]': 1, + '[object RegExp]': 1, + '[object Date]': 1, + '[object Error]': 1, + '[object CanvasGradient]': 1 + }; + + var objToString = Object.prototype.toString; + + var arrayProto = Array.prototype; + var nativeForEach = arrayProto.forEach; + var nativeFilter = arrayProto.filter; + var nativeSlice = arrayProto.slice; + var nativeMap = arrayProto.map; + var nativeReduce = arrayProto.reduce; + + /** + * @param {*} source + * @return {*} 拷贝后的新对象 + */ + function clone(source) { + if (typeof source == 'object' && source !== null) { + var result = source; + if (source instanceof Array) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + else if ( + !isBuildInObject(source) + // 是否为 dom 对象 + && !isDom(source) + ) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key)) { + result[key] = clone(source[key]); + } + } + } + + return result; + } + + return source; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} target + * @param {*} source + * @param {boolean} [overwrite=false] + */ + function merge(target, source, overwrite) { + // We should escapse that source is string + // and enter for ... in ... + if (!isObject(source) || !isObject(target)) { + return overwrite ? clone(source) : target; + } + + for (var key in source) { + if (source.hasOwnProperty(key)) { + var targetProp = target[key]; + var sourceProp = source[key]; + + if (isObject(sourceProp) + && isObject(targetProp) + && !isArray(sourceProp) + && !isArray(targetProp) + && !isDom(sourceProp) + && !isDom(targetProp) + && !isBuildInObject(sourceProp) + && !isBuildInObject(targetProp) + ) { + // 如果需要递归覆盖,就递归调用merge + merge(targetProp, sourceProp, overwrite); + } + else if (overwrite || !(key in target)) { + // 否则只处理overwrite为true,或者在目标对象中没有此属性的情况 + // NOTE,在 target[key] 不存在的时候也是直接覆盖 + target[key] = clone(source[key], true); + } + } + } + + return target; + } + + /** + * @param {Array} targetAndSources The first item is target, and the rests are source. + * @param {boolean} [overwrite=false] + * @return {*} target + */ + function mergeAll(targetAndSources, overwrite) { + var result = targetAndSources[0]; + for (var i = 1, len = targetAndSources.length; i < len; i++) { + result = merge(result, targetAndSources[i], overwrite); + } + return result; + } + + /** + * @param {*} target + * @param {*} source + * @memberOf module:zrender/core/util + */ + function extend(target, source) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + target[key] = source[key]; + } + } + return target; + } + + /** + * @param {*} target + * @param {*} source + * @param {boolen} [overlay=false] + * @memberOf module:zrender/core/util + */ + function defaults(target, source, overlay) { + for (var key in source) { + if (source.hasOwnProperty(key) + && (overlay ? source[key] != null : target[key] == null) + ) { + target[key] = source[key]; + } + } + return target; + } + + function createCanvas() { + return document.createElement('canvas'); + } + // FIXME + var _ctx; + function getContext() { + if (!_ctx) { + // Use util.createCanvas instead of createCanvas + // because createCanvas may be overwritten in different environment + _ctx = util.createCanvas().getContext('2d'); + } + return _ctx; + } + + /** + * 查询数组中元素的index + * @memberOf module:zrender/core/util + */ + function indexOf(array, value) { + if (array) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + } + return -1; + } + + /** + * 构造类继承关系 + * + * @memberOf module:zrender/core/util + * @param {Function} clazz 源类 + * @param {Function} baseClazz 基类 + */ + function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + function F() {} + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + + for (var prop in clazzPrototype) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; + } + + /** + * @memberOf module:zrender/core/util + * @param {Object|Function} target + * @param {Object|Function} sorce + * @param {boolean} overlay + */ + function mixin(target, source, overlay) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + + defaults(target, source, overlay); + } + + /** + * @param {Array|TypedArray} data + */ + function isArrayLike(data) { + if (! data) { + return; + } + if (typeof data == 'string') { + return false; + } + return typeof data.length == 'number'; + } + + /** + * 数组或对象遍历 + * @memberOf module:zrender/core/util + * @param {Object|Array} obj + * @param {Function} cb + * @param {*} [context] + */ + function each(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.forEach && obj.forEach === nativeForEach) { + obj.forEach(cb, context); + } + else if (obj.length === +obj.length) { + for (var i = 0, len = obj.length; i < len; i++) { + cb.call(context, obj[i], i, obj); + } + } + else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + cb.call(context, obj[key], key, obj); + } + } + } + } + + /** + * 数组映射 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function map(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.map && obj.map === nativeMap) { + return obj.map(cb, context); + } + else { + var result = []; + for (var i = 0, len = obj.length; i < len; i++) { + result.push(cb.call(context, obj[i], i, obj)); + } + return result; + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {Object} [memo] + * @param {*} [context] + * @return {Array} + */ + function reduce(obj, cb, memo, context) { + if (!(obj && cb)) { + return; + } + if (obj.reduce && obj.reduce === nativeReduce) { + return obj.reduce(cb, memo, context); + } + else { + for (var i = 0, len = obj.length; i < len; i++) { + memo = cb.call(context, memo, obj[i], i, obj); + } + return memo; + } + } + + /** + * 数组过滤 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function filter(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.filter && obj.filter === nativeFilter) { + return obj.filter(cb, context); + } + else { + var result = []; + for (var i = 0, len = obj.length; i < len; i++) { + if (cb.call(context, obj[i], i, obj)) { + result.push(obj[i]); + } + } + return result; + } + } + + /** + * 数组项查找 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function find(obj, cb, context) { + if (!(obj && cb)) { + return; + } + for (var i = 0, len = obj.length; i < len; i++) { + if (cb.call(context, obj[i], i, obj)) { + return obj[i]; + } + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Function} func + * @param {*} context + * @return {Function} + */ + function bind(func, context) { + var args = nativeSlice.call(arguments, 2); + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; + } + + /** + * @memberOf module:zrender/core/util + * @param {Function} func + * @return {Function} + */ + function curry(func) { + var args = nativeSlice.call(arguments, 1); + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isArray(value) { + return objToString.call(value) === '[object Array]'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isFunction(value) { + return typeof value === 'function'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isString(value) { + return objToString.call(value) === '[object String]'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return type === 'function' || (!!value && type == 'object'); + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isBuildInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)] + || (value instanceof Gradient); + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isDom(value) { + return value && value.nodeType === 1 + && typeof(value.nodeName) == 'string'; + } + + /** + * If value1 is not null, then return value1, otherwise judget rest of values. + * @memberOf module:zrender/core/util + * @return {*} Final value + */ + function retrieve(values) { + for (var i = 0, len = arguments.length; i < len; i++) { + if (arguments[i] != null) { + return arguments[i]; + } + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Array} arr + * @param {number} startIndex + * @param {number} endIndex + * @return {Array} + */ + function slice() { + return Function.call.apply(nativeSlice, arguments); + } + + /** + * @memberOf module:zrender/core/util + * @param {boolean} condition + * @param {string} message + */ + function assert(condition, message) { + if (!condition) { + throw new Error(message); + } + } + + var util = { + inherits: inherits, + mixin: mixin, + clone: clone, + merge: merge, + mergeAll: mergeAll, + extend: extend, + defaults: defaults, + getContext: getContext, + createCanvas: createCanvas, + indexOf: indexOf, + slice: slice, + find: find, + isArrayLike: isArrayLike, + each: each, + map: map, + reduce: reduce, + filter: filter, + bind: bind, + curry: curry, + isArray: isArray, + isString: isString, + isObject: isObject, + isFunction: isFunction, + isBuildInObject: isBuildInObject, + isDom: isDom, + retrieve: retrieve, + assert: assert, + noop: function () {} + }; + module.exports = util; + + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + + + /** + * @param {Array.} colorStops + */ + var Gradient = function (colorStops) { + + this.colorStops = colorStops || []; + }; + + Gradient.prototype = { + + constructor: Gradient, + + addColorStop: function (offset, color) { + this.colorStops.push({ + + offset: offset, + + color: color + }); + } + }; + + module.exports = Gradient; + + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + + + var formatUtil = __webpack_require__(6); + var nubmerUtil = __webpack_require__(7); + var zrUtil = __webpack_require__(3); + + var Model = __webpack_require__(8); + + var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle']; + + var modelUtil = {}; + + /** + * Create "each" method to iterate names. + * + * @pubilc + * @param {Array.} names + * @param {Array.=} attrs + * @return {Function} + */ + modelUtil.createNameEach = function (names, attrs) { + names = names.slice(); + var capitalNames = zrUtil.map(names, modelUtil.capitalFirst); + attrs = (attrs || []).slice(); + var capitalAttrs = zrUtil.map(attrs, modelUtil.capitalFirst); + + return function (callback, context) { + zrUtil.each(names, function (name, index) { + var nameObj = {name: name, capital: capitalNames[index]}; + + for (var j = 0; j < attrs.length; j++) { + nameObj[attrs[j]] = name + capitalAttrs[j]; + } + + callback.call(context, nameObj); + }); + }; + }; + + /** + * @public + */ + modelUtil.capitalFirst = function (str) { + return str ? str.charAt(0).toUpperCase() + str.substr(1) : str; + }; + + /** + * Iterate each dimension name. + * + * @public + * @param {Function} callback The parameter is like: + * { + * name: 'angle', + * capital: 'Angle', + * axis: 'angleAxis', + * axisIndex: 'angleAixs', + * index: 'angleIndex' + * } + * @param {Object} context + */ + modelUtil.eachAxisDim = modelUtil.createNameEach(AXIS_DIMS, ['axisIndex', 'axis', 'index']); + + /** + * If value is not array, then translate it to array. + * @param {*} value + * @return {Array} [value] or value + */ + modelUtil.normalizeToArray = function (value) { + return zrUtil.isArray(value) + ? value + : value == null + ? [] + : [value]; + }; + + /** + * If tow dataZoomModels has the same axis controlled, we say that they are 'linked'. + * dataZoomModels and 'links' make up one or more graphics. + * This function finds the graphic where the source dataZoomModel is in. + * + * @public + * @param {Function} forEachNode Node iterator. + * @param {Function} forEachEdgeType edgeType iterator + * @param {Function} edgeIdGetter Giving node and edgeType, return an array of edge id. + * @return {Function} Input: sourceNode, Output: Like {nodes: [], dims: {}} + */ + modelUtil.createLinkedNodesFinder = function (forEachNode, forEachEdgeType, edgeIdGetter) { + + return function (sourceNode) { + var result = { + nodes: [], + records: {} // key: edgeType.name, value: Object (key: edge id, value: boolean). + }; + + forEachEdgeType(function (edgeType) { + result.records[edgeType.name] = {}; + }); + + if (!sourceNode) { + return result; + } + + absorb(sourceNode, result); + + var existsLink; + do { + existsLink = false; + forEachNode(processSingleNode); + } + while (existsLink); + + function processSingleNode(node) { + if (!isNodeAbsorded(node, result) && isLinked(node, result)) { + absorb(node, result); + existsLink = true; + } + } + + return result; + }; + + function isNodeAbsorded(node, result) { + return zrUtil.indexOf(result.nodes, node) >= 0; + } + + function isLinked(node, result) { + var hasLink = false; + forEachEdgeType(function (edgeType) { + zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) { + result.records[edgeType.name][edgeId] && (hasLink = true); + }); + }); + return hasLink; + } + + function absorb(node, result) { + result.nodes.push(node); + forEachEdgeType(function (edgeType) { + zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) { + result.records[edgeType.name][edgeId] = true; + }); + }); + } + }; + + /** + * Sync default option between normal and emphasis like `position` and `show` + * In case some one will write code like + * label: { + * normal: { + * show: false, + * position: 'outside', + * textStyle: { + * fontSize: 18 + * } + * }, + * emphasis: { + * show: true + * } + * } + * @param {Object} opt + * @param {Array.} subOpts + */ + modelUtil.defaultEmphasis = function (opt, subOpts) { + if (opt) { + var emphasisOpt = opt.emphasis = opt.emphasis || {}; + var normalOpt = opt.normal = opt.normal || {}; + + // Default emphasis option from normal + zrUtil.each(subOpts, function (subOptName) { + var val = zrUtil.retrieve(emphasisOpt[subOptName], normalOpt[subOptName]); + if (val != null) { + emphasisOpt[subOptName] = val; + } + }); + } + }; + + /** + * Create a model proxy to be used in tooltip for edge data, markLine data, markPoint data. + * @param {Object} opt + * @param {string} [opt.seriesIndex] + * @param {Object} [opt.name] + * @param {module:echarts/data/List} data + * @param {Array.} rawData + */ + modelUtil.createDataFormatModel = function (opt, data, rawData) { + var model = new Model(); + zrUtil.mixin(model, modelUtil.dataFormatMixin); + model.seriesIndex = opt.seriesIndex; + model.name = opt.name || ''; + + model.getData = function () { + return data; + }; + model.getRawDataArray = function () { + return rawData; + }; + return model; + }; + + /** + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method retieves value from data. + * @param {string|number|Date|Array|Object} dataItem + * @return {number|string|Date|Array.} + */ + modelUtil.getDataItemValue = function (dataItem) { + // Performance sensitive. + return dataItem && (dataItem.value == null ? dataItem : dataItem.value); + }; + + /** + * This helper method convert value in data. + * @param {string|number|Date} value + * @param {Object|string} [dimInfo] If string (like 'x'), dimType defaults 'number'. + */ + modelUtil.converDataValue = function (value, dimInfo) { + // Performance sensitive. + var dimType = dimInfo && dimInfo.type; + if (dimType === 'ordinal') { + return value; + } + + if (dimType === 'time' && !isFinite(value) && value != null && value !== '-') { + value = +nubmerUtil.parseDate(value); + } + + // dimType defaults 'number'. + // If dimType is not ordinal and value is null or undefined or NaN or '-', + // parse to NaN. + return (value == null || value === '') + ? NaN : +value; // If string (like '-'), using '+' parse to NaN + }; + + modelUtil.dataFormatMixin = { + /** + * Get params for formatter + * @param {number} dataIndex + * @return {Object} + */ + getDataParams: function (dataIndex) { + var data = this.getData(); + + var seriesIndex = this.seriesIndex; + var seriesName = this.name; + + var rawValue = this.getRawValue(dataIndex); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex, true); + + // Data may not exists in the option given by user + var rawDataArray = this.getRawDataArray(); + var itemOpt = rawDataArray && rawDataArray[rawDataIndex]; + + return { + seriesIndex: seriesIndex, + seriesName: seriesName, + name: name, + dataIndex: rawDataIndex, + data: itemOpt, + value: rawValue, + color: data.getItemVisual(dataIndex, 'color'), + + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ['seriesName', 'name', 'value'] + }; + }, + + /** + * Format label + * @param {number} dataIndex + * @param {string} [status='normal'] 'normal' or 'emphasis' + * @param {Function|string} [formatter] Default use the `itemStyle[status].label.formatter` + * @return {string} + */ + getFormattedLabel: function (dataIndex, status, formatter) { + status = status || 'normal'; + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + + var params = this.getDataParams(dataIndex); + if (formatter == null) { + formatter = itemModel.get(['label', status, 'formatter']); + } + + if (typeof formatter === 'function') { + params.status = status; + return formatter(params); + } + else if (typeof formatter === 'string') { + return formatUtil.formatTpl(formatter, params); + } + }, + + /** + * Get raw value in option + * @param {number} idx + * @return {Object} + */ + getRawValue: function (idx) { + var itemModel = this.getData().getItemModel(idx); + if (itemModel && itemModel.option != null) { + var dataItem = itemModel.option; + return (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem)) + ? dataItem.value : dataItem; + } + } + }; + + /** + * Mapping to exists for merge. + * + * @public + * @param {Array.|Array.} exists + * @param {Object|Array.} newCptOptions + * @return {Array.} Result, like [{exist: ..., option: ...}, {}], + * which order is the same as exists. + */ + modelUtil.mappingToExists = function (exists, newCptOptions) { + // Mapping by the order by original option (but not order of + // new option) in merge mode. Because we should ensure + // some specified index (like xAxisIndex) is consistent with + // original option, which is easy to understand, espatially in + // media query. And in most case, merge option is used to + // update partial option but not be expected to change order. + newCptOptions = (newCptOptions || []).slice(); + + var result = zrUtil.map(exists || [], function (obj, index) { + return {exist: obj}; + }); + + // Mapping by id or name if specified. + zrUtil.each(newCptOptions, function (cptOption, index) { + if (!zrUtil.isObject(cptOption)) { + return; + } + + for (var i = 0; i < result.length; i++) { + var exist = result[i].exist; + if (!result[i].option // Consider name: two map to one. + && ( + // id has highest priority. + (cptOption.id != null && exist.id === cptOption.id + '') + || (cptOption.name != null + && !modelUtil.isIdInner(cptOption) + && !modelUtil.isIdInner(exist) + && exist.name === cptOption.name + '' + ) + ) + ) { + result[i].option = cptOption; + newCptOptions[index] = null; + break; + } + } + }); + + // Otherwise mapping by index. + zrUtil.each(newCptOptions, function (cptOption, index) { + if (!zrUtil.isObject(cptOption)) { + return; + } + + var i = 0; + for (; i < result.length; i++) { + var exist = result[i].exist; + if (!result[i].option + && !modelUtil.isIdInner(exist) + // Caution: + // Do not overwrite id. But name can be overwritten, + // because axis use name as 'show label text'. + // 'exist' always has id and name and we dont + // need to check it. + && cptOption.id == null + ) { + result[i].option = cptOption; + break; + } + } + + if (i >= result.length) { + result.push({option: cptOption}); + } + }); + + return result; + }; + + /** + * @public + * @param {Object} cptOption + * @return {boolean} + */ + modelUtil.isIdInner = function (cptOption) { + return zrUtil.isObject(cptOption) + && cptOption.id + && (cptOption.id + '').indexOf('\0_ec_\0') === 0; + }; + + module.exports = modelUtil; + + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + + /** + * 每三位默认加,格式化 + * @type {string|number} x + */ + function addCommas(x) { + if (isNaN(x)) { + return '-'; + } + x = (x + '').split('.'); + return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,') + + (x.length > 1 ? ('.' + x[1]) : ''); + } + + /** + * @param {string} str + * @return {string} str + */ + function toCamelCase(str) { + return str.toLowerCase().replace(/-(.)/g, function(match, group1) { + return group1.toUpperCase(); + }); + } + + /** + * Normalize css liked array configuration + * e.g. + * 3 => [3, 3, 3, 3] + * [4, 2] => [4, 2, 4, 2] + * [4, 3, 2] => [4, 3, 2, 3] + * @param {number|Array.} val + */ + function normalizeCssArray(val) { + var len = val.length; + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + else if (len === 2) { + // vertical | horizontal + return [val[0], val[1], val[0], val[1]]; + } + else if (len === 3) { + // top | horizontal | bottom + return [val[0], val[1], val[2], val[1]]; + } + return val; + } + + function encodeHTML(source) { + return String(source) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + + function wrapVar(varName, seriesIdx) { + return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}'; + } + /** + * Template formatter + * @param {string} tpl + * @param {Array.|Object} paramsList + * @return {string} + */ + function formatTpl(tpl, paramsList) { + if (!zrUtil.isArray(paramsList)) { + paramsList = [paramsList]; + } + var seriesLen = paramsList.length; + if (!seriesLen) { + return ''; + } + + var $vars = paramsList[0].$vars; + for (var i = 0; i < $vars.length; i++) { + var alias = TPL_VAR_ALIAS[i]; + tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); + } + for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { + for (var k = 0; k < $vars.length; k++) { + tpl = tpl.replace( + wrapVar(TPL_VAR_ALIAS[k], seriesIdx), + paramsList[seriesIdx][$vars[k]] + ); + } + } + + return tpl; + } + + /** + * ISO Date format + * @param {string} tpl + * @param {number} value + * @inner + */ + function formatTime(tpl, value) { + if (tpl === 'week' + || tpl === 'month' + || tpl === 'quarter' + || tpl === 'half-year' + || tpl === 'year' + ) { + tpl = 'MM-dd\nyyyy'; + } + + var date = numberUtil.parseDate(value); + var y = date.getFullYear(); + var M = date.getMonth() + 1; + var d = date.getDate(); + var h = date.getHours(); + var m = date.getMinutes(); + var s = date.getSeconds(); + + tpl = tpl.replace('MM', s2d(M)) + .toLowerCase() + .replace('yyyy', y) + .replace('yy', y % 100) + .replace('dd', s2d(d)) + .replace('d', d) + .replace('hh', s2d(h)) + .replace('h', h) + .replace('mm', s2d(m)) + .replace('m', m) + .replace('ss', s2d(s)) + .replace('s', s); + + return tpl; + } + + /** + * @param {string} str + * @return {string} + * @inner + */ + function s2d(str) { + return str < 10 ? ('0' + str) : str; + } + + module.exports = { + + normalizeCssArray: normalizeCssArray, + + addCommas: addCommas, + + toCamelCase: toCamelCase, + + encodeHTML: encodeHTML, + + formatTpl: formatTpl, + + formatTime: formatTime + }; + + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + + /** + * 数值处理模块 + * @module echarts/util/number + */ + + + + var number = {}; + + var RADIAN_EPSILON = 1e-4; + + function _trim(str) { + return str.replace(/^\s+/, '').replace(/\s+$/, ''); + } + + /** + * Linear mapping a value from domain to range + * @memberOf module:echarts/util/number + * @param {(number|Array.)} val + * @param {Array.} domain Domain extent domain[0] can be bigger than domain[1] + * @param {Array.} range Range extent range[0] can be bigger than range[1] + * @param {boolean} clamp + * @return {(number|Array.} + */ + number.linearMap = function (val, domain, range, clamp) { + + var sub = domain[1] - domain[0]; + + if (sub === 0) { + return (range[0] + range[1]) / 2; + } + var t = (val - domain[0]) / sub; + + if (clamp) { + t = Math.min(Math.max(t, 0), 1); + } + + return t * (range[1] - range[0]) + range[0]; + }; + + /** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + * @memberOf module:echarts/util/number + * @param {string|number} percent + * @param {number} all + * @return {number} + */ + number.parsePercent = function(percent, all) { + switch (percent) { + case 'center': + case 'middle': + percent = '50%'; + break; + case 'left': + case 'top': + percent = '0%'; + break; + case 'right': + case 'bottom': + percent = '100%'; + break; + } + if (typeof percent === 'string') { + if (_trim(percent).match(/%$/)) { + return parseFloat(percent) / 100 * all; + } + + return parseFloat(percent); + } + + return percent == null ? NaN : +percent; + }; + + /** + * Fix rounding error of float numbers + * @param {number} x + * @return {number} + */ + number.round = function (x) { + // PENDING + return +(+x).toFixed(12); + }; + + number.asc = function (arr) { + arr.sort(function (a, b) { + return a - b; + }); + return arr; + }; + + /** + * Get precision + * @param {number} val + */ + number.getPrecision = function (val) { + if (isNaN(val)) { + return 0; + } + // It is much faster than methods converting number to string as follows + // var tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + var e = 1; + var count = 0; + while (Math.round(val * e) / e !== val) { + e *= 10; + count++; + } + return count; + }; + + /** + * @param {Array.} dataExtent + * @param {Array.} pixelExtent + * @return {number} precision + */ + number.getPixelPrecision = function (dataExtent, pixelExtent) { + var log = Math.log; + var LN10 = Math.LN10; + var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); + var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); + return Math.max( + -dataQuantity + sizeQuantity, + 0 + ); + }; + + // Number.MAX_SAFE_INTEGER, ie do not support. + number.MAX_SAFE_INTEGER = 9007199254740991; + + /** + * To 0 - 2 * PI, considering negative radian. + * @param {number} radian + * @return {number} + */ + number.remRadian = function (radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; + }; + + /** + * @param {type} radian + * @return {boolean} + */ + number.isRadianAroundZero = function (val) { + return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; + }; + + /** + * @param {string|Date|number} value + * @return {number} timestamp + */ + number.parseDate = function (value) { + return value instanceof Date + ? value + : new Date( + typeof value === 'string' + ? value.replace(/-/g, '/') + : Math.round(value) + ); + }; + + // "Nice Numbers for Graph Labels" of Graphic Gems + /** + * find a “nice” number approximately equal to x. Round the number if round = true, take ceiling if round = false + * The primary observation is that the “nicest” numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers. + * @param {number} val + * @param {boolean} round + * @return {number} + */ + number.nice = function (val, round) { + var exp = Math.floor(Math.log(val) / Math.LN10); + var exp10 = Math.pow(10, exp); + var f = val / exp10; // between 1 and 10 + var nf; + if (round) { + if (f < 1.5) { nf = 1; } + else if (f < 2.5) { nf = 2; } + else if (f < 4) { nf = 3; } + else if (f < 7) { nf = 5; } + else { nf = 10; } + } + else { + if (f < 1) { nf = 1; } + else if (f < 2) { nf = 2; } + else if (f < 3) { nf = 3; } + else if (f < 5) { nf = 5; } + else { nf = 10; } + } + return nf * exp10; + }; + + module.exports = number; + + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/model/Model + */ + + + var zrUtil = __webpack_require__(3); + var clazzUtil = __webpack_require__(9); + + /** + * @alias module:echarts/model/Model + * @constructor + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {module:echarts/model/Global} ecModel + * @param {Object} extraOpt + */ + function Model(option, parentModel, ecModel, extraOpt) { + /** + * @type {module:echarts/model/Model} + * @readOnly + */ + this.parentModel = parentModel; + + /** + * @type {module:echarts/model/Global} + * @readOnly + */ + this.ecModel = ecModel; + + /** + * @type {Object} + * @protected + */ + this.option = option; + + // Simple optimization + if (this.init) { + if (arguments.length <= 4) { + this.init(option, parentModel, ecModel, extraOpt); + } + else { + this.init.apply(this, arguments); + } + } + } + + Model.prototype = { + + constructor: Model, + + /** + * Model 的初始化函数 + * @param {Object} option + */ + init: null, + + /** + * 从新的 Option merge + */ + mergeOption: function (option) { + zrUtil.merge(this.option, option, true); + }, + + /** + * @param {string} path + * @param {boolean} [ignoreParent=false] + * @return {*} + */ + get: function (path, ignoreParent) { + if (!path) { + return this.option; + } + + if (typeof path === 'string') { + path = path.split('.'); + } + + var obj = this.option; + var parentModel = this.parentModel; + for (var i = 0; i < path.length; i++) { + // obj could be number/string/... (like 0) + obj = (obj && typeof obj === 'object') ? obj[path[i]] : null; + if (obj == null) { + break; + } + } + if (obj == null && parentModel && !ignoreParent) { + obj = parentModel.get(path); + } + return obj; + }, + + /** + * @param {string} key + * @param {boolean} [ignoreParent=false] + * @return {*} + */ + getShallow: function (key, ignoreParent) { + var option = this.option; + var val = option && option[key]; + var parentModel = this.parentModel; + if (val == null && parentModel && !ignoreParent) { + val = parentModel.getShallow(key); + } + return val; + }, + + /** + * @param {string} path + * @param {module:echarts/model/Model} [parentModel] + * @return {module:echarts/model/Model} + */ + getModel: function (path, parentModel) { + var obj = this.get(path, true); + var thisParentModel = this.parentModel; + var model = new Model( + obj, parentModel || (thisParentModel && thisParentModel.getModel(path)), + this.ecModel + ); + return model; + }, + + /** + * If model has option + */ + isEmpty: function () { + return this.option == null; + }, + + restoreData: function () {}, + + // Pending + clone: function () { + var Ctor = this.constructor; + return new Ctor(zrUtil.clone(this.option)); + }, + + setReadOnly: function (properties) { + clazzUtil.setReadOnly(this, properties); + } + }; + + // Enable Model.extend. + clazzUtil.enableClassExtend(Model); + + var mixin = zrUtil.mixin; + mixin(Model, __webpack_require__(10)); + mixin(Model, __webpack_require__(12)); + mixin(Model, __webpack_require__(13)); + mixin(Model, __webpack_require__(18)); + + module.exports = Model; + + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var clazz = {}; + + var TYPE_DELIMITER = '.'; + var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___'; + /** + * @public + */ + var parseClassType = clazz.parseClassType = function (componentType) { + var ret = {main: '', sub: ''}; + if (componentType) { + componentType = componentType.split(TYPE_DELIMITER); + ret.main = componentType[0] || ''; + ret.sub = componentType[1] || ''; + } + return ret; + }; + /** + * @public + */ + clazz.enableClassExtend = function (RootClass, preConstruct) { + RootClass.extend = function (proto) { + var ExtendedClass = function () { + preConstruct && preConstruct.apply(this, arguments); + RootClass.apply(this, arguments); + }; + + zrUtil.extend(ExtendedClass.prototype, proto); + + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + zrUtil.inherits(ExtendedClass, this); + ExtendedClass.superClass = this; + + return ExtendedClass; + }; + }; + + // superCall should have class info, which can not be fetch from 'this'. + // Consider this case: + // class A has method f, + // class B inherits class A, overrides method f, f call superApply('f'), + // class C inherits class B, do not overrides method f, + // then when method of class C is called, dead loop occured. + function superCall(context, methodName) { + var args = zrUtil.slice(arguments, 2); + return this.superClass.prototype[methodName].apply(context, args); + } + + function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); + } + + /** + * @param {Object} entity + * @param {Object} options + * @param {boolean} [options.registerWhenExtend] + * @public + */ + clazz.enableClassManagement = function (entity, options) { + options = options || {}; + + /** + * Component model classes + * key: componentType, + * value: + * componentClass, when componentType is 'xxx' + * or Object., when componentType is 'xxx.yy' + * @type {Object} + */ + var storage = {}; + + entity.registerClass = function (Clazz, componentType) { + if (componentType) { + componentType = parseClassType(componentType); + + if (!componentType.sub) { + if (storage[componentType.main]) { + throw new Error(componentType.main + 'exists.'); + } + storage[componentType.main] = Clazz; + } + else if (componentType.sub !== IS_CONTAINER) { + var container = makeContainer(componentType); + container[componentType.sub] = Clazz; + } + } + return Clazz; + }; + + entity.getClass = function (componentTypeMain, subType, throwWhenNotFound) { + var Clazz = storage[componentTypeMain]; + + if (Clazz && Clazz[IS_CONTAINER]) { + Clazz = subType ? Clazz[subType] : null; + } + + if (throwWhenNotFound && !Clazz) { + throw new Error( + 'Component ' + componentTypeMain + '.' + (subType || '') + ' not exists. Load it first.' + ); + } + + return Clazz; + }; + + entity.getClassesByMainType = function (componentType) { + componentType = parseClassType(componentType); + + var result = []; + var obj = storage[componentType.main]; + + if (obj && obj[IS_CONTAINER]) { + zrUtil.each(obj, function (o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } + else { + result.push(obj); + } + + return result; + }; + + entity.hasClass = function (componentType) { + // Just consider componentType.main. + componentType = parseClassType(componentType); + return !!storage[componentType.main]; + }; + + /** + * @return {Array.} Like ['aa', 'bb'], but can not be ['aa.xx'] + */ + entity.getAllClassMainTypes = function () { + var types = []; + zrUtil.each(storage, function (obj, type) { + types.push(type); + }); + return types; + }; + + /** + * If a main type is container and has sub types + * @param {string} mainType + * @return {boolean} + */ + entity.hasSubTypes = function (componentType) { + componentType = parseClassType(componentType); + var obj = storage[componentType.main]; + return obj && obj[IS_CONTAINER]; + }; + + entity.parseClassType = parseClassType; + + function makeContainer(componentType) { + var container = storage[componentType.main]; + if (!container || !container[IS_CONTAINER]) { + container = storage[componentType.main] = {}; + container[IS_CONTAINER] = true; + } + return container; + } + + if (options.registerWhenExtend) { + var originalExtend = entity.extend; + if (originalExtend) { + entity.extend = function (proto) { + var ExtendedClass = originalExtend.call(this, proto); + return entity.registerClass(ExtendedClass, proto.type); + }; + } + } + + return entity; + }; + + /** + * @param {string|Array.} properties + */ + clazz.setReadOnly = function (obj, properties) { + // FIXME It seems broken in IE8 simulation of IE11 + // if (!zrUtil.isArray(properties)) { + // properties = properties != null ? [properties] : []; + // } + // zrUtil.each(properties, function (prop) { + // var value = obj[prop]; + + // Object.defineProperty + // && Object.defineProperty(obj, prop, { + // value: value, writable: false + // }); + // zrUtil.isArray(obj[prop]) + // && Object.freeze + // && Object.freeze(obj[prop]); + // }); + }; + + module.exports = clazz; + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + + var getLineStyle = __webpack_require__(11)( + [ + ['lineWidth', 'width'], + ['stroke', 'color'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ); + module.exports = { + getLineStyle: function (excludes) { + var style = getLineStyle.call(this, excludes); + var lineDash = this.getLineDash(); + lineDash && (style.lineDash = lineDash); + return style; + }, + + getLineDash: function () { + var lineType = this.get('type'); + return (lineType === 'solid' || lineType == null) ? null + : (lineType === 'dashed' ? [5, 5] : [1, 1]); + } + }; + + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + // TODO Parse shadow style + // TODO Only shallow path support + + var zrUtil = __webpack_require__(3); + + module.exports = function (properties) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + return function (excludes) { + var style = {}; + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + if (excludes && zrUtil.indexOf(excludes, propName) >= 0) { + continue; + } + var val = this.getShallow(propName); + if (val != null) { + style[properties[i][0]] = val; + } + } + return style; + }; + }; + + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getAreaStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['opacity'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + + + var textContain = __webpack_require__(14); + + function getShallow(model, path) { + return model && model.getShallow(path); + } + + module.exports = { + /** + * Get color property or get color from option.textStyle.color + * @return {string} + */ + getTextColor: function () { + var ecModel = this.ecModel; + return this.getShallow('color') + || (ecModel && ecModel.get('textStyle.color')); + }, + + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + getFont: function () { + var ecModel = this.ecModel; + var gTextStyleModel = ecModel && ecModel.getModel('textStyle'); + return [ + // FIXME in node-canvas fontWeight is before fontStyle + this.getShallow('fontStyle') || getShallow(gTextStyleModel, 'fontStyle'), + this.getShallow('fontWeight') || getShallow(gTextStyleModel, 'fontWeight'), + (this.getShallow('fontSize') || getShallow(gTextStyleModel, 'fontSize') || 12) + 'px', + this.getShallow('fontFamily') || getShallow(gTextStyleModel, 'fontFamily') || 'sans-serif' + ].join(' '); + }, + + getTextRect: function (text) { + var textStyle = this.get('textStyle') || {}; + return textContain.getBoundingRect( + text, + this.getFont(), + textStyle.align, + textStyle.baseline + ); + }, + + ellipsis: function (text, containerWidth, options) { + return textContain.ellipsis( + text, this.getFont(), containerWidth, options + ); + } + }; + + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + + + var textWidthCache = {}; + var textWidthCacheCounter = 0; + var TEXT_CACHE_MAX = 5000; + + var util = __webpack_require__(3); + var BoundingRect = __webpack_require__(15); + + function getTextWidth(text, textFont) { + var key = text + ':' + textFont; + if (textWidthCache[key]) { + return textWidthCache[key]; + } + + var textLines = (text + '').split('\n'); + var width = 0; + + for (var i = 0, l = textLines.length; i < l; i++) { + // measureText 可以被覆盖以兼容不支持 Canvas 的环境 + width = Math.max(textContain.measureText(textLines[i], textFont).width, width); + } + + if (textWidthCacheCounter > TEXT_CACHE_MAX) { + textWidthCacheCounter = 0; + textWidthCache = {}; + } + textWidthCacheCounter++; + textWidthCache[key] = width; + + return width; + } + + function getTextRect(text, textFont, textAlign, textBaseline) { + var textLineLen = ((text || '') + '').split('\n').length; + + var width = getTextWidth(text, textFont); + // FIXME 高度计算比较粗暴 + var lineHeight = getTextWidth('国', textFont); + var height = textLineLen * lineHeight; + + var rect = new BoundingRect(0, 0, width, height); + // Text has a special line height property + rect.lineHeight = lineHeight; + + switch (textBaseline) { + case 'bottom': + case 'alphabetic': + rect.y -= lineHeight; + break; + case 'middle': + rect.y -= lineHeight / 2; + break; + // case 'hanging': + // case 'top': + } + + // FIXME Right to left language + switch (textAlign) { + case 'end': + case 'right': + rect.x -= rect.width; + break; + case 'center': + rect.x -= rect.width / 2; + break; + // case 'start': + // case 'left': + } + + return rect; + } + + function adjustTextPositionOnRect(textPosition, rect, textRect, distance) { + + var x = rect.x; + var y = rect.y; + + var height = rect.height; + var width = rect.width; + + var textHeight = textRect.height; + + var halfHeight = height / 2 - textHeight / 2; + + var textAlign = 'left'; + + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textAlign = 'left'; + break; + case 'top': + x += width / 2; + y -= distance + textHeight; + textAlign = 'center'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textAlign = 'left'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - textHeight - distance; + textAlign = 'center'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + textAlign = 'left'; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - textHeight - distance; + break; + case 'insideBottomRight': + x += width - distance; + y += height - textHeight - distance; + textAlign = 'right'; + break; + } + + return { + x: x, + y: y, + textAlign: textAlign, + textBaseline: 'top' + }; + } + + /** + * Show ellipsis if overflow. + * + * @param {string} text + * @param {string} textFont + * @param {string} containerWidth + * @param {Object} [options] + * @param {number} [options.ellipsis='...'] + * @param {number} [options.maxIterations=3] + * @param {number} [options.minCharacters=3] + * @return {string} + */ + function textEllipsis(text, textFont, containerWidth, options) { + if (!containerWidth) { + return ''; + } + + options = util.defaults({ + ellipsis: '...', + minCharacters: 3, + maxIterations: 3, + cnCharWidth: getTextWidth('国', textFont), + // FIXME + // 未考虑非等宽字体 + ascCharWidth: getTextWidth('a', textFont) + }, options, true); + + containerWidth -= getTextWidth(options.ellipsis); + + var textLines = (text + '').split('\n'); + + for (var i = 0, len = textLines.length; i < len; i++) { + textLines[i] = textLineTruncate( + textLines[i], textFont, containerWidth, options + ); + } + + return textLines.join('\n'); + } + + function textLineTruncate(text, textFont, containerWidth, options) { + // FIXME + // 粗糙得写的,尚未考虑性能和各种语言、字体的效果。 + for (var i = 0;; i++) { + var lineWidth = getTextWidth(text, textFont); + + if (lineWidth < containerWidth || i >= options.maxIterations) { + text += options.ellipsis; + break; + } + + var subLength = i === 0 + ? estimateLength(text, containerWidth, options) + : Math.floor(text.length * containerWidth / lineWidth); + + if (subLength < options.minCharacters) { + text = ''; + break; + } + + text = text.substr(0, subLength); + } + + return text; + } + + function estimateLength(text, containerWidth, options) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < containerWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) + ? options.ascCharWidth : options.cnCharWidth; + } + return i; + } + + var textContain = { + + getWidth: getTextWidth, + + getBoundingRect: getTextRect, + + adjustTextPositionOnRect: adjustTextPositionOnRect, + + ellipsis: textEllipsis, + + measureText: function (text, textFont) { + var ctx = util.getContext(); + ctx.font = textFont; + return ctx.measureText(text); + } + }; + + module.exports = textContain; + + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module echarts/core/BoundingRect + */ + + + var vec2 = __webpack_require__(16); + var matrix = __webpack_require__(17); + + var v2ApplyTransform = vec2.applyTransform; + var mathMin = Math.min; + var mathAbs = Math.abs; + var mathMax = Math.max; + /** + * @alias module:echarts/core/BoundingRect + */ + function BoundingRect(x, y, width, height) { + /** + * @type {number} + */ + this.x = x; + /** + * @type {number} + */ + this.y = y; + /** + * @type {number} + */ + this.width = width; + /** + * @type {number} + */ + this.height = height; + } + + BoundingRect.prototype = { + + constructor: BoundingRect, + + /** + * @param {module:echarts/core/BoundingRect} other + */ + union: function (other) { + var x = mathMin(other.x, this.x); + var y = mathMin(other.y, this.y); + + this.width = mathMax( + other.x + other.width, + this.x + this.width + ) - x; + this.height = mathMax( + other.y + other.height, + this.y + this.height + ) - y; + this.x = x; + this.y = y; + }, + + /** + * @param {Array.} m + * @methods + */ + applyTransform: (function () { + var min = []; + var max = []; + return function (m) { + // In case usage like this + // el.getBoundingRect().applyTransform(el.transform) + // And element has no transform + if (!m) { + return; + } + min[0] = this.x; + min[1] = this.y; + max[0] = this.x + this.width; + max[1] = this.y + this.height; + + v2ApplyTransform(min, min, m); + v2ApplyTransform(max, max, m); + + this.x = mathMin(min[0], max[0]); + this.y = mathMin(min[1], max[1]); + this.width = mathAbs(max[0] - min[0]); + this.height = mathAbs(max[1] - min[1]); + }; + })(), + + /** + * Calculate matrix of transforming from self to target rect + * @param {module:zrender/core/BoundingRect} b + * @return {Array.} + */ + calculateTransform: function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + + var m = matrix.create(); + + // 矩阵右乘 + matrix.translate(m, m, [-a.x, -a.y]); + matrix.scale(m, m, [sx, sy]); + matrix.translate(m, m, [b.x, b.y]); + + return m; + }, + + /** + * @param {(module:echarts/core/BoundingRect|Object)} b + * @return {boolean} + */ + intersect: function (b) { + var a = this; + var ax0 = a.x; + var ax1 = a.x + a.width; + var ay0 = a.y; + var ay1 = a.y + a.height; + + var bx0 = b.x; + var bx1 = b.x + b.width; + var by0 = b.y; + var by1 = b.y + b.height; + + return ! (ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + }, + + contain: function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }, + + /** + * @return {module:echarts/core/BoundingRect} + */ + clone: function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }, + + /** + * Copy from another rect + */ + copy: function (other) { + this.x = other.x; + this.y = other.y; + this.width = other.width; + this.height = other.height; + } + }; + + module.exports = BoundingRect; + + +/***/ }, +/* 16 */ +/***/ function(module, exports) { + + + var ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + + /** + * @typedef {Float32Array|Array.} Vector2 + */ + /** + * 二维向量类 + * @exports zrender/tool/vector + */ + var vector = { + /** + * 创建一个向量 + * @param {number} [x=0] + * @param {number} [y=0] + * @return {Vector2} + */ + create: function (x, y) { + var out = new ArrayCtor(2); + out[0] = x || 0; + out[1] = y || 0; + return out; + }, + + /** + * 复制向量数据 + * @param {Vector2} out + * @param {Vector2} v + * @return {Vector2} + */ + copy: function (out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + }, + + /** + * 克隆一个向量 + * @param {Vector2} v + * @return {Vector2} + */ + clone: function (v) { + var out = new ArrayCtor(2); + out[0] = v[0]; + out[1] = v[1]; + return out; + }, + + /** + * 设置向量的两个项 + * @param {Vector2} out + * @param {number} a + * @param {number} b + * @return {Vector2} 结果 + */ + set: function (out, a, b) { + out[0] = a; + out[1] = b; + return out; + }, + + /** + * 向量相加 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + add: function (out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + }, + + /** + * 向量缩放后相加 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + * @param {number} a + */ + scaleAndAdd: function (out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + }, + + /** + * 向量相减 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + sub: function (out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + }, + + /** + * 向量长度 + * @param {Vector2} v + * @return {number} + */ + len: function (v) { + return Math.sqrt(this.lenSquare(v)); + }, + + /** + * 向量长度平方 + * @param {Vector2} v + * @return {number} + */ + lenSquare: function (v) { + return v[0] * v[0] + v[1] * v[1]; + }, + + /** + * 向量乘法 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + mul: function (out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + }, + + /** + * 向量除法 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + div: function (out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + }, + + /** + * 向量点乘 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + dot: function (v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + }, + + /** + * 向量缩放 + * @param {Vector2} out + * @param {Vector2} v + * @param {number} s + */ + scale: function (out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + }, + + /** + * 向量归一化 + * @param {Vector2} out + * @param {Vector2} v + */ + normalize: function (out, v) { + var d = vector.len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } + else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; + }, + + /** + * 计算向量间距离 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + distance: function (v1, v2) { + return Math.sqrt( + (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]) + ); + }, + + /** + * 向量距离平方 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + distanceSquare: function (v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); + }, + + /** + * 求负向量 + * @param {Vector2} out + * @param {Vector2} v + */ + negate: function (out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + }, + + /** + * 插值两个点 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + * @param {number} t + */ + lerp: function (out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + }, + + /** + * 矩阵左乘向量 + * @param {Vector2} out + * @param {Vector2} v + * @param {Vector2} m + */ + applyTransform: function (out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + }, + /** + * 求两个向量最小值 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + min: function (out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + }, + /** + * 求两个向量最大值 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + max: function (out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + }; + + vector.length = vector.len; + vector.lengthSquare = vector.lenSquare; + vector.dist = vector.distance; + vector.distSquare = vector.distanceSquare; + + module.exports = vector; + + + +/***/ }, +/* 17 */ +/***/ function(module, exports) { + + + var ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + /** + * 3x2矩阵操作类 + * @exports zrender/tool/matrix + */ + var matrix = { + /** + * 创建一个单位矩阵 + * @return {Float32Array|Array.} + */ + create : function() { + var out = new ArrayCtor(6); + matrix.identity(out); + + return out; + }, + /** + * 设置矩阵为单位矩阵 + * @param {Float32Array|Array.} out + */ + identity : function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + }, + /** + * 复制矩阵 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} m + */ + copy: function(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; + }, + /** + * 矩阵相乘 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} m1 + * @param {Float32Array|Array.} m2 + */ + mul : function (out, m1, m2) { + // Consider matrix.mul(m, m2, m); + // where out is the same as m2. + // So use temp variable to escape error. + var out0 = m1[0] * m2[0] + m1[2] * m2[1]; + var out1 = m1[1] * m2[0] + m1[3] * m2[1]; + var out2 = m1[0] * m2[2] + m1[2] * m2[3]; + var out3 = m1[1] * m2[2] + m1[3] * m2[3]; + var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = out3; + out[4] = out4; + out[5] = out5; + return out; + }, + /** + * 平移变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {Float32Array|Array.} v + */ + translate : function(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; + }, + /** + * 旋转变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {number} rad + */ + rotate : function(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; + }, + /** + * 缩放变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {Float32Array|Array.} v + */ + scale : function(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; + }, + /** + * 求逆矩阵 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + */ + invert : function(out, a) { + + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + }; + + module.exports = matrix; + + + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getItemStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['stroke', 'borderColor'], + ['lineWidth', 'borderWidth'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Component model + * + * @module echarts/model/Component + */ + + + var Model = __webpack_require__(8); + var zrUtil = __webpack_require__(3); + var arrayPush = Array.prototype.push; + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + var layout = __webpack_require__(21); + + /** + * @alias module:echarts/model/Component + * @constructor + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {module:echarts/model/Model} ecModel + */ + var ComponentModel = Model.extend({ + + type: 'component', + + /** + * @readOnly + * @type {string} + */ + id: '', + + /** + * @readOnly + */ + name: '', + + /** + * @readOnly + * @type {string} + */ + mainType: '', + + /** + * @readOnly + * @type {string} + */ + subType: '', + + /** + * @readOnly + * @type {number} + */ + componentIndex: 0, + + /** + * @type {Object} + * @protected + */ + defaultOption: null, + + /** + * @type {module:echarts/model/Global} + * @readOnly + */ + ecModel: null, + + /** + * key: componentType + * value: Component model list, can not be null. + * @type {Object.>} + * @readOnly + */ + dependentModels: [], + + /** + * @type {string} + * @readOnly + */ + uid: null, + + /** + * Support merge layout params. + * Only support 'box' now (left/right/top/bottom/width/height). + * @type {string|Object} Object can be {ignoreSize: true} + * @readOnly + */ + layoutMode: null, + + + init: function (option, parentModel, ecModel, extraOpt) { + this.mergeDefaultAndTheme(this.option, this.ecModel); + }, + + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? layout.getLayoutParams(option) : {}; + + var themeModel = ecModel.getTheme(); + zrUtil.merge(option, themeModel.get(this.mainType)); + zrUtil.merge(option, this.getDefaultOption()); + + if (layoutMode) { + layout.mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + mergeOption: function (option) { + zrUtil.merge(this.option, option, true); + + var layoutMode = this.layoutMode; + if (layoutMode) { + layout.mergeLayoutParam(this.option, option, layoutMode); + } + }, + + // Hooker after init or mergeOption + optionUpdated: function (ecModel) {}, + + getDefaultOption: function () { + if (!this.hasOwnProperty('__defaultOption')) { + var optList = []; + var Class = this.constructor; + while (Class) { + var opt = Class.prototype.defaultOption; + opt && optList.push(opt); + Class = Class.superClass; + } + + var defaultOption = {}; + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = zrUtil.merge(defaultOption, optList[i], true); + } + this.__defaultOption = defaultOption; + } + return this.__defaultOption; + } + + }); + + // Reset ComponentModel.extend, add preConstruct. + clazzUtil.enableClassExtend( + ComponentModel, + function (option, parentModel, ecModel, extraOpt) { + // Set dependentModels, componentIndex, name, id, mainType, subType. + zrUtil.extend(this, extraOpt); + + this.uid = componentUtil.getUID('componentModel'); + + // this.setReadOnly([ + // 'type', 'id', 'uid', 'name', 'mainType', 'subType', + // 'dependentModels', 'componentIndex' + // ]); + } + ); + + // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement( + ComponentModel, {registerWhenExtend: true} + ); + componentUtil.enableSubTypeDefaulter(ComponentModel); + + // Add capability of ComponentModel.topologicalTravel. + componentUtil.enableTopologicalTravel(ComponentModel, getDependencies); + + function getDependencies(componentType) { + var deps = []; + zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) { + arrayPush.apply(deps, Clazz.prototype.dependencies || []); + }); + // Ensure main type + return zrUtil.map(deps, function (type) { + return clazzUtil.parseClassType(type).main; + }); + } + + zrUtil.mixin(ComponentModel, __webpack_require__(22)); + + module.exports = ComponentModel; + + +/***/ }, +/* 20 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var clazz = __webpack_require__(9); + + var parseClassType = clazz.parseClassType; + + var base = 0; + + var componentUtil = {}; + + var DELIMITER = '_'; + + /** + * @public + * @param {string} type + * @return {string} + */ + componentUtil.getUID = function (type) { + // Considering the case of crossing js context, + // use Math.random to make id as unique as possible. + return [(type || ''), base++, Math.random()].join(DELIMITER); + }; + + /** + * @inner + */ + componentUtil.enableSubTypeDefaulter = function (entity) { + + var subTypeDefaulters = {}; + + entity.registerSubTypeDefaulter = function (componentType, defaulter) { + componentType = parseClassType(componentType); + subTypeDefaulters[componentType.main] = defaulter; + }; + + entity.determineSubType = function (componentType, option) { + var type = option.type; + if (!type) { + var componentTypeMain = parseClassType(componentType).main; + if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + return type; + }; + + return entity; + }; + + /** + * Topological travel on Activity Network (Activity On Vertices). + * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis']. + * + * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology. + * + * If there is circle dependencey, Error will be thrown. + * + */ + componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) { + + /** + * @public + * @param {Array.} targetNameList Target Component type list. + * Can be ['aa', 'bb', 'aa.xx'] + * @param {Array.} fullNameList By which we can build dependency graph. + * @param {Function} callback Params: componentType, dependencies. + * @param {Object} context Scope of callback. + */ + entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var stack = result.noEntryList; + + var targetNameSet = {}; + zrUtil.each(targetNameList, function (name) { + targetNameSet[name] = true; + }); + + while (stack.length) { + var currComponentType = stack.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + zrUtil.each( + currVertex.successor, + isInTargetNameSet ? removeEdgeAndAdd : removeEdge + ); + } + + zrUtil.each(targetNameSet, function () { + throw new Error('Circle dependency may exists'); + }); + + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + if (graph[succComponentType].entryCount === 0) { + stack.push(succComponentType); + } + } + + // Consider this case: legend depends on series, and we call + // chart.setOption({series: [...]}), where only series is in option. + // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will + // not be called, but only sereis.mergeOption is called. Thus legend + // have no chance to update its local record about series (like which + // name of series is available in legend). + function removeEdgeAndAdd(succComponentType) { + targetNameSet[succComponentType] = true; + removeEdge(succComponentType); + } + }; + + /** + * DepndencyGraph: {Object} + * key: conponentType, + * value: { + * successor: [conponentTypes...], + * originalDeps: [conponentTypes...], + * entryCount: {number} + * } + */ + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + + zrUtil.each(fullNameList, function (name) { + + var thisItem = createDependencyGraphItem(graph, name); + var originalDeps = thisItem.originalDeps = dependencyGetter(name); + + var availableDeps = getAvailableDependencies(originalDeps, fullNameList); + thisItem.entryCount = availableDeps.length; + if (thisItem.entryCount === 0) { + noEntryList.push(name); + } + + zrUtil.each(availableDeps, function (dependentName) { + if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + var thatItem = createDependencyGraphItem(graph, dependentName); + if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) { + thatItem.successor.push(name); + } + }); + }); + + return {graph: graph, noEntryList: noEntryList}; + } + + function createDependencyGraphItem(graph, name) { + if (!graph[name]) { + graph[name] = {predecessor: [], successor: []}; + } + return graph[name]; + } + + function getAvailableDependencies(originalDeps, fullNameList) { + var availableDeps = []; + zrUtil.each(originalDeps, function (dep) { + zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } + }; + + module.exports = componentUtil; + + +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Layout helpers for each component positioning + + + var zrUtil = __webpack_require__(3); + var BoundingRect = __webpack_require__(15); + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + var parsePercent = numberUtil.parsePercent; + var each = zrUtil.each; + + var layout = {}; + + var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height']; + + function boxLayout(orient, group, gap, maxWidth, maxHeight) { + var x = 0; + var y = 0; + if (maxWidth == null) { + maxWidth = Infinity; + } + if (maxHeight == null) { + maxHeight = Infinity; + } + var currentLineMaxSize = 0; + group.eachChild(function (child, idx) { + var position = child.position; + var rect = child.getBoundingRect(); + var nextChild = group.childAt(idx + 1); + var nextChildRect = nextChild && nextChild.getBoundingRect(); + var nextX; + var nextY; + if (orient === 'horizontal') { + var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0); + nextX = x + moveX; + // Wrap when width exceeds maxWidth or meet a `newline` group + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } + else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); + } + } + else { + var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0); + nextY = y + moveY; + // Wrap when width exceeds maxHeight or meet a `newline` group + if (nextY > maxHeight || child.newline) { + x += currentLineMaxSize + gap; + y = 0; + nextY = moveY; + currentLineMaxSize = rect.width; + } + else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); + } + } + + if (child.newline) { + return; + } + + position[0] = x; + position[1] = y; + + orient === 'horizontal' + ? (x = nextX + gap) + : (y = nextY + gap); + }); + } + + /** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.box = boxLayout; + + /** + * VBox layouting + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.vbox = zrUtil.curry(boxLayout, 'vertical'); + + /** + * HBox layouting + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.hbox = zrUtil.curry(boxLayout, 'horizontal'); + + /** + * If x or x2 is not specified or 'center' 'left' 'right', + * the width would be as long as possible. + * If y or y2 is not specified or 'middle' 'top' 'bottom', + * the height would be as long as possible. + * + * @param {Object} positionInfo + * @param {number|string} [positionInfo.x] + * @param {number|string} [positionInfo.y] + * @param {number|string} [positionInfo.x2] + * @param {number|string} [positionInfo.y2] + * @param {Object} containerRect + * @param {string|number} margin + * @return {Object} {width, height} + */ + layout.getAvailableSize = function (positionInfo, containerRect, margin) { + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + + var x = parsePercent(positionInfo.x, containerWidth); + var y = parsePercent(positionInfo.y, containerHeight); + var x2 = parsePercent(positionInfo.x2, containerWidth); + var y2 = parsePercent(positionInfo.y2, containerHeight); + + (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0); + (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth); + (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0); + (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight); + + margin = formatUtil.normalizeCssArray(margin || 0); + + return { + width: Math.max(x2 - x - margin[1] - margin[3], 0), + height: Math.max(y2 - y - margin[0] - margin[2], 0) + }; + }; + + /** + * Parse position info. + * + * @param {Object} positionInfo + * @param {number|string} [positionInfo.left] + * @param {number|string} [positionInfo.top] + * @param {number|string} [positionInfo.right] + * @param {number|string} [positionInfo.bottom] + * @param {number|string} [positionInfo.width] + * @param {number|string} [positionInfo.height] + * @param {number|string} [positionInfo.aspect] Aspect is width / height + * @param {Object} containerRect + * @param {string|number} [margin] + * + * @return {module:zrender/core/BoundingRect} + */ + layout.getLayoutRect = function ( + positionInfo, containerRect, margin + ) { + margin = formatUtil.normalizeCssArray(margin || 0); + + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + + var left = parsePercent(positionInfo.left, containerWidth); + var top = parsePercent(positionInfo.top, containerHeight); + var right = parsePercent(positionInfo.right, containerWidth); + var bottom = parsePercent(positionInfo.bottom, containerHeight); + var width = parsePercent(positionInfo.width, containerWidth); + var height = parsePercent(positionInfo.height, containerHeight); + + var verticalMargin = margin[2] + margin[0]; + var horizontalMargin = margin[1] + margin[3]; + var aspect = positionInfo.aspect; + + // If width is not specified, calculate width from left and right + if (isNaN(width)) { + width = containerWidth - right - horizontalMargin - left; + } + if (isNaN(height)) { + height = containerHeight - bottom - verticalMargin - top; + } + + // If width and height are not given + // 1. Graph should not exceeds the container + // 2. Aspect must be keeped + // 3. Graph should take the space as more as possible + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } + else { + height = containerHeight * 0.8; + } + } + + if (aspect != null) { + // Calculate width or height with given aspect + if (isNaN(width)) { + width = aspect * height; + } + if (isNaN(height)) { + height = width / aspect; + } + } + + // If left is not specified, calculate left from right and width + if (isNaN(left)) { + left = containerWidth - right - width - horizontalMargin; + } + if (isNaN(top)) { + top = containerHeight - bottom - height - verticalMargin; + } + + // Align left and top + switch (positionInfo.left || positionInfo.right) { + case 'center': + left = containerWidth / 2 - width / 2 - margin[3]; + break; + case 'right': + left = containerWidth - width - horizontalMargin; + break; + } + switch (positionInfo.top || positionInfo.bottom) { + case 'middle': + case 'center': + top = containerHeight / 2 - height / 2 - margin[0]; + break; + case 'bottom': + top = containerHeight - height - verticalMargin; + break; + } + // If something is wrong and left, top, width, height are calculated as NaN + left = left || 0; + top = top || 0; + if (isNaN(width)) { + // Width may be NaN if only one value is given except width + width = containerWidth - left - (right || 0); + } + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - top - (bottom || 0); + } + + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; + }; + + /** + * Position group of component in viewport + * Group position is specified by either + * {left, top}, {right, bottom} + * If all properties exists, right and bottom will be igonred. + * + * @param {module:zrender/container/Group} group + * @param {Object} positionInfo + * @param {number|string} [positionInfo.left] + * @param {number|string} [positionInfo.top] + * @param {number|string} [positionInfo.right] + * @param {number|string} [positionInfo.bottom] + * @param {Object} containerRect + * @param {string|number} margin + */ + layout.positionGroup = function ( + group, positionInfo, containerRect, margin + ) { + var groupRect = group.getBoundingRect(); + + positionInfo = zrUtil.extend(zrUtil.clone(positionInfo), { + width: groupRect.width, + height: groupRect.height + }); + + positionInfo = layout.getLayoutRect( + positionInfo, containerRect, margin + ); + + group.position = [ + positionInfo.x - groupRect.x, + positionInfo.y - groupRect.y + ]; + }; + + /** + * Consider Case: + * When defulat option has {left: 0, width: 100}, and we set {right: 0} + * through setOption or media query, using normal zrUtil.merge will cause + * {right: 0} does not take effect. + * + * @example + * ComponentModel.extend({ + * init: function () { + * ... + * var inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param {Object} targetOption + * @param {Object} newOption + * @param {Object|string} [opt] + * @param {boolean} [opt.ignoreSize=false] Some component must has width and height. + */ + layout.mergeLayoutParam = function (targetOption, newOption, opt) { + !zrUtil.isObject(opt) && (opt = {}); + var hNames = ['width', 'left', 'right']; // Order by priority. + var vNames = ['height', 'top', 'bottom']; // Order by priority. + var hResult = merge(hNames); + var vResult = merge(vNames); + + copy(hNames, targetOption, hResult); + copy(vNames, targetOption, vResult); + + function merge(names) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = opt.ignoreSize ? 1 : 2; + + each(names, function (name) { + merged[name] = targetOption[name]; + }); + each(names, function (name) { + // Consider case: newOption.width is null, which is + // set by user for removing width setting. + hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); + hasValue(newParams, name) && newValueCount++; + hasValue(merged, name) && mergedValueCount++; + }); + + // Case: newOption: {width: ..., right: ...}, + // or targetOption: {right: ...} and newOption: {width: ...}, + // There is no conflict when merged only has params count + // little than enoughParamNumber. + if (mergedValueCount === enoughParamNumber || !newValueCount) { + return merged; + } + // Case: newOption: {width: ..., right: ...}, + // Than we can make sure user only want those two, and ignore + // all origin params in targetOption. + else if (newValueCount >= enoughParamNumber) { + return newParams; + } + else { + // Chose another param from targetOption by priority. + // When 'ignoreSize', enoughParamNumber is 1 and those will not happen. + for (var i = 0; i < names.length; i++) { + var name = names[i]; + if (!hasProp(newParams, name) && hasProp(targetOption, name)) { + newParams[name] = targetOption[name]; + break; + } + } + return newParams; + } + } + + function hasProp(obj, name) { + return obj.hasOwnProperty(name); + } + + function hasValue(obj, name) { + return obj[name] != null && obj[name] !== 'auto'; + } + + function copy(names, target, source) { + each(names, function (name) { + target[name] = source[name]; + }); + } + }; + + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + layout.getLayoutParams = function (source) { + return layout.copyLayoutParams({}, source); + }; + + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + layout.copyLayoutParams = function (target, source) { + source && target && each(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; + }; + + module.exports = layout; + + +/***/ }, +/* 22 */ +/***/ function(module, exports) { + + + + module.exports = { + getBoxLayoutParams: function () { + return { + left: this.get('left'), + top: this.get('top'), + right: this.get('right'), + bottom: this.get('bottom'), + width: this.get('width'), + height: this.get('height') + }; + } + }; + + +/***/ }, +/* 23 */ +/***/ function(module, exports) { + + + var platform = ''; + // Navigator not exists in node + if (typeof navigator !== 'undefined') { + platform = navigator.platform || ''; + } + module.exports = { + // 全图默认背景 + // backgroundColor: 'rgba(0,0,0,0)', + + // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization + // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'], + // 浅色 + // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'], + // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'], + // 深色 + color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83', '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'], + + // 默认需要 Grid 配置项 + grid: {}, + // 主题,主题 + textStyle: { + // color: '#000', + // decoration: 'none', + // PENDING + fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif', + // fontFamily: 'Arial, Verdana, sans-serif', + fontSize: 12, + fontStyle: 'normal', + fontWeight: 'normal' + }, + // 主题,默认标志图形类型列表 + // symbolList: [ + // 'circle', 'rectangle', 'triangle', 'diamond', + // 'emptyCircle', 'emptyRectangle', 'emptyTriangle', 'emptyDiamond' + // ], + animation: true, // 过渡动画是否开启 + animationThreshold: 2000, // 动画元素阀值,产生的图形原素超过2000不出动画 + animationDuration: 1000, // 过渡动画参数:进入 + animationDurationUpdate: 300, // 过渡动画参数:更新 + animationEasing: 'exponentialOut', //BounceOut + animationEasingUpdate: 'cubicOut' + }; + + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var echartsAPIList = [ + 'getDom', 'getZr', 'getWidth', 'getHeight', 'dispatchAction', + 'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption' + ]; + + function ExtensionAPI(chartInstance) { + zrUtil.each(echartsAPIList, function (name) { + this[name] = zrUtil.bind(chartInstance[name], chartInstance); + }, this); + } + + module.exports = ExtensionAPI; + + +/***/ }, +/* 25 */ +/***/ function(module, exports) { + + 'use strict'; + + + // var zrUtil = require('zrender/lib/core/util'); + var coordinateSystemCreators = {}; + + function CoordinateSystemManager() { + + this._coordinateSystems = []; + } + + CoordinateSystemManager.prototype = { + + constructor: CoordinateSystemManager, + + create: function (ecModel, api) { + var coordinateSystems = []; + for (var type in coordinateSystemCreators) { + var list = coordinateSystemCreators[type].create(ecModel, api); + list && (coordinateSystems = coordinateSystems.concat(list)); + } + + this._coordinateSystems = coordinateSystems; + }, + + update: function (ecModel, api) { + var coordinateSystems = this._coordinateSystems; + for (var i = 0; i < coordinateSystems.length; i++) { + // FIXME MUST have + coordinateSystems[i].update && coordinateSystems[i].update(ecModel, api); + } + } + }; + + CoordinateSystemManager.register = function (type, coordinateSystemCreator) { + coordinateSystemCreators[type] = coordinateSystemCreator; + }; + + CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; + }; + + module.exports = CoordinateSystemManager; + + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * ECharts option manager + * + * @module {echarts/model/OptionManager} + */ + + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var ComponentModel = __webpack_require__(19); + var each = zrUtil.each; + var clone = zrUtil.clone; + var map = zrUtil.map; + var merge = zrUtil.merge; + + var QUERY_REG = /^(min|max)?(.+)$/; + + /** + * TERM EXPLANATIONS: + * + * [option]: + * + * An object that contains definitions of components. For example: + * var option = { + * title: {...}, + * legend: {...}, + * visualMap: {...}, + * series: [ + * {data: [...]}, + * {data: [...]}, + * ... + * ] + * }; + * + * [rawOption]: + * + * An object input to echarts.setOption. 'rawOption' may be an + * 'option', or may be an object contains multi-options. For example: + * var option = { + * baseOption: { + * title: {...}, + * legend: {...}, + * series: [ + * {data: [...]}, + * {data: [...]}, + * ... + * ] + * }, + * timeline: {...}, + * options: [ + * {title: {...}, series: {data: [...]}}, + * {title: {...}, series: {data: [...]}}, + * ... + * ], + * media: [ + * { + * query: {maxWidth: 320}, + * option: {series: {x: 20}, visualMap: {show: false}} + * }, + * { + * query: {minWidth: 320, maxWidth: 720}, + * option: {series: {x: 500}, visualMap: {show: true}} + * }, + * { + * option: {series: {x: 1200}, visualMap: {show: true}} + * } + * ] + * }; + * + * @alias module:echarts/model/OptionManager + * @param {module:echarts/ExtensionAPI} api + */ + function OptionManager(api) { + + /** + * @private + * @type {module:echarts/ExtensionAPI} + */ + this._api = api; + + /** + * @private + * @type {Array.} + */ + this._timelineOptions = []; + + /** + * @private + * @type {Array.} + */ + this._mediaList = []; + + /** + * @private + * @type {Object} + */ + this._mediaDefault; + + /** + * -1, means default. + * empty means no media. + * @private + * @type {Array.} + */ + this._currentMediaIndices = []; + + /** + * @private + * @type {Object} + */ + this._optionBackup; + + /** + * @private + * @type {Object} + */ + this._newOptionBackup; + } + + // timeline.notMerge is not supported in ec3. Firstly there is rearly + // case that notMerge is needed. Secondly supporting 'notMerge' requires + // rawOption cloned and backuped when timeline changed, which does no + // good to performance. What's more, that both timeline and setOption + // method supply 'notMerge' brings complex and some problems. + // Consider this case: + // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false); + // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false); + + OptionManager.prototype = { + + constructor: OptionManager, + + /** + * @public + * @param {Object} rawOption Raw option. + * @param {module:echarts/model/Global} ecModel + * @param {Array.} optionPreprocessorFuncs + * @return {Object} Init option + */ + setOption: function (rawOption, optionPreprocessorFuncs) { + rawOption = clone(rawOption, true); + + // FIXME + // 如果 timeline options 或者 media 中设置了某个属性,而baseOption中没有设置,则进行警告。 + + var oldOptionBackup = this._optionBackup; + var newOptionBackup = this._newOptionBackup = parseRawOption.call( + this, rawOption, optionPreprocessorFuncs + ); + + // For setOption at second time (using merge mode); + if (oldOptionBackup) { + // Only baseOption can be merged. + mergeOption(oldOptionBackup.baseOption, newOptionBackup.baseOption); + + if (newOptionBackup.timelineOptions.length) { + oldOptionBackup.timelineOptions = newOptionBackup.timelineOptions; + } + if (newOptionBackup.mediaList.length) { + oldOptionBackup.mediaList = newOptionBackup.mediaList; + } + if (newOptionBackup.mediaDefault) { + oldOptionBackup.mediaDefault = newOptionBackup.mediaDefault; + } + } + else { + this._optionBackup = newOptionBackup; + } + }, + + /** + * @param {boolean} isRecreate + * @return {Object} + */ + mountOption: function (isRecreate) { + var optionBackup = isRecreate + // this._optionBackup can be only used when recreate. + // In other cases we use model.mergeOption to handle merge. + ? this._optionBackup : this._newOptionBackup; + + // FIXME + // 如果没有reset功能则不clone。 + + this._timelineOptions = map(optionBackup.timelineOptions, clone); + this._mediaList = map(optionBackup.mediaList, clone); + this._mediaDefault = clone(optionBackup.mediaDefault); + this._currentMediaIndices = []; + + return clone(optionBackup.baseOption); + }, + + /** + * @param {module:echarts/model/Global} ecModel + * @return {Object} + */ + getTimelineOption: function (ecModel) { + var option; + var timelineOptions = this._timelineOptions; + + if (timelineOptions.length) { + // getTimelineOption can only be called after ecModel inited, + // so we can get currentIndex from timelineModel. + var timelineModel = ecModel.getComponent('timeline'); + if (timelineModel) { + option = clone( + timelineOptions[timelineModel.getCurrentIndex()], + true + ); + } + } + + return option; + }, + + /** + * @param {module:echarts/model/Global} ecModel + * @return {Array.} + */ + getMediaOption: function (ecModel) { + var ecWidth = this._api.getWidth(); + var ecHeight = this._api.getHeight(); + var mediaList = this._mediaList; + var mediaDefault = this._mediaDefault; + var indices = []; + var result = []; + + // No media defined. + if (!mediaList.length && !mediaDefault) { + return result; + } + + // Multi media may be applied, the latter defined media has higher priority. + for (var i = 0, len = mediaList.length; i < len; i++) { + if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { + indices.push(i); + } + } + + // FIXME + // 是否mediaDefault应该强制用户设置,否则可能修改不能回归。 + if (!indices.length && mediaDefault) { + indices = [-1]; + } + + if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { + result = map(indices, function (index) { + return clone( + index === -1 ? mediaDefault.option : mediaList[index].option + ); + }); + } + // Otherwise return nothing. + + this._currentMediaIndices = indices; + + return result; + } + }; + + function parseRawOption(rawOption, optionPreprocessorFuncs) { + var timelineOptions = []; + var mediaList = []; + var mediaDefault; + var baseOption; + + // Compatible with ec2. + var timelineOpt = rawOption.timeline; + + if (rawOption.baseOption) { + baseOption = rawOption.baseOption; + } + + // For timeline + if (timelineOpt || rawOption.options) { + baseOption = baseOption || {}; + timelineOptions = (rawOption.options || []).slice(); + } + // For media query + if (rawOption.media) { + baseOption = baseOption || {}; + var media = rawOption.media; + each(media, function (singleMedia) { + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } + else if (!mediaDefault) { + // Use the first media default. + mediaDefault = singleMedia; + } + } + }); + } + + // For normal option + if (!baseOption) { + baseOption = rawOption; + } + + // Set timelineOpt to baseOption in ec3, + // which is convenient for merge option. + if (!baseOption.timeline) { + baseOption.timeline = timelineOpt; + } + + // Preprocess. + each([baseOption].concat(timelineOptions) + .concat(zrUtil.map(mediaList, function (media) { + return media.option; + })), + function (option) { + each(optionPreprocessorFuncs, function (preProcess) { + preProcess(option); + }); + } + ); + + return { + baseOption: baseOption, + timelineOptions: timelineOptions, + mediaDefault: mediaDefault, + mediaList: mediaList + }; + } + + /** + * @see + * Support: width, height, aspectRatio + * Can use max or min as prefix. + */ + function applyMediaQuery(query, ecWidth, ecHeight) { + var realMap = { + width: ecWidth, + height: ecHeight, + aspectratio: ecWidth / ecHeight // lowser case for convenientce. + }; + + var applicatable = true; + + zrUtil.each(query, function (value, attr) { + var matched = attr.match(QUERY_REG); + + if (!matched || !matched[1] || !matched[2]) { + return; + } + + var operator = matched[1]; + var realAttr = matched[2].toLowerCase(); + + if (!compare(realMap[realAttr], value, operator)) { + applicatable = false; + } + }); + + return applicatable; + } + + function compare(real, expect, operator) { + if (operator === 'min') { + return real >= expect; + } + else if (operator === 'max') { + return real <= expect; + } + else { // Equals + return real === expect; + } + } + + function indicesEquals(indices1, indices2) { + // indices is always order by asc and has only finite number. + return indices1.join(',') === indices2.join(','); + } + + /** + * Consider case: + * `chart.setOption(opt1);` + * Then user do some interaction like dataZoom, dataView changing. + * `chart.setOption(opt2);` + * Then user press 'reset button' in toolbox. + * + * After doing that all of the interaction effects should be reset, the + * chart should be the same as the result of invoke + * `chart.setOption(opt1); chart.setOption(opt2);`. + * + * Although it is not able ensure that + * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to + * `chart.setOption(merge(opt1, opt2));` exactly, + * this might be the only simple way to implement that feature. + * + * MEMO: We've considered some other approaches: + * 1. Each model handle its self restoration but not uniform treatment. + * (Too complex in logic and error-prone) + * 2. Use a shadow ecModel. (Performace expensive) + */ + function mergeOption(oldOption, newOption) { + newOption = newOption || {}; + + each(newOption, function (newCptOpt, mainType) { + if (newCptOpt == null) { + return; + } + + var oldCptOpt = oldOption[mainType]; + + if (!ComponentModel.hasClass(mainType)) { + oldOption[mainType] = merge(oldCptOpt, newCptOpt, true); + } + else { + newCptOpt = modelUtil.normalizeToArray(newCptOpt); + oldCptOpt = modelUtil.normalizeToArray(oldCptOpt); + + var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt); + + oldOption[mainType] = map(mapResult, function (item) { + return (item.option && item.exist) + ? merge(item.exist, item.option, true) + : (item.exist || item.option); + }); + } + }); + } + + module.exports = OptionManager; + + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var formatUtil = __webpack_require__(6); + var modelUtil = __webpack_require__(5); + var ComponentModel = __webpack_require__(19); + + var encodeHTML = formatUtil.encodeHTML; + var addCommas = formatUtil.addCommas; + + var SeriesModel = ComponentModel.extend({ + + type: 'series.__base__', + + /** + * @readOnly + */ + seriesIndex: 0, + + // coodinateSystem will be injected in the echarts/CoordinateSystem + coordinateSystem: null, + + /** + * @type {Object} + * @protected + */ + defaultOption: null, + + /** + * Data provided for legend + * @type {Function} + */ + // PENDING + legendDataProvider: null, + + init: function (option, parentModel, ecModel, extraOpt) { + + /** + * @type {number} + * @readOnly + */ + this.seriesIndex = this.componentIndex; + + this.mergeDefaultAndTheme(option, ecModel); + + /** + * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph} + * @private + */ + this._dataBeforeProcessed = this.getInitialData(option, ecModel); + + // When using module:echarts/data/Tree or module:echarts/data/Graph, + // cloneShallow will cause this._data.graph.data pointing to new data list. + // Wo we make this._dataBeforeProcessed first, and then make this._data. + this._data = this._dataBeforeProcessed.cloneShallow(); + }, + + /** + * Util for merge default and theme to option + * @param {Object} option + * @param {module:echarts/model/Global} ecModel + */ + mergeDefaultAndTheme: function (option, ecModel) { + zrUtil.merge( + option, + ecModel.getTheme().get(this.subType) + ); + zrUtil.merge(option, this.getDefaultOption()); + + // Default label emphasis `position` and `show` + modelUtil.defaultEmphasis( + option.label, ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + + // Default data label emphasis `position` and `show` + // FIXME Tree structure data ? + var data = option.data || []; + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + modelUtil.defaultEmphasis( + data[i].label, ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + } + } + }, + + mergeOption: function (newSeriesOption, ecModel) { + newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true); + + var data = this.getInitialData(newSeriesOption, ecModel); + // TODO Merge data? + if (data) { + this._data = data; + this._dataBeforeProcessed = data.cloneShallow(); + } + }, + + /** + * Init a data structure from data related option in series + * Must be overwritten + */ + getInitialData: function () {}, + + /** + * @return {module:echarts/data/List} + */ + getData: function () { + return this._data; + }, + + /** + * @param {module:echarts/data/List} data + */ + setData: function (data) { + this._data = data; + }, + + /** + * Get data before processed + * @return {module:echarts/data/List} + */ + getRawData: function () { + return this._dataBeforeProcessed; + }, + + /** + * Get raw data array given by user + * @return {Array.} + */ + getRawDataArray: function () { + return this.option.data; + }, + + /** + * Coord dimension to data dimension. + * + * By default the result is the same as dimensions of series data. + * But some series dimensions are different from coord dimensions (i.e. + * candlestick and boxplot). Override this method to handle those cases. + * + * Coord dimension to data dimension can be one-to-many + * + * @param {string} coordDim + * @return {Array.} dimensions on the axis. + */ + coordDimToDataDim: function (coordDim) { + return [coordDim]; + }, + + /** + * Convert data dimension to coord dimension. + * + * @param {string|number} dataDim + * @return {string} + */ + dataDimToCoordDim: function (dataDim) { + return dataDim; + }, + + /** + * Get base axis if has coordinate system and has axis. + * By default use coordSys.getBaseAxis(); + * Can be overrided for some chart. + * @return {type} description + */ + getBaseAxis: function () { + var coordSys = this.coordinateSystem; + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }, + + // FIXME + /** + * Default tooltip formatter + * + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + */ + formatTooltip: function (dataIndex, multipleSeries) { + var data = this._data; + var value = this.getRawValue(dataIndex); + var formattedValue = zrUtil.isArray(value) + ? zrUtil.map(value, addCommas).join(', ') : addCommas(value); + var name = data.getName(dataIndex); + var color = data.getItemVisual(dataIndex, 'color'); + var colorEl = ''; + + return !multipleSeries + ? (encodeHTML(this.name) + '
            ' + colorEl + + (name + ? encodeHTML(name) + ' : ' + formattedValue + : formattedValue) + ) + : (colorEl + encodeHTML(this.name) + ' : ' + formattedValue); + }, + + restoreData: function () { + this._data = this._dataBeforeProcessed.cloneShallow(); + } + }); + + zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin); + + module.exports = SeriesModel; + + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Group = __webpack_require__(29); + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + + var Component = function () { + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = componentUtil.getUID('viewComponent'); + }; + + Component.prototype = { + + constructor: Component, + + init: function (ecModel, api) {}, + + render: function (componentModel, ecModel, api, payload) {}, + + dispose: function () {} + }; + + var componentProto = Component.prototype; + componentProto.updateView + = componentProto.updateLayout + = componentProto.updateVisual + = function (seriesModel, ecModel, api, payload) { + // Do nothing; + }; + // Enable Component.extend. + clazzUtil.enableClassExtend(Component); + + // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement(Component, {registerWhenExtend: true}); + + module.exports = Component; + + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Group是一个容器,可以插入子节点,Group的变换也会被应用到子节点上 + * @module zrender/graphic/Group + * @example + * var Group = require('zrender/lib/container/Group'); + * var Circle = require('zrender/lib/graphic/shape/Circle'); + * var g = new Group(); + * g.position[0] = 100; + * g.position[1] = 100; + * g.add(new Circle({ + * style: { + * x: 100, + * y: 100, + * r: 20, + * } + * })); + * zr.add(g); + */ + + + var zrUtil = __webpack_require__(3); + var Element = __webpack_require__(30); + var BoundingRect = __webpack_require__(15); + + /** + * @alias module:zrender/graphic/Group + * @constructor + * @extends module:zrender/mixin/Transformable + * @extends module:zrender/mixin/Eventful + */ + var Group = function (opts) { + + opts = opts || {}; + + Element.call(this, opts); + + for (var key in opts) { + this[key] = opts[key]; + } + + this._children = []; + + this.__storage = null; + + this.__dirty = true; + }; + + Group.prototype = { + + constructor: Group, + + /** + * @type {string} + */ + type: 'group', + + /** + * @return {Array.} + */ + children: function () { + return this._children.slice(); + }, + + /** + * 获取指定 index 的儿子节点 + * @param {number} idx + * @return {module:zrender/Element} + */ + childAt: function (idx) { + return this._children[idx]; + }, + + /** + * 获取指定名字的儿子节点 + * @param {string} name + * @return {module:zrender/Element} + */ + childOfName: function (name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }, + + /** + * @return {number} + */ + childCount: function () { + return this._children.length; + }, + + /** + * 添加子节点到最后 + * @param {module:zrender/Element} child + */ + add: function (child) { + if (child && child !== this && child.parent !== this) { + + this._children.push(child); + + this._doAdd(child); + } + + return this; + }, + + /** + * 添加子节点在 nextSibling 之前 + * @param {module:zrender/Element} child + * @param {module:zrender/Element} nextSibling + */ + addBefore: function (child, nextSibling) { + if (child && child !== this && child.parent !== this + && nextSibling && nextSibling.parent === this) { + + var children = this._children; + var idx = children.indexOf(nextSibling); + + if (idx >= 0) { + children.splice(idx, 0, child); + this._doAdd(child); + } + } + + return this; + }, + + _doAdd: function (child) { + if (child.parent) { + child.parent.remove(child); + } + + child.parent = this; + + var storage = this.__storage; + var zr = this.__zr; + if (storage && storage !== child.__storage) { + + storage.addToMap(child); + + if (child instanceof Group) { + child.addChildrenToStorage(storage); + } + } + + zr && zr.refresh(); + }, + + /** + * 移除子节点 + * @param {module:zrender/Element} child + */ + remove: function (child) { + var zr = this.__zr; + var storage = this.__storage; + var children = this._children; + + var idx = zrUtil.indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + + child.parent = null; + + if (storage) { + + storage.delFromMap(child.id); + + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + + zr && zr.refresh(); + + return this; + }, + + /** + * 移除所有子节点 + */ + removeAll: function () { + var children = this._children; + var storage = this.__storage; + var child; + var i; + for (i = 0; i < children.length; i++) { + child = children[i]; + if (storage) { + storage.delFromMap(child.id); + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + child.parent = null; + } + children.length = 0; + + return this; + }, + + /** + * 遍历所有子节点 + * @param {Function} cb + * @param {} context + */ + eachChild: function (cb, context) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + cb.call(context, child, i); + } + return this; + }, + + /** + * 深度优先遍历所有子孙节点 + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + cb.call(context, child); + + if (child.type === 'group') { + child.traverse(cb, context); + } + } + return this; + }, + + addChildrenToStorage: function (storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.addToMap(child); + if (child instanceof Group) { + child.addChildrenToStorage(storage); + } + } + }, + + delChildrenFromStorage: function (storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.delFromMap(child.id); + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + }, + + dirty: function () { + this.__dirty = true; + this.__zr && this.__zr.refresh(); + return this; + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function (includeChildren) { + // TODO Caching + // TODO Transform + var rect = null; + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.ignore || child.invisible) { + continue; + } + + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + tmpRect.copy(childRect); + tmpRect.applyTransform(transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + } + }; + + zrUtil.inherits(Group, Element); + + module.exports = Group; + + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module zrender/Element + */ + + + var guid = __webpack_require__(31); + var Eventful = __webpack_require__(32); + var Transformable = __webpack_require__(33); + var Animatable = __webpack_require__(34); + var zrUtil = __webpack_require__(3); + + /** + * @alias module:zrender/Element + * @constructor + * @extends {module:zrender/mixin/Animatable} + * @extends {module:zrender/mixin/Transformable} + * @extends {module:zrender/mixin/Eventful} + */ + var Element = function (opts) { + + Transformable.call(this, opts); + Eventful.call(this, opts); + Animatable.call(this, opts); + + /** + * 画布元素ID + * @type {string} + */ + this.id = opts.id || guid(); + }; + + Element.prototype = { + + /** + * 元素类型 + * Element type + * @type {string} + */ + type: 'element', + + /** + * 元素名字 + * Element name + * @type {string} + */ + name: '', + + /** + * ZRender 实例对象,会在 element 添加到 zrender 实例中后自动赋值 + * ZRender instance will be assigned when element is associated with zrender + * @name module:/zrender/Element#__zr + * @type {module:zrender/ZRender} + */ + __zr: null, + + /** + * 图形是否忽略,为true时忽略图形的绘制以及事件触发 + * If ignore drawing and events of the element object + * @name module:/zrender/Element#ignore + * @type {boolean} + * @default false + */ + ignore: false, + + /** + * 用于裁剪的路径(shape),所有 Group 内的路径在绘制时都会被这个路径裁剪 + * 该路径会继承被裁减对象的变换 + * @type {module:zrender/graphic/Path} + * @see http://www.w3.org/TR/2dcontext/#clipping-region + * @readOnly + */ + clipPath: null, + + /** + * Drift element + * @param {number} dx dx on the global space + * @param {number} dy dy on the global space + */ + drift: function (dx, dy) { + switch (this.draggable) { + case 'horizontal': + dy = 0; + break; + case 'vertical': + dx = 0; + break; + } + + var m = this.transform; + if (!m) { + m = this.transform = [1, 0, 0, 1, 0, 0]; + } + m[4] += dx; + m[5] += dy; + + this.decomposeTransform(); + this.dirty(); + }, + + /** + * Hook before update + */ + beforeUpdate: function () {}, + /** + * Hook after update + */ + afterUpdate: function () {}, + /** + * Update each frame + */ + update: function () { + this.updateTransform(); + }, + + /** + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) {}, + + /** + * @protected + */ + attrKV: function (key, value) { + if (key === 'position' || key === 'scale' || key === 'origin') { + // Copy the array + if (value) { + var target = this[key]; + if (!target) { + target = this[key] = []; + } + target[0] = value[0]; + target[1] = value[1]; + } + } + else { + this[key] = value; + } + }, + + /** + * Hide the element + */ + hide: function () { + this.ignore = true; + this.__zr && this.__zr.refresh(); + }, + + /** + * Show the element + */ + show: function () { + this.ignore = false; + this.__zr && this.__zr.refresh(); + }, + + /** + * @param {string|Object} key + * @param {*} value + */ + attr: function (key, value) { + if (typeof key === 'string') { + this.attrKV(key, value); + } + else if (zrUtil.isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.attrKV(name, key[name]); + } + } + } + this.dirty(); + + return this; + }, + + /** + * @param {module:zrender/graphic/Path} clipPath + */ + setClipPath: function (clipPath) { + var zr = this.__zr; + if (zr) { + clipPath.addSelfToZr(zr); + } + + // Remove previous clip path + if (this.clipPath && this.clipPath !== clipPath) { + this.removeClipPath(); + } + + this.clipPath = clipPath; + clipPath.__zr = zr; + clipPath.__clipTarget = this; + + this.dirty(); + }, + + /** + */ + removeClipPath: function () { + var clipPath = this.clipPath; + if (clipPath) { + if (clipPath.__zr) { + clipPath.removeSelfFromZr(clipPath.__zr); + } + + clipPath.__zr = null; + clipPath.__clipTarget = null; + this.clipPath = null; + + this.dirty(); + } + }, + + /** + * Add self from zrender instance. + * Not recursively because it will be invoked when element added to storage. + * @param {module:zrender/ZRender} zr + */ + addSelfToZr: function (zr) { + this.__zr = zr; + // 添加动画 + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.addAnimator(animators[i]); + } + } + + if (this.clipPath) { + this.clipPath.addSelfToZr(zr); + } + }, + + /** + * Remove self from zrender instance. + * Not recursively because it will be invoked when element added to storage. + * @param {module:zrender/ZRender} zr + */ + removeSelfFromZr: function (zr) { + this.__zr = null; + // 移除动画 + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.removeAnimator(animators[i]); + } + } + + if (this.clipPath) { + this.clipPath.removeSelfFromZr(zr); + } + } + }; + + zrUtil.mixin(Element, Animatable); + zrUtil.mixin(Element, Transformable); + zrUtil.mixin(Element, Eventful); + + module.exports = Element; + + +/***/ }, +/* 31 */ +/***/ function(module, exports) { + + /** + * zrender: 生成唯一id + * + * @author errorrik (errorrik@gmail.com) + */ + + + var idStart = 0x0907; + + module.exports = function () { + return 'zr_' + (idStart++); + }; + + + +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 事件扩展 + * @module zrender/mixin/Eventful + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * pissang (https://www.github.com/pissang) + */ + + + var arrySlice = Array.prototype.slice; + var zrUtil = __webpack_require__(3); + var indexOf = zrUtil.indexOf; + + /** + * 事件分发器 + * @alias module:zrender/mixin/Eventful + * @constructor + */ + var Eventful = function () { + this._$handlers = {}; + }; + + Eventful.prototype = { + + constructor: Eventful, + + /** + * 单次触发绑定,trigger后销毁 + * + * @param {string} event 事件名 + * @param {Function} handler 响应函数 + * @param {Object} context + */ + one: function (event, handler, context) { + var _h = this._$handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + if (indexOf(_h[event], event) >= 0) { + return this; + } + + _h[event].push({ + h: handler, + one: true, + ctx: context || this + }); + + return this; + }, + + /** + * 绑定事件 + * @param {string} event 事件名 + * @param {Function} handler 事件处理函数 + * @param {Object} [context] + */ + on: function (event, handler, context) { + var _h = this._$handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + h: handler, + one: false, + ctx: context || this + }); + + return this; + }, + + /** + * 是否绑定了事件 + * @param {string} event + * @return {boolean} + */ + isSilent: function (event) { + var _h = this._$handlers; + return _h[event] && _h[event].length; + }, + + /** + * 解绑事件 + * @param {string} event 事件名 + * @param {Function} [handler] 事件处理函数 + */ + off: function (event, handler) { + var _h = this._$handlers; + + if (!event) { + this._$handlers = {}; + return this; + } + + if (handler) { + if (_h[event]) { + var newList = []; + for (var i = 0, l = _h[event].length; i < l; i++) { + if (_h[event][i]['h'] != handler) { + newList.push(_h[event][i]); + } + } + _h[event] = newList; + } + + if (_h[event] && _h[event].length === 0) { + delete _h[event]; + } + } + else { + delete _h[event]; + } + + return this; + }, + + /** + * 事件分发 + * + * @param {string} type 事件类型 + */ + trigger: function (type) { + if (this._$handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 3) { + args = arrySlice.call(args, 1); + } + + var _h = this._$handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(_h[i]['ctx']); + break; + case 2: + _h[i]['h'].call(_h[i]['ctx'], args[1]); + break; + case 3: + _h[i]['h'].call(_h[i]['ctx'], args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(_h[i]['ctx'], args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } + else { + i++; + } + } + } + + return this; + }, + + /** + * 带有context的事件分发, 最后一个参数是事件回调的context + * @param {string} type 事件类型 + */ + triggerWithContext: function (type) { + if (this._$handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 4) { + args = arrySlice.call(args, 1, args.length - 1); + } + var ctx = args[args.length - 1]; + + var _h = this._$handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(ctx); + break; + case 2: + _h[i]['h'].call(ctx, args[1]); + break; + case 3: + _h[i]['h'].call(ctx, args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(ctx, args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } + else { + i++; + } + } + } + + return this; + } + }; + + // 对象可以通过 onxxxx 绑定事件 + /** + * @event module:zrender/mixin/Eventful#onclick + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseover + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseout + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousemove + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousewheel + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousedown + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseup + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragstart + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragend + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragenter + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragleave + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragover + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondrop + * @type {Function} + * @default null + */ + + module.exports = Eventful; + + + +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 提供变换扩展 + * @module zrender/mixin/Transformable + * @author pissang (https://www.github.com/pissang) + */ + + + var matrix = __webpack_require__(17); + var vector = __webpack_require__(16); + var mIdentity = matrix.identity; + + var EPSILON = 5e-5; + + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + + /** + * @alias module:zrender/mixin/Transformable + * @constructor + */ + var Transformable = function (opts) { + opts = opts || {}; + // If there are no given position, rotation, scale + if (!opts.position) { + /** + * 平移 + * @type {Array.} + * @default [0, 0] + */ + this.position = [0, 0]; + } + if (opts.rotation == null) { + /** + * 旋转 + * @type {Array.} + * @default 0 + */ + this.rotation = 0; + } + if (!opts.scale) { + /** + * 缩放 + * @type {Array.} + * @default [1, 1] + */ + this.scale = [1, 1]; + } + /** + * 旋转和缩放的原点 + * @type {Array.} + * @default null + */ + this.origin = this.origin || null; + }; + + var transformableProto = Transformable.prototype; + transformableProto.transform = null; + + /** + * 判断是否需要有坐标变换 + * 如果有坐标变换, 则从position, rotation, scale以及父节点的transform计算出自身的transform矩阵 + */ + transformableProto.needLocalTransform = function () { + return isNotAroundZero(this.rotation) + || isNotAroundZero(this.position[0]) + || isNotAroundZero(this.position[1]) + || isNotAroundZero(this.scale[0] - 1) + || isNotAroundZero(this.scale[1] - 1); + }; + + transformableProto.updateTransform = function () { + var parent = this.parent; + var parentHasTransform = parent && parent.transform; + var needLocalTransform = this.needLocalTransform(); + + var m = this.transform; + if (!(needLocalTransform || parentHasTransform)) { + m && mIdentity(m); + return; + } + + m = m || matrix.create(); + + if (needLocalTransform) { + this.getLocalTransform(m); + } + else { + mIdentity(m); + } + + // 应用父节点变换 + if (parentHasTransform) { + if (needLocalTransform) { + matrix.mul(m, parent.transform, m); + } + else { + matrix.copy(m, parent.transform); + } + } + // 保存这个变换矩阵 + this.transform = m; + + this.invTransform = this.invTransform || matrix.create(); + matrix.invert(this.invTransform, m); + }; + + transformableProto.getLocalTransform = function (m) { + m = m || []; + mIdentity(m); + + var origin = this.origin; + + var scale = this.scale; + var rotation = this.rotation; + var position = this.position; + if (origin) { + // Translate to origin + m[4] -= origin[0]; + m[5] -= origin[1]; + } + matrix.scale(m, m, scale); + if (rotation) { + matrix.rotate(m, m, rotation); + } + if (origin) { + // Translate back from origin + m[4] += origin[0]; + m[5] += origin[1]; + } + + m[4] += position[0]; + m[5] += position[1]; + + return m; + }; + /** + * 将自己的transform应用到context上 + * @param {Context2D} ctx + */ + transformableProto.setTransform = function (ctx) { + var m = this.transform; + if (m) { + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + }; + + var tmpTransform = []; + + /** + * 分解`transform`矩阵到`position`, `rotation`, `scale` + */ + transformableProto.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + // Get local transform and decompose them to position, scale, rotation + matrix.mul(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + var position = this.position; + var scale = this.scale; + if (isNotAroundZero(sx - 1)) { + sx = Math.sqrt(sx); + } + if (isNotAroundZero(sy - 1)) { + sy = Math.sqrt(sy); + } + if (m[0] < 0) { + sx = -sx; + } + if (m[3] < 0) { + sy = -sy; + } + position[0] = m[4]; + position[1] = m[5]; + scale[0] = sx; + scale[1] = sy; + this.rotation = Math.atan2(-m[1] / sy, m[0] / sx); + }; + + /** + * 变换坐标位置到 shape 的局部坐标空间 + * @method + * @param {number} x + * @param {number} y + * @return {Array.} + */ + transformableProto.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + vector.applyTransform(v2, v2, invTransform); + } + return v2; + }; + + /** + * 变换局部坐标位置到全局坐标空间 + * @method + * @param {number} x + * @param {number} y + * @return {Array.} + */ + transformableProto.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + vector.applyTransform(v2, v2, transform); + } + return v2; + }; + + module.exports = Transformable; + + + +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module zrender/mixin/Animatable + */ + + + var Animator = __webpack_require__(35); + var util = __webpack_require__(3); + var isString = util.isString; + var isFunction = util.isFunction; + var isObject = util.isObject; + var log = __webpack_require__(39); + + /** + * @alias modue:zrender/mixin/Animatable + * @constructor + */ + var Animatable = function () { + + /** + * @type {Array.} + * @readOnly + */ + this.animators = []; + }; + + Animatable.prototype = { + + constructor: Animatable, + + /** + * 动画 + * + * @param {string} path 需要添加动画的属性获取路径,可以通过a.b.c来获取深层的属性 + * @param {boolean} [loop] 动画是否循环 + * @return {module:zrender/animation/Animator} + * @example: + * el.animate('style', false) + * .when(1000, {x: 10} ) + * .done(function(){ // Animation done }) + * .start() + */ + animate: function (path, loop) { + var target; + var animatingShape = false; + var el = this; + var zr = this.__zr; + if (path) { + var pathSplitted = path.split('.'); + var prop = el; + // If animating shape + animatingShape = pathSplitted[0] === 'shape'; + for (var i = 0, l = pathSplitted.length; i < l; i++) { + if (!prop) { + continue; + } + prop = prop[pathSplitted[i]]; + } + if (prop) { + target = prop; + } + } + else { + target = el; + } + + if (!target) { + log( + 'Property "' + + path + + '" is not existed in element ' + + el.id + ); + return; + } + + var animators = el.animators; + + var animator = new Animator(target, loop); + + animator.during(function (target) { + el.dirty(animatingShape); + }) + .done(function () { + // FIXME Animator will not be removed if use `Animator#stop` to stop animation + animators.splice(util.indexOf(animators, animator), 1); + }); + + animators.push(animator); + + // If animate after added to the zrender + if (zr) { + zr.animation.addAnimator(animator); + } + + return animator; + }, + + /** + * 停止动画 + * @param {boolean} forwardToLast If move to last frame before stop + */ + stopAnimation: function (forwardToLast) { + var animators = this.animators; + var len = animators.length; + for (var i = 0; i < len; i++) { + animators[i].stop(forwardToLast); + } + animators.length = 0; + + return this; + }, + + /** + * @param {Object} target + * @param {number} [time=500] Time in ms + * @param {string} [easing='linear'] + * @param {number} [delay=0] + * @param {Function} [callback] + * + * @example + * // Animate position + * el.animateTo({ + * position: [10, 10] + * }, function () { // done }) + * + * // Animate shape, style and position in 100ms, delayed 100ms, with cubicOut easing + * el.animateTo({ + * shape: { + * width: 500 + * }, + * style: { + * fill: 'red' + * } + * position: [10, 10] + * }, 100, 100, 'cubicOut', function () { // done }) + */ + // TODO Return animation key + animateTo: function (target, time, delay, easing, callback) { + // animateTo(target, time, easing, callback); + if (isString(delay)) { + callback = easing; + easing = delay; + delay = 0; + } + // animateTo(target, time, delay, callback); + else if (isFunction(easing)) { + callback = easing; + easing = 'linear'; + delay = 0; + } + // animateTo(target, time, callback); + else if (isFunction(delay)) { + callback = delay; + delay = 0; + } + // animateTo(target, callback) + else if (isFunction(time)) { + callback = time; + time = 500; + } + // animateTo(target) + else if (!time) { + time = 500; + } + // Stop all previous animations + this.stopAnimation(); + this._animateToShallow('', this, target, time, delay, easing, callback); + + // Animators may be removed immediately after start + // if there is nothing to animate + var animators = this.animators.slice(); + var count = animators.length; + function done() { + count--; + if (!count) { + callback && callback(); + } + } + + // No animators. This should be checked before animators[i].start(), + // because 'done' may be executed immediately if no need to animate. + if (!count) { + callback && callback(); + } + // Start after all animators created + // Incase any animator is done immediately when all animation properties are not changed + for (var i = 0; i < animators.length; i++) { + animators[i] + .done(done) + .start(easing); + } + }, + + /** + * @private + * @param {string} path='' + * @param {Object} source=this + * @param {Object} target + * @param {number} [time=500] + * @param {number} [delay=0] + * + * @example + * // Animate position + * el._animateToShallow({ + * position: [10, 10] + * }) + * + * // Animate shape, style and position in 100ms, delayed 100ms + * el._animateToShallow({ + * shape: { + * width: 500 + * }, + * style: { + * fill: 'red' + * } + * position: [10, 10] + * }, 100, 100) + */ + _animateToShallow: function (path, source, target, time, delay) { + var objShallow = {}; + var propertyCount = 0; + for (var name in target) { + if (source[name] != null) { + if (isObject(target[name]) && !util.isArrayLike(target[name])) { + this._animateToShallow( + path ? path + '.' + name : name, + source[name], + target[name], + time, + delay + ); + } + else { + objShallow[name] = target[name]; + propertyCount++; + } + } + else if (target[name] != null) { + // Attr directly if not has property + // FIXME, if some property not needed for element ? + if (!path) { + this.attr(name, target[name]); + } + else { // Shape or style + var props = {}; + props[path] = {}; + props[path][name] = target[name]; + this.attr(props); + } + } + } + + if (propertyCount > 0) { + this.animate(path, false) + .when(time == null ? 500 : time, objShallow) + .delay(delay || 0); + } + + return this; + } + }; + + module.exports = Animatable; + + +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/animation/Animator + */ + + + var Clip = __webpack_require__(36); + var color = __webpack_require__(38); + var util = __webpack_require__(3); + var isArrayLike = util.isArrayLike; + + var arraySlice = Array.prototype.slice; + + function defaultGetter(target, key) { + return target[key]; + } + + function defaultSetter(target, key, value) { + target[key] = value; + } + + /** + * @param {number} p0 + * @param {number} p1 + * @param {number} percent + * @return {number} + */ + function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + + /** + * @param {string} p0 + * @param {string} p1 + * @param {number} percent + * @return {string} + */ + function interpolateString(p0, p1, percent) { + return percent > 0.5 ? p1 : p0; + } + + /** + * @param {Array} p0 + * @param {Array} p1 + * @param {number} percent + * @param {Array} out + * @param {number} arrDim + */ + function interpolateArray(p0, p1, percent, out, arrDim) { + var len = p0.length; + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber(p0[i], p1[i], percent); + } + } + else { + var len2 = p0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber( + p0[i][j], p1[i][j], percent + ); + } + } + } + } + + function fillArr(arr0, arr1, arrDim) { + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len === arr1Len) { + return; + } + // FIXME Not work for TypedArray + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + // Cut the previous + arr0.length = arr1Len; + } + else { + // Fill the previous + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push( + arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]) + ); + } + } + } + + /** + * @param {Array} arr0 + * @param {Array} arr1 + * @param {number} arrDim + * @return {boolean} + */ + function isArraySame(arr0, arr1, arrDim) { + if (arr0 === arr1) { + return true; + } + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + if (arrDim === 1) { + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + } + else { + var len2 = arr0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + if (arr0[i][j] !== arr1[i][j]) { + return false; + } + } + } + } + return true; + } + + /** + * Catmull Rom interpolate array + * @param {Array} p0 + * @param {Array} p1 + * @param {Array} p2 + * @param {Array} p3 + * @param {number} t + * @param {number} t2 + * @param {number} t3 + * @param {Array} out + * @param {number} arrDim + */ + function catmullRomInterpolateArray( + p0, p1, p2, p3, t, t2, t3, out, arrDim + ) { + var len = p0.length; + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = catmullRomInterpolate( + p0[i], p1[i], p2[i], p3[i], t, t2, t3 + ); + } + } + else { + var len2 = p0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = catmullRomInterpolate( + p0[i][j], p1[i][j], p2[i][j], p3[i][j], + t, t2, t3 + ); + } + } + } + } + + /** + * Catmull Rom interpolate number + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @param {number} t2 + * @param {number} t3 + * @return {number} + */ + function catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; + } + + function cloneValue(value) { + if (isArrayLike(value)) { + var len = value.length; + if (isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } + + return arraySlice.call(value); + } + + return value; + } + + function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]); + rgba[1] = Math.floor(rgba[1]); + rgba[2] = Math.floor(rgba[2]); + + return 'rgba(' + rgba.join(',') + ')'; + } + + function createTrackClip (animator, easing, oneTrackDone, keyframes, propName) { + var getter = animator._getter; + var setter = animator._setter; + var useSpline = easing === 'spline'; + + var trackLen = keyframes.length; + if (!trackLen) { + return; + } + // Guess data type + var firstVal = keyframes[0].value; + var isValueArray = isArrayLike(firstVal); + var isValueColor = false; + var isValueString = false; + + // For vertices morphing + var arrDim = ( + isValueArray + && isArrayLike(firstVal[0]) + ) + ? 2 : 1; + var trackMaxTime; + // Sort keyframe as ascending + keyframes.sort(function(a, b) { + return a.time - b.time; + }); + + trackMaxTime = keyframes[trackLen - 1].time; + // Percents of each keyframe + var kfPercents = []; + // Value of each keyframe + var kfValues = []; + var prevValue = keyframes[0].value; + var isAllValueEqual = true; + for (var i = 0; i < trackLen; i++) { + kfPercents.push(keyframes[i].time / trackMaxTime); + // Assume value is a color when it is a string + var value = keyframes[i].value; + + // Check if value is equal, deep check if value is array + if (!((isValueArray && isArraySame(value, prevValue, arrDim)) + || (!isValueArray && value === prevValue))) { + isAllValueEqual = false; + } + prevValue = value; + + // Try converting a string to a color array + if (typeof value == 'string') { + var colorArray = color.parse(value); + if (colorArray) { + value = colorArray; + isValueColor = true; + } + else { + isValueString = true; + } + } + kfValues.push(value); + } + if (isAllValueEqual) { + return; + } + + if (isValueArray) { + var lastValue = kfValues[trackLen - 1]; + // Polyfill array + for (var i = 0; i < trackLen - 1; i++) { + fillArr(kfValues[i], lastValue, arrDim); + } + fillArr(getter(animator._target, propName), lastValue, arrDim); + } + + // Cache the key of last frame to speed up when + // animation playback is sequency + var lastFrame = 0; + var lastFramePercent = 0; + var start; + var w; + var p0; + var p1; + var p2; + var p3; + + if (isValueColor) { + var rgba = [0, 0, 0, 0]; + } + + var onframe = function (target, percent) { + // Find the range keyframes + // kf1-----kf2---------current--------kf3 + // find kf2 and kf3 and do interpolation + var frame; + if (percent < lastFramePercent) { + // Start from next key + start = Math.min(lastFrame + 1, trackLen - 1); + for (frame = start; frame >= 0; frame--) { + if (kfPercents[frame] <= percent) { + break; + } + } + frame = Math.min(frame, trackLen - 2); + } + else { + for (frame = lastFrame; frame < trackLen; frame++) { + if (kfPercents[frame] > percent) { + break; + } + } + frame = Math.min(frame - 1, trackLen - 2); + } + lastFrame = frame; + lastFramePercent = percent; + + var range = (kfPercents[frame + 1] - kfPercents[frame]); + if (range === 0) { + return; + } + else { + w = (percent - kfPercents[frame]) / range; + } + if (useSpline) { + p1 = kfValues[frame]; + p0 = kfValues[frame === 0 ? frame : frame - 1]; + p2 = kfValues[frame > trackLen - 2 ? trackLen - 1 : frame + 1]; + p3 = kfValues[frame > trackLen - 3 ? trackLen - 1 : frame + 2]; + if (isValueArray) { + catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + getter(target, propName), + arrDim + ); + } + else { + var value; + if (isValueColor) { + value = catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + rgba, 1 + ); + value = rgba2String(rgba); + } + else if (isValueString) { + // String is step(0.5) + return interpolateString(p1, p2, w); + } + else { + value = catmullRomInterpolate( + p0, p1, p2, p3, w, w * w, w * w * w + ); + } + setter( + target, + propName, + value + ); + } + } + else { + if (isValueArray) { + interpolateArray( + kfValues[frame], kfValues[frame + 1], w, + getter(target, propName), + arrDim + ); + } + else { + var value; + if (isValueColor) { + interpolateArray( + kfValues[frame], kfValues[frame + 1], w, + rgba, 1 + ); + value = rgba2String(rgba); + } + else if (isValueString) { + // String is step(0.5) + return interpolateString(kfValues[frame], kfValues[frame + 1], w); + } + else { + value = interpolateNumber(kfValues[frame], kfValues[frame + 1], w); + } + setter( + target, + propName, + value + ); + } + } + }; + + var clip = new Clip({ + target: animator._target, + life: trackMaxTime, + loop: animator._loop, + delay: animator._delay, + onframe: onframe, + ondestroy: oneTrackDone + }); + + if (easing && easing !== 'spline') { + clip.easing = easing; + } + + return clip; + } + + /** + * @alias module:zrender/animation/Animator + * @constructor + * @param {Object} target + * @param {boolean} loop + * @param {Function} getter + * @param {Function} setter + */ + var Animator = function(target, loop, getter, setter) { + this._tracks = {}; + this._target = target; + + this._loop = loop || false; + + this._getter = getter || defaultGetter; + this._setter = setter || defaultSetter; + + this._clipCount = 0; + + this._delay = 0; + + this._doneList = []; + + this._onframeList = []; + + this._clipList = []; + }; + + Animator.prototype = { + /** + * 设置动画关键帧 + * @param {number} time 关键帧时间,单位是ms + * @param {Object} props 关键帧的属性值,key-value表示 + * @return {module:zrender/animation/Animator} + */ + when: function(time /* ms */, props) { + var tracks = this._tracks; + for (var propName in props) { + if (!tracks[propName]) { + tracks[propName] = []; + // Invalid value + var value = this._getter(this._target, propName); + if (value == null) { + // zrLog('Invalid property ' + propName); + continue; + } + // If time is 0 + // Then props is given initialize value + // Else + // Initialize value from current prop value + if (time !== 0) { + tracks[propName].push({ + time: 0, + value: cloneValue(value) + }); + } + } + tracks[propName].push({ + time: time, + value: props[propName] + }); + } + return this; + }, + /** + * 添加动画每一帧的回调函数 + * @param {Function} callback + * @return {module:zrender/animation/Animator} + */ + during: function (callback) { + this._onframeList.push(callback); + return this; + }, + + _doneCallback: function () { + // Clear all tracks + this._tracks = {}; + // Clear all clips + this._clipList.length = 0; + + var doneList = this._doneList; + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + }, + /** + * 开始执行动画 + * @param {string|Function} easing + * 动画缓动函数,详见{@link module:zrender/animation/easing} + * @return {module:zrender/animation/Animator} + */ + start: function (easing) { + + var self = this; + var clipCount = 0; + + var oneTrackDone = function() { + clipCount--; + if (!clipCount) { + self._doneCallback(); + } + }; + + var lastClip; + for (var propName in this._tracks) { + var clip = createTrackClip( + this, easing, oneTrackDone, + this._tracks[propName], propName + ); + if (clip) { + this._clipList.push(clip); + clipCount++; + + // If start after added to animation + if (this.animation) { + this.animation.addClip(clip); + } + + lastClip = clip; + } + } + + // Add during callback on the last clip + if (lastClip) { + var oldOnFrame = lastClip.onframe; + lastClip.onframe = function (target, percent) { + oldOnFrame(target, percent); + + for (var i = 0; i < self._onframeList.length; i++) { + self._onframeList[i](target, percent); + } + }; + } + + if (!clipCount) { + this._doneCallback(); + } + return this; + }, + /** + * 停止动画 + * @param {boolean} forwardToLast If move to last frame before stop + */ + stop: function (forwardToLast) { + var clipList = this._clipList; + var animation = this.animation; + for (var i = 0; i < clipList.length; i++) { + var clip = clipList[i]; + if (forwardToLast) { + // Move to last frame before stop + clip.onframe(this._target, 1); + } + animation && animation.removeClip(clip); + } + clipList.length = 0; + }, + /** + * 设置动画延迟开始的时间 + * @param {number} time 单位ms + * @return {module:zrender/animation/Animator} + */ + delay: function (time) { + this._delay = time; + return this; + }, + /** + * 添加动画结束的回调 + * @param {Function} cb + * @return {module:zrender/animation/Animator} + */ + done: function(cb) { + if (cb) { + this._doneList.push(cb); + } + return this; + }, + + /** + * @return {Array.} + */ + getClips: function () { + return this._clipList; + } + }; + + module.exports = Animator; + + +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 动画主控制器 + * @config target 动画对象,可以是数组,如果是数组的话会批量分发onframe等事件 + * @config life(1000) 动画时长 + * @config delay(0) 动画延迟时间 + * @config loop(true) + * @config gap(0) 循环的间隔时间 + * @config onframe + * @config easing(optional) + * @config ondestroy(optional) + * @config onrestart(optional) + * + * TODO pause + */ + + + var easingFuncs = __webpack_require__(37); + + function Clip(options) { + + this._target = options.target; + + // 生命周期 + this._life = options.life || 1000; + // 延时 + this._delay = options.delay || 0; + // 开始时间 + // this._startTime = new Date().getTime() + this._delay;// 单位毫秒 + this._initialized = false; + + // 是否循环 + this.loop = options.loop == null ? false : options.loop; + + this.gap = options.gap || 0; + + this.easing = options.easing || 'Linear'; + + this.onframe = options.onframe; + this.ondestroy = options.ondestroy; + this.onrestart = options.onrestart; + } + + Clip.prototype = { + + constructor: Clip, + + step: function (time) { + // Set startTime on first step, or _startTime may has milleseconds different between clips + // PENDING + if (!this._initialized) { + this._startTime = new Date().getTime() + this._delay; + this._initialized = true; + } + + var percent = (time - this._startTime) / this._life; + + // 还没开始 + if (percent < 0) { + return; + } + + percent = Math.min(percent, 1); + + var easing = this.easing; + var easingFunc = typeof easing == 'string' ? easingFuncs[easing] : easing; + var schedule = typeof easingFunc === 'function' + ? easingFunc(percent) + : percent; + + this.fire('frame', schedule); + + // 结束 + if (percent == 1) { + if (this.loop) { + this.restart(); + // 重新开始周期 + // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件 + return 'restart'; + } + + // 动画完成将这个控制器标识为待删除 + // 在Animation.update中进行批量删除 + this._needsRemove = true; + return 'destroy'; + } + + return null; + }, + + restart: function() { + var time = new Date().getTime(); + var remainder = (time - this._startTime) % this._life; + this._startTime = new Date().getTime() - remainder + this.gap; + + this._needsRemove = false; + }, + + fire: function(eventType, arg) { + eventType = 'on' + eventType; + if (this[eventType]) { + this[eventType](this._target, arg); + } + } + }; + + module.exports = Clip; + + + +/***/ }, +/* 37 */ +/***/ function(module, exports) { + + /** + * 缓动代码来自 https://github.com/sole/tween.js/blob/master/src/Tween.js + * @see http://sole.github.io/tween.js/examples/03_graphs.html + * @exports zrender/animation/easing + */ + + var easing = { + /** + * @param {number} k + * @return {number} + */ + linear: function (k) { + return k; + }, + + /** + * @param {number} k + * @return {number} + */ + quadraticIn: function (k) { + return k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quadraticOut: function (k) { + return k * (2 - k); + }, + /** + * @param {number} k + * @return {number} + */ + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + + // 三次方的缓动(t^3) + /** + * @param {number} k + * @return {number} + */ + cubicIn: function (k) { + return k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + cubicOut: function (k) { + return --k * k * k + 1; + }, + /** + * @param {number} k + * @return {number} + */ + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + + // 四次方的缓动(t^4) + /** + * @param {number} k + * @return {number} + */ + quarticIn: function (k) { + return k * k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + /** + * @param {number} k + * @return {number} + */ + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + + // 五次方的缓动(t^5) + /** + * @param {number} k + * @return {number} + */ + quinticIn: function (k) { + return k * k * k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + /** + * @param {number} k + * @return {number} + */ + quinticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }, + + // 正弦曲线的缓动(sin(t)) + /** + * @param {number} k + * @return {number} + */ + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + /** + * @param {number} k + * @return {number} + */ + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + /** + * @param {number} k + * @return {number} + */ + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + + // 指数曲线的缓动(2^t) + /** + * @param {number} k + * @return {number} + */ + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + /** + * @param {number} k + * @return {number} + */ + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + /** + * @param {number} k + * @return {number} + */ + exponentialInOut: function (k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }, + + // 圆形曲线的缓动(sqrt(1-t^2)) + /** + * @param {number} k + * @return {number} + */ + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + /** + * @param {number} k + * @return {number} + */ + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + /** + * @param {number} k + * @return {number} + */ + circularInOut: function (k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }, + + // 创建类似于弹簧在停止前来回振荡的动画 + /** + * @param {number} k + * @return {number} + */ + elasticIn: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) * + Math.sin((k - s) * (2 * Math.PI) / p)); + }, + /** + * @param {number} k + * @return {number} + */ + elasticOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) * + Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }, + /** + * @param {number} k + * @return {number} + */ + elasticInOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + + }, + + // 在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动 + /** + * @param {number} k + * @return {number} + */ + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + /** + * @param {number} k + * @return {number} + */ + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + /** + * @param {number} k + * @return {number} + */ + backInOut: function (k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }, + + // 创建弹跳效果 + /** + * @param {number} k + * @return {number} + */ + bounceIn: function (k) { + return 1 - easing.bounceOut(1 - k); + }, + /** + * @param {number} k + * @return {number} + */ + bounceOut: function (k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } + else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } + else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } + else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }, + /** + * @param {number} k + * @return {number} + */ + bounceInOut: function (k) { + if (k < 0.5) { + return easing.bounceIn(k * 2) * 0.5; + } + return easing.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } + }; + + module.exports = easing; + + + + +/***/ }, +/* 38 */ +/***/ function(module, exports) { + + /** + * @module zrender/tool/color + */ + + + var kCSSColorTable = { + 'transparent': [0,0,0,0], 'aliceblue': [240,248,255,1], + 'antiquewhite': [250,235,215,1], 'aqua': [0,255,255,1], + 'aquamarine': [127,255,212,1], 'azure': [240,255,255,1], + 'beige': [245,245,220,1], 'bisque': [255,228,196,1], + 'black': [0,0,0,1], 'blanchedalmond': [255,235,205,1], + 'blue': [0,0,255,1], 'blueviolet': [138,43,226,1], + 'brown': [165,42,42,1], 'burlywood': [222,184,135,1], + 'cadetblue': [95,158,160,1], 'chartreuse': [127,255,0,1], + 'chocolate': [210,105,30,1], 'coral': [255,127,80,1], + 'cornflowerblue': [100,149,237,1], 'cornsilk': [255,248,220,1], + 'crimson': [220,20,60,1], 'cyan': [0,255,255,1], + 'darkblue': [0,0,139,1], 'darkcyan': [0,139,139,1], + 'darkgoldenrod': [184,134,11,1], 'darkgray': [169,169,169,1], + 'darkgreen': [0,100,0,1], 'darkgrey': [169,169,169,1], + 'darkkhaki': [189,183,107,1], 'darkmagenta': [139,0,139,1], + 'darkolivegreen': [85,107,47,1], 'darkorange': [255,140,0,1], + 'darkorchid': [153,50,204,1], 'darkred': [139,0,0,1], + 'darksalmon': [233,150,122,1], 'darkseagreen': [143,188,143,1], + 'darkslateblue': [72,61,139,1], 'darkslategray': [47,79,79,1], + 'darkslategrey': [47,79,79,1], 'darkturquoise': [0,206,209,1], + 'darkviolet': [148,0,211,1], 'deeppink': [255,20,147,1], + 'deepskyblue': [0,191,255,1], 'dimgray': [105,105,105,1], + 'dimgrey': [105,105,105,1], 'dodgerblue': [30,144,255,1], + 'firebrick': [178,34,34,1], 'floralwhite': [255,250,240,1], + 'forestgreen': [34,139,34,1], 'fuchsia': [255,0,255,1], + 'gainsboro': [220,220,220,1], 'ghostwhite': [248,248,255,1], + 'gold': [255,215,0,1], 'goldenrod': [218,165,32,1], + 'gray': [128,128,128,1], 'green': [0,128,0,1], + 'greenyellow': [173,255,47,1], 'grey': [128,128,128,1], + 'honeydew': [240,255,240,1], 'hotpink': [255,105,180,1], + 'indianred': [205,92,92,1], 'indigo': [75,0,130,1], + 'ivory': [255,255,240,1], 'khaki': [240,230,140,1], + 'lavender': [230,230,250,1], 'lavenderblush': [255,240,245,1], + 'lawngreen': [124,252,0,1], 'lemonchiffon': [255,250,205,1], + 'lightblue': [173,216,230,1], 'lightcoral': [240,128,128,1], + 'lightcyan': [224,255,255,1], 'lightgoldenrodyellow': [250,250,210,1], + 'lightgray': [211,211,211,1], 'lightgreen': [144,238,144,1], + 'lightgrey': [211,211,211,1], 'lightpink': [255,182,193,1], + 'lightsalmon': [255,160,122,1], 'lightseagreen': [32,178,170,1], + 'lightskyblue': [135,206,250,1], 'lightslategray': [119,136,153,1], + 'lightslategrey': [119,136,153,1], 'lightsteelblue': [176,196,222,1], + 'lightyellow': [255,255,224,1], 'lime': [0,255,0,1], + 'limegreen': [50,205,50,1], 'linen': [250,240,230,1], + 'magenta': [255,0,255,1], 'maroon': [128,0,0,1], + 'mediumaquamarine': [102,205,170,1], 'mediumblue': [0,0,205,1], + 'mediumorchid': [186,85,211,1], 'mediumpurple': [147,112,219,1], + 'mediumseagreen': [60,179,113,1], 'mediumslateblue': [123,104,238,1], + 'mediumspringgreen': [0,250,154,1], 'mediumturquoise': [72,209,204,1], + 'mediumvioletred': [199,21,133,1], 'midnightblue': [25,25,112,1], + 'mintcream': [245,255,250,1], 'mistyrose': [255,228,225,1], + 'moccasin': [255,228,181,1], 'navajowhite': [255,222,173,1], + 'navy': [0,0,128,1], 'oldlace': [253,245,230,1], + 'olive': [128,128,0,1], 'olivedrab': [107,142,35,1], + 'orange': [255,165,0,1], 'orangered': [255,69,0,1], + 'orchid': [218,112,214,1], 'palegoldenrod': [238,232,170,1], + 'palegreen': [152,251,152,1], 'paleturquoise': [175,238,238,1], + 'palevioletred': [219,112,147,1], 'papayawhip': [255,239,213,1], + 'peachpuff': [255,218,185,1], 'peru': [205,133,63,1], + 'pink': [255,192,203,1], 'plum': [221,160,221,1], + 'powderblue': [176,224,230,1], 'purple': [128,0,128,1], + 'red': [255,0,0,1], 'rosybrown': [188,143,143,1], + 'royalblue': [65,105,225,1], 'saddlebrown': [139,69,19,1], + 'salmon': [250,128,114,1], 'sandybrown': [244,164,96,1], + 'seagreen': [46,139,87,1], 'seashell': [255,245,238,1], + 'sienna': [160,82,45,1], 'silver': [192,192,192,1], + 'skyblue': [135,206,235,1], 'slateblue': [106,90,205,1], + 'slategray': [112,128,144,1], 'slategrey': [112,128,144,1], + 'snow': [255,250,250,1], 'springgreen': [0,255,127,1], + 'steelblue': [70,130,180,1], 'tan': [210,180,140,1], + 'teal': [0,128,128,1], 'thistle': [216,191,216,1], + 'tomato': [255,99,71,1], 'turquoise': [64,224,208,1], + 'violet': [238,130,238,1], 'wheat': [245,222,179,1], + 'white': [255,255,255,1], 'whitesmoke': [245,245,245,1], + 'yellow': [255,255,0,1], 'yellowgreen': [154,205,50,1] + }; + + function clampCssByte(i) { // Clamp to integer 0 .. 255. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 255 ? 255 : i; + } + + function clampCssAngle(i) { // Clamp to integer 0 .. 360. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 360 ? 360 : i; + } + + function clampCssFloat(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; + } + + function parseCssInt(str) { // int or percentage. + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); + } + + function parseCssFloat(str) { // float or percentage. + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssFloat(parseFloat(str) / 100); + } + return clampCssFloat(parseFloat(str)); + } + + function cssHueToRgb(m1, m2, h) { + if (h < 0) { + h += 1; + } + else if (h > 1) { + h -= 1; + } + + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2/3 - h) * 6; + } + return m1; + } + + function lerp(a, b, p) { + return a + (b - a) * p; + } + + /** + * @param {string} colorStr + * @return {Array.} + * @memberOf module:zrender/util/color + */ + function parse(colorStr) { + if (!colorStr) { + return; + } + // colorStr may be not string + colorStr = colorStr + ''; + // Remove all whitespace, not compliant, but should just be more accepting. + var str = colorStr.replace(/ /g, '').toLowerCase(); + + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) { + return kCSSColorTable[str].slice(); // dup. + } + + // #abc and #abc123 syntax. + if (str.charAt(0) === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xfff)) { + return; // Covers NaN. + } + return [ + ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), + (iv & 0xf0) | ((iv & 0xf0) >> 4), + (iv & 0xf) | ((iv & 0xf) << 4), + 1 + ]; + } + else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xffffff)) { + return; // Covers NaN. + } + return [ + (iv & 0xff0000) >> 16, + (iv & 0xff00) >> 8, + iv & 0xff, + 1 + ]; + } + + return; + } + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; // To allow case fallthrough. + switch (fname) { + case 'rgba': + if (params.length !== 4) { + return; + } + alpha = parseCssFloat(params.pop()); // jshint ignore:line + // Fall through. + case 'rgb': + if (params.length !== 3) { + return; + } + return [ + parseCssInt(params[0]), + parseCssInt(params[1]), + parseCssInt(params[2]), + alpha + ]; + case 'hsla': + if (params.length !== 4) { + return; + } + params[3] = parseCssFloat(params[3]); + return hsla2rgba(params); + case 'hsl': + if (params.length !== 3) { + return; + } + return hsla2rgba(params); + default: + return; + } + } + + return; + } + + /** + * @param {Array.} hsla + * @return {Array.} rgba + */ + function hsla2rgba(hsla) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; // 0 .. 1 + // NOTE(deanm): According to the CSS spec s/l should only be + // percentages, but we don't bother and let float or percentage. + var s = parseCssFloat(hsla[1]); + var l = parseCssFloat(hsla[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + + var rgba = [ + clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), + clampCssByte(cssHueToRgb(m1, m2, h) * 255), + clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255) + ]; + + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + + return rgba; + } + + /** + * @param {Array.} rgba + * @return {Array.} hsla + */ + function rgba2hsla(rgba) { + if (!rgba) { + return; + } + + // RGB from 0 to 255 + var R = rgba[0] / 255; + var G = rgba[1] / 255; + var B = rgba[2] / 255; + + var vMin = Math.min(R, G, B); // Min. value of RGB + var vMax = Math.max(R, G, B); // Max. value of RGB + var delta = vMax - vMin; // Delta RGB value + + var L = (vMax + vMin) / 2; + var H; + var S; + // HSL results from 0 to 1 + if (delta === 0) { + H = 0; + S = 0; + } + else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } + else { + S = delta / (2 - vMax - vMin); + } + + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + + if (R === vMax) { + H = deltaB - deltaG; + } + else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } + else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + + if (H < 0) { + H += 1; + } + + if (H > 1) { + H -= 1; + } + } + + var hsla = [H * 360, S, L]; + + if (rgba[3] != null) { + hsla.push(rgba[3]); + } + + return hsla; + } + + /** + * @param {string} color + * @param {number} level + * @return {string} + * @memberOf module:zrender/util/color + */ + function lift(color, level) { + var colorArr = parse(color); + if (colorArr) { + for (var i = 0; i < 3; i++) { + if (level < 0) { + colorArr[i] = colorArr[i] * (1 - level) | 0; + } + else { + colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } + } + + /** + * @param {string} color + * @return {string} + * @memberOf module:zrender/util/color + */ + function toHex(color, level) { + var colorArr = parse(color); + if (colorArr) { + return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1); + } + } + + /** + * Map value to color. Faster than mapToColor methods because color is represented by rgba array + * @param {number} normalizedValue A float between 0 and 1. + * @param {Array.>} colors List of rgba color array + * @param {Array.} [out] Mapped gba color array + * @return {Array.} + */ + function fastMapToColor(normalizedValue, colors, out) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1) + ) { + return; + } + out = out || [0, 0, 0, 0]; + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = colors[leftIndex]; + var rightColor = colors[rightIndex]; + var dv = value - leftIndex; + out[0] = clampCssByte(lerp(leftColor[0], rightColor[0], dv)); + out[1] = clampCssByte(lerp(leftColor[1], rightColor[1], dv)); + out[2] = clampCssByte(lerp(leftColor[2], rightColor[2], dv)); + out[3] = clampCssByte(lerp(leftColor[3], rightColor[3], dv)); + return out; + } + /** + * @param {number} normalizedValue A float between 0 and 1. + * @param {Array.} colors Color list. + * @param {boolean=} fullOutput Default false. + * @return {(string|Object)} Result color. If fullOutput, + * return {color: ..., leftIndex: ..., rightIndex: ..., value: ...}, + * @memberOf module:zrender/util/color + */ + function mapToColor(normalizedValue, colors, fullOutput) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1) + ) { + return; + } + + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = parse(colors[leftIndex]); + var rightColor = parse(colors[rightIndex]); + var dv = value - leftIndex; + + var color = stringify( + [ + clampCssByte(lerp(leftColor[0], rightColor[0], dv)), + clampCssByte(lerp(leftColor[1], rightColor[1], dv)), + clampCssByte(lerp(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerp(leftColor[3], rightColor[3], dv)) + ], + 'rgba' + ); + + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; + } + + /** + * @param {Array} interval Array length === 2, + * each item is normalized value ([0, 1]). + * @param {Array.} colors Color list. + * @return {Array.} colors corresponding to the interval, + * each item is {color: 'xxx', offset: ...} + * where offset is between 0 and 1. + * @memberOf module:zrender/util/color + */ + function mapIntervalToColor(interval, colors) { + if (interval.length !== 2 || interval[1] < interval[0]) { + return; + } + + var info0 = mapToColor(interval[0], colors, true); + var info1 = mapToColor(interval[1], colors, true); + + var result = [{color: info0.color, offset: 0}]; + + var during = info1.value - info0.value; + var start = Math.max(info0.value, info0.rightIndex); + var end = Math.min(info1.value, info1.leftIndex); + + for (var i = start; during > 0 && i <= end; i++) { + result.push({ + color: colors[i], + offset: (i - info0.value) / during + }); + } + result.push({color: info1.color, offset: 1}); + + return result; + } + + /** + * @param {string} color + * @param {number=} h 0 ~ 360, ignore when null. + * @param {number=} s 0 ~ 1, ignore when null. + * @param {number=} l 0 ~ 1, ignore when null. + * @return {string} Color string in rgba format. + * @memberOf module:zrender/util/color + */ + function modifyHSL(color, h, s, l) { + color = parse(color); + + if (color) { + color = rgba2hsla(color); + h != null && (color[0] = clampCssAngle(h)); + s != null && (color[1] = parseCssFloat(s)); + l != null && (color[2] = parseCssFloat(l)); + + return stringify(hsla2rgba(color), 'rgba'); + } + } + + /** + * @param {string} color + * @param {number=} alpha 0 ~ 1 + * @return {string} Color string in rgba format. + * @memberOf module:zrender/util/color + */ + function modifyAlpha(color, alpha) { + color = parse(color); + + if (color && alpha != null) { + color[3] = clampCssFloat(alpha); + return stringify(color, 'rgba'); + } + } + + /** + * @param {Array.} colors Color list. + * @param {string} type 'rgba', 'hsva', ... + * @return {string} Result color. + */ + function stringify(arrColor, type) { + if (type === 'rgb' || type === 'hsv' || type === 'hsl') { + arrColor = arrColor.slice(0, 3); + } + return type + '(' + arrColor.join(',') + ')'; + } + + module.exports = { + parse: parse, + lift: lift, + toHex: toHex, + fastMapToColor: fastMapToColor, + mapToColor: mapToColor, + mapIntervalToColor: mapIntervalToColor, + modifyHSL: modifyHSL, + modifyAlpha: modifyAlpha, + stringify: stringify + }; + + + + +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { + + + var config = __webpack_require__(40); + + /** + * @exports zrender/tool/log + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + module.exports = function() { + if (config.debugMode === 0) { + return; + } + else if (config.debugMode == 1) { + for (var k in arguments) { + throw new Error(arguments[k]); + } + } + else if (config.debugMode > 1) { + for (var k in arguments) { + console.log(arguments[k]); + } + } + }; + + /* for debug + return function(mes) { + document.getElementById('wrong-message').innerHTML = + mes + ' ' + (new Date() - 0) + + '
            ' + + document.getElementById('wrong-message').innerHTML; + }; + */ + + + +/***/ }, +/* 40 */ +/***/ function(module, exports) { + + + var dpr = 1; + // If in browser environment + if (typeof window !== 'undefined') { + dpr = Math.max(window.devicePixelRatio || 1, 1); + } + /** + * config默认配置项 + * @exports zrender/config + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + var config = { + /** + * debug日志选项:catchBrushException为true下有效 + * 0 : 不生成debug数据,发布用 + * 1 : 异常抛出,调试用 + * 2 : 控制台输出,调试用 + */ + debugMode: 0, + + // retina 屏幕优化 + devicePixelRatio: dpr + }; + module.exports = config; + + + + +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Group = __webpack_require__(29); + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + + function Chart() { + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = componentUtil.getUID('viewChart'); + } + + Chart.prototype = { + + type: 'chart', + + /** + * Init the chart + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + init: function (ecModel, api) {}, + + /** + * Render the chart + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + render: function (seriesModel, ecModel, api, payload) {}, + + /** + * Highlight series or specified data item + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + highlight: function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'emphasis'); + }, + + /** + * Downplay series or specified data item + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + downplay: function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'normal'); + }, + + /** + * Remove self + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + remove: function (ecModel, api) { + this.group.removeAll(); + }, + + /** + * Dispose self + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + dispose: function () {} + }; + + var chartProto = Chart.prototype; + chartProto.updateView + = chartProto.updateLayout + = chartProto.updateVisual + = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + + /** + * Set state of single element + * @param {module:zrender/Element} el + * @param {string} state + */ + function elSetState(el, state) { + if (el) { + el.trigger(state); + if (el.type === 'group') { + for (var i = 0; i < el.childCount(); i++) { + elSetState(el.childAt(i), state); + } + } + } + } + /** + * @param {module:echarts/data/List} data + * @param {Object} payload + * @param {string} state 'normal'|'emphasis' + * @inner + */ + function toggleHighlight(data, payload, state) { + if (payload.dataIndex != null) { + var el = data.getItemGraphicEl(payload.dataIndex); + elSetState(el, state); + } + else if (payload.name) { + var dataIndex = data.indexOfName(payload.name); + var el = data.getItemGraphicEl(dataIndex); + elSetState(el, state); + } + else { + data.eachItemGraphicEl(function (el) { + elSetState(el, state); + }); + } + } + + // Enable Chart.extend. + clazzUtil.enableClassExtend(Chart); + + // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true}); + + module.exports = Chart; + + +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var pathTool = __webpack_require__(43); + var round = Math.round; + var Path = __webpack_require__(44); + var colorTool = __webpack_require__(38); + var matrix = __webpack_require__(17); + var vector = __webpack_require__(16); + var Gradient = __webpack_require__(4); + + var graphic = {}; + + graphic.Group = __webpack_require__(29); + + graphic.Image = __webpack_require__(59); + + graphic.Text = __webpack_require__(62); + + graphic.Circle = __webpack_require__(63); + + graphic.Sector = __webpack_require__(64); + + graphic.Ring = __webpack_require__(65); + + graphic.Polygon = __webpack_require__(66); + + graphic.Polyline = __webpack_require__(70); + + graphic.Rect = __webpack_require__(71); + + graphic.Line = __webpack_require__(72); + + graphic.BezierCurve = __webpack_require__(73); + + graphic.Arc = __webpack_require__(74); + + graphic.LinearGradient = __webpack_require__(75); + + graphic.RadialGradient = __webpack_require__(76); + + graphic.BoundingRect = __webpack_require__(15); + + /** + * Extend shape with parameters + */ + graphic.extendShape = function (opts) { + return Path.extend(opts); + }; + + /** + * Extend path + */ + graphic.extendPath = function (pathData, opts) { + return pathTool.extendFromString(pathData, opts); + }; + + /** + * Create a path element from path data string + * @param {string} pathData + * @param {Object} opts + * @param {module:zrender/core/BoundingRect} rect + * @param {string} [layout=cover] 'center' or 'cover' + */ + graphic.makePath = function (pathData, opts, rect, layout) { + var path = pathTool.createFromString(pathData, opts); + var boundingRect = path.getBoundingRect(); + if (rect) { + var aspect = boundingRect.width / boundingRect.height; + + if (layout === 'center') { + // Set rect to center, keep width / height ratio. + var width = rect.height * aspect; + var height; + if (width <= rect.width) { + height = rect.height; + } + else { + width = rect.width; + height = width / aspect; + } + var cx = rect.x + rect.width / 2; + var cy = rect.y + rect.height / 2; + + rect.x = cx - width / 2; + rect.y = cy - height / 2; + rect.width = width; + rect.height = height; + } + + this.resizePath(path, rect); + } + return path; + }; + + graphic.mergePath = pathTool.mergePath, + + /** + * Resize a path to fit the rect + * @param {module:zrender/graphic/Path} path + * @param {Object} rect + */ + graphic.resizePath = function (path, rect) { + if (!path.applyTransform) { + return; + } + + var pathRect = path.getBoundingRect(); + + var m = pathRect.calculateTransform(rect); + + path.applyTransform(m); + }; + + /** + * Sub pixel optimize line for canvas + * + * @param {Object} param + * @param {Object} [param.shape] + * @param {number} [param.shape.x1] + * @param {number} [param.shape.y1] + * @param {number} [param.shape.x2] + * @param {number} [param.shape.y2] + * @param {Object} [param.style] + * @param {number} [param.style.lineWidth] + * @return {Object} Modified param + */ + graphic.subPixelOptimizeLine = function (param) { + var subPixelOptimize = graphic.subPixelOptimize; + var shape = param.shape; + var lineWidth = param.style.lineWidth; + + if (round(shape.x1 * 2) === round(shape.x2 * 2)) { + shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true); + } + if (round(shape.y1 * 2) === round(shape.y2 * 2)) { + shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true); + } + return param; + }; + + /** + * Sub pixel optimize rect for canvas + * + * @param {Object} param + * @param {Object} [param.shape] + * @param {number} [param.shape.x] + * @param {number} [param.shape.y] + * @param {number} [param.shape.width] + * @param {number} [param.shape.height] + * @param {Object} [param.style] + * @param {number} [param.style.lineWidth] + * @return {Object} Modified param + */ + graphic.subPixelOptimizeRect = function (param) { + var subPixelOptimize = graphic.subPixelOptimize; + var shape = param.shape; + var lineWidth = param.style.lineWidth; + var originX = shape.x; + var originY = shape.y; + var originWidth = shape.width; + var originHeight = shape.height; + shape.x = subPixelOptimize(shape.x, lineWidth, true); + shape.y = subPixelOptimize(shape.y, lineWidth, true); + shape.width = Math.max( + subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x, + originWidth === 0 ? 0 : 1 + ); + shape.height = Math.max( + subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y, + originHeight === 0 ? 0 : 1 + ); + return param; + }; + + /** + * Sub pixel optimize for canvas + * + * @param {number} position Coordinate, such as x, y + * @param {number} lineWidth Should be nonnegative integer. + * @param {boolean=} positiveOrNegative Default false (negative). + * @return {number} Optimized position. + */ + graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) { + // Assure that (position + lineWidth / 2) is near integer edge, + // otherwise line will be fuzzy in canvas. + var doubledPosition = round(position * 2); + return (doubledPosition + round(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; + }; + + /** + * @private + */ + function doSingleEnterHover(el) { + if (el.__isHover) { + return; + } + if (el.__hoverStlDirty) { + var stroke = el.style.stroke; + var fill = el.style.fill; + + // Create hoverStyle on mouseover + var hoverStyle = el.__hoverStl; + var lift = colorTool.lift; + hoverStyle.fill = hoverStyle.fill + || (fill && (fill instanceof Gradient ? fill : lift(fill, -0.1))); + hoverStyle.stroke = hoverStyle.stroke + || (stroke && (stroke instanceof Gradient ? stroke : lift(stroke, -0.1))); + + var normalStyle = {}; + for (var name in hoverStyle) { + if (hoverStyle.hasOwnProperty(name)) { + normalStyle[name] = el.style[name]; + } + } + + el.__normalStl = normalStyle; + + el.__hoverStlDirty = false; + } + el.setStyle(el.__hoverStl); + el.z2 += 1; + + el.__isHover = true; + } + + /** + * @inner + */ + function doSingleLeaveHover(el) { + if (!el.__isHover) { + return; + } + + var normalStl = el.__normalStl; + normalStl && el.setStyle(normalStl); + el.z2 -= 1; + + el.__isHover = false; + } + + /** + * @inner + */ + function doEnterHover(el) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + doSingleEnterHover(child); + } + }) + : doSingleEnterHover(el); + } + + function doLeaveHover(el) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + doSingleLeaveHover(child); + } + }) + : doSingleLeaveHover(el); + } + + /** + * @inner + */ + function setElementHoverStl(el, hoverStl) { + // If element has sepcified hoverStyle, then use it instead of given hoverStyle + // Often used when item group has a label element and it's hoverStyle is different + el.__hoverStl = el.hoverStyle || hoverStl || {}; + el.__hoverStlDirty = true; + } + + /** + * @inner + */ + function onElementMouseOver() { + // Only if element is not in emphasis status + !this.__isEmphasis && doEnterHover(this); + } + + /** + * @inner + */ + function onElementMouseOut() { + // Only if element is not in emphasis status + !this.__isEmphasis && doLeaveHover(this); + } + + /** + * @inner + */ + function enterEmphasis() { + this.__isEmphasis = true; + doEnterHover(this); + } + + /** + * @inner + */ + function leaveEmphasis() { + this.__isEmphasis = false; + doLeaveHover(this); + } + + /** + * Set hover style of element + * @param {module:zrender/Element} el + * @param {Object} [hoverStyle] + */ + graphic.setHoverStyle = function (el, hoverStyle) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + setElementHoverStl(child, hoverStyle); + } + }) + : setElementHoverStl(el, hoverStyle); + // Remove previous bound handlers + el.on('mouseover', onElementMouseOver) + .on('mouseout', onElementMouseOut); + + // Emphasis, normal can be triggered manually + el.on('emphasis', enterEmphasis) + .on('normal', leaveEmphasis); + }; + + /** + * Set text option in the style + * @param {Object} textStyle + * @param {module:echarts/model/Model} labelModel + * @param {string} color + */ + graphic.setText = function (textStyle, labelModel, color) { + var labelPosition = labelModel.getShallow('position') || 'inside'; + var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color; + var textStyleModel = labelModel.getModel('textStyle'); + zrUtil.extend(textStyle, { + textDistance: labelModel.getShallow('distance') || 5, + textFont: textStyleModel.getFont(), + textPosition: labelPosition, + textFill: textStyleModel.getTextColor() || labelColor + }); + }; + + function animateOrSetProps(isUpdate, el, props, animatableModel, cb) { + var postfix = isUpdate ? 'Update' : ''; + var duration = animatableModel + && animatableModel.getShallow('animationDuration' + postfix); + var animationEasing = animatableModel + && animatableModel.getShallow('animationEasing' + postfix); + + animatableModel && animatableModel.getShallow('animation') + ? el.animateTo(props, duration, animationEasing, cb) + : (el.attr(props), cb && cb()); + } + /** + * Update graphic element properties with or without animation according to the configuration in series + * @param {module:zrender/Element} el + * @param {Object} props + * @param {module:echarts/model/Model} [animatableModel] + * @param {Function} cb + */ + graphic.updateProps = zrUtil.curry(animateOrSetProps, true); + + /** + * Init graphic element properties with or without animation according to the configuration in series + * @param {module:zrender/Element} el + * @param {Object} props + * @param {module:echarts/model/Model} [animatableModel] + * @param {Function} cb + */ + graphic.initProps = zrUtil.curry(animateOrSetProps, false); + + /** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param {module:zrender/mixin/Transformable} target + * @param {module:zrender/mixin/Transformable} ancestor + */ + graphic.getTransform = function (target, ancestor) { + var mat = matrix.identity([]); + + while (target && target !== ancestor) { + matrix.mul(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + return mat; + }; + + /** + * Apply transform to an vertex. + * @param {Array.} vertex [x, y] + * @param {Array.} transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param {boolean=} invert Whether use invert matrix. + * @return {Array.} [x, y] + */ + graphic.applyTransform = function (vertex, transform, invert) { + if (invert) { + transform = matrix.invert([], transform); + } + return vector.applyTransform([], vertex, transform); + }; + + /** + * @param {string} direction 'left' 'right' 'top' 'bottom' + * @param {Array.} transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param {boolean=} invert Whether use invert matrix. + * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom' + */ + graphic.transformDirection = function (direction, transform, invert) { + + // Pick a base, ensure that transform result will not be (0, 0). + var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0) + ? 1 : Math.abs(2 * transform[4] / transform[0]); + var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0) + ? 1 : Math.abs(2 * transform[4] / transform[2]); + + var vertex = [ + direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, + direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0 + ]; + + vertex = graphic.applyTransform(vertex, transform, invert); + + return Math.abs(vertex[0]) > Math.abs(vertex[1]) + ? (vertex[0] > 0 ? 'right' : 'left') + : (vertex[1] > 0 ? 'bottom' : 'top'); + }; + + module.exports = graphic; + + +/***/ }, +/* 43 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Path = __webpack_require__(44); + var PathProxy = __webpack_require__(48); + var transformPath = __webpack_require__(58); + var matrix = __webpack_require__(17); + + // command chars + var cc = [ + 'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', + 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A' + ]; + + var mathSqrt = Math.sqrt; + var mathSin = Math.sin; + var mathCos = Math.cos; + var PI = Math.PI; + + var vMag = function(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); + }; + var vRatio = function(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); + }; + var vAngle = function(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) + * Math.acos(vRatio(u, v)); + }; + + function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { + var psi = psiDeg * (PI / 180.0); + var xp = mathCos(psi) * (x1 - x2) / 2.0 + + mathSin(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0 + + mathCos(psi) * (y1 - y2) / 2.0; + + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + + if (lambda > 1) { + rx *= mathSqrt(lambda); + ry *= mathSqrt(lambda); + } + + var f = (fa === fs ? -1 : 1) + * mathSqrt((((rx * rx) * (ry * ry)) + - ((rx * rx) * (yp * yp)) + - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + + (ry * ry) * (xp * xp)) + ) || 0; + + var cxp = f * rx * yp / ry; + var cyp = f * -ry * xp / rx; + + var cx = (x1 + x2) / 2.0 + + mathCos(psi) * cxp + - mathSin(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin(psi) * cxp + + mathCos(psi) * cyp; + + var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]); + var u = [ (xp - cxp) / rx, (yp - cyp) / ry ]; + var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ]; + var dTheta = vAngle(u, v); + + if (vRatio(u, v) <= -1) { + dTheta = PI; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (fs === 0 && dTheta > 0) { + dTheta = dTheta - 2 * PI; + } + if (fs === 1 && dTheta < 0) { + dTheta = dTheta + 2 * PI; + } + + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); + } + + function createPathProxyFromString(data) { + if (!data) { + return []; + } + + // command string + var cs = data.replace(/-/g, ' -') + .replace(/ /g, ' ') + .replace(/ /g, ',') + .replace(/,,/g, ','); + + var n; + // create pipes so that we can split the data + for (n = 0; n < cc.length; n++) { + cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]); + } + + // create array + var arr = cs.split('|'); + // init context point + var cpx = 0; + var cpy = 0; + + var path = new PathProxy(); + var CMD = PathProxy.CMD; + + var prevCmd; + for (n = 1; n < arr.length; n++) { + var str = arr[n]; + var c = str.charAt(0); + var off = 0; + var p = str.slice(1).replace(/e,-/g, 'e-').split(','); + var cmd; + + if (p.length > 0 && p[0] === '') { + p.shift(); + } + + for (var i = 0; i < p.length; i++) { + p[i] = parseFloat(p[i]); + } + while (off < p.length && !isNaN(p[off])) { + if (isNaN(p[0])) { + break; + } + var ctlPtx; + var ctlPty; + + var rx; + var ry; + var psi; + var fa; + var fs; + + var x1 = cpx; + var y1 = cpy; + + // convert l, H, h, V, and v to L + switch (c) { + case 'l': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'L': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'm': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + c = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + c = 'L'; + break; + case 'h': + cpx += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'H': + cpx = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'v': + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'V': + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'C': + cmd = CMD.C; + path.addData( + cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++] + ); + cpx = p[off - 2]; + cpy = p[off - 1]; + break; + case 'c': + cmd = CMD.C; + path.addData( + cmd, + p[off++] + cpx, p[off++] + cpy, + p[off++] + cpx, p[off++] + cpy, + p[off++] + cpx, p[off++] + cpy + ); + cpx += p[off - 2]; + cpy += p[off - 1]; + break; + case 'S': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 's': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = cpx + p[off++]; + y1 = cpy + p[off++]; + cpx += p[off++]; + cpy += p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 'Q': + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'q': + x1 = p[off++] + cpx; + y1 = p[off++] + cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'T': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 't': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 'A': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + + x1 = cpx, y1 = cpy; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.A; + processArc( + x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path + ); + break; + case 'a': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + + x1 = cpx, y1 = cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.A; + processArc( + x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path + ); + break; + } + } + + if (c === 'z' || c === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + } + + prevCmd = cmd; + } + + path.toStatic(); + + return path; + } + + // TODO Optimize double memory cost problem + function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + var transform; + opts = opts || {}; + opts.buildPath = function (path) { + path.setData(pathProxy.data); + transform && transformPath(path, transform); + // Svg and vml renderer don't have context + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx); + } + }; + + opts.applyTransform = function (m) { + if (!transform) { + transform = matrix.create(); + } + matrix.mul(transform, m, transform); + }; + + return opts; + } + + module.exports = { + /** + * Create a Path object from path string data + * http://www.w3.org/TR/SVG/paths.html#PathData + * @param {Object} opts Other options + */ + createFromString: function (str, opts) { + return new Path(createPathOptions(str, opts)); + }, + + /** + * Create a Path class from path string data + * @param {string} str + * @param {Object} opts Other options + */ + extendFromString: function (str, opts) { + return Path.extend(createPathOptions(str, opts)); + }, + + /** + * Merge multiple paths + */ + // TODO Apply transform + // TODO stroke dash + // TODO Optimize double memory cost problem + mergePath: function (pathEls, opts) { + var pathList = []; + var len = pathEls.length; + var pathEl; + var i; + for (i = 0; i < len; i++) { + pathEl = pathEls[i]; + if (pathEl.__dirty) { + pathEl.buildPath(pathEl.path, pathEl.shape); + } + pathList.push(pathEl.path); + } + + var pathBundle = new Path(opts); + pathBundle.buildPath = function (path) { + path.appendPath(pathList); + // Svg and vml renderer don't have context + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx); + } + }; + + return pathBundle; + } + }; + + +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Path element + * @module zrender/graphic/Path + */ + + + + var Displayable = __webpack_require__(45); + var zrUtil = __webpack_require__(3); + var PathProxy = __webpack_require__(48); + var pathContain = __webpack_require__(51); + + var Gradient = __webpack_require__(4); + + function pathHasFill(style) { + var fill = style.fill; + return fill != null && fill !== 'none'; + } + + function pathHasStroke(style) { + var stroke = style.stroke; + return stroke != null && stroke !== 'none' && style.lineWidth > 0; + } + + var abs = Math.abs; + + /** + * @alias module:zrender/graphic/Path + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + function Path(opts) { + Displayable.call(this, opts); + + /** + * @type {module:zrender/core/PathProxy} + * @readOnly + */ + this.path = new PathProxy(); + } + + Path.prototype = { + + constructor: Path, + + type: 'path', + + __dirtyPath: true, + + strokeContainThreshold: 5, + + brush: function (ctx) { + ctx.save(); + + var style = this.style; + var path = this.path; + var hasStroke = pathHasStroke(style); + var hasFill = pathHasFill(style); + + if (this.__dirtyPath) { + // Update gradient because bounding rect may changed + if (hasFill && (style.fill instanceof Gradient)) { + style.fill.updateCanvasGradient(this, ctx); + } + if (hasStroke && (style.stroke instanceof Gradient)) { + style.stroke.updateCanvasGradient(this, ctx); + } + } + + style.bind(ctx, this); + this.setTransform(ctx); + + var lineDash = style.lineDash; + var lineDashOffset = style.lineDashOffset; + + var ctxLineDash = !!ctx.setLineDash; + + // Proxy context + // Rebuild path in following 2 cases + // 1. Path is dirty + // 2. Path needs javascript implemented lineDash stroking. + // In this case, lineDash information will not be saved in PathProxy + if (this.__dirtyPath || ( + lineDash && !ctxLineDash && hasStroke + )) { + path = this.path.beginPath(ctx); + + // Setting line dash before build path + if (lineDash && !ctxLineDash) { + path.setLineDash(lineDash); + path.setLineDashOffset(lineDashOffset); + } + + this.buildPath(path, this.shape); + + // Clear path dirty flag + this.__dirtyPath = false; + } + else { + // Replay path building + ctx.beginPath(); + this.path.rebuildPath(ctx); + } + + hasFill && path.fill(ctx); + + if (lineDash && ctxLineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + + hasStroke && path.stroke(ctx); + + // Draw rect text + if (style.text != null) { + // var rect = this.getBoundingRect(); + this.drawRectText(ctx, this.getBoundingRect()); + } + + ctx.restore(); + }, + + buildPath: function (ctx, shapeCfg) {}, + + getBoundingRect: function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var path = this.path; + if (this.__dirtyPath) { + path.beginPath(); + this.buildPath(path, this.shape); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + + if (pathHasStroke(style)) { + // Needs update rect with stroke lineWidth when + // 1. Element changes scale or lineWidth + // 2. Shape is changed + var rectWithStroke = this._rectWithStroke; + if (this.__dirty || needsUpdateRect) { + var rectWithStroke = this._rectWithStroke + || (this._rectWithStroke = rect.clone()); + rectWithStroke.copy(rect); + // FIXME Must after updateTransform + var w = style.lineWidth; + // PENDING, Min line width is needed when line is horizontal or vertical + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + + // Only add extra hover lineWidth when there are no fill + if (!pathHasFill(style)) { + w = Math.max(w, this.strokeContainThreshold); + } + // Consider line width + // Line scale can't be 0; + if (lineScale > 1e-10) { + rectWithStroke.width += w / lineScale; + rectWithStroke.height += w / lineScale; + rectWithStroke.x -= w / lineScale / 2; + rectWithStroke.y -= w / lineScale / 2; + } + } + + // Return rect with stroke + return rectWithStroke; + } + + return rect; + }, + + contain: function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + var style = this.style; + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + var pathData = this.path.data; + if (pathHasStroke(style)) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + // Line scale can't be 0; + if (lineScale > 1e-10) { + // Only add extra hover lineWidth when there are no fill + if (!pathHasFill(style)) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (pathContain.containStroke( + pathData, lineWidth / lineScale, x, y + )) { + return true; + } + } + } + if (pathHasFill(style)) { + return pathContain.contain(pathData, x, y); + } + } + return false; + }, + + /** + * @param {boolean} dirtyPath + */ + dirty: function (dirtyPath) { + if (arguments.length ===0) { + dirtyPath = true; + } + // Only mark dirty, not mark clean + if (dirtyPath) { + this.__dirtyPath = dirtyPath; + this._rect = null; + } + + this.__dirty = true; + + this.__zr && this.__zr.refresh(); + + // Used as a clipping path + if (this.__clipTarget) { + this.__clipTarget.dirty(); + } + }, + + /** + * Alias for animate('shape') + * @param {boolean} loop + */ + animateShape: function (loop) { + return this.animate('shape', loop); + }, + + // Overwrite attrKV + attrKV: function (key, value) { + // FIXME + if (key === 'shape') { + this.setShape(value); + } + else { + Displayable.prototype.attrKV.call(this, key, value); + } + }, + + /** + * @param {Object|string} key + * @param {*} value + */ + setShape: function (key, value) { + var shape = this.shape; + // Path from string may not have shape + if (shape) { + if (zrUtil.isObject(key)) { + for (var name in key) { + shape[name] = key[name]; + } + } + else { + shape[key] = value; + } + this.dirty(true); + } + return this; + }, + + getLineScale: function () { + var m = this.transform; + // Get the line scale. + // Determinant of `m` means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 + ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) + : 1; + } + }; + + /** + * 扩展一个 Path element, 比如星形,圆等。 + * Extend a path element + * @param {Object} props + * @param {string} props.type Path type + * @param {Function} props.init Initialize + * @param {Function} props.buildPath Overwrite buildPath method + * @param {Object} [props.style] Extended default style config + * @param {Object} [props.shape] Extended default shape config + */ + Path.extend = function (defaults) { + var Sub = function (opts) { + Path.call(this, opts); + + if (defaults.style) { + // Extend default style + this.style.extendFrom(defaults.style, false); + } + + // Extend default shape + var defaultShape = defaults.shape; + if (defaultShape) { + this.shape = this.shape || {}; + var thisShape = this.shape; + for (var name in defaultShape) { + if ( + ! thisShape.hasOwnProperty(name) + && defaultShape.hasOwnProperty(name) + ) { + thisShape[name] = defaultShape[name]; + } + } + } + + defaults.init && defaults.init.call(this, opts); + }; + + zrUtil.inherits(Sub, Path); + + // FIXME 不能 extend position, rotation 等引用对象 + for (var name in defaults) { + // Extending prototype values and methods + if (name !== 'style' && name !== 'shape') { + Sub.prototype[name] = defaults[name]; + } + } + + return Sub; + }; + + zrUtil.inherits(Path, Displayable); + + module.exports = Path; + + +/***/ }, +/* 45 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 可绘制的图形基类 + * Base class of all displayable graphic objects + * @module zrender/graphic/Displayable + */ + + + + var zrUtil = __webpack_require__(3); + + var Style = __webpack_require__(46); + + var Element = __webpack_require__(30); + var RectText = __webpack_require__(47); + // var Stateful = require('./mixin/Stateful'); + + /** + * @alias module:zrender/graphic/Displayable + * @extends module:zrender/Element + * @extends module:zrender/graphic/mixin/RectText + */ + function Displayable(opts) { + + opts = opts || {}; + + Element.call(this, opts); + + // Extend properties + for (var name in opts) { + if ( + opts.hasOwnProperty(name) && + name !== 'style' + ) { + this[name] = opts[name]; + } + } + + /** + * @type {module:zrender/graphic/Style} + */ + this.style = new Style(opts.style); + + this._rect = null; + // Shapes for cascade clipping. + this.__clipPaths = []; + + // FIXME Stateful must be mixined after style is setted + // Stateful.call(this, opts); + } + + Displayable.prototype = { + + constructor: Displayable, + + type: 'displayable', + + /** + * Displayable 是否为脏,Painter 中会根据该标记判断是否需要是否需要重新绘制 + * Dirty flag. From which painter will determine if this displayable object needs brush + * @name module:zrender/graphic/Displayable#__dirty + * @type {boolean} + */ + __dirty: true, + + /** + * 图形是否可见,为true时不绘制图形,但是仍能触发鼠标事件 + * If ignore drawing of the displayable object. Mouse event will still be triggered + * @name module:/zrender/graphic/Displayable#invisible + * @type {boolean} + * @default false + */ + invisible: false, + + /** + * @name module:/zrender/graphic/Displayable#z + * @type {number} + * @default 0 + */ + z: 0, + + /** + * @name module:/zrender/graphic/Displayable#z + * @type {number} + * @default 0 + */ + z2: 0, + + /** + * z层level,决定绘画在哪层canvas中 + * @name module:/zrender/graphic/Displayable#zlevel + * @type {number} + * @default 0 + */ + zlevel: 0, + + /** + * 是否可拖拽 + * @name module:/zrender/graphic/Displayable#draggable + * @type {boolean} + * @default false + */ + draggable: false, + + /** + * 是否正在拖拽 + * @name module:/zrender/graphic/Displayable#draggable + * @type {boolean} + * @default false + */ + dragging: false, + + /** + * 是否相应鼠标事件 + * @name module:/zrender/graphic/Displayable#silent + * @type {boolean} + * @default false + */ + silent: false, + + /** + * If enable culling + * @type {boolean} + * @default false + */ + culling: false, + + /** + * Mouse cursor when hovered + * @name module:/zrender/graphic/Displayable#cursor + * @type {string} + */ + cursor: 'pointer', + + /** + * If hover area is bounding rect + * @name module:/zrender/graphic/Displayable#rectHover + * @type {string} + */ + rectHover: false, + + beforeBrush: function (ctx) {}, + + afterBrush: function (ctx) {}, + + /** + * 图形绘制方法 + * @param {Canvas2DRenderingContext} ctx + */ + // Interface + brush: function (ctx) {}, + + /** + * 获取最小包围盒 + * @return {module:zrender/core/BoundingRect} + */ + // Interface + getBoundingRect: function () {}, + + /** + * 判断坐标 x, y 是否在图形上 + * If displayable element contain coord x, y + * @param {number} x + * @param {number} y + * @return {boolean} + */ + contain: function (x, y) { + return this.rectContain(x, y); + }, + + /** + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) { + cb.call(context, this); + }, + + /** + * 判断坐标 x, y 是否在图形的包围盒上 + * If bounding rect of element contain coord x, y + * @param {number} x + * @param {number} y + * @return {boolean} + */ + rectContain: function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }, + + /** + * 标记图形元素为脏,并且在下一帧重绘 + * Mark displayable element dirty and refresh next frame + */ + dirty: function () { + this.__dirty = true; + + this._rect = null; + + this.__zr && this.__zr.refresh(); + }, + + /** + * 图形是否会触发事件 + * If displayable object binded any event + * @return {boolean} + */ + // TODO, 通过 bind 绑定的事件 + // isSilent: function () { + // return !( + // this.hoverable || this.draggable + // || this.onmousemove || this.onmouseover || this.onmouseout + // || this.onmousedown || this.onmouseup || this.onclick + // || this.ondragenter || this.ondragover || this.ondragleave + // || this.ondrop + // ); + // }, + /** + * Alias for animate('style') + * @param {boolean} loop + */ + animateStyle: function (loop) { + return this.animate('style', loop); + }, + + attrKV: function (key, value) { + if (key !== 'style') { + Element.prototype.attrKV.call(this, key, value); + } + else { + this.style.set(value); + } + }, + + /** + * @param {Object|string} key + * @param {*} value + */ + setStyle: function (key, value) { + this.style.set(key, value); + this.dirty(false); + return this; + } + }; + + zrUtil.inherits(Displayable, Element); + + zrUtil.mixin(Displayable, RectText); + // zrUtil.mixin(Displayable, Stateful); + + module.exports = Displayable; + + +/***/ }, +/* 46 */ +/***/ function(module, exports) { + + /** + * @module zrender/graphic/Style + */ + + + + var STYLE_LIST_COMMON = [ + 'lineCap', 'lineJoin', 'miterLimit', + 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'shadowColor' + ]; + + var Style = function (opts) { + this.extendFrom(opts); + }; + + Style.prototype = { + + constructor: Style, + + /** + * @type {string} + */ + fill: '#000000', + + /** + * @type {string} + */ + stroke: null, + + /** + * @type {number} + */ + opacity: 1, + + /** + * @type {Array.} + */ + lineDash: null, + + /** + * @type {number} + */ + lineDashOffset: 0, + + /** + * @type {number} + */ + shadowBlur: 0, + + /** + * @type {number} + */ + shadowOffsetX: 0, + + /** + * @type {number} + */ + shadowOffsetY: 0, + + /** + * @type {number} + */ + lineWidth: 1, + + /** + * If stroke ignore scale + * @type {Boolean} + */ + strokeNoScale: false, + + // Bounding rect text configuration + // Not affected by element transform + /** + * @type {string} + */ + text: null, + + /** + * @type {string} + */ + textFill: '#000', + + /** + * @type {string} + */ + textStroke: null, + + /** + * 'inside', 'left', 'right', 'top', 'bottom' + * [x, y] + * @type {string|Array.} + * @default 'inside' + */ + textPosition: 'inside', + + /** + * @type {string} + */ + textBaseline: null, + + /** + * @type {string} + */ + textAlign: null, + + /** + * @type {string} + */ + textVerticalAlign: null, + + /** + * @type {number} + */ + textDistance: 5, + + /** + * @type {number} + */ + textShadowBlur: 0, + + /** + * @type {number} + */ + textShadowOffsetX: 0, + + /** + * @type {number} + */ + textShadowOffsetY: 0, + + /** + * @param {CanvasRenderingContext2D} ctx + */ + bind: function (ctx, el) { + var fill = this.fill; + var stroke = this.stroke; + for (var i = 0; i < STYLE_LIST_COMMON.length; i++) { + var styleName = STYLE_LIST_COMMON[i]; + + if (this[styleName] != null) { + ctx[styleName] = this[styleName]; + } + } + if (stroke != null) { + var lineWidth = this.lineWidth; + ctx.lineWidth = lineWidth / ( + (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1 + ); + } + if (fill != null) { + // Use canvas gradient if has + ctx.fillStyle = fill.canvasGradient ? fill.canvasGradient : fill; + } + if (stroke != null) { + // Use canvas gradient if has + ctx.strokeStyle = stroke.canvasGradient ? stroke.canvasGradient : stroke; + } + this.opacity != null && (ctx.globalAlpha = this.opacity); + }, + + /** + * Extend from other style + * @param {zrender/graphic/Style} otherStyle + * @param {boolean} overwrite + */ + extendFrom: function (otherStyle, overwrite) { + if (otherStyle) { + var target = this; + for (var name in otherStyle) { + if (otherStyle.hasOwnProperty(name) + && (overwrite || ! target.hasOwnProperty(name)) + ) { + target[name] = otherStyle[name]; + } + } + } + }, + + /** + * Batch setting style with a given object + * @param {Object|string} obj + * @param {*} [obj] + */ + set: function (obj, value) { + if (typeof obj === 'string') { + this[obj] = value; + } + else { + this.extendFrom(obj, true); + } + }, + + /** + * Clone + * @return {zrender/graphic/Style} [description] + */ + clone: function () { + var newStyle = new this.constructor(); + newStyle.extendFrom(this, true); + return newStyle; + } + }; + + var styleProto = Style.prototype; + var name; + var i; + for (i = 0; i < STYLE_LIST_COMMON.length; i++) { + name = STYLE_LIST_COMMON[i]; + if (!(name in styleProto)) { + styleProto[name] = null; + } + } + + module.exports = Style; + + +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Mixin for drawing text in a element bounding rect + * @module zrender/mixin/RectText + */ + + + + var textContain = __webpack_require__(14); + var BoundingRect = __webpack_require__(15); + + var tmpRect = new BoundingRect(); + + var RectText = function () {}; + + function parsePercent(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + } + + function setTransform(ctx, m) { + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + + RectText.prototype = { + + constructor: RectText, + + /** + * Draw text in a rect with specified position. + * @param {CanvasRenderingContext} ctx + * @param {Object} rect Displayable rect + * @return {Object} textRect Alternative precalculated text bounding rect + */ + drawRectText: function (ctx, rect, textRect) { + var style = this.style; + var text = style.text; + // Convert to string + text != null && (text += ''); + if (!text) { + return; + } + var x; + var y; + var textPosition = style.textPosition; + var distance = style.textDistance; + var align = style.textAlign; + var font = style.textFont || style.font; + var baseline = style.textBaseline; + var verticalAlign = style.textVerticalAlign; + + textRect = textRect || textContain.getBoundingRect(text, font, align, baseline); + + // Transform rect to view space + var transform = this.transform; + var invTransform = this.invTransform; + if (transform) { + tmpRect.copy(rect); + tmpRect.applyTransform(transform); + rect = tmpRect; + // Transform back + setTransform(ctx, invTransform); + } + + // Text position represented by coord + if (textPosition instanceof Array) { + // Percent + x = rect.x + parsePercent(textPosition[0], rect.width); + y = rect.y + parsePercent(textPosition[1], rect.height); + align = align || 'left'; + baseline = baseline || 'top'; + } + else { + var res = textContain.adjustTextPositionOnRect( + textPosition, rect, textRect, distance + ); + x = res.x; + y = res.y; + // Default align and baseline when has textPosition + align = align || res.textAlign; + baseline = baseline || res.textBaseline; + } + + ctx.textAlign = align; + if (verticalAlign) { + switch (verticalAlign) { + case 'middle': + y -= textRect.height / 2; + break; + case 'bottom': + y -= textRect.height; + break; + // 'top' + } + // Ignore baseline + ctx.textBaseline = 'top'; + } + else { + ctx.textBaseline = baseline; + } + + var textFill = style.textFill; + var textStroke = style.textStroke; + textFill && (ctx.fillStyle = textFill); + textStroke && (ctx.strokeStyle = textStroke); + ctx.font = font; + + // Text shadow + ctx.shadowColor = style.textShadowColor; + ctx.shadowBlur = style.textShadowBlur; + ctx.shadowOffsetX = style.textShadowOffsetX; + ctx.shadowOffsetY = style.textShadowOffsetY; + + var textLines = text.split('\n'); + for (var i = 0; i < textLines.length; i++) { + textFill && ctx.fillText(textLines[i], x, y); + textStroke && ctx.strokeText(textLines[i], x, y); + y += textRect.lineHeight; + } + + // Transform again + transform && setTransform(ctx, transform); + } + }; + + module.exports = RectText; + + +/***/ }, +/* 48 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Path 代理,可以在`buildPath`中用于替代`ctx`, 会保存每个path操作的命令到pathCommands属性中 + * 可以用于 isInsidePath 判断以及获取boundingRect + * + * @module zrender/core/PathProxy + * @author Yi Shen (http://www.github.com/pissang) + */ + + // TODO getTotalLength, getPointAtLength + + + var curve = __webpack_require__(49); + var vec2 = __webpack_require__(16); + var bbox = __webpack_require__(50); + var BoundingRect = __webpack_require__(15); + + var CMD = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + // Rect + R: 7 + }; + + var min = []; + var max = []; + var min2 = []; + var max2 = []; + var mathMin = Math.min; + var mathMax = Math.max; + var mathCos = Math.cos; + var mathSin = Math.sin; + var mathSqrt = Math.sqrt; + + var hasTypedArray = typeof Float32Array != 'undefined'; + + /** + * @alias module:zrender/core/PathProxy + * @constructor + */ + var PathProxy = function () { + + /** + * Path data. Stored as flat array + * @type {Array.} + */ + this.data = []; + + this._len = 0; + + this._ctx = null; + + this._xi = 0; + this._yi = 0; + + this._x0 = 0; + this._y0 = 0; + }; + + /** + * 快速计算Path包围盒(并不是最小包围盒) + * @return {Object} + */ + PathProxy.prototype = { + + constructor: PathProxy, + + _lineDash: null, + + _dashOffset: 0, + + _dashIdx: 0, + + _dashSum: 0, + + getContext: function () { + return this._ctx; + }, + + /** + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + beginPath: function (ctx) { + this._ctx = ctx; + + ctx && ctx.beginPath(); + + // Reset + this._len = 0; + + if (this._lineDash) { + this._lineDash = null; + + this._dashOffset = 0; + } + + return this; + }, + + /** + * @param {number} x + * @param {number} y + * @return {module:zrender/core/PathProxy} + */ + moveTo: function (x, y) { + this.addData(CMD.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + + // x0, y0, xi, yi 是记录在 _dashedXXXXTo 方法中使用 + // xi, yi 记录当前点, x0, y0 在 closePath 的时候回到起始点。 + // 有可能在 beginPath 之后直接调用 lineTo,这时候 x0, y0 需要 + // 在 lineTo 方法中记录,这里先不考虑这种情况,dashed line 也只在 IE10- 中不支持 + this._x0 = x; + this._y0 = y; + + this._xi = x; + this._yi = y; + + return this; + }, + + /** + * @param {number} x + * @param {number} y + * @return {module:zrender/core/PathProxy} + */ + lineTo: function (x, y) { + this.addData(CMD.L, x, y); + if (this._ctx) { + this._needsDash() ? this._dashedLineTo(x, y) + : this._ctx.lineTo(x, y); + } + this._xi = x; + this._yi = y; + return this; + }, + + /** + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @return {module:zrender/core/PathProxy} + */ + bezierCurveTo: function (x1, y1, x2, y2, x3, y3) { + this.addData(CMD.C, x1, y1, x2, y2, x3, y3); + if (this._ctx) { + this._needsDash() ? this._dashedBezierTo(x1, y1, x2, y2, x3, y3) + : this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + this._xi = x3; + this._yi = y3; + return this; + }, + + /** + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @return {module:zrender/core/PathProxy} + */ + quadraticCurveTo: function (x1, y1, x2, y2) { + this.addData(CMD.Q, x1, y1, x2, y2); + if (this._ctx) { + this._needsDash() ? this._dashedQuadraticTo(x1, y1, x2, y2) + : this._ctx.quadraticCurveTo(x1, y1, x2, y2); + } + this._xi = x2; + this._yi = y2; + return this; + }, + + /** + * @param {number} cx + * @param {number} cy + * @param {number} r + * @param {number} startAngle + * @param {number} endAngle + * @param {boolean} anticlockwise + * @return {module:zrender/core/PathProxy} + */ + arc: function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this.addData( + CMD.A, cx, cy, r, r, startAngle, endAngle - startAngle, 0, anticlockwise ? 0 : 1 + ); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + + this._xi = mathCos(endAngle) * r + cx; + this._xi = mathSin(endAngle) * r + cx; + return this; + }, + + // TODO + arcTo: function (x1, y1, x2, y2, radius) { + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }, + + // TODO + rect: function (x, y, w, h) { + this._ctx && this._ctx.rect(x, y, w, h); + this.addData(CMD.R, x, y, w, h); + return this; + }, + + /** + * @return {module:zrender/core/PathProxy} + */ + closePath: function () { + this.addData(CMD.Z); + + var ctx = this._ctx; + var x0 = this._x0; + var y0 = this._y0; + if (ctx) { + this._needsDash() && this._dashedLineTo(x0, y0); + ctx.closePath(); + } + + this._xi = x0; + this._yi = y0; + return this; + }, + + /** + * Context 从外部传入,因为有可能是 rebuildPath 完之后再 fill。 + * stroke 同样 + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + fill: function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }, + + /** + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + stroke: function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }, + + /** + * 必须在其它绘制命令前调用 + * Must be invoked before all other path drawing methods + * @return {module:zrender/core/PathProxy} + */ + setLineDash: function (lineDash) { + if (lineDash instanceof Array) { + this._lineDash = lineDash; + + this._dashIdx = 0; + + var lineDashSum = 0; + for (var i = 0; i < lineDash.length; i++) { + lineDashSum += lineDash[i]; + } + this._dashSum = lineDashSum; + } + return this; + }, + + /** + * 必须在其它绘制命令前调用 + * Must be invoked before all other path drawing methods + * @return {module:zrender/core/PathProxy} + */ + setLineDashOffset: function (offset) { + this._dashOffset = offset; + return this; + }, + + /** + * + * @return {boolean} + */ + len: function () { + return this._len; + }, + + /** + * 直接设置 Path 数据 + */ + setData: function (data) { + + var len = data.length; + + if (! (this.data && this.data.length == len) && hasTypedArray) { + this.data = new Float32Array(len); + } + + for (var i = 0; i < len; i++) { + this.data[i] = data[i]; + } + + this._len = len; + }, + + /** + * 添加子路径 + * @param {module:zrender/core/PathProxy|Array.} path + */ + appendPath: function (path) { + if (!(path instanceof Array)) { + path = [path]; + } + var len = path.length; + var appendSize = 0; + var offset = this._len; + for (var i = 0; i < len; i++) { + appendSize += path[i].len(); + } + if (hasTypedArray && (this.data instanceof Float32Array)) { + this.data = new Float32Array(offset + appendSize); + } + for (var i = 0; i < len; i++) { + var appendPathData = path[i].data; + for (var k = 0; k < appendPathData.length; k++) { + this.data[offset++] = appendPathData[k]; + } + } + this._len = offset; + }, + + /** + * 填充 Path 数据。 + * 尽量复用而不申明新的数组。大部分图形重绘的指令数据长度都是不变的。 + */ + addData: function (cmd) { + var data = this.data; + if (this._len + arguments.length > data.length) { + // 因为之前的数组已经转换成静态的 Float32Array + // 所以不够用时需要扩展一个新的动态数组 + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + + this._prevCmd = cmd; + }, + + _expandData: function () { + // Only if data is Float32Array + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }, + + /** + * If needs js implemented dashed line + * @return {boolean} + * @private + */ + _needsDash: function () { + return this._lineDash; + }, + + _dashedLineTo: function (x1, y1) { + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var ctx = this._ctx; + + var x0 = this._xi; + var y0 = this._yi; + var dx = x1 - x0; + var dy = y1 - y0; + var dist = mathSqrt(dx * dx + dy * dy); + var x = x0; + var y = y0; + var dash; + var nDash = lineDash.length; + var idx; + dx /= dist; + dy /= dist; + + if (offset < 0) { + // Convert to positive offset + offset = dashSum + offset; + } + offset %= dashSum; + x -= offset * dx; + y -= offset * dy; + + while ((dx >= 0 && x <= x1) || (dx < 0 && x > x1)) { + idx = this._dashIdx; + dash = lineDash[idx]; + x += dx * dash; + y += dy * dash; + this._dashIdx = (idx + 1) % nDash; + // Skip positive offset + if ((dx > 0 && x < x0) || (dx < 0 && x > x0)) { + continue; + } + ctx[idx % 2 ? 'moveTo' : 'lineTo']( + dx >= 0 ? mathMin(x, x1) : mathMax(x, x1), + dy >= 0 ? mathMin(y, y1) : mathMax(y, y1) + ); + } + // Offset for next lineTo + dx = x - x1; + dy = y - y1; + this._dashOffset = -mathSqrt(dx * dx + dy * dy); + }, + + // Not accurate dashed line to + _dashedBezierTo: function (x1, y1, x2, y2, x3, y3) { + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var ctx = this._ctx; + + var x0 = this._xi; + var y0 = this._yi; + var t; + var dx; + var dy; + var cubicAt = curve.cubicAt; + var bezierLen = 0; + var idx = this._dashIdx; + var nDash = lineDash.length; + + var x; + var y; + + var tmpLen = 0; + + if (offset < 0) { + // Convert to positive offset + offset = dashSum + offset; + } + offset %= dashSum; + // Bezier approx length + for (t = 0; t < 1; t += 0.1) { + dx = cubicAt(x0, x1, x2, x3, t + 0.1) + - cubicAt(x0, x1, x2, x3, t); + dy = cubicAt(y0, y1, y2, y3, t + 0.1) + - cubicAt(y0, y1, y2, y3, t); + bezierLen += mathSqrt(dx * dx + dy * dy); + } + + // Find idx after add offset + for (; idx < nDash; idx++) { + tmpLen += lineDash[idx]; + if (tmpLen > offset) { + break; + } + } + t = (tmpLen - offset) / bezierLen; + + while (t <= 1) { + + x = cubicAt(x0, x1, x2, x3, t); + y = cubicAt(y0, y1, y2, y3, t); + + // Use line to approximate dashed bezier + // Bad result if dash is long + idx % 2 ? ctx.moveTo(x, y) + : ctx.lineTo(x, y); + + t += lineDash[idx] / bezierLen; + + idx = (idx + 1) % nDash; + } + + // Finish the last segment and calculate the new offset + (idx % 2 !== 0) && ctx.lineTo(x3, y3); + dx = x3 - x; + dy = y3 - y; + this._dashOffset = -mathSqrt(dx * dx + dy * dy); + }, + + _dashedQuadraticTo: function (x1, y1, x2, y2) { + // Convert quadratic to cubic using degree elevation + var x3 = x2; + var y3 = y2; + x2 = (x2 + 2 * x1) / 3; + y2 = (y2 + 2 * y1) / 3; + x1 = (this._xi + 2 * x1) / 3; + y1 = (this._yi + 2 * y1) / 3; + + this._dashedBezierTo(x1, y1, x2, y2, x3, y3); + }, + + /** + * 转成静态的 Float32Array 减少堆内存占用 + * Convert dynamic array to static Float32Array + */ + toStatic: function () { + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray) { + this.data = new Float32Array(data); + } + } + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function () { + min[0] = min[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max[0] = max[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = data[i]; + yi = data[i + 1]; + + x0 = xi; + y0 = yi; + } + + switch (cmd) { + case CMD.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD.L: + bbox.fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + bbox.fromCubic( + xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + min2, max2 + ); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + bbox.fromQuadratic( + xi, yi, data[i++], data[i++], data[i], data[i + 1], + min2, max2 + ); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + // TODO Arc 旋转 + var psi = data[i++]; + var anticlockwise = 1 - data[i++]; + + if (i == 1) { + // 直接使用 arc 命令 + // 第一个命令起点还未定义 + x0 = mathCos(startAngle) * rx + cx; + y0 = mathSin(startAngle) * ry + cy; + } + + bbox.fromArc( + cx, cy, rx, ry, startAngle, endAngle, + anticlockwise, min2, max2 + ); + + xi = mathCos(endAngle) * rx + cx; + yi = mathSin(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + // Use fromLine + bbox.fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD.Z: + xi = x0; + yi = y0; + break; + } + + // Union + vec2.min(min, min, min2); + vec2.max(max, max, max2); + } + + // No data + if (i === 0) { + min[0] = min[1] = max[0] = max[1] = 0; + } + + return new BoundingRect( + min[0], min[1], max[0] - min[0], max[1] - min[1] + ); + }, + + /** + * Rebuild path from current data + * Rebuild path will not consider javascript implemented line dash. + * @param {CanvasRenderingContext} ctx + */ + rebuildPath: function (ctx) { + var d = this.data; + for (var i = 0; i < this._len;) { + var cmd = d[i++]; + switch (cmd) { + case CMD.M: + ctx.moveTo(d[i++], d[i++]); + break; + case CMD.L: + ctx.lineTo(d[i++], d[i++]); + break; + case CMD.C: + ctx.bezierCurveTo( + d[i++], d[i++], d[i++], d[i++], d[i++], d[i++] + ); + break; + case CMD.Q: + ctx.quadraticCurveTo(d[i++], d[i++], d[i++], d[i++]); + break; + case CMD.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var theta = d[i++]; + var dTheta = d[i++]; + var psi = d[i++]; + var fs = d[i++]; + var r = (rx > ry) ? rx : ry; + var scaleX = (rx > ry) ? 1 : rx / ry; + var scaleY = (rx > ry) ? ry / rx : 1; + var isEllipse = Math.abs(rx - ry) > 1e-3; + if (isEllipse) { + ctx.translate(cx, cy); + ctx.rotate(psi); + ctx.scale(scaleX, scaleY); + ctx.arc(0, 0, r, theta, theta + dTheta, 1 - fs); + ctx.scale(1 / scaleX, 1 / scaleY); + ctx.rotate(-psi); + ctx.translate(-cx, -cy); + } + else { + ctx.arc(cx, cy, r, theta, theta + dTheta, 1 - fs); + } + break; + case CMD.R: + ctx.rect(d[i++], d[i++], d[i++], d[i++]); + break; + case CMD.Z: + ctx.closePath(); + } + } + } + }; + + PathProxy.CMD = CMD; + + module.exports = PathProxy; + + +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 曲线辅助模块 + * @module zrender/core/curve + * @author pissang(https://www.github.com/pissang) + */ + + + var vec2 = __webpack_require__(16); + var v2Create = vec2.create; + var v2DistSquare = vec2.distSquare; + var mathPow = Math.pow; + var mathSqrt = Math.sqrt; + + var EPSILON = 1e-8; + var EPSILON_NUMERIC = 1e-4; + + var THREE_SQRT = mathSqrt(3); + var ONE_THIRD = 1 / 3; + + // 临时变量 + var _v0 = v2Create(); + var _v1 = v2Create(); + var _v2 = v2Create(); + // var _v3 = vec2.create(); + + function isAroundZero(val) { + return val > -EPSILON && val < EPSILON; + } + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + /** + * 计算三次贝塞尔值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @return {number} + */ + function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); + } + + /** + * 计算三次贝塞尔导数值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @return {number} + */ + function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * ( + ((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t + ); + } + + /** + * 计算三次贝塞尔方程根,使用盛金公式 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} val + * @param {Array.} roots + * @return {number} 有效根数目 + */ + function cubicRootAt(p0, p1, p2, p3, val, roots) { + // Evaluate roots of cubic functions + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + + var n = 0; + + if (isAroundZero(A) && isAroundZero(B)) { + if (isAroundZero(b)) { + roots[0] = 0; + } + else { + var t1 = -c / b; //t1, t2, t3, b is not zero + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = B * B - 4 * A * C; + + if (isAroundZero(disc)) { + var K = B / A; + var t1 = -b / a + K; // t1, a is not zero + var t2 = -K / 2; // t2, t3 + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -mathPow(-Y1, ONE_THIRD); + } + else { + Y1 = mathPow(Y1, ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -mathPow(-Y2, ONE_THIRD); + } + else { + Y2 = mathPow(Y2, ONE_THIRD); + } + var t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else { + var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = mathSqrt(A); + var tmp = Math.cos(theta); + + var t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a); + var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; + } + + /** + * 计算三次贝塞尔方程极限值的位置 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {Array.} extrema + * @return {number} 有效数目 + */ + function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <=1) { + extrema[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; + } + + /** + * 细分三次贝塞尔曲线 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @param {Array.} out + */ + function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + + var p0123 = (p123 - p012) * t + p012; + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + // Seg1 + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + + /** + * 投射点到三次贝塞尔曲线上,返回投射距离。 + * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {number} x + * @param {number} y + * @param {Array.} [out] 投射点 + * @return {number} + */ + function cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, out + ) { + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = cubicAt(x0, x1, x2, x3, _t); + _v1[1] = cubicAt(y0, y1, y2, y3, _t); + d1 = v2DistSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + // t - interval + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + + d1 = v2DistSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + // t + interval + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = v2DistSquare(_v2, _v0); + + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = cubicAt(x0, x1, x2, x3, t); + out[1] = cubicAt(y0, y1, y2, y3, t); + } + // console.log(interval, i); + return mathSqrt(d); + } + + /** + * 计算二次方贝塞尔值 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @return {number} + */ + function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + + /** + * 计算二次方贝塞尔导数值 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @return {number} + */ + function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + + /** + * 计算二次方贝塞尔方程根 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @param {Array.} roots + * @return {number} 有效根数目 + */ + function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + var t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; + } + + /** + * 计算二次贝塞尔方程极限值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @return {number} + */ + function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + // p1 is center of p0 and p2 + return 0.5; + } + else { + return (p0 - p1) / divider; + } + } + + /** + * 细分二次贝塞尔曲线 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @param {Array.} out + */ + function quadraticSubdivide(p0, p1, p2, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p012 = (p12 - p01) * t + p01; + + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + + // Seg1 + out[3] = p012; + out[4] = p12; + out[5] = p2; + } + + /** + * 投射点到二次贝塞尔曲线上,返回投射距离。 + * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x + * @param {number} y + * @param {Array.} out 投射点 + * @return {number} + */ + function quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, out + ) { + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = quadraticAt(x0, x1, x2, _t); + _v1[1] = quadraticAt(y0, y1, y2, _t); + var d1 = v2DistSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + // t - interval + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + + var d1 = v2DistSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + // t + interval + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = v2DistSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = quadraticAt(x0, x1, x2, t); + out[1] = quadraticAt(y0, y1, y2, t); + } + // console.log(interval, i); + return mathSqrt(d); + } + + module.exports = { + + cubicAt: cubicAt, + + cubicDerivativeAt: cubicDerivativeAt, + + cubicRootAt: cubicRootAt, + + cubicExtrema: cubicExtrema, + + cubicSubdivide: cubicSubdivide, + + cubicProjectPoint: cubicProjectPoint, + + quadraticAt: quadraticAt, + + quadraticDerivativeAt: quadraticDerivativeAt, + + quadraticRootAt: quadraticRootAt, + + quadraticExtremum: quadraticExtremum, + + quadraticSubdivide: quadraticSubdivide, + + quadraticProjectPoint: quadraticProjectPoint + }; + + +/***/ }, +/* 50 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @author Yi Shen(https://github.com/pissang) + */ + + + var vec2 = __webpack_require__(16); + var curve = __webpack_require__(49); + + var bbox = {}; + var mathMin = Math.min; + var mathMax = Math.max; + var mathSin = Math.sin; + var mathCos = Math.cos; + + var start = vec2.create(); + var end = vec2.create(); + var extremity = vec2.create(); + + var PI2 = Math.PI * 2; + /** + * 从顶点数组中计算出最小包围盒,写入`min`和`max`中 + * @module zrender/core/bbox + * @param {Array} points 顶点数组 + * @param {number} min + * @param {number} max + */ + bbox.fromPoints = function(points, min, max) { + if (points.length === 0) { + return; + } + var p = points[0]; + var left = p[0]; + var right = p[0]; + var top = p[1]; + var bottom = p[1]; + var i; + + for (i = 1; i < points.length; i++) { + p = points[i]; + left = mathMin(left, p[0]); + right = mathMax(right, p[0]); + top = mathMin(top, p[1]); + bottom = mathMax(bottom, p[1]); + } + + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + }; + + /** + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromLine = function (x0, y0, x1, y1, min, max) { + min[0] = mathMin(x0, x1); + min[1] = mathMin(y0, y1); + max[0] = mathMax(x0, x1); + max[1] = mathMax(y0, y1); + }; + + var xDim = []; + var yDim = []; + /** + * 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒,写入`min`和`max`中 + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromCubic = function( + x0, y0, x1, y1, x2, y2, x3, y3, min, max + ) { + var cubicExtrema = curve.cubicExtrema; + var cubicAt = curve.cubicAt; + var i; + var n = cubicExtrema(x0, x1, x2, x3, xDim); + min[0] = Infinity; + min[1] = Infinity; + max[0] = -Infinity; + max[1] = -Infinity; + + for (i = 0; i < n; i++) { + var x = cubicAt(x0, x1, x2, x3, xDim[i]); + min[0] = mathMin(x, min[0]); + max[0] = mathMax(x, max[0]); + } + n = cubicExtrema(y0, y1, y2, y3, yDim); + for (i = 0; i < n; i++) { + var y = cubicAt(y0, y1, y2, y3, yDim[i]); + min[1] = mathMin(y, min[1]); + max[1] = mathMax(y, max[1]); + } + + min[0] = mathMin(x0, min[0]); + max[0] = mathMax(x0, max[0]); + min[0] = mathMin(x3, min[0]); + max[0] = mathMax(x3, max[0]); + + min[1] = mathMin(y0, min[1]); + max[1] = mathMax(y0, max[1]); + min[1] = mathMin(y3, min[1]); + max[1] = mathMax(y3, max[1]); + }; + + /** + * 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒,写入`min`和`max`中 + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromQuadratic = function(x0, y0, x1, y1, x2, y2, min, max) { + var quadraticExtremum = curve.quadraticExtremum; + var quadraticAt = curve.quadraticAt; + // Find extremities, where derivative in x dim or y dim is zero + var tx = + mathMax( + mathMin(quadraticExtremum(x0, x1, x2), 1), 0 + ); + var ty = + mathMax( + mathMin(quadraticExtremum(y0, y1, y2), 1), 0 + ); + + var x = quadraticAt(x0, x1, x2, tx); + var y = quadraticAt(y0, y1, y2, ty); + + min[0] = mathMin(x0, x2, x); + min[1] = mathMin(y0, y2, y); + max[0] = mathMax(x0, x2, x); + max[1] = mathMax(y0, y2, y); + }; + + /** + * 从圆弧中计算出最小包围盒,写入`min`和`max`中 + * @method + * @memberOf module:zrender/core/bbox + * @param {number} x + * @param {number} y + * @param {number} rx + * @param {number} ry + * @param {number} startAngle + * @param {number} endAngle + * @param {number} anticlockwise + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromArc = function ( + x, y, rx, ry, startAngle, endAngle, anticlockwise, min, max + ) { + var vec2Min = vec2.min; + var vec2Max = vec2.max; + + var diff = Math.abs(startAngle - endAngle); + + + if (diff % PI2 < 1e-4 && diff > 1e-4) { + // Is a circle + min[0] = x - rx; + min[1] = y - ry; + max[0] = x + rx; + max[1] = y + ry; + return; + } + + start[0] = mathCos(startAngle) * rx + x; + start[1] = mathSin(startAngle) * ry + y; + + end[0] = mathCos(endAngle) * rx + x; + end[1] = mathSin(endAngle) * ry + y; + + vec2Min(min, start, end); + vec2Max(max, start, end); + + // Thresh to [0, Math.PI * 2] + startAngle = startAngle % (PI2); + if (startAngle < 0) { + startAngle = startAngle + PI2; + } + endAngle = endAngle % (PI2); + if (endAngle < 0) { + endAngle = endAngle + PI2; + } + + if (startAngle > endAngle && !anticlockwise) { + endAngle += PI2; + } + else if (startAngle < endAngle && anticlockwise) { + startAngle += PI2; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + + // var number = 0; + // var step = (anticlockwise ? -Math.PI : Math.PI) / 2; + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = mathCos(angle) * rx + x; + extremity[1] = mathSin(angle) * ry + y; + + vec2Min(min, extremity, min); + vec2Max(max, extremity, max); + } + } + }; + + module.exports = bbox; + + + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var CMD = __webpack_require__(48).CMD; + var line = __webpack_require__(52); + var cubic = __webpack_require__(53); + var quadratic = __webpack_require__(54); + var arc = __webpack_require__(55); + var normalizeRadian = __webpack_require__(56).normalizeRadian; + var curve = __webpack_require__(49); + + var windingLine = __webpack_require__(57); + + var containStroke = line.containStroke; + + var PI2 = Math.PI * 2; + + var EPSILON = 1e-4; + + function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON; + } + + // 临时数组 + var roots = [-1, -1, -1]; + var extrema = [-1, -1]; + + function swapExtrema() { + var tmp = extrema[0]; + extrema[0] = extrema[1]; + extrema[1] = tmp; + } + + function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + // Quick reject + if ( + (y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3) + ) { + return 0; + } + var nRoots = curve.cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var w = 0; + var nExtrema = -1; + var y0_, y1_; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var x_ = curve.cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { // Quick reject + continue; + } + if (nExtrema < 0) { + nExtrema = curve.cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = curve.cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = curve.cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema == 2) { + // 分成三段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } + else if (t < extrema[1]) { + w += y1_ < y0_ ? 1 : -1; + } + else { + w += y3 < y1_ ? 1 : -1; + } + } + else { + // 分成两段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } + else { + w += y3 < y0_ ? 1 : -1; + } + } + } + return w; + } + } + + function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + // Quick reject + if ( + (y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2) + ) { + return 0; + } + var nRoots = curve.quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var t = curve.quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = curve.quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + var x_ = curve.quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { // Quick reject + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? 1 : -1; + } + else { + w += y2 < y_ ? 1 : -1; + } + } + return w; + } + else { + var x_ = curve.quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { // Quick reject + return 0; + } + return y2 < y0 ? 1 : -1; + } + } + } + + // TODO + // Arc 旋转 + function windingArc( + cx, cy, r, startAngle, endAngle, anticlockwise, x, y + ) { + y -= cy; + if (y > r || y < -r) { + return 0; + } + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + + var diff = Math.abs(startAngle - endAngle); + if (diff < 1e-4) { + return 0; + } + if (diff % PI2 < 1e-4) { + // Is a circle + startAngle = 0; + endAngle = PI2; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } else { + return 0; + } + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } + else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2; + } + + var w = 0; + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + var dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2 + angle; + } + if ( + (angle >= startAngle && angle <= endAngle) + || (angle + PI2 >= startAngle && angle + PI2 <= endAngle) + ) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; + } + + function containPath(data, lineWidth, isStroke, x, y) { + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + // Begin a new subpath + if (cmd === CMD.M && i > 1) { + // Close previous subpath + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + // 如果被任何一个 subpath 包含 + if (w !== 0) { + return true; + } + } + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = data[i]; + yi = data[i + 1]; + + x0 = xi; + y0 = yi; + } + + switch (cmd) { + case CMD.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD.L: + if (isStroke) { + if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + // NOTE 在第一个命令为 L, C, Q 的时候会计算出 NaN + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + if (isStroke) { + if (cubic.containStroke(xi, yi, + data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + lineWidth, x, y + )) { + return true; + } + } + else { + w += windingCubic( + xi, yi, + data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + x, y + ) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + if (isStroke) { + if (quadratic.containStroke(xi, yi, + data[i++], data[i++], data[i], data[i + 1], + lineWidth, x, y + )) { + return true; + } + } + else { + w += windingQuadratic( + xi, yi, + data[i++], data[i++], data[i], data[i + 1], + x, y + ) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + // TODO Arc 旋转 + var psi = data[i++]; + var anticlockwise = 1 - data[i++]; + var x1 = Math.cos(theta) * rx + cx; + var y1 = Math.sin(theta) * ry + cy; + // 不是直接使用 arc 命令 + if (i > 1) { + w += windingLine(xi, yi, x1, y1, x, y); + } + else { + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } + // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (arc.containStroke( + cx, cy, ry, theta, theta + dTheta, anticlockwise, + lineWidth, _x, y + )) { + return true; + } + } + else { + w += windingArc( + cx, cy, ry, theta, theta + dTheta, anticlockwise, + _x, y + ); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + var x1 = x0 + width; + var y1 = y0 + height; + if (isStroke) { + if (containStroke(x0, y0, x1, y0, lineWidth, x, y) + || containStroke(x1, y0, x1, y1, lineWidth, x, y) + || containStroke(x1, y1, x0, y1, lineWidth, x, y) + || containStroke(x0, y1, x1, y1, lineWidth, x, y) + ) { + return true; + } + } + else { + // FIXME Clockwise ? + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD.Z: + if (isStroke) { + if (containStroke( + xi, yi, x0, y0, lineWidth, x, y + )) { + return true; + } + } + else { + // Close a subpath + w += windingLine(xi, yi, x0, y0, x, y); + // 如果被任何一个 subpath 包含 + if (w !== 0) { + return true; + } + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; + } + + module.exports = { + contain: function (pathData, x, y) { + return containPath(pathData, 0, false, x, y); + }, + + containStroke: function (pathData, lineWidth, x, y) { + return containPath(pathData, lineWidth, true, x, y); + } + }; + + +/***/ }, +/* 52 */ +/***/ function(module, exports) { + + + module.exports = { + /** + * 线段包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function (x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l) + ) { + return false; + } + + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1) ; + } + else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; + } + }; + + +/***/ }, +/* 53 */ +/***/ function(module, exports, __webpack_require__) { + + + + var curve = __webpack_require__(49); + + module.exports = { + /** + * 三次贝塞尔曲线描边包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l) + ) { + return false; + } + var d = curve.cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, null + ); + return d <= _l / 2; + } + }; + + +/***/ }, +/* 54 */ +/***/ function(module, exports, __webpack_require__) { + + + + var curve = __webpack_require__(49); + + module.exports = { + /** + * 二次贝塞尔曲线描边包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function (x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l) + ) { + return false; + } + var d = curve.quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, null + ); + return d <= _l / 2; + } + }; + + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + + + + var normalizeRadian = __webpack_require__(56).normalizeRadian; + var PI2 = Math.PI * 2; + + module.exports = { + /** + * 圆弧描边包含判断 + * @param {number} cx + * @param {number} cy + * @param {number} r + * @param {number} startAngle + * @param {number} endAngle + * @param {boolean} anticlockwise + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {Boolean} + */ + containStroke: function ( + cx, cy, r, startAngle, endAngle, anticlockwise, + lineWidth, x, y + ) { + + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) { + // Is a circle + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2; + } + + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2 >= startAngle && angle + PI2 <= endAngle); + } + }; + + +/***/ }, +/* 56 */ +/***/ function(module, exports) { + + + + var PI2 = Math.PI * 2; + module.exports = { + normalizeRadian: function(angle) { + angle %= PI2; + if (angle < 0) { + angle += PI2; + } + return angle; + } + }; + + +/***/ }, +/* 57 */ +/***/ function(module, exports) { + + + module.exports = function windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + if (y1 === y0) { + return 0; + } + var dir = y1 < y0 ? 1 : -1; + var t = (y - y0) / (y1 - y0); + var x_ = t * (x1 - x0) + x0; + + return x_ > x ? dir : 0; + }; + + +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { + + + + var CMD = __webpack_require__(48).CMD; + var vec2 = __webpack_require__(16); + var v2ApplyTransform = vec2.applyTransform; + + var points = [[], [], []]; + var mathSqrt = Math.sqrt; + var mathAtan2 = Math.atan2; + function transformPath(path, m) { + var data = path.data; + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + + var M = CMD.M; + var C = CMD.C; + var L = CMD.L; + var R = CMD.R; + var A = CMD.A; + var Q = CMD.Q; + + for (i = 0, j = 0; i < data.length;) { + cmd = data[i++]; + j = i; + nPoint = 0; + + switch (cmd) { + case M: + nPoint = 1; + break; + case L: + nPoint = 1; + break; + case C: + nPoint = 3; + break; + case Q: + nPoint = 2; + break; + case A: + var x = m[4]; + var y = m[5]; + var sx = mathSqrt(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + // cx + data[i++] += x; + // cy + data[i++] += y; + // Scale rx and ry + // FIXME Assume psi is 0 here + data[i++] *= sx; + data[i++] *= sy; + + // Start angle + data[i++] += angle; + // end angle + data[i++] += angle; + // FIXME psi + i += 2; + j = i; + break; + case R: + // x0, y0 + p[0] = data[i++]; + p[1] = data[i++]; + v2ApplyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + // x1, y1 + p[0] += data[i++]; + p[1] += data[i++]; + v2ApplyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + + for (k = 0; k < nPoint; k++) { + var p = points[k]; + p[0] = data[i++]; + p[1] = data[i++]; + + v2ApplyTransform(p, p, m); + // Write back + data[j++] = p[0]; + data[j++] = p[1]; + } + } + } + + module.exports = transformPath; + + +/***/ }, +/* 59 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Image element + * @module zrender/graphic/Image + */ + + + + var Displayable = __webpack_require__(45); + var BoundingRect = __webpack_require__(15); + var zrUtil = __webpack_require__(3); + var roundRectHelper = __webpack_require__(60); + + var LRU = __webpack_require__(61); + var globalImageCache = new LRU(50); + /** + * @alias zrender/graphic/Image + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + function ZImage(opts) { + Displayable.call(this, opts); + } + + ZImage.prototype = { + + constructor: ZImage, + + type: 'image', + + brush: function (ctx) { + var style = this.style; + var src = style.image; + var image; + // style.image is a url string + if (typeof src === 'string') { + image = this._image; + } + // style.image is an HTMLImageElement or HTMLCanvasElement or Canvas + else { + image = src; + } + // FIXME Case create many images with src + if (!image && src) { + // Try get from global image cache + var cachedImgObj = globalImageCache.get(src); + if (!cachedImgObj) { + // Create a new image + image = new Image(); + image.onload = function () { + image.onload = null; + for (var i = 0; i < cachedImgObj.pending.length; i++) { + cachedImgObj.pending[i].dirty(); + } + }; + cachedImgObj = { + image: image, + pending: [this] + }; + image.src = src; + globalImageCache.put(src, cachedImgObj); + this._image = image; + return; + } + else { + image = cachedImgObj.image; + this._image = image; + // Image is not complete finish, add to pending list + if (!image.width || !image.height) { + cachedImgObj.pending.push(this); + return; + } + } + } + + if (image) { + // 图片已经加载完成 + // if (image.nodeName.toUpperCase() == 'IMG') { + // if (!image.complete) { + // return; + // } + // } + // Else is canvas + + var width = style.width || image.width; + var height = style.height || image.height; + var x = style.x || 0; + var y = style.y || 0; + // 图片加载失败 + if (!image.width || !image.height) { + return; + } + + ctx.save(); + + style.bind(ctx); + + // 设置transform + this.setTransform(ctx); + + if (style.r) { + // Border radius clipping + // FIXME + ctx.beginPath(); + roundRectHelper.buildPath(ctx, style); + ctx.clip(); + } + + if (style.sWidth && style.sHeight) { + var sx = style.sx || 0; + var sy = style.sy || 0; + ctx.drawImage( + image, + sx, sy, style.sWidth, style.sHeight, + x, y, width, height + ); + } + else if (style.sx && style.sy) { + var sx = style.sx; + var sy = style.sy; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage( + image, + sx, sy, sWidth, sHeight, + x, y, width, height + ); + } + else { + ctx.drawImage(image, x, y, width, height); + } + + // 如果没设置宽和高的话自动根据图片宽高设置 + if (style.width == null) { + style.width = width; + } + if (style.height == null) { + style.height = height; + } + + // Draw rect text + if (style.text != null) { + this.drawRectText(ctx, this.getBoundingRect()); + } + + ctx.restore(); + } + }, + + getBoundingRect: function () { + var style = this.style; + if (! this._rect) { + this._rect = new BoundingRect( + style.x || 0, style.y || 0, style.width || 0, style.height || 0 + ); + } + return this._rect; + } + }; + + zrUtil.inherits(ZImage, Displayable); + + module.exports = ZImage; + + +/***/ }, +/* 60 */ +/***/ function(module, exports) { + + + + module.exports = { + buildPath: function (ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + var r = shape.r; + var r1; + var r2; + var r3; + var r4; + + // Convert width and height to positive for better borderRadius + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } + else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } + else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } + else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } + else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } + else { + r1 = r2 = r3 = r4 = 0; + } + + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.quadraticCurveTo( + x + width, y, x + width, y + r2 + ); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.quadraticCurveTo( + x + width, y + height, x + width - r3, y + height + ); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.quadraticCurveTo( + x, y + height, x, y + height - r4 + ); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.quadraticCurveTo(x, y, x + r1, y); + } + }; + + +/***/ }, +/* 61 */ +/***/ function(module, exports) { + + // Simple LRU cache use doubly linked list + // @module zrender/core/LRU + + + /** + * Simple double linked list. Compared with array, it has O(1) remove operation. + * @constructor + */ + var LinkedList = function() { + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.head = null; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.tail = null; + + this._len = 0; + }; + + var linkedListProto = LinkedList.prototype; + /** + * Insert a new value at the tail + * @param {} val + * @return {module:zrender/core/LRU~Entry} + */ + linkedListProto.insert = function(val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; + }; + + /** + * Insert an entry at the tail + * @param {module:zrender/core/LRU~Entry} entry + */ + linkedListProto.insertEntry = function(entry) { + if (!this.head) { + this.head = this.tail = entry; + } + else { + this.tail.next = entry; + entry.prev = this.tail; + this.tail = entry; + } + this._len++; + }; + + /** + * Remove entry. + * @param {module:zrender/core/LRU~Entry} entry + */ + linkedListProto.remove = function(entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } + else { + // Is head + this.head = next; + } + if (next) { + next.prev = prev; + } + else { + // Is tail + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; + }; + + /** + * @return {number} + */ + linkedListProto.len = function() { + return this._len; + }; + + /** + * @constructor + * @param {} val + */ + var Entry = function(val) { + /** + * @type {} + */ + this.value = val; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.next; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.prev; + }; + + /** + * LRU Cache + * @constructor + * @alias module:zrender/core/LRU + */ + var LRU = function(maxSize) { + + this._list = new LinkedList(); + + this._map = {}; + + this._maxSize = maxSize || 10; + }; + + var LRUProto = LRU.prototype; + + /** + * @param {string} key + * @param {} value + */ + LRUProto.put = function(key, value) { + var list = this._list; + var map = this._map; + if (map[key] == null) { + var len = list.len(); + if (len >= this._maxSize && len > 0) { + // Remove the least recently used + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + } + + var entry = list.insert(value); + entry.key = key; + map[key] = entry; + } + }; + + /** + * @param {string} key + * @return {} + */ + LRUProto.get = function(key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + // Put the latest used entry in the tail + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + + return entry.value; + } + }; + + /** + * Clear the cache + */ + LRUProto.clear = function() { + this._list.clear(); + this._map = {}; + }; + + module.exports = LRU; + + +/***/ }, +/* 62 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Text element + * @module zrender/graphic/Text + * + * TODO Wrapping + */ + + + + var Displayable = __webpack_require__(45); + var zrUtil = __webpack_require__(3); + var textContain = __webpack_require__(14); + + /** + * @alias zrender/graphic/Text + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + var Text = function (opts) { + Displayable.call(this, opts); + }; + + Text.prototype = { + + constructor: Text, + + type: 'text', + + brush: function (ctx) { + var style = this.style; + var x = style.x || 0; + var y = style.y || 0; + // Convert to string + var text = style.text; + var textFill = style.fill; + var textStroke = style.stroke; + + // Convert to string + text != null && (text += ''); + + if (text) { + ctx.save(); + + this.style.bind(ctx); + this.setTransform(ctx); + + textFill && (ctx.fillStyle = textFill); + textStroke && (ctx.strokeStyle = textStroke); + + ctx.font = style.textFont || style.font; + ctx.textAlign = style.textAlign; + + if (style.textVerticalAlign) { + var rect = textContain.getBoundingRect( + text, ctx.font, style.textAlign, 'top' + ); + // Ignore textBaseline + ctx.textBaseline = 'top'; + switch (style.textVerticalAlign) { + case 'middle': + y -= rect.height / 2; + break; + case 'bottom': + y -= rect.height; + break; + // 'top' + } + } + else { + ctx.textBaseline = style.textBaseline; + } + var lineHeight = textContain.measureText('国', ctx.font).width; + + var textLines = text.split('\n'); + for (var i = 0; i < textLines.length; i++) { + textFill && ctx.fillText(textLines[i], x, y); + textStroke && ctx.strokeText(textLines[i], x, y); + y += lineHeight; + } + + ctx.restore(); + } + }, + + getBoundingRect: function () { + if (!this._rect) { + var style = this.style; + var textVerticalAlign = style.textVerticalAlign; + var rect = textContain.getBoundingRect( + style.text + '', style.textFont || style.font, style.textAlign, + textVerticalAlign ? 'top' : style.textBaseline + ); + switch (textVerticalAlign) { + case 'middle': + rect.y -= rect.height / 2; + break; + case 'bottom': + rect.y -= rect.height; + break; + } + rect.x += style.x || 0; + rect.y += style.y || 0; + this._rect = rect; + } + return this._rect; + } + }; + + zrUtil.inherits(Text, Displayable); + + module.exports = Text; + + +/***/ }, +/* 63 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 圆形 + * @module zrender/shape/Circle + */ + + + + module.exports = __webpack_require__(44).extend({ + + type: 'circle', + + shape: { + cx: 0, + cy: 0, + r: 0 + }, + + buildPath : function (ctx, shape) { + // Better stroking in ShapeBundle + ctx.moveTo(shape.cx + shape.r, shape.cy); + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2, true); + return; + } + }); + + + +/***/ }, +/* 64 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 扇形 + * @module zrender/graphic/shape/Sector + */ + + // FIXME clockwise seems wrong + + + module.exports = __webpack_require__(44).extend({ + + type: 'sector', + + shape: { + + cx: 0, + + cy: 0, + + r0: 0, + + r: 0, + + startAngle: 0, + + endAngle: Math.PI * 2, + + clockwise: true + }, + + buildPath: function (ctx, shape) { + + var x = shape.cx; + var y = shape.cy; + var r0 = Math.max(shape.r0 || 0, 0); + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + + ctx.moveTo(unitX * r0 + x, unitY * r0 + y); + + ctx.lineTo(unitX * r + x, unitY * r + y); + + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + + ctx.lineTo( + Math.cos(endAngle) * r0 + x, + Math.sin(endAngle) * r0 + y + ); + + if (r0 !== 0) { + ctx.arc(x, y, r0, endAngle, startAngle, clockwise); + } + + ctx.closePath(); + } + }); + + + +/***/ }, +/* 65 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 圆环 + * @module zrender/graphic/shape/Ring + */ + + + module.exports = __webpack_require__(44).extend({ + + type: 'ring', + + shape: { + cx: 0, + cy: 0, + r: 0, + r0: 0 + }, + + buildPath: function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var PI2 = Math.PI * 2; + ctx.moveTo(x + shape.r, y); + ctx.arc(x, y, shape.r, 0, PI2, false); + ctx.moveTo(x + shape.r0, y); + ctx.arc(x, y, shape.r0, 0, PI2, true); + } + }); + + + +/***/ }, +/* 66 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 多边形 + * @module zrender/shape/Polygon + */ + + + var polyHelper = __webpack_require__(67); + + module.exports = __webpack_require__(44).extend({ + + type: 'polygon', + + shape: { + points: null, + + smooth: false, + + smoothConstraint: null + }, + + buildPath: function (ctx, shape) { + polyHelper.buildPath(ctx, shape, true); + } + }); + + +/***/ }, +/* 67 */ +/***/ function(module, exports, __webpack_require__) { + + + + var smoothSpline = __webpack_require__(68); + var smoothBezier = __webpack_require__(69); + + module.exports = { + buildPath: function (ctx, shape, closePath) { + var points = shape.points; + var smooth = shape.smooth; + if (points && points.length >= 2) { + if (smooth && smooth !== 'spline') { + var controlPoints = smoothBezier( + points, smooth, closePath, shape.smoothConstraint + ); + + ctx.moveTo(points[0][0], points[0][1]); + var len = points.length; + for (var i = 0; i < (closePath ? len : len - 1); i++) { + var cp1 = controlPoints[i * 2]; + var cp2 = controlPoints[i * 2 + 1]; + var p = points[(i + 1) % len]; + ctx.bezierCurveTo( + cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1] + ); + } + } + else { + if (smooth === 'spline') { + points = smoothSpline(points, closePath); + } + + ctx.moveTo(points[0][0], points[0][1]); + for (var i = 1, l = points.length; i < l; i++) { + ctx.lineTo(points[i][0], points[i][1]); + } + } + + closePath && ctx.closePath(); + } + } + }; + + +/***/ }, +/* 68 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Catmull-Rom spline 插值折线 + * @module zrender/shape/util/smoothSpline + * @author pissang (https://www.github.com/pissang) + * Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + */ + + var vec2 = __webpack_require__(16); + + /** + * @inner + */ + function interpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; + } + + /** + * @alias module:zrender/shape/util/smoothSpline + * @param {Array} points 线段顶点数组 + * @param {boolean} isLoop + * @return {Array} + */ + module.exports = function (points, isLoop) { + var len = points.length; + var ret = []; + + var distance = 0; + for (var i = 1; i < len; i++) { + distance += vec2.distance(points[i - 1], points[i]); + } + + var segs = distance / 2; + segs = segs < len ? len : segs; + for (var i = 0; i < segs; i++) { + var pos = i / (segs - 1) * (isLoop ? len : len - 1); + var idx = Math.floor(pos); + + var w = pos - idx; + + var p0; + var p1 = points[idx % len]; + var p2; + var p3; + if (!isLoop) { + p0 = points[idx === 0 ? idx : idx - 1]; + p2 = points[idx > len - 2 ? len - 1 : idx + 1]; + p3 = points[idx > len - 3 ? len - 1 : idx + 2]; + } + else { + p0 = points[(idx - 1 + len) % len]; + p2 = points[(idx + 1) % len]; + p3 = points[(idx + 2) % len]; + } + + var w2 = w * w; + var w3 = w * w2; + + ret.push([ + interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3), + interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3) + ]); + } + return ret; + }; + + + +/***/ }, +/* 69 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 贝塞尔平滑曲线 + * @module zrender/shape/util/smoothBezier + * @author pissang (https://www.github.com/pissang) + * Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + */ + + + var vec2 = __webpack_require__(16); + var v2Min = vec2.min; + var v2Max = vec2.max; + var v2Scale = vec2.scale; + var v2Distance = vec2.distance; + var v2Add = vec2.add; + + /** + * 贝塞尔平滑曲线 + * @alias module:zrender/shape/util/smoothBezier + * @param {Array} points 线段顶点数组 + * @param {number} smooth 平滑等级, 0-1 + * @param {boolean} isLoop + * @param {Array} constraint 将计算出来的控制点约束在一个包围盒内 + * 比如 [[0, 0], [100, 100]], 这个包围盒会与 + * 整个折线的包围盒做一个并集用来约束控制点。 + * @param {Array} 计算出来的控制点数组 + */ + module.exports = function (points, smooth, isLoop, constraint) { + var cps = []; + + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + + var min, max; + if (constraint) { + min = [Infinity, Infinity]; + max = [-Infinity, -Infinity]; + for (var i = 0, len = points.length; i < len; i++) { + v2Min(min, min, points[i]); + v2Max(max, max, points[i]); + } + // 与指定的包围盒做并集 + v2Min(min, min, constraint[0]); + v2Max(max, max, constraint[1]); + } + + for (var i = 0, len = points.length; i < len; i++) { + var point = points[i]; + + if (isLoop) { + prevPoint = points[i ? i - 1 : len - 1]; + nextPoint = points[(i + 1) % len]; + } + else { + if (i === 0 || i === len - 1) { + cps.push(vec2.clone(points[i])); + continue; + } + else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + + vec2.sub(v, nextPoint, prevPoint); + + // use degree to scale the handle length + v2Scale(v, v, smooth); + + var d0 = v2Distance(point, prevPoint); + var d1 = v2Distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + + v2Scale(v1, v, -d0); + v2Scale(v2, v, d1); + var cp0 = v2Add([], point, v1); + var cp1 = v2Add([], point, v2); + if (constraint) { + v2Max(cp0, cp0, min); + v2Min(cp0, cp0, max); + v2Max(cp1, cp1, min); + v2Min(cp1, cp1, max); + } + cps.push(cp0); + cps.push(cp1); + } + + if (isLoop) { + cps.push(cps.shift()); + } + + return cps; + }; + + + +/***/ }, +/* 70 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/graphic/shape/Polyline + */ + + + var polyHelper = __webpack_require__(67); + + module.exports = __webpack_require__(44).extend({ + + type: 'polyline', + + shape: { + points: null, + + smooth: false, + + smoothConstraint: null + }, + + style: { + stroke: '#000', + + fill: null + }, + + buildPath: function (ctx, shape) { + polyHelper.buildPath(ctx, shape, false); + } + }); + + +/***/ }, +/* 71 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 矩形 + * @module zrender/graphic/shape/Rect + */ + + + var roundRectHelper = __webpack_require__(60); + + module.exports = __webpack_require__(44).extend({ + + type: 'rect', + + shape: { + // 左上、右上、右下、左下角的半径依次为r1、r2、r3、r4 + // r缩写为1 相当于 [1, 1, 1, 1] + // r缩写为[1] 相当于 [1, 1, 1, 1] + // r缩写为[1, 2] 相当于 [1, 2, 1, 2] + // r缩写为[1, 2, 3] 相当于 [1, 2, 3, 2] + r: 0, + + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + if (!shape.r) { + ctx.rect(x, y, width, height); + } + else { + roundRectHelper.buildPath(ctx, shape); + } + ctx.closePath(); + return; + } + }); + + + +/***/ }, +/* 72 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 直线 + * @module zrender/graphic/shape/Line + */ + + module.exports = __webpack_require__(44).extend({ + + type: 'line', + + shape: { + // Start point + x1: 0, + y1: 0, + // End point + x2: 0, + y2: 0, + + percent: 1 + }, + + style: { + stroke: '#000', + fill: null + }, + + buildPath: function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var percent = shape.percent; + + if (percent === 0) { + return; + } + + ctx.moveTo(x1, y1); + + if (percent < 1) { + x2 = x1 * (1 - percent) + x2 * percent; + y2 = y1 * (1 - percent) + y2 * percent; + } + ctx.lineTo(x2, y2); + }, + + /** + * Get point at percent + * @param {number} percent + * @return {Array.} + */ + pointAt: function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + } + }); + + + +/***/ }, +/* 73 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 贝塞尔曲线 + * @module zrender/shape/BezierCurve + */ + + + var curveTool = __webpack_require__(49); + var quadraticSubdivide = curveTool.quadraticSubdivide; + var cubicSubdivide = curveTool.cubicSubdivide; + var quadraticAt = curveTool.quadraticAt; + var cubicAt = curveTool.cubicAt; + + var out = []; + module.exports = __webpack_require__(44).extend({ + + type: 'bezier-curve', + + shape: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + cpx1: 0, + cpy1: 0, + // cpx2: 0, + // cpy2: 0 + + // Curve show percent, for animating + percent: 1 + }, + + style: { + stroke: '#000', + fill: null + }, + + buildPath: function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var cpx1 = shape.cpx1; + var cpy1 = shape.cpy1; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + var percent = shape.percent; + if (percent === 0) { + return; + } + + ctx.moveTo(x1, y1); + + if (cpx2 == null || cpy2 == null) { + if (percent < 1) { + quadraticSubdivide( + x1, cpx1, x2, percent, out + ); + cpx1 = out[1]; + x2 = out[2]; + quadraticSubdivide( + y1, cpy1, y2, percent, out + ); + cpy1 = out[1]; + y2 = out[2]; + } + + ctx.quadraticCurveTo( + cpx1, cpy1, + x2, y2 + ); + } + else { + if (percent < 1) { + cubicSubdivide( + x1, cpx1, cpx2, x2, percent, out + ); + cpx1 = out[1]; + cpx2 = out[2]; + x2 = out[3]; + cubicSubdivide( + y1, cpy1, cpy2, y2, percent, out + ); + cpy1 = out[1]; + cpy2 = out[2]; + y2 = out[3]; + } + ctx.bezierCurveTo( + cpx1, cpy1, + cpx2, cpy2, + x2, y2 + ); + } + }, + + /** + * Get point at percent + * @param {number} percent + * @return {Array.} + */ + pointAt: function (p) { + var shape = this.shape; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 === null || cpy2 === null) { + return [ + quadraticAt(shape.x1, shape.cpx1, shape.x2, p), + quadraticAt(shape.y1, shape.cpy1, shape.y2, p) + ]; + } + else { + return [ + cubicAt(shape.x1, shape.cpx1, shape.cpx1, shape.x2, p), + cubicAt(shape.y1, shape.cpy1, shape.cpy1, shape.y2, p) + ]; + } + } + }); + + + +/***/ }, +/* 74 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 圆弧 + * @module zrender/graphic/shape/Arc + */ + + + module.exports = __webpack_require__(44).extend({ + + type: 'arc', + + shape: { + + cx: 0, + + cy: 0, + + r: 0, + + startAngle: 0, + + endAngle: Math.PI * 2, + + clockwise: true + }, + + style: { + + stroke: '#000', + + fill: null + }, + + buildPath: function (ctx, shape) { + + var x = shape.cx; + var y = shape.cy; + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + + ctx.moveTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + } + }); + + +/***/ }, +/* 75 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var Gradient = __webpack_require__(4); + + /** + * x, y, x2, y2 are all percent from 0 to 1 + * @param {number} [x=0] + * @param {number} [y=0] + * @param {number} [x2=1] + * @param {number} [y2=0] + * @param {Array.} colorStops + */ + var LinearGradient = function (x, y, x2, y2, colorStops) { + this.x = x == null ? 0 : x; + + this.y = y == null ? 0 : y; + + this.x2 = x2 == null ? 1 : x2; + + this.y2 = y2 == null ? 0 : y2; + + Gradient.call(this, colorStops); + }; + + LinearGradient.prototype = { + + constructor: LinearGradient, + + type: 'linear', + + updateCanvasGradient: function (shape, ctx) { + var rect = shape.getBoundingRect(); + // var size = + var x = this.x * rect.width + rect.x; + var x2 = this.x2 * rect.width + rect.x; + var y = this.y * rect.height + rect.y; + var y2 = this.y2 * rect.height + rect.y; + + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + + var colorStops = this.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop( + colorStops[i].offset, colorStops[i].color + ); + } + + this.canvasGradient = canvasGradient; + } + + }; + + zrUtil.inherits(LinearGradient, Gradient); + + module.exports = LinearGradient; + + +/***/ }, +/* 76 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var Gradient = __webpack_require__(4); + + /** + * x, y, r are all percent from 0 to 1 + * @param {number} [x=0.5] + * @param {number} [y=0.5] + * @param {number} [r=0.5] + * @param {Array.} [colorStops] + */ + var RadialGradient = function (x, y, r, colorStops) { + this.x = x == null ? 0.5 : x; + + this.y = y == null ? 0.5 : y; + + this.r = r == null ? 0.5 : r; + + Gradient.call(this, colorStops); + }; + + RadialGradient.prototype = { + + constructor: RadialGradient, + + type: 'radial', + + updateCanvasGradient: function (shape, ctx) { + var rect = shape.getBoundingRect(); + + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + // var max = Math.max(width, height); + + var x = this.x * width + rect.x; + var y = this.y * height + rect.y; + var r = this.r * min; + + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + + var colorStops = this.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop( + colorStops[i].offset, colorStops[i].color + ); + } + + this.canvasGradient = canvasGradient; + } + }; + + zrUtil.inherits(RadialGradient, Gradient); + + module.exports = RadialGradient; + + +/***/ }, +/* 77 */ +/***/ function(module, exports, __webpack_require__) { + + /*! + * ZRender, a high performance 2d drawing library. + * + * Copyright (c) 2013, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt + */ + // Global defines + + var guid = __webpack_require__(31); + var env = __webpack_require__(78); + + var Handler = __webpack_require__(79); + var Storage = __webpack_require__(83); + var Animation = __webpack_require__(84); + + var useVML = !env.canvasSupported; + + var painterCtors = { + canvas: __webpack_require__(85) + }; + + var instances = {}; // ZRender实例map索引 + + var zrender = {}; + /** + * @type {string} + */ + zrender.version = '3.0.7'; + + /** + * Initializing a zrender instance + * @param {HTMLElement} dom + * @param {Object} opts + * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg' + * @param {number} [opts.devicePixelRatio] + * @return {module:zrender/ZRender} + */ + zrender.init = function(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances[zr.id] = zr; + return zr; + }; + + /** + * Dispose zrender instance + * @param {module:zrender/ZRender} zr + */ + zrender.dispose = function (zr) { + if (zr) { + zr.dispose(); + } + else { + for (var key in instances) { + instances[key].dispose(); + } + instances = {}; + } + + return zrender; + }; + + /** + * Get zrender instance by id + * @param {string} id zrender instance id + * @return {module:zrender/ZRender} + */ + zrender.getInstance = function (id) { + return instances[id]; + }; + + zrender.registerPainter = function (name, Ctor) { + painterCtors[name] = Ctor; + }; + + function delInstance(id) { + delete instances[id]; + } + + /** + * @module zrender/ZRender + */ + /** + * @constructor + * @alias module:zrender/ZRender + * @param {string} id + * @param {HTMLDomElement} dom + * @param {Object} opts + * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg' + * @param {number} [opts.devicePixelRatio] + */ + var ZRender = function(id, dom, opts) { + + opts = opts || {}; + + /** + * @type {HTMLDomElement} + */ + this.dom = dom; + + /** + * @type {string} + */ + this.id = id; + + var self = this; + var storage = new Storage(); + + var rendererType = opts.renderer; + if (useVML) { + if (!painterCtors.vml) { + throw new Error('You need to require \'zrender/vml/vml\' to support IE8'); + } + rendererType = 'vml'; + } + else if (!rendererType || !painterCtors[rendererType]) { + rendererType = 'canvas'; + } + var painter = new painterCtors[rendererType](dom, storage, opts); + + this.storage = storage; + this.painter = painter; + if (!env.node) { + this.handler = new Handler(painter.getViewportRoot(), storage, painter); + } + + /** + * @type {module:zrender/animation/Animation} + */ + this.animation = new Animation({ + stage: { + update: function () { + if (self._needsRefresh) { + self.refreshImmediately(); + } + } + } + }); + this.animation.start(); + + /** + * @type {boolean} + * @private + */ + this._needsRefresh; + + // 修改 storage.delFromMap, 每次删除元素之前删除动画 + // FIXME 有点ugly + var oldDelFromMap = storage.delFromMap; + var oldAddToMap = storage.addToMap; + + storage.delFromMap = function (elId) { + var el = storage.get(elId); + + oldDelFromMap.call(storage, elId); + + el && el.removeSelfFromZr(self); + }; + + storage.addToMap = function (el) { + oldAddToMap.call(storage, el); + + el.addSelfToZr(self); + }; + }; + + ZRender.prototype = { + + constructor: ZRender, + /** + * 获取实例唯一标识 + * @return {string} + */ + getId: function () { + return this.id; + }, + + /** + * 添加元素 + * @param {string|module:zrender/Element} el + */ + add: function (el) { + this.storage.addRoot(el); + this._needsRefresh = true; + }, + + /** + * 删除元素 + * @param {string|module:zrender/Element} el + */ + remove: function (el) { + this.storage.delRoot(el); + this._needsRefresh = true; + }, + + /** + * Change configuration of layer + * @param {string} zLevel + * @param {Object} config + * @param {string} [config.clearColor=0] Clear color + * @param {string} [config.motionBlur=false] If enable motion blur + * @param {number} [config.lastFrameAlpha=0.7] Motion blur factor. Larger value cause longer trailer + */ + configLayer: function (zLevel, config) { + this.painter.configLayer(zLevel, config); + this._needsRefresh = true; + }, + + /** + * Repaint the canvas immediately + */ + refreshImmediately: function () { + // Clear needsRefresh ahead to avoid something wrong happens in refresh + // Or it will cause zrender refreshes again and again. + this._needsRefresh = false; + this.painter.refresh(); + /** + * Avoid trigger zr.refresh in Element#beforeUpdate hook + */ + this._needsRefresh = false; + }, + + /** + * Mark and repaint the canvas in the next frame of browser + */ + refresh: function() { + this._needsRefresh = true; + }, + + /** + * Resize the canvas. + * Should be invoked when container size is changed + */ + resize: function() { + this.painter.resize(); + this.handler && this.handler.resize(); + }, + + /** + * Stop and clear all animation immediately + */ + clearAnimation: function () { + this.animation.clear(); + }, + + /** + * Get container width + */ + getWidth: function() { + return this.painter.getWidth(); + }, + + /** + * Get container height + */ + getHeight: function() { + return this.painter.getHeight(); + }, + + /** + * Export the canvas as Base64 URL + * @param {string} type + * @param {string} [backgroundColor='#fff'] + * @return {string} Base64 URL + */ + toDataURL: function(type, backgroundColor, args) { + return this.painter.toDataURL(type, backgroundColor, args); + }, + + /** + * Converting a path to image. + * It has much better performance of drawing image rather than drawing a vector path. + * @param {module:zrender/graphic/Path} e + * @param {number} width + * @param {number} height + */ + pathToImage: function(e, width, height) { + var id = guid(); + return this.painter.pathToImage(id, e, width, height); + }, + + /** + * Set default cursor + * @param {string} cursorStyle 例如 crosshair + */ + setDefaultCursorStyle: function (cursorStyle) { + this.handler.setDefaultCursorStyle(cursorStyle); + }, + + /** + * Bind event + * + * @param {string} eventName Event name + * @param {Function} eventHandler Handler function + * @param {Object} [context] Context object + */ + on: function(eventName, eventHandler, context) { + this.handler && this.handler.on(eventName, eventHandler, context); + }, + + /** + * Unbind event + * @param {string} eventName Event name + * @param {Function} [eventHandler] Handler function + */ + off: function(eventName, eventHandler) { + this.handler && this.handler.off(eventName, eventHandler); + }, + + /** + * Trigger event manually + * + * @param {string} eventName Event name + * @param {event=} event Event object + */ + trigger: function (eventName, event) { + this.handler && this.handler.trigger(eventName, event); + }, + + + /** + * Clear all objects and the canvas. + */ + clear: function () { + this.storage.delRoot(); + this.painter.clear(); + }, + + /** + * Dispose self. + */ + dispose: function () { + this.animation.stop(); + + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler && this.handler.dispose(); + + this.animation = + this.storage = + this.painter = + this.handler = null; + + delInstance(this.id); + } + }; + + module.exports = zrender; + + + +/***/ }, +/* 78 */ +/***/ function(module, exports) { + + /** + * echarts设备环境识别 + * + * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 + * @author firede[firede@firede.us] + * @desc thanks zepto. + */ + + var env = {}; + if (typeof navigator === 'undefined') { + // In node + env = { + browser: {}, + os: {}, + node: true, + // Assume canvas is supported + canvasSupported: true + }; + } + else { + env = detect(navigator.userAgent); + } + + module.exports = env; + + // Zepto.js + // (c) 2010-2013 Thomas Fuchs + // Zepto.js may be freely distributed under the MIT license. + + function detect(ua) { + var os = {}; + var browser = {}; + var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/); + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); + var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/); + var touchpad = webos && ua.match(/TouchPad/); + var kindle = ua.match(/Kindle\/([\d.]+)/); + var silk = ua.match(/Silk\/([\d._]+)/); + var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); + var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/); + var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/); + var playbook = ua.match(/PlayBook/); + var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/); + var firefox = ua.match(/Firefox\/([\d.]+)/); + var safari = webkit && ua.match(/Mobile\//) && !chrome; + var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome; + var ie = ua.match(/MSIE\s([\d.]+)/) + // IE 11 Trident/7.0; rv:11.0 + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge\/([\d.]+)/); // IE 12 and 12+ + + // Todo: clean this up with a better OS/browser seperation: + // - discern (more) between multiple browsers on android + // - decide if kindle fire in silk mode is android or not + // - Firefox on Android doesn't specify the Android version + // - possibly devide in os, device and browser hashes + + if (browser.webkit = !!webkit) browser.version = webkit[1]; + + if (android) os.android = true, os.version = android[2]; + if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.'); + if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.'); + if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + if (webos) os.webos = true, os.version = webos[2]; + if (touchpad) os.touchpad = true; + if (blackberry) os.blackberry = true, os.version = blackberry[2]; + if (bb10) os.bb10 = true, os.version = bb10[2]; + if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2]; + if (playbook) browser.playbook = true; + if (kindle) os.kindle = true, os.version = kindle[1]; + if (silk) browser.silk = true, browser.version = silk[1]; + if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true; + if (chrome) browser.chrome = true, browser.version = chrome[1]; + if (firefox) browser.firefox = true, browser.version = firefox[1]; + if (ie) browser.ie = true, browser.version = ie[1]; + if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true; + if (webview) browser.webview = true; + if (ie) browser.ie = true, browser.version = ie[1]; + if (edge) browser.edge = true, browser.version = edge[1]; + + os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || + (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/))); + os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || blackberry || bb10 || + (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || + (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/)))); + + return { + browser: browser, + os: os, + node: false, + // 原生canvas支持,改极端点了 + // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9) + canvasSupported : document.createElement('canvas').getContext ? true : false, + // @see + // works on most browsers + // IE10/11 does not support touch event, and MS Edge supports them but not by + // default, so we dont check navigator.maxTouchPoints for them here. + touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge, + // . + pointerEventsSupported: 'onpointerdown' in window + // Firefox supports pointer but not by default, + // only MS browsers are reliable on pointer events currently. + && (browser.edge || (browser.ie && browser.version >= 10)) + }; + } + + +/***/ }, +/* 79 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Handler + * @module zrender/Handler + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + * pissang (shenyi.914@gmail.com) + */ + + + var env = __webpack_require__(78); + var eventTool = __webpack_require__(80); + var util = __webpack_require__(3); + var Draggable = __webpack_require__(81); + var GestureMgr = __webpack_require__(82); + + var Eventful = __webpack_require__(32); + + var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout' + ]; + !usePointerEvent() && mouseHandlerNames.push( + 'mouseup', 'mousedown', 'mousemove' + ); + + var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' + ]; + + var pointerHandlerNames = [ + 'pointerdown', 'pointerup', 'pointermove' + ]; + + var TOUCH_CLICK_DELAY = 300; + + // touch指尖错觉的尝试偏移量配置 + // var MOBILE_TOUCH_OFFSETS = [ + // { x: 10 }, + // { x: -20 }, + // { x: 10, y: 10 }, + // { y: -20 } + // ]; + + var addEventListener = eventTool.addEventListener; + var removeEventListener = eventTool.removeEventListener; + var normalizeEvent = eventTool.normalizeEvent; + + function makeEventPacket(eveType, target, event) { + return { + type: eveType, + event: event, + target: target, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta + }; + } + + var domHandlers = { + /** + * Mouse move handler + * @inner + * @param {Event} event + */ + mousemove: function (event) { + event = normalizeEvent(this.root, event); + + var x = event.zrX; + var y = event.zrY; + + var hovered = this.findHover(x, y, null); + var lastHovered = this._hovered; + + this._hovered = hovered; + + this.root.style.cursor = hovered ? hovered.cursor : this._defaultCursorStyle; + // Mouse out on previous hovered element + if (lastHovered && hovered !== lastHovered && lastHovered.__zr) { + this._dispatchProxy(lastHovered, 'mouseout', event); + } + + // Mouse moving on one element + this._dispatchProxy(hovered, 'mousemove', event); + + // Mouse over on a new element + if (hovered && hovered !== lastHovered) { + this._dispatchProxy(hovered, 'mouseover', event); + } + }, + + /** + * Mouse out handler + * @inner + * @param {Event} event + */ + mouseout: function (event) { + event = normalizeEvent(this.root, event); + + var element = event.toElement || event.relatedTarget; + if (element != this.root) { + while (element && element.nodeType != 9) { + // 忽略包含在root中的dom引起的mouseOut + if (element === this.root) { + return; + } + + element = element.parentNode; + } + } + + this._dispatchProxy(this._hovered, 'mouseout', event); + + this.trigger('globalout', { + event: event + }); + }, + + /** + * Touch开始响应函数 + * @inner + * @param {Event} event + */ + touchstart: function (event) { + // FIXME + // 移动端可能需要default行为,例如静态图表时。 + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + this._lastTouchMoment = new Date(); + + processGesture(this, event, 'start'); + + // 平板补充一次findHover + // this._mobileFindFixed(event); + // Trigger mousemove and mousedown + domHandlers.mousemove.call(this, event); + + domHandlers.mousedown.call(this, event); + + setTouchTimer(this); + }, + + /** + * Touch移动响应函数 + * @inner + * @param {Event} event + */ + touchmove: function (event) { + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + processGesture(this, event, 'change'); + + // Mouse move should always be triggered no matter whether + // there is gestrue event, because mouse move and pinch may + // be used at the same time. + domHandlers.mousemove.call(this, event); + + setTouchTimer(this); + }, + + /** + * Touch结束响应函数 + * @inner + * @param {Event} event + */ + touchend: function (event) { + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + processGesture(this, event, 'end'); + + domHandlers.mouseup.call(this, event); + + // click event should always be triggered no matter whether + // there is gestrue event. System click can not be prevented. + if (+new Date() - this._lastTouchMoment < TOUCH_CLICK_DELAY) { + // this._mobileFindFixed(event); + domHandlers.click.call(this, event); + } + + setTouchTimer(this); + } + }; + + // Common handlers + util.each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick'], function (name) { + domHandlers[name] = function (event) { + event = normalizeEvent(this.root, event); + // Find hover again to avoid click event is dispatched manually. Or click is triggered without mouseover + var hovered = this.findHover(event.zrX, event.zrY, null); + this._dispatchProxy(hovered, name, event); + }; + }); + + // Pointer event handlers + // util.each(['pointerdown', 'pointermove', 'pointerup'], function (name) { + // domHandlers[name] = function (event) { + // var mouseName = name.replace('pointer', 'mouse'); + // domHandlers[mouseName].call(this, event); + // }; + // }); + + function processGesture(zrHandler, event, stage) { + var gestureMgr = zrHandler._gestureMgr; + + stage === 'start' && gestureMgr.clear(); + + var gestureInfo = gestureMgr.recognize( + event, + zrHandler.findHover(event.zrX, event.zrY, null) + ); + + stage === 'end' && gestureMgr.clear(); + + if (gestureInfo) { + // eventTool.stop(event); + var type = gestureInfo.type; + event.gestureEvent = type; + + zrHandler._dispatchProxy(gestureInfo.target, type, gestureInfo.event); + } + } + + /** + * 为控制类实例初始化dom 事件处理函数 + * + * @inner + * @param {module:zrender/Handler} instance 控制类实例 + */ + function initDomHandler(instance) { + var handlerNames = touchHandlerNames.concat(pointerHandlerNames); + for (var i = 0; i < handlerNames.length; i++) { + var name = handlerNames[i]; + instance._handlers[name] = util.bind(domHandlers[name], instance); + } + + for (var i = 0; i < mouseHandlerNames.length; i++) { + var name = mouseHandlerNames[i]; + instance._handlers[name] = makeMouseHandler(domHandlers[name], instance); + } + + function makeMouseHandler(fn, instance) { + return function () { + if (instance._touching) { + return; + } + return fn.apply(instance, arguments); + }; + } + } + + /** + * @alias module:zrender/Handler + * @constructor + * @extends module:zrender/mixin/Eventful + * @param {HTMLElement} root Main HTML element for painting. + * @param {module:zrender/Storage} storage Storage instance. + * @param {module:zrender/Painter} painter Painter instance. + */ + var Handler = function(root, storage, painter) { + Eventful.call(this); + + this.root = root; + this.storage = storage; + this.painter = painter; + + /** + * @private + * @type {boolean} + */ + this._hovered; + + /** + * @private + * @type {Date} + */ + this._lastTouchMoment; + + /** + * @private + * @type {number} + */ + this._lastX; + + /** + * @private + * @type {number} + */ + this._lastY; + + /** + * @private + * @type {string} + */ + this._defaultCursorStyle = 'default'; + + /** + * @private + * @type {module:zrender/core/GestureMgr} + */ + this._gestureMgr = new GestureMgr(); + + /** + * @private + * @type {Array.} + */ + this._handlers = []; + + /** + * @private + * @type {boolean} + */ + this._touching = false; + + /** + * @private + * @type {number} + */ + this._touchTimer; + + initDomHandler(this); + + if (usePointerEvent()) { + mountHandlers(pointerHandlerNames, this); + } + else if (useTouchEvent()) { + mountHandlers(touchHandlerNames, this); + + // Handler of 'mouseout' event is needed in touch mode, which will be mounted below. + // addEventListener(root, 'mouseout', this._mouseoutHandler); + } + + // Considering some devices that both enable touch and mouse event (like MS Surface + // and lenovo X240, @see #2350), we make mouse event be always listened, otherwise + // mouse event can not be handle in those devices. + mountHandlers(mouseHandlerNames, this); + + Draggable.call(this); + + function mountHandlers(handlerNames, instance) { + util.each(handlerNames, function (name) { + addEventListener(root, eventNameFix(name), instance._handlers[name]); + }, instance); + } + }; + + Handler.prototype = { + + constructor: Handler, + + /** + * Resize + */ + resize: function (event) { + this._hovered = null; + }, + + /** + * Dispatch event + * @param {string} eventName + * @param {event=} eventArgs + */ + dispatch: function (eventName, eventArgs) { + var handler = this._handlers[eventName]; + handler && handler.call(this, eventArgs); + }, + + /** + * Dispose + */ + dispose: function () { + var root = this.root; + + var handlerNames = mouseHandlerNames.concat(touchHandlerNames); + + for (var i = 0; i < handlerNames.length; i++) { + var name = handlerNames[i]; + removeEventListener(root, eventNameFix(name), this._handlers[name]); + } + + this.root = + this.storage = + this.painter = null; + }, + + /** + * 设置默认的cursor style + * @param {string} cursorStyle 例如 crosshair + */ + setDefaultCursorStyle: function (cursorStyle) { + this._defaultCursorStyle = cursorStyle; + }, + + /** + * 事件分发代理 + * + * @private + * @param {Object} targetEl 目标图形元素 + * @param {string} eventName 事件名称 + * @param {Object} event 事件对象 + */ + _dispatchProxy: function (targetEl, eventName, event) { + var eventHandler = 'on' + eventName; + var eventPacket = makeEventPacket(eventName, targetEl, event); + + var el = targetEl; + + while (el) { + el[eventHandler] + && (eventPacket.cancelBubble = el[eventHandler].call(el, eventPacket)); + + el.trigger(eventName, eventPacket); + + el = el.parent; + + if (eventPacket.cancelBubble) { + break; + } + } + + if (!eventPacket.cancelBubble) { + // 冒泡到顶级 zrender 对象 + this.trigger(eventName, eventPacket); + // 分发事件到用户自定义层 + // 用户有可能在全局 click 事件中 dispose,所以需要判断下 painter 是否存在 + this.painter && this.painter.eachOtherLayer(function (layer) { + if (typeof(layer[eventHandler]) == 'function') { + layer[eventHandler].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + }, + + /** + * @private + * @param {number} x + * @param {number} y + * @param {module:zrender/graphic/Displayable} exclude + * @method + */ + findHover: function(x, y, exclude) { + var list = this.storage.getDisplayList(); + for (var i = list.length - 1; i >= 0 ; i--) { + if (!list[i].silent + && list[i] !== exclude + // getDisplayList may include ignored item in VML mode + && !list[i].ignore + && isHover(list[i], x, y)) { + return list[i]; + } + } + } + }; + + function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var p = displayable.parent; + while (p) { + if (p.clipPath && !p.clipPath.contain(x, y)) { + // Clipped by parents + return false; + } + p = p.parent; + } + return true; + } + + return false; + } + + /** + * Prevent mouse event from being dispatched after Touch Events action + * @see + * 1. Mobile browsers dispatch mouse events 300ms after touchend. + * 2. Chrome for Android dispatch mousedown for long-touch about 650ms + * Result: Blocking Mouse Events for 700ms. + */ + function setTouchTimer(instance) { + instance._touching = true; + clearTimeout(instance._touchTimer); + instance._touchTimer = setTimeout(function () { + instance._touching = false; + }, 700); + } + + /** + * Althought MS Surface support screen touch, IE10/11 do not support + * touch event and MS Edge supported them but not by default (but chrome + * and firefox do). Thus we use Pointer event on MS browsers to handle touch. + */ + function usePointerEvent() { + // TODO + // pointermove event dont trigger when using finger. + // We may figger it out latter. + return false; + // return env.pointerEventsSupported + // In no-touch device we dont use pointer evnets but just + // use mouse event for avoiding problems. + // && window.navigator.maxTouchPoints; + } + + function useTouchEvent() { + return env.touchEventsSupported; + } + + function eventNameFix(name) { + return (name === 'mousewheel' && env.browser.firefox) ? 'DOMMouseScroll' : name; + } + + util.mixin(Handler, Eventful); + util.mixin(Handler, Draggable); + + module.exports = Handler; + + +/***/ }, +/* 80 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 事件辅助类 + * @module zrender/core/event + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + + + var Eventful = __webpack_require__(32); + + var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener; + + function getBoundingClientRect(el) { + // BlackBerry 5, iOS 3 (original iPhone) don't have getBoundingRect + return el.getBoundingClientRect ? el.getBoundingClientRect() : { left: 0, top: 0}; + } + /** + * 如果存在第三方嵌入的一些dom触发的事件,或touch事件,需要转换一下事件坐标 + */ + function normalizeEvent(el, e) { + + e = e || window.event; + + if (e.zrX != null) { + return e; + } + + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + + if (!isTouch) { + var box = getBoundingClientRect(el); + e.zrX = e.clientX - box.left; + e.zrY = e.clientY - box.top; + e.zrDelta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3; + } + else { + var touch = eventType != 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + if (touch) { + var rBounding = getBoundingClientRect(el); + // touch事件坐标是全屏的~ + e.zrX = touch.clientX - rBounding.left; + e.zrY = touch.clientY - rBounding.top; + } + } + + return e; + } + + function addEventListener(el, name, handler) { + if (isDomLevel2) { + el.addEventListener(name, handler); + } + else { + el.attachEvent('on' + name, handler); + } + } + + function removeEventListener(el, name, handler) { + if (isDomLevel2) { + el.removeEventListener(name, handler); + } + else { + el.detachEvent('on' + name, handler); + } + } + + /** + * 停止冒泡和阻止默认行为 + * @memberOf module:zrender/core/event + * @method + * @param {Event} e : event对象 + */ + var stop = isDomLevel2 + ? function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + } + : function (e) { + e.returnValue = false; + e.cancelBubble = true; + }; + + module.exports = { + normalizeEvent: normalizeEvent, + addEventListener: addEventListener, + removeEventListener: removeEventListener, + + stop: stop, + // 做向上兼容 + Dispatcher: Eventful + }; + + + +/***/ }, +/* 81 */ +/***/ function(module, exports) { + + // TODO Draggable for group + // FIXME Draggable on element which has parent rotation or scale + + function Draggable() { + + this.on('mousedown', this._dragStart, this); + this.on('mousemove', this._drag, this); + this.on('mouseup', this._dragEnd, this); + this.on('globalout', this._dragEnd, this); + // this._dropTarget = null; + // this._draggingTarget = null; + + // this._x = 0; + // this._y = 0; + } + + Draggable.prototype = { + + constructor: Draggable, + + _dragStart: function (e) { + var draggingTarget = e.target; + if (draggingTarget && draggingTarget.draggable) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + + this._dispatchProxy(draggingTarget, 'dragstart', e.event); + } + }, + + _drag: function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + + var x = e.offsetX; + var y = e.offsetY; + + var dx = x - this._x; + var dy = y - this._y; + this._x = x; + this._y = y; + + draggingTarget.drift(dx, dy, e); + this._dispatchProxy(draggingTarget, 'drag', e.event); + + var dropTarget = this.findHover(x, y, draggingTarget); + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this._dispatchProxy(lastDropTarget, 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this._dispatchProxy(dropTarget, 'dragenter', e.event); + } + } + } + }, + + _dragEnd: function (e) { + var draggingTarget = this._draggingTarget; + + if (draggingTarget) { + draggingTarget.dragging = false; + } + + this._dispatchProxy(draggingTarget, 'dragend', e.event); + + if (this._dropTarget) { + this._dispatchProxy(this._dropTarget, 'drop', e.event); + } + + this._draggingTarget = null; + this._dropTarget = null; + } + + }; + + module.exports = Draggable; + + +/***/ }, +/* 82 */ +/***/ function(module, exports) { + + 'use strict'; + /** + * Only implements needed gestures for mobile. + */ + + + var GestureMgr = function () { + + /** + * @private + * @type {Array.} + */ + this._track = []; + }; + + GestureMgr.prototype = { + + constructor: GestureMgr, + + recognize: function (event, target) { + this._doTrack(event, target); + return this._recognize(event); + }, + + clear: function () { + this._track.length = 0; + return this; + }, + + _doTrack: function (event, target) { + var touches = event.touches; + + if (!touches) { + return; + } + + var trackItem = { + points: [], + touches: [], + target: target, + event: event + }; + + for (var i = 0, len = touches.length; i < len; i++) { + var touch = touches[i]; + trackItem.points.push([touch.clientX, touch.clientY]); + trackItem.touches.push(touch); + } + + this._track.push(trackItem); + }, + + _recognize: function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + } + }; + + function dist(pointPair) { + var dx = pointPair[1][0] - pointPair[0][0]; + var dy = pointPair[1][1] - pointPair[0][1]; + + return Math.sqrt(dx * dx + dy * dy); + } + + function center(pointPair) { + return [ + (pointPair[0][0] + pointPair[1][0]) / 2, + (pointPair[0][1] + pointPair[1][1]) / 2 + ]; + } + + var recognizers = { + + pinch: function (track, event) { + var trackLen = track.length; + + if (!trackLen) { + return; + } + + var pinchEnd = (track[trackLen - 1] || {}).points; + var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd; + + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1 + ) { + var pinchScale = dist(pinchEnd) / dist(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + + event.pinchScale = pinchScale; + + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + + return { + type: 'pinch', + target: track[0].target, + event: event + }; + } + } + + // Only pinch currently. + }; + + module.exports = GestureMgr; + + + +/***/ }, +/* 83 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Storage内容仓库模块 + * @module zrender/Storage + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * @author errorrik (errorrik@gmail.com) + * @author pissang (https://github.com/pissang/) + */ + + + var util = __webpack_require__(3); + + var Group = __webpack_require__(29); + + function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + if (a.z2 === b.z2) { + return a.__renderidx - b.__renderidx; + } + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; + } + /** + * 内容仓库 (M) + * @alias module:zrender/Storage + * @constructor + */ + var Storage = function () { + // 所有常规形状,id索引的map + this._elements = {}; + + this._roots = []; + + this._displayList = []; + + this._displayListLen = 0; + }; + + Storage.prototype = { + + constructor: Storage, + + /** + * 返回所有图形的绘制队列 + * @param {boolean} [update=false] 是否在返回前更新该数组 + * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组, 在 update 为 true 的时候有效 + * + * 详见{@link module:zrender/graphic/Displayable.prototype.updateDisplayList} + * @return {Array.} + */ + getDisplayList: function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + if (update) { + this.updateDisplayList(includeIgnore); + } + return this._displayList; + }, + + /** + * 更新图形的绘制队列。 + * 每次绘制前都会调用,该方法会先深度优先遍历整个树,更新所有Group和Shape的变换并且把所有可见的Shape保存到数组中, + * 最后根据绘制的优先级(zlevel > z > 插入顺序)排序得到绘制队列 + * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组 + */ + updateDisplayList: function (includeIgnore) { + this._displayListLen = 0; + var roots = this._roots; + var displayList = this._displayList; + for (var i = 0, len = roots.length; i < len; i++) { + this._updateAndAddDisplayable(roots[i], null, includeIgnore); + } + displayList.length = this._displayListLen; + + for (var i = 0, len = displayList.length; i < len; i++) { + displayList[i].__renderidx = i; + } + + displayList.sort(shapeCompareFunc); + }, + + _updateAndAddDisplayable: function (el, clipPaths, includeIgnore) { + + if (el.ignore && !includeIgnore) { + return; + } + + el.beforeUpdate(); + + el.update(); + + el.afterUpdate(); + + var clipPath = el.clipPath; + if (clipPath) { + // clipPath 的变换是基于 group 的变换 + clipPath.parent = el; + clipPath.updateTransform(); + + // FIXME 效率影响 + if (clipPaths) { + clipPaths = clipPaths.slice(); + clipPaths.push(clipPath); + } + else { + clipPaths = [clipPath]; + } + } + + if (el.type == 'group') { + var children = el._children; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + + // Force to mark as dirty if group is dirty + // FIXME __dirtyPath ? + child.__dirty = el.__dirty || child.__dirty; + + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + + // Mark group clean here + el.__dirty = false; + + } + else { + el.__clipPaths = clipPaths; + + this._displayList[this._displayListLen++] = el; + } + }, + + /** + * 添加图形(Shape)或者组(Group)到根节点 + * @param {module:zrender/Element} el + */ + addRoot: function (el) { + // Element has been added + if (this._elements[el.id]) { + return; + } + + if (el instanceof Group) { + el.addChildrenToStorage(this); + } + + this.addToMap(el); + this._roots.push(el); + }, + + /** + * 删除指定的图形(Shape)或者组(Group) + * @param {string|Array.} [elId] 如果为空清空整个Storage + */ + delRoot: function (elId) { + if (elId == null) { + // 不指定elId清空 + for (var i = 0; i < this._roots.length; i++) { + var root = this._roots[i]; + if (root instanceof Group) { + root.delChildrenFromStorage(this); + } + } + + this._elements = {}; + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + + return; + } + + if (elId instanceof Array) { + for (var i = 0, l = elId.length; i < l; i++) { + this.delRoot(elId[i]); + } + return; + } + + var el; + if (typeof(elId) == 'string') { + el = this._elements[elId]; + } + else { + el = elId; + } + + var idx = util.indexOf(this._roots, el); + if (idx >= 0) { + this.delFromMap(el.id); + this._roots.splice(idx, 1); + if (el instanceof Group) { + el.delChildrenFromStorage(this); + } + } + }, + + addToMap: function (el) { + if (el instanceof Group) { + el.__storage = this; + } + el.dirty(); + + this._elements[el.id] = el; + + return this; + }, + + get: function (elId) { + return this._elements[elId]; + }, + + delFromMap: function (elId) { + var elements = this._elements; + var el = elements[elId]; + if (el) { + delete elements[elId]; + if (el instanceof Group) { + el.__storage = null; + } + } + + return this; + }, + + /** + * 清空并且释放Storage + */ + dispose: function () { + this._elements = + this._renderList = + this._roots = null; + } + }; + + module.exports = Storage; + + + +/***/ }, +/* 84 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 动画主类, 调度和管理所有动画控制器 + * + * @module zrender/animation/Animation + * @author pissang(https://github.com/pissang) + */ + // TODO Additive animation + // http://iosoteric.com/additive-animations-animatewithduration-in-ios-8/ + // https://developer.apple.com/videos/wwdc2014/#236 + + + var util = __webpack_require__(3); + var Dispatcher = __webpack_require__(80).Dispatcher; + + var requestAnimationFrame = (typeof window !== 'undefined' && + (window.requestAnimationFrame + || window.msRequestAnimationFrame + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame)) + || function (func) { + setTimeout(func, 16); + }; + + var Animator = __webpack_require__(35); + /** + * @typedef {Object} IZRenderStage + * @property {Function} update + */ + + /** + * @alias module:zrender/animation/Animation + * @constructor + * @param {Object} [options] + * @param {Function} [options.onframe] + * @param {IZRenderStage} [options.stage] + * @example + * var animation = new Animation(); + * var obj = { + * x: 100, + * y: 100 + * }; + * animation.animate(node.position) + * .when(1000, { + * x: 500, + * y: 500 + * }) + * .when(2000, { + * x: 100, + * y: 100 + * }) + * .start('spline'); + */ + var Animation = function (options) { + + options = options || {}; + + this.stage = options.stage || {}; + + this.onframe = options.onframe || function() {}; + + // private properties + this._clips = []; + + this._running = false; + + this._time = 0; + + Dispatcher.call(this); + }; + + Animation.prototype = { + + constructor: Animation, + /** + * 添加 clip + * @param {module:zrender/animation/Clip} clip + */ + addClip: function (clip) { + this._clips.push(clip); + }, + /** + * 添加 animator + * @param {module:zrender/animation/Animator} animator + */ + addAnimator: function (animator) { + animator.animation = this; + var clips = animator.getClips(); + for (var i = 0; i < clips.length; i++) { + this.addClip(clips[i]); + } + }, + /** + * 删除动画片段 + * @param {module:zrender/animation/Clip} clip + */ + removeClip: function(clip) { + var idx = util.indexOf(this._clips, clip); + if (idx >= 0) { + this._clips.splice(idx, 1); + } + }, + + /** + * 删除动画片段 + * @param {module:zrender/animation/Animator} animator + */ + removeAnimator: function (animator) { + var clips = animator.getClips(); + for (var i = 0; i < clips.length; i++) { + this.removeClip(clips[i]); + } + animator.animation = null; + }, + + _update: function() { + + var time = new Date().getTime(); + var delta = time - this._time; + var clips = this._clips; + var len = clips.length; + + var deferredEvents = []; + var deferredClips = []; + for (var i = 0; i < len; i++) { + var clip = clips[i]; + var e = clip.step(time); + // Throw out the events need to be called after + // stage.update, like destroy + if (e) { + deferredEvents.push(e); + deferredClips.push(clip); + } + } + + // Remove the finished clip + for (var i = 0; i < len;) { + if (clips[i]._needsRemove) { + clips[i] = clips[len - 1]; + clips.pop(); + len--; + } + else { + i++; + } + } + + len = deferredEvents.length; + for (var i = 0; i < len; i++) { + deferredClips[i].fire(deferredEvents[i]); + } + + this._time = time; + + this.onframe(delta); + + this.trigger('frame', delta); + + if (this.stage.update) { + this.stage.update(); + } + }, + /** + * 开始运行动画 + */ + start: function () { + var self = this; + + this._running = true; + + function step() { + if (self._running) { + + requestAnimationFrame(step); + + self._update(); + } + } + + this._time = new Date().getTime(); + requestAnimationFrame(step); + }, + /** + * 停止运行动画 + */ + stop: function () { + this._running = false; + }, + /** + * 清除所有动画片段 + */ + clear: function () { + this._clips = []; + }, + /** + * 对一个目标创建一个animator对象,可以指定目标中的属性使用动画 + * @param {Object} target + * @param {Object} options + * @param {boolean} [options.loop=false] 是否循环播放动画 + * @param {Function} [options.getter=null] + * 如果指定getter函数,会通过getter函数取属性值 + * @param {Function} [options.setter=null] + * 如果指定setter函数,会通过setter函数设置属性值 + * @return {module:zrender/animation/Animation~Animator} + */ + animate: function (target, options) { + options = options || {}; + var animator = new Animator( + target, + options.loop, + options.getter, + options.setter + ); + + return animator; + } + }; + + util.mixin(Animation, Dispatcher); + + module.exports = Animation; + + + +/***/ }, +/* 85 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Default canvas painter + * @module zrender/Painter + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + * pissang (https://www.github.com/pissang) + */ + + + var config = __webpack_require__(40); + var util = __webpack_require__(3); + var log = __webpack_require__(39); + var BoundingRect = __webpack_require__(15); + + var Layer = __webpack_require__(86); + + function parseInt10(val) { + return parseInt(val, 10); + } + + function isLayerValid(layer) { + if (!layer) { + return false; + } + + if (layer.isBuildin) { + return true; + } + + if (typeof(layer.resize) !== 'function' + || typeof(layer.refresh) !== 'function' + ) { + return false; + } + + return true; + } + + function preProcessLayer(layer) { + layer.__unusedCount++; + } + + function postProcessLayer(layer) { + layer.__dirty = false; + if (layer.__unusedCount == 1) { + layer.clear(); + } + } + + var tmpRect = new BoundingRect(0, 0, 0, 0); + var viewRect = new BoundingRect(0, 0, 0, 0); + function isDisplayableCulled(el, width, height) { + tmpRect.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect.applyTransform(el.transform); + } + viewRect.width = width; + viewRect.height = height; + return !tmpRect.intersect(viewRect); + } + + function isClipPathChanged(clipPaths, prevClipPaths) { + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } + } + + function doClip(clipPaths, ctx) { + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + var m; + if (clipPath.transform) { + m = clipPath.transform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + var path = clipPath.path; + path.beginPath(ctx); + clipPath.buildPath(path, clipPath.shape); + ctx.clip(); + // Transform back + if (clipPath.transform) { + m = clipPath.invTransform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + } + } + + /** + * @alias module:zrender/Painter + * @constructor + * @param {HTMLElement} root 绘图容器 + * @param {module:zrender/Storage} storage + * @param {Ojbect} opts + */ + var Painter = function (root, storage, opts) { + var singleCanvas = !root.nodeName // In node ? + || root.nodeName.toUpperCase() === 'CANVAS'; + + opts = opts || {}; + + /** + * @type {number} + */ + this.dpr = opts.devicePixelRatio || config.devicePixelRatio; + /** + * @type {boolean} + * @private + */ + this._singleCanvas = singleCanvas; + /** + * 绘图容器 + * @type {HTMLElement} + */ + this.root = root; + + var rootStyle = root.style; + + // In node environment using node-canvas + if (rootStyle) { + rootStyle['-webkit-tap-highlight-color'] = 'transparent'; + rootStyle['-webkit-user-select'] = 'none'; + rootStyle['user-select'] = 'none'; + rootStyle['-webkit-touch-callout'] = 'none'; + + root.innerHTML = ''; + } + + /** + * @type {module:zrender/Storage} + */ + this.storage = storage; + + if (!singleCanvas) { + var width = this._getWidth(); + var height = this._getHeight(); + this._width = width; + this._height = height; + + var domRoot = document.createElement('div'); + this._domRoot = domRoot; + var domRootStyle = domRoot.style; + + // domRoot.onselectstart = returnFalse; // 避免页面选中的尴尬 + domRootStyle.position = 'relative'; + domRootStyle.overflow = 'hidden'; + domRootStyle.width = this._width + 'px'; + domRootStyle.height = this._height + 'px'; + root.appendChild(domRoot); + + /** + * @type {Object.} + * @private + */ + this._layers = {}; + /** + * @type {Array.} + * @private + */ + this._zlevelList = []; + } + else { + // Use canvas width and height directly + var width = root.width; + var height = root.height; + this._width = width; + this._height = height; + + // Create layer if only one given canvas + // Device pixel ratio is fixed to 1 because given canvas has its specified width and height + var mainLayer = new Layer(root, this, 1); + mainLayer.initContext(); + // FIXME Use canvas width and height + // mainLayer.resize(width, height); + this._layers = { + 0: mainLayer + }; + this._zlevelList = [0]; + } + + this._layerConfig = {}; + + this.pathToImage = this._createPathToImage(); + }; + + Painter.prototype = { + + constructor: Painter, + + /** + * If painter use a single canvas + * @return {boolean} + */ + isSingleCanvas: function () { + return this._singleCanvas; + }, + /** + * @return {HTMLDivElement} + */ + getViewportRoot: function () { + return this._singleCanvas ? this._layers[0].dom : this._domRoot; + }, + + /** + * 刷新 + * @param {boolean} [paintAll=false] 强制绘制所有displayable + */ + refresh: function (paintAll) { + var list = this.storage.getDisplayList(true); + var zlevelList = this._zlevelList; + + this._paintList(list, paintAll); + + // Paint custum layers + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.isBuildin && layer.refresh) { + layer.refresh(); + } + } + + return this; + }, + + _paintList: function (list, paintAll) { + + if (paintAll == null) { + paintAll = false; + } + + this._updateLayerStatus(list); + + var currentLayer; + var currentZLevel; + var ctx; + + var viewWidth = this._width; + var viewHeight = this._height; + + this.eachBuildinLayer(preProcessLayer); + + // var invTransform = []; + var prevElClipPaths = null; + + for (var i = 0, l = list.length; i < l; i++) { + var el = list[i]; + var elZLevel = this._singleCanvas ? 0 : el.zlevel; + // Change draw layer + if (currentZLevel !== elZLevel) { + // Only 0 zlevel if only has one canvas + currentZLevel = elZLevel; + currentLayer = this.getLayer(currentZLevel); + + if (!currentLayer.isBuildin) { + log( + 'ZLevel ' + currentZLevel + + ' has been used by unkown layer ' + currentLayer.id + ); + } + + ctx = currentLayer.ctx; + + // Reset the count + currentLayer.__unusedCount = 0; + + if (currentLayer.__dirty || paintAll) { + currentLayer.clear(); + } + } + + if ( + (currentLayer.__dirty || paintAll) + // Ignore invisible element + && !el.invisible + // Ignore transparent element + && el.style.opacity !== 0 + // Ignore scale 0 element, in some environment like node-canvas + // Draw a scale 0 element can cause all following draw wrong + && el.scale[0] && el.scale[1] + // Ignore culled element + && !(el.culling && isDisplayableCulled(el, viewWidth, viewHeight)) + ) { + var clipPaths = el.__clipPaths; + + // Optimize when clipping on group with several elements + if (isClipPathChanged(clipPaths, prevElClipPaths)) { + // If has previous clipping state, restore from it + if (prevElClipPaths) { + ctx.restore(); + } + // New clipping state + if (clipPaths) { + ctx.save(); + doClip(clipPaths, ctx); + } + prevElClipPaths = clipPaths; + } + el.beforeBrush && el.beforeBrush(ctx); + el.brush(ctx, false); + el.afterBrush && el.afterBrush(ctx); + } + + el.__dirty = false; + } + + // If still has clipping state + if (prevElClipPaths) { + ctx.restore(); + } + + this.eachBuildinLayer(postProcessLayer); + }, + + /** + * 获取 zlevel 所在层,如果不存在则会创建一个新的层 + * @param {number} zlevel + * @return {module:zrender/Layer} + */ + getLayer: function (zlevel) { + if (this._singleCanvas) { + return this._layers[0]; + } + + var layer = this._layers[zlevel]; + if (!layer) { + // Create a new layer + layer = new Layer('zr_' + zlevel, this, this.dpr); + layer.isBuildin = true; + + if (this._layerConfig[zlevel]) { + util.merge(layer, this._layerConfig[zlevel], true); + } + + this.insertLayer(zlevel, layer); + + // Context is created after dom inserted to document + // Or excanvas will get 0px clientWidth and clientHeight + layer.initContext(); + } + + return layer; + }, + + insertLayer: function (zlevel, layer) { + + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var prevLayer = null; + var i = -1; + var domRoot = this._domRoot; + + if (layersMap[zlevel]) { + log('ZLevel ' + zlevel + ' has been used already'); + return; + } + // Check if is a valid layer + if (!isLayerValid(layer)) { + log('Layer of zlevel ' + zlevel + ' is not valid'); + return; + } + + if (len > 0 && zlevel > zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if ( + zlevelList[i] < zlevel + && zlevelList[i + 1] > zlevel + ) { + break; + } + } + prevLayer = layersMap[zlevelList[i]]; + } + zlevelList.splice(i + 1, 0, zlevel); + + if (prevLayer) { + var prevDom = prevLayer.dom; + if (prevDom.nextSibling) { + domRoot.insertBefore( + layer.dom, + prevDom.nextSibling + ); + } + else { + domRoot.appendChild(layer.dom); + } + } + else { + if (domRoot.firstChild) { + domRoot.insertBefore(layer.dom, domRoot.firstChild); + } + else { + domRoot.appendChild(layer.dom); + } + } + + layersMap[zlevel] = layer; + }, + + // Iterate each layer + eachLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }, + + // Iterate each buildin layer + eachBuildinLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var layer; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + layer = this._layers[z]; + if (layer.isBuildin) { + cb.call(context, layer, z); + } + } + }, + + // Iterate each other layer except buildin layer + eachOtherLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var layer; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + layer = this._layers[z]; + if (! layer.isBuildin) { + cb.call(context, layer, z); + } + } + }, + + /** + * 获取所有已创建的层 + * @param {Array.} [prevLayer] + */ + getLayers: function () { + return this._layers; + }, + + _updateLayerStatus: function (list) { + + var layers = this._layers; + + var elCounts = {}; + + this.eachBuildinLayer(function (layer, z) { + elCounts[z] = layer.elCount; + layer.elCount = 0; + }); + + for (var i = 0, l = list.length; i < l; i++) { + var el = list[i]; + var zlevel = this._singleCanvas ? 0 : el.zlevel; + var layer = layers[zlevel]; + if (layer) { + layer.elCount++; + // 已经被标记为需要刷新 + if (layer.__dirty) { + continue; + } + layer.__dirty = el.__dirty; + } + } + + // 层中的元素数量有发生变化 + this.eachBuildinLayer(function (layer, z) { + if (elCounts[z] !== layer.elCount) { + layer.__dirty = true; + } + }); + }, + + /** + * 清除hover层外所有内容 + */ + clear: function () { + this.eachBuildinLayer(this._clearLayer); + return this; + }, + + _clearLayer: function (layer) { + layer.clear(); + }, + + /** + * 修改指定zlevel的绘制参数 + * + * @param {string} zlevel + * @param {Object} config 配置对象 + * @param {string} [config.clearColor=0] 每次清空画布的颜色 + * @param {string} [config.motionBlur=false] 是否开启动态模糊 + * @param {number} [config.lastFrameAlpha=0.7] + * 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + */ + configLayer: function (zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } + else { + util.merge(layerConfig[zlevel], config, true); + } + + var layer = this._layers[zlevel]; + + if (layer) { + util.merge(layer, layerConfig[zlevel], true); + } + } + }, + + /** + * 删除指定层 + * @param {number} zlevel 层所在的zlevel + */ + delLayer: function (zlevel) { + var layers = this._layers; + var zlevelList = this._zlevelList; + var layer = layers[zlevel]; + if (!layer) { + return; + } + layer.dom.parentNode.removeChild(layer.dom); + delete layers[zlevel]; + + zlevelList.splice(util.indexOf(zlevelList, zlevel), 1); + }, + + /** + * 区域大小变化后重绘 + */ + resize: function (width, height) { + var domRoot = this._domRoot; + // FIXME Why ? + domRoot.style.display = 'none'; + + width = width || this._getWidth(); + height = height || this._getHeight(); + + domRoot.style.display = ''; + + // 优化没有实际改变的resize + if (this._width != width || height != this._height) { + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + + for (var id in this._layers) { + this._layers[id].resize(width, height); + } + + this.refresh(true); + } + + this._width = width; + this._height = height; + + return this; + }, + + /** + * 清除单独的一个层 + * @param {number} zlevel + */ + clearLayer: function (zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }, + + /** + * 释放 + */ + dispose: function () { + this.root.innerHTML = ''; + + this.root = + this.storage = + + this._domRoot = + this._layers = null; + }, + + /** + * Get canvas which has all thing rendered + * @param {Object} opts + * @param {string} [opts.backgroundColor] + */ + getRenderedCanvas: function (opts) { + opts = opts || {}; + if (this._singleCanvas) { + return this._layers[0].dom; + } + + var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + + var ctx = imageLayer.ctx; + imageLayer.clearColor = opts.backgroundColor; + imageLayer.clear(); + + var displayList = this.storage.getDisplayList(true); + + for (var i = 0; i < displayList.length; i++) { + var el = displayList[i]; + if (!el.invisible) { + el.beforeBrush && el.beforeBrush(ctx); + // TODO Check image cross origin + el.brush(ctx, false); + el.afterBrush && el.afterBrush(ctx); + } + } + + return imageLayer.dom; + }, + /** + * 获取绘图区域宽度 + */ + getWidth: function () { + return this._width; + }, + + /** + * 获取绘图区域高度 + */ + getHeight: function () { + return this._height; + }, + + _getWidth: function () { + var root = this.root; + var stl = document.defaultView.getComputedStyle(root); + + // FIXME Better way to get the width and height when element has not been append to the document + return ((root.clientWidth || parseInt10(stl.width) || parseInt10(root.style.width)) + - (parseInt10(stl.paddingLeft) || 0) + - (parseInt10(stl.paddingRight) || 0)) | 0; + }, + + _getHeight: function () { + var root = this.root; + var stl = document.defaultView.getComputedStyle(root); + + return ((root.clientHeight || parseInt10(stl.height) || parseInt10(root.style.height)) + - (parseInt10(stl.paddingTop) || 0) + - (parseInt10(stl.paddingBottom) || 0)) | 0; + }, + + _pathToImage: function (id, path, width, height, dpr) { + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + canvas.width = width * dpr; + canvas.height = height * dpr; + + ctx.clearRect(0, 0, width * dpr, height * dpr); + + var pathTransform = { + position: path.position, + rotation: path.rotation, + scale: path.scale + }; + path.position = [0, 0, 0]; + path.rotation = 0; + path.scale = [1, 1]; + if (path) { + path.brush(ctx); + } + + var ImageShape = __webpack_require__(59); + var imgShape = new ImageShape({ + id: id, + style: { + x: 0, + y: 0, + image: canvas + } + }); + + if (pathTransform.position != null) { + imgShape.position = path.position = pathTransform.position; + } + + if (pathTransform.rotation != null) { + imgShape.rotation = path.rotation = pathTransform.rotation; + } + + if (pathTransform.scale != null) { + imgShape.scale = path.scale = pathTransform.scale; + } + + return imgShape; + }, + + _createPathToImage: function () { + var me = this; + + return function (id, e, width, height) { + return me._pathToImage( + id, e, width, height, me.dpr + ); + }; + } + }; + + module.exports = Painter; + + + +/***/ }, +/* 86 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/Layer + * @author pissang(https://www.github.com/pissang) + */ + + + var util = __webpack_require__(3); + var config = __webpack_require__(40); + + function returnFalse() { + return false; + } + + /** + * 创建dom + * + * @inner + * @param {string} id dom id 待用 + * @param {string} type dom type,such as canvas, div etc. + * @param {Painter} painter painter instance + * @param {number} number + */ + function createDom(id, type, painter, dpr) { + var newDom = document.createElement(type); + var width = painter.getWidth(); + var height = painter.getHeight(); + + var newDomStyle = newDom.style; + // 没append呢,请原谅我这样写,清晰~ + newDomStyle.position = 'absolute'; + newDomStyle.left = 0; + newDomStyle.top = 0; + newDomStyle.width = width + 'px'; + newDomStyle.height = height + 'px'; + newDom.width = width * dpr; + newDom.height = height * dpr; + + // id不作为索引用,避免可能造成的重名,定义为私有属性 + newDom.setAttribute('data-zr-dom-id', id); + return newDom; + } + + /** + * @alias module:zrender/Layer + * @constructor + * @extends module:zrender/mixin/Transformable + * @param {string} id + * @param {module:zrender/Painter} painter + * @param {number} [dpr] + */ + var Layer = function(id, painter, dpr) { + var dom; + dpr = dpr || config.devicePixelRatio; + if (typeof id === 'string') { + dom = createDom(id, 'canvas', painter, dpr); + } + // Not using isDom because in node it will return false + else if (util.isObject(id)) { + dom = id; + id = dom.id; + } + this.id = id; + this.dom = dom; + + var domStyle = dom.style; + if (domStyle) { // Not in node + dom.onselectstart = returnFalse; // 避免页面选中的尴尬 + domStyle['-webkit-user-select'] = 'none'; + domStyle['user-select'] = 'none'; + domStyle['-webkit-touch-callout'] = 'none'; + domStyle['-webkit-tap-highlight-color'] = 'rgba(0,0,0,0)'; + } + + this.domBack = null; + this.ctxBack = null; + + this.painter = painter; + + this.config = null; + + // Configs + /** + * 每次清空画布的颜色 + * @type {string} + * @default 0 + */ + this.clearColor = 0; + /** + * 是否开启动态模糊 + * @type {boolean} + * @default false + */ + this.motionBlur = false; + /** + * 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + * @type {number} + * @default 0.7 + */ + this.lastFrameAlpha = 0.7; + + /** + * Layer dpr + * @type {number} + */ + this.dpr = dpr; + }; + + Layer.prototype = { + + constructor: Layer, + + elCount: 0, + + __dirty: true, + + initContext: function () { + this.ctx = this.dom.getContext('2d'); + + var dpr = this.dpr; + if (dpr != 1) { + this.ctx.scale(dpr, dpr); + } + }, + + createBackBuffer: function () { + var dpr = this.dpr; + + this.domBack = createDom('back-' + this.id, 'canvas', this.painter, dpr); + this.ctxBack = this.domBack.getContext('2d'); + + if (dpr != 1) { + this.ctxBack.scale(dpr, dpr); + } + }, + + /** + * @param {number} width + * @param {number} height + */ + resize: function (width, height) { + var dpr = this.dpr; + + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + + dom.width = width * dpr; + dom.height = height * dpr; + + if (dpr != 1) { + this.ctx.scale(dpr, dpr); + } + + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + + if (dpr != 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }, + + /** + * 清空该层画布 + * @param {boolean} clearAll Clear all with out motion blur + */ + clear: function (clearAll) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + + var haveClearColor = this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + + var dpr = this.dpr; + + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage( + dom, 0, 0, + width / dpr, + height / dpr + ); + } + + ctx.clearRect(0, 0, width / dpr, height / dpr); + if (haveClearColor) { + ctx.save(); + ctx.fillStyle = this.clearColor; + ctx.fillRect(0, 0, width / dpr, height / dpr); + ctx.restore(); + } + + if (haveMotionBLur) { + var domBack = this.domBack; + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, 0, 0, width / dpr, height / dpr); + ctx.restore(); + } + } + }; + + module.exports = Layer; + + +/***/ }, +/* 87 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var PI = Math.PI; + /** + * @param {module:echarts/ExtensionAPI} api + * @param {Object} [opts] + * @param {string} [opts.text] + * @param {string} [opts.color] + * @param {string} [opts.textColor] + * @return {module:zrender/Element} + */ + module.exports = function (api, opts) { + opts = opts || {}; + zrUtil.defaults(opts, { + text: 'loading', + color: '#c23531', + textColor: '#000', + maskColor: 'rgba(255, 255, 255, 0.8)', + zlevel: 0 + }); + var mask = new graphic.Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + var arc = new graphic.Arc({ + shape: { + startAngle: -PI / 2, + endAngle: -PI / 2 + 0.1, + r: 10 + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: 5 + }, + zlevel: opts.zlevel, + z: 10001 + }); + var labelRect = new graphic.Rect({ + style: { + fill: 'none', + text: opts.text, + textPosition: 'right', + textDistance: 10, + textFill: opts.textColor + }, + zlevel: opts.zlevel, + z: 10001 + }); + + arc.animateShape(true) + .when(1000, { + endAngle: PI * 3 / 2 + }) + .start('circularInOut'); + arc.animateShape(true) + .when(1000, { + startAngle: PI * 3 / 2 + }) + .delay(300) + .start('circularInOut'); + + var group = new graphic.Group(); + group.add(arc); + group.add(labelRect); + group.add(mask); + // Inject resize + group.resize = function () { + var cx = api.getWidth() / 2; + var cy = api.getHeight() / 2; + arc.setShape({ + cx: cx, + cy: cy + }); + var r = arc.shape.r; + labelRect.setShape({ + x: cx - r, + y: cy - r, + width: r * 2, + height: r * 2 + }); + + mask.setShape({ + x: 0, + y: 0, + width: api.getWidth(), + height: api.getHeight() + }); + }; + group.resize(); + return group; + }; + + +/***/ }, +/* 88 */ +/***/ function(module, exports, __webpack_require__) { + + + var Gradient = __webpack_require__(4); + module.exports = function (seriesType, styleType, ecModel) { + function encodeColor(seriesModel) { + var colorAccessPath = [styleType, 'normal', 'color']; + var colorList = ecModel.get('color'); + var data = seriesModel.getData(); + var color = seriesModel.get(colorAccessPath) // Set in itemStyle + || colorList[seriesModel.seriesIndex % colorList.length]; // Default color + + // FIXME Set color function or use the platte color + data.setVisual('color', color); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + if (typeof color === 'function' && !(color instanceof Gradient)) { + data.each(function (idx) { + data.setItemVisual( + idx, 'color', color(seriesModel.getDataParams(idx)) + ); + }); + } + + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var color = itemModel.get(colorAccessPath, true); + if (color != null) { + data.setItemVisual(idx, 'color', color); + } + }); + } + } + seriesType ? ecModel.eachSeriesByType(seriesType, encodeColor) + : ecModel.eachSeries(encodeColor); + }; + + +/***/ }, +/* 89 */ +/***/ function(module, exports, __webpack_require__) { + + // Compatitable with 2.0 + + + var zrUtil = __webpack_require__(3); + var compatStyle = __webpack_require__(90); + + function get(opt, path) { + path = path.split(','); + var obj = opt; + for (var i = 0; i < path.length; i++) { + obj = obj && obj[path[i]]; + if (obj == null) { + break; + } + } + return obj; + } + + function set(opt, path, val, overwrite) { + path = path.split(','); + var obj = opt; + var key; + for (var i = 0; i < path.length - 1; i++) { + key = path[i]; + if (obj[key] == null) { + obj[key] = {}; + } + obj = obj[key]; + } + if (overwrite || obj[path[i]] == null) { + obj[path[i]] = val; + } + } + + function compatLayoutProperties(option) { + each(LAYOUT_PROPERTIES, function (prop) { + if (prop[0] in option && !(prop[1] in option)) { + option[prop[1]] = option[prop[0]]; + } + }); + } + + var LAYOUT_PROPERTIES = [ + ['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom'] + ]; + + var COMPATITABLE_COMPONENTS = [ + 'grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline' + ]; + + var COMPATITABLE_SERIES = [ + 'bar', 'boxplot', 'candlestick', 'chord', 'effectScatter', + 'funnel', 'gauge', 'lines', 'graph', 'heatmap', 'line', 'map', 'parallel', + 'pie', 'radar', 'sankey', 'scatter', 'treemap' + ]; + + var each = zrUtil.each; + + module.exports = function (option) { + each(option.series, function (seriesOpt) { + if (!zrUtil.isObject(seriesOpt)) { + return; + } + + var seriesType = seriesOpt.type; + + compatStyle(seriesOpt); + + if (seriesType === 'pie' || seriesType === 'gauge') { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + } + } + if (seriesType === 'gauge') { + var pointerColor = get(seriesOpt, 'pointer.color'); + pointerColor != null + && set(seriesOpt, 'itemStyle.normal.color', pointerColor); + } + + for (var i = 0; i < COMPATITABLE_SERIES.length; i++) { + if (COMPATITABLE_SERIES[i] === seriesOpt.type) { + compatLayoutProperties(seriesOpt); + break; + } + } + }); + + // dataRange has changed to visualMap + if (option.dataRange) { + option.visualMap = option.dataRange; + } + + each(COMPATITABLE_COMPONENTS, function (componentName) { + var options = option[componentName]; + if (options) { + if (!zrUtil.isArray(options)) { + options = [options]; + } + each(options, function (option) { + compatLayoutProperties(option); + }); + } + }); + }; + + +/***/ }, +/* 90 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var POSSIBLE_STYLES = [ + 'areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', + 'chordStyle', 'label', 'labelLine' + ]; + + function compatItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + if (itemStyleOpt) { + zrUtil.each(POSSIBLE_STYLES, function (styleName) { + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } + else { + zrUtil.merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + normalItemStyleOpt[styleName] = null; + } + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } + else { + zrUtil.merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + emphasisItemStyleOpt[styleName] = null; + } + }); + } + } + + module.exports = function (seriesOpt) { + if (!seriesOpt) { + return; + } + compatItemStyle(seriesOpt); + compatItemStyle(seriesOpt.markPoint); + compatItemStyle(seriesOpt.markLine); + var data = seriesOpt.data; + if (data) { + for (var i = 0; i < data.length; i++) { + compatItemStyle(data[i]); + } + // mark point data + var markPoint = seriesOpt.markPoint; + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + for (var i = 0; i < mpData.length; i++) { + compatItemStyle(mpData[i]); + } + } + // mark line data + var markLine = seriesOpt.markLine; + if (markLine && markLine.data) { + var mlData = markLine.data; + for (var i = 0; i < mlData.length; i++) { + if (zrUtil.isArray(mlData[i])) { + compatItemStyle(mlData[i][0]); + compatItemStyle(mlData[i][1]); + } + else { + compatItemStyle(mlData[i]); + } + } + } + } + }; + + +/***/ }, +/* 91 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(92); + __webpack_require__(97); + + echarts.registerVisualCoding('chart', zrUtil.curry( + __webpack_require__(103), 'line', 'circle', 'line' + )); + echarts.registerLayout(zrUtil.curry( + __webpack_require__(104), 'line' + )); + + // Down sample after filter + echarts.registerProcessor('statistic', zrUtil.curry( + __webpack_require__(105), 'line' + )); + + // In case developer forget to include grid component + __webpack_require__(106); + + +/***/ }, +/* 92 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var createListFromArray = __webpack_require__(93); + var SeriesModel = __webpack_require__(27); + + module.exports = SeriesModel.extend({ + + type: 'series.line', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + return createListFromArray(option.data, this, ecModel); + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + + hoverAnimation: true, + // stack: null + xAxisIndex: 0, + yAxisIndex: 0, + + polarIndex: 0, + + // If clip the overflow value + clipOverflow: true, + + label: { + normal: { + // show: false, + position: 'top' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + } + // emphasis: { + // show: false, + // position: 'top' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // } + }, + // itemStyle: { + // normal: { + // // color: 各异 + // }, + // emphasis: { + // // color: 各异, + // } + // }, + lineStyle: { + normal: { + width: 2, + type: 'solid' + } + }, + // areaStyle: { + // }, + // smooth: false, + // smoothMonotone: null, + // 拐点图形类型 + symbol: 'emptyCircle', + // 拐点图形大小 + symbolSize: 4, + // 拐点图形旋转控制 + // symbolRotate: null, + + // 是否显示 symbol, 只有在 tooltip hover 的时候显示 + showSymbol: true, + // 标志图形默认只有主轴显示(随主轴标签间隔隐藏策略) + // showAllSymbol: false + // + // 大数据过滤,'average', 'max', 'min', 'sum' + // sampling: 'none' + + animationEasing: 'linear' + } + }); + + +/***/ }, +/* 93 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var completeDimensions = __webpack_require__(96); + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var CoordinateSystem = __webpack_require__(25); + var getDataItemValue = modelUtil.getDataItemValue; + var converDataValue = modelUtil.converDataValue; + + function firstDataNotNull(data) { + var i = 0; + while (i < data.length && data[i] == null) { + i++; + } + return data[i]; + } + function ifNeedCompleteOrdinalData(data) { + var sampleItem = firstDataNotNull(data); + return sampleItem != null + && !zrUtil.isArray(getDataItemValue(sampleItem)); + } + + /** + * Helper function to create a list from option data + */ + function createListFromArray(data, seriesModel, ecModel) { + // If data is undefined + data = data || []; + + var coordSysName = seriesModel.get('coordinateSystem'); + var creator = creators[coordSysName]; + var registeredCoordSys = CoordinateSystem.get(coordSysName); + // FIXME + var result = creator && creator(data, seriesModel, ecModel); + var dimensions = result && result.dimensions; + if (!dimensions) { + // Get dimensions from registered coordinate system + dimensions = (registeredCoordSys && registeredCoordSys.dimensions) || ['x', 'y']; + dimensions = completeDimensions(dimensions, data, dimensions.concat(['value'])); + } + var categoryAxisModel = result && result.categoryAxisModel; + + var categoryDimIndex = dimensions[0].type === 'ordinal' + ? 0 : (dimensions[1].type === 'ordinal' ? 1 : -1); + + var list = new List(dimensions, seriesModel); + + var nameList = createNameList(result, data); + + var dimValueGetter = (categoryAxisModel && ifNeedCompleteOrdinalData(data)) + ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === categoryDimIndex + ? dataIndex + : converDataValue(getDataItemValue(itemOpt), dimensions[dimIndex]); + } + : function (itemOpt, dimName, dataIndex, dimIndex) { + var val = getDataItemValue(itemOpt); + return converDataValue(val && val[dimIndex], dimensions[dimIndex]); + }; + + list.initData(data, nameList, dimValueGetter); + + return list; + } + + function isStackable(axisType) { + return axisType !== 'category' && axisType !== 'time'; + } + + function getDimTypeByAxis(axisType) { + return axisType === 'category' + ? 'ordinal' + : axisType === 'time' + ? 'time' + : 'float'; + } + + /** + * Creaters for each coord system. + * @return {Object} {dimensions, categoryAxisModel}; + */ + var creators = { + + cartesian2d: function (data, seriesModel, ecModel) { + var xAxisModel = ecModel.getComponent('xAxis', seriesModel.get('xAxisIndex')); + var yAxisModel = ecModel.getComponent('yAxis', seriesModel.get('yAxisIndex')); + var xAxisType = xAxisModel.get('type'); + var yAxisType = yAxisModel.get('type'); + + var dimensions = [ + { + name: 'x', + type: getDimTypeByAxis(xAxisType), + stackable: isStackable(xAxisType) + }, + { + name: 'y', + // If two category axes + type: getDimTypeByAxis(yAxisType), + stackable: isStackable(yAxisType) + } + ]; + + var isXAxisCateogry = xAxisType === 'category'; + + completeDimensions(dimensions, data, ['x', 'y', 'z']); + + return { + dimensions: dimensions, + categoryIndex: isXAxisCateogry ? 0 : 1, + categoryAxisModel: isXAxisCateogry + ? xAxisModel + : (yAxisType === 'category' ? yAxisModel : null) + }; + }, + + polar: function (data, seriesModel, ecModel) { + var polarIndex = seriesModel.get('polarIndex') || 0; + + var axisFinder = function (axisModel) { + return axisModel.get('polarIndex') === polarIndex; + }; + + var angleAxisModel = ecModel.findComponents({ + mainType: 'angleAxis', filter: axisFinder + })[0]; + var radiusAxisModel = ecModel.findComponents({ + mainType: 'radiusAxis', filter: axisFinder + })[0]; + + var radiusAxisType = radiusAxisModel.get('type'); + var angleAxisType = angleAxisModel.get('type'); + + var dimensions = [ + { + name: 'radius', + type: getDimTypeByAxis(radiusAxisType), + stackable: isStackable(radiusAxisType) + }, + { + name: 'angle', + type: getDimTypeByAxis(angleAxisType), + stackable: isStackable(angleAxisType) + } + ]; + var isAngleAxisCateogry = angleAxisType === 'category'; + + completeDimensions(dimensions, data, ['radius', 'angle', 'value']); + + return { + dimensions: dimensions, + categoryIndex: isAngleAxisCateogry ? 1 : 0, + categoryAxisModel: isAngleAxisCateogry + ? angleAxisModel + : (radiusAxisType === 'category' ? radiusAxisModel : null) + }; + }, + + geo: function (data, seriesModel, ecModel) { + // TODO Region + // 多个散点图系列在同一个地区的时候 + return { + dimensions: completeDimensions([ + {name: 'lng'}, + {name: 'lat'} + ], data, ['lng', 'lat', 'value']) + }; + } + }; + + function createNameList(result, data) { + var nameList = []; + + if (result && result.categoryAxisModel) { + // FIXME Two category axis + var categories = result.categoryAxisModel.getCategories(); + if (categories) { + var dataLen = data.length; + // Ordered data is given explicitly like + // [[3, 0.2], [1, 0.3], [2, 0.15]] + // or given scatter data, + // pick the category + if (zrUtil.isArray(data[0]) && data[0].length > 1) { + nameList = []; + for (var i = 0; i < dataLen; i++) { + nameList[i] = categories[data[i][result.categoryIndex || 0]]; + } + } + else { + nameList = categories.slice(0); + } + } + } + + return nameList; + } + + module.exports = createListFromArray; + + + +/***/ }, +/* 94 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(global) {/** + * List for data storage + * @module echarts/data/List + */ + + + var UNDEFINED = 'undefined'; + var globalObj = typeof window === 'undefined' ? global : window; + var Float64Array = typeof globalObj.Float64Array === UNDEFINED + ? Array : globalObj.Float64Array; + var Int32Array = typeof globalObj.Int32Array === UNDEFINED + ? Array : globalObj.Int32Array; + + var dataCtors = { + 'float': Float64Array, + 'int': Int32Array, + // Ordinal data type can be string or int + 'ordinal': Array, + 'number': Array, + 'time': Array + }; + + var Model = __webpack_require__(8); + var DataDiffer = __webpack_require__(95); + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var isObject = zrUtil.isObject; + + var IMMUTABLE_PROPERTIES = [ + 'stackedOn', '_nameList', '_idList', '_rawData' + ]; + + var transferImmuProperties = function (a, b, wrappedMethod) { + zrUtil.each(IMMUTABLE_PROPERTIES.concat(wrappedMethod || []), function (propName) { + if (b.hasOwnProperty(propName)) { + a[propName] = b[propName]; + } + }); + }; + + /** + * @constructor + * @alias module:echarts/data/List + * + * @param {Array.} dimensions + * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius + * @param {module:echarts/model/Model} hostModel + */ + var List = function (dimensions, hostModel) { + + dimensions = dimensions || ['x', 'y']; + + var dimensionInfos = {}; + var dimensionNames = []; + for (var i = 0; i < dimensions.length; i++) { + var dimensionName; + var dimensionInfo = {}; + if (typeof dimensions[i] === 'string') { + dimensionName = dimensions[i]; + dimensionInfo = { + name: dimensionName, + stackable: false, + // Type can be 'float', 'int', 'number' + // Default is number, Precision of float may not enough + type: 'number' + }; + } + else { + dimensionInfo = dimensions[i]; + dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || 'number'; + } + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + } + /** + * @readOnly + * @type {Array.} + */ + this.dimensions = dimensionNames; + + /** + * Infomation of each data dimension, like data type. + * @type {Object} + */ + this._dimensionInfos = dimensionInfos; + + /** + * @type {module:echarts/model/Model} + */ + this.hostModel = hostModel; + + /** + * Indices stores the indices of data subset after filtered. + * This data subset will be used in chart. + * @type {Array.} + * @readOnly + */ + this.indices = []; + + /** + * Data storage + * @type {Object.} + * @private + */ + this._storage = {}; + + /** + * @type {Array.} + */ + this._nameList = []; + /** + * @type {Array.} + */ + this._idList = []; + /** + * Models of data option is stored sparse for optimizing memory cost + * @type {Array.} + * @private + */ + this._optionModels = []; + + /** + * @param {module:echarts/data/List} + */ + this.stackedOn = null; + + /** + * Global visual properties after visual coding + * @type {Object} + * @private + */ + this._visual = {}; + + /** + * Globel layout properties. + * @type {Object} + * @private + */ + this._layout = {}; + + /** + * Item visual properties after visual coding + * @type {Array.} + * @private + */ + this._itemVisuals = []; + + /** + * Item layout properties after layout + * @type {Array.} + * @private + */ + this._itemLayouts = []; + + /** + * Graphic elemnents + * @type {Array.} + * @private + */ + this._graphicEls = []; + + /** + * @type {Array.} + * @private + */ + this._rawData; + + /** + * @type {Object} + * @private + */ + this._extent; + }; + + var listProto = List.prototype; + + listProto.type = 'list'; + + /** + * Get dimension name + * @param {string|number} dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + listProto.getDimension = function (dim) { + if (!isNaN(dim)) { + dim = this.dimensions[dim] || dim; + } + return dim; + }; + /** + * Get type and stackable info of particular dimension + * @param {string|number} dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + listProto.getDimensionInfo = function (dim) { + return zrUtil.clone(this._dimensionInfos[this.getDimension(dim)]); + }; + + /** + * Initialize from data + * @param {Array.} data + * @param {Array.} [nameList] + * @param {Function} [dimValueGetter] (dataItem, dimName, dataIndex, dimIndex) => number + */ + listProto.initData = function (data, nameList, dimValueGetter) { + data = data || []; + + this._rawData = data; + + // Clear + var storage = this._storage = {}; + var indices = this.indices = []; + + var dimensions = this.dimensions; + var size = data.length; + var dimensionInfoMap = this._dimensionInfos; + + var idList = []; + var nameRepeatCount = {}; + + nameList = nameList || []; + + // Init storage + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = dimensionInfoMap[dimensions[i]]; + var DataCtor = dataCtors[dimInfo.type]; + storage[dimensions[i]] = new DataCtor(size); + } + + // Default dim value getter + dimValueGetter = dimValueGetter || function (dataItem, dimName, dataIndex, dimIndex) { + var value = modelUtil.getDataItemValue(dataItem); + return modelUtil.converDataValue( + zrUtil.isArray(value) + ? value[dimIndex] + // If value is a single number or something else not array. + : value, + dimensionInfoMap[dimName] + ); + }; + + for (var idx = 0; idx < data.length; idx++) { + var dataItem = data[idx]; + // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of cateogry + // Use a tempValue to normalize the value to be a (x, y) value + + // Store the data by dimensions + for (var k = 0; k < dimensions.length; k++) { + var dim = dimensions[k]; + var dimStorage = storage[dim]; + // PENDING NULL is empty or zero + dimStorage[idx] = dimValueGetter(dataItem, dim, idx, k); + } + + indices.push(idx); + } + + // Use the name in option and create id + for (var i = 0; i < data.length; i++) { + var id = ''; + if (!nameList[i]) { + nameList[i] = data[i].name; + // Try using the id in option + id = data[i].id; + } + var name = nameList[i] || ''; + if (!id && name) { + // Use name as id and add counter to avoid same name + nameRepeatCount[name] = nameRepeatCount[name] || 0; + id = name; + if (nameRepeatCount[name] > 0) { + id += '__ec__' + nameRepeatCount[name]; + } + nameRepeatCount[name]++; + } + id && (idList[i] = id); + } + + this._nameList = nameList; + this._idList = idList; + }; + + /** + * @return {number} + */ + listProto.count = function () { + return this.indices.length; + }; + + /** + * Get value. Return NaN if idx is out of range. + * @param {string} dim Dim must be concrete name. + * @param {number} idx + * @param {boolean} stack + * @return {number} + */ + listProto.get = function (dim, idx, stack) { + var storage = this._storage; + var dataIndex = this.indices[idx]; + + // If value not exists + if (dataIndex == null) { + return NaN; + } + + var value = storage[dim] && storage[dim][dataIndex]; + // FIXME ordinal data type is not stackable + if (stack) { + var dimensionInfo = this._dimensionInfos[dim]; + if (dimensionInfo && dimensionInfo.stackable) { + var stackedOn = this.stackedOn; + while (stackedOn) { + // Get no stacked data of stacked on + var stackedValue = stackedOn.get(dim, idx); + // Considering positive stack, negative stack and empty data + if ((value >= 0 && stackedValue > 0) // Positive stack + || (value <= 0 && stackedValue < 0) // Negative stack + ) { + value += stackedValue; + } + stackedOn = stackedOn.stackedOn; + } + } + } + return value; + }; + + /** + * Get value for multi dimensions. + * @param {Array.} [dimensions] If ignored, using all dimensions. + * @param {number} idx + * @param {boolean} stack + * @return {number} + */ + listProto.getValues = function (dimensions, idx, stack) { + var values = []; + + if (!zrUtil.isArray(dimensions)) { + stack = idx; + idx = dimensions; + dimensions = this.dimensions; + } + + for (var i = 0, len = dimensions.length; i < len; i++) { + values.push(this.get(dimensions[i], idx, stack)); + } + + return values; + }; + + /** + * If value is NaN. Inlcuding '-' + * @param {string} dim + * @param {number} idx + * @return {number} + */ + listProto.hasValue = function (idx) { + var dimensions = this.dimensions; + var dimensionInfos = this._dimensionInfos; + for (var i = 0, len = dimensions.length; i < len; i++) { + if ( + // Ordinal type can be string or number + dimensionInfos[dimensions[i]].type !== 'ordinal' + && isNaN(this.get(dimensions[i], idx)) + ) { + return false; + } + } + return true; + }; + + /** + * Get extent of data in one dimension + * @param {string} dim + * @param {boolean} stack + */ + listProto.getDataExtent = function (dim, stack) { + var dimData = this._storage[dim]; + var dimInfo = this.getDimensionInfo(dim); + stack = (dimInfo && dimInfo.stackable) && stack; + var dimExtent = (this._extent || (this._extent = {}))[dim + (!!stack)]; + var value; + if (dimExtent) { + return dimExtent; + } + // var dimInfo = this._dimensionInfos[dim]; + if (dimData) { + var min = Infinity; + var max = -Infinity; + // var isOrdinal = dimInfo.type === 'ordinal'; + for (var i = 0, len = this.count(); i < len; i++) { + value = this.get(dim, i, stack); + // FIXME + // if (isOrdinal && typeof value === 'string') { + // value = zrUtil.indexOf(dimData, value); + // console.log(value); + // } + value < min && (min = value); + value > max && (max = value); + } + return (this._extent[dim + stack] = [min, max]); + } + else { + return [Infinity, -Infinity]; + } + }; + + /** + * Get sum of data in one dimension + * @param {string} dim + * @param {boolean} stack + */ + listProto.getSum = function (dim, stack) { + var dimData = this._storage[dim]; + var sum = 0; + if (dimData) { + for (var i = 0, len = this.count(); i < len; i++) { + var value = this.get(dim, i, stack); + if (!isNaN(value)) { + sum += value; + } + } + } + return sum; + }; + + /** + * Retreive the index with given value + * @param {number} idx + * @param {number} value + * @return {number} + */ + // FIXME Precision of float value + listProto.indexOf = function (dim, value) { + var storage = this._storage; + var dimData = storage[dim]; + var indices = this.indices; + + if (dimData) { + for (var i = 0, len = indices.length; i < len; i++) { + var rawIndex = indices[i]; + if (dimData[rawIndex] === value) { + return i; + } + } + } + return -1; + }; + + /** + * Retreive the index with given name + * @param {number} idx + * @param {number} name + * @return {number} + */ + listProto.indexOfName = function (name) { + var indices = this.indices; + var nameList = this._nameList; + + for (var i = 0, len = indices.length; i < len; i++) { + var rawIndex = indices[i]; + if (nameList[rawIndex] === name) { + return i; + } + } + + return -1; + }; + + /** + * Retreive the index of nearest value + * @param {string>} dim + * @param {number} value + * @param {boolean} stack If given value is after stacked + * @return {number} + */ + listProto.indexOfNearest = function (dim, value, stack) { + var storage = this._storage; + var dimData = storage[dim]; + + if (dimData) { + var minDist = Number.MAX_VALUE; + var nearestIdx = -1; + for (var i = 0, len = this.count(); i < len; i++) { + var diff = value - this.get(dim, i, stack); + var dist = Math.abs(diff); + if (dist < minDist + // For the case of two data are same on xAxis, which has sequence data. + // Show the nearest index + // https://github.com/ecomfe/echarts/issues/2869 + || (dist === minDist && diff > 0) + ) { + minDist = dist; + nearestIdx = i; + } + } + return nearestIdx; + } + return -1; + }; + + /** + * Get raw data index + * @param {number} idx + * @return {number} + */ + listProto.getRawIndex = function (idx) { + var rawIdx = this.indices[idx]; + return rawIdx == null ? -1 : rawIdx; + }; + + /** + * @param {number} idx + * @param {boolean} [notDefaultIdx=false] + * @return {string} + */ + listProto.getName = function (idx) { + return this._nameList[this.indices[idx]] || ''; + }; + + /** + * @param {number} idx + * @param {boolean} [notDefaultIdx=false] + * @return {string} + */ + listProto.getId = function (idx) { + return this._idList[this.indices[idx]] || (this.getRawIndex(idx) + ''); + }; + + + function normalizeDimensions(dimensions) { + if (!zrUtil.isArray(dimensions)) { + dimensions = [dimensions]; + } + return dimensions; + } + + /** + * Data iteration + * @param {string|Array.} + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * + * @example + * list.each('x', function (x, idx) {}); + * list.each(['x', 'y'], function (x, y, idx) {}); + * list.each(function (idx) {}) + */ + listProto.each = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var value = []; + var dimSize = dimensions.length; + var indices = this.indices; + + context = context || this; + + for (var i = 0; i < indices.length; i++) { + if (dimSize === 0) { + cb.call(context, i); + } + // Simple optimization + else if (dimSize === 1) { + cb.call(context, this.get(dimensions[0], i, stack), i); + } + else { + for (var k = 0; k < dimSize; k++) { + value[k] = this.get(dimensions[k], i, stack); + } + // Index + value[k] = i; + cb.apply(context, value); + } + } + }; + + /** + * Data filter + * @param {string|Array.} + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + */ + listProto.filterSelf = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var newIndices = []; + var value = []; + var dimSize = dimensions.length; + var indices = this.indices; + + context = context || this; + + for (var i = 0; i < indices.length; i++) { + var keep; + // Simple optimization + if (dimSize === 1) { + keep = cb.call( + context, this.get(dimensions[0], i, stack), i + ); + } + else { + for (var k = 0; k < dimSize; k++) { + value[k] = this.get(dimensions[k], i, stack); + } + value[k] = i; + keep = cb.apply(context, value); + } + if (keep) { + newIndices.push(indices[i]); + } + } + + this.indices = newIndices; + + // Reset data extent + this._extent = {}; + + return this; + }; + + /** + * Data mapping to a plain array + * @param {string|Array.} [dimensions] + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * @return {Array} + */ + listProto.mapArray = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + var result = []; + this.each(dimensions, function () { + result.push(cb && cb.apply(this, arguments)); + }, stack, context); + return result; + }; + + function cloneListForMapAndSample(original, excludeDimensions) { + var allDimensions = original.dimensions; + var list = new List( + zrUtil.map(allDimensions, original.getDimensionInfo, original), + original.hostModel + ); + // FIXME If needs stackedOn, value may already been stacked + transferImmuProperties(list, original, original._wrappedMethods); + + var storage = list._storage = {}; + var originalStorage = original._storage; + // Init storage + for (var i = 0; i < allDimensions.length; i++) { + var dim = allDimensions[i]; + var dimStore = originalStorage[dim]; + if (zrUtil.indexOf(excludeDimensions, dim) >= 0) { + storage[dim] = new dimStore.constructor( + originalStorage[dim].length + ); + } + else { + // Direct reference for other dimensions + storage[dim] = originalStorage[dim]; + } + } + return list; + } + + /** + * Data mapping to a new List with given dimensions + * @param {string|Array.} dimensions + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * @return {Array} + */ + listProto.map = function (dimensions, cb, stack, context) { + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var list = cloneListForMapAndSample(this, dimensions); + // Following properties are all immutable. + // So we can reference to the same value + var indices = list.indices = this.indices; + + var storage = list._storage; + + var tmpRetValue = []; + this.each(dimensions, function () { + var idx = arguments[arguments.length - 1]; + var retValue = cb && cb.apply(this, arguments); + if (retValue != null) { + // a number + if (typeof retValue === 'number') { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + for (var i = 0; i < retValue.length; i++) { + var dim = dimensions[i]; + var dimStore = storage[dim]; + var rawIdx = indices[idx]; + if (dimStore) { + dimStore[rawIdx] = retValue[i]; + } + } + } + }, stack, context); + + return list; + }; + + /** + * Large data down sampling on given dimension + * @param {string} dimension + * @param {number} rate + * @param {Function} sampleValue + * @param {Function} sampleIndex Sample index for name and id + */ + listProto.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this, [dimension]); + var storage = this._storage; + var targetStorage = list._storage; + + var originalIndices = this.indices; + var indices = list.indices = []; + + var frameValues = []; + var frameIndices = []; + var frameSize = Math.floor(1 / rate); + + var dimStore = targetStorage[dimension]; + var len = this.count(); + // Copy data from original data + for (var i = 0; i < storage[dimension].length; i++) { + targetStorage[dimension][i] = storage[dimension][i]; + } + for (var i = 0; i < len; i += frameSize) { + // Last frame + if (frameSize > len - i) { + frameSize = len - i; + frameValues.length = frameSize; + } + for (var k = 0; k < frameSize; k++) { + var idx = originalIndices[i + k]; + frameValues[k] = dimStore[idx]; + frameIndices[k] = idx; + } + var value = sampleValue(frameValues); + var idx = frameIndices[sampleIndex(frameValues, value) || 0]; + // Only write value on the filtered data + dimStore[idx] = value; + indices.push(idx); + } + return list; + }; + + /** + * Get model of one data item. + * + * @param {number} idx + */ + // FIXME Model proxy ? + listProto.getItemModel = function (idx) { + var hostModel = this.hostModel; + idx = this.indices[idx]; + return new Model(this._rawData[idx], hostModel, hostModel.ecModel); + }; + + /** + * Create a data differ + * @param {module:echarts/data/List} otherList + * @return {module:echarts/data/DataDiffer} + */ + listProto.diff = function (otherList) { + var idList = this._idList; + var otherIdList = otherList && otherList._idList; + return new DataDiffer( + otherList ? otherList.indices : [], this.indices, function (idx) { + return otherIdList[idx] || (idx + ''); + }, function (idx) { + return idList[idx] || (idx + ''); + } + ); + }; + /** + * Get visual property. + * @param {string} key + */ + listProto.getVisual = function (key) { + var visual = this._visual; + return visual && visual[key]; + }; + + /** + * Set visual property + * @param {string|Object} key + * @param {*} [value] + * + * @example + * setVisual('color', color); + * setVisual({ + * 'color': color + * }); + */ + listProto.setVisual = function (key, val) { + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.setVisual(name, key[name]); + } + } + return; + } + this._visual = this._visual || {}; + this._visual[key] = val; + }; + + /** + * Set layout property. + * @param {string} key + * @param {*} [val] + */ + listProto.setLayout = function (key, val) { + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.setLayout(name, key[name]); + } + } + return; + } + this._layout[key] = val; + }; + + /** + * Get layout property. + * @param {string} key. + * @return {*} + */ + listProto.getLayout = function (key) { + return this._layout[key]; + }; + + /** + * Get layout of single data item + * @param {number} idx + */ + listProto.getItemLayout = function (idx) { + return this._itemLayouts[idx]; + }, + + /** + * Set layout of single data item + * @param {number} idx + * @param {Object} layout + * @param {boolean=} [merge=false] + */ + listProto.setItemLayout = function (idx, layout, merge) { + this._itemLayouts[idx] = merge + ? zrUtil.extend(this._itemLayouts[idx] || {}, layout) + : layout; + }, + + /** + * Get visual property of single data item + * @param {number} idx + * @param {string} key + * @param {boolean} ignoreParent + */ + listProto.getItemVisual = function (idx, key, ignoreParent) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + if (val == null && !ignoreParent) { + // Use global visual property + return this.getVisual(key); + } + return val; + }, + + /** + * Set visual property of single data item + * + * @param {number} idx + * @param {string|Object} key + * @param {*} [value] + * + * @example + * setItemVisual(0, 'color', color); + * setItemVisual(0, { + * 'color': color + * }); + */ + listProto.setItemVisual = function (idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + this._itemVisuals[idx] = itemVisual; + + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + itemVisual[name] = key[name]; + } + } + return; + } + itemVisual[key] = value; + }; + + var setItemDataAndSeriesIndex = function (child) { + child.seriesIndex = this.seriesIndex; + child.dataIndex = this.dataIndex; + }; + /** + * Set graphic element relative to data. It can be set as null + * @param {number} idx + * @param {module:zrender/Element} [el] + */ + listProto.setItemGraphicEl = function (idx, el) { + var hostModel = this.hostModel; + + if (el) { + // Add data index and series index for indexing the data by element + // Useful in tooltip + el.dataIndex = idx; + el.seriesIndex = hostModel && hostModel.seriesIndex; + if (el.type === 'group') { + el.traverse(setItemDataAndSeriesIndex, el); + } + } + + this._graphicEls[idx] = el; + }; + + /** + * @param {number} idx + * @return {module:zrender/Element} + */ + listProto.getItemGraphicEl = function (idx) { + return this._graphicEls[idx]; + }; + + /** + * @param {Function} cb + * @param {*} context + */ + listProto.eachItemGraphicEl = function (cb, context) { + zrUtil.each(this._graphicEls, function (el, idx) { + if (el) { + cb && cb.call(context, el, idx); + } + }); + }; + + /** + * Shallow clone a new list except visual and layout properties, and graph elements. + * New list only change the indices. + */ + listProto.cloneShallow = function () { + var dimensionInfoList = zrUtil.map(this.dimensions, this.getDimensionInfo, this); + var list = new List(dimensionInfoList, this.hostModel); + + // FIXME + list._storage = this._storage; + + transferImmuProperties(list, this, this._wrappedMethods); + + list.indices = this.indices.slice(); + + return list; + }; + + /** + * Wrap some method to add more feature + * @param {string} methodName + * @param {Function} injectFunction + */ + listProto.wrapMethod = function (methodName, injectFunction) { + var originalMethod = this[methodName]; + if (typeof originalMethod !== 'function') { + return; + } + this._wrappedMethods = this._wrappedMethods || []; + this._wrappedMethods.push(methodName); + this[methodName] = function () { + var res = originalMethod.apply(this, arguments); + return injectFunction.call(this, res); + }; + }; + + module.exports = List; + + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ }, +/* 95 */ +/***/ function(module, exports) { + + 'use strict'; + + + function defaultKeyGetter(item) { + return item; + } + + function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter) { + this._old = oldArr; + this._new = newArr; + + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; + } + + DataDiffer.prototype = { + + constructor: DataDiffer, + + /** + * Callback function when add a data + */ + add: function (func) { + this._add = func; + return this; + }, + + /** + * Callback function when update a data + */ + update: function (func) { + this._update = func; + return this; + }, + + /** + * Callback function when remove a data + */ + remove: function (func) { + this._remove = func; + return this; + }, + + execute: function () { + var oldArr = this._old; + var newArr = this._new; + var oldKeyGetter = this._oldKeyGetter; + var newKeyGetter = this._newKeyGetter; + + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var i; + + initIndexMap(oldArr, oldDataIndexMap, oldKeyGetter); + initIndexMap(newArr, newDataIndexMap, newKeyGetter); + + // Travel by inverted order to make sure order consistency + // when duplicate keys exists (consider newDataIndex.pop() below). + // For performance consideration, these code below do not look neat. + for (i = 0; i < oldArr.length; i++) { + var key = oldKeyGetter(oldArr[i]); + var idx = newDataIndexMap[key]; + + // idx can never be empty array here. see 'set null' logic below. + if (idx != null) { + // Consider there is duplicate key (for example, use dataItem.name as key). + // We should make sure every item in newArr and oldArr can be visited. + var len = idx.length; + if (len) { + len === 1 && (newDataIndexMap[key] = null); + idx = idx.unshift(); + } + else { + newDataIndexMap[key] = null; + } + this._update && this._update(idx, i); + } + else { + this._remove && this._remove(i); + } + } + + for (var key in newDataIndexMap) { + if (newDataIndexMap.hasOwnProperty(key)) { + var idx = newDataIndexMap[key]; + if (idx == null) { + continue; + } + // idx can never be empty array here. see 'set null' logic above. + if (!idx.length) { + this._add && this._add(idx); + } + else { + for (var i = 0, len = idx.length; i < len; i++) { + this._add && this._add(idx[i]); + } + } + } + } + } + }; + + function initIndexMap(arr, map, keyGetter) { + for (var i = 0; i < arr.length; i++) { + var key = keyGetter(arr[i]); + var existence = map[key]; + if (existence == null) { + map[key] = i; + } + else { + if (!existence.length) { + map[key] = existence = [existence]; + } + existence.push(i); + } + } + } + + module.exports = DataDiffer; + + +/***/ }, +/* 96 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Complete dimensions by data (guess dimension). + */ + + + var zrUtil = __webpack_require__(3); + + /** + * Complete the dimensions array guessed from the data structure. + * @param {Array.} dimensions Necessary dimensions, like ['x', 'y'] + * @param {Array} data Data list. [[1, 2, 3], [2, 3, 4]] + * @param {Array.} defaultNames Default names to fill not necessary dimensions, like ['value'] + * @param {string} extraPrefix Prefix of name when filling the left dimensions. + * @return {Array.} + */ + function completeDimensions(dimensions, data, defaultNames, extraPrefix) { + if (!data) { + return dimensions; + } + + var value0 = retrieveValue(data[0]); + var dimSize = zrUtil.isArray(value0) && value0.length || 1; + + defaultNames = defaultNames || []; + extraPrefix = extraPrefix || 'extra'; + for (var i = 0; i < dimSize; i++) { + if (!dimensions[i]) { + var name = defaultNames[i] || (extraPrefix + (i - defaultNames.length)); + dimensions[i] = guessOrdinal(data, i) + ? {type: 'ordinal', name: name} + : name; + } + } + + return dimensions; + } + + // The rule should not be complex, otherwise user might not + // be able to known where the data is wrong. + function guessOrdinal(data, dimIndex) { + for (var i = 0, len = data.length; i < len; i++) { + var value = retrieveValue(data[i]); + + if (!zrUtil.isArray(value)) { + return false; + } + + var value = value[dimIndex]; + if (value != null && isFinite(value)) { + return false; + } + else if (zrUtil.isString(value) && value !== '-') { + return true; + } + } + return false; + } + + function retrieveValue(o) { + return zrUtil.isArray(o) ? o : zrUtil.isObject(o) ? o.value: o; + } + + module.exports = completeDimensions; + + + +/***/ }, +/* 97 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var SymbolDraw = __webpack_require__(98); + var Symbol = __webpack_require__(99); + var lineAnimationDiff = __webpack_require__(101); + var graphic = __webpack_require__(42); + + var polyHelper = __webpack_require__(102); + + var ChartView = __webpack_require__(41); + + function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + for (var i = 0; i < points1.length; i++) { + var p1 = points1[i]; + var p2 = points2[i]; + if (p1[0] !== p2[0] || p1[1] !== p2[1]) { + return; + } + } + return true; + } + + function getSmooth(smooth) { + return typeof (smooth) === 'number' ? smooth : (smooth ? 0.3 : 0); + } + + function getAxisExtentWithGap(axis) { + var extent = axis.getGlobalExtent(); + if (axis.onBand) { + // Remove extra 1px to avoid line miter in clipped edge + var halfBandWidth = axis.getBandWidth() / 2 - 1; + var dir = extent[1] > extent[0] ? 1 : -1; + extent[0] += dir * halfBandWidth; + extent[1] -= dir * halfBandWidth; + } + return extent; + } + + function sign(val) { + return val >= 0 ? 1 : -1; + } + /** + * @param {module:echarts/coord/cartesian/Cartesian2D|module:echarts/coord/polar/Polar} coordSys + * @param {module:echarts/data/List} data + * @param {Array.>} points + * @private + */ + function getStackedOnPoints(coordSys, data) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = baseAxis.onZero + ? 0 : valueAxis.scale.getExtent()[0]; + + var valueDim = valueAxis.dim; + + var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0; + + return data.mapArray([valueDim], function (val, idx) { + var stackedOnSameSign; + var stackedOn = data.stackedOn; + // Find first stacked value with same sign + while (stackedOn && + sign(stackedOn.get(valueDim, idx)) === sign(val) + ) { + stackedOnSameSign = stackedOn; + break; + } + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseAxis.dim, idx); + stackedData[1 - baseDataOffset] = stackedOnSameSign + ? stackedOnSameSign.get(valueDim, idx, true) : valueStart; + + return coordSys.dataToPoint(stackedData); + }, true); + } + + function queryDataIndex(data, payload) { + if (payload.dataIndex != null) { + return payload.dataIndex; + } + else if (payload.name != null) { + return data.indexOfName(payload.name); + } + } + + function createGridClipShape(cartesian, hasAnimation, seriesModel) { + var xExtent = getAxisExtentWithGap(cartesian.getAxis('x')); + var yExtent = getAxisExtentWithGap(cartesian.getAxis('y')); + var isHorizontal = cartesian.getBaseAxis().isHorizontal(); + + var x = xExtent[0]; + var y = yExtent[0]; + var width = xExtent[1] - x; + var height = yExtent[1] - y; + // Expand clip shape to avoid line value exceeds axis + if (!seriesModel.get('clipOverflow')) { + if (isHorizontal) { + y -= height; + height *= 3; + } + else { + x -= width; + width *= 3; + } + } + var clipPath = new graphic.Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + + if (hasAnimation) { + clipPath.shape[isHorizontal ? 'width' : 'height'] = 0; + graphic.initProps(clipPath, { + shape: { + width: width, + height: height + } + }, seriesModel); + } + + return clipPath; + } + + function createPolarClipShape(polar, hasAnimation, seriesModel) { + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); + + var radiusExtent = radiusAxis.getExtent(); + var angleExtent = angleAxis.getExtent(); + + var RADIAN = Math.PI / 180; + + var clipPath = new graphic.Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: radiusExtent[0], + r: radiusExtent[1], + startAngle: -angleExtent[0] * RADIAN, + endAngle: -angleExtent[1] * RADIAN, + clockwise: angleAxis.inverse + } + }); + + if (hasAnimation) { + clipPath.shape.endAngle = -angleExtent[0] * RADIAN; + graphic.initProps(clipPath, { + shape: { + endAngle: -angleExtent[1] * RADIAN + } + }, seriesModel); + } + + return clipPath; + } + + function createClipShape(coordSys, hasAnimation, seriesModel) { + return coordSys.type === 'polar' + ? createPolarClipShape(coordSys, hasAnimation, seriesModel) + : createGridClipShape(coordSys, hasAnimation, seriesModel); + } + + module.exports = ChartView.extend({ + + type: 'line', + + init: function () { + var lineGroup = new graphic.Group(); + + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + }, + + render: function (seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel('lineStyle.normal'); + var areaStyleModel = seriesModel.getModel('areaStyle.normal'); + + var points = data.mapArray(data.getItemLayout, true); + + var isCoordSysPolar = coordSys.type === 'polar'; + var prevCoordSys = this._coordSys; + + var symbolDraw = this._symbolDraw; + var polyline = this._polyline; + var polygon = this._polygon; + + var lineGroup = this._lineGroup; + + var hasAnimation = seriesModel.get('animation'); + + var isAreaChart = !areaStyleModel.isEmpty(); + var stackedOnPoints = getStackedOnPoints(coordSys, data); + + var showSymbol = seriesModel.get('showSymbol'); + + var isSymbolIgnore = showSymbol && !isCoordSysPolar && !seriesModel.get('showAllSymbol') + && this._getSymbolIgnoreFunc(data, coordSys); + + // Remove temporary symbols + var oldData = this._data; + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + + // Remove previous created symbols if showSymbol changed to false + if (!showSymbol) { + symbolDraw.remove(); + } + + group.add(lineGroup); + + // Initialization animation or coordinate system changed + if ( + !(polyline && prevCoordSys.type === coordSys.type) + ) { + showSymbol && symbolDraw.updateData(data, isSymbolIgnore); + + polyline = this._newPolyline(points, coordSys, hasAnimation); + if (isAreaChart) { + polygon = this._newPolygon( + points, stackedOnPoints, + coordSys, hasAnimation + ); + } + lineGroup.setClipPath(createClipShape(coordSys, true, seriesModel)); + } + else { + if (isAreaChart && !polygon) { + // If areaStyle is added + polygon = this._newPolygon( + points, stackedOnPoints, + coordSys, hasAnimation + ); + } + else if (polygon && !isAreaChart) { + // If areaStyle is removed + lineGroup.remove(polygon); + polygon = this._polygon = null; + } + + // Update clipPath + lineGroup.setClipPath(createClipShape(coordSys, false, seriesModel)); + + // Always update, or it is wrong in the case turning on legend + // because points are not changed + showSymbol && symbolDraw.updateData(data, isSymbolIgnore); + + // Stop symbol animation and sync with line points + // FIXME performance? + data.eachItemGraphicEl(function (el) { + el.stopAnimation(true); + }); + + // In the case data zoom triggerred refreshing frequently + // Data may not change if line has a category axis. So it should animate nothing + if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) + || !isPointsSame(this._points, points) + ) { + if (hasAnimation) { + this._updateAnimation( + data, stackedOnPoints, coordSys, api + ); + } + else { + polyline.setShape({ + points: points + }); + polygon && polygon.setShape({ + points: points, + stackedOnPoints: stackedOnPoints + }); + } + } + } + + polyline.setStyle(zrUtil.defaults( + // Use color in lineStyle first + lineStyleModel.getLineStyle(), + { + stroke: data.getVisual('color'), + lineJoin: 'bevel' + } + )); + + var smooth = seriesModel.get('smooth'); + smooth = getSmooth(seriesModel.get('smooth')); + polyline.setShape({ + smooth: smooth, + smoothMonotone: seriesModel.get('smoothMonotone') + }); + + if (polygon) { + var stackedOn = data.stackedOn; + var stackedOnSmooth = 0; + + polygon.style.opacity = 0.7; + polygon.setStyle(zrUtil.defaults( + areaStyleModel.getAreaStyle(), + { + fill: data.getVisual('color'), + lineJoin: 'bevel' + } + )); + + if (stackedOn) { + var stackedOnSeries = stackedOn.hostModel; + stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth')); + } + + polygon.setShape({ + smooth: smooth, + stackedOnSmooth: stackedOnSmooth, + smoothMonotone: seriesModel.get('smoothMonotone') + }); + } + + this._data = data; + // Save the coordinate system for transition animation when data changed + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + }, + + highlight: function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (!symbol) { + // Create a temporary symbol if it is not exists + var pt = data.getItemLayout(dataIndex); + symbol = new Symbol(data, dataIndex, api); + symbol.position = pt; + symbol.setZ( + seriesModel.get('zlevel'), + seriesModel.get('z') + ); + symbol.ignore = isNaN(pt[0]) || isNaN(pt[1]); + symbol.__temp = true; + data.setItemGraphicEl(dataIndex, symbol); + + // Stop scale animation + symbol.stopSymbolAnimation(true); + + this.group.add(symbol); + } + symbol.highlight(); + } + else { + // Highlight whole series + ChartView.prototype.highlight.call( + this, seriesModel, ecModel, api, payload + ); + } + }, + + downplay: function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (symbol) { + if (symbol.__temp) { + data.setItemGraphicEl(dataIndex, null); + this.group.remove(symbol); + } + else { + symbol.downplay(); + } + } + } + else { + // Downplay whole series + ChartView.prototype.downplay.call( + this, seriesModel, ecModel, api, payload + ); + } + }, + + /** + * @param {module:zrender/container/Group} group + * @param {Array.>} points + * @private + */ + _newPolyline: function (points) { + var polyline = this._polyline; + // Remove previous created polyline + if (polyline) { + this._lineGroup.remove(polyline); + } + + polyline = new polyHelper.Polyline({ + shape: { + points: points + }, + silent: true, + z2: 10 + }); + + this._lineGroup.add(polyline); + + this._polyline = polyline; + + return polyline; + }, + + /** + * @param {module:zrender/container/Group} group + * @param {Array.>} stackedOnPoints + * @param {Array.>} points + * @private + */ + _newPolygon: function (points, stackedOnPoints) { + var polygon = this._polygon; + // Remove previous created polygon + if (polygon) { + this._lineGroup.remove(polygon); + } + + polygon = new polyHelper.Polygon({ + shape: { + points: points, + stackedOnPoints: stackedOnPoints + }, + silent: true + }); + + this._lineGroup.add(polygon); + + this._polygon = polygon; + return polygon; + }, + /** + * @private + */ + _getSymbolIgnoreFunc: function (data, coordSys) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + // `getLabelInterval` is provided by echarts/component/axis + if (categoryAxis && categoryAxis.isLabelIgnored) { + return zrUtil.bind(categoryAxis.isLabelIgnored, categoryAxis); + } + }, + + /** + * @private + */ + // FIXME Two value axis + _updateAnimation: function (data, stackedOnPoints, coordSys, api) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + + var diff = lineAnimationDiff( + this._data, data, + this._stackedOnPoints, stackedOnPoints, + this._coordSys, coordSys + ); + polyline.shape.points = diff.current; + + graphic.updateProps(polyline, { + shape: { + points: diff.next + } + }, seriesModel); + + if (polygon) { + polygon.setShape({ + points: diff.current, + stackedOnPoints: diff.stackedOnCurrent + }); + graphic.updateProps(polygon, { + shape: { + points: diff.next, + stackedOnPoints: diff.stackedOnNext + } + }, seriesModel); + } + + var updatedDataInfo = []; + var diffStatus = diff.status; + + for (var i = 0; i < diffStatus.length; i++) { + var cmd = diffStatus[i].cmd; + if (cmd === '=') { + var el = data.getItemGraphicEl(diffStatus[i].idx1); + if (el) { + updatedDataInfo.push({ + el: el, + ptIdx: i // Index of points + }); + } + } + } + + if (polyline.animators && polyline.animators.length) { + polyline.animators[0].during(function () { + for (var i = 0; i < updatedDataInfo.length; i++) { + var el = updatedDataInfo[i].el; + el.attr('position', polyline.shape.points[updatedDataInfo[i].ptIdx]); + } + }); + } + }, + + remove: function (ecModel) { + var group = this.group; + var oldData = this._data; + this._lineGroup.removeAll(); + this._symbolDraw.remove(true); + // Remove temporary created elements when highlighting + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + + this._polyline = + this._polygon = + this._coordSys = + this._points = + this._stackedOnPoints = + this._data = null; + } + }); + + +/***/ }, +/* 98 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/SymbolDraw + */ + + + var graphic = __webpack_require__(42); + var Symbol = __webpack_require__(99); + + /** + * @constructor + * @alias module:echarts/chart/helper/SymbolDraw + * @param {module:zrender/graphic/Group} [symbolCtor] + */ + function SymbolDraw(symbolCtor) { + this.group = new graphic.Group(); + + this._symbolCtor = symbolCtor || Symbol; + } + + var symbolDrawProto = SymbolDraw.prototype; + + function symbolNeedsDraw(data, idx, isIgnore) { + var point = data.getItemLayout(idx); + return point && !isNaN(point[0]) && !isNaN(point[1]) && !(isIgnore && isIgnore(idx)) + && data.getItemVisual(idx, 'symbol') !== 'none'; + } + /** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + * @param {Array.} [isIgnore] + */ + symbolDrawProto.updateData = function (data, isIgnore) { + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + + var SymbolCtor = this._symbolCtor; + + data.diff(oldData) + .add(function (newIdx) { + var point = data.getItemLayout(newIdx); + if (symbolNeedsDraw(data, newIdx, isIgnore)) { + var symbolEl = new SymbolCtor(data, newIdx); + symbolEl.attr('position', point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }) + .update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = data.getItemLayout(newIdx); + if (!symbolNeedsDraw(data, newIdx, isIgnore)) { + group.remove(symbolEl); + return; + } + if (!symbolEl) { + symbolEl = new SymbolCtor(data, newIdx); + symbolEl.attr('position', point); + } + else { + symbolEl.updateData(data, newIdx); + graphic.updateProps(symbolEl, { + position: point + }, seriesModel); + } + + // Add back + group.add(symbolEl); + + data.setItemGraphicEl(newIdx, symbolEl); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && el.fadeOut(function () { + group.remove(el); + }); + }) + .execute(); + + this._data = data; + }; + + symbolDrawProto.updateLayout = function () { + var data = this._data; + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + el.attr('position', data.getItemLayout(idx)); + }); + } + }; + + symbolDrawProto.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; + if (data) { + if (enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }); + }); + } + else { + group.removeAll(); + } + } + }; + + module.exports = SymbolDraw; + + +/***/ }, +/* 99 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/Symbol + */ + + + var zrUtil = __webpack_require__(3); + var symbolUtil = __webpack_require__(100); + var graphic = __webpack_require__(42); + var numberUtil = __webpack_require__(7); + + function normalizeSymbolSize(symbolSize) { + if (!zrUtil.isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + return symbolSize; + } + + /** + * @constructor + * @alias {module:echarts/chart/helper/Symbol} + * @param {module:echarts/data/List} data + * @param {number} idx + * @extends {module:zrender/graphic/Group} + */ + function Symbol(data, idx) { + graphic.Group.call(this); + + this.updateData(data, idx); + } + + var symbolProto = Symbol.prototype; + + function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); + } + + symbolProto._createSymbol = function (symbolType, data, idx) { + // Remove paths created before + this.removeAll(); + + var seriesModel = data.hostModel; + var color = data.getItemVisual(idx, 'color'); + + var symbolPath = symbolUtil.createSymbol( + symbolType, -0.5, -0.5, 1, 1, color + ); + + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + culling: true, + scale: [0, 0] + }); + // Rewrite drift method + symbolPath.drift = driftSymbol; + + var size = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + + graphic.initProps(symbolPath, { + scale: size + }, seriesModel); + + this._symbolType = symbolType; + + this.add(symbolPath); + }; + + /** + * Stop animation + * @param {boolean} toLastFrame + */ + symbolProto.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(toLastFrame); + }; + + /** + * Get scale(aka, current symbol size). + * Including the change caused by animation + * @param {Array.} toLastFrame + */ + symbolProto.getScale = function () { + return this.childAt(0).scale; + }; + + /** + * Highlight symbol + */ + symbolProto.highlight = function () { + this.childAt(0).trigger('emphasis'); + }; + + /** + * Downplay symbol + */ + symbolProto.downplay = function () { + this.childAt(0).trigger('normal'); + }; + + /** + * @param {number} zlevel + * @param {number} z + */ + symbolProto.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; + }; + + symbolProto.setDraggable = function (draggable) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = draggable ? 'move' : 'pointer'; + }; + /** + * Update symbol properties + * @param {module:echarts/data/List} data + * @param {number} idx + */ + symbolProto.updateData = function (data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + if (symbolType !== this._symbolType) { + this._createSymbol(symbolType, data, idx); + } + else { + var symbolPath = this.childAt(0); + graphic.updateProps(symbolPath, { + scale: symbolSize + }, seriesModel); + } + this._updateCommon(data, idx, symbolSize); + + this._seriesModel = seriesModel; + }; + + // Update common properties + var normalStyleAccessPath = ['itemStyle', 'normal']; + var emphasisStyleAccessPath = ['itemStyle', 'emphasis']; + var normalLabelAccessPath = ['label', 'normal']; + var emphasisLabelAccessPath = ['label', 'emphasis']; + + symbolProto._updateCommon = function (data, idx, symbolSize) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath); + var color = data.getItemVisual(idx, 'color'); + + var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle(); + + symbolPath.rotation = itemModel.getShallow('symbolRotate') * Math.PI / 180 || 0; + + var symbolOffset = itemModel.getShallow('symbolOffset'); + if (symbolOffset) { + var pos = symbolPath.position; + pos[0] = numberUtil.parsePercent(symbolOffset[0], symbolSize[0]); + pos[1] = numberUtil.parsePercent(symbolOffset[1], symbolSize[1]); + } + + symbolPath.setColor(color); + + zrUtil.extend( + symbolPath.style, + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + normalItemStyleModel.getItemStyle(['color']) + ); + + var labelModel = itemModel.getModel(normalLabelAccessPath); + var hoverLabelModel = itemModel.getModel(emphasisLabelAccessPath); + + var elStyle = symbolPath.style; + + // Get last value dim + var dimensions = data.dimensions.slice(); + var valueDim = dimensions.pop(); + var dataType; + while ( + ((dataType = data.getDimensionInfo(valueDim).type) === 'ordinal') + || (dataType === 'time') + ) { + valueDim = dimensions.pop(); + } + + if (labelModel.get('show')) { + graphic.setText(elStyle, labelModel, color); + elStyle.text = zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'normal'), + data.get(valueDim, idx) + ); + } + else { + elStyle.text = ''; + } + + if (hoverLabelModel.getShallow('show')) { + graphic.setText(hoverStyle, hoverLabelModel, color); + hoverStyle.text = zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'emphasis'), + data.get(valueDim, idx) + ); + } + else { + hoverStyle.text = ''; + } + + var size = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + + symbolPath.off('mouseover') + .off('mouseout') + .off('emphasis') + .off('normal'); + + graphic.setHoverStyle(symbolPath, hoverStyle); + + if (itemModel.getShallow('hoverAnimation')) { + var onEmphasis = function() { + var ratio = size[1] / size[0]; + this.animateTo({ + scale: [ + Math.max(size[0] * 1.1, size[0] + 3), + Math.max(size[1] * 1.1, size[1] + 3 * ratio) + ] + }, 400, 'elasticOut'); + }; + var onNormal = function() { + this.animateTo({ + scale: size + }, 400, 'elasticOut'); + }; + symbolPath.on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + } + }; + + symbolProto.fadeOut = function (cb) { + var symbolPath = this.childAt(0); + // Not show text when animating + symbolPath.style.text = ''; + graphic.updateProps(symbolPath, { + scale: [0, 0] + }, this._seriesModel, cb); + }; + + zrUtil.inherits(Symbol, graphic.Group); + + module.exports = Symbol; + + +/***/ }, +/* 100 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Symbol factory + + + var graphic = __webpack_require__(42); + var BoundingRect = __webpack_require__(15); + + /** + * Triangle shape + * @inner + */ + var Triangle = graphic.extendShape({ + type: 'triangle', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy + height); + path.lineTo(cx - width, cy + height); + path.closePath(); + } + }); + /** + * Diamond shape + * @inner + */ + var Diamond = graphic.extendShape({ + type: 'diamond', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy); + path.lineTo(cx, cy + height); + path.lineTo(cx - width, cy); + path.closePath(); + } + }); + + /** + * Pin shape + * @inner + */ + var Pin = graphic.extendShape({ + type: 'pin', + shape: { + // x, y on the cusp + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (path, shape) { + var x = shape.x; + var y = shape.y; + var w = shape.width / 5 * 3; + // Height must be larger than width + var h = Math.max(w, shape.height); + var r = w / 2; + + // Dist on y with tangent point and circle center + var dy = r * r / (h - r); + var cy = y - h + r + dy; + var angle = Math.asin(dy / r); + // Dist on x with tangent point and circle center + var dx = Math.cos(angle) * r; + + var tanX = Math.sin(angle); + var tanY = Math.cos(angle); + + path.arc( + x, cy, r, + Math.PI - angle, + Math.PI * 2 + angle + ); + + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + path.bezierCurveTo( + x + dx - tanX * cpLen, cy + dy + tanY * cpLen, + x, y - cpLen2, + x, y + ); + path.bezierCurveTo( + x, y - cpLen2, + x - dx + tanX * cpLen, cy + dy + tanY * cpLen, + x - dx, cy + dy + ); + path.closePath(); + } + }); + + /** + * Arrow shape + * @inner + */ + var Arrow = graphic.extendShape({ + + type: 'arrow', + + shape: { + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (ctx, shape) { + var height = shape.height; + var width = shape.width; + var x = shape.x; + var y = shape.y; + var dx = width / 3 * 2; + ctx.moveTo(x, y); + ctx.lineTo(x + dx, y + height); + ctx.lineTo(x, y + height / 4 * 3); + ctx.lineTo(x - dx, y + height); + ctx.lineTo(x, y); + ctx.closePath(); + } + }); + + /** + * Map of path contructors + * @type {Object.} + */ + var symbolCtors = { + line: graphic.Line, + + rect: graphic.Rect, + + roundRect: graphic.Rect, + + square: graphic.Rect, + + circle: graphic.Circle, + + diamond: Diamond, + + pin: Pin, + + arrow: Arrow, + + triangle: Triangle + }; + + var symbolShapeMakers = { + + line: function (x, y, w, h, shape) { + // FIXME + shape.x1 = x; + shape.y1 = y + h / 2; + shape.x2 = x + w; + shape.y2 = y + h / 2; + }, + + rect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + }, + + roundRect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + shape.r = Math.min(w, h) / 4; + }, + + square: function (x, y, w, h, shape) { + var size = Math.min(w, h); + shape.x = x; + shape.y = y; + shape.width = size; + shape.height = size; + }, + + circle: function (x, y, w, h, shape) { + // Put circle in the center of square + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.r = Math.min(w, h) / 2; + }, + + diamond: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + }, + + pin: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + + arrow: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + + triangle: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + } + }; + + var symbolBuildProxies = {}; + for (var name in symbolCtors) { + symbolBuildProxies[name] = new symbolCtors[name](); + } + + var Symbol = graphic.extendShape({ + + type: 'symbol', + + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + + beforeBrush: function () { + var style = this.style; + var shape = this.shape; + // FIXME + if (shape.symbolType === 'pin' && style.textPosition === 'inside') { + style.textPosition = ['50%', '40%']; + style.textAlign = 'center'; + style.textVerticalAlign = 'middle'; + } + }, + + buildPath: function (ctx, shape) { + var symbolType = shape.symbolType; + var proxySymbol = symbolBuildProxies[symbolType]; + if (shape.symbolType !== 'none') { + if (!proxySymbol) { + // Default rect + symbolType = 'rect'; + proxySymbol = symbolBuildProxies[symbolType]; + } + symbolShapeMakers[symbolType]( + shape.x, shape.y, shape.width, shape.height, proxySymbol.shape + ); + proxySymbol.buildPath(ctx, proxySymbol.shape); + } + } + }); + + // Provide setColor helper method to avoid determine if set the fill or stroke outside + var symbolPathSetColor = function (color) { + if (this.type !== 'image') { + var symbolStyle = this.style; + var symbolShape = this.shape; + if (symbolShape && symbolShape.symbolType === 'line') { + symbolStyle.stroke = color; + } + else if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = '#fff'; + } + else { + // FIXME 判断图形默认是填充还是描边,使用 onlyStroke ? + symbolStyle.fill && (symbolStyle.fill = color); + symbolStyle.stroke && (symbolStyle.stroke = color); + } + this.dirty(); + } + }; + + var symbolUtil = { + /** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + * @param {string} symbolType + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + * @param {string} color + */ + createSymbol: function (symbolType, x, y, w, h, color) { + var isEmpty = symbolType.indexOf('empty') === 0; + if (isEmpty) { + symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); + } + var symbolPath; + + if (symbolType.indexOf('image://') === 0) { + symbolPath = new graphic.Image({ + style: { + image: symbolType.slice(8), + x: x, + y: y, + width: w, + height: h + } + }); + } + else if (symbolType.indexOf('path://') === 0) { + symbolPath = graphic.makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h)); + } + else { + symbolPath = new Symbol({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + + symbolPath.__isEmptyBrush = isEmpty; + + symbolPath.setColor = symbolPathSetColor; + + symbolPath.setColor(color); + + return symbolPath; + } + }; + + module.exports = symbolUtil; + + +/***/ }, +/* 101 */ +/***/ function(module, exports) { + + + + // var arrayDiff = require('zrender/lib/core/arrayDiff'); + // 'zrender/core/arrayDiff' has been used before, but it did + // not do well in performance when roam with fixed dataZoom window. + + function sign(val) { + return val >= 0 ? 1 : -1; + } + + function getStackedOnPoint(coordSys, data, idx) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = baseAxis.onZero + ? 0 : valueAxis.scale.getExtent()[0]; + + var valueDim = valueAxis.dim; + var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0; + + var stackedOnSameSign; + var stackedOn = data.stackedOn; + var val = data.get(valueDim, idx); + // Find first stacked value with same sign + while (stackedOn && + sign(stackedOn.get(valueDim, idx)) === sign(val) + ) { + stackedOnSameSign = stackedOn; + break; + } + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseAxis.dim, idx); + stackedData[1 - baseDataOffset] = stackedOnSameSign + ? stackedOnSameSign.get(valueDim, idx, true) : valueStart; + + return coordSys.dataToPoint(stackedData); + } + + // function convertToIntId(newIdList, oldIdList) { + // // Generate int id instead of string id. + // // Compare string maybe slow in score function of arrDiff + + // // Assume id in idList are all unique + // var idIndicesMap = {}; + // var idx = 0; + // for (var i = 0; i < newIdList.length; i++) { + // idIndicesMap[newIdList[i]] = idx; + // newIdList[i] = idx++; + // } + // for (var i = 0; i < oldIdList.length; i++) { + // var oldId = oldIdList[i]; + // // Same with newIdList + // if (idIndicesMap[oldId]) { + // oldIdList[i] = idIndicesMap[oldId]; + // } + // else { + // oldIdList[i] = idx++; + // } + // } + // } + + function diffData(oldData, newData) { + var diffResult = []; + + newData.diff(oldData) + .add(function (idx) { + diffResult.push({cmd: '+', idx: idx}); + }) + .update(function (newIdx, oldIdx) { + diffResult.push({cmd: '=', idx: oldIdx, idx1: newIdx}); + }) + .remove(function (idx) { + diffResult.push({cmd: '-', idx: idx}); + }) + .execute(); + + return diffResult; + } + + module.exports = function ( + oldData, newData, + oldStackedOnPoints, newStackedOnPoints, + oldCoordSys, newCoordSys + ) { + var diff = diffData(oldData, newData); + + // var newIdList = newData.mapArray(newData.getId); + // var oldIdList = oldData.mapArray(oldData.getId); + + // convertToIntId(newIdList, oldIdList); + + // // FIXME One data ? + // diff = arrayDiff(oldIdList, newIdList); + + var currPoints = []; + var nextPoints = []; + // Points for stacking base line + var currStackedPoints = []; + var nextStackedPoints = []; + + var status = []; + var sortedIndices = []; + var rawIndices = []; + var dims = newCoordSys.dimensions; + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + + // FIXME, animation is not so perfect when dataZoom window moves fast + // Which is in case remvoing or add more than one data in the tail or head + switch (diffItem.cmd) { + case '=': + var currentPt = oldData.getItemLayout(diffItem.idx); + var nextPt = newData.getItemLayout(diffItem.idx1); + // If previous data is NaN, use next point directly + if (isNaN(currentPt[0]) || isNaN(currentPt[1])) { + currentPt = nextPt.slice(); + } + currPoints.push(currentPt); + nextPoints.push(nextPt); + + currStackedPoints.push(oldStackedOnPoints[diffItem.idx]); + nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]); + + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + case '+': + var idx = diffItem.idx; + currPoints.push( + oldCoordSys.dataToPoint([ + newData.get(dims[0], idx, true), newData.get(dims[1], idx, true) + ]) + ); + + nextPoints.push(newData.getItemLayout(idx).slice()); + + currStackedPoints.push( + getStackedOnPoint(oldCoordSys, newData, idx) + ); + nextStackedPoints.push(newStackedOnPoints[idx]); + + rawIndices.push(newData.getRawIndex(idx)); + break; + case '-': + var idx = diffItem.idx; + var rawIndex = oldData.getRawIndex(idx); + // Data is replaced. In the case of dynamic data queue + // FIXME FIXME FIXME + if (rawIndex !== idx) { + currPoints.push(oldData.getItemLayout(idx)); + nextPoints.push(newCoordSys.dataToPoint([ + oldData.get(dims[0], idx, true), oldData.get(dims[1], idx, true) + ])); + + currStackedPoints.push(oldStackedOnPoints[idx]); + nextStackedPoints.push( + getStackedOnPoint( + newCoordSys, oldData, idx + ) + ); + + rawIndices.push(rawIndex); + } + else { + pointAdded = false; + } + } + + // Original indices + if (pointAdded) { + status.push(diffItem); + sortedIndices.push(sortedIndices.length); + } + } + + // Diff result may be crossed if all items are changed + // Sort by data index + sortedIndices.sort(function (a, b) { + return rawIndices[a] - rawIndices[b]; + }); + + var sortedCurrPoints = []; + var sortedNextPoints = []; + + var sortedCurrStackedPoints = []; + var sortedNextStackedPoints = []; + + var sortedStatus = []; + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + sortedCurrPoints[i] = currPoints[idx]; + sortedNextPoints[i] = nextPoints[idx]; + + sortedCurrStackedPoints[i] = currStackedPoints[idx]; + sortedNextStackedPoints[i] = nextStackedPoints[idx]; + + sortedStatus[i] = status[idx]; + } + + return { + current: sortedCurrPoints, + next: sortedNextPoints, + + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + + status: sortedStatus + }; + }; + + +/***/ }, +/* 102 */ +/***/ function(module, exports, __webpack_require__) { + + // Poly path support NaN point + + + var Path = __webpack_require__(44); + var vec2 = __webpack_require__(16); + + var vec2Min = vec2.min; + var vec2Max = vec2.max; + + var scaleAndAdd = vec2.scaleAndAdd; + var v2Copy = vec2.copy; + + // Temporary variable + var v = []; + var cp0 = []; + var cp1 = []; + + function drawSegment( + ctx, points, start, stop, len, + dir, smoothMin, smoothMax, smooth, smoothMonotone + ) { + var idx = start; + for (var k = 0; k < len; k++) { + var p = points[idx]; + if (idx >= stop || idx < 0 || isNaN(p[0]) || isNaN(p[1])) { + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]); + v2Copy(cp0, p); + } + else { + if (smooth > 0) { + var prevIdx = idx - dir; + var nextIdx = idx + dir; + + var ratioNextSeg = 0.5; + var prevP = points[prevIdx]; + var nextP = points[nextIdx]; + // Last point + if ((dir > 0 && (idx === len - 1 || isNaN(nextP[0]) || isNaN(nextP[1]))) + || (dir <= 0 && (idx === 0 || isNaN(nextP[0]) || isNaN(nextP[1]))) + ) { + v2Copy(cp1, p); + } + else { + // If next data is null + if (isNaN(nextP[0]) || isNaN(nextP[1])) { + nextP = p; + } + + vec2.sub(v, nextP, prevP); + + var lenPrevSeg; + var lenNextSeg; + if (smoothMonotone === 'x' || smoothMonotone === 'y') { + var dim = smoothMonotone === 'x' ? 0 : 1; + lenPrevSeg = Math.abs(p[dim] - prevP[dim]); + lenNextSeg = Math.abs(p[dim] - nextP[dim]); + } + else { + lenPrevSeg = vec2.dist(p, prevP); + lenNextSeg = vec2.dist(p, nextP); + } + + // Use ratio of seg length + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + + scaleAndAdd(cp1, p, v, -smooth * (1 - ratioNextSeg)); + } + // Smooth constraint + vec2Min(cp0, cp0, smoothMax); + vec2Max(cp0, cp0, smoothMin); + vec2Min(cp1, cp1, smoothMax); + vec2Max(cp1, cp1, smoothMin); + + ctx.bezierCurveTo( + cp0[0], cp0[1], + cp1[0], cp1[1], + p[0], p[1] + ); + // cp0 of next segment + scaleAndAdd(cp0, p, v, smooth * ratioNextSeg); + } + else { + ctx.lineTo(p[0], p[1]); + } + } + + idx += dir; + } + + return k; + } + + function getBoundingBox(points, smoothConstraint) { + var ptMin = [Infinity, Infinity]; + var ptMax = [-Infinity, -Infinity]; + if (smoothConstraint) { + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + if (pt[0] < ptMin[0]) { ptMin[0] = pt[0]; } + if (pt[1] < ptMin[1]) { ptMin[1] = pt[1]; } + if (pt[0] > ptMax[0]) { ptMax[0] = pt[0]; } + if (pt[1] > ptMax[1]) { ptMax[1] = pt[1]; } + } + } + return { + min: smoothConstraint ? ptMin : ptMax, + max: smoothConstraint ? ptMax : ptMin + }; + } + + module.exports = { + + Polyline: Path.extend({ + + type: 'ec-polyline', + + shape: { + points: [], + + smooth: 0, + + smoothConstraint: true, + + smoothMonotone: null + }, + + style: { + fill: null, + + stroke: '#000' + }, + + buildPath: function (ctx, shape) { + var points = shape.points; + + var i = 0; + var len = points.length; + + var result = getBoundingBox(points, shape.smoothConstraint); + + while (i < len) { + i += drawSegment( + ctx, points, i, len, len, + 1, result.min, result.max, shape.smooth, + shape.smoothMonotone + ) + 1; + } + } + }), + + Polygon: Path.extend({ + + type: 'ec-polygon', + + shape: { + points: [], + + // Offset between stacked base points and points + stackedOnPoints: [], + + smooth: 0, + + stackedOnSmooth: 0, + + smoothConstraint: true, + + smoothMonotone: null + }, + + buildPath: function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + + var i = 0; + var len = points.length; + var smoothMonotone = shape.smoothMonotone; + var bbox = getBoundingBox(points, shape.smoothConstraint); + var stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint); + while (i < len) { + var k = drawSegment( + ctx, points, i, len, len, + 1, bbox.min, bbox.max, shape.smooth, + smoothMonotone + ); + drawSegment( + ctx, stackedOnPoints, i + k - 1, len, k, + -1, stackedOnBBox.min, stackedOnBBox.max, shape.stackedOnSmooth, + smoothMonotone + ); + i += k + 1; + + ctx.closePath(); + } + } + }) + }; + + +/***/ }, +/* 103 */ +/***/ function(module, exports) { + + + + module.exports = function (seriesType, defaultSymbolType, legendSymbol, ecModel, api) { + + // Encoding visual for all series include which is filtered for legend drawing + ecModel.eachRawSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + + var symbolType = seriesModel.get('symbol') || defaultSymbolType; + var symbolSize = seriesModel.get('symbolSize'); + + data.setVisual({ + legendSymbol: legendSymbol || symbolType, + symbol: symbolType, + symbolSize: symbolSize + }); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + if (typeof symbolSize === 'function') { + data.each(function (idx) { + var rawValue = seriesModel.getRawValue(idx); + // FIXME + var params = seriesModel.getDataParams(idx); + data.setItemVisual(idx, 'symbolSize', symbolSize(rawValue, params)); + }); + } + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var itemSymbolType = itemModel.get('symbol', true); + var itemSymbolSize = itemModel.get('symbolSize', true); + // If has item symbol + if (itemSymbolType != null) { + data.setItemVisual(idx, 'symbol', itemSymbolType); + } + if (itemSymbolSize != null) { + // PENDING Transform symbolSize ? + data.setItemVisual(idx, 'symbolSize', itemSymbolSize); + } + }); + } + }); + }; + + +/***/ }, +/* 104 */ +/***/ function(module, exports) { + + + + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + + var dims = coordSys.dimensions; + data.each(dims, function (x, y, idx) { + var point; + if (!isNaN(x) && !isNaN(y)) { + point = coordSys.dataToPoint([x, y]); + } + else { + // Also {Array.}, not undefined to avoid if...else... statement + point = [NaN, NaN]; + } + + data.setItemLayout(idx, point); + }, true); + }); + }; + + +/***/ }, +/* 105 */ +/***/ function(module, exports) { + + + var samplers = { + average: function (frame) { + var sum = 0; + var count = 0; + for (var i = 0; i < frame.length; i++) { + if (!isNaN(frame[i])) { + sum += frame[i]; + count++; + } + } + // Return NaN if count is 0 + return count === 0 ? NaN : sum / count; + }, + sum: function (frame) { + var sum = 0; + for (var i = 0; i < frame.length; i++) { + // Ignore NaN + sum += frame[i] || 0; + } + return sum; + }, + max: function (frame) { + var max = -Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] > max && (max = frame[i]); + } + return max; + }, + min: function (frame) { + var min = Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } + return min; + } + }; + + var indexSampler = function (frame, value) { + return Math.round(frame.length / 2); + }; + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + // Only cartesian2d support down sampling + if (coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + // Coordinste system has been resized + var size = extent[1] - extent[0]; + var rate = Math.round(data.count() / size); + if (rate > 1) { + var sampler; + if (typeof sampling === 'string') { + sampler = samplers[sampling]; + } + else if (typeof sampling === 'function') { + sampler = sampling; + } + if (sampler) { + data = data.downSample( + valueAxis.dim, 1 / rate, sampler, indexSampler + ); + seriesModel.setData(data); + } + } + } + }, this); + }; + + +/***/ }, +/* 106 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + __webpack_require__(107); + + __webpack_require__(124); + + // Grid view + __webpack_require__(1).extendComponentView({ + + type: 'grid', + + render: function (gridModel, ecModel) { + this.group.removeAll(); + if (gridModel.get('show')) { + this.group.add(new graphic.Rect({ + shape:gridModel.coordinateSystem.getRect(), + style: zrUtil.defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true + })); + } + } + }); + + +/***/ }, +/* 107 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Grid is a region which contains at most 4 cartesian systems + * + * TODO Default cartesian + */ + var factory = exports; + + var layout = __webpack_require__(21); + var axisHelper = __webpack_require__(108); + + var zrUtil = __webpack_require__(3); + var Cartesian2D = __webpack_require__(114); + var Axis2D = __webpack_require__(116); + + var each = zrUtil.each; + + var ifAxisCrossZero = axisHelper.ifAxisCrossZero; + var niceScaleExtent = axisHelper.niceScaleExtent; + + // 依赖 GridModel, AxisModel 做预处理 + __webpack_require__(119); + + /** + * Check if the axis is used in the specified grid + * @inner + */ + function isAxisUsedInTheGrid(axisModel, gridModel, ecModel) { + return ecModel.getComponent('grid', axisModel.get('gridIndex')) === gridModel; + } + + function getLabelUnionRect(axis) { + var axisModel = axis.model; + var labels = axisModel.getFormattedLabels(); + var rect; + var step = 1; + var labelCount = labels.length; + if (labelCount > 40) { + // Simple optimization for large amount of labels + step = Math.ceil(labelCount / 40); + } + for (var i = 0; i < labelCount; i += step) { + if (!axis.isLabelIgnored(i)) { + var singleRect = axisModel.getTextRect(labels[i]); + // FIXME consider label rotate + rect ? rect.union(singleRect) : (rect = singleRect); + } + } + return rect; + } + + function Grid(gridModel, ecModel, api) { + /** + * @type {Object.} + * @private + */ + this._coordsMap = {}; + + /** + * @type {Array.} + * @private + */ + this._coordsList = []; + + /** + * @type {Object.} + * @private + */ + this._axesMap = {}; + + /** + * @type {Array.} + * @private + */ + this._axesList = []; + + this._initCartesian(gridModel, ecModel, api); + + this._model = gridModel; + } + + var gridProto = Grid.prototype; + + gridProto.type = 'grid'; + + gridProto.getRect = function () { + return this._rect; + }; + + gridProto.update = function (ecModel, api) { + + var axesMap = this._axesMap; + + this._updateScale(ecModel, this._model); + + function ifAxisCanNotOnZero(otherAxisDim) { + var axes = axesMap[otherAxisDim]; + for (var idx in axes) { + var axis = axes[idx]; + if (axis && (axis.type === 'category' || !ifAxisCrossZero(axis))) { + return true; + } + } + return false; + } + + each(axesMap.x, function (xAxis) { + niceScaleExtent(xAxis, xAxis.model); + }); + each(axesMap.y, function (yAxis) { + niceScaleExtent(yAxis, yAxis.model); + }); + // Fix configuration + each(axesMap.x, function (xAxis) { + // onZero can not be enabled in these two situations + // 1. When any other axis is a category axis + // 2. When any other axis not across 0 point + if (ifAxisCanNotOnZero('y')) { + xAxis.onZero = false; + } + }); + each(axesMap.y, function (yAxis) { + if (ifAxisCanNotOnZero('x')) { + yAxis.onZero = false; + } + }); + + // Resize again if containLabel is enabled + // FIXME It may cause getting wrong grid size in data processing stage + this.resize(this._model, api); + }; + + /** + * Resize the grid + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {module:echarts/ExtensionAPI} api + */ + gridProto.resize = function (gridModel, api) { + + var gridRect = layout.getLayoutRect( + gridModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + + this._rect = gridRect; + + var axesList = this._axesList; + + adjustAxes(); + + // Minus label size + if (gridModel.get('containLabel')) { + each(axesList, function (axis) { + if (!axis.model.get('axisLabel.inside')) { + var labelUnionRect = getLabelUnionRect(axis); + if (labelUnionRect) { + var dim = axis.isHorizontal() ? 'height' : 'width'; + var margin = axis.model.get('axisLabel.margin'); + gridRect[dim] -= labelUnionRect[dim] + margin; + if (axis.position === 'top') { + gridRect.y += labelUnionRect.height + margin; + } + else if (axis.position === 'left') { + gridRect.x += labelUnionRect.width + margin; + } + } + } + }); + + adjustAxes(); + } + + function adjustAxes() { + each(axesList, function (axis) { + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + updateAxisTransfrom(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } + }; + + /** + * @param {string} axisType + * @param {ndumber} [axisIndex] + */ + gridProto.getAxis = function (axisType, axisIndex) { + var axesMapOnDim = this._axesMap[axisType]; + if (axesMapOnDim != null) { + if (axisIndex == null) { + // Find first axis + for (var name in axesMapOnDim) { + return axesMapOnDim[name]; + } + } + return axesMapOnDim[axisIndex]; + } + }; + + gridProto.getCartesian = function (xAxisIndex, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + return this._coordsMap[key]; + }; + + /** + * Initialize cartesian coordinate systems + * @private + */ + gridProto._initCartesian = function (gridModel, ecModel, api) { + var axisPositionUsed = { + left: false, + right: false, + top: false, + bottom: false + }; + + var axesMap = { + x: {}, + y: {} + }; + var axesCount = { + x: 0, + y: 0 + }; + + /// Create axis + ecModel.eachComponent('xAxis', createAxisCreator('x'), this); + ecModel.eachComponent('yAxis', createAxisCreator('y'), this); + + if (!axesCount.x || !axesCount.y) { + // Roll back when there no either x or y axis + this._axesMap = {}; + this._axesList = []; + return; + } + + this._axesMap = axesMap; + + /// Create cartesian2d + each(axesMap.x, function (xAxis, xAxisIndex) { + each(axesMap.y, function (yAxis, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + var cartesian = new Cartesian2D(key); + + cartesian.grid = this; + + this._coordsMap[key] = cartesian; + this._coordsList.push(cartesian); + + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }, this); + }, this); + + function createAxisCreator(axisType) { + return function (axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel, ecModel)) { + return; + } + + var axisPosition = axisModel.get('position'); + if (axisType === 'x') { + // Fix position + if (axisPosition !== 'top' && axisPosition !== 'bottom') { + // Default bottom of X + axisPosition = 'bottom'; + } + if (axisPositionUsed[axisPosition]) { + axisPosition = axisPosition === 'top' ? 'bottom' : 'top'; + } + } + else { + // Fix position + if (axisPosition !== 'left' && axisPosition !== 'right') { + // Default left of Y + axisPosition = 'left'; + } + if (axisPositionUsed[axisPosition]) { + axisPosition = axisPosition === 'left' ? 'right' : 'left'; + } + } + axisPositionUsed[axisPosition] = true; + + var axis = new Axis2D( + axisType, axisHelper.createScaleByModel(axisModel), + [0, 0], + axisModel.get('type'), + axisPosition + ); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + + axis.onZero = axisModel.get('axisLine.onZero'); + + // Inject axis into axisModel + axisModel.axis = axis; + + // Inject axisModel into axis + axis.model = axisModel; + + // Index of axis, can be used as key + axis.index = idx; + + this._axesList.push(axis); + + axesMap[axisType][idx] = axis; + axesCount[axisType]++; + }; + } + }; + + /** + * Update cartesian properties from series + * @param {module:echarts/model/Option} option + * @private + */ + gridProto._updateScale = function (ecModel, gridModel) { + // Reset scale + zrUtil.each(this._axesList, function (axis) { + axis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'cartesian2d') { + var xAxisIndex = seriesModel.get('xAxisIndex'); + var yAxisIndex = seriesModel.get('yAxisIndex'); + + var xAxisModel = ecModel.getComponent('xAxis', xAxisIndex); + var yAxisModel = ecModel.getComponent('yAxis', yAxisIndex); + + if (!isAxisUsedInTheGrid(xAxisModel, gridModel, ecModel) + || !isAxisUsedInTheGrid(yAxisModel, gridModel, ecModel) + ) { + return; + } + + var cartesian = this.getCartesian(xAxisIndex, yAxisIndex); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + + if (data.type === 'list') { + unionExtent(data, xAxis, seriesModel); + unionExtent(data, yAxis, seriesModel); + } + } + }, this); + + function unionExtent(data, axis, seriesModel) { + each(seriesModel.coordDimToDataDim(axis.dim), function (dim) { + axis.scale.unionExtent(data.getDataExtent( + dim, axis.scale.type !== 'ordinal' + )); + }); + } + }; + + /** + * @inner + */ + function updateAxisTransfrom(axis, coordBase) { + var axisExtent = axis.getExtent(); + var axisExtentSum = axisExtent[0] + axisExtent[1]; + + // Fast transform + axis.toGlobalCoord = axis.dim === 'x' + ? function (coord) { + return coord + coordBase; + } + : function (coord) { + return axisExtentSum - coord + coordBase; + }; + axis.toLocalCoord = axis.dim === 'x' + ? function (coord) { + return coord - coordBase; + } + : function (coord) { + return axisExtentSum - coord + coordBase; + }; + } + + Grid.create = function (ecModel, api) { + var grids = []; + ecModel.eachComponent('grid', function (gridModel, idx) { + var grid = new Grid(gridModel, ecModel, api); + grid.name = 'grid_' + idx; + grid.resize(gridModel, api); + + gridModel.coordinateSystem = grid; + + grids.push(grid); + }); + + // Inject the coordinateSystems into seriesModel + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') !== 'cartesian2d') { + return; + } + var xAxisIndex = seriesModel.get('xAxisIndex'); + // TODO Validate + var xAxisModel = ecModel.getComponent('xAxis', xAxisIndex); + var grid = grids[xAxisModel.get('gridIndex')]; + seriesModel.coordinateSystem = grid.getCartesian( + xAxisIndex, seriesModel.get('yAxisIndex') + ); + }); + + return grids; + }; + + // For deciding which dimensions to use when creating list data + Grid.dimensions = Cartesian2D.prototype.dimensions; + + __webpack_require__(25).register('cartesian2d', Grid); + + module.exports = Grid; + + +/***/ }, +/* 108 */ +/***/ function(module, exports, __webpack_require__) { + + + + var OrdinalScale = __webpack_require__(109); + var IntervalScale = __webpack_require__(111); + __webpack_require__(112); + __webpack_require__(113); + var Scale = __webpack_require__(110); + + var numberUtil = __webpack_require__(7); + var zrUtil = __webpack_require__(3); + var textContain = __webpack_require__(14); + var axisHelper = {}; + + /** + * Get axis scale extent before niced. + */ + axisHelper.getScaleExtent = function (axis, model) { + var scale = axis.scale; + var originalExtent = scale.getExtent(); + var span = originalExtent[1] - originalExtent[0]; + if (scale.type === 'ordinal') { + // If series has no data, scale extent may be wrong + if (!isFinite(span)) { + return [0, 0]; + } + else { + return originalExtent; + } + } + var min = model.getMin ? model.getMin() : model.get('min'); + var max = model.getMax ? model.getMax() : model.get('max'); + var crossZero = model.getNeedCrossZero + ? model.getNeedCrossZero() : !model.get('scale'); + var boundaryGap = model.get('boundaryGap'); + if (!zrUtil.isArray(boundaryGap)) { + boundaryGap = [boundaryGap || 0, boundaryGap || 0]; + } + boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1); + boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1); + var fixMin = true; + var fixMax = true; + // Add boundary gap + if (min == null) { + min = originalExtent[0] - boundaryGap[0] * span; + fixMin = false; + } + if (max == null) { + max = originalExtent[1] + boundaryGap[1] * span; + fixMax = false; + } + // TODO Only one data + if (min === 'dataMin') { + min = originalExtent[0]; + } + if (max === 'dataMax') { + max = originalExtent[1]; + } + // Evaluate if axis needs cross zero + if (crossZero) { + // Axis is over zero and min is not set + if (min > 0 && max > 0 && !fixMin) { + min = 0; + } + // Axis is under zero and max is not set + if (min < 0 && max < 0 && !fixMax) { + max = 0; + } + } + return [min, max]; + }; + + axisHelper.niceScaleExtent = function (axis, model) { + var scale = axis.scale; + var extent = axisHelper.getScaleExtent(axis, model); + var fixMin = (model.getMin ? model.getMin() : model.get('min')) != null; + var fixMax = (model.getMax ? model.getMax() : model.get('max')) != null; + scale.setExtent(extent[0], extent[1]); + scale.niceExtent(model.get('splitNumber'), fixMin, fixMax); + + // If some one specified the min, max. And the default calculated interval + // is not good enough. He can specify the interval. It is often appeared + // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard + // to be 60. + // FIXME + var interval = model.get('interval'); + if (interval != null) { + scale.setInterval && scale.setInterval(interval); + } + }; + + /** + * @param {module:echarts/model/Model} model + * @param {string} [axisType] Default retrieve from model.type + * @return {module:echarts/scale/*} + */ + axisHelper.createScaleByModel = function(model, axisType) { + axisType = axisType || model.get('type'); + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale( + model.getCategories(), [Infinity, -Infinity] + ); + case 'value': + return new IntervalScale(); + // Extended scale, like time and log + default: + return (Scale.getClass(axisType) || IntervalScale).create(model); + } + } + }; + + /** + * Check if the axis corss 0 + */ + axisHelper.ifAxisCrossZero = function (axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !((min > 0 && max > 0) || (min < 0 && max < 0)); + }; + + /** + * @param {Array.} tickCoords In axis self coordinate. + * @param {Array.} labels + * @param {string} font + * @param {boolean} isAxisHorizontal + * @return {number} + */ + axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) { + // FIXME + // 不同角的axis和label,不只是horizontal和vertical. + + var textSpaceTakenRect; + var autoLabelInterval = 0; + var accumulatedLabelInterval = 0; + + var step = 1; + if (labels.length > 40) { + // Simple optimization for large amount of labels + step = Math.round(labels.length / 40); + } + for (var i = 0; i < tickCoords.length; i += step) { + var tickCoord = tickCoords[i]; + var rect = textContain.getBoundingRect( + labels[i], font, 'center', 'top' + ); + rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord; + rect[isAxisHorizontal ? 'width' : 'height'] *= 1.5; + if (!textSpaceTakenRect) { + textSpaceTakenRect = rect.clone(); + } + // There is no space for current label; + else if (textSpaceTakenRect.intersect(rect)) { + accumulatedLabelInterval++; + autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval); + } + else { + textSpaceTakenRect.union(rect); + // Reset + accumulatedLabelInterval = 0; + } + } + if (autoLabelInterval === 0 && step > 1) { + return step; + } + return autoLabelInterval * step; + }; + + /** + * @param {Object} axis + * @param {Function} labelFormatter + * @return {Array.} + */ + axisHelper.getFormattedLabels = function (axis, labelFormatter) { + var scale = axis.scale; + var labels = scale.getTicksLabels(); + var ticks = scale.getTicks(); + if (typeof labelFormatter === 'string') { + labelFormatter = (function (tpl) { + return function (val) { + return tpl.replace('{value}', val); + }; + })(labelFormatter); + return zrUtil.map(labels, labelFormatter); + } + else if (typeof labelFormatter === 'function') { + return zrUtil.map(ticks, function (tick, idx) { + return labelFormatter( + axis.type === 'category' ? scale.getLabel(tick) : tick, + idx + ); + }, this); + } + else { + return labels; + } + }; + + module.exports = axisHelper; + + +/***/ }, +/* 109 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Linear continuous scale + * @module echarts/coord/scale/Ordinal + * + * http://en.wikipedia.org/wiki/Level_of_measurement + */ + + // FIXME only one data + + + var zrUtil = __webpack_require__(3); + var Scale = __webpack_require__(110); + + var scaleProto = Scale.prototype; + + var OrdinalScale = Scale.extend({ + + type: 'ordinal', + + init: function (data, extent) { + this._data = data; + this._extent = extent || [0, data.length - 1]; + }, + + parse: function (val) { + return typeof val === 'string' + ? zrUtil.indexOf(this._data, val) + // val might be float. + : Math.round(val); + }, + + contain: function (rank) { + rank = this.parse(rank); + return scaleProto.contain.call(this, rank) + && this._data[rank] != null; + }, + + /** + * Normalize given rank or name to linear [0, 1] + * @param {number|string} [val] + * @return {number} + */ + normalize: function (val) { + return scaleProto.normalize.call(this, this.parse(val)); + }, + + scale: function (val) { + return Math.round(scaleProto.scale.call(this, val)); + }, + + /** + * @return {Array} + */ + getTicks: function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + + while (rank <= extent[1]) { + ticks.push(rank); + rank++; + } + + return ticks; + }, + + /** + * Get item on rank n + * @param {number} n + * @return {string} + */ + getLabel: function (n) { + return this._data[n]; + }, + + /** + * @return {number} + */ + count: function () { + return this._extent[1] - this._extent[0] + 1; + }, + + niceTicks: zrUtil.noop, + niceExtent: zrUtil.noop + }); + + /** + * @return {module:echarts/scale/Time} + */ + OrdinalScale.create = function () { + return new OrdinalScale(); + }; + + module.exports = OrdinalScale; + + +/***/ }, +/* 110 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * // Scale class management + * @module echarts/scale/Scale + */ + + + var clazzUtil = __webpack_require__(9); + + function Scale() { + /** + * Extent + * @type {Array.} + * @protected + */ + this._extent = [Infinity, -Infinity]; + + /** + * Step is calculated in adjustExtent + * @type {Array.} + * @protected + */ + this._interval = 0; + + this.init && this.init.apply(this, arguments); + } + + var scaleProto = Scale.prototype; + + /** + * Parse input val to valid inner number. + * @param {*} val + * @return {number} + */ + scaleProto.parse = function (val) { + // Notice: This would be a trap here, If the implementation + // of this method depends on extent, and this method is used + // before extent set (like in dataZoom), it would be wrong. + // Nevertheless, parse does not depend on extent generally. + return val; + }; + + scaleProto.contain = function (val) { + var extent = this._extent; + return val >= extent[0] && val <= extent[1]; + }; + + /** + * Normalize value to linear [0, 1], return 0.5 if extent span is 0 + * @param {number} val + * @return {number} + */ + scaleProto.normalize = function (val) { + var extent = this._extent; + if (extent[1] === extent[0]) { + return 0.5; + } + return (val - extent[0]) / (extent[1] - extent[0]); + }; + + /** + * Scale normalized value + * @param {number} val + * @return {number} + */ + scaleProto.scale = function (val) { + var extent = this._extent; + return val * (extent[1] - extent[0]) + extent[0]; + }; + + /** + * Set extent from data + * @param {Array.} other + */ + scaleProto.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); + }; + + /** + * Get extent + * @return {Array.} + */ + scaleProto.getExtent = function () { + return this._extent.slice(); + }; + + /** + * Set extent + * @param {number} start + * @param {number} end + */ + scaleProto.setExtent = function (start, end) { + var thisExtent = this._extent; + if (!isNaN(start)) { + thisExtent[0] = start; + } + if (!isNaN(end)) { + thisExtent[1] = end; + } + }; + + /** + * @return {Array.} + */ + scaleProto.getTicksLabels = function () { + var labels = []; + var ticks = this.getTicks(); + for (var i = 0; i < ticks.length; i++) { + labels.push(this.getLabel(ticks[i])); + } + return labels; + }; + + clazzUtil.enableClassExtend(Scale); + clazzUtil.enableClassManagement(Scale, { + registerWhenExtend: true + }); + + module.exports = Scale; + + +/***/ }, +/* 111 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Interval scale + * @module echarts/scale/Interval + */ + + + + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + var Scale = __webpack_require__(110); + + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + /** + * @alias module:echarts/coord/scale/Interval + * @constructor + */ + var IntervalScale = Scale.extend({ + + type: 'interval', + + _interval: 0, + + setExtent: function (start, end) { + var thisExtent = this._extent; + //start,end may be a Number like '25',so... + if (!isNaN(start)) { + thisExtent[0] = parseFloat(start); + } + if (!isNaN(end)) { + thisExtent[1] = parseFloat(end); + } + }, + + unionExtent: function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + + // unionExtent may called by it's sub classes + IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]); + }, + /** + * Get interval + */ + getInterval: function () { + if (!this._interval) { + this.niceTicks(); + } + return this._interval; + }, + + /** + * Set interval + */ + setInterval: function (interval) { + this._interval = interval; + // Dropped auto calculated niceExtent and use user setted extent + // We assume user wan't to set both interval, min, max to get a better result + this._niceExtent = this._extent.slice(); + }, + + /** + * @return {Array.} + */ + getTicks: function () { + if (!this._interval) { + this.niceTicks(); + } + var interval = this._interval; + var extent = this._extent; + var ticks = []; + + // Consider this case: using dataZoom toolbox, zoom and zoom. + var safeLimit = 10000; + + if (interval) { + var niceExtent = this._niceExtent; + if (extent[0] < niceExtent[0]) { + ticks.push(extent[0]); + } + var tick = niceExtent[0]; + while (tick <= niceExtent[1]) { + ticks.push(tick); + // Avoid rounding error + tick = numberUtil.round(tick + interval); + if (ticks.length > safeLimit) { + return []; + } + } + if (extent[1] > niceExtent[1]) { + ticks.push(extent[1]); + } + } + + return ticks; + }, + + /** + * @return {Array.} + */ + getTicksLabels: function () { + var labels = []; + var ticks = this.getTicks(); + for (var i = 0; i < ticks.length; i++) { + labels.push(this.getLabel(ticks[i])); + } + return labels; + }, + + /** + * @param {number} n + * @return {number} + */ + getLabel: function (data) { + return formatUtil.addCommas(data); + }, + + /** + * Update interval and extent of intervals for nice ticks + * + * @param {number} [splitNumber = 5] Desired number of ticks + */ + niceTicks: function (splitNumber) { + splitNumber = splitNumber || 5; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (!isFinite(span)) { + return; + } + // User may set axis min 0 and data are all negative + // FIXME If it needs to reverse ? + if (span < 0) { + span = -span; + extent.reverse(); + } + + // From "Nice Numbers for Graph Labels" of Graphic Gems + // var niceSpan = numberUtil.nice(span, false); + var step = numberUtil.nice(span / splitNumber, true); + + // Niced extent inside original extent + var niceExtent = [ + numberUtil.round(mathCeil(extent[0] / step) * step), + numberUtil.round(mathFloor(extent[1] / step) * step) + ]; + + this._interval = step; + this._niceExtent = niceExtent; + }, + + /** + * Nice extent. + * @param {number} [splitNumber = 5] Given approx tick number + * @param {boolean} [fixMin=false] + * @param {boolean} [fixMax=false] + */ + niceExtent: function (splitNumber, fixMin, fixMax) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + if (extent[0] !== 0) { + // Expand extent + var expandSize = extent[0] / 2; + extent[0] -= expandSize; + extent[1] += expandSize; + } + else { + extent[1] = 1; + } + } + var span = extent[1] - extent[0]; + // If there are no data and extent are [Infinity, -Infinity] + if (!isFinite(span)) { + extent[0] = 0; + extent[1] = 1; + } + + this.niceTicks(splitNumber); + + // var extent = this._extent; + var interval = this._interval; + + if (!fixMin) { + extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval); + } + if (!fixMax) { + extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval); + } + } + }); + + /** + * @return {module:echarts/scale/Time} + */ + IntervalScale.create = function () { + return new IntervalScale(); + }; + + module.exports = IntervalScale; + + + +/***/ }, +/* 112 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Interval scale + * @module echarts/coord/scale/Time + */ + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + + var IntervalScale = __webpack_require__(111); + + var intervalScaleProto = IntervalScale.prototype; + + var mathCeil = Math.ceil; + var mathFloor = Math.floor; + var ONE_DAY = 3600000 * 24; + + // FIXME 公用? + var bisect = function (a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + if (a[mid][2] < x) { + lo = mid + 1; + } + else { + hi = mid; + } + } + return lo; + }; + + /** + * @alias module:echarts/coord/scale/Time + * @constructor + */ + var TimeScale = IntervalScale.extend({ + type: 'time', + + // Overwrite + getLabel: function (val) { + var stepLvl = this._stepLvl; + + var date = new Date(val); + + return formatUtil.formatTime(stepLvl[0], date); + }, + + // Overwrite + niceExtent: function (approxTickNum, fixMin, fixMax) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + // Expand extent + extent[0] -= ONE_DAY; + extent[1] += ONE_DAY; + } + // If there are no data and extent are [Infinity, -Infinity] + if (extent[1] === -Infinity && extent[0] === Infinity) { + var d = new Date(); + extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate()); + extent[0] = extent[1] - ONE_DAY; + } + + this.niceTicks(approxTickNum, fixMin, fixMax); + + // var extent = this._extent; + var interval = this._interval; + + if (!fixMin) { + extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval); + } + if (!fixMax) { + extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval); + } + }, + + // Overwrite + niceTicks: function (approxTickNum) { + approxTickNum = approxTickNum || 10; + + var extent = this._extent; + var span = extent[1] - extent[0]; + var approxInterval = span / approxTickNum; + var scaleLevelsLen = scaleLevels.length; + var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen); + + var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)]; + var interval = level[2]; + // Same with interval scale if span is much larger than 1 year + if (level[0] === 'year') { + var yearSpan = span / interval; + + // From "Nice Numbers for Graph Labels" of Graphic Gems + // var niceYearSpan = numberUtil.nice(yearSpan, false); + var yearStep = numberUtil.nice(yearSpan / approxTickNum, true); + + interval *= yearStep; + } + + var niceExtent = [ + mathCeil(extent[0] / interval) * interval, + mathFloor(extent[1] / interval) * interval + ]; + + this._stepLvl = level; + // Interval will be used in getTicks + this._interval = interval; + this._niceExtent = niceExtent; + }, + + parse: function (val) { + // val might be float. + return +numberUtil.parseDate(val); + } + }); + + zrUtil.each(['contain', 'normalize'], function (methodName) { + TimeScale.prototype[methodName] = function (val) { + return intervalScaleProto[methodName].call(this, this.parse(val)); + }; + }); + + // Steps from d3 + var scaleLevels = [ + // Format step interval + ['hh:mm:ss', 1, 1000], // 1s + ['hh:mm:ss', 5, 1000 * 5], // 5s + ['hh:mm:ss', 10, 1000 * 10], // 10s + ['hh:mm:ss', 15, 1000 * 15], // 15s + ['hh:mm:ss', 30, 1000 * 30], // 30s + ['hh:mm\nMM-dd',1, 60000], // 1m + ['hh:mm\nMM-dd',5, 60000 * 5], // 5m + ['hh:mm\nMM-dd',10, 60000 * 10], // 10m + ['hh:mm\nMM-dd',15, 60000 * 15], // 15m + ['hh:mm\nMM-dd',30, 60000 * 30], // 30m + ['hh:mm\nMM-dd',1, 3600000], // 1h + ['hh:mm\nMM-dd',2, 3600000 * 2], // 2h + ['hh:mm\nMM-dd',6, 3600000 * 6], // 6h + ['hh:mm\nMM-dd',12, 3600000 * 12], // 12h + ['MM-dd\nyyyy', 1, ONE_DAY], // 1d + ['week', 7, ONE_DAY * 7], // 7d + ['month', 1, ONE_DAY * 31], // 1M + ['quarter', 3, ONE_DAY * 380 / 4], // 3M + ['half-year', 6, ONE_DAY * 380 / 2], // 6M + ['year', 1, ONE_DAY * 380] // 1Y + ]; + + /** + * @return {module:echarts/scale/Time} + */ + TimeScale.create = function () { + return new TimeScale(); + }; + + module.exports = TimeScale; + + +/***/ }, +/* 113 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Log scale + * @module echarts/scale/Log + */ + + + var zrUtil = __webpack_require__(3); + var Scale = __webpack_require__(110); + var numberUtil = __webpack_require__(7); + + // Use some method of IntervalScale + var IntervalScale = __webpack_require__(111); + + var scaleProto = Scale.prototype; + var intervalScaleProto = IntervalScale.prototype; + + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + var mathPow = Math.pow; + + var LOG_BASE = 10; + var mathLog = Math.log; + + var LogScale = Scale.extend({ + + type: 'log', + + /** + * @return {Array.} + */ + getTicks: function () { + return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) { + return numberUtil.round(mathPow(LOG_BASE, val)); + }); + }, + + /** + * @param {number} val + * @return {string} + */ + getLabel: intervalScaleProto.getLabel, + + /** + * @param {number} val + * @return {number} + */ + scale: function (val) { + val = scaleProto.scale.call(this, val); + return mathPow(LOG_BASE, val); + }, + + /** + * @param {number} start + * @param {number} end + */ + setExtent: function (start, end) { + start = mathLog(start) / mathLog(LOG_BASE); + end = mathLog(end) / mathLog(LOG_BASE); + intervalScaleProto.setExtent.call(this, start, end); + }, + + /** + * @return {number} end + */ + getExtent: function () { + var extent = scaleProto.getExtent.call(this); + extent[0] = mathPow(LOG_BASE, extent[0]); + extent[1] = mathPow(LOG_BASE, extent[1]); + return extent; + }, + + /** + * @param {Array.} extent + */ + unionExtent: function (extent) { + extent[0] = mathLog(extent[0]) / mathLog(LOG_BASE); + extent[1] = mathLog(extent[1]) / mathLog(LOG_BASE); + scaleProto.unionExtent.call(this, extent); + }, + + /** + * Update interval and extent of intervals for nice ticks + * @param {number} [approxTickNum = 10] Given approx tick number + */ + niceTicks: function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (span === Infinity || span <= 0) { + return; + } + + var interval = mathPow(10, mathFloor(mathLog(span / approxTickNum) / Math.LN10)); + var err = approxTickNum / span * interval; + + // Filter ticks to get closer to the desired count. + if (err <= 0.5) { + interval *= 10; + } + var niceExtent = [ + numberUtil.round(mathCeil(extent[0] / interval) * interval), + numberUtil.round(mathFloor(extent[1] / interval) * interval) + ]; + + this._interval = interval; + this._niceExtent = niceExtent; + }, + + /** + * Nice extent. + * @param {number} [approxTickNum = 10] Given approx tick number + * @param {boolean} [fixMin=false] + * @param {boolean} [fixMax=false] + */ + niceExtent: intervalScaleProto.niceExtent + }); + + zrUtil.each(['contain', 'normalize'], function (methodName) { + LogScale.prototype[methodName] = function (val) { + val = mathLog(val) / mathLog(LOG_BASE); + return scaleProto[methodName].call(this, val); + }; + }); + + LogScale.create = function () { + return new LogScale(); + }; + + module.exports = LogScale; + + +/***/ }, +/* 114 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var Cartesian = __webpack_require__(115); + + function Cartesian2D(name) { + + Cartesian.call(this, name); + } + + Cartesian2D.prototype = { + + constructor: Cartesian2D, + + type: 'cartesian2d', + + /** + * @type {Array.} + * @readOnly + */ + dimensions: ['x', 'y'], + + /** + * Base axis will be used on stacking. + * + * @return {module:echarts/coord/cartesian/Axis2D} + */ + getBaseAxis: function () { + return this.getAxesByScale('ordinal')[0] + || this.getAxesByScale('time')[0] + || this.getAxis('x'); + }, + + /** + * If contain point + * @param {Array.} point + * @return {boolean} + */ + containPoint: function (point) { + var axisX = this.getAxis('x'); + var axisY = this.getAxis('y'); + return axisX.contain(axisX.toLocalCoord(point[0])) + && axisY.contain(axisY.toLocalCoord(point[1])); + }, + + /** + * If contain data + * @param {Array.} data + * @return {boolean} + */ + containData: function (data) { + return this.getAxis('x').containData(data[0]) + && this.getAxis('y').containData(data[1]); + }, + + /** + * Convert series data to an array of points + * @param {module:echarts/data/List} data + * @param {boolean} stack + * @return {Array} + * Return array of points. For example: + * `[[10, 10], [20, 20], [30, 30]]` + */ + dataToPoints: function (data, stack) { + return data.mapArray(['x', 'y'], function (x, y) { + return this.dataToPoint([x, y]); + }, stack, this); + }, + + /** + * @param {Array.} data + * @param {boolean} [clamp=false] + * @return {Array.} + */ + dataToPoint: function (data, clamp) { + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + return [ + xAxis.toGlobalCoord(xAxis.dataToCoord(data[0], clamp)), + yAxis.toGlobalCoord(yAxis.dataToCoord(data[1], clamp)) + ]; + }, + + /** + * @param {Array.} point + * @param {boolean} [clamp=false] + * @return {Array.} + */ + pointToData: function (point, clamp) { + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + return [ + xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp), + yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp) + ]; + }, + + /** + * Get other axis + * @param {module:echarts/coord/cartesian/Axis2D} axis + */ + getOtherAxis: function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + } + }; + + zrUtil.inherits(Cartesian2D, Cartesian); + + module.exports = Cartesian2D; + + +/***/ }, +/* 115 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Cartesian coordinate system + * @module echarts/coord/Cartesian + * + */ + + + var zrUtil = __webpack_require__(3); + + function dimAxisMapper(dim) { + return this._axes[dim]; + } + + /** + * @alias module:echarts/coord/Cartesian + * @constructor + */ + var Cartesian = function (name) { + this._axes = {}; + + this._dimList = []; + + /** + * @type {string} + */ + this.name = name || ''; + }; + + Cartesian.prototype = { + + constructor: Cartesian, + + type: 'cartesian', + + /** + * Get axis + * @param {number|string} dim + * @return {module:echarts/coord/Cartesian~Axis} + */ + getAxis: function (dim) { + return this._axes[dim]; + }, + + /** + * Get axes list + * @return {Array.} + */ + getAxes: function () { + return zrUtil.map(this._dimList, dimAxisMapper, this); + }, + + /** + * Get axes list by given scale type + */ + getAxesByScale: function (scaleType) { + scaleType = scaleType.toLowerCase(); + return zrUtil.filter( + this.getAxes(), + function (axis) { + return axis.scale.type === scaleType; + } + ); + }, + + /** + * Add axis + * @param {module:echarts/coord/Cartesian.Axis} + */ + addAxis: function (axis) { + var dim = axis.dim; + + this._axes[dim] = axis; + + this._dimList.push(dim); + }, + + /** + * Convert data to coord in nd space + * @param {Array.|Object.} val + * @return {Array.|Object.} + */ + dataToCoord: function (val) { + return this._dataCoordConvert(val, 'dataToCoord'); + }, + + /** + * Convert coord in nd space to data + * @param {Array.|Object.} val + * @return {Array.|Object.} + */ + coordToData: function (val) { + return this._dataCoordConvert(val, 'coordToData'); + }, + + _dataCoordConvert: function (input, method) { + var dimList = this._dimList; + + var output = input instanceof Array ? [] : {}; + + for (var i = 0; i < dimList.length; i++) { + var dim = dimList[i]; + var axis = this._axes[dim]; + + output[dim] = axis[method](input[dim]); + } + + return output; + } + }; + + module.exports = Cartesian; + + +/***/ }, +/* 116 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var Axis = __webpack_require__(117); + var axisLabelInterval = __webpack_require__(118); + + /** + * Extend axis 2d + * @constructor module:echarts/coord/cartesian/Axis2D + * @extends {module:echarts/coord/cartesian/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.} coordExtent + * @param {string} axisType + * @param {string} position + */ + var Axis2D = function (dim, scale, coordExtent, axisType, position) { + Axis.call(this, dim, scale, coordExtent); + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * Axis position + * - 'top' + * - 'bottom' + * - 'left' + * - 'right' + */ + this.position = position || 'bottom'; + }; + + Axis2D.prototype = { + + constructor: Axis2D, + + /** + * Index of axis, can be used as key + */ + index: 0, + /** + * If axis is on the zero position of the other axis + * @type {boolean} + */ + onZero: false, + + /** + * Axis model + * @param {module:echarts/coord/cartesian/AxisModel} + */ + model: null, + + isHorizontal: function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }, + + getGlobalExtent: function () { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + return ret; + }, + + /** + * @return {number} + */ + getLabelInterval: function () { + var labelInterval = this._labelInterval; + if (!labelInterval) { + labelInterval = this._labelInterval = axisLabelInterval(this); + } + return labelInterval; + }, + + /** + * If label is ignored. + * Automatically used when axis is category and label can not be all shown + * @param {number} idx + * @return {boolean} + */ + isLabelIgnored: function (idx) { + if (this.type === 'category') { + var labelInterval = this.getLabelInterval(); + return ((typeof labelInterval === 'function') + && !labelInterval(idx, this.scale.getLabel(idx))) + || idx % (labelInterval + 1); + } + }, + + /** + * Transform global coord to local coord, + * i.e. var localCoord = axis.toLocalCoord(80); + * designate by module:echarts/coord/cartesian/Grid. + * @type {Function} + */ + toLocalCoord: null, + + /** + * Transform global coord to local coord, + * i.e. var globalCoord = axis.toLocalCoord(40); + * designate by module:echarts/coord/cartesian/Grid. + * @type {Function} + */ + toGlobalCoord: null + + }; + zrUtil.inherits(Axis2D, Axis); + + module.exports = Axis2D; + + +/***/ }, +/* 117 */ +/***/ function(module, exports, __webpack_require__) { + + + + var numberUtil = __webpack_require__(7); + var linearMap = numberUtil.linearMap; + var zrUtil = __webpack_require__(3); + + function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; + } + + var normalizedExtent = [0, 1]; + /** + * @name module:echarts/coord/CartesianAxis + * @constructor + */ + var Axis = function (dim, scale, extent) { + + /** + * Axis dimension. Such as 'x', 'y', 'z', 'angle', 'radius' + * @type {string} + */ + this.dim = dim; + + /** + * Axis scale + * @type {module:echarts/coord/scale/*} + */ + this.scale = scale; + + /** + * @type {Array.} + * @private + */ + this._extent = extent || [0, 0]; + + /** + * @type {boolean} + */ + this.inverse = false; + + /** + * Usually true when axis has a ordinal scale + * @type {boolean} + */ + this.onBand = false; + }; + + Axis.prototype = { + + constructor: Axis, + + /** + * If axis extent contain given coord + * @param {number} coord + * @return {boolean} + */ + contain: function (coord) { + var extent = this._extent; + var min = Math.min(extent[0], extent[1]); + var max = Math.max(extent[0], extent[1]); + return coord >= min && coord <= max; + }, + + /** + * If axis extent contain given data + * @param {number} data + * @return {boolean} + */ + containData: function (data) { + return this.contain(this.dataToCoord(data)); + }, + + /** + * Get coord extent. + * @return {Array.} + */ + getExtent: function () { + var ret = this._extent.slice(); + return ret; + }, + + /** + * Get precision used for formatting + * @param {Array.} [dataExtent] + * @return {number} + */ + getPixelPrecision: function (dataExtent) { + return numberUtil.getPixelPrecision( + dataExtent || this.scale.getExtent(), + this._extent + ); + }, + + /** + * Set coord extent + * @param {number} start + * @param {number} end + */ + setExtent: function (start, end) { + var extent = this._extent; + extent[0] = start; + extent[1] = end; + }, + + /** + * Convert data to coord. Data is the rank if it has a ordinal scale + * @param {number} data + * @param {boolean} clamp + * @return {number} + */ + dataToCoord: function (data, clamp) { + var extent = this._extent; + var scale = this.scale; + data = scale.normalize(data); + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + return linearMap(data, normalizedExtent, extent, clamp); + }, + + /** + * Convert coord to data. Data is the rank if it has a ordinal scale + * @param {number} coord + * @param {boolean} clamp + * @return {number} + */ + coordToData: function (coord, clamp) { + var extent = this._extent; + var scale = this.scale; + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + var t = linearMap(coord, extent, normalizedExtent, clamp); + + return this.scale.scale(t); + }, + /** + * @return {Array.} + */ + getTicksCoords: function () { + if (this.onBand) { + var bands = this.getBands(); + var coords = []; + for (var i = 0; i < bands.length; i++) { + coords.push(bands[i][0]); + } + if (bands[i - 1]) { + coords.push(bands[i - 1][1]); + } + return coords; + } + else { + return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this); + } + }, + + /** + * Coords of labels are on the ticks or on the middle of bands + * @return {Array.} + */ + getLabelsCoords: function () { + if (this.onBand) { + var bands = this.getBands(); + var coords = []; + var band; + for (var i = 0; i < bands.length; i++) { + band = bands[i]; + coords.push((band[0] + band[1]) / 2); + } + return coords; + } + else { + return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this); + } + }, + + /** + * Get bands. + * + * If axis has labels [1, 2, 3, 4]. Bands on the axis are + * |---1---|---2---|---3---|---4---|. + * + * @return {Array} + */ + // FIXME Situation when labels is on ticks + getBands: function () { + var extent = this.getExtent(); + var bands = []; + var len = this.scale.count(); + var start = extent[0]; + var end = extent[1]; + var span = end - start; + + for (var i = 0; i < len; i++) { + bands.push([ + span * i / len + start, + span * (i + 1) / len + start + ]); + } + return bands; + }, + + /** + * Get width of band + * @return {number} + */ + getBandWidth: function () { + var axisExtent = this._extent; + var dataExtent = this.scale.getExtent(); + + var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); + // Fix #2728, avoid NaN when only one data. + len === 0 && (len = 1); + + var size = Math.abs(axisExtent[1] - axisExtent[0]); + + return Math.abs(size) / len; + } + }; + + module.exports = Axis; + + +/***/ }, +/* 118 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Helper function for axisLabelInterval calculation + */ + + + + var zrUtil = __webpack_require__(3); + var axisHelper = __webpack_require__(108); + + module.exports = function (axis) { + var axisModel = axis.model; + var labelModel = axisModel.getModel('axisLabel'); + var labelInterval = labelModel.get('interval'); + if (!(axis.type === 'category' && labelInterval === 'auto')) { + return labelInterval === 'auto' ? 0 : labelInterval; + } + + return axisHelper.getAxisLabelInterval( + zrUtil.map(axis.scale.getTicks(), axis.dataToCoord, axis), + axisModel.getFormattedLabels(), + labelModel.getModel('textStyle').getFont(), + axis.isHorizontal() + ); + }; + + +/***/ }, +/* 119 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Grid 是在有直角坐标系的时候必须要存在的 + // 所以这里也要被 Cartesian2D 依赖 + + + __webpack_require__(120); + var ComponentModel = __webpack_require__(19); + + module.exports = ComponentModel.extend({ + + type: 'grid', + + dependencies: ['xAxis', 'yAxis'], + + layoutMode: 'box', + + /** + * @type {module:echarts/coord/cartesian/Grid} + */ + coordinateSystem: null, + + defaultOption: { + show: false, + zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 60, + // If grid size contain label + containLabel: false, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 1, + borderColor: '#ccc' + } + }); + + +/***/ }, +/* 120 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var ComponentModel = __webpack_require__(19); + var zrUtil = __webpack_require__(3); + var axisModelCreator = __webpack_require__(121); + + var AxisModel = ComponentModel.extend({ + + type: 'cartesian2dAxis', + + /** + * @type {module:echarts/coord/cartesian/Axis2D} + */ + axis: null, + + /** + * @override + */ + init: function () { + AxisModel.superApply(this, 'init', arguments); + this._resetRange(); + }, + + /** + * @override + */ + mergeOption: function () { + AxisModel.superApply(this, 'mergeOption', arguments); + this._resetRange(); + }, + + /** + * @override + */ + restoreData: function () { + AxisModel.superApply(this, 'restoreData', arguments); + this._resetRange(); + }, + + /** + * @public + * @param {number} rangeStart + * @param {number} rangeEnd + */ + setRange: function (rangeStart, rangeEnd) { + this.option.rangeStart = rangeStart; + this.option.rangeEnd = rangeEnd; + }, + + /** + * @public + * @return {Array.} + */ + getMin: function () { + var option = this.option; + return option.rangeStart != null ? option.rangeStart : option.min; + }, + + /** + * @public + * @return {Array.} + */ + getMax: function () { + var option = this.option; + return option.rangeEnd != null ? option.rangeEnd : option.max; + }, + + /** + * @public + * @return {boolean} + */ + getNeedCrossZero: function () { + var option = this.option; + return (option.rangeStart != null || option.rangeEnd != null) + ? false : !option.scale; + }, + + /** + * @private + */ + _resetRange: function () { + // rangeStart and rangeEnd is readonly. + this.option.rangeStart = this.option.rangeEnd = null; + } + + }); + + function getAxisType(axisDim, option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); + } + + zrUtil.merge(AxisModel.prototype, __webpack_require__(123)); + + var extraOption = { + gridIndex: 0 + }; + + axisModelCreator('x', AxisModel, getAxisType, extraOption); + axisModelCreator('y', AxisModel, getAxisType, extraOption); + + module.exports = AxisModel; + + +/***/ }, +/* 121 */ +/***/ function(module, exports, __webpack_require__) { + + + + var axisDefault = __webpack_require__(122); + var zrUtil = __webpack_require__(3); + var ComponentModel = __webpack_require__(19); + var layout = __webpack_require__(21); + + // FIXME axisType is fixed ? + var AXIS_TYPES = ['value', 'category', 'time', 'log']; + + /** + * Generate sub axis model class + * @param {string} axisName 'x' 'y' 'radius' 'angle' 'parallel' + * @param {module:echarts/model/Component} BaseAxisModelClass + * @param {Function} axisTypeDefaulter + * @param {Object} [extraDefaultOption] + */ + module.exports = function (axisName, BaseAxisModelClass, axisTypeDefaulter, extraDefaultOption) { + + zrUtil.each(AXIS_TYPES, function (axisType) { + + BaseAxisModelClass.extend({ + + type: axisName + 'Axis.' + axisType, + + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? layout.getLayoutParams(option) : {}; + + var themeModel = ecModel.getTheme(); + zrUtil.merge(option, themeModel.get(axisType + 'Axis')); + zrUtil.merge(option, this.getDefaultOption()); + + option.type = axisTypeDefaulter(axisName, option); + + if (layoutMode) { + layout.mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + defaultOption: zrUtil.mergeAll( + [ + {}, + axisDefault[axisType + 'Axis'], + extraDefaultOption + ], + true + ) + }); + }); + + ComponentModel.registerSubTypeDefaulter( + axisName + 'Axis', + zrUtil.curry(axisTypeDefaulter, axisName) + ); + }; + + +/***/ }, +/* 122 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var defaultOption = { + show: true, + zlevel: 0, // 一级层叠 + z: 0, // 二级层叠 + // 反向坐标轴 + inverse: false, + // 坐标轴名字,默认为空 + name: '', + // 坐标轴名字位置,支持'start' | 'middle' | 'end' + nameLocation: 'end', + // 坐标轴文字样式,默认取全局样式 + nameTextStyle: {}, + // 文字与轴线距离 + nameGap: 15, + // 坐标轴线 + axisLine: { + // 默认显示,属性show控制显示与否 + show: true, + onZero: true, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#333', + width: 1, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认显示 + show: true, + // 控制小标记是否在grid里 + inside: false, + // 属性length控制线长 + length: 5, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#333', + width: 1 + } + }, + // 坐标轴文本标签,详见axis.axisLabel + axisLabel: { + show: true, + // 控制文本标签是否在grid里 + inside: false, + rotate: 0, + margin: 8, + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + textStyle: { + color: '#333', + fontSize: 12 + } + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: ['#ccc'], + width: 1, + type: 'solid' + } + }, + // 分隔区域 + splitArea: { + // 默认不显示,属性show控制显示与否 + show: false, + // 属性areaStyle(详见areaStyle)控制区域样式 + areaStyle: { + color: ['rgba(250,250,250,0.3)','rgba(200,200,200,0.3)'] + } + } + }; + + var categoryAxis = zrUtil.merge({ + // 类目起始和结束两端空白策略 + boundaryGap: true, + // 坐标轴小标记 + axisTick: { + interval: 'auto' + }, + // 坐标轴文本标签,详见axis.axisLabel + axisLabel: { + interval: 'auto' + } + }, defaultOption); + + var valueAxis = zrUtil.defaults({ + // 数值起始和结束两端空白策略 + boundaryGap: [0, 0], + // 最小值, 设置成 'dataMin' 则从数据中计算最小值 + // min: null, + // 最大值,设置成 'dataMax' 则从数据中计算最大值 + // max: null, + // Readonly prop, specifies start value of the range when using data zoom. + // rangeStart: null + // Readonly prop, specifies end value of the range when using data zoom. + // rangeEnd: null + // 脱离0值比例,放大聚焦到最终_min,_max区间 + // scale: false, + // 分割段数,默认为5 + splitNumber: 5 + }, defaultOption); + + // FIXME + var timeAxis = zrUtil.defaults({ + scale: true, + min: 'dataMin', + max: 'dataMax' + }, valueAxis); + var logAxis = zrUtil.defaults({}, valueAxis); + logAxis.scale = true; + + module.exports = { + categoryAxis: categoryAxis, + valueAxis: valueAxis, + timeAxis: timeAxis, + logAxis: logAxis + }; + + +/***/ }, +/* 123 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var axisHelper = __webpack_require__(108); + + function getName(obj) { + if (zrUtil.isObject(obj) && obj.value != null) { + return obj.value; + } + else { + return obj; + } + } + /** + * Get categories + */ + function getCategories() { + return this.get('type') === 'category' + && zrUtil.map(this.get('data'), getName); + } + + /** + * Format labels + * @return {Array.} + */ + function getFormattedLabels() { + return axisHelper.getFormattedLabels( + this.axis, + this.get('axisLabel.formatter') + ); + } + + module.exports = { + + getFormattedLabels: getFormattedLabels, + + getCategories: getCategories + }; + + +/***/ }, +/* 124 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // TODO boundaryGap + + + __webpack_require__(120); + + __webpack_require__(125); + + +/***/ }, +/* 125 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var AxisBuilder = __webpack_require__(126); + var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick; + var getInterval = AxisBuilder.getInterval; + + var axisBuilderAttrs = [ + 'axisLine', 'axisLabel', 'axisTick', 'axisName' + ]; + var selfBuilderAttrs = [ + 'splitLine', 'splitArea' + ]; + + var AxisView = __webpack_require__(1).extendComponentView({ + + type: 'axis', + + render: function (axisModel, ecModel) { + + this.group.removeAll(); + + if (!axisModel.get('show')) { + return; + } + + var gridModel = ecModel.getComponent('grid', axisModel.get('gridIndex')); + + var layout = layoutAxis(gridModel, axisModel); + + var axisBuilder = new AxisBuilder(axisModel, layout); + + zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + + this.group.add(axisBuilder.getGroup()); + + zrUtil.each(selfBuilderAttrs, function (name) { + if (axisModel.get(name +'.show')) { + this['_' + name](axisModel, gridModel, layout.labelInterval); + } + }, this); + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {number|Function} labelInterval + * @private + */ + _splitLine: function (axisModel, gridModel, labelInterval) { + var axis = axisModel.axis; + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineWidth = lineStyleModel.get('width'); + var lineColors = lineStyleModel.get('color'); + + var lineInterval = getInterval(splitLineModel, labelInterval); + + lineColors = zrUtil.isArray(lineColors) ? lineColors : [lineColors]; + + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + + var splitLines = []; + var lineCount = 0; + + var ticksCoords = axis.getTicksCoords(); + + var p1 = []; + var p2 = []; + for (var i = 0; i < ticksCoords.length; i++) { + if (ifIgnoreOnTick(axis, i, lineInterval)) { + continue; + } + + var tickCoord = axis.toGlobalCoord(ticksCoords[i]); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } + else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = (lineCount++) % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new graphic.Line(graphic.subPixelOptimizeLine({ + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: { + lineWidth: lineWidth + }, + silent: true + }))); + } + + // Simple optimization + // Batching the lines if color are the same + var lineStyle = lineStyleModel.getLineStyle(); + for (var i = 0; i < splitLines.length; i++) { + this.group.add(graphic.mergePath(splitLines[i], { + style: zrUtil.defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyle), + silent: true + })); + } + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {number|Function} labelInterval + * @private + */ + _splitArea: function (axisModel, gridModel, labelInterval) { + var axis = axisModel.axis; + + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + + var gridRect = gridModel.coordinateSystem.getRect(); + var ticksCoords = axis.getTicksCoords(); + + var prevX = axis.toGlobalCoord(ticksCoords[0]); + var prevY = axis.toGlobalCoord(ticksCoords[0]); + + var splitAreaRects = []; + var count = 0; + + var areaInterval = getInterval(splitAreaModel, labelInterval); + + areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors]; + + for (var i = 1; i < ticksCoords.length; i++) { + if (ifIgnoreOnTick(axis, i, areaInterval)) { + continue; + } + + var tickCoord = axis.toGlobalCoord(ticksCoords[i]); + + var x; + var y; + var width; + var height; + if (axis.isHorizontal()) { + x = prevX; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + } + else { + x = gridRect.x; + y = prevY; + width = gridRect.width; + height = tickCoord - y; + } + + var colorIndex = (count++) % areaColors.length; + splitAreaRects[colorIndex] = splitAreaRects[colorIndex] || []; + splitAreaRects[colorIndex].push(new graphic.Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + }, + silent: true + })); + + prevX = x + width; + prevY = y + height; + } + + // Simple optimization + // Batching the rects if color are the same + var areaStyle = areaStyleModel.getAreaStyle(); + for (var i = 0; i < splitAreaRects.length; i++) { + this.group.add(graphic.mergePath(splitAreaRects[i], { + style: zrUtil.defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyle), + silent: true + })); + } + } + }); + + AxisView.extend({ + type: 'xAxis' + }); + AxisView.extend({ + type: 'yAxis' + }); + + /** + * @inner + */ + function layoutAxis(gridModel, axisModel) { + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + + var rawAxisPosition = axis.position; + var axisPosition = axis.onZero ? 'onZero' : rawAxisPosition; + var axisDim = axis.dim; + + // [left, right, top, bottom] + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + + var posMap = { + x: {top: rectBound[2], bottom: rectBound[3]}, + y: {left: rectBound[0], right: rectBound[1]} + }; + posMap.x.onZero = Math.max(Math.min(getZero('y'), posMap.x.bottom), posMap.x.top); + posMap.y.onZero = Math.max(Math.min(getZero('x'), posMap.y.right), posMap.y.left); + + function getZero(dim, val) { + var theAxis = grid.getAxis(dim); + return theAxis.toGlobalCoord(theAxis.dataToCoord(0)); + } + + // Axis position + layout.position = [ + axisDim === 'y' ? posMap.y[axisPosition] : rectBound[0], + axisDim === 'x' ? posMap.x[axisPosition] : rectBound[3] + ]; + + // Axis rotation + var r = {x: 0, y: 1}; + layout.rotation = Math.PI / 2 * r[axisDim]; + + // Tick and label direction, x y is axisDim + var dirMap = {top: -1, bottom: 1, left: -1, right: 1}; + + layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition]; + if (axis.onZero) { + layout.labelOffset = posMap[axisDim][rawAxisPosition] - posMap[axisDim].onZero; + } + + if (axisModel.getModel('axisTick').get('inside')) { + layout.tickDirection = -layout.tickDirection; + } + if (axisModel.getModel('axisLabel').get('inside')) { + layout.labelDirection = -layout.labelDirection; + } + + // Special label rotation + var labelRotation = axisModel.getModel('axisLabel').get('rotate'); + layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation; + + // label interval when auto mode. + layout.labelInterval = axis.getLabelInterval(); + + // Over splitLine and splitArea + layout.z2 = 1; + + return layout; + } + + +/***/ }, +/* 126 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var Model = __webpack_require__(8); + var numberUtil = __webpack_require__(7); + var remRadian = numberUtil.remRadian; + var isRadianAroundZero = numberUtil.isRadianAroundZero; + + var PI = Math.PI; + + /** + * A final axis is translated and rotated from a "standard axis". + * So opt.position and opt.rotation is required. + * + * A standard axis is and axis from [0, 0] to [0, axisExtent[1]], + * for example: (0, 0) ------------> (0, 50) + * + * nameDirection or tickDirection or labelDirection is 1 means tick + * or label is below the standard axis, whereas is -1 means above + * the standard axis. labelOffset means offset between label and axis, + * which is useful when 'onZero', where axisLabel is in the grid and + * label in outside grid. + * + * Tips: like always, + * positive rotation represents anticlockwise, and negative rotation + * represents clockwise. + * The direction of position coordinate is the same as the direction + * of screen coordinate. + * + * Do not need to consider axis 'inverse', which is auto processed by + * axis extent. + * + * @param {module:zrender/container/Group} group + * @param {Object} axisModel + * @param {Object} opt Standard axis parameters. + * @param {Array.} opt.position [x, y] + * @param {number} opt.rotation by radian + * @param {number} [opt.nameDirection=1] 1 or -1 Used when nameLocation is 'middle'. + * @param {number} [opt.tickDirection=1] 1 or -1 + * @param {number} [opt.labelDirection=1] 1 or -1 + * @param {number} [opt.labelOffset=0] Usefull when onZero. + * @param {string} [opt.axisName] default get from axisModel. + * @param {number} [opt.labelRotation] by degree, default get from axisModel. + * @param {number} [opt.labelInterval] Default label interval when label + * interval from model is null or 'auto'. + * @param {number} [opt.strokeContainThreshold] Default label interval when label + * @param {number} [opt.silent=true] + */ + var AxisBuilder = function (axisModel, opt) { + + /** + * @readOnly + */ + this.opt = opt; + + /** + * @readOnly + */ + this.axisModel = axisModel; + + // Default value + zrUtil.defaults( + opt, + { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true + } + ); + + /** + * @readOnly + */ + this.group = new graphic.Group({ + position: opt.position.slice(), + rotation: opt.rotation + }); + }; + + AxisBuilder.prototype = { + + constructor: AxisBuilder, + + hasBuilder: function (name) { + return !!builders[name]; + }, + + add: function (name) { + builders[name].call(this); + }, + + getGroup: function () { + return this.group; + } + + }; + + var builders = { + + /** + * @private + */ + axisLine: function () { + var opt = this.opt; + var axisModel = this.axisModel; + + if (!axisModel.get('axisLine.show')) { + return; + } + + var extent = this.axisModel.axis.getExtent(); + + this.group.add(new graphic.Line({ + shape: { + x1: extent[0], + y1: 0, + x2: extent[1], + y2: 0 + }, + style: zrUtil.extend( + {lineCap: 'round'}, + axisModel.getModel('axisLine.lineStyle').getLineStyle() + ), + strokeContainThreshold: opt.strokeContainThreshold, + silent: !!opt.silent, + z2: 1 + })); + }, + + /** + * @private + */ + axisTick: function () { + var axisModel = this.axisModel; + + if (!axisModel.get('axisTick.show')) { + return; + } + + var axis = axisModel.axis; + var tickModel = axisModel.getModel('axisTick'); + var opt = this.opt; + + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickLen = tickModel.get('length'); + var tickInterval = getInterval(tickModel, opt.labelInterval); + var ticksCoords = axis.getTicksCoords(); + var tickLines = []; + + for (var i = 0; i < ticksCoords.length; i++) { + // Only ordinal scale support tick interval + if (ifIgnoreOnTick(axis, i, tickInterval)) { + continue; + } + + var tickCoord = ticksCoords[i]; + + // Tick line + tickLines.push(new graphic.Line(graphic.subPixelOptimizeLine({ + shape: { + x1: tickCoord, + y1: 0, + x2: tickCoord, + y2: opt.tickDirection * tickLen + }, + style: { + lineWidth: lineStyleModel.get('width') + }, + silent: true + }))); + } + + this.group.add(graphic.mergePath(tickLines, { + style: lineStyleModel.getLineStyle(), + z2: 2, + silent: true + })); + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @private + */ + axisLabel: function () { + var axisModel = this.axisModel; + + if (!axisModel.get('axisLabel.show')) { + return; + } + + var opt = this.opt; + var axis = axisModel.axis; + var labelModel = axisModel.getModel('axisLabel'); + var textStyleModel = labelModel.getModel('textStyle'); + var labelMargin = labelModel.get('margin'); + var ticks = axis.scale.getTicks(); + var labels = axisModel.getFormattedLabels(); + + // Special label rotate. + var labelRotation = opt.labelRotation; + if (labelRotation == null) { + labelRotation = labelModel.get('rotate') || 0; + } + // To radian. + labelRotation = labelRotation * PI / 180; + + var labelLayout = innerTextLayout(opt, labelRotation, opt.labelDirection); + var categoryData = axisModel.get('data'); + + var textEls = []; + for (var i = 0; i < ticks.length; i++) { + if (ifIgnoreOnTick(axis, i, opt.labelInterval)) { + continue; + } + + var itemTextStyleModel = textStyleModel; + if (categoryData && categoryData[i] && categoryData[i].textStyle) { + itemTextStyleModel = new Model( + categoryData[i].textStyle, textStyleModel, axisModel.ecModel + ); + } + + var tickCoord = axis.dataToCoord(ticks[i]); + var pos = [ + tickCoord, + opt.labelOffset + opt.labelDirection * labelMargin + ]; + + var textEl = new graphic.Text({ + style: { + text: labels[i], + textAlign: itemTextStyleModel.get('align', true) || labelLayout.textAlign, + textVerticalAlign: itemTextStyleModel.get('baseline', true) || labelLayout.verticalAlign, + textFont: itemTextStyleModel.getFont(), + fill: itemTextStyleModel.getTextColor() + }, + position: pos, + rotation: labelLayout.rotation, + silent: true, + z2: 10 + }); + textEls.push(textEl); + this.group.add(textEl); + } + + function isTwoLabelOverlapped(current, next) { + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + if (firstRect && nextRect) { + firstRect.applyTransform(current.getLocalTransform()); + nextRect.applyTransform(next.getLocalTransform()); + return firstRect.intersect(nextRect); + } + } + if (axis.type !== 'category') { + // If min or max are user set, we need to check + // If the tick on min(max) are overlap on their neighbour tick + // If they are overlapped, we need to hide the min(max) tick label + if (axisModel.getMin ? axisModel.getMin() : axisModel.get('min')) { + var firstLabel = textEls[0]; + var nextLabel = textEls[1]; + if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + firstLabel.ignore = true; + } + } + if (axisModel.getMax ? axisModel.getMax() : axisModel.get('max')) { + var lastLabel = textEls[textEls.length - 1]; + var prevLabel = textEls[textEls.length - 2]; + if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + lastLabel.ignore = true; + } + } + } + }, + + /** + * @private + */ + axisName: function () { + var opt = this.opt; + var axisModel = this.axisModel; + + var name = this.opt.axisName; + // If name is '', do not get name from axisMode. + if (name == null) { + name = axisModel.get('name'); + } + + if (!name) { + return; + } + + var nameLocation = axisModel.get('nameLocation'); + var nameDirection = opt.nameDirection; + var textStyleModel = axisModel.getModel('nameTextStyle'); + var gap = axisModel.get('nameGap') || 0; + + var extent = this.axisModel.axis.getExtent(); + var gapSignal = extent[0] > extent[1] ? -1 : 1; + var pos = [ + nameLocation === 'start' + ? extent[0] - gapSignal * gap + : nameLocation === 'end' + ? extent[1] + gapSignal * gap + : (extent[0] + extent[1]) / 2, // 'middle' + // Reuse labelOffset. + nameLocation === 'middle' ? opt.labelOffset + nameDirection * gap : 0 + ]; + + var labelLayout; + + if (nameLocation === 'middle') { + labelLayout = innerTextLayout(opt, opt.rotation, nameDirection); + } + else { + labelLayout = endTextLayout(opt, nameLocation, extent); + } + + this.group.add(new graphic.Text({ + style: { + text: name, + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + || axisModel.get('axisLine.lineStyle.color'), + textAlign: labelLayout.textAlign, + textVerticalAlign: labelLayout.verticalAlign + }, + position: pos, + rotation: labelLayout.rotation, + silent: true, + z2: 1 + })); + } + + }; + + /** + * @inner + */ + function innerTextLayout(opt, textRotation, direction) { + var rotationDiff = remRadian(textRotation - opt.rotation); + var textAlign; + var verticalAlign; + + if (isRadianAroundZero(rotationDiff)) { // Label is parallel with axis line. + verticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } + else if (isRadianAroundZero(rotationDiff - PI)) { // Label is inverse parallel with axis line. + verticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } + else { + verticalAlign = 'middle'; + + if (rotationDiff > 0 && rotationDiff < PI) { + textAlign = direction > 0 ? 'right' : 'left'; + } + else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + verticalAlign: verticalAlign + }; + } + + /** + * @inner + */ + function endTextLayout(opt, textPosition, extent) { + var rotationDiff = remRadian(-opt.rotation); + var textAlign; + var verticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = (textPosition === 'start' && !inverse) + || (textPosition !== 'start' && inverse); + + if (isRadianAroundZero(rotationDiff - PI / 2)) { + verticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } + else if (isRadianAroundZero(rotationDiff - PI * 1.5)) { + verticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } + else { + verticalAlign = 'middle'; + if (rotationDiff < PI * 1.5 && rotationDiff > PI / 2) { + textAlign = onLeft ? 'left' : 'right'; + } + else { + textAlign = onLeft ? 'right' : 'left'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + verticalAlign: verticalAlign + }; + } + + /** + * @static + */ + var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick = function (axis, i, interval) { + var rawTick; + var scale = axis.scale; + return scale.type === 'ordinal' + && ( + typeof interval === 'function' + ? ( + rawTick = scale.getTicks()[i], + !interval(rawTick, scale.getLabel(rawTick)) + ) + : i % (interval + 1) + ); + }; + + /** + * @static + */ + var getInterval = AxisBuilder.getInterval = function (model, labelInterval) { + var interval = model.get('interval'); + if (interval == null || interval == 'auto') { + interval = labelInterval; + } + return interval; + }; + + module.exports = AxisBuilder; + + + +/***/ }, +/* 127 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + __webpack_require__(107); + + __webpack_require__(128); + __webpack_require__(129); + + var barLayoutGrid = __webpack_require__(131); + var echarts = __webpack_require__(1); + + echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'bar')); + // Visual coding for legend + echarts.registerVisualCoding('chart', function (ecModel) { + ecModel.eachSeriesByType('bar', function (seriesModel) { + var data = seriesModel.getData(); + data.setVisual('legendSymbol', 'roundRect'); + }); + }); + + // In case developer forget to include grid component + __webpack_require__(106); + + +/***/ }, +/* 128 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var SeriesModel = __webpack_require__(27); + var createListFromArray = __webpack_require__(93); + + module.exports = SeriesModel.extend({ + + type: 'series.bar', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + return createListFromArray(option.data, this, ecModel); + }, + + getMarkerPosition: function (value) { + var coordSys = this.coordinateSystem; + if (coordSys) { + var pt = coordSys.dataToPoint(value); + var data = this.getData(); + var offset = data.getLayout('offset'); + var size = data.getLayout('size'); + var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1; + pt[offsetIndex] += offset + size / 2; + return pt; + } + return [NaN, NaN]; + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // stack: null + + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + // 最小高度改为0 + barMinHeight: 0, + + // barMaxWidth: null, + // 默认自适应 + // barWidth: null, + // 柱间距离,默认为柱形宽度的30%,可设固定值 + // barGap: '30%', + // 类目间柱形距离,默认为类目间距的20%,可设固定值 + // barCategoryGap: '20%', + // label: { + // normal: { + // show: false + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + // // 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // // 'inside' | 'insideleft' | 'insideTop' | 'insideRight' | 'insideBottom' | + // // 'outside' |'left' | 'right'|'top'|'bottom' + // position: + + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // } + // }, + itemStyle: { + normal: { + // color: '各异', + // 柱条边线 + barBorderColor: '#fff', + // 柱条边线线宽,单位px,默认为1 + barBorderWidth: 0 + }, + emphasis: { + // color: '各异', + // 柱条边线 + barBorderColor: '#fff', + // 柱条边线线宽,单位px,默认为1 + barBorderWidth: 0 + } + } + } + }); + + +/***/ }, +/* 129 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + + zrUtil.extend(__webpack_require__(8).prototype, __webpack_require__(130)); + + function fixLayoutWithLineWidth(layout, lineWidth) { + var signX = layout.width > 0 ? 1 : -1; + var signY = layout.height > 0 ? 1 : -1; + // In case width or height are too small. + lineWidth = Math.min(lineWidth, Math.abs(layout.width), Math.abs(layout.height)); + layout.x += signX * lineWidth / 2; + layout.y += signY * lineWidth / 2; + layout.width -= signX * lineWidth; + layout.height -= signY * lineWidth; + } + + module.exports = __webpack_require__(1).extendChartView({ + + type: 'bar', + + render: function (seriesModel, ecModel, api) { + var coordinateSystemType = seriesModel.get('coordinateSystem'); + + if (coordinateSystemType === 'cartesian2d') { + this._renderOnCartesian(seriesModel, ecModel, api); + } + + return this.group; + }, + + _renderOnCartesian: function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + + var enableAnimation = seriesModel.get('animation'); + + var barBorderWidthQuery = ['itemStyle', 'normal', 'barBorderWidth']; + + function createRect(dataIndex, isUpdate) { + var layout = data.getItemLayout(dataIndex); + var lineWidth = data.getItemModel(dataIndex).get(barBorderWidthQuery) || 0; + fixLayoutWithLineWidth(layout, lineWidth); + + var rect = new graphic.Rect({ + shape: zrUtil.extend({}, layout) + }); + // Animation + if (enableAnimation) { + var rectShape = rect.shape; + var animateProperty = isHorizontal ? 'height' : 'width'; + var animateTarget = {}; + rectShape[animateProperty] = 0; + animateTarget[animateProperty] = layout[animateProperty]; + graphic[isUpdate? 'updateProps' : 'initProps'](rect, { + shape: animateTarget + }, seriesModel); + } + return rect; + } + data.diff(oldData) + .add(function (dataIndex) { + // 空数据 + if (!data.hasValue(dataIndex)) { + return; + } + + var rect = createRect(dataIndex); + + data.setItemGraphicEl(dataIndex, rect); + + group.add(rect); + + }) + .update(function (newIndex, oldIndex) { + var rect = oldData.getItemGraphicEl(oldIndex); + // 空数据 + if (!data.hasValue(newIndex)) { + group.remove(rect); + return; + } + if (!rect) { + rect = createRect(newIndex, true); + } + + var layout = data.getItemLayout(newIndex); + var lineWidth = data.getItemModel(newIndex).get(barBorderWidthQuery) || 0; + fixLayoutWithLineWidth(layout, lineWidth); + + graphic.updateProps(rect, { + shape: layout + }, seriesModel); + + data.setItemGraphicEl(newIndex, rect); + + // Add back + group.add(rect); + }) + .remove(function (idx) { + var rect = oldData.getItemGraphicEl(idx); + if (rect) { + // Not show text when animating + rect.style.text = ''; + graphic.updateProps(rect, { + shape: { + width: 0 + } + }, seriesModel, function () { + group.remove(rect); + }); + } + }) + .execute(); + + this._updateStyle(seriesModel, data, isHorizontal); + + this._data = data; + }, + + _updateStyle: function (seriesModel, data, isHorizontal) { + function setLabel(style, model, color, labelText, labelPositionOutside) { + graphic.setText(style, model, color); + style.text = labelText; + if (style.textPosition === 'outside') { + style.textPosition = labelPositionOutside; + } + } + + data.eachItemGraphicEl(function (rect, idx) { + var itemModel = data.getItemModel(idx); + var color = data.getItemVisual(idx, 'color'); + var layout = data.getItemLayout(idx); + var itemStyleModel = itemModel.getModel('itemStyle.normal'); + + var hoverStyle = itemModel.getModel('itemStyle.emphasis').getBarItemStyle(); + + rect.setShape('r', itemStyleModel.get('barBorderRadius') || 0); + + rect.setStyle(zrUtil.defaults( + { + fill: color + }, + itemStyleModel.getBarItemStyle() + )); + + var labelPositionOutside = isHorizontal + ? (layout.height > 0 ? 'bottom' : 'top') + : (layout.width > 0 ? 'left' : 'right'); + + var labelModel = itemModel.getModel('label.normal'); + var hoverLabelModel = itemModel.getModel('label.emphasis'); + var rectStyle = rect.style; + if (labelModel.get('show')) { + setLabel( + rectStyle, labelModel, color, + zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'normal'), + seriesModel.getRawValue(idx) + ), + labelPositionOutside + ); + } + else { + rectStyle.text = ''; + } + if (hoverLabelModel.get('show')) { + setLabel( + hoverStyle, hoverLabelModel, color, + zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'emphasis'), + seriesModel.getRawValue(idx) + ), + labelPositionOutside + ); + } + else { + hoverStyle.text = ''; + } + graphic.setHoverStyle(rect, hoverStyle); + }); + }, + + remove: function (ecModel, api) { + var group = this.group; + if (ecModel.get('animation')) { + if (this._data) { + this._data.eachItemGraphicEl(function (el) { + // Not show text when animating + el.style.text = ''; + graphic.updateProps(el, { + shape: { + width: 0 + } + }, ecModel, function () { + group.remove(el); + }); + }); + } + } + else { + group.removeAll(); + } + } + }); + + +/***/ }, +/* 130 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getBarItemStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['stroke', 'borderColor'], + ['lineWidth', 'borderWidth'], + // Compatitable with 2 + ['stroke', 'barBorderColor'], + ['lineWidth', 'barBorderWidth'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 131 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + + function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex; + } + + function calBarWidthAndOffset(barSeries, api) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + + zrUtil.each(barSeries, function (seriesModel, idx) { + var cartesian = seriesModel.coordinateSystem; + + var baseAxis = cartesian.getBaseAxis(); + + var columnsOnAxis = columnsMap[baseAxis.index] || { + remainedWidth: baseAxis.getBandWidth(), + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + axis: baseAxis, + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[baseAxis.index] = columnsOnAxis; + + var stackId = getSeriesStackId(seriesModel); + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + + var barWidth = seriesModel.get('barWidth'); + var barMaxWidth = seriesModel.get('barMaxWidth'); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + // TODO + if (barWidth && ! stacks[stackId].width) { + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + stacks[stackId].width = barWidth; + columnsOnAxis.remainedWidth -= barWidth; + } + + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + (barGap != null) && (columnsOnAxis.gap = barGap); + (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap); + }); + + var result = {}; + + zrUtil.each(columnsMap, function (columnsOnAxis, coordSysName) { + + result[coordSysName] = {}; + + var stacks = columnsOnAxis.stacks; + var baseAxis = columnsOnAxis.axis; + var bandWidth = baseAxis.getBandWidth(); + var categoryGap = parsePercent(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent(columnsOnAxis.gap, 1); + + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + // Find if any auto calculated bar exceeded maxBarWidth + zrUtil.each(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + if (!column.width && maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + remainedWidth -= maxWidth; + column.width = maxWidth; + autoWidthCount--; + } + }); + + // Recalculate width again + autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + var widthSum = 0; + var lastColumn; + zrUtil.each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + zrUtil.each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + + offset += column.width * (1 + barGapPercent); + }); + }); + + return result; + } + + /** + * @param {string} seriesType + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + function barLayoutGrid(seriesType, ecModel, api) { + + var barWidthAndOffset = calBarWidthAndOffset( + zrUtil.filter( + ecModel.getSeriesByType(seriesType), + function (seriesModel) { + return !ecModel.isSeriesFiltered(seriesModel) + && seriesModel.coordinateSystem + && seriesModel.coordinateSystem.type === 'cartesian2d'; + } + ) + ); + + var lastStackCoords = {}; + + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + + var stackId = getSeriesStackId(seriesModel); + var columnLayoutInfo = barWidthAndOffset[baseAxis.index][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = cartesian.getOtherAxis(baseAxis); + + var barMinHeight = seriesModel.get('barMinHeight') || 0; + + var valueAxisStart = baseAxis.onZero + ? valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)) + : valueAxis.getGlobalExtent()[0]; + + var coords = cartesian.dataToPoints(data, true); + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + + data.setLayout({ + offset: columnOffset, + size: columnWidth + }); + data.each(valueAxis.dim, function (value, idx) { + // 空数据 + if (isNaN(value)) { + return; + } + if (!lastStackCoords[stackId][idx]) { + lastStackCoords[stackId][idx] = { + // Positive stack + p: valueAxisStart, + // Negative stack + n: valueAxisStart + }; + } + var sign = value >= 0 ? 'p' : 'n'; + var coord = coords[idx]; + var lastCoord = lastStackCoords[stackId][idx][sign]; + var x, y, width, height; + if (valueAxis.isHorizontal()) { + x = lastCoord; + y = coord[1] + columnOffset; + width = coord[0] - lastCoord; + height = columnWidth; + + if (Math.abs(width) < barMinHeight) { + width = (width < 0 ? -1 : 1) * barMinHeight; + } + lastStackCoords[stackId][idx][sign] += width; + } + else { + x = coord[0] + columnOffset; + y = lastCoord; + width = columnWidth; + height = coord[1] - lastCoord; + if (Math.abs(height) < barMinHeight) { + // Include zero to has a positive bar + height = (height <= 0 ? -1 : 1) * barMinHeight; + } + lastStackCoords[stackId][idx][sign] += height; + } + + data.setItemLayout(idx, { + x: x, + y: y, + width: width, + height: height + }); + }, true); + + }, this); + } + + module.exports = barLayoutGrid; + + +/***/ }, +/* 132 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(133); + __webpack_require__(135); + + __webpack_require__(136)('pie', [{ + type: 'pieToggleSelect', + event: 'pieselectchanged', + method: 'toggleSelected' + }, { + type: 'pieSelect', + event: 'pieselected', + method: 'select' + }, { + type: 'pieUnSelect', + event: 'pieunselected', + method: 'unSelect' + }]); + + echarts.registerVisualCoding( + 'chart', zrUtil.curry(__webpack_require__(137), 'pie') + ); + + echarts.registerLayout(zrUtil.curry( + __webpack_require__(138), 'pie' + )); + + echarts.registerProcessor( + 'filter', zrUtil.curry(__webpack_require__(140), 'pie') + ); + + +/***/ }, +/* 133 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var completeDimensions = __webpack_require__(96); + + var dataSelectableMixin = __webpack_require__(134); + + var PieSeries = __webpack_require__(1).extendSeriesModel({ + + type: 'series.pie', + + // Overwrite + init: function (option) { + PieSeries.superApply(this, 'init', arguments); + + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this._dataBeforeProcessed; + }; + + this.updateSelectedMap(); + + this._defaultLabelLine(option); + }, + + // Overwrite + mergeOption: function (newOption) { + PieSeries.superCall(this, 'mergeOption', newOption); + this.updateSelectedMap(); + }, + + getInitialData: function (option, ecModel) { + var dimensions = completeDimensions(['value'], option.data); + var list = new List(dimensions, this); + list.initData(option.data); + return list; + }, + + // Overwrite + getDataParams: function (dataIndex) { + var data = this._data; + var params = PieSeries.superCall(this, 'getDataParams', dataIndex); + var sum = data.getSum('value'); + // FIXME toFixed? + // + // Percent is 0 if sum is 0 + params.percent = !sum ? 0 : +(data.get('value', dataIndex) / sum * 100).toFixed(2); + + params.$vars.push('percent'); + return params; + }, + + _defaultLabelLine: function (option) { + // Extend labelLine emphasis + modelUtil.defaultEmphasis(option.labelLine, ['show']); + + var labelLineNormalOpt = option.labelLine.normal; + var labelLineEmphasisOpt = option.labelLine.emphasis; + // Not show label line if `label.normal.show = false` + labelLineNormalOpt.show = labelLineNormalOpt.show + && option.label.normal.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show + && option.label.emphasis.show; + }, + + defaultOption: { + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // 选中是扇区偏移量 + selectedOffset: 10, + + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + + label: { + normal: { + // If rotate around circle + rotate: false, + show: true, + // 'outer', 'inside', 'center' + position: 'outer' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + }, + emphasis: {} + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + normal: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + } + }, + itemStyle: { + normal: { + // color: 各异, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 1 + }, + emphasis: { + // color: 各异, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 1 + } + }, + + animationEasing: 'cubicOut', + + data: [] + } + }); + + zrUtil.mixin(PieSeries, dataSelectableMixin); + + module.exports = PieSeries; + + +/***/ }, +/* 134 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Data selectable mixin for chart series. + * To eanble data select, option of series must have `selectedMode`. + * And each data item will use `selected` to toggle itself selected status + * + * @module echarts/chart/helper/DataSelectable + */ + + + var zrUtil = __webpack_require__(3); + + module.exports = { + + updateSelectedMap: function () { + var option = this.option; + this._dataOptMap = zrUtil.reduce(option.data, function (dataOptMap, dataOpt) { + dataOptMap[dataOpt.name] = dataOpt; + return dataOptMap; + }, {}); + }, + /** + * @param {string} name + */ + // PENGING If selectedMode is null ? + select: function (name) { + var dataOptMap = this._dataOptMap; + var dataOpt = dataOptMap[name]; + var selectedMode = this.get('selectedMode'); + if (selectedMode === 'single') { + zrUtil.each(dataOptMap, function (dataOpt) { + dataOpt.selected = false; + }); + } + dataOpt && (dataOpt.selected = true); + }, + + /** + * @param {string} name + */ + unSelect: function (name) { + var dataOpt = this._dataOptMap[name]; + // var selectedMode = this.get('selectedMode'); + // selectedMode !== 'single' && dataOpt && (dataOpt.selected = false); + dataOpt && (dataOpt.selected = false); + }, + + /** + * @param {string} name + */ + toggleSelected: function (name) { + var dataOpt = this._dataOptMap[name]; + if (dataOpt != null) { + this[dataOpt.selected ? 'unSelect' : 'select'](name); + return dataOpt.selected; + } + }, + + /** + * @param {string} name + */ + isSelected: function (name) { + var dataOpt = this._dataOptMap[name]; + return dataOpt && dataOpt.selected; + } + }; + + +/***/ }, +/* 135 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + /** + * @param {module:echarts/model/Series} seriesModel + * @param {boolean} hasAnimation + * @inner + */ + function updateDataSelected(uid, seriesModel, hasAnimation, api) { + var data = seriesModel.getData(); + var dataIndex = this.dataIndex; + var name = data.getName(dataIndex); + var selectedOffset = seriesModel.get('selectedOffset'); + + api.dispatchAction({ + type: 'pieToggleSelect', + from: uid, + name: name, + seriesId: seriesModel.id + }); + + data.each(function (idx) { + toggleItemSelected( + data.getItemGraphicEl(idx), + data.getItemLayout(idx), + seriesModel.isSelected(data.getName(idx)), + selectedOffset, + hasAnimation + ); + }); + } + + /** + * @param {module:zrender/graphic/Sector} el + * @param {Object} layout + * @param {boolean} isSelected + * @param {number} selectedOffset + * @param {boolean} hasAnimation + * @inner + */ + function toggleItemSelected(el, layout, isSelected, selectedOffset, hasAnimation) { + var midAngle = (layout.startAngle + layout.endAngle) / 2; + + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var offset = isSelected ? selectedOffset : 0; + var position = [dx * offset, dy * offset]; + + hasAnimation + // animateTo will stop revious animation like update transition + ? el.animate() + .when(200, { + position: position + }) + .start('bounceOut') + : el.attr('position', position); + } + + /** + * Piece of pie including Sector, Label, LabelLine + * @constructor + * @extends {module:zrender/graphic/Group} + */ + function PiePiece(data, idx) { + + graphic.Group.call(this); + + var sector = new graphic.Sector({ + z2: 2 + }); + var polyline = new graphic.Polyline(); + var text = new graphic.Text(); + this.add(sector); + this.add(polyline); + this.add(text); + + this.updateData(data, idx, true); + + // Hover to change label and labelLine + function onEmphasis() { + polyline.ignore = polyline.hoverIgnore; + text.ignore = text.hoverIgnore; + } + function onNormal() { + polyline.ignore = polyline.normalIgnore; + text.ignore = text.normalIgnore; + } + this.on('emphasis', onEmphasis) + .on('normal', onNormal) + .on('mouseover', onEmphasis) + .on('mouseout', onNormal); + } + + var piePieceProto = PiePiece.prototype; + + function getLabelStyle(data, idx, state, labelModel, labelPosition) { + var textStyleModel = labelModel.getModel('textStyle'); + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + return { + fill: textStyleModel.getTextColor() + || (isLabelInside ? '#fff' : data.getItemVisual(idx, 'color')), + textFont: textStyleModel.getFont(), + text: zrUtil.retrieve( + data.hostModel.getFormattedLabel(idx, state), data.getName(idx) + ) + }; + } + + piePieceProto.updateData = function (data, idx, firstCreate) { + + var sector = this.childAt(0); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var sectorShape = zrUtil.extend({}, layout); + sectorShape.label = null; + if (firstCreate) { + sector.setShape(sectorShape); + sector.shape.endAngle = layout.startAngle; + graphic.updateProps(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel); + } + else { + graphic.updateProps(sector, { + shape: sectorShape + }, seriesModel); + } + + // Update common style + var itemStyleModel = itemModel.getModel('itemStyle'); + var visualColor = data.getItemVisual(idx, 'color'); + + sector.setStyle( + zrUtil.defaults( + { + fill: visualColor + }, + itemStyleModel.getModel('normal').getItemStyle() + ) + ); + sector.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle(); + + // Toggle selected + toggleItemSelected( + this, + data.getItemLayout(idx), + itemModel.get('selected'), + seriesModel.get('selectedOffset'), + seriesModel.get('animation') + ); + + function onEmphasis() { + // Sector may has animation of updating data. Force to move to the last frame + // Or it may stopped on the wrong shape + sector.stopAnimation(true); + sector.animateTo({ + shape: { + r: layout.r + 10 + } + }, 300, 'elasticOut'); + } + function onNormal() { + sector.stopAnimation(true); + sector.animateTo({ + shape: { + r: layout.r + } + }, 300, 'elasticOut'); + } + sector.off('mouseover').off('mouseout').off('emphasis').off('normal'); + if (itemModel.get('hoverAnimation')) { + sector + .on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + } + + this._updateLabel(data, idx); + + graphic.setHoverStyle(this); + }; + + piePieceProto._updateLabel = function (data, idx) { + + var labelLine = this.childAt(1); + var labelText = this.childAt(2); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var visualColor = data.getItemVisual(idx, 'color'); + + graphic.updateProps(labelLine, { + shape: { + points: labelLayout.linePoints || [ + [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y] + ] + } + }, seriesModel); + + graphic.updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel); + labelText.attr({ + style: { + textVerticalAlign: labelLayout.verticalAlign, + textAlign: labelLayout.textAlign, + textFont: labelLayout.font + }, + rotation: labelLayout.rotation, + origin: [labelLayout.x, labelLayout.y], + z2: 10 + }); + + var labelModel = itemModel.getModel('label.normal'); + var labelHoverModel = itemModel.getModel('label.emphasis'); + var labelLineModel = itemModel.getModel('labelLine.normal'); + var labelLineHoverModel = itemModel.getModel('labelLine.emphasis'); + var labelPosition = labelModel.get('position') || labelHoverModel.get('position'); + + labelText.setStyle(getLabelStyle(data, idx, 'normal', labelModel, labelPosition)); + + labelText.ignore = labelText.normalIgnore = !labelModel.get('show'); + labelText.hoverIgnore = !labelHoverModel.get('show'); + + labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show'); + labelLine.hoverIgnore = !labelLineHoverModel.get('show'); + + // Default use item visual color + labelLine.setStyle({ + stroke: visualColor + }); + labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle()); + + labelText.hoverStyle = getLabelStyle(data, idx, 'emphasis', labelHoverModel, labelPosition); + labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle(); + + var smooth = labelLineModel.get('smooth'); + if (smooth && smooth === true) { + smooth = 0.4; + } + labelLine.setShape({ + smooth: smooth + }); + }; + + zrUtil.inherits(PiePiece, graphic.Group); + + + // Pie view + var Pie = __webpack_require__(41).extend({ + + type: 'pie', + + init: function () { + var sectorGroup = new graphic.Group(); + this._sectorGroup = sectorGroup; + }, + + render: function (seriesModel, ecModel, api, payload) { + if (payload && (payload.from === this.uid)) { + return; + } + + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + + var hasAnimation = ecModel.get('animation'); + var isFirstRender = !oldData; + + var onSectorClick = zrUtil.curry( + updateDataSelected, this.uid, seriesModel, hasAnimation, api + ); + + var selectedMode = seriesModel.get('selectedMode'); + + data.diff(oldData) + .add(function (idx) { + var piePiece = new PiePiece(data, idx); + if (isFirstRender) { + piePiece.eachChild(function (child) { + child.stopAnimation(true); + }); + } + + selectedMode && piePiece.on('click', onSectorClick); + + data.setItemGraphicEl(idx, piePiece); + + group.add(piePiece); + }) + .update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + + piePiece.updateData(data, newIdx); + + piePiece.off('click'); + selectedMode && piePiece.on('click', onSectorClick); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }) + .remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + group.remove(piePiece); + }) + .execute(); + + if (hasAnimation && isFirstRender && data.count() > 0) { + var shape = data.getItemLayout(0); + var r = Math.max(api.getWidth(), api.getHeight()) / 2; + + var removeClipPath = zrUtil.bind(group.removeClipPath, group); + group.setClipPath(this._createClipPath( + shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel + )); + } + + this._data = data; + }, + + _createClipPath: function ( + cx, cy, r, startAngle, clockwise, cb, seriesModel + ) { + var clipPath = new graphic.Sector({ + shape: { + cx: cx, + cy: cy, + r0: 0, + r: r, + startAngle: startAngle, + endAngle: startAngle, + clockwise: clockwise + } + }); + + graphic.initProps(clipPath, { + shape: { + endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2 + } + }, seriesModel, cb); + + return clipPath; + } + }); + + module.exports = Pie; + + +/***/ }, +/* 136 */ +/***/ function(module, exports, __webpack_require__) { + + + var echarts = __webpack_require__(1); + var zrUtil = __webpack_require__(3); + module.exports = function (seriesType, actionInfos) { + zrUtil.each(actionInfos, function (actionInfo) { + actionInfo.update = 'updateView'; + /** + * @payload + * @property {string} seriesName + * @property {string} name + */ + echarts.registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + ecModel.eachComponent( + {mainType: 'series', subType: seriesType, query: payload}, + function (seriesModel) { + if (seriesModel[actionInfo.method]) { + seriesModel[actionInfo.method](payload.name); + } + var data = seriesModel.getData(); + // Create selected map + data.each(function (idx) { + var name = data.getName(idx); + selected[name] = seriesModel.isSelected(name) || false; + }); + } + ); + return { + name: payload.name, + selected: selected + }; + }); + }); + }; + + +/***/ }, +/* 137 */ +/***/ function(module, exports) { + + // Pick color from palette for each data item + + + module.exports = function (seriesType, ecModel) { + var globalColorList = ecModel.get('color'); + var offset = 0; + ecModel.eachRawSeriesByType(seriesType, function (seriesModel) { + var colorList = seriesModel.get('color', true); + var dataAll = seriesModel.getRawData(); + if (!ecModel.isSeriesFiltered(seriesModel)) { + var data = seriesModel.getData(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var rawIdx = data.getRawIndex(idx); + // If series.itemStyle.normal.color is a function. itemVisual may be encoded + var singleDataColor = data.getItemVisual(idx, 'color', true); + if (!singleDataColor) { + var paletteColor = colorList ? colorList[rawIdx % colorList.length] + : globalColorList[(rawIdx + offset) % globalColorList.length]; + var color = itemModel.get('itemStyle.normal.color') || paletteColor; + // Legend may use the visual info in data before processed + dataAll.setItemVisual(rawIdx, 'color', color); + data.setItemVisual(idx, 'color', color); + } + else { + // Set data all color for legend + dataAll.setItemVisual(rawIdx, 'color', singleDataColor); + } + }); + } + offset += dataAll.count(); + }); + }; + + +/***/ }, +/* 138 */ +/***/ function(module, exports, __webpack_require__) { + + // TODO minAngle + + + + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + var labelLayout = __webpack_require__(139); + var zrUtil = __webpack_require__(3); + + var PI2 = Math.PI * 2; + var RADIAN = Math.PI / 180; + + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!zrUtil.isArray(radius)) { + radius = [0, radius]; + } + if (!zrUtil.isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent(center[0], width); + var cy = parsePercent(center[1], height); + var r0 = parsePercent(radius[0], size / 2); + var r = parsePercent(radius[1], size / 2); + + var data = seriesModel.getData(); + + var startAngle = -seriesModel.get('startAngle') * RADIAN; + + var minAngle = seriesModel.get('minAngle') * RADIAN; + + var sum = data.getSum('value'); + // Sum may be 0 + var unitRadian = Math.PI / (sum || data.count()) * 2; + + var clockwise = seriesModel.get('clockwise'); + + var roseType = seriesModel.get('roseType'); + + // [0...max] + var extent = data.getDataExtent('value'); + extent[0] = 0; + + // In the case some sector angle is smaller than minAngle + var restAngle = PI2; + var valueSumLargerThanMinAngle = 0; + + var currentAngle = startAngle; + + var dir = clockwise ? 1 : -1; + data.each('value', function (value, idx) { + var angle; + // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + if (roseType !== 'area') { + angle = sum === 0 ? unitRadian : (value * unitRadian); + } + else { + angle = PI2 / (data.count() || 1); + } + + if (angle < minAngle) { + angle = minAngle; + restAngle -= minAngle; + } + else { + valueSumLargerThanMinAngle += value; + } + + var endAngle = currentAngle + dir * angle; + data.setItemLayout(idx, { + angle: angle, + startAngle: currentAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType + ? numberUtil.linearMap(value, extent, [r0, r]) + : r + }); + + currentAngle = endAngle; + }, true); + + // Some sector is constrained by minAngle + // Rest sectors needs recalculate angle + if (restAngle < PI2) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle + if (restAngle <= 1e-3) { + var angle = PI2 / data.count(); + data.each(function (idx) { + var layout = data.getItemLayout(idx); + layout.startAngle = startAngle + dir * idx * angle; + layout.endAngle = startAngle + dir * (idx + 1) * angle; + }); + } + else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each('value', function (value, idx) { + var layout = data.getItemLayout(idx); + var angle = layout.angle === minAngle + ? minAngle : value * unitRadian; + layout.startAngle = currentAngle; + layout.endAngle = currentAngle + dir * angle; + currentAngle += angle; + }); + } + } + + labelLayout(seriesModel, r, width, height); + }); + }; + + +/***/ }, +/* 139 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // FIXME emphasis label position is not same with normal label position + + + var textContain = __webpack_require__(14); + + function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) { + list.sort(function (a, b) { + return a.y - b.y; + }); + + // 压 + function shiftDown(start, end, delta, dir) { + for (var j = start; j < end; j++) { + list[j].y += delta; + if (j > start + && j + 1 < end + && list[j + 1].y > list[j].y + list[j].height + ) { + shiftUp(j, delta / 2); + return; + } + } + + shiftUp(end - 1, delta / 2); + } + + // 弹 + function shiftUp(end, delta) { + for (var j = end; j >= 0; j--) { + list[j].y -= delta; + if (j > 0 + && list[j].y > list[j - 1].y + list[j - 1].height + ) { + break; + } + } + } + + function changeX(list, isDownList, cx, cy, r, dir) { + var lastDeltaX = dir > 0 + ? isDownList // 右侧 + ? Number.MAX_VALUE // 下 + : 0 // 上 + : isDownList // 左侧 + ? Number.MAX_VALUE // 下 + : 0; // 上 + + for (var i = 0, l = list.length; i < l; i++) { + // Not change x for center label + if (list[i].position === 'center') { + continue; + } + var deltaY = Math.abs(list[i].y - cy); + var length = list[i].len; + var length2 = list[i].len2; + var deltaX = (deltaY < r + length) + ? Math.sqrt( + (r + length + length2) * (r + length + length2) + - deltaY * deltaY + ) + : Math.abs(list[i].x - cx); + if (isDownList && deltaX >= lastDeltaX) { + // 右下,左下 + deltaX = lastDeltaX - 10; + } + if (!isDownList && deltaX <= lastDeltaX) { + // 右上,左上 + deltaX = lastDeltaX + 10; + } + + list[i].x = cx + deltaX * dir; + lastDeltaX = deltaX; + } + } + + var lastY = 0; + var delta; + var len = list.length; + var upList = []; + var downList = []; + for (var i = 0; i < len; i++) { + delta = list[i].y - lastY; + if (delta < 0) { + shiftDown(i, len, -delta, dir); + } + lastY = list[i].y + list[i].height; + } + if (viewHeight - lastY < 0) { + shiftUp(len - 1, lastY - viewHeight); + } + for (var i = 0; i < len; i++) { + if (list[i].y >= cy) { + downList.push(list[i]); + } + else { + upList.push(list[i]); + } + } + changeX(upList, false, cx, cy, r, dir); + changeX(downList, true, cx, cy, r, dir); + } + + function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) { + var leftList = []; + var rightList = []; + for (var i = 0; i < labelLayoutList.length; i++) { + if (labelLayoutList[i].x < cx) { + leftList.push(labelLayoutList[i]); + } + else { + rightList.push(labelLayoutList[i]); + } + } + + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight); + + for (var i = 0; i < labelLayoutList.length; i++) { + var linePoints = labelLayoutList[i].linePoints; + if (linePoints) { + var dist = linePoints[1][0] - linePoints[2][0]; + if (labelLayoutList[i].x < cx) { + linePoints[2][0] = labelLayoutList[i].x + 3; + } + else { + linePoints[2][0] = labelLayoutList[i].x - 3; + } + linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y; + linePoints[1][0] = linePoints[2][0] + dist; + } + } + } + + module.exports = function (seriesModel, r, viewWidth, viewHeight) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + + data.each(function (idx) { + var layout = data.getItemLayout(idx); + + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label.normal'); + // Use position in normal or emphasis + var labelPosition = labelModel.get('position') || itemModel.get('label.emphasis.position'); + + var labelLineModel = itemModel.getModel('labelLine.normal'); + var labelLineLen = labelLineModel.get('length'); + var labelLineLen2 = labelLineModel.get('length2'); + + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var textX; + var textY; + var linePoints; + var textAlign; + + cx = layout.cx; + cy = layout.cy; + + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + if (labelPosition === 'center') { + textX = layout.cx; + textY = layout.cy; + textAlign = 'center'; + } + else { + var x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx; + var y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy; + + textX = x1 + dx * 3; + textY = y1 + dy * 3; + + if (!isLabelInside) { + // For roseType + var x2 = x1 + dx * (labelLineLen + r - layout.r); + var y2 = y1 + dy * (labelLineLen + r - layout.r); + var x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2); + var y3 = y2; + + textX = x3 + (dx < 0 ? -5 : 5); + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + + textAlign = isLabelInside ? 'center' : (dx > 0 ? 'left' : 'right'); + } + var font = labelModel.getModel('textStyle').getFont(); + + var labelRotate = labelModel.get('rotate') + ? (dx < 0 ? -midAngle + Math.PI : -midAngle) : 0; + var text = seriesModel.getFormattedLabel(idx, 'normal') + || data.getName(idx); + var textRect = textContain.getBoundingRect( + text, font, textAlign, 'top' + ); + hasLabelRotate = !!labelRotate; + layout.label = { + x: textX, + y: textY, + position: labelPosition, + height: textRect.height, + len: labelLineLen, + len2: labelLineLen2, + linePoints: linePoints, + textAlign: textAlign, + verticalAlign: 'middle', + font: font, + rotation: labelRotate + }; + + // Not layout the inside label + if (!isLabelInside) { + labelLayoutList.push(layout.label); + } + }); + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight); + } + }; + + +/***/ }, +/* 140 */ +/***/ function(module, exports) { + + + module.exports = function (seriesType, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (!legendModels || !legendModels.length) { + return; + } + ecModel.eachSeriesByType(seriesType, function (series) { + var data = series.getData(); + data.filterSelf(function (idx) { + var name = data.getName(idx); + // If in any legend component the status is not selected. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(name)) { + return false; + } + } + return true; + }, this); + }, this); + }; + + +/***/ }, +/* 141 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(142); + __webpack_require__(143); + + echarts.registerVisualCoding('chart', zrUtil.curry( + __webpack_require__(103), 'scatter', 'circle', null + )); + echarts.registerLayout(zrUtil.curry( + __webpack_require__(104), 'scatter' + )); + + // In case developer forget to include grid component + __webpack_require__(106); + + +/***/ }, +/* 142 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var createListFromArray = __webpack_require__(93); + var SeriesModel = __webpack_require__(27); + + module.exports = SeriesModel.extend({ + + type: 'series.scatter', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + var list = createListFromArray(option.data, this, ecModel); + return list; + }, + + defaultOption: { + coordinateSystem: 'cartesian2d', + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + // Polar coordinate system + polarIndex: 0, + + // Geo coordinate system + geoIndex: 0, + + // symbol: null, // 图形类型 + symbolSize: 10, // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + // symbolRotate: null, // 图形旋转控制 + + large: false, + // Available when large is true + largeThreshold: 2000, + + // label: { + // normal: { + // show: false + // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // } + // }, + itemStyle: { + normal: { + opacity: 0.8 + // color: 各异 + } + } + } + }); + + +/***/ }, +/* 143 */ +/***/ function(module, exports, __webpack_require__) { + + + + var SymbolDraw = __webpack_require__(98); + var LargeSymbolDraw = __webpack_require__(144); + + __webpack_require__(1).extendChartView({ + + type: 'scatter', + + init: function () { + this._normalSymbolDraw = new SymbolDraw(); + this._largeSymbolDraw = new LargeSymbolDraw(); + }, + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var largeSymbolDraw = this._largeSymbolDraw; + var normalSymbolDraw = this._normalSymbolDraw; + var group = this.group; + + var symbolDraw = seriesModel.get('large') && data.count() > seriesModel.get('largeThreshold') + ? largeSymbolDraw : normalSymbolDraw; + + this._symbolDraw = symbolDraw; + symbolDraw.updateData(data); + group.add(symbolDraw.group); + + group.remove( + symbolDraw === largeSymbolDraw + ? normalSymbolDraw.group : largeSymbolDraw.group + ); + }, + + updateLayout: function (seriesModel) { + this._symbolDraw.updateLayout(seriesModel); + }, + + remove: function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(api, true); + } + }); + + +/***/ }, +/* 144 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var symbolUtil = __webpack_require__(100); + var zrUtil = __webpack_require__(3); + + var LargeSymbolPath = graphic.extendShape({ + shape: { + points: null, + sizes: null + }, + + symbolProxy: null, + + buildPath: function (path, shape) { + var points = shape.points; + var sizes = shape.sizes; + + var symbolProxy = this.symbolProxy; + var symbolProxyShape = symbolProxy.shape; + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + var size = sizes[i]; + if (size[0] < 4) { + // Optimize for small symbol + path.rect( + pt[0] - size[0] / 2, pt[1] - size[1] / 2, + size[0], size[1] + ); + } + else { + symbolProxyShape.x = pt[0] - size[0] / 2; + symbolProxyShape.y = pt[1] - size[1] / 2; + symbolProxyShape.width = size[0]; + symbolProxyShape.height = size[1]; + + symbolProxy.buildPath(path, symbolProxyShape); + } + } + } + }); + + function LargeSymbolDraw() { + this.group = new graphic.Group(); + + this._symbolEl = new LargeSymbolPath({ + silent: true + }); + } + + var largeSymbolProto = LargeSymbolDraw.prototype; + + /** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + */ + largeSymbolProto.updateData = function (data) { + this.group.removeAll(); + + var symbolEl = this._symbolEl; + + var seriesModel = data.hostModel; + + symbolEl.setShape({ + points: data.mapArray(data.getItemLayout), + sizes: data.mapArray( + function (idx) { + var size = data.getItemVisual(idx, 'symbolSize'); + if (!zrUtil.isArray(size)) { + size = [size, size]; + } + return size; + } + ) + }); + + // Create symbolProxy to build path for each data + symbolEl.symbolProxy = symbolUtil.createSymbol( + data.getVisual('symbol'), 0, 0, 0, 0 + ); + // Use symbolProxy setColor method + symbolEl.setColor = symbolEl.symbolProxy.setColor; + + symbolEl.setStyle( + seriesModel.getModel('itemStyle.normal').getItemStyle(['color']) + ); + + var visualColor = data.getVisual('color'); + if (visualColor) { + symbolEl.setColor(visualColor); + } + + // Add back + this.group.add(this._symbolEl); + }; + + largeSymbolProto.updateLayout = function (seriesModel) { + var data = seriesModel.getData(); + this._symbolEl.setShape({ + points: data.mapArray(data.getItemLayout) + }); + }; + + largeSymbolProto.remove = function () { + this.group.removeAll(); + }; + + module.exports = LargeSymbolDraw; + + +/***/ }, +/* 145 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + // Must use radar component + __webpack_require__(146); + + __webpack_require__(151); + __webpack_require__(152); + + echarts.registerVisualCoding( + 'chart', zrUtil.curry(__webpack_require__(137), 'radar') + ); + echarts.registerVisualCoding('chart', zrUtil.curry( + __webpack_require__(103), 'radar', 'circle', null + )); + echarts.registerLayout(__webpack_require__(153)); + + echarts.registerProcessor( + 'filter', zrUtil.curry(__webpack_require__(140), 'radar') + ); + + echarts.registerPreprocessor(__webpack_require__(154)); + + +/***/ }, +/* 146 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(147); + __webpack_require__(149); + + __webpack_require__(150); + + +/***/ }, +/* 147 */ +/***/ function(module, exports, __webpack_require__) { + + // TODO clockwise + + + var zrUtil = __webpack_require__(3); + var IndicatorAxis = __webpack_require__(148); + var IntervalScale = __webpack_require__(111); + var numberUtil = __webpack_require__(7); + var axisHelper = __webpack_require__(108); + + function Radar(radarModel, ecModel, api) { + + this._model = radarModel; + /** + * Radar dimensions + * @type {Array.} + */ + this.dimensions = []; + + this._indicatorAxes = zrUtil.map(radarModel.getIndicatorModels(), function (indicatorModel, idx) { + var dim = 'indicator_' + idx; + var indicatorAxis = new IndicatorAxis(dim, new IntervalScale()); + indicatorAxis.name = indicatorModel.get('name'); + // Inject model and axis + indicatorAxis.model = indicatorModel; + indicatorModel.axis = indicatorAxis; + this.dimensions.push(dim); + return indicatorAxis; + }, this); + + this.resize(radarModel, api); + + /** + * @type {number} + * @readOnly + */ + this.cx; + /** + * @type {number} + * @readOnly + */ + this.cy; + /** + * @type {number} + * @readOnly + */ + this.r; + /** + * @type {number} + * @readOnly + */ + this.startAngle; + } + + Radar.prototype.getIndicatorAxes = function () { + return this._indicatorAxes; + }; + + Radar.prototype.dataToPoint = function (value, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + + return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex); + }; + + Radar.prototype.coordToPoint = function (coord, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + var angle = indicatorAxis.angle; + var x = this.cx + coord * Math.cos(angle); + var y = this.cy - coord * Math.sin(angle); + return [x, y]; + }; + + Radar.prototype.pointToData = function (pt) { + var dx = pt[0] - this.cx; + var dy = pt[1] - this.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + + var radian = Math.atan2(-dy, dx); + + // Find the closest angle + // FIXME index can calculated directly + var minRadianDiff = Infinity; + var closestAxis; + var closestAxisIdx = -1; + for (var i = 0; i < this._indicatorAxes.length; i++) { + var indicatorAxis = this._indicatorAxes[i]; + var diff = Math.abs(radian - indicatorAxis.angle); + if (diff < minRadianDiff) { + closestAxis = indicatorAxis; + closestAxisIdx = i; + minRadianDiff = diff; + } + } + + return [closestAxisIdx, +(closestAxis && closestAxis.coodToData(radius))]; + }; + + Radar.prototype.resize = function (radarModel, api) { + var center = radarModel.get('center'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var viewSize = Math.min(viewWidth, viewHeight) / 2; + this.cx = numberUtil.parsePercent(center[0], viewWidth); + this.cy = numberUtil.parsePercent(center[1], viewHeight); + + this.startAngle = radarModel.get('startAngle') * Math.PI / 180; + + this.r = numberUtil.parsePercent(radarModel.get('radius'), viewSize); + + zrUtil.each(this._indicatorAxes, function (indicatorAxis, idx) { + indicatorAxis.setExtent(0, this.r); + var angle = (this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length); + // Normalize to [-PI, PI] + angle = Math.atan2(Math.sin(angle), Math.cos(angle)); + indicatorAxis.angle = angle; + }, this); + }; + + Radar.prototype.update = function (ecModel, api) { + var indicatorAxes = this._indicatorAxes; + var radarModel = this._model; + zrUtil.each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeriesByType('radar', function (radarSeries, idx) { + if (radarSeries.get('coordinateSystem') !== 'radar' + || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel + ) { + return; + } + var data = radarSeries.getData(); + zrUtil.each(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.unionExtent(data.getDataExtent(indicatorAxis.dim)); + }); + }, this); + + var splitNumber = radarModel.get('splitNumber'); + + function increaseInterval(interval) { + var exp10 = Math.pow(10, Math.floor(Math.log(interval) / Math.LN10)); + // Increase interval + var f = interval / exp10; + if (f === 2) { + f = 5; + } + else { // f is 2 or 5 + f *= 2; + } + return f * exp10; + } + // Force all the axis fixing the maxSplitNumber. + zrUtil.each(indicatorAxes, function (indicatorAxis, idx) { + var rawExtent = axisHelper.getScaleExtent(indicatorAxis, indicatorAxis.model); + axisHelper.niceScaleExtent(indicatorAxis, indicatorAxis.model); + + var axisModel = indicatorAxis.model; + var scale = indicatorAxis.scale; + var fixedMin = axisModel.get('min'); + var fixedMax = axisModel.get('max'); + var interval = scale.getInterval(); + + if (fixedMin != null && fixedMax != null) { + // User set min, max, divide to get new interval + // FIXME precision + scale.setInterval( + (fixedMax - fixedMin) / splitNumber + ); + } + else if (fixedMin != null) { + var max; + // User set min, expand extent on the other side + do { + max = fixedMin + interval * splitNumber; + scale.setExtent(+fixedMin, max); + // Interval must been set after extent + // FIXME + scale.setInterval(interval); + + interval = increaseInterval(interval); + } while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])); + } + else if (fixedMax != null) { + var min; + // User set min, expand extent on the other side + do { + min = fixedMax - interval * splitNumber; + scale.setExtent(min, +fixedMax); + scale.setInterval(interval); + interval = increaseInterval(interval); + } while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])); + } + else { + var nicedSplitNumber = scale.getTicks().length - 1; + if (nicedSplitNumber > splitNumber) { + interval = increaseInterval(interval); + } + // PENDING + var center = Math.round((rawExtent[0] + rawExtent[1]) / 2 / interval) * interval; + var halfSplitNumber = Math.round(splitNumber / 2); + scale.setExtent( + numberUtil.round(center - halfSplitNumber * interval), + numberUtil.round(center + (splitNumber - halfSplitNumber) * interval) + ); + scale.setInterval(interval); + } + }); + }; + + /** + * Radar dimensions is based on the data + * @type {Array} + */ + Radar.dimensions = []; + + Radar.create = function (ecModel, api) { + var radarList = []; + ecModel.eachComponent('radar', function (radarModel) { + var radar = new Radar(radarModel, ecModel, api); + radarList.push(radar); + radarModel.coordinateSystem = radar; + }); + ecModel.eachSeriesByType('radar', function (radarSeries) { + if (radarSeries.get('coordinateSystem') === 'radar') { + // Inject coordinate system + radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0]; + } + }); + return radarList; + }; + + __webpack_require__(25).register('radar', Radar); + module.exports = Radar; + + +/***/ }, +/* 148 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var Axis = __webpack_require__(117); + + function IndicatorAxis(dim, scale, radiusExtent) { + Axis.call(this, dim, scale, radiusExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = 'value'; + + this.angle = 0; + + /** + * Indicator name + * @type {string} + */ + this.name = ''; + /** + * @type {module:echarts/model/Model} + */ + this.model; + } + + zrUtil.inherits(IndicatorAxis, Axis); + + module.exports = IndicatorAxis; + + +/***/ }, +/* 149 */ +/***/ function(module, exports, __webpack_require__) { + + + + + var axisDefault = __webpack_require__(122); + var valueAxisDefault = axisDefault.valueAxis; + var Model = __webpack_require__(8); + var zrUtil = __webpack_require__(3); + + var axisModelCommonMixin = __webpack_require__(123); + + function defaultsShow(opt, show) { + return zrUtil.defaults({ + show: show + }, opt); + } + + var RadarModel = __webpack_require__(1).extendComponentModel({ + + type: 'radar', + + optionUpdated: function () { + var boundaryGap = this.get('boundaryGap'); + var splitNumber = this.get('splitNumber'); + var scale = this.get('scale'); + var axisLine = this.get('axisLine'); + var axisTick = this.get('axisTick'); + var axisLabel = this.get('axisLabel'); + var nameTextStyle = this.get('name.textStyle'); + var showName = this.get('name.show'); + var nameFormatter = this.get('name.formatter'); + var nameGap = this.get('nameGap'); + var indicatorModels = zrUtil.map(this.get('indicator') || [], function (indicatorOpt) { + // PENDING + if (indicatorOpt.max != null && indicatorOpt.max > 0) { + indicatorOpt.min = 0; + } + else if (indicatorOpt.min != null && indicatorOpt.min < 0) { + indicatorOpt.max = 0; + } + // Use same configuration + indicatorOpt = zrUtil.merge(zrUtil.clone(indicatorOpt), { + boundaryGap: boundaryGap, + splitNumber: splitNumber, + scale: scale, + axisLine: axisLine, + axisTick: axisTick, + axisLabel: axisLabel, + // Competitable with 2 and use text + name: indicatorOpt.text, + nameLocation: 'end', + nameGap: nameGap, + // min: 0, + nameTextStyle: nameTextStyle + }, false); + if (!showName) { + indicatorOpt.name = ''; + } + if (typeof nameFormatter === 'string') { + indicatorOpt.name = nameFormatter.replace('{value}', indicatorOpt.name); + } + else if (typeof nameFormatter === 'function') { + indicatorOpt.name = nameFormatter( + indicatorOpt.name, indicatorOpt + ); + } + return zrUtil.extend( + new Model(indicatorOpt, null, this.ecModel), + axisModelCommonMixin + ); + }, this); + this.getIndicatorModels = function () { + return indicatorModels; + }; + }, + + defaultOption: { + + zlevel: 0, + + z: 0, + + center: ['50%', '50%'], + + radius: '75%', + + startAngle: 90, + + name: { + show: true + // formatter: null + // textStyle: {} + }, + + boundaryGap: [0, 0], + + splitNumber: 5, + + nameGap: 15, + + scale: false, + + // Polygon or circle + shape: 'polygon', + + axisLine: zrUtil.merge( + { + lineStyle: { + color: '#bbb' + } + }, + valueAxisDefault.axisLine + ), + axisLabel: defaultsShow(valueAxisDefault.axisLabel, false), + axisTick: defaultsShow(valueAxisDefault.axisTick, false), + splitLine: defaultsShow(valueAxisDefault.splitLine, true), + splitArea: defaultsShow(valueAxisDefault.splitArea, true), + + // {text, min, max} + indicator: [] + } + }); + + module.exports = RadarModel; + + +/***/ }, +/* 150 */ +/***/ function(module, exports, __webpack_require__) { + + + + var AxisBuilder = __webpack_require__(126); + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + + var axisBuilderAttrs = [ + 'axisLine', 'axisLabel', 'axisTick', 'axisName' + ]; + + module.exports = __webpack_require__(1).extendComponentView({ + + type: 'radar', + + render: function (radarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + this._buildAxes(radarModel); + this._buildSplitLineAndArea(radarModel); + }, + + _buildAxes: function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + var axisBuilders = zrUtil.map(indicatorAxes, function (indicatorAxis) { + var axisBuilder = new AxisBuilder(indicatorAxis.model, { + position: [radar.cx, radar.cy], + rotation: indicatorAxis.angle, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1 + }); + return axisBuilder; + }); + + zrUtil.each(axisBuilders, function (axisBuilder) { + zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + this.group.add(axisBuilder.getGroup()); + }, this); + }, + + _buildSplitLineAndArea: function (radarModel) { + var radar = radarModel.coordinateSystem; + var splitNumber = radarModel.get('splitNumber'); + var indicatorAxes = radar.getIndicatorAxes(); + if (!indicatorAxes.length) { + return; + } + var shape = radarModel.get('shape'); + var splitLineModel = radarModel.getModel('splitLine'); + var splitAreaModel = radarModel.getModel('splitArea'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + + var showSplitLine = splitLineModel.get('show'); + var showSplitArea = splitAreaModel.get('show'); + var splitLineColors = lineStyleModel.get('color'); + var splitAreaColors = areaStyleModel.get('color'); + + splitLineColors = zrUtil.isArray(splitLineColors) ? splitLineColors : [splitLineColors]; + splitAreaColors = zrUtil.isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors]; + + var splitLines = []; + var splitAreas = []; + + function getColorIndex(areaOrLine, areaOrLineColorList, idx) { + var colorIndex = idx % areaOrLineColorList.length; + areaOrLine[colorIndex] = areaOrLine[colorIndex] || []; + return colorIndex; + } + + if (shape === 'circle') { + var ticksRadius = indicatorAxes[0].getTicksCoords(); + var cx = radar.cx; + var cy = radar.cy; + for (var i = 0; i < ticksRadius.length; i++) { + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColors, i); + splitLines[colorIndex].push(new graphic.Circle({ + shape: { + cx: cx, + cy: cy, + r: ticksRadius[i] + } + })); + } + if (showSplitArea && i < ticksRadius.length - 1) { + var colorIndex = getColorIndex(splitAreas, splitAreaColors, i); + splitAreas[colorIndex].push(new graphic.Ring({ + shape: { + cx: cx, + cy: cy, + r0: ticksRadius[i], + r: ticksRadius[i + 1] + } + })); + } + } + } + // Polyyon + else { + var axesTicksPoints = zrUtil.map(indicatorAxes, function (indicatorAxis, idx) { + var ticksCoords = indicatorAxis.getTicksCoords(); + return zrUtil.map(ticksCoords, function (tickCoord) { + return radar.coordToPoint(tickCoord, idx); + }); + }); + + var prevPoints = []; + for (var i = 0; i <= splitNumber; i++) { + var points = []; + for (var j = 0; j < indicatorAxes.length; j++) { + points.push(axesTicksPoints[j][i]); + } + // Close + points.push(points[0].slice()); + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColors, i); + splitLines[colorIndex].push(new graphic.Polyline({ + shape: { + points: points + } + })); + } + if (showSplitArea && prevPoints) { + var colorIndex = getColorIndex(splitAreas, splitAreaColors, i - 1); + splitAreas[colorIndex].push(new graphic.Polygon({ + shape: { + points: points.concat(prevPoints) + } + })); + } + prevPoints = points.slice().reverse(); + } + } + + var lineStyle = lineStyleModel.getLineStyle(); + var areaStyle = areaStyleModel.getAreaStyle(); + // Add splitArea before splitLine + zrUtil.each(splitAreas, function (splitAreas, idx) { + this.group.add(graphic.mergePath( + splitAreas, { + style: zrUtil.defaults({ + stroke: 'none', + fill: splitAreaColors[idx % splitAreaColors.length] + }, areaStyle), + silent: true + } + )); + }, this); + + zrUtil.each(splitLines, function (splitLines, idx) { + this.group.add(graphic.mergePath( + splitLines, { + style: zrUtil.defaults({ + fill: 'none', + stroke: splitLineColors[idx % splitLineColors.length] + }, lineStyle), + silent: true + } + )); + }, this); + + } + }); + + +/***/ }, +/* 151 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var SeriesModel = __webpack_require__(27); + var List = __webpack_require__(94); + var completeDimensions = __webpack_require__(96); + var zrUtil = __webpack_require__(3); + var formatUtil = __webpack_require__(6); + + var RadarSeries = SeriesModel.extend({ + + type: 'series.radar', + + dependencies: ['radar'], + + + // Overwrite + init: function (option) { + RadarSeries.superApply(this, 'init', arguments); + + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this._dataBeforeProcessed; + }; + }, + + getInitialData: function (option, ecModel) { + var data = option.data || []; + var dimensions = completeDimensions( + [], data, [], 'indicator_' + ); + var list = new List(dimensions, this); + list.initData(data); + return list; + }, + + formatTooltip: function (dataIndex) { + var value = this.getRawValue(dataIndex); + var coordSys = this.coordinateSystem; + var indicatorAxes = coordSys.getIndicatorAxes(); + return this._data.getName(dataIndex) + '
            ' + + zrUtil.map(indicatorAxes, function (axis, idx) { + return axis.name + ' : ' + value[idx]; + }).join('
            '); + }, + + getFormattedLabel: function (dataIndex, status, formatter, indicatorIndex) { + status = status || 'normal'; + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + + var params = this.getDataParams(dataIndex); + if (formatter == null) { + formatter = itemModel.get(['label', status, 'formatter']); + } + // Get value of specified indicator + params.value = params.value[indicatorIndex || 0]; + if (typeof formatter === 'function') { + params.status = status; + return formatter(params); + } + else if (typeof formatter === 'string') { + return formatUtil.formatTpl(formatter, params); + } + }, + + defaultOption: { + zlevel: 0, + z: 2, + coordinateSystem: 'radar', + legendHoverLink: true, + radarIndex: 0, + lineStyle: { + normal: { + width: 2, + type: 'solid' + } + }, + label: { + normal: { + position: 'top' + } + }, + // areaStyle: { + // }, + // itemStyle: {} + symbol: 'emptyCircle', + symbolSize: 4 + // symbolRotate: null + } + }); + + module.exports = RadarSeries; + + +/***/ }, +/* 152 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var symbolUtil = __webpack_require__(100); + + function normalizeSymbolSize(symbolSize) { + if (!zrUtil.isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + return symbolSize; + } + module.exports = __webpack_require__(1).extendChartView({ + type: 'radar', + + render: function (seriesModel, ecModel, api) { + var polar = seriesModel.coordinateSystem; + var group = this.group; + + var data = seriesModel.getData(); + var oldData = this._data; + + function createSymbol(data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var color = data.getItemVisual(idx, 'color'); + if (symbolType === 'none') { + return; + } + var symbolPath = symbolUtil.createSymbol( + symbolType, -0.5, -0.5, 1, 1, color + ); + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + scale: normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')) + }); + return symbolPath; + } + + function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) { + // Simply rerender all + symbolGroup.removeAll(); + for (var i = 0; i < newPoints.length - 1; i++) { + var symbolPath = createSymbol(data, idx); + if (symbolPath) { + symbolPath.__dimIdx = i; + if (oldPoints[i]) { + symbolPath.attr('position', oldPoints[i]); + graphic[isInit ? 'initProps' : 'updateProps']( + symbolPath, { + position: newPoints[i] + }, seriesModel + ); + } + else { + symbolPath.attr('position', newPoints[i]); + } + symbolGroup.add(symbolPath); + } + } + } + + function getInitialPoints(points) { + return zrUtil.map(points, function (pt) { + return [polar.cx, polar.cy]; + }); + } + data.diff(oldData) + .add(function (idx) { + var points = data.getItemLayout(idx); + if (!points) { + return; + } + var polygon = new graphic.Polygon(); + var polyline = new graphic.Polyline(); + var target = { + shape: { + points: points + } + }; + polygon.shape.points = getInitialPoints(points); + polyline.shape.points = getInitialPoints(points); + graphic.initProps(polygon, target, seriesModel); + graphic.initProps(polyline, target, seriesModel); + + var itemGroup = new graphic.Group(); + var symbolGroup = new graphic.Group(); + itemGroup.add(polyline); + itemGroup.add(polygon); + itemGroup.add(symbolGroup); + + updateSymbols( + polyline.shape.points, points, symbolGroup, data, idx, true + ); + + data.setItemGraphicEl(idx, itemGroup); + }) + .update(function (newIdx, oldIdx) { + var itemGroup = oldData.getItemGraphicEl(oldIdx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); + var target = { + shape: { + points: data.getItemLayout(newIdx) + } + }; + if (!target.shape.points) { + return; + } + updateSymbols( + polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false + ); + + graphic.updateProps(polyline, target, seriesModel); + graphic.updateProps(polygon, target, seriesModel); + + data.setItemGraphicEl(newIdx, itemGroup); + }) + .remove(function (idx) { + group.remove(oldData.getItemGraphicEl(idx)); + }) + .execute(); + + data.eachItemGraphicEl(function (itemGroup, idx) { + var itemModel = data.getItemModel(idx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); + var color = data.getItemVisual(idx, 'color'); + + group.add(itemGroup); + + polyline.setStyle( + zrUtil.extend( + itemModel.getModel('lineStyle.normal').getLineStyle(), + { + stroke: color + } + ) + ); + polyline.hoverStyle = itemModel.getModel('lineStyle.emphasis').getLineStyle(); + + var areaStyleModel = itemModel.getModel('areaStyle.normal'); + var hoverAreaStyleModel = itemModel.getModel('areaStyle.emphasis'); + var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty(); + var hoverPolygonIgnore = hoverAreaStyleModel.isEmpty() && hoverAreaStyleModel.parentModel.isEmpty(); + + hoverPolygonIgnore = hoverPolygonIgnore && polygonIgnore; + polygon.ignore = polygonIgnore; + + polygon.setStyle( + zrUtil.defaults( + areaStyleModel.getAreaStyle(), + { + fill: color, + opacity: 0.7 + } + ) + ); + polygon.hoverStyle = hoverAreaStyleModel.getAreaStyle(); + + var itemStyle = itemModel.getModel('itemStyle.normal').getItemStyle(['color']); + var itemHoverStyle = itemModel.getModel('itemStyle.emphasis').getItemStyle(); + var labelModel = itemModel.getModel('label.normal'); + var labelHoverModel = itemModel.getModel('label.emphasis'); + symbolGroup.eachChild(function (symbolPath) { + symbolPath.setStyle(itemStyle); + symbolPath.hoverStyle = zrUtil.clone(itemHoverStyle); + + var defaultText = data.get(data.dimensions[symbolPath.__dimIdx], idx); + graphic.setText(symbolPath.style, labelModel, color); + symbolPath.setStyle({ + text: labelModel.get('show') ? zrUtil.retrieve( + seriesModel.getFormattedLabel( + idx, 'normal', null, symbolPath.__dimIdx + ), + defaultText + ) : '' + }); + + graphic.setText(symbolPath.hoverStyle, labelHoverModel, color); + symbolPath.hoverStyle.text = labelHoverModel.get('show') ? zrUtil.retrieve( + seriesModel.getFormattedLabel( + idx, 'emphasis', null, symbolPath.__dimIdx + ), + defaultText + ) : ''; + }); + + function onEmphasis() { + polygon.attr('ignore', hoverPolygonIgnore); + } + + function onNormal() { + polygon.attr('ignore', polygonIgnore); + } + + itemGroup.off('mouseover').off('mouseout').off('normal').off('emphasis'); + itemGroup.on('emphasis', onEmphasis) + .on('mouseover', onEmphasis) + .on('normal', onNormal) + .on('mouseout', onNormal); + + graphic.setHoverStyle(itemGroup); + }); + + this._data = data; + }, + + remove: function () { + this.group.removeAll(); + this._data = null; + } + }); + + +/***/ }, +/* 153 */ +/***/ function(module, exports) { + + + + module.exports = function (ecModel, api) { + ecModel.eachSeriesByType('radar', function (seriesModel) { + var data = seriesModel.getData(); + var points = []; + var coordSys = seriesModel.coordinateSystem; + if (!coordSys) { + return; + } + + function pointsConverter(val, idx) { + points[idx] = points[idx] || []; + points[idx][i] = coordSys.dataToPoint(val, i); + } + for (var i = 0; i < coordSys.getIndicatorAxes().length; i++) { + var dim = data.dimensions[i]; + data.each(dim, pointsConverter); + } + + data.each(function (idx) { + // Close polygon + points[idx][0] && points[idx].push(points[idx][0].slice()); + data.setItemLayout(idx, points[idx]); + }); + }); + }; + + +/***/ }, +/* 154 */ +/***/ function(module, exports, __webpack_require__) { + + // Backward compat for radar chart in 2 + + + var zrUtil = __webpack_require__(3); + + module.exports = function (option) { + var polarOptArr = option.polar; + if (polarOptArr) { + if (!zrUtil.isArray(polarOptArr)) { + polarOptArr = [polarOptArr]; + } + var polarNotRadar = []; + zrUtil.each(polarOptArr, function (polarOpt, idx) { + if (polarOpt.indicator) { + if (polarOpt.type && !polarOpt.shape) { + polarOpt.shape = polarOpt.type; + } + option.radar = option.radar || []; + if (!zrUtil.isArray(option.radar)) { + option.radar = [option.radar]; + } + option.radar.push(polarOpt); + } + else { + polarNotRadar.push(polarOpt); + } + }); + option.polar = polarNotRadar; + } + zrUtil.each(option.series, function (seriesOpt) { + if (seriesOpt.type === 'radar' && seriesOpt.polarIndex) { + seriesOpt.radarIndex = seriesOpt.polarIndex; + } + }); + }; + + +/***/ }, +/* 155 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + + __webpack_require__(156); + + __webpack_require__(157); + + __webpack_require__(161); + + __webpack_require__(163); + + echarts.registerLayout(__webpack_require__(173)); + + echarts.registerVisualCoding('chart', __webpack_require__(174)); + + echarts.registerProcessor('statistic', __webpack_require__(175)); + + echarts.registerPreprocessor(__webpack_require__(176)); + + __webpack_require__(136)('map', [{ + type: 'mapToggleSelect', + event: 'mapselectchanged', + method: 'toggleSelected' + }, { + type: 'mapSelect', + event: 'mapselected', + method: 'select' + }, { + type: 'mapUnSelect', + event: 'mapunselected', + method: 'unSelect' + }]); + + +/***/ }, +/* 156 */ +/***/ function(module, exports, __webpack_require__) { + + + + var List = __webpack_require__(94); + var echarts = __webpack_require__(1); + var SeriesModel = __webpack_require__(27); + var zrUtil = __webpack_require__(3); + var completeDimensions = __webpack_require__(96); + + var formatUtil = __webpack_require__(6); + var encodeHTML = formatUtil.encodeHTML; + var addCommas = formatUtil.addCommas; + + var dataSelectableMixin = __webpack_require__(134); + + function fillData(dataOpt, geoJson) { + var dataNameMap = {}; + var features = geoJson.features; + for (var i = 0; i < dataOpt.length; i++) { + dataNameMap[dataOpt[i].name] = dataOpt[i]; + } + + for (var i = 0; i < features.length; i++) { + var name = features[i].properties.name; + if (!dataNameMap[name]) { + dataOpt.push({ + value: NaN, + name: name + }); + } + } + return dataOpt; + } + + var MapSeries = SeriesModel.extend({ + + type: 'series.map', + + /** + * Only first map series of same mapType will drawMap + * @type {boolean} + */ + needsDrawMap: false, + + /** + * Group of all map series with same mapType + * @type {boolean} + */ + seriesGroup: [], + + init: function (option) { + + option = this._fillOption(option); + this.option = option; + + MapSeries.superApply(this, 'init', arguments); + + this.updateSelectedMap(); + }, + + getInitialData: function (option) { + var dimensions = completeDimensions(['value'], option.data || []); + + var list = new List(dimensions, this); + + list.initData(option.data); + + return list; + }, + + mergeOption: function (newOption) { + newOption = this._fillOption(newOption); + + MapSeries.superCall(this, 'mergeOption', newOption); + + this.updateSelectedMap(); + }, + + _fillOption: function (option) { + // Shallow clone + option = zrUtil.extend({}, option); + + var map = echarts.getMap(option.mapType); + var geoJson = map && map.geoJson; + geoJson && option.data + && (option.data = fillData(option.data, geoJson)); + + return option; + }, + + /** + * @param {number} zoom + */ + setRoamZoom: function (zoom) { + var roamDetail = this.option.roamDetail; + roamDetail && (roamDetail.zoom = zoom); + }, + + /** + * @param {number} x + * @param {number} y + */ + setRoamPan: function (x, y) { + var roamDetail = this.option.roamDetail; + if (roamDetail) { + roamDetail.x = x; + roamDetail.y = y; + } + }, + + getRawValue: function (dataIndex) { + // Use value stored in data instead because it is calculated from multiple series + // FIXME Provide all value of multiple series ? + return this._data.get('value', dataIndex); + }, + + /** + * Map tooltip formatter + * + * @param {number} dataIndex + */ + formatTooltip: function (dataIndex) { + var data = this._data; + var formattedValue = addCommas(this.getRawValue(dataIndex)); + var name = data.getName(dataIndex); + + var seriesGroup = this.seriesGroup; + var seriesNames = []; + for (var i = 0; i < seriesGroup.length; i++) { + if (!isNaN(seriesGroup[i].getRawValue(dataIndex))) { + seriesNames.push( + encodeHTML(seriesGroup[i].name) + ); + } + } + + return seriesNames.join(', ') + '
            ' + + name + ' : ' + formattedValue; + }, + + defaultOption: { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 2, + coordinateSystem: 'geo', + // 各省的 map 暂时都用中文 + map: 'china', + + // 'center' | 'left' | 'right' | 'x%' | {number} + left: 'center', + // 'center' | 'top' | 'bottom' | 'x%' | {number} + top: 'center', + // right + // bottom + // width: + // height // 自适应 + + // 数值合并方式,默认加和,可选为: + // 'sum' | 'average' | 'max' | 'min' + // mapValueCalculation: 'sum', + // 地图数值计算结果小数精度 + // mapValuePrecision: 0, + // 显示图例颜色标识(系列标识的小圆点),图例开启时有效 + showLegendSymbol: true, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + dataRangeHoverLink: true, + // 是否开启缩放及漫游模式 + // roam: false, + + // 在 roam 开启的时候使用 + roamDetail: { + x: 0, + y: 0, + zoom: 1 + }, + + scaleLimit: null, + + label: { + normal: { + show: false, + textStyle: { + color: '#000' + } + }, + emphasis: { + show: false, + textStyle: { + color: '#000' + } + } + }, + // scaleLimit: null, + itemStyle: { + normal: { + // color: 各异, + borderWidth: 0.5, + borderColor: '#444', + areaColor: '#eee' + }, + // 也是选中样式 + emphasis: { + areaColor: 'rgba(255,215, 0, 0.8)' + } + } + } + }); + + zrUtil.mixin(MapSeries, dataSelectableMixin); + + module.exports = MapSeries; + + +/***/ }, +/* 157 */ +/***/ function(module, exports, __webpack_require__) { + + + + // var zrUtil = require('zrender/lib/core/util'); + var graphic = __webpack_require__(42); + + var MapDraw = __webpack_require__(158); + + __webpack_require__(1).extendChartView({ + + type: 'map', + + render: function (mapModel, ecModel, api, payload) { + // Not render if it is an toggleSelect action from self + if (payload && payload.type === 'mapToggleSelect' + && payload.from === this.uid + ) { + return; + } + + var group = this.group; + group.removeAll(); + // Not update map if it is an roam action from self + if (!(payload && payload.type === 'geoRoam' + && payload.component === 'series' + && payload.name === mapModel.name)) { + + if (mapModel.needsDrawMap) { + var mapDraw = this._mapDraw || new MapDraw(api, true); + group.add(mapDraw.group); + + mapDraw.draw(mapModel, ecModel, api, this); + + this._mapDraw = mapDraw; + } + else { + // Remove drawed map + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + } + } + else { + var mapDraw = this._mapDraw; + mapDraw && group.add(mapDraw.group); + } + + mapModel.get('showLegendSymbol') && ecModel.getComponent('legend') + && this._renderSymbols(mapModel, ecModel, api); + }, + + remove: function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + this.group.removeAll(); + }, + + _renderSymbols: function (mapModel, ecModel, api) { + var data = mapModel.getData(); + var group = this.group; + + data.each('value', function (value, idx) { + if (isNaN(value)) { + return; + } + + var layout = data.getItemLayout(idx); + + if (!layout || !layout.point) { + // Not exists in map + return; + } + + var point = layout.point; + var offset = layout.offset; + + var circle = new graphic.Circle({ + style: { + fill: data.getVisual('color') + }, + shape: { + cx: point[0] + offset * 9, + cy: point[1], + r: 3 + }, + silent: true, + z2: 10 + }); + + // First data on the same region + if (!offset) { + var labelText = data.getName(idx); + + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label.normal'); + var hoverLabelModel = itemModel.getModel('label.emphasis'); + + var textStyleModel = labelModel.getModel('textStyle'); + var hoverTextStyleModel = hoverLabelModel.getModel('textStyle'); + + var polygonGroups = data.getItemGraphicEl(idx); + circle.setStyle({ + textPosition: 'bottom' + }); + + var onEmphasis = function () { + circle.setStyle({ + text: hoverLabelModel.get('show') ? labelText : '', + textFill: hoverTextStyleModel.getTextColor(), + textFont: hoverTextStyleModel.getFont() + }); + }; + + var onNormal = function () { + circle.setStyle({ + text: labelModel.get('show') ? labelText : '', + textFill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont() + }); + }; + + polygonGroups.on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + + onNormal(); + } + + group.add(circle); + }); + } + }); + + +/***/ }, +/* 158 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/component/helper/MapDraw + */ + + + var RoamController = __webpack_require__(159); + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + function getFixedItemStyle(model, scale) { + var itemStyle = model.getItemStyle(); + var areaColor = model.get('areaColor'); + if (areaColor) { + itemStyle.fill = areaColor; + } + + return itemStyle; + } + + function updateMapSelectHandler(mapOrGeoModel, data, group, api, fromView) { + group.off('click'); + mapOrGeoModel.get('selectedMode') + && group.on('click', function (e) { + var dataIndex = e.target.dataIndex; + if (dataIndex != null) { + var name = data.getName(dataIndex); + + api.dispatchAction({ + type: 'mapToggleSelect', + seriesIndex: mapOrGeoModel.seriesIndex, + name: name, + from: fromView.uid + }); + + updateMapSelected(mapOrGeoModel, data, api); + } + }); + } + + function updateMapSelected(mapOrGeoModel, data) { + data.eachItemGraphicEl(function (el, idx) { + var name = data.getName(idx); + el.trigger(mapOrGeoModel.isSelected(name) ? 'emphasis' : 'normal'); + }); + } + + /** + * @alias module:echarts/component/helper/MapDraw + * @param {module:echarts/ExtensionAPI} api + * @param {boolean} updateGroup + */ + function MapDraw(api, updateGroup) { + + var group = new graphic.Group(); + + /** + * @type {module:echarts/component/helper/RoamController} + * @private + */ + this._controller = new RoamController( + api.getZr(), updateGroup ? group : null, null + ); + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = group; + + /** + * @type {boolean} + * @private + */ + this._updateGroup = updateGroup; + } + + MapDraw.prototype = { + + constructor: MapDraw, + + draw: function (mapOrGeoModel, ecModel, api, fromView) { + + // geoModel has no data + var data = mapOrGeoModel.getData && mapOrGeoModel.getData(); + + var geo = mapOrGeoModel.coordinateSystem; + + var group = this.group; + group.removeAll(); + + var scale = geo.scale; + group.position = geo.position.slice(); + group.scale = scale.slice(); + + var itemStyleModel; + var hoverItemStyleModel; + var itemStyle; + var hoverItemStyle; + + var labelModel; + var hoverLabelModel; + + var itemStyleAccessPath = ['itemStyle', 'normal']; + var hoverItemStyleAccessPath = ['itemStyle', 'emphasis']; + var labelAccessPath = ['label', 'normal']; + var hoverLabelAccessPath = ['label', 'emphasis']; + if (!data) { + itemStyleModel = mapOrGeoModel.getModel(itemStyleAccessPath); + hoverItemStyleModel = mapOrGeoModel.getModel(hoverItemStyleAccessPath); + + itemStyle = getFixedItemStyle(itemStyleModel, scale); + hoverItemStyle = getFixedItemStyle(hoverItemStyleModel, scale); + + labelModel = mapOrGeoModel.getModel(labelAccessPath); + hoverLabelModel = mapOrGeoModel.getModel(hoverLabelAccessPath); + } + + zrUtil.each(geo.regions, function (region) { + + var regionGroup = new graphic.Group(); + var dataIdx; + // Use the itemStyle in data if has data + if (data) { + // FIXME If dataIdx < 0 + dataIdx = data.indexOfName(region.name); + var itemModel = data.getItemModel(dataIdx); + + // Only visual color of each item will be used. It can be encoded by dataRange + // But visual color of series is used in symbol drawing + // + // Visual color for each series is for the symbol draw + var visualColor = data.getItemVisual(dataIdx, 'color', true); + + itemStyleModel = itemModel.getModel(itemStyleAccessPath); + hoverItemStyleModel = itemModel.getModel(hoverItemStyleAccessPath); + + itemStyle = getFixedItemStyle(itemStyleModel, scale); + hoverItemStyle = getFixedItemStyle(hoverItemStyleModel, scale); + + labelModel = itemModel.getModel(labelAccessPath); + hoverLabelModel = itemModel.getModel(hoverLabelAccessPath); + + if (visualColor) { + itemStyle.fill = visualColor; + } + } + var textStyleModel = labelModel.getModel('textStyle'); + var hoverTextStyleModel = hoverLabelModel.getModel('textStyle'); + + zrUtil.each(region.contours, function (contour) { + + var polygon = new graphic.Polygon({ + shape: { + points: contour + }, + style: { + strokeNoScale: true + }, + culling: true + }); + + polygon.setStyle(itemStyle); + + regionGroup.add(polygon); + }); + + // Label + var showLabel = labelModel.get('show'); + var hoverShowLabel = hoverLabelModel.get('show'); + + var isDataNaN = data && isNaN(data.get('value', dataIdx)); + var itemLayout = data && data.getItemLayout(dataIdx); + // In the following cases label will be drawn + // 1. In map series and data value is NaN + // 2. In geo component + // 4. Region has no series legendSymbol, which will be add a showLabel flag in mapSymbolLayout + if ( + (!data || isDataNaN && (showLabel || hoverShowLabel)) + || (itemLayout && itemLayout.showLabel) + ) { + var query = data ? dataIdx : region.name; + var formattedStr = mapOrGeoModel.getFormattedLabel(query, 'normal'); + var hoverFormattedStr = mapOrGeoModel.getFormattedLabel(query, 'emphasis'); + var text = new graphic.Text({ + style: { + text: showLabel ? (formattedStr || region.name) : '', + fill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont(), + textAlign: 'center', + textVerticalAlign: 'middle' + }, + hoverStyle: { + text: hoverShowLabel ? (hoverFormattedStr || region.name) : '', + fill: hoverTextStyleModel.getTextColor(), + textFont: hoverTextStyleModel.getFont() + }, + position: region.center.slice(), + scale: [1 / scale[0], 1 / scale[1]], + z2: 10, + silent: true + }); + + regionGroup.add(text); + } + + // setItemGraphicEl, setHoverStyle after all polygons and labels + // are added to the rigionGroup + data && data.setItemGraphicEl(dataIdx, regionGroup); + + graphic.setHoverStyle(regionGroup, hoverItemStyle); + + group.add(regionGroup); + }); + + this._updateController(mapOrGeoModel, ecModel, api); + + data && updateMapSelectHandler(mapOrGeoModel, data, group, api, fromView); + + data && updateMapSelected(mapOrGeoModel, data); + }, + + remove: function () { + this.group.removeAll(); + this._controller.dispose(); + }, + + _updateController: function (mapOrGeoModel, ecModel, api) { + var geo = mapOrGeoModel.coordinateSystem; + var controller = this._controller; + controller.zoomLimit = mapOrGeoModel.get('scaleLimit'); + // Update zoom from model + controller.zoom = mapOrGeoModel.get('roamDetail.zoom'); + // roamType is will be set default true if it is null + controller.enable(mapOrGeoModel.get('roam') || false); + // FIXME mainType, subType 作为 component 的属性? + var mainType = mapOrGeoModel.type.split('.')[0]; + controller.off('pan') + .on('pan', function (dx, dy) { + api.dispatchAction({ + type: 'geoRoam', + component: mainType, + name: mapOrGeoModel.name, + dx: dx, + dy: dy + }); + }); + controller.off('zoom') + .on('zoom', function (zoom, mouseX, mouseY) { + api.dispatchAction({ + type: 'geoRoam', + component: mainType, + name: mapOrGeoModel.name, + zoom: zoom, + originX: mouseX, + originY: mouseY + }); + + if (this._updateGroup) { + var group = this.group; + var scale = group.scale; + group.traverse(function (el) { + if (el.type === 'text') { + el.attr('scale', [1 / scale[0], 1 / scale[1]]); + } + }); + } + }, this); + + controller.rect = geo.getViewRect(); + } + }; + + module.exports = MapDraw; + + +/***/ }, +/* 159 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/component/helper/RoamController + */ + + + + var Eventful = __webpack_require__(32); + var zrUtil = __webpack_require__(3); + var eventTool = __webpack_require__(80); + var interactionMutex = __webpack_require__(160); + + function mousedown(e) { + if (e.target && e.target.draggable) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + var rect = this.rect; + if (rect && rect.contain(x, y)) { + this._x = x; + this._y = y; + this._dragging = true; + } + } + + function mousemove(e) { + if (!this._dragging) { + return; + } + + eventTool.stop(e.event); + + if (e.gestureEvent !== 'pinch') { + + if (interactionMutex.isTaken('globalPan', this._zr)) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + + var dx = x - this._x; + var dy = y - this._y; + + this._x = x; + this._y = y; + + var target = this.target; + + if (target) { + var pos = target.position; + pos[0] += dx; + pos[1] += dy; + target.dirty(); + } + + eventTool.stop(e.event); + this.trigger('pan', dx, dy); + } + } + + function mouseup(e) { + this._dragging = false; + } + + function mousewheel(e) { + eventTool.stop(e.event); + // Convenience: + // Mac and VM Windows on Mac: scroll up: zoom out. + // Windows: scroll up: zoom in. + var zoomDelta = e.wheelDelta > 0 ? 1.1 : 1 / 1.1; + zoom.call(this, e, zoomDelta, e.offsetX, e.offsetY); + } + + function pinch(e) { + if (interactionMutex.isTaken('globalPan', this._zr)) { + return; + } + + eventTool.stop(e.event); + var zoomDelta = e.pinchScale > 1 ? 1.1 : 1 / 1.1; + zoom.call(this, e, zoomDelta, e.pinchX, e.pinchY); + } + + function zoom(e, zoomDelta, zoomX, zoomY) { + var rect = this.rect; + + if (rect && rect.contain(zoomX, zoomY)) { + + var target = this.target; + var zoomLimit = this.zoomLimit; + + if (target) { + var pos = target.position; + var scale = target.scale; + + var newZoom = this.zoom = this.zoom || 1; + newZoom *= zoomDelta; + if (zoomLimit) { + newZoom = Math.max( + Math.min(zoomLimit.max, newZoom), + zoomLimit.min + ); + } + var zoomScale = newZoom / this.zoom; + this.zoom = newZoom; + // Keep the mouse center when scaling + pos[0] -= (zoomX - pos[0]) * (zoomScale - 1); + pos[1] -= (zoomY - pos[1]) * (zoomScale - 1); + scale[0] *= zoomScale; + scale[1] *= zoomScale; + + target.dirty(); + } + + this.trigger('zoom', zoomDelta, zoomX, zoomY); + } + } + + /** + * @alias module:echarts/component/helper/RoamController + * @constructor + * @mixin {module:zrender/mixin/Eventful} + * + * @param {module:zrender/zrender~ZRender} zr + * @param {module:zrender/Element} target + * @param {module:zrender/core/BoundingRect} rect + */ + function RoamController(zr, target, rect) { + + /** + * @type {module:zrender/Element} + */ + this.target = target; + + /** + * @type {module:zrender/core/BoundingRect} + */ + this.rect = rect; + + /** + * { min: 1, max: 2 } + * @type {Object} + */ + this.zoomLimit; + + /** + * @type {number} + */ + this.zoom; + /** + * @type {module:zrender} + */ + this._zr = zr; + + // Avoid two roamController bind the same handler + var bind = zrUtil.bind; + var mousedownHandler = bind(mousedown, this); + var mousemoveHandler = bind(mousemove, this); + var mouseupHandler = bind(mouseup, this); + var mousewheelHandler = bind(mousewheel, this); + var pinchHandler = bind(pinch, this); + + Eventful.call(this); + + /** + * Notice: only enable needed types. For example, if 'zoom' + * is not needed, 'zoom' should not be enabled, otherwise + * default mousewheel behaviour (scroll page) will be disabled. + * + * @param {boolean|string} [controlType=true] Specify the control type, + * which can be null/undefined or true/false + * or 'pan/move' or 'zoom'/'scale' + */ + this.enable = function (controlType) { + // Disable previous first + this.disable(); + + if (controlType == null) { + controlType = true; + } + + if (controlType === true || (controlType === 'move' || controlType === 'pan')) { + zr.on('mousedown', mousedownHandler); + zr.on('mousemove', mousemoveHandler); + zr.on('mouseup', mouseupHandler); + } + if (controlType === true || (controlType === 'scale' || controlType === 'zoom')) { + zr.on('mousewheel', mousewheelHandler); + zr.on('pinch', pinchHandler); + } + }; + + this.disable = function () { + zr.off('mousedown', mousedownHandler); + zr.off('mousemove', mousemoveHandler); + zr.off('mouseup', mouseupHandler); + zr.off('mousewheel', mousewheelHandler); + zr.off('pinch', pinchHandler); + }; + + this.dispose = this.disable; + + this.isDragging = function () { + return this._dragging; + }; + + this.isPinching = function () { + return this._pinching; + }; + } + + zrUtil.mixin(RoamController, Eventful); + + module.exports = RoamController; + + +/***/ }, +/* 160 */ +/***/ function(module, exports) { + + + + var ATTR = '\0_ec_interaction_mutex'; + + var interactionMutex = { + + take: function (key, zr) { + getStore(zr)[key] = true; + }, + + release: function (key, zr) { + getStore(zr)[key] = false; + }, + + isTaken: function (key, zr) { + return !!getStore(zr)[key]; + } + }; + + function getStore(zr) { + return zr[ATTR] || (zr[ATTR] = {}); + } + + module.exports = interactionMutex; + + +/***/ }, +/* 161 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var roamHelper = __webpack_require__(162); + + var echarts = __webpack_require__(1); + var actionInfo = { + type: 'geoRoam', + event: 'geoRoam', + update: 'updateLayout' + }; + + /** + * @payload + * @property {string} [component=series] + * @property {string} name Component name + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + echarts.registerAction(actionInfo, function (payload, ecModel) { + var componentType = payload.component || 'series'; + + ecModel.eachComponent(componentType, function (componentModel) { + if (componentModel.name === payload.name) { + var geo = componentModel.coordinateSystem; + if (geo.type !== 'geo') { + return; + } + + var roamDetailModel = componentModel.getModel('roamDetail'); + var res = roamHelper.calcPanAndZoom( + roamDetailModel, payload, componentModel.get('scaleLimit') + ); + + componentModel.setRoamPan + && componentModel.setRoamPan(res.x, res.y); + + componentModel.setRoamZoom + && componentModel.setRoamZoom(res.zoom); + + geo && geo.setPan(res.x, res.y); + geo && geo.setZoom(res.zoom); + + // All map series with same `map` use the same geo coordinate system + // So the roamDetail must be in sync. Include the series not selected by legend + if (componentType === 'series') { + zrUtil.each(componentModel.seriesGroup, function (seriesModel) { + seriesModel.setRoamPan(res.x, res.y); + seriesModel.setRoamZoom(res.zoom); + }); + } + } + }); + }); + + +/***/ }, +/* 162 */ +/***/ function(module, exports) { + + + + var roamHelper = {}; + + /** + * Calculate pan and zoom which from roamDetail model + * @param {module:echarts/model/Model} roamDetailModel + * @param {Object} payload + * @param {Object} [zoomLimit] + */ + roamHelper.calcPanAndZoom = function ( + roamDetailModel, payload, zoomLimit + ) { + var dx = payload.dx; + var dy = payload.dy; + var zoom = payload.zoom; + + var panX = roamDetailModel.get('x') || 0; + var panY = roamDetailModel.get('y') || 0; + + var previousZoom = roamDetailModel.get('zoom') || 1; + + if (dx != null && dy != null) { + panX += dx; + panY += dy; + } + if (zoom != null) { + if (zoomLimit) { + zoom = Math.max( + Math.min(previousZoom * zoom, zoomLimit.max), + zoomLimit.min + ) / previousZoom; + } + var fixX = (payload.originX - panX) * (zoom - 1); + var fixY = (payload.originY - panY) * (zoom - 1); + + panX -= fixX; + panY -= fixY; + } + + return { + x: panX, + y: panY, + zoom: (zoom || 1) * previousZoom + }; + }; + + module.exports = roamHelper; + + +/***/ }, +/* 163 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(164); + + var Geo = __webpack_require__(165); + + var layout = __webpack_require__(21); + var zrUtil = __webpack_require__(3); + + var mapDataStores = {}; + + /** + * Resize method bound to the geo + * @param {module:echarts/coord/geo/GeoModel|module:echarts/chart/map/MapModel} geoModel + * @param {module:echarts/ExtensionAPI} api + */ + function resizeGeo (geoModel, api) { + var rect = this.getBoundingRect(); + + var boxLayoutOption = geoModel.getBoxLayoutParams(); + // 0.75 rate + boxLayoutOption.aspect = rect.width / rect.height * 0.75; + + var viewRect = layout.getLayoutRect(boxLayoutOption, { + width: api.getWidth(), + height: api.getHeight() + }); + + this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); + + var roamDetailModel = geoModel.getModel('roamDetail'); + + var panX = roamDetailModel.get('x') || 0; + var panY = roamDetailModel.get('y') || 0; + var zoom = roamDetailModel.get('zoom') || 1; + + this.setPan(panX, panY); + this.setZoom(zoom); + } + + /** + * @param {module:echarts/coord/Geo} geo + * @param {module:echarts/model/Model} model + * @inner + */ + function setGeoCoords(geo, model) { + zrUtil.each(model.get('geoCoord'), function (geoCoord, name) { + geo.addGeoCoord(name, geoCoord); + }); + } + + function mapNotExistsError(name) { + console.error('Map ' + name + ' not exists'); + } + + var geoCreator = { + + // For deciding which dimensions to use when creating list data + dimensions: Geo.prototype.dimensions, + + create: function (ecModel, api) { + var geoList = []; + + // FIXME Create each time may be slow + ecModel.eachComponent('geo', function (geoModel, idx) { + var name = geoModel.get('map'); + var mapData = mapDataStores[name]; + if (!mapData) { + mapNotExistsError(name); + } + var geo = new Geo( + name + idx, name, + mapData && mapData.geoJson, mapData && mapData.specialAreas, + geoModel.get('nameMap') + ); + geo.zoomLimit = geoModel.get('scaleLimit'); + geoList.push(geo); + + setGeoCoords(geo, geoModel); + + geoModel.coordinateSystem = geo; + geo.model = geoModel; + + // Inject resize method + geo.resize = resizeGeo; + + geo.resize(geoModel, api); + }); + + ecModel.eachSeries(function (seriesModel) { + var coordSys = seriesModel.get('coordinateSystem'); + if (coordSys === 'geo') { + var geoIndex = seriesModel.get('geoIndex') || 0; + seriesModel.coordinateSystem = geoList[geoIndex]; + } + }); + + // If has map series + var mapModelGroupBySeries = {}; + + ecModel.eachSeriesByType('map', function (seriesModel) { + var mapType = seriesModel.get('map'); + + mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; + + mapModelGroupBySeries[mapType].push(seriesModel); + }); + + zrUtil.each(mapModelGroupBySeries, function (mapSeries, mapType) { + var mapData = mapDataStores[mapType]; + if (!mapData) { + mapNotExistsError(name); + } + + var nameMapList = zrUtil.map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('nameMap'); + }); + var geo = new Geo( + mapType, mapType, + mapData && mapData.geoJson, mapData && mapData.specialAreas, + zrUtil.mergeAll(nameMapList) + ); + geo.zoomLimit = zrUtil.retrieve.apply(null, zrUtil.map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('scaleLimit'); + })); + geoList.push(geo); + + // Inject resize method + geo.resize = resizeGeo; + + geo.resize(mapSeries[0], api); + + zrUtil.each(mapSeries, function (singleMapSeries) { + singleMapSeries.coordinateSystem = geo; + + setGeoCoords(geo, singleMapSeries); + }); + }); + + return geoList; + }, + + /** + * @param {string} mapName + * @param {Object|string} geoJson + * @param {Object} [specialAreas] + * + * @example + * $.get('USA.json', function (geoJson) { + * echarts.registerMap('USA', geoJson); + * // Or + * echarts.registerMap('USA', { + * geoJson: geoJson, + * specialAreas: {} + * }) + * }); + */ + registerMap: function (mapName, geoJson, specialAreas) { + if (geoJson.geoJson && !geoJson.features) { + specialAreas = geoJson.specialAreas; + geoJson = geoJson.geoJson; + } + if (typeof geoJson === 'string') { + geoJson = (typeof JSON !== 'undefined' && JSON.parse) + ? JSON.parse(geoJson) : (new Function('return (' + geoJson + ');'))(); + } + mapDataStores[mapName] = { + geoJson: geoJson, + specialAreas: specialAreas + }; + }, + + /** + * @param {string} mapName + * @return {Object} + */ + getMap: function (mapName) { + return mapDataStores[mapName]; + } + }; + + // Inject methods into echarts + var echarts = __webpack_require__(1); + + echarts.registerMap = geoCreator.registerMap; + + echarts.getMap = geoCreator.getMap; + + // TODO + echarts.loadMap = function () {}; + + echarts.registerCoordinateSystem('geo', geoCreator); + + +/***/ }, +/* 164 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var modelUtil = __webpack_require__(5); + var ComponentModel = __webpack_require__(19); + + ComponentModel.extend({ + + type: 'geo', + + /** + * @type {module:echarts/coord/geo/Geo} + */ + coordinateSystem: null, + + init: function (option) { + ComponentModel.prototype.init.apply(this, arguments); + + // Default label emphasis `position` and `show` + modelUtil.defaultEmphasis( + option.label, ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + }, + + defaultOption: { + + zlevel: 0, + + z: 0, + + show: true, + + left: 'center', + + top: 'center', + + // 自适应 + // width:, + // height:, + // right + // bottom + + // Map type + map: '', + + // 在 roam 开启的时候使用 + roamDetail: { + x: 0, + y: 0, + zoom: 1 + }, + + scaleLimit: null, + + label: { + normal: { + show: false, + textStyle: { + color: '#000' + } + }, + emphasis: { + show: true, + textStyle: { + color: 'rgb(100,0,0)' + } + } + }, + + itemStyle: { + normal: { + // color: 各异, + borderWidth: 0.5, + borderColor: '#444', + color: '#eee' + }, + emphasis: { // 也是选中样式 + color: 'rgba(255,215,0,0.8)' + } + } + }, + + /** + * Format label + * @param {string} name Region name + * @param {string} [status='normal'] 'normal' or 'emphasis' + * @return {string} + */ + getFormattedLabel: function (name, status) { + var formatter = this.get('label.' + status + '.formatter'); + var params = { + name: name + }; + if (typeof formatter === 'function') { + params.status = status; + return formatter(params); + } + else if (typeof formatter === 'string') { + return formatter.replace('{a}', params.seriesName); + } + }, + + setRoamZoom: function (zoom) { + var roamDetail = this.option.roamDetail; + roamDetail && (roamDetail.zoom = zoom); + }, + + setRoamPan: function (x, y) { + var roamDetail = this.option.roamDetail; + if (roamDetail) { + roamDetail.x = x; + roamDetail.y = y; + } + } + }); + + +/***/ }, +/* 165 */ +/***/ function(module, exports, __webpack_require__) { + + + + var parseGeoJson = __webpack_require__(166); + + var zrUtil = __webpack_require__(3); + + var BoundingRect = __webpack_require__(15); + + var View = __webpack_require__(169); + + + // Geo fix functions + var geoFixFuncs = [ + __webpack_require__(170), + __webpack_require__(171), + __webpack_require__(172) + ]; + + /** + * [Geo description] + * @param {string} name Geo name + * @param {string} map Map type + * @param {Object} geoJson + * @param {Object} [specialAreas] + * Specify the positioned areas by left, top, width, height + * @param {Object.} [nameMap] + * Specify name alias + */ + function Geo(name, map, geoJson, specialAreas, nameMap) { + + View.call(this, name); + + /** + * Map type + * @type {string} + */ + this.map = map; + + this._nameCoordMap = {}; + + this.loadGeoJson(geoJson, specialAreas, nameMap); + } + + Geo.prototype = { + + constructor: Geo, + + type: 'geo', + + /** + * @param {Array.} + * @readOnly + */ + dimensions: ['lng', 'lat'], + + /** + * @param {Object} geoJson + * @param {Object} [specialAreas] + * Specify the positioned areas by left, top, width, height + * @param {Object.} [nameMap] + * Specify name alias + */ + loadGeoJson: function (geoJson, specialAreas, nameMap) { + // https://jsperf.com/try-catch-performance-overhead + try { + this.regions = geoJson ? parseGeoJson(geoJson) : []; + } + catch (e) { + throw 'Invalid geoJson format\n' + e; + } + specialAreas = specialAreas || {}; + nameMap = nameMap || {}; + var regions = this.regions; + var regionsMap = {}; + for (var i = 0; i < regions.length; i++) { + var regionName = regions[i].name; + // Try use the alias in nameMap + regionName = nameMap[regionName] || regionName; + regions[i].name = regionName; + + regionsMap[regionName] = regions[i]; + // Add geoJson + this.addGeoCoord(regionName, regions[i].center); + + // Some area like Alaska in USA map needs to be tansformed + // to look better + var specialArea = specialAreas[regionName]; + if (specialArea) { + regions[i].transformTo( + specialArea.left, specialArea.top, specialArea.width, specialArea.height + ); + } + } + + this._regionsMap = regionsMap; + + this._rect = null; + + zrUtil.each(geoFixFuncs, function (fixFunc) { + fixFunc(this); + }, this); + }, + + // Overwrite + transformTo: function (x, y, width, height) { + var rect = this.getBoundingRect(); + + rect = rect.clone(); + // Longitute is inverted + rect.y = -rect.y - rect.height; + + var viewTransform = this._viewTransform; + + viewTransform.transform = rect.calculateTransform( + new BoundingRect(x, y, width, height) + ); + + viewTransform.decomposeTransform(); + + var scale = viewTransform.scale; + scale[1] = -scale[1]; + + viewTransform.updateTransform(); + + this._updateTransform(); + }, + + /** + * @param {string} name + * @return {module:echarts/coord/geo/Region} + */ + getRegion: function (name) { + return this._regionsMap[name]; + }, + + /** + * Add geoCoord for indexing by name + * @param {string} name + * @param {Array.} geoCoord + */ + addGeoCoord: function (name, geoCoord) { + this._nameCoordMap[name] = geoCoord; + }, + + /** + * Get geoCoord by name + * @param {string} name + * @return {Array.} + */ + getGeoCoord: function (name) { + return this._nameCoordMap[name]; + }, + + // Overwrite + getBoundingRect: function () { + if (this._rect) { + return this._rect; + } + var rect; + + var regions = this.regions; + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(); + rect = rect || regionRect.clone(); + rect.union(regionRect); + } + // FIXME Always return new ? + return (this._rect = rect || new BoundingRect(0, 0, 0, 0)); + }, + + /** + * Convert series data to a list of points + * @param {module:echarts/data/List} data + * @param {boolean} stack + * @return {Array} + * Return list of points. For example: + * `[[10, 10], [20, 20], [30, 30]]` + */ + dataToPoints: function (data) { + var item = []; + return data.mapArray(['lng', 'lat'], function (lon, lat) { + item[0] = lon; + item[1] = lat; + return this.dataToPoint(item); + }, this); + }, + + // Overwrite + /** + * @param {string|Array.} data + * @return {Array.} + */ + dataToPoint: function (data) { + if (typeof data === 'string') { + // Map area name to geoCoord + data = this.getGeoCoord(data); + } + if (data) { + return View.prototype.dataToPoint.call(this, data); + } + } + }; + + zrUtil.mixin(Geo, View); + + module.exports = Geo; + + +/***/ }, +/* 166 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Parse and decode geo json + * @module echarts/coord/geo/parseGeoJson + */ + + + var zrUtil = __webpack_require__(3); + + var Region = __webpack_require__(167); + + function decode(json) { + if (!json.UTF8Encoding) { + return json; + } + var features = json.features; + + for (var f = 0; f < features.length; f++) { + var feature = features[f]; + var geometry = feature.geometry; + var coordinates = geometry.coordinates; + var encodeOffsets = geometry.encodeOffsets; + + for (var c = 0; c < coordinates.length; c++) { + var coordinate = coordinates[c]; + + if (geometry.type === 'Polygon') { + coordinates[c] = decodePolygon( + coordinate, + encodeOffsets[c] + ); + } + else if (geometry.type === 'MultiPolygon') { + for (var c2 = 0; c2 < coordinate.length; c2++) { + var polygon = coordinate[c2]; + coordinate[c2] = decodePolygon( + polygon, + encodeOffsets[c][c2] + ); + } + } + } + } + // Has been decoded + json.UTF8Encoding = false; + return json; + } + + function decodePolygon(coordinate, encodeOffsets) { + var result = []; + var prevX = encodeOffsets[0]; + var prevY = encodeOffsets[1]; + + for (var i = 0; i < coordinate.length; i += 2) { + var x = coordinate.charCodeAt(i) - 64; + var y = coordinate.charCodeAt(i + 1) - 64; + // ZigZag decoding + x = (x >> 1) ^ (-(x & 1)); + y = (y >> 1) ^ (-(y & 1)); + // Delta deocding + x += prevX; + y += prevY; + + prevX = x; + prevY = y; + // Dequantize + result.push([x / 1024, y / 1024]); + } + + return result; + } + + /** + * @inner + */ + function flattern2D(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + for (var k = 0; k < array[i].length; k++) { + ret.push(array[i][k]); + } + } + return ret; + } + + /** + * @alias module:echarts/coord/geo/parseGeoJson + * @param {Object} geoJson + * @return {module:zrender/container/Group} + */ + module.exports = function (geoJson) { + + decode(geoJson); + + return zrUtil.map(zrUtil.filter(geoJson.features, function (featureObj) { + // Output of mapshaper may have geometry null + return featureObj.geometry && featureObj.properties; + }), function (featureObj) { + var properties = featureObj.properties; + var geometry = featureObj.geometry; + + var coordinates = geometry.coordinates; + + if (geometry.type === 'MultiPolygon') { + coordinates = flattern2D(coordinates); + } + + return new Region( + properties.name, + coordinates, + properties.cp + ); + }); + }; + + +/***/ }, +/* 167 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/coord/geo/Region + */ + + + var polygonContain = __webpack_require__(168); + + var BoundingRect = __webpack_require__(15); + + var bbox = __webpack_require__(50); + var vec2 = __webpack_require__(16); + + /** + * @param {string} name + * @param {Array} contours + * @param {Array.} cp + */ + function Region(name, contours, cp) { + + /** + * @type {string} + * @readOnly + */ + this.name = name; + + /** + * @type {Array.} + * @readOnly + */ + this.contours = contours; + + if (!cp) { + var rect = this.getBoundingRect(); + cp = [ + rect.x + rect.width / 2, + rect.y + rect.height / 2 + ]; + } + else { + cp = [cp[0], cp[1]]; + } + /** + * @type {Array.} + */ + this.center = cp; + } + + Region.prototype = { + + constructor: Region, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function () { + var rect = this._rect; + if (rect) { + return rect; + } + + var MAX_NUMBER = Number.MAX_VALUE; + var min = [MAX_NUMBER, MAX_NUMBER]; + var max = [-MAX_NUMBER, -MAX_NUMBER]; + var min2 = []; + var max2 = []; + var contours = this.contours; + for (var i = 0; i < contours.length; i++) { + bbox.fromPoints(contours[i], min2, max2); + vec2.min(min, min, min2); + vec2.max(max, max, max2); + } + // No data + if (i === 0) { + min[0] = min[1] = max[0] = max[1] = 0; + } + + return (this._rect = new BoundingRect( + min[0], min[1], max[0] - min[0], max[1] - min[1] + )); + }, + + /** + * @param {} coord + * @return {boolean} + */ + contain: function (coord) { + var rect = this.getBoundingRect(); + var contours = this.contours; + if (rect.contain(coord[0], coord[1])) { + for (var i = 0, len = contours.length; i < len; i++) { + if (polygonContain.contain(contours[i], coord[0], coord[1])) { + return true; + } + } + } + return false; + }, + + transformTo: function (x, y, width, height) { + var rect = this.getBoundingRect(); + var aspect = rect.width / rect.height; + if (!width) { + width = aspect * height; + } + else if (!height) { + height = width / aspect ; + } + var target = new BoundingRect(x, y, width, height); + var transform = rect.calculateTransform(target); + var contours = this.contours; + for (var i = 0; i < contours.length; i++) { + for (var p = 0; p < contours[i].length; p++) { + vec2.applyTransform(contours[i][p], contours[i][p], transform); + } + } + rect = this._rect; + rect.copy(target); + // Update center + this.center = [ + rect.x + rect.width / 2, + rect.y + rect.height / 2 + ]; + } + }; + + module.exports = Region; + + +/***/ }, +/* 168 */ +/***/ function(module, exports, __webpack_require__) { + + + + var windingLine = __webpack_require__(57); + + var EPSILON = 1e-8; + + function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON; + } + + function contain(points, x, y) { + var w = 0; + var p = points[0]; + + if (!p) { + return false; + } + + for (var i = 1; i < points.length; i++) { + var p2 = points[i]; + w += windingLine(p[0], p[1], p2[0], p2[1], x, y); + p = p2; + } + + // Close polygon + var p0 = points[0]; + if (!isAroundEqual(p[0], p0[0]) || !isAroundEqual(p[1], p0[1])) { + w += windingLine(p[0], p[1], p0[0], p0[1], x, y); + } + + return w !== 0; + } + + + module.exports = { + contain: contain + }; + + +/***/ }, +/* 169 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Simple view coordinate system + * Mapping given x, y to transformd view x, y + */ + + + var vector = __webpack_require__(16); + var matrix = __webpack_require__(17); + + var Transformable = __webpack_require__(33); + var zrUtil = __webpack_require__(3); + + var BoundingRect = __webpack_require__(15); + + var v2ApplyTransform = vector.applyTransform; + + // Dummy transform node + function TransformDummy() { + Transformable.call(this); + } + zrUtil.mixin(TransformDummy, Transformable); + + function View(name) { + /** + * @type {string} + */ + this.name = name; + + /** + * @type {Array.} + */ + this.zoomLimit; + + Transformable.call(this); + + this._roamTransform = new TransformDummy(); + + this._viewTransform = new TransformDummy(); + } + + View.prototype = { + + constructor: View, + + type: 'view', + + /** + * @param {Array.} + * @readOnly + */ + dimensions: ['x', 'y'], + + /** + * Set bounding rect + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + */ + + // PENDING to getRect + setBoundingRect: function (x, y, width, height) { + this._rect = new BoundingRect(x, y, width, height); + return this._rect; + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + // PENDING to getRect + getBoundingRect: function () { + return this._rect; + }, + + /** + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + */ + setViewRect: function (x, y, width, height) { + this.transformTo(x, y, width, height); + this._viewRect = new BoundingRect(x, y, width, height); + }, + + /** + * Transformed to particular position and size + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + */ + transformTo: function (x, y, width, height) { + var rect = this.getBoundingRect(); + var viewTransform = this._viewTransform; + + viewTransform.transform = rect.calculateTransform( + new BoundingRect(x, y, width, height) + ); + + viewTransform.decomposeTransform(); + + this._updateTransform(); + }, + + /** + * @param {number} x + * @param {number} y + */ + setPan: function (x, y) { + + this._roamTransform.position = [x, y]; + + this._updateTransform(); + }, + + /** + * @param {number} zoom + */ + setZoom: function (zoom) { + var zoomLimit = this.zoomLimit; + if (zoomLimit) { + zoom = Math.max( + Math.min(zoom, zoomLimit.max), zoomLimit.min + ); + } + + this._roamTransform.scale = [zoom, zoom]; + + this._updateTransform(); + }, + + /** + * @return {Array.} data + * @return {Array.} + */ + dataToPoint: function (data) { + var transform = this.transform; + return transform + ? v2ApplyTransform([], data, transform) + : [data[0], data[1]]; + }, + + /** + * Convert a (x, y) point to (lon, lat) data + * @param {Array.} point + * @return {Array.} + */ + pointToData: function (point) { + var invTransform = this.invTransform; + return invTransform + ? v2ApplyTransform([], point, invTransform) + : [point[0], point[1]]; + } + + /** + * @return {number} + */ + // getScalarScale: function () { + // // Use determinant square root of transform to mutiply scalar + // var m = this.transform; + // var det = Math.sqrt(Math.abs(m[0] * m[3] - m[2] * m[1])); + // return det; + // } + }; + + zrUtil.mixin(View, Transformable); + + module.exports = View; + + +/***/ }, +/* 170 */ +/***/ function(module, exports, __webpack_require__) { + + // Fix for 南海诸岛 + + + var Region = __webpack_require__(167); + + var geoCoord = [126, 25]; + + var points = [ + [[0,3.5],[7,11.2],[15,11.9],[30,7],[42,0.7],[52,0.7], + [56,7.7],[59,0.7],[64,0.7],[64,0],[5,0],[0,3.5]], + [[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]], + [[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]], + [[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]], + [[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]], + [[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]], + [[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]], + [[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]], + [[51,35],[51,28.7],[53,28.7],[53,35],[51,35]], + [[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]], + [[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]], + [[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4], + [1,92.4],[1,3.5],[0,3.5]] + ]; + for (var i = 0; i < points.length; i++) { + for (var k = 0; k < points[i].length; k++) { + points[i][k][0] /= 10.5; + points[i][k][1] /= -10.5 / 0.75; + + points[i][k][0] += geoCoord[0]; + points[i][k][1] += geoCoord[1]; + } + } + module.exports = function (geo) { + if (geo.map === 'china') { + geo.regions.push(new Region( + '南海诸岛', points, geoCoord + )); + } + }; + + +/***/ }, +/* 171 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var coordsOffsetMap = { + '南海诸岛' : [32, 80], + // 全国 + '广东': [0, -10], + '香港': [10, 5], + '澳门': [-10, 10], + //'北京': [-10, 0], + '天津': [5, 5] + }; + + module.exports = function (geo) { + zrUtil.each(geo.regions, function (region) { + var coordFix = coordsOffsetMap[region.name]; + if (coordFix) { + var cp = region.center; + cp[0] += coordFix[0] / 10.5; + cp[1] += -coordFix[1] / (10.5 / 0.75); + } + }); + }; + + +/***/ }, +/* 172 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var geoCoordMap = { + 'Russia': [100, 60], + 'United States of America': [-99, 38] + }; + + module.exports = function (geo) { + zrUtil.each(geo.regions, function (region) { + var geoCoord = geoCoordMap[region.name]; + if (geoCoord) { + var cp = region.center; + cp[0] = geoCoord[0]; + cp[1] = geoCoord[1]; + } + }); + }; + + +/***/ }, +/* 173 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + module.exports = function (ecModel) { + + var processedMapType = {}; + + ecModel.eachSeriesByType('map', function (mapSeries) { + var mapType = mapSeries.get('mapType'); + if (processedMapType[mapType]) { + return; + } + + var mapSymbolOffsets = {}; + + zrUtil.each(mapSeries.seriesGroup, function (subMapSeries) { + var geo = subMapSeries.coordinateSystem; + var data = subMapSeries.getData(); + if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) { + data.each('value', function (value, idx) { + var name = data.getName(idx); + var region = geo.getRegion(name); + + // No region or no value + // In MapSeries data regions will be filled with NaN + // If they are not in the series.data array. + // So here must validate if value is NaN + if (!region || isNaN(value)) { + return; + } + + var offset = mapSymbolOffsets[name] || 0; + + var point = geo.dataToPoint(region.center); + + mapSymbolOffsets[name] = offset + 1; + + data.setItemLayout(idx, { + point: point, + offset: offset + }); + }); + } + }); + + // Show label of those region not has legendSymbol(which is offset 0) + var data = mapSeries.getData(); + data.each(function (idx) { + var name = data.getName(idx); + var layout = data.getItemLayout(idx) || {}; + layout.showLabel = !mapSymbolOffsets[name]; + data.setItemLayout(idx, layout); + }); + + processedMapType[mapType] = true; + }); + }; + + +/***/ }, +/* 174 */ +/***/ function(module, exports) { + + + module.exports = function (ecModel) { + ecModel.eachSeriesByType('map', function (seriesModel) { + var colorList = seriesModel.get('color'); + var itemStyleModel = seriesModel.getModel('itemStyle.normal'); + + var areaColor = itemStyleModel.get('areaColor'); + var color = itemStyleModel.get('color') + || colorList[seriesModel.seriesIndex % colorList.length]; + + seriesModel.getData().setVisual({ + 'areaColor': areaColor, + 'color': color + }); + }); + }; + + +/***/ }, +/* 175 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + // FIXME 公用? + /** + * @param {Array.} datas + * @param {string} statisticsType 'average' 'sum' + * @inner + */ + function dataStatistics(datas, statisticsType) { + var dataNameMap = {}; + var dims = ['value']; + + for (var i = 0; i < datas.length; i++) { + datas[i].each(dims, function (value, idx) { + var name = datas[i].getName(idx); + dataNameMap[name] = dataNameMap[name] || []; + if (!isNaN(value)) { + dataNameMap[name].push(value); + } + }); + } + + return datas[0].map(dims, function (value, idx) { + var name = datas[0].getName(idx); + var sum = 0; + var min = Infinity; + var max = -Infinity; + var len = dataNameMap[name].length; + for (var i = 0; i < len; i++) { + min = Math.min(min, dataNameMap[name][i]); + max = Math.max(max, dataNameMap[name][i]); + sum += dataNameMap[name][i]; + } + var result; + if (statisticsType === 'min') { + result = min; + } + else if (statisticsType === 'max') { + result = max; + } + else if (statisticsType === 'average') { + result = sum / len; + } + else { + result = sum; + } + return len === 0 ? NaN : result; + }); + } + + module.exports = function (ecModel) { + var seriesGroupByMapType = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + var mapType = seriesModel.get('map'); + seriesGroupByMapType[mapType] = seriesGroupByMapType[mapType] || []; + seriesGroupByMapType[mapType].push(seriesModel); + }); + + zrUtil.each(seriesGroupByMapType, function (seriesList, mapType) { + var data = dataStatistics( + zrUtil.map(seriesList, function (seriesModel) { + return seriesModel.getData(); + }), + seriesList[0].get('mapValueCalculation') + ); + + seriesList[0].seriesGroup = []; + + seriesList[0].setData(data); + + // FIXME Put where? + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].seriesGroup = seriesList; + seriesList[i].needsDrawMap = i === 0; + } + }); + }; + + +/***/ }, +/* 176 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var geoProps = [ + 'x', 'y', 'x2', 'y2', 'width', 'height', 'map', 'roam', 'roamDetail', 'label', 'itemStyle' + ]; + + var geoCoordsMap = {}; + + function createGeoFromMap(mapSeriesOpt) { + var geoOpt = {}; + zrUtil.each(geoProps, function (propName) { + if (mapSeriesOpt[propName] != null) { + geoOpt[propName] = mapSeriesOpt[propName]; + } + }); + return geoOpt; + } + module.exports = function (option) { + // Save geoCoord + var mapSeries = []; + zrUtil.each(option.series, function (seriesOpt) { + if (seriesOpt.type === 'map') { + mapSeries.push(seriesOpt); + } + zrUtil.extend(geoCoordsMap, seriesOpt.geoCoord); + }); + + var newCreatedGeoOptMap = {}; + zrUtil.each(mapSeries, function (seriesOpt) { + seriesOpt.map = seriesOpt.map || seriesOpt.mapType; + // Put x, y, width, height, x2, y2 in the top level + zrUtil.defaults(seriesOpt, seriesOpt.mapLocation); + if (seriesOpt.markPoint) { + var markPoint = seriesOpt.markPoint; + // Convert name or geoCoord in markPoint to lng and lat + // For example + // { name: 'xxx', value: 10} Or + // { geoCoord: [lng, lat], value: 10} to + // { name: 'xxx', value: [lng, lat, 10]} + markPoint.data = zrUtil.map(markPoint.data, function (dataOpt) { + if (!zrUtil.isArray(dataOpt.value)) { + var geoCoord; + if (dataOpt.geoCoord) { + geoCoord = dataOpt.geoCoord; + } + else if (dataOpt.name) { + geoCoord = geoCoordsMap[dataOpt.name]; + } + var newValue = geoCoord ? [geoCoord[0], geoCoord[1]] : [NaN, NaN]; + if (dataOpt.value != null) { + newValue.push(dataOpt.value); + } + dataOpt.value = newValue; + } + return dataOpt; + }); + // Convert map series which only has markPoint without data to scatter series + // FIXME + if (!(seriesOpt.data && seriesOpt.data.length)) { + if (!option.geo) { + option.geo = []; + } + + // Use same geo if multiple map series has same map type + var geoOpt = newCreatedGeoOptMap[seriesOpt.map]; + if (!geoOpt) { + geoOpt = newCreatedGeoOptMap[seriesOpt.map] = createGeoFromMap(seriesOpt); + option.geo.push(geoOpt); + } + + var scatterSeries = seriesOpt.markPoint; + scatterSeries.type = option.effect && option.effect.show ? 'effectScatter' : 'scatter'; + scatterSeries.coordinateSystem = 'geo'; + scatterSeries.geoIndex = zrUtil.indexOf(option.geo, geoOpt); + scatterSeries.name = seriesOpt.name; + + option.series.splice(zrUtil.indexOf(option.series, seriesOpt), 1, scatterSeries); + } + } + }); + }; + + +/***/ }, +/* 177 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + + __webpack_require__(178); + __webpack_require__(182); + __webpack_require__(185); + + echarts.registerVisualCoding('chart', __webpack_require__(186)); + + echarts.registerLayout(__webpack_require__(188)); + + +/***/ }, +/* 178 */ +/***/ function(module, exports, __webpack_require__) { + + + + var SeriesModel = __webpack_require__(27); + var Tree = __webpack_require__(179); + var zrUtil = __webpack_require__(3); + var Model = __webpack_require__(8); + var formatUtil = __webpack_require__(6); + var helper = __webpack_require__(181); + var encodeHTML = formatUtil.encodeHTML; + var addCommas = formatUtil.addCommas; + + + module.exports = SeriesModel.extend({ + + type: 'series.treemap', + + dependencies: ['grid', 'polar'], + + /** + * @type {module:echarts/data/Tree~Node} + */ + _viewRoot: null, + + defaultOption: { + // center: ['50%', '50%'], // not supported in ec3. + // size: ['80%', '80%'], // deprecated, compatible with ec2. + left: 'center', + top: 'middle', + right: null, + bottom: null, + width: '80%', + height: '80%', + sort: true, // Can be null or false or true + // (order by desc default, asc not supported yet (strange effect)) + clipWindow: 'origin', // Size of clipped window when zooming. 'origin' or 'fullscreen' + squareRatio: 0.5 * (1 + Math.sqrt(5)), // golden ratio + leafDepth: null, // Nodes on depth from root are regarded as leaves. + // Count from zero (zero represents only view root). + visualDimension: 0, // Can be 0, 1, 2, 3. + zoomToNodeRatio: 0.32 * 0.32, // Be effective when using zoomToNode. Specify the proportion of the + // target node area in the view area. + roam: true, // true, false, 'scale' or 'zoom', 'move'. + nodeClick: 'zoomToNode', // Leaf node click behaviour: 'zoomToNode', 'link', false. + // If leafDepth is set and clicking a node which has children but + // be on left depth, the behaviour would be changing root. Otherwise + // use behavious defined above. + animation: true, + animationDurationUpdate: 900, + animationEasing: 'quinticInOut', + breadcrumb: { + show: true, + height: 22, + left: 'center', + top: 'bottom', + // right + // bottom + emptyItemWidth: 25, // Width of empty node. + itemStyle: { + normal: { + color: 'rgba(0,0,0,0.7)', //'#5793f3', + borderColor: 'rgba(255,255,255,0.7)', + borderWidth: 1, + shadowColor: 'rgba(150,150,150,1)', + shadowBlur: 3, + shadowOffsetX: 0, + shadowOffsetY: 0, + textStyle: { + color: '#fff' + } + }, + emphasis: { + textStyle: {} + } + } + }, + label: { + normal: { + show: true, + position: ['50%', '50%'], // Can be 5, '5%' or position stirng like 'insideTopLeft', ... + textStyle: { + align: 'center', + baseline: 'middle', + color: '#fff', + ellipsis: true + } + } + }, + itemStyle: { + normal: { + color: null, // Can be 'none' if not necessary. + colorAlpha: null, // Can be 'none' if not necessary. + colorSaturation: null, // Can be 'none' if not necessary. + borderWidth: 0, + gapWidth: 0, + borderColor: '#fff', + borderColorSaturation: null // If specified, borderColor will be ineffective, and the + // border color is evaluated by color of current node and + // borderColorSaturation. + }, + emphasis: { + + } + }, + color: 'none', // Array. Specify color list of each level. + // level[0].color would be global color list. + colorAlpha: null, // Array. Specify color alpha range of each level, like [0.2, 0.8] + colorSaturation: null, // Array. Specify color saturation of each level, like [0.2, 0.5] + colorMappingBy: 'index', // 'value' or 'index' or 'id'. + visibleMin: 10, // If area less than this threshold (unit: pixel^2), node will not + // be rendered. Only works when sort is 'asc' or 'desc'. + childrenVisibleMin: null, // If area of a node less than this threshold (unit: pixel^2), + // grandchildren will not show. + // Why grandchildren? If not grandchildren but children, + // some siblings show children and some not, + // the appearance may be mess and not consistent, + levels: [] // Each item: { + // visibleMin, itemStyle, visualDimension, label + // } + // data: { + // value: [], + // children: [], + // link: 'http://xxx.xxx.xxx', + // target: 'blank' or 'self' + // } + }, + + /** + * @override + */ + getInitialData: function (option, ecModel) { + var data = option.data || []; + var rootName = option.name; + rootName == null && (rootName = option.name); + + // Create a virtual root. + var root = {name: rootName, children: option.data}; + var value0 = (data[0] || {}).value; + + completeTreeValue(root, zrUtil.isArray(value0) ? value0.length : -1); + + // FIXME + // sereis.mergeOption 的 getInitData是否放在merge后,从而能直接获取merege后的结果而非手动判断。 + var levels = option.levels || []; + + levels = option.levels = setDefault(levels, ecModel); + + // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + return Tree.createTree(root, this, levels).data; + }, + + optionUpdated: function () { + this.resetViewRoot(); + }, + + /** + * @override + * @param {number} dataIndex + * @param {boolean} [mutipleSeries=false] + */ + formatTooltip: function (dataIndex) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var formattedValue = zrUtil.isArray(value) + ? addCommas(value[0]) : addCommas(value); + var name = data.getName(dataIndex); + + return encodeHTML(name) + ': ' + formattedValue; + }, + + /** + * Add tree path to tooltip param + * + * @override + * @param {number} dataIndex + * @return {Object} + */ + getDataParams: function (dataIndex) { + var params = SeriesModel.prototype.getDataParams.apply(this, arguments); + + var data = this.getData(); + var node = data.tree.getNodeByDataIndex(dataIndex); + var treePathInfo = params.treePathInfo = []; + + while (node) { + var nodeDataIndex = node.dataIndex; + treePathInfo.push({ + name: node.name, + dataIndex: nodeDataIndex, + value: this.getRawValue(nodeDataIndex) + }); + node = node.parentNode; + } + + treePathInfo.reverse(); + + return params; + }, + + /** + * @public + * @param {Object} layoutInfo { + * x: containerGroup x + * y: containerGroup y + * width: containerGroup width + * height: containerGroup height + * } + */ + setLayoutInfo: function (layoutInfo) { + /** + * @readOnly + * @type {Object} + */ + this.layoutInfo = this.layoutInfo || {}; + zrUtil.extend(this.layoutInfo, layoutInfo); + }, + + /** + * @param {string} id + * @return {number} index + */ + mapIdToIndex: function (id) { + // A feature is implemented: + // index is monotone increasing with the sequence of + // input id at the first time. + // This feature can make sure that each data item and its + // mapped color have the same index between data list and + // color list at the beginning, which is useful for user + // to adjust data-color mapping. + + /** + * @private + * @type {Object} + */ + var idIndexMap = this._idIndexMap; + + if (!idIndexMap) { + idIndexMap = this._idIndexMap = {}; + /** + * @private + * @type {number} + */ + this._idIndexMapCount = 0; + } + + var index = idIndexMap[id]; + if (index == null) { + idIndexMap[id] = index = this._idIndexMapCount++; + } + + return index; + }, + + getViewRoot: function () { + return this._viewRoot; + }, + + /** + * @param {module:echarts/data/Tree~Node} [viewRoot] + * @return {string} direction 'drilldown' or 'rollup' + */ + resetViewRoot: function (viewRoot) { + viewRoot + ? (this._viewRoot = viewRoot) + : (viewRoot = this._viewRoot); + + var root = this.getData().tree.root; + + if (!viewRoot + || (viewRoot !== root && !root.contains(viewRoot)) + ) { + this._viewRoot = root; + } + } + }); + + /** + * @param {Object} dataNode + */ + function completeTreeValue(dataNode, arrValueLength) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + + zrUtil.each(dataNode.children, function (child) { + + completeTreeValue(child, arrValueLength); + + var childValue = child.value; + zrUtil.isArray(childValue) && (childValue = childValue[0]); + + sum += childValue; + }); + + var thisValue = dataNode.value; + + if (arrValueLength >= 0) { + if (!zrUtil.isArray(thisValue)) { + dataNode.value = new Array(arrValueLength); + } + else { + thisValue = thisValue[0]; + } + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } + // Value should not less than 0. + if (thisValue < 0) { + thisValue = 0; + } + + arrValueLength >= 0 + ? (dataNode.value[0] = thisValue) + : (dataNode.value = thisValue); + } + + /** + * set default to level configuration + */ + function setDefault(levels, ecModel) { + var globalColorList = ecModel.get('color'); + + if (!globalColorList) { + return; + } + + levels = levels || []; + var hasColorDefine; + zrUtil.each(levels, function (levelDefine) { + var model = new Model(levelDefine); + var modelColor = model.get('color'); + if (model.get('itemStyle.normal.color') + || (modelColor && modelColor !== 'none') + ) { + hasColorDefine = true; + } + }); + + if (!hasColorDefine) { + var level0 = levels[0] || (levels[0] = {}); + level0.color = globalColorList.slice(); + } + + return levels; + } + + + +/***/ }, +/* 179 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Tree data structure + * + * @module echarts/data/Tree + */ + + + var zrUtil = __webpack_require__(3); + var Model = __webpack_require__(8); + var List = __webpack_require__(94); + var linkListHelper = __webpack_require__(180); + var completeDimensions = __webpack_require__(96); + + /** + * @constructor module:echarts/data/Tree~TreeNode + * @param {string} name + * @param {number} [dataIndex=-1] + * @param {module:echarts/data/Tree} hostTree + */ + var TreeNode = function (name, dataIndex, hostTree) { + /** + * @type {string} + */ + this.name = name || ''; + + /** + * Depth of node + * + * @type {number} + * @readOnly + */ + this.depth = 0; + + /** + * Height of the subtree rooted at this node. + * @type {number} + * @readOnly + */ + this.height = 0; + + /** + * @type {module:echarts/data/Tree~TreeNode} + * @readOnly + */ + this.parentNode = null; + + /** + * Reference to list item. + * Do not persistent dataIndex outside, + * besause it may be changed by list. + * If dataIndex -1, + * this node is logical deleted (filtered) in list. + * + * @type {Object} + * @readOnly + */ + this.dataIndex = dataIndex == null ? -1 : dataIndex; + + /** + * @type {Array.} + * @readOnly + */ + this.children = []; + + /** + * @type {Array.} + * @pubilc + */ + this.viewChildren = []; + + /** + * @type {moduel:echarts/data/Tree} + * @readOnly + */ + this.hostTree = hostTree; + }; + + TreeNode.prototype = { + + constructor: TreeNode, + + /** + * The node is removed. + * @return {boolean} is removed. + */ + isRemoved: function () { + return this.dataIndex < 0; + }, + + /** + * Travel this subtree (include this node). + * Usage: + * node.eachNode(function () { ... }); // preorder + * node.eachNode('preorder', function () { ... }); // preorder + * node.eachNode('postorder', function () { ... }); // postorder + * node.eachNode( + * {order: 'postorder', attr: 'viewChildren'}, + * function () { ... } + * ); // postorder + * + * @param {(Object|string)} options If string, means order. + * @param {string=} options.order 'preorder' or 'postorder' + * @param {string=} options.attr 'children' or 'viewChildren' + * @param {Function} cb If in preorder and return false, + * its subtree will not be visited. + * @param {Object} [context] + */ + eachNode: function (options, cb, context) { + if (typeof options === 'function') { + context = cb; + cb = options; + options = null; + } + + options = options || {}; + if (zrUtil.isString(options)) { + options = {order: options}; + } + + var order = options.order || 'preorder'; + var children = this[options.attr || 'children']; + + var suppressVisitSub; + order === 'preorder' && (suppressVisitSub = cb.call(context, this)); + + for (var i = 0; !suppressVisitSub && i < children.length; i++) { + children[i].eachNode(options, cb, context); + } + + order === 'postorder' && cb.call(context, this); + }, + + /** + * Update depth and height of this subtree. + * + * @param {number} depth + */ + updateDepthAndHeight: function (depth) { + var height = 0; + this.depth = depth; + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + child.updateDepthAndHeight(depth + 1); + if (child.height > height) { + height = child.height; + } + } + this.height = height + 1; + }, + + /** + * @param {string} id + * @return {module:echarts/data/Tree~TreeNode} + */ + getNodeById: function (id) { + if (this.getId() === id) { + return this; + } + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].getNodeById(id); + if (res) { + return res; + } + } + }, + + /** + * @param {module:echarts/data/Tree~TreeNode} node + * @return {boolean} + */ + contains: function (node) { + if (node === this) { + return true; + } + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].contains(node); + if (res) { + return res; + } + } + }, + + /** + * @param {boolean} includeSelf Default false. + * @return {Array.} order: [root, child, grandchild, ...] + */ + getAncestors: function (includeSelf) { + var ancestors = []; + var node = includeSelf ? this : this.parentNode; + while (node) { + ancestors.push(node); + node = node.parentNode; + } + ancestors.reverse(); + return ancestors; + }, + + /** + * @param {string|Array=} [dimension='value'] Default 'value'. can be 0, 1, 2, 3 + * @return {number} Value. + */ + getValue: function (dimension) { + var data = this.hostTree.data; + return data.get(data.getDimension(dimension || 'value'), this.dataIndex); + }, + + /** + * @param {Object} layout + * @param {boolean=} [merge=false] + */ + setLayout: function (layout, merge) { + this.dataIndex >= 0 + && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge); + }, + + /** + * @return {Object} layout + */ + getLayout: function () { + return this.hostTree.data.getItemLayout(this.dataIndex); + }, + + /** + * @param {string} path + * @return {module:echarts/model/Model} + */ + getModel: function (path) { + if (this.dataIndex < 0) { + return; + } + var hostTree = this.hostTree; + var itemModel = hostTree.data.getItemModel(this.dataIndex); + var levelModel = this.getLevelModel(); + + return itemModel.getModel(path, (levelModel || hostTree.hostModel).getModel(path)); + }, + + /** + * @return {module:echarts/model/Model} + */ + getLevelModel: function () { + return (this.hostTree.levelModels || [])[this.depth]; + }, + + /** + * @example + * setItemVisual('color', color); + * setItemVisual({ + * 'color': color + * }); + */ + setVisual: function (key, value) { + this.dataIndex >= 0 + && this.hostTree.data.setItemVisual(this.dataIndex, key, value); + }, + + /** + * @public + */ + getVisual: function (key, ignoreParent) { + return this.hostTree.data.getItemVisual(this.dataIndex, key, ignoreParent); + }, + + /** + * @public + * @return {number} + */ + getRawIndex: function () { + return this.hostTree.data.getRawIndex(this.dataIndex); + }, + + /** + * @public + * @return {string} + */ + getId: function () { + return this.hostTree.data.getId(this.dataIndex); + } + }; + + /** + * @constructor + * @alias module:echarts/data/Tree + * @param {module:echarts/model/Model} hostModel + * @param {Array.} levelOptions + */ + function Tree(hostModel, levelOptions) { + /** + * @type {module:echarts/data/Tree~TreeNode} + * @readOnly + */ + this.root; + + /** + * @type {module:echarts/data/List} + * @readOnly + */ + this.data; + + /** + * Index of each item is the same as the raw index of coresponding list item. + * @private + * @type {Array.} levelOptions + * @return module:echarts/data/Tree + */ + Tree.createTree = function (dataRoot, hostModel, levelOptions) { + + var tree = new Tree(hostModel, levelOptions); + var listData = []; + + buildHierarchy(dataRoot); + + function buildHierarchy(dataNode, parentNode) { + listData.push(dataNode); + + var node = new TreeNode(dataNode.name, listData.length - 1, tree); + parentNode + ? addChild(node, parentNode) + : (tree.root = node); + + var children = dataNode.children; + if (children) { + for (var i = 0; i < children.length; i++) { + buildHierarchy(children[i], node); + } + } + } + + tree.root.updateDepthAndHeight(0); + + var dimensions = completeDimensions([{name: 'value'}], listData); + var list = new List(dimensions, hostModel); + list.initData(listData); + + linkListHelper.linkToTree(list, tree); + + return tree; + }; + + /** + * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote, + * so this function is not ready and not necessary to be public. + * + * @param {(module:echarts/data/Tree~TreeNode|Object)} child + */ + function addChild(child, node) { + var children = node.children; + if (child.parentNode === node) { + return; + } + + children.push(child); + child.parentNode = node; + + node.hostTree._nodes.push(child); + } + + module.exports = Tree; + + +/***/ }, +/* 180 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Link list to graph or tree + */ + + + var zrUtil = __webpack_require__(3); + var arraySlice = Array.prototype.slice; + + // Caution: + // In most case, only one of the list and its shallow clones (see list.cloneShallow) + // can be active in echarts process. Considering heap memory consumption, + // we do not clone tree or graph, but share them among list and its shallow clones. + // But in some rare case, we have to keep old list (like do animation in chart). So + // please take care that both the old list and the new list share the same tree/graph. + + function linkList(list, target, targetType) { + zrUtil.each(listProxyMethods, function (method, methodName) { + var originMethod = list[methodName]; + list[methodName] = zrUtil.curry(method, originMethod, target, targetType); + }); + + list[targetType] = target; + target.data = list; + + return list; + } + + var listProxyMethods = { + cloneShallow: function (originMethod, target, targetType) { + var newList = originMethod.apply(this, arraySlice.call(arguments, 3)); + return linkList(newList, target, targetType); + }, + map: function (originMethod, target, targetType) { + var newList = originMethod.apply(this, arraySlice.call(arguments, 3)); + return linkList(newList, target, targetType); + }, + filterSelf: function (originMethod, target, targetType) { + var result = originMethod.apply(this, arraySlice.call(arguments, 3)); + target.update(); + return result; + } + }; + + module.exports = { + linkToGraph: function (list, graph) { + linkList(list, graph, 'graph'); + }, + + linkToTree: function (list, tree) { + linkList(list, tree, 'tree'); + } + }; + + +/***/ }, +/* 181 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var helper = { + + retrieveTargetInfo: function (payload, seriesModel) { + if (payload + && ( + payload.type === 'treemapZoomToNode' + || payload.type === 'treemapRootToNode' + ) + ) { + var root = seriesModel.getData().tree.root; + var targetNode = payload.targetNode; + if (targetNode && root.contains(targetNode)) { + return {node: targetNode}; + } + + var targetNodeId = payload.targetNodeId; + if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) { + return {node: targetNode}; + } + } + }, + + getPathToRoot: function (node) { + var path = []; + while (node) { + path.push(node); + node = node.parentNode; + } + return path.reverse(); + }, + + aboveViewRoot: function (viewRoot, node) { + var viewPath = helper.getPathToRoot(viewRoot); + return helper.aboveViewRootByViewPath(viewPath, node); + }, + + // viewPath should obtained from getPathToRoot(viewRoot) + aboveViewRootByViewPath: function (viewPath, node) { + var index = zrUtil.indexOf(viewPath, node); + // The last one is viewRoot + return index >= 0 && index !== viewPath.length - 1; + } + + }; + + module.exports = helper; + + +/***/ }, +/* 182 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var DataDiffer = __webpack_require__(95); + var helper = __webpack_require__(181); + var Breadcrumb = __webpack_require__(183); + var RoamController = __webpack_require__(159); + var BoundingRect = __webpack_require__(15); + var matrix = __webpack_require__(17); + var animationUtil = __webpack_require__(184); + var bind = zrUtil.bind; + var Group = graphic.Group; + var Rect = graphic.Rect; + var each = zrUtil.each; + + var DRAG_THRESHOLD = 3; + + module.exports = __webpack_require__(1).extendChartView({ + + type: 'treemap', + + /** + * @override + */ + init: function (o, api) { + + /** + * @private + * @type {module:zrender/container/Group} + */ + this._containerGroup; + + /** + * @private + * @type {Object.>} + */ + this._storage = createStorage(); + + /** + * @private + * @type {module:echarts/data/Tree} + */ + this._oldTree; + + /** + * @private + * @type {module:echarts/chart/treemap/Breadcrumb} + */ + this._breadcrumb; + + /** + * @private + * @type {module:echarts/component/helper/RoamController} + */ + this._controller; + + /** + * 'ready', 'animating' + * @private + */ + this._state = 'ready'; + + /** + * @private + * @type {boolean} + */ + this._mayClick; + }, + + /** + * @override + */ + render: function (seriesModel, ecModel, api, payload) { + + var models = ecModel.findComponents({ + mainType: 'series', subType: 'treemap', query: payload + }); + if (zrUtil.indexOf(models, seriesModel) < 0) { + return; + } + + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + + var targetInfo = helper.retrieveTargetInfo(payload, seriesModel); + var payloadType = payload && payload.type; + var layoutInfo = seriesModel.layoutInfo; + var isInit = !this._oldTree; + var thisStorage = this._storage; + + // Mark new root when action is treemapRootToNode. + var reRoot = (payloadType === 'treemapRootToNode' && targetInfo && thisStorage) + ? { + rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()], + direction: payload.direction + } + : null; + + var containerGroup = this._giveContainerGroup(layoutInfo); + + var renderResult = this._doRender(containerGroup, seriesModel, reRoot); + + ( + !isInit && ( + !payloadType + || payloadType === 'treemapZoomToNode' + || payloadType === 'treemapRootToNode' + ) + ) + ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) + : renderResult.renderFinally(); + + this._resetController(api); + + this._renderBreadcrumb(seriesModel, api, targetInfo); + }, + + /** + * @private + */ + _giveContainerGroup: function (layoutInfo) { + var containerGroup = this._containerGroup; + if (!containerGroup) { + // FIXME + // 加一层containerGroup是为了clip,但是现在clip功能并没有实现。 + containerGroup = this._containerGroup = new Group(); + this._initEvents(containerGroup); + this.group.add(containerGroup); + } + containerGroup.position = [layoutInfo.x, layoutInfo.y]; + + return containerGroup; + }, + + /** + * @private + */ + _doRender: function (containerGroup, seriesModel, reRoot) { + var thisTree = seriesModel.getData().tree; + var oldTree = this._oldTree; + + // Clear last shape records. + var lastsForAnimation = createStorage(); + var thisStorage = createStorage(); + var oldStorage = this._storage; + var willInvisibleEls = []; + var willVisibleEls = []; + var willDeleteEls = []; + var renderNode = bind( + this._renderNode, this, + thisStorage, oldStorage, reRoot, + lastsForAnimation, willInvisibleEls, willVisibleEls + ); + var viewRoot = seriesModel.getViewRoot(); + var viewPath = helper.getPathToRoot(viewRoot); + + // Notice: when thisTree and oldTree are the same tree (see list.cloneShadow), + // the oldTree is actually losted, so we can not find all of the old graphic + // elements from tree. So we use this stragegy: make element storage, move + // from old storage to new storage, clear old storage. + + dualTravel( + thisTree.root ? [thisTree.root] : [], + (oldTree && oldTree.root) ? [oldTree.root] : [], + containerGroup, + thisTree === oldTree || !oldTree, + 0 + ); + + // Process all removing. + var willDeleteEls = clearStorage(oldStorage); + + this._oldTree = thisTree; + this._storage = thisStorage; + + return { + lastsForAnimation: lastsForAnimation, + willDeleteEls: willDeleteEls, + renderFinally: renderFinally + }; + + function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, viewPathIndex) { + // When 'render' is triggered by action, + // 'this' and 'old' may be the same tree, + // we use rawIndex in that case. + if (sameTree) { + oldViewChildren = thisViewChildren; + each(thisViewChildren, function (child, index) { + !child.isRemoved() && processNode(index, index); + }); + } + // Diff hierarchically (diff only in each subtree, but not whole). + // because, consistency of view is important. + else { + (new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey)) + .add(processNode) + .update(processNode) + .remove(zrUtil.curry(processNode, null)) + .execute(); + } + + function getKey(node) { + // Identify by name or raw index. + return node.getId(); + } + + function processNode(newIndex, oldIndex) { + var thisNode = newIndex != null ? thisViewChildren[newIndex] : null; + var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null; + + // Whether under viewRoot. + if (!thisNode + || isNaN(viewPathIndex) + || (viewPathIndex < viewPath.length && viewPath[viewPathIndex] !== thisNode) + ) { + // Deleting nodes will be performed finally. This method just find + // element from old storage, or create new element, set them to new + // storage, and set styles. + return; + } + + var group = renderNode(thisNode, oldNode, parentGroup); + + group && dualTravel( + thisNode && thisNode.viewChildren || [], + oldNode && oldNode.viewChildren || [], + group, + sameTree, + viewPathIndex + 1 + ); + } + } + + function clearStorage(storage) { + var willDeleteEls = createStorage(); + storage && each(storage, function (store, storageName) { + var delEls = willDeleteEls[storageName]; + each(store, function (el) { + el && (delEls.push(el), el.__tmWillDelete = storageName); + }); + }); + return willDeleteEls; + } + + function renderFinally() { + each(willDeleteEls, function (els) { + each(els, function (el) { + el.parent && el.parent.remove(el); + }); + }); + // Theoritically there is no intersection between willInvisibleEls + // and willVisibleEls have, but we set visible after for robustness. + each(willInvisibleEls, function (el) { + el.invisible = true; + // Setting invisible is for optimizing, so no need to set dirty, + // just mark as invisible. + el.dirty(); + }); + each(willVisibleEls, function (el) { + el.invisible = false; + el.__tmWillVisible = false; + el.dirty(); + }); + } + }, + + /** + * @private + */ + _renderNode: function ( + thisStorage, oldStorage, reRoot, + lastsForAnimation, willInvisibleEls, willVisibleEls, + thisNode, oldNode, parentGroup + ) { + var thisRawIndex = thisNode && thisNode.getRawIndex(); + var oldRawIndex = oldNode && oldNode.getRawIndex(); + + var layout = thisNode.getLayout(); + var thisWidth = layout.width; + var thisHeight = layout.height; + var invisible = layout.invisible; + + // Node group + var group = giveGraphic('nodeGroup', Group); + if (!group) { + return; + } + parentGroup.add(group); + group.position = [layout.x, layout.y]; + group.__tmNodeWidth = thisWidth; + group.__tmNodeHeight = thisHeight; + + // Background + var bg = giveGraphic('background', Rect, 0); + if (bg) { + bg.setShape({x: 0, y: 0, width: thisWidth, height: thisHeight}); + updateStyle(bg, {fill: thisNode.getVisual('borderColor', true)}); + group.add(bg); + } + + var thisViewChildren = thisNode.viewChildren; + + // No children, render content. + if (!thisViewChildren || !thisViewChildren.length) { + var borderWidth = layout.borderWidth; + var content = giveGraphic('content', Rect, 3); + if (content) { + var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0); + var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0); + var labelModel = thisNode.getModel('label.normal'); + var textStyleModel = thisNode.getModel('label.normal.textStyle'); + var hoverStyle = thisNode.getModel('itemStyle.emphasis').getItemStyle(); + var text = thisNode.getModel().get('name'); + var textRect = textStyleModel.getTextRect(text); + var showLabel = labelModel.get('show'); + + if (!showLabel || textRect.height > contentHeight) { + text = ''; + } + else if (textRect.width > contentWidth) { + text = textStyleModel.get('ellipsis') + ? textStyleModel.ellipsis(text, contentWidth) : ''; + } + + graphic.setHoverStyle(content, hoverStyle); + + // For tooltip. + content.dataIndex = thisNode.dataIndex; + content.seriesIndex = this.seriesModel.seriesIndex; + + content.culling = true; + content.setShape({ + x: borderWidth, + y: borderWidth, + width: contentWidth, + height: contentHeight + }); + + updateStyle(content, { + fill: thisNode.getVisual('color', true), + text: text, + textPosition: labelModel.get('position'), + textFill: textStyleModel.getTextColor(), + textAlign: textStyleModel.get('align'), + textVerticalAlign: textStyleModel.get('baseline'), + textFont: textStyleModel.getFont() + }); + group.add(content); + } + } + + return group; + + function giveGraphic(storageName, Ctor, z) { + var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex]; + var lasts = lastsForAnimation[storageName]; + + if (element) { + // Remove from oldStorage + oldStorage[storageName][oldRawIndex] = null; + prepareAnimationWhenHasOld(lasts, element, storageName); + } + // If invisible and no old element, do not create new element (for optimizing). + else if (!invisible) { + element = new Ctor({z: z}); + prepareAnimationWhenNoOld(lasts, element, storageName); + } + + // Set to thisStorage + return (thisStorage[storageName][thisRawIndex] = element); + } + + function prepareAnimationWhenHasOld(lasts, element, storageName) { + var lastCfg = lasts[thisRawIndex] = {}; + lastCfg.old = storageName === 'nodeGroup' + ? element.position.slice() + : zrUtil.extend({}, element.shape); + } + + // If a element is new, we need to find the animation start point carefully, + // otherwise it will looks strange when 'zoomToNode'. + function prepareAnimationWhenNoOld(lasts, element, storageName) { + // New background do not animate but delay show. + if (storageName === 'background') { + element.invisible = true; + element.__tmWillVisible = true; + willVisibleEls.push(element); + } + else { + var lastCfg = lasts[thisRawIndex] = {}; + var parentNode = thisNode.parentNode; + + if (parentNode && (!reRoot || reRoot.direction === 'drilldown')) { + var parentOldX = 0; + var parentOldY = 0; + // For convenience, get old bounding rect from background. + var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()]; + + if (parentOldBg && parentOldBg.old) { + parentOldX = parentOldBg.old.width / 2; // Devided by 2 for reRoot effect. + parentOldY = parentOldBg.old.height / 2; + } + // When no parent old shape found, its parent is new too, + // so we can just use {x:0, y:0}. + lastCfg.old = storageName === 'nodeGroup' + ? [parentOldX, parentOldY] + : {x: parentOldX, y: parentOldY, width: 0, height: 0}; + } + + // Fade in, user can be aware that these nodes are new. + lastCfg.fadein = storageName !== 'nodeGroup'; + } + } + + function updateStyle(element, style) { + if (!invisible) { + // If invisible, do not set visual, otherwise the element will + // change immediately before animation. We think it is OK to + // remain its origin color when moving out of the view window. + element.setStyle(style); + if (!element.__tmWillVisible) { + element.invisible = false; + } + } + else { + // Delay invisible setting utill animation finished, + // avoid element vanish suddenly before animation. + !element.invisible && willInvisibleEls.push(element); + } + } + }, + + /** + * @private + */ + _doAnimation: function (containerGroup, renderResult, seriesModel, reRoot) { + if (!seriesModel.get('animation')) { + return; + } + + var duration = seriesModel.get('animationDurationUpdate'); + var easing = seriesModel.get('animationEasing'); + var animationWrap = animationUtil.createWrap(); + + // Make delete animations. + each(renderResult.willDeleteEls, function (store, storageName) { + each(store, function (el, rawIndex) { + var storageName; + + if (el.invisible || !(storageName = el.__tmWillDelete)) { + return; + } + + var parent = el.parent; // Always has parent, and parent is nodeGroup. + var target; + + if (reRoot && reRoot.direction === 'drilldown') { + if (parent === reRoot.rootNodeGroup) { + // Only 'content' will enter this branch, but not nodeGroup. + target = { + shape: { + x: 0, y: 0, + width: parent.__tmNodeWidth, height: parent.__tmNodeHeight + } + }; + el.z = 2; + } + else { + target = {style: {opacity: 0}}; + el.z = 1; + } + } + else { + var targetX = 0; + var targetY = 0; + + if (!parent.__tmWillDelete) { + // Let node animate to right-bottom corner, cooperating with fadeout, + // which is appropriate for user understanding. + // Divided by 2 for reRoot rollup effect. + targetX = parent.__tmNodeWidth / 2; + targetY = parent.__tmNodeHeight / 2; + } + target = storageName === 'nodeGroup' + ? {position: [targetX, targetY], style: {opacity: 0}} + : { + shape: {x: targetX, y: targetY, width: 0, height: 0}, + style: {opacity: 0} + }; + } + + target && animationWrap.add(el, target, duration, easing); + }); + }); + + // Make other animations + each(this._storage, function (store, storageName) { + each(store, function (el, rawIndex) { + var last = renderResult.lastsForAnimation[storageName][rawIndex]; + var target = {}; + + if (!last) { + return; + } + + if (storageName === 'nodeGroup') { + if (last.old) { + target.position = el.position.slice(); + el.position = last.old; + } + } + else { + if (last.old) { + target.shape = zrUtil.extend({}, el.shape); + el.setShape(last.old); + } + + if (last.fadein) { + el.setStyle('opacity', 0); + target.style = {opacity: 1}; + } + // When animation is stopped for succedent animation starting, + // el.style.opacity might not be 1 + else if (el.style.opacity !== 1) { + target.style = {opacity: 1}; + } + } + animationWrap.add(el, target, duration, easing); + }); + }, this); + + this._state = 'animating'; + + animationWrap + .done(bind(function () { + this._state = 'ready'; + renderResult.renderFinally(); + }, this)) + .start(); + }, + + /** + * @private + */ + _resetController: function (api) { + var controller = this._controller; + + // Init controller. + if (!controller) { + controller = this._controller = new RoamController(api.getZr()); + controller.enable(this.seriesModel.get('roam')); + controller.on('pan', bind(this._onPan, this)); + controller.on('zoom', bind(this._onZoom, this)); + } + + controller.rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight()); + }, + + /** + * @private + */ + _clearController: function () { + var controller = this._controller; + if (controller) { + controller.off('pan').off('zoom'); + controller = null; + } + }, + + /** + * @private + */ + _onPan: function (dx, dy) { + this._mayClick = false; + + if (this._state !== 'animating' + && (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD) + ) { + // These param must not be cached. + var viewRoot = this.seriesModel.getViewRoot(); + + if (!viewRoot) { + return; + } + + var rootLayout = viewRoot.getLayout(); + + if (!rootLayout) { + return; + } + + this.api.dispatchAction({ + type: 'treemapMove', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rootLayout.x + dx, y: rootLayout.y + dy, + width: rootLayout.width, height: rootLayout.height + } + }); + } + }, + + /** + * @private + */ + _onZoom: function (scale, mouseX, mouseY) { + this._mayClick = false; + + if (this._state !== 'animating') { + // These param must not be cached. + var viewRoot = this.seriesModel.getViewRoot(); + + if (!viewRoot) { + return; + } + + var rootLayout = viewRoot.getLayout(); + + if (!rootLayout) { + return; + } + + var rect = new BoundingRect( + rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height + ); + var layoutInfo = this.seriesModel.layoutInfo; + + // Transform mouse coord from global to containerGroup. + mouseX -= layoutInfo.x; + mouseY -= layoutInfo.y; + + // Scale root bounding rect. + var m = matrix.create(); + matrix.translate(m, m, [-mouseX, -mouseY]); + matrix.scale(m, m, [scale, scale]); + matrix.translate(m, m, [mouseX, mouseY]); + + rect.applyTransform(m); + + this.api.dispatchAction({ + type: 'treemapRender', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rect.x, y: rect.y, + width: rect.width, height: rect.height + } + }); + } + }, + + /** + * @private + */ + _initEvents: function (containerGroup) { + // FIXME + // 不用click以及silent的原因是,animate时视图设置silent true来避免click生效, + // 但是animate中,按下鼠标,animate结束后(silent设回为false)松开鼠标, + // 还是会触发click,期望是不触发。 + + // Mousedown occurs when drag start, and mouseup occurs when drag end, + // click event should not be triggered in that case. + + containerGroup.on('mousedown', function (e) { + this._state === 'ready' && (this._mayClick = true); + }, this); + containerGroup.on('mouseup', function (e) { + if (this._mayClick) { + this._mayClick = false; + this._state === 'ready' && onClick.call(this, e); + } + }, this); + + function onClick(e) { + var nodeClick = this.seriesModel.get('nodeClick', true); + + if (!nodeClick) { + return; + } + + var targetInfo = this.findTarget(e.offsetX, e.offsetY); + + if (!targetInfo) { + return; + } + + var node = targetInfo.node; + if (node.getLayout().isLeafRoot) { + this._rootToNode(targetInfo); + } + else { + if (nodeClick === 'zoomToNode') { + this._zoomToNode(targetInfo); + } + else if (nodeClick === 'link') { + var itemModel = node.hostTree.data.getItemModel(node.dataIndex); + var link = itemModel.get('link', true); + var linkTarget = itemModel.get('target', true) || 'blank'; + link && window.open(link, linkTarget); + } + } + } + }, + + /** + * @private + */ + _renderBreadcrumb: function (seriesModel, api, targetInfo) { + if (!targetInfo) { + // Find breadcrumb tail on center of containerGroup. + targetInfo = this.findTarget(api.getWidth() / 2, api.getHeight() / 2); + + if (!targetInfo) { + targetInfo = {node: seriesModel.getData().tree.root}; + } + } + + (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group, bind(onSelect, this)))) + .render(seriesModel, api, targetInfo.node); + + function onSelect(node) { + if (this._state !== 'animating') { + helper.aboveViewRoot(seriesModel.getViewRoot(), node) + ? this._rootToNode({node: node}) + : this._zoomToNode({node: node}); + } + } + }, + + /** + * @override + */ + remove: function () { + this._clearController(); + this._containerGroup && this._containerGroup.removeAll(); + this._storage = createStorage(); + this._state = 'ready'; + this._breadcrumb && this._breadcrumb.remove(); + }, + + dispose: function () { + this._clearController(); + }, + + /** + * @private + */ + _zoomToNode: function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapZoomToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }, + + /** + * @private + */ + _rootToNode: function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapRootToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }, + + /** + * @public + * @param {number} x Global coord x. + * @param {number} y Global coord y. + * @return {Object} info If not found, return undefined; + * @return {number} info.node Target node. + * @return {number} info.offsetX x refer to target node. + * @return {number} info.offsetY y refer to target node. + */ + findTarget: function (x, y) { + var targetInfo; + var viewRoot = this.seriesModel.getViewRoot(); + + viewRoot.eachNode({attr: 'viewChildren', order: 'preorder'}, function (node) { + var bgEl = this._storage.background[node.getRawIndex()]; + // If invisible, there might be no element. + if (bgEl) { + var point = bgEl.transformCoordToLocal(x, y); + var shape = bgEl.shape; + + // For performance consideration, dont use 'getBoundingRect'. + if (shape.x <= point[0] + && point[0] <= shape.x + shape.width + && shape.y <= point[1] + && point[1] <= shape.y + shape.height + ) { + targetInfo = {node: node, offsetX: point[0], offsetY: point[1]}; + } + else { + return false; // Suppress visit subtree. + } + } + }, this); + + return targetInfo; + } + + }); + + function createStorage() { + return {nodeGroup: [], background: [], content: []}; + } + + + +/***/ }, +/* 183 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var layout = __webpack_require__(21); + var zrUtil = __webpack_require__(3); + + var TEXT_PADDING = 8; + var ITEM_GAP = 8; + var ARRAY_LENGTH = 5; + + function Breadcrumb(containerGroup, onSelect) { + /** + * @private + * @type {module:zrender/container/Group} + */ + this.group = new graphic.Group(); + + containerGroup.add(this.group); + + /** + * @private + * @type {Function} + */ + this._onSelect = onSelect || zrUtil.noop; + } + + Breadcrumb.prototype = { + + constructor: Breadcrumb, + + render: function (seriesModel, api, targetNode) { + var model = seriesModel.getModel('breadcrumb'); + var thisGroup = this.group; + + thisGroup.removeAll(); + + if (!model.get('show') || !targetNode) { + return; + } + + var normalStyleModel = model.getModel('itemStyle.normal'); + // var emphasisStyleModel = model.getModel('itemStyle.emphasis'); + var textStyleModel = normalStyleModel.getModel('textStyle'); + + var layoutParam = { + pos: { + left: model.get('left'), + right: model.get('right'), + top: model.get('top'), + bottom: model.get('bottom') + }, + box: { + width: api.getWidth(), + height: api.getHeight() + }, + emptyItemWidth: model.get('emptyItemWidth'), + totalWidth: 0, + renderList: [] + }; + + this._prepare( + model, targetNode, layoutParam, textStyleModel + ); + this._renderContent( + model, targetNode, layoutParam, normalStyleModel, textStyleModel + ); + + layout.positionGroup(thisGroup, layoutParam.pos, layoutParam.box); + }, + + /** + * Prepare render list and total width + * @private + */ + _prepare: function (model, targetNode, layoutParam, textStyleModel) { + for (var node = targetNode; node; node = node.parentNode) { + var text = node.getModel().get('name'); + var textRect = textStyleModel.getTextRect(text); + var itemWidth = Math.max( + textRect.width + TEXT_PADDING * 2, + layoutParam.emptyItemWidth + ); + layoutParam.totalWidth += itemWidth + ITEM_GAP; + layoutParam.renderList.push({node: node, text: text, width: itemWidth}); + } + }, + + /** + * @private + */ + _renderContent: function ( + model, targetNode, layoutParam, normalStyleModel, textStyleModel + ) { + // Start rendering. + var lastX = 0; + var emptyItemWidth = layoutParam.emptyItemWidth; + var height = model.get('height'); + var availableSize = layout.getAvailableSize(layoutParam.pos, layoutParam.box); + var totalWidth = layoutParam.totalWidth; + var renderList = layoutParam.renderList; + + for (var i = renderList.length - 1; i >= 0; i--) { + var item = renderList[i]; + var itemWidth = item.width; + var text = item.text; + + // Hdie text and shorten width if necessary. + if (totalWidth > availableSize.width) { + totalWidth -= itemWidth - emptyItemWidth; + itemWidth = emptyItemWidth; + text = ''; + } + + this.group.add(new graphic.Polygon({ + shape: { + points: makeItemPoints( + lastX, 0, itemWidth, height, + i === renderList.length - 1, i === 0 + ) + }, + style: zrUtil.defaults( + normalStyleModel.getItemStyle(), + { + lineJoin: 'bevel', + text: text, + textFill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont() + } + ), + z: 10, + onclick: zrUtil.bind(this._onSelect, this, item.node) + })); + + lastX += itemWidth + ITEM_GAP; + } + }, + + /** + * @override + */ + remove: function () { + this.group.removeAll(); + } + }; + + function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) { + var points = [ + [head ? x : x - ARRAY_LENGTH, y], + [x + itemWidth, y], + [x + itemWidth, y + itemHeight], + [head ? x : x - ARRAY_LENGTH, y + itemHeight] + ]; + !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]); + !head && points.push([x, y + itemHeight / 2]); + return points; + } + + module.exports = Breadcrumb; + + +/***/ }, +/* 184 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + /** + * @param {number} [time=500] Time in ms + * @param {string} [easing='linear'] + * @param {number} [delay=0] + * @param {Function} [callback] + * + * @example + * // Animate position + * animation + * .createWrap() + * .add(el1, {position: [10, 10]}) + * .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400) + * .done(function () { // done }) + * .start('cubicOut'); + */ + function createWrap() { + + var storage = []; + var elExistsMap = {}; + var doneCallback; + + return { + + /** + * Caution: a el can only be added once, otherwise 'done' + * might not be called. This method checks this (by el.id), + * suppresses adding and returns false when existing el found. + * + * @param {modele:zrender/Element} el + * @param {Object} target + * @param {number} [time=500] + * @param {number} [delay=0] + * @param {string} [easing='linear'] + * @return {boolean} Whether adding succeeded. + * + * @example + * add(el, target, time, delay, easing); + * add(el, target, time, easing); + * add(el, target, time); + * add(el, target); + */ + add: function (el, target, time, delay, easing) { + if (zrUtil.isString(delay)) { + easing = delay; + delay = 0; + } + + if (elExistsMap[el.id]) { + return false; + } + elExistsMap[el.id] = 1; + + storage.push( + {el: el, target: target, time: time, delay: delay, easing: easing} + ); + + return true; + }, + + /** + * Only execute when animation finished. Will not execute when any + * of 'stop' or 'stopAnimation' called. + * + * @param {Function} callback + */ + done: function (callback) { + doneCallback = callback; + return this; + }, + + /** + * Will stop exist animation firstly. + */ + start: function () { + var count = storage.length; + + for (var i = 0, len = storage.length; i < len; i++) { + var item = storage[i]; + item.el.animateTo(item.target, item.time, item.delay, item.easing, done); + } + + return this; + + function done() { + count--; + if (!count) { + storage.length = 0; + elExistsMap = {}; + doneCallback && doneCallback(); + } + } + } + }; + } + + module.exports = {createWrap: createWrap}; + + +/***/ }, +/* 185 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Treemap action + */ + + + var echarts = __webpack_require__(1); + var helper = __webpack_require__(181); + + var noop = function () {}; + + var actionTypes = [ + 'treemapZoomToNode', + 'treemapRender', + 'treemapMove' + ]; + + for (var i = 0; i < actionTypes.length; i++) { + echarts.registerAction({type: actionTypes[i], update: 'updateView'}, noop); + } + + echarts.registerAction( + {type: 'treemapRootToNode', update: 'updateView'}, + function (payload, ecModel) { + ecModel.eachComponent( + {mainType: 'series', subType: 'treemap', query: payload}, + function (model, index) { + var targetInfo = helper.retrieveTargetInfo(payload, model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + if (originViewRoot) { + payload.direction = helper.aboveViewRoot(originViewRoot, targetInfo.node) + ? 'rollup' : 'drilldown'; + } + model.resetViewRoot(targetInfo.node); + } + } + ); + } + ); + + + +/***/ }, +/* 186 */ +/***/ function(module, exports, __webpack_require__) { + + + + var VisualMapping = __webpack_require__(187); + var zrColor = __webpack_require__(38); + var zrUtil = __webpack_require__(3); + var isArray = zrUtil.isArray; + + var ITEM_STYLE_NORMAL = 'itemStyle.normal'; + + module.exports = function (ecModel, payload) { + + var condition = {mainType: 'series', subType: 'treemap', query: payload}; + ecModel.eachComponent(condition, function (seriesModel) { + + var tree = seriesModel.getData().tree; + var root = tree.root; + var seriesItemStyleModel = seriesModel.getModel(ITEM_STYLE_NORMAL); + + if (root.isRemoved()) { + return; + } + + var levelItemStyles = zrUtil.map(tree.levelModels, function (levelModel) { + return levelModel ? levelModel.get(ITEM_STYLE_NORMAL) : null; + }); + + travelTree( + root, + {}, + levelItemStyles, + seriesItemStyleModel, + seriesModel.getViewRoot().getAncestors(), + seriesModel + ); + }); + }; + + function travelTree( + node, designatedVisual, levelItemStyles, seriesItemStyleModel, + viewRootAncestors, seriesModel + ) { + var nodeModel = node.getModel(); + var nodeLayout = node.getLayout(); + + // Optimize + if (nodeLayout.invisible) { + return; + } + + var nodeItemStyleModel = node.getModel(ITEM_STYLE_NORMAL); + var levelItemStyle = levelItemStyles[node.depth]; + var visuals = buildVisuals( + nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel + ); + + // calculate border color + var borderColor = nodeItemStyleModel.get('borderColor'); + var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation'); + var thisNodeColor; + if (borderColorSaturation != null) { + // For performance, do not always execute 'calculateColor'. + thisNodeColor = calculateColor(visuals, node); + borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor); + } + node.setVisual('borderColor', borderColor); + + var viewChildren = node.viewChildren; + if (!viewChildren || !viewChildren.length) { + thisNodeColor = calculateColor(visuals, node); + // Apply visual to this node. + node.setVisual('color', thisNodeColor); + } + else { + var mapping = buildVisualMapping( + node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren + ); + // Designate visual to children. + zrUtil.each(viewChildren, function (child, index) { + // If higher than viewRoot, only ancestors of viewRoot is needed to visit. + if (child.depth >= viewRootAncestors.length + || child === viewRootAncestors[child.depth] + ) { + var childVisual = mapVisual( + nodeModel, visuals, child, index, mapping, seriesModel + ); + travelTree( + child, childVisual, levelItemStyles, seriesItemStyleModel, + viewRootAncestors, seriesModel + ); + } + }); + } + } + + function buildVisuals( + nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel + ) { + var visuals = zrUtil.extend({}, designatedVisual); + + zrUtil.each(['color', 'colorAlpha', 'colorSaturation'], function (visualName) { + // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel + var val = nodeItemStyleModel.get(visualName, true); // Ignore parent + val == null && levelItemStyle && (val = levelItemStyle[visualName]); + val == null && (val = designatedVisual[visualName]); + val == null && (val = seriesItemStyleModel.get(visualName)); + + val != null && (visuals[visualName] = val); + }); + + return visuals; + } + + function calculateColor(visuals) { + var color = getValueVisualDefine(visuals, 'color'); + + if (color) { + var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha'); + var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation'); + if (colorSaturation) { + color = zrColor.modifyHSL(color, null, null, colorSaturation); + } + if (colorAlpha) { + color = zrColor.modifyAlpha(color, colorAlpha); + } + + return color; + } + } + + function calculateBorderColor(borderColorSaturation, thisNodeColor) { + return thisNodeColor != null + ? zrColor.modifyHSL(thisNodeColor, null, null, borderColorSaturation) + : null; + } + + function getValueVisualDefine(visuals, name) { + var value = visuals[name]; + if (value != null && value !== 'none') { + return value; + } + } + + function buildVisualMapping( + node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren + ) { + if (!viewChildren || !viewChildren.length) { + return; + } + + var rangeVisual = getRangeVisual(nodeModel, 'color') + || ( + visuals.color != null + && visuals.color !== 'none' + && ( + getRangeVisual(nodeModel, 'colorAlpha') + || getRangeVisual(nodeModel, 'colorSaturation') + ) + ); + + if (!rangeVisual) { + return; + } + + var colorMappingBy = nodeModel.get('colorMappingBy'); + var opt = { + type: rangeVisual.name, + dataExtent: nodeLayout.dataExtent, + visual: rangeVisual.range + }; + if (opt.type === 'color' + && (colorMappingBy === 'index' || colorMappingBy === 'id') + ) { + opt.mappingMethod = 'category'; + opt.loop = true; + // categories is ordinal, so do not set opt.categories. + } + else { + opt.mappingMethod = 'linear'; + } + + var mapping = new VisualMapping(opt); + mapping.__drColorMappingBy = colorMappingBy; + + return mapping; + } + + // Notice: If we dont have the attribute 'colorRange', but only use + // attribute 'color' to represent both concepts of 'colorRange' and 'color', + // (It means 'colorRange' when 'color' is Array, means 'color' when not array), + // this problem will be encountered: + // If a level-1 node dont have children, and its siblings has children, + // and colorRange is set on level-1, then the node can not be colored. + // So we separate 'colorRange' and 'color' to different attributes. + function getRangeVisual(nodeModel, name) { + // 'colorRange', 'colorARange', 'colorSRange'. + // If not exsits on this node, fetch from levels and series. + var range = nodeModel.get(name); + return (isArray(range) && range.length) ? {name: name, range: range} : null; + } + + function mapVisual(nodeModel, visuals, child, index, mapping, seriesModel) { + var childVisuals = zrUtil.extend({}, visuals); + + if (mapping) { + var mappingType = mapping.type; + var colorMappingBy = mappingType === 'color' && mapping.__drColorMappingBy; + var value = + colorMappingBy === 'index' + ? index + : colorMappingBy === 'id' + ? seriesModel.mapIdToIndex(child.getId()) + : child.getValue(nodeModel.get('visualDimension')); + + childVisuals[mappingType] = mapping.mapValueToVisual(value); + } + + return childVisuals; + } + + + +/***/ }, +/* 187 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Visual mapping. + */ + + + var zrUtil = __webpack_require__(3); + var zrColor = __webpack_require__(38); + var linearMap = __webpack_require__(7).linearMap; + var each = zrUtil.each; + var isObject = zrUtil.isObject; + + var CATEGORY_DEFAULT_VISUAL_INDEX = -1; + + function linearMapArray(val, domain, range, clamp) { + if (zrUtil.isArray(val)) { + return zrUtil.map(val, function (v) { + return linearMap(v, domain, range, clamp); + }); + } + return linearMap(val, domain, range, clamp); + } + /** + * @param {Object} option + * @param {string} [option.type] See visualHandlers. + * @param {string} [option.mappingMethod] 'linear' or 'piecewise' or 'category' + * @param {Array.=} [option.dataExtent] [minExtent, maxExtent], + * required when mappingMethod is 'linear' + * @param {Array.=} [option.pieceList] [ + * {value: someValue}, + * {interval: [min1, max1], visual: {...}}, + * {interval: [min2, max2]} + * ], + * required when mappingMethod is 'piecewise'. + * Visual for only each piece can be specified. + * @param {Array.=} [option.categories] ['cate1', 'cate2'] + * required when mappingMethod is 'category'. + * If no option.categories, it represents + * categories is [0, 1, 2, ...]. + * @param {boolean} [option.loop=false] Whether loop mapping when mappingMethod is 'category'. + * @param {(Array|Object|*)} [option.visual] Visual data. + * when mappingMethod is 'category', + * visual data can be array or object + * (like: {cate1: '#222', none: '#fff'}) + * or primary types (which represents + * defualt category visual), otherwise visual + * can only be array. + * + */ + var VisualMapping = function (option) { + var mappingMethod = option.mappingMethod; + var visualType = option.type; + + /** + * @readOnly + * @type {string} + */ + this.type = visualType; + + /** + * @readOnly + * @type {string} + */ + this.mappingMethod = mappingMethod; + + /** + * @readOnly + * @type {Object} + */ + var thisOption = this.option = zrUtil.clone(option); + + /** + * @private + * @type {Function} + */ + this._normalizeData = normalizers[mappingMethod]; + + /** + * @private + * @type {Function} + */ + this._getSpecifiedVisual = zrUtil.bind( + specifiedVisualGetters[mappingMethod], this, visualType + ); + + zrUtil.extend(this, visualHandlers[visualType]); + + if (mappingMethod === 'piecewise') { + preprocessForPiecewise(thisOption); + } + if (mappingMethod === 'category') { + preprocessForCategory(thisOption); + } + }; + + VisualMapping.prototype = { + + constructor: VisualMapping, + + applyVisual: null, + + isValueActive: null, + + mapValueToVisual: null, + + getNormalizer: function () { + return zrUtil.bind(this._normalizeData, this); + } + }; + + var visualHandlers = VisualMapping.visualHandlers = { + + color: { + + applyVisual: defaultApplyColor, + + /** + * Create a mapper function + * @return {Function} + */ + getColorMapper: function () { + var visual = isCategory(this) + ? this.option.visual + : zrUtil.map(this.option.visual, zrColor.parse); + return zrUtil.bind( + isCategory(this) + ? function (value, isNormalized) { + !isNormalized && (value = this._normalizeData(value)); + return getVisualForCategory(this, visual, value); + } + : function (value, isNormalized, out) { + // If output rgb array + // which will be much faster and useful in pixel manipulation + var returnRGBArray = !!out; + !isNormalized && (value = this._normalizeData(value)); + out = zrColor.fastMapToColor(value, visual, out); + return returnRGBArray ? out : zrUtil.stringify(out, 'rgba'); + }, this); + }, + + // value: + // (1) {number} + // (2) {Array.} Represents a interval, for colorStops. + // Return type: + // (1) {string} color value like '#444' + // (2) {Array.} colorStops, + // like [{color: '#fff', offset: 0}, {color: '#444', offset: 1}] + // where offset is between 0 and 1. + mapValueToVisual: function (value) { + var visual = this.option.visual; + + if (zrUtil.isArray(value)) { + value = [ + this._normalizeData(value[0]), + this._normalizeData(value[1]) + ]; + + // For creating gradient color list. + return zrColor.mapIntervalToColor(value, visual); + } + else { + var normalized = this._normalizeData(value); + var result = this._getSpecifiedVisual(value); + + if (result == null) { + result = isCategory(this) + ? getVisualForCategory(this, visual, normalized) + : zrColor.mapToColor(normalized, visual); + } + + return result; + } + } + }, + + colorHue: makePartialColorVisualHandler(function (color, value) { + return zrColor.modifyHSL(color, value); + }), + + colorSaturation: makePartialColorVisualHandler(function (color, value) { + return zrColor.modifyHSL(color, null, value); + }), + + colorLightness: makePartialColorVisualHandler(function (color, value) { + return zrColor.modifyHSL(color, null, null, value); + }), + + colorAlpha: makePartialColorVisualHandler(function (color, value) { + return zrColor.modifyAlpha(color, value); + }), + + symbol: { + applyVisual: function (value, getter, setter) { + var symbolCfg = this.mapValueToVisual(value); + if (zrUtil.isString(symbolCfg)) { + setter('symbol', symbolCfg); + } + else if (isObject(symbolCfg)) { + for (var name in symbolCfg) { + if (symbolCfg.hasOwnProperty(name)) { + setter(name, symbolCfg[name]); + } + } + } + }, + + mapValueToVisual: function (value) { + var normalized = this._normalizeData(value); + var result = this._getSpecifiedVisual(value); + var visual = this.option.visual; + + if (result == null) { + result = isCategory(this) + ? getVisualForCategory(this, visual, normalized) + : (arrayGetByNormalizedValue(visual, normalized) || {}); + } + + return result; + } + }, + + symbolSize: { + applyVisual: function (value, getter, setter) { + setter('symbolSize', this.mapValueToVisual(value)); + }, + + mapValueToVisual: function (value) { + var normalized = this._normalizeData(value); + var result = this._getSpecifiedVisual(value); + var visual = this.option.visual; + + if (result == null) { + result = isCategory(this) + ? getVisualForCategory(this, visual, normalized) + : linearMapArray(normalized, [0, 1], visual, true); + } + return result; + } + } + }; + + function preprocessForPiecewise(thisOption) { + var pieceList = thisOption.pieceList; + thisOption.hasSpecialVisual = false; + + zrUtil.each(pieceList, function (piece, index) { + piece.originIndex = index; + if (piece.visual) { + thisOption.hasSpecialVisual = true; + } + }); + } + + function preprocessForCategory(thisOption) { + // Hash categories. + var categories = thisOption.categories; + var visual = thisOption.visual; + var isVisualArray = zrUtil.isArray(visual); + + if (!categories) { + if (!isVisualArray) { + // visual should be array when no categories. + throw new Error(); + } + else { + return; + } + } + + var categoryMap = thisOption.categoryMap = {}; + each(categories, function (cate, index) { + categoryMap[cate] = index; + }); + + // Process visual map input. + if (!isVisualArray) { + var visualArr = []; + + if (zrUtil.isObject(visual)) { + each(visual, function (v, cate) { + var index = categoryMap[cate]; + visualArr[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v; + }); + } + else { // Is primary type, represents default visual. + visualArr[CATEGORY_DEFAULT_VISUAL_INDEX] = visual; + } + + visual = thisOption.visual = visualArr; + } + + // Remove categories that has no visual, + // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX. + for (var i = categories.length - 1; i >= 0; i--) { + if (visual[i] == null) { + delete categoryMap[categories[i]]; + categories.pop(); + } + } + } + + function makePartialColorVisualHandler(applyValue) { + return { + + applyVisual: function (value, getter, setter) { + // color can be {string} or {Array.} (for gradient color stops) + var color = getter('color'); + var isArrayValue = zrUtil.isArray(value); + value = isArrayValue + ? [this.mapValueToVisual(value[0]), this.mapValueToVisual(value[1])] + : this.mapValueToVisual(value); + + if (zrUtil.isArray(color)) { + for (var i = 0, len = color.length; i < len; i++) { + color[i].color = applyValue( + color[i].color, isArrayValue ? value[i] : value + ); + } + } + else { + // Must not be array value + setter('color', applyValue(color, value)); + } + }, + + mapValueToVisual: function (value) { + var normalized = this._normalizeData(value); + var result = this._getSpecifiedVisual(value); + var visual = this.option.visual; + + if (result == null) { + result = isCategory(this) + ? getVisualForCategory(this, visual, normalized) + : linearMapArray(normalized, [0, 1], visual, true); + } + return result; + } + }; + } + + function arrayGetByNormalizedValue(arr, normalized) { + return arr[ + Math.round(linearMapArray(normalized, [0, 1], [0, arr.length - 1], true)) + ]; + } + + function defaultApplyColor(value, getter, setter) { + setter('color', this.mapValueToVisual(value)); + } + + function getVisualForCategory(me, visual, normalized) { + return visual[ + (me.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX) + ? normalized % visual.length + : normalized + ]; + } + + function isCategory(me) { + return me.option.mappingMethod === 'category'; + } + + + var normalizers = { + + linear: function (value) { + return linearMapArray(value, this.option.dataExtent, [0, 1], true); + }, + + piecewise: function (value) { + var pieceList = this.option.pieceList; + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList); + if (pieceIndex != null) { + return linearMapArray(pieceIndex, [0, pieceList.length - 1], [0, 1], true); + } + }, + + category: function (value) { + var index = this.option.categories + ? this.option.categoryMap[value] + : value; // ordinal + return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index; + } + }; + + + // FIXME + // refactor + var specifiedVisualGetters = { + + // Linear do not support this feature. + linear: zrUtil.noop, + + piecewise: function (visualType, value) { + var thisOption = this.option; + var pieceList = thisOption.pieceList; + if (thisOption.hasSpecialVisual) { + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList); + var piece = pieceList[pieceIndex]; + if (piece && piece.visual) { + return piece.visual[visualType]; + } + } + }, + + // Category do not need to support this feature. + // Visual can be set in visualMap.inRange or + // visualMap.outOfRange directly. + category: zrUtil.noop + }; + + /** + * @public + */ + VisualMapping.addVisualHandler = function (name, handler) { + visualHandlers[name] = handler; + }; + + /** + * @public + */ + VisualMapping.isValidType = function (visualType) { + return visualHandlers.hasOwnProperty(visualType); + }; + + /** + * Convinent method. + * Visual can be Object or Array or primary type. + * + * @public + */ + VisualMapping.eachVisual = function (visual, callback, context) { + if (zrUtil.isObject(visual)) { + zrUtil.each(visual, callback, context); + } + else { + callback.call(context, visual); + } + }; + + VisualMapping.mapVisual = function (visual, callback, context) { + var isPrimary; + var newVisual = zrUtil.isArray(visual) + ? [] + : zrUtil.isObject(visual) + ? {} + : (isPrimary = true, null); + + VisualMapping.eachVisual(visual, function (v, key) { + var newVal = callback.call(context, v, key); + isPrimary ? (newVisual = newVal) : (newVisual[key] = newVal); + }); + return newVisual; + }; + + /** + * 'color', 'colorSaturation', 'colorAlpha', ... are in the same visualCluster named 'color'. + * Other visuals are in the cluster named as the same as theirselves. + * + * @public + * @param {string} visualType + * @param {string} visualCluster + * @return {boolean} + */ + VisualMapping.isInVisualCluster = function (visualType, visualCluster) { + return visualCluster === 'color' + ? !!(visualType && visualType.indexOf(visualCluster) === 0) + : visualType === visualCluster; + }; + + /** + * @public + * @param {Object} obj + * @return {Oject} new object containers visual values. + * If no visuals, return null. + */ + VisualMapping.retrieveVisuals = function (obj) { + var ret = {}; + var hasVisual; + + obj && each(visualHandlers, function (h, visualType) { + if (obj.hasOwnProperty(visualType)) { + ret[visualType] = obj[visualType]; + hasVisual = true; + } + }); + + return hasVisual ? ret : null; + }; + + /** + * Give order to visual types, considering colorSaturation, colorAlpha depends on color. + * + * @public + * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...} + * IF Array, like: ['color', 'symbol', 'colorSaturation'] + * @return {Array.} Sorted visual types. + */ + VisualMapping.prepareVisualTypes = function (visualTypes) { + if (isObject(visualTypes)) { + var types = []; + each(visualTypes, function (item, type) { + types.push(type); + }); + visualTypes = types; + } + else if (zrUtil.isArray(visualTypes)) { + visualTypes = visualTypes.slice(); + } + else { + return []; + } + + visualTypes.sort(function (type1, type2) { + // color should be front of colorSaturation, colorAlpha, ... + // symbol and symbolSize do not matter. + return (type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0) + ? 1 : -1; + }); + + return visualTypes; + }; + + /** + * @public {Array.} [{value: ..., interval: [min, max]}, ...] + * @return {number} index + */ + VisualMapping.findPieceIndex = function (value, pieceList) { + // value has high priority. + for (var i = 0, len = pieceList.length; i < len; i++) { + var piece = pieceList[i]; + if (piece.value != null && piece.value === value) { + return i; + } + } + + for (var i = 0, len = pieceList.length; i < len; i++) { + var piece = pieceList[i]; + var interval = piece.interval; + if (interval) { + if (interval[0] === -Infinity) { + if (value < interval[1]) { + return i; + } + } + else if (interval[1] === Infinity) { + if (interval[0] < value) { + return i; + } + } + else if ( + piece.interval[0] <= value + && value <= piece.interval[1] + ) { + return i; + } + } + } + }; + + module.exports = VisualMapping; + + + + +/***/ }, +/* 188 */ +/***/ function(module, exports, __webpack_require__) { + + + + var mathMax = Math.max; + var mathMin = Math.min; + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var layout = __webpack_require__(21); + var helper = __webpack_require__(181); + var parsePercent = numberUtil.parsePercent; + var retrieveValue = zrUtil.retrieve; + var BoundingRect = __webpack_require__(15); + var helper = __webpack_require__(181); + + /** + * @public + */ + function update(ecModel, api, payload) { + // Layout result in each node: + // {x, y, width, height, area, borderWidth} + var condition = {mainType: 'series', subType: 'treemap', query: payload}; + ecModel.eachComponent(condition, function (seriesModel) { + + var ecWidth = api.getWidth(); + var ecHeight = api.getHeight(); + var seriesOption = seriesModel.option; + + var size = seriesOption.size || []; // Compatible with ec2. + var containerWidth = parsePercent( + retrieveValue(seriesOption.width, size[0]), + ecWidth + ); + var containerHeight = parsePercent( + retrieveValue(seriesOption.height, size[1]), + ecHeight + ); + + var layoutInfo = layout.getLayoutRect( + seriesModel.getBoxLayoutParams(), + { + width: api.getWidth(), + height: api.getHeight() + } + ); + + // Fetch payload info. + var payloadType = payload && payload.type; + var targetInfo = helper.retrieveTargetInfo(payload, seriesModel); + var rootRect = (payloadType === 'treemapRender' || payloadType === 'treemapMove') + ? payload.rootRect : null; + var viewRoot = seriesModel.getViewRoot(); + + if (payloadType !== 'treemapMove') { + var rootSize = payloadType === 'treemapZoomToNode' + ? estimateRootSize( + seriesModel, targetInfo, viewRoot, containerWidth, containerHeight + ) + : rootRect + ? [rootRect.width, rootRect.height] + : [containerWidth, containerHeight]; + + var sort = seriesOption.sort; + if (sort && sort !== 'asc' && sort !== 'desc') { + sort = 'desc'; + } + var options = { + squareRatio: seriesOption.squareRatio, + sort: sort, + leafDepth: seriesOption.leafDepth + }; + + viewRoot.setLayout({ + x: 0, y: 0, + width: rootSize[0], height: rootSize[1], + area: rootSize[0] * rootSize[1] + }); + + squarify(viewRoot, options, false, 0); + } + + // Set root position + viewRoot.setLayout( + calculateRootPosition(layoutInfo, rootRect, targetInfo), + true + ); + + seriesModel.setLayoutInfo(layoutInfo); + + // Optimize + // FIXME + // 现在没有clip功能,暂时取ec高宽。 + prunning( + seriesModel.getData().tree.root, + // Transform to base element coordinate system. + new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), + helper.getPathToRoot(viewRoot) + ); + + }); + } + + /** + * Layout treemap with squarify algorithm. + * @see https://graphics.ethz.ch/teaching/scivis_common/Literature/squarifiedTreeMaps.pdf + * @see https://github.com/mbostock/d3/blob/master/src/layout/treemap.js + * + * @protected + * @param {module:echarts/data/Tree~TreeNode} node + * @param {Object} options + * @param {string} options.sort 'asc' or 'desc' + * @param {number} options.squareRatio + * @param {boolean} hideChildren + * @param {number} depth + */ + function squarify(node, options, hideChildren, depth) { + var width; + var height; + + if (node.isRemoved()) { + return; + } + + var thisLayout = node.getLayout(); + width = thisLayout.width; + height = thisLayout.height; + + // Considering border and gap + var itemStyleModel = node.getModel('itemStyle.normal'); + var borderWidth = itemStyleModel.get('borderWidth'); + var halfGapWidth = itemStyleModel.get('gapWidth') / 2; + var layoutOffset = borderWidth - halfGapWidth; + var nodeModel = node.getModel(); + + node.setLayout({borderWidth: borderWidth}, true); + + width = mathMax(width - 2 * layoutOffset, 0); + height = mathMax(height - 2 * layoutOffset, 0); + + var totalArea = width * height; + var viewChildren = initChildren( + node, nodeModel, totalArea, options, hideChildren, depth + ); + + if (!viewChildren.length) { + return; + } + + var rect = {x: layoutOffset, y: layoutOffset, width: width, height: height}; + var rowFixedLength = mathMin(width, height); + var best = Infinity; // the best row score so far + var row = []; + row.area = 0; + + for (var i = 0, len = viewChildren.length; i < len;) { + var child = viewChildren[i]; + + row.push(child); + row.area += child.getLayout().area; + var score = worst(row, rowFixedLength, options.squareRatio); + + // continue with this orientation + if (score <= best) { + i++; + best = score; + } + // abort, and try a different orientation + else { + row.area -= row.pop().getLayout().area; + position(row, rowFixedLength, rect, halfGapWidth, false); + rowFixedLength = mathMin(rect.width, rect.height); + row.length = row.area = 0; + best = Infinity; + } + } + + if (row.length) { + position(row, rowFixedLength, rect, halfGapWidth, true); + } + + if (!hideChildren) { + var childrenVisibleMin = nodeModel.get('childrenVisibleMin'); + if (childrenVisibleMin != null && totalArea < childrenVisibleMin) { + hideChildren = true; + } + } + + for (var i = 0, len = viewChildren.length; i < len; i++) { + squarify(viewChildren[i], options, hideChildren, depth + 1); + } + } + + /** + * Set area to each child, and calculate data extent for visual coding. + */ + function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) { + var viewChildren = node.children || []; + var orderBy = options.sort; + orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null); + + var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth; + + // leafDepth has higher priority. + if (hideChildren && !overLeafDepth) { + return (node.viewChildren = []); + } + + // Sort children, order by desc. + viewChildren = zrUtil.filter(viewChildren, function (child) { + return !child.isRemoved(); + }); + + sort(viewChildren, orderBy); + + var info = statistic(nodeModel, viewChildren, orderBy); + + if (info.sum === 0) { + return (node.viewChildren = []); + } + + info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren); + + if (info.sum === 0) { + return (node.viewChildren = []); + } + + // Set area to each child. + for (var i = 0, len = viewChildren.length; i < len; i++) { + var area = viewChildren[i].getValue() / info.sum * totalArea; + // Do not use setLayout({...}, true), because it is needed to clear last layout. + viewChildren[i].setLayout({area: area}); + } + + if (overLeafDepth) { + viewChildren.length && node.setLayout({isLeafRoot: true}, true); + viewChildren.length = 0; + } + + node.viewChildren = viewChildren; + node.setLayout({dataExtent: info.dataExtent}, true); + + return viewChildren; + } + + /** + * Consider 'visibleMin'. Modify viewChildren and get new sum. + */ + function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) { + + // visibleMin is not supported yet when no option.sort. + if (!orderBy) { + return sum; + } + + var visibleMin = nodeModel.get('visibleMin'); + var len = orderedChildren.length; + var deletePoint = len; + + // Always travel from little value to big value. + for (var i = len - 1; i >= 0; i--) { + var value = orderedChildren[ + orderBy === 'asc' ? len - i - 1 : i + ].getValue(); + + if (value / sum * totalArea < visibleMin) { + deletePoint = i; + sum -= value; + } + } + + orderBy === 'asc' + ? orderedChildren.splice(0, len - deletePoint) + : orderedChildren.splice(deletePoint, len - deletePoint); + + return sum; + } + + /** + * Sort + */ + function sort(viewChildren, orderBy) { + if (orderBy) { + viewChildren.sort(function (a, b) { + return orderBy === 'asc' + ? a.getValue() - b.getValue() : b.getValue() - a.getValue(); + }); + } + return viewChildren; + } + + /** + * Statistic + */ + function statistic(nodeModel, children, orderBy) { + // Calculate sum. + var sum = 0; + for (var i = 0, len = children.length; i < len; i++) { + sum += children[i].getValue(); + } + + // Statistic data extent for latter visual coding. + // Notice: data extent should be calculate based on raw children + // but not filtered view children, otherwise visual mapping will not + // be stable when zoom (where children is filtered by visibleMin). + + var dimension = nodeModel.get('visualDimension'); + var dataExtent; + + // The same as area dimension. + if (!children || !children.length) { + dataExtent = [NaN, NaN]; + } + else if (dimension === 'value' && orderBy) { + dataExtent = [ + children[children.length - 1].getValue(), + children[0].getValue() + ]; + orderBy === 'asc' && dataExtent.reverse(); + } + // Other dimension. + else { + var dataExtent = [Infinity, -Infinity]; + zrUtil.each(children, function (child) { + var value = child.getValue(dimension); + value < dataExtent[0] && (dataExtent[0] = value); + value > dataExtent[1] && (dataExtent[1] = value); + }); + } + + return {sum: sum, dataExtent: dataExtent}; + } + + /** + * Computes the score for the specified row, + * as the worst aspect ratio. + */ + function worst(row, rowFixedLength, ratio) { + var areaMax = 0; + var areaMin = Infinity; + + for (var i = 0, area, len = row.length; i < len; i++) { + area = row[i].getLayout().area; + if (area) { + area < areaMin && (areaMin = area); + area > areaMax && (areaMax = area); + } + } + + var squareArea = row.area * row.area; + var f = rowFixedLength * rowFixedLength * ratio; + + return squareArea + ? mathMax( + (f * areaMax) / squareArea, + squareArea / (f * areaMin) + ) + : Infinity; + } + + /** + * Positions the specified row of nodes. Modifies `rect`. + */ + function position(row, rowFixedLength, rect, halfGapWidth, flush) { + // When rowFixedLength === rect.width, + // it is horizontal subdivision, + // rowFixedLength is the width of the subdivision, + // rowOtherLength is the height of the subdivision, + // and nodes will be positioned from left to right. + + // wh[idx0WhenH] means: when horizontal, + // wh[idx0WhenH] => wh[0] => 'width'. + // xy[idx1WhenH] => xy[1] => 'y'. + var idx0WhenH = rowFixedLength === rect.width ? 0 : 1; + var idx1WhenH = 1 - idx0WhenH; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + + var last = rect[xy[idx0WhenH]]; + var rowOtherLength = rowFixedLength + ? row.area / rowFixedLength : 0; + + if (flush || rowOtherLength > rect[wh[idx1WhenH]]) { + rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow + } + for (var i = 0, rowLen = row.length; i < rowLen; i++) { + var node = row[i]; + var nodeLayout = {}; + var step = rowOtherLength + ? node.getLayout().area / rowOtherLength : 0; + + var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax(rowOtherLength - 2 * halfGapWidth, 0); + + // We use Math.max/min to avoid negative width/height when considering gap width. + var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last; + var modWH = (i === rowLen - 1 || remain < step) ? remain : step; + var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax(modWH - 2 * halfGapWidth, 0); + + nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin(halfGapWidth, wh1 / 2); + nodeLayout[xy[idx0WhenH]] = last + mathMin(halfGapWidth, wh0 / 2); + + last += modWH; + node.setLayout(nodeLayout, true); + } + + rect[xy[idx1WhenH]] += rowOtherLength; + rect[wh[idx1WhenH]] -= rowOtherLength; + } + + // Return [containerWidth, containerHeight] as defualt. + function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) { + // If targetInfo.node exists, we zoom to the node, + // so estimate whold width and heigth by target node. + var currNode = (targetInfo || {}).node; + var defaultSize = [containerWidth, containerHeight]; + + if (!currNode || currNode === viewRoot) { + return defaultSize; + } + + var parent; + var viewArea = containerWidth * containerHeight; + var area = viewArea * seriesModel.option.zoomToNodeRatio; + + while (parent = currNode.parentNode) { // jshint ignore:line + var sum = 0; + var siblings = parent.children; + + for (var i = 0, len = siblings.length; i < len; i++) { + sum += siblings[i].getValue(); + } + var currNodeValue = currNode.getValue(); + if (currNodeValue === 0) { + return defaultSize; + } + area *= sum / currNodeValue; + + var borderWidth = parent.getModel('itemStyle.normal').get('borderWidth'); + + if (isFinite(borderWidth)) { + // Considering border, suppose aspect ratio is 1. + area += 4 * borderWidth * borderWidth + 4 * borderWidth * Math.pow(area, 0.5); + } + + area > numberUtil.MAX_SAFE_INTEGER && (area = numberUtil.MAX_SAFE_INTEGER); + + currNode = parent; + } + + area < viewArea && (area = viewArea); + var scale = Math.pow(area / viewArea, 0.5); + + return [containerWidth * scale, containerHeight * scale]; + } + + // Root postion base on coord of containerGroup + function calculateRootPosition(layoutInfo, rootRect, targetInfo) { + if (rootRect) { + return {x: rootRect.x, y: rootRect.y}; + } + + var defaultPosition = {x: 0, y: 0}; + if (!targetInfo) { + return defaultPosition; + } + + // If targetInfo is fetched by 'retrieveTargetInfo', + // old tree and new tree are the same tree, + // so the node still exists and we can visit it. + + var targetNode = targetInfo.node; + var layout = targetNode.getLayout(); + + if (!layout) { + return defaultPosition; + } + + // Transform coord from local to container. + var targetCenter = [layout.width / 2, layout.height / 2]; + var node = targetNode; + while (node) { + var nodeLayout = node.getLayout(); + targetCenter[0] += nodeLayout.x; + targetCenter[1] += nodeLayout.y; + node = node.parentNode; + } + + return { + x: layoutInfo.width / 2 - targetCenter[0], + y: layoutInfo.height / 2 - targetCenter[1] + }; + } + + // Mark invisible nodes for prunning when visual coding and rendering. + // Prunning depends on layout and root position, so we have to do it after them. + function prunning(node, clipRect, viewPath) { + var nodeLayout = node.getLayout(); + + node.setLayout({ + invisible: nodeLayout + ? !clipRect.intersect(nodeLayout) + : !helper.aboveViewRootByViewPath(viewPath, node) + }, true); + + var viewChildren = node.viewChildren || []; + for (var i = 0, len = viewChildren.length; i < len; i++) { + // Transform to child coordinate. + var childClipRect = new BoundingRect( + clipRect.x - nodeLayout.x, + clipRect.y - nodeLayout.y, + clipRect.width, + clipRect.height + ); + prunning(viewChildren[i], childClipRect, viewPath); + } + } + + module.exports = update; + + +/***/ }, +/* 189 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + var zrUtil = __webpack_require__(3); + + __webpack_require__(190); + __webpack_require__(193); + + __webpack_require__(197); + + echarts.registerProcessor('filter', __webpack_require__(198)); + + echarts.registerVisualCoding('chart', zrUtil.curry( + __webpack_require__(103), 'graph', 'circle', null + )); + echarts.registerVisualCoding('chart', __webpack_require__(199)); + + echarts.registerLayout(__webpack_require__(200)); + echarts.registerLayout(__webpack_require__(202)); + echarts.registerLayout(__webpack_require__(204)); + + // Graph view coordinate system + echarts.registerCoordinateSystem('graphView', { + create: __webpack_require__(206) + }); + + +/***/ }, +/* 190 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var zrUtil = __webpack_require__(3); + + var createGraphFromNodeEdge = __webpack_require__(191); + + var GraphSeries = __webpack_require__(1).extendSeriesModel({ + + type: 'series.graph', + + init: function (option) { + GraphSeries.superApply(this, 'init', arguments); + + // Provide data for legend select + this.legendDataProvider = function () { + return this._categoriesData; + }; + + this._updateCategoriesData(); + }, + + mergeOption: function (option) { + GraphSeries.superApply(this, 'mergeOption', arguments); + + this._updateCategoriesData(); + }, + + getInitialData: function (option, ecModel) { + var edges = option.edges || option.links; + var nodes = option.data || option.nodes; + if (nodes && edges) { + var graph = createGraphFromNodeEdge(nodes, edges, this, true); + var list = graph.data; + var self = this; + // Overwrite list.getItemModel to + list.wrapMethod('getItemModel', function (model) { + var categoriesModels = self._categoriesModels; + var categoryIdx = model.getShallow('category'); + var categoryModel = categoriesModels[categoryIdx]; + if (categoryModel) { + categoryModel.parentModel = model.parentModel; + model.parentModel = categoryModel; + } + return model; + }); + return list; + } + }, + + restoreData: function () { + GraphSeries.superApply(this, 'restoreData', arguments); + this.getGraph().restoreData(); + }, + + /** + * @return {module:echarts/data/Graph} + */ + getGraph: function () { + return this.getData().graph; + }, + + /** + * @return {module:echarts/data/List} + */ + getEdgeData: function () { + return this.getGraph().edgeData; + }, + + /** + * @return {module:echarts/data/List} + */ + getCategoriesData: function () { + return this._categoriesData; + }, + + _updateCategoriesData: function () { + var categories = zrUtil.map(this.option.categories || [], function (category) { + // Data must has value + return category.value != null ? category : zrUtil.extend({ + value: 0 + }, category); + }); + var categoriesData = new List(['value'], this); + categoriesData.initData(categories); + + this._categoriesData = categoriesData; + + this._categoriesModels = categoriesData.mapArray(function (idx) { + return categoriesData.getItemModel(idx, true); + }); + }, + + /** + * @param {number} zoom + */ + setRoamZoom: function (zoom) { + var roamDetail = this.option.roamDetail; + roamDetail && (roamDetail.zoom = zoom); + }, + + /** + * @param {number} x + * @param {number} y + */ + setRoamPan: function (x, y) { + var roamDetail = this.option.roamDetail; + if (roamDetail) { + roamDetail.x = x; + roamDetail.y = y; + } + }, + + defaultOption: { + zlevel: 0, + z: 2, + + color: ['#61a0a8', '#d14a61', '#fd9c35', '#675bba', '#fec42c', + '#dd4444', '#fd9c35', '#cd4870'], + + coordinateSystem: 'view', + + legendHoverLink: true, + + hoverAnimation: true, + + layout: null, + + // Configuration of force + force: { + initLayout: null, + repulsion: 50, + gravity: 0.1, + edgeLength: 30, + + layoutAnimation: true + }, + + left: 'center', + top: 'center', + // right: null, + // bottom: null, + // width: '80%', + // height: '80%', + + symbol: 'circle', + symbolSize: 10, + + draggable: false, + + roam: false, + roamDetail: { + x: 0, + y: 0, + zoom: 1 + }, + + // Symbol size scale ratio in roam + nodeScaleRatio: 0.6, + + // Line width scale ratio in roam + // edgeScaleRatio: 0.1, + + // categories: [], + + // data: [] + // Or + // nodes: [] + // + // links: [] + // Or + // edges: [] + + label: { + normal: { + show: false + }, + emphasis: { + show: true + } + }, + + itemStyle: { + normal: {}, + emphasis: {} + }, + + lineStyle: { + normal: { + color: '#aaa', + width: 1, + curveness: 0, + opacity: 0.5 + }, + emphasis: {} + } + } + }); + + module.exports = GraphSeries; + + +/***/ }, +/* 191 */ +/***/ function(module, exports, __webpack_require__) { + + + + var List = __webpack_require__(94); + var Graph = __webpack_require__(192); + var linkList = __webpack_require__(180); + var completeDimensions = __webpack_require__(96); + var zrUtil = __webpack_require__(3); + + module.exports = function (nodes, edges, hostModel, directed) { + var graph = new Graph(directed); + for (var i = 0; i < nodes.length; i++) { + graph.addNode(zrUtil.retrieve( + // Id, name, dataIndex + nodes[i].id, nodes[i].name, i + ), i); + } + + var linkNameList = []; + var validEdges = []; + for (var i = 0; i < edges.length; i++) { + var link = edges[i]; + // addEdge may fail when source or target not exists + if (graph.addEdge(link.source, link.target, i)) { + validEdges.push(link); + linkNameList.push(zrUtil.retrieve(link.id, link.source + ' - ' + link.target)); + } + } + + // FIXME + var dimensionNames = completeDimensions(['value'], nodes); + + var nodeData = new List(dimensionNames, hostModel); + var edgeData = new List(['value'], hostModel); + + nodeData.initData(nodes); + edgeData.initData(validEdges, linkNameList); + + graph.setEdgeData(edgeData); + + linkList.linkToGraph(nodeData, graph); + // Update dataIndex of nodes and edges because invalid edge may be removed + graph.update(); + + return graph; + }; + + +/***/ }, +/* 192 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Graph data structure + * + * @module echarts/data/Graph + * @author Yi Shen(https://www.github.com/pissang) + */ + + + var zrUtil = __webpack_require__(3); + + /** + * @alias module:echarts/data/Graph + * @constructor + * @param {boolean} directed + */ + var Graph = function(directed) { + /** + * 是否是有向图 + * @type {boolean} + * @private + */ + this._directed = directed || false; + + /** + * @type {Array.} + * @readOnly + */ + this.nodes = []; + + /** + * @type {Array.} + * @readOnly + */ + this.edges = []; + + /** + * @type {Object.} + * @private + */ + this._nodesMap = {}; + /** + * @type {Object.} + * @private + */ + this._edgesMap = {}; + + /** + * @type {module:echarts/data/List} + * @readOnly + */ + this.data; + + /** + * @type {module:echarts/data/List} + * @readOnly + */ + this.edgeData; + }; + + var graphProto = Graph.prototype; + /** + * @type {string} + */ + graphProto.type = 'graph'; + + /** + * If is directed graph + * @return {boolean} + */ + graphProto.isDirected = function () { + return this._directed; + }; + + /** + * Add a new node + * @param {string} id + * @param {number} [dataIndex] + */ + graphProto.addNode = function (id, dataIndex) { + var nodesMap = this._nodesMap; + + if (nodesMap[id]) { + return; + } + + var node = new Node(id, dataIndex); + node.hostGraph = this; + + this.nodes.push(node); + + nodesMap[id] = node; + return node; + }; + + /** + * Get node by data index + * @param {number} dataIndex + * @return {module:echarts/data/Graph~Node} + */ + graphProto.getNodeByIndex = function (dataIndex) { + var rawIdx = this.data.getRawIndex(dataIndex); + return this.nodes[rawIdx]; + }; + /** + * Get node by id + * @param {string} id + * @return {module:echarts/data/Graph.Node} + */ + graphProto.getNodeById = function (id) { + return this._nodesMap[id]; + }; + + /** + * Add a new edge + * @param {string|module:echarts/data/Graph.Node} n1 + * @param {string|module:echarts/data/Graph.Node} n2 + * @param {number} [dataIndex=-1] + * @return {module:echarts/data/Graph.Edge} + */ + graphProto.addEdge = function (n1, n2, dataIndex) { + var nodesMap = this._nodesMap; + var edgesMap = this._edgesMap; + + if (!(n1 instanceof Node)) { + n1 = nodesMap[n1]; + } + if (!(n2 instanceof Node)) { + n2 = nodesMap[n2]; + } + if (!n1 || !n2) { + return; + } + + var key = n1.id + '-' + n2.id; + // PENDING + if (edgesMap[key]) { + return; + } + + var edge = new Edge(n1, n2, dataIndex); + edge.hostGraph = this; + + if (this._directed) { + n1.outEdges.push(edge); + n2.inEdges.push(edge); + } + n1.edges.push(edge); + if (n1 !== n2) { + n2.edges.push(edge); + } + + this.edges.push(edge); + edgesMap[key] = edge; + + return edge; + }; + + /** + * Get edge by data index + * @param {number} dataIndex + * @return {module:echarts/data/Graph~Node} + */ + graphProto.getEdgeByIndex = function (dataIndex) { + var rawIdx = this.edgeData.getRawIndex(dataIndex); + return this.edges[rawIdx]; + }; + /** + * Get edge by two linked nodes + * @param {module:echarts/data/Graph.Node|string} n1 + * @param {module:echarts/data/Graph.Node|string} n2 + * @return {module:echarts/data/Graph.Edge} + */ + graphProto.getEdge = function (n1, n2) { + if (n1 instanceof Node) { + n1 = n1.id; + } + if (n2 instanceof Node) { + n2 = n2.id; + } + + var edgesMap = this._edgesMap; + + if (this._directed) { + return edgesMap[n1 + '-' + n2]; + } else { + return edgesMap[n1 + '-' + n2] + || edgesMap[n2 + '-' + n1]; + } + }; + + /** + * Iterate all nodes + * @param {Function} cb + * @param {*} [context] + */ + graphProto.eachNode = function (cb, context) { + var nodes = this.nodes; + var len = nodes.length; + for (var i = 0; i < len; i++) { + if (nodes[i].dataIndex >= 0) { + cb.call(context, nodes[i], i); + } + } + }; + + /** + * Iterate all edges + * @param {Function} cb + * @param {*} [context] + */ + graphProto.eachEdge = function (cb, context) { + var edges = this.edges; + var len = edges.length; + for (var i = 0; i < len; i++) { + if (edges[i].dataIndex >= 0 + && edges[i].node1.dataIndex >= 0 + && edges[i].node2.dataIndex >= 0 + ) { + cb.call(context, edges[i], i); + } + } + }; + + /** + * Breadth first traverse + * @param {Function} cb + * @param {module:echarts/data/Graph.Node} startNode + * @param {string} [direction='none'] 'none'|'in'|'out' + * @param {*} [context] + */ + graphProto.breadthFirstTraverse = function ( + cb, startNode, direction, context + ) { + if (!(startNode instanceof Node)) { + startNode = this._nodesMap[startNode]; + } + if (!startNode) { + return; + } + + var edgeType = direction === 'out' + ? 'outEdges' : (direction === 'in' ? 'inEdges' : 'edges'); + + for (var i = 0; i < this.nodes.length; i++) { + this.nodes[i].__visited = false; + } + + if (cb.call(context, startNode, null)) { + return; + } + + var queue = [startNode]; + while (queue.length) { + var currentNode = queue.shift(); + var edges = currentNode[edgeType]; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + var otherNode = e.node1 === currentNode + ? e.node2 : e.node1; + if (!otherNode.__visited) { + if (cb.call(otherNode, otherNode, currentNode)) { + // Stop traversing + return; + } + queue.push(otherNode); + otherNode.__visited = true; + } + } + } + }; + + // TODO + // graphProto.depthFirstTraverse = function ( + // cb, startNode, direction, context + // ) { + + // }; + + // Filter update + graphProto.update = function () { + var data = this.data; + var edgeData = this.edgeData; + var nodes = this.nodes; + var edges = this.edges; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + + edgeData.filterSelf(function (idx) { + var edge = edges[edgeData.getRawIndex(idx)]; + return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0; + }); + + // Update edge + for (var i = 0, len = edges.length; i < len; i++) { + edges[i].dataIndex = -1; + } + for (var i = 0, len = edgeData.count(); i < len; i++) { + edges[edgeData.getRawIndex(i)].dataIndex = i; + } + }; + + /** + * Set edge data + * @param {module:echarts/data/List} edgeData + */ + graphProto.setEdgeData = function (edgeData) { + this.edgeData = edgeData; + this._edgeDataSaved = edgeData.cloneShallow(); + }; + + graphProto.restoreData = function () { + this.edgeData = this._edgeDataSaved.cloneShallow(); + }; + + /** + * @return {module:echarts/data/Graph} + */ + graphProto.clone = function () { + var graph = new Graph(this._directed); + var nodes = this.nodes; + var edges = this.edges; + for (var i = 0; i < nodes.length; i++) { + graph.addNode(nodes[i].id, nodes[i].dataIndex); + } + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + graph.addEdge(e.node1.id, e.node2.id, e.dataIndex); + } + return graph; + }; + + + /** + * @alias module:echarts/data/Graph.Node + */ + function Node(id, dataIndex) { + /** + * @type {string} + */ + this.id = id == null ? '' : id; + + /** + * @type {Array.} + */ + this.inEdges = []; + /** + * @type {Array.} + */ + this.outEdges = []; + /** + * @type {Array.} + */ + this.edges = []; + /** + * @type {module:echarts/data/Graph} + */ + this.hostGraph; + + /** + * @type {number} + */ + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } + + Node.prototype = { + + constructor: Node, + + /** + * @return {number} + */ + degree: function () { + return this.edges.length; + }, + + /** + * @return {number} + */ + inDegree: function () { + return this.inEdges.length; + }, + + /** + * @return {number} + */ + outDegree: function () { + return this.outEdges.length; + }, + + /** + * @param {string} [path] + * @return {module:echarts/model/Model} + */ + getModel: function (path) { + if (this.dataIndex < 0) { + return; + } + var graph = this.hostGraph; + var itemModel = graph.data.getItemModel(this.dataIndex); + + return itemModel.getModel(path); + } + }; + + /** + * 图边 + * @alias module:echarts/data/Graph.Edge + * @param {module:echarts/data/Graph.Node} n1 + * @param {module:echarts/data/Graph.Node} n2 + * @param {number} [dataIndex=-1] + */ + function Edge(n1, n2, dataIndex) { + + /** + * 节点1,如果是有向图则为源节点 + * @type {module:echarts/data/Graph.Node} + */ + this.node1 = n1; + + /** + * 节点2,如果是有向图则为目标节点 + * @type {module:echarts/data/Graph.Node} + */ + this.node2 = n2; + + this.dataIndex = dataIndex == null ? -1 : dataIndex; + } + + /** + * @param {string} [path] + * @return {module:echarts/model/Model} + */ + Edge.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + var graph = this.hostGraph; + var itemModel = graph.edgeData.getItemModel(this.dataIndex); + + return itemModel.getModel(path); + }; + + var createGraphDataProxyMixin = function (hostName, dataName) { + return { + /** + * @param {string=} [dimension='value'] Default 'value'. can be 'a', 'b', 'c', 'd', 'e'. + * @return {number} + */ + getValue: function (dimension) { + var data = this[hostName][dataName]; + return data.get(data.getDimension(dimension || 'value'), this.dataIndex); + }, + + /** + * @param {Object|string} key + * @param {*} [value] + */ + setVisual: function (key, value) { + this.dataIndex >= 0 + && this[hostName][dataName].setItemVisual(this.dataIndex, key, value); + }, + + /** + * @param {string} key + * @return {boolean} + */ + getVisual: function (key, ignoreParent) { + return this[hostName][dataName].getItemVisual(this.dataIndex, key, ignoreParent); + }, + + /** + * @param {Object} layout + * @return {boolean} [merge=false] + */ + setLayout: function (layout, merge) { + this.dataIndex >= 0 + && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge); + }, + + /** + * @return {Object} + */ + getLayout: function () { + return this[hostName][dataName].getItemLayout(this.dataIndex); + }, + + /** + * @return {module:zrender/Element} + */ + getGraphicEl: function () { + return this[hostName][dataName].getItemGraphicEl(this.dataIndex); + }, + + /** + * @return {number} + */ + getRawIndex: function () { + return this[hostName][dataName].getRawIndex(this.dataIndex); + } + }; + }; + + zrUtil.mixin(Node, createGraphDataProxyMixin('hostGraph', 'data')); + zrUtil.mixin(Edge, createGraphDataProxyMixin('hostGraph', 'edgeData')); + + Graph.Node = Node; + Graph.Edge = Edge; + + module.exports = Graph; + + +/***/ }, +/* 193 */ +/***/ function(module, exports, __webpack_require__) { + + + + + var SymbolDraw = __webpack_require__(98); + var LineDraw = __webpack_require__(194); + var RoamController = __webpack_require__(159); + + var modelUtil = __webpack_require__(5); + var graphic = __webpack_require__(42); + + __webpack_require__(1).extendChartView({ + + type: 'graph', + + init: function (ecModel, api) { + var symbolDraw = new SymbolDraw(); + var lineDraw = new LineDraw(); + var group = this.group; + + var controller = new RoamController(api.getZr(), group); + + group.add(symbolDraw.group); + group.add(lineDraw.group); + + this._symbolDraw = symbolDraw; + this._lineDraw = lineDraw; + this._controller = controller; + + this._firstRender = true; + }, + + render: function (seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + // Only support view and geo coordinate system + if (coordSys.type !== 'geo' && coordSys.type !== 'view') { + return; + } + + var data = seriesModel.getData(); + this._model = seriesModel; + + var symbolDraw = this._symbolDraw; + var lineDraw = this._lineDraw; + + symbolDraw.updateData(data); + + var edgeData = data.graph.edgeData; + var rawOption = seriesModel.option; + var formatModel = modelUtil.createDataFormatModel( + seriesModel, edgeData, rawOption.edges || rawOption.links + ); + formatModel.formatTooltip = function (dataIndex) { + var params = this.getDataParams(dataIndex); + var edge = data.graph.getEdgeByIndex(dataIndex); + var sourceName = data.getName(edge.node1.dataIndex); + var targetName = data.getName(edge.node2.dataIndex); + var html = sourceName + ' > ' + targetName; + if (params.value) { + html += ' : ' + params.value; + } + return html; + }; + + lineDraw.updateData(edgeData, null, null); + edgeData.eachItemGraphicEl(function (el) { + el.traverse(function (child) { + child.dataModel = formatModel; + }); + }); + + // Save the original lineWidth + // data.graph.eachEdge(function (edge) { + // edge.__lineWidth = edge.getModel('lineStyle.normal').get('width'); + // }); + + var group = this.group; + var groupNewProp = { + position: coordSys.position, + scale: coordSys.scale + }; + if (this._firstRender) { + group.attr(groupNewProp); + } + else { + graphic.updateProps(group, groupNewProp, seriesModel); + } + + this._nodeScaleRatio = seriesModel.get('nodeScaleRatio'); + // this._edgeScaleRatio = seriesModel.get('edgeScaleRatio'); + + this._updateNodeAndLinkScale(); + + this._updateController(seriesModel, coordSys, api); + + clearTimeout(this._layoutTimeout); + var forceLayout = seriesModel.forceLayout; + var layoutAnimation = seriesModel.get('force.layoutAnimation'); + if (forceLayout) { + this._startForceLayoutIteration(forceLayout, layoutAnimation); + } + // Update draggable + data.eachItemGraphicEl(function (el, idx) { + var draggable = data.getItemModel(idx).get('draggable'); + if (draggable && forceLayout) { + el.on('drag', function () { + forceLayout.warmUp(); + !this._layouting + && this._startForceLayoutIteration(forceLayout, layoutAnimation); + forceLayout.setFixed(idx); + // Write position back to layout + data.setItemLayout(idx, el.position); + }, this).on('dragend', function () { + forceLayout.setUnfixed(idx); + }, this); + } + else { + el.off('drag'); + } + el.setDraggable(draggable); + }, this); + + this._firstRender = false; + }, + + _startForceLayoutIteration: function (forceLayout, layoutAnimation) { + var self = this; + (function step() { + forceLayout.step(function (stopped) { + self.updateLayout(); + (self._layouting = !stopped) && ( + layoutAnimation + ? (self._layoutTimeout = setTimeout(step, 16)) + : step() + ); + }); + })(); + }, + + _updateController: function (seriesModel, coordSys, api) { + var controller = this._controller; + controller.rect = coordSys.getViewRect(); + + controller.enable(seriesModel.get('roam')); + + controller + .off('pan') + .off('zoom') + .on('pan', function (dx, dy) { + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + dx: dx, + dy: dy + }); + }) + .on('zoom', function (zoom, mouseX, mouseY) { + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + zoom: zoom, + originX: mouseX, + originY: mouseY + }); + }) + .on('zoom', this._updateNodeAndLinkScale, this); + }, + + _updateNodeAndLinkScale: function () { + var seriesModel = this._model; + var data = seriesModel.getData(); + + var group = this.group; + var nodeScaleRatio = this._nodeScaleRatio; + // var edgeScaleRatio = this._edgeScaleRatio; + + // Assume scale aspect is 1 + var groupScale = group.scale[0]; + + var nodeScale = (groupScale - 1) * nodeScaleRatio + 1; + // var edgeScale = (groupScale - 1) * edgeScaleRatio + 1; + var invScale = [ + nodeScale / groupScale, + nodeScale / groupScale + ]; + + data.eachItemGraphicEl(function (el, idx) { + el.attr('scale', invScale); + }); + // data.graph.eachEdge(function (edge) { + // var lineGroup = edge.getGraphicEl(); + // // FIXME + // lineGroup.childOfName('line').setStyle( + // 'lineWidth', + // edge.__lineWidth * edgeScale / groupScale + // ); + // }); + }, + + updateLayout: function (seriesModel, ecModel) { + this._symbolDraw.updateLayout(); + this._lineDraw.updateLayout(); + }, + + remove: function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(); + this._lineDraw && this._lineDraw.remove(); + } + }); + + +/***/ }, +/* 194 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/LineDraw + */ + + + var graphic = __webpack_require__(42); + var LineGroup = __webpack_require__(195); + + /** + * @alias module:echarts/component/marker/LineDraw + * @constructor + */ + function LineDraw(ctor) { + this._ctor = ctor || LineGroup; + this.group = new graphic.Group(); + } + + var lineDrawProto = LineDraw.prototype; + + /** + * @param {module:echarts/data/List} lineData + * @param {module:echarts/data/List} [fromData] + * @param {module:echarts/data/List} [toData] + */ + lineDrawProto.updateData = function (lineData, fromData, toData) { + + var oldLineData = this._lineData; + var group = this.group; + var LineCtor = this._ctor; + + lineData.diff(oldLineData) + .add(function (idx) { + var lineGroup = new LineCtor(lineData, fromData, toData, idx); + + lineData.setItemGraphicEl(idx, lineGroup); + + group.add(lineGroup); + }) + .update(function (newIdx, oldIdx) { + var lineGroup = oldLineData.getItemGraphicEl(oldIdx); + lineGroup.updateData(lineData, fromData, toData, newIdx); + + lineData.setItemGraphicEl(newIdx, lineGroup); + + group.add(lineGroup); + }) + .remove(function (idx) { + group.remove(oldLineData.getItemGraphicEl(idx)); + }) + .execute(); + + this._lineData = lineData; + this._fromData = fromData; + this._toData = toData; + }; + + lineDrawProto.updateLayout = function () { + var lineData = this._lineData; + lineData.eachItemGraphicEl(function (el, idx) { + el.updateLayout(lineData, this._fromData, this._toData, idx); + }, this); + }; + + lineDrawProto.remove = function () { + this.group.removeAll(); + }; + + module.exports = LineDraw; + + +/***/ }, +/* 195 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/Line + */ + + + var symbolUtil = __webpack_require__(100); + var vector = __webpack_require__(16); + var LinePath = __webpack_require__(196); + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + + /** + * @inner + */ + function createSymbol(name, data, idx) { + var color = data.getItemVisual(idx, 'color'); + var symbolType = data.getItemVisual(idx, 'symbol'); + var symbolSize = data.getItemVisual(idx, 'symbolSize'); + + if (symbolType === 'none') { + return; + } + + if (!zrUtil.isArray(symbolSize)) { + symbolSize = [symbolSize, symbolSize]; + } + var symbolPath = symbolUtil.createSymbol( + symbolType, -symbolSize[0] / 2, -symbolSize[1] / 2, + symbolSize[0], symbolSize[1], color + ); + symbolPath.name = name; + + return symbolPath; + } + + function createLine(points) { + var line = new LinePath({ + name: 'line', + style: { + strokeNoScale: true + } + }); + setLinePoints(line.shape, points); + return line; + } + + function setLinePoints(targetShape, points) { + var p1 = points[0]; + var p2 = points[1]; + var cp1 = points[2]; + targetShape.x1 = p1[0]; + targetShape.y1 = p1[1]; + targetShape.x2 = p2[0]; + targetShape.y2 = p2[1]; + targetShape.percent = 1; + + if (cp1) { + targetShape.cpx1 = cp1[0]; + targetShape.cpy1 = cp1[1]; + } + } + + function isSymbolArrow(symbol) { + return symbol.type === 'symbol' && symbol.shape.symbolType === 'arrow'; + } + + function updateSymbolBeforeLineUpdate () { + var lineGroup = this; + var line = lineGroup.childOfName('line'); + // If line not changed + if (!this.__dirty && !line.__dirty) { + return; + } + var symbolFrom = lineGroup.childOfName('fromSymbol'); + var symbolTo = lineGroup.childOfName('toSymbol'); + var label = lineGroup.childOfName('label'); + var fromPos = line.pointAt(0); + var toPos = line.pointAt(line.shape.percent); + + var d = vector.sub([], toPos, fromPos); + vector.normalize(d, d); + + if (symbolFrom) { + symbolFrom.attr('position', fromPos); + // Rotate the arrow + // FIXME Hard coded ? + if (isSymbolArrow(symbolFrom)) { + symbolFrom.attr('rotation', tangentRotation(toPos, fromPos)); + } + } + if (symbolTo) { + symbolTo.attr('position', toPos); + if (isSymbolArrow(symbolTo)) { + symbolTo.attr('rotation', tangentRotation(fromPos, toPos)); + } + } + + label.attr('position', toPos); + + var textPosition; + var textAlign; + var textVerticalAlign; + // End + if (label.__position === 'end') { + textPosition = [d[0] * 5 + toPos[0], d[1] * 5 + toPos[1]]; + textAlign = d[0] > 0.8 ? 'left' : (d[0] < -0.8 ? 'right' : 'center'); + textVerticalAlign = d[1] > 0.8 ? 'top' : (d[1] < -0.8 ? 'bottom' : 'middle'); + } + // Start + else { + textPosition = [-d[0] * 5 + fromPos[0], -d[1] * 5 + fromPos[1]]; + textAlign = d[0] > 0.8 ? 'right' : (d[0] < -0.8 ? 'left' : 'center'); + textVerticalAlign = d[1] > 0.8 ? 'bottom' : (d[1] < -0.8 ? 'top' : 'middle'); + } + label.attr({ + style: { + // Use the user specified text align and baseline first + textVerticalAlign: label.__verticalAlign || textVerticalAlign, + textAlign: label.__textAlign || textAlign + }, + position: textPosition + }); + } + + function tangentRotation(p1, p2) { + return -Math.PI / 2 - Math.atan2( + p2[1] - p1[1], p2[0] - p1[0] + ); + } + + /** + * @constructor + * @extends {module:zrender/graphic/Group} + * @alias {module:echarts/chart/helper/Line} + */ + function Line(lineData, fromData, toData, idx) { + graphic.Group.call(this); + + this._createLine(lineData, fromData, toData, idx); + } + + var lineProto = Line.prototype; + + // Update symbol position and rotation + lineProto.beforeUpdate = updateSymbolBeforeLineUpdate; + + lineProto._createLine = function (lineData, fromData, toData, idx) { + var seriesModel = lineData.hostModel; + var linePoints = lineData.getItemLayout(idx); + + var line = createLine(linePoints); + line.shape.percent = 0; + graphic.initProps(line, { + shape: { + percent: 1 + } + }, seriesModel); + + this.add(line); + + var label = new graphic.Text({ + name: 'label' + }); + this.add(label); + + if (fromData) { + var symbolFrom = createSymbol('fromSymbol', fromData, idx); + // symbols must added after line to make sure + // it will be updated after line#update. + // Or symbol position and rotation update in line#beforeUpdate will be one frame slow + this.add(symbolFrom); + + this._fromSymbolType = fromData.getItemVisual(idx, 'symbol'); + } + if (toData) { + var symbolTo = createSymbol('toSymbol', toData, idx); + this.add(symbolTo); + + this._toSymbolType = toData.getItemVisual(idx, 'symbol'); + } + + this._updateCommonStl(lineData, fromData, toData, idx); + }; + + lineProto.updateData = function (lineData, fromData, toData, idx) { + var seriesModel = lineData.hostModel; + + var line = this.childOfName('line'); + var linePoints = lineData.getItemLayout(idx); + var target = { + shape: {} + }; + setLinePoints(target.shape, linePoints); + graphic.updateProps(line, target, seriesModel); + + // Symbol changed + if (fromData) { + var fromSymbolType = fromData.getItemVisual(idx, 'symbol'); + if (this._fromSymbolType !== fromSymbolType) { + var symbolFrom = createSymbol('fromSymbol', fromData, idx); + this.remove(this.childOfName('fromSymbol')); + this.add(symbolFrom); + } + this._fromSymbolType = fromSymbolType; + } + if (toData) { + var toSymbolType = toData.getItemVisual(idx, 'symbol'); + // Symbol changed + if (toSymbolType !== this._toSymbolType) { + var symbolTo = createSymbol('toSymbol', toData, idx); + this.remove(this.childOfName('toSymbol')); + this.add(symbolTo); + } + this._toSymbolType = toSymbolType; + } + + this._updateCommonStl(lineData, fromData, toData, idx); + }; + + lineProto._updateCommonStl = function (lineData, fromData, toData, idx) { + var seriesModel = lineData.hostModel; + + var line = this.childOfName('line'); + var itemModel = lineData.getItemModel(idx); + + var labelModel = itemModel.getModel('label.normal'); + var textStyleModel = labelModel.getModel('textStyle'); + var labelHoverModel = itemModel.getModel('label.emphasis'); + var textStyleHoverModel = labelHoverModel.getModel('textStyle'); + + var defaultText = numberUtil.round(seriesModel.getRawValue(idx)); + if (isNaN(defaultText)) { + // Use name + defaultText = lineData.getName(idx); + } + line.setStyle(zrUtil.extend( + { + stroke: lineData.getItemVisual(idx, 'color') + }, + itemModel.getModel('lineStyle.normal').getLineStyle() + )); + + var label = this.childOfName('label'); + label.setStyle({ + text: labelModel.get('show') + ? zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'normal'), + defaultText + ) + : '', + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() || lineData.getItemVisual(idx, 'color') + }); + label.hoverStyle = { + text: labelHoverModel.get('show') + ? zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'emphasis'), + defaultText + ) + : '', + textFont: textStyleHoverModel.getFont(), + fill: textStyleHoverModel.getTextColor() + }; + label.__textAlign = textStyleModel.get('align'); + label.__verticalAlign = textStyleModel.get('baseline'); + label.__position = labelModel.get('position'); + + graphic.setHoverStyle( + this, itemModel.getModel('lineStyle.emphasis').getLineStyle() + ); + }; + + lineProto.updateLayout = function (lineData, fromData, toData, idx) { + var points = lineData.getItemLayout(idx); + var linePath = this.childOfName('line'); + setLinePoints(linePath.shape, points); + linePath.dirty(true); + // var fromEl = fromData && fromData.getItemGraphicEl(idx); + // var toEl = toData && toData.getItemGraphicEl(idx); + // fromEl && fromEl.attr('position', points[0]); + // toEl && toEl.attr('position', points[1]); + }; + + zrUtil.inherits(Line, graphic.Group); + + module.exports = Line; + + +/***/ }, +/* 196 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Line path for bezier and straight line draw + */ + + var graphic = __webpack_require__(42); + + var straightLineProto = graphic.Line.prototype; + var bezierCurveProto = graphic.BezierCurve.prototype; + + module.exports = graphic.extendShape({ + + type: 'ec-line', + + style: { + stroke: '#000', + fill: null + }, + + shape: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + percent: 1, + cpx1: null, + cpy1: null + }, + + buildPath: function (ctx, shape) { + (shape.cpx1 == null || shape.cpy1 == null + ? straightLineProto : bezierCurveProto).buildPath(ctx, shape); + }, + + pointAt: function (t) { + var shape = this.shape; + return shape.cpx1 == null || shape.cpy1 == null + ? straightLineProto.pointAt.call(this, t) + : bezierCurveProto.pointAt.call(this, t); + } + }); + + +/***/ }, +/* 197 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + var roamHelper = __webpack_require__(162); + + var actionInfo = { + type: 'graphRoam', + event: 'graphRoam', + update: 'none' + }; + + /** + * @payload + * @property {string} name Series name + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ + + echarts.registerAction(actionInfo, function (payload, ecModel) { + ecModel.eachComponent({mainType: 'series', query: payload}, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + var roamDetailModel = seriesModel.getModel('roamDetail'); + var res = roamHelper.calcPanAndZoom(roamDetailModel, payload); + + seriesModel.setRoamPan + && seriesModel.setRoamPan(res.x, res.y); + + seriesModel.setRoamZoom + && seriesModel.setRoamZoom(res.zoom); + + coordSys && coordSys.setPan(res.x, res.y); + coordSys && coordSys.setZoom(res.zoom); + }); + }); + + +/***/ }, +/* 198 */ +/***/ function(module, exports) { + + + + module.exports = function (ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (!legendModels || !legendModels.length) { + return; + } + ecModel.eachSeriesByType('graph', function (graphSeries) { + var categoriesData = graphSeries.getCategoriesData(); + var graph = graphSeries.getGraph(); + var data = graph.data; + + var categoryNames = categoriesData.mapArray(categoriesData.getName); + + data.filterSelf(function (idx) { + var model = data.getItemModel(idx); + var category = model.getShallow('category'); + if (category != null) { + if (typeof category === 'number') { + category = categoryNames[category]; + } + // If in any legend component the status is not selected. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(category)) { + return false; + } + } + } + return true; + }); + }, this); + }; + + +/***/ }, +/* 199 */ +/***/ function(module, exports) { + + + + module.exports = function (ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var colorList = seriesModel.get('color'); + var categoriesData = seriesModel.getCategoriesData(); + var data = seriesModel.getData(); + + var categoryNameIdxMap = {}; + + categoriesData.each(function (idx) { + categoryNameIdxMap[categoriesData.getName(idx)] = idx; + + var itemModel = categoriesData.getItemModel(idx); + var rawIdx = categoriesData.getRawIndex(idx); + var color = itemModel.get('itemStyle.normal.color') + || colorList[rawIdx % colorList.length]; + categoriesData.setItemVisual(idx, 'color', color); + }); + + // Assign category color to visual + if (categoriesData.count()) { + data.each(function (idx) { + var model = data.getItemModel(idx); + var category = model.getShallow('category'); + if (category != null) { + if (typeof category === 'string') { + category = categoryNameIdxMap[category]; + } + data.setItemVisual( + idx, 'color', + categoriesData.getItemVisual(category, 'color') + ); + } + }); + } + }); + }; + + +/***/ }, +/* 200 */ +/***/ function(module, exports, __webpack_require__) { + + + + var simpleLayoutHelper = __webpack_require__(201); + module.exports = function (ecModel, api) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var layout = seriesModel.get('layout'); + if (!layout || layout === 'none') { + simpleLayoutHelper(seriesModel); + } + }); + }; + + +/***/ }, +/* 201 */ +/***/ function(module, exports) { + + + module.exports = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.type !== 'view') { + return; + } + var graph = seriesModel.getGraph(); + + graph.eachNode(function (node) { + var model = node.getModel(); + node.setLayout([+model.get('x'), +model.get('y')]); + }); + + graph.eachEdge(function (edge) { + var curveness = edge.getModel().get('lineStyle.normal.curveness') || 0; + var p1 = edge.node1.getLayout(); + var p2 = edge.node2.getLayout(); + var cp1; + if (curveness > 0) { + cp1 = [ + (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, + (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness + ]; + } + edge.setLayout([p1, p2, cp1]); + }); + }; + + +/***/ }, +/* 202 */ +/***/ function(module, exports, __webpack_require__) { + + + var circularLayoutHelper = __webpack_require__(203); + module.exports = function (ecModel, api) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + if (seriesModel.get('layout') === 'circular') { + circularLayoutHelper(seriesModel); + } + }); + }; + + +/***/ }, +/* 203 */ +/***/ function(module, exports) { + + + module.exports = function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.type !== 'view') { + return; + } + + var rect = coordSys.getBoundingRect(); + + var nodeData = seriesModel.getData(); + var graph = nodeData.graph; + + var angle = 0; + var sum = nodeData.getSum('value'); + var unitAngle = Math.PI * 2 / (sum || nodeData.count()); + + var cx = rect.width / 2 + rect.x; + var cy = rect.height / 2 + rect.y; + + var r = Math.min(rect.width, rect.height) / 2; + + graph.eachNode(function (node) { + var value = node.getValue('value'); + + angle += unitAngle * (sum ? value : 2) / 2; + + node.setLayout([ + r * Math.cos(angle) + cx, + r * Math.sin(angle) + cy + ]); + + angle += unitAngle * (sum ? value : 2) / 2; + }); + + graph.eachEdge(function (edge) { + var curveness = edge.getModel().get('lineStyle.normal.curveness') || 0; + var p1 = edge.node1.getLayout(); + var p2 = edge.node2.getLayout(); + var cp1; + if (curveness > 0) { + cp1 = [cx, cy]; + } + edge.setLayout([p1, p2, cp1]); + }); + }; + + +/***/ }, +/* 204 */ +/***/ function(module, exports, __webpack_require__) { + + + + var forceHelper = __webpack_require__(205); + var numberUtil = __webpack_require__(7); + var simpleLayoutHelper = __webpack_require__(201); + var circularLayoutHelper = __webpack_require__(203); + var vec2 = __webpack_require__(16); + + module.exports = function (ecModel, api) { + ecModel.eachSeriesByType('graph', function (graphSeries) { + if (graphSeries.get('layout') === 'force') { + var preservedPoints = graphSeries.preservedPoints || {}; + var graph = graphSeries.getGraph(); + var nodeData = graph.data; + var edgeData = graph.edgeData; + var forceModel = graphSeries.getModel('force'); + var initLayout = forceModel.get('initLayout'); + if (graphSeries.preservedPoints) { + nodeData.each(function (idx) { + var id = nodeData.getId(idx); + nodeData.setItemLayout(idx, preservedPoints[id] || [NaN, NaN]); + }); + } + else if (!initLayout || initLayout === 'none') { + simpleLayoutHelper(graphSeries); + } + else if (initLayout === 'circular') { + circularLayoutHelper(graphSeries); + } + + var nodeDataExtent = nodeData.getDataExtent('value'); + // var edgeDataExtent = edgeData.getDataExtent('value'); + var repulsion = forceModel.get('repulsion'); + var edgeLength = forceModel.get('edgeLength'); + var nodes = nodeData.mapArray('value', function (value, idx) { + var point = nodeData.getItemLayout(idx); + // var w = numberUtil.linearMap(value, nodeDataExtent, [0, 50]); + var rep = numberUtil.linearMap(value, nodeDataExtent, [0, repulsion]) || (repulsion / 2); + return { + w: rep, + rep: rep, + p: (!point || isNaN(point[0]) || isNaN(point[1])) ? null : point + }; + }); + var edges = edgeData.mapArray('value', function (value, idx) { + var edge = graph.getEdgeByIndex(idx); + // var w = numberUtil.linearMap(value, edgeDataExtent, [0, 100]); + return { + n1: nodes[edge.node1.dataIndex], + n2: nodes[edge.node2.dataIndex], + d: edgeLength, + curveness: edge.getModel().get('lineStyle.normal.curveness') || 0 + }; + }); + + var coordSys = graphSeries.coordinateSystem; + var rect = coordSys.getBoundingRect(); + var forceInstance = forceHelper(nodes, edges, { + rect: rect, + gravity: forceModel.get('gravity') + }); + var oldStep = forceInstance.step; + forceInstance.step = function (cb) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (nodes[i].fixed) { + // Write back to layout instance + vec2.copy(nodes[i].p, graph.getNodeByIndex(i).getLayout()); + } + } + oldStep(function (nodes, edges, stopped) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (!nodes[i].fixed) { + graph.getNodeByIndex(i).setLayout(nodes[i].p); + } + preservedPoints[nodeData.getId(i)] = nodes[i].p; + } + for (var i = 0, l = edges.length; i < l; i++) { + var e = edges[i]; + var p1 = e.n1.p; + var p2 = e.n2.p; + var points = [p1, p2]; + if (e.curveness > 0) { + points.push([ + (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, + (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness + ]); + } + graph.getEdgeByIndex(i).setLayout(points); + } + // Update layout + + cb && cb(stopped); + }); + }; + graphSeries.forceLayout = forceInstance; + graphSeries.preservedPoints = preservedPoints; + + // Step to get the layout + forceInstance.step(); + } + else { + // Remove prev injected forceLayout instance + graphSeries.forceLayout = null; + } + }); + }; + + +/***/ }, +/* 205 */ +/***/ function(module, exports, __webpack_require__) { + + + + var vec2 = __webpack_require__(16); + var scaleAndAdd = vec2.scaleAndAdd; + + // function adjacentNode(n, e) { + // return e.n1 === n ? e.n2 : e.n1; + // } + + module.exports = function (nodes, edges, opts) { + var rect = opts.rect; + var width = rect.width; + var height = rect.height; + var center = [rect.x + width / 2, rect.y + height / 2]; + // var scale = opts.scale || 1; + var gravity = opts.gravity == null ? 0.1 : opts.gravity; + + // for (var i = 0; i < edges.length; i++) { + // var e = edges[i]; + // var n1 = e.n1; + // var n2 = e.n2; + // n1.edges = n1.edges || []; + // n2.edges = n2.edges || []; + // n1.edges.push(e); + // n2.edges.push(e); + // } + // Init position + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + if (!n.p) { + // Use the position from first adjecent node with defined position + // Or use a random position + // From d3 + // if (n.edges) { + // var j = -1; + // while (++j < n.edges.length) { + // var e = n.edges[j]; + // var other = adjacentNode(n, e); + // if (other.p) { + // n.p = vec2.clone(other.p); + // break; + // } + // } + // } + // if (!n.p) { + n.p = vec2.create( + width * (Math.random() - 0.5) + center[0], + height * (Math.random() - 0.5) + center[1] + ); + // } + } + n.pp = vec2.clone(n.p); + n.edges = null; + } + + // Formula in 'Graph Drawing by Force-directed Placement' + // var k = scale * Math.sqrt(width * height / nodes.length); + // var k2 = k * k; + + var friction = 0.6; + + return { + warmUp: function () { + friction = 0.5; + }, + + setFixed: function (idx) { + nodes[idx].fixed = true; + }, + + setUnfixed: function (idx) { + nodes[idx].fixed = false; + }, + + step: function (cb) { + var v12 = []; + var nLen = nodes.length; + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + var n1 = e.n1; + var n2 = e.n2; + + vec2.sub(v12, n2.p, n1.p); + var d = vec2.len(v12) - e.d; + var w = n2.w / (n1.w + n2.w); + vec2.normalize(v12, v12); + + !n1.fixed && scaleAndAdd(n1.p, n1.p, v12, w * d * friction); + !n2.fixed && scaleAndAdd(n2.p, n2.p, v12, -(1 - w) * d * friction); + } + // Gravity + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + if (!n.fixed) { + vec2.sub(v12, center, n.p); + // var d = vec2.len(v12); + // vec2.scale(v12, v12, 1 / d); + // var gravityFactor = gravity; + vec2.scaleAndAdd(n.p, n.p, v12, gravity * friction); + } + } + + // Repulsive + // PENDING + for (var i = 0; i < nLen; i++) { + var n1 = nodes[i]; + for (var j = i + 1; j < nLen; j++) { + var n2 = nodes[j]; + vec2.sub(v12, n2.p, n1.p); + var d = vec2.len(v12); + if (d === 0) { + // Random repulse + vec2.set(v12, Math.random() - 0.5, Math.random() - 0.5); + d = 1; + } + var repFact = (n1.rep + n2.rep) / d / d; + !n1.fixed && scaleAndAdd(n1.pp, n1.pp, v12, repFact); + !n2.fixed && scaleAndAdd(n2.pp, n2.pp, v12, -repFact); + } + } + var v = []; + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + if (!n.fixed) { + vec2.sub(v, n.p, n.pp); + vec2.scaleAndAdd(n.p, n.p, v, friction); + vec2.copy(n.pp, n.p); + } + } + + friction = friction * 0.992; + + cb && cb(nodes, edges, friction < 0.01); + } + }; + }; + + +/***/ }, +/* 206 */ +/***/ function(module, exports, __webpack_require__) { + + + // FIXME Where to create the simple view coordinate system + var View = __webpack_require__(169); + var layout = __webpack_require__(21); + var bbox = __webpack_require__(50); + + function getViewRect(seriesModel, api, aspect) { + var option = seriesModel.getBoxLayoutParams(); + option.aspect = aspect; + return layout.getLayoutRect(option, { + width: api.getWidth(), + height: api.getHeight() + }); + } + + module.exports = function (ecModel, api) { + var viewList = []; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var coordSysType = seriesModel.get('coordinateSystem'); + if (!coordSysType || coordSysType === 'view') { + var viewCoordSys = new View(); + viewList.push(viewCoordSys); + + var data = seriesModel.getData(); + var positions = data.mapArray(function (idx) { + var itemModel = data.getItemModel(idx); + return [+itemModel.get('x'), +itemModel.get('y')]; + }); + + var min = []; + var max = []; + + bbox.fromPoints(positions, min, max); + + // FIXME If get view rect after data processed? + var viewRect = getViewRect( + seriesModel, api, (max[0] - min[0]) / (max[1] - min[1]) || 1 + ); + // Position may be NaN, use view rect instead + if (isNaN(min[0]) || isNaN(min[1])) { + min = [viewRect.x, viewRect.y]; + max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height]; + } + + var bbWidth = max[0] - min[0]; + var bbHeight = max[1] - min[1]; + + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + + viewCoordSys = seriesModel.coordinateSystem = new View(); + + viewCoordSys.setBoundingRect( + min[0], min[1], bbWidth, bbHeight + ); + viewCoordSys.setViewRect( + viewRect.x, viewRect.y, viewWidth, viewHeight + ); + + // Update roam info + var roamDetailModel = seriesModel.getModel('roamDetail'); + viewCoordSys.setPan(roamDetailModel.get('x') || 0, roamDetailModel.get('y') || 0); + viewCoordSys.setZoom(roamDetailModel.get('zoom') || 1); + } + }); + return viewList; + }; + + +/***/ }, +/* 207 */ +/***/ function(module, exports, __webpack_require__) { + + + __webpack_require__(208); + __webpack_require__(209); + + +/***/ }, +/* 208 */ +/***/ function(module, exports, __webpack_require__) { + + + + var List = __webpack_require__(94); + var SeriesModel = __webpack_require__(27); + var zrUtil = __webpack_require__(3); + + var GaugeSeries = SeriesModel.extend({ + + type: 'series.gauge', + + getInitialData: function (option, ecModel) { + var list = new List(['value'], this); + var dataOpt = option.data || []; + if (!zrUtil.isArray(dataOpt)) { + dataOpt = [dataOpt]; + } + // Only use the first data item + list.initData(dataOpt); + return list; + }, + + defaultOption: { + zlevel: 0, + z: 2, + // 默认全局居中 + center: ['50%', '50%'], + legendHoverLink: true, + radius: '75%', + startAngle: 225, + endAngle: -45, + clockwise: true, + // 最小值 + min: 0, + // 最大值 + max: 100, + // 分割段数,默认为10 + splitNumber: 10, + // 坐标轴线 + axisLine: { + // 默认显示,属性show控制显示与否 + show: true, + lineStyle: { // 属性lineStyle控制线条样式 + color: [[0.2, '#91c7ae'], [0.8, '#63869e'], [1, '#c23531']], + width: 30 + } + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性length控制线长 + length: 30, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: '#eee', + width: 2, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认不显示 + show: true, + // 每份split细分多少段 + splitNumber: 5, + // 属性length控制线长 + length: 8, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#eee', + width: 1, + type: 'solid' + } + }, + axisLabel: { + show: true, + // formatter: null, + textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: 'auto' + } + }, + pointer: { + show: true, + length: '80%', + width: 8 + }, + itemStyle: { + normal: { + color: 'auto' + } + }, + title: { + show: true, + // x, y,单位px + offsetCenter: [0, '-40%'], + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + textStyle: { + color: '#333', + fontSize: 15 + } + }, + detail: { + show: true, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 0, + borderColor: '#ccc', + width: 100, + height: 40, + // x, y,单位px + offsetCenter: [0, '40%'], + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + textStyle: { + color: 'auto', + fontSize: 30 + } + } + } + }); + + module.exports = GaugeSeries; + + +/***/ }, +/* 209 */ +/***/ function(module, exports, __webpack_require__) { + + + + var PointerPath = __webpack_require__(210); + + var graphic = __webpack_require__(42); + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + + function parsePosition(seriesModel, api) { + var center = seriesModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent(center[0], api.getWidth()); + var cy = parsePercent(center[1], api.getHeight()); + var r = parsePercent(seriesModel.get('radius'), size / 2); + + return { + cx: cx, + cy: cy, + r: r + }; + } + + function formatLabel(label, labelFormatter) { + if (labelFormatter) { + if (typeof labelFormatter === 'string') { + label = labelFormatter.replace('{value}', label); + } + else if (typeof labelFormatter === 'function') { + label = labelFormatter(label); + } + } + + return label; + } + + var PI2 = Math.PI * 2; + + var GaugeView = __webpack_require__(41).extend({ + + type: 'gauge', + + render: function (seriesModel, ecModel, api) { + + this.group.removeAll(); + + var colorList = seriesModel.get('axisLine.lineStyle.color'); + var posInfo = parsePosition(seriesModel, api); + + this._renderMain( + seriesModel, ecModel, api, colorList, posInfo + ); + }, + + _renderMain: function (seriesModel, ecModel, api, colorList, posInfo) { + var group = this.group; + + var axisLineModel = seriesModel.getModel('axisLine'); + var lineStyleModel = axisLineModel.getModel('lineStyle'); + + var clockwise = seriesModel.get('clockwise'); + var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI; + var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI; + + var angleRangeSpan = (endAngle - startAngle) % PI2; + + var prevEndAngle = startAngle; + var axisLineWidth = lineStyleModel.get('width'); + + for (var i = 0; i < colorList.length; i++) { + var endAngle = startAngle + angleRangeSpan * colorList[i][0]; + var sector = new graphic.Sector({ + shape: { + startAngle: prevEndAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: posInfo.r - axisLineWidth, + r: posInfo.r + }, + silent: true + }); + + sector.setStyle({ + fill: colorList[i][1] + }); + + sector.setStyle(lineStyleModel.getLineStyle( + // Because we use sector to simulate arc + // so the properties for stroking are useless + ['color', 'borderWidth', 'borderColor'] + )); + + group.add(sector); + + prevEndAngle = endAngle; + } + + var getColor = function (percent) { + // Less than 0 + if (percent <= 0) { + return colorList[0][1]; + } + for (var i = 0; i < colorList.length; i++) { + if (colorList[i][0] >= percent + && (i === 0 ? 0 : colorList[i - 1][0]) < percent + ) { + return colorList[i][1]; + } + } + // More than 1 + return colorList[i - 1][1]; + }; + + if (!clockwise) { + var tmp = startAngle; + startAngle = endAngle; + endAngle = tmp; + } + + this._renderTicks( + seriesModel, ecModel, api, getColor, posInfo, + startAngle, endAngle, clockwise + ); + + this._renderPointer( + seriesModel, ecModel, api, getColor, posInfo, + startAngle, endAngle, clockwise + ); + + this._renderTitle( + seriesModel, ecModel, api, getColor, posInfo + ); + this._renderDetail( + seriesModel, ecModel, api, getColor, posInfo + ); + }, + + _renderTicks: function ( + seriesModel, ecModel, api, getColor, posInfo, + startAngle, endAngle, clockwise + ) { + var group = this.group; + var cx = posInfo.cx; + var cy = posInfo.cy; + var r = posInfo.r; + + var minVal = seriesModel.get('min'); + var maxVal = seriesModel.get('max'); + + var splitLineModel = seriesModel.getModel('splitLine'); + var tickModel = seriesModel.getModel('axisTick'); + var labelModel = seriesModel.getModel('axisLabel'); + + var splitNumber = seriesModel.get('splitNumber'); + var subSplitNumber = tickModel.get('splitNumber'); + + var splitLineLen = parsePercent( + splitLineModel.get('length'), r + ); + var tickLen = parsePercent( + tickModel.get('length'), r + ); + + var angle = startAngle; + var step = (endAngle - startAngle) / splitNumber; + var subStep = step / subSplitNumber; + + var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle(); + var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle(); + var textStyleModel = labelModel.getModel('textStyle'); + + for (var i = 0; i <= splitNumber; i++) { + var unitX = Math.cos(angle); + var unitY = Math.sin(angle); + // Split line + if (splitLineModel.get('show')) { + var splitLine = new graphic.Line({ + shape: { + x1: unitX * r + cx, + y1: unitY * r + cy, + x2: unitX * (r - splitLineLen) + cx, + y2: unitY * (r - splitLineLen) + cy + }, + style: splitLineStyle, + silent: true + }); + if (splitLineStyle.stroke === 'auto') { + splitLine.setStyle({ + stroke: getColor(i / splitNumber) + }); + } + + group.add(splitLine); + } + + // Label + if (labelModel.get('show')) { + var label = formatLabel( + numberUtil.round(i / splitNumber * (maxVal - minVal) + minVal), + labelModel.get('formatter') + ); + + var text = new graphic.Text({ + style: { + text: label, + x: unitX * (r - splitLineLen - 5) + cx, + y: unitY * (r - splitLineLen - 5) + cy, + fill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont(), + textVerticalAlign: unitY < -0.4 ? 'top' : (unitY > 0.4 ? 'bottom' : 'middle'), + textAlign: unitX < -0.4 ? 'left' : (unitX > 0.4 ? 'right' : 'center') + }, + silent: true + }); + if (text.style.fill === 'auto') { + text.setStyle({ + fill: getColor(i / splitNumber) + }); + } + + group.add(text); + } + + // Axis tick + if (tickModel.get('show') && i !== splitNumber) { + for (var j = 0; j <= subSplitNumber; j++) { + var unitX = Math.cos(angle); + var unitY = Math.sin(angle); + var tickLine = new graphic.Line({ + shape: { + x1: unitX * r + cx, + y1: unitY * r + cy, + x2: unitX * (r - tickLen) + cx, + y2: unitY * (r - tickLen) + cy + }, + silent: true, + style: tickLineStyle + }); + + if (tickLineStyle.stroke === 'auto') { + tickLine.setStyle({ + stroke: getColor((i + j / subSplitNumber) / splitNumber) + }); + } + + group.add(tickLine); + angle += subStep; + } + angle -= subStep; + } + else { + angle += step; + } + } + }, + + _renderPointer: function ( + seriesModel, ecModel, api, getColor, posInfo, + startAngle, endAngle, clockwise + ) { + var linearMap = numberUtil.linearMap; + var valueExtent = [+seriesModel.get('min'), +seriesModel.get('max')]; + var angleExtent = [startAngle, endAngle]; + + if (!clockwise) { + angleExtent = angleExtent.reverse(); + } + + var data = seriesModel.getData(); + var oldData = this._data; + + var group = this.group; + + data.diff(oldData) + .add(function (idx) { + var pointer = new PointerPath({ + shape: { + angle: startAngle + } + }); + + graphic.updateProps(pointer, { + shape: { + angle: linearMap(data.get('value', idx), valueExtent, angleExtent) + } + }, seriesModel); + + group.add(pointer); + data.setItemGraphicEl(idx, pointer); + }) + .update(function (newIdx, oldIdx) { + var pointer = oldData.getItemGraphicEl(oldIdx); + + graphic.updateProps(pointer, { + shape: { + angle: linearMap(data.get('value', newIdx), valueExtent, angleExtent) + } + }, seriesModel); + + group.add(pointer); + data.setItemGraphicEl(newIdx, pointer); + }) + .remove(function (idx) { + var pointer = oldData.getItemGraphicEl(idx); + group.remove(pointer); + }) + .execute(); + + data.eachItemGraphicEl(function (pointer, idx) { + var itemModel = data.getItemModel(idx); + var pointerModel = itemModel.getModel('pointer'); + + pointer.attr({ + shape: { + x: posInfo.cx, + y: posInfo.cy, + width: parsePercent( + pointerModel.get('width'), posInfo.r + ), + r: parsePercent(pointerModel.get('length'), posInfo.r) + }, + style: itemModel.getModel('itemStyle.normal').getItemStyle() + }); + + if (pointer.style.fill === 'auto') { + pointer.setStyle('fill', getColor( + (data.get('value', idx) - valueExtent[0]) / (valueExtent[1] - valueExtent[0]) + )); + } + + graphic.setHoverStyle( + pointer, itemModel.getModel('itemStyle.emphasis').getItemStyle() + ); + }); + + this._data = data; + }, + + _renderTitle: function ( + seriesModel, ecModel, api, getColor, posInfo + ) { + var titleModel = seriesModel.getModel('title'); + if (titleModel.get('show')) { + var textStyleModel = titleModel.getModel('textStyle'); + var offsetCenter = titleModel.get('offsetCenter'); + var x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r); + var y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r); + var text = new graphic.Text({ + style: { + x: x, + y: y, + // FIXME First data name ? + text: seriesModel.getData().getName(0), + fill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont(), + textAlign: 'center', + textVerticalAlign: 'middle' + } + }); + this.group.add(text); + } + }, + + _renderDetail: function ( + seriesModel, ecModel, api, getColor, posInfo + ) { + var detailModel = seriesModel.getModel('detail'); + var minVal = seriesModel.get('min'); + var maxVal = seriesModel.get('max'); + if (detailModel.get('show')) { + var textStyleModel = detailModel.getModel('textStyle'); + var offsetCenter = detailModel.get('offsetCenter'); + var x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r); + var y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r); + var width = parsePercent(detailModel.get('width'), posInfo.r); + var height = parsePercent(detailModel.get('height'), posInfo.r); + var value = seriesModel.getData().get('value', 0); + var rect = new graphic.Rect({ + shape: { + x: x - width / 2, + y: y - height / 2, + width: width, + height: height + }, + style: { + text: formatLabel( + // FIXME First data name ? + value, detailModel.get('formatter') + ), + fill: detailModel.get('backgroundColor'), + textFill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont() + } + }); + if (rect.style.textFill === 'auto') { + rect.setStyle('textFill', getColor((value - minVal) / (maxVal - minVal))); + } + rect.setStyle(detailModel.getItemStyle(['color'])); + this.group.add(rect); + } + } + }); + + module.exports = GaugeView; + + +/***/ }, +/* 210 */ +/***/ function(module, exports, __webpack_require__) { + + + + module.exports = __webpack_require__(44).extend({ + + type: 'echartsGaugePointer', + + shape: { + angle: 0, + + width: 10, + + r: 10, + + x: 0, + + y: 0 + }, + + buildPath: function (ctx, shape) { + var mathCos = Math.cos; + var mathSin = Math.sin; + + var r = shape.r; + var width = shape.width; + var angle = shape.angle; + var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2); + var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2); + + angle = shape.angle - Math.PI / 2; + ctx.moveTo(x, y); + ctx.lineTo( + shape.x + mathCos(angle) * width, + shape.y + mathSin(angle) * width + ); + ctx.lineTo( + shape.x + mathCos(shape.angle) * r, + shape.y + mathSin(shape.angle) * r + ); + ctx.lineTo( + shape.x - mathCos(angle) * width, + shape.y - mathSin(angle) * width + ); + ctx.lineTo(x, y); + return; + } + }); + + +/***/ }, +/* 211 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(212); + __webpack_require__(213); + + echarts.registerVisualCoding( + 'chart', zrUtil.curry(__webpack_require__(137), 'funnel') + ); + echarts.registerLayout(__webpack_require__(214)); + + echarts.registerProcessor( + 'filter', zrUtil.curry(__webpack_require__(140), 'funnel') + ); + + +/***/ }, +/* 212 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var modelUtil = __webpack_require__(5); + var completeDimensions = __webpack_require__(96); + + var FunnelSeries = __webpack_require__(1).extendSeriesModel({ + + type: 'series.funnel', + + init: function (option) { + FunnelSeries.superApply(this, 'init', arguments); + + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this._dataBeforeProcessed; + }; + // Extend labelLine emphasis + this._defaultLabelLine(option); + }, + + getInitialData: function (option, ecModel) { + var dimensions = completeDimensions(['value'], option.data); + var list = new List(dimensions, this); + list.initData(option.data); + return list; + }, + + _defaultLabelLine: function (option) { + // Extend labelLine emphasis + modelUtil.defaultEmphasis(option.labelLine, ['show']); + + var labelLineNormalOpt = option.labelLine.normal; + var labelLineEmphasisOpt = option.labelLine.emphasis; + // Not show label line if `label.normal.show = false` + labelLineNormalOpt.show = labelLineNormalOpt.show + && option.label.normal.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show + && option.label.emphasis.show; + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + legendHoverLink: true, + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + + // 默认取数据最小最大值 + // min: 0, + // max: 100, + minSize: '0%', + maxSize: '100%', + sort: 'descending', // 'ascending', 'descending' + gap: 0, + funnelAlign: 'center', + label: { + normal: { + show: true, + position: 'outer' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + }, + emphasis: { + show: true + } + }, + labelLine: { + normal: { + show: true, + length: 20, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + }, + emphasis: {} + }, + itemStyle: { + normal: { + // color: 各异, + borderColor: '#fff', + borderWidth: 1 + }, + emphasis: { + // color: 各异, + } + } + } + }); + + module.exports = FunnelSeries; + + +/***/ }, +/* 213 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + /** + * Piece of pie including Sector, Label, LabelLine + * @constructor + * @extends {module:zrender/graphic/Group} + */ + function FunnelPiece(data, idx) { + + graphic.Group.call(this); + + var polygon = new graphic.Polygon(); + var labelLine = new graphic.Polyline(); + var text = new graphic.Text(); + this.add(polygon); + this.add(labelLine); + this.add(text); + + this.updateData(data, idx, true); + + // Hover to change label and labelLine + function onEmphasis() { + labelLine.ignore = labelLine.hoverIgnore; + text.ignore = text.hoverIgnore; + } + function onNormal() { + labelLine.ignore = labelLine.normalIgnore; + text.ignore = text.normalIgnore; + } + this.on('emphasis', onEmphasis) + .on('normal', onNormal) + .on('mouseover', onEmphasis) + .on('mouseout', onNormal); + } + + var funnelPieceProto = FunnelPiece.prototype; + + function getLabelStyle(data, idx, state, labelModel) { + var textStyleModel = labelModel.getModel('textStyle'); + var position = labelModel.get('position'); + var isLabelInside = position === 'inside' || position === 'inner' || position === 'center'; + return { + fill: textStyleModel.getTextColor() + || (isLabelInside ? '#fff' : data.getItemVisual(idx, 'color')), + textFont: textStyleModel.getFont(), + text: zrUtil.retrieve( + data.hostModel.getFormattedLabel(idx, state), + data.getName(idx) + ) + }; + } + + var opacityAccessPath = ['itemStyle', 'normal', 'opacity']; + funnelPieceProto.updateData = function (data, idx, firstCreate) { + + var polygon = this.childAt(0); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var opacity = data.getItemModel(idx).get(opacityAccessPath); + opacity = opacity == null ? 1 : opacity; + if (firstCreate) { + polygon.setShape({ + points: layout.points + }); + polygon.setStyle({ opacity : 0 }); + graphic.updateProps(polygon, { + style: { + opacity: opacity + } + }, seriesModel); + } + else { + graphic.initProps(polygon, { + shape: { + points: layout.points + } + }, seriesModel); + } + + // Update common style + var itemStyleModel = itemModel.getModel('itemStyle'); + var visualColor = data.getItemVisual(idx, 'color'); + + polygon.setStyle( + zrUtil.defaults( + { + fill: visualColor + }, + itemStyleModel.getModel('normal').getItemStyle() + ) + ); + polygon.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle(); + + this._updateLabel(data, idx); + + graphic.setHoverStyle(this); + }; + + funnelPieceProto._updateLabel = function (data, idx) { + + var labelLine = this.childAt(1); + var labelText = this.childAt(2); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var visualColor = data.getItemVisual(idx, 'color'); + + graphic.updateProps(labelLine, { + shape: { + points: labelLayout.linePoints || labelLayout.linePoints + } + }, seriesModel); + + graphic.updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel); + labelText.attr({ + style: { + textAlign: labelLayout.textAlign, + textVerticalAlign: labelLayout.verticalAlign, + textFont: labelLayout.font + }, + rotation: labelLayout.rotation, + origin: [labelLayout.x, labelLayout.y], + z2: 10 + }); + + var labelModel = itemModel.getModel('label.normal'); + var labelHoverModel = itemModel.getModel('label.emphasis'); + var labelLineModel = itemModel.getModel('labelLine.normal'); + var labelLineHoverModel = itemModel.getModel('labelLine.emphasis'); + + labelText.setStyle(getLabelStyle(data, idx, 'normal', labelModel)); + + labelText.ignore = labelText.normalIgnore = !labelModel.get('show'); + labelText.hoverIgnore = !labelHoverModel.get('show'); + + labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show'); + labelLine.hoverIgnore = !labelLineHoverModel.get('show'); + + // Default use item visual color + labelLine.setStyle({ + stroke: visualColor + }); + labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle()); + + labelText.hoverStyle = getLabelStyle(data, idx, 'emphasis', labelHoverModel); + labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle(); + }; + + zrUtil.inherits(FunnelPiece, graphic.Group); + + + var Funnel = __webpack_require__(41).extend({ + + type: 'funnel', + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var oldData = this._data; + + var group = this.group; + + data.diff(oldData) + .add(function (idx) { + var funnelPiece = new FunnelPiece(data, idx); + + data.setItemGraphicEl(idx, funnelPiece); + + group.add(funnelPiece); + }) + .update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + + piePiece.updateData(data, newIdx); + + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }) + .remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + group.remove(piePiece); + }) + .execute(); + + this._data = data; + }, + + remove: function () { + this.group.removeAll(); + this._data = null; + } + }); + + module.exports = Funnel; + + +/***/ }, +/* 214 */ +/***/ function(module, exports, __webpack_require__) { + + + + var layout = __webpack_require__(21); + var number = __webpack_require__(7); + + var parsePercent = number.parsePercent; + + function getViewRect(seriesModel, api) { + return layout.getLayoutRect( + seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + } + ); + } + + function getSortedIndices(data, sort) { + var valueArr = data.mapArray('value', function (val) { + return val; + }); + var indices = []; + var isAscending = sort === 'ascending'; + for (var i = 0, len = data.count(); i < len; i++) { + indices[i] = i; + } + indices.sort(function (a, b) { + return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a]; + }); + return indices; + } + + function labelLayout (data) { + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label.normal'); + var labelPosition = labelModel.get('position'); + + var labelLineModel = itemModel.getModel('labelLine.normal'); + + var layout = data.getItemLayout(idx); + var points = layout.points; + + var isLabelInside = labelPosition === 'inner' + || labelPosition === 'inside' || labelPosition === 'center'; + + var textAlign; + var textX; + var textY; + var linePoints; + + if (isLabelInside) { + textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4; + textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4; + textAlign = 'center'; + linePoints = [ + [textX, textY], [textX, textY] + ]; + } + else { + var x1; + var y1; + var x2; + var labelLineLen = labelLineModel.get('length'); + if (labelPosition === 'left') { + // Left side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + else { + // Right side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } + var y2 = y1; + + linePoints = [[x1, y1], [x2, y2]]; + textY = y2; + } + + layout.label = { + linePoints: linePoints, + x: textX, + y: textY, + verticalAlign: 'middle', + textAlign: textAlign, + inside: isLabelInside + }; + }); + } + + module.exports = function (ecModel, api) { + ecModel.eachSeriesByType('funnel', function (seriesModel) { + var data = seriesModel.getData(); + var sort = seriesModel.get('sort'); + var viewRect = getViewRect(seriesModel, api); + var indices = getSortedIndices(data, sort); + + var sizeExtent = [ + parsePercent(seriesModel.get('minSize'), viewRect.width), + parsePercent(seriesModel.get('maxSize'), viewRect.width) + ]; + var dataExtent = data.getDataExtent('value'); + var min = seriesModel.get('min'); + var max = seriesModel.get('max'); + if (min == null) { + min = Math.min(dataExtent[0], 0); + } + if (max == null) { + max = dataExtent[1]; + } + + var funnelAlign = seriesModel.get('funnelAlign'); + var gap = seriesModel.get('gap'); + var itemHeight = (viewRect.height - gap * (data.count() - 1)) / data.count(); + + var y = viewRect.y; + + var getLinePoints = function (idx, offY) { + // End point index is data.count() and we assign it 0 + var val = data.get('value', idx) || 0; + var itemWidth = number.linearMap(val, [min, max], sizeExtent, true); + var x0; + switch (funnelAlign) { + case 'left': + x0 = viewRect.x; + break; + case 'center': + x0 = viewRect.x + (viewRect.width - itemWidth) / 2; + break; + case 'right': + x0 = viewRect.x + viewRect.width - itemWidth; + break; + } + return [ + [x0, offY], + [x0 + itemWidth, offY] + ]; + }; + + if (sort === 'ascending') { + // From bottom to top + itemHeight = -itemHeight; + gap = -gap; + y += viewRect.height; + indices = indices.reverse(); + } + + for (var i = 0; i < indices.length; i++) { + var idx = indices[i]; + var nextIdx = indices[i + 1]; + var start = getLinePoints(idx, y); + var end = getLinePoints(nextIdx, y + itemHeight); + + y += itemHeight + gap; + + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } + + labelLayout(data); + }); + }; + + +/***/ }, +/* 215 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + + __webpack_require__(216); + + __webpack_require__(227); + __webpack_require__(228); + + echarts.registerVisualCoding('chart', __webpack_require__(229)); + + + +/***/ }, +/* 216 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(217); + __webpack_require__(220); + __webpack_require__(222); + + var echarts = __webpack_require__(1); + + // Parallel view + echarts.extendComponentView({ + type: 'parallel' + }); + + echarts.registerPreprocessor( + __webpack_require__(226) + ); + + + +/***/ }, +/* 217 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Parallel coordinate system creater. + */ + + + var Parallel = __webpack_require__(218); + + function create(ecModel, api) { + var coordSysList = []; + + ecModel.eachComponent('parallel', function (parallelModel, idx) { + var coordSys = new Parallel(parallelModel, ecModel, api); + + coordSys.name = 'parallel_' + idx; + coordSys.resize(parallelModel, api); + + parallelModel.coordinateSystem = coordSys; + coordSys.model = parallelModel; + + coordSysList.push(coordSys); + }); + + // Inject the coordinateSystems into seriesModel + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'parallel') { + var parallelIndex = seriesModel.get('parallelIndex'); + seriesModel.coordinateSystem = coordSysList[parallelIndex]; + } + }); + + return coordSysList; + } + + __webpack_require__(25).register('parallel', {create: create}); + + + +/***/ }, +/* 218 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Parallel Coordinates + * + */ + + + var layout = __webpack_require__(21); + var axisHelper = __webpack_require__(108); + var zrUtil = __webpack_require__(3); + var ParallelAxis = __webpack_require__(219); + var matrix = __webpack_require__(17); + var vector = __webpack_require__(16); + + var each = zrUtil.each; + + var PI = Math.PI; + + function Parallel(parallelModel, ecModel, api) { + + /** + * key: dimension + * @type {Object.} + * @private + */ + this._axesMap = {}; + + /** + * key: dimension + * value: {position: [], rotation, } + * @type {Object.} + * @private + */ + this._axesLayout = {}; + + /** + * Always follow axis order. + * @type {Array.} + * @readOnly + */ + this.dimensions = parallelModel.dimensions; + + /** + * @type {module:zrender/core/BoundingRect} + */ + this._rect; + + /** + * @type {module:echarts/coord/parallel/ParallelModel} + */ + this._model = parallelModel; + + this._init(parallelModel, ecModel, api); + } + + Parallel.prototype = { + + type: 'parallel', + + constructor: Parallel, + + /** + * Initialize cartesian coordinate systems + * @private + */ + _init: function (parallelModel, ecModel, api) { + + var dimensions = parallelModel.dimensions; + var parallelAxisIndex = parallelModel.parallelAxisIndex; + + each(dimensions, function (dim, idx) { + + var axisIndex = parallelAxisIndex[idx]; + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + + var axis = this._axesMap[dim] = new ParallelAxis( + dim, + axisHelper.createScaleByModel(axisModel), + [0, 0], + axisModel.get('type'), + axisIndex + ); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + + // Inject axis into axisModel + axisModel.axis = axis; + + // Inject axisModel into axis + axis.model = axisModel; + }, this); + }, + + /** + * Update axis scale after data processed + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + update: function (ecModel, api) { + this._updateAxesFromSeries(this._model, ecModel); + }, + + /** + * Update properties from series + * @private + */ + _updateAxesFromSeries: function (parallelModel, ecModel) { + ecModel.eachSeries(function (seriesModel) { + + if (!parallelModel.contains(seriesModel, ecModel)) { + return; + } + + var data = seriesModel.getData(); + + each(this.dimensions, function (dim) { + var axis = this._axesMap[dim]; + axis.scale.unionExtent(data.getDataExtent(dim)); + axisHelper.niceScaleExtent(axis, axis.model); + }, this); + }, this); + }, + + /** + * Resize the parallel coordinate system. + * @param {module:echarts/coord/parallel/ParallelModel} parallelModel + * @param {module:echarts/ExtensionAPI} api + */ + resize: function (parallelModel, api) { + this._rect = layout.getLayoutRect( + parallelModel.getBoxLayoutParams(), + { + width: api.getWidth(), + height: api.getHeight() + } + ); + + this._layoutAxes(parallelModel); + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getRect: function () { + return this._rect; + }, + + /** + * @private + */ + _layoutAxes: function (parallelModel) { + var rect = this._rect; + var layout = parallelModel.get('layout'); + var axes = this._axesMap; + var dimensions = this.dimensions; + + var size = [rect.width, rect.height]; + var sizeIdx = layout === 'horizontal' ? 0 : 1; + var layoutLength = size[sizeIdx]; + var axisLength = size[1 - sizeIdx]; + var axisExtent = [0, axisLength]; + + each(axes, function (axis) { + var idx = axis.inverse ? 1 : 0; + axis.setExtent(axisExtent[idx], axisExtent[1 - idx]); + }); + + each(dimensions, function (dim, idx) { + var pos = layoutLength * idx / (dimensions.length - 1); + + var positionTable = { + horizontal: { + x: pos, + y: axisLength + }, + vertical: { + x: 0, + y: pos + } + }; + var rotationTable = { + horizontal: PI / 2, + vertical: 0 + }; + + var position = [ + positionTable[layout].x + rect.x, + positionTable[layout].y + rect.y + ]; + + var rotation = rotationTable[layout]; + var transform = matrix.create(); + matrix.rotate(transform, transform, rotation); + matrix.translate(transform, transform, position); + + // TODO + // tick等排布信息。 + + // TODO + // 根据axis order 更新 dimensions顺序。 + + this._axesLayout[dim] = { + position: position, + rotation: rotation, + transform: transform, + tickDirection: 1, + labelDirection: 1 + }; + }, this); + }, + + /** + * Get axis by dim. + * @param {string} dim + * @return {module:echarts/coord/parallel/ParallelAxis} [description] + */ + getAxis: function (dim) { + return this._axesMap[dim]; + }, + + /** + * Convert a dim value of a single item of series data to Point. + * @param {*} value + * @param {string} dim + * @return {Array} + */ + dataToPoint: function (value, dim) { + return this.axisCoordToPoint( + this._axesMap[dim].dataToCoord(value), + dim + ); + }, + + /** + * @param {module:echarts/data/List} data + * @param {Functio} cb param: {string} activeState 'active' or 'inactive' or 'normal' + * {number} dataIndex + * @param {Object} context + */ + eachActiveState: function (data, callback, context) { + var dimensions = this.dimensions; + var axesMap = this._axesMap; + var hasActiveSet = false; + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + if (axesMap[dimensions[j]].model.getActiveState() !== 'normal') { + hasActiveSet = true; + } + } + + for (var i = 0, len = data.count(); i < len; i++) { + var values = data.getValues(dimensions, i); + var activeState; + + if (!hasActiveSet) { + activeState = 'normal'; + } + else { + activeState = 'active'; + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + var dimName = dimensions[j]; + var state = axesMap[dimName].model.getActiveState(values[j], j); + + if (state === 'inactive') { + activeState = 'inactive'; + break; + } + } + } + + callback.call(context, activeState, i); + } + }, + + /** + * Convert coords of each axis to Point. + * Return point. For example: [10, 20] + * @param {Array.} coords + * @param {string} dim + * @return {Array.} + */ + axisCoordToPoint: function (coord, dim) { + var axisLayout = this._axesLayout[dim]; + var point = [coord, 0]; + vector.applyTransform(point, point, axisLayout.transform); + return point; + }, + + /** + * Get axis layout. + */ + getAxisLayout: function (dim) { + return zrUtil.clone(this._axesLayout[dim]); + } + + }; + + module.exports = Parallel; + + +/***/ }, +/* 219 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var Axis = __webpack_require__(117); + + /** + * @constructor module:echarts/coord/parallel/ParallelAxis + * @extends {module:echarts/coord/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.} coordExtent + * @param {string} axisType + */ + var ParallelAxis = function (dim, scale, coordExtent, axisType, axisIndex) { + + Axis.call(this, dim, scale, coordExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * @type {number} + * @readOnly + */ + this.axisIndex = axisIndex; + }; + + ParallelAxis.prototype = { + + constructor: ParallelAxis, + + /** + * Axis model + * @param {module:echarts/coord/parallel/AxisModel} + */ + model: null + + }; + + zrUtil.inherits(ParallelAxis, Axis); + + module.exports = ParallelAxis; + + +/***/ }, +/* 220 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var Component = __webpack_require__(19); + + __webpack_require__(221); + + Component.extend({ + + type: 'parallel', + + dependencies: ['parallelAxis'], + + /** + * @type {module:echarts/coord/parallel/Parallel} + */ + coordinateSystem: null, + + /** + * Each item like: 'dim0', 'dim1', 'dim2', ... + * @type {Array.} + * @readOnly + */ + dimensions: null, + + /** + * Coresponding to dimensions. + * @type {Array.} + * @readOnly + */ + parallelAxisIndex: null, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 0, // 二级层叠 + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + + layout: 'horizontal', // 'horizontal' or 'vertical' + + parallelAxisDefault: null + }, + + /** + * @override + */ + init: function () { + Component.prototype.init.apply(this, arguments); + + this.mergeOption({}); + }, + + /** + * @override + */ + mergeOption: function (newOption) { + var thisOption = this.option; + + newOption && zrUtil.merge(thisOption, newOption, true); + + this._initDimensions(); + }, + + /** + * Whether series or axis is in this coordinate system. + * @param {module:echarts/model/Series|module:echarts/coord/parallel/AxisModel} model + * @param {module:echarts/model/Global} ecModel + */ + contains: function (model, ecModel) { + var parallelIndex = model.get('parallelIndex'); + return parallelIndex != null + && ecModel.getComponent('parallel', parallelIndex) === this; + }, + + /** + * @private + */ + _initDimensions: function () { + var dimensions = this.dimensions = []; + var parallelAxisIndex = this.parallelAxisIndex = []; + + var axisModels = zrUtil.filter(this.dependentModels.parallelAxis, function (axisModel) { + // Can not use this.contains here, because + // initialization has not been completed yet. + return axisModel.get('parallelIndex') === this.componentIndex; + }); + + zrUtil.each(axisModels, function (axisModel) { + dimensions.push('dim' + axisModel.get('dim')); + parallelAxisIndex.push(axisModel.componentIndex); + }); + } + + }); + + + +/***/ }, +/* 221 */ +/***/ function(module, exports, __webpack_require__) { + + + + var ComponentModel = __webpack_require__(19); + var zrUtil = __webpack_require__(3); + var makeStyleMapper = __webpack_require__(11); + var axisModelCreator = __webpack_require__(121); + var numberUtil = __webpack_require__(7); + + var AxisModel = ComponentModel.extend({ + + type: 'baseParallelAxis', + + /** + * @type {module:echarts/coord/parallel/Axis} + */ + axis: null, + + /** + * @type {Array.} + * @readOnly + */ + activeIntervals: [], + + /** + * @return {Object} + */ + getAreaSelectStyle: function () { + return makeStyleMapper( + [ + ['fill', 'color'], + ['lineWidth', 'borderWidth'], + ['stroke', 'borderColor'], + ['width', 'width'], + ['opacity', 'opacity'] + ] + ).call(this.getModel('areaSelectStyle')); + }, + + /** + * The code of this feature is put on AxisModel but not ParallelAxis, + * because axisModel can be alive after echarts updating but instance of + * ParallelAxis having been disposed. this._activeInterval should be kept + * when action dispatched (i.e. legend click). + * + * @param {Array.>} intervals interval.length === 0 + * means set all active. + * @public + */ + setActiveIntervals: function (intervals) { + var activeIntervals = this.activeIntervals = zrUtil.clone(intervals); + + // Normalize + if (activeIntervals) { + for (var i = activeIntervals.length - 1; i >= 0; i--) { + numberUtil.asc(activeIntervals[i]); + } + } + }, + + /** + * @param {number|string} [value] When attempting to detect 'no activeIntervals set', + * value can not be input. + * @return {string} 'normal': no activeIntervals set, + * 'active', + * 'inactive'. + * @public + */ + getActiveState: function (value) { + var activeIntervals = this.activeIntervals; + + if (!activeIntervals.length) { + return 'normal'; + } + + if (value == null) { + return 'inactive'; + } + + for (var i = 0, len = activeIntervals.length; i < len; i++) { + if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) { + return 'active'; + } + } + return 'inactive'; + } + + }); + + var defaultOption = { + + type: 'value', + + /** + * @type {Array.} + */ + dim: null, // 0, 1, 2, ... + + parallelIndex: null, + + areaSelectStyle: { + width: 20, + borderWidth: 1, + borderColor: 'rgba(160,197,232)', + color: 'rgba(160,197,232)', + opacity: 0.3 + }, + + z: 10 + }; + + zrUtil.merge(AxisModel.prototype, __webpack_require__(123)); + + function getAxisType(axisName, option) { + return option.type || (option.data ? 'category' : 'value'); + } + + axisModelCreator('parallel', AxisModel, getAxisType, defaultOption); + + module.exports = AxisModel; + + +/***/ }, +/* 222 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(217); + __webpack_require__(223); + __webpack_require__(224); + + + +/***/ }, +/* 223 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + + var actionInfo = { + type: 'axisAreaSelect', + event: 'axisAreaSelected', + update: 'updateVisual' + }; + + /** + * @payload + * @property {string} parallelAxisId + * @property {Array.>} intervals + */ + echarts.registerAction(actionInfo, function (payload, ecModel) { + ecModel.eachComponent( + {mainType: 'parallelAxis', query: payload}, + function (parallelAxisModel) { + parallelAxisModel.axis.model.setActiveIntervals(payload.intervals); + } + ); + + }); + + +/***/ }, +/* 224 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var AxisBuilder = __webpack_require__(126); + var SelectController = __webpack_require__(225); + + var elementList = ['axisLine', 'axisLabel', 'axisTick', 'axisName']; + + var AxisView = __webpack_require__(1).extendComponentView({ + + type: 'parallelAxis', + + /** + * @type {module:echarts/component/helper/SelectController} + */ + _selectController: null, + + /** + * @override + */ + render: function (axisModel, ecModel, api, payload) { + if (fromAxisAreaSelect(axisModel, ecModel, payload)) { + return; + } + + this.axisModel = axisModel; + this.api = api; + + this.group.removeAll(); + + if (!axisModel.get('show')) { + return; + } + + var coordSys = ecModel.getComponent( + 'parallel', axisModel.get('parallelIndex') + ).coordinateSystem; + + var areaSelectStyle = axisModel.getAreaSelectStyle(); + var areaWidth = areaSelectStyle.width; + + var axisLayout = coordSys.getAxisLayout(axisModel.axis.dim); + var builderOpt = zrUtil.extend( + { + strokeContainThreshold: areaWidth, + // lineWidth === 0 or no value. + silent: !(areaWidth > 0) // jshint ignore:line + }, + axisLayout + ); + + var axisBuilder = new AxisBuilder(axisModel, builderOpt); + + zrUtil.each(elementList, axisBuilder.add, axisBuilder); + + var axisGroup = axisBuilder.getGroup(); + + this.group.add(axisGroup); + + this._buildSelectController( + axisGroup, areaSelectStyle, axisModel, api + ); + }, + + _buildSelectController: function (axisGroup, areaSelectStyle, axisModel, api) { + + var axis = axisModel.axis; + var selectController = this._selectController; + + if (!selectController) { + selectController = this._selectController = new SelectController( + 'line', + api.getZr(), + areaSelectStyle + ); + + selectController.on('selected', zrUtil.bind(this._onSelected, this)); + } + + selectController.enable(axisGroup); + + // After filtering, axis may change, select area needs to be update. + var ranges = zrUtil.map(axisModel.activeIntervals, function (interval) { + return [ + axis.dataToCoord(interval[0], true), + axis.dataToCoord(interval[1], true) + ]; + }); + selectController.update(ranges); + }, + + _onSelected: function (ranges) { + // Do not cache these object, because the mey be changed. + var axisModel = this.axisModel; + var axis = axisModel.axis; + + var intervals = zrUtil.map(ranges, function (range) { + return [ + axis.coordToData(range[0], true), + axis.coordToData(range[1], true) + ]; + }); + this.api.dispatchAction({ + type: 'axisAreaSelect', + parallelAxisId: axisModel.id, + intervals: intervals + }); + }, + + /** + * @override + */ + remove: function () { + this._selectController && this._selectController.disable(); + }, + + /** + * @override + */ + dispose: function () { + if (this._selectController) { + this._selectController.dispose(); + this._selectController = null; + } + } + }); + + function fromAxisAreaSelect(axisModel, ecModel, payload) { + return payload + && payload.type === 'axisAreaSelect' + && ecModel.findComponents( + {mainType: 'parallelAxis', query: payload} + )[0] === axisModel; + } + + module.exports = AxisView; + + +/***/ }, +/* 225 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Box selection tool. + * + * @module echarts/component/helper/SelectController + */ + + + + var Eventful = __webpack_require__(32); + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var bind = zrUtil.bind; + var each = zrUtil.each; + var mathMin = Math.min; + var mathMax = Math.max; + var mathPow = Math.pow; + + var COVER_Z = 10000; + var UNSELECT_THRESHOLD = 2; + var EVENTS = ['mousedown', 'mousemove', 'mouseup']; + + /** + * @alias module:echarts/component/helper/SelectController + * @constructor + * @mixin {module:zrender/mixin/Eventful} + * + * @param {string} type 'line', 'rect' + * @param {module:zrender/zrender~ZRender} zr + * @param {Object} [opt] + * @param {number} [opt.width] + * @param {number} [opt.lineWidth] + * @param {string} [opt.stroke] + * @param {string} [opt.fill] + */ + function SelectController(type, zr, opt) { + + Eventful.call(this); + + /** + * @type {string} + * @readOnly + */ + this.type = type; + + /** + * @type {module:zrender/zrender~ZRender} + */ + this.zr = zr; + + /** + * @type {Object} + * @readOnly + */ + this.opt = zrUtil.clone(opt); + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new graphic.Group(); + + /** + * @type {module:zrender/core/BoundingRect} + */ + this._containerRect = null; + + /** + * @type {Array.} + * @private + */ + this._track = []; + + /** + * @type {boolean} + */ + this._dragging; + + /** + * @type {module:zrender/Element} + * @private + */ + this._cover; + + /** + * @type {boolean} + * @private + */ + this._disabled = true; + + /** + * @type {Object} + * @private + */ + this._handlers = { + mousedown: bind(mousedown, this), + mousemove: bind(mousemove, this), + mouseup: bind(mouseup, this) + }; + + each(EVENTS, function (eventName) { + this.zr.on(eventName, this._handlers[eventName]); + }, this); + } + + SelectController.prototype = { + + constructor: SelectController, + + /** + * @param {module:zrender/mixin/Transformable} container + * @param {module:zrender/core/BoundingRect|boolean} [rect] If not specified, + * use container.getBoundingRect(). + * If false, do not use containerRect. + */ + enable: function (container, rect) { + + this._disabled = false; + + // Remove from old container. + removeGroup.call(this); + + // boundingRect will change when dragging, so we have + // to keep initial boundingRect. + this._containerRect = rect !== false + ? (rect || container.getBoundingRect()) : null; + + // Add to new container. + container.add(this.group); + }, + + /** + * Update cover location. + * @param {Array.|Object} ranges If null/undefined, remove cover. + */ + update: function (ranges) { + // TODO + // Only support one interval yet. + renderCover.call(this, ranges && zrUtil.clone(ranges)); + }, + + disable: function () { + this._disabled = true; + + removeGroup.call(this); + }, + + dispose: function () { + this.disable(); + + each(EVENTS, function (eventName) { + this.zr.off(eventName, this._handlers[eventName]); + }, this); + } + }; + + + zrUtil.mixin(SelectController, Eventful); + + function updateZ(group) { + group.traverse(function (el) { + el.z = COVER_Z; + }); + } + + function isInContainer(x, y) { + var localPos = this.group.transformCoordToLocal(x, y); + return !this._containerRect + || this._containerRect.contain(localPos[0], localPos[1]); + } + + function preventDefault(e) { + var rawE = e.event; + rawE.preventDefault && rawE.preventDefault(); + } + + function mousedown(e) { + if (this._disabled || (e.target && e.target.draggable)) { + return; + } + + preventDefault(e); + + var x = e.offsetX; + var y = e.offsetY; + + if (isInContainer.call(this, x, y)) { + this._dragging = true; + this._track = [[x, y]]; + } + } + + function mousemove(e) { + if (!this._dragging || this._disabled) { + return; + } + + preventDefault(e); + + updateViewByCursor.call(this, e); + } + + function mouseup(e) { + if (!this._dragging || this._disabled) { + return; + } + + preventDefault(e); + + updateViewByCursor.call(this, e, true); + + this._dragging = false; + this._track = []; + } + + function updateViewByCursor(e, isEnd) { + var x = e.offsetX; + var y = e.offsetY; + + if (isInContainer.call(this, x, y)) { + this._track.push([x, y]); + + // Create or update cover. + var ranges = shouldShowCover.call(this) + ? coverRenderers[this.type].getRanges.call(this) + // Remove cover. + : []; + + renderCover.call(this, ranges); + + this.trigger('selected', zrUtil.clone(ranges)); + + if (isEnd) { + this.trigger('selectEnd', zrUtil.clone(ranges)); + } + } + } + + function shouldShowCover() { + var track = this._track; + + if (!track.length) { + return false; + } + + var p2 = track[track.length - 1]; + var p1 = track[0]; + var dx = p2[0] - p1[0]; + var dy = p2[1] - p1[1]; + var dist = mathPow(dx * dx + dy * dy, 0.5); + + return dist > UNSELECT_THRESHOLD; + } + + function renderCover(ranges) { + var coverRenderer = coverRenderers[this.type]; + + if (ranges && ranges.length) { + if (!this._cover) { + this._cover = coverRenderer.create.call(this); + this.group.add(this._cover); + } + coverRenderer.update.call(this, ranges); + } + else { + this.group.remove(this._cover); + this._cover = null; + } + + updateZ(this.group); + } + + function removeGroup() { + // container may 'removeAll' outside. + var group = this.group; + var container = group.parent; + if (container) { + container.remove(group); + } + } + + function createRectCover() { + var opt = this.opt; + return new graphic.Rect({ + // FIXME + // customize style. + style: { + stroke: opt.stroke, + fill: opt.fill, + lineWidth: opt.lineWidth, + opacity: opt.opacity + } + }); + } + + function getLocalTrack() { + return zrUtil.map(this._track, function (point) { + return this.group.transformCoordToLocal(point[0], point[1]); + }, this); + } + + function getLocalTrackEnds() { + var localTrack = getLocalTrack.call(this); + var tail = localTrack.length - 1; + tail < 0 && (tail = 0); + return [localTrack[0], localTrack[tail]]; + } + + /** + * key: this.type + * @type {Object} + */ + var coverRenderers = { + + line: { + + create: createRectCover, + + getRanges: function () { + var ends = getLocalTrackEnds.call(this); + var min = mathMin(ends[0][0], ends[1][0]); + var max = mathMax(ends[0][0], ends[1][0]); + + return [[min, max]]; + }, + + update: function (ranges) { + var range = ranges[0]; + var width = this.opt.width; + this._cover.setShape({ + x: range[0], + y: -width / 2, + width: range[1] - range[0], + height: width + }); + } + }, + + rect: { + + create: createRectCover, + + getRanges: function () { + var ends = getLocalTrackEnds.call(this); + + var min = [ + mathMin(ends[1][0], ends[0][0]), + mathMin(ends[1][1], ends[0][1]) + ]; + var max = [ + mathMax(ends[1][0], ends[0][0]), + mathMax(ends[1][1], ends[0][1]) + ]; + + return [[ + [min[0], max[0]], // x range + [min[1], max[1]] // y range + ]]; + }, + + update: function (ranges) { + var range = ranges[0]; + this._cover.setShape({ + x: range[0][0], + y: range[1][0], + width: range[0][1] - range[0][0], + height: range[1][1] - range[1][0] + }); + } + } + }; + + module.exports = SelectController; + + +/***/ }, +/* 226 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + + module.exports = function (option) { + createParallelIfNeeded(option); + mergeAxisOptionFromParallel(option); + }; + + /** + * Create a parallel coordinate if not exists. + * @inner + */ + function createParallelIfNeeded(option) { + if (option.parallel) { + return; + } + + var hasParallelSeries = false; + + zrUtil.each(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'parallel') { + hasParallelSeries = true; + } + }); + + if (hasParallelSeries) { + option.parallel = [{}]; + } + } + + /** + * Merge aixs definition from parallel option (if exists) to axis option. + * @inner + */ + function mergeAxisOptionFromParallel(option) { + var axes = modelUtil.normalizeToArray(option.parallelAxis); + + zrUtil.each(axes, function (axisOption) { + if (!zrUtil.isObject(axisOption)) { + return; + } + + var parallelIndex = axisOption.parallelIndex || 0; + var parallelOption = modelUtil.normalizeToArray(option.parallel)[parallelIndex]; + + if (parallelOption && parallelOption.parallelAxisDefault) { + zrUtil.merge(axisOption, parallelOption.parallelAxisDefault, false); + } + }); + } + + + +/***/ }, +/* 227 */ +/***/ function(module, exports, __webpack_require__) { + + + + var List = __webpack_require__(94); + var zrUtil = __webpack_require__(3); + var SeriesModel = __webpack_require__(27); + + module.exports = SeriesModel.extend({ + + type: 'series.parallel', + + dependencies: ['parallel'], + + getInitialData: function (option, ecModel) { + var parallelModel = ecModel.getComponent( + 'parallel', this.get('parallelIndex') + ); + var dimensions = parallelModel.dimensions; + var parallelAxisIndices = parallelModel.parallelAxisIndex; + + var rawData = option.data; + + var dimensionsInfo = zrUtil.map(dimensions, function (dim, index) { + var axisModel = ecModel.getComponent( + 'parallelAxis', parallelAxisIndices[index] + ); + if (axisModel.get('type') === 'category') { + translateCategoryValue(axisModel, dim, rawData); + return {name: dim, type: 'ordinal'}; + } + else { + return dim; + } + }); + + var list = new List(dimensionsInfo, this); + list.initData(rawData); + + return list; + }, + + /** + * User can get data raw indices on 'axisAreaSelected' event received. + * + * @public + * @param {string} activeState 'active' or 'inactive' or 'normal' + * @return {Array.} Raw indices + */ + getRawIndicesByActiveState: function (activeState) { + var coordSys = this.coordinateSystem; + var data = this.getData(); + var indices = []; + + coordSys.eachActiveState(data, function (theActiveState, dataIndex) { + if (activeState === theActiveState) { + indices.push(data.getRawIndex(dataIndex)); + } + }); + + return indices; + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + + coordinateSystem: 'parallel', + parallelIndex: 0, + + // FIXME 尚无用 + label: { + normal: { + show: false + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + }, + emphasis: { + show: false + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + } + }, + + inactiveOpacity: 0.05, + activeOpacity: 1, + + lineStyle: { + normal: { + width: 2, + opacity: 0.45, + type: 'solid' + } + }, + // smooth: false + + animationEasing: 'linear' + } + }); + + function translateCategoryValue(axisModel, dim, rawData) { + var axisData = axisModel.get('data'); + var numberDim = +dim.replace('dim', ''); + + if (axisData && axisData.length) { + zrUtil.each(rawData, function (dataItem) { + if (!dataItem) { + return; + } + var index = zrUtil.indexOf(axisData, dataItem[numberDim]); + dataItem[numberDim] = index >= 0 ? index : NaN; + }); + } + // FIXME + // 如果没有设置axis data, 应自动算出,或者提示。 + } + + +/***/ }, +/* 228 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + var ParallelView = __webpack_require__(41).extend({ + + type: 'parallel', + + init: function () { + + /** + * @type {module:zrender/container/Group} + * @private + */ + this._dataGroup = new graphic.Group(); + + this.group.add(this._dataGroup); + /** + * @type {module:echarts/data/List} + */ + this._data; + }, + + /** + * @override + */ + render: function (seriesModel, ecModel, api, payload) { + + var dataGroup = this._dataGroup; + var data = seriesModel.getData(); + var oldData = this._data; + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + + data.diff(oldData) + .add(add) + .update(update) + .remove(remove) + .execute(); + + // Update style + data.eachItemGraphicEl(function (elGroup, idx) { + var itemModel = data.getItemModel(idx); + var lineStyleModel = itemModel.getModel('lineStyle.normal'); + elGroup.eachChild(function (child) { + child.setStyle(zrUtil.extend( + lineStyleModel.getLineStyle(), + { + stroke: data.getItemVisual(idx, 'color'), + opacity: data.getItemVisual(idx, 'opacity') + } + )); + }); + }); + + // First create + if (!this._data) { + dataGroup.setClipPath(createGridClipShape( + coordSys, seriesModel, function () { + dataGroup.removeClipPath(); + } + )); + } + + this._data = data; + + function add(newDataIndex) { + var values = data.getValues(dimensions, newDataIndex); + var elGroup = new graphic.Group(); + dataGroup.add(elGroup); + + eachAxisPair( + values, dimensions, coordSys, + function (pointPair, pairIndex) { + // FIXME + // init animation + if (pointPair) { + elGroup.add(createEl(pointPair)); + } + } + ); + + data.setItemGraphicEl(newDataIndex, elGroup); + } + + function update(newDataIndex, oldDataIndex) { + var values = data.getValues(dimensions, newDataIndex); + var elGroup = oldData.getItemGraphicEl(oldDataIndex); + var newEls = []; + var elGroupIndex = 0; + + eachAxisPair( + values, dimensions, coordSys, + function (pointPair, pairIndex) { + var el = elGroup.childAt(elGroupIndex++); + + if (pointPair && !el) { + newEls.push(createEl(pointPair)); + } + else if (pointPair) { + graphic.updateProps(el, { + shape: { + points: pointPair + } + }, seriesModel); + } + } + ); + + // Remove redundent els + for (var i = elGroup.childCount() - 1; i >= elGroupIndex; i--) { + elGroup.remove(elGroup.childAt(i)); + } + + // Add new els + for (var i = 0, len = newEls.length; i < len; i++) { + elGroup.add(newEls[i]); + } + + data.setItemGraphicEl(newDataIndex, elGroup); + } + + function remove(oldDataIndex) { + var elGroup = oldData.getItemGraphicEl(oldDataIndex); + dataGroup.remove(elGroup); + } + }, + + /** + * @override + */ + remove: function () { + this._dataGroup && this._dataGroup.removeAll(); + this._data = null; + } + }); + + function createGridClipShape(coordSys, seriesModel, cb) { + var parallelModel = coordSys.model; + var rect = coordSys.getRect(); + var rectEl = new graphic.Rect({ + shape: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + } + }); + var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height'; + rectEl.setShape(dim, 0); + graphic.initProps(rectEl, { + shape: { + width: rect.width, + height: rect.height + } + }, seriesModel, cb); + return rectEl; + } + + function eachAxisPair(values, dimensions, coordSys, cb) { + for (var i = 0, len = dimensions.length - 1; i < len; i++) { + var dimA = dimensions[i]; + var dimB = dimensions[i + 1]; + var valueA = values[i]; + var valueB = values[i + 1]; + + cb( + (isEmptyValue(valueA, coordSys.getAxis(dimA).type) + || isEmptyValue(valueB, coordSys.getAxis(dimB).type) + ) + ? null + : [ + coordSys.dataToPoint(valueA, dimA), + coordSys.dataToPoint(valueB, dimB) + ], + i + ); + } + } + + function createEl(pointPair) { + return new graphic.Polyline({ + shape: {points: pointPair}, + silent: true + }); + } + + + // FIXME + // 公用方法? + function isEmptyValue(val, axisType) { + return axisType === 'category' + ? val == null + : (val == null || isNaN(val)); // axisType === 'value' + } + + module.exports = ParallelView; + + +/***/ }, +/* 229 */ +/***/ function(module, exports) { + + + + /** + * @payload + * @property {string} parallelAxisId + * @property {Array.} extent + */ + module.exports = function (ecModel, payload) { + + ecModel.eachSeriesByType('parallel', function (seriesModel) { + + var itemStyleModel = seriesModel.getModel('itemStyle.normal'); + var globalColors = ecModel.get('color'); + + var color = itemStyleModel.get('color') + || globalColors[seriesModel.seriesIndex % globalColors.length]; + var inactiveOpacity = seriesModel.get('inactiveOpacity'); + var activeOpacity = seriesModel.get('activeOpacity'); + var lineStyle = seriesModel.getModel('lineStyle.normal').getLineStyle(); + + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + + var opacityMap = { + normal: lineStyle.opacity, + active: activeOpacity, + inactive: inactiveOpacity + }; + + coordSys.eachActiveState(data, function (activeState, dataIndex) { + data.setItemVisual(dataIndex, 'opacity', opacityMap[activeState]); + }); + + data.setVisual('color', color); + }); + }; + + +/***/ }, +/* 230 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + + __webpack_require__(231); + __webpack_require__(232); + echarts.registerLayout(__webpack_require__(233)); + echarts.registerVisualCoding('chart', __webpack_require__(235)); + + +/***/ }, +/* 231 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var SeriesModel = __webpack_require__(27); + var createGraphFromNodeEdge = __webpack_require__(191); + + module.exports = SeriesModel.extend({ + + type: 'series.sankey', + + layoutInfo: null, + + getInitialData: function (option, ecModel) { + var links = option.edges || option.links; + var nodes = option.data || option.nodes; + if (nodes && links) { + var graph = createGraphFromNodeEdge(nodes, links, this, true); + return graph.data; + } + }, + + /** + * @return {module:echarts/data/Graph} + */ + getGraph: function () { + return this.getData().graph; + }, + + /** + * return {module:echarts/data/List} + */ + getEdgeData: function() { + return this.getGraph().edgeData; + }, + + defaultOption: { + zlevel: 0, + z: 2, + + coordinateSystem: 'view', + + layout : null, + + // the position of the whole view + left: '5%', + top: '5%', + right: '20%', + bottom: '5%', + + // the dx of the node + nodeWidth: 20, + + // the distance between two nodes + nodeGap: 8, + + // the number of iterations to change the position of the node + layoutIterations: 32, + + label: { + normal: { + show: true, + position: 'right', + textStyle: { + color: '#000', + fontSize: 12 + } + }, + emphasis: { + show: true + } + }, + + itemStyle: { + normal: { + borderWidth: 1, + borderColor: '#aaa' + } + }, + + lineStyle: { + normal: { + color: '#314656', + opacity: 0.2, + curveness: 0.5 + }, + emphasis: { + opacity: 0.6 + } + }, + + + // colorEncoded node + + color: ['#9e0142', '#d53e4f', '#f46d43', '#fdae61', '#fee08b','#ffffbf', + '#e6f598', '#abdda4', '#66c2a5', '#3288bd', '#5e4fa2'], + + animationEasing: 'linear', + + animationDuration: 1000 + } + + }); + + + +/***/ }, +/* 232 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var modelUtil = __webpack_require__(5); + var zrUtil = __webpack_require__(3); + + var SankeyShape = graphic.extendShape({ + shape: { + x1: 0, y1: 0, + x2: 0, y2: 0, + cpx1: 0, cpy1: 0, + cpx2: 0, cpy2: 0, + + extent: 0 + }, + + buildPath: function (ctx, shape) { + var halfExtent = shape.extent / 2; + ctx.moveTo(shape.x1, shape.y1 - halfExtent); + ctx.bezierCurveTo( + shape.cpx1, shape.cpy1 - halfExtent, + shape.cpx2, shape.cpy2 - halfExtent, + shape.x2, shape.y2 - halfExtent + ); + ctx.lineTo(shape.x2, shape.y2 + halfExtent); + ctx.bezierCurveTo( + shape.cpx2, shape.cpy2 + halfExtent, + shape.cpx1, shape.cpy1 + halfExtent, + shape.x1, shape.y1 + halfExtent + ); + ctx.closePath(); + } + }); + + module.exports = __webpack_require__(1).extendChartView({ + + type: 'sankey', + + /** + * @private + * @type {module:echarts/chart/sankey/SankeySeries} + */ + _model: null, + + render: function(seriesModel, ecModel, api) { + var graph = seriesModel.getGraph(); + var group = this.group; + var layoutInfo = seriesModel.layoutInfo; + + this._model = seriesModel; + + group.removeAll(); + + group.position = [layoutInfo.x, layoutInfo.y]; + + var edgeData = graph.edgeData; + var rawOption = seriesModel.option; + var formatModel = modelUtil.createDataFormatModel( + seriesModel, edgeData, rawOption.edges || rawOption.links + ); + + formatModel.formatTooltip = function (dataIndex) { + var params = this.getDataParams(dataIndex); + var rawDataOpt = params.data; + var html = rawDataOpt.source + ' -- ' + rawDataOpt.target; + if (params.value) { + html += ':' + params.value; + } + return html; + }; + + // generate a rect for each node + graph.eachNode(function (node) { + var layout = node.getLayout(); + var itemModel = node.getModel(); + var labelModel = itemModel.getModel('label.normal'); + var textStyleModel = labelModel.getModel('textStyle'); + var labelHoverModel = itemModel.getModel('label.emphasis'); + var textStyleHoverModel = labelHoverModel.getModel('textStyle'); + + var rect = new graphic.Rect({ + shape: { + x: layout.x, + y: layout.y, + width: node.getLayout().dx, + height: node.getLayout().dy + }, + style: { + // Get formatted label in label.normal option. Use node id if it is not specified + text: labelModel.get('show') + ? seriesModel.getFormattedLabel(node.dataIndex, 'normal') || node.id + // Use empty string to hide the label + : '', + textFont: textStyleModel.getFont(), + textFill: textStyleModel.getTextColor(), + textPosition: labelModel.get('position') + } + }); + + rect.setStyle(zrUtil.defaults( + { + fill: node.getVisual('color') + }, + itemModel.getModel('itemStyle.normal').getItemStyle() + )); + + graphic.setHoverStyle(rect, zrUtil.extend( + node.getModel('itemStyle.emphasis'), + { + text: labelHoverModel.get('show') + ? seriesModel.getFormattedLabel(node.dataIndex, 'emphasis') || node.id + : '', + textFont: textStyleHoverModel.getFont(), + textFill: textStyleHoverModel.getTextColor(), + textPosition: labelHoverModel.get('position') + } + )); + + group.add(rect); + }); + + // generate a bezire Curve for each edge + graph.eachEdge(function (edge) { + var curve = new SankeyShape(); + + curve.dataIndex = edge.dataIndex; + curve.dataModel = formatModel; + + var lineStyleModel = edge.getModel('lineStyle.normal'); + var curvature = lineStyleModel.get('curveness'); + var n1Layout = edge.node1.getLayout(); + var n2Layout = edge.node2.getLayout(); + var edgeLayout = edge.getLayout(); + + curve.shape.extent = Math.max(1, edgeLayout.dy); + + var x1 = n1Layout.x + n1Layout.dx; + var y1 = n1Layout.y + edgeLayout.sy + edgeLayout.dy / 2; + var x2 = n2Layout.x; + var y2 = n2Layout.y + edgeLayout.ty + edgeLayout.dy /2; + var cpx1 = x1 * (1 - curvature) + x2 * curvature; + var cpy1 = y1; + var cpx2 = x1 * curvature + x2 * (1 - curvature); + var cpy2 = y2; + + curve.setShape({ + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }); + + curve.setStyle(lineStyleModel.getItemStyle()); + graphic.setHoverStyle(curve, edge.getModel('lineStyle.emphasis').getItemStyle()); + + group.add(curve); + + }); + if (!this._data) { + group.setClipPath(createGridClipShape(group.getBoundingRect(), seriesModel, function () { + group.removeClipPath(); + })); + } + this._data = seriesModel.getData(); + } + }); + + //add animation to the view + function createGridClipShape(rect, seriesModel, cb) { + var rectEl = new graphic.Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + graphic.initProps(rectEl, { + shape: { + width: rect.width + 20, + height: rect.height + 20 + } + }, seriesModel, cb); + + return rectEl; + } + + +/***/ }, +/* 233 */ +/***/ function(module, exports, __webpack_require__) { + + + + var layout = __webpack_require__(21); + var nest = __webpack_require__(234); + var zrUtil = __webpack_require__(3); + + module.exports = function (ecModel, api) { + + ecModel.eachSeriesByType('sankey', function (seriesModel) { + + var nodeWidth = seriesModel.get('nodeWidth'); + var nodeGap = seriesModel.get('nodeGap'); + + var layoutInfo = getViewRect(seriesModel, api); + + seriesModel.layoutInfo = layoutInfo; + + var width = layoutInfo.width; + var height = layoutInfo.height; + + var graph = seriesModel.getGraph(); + + var nodes = graph.nodes; + var edges = graph.edges; + + computeNodeValues(nodes); + + var filteredNodes = nodes.filter(function (node) { + return node.getLayout().value === 0; + }); + + var iterations = filteredNodes.length !== 0 + ? 0 : seriesModel.get('layoutIterations'); + + layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations); + }); + }; + + /** + * get the layout position of the whole view. + */ + function getViewRect(seriesModel, api) { + return layout.getLayoutRect( + seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + } + ); + } + + function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations) { + computeNodeBreadths(nodes, nodeWidth, width); + computeNodeDepths(nodes, edges, height, nodeGap, iterations); + computeEdgeDepths(nodes); + } + + /** + * compute the value of each node by summing the associated edge's value. + * @param {module:echarts/data/Graph~Node} nodes + */ + function computeNodeValues(nodes) { + zrUtil.each(nodes, function (node) { + var value1 = sum(node.outEdges, getEdgeValue); + var value2 = sum(node.inEdges, getEdgeValue); + var value = Math.max(value1, value2); + node.setLayout({value: value}, true); + }); + } + + /** + * compute the x-position for each node. + * @param {module:echarts/data/Graph~Node} nodes + * @param {number} nodeWidth + * @param {number} width + */ + function computeNodeBreadths(nodes, nodeWidth, width) { + var remainNodes = nodes; + var nextNode = null; + var x = 0; + var kx = 0; + + while (remainNodes.length) { + nextNode = []; + + for (var i = 0, len = remainNodes.length; i < len; i++) { + var node = remainNodes[i]; + node.setLayout({x: x}, true); + node.setLayout({dx: nodeWidth}, true); + + for (var j = 0, lenj = node.outEdges.length; j < lenj; j++) { + nextNode.push(node.outEdges[j].node2); + } + } + remainNodes = nextNode; + ++x; + } + + moveSinksRight(nodes, x); + kx = (width - nodeWidth) / (x - 1); + + scaleNodeBreadths(nodes, kx); + } + + /** + * all the node without outEgdes are assigned maximum breadth and + * be aligned in the last column. + * @param {module:echarts/data/Graph~Node} nodes + * @param {number} x + */ + function moveSinksRight(nodes, x) { + zrUtil.each(nodes, function (node) { + if(!node.outEdges.length) { + node.setLayout({x: x-1}, true); + } + }); + } + + /** + * scale node x-position to the width. + * @param {module:echarts/data/Graph~Node} nodes + * @param {number} kx + */ + function scaleNodeBreadths(nodes, kx) { + zrUtil.each(nodes, function(node) { + var nodeX = node.getLayout().x * kx; + node.setLayout({x: nodeX}, true); + }); + } + + /** + * using Gauss-Seidel iterations method to compute the node depth(y-position). + * @param {module:echarts/data/Graph~Node} nodes + * @param {module:echarts/data/Graph~Edge} edges + * @param {number} height + * @param {numbber} nodeGap + * @param {number} iterations + */ + function computeNodeDepths(nodes, edges, height, nodeGap, iterations) { + var nodesByBreadth = nest() + .key(function (d) { + return d.getLayout().x; + }) + .sortKeys(ascending) + .entries(nodes) + .map(function (d) { + return d.values; + }); + + initializeNodeDepth(nodes, nodesByBreadth, edges, height, nodeGap); + resolveCollisions(nodesByBreadth, nodeGap, height); + + for (var alpha = 1; iterations > 0; iterations--) { + alpha *= 0.99; + relaxRightToLeft(nodesByBreadth, alpha); + resolveCollisions(nodesByBreadth, nodeGap, height); + relaxLeftToRight(nodesByBreadth, alpha); + resolveCollisions(nodesByBreadth, nodeGap, height); + } + } + + /** + * compute the original y-position for each node. + * @param {module:echarts/data/Graph~Node} nodes + * @param {Array.>} nodesByBreadth + * @param {module:echarts/data/Graph~Edge} edges + * @param {number} height + * @param {number} nodeGap + */ + function initializeNodeDepth(nodes, nodesByBreadth, edges, height, nodeGap) { + var kyArray = []; + zrUtil.each(nodesByBreadth, function (nodes) { + var n = nodes.length; + var sum = 0; + zrUtil.each(nodes, function (node) { + sum += node.getLayout().value; + }); + var ky = (height - (n-1) * nodeGap) / sum; + kyArray.push(ky); + }); + kyArray.sort(function (a, b) { + return a - b; + }); + var ky0 = kyArray[0]; + + zrUtil.each(nodesByBreadth, function (nodes) { + zrUtil.each(nodes, function (node, i) { + node.setLayout({y: i}, true); + var nodeDy = node.getLayout().value * ky0; + node.setLayout({dy: nodeDy}, true); + }); + }); + + zrUtil.each(edges, function (edge) { + var edgeDy = +edge.getValue() * ky0; + edge.setLayout({dy: edgeDy}, true); + }); + } + + /** + * resolve the collision of initialized depth. + * @param {Array.>} nodesByBreadth + * @param {number} nodeGap + * @param {number} height + */ + function resolveCollisions(nodesByBreadth, nodeGap, height) { + zrUtil.each(nodesByBreadth, function (nodes) { + var node; + var dy; + var y0 = 0; + var n = nodes.length; + var i; + + nodes.sort(ascendingDepth); + + for (i = 0; i < n; i++) { + node = nodes[i]; + dy = y0 - node.getLayout().y; + if(dy > 0) { + var nodeY = node.getLayout().y + dy; + node.setLayout({y: nodeY}, true); + } + y0 = node.getLayout().y + node.getLayout().dy + nodeGap; + } + + // if the bottommost node goes outside the biunds, push it back up + dy = y0 - nodeGap - height; + if (dy > 0) { + var nodeY = node.getLayout().y -dy; + node.setLayout({y: nodeY}, true); + y0 = node.getLayout().y; + for (i = n - 2; i >= 0; --i) { + node = nodes[i]; + dy = node.getLayout().y + node.getLayout().dy + nodeGap - y0; + if (dy > 0) { + nodeY = node.getLayout().y - dy; + node.setLayout({y: nodeY}, true); + } + y0 = node.getLayout().y; + } + } + }); + } + + /** + * change the y-position of the nodes, except most the right side nodes. + * @param {Array.>} nodesByBreadth + * @param {number} alpha + */ + function relaxRightToLeft(nodesByBreadth, alpha) { + zrUtil.each(nodesByBreadth.slice().reverse(), function (nodes) { + zrUtil.each(nodes, function (node) { + if (node.outEdges.length) { + var y = sum(node.outEdges, weightedTarget) / sum(node.outEdges, getEdgeValue); + var nodeY = node.getLayout().y + (y - center(node)) * alpha; + node.setLayout({y: nodeY}, true); + } + }); + }); + } + + function weightedTarget(edge) { + return center(edge.node2) * edge.getValue(); + } + + /** + * change the y-position of the nodes, except most the left side nodes. + * @param {Array.>} nodesByBreadth + * @param {number} alpha + */ + function relaxLeftToRight(nodesByBreadth, alpha) { + zrUtil.each(nodesByBreadth, function (nodes) { + zrUtil.each(nodes, function (node) { + if (node.inEdges.length) { + var y = sum(node.inEdges, weightedSource) / sum(node.inEdges, getEdgeValue); + var nodeY = node.getLayout().y + (y - center(node)) * alpha; + node.setLayout({y: nodeY}, true); + } + }); + }); + } + + function weightedSource(edge) { + return center(edge.node1) * edge.getValue(); + } + + /** + * compute the depth(y-position) of each edge. + * @param {module:echarts/data/Graph~Node} nodes + */ + function computeEdgeDepths(nodes) { + zrUtil.each(nodes, function (node) { + node.outEdges.sort(ascendingTargetDepth); + node.inEdges.sort(ascendingSourceDepth); + }); + zrUtil.each(nodes, function (node) { + var sy = 0; + var ty = 0; + zrUtil.each(node.outEdges, function (edge) { + edge.setLayout({sy: sy}, true); + sy += edge.getLayout().dy; + }); + zrUtil.each(node.inEdges, function (edge) { + edge.setLayout({ty: ty}, true); + ty += edge.getLayout().dy; + }); + }); + } + + function ascendingTargetDepth(a, b) { + return a.node2.getLayout().y - b.node2.getLayout().y; + } + + function ascendingSourceDepth(a, b) { + return a.node1.getLayout().y - b.node1.getLayout().y; + } + + function sum(array, f) { + var s = 0; + var n = array.length; + var a; + var i = -1; + if (arguments.length === 1) { + while (++i < n) { + a = +array[i]; + if (!isNaN(a)) { + s += a; + } + } + } + else { + while (++i < n) { + a = +f.call(array, array[i], i); + if(!isNaN(a)) { + s += a; + } + } + } + return s; + } + + function center(node) { + return node.getLayout().y + node.getLayout().dy / 2; + } + + function ascendingDepth(a, b) { + return a.getLayout().y - b.getLayout().y; + } + + function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a == b ? 0 : NaN; + } + + function getEdgeValue(edge) { + return edge.getValue(); + } + + + +/***/ }, +/* 234 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + /** + * nest helper used to group by the array. + * can specified the keys and sort the keys. + */ + function nest() { + + var keysFunction = []; + var sortKeysFunction = []; + + /** + * map an Array into the mapObject. + * @param {Array} array + * @param {number} depth + */ + function map(array, depth) { + if (depth >= keysFunction.length) { + return array; + } + var i = -1; + var n = array.length; + var keyFunction = keysFunction[depth++]; + var mapObject = {}; + var valuesByKey = {}; + + while (++i < n) { + var keyValue = keyFunction(array[i]); + var values = valuesByKey[keyValue]; + + if (values) { + values.push(array[i]); + } + else { + valuesByKey[keyValue] = [array[i]]; + } + } + + zrUtil.each(valuesByKey, function (value, key) { + mapObject[key] = map(value, depth); + }); + + return mapObject; + } + + /** + * transform the Map Object to multidimensional Array + * @param {Object} map + * @param {number} depth + */ + function entriesMap(mapObject, depth) { + if (depth >= keysFunction.length) { + return mapObject; + } + var array = []; + var sortKeyFunction = sortKeysFunction[depth++]; + + zrUtil.each(mapObject, function (value, key) { + array.push({ + key: key, values: entriesMap(value, depth) + }); + }); + + if (sortKeyFunction) { + return array.sort(function (a, b) { + return sortKeyFunction(a.key, b.key); + }); + } + else { + return array; + } + } + + return { + /** + * specified the key to groupby the arrays. + * users can specified one more keys. + * @param {Function} d + */ + key: function (d) { + keysFunction.push(d); + return this; + }, + + /** + * specified the comparator to sort the keys + * @param {Function} order + */ + sortKeys: function (order) { + sortKeysFunction[keysFunction.length - 1] = order; + return this; + }, + + /** + * the array to be grouped by. + * @param {Array} array + */ + entries: function (array) { + return entriesMap(map(array, 0), 0); + } + }; + } + module.exports = nest; + + +/***/ }, +/* 235 */ +/***/ function(module, exports, __webpack_require__) { + + + + var VisualMapping = __webpack_require__(187); + + module.exports = function (ecModel, payload) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + + nodes.sort(function (a, b) { + return a.getLayout().value - b.getLayout().value; + }); + + var minValue = nodes[0].getLayout().value; + var maxValue = nodes[nodes.length - 1].getLayout().value; + + nodes.forEach(function (node) { + var mapping = new VisualMapping({ + type: 'color', + mappingMethod: 'linear', + dataExtent: [minValue, maxValue], + visual: seriesModel.get('color') + }); + + var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value); + node.setVisual('color', mapValueToColor); + }); + + }) ; + }; + + +/***/ }, +/* 236 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + + __webpack_require__(237); + __webpack_require__(240); + + echarts.registerVisualCoding('chart', __webpack_require__(241)); + echarts.registerLayout(__webpack_require__(242)); + + + +/***/ }, +/* 237 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var SeriesModel = __webpack_require__(27); + var whiskerBoxCommon = __webpack_require__(238); + + var BoxplotSeries = SeriesModel.extend({ + + type: 'series.boxplot', + + dependencies: ['xAxis', 'yAxis', 'grid'], + + // TODO + // box width represents group size, so dimension should have 'size'. + + /** + * @see + * The meanings of 'min' and 'max' depend on user, + * and echarts do not need to know it. + * @readOnly + */ + valueDimensions: ['min', 'Q1', 'median', 'Q3', 'max'], + + /** + * @type {Array.} + * @readOnly + */ + dimensions: null, + + /** + * @override + */ + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + + hoverAnimation: true, + + xAxisIndex: 0, + yAxisIndex: 0, + + layout: null, // 'horizontal' or 'vertical' + boxWidth: [7, 50], // [min, max] can be percent of band width. + + itemStyle: { + normal: { + color: '#fff', + borderWidth: 1 + }, + emphasis: { + borderWidth: 2, + shadowBlur: 5, + shadowOffsetX: 2, + shadowOffsetY: 2, + shadowColor: 'rgba(0,0,0,0.4)' + } + }, + + animationEasing: 'elasticOut', + animationDuration: 800 + } + }); + + zrUtil.mixin(BoxplotSeries, whiskerBoxCommon.seriesModelMixin, true); + + module.exports = BoxplotSeries; + + + +/***/ }, +/* 238 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var completeDimensions = __webpack_require__(96); + var WhiskerBoxDraw = __webpack_require__(239); + var zrUtil = __webpack_require__(3); + + function getItemValue(item) { + return item.value == null ? item : item.value; + } + + var seriesModelMixin = { + + /** + * @private + * @type {string} + */ + _baseAxisDim: null, + + /** + * @override + */ + getInitialData: function (option, ecModel) { + // When both types of xAxis and yAxis are 'value', layout is + // needed to be specified by user. Otherwise, layout can be + // judged by which axis is category. + + var categories; + + var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex')); + var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex')); + var xAxisType = xAxisModel.get('type'); + var yAxisType = yAxisModel.get('type'); + var addOrdinal; + + // FIXME + // 考虑时间轴 + + if (xAxisType === 'category') { + option.layout = 'horizontal'; + categories = xAxisModel.getCategories(); + addOrdinal = true; + } + else if (yAxisType === 'category') { + option.layout = 'vertical'; + categories = yAxisModel.getCategories(); + addOrdinal = true; + } + else { + option.layout = option.layout || 'horizontal'; + } + + this._baseAxisDim = option.layout === 'horizontal' ? 'x' : 'y'; + + var data = option.data; + var dimensions = this.dimensions = ['base'].concat(this.valueDimensions); + completeDimensions(dimensions, data); + + var list = new List(dimensions, this); + list.initData(data, categories ? categories.slice() : null, function (dataItem, dimName, idx, dimIdx) { + var value = getItemValue(dataItem); + return addOrdinal ? (dimName === 'base' ? idx : value[dimIdx - 1]) : value[dimIdx]; + }); + + return list; + }, + + /** + * Used by Gird. + * @param {string} axisDim 'x' or 'y' + * @return {Array.} dimensions on the axis. + */ + coordDimToDataDim: function (axisDim) { + var dims = this.valueDimensions.slice(); + var baseDim = ['base']; + var map = { + horizontal: {x: baseDim, y: dims}, + vertical: {x: dims, y: baseDim} + }; + return map[this.get('layout')][axisDim]; + }, + + /** + * @override + * @param {string|number} dataDim + * @return {string} coord dimension + */ + dataDimToCoordDim: function (dataDim) { + var dim; + + zrUtil.each(['x', 'y'], function (coordDim, index) { + var dataDims = this.coordDimToDataDim(coordDim); + if (zrUtil.indexOf(dataDims, dataDim) >= 0) { + dim = coordDim; + } + }, this); + + return dim; + }, + + /** + * If horizontal, base axis is x, otherwise y. + * @override + */ + getBaseAxis: function () { + var dim = this._baseAxisDim; + return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis; + } + }; + + var viewMixin = { + + init: function () { + /** + * Old data. + * @private + * @type {module:echarts/chart/helper/WhiskerBoxDraw} + */ + var whiskerBoxDraw = this._whiskerBoxDraw = new WhiskerBoxDraw( + this.getStyleUpdater() + ); + this.group.add(whiskerBoxDraw.group); + }, + + render: function (seriesModel, ecModel, api) { + this._whiskerBoxDraw.updateData(seriesModel.getData()); + }, + + remove: function (ecModel) { + this._whiskerBoxDraw.remove(); + } + }; + + module.exports = { + seriesModelMixin: seriesModelMixin, + viewMixin: viewMixin + }; + + +/***/ }, +/* 239 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/Symbol + */ + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var Path = __webpack_require__(44); + + var WhiskerPath = Path.extend({ + + type: 'whiskerInBox', + + shape: {}, + + buildPath: function (ctx, shape) { + for (var i in shape) { + if (i.indexOf('ends') === 0) { + var pts = shape[i]; + ctx.moveTo(pts[0][0], pts[0][1]); + ctx.lineTo(pts[1][0], pts[1][1]); + } + } + } + }); + + /** + * @constructor + * @alias {module:echarts/chart/helper/WhiskerBox} + * @param {module:echarts/data/List} data + * @param {number} idx + * @param {Function} styleUpdater + * @param {boolean} isInit + * @extends {module:zrender/graphic/Group} + */ + function WhiskerBox(data, idx, styleUpdater, isInit) { + graphic.Group.call(this); + + /** + * @type {number} + * @readOnly + */ + this.bodyIndex; + + /** + * @type {number} + * @readOnly + */ + this.whiskerIndex; + + /** + * @type {Function} + */ + this.styleUpdater = styleUpdater; + + this._createContent(data, idx, isInit); + + this.updateData(data, idx, isInit); + + /** + * Last series model. + * @type {module:echarts/model/Series} + */ + this._seriesModel; + } + + var whiskerBoxProto = WhiskerBox.prototype; + + whiskerBoxProto._createContent = function (data, idx, isInit) { + var itemLayout = data.getItemLayout(idx); + var constDim = itemLayout.chartLayout === 'horizontal' ? 1 : 0; + var count = 0; + + // Whisker element. + this.add(new graphic.Polygon({ + shape: { + points: isInit + ? transInit(itemLayout.bodyEnds, constDim, itemLayout) + : itemLayout.bodyEnds + }, + style: {strokeNoScale: true}, + z2: 100 + })); + this.bodyIndex = count++; + + // Box element. + var whiskerEnds = zrUtil.map(itemLayout.whiskerEnds, function (ends) { + return isInit ? transInit(ends, constDim, itemLayout) : ends; + }); + this.add(new WhiskerPath({ + shape: makeWhiskerEndsShape(whiskerEnds), + style: {strokeNoScale: true}, + z2: 100 + })); + this.whiskerIndex = count++; + }; + + function transInit(points, dim, itemLayout) { + return zrUtil.map(points, function (point) { + point = point.slice(); + point[dim] = itemLayout.initBaseline; + return point; + }); + } + + function makeWhiskerEndsShape(whiskerEnds) { + // zr animation only support 2-dim array. + var shape = {}; + zrUtil.each(whiskerEnds, function (ends, i) { + shape['ends' + i] = ends; + }); + return shape; + } + + /** + * Update symbol properties + * @param {module:echarts/data/List} data + * @param {number} idx + */ + whiskerBoxProto.updateData = function (data, idx, isInit) { + var seriesModel = this._seriesModel = data.hostModel; + var itemLayout = data.getItemLayout(idx); + var updateMethod = graphic[isInit ? 'initProps' : 'updateProps']; + // this.childAt(this.bodyIndex).stopAnimation(true); + // this.childAt(this.whiskerIndex).stopAnimation(true); + updateMethod( + this.childAt(this.bodyIndex), + {shape: {points: itemLayout.bodyEnds}}, + seriesModel + ); + updateMethod( + this.childAt(this.whiskerIndex), + {shape: makeWhiskerEndsShape(itemLayout.whiskerEnds)}, + seriesModel + ); + + this.styleUpdater.call(null, this, data, idx); + }; + + zrUtil.inherits(WhiskerBox, graphic.Group); + + + /** + * @constructor + * @alias module:echarts/chart/helper/WhiskerBoxDraw + */ + function WhiskerBoxDraw(styleUpdater) { + this.group = new graphic.Group(); + this.styleUpdater = styleUpdater; + } + + var whiskerBoxDrawProto = WhiskerBoxDraw.prototype; + + /** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + */ + whiskerBoxDrawProto.updateData = function (data) { + var group = this.group; + var oldData = this._data; + var styleUpdater = this.styleUpdater; + + data.diff(oldData) + .add(function (newIdx) { + if (data.hasValue(newIdx)) { + var symbolEl = new WhiskerBox(data, newIdx, styleUpdater, true); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }) + .update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + + // Empty data + if (!data.hasValue(newIdx)) { + group.remove(symbolEl); + return; + } + + if (!symbolEl) { + symbolEl = new WhiskerBox(data, newIdx, styleUpdater); + } + else { + symbolEl.updateData(data, newIdx); + } + + // Add back + group.add(symbolEl); + + data.setItemGraphicEl(newIdx, symbolEl); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }) + .execute(); + + this._data = data; + }; + + /** + * Remove symbols. + * @param {module:echarts/data/List} data + */ + whiskerBoxDrawProto.remove = function () { + var group = this.group; + var data = this._data; + this._data = null; + data && data.eachItemGraphicEl(function (el) { + el && group.remove(el); + }); + }; + + module.exports = WhiskerBoxDraw; + + +/***/ }, +/* 240 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var ChartView = __webpack_require__(41); + var graphic = __webpack_require__(42); + var whiskerBoxCommon = __webpack_require__(238); + + var BoxplotView = ChartView.extend({ + + type: 'boxplot', + + getStyleUpdater: function () { + return updateStyle; + } + }); + + zrUtil.mixin(BoxplotView, whiskerBoxCommon.viewMixin, true); + + // Update common properties + var normalStyleAccessPath = ['itemStyle', 'normal']; + var emphasisStyleAccessPath = ['itemStyle', 'emphasis']; + + function updateStyle(itemGroup, data, idx) { + var itemModel = data.getItemModel(idx); + var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath); + var borderColor = data.getItemVisual(idx, 'color'); + + // Exclude borderColor. + var itemStyle = normalItemStyleModel.getItemStyle(['borderColor']); + + var whiskerEl = itemGroup.childAt(itemGroup.whiskerIndex); + whiskerEl.style.set(itemStyle); + whiskerEl.style.stroke = borderColor; + whiskerEl.dirty(); + + var bodyEl = itemGroup.childAt(itemGroup.bodyIndex); + bodyEl.style.set(itemStyle); + bodyEl.style.stroke = borderColor; + bodyEl.dirty(); + + var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle(); + graphic.setHoverStyle(itemGroup, hoverStyle); + } + + module.exports = BoxplotView; + + + +/***/ }, +/* 241 */ +/***/ function(module, exports) { + + + + var borderColorQuery = ['itemStyle', 'normal', 'borderColor']; + + module.exports = function (ecModel, api) { + + var globalColors = ecModel.get('color'); + + ecModel.eachRawSeriesByType('boxplot', function (seriesModel) { + + var defaulColor = globalColors[seriesModel.seriesIndex % globalColors.length]; + var data = seriesModel.getData(); + + data.setVisual({ + legendSymbol: 'roundRect', + // Use name 'color' but not 'borderColor' for legend usage and + // visual coding from other component like dataRange. + color: seriesModel.get(borderColorQuery) || defaulColor + }); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + data.setItemVisual( + idx, + {color: itemModel.get(borderColorQuery, true)} + ); + }); + } + }); + + }; + + +/***/ }, +/* 242 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + var each = zrUtil.each; + + module.exports = function (ecModel, api) { + + var groupResult = groupSeriesByAxis(ecModel); + + each(groupResult, function (groupItem) { + var seriesModels = groupItem.seriesModels; + + if (!seriesModels.length) { + return; + } + + calculateBase(groupItem); + + each(seriesModels, function (seriesModel, idx) { + layoutSingleSeries( + seriesModel, + groupItem.boxOffsetList[idx], + groupItem.boxWidthList[idx] + ); + }); + }); + }; + + /** + * Group series by axis. + */ + function groupSeriesByAxis(ecModel) { + var result = []; + var axisList = []; + + ecModel.eachSeriesByType('boxplot', function (seriesModel) { + var baseAxis = seriesModel.getBaseAxis(); + var idx = zrUtil.indexOf(axisList, baseAxis); + + if (idx < 0) { + idx = axisList.length; + axisList[idx] = baseAxis; + result[idx] = {axis: baseAxis, seriesModels: []}; + } + + result[idx].seriesModels.push(seriesModel); + }); + + return result; + } + + /** + * Calculate offset and box width for each series. + */ + function calculateBase(groupItem) { + var extent; + var baseAxis = groupItem.axis; + var seriesModels = groupItem.seriesModels; + var seriesCount = seriesModels.length; + + var boxWidthList = groupItem.boxWidthList = []; + var boxOffsetList = groupItem.boxOffsetList = []; + var boundList = []; + + var bandWidth; + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } + else { + var maxDataCount = 0; + each(seriesModels, function (seriesModel) { + maxDataCount = Math.max(maxDataCount, seriesModel.getData().count()); + }); + extent = baseAxis.getExtent(), + Math.abs(extent[1] - extent[0]) / maxDataCount; + } + + each(seriesModels, function (seriesModel) { + var boxWidthBound = seriesModel.get('boxWidth'); + if (!zrUtil.isArray(boxWidthBound)) { + boxWidthBound = [boxWidthBound, boxWidthBound]; + } + boundList.push([ + parsePercent(boxWidthBound[0], bandWidth) || 0, + parsePercent(boxWidthBound[1], bandWidth) || 0 + ]); + }); + + var availableWidth = bandWidth * 0.8 - 2; + var boxGap = availableWidth / seriesCount * 0.3; + var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount; + var base = boxWidth / 2 - availableWidth / 2; + + each(seriesModels, function (seriesModel, idx) { + boxOffsetList.push(base); + base += boxGap + boxWidth; + + boxWidthList.push( + Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1]) + ); + }); + } + + /** + * Calculate points location for each series. + */ + function layoutSingleSeries(seriesModel, offset, boxWidth) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var dimensions = seriesModel.dimensions; + var chartLayout = seriesModel.get('layout'); + var halfWidth = boxWidth / 2; + + data.each(dimensions, function () { + var args = arguments; + var dimLen = dimensions.length; + var axisDimVal = args[0]; + var idx = args[dimLen]; + var variableDim = chartLayout === 'horizontal' ? 0 : 1; + var constDim = 1 - variableDim; + + var median = getPoint(args[3]); + var end1 = getPoint(args[1]); + var end5 = getPoint(args[5]); + var whiskerEnds = [ + [end1, getPoint(args[2])], + [end5, getPoint(args[4])] + ]; + layEndLine(end1); + layEndLine(end5); + layEndLine(median); + + var bodyEnds = []; + addBodyEnd(whiskerEnds[0][1], 0); + addBodyEnd(whiskerEnds[1][1], 1); + + data.setItemLayout(idx, { + chartLayout: chartLayout, + initBaseline: median[constDim], + median: median, + bodyEnds: bodyEnds, + whiskerEnds: whiskerEnds + }); + + function getPoint(val) { + var p = []; + p[variableDim] = axisDimVal; + p[constDim] = val; + var point; + if (isNaN(axisDimVal) || isNaN(val)) { + point = [NaN, NaN]; + } + else { + point = coordSys.dataToPoint(p); + point[variableDim] += offset; + } + return point; + } + + function addBodyEnd(point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[variableDim] += halfWidth; + point2[variableDim] -= halfWidth; + start + ? bodyEnds.push(point1, point2) + : bodyEnds.push(point2, point1); + } + + function layEndLine(endCenter) { + var line = [endCenter.slice(), endCenter.slice()]; + line[0][variableDim] -= halfWidth; + line[1][variableDim] += halfWidth; + whiskerEnds.push(line); + } + }); + } + + + +/***/ }, +/* 243 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + + __webpack_require__(244); + __webpack_require__(245); + + echarts.registerPreprocessor( + __webpack_require__(246) + ); + + echarts.registerVisualCoding('chart', __webpack_require__(247)); + echarts.registerLayout(__webpack_require__(248)); + + + +/***/ }, +/* 244 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var SeriesModel = __webpack_require__(27); + var whiskerBoxCommon = __webpack_require__(238); + var formatUtil = __webpack_require__(6); + var encodeHTML = formatUtil.encodeHTML; + var addCommas = formatUtil.addCommas; + + var CandlestickSeries = SeriesModel.extend({ + + type: 'series.candlestick', + + dependencies: ['xAxis', 'yAxis', 'grid'], + + /** + * @readOnly + */ + valueDimensions: ['open', 'close', 'lowest', 'highest'], + + /** + * @type {Array.} + * @readOnly + */ + dimensions: null, + + /** + * @override + */ + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + + hoverAnimation: true, + + xAxisIndex: 0, + yAxisIndex: 0, + + layout: null, // 'horizontal' or 'vertical' + + itemStyle: { + normal: { + color: '#c23531', // 阳线 positive + color0: '#314656', // 阴线 negative '#c23531', '#314656' + borderWidth: 1, + // FIXME + // ec2中使用的是lineStyle.color 和 lineStyle.color0 + borderColor: '#c23531', + borderColor0: '#314656' + }, + emphasis: { + borderWidth: 2 + } + }, + + animationUpdate: false, + animationEasing: 'linear', + animationDuration: 300 + }, + + /** + * Get dimension for shadow in dataZoom + * @return {string} dimension name + */ + getShadowDim: function () { + return 'open'; + }, + + /** + * @override + */ + formatTooltip: function (dataIndex, mutipleSeries) { + // It rearly use mutiple candlestick series in one cartesian, + // so only consider one series in this default tooltip. + var valueHTMLArr = zrUtil.map(this.valueDimensions, function (dim) { + return dim + ': ' + addCommas(this._data.get(dim, dataIndex)); + }, this); + + return encodeHTML(this.name) + '
            ' + valueHTMLArr.join('
            '); + } + + }); + + zrUtil.mixin(CandlestickSeries, whiskerBoxCommon.seriesModelMixin, true); + + module.exports = CandlestickSeries; + + + +/***/ }, +/* 245 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var ChartView = __webpack_require__(41); + var graphic = __webpack_require__(42); + var whiskerBoxCommon = __webpack_require__(238); + + var CandlestickView = ChartView.extend({ + + type: 'candlestick', + + getStyleUpdater: function () { + return updateStyle; + } + + }); + + zrUtil.mixin(CandlestickView, whiskerBoxCommon.viewMixin, true); + + // Update common properties + var normalStyleAccessPath = ['itemStyle', 'normal']; + var emphasisStyleAccessPath = ['itemStyle', 'emphasis']; + + function updateStyle(itemGroup, data, idx) { + var itemModel = data.getItemModel(idx); + var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath); + var color = data.getItemVisual(idx, 'color'); + var borderColor = data.getItemVisual(idx, 'borderColor'); + + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + var itemStyle = normalItemStyleModel.getItemStyle( + ['color', 'color0', 'borderColor', 'borderColor0'] + ); + + var whiskerEl = itemGroup.childAt(itemGroup.whiskerIndex); + whiskerEl.style.set(itemStyle); + whiskerEl.style.stroke = borderColor; + whiskerEl.dirty(); + + var bodyEl = itemGroup.childAt(itemGroup.bodyIndex); + bodyEl.style.set(itemStyle); + bodyEl.style.fill = color; + bodyEl.style.stroke = borderColor; + bodyEl.dirty(); + + var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle(); + graphic.setHoverStyle(itemGroup, hoverStyle); + } + + + module.exports = CandlestickView; + + + +/***/ }, +/* 246 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + module.exports = function (option) { + if (!option || !zrUtil.isArray(option.series)) { + return; + } + + // Translate 'k' to 'candlestick'. + zrUtil.each(option.series, function (seriesItem) { + if (zrUtil.isObject(seriesItem) && seriesItem.type === 'k') { + seriesItem.type = 'candlestick'; + } + }); + }; + + + +/***/ }, +/* 247 */ +/***/ function(module, exports) { + + + + var positiveBorderColorQuery = ['itemStyle', 'normal', 'borderColor']; + var negativeBorderColorQuery = ['itemStyle', 'normal', 'borderColor0']; + var positiveColorQuery = ['itemStyle', 'normal', 'color']; + var negativeColorQuery = ['itemStyle', 'normal', 'color0']; + + module.exports = function (ecModel, api) { + + ecModel.eachRawSeriesByType('candlestick', function (seriesModel) { + + var data = seriesModel.getData(); + + data.setVisual({ + legendSymbol: 'roundRect' + }); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var sign = data.getItemLayout(idx).sign; + + data.setItemVisual( + idx, + { + color: itemModel.get( + sign > 0 ? positiveColorQuery : negativeColorQuery + ), + borderColor: itemModel.get( + sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery + ) + } + ); + }); + } + }); + + }; + + +/***/ }, +/* 248 */ +/***/ function(module, exports) { + + + + var CANDLE_MIN_WIDTH = 2; + var CANDLE_MIN_NICE_WIDTH = 5; + var GPA_MIN = 4; + + module.exports = function (ecModel, api) { + + ecModel.eachSeriesByType('candlestick', function (seriesModel) { + + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var dimensions = seriesModel.dimensions; + var chartLayout = seriesModel.get('layout'); + + var candleWidth = calculateCandleWidth(seriesModel, data); + + data.each(dimensions, function () { + var args = arguments; + var dimLen = dimensions.length; + var axisDimVal = args[0]; + var idx = args[dimLen]; + var variableDim = chartLayout === 'horizontal' ? 0 : 1; + var constDim = 1 - variableDim; + + var openVal = args[1]; + var closeVal = args[2]; + var lowestVal = args[3]; + var highestVal = args[4]; + + var ocLow = Math.min(openVal, closeVal); + var ocHigh = Math.max(openVal, closeVal); + + var ocLowPoint = getPoint(ocLow); + var ocHighPoint = getPoint(ocHigh); + var lowestPoint = getPoint(lowestVal); + var highestPoint = getPoint(highestVal); + + var whiskerEnds = [ + [highestPoint, ocHighPoint], + [lowestPoint, ocLowPoint] + ]; + + var bodyEnds = []; + addBodyEnd(ocHighPoint, 0); + addBodyEnd(ocLowPoint, 1); + + data.setItemLayout(idx, { + chartLayout: chartLayout, + sign: openVal > closeVal ? -1 : openVal < closeVal ? 1 : 0, + initBaseline: openVal > closeVal + ? ocHighPoint[constDim] : ocLowPoint[constDim], // open point. + bodyEnds: bodyEnds, + whiskerEnds: whiskerEnds + }); + + function getPoint(val) { + var p = []; + p[variableDim] = axisDimVal; + p[constDim] = val; + return (isNaN(axisDimVal) || isNaN(val)) + ? [NaN, NaN] + : coordSys.dataToPoint(p); + } + + function addBodyEnd(point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[variableDim] += candleWidth / 2; + point2[variableDim] -= candleWidth / 2; + start + ? bodyEnds.push(point1, point2) + : bodyEnds.push(point2, point1); + } + + }, true); + }); + }; + + function calculateCandleWidth(seriesModel, data) { + var baseAxis = seriesModel.getBaseAxis(); + var extent; + + var bandWidth = baseAxis.type === 'category' + ? baseAxis.getBandWidth() + : ( + extent = baseAxis.getExtent(), + Math.abs(extent[1] - extent[0]) / data.count() + ); + + // Half band width is perfect when space is enouph, otherwise + // try not to be smaller than CANDLE_MIN_NICE_WIDTH (and only + // gap is compressed), otherwise ensure not to be smaller than + // CANDLE_MIN_WIDTH in spite of overlap. + + return bandWidth / 2 - 2 > CANDLE_MIN_NICE_WIDTH // "- 2" is minus border width + ? bandWidth / 2 - 2 + : bandWidth - CANDLE_MIN_NICE_WIDTH > GPA_MIN + ? CANDLE_MIN_NICE_WIDTH + : Math.max(bandWidth - GPA_MIN, CANDLE_MIN_WIDTH); + } + + + +/***/ }, +/* 249 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(250); + __webpack_require__(251); + + echarts.registerVisualCoding('chart', zrUtil.curry( + __webpack_require__(103), 'effectScatter', 'circle', null + )); + echarts.registerLayout(zrUtil.curry( + __webpack_require__(104), 'effectScatter' + )); + + +/***/ }, +/* 250 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var createListFromArray = __webpack_require__(93); + var SeriesModel = __webpack_require__(27); + + module.exports = SeriesModel.extend({ + + type: 'series.effectScatter', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + var list = createListFromArray(option.data, this, ecModel); + return list; + }, + + defaultOption: { + coordinateSystem: 'cartesian2d', + zlevel: 0, + z: 2, + legendHoverLink: true, + + effectType: 'ripple', + + // When to show the effect, option: 'render'|'emphasis' + showEffectOn: 'render', + + // Ripple effect config + rippleEffect: { + period: 4, + // Scale of ripple + scale: 2.5, + // Brush type can be fill or stroke + brushType: 'fill' + }, + + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + // Polar coordinate system + polarIndex: 0, + + // Geo coordinate system + geoIndex: 0, + + // symbol: null, // 图形类型 + symbolSize: 10 // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + // symbolRotate: null, // 图形旋转控制 + + // large: false, + // Available when large is true + // largeThreshold: 2000, + + // itemStyle: { + // normal: { + // opacity: 1 + // } + // } + } + }); + + +/***/ }, +/* 251 */ +/***/ function(module, exports, __webpack_require__) { + + + + var SymbolDraw = __webpack_require__(98); + var EffectSymbol = __webpack_require__(252); + + __webpack_require__(1).extendChartView({ + + type: 'effectScatter', + + init: function () { + this._symbolDraw = new SymbolDraw(EffectSymbol); + }, + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var effectSymbolDraw = this._symbolDraw; + effectSymbolDraw.updateData(data); + this.group.add(effectSymbolDraw.group); + }, + + updateLayout: function () { + this._symbolDraw.updateLayout(); + }, + + remove: function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(api); + } + }); + + +/***/ }, +/* 252 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Symbol with ripple effect + * @module echarts/chart/helper/EffectSymbol + */ + + + var zrUtil = __webpack_require__(3); + var symbolUtil = __webpack_require__(100); + var graphic = __webpack_require__(42); + var numberUtil = __webpack_require__(7); + var Symbol = __webpack_require__(99); + var Group = graphic.Group; + + var EFFECT_RIPPLE_NUMBER = 3; + + function normalizeSymbolSize(symbolSize) { + if (!zrUtil.isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + return symbolSize; + } + /** + * @constructor + * @param {module:echarts/data/List} data + * @param {number} idx + * @extends {module:zrender/graphic/Group} + */ + function EffectSymbol(data, idx) { + Group.call(this); + + var symbol = new Symbol(data, idx); + var rippleGroup = new Group(); + this.add(symbol); + this.add(rippleGroup); + + rippleGroup.beforeUpdate = function () { + this.attr(symbol.getScale()); + }; + this.updateData(data, idx); + } + + var effectSymbolProto = EffectSymbol.prototype; + + effectSymbolProto.stopEffectAnimation = function () { + this.childAt(1).removeAll(); + }; + + effectSymbolProto.startEffectAnimation = function ( + period, brushType, rippleScale, effectOffset, z, zlevel + ) { + var symbolType = this._symbolType; + var color = this._color; + + var rippleGroup = this.childAt(1); + + for (var i = 0; i < EFFECT_RIPPLE_NUMBER; i++) { + var ripplePath = symbolUtil.createSymbol( + symbolType, -0.5, -0.5, 1, 1, color + ); + ripplePath.attr({ + style: { + stroke: brushType === 'stroke' ? color : null, + fill: brushType === 'fill' ? color : null, + strokeNoScale: true + }, + z2: 99, + silent: true, + scale: [1, 1], + z: z, + zlevel: zlevel + }); + + var delay = -i / EFFECT_RIPPLE_NUMBER * period + effectOffset; + // TODO Configurable period + ripplePath.animate('', true) + .when(period, { + scale: [rippleScale, rippleScale] + }) + .delay(delay) + .start(); + ripplePath.animateStyle(true) + .when(period, { + opacity: 0 + }) + .delay(delay) + .start(); + + rippleGroup.add(ripplePath); + } + }; + + /** + * Highlight symbol + */ + effectSymbolProto.highlight = function () { + this.trigger('emphasis'); + }; + + /** + * Downplay symbol + */ + effectSymbolProto.downplay = function () { + this.trigger('normal'); + }; + + /** + * Update symbol properties + * @param {module:echarts/data/List} data + * @param {number} idx + */ + effectSymbolProto.updateData = function (data, idx) { + var seriesModel = data.hostModel; + + this.childAt(0).updateData(data, idx); + + var rippleGroup = this.childAt(1); + var itemModel = data.getItemModel(idx); + var symbolType = data.getItemVisual(idx, 'symbol'); + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + var color = data.getItemVisual(idx, 'color'); + + rippleGroup.attr('scale', symbolSize); + + rippleGroup.traverse(function (ripplePath) { + ripplePath.attr({ + fill: color + }); + }); + + var symbolOffset = itemModel.getShallow('symbolOffset'); + if (symbolOffset) { + var pos = rippleGroup.position; + pos[0] = numberUtil.parsePercent(symbolOffset[0], symbolSize[0]); + pos[1] = numberUtil.parsePercent(symbolOffset[1], symbolSize[1]); + } + + this._symbolType = symbolType; + this._color = color; + + var showEffectOn = seriesModel.get('showEffectOn'); + var rippleScale = itemModel.get('rippleEffect.scale'); + var brushType = itemModel.get('rippleEffect.brushType'); + var effectPeriod = itemModel.get('rippleEffect.period') * 1000; + var effectOffset = idx / data.count(); + var z = itemModel.getShallow('z') || 0; + var zlevel = itemModel.getShallow('zlevel') || 0; + + this.stopEffectAnimation(); + if (showEffectOn === 'render') { + this.startEffectAnimation( + effectPeriod, brushType, rippleScale, effectOffset, z, zlevel + ); + } + var symbol = this.childAt(0); + function onEmphasis() { + symbol.trigger('emphasis'); + if (showEffectOn !== 'render') { + this.startEffectAnimation( + effectPeriod, brushType, rippleScale, effectOffset, z, zlevel + ); + } + } + function onNormal() { + symbol.trigger('normal'); + if (showEffectOn !== 'render') { + this.stopEffectAnimation(); + } + } + this.on('mouseover', onEmphasis, this) + .on('mouseout', onNormal, this) + .on('emphasis', onEmphasis, this) + .on('normal', onNormal, this); + }; + + effectSymbolProto.fadeOut = function (cb) { + cb && cb(); + }; + + zrUtil.inherits(EffectSymbol, Group); + + module.exports = EffectSymbol; + + +/***/ }, +/* 253 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(254); + __webpack_require__(255); + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + echarts.registerLayout( + __webpack_require__(257) + ); + + echarts.registerVisualCoding( + 'chart', zrUtil.curry(__webpack_require__(88), 'lines', 'lineStyle') + ); + + +/***/ }, +/* 254 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var SeriesModel = __webpack_require__(27); + var List = __webpack_require__(94); + var zrUtil = __webpack_require__(3); + var CoordinateSystem = __webpack_require__(25); + + module.exports = SeriesModel.extend({ + + type: 'series.lines', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + var fromDataArr = []; + var toDataArr = []; + var lineDataArr = []; + zrUtil.each(option.data, function (opt) { + fromDataArr.push(opt[0]); + toDataArr.push(opt[1]); + lineDataArr.push(zrUtil.extend( + zrUtil.extend({}, zrUtil.isArray(opt[0]) ? null : opt[0]), + zrUtil.isArray(opt[1]) ? null : opt[1] + )); + }); + + // var coordSys = option.coordinateSystem; + // if (coordSys !== 'cartesian2d' && coordSys !== 'geo') { + // throw new Error('Coordinate system can only be cartesian2d or geo in lines'); + // } + + // var dimensions = coordSys === 'geo' ? ['lng', 'lat'] : ['x', 'y']; + var coordSys = CoordinateSystem.get(option.coordinateSystem); + if (!coordSys) { + throw new Error('Invalid coordinate system'); + } + var dimensions = coordSys.dimensions; + + var fromData = new List(dimensions, this); + var toData = new List(dimensions, this); + var lineData = new List(['value'], this); + + function geoCoordGetter(item, dim, dataIndex, dimIndex) { + return item.coord && item.coord[dimIndex]; + } + + fromData.initData(fromDataArr, null, geoCoordGetter); + toData.initData(toDataArr, null, geoCoordGetter); + lineData.initData(lineDataArr); + + this.fromData = fromData; + this.toData = toData; + + return lineData; + }, + + formatTooltip: function (dataIndex) { + var fromName = this.fromData.getName(dataIndex); + var toName = this.toData.getName(dataIndex); + return fromName + ' > ' + toName; + }, + + defaultOption: { + coordinateSystem: 'geo', + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + // Geo coordinate system + geoIndex: 0, + + // symbol: null, + // symbolSize: 10, + // symbolRotate: null, + + effect: { + show: false, + period: 4, + symbol: 'circle', + symbolSize: 3, + // Length of trail, 0 - 1 + trailLength: 0.2 + // Same with lineStyle.normal.color + // color + }, + + large: false, + // Available when large is true + largeThreshold: 2000, + + label: { + normal: { + show: false, + position: 'end' + // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + } + }, + // itemStyle: { + // normal: { + // } + // }, + lineStyle: { + normal: { + opacity: 0.5 + } + } + } + }); + + +/***/ }, +/* 255 */ +/***/ function(module, exports, __webpack_require__) { + + + + var LineDraw = __webpack_require__(194); + var EffectLine = __webpack_require__(256); + var Line = __webpack_require__(195); + + __webpack_require__(1).extendChartView({ + + type: 'lines', + + init: function () {}, + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var lineDraw = this._lineDraw; + + var hasEffect = seriesModel.get('effect.show'); + if (hasEffect !== this._hasEffet) { + if (lineDraw) { + lineDraw.remove(); + } + lineDraw = this._lineDraw = new LineDraw( + hasEffect ? EffectLine : Line + ); + this._hasEffet = hasEffect; + } + + var zlevel = seriesModel.get('zlevel'); + var trailLength = seriesModel.get('effect.trailLength'); + + var zr = api.getZr(); + // Avoid the drag cause ghost shadow + // FIXME Better way ? + zr.painter.getLayer(zlevel).clear(true); + // Config layer with motion blur + if (this._lastZlevel != null) { + zr.configLayer(this._lastZlevel, { + motionBlur: false + }); + } + if (hasEffect && trailLength) { + zr.configLayer(zlevel, { + motionBlur: true, + lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0) + }); + } + + this.group.add(lineDraw.group); + + lineDraw.updateData(data); + + this._lastZlevel = zlevel; + }, + + updateLayout: function (seriesModel, ecModel, api) { + this._lineDraw.updateLayout(); + // Not use motion when dragging or zooming + var zr = api.getZr(); + zr.painter.getLayer(this._lastZlevel).clear(true); + }, + + remove: function (ecModel, api) { + this._lineDraw && this._lineDraw.remove(api, true); + } + }); + + +/***/ }, +/* 256 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/EffectLine + */ + + + var graphic = __webpack_require__(42); + var Line = __webpack_require__(195); + var zrUtil = __webpack_require__(3); + var symbolUtil = __webpack_require__(100); + + var curveUtil = __webpack_require__(49); + + /** + * @constructor + * @extends {module:zrender/graphic/Group} + * @alias {module:echarts/chart/helper/Line} + */ + function EffectLine(lineData, fromData, toData, idx) { + graphic.Group.call(this); + + var line = new Line(lineData, fromData, toData, idx); + this.add(line); + + this._updateEffectSymbol(lineData, idx); + } + + var effectLineProto = EffectLine.prototype; + + function setAnimationPoints(symbol, points) { + symbol.__p1 = points[0]; + symbol.__p2 = points[1]; + symbol.__cp1 = points[2] || [ + (points[0][0] + points[1][0]) / 2, + (points[0][1] + points[1][1]) / 2 + ]; + } + + function updateSymbolPosition() { + var p1 = this.__p1; + var p2 = this.__p2; + var cp1 = this.__cp1; + var t = this.__t; + var pos = this.position; + var quadraticAt = curveUtil.quadraticAt; + var quadraticDerivativeAt = curveUtil.quadraticDerivativeAt; + pos[0] = quadraticAt(p1[0], cp1[0], p2[0], t); + pos[1] = quadraticAt(p1[1], cp1[1], p2[1], t); + + // Tangent + var tx = quadraticDerivativeAt(p1[0], cp1[0], p2[0], t); + var ty = quadraticDerivativeAt(p1[1], cp1[1], p2[1], t); + + this.rotation = -Math.atan2(ty, tx) - Math.PI / 2; + + this.ignore = false; + } + + effectLineProto._updateEffectSymbol = function (lineData, idx) { + var itemModel = lineData.getItemModel(idx); + var effectModel = itemModel.getModel('effect'); + var size = effectModel.get('symbolSize'); + var symbolType = effectModel.get('symbol'); + if (!zrUtil.isArray(size)) { + size = [size, size]; + } + var color = effectModel.get('color') || lineData.getItemVisual(idx, 'color'); + var symbol = this.childAt(1); + var period = effectModel.get('period') * 1000; + if (this._symbolType !== symbolType || period !== this._period) { + symbol = symbolUtil.createSymbol( + symbolType, -0.5, -0.5, 1, 1, color + ); + symbol.ignore = true; + symbol.z2 = 100; + this._symbolType = symbolType; + this._period = period; + + this.add(symbol); + + symbol.__t = 0; + symbol.animate('', true) + .when(period, { + __t: 1 + }) + .delay(idx / lineData.count() * period / 2) + .during(zrUtil.bind(updateSymbolPosition, symbol)) + .start(); + } + // Shadow color is same with color in default + symbol.setStyle('shadowColor', color); + symbol.setStyle(effectModel.getItemStyle(['color'])); + + symbol.attr('scale', size); + var points = lineData.getItemLayout(idx); + setAnimationPoints(symbol, points); + + symbol.setColor(color); + symbol.attr('scale', size); + }; + + effectLineProto.updateData = function (lineData, fromData, toData, idx) { + this.childAt(0).updateData(lineData, fromData, toData, idx); + this._updateEffectSymbol(lineData, idx); + }; + + effectLineProto.updateLayout = function (lineData, fromData, toData, idx) { + this.childAt(0).updateLayout(lineData, fromData, toData, idx); + var symbol = this.childAt(1); + var points = lineData.getItemLayout(idx); + setAnimationPoints(symbol, points); + }; + + zrUtil.inherits(EffectLine, graphic.Group); + + module.exports = EffectLine; + + +/***/ }, +/* 257 */ +/***/ function(module, exports) { + + + + module.exports = function (ecModel) { + ecModel.eachSeriesByType('lines', function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var fromData = seriesModel.fromData; + var toData = seriesModel.toData; + var lineData = seriesModel.getData(); + + var dims = coordSys.dimensions; + fromData.each(dims, function (x, y, idx) { + fromData.setItemLayout(idx, coordSys.dataToPoint([x, y])); + }); + toData.each(dims, function (x, y, idx) { + toData.setItemLayout(idx, coordSys.dataToPoint([x, y])); + }); + lineData.each(function (idx) { + var p1 = fromData.getItemLayout(idx); + var p2 = toData.getItemLayout(idx); + var curveness = lineData.getItemModel(idx).get('lineStyle.normal.curveness'); + var cp1; + if (curveness > 0) { + cp1 = [ + (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, + (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness + ]; + } + lineData.setItemLayout(idx, [p1, p2, cp1]); + }); + }); + }; + + +/***/ }, +/* 258 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(259); + __webpack_require__(260); + + +/***/ }, +/* 259 */ +/***/ function(module, exports, __webpack_require__) { + + + + var SeriesModel = __webpack_require__(27); + var createListFromArray = __webpack_require__(93); + + module.exports = SeriesModel.extend({ + type: 'series.heatmap', + + getInitialData: function (option, ecModel) { + return createListFromArray(option.data, this, ecModel); + }, + + defaultOption: { + + // Cartesian2D or geo + coordinateSystem: 'cartesian2d', + + zlevel: 0, + + z: 2, + + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + // Geo coordinate system + geoIndex: 0, + + blurSize: 30, + + pointSize: 20, + + maxOpacity: 1, + + minOpacity: 0 + } + }); + + +/***/ }, +/* 260 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var HeatmapLayer = __webpack_require__(261); + var zrUtil = __webpack_require__(3); + + function getIsInPiecewiseRange(dataExtent, pieceList, selected) { + var dataSpan = dataExtent[1] - dataExtent[0]; + pieceList = zrUtil.map(pieceList, function (piece) { + return { + interval: [ + (piece.interval[0] - dataExtent[0]) / dataSpan, + (piece.interval[1] - dataExtent[0]) / dataSpan + ] + }; + }); + var len = pieceList.length; + var lastIndex = 0; + return function (val) { + // Try to find in the location of the last found + for (var i = lastIndex; i < len; i++) { + var interval = pieceList[i].interval; + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + if (i === len) { // Not found, back interation + for (var i = lastIndex - 1; i >= 0; i--) { + var interval = pieceList[i].interval; + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + } + return i >= 0 && i < len && selected[i]; + }; + } + + function getIsInContinuousRange(dataExtent, range) { + var dataSpan = dataExtent[1] - dataExtent[0]; + range = [ + (range[0] - dataExtent[0]) / dataSpan, + (range[1] - dataExtent[0]) / dataSpan + ]; + return function (val) { + return val >= range[0] && val <= range[1]; + }; + } + + function isGeoCoordSys(coordSys) { + var dimensions = coordSys.dimensions; + // Not use coorSys.type === 'geo' because coordSys maybe extended + return dimensions[0] === 'lng' && dimensions[1] === 'lat'; + } + + module.exports = __webpack_require__(1).extendChartView({ + + type: 'heatmap', + + render: function (seriesModel, ecModel, api) { + var visualMapOfThisSeries; + ecModel.eachComponent('visualMap', function (visualMap) { + visualMap.eachTargetSeries(function (targetSeries) { + if (targetSeries === seriesModel) { + visualMapOfThisSeries = visualMap; + } + }); + }); + + if (!visualMapOfThisSeries) { + throw new Error('Heatmap must use with visualMap'); + } + + this.group.removeAll(); + var coordSys = seriesModel.coordinateSystem; + if (coordSys.type === 'cartesian2d') { + this._renderOnCartesian(coordSys, seriesModel, api); + } + else if (isGeoCoordSys(coordSys)) { + this._renderOnGeo( + coordSys, seriesModel, visualMapOfThisSeries, api + ); + } + }, + + _renderOnCartesian: function (cartesian, seriesModel, api) { + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + var group = this.group; + + if (!(xAxis.type === 'category' && yAxis.type === 'category')) { + throw new Error('Heatmap on cartesian must have two category axes'); + } + if (!(xAxis.onBand && yAxis.onBand)) { + throw new Error('Heatmap on cartesian must have two axes with boundaryGap true'); + } + var width = xAxis.getBandWidth(); + var height = yAxis.getBandWidth(); + + var data = seriesModel.getData(); + data.each(['x', 'y', 'z'], function (x, y, z, idx) { + var itemModel = data.getItemModel(idx); + var point = cartesian.dataToPoint([x, y]); + // Ignore empty data + if (isNaN(z)) { + return; + } + var rect = new graphic.Rect({ + shape: { + x: point[0] - width / 2, + y: point[1] - height / 2, + width: width, + height: height + }, + style: { + fill: data.getItemVisual(idx, 'color') + } + }); + var style = itemModel.getModel('itemStyle.normal').getItemStyle(['color']); + var hoverStl = itemModel.getModel('itemStyle.emphasis').getItemStyle(); + var labelModel = itemModel.getModel('label.normal'); + var hoverLabelModel = itemModel.getModel('label.emphasis'); + + var rawValue = seriesModel.getRawValue(idx); + var defaultText = '-'; + if (rawValue && rawValue[2] != null) { + defaultText = rawValue[2]; + } + if (labelModel.get('show')) { + graphic.setText(style, labelModel); + style.text = seriesModel.getFormattedLabel(idx, 'normal') || defaultText; + } + if (hoverLabelModel.get('show')) { + graphic.setText(hoverStl, hoverLabelModel); + hoverStl.text = seriesModel.getFormattedLabel(idx, 'emphasis') || defaultText; + } + + rect.setStyle(style); + + graphic.setHoverStyle(rect, hoverStl); + + group.add(rect); + data.setItemGraphicEl(idx, rect); + }); + }, + + _renderOnGeo: function (geo, seriesModel, visualMapModel, api) { + var inRangeVisuals = visualMapModel.targetVisuals.inRange; + var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange; + // if (!visualMapping) { + // throw new Error('Data range must have color visuals'); + // } + + var data = seriesModel.getData(); + var hmLayer = this._hmLayer || (this._hmLayer || new HeatmapLayer()); + hmLayer.blurSize = seriesModel.get('blurSize'); + hmLayer.pointSize = seriesModel.get('pointSize'); + hmLayer.minOpacity = seriesModel.get('minOpacity'); + hmLayer.maxOpacity = seriesModel.get('maxOpacity'); + + var rect = geo.getViewRect().clone(); + var roamTransform = geo.getRoamTransform(); + rect.applyTransform(roamTransform); + + // Clamp on viewport + var x = Math.max(rect.x, 0); + var y = Math.max(rect.y, 0); + var x2 = Math.min(rect.width + rect.x, api.getWidth()); + var y2 = Math.min(rect.height + rect.y, api.getHeight()); + var width = x2 - x; + var height = y2 - y; + + var points = data.mapArray(['lng', 'lat', 'value'], function (lng, lat, value) { + var pt = geo.dataToPoint([lng, lat]); + pt[0] -= x; + pt[1] -= y; + pt.push(value); + return pt; + }); + + var dataExtent = visualMapModel.getExtent(); + var isInRange = visualMapModel.type === 'visualMap.continuous' + ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) + : getIsInPiecewiseRange( + dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected + ); + + hmLayer.update( + points, width, height, + inRangeVisuals.color.getNormalizer(), + { + inRange: inRangeVisuals.color.getColorMapper(), + outOfRange: outOfRangeVisuals.color.getColorMapper() + }, + isInRange + ); + var img = new graphic.Image({ + style: { + width: width, + height: height, + x: x, + y: y, + image: hmLayer.canvas + }, + silent: true + }); + this.group.add(img); + } + }); + + +/***/ }, +/* 261 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file defines echarts Heatmap Chart + * @author Ovilia (me@zhangwenli.com) + * Inspired by https://github.com/mourner/simpleheat + * + * @module + */ + + + var GRADIENT_LEVELS = 256; + var zrUtil = __webpack_require__(3); + + /** + * Heatmap Chart + * + * @class + */ + function Heatmap() { + var canvas = zrUtil.createCanvas(); + this.canvas = canvas; + + this.blurSize = 30; + this.pointSize = 20; + + this.maxOpacity = 1; + this.minOpacity = 0; + + this._gradientPixels = {}; + } + + Heatmap.prototype = { + /** + * Renders Heatmap and returns the rendered canvas + * @param {Array} data array of data, each has x, y, value + * @param {number} width canvas width + * @param {number} height canvas height + */ + update: function(data, width, height, normalize, colorFunc, isInRange) { + var brush = this._getBrush(); + var gradientInRange = this._getGradient(data, colorFunc, 'inRange'); + var gradientOutOfRange = this._getGradient(data, colorFunc, 'outOfRange'); + var r = this.pointSize + this.blurSize; + + var canvas = this.canvas; + var ctx = canvas.getContext('2d'); + var len = data.length; + canvas.width = width; + canvas.height = height; + for (var i = 0; i < len; ++i) { + var p = data[i]; + var x = p[0]; + var y = p[1]; + var value = p[2]; + + // calculate alpha using value + var alpha = normalize(value); + + // draw with the circle brush with alpha + ctx.globalAlpha = alpha; + ctx.drawImage(brush, x - r, y - r); + } + + // colorize the canvas using alpha value and set with gradient + var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + var pixels = imageData.data; + var offset = 0; + var pixelLen = pixels.length; + var minOpacity = this.minOpacity; + var maxOpacity = this.maxOpacity; + var diffOpacity = maxOpacity - minOpacity; + + while(offset < pixelLen) { + var alpha = pixels[offset + 3] / 256; + var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4; + // Simple optimize to ignore the empty data + if (alpha > 0) { + var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange; + // Any alpha > 0 will be mapped to [minOpacity, maxOpacity] + alpha > 0 && (alpha = alpha * diffOpacity + minOpacity); + pixels[offset++] = gradient[gradientOffset]; + pixels[offset++] = gradient[gradientOffset + 1]; + pixels[offset++] = gradient[gradientOffset + 2]; + pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256; + } + else { + offset += 4; + } + } + ctx.putImageData(imageData, 0, 0); + + return canvas; + }, + + /** + * get canvas of a black circle brush used for canvas to draw later + * @private + * @returns {Object} circle brush canvas + */ + _getBrush: function() { + var brushCanvas = this._brushCanvas || (this._brushCanvas = zrUtil.createCanvas()); + // set brush size + var r = this.pointSize + this.blurSize; + var d = r * 2; + brushCanvas.width = d; + brushCanvas.height = d; + + var ctx = brushCanvas.getContext('2d'); + ctx.clearRect(0, 0, d, d); + + // in order to render shadow without the distinct circle, + // draw the distinct circle in an invisible place, + // and use shadowOffset to draw shadow in the center of the canvas + ctx.shadowOffsetX = d; + ctx.shadowBlur = this.blurSize; + // draw the shadow in black, and use alpha and shadow blur to generate + // color in color map + ctx.shadowColor = '#000'; + + // draw circle in the left to the canvas + ctx.beginPath(); + ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + return brushCanvas; + }, + + /** + * get gradient color map + * @private + */ + _getGradient: function (data, colorFunc, state) { + var gradientPixels = this._gradientPixels; + var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4)); + var color = []; + var off = 0; + for (var i = 0; i < 256; i++) { + colorFunc[state](i / 255, true, color); + pixelsSingleState[off++] = color[0]; + pixelsSingleState[off++] = color[1]; + pixelsSingleState[off++] = color[2]; + pixelsSingleState[off++] = color[3]; + } + return pixelsSingleState; + } + }; + + module.exports = Heatmap; + + + +/***/ }, +/* 262 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Legend component entry file8 + */ + + + __webpack_require__(263); + __webpack_require__(264); + __webpack_require__(265); + + var echarts = __webpack_require__(1); + // Series Filter + echarts.registerProcessor('filter', __webpack_require__(267)); + + +/***/ }, +/* 263 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var Model = __webpack_require__(8); + + var LegendModel = __webpack_require__(1).extendComponentModel({ + + type: 'legend', + + dependencies: ['series'], + + layoutMode: { + type: 'box', + ignoreSize: true + }, + + init: function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + + option.selected = option.selected || {}; + + this._updateData(ecModel); + + var legendData = this._data; + // If has any selected in option.selected + var selectedMap = this.option.selected; + // If selectedMode is single, try to select one + if (legendData[0] && this.get('selectedMode') === 'single') { + var hasSelected = false; + for (var name in selectedMap) { + if (selectedMap[name]) { + this.select(name); + hasSelected = true; + } + } + // Try select the first if selectedMode is single + !hasSelected && this.select(legendData[0].get('name')); + } + }, + + mergeOption: function (option) { + LegendModel.superCall(this, 'mergeOption', option); + + this._updateData(this.ecModel); + }, + + _updateData: function (ecModel) { + var legendData = zrUtil.map(this.get('data') || [], function (dataItem) { + if (typeof dataItem === 'string') { + dataItem = { + name: dataItem + }; + } + return new Model(dataItem, this, this.ecModel); + }, this); + this._data = legendData; + + var availableNames = zrUtil.map(ecModel.getSeries(), function (series) { + return series.name; + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.legendDataProvider) { + var data = seriesModel.legendDataProvider(); + availableNames = availableNames.concat(data.mapArray(data.getName)); + } + }); + /** + * @type {Array.} + * @private + */ + this._availableNames = availableNames; + }, + + /** + * @return {Array.} + */ + getData: function () { + return this._data; + }, + + /** + * @param {string} name + */ + select: function (name) { + var selected = this.option.selected; + var selectedMode = this.get('selectedMode'); + if (selectedMode === 'single') { + var data = this._data; + zrUtil.each(data, function (dataItem) { + selected[dataItem.get('name')] = false; + }); + } + selected[name] = true; + }, + + /** + * @param {string} name + */ + unSelect: function (name) { + if (this.get('selectedMode') !== 'single') { + this.option.selected[name] = false; + } + }, + + /** + * @param {string} name + */ + toggleSelected: function (name) { + var selected = this.option.selected; + // Default is true + if (!(name in selected)) { + selected[name] = true; + } + this[selected[name] ? 'unSelect' : 'select'](name); + }, + + /** + * @param {string} name + */ + isSelected: function (name) { + var selected = this.option.selected; + return !((name in selected) && !selected[name]) + && zrUtil.indexOf(this._availableNames, name) >= 0; + }, + + defaultOption: { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 4, + show: true, + + // 布局方式,默认为水平布局,可选为: + // 'horizontal' | 'vertical' + orient: 'horizontal', + + left: 'center', + // right: 'center', + + top: 'top', + // bottom: 'top', + + // 水平对齐 + // 'auto' | 'left' | 'right' + // 默认为 'auto', 根据 x 的位置判断是左对齐还是右对齐 + align: 'auto', + + backgroundColor: 'rgba(0,0,0,0)', + // 图例边框颜色 + borderColor: '#ccc', + // 图例边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + // 图例内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + // 各个item之间的间隔,单位px,默认为10, + // 横向布局时为水平间隔,纵向布局时为纵向间隔 + itemGap: 10, + // 图例图形宽度 + itemWidth: 25, + // 图例图形高度 + itemHeight: 14, + textStyle: { + // 图例文字颜色 + color: '#333' + }, + // formatter: '', + // 选择模式,默认开启图例开关 + selectedMode: true + // 配置默认选中状态,可配合LEGEND.SELECTED事件做动态数据载入 + // selected: null, + // 图例内容(详见legend.data,数组中每一项代表一个item + // data: [], + } + }); + + module.exports = LegendModel; + + +/***/ }, +/* 264 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Legend action + */ + + + var echarts = __webpack_require__(1); + var zrUtil = __webpack_require__(3); + + function legendSelectActionHandler(methodName, payload, ecModel) { + var selectedMap = {}; + var isToggleSelect = methodName === 'toggleSelected'; + var isSelected; + // Update all legend components + ecModel.eachComponent('legend', function (legendModel) { + if (isToggleSelect && isSelected != null) { + // Force other legend has same selected status + // Or the first is toggled to true and other are toggled to false + // In the case one legend has some item unSelected in option. And if other legend + // doesn't has the item, they will assume it is selected. + legendModel[isSelected ? 'select' : 'unSelect'](payload.name); + } + else { + legendModel[methodName](payload.name); + isSelected = legendModel.isSelected(payload.name); + } + var legendData = legendModel.getData(); + zrUtil.each(legendData, function (model) { + var name = model.get('name'); + // Wrap element + if (name === '\n' || name === '') { + return; + } + var isItemSelected = legendModel.isSelected(name); + if (name in selectedMap) { + // Unselected if any legend is unselected + selectedMap[name] = selectedMap[name] && isItemSelected; + } + else { + selectedMap[name] = isItemSelected; + } + }); + }); + // Return the event explicitly + return { + name: payload.name, + selected: selectedMap + }; + } + /** + * @event legendToggleSelect + * @type {Object} + * @property {string} type 'legendToggleSelect' + * @property {string} [from] + * @property {string} name Series name or data item name + */ + echarts.registerAction( + 'legendToggleSelect', 'legendselectchanged', + zrUtil.curry(legendSelectActionHandler, 'toggleSelected') + ); + + /** + * @event legendSelect + * @type {Object} + * @property {string} type 'legendSelect' + * @property {string} name Series name or data item name + */ + echarts.registerAction( + 'legendSelect', 'legendselected', + zrUtil.curry(legendSelectActionHandler, 'select') + ); + + /** + * @event legendUnSelect + * @type {Object} + * @property {string} type 'legendUnSelect' + * @property {string} name Series name or data item name + */ + echarts.registerAction( + 'legendUnSelect', 'legendunselected', + zrUtil.curry(legendSelectActionHandler, 'unSelect') + ); + + +/***/ }, +/* 265 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var symbolCreator = __webpack_require__(100); + var graphic = __webpack_require__(42); + var listComponentHelper = __webpack_require__(266); + + var curry = zrUtil.curry; + + var LEGEND_DISABLE_COLOR = '#ccc'; + + function dispatchSelectAction(name, api) { + api.dispatchAction({ + type: 'legendToggleSelect', + name: name + }); + } + + function dispatchHighlightAction(seriesModel, dataName, api) { + seriesModel.get('legendHoverLink') && api.dispatchAction({ + type: 'highlight', + seriesName: seriesModel.name, + name: dataName + }); + } + + function dispatchDownplayAction(seriesModel, dataName, api) { + seriesModel.get('legendHoverLink') && api.dispatchAction({ + type: 'downplay', + seriesName: seriesModel.name, + name: dataName + }); + } + + module.exports = __webpack_require__(1).extendComponentView({ + + type: 'legend', + + init: function () { + this._symbolTypeStore = {}; + }, + + render: function (legendModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + if (!legendModel.get('show')) { + return; + } + + var selectMode = legendModel.get('selectedMode'); + var itemAlign = legendModel.get('align'); + + if (itemAlign === 'auto') { + itemAlign = (legendModel.get('left') === 'right' + && legendModel.get('orient') === 'vertical') + ? 'right' : 'left'; + } + + var legendItemMap = {}; + var legendDrawedMap = {}; + zrUtil.each(legendModel.getData(), function (itemModel) { + var seriesName = itemModel.get('name'); + // Use empty string or \n as a newline string + if (seriesName === '' || seriesName === '\n') { + group.add(new graphic.Group({ + newline: true + })); + } + + var seriesModel = ecModel.getSeriesByName(seriesName)[0]; + + legendItemMap[seriesName] = itemModel; + + if (!seriesModel || legendDrawedMap[seriesName]) { + // Series not exists + return; + } + + var data = seriesModel.getData(); + var color = data.getVisual('color'); + + // If color is a callback function + if (typeof color === 'function') { + // Use the first data + color = color(seriesModel.getDataParams(0)); + } + + // Using rect symbol defaultly + var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect'; + var symbolType = data.getVisual('symbol'); + + var itemGroup = this._createItem( + seriesName, itemModel, legendModel, + legendSymbolType, symbolType, + itemAlign, color, + selectMode + ); + + itemGroup.on('click', curry(dispatchSelectAction, seriesName, api)) + .on('mouseover', curry(dispatchHighlightAction, seriesModel, '', api)) + .on('mouseout', curry(dispatchDownplayAction, seriesModel, '', api)); + + legendDrawedMap[seriesName] = true; + }, this); + + ecModel.eachRawSeries(function (seriesModel) { + if (seriesModel.legendDataProvider) { + var data = seriesModel.legendDataProvider(); + data.each(function (idx) { + var name = data.getName(idx); + + // Avoid mutiple series use the same data name + if (!legendItemMap[name] || legendDrawedMap[name]) { + return; + } + + var color = data.getItemVisual(idx, 'color'); + + var legendSymbolType = 'roundRect'; + + var itemGroup = this._createItem( + name, legendItemMap[name], legendModel, + legendSymbolType, null, + itemAlign, color, + selectMode + ); + + itemGroup.on('click', curry(dispatchSelectAction, name, api)) + // FIXME Should not specify the series name + .on('mouseover', curry(dispatchHighlightAction, seriesModel, name, api)) + .on('mouseout', curry(dispatchDownplayAction, seriesModel, name, api)); + + legendDrawedMap[name] = true; + }, false, this); + } + }, this); + + listComponentHelper.layout(group, legendModel, api); + // Render background after group is layout + // FIXME + listComponentHelper.addBackground(group, legendModel); + }, + + _createItem: function ( + name, itemModel, legendModel, + legendSymbolType, symbolType, + itemAlign, color, selectMode + ) { + var itemWidth = legendModel.get('itemWidth'); + var itemHeight = legendModel.get('itemHeight'); + + var isSelected = legendModel.isSelected(name); + var itemGroup = new graphic.Group(); + + var textStyleModel = itemModel.getModel('textStyle'); + + var itemIcon = itemModel.get('icon'); + + // Use user given icon first + legendSymbolType = itemIcon || legendSymbolType; + itemGroup.add(symbolCreator.createSymbol( + legendSymbolType, 0, 0, itemWidth, itemHeight, isSelected ? color : LEGEND_DISABLE_COLOR + )); + + // Compose symbols + // PENDING + if (!itemIcon && symbolType + // At least show one symbol, can't be all none + && ((symbolType !== legendSymbolType) || symbolType == 'none') + ) { + var size = itemHeight * 0.8; + if (symbolType === 'none') { + symbolType = 'circle'; + } + // Put symbol in the center + itemGroup.add(symbolCreator.createSymbol( + symbolType, (itemWidth - size) / 2, (itemHeight - size) / 2, size, size, + isSelected ? color : LEGEND_DISABLE_COLOR + )); + } + + // Text + var textX = itemAlign === 'left' ? itemWidth + 5 : -5; + var textAlign = itemAlign; + + var formatter = legendModel.get('formatter'); + if (typeof formatter === 'string' && formatter) { + name = formatter.replace('{name}', name); + } + else if (typeof formatter === 'function') { + name = formatter(name); + } + + var text = new graphic.Text({ + style: { + text: name, + x: textX, + y: itemHeight / 2, + fill: isSelected ? textStyleModel.getTextColor() : LEGEND_DISABLE_COLOR, + textFont: textStyleModel.getFont(), + textAlign: textAlign, + textVerticalAlign: 'middle' + } + }); + itemGroup.add(text); + + // Add a invisible rect to increase the area of mouse hover + itemGroup.add(new graphic.Rect({ + shape: itemGroup.getBoundingRect(), + invisible: true + })); + + itemGroup.eachChild(function (child) { + child.silent = !selectMode; + }); + + this.group.add(itemGroup); + + graphic.setHoverStyle(itemGroup); + + return itemGroup; + } + }); + + +/***/ }, +/* 266 */ +/***/ function(module, exports, __webpack_require__) { + + + // List layout + var layout = __webpack_require__(21); + var formatUtil = __webpack_require__(6); + var graphic = __webpack_require__(42); + + function positionGroup(group, model, api) { + layout.positionGroup( + group, model.getBoxLayoutParams(), + { + width: api.getWidth(), + height: api.getHeight() + }, + model.get('padding') + ); + } + + module.exports = { + /** + * Layout list like component. + * It will box layout each items in group of component and then position the whole group in the viewport + * @param {module:zrender/group/Group} group + * @param {module:echarts/model/Component} componentModel + * @param {module:echarts/ExtensionAPI} + */ + layout: function (group, componentModel, api) { + var rect = layout.getLayoutRect(componentModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }, componentModel.get('padding')); + layout.box( + componentModel.get('orient'), + group, + componentModel.get('itemGap'), + rect.width, + rect.height + ); + + positionGroup(group, componentModel, api); + }, + + addBackground: function (group, componentModel) { + var padding = formatUtil.normalizeCssArray( + componentModel.get('padding') + ); + var boundingRect = group.getBoundingRect(); + var style = componentModel.getItemStyle(['color', 'opacity']); + style.fill = componentModel.get('backgroundColor'); + var rect = new graphic.Rect({ + shape: { + x: boundingRect.x - padding[3], + y: boundingRect.y - padding[0], + width: boundingRect.width + padding[1] + padding[3], + height: boundingRect.height + padding[0] + padding[2] + }, + style: style, + silent: true, + z2: -1 + }); + graphic.subPixelOptimizeRect(rect); + + group.add(rect); + } + }; + + +/***/ }, +/* 267 */ +/***/ function(module, exports) { + + + module.exports = function (ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (legendModels && legendModels.length) { + ecModel.filterSeries(function (series) { + // If in any legend component the status is not selected. + // Because in legend series is assumed selected when it is not in the legend data. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(series.name)) { + return false; + } + } + return true; + }); + } + }; + + +/***/ }, +/* 268 */ +/***/ function(module, exports, __webpack_require__) { + + // FIXME Better way to pack data in graphic element + + + __webpack_require__(269); + + __webpack_require__(270); + + // Show tip action + /** + * @action + * @property {string} type + * @property {number} seriesIndex + * @property {number} dataIndex + * @property {number} [x] + * @property {number} [y] + */ + __webpack_require__(1).registerAction( + { + type: 'showTip', + event: 'showTip', + update: 'none' + }, + // noop + function () {} + ); + // Hide tip action + __webpack_require__(1).registerAction( + { + type: 'hideTip', + event: 'hideTip', + update: 'none' + }, + // noop + function () {} + ); + + +/***/ }, +/* 269 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(1).extendComponentModel({ + + type: 'tooltip', + + defaultOption: { + zlevel: 0, + + z: 8, + + show: true, + + // tooltip主体内容 + showContent: true, + + // 触发类型,默认数据触发,见下图,可选为:'item' ¦ 'axis' + trigger: 'item', + + // 触发条件,支持 'click' | 'mousemove' + triggerOn: 'mousemove', + + // 是否永远显示 content + alwaysShowContent: false, + + // 位置 {Array} | {Function} + // position: null + + // 内容格式器:{string}(Template) ¦ {Function} + // formatter: null + + // 隐藏延迟,单位ms + hideDelay: 100, + + // 动画变换时间,单位s + transitionDuration: 0.4, + + enterable: false, + + // 提示背景颜色,默认为透明度为0.7的黑色 + backgroundColor: 'rgba(50,50,50,0.7)', + + // 提示边框颜色 + borderColor: '#333', + + // 提示边框圆角,单位px,默认为4 + borderRadius: 4, + + // 提示边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + + // 提示内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + + // Extra css text + extraCssText: '', + + // 坐标轴指示器,坐标轴触发有效 + axisPointer: { + // 默认为直线 + // 可选为:'line' | 'shadow' | 'cross' + type: 'line', + + // type 为 line 的时候有效,指定 tooltip line 所在的轴,可选 + // 可选 'x' | 'y' | 'angle' | 'radius' | 'auto' + // 默认 'auto',会选择类型为 cateogry 的轴,对于双数值轴,笛卡尔坐标系会默认选择 x 轴 + // 极坐标系会默认选择 angle 轴 + axis: 'auto', + + animation: true, + animationDurationUpdate: 200, + animationEasingUpdate: 'exponentialOut', + + // 直线指示器样式设置 + lineStyle: { + color: '#555', + width: 1, + type: 'solid' + }, + + crossStyle: { + color: '#555', + width: 1, + type: 'dashed', + + // TODO formatter + textStyle: {} + }, + + // 阴影指示器样式设置 + shadowStyle: { + color: 'rgba(150,150,150,0.3)' + } + }, + textStyle: { + color: '#fff', + fontSize: 14 + } + } + }); + + +/***/ }, +/* 270 */ +/***/ function(module, exports, __webpack_require__) { + + + + var TooltipContent = __webpack_require__(271); + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var formatUtil = __webpack_require__(6); + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + var env = __webpack_require__(78); + + function dataEqual(a, b) { + if (!a || !b) { + return false; + } + var round = numberUtil.round; + return round(a[0]) === round(b[0]) + && round(a[1]) === round(b[1]); + } + /** + * @inner + */ + function makeLineShape(x1, y1, x2, y2) { + return { + x1: x1, + y1: y1, + x2: x2, + y2: y2 + }; + } + + /** + * @inner + */ + function makeRectShape(x, y, width, height) { + return { + x: x, + y: y, + width: width, + height: height + }; + } + + /** + * @inner + */ + function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) { + return { + cx: cx, + cy: cy, + r0: r0, + r: r, + startAngle: startAngle, + endAngle: endAngle, + clockwise: true + }; + } + + function refixTooltipPosition(x, y, el, viewWidth, viewHeight) { + var width = el.clientWidth; + var height = el.clientHeight; + var gap = 20; + + if (x + width + gap > viewWidth) { + x -= width + gap; + } + else { + x += gap; + } + if (y + height + gap > viewHeight) { + y -= height + gap; + } + else { + y += gap; + } + return [x, y]; + } + + function calcTooltipPosition(position, rect, dom) { + var domWidth = dom.clientWidth; + var domHeight = dom.clientHeight; + var gap = 5; + var x = 0; + var y = 0; + var rectWidth = rect.width; + var rectHeight = rect.height; + switch (position) { + case 'inside': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + case 'top': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y - domHeight - gap; + break; + case 'bottom': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight + gap; + break; + case 'left': + x = rect.x - domWidth - gap; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + case 'right': + x = rect.x + rectWidth + gap; + y = rect.y + rectHeight / 2 - domHeight / 2; + } + return [x, y]; + } + + /** + * @param {string|Function|Array.} positionExpr + * @param {number} x Mouse x + * @param {number} y Mouse y + * @param {module:echarts/component/tooltip/TooltipContent} content + * @param {Object|} params + * @param {module:zrender/Element} el target element + * @param {module:echarts/ExtensionAPI} api + * @return {Array.} + */ + function updatePosition(positionExpr, x, y, content, params, el, api) { + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + + var rect = el && el.getBoundingRect().clone(); + el && rect.applyTransform(el.transform); + if (typeof positionExpr === 'function') { + // Callback of position can be an array or a string specify the positiont + positionExpr = positionExpr([x, y], params, rect); + } + + if (zrUtil.isArray(positionExpr)) { + x = parsePercent(positionExpr[0], viewWidth); + y = parsePercent(positionExpr[1], viewHeight); + } + // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element + else if (typeof positionExpr === 'string' && el) { + var pos = calcTooltipPosition( + positionExpr, rect, content.el + ); + x = pos[0]; + y = pos[1]; + } + else { + var pos = refixTooltipPosition( + x, y, content.el, viewWidth, viewHeight + ); + x = pos[0]; + y = pos[1]; + } + + content.moveTo(x, y); + } + + function ifSeriesSupportAxisTrigger(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var trigger = seriesModel.get('tooltip.trigger', true); + // Ignore series use item tooltip trigger and series coordinate system is not cartesian or + return !(!coordSys + || (coordSys.type !== 'cartesian2d' && coordSys.type !== 'polar' && coordSys.type !== 'single') + || trigger === 'item'); + } + + __webpack_require__(1).extendComponentView({ + + type: 'tooltip', + + _axisPointers: {}, + + init: function (ecModel, api) { + if (env.node) { + return; + } + var tooltipContent = new TooltipContent(api.getDom(), api); + this._tooltipContent = tooltipContent; + + api.on('showTip', this._manuallyShowTip, this); + api.on('hideTip', this._manuallyHideTip, this); + }, + + render: function (tooltipModel, ecModel, api) { + if (env.node) { + return; + } + + // Reset + this.group.removeAll(); + + /** + * @type {Object} + * @private + */ + this._axisPointers = {}; + + /** + * @private + * @type {module:echarts/component/tooltip/TooltipModel} + */ + this._tooltipModel = tooltipModel; + + /** + * @private + * @type {module:echarts/model/Global} + */ + this._ecModel = ecModel; + + /** + * @private + * @type {module:echarts/ExtensionAPI} + */ + this._api = api; + + /** + * @type {Object} + * @private + */ + this._lastHover = { + // data + // payloadBatch + }; + + var tooltipContent = this._tooltipContent; + tooltipContent.update(); + tooltipContent.enterable = tooltipModel.get('enterable'); + this._alwaysShowContent = tooltipModel.get('alwaysShowContent'); + + /** + * @type {Object.} + */ + this._seriesGroupByAxis = this._prepareAxisTriggerData( + tooltipModel, ecModel + ); + + var crossText = this._crossText; + if (crossText) { + this.group.add(crossText); + } + + // Try to keep the tooltip show when refreshing + if (this._lastX != null && this._lastY != null) { + var self = this; + clearTimeout(this._refreshUpdateTimeout); + this._refreshUpdateTimeout = setTimeout(function () { + // Show tip next tick after other charts are rendered + // In case highlight action has wrong result + // FIXME + self._manuallyShowTip({ + x: self._lastX, + y: self._lastY + }); + }); + } + + var zr = this._api.getZr(); + var tryShow = this._tryShow; + zr.off('click', tryShow); + zr.off('mousemove', tryShow); + zr.off('mouseout', this._hide); + if (tooltipModel.get('triggerOn') === 'click') { + zr.on('click', tryShow, this); + } + else { + zr.on('mousemove', tryShow, this); + zr.on('mouseout', this._hide, this); + } + + }, + + /** + * Show tip manually by + * dispatchAction({ + * type: 'showTip', + * x: 10, + * y: 10 + * }); + * Or + * dispatchAction({ + * type: 'showTip', + * seriesIndex: 0, + * dataIndex: 1 + * }); + * + * TODO Batch + */ + _manuallyShowTip: function (event) { + // From self + if (event.from === this.uid) { + return; + } + + var ecModel = this._ecModel; + var seriesIndex = event.seriesIndex; + var dataIndex = event.dataIndex; + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + var api = this._api; + + if (event.x == null || event.y == null) { + if (!seriesModel) { + // Find the first series can use axis trigger + ecModel.eachSeries(function (_series) { + if (ifSeriesSupportAxisTrigger(_series) && !seriesModel) { + seriesModel = _series; + } + }); + } + if (seriesModel) { + var data = seriesModel.getData(); + if (dataIndex == null) { + dataIndex = data.indexOfName(event.name); + } + var el = data.getItemGraphicEl(dataIndex); + var cx, cy; + // Try to get the point in coordinate system + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.dataToPoint) { + var point = coordSys.dataToPoint( + data.getValues(coordSys.dimensions, dataIndex, true) + ); + cx = point && point[0]; + cy = point && point[1]; + } + else if (el) { + // Use graphic bounding rect + var rect = el.getBoundingRect().clone(); + rect.applyTransform(el.transform); + cx = rect.x + rect.width / 2; + cy = rect.y + rect.height / 2; + } + if (cx != null && cy != null) { + this._tryShow({ + offsetX: cx, + offsetY: cy, + target: el, + event: {} + }); + } + } + } + else { + var el = api.getZr().handler.findHover(event.x, event.y); + this._tryShow({ + offsetX: event.x, + offsetY: event.y, + target: el, + event: {} + }); + } + }, + + _manuallyHideTip: function (e) { + if (e.from === this.uid) { + return; + } + + this._hide(); + }, + + _prepareAxisTriggerData: function (tooltipModel, ecModel) { + // Prepare data for axis trigger + var seriesGroupByAxis = {}; + ecModel.eachSeries(function (seriesModel) { + if (ifSeriesSupportAxisTrigger(seriesModel)) { + var coordSys = seriesModel.coordinateSystem; + var baseAxis; + var key; + + // Only cartesian2d, polar and single support axis trigger + if (coordSys.type === 'cartesian2d') { + // FIXME `axisPointer.axis` is not baseAxis + baseAxis = coordSys.getBaseAxis(); + key = baseAxis.dim + baseAxis.index; + } + else if (coordSys.type === 'single') { + baseAxis = coordSys.getAxis(); + key = baseAxis.dim + baseAxis.type; + } + else { + baseAxis = coordSys.getBaseAxis(); + key = baseAxis.dim + coordSys.name; + } + + seriesGroupByAxis[key] = seriesGroupByAxis[key] || { + coordSys: [], + series: [] + }; + seriesGroupByAxis[key].coordSys.push(coordSys); + seriesGroupByAxis[key].series.push(seriesModel); + } + }, this); + + return seriesGroupByAxis; + }, + + /** + * mousemove handler + * @param {Object} e + * @private + */ + _tryShow: function (e) { + var el = e.target; + var tooltipModel = this._tooltipModel; + var globalTrigger = tooltipModel.get('trigger'); + var ecModel = this._ecModel; + var api = this._api; + + if (!tooltipModel) { + return; + } + + // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed + this._lastX = e.offsetX; + this._lastY = e.offsetY; + + // Always show item tooltip if mouse is on the element with dataIndex + if (el && el.dataIndex != null) { + // Use dataModel in element if possible + // Used when mouseover on a element like markPoint or edge + // In which case, the data is not main data in series. + var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex); + var dataIndex = el.dataIndex; + var itemModel = dataModel.getData().getItemModel(dataIndex); + // Series or single data may use item trigger when global is axis trigger + if ((itemModel.get('tooltip.trigger') || globalTrigger) === 'axis') { + this._showAxisTooltip(tooltipModel, ecModel, e); + } + else { + // Reset ticket + this._ticket = ''; + // If either single data or series use item trigger + this._hideAxisPointer(); + // Reset last hover and dispatch downplay action + this._resetLastHover(); + + this._showItemTooltipContent(dataModel, dataIndex, e); + } + + api.dispatchAction({ + type: 'showTip', + from: this.uid, + dataIndex: el.dataIndex, + seriesIndex: el.seriesIndex + }); + } + else { + if (globalTrigger === 'item') { + this._hide(); + } + else { + // Try show axis tooltip + this._showAxisTooltip(tooltipModel, ecModel, e); + } + + // Action of cross pointer + // other pointer types will trigger action in _dispatchAndShowSeriesTooltipContent method + if (tooltipModel.get('axisPointer.type') === 'cross') { + api.dispatchAction({ + type: 'showTip', + from: this.uid, + x: e.offsetX, + y: e.offsetY + }); + } + } + }, + + /** + * Show tooltip on axis + * @param {module:echarts/component/tooltip/TooltipModel} tooltipModel + * @param {module:echarts/model/Global} ecModel + * @param {Object} e + * @private + */ + _showAxisTooltip: function (tooltipModel, ecModel, e) { + var axisPointerModel = tooltipModel.getModel('axisPointer'); + var axisPointerType = axisPointerModel.get('type'); + + if (axisPointerType === 'cross') { + var el = e.target; + if (el && el.dataIndex != null) { + var seriesModel = ecModel.getSeriesByIndex(el.seriesIndex); + var dataIndex = el.dataIndex; + this._showItemTooltipContent(seriesModel, dataIndex, e); + } + } + + this._showAxisPointer(); + var allNotShow = true; + zrUtil.each(this._seriesGroupByAxis, function (seriesCoordSysSameAxis) { + // Try show the axis pointer + var allCoordSys = seriesCoordSysSameAxis.coordSys; + var coordSys = allCoordSys[0]; + + // If mouse position is not in the grid or polar + var point = [e.offsetX, e.offsetY]; + + if (!coordSys.containPoint(point)) { + // Hide axis pointer + this._hideAxisPointer(coordSys.name); + return; + } + + allNotShow = false; + // Make sure point is discrete on cateogry axis + var dimensions = coordSys.dimensions; + var value = coordSys.pointToData(point, true); + point = coordSys.dataToPoint(value); + var baseAxis = coordSys.getBaseAxis(); + var axisType = axisPointerModel.get('axis'); + if (axisType === 'auto') { + axisType = baseAxis.dim; + } + + var contentNotChange = false; + var lastHover = this._lastHover; + if (axisPointerType === 'cross') { + // If hover data not changed + // Possible when two axes are all category + if (dataEqual(lastHover.data, value)) { + contentNotChange = true; + } + lastHover.data = value; + } + else { + var valIndex = zrUtil.indexOf(dimensions, axisType); + + // If hover data not changed on the axis dimension + if (lastHover.data === value[valIndex]) { + contentNotChange = true; + } + lastHover.data = value[valIndex]; + } + + if (coordSys.type === 'cartesian2d' && !contentNotChange) { + this._showCartesianPointer( + axisPointerModel, coordSys, axisType, point + ); + } + else if (coordSys.type === 'polar' && !contentNotChange) { + this._showPolarPointer( + axisPointerModel, coordSys, axisType, point + ); + } + else if (coordSys.type === 'single' && !contentNotChange) { + this._showSinglePointer( + axisPointerModel, coordSys, axisType, point + ); + } + + if (axisPointerType !== 'cross') { + this._dispatchAndShowSeriesTooltipContent( + coordSys, seriesCoordSysSameAxis.series, point, value, contentNotChange + ); + } + }, this); + + if (allNotShow) { + this._hide(); + } + }, + + /** + * Show tooltip on axis of cartesian coordinate + * @param {module:echarts/model/Model} axisPointerModel + * @param {module:echarts/coord/cartesian/Cartesian2D} cartesians + * @param {string} axisType + * @param {Array.} point + * @private + */ + _showCartesianPointer: function (axisPointerModel, cartesian, axisType, point) { + var self = this; + + var axisPointerType = axisPointerModel.get('type'); + var moveAnimation = axisPointerType !== 'cross'; + + if (axisPointerType === 'cross') { + moveGridLine('x', point, cartesian.getAxis('y').getGlobalExtent()); + moveGridLine('y', point, cartesian.getAxis('x').getGlobalExtent()); + + this._updateCrossText(cartesian, point, axisPointerModel); + } + else { + var otherAxis = cartesian.getAxis(axisType === 'x' ? 'y' : 'x'); + var otherExtent = otherAxis.getGlobalExtent(); + + if (cartesian.type === 'cartesian2d') { + (axisPointerType === 'line' ? moveGridLine : moveGridShadow)( + axisType, point, otherExtent + ); + } + } + + /** + * @inner + */ + function moveGridLine(axisType, point, otherExtent) { + var targetShape = axisType === 'x' + ? makeLineShape(point[0], otherExtent[0], point[0], otherExtent[1]) + : makeLineShape(otherExtent[0], point[1], otherExtent[1], point[1]); + + var pointerEl = self._getPointerElement( + cartesian, axisPointerModel, axisType, targetShape + ); + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + + /** + * @inner + */ + function moveGridShadow(axisType, point, otherExtent) { + var axis = cartesian.getAxis(axisType); + var bandWidth = axis.getBandWidth(); + var span = otherExtent[1] - otherExtent[0]; + var targetShape = axisType === 'x' + ? makeRectShape(point[0] - bandWidth / 2, otherExtent[0], bandWidth, span) + : makeRectShape(otherExtent[0], point[1] - bandWidth / 2, span, bandWidth); + + var pointerEl = self._getPointerElement( + cartesian, axisPointerModel, axisType, targetShape + ); + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + }, + + _showSinglePointer: function (axisPointerModel, single, axisType, point) { + var self = this; + var axisPointerType = axisPointerModel.get('type'); + var moveAnimation = axisPointerType !== 'cross'; + var rect = single.getRect(); + var otherExtent = [rect.y, rect.y + rect.height]; + + moveSingleLine(axisType, point, otherExtent); + + /** + * @inner + */ + function moveSingleLine(axisType, point, otherExtent) { + var axis = single.getAxis(); + var orient = axis.orient; + + var targetShape = orient === 'horizontal' + ? makeLineShape(point[0], otherExtent[0], point[0], otherExtent[1]) + : makeLineShape(otherExtent[0], point[1], otherExtent[1], point[1]); + + var pointerEl = self._getPointerElement( + single, axisPointerModel, axisType, targetShape + ); + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + + }, + + /** + * Show tooltip on axis of polar coordinate + * @param {module:echarts/model/Model} axisPointerModel + * @param {Array.} polar + * @param {string} axisType + * @param {Array.} point + */ + _showPolarPointer: function (axisPointerModel, polar, axisType, point) { + var self = this; + + var axisPointerType = axisPointerModel.get('type'); + + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); + + var moveAnimation = axisPointerType !== 'cross'; + + if (axisPointerType === 'cross') { + movePolarLine('angle', point, radiusAxis.getExtent()); + movePolarLine('radius', point, angleAxis.getExtent()); + + this._updateCrossText(polar, point, axisPointerModel); + } + else { + var otherAxis = polar.getAxis(axisType === 'radius' ? 'angle' : 'radius'); + var otherExtent = otherAxis.getExtent(); + + (axisPointerType === 'line' ? movePolarLine : movePolarShadow)( + axisType, point, otherExtent + ); + } + /** + * @inner + */ + function movePolarLine(axisType, point, otherExtent) { + var mouseCoord = polar.pointToCoord(point); + + var targetShape; + + if (axisType === 'angle') { + var p1 = polar.coordToPoint([otherExtent[0], mouseCoord[1]]); + var p2 = polar.coordToPoint([otherExtent[1], mouseCoord[1]]); + targetShape = makeLineShape(p1[0], p1[1], p2[0], p2[1]); + } + else { + targetShape = { + cx: polar.cx, + cy: polar.cy, + r: mouseCoord[0] + }; + } + + var pointerEl = self._getPointerElement( + polar, axisPointerModel, axisType, targetShape + ); + + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + + /** + * @inner + */ + function movePolarShadow(axisType, point, otherExtent) { + var axis = polar.getAxis(axisType); + var bandWidth = axis.getBandWidth(); + + var mouseCoord = polar.pointToCoord(point); + + var targetShape; + + var radian = Math.PI / 180; + + if (axisType === 'angle') { + targetShape = makeSectorShape( + polar.cx, polar.cy, + otherExtent[0], otherExtent[1], + // In ECharts y is negative if angle is positive + (-mouseCoord[1] - bandWidth / 2) * radian, + (-mouseCoord[1] + bandWidth / 2) * radian + ); + } + else { + targetShape = makeSectorShape( + polar.cx, polar.cy, + mouseCoord[0] - bandWidth / 2, + mouseCoord[0] + bandWidth / 2, + 0, Math.PI * 2 + ); + } + + var pointerEl = self._getPointerElement( + polar, axisPointerModel, axisType, targetShape + ); + moveAnimation + ? graphic.updateProps(pointerEl, { + shape: targetShape + }, axisPointerModel) + : pointerEl.attr({ + shape: targetShape + }); + } + }, + + _updateCrossText: function (coordSys, point, axisPointerModel) { + var crossStyleModel = axisPointerModel.getModel('crossStyle'); + var textStyleModel = crossStyleModel.getModel('textStyle'); + + var tooltipModel = this._tooltipModel; + + var text = this._crossText; + if (!text) { + text = this._crossText = new graphic.Text({ + style: { + textAlign: 'left', + textVerticalAlign: 'bottom' + } + }); + this.group.add(text); + } + + var value = coordSys.pointToData(point); + + var dims = coordSys.dimensions; + value = zrUtil.map(value, function (val, idx) { + var axis = coordSys.getAxis(dims[idx]); + if (axis.type === 'category' || axis.type === 'time') { + val = axis.scale.getLabel(val); + } + else { + val = formatUtil.addCommas( + val.toFixed(axis.getPixelPrecision()) + ); + } + return val; + }); + + text.setStyle({ + fill: textStyleModel.getTextColor() || crossStyleModel.get('color'), + textFont: textStyleModel.getFont(), + text: value.join(', '), + x: point[0] + 5, + y: point[1] - 5 + }); + text.z = tooltipModel.get('z'); + text.zlevel = tooltipModel.get('zlevel'); + }, + + _getPointerElement: function (coordSys, pointerModel, axisType, initShape) { + var tooltipModel = this._tooltipModel; + var z = tooltipModel.get('z'); + var zlevel = tooltipModel.get('zlevel'); + var axisPointers = this._axisPointers; + var coordSysName = coordSys.name; + axisPointers[coordSysName] = axisPointers[coordSysName] || {}; + if (axisPointers[coordSysName][axisType]) { + return axisPointers[coordSysName][axisType]; + } + + // Create if not exists + var pointerType = pointerModel.get('type'); + var styleModel = pointerModel.getModel(pointerType + 'Style'); + var isShadow = pointerType === 'shadow'; + var style = styleModel[isShadow ? 'getAreaStyle' : 'getLineStyle'](); + + var elementType = coordSys.type === 'polar' + ? (isShadow ? 'Sector' : (axisType === 'radius' ? 'Circle' : 'Line')) + : (isShadow ? 'Rect' : 'Line'); + + isShadow ? (style.stroke = null) : (style.fill = null); + + var el = axisPointers[coordSysName][axisType] = new graphic[elementType]({ + style: style, + z: z, + zlevel: zlevel, + silent: true, + shape: initShape + }); + + this.group.add(el); + return el; + }, + + /** + * Dispatch actions and show tooltip on series + * @param {Array.} seriesList + * @param {Array.} point + * @param {Array.} value + * @param {boolean} contentNotChange + * @param {Object} e + */ + _dispatchAndShowSeriesTooltipContent: function ( + coordSys, seriesList, point, value, contentNotChange + ) { + + var rootTooltipModel = this._tooltipModel; + var tooltipContent = this._tooltipContent; + + var baseAxis = coordSys.getBaseAxis(); + + var payloadBatch = zrUtil.map(seriesList, function (series) { + return { + seriesIndex: series.seriesIndex, + dataIndex: series.getAxisTooltipDataIndex + ? series.getAxisTooltipDataIndex(series.coordDimToDataDim(baseAxis.dim), value, baseAxis) + : series.getData().indexOfNearest( + series.coordDimToDataDim(baseAxis.dim)[0], + value[baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1] + ) + }; + }); + + var lastHover = this._lastHover; + var api = this._api; + // Dispatch downplay action + if (lastHover.payloadBatch && !contentNotChange) { + api.dispatchAction({ + type: 'downplay', + batch: lastHover.payloadBatch + }); + } + // Dispatch highlight action + if (!contentNotChange) { + api.dispatchAction({ + type: 'highlight', + batch: payloadBatch + }); + lastHover.payloadBatch = payloadBatch; + } + // Dispatch showTip action + api.dispatchAction({ + type: 'showTip', + dataIndex: payloadBatch[0].dataIndex, + seriesIndex: payloadBatch[0].seriesIndex, + from: this.uid + }); + + if (baseAxis && rootTooltipModel.get('showContent')) { + + var formatter = rootTooltipModel.get('formatter'); + var positionExpr = rootTooltipModel.get('position'); + var html; + + var paramsList = zrUtil.map(seriesList, function (series, index) { + return series.getDataParams(payloadBatch[index].dataIndex); + }); + // If only one series + // FIXME + // if (paramsList.length === 1) { + // paramsList = paramsList[0]; + // } + + tooltipContent.show(rootTooltipModel); + + // Update html content + var firstDataIndex = payloadBatch[0].dataIndex; + if (!contentNotChange) { + // Reset ticket + this._ticket = ''; + if (!formatter) { + // Default tooltip content + // FIXME + // (1) shold be the first data which has name? + // (2) themeRiver, firstDataIndex is array, and first line is unnecessary. + var firstLine = seriesList[0].getData().getName(firstDataIndex); + html = (firstLine ? firstLine + '
            ' : '') + + zrUtil.map(seriesList, function (series, index) { + return series.formatTooltip(payloadBatch[index].dataIndex, true); + }).join('
            '); + } + else { + if (typeof formatter === 'string') { + html = formatUtil.formatTpl(formatter, paramsList); + } + else if (typeof formatter === 'function') { + var self = this; + var ticket = 'axis_' + coordSys.name + '_' + firstDataIndex; + var callback = function (cbTicket, html) { + if (cbTicket === self._ticket) { + tooltipContent.setContent(html); + + updatePosition( + positionExpr, point[0], point[1], + tooltipContent, paramsList, null, api + ); + } + }; + self._ticket = ticket; + html = formatter(paramsList, ticket, callback); + } + } + + tooltipContent.setContent(html); + } + + updatePosition( + positionExpr, point[0], point[1], + tooltipContent, paramsList, null, api + ); + } + }, + + /** + * Show tooltip on item + * @param {module:echarts/model/Series} seriesModel + * @param {number} dataIndex + * @param {Object} e + */ + _showItemTooltipContent: function (seriesModel, dataIndex, e) { + // FIXME Graph data + var api = this._api; + var data = seriesModel.getData(); + var itemModel = data.getItemModel(dataIndex); + + var rootTooltipModel = this._tooltipModel; + + var tooltipContent = this._tooltipContent; + + var tooltipModel = itemModel.getModel('tooltip'); + + // If series model + if (tooltipModel.parentModel) { + tooltipModel.parentModel.parentModel = rootTooltipModel; + } + else { + tooltipModel.parentModel = this._tooltipModel; + } + + if (tooltipModel.get('showContent')) { + var formatter = tooltipModel.get('formatter'); + var positionExpr = tooltipModel.get('position'); + var params = seriesModel.getDataParams(dataIndex); + var html; + if (!formatter) { + html = seriesModel.formatTooltip(dataIndex); + } + else { + if (typeof formatter === 'string') { + html = formatUtil.formatTpl(formatter, params); + } + else if (typeof formatter === 'function') { + var self = this; + var ticket = 'item_' + seriesModel.name + '_' + dataIndex; + var callback = function (cbTicket, html) { + if (cbTicket === self._ticket) { + tooltipContent.setContent(html); + + updatePosition( + positionExpr, e.offsetX, e.offsetY, + tooltipContent, params, e.target, api + ); + } + }; + self._ticket = ticket; + html = formatter(params, ticket, callback); + } + } + + tooltipContent.show(tooltipModel); + tooltipContent.setContent(html); + + updatePosition( + positionExpr, e.offsetX, e.offsetY, + tooltipContent, params, e.target, api + ); + } + }, + + /** + * Show axis pointer + * @param {string} [coordSysName] + */ + _showAxisPointer: function (coordSysName) { + if (coordSysName) { + var axisPointers = this._axisPointers[coordSysName]; + axisPointers && zrUtil.each(axisPointers, function (el) { + el.show(); + }); + } + else { + this.group.eachChild(function (child) { + child.show(); + }); + this.group.show(); + } + }, + + _resetLastHover: function () { + var lastHover = this._lastHover; + if (lastHover.payloadBatch) { + this._api.dispatchAction({ + type: 'downplay', + batch: lastHover.payloadBatch + }); + } + // Reset lastHover + this._lastHover = {}; + }, + /** + * Hide axis pointer + * @param {string} [coordSysName] + */ + _hideAxisPointer: function (coordSysName) { + if (coordSysName) { + var axisPointers = this._axisPointers[coordSysName]; + axisPointers && zrUtil.each(axisPointers, function (el) { + el.hide(); + }); + } + else { + this.group.hide(); + } + }, + + _hide: function () { + this._hideAxisPointer(); + this._resetLastHover(); + if (!this._alwaysShowContent) { + this._tooltipContent.hideLater(this._tooltipModel.get('hideDelay')); + } + + this._api.dispatchAction({ + type: 'hideTip', + from: this.uid + }); + }, + + dispose: function (ecModel, api) { + if (env.node) { + return; + } + var zr = api.getZr(); + this._tooltipContent.hide(); + + zr.off('click', this._tryShow); + zr.off('mousemove', this._tryShow); + zr.off('mouseout', this._hide); + + api.off('showTip', this._manuallyShowTip); + api.off('hideTip', this._manuallyHideTip); + } + }); + + +/***/ }, +/* 271 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/component/tooltip/TooltipContent + */ + + + var zrUtil = __webpack_require__(3); + var zrColor = __webpack_require__(38); + var eventUtil = __webpack_require__(80); + var formatUtil = __webpack_require__(6); + var each = zrUtil.each; + var toCamelCase = formatUtil.toCamelCase; + + var vendors = ['', '-webkit-', '-moz-', '-o-']; + + var gCssText = 'position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;'; + + /** + * @param {number} duration + * @return {string} + * @inner + */ + function assembleTransition(duration) { + var transitionCurve = 'cubic-bezier(0.23, 1, 0.32, 1)'; + var transitionText = 'left ' + duration + 's ' + transitionCurve + ',' + + 'top ' + duration + 's ' + transitionCurve; + return zrUtil.map(vendors, function (vendorPrefix) { + return vendorPrefix + 'transition:' + transitionText; + }).join(';'); + } + + /** + * @param {Object} textStyle + * @return {string} + * @inner + */ + function assembleFont(textStyleModel) { + var cssText = []; + + var fontSize = textStyleModel.get('fontSize'); + var color = textStyleModel.getTextColor(); + + color && cssText.push('color:' + color); + + cssText.push('font:' + textStyleModel.getFont()); + + fontSize && + cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px'); + + each(['decoration', 'align'], function (name) { + var val = textStyleModel.get(name); + val && cssText.push('text-' + name + ':' + val); + }); + + return cssText.join(';'); + } + + /** + * @param {Object} tooltipModel + * @return {string} + * @inner + */ + function assembleCssText(tooltipModel) { + + tooltipModel = tooltipModel; + + var cssText = []; + + var transitionDuration = tooltipModel.get('transitionDuration'); + var backgroundColor = tooltipModel.get('backgroundColor'); + var textStyleModel = tooltipModel.getModel('textStyle'); + var padding = tooltipModel.get('padding'); + + // Animation transition + transitionDuration && + cssText.push(assembleTransition(transitionDuration)); + + if (backgroundColor) { + // for ie + cssText.push( + 'background-Color:' + zrColor.toHex(backgroundColor) + ); + cssText.push('filter:alpha(opacity=70)'); + cssText.push('background-Color:' + backgroundColor); + } + + // Border style + each(['width', 'color', 'radius'], function (name) { + var borderName = 'border-' + name; + var camelCase = toCamelCase(borderName); + var val = tooltipModel.get(camelCase); + val != null && + cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px')); + }); + + // Text style + cssText.push(assembleFont(textStyleModel)); + + // Padding + if (padding != null) { + cssText.push('padding:' + formatUtil.normalizeCssArray(padding).join('px ') + 'px'); + } + + return cssText.join(';') + ';'; + } + + /** + * @alias module:echarts/component/tooltip/TooltipContent + * @constructor + */ + function TooltipContent(container, api) { + var el = document.createElement('div'); + var zr = api.getZr(); + + this.el = el; + + this._x = api.getWidth() / 2; + this._y = api.getHeight() / 2; + + container.appendChild(el); + + this._container = container; + + this._show = false; + + /** + * @private + */ + this._hideTimeout; + + var self = this; + el.onmouseenter = function () { + // clear the timeout in hideLater and keep showing tooltip + if (self.enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + self._inContent = true; + }; + el.onmousemove = function (e) { + if (!self.enterable) { + // Try trigger zrender event to avoid mouse + // in and out shape too frequently + var handler = zr.handler; + eventUtil.normalizeEvent(container, e); + handler.dispatch('mousemove', e); + } + }; + el.onmouseleave = function () { + if (self.enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + self._inContent = false; + }; + + compromiseMobile(el, container); + } + + function compromiseMobile(tooltipContentEl, container) { + // Prevent default behavior on mobile. For example, + // defuault pinch gesture will cause browser zoom. + // We do not preventing event on tooltip contnet el, + // because user may need customization in tooltip el. + eventUtil.addEventListener(container, 'touchstart', preventDefault); + eventUtil.addEventListener(container, 'touchmove', preventDefault); + eventUtil.addEventListener(container, 'touchend', preventDefault); + + function preventDefault(e) { + if (contains(e.target)) { + e.preventDefault(); + } + } + + function contains(targetEl) { + while (targetEl && targetEl !== container) { + if (targetEl === tooltipContentEl) { + return true; + } + targetEl = targetEl.parentNode; + } + } + } + + TooltipContent.prototype = { + + constructor: TooltipContent, + + enterable: true, + + /** + * Update when tooltip is rendered + */ + update: function () { + var container = this._container; + var stl = container.currentStyle + || document.defaultView.getComputedStyle(container); + var domStyle = container.style; + if (domStyle.position !== 'absolute' && stl.position !== 'absolute') { + domStyle.position = 'relative'; + } + // Hide the tooltip + // PENDING + // this.hide(); + }, + + show: function (tooltipModel) { + clearTimeout(this._hideTimeout); + + this.el.style.cssText = gCssText + assembleCssText(tooltipModel) + // http://stackoverflow.com/questions/21125587/css3-transition-not-working-in-chrome-anymore + + ';left:' + this._x + 'px;top:' + this._y + 'px;' + + (tooltipModel.get('extraCssText') || ''); + + this._show = true; + }, + + setContent: function (content) { + var el = this.el; + el.innerHTML = content; + el.style.display = content ? 'block' : 'none'; + }, + + moveTo: function (x, y) { + var style = this.el.style; + style.left = x + 'px'; + style.top = y + 'px'; + + this._x = x; + this._y = y; + }, + + hide: function () { + this.el.style.display = 'none'; + this._show = false; + }, + + // showLater: function () + + hideLater: function (time) { + if (this._show && !(this._inContent && this.enterable)) { + if (time) { + this._hideDelay = time; + // Set show false to avoid invoke hideLater mutiple times + this._show = false; + this._hideTimeout = setTimeout(zrUtil.bind(this.hide, this), time); + } + else { + this.hide(); + } + } + }, + + isShow: function () { + return this._show; + } + }; + + module.exports = TooltipContent; + + +/***/ }, +/* 272 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + __webpack_require__(273); + __webpack_require__(279); + __webpack_require__(281); + + // Polar view + __webpack_require__(1).extendComponentView({ + type: 'polar' + }); + + +/***/ }, +/* 273 */ +/***/ function(module, exports, __webpack_require__) { + + // TODO Axis scale + + + var Polar = __webpack_require__(274); + var numberUtil = __webpack_require__(7); + + var axisHelper = __webpack_require__(108); + var niceScaleExtent = axisHelper.niceScaleExtent; + + // 依赖 PolarModel 做预处理 + __webpack_require__(277); + + /** + * Resize method bound to the polar + * @param {module:echarts/coord/polar/PolarModel} polarModel + * @param {module:echarts/ExtensionAPI} api + */ + function resizePolar(polarModel, api) { + var center = polarModel.get('center'); + var radius = polarModel.get('radius'); + var width = api.getWidth(); + var height = api.getHeight(); + var parsePercent = numberUtil.parsePercent; + + this.cx = parsePercent(center[0], width); + this.cy = parsePercent(center[1], height); + + var radiusAxis = this.getRadiusAxis(); + var size = Math.min(width, height) / 2; + // var idx = radiusAxis.inverse ? 1 : 0; + radiusAxis.setExtent(0, parsePercent(radius, size)); + } + + /** + * Update polar + */ + function updatePolarScale(ecModel, api) { + var polar = this; + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); + // Reset scale + angleAxis.scale.setExtent(Infinity, -Infinity); + radiusAxis.scale.setExtent(Infinity, -Infinity); + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === polar) { + var data = seriesModel.getData(); + radiusAxis.scale.unionExtent( + data.getDataExtent('radius', radiusAxis.type !== 'category') + ); + angleAxis.scale.unionExtent( + data.getDataExtent('angle', angleAxis.type !== 'category') + ); + } + }); + + niceScaleExtent(angleAxis, angleAxis.model); + niceScaleExtent(radiusAxis, radiusAxis.model); + + // Fix extent of category angle axis + if (angleAxis.type === 'category' && !angleAxis.onBand) { + var extent = angleAxis.getExtent(); + var diff = 360 / angleAxis.scale.count(); + angleAxis.inverse ? (extent[1] += diff) : (extent[1] -= diff); + angleAxis.setExtent(extent[0], extent[1]); + } + } + + /** + * Set common axis properties + * @param {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis} + * @param {module:echarts/coord/polar/AxisModel} + * @inner + */ + function setAxis(axis, axisModel) { + axis.type = axisModel.get('type'); + axis.scale = axisHelper.createScaleByModel(axisModel); + axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category'; + + // FIXME Radius axis not support inverse axis + if (axisModel.mainType === 'angleAxis') { + var startAngle = axisModel.get('startAngle'); + axis.inverse = axisModel.get('inverse') ^ axisModel.get('clockwise'); + axis.setExtent(startAngle, startAngle + (axis.inverse ? -360 : 360)); + } + + // Inject axis instance + axisModel.axis = axis; + axis.model = axisModel; + } + + + var polarCreator = { + + dimensions: Polar.prototype.dimensions, + + create: function (ecModel, api) { + var polarList = []; + ecModel.eachComponent('polar', function (polarModel, idx) { + var polar = new Polar(idx); + // Inject resize and update method + polar.resize = resizePolar; + polar.update = updatePolarScale; + + var radiusAxis = polar.getRadiusAxis(); + var angleAxis = polar.getAngleAxis(); + + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + + setAxis(radiusAxis, radiusAxisModel); + setAxis(angleAxis, angleAxisModel); + + polar.resize(polarModel, api); + polarList.push(polar); + + polarModel.coordinateSystem = polar; + }); + // Inject coordinateSystem to series + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'polar') { + seriesModel.coordinateSystem = polarList[seriesModel.get('polarIndex')]; + } + }); + + return polarList; + } + }; + + __webpack_require__(25).register('polar', polarCreator); + + +/***/ }, +/* 274 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module echarts/coord/polar/Polar + */ + + + var RadiusAxis = __webpack_require__(275); + var AngleAxis = __webpack_require__(276); + + /** + * @alias {module:echarts/coord/polar/Polar} + * @constructor + * @param {string} name + */ + var Polar = function (name) { + + /** + * @type {string} + */ + this.name = name || ''; + + /** + * x of polar center + * @type {number} + */ + this.cx = 0; + + /** + * y of polar center + * @type {number} + */ + this.cy = 0; + + /** + * @type {module:echarts/coord/polar/RadiusAxis} + * @private + */ + this._radiusAxis = new RadiusAxis(); + + /** + * @type {module:echarts/coord/polar/AngleAxis} + * @private + */ + this._angleAxis = new AngleAxis(); + }; + + Polar.prototype = { + + constructor: Polar, + + type: 'polar', + + /** + * @param {Array.} + * @readOnly + */ + dimensions: ['radius', 'angle'], + + /** + * If contain coord + * @param {Array.} point + * @return {boolean} + */ + containPoint: function (point) { + var coord = this.pointToCoord(point); + return this._radiusAxis.contain(coord[0]) + && this._angleAxis.contain(coord[1]); + }, + + /** + * If contain data + * @param {Array.} data + * @return {boolean} + */ + containData: function (data) { + return this._radiusAxis.containData(data[0]) + && this._angleAxis.containData(data[1]); + }, + + /** + * @param {string} axisType + * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis} + */ + getAxis: function (axisType) { + return this['_' + axisType + 'Axis']; + }, + + /** + * Get axes by type of scale + * @param {string} scaleType + * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis} + */ + getAxesByScale: function (scaleType) { + var axes = []; + var angleAxis = this._angleAxis; + var radiusAxis = this._radiusAxis; + angleAxis.scale.type === scaleType && axes.push(angleAxis); + radiusAxis.scale.type === scaleType && axes.push(radiusAxis); + + return axes; + }, + + /** + * @return {module:echarts/coord/polar/AngleAxis} + */ + getAngleAxis: function () { + return this._angleAxis; + }, + + /** + * @return {module:echarts/coord/polar/RadiusAxis} + */ + getRadiusAxis: function () { + return this._radiusAxis; + }, + + /** + * @param {module:echarts/coord/polar/Axis} + * @return {module:echarts/coord/polar/Axis} + */ + getOtherAxis: function (axis) { + var angleAxis = this._angleAxis; + return axis === angleAxis ? this._radiusAxis : angleAxis; + }, + + /** + * Base axis will be used on stacking. + * + * @return {module:echarts/coord/polar/Axis} + */ + getBaseAxis: function () { + return this.getAxesByScale('ordinal')[0] + || this.getAxesByScale('time')[0] + || this.getAngleAxis(); + }, + + /** + * Convert series data to a list of (x, y) points + * @param {module:echarts/data/List} data + * @return {Array} + * Return list of coordinates. For example: + * `[[10, 10], [20, 20], [30, 30]]` + */ + dataToPoints: function (data) { + return data.mapArray(this.dimensions, function (radius, angle) { + return this.dataToPoint([radius, angle]); + }, this); + }, + + /** + * Convert a single data item to (x, y) point. + * Parameter data is an array which the first element is radius and the second is angle + * @param {Array.} data + * @param {boolean} [clamp=false] + * @return {Array.} + */ + dataToPoint: function (data, clamp) { + return this.coordToPoint([ + this._radiusAxis.dataToRadius(data[0], clamp), + this._angleAxis.dataToAngle(data[1], clamp) + ]); + }, + + /** + * Convert a (x, y) point to data + * @param {Array.} point + * @param {boolean} [clamp=false] + * @return {Array.} + */ + pointToData: function (point, clamp) { + var coord = this.pointToCoord(point); + return [ + this._radiusAxis.radiusToData(coord[0], clamp), + this._angleAxis.angleToData(coord[1], clamp) + ]; + }, + + /** + * Convert a (x, y) point to (radius, angle) coord + * @param {Array.} point + * @return {Array.} + */ + pointToCoord: function (point) { + var dx = point[0] - this.cx; + var dy = point[1] - this.cy; + var angleAxis = this.getAngleAxis(); + var extent = angleAxis.getExtent(); + var minAngle = Math.min(extent[0], extent[1]); + var maxAngle = Math.max(extent[0], extent[1]); + // Fix fixed extent in polarCreator + // FIXME + angleAxis.inverse + ? (minAngle = maxAngle - 360) + : (maxAngle = minAngle + 360); + + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + + var radian = Math.atan2(-dy, dx) / Math.PI * 180; + + // move to angleExtent + var dir = radian < minAngle ? 1 : -1; + while (radian < minAngle || radian > maxAngle) { + radian += dir * 360; + } + + return [radius, radian]; + }, + + /** + * Convert a (radius, angle) coord to (x, y) point + * @param {Array.} coord + * @return {Array.} + */ + coordToPoint: function (coord) { + var radius = coord[0]; + var radian = coord[1] / 180 * Math.PI; + var x = Math.cos(radian) * radius + this.cx; + // Inverse the y + var y = -Math.sin(radian) * radius + this.cy; + + return [x, y]; + } + }; + + module.exports = Polar; + + +/***/ }, +/* 275 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var Axis = __webpack_require__(117); + + function RadiusAxis(scale, radiusExtent) { + + Axis.call(this, 'radius', scale, radiusExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = 'category'; + } + + RadiusAxis.prototype = { + + constructor: RadiusAxis, + + dataToRadius: Axis.prototype.dataToCoord, + + radiusToData: Axis.prototype.coordToData + }; + + zrUtil.inherits(RadiusAxis, Axis); + + module.exports = RadiusAxis; + + +/***/ }, +/* 276 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var Axis = __webpack_require__(117); + + function AngleAxis(scale, angleExtent) { + + angleExtent = angleExtent || [0, 360]; + + Axis.call(this, 'angle', scale, angleExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = 'category'; + } + + AngleAxis.prototype = { + + constructor: AngleAxis, + + dataToAngle: Axis.prototype.dataToCoord, + + angleToData: Axis.prototype.coordToData + }; + + zrUtil.inherits(AngleAxis, Axis); + + module.exports = AngleAxis; + + +/***/ }, +/* 277 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + __webpack_require__(278); + + __webpack_require__(1).extendComponentModel({ + + type: 'polar', + + dependencies: ['polarAxis', 'angleAxis'], + + /** + * @type {module:echarts/coord/polar/Polar} + */ + coordinateSystem: null, + + /** + * @param {string} axisType + * @return {module:echarts/coord/polar/AxisModel} + */ + findAxisModel: function (axisType) { + var angleAxisModel; + var ecModel = this.ecModel; + ecModel.eachComponent(axisType, function (axisModel) { + if (ecModel.getComponent( + 'polar', axisModel.getShallow('polarIndex') + ) === this) { + angleAxisModel = axisModel; + } + }, this); + return angleAxisModel; + }, + + defaultOption: { + + zlevel: 0, + + z: 0, + + center: ['50%', '50%'], + + radius: '80%' + } + }); + + +/***/ }, +/* 278 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var ComponentModel = __webpack_require__(19); + var axisModelCreator = __webpack_require__(121); + + var PolarAxisModel = ComponentModel.extend({ + type: 'polarAxis', + /** + * @type {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis} + */ + axis: null + }); + + zrUtil.merge(PolarAxisModel.prototype, __webpack_require__(123)); + + var polarAxisDefaultExtendedOption = { + angle: { + polarIndex: 0, + + startAngle: 90, + + clockwise: true, + + splitNumber: 12, + + axisLabel: { + rotate: false + } + }, + radius: { + polarIndex: 0, + + splitNumber: 5 + } + }; + + function getAxisType(axisDim, option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); + } + + axisModelCreator('angle', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.angle); + axisModelCreator('radius', PolarAxisModel, getAxisType, polarAxisDefaultExtendedOption.radius); + + + +/***/ }, +/* 279 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + __webpack_require__(273); + + __webpack_require__(280); + + +/***/ }, +/* 280 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var Model = __webpack_require__(8); + + var elementList = ['axisLine', 'axisLabel', 'axisTick', 'splitLine', 'splitArea']; + + function getAxisLineShape(polar, r0, r, angle) { + var start = polar.coordToPoint([r0, angle]); + var end = polar.coordToPoint([r, angle]); + + return { + x1: start[0], + y1: start[1], + x2: end[0], + y2: end[1] + }; + } + __webpack_require__(1).extendComponentView({ + + type: 'angleAxis', + + render: function (angleAxisModel, ecModel) { + this.group.removeAll(); + if (!angleAxisModel.get('show')) { + return; + } + + var polarModel = ecModel.getComponent('polar', angleAxisModel.get('polarIndex')); + var angleAxis = angleAxisModel.axis; + var polar = polarModel.coordinateSystem; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var ticksAngles = angleAxis.getTicksCoords(); + + if (angleAxis.type !== 'category') { + // Remove the last tick which will overlap the first tick + ticksAngles.pop(); + } + + zrUtil.each(elementList, function (name) { + if (angleAxisModel.get(name +'.show')) { + this['_' + name](angleAxisModel, polar, ticksAngles, radiusExtent); + } + }, this); + }, + + /** + * @private + */ + _axisLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + var lineStyleModel = angleAxisModel.getModel('axisLine.lineStyle'); + + var circle = new graphic.Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[1] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + circle.style.fill = null; + + this.group.add(circle); + }, + + /** + * @private + */ + _axisTick: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + var tickModel = angleAxisModel.getModel('axisTick'); + + var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length'); + + var lines = zrUtil.map(ticksAngles, function (tickAngle) { + return new graphic.Line({ + shape: getAxisLineShape(polar, radiusExtent[1], radiusExtent[1] + tickLen, tickAngle) + }); + }); + this.group.add(graphic.mergePath( + lines, { + style: tickModel.getModel('lineStyle').getLineStyle() + } + )); + }, + + /** + * @private + */ + _axisLabel: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + var axis = angleAxisModel.axis; + + var categoryData = angleAxisModel.get('data'); + + var labelModel = angleAxisModel.getModel('axisLabel'); + var axisTextStyleModel = labelModel.getModel('textStyle'); + + var labels = angleAxisModel.getFormattedLabels(); + + var labelMargin = labelModel.get('margin'); + var labelsAngles = axis.getLabelsCoords(); + + // Use length of ticksAngles because it may remove the last tick to avoid overlapping + for (var i = 0; i < ticksAngles.length; i++) { + var r = radiusExtent[1]; + var p = polar.coordToPoint([r + labelMargin, labelsAngles[i]]); + var cx = polar.cx; + var cy = polar.cy; + + var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 + ? 'center' : (p[0] > cx ? 'left' : 'right'); + var labelTextBaseline = Math.abs(p[1] - cy) / r < 0.3 + ? 'middle' : (p[1] > cy ? 'top' : 'bottom'); + + var textStyleModel = axisTextStyleModel; + if (categoryData && categoryData[i] && categoryData[i].textStyle) { + textStyleModel = new Model( + categoryData[i].textStyle, axisTextStyleModel + ); + } + this.group.add(new graphic.Text({ + style: { + x: p[0], + y: p[1], + fill: textStyleModel.getTextColor(), + text: labels[i], + textAlign: labelTextAlign, + textVerticalAlign: labelTextBaseline, + textFont: textStyleModel.getFont() + }, + silent: true + })); + } + }, + + /** + * @private + */ + _splitLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + var splitLineModel = angleAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + + var splitLines = []; + + for (var i = 0; i < ticksAngles.length; i++) { + var colorIndex = (lineCount++) % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new graphic.Line({ + shape: getAxisLineShape(polar, radiusExtent[0], radiusExtent[1], ticksAngles[i]) + })); + } + + // Simple optimization + // Batching the lines if color are the same + for (var i = 0; i < splitLines.length; i++) { + this.group.add(graphic.mergePath(splitLines[i], { + style: zrUtil.defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyleModel.getLineStyle()), + silent: true, + z: angleAxisModel.get('z') + })); + } + }, + + /** + * @private + */ + _splitArea: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + + var splitAreaModel = angleAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + + var splitAreas = []; + + var RADIAN = Math.PI / 180; + var prevAngle = -ticksAngles[0] * RADIAN; + var r0 = Math.min(radiusExtent[0], radiusExtent[1]); + var r1 = Math.max(radiusExtent[0], radiusExtent[1]); + + var clockwise = angleAxisModel.get('clockwise'); + + for (var i = 1; i < ticksAngles.length; i++) { + var colorIndex = (lineCount++) % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new graphic.Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: r0, + r: r1, + startAngle: prevAngle, + endAngle: -ticksAngles[i] * RADIAN, + clockwise: clockwise + }, + silent: true + })); + prevAngle = -ticksAngles[i] * RADIAN; + } + + // Simple optimization + // Batching the lines if color are the same + for (var i = 0; i < splitAreas.length; i++) { + this.group.add(graphic.mergePath(splitAreas[i], { + style: zrUtil.defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }); + + +/***/ }, +/* 281 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(273); + + __webpack_require__(282); + + +/***/ }, +/* 282 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var AxisBuilder = __webpack_require__(126); + + var axisBuilderAttrs = [ + 'axisLine', 'axisLabel', 'axisTick', 'axisName' + ]; + var selfBuilderAttrs = [ + 'splitLine', 'splitArea' + ]; + + __webpack_require__(1).extendComponentView({ + + type: 'radiusAxis', + + render: function (radiusAxisModel, ecModel) { + this.group.removeAll(); + if (!radiusAxisModel.get('show')) { + return; + } + var polarModel = ecModel.getComponent('polar', radiusAxisModel.get('polarIndex')); + var angleAxis = polarModel.coordinateSystem.getAngleAxis(); + var radiusAxis = radiusAxisModel.axis; + var polar = polarModel.coordinateSystem; + var ticksCoords = radiusAxis.getTicksCoords(); + var axisAngle = angleAxis.getExtent()[0]; + var radiusExtent = radiusAxis.getExtent(); + + var layout = layoutAxis(polar, radiusAxisModel, axisAngle); + var axisBuilder = new AxisBuilder(radiusAxisModel, layout); + zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + this.group.add(axisBuilder.getGroup()); + + zrUtil.each(selfBuilderAttrs, function (name) { + if (radiusAxisModel.get(name +'.show')) { + this['_' + name](radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords); + } + }, this); + }, + + /** + * @private + */ + _splitLine: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + var splitLineModel = radiusAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + + var splitLines = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var colorIndex = (lineCount++) % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new graphic.Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: ticksCoords[i] + }, + silent: true + })); + } + + // Simple optimization + // Batching the lines if color are the same + for (var i = 0; i < splitLines.length; i++) { + this.group.add(graphic.mergePath(splitLines[i], { + style: zrUtil.defaults({ + stroke: lineColors[i % lineColors.length], + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + } + }, + + /** + * @private + */ + _splitArea: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + + var splitAreaModel = radiusAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + + var splitAreas = []; + + var prevRadius = ticksCoords[0]; + for (var i = 1; i < ticksCoords.length; i++) { + var colorIndex = (lineCount++) % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new graphic.Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: prevRadius, + r: ticksCoords[i], + startAngle: 0, + endAngle: Math.PI * 2 + }, + silent: true + })); + prevRadius = ticksCoords[i]; + } + + // Simple optimization + // Batching the lines if color are the same + for (var i = 0; i < splitAreas.length; i++) { + this.group.add(graphic.mergePath(splitAreas[i], { + style: zrUtil.defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } + }); + + /** + * @inner + */ + function layoutAxis(polar, radiusAxisModel, axisAngle) { + return { + position: [polar.cx, polar.cy], + rotation: axisAngle / 180 * Math.PI, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1, + labelRotation: radiusAxisModel.getModel('axisLabel').get('rotate'), + // Over splitLine and splitArea + z2: 1 + }; + } + + +/***/ }, +/* 283 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(163); + + __webpack_require__(284); + + __webpack_require__(161); + + +/***/ }, +/* 284 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var MapDraw = __webpack_require__(158); + + module.exports = __webpack_require__(1).extendComponentView({ + + type: 'geo', + + init: function (ecModel, api) { + var mapDraw = new MapDraw(api, true); + this._mapDraw = mapDraw; + + this.group.add(mapDraw.group); + }, + + render: function (geoModel, ecModel, api) { + geoModel.get('show') && + this._mapDraw.draw(geoModel, ecModel, api); + } + }); + + +/***/ }, +/* 285 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var echarts = __webpack_require__(1); + var graphic = __webpack_require__(42); + var layout = __webpack_require__(21); + + // Model + echarts.extendComponentModel({ + + type: 'title', + + layoutMode: {type: 'box', ignoreSize: true}, + + defaultOption: { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 6, + show: true, + + text: '', + // 超链接跳转 + // link: null, + // 仅支持self | blank + target: 'blank', + subtext: '', + + // 超链接跳转 + // sublink: null, + // 仅支持self | blank + subtarget: 'blank', + + // 'center' ¦ 'left' ¦ 'right' + // ¦ {number}(x坐标,单位px) + left: 0, + // 'top' ¦ 'bottom' ¦ 'center' + // ¦ {number}(y坐标,单位px) + top: 0, + + // 水平对齐 + // 'auto' | 'left' | 'right' + // 默认根据 x 的位置判断是左对齐还是右对齐 + //textAlign: null + + backgroundColor: 'rgba(0,0,0,0)', + + // 标题边框颜色 + borderColor: '#ccc', + + // 标题边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + + // 标题内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + + // 主副标题纵向间隔,单位px,默认为10, + itemGap: 10, + textStyle: { + fontSize: 18, + fontWeight: 'bolder', + // 主标题文字颜色 + color: '#333' + }, + subtextStyle: { + // 副标题文字颜色 + color: '#aaa' + } + } + }); + + // View + echarts.extendComponentView({ + + type: 'title', + + render: function (titleModel, ecModel, api) { + this.group.removeAll(); + + if (!titleModel.get('show')) { + return; + } + + var group = this.group; + + var textStyleModel = titleModel.getModel('textStyle'); + var subtextStyleModel = titleModel.getModel('subtextStyle'); + + var textAlign = titleModel.get('textAlign'); + + var textEl = new graphic.Text({ + style: { + text: titleModel.get('text'), + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor(), + textBaseline: 'top' + }, + z2: 10 + }); + + var textRect = textEl.getBoundingRect(); + + var subText = titleModel.get('subtext'); + var subTextEl = new graphic.Text({ + style: { + text: subText, + textFont: subtextStyleModel.getFont(), + fill: subtextStyleModel.getTextColor(), + y: textRect.height + titleModel.get('itemGap'), + textBaseline: 'top' + }, + z2: 10 + }); + + var link = titleModel.get('link'); + var sublink = titleModel.get('sublink'); + + textEl.silent = !link; + subTextEl.silent = !sublink; + + if (link) { + textEl.on('click', function () { + window.open(link, titleModel.get('target')); + }); + } + if (sublink) { + subTextEl.on('click', function () { + window.open(sublink, titleModel.get('subtarget')); + }); + } + + group.add(textEl); + subText && group.add(subTextEl); + // If no subText, but add subTextEl, there will be an empty line. + + var groupRect = group.getBoundingRect(); + var layoutOption = titleModel.getBoxLayoutParams(); + layoutOption.width = groupRect.width; + layoutOption.height = groupRect.height; + var layoutRect = layout.getLayoutRect( + layoutOption, { + width: api.getWidth(), + height: api.getHeight() + }, titleModel.get('padding') + ); + // Adjust text align based on position + if (!textAlign) { + // Align left if title is on the left. center and right is same + textAlign = titleModel.get('left') || titleModel.get('right'); + if (textAlign === 'middle') { + textAlign = 'center'; + } + // Adjust layout by text align + if (textAlign === 'right') { + layoutRect.x += layoutRect.width; + } + else if (textAlign === 'center') { + layoutRect.x += layoutRect.width / 2; + } + } + group.position = [layoutRect.x, layoutRect.y]; + textEl.setStyle('textAlign', textAlign); + subTextEl.setStyle('textAlign', textAlign); + + // Render background + // Get groupRect again because textAlign has been changed + groupRect = group.getBoundingRect(); + var padding = layoutRect.margin; + var style = titleModel.getItemStyle(['color', 'opacity']); + style.fill = titleModel.get('backgroundColor'); + var rect = new graphic.Rect({ + shape: { + x: groupRect.x - padding[3], + y: groupRect.y - padding[0], + width: groupRect.width + padding[1] + padding[3], + height: groupRect.height + padding[0] + padding[2] + }, + style: style, + silent: true + }); + graphic.subPixelOptimizeRect(rect); + + group.add(rect); + } + }); + + +/***/ }, +/* 286 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * DataZoom component entry + */ + + + __webpack_require__(287); + + __webpack_require__(288); + __webpack_require__(290); + + __webpack_require__(291); + __webpack_require__(292); + + __webpack_require__(295); + __webpack_require__(296); + + __webpack_require__(298); + __webpack_require__(299); + + + +/***/ }, +/* 287 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(19).registerSubTypeDefaulter('dataZoom', function (option) { + // Default 'slider' when no type specified. + return 'slider'; + }); + + + +/***/ }, +/* 288 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + var zrUtil = __webpack_require__(3); + var env = __webpack_require__(78); + var echarts = __webpack_require__(1); + var modelUtil = __webpack_require__(5); + var AxisProxy = __webpack_require__(289); + var each = zrUtil.each; + var eachAxisDim = modelUtil.eachAxisDim; + + var DataZoomModel = echarts.extendComponentModel({ + + type: 'dataZoom', + + dependencies: [ + 'xAxis', 'yAxis', 'zAxis', 'radiusAxis', 'angleAxis', 'series' + ], + + /** + * @protected + */ + defaultOption: { + zlevel: 0, + z: 4, // Higher than normal component (z: 2). + orient: null, // Default auto by axisIndex. Possible value: 'horizontal', 'vertical'. + xAxisIndex: null, // Default all horizontal category axis. + yAxisIndex: null, // Default all vertical category axis. + angleAxisIndex: null, + radiusAxisIndex: null, + filterMode: 'filter', // Possible values: 'filter' or 'empty'. + // 'filter': data items which are out of window will be removed. + // This option is applicable when filtering outliers. + // 'empty': data items which are out of window will be set to empty. + // This option is applicable when user should not neglect + // that there are some data items out of window. + // Taking line chart as an example, line will be broken in + // the filtered points when filterModel is set to 'empty', but + // be connected when set to 'filter'. + + throttle: 100, // Dispatch action by the fixed rate, avoid frequency. + // default 100. Do not throttle when use null/undefined. + start: 0, // Start percent. 0 ~ 100 + end: 100, // End percent. 0 ~ 100 + startValue: null, // Start value. If startValue specified, start is ignored. + endValue: null // End value. If endValue specified, end is ignored. + }, + + /** + * @override + */ + init: function (option, parentModel, ecModel) { + + /** + * key like x_0, y_1 + * @private + * @type {Object} + */ + this._dataIntervalByAxis = {}; + + /** + * @private + */ + this._dataInfo = {}; + + /** + * key like x_0, y_1 + * @private + */ + this._axisProxies = {}; + + /** + * @readOnly + */ + this.textStyleModel; + + var rawOption = retrieveRaw(option); + + this.mergeDefaultAndTheme(option, ecModel); + + this.doInit(rawOption); + }, + + /** + * @override + */ + mergeOption: function (newOption) { + var rawOption = retrieveRaw(newOption); + + //FIX #2591 + zrUtil.merge(this.option, newOption, true); + + this.doInit(rawOption); + }, + + /** + * @protected + */ + doInit: function (rawOption) { + var thisOption = this.option; + + // Disable realtime view update if canvas is not supported. + if (!env.canvasSupported) { + thisOption.realtime = false; + } + + processRangeProp('start', 'startValue', rawOption, thisOption); + processRangeProp('end', 'endValue', rawOption, thisOption); + + this.textStyleModel = this.getModel('textStyle'); + + this._resetTarget(); + + this._giveAxisProxies(); + }, + + /** + * @private + */ + _giveAxisProxies: function () { + var axisProxies = this._axisProxies; + + this.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel, ecModel) { + var axisModel = this.dependentModels[dimNames.axis][axisIndex]; + + // If exists, share axisProxy with other dataZoomModels. + var axisProxy = axisModel.__dzAxisProxy || ( + // Use the first dataZoomModel as the main model of axisProxy. + axisModel.__dzAxisProxy = new AxisProxy( + dimNames.name, axisIndex, this, ecModel + ) + ); + // FIXME + // dispose __dzAxisProxy + + axisProxies[dimNames.name + '_' + axisIndex] = axisProxy; + }, this); + }, + + /** + * @private + */ + _resetTarget: function () { + var thisOption = this.option; + + var autoMode = this._judgeAutoMode(); + + eachAxisDim(function (dimNames) { + var axisIndexName = dimNames.axisIndex; + thisOption[axisIndexName] = modelUtil.normalizeToArray( + thisOption[axisIndexName] + ); + }, this); + + if (autoMode === 'axisIndex') { + this._autoSetAxisIndex(); + } + else if (autoMode === 'orient') { + this._autoSetOrient(); + } + }, + + /** + * @private + */ + _judgeAutoMode: function () { + // Auto set only works for setOption at the first time. + // The following is user's reponsibility. So using merged + // option is OK. + var thisOption = this.option; + + var hasIndexSpecified = false; + eachAxisDim(function (dimNames) { + // When user set axisIndex as a empty array, we think that user specify axisIndex + // but do not want use auto mode. Because empty array may be encountered when + // some error occured. + if (thisOption[dimNames.axisIndex] != null) { + hasIndexSpecified = true; + } + }, this); + + var orient = thisOption.orient; + + if (orient == null && hasIndexSpecified) { + return 'orient'; + } + else if (!hasIndexSpecified) { + if (orient == null) { + thisOption.orient = 'horizontal'; + } + return 'axisIndex'; + } + }, + + /** + * @private + */ + _autoSetAxisIndex: function () { + var autoAxisIndex = true; + var orient = this.get('orient', true); + var thisOption = this.option; + + if (autoAxisIndex) { + // Find axis that parallel to dataZoom as default. + var dimNames = orient === 'vertical' + ? {dim: 'y', axisIndex: 'yAxisIndex', axis: 'yAxis'} + : {dim: 'x', axisIndex: 'xAxisIndex', axis: 'xAxis'}; + + if (this.dependentModels[dimNames.axis].length) { + thisOption[dimNames.axisIndex] = [0]; + autoAxisIndex = false; + } + } + + if (autoAxisIndex) { + // Find the first category axis as default. (consider polar) + eachAxisDim(function (dimNames) { + if (!autoAxisIndex) { + return; + } + var axisIndices = []; + var axisModels = this.dependentModels[dimNames.axis]; + if (axisModels.length && !axisIndices.length) { + for (var i = 0, len = axisModels.length; i < len; i++) { + if (axisModels[i].get('type') === 'category') { + axisIndices.push(i); + } + } + } + thisOption[dimNames.axisIndex] = axisIndices; + if (axisIndices.length) { + autoAxisIndex = false; + } + }, this); + } + + if (autoAxisIndex) { + // FIXME + // 这里是兼容ec2的写法(没指定xAxisIndex和yAxisIndex时把scatter和双数值轴折柱纳入dataZoom控制), + // 但是实际是否需要Grid.js#getScaleByOption来判断(考虑time,log等axis type)? + + // If both dataZoom.xAxisIndex and dataZoom.yAxisIndex is not specified, + // dataZoom component auto adopts series that reference to + // both xAxis and yAxis which type is 'value'. + this.ecModel.eachSeries(function (seriesModel) { + if (this._isSeriesHasAllAxesTypeOf(seriesModel, 'value')) { + eachAxisDim(function (dimNames) { + var axisIndices = thisOption[dimNames.axisIndex]; + var axisIndex = seriesModel.get(dimNames.axisIndex); + if (zrUtil.indexOf(axisIndices, axisIndex) < 0) { + axisIndices.push(axisIndex); + } + }); + } + }, this); + } + }, + + /** + * @private + */ + _autoSetOrient: function () { + var dim; + + // Find the first axis + this.eachTargetAxis(function (dimNames) { + !dim && (dim = dimNames.name); + }, this); + + this.option.orient = dim === 'y' ? 'vertical' : 'horizontal'; + }, + + /** + * @private + */ + _isSeriesHasAllAxesTypeOf: function (seriesModel, axisType) { + // FIXME + // 需要series的xAxisIndex和yAxisIndex都首先自动设置上。 + // 例如series.type === scatter时。 + + var is = true; + eachAxisDim(function (dimNames) { + var seriesAxisIndex = seriesModel.get(dimNames.axisIndex); + var axisModel = this.dependentModels[dimNames.axis][seriesAxisIndex]; + + if (!axisModel || axisModel.get('type') !== axisType) { + is = false; + } + }, this); + return is; + }, + + /** + * @public + */ + getFirstTargetAxisModel: function () { + var firstAxisModel; + eachAxisDim(function (dimNames) { + if (firstAxisModel == null) { + var indices = this.get(dimNames.axisIndex); + if (indices.length) { + firstAxisModel = this.dependentModels[dimNames.axis][indices[0]]; + } + } + }, this); + + return firstAxisModel; + }, + + /** + * @public + * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel + */ + eachTargetAxis: function (callback, context) { + var ecModel = this.ecModel; + eachAxisDim(function (dimNames) { + each( + this.get(dimNames.axisIndex), + function (axisIndex) { + callback.call(context, dimNames, axisIndex, this, ecModel); + }, + this + ); + }, this); + }, + + getAxisProxy: function (dimName, axisIndex) { + return this._axisProxies[dimName + '_' + axisIndex]; + }, + + /** + * If not specified, set to undefined. + * + * @public + * @param {Object} opt + * @param {number} [opt.start] + * @param {number} [opt.end] + * @param {number} [opt.startValue] + * @param {number} [opt.endValue] + */ + setRawRange: function (opt) { + each(['start', 'end', 'startValue', 'endValue'], function (name) { + // If any of those prop is null/undefined, we should alos set + // them, because only one pair between start/end and + // startValue/endValue can work. + this.option[name] = opt[name]; + }, this); + }, + + /** + * @public + * @return {Array.} [startPercent, endPercent] + */ + getPercentRange: function () { + var axisProxy = this.findRepresentativeAxisProxy(); + if (axisProxy) { + return axisProxy.getDataPercentWindow(); + } + }, + + /** + * @public + * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0); + * + * @param {string} [axisDimName] + * @param {number} [axisIndex] + * @return {Array.} [startValue, endValue] + */ + getValueRange: function (axisDimName, axisIndex) { + if (axisDimName == null && axisIndex == null) { + var axisProxy = this.findRepresentativeAxisProxy(); + if (axisProxy) { + return axisProxy.getDataValueWindow(); + } + } + else { + return this.getAxisProxy(axisDimName, axisIndex).getDataValueWindow(); + } + }, + + /** + * @public + * @return {module:echarts/component/dataZoom/AxisProxy} + */ + findRepresentativeAxisProxy: function () { + // Find the first hosted axisProxy + var axisProxies = this._axisProxies; + for (var key in axisProxies) { + if (axisProxies.hasOwnProperty(key) && axisProxies[key].hostedBy(this)) { + return axisProxies[key]; + } + } + + // If no hosted axis find not hosted axisProxy. + // Consider this case: dataZoomModel1 and dataZoomModel2 control the same axis, + // and the option.start or option.end settings are different. The percentRange + // should follow axisProxy. + // (We encounter this problem in toolbox data zoom.) + for (var key in axisProxies) { + if (axisProxies.hasOwnProperty(key) && !axisProxies[key].hostedBy(this)) { + return axisProxies[key]; + } + } + } + + }); + + function retrieveRaw(option) { + var ret = {}; + each( + ['start', 'end', 'startValue', 'endValue'], + function (name) { + ret[name] = option[name]; + } + ); + return ret; + } + + function processRangeProp(percentProp, valueProp, rawOption, thisOption) { + // start/end has higher priority over startValue/endValue, + // but we should make chart.setOption({endValue: 1000}) effective, + // rather than chart.setOption({endValue: 1000, end: null}). + if (rawOption[valueProp] != null && rawOption[percentProp] == null) { + thisOption[percentProp] = null; + } + // Otherwise do nothing and use the merge result. + } + + module.exports = DataZoomModel; + + + +/***/ }, +/* 289 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Axis operator + */ + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var each = zrUtil.each; + var asc = numberUtil.asc; + + /** + * Operate single axis. + * One axis can only operated by one axis operator. + * Different dataZoomModels may be defined to operate the same axis. + * (i.e. 'inside' data zoom and 'slider' data zoom components) + * So dataZoomModels share one axisProxy in that case. + * + * @class + */ + var AxisProxy = function (dimName, axisIndex, dataZoomModel, ecModel) { + + /** + * @private + * @type {string} + */ + this._dimName = dimName; + + /** + * @private + */ + this._axisIndex = axisIndex; + + /** + * @private + * @type {Array.} + */ + this._valueWindow; + + /** + * @private + * @type {Array.} + */ + this._percentWindow; + + /** + * @private + * @type {Array.} + */ + this._dataExtent; + + /** + * @readOnly + * @type {module: echarts/model/Global} + */ + this.ecModel = ecModel; + + /** + * @private + * @type {module: echarts/component/dataZoom/DataZoomModel} + */ + this._dataZoomModel = dataZoomModel; + }; + + AxisProxy.prototype = { + + constructor: AxisProxy, + + /** + * Whether the axisProxy is hosted by dataZoomModel. + * + * @public + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + * @return {boolean} + */ + hostedBy: function (dataZoomModel) { + return this._dataZoomModel === dataZoomModel; + }, + + /** + * @return {Array.} + */ + getDataExtent: function () { + return this._dataExtent.slice(); + }, + + /** + * @return {Array.} + */ + getDataValueWindow: function () { + return this._valueWindow.slice(); + }, + + /** + * @return {Array.} + */ + getDataPercentWindow: function () { + return this._percentWindow.slice(); + }, + + /** + * @public + * @param {number} axisIndex + * @return {Array} seriesModels + */ + getTargetSeriesModels: function () { + var seriesModels = []; + + this.ecModel.eachSeries(function (seriesModel) { + if (this._axisIndex === seriesModel.get(this._dimName + 'AxisIndex')) { + seriesModels.push(seriesModel); + } + }, this); + + return seriesModels; + }, + + getAxisModel: function () { + return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex); + }, + + getOtherAxisModel: function () { + var axisDim = this._dimName; + var ecModel = this.ecModel; + var axisModel = this.getAxisModel(); + var isCartesian = axisDim === 'x' || axisDim === 'y'; + var otherAxisDim; + var coordSysIndexName; + if (isCartesian) { + coordSysIndexName = 'gridIndex'; + otherAxisDim = axisDim === 'x' ? 'y' : 'x'; + } + else { + coordSysIndexName = 'polarIndex'; + otherAxisDim = axisDim === 'angle' ? 'radius' : 'angle'; + } + var foundOtherAxisModel; + ecModel.eachComponent(otherAxisDim + 'Axis', function (otherAxisModel) { + if ((otherAxisModel.get(coordSysIndexName) || 0) + === (axisModel.get(coordSysIndexName) || 0)) { + foundOtherAxisModel = otherAxisModel; + } + }); + return foundOtherAxisModel; + }, + + /** + * Notice: reset should not be called before series.restoreData() called, + * so it is recommanded to be called in "process stage" but not "model init + * stage". + * + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + reset: function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + // Culculate data window and data extent, and record them. + var dataExtent = this._dataExtent = calculateDataExtent( + this._dimName, this.getTargetSeriesModels() + ); + var dataWindow = calculateDataWindow( + dataZoomModel.option, dataExtent, this + ); + this._valueWindow = dataWindow.valueWindow; + this._percentWindow = dataWindow.percentWindow; + + // Update axis setting then. + setAxisModel(this); + }, + + /** + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + restore: function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + this._valueWindow = this._percentWindow = null; + setAxisModel(this, true); + }, + + /** + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + filterData: function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var axisDim = this._dimName; + var seriesModels = this.getTargetSeriesModels(); + var filterMode = dataZoomModel.get('filterMode'); + var valueWindow = this._valueWindow; + + // FIXME + // Toolbox may has dataZoom injected. And if there are stacked bar chart + // with NaN data. NaN will be filtered and stack will be wrong. + // So we need to force the mode to be set empty + var otherAxisModel = this.getOtherAxisModel(); + if (dataZoomModel.get('$fromToolbox') + && otherAxisModel && otherAxisModel.get('type') === 'category') { + filterMode = 'empty'; + } + // Process series data + each(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + if (!seriesData) { + return; + } + + each(seriesModel.coordDimToDataDim(axisDim), function (dim) { + if (filterMode === 'empty') { + seriesModel.setData( + seriesData.map(dim, function (value) { + return !isInWindow(value) ? NaN : value; + }) + ); + } + else { + seriesData.filterSelf(dim, isInWindow); + } + }); + }); + + function isInWindow(value) { + return value >= valueWindow[0] && value <= valueWindow[1]; + } + } + }; + + function calculateDataExtent(axisDim, seriesModels) { + var dataExtent = [Infinity, -Infinity]; + + each(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + if (seriesData) { + each(seriesModel.coordDimToDataDim(axisDim), function (dim) { + var seriesExtent = seriesData.getDataExtent(dim); + seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]); + seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]); + }); + } + }, this); + + return dataExtent; + } + + function calculateDataWindow(opt, dataExtent, axisProxy) { + var axisModel = axisProxy.getAxisModel(); + var scale = axisModel.axis.scale; + var percentExtent = [0, 100]; + var percentWindow = [ + opt.start, + opt.end + ]; + var valueWindow = []; + + // In percent range is used and axis min/max/scale is set, + // window should be based on min/max/0, but should not be + // based on the extent of filtered data. + dataExtent = dataExtent.slice(); + fixExtendByAxis(dataExtent, axisModel, scale); + + each(['startValue', 'endValue'], function (prop) { + valueWindow.push( + opt[prop] != null + ? scale.parse(opt[prop]) + : null + ); + }); + + // Normalize bound. + each([0, 1], function (idx) { + var boundValue = valueWindow[idx]; + var boundPercent = percentWindow[idx]; + + // start/end has higher priority over startValue/endValue, + // because start/end can be consistent among different type + // of axis but startValue/endValue not. + + if (boundPercent != null || boundValue == null) { + if (boundPercent == null) { + boundPercent = percentExtent[idx]; + } + // Use scale.parse to math round for category or time axis. + boundValue = scale.parse(numberUtil.linearMap( + boundPercent, percentExtent, dataExtent, true + )); + } + else { // boundPercent == null && boundValue != null + boundPercent = numberUtil.linearMap( + boundValue, dataExtent, percentExtent, true + ); + } + // Avoid rounding error + valueWindow[idx] = numberUtil.round(boundValue); + percentWindow[idx] = numberUtil.round(boundPercent); + }); + + return { + valueWindow: asc(valueWindow), + percentWindow: asc(percentWindow) + }; + } + + function fixExtendByAxis(dataExtent, axisModel, scale) { + each(['min', 'max'], function (minMax, index) { + var axisMax = axisModel.get(minMax, true); + // Consider 'dataMin', 'dataMax' + if (axisMax != null && (axisMax + '').toLowerCase() !== 'data' + minMax) { + dataExtent[index] = scale.parse(axisMax); + } + }); + + if (!axisModel.get('scale', true)) { + dataExtent[0] > 0 && (dataExtent[0] = 0); + dataExtent[1] < 0 && (dataExtent[1] = 0); + } + + return dataExtent; + } + + function setAxisModel(axisProxy, isRestore) { + var axisModel = axisProxy.getAxisModel(); + + var percentWindow = axisProxy._percentWindow; + var valueWindow = axisProxy._valueWindow; + + if (!percentWindow) { + return; + } + + var isFull = isRestore || (percentWindow[0] === 0 && percentWindow[1] === 100); + // [0, 500]: arbitrary value, guess axis extent. + var precision = !isRestore && numberUtil.getPixelPrecision(valueWindow, [0, 500]); + // toFixed() digits argument must be between 0 and 20 + var invalidPrecision = !isRestore && !(precision < 20 && precision >= 0); + + var useOrigin = isRestore || isFull || invalidPrecision; + + axisModel.setRange && axisModel.setRange( + useOrigin ? null : +valueWindow[0].toFixed(precision), + useOrigin ? null : +valueWindow[1].toFixed(precision) + ); + } + + module.exports = AxisProxy; + + + +/***/ }, +/* 290 */ +/***/ function(module, exports, __webpack_require__) { + + + + var ComponentView = __webpack_require__(28); + + module.exports = ComponentView.extend({ + + type: 'dataZoom', + + render: function (dataZoomModel, ecModel, api, payload) { + this.dataZoomModel = dataZoomModel; + this.ecModel = ecModel; + this.api = api; + }, + + /** + * Find the first target coordinate system. + * + * @protected + * @return {Object} { + * cartesians: [ + * {model: coord0, axisModels: [axis1, axis3], coordIndex: 1}, + * {model: coord1, axisModels: [axis0, axis2], coordIndex: 0}, + * ... + * ], // cartesians must not be null/undefined. + * polars: [ + * {model: coord0, axisModels: [axis4], coordIndex: 0}, + * ... + * ], // polars must not be null/undefined. + * axisModels: [axis0, axis1, axis2, axis3, axis4] + * // axisModels must not be null/undefined. + * } + */ + getTargetInfo: function () { + var dataZoomModel = this.dataZoomModel; + var ecModel = this.ecModel; + var cartesians = []; + var polars = []; + var axisModels = []; + + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) { + var axisModel = ecModel.getComponent(dimNames.axis, axisIndex); + if (axisModel) { + axisModels.push(axisModel); + + var gridIndex = axisModel.get('gridIndex'); + var polarIndex = axisModel.get('polarIndex'); + + if (gridIndex != null) { + var coordModel = ecModel.getComponent('grid', gridIndex); + save(coordModel, axisModel, cartesians, gridIndex); + } + else if (polarIndex != null) { + var coordModel = ecModel.getComponent('polar', polarIndex); + save(coordModel, axisModel, polars, polarIndex); + } + } + }, this); + + function save(coordModel, axisModel, store, coordIndex) { + var item; + for (var i = 0; i < store.length; i++) { + if (store[i].model === coordModel) { + item = store[i]; + break; + } + } + if (!item) { + store.push(item = { + model: coordModel, axisModels: [], coordIndex: coordIndex + }); + } + item.axisModels.push(axisModel); + } + + return { + cartesians: cartesians, + polars: polars, + axisModels: axisModels + }; + } + + }); + + + +/***/ }, +/* 291 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + var DataZoomModel = __webpack_require__(288); + var layout = __webpack_require__(21); + var zrUtil = __webpack_require__(3); + + var SliderZoomModel = DataZoomModel.extend({ + + type: 'dataZoom.slider', + + layoutMode: 'box', + + /** + * @protected + */ + defaultOption: { + show: true, + + // ph => placeholder. Using placehoder here because + // deault value can only be drived in view stage. + right: 'ph', // Default align to grid rect. + top: 'ph', // Default align to grid rect. + width: 'ph', // Default align to grid rect. + height: 'ph', // Default align to grid rect. + left: null, // Default align to grid rect. + bottom: null, // Default align to grid rect. + + backgroundColor: 'rgba(47,69,84,0)', // Background of slider zoom component. + dataBackgroundColor: '#ddd', // Background of data shadow. + fillerColor: 'rgba(47,69,84,0.15)', // Color of selected area. + handleColor: 'rgba(148,164,165,0.95)', // Color of handle. + handleSize: 10, + + labelPrecision: null, + labelFormatter: null, + showDetail: true, + showDataShadow: 'auto', // Default auto decision. + realtime: true, + zoomLock: false, // Whether disable zoom. + textStyle: { + color: '#333' + } + }, + + /** + * @override + */ + mergeOption: function (option) { + SliderZoomModel.superApply(this, 'mergeOption', arguments); + } + + }); + + module.exports = SliderZoomModel; + + + +/***/ }, +/* 292 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var throttle = __webpack_require__(293); + var DataZoomView = __webpack_require__(290); + var Rect = graphic.Rect; + var numberUtil = __webpack_require__(7); + var linearMap = numberUtil.linearMap; + var layout = __webpack_require__(21); + var sliderMove = __webpack_require__(294); + var asc = numberUtil.asc; + var bind = zrUtil.bind; + var mathRound = Math.round; + var mathMax = Math.max; + var each = zrUtil.each; + + // Constants + var DEFAULT_LOCATION_EDGE_GAP = 7; + var DEFAULT_FRAME_BORDER_WIDTH = 1; + var DEFAULT_FILLER_SIZE = 30; + var HORIZONTAL = 'horizontal'; + var VERTICAL = 'vertical'; + var LABEL_GAP = 5; + var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter']; + + var SliderZoomView = DataZoomView.extend({ + + type: 'dataZoom.slider', + + init: function (ecModel, api) { + + /** + * @private + * @type {Object} + */ + this._displayables = {}; + + /** + * @private + * @type {string} + */ + this._orient; + + /** + * [0, 100] + * @private + */ + this._range; + + /** + * [coord of the first handle, coord of the second handle] + * @private + */ + this._handleEnds; + + /** + * [length, thick] + * @private + * @type {Array.} + */ + this._size; + + /** + * @private + * @type {number} + */ + this._halfHandleSize; + + /** + * @private + */ + this._location; + + /** + * @private + */ + this._dragging; + + /** + * @private + */ + this._dataShadowInfo; + + this.api = api; + }, + + /** + * @override + */ + render: function (dataZoomModel, ecModel, api, payload) { + SliderZoomView.superApply(this, 'render', arguments); + + throttle.createOrUpdate( + this, + '_dispatchZoomAction', + this.dataZoomModel.get('throttle'), + 'fixRate' + ); + + this._orient = dataZoomModel.get('orient'); + this._halfHandleSize = mathRound(dataZoomModel.get('handleSize') / 2); + + if (this.dataZoomModel.get('show') === false) { + this.group.removeAll(); + return; + } + + // Notice: this._resetInterval() should not be executed when payload.type + // is 'dataZoom', origin this._range should be maintained, otherwise 'pan' + // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction, + if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) { + this._buildView(); + } + + this._updateView(); + }, + + /** + * @override + */ + remove: function () { + SliderZoomView.superApply(this, 'remove', arguments); + throttle.clear(this, '_dispatchZoomAction'); + }, + + /** + * @override + */ + dispose: function () { + SliderZoomView.superApply(this, 'dispose', arguments); + throttle.clear(this, '_dispatchZoomAction'); + }, + + _buildView: function () { + var thisGroup = this.group; + + thisGroup.removeAll(); + + this._resetLocation(); + this._resetInterval(); + + var barGroup = this._displayables.barGroup = new graphic.Group(); + + this._renderBackground(); + this._renderDataShadow(); + this._renderHandle(); + + thisGroup.add(barGroup); + + this._positionGroup(); + }, + + /** + * @private + */ + _resetLocation: function () { + var dataZoomModel = this.dataZoomModel; + var api = this.api; + + // If some of x/y/width/height are not specified, + // auto-adapt according to target grid. + var coordRect = this._findCoordRect(); + var ecSize = {width: api.getWidth(), height: api.getHeight()}; + // Default align by coordinate system rect. + var positionInfo = this._orient === HORIZONTAL + ? { + // Why using 'right', because right should be used in vertical, + // and it is better to be consistent for dealing with position param merge. + right: ecSize.width - coordRect.x - coordRect.width, + top: (ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP), + width: coordRect.width, + height: DEFAULT_FILLER_SIZE + } + : { // vertical + right: DEFAULT_LOCATION_EDGE_GAP, + top: coordRect.y, + width: DEFAULT_FILLER_SIZE, + height: coordRect.height + }; + + // Do not write back to option and replace value 'ph', because + // the 'ph' value should be recalculated when resize. + var layoutParams = layout.getLayoutParams(dataZoomModel.option); + + // Replace the placeholder value. + zrUtil.each(['right', 'top', 'width', 'height'], function (name) { + if (layoutParams[name] === 'ph') { + layoutParams[name] = positionInfo[name]; + } + }); + + var layoutRect = layout.getLayoutRect( + layoutParams, + ecSize, + dataZoomModel.padding + ); + + this._location = {x: layoutRect.x, y: layoutRect.y}; + this._size = [layoutRect.width, layoutRect.height]; + this._orient === VERTICAL && this._size.reverse(); + }, + + /** + * @private + */ + _positionGroup: function () { + var thisGroup = this.group; + var location = this._location; + var orient = this._orient; + + // Just use the first axis to determine mapping. + var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel(); + var inverse = targetAxisModel && targetAxisModel.get('inverse'); + + var barGroup = this._displayables.barGroup; + var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; + + // Transform barGroup. + barGroup.attr( + (orient === HORIZONTAL && !inverse) + ? {scale: otherAxisInverse ? [1, 1] : [1, -1]} + : (orient === HORIZONTAL && inverse) + ? {scale: otherAxisInverse ? [-1, 1] : [-1, -1]} + : (orient === VERTICAL && !inverse) + ? {scale: otherAxisInverse ? [1, -1] : [1, 1], rotation: Math.PI / 2} + // Dont use Math.PI, considering shadow direction. + : {scale: otherAxisInverse ? [-1, -1] : [-1, 1], rotation: Math.PI / 2} + ); + + // Position barGroup + var rect = thisGroup.getBoundingRect([barGroup]); + thisGroup.position[0] = location.x - rect.x; + thisGroup.position[1] = location.y - rect.y; + }, + + /** + * @private + */ + _getViewExtent: function () { + // View total length. + var halfHandleSize = this._halfHandleSize; + var totalLength = mathMax(this._size[0], halfHandleSize * 4); + var extent = [halfHandleSize, totalLength - halfHandleSize]; + + return extent; + }, + + _renderBackground : function () { + var dataZoomModel = this.dataZoomModel; + var size = this._size; + + this._displayables.barGroup.add(new Rect({ + silent: true, + shape: { + x: 0, y: 0, width: size[0], height: size[1] + }, + style: { + fill: dataZoomModel.get('backgroundColor') + } + })); + }, + + _renderDataShadow: function () { + var info = this._dataShadowInfo = this._prepareDataShadowInfo(); + + if (!info) { + return; + } + + var size = this._size; + var seriesModel = info.series; + var data = seriesModel.getRawData(); + var otherDim = seriesModel.getShadowDim + ? seriesModel.getShadowDim() // @see candlestick + : info.otherDim; + + var otherDataExtent = data.getDataExtent(otherDim); + // Nice extent. + var otherOffset = (otherDataExtent[1] - otherDataExtent[0]) * 0.3; + otherDataExtent = [ + otherDataExtent[0] - otherOffset, + otherDataExtent[1] + otherOffset + ]; + var otherShadowExtent = [0, size[1]]; + + var thisShadowExtent = [0, size[0]]; + + var points = [[size[0], 0], [0, 0]]; + var step = thisShadowExtent[1] / (data.count() - 1); + var thisCoord = 0; + + // Optimize for large data shadow + var stride = Math.round(data.count() / size[0]); + data.each([otherDim], function (value, index) { + if (stride > 0 && (index % stride)) { + thisCoord += step; + return; + } + // FIXME + // 应该使用统计的空判断?还是在list里进行空判断? + var otherCoord = (value == null || isNaN(value) || value === '') + ? null + : linearMap(value, otherDataExtent, otherShadowExtent, true); + otherCoord != null && points.push([thisCoord, otherCoord]); + + thisCoord += step; + }); + + this._displayables.barGroup.add(new graphic.Polyline({ + shape: {points: points}, + style: {fill: this.dataZoomModel.get('dataBackgroundColor'), lineWidth: 0}, + silent: true, + z2: -20 + })); + }, + + _prepareDataShadowInfo: function () { + var dataZoomModel = this.dataZoomModel; + var showDataShadow = dataZoomModel.get('showDataShadow'); + + if (showDataShadow === false) { + return; + } + + // Find a representative series. + var result; + var ecModel = this.ecModel; + + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) { + var seriesModels = dataZoomModel + .getAxisProxy(dimNames.name, axisIndex) + .getTargetSeriesModels(); + + zrUtil.each(seriesModels, function (seriesModel) { + if (result) { + return; + } + + if (showDataShadow !== true && zrUtil.indexOf( + SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type') + ) < 0 + ) { + return; + } + + var otherDim = getOtherDim(dimNames.name); + + var thisAxis = ecModel.getComponent(dimNames.axis, axisIndex).axis; + + result = { + thisAxis: thisAxis, + series: seriesModel, + thisDim: dimNames.name, + otherDim: otherDim, + otherAxisInverse: seriesModel + .coordinateSystem.getOtherAxis(thisAxis).inverse + }; + + }, this); + + }, this); + + return result; + }, + + _renderHandle: function () { + var displaybles = this._displayables; + var handles = displaybles.handles = []; + var handleLabels = displaybles.handleLabels = []; + var barGroup = this._displayables.barGroup; + var size = this._size; + + barGroup.add(displaybles.filler = new Rect({ + draggable: true, + cursor: 'move', + drift: bind(this._onDragMove, this, 'all'), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false), + style: { + fill: this.dataZoomModel.get('fillerColor'), + // text: ':::', + textPosition : 'inside' + } + })); + + // Frame border. + barGroup.add(new Rect(graphic.subPixelOptimizeRect({ + silent: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + stroke: this.dataZoomModel.get('dataBackgroundColor'), + lineWidth: DEFAULT_FRAME_BORDER_WIDTH, + fill: 'rgba(0,0,0,0)' + } + }))); + + each([0, 1], function (handleIndex) { + + barGroup.add(handles[handleIndex] = new Rect({ + style: { + fill: this.dataZoomModel.get('handleColor') + }, + cursor: 'move', + draggable: true, + drift: bind(this._onDragMove, this, handleIndex), + ondragend: bind(this._onDragEnd, this), + onmouseover: bind(this._showDataInfo, this, true), + onmouseout: bind(this._showDataInfo, this, false) + })); + + var textStyleModel = this.dataZoomModel.textStyleModel; + + this.group.add( + handleLabels[handleIndex] = new graphic.Text({ + silent: true, + invisible: true, + style: { + x: 0, y: 0, text: '', + textVerticalAlign: 'middle', + textAlign: 'center', + fill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont() + } + })); + + }, this); + }, + + /** + * @private + */ + _resetInterval: function () { + var range = this._range = this.dataZoomModel.getPercentRange(); + var viewExtent = this._getViewExtent(); + + this._handleEnds = [ + linearMap(range[0], [0, 100], viewExtent, true), + linearMap(range[1], [0, 100], viewExtent, true) + ]; + }, + + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} dx + * @param {number} dy + */ + _updateInterval: function (handleIndex, delta) { + var handleEnds = this._handleEnds; + var viewExtend = this._getViewExtent(); + + sliderMove( + delta, + handleEnds, + viewExtend, + (handleIndex === 'all' || this.dataZoomModel.get('zoomLock')) + ? 'rigid' : 'cross', + handleIndex + ); + + this._range = asc([ + linearMap(handleEnds[0], viewExtend, [0, 100], true), + linearMap(handleEnds[1], viewExtend, [0, 100], true) + ]); + }, + + /** + * @private + */ + _updateView: function () { + var displaybles = this._displayables; + var handleEnds = this._handleEnds; + var handleInterval = asc(handleEnds.slice()); + var size = this._size; + var halfHandleSize = this._halfHandleSize; + + each([0, 1], function (handleIndex) { + + // Handles + var handle = displaybles.handles[handleIndex]; + handle.setShape({ + x: handleEnds[handleIndex] - halfHandleSize, + y: -1, + width: halfHandleSize * 2, + height: size[1] + 2, + r: 1 + }); + + }, this); + + // Filler + displaybles.filler.setShape({ + x: handleInterval[0], + y: 0, + width: handleInterval[1] - handleInterval[0], + height: this._size[1] + }); + + this._updateDataInfo(); + }, + + /** + * @private + */ + _updateDataInfo: function () { + var dataZoomModel = this.dataZoomModel; + var displaybles = this._displayables; + var handleLabels = displaybles.handleLabels; + var orient = this._orient; + var labelTexts = ['', '']; + + // FIXME + // date型,支持formatter,autoformatter(ec2 date.getAutoFormatter) + if (dataZoomModel.get('showDetail')) { + var dataInterval; + var axis; + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) { + // Using dataInterval of the first axis. + if (!dataInterval) { + dataInterval = dataZoomModel + .getAxisProxy(dimNames.name, axisIndex) + .getDataValueWindow(); + axis = this.ecModel.getComponent(dimNames.axis, axisIndex).axis; + } + }, this); + + if (dataInterval) { + labelTexts = [ + this._formatLabel(dataInterval[0], axis), + this._formatLabel(dataInterval[1], axis) + ]; + } + } + + var orderedHandleEnds = asc(this._handleEnds.slice()); + + setLabel.call(this, 0); + setLabel.call(this, 1); + + function setLabel(handleIndex) { + // Label + // Text should not transform by barGroup. + var barTransform = graphic.getTransform( + displaybles.handles[handleIndex], this.group + ); + var direction = graphic.transformDirection( + handleIndex === 0 ? 'right' : 'left', barTransform + ); + var offset = this._halfHandleSize + LABEL_GAP; + var textPoint = graphic.applyTransform( + [ + orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), + this._size[1] / 2 + ], + barTransform + ); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + textVerticalAlign: orient === HORIZONTAL ? 'middle' : direction, + textAlign: orient === HORIZONTAL ? direction : 'center', + text: labelTexts[handleIndex] + }); + } + }, + + /** + * @private + */ + _formatLabel: function (value, axis) { + var dataZoomModel = this.dataZoomModel; + var labelFormatter = dataZoomModel.get('labelFormatter'); + if (zrUtil.isFunction(labelFormatter)) { + return labelFormatter(value); + } + + var labelPrecision = dataZoomModel.get('labelPrecision'); + if (labelPrecision == null || labelPrecision === 'auto') { + labelPrecision = axis.getPixelPrecision(); + } + + value = (value == null && isNaN(value)) + ? '' + // FIXME Glue code + : (axis.type === 'category' || axis.type === 'time') + ? axis.scale.getLabel(Math.round(value)) + // param of toFixed should less then 20. + : value.toFixed(Math.min(labelPrecision, 20)); + + if (zrUtil.isString(labelFormatter)) { + value = labelFormatter.replace('{value}', value); + } + + return value; + }, + + /** + * @private + * @param {boolean} showOrHide true: show, false: hide + */ + _showDataInfo: function (showOrHide) { + // Always show when drgging. + showOrHide = this._dragging || showOrHide; + + var handleLabels = this._displayables.handleLabels; + handleLabels[0].attr('invisible', !showOrHide); + handleLabels[1].attr('invisible', !showOrHide); + }, + + _onDragMove: function (handleIndex, dx, dy) { + this._dragging = true; + + // Transform dx, dy to bar coordination. + var vertex = this._applyBarTransform([dx, dy], true); + + this._updateInterval(handleIndex, vertex[0]); + this._updateView(); + + if (this.dataZoomModel.get('realtime')) { + this._dispatchZoomAction(); + } + }, + + _onDragEnd: function () { + this._dragging = false; + this._showDataInfo(false); + this._dispatchZoomAction(); + }, + + /** + * This action will be throttled. + * @private + */ + _dispatchZoomAction: function () { + var range = this._range; + + this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + dataZoomId: this.dataZoomModel.id, + start: range[0], + end: range[1] + }); + }, + + /** + * @private + */ + _applyBarTransform: function (vertex, inverse) { + var barTransform = this._displayables.barGroup.getLocalTransform(); + return graphic.applyTransform(vertex, barTransform, inverse); + }, + + /** + * @private + */ + _findCoordRect: function () { + // Find the grid coresponding to the first axis referred by dataZoom. + var targetInfo = this.getTargetInfo(); + + // FIXME + // 判断是catesian还是polar + var rect; + if (targetInfo.cartesians.length) { + rect = targetInfo.cartesians[0].model.coordinateSystem.getRect(); + } + else { // Polar + // FIXME + // 暂时随便写的 + var width = this.api.getWidth(); + var height = this.api.getHeight(); + rect = { + x: width * 0.2, + y: height * 0.2, + width: width * 0.6, + height: height * 0.6 + }; + } + + return rect; + } + + }); + + function getOtherDim(thisDim) { + // FIXME + // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好 + return thisDim === 'x' ? 'y' : 'x'; + } + + module.exports = SliderZoomView; + + + +/***/ }, +/* 293 */ +/***/ function(module, exports) { + + + + var lib = {}; + + var ORIGIN_METHOD = '\0__throttleOriginMethod'; + var RATE = '\0__throttleRate'; + + /** + * 频率控制 返回函数连续调用时,fn 执行频率限定为每多少时间执行一次 + * 例如常见效果: + * notifyWhenChangesStop + * 频繁调用时,只保证最后一次执行 + * 配成:trailing:true;debounce:true 即可 + * notifyAtFixRate + * 频繁调用时,按规律心跳执行 + * 配成:trailing:true;debounce:false 即可 + * 注意: + * 根据model更新view的时候,可以使用throttle, + * 但是根据view更新model的时候,避免使用这种延迟更新的方式。 + * 因为这可能导致model和server同步出现问题。 + * + * @public + * @param {(Function|Array.)} fn 需要调用的函数 + * 如果fn为array,则表示可以对多个函数进行throttle。 + * 他们共享同一个timer。 + * @param {number} delay 延迟时间,单位毫秒 + * @param {bool} trailing 是否保证最后一次触发的执行 + * true:表示保证最后一次调用会触发执行。 + * 但任何调用后不可能立即执行,总会delay。 + * false:表示不保证最后一次调用会触发执行。 + * 但只要间隔大于delay,调用就会立即执行。 + * @param {bool} debounce 节流 + * true:表示:频繁调用(间隔小于delay)时,根本不执行 + * false:表示:频繁调用(间隔小于delay)时,按规律心跳执行 + * @return {(Function|Array.)} 实际调用函数。 + * 当输入的fn为array时,返回值也为array。 + * 每项是Function。 + */ + lib.throttle = function (fn, delay, trailing, debounce) { + + var currCall = (new Date()).getTime(); + var lastCall = 0; + var lastExec = 0; + var timer = null; + var diff; + var scope; + var args; + var isSingle = typeof fn === 'function'; + delay = delay || 0; + + if (isSingle) { + return createCallback(); + } + else { + var ret = []; + for (var i = 0; i < fn.length; i++) { + ret[i] = createCallback(i); + } + return ret; + } + + function createCallback(index) { + + function exec() { + lastExec = (new Date()).getTime(); + timer = null; + (isSingle ? fn : fn[index]).apply(scope, args || []); + } + + var cb = function () { + currCall = (new Date()).getTime(); + scope = this; + args = arguments; + diff = currCall - (debounce ? lastCall : lastExec) - delay; + + clearTimeout(timer); + + if (debounce) { + if (trailing) { + timer = setTimeout(exec, delay); + } + else if (diff >= 0) { + exec(); + } + } + else { + if (diff >= 0) { + exec(); + } + else if (trailing) { + timer = setTimeout(exec, -diff); + } + } + + lastCall = currCall; + }; + + /** + * Clear throttle. + * @public + */ + cb.clear = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + }; + + return cb; + } + }; + + /** + * 按一定频率执行,最后一次调用总归会执行 + * + * @public + */ + lib.fixRate = function (fn, delay) { + return delay != null + ? lib.throttle(fn, delay, true, false) + : fn; + }; + + /** + * 直到不频繁调用了才会执行,最后一次调用总归会执行 + * + * @public + */ + lib.debounce = function (fn, delay) { + return delay != null + ? lib.throttle(fn, delay, true, true) + : fn; + }; + + + /** + * Create throttle method or update throttle rate. + * + * @example + * ComponentView.prototype.render = function () { + * ... + * throttle.createOrUpdate( + * this, + * '_dispatchAction', + * this.model.get('throttle'), + * 'fixRate' + * ); + * }; + * ComponentView.prototype.remove = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * ComponentView.prototype.dispose = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * + * @public + * @param {Object} obj + * @param {string} fnAttr + * @param {number} rate + * @param {string} throttleType 'fixRate' or 'debounce' + */ + lib.createOrUpdate = function (obj, fnAttr, rate, throttleType) { + var fn = obj[fnAttr]; + + if (!fn || rate == null || !throttleType) { + return; + } + + var originFn = fn[ORIGIN_METHOD] || fn; + var lastRate = fn[RATE]; + + if (lastRate !== rate) { + fn = obj[fnAttr] = lib[throttleType](originFn, rate); + fn[ORIGIN_METHOD] = originFn; + fn[RATE] = rate; + } + }; + + /** + * Clear throttle. Example see throttle.createOrUpdate. + * + * @public + * @param {Object} obj + * @param {string} fnAttr + */ + lib.clear = function (obj, fnAttr) { + var fn = obj[fnAttr]; + if (fn && fn[ORIGIN_METHOD]) { + obj[fnAttr] = fn[ORIGIN_METHOD]; + } + }; + + module.exports = lib; + + + +/***/ }, +/* 294 */ +/***/ function(module, exports) { + + + + /** + * Calculate slider move result. + * + * @param {number} delta Move length. + * @param {Array.} handleEnds handleEnds[0] and be bigger then handleEnds[1]. + * handleEnds will be modified in this method. + * @param {Array.} extent handleEnds is restricted by extent. + * extent[0] should less or equals than extent[1]. + * @param {string} mode 'rigid': Math.abs(handleEnds[0] - handleEnds[1]) remain unchanged, + * 'cross' handleEnds[0] can be bigger then handleEnds[1], + * 'push' handleEnds[0] can not be bigger then handleEnds[1], + * when they touch, one push other. + * @param {number} handleIndex If mode is 'rigid', handleIndex is not required. + * @param {Array.} The input handleEnds. + */ + module.exports = function (delta, handleEnds, extent, mode, handleIndex) { + if (!delta) { + return handleEnds; + } + + if (mode === 'rigid') { + delta = getRealDelta(delta, handleEnds, extent); + handleEnds[0] += delta; + handleEnds[1] += delta; + } + else { + delta = getRealDelta(delta, handleEnds[handleIndex], extent); + handleEnds[handleIndex] += delta; + + if (mode === 'push' && handleEnds[0] > handleEnds[1]) { + handleEnds[1 - handleIndex] = handleEnds[handleIndex]; + } + } + + return handleEnds; + + function getRealDelta(delta, handleEnds, extent) { + var handleMinMax = !handleEnds.length + ? [handleEnds, handleEnds] + : handleEnds.slice(); + handleEnds[0] > handleEnds[1] && handleMinMax.reverse(); + + if (delta < 0 && handleMinMax[0] + delta < extent[0]) { + delta = extent[0] - handleMinMax[0]; + } + if (delta > 0 && handleMinMax[1] + delta > extent[1]) { + delta = extent[1] - handleMinMax[1]; + } + return delta; + } + }; + + +/***/ }, +/* 295 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + module.exports = __webpack_require__(288).extend({ + + type: 'dataZoom.inside', + + /** + * @protected + */ + defaultOption: { + zoomLock: false // Whether disable zoom but only pan. + } + }); + + +/***/ }, +/* 296 */ +/***/ function(module, exports, __webpack_require__) { + + + + var DataZoomView = __webpack_require__(290); + var zrUtil = __webpack_require__(3); + var sliderMove = __webpack_require__(294); + var roams = __webpack_require__(297); + var bind = zrUtil.bind; + + var InsideZoomView = DataZoomView.extend({ + + type: 'dataZoom.inside', + + /** + * @override + */ + init: function (ecModel, api) { + /** + * 'throttle' is used in this.dispatchAction, so we save range + * to avoid missing some 'pan' info. + * @private + * @type {Array.} + */ + this._range; + }, + + /** + * @override + */ + render: function (dataZoomModel, ecModel, api, payload) { + InsideZoomView.superApply(this, 'render', arguments); + + // Notice: origin this._range should be maintained, and should not be re-fetched + // from dataZoomModel when payload.type is 'dataZoom', otherwise 'pan' or 'zoom' + // info will be missed because of 'throttle' of this.dispatchAction. + if (roams.shouldRecordRange(payload, dataZoomModel.id)) { + this._range = dataZoomModel.getPercentRange(); + } + + // Reset controllers. + var coordInfoList = this.getTargetInfo().cartesians; + var allCoordIds = zrUtil.map(coordInfoList, function (coordInfo) { + return roams.generateCoordId(coordInfo.model); + }); + zrUtil.each(coordInfoList, function (coordInfo) { + var coordModel = coordInfo.model; + roams.register( + api, + { + coordId: roams.generateCoordId(coordModel), + allCoordIds: allCoordIds, + coordinateSystem: coordModel.coordinateSystem, + dataZoomId: dataZoomModel.id, + throttleRage: dataZoomModel.get('throttle', true), + panGetRange: bind(this._onPan, this, coordInfo), + zoomGetRange: bind(this._onZoom, this, coordInfo) + } + ); + }, this); + + // TODO + // polar支持 + }, + + /** + * @override + */ + remove: function () { + roams.unregister(this.api, this.dataZoomModel.id); + InsideZoomView.superApply(this, 'remove', arguments); + this._range = null; + }, + + /** + * @override + */ + dispose: function () { + roams.unregister(this.api, this.dataZoomModel.id); + InsideZoomView.superApply(this, 'dispose', arguments); + this._range = null; + }, + + /** + * @private + */ + _onPan: function (coordInfo, controller, dx, dy) { + return ( + this._range = panCartesian( + [dx, dy], this._range, controller, coordInfo + ) + ); + }, + + /** + * @private + */ + _onZoom: function (coordInfo, controller, scale, mouseX, mouseY) { + var dataZoomModel = this.dataZoomModel; + + if (dataZoomModel.option.zoomLock) { + return this._range; + } + + return ( + this._range = scaleCartesian( + 1 / scale, [mouseX, mouseY], this._range, + controller, coordInfo, dataZoomModel + ) + ); + } + + }); + + function panCartesian(pixelDeltas, range, controller, coordInfo) { + range = range.slice(); + + // Calculate transform by the first axis. + var axisModel = coordInfo.axisModels[0]; + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo(pixelDeltas, axisModel, controller); + + var percentDelta = directionInfo.signal + * (range[1] - range[0]) + * directionInfo.pixel / directionInfo.pixelLength; + + sliderMove( + percentDelta, + range, + [0, 100], + 'rigid' + ); + + return range; + } + + function scaleCartesian(scale, mousePoint, range, controller, coordInfo, dataZoomModel) { + range = range.slice(); + + // Calculate transform by the first axis. + var axisModel = coordInfo.axisModels[0]; + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo(mousePoint, axisModel, controller); + + var mouse = directionInfo.pixel - directionInfo.pixelStart; + var percentPoint = mouse / directionInfo.pixelLength * (range[1] - range[0]) + range[0]; + + scale = Math.max(scale, 0); + range[0] = (range[0] - percentPoint) * scale + percentPoint; + range[1] = (range[1] - percentPoint) * scale + percentPoint; + + return fixRange(range); + } + + function getDirectionInfo(xy, axisModel, controller) { + var axis = axisModel.axis; + var rect = controller.rect; + var ret = {}; + + if (axis.dim === 'x') { + ret.pixel = xy[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } + else { // axis.dim === 'y' + ret.pixel = xy[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + } + + function fixRange(range) { + // Clamp, using !(<= or >=) to handle NaN. + // jshint ignore:start + var bound = [0, 100]; + !(range[0] <= bound[1]) && (range[0] = bound[1]); + !(range[1] <= bound[1]) && (range[1] = bound[1]); + !(range[0] >= bound[0]) && (range[0] = bound[0]); + !(range[1] >= bound[0]) && (range[1] = bound[0]); + // jshint ignore:end + + return range; + } + + module.exports = InsideZoomView; + + +/***/ }, +/* 297 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Roam controller manager. + */ + + + // Only create one roam controller for each coordinate system. + // one roam controller might be refered by two inside data zoom + // components (for example, one for x and one for y). When user + // pan or zoom, only dispatch one action for those data zoom + // components. + + var zrUtil = __webpack_require__(3); + var RoamController = __webpack_require__(159); + var throttle = __webpack_require__(293); + var curry = zrUtil.curry; + + var ATTR = '\0_ec_dataZoom_roams'; + + var roams = { + + /** + * @public + * @param {module:echarts/ExtensionAPI} api + * @param {Object} dataZoomInfo + * @param {string} dataZoomInfo.coordId + * @param {Object} dataZoomInfo.coordinateSystem + * @param {Array.} dataZoomInfo.allCoordIds + * @param {string} dataZoomInfo.dataZoomId + * @param {number} dataZoomInfo.throttleRate + * @param {Function} dataZoomInfo.panGetRange + * @param {Function} dataZoomInfo.zoomGetRange + */ + register: function (api, dataZoomInfo) { + var store = giveStore(api); + var theDataZoomId = dataZoomInfo.dataZoomId; + var theCoordId = dataZoomInfo.coordId; + + // Do clean when a dataZoom changes its target coordnate system. + zrUtil.each(store, function (record, coordId) { + var dataZoomInfos = record.dataZoomInfos; + if (dataZoomInfos[theDataZoomId] + && zrUtil.indexOf(dataZoomInfo.allCoordIds, theCoordId) < 0 + ) { + delete dataZoomInfos[theDataZoomId]; + record.count--; + } + }); + + cleanStore(store); + + var record = store[theCoordId]; + + // Create if needed. + if (!record) { + record = store[theCoordId] = { + coordId: theCoordId, + dataZoomInfos: {}, + count: 0 + }; + record.controller = createController(api, dataZoomInfo, record); + record.dispatchAction = zrUtil.curry(dispatchAction, api); + } + + // Consider resize, area should be always updated. + record.controller.rect = dataZoomInfo.coordinateSystem.getRect().clone(); + + // Update throttle. + throttle.createOrUpdate( + record, + 'dispatchAction', + dataZoomInfo.throttleRate, + 'fixRate' + ); + + // Update reference of dataZoom. + !(record.dataZoomInfos[theDataZoomId]) && record.count++; + record.dataZoomInfos[theDataZoomId] = dataZoomInfo; + }, + + /** + * @public + * @param {module:echarts/ExtensionAPI} api + * @param {string} dataZoomId + */ + unregister: function (api, dataZoomId) { + var store = giveStore(api); + + zrUtil.each(store, function (record) { + var dataZoomInfos = record.dataZoomInfos; + if (dataZoomInfos[dataZoomId]) { + delete dataZoomInfos[dataZoomId]; + record.count--; + } + }); + + cleanStore(store); + }, + + /** + * @public + */ + shouldRecordRange: function (payload, dataZoomId) { + if (payload && payload.type === 'dataZoom' && payload.batch) { + for (var i = 0, len = payload.batch.length; i < len; i++) { + if (payload.batch[i].dataZoomId === dataZoomId) { + return false; + } + } + } + return true; + }, + + /** + * @public + */ + generateCoordId: function (coordModel) { + return coordModel.type + '\0_' + coordModel.id; + } + }; + + /** + * Key: coordId, value: {dataZoomInfos: [], count, controller} + * @type {Array.} + */ + function giveStore(api) { + // Mount store on zrender instance, so that we do not + // need to worry about dispose. + var zr = api.getZr(); + return zr[ATTR] || (zr[ATTR] = {}); + } + + function createController(api, dataZoomInfo, newRecord) { + var controller = new RoamController(api.getZr()); + controller.enable(); + controller.on('pan', curry(onPan, newRecord)); + controller.on('zoom', curry(onZoom, newRecord)); + + return controller; + } + + function cleanStore(store) { + zrUtil.each(store, function (record, coordId) { + if (!record.count) { + record.controller.off('pan').off('zoom'); + delete store[coordId]; + } + }); + } + + function onPan(record, dx, dy) { + wrapAndDispatch(record, function (info) { + return info.panGetRange(record.controller, dx, dy); + }); + } + + function onZoom(record, scale, mouseX, mouseY) { + wrapAndDispatch(record, function (info) { + return info.zoomGetRange(record.controller, scale, mouseX, mouseY); + }); + } + + function wrapAndDispatch(record, getRange) { + var batch = []; + + zrUtil.each(record.dataZoomInfos, function (info) { + var range = getRange(info); + range && batch.push({ + dataZoomId: info.dataZoomId, + start: range[0], + end: range[1] + }); + }); + + record.dispatchAction(batch); + } + + /** + * This action will be throttled. + */ + function dispatchAction(api, batch) { + api.dispatchAction({ + type: 'dataZoom', + batch: batch + }); + } + + module.exports = roams; + + + +/***/ }, +/* 298 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom processor + */ + + + var echarts = __webpack_require__(1); + + echarts.registerProcessor('filter', function (ecModel, api) { + + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // We calculate window and reset axis here but not in model + // init stage and not after action dispatch handler, because + // reset should be called after seriesData.restoreData. + dataZoomModel.eachTargetAxis(resetSingleAxis); + + // Caution: data zoom filtering is order sensitive when using + // percent range and no min/max/scale set on axis. + // For example, we have dataZoom definition: + // [ + // {xAxisIndex: 0, start: 30, end: 70}, + // {yAxisIndex: 0, start: 20, end: 80} + // ] + // In this case, [20, 80] of y-dataZoom should be based on data + // that have filtered by x-dataZoom using range of [30, 70], + // but should not be based on full raw data. Thus sliding + // x-dataZoom will change both ranges of xAxis and yAxis, + // while sliding y-dataZoom will only change the range of yAxis. + // So we should filter x-axis after reset x-axis immediately, + // and then reset y-axis and filter y-axis. + dataZoomModel.eachTargetAxis(filterSingleAxis); + }); + + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // Fullfill all of the range props so that user + // is able to get them from chart.getOption(). + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + var percentRange = axisProxy.getDataPercentWindow(); + var valueRange = axisProxy.getDataValueWindow(); + dataZoomModel.setRawRange({ + start: percentRange[0], + end: percentRange[1], + startValue: valueRange[0], + endValue: valueRange[1] + }); + }); + }); + + function resetSingleAxis(dimNames, axisIndex, dataZoomModel) { + dataZoomModel.getAxisProxy(dimNames.name, axisIndex).reset(dataZoomModel); + } + + function filterSingleAxis(dimNames, axisIndex, dataZoomModel) { + dataZoomModel.getAxisProxy(dimNames.name, axisIndex).filterData(dataZoomModel); + } + + + + +/***/ }, +/* 299 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom action + */ + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var echarts = __webpack_require__(1); + + + echarts.registerAction('dataZoom', function (payload, ecModel) { + + var linkedNodesFinder = modelUtil.createLinkedNodesFinder( + zrUtil.bind(ecModel.eachComponent, ecModel, 'dataZoom'), + modelUtil.eachAxisDim, + function (model, dimNames) { + return model.get(dimNames.axisIndex); + } + ); + + var effectedModels = []; + + ecModel.eachComponent( + {mainType: 'dataZoom', query: payload}, + function (model, index) { + effectedModels.push.apply( + effectedModels, linkedNodesFinder(model).nodes + ); + } + ); + + zrUtil.each(effectedModels, function (dataZoomModel, index) { + dataZoomModel.setRawRange({ + start: payload.start, + end: payload.end, + startValue: payload.startValue, + endValue: payload.endValue + }); + }); + + }); + + + +/***/ }, +/* 300 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * visualMap component entry + */ + + + __webpack_require__(301); + __webpack_require__(312); + + + +/***/ }, +/* 301 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * DataZoom component entry + */ + + + __webpack_require__(1).registerPreprocessor( + __webpack_require__(302) + ); + + __webpack_require__(303); + __webpack_require__(304); + __webpack_require__(305); + __webpack_require__(308); + __webpack_require__(311); + + + +/***/ }, +/* 302 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file VisualMap preprocessor + */ + + + var zrUtil = __webpack_require__(3); + var each = zrUtil.each; + + module.exports = function (option) { + var visualMap = option && option.visualMap; + + if (!zrUtil.isArray(visualMap)) { + visualMap = visualMap ? [visualMap] : []; + } + + each(visualMap, function (opt) { + if (!opt) { + return; + } + + // rename splitList to pieces + if (has(opt, 'splitList') && !has(opt, 'pieces')) { + opt.pieces = opt.splitList; + delete opt.splitList; + } + + var pieces = opt.pieces; + if (pieces && zrUtil.isArray(pieces)) { + each(pieces, function (piece) { + if (zrUtil.isObject(piece)) { + if (has(piece, 'start') && !has(piece, 'min')) { + piece.min = piece.start; + } + if (has(piece, 'end') && !has(piece, 'max')) { + piece.max = piece.end; + } + } + }); + } + }); + }; + + function has(obj, name) { + return obj && obj.hasOwnProperty && obj.hasOwnProperty(name); + } + + + +/***/ }, +/* 303 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(19).registerSubTypeDefaulter('visualMap', function (option) { + // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used. + return ( + !option.categories + && ( + !( + option.pieces + ? option.pieces.length > 0 + : option.splitNumber > 0 + ) + || option.calculable + ) + ) + ? 'continuous' : 'piecewise'; + }); + + + +/***/ }, +/* 304 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data range visual coding. + */ + + + var echarts = __webpack_require__(1); + var VisualMapping = __webpack_require__(187); + var zrUtil = __webpack_require__(3); + + echarts.registerVisualCoding('component', function (ecModel) { + ecModel.eachComponent('visualMap', function (visualMapModel) { + processSingleVisualMap(visualMapModel, ecModel); + }); + }); + + function processSingleVisualMap(visualMapModel, ecModel) { + var visualMappings = visualMapModel.targetVisuals; + var visualTypesMap = {}; + zrUtil.each(['inRange', 'outOfRange'], function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + + visualMapModel.eachTargetSeries(function (seriesModel) { + var data = seriesModel.getData(); + var dimension = visualMapModel.getDataDimension(data); + var dataIndex; + + function getVisual(key) { + return data.getItemVisual(dataIndex, key); + } + + function setVisual(key, value) { + data.setItemVisual(dataIndex, key, value); + } + + data.each([dimension], function (value, index) { + // For performance consideration, do not use curry. + dataIndex = index; + var valueState = visualMapModel.getValueState(value); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual); + } + }); + }); + } + + + + +/***/ }, +/* 305 */ +/***/ function(module, exports, __webpack_require__) { + + + /** + * @file Data zoom model + */ + + + var VisualMapModel = __webpack_require__(306); + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + + // Constant + var DEFAULT_BAR_BOUND = [20, 140]; + + var ContinuousModel = VisualMapModel.extend({ + + type: 'visualMap.continuous', + + /** + * @protected + */ + defaultOption: { + handlePosition: 'auto', // 'auto', 'left', 'right', 'top', 'bottom' + calculable: false, // 是否值域漫游,启用后无视splitNumber和pieces,线性渐变 + range: [-Infinity, Infinity], // 当前选中范围 + hoverLink: true, + realtime: true, + itemWidth: null, // 值域图形宽度 + itemHeight: null // 值域图形高度 + }, + + /** + * @override + */ + doMergeOption: function (newOption, isInit) { + ContinuousModel.superApply(this, 'doMergeOption', arguments); + + this.resetTargetSeries(newOption, isInit); + this.resetExtent(); + + this.resetVisual(function (mappingOption) { + mappingOption.mappingMethod = 'linear'; + }); + + this._resetRange(); + }, + + /** + * @protected + * @override + */ + resetItemSize: function () { + VisualMapModel.prototype.resetItemSize.apply(this, arguments); + + var itemSize = this.itemSize; + + this._orient === 'horizontal' && itemSize.reverse(); + + (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]); + (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]); + }, + + /** + * @private + */ + _resetRange: function () { + var dataExtent = this.getExtent(); + var range = this.option.range; + if (range[0] > range[1]) { + range.reverse(); + } + range[0] = Math.max(range[0], dataExtent[0]); + range[1] = Math.min(range[1], dataExtent[1]); + }, + + /** + * @protected + * @override + */ + completeVisualOption: function () { + VisualMapModel.prototype.completeVisualOption.apply(this, arguments); + + zrUtil.each(this.stateList, function (state) { + var symbolSize = this.option.controller[state].symbolSize; + if (symbolSize && symbolSize[0] !== symbolSize[1]) { + symbolSize[0] = 0; // For good looking. + } + }, this); + }, + + /** + * @public + * @override + */ + setSelected: function (selected) { + this.option.range = selected.slice(); + this._resetRange(); + }, + + /** + * @public + */ + getSelected: function () { + var dataExtent = this.getExtent(); + + var dataInterval = numberUtil.asc( + (this.get('range') || []).slice() + ); + + // Clamp + dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]); + dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]); + dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]); + dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]); + + return dataInterval; + }, + + /** + * @public + * @override + */ + getValueState: function (value) { + var range = this.option.range; + var dataExtent = this.getExtent(); + + // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'. + // range[1] is processed likewise. + return ( + (range[0] <= dataExtent[0] || range[0] <= value) + && (range[1] >= dataExtent[1] || value <= range[1]) + ) ? 'inRange' : 'outOfRange'; + } + + }); + + module.exports = ContinuousModel; + + + +/***/ }, +/* 306 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + var zrUtil = __webpack_require__(3); + var env = __webpack_require__(78); + var echarts = __webpack_require__(1); + var modelUtil = __webpack_require__(5); + var visualDefault = __webpack_require__(307); + var VisualMapping = __webpack_require__(187); + var mapVisual = VisualMapping.mapVisual; + var eachVisual = VisualMapping.eachVisual; + var numberUtil = __webpack_require__(7); + var isArray = zrUtil.isArray; + var each = zrUtil.each; + var asc = numberUtil.asc; + var linearMap = numberUtil.linearMap; + + var VisualMapModel = echarts.extendComponentModel({ + + type: 'visualMap', + + dependencies: ['series'], + + /** + * [lowerBound, upperBound] + * + * @readOnly + * @type {Array.} + */ + dataBound: [-Infinity, Infinity], + + /** + * @readOnly + * @type {Array.} + */ + stateList: ['inRange', 'outOfRange'], + + /** + * @readOnly + * @type {string|Object} + */ + layoutMode: {type: 'box', ignoreSize: true}, + + /** + * @protected + */ + defaultOption: { + show: true, + + zlevel: 0, + z: 4, + + // set min: 0, max: 200, only for campatible with ec2. + // In fact min max should not have default value. + min: 0, // min value, must specified if pieces is not specified. + max: 200, // max value, must specified if pieces is not specified. + + dimension: null, + inRange: null, // 'color', 'colorHue', 'colorSaturation', 'colorLightness', 'colorAlpha', + // 'symbol', 'symbolSize' + outOfRange: null, // 'color', 'colorHue', 'colorSaturation', + // 'colorLightness', 'colorAlpha', + // 'symbol', 'symbolSize' + + left: 0, // 'center' ¦ 'left' ¦ 'right' ¦ {number} (px) + right: null, // The same as left. + top: null, // 'top' ¦ 'bottom' ¦ 'center' ¦ {number} (px) + bottom: 0, // The same as top. + + itemWidth: null, + itemHeight: null, + inverse: false, + orient: 'vertical', // 'horizontal' ¦ 'vertical' + + seriesIndex: null, // 所控制的series indices,默认所有有value的series. + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', // 值域边框颜色 + contentColor: '#5793f3', + inactiveColor: '#aaa', + borderWidth: 0, // 值域边框线宽,单位px,默认为0(无边框) + padding: 5, // 值域内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + textGap: 10, // + precision: 0, // 小数精度,默认为0,无小数点 + color: ['#bf444c', '#d88273', '#f6efa6'], //颜色(deprecated,兼容ec2,顺序同pieces,不同于inRange/outOfRange) + + formatter: null, + text: null, // 文本,如['高', '低'],兼容ec2,text[0]对应高值,text[1]对应低值 + textStyle: { + color: '#333' // 值域文字颜色 + } + }, + + /** + * @protected + */ + init: function (option, parentModel, ecModel) { + /** + * @private + * @type {boolean} + */ + this._autoSeriesIndex = false; + + /** + * @private + * @type {Array.} + */ + this._dataExtent; + + /** + * @readOnly + */ + this.controllerVisuals = {}; + + /** + * @readOnly + */ + this.targetVisuals = {}; + + /** + * @readOnly + */ + this.textStyleModel; + + /** + * [width, height] + * @readOnly + * @type {Array.} + */ + this.itemSize; + + this.mergeDefaultAndTheme(option, ecModel); + + this.doMergeOption({}, true); + }, + + /** + * @public + */ + mergeOption: function (option) { + VisualMapModel.superApply(this, 'mergeOption', arguments); + this.doMergeOption(option, false); + }, + + /** + * @protected + */ + doMergeOption: function (newOption, isInit) { + var thisOption = this.option; + + // Visual attributes merge is not supported, otherwise it + // brings overcomplicated merge logic. See #2853. + !isInit && replaceVisualOption(thisOption, newOption); + + // FIXME + // necessary? + // Disable realtime view update if canvas is not supported. + if (!env.canvasSupported) { + thisOption.realtime = false; + } + + this.textStyleModel = this.getModel('textStyle'); + + this.resetItemSize(); + + this.completeVisualOption(); + }, + + /** + * @example + * this.formatValueText(someVal); // format single numeric value to text. + * this.formatValueText(someVal, true); // format single category value to text. + * this.formatValueText([min, max]); // format numeric min-max to text. + * this.formatValueText([this.dataBound[0], max]); // using data lower bound. + * this.formatValueText([min, this.dataBound[1]]); // using data upper bound. + * + * @param {number|Array.} value Real value, or this.dataBound[0 or 1]. + * @param {boolean} [isCategory=false] Only available when value is number. + * @return {string} + * @protected + */ + formatValueText: function(value, isCategory) { + var option = this.option; + var precision = option.precision; + var dataBound = this.dataBound; + var formatter = option.formatter; + var isMinMax; + var textValue; + + if (zrUtil.isArray(value)) { + value = value.slice(); + isMinMax = true; + } + + textValue = isCategory + ? value + : (isMinMax + ? [toFixed(value[0]), toFixed(value[1])] + : toFixed(value) + ); + + if (zrUtil.isString(formatter)) { + return formatter + .replace('{value}', isMinMax ? textValue[0] : textValue) + .replace('{value2}', isMinMax ? textValue[1] : textValue); + } + else if (zrUtil.isFunction(formatter)) { + return isMinMax + ? formatter(value[0], value[1]) + : formatter(value); + } + + if (isMinMax) { + if (value[0] === dataBound[0]) { + return '< ' + textValue[1]; + } + else if (value[1] === dataBound[1]) { + return '> ' + textValue[0]; + } + else { + return textValue[0] + ' - ' + textValue[1]; + } + } + else { // Format single value (includes category case). + return textValue; + } + + function toFixed(val) { + return val === dataBound[0] + ? 'min' + : val === dataBound[1] + ? 'max' + : (+val).toFixed(precision); + } + }, + + /** + * @protected + */ + resetTargetSeries: function (newOption, isInit) { + var thisOption = this.option; + var autoSeriesIndex = this._autoSeriesIndex = + (isInit ? thisOption : newOption).seriesIndex == null; + thisOption.seriesIndex = autoSeriesIndex + ? [] : modelUtil.normalizeToArray(thisOption.seriesIndex); + + autoSeriesIndex && this.ecModel.eachSeries(function (seriesModel, index) { + var data = seriesModel.getData(); + // FIXME + // 只考虑了list,还没有考虑map等。 + + // FIXME + // 这里可能应该这么判断:data.dimensions中有超出其所属coordSystem的量。 + if (data.type === 'list') { + thisOption.seriesIndex.push(index); + } + }); + }, + + /** + * @protected + */ + resetExtent: function () { + var thisOption = this.option; + + // Can not calculate data extent by data here. + // Because series and data may be modified in processing stage. + // So we do not support the feature "auto min/max". + + var extent = asc([thisOption.min, thisOption.max]); + + this._dataExtent = extent; + }, + + /** + * @protected + */ + getDataDimension: function (list) { + var optDim = this.option.dimension; + return optDim != null + ? optDim : list.dimensions.length - 1; + }, + + /** + * @public + * @override + */ + getExtent: function () { + return this._dataExtent.slice(); + }, + + /** + * @protected + */ + resetVisual: function (fillVisualOption) { + var dataExtent = this.getExtent(); + + doReset.call(this, 'controller', this.controllerVisuals); + doReset.call(this, 'target', this.targetVisuals); + + function doReset(baseAttr, visualMappings) { + each(this.stateList, function (state) { + var mappings = visualMappings[state] || (visualMappings[state] = {}); + var visaulOption = this.option[baseAttr][state] || {}; + each(visaulOption, function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + var mappingOption = { + type: visualType, + dataExtent: dataExtent, + visual: visualData + }; + fillVisualOption && fillVisualOption.call(this, mappingOption, state); + mappings[visualType] = new VisualMapping(mappingOption); + }, this); + }, this); + } + }, + + /** + * @protected + */ + completeVisualOption: function () { + var thisOption = this.option; + var base = {inRange: thisOption.inRange, outOfRange: thisOption.outOfRange}; + + var target = thisOption.target || (thisOption.target = {}); + var controller = thisOption.controller || (thisOption.controller = {}); + + zrUtil.merge(target, base); // Do not override + zrUtil.merge(controller, base); // Do not override + + var isCategory = this.isCategory(); + + completeSingle.call(this, target); + completeSingle.call(this, controller); + completeInactive.call(this, target, 'inRange', 'outOfRange'); + completeInactive.call(this, target, 'outOfRange', 'inRange'); + completeController.call(this, controller); + + function completeSingle(base) { + // Compatible with ec2 dataRange.color. + // The mapping order of dataRange.color is: [high value, ..., low value] + // whereas inRange.color and outOfRange.color is [low value, ..., high value] + // Notice: ec2 has no inverse. + if (isArray(thisOption.color) + // If there has been inRange: {symbol: ...}, adding color is a mistake. + // So adding color only when no inRange defined. + && !base.inRange + ) { + base.inRange = {color: thisOption.color.slice().reverse()}; + } + + // If using shortcut like: {inRange: 'symbol'}, complete default value. + each(this.stateList, function (state) { + var visualType = base[state]; + + if (zrUtil.isString(visualType)) { + var defa = visualDefault.get(visualType, 'active', isCategory); + if (defa) { + base[state] = {}; + base[state][visualType] = defa; + } + else { + // Mark as not specified. + delete base[state]; + } + } + }, this); + } + + function completeInactive(base, stateExist, stateAbsent) { + var optExist = base[stateExist]; + var optAbsent = base[stateAbsent]; + + if (optExist && !optAbsent) { + optAbsent = base[stateAbsent] = {}; + each(optExist, function (visualData, visualType) { + var defa = visualDefault.get(visualType, 'inactive', isCategory); + if (VisualMapping.isValidType(visualType) && defa) { + optAbsent[visualType] = defa; + } + }); + } + } + + function completeController(controller) { + var symbolExists = (controller.inRange || {}).symbol + || (controller.outOfRange || {}).symbol; + var symbolSizeExists = (controller.inRange || {}).symbolSize + || (controller.outOfRange || {}).symbolSize; + var inactiveColor = this.get('inactiveColor'); + + each(this.stateList, function (state) { + + var itemSize = this.itemSize; + var visuals = controller[state]; + + // Set inactive color for controller if no other color attr (like colorAlpha) specified. + if (!visuals) { + visuals = controller[state] = { + color: isCategory ? inactiveColor : [inactiveColor] + }; + } + + // Consistent symbol and symbolSize if not specified. + if (!visuals.symbol) { + visuals.symbol = symbolExists + && zrUtil.clone(symbolExists) + || (isCategory ? 'roundRect' : ['roundRect']); + } + if (!visuals.symbolSize) { + visuals.symbolSize = symbolSizeExists + && zrUtil.clone(symbolSizeExists) + || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]); + } + + // Filter square and none. + visuals.symbol = mapVisual(visuals.symbol, function (symbol) { + return (symbol === 'none' || symbol === 'square') ? 'roundRect' : symbol; + }); + + // Normalize symbolSize + var symbolSize = visuals.symbolSize; + + if (symbolSize) { + var max = -Infinity; + // symbolSize can be object when categories defined. + eachVisual(symbolSize, function (value) { + value > max && (max = value); + }); + visuals.symbolSize = mapVisual(symbolSize, function (value) { + return linearMap(value, [0, max], [0, itemSize[0]], true); + }); + } + + }, this); + } + }, + + /** + * @public + */ + eachTargetSeries: function (callback, context) { + zrUtil.each(this.option.seriesIndex, function (seriesIndex) { + callback.call(context, this.ecModel.getSeriesByIndex(seriesIndex)); + }, this); + }, + + /** + * @public + */ + isCategory: function () { + return !!this.option.categories; + }, + + /** + * @protected + */ + resetItemSize: function () { + this.itemSize = [ + parseFloat(this.get('itemWidth')), + parseFloat(this.get('itemHeight')) + ]; + }, + + /** + * @public + * @abstract + */ + setSelected: zrUtil.noop, + + /** + * @public + * @abstract + */ + getValueState: zrUtil.noop + + }); + + function replaceVisualOption(targetOption, sourceOption) { + zrUtil.each( + ['inRange', 'outOfRange', 'target', 'controller', 'color'], + function (key) { + if (sourceOption.hasOwnProperty(key)) { + targetOption[key] = zrUtil.clone(sourceOption[key]); + } + else { + delete targetOption[key]; + } + } + ); + } + + module.exports = VisualMapModel; + + + +/***/ }, +/* 307 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Visual mapping. + */ + + + var zrUtil = __webpack_require__(3); + + var visualDefault = { + + /** + * @public + */ + get: function (visualType, key, isCategory) { + var value = zrUtil.clone( + (defaultOption[visualType] || {})[key] + ); + + return isCategory + ? (zrUtil.isArray(value) ? value[value.length - 1] : value) + : value; + } + + }; + + var defaultOption = { + + color: { + active: ['#006edd', '#e0ffff'], + inactive: ['rgba(0,0,0,0)'] + }, + + colorHue: { + active: [0, 360], + inactive: [0, 0] + }, + + colorSaturation: { + active: [0.3, 1], + inactive: [0, 0] + }, + + colorLightness: { + active: [0.9, 0.5], + inactive: [0, 0] + }, + + colorAlpha: { + active: [0.3, 1], + inactive: [0, 0] + }, + + symbol: { + active: ['circle', 'roundRect', 'diamond'], + inactive: ['none'] + }, + + symbolSize: { + active: [10, 50], + inactive: [0, 0] + } + }; + + module.exports = visualDefault; + + + + +/***/ }, +/* 308 */ +/***/ function(module, exports, __webpack_require__) { + + + + var VisualMapView = __webpack_require__(309); + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var sliderMove = __webpack_require__(294); + var linearMap = numberUtil.linearMap; + var LinearGradient = __webpack_require__(75); + var helper = __webpack_require__(310); + var each = zrUtil.each; + + // Notice: + // Any "interval" should be by the order of [low, high]. + // "handle0" (handleIndex === 0) maps to + // low data value: this._dataInterval[0] and has low coord. + // "handle1" (handleIndex === 1) maps to + // high data value: this._dataInterval[1] and has high coord. + // The logic of transform is implemented in this._createBarGroup. + + var ContinuousVisualMapView = VisualMapView.extend({ + + type: 'visualMap.continuous', + + /** + * @override + */ + init: function () { + + VisualMapView.prototype.init.apply(this, arguments); + + /** + * @private + */ + this._shapes = {}; + + /** + * @private + */ + this._dataInterval = []; + + /** + * @private + */ + this._handleEnds = []; + + /** + * @private + */ + this._orient; + + /** + * @private + */ + this._useHandle; + }, + + /** + * @protected + * @override + */ + doRender: function (visualMapModel, ecModel, api, payload) { + if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) { + this._buildView(); + } + else { + this._updateView(); + } + }, + + /** + * @private + */ + _buildView: function () { + this.group.removeAll(); + + var visualMapModel = this.visualMapModel; + var thisGroup = this.group; + + this._orient = visualMapModel.get('orient'); + this._useHandle = visualMapModel.get('calculable'); + + this._resetInterval(); + + this._renderBar(thisGroup); + + var dataRangeText = visualMapModel.get('text'); + this._renderEndsText(thisGroup, dataRangeText, 0); + this._renderEndsText(thisGroup, dataRangeText, 1); + + // Do this for background size calculation. + this._updateView(true); + + // After updating view, inner shapes is built completely, + // and then background can be rendered. + this.renderBackground(thisGroup); + + // Real update view + this._updateView(); + + this.positionGroup(thisGroup); + }, + + /** + * @private + */ + _renderEndsText: function (group, dataRangeText, endsIndex) { + if (!dataRangeText) { + return; + } + + // Compatible with ec2, text[0] map to high value, text[1] map low value. + var text = dataRangeText[1 - endsIndex]; + text = text != null ? text + '' : ''; + + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var itemSize = visualMapModel.itemSize; + + var barGroup = this._shapes.barGroup; + var position = this._applyTransform( + [ + itemSize[0] / 2, + endsIndex === 0 ? -textGap : itemSize[1] + textGap + ], + barGroup + ); + var align = this._applyTransform( + endsIndex === 0 ? 'bottom' : 'top', + barGroup + ); + var orient = this._orient; + var textStyleModel = this.visualMapModel.textStyleModel; + + this.group.add(new graphic.Text({ + style: { + x: position[0], + y: position[1], + textVerticalAlign: orient === 'horizontal' ? 'middle' : align, + textAlign: orient === 'horizontal' ? align : 'center', + text: text, + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + } + })); + }, + + /** + * @private + */ + _renderBar: function (targetGroup) { + var visualMapModel = this.visualMapModel; + var shapes = this._shapes; + var itemSize = visualMapModel.itemSize; + var orient = this._orient; + var useHandle = this._useHandle; + var itemAlign = helper.getItemAlign(visualMapModel, this.api, itemSize); + var barGroup = shapes.barGroup = this._createBarGroup(itemAlign); + + // Bar + barGroup.add(shapes.outOfRange = createPolygon()); + barGroup.add(shapes.inRange = createPolygon( + null, + zrUtil.bind(this._modifyHandle, this, 'all'), + useHandle ? 'move' : null + )); + + var textRect = visualMapModel.textStyleModel.getTextRect('国'); + var textSize = Math.max(textRect.width, textRect.height); + + // Handle + if (useHandle) { + shapes.handleGroups = []; + shapes.handleThumbs = []; + shapes.handleLabels = []; + shapes.handleLabelPoints = []; + + this._createHandle(barGroup, 0, itemSize, textSize, orient, itemAlign); + this._createHandle(barGroup, 1, itemSize, textSize, orient, itemAlign); + } + + // Indicator + // FIXME + + targetGroup.add(barGroup); + }, + + /** + * @private + */ + _createHandle: function (barGroup, handleIndex, itemSize, textSize, orient) { + var handleGroup = new graphic.Group({position: [itemSize[0], 0]}); + var handleThumb = createPolygon( + createHandlePoints(handleIndex, textSize), + zrUtil.bind(this._modifyHandle, this, handleIndex), + 'move' + ); + handleGroup.add(handleThumb); + + // For text locating. Text is always horizontal layout + // but should not be effected by transform. + var handleLabelPoint = { + x: orient === 'horizontal' + ? textSize / 2 + : textSize * 1.5, + y: orient === 'horizontal' + ? (handleIndex === 0 ? -(textSize * 1.5) : (textSize * 1.5)) + : (handleIndex === 0 ? -textSize / 2 : textSize / 2) + }; + + var textStyleModel = this.visualMapModel.textStyleModel; + var handleLabel = new graphic.Text({ + silent: true, + style: { + x: 0, y: 0, text: '', + textVerticalAlign: 'middle', + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + } + }); + + this.group.add(handleLabel); // Text do not transform + + var shapes = this._shapes; + shapes.handleThumbs[handleIndex] = handleThumb; + shapes.handleGroups[handleIndex] = handleGroup; + shapes.handleLabelPoints[handleIndex] = handleLabelPoint; + shapes.handleLabels[handleIndex] = handleLabel; + + barGroup.add(handleGroup); + }, + + /** + * @private + */ + _modifyHandle: function (handleIndex, dx, dy) { + if (!this._useHandle) { + return; + } + + // Transform dx, dy to bar coordination. + var vertex = this._applyTransform([dx, dy], this._shapes.barGroup, true); + this._updateInterval(handleIndex, vertex[1]); + + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: this._dataInterval.slice() + }); + }, + + /** + * @private + */ + _resetInterval: function () { + var visualMapModel = this.visualMapModel; + + var dataInterval = this._dataInterval = visualMapModel.getSelected(); + var dataExtent = visualMapModel.getExtent(); + var sizeExtent = [0, visualMapModel.itemSize[1]]; + + this._handleEnds = [ + linearMap(dataInterval[0], dataExtent, sizeExtent,true), + linearMap(dataInterval[1], dataExtent, sizeExtent,true) + ]; + }, + + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} dx + * @param {number} dy + */ + _updateInterval: function (handleIndex, delta) { + delta = delta || 0; + var visualMapModel = this.visualMapModel; + var handleEnds = this._handleEnds; + + sliderMove( + delta, + handleEnds, + [0, visualMapModel.itemSize[1]], + handleIndex === 'all' ? 'rigid' : 'push', + handleIndex + ); + var dataExtent = visualMapModel.getExtent(); + var sizeExtent = [0, visualMapModel.itemSize[1]]; + // Update data interval. + this._dataInterval = [ + linearMap(handleEnds[0], sizeExtent, dataExtent, true), + linearMap(handleEnds[1], sizeExtent, dataExtent, true) + ]; + }, + + /** + * @private + */ + _updateView: function (forSketch) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var shapes = this._shapes; + var dataInterval = this._dataInterval; + + var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]]; + var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds; + + var visualInRange = this._createBarVisual( + dataInterval, dataExtent, inRangeHandleEnds, 'inRange' + ); + var visualOutOfRange = this._createBarVisual( + dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange' + ); + + shapes.inRange + .setStyle('fill', visualInRange.barColor) + .setShape('points', visualInRange.barPoints); + shapes.outOfRange + .setStyle('fill', visualOutOfRange.barColor) + .setShape('points', visualOutOfRange.barPoints); + + this._useHandle && each([0, 1], function (handleIndex) { + + shapes.handleThumbs[handleIndex].setStyle( + 'fill', visualInRange.handlesColor[handleIndex] + ); + + shapes.handleLabels[handleIndex].setStyle({ + text: visualMapModel.formatValueText(dataInterval[handleIndex]), + textAlign: this._applyTransform( + this._orient === 'horizontal' + ? (handleIndex === 0 ? 'bottom' : 'top') + : 'left', + shapes.barGroup + ) + }); + + }, this); + + this._updateHandlePosition(inRangeHandleEnds); + }, + + /** + * @private + */ + _createBarVisual: function (dataInterval, dataExtent, handleEnds, forceState) { + var colorStops = this.getControllerVisual(dataInterval, forceState, 'color').color; + + var symbolSizes = [ + this.getControllerVisual(dataInterval[0], forceState, 'symbolSize').symbolSize, + this.getControllerVisual(dataInterval[1], forceState, 'symbolSize').symbolSize + ]; + var barPoints = this._createBarPoints(handleEnds, symbolSizes); + + return { + barColor: new LinearGradient(0, 0, 1, 1, colorStops), + barPoints: barPoints, + handlesColor: [ + colorStops[0].color, + colorStops[colorStops.length - 1].color + ] + }; + }, + + /** + * @private + */ + _createBarPoints: function (handleEnds, symbolSizes) { + var itemSize = this.visualMapModel.itemSize; + + return [ + [itemSize[0] - symbolSizes[0], handleEnds[0]], + [itemSize[0], handleEnds[0]], + [itemSize[0], handleEnds[1]], + [itemSize[0] - symbolSizes[1], handleEnds[1]] + ]; + }, + + /** + * @private + */ + _createBarGroup: function (itemAlign) { + var orient = this._orient; + var inverse = this.visualMapModel.get('inverse'); + + return new graphic.Group( + (orient === 'horizontal' && !inverse) + ? {scale: itemAlign === 'bottom' ? [1, 1] : [-1, 1], rotation: Math.PI / 2} + : (orient === 'horizontal' && inverse) + ? {scale: itemAlign === 'bottom' ? [-1, 1] : [1, 1], rotation: -Math.PI / 2} + : (orient === 'vertical' && !inverse) + ? {scale: itemAlign === 'left' ? [1, -1] : [-1, -1]} + : {scale: itemAlign === 'left' ? [1, 1] : [-1, 1]} + ); + }, + + /** + * @private + */ + _updateHandlePosition: function (handleEnds) { + if (!this._useHandle) { + return; + } + + var shapes = this._shapes; + + each([0, 1], function (handleIndex) { + var handleGroup = shapes.handleGroups[handleIndex]; + handleGroup.position[1] = handleEnds[handleIndex]; + + // Update handle label position. + var labelPoint = shapes.handleLabelPoints[handleIndex]; + var textPoint = graphic.applyTransform( + [labelPoint.x, labelPoint.y], + graphic.getTransform(handleGroup, this.group) + ); + + shapes.handleLabels[handleIndex].setStyle({ + x: textPoint[0], y: textPoint[1] + }); + }, this); + }, + + /** + * @private + */ + _applyTransform: function (vertex, element, inverse) { + var transform = graphic.getTransform(element, this.group); + + return graphic[ + zrUtil.isArray(vertex) + ? 'applyTransform' : 'transformDirection' + ](vertex, transform, inverse); + } + + }); + + function createPolygon(points, onDrift, cursor) { + return new graphic.Polygon({ + shape: {points: points}, + draggable: !!onDrift, + cursor: cursor, + drift: onDrift + }); + } + + function createHandlePoints(handleIndex, textSize) { + return handleIndex === 0 + ? [[0, 0], [textSize, 0], [textSize, -textSize]] + : [[0, 0], [textSize, 0], [textSize, textSize]]; + } + + module.exports = ContinuousVisualMapView; + + + +/***/ }, +/* 309 */ +/***/ function(module, exports, __webpack_require__) { + + + + var echarts = __webpack_require__(1); + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var formatUtil = __webpack_require__(6); + var layout = __webpack_require__(21); + var VisualMapping = __webpack_require__(187); + + module.exports = echarts.extendComponentView({ + + type: 'visualMap', + + /** + * @readOnly + * @type {Object} + */ + autoPositionValues: {left: 1, right: 1, top: 1, bottom: 1}, + + init: function (ecModel, api) { + /** + * @readOnly + * @type {module:echarts/model/Global} + */ + this.ecModel = ecModel; + + /** + * @readOnly + * @type {module:echarts/ExtensionAPI} + */ + this.api = api; + + /** + * @readOnly + * @type {module:echarts/component/visualMap/visualMapModel} + */ + this.visualMapModel; + + /** + * @private + * @type {Object} + */ + this._updatableShapes = {}; + }, + + /** + * @protected + */ + render: function (visualMapModel, ecModel, api, payload) { + this.visualMapModel = visualMapModel; + + if (visualMapModel.get('show') === false) { + this.group.removeAll(); + return; + } + + this.doRender.apply(this, arguments); + }, + + /** + * @protected + */ + renderBackground: function (group) { + var visualMapModel = this.visualMapModel; + var padding = formatUtil.normalizeCssArray(visualMapModel.get('padding') || 0); + var rect = group.getBoundingRect(); + + group.add(new graphic.Rect({ + z2: -1, // Lay background rect on the lowest layer. + silent: true, + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[3] + padding[1], + height: rect.height + padding[0] + padding[2] + }, + style: { + fill: visualMapModel.get('backgroundColor'), + stroke: visualMapModel.get('borderColor'), + lineWidth: visualMapModel.get('borderWidth') + } + })); + }, + + /** + * @protected + * @param {(number|Array)} targetValue + * @param {string=} forceState Specify state, instead of using getValueState method. + * @param {string=} visualCluster Specify visual type, defualt all available visualClusters. + */ + getControllerVisual: function (targetValue, forceState, visualCluster) { + var visualMapModel = this.visualMapModel; + var targetIsArray = zrUtil.isArray(targetValue); + + // targetValue is array when caculate gradient color, + // where forceState is required. + if (targetIsArray && (!forceState || visualCluster !== 'color')) { + throw new Error(targetValue); + } + + var mappings = visualMapModel.controllerVisuals[ + forceState || visualMapModel.getValueState(targetValue) + ]; + var defaultColor = visualMapModel.get('contentColor'); + var visualObj = { + symbol: visualMapModel.get('itemSymbol'), + color: targetIsArray + ? [{color: defaultColor, offset: 0}, {color: defaultColor, offset: 1}] + : defaultColor + }; + + function getter(key) { + return visualObj[key]; + } + + function setter(key, value) { + visualObj[key] = value; + } + + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + + zrUtil.each(visualTypes, function (type) { + var visualMapping = mappings[type]; + if (!visualCluster || VisualMapping.isInVisualCluster(type, visualCluster)) { + visualMapping && visualMapping.applyVisual(targetValue, getter, setter); + } + }); + + return visualObj; + }, + + /** + * @protected + */ + positionGroup: function (group) { + var model = this.visualMapModel; + var api = this.api; + + layout.positionGroup( + group, + model.getBoxLayoutParams(), + {width: api.getWidth(), height: api.getHeight()} + ); + }, + + /** + * @protected + * @abstract + */ + doRender: zrUtil.noop + + }); + + +/***/ }, +/* 310 */ +/***/ function(module, exports, __webpack_require__) { + + + + var layout = __webpack_require__(21); + + var helper = { + + /** + * @param {module:echarts/component/visualMap/VisualMapModel} visualMapModel\ + * @param {module:echarts/ExtensionAPI} api + * @param {Array.} itemSize always [short, long] + * @return {string} 'left' or 'right' or 'top' or 'bottom' + */ + getItemAlign: function (visualMapModel, api, itemSize) { + var modelOption = visualMapModel.option; + var itemAlign = modelOption.align; + + if (itemAlign != null && itemAlign !== 'auto') { + return itemAlign; + } + + // Auto decision align. + var ecSize = {width: api.getWidth(), height: api.getHeight()}; + var realIndex = modelOption.orient === 'horizontal' ? 1 : 0; + + var paramsSet = [ + ['left', 'right', 'width'], + ['top', 'bottom', 'height'] + ]; + var reals = paramsSet[realIndex]; + var fakeValue = [0, null, 10]; + + var layoutInput = {}; + for (var i = 0; i < 3; i++) { + layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i]; + layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]]; + } + + var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex]; + var rect = layout.getLayoutRect(layoutInput, ecSize, modelOption.padding); + + return reals[ + (rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 + < ecSize[rParam[1]] * 0.5 ? 0 : 1 + ]; + } + }; + + module.exports = helper; + + + +/***/ }, +/* 311 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data range action + */ + + + var echarts = __webpack_require__(1); + + var actionInfo = { + type: 'selectDataRange', + event: 'dataRangeSelected', + // FIXME use updateView appears wrong + update: 'update' + }; + + echarts.registerAction(actionInfo, function (payload, ecModel) { + + ecModel.eachComponent({mainType: 'visualMap', query: payload}, function (model) { + model.setSelected(payload.selected); + }); + + }); + + + +/***/ }, +/* 312 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * DataZoom component entry + */ + + + __webpack_require__(1).registerPreprocessor( + __webpack_require__(302) + ); + + __webpack_require__(303); + __webpack_require__(304); + __webpack_require__(313); + __webpack_require__(314); + __webpack_require__(311); + + + +/***/ }, +/* 313 */ +/***/ function(module, exports, __webpack_require__) { + + + + var VisualMapModel = __webpack_require__(306); + var zrUtil = __webpack_require__(3); + var VisualMapping = __webpack_require__(187); + + var PiecewiseModel = VisualMapModel.extend({ + + type: 'visualMap.piecewise', + + /** + * Order Rule: + * + * option.categories / option.pieces / option.text / option.selected: + * If !option.inverse, + * Order when vertical: ['top', ..., 'bottom']. + * Order when horizontal: ['left', ..., 'right']. + * If option.inverse, the meaning of + * the order should be reversed. + * + * this._pieceList: + * The order is always [low, ..., high]. + * + * Mapping from location to low-high: + * If !option.inverse + * When vertical, top is high. + * When horizontal, right is high. + * If option.inverse, reverse. + */ + + /** + * @protected + */ + defaultOption: { + selected: null, // Object. If not specified, means selected. + // When pieces and splitNumber: {'0': true, '5': true} + // When categories: {'cate1': false, 'cate3': true} + // When selected === false, means all unselected. + align: 'auto', // 'auto', 'left', 'right' + itemWidth: 20, // 值域图形宽度 + itemHeight: 14, // 值域图形高度 + itemSymbol: 'roundRect', + pieceList: null, // 值顺序:由高到低, item can be: + // {min, max, value, color, colorSaturation, colorAlpha, symbol, symbolSize} + categories: null, // 描述 category 数据。如:['some1', 'some2', 'some3'],设置后,min max失效。 + splitNumber: 5, // 分割段数,默认为5,为0时为线性渐变 (continous) + selectedMode: 'multiple', + itemGap: 10 // 各个item之间的间隔,单位px,默认为10, + // 横向布局时为水平间隔,纵向布局时为纵向间隔 + }, + + /** + * @override + */ + doMergeOption: function (newOption, isInit) { + PiecewiseModel.superApply(this, 'doMergeOption', arguments); + + /** + * The order is always [low, ..., high]. + * [{text: string, interval: Array.}, ...] + * @private + * @type {Array.} + */ + this._pieceList = []; + + this.resetTargetSeries(newOption, isInit); + this.resetExtent(); + + /** + * 'pieces', 'categories', 'splitNumber' + * @type {string} + */ + var mode = this._mode = this._decideMode(); + + resetMethods[this._mode].call(this); + + this._resetSelected(newOption, isInit); + + var categories = this.option.categories; + this.resetVisual(function (mappingOption, state) { + if (mode === 'categories') { + mappingOption.mappingMethod = 'category'; + mappingOption.categories = zrUtil.clone(categories); + } + else { + mappingOption.mappingMethod = 'piecewise'; + mappingOption.pieceList = zrUtil.map(this._pieceList, function (piece) { + var piece = zrUtil.clone(piece); + if (state !== 'inRange') { + piece.visual = null; + } + return piece; + }); + } + }); + }, + + _resetSelected: function (newOption, isInit) { + var thisOption = this.option; + var pieceList = this._pieceList; + + // Selected do not merge but all override. + var selected = (isInit ? thisOption : newOption).selected || {}; + thisOption.selected = selected; + + // Consider 'not specified' means true. + zrUtil.each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + if (!(key in selected)) { + selected[key] = true; + } + }, this); + + if (thisOption.selectedMode === 'single') { + // Ensure there is only one selected. + var hasSel = false; + + zrUtil.each(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + if (selected[key]) { + hasSel + ? (selected[key] = false) + : (hasSel = true); + } + }, this); + } + // thisOption.selectedMode === 'multiple', default: all selected. + }, + + /** + * @public + */ + getSelectedMapKey: function (piece) { + return this._mode === 'categories' + ? piece.value + '' : piece.index + ''; + }, + + /** + * @public + */ + getPieceList: function () { + return this._pieceList; + }, + + /** + * @private + * @return {string} + */ + _decideMode: function () { + var option = this.option; + + return option.pieces && option.pieces.length > 0 + ? 'pieces' + : this.option.categories + ? 'categories' + : 'splitNumber'; + }, + + /** + * @public + * @override + */ + setSelected: function (selected) { + this.option.selected = zrUtil.clone(selected); + }, + + /** + * @public + * @override + */ + getValueState: function (value) { + var pieceList = this._pieceList; + var index = VisualMapping.findPieceIndex(value, pieceList); + + return index != null + ? (this.option.selected[this.getSelectedMapKey(pieceList[index])] + ? 'inRange' : 'outOfRange' + ) + : 'outOfRange'; + } + + }); + + /** + * Key is this._mode + * @type {Object} + * @this {module:echarts/component/viusalMap/PiecewiseMode} + */ + var resetMethods = { + + splitNumber: function () { + var thisOption = this.option; + var precision = thisOption.precision; + var dataExtent = this.getExtent(); + var splitNumber = thisOption.splitNumber; + splitNumber = Math.max(parseInt(splitNumber, 10), 1); + thisOption.splitNumber = splitNumber; + + var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber; + // Precision auto-adaption + while (+splitStep.toFixed(precision) !== splitStep && precision < 5) { + precision++; + } + thisOption.precision = precision; + splitStep = +splitStep.toFixed(precision); + + for (var i = 0, curr = dataExtent[0]; i < splitNumber; i++, curr += splitStep) { + var max = i === splitNumber - 1 ? dataExtent[1] : (curr + splitStep); + + this._pieceList.push({ + text: this.formatValueText([curr, max]), + index: i, + interval: [curr, max] + }); + } + }, + + categories: function () { + var thisOption = this.option; + zrUtil.each(thisOption.categories, function (cate) { + // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。 + // 是否改一致。 + this._pieceList.push({ + text: this.formatValueText(cate, true), + value: cate + }); + }, this); + + // See "Order Rule". + normalizeReverse(thisOption, this._pieceList); + }, + + pieces: function () { + var thisOption = this.option; + zrUtil.each(thisOption.pieces, function (pieceListItem, index) { + + if (!zrUtil.isObject(pieceListItem)) { + pieceListItem = {value: pieceListItem}; + } + + var item = {text: '', index: index}; + var hasLabel; + + if (pieceListItem.label != null) { + item.text = pieceListItem.label; + hasLabel = true; + } + + if (pieceListItem.hasOwnProperty('value')) { + item.value = pieceListItem.value; + + if (!hasLabel) { + item.text = this.formatValueText(item.value); + } + } + else { + var min = pieceListItem.min; + var max = pieceListItem.max; + min == null && (min = -Infinity); + max == null && (max = Infinity); + if (min === max) { + // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}], + // we use value to lift the priority when min === max + item.value = min; + } + item.interval = [min, max]; + + if (!hasLabel) { + item.text = this.formatValueText([min, max]); + } + } + + item.visual = VisualMapping.retrieveVisuals(pieceListItem); + + this._pieceList.push(item); + + }, this); + + // See "Order Rule". + normalizeReverse(thisOption, this._pieceList); + } + }; + + function normalizeReverse(thisOption, arr) { + var inverse = thisOption.inverse; + if (thisOption.orient === 'vertical' ? !inverse : inverse) { + arr.reverse(); + } + } + + module.exports = PiecewiseModel; + + + +/***/ }, +/* 314 */ +/***/ function(module, exports, __webpack_require__) { + + + + var VisualMapView = __webpack_require__(309); + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var symbolCreators = __webpack_require__(100); + var layout = __webpack_require__(21); + var helper = __webpack_require__(310); + + var PiecewiseVisualMapView = VisualMapView.extend({ + + type: 'visualMap.piecewise', + + /** + * @protected + * @override + */ + doRender: function () { + var thisGroup = this.group; + + thisGroup.removeAll(); + + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var textStyleModel = visualMapModel.textStyleModel; + var textFont = textStyleModel.getFont(); + var textFill = textStyleModel.getTextColor(); + var itemAlign = this._getItemAlign(); + var itemSize = visualMapModel.itemSize; + + var viewData = this._getViewData(); + var showLabel = !viewData.endsText; + var showEndsText = !showLabel; + + showEndsText && this._renderEndsText(thisGroup, viewData.endsText[0], itemSize); + + zrUtil.each(viewData.pieceList, renderItem, this); + + showEndsText && this._renderEndsText(thisGroup, viewData.endsText[1], itemSize); + + layout.box( + visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap') + ); + + this.renderBackground(thisGroup); + + this.positionGroup(thisGroup); + + function renderItem(item) { + var itemGroup = new graphic.Group(); + itemGroup.onclick = zrUtil.bind(this._onItemClick, this, item.piece); + + this._createItemSymbol(itemGroup, item.piece, [0, 0, itemSize[0], itemSize[1]]); + + if (showLabel) { + itemGroup.add(new graphic.Text({ + style: { + x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap, + y: itemSize[1] / 2, + text: item.piece.text, + textVerticalAlign: 'middle', + textAlign: itemAlign, + textFont: textFont, + fill: textFill + } + })); + } + + thisGroup.add(itemGroup); + } + }, + + /** + * @private + */ + _getItemAlign: function () { + var visualMapModel = this.visualMapModel; + var modelOption = visualMapModel.option; + if (modelOption.orient === 'vertical') { + return helper.getItemAlign( + visualMapModel, this.api, visualMapModel.itemSize + ); + } + else { // horizontal, most case left unless specifying right. + var align = modelOption.align; + if (!align || align === 'auto') { + align = 'left'; + } + return align; + } + }, + + /** + * @private + */ + _renderEndsText: function (group, text, itemSize) { + if (!text) { + return; + } + var itemGroup = new graphic.Group(); + var textStyleModel = this.visualMapModel.textStyleModel; + itemGroup.add(new graphic.Text({ + style: { + x: itemSize[0] / 2, + y: itemSize[1] / 2, + textVerticalAlign: 'middle', + textAlign: 'center', + text: text, + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + } + })); + + group.add(itemGroup); + }, + + /** + * @private + * @return {Object} {peiceList, endsText} The order is the same as screen pixel order. + */ + _getViewData: function () { + var visualMapModel = this.visualMapModel; + + var pieceList = zrUtil.map(visualMapModel.getPieceList(), function (piece, index) { + return {piece: piece, index: index}; + }); + var endsText = visualMapModel.get('text'); + + // Consider orient and inverse. + var orient = visualMapModel.get('orient'); + var inverse = visualMapModel.get('inverse'); + + // Order of pieceList is always [low, ..., high] + if (orient === 'horizontal' ? inverse : !inverse) { + pieceList.reverse(); + } + // Origin order of endsText is [high, low] + else if (endsText) { + endsText = endsText.slice().reverse(); + } + + return {pieceList: pieceList, endsText: endsText}; + }, + + /** + * @private + */ + _createItemSymbol: function (group, piece, shapeParam) { + var representValue; + if (this.visualMapModel.isCategory()) { + representValue = piece.value; + } + else { + if (piece.value != null) { + representValue = piece.value; + } + else { + var pieceInterval = piece.interval || []; + representValue = (pieceInterval[0] + pieceInterval[1]) / 2; + } + } + + var visualObj = this.getControllerVisual(representValue); + + group.add(symbolCreators.createSymbol( + visualObj.symbol, + shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3], + visualObj.color + )); + }, + + /** + * @private + */ + _onItemClick: function (piece) { + var visualMapModel = this.visualMapModel; + var option = visualMapModel.option; + var selected = zrUtil.clone(option.selected); + var newKey = visualMapModel.getSelectedMapKey(piece); + + if (option.selectedMode === 'single') { + selected[newKey] = true; + zrUtil.each(selected, function (o, key) { + selected[key] = key === newKey; + }); + } + else { + selected[newKey] = !selected[newKey]; + } + + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: selected + }); + } + }); + + module.exports = PiecewiseVisualMapView; + + + +/***/ }, +/* 315 */ +/***/ function(module, exports, __webpack_require__) { + + // HINT Markpoint can't be used too much + + + __webpack_require__(316); + __webpack_require__(317); + + __webpack_require__(1).registerPreprocessor(function (opt) { + // Make sure markPoint component is enabled + opt.markPoint = opt.markPoint || {}; + }); + + +/***/ }, +/* 316 */ +/***/ function(module, exports, __webpack_require__) { + + + // Default enable markPoint + // var globalDefault = require('../../model/globalDefault'); + var modelUtil = __webpack_require__(5); + // // Force to load markPoint component + // globalDefault.markPoint = {}; + + var MarkPointModel = __webpack_require__(1).extendComponentModel({ + + type: 'markPoint', + + dependencies: ['series', 'grid', 'polar'], + /** + * @overrite + */ + init: function (option, parentModel, ecModel, extraOpt) { + this.mergeDefaultAndTheme(option, ecModel); + this.mergeOption(option, ecModel, extraOpt.createdBySelf, true); + }, + + mergeOption: function (newOpt, ecModel, createdBySelf, isInit) { + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + var markPointOpt = seriesModel.get('markPoint'); + var mpModel = seriesModel.markPointModel; + if (!markPointOpt || !markPointOpt.data) { + seriesModel.markPointModel = null; + return; + } + if (!mpModel) { + if (isInit) { + // Default label emphasis `position` and `show` + modelUtil.defaultEmphasis( + markPointOpt.label, + ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + } + var opt = { + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }; + mpModel = new MarkPointModel( + markPointOpt, this, ecModel, opt + ); + } + else { + mpModel.mergeOption(markPointOpt, ecModel, true); + } + seriesModel.markPointModel = mpModel; + }, this); + } + }, + + defaultOption: { + zlevel: 0, + z: 5, + symbol: 'pin', // 标注类型 + symbolSize: 50, // 标注大小 + // symbolRotate: null, // 标注旋转控制 + tooltip: { + trigger: 'item' + }, + label: { + normal: { + show: true, + // 标签文本格式器,同Tooltip.formatter,不支持回调 + // formatter: null, + // 可选为'left'|'right'|'top'|'bottom' + position: 'inside' + // 默认使用全局文本样式,详见TEXTSTYLE + // textStyle: null + }, + emphasis: { + show: true + // 标签文本格式器,同Tooltip.formatter,不支持回调 + // formatter: null, + // position: 'inside' // 'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + } + }, + itemStyle: { + normal: { + // color: 各异, + // 标注边线颜色,优先于color + // borderColor: 各异, + // 标注边线线宽,单位px,默认为1 + borderWidth: 2 + }, + emphasis: { + // color: 各异 + } + } + } + }); + + module.exports = MarkPointModel; + + +/***/ }, +/* 317 */ +/***/ function(module, exports, __webpack_require__) { + + + + var SymbolDraw = __webpack_require__(98); + var zrUtil = __webpack_require__(3); + var formatUtil = __webpack_require__(6); + var modelUtil = __webpack_require__(5); + var numberUtil = __webpack_require__(7); + + var addCommas = formatUtil.addCommas; + var encodeHTML = formatUtil.encodeHTML; + + var List = __webpack_require__(94); + + var markerHelper = __webpack_require__(318); + + function updateMarkerLayout(mpData, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var point; + var xPx = itemModel.getShallow('x'); + var yPx = itemModel.getShallow('y'); + if (xPx != null && yPx != null) { + point = [ + numberUtil.parsePercent(xPx, api.getWidth()), + numberUtil.parsePercent(yPx, api.getHeight()) + ]; + } + // Chart like bar may have there own marker positioning logic + else if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition( + mpData.getValues(mpData.dimensions, idx) + ); + } + else if (coordSys) { + var x = mpData.get(coordSys.dimensions[0], idx); + var y = mpData.get(coordSys.dimensions[1], idx); + point = coordSys.dataToPoint([x, y]); + } + + mpData.setItemLayout(idx, point); + }); + } + + // FIXME + var markPointFormatMixin = { + getRawDataArray: function () { + return this.option.data; + }, + + formatTooltip: function (dataIndex) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var formattedValue = zrUtil.isArray(value) + ? zrUtil.map(value, addCommas).join(', ') : addCommas(value); + var name = data.getName(dataIndex); + return this.name + '
            ' + + ((name ? encodeHTML(name) + ' : ' : '') + formattedValue); + }, + + getData: function () { + return this._data; + }, + + setData: function (data) { + this._data = data; + } + }; + + zrUtil.defaults(markPointFormatMixin, modelUtil.dataFormatMixin); + + __webpack_require__(1).extendComponentView({ + + type: 'markPoint', + + init: function () { + this._symbolDrawMap = {}; + }, + + render: function (markPointModel, ecModel, api) { + var symbolDrawMap = this._symbolDrawMap; + for (var name in symbolDrawMap) { + symbolDrawMap[name].__keep = false; + } + + ecModel.eachSeries(function (seriesModel) { + var mpModel = seriesModel.markPointModel; + mpModel && this._renderSeriesMP(seriesModel, mpModel, api); + }, this); + + for (var name in symbolDrawMap) { + if (!symbolDrawMap[name].__keep) { + symbolDrawMap[name].remove(); + this.group.remove(symbolDrawMap[name].group); + } + } + }, + + updateLayout: function (markPointModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mpModel = seriesModel.markPointModel; + if (mpModel) { + updateMarkerLayout(mpModel.getData(), seriesModel, api); + this._symbolDrawMap[seriesModel.name].updateLayout(mpModel); + } + }, this); + }, + + _renderSeriesMP: function (seriesModel, mpModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesName = seriesModel.name; + var seriesData = seriesModel.getData(); + + var symbolDrawMap = this._symbolDrawMap; + var symbolDraw = symbolDrawMap[seriesName]; + if (!symbolDraw) { + symbolDraw = symbolDrawMap[seriesName] = new SymbolDraw(); + } + + var mpData = createList(coordSys, seriesModel, mpModel); + + // FIXME + zrUtil.mixin(mpModel, markPointFormatMixin); + mpModel.setData(mpData); + + updateMarkerLayout(mpModel.getData(), seriesModel, api); + + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var symbolSize = itemModel.getShallow('symbolSize'); + if (typeof symbolSize === 'function') { + // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据? + symbolSize = symbolSize( + mpModel.getRawValue(idx), mpModel.getDataParams(idx) + ); + } + mpData.setItemVisual(idx, { + symbolSize: symbolSize, + color: itemModel.get('itemStyle.normal.color') + || seriesData.getVisual('color'), + symbol: itemModel.getShallow('symbol') + }); + }); + + // TODO Text are wrong + symbolDraw.updateData(mpData); + this.group.add(symbolDraw.group); + + // Set host model for tooltip + // FIXME + mpData.eachItemGraphicEl(function (el) { + el.traverse(function (child) { + child.dataModel = mpModel; + }); + }); + + symbolDraw.__keep = true; + } + }); + + /** + * @inner + * @param {module:echarts/coord/*} [coordSys] + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Model} mpModel + */ + function createList(coordSys, seriesModel, mpModel) { + var coordDimsInfos; + if (coordSys) { + coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo( + seriesModel.coordDimToDataDim(coordDim)[0] + ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + info.name = coordDim; + return info; + }); + } + else { + coordDimsInfos =[{ + name: 'value', + type: 'float' + }]; + } + + var mpData = new List(coordDimsInfos, mpModel); + var dataOpt = zrUtil.map(mpModel.get('data'), zrUtil.curry( + markerHelper.dataTransform, seriesModel + )); + if (coordSys) { + dataOpt = zrUtil.filter( + dataOpt, zrUtil.curry(markerHelper.dataFilter, coordSys) + ); + } + + mpData.initData(dataOpt, null, + coordSys ? markerHelper.dimValueGetter : function (item) { + return item.value; + } + ); + return mpData; + } + + + +/***/ }, +/* 318 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var indexOf = zrUtil.indexOf; + + function getPrecision(data, valueAxisDim, dataIndex) { + var precision = -1; + do { + precision = Math.max( + numberUtil.getPrecision(data.get( + valueAxisDim, dataIndex + )), + precision + ); + data = data.stackedOn; + } while (data); + + return precision; + } + + function markerTypeCalculatorWithExtent( + mlType, data, baseDataDim, valueDataDim, baseCoordIndex, valueCoordIndex + ) { + var coordArr = []; + var value = numCalculate(data, valueDataDim, mlType); + + var dataIndex = data.indexOfNearest(valueDataDim, value, true); + coordArr[baseCoordIndex] = data.get(baseDataDim, dataIndex, true); + coordArr[valueCoordIndex] = data.get(valueDataDim, dataIndex, true); + + var precision = getPrecision(data, valueDataDim, dataIndex); + if (precision >= 0) { + coordArr[valueCoordIndex] = +coordArr[valueCoordIndex].toFixed(precision); + } + + return coordArr; + } + + var curry = zrUtil.curry; + // TODO Specified percent + var markerTypeCalculator = { + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + min: curry(markerTypeCalculatorWithExtent, 'min'), + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + max: curry(markerTypeCalculatorWithExtent, 'max'), + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + average: curry(markerTypeCalculatorWithExtent, 'average') + }; + + /** + * Transform markPoint data item to format used in List by do the following + * 1. Calculate statistic like `max`, `min`, `average` + * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/coord/*} [coordSys] + * @param {Object} item + * @return {Object} + */ + var dataTransform = function (seriesModel, item) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + + // 1. If not specify the position with pixel directly + // 2. If `coord` is not a data array. Which uses `xAxis`, + // `yAxis` to specify the coord on each dimension + if ((isNaN(item.x) || isNaN(item.y)) + && !zrUtil.isArray(item.coord) + && coordSys + ) { + var axisInfo = getAxisInfo(item, data, coordSys, seriesModel); + + // Clone the option + // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value + item = zrUtil.clone(item); + + if (item.type + && markerTypeCalculator[item.type] + && axisInfo.baseAxis && axisInfo.valueAxis + ) { + var dims = coordSys.dimensions; + var baseCoordIndex = indexOf(dims, axisInfo.baseAxis.dim); + var valueCoordIndex = indexOf(dims, axisInfo.valueAxis.dim); + + item.coord = markerTypeCalculator[item.type]( + data, axisInfo.baseDataDim, axisInfo.valueDataDim, + baseCoordIndex, valueCoordIndex + ); + // Force to use the value of calculated value. + item.value = item.coord[valueCoordIndex]; + } + else { + // FIXME Only has one of xAxis and yAxis. + item.coord = [ + item.xAxis != null ? item.xAxis : item.radiusAxis, + item.yAxis != null ? item.yAxis : item.angleAxis + ]; + } + } + return item; + }; + + var getAxisInfo = function (item, data, coordSys, seriesModel) { + var ret = {}; + + if (item.valueIndex != null || item.valueDim != null) { + ret.valueDataDim = item.valueIndex != null + ? data.getDimension(item.valueIndex) : item.valueDim; + ret.valueAxis = coordSys.getAxis(seriesModel.dataDimToCoordDim(ret.valueDataDim)); + ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis); + ret.baseDataDim = seriesModel.coordDimToDataDim(ret.baseAxis.dim)[0]; + } + else { + ret.baseAxis = seriesModel.getBaseAxis(); + ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis); + ret.baseDataDim = seriesModel.coordDimToDataDim(ret.baseAxis.dim)[0]; + ret.valueDataDim = seriesModel.coordDimToDataDim(ret.valueAxis.dim)[0]; + } + + return ret; + }; + + /** + * Filter data which is out of coordinateSystem range + * [dataFilter description] + * @param {module:echarts/coord/*} [coordSys] + * @param {Object} item + * @return {boolean} + */ + var dataFilter = function (coordSys, item) { + // Alwalys return true if there is no coordSys + return (coordSys && coordSys.containData && item.coord && (item.x == null || item.y == null)) + ? coordSys.containData(item.coord) : true; + }; + + var dimValueGetter = function (item, dimName, dataIndex, dimIndex) { + // x, y, radius, angle + if (dimIndex < 2) { + return item.coord && item.coord[dimIndex]; + } + else { + return item.value; + } + }; + + var numCalculate = function (data, valueDataDim, mlType) { + return mlType === 'average' + ? data.getSum(valueDataDim, true) / data.count() + : data.getDataExtent(valueDataDim, true)[mlType === 'max' ? 1 : 0]; + }; + + module.exports = { + dataTransform: dataTransform, + dataFilter: dataFilter, + dimValueGetter: dimValueGetter, + getAxisInfo: getAxisInfo, + numCalculate: numCalculate + }; + + +/***/ }, +/* 319 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(320); + __webpack_require__(321); + + __webpack_require__(1).registerPreprocessor(function (opt) { + // Make sure markLine component is enabled + opt.markLine = opt.markLine || {}; + }); + + +/***/ }, +/* 320 */ +/***/ function(module, exports, __webpack_require__) { + + + + // Default enable markLine + // var globalDefault = require('../../model/globalDefault'); + var modelUtil = __webpack_require__(5); + + // // Force to load markLine component + // globalDefault.markLine = {}; + + var MarkLineModel = __webpack_require__(1).extendComponentModel({ + + type: 'markLine', + + dependencies: ['series', 'grid', 'polar'], + /** + * @overrite + */ + init: function (option, parentModel, ecModel, extraOpt) { + this.mergeDefaultAndTheme(option, ecModel); + this.mergeOption(option, ecModel, extraOpt.createdBySelf, true); + }, + + mergeOption: function (newOpt, ecModel, createdBySelf, isInit) { + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + var markLineOpt = seriesModel.get('markLine'); + var mlModel = seriesModel.markLineModel; + if (!markLineOpt || !markLineOpt.data) { + seriesModel.markLineModel = null; + return; + } + if (!mlModel) { + if (isInit) { + // Default label emphasis `position` and `show` + modelUtil.defaultEmphasis( + markLineOpt.label, + ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + } + var opt = { + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }; + mlModel = new MarkLineModel( + markLineOpt, this, ecModel, opt + ); + } + else { + mlModel.mergeOption(markLineOpt, ecModel, true); + } + seriesModel.markLineModel = mlModel; + }, this); + } + }, + + defaultOption: { + zlevel: 0, + z: 5, + // 标线起始和结束的symbol介绍类型,如果都一样,可以直接传string + symbol: ['circle', 'arrow'], + // 标线起始和结束的symbol大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + symbolSize: [8, 16], + // 标线起始和结束的symbol旋转控制 + //symbolRotate: null, + //smooth: false, + precision: 2, + tooltip: { + trigger: 'item' + }, + label: { + normal: { + show: true, + // 标签文本格式器,同Tooltip.formatter,不支持回调 + // formatter: null, + // 可选为 'start'|'end'|'left'|'right'|'top'|'bottom' + position: 'end' + // 默认使用全局文本样式,详见TEXTSTYLE + // textStyle: null + }, + emphasis: { + show: true + } + }, + lineStyle: { + normal: { + // color + // width + type: 'dashed' + // shadowColor: 'rgba(0,0,0,0)', + // shadowBlur: 0, + // shadowOffsetX: 0, + // shadowOffsetY: 0 + }, + emphasis: { + width: 3 + } + }, + animationEasing: 'linear' + } + }); + + module.exports = MarkLineModel; + + +/***/ }, +/* 321 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var List = __webpack_require__(94); + var formatUtil = __webpack_require__(6); + var modelUtil = __webpack_require__(5); + var numberUtil = __webpack_require__(7); + + var addCommas = formatUtil.addCommas; + var encodeHTML = formatUtil.encodeHTML; + + var markerHelper = __webpack_require__(318); + + var LineDraw = __webpack_require__(194); + + var markLineTransform = function (seriesModel, coordSys, mlModel, item) { + var data = seriesModel.getData(); + // Special type markLine like 'min', 'max', 'average' + var mlType = item.type; + + if (!zrUtil.isArray(item) + && (mlType === 'min' || mlType === 'max' || mlType === 'average') + ) { + var axisInfo = markerHelper.getAxisInfo(item, data, coordSys, seriesModel); + + var baseAxisKey = axisInfo.baseAxis.dim + 'Axis'; + var valueAxisKey = axisInfo.valueAxis.dim + 'Axis'; + var baseScaleExtent = axisInfo.baseAxis.scale.getExtent(); + + var mlFrom = zrUtil.clone(item); + var mlTo = {}; + + mlFrom.type = null; + + // FIXME Polar should use circle + mlFrom[baseAxisKey] = baseScaleExtent[0]; + mlTo[baseAxisKey] = baseScaleExtent[1]; + + var value = markerHelper.numCalculate(data, axisInfo.valueDataDim, mlType); + + // Round if axis is cateogry + value = axisInfo.valueAxis.coordToData(axisInfo.valueAxis.dataToCoord(value)); + + var precision = mlModel.get('precision'); + if (precision >= 0) { + value = +value.toFixed(precision); + } + + mlFrom[valueAxisKey] = mlTo[valueAxisKey] = value; + + item = [mlFrom, mlTo, { // Extra option for tooltip and label + type: mlType, + valueIndex: item.valueIndex, + // Force to use the value of calculated value. + value: value + }]; + } + + item = [ + markerHelper.dataTransform(seriesModel, item[0]), + markerHelper.dataTransform(seriesModel, item[1]), + zrUtil.extend({}, item[2]) + ]; + + // Avoid line data type is extended by from(to) data type + item[2].type = item[2].type || ''; + + // Merge from option and to option into line option + zrUtil.merge(item[2], item[0]); + zrUtil.merge(item[2], item[1]); + + return item; + }; + + function markLineFilter(coordSys, item) { + return markerHelper.dataFilter(coordSys, item[0]) + && markerHelper.dataFilter(coordSys, item[1]); + } + + function updateSingleMarkerEndLayout( + data, idx, isFrom, mlType, valueIndex, seriesModel, api + ) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + + var point; + var xPx = itemModel.get('x'); + var yPx = itemModel.get('y'); + if (xPx != null && yPx != null) { + point = [ + numberUtil.parsePercent(xPx, api.getWidth()), + numberUtil.parsePercent(yPx, api.getHeight()) + ]; + } + else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition( + data.getValues(data.dimensions, idx) + ); + } + else { + var dims = coordSys.dimensions; + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + point = coordSys.dataToPoint([x, y]); + } + // Expand min, max, average line to the edge of grid + // FIXME Glue code + if (mlType && coordSys.type === 'cartesian2d') { + var mlOnAxis = valueIndex != null + ? coordSys.getAxis(valueIndex === 1 ? 'x' : 'y') + : coordSys.getAxesByScale('ordinal')[0]; + if (mlOnAxis && mlOnAxis.onBand) { + point[mlOnAxis.dim === 'x' ? 0 : 1] = + mlOnAxis.toGlobalCoord(mlOnAxis.getExtent()[isFrom ? 0 : 1]); + } + } + } + + data.setItemLayout(idx, point); + } + + var markLineFormatMixin = { + formatTooltip: function (dataIndex) { + var data = this._data; + var value = this.getRawValue(dataIndex); + var formattedValue = zrUtil.isArray(value) + ? zrUtil.map(value, addCommas).join(', ') : addCommas(value); + var name = data.getName(dataIndex); + return this.name + '
            ' + + ((name ? encodeHTML(name) + ' : ' : '') + formattedValue); + }, + + getRawDataArray: function () { + return this.option.data; + }, + + getData: function () { + return this._data; + }, + + setData: function (data) { + this._data = data; + } + }; + + zrUtil.defaults(markLineFormatMixin, modelUtil.dataFormatMixin); + + __webpack_require__(1).extendComponentView({ + + type: 'markLine', + + init: function () { + /** + * Markline grouped by series + * @private + * @type {Object} + */ + this._markLineMap = {}; + }, + + render: function (markLineModel, ecModel, api) { + var lineDrawMap = this._markLineMap; + for (var name in lineDrawMap) { + lineDrawMap[name].__keep = false; + } + + ecModel.eachSeries(function (seriesModel) { + var mlModel = seriesModel.markLineModel; + mlModel && this._renderSeriesML(seriesModel, mlModel, ecModel, api); + }, this); + + for (var name in lineDrawMap) { + if (!lineDrawMap[name].__keep) { + this.group.remove(lineDrawMap[name].group); + } + } + }, + + updateLayout: function (markLineModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mlModel = seriesModel.markLineModel; + if (mlModel) { + var mlData = mlModel.getData(); + var fromData = mlModel.__from; + var toData = mlModel.__to; + // Update visual and layout of from symbol and to symbol + fromData.each(function (idx) { + var lineModel = mlData.getItemModel(idx); + var mlType = lineModel.get('type'); + var valueIndex = lineModel.get('valueIndex'); + updateSingleMarkerEndLayout(fromData, idx, true, mlType, valueIndex, seriesModel, api); + updateSingleMarkerEndLayout(toData, idx, false, mlType, valueIndex, seriesModel, api); + }); + // Update layout of line + mlData.each(function (idx) { + mlData.setItemLayout(idx, [ + fromData.getItemLayout(idx), + toData.getItemLayout(idx) + ]); + }); + + this._markLineMap[seriesModel.name].updateLayout(); + } + }, this); + }, + + _renderSeriesML: function (seriesModel, mlModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesName = seriesModel.name; + var seriesData = seriesModel.getData(); + + var lineDrawMap = this._markLineMap; + var lineDraw = lineDrawMap[seriesName]; + if (!lineDraw) { + lineDraw = lineDrawMap[seriesName] = new LineDraw(); + } + this.group.add(lineDraw.group); + + var mlData = createList(coordSys, seriesModel, mlModel); + + var fromData = mlData.from; + var toData = mlData.to; + var lineData = mlData.line; + + mlModel.__from = fromData; + mlModel.__to = toData; + // Line data for tooltip and formatter + zrUtil.extend(mlModel, markLineFormatMixin); + mlModel.setData(lineData); + + var symbolType = mlModel.get('symbol'); + var symbolSize = mlModel.get('symbolSize'); + if (!zrUtil.isArray(symbolType)) { + symbolType = [symbolType, symbolType]; + } + if (typeof symbolSize === 'number') { + symbolSize = [symbolSize, symbolSize]; + } + + // Update visual and layout of from symbol and to symbol + mlData.from.each(function (idx) { + var lineModel = lineData.getItemModel(idx); + var mlType = lineModel.get('type'); + var valueIndex = lineModel.get('valueIndex'); + updateDataVisualAndLayout(fromData, idx, true, mlType, valueIndex); + updateDataVisualAndLayout(toData, idx, false, mlType, valueIndex); + }); + + // Update visual and layout of line + lineData.each(function (idx) { + var lineColor = lineData.getItemModel(idx).get('lineStyle.normal.color'); + lineData.setItemVisual(idx, { + color: lineColor || fromData.getItemVisual(idx, 'color') + }); + lineData.setItemLayout(idx, [ + fromData.getItemLayout(idx), + toData.getItemLayout(idx) + ]); + }); + + lineDraw.updateData(lineData, fromData, toData); + + // Set host model for tooltip + // FIXME + mlData.line.eachItemGraphicEl(function (el, idx) { + el.traverse(function (child) { + child.dataModel = mlModel; + }); + }); + + function updateDataVisualAndLayout(data, idx, isFrom, mlType, valueIndex) { + var itemModel = data.getItemModel(idx); + + updateSingleMarkerEndLayout( + data, idx, isFrom, mlType, valueIndex, seriesModel, api + ); + + data.setItemVisual(idx, { + symbolSize: itemModel.get('symbolSize') + || symbolSize[isFrom ? 0 : 1], + symbol: itemModel.get('symbol', true) + || symbolType[isFrom ? 0 : 1], + color: itemModel.get('itemStyle.normal.color') + || seriesData.getVisual('color') + }); + } + + lineDraw.__keep = true; + } + }); + + /** + * @inner + * @param {module:echarts/coord/*} coordSys + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Model} mpModel + */ + function createList(coordSys, seriesModel, mlModel) { + + var coordDimsInfos; + if (coordSys) { + coordDimsInfos = zrUtil.map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo( + seriesModel.coordDimToDataDim(coordDim)[0] + ) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys + info.name = coordDim; + return info; + }); + } + else { + coordDimsInfos =[{ + name: 'value', + type: 'float' + }]; + } + + var fromData = new List(coordDimsInfos, mlModel); + var toData = new List(coordDimsInfos, mlModel); + // No dimensions + var lineData = new List([], mlModel); + + var optData = zrUtil.map(mlModel.get('data'), zrUtil.curry( + markLineTransform, seriesModel, coordSys, mlModel + )); + if (coordSys) { + optData = zrUtil.filter( + optData, zrUtil.curry(markLineFilter, coordSys) + ); + } + var dimValueGetter = coordSys ? markerHelper.dimValueGetter : function (item) { + return item.value; + }; + fromData.initData( + zrUtil.map(optData, function (item) { return item[0]; }), + null, dimValueGetter + ); + toData.initData( + zrUtil.map(optData, function (item) { return item[1]; }), + null, dimValueGetter + ); + lineData.initData( + zrUtil.map(optData, function (item) { return item[2]; }) + ); + return { + from: fromData, + to: toData, + line: lineData + }; + } + + +/***/ }, +/* 322 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * DataZoom component entry + */ + + + var echarts = __webpack_require__(1); + + echarts.registerPreprocessor(__webpack_require__(323)); + + __webpack_require__(324); + __webpack_require__(325); + __webpack_require__(326); + __webpack_require__(328); + + + +/***/ }, +/* 323 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Timeline preprocessor + */ + + + var zrUtil = __webpack_require__(3); + + module.exports = function (option) { + var timelineOpt = option && option.timeline; + + if (!zrUtil.isArray(timelineOpt)) { + timelineOpt = timelineOpt ? [timelineOpt] : []; + } + + zrUtil.each(timelineOpt, function (opt) { + if (!opt) { + return; + } + + compatibleEC2(opt); + }); + }; + + function compatibleEC2(opt) { + var type = opt.type; + + var ec2Types = {'number': 'value', 'time': 'time'}; + + // Compatible with ec2 + if (ec2Types[type]) { + opt.axisType = ec2Types[type]; + delete opt.type; + } + + transferItem(opt); + + if (has(opt, 'controlPosition')) { + var controlStyle = opt.controlStyle || (opt.controlStyle = {}); + if (!has(controlStyle, 'position')) { + controlStyle.position = opt.controlPosition; + } + if (controlStyle.position === 'none' && !has(controlStyle, 'show')) { + controlStyle.show = false; + delete controlStyle.position; + } + delete opt.controlPosition; + } + + zrUtil.each(opt.data || [], function (dataItem) { + if (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem)) { + if (!has(dataItem, 'value') && has(dataItem, 'name')) { + // In ec2, using name as value. + dataItem.value = dataItem.name; + } + transferItem(dataItem); + } + }); + } + + function transferItem(opt) { + var itemStyle = opt.itemStyle || (opt.itemStyle = {}); + + var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {}); + + // Transfer label out + var label = opt.label || (opt.label || {}); + var labelNormal = label.normal || (label.normal = {}); + var excludeLabelAttr = {normal: 1, emphasis: 1}; + + zrUtil.each(label, function (value, name) { + if (!excludeLabelAttr[name] && !has(labelNormal, name)) { + labelNormal[name] = value; + } + }); + + if (itemStyleEmphasis.label && !has(label, 'emphasis')) { + label.emphasis = itemStyleEmphasis.label; + delete itemStyleEmphasis.label; + } + } + + function has(obj, attr) { + return obj.hasOwnProperty(attr); + } + + + +/***/ }, +/* 324 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(19).registerSubTypeDefaulter('timeline', function () { + // Only slider now. + return 'slider'; + }); + + + +/***/ }, +/* 325 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Timeilne action + */ + + + var echarts = __webpack_require__(1); + + echarts.registerAction( + + {type: 'timelineChange', event: 'timelineChanged', update: 'prepareAndUpdate'}, + + function (payload, ecModel) { + + var timelineModel = ecModel.getComponent('timeline'); + if (timelineModel && payload.currentIndex != null) { + timelineModel.setCurrentIndex(payload.currentIndex); + + if (!timelineModel.get('loop', true) && timelineModel.isIndexMax()) { + timelineModel.setPlayState(false); + } + } + + ecModel.resetOption('timeline'); + } + ); + + echarts.registerAction( + + {type: 'timelinePlayChange', event: 'timelinePlayChanged', update: 'update'}, + + function (payload, ecModel) { + var timelineModel = ecModel.getComponent('timeline'); + if (timelineModel && payload.playState != null) { + timelineModel.setPlayState(payload.playState); + } + } + ); + + + +/***/ }, +/* 326 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Silder timeline model + */ + + + var TimelineModel = __webpack_require__(327); + + module.exports = TimelineModel.extend({ + + type: 'timeline.slider', + + /** + * @protected + */ + defaultOption: { + + backgroundColor: 'rgba(0,0,0,0)', // 时间轴背景颜色 + borderColor: '#ccc', // 时间轴边框颜色 + borderWidth: 0, // 时间轴边框线宽,单位px,默认为0(无边框) + + orient: 'horizontal', // 'vertical' + inverse: false, + + tooltip: { // boolean or Object + trigger: 'item' // data item may also have tootip attr. + }, + + symbol: 'emptyCircle', + symbolSize: 10, + + lineStyle: { + show: true, + width: 2, + color: '#304654' + }, + label: { // 文本标签 + position: 'auto', // auto left right top bottom + // When using number, label position is not + // restricted by viewRect. + // positive: right/bottom, negative: left/top + normal: { + show: true, + interval: 'auto', + rotate: 0, + // formatter: null, + textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#304654' + } + }, + emphasis: { + show: true, + textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#c23531' + } + } + }, + itemStyle: { + normal: { + color: '#304654', + borderWidth: 1 + }, + emphasis: { + color: '#c23531' + } + }, + + checkpointStyle: { + symbol: 'circle', + symbolSize: 13, + color: '#c23531', + borderWidth: 5, + borderColor: 'rgba(194,53,49, 0.5)', + animation: true, + animationDuration: 300, + animationEasing: 'quinticInOut' + }, + + controlStyle: { + show: true, + showPlayBtn: true, + showPrevBtn: true, + showNextBtn: true, + itemSize: 22, + itemGap: 12, + position: 'left', // 'left' 'right' 'top' 'bottom' + playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z', // jshint ignore:line + stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z', // jshint ignore:line + nextIcon: 'path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z', // jshint ignore:line + prevIcon: 'path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z', // jshint ignore:line + normal: { + color: '#304654', + borderColor: '#304654', + borderWidth: 1 + }, + emphasis: { + color: '#c23531', + borderColor: '#c23531', + borderWidth: 2 + } + }, + data: [] + } + + }); + + + +/***/ }, +/* 327 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Timeline model + */ + + + var ComponentModel = __webpack_require__(19); + var List = __webpack_require__(94); + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + + var TimelineModel = ComponentModel.extend({ + + type: 'timeline', + + layoutMode: 'box', + + /** + * @protected + */ + defaultOption: { + + zlevel: 0, // 一级层叠 + z: 4, // 二级层叠 + show: true, + + axisType: 'time', // 模式是时间类型,支持 value, category + + realtime: true, + + left: '20%', + top: null, + right: '20%', + bottom: 0, + width: null, + height: 40, + padding: 5, + + controlPosition: 'left', // 'left' 'right' 'top' 'bottom' 'none' + autoPlay: false, + rewind: false, // 反向播放 + loop: true, + playInterval: 2000, // 播放时间间隔,单位ms + + currentIndex: 0, + + itemStyle: { + normal: {}, + emphasis: {} + }, + label: { + normal: { + textStyle: { + color: '#000' + } + }, + emphasis: {} + }, + + data: [] + }, + + /** + * @override + */ + init: function (option, parentModel, ecModel) { + + /** + * @private + * @type {module:echarts/data/List} + */ + this._data; + + /** + * @private + * @type {Array.} + */ + this._names; + + this.mergeDefaultAndTheme(option, ecModel); + this._initData(); + }, + + /** + * @override + */ + mergeOption: function (option) { + TimelineModel.superApply(this, 'mergeOption', arguments); + this._initData(); + }, + + /** + * @param {number} [currentIndex] + */ + setCurrentIndex: function (currentIndex) { + if (currentIndex == null) { + currentIndex = this.option.currentIndex; + } + var count = this._data.count(); + + if (this.option.loop) { + currentIndex = (currentIndex % count + count) % count; + } + else { + currentIndex >= count && (currentIndex = count - 1); + currentIndex < 0 && (currentIndex = 0); + } + + this.option.currentIndex = currentIndex; + }, + + /** + * @return {number} currentIndex + */ + getCurrentIndex: function () { + return this.option.currentIndex; + }, + + /** + * @return {boolean} + */ + isIndexMax: function () { + return this.getCurrentIndex() >= this._data.count() - 1; + }, + + /** + * @param {boolean} state true: play, false: stop + */ + setPlayState: function (state) { + this.option.autoPlay = !!state; + }, + + /** + * @return {boolean} true: play, false: stop + */ + getPlayState: function () { + return !!this.option.autoPlay; + }, + + /** + * @private + */ + _initData: function () { + var thisOption = this.option; + var dataArr = thisOption.data || []; + var axisType = thisOption.axisType; + var names = this._names = []; + + if (axisType === 'category') { + var idxArr = []; + zrUtil.each(dataArr, function (item, index) { + var value = modelUtil.getDataItemValue(item); + var newItem; + + if (zrUtil.isObject(item)) { + newItem = zrUtil.clone(item); + newItem.value = index; + } + else { + newItem = index; + } + + idxArr.push(newItem); + + if (!zrUtil.isString(value) && (value == null || isNaN(value))) { + value = ''; + } + + names.push(value + ''); + }); + dataArr = idxArr; + } + + var dimType = ({category: 'ordinal', time: 'time'})[axisType] || 'number'; + + var data = this._data = new List([{name: 'value', type: dimType}], this); + + data.initData(dataArr, names); + }, + + getData: function () { + return this._data; + }, + + /** + * @public + * @return {Array.} categoreis + */ + getCategories: function () { + if (this.get('axisType') === 'category') { + return this._names.slice(); + } + } + + }); + + module.exports = TimelineModel; + + +/***/ }, +/* 328 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Silder timeline view + */ + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var layout = __webpack_require__(21); + var TimelineView = __webpack_require__(329); + var TimelineAxis = __webpack_require__(330); + var symbolUtil = __webpack_require__(100); + var axisHelper = __webpack_require__(108); + var BoundingRect = __webpack_require__(15); + var matrix = __webpack_require__(17); + var numberUtil = __webpack_require__(7); + var modelUtil = __webpack_require__(5); + var formatUtil = __webpack_require__(6); + var encodeHTML = formatUtil.encodeHTML; + + var bind = zrUtil.bind; + var each = zrUtil.each; + + var PI = Math.PI; + + module.exports = TimelineView.extend({ + + type: 'timeline.slider', + + init: function (ecModel, api) { + + this.api = api; + + /** + * @private + * @type {module:echarts/component/timeline/TimelineAxis} + */ + this._axis; + + /** + * @private + * @type {module:zrender/core/BoundingRect} + */ + this._viewRect; + + /** + * @type {number} + */ + this._timer; + + /** + * @type {module:zrende/Element} + */ + this._currentPointer; + + /** + * @type {module:zrender/container/Group} + */ + this._mainGroup; + + /** + * @type {module:zrender/container/Group} + */ + this._labelGroup; + }, + + /** + * @override + */ + render: function (timelineModel, ecModel, api, payload) { + this.model = timelineModel; + this.api = api; + this.ecModel = ecModel; + + this.group.removeAll(); + + if (timelineModel.get('show', true)) { + + var layoutInfo = this._layout(timelineModel, api); + var mainGroup = this._createGroup('mainGroup'); + var labelGroup = this._createGroup('labelGroup'); + + /** + * @private + * @type {module:echarts/component/timeline/TimelineAxis} + */ + var axis = this._axis = this._createAxis(layoutInfo, timelineModel); + + each( + ['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], + function (name) { + this['_render' + name](layoutInfo, mainGroup, axis, timelineModel); + }, + this + ); + + this._renderAxisLabel(layoutInfo, labelGroup, axis, timelineModel); + + this._position(layoutInfo, timelineModel); + } + + this._doPlayStop(); + }, + + /** + * @override + */ + remove: function () { + this._clearTimer(); + this.group.removeAll(); + }, + + /** + * @override + */ + dispose: function () { + this._clearTimer(); + }, + + _layout: function (timelineModel, api) { + var labelPosOpt = timelineModel.get('label.normal.position'); + var orient = timelineModel.get('orient'); + var viewRect = getViewRect(timelineModel, api); + // Auto label offset. + if (labelPosOpt == null || labelPosOpt === 'auto') { + labelPosOpt = orient === 'horizontal' + ? ((viewRect.y + viewRect.height / 2) < api.getHeight() / 2 ? '-' : '+') + : ((viewRect.x + viewRect.width / 2) < api.getWidth() / 2 ? '+' : '-'); + } + else if (isNaN(labelPosOpt)) { + labelPosOpt = ({ + horizontal: {top: '-', bottom: '+'}, + vertical: {left: '-', right: '+'} + })[orient][labelPosOpt]; + } + + // FIXME + // 暂没有实现用户传入 + // var labelAlign = timelineModel.get('label.normal.textStyle.align'); + // var labelBaseline = timelineModel.get('label.normal.textStyle.baseline'); + var labelAlignMap = { + horizontal: 'center', + vertical: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'left' : 'right' + }; + + var labelBaselineMap = { + horizontal: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'top' : 'bottom', + vertical: 'middle' + }; + var rotationMap = { + horizontal: 0, + vertical: PI / 2 + }; + + // Position + var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width; + + var controlModel = timelineModel.getModel('controlStyle'); + var showControl = controlModel.get('show'); + var controlSize = showControl ? controlModel.get('itemSize') : 0; + var controlGap = showControl ? controlModel.get('itemGap') : 0; + var sizePlusGap = controlSize + controlGap; + + // Special label rotate. + var labelRotation = timelineModel.get('label.normal.rotate') || 0; + labelRotation = labelRotation * PI / 180; // To radian. + + var playPosition; + var prevBtnPosition; + var nextBtnPosition; + var axisExtent; + var controlPosition = controlModel.get('position', true); + var showControl = controlModel.get('show', true); + var showPlayBtn = showControl && controlModel.get('showPlayBtn', true); + var showPrevBtn = showControl && controlModel.get('showPrevBtn', true); + var showNextBtn = showControl && controlModel.get('showNextBtn', true); + var xLeft = 0; + var xRight = mainLength; + + // position[0] means left, position[1] means middle. + if (controlPosition === 'left' || controlPosition === 'bottom') { + showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap); + showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } + else { // 'top' 'right' + showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } + axisExtent = [xLeft, xRight]; + + if (timelineModel.get('inverse')) { + axisExtent.reverse(); + } + + return { + viewRect: viewRect, + mainLength: mainLength, + orient: orient, + + rotation: rotationMap[orient], + labelRotation: labelRotation, + labelPosOpt: labelPosOpt, + labelAlign: labelAlignMap[orient], + labelBaseline: labelBaselineMap[orient], + + // Based on mainGroup. + playPosition: playPosition, + prevBtnPosition: prevBtnPosition, + nextBtnPosition: nextBtnPosition, + axisExtent: axisExtent, + + controlSize: controlSize, + controlGap: controlGap + }; + }, + + _position: function (layoutInfo, timelineModel) { + // Position is be called finally, because bounding rect is needed for + // adapt content to fill viewRect (auto adapt offset). + + // Timeline may be not all in the viewRect when 'offset' is specified + // as a number, because it is more appropriate that label aligns at + // 'offset' but not the other edge defined by viewRect. + + var mainGroup = this._mainGroup; + var labelGroup = this._labelGroup; + + var viewRect = layoutInfo.viewRect; + if (layoutInfo.orient === 'vertical') { + // transfrom to horizontal, inverse rotate by left-top point. + var m = matrix.create(); + var rotateOriginX = viewRect.x; + var rotateOriginY = viewRect.y + viewRect.height; + matrix.translate(m, m, [-rotateOriginX, -rotateOriginY]); + matrix.rotate(m, m, -PI / 2); + matrix.translate(m, m, [rotateOriginX, rotateOriginY]); + viewRect = viewRect.clone(); + viewRect.applyTransform(m); + } + + var viewBound = getBound(viewRect); + var mainBound = getBound(mainGroup.getBoundingRect()); + var labelBound = getBound(labelGroup.getBoundingRect()); + + var mainPosition = mainGroup.position; + var labelsPosition = labelGroup.position; + + labelsPosition[0] = mainPosition[0] = viewBound[0][0]; + + var labelPosOpt = layoutInfo.labelPosOpt; + + if (isNaN(labelPosOpt)) { // '+' or '-' + var mainBoundIdx = labelPosOpt === '+' ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx); + } + else { + var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + labelsPosition[1] = mainPosition[1] + labelPosOpt; + } + + mainGroup.position = mainPosition; + labelGroup.position = labelsPosition; + mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation; + + setOrigin(mainGroup); + setOrigin(labelGroup); + + function setOrigin(targetGroup) { + var pos = targetGroup.position; + targetGroup.origin = [ + viewBound[0][0] - pos[0], + viewBound[1][0] - pos[1] + ]; + } + + function getBound(rect) { + // [[xmin, xmax], [ymin, ymax]] + return [ + [rect.x, rect.x + rect.width], + [rect.y, rect.y + rect.height] + ]; + } + + function toBound(fromPos, from, to, dimIdx, boundIdx) { + fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx]; + } + }, + + _createAxis: function (layoutInfo, timelineModel) { + var data = timelineModel.getData(); + var axisType = timelineModel.get('axisType'); + + var scale = axisHelper.createScaleByModel(timelineModel, axisType); + var dataExtent = data.getDataExtent('value'); + scale.setExtent(dataExtent[0], dataExtent[1]); + this._customizeScale(scale, data); + scale.niceTicks(); + + var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType); + axis.model = timelineModel; + + return axis; + }, + + _customizeScale: function (scale, data) { + + scale.getTicks = function () { + return data.mapArray(['value'], function (value) { + return value; + }); + }; + + scale.getTicksLabels = function () { + return zrUtil.map(this.getTicks(), scale.getLabel, scale); + }; + }, + + _createGroup: function (name) { + var newGroup = this['_' + name] = new graphic.Group(); + this.group.add(newGroup); + return newGroup; + }, + + _renderAxisLine: function (layoutInfo, group, axis, timelineModel) { + var axisExtent = axis.getExtent(); + + if (!timelineModel.get('lineStyle.show')) { + return; + } + + group.add(new graphic.Line({ + shape: { + x1: axisExtent[0], y1: 0, + x2: axisExtent[1], y2: 0 + }, + style: zrUtil.extend( + {lineCap: 'round'}, + timelineModel.getModel('lineStyle').getLineStyle() + ), + silent: true, + z2: 1 + })); + }, + + /** + * @private + */ + _renderAxisTick: function (layoutInfo, group, axis, timelineModel) { + var data = timelineModel.getData(); + var ticks = axis.scale.getTicks(); + var tooltipHostModel = this._prepareTooltipHostModel(data, timelineModel); + + each(ticks, function (value, dataIndex) { + + var tickCoord = axis.dataToCoord(value); + var itemModel = data.getItemModel(dataIndex); + var itemStyleModel = itemModel.getModel('itemStyle.normal'); + var hoverStyleModel = itemModel.getModel('itemStyle.emphasis'); + var symbolOpt = { + position: [tickCoord, 0], + onclick: bind(this._changeTimeline, this, dataIndex) + }; + var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt); + graphic.setHoverStyle(el, hoverStyleModel.getItemStyle()); + + if (itemModel.get('tooltip')) { + el.dataIndex = dataIndex; + el.dataModel = tooltipHostModel; + } + else { + el.dataIndex = el.dataModel = null; + } + + }, this); + }, + + /** + * @private + */ + _prepareTooltipHostModel: function (data, timelineModel) { + var tooltipHostModel = modelUtil.createDataFormatModel( + {}, data, timelineModel.get('data') + ); + var me = this; + + tooltipHostModel.formatTooltip = function (dataIndex) { + return encodeHTML(me._axis.scale.getLabel(dataIndex)); + }; + + return tooltipHostModel; + }, + + /** + * @private + */ + _renderAxisLabel: function (layoutInfo, group, axis, timelineModel) { + var labelModel = timelineModel.getModel('label.normal'); + + if (!labelModel.get('show')) { + return; + } + + var data = timelineModel.getData(); + var ticks = axis.scale.getTicks(); + var labels = axisHelper.getFormattedLabels( + axis, labelModel.get('formatter') + ); + var labelInterval = axis.getLabelInterval(); + + each(ticks, function (tick, dataIndex) { + if (axis.isLabelIgnored(dataIndex, labelInterval)) { + return; + } + + var itemModel = data.getItemModel(dataIndex); + var itemTextStyleModel = itemModel.getModel('label.normal.textStyle'); + var hoverTextStyleModel = itemModel.getModel('label.emphasis.textStyle'); + var tickCoord = axis.dataToCoord(tick); + var textEl = new graphic.Text({ + style: { + text: labels[dataIndex], + textAlign: layoutInfo.labelAlign, + textVerticalAlign: layoutInfo.labelBaseline, + textFont: itemTextStyleModel.getFont(), + fill: itemTextStyleModel.getTextColor() + }, + position: [tickCoord, 0], + rotation: layoutInfo.labelRotation - layoutInfo.rotation, + onclick: bind(this._changeTimeline, this, dataIndex), + silent: false + }); + + group.add(textEl); + graphic.setHoverStyle(textEl, hoverTextStyleModel.getItemStyle()); + + }, this); + }, + + /** + * @private + */ + _renderControl: function (layoutInfo, group, axis, timelineModel) { + var controlSize = layoutInfo.controlSize; + var rotation = layoutInfo.rotation; + + var itemStyle = timelineModel.getModel('controlStyle.normal').getItemStyle(); + var hoverStyle = timelineModel.getModel('controlStyle.emphasis').getItemStyle(); + var rect = [0, -controlSize / 2, controlSize, controlSize]; + var playState = timelineModel.getPlayState(); + var inverse = timelineModel.get('inverse', true); + + makeBtn( + layoutInfo.nextBtnPosition, + 'controlStyle.nextIcon', + bind(this._changeTimeline, this, inverse ? '-' : '+') + ); + makeBtn( + layoutInfo.prevBtnPosition, + 'controlStyle.prevIcon', + bind(this._changeTimeline, this, inverse ? '+' : '-') + ); + makeBtn( + layoutInfo.playPosition, + 'controlStyle.' + (playState ? 'stopIcon' : 'playIcon'), + bind(this._handlePlayClick, this, !playState), + true + ); + + function makeBtn(position, iconPath, onclick, willRotate) { + if (!position) { + return; + } + var opt = { + position: position, + origin: [controlSize / 2, 0], + rotation: willRotate ? -rotation : 0, + rectHover: true, + style: itemStyle, + onclick: onclick + }; + var btn = makeIcon(timelineModel, iconPath, rect, opt); + group.add(btn); + graphic.setHoverStyle(btn, hoverStyle); + } + }, + + _renderCurrentPointer: function (layoutInfo, group, axis, timelineModel) { + var data = timelineModel.getData(); + var currentIndex = timelineModel.getCurrentIndex(); + var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle'); + var me = this; + + var callback = { + onCreate: function (pointer) { + pointer.draggable = true; + pointer.drift = bind(me._handlePointerDrag, me); + pointer.ondragend = bind(me._handlePointerDragend, me); + pointerMoveTo(pointer, currentIndex, axis, timelineModel, true); + }, + onUpdate: function (pointer) { + pointerMoveTo(pointer, currentIndex, axis, timelineModel); + } + }; + + // Reuse when exists, for animation and drag. + this._currentPointer = giveSymbol( + pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback + ); + }, + + _handlePlayClick: function (nextState) { + this._clearTimer(); + this.api.dispatchAction({ + type: 'timelinePlayChange', + playState: nextState, + from: this.uid + }); + }, + + _handlePointerDrag: function (dx, dy, e) { + this._clearTimer(); + this._pointerChangeTimeline([e.offsetX, e.offsetY]); + }, + + _handlePointerDragend: function (e) { + this._pointerChangeTimeline([e.offsetX, e.offsetY], true); + }, + + _pointerChangeTimeline: function (mousePos, trigger) { + var toCoord = this._toAxisCoord(mousePos)[0]; + + var axis = this._axis; + var axisExtent = numberUtil.asc(axis.getExtent().slice()); + + toCoord > axisExtent[1] && (toCoord = axisExtent[1]); + toCoord < axisExtent[0] && (toCoord = axisExtent[0]); + + this._currentPointer.position[0] = toCoord; + this._currentPointer.dirty(); + + var targetDataIndex = this._findNearestTick(toCoord); + var timelineModel = this.model; + + if (trigger || ( + targetDataIndex !== timelineModel.getCurrentIndex() + && timelineModel.get('realtime') + )) { + this._changeTimeline(targetDataIndex); + } + }, + + _doPlayStop: function () { + this._clearTimer(); + + if (this.model.getPlayState()) { + this._timer = setTimeout( + bind(handleFrame, this), + this.model.get('playInterval') + ); + } + + function handleFrame() { + // Do not cache + var timelineModel = this.model; + this._changeTimeline( + timelineModel.getCurrentIndex() + + (timelineModel.get('rewind', true) ? -1 : 1) + ); + } + }, + + _toAxisCoord: function (vertex) { + var trans = this._mainGroup.getLocalTransform(); + return graphic.applyTransform(vertex, trans, true); + }, + + _findNearestTick: function (axisCoord) { + var data = this.model.getData(); + var dist = Infinity; + var targetDataIndex; + var axis = this._axis; + + data.each(['value'], function (value, dataIndex) { + var coord = axis.dataToCoord(value); + var d = Math.abs(coord - axisCoord); + if (d < dist) { + dist = d; + targetDataIndex = dataIndex; + } + }); + + return targetDataIndex; + }, + + _clearTimer: function () { + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + }, + + _changeTimeline: function (nextIndex) { + var currentIndex = this.model.getCurrentIndex(); + + if (nextIndex === '+') { + nextIndex = currentIndex + 1; + } + else if (nextIndex === '-') { + nextIndex = currentIndex - 1; + } + + this.api.dispatchAction({ + type: 'timelineChange', + currentIndex: nextIndex, + from: this.uid + }); + } + + }); + + function getViewRect(model, api) { + return layout.getLayoutRect( + model.getBoxLayoutParams(), + { + width: api.getWidth(), + height: api.getHeight() + }, + model.get('padding') + ); + } + + function makeIcon(timelineModel, objPath, rect, opts) { + var icon = graphic.makePath( + timelineModel.get(objPath).replace(/^path:\/\//, ''), + zrUtil.clone(opts || {}), + new BoundingRect(rect[0], rect[1], rect[2], rect[3]), + 'center' + ); + + return icon; + } + + /** + * Create symbol or update symbol + */ + function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) { + var symbolType = hostModel.get('symbol'); + var color = itemStyleModel.get('color'); + var symbolSize = hostModel.get('symbolSize'); + var halfSymbolSize = symbolSize / 2; + var itemStyle = itemStyleModel.getItemStyle(['color', 'symbol', 'symbolSize']); + + if (!symbol) { + symbol = symbolUtil.createSymbol( + symbolType, -halfSymbolSize, -halfSymbolSize, symbolSize, symbolSize, color + ); + group.add(symbol); + callback && callback.onCreate(symbol); + } + else { + symbol.setStyle(itemStyle); + symbol.setColor(color); + group.add(symbol); // Group may be new, also need to add. + callback && callback.onUpdate(symbol); + } + + opt = zrUtil.merge({ + rectHover: true, + style: itemStyle, + z2: 100 + }, opt, true); + + symbol.attr(opt); + + return symbol; + } + + function pointerMoveTo(pointer, dataIndex, axis, timelineModel, noAnimation) { + if (pointer.dragging) { + return; + } + + var pointerModel = timelineModel.getModel('checkpointStyle'); + var toCoord = axis.dataToCoord(timelineModel.getData().get(['value'], dataIndex)); + + if (noAnimation || !pointerModel.get('animation', true)) { + pointer.attr({position: [toCoord, 0]}); + } + else { + pointer.stopAnimation(true); + pointer.animateTo( + {position: [toCoord, 0]}, + pointerModel.get('animationDuration', true), + pointerModel.get('animationEasing', true) + ); + } + } + + + +/***/ }, +/* 329 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Timeline view + */ + + + // var zrUtil = require('zrender/lib/core/util'); + // var graphic = require('../../util/graphic'); + var ComponentView = __webpack_require__(28); + + module.exports = ComponentView.extend({ + + type: 'timeline' + }); + + + +/***/ }, +/* 330 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var Axis = __webpack_require__(117); + var axisHelper = __webpack_require__(108); + + /** + * Extend axis 2d + * @constructor module:echarts/coord/cartesian/Axis2D + * @extends {module:echarts/coord/cartesian/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.} coordExtent + * @param {string} axisType + * @param {string} position + */ + var TimelineAxis = function (dim, scale, coordExtent, axisType) { + + Axis.call(this, dim, scale, coordExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * @private + * @type {number} + */ + this._autoLabelInterval; + + /** + * Axis model + * @param {module:echarts/component/TimelineModel} + */ + this.model = null; + }; + + TimelineAxis.prototype = { + + constructor: TimelineAxis, + + /** + * @public + * @return {number} + */ + getLabelInterval: function () { + var timelineModel = this.model; + var labelModel = timelineModel.getModel('label.normal'); + var labelInterval = labelModel.get('interval'); + + if (labelInterval != null && labelInterval != 'auto') { + return labelInterval; + } + + var labelInterval = this._autoLabelInterval; + + if (!labelInterval) { + labelInterval = this._autoLabelInterval = axisHelper.getAxisLabelInterval( + zrUtil.map(this.scale.getTicks(), this.dataToCoord, this), + axisHelper.getFormattedLabels(this, labelModel.get('formatter')), + labelModel.getModel('textStyle').getFont(), + timelineModel.get('orient') === 'horizontal' + ); + } + + return labelInterval; + }, + + /** + * If label is ignored. + * Automatically used when axis is category and label can not be all shown + * @public + * @param {number} idx + * @return {boolean} + */ + isLabelIgnored: function (idx) { + if (this.type === 'category') { + var labelInterval = this.getLabelInterval(); + return ((typeof labelInterval === 'function') + && !labelInterval(idx, this.scale.getLabel(idx))) + || idx % (labelInterval + 1); + } + } + + }; + + zrUtil.inherits(TimelineAxis, Axis); + + module.exports = TimelineAxis; + + +/***/ }, +/* 331 */ +/***/ function(module, exports, __webpack_require__) { + + + + __webpack_require__(332); + __webpack_require__(334); + + __webpack_require__(336); + __webpack_require__(337); + __webpack_require__(338); + __webpack_require__(339); + __webpack_require__(344); + + +/***/ }, +/* 332 */ +/***/ function(module, exports, __webpack_require__) { + + + + var featureManager = __webpack_require__(333); + var zrUtil = __webpack_require__(3); + + var ToolboxModel = __webpack_require__(1).extendComponentModel({ + + type: 'toolbox', + + layoutMode: { + type: 'box', + ignoreSize: true + }, + + mergeDefaultAndTheme: function (option) { + ToolboxModel.superApply(this, 'mergeDefaultAndTheme', arguments); + + zrUtil.each(this.option.feature, function (featureOpt, featureName) { + var Feature = featureManager.get(featureName); + Feature && zrUtil.merge(featureOpt, Feature.defaultOption); + }); + }, + + defaultOption: { + + show: true, + + z: 6, + + zlevel: 0, + + orient: 'horizontal', + + left: 'right', + + top: 'top', + + // right + // bottom + + backgroundColor: 'transparent', + + borderColor: '#ccc', + + borderWidth: 0, + + padding: 5, + + itemSize: 15, + + itemGap: 8, + + showTitle: true, + + iconStyle: { + normal: { + borderColor: '#666', + color: 'none' + }, + emphasis: { + borderColor: '#3E98C5' + } + } + // textStyle: {}, + + // feature + } + }); + + module.exports = ToolboxModel; + + +/***/ }, +/* 333 */ +/***/ function(module, exports) { + + 'use strict'; + + + var features = {}; + + module.exports = { + register: function (name, ctor) { + features[name] = ctor; + }, + + get: function (name) { + return features[name]; + } + }; + + +/***/ }, +/* 334 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(process) { + + var featureManager = __webpack_require__(333); + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var Model = __webpack_require__(8); + var DataDiffer = __webpack_require__(95); + var listComponentHelper = __webpack_require__(266); + var textContain = __webpack_require__(14); + + module.exports = __webpack_require__(1).extendComponentView({ + + type: 'toolbox', + + render: function (toolboxModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + if (!toolboxModel.get('show')) { + return; + } + + var itemSize = +toolboxModel.get('itemSize'); + var featureOpts = toolboxModel.get('feature') || {}; + var features = this._features || (this._features = {}); + + var featureNames = []; + zrUtil.each(featureOpts, function (opt, name) { + featureNames.push(name); + }); + + (new DataDiffer(this._featureNames || [], featureNames)) + .add(process) + .update(process) + .remove(zrUtil.curry(process, null)) + .execute(); + + // Keep for diff. + this._featureNames = featureNames; + + function process(newIndex, oldIndex) { + var featureName = featureNames[newIndex]; + var oldName = featureNames[oldIndex]; + var featureOpt = featureOpts[featureName]; + var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); + var feature; + + if (featureName && !oldName) { // Create + if (isUserFeatureName(featureName)) { + feature = { + model: featureModel, + onclick: featureModel.option.onclick, + featureName: featureName + }; + } + else { + var Feature = featureManager.get(featureName); + if (!Feature) { + return; + } + feature = new Feature(featureModel); + } + features[featureName] = feature; + } + else { + feature = features[oldName]; + // If feature does not exsit. + if (!feature) { + return; + } + feature.model = featureModel; + } + + if (!featureName && oldName) { + feature.dispose && feature.dispose(ecModel, api); + return; + } + + if (!featureModel.get('show') || feature.unusable) { + feature.remove && feature.remove(ecModel, api); + return; + } + + createIconPaths(featureModel, feature, featureName); + + featureModel.setIconStatus = function (iconName, status) { + var option = this.option; + var iconPaths = this.iconPaths; + option.iconStatus = option.iconStatus || {}; + option.iconStatus[iconName] = status; + // FIXME + iconPaths[iconName] && iconPaths[iconName].trigger(status); + }; + + if (feature.render) { + feature.render(featureModel, ecModel, api); + } + } + + function createIconPaths(featureModel, feature, featureName) { + var iconStyleModel = featureModel.getModel('iconStyle'); + + // If one feature has mutiple icon. they are orginaized as + // { + // icon: { + // foo: '', + // bar: '' + // }, + // title: { + // foo: '', + // bar: '' + // } + // } + var icons = feature.getIcons ? feature.getIcons() : featureModel.get('icon'); + var titles = featureModel.get('title') || {}; + if (typeof icons === 'string') { + var icon = icons; + var title = titles; + icons = {}; + titles = {}; + icons[featureName] = icon; + titles[featureName] = title; + } + var iconPaths = featureModel.iconPaths = {}; + zrUtil.each(icons, function (icon, iconName) { + var normalStyle = iconStyleModel.getModel('normal').getItemStyle(); + var hoverStyle = iconStyleModel.getModel('emphasis').getItemStyle(); + + var style = { + x: -itemSize / 2, + y: -itemSize / 2, + width: itemSize, + height: itemSize + }; + var path = icon.indexOf('image://') === 0 + ? ( + style.image = icon.slice(8), + new graphic.Image({style: style}) + ) + : graphic.makePath( + icon.replace('path://', ''), + { + style: normalStyle, + hoverStyle: hoverStyle, + rectHover: true + }, + style, + 'center' + ); + + graphic.setHoverStyle(path); + + if (toolboxModel.get('showTitle')) { + path.__title = titles[iconName]; + path.on('mouseover', function () { + path.setStyle({ + text: titles[iconName], + textPosition: hoverStyle.textPosition || 'bottom', + textFill: hoverStyle.fill || hoverStyle.stroke || '#000', + textAlign: hoverStyle.textAlign || 'center' + }); + }) + .on('mouseout', function () { + path.setStyle({ + textFill: null + }); + }); + } + path.trigger(featureModel.get('iconStatus.' + iconName) || 'normal'); + + group.add(path); + path.on('click', zrUtil.bind( + feature.onclick, feature, ecModel, api, iconName + )); + + iconPaths[iconName] = path; + }); + } + + listComponentHelper.layout(group, toolboxModel, api); + // Render background after group is layout + // FIXME + listComponentHelper.addBackground(group, toolboxModel); + + // Adjust icon title positions to avoid them out of screen + group.eachChild(function (icon) { + var titleText = icon.__title; + var hoverStyle = icon.hoverStyle; + // May be background element + if (hoverStyle && titleText) { + var rect = textContain.getBoundingRect( + titleText, hoverStyle.font + ); + var offsetX = icon.position[0] + group.position[0]; + var offsetY = icon.position[1] + group.position[1] + itemSize; + + var needPutOnTop = false; + if (offsetY + rect.height > api.getHeight()) { + hoverStyle.textPosition = 'top'; + needPutOnTop = true; + } + var topOffset = needPutOnTop ? (-5 - rect.height) : (itemSize + 8); + if (offsetX + rect.width / 2 > api.getWidth()) { + hoverStyle.textPosition = ['100%', topOffset]; + hoverStyle.textAlign = 'right'; + } + else if (offsetX - rect.width / 2 < 0) { + hoverStyle.textPosition = [0, topOffset]; + hoverStyle.textAlign = 'left'; + } + } + }); + }, + + remove: function (ecModel, api) { + zrUtil.each(this._features, function (feature) { + feature.remove && feature.remove(ecModel, api); + }); + this.group.removeAll(); + }, + + dispose: function (ecModel, api) { + zrUtil.each(this._features, function (feature) { + feature.dispose && feature.dispose(ecModel, api); + }); + } + }); + + function isUserFeatureName(featureName) { + return featureName.indexOf('my') === 0; + } + + + /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(335))) + +/***/ }, +/* 335 */ +/***/ function(module, exports) { + + // shim for using process in browser + + var process = module.exports = {}; + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = setTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); + } + + process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + setTimeout(drainQueue, 0); + } + }; + + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + process.title = 'browser'; + process.browser = true; + process.env = {}; + process.argv = []; + process.version = ''; // empty string to avoid regexp issues + process.versions = {}; + + function noop() {} + + process.on = noop; + process.addListener = noop; + process.once = noop; + process.off = noop; + process.removeListener = noop; + process.removeAllListeners = noop; + process.emit = noop; + + process.binding = function (name) { + throw new Error('process.binding is not supported'); + }; + + process.cwd = function () { return '/' }; + process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); + }; + process.umask = function() { return 0; }; + + +/***/ }, +/* 336 */ +/***/ function(module, exports, __webpack_require__) { + + + + var env = __webpack_require__(78); + + function SaveAsImage (model) { + this.model = model; + } + + SaveAsImage.defaultOption = { + show: true, + icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0', + title: '保存为图片', + type: 'png', + // Default use option.backgroundColor + // backgroundColor: '#fff', + name: '', + excludeComponents: ['toolbox'], + pixelRatio: 1, + lang: ['右键另存为图片'] + }; + + SaveAsImage.prototype.unusable = !env.canvasSupported; + + var proto = SaveAsImage.prototype; + + proto.onclick = function (ecModel, api) { + var model = this.model; + var title = model.get('name') || ecModel.get('title.0.text') || 'echarts'; + var $a = document.createElement('a'); + var type = model.get('type', true) || 'png'; + $a.download = title + '.' + type; + $a.target = '_blank'; + var url = api.getConnectedDataURL({ + type: type, + backgroundColor: model.get('backgroundColor', true) + || ecModel.get('backgroundColor') || '#fff', + excludeComponents: model.get('excludeComponents'), + pixelRatio: model.get('pixelRatio') + }); + $a.href = url; + // Chrome and Firefox + if (typeof MouseEvent === 'function') { + var evt = new MouseEvent('click', { + view: window, + bubbles: true, + cancelable: false + }); + $a.dispatchEvent(evt); + } + // IE + else { + var lang = model.get('lang'); + var html = '' + + '' + + '' + + ''; + var tab = window.open(); + tab.document.write(html); + } + }; + + __webpack_require__(333).register( + 'saveAsImage', SaveAsImage + ); + + module.exports = SaveAsImage; + + +/***/ }, +/* 337 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + function MagicType(model) { + this.model = model; + } + + MagicType.defaultOption = { + show: true, + type: [], + // Icon group + icon: { + line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4', + bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7', + stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z', // jshint ignore:line + tiled: 'M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z' + }, + title: { + line: '切换为折线图', + bar: '切换为柱状图', + stack: '切换为堆叠', + tiled: '切换为平铺' + }, + option: {}, + seriesIndex: {} + }; + + var proto = MagicType.prototype; + + proto.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon'); + var icons = {}; + zrUtil.each(model.get('type'), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; + }; + + var seriesOptGenreator = { + 'line': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'bar') { + return zrUtil.merge({ + id: seriesId, + type: 'line', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get('option.line') || {}, true); + } + }, + 'bar': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line') { + return zrUtil.merge({ + id: seriesId, + type: 'bar', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get('option.bar') || {}, true); + } + }, + 'stack': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line' || seriesType === 'bar') { + return zrUtil.merge({ + id: seriesId, + stack: '__ec_magicType_stack__' + }, model.get('option.stack') || {}, true); + } + }, + 'tiled': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line' || seriesType === 'bar') { + return zrUtil.merge({ + id: seriesId, + stack: '' + }, model.get('option.tiled') || {}, true); + } + } + }; + + var radioTypes = [ + ['line', 'bar'], + ['stack', 'tiled'] + ]; + + proto.onclick = function (ecModel, api, type) { + var model = this.model; + var seriesIndex = model.get('seriesIndex.' + type); + // Not supported magicType + if (!seriesOptGenreator[type]) { + return; + } + var newOption = { + series: [] + }; + var generateNewSeriesTypes = function (seriesModel) { + var seriesType = seriesModel.subType; + var seriesId = seriesModel.id; + var newSeriesOpt = seriesOptGenreator[type]( + seriesType, seriesId, seriesModel, model + ); + if (newSeriesOpt) { + // PENDING If merge original option? + zrUtil.defaults(newSeriesOpt, seriesModel.option); + newOption.series.push(newSeriesOpt); + } + // Modify boundaryGap + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + if (categoryAxis) { + var axisDim = categoryAxis.dim; + var axisIndex = seriesModel.get(axisDim + 'AxisIndex'); + var axisKey = axisDim + 'Axis'; + newOption[axisKey] = newOption[axisKey] || []; + for (var i = 0; i <= axisIndex; i++) { + newOption[axisKey][axisIndex] = newOption[axisKey][axisIndex] || {}; + } + newOption[axisKey][axisIndex].boundaryGap = type === 'bar' ? true : false; + } + } + }; + + zrUtil.each(radioTypes, function (radio) { + if (zrUtil.indexOf(radio, type) >= 0) { + zrUtil.each(radio, function (item) { + model.setIconStatus(item, 'normal'); + }); + } + }); + + model.setIconStatus(type, 'emphasis'); + + ecModel.eachComponent( + { + mainType: 'series', + query: seriesIndex == null ? null : { + seriesIndex: seriesIndex + } + }, generateNewSeriesTypes + ); + api.dispatchAction({ + type: 'changeMagicType', + currentType: type, + newOption: newOption + }); + }; + + var echarts = __webpack_require__(1); + echarts.registerAction({ + type: 'changeMagicType', + event: 'magicTypeChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + ecModel.mergeOption(payload.newOption); + }); + + __webpack_require__(333).register('magicType', MagicType); + + module.exports = MagicType; + + +/***/ }, +/* 338 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/component/toolbox/feature/DataView + */ + + + + var zrUtil = __webpack_require__(3); + var eventTool = __webpack_require__(80); + + + var BLOCK_SPLITER = new Array(60).join('-'); + var ITEM_SPLITER = '\t'; + /** + * Group series into two types + * 1. on category axis, like line, bar + * 2. others, like scatter, pie + * @param {module:echarts/model/Global} ecModel + * @return {Object} + * @inner + */ + function groupSeries(ecModel) { + var seriesGroupByCategoryAxis = {}; + var otherSeries = []; + var meta = []; + ecModel.eachRawSeries(function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) { + var baseAxis = coordSys.getBaseAxis(); + if (baseAxis.type === 'category') { + var key = baseAxis.dim + '_' + baseAxis.index; + if (!seriesGroupByCategoryAxis[key]) { + seriesGroupByCategoryAxis[key] = { + categoryAxis: baseAxis, + valueAxis: coordSys.getOtherAxis(baseAxis), + series: [] + }; + meta.push({ + axisDim: baseAxis.dim, + axisIndex: baseAxis.index + }); + } + seriesGroupByCategoryAxis[key].series.push(seriesModel); + } + else { + otherSeries.push(seriesModel); + } + } + else { + otherSeries.push(seriesModel); + } + }); + + return { + seriesGroupByCategoryAxis: seriesGroupByCategoryAxis, + other: otherSeries, + meta: meta + }; + } + + /** + * Assemble content of series on cateogory axis + * @param {Array.} series + * @return {string} + * @inner + */ + function assembleSeriesWithCategoryAxis(series) { + var tables = []; + zrUtil.each(series, function (group, key) { + var categoryAxis = group.categoryAxis; + var valueAxis = group.valueAxis; + var valueAxisDim = valueAxis.dim; + + var headers = [' '].concat(zrUtil.map(group.series, function (series) { + return series.name; + })); + var columns = [categoryAxis.model.getCategories()]; + zrUtil.each(group.series, function (series) { + columns.push(series.getRawData().mapArray(valueAxisDim, function (val) { + return val; + })); + }); + // Assemble table content + var lines = [headers.join(ITEM_SPLITER)]; + for (var i = 0; i < columns[0].length; i++) { + var items = []; + for (var j = 0; j < columns.length; j++) { + items.push(columns[j][i]); + } + lines.push(items.join(ITEM_SPLITER)); + } + tables.push(lines.join('\n')); + }); + return tables.join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + + /** + * Assemble content of other series + * @param {Array.} series + * @return {string} + * @inner + */ + function assembleOtherSeries(series) { + return zrUtil.map(series, function (series) { + var data = series.getRawData(); + var lines = [series.name]; + var vals = []; + data.each(data.dimensions, function () { + var argLen = arguments.length; + var dataIndex = arguments[argLen - 1]; + var name = data.getName(dataIndex); + for (var i = 0; i < argLen - 1; i++) { + vals[i] = arguments[i]; + } + lines.push((name ? (name + ITEM_SPLITER) : '') + vals.join(ITEM_SPLITER)); + }); + return lines.join('\n'); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'); + } + + /** + * @param {module:echarts/model/Global} + * @return {string} + * @inner + */ + function getContentFromModel(ecModel) { + + var result = groupSeries(ecModel); + + return { + value: zrUtil.filter([ + assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), + assembleOtherSeries(result.other) + ], function (str) { + return str.replace(/[\n\t\s]/g, ''); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'), + + meta: result.meta + }; + } + + + function trim(str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } + /** + * If a block is tsv format + */ + function isTSVFormat(block) { + // Simple method to find out if a block is tsv format + var firstLine = block.slice(0, block.indexOf('\n')); + if (firstLine.indexOf(ITEM_SPLITER) >= 0) { + return true; + } + } + + var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g'); + /** + * @param {string} tsv + * @return {Array.} + */ + function parseTSVContents(tsv) { + var tsvLines = tsv.split(/\n+/g); + var headers = trim(tsvLines.shift()).split(itemSplitRegex); + + var categories = []; + var series = zrUtil.map(headers, function (header) { + return { + name: header, + data: [] + }; + }); + for (var i = 0; i < tsvLines.length; i++) { + var items = trim(tsvLines[i]).split(itemSplitRegex); + categories.push(items.shift()); + for (var j = 0; j < items.length; j++) { + series[j] && (series[j].data[i] = items[j]); + } + } + return { + series: series, + categories: categories + }; + } + + /** + * @param {string} str + * @return {Array.} + * @inner + */ + function parseListContents(str) { + var lines = str.split(/\n+/g); + var seriesName = trim(lines.shift()); + + var data = []; + for (var i = 0; i < lines.length; i++) { + var items = trim(lines[i]).split(itemSplitRegex); + var name = ''; + var value; + var hasName = false; + if (isNaN(items[0])) { // First item is name + hasName = true; + name = items[0]; + items = items.slice(1); + data[i] = { + name: name, + value: [] + }; + value = data[i].value; + } + else { + value = data[i] = []; + } + for (var j = 0; j < items.length; j++) { + value.push(+items[j]); + } + if (value.length === 1) { + hasName ? (data[i].value = value[0]) : (data[i] = value[0]); + } + } + + return { + name: seriesName, + data: data + }; + } + + /** + * @param {string} str + * @param {Array.} blockMetaList + * @return {Object} + * @inner + */ + function parseContents(str, blockMetaList) { + var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g')); + var newOption = { + series: [] + }; + zrUtil.each(blocks, function (block, idx) { + if (isTSVFormat(block)) { + var result = parseTSVContents(block); + var blockMeta = blockMetaList[idx]; + var axisKey = blockMeta.axisDim + 'Axis'; + + if (blockMeta) { + newOption[axisKey] = newOption[axisKey] || []; + newOption[axisKey][blockMeta.axisIndex] = { + data: result.categories + }; + newOption.series = newOption.series.concat(result.series); + } + } + else { + var result = parseListContents(block); + newOption.series.push(result); + } + }); + return newOption; + } + + /** + * @alias {module:echarts/component/toolbox/feature/DataView} + * @constructor + * @param {module:echarts/model/Model} model + */ + function DataView(model) { + + this._dom = null; + + this.model = model; + } + + DataView.defaultOption = { + show: true, + readOnly: false, + optionToContent: null, + contentToOption: null, + + icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28', + title: '数据视图', + lang: ['数据视图', '关闭', '刷新'], + backgroundColor: '#fff', + textColor: '#000', + textareaColor: '#fff', + textareaBorderColor: '#333', + buttonColor: '#c23531', + buttonTextColor: '#fff' + }; + + DataView.prototype.onclick = function (ecModel, api) { + var container = api.getDom(); + var model = this.model; + if (this._dom) { + container.removeChild(this._dom); + } + var root = document.createElement('div'); + root.style.cssText = 'position:absolute;left:5px;top:5px;bottom:5px;right:5px;'; + root.style.backgroundColor = model.get('backgroundColor') || '#fff'; + + // Create elements + var header = document.createElement('h4'); + var lang = model.get('lang') || []; + header.innerHTML = lang[0] || model.get('title'); + header.style.cssText = 'margin: 10px 20px;'; + header.style.color = model.get('textColor'); + + var viewMain = document.createElement('div'); + var textarea = document.createElement('textarea'); + viewMain.style.cssText = 'display:block;width:100%;overflow:hidden;'; + + var optionToContent = model.get('optionToContent'); + var contentToOption = model.get('contentToOption'); + var result = getContentFromModel(ecModel); + if (typeof optionToContent === 'function') { + var htmlOrDom = optionToContent(api.getOption()); + if (typeof htmlOrDom === 'string') { + viewMain.innerHTML = htmlOrDom; + } + else if (zrUtil.isDom(htmlOrDom)) { + viewMain.appendChild(htmlOrDom); + } + } + else { + // Use default textarea + viewMain.appendChild(textarea); + textarea.readOnly = model.get('readOnly'); + textarea.style.cssText = 'width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;'; + textarea.style.color = model.get('textColor'); + textarea.style.borderColor = model.get('textareaBorderColor'); + textarea.style.backgroundColor = model.get('textareaColor'); + textarea.value = result.value; + } + + var blockMetaList = result.meta; + + var buttonContainer = document.createElement('div'); + buttonContainer.style.cssText = 'position:absolute;bottom:0;left:0;right:0;'; + + var buttonStyle = 'float:right;margin-right:20px;border:none;' + + 'cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px'; + var closeButton = document.createElement('div'); + var refreshButton = document.createElement('div'); + + buttonStyle += ';background-color:' + model.get('buttonColor'); + buttonStyle += ';color:' + model.get('buttonTextColor'); + + var self = this; + + function close() { + container.removeChild(root); + self._dom = null; + } + eventTool.addEventListener(closeButton, 'click', close); + + eventTool.addEventListener(refreshButton, 'click', function () { + var newOption; + try { + if (typeof contentToOption === 'function') { + newOption = contentToOption(viewMain, api.getOption()); + } + else { + newOption = parseContents(textarea.value, blockMetaList); + } + } + catch (e) { + close(); + throw new Error('Data view format error ' + e); + } + if (newOption) { + api.dispatchAction({ + type: 'changeDataView', + newOption: newOption + }); + } + + close(); + }); + + closeButton.innerHTML = lang[1]; + refreshButton.innerHTML = lang[2]; + refreshButton.style.cssText = buttonStyle; + closeButton.style.cssText = buttonStyle; + + !model.get('readOnly') && buttonContainer.appendChild(refreshButton); + buttonContainer.appendChild(closeButton); + + // http://stackoverflow.com/questions/6637341/use-tab-to-indent-in-textarea + eventTool.addEventListener(textarea, 'keydown', function (e) { + if ((e.keyCode || e.which) === 9) { + // get caret position/selection + var val = this.value; + var start = this.selectionStart; + var end = this.selectionEnd; + + // set textarea value to: text before caret + tab + text after caret + this.value = val.substring(0, start) + ITEM_SPLITER + val.substring(end); + + // put caret at right position again + this.selectionStart = this.selectionEnd = start + 1; + + // prevent the focus lose + eventTool.stop(e); + } + }); + + root.appendChild(header); + root.appendChild(viewMain); + root.appendChild(buttonContainer); + + viewMain.style.height = (container.clientHeight - 80) + 'px'; + + container.appendChild(root); + this._dom = root; + }; + + DataView.prototype.remove = function (ecModel, api) { + this._dom && api.getDom().removeChild(this._dom); + }; + + DataView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); + }; + + /** + * @inner + */ + function tryMergeDataOption(newData, originalData) { + return zrUtil.map(newData, function (newVal, idx) { + var original = originalData && originalData[idx]; + if (zrUtil.isObject(original) && !zrUtil.isArray(original)) { + if (zrUtil.isObject(newVal) && !zrUtil.isArray(newVal)) { + newVal = newVal.value; + } + // Original data has option + return zrUtil.defaults({ + value: newVal + }, original); + } + else { + return newVal; + } + }); + } + + __webpack_require__(333).register('dataView', DataView); + + __webpack_require__(1).registerAction({ + type: 'changeDataView', + event: 'dataViewChanged', + update: 'prepareAndUpdate' + }, function (payload, ecModel) { + var newSeriesOptList = []; + zrUtil.each(payload.newOption.series, function (seriesOpt) { + var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; + if (!seriesModel) { + // New created series + // Geuss the series type + newSeriesOptList.push(zrUtil.extend({ + // Default is scatter + type: 'scatter' + }, seriesOpt)); + } + else { + var originalData = seriesModel.get('data'); + newSeriesOptList.push({ + name: seriesOpt.name, + data: tryMergeDataOption(seriesOpt.data, originalData) + }); + } + }); + + ecModel.mergeOption(zrUtil.defaults({ + series: newSeriesOptList + }, payload.newOption)); + }); + + module.exports = DataView; + + +/***/ }, +/* 339 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var SelectController = __webpack_require__(225); + var BoundingRect = __webpack_require__(15); + var Group = __webpack_require__(29); + var history = __webpack_require__(340); + var interactionMutex = __webpack_require__(160); + + var each = zrUtil.each; + var asc = numberUtil.asc; + + // Use dataZoomSelect + __webpack_require__(341); + + // Spectial component id start with \0ec\0, see echarts/model/Global.js~hasInnerId + var DATA_ZOOM_ID_BASE = '\0_ec_\0toolbox-dataZoom_'; + + function DataZoom(model) { + this.model = model; + + /** + * @private + * @type {module:zrender/container/Group} + */ + this._controllerGroup; + + /** + * @private + * @type {module:echarts/component/helper/SelectController} + */ + this._controller; + + /** + * Is zoom active. + * @private + * @type {Object} + */ + this._isZoomActive; + } + + DataZoom.defaultOption = { + show: true, + // Icon group + icon: { + zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1', + back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26' + }, + title: { + zoom: '区域缩放', + back: '区域缩放还原' + } + }; + + var proto = DataZoom.prototype; + + proto.render = function (featureModel, ecModel, api) { + updateBackBtnStatus(featureModel, ecModel); + }; + + proto.onclick = function (ecModel, api, type) { + var controllerGroup = this._controllerGroup; + if (!this._controllerGroup) { + controllerGroup = this._controllerGroup = new Group(); + api.getZr().add(controllerGroup); + } + + handlers[type].call(this, controllerGroup, this.model, ecModel, api); + }; + + proto.remove = function (ecModel, api) { + this._disposeController(); + interactionMutex.release('globalPan', api.getZr()); + }; + + proto.dispose = function (ecModel, api) { + var zr = api.getZr(); + interactionMutex.release('globalPan', zr); + this._disposeController(); + this._controllerGroup && zr.remove(this._controllerGroup); + }; + + /** + * @private + */ + var handlers = { + + zoom: function (controllerGroup, featureModel, ecModel, api) { + var isZoomActive = this._isZoomActive = !this._isZoomActive; + var zr = api.getZr(); + + interactionMutex[isZoomActive ? 'take' : 'release']('globalPan', zr); + + featureModel.setIconStatus('zoom', isZoomActive ? 'emphasis' : 'normal'); + + if (isZoomActive) { + zr.setDefaultCursorStyle('crosshair'); + + this._createController( + controllerGroup, featureModel, ecModel, api + ); + } + else { + zr.setDefaultCursorStyle('default'); + this._disposeController(); + } + }, + + back: function (controllerGroup, featureModel, ecModel, api) { + this._dispatchAction(history.pop(ecModel), api); + } + }; + + /** + * @private + */ + proto._createController = function ( + controllerGroup, featureModel, ecModel, api + ) { + var controller = this._controller = new SelectController( + 'rect', + api.getZr(), + { + // FIXME + lineWidth: 3, + stroke: '#333', + fill: 'rgba(0,0,0,0.2)' + } + ); + controller.on( + 'selectEnd', + zrUtil.bind( + this._onSelected, this, controller, + featureModel, ecModel, api + ) + ); + controller.enable(controllerGroup, false); + }; + + proto._disposeController = function () { + var controller = this._controller; + if (controller) { + controller.off('selected'); + controller.dispose(); + } + }; + + function prepareCoordInfo(grid, ecModel) { + // Default use the first axis. + // FIXME + var coordInfo = [ + {axisModel: grid.getAxis('x').model, axisIndex: 0}, // x + {axisModel: grid.getAxis('y').model, axisIndex: 0} // y + ]; + coordInfo.grid = grid; + + ecModel.eachComponent( + {mainType: 'dataZoom', subType: 'select'}, + function (dzModel, dataZoomIndex) { + if (isTheAxis('xAxis', coordInfo[0].axisModel, dzModel, ecModel)) { + coordInfo[0].dataZoomModel = dzModel; + } + if (isTheAxis('yAxis', coordInfo[1].axisModel, dzModel, ecModel)) { + coordInfo[1].dataZoomModel = dzModel; + } + } + ); + + return coordInfo; + } + + function isTheAxis(axisName, axisModel, dataZoomModel, ecModel) { + var axisIndex = dataZoomModel.get(axisName + 'Index'); + return axisIndex != null + && ecModel.getComponent(axisName, axisIndex) === axisModel; + } + + /** + * @private + */ + proto._onSelected = function (controller, featureModel, ecModel, api, selRanges) { + if (!selRanges.length) { + return; + } + var selRange = selRanges[0]; + + controller.update(); // remove cover + + var snapshot = {}; + + // FIXME + // polar + + ecModel.eachComponent('grid', function (gridModel, gridIndex) { + var grid = gridModel.coordinateSystem; + var coordInfo = prepareCoordInfo(grid, ecModel); + var selDataRange = pointToDataInCartesian(selRange, coordInfo); + + if (selDataRange) { + var xBatchItem = scaleCartesianAxis(selDataRange, coordInfo, 0, 'x'); + var yBatchItem = scaleCartesianAxis(selDataRange, coordInfo, 1, 'y'); + + xBatchItem && (snapshot[xBatchItem.dataZoomId] = xBatchItem); + yBatchItem && (snapshot[yBatchItem.dataZoomId] = yBatchItem); + } + }, this); + + history.push(ecModel, snapshot); + + this._dispatchAction(snapshot, api); + }; + + function pointToDataInCartesian(selRange, coordInfo) { + var grid = coordInfo.grid; + + var selRect = new BoundingRect( + selRange[0][0], + selRange[1][0], + selRange[0][1] - selRange[0][0], + selRange[1][1] - selRange[1][0] + ); + if (!selRect.intersect(grid.getRect())) { + return; + } + var cartesian = grid.getCartesian(coordInfo[0].axisIndex, coordInfo[1].axisIndex); + var dataLeftTop = cartesian.pointToData([selRange[0][0], selRange[1][0]], true); + var dataRightBottom = cartesian.pointToData([selRange[0][1], selRange[1][1]], true); + + return [ + asc([dataLeftTop[0], dataRightBottom[0]]), // x, using asc to handle inverse + asc([dataLeftTop[1], dataRightBottom[1]]) // y, using asc to handle inverse + ]; + } + + function scaleCartesianAxis(selDataRange, coordInfo, dimIdx, dimName) { + var dimCoordInfo = coordInfo[dimIdx]; + var dataZoomModel = dimCoordInfo.dataZoomModel; + + if (dataZoomModel) { + return { + dataZoomId: dataZoomModel.id, + startValue: selDataRange[dimIdx][0], + endValue: selDataRange[dimIdx][1] + }; + } + } + + /** + * @private + */ + proto._dispatchAction = function (snapshot, api) { + var batch = []; + + each(snapshot, function (batchItem) { + batch.push(batchItem); + }); + + batch.length && api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + batch: zrUtil.clone(batch, true) + }); + }; + + function updateBackBtnStatus(featureModel, ecModel) { + featureModel.setIconStatus( + 'back', + history.count(ecModel) > 1 ? 'emphasis' : 'normal' + ); + } + + + __webpack_require__(333).register('dataZoom', DataZoom); + + + // Create special dataZoom option for select + __webpack_require__(1).registerPreprocessor(function (option) { + if (!option) { + return; + } + + var dataZoomOpts = option.dataZoom || (option.dataZoom = []); + if (!zrUtil.isArray(dataZoomOpts)) { + dataZoomOpts = [dataZoomOpts]; + } + + var toolboxOpt = option.toolbox; + if (toolboxOpt) { + // Assume there is only one toolbox + if (zrUtil.isArray(toolboxOpt)) { + toolboxOpt = toolboxOpt[0]; + } + + if (toolboxOpt && toolboxOpt.feature) { + var dataZoomOpt = toolboxOpt.feature.dataZoom; + addForAxis('xAxis', dataZoomOpt); + addForAxis('yAxis', dataZoomOpt); + } + } + + function addForAxis(axisName, dataZoomOpt) { + if (!dataZoomOpt) { + return; + } + + var axisIndicesName = axisName + 'Index'; + var givenAxisIndices = dataZoomOpt[axisIndicesName]; + if (givenAxisIndices != null && !zrUtil.isArray(givenAxisIndices)) { + givenAxisIndices = givenAxisIndices === false ? [] : [givenAxisIndices]; + } + + forEachComponent(axisName, function (axisOpt, axisIndex) { + if (givenAxisIndices != null + && zrUtil.indexOf(givenAxisIndices, axisIndex) === -1 + ) { + return; + } + var newOpt = { + type: 'select', + $fromToolbox: true, + // Id for merge mapping. + id: DATA_ZOOM_ID_BASE + axisName + axisIndex + }; + // FIXME + // Only support one axis now. + newOpt[axisIndicesName] = axisIndex; + dataZoomOpts.push(newOpt); + }); + } + + function forEachComponent(mainType, cb) { + var opts = option[mainType]; + if (!zrUtil.isArray(opts)) { + opts = opts ? [opts] : []; + } + each(opts, cb); + } + }); + + module.exports = DataZoom; + + +/***/ }, +/* 340 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file History manager. + */ + + + var zrUtil = __webpack_require__(3); + var each = zrUtil.each; + + var ATTR = '\0_ec_hist_store'; + + var history = { + + /** + * @public + * @param {module:echarts/model/Global} ecModel + * @param {Object} newSnapshot {dataZoomId, batch: [payloadInfo, ...]} + */ + push: function (ecModel, newSnapshot) { + var store = giveStore(ecModel); + + // If previous dataZoom can not be found, + // complete an range with current range. + each(newSnapshot, function (batchItem, dataZoomId) { + var i = store.length - 1; + for (; i >= 0; i--) { + var snapshot = store[i]; + if (snapshot[dataZoomId]) { + break; + } + } + if (i < 0) { + // No origin range set, create one by current range. + var dataZoomModel = ecModel.queryComponents( + {mainType: 'dataZoom', subType: 'select', id: dataZoomId} + )[0]; + if (dataZoomModel) { + var percentRange = dataZoomModel.getPercentRange(); + store[0][dataZoomId] = { + dataZoomId: dataZoomId, + start: percentRange[0], + end: percentRange[1] + }; + } + } + }); + + store.push(newSnapshot); + }, + + /** + * @public + * @param {module:echarts/model/Global} ecModel + * @return {Object} snapshot + */ + pop: function (ecModel) { + var store = giveStore(ecModel); + var head = store[store.length - 1]; + store.length > 1 && store.pop(); + + // Find top for all dataZoom. + var snapshot = {}; + each(head, function (batchItem, dataZoomId) { + for (var i = store.length - 1; i >= 0; i--) { + var batchItem = store[i][dataZoomId]; + if (batchItem) { + snapshot[dataZoomId] = batchItem; + break; + } + } + }); + + return snapshot; + }, + + /** + * @public + */ + clear: function (ecModel) { + ecModel[ATTR] = null; + }, + + /** + * @public + * @param {module:echarts/model/Global} ecModel + * @return {number} records. always >= 1. + */ + count: function (ecModel) { + return giveStore(ecModel).length; + } + + }; + + /** + * [{key: dataZoomId, value: {dataZoomId, range}}, ...] + * History length of each dataZoom may be different. + * this._history[0] is used to store origin range. + * @type {Array.} + */ + function giveStore(ecModel) { + var store = ecModel[ATTR]; + if (!store) { + store = ecModel[ATTR] = [{}]; + } + return store; + } + + module.exports = history; + + + +/***/ }, +/* 341 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * DataZoom component entry + */ + + + __webpack_require__(287); + + __webpack_require__(288); + __webpack_require__(290); + + __webpack_require__(342); + __webpack_require__(343); + + __webpack_require__(298); + __webpack_require__(299); + + + +/***/ }, +/* 342 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @file Data zoom model + */ + + + var DataZoomModel = __webpack_require__(288); + + module.exports = DataZoomModel.extend({ + + type: 'dataZoom.select' + + }); + + + +/***/ }, +/* 343 */ +/***/ function(module, exports, __webpack_require__) { + + + + module.exports = __webpack_require__(290).extend({ + + type: 'dataZoom.select' + + }); + + + +/***/ }, +/* 344 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var history = __webpack_require__(340); + + function Restore(model) { + this.model = model; + } + + Restore.defaultOption = { + show: true, + icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5', + title: '还原' + }; + + var proto = Restore.prototype; + + proto.onclick = function (ecModel, api, type) { + history.clear(ecModel); + + api.dispatchAction({ + type: 'restore', + from: this.uid + }); + }; + + + __webpack_require__(333).register('restore', Restore); + + + __webpack_require__(1).registerAction( + {type: 'restore', event: 'restore', update: 'prepareAndUpdate'}, + function (payload, ecModel) { + ecModel.resetOption('recreate'); + } + ); + + module.exports = Restore; + + +/***/ }, +/* 345 */ +/***/ function(module, exports, __webpack_require__) { + + + __webpack_require__(346); + __webpack_require__(77).registerPainter('vml', __webpack_require__(348)); + + +/***/ }, +/* 346 */ +/***/ function(module, exports, __webpack_require__) { + + // http://www.w3.org/TR/NOTE-VML + // TODO Use proxy like svg instead of overwrite brush methods + + + if (!__webpack_require__(78).canvasSupported) { + var vec2 = __webpack_require__(16); + var BoundingRect = __webpack_require__(15); + var CMD = __webpack_require__(48).CMD; + var colorTool = __webpack_require__(38); + var textContain = __webpack_require__(14); + var RectText = __webpack_require__(47); + var Displayable = __webpack_require__(45); + var ZImage = __webpack_require__(59); + var Text = __webpack_require__(62); + var Path = __webpack_require__(44); + + var Gradient = __webpack_require__(4); + + var vmlCore = __webpack_require__(347); + + var round = Math.round; + var sqrt = Math.sqrt; + var abs = Math.abs; + var cos = Math.cos; + var sin = Math.sin; + var mathMax = Math.max; + + var applyTransform = vec2.applyTransform; + + var comma = ','; + var imageTransformPrefix = 'progid:DXImageTransform.Microsoft'; + + var Z = 21600; + var Z2 = Z / 2; + + var ZLEVEL_BASE = 100000; + var Z_BASE = 1000; + + var initRootElStyle = function (el) { + el.style.cssText = 'position:absolute;left:0;top:0;width:1px;height:1px;'; + el.coordsize = Z + ',' + Z; + el.coordorigin = '0,0'; + }; + + var encodeHtmlAttribute = function (s) { + return String(s).replace(/&/g, '&').replace(/"/g, '"'); + }; + + var rgb2Str = function (r, g, b) { + return 'rgb(' + [r, g, b].join(',') + ')'; + }; + + var append = function (parent, child) { + if (child && parent && child.parentNode !== parent) { + parent.appendChild(child); + } + }; + + var remove = function (parent, child) { + if (child && parent && child.parentNode === parent) { + parent.removeChild(child); + } + }; + + var getZIndex = function (zlevel, z, z2) { + // z 的取值范围为 [0, 1000] + return (parseFloat(zlevel) || 0) * ZLEVEL_BASE + (parseFloat(z) || 0) * Z_BASE + z2; + }; + + var parsePercent = function (value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + }; + + /*************************************************** + * PATH + **************************************************/ + + var setColorAndOpacity = function (el, color, opacity) { + var colorArr = colorTool.parse(color); + opacity = +opacity; + if (isNaN(opacity)) { + opacity = 1; + } + if (colorArr) { + el.color = rgb2Str(colorArr[0], colorArr[1], colorArr[2]); + el.opacity = opacity * colorArr[3]; + } + }; + + var getColorAndAlpha = function (color) { + var colorArr = colorTool.parse(color); + return [ + rgb2Str(colorArr[0], colorArr[1], colorArr[2]), + colorArr[3] + ]; + }; + + var updateFillNode = function (el, style, zrEl) { + // TODO pattern + var fill = style.fill; + if (fill != null) { + // Modified from excanvas + if (fill instanceof Gradient) { + var gradientType; + var angle = 0; + var focus = [0, 0]; + // additional offset + var shift = 0; + // scale factor for offset + var expansion = 1; + var rect = zrEl.getBoundingRect(); + var rectWidth = rect.width; + var rectHeight = rect.height; + if (fill.type === 'linear') { + gradientType = 'gradient'; + var transform = zrEl.transform; + var p0 = [fill.x * rectWidth, fill.y * rectHeight]; + var p1 = [fill.x2 * rectWidth, fill.y2 * rectHeight]; + if (transform) { + applyTransform(p0, p0, transform); + applyTransform(p1, p1, transform); + } + var dx = p1[0] - p0[0]; + var dy = p1[1] - p0[1]; + angle = Math.atan2(dx, dy) * 180 / Math.PI; + // The angle should be a non-negative number. + if (angle < 0) { + angle += 360; + } + + // Very small angles produce an unexpected result because they are + // converted to a scientific notation string. + if (angle < 1e-6) { + angle = 0; + } + } + else { + gradientType = 'gradientradial'; + var p0 = [fill.x * rectWidth, fill.y * rectHeight]; + var transform = zrEl.transform; + var scale = zrEl.scale; + var width = rectWidth; + var height = rectHeight; + focus = [ + // Percent in bounding rect + (p0[0] - rect.x) / width, + (p0[1] - rect.y) / height + ]; + if (transform) { + applyTransform(p0, p0, transform); + } + + width /= scale[0] * Z; + height /= scale[1] * Z; + var dimension = mathMax(width, height); + shift = 2 * 0 / dimension; + expansion = 2 * fill.r / dimension - shift; + } + + // We need to sort the color stops in ascending order by offset, + // otherwise IE won't interpret it correctly. + var stops = fill.colorStops.slice(); + stops.sort(function(cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + var length = stops.length; + // Color and alpha list of first and last stop + var colorAndAlphaList = []; + var colors = []; + for (var i = 0; i < length; i++) { + var stop = stops[i]; + var colorAndAlpha = getColorAndAlpha(stop.color); + colors.push(stop.offset * expansion + shift + ' ' + colorAndAlpha[0]); + if (i === 0 || i === length - 1) { + colorAndAlphaList.push(colorAndAlpha); + } + } + + if (length >= 2) { + var color1 = colorAndAlphaList[0][0]; + var color2 = colorAndAlphaList[1][0]; + var opacity1 = colorAndAlphaList[0][1] * style.opacity; + var opacity2 = colorAndAlphaList[1][1] * style.opacity; + + el.type = gradientType; + el.method = 'none'; + el.focus = '100%'; + el.angle = angle; + el.color = color1; + el.color2 = color2; + el.colors = colors.join(','); + // When colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + el.opacity = opacity2; + // FIXME g_o_:opacity ? + el.opacity2 = opacity1; + } + if (gradientType === 'radial') { + el.focusposition = focus.join(','); + } + } + else { + // FIXME Change from Gradient fill to color fill + setColorAndOpacity(el, fill, style.opacity); + } + } + }; + + var updateStrokeNode = function (el, style) { + if (style.lineJoin != null) { + el.joinstyle = style.lineJoin; + } + if (style.miterLimit != null) { + el.miterlimit = style.miterLimit * Z; + } + if (style.lineCap != null) { + el.endcap = style.lineCap; + } + if (style.lineDash != null) { + el.dashstyle = style.lineDash.join(' '); + } + if (style.stroke != null && !(style.stroke instanceof Gradient)) { + setColorAndOpacity(el, style.stroke, style.opacity); + } + }; + + var updateFillAndStroke = function (vmlEl, type, style, zrEl) { + var isFill = type == 'fill'; + var el = vmlEl.getElementsByTagName(type)[0]; + // Stroke must have lineWidth + if (style[type] != null && style[type] !== 'none' && (isFill || (!isFill && style.lineWidth))) { + vmlEl[isFill ? 'filled' : 'stroked'] = 'true'; + // FIXME Remove before updating, or set `colors` will throw error + if (style[type] instanceof Gradient) { + remove(vmlEl, el); + } + if (!el) { + el = vmlCore.createNode(type); + } + + isFill ? updateFillNode(el, style, zrEl) : updateStrokeNode(el, style); + append(vmlEl, el); + } + else { + vmlEl[isFill ? 'filled' : 'stroked'] = 'false'; + remove(vmlEl, el); + } + }; + + var points = [[], [], []]; + var pathDataToString = function (data, m) { + var M = CMD.M; + var C = CMD.C; + var L = CMD.L; + var A = CMD.A; + var Q = CMD.Q; + + var str = []; + var nPoint; + var cmdStr; + var cmd; + var i; + var xi; + var yi; + for (i = 0; i < data.length;) { + cmd = data[i++]; + cmdStr = ''; + nPoint = 0; + switch (cmd) { + case M: + cmdStr = ' m '; + nPoint = 1; + xi = data[i++]; + yi = data[i++]; + points[0][0] = xi; + points[0][1] = yi; + break; + case L: + cmdStr = ' l '; + nPoint = 1; + xi = data[i++]; + yi = data[i++]; + points[0][0] = xi; + points[0][1] = yi; + break; + case Q: + case C: + cmdStr = ' c '; + nPoint = 3; + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + var x3; + var y3; + if (cmd === Q) { + // Convert quadratic to cubic using degree elevation + x3 = x2; + y3 = y2; + x2 = (x2 + 2 * x1) / 3; + y2 = (y2 + 2 * y1) / 3; + x1 = (xi + 2 * x1) / 3; + y1 = (yi + 2 * y1) / 3; + } + else { + x3 = data[i++]; + y3 = data[i++]; + } + points[0][0] = x1; + points[0][1] = y1; + points[1][0] = x2; + points[1][1] = y2; + points[2][0] = x3; + points[2][1] = y3; + + xi = x3; + yi = y3; + break; + case A: + var x = 0; + var y = 0; + var sx = 1; + var sy = 1; + var angle = 0; + if (m) { + // Extract SRT from matrix + x = m[4]; + y = m[5]; + sx = sqrt(m[0] * m[0] + m[1] * m[1]); + sy = sqrt(m[2] * m[2] + m[3] * m[3]); + angle = Math.atan2(-m[1] / sy, m[0] / sx); + } + + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++] + angle; + var endAngle = data[i++] + startAngle + angle; + // FIXME + // var psi = data[i++]; + i++; + var clockwise = data[i++]; + + var x0 = cx + cos(startAngle) * rx; + var y0 = cy + sin(startAngle) * ry; + + var x1 = cx + cos(endAngle) * rx; + var y1 = cy + sin(endAngle) * ry; + + var type = clockwise ? ' wa ' : ' at '; + // IE won't render arches drawn counter clockwise if x0 == x1. + if (Math.abs(x0 - x1) < 1e-10 && clockwise) { + // Offset x0 by 1/80 of a pixel. Use something + // that can be represented in binary + x0 += 270 / Z; + } + str.push( + type, + round(((cx - rx) * sx + x) * Z - Z2), comma, + round(((cy - ry) * sy + y) * Z - Z2), comma, + round(((cx + rx) * sx + x) * Z - Z2), comma, + round(((cy + ry) * sy + y) * Z - Z2), comma, + round((x0 * sx + x) * Z - Z2), comma, + round((y0 * sy + y) * Z - Z2), comma, + round((x1 * sx + x) * Z - Z2), comma, + round((y1 * sy + y) * Z - Z2) + ); + + xi = x1; + yi = y1; + break; + case CMD.R: + var p0 = points[0]; + var p1 = points[1]; + // x0, y0 + p0[0] = data[i++]; + p0[1] = data[i++]; + // x1, y1 + p1[0] = p0[0] + data[i++]; + p1[1] = p0[1] + data[i++]; + + if (m) { + applyTransform(p0, p0, m); + applyTransform(p1, p1, m); + } + + p0[0] = round(p0[0] * Z - Z2); + p1[0] = round(p1[0] * Z - Z2); + p0[1] = round(p0[1] * Z - Z2); + p1[1] = round(p1[1] * Z - Z2); + str.push( + // x0, y0 + ' m ', p0[0], comma, p0[1], + // x1, y0 + ' l ', p1[0], comma, p0[1], + // x1, y1 + ' l ', p1[0], comma, p1[1], + // x0, y1 + ' l ', p0[0], comma, p1[1] + ); + break; + case CMD.Z: + // FIXME Update xi, yi + str.push(' x '); + } + + if (nPoint > 0) { + str.push(cmdStr); + for (var k = 0; k < nPoint; k++) { + var p = points[k]; + + m && applyTransform(p, p, m); + // 不 round 会非常慢 + str.push( + round(p[0] * Z - Z2), comma, round(p[1] * Z - Z2), + k < nPoint - 1 ? comma : '' + ); + } + } + } + return str.join(''); + }; + + // Rewrite the original path method + Path.prototype.brushVML = function (vmlRoot) { + var style = this.style; + + var vmlEl = this._vmlEl; + if (!vmlEl) { + vmlEl = vmlCore.createNode('shape'); + initRootElStyle(vmlEl); + + this._vmlEl = vmlEl; + } + + updateFillAndStroke(vmlEl, 'fill', style, this); + updateFillAndStroke(vmlEl, 'stroke', style, this); + + var m = this.transform; + var needTransform = m != null; + var strokeEl = vmlEl.getElementsByTagName('stroke')[0]; + if (strokeEl) { + var lineWidth = style.lineWidth; + // Get the line scale. + // Determinant of this.m_ means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + if (needTransform && !style.strokeNoScale) { + var det = m[0] * m[3] - m[1] * m[2]; + lineWidth *= sqrt(abs(det)); + } + strokeEl.weight = lineWidth + 'px'; + } + + var path = this.path; + if (this.__dirtyPath) { + path.beginPath(); + this.buildPath(path, this.shape); + this.__dirtyPath = false; + } + + vmlEl.path = pathDataToString(path.data, this.transform); + + vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Append to root + append(vmlRoot, vmlEl); + + // Text + if (style.text) { + this.drawRectText(vmlRoot, this.getBoundingRect()); + } + }; + + Path.prototype.onRemove = function (vmlRoot) { + remove(vmlRoot, this._vmlEl); + this.removeRectText(vmlRoot); + }; + + Path.prototype.onAdd = function (vmlRoot) { + append(vmlRoot, this._vmlEl); + this.appendRectText(vmlRoot); + }; + + /*************************************************** + * IMAGE + **************************************************/ + var isImage = function (img) { + // FIXME img instanceof Image 如果 img 是一个字符串的时候,IE8 下会报错 + return (typeof img === 'object') && img.tagName && img.tagName.toUpperCase() === 'IMG'; + // return img instanceof Image; + }; + + // Rewrite the original path method + ZImage.prototype.brushVML = function (vmlRoot) { + var style = this.style; + var image = style.image; + + // Image original width, height + var ow; + var oh; + + if (isImage(image)) { + var src = image.src; + if (src === this._imageSrc) { + ow = this._imageWidth; + oh = this._imageHeight; + } + else { + var imageRuntimeStyle = image.runtimeStyle; + var oldRuntimeWidth = imageRuntimeStyle.width; + var oldRuntimeHeight = imageRuntimeStyle.height; + imageRuntimeStyle.width = 'auto'; + imageRuntimeStyle.height = 'auto'; + + // get the original size + ow = image.width; + oh = image.height; + + // and remove overides + imageRuntimeStyle.width = oldRuntimeWidth; + imageRuntimeStyle.height = oldRuntimeHeight; + + // Caching image original width, height and src + this._imageSrc = src; + this._imageWidth = ow; + this._imageHeight = oh; + } + image = src; + } + else { + if (image === this._imageSrc) { + ow = this._imageWidth; + oh = this._imageHeight; + } + } + if (!image) { + return; + } + + var x = style.x || 0; + var y = style.y || 0; + + var dw = style.width; + var dh = style.height; + + var sw = style.sWidth; + var sh = style.sHeight; + var sx = style.sx || 0; + var sy = style.sy || 0; + + var hasCrop = sw && sh; + + var vmlEl = this._vmlEl; + if (!vmlEl) { + // FIXME 使用 group 在 left, top 都不是 0 的时候就无法显示了。 + // vmlEl = vmlCore.createNode('group'); + vmlEl = vmlCore.doc.createElement('div'); + initRootElStyle(vmlEl); + + this._vmlEl = vmlEl; + } + + var vmlElStyle = vmlEl.style; + var hasRotation = false; + var m; + var scaleX = 1; + var scaleY = 1; + if (this.transform) { + m = this.transform; + scaleX = sqrt(m[0] * m[0] + m[1] * m[1]); + scaleY = sqrt(m[2] * m[2] + m[3] * m[3]); + + hasRotation = m[1] || m[2]; + } + if (hasRotation) { + // If filters are necessary (rotation exists), create them + // filters are bog-slow, so only create them if abbsolutely necessary + // The following check doesn't account for skews (which don't exist + // in the canvas spec (yet) anyway. + // From excanvas + var p0 = [x, y]; + var p1 = [x + dw, y]; + var p2 = [x, y + dh]; + var p3 = [x + dw, y + dh]; + applyTransform(p0, p0, m); + applyTransform(p1, p1, m); + applyTransform(p2, p2, m); + applyTransform(p3, p3, m); + + var maxX = mathMax(p0[0], p1[0], p2[0], p3[0]); + var maxY = mathMax(p0[1], p1[1], p2[1], p3[1]); + + var transformFilter = []; + transformFilter.push('M11=', m[0] / scaleX, comma, + 'M12=', m[2] / scaleY, comma, + 'M21=', m[1] / scaleX, comma, + 'M22=', m[3] / scaleY, comma, + 'Dx=', round(x * scaleX + m[4]), comma, + 'Dy=', round(y * scaleY + m[5])); + + vmlElStyle.padding = '0 ' + round(maxX) + 'px ' + round(maxY) + 'px 0'; + // FIXME DXImageTransform 在 IE11 的兼容模式下不起作用 + vmlElStyle.filter = imageTransformPrefix + '.Matrix(' + + transformFilter.join('') + ', SizingMethod=clip)'; + + } + else { + if (m) { + x = x * scaleX + m[4]; + y = y * scaleY + m[5]; + } + vmlElStyle.filter = ''; + vmlElStyle.left = round(x) + 'px'; + vmlElStyle.top = round(y) + 'px'; + } + + var imageEl = this._imageEl; + var cropEl = this._cropEl; + + if (! imageEl) { + imageEl = vmlCore.doc.createElement('div'); + this._imageEl = imageEl; + } + var imageELStyle = imageEl.style; + if (hasCrop) { + // Needs know image original width and height + if (! (ow && oh)) { + var tmpImage = new Image(); + var self = this; + tmpImage.onload = function () { + tmpImage.onload = null; + ow = tmpImage.width; + oh = tmpImage.height; + // Adjust image width and height to fit the ratio destinationSize / sourceSize + imageELStyle.width = round(scaleX * ow * dw / sw) + 'px'; + imageELStyle.height = round(scaleY * oh * dh / sh) + 'px'; + + // Caching image original width, height and src + self._imageWidth = ow; + self._imageHeight = oh; + self._imageSrc = image; + }; + tmpImage.src = image; + } + else { + imageELStyle.width = round(scaleX * ow * dw / sw) + 'px'; + imageELStyle.height = round(scaleY * oh * dh / sh) + 'px'; + } + + if (! cropEl) { + cropEl = vmlCore.doc.createElement('div'); + cropEl.style.overflow = 'hidden'; + this._cropEl = cropEl; + } + var cropElStyle = cropEl.style; + cropElStyle.width = round((dw + sx * dw / sw) * scaleX); + cropElStyle.height = round((dh + sy * dh / sh) * scaleY); + cropElStyle.filter = imageTransformPrefix + '.Matrix(Dx=' + + (-sx * dw / sw * scaleX) + ',Dy=' + (-sy * dh / sh * scaleY) + ')'; + + if (! cropEl.parentNode) { + vmlEl.appendChild(cropEl); + } + if (imageEl.parentNode != cropEl) { + cropEl.appendChild(imageEl); + } + } + else { + imageELStyle.width = round(scaleX * dw) + 'px'; + imageELStyle.height = round(scaleY * dh) + 'px'; + + vmlEl.appendChild(imageEl); + + if (cropEl && cropEl.parentNode) { + vmlEl.removeChild(cropEl); + this._cropEl = null; + } + } + + var filterStr = ''; + var alpha = style.opacity; + if (alpha < 1) { + filterStr += '.Alpha(opacity=' + round(alpha * 100) + ') '; + } + filterStr += imageTransformPrefix + '.AlphaImageLoader(src=' + image + ', SizingMethod=scale)'; + + imageELStyle.filter = filterStr; + + vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Append to root + append(vmlRoot, vmlEl); + + // Text + if (style.text) { + this.drawRectText(vmlRoot, this.getBoundingRect()); + } + }; + + ZImage.prototype.onRemove = function (vmlRoot) { + remove(vmlRoot, this._vmlEl); + + this._vmlEl = null; + this._cropEl = null; + this._imageEl = null; + + this.removeRectText(vmlRoot); + }; + + ZImage.prototype.onAdd = function (vmlRoot) { + append(vmlRoot, this._vmlEl); + this.appendRectText(vmlRoot); + }; + + + /*************************************************** + * TEXT + **************************************************/ + + var DEFAULT_STYLE_NORMAL = 'normal'; + + var fontStyleCache = {}; + var fontStyleCacheCount = 0; + var MAX_FONT_CACHE_SIZE = 100; + var fontEl = document.createElement('div'); + + var getFontStyle = function (fontString) { + var fontStyle = fontStyleCache[fontString]; + if (!fontStyle) { + // Clear cache + if (fontStyleCacheCount > MAX_FONT_CACHE_SIZE) { + fontStyleCacheCount = 0; + fontStyleCache = {}; + } + + var style = fontEl.style; + var fontFamily; + try { + style.font = fontString; + fontFamily = style.fontFamily.split(',')[0]; + } + catch (e) { + } + + fontStyle = { + style: style.fontStyle || DEFAULT_STYLE_NORMAL, + variant: style.fontVariant || DEFAULT_STYLE_NORMAL, + weight: style.fontWeight || DEFAULT_STYLE_NORMAL, + size: parseFloat(style.fontSize || 12) | 0, + family: fontFamily || 'Microsoft YaHei' + }; + + fontStyleCache[fontString] = fontStyle; + fontStyleCacheCount++; + } + return fontStyle; + }; + + var textMeasureEl; + // Overwrite measure text method + textContain.measureText = function (text, textFont) { + var doc = vmlCore.doc; + if (!textMeasureEl) { + textMeasureEl = doc.createElement('div'); + textMeasureEl.style.cssText = 'position:absolute;top:-20000px;left:0;' + + 'padding:0;margin:0;border:none;white-space:pre;'; + vmlCore.doc.body.appendChild(textMeasureEl); + } + + try { + textMeasureEl.style.font = textFont; + } catch (ex) { + // Ignore failures to set to invalid font. + } + textMeasureEl.innerHTML = ''; + // Don't use innerHTML or innerText because they allow markup/whitespace. + textMeasureEl.appendChild(doc.createTextNode(text)); + return { + width: textMeasureEl.offsetWidth + }; + }; + + var tmpRect = new BoundingRect(); + + var drawRectText = function (vmlRoot, rect, textRect, fromTextEl) { + + var style = this.style; + var text = style.text; + if (!text) { + return; + } + + var x; + var y; + var align = style.textAlign; + var fontStyle = getFontStyle(style.textFont); + // FIXME encodeHtmlAttribute ? + var font = fontStyle.style + ' ' + fontStyle.variant + ' ' + fontStyle.weight + ' ' + + fontStyle.size + 'px "' + fontStyle.family + '"'; + var baseline = style.textBaseline; + var verticalAlign = style.textVerticalAlign; + + textRect = textRect || textContain.getBoundingRect(text, font, align, baseline); + + // Transform rect to view space + var m = this.transform; + // Ignore transform for text in other element + if (m && !fromTextEl) { + tmpRect.copy(rect); + tmpRect.applyTransform(m); + rect = tmpRect; + } + + if (!fromTextEl) { + var textPosition = style.textPosition; + var distance = style.textDistance; + // Text position represented by coord + if (textPosition instanceof Array) { + x = rect.x + parsePercent(textPosition[0], rect.width); + y = rect.y + parsePercent(textPosition[1], rect.height); + + align = align || 'left'; + baseline = baseline || 'top'; + } + else { + var res = textContain.adjustTextPositionOnRect( + textPosition, rect, textRect, distance + ); + x = res.x; + y = res.y; + + // Default align and baseline when has textPosition + align = align || res.textAlign; + baseline = baseline || res.textBaseline; + } + } + else { + x = rect.x; + y = rect.y; + } + if (verticalAlign) { + switch (verticalAlign) { + case 'middle': + y -= textRect.height / 2; + break; + case 'bottom': + y -= textRect.height; + break; + // 'top' + } + // Ignore baseline + baseline = 'top'; + } + + var fontSize = fontStyle.size; + // 1.75 is an arbitrary number, as there is no info about the text baseline + switch (baseline) { + case 'hanging': + case 'top': + y += fontSize / 1.75; + break; + case 'middle': + break; + default: + // case null: + // case 'alphabetic': + // case 'ideographic': + // case 'bottom': + y -= fontSize / 2.25; + break; + } + switch (align) { + case 'left': + break; + case 'center': + x -= textRect.width / 2; + break; + case 'right': + x -= textRect.width; + break; + // case 'end': + // align = elementStyle.direction == 'ltr' ? 'right' : 'left'; + // break; + // case 'start': + // align = elementStyle.direction == 'rtl' ? 'right' : 'left'; + // break; + // default: + // align = 'left'; + } + + var createNode = vmlCore.createNode; + + var textVmlEl = this._textVmlEl; + var pathEl; + var textPathEl; + var skewEl; + if (!textVmlEl) { + textVmlEl = createNode('line'); + pathEl = createNode('path'); + textPathEl = createNode('textpath'); + skewEl = createNode('skew'); + + // FIXME Why here is not cammel case + // Align 'center' seems wrong + textPathEl.style['v-text-align'] = 'left'; + + initRootElStyle(textVmlEl); + + pathEl.textpathok = true; + textPathEl.on = true; + + textVmlEl.from = '0 0'; + textVmlEl.to = '1000 0.05'; + + append(textVmlEl, skewEl); + append(textVmlEl, pathEl); + append(textVmlEl, textPathEl); + + this._textVmlEl = textVmlEl; + } + else { + // 这里是在前面 appendChild 保证顺序的前提下 + skewEl = textVmlEl.firstChild; + pathEl = skewEl.nextSibling; + textPathEl = pathEl.nextSibling; + } + + var coords = [x, y]; + var textVmlElStyle = textVmlEl.style; + // Ignore transform for text in other element + if (m && fromTextEl) { + applyTransform(coords, coords, m); + + skewEl.on = true; + + skewEl.matrix = m[0].toFixed(3) + comma + m[2].toFixed(3) + comma + + m[1].toFixed(3) + comma + m[3].toFixed(3) + ',0,0'; + + // Text position + skewEl.offset = (round(coords[0]) || 0) + ',' + (round(coords[1]) || 0); + // Left top point as origin + skewEl.origin = '0 0'; + + textVmlElStyle.left = '0px'; + textVmlElStyle.top = '0px'; + } + else { + skewEl.on = false; + textVmlElStyle.left = round(x) + 'px'; + textVmlElStyle.top = round(y) + 'px'; + } + + textPathEl.string = encodeHtmlAttribute(text); + // TODO + try { + textPathEl.style.font = font; + } + // Error font format + catch (e) {} + + updateFillAndStroke(textVmlEl, 'fill', { + fill: fromTextEl ? style.fill : style.textFill, + opacity: style.opacity + }, this); + updateFillAndStroke(textVmlEl, 'stroke', { + stroke: fromTextEl ? style.stroke : style.textStroke, + opacity: style.opacity, + lineDash: style.lineDash + }, this); + + textVmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Attached to root + append(vmlRoot, textVmlEl); + }; + + var removeRectText = function (vmlRoot) { + remove(vmlRoot, this._textVmlEl); + this._textVmlEl = null; + }; + + var appendRectText = function (vmlRoot) { + append(vmlRoot, this._textVmlEl); + }; + + var list = [RectText, Displayable, ZImage, Path, Text]; + + // In case Displayable has been mixed in RectText + for (var i = 0; i < list.length; i++) { + var proto = list[i].prototype; + proto.drawRectText = drawRectText; + proto.removeRectText = removeRectText; + proto.appendRectText = appendRectText; + } + + Text.prototype.brushVML = function (root) { + var style = this.style; + if (style.text) { + this.drawRectText(root, { + x: style.x || 0, y: style.y || 0, + width: 0, height: 0 + }, this.getBoundingRect(), true); + } + }; + + Text.prototype.onRemove = function (vmlRoot) { + this.removeRectText(vmlRoot); + }; + + Text.prototype.onAdd = function (vmlRoot) { + this.appendRectText(vmlRoot); + }; + } + + +/***/ }, +/* 347 */ +/***/ function(module, exports, __webpack_require__) { + + + + if (!__webpack_require__(78).canvasSupported) { + var urn = 'urn:schemas-microsoft-com:vml'; + + var createNode; + var win = window; + var doc = win.document; + + var vmlInited = false; + + try { + !doc.namespaces.zrvml && doc.namespaces.add('zrvml', urn); + createNode = function (tagName) { + return doc.createElement(''); + }; + } + catch (e) { + createNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="' + urn + '" class="zrvml">'); + }; + } + + // From raphael + var initVML = function () { + if (vmlInited) { + return; + } + vmlInited = true; + + var styleSheets = doc.styleSheets; + if (styleSheets.length < 31) { + doc.createStyleSheet().addRule('.zrvml', 'behavior:url(#default#VML)'); + } + else { + // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx + styleSheets[0].addRule('.zrvml', 'behavior:url(#default#VML)'); + } + }; + + // Not useing return to avoid error when converting to CommonJS module + module.exports = { + doc: doc, + initVML: initVML, + createNode: createNode + }; + } + + +/***/ }, +/* 348 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * VML Painter. + * + * @module zrender/vml/Painter + */ + + + + var zrLog = __webpack_require__(39); + var vmlCore = __webpack_require__(347); + + function parseInt10(val) { + return parseInt(val, 10); + } + + /** + * @alias module:zrender/vml/Painter + */ + function VMLPainter(root, storage) { + + vmlCore.initVML(); + + this.root = root; + + this.storage = storage; + + var vmlViewport = document.createElement('div'); + + var vmlRoot = document.createElement('div'); + + vmlViewport.style.cssText = 'display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;'; + + vmlRoot.style.cssText = 'position:absolute;left:0;top:0;'; + + root.appendChild(vmlViewport); + + this._vmlRoot = vmlRoot; + this._vmlViewport = vmlViewport; + + this.resize(); + + // Modify storage + var oldDelFromMap = storage.delFromMap; + var oldAddToMap = storage.addToMap; + storage.delFromMap = function (elId) { + var el = storage.get(elId); + + oldDelFromMap.call(storage, elId); + + if (el) { + el.onRemove && el.onRemove(vmlRoot); + } + }; + + storage.addToMap = function (el) { + // Displayable already has a vml node + el.onAdd && el.onAdd(vmlRoot); + + oldAddToMap.call(storage, el); + }; + + this._firstPaint = true; + } + + VMLPainter.prototype = { + + constructor: VMLPainter, + + /** + * @return {HTMLDivElement} + */ + getViewportRoot: function () { + return this._vmlViewport; + }, + + /** + * 刷新 + */ + refresh: function () { + + var list = this.storage.getDisplayList(true, true); + + this._paintList(list); + }, + + _paintList: function (list) { + var vmlRoot = this._vmlRoot; + for (var i = 0; i < list.length; i++) { + var el = list[i]; + if (el.invisible || el.ignore) { + if (!el.__alreadyNotVisible) { + el.onRemove(vmlRoot); + } + // Set as already invisible + el.__alreadyNotVisible = true; + } + else { + if (el.__alreadyNotVisible) { + el.onAdd(vmlRoot); + } + el.__alreadyNotVisible = false; + if (el.__dirty) { + el.beforeBrush && el.beforeBrush(); + (el.brushVML || el.brush).call(el, vmlRoot); + el.afterBrush && el.afterBrush(); + } + } + el.__dirty = false; + } + + if (this._firstPaint) { + // Detached from document at first time + // to avoid page refreshing too many times + + // FIXME 如果每次都先 removeChild 可能会导致一些填充和描边的效果改变 + this._vmlViewport.appendChild(vmlRoot); + this._firstPaint = false; + } + }, + + resize: function () { + var width = this._getWidth(); + var height = this._getHeight(); + + if (this._width != width && this._height != height) { + this._width = width; + this._height = height; + + var vmlViewportStyle = this._vmlViewport.style; + vmlViewportStyle.width = width + 'px'; + vmlViewportStyle.height = height + 'px'; + } + }, + + dispose: function () { + this.root.innerHTML = ''; + + this._vmlRoot = + this._vmlViewport = + this.storage = null; + }, + + getWidth: function () { + return this._width; + }, + + getHeight: function () { + return this._height; + }, + + _getWidth: function () { + var root = this.root; + var stl = root.currentStyle; + + return ((root.clientWidth || parseInt10(stl.width)) + - parseInt10(stl.paddingLeft) + - parseInt10(stl.paddingRight)) | 0; + }, + + _getHeight: function () { + var root = this.root; + var stl = root.currentStyle; + + return ((root.clientHeight || parseInt10(stl.height)) + - parseInt10(stl.paddingTop) + - parseInt10(stl.paddingBottom)) | 0; + } + }; + + // Not supported methods + function createMethodNotSupport(method) { + return function () { + zrLog('In IE8.0 VML mode painter not support method "' + method + '"'); + }; + } + + var notSupportedMethods = [ + 'getLayer', 'insertLayer', 'eachLayer', 'eachBuildinLayer', 'eachOtherLayer', 'getLayers', + 'modLayer', 'delLayer', 'clearLayer', 'toDataURL', 'pathToImage' + ]; + + for (var i = 0; i < notSupportedMethods.length; i++) { + var name = notSupportedMethods[i]; + VMLPainter.prototype[name] = createMethodNotSupport(name); + } + + module.exports = VMLPainter; + + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.min.js b/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.min.js new file mode 100644 index 0000000..7ef0f5b --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.min.js @@ -0,0 +1,32 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(n){if(i[n])return i[n].exports;var a=i[n]={exports:{},id:n,loaded:!1};return t[n].call(a.exports,a,a.exports,e),a.loaded=!0,a.exports}var i={};return e.m=t,e.c=i,e.p="",e(0)}([function(t,e,i){t.exports=i(2),i(85),i(79),i(90),i(163),i(279),i(268),i(289),i(246),i(242),i(238),i(275),i(284),i(224),i(229),i(235),i(264),i(257),i(34),i(176),i(196),i(304),i(301),i(211),i(187),i(166),i(317),i(182),i(181),i(308),i(188),i(204)},function(t,e,i){function n(t){if("object"==typeof t&&null!==t){var e=t;if(t instanceof Array){e=[];for(var i=0,a=t.length;a>i;i++)e[i]=n(t[i])}else if(!A(t)&&!I(t)){e={};for(var o in t)t.hasOwnProperty(o)&&(e[o]=n(t[o]))}return e}return t}function a(t,e,i){if(!S(e)||!S(t))return i?n(e):t;for(var o in e)if(e.hasOwnProperty(o)){var r=t[o],s=e[o];!S(s)||!S(r)||w(s)||w(r)||I(s)||I(r)||A(s)||A(r)?!i&&o in t||(t[o]=n(e[o],!0)):a(r,s,i)}return t}function o(t,e){for(var i=t[0],n=1,o=t.length;o>n;n++)i=a(i,t[n],e);return i}function r(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function s(t,e,i){for(var n in e)e.hasOwnProperty(n)&&(i?null!=e[n]:null==t[n])&&(t[n]=e[n]);return t}function l(){return document.createElement("canvas")}function h(){return D||(D=G.createCanvas().getContext("2d")),D}function u(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i}return-1}function c(t,e){function i(){}var n=t.prototype;i.prototype=e.prototype,t.prototype=new i;for(var a in n)t.prototype[a]=n[a];t.prototype.constructor=t,t.superClass=e}function d(t,e,i){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,s(t,e,i)}function f(t){return t?"string"==typeof t?!1:"number"==typeof t.length:void 0}function p(t,e,i){if(t&&e)if(t.forEach&&t.forEach===E)t.forEach(e,i);else if(t.length===+t.length)for(var n=0,a=t.length;a>n;n++)e.call(i,t[n],n,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(i,t[o],o,t)}function g(t,e,i){if(t&&e){if(t.map&&t.map===N)return t.map(e,i);for(var n=[],a=0,o=t.length;o>a;a++)n.push(e.call(i,t[a],a,t));return n}}function m(t,e,i,n){if(t&&e){if(t.reduce&&t.reduce===B)return t.reduce(e,i,n);for(var a=0,o=t.length;o>a;a++)i=e.call(n,i,t[a],a,t);return i}}function v(t,e,i){if(t&&e){if(t.filter&&t.filter===O)return t.filter(e,i);for(var n=[],a=0,o=t.length;o>a;a++)e.call(i,t[a],a,t)&&n.push(t[a]);return n}}function y(t,e,i){if(t&&e)for(var n=0,a=t.length;a>n;n++)if(e.call(i,t[n],n,t))return t[n]}function x(t,e){var i=V.call(arguments,2);return function(){return t.apply(e,i.concat(V.call(arguments)))}}function _(t){var e=V.call(arguments,1);return function(){return t.apply(this,e.concat(V.call(arguments)))}}function w(t){return"[object Array]"===z.call(t)}function b(t){return"function"==typeof t}function M(t){return"[object String]"===z.call(t)}function S(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function A(t){return!!k[z.call(t)]||t instanceof P}function I(t){return t&&1===t.nodeType&&"string"==typeof t.nodeName}function T(t){for(var e=0,i=arguments.length;i>e;e++)if(null!=arguments[e])return arguments[e]}function C(){return Function.call.apply(V,arguments)}function L(t,e){if(!t)throw new Error(e)}var D,P=i(16),k={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1},z=Object.prototype.toString,R=Array.prototype,E=R.forEach,O=R.filter,V=R.slice,N=R.map,B=R.reduce,G={inherits:c,mixin:d,clone:n,merge:a,mergeAll:o,extend:r,defaults:s,getContext:h,createCanvas:l,indexOf:u,slice:C,find:y,isArrayLike:f,each:p,map:g,reduce:m,filter:v,bind:x,curry:_,isArray:w,isString:M,isObject:S,isFunction:b,isBuildInObject:A,isDom:I,retrieve:T,assert:L,noop:function(){}};t.exports=G},function(t,e,i){function n(t){return function(e,i,n){e=e&&e.toLowerCase(),L.prototype[t].call(this,e,i,n)}}function a(){L.call(this)}function o(t,e,i){i=i||{},"string"==typeof e&&(e=H[e]),e&&D(F,function(t){t(e)}),this.id,this.group,this._dom=t,this._zr=A.init(t,{renderer:i.renderer||"canvas",devicePixelRatio:i.devicePixelRatio}),this._theme=I.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._api=new v(this),this._coordSysMgr=new y,L.call(this),this._messageCenter=new a,this._initEvents(),this.resize=I.bind(this.resize,this)}function r(t,e){var i=this._model;i&&i.eachComponent({mainType:"series",query:e},function(n,a){var o=this._chartsMap[n.__viewId];o&&o.__alive&&o[t](n,i,this._api,e)},this)}function s(t,e,i){var n=this._api;D(this._componentsViews,function(a){var o=a.__model;a[t](o,e,n,i),p(o,a)},this),e.eachSeries(function(a,o){var r=this._chartsMap[a.__viewId];r[t](a,e,n,i),p(a,r)},this)}function l(t,e){for(var i="component"===t,n=i?this._componentsViews:this._chartsViews,a=i?this._componentsMap:this._chartsMap,o=this._zr,r=0;r=0?"white":i,o=e.getModel("textStyle");f.extend(t,{textDistance:e.getShallow("distance")||5,textFont:o.getFont(),textPosition:n,textFill:o.getTextColor()||a})},w.updateProps=f.curry(d,!0),w.initProps=f.curry(d,!1),w.getTransform=function(t,e){for(var i=y.identity([]);t&&t!==e;)y.mul(i,t.getLocalTransform(),i),t=t.parent;return i},w.applyTransform=function(t,e,i){return i&&(e=y.invert([],e)),x.applyTransform([],t,e)},w.transformDirection=function(t,e,i){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),a=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-n:"right"===t?n:0,"top"===t?-a:"bottom"===t?a:0];return o=w.applyTransform(o,e,i),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"},t.exports=w},function(t,e){function i(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}var n={},a=1e-4;n.linearMap=function(t,e,i,n){var a=e[1]-e[0];if(0===a)return(i[0]+i[1])/2;var o=(t-e[0])/a;return n&&(o=Math.min(Math.max(o,0),1)),o*(i[1]-i[0])+i[0]},n.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?i(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},n.round=function(t){return+(+t).toFixed(12)},n.asc=function(t){return t.sort(function(t,e){return t-e}),t},n.getPrecision=function(t){if(isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i},n.getPixelPrecision=function(t,e){var i=Math.log,n=Math.LN10,a=Math.floor(i(t[1]-t[0])/n),o=Math.round(i(Math.abs(e[1]-e[0]))/n);return Math.max(-a+o,0)},n.MAX_SAFE_INTEGER=9007199254740991,n.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},n.isRadianAroundZero=function(t){return t>-a&&a>t},n.parseDate=function(t){return t instanceof Date?t:new Date("string"==typeof t?t.replace(/-/g,"/"):Math.round(t))},n.nice=function(t,e){var i,n=Math.floor(Math.log(t)/Math.LN10),a=Math.pow(10,n),o=t/a;return i=e?1.5>o?1:2.5>o?2:4>o?3:7>o?5:10:1>o?1:2>o?2:3>o?3:5>o?5:10,i*a},t.exports=n},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(t,e){var n=new i(2);return n[0]=t||0,n[1]=e||0,n},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new i(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,i){return t[0]=e,t[1]=i,t},add:function(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t},scaleAndAdd:function(t,e,i,n){return t[0]=e[0]+i[0]*n,t[1]=e[1]+i[1]*n,t},sub:function(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,i){return t[0]=e[0]*i[0],t[1]=e[1]*i[1],t},div:function(t,e,i){return t[0]=e[0]/i[0],t[1]=e[1]/i[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t},normalize:function(t,e){var i=n.len(e);return 0===i?(t[0]=0,t[1]=0):(t[0]=e[0]/i,t[1]=e[1]/i),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,i,n){return t[0]=e[0]+n*(i[0]-e[0]),t[1]=e[1]+n*(i[1]-e[1]),t},applyTransform:function(t,e,i){var n=e[0],a=e[1];return t[0]=i[0]*n+i[2]*a+i[4],t[1]=i[1]*n+i[3]*a+i[5],t},min:function(t,e,i){return t[0]=Math.min(e[0],i[0]),t[1]=Math.min(e[1],i[1]),t},max:function(t,e,i){return t[0]=Math.max(e[0],i[0]),t[1]=Math.max(e[1],i[1]),t}};n.length=n.len,n.lengthSquare=n.lenSquare,n.dist=n.distance,n.distSquare=n.distanceSquare,t.exports=n},function(t,e,i){function n(t){var e=t.fill;return null!=e&&"none"!==e}function a(t){var e=t.stroke;return null!=e&&"none"!==e&&t.lineWidth>0}function o(t){r.call(this,t),this.path=new l}var r=i(35),s=i(1),l=i(27),h=i(137),u=i(16),c=Math.abs;o.prototype={constructor:o,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t){t.save();var e=this.style,i=this.path,o=a(e),r=n(e);this.__dirtyPath&&(r&&e.fill instanceof u&&e.fill.updateCanvasGradient(this,t),o&&e.stroke instanceof u&&e.stroke.updateCanvasGradient(this,t)),e.bind(t,this),this.setTransform(t);var s=e.lineDash,l=e.lineDashOffset,h=!!t.setLineDash;this.__dirtyPath||s&&!h&&o?(i=this.path.beginPath(t),s&&!h&&(i.setLineDash(s),i.setLineDashOffset(l)),this.buildPath(i,this.shape),this.__dirtyPath=!1):(t.beginPath(),this.path.rebuildPath(t)),r&&i.fill(t),s&&h&&(t.setLineDash(s),t.lineDashOffset=l),o&&i.stroke(t),null!=e.text&&this.drawRectText(t,this.getBoundingRect()),t.restore()},buildPath:function(t,e){},getBoundingRect:function(){var t=this._rect,e=this.style,i=!t;if(i){var o=this.path;this.__dirtyPath&&(o.beginPath(),this.buildPath(o,this.shape)),t=o.getBoundingRect()}if(this._rect=t,a(e)){var r=this._rectWithStroke;if(this.__dirty||i){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());r.copy(t);var s=e.lineWidth,l=e.strokeNoScale?this.getLineScale():1;n(e)||(s=Math.max(s,this.strokeContainThreshold)),l>1e-10&&(r.width+=s/l,r.height+=s/l,r.x-=s/l/2,r.y-=s/l/2)}return r}return t},contain:function(t,e){var i=this.transformCoordToLocal(t,e),o=this.getBoundingRect(),r=this.style;if(t=i[0],e=i[1],o.contain(t,e)){var s=this.path.data;if(a(r)){var l=r.lineWidth,u=r.strokeNoScale?this.getLineScale():1;if(u>1e-10&&(n(r)||(l=Math.max(l,this.strokeContainThreshold)),h.containStroke(s,l/u,t,e)))return!0}if(n(r))return h.contain(s,t,e)}return!1},dirty:function(t){0===arguments.length&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?this.setShape(e):r.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var i=this.shape;if(i){if(s.isObject(t))for(var n in t)i[n]=t[n];else i[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&c(t[0]-1)>1e-10&&c(t[3]-1)>1e-10?Math.sqrt(c(t[0]*t[3]-t[2]*t[1])):1}},o.extend=function(t){var e=function(e){o.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var i=t.shape;if(i){this.shape=this.shape||{};var n=this.shape;for(var a in i)!n.hasOwnProperty(a)&&i.hasOwnProperty(a)&&(n[a]=i[a])}t.init&&t.init.call(this,e)};s.inherits(e,o);for(var i in t)"style"!==i&&"shape"!==i&&(e.prototype[i]=t[i]);return e},s.inherits(o,r),t.exports=o},function(t,e,i){var n=i(9),a=i(4),o=i(1),r=i(12),s=["x","y","z","radius","angle"],l={};l.createNameEach=function(t,e){t=t.slice();var i=o.map(t,l.capitalFirst);e=(e||[]).slice();var n=o.map(e,l.capitalFirst);return function(a,r){o.each(t,function(t,o){for(var s={name:t,capital:i[o]},l=0;l=0}function a(t,n){var a=!1;return e(function(e){o.each(i(t,e)||[],function(t){n.records[e.name][t]&&(a=!0)})}),a}function r(t,n){n.nodes.push(t),e(function(e){o.each(i(t,e)||[],function(t){n.records[e.name][t]=!0})})}return function(i){function o(t){!n(t,s)&&a(t,s)&&(r(t,s),l=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!i)return s;r(i,s);var l;do l=!1,t(o);while(l);return s}},l.defaultEmphasis=function(t,e){if(t){var i=t.emphasis=t.emphasis||{},n=t.normal=t.normal||{};o.each(e,function(t){var e=o.retrieve(i[t],n[t]);null!=e&&(i[t]=e)})}},l.createDataFormatModel=function(t,e,i){var n=new r;return o.mixin(n,l.dataFormatMixin),n.seriesIndex=t.seriesIndex,n.name=t.name||"",n.getData=function(){return e},n.getRawDataArray=function(){return i},n},l.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},l.converDataValue=function(t,e){var i=e&&e.type;return"ordinal"===i?t:("time"!==i||isFinite(t)||null==t||"-"===t||(t=+a.parseDate(t)),null==t||""===t?NaN:+t)},l.dataFormatMixin={getDataParams:function(t){var e=this.getData(),i=this.seriesIndex,n=this.name,a=this.getRawValue(t),o=e.getRawIndex(t),r=e.getName(t,!0),s=this.getRawDataArray(),l=s&&s[o];return{seriesIndex:i,seriesName:n,name:r,dataIndex:o,data:l,value:a,color:e.getItemVisual(t,"color"),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,i){e=e||"normal";var a=this.getData(),o=a.getItemModel(t),r=this.getDataParams(t);return null==i&&(i=o.get(["label",e,"formatter"])),"function"==typeof i?(r.status=e,i(r)):"string"==typeof i?n.formatTpl(i,r):void 0},getRawValue:function(t){var e=this.getData().getItemModel(t);if(e&&null!=e.option){var i=e.option;return o.isObject(i)&&!o.isArray(i)?i.value:i}}},l.mappingToExists=function(t,e){e=(e||[]).slice();var i=o.map(t||[],function(t,e){return{exist:t}});return o.each(e,function(t,n){if(o.isObject(t))for(var a=0;a=i.length&&i.push({option:t})}}),i},l.isIdInner=function(t){return o.isObject(t)&&t.id&&0===(t.id+"").indexOf("\x00_ec_\x00")},t.exports=l},function(t,e,i){"use strict";function n(t,e,i,n){this.x=t,this.y=e,this.width=i,this.height=n}var a=i(5),o=i(19),r=a.applyTransform,s=Math.min,l=Math.abs,h=Math.max;n.prototype={constructor:n,union:function(t){var e=s(t.x,this.x),i=s(t.y,this.y);this.width=h(t.x+t.width,this.x+this.width)-e,this.height=h(t.y+t.height,this.y+this.height)-i,this.x=e,this.y=i},applyTransform:function(){var t=[],e=[];return function(i){i&&(t[0]=this.x,t[1]=this.y,e[0]=this.x+this.width,e[1]=this.y+this.height,r(t,t,i),r(e,e,i),this.x=s(t[0],e[0]),this.y=s(t[1],e[1]),this.width=l(e[0]-t[0]),this.height=l(e[1]-t[1]))}}(),calculateTransform:function(t){var e=this,i=t.width/e.width,n=t.height/e.height,a=o.create();return o.translate(a,a,[-e.x,-e.y]),o.scale(a,a,[i,n]),o.translate(a,a,[t.x,t.y]),a},intersect:function(t){var e=this,i=e.x,n=e.x+e.width,a=e.y,o=e.y+e.height,r=t.x,s=t.x+t.width,l=t.y,h=t.y+t.height;return!(r>n||i>s||l>o||a>h)},contain:function(t,e){var i=this;return t>=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new n(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height}},t.exports=n},function(t,e,i){function n(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))}function a(t){return t.toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()})}function o(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function r(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function s(t,e){return"{"+t+(null==e?"":e)+"}"}function l(t,e){c.isArray(e)||(e=[e]);var i=e.length;if(!i)return"";for(var n=e[0].$vars,a=0;ar;r++)for(var l=0;lt?"0"+t:t}var c=i(1),d=i(4),f=["a","b","c","d","e","f","g"];t.exports={normalizeCssArray:o,addCommas:n,toCamelCase:a,encodeHTML:r,formatTpl:l,formatTime:h}},function(t,e,i){function n(t){var e=[];return o.each(u.getClassesByMainType(t),function(t){r.apply(e,t.prototype.dependencies||[])}),o.map(e,function(t){return l.parseClassType(t).main})}var a=i(12),o=i(1),r=Array.prototype.push,s=i(41),l=i(20),h=i(11),u=a.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,init:function(t,e,i,n){this.mergeDefaultAndTheme(this.option,this.ecModel)},mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?h.getLayoutParams(t):{},a=e.getTheme();o.merge(t,a.get(this.mainType)),o.merge(t,this.getDefaultOption()),i&&h.mergeLayoutParam(t,n,i)},mergeOption:function(t){o.merge(this.option,t,!0);var e=this.layoutMode;e&&h.mergeLayoutParam(this.option,t,e)},optionUpdated:function(t){},getDefaultOption:function(){if(!this.hasOwnProperty("__defaultOption")){for(var t=[],e=this.constructor;e;){var i=e.prototype.defaultOption;i&&t.push(i),e=e.superClass}for(var n={},a=t.length-1;a>=0;a--)n=o.merge(n,t[a],!0);this.__defaultOption=n}return this.__defaultOption}});l.enableClassExtend(u,function(t,e,i,n){o.extend(this,n),this.uid=s.getUID("componentModel")}),l.enableClassManagement(u,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(u),s.enableTopologicalTravel(u,n),o.mixin(u,i(116)),t.exports=u},function(t,e,i){"use strict";function n(t,e,i,n,a){var o=0,r=0;null==n&&(n=1/0),null==a&&(a=1/0);var s=0;e.eachChild(function(l,h){var u,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);u=o+m,u>n||l.newline?(o=0,u=m,r+=s+i,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);c=r+v,c>a||l.newline?(o+=s+i,r=0,c=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=r,"horizontal"===t?o=u+i:r=c+i)})}var a=i(1),o=i(8),r=i(4),s=i(9),l=r.parsePercent,h=a.each,u={},c=["left","right","top","bottom","width","height"];u.box=n,u.vbox=a.curry(n,"vertical"),u.hbox=a.curry(n,"horizontal"),u.getAvailableSize=function(t,e,i){var n=e.width,a=e.height,o=l(t.x,n),r=l(t.y,a),h=l(t.x2,n),u=l(t.y2,a);return(isNaN(o)||isNaN(parseFloat(t.x)))&&(o=0),(isNaN(h)||isNaN(parseFloat(t.x2)))&&(h=n),(isNaN(r)||isNaN(parseFloat(t.y)))&&(r=0),(isNaN(u)||isNaN(parseFloat(t.y2)))&&(u=a),i=s.normalizeCssArray(i||0),{width:Math.max(h-o-i[1]-i[3],0),height:Math.max(u-r-i[0]-i[2],0)}},u.getLayoutRect=function(t,e,i){i=s.normalizeCssArray(i||0);var n=e.width,a=e.height,r=l(t.left,n),h=l(t.top,a),u=l(t.right,n),c=l(t.bottom,a),d=l(t.width,n),f=l(t.height,a),p=i[2]+i[0],g=i[1]+i[3],m=t.aspect;switch(isNaN(d)&&(d=n-u-g-r),isNaN(f)&&(f=a-c-p-h),isNaN(d)&&isNaN(f)&&(m>n/a?d=.8*n:f=.8*a),null!=m&&(isNaN(d)&&(d=m*f),isNaN(f)&&(f=d/m)),isNaN(r)&&(r=n-u-d-g),isNaN(h)&&(h=a-c-f-p),t.left||t.right){case"center":r=n/2-d/2-i[3];break;case"right":r=n-d-g}switch(t.top||t.bottom){case"middle":case"center":h=a/2-f/2-i[0];break;case"bottom":h=a-f-p}r=r||0,h=h||0,isNaN(d)&&(d=n-r-(u||0)),isNaN(f)&&(f=a-h-(c||0));var v=new o(r+i[3],h+i[0],d,f);return v.margin=i,v},u.positionGroup=function(t,e,i,n){var o=t.getBoundingRect();e=a.extend(a.clone(e),{width:o.width,height:o.height}),e=u.getLayoutRect(e,i,n),t.position=[e.x-o.x,e.y-o.y]},u.mergeLayoutParam=function(t,e,i){function n(n){var a={},s=0,l={},u=0,c=i.ignoreSize?1:2;if(h(n,function(e){l[e]=t[e]}),h(n,function(t){o(e,t)&&(a[t]=l[t]=e[t]),r(a,t)&&s++,r(l,t)&&u++}),u!==c&&s){if(s>=c)return a;for(var d=0;d';return e?u+s(this.name)+" : "+o:s(this.name)+"
            "+u+(r?s(r)+" : "+o:o)},restoreData:function(){this._data=this._dataBeforeProcessed.cloneShallow()}});n.mixin(h,o.dataFormatMixin),t.exports=h},function(t,e,i){(function(e){function n(t){return d.isArray(t)||(t=[t]),t}function a(t,e){var i=t.dimensions,n=new v(d.map(i,t.getDimensionInfo,t),t.hostModel);m(n,t,t._wrappedMethods);for(var a=n._storage={},o=t._storage,r=0;r=0?a[s]=new l.constructor(o[s].length):a[s]=o[s]}return n}var o="undefined",r="undefined"==typeof window?e:window,s=typeof r.Float64Array===o?Array:r.Float64Array,l=typeof r.Int32Array===o?Array:r.Int32Array,h={"float":s,"int":l,ordinal:Array,number:Array,time:Array},u=i(12),c=i(52),d=i(1),f=i(7),p=d.isObject,g=["stackedOn","_nameList","_idList","_rawData"],m=function(t,e,i){d.each(g.concat(i||[]),function(i){e.hasOwnProperty(i)&&(t[i]=e[i])})},v=function(t,e){t=t||["x","y"];for(var i={},n=[],a=0;a0&&(w+="__ec__"+u[b]),u[b]++),w&&(l[c]=w)}this._nameList=e,this._idList=l},y.count=function(){return this.indices.length},y.get=function(t,e,i){var n=this._storage,a=this.indices[e];if(null==a)return NaN;var o=n[t]&&n[t][a];if(i){var r=this._dimensionInfos[t];if(r&&r.stackable)for(var s=this.stackedOn;s;){var l=s.get(t,e);(o>=0&&l>0||0>=o&&0>l)&&(o+=l),s=s.stackedOn}}return o},y.getValues=function(t,e,i){var n=[];d.isArray(t)||(i=e,e=t,t=this.dimensions);for(var a=0,o=t.length;o>a;a++)n.push(this.get(t[a],e,i));return n},y.hasValue=function(t){for(var e=this.dimensions,i=this._dimensionInfos,n=0,a=e.length;a>n;n++)if("ordinal"!==i[e[n]].type&&isNaN(this.get(e[n],t)))return!1;return!0},y.getDataExtent=function(t,e){var i=this._storage[t],n=this.getDimensionInfo(t);e=n&&n.stackable&&e;var a,o=(this._extent||(this._extent={}))[t+!!e];if(o)return o;if(i){for(var r=1/0,s=-(1/0),l=0,h=this.count();h>l;l++)a=this.get(t,l,e),r>a&&(r=a),a>s&&(s=a);return this._extent[t+e]=[r,s]}return[1/0,-(1/0)]},y.getSum=function(t,e){var i=this._storage[t],n=0;if(i)for(var a=0,o=this.count();o>a;a++){ +var r=this.get(t,a,e);isNaN(r)||(n+=r)}return n},y.indexOf=function(t,e){var i=this._storage,n=i[t],a=this.indices;if(n)for(var o=0,r=a.length;r>o;o++){var s=a[o];if(n[s]===e)return o}return-1},y.indexOfName=function(t){for(var e=this.indices,i=this._nameList,n=0,a=e.length;a>n;n++){var o=e[n];if(i[o]===t)return n}return-1},y.indexOfNearest=function(t,e,i){var n=this._storage,a=n[t];if(a){for(var o=Number.MAX_VALUE,r=-1,s=0,l=this.count();l>s;s++){var h=e-this.get(t,s,i),u=Math.abs(h);(o>u||u===o&&h>0)&&(o=u,r=s)}return r}return-1},y.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},y.getName=function(t){return this._nameList[this.indices[t]]||""},y.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},y.each=function(t,e,i,a){"function"==typeof t&&(a=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var o=[],r=t.length,s=this.indices;a=a||this;for(var l=0;lh;h++)o[h]=this.get(t[h],l,i);o[h]=l,e.apply(a,o)}},y.filterSelf=function(t,e,i,a){"function"==typeof t&&(a=i,i=e,e=t,t=[]),t=d.map(n(t),this.getDimension,this);var o=[],r=[],s=t.length,l=this.indices;a=a||this;for(var h=0;hc;c++)r[c]=this.get(t[c],h,i);r[c]=h,u=e.apply(a,r)}u&&o.push(l[h])}return this.indices=o,this._extent={},this},y.mapArray=function(t,e,i,n){"function"==typeof t&&(n=i,i=e,e=t,t=[]);var a=[];return this.each(t,function(){a.push(e&&e.apply(this,arguments))},i,n),a},y.map=function(t,e,i,o){t=d.map(n(t),this.getDimension,this);var r=a(this,t),s=r.indices=this.indices,l=r._storage,h=[];return this.each(t,function(){var i=arguments[arguments.length-1],n=e&&e.apply(this,arguments);if(null!=n){"number"==typeof n&&(h[0]=n,n=h);for(var a=0;ag;g+=d){d>p-g&&(d=p-g,u.length=d);for(var m=0;d>m;m++){var v=l[g+m];u[m]=f[v],c[m]=v}var y=i(u),v=c[n(u,y)||0];f[v]=y,h.push(v)}return o},y.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new u(this._rawData[t],e,e.ecModel)},y.diff=function(t){var e=this._idList,i=t&&t._idList;return new c(t?t.indices:[],this.indices,function(t){return i[t]||t+""},function(t){return e[t]||t+""})},y.getVisual=function(t){var e=this._visual;return e&&e[t]},y.setVisual=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},y.setLayout=function(t,e){if(p(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},y.getLayout=function(t){return this._layout[t]},y.getItemLayout=function(t){return this._itemLayouts[t]},y.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?d.extend(this._itemLayouts[t]||{},e):e},y.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],a=n&&n[e];return null!=a||i?a:this.getVisual(e)},y.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{};if(this._itemVisuals[t]=n,p(e))for(var a in e)e.hasOwnProperty(a)&&(n[a]=e[a]);else n[e]=i};var x=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex};y.setItemGraphicEl=function(t,e){var i=this.hostModel;e&&(e.dataIndex=t,e.seriesIndex=i&&i.seriesIndex,"group"===e.type&&e.traverse(x,e)),this._graphicEls[t]=e},y.getItemGraphicEl=function(t){return this._graphicEls[t]},y.eachItemGraphicEl=function(t,e){d.each(this._graphicEls,function(i,n){i&&t&&t.call(e,i,n)})},y.cloneShallow=function(){var t=d.map(this.dimensions,this.getDimensionInfo,this),e=new v(t,this.hostModel);return e._storage=this._storage,m(e,this,this._wrappedMethods),e.indices=this.indices.slice(),e},y.wrapMethod=function(t,e){var i=this[t];"function"==typeof i&&(this._wrappedMethods=this._wrappedMethods||[],this._wrappedMethods.push(t),this[t]=function(){var t=i.apply(this,arguments);return e.call(this,t)})},t.exports=v}).call(e,function(){return this}())},function(t,e){function i(t){var e={},i={},n=t.match(/Web[kK]it[\/]{0,1}([\d.]+)/),a=t.match(/(Android);?[\s\/]+([\d.]+)?/),o=t.match(/(iPad).*OS\s([\d_]+)/),r=t.match(/(iPod)(.*OS\s([\d_]+))?/),s=!o&&t.match(/(iPhone\sOS)\s([\d_]+)/),l=t.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),h=l&&t.match(/TouchPad/),u=t.match(/Kindle\/([\d.]+)/),c=t.match(/Silk\/([\d._]+)/),d=t.match(/(BlackBerry).*Version\/([\d.]+)/),f=t.match(/(BB10).*Version\/([\d.]+)/),p=t.match(/(RIM\sTablet\sOS)\s([\d.]+)/),g=t.match(/PlayBook/),m=t.match(/Chrome\/([\d.]+)/)||t.match(/CriOS\/([\d.]+)/),v=t.match(/Firefox\/([\d.]+)/),y=n&&t.match(/Mobile\//)&&!m,x=t.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!m,_=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),w=t.match(/Edge\/([\d.]+)/);return(i.webkit=!!n)&&(i.version=n[1]),a&&(e.android=!0,e.version=a[2]),s&&!r&&(e.ios=e.iphone=!0,e.version=s[2].replace(/_/g,".")),o&&(e.ios=e.ipad=!0,e.version=o[2].replace(/_/g,".")),r&&(e.ios=e.ipod=!0,e.version=r[3]?r[3].replace(/_/g,"."):null),l&&(e.webos=!0,e.version=l[2]),h&&(e.touchpad=!0),d&&(e.blackberry=!0,e.version=d[2]),f&&(e.bb10=!0,e.version=f[2]),p&&(e.rimtabletos=!0,e.version=p[2]),g&&(i.playbook=!0),u&&(e.kindle=!0,e.version=u[1]),c&&(i.silk=!0,i.version=c[1]),!c&&e.android&&t.match(/Kindle Fire/)&&(i.silk=!0),m&&(i.chrome=!0,i.version=m[1]),v&&(i.firefox=!0,i.version=v[1]),_&&(i.ie=!0,i.version=_[1]),y&&(t.match(/Safari/)||e.ios)&&(i.safari=!0),x&&(i.webview=!0),_&&(i.ie=!0,i.version=_[1]),w&&(i.edge=!0,i.version=w[1]),e.tablet=!!(o||g||a&&!t.match(/Mobile/)||v&&t.match(/Tablet/)||_&&!t.match(/Phone/)&&t.match(/Touch/)),e.phone=!(e.tablet||e.ipod||!(a||s||l||d||f||m&&t.match(/Android/)||m&&t.match(/CriOS\/([\d.]+)/)||v&&t.match(/Mobile/)||_&&t.match(/Touch/))),{browser:i,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!i.ie&&!i.edge,pointerEventsSupported:"onpointerdown"in window&&(i.edge||i.ie&&i.version>=10)}}var n={};n="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:i(navigator.userAgent),t.exports=n},function(t,e){var i=function(t){this.colorStops=t||[]};i.prototype={constructor:i,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=i},function(t,e,i){function n(t,e){var i=t+":"+e;if(h[i])return h[i];for(var n=(t+"").split("\n"),a=0,o=0,r=n.length;r>o;o++)a=Math.max(p.measureText(n[o],e).width,a);return u>c&&(u=0,h={}),u++,h[i]=a,a}function a(t,e,i,a){var o=((t||"")+"").split("\n").length,r=n(t,e),s=n("国",e),l=o*s,h=new f(0,0,r,l);switch(h.lineHeight=s,a){case"bottom":case"alphabetic":h.y-=s;break;case"middle":h.y-=s/2}switch(i){case"end":case"right":h.x-=h.width;break;case"center":h.x-=h.width/2}return h}function o(t,e,i,n){var a=e.x,o=e.y,r=e.height,s=e.width,l=i.height,h=r/2-l/2,u="left";switch(t){case"left":a-=n,o+=h,u="right";break;case"right":a+=n+s,o+=h,u="left";break;case"top":a+=s/2,o-=n+l,u="center";break;case"bottom":a+=s/2,o+=r+n,u="center";break;case"inside":a+=s/2,o+=h,u="center";break;case"insideLeft":a+=n,o+=h,u="left";break;case"insideRight":a+=s-n,o+=h,u="right";break;case"insideTop":a+=s/2,o+=n,u="center";break;case"insideBottom":a+=s/2,o+=r-l-n,u="center";break;case"insideTopLeft":a+=n,o+=n,u="left";break;case"insideTopRight":a+=s-n,o+=n,u="right";break;case"insideBottomLeft":a+=n,o+=r-l-n;break;case"insideBottomRight":a+=s-n,o+=r-l-n,u="right"}return{x:a,y:o,textAlign:u,textBaseline:"top"}}function r(t,e,i,a){if(!i)return"";a=d.defaults({ellipsis:"...",minCharacters:3,maxIterations:3,cnCharWidth:n("国",e),ascCharWidth:n("a",e)},a,!0),i-=n(a.ellipsis);for(var o=(t+"").split("\n"),r=0,l=o.length;l>r;r++)o[r]=s(o[r],e,i,a);return o.join("\n")}function s(t,e,i,a){for(var o=0;;o++){var r=n(t,e);if(i>r||o>=a.maxIterations){t+=a.ellipsis;break}var s=0===o?l(t,i,a):Math.floor(t.length*i/r);if(sa&&e>n;a++){var r=t.charCodeAt(a);n+=r>=0&&127>=r?i.ascCharWidth:i.cnCharWidth}return a}var h={},u=0,c=5e3,d=i(1),f=i(8),p={getWidth:n,getBoundingRect:a,adjustTextPositionOnRect:o,ellipsis:r,measureText:function(t,e){var i=d.getContext();return i.font=e,i.measureText(t)}};t.exports=p},function(t,e,i){"use strict";function n(t){return t>-b&&b>t}function a(t){return t>b||-b>t}function o(t,e,i,n,a){var o=1-a;return o*o*(o*t+3*a*e)+a*a*(a*n+3*o*i)}function r(t,e,i,n,a){var o=1-a;return 3*(((e-t)*o+2*(i-e)*a)*o+(n-i)*a*a)}function s(t,e,i,a,o,r){var s=a+3*(e-i)-t,l=3*(i-2*e+t),h=3*(e-t),u=t-o,c=l*l-3*s*h,d=l*h-9*s*u,f=h*h-3*l*u,p=0;if(n(c)&&n(d))if(n(l))r[0]=0;else{var g=-h/l;g>=0&&1>=g&&(r[p++]=g)}else{var m=d*d-4*c*f;if(n(m)){var v=d/c,g=-l/s+v,y=-v/2;g>=0&&1>=g&&(r[p++]=g),y>=0&&1>=y&&(r[p++]=y)}else if(m>0){var x=w(m),b=c*l+1.5*s*(-d+x),M=c*l+1.5*s*(-d-x);b=0>b?-_(-b,A):_(b,A),M=0>M?-_(-M,A):_(M,A);var g=(-l-(b+M))/(3*s);g>=0&&1>=g&&(r[p++]=g)}else{var I=(2*c*l-3*s*d)/(2*w(c*c*c)),T=Math.acos(I)/3,C=w(c),L=Math.cos(T),g=(-l-2*C*L)/(3*s),y=(-l+C*(L+S*Math.sin(T)))/(3*s),D=(-l+C*(L-S*Math.sin(T)))/(3*s);g>=0&&1>=g&&(r[p++]=g),y>=0&&1>=y&&(r[p++]=y),D>=0&&1>=D&&(r[p++]=D)}}return p}function l(t,e,i,o,r){var s=6*i-12*e+6*t,l=9*e+3*o-3*t-9*i,h=3*e-3*t,u=0;if(n(l)){if(a(s)){var c=-h/s;c>=0&&1>=c&&(r[u++]=c)}}else{var d=s*s-4*l*h;if(n(d))r[0]=-s/(2*l);else if(d>0){var f=w(d),c=(-s+f)/(2*l),p=(-s-f)/(2*l);c>=0&&1>=c&&(r[u++]=c),p>=0&&1>=p&&(r[u++]=p)}}return u}function h(t,e,i,n,a,o){var r=(e-t)*a+t,s=(i-e)*a+e,l=(n-i)*a+i,h=(s-r)*a+r,u=(l-s)*a+s,c=(u-h)*a+h;o[0]=t,o[1]=r,o[2]=h,o[3]=c,o[4]=c,o[5]=u,o[6]=l,o[7]=n}function u(t,e,i,n,a,r,s,l,h,u,c){var d,f,p,g,m,v=.005,y=1/0;I[0]=h,I[1]=u;for(var _=0;1>_;_+=.05)T[0]=o(t,i,a,s,_),T[1]=o(e,n,r,l,_),g=x(I,T),y>g&&(d=_,y=g);y=1/0;for(var b=0;32>b&&!(M>v);b++)f=d-v,p=d+v,T[0]=o(t,i,a,s,f),T[1]=o(e,n,r,l,f),g=x(T,I),f>=0&&y>g?(d=f,y=g):(C[0]=o(t,i,a,s,p),C[1]=o(e,n,r,l,p),m=x(C,I),1>=p&&y>m?(d=p,y=m):v*=.5);return c&&(c[0]=o(t,i,a,s,d),c[1]=o(e,n,r,l,d)),w(y)}function c(t,e,i,n){var a=1-n;return a*(a*t+2*n*e)+n*n*i}function d(t,e,i,n){return 2*((1-n)*(e-t)+n*(i-e))}function f(t,e,i,o,r){var s=t-2*e+i,l=2*(e-t),h=t-o,u=0;if(n(s)){if(a(l)){var c=-h/l;c>=0&&1>=c&&(r[u++]=c)}}else{var d=l*l-4*s*h;if(n(d)){var c=-l/(2*s);c>=0&&1>=c&&(r[u++]=c)}else if(d>0){var f=w(d),c=(-l+f)/(2*s),p=(-l-f)/(2*s);c>=0&&1>=c&&(r[u++]=c),p>=0&&1>=p&&(r[u++]=p)}}return u}function p(t,e,i){var n=t+i-2*e;return 0===n?.5:(t-e)/n}function g(t,e,i,n,a){var o=(e-t)*n+t,r=(i-e)*n+e,s=(r-o)*n+o;a[0]=t,a[1]=o,a[2]=s,a[3]=s,a[4]=r,a[5]=i}function m(t,e,i,n,a,o,r,s,l){var h,u=.005,d=1/0;I[0]=r,I[1]=s;for(var f=0;1>f;f+=.05){T[0]=c(t,i,a,f),T[1]=c(e,n,o,f);var p=x(I,T);d>p&&(h=f,d=p)}d=1/0;for(var g=0;32>g&&!(M>u);g++){var m=h-u,v=h+u;T[0]=c(t,i,a,m),T[1]=c(e,n,o,m);var p=x(T,I);if(m>=0&&d>p)h=m,d=p;else{C[0]=c(t,i,a,v),C[1]=c(e,n,o,v);var y=x(C,I);1>=v&&d>y?(h=v,d=y):u*=.5}}return l&&(l[0]=c(t,i,a,h),l[1]=c(e,n,o,h)),w(d)}var v=i(5),y=v.create,x=v.distSquare,_=Math.pow,w=Math.sqrt,b=1e-8,M=1e-4,S=w(3),A=1/3,I=y(),T=y(),C=y();t.exports={cubicAt:o,cubicDerivativeAt:r,cubicRootAt:s,cubicExtrema:l,cubicSubdivide:h,cubicProjectPoint:u,quadraticAt:c,quadraticDerivativeAt:d,quadraticRootAt:f,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:m}},function(t,e){var i="undefined"==typeof Float32Array?Array:Float32Array,n={create:function(){var t=new i(6);return n.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,i){var n=e[0]*i[0]+e[2]*i[1],a=e[1]*i[0]+e[3]*i[1],o=e[0]*i[2]+e[2]*i[3],r=e[1]*i[2]+e[3]*i[3],s=e[0]*i[4]+e[2]*i[5]+e[4],l=e[1]*i[4]+e[3]*i[5]+e[5];return t[0]=n,t[1]=a,t[2]=o,t[3]=r,t[4]=s,t[5]=l,t},translate:function(t,e,i){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+i[0],t[5]=e[5]+i[1],t},rotate:function(t,e,i){var n=e[0],a=e[2],o=e[4],r=e[1],s=e[3],l=e[5],h=Math.sin(i),u=Math.cos(i);return t[0]=n*u+r*h,t[1]=-n*h+r*u,t[2]=a*u+s*h,t[3]=-a*h+u*s,t[4]=u*o+h*l,t[5]=u*l-h*o,t},scale:function(t,e,i){var n=i[0],a=i[1];return t[0]=e[0]*n,t[1]=e[1]*a,t[2]=e[2]*n,t[3]=e[3]*a,t[4]=e[4]*n,t[5]=e[5]*a,t},invert:function(t,e){var i=e[0],n=e[2],a=e[4],o=e[1],r=e[3],s=e[5],l=i*r-o*n;return l?(l=1/l,t[0]=r*l,t[1]=-o*l,t[2]=-n*l,t[3]=i*l,t[4]=(n*s-r*a)*l,t[5]=(o*a-i*s)*l,t):null}};t.exports=n},function(t,e,i){function n(t,e){var i=o.slice(arguments,2);return this.superClass.prototype[e].apply(t,i)}function a(t,e,i){return this.superClass.prototype[e].apply(t,i)}var o=i(1),r={},s=".",l="___EC__COMPONENT__CONTAINER___",h=r.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(s),e.main=t[0]||"",e.sub=t[1]||""),e};r.enableClassExtend=function(t,e){t.extend=function(i){var r=function(){e&&e.apply(this,arguments),t.apply(this,arguments)};return o.extend(r.prototype,i),r.extend=this.extend,r.superCall=n,r.superApply=a,o.inherits(r,this),r.superClass=this,r}},r.enableClassManagement=function(t,e){function i(t){var e=n[t.main];return e&&e[l]||(e=n[t.main]={},e[l]=!0),e}e=e||{};var n={};if(t.registerClass=function(t,e){if(e)if(e=h(e),e.sub){if(e.sub!==l){var a=i(e);a[e.sub]=t}}else{if(n[e.main])throw new Error(e.main+"exists.");n[e.main]=t}return t},t.getClass=function(t,e,i){var a=n[t];if(a&&a[l]&&(a=e?a[e]:null),i&&!a)throw new Error("Component "+t+"."+(e||"")+" not exists. Load it first.");return a},t.getClassesByMainType=function(t){t=h(t);var e=[],i=n[t.main];return i&&i[l]?o.each(i,function(t,i){i!==l&&e.push(t)}):e.push(i),e},t.hasClass=function(t){return t=h(t),!!n[t.main]},t.getAllClassMainTypes=function(){var t=[];return o.each(n,function(e,i){t.push(i)}),t},t.hasSubTypes=function(t){t=h(t);var e=n[t.main];return e&&e[l]},t.parseClassType=h,e.registerWhenExtend){var a=t.extend;a&&(t.extend=function(e){var i=a.call(this,e);return t.registerClass(i,e.type)})}return t},r.setReadOnly=function(t,e){},t.exports=r},function(t,e,i){var n=Array.prototype.slice,a=i(1),o=a.indexOf,r=function(){this._$handlers={}};r.prototype={constructor:r,one:function(t,e,i){var n=this._$handlers;return e&&t?(n[t]||(n[t]=[]),o(n[t],t)>=0?this:(n[t].push({h:e,one:!0,ctx:i||this}),this)):this},on:function(t,e,i){var n=this._$handlers;return e&&t?(n[t]||(n[t]=[]),n[t].push({h:e,one:!1,ctx:i||this}),this):this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var i=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(i[t]){for(var n=[],a=0,o=i[t].length;o>a;a++)i[t][a].h!=e&&n.push(i[t][a]);i[t]=n}i[t]&&0===i[t].length&&delete i[t]}else delete i[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>3&&(e=n.call(e,1));for(var a=this._$handlers[t],o=a.length,r=0;o>r;){switch(i){case 1:a[r].h.call(a[r].ctx);break;case 2:a[r].h.call(a[r].ctx,e[1]);break;case 3:a[r].h.call(a[r].ctx,e[1],e[2]);break;default:a[r].h.apply(a[r].ctx,e)}a[r].one?(a.splice(r,1),o--):r++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,i=e.length;i>4&&(e=n.call(e,1,e.length-1));for(var a=e[e.length-1],o=this._$handlers[t],r=o.length,s=0;r>s;){switch(i){case 1:o[s].h.call(a);break;case 2:o[s].h.call(a,e[1]);break;case 3:o[s].h.call(a,e[1],e[2]);break;default:o[s].h.apply(a,e)}o[s].one?(o.splice(s,1),r--):s++}}return this}},t.exports=r},function(t,e){function i(t){return t=Math.round(t),0>t?0:t>255?255:t}function n(t){return t=Math.round(t),0>t?0:t>360?360:t}function a(t){return 0>t?0:t>1?1:t}function o(t){return i(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function r(t){return a(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function s(t,e,i){return 0>i?i+=1:i>1&&(i-=1),1>6*i?t+(e-t)*i*6:1>2*i?e:2>3*i?t+(e-t)*(2/3-i)*6:t}function l(t,e,i){return t+(e-t)*i}function h(t){if(t){t+="";var e=t.replace(/ /g,"").toLowerCase();if(e in _)return _[e].slice();if("#"!==e.charAt(0)){var i=e.indexOf("("),n=e.indexOf(")");if(-1!==i&&n+1===e.length){var a=e.substr(0,i),s=e.substr(i+1,n-(i+1)).split(","),l=1;switch(a){case"rgba":if(4!==s.length)return;l=r(s.pop());case"rgb":if(3!==s.length)return;return[o(s[0]),o(s[1]),o(s[2]),l];case"hsla":if(4!==s.length)return;return s[3]=r(s[3]),u(s);case"hsl":if(3!==s.length)return;return u(s);default:return}}}else{if(4===e.length){var h=parseInt(e.substr(1),16);if(!(h>=0&&4095>=h))return;return[(3840&h)>>4|(3840&h)>>8,240&h|(240&h)>>4,15&h|(15&h)<<4,1]}if(7===e.length){var h=parseInt(e.substr(1),16);if(!(h>=0&&16777215>=h))return;return[(16711680&h)>>16,(65280&h)>>8,255&h,1]}}}}function u(t){var e=(parseFloat(t[0])%360+360)%360/360,n=r(t[1]),a=r(t[2]),o=.5>=a?a*(n+1):a+n-a*n,l=2*a-o,h=[i(255*s(l,o,e+1/3)),i(255*s(l,o,e)),i(255*s(l,o,e-1/3))];return 4===t.length&&(h[3]=t[3]),h}function c(t){if(t){var e,i,n=t[0]/255,a=t[1]/255,o=t[2]/255,r=Math.min(n,a,o),s=Math.max(n,a,o),l=s-r,h=(s+r)/2;if(0===l)e=0,i=0;else{i=.5>h?l/(s+r):l/(2-s-r);var u=((s-n)/6+l/2)/l,c=((s-a)/6+l/2)/l,d=((s-o)/6+l/2)/l;n===s?e=d-c:a===s?e=1/3+u-d:o===s&&(e=2/3+c-u),0>e&&(e+=1),e>1&&(e-=1)}var f=[360*e,i,h];return null!=t[3]&&f.push(t[3]),f}}function d(t,e){var i=h(t);if(i){for(var n=0;3>n;n++)0>e?i[n]=i[n]*(1-e)|0:i[n]=(255-i[n])*e+i[n]|0;return x(i,4===i.length?"rgba":"rgb")}}function f(t,e){var i=h(t);return i?((1<<24)+(i[0]<<16)+(i[1]<<8)+ +i[2]).toString(16).slice(1):void 0}function p(t,e,n){if(e&&e.length&&t>=0&&1>=t){n=n||[0,0,0,0];var a=t*(e.length-1),o=Math.floor(a),r=Math.ceil(a),s=e[o],h=e[r],u=a-o;return n[0]=i(l(s[0],h[0],u)),n[1]=i(l(s[1],h[1],u)),n[2]=i(l(s[2],h[2],u)),n[3]=i(l(s[3],h[3],u)),n}}function g(t,e,n){if(e&&e.length&&t>=0&&1>=t){var o=t*(e.length-1),r=Math.floor(o),s=Math.ceil(o),u=h(e[r]),c=h(e[s]),d=o-r,f=x([i(l(u[0],c[0],d)),i(l(u[1],c[1],d)),i(l(u[2],c[2],d)),a(l(u[3],c[3],d))],"rgba");return n?{color:f,leftIndex:r,rightIndex:s,value:o}:f}}function m(t,e){if(!(2!==t.length||t[1]0&&s>=l;l++)a.push({color:e[l],offset:(l-i.value)/o});return a.push({color:n.color,offset:1}),a}}function v(t,e,i,a){return t=h(t),t?(t=c(t),null!=e&&(t[0]=n(e)),null!=i&&(t[1]=r(i)),null!=a&&(t[2]=r(a)),x(u(t),"rgba")):void 0}function y(t,e){return t=h(t),t&&null!=e?(t[3]=a(e),x(t,"rgba")):void 0}function x(t,e){return"rgb"!==e&&"hsv"!==e&&"hsl"!==e||(t=t.slice(0,3)),e+"("+t.join(",")+")"}var _={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};t.exports={parse:h,lift:d,toHex:f,fastMapToColor:p,mapToColor:g,mapIntervalToColor:m,modifyHSL:v,modifyAlpha:y,stringify:x}},function(t,e,i){var n=i(124),a=i(37);i(125),i(123);var o=i(32),r=i(4),s=i(1),l=i(17),h={};h.getScaleExtent=function(t,e){var i=t.scale,n=i.getExtent(),a=n[1]-n[0];if("ordinal"===i.type)return isFinite(a)?n:[0,0];var o=e.getMin?e.getMin():e.get("min"),l=e.getMax?e.getMax():e.get("max"),h=e.getNeedCrossZero?e.getNeedCrossZero():!e.get("scale"),u=e.get("boundaryGap");s.isArray(u)||(u=[u||0,u||0]),u[0]=r.parsePercent(u[0],1),u[1]=r.parsePercent(u[1],1);var c=!0,d=!0;return null==o&&(o=n[0]-u[0]*a,c=!1),null==l&&(l=n[1]+u[1]*a,d=!1),"dataMin"===o&&(o=n[0]),"dataMax"===l&&(l=n[1]),h&&(o>0&&l>0&&!c&&(o=0),0>o&&0>l&&!d&&(l=0)),[o,l]},h.niceScaleExtent=function(t,e){var i=t.scale,n=h.getScaleExtent(t,e),a=null!=(e.getMin?e.getMin():e.get("min")),o=null!=(e.getMax?e.getMax():e.get("max"));i.setExtent(n[0],n[1]),i.niceExtent(e.get("splitNumber"),a,o);var r=e.get("interval");null!=r&&i.setInterval&&i.setInterval(r)},h.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new n(t.getCategories(),[1/0,-(1/0)]);case"value":return new a;default:return(o.getClass(e)||a).create(t)}},h.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(i>0&&n>0||0>i&&0>n)},h.getAxisLabelInterval=function(t,e,i,n){var a,o=0,r=0,s=1;e.length>40&&(s=Math.round(e.length/40));for(var h=0;h1?s:o*s},h.getFormattedLabels=function(t,e){var i=t.scale,n=i.getTicksLabels(),a=i.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",e)}}(e),s.map(n,e)):"function"==typeof e?s.map(a,function(n,a){return e("category"===t.type?i.getLabel(n):n,a)},this):n},t.exports=h},function(t,e,i){"use strict";var n=i(3),a=i(8),o=n.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,a=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+a,n+o),t.lineTo(i-a,n+o),t.closePath()}}),r=n.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var i=e.cx,n=e.cy,a=e.width/2,o=e.height/2;t.moveTo(i,n-o),t.lineTo(i+a,n),t.lineTo(i,n+o),t.lineTo(i-a,n),t.closePath()}}),s=n.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,n=e.y,a=e.width/5*3,o=Math.max(a,e.height),r=a/2,s=r*r/(o-r),l=n-o+r+s,h=Math.asin(s/r),u=Math.cos(h)*r,c=Math.sin(h),d=Math.cos(h);t.arc(i,l,r,Math.PI-h,2*Math.PI+h);var f=.6*r,p=.7*r;t.bezierCurveTo(i+u-c*f,l+s+d*f,i,n-p,i,n),t.bezierCurveTo(i,n-p,i-u+c*f,l+s+d*f,i-u,l+s),t.closePath()}}),l=n.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.height,n=e.width,a=e.x,o=e.y,r=n/3*2;t.moveTo(a,o),t.lineTo(a+r,o+i),t.lineTo(a,o+i/4*3),t.lineTo(a-r,o+i),t.lineTo(a,o),t.closePath()}}),h={line:n.Line,rect:n.Rect,roundRect:n.Rect,square:n.Rect,circle:n.Circle,diamond:r,pin:s,arrow:l,triangle:o},u={line:function(t,e,i,n,a){a.x1=t,a.y1=e+n/2,a.x2=t+i,a.y2=e+n/2},rect:function(t,e,i,n,a){a.x=t,a.y=e,a.width=i,a.height=n},roundRect:function(t,e,i,n,a){a.x=t,a.y=e,a.width=i,a.height=n,a.r=Math.min(i,n)/4},square:function(t,e,i,n,a){var o=Math.min(i,n);a.x=t,a.y=e,a.width=o,a.height=o},circle:function(t,e,i,n,a){a.cx=t+i/2,a.cy=e+n/2,a.r=Math.min(i,n)/2},diamond:function(t,e,i,n,a){a.cx=t+i/2,a.cy=e+n/2,a.width=i,a.height=n},pin:function(t,e,i,n,a){a.x=t+i/2,a.y=e+n/2,a.width=i,a.height=n},arrow:function(t,e,i,n,a){a.x=t+i/2,a.y=e+n/2,a.width=i,a.height=n},triangle:function(t,e,i,n,a){a.cx=t+i/2,a.cy=e+n/2,a.width=i,a.height=n}},c={};for(var d in h)c[d]=new h[d];var f=n.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e){var i=e.symbolType,n=c[i];"none"!==e.symbolType&&(n||(i="rect",n=c[i]),u[i](e.x,e.y,e.width,e.height,n.shape),n.buildPath(t,n.shape))}}),p=function(t){if("image"!==this.type){var e=this.style,i=this.shape;i&&"line"===i.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty()}},g={createSymbol:function(t,e,i,o,r,s){var l=0===t.indexOf("empty");l&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var h;return h=0===t.indexOf("image://")?new n.Image({style:{image:t.slice(8),x:e,y:i,width:o,height:r}}):0===t.indexOf("path://")?n.makePath(t.slice(7),{},new a(e,i,o,r)):new f({shape:{symbolType:t,x:e,y:i,width:o,height:r}}),h.__isEmptyBrush=l,h.setColor=p,h.setColor(s),h}};t.exports=g},function(t,e,i){function n(){this.group=new r,this.uid=s.getUID("viewChart")}function a(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var i=0;i=0&&(i.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,i=this.__zr;e&&e!==t.__storage&&(e.addToMap(t),t instanceof r&&t.addChildrenToStorage(e)),i&&i.refresh()},remove:function(t){var e=this.__zr,i=this.__storage,a=this._children,o=n.indexOf(a,t);return 0>o?this:(a.splice(o,1),t.parent=null,i&&(i.delFromMap(t.id),t instanceof r&&t.delChildrenFromStorage(i)),e&&e.refresh(),this)},removeAll:function(){var t,e,i=this._children,n=this.__storage;for(e=0;ei;i++)this.data[i]=t[i];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,i=0,n=this._len,a=0;e>a;a++)i+=t[a].len();v&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+i));for(var a=0;e>a;a++)for(var o=t[a].data,r=0;re.length&&(this._expandData(),e=this.data);for(var i=0;io&&(o=a+o),o%=a,g-=o*u,v-=o*c;u>=0&&t>=g||0>u&&g>t;)n=this._dashIdx,i=r[n],g+=u*i,v+=c*i,this._dashIdx=(n+1)%y,u>0&&l>g||0>u&&g>l||s[n%2?"moveTo":"lineTo"](u>=0?d(g,t):f(g,t),c>=0?d(v,e):f(v,e));u=g-t,c=v-e,this._dashOffset=-m(u*u+c*c)},_dashedBezierTo:function(t,e,i,a,o,r){var s,l,h,u,c,d=this._dashSum,f=this._dashOffset,p=this._lineDash,g=this._ctx,v=this._xi,y=this._yi,x=n.cubicAt,_=0,w=this._dashIdx,b=p.length,M=0;for(0>f&&(f=d+f),f%=d,s=0;1>s;s+=.1)l=x(v,t,i,o,s+.1)-x(v,t,i,o,s),h=x(y,e,a,r,s+.1)-x(y,e,a,r,s),_+=m(l*l+h*h);for(;b>w&&(M+=p[w],!(M>f));w++);for(s=(M-f)/_;1>=s;)u=x(v,t,i,o,s),c=x(y,e,a,r,s),w%2?g.moveTo(u,c):g.lineTo(u,c),s+=p[w]/_,w=(w+1)%b;w%2!==0&&g.lineTo(o,r),l=o-u,h=r-c,this._dashOffset=-m(l*l+h*h)},_dashedQuadraticTo:function(t,e,i,n){var a=i,o=n;i=(i+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,i,n,a,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,v&&(this.data=new Float32Array(t)))},getBoundingRect:function(){l[0]=l[1]=u[0]=u[1]=Number.MAX_VALUE,h[0]=h[1]=c[0]=c[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,i=0,n=0,d=0,f=0;fl?r:l,p=r>l?1:r/l,g=r>l?l/r:1,m=Math.abs(r-l)>.001;m?(t.translate(a,o),t.rotate(c),t.scale(p,g),t.arc(0,0,f,h,h+u,1-d),t.scale(1/p,1/g),t.rotate(-c),t.translate(-a,-o)):t.arc(a,o,f,h,h+u,1-d);break;case s.R:t.rect(e[i++],e[i++],e[i++],e[i++]);break;case s.Z:t.closePath()}}}},y.CMD=s,t.exports=y},function(t,e){"use strict";function i(){this._coordinateSystems=[]}var n={};i.prototype={constructor:i,create:function(t,e){var i=[];for(var a in n){var o=n[a].create(t,e);o&&(i=i.concat(o))}this._coordinateSystems=i},update:function(t,e){for(var i=this._coordinateSystems,n=0;n=0)){var r=this.getShallow(o);null!=r&&(i[t[a][0]]=r)}}return i}}},function(t,e,i){function n(t,e,i,n){if(!e)return t;var s=o(e[0]),l=r.isArray(s)&&s.length||1;i=i||[],n=n||"extra";for(var h=0;l>h;h++)if(!t[h]){var u=i[h]||n+(h-i.length);t[h]=a(e,h)?{type:"ordinal",name:u}:u}return t}function a(t,e){for(var i=0,n=t.length;n>i;i++){var a=o(t[i]);if(!r.isArray(a))return!1;var a=a[e];if(null!=a&&isFinite(a))return!1;if(r.isString(a)&&"-"!==a)return!0}return!1}function o(t){return r.isArray(t)?t:r.isObject(t)?t.value:t}var r=i(1);t.exports=n},function(t,e,i){function n(){this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var a=i(20),o=n.prototype;o.parse=function(t){return t},o.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},o.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},o.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},o.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1])},o.getExtent=function(){return this._extent.slice()},o.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},o.getTicksLabels=function(){for(var t=[],e=this.getTicks(),i=0;i=0;if(a){var o="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];if(o){var r=n(t);e.zrX=o.clientX-r.left,e.zrY=o.clientY-r.top}}else{var s=n(t);e.zrX=e.clientX-s.left,e.zrY=e.clientY-s.top,e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3}return e}function o(t,e,i){l?t.addEventListener(e,i):t.attachEvent("on"+e,i)}function r(t,e,i){l?t.removeEventListener(e,i):t.detachEvent("on"+e,i)}var s=i(21),l="undefined"!=typeof window&&!!window.addEventListener,h=l?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={normalizeEvent:a,addEventListener:o,removeEventListener:r,stop:h,Dispatcher:s}},function(t,e,i){"use strict";var n=i(3),a=i(1);i(51),i(96),i(2).extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new n.Rect({shape:t.coordinateSystem.getRect(),style:a.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0}))}})},function(t,e,i){function n(t){t=t||{},r.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new o(t.style),this._rect=null,this.__clipPaths=[]}var a=i(1),o=i(142),r=i(55),s=i(66);n.prototype={constructor:n,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var i=this.transformCoordToLocal(t,e),n=this.getBoundingRect();return n.contain(i[0],i[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?r.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this}},a.inherits(n,r),a.mixin(n,s),t.exports=n},function(t,e,i){"use strict";function n(t){for(var e=0;e1){i=[];for(var o=0;a>o;o++)i[o]=n[e[o][t.categoryIndex||0]]}else i=n.slice(0)}}return i}var h=i(14),u=i(31),c=i(1),d=i(7),f=i(28),p=d.getDataItemValue,g=d.converDataValue,m={cartesian2d:function(t,e,i){var n=i.getComponent("xAxis",e.get("xAxisIndex")),a=i.getComponent("yAxis",e.get("yAxisIndex")),o=n.get("type"),l=a.get("type"),h=[{name:"x",type:s(o),stackable:r(o)},{name:"y",type:s(l),stackable:r(l)}],c="category"===o;return u(h,t,["x","y","z"]),{dimensions:h,categoryIndex:c?0:1,categoryAxisModel:c?n:"category"===l?a:null}},polar:function(t,e,i){var n=e.get("polarIndex")||0,a=function(t){return t.get("polarIndex")===n},o=i.findComponents({mainType:"angleAxis",filter:a})[0],l=i.findComponents({mainType:"radiusAxis",filter:a})[0],h=l.get("type"),c=o.get("type"),d=[{name:"radius",type:s(h),stackable:r(h)},{name:"angle",type:s(c),stackable:r(c)}],f="category"===c;return u(d,t,["radius","angle","value"]),{dimensions:d,categoryIndex:f?1:0,categoryAxisModel:f?o:"category"===h?l:null}},geo:function(t,e,i){return{dimensions:u([{name:"lng"},{name:"lat"}],t,["lng","lat","value"])}}};t.exports=o},function(t,e,i){var n=i(4),a=i(9),o=i(32),r=Math.floor,s=Math.ceil,l=o.extend({type:"interval",_interval:0,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),l.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){this._interval||this.niceTicks();var t=this._interval,e=this._extent,i=[],a=1e4;if(t){var o=this._niceExtent;e[0]a)return[];e[1]>o[1]&&i.push(e[1])}return i},getTicksLabels:function(){for(var t=[],e=this.getTicks(),i=0;ii&&(i=-i,e.reverse());var a=n.nice(i/t,!0),o=[n.round(s(e[0]/a)*a),n.round(r(e[1]/a)*a)];this._interval=a,this._niceExtent=o}},niceExtent:function(t,e,i){var a=this._extent;if(a[0]===a[1])if(0!==a[0]){var o=a[0]/2;a[0]-=o,a[1]+=o}else a[1]=1;var l=a[1]-a[0];isFinite(l)||(a[0]=0,a[1]=1),this.niceTicks(t);var h=this._interval;e||(a[0]=n.round(r(a[0]/h)*h)),i||(a[1]=n.round(s(a[1]/h)*h))}});l.create=function(){return new l},t.exports=l},function(t,e,i){function n(t){this.group=new o.Group,this._symbolCtor=t||r}function a(t,e,i){var n=t.getItemLayout(e);return n&&!isNaN(n[0])&&!isNaN(n[1])&&!(i&&i(e))&&"none"!==t.getItemVisual(e,"symbol")}var o=i(3),r=i(47),s=n.prototype;s.updateData=function(t,e){var i=this.group,n=t.hostModel,r=this._data,s=this._symbolCtor;t.diff(r).add(function(n){var o=t.getItemLayout(n);if(a(t,n,e)){var r=new s(t,n);r.attr("position",o),t.setItemGraphicEl(n,r),i.add(r)}}).update(function(l,h){var u=r.getItemGraphicEl(h),c=t.getItemLayout(l);return a(t,l,e)?(u?(u.updateData(t,l),o.updateProps(u,{position:c},n)):(u=new s(t,l),u.attr("position",c)),i.add(u),void t.setItemGraphicEl(l,u)):void i.remove(u)}).remove(function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut(function(){i.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,i){e.attr("position",t.getItemLayout(i))})},s.remove=function(t){var e=this.group,i=this._data;i&&(t?i.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=n},function(t,e,i){function n(t){var e={};return u(["start","end","startValue","endValue"],function(i){e[i]=t[i]}),e}function a(t,e,i,n){null!=i[e]&&null==i[t]&&(n[t]=null)}var o=i(1),r=i(15),s=i(2),l=i(7),h=i(167),u=o.each,c=l.eachAxisDim,d=s.extendComponentModel({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,angleAxisIndex:null,radiusAxisIndex:null,filterMode:"filter",throttle:100,start:0,end:100,startValue:null,endValue:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel;var a=n(t);this.mergeDefaultAndTheme(t,i),this.doInit(a)},mergeOption:function(t){var e=n(t);o.merge(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;r.canvasSupported||(e.realtime=!1),a("start","startValue",t,e),a("end","endValue",t,e),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,i,n,a){var o=this.dependentModels[e.axis][i],r=o.__dzAxisProxy||(o.__dzAxisProxy=new h(e.name,i,this,a));t[e.name+"_"+i]=r},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();c(function(e){var i=e.axisIndex;t[i]=l.normalizeToArray(t[i])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;c(function(i){null!=t[i.axisIndex]&&(e=!0)},this);var i=t.orient;return null==i&&e?"orient":e?void 0:(null==i&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),i=this.option;if(t){var n="vertical"===e?{dim:"y",axisIndex:"yAxisIndex",axis:"yAxis"}:{dim:"x",axisIndex:"xAxisIndex",axis:"xAxis"};this.dependentModels[n.axis].length&&(i[n.axisIndex]=[0],t=!1)}t&&c(function(e){if(t){var n=[],a=this.dependentModels[e.axis];if(a.length&&!n.length)for(var o=0,r=a.length;r>o;o++)"category"===a[o].get("type")&&n.push(o);i[e.axisIndex]=n,n.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&c(function(e){var n=i[e.axisIndex],a=t.get(e.axisIndex);o.indexOf(n,a)<0&&n.push(a)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var i=!0;return c(function(n){var a=t.get(n.axisIndex),o=this.dependentModels[n.axis][a];o&&o.get("type")===e||(i=!1)},this),i},getFirstTargetAxisModel:function(){var t;return c(function(e){if(null==t){var i=this.get(e.axisIndex);i.length&&(t=this.dependentModels[e.axis][i[0]])}},this),t},eachTargetAxis:function(t,e){var i=this.ecModel;c(function(n){u(this.get(n.axisIndex),function(a){t.call(e,n,a,this,i)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},setRawRange:function(t){u(["start","end","startValue","endValue"],function(e){this.option[e]=t[e]},this)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();return t?t.getDataPercentWindow():void 0},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var i=this.findRepresentativeAxisProxy();return i?i.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(){var t=this._axisProxies;for(var e in t)if(t.hasOwnProperty(e)&&t[e].hostedBy(this))return t[e];for(var e in t)if(t.hasOwnProperty(e)&&!t[e].hostedBy(this))return t[e]}});t.exports=d},function(t,e,i){var n=i(54);t.exports=n.extend({type:"dataZoom",render:function(t,e,i,n){this.dataZoomModel=t,this.ecModel=e,this.api=i},getTargetInfo:function(){function t(t,e,i,n){for(var a,o=0;o=0&&i.push(t)}),i}t.topologicalTravel=function(t,e,a,o){function r(t){h[t].entryCount--,0===h[t].entryCount&&u.push(t)}function s(t){c[t]=!0,r(t)}if(t.length){var l=i(e),h=l.graph,u=l.noEntryList,c={};for(n.each(t,function(t){c[t]=!0});u.length;){var d=u.pop(),f=h[d],p=!!c[d];p&&(a.call(o,d,f.originalDeps.slice()),delete c[d]),n.each(f.successor,p?s:r)}n.each(c,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){var i=1;"undefined"!=typeof window&&(i=Math.max(window.devicePixelRatio||1,1));var n={debugMode:0,devicePixelRatio:i};t.exports=n},function(t,e,i){function n(t,e){var i=t[1]-t[0],n=e,a=i/n/2;t[0]+=a,t[1]-=a}var a=i(4),o=a.linearMap,r=i(1),s=[0,1],l=function(t,e,i){this.dim=t,this.scale=e,this._extent=i||[0,0],this.inverse=!1,this.onBand=!1};l.prototype={constructor:l,contain:function(t){var e=this._extent,i=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return t>=i&&n>=t},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return a.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var i=this._extent;i[0]=t,i[1]=e},dataToCoord:function(t,e){var i=this._extent,a=this.scale;return t=a.normalize(t),this.onBand&&"ordinal"===a.type&&(i=i.slice(),n(i,a.count())),o(t,s,i,e)},coordToData:function(t,e){var i=this._extent,a=this.scale;this.onBand&&"ordinal"===a.type&&(i=i.slice(),n(i,a.count()));var r=o(t,i,s,e);return this.scale.scale(r)},getTicksCoords:function(){if(this.onBand){for(var t=this.getBands(),e=[],i=0;ir;r++)e.push([o*r/i+n,o*(r+1)/i+n]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),i=e[1]-e[0]+(this.onBand?1:0);0===i&&(i=1);var n=Math.abs(t[1]-t[0]);return Math.abs(n)/i}},t.exports=l},function(t,e){t.exports=function(t,e,i,n,a){n.eachRawSeriesByType(t,function(t){var a=t.getData(),o=t.get("symbol")||e,r=t.get("symbolSize");a.setVisual({legendSymbol:i||o,symbol:o,symbolSize:r}),n.isSeriesFiltered(t)||("function"==typeof r&&a.each(function(e){var i=t.getRawValue(e),n=t.getDataParams(e);a.setItemVisual(e,"symbolSize",r(i,n))}),a.each(function(t){var e=a.getItemModel(t),i=e.get("symbol",!0),n=e.get("symbolSize",!0);null!=i&&a.setItemVisual(t,"symbol",i),null!=n&&a.setItemVisual(t,"symbolSize",n)}))})}},function(t,e,i){var n=i(42);t.exports=function(){if(0!==n.debugMode)if(1==n.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(n.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,i){function n(t){a.call(this,t)}var a=i(35),o=i(8),r=i(1),s=i(60),l=i(140),h=new l(50);n.prototype={constructor:n,type:"image",brush:function(t){var e,i=this.style,n=i.image;if(e="string"==typeof n?this._image:n,!e&&n){var a=h.get(n);if(!a)return e=new Image,e.onload=function(){e.onload=null;for(var t=0;t0?"top":"bottom",n="center"):u(o-c)?(a=i>0?"bottom":"top",n="center"):(a="middle",n=o>0&&c>o?i>0?"right":"left":i>0?"left":"right"),{rotation:o,textAlign:n,verticalAlign:a}}function a(t,e,i){var n,a,o=h(-t.rotation),r=i[0]>i[1],s="start"===e&&!r||"start"!==e&&r;return u(o-c/2)?(a=s?"bottom":"top",n="center"):u(o-1.5*c)?(a=s?"top":"bottom",n="center"):(a="middle",n=1.5*c>o&&o>c/2?s?"left":"right":s?"right":"left"),{rotation:o,textAlign:n,verticalAlign:a}}var o=i(1),r=i(3),s=i(12),l=i(4),h=l.remRadian,u=l.isRadianAroundZero,c=Math.PI,d=function(t,e){this.opt=e,this.axisModel=t,o.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new r.Group({position:e.position.slice(),rotation:e.rotation})};d.prototype={constructor:d,hasBuilder:function(t){return!!f[t]},add:function(t){f[t].call(this)},getGroup:function(){return this.group}};var f={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var i=this.axisModel.axis.getExtent();this.group.add(new r.Line({shape:{x1:i[0],y1:0,x2:i[1],y2:0},style:o.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold,silent:!!t.silent,z2:1}))}},axisTick:function(){var t=this.axisModel;if(t.get("axisTick.show")){for(var e=t.axis,i=t.getModel("axisTick"),n=this.opt,a=i.getModel("lineStyle"),o=i.get("length"),s=g(i,n.labelInterval),l=e.getTicksCoords(),h=[],u=0;uc[1]?-1:1,f=["start"===s?c[0]-d*u:"end"===s?c[1]+d*u:(c[0]+c[1])/2,"middle"===s?t.labelOffset+l*u:0];o="middle"===s?n(t,t.rotation,l):a(t,s,c),this.group.add(new r.Text({style:{text:i,textFont:h.getFont(),fill:h.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:o.textAlign,textVerticalAlign:o.verticalAlign},position:f,rotation:o.rotation,silent:!0,z2:1}))}}},p=d.ifIgnoreOnTick=function(t,e,i){var n,a=t.scale;return"ordinal"===a.type&&("function"==typeof i?(n=a.getTicks()[e],!i(n,a.getLabel(n))):e%(i+1))},g=d.getInterval=function(t,e){var i=t.get("interval");return null!=i&&"auto"!=i||(i=e),i};t.exports=d},function(t,e,i){function n(t){return r.isObject(t)&&null!=t.value?t.value:t}function a(){return"category"===this.get("type")&&r.map(this.get("data"),n)}function o(){return s.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))}var r=i(1),s=i(23);t.exports={getFormattedLabels:o,getCategories:a}},function(t,e,i){"use strict";function n(t,e){return e.type||(e.data?"category":"value")}var a=i(10),o=i(1),r=i(61),s=a.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this._resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this._resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this._resetRange()},setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},getMin:function(){var t=this.option;return null!=t.rangeStart?t.rangeStart:t.min},getMax:function(){var t=this.option;return null!=t.rangeEnd?t.rangeEnd:t.max},getNeedCrossZero:function(){var t=this.option;return null!=t.rangeStart||null!=t.rangeEnd?!1:!t.scale},_resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}});o.merge(s.prototype,i(49));var l={gridIndex:0};r("x",s,n,l),r("y",s,n,l),t.exports=s},function(t,e,i){function n(t,e,i){return i.getComponent("grid",t.get("gridIndex"))===e}function a(t){var e,i=t.model,n=i.getFormattedLabels(),a=1,o=n.length;o>40&&(a=Math.ceil(o/40));for(var r=0;o>r;r+=a)if(!t.isLabelIgnored(r)){var s=i.getTextRect(n[r]);e?e.union(s):e=s}return e}function o(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this._model=t}function r(t,e){var i=t.getExtent(),n=i[0]+i[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return n-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return n-t+e}}var s=i(11),l=i(23),h=i(1),u=i(107),c=i(105),d=h.each,f=l.ifAxisCrossZero,p=l.niceScaleExtent;i(108);var g=o.prototype;g.type="grid",g.getRect=function(){return this._rect},g.update=function(t,e){function i(t){var e=n[t];for(var i in e){var a=e[i];if(a&&("category"===a.type||!f(a)))return!0}return!1}var n=this._axesMap;this._updateScale(t,this._model),d(n.x,function(t){p(t,t.model)}),d(n.y,function(t){p(t,t.model)}),d(n.x,function(t){i("y")&&(t.onZero=!1)}),d(n.y,function(t){i("x")&&(t.onZero=!1)}),this.resize(this._model,e)},g.resize=function(t,e){function i(){d(o,function(t){var e=t.isHorizontal(),i=e?[0,n.width]:[0,n.height],a=t.inverse?1:0;t.setExtent(i[a],i[1-a]),r(t,e?n.x:n.y)})}var n=s.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=n;var o=this._axesList;i(),t.get("containLabel")&&(d(o,function(t){if(!t.model.get("axisLabel.inside")){var e=a(t);if(e){var i=t.isHorizontal()?"height":"width",o=t.model.get("axisLabel.margin");n[i]-=e[i]+o,"top"===t.position?n.y+=e.height+o:"left"===t.position&&(n.x+=e.width+o)}}}),i())},g.getAxis=function(t,e){var i=this._axesMap[t];if(null!=i){if(null==e)for(var n in i)return i[n];return i[e]}},g.getCartesian=function(t,e){var i="x"+t+"y"+e;return this._coordsMap[i]},g._initCartesian=function(t,e,i){function a(i){return function(a,h){if(n(a,t,e)){var u=a.get("position");"x"===i?("top"!==u&&"bottom"!==u&&(u="bottom"),o[u]&&(u="top"===u?"bottom":"top")):("left"!==u&&"right"!==u&&(u="left"),o[u]&&(u="left"===u?"right":"left")),o[u]=!0;var d=new c(i,l.createScaleByModel(a),[0,0],a.get("type"),u),f="category"===d.type;d.onBand=f&&a.get("boundaryGap"),d.inverse=a.get("inverse"),d.onZero=a.get("axisLine.onZero"),a.axis=d,d.model=a,d.index=h,this._axesList.push(d), +r[i][h]=d,s[i]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},r={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",a("x"),this),e.eachComponent("yAxis",a("y"),this),s.x&&s.y?(this._axesMap=r,void d(r.x,function(t,e){d(r.y,function(i,n){var a="x"+e+"y"+n,o=new u(a);o.grid=this,this._coordsMap[a]=o,this._coordsList.push(o),o.addAxis(t),o.addAxis(i)},this)},this)):(this._axesMap={},void(this._axesList=[]))},g._updateScale=function(t,e){function i(t,e,i){d(i.coordDimToDataDim(e.dim),function(i){e.scale.unionExtent(t.getDataExtent(i,"ordinal"!==e.scale.type))})}h.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(a){if("cartesian2d"===a.get("coordinateSystem")){var o=a.get("xAxisIndex"),r=a.get("yAxisIndex"),s=t.getComponent("xAxis",o),l=t.getComponent("yAxis",r);if(!n(s,e,t)||!n(l,e,t))return;var h=this.getCartesian(o,r),u=a.getData(),c=h.getAxis("x"),d=h.getAxis("y");"list"===u.type&&(i(u,c,a),i(u,d,a))}},this)},o.create=function(t,e){var i=[];return t.eachComponent("grid",function(n,a){var r=new o(n,t,e);r.name="grid_"+a,r.resize(n,e),n.coordinateSystem=r,i.push(r)}),t.eachSeries(function(e){if("cartesian2d"===e.get("coordinateSystem")){var n=e.get("xAxisIndex"),a=t.getComponent("xAxis",n),o=i[a.get("gridIndex")];e.coordinateSystem=o.getCartesian(n,e.get("yAxisIndex"))}}),i},o.dimensions=u.prototype.dimensions,i(28).register("cartesian2d",o),t.exports=o},function(t,e){"use strict";function i(t){return t}function n(t,e,n,a){this._old=t,this._new=e,this._oldKeyGetter=n||i,this._newKeyGetter=a||i}function a(t,e,i){for(var n=0;nt;t++)this._add&&this._add(h[t]);else this._add&&this._add(h)}}},t.exports=n},function(t,e){t.exports=function(t,e,i){e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem,n=i.dimensions;e.each(n,function(t,n,a){var o;o=isNaN(t)||isNaN(n)?[NaN,NaN]:i.dataToPoint([t,n]),e.setItemLayout(a,o)},!0)})}},function(t,e,i){var n=i(26),a=i(41),o=i(20),r=function(){this.group=new n,this.uid=a.getUID("viewComponent")};r.prototype={constructor:r,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){}};var s=r.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,i,n){},o.enableClassExtend(r),o.enableClassManagement(r,{registerWhenExtend:!0}),t.exports=r},function(t,e,i){"use strict";var n=i(58),a=i(21),o=i(77),r=i(154),s=i(1),l=function(t){o.call(this,t),a.call(this,t),r.call(this,t),this.id=t.id||n()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=e,this.decomposeTransform(),this.dirty()},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var i=this[t];i||(i=this[t]=[]),i[0]=e[0],i[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var i in t)t.hasOwnProperty(i)&&this.attrKV(i,t[i]);return this.dirty(),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty()},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty())},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var i=0;i.5?e:t}function s(t,e,i,n,a){var r=t.length;if(1==a)for(var s=0;r>s;s++)n[s]=o(t[s],e[s],i);else for(var l=t[0].length,s=0;r>s;s++)for(var h=0;l>h;h++)n[s][h]=o(t[s][h],e[s][h],i)}function l(t,e,i){var n=t.length,a=e.length;if(n!==a){var o=n>a;if(o)t.length=a;else for(var r=n;a>r;r++)t.push(1===i?e[r]:x.call(e[r]))}}function h(t,e,i){if(t===e)return!0;var n=t.length;if(n!==e.length)return!1;if(1===i){for(var a=0;n>a;a++)if(t[a]!==e[a])return!1}else for(var o=t[0].length,a=0;n>a;a++)for(var r=0;o>r;r++)if(t[a][r]!==e[a][r])return!1;return!0}function u(t,e,i,n,a,o,r,s,l){var h=t.length;if(1==l)for(var u=0;h>u;u++)s[u]=c(t[u],e[u],i[u],n[u],a,o,r);else for(var d=t[0].length,u=0;h>u;u++)for(var f=0;d>f;f++)s[u][f]=c(t[u][f],e[u][f],i[u][f],n[u][f],a,o,r)}function c(t,e,i,n,a,o,r){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*r+(-3*(e-i)-2*s-l)*o+s*a+e}function d(t){if(y(t)){var e=t.length;if(y(t[0])){for(var i=[],n=0;e>n;n++)i.push(x.call(t[n]));return i}return x.call(t)}return t}function f(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t,e,i,n,a){var d=t._getter,p=t._setter,v="spline"===e,x=n.length;if(x){var _,w=n[0].value,b=y(w),M=!1,S=!1,A=b&&y(w[0])?2:1;n.sort(function(t,e){return t.time-e.time}),_=n[x-1].time;for(var I=[],T=[],C=n[0].value,L=!0,D=0;x>D;D++){I.push(n[D].time/_);var P=n[D].value;if(b&&h(P,C,A)||!b&&P===C||(L=!1),C=P,"string"==typeof P){var k=m.parse(P);k?(P=k,M=!0):S=!0}T.push(P)}if(!L){if(b){for(var z=T[x-1],D=0;x-1>D;D++)l(T[D],z,A);l(d(t._target,a),z,A)}var R,E,O,V,N,B,G=0,F=0;if(M)var W=[0,0,0,0];var H=function(t,e){var i;if(F>e){for(R=Math.min(G+1,x-1),i=R;i>=0&&!(I[i]<=e);i--);i=Math.min(i,x-2)}else{for(i=G;x>i&&!(I[i]>e);i++);i=Math.min(i-1,x-2)}G=i,F=e;var n=I[i+1]-I[i];if(0!==n)if(E=(e-I[i])/n,v)if(V=T[i],O=T[0===i?i:i-1],N=T[i>x-2?x-1:i+1],B=T[i>x-3?x-1:i+2],b)u(O,V,N,B,E,E*E,E*E*E,d(t,a),A);else{var l;if(M)l=u(O,V,N,B,E,E*E,E*E*E,W,1),l=f(W);else{if(S)return r(V,N,E);l=c(O,V,N,B,E,E*E,E*E*E)}p(t,a,l)}else if(b)s(T[i],T[i+1],E,d(t,a),A);else{var l;if(M)s(T[i],T[i+1],E,W,1),l=f(W);else{if(S)return r(T[i],T[i+1],E);l=o(T[i],T[i+1],E)}p(t,a,l)}},Z=new g({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:H,ondestroy:i});return e&&"spline"!==e&&(Z.easing=e),Z}}}var g=i(132),m=i(22),v=i(1),y=v.isArrayLike,x=Array.prototype.slice,_=function(t,e,i,o){this._tracks={},this._target=t,this._loop=e||!1,this._getter=i||n,this._setter=o||a,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var i=this._tracks;for(var n in e){if(!i[n]){i[n]=[];var a=this._getter(this._target,n);if(null==a)continue;0!==t&&i[n].push({time:0,value:d(a)})}i[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,i=0;e>i;i++)t[i].call(this)},start:function(t){var e,i=this,n=0,a=function(){n--,n||i._doneCallback()};for(var o in this._tracks){var r=p(this,t,a,this._tracks[o],o);r&&(this._clipList.push(r),n++,this.animation&&this.animation.addClip(r),e=r)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var n=0;nt&&(t+=i),t}}},function(t,e){var i=2311;t.exports=function(){return"zr_"+i++}},function(t,e,i){var n=i(144),a=i(143);t.exports={buildPath:function(t,e,i){var o=e.points,r=e.smooth;if(o&&o.length>=2){if(r&&"spline"!==r){var s=a(o,r,i,e.smoothConstraint);t.moveTo(o[0][0],o[0][1]);for(var l=o.length,h=0;(i?l:l-1)>h;h++){var u=s[2*h],c=s[2*h+1],d=o[(h+1)%l];t.bezierCurveTo(u[0],u[1],c[0],c[1],d[0],d[1])}}else{"spline"===r&&(o=n(o,i)),t.moveTo(o[0][0],o[0][1]);for(var h=1,f=o.length;f>h;h++)t.lineTo(o[h][0],o[h][1])}i&&t.closePath()}}}},function(t,e){t.exports={buildPath:function(t,e){var i,n,a,o,r=e.x,s=e.y,l=e.width,h=e.height,u=e.r;0>l&&(r+=l,l=-l),0>h&&(s+=h,h=-h),"number"==typeof u?i=n=a=o=u:u instanceof Array?1===u.length?i=n=a=o=u[0]:2===u.length?(i=a=u[0],n=o=u[1]):3===u.length?(i=u[0],n=o=u[1],a=u[2]):(i=u[0],n=u[1],a=u[2],o=u[3]):i=n=a=o=0;var c;i+n>l&&(c=i+n,i*=l/c,n*=l/c),a+o>l&&(c=a+o,a*=l/c,o*=l/c),n+a>h&&(c=n+a,n*=h/c,a*=h/c),i+o>h&&(c=i+o,i*=h/c,o*=h/c),t.moveTo(r+i,s),t.lineTo(r+l-n,s),0!==n&&t.quadraticCurveTo(r+l,s,r+l,s+n),t.lineTo(r+l,s+h-a),0!==a&&t.quadraticCurveTo(r+l,s+h,r+l-a,s+h),t.lineTo(r+o,s+h),0!==o&&t.quadraticCurveTo(r,s+h,r,s+h-o),t.lineTo(r,s+i),0!==i&&t.quadraticCurveTo(r,s,r+i,s)}}},function(t,e,i){var n=i(72),a=i(1),o=i(10),r=i(11),s=["value","category","time","log"];t.exports=function(t,e,i,l){a.each(s,function(o){e.extend({type:t+"Axis."+o,mergeDefaultAndTheme:function(e,n){var s=this.layoutMode,l=s?r.getLayoutParams(e):{},h=n.getTheme();a.merge(e,h.get(o+"Axis")),a.merge(e,this.getDefaultOption()),e.type=i(t,e),s&&r.mergeLayoutParam(e,l,s)},defaultOption:a.mergeAll([{},n[o+"Axis"],l],!0)})}),o.registerSubTypeDefaulter(t+"Axis",a.curry(i,t))}},function(t,e){t.exports=function(t,e){var i=e.findComponents({mainType:"legend"});i&&i.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var n=e.getName(t),a=0;af;f++){var x=v(t,i,o,h,p[f]);c[0]=r(x,c[0]),d[0]=s(x,d[0])}for(y=m(e,n,l,u,g),f=0;y>f;f++){var _=v(e,n,l,u,g[f]);c[1]=r(_,c[1]),d[1]=s(_,d[1])}c[0]=r(t,c[0]),d[0]=s(t,d[0]),c[0]=r(h,c[0]),d[0]=s(h,d[0]),c[1]=r(e,c[1]),d[1]=s(e,d[1]),c[1]=r(u,c[1]),d[1]=s(u,d[1])},o.fromQuadratic=function(t,e,i,n,o,l,h,u){var c=a.quadraticExtremum,d=a.quadraticAt,f=s(r(c(t,i,o),1),0),p=s(r(c(e,n,l),1),0),g=d(t,i,o,f),m=d(e,n,l,p);h[0]=r(t,o,g),h[1]=r(e,l,m),u[0]=s(t,o,g),u[1]=s(e,l,m)},o.fromArc=function(t,e,i,a,o,r,s,p,g){var m=n.min,v=n.max,y=Math.abs(o-r);if(1e-4>y%f&&y>1e-4)return p[0]=t-i,p[1]=e-a,g[0]=t+i,void(g[1]=e+a);if(u[0]=h(o)*i+t,u[1]=l(o)*a+e,c[0]=h(r)*i+t,c[1]=l(r)*a+e,m(p,u,c),v(g,u,c),o%=f,0>o&&(o+=f),r%=f,0>r&&(r+=f),o>r&&!s?r+=f:r>o&&s&&(o+=f),s){var x=r;r=o,o=x}for(var _=0;r>_;_+=Math.PI/2)_>o&&(d[0]=h(_)*i+t,d[1]=l(_)*a+e,m(p,d,p),v(g,d,g))},t.exports=o},function(t,e,i){var n=i(35),a=i(1),o=i(17),r=function(t){n.call(this,t)};r.prototype={constructor:r,type:"text",brush:function(t){var e=this.style,i=e.x||0,n=e.y||0,a=e.text,r=e.fill,s=e.stroke;if(null!=a&&(a+=""),a){if(t.save(),this.style.bind(t),this.setTransform(t),r&&(t.fillStyle=r),s&&(t.strokeStyle=s),t.font=e.textFont||e.font,t.textAlign=e.textAlign,e.textVerticalAlign){var l=o.getBoundingRect(a,t.font,e.textAlign,"top");switch(t.textBaseline="top",e.textVerticalAlign){case"middle":n-=l.height/2;break;case"bottom":n-=l.height}}else t.textBaseline=e.textBaseline;for(var h=o.measureText("国",t.font).width,u=a.split("\n"),c=0;c=0?parseFloat(t)/100*e:parseFloat(t):t}function a(t,e){t.transform(e[0],e[1],e[2],e[3],e[4],e[5])}var o=i(17),r=i(8),s=new r,l=function(){};l.prototype={constructor:l,drawRectText:function(t,e,i){var r=this.style,l=r.text;if(null!=l&&(l+=""),l){var h,u,c=r.textPosition,d=r.textDistance,f=r.textAlign,p=r.textFont||r.font,g=r.textBaseline,m=r.textVerticalAlign;i=i||o.getBoundingRect(l,p,f,g);var v=this.transform,y=this.invTransform;if(v&&(s.copy(e),s.applyTransform(v),e=s,a(t,y)),c instanceof Array)h=e.x+n(c[0],e.width),u=e.y+n(c[1],e.height),f=f||"left",g=g||"top";else{var x=o.adjustTextPositionOnRect(c,e,i,d);h=x.x,u=x.y,f=f||x.textAlign,g=g||x.textBaseline}if(t.textAlign=f,m){switch(m){case"middle":u-=i.height/2;break;case"bottom":u-=i.height}t.textBaseline="top"}else t.textBaseline=g;var _=r.textFill,w=r.textStroke;_&&(t.fillStyle=_),w&&(t.strokeStyle=w),t.font=p,t.shadowColor=r.textShadowColor,t.shadowBlur=r.textShadowBlur,t.shadowOffsetX=r.textShadowOffsetX,t.shadowOffsetY=r.textShadowOffsetY;for(var b=l.split("\n"),M=0;M0?1.1:1/1.1;l.call(this,t,e,t.offsetX,t.offsetY)}function s(t){if(!f.isTaken("globalPan",this._zr)){d.stop(t.event);var e=t.pinchScale>1?1.1:1/1.1;l.call(this,t,e,t.pinchX,t.pinchY)}}function l(t,e,i,n){var a=this.rect;if(a&&a.contain(i,n)){var o=this.target,r=this.zoomLimit;if(o){var s=o.position,l=o.scale,h=this.zoom=this.zoom||1;h*=e,r&&(h=Math.max(Math.min(r.max,h),r.min));var u=h/this.zoom;this.zoom=h,s[0]-=(i-s[0])*(u-1),s[1]-=(n-s[1])*(u-1),l[0]*=u,l[1]*=u,o.dirty()}this.trigger("zoom",e,i,n)}}function h(t,e,i){this.target=e,this.rect=i,this.zoomLimit,this.zoom,this._zr=t;var l=c.bind,h=l(n,this),d=l(a,this),f=l(o,this),p=l(r,this),g=l(s,this);u.call(this),this.enable=function(e){this.disable(),null==e&&(e=!0),e!==!0&&"move"!==e&&"pan"!==e||(t.on("mousedown",h),t.on("mousemove",d),t.on("mouseup",f)),e!==!0&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",p),t.on("pinch",g))},this.disable=function(){t.off("mousedown",h),t.off("mousemove",d),t.off("mouseup",f),t.off("mousewheel",p),t.off("pinch",g)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}var u=i(21),c=i(1),d=i(33),f=i(102);c.mixin(h,u),t.exports=h},function(t,e){t.exports=function(t,e,i,n,a){function o(t,e,i){var n=e.length?e.slice():[e,e];return e[0]>e[1]&&n.reverse(),0>t&&n[0]+t0&&n[1]+t>i[1]&&(t=i[1]-n[1]),t}return t?("rigid"===n?(t=o(t,e,i),e[0]+=t,e[1]+=t):(t=o(t,e[a],i),e[a]+=t,"push"===n&&e[0]>e[1]&&(e[1-a]=e[a])),e):e}},function(t,e,i){var n=i(1),a={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameTextStyle:{},nameGap:15,axisLine:{show:!0,onZero:!0,lineStyle:{color:"#333",width:1,type:"solid"}},axisTick:{show:!0,inside:!1,length:5,lineStyle:{color:"#333",width:1}},axisLabel:{show:!0,inside:!1,rotate:0,margin:8,textStyle:{color:"#333",fontSize:12}},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},o=n.merge({boundaryGap:!0,axisTick:{interval:"auto"},axisLabel:{interval:"auto"}},a),r=n.defaults({boundaryGap:[0,0],splitNumber:5},a),s=n.defaults({scale:!0,min:"dataMin",max:"dataMax"},r),l=n.defaults({},r);l.scale=!0,t.exports={categoryAxis:o,valueAxis:r,timeAxis:s,logAxis:l}},function(t,e,i){function n(t,e,i,n){return c.isArray(t)?c.map(t,function(t){return f(t,e,i,n)}):f(t,e,i,n)}function a(t){var e=t.pieceList;t.hasSpecialVisual=!1,c.each(e,function(e,i){e.originIndex=i,e.visual&&(t.hasSpecialVisual=!0)})}function o(t){var e=t.categories,i=t.visual,n=c.isArray(i);if(!e){if(n)return;throw new Error}var a=t.categoryMap={};if(p(e,function(t,e){a[t]=e}),!n){var o=[];c.isObject(i)?p(i,function(t,e){var i=a[e];o[null!=i?i:m]=t}):o[m]=i,i=t.visual=o}for(var r=e.length-1;r>=0;r--)null==i[r]&&(delete a[e[r]],e.pop())}function r(t){return{applyVisual:function(e,i,n){var a=i("color"),o=c.isArray(e);if(e=o?[this.mapValueToVisual(e[0]),this.mapValueToVisual(e[1])]:this.mapValueToVisual(e),c.isArray(a))for(var r=0,s=a.length;s>r;r++)a[r].color=t(a[r].color,o?e[r]:e);else n("color",t(a,e))},mapValueToVisual:function(t){var e=this._normalizeData(t),i=this._getSpecifiedVisual(t),a=this.option.visual;return null==i&&(i=u(this)?h(this,a,e):n(e,[0,1],a,!0)),i}}}function s(t,e){return t[Math.round(n(e,[0,1],[0,t.length-1],!0))]}function l(t,e,i){i("color",this.mapValueToVisual(t))}function h(t,e,i){return e[t.option.loop&&i!==m?i%e.length:i]}function u(t){return"category"===t.option.mappingMethod}var c=i(1),d=i(22),f=i(4).linearMap,p=c.each,g=c.isObject,m=-1,v=function(t){var e=t.mappingMethod,i=t.type;this.type=i,this.mappingMethod=e;var n=this.option=c.clone(t);this._normalizeData=x[e],this._getSpecifiedVisual=c.bind(_[e],this,i),c.extend(this,y[i]),"piecewise"===e&&a(n),"category"===e&&o(n)};v.prototype={constructor:v,applyVisual:null,isValueActive:null,mapValueToVisual:null,getNormalizer:function(){return c.bind(this._normalizeData,this)}};var y=v.visualHandlers={color:{applyVisual:l,getColorMapper:function(){var t=u(this)?this.option.visual:c.map(this.option.visual,d.parse);return c.bind(u(this)?function(e,i){return!i&&(e=this._normalizeData(e)),h(this,t,e)}:function(e,i,n){var a=!!n;return!i&&(e=this._normalizeData(e)),n=d.fastMapToColor(e,t,n),a?n:c.stringify(n,"rgba")},this)},mapValueToVisual:function(t){var e=this.option.visual;if(c.isArray(t))return t=[this._normalizeData(t[0]),this._normalizeData(t[1])],d.mapIntervalToColor(t,e);var i=this._normalizeData(t),n=this._getSpecifiedVisual(t);return null==n&&(n=u(this)?h(this,e,i):d.mapToColor(i,e)),n}},colorHue:r(function(t,e){return d.modifyHSL(t,e)}),colorSaturation:r(function(t,e){return d.modifyHSL(t,null,e)}),colorLightness:r(function(t,e){return d.modifyHSL(t,null,null,e)}),colorAlpha:r(function(t,e){return d.modifyAlpha(t,e)}),symbol:{applyVisual:function(t,e,i){var n=this.mapValueToVisual(t);if(c.isString(n))i("symbol",n);else if(g(n))for(var a in n)n.hasOwnProperty(a)&&i(a,n[a])},mapValueToVisual:function(t){var e=this._normalizeData(t),i=this._getSpecifiedVisual(t),n=this.option.visual;return null==i&&(i=u(this)?h(this,n,e):s(n,e)||{}),i}},symbolSize:{applyVisual:function(t,e,i){i("symbolSize",this.mapValueToVisual(t))},mapValueToVisual:function(t){var e=this._normalizeData(t),i=this._getSpecifiedVisual(t),a=this.option.visual;return null==i&&(i=u(this)?h(this,a,e):n(e,[0,1],a,!0)),i}}},x={linear:function(t){return n(t,this.option.dataExtent,[0,1],!0)},piecewise:function(t){var e=this.option.pieceList,i=v.findPieceIndex(t,e);return null!=i?n(i,[0,e.length-1],[0,1],!0):void 0},category:function(t){var e=this.option.categories?this.option.categoryMap[t]:t;return null==e?m:e}},_={linear:c.noop,piecewise:function(t,e){var i=this.option,n=i.pieceList;if(i.hasSpecialVisual){var a=v.findPieceIndex(e,n),o=n[a];if(o&&o.visual)return o.visual[t]}},category:c.noop};v.addVisualHandler=function(t,e){y[t]=e},v.isValidType=function(t){return y.hasOwnProperty(t)},v.eachVisual=function(t,e,i){c.isObject(t)?c.each(t,e,i):e.call(i,t)},v.mapVisual=function(t,e,i){var n,a=c.isArray(t)?[]:c.isObject(t)?{}:(n=!0,null);return v.eachVisual(t,function(t,o){var r=e.call(i,t,o);n?a=r:a[o]=r}),a},v.isInVisualCluster=function(t,e){return"color"===e?!(!t||0!==t.indexOf(e)):t===e},v.retrieveVisuals=function(t){var e,i={};return t&&p(y,function(n,a){t.hasOwnProperty(a)&&(i[a]=t[a],e=!0)}),e?i:null},v.prepareVisualTypes=function(t){if(g(t)){var e=[];p(t,function(t,i){e.push(i)}),t=e}else{if(!c.isArray(t))return[];t=t.slice()}return t.sort(function(t,e){return"color"===e&&"color"!==t&&0===t.indexOf("color")?1:-1}),t},v.findPieceIndex=function(t,e){for(var i=0,n=e.length;n>i;i++){var a=e[i];if(null!=a.value&&a.value===t)return i}for(var i=0,n=e.length;n>i;i++){var a=e[i],o=a.interval;if(o)if(o[0]===-(1/0)){if(te&&o>n||e>o&&n>o)return 0;if(n===e)return 0;var r=e>n?1:-1,s=(o-e)/(n-e),l=s*(i-t)+t;return l>a?r:0}},function(t,e,i){"use strict";var n=i(1),a=i(16),o=function(t,e,i,n,o){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==i?1:i,this.y2=null==n?0:n,a.call(this,o)};o.prototype={constructor:o,type:"linear",updateCanvasGradient:function(t,e){for(var i=t.getBoundingRect(),n=this.x*i.width+i.x,a=this.x2*i.width+i.x,o=this.y*i.height+i.y,r=this.y2*i.height+i.y,s=e.createLinearGradient(n,o,a,r),l=this.colorStops,h=0;hs||-s>t}var a=i(19),o=i(5),r=a.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},h=l.prototype;h.transform=null,h.needLocalTransform=function(){return n(this.rotation)||n(this.position[0])||n(this.position[1])||n(this.scale[0]-1)||n(this.scale[1]-1)},h.updateTransform=function(){var t=this.parent,e=t&&t.transform,i=this.needLocalTransform(),n=this.transform;return i||e?(n=n||a.create(),i?this.getLocalTransform(n):r(n),e&&(i?a.mul(n,t.transform,n):a.copy(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||a.create(),void a.invert(this.invTransform,n)):void(n&&r(n))},h.getLocalTransform=function(t){t=t||[],r(t);var e=this.origin,i=this.scale,n=this.rotation,o=this.position;return e&&(t[4]-=e[0],t[5]-=e[1]),a.scale(t,t,i),n&&a.rotate(t,t,n),e&&(t[4]+=e[0],t[5]+=e[1]),t[4]+=o[0],t[5]+=o[1],t},h.setTransform=function(t){var e=this.transform;e&&t.transform(e[0],e[1],e[2],e[3],e[4],e[5])};var u=[];h.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(a.mul(u,t.invTransform,e),e=u);var i=e[0]*e[0]+e[1]*e[1],o=e[2]*e[2]+e[3]*e[3],r=this.position,s=this.scale;n(i-1)&&(i=Math.sqrt(i)),n(o-1)&&(o=Math.sqrt(o)),e[0]<0&&(i=-i),e[3]<0&&(o=-o),r[0]=e[4],r[1]=e[5],s[0]=i,s[1]=o,this.rotation=Math.atan2(-e[1]/o,e[0]/i)}},h.transformCoordToLocal=function(t,e){var i=[t,e],n=this.invTransform;return n&&o.applyTransform(i,i,n),i},h.transformCoordToGlobal=function(t,e){var i=[t,e],n=this.transform;return n&&o.applyTransform(i,i,n),i},t.exports=l},function(t,e,i){"use strict";function n(t){a.each(o,function(e){this[e]=a.bind(t[e],t)},this)}var a=i(1),o=["getDom","getZr","getWidth","getHeight","dispatchAction","on","off","getDataURL","getConnectedDataURL","getModel","getOption"];t.exports=n},function(t,e,i){var n=i(1);i(51),i(80),i(81);var a=i(110),o=i(2);o.registerLayout(n.curry(a,"bar")),o.registerVisualCoding("chart",function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),i(34)},function(t,e,i){"use strict";var n=i(13),a=i(36);t.exports=n.extend({type:"series.bar",dependencies:["grid","polar"],getInitialData:function(t,e){return a(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var i=e.dataToPoint(t),n=this.getData(),a=n.getLayout("offset"),o=n.getLayout("size"),r=e.getBaseAxis().isHorizontal()?0:1;return i[r]+=a+o/2,i}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,barMinHeight:0,itemStyle:{normal:{barBorderColor:"#fff",barBorderWidth:0},emphasis:{barBorderColor:"#fff",barBorderWidth:0}}}})},function(t,e,i){"use strict";function n(t,e){var i=t.width>0?1:-1,n=t.height>0?1:-1;e=Math.min(e,Math.abs(t.width),Math.abs(t.height)),t.x+=i*e/2,t.y+=n*e/2,t.width-=i*e,t.height-=n*e}var a=i(1),o=i(3);a.extend(i(12).prototype,i(82)),t.exports=i(2).extendChartView({type:"bar",render:function(t,e,i){var n=t.get("coordinateSystem");return"cartesian2d"===n&&this._renderOnCartesian(t,e,i),this.group},_renderOnCartesian:function(t,e,i){function r(e,i){var r=l.getItemLayout(e),s=l.getItemModel(e).get(p)||0;n(r,s);var h=new o.Rect({shape:a.extend({},r)});if(f){var u=h.shape,c=d?"height":"width",g={};u[c]=0,g[c]=r[c],o[i?"updateProps":"initProps"](h,{shape:g},t)}return h}var s=this.group,l=t.getData(),h=this._data,u=t.coordinateSystem,c=u.getBaseAxis(),d=c.isHorizontal(),f=t.get("animation"),p=["itemStyle","normal","barBorderWidth"];l.diff(h).add(function(t){if(l.hasValue(t)){var e=r(t);l.setItemGraphicEl(t,e),s.add(e)}}).update(function(e,i){var a=h.getItemGraphicEl(i);if(!l.hasValue(e))return void s.remove(a);a||(a=r(e,!0));var u=l.getItemLayout(e),c=l.getItemModel(e).get(p)||0;n(u,c),o.updateProps(a,{shape:u},t),l.setItemGraphicEl(e,a),s.add(a)}).remove(function(e){var i=h.getItemGraphicEl(e);i&&(i.style.text="",o.updateProps(i,{shape:{width:0}},t,function(){s.remove(i)}))}).execute(),this._updateStyle(t,l,d),this._data=l},_updateStyle:function(t,e,i){function n(t,e,i,n,a){o.setText(t,e,i),t.text=n,"outside"===t.textPosition&&(t.textPosition=a)}e.eachItemGraphicEl(function(r,s){var l=e.getItemModel(s),h=e.getItemVisual(s,"color"),u=e.getItemLayout(s),c=l.getModel("itemStyle.normal"),d=l.getModel("itemStyle.emphasis").getBarItemStyle();r.setShape("r",c.get("barBorderRadius")||0),r.setStyle(a.defaults({fill:h},c.getBarItemStyle()));var f=i?u.height>0?"bottom":"top":u.width>0?"left":"right",p=l.getModel("label.normal"),g=l.getModel("label.emphasis"),m=r.style;p.get("show")?n(m,p,h,a.retrieve(t.getFormattedLabel(s,"normal"),t.getRawValue(s)),f):m.text="",g.get("show")?n(d,g,h,a.retrieve(t.getFormattedLabel(s,"emphasis"),t.getRawValue(s)),f):d.text="",o.setHoverStyle(r,d)})},remove:function(t,e){var i=this.group;t.get("animation")?this._data&&this._data.eachItemGraphicEl(function(e){e.style.text="",o.updateProps(e,{shape:{width:0}},t,function(){i.remove(e)})}):i.removeAll()}})},function(t,e,i){t.exports={getBarItemStyle:i(30)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]])}},function(t,e,i){function n(t,e,i){var n=e.getItemVisual(i,"color"),a=e.getItemVisual(i,"symbol"),o=e.getItemVisual(i,"symbolSize");if("none"!==a){p.isArray(o)||(o=[o,o]);var r=u.createSymbol(a,-o[0]/2,-o[1]/2,o[0],o[1],n);return r.name=t,r}}function a(t){var e=new d({name:"line",style:{strokeNoScale:!0}});return o(e.shape,t),e}function o(t,e){var i=e[0],n=e[1],a=e[2];t.x1=i[0],t.y1=i[1],t.x2=n[0],t.y2=n[1],t.percent=1,a&&(t.cpx1=a[0],t.cpy1=a[1])}function r(t){return"symbol"===t.type&&"arrow"===t.shape.symbolType}function s(){var t=this,e=t.childOfName("line");if(this.__dirty||e.__dirty){var i=t.childOfName("fromSymbol"),n=t.childOfName("toSymbol"),a=t.childOfName("label"),o=e.pointAt(0),s=e.pointAt(e.shape.percent),h=c.sub([],s,o);c.normalize(h,h),i&&(i.attr("position",o),r(i)&&i.attr("rotation",l(s,o))),n&&(n.attr("position",s),r(n)&&n.attr("rotation",l(o,s))),a.attr("position",s);var u,d,f;"end"===a.__position?(u=[5*h[0]+s[0],5*h[1]+s[1]],d=h[0]>.8?"left":h[0]<-.8?"right":"center",f=h[1]>.8?"top":h[1]<-.8?"bottom":"middle"):(u=[5*-h[0]+o[0],5*-h[1]+o[1]],d=h[0]>.8?"right":h[0]<-.8?"left":"center",f=h[1]>.8?"bottom":h[1]<-.8?"top":"middle"),a.attr({style:{textVerticalAlign:a.__verticalAlign||f,textAlign:a.__textAlign||d},position:u})}}function l(t,e){return-Math.PI/2-Math.atan2(e[1]-t[1],e[0]-t[0])}function h(t,e,i,n){f.Group.call(this),this._createLine(t,e,i,n)}var u=i(24),c=i(5),d=i(162),f=i(3),p=i(1),g=i(4),m=h.prototype;m.beforeUpdate=s,m._createLine=function(t,e,i,o){var r=t.hostModel,s=t.getItemLayout(o),l=a(s);l.shape.percent=0,f.initProps(l,{shape:{percent:1}},r),this.add(l);var h=new f.Text({name:"label"});if(this.add(h),e){var u=n("fromSymbol",e,o);this.add(u),this._fromSymbolType=e.getItemVisual(o,"symbol")}if(i){var c=n("toSymbol",i,o);this.add(c),this._toSymbolType=i.getItemVisual(o,"symbol")}this._updateCommonStl(t,e,i,o)},m.updateData=function(t,e,i,a){var r=t.hostModel,s=this.childOfName("line"),l=t.getItemLayout(a),h={shape:{}};if(o(h.shape,l),f.updateProps(s,h,r),e){var u=e.getItemVisual(a,"symbol");if(this._fromSymbolType!==u){var c=n("fromSymbol",e,a);this.remove(this.childOfName("fromSymbol")),this.add(c)}this._fromSymbolType=u}if(i){var d=i.getItemVisual(a,"symbol");if(d!==this._toSymbolType){var p=n("toSymbol",i,a);this.remove(this.childOfName("toSymbol")),this.add(p)}this._toSymbolType=d}this._updateCommonStl(t,e,i,a)},m._updateCommonStl=function(t,e,i,n){var a=t.hostModel,o=this.childOfName("line"),r=t.getItemModel(n),s=r.getModel("label.normal"),l=s.getModel("textStyle"),h=r.getModel("label.emphasis"),u=h.getModel("textStyle"),c=g.round(a.getRawValue(n));isNaN(c)&&(c=t.getName(n)),o.setStyle(p.extend({stroke:t.getItemVisual(n,"color")},r.getModel("lineStyle.normal").getLineStyle()));var d=this.childOfName("label");d.setStyle({text:s.get("show")?p.retrieve(a.getFormattedLabel(n,"normal"),c):"",textFont:l.getFont(),fill:l.getTextColor()||t.getItemVisual(n,"color")}),d.hoverStyle={text:h.get("show")?p.retrieve(a.getFormattedLabel(n,"emphasis"),c):"",textFont:u.getFont(),fill:u.getTextColor()},d.__textAlign=l.get("align"),d.__verticalAlign=l.get("baseline"),d.__position=s.get("position"),f.setHoverStyle(this,r.getModel("lineStyle.emphasis").getLineStyle())},m.updateLayout=function(t,e,i,n){var a=t.getItemLayout(n),r=this.childOfName("line");o(r.shape,a),r.dirty(!0)},p.inherits(h,f.Group),t.exports=h},function(t,e,i){function n(t){this._ctor=t||o,this.group=new a.Group}var a=i(3),o=i(83),r=n.prototype;r.updateData=function(t,e,i){var n=this._lineData,a=this.group,o=this._ctor;t.diff(n).add(function(n){var r=new o(t,e,i,n);t.setItemGraphicEl(n,r),a.add(r)}).update(function(o,r){var s=n.getItemGraphicEl(r);s.updateData(t,e,i,o),t.setItemGraphicEl(o,s),a.add(s)}).remove(function(t){a.remove(n.getItemGraphicEl(t))}).execute(),this._lineData=t,this._fromData=e,this._toData=i},r.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,i){e.updateLayout(t,this._fromData,this._toData,i)},this)},r.remove=function(){this.group.removeAll()},t.exports=n},function(t,e,i){var n=i(1),a=i(2);i(86),i(87),a.registerVisualCoding("chart",n.curry(i(44),"line","circle","line")),a.registerLayout(n.curry(i(53),"line")),a.registerProcessor("statistic",n.curry(i(122),"line")),i(34)},function(t,e,i){"use strict";var n=i(36),a=i(13);t.exports=a.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return n(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,polarIndex:0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},symbol:"emptyCircle",symbolSize:4,showSymbol:!0,animationEasing:"linear"}})},function(t,e,i){"use strict";function n(t,e){if(t.length===e.length){for(var i=0;ie[0]?1:-1;e[0]+=n*i,e[1]-=n*i}return e}function r(t){return t>=0?1:-1}function s(t,e){var i=t.getBaseAxis(),n=t.getOtherAxis(i),a=i.onZero?0:n.scale.getExtent()[0],o=n.dim,s="x"===o||"radius"===o?1:0;return e.mapArray([o],function(n,l){for(var h,u=e.stackedOn;u&&r(u.get(o,l))===r(n);){h=u;break}var c=[];return c[s]=e.get(i.dim,l),c[1-s]=h?h.get(o,l,!0):a,t.dataToPoint(c)},!0)}function l(t,e){return null!=e.dataIndex?e.dataIndex:null!=e.name?t.indexOfName(e.name):void 0}function h(t,e,i){var n=o(t.getAxis("x")),a=o(t.getAxis("y")),r=t.getBaseAxis().isHorizontal(),s=n[0],l=a[0],h=n[1]-s,u=a[1]-l;i.get("clipOverflow")||(r?(l-=u,u*=3):(s-=h,h*=3));var c=new m.Rect({shape:{x:s,y:l,width:h,height:u}});return e&&(c.shape[r?"width":"height"]=0,m.initProps(c,{shape:{width:h,height:u}},i)),c}function u(t,e,i){var n=t.getAngleAxis(),a=t.getRadiusAxis(),o=a.getExtent(),r=n.getExtent(),s=Math.PI/180,l=new m.Sector({shape:{cx:t.cx,cy:t.cy,r0:o[0],r:o[1],startAngle:-r[0]*s,endAngle:-r[1]*s,clockwise:n.inverse}});return e&&(l.shape.endAngle=-r[0]*s,m.initProps(l,{shape:{endAngle:-r[1]*s}},i)),l}function c(t,e,i){return"polar"===t.type?u(t,e,i):h(t,e,i)}var d=i(1),f=i(38),p=i(47),g=i(88),m=i(3),v=i(89),y=i(25);t.exports=y.extend({type:"line",init:function(){var t=new m.Group,e=new f;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var o=t.coordinateSystem,r=this.group,l=t.getData(),h=t.getModel("lineStyle.normal"),u=t.getModel("areaStyle.normal"),f=l.mapArray(l.getItemLayout,!0),p="polar"===o.type,g=this._coordSys,m=this._symbolDraw,v=this._polyline,y=this._polygon,x=this._lineGroup,_=t.get("animation"),w=!u.isEmpty(),b=s(o,l),M=t.get("showSymbol"),S=M&&!p&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(l,o),A=this._data;A&&A.eachItemGraphicEl(function(t,e){t.__temp&&(r.remove(t),A.setItemGraphicEl(e,null))}),M||m.remove(),r.add(x),v&&g.type===o.type?(w&&!y?y=this._newPolygon(f,b,o,_):y&&!w&&(x.remove(y),y=this._polygon=null),x.setClipPath(c(o,!1,t)),M&&m.updateData(l,S),l.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),n(this._stackedOnPoints,b)&&n(this._points,f)||(_?this._updateAnimation(l,b,o,i):(v.setShape({points:f}),y&&y.setShape({points:f,stackedOnPoints:b})))):(M&&m.updateData(l,S),v=this._newPolyline(f,o,_),w&&(y=this._newPolygon(f,b,o,_)),x.setClipPath(c(o,!0,t))),v.setStyle(d.defaults(h.getLineStyle(),{stroke:l.getVisual("color"),lineJoin:"bevel"}));var I=t.get("smooth");if(I=a(t.get("smooth")),v.setShape({smooth:I,smoothMonotone:t.get("smoothMonotone")}),y){var T=l.stackedOn,C=0;if(y.style.opacity=.7,y.setStyle(d.defaults(u.getAreaStyle(),{fill:l.getVisual("color"),lineJoin:"bevel"})),T){var L=T.hostModel;C=a(L.get("smooth"))}y.setShape({smooth:I,stackedOnSmooth:C,smoothMonotone:t.get("smoothMonotone")})}this._data=l,this._coordSys=o,this._stackedOnPoints=b,this._points=f},highlight:function(t,e,i,n){var a=t.getData(),o=l(a,n);if(null!=o&&o>=0){var r=a.getItemGraphicEl(o);if(!r){var s=a.getItemLayout(o);r=new p(a,o,i),r.position=s,r.setZ(t.get("zlevel"),t.get("z")),r.ignore=isNaN(s[0])||isNaN(s[1]),r.__temp=!0,a.setItemGraphicEl(o,r),r.stopSymbolAnimation(!0),this.group.add(r)}r.highlight()}else y.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var a=t.getData(),o=l(a,n);if(null!=o&&o>=0){var r=a.getItemGraphicEl(o);r&&(r.__temp?(a.setItemGraphicEl(o,null),this.group.remove(r)):r.downplay())}else y.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new v.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new v.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i,i},_getSymbolIgnoreFunc:function(t,e){var i=e.getAxesByScale("ordinal")[0];return i&&i.isLabelIgnored?d.bind(i.isLabelIgnored,i):void 0},_updateAnimation:function(t,e,i,n){var a=this._polyline,o=this._polygon,r=t.hostModel,s=g(this._data,t,this._stackedOnPoints,e,this._coordSys,i);a.shape.points=s.current,m.updateProps(a,{shape:{points:s.next}},r),o&&(o.setShape({points:s.current,stackedOnPoints:s.stackedOnCurrent}),m.updateProps(o,{shape:{points:s.next,stackedOnPoints:s.stackedOnNext}},r));for(var l=[],h=s.status,u=0;u=0?1:-1}function n(t,e,n){for(var a,o=t.getBaseAxis(),r=t.getOtherAxis(o),s=o.onZero?0:r.scale.getExtent()[0],l=r.dim,h="x"===l||"radius"===l?1:0,u=e.stackedOn,c=e.get(l,n);u&&i(u.get(l,n))===i(c);){a=u;break}var d=[];return d[h]=e.get(o.dim,n),d[1-h]=a?a.get(l,n,!0):s,t.dataToPoint(d)}function a(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}t.exports=function(t,e,i,o,r,s){for(var l=a(t,e),h=[],u=[],c=[],d=[],f=[],p=[],g=[],m=s.dimensions,v=0;vx;x++){var _=e[y];if(y>=n||0>y||isNaN(_[0])||isNaN(_[1]))break;if(y===i)t[o>0?"moveTo":"lineTo"](_[0],_[1]),u(d,_);else if(m>0){var w=y-o,b=y+o,M=.5,S=e[w],A=e[b];if(o>0&&(y===a-1||isNaN(A[0])||isNaN(A[1]))||0>=o&&(0===y||isNaN(A[0])||isNaN(A[1])))u(f,_);else{(isNaN(A[0])||isNaN(A[1]))&&(A=_),r.sub(c,A,S);var I,T;if("x"===v||"y"===v){var C="x"===v?0:1;I=Math.abs(_[C]-S[C]),T=Math.abs(_[C]-A[C])}else I=r.dist(_,S),T=r.dist(_,A);M=T/(T+I),h(f,_,c,-m*(1-M))}s(d,d,g),l(d,d,p),s(f,f,g),l(f,f,p),t.bezierCurveTo(d[0],d[1],f[0],f[1],_[0],_[1]),h(d,_,c,m*M)}else t.lineTo(_[0],_[1]);y+=o}return x}function a(t,e){var i=[1/0,1/0],n=[-(1/0),-(1/0)];if(e)for(var a=0;an[0]&&(n[0]=o[0]),o[1]>n[1]&&(n[1]=o[1])}return{min:e?i:n,max:e?n:i}}var o=i(6),r=i(5),s=r.min,l=r.max,h=r.scaleAndAdd,u=r.copy,c=[],d=[],f=[];t.exports={Polyline:o.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null},style:{fill:null,stroke:"#000"},buildPath:function(t,e){for(var i=e.points,o=0,r=i.length,s=a(i,e.smoothConstraint);r>o;)o+=n(t,i,o,r,r,1,s.min,s.max,e.smooth,e.smoothMonotone)+1}}),Polygon:o.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null},buildPath:function(t,e){for(var i=e.points,o=e.stackedOnPoints,r=0,s=i.length,l=e.smoothMonotone,h=a(i,e.smoothConstraint),u=a(o,e.smoothConstraint);s>r;){var c=n(t,i,r,s,s,1,h.min,h.max,e.smooth,l);n(t,o,r+c-1,s,c,-1,u.min,u.max,e.stackedOnSmooth,l),r+=c+1,t.closePath()}}})}},function(t,e,i){var n=i(1),a=i(2);i(91),i(92),i(68)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),a.registerVisualCoding("chart",n.curry(i(63),"pie")),a.registerLayout(n.curry(i(94),"pie")),a.registerProcessor("filter",n.curry(i(62),"pie"))},function(t,e,i){"use strict";var n=i(14),a=i(1),o=i(7),r=i(31),s=i(69),l=i(2).extendSeriesModel({type:"series.pie",init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._dataBeforeProcessed},this.updateSelectedMap(),this._defaultLabelLine(t)},mergeOption:function(t){l.superCall(this,"mergeOption",t),this.updateSelectedMap()},getInitialData:function(t,e){var i=r(["value"],t.data),a=new n(i,this);return a.initData(t.data),a},getDataParams:function(t){var e=this._data,i=l.superCall(this,"getDataParams",t),n=e.getSum("value");return i.percent=n?+(e.get("value",t)/n*100).toFixed(2):0,i.$vars.push("percent"),i},_defaultLabelLine:function(t){o.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1 +}},animationEasing:"cubicOut",data:[]}});a.mixin(l,s),t.exports=l},function(t,e,i){function n(t,e,i,n){var o=e.getData(),r=this.dataIndex,s=o.getName(r),l=e.get("selectedOffset");n.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),o.each(function(t){a(o.getItemGraphicEl(t),o.getItemLayout(t),e.isSelected(o.getName(t)),l,i)})}function a(t,e,i,n,a){var o=(e.startAngle+e.endAngle)/2,r=Math.cos(o),s=Math.sin(o),l=i?n:0,h=[r*l,s*l];a?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function o(t,e){function i(){o.ignore=o.hoverIgnore,r.ignore=r.hoverIgnore}function n(){o.ignore=o.normalIgnore,r.ignore=r.normalIgnore}s.Group.call(this);var a=new s.Sector({z2:2}),o=new s.Polyline,r=new s.Text;this.add(a),this.add(o),this.add(r),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function r(t,e,i,n,a){var o=n.getModel("textStyle"),r="inside"===a||"inner"===a;return{fill:o.getTextColor()||(r?"#fff":t.getItemVisual(e,"color")),textFont:o.getFont(),text:l.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var s=i(3),l=i(1),h=o.prototype;h.updateData=function(t,e,i){function n(){r.stopAnimation(!0),r.animateTo({shape:{r:c.r+10}},300,"elasticOut")}function o(){r.stopAnimation(!0),r.animateTo({shape:{r:c.r}},300,"elasticOut")}var r=this.childAt(0),h=t.hostModel,u=t.getItemModel(e),c=t.getItemLayout(e),d=l.extend({},c);d.label=null,i?(r.setShape(d),r.shape.endAngle=c.startAngle,s.updateProps(r,{shape:{endAngle:c.endAngle}},h)):s.updateProps(r,{shape:d},h);var f=u.getModel("itemStyle"),p=t.getItemVisual(e,"color");r.setStyle(l.defaults({fill:p},f.getModel("normal").getItemStyle())),r.hoverStyle=f.getModel("emphasis").getItemStyle(),a(this,t.getItemLayout(e),u.get("selected"),h.get("selectedOffset"),h.get("animation")),r.off("mouseover").off("mouseout").off("emphasis").off("normal"),u.get("hoverAnimation")&&r.on("mouseover",n).on("mouseout",o).on("emphasis",n).on("normal",o),this._updateLabel(t,e),s.setHoverStyle(this)},h._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),a=t.hostModel,o=t.getItemModel(e),l=t.getItemLayout(e),h=l.label,u=t.getItemVisual(e,"color");s.updateProps(i,{shape:{points:h.linePoints||[[h.x,h.y],[h.x,h.y],[h.x,h.y]]}},a),s.updateProps(n,{style:{x:h.x,y:h.y}},a),n.attr({style:{textVerticalAlign:h.verticalAlign,textAlign:h.textAlign,textFont:h.font},rotation:h.rotation,origin:[h.x,h.y],z2:10});var c=o.getModel("label.normal"),d=o.getModel("label.emphasis"),f=o.getModel("labelLine.normal"),p=o.getModel("labelLine.emphasis"),g=c.get("position")||d.get("position");n.setStyle(r(t,e,"normal",c,g)),n.ignore=n.normalIgnore=!c.get("show"),n.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:u}),i.setStyle(f.getModel("lineStyle").getLineStyle()),n.hoverStyle=r(t,e,"emphasis",d,g),i.hoverStyle=p.getModel("lineStyle").getLineStyle();var m=f.get("smooth");m&&m===!0&&(m=.4),i.setShape({smooth:m})},l.inherits(o,s.Group);var u=i(25).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,i,a){if(!a||a.from!==this.uid){var r=t.getData(),s=this._data,h=this.group,u=e.get("animation"),c=!s,d=l.curry(n,this.uid,t,u,i),f=t.get("selectedMode");if(r.diff(s).add(function(t){var e=new o(r,t);c&&e.eachChild(function(t){t.stopAnimation(!0)}),f&&e.on("click",d),r.setItemGraphicEl(t,e),h.add(e)}).update(function(t,e){var i=s.getItemGraphicEl(e);i.updateData(r,t),i.off("click"),f&&i.on("click",d),h.add(i),r.setItemGraphicEl(t,i)}).remove(function(t){var e=s.getItemGraphicEl(t);h.remove(e)}).execute(),u&&c&&r.count()>0){var p=r.getItemLayout(0),g=Math.max(i.getWidth(),i.getHeight())/2,m=l.bind(h.removeClipPath,h);h.setClipPath(this._createClipPath(p.cx,p.cy,g,p.startAngle,p.clockwise,m,t))}this._data=r}},_createClipPath:function(t,e,i,n,a,o,r){var l=new s.Sector({shape:{cx:t,cy:e,r0:0,r:i,startAngle:n,endAngle:n,clockwise:a}});return s.initProps(l,{shape:{endAngle:n+(a?1:-1)*Math.PI*2}},r,o),l}});t.exports=u},function(t,e,i){"use strict";function n(t,e,i,n,a,o,r){function s(e,i,n,a){for(var o=e;i>o;o++)if(t[o].y+=n,o>e&&i>o+1&&t[o+1].y>t[o].y+t[o].height)return void l(o,n/2);l(i-1,n/2)}function l(e,i){for(var n=e;n>=0&&(t[n].y-=i,!(n>0&&t[n].y>t[n-1].y+t[n-1].height));n--);}function h(t,e,i,n,a,o){for(var r=o>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,l=t.length;l>s;s++)if("center"!==t[s].position){var h=Math.abs(t[s].y-n),u=t[s].len,c=t[s].len2,d=a+u>h?Math.sqrt((a+u+c)*(a+u+c)-h*h):Math.abs(t[s].x-i);e&&d>=r&&(d=r-10),!e&&r>=d&&(d=r+10),t[s].x=i+d*o,r=d}}t.sort(function(t,e){return t.y-e.y});for(var u,c=0,d=t.length,f=[],p=[],g=0;d>g;g++)u=t[g].y-c,0>u&&s(g,d,-u,a),c=t[g].y+t[g].height;0>r-c&&l(d-1,c-r);for(var g=0;d>g;g++)t[g].y>=i?p.push(t[g]):f.push(t[g]);h(f,!1,e,i,n,a),h(p,!0,e,i,n,a)}function a(t,e,i,a,o,r){for(var s=[],l=[],h=0;hw?-1:1)*x,L=T;n=C+(0>w?-5:5),a=L,c=[[S,A],[I,T],[C,L]]}d=M?"center":w>0?"left":"right"}var D=g.getModel("textStyle").getFont(),P=g.get("rotate")?0>w?-_+Math.PI:-_:0,k=t.getFormattedLabel(i,"normal")||l.getName(i),z=o.getBoundingRect(k,D,d,"top");u=!!P,f.label={x:n,y:a,position:m,height:z.height,len:y,len2:x,linePoints:c,textAlign:d,verticalAlign:"middle",font:D,rotation:P},M||h.push(f.label)}),!u&&t.get("avoidLabelOverlap")&&a(h,r,s,e,i,n)}},function(t,e,i){var n=i(4),a=n.parsePercent,o=i(93),r=i(1),s=2*Math.PI,l=Math.PI/180;t.exports=function(t,e,i){e.eachSeriesByType(t,function(t){var e=t.get("center"),h=t.get("radius");r.isArray(h)||(h=[0,h]),r.isArray(e)||(e=[e,e]);var u=i.getWidth(),c=i.getHeight(),d=Math.min(u,c),f=a(e[0],u),p=a(e[1],c),g=a(h[0],d/2),m=a(h[1],d/2),v=t.getData(),y=-t.get("startAngle")*l,x=t.get("minAngle")*l,_=v.getSum("value"),w=Math.PI/(_||v.count())*2,b=t.get("clockwise"),M=t.get("roseType"),S=v.getDataExtent("value");S[0]=0;var A=s,I=0,T=y,C=b?1:-1;if(v.each("value",function(t,e){var i;i="area"!==M?0===_?w:t*w:s/(v.count()||1),x>i?(i=x,A-=x):I+=t;var a=T+C*i;v.setItemLayout(e,{angle:i,startAngle:T,endAngle:a,clockwise:b,cx:f,cy:p,r0:g,r:M?n.linearMap(t,S,[g,m]):m}),T=a},!0),s>A)if(.001>=A){var L=s/v.count();v.each(function(t){var e=v.getItemLayout(t);e.startAngle=y+C*t*L,e.endAngle=y+C*(t+1)*L})}else w=A/I,T=y,v.each("value",function(t,e){var i=v.getItemLayout(e),n=i.angle===x?x:t*w;i.startAngle=T,i.endAngle=T+C*n,T+=n});o(t,m,u,c)})}},function(t,e,i){var n=i(1),a={retrieveTargetInfo:function(t,e){if(t&&("treemapZoomToNode"===t.type||"treemapRootToNode"===t.type)){var i=e.getData().tree.root,n=t.targetNode;if(n&&i.contains(n))return{node:n};var a=t.targetNodeId;if(null!=a&&(n=i.getNodeById(a)))return{node:n}}},getPathToRoot:function(t){for(var e=[];t;)e.push(t),t=t.parentNode;return e.reverse()},aboveViewRoot:function(t,e){var i=a.getPathToRoot(t);return a.aboveViewRootByViewPath(i,e)},aboveViewRootByViewPath:function(t,e){var i=n.indexOf(t,e);return i>=0&&i!==t.length-1}};t.exports=a},function(t,e,i){"use strict";i(50),i(97)},function(t,e,i){function n(t,e){function i(t,e){var i=n.getAxis(t);return i.toGlobalCoord(i.dataToCoord(0))}var n=t.coordinateSystem,a=e.axis,o={},r=a.position,s=a.onZero?"onZero":r,l=a.dim,h=n.getRect(),u=[h.x,h.x+h.width,h.y,h.y+h.height],c={x:{top:u[2],bottom:u[3]},y:{left:u[0],right:u[1]}};c.x.onZero=Math.max(Math.min(i("y"),c.x.bottom),c.x.top),c.y.onZero=Math.max(Math.min(i("x"),c.y.right),c.y.left),o.position=["y"===l?c.y[s]:u[0],"x"===l?c.x[s]:u[3]];var d={x:0,y:1};o.rotation=Math.PI/2*d[l];var f={top:-1,bottom:1,left:-1,right:1};o.labelDirection=o.tickDirection=o.nameDirection=f[r],a.onZero&&(o.labelOffset=c[l][r]-c[l].onZero),e.getModel("axisTick").get("inside")&&(o.tickDirection=-o.tickDirection),e.getModel("axisLabel").get("inside")&&(o.labelDirection=-o.labelDirection);var p=e.getModel("axisLabel").get("rotate");return o.labelRotation="top"===s?-p:p,o.labelInterval=a.getLabelInterval(),o.z2=1,o}var a=i(1),o=i(3),r=i(48),s=r.ifIgnoreOnTick,l=r.getInterval,h=["axisLine","axisLabel","axisTick","axisName"],u=["splitLine","splitArea"],c=i(2).extendComponentView({type:"axis",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=e.getComponent("grid",t.get("gridIndex")),o=n(i,t),s=new r(t,o);a.each(h,s.add,s),this.group.add(s.getGroup()),a.each(u,function(e){t.get(e+".show")&&this["_"+e](t,i,o.labelInterval)},this)}},_splitLine:function(t,e,i){var n=t.axis,r=t.getModel("splitLine"),h=r.getModel("lineStyle"),u=h.get("width"),c=h.get("color"),d=l(r,i);c=a.isArray(c)?c:[c];for(var f=e.coordinateSystem.getRect(),p=n.isHorizontal(),g=[],m=0,v=n.getTicksCoords(),y=[],x=[],_=0;_=0;a--){var o=i[a];if(o[n])break}if(0>a){var r=t.queryComponents({mainType:"dataZoom",subType:"select",id:n})[0];if(r){var s=r.getPercentRange();i[0][n]={dataZoomId:n,start:s[0],end:s[1]}}}}),i.push(e)},pop:function(t){var e=n(t),i=e[e.length-1];e.length>1&&e.pop();var a={};return o(i,function(t,i){for(var n=e.length-1;n>=0;n--){var t=e[n][i];if(t){a[i]=t;break}}}),a},clear:function(t){t[r]=null},count:function(t){return n(t).length}};t.exports=s},function(t,e,i){i(10).registerSubTypeDefaulter("dataZoom",function(t){return"slider"})},function(t,e){function i(t){return t[n]||(t[n]={})}var n="\x00_ec_interaction_mutex",a={take:function(t,e){i(e)[t]=!0},release:function(t,e){i(e)[t]=!1},isTaken:function(t,e){return!!i(e)[t]}};t.exports=a},function(t,e,i){function n(t,e,i){a.positionGroup(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"))}var a=i(11),o=i(9),r=i(3);t.exports={layout:function(t,e,i){var o=a.getLayoutRect(e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()},e.get("padding"));a.box(e.get("orient"),t,e.get("itemGap"),o.width,o.height),n(t,e,i)},addBackground:function(t,e){var i=o.normalizeCssArray(e.get("padding")),n=t.getBoundingRect(),a=e.getItemStyle(["color","opacity"]);a.fill=e.get("backgroundColor");var s=new r.Rect({shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[1]+i[3],height:n.height+i[0]+i[2]},style:a,silent:!0,z2:-1});r.subPixelOptimizeRect(s),t.add(s)}}},function(t,e,i){function n(t,e,i){var n=-1;do n=Math.max(r.getPrecision(t.get(e,i)),n),t=t.stackedOn;while(t);return n}function a(t,e,i,a,o,r){var s=[],l=p(e,a,t),h=e.indexOfNearest(a,l,!0);s[o]=e.get(i,h,!0),s[r]=e.get(a,h,!0);var u=n(e,a,h);return u>=0&&(s[r]=+s[r].toFixed(u)),s}var o=i(1),r=i(4),s=o.indexOf,l=o.curry,h={min:l(a,"min"),max:l(a,"max"),average:l(a,"average")},u=function(t,e){var i=t.getData(),n=t.coordinateSystem;if((isNaN(e.x)||isNaN(e.y))&&!o.isArray(e.coord)&&n){var a=c(e,i,n,t);if(e=o.clone(e),e.type&&h[e.type]&&a.baseAxis&&a.valueAxis){var r=n.dimensions,l=s(r,a.baseAxis.dim),u=s(r,a.valueAxis.dim);e.coord=h[e.type](i,a.baseDataDim,a.valueDataDim,l,u),e.value=e.coord[u]}else e.coord=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis]}return e},c=function(t,e,i,n){var a={};return null!=t.valueIndex||null!=t.valueDim?(a.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,a.valueAxis=i.getAxis(n.dataDimToCoordDim(a.valueDataDim)),a.baseAxis=i.getOtherAxis(a.valueAxis),a.baseDataDim=n.coordDimToDataDim(a.baseAxis.dim)[0]):(a.baseAxis=n.getBaseAxis(),a.valueAxis=i.getOtherAxis(a.baseAxis),a.baseDataDim=n.coordDimToDataDim(a.baseAxis.dim)[0],a.valueDataDim=n.coordDimToDataDim(a.valueAxis.dim)[0]),a},d=function(t,e){return t&&t.containData&&e.coord&&(null==e.x||null==e.y)?t.containData(e.coord):!0},f=function(t,e,i,n){return 2>n?t.coord&&t.coord[n]:t.value},p=function(t,e,i){return"average"===i?t.getSum(e,!0)/t.count():t.getDataExtent(e,!0)["max"===i?1:0]};t.exports={dataTransform:u,dataFilter:d,dimValueGetter:f,getAxisInfo:c,numCalculate:p}},function(t,e,i){var n=i(1),a=i(43),o=i(109),r=function(t,e,i,n,o){a.call(this,t,e,i),this.type=n||"value",this.position=o||"bottom"};r.prototype={constructor:r,index:0,onZero:!1,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(){var t=this.getExtent();return t[0]=this.toGlobalCoord(t[0]),t[1]=this.toGlobalCoord(t[1]),t},getLabelInterval:function(){var t=this._labelInterval;return t||(t=this._labelInterval=o(this)),t},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},toLocalCoord:null,toGlobalCoord:null},n.inherits(r,a),t.exports=r},function(t,e,i){"use strict";function n(t){return this._axes[t]}var a=i(1),o=function(t){this._axes={},this._dimList=[],this.name=t||""};o.prototype={constructor:o,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return a.map(this._dimList,n,this)},getAxesByScale:function(t){return t=t.toLowerCase(),a.filter(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var i=this._dimList,n=t instanceof Array?[]:{},a=0;ai&&(i=Math.min(i,u),u-=i,t.width=i,c--)}),d=(u-s)/(c+(c-1)*h),d=Math.max(d,0);var f,p=0;r.each(i,function(t,e){t.width||(t.width=d),f=t,p+=t.width*(1+h)}),f&&(p-=f.width*h);var g=-p/2;r.each(i,function(t,i){a[e][i]=a[e][i]||{offset:g,width:t.width},g+=t.width*(1+h)})}),a}function o(t,e,i){var o=a(r.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),s={};e.eachSeriesByType(t,function(t){var e=t.getData(),i=t.coordinateSystem,a=i.getBaseAxis(),r=n(t),l=o[a.index][r],h=l.offset,u=l.width,c=i.getOtherAxis(a),d=t.get("barMinHeight")||0,f=a.onZero?c.toGlobalCoord(c.dataToCoord(0)):c.getGlobalExtent()[0],p=i.dataToPoints(e,!0);s[r]=s[r]||[],e.setLayout({offset:h,size:u}),e.each(c.dim,function(t,i){if(!isNaN(t)){s[r][i]||(s[r][i]={p:f,n:f});var n,a,o,l,g=t>=0?"p":"n",m=p[i],v=s[r][i][g];c.isHorizontal()?(n=v,a=m[1]+h,o=m[0]-v,l=u,Math.abs(o)o?-1:1)*d),s[r][i][g]+=o):(n=m[0]+h,a=v,o=u,l=m[1]-v,Math.abs(l)=l?-1:1)*d),s[r][i][g]+=l),e.setItemLayout(i,{x:n,y:a,width:o,height:l})}},!0)},this)}var r=i(1),s=i(4),l=s.parsePercent;t.exports=o},function(t,e,i){var n=i(3),a=i(1),o=Math.PI;t.exports=function(t,e){e=e||{},a.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var i=new n.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),r=new n.Arc({shape:{startAngle:-o/2,endAngle:-o/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new n.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});r.animateShape(!0).when(1e3,{endAngle:3*o/2}).start("circularInOut"),r.animateShape(!0).when(1e3,{startAngle:3*o/2}).delay(300).start("circularInOut");var l=new n.Group;return l.add(r),l.add(s),l.add(i),l.resize=function(){var e=t.getWidth()/2,n=t.getHeight()/2;r.setShape({cx:e,cy:n});var a=r.shape.r;s.setShape({x:e-a,y:n-a,width:2*a,height:2*a}),i.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},l.resize(),l}},function(t,e,i){function n(t,e){for(var i in e)_.hasClass(i)||("object"==typeof e[i]?t[i]=t[i]?c.merge(t[i],e[i],!1):c.clone(e[i]):null==t[i]&&(t[i]=e[i]))}function a(t){t=t,this.option={},this.option[b]=1,this._componentsMap={},this._seriesIndices=null,n(t,this._theme.option),c.merge(t,w,!1),this.mergeOption(t)}function o(t,e){c.isArray(e)||(e=e?[e]:[]);var i={};return p(e,function(e){i[e]=(t[e]||[]).slice()}),i}function r(t,e){var i={};p(e,function(t,e){var n=t.exist;n&&(i[n.id]=t)}),p(e,function(e,n){var a=e.option;if(c.assert(!a||null==a.id||!i[a.id]||i[a.id]===e,"id duplicates: "+(a&&a.id)),a&&null!=a.id&&(i[a.id]=e),x(a)){var o=s(t,a,e.exist);e.keyInfo={mainType:t,subType:o}}}),p(e,function(t,e){var n=t.exist,a=t.option,o=t.keyInfo;if(x(a)){if(o.name=null!=a.name?a.name+"":n?n.name:"\x00-",n)o.id=n.id;else if(null!=a.id)o.id=a.id+"";else{var r=0;do o.id="\x00"+o.name+"\x00"+r++;while(i[o.id])}i[o.id]=t}})}function s(t,e,i){var n=e.type?e.type:i?i.subType:_.determineSubType(t,e);return n}function l(t){return m(t,function(t){return t.componentIndex})||[]}function h(t,e){return e.hasOwnProperty("subType")?g(t,function(t){return t.subType===e.subType}):t}function u(t){if(!t._seriesIndices)throw new Error("Series has not been initialized yet.")}var c=i(1),d=i(7),f=i(12),p=c.each,g=c.filter,m=c.map,v=c.isArray,y=c.indexOf,x=c.isObject,_=i(10),w=i(114),b="\x00_ec_inner",M=f.extend({constructor:M,init:function(t,e,i,n){i=i||{},this.option=null,this._theme=new f(i),this._optionManager=n},setOption:function(t,e){c.assert(!(b in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption()},resetOption:function(t){var e=!1,i=this._optionManager;if(!t||"recreate"===t){var n=i.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(n)):a.call(this,n),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var o=i.getTimelineOption(this);o&&(this.mergeOption(o),e=!0)}if(!t||"recreate"===t||"media"===t){var r=i.getMediaOption(this,this._api);r.length&&p(r,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,a){var s=d.normalizeToArray(t[e]),h=d.mappingToExists(n[e],s);r(e,h);var u=o(n,a);i[e]=[],n[e]=[],p(h,function(t,a){var o=t.exist,r=t.option;if(c.assert(x(r)||o,"Empty component definition"),r){var s=_.getClass(e,t.keyInfo.subType,!0);o&&o instanceof s?(o.mergeOption(r,this),o.optionUpdated(this)):(o=new s(r,this,this,c.extend({dependentModels:u,componentIndex:a},t.keyInfo)),o.optionUpdated(this))}else o.mergeOption({},this),o.optionUpdated(this);n[e][a]=o,i[e][a]=o.option},this),"series"===e&&(this._seriesIndices=l(n.series))}var i=this.option,n=this._componentsMap,a=[];p(t,function(t,e){null!=t&&(_.hasClass(e)?a.push(e):i[e]=null==i[e]?c.clone(t):c.merge(i[e],t,!0))}),_.topologicalTravel(a,_.getAllClassMainTypes(),e,this)},getOption:function(){var t=c.clone(this.option);return p(t,function(e,i){if(_.hasClass(i)){for(var e=d.normalizeToArray(e),n=e.length-1;n>=0;n--)d.isIdInner(e[n])&&e.splice(n,1);t[i]=e}}),delete t[b],t},getTheme:function(){return this._theme},getComponent:function(t,e){var i=this._componentsMap[t];return i?i[e||0]:void 0},queryComponents:function(t){var e=t.mainType;if(!e)return[];var i=t.index,n=t.id,a=t.name,o=this._componentsMap[e];if(!o||!o.length)return[];var r;if(null!=i)v(i)||(i=[i]),r=g(m(i,function(t){return o[t]}),function(t){return!!t});else if(null!=n){var s=v(n);r=g(o,function(t){return s&&y(n,t.id)>=0||!s&&t.id===n})}else if(null!=a){var l=v(a);r=g(o,function(t){return l&&y(a,t.name)>=0||!l&&t.name===a})}return h(r,t)},findComponents:function(t){function e(t){var e=a+"Index",i=a+"Id",n=a+"Name";return t&&(t.hasOwnProperty(e)||t.hasOwnProperty(i)||t.hasOwnProperty(n))?{mainType:a,index:t[e],id:t[i],name:t[n]}:null}function i(e){return t.filter?g(e,t.filter):e}var n=t.query,a=t.mainType,o=e(n),r=o?this.queryComponents(o):this._componentsMap[a];return i(h(r,t))},eachComponent:function(t,e,i){var n=this._componentsMap;if("function"==typeof t)i=e,e=t,p(n,function(t,n){p(t,function(t,a){e.call(i,n,t,a)})});else if(c.isString(t))p(n[t],e,i);else if(x(t)){var a=this.findComponents(t);p(a,e,i)}},getSeriesByName:function(t){var e=this._componentsMap.series;return g(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return g(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){u(this),p(this._seriesIndices,function(i){var n=this._componentsMap.series[i];t.call(e,n,i)},this)},eachRawSeries:function(t,e){p(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,i){u(this),p(this._seriesIndices,function(n){var a=this._componentsMap.series[n];a.subType===t&&e.call(i,a,n)},this)},eachRawSeriesByType:function(t,e,i){return p(this.getSeriesByType(t),e,i)},isSeriesFiltered:function(t){return u(this),c.indexOf(this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){u(this);var i=g(this._componentsMap.series,t,e);this._seriesIndices=l(i)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=l(t.series);var e=[];p(t,function(t,i){e.push(i)}),_.topologicalTravel(e,_.getAllClassMainTypes(),function(e,i){p(t[e],function(t){t.restoreData()})})}});t.exports=M},function(t,e,i){function n(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newOptionBackup}function a(t,e){var i,n,a=[],o=[],r=t.timeline;if(t.baseOption&&(n=t.baseOption),(r||t.options)&&(n=n||{},a=(t.options||[]).slice()),t.media){n=n||{};var s=t.media;d(s,function(t){t&&t.option&&(t.query?o.push(t):i||(i=t))})}return n||(n=t),n.timeline||(n.timeline=r),d([n].concat(a).concat(h.map(o,function(t){return t.option})),function(t){d(e,function(e){e(t)})}),{baseOption:n,timelineOptions:a,mediaDefault:i,mediaList:o}}function o(t,e,i){var n={width:e,height:i,aspectratio:e/i},a=!0;return h.each(t,function(t,e){var i=e.match(m);if(i&&i[1]&&i[2]){var o=i[1],s=i[2].toLowerCase();r(n[s],t,o)||(a=!1)}}),a}function r(t,e,i){return"min"===i?t>=e:"max"===i?e>=t:t===e}function s(t,e){return t.join(",")===e.join(",")}function l(t,e){e=e||{},d(e,function(e,i){if(null!=e){var n=t[i];if(c.hasClass(i)){e=u.normalizeToArray(e),n=u.normalizeToArray(n);var a=u.mappingToExists(n,e);t[i]=p(a,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[i]=g(n,e,!0)}})}var h=i(1),u=i(7),c=i(10),d=h.each,f=h.clone,p=h.map,g=h.merge,m=/^(min|max)?(.+)$/;n.prototype={constructor:n,setOption:function(t,e){t=f(t,!0);var i=this._optionBackup,n=this._newOptionBackup=a.call(this,t,e);i?(l(i.baseOption,n.baseOption),n.timelineOptions.length&&(i.timelineOptions=n.timelineOptions),n.mediaList.length&&(i.mediaList=n.mediaList),n.mediaDefault&&(i.mediaDefault=n.mediaDefault)):this._optionBackup=n},mountOption:function(t){var e=t?this._optionBackup:this._newOptionBackup;return this._timelineOptions=p(e.timelineOptions,f),this._mediaList=p(e.mediaList,f),this._mediaDefault=f(e.mediaDefault),this._currentMediaIndices=[],f(e.baseOption)},getTimelineOption:function(t){var e,i=this._timelineOptions;if(i.length){var n=t.getComponent("timeline");n&&(e=f(i[n.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),i=this._api.getHeight(),n=this._mediaList,a=this._mediaDefault,r=[],l=[];if(!n.length&&!a)return l;for(var h=0,u=n.length;u>h;h++)o(n[h].query,e,i)&&r.push(h);return!r.length&&a&&(r=[-1]),r.length&&!s(r,this._currentMediaIndices)&&(l=p(r,function(t){return f(-1===t?a.option:n[t].option)})),this._currentMediaIndices=r,l}},t.exports=n},function(t,e){var i="";"undefined"!=typeof navigator&&(i=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],grid:{},textStyle:{fontFamily:i.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},animation:!0,animationThreshold:2e3,animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut"}},function(t,e,i){t.exports={getAreaStyle:i(30)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,i){t.exports={getItemStyle:i(30)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]])}},function(t,e,i){var n=i(30)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=n.call(this,t),i=this.getLineDash();return i&&(e.lineDash=i),e},getLineDash:function(){var t=this.get("type");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,i){function n(t,e){return t&&t.getShallow(e)}var a=i(17);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){var t=this.ecModel,e=t&&t.getModel("textStyle");return[this.getShallow("fontStyle")||n(e,"fontStyle"),this.getShallow("fontWeight")||n(e,"fontWeight"),(this.getShallow("fontSize")||n(e,"fontSize")||12)+"px",this.getShallow("fontFamily")||n(e,"fontFamily")||"sans-serif"].join(" ")},getTextRect:function(t){var e=this.get("textStyle")||{};return a.getBoundingRect(t,this.getFont(),e.align,e.baseline)},ellipsis:function(t,e,i){return a.ellipsis(t,this.getFont(),e,i)}}},function(t,e,i){function n(t,e){e=e.split(",");for(var i=t,n=0;ne&&(e=t[i]);return e},min:function(t){for(var e=1/0,i=0;i1){var c;"string"==typeof a?c=i[a]:"function"==typeof a&&(c=a),c&&(e=e.downSample(s.dim,1/u,c,n),t.setData(e))}}},this)}},function(t,e,i){var n=i(1),a=i(32),o=i(4),r=i(37),s=a.prototype,l=r.prototype,h=Math.floor,u=Math.ceil,c=Math.pow,d=10,f=Math.log,p=a.extend({type:"log",getTicks:function(){return n.map(l.getTicks.call(this),function(t){return o.round(c(d,t))})},getLabel:l.getLabel,scale:function(t){return t=s.scale.call(this,t),c(d,t)},setExtent:function(t,e){t=f(t)/f(d),e=f(e)/f(d),l.setExtent.call(this,t,e)},getExtent:function(){var t=s.getExtent.call(this);return t[0]=c(d,t[0]),t[1]=c(d,t[1]),t},unionExtent:function(t){t[0]=f(t[0])/f(d),t[1]=f(t[1])/f(d),s.unionExtent.call(this,t)},niceTicks:function(t){t=t||10;var e=this._extent,i=e[1]-e[0];if(!(i===1/0||0>=i)){var n=c(10,h(f(i/t)/Math.LN10)),a=t/i*n;.5>=a&&(n*=10);var r=[o.round(u(e[0]/n)*n),o.round(h(e[1]/n)*n)];this._interval=n,this._niceExtent=r}},niceExtent:l.niceExtent});n.each(["contain","normalize"],function(t){p.prototype[t]=function(e){return e=f(e)/f(d),s[t].call(this,e)}}),p.create=function(){return new p},t.exports=p},function(t,e,i){var n=i(1),a=i(32),o=a.prototype,r=a.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?n.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),o.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return o.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(o.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},niceTicks:n.noop,niceExtent:n.noop});r.create=function(){return new r},t.exports=r},function(t,e,i){var n=i(1),a=i(4),o=i(9),r=i(37),s=r.prototype,l=Math.ceil,h=Math.floor,u=864e5,c=function(t,e,i,n){for(;n>i;){var a=i+n>>>1;t[a][2]=0&&f():o>=0?f():i&&(c=setTimeout(f,-o)),h=l};return p.clear=function(){c&&(clearTimeout(c),c=null)},p}var o,r,s,l=(new Date).getTime(),h=0,u=0,c=null,d="function"==typeof t;if(e=e||0,d)return a();for(var f=[],p=0;p=0;a--)if(!n[a].silent&&n[a]!==i&&!n[a].ignore&&r(n[a],t,e))return n[a]}},f.mixin(A,m),f.mixin(A,p),t.exports=A},function(t,e,i){function n(){return!1}function a(t,e,i,n){var a=document.createElement(e),o=i.getWidth(),r=i.getHeight(),s=a.style;return s.position="absolute",s.left=0,s.top=0,s.width=o+"px",s.height=r+"px",a.width=o*n,a.height=r*n,a.setAttribute("data-zr-dom-id",t),a}var o=i(1),r=i(42),s=function(t,e,i){var s;i=i||r.devicePixelRatio,"string"==typeof t?s=a(t,"canvas",e,i):o.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var l=s.style;l&&(s.onselectstart=n,l["-webkit-user-select"]="none",l["user-select"]="none",l["-webkit-touch-callout"]="none",l["-webkit-tap-highlight-color"]="rgba(0,0,0,0)"),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=i};s.prototype={constructor:s,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d");var t=this.dpr;1!=t&&this.ctx.scale(t,t)},createBackBuffer:function(){var t=this.dpr;this.domBack=a("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var i=this.dpr,n=this.dom,a=n.style,o=this.domBack;a.width=t+"px",a.height=e+"px",n.width=t*i,n.height=e*i,1!=i&&this.ctx.scale(i,i),o&&(o.width=t*i,o.height=e*i,1!=i&&this.ctxBack.scale(i,i))},clear:function(t){var e=this.dom,i=this.ctx,n=e.width,a=e.height,o=this.clearColor,r=this.motionBlur&&!t,s=this.lastFrameAlpha,l=this.dpr;if(r&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,n/l,a/l)),i.clearRect(0,0,n/l,a/l),o&&(i.save(),i.fillStyle=this.clearColor,i.fillRect(0,0,n/l,a/l),i.restore()),r){var h=this.domBack;i.save(),i.globalAlpha=s,i.drawImage(h,0,0,n/l,a/l),i.restore()}}},t.exports=s},function(t,e,i){"use strict";function n(t){return parseInt(t,10)}function a(t){return t?t.isBuildin?!0:"function"==typeof t.resize&&"function"==typeof t.refresh:!1}function o(t){t.__unusedCount++}function r(t){t.__dirty=!1,1==t.__unusedCount&&t.clear()}function s(t,e,i){return g.copy(t.getBoundingRect()),t.transform&&g.applyTransform(t.transform),m.width=e,m.height=i,!g.intersect(m)}function l(t,e){if(!t||!e||t.length!==e.length)return!0;for(var i=0;ip;p++){var m=t[p],v=this._singleCanvas?0:m.zlevel;if(n!==v&&(n=v,i=this.getLayer(n),i.isBuildin||d("ZLevel "+n+" has been used by unkown layer "+i.id),a=i.ctx,i.__unusedCount=0,(i.__dirty||e)&&i.clear()),(i.__dirty||e)&&!m.invisible&&0!==m.style.opacity&&m.scale[0]&&m.scale[1]&&(!m.culling||!s(m,u,c))){var y=m.__clipPaths;l(y,f)&&(f&&a.restore(),y&&(a.save(),h(y,a)),f=y),m.beforeBrush&&m.beforeBrush(a),m.brush(a,!1),m.afterBrush&&m.afterBrush(a)}m.__dirty=!1}f&&a.restore(),this.eachBuildinLayer(r)},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new p("zr_"+t,this,this.dpr),e.isBuildin=!0,this._layerConfig[t]&&c.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var i=this._layers,n=this._zlevelList,o=n.length,r=null,s=-1,l=this._domRoot;if(i[t])return void d("ZLevel "+t+" has been used already");if(!a(e))return void d("Layer of zlevel "+t+" is not valid");if(o>0&&t>n[0]){for(s=0;o-1>s&&!(n[s]t);s++);r=i[n[s]]}if(n.splice(s+1,0,t),r){var h=r.dom;h.nextSibling?l.insertBefore(e.dom,h.nextSibling):l.appendChild(e.dom)}else l.firstChild?l.insertBefore(e.dom,l.firstChild):l.appendChild(e.dom);i[t]=e},eachLayer:function(t,e){var i,n,a=this._zlevelList;for(n=0;nn;n++){var o=t[n],r=this._singleCanvas?0:o.zlevel,s=e[r];if(s){if(s.elCount++,s.__dirty)continue;s.__dirty=o.__dirty}}this.eachBuildinLayer(function(t,e){i[e]!==t.elCount&&(t.__dirty=!0)})},clear:function(){return this.eachBuildinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var i=this._layerConfig;i[t]?c.merge(i[t],e,!0):i[t]=e;var n=this._layers[t];n&&c.merge(n,i[t],!0)}},delLayer:function(t){var e=this._layers,i=this._zlevelList,n=e[t];n&&(n.dom.parentNode.removeChild(n.dom),delete e[t],i.splice(c.indexOf(i,t),1))},resize:function(t,e){var i=this._domRoot;if(i.style.display="none",t=t||this._getWidth(),e=e||this._getHeight(),i.style.display="",this._width!=t||e!=this._height){i.style.width=t+"px",i.style.height=e+"px";for(var n in this._layers)this._layers[n].resize(t,e);this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new p("image",this,t.pixelRatio||this.dpr);e.initContext();var i=e.ctx;e.clearColor=t.backgroundColor,e.clear();for(var n=this.storage.getDisplayList(!0),a=0;aa;a++)this._updateAndAddDisplayable(e[a],null,t);i.length=this._displayListLen;for(var a=0,o=i.length;o>a;a++)i[a].__renderidx=a;i.sort(n)},_updateAndAddDisplayable:function(t,e,i){if(!t.ignore||i){t.beforeUpdate(),t.update(),t.afterUpdate();var n=t.clipPath;if(n&&(n.parent=t,n.updateTransform(),e?(e=e.slice(),e.push(n)):e=[n]),"group"==t.type){for(var a=t._children,o=0;oe;e++)this.delRoot(t[e]);else{var r;r="string"==typeof t?this._elements[t]:t;var s=a.indexOf(this._roots,r);s>=0&&(this.delFromMap(r.id),this._roots.splice(s,1),r instanceof o&&r.delChildrenFromStorage(this))}},addToMap:function(t){return t instanceof o&&(t.__storage=this),t.dirty(),this._elements[t.id]=t,this},get:function(t){return this._elements[t]},delFromMap:function(t){var e=this._elements,i=e[t];return i&&(delete e[t],i instanceof o&&(i.__storage=null)),this},dispose:function(){this._elements=this._renderList=this._roots=null}},t.exports=r},function(t,e,i){"use strict";var n=i(1),a=i(33).Dispatcher,o="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},r=i(56),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time=0,a.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),i=0;i=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),i=0;ir;r++){var s=i[r],l=s.step(t);l&&(a.push(l),o.push(s))}for(var r=0;n>r;)i[r]._needsRemove?(i[r]=i[n-1],i.pop(),n--):r++;n=a.length;for(var r=0;n>r;r++)o[r].fire(a[r]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},start:function(){function t(){e._running&&(o(t),e._update())}var e=this;this._running=!0,this._time=(new Date).getTime(),o(t)},stop:function(){this._running=!1},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var i=new r(t,e.loop,e.getter,e.setter);return i}},n.mixin(s,a),t.exports=s},function(t,e,i){function n(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null==t.loop?!1:t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}var a=i(133);n.prototype={constructor:n,step:function(t){this._initialized||(this._startTime=(new Date).getTime()+this._delay,this._initialized=!0);var e=(t-this._startTime)/this._life;if(!(0>e)){e=Math.min(e,1);var i=this.easing,n="string"==typeof i?a[i]:i,o="function"==typeof n?n(e):e;return this.fire("frame",o),1==e?this.loop?(this.restart(),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(){var t=(new Date).getTime(),e=(t-this._startTime)%this._life;this._startTime=(new Date).getTime()-e+this.gap,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)}},t.exports=n},function(t,e){var i={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),-(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)))},elasticOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),i*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/n)+1)},elasticInOut:function(t){var e,i=.1,n=.4;return 0===t?0:1===t?1:(!i||1>i?(i=1,e=n/4):e=n*Math.asin(1/i)/(2*Math.PI),(t*=2)<1?-.5*(i*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)):i*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/n)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-i.bounceOut(1-t)},bounceOut:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return.5>t?.5*i.bounceIn(2*t):.5*i.bounceOut(2*t-1)+.5}};t.exports=i},function(t,e,i){var n=i(57).normalizeRadian,a=2*Math.PI;t.exports={containStroke:function(t,e,i,o,r,s,l,h,u){if(0===l)return!1;var c=l;h-=t,u-=e;var d=Math.sqrt(h*h+u*u);if(d-c>i||i>d+c)return!1;if(Math.abs(o-r)%a<1e-4)return!0;if(s){var f=o;o=n(r),r=n(f)}else o=n(o),r=n(r);o>r&&(r+=a);var p=Math.atan2(u,h);return 0>p&&(p+=a),p>=o&&r>=p||p+a>=o&&r>=p+a}}},function(t,e,i){var n=i(18);t.exports={containStroke:function(t,e,i,a,o,r,s,l,h,u,c){if(0===h)return!1;var d=h;if(c>e+d&&c>a+d&&c>r+d&&c>l+d||e-d>c&&a-d>c&&r-d>c&&l-d>c||u>t+d&&u>i+d&&u>o+d&&u>s+d||t-d>u&&i-d>u&&o-d>u&&s-d>u)return!1;var f=n.cubicProjectPoint(t,e,i,a,o,r,s,l,u,c,null);return d/2>=f}}},function(t,e){t.exports={containStroke:function(t,e,i,n,a,o,r){if(0===a)return!1;var s=a,l=0,h=t;if(r>e+s&&r>n+s||e-s>r&&n-s>r||o>t+s&&o>i+s||t-s>o&&i-s>o)return!1;if(t===i)return Math.abs(o-t)<=s/2;l=(e-n)/(t-i),h=(t*n-i*e)/(t-i);var u=l*o-r+h,c=u*u/(l*l+1);return s/2*s/2>=c}}},function(t,e,i){"use strict";function n(t,e){return Math.abs(t-e)e&&u>n&&u>r&&u>l||e>u&&n>u&&r>u&&l>u)return 0;var c=g.cubicRootAt(e,n,r,l,u,_);if(0===c)return 0;for(var d,f,p=0,m=-1,v=0;c>v;v++){var y=_[v],x=g.cubicAt(t,i,o,s,y);h>x||(0>m&&(m=g.cubicExtrema(e,n,r,l,w),w[1]1&&a(),d=g.cubicAt(e,n,r,l,w[0]),m>1&&(f=g.cubicAt(e,n,r,l,w[1]))),p+=2==m?yd?1:-1:yf?1:-1:f>l?1:-1:yd?1:-1:d>l?1:-1)}return p}function r(t,e,i,n,a,o,r,s){if(s>e&&s>n&&s>o||e>s&&n>s&&o>s)return 0;var l=g.quadraticRootAt(e,n,o,s,_);if(0===l)return 0;var h=g.quadraticExtremum(e,n,o);if(h>=0&&1>=h){for(var u=0,c=g.quadraticAt(e,n,o,h),d=0;l>d;d++){var f=g.quadraticAt(t,i,a,_[d]);r>f||(u+=_[d]c?1:-1:c>o?1:-1)}return u}var f=g.quadraticAt(t,i,a,_[0]);return r>f?0:e>o?1:-1}function s(t,e,i,n,a,o,r,s){if(s-=e,s>i||-i>s)return 0;var l=Math.sqrt(i*i-s*s);_[0]=-l,_[1]=l;var h=Math.abs(n-a);if(1e-4>h)return 0;if(1e-4>h%y){n=0,a=y;var u=o?1:-1;return r>=_[0]+t&&r<=_[1]+t?u:0}if(o){var l=n;n=p(a),a=p(l)}else n=p(n),a=p(a);n>a&&(a+=y);for(var c=0,d=0;2>d;d++){var f=_[d];if(f+t>r){var g=Math.atan2(s,f),u=o?1:-1;0>g&&(g=y+g),(g>=n&&a>=g||g+y>=n&&a>=g+y)&&(g>Math.PI/2&&g<1.5*Math.PI&&(u=-u),c+=u)}}return c}function l(t,e,i,a,l){for(var u=0,p=0,g=0,y=0,x=0,_=0;_1&&(i||(u+=m(p,g,y,x,a,l)),0!==u))return!0;switch(1==_&&(p=t[_],g=t[_+1],y=p,x=g),w){case h.M:y=t[_++],x=t[_++],p=y,g=x;break;case h.L:if(i){if(v(p,g,t[_],t[_+1],e,a,l))return!0}else u+=m(p,g,t[_],t[_+1],a,l)||0;p=t[_++],g=t[_++];break;case h.C:if(i){if(c.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,a,l))return!0}else u+=o(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],a,l)||0;p=t[_++],g=t[_++];break;case h.Q:if(i){if(d.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,a,l))return!0}else u+=r(p,g,t[_++],t[_++],t[_],t[_+1],a,l)||0;p=t[_++],g=t[_++];break;case h.A:var b=t[_++],M=t[_++],S=t[_++],A=t[_++],I=t[_++],T=t[_++],C=(t[_++],1-t[_++]),L=Math.cos(I)*S+b,D=Math.sin(I)*A+M;_>1?u+=m(p,g,L,D,a,l):(y=L,x=D);var P=(a-b)*A/S+b;if(i){if(f.containStroke(b,M,A,I,I+T,C,e,P,l))return!0}else u+=s(b,M,A,I,I+T,C,P,l);p=Math.cos(I+T)*S+b,g=Math.sin(I+T)*A+M;break;case h.R:y=p=t[_++],x=g=t[_++];var k=t[_++],z=t[_++],L=y+k,D=x+z;if(i){if(v(y,x,L,x,e,a,l)||v(L,x,L,D,e,a,l)||v(L,D,y,D,e,a,l)||v(y,D,L,D,e,a,l))return!0}else u+=m(L,x,L,D,a,l),u+=m(y,D,y,x,a,l);break;case h.Z:if(i){if(v(p,g,y,x,e,a,l))return!0}else if(u+=m(p,g,y,x,a,l),0!==u)return!0;p=y,g=x}}return i||n(g,x)||(u+=m(p,g,y,x,a,l)||0),0!==u}var h=i(27).CMD,u=i(136),c=i(135),d=i(138),f=i(134),p=i(57).normalizeRadian,g=i(18),m=i(75),v=u.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],w=[-1,-1];t.exports={contain:function(t,e,i){return l(t,0,!1,e,i)},containStroke:function(t,e,i,n){return l(t,e,!0,i,n)}}},function(t,e,i){var n=i(18);t.exports={containStroke:function(t,e,i,a,o,r,s,l,h){if(0===s)return!1;var u=s;if(h>e+u&&h>a+u&&h>r+u||e-u>h&&a-u>h&&r-u>h||l>t+u&&l>i+u&&l>o+u||t-u>l&&i-u>l&&o-u>l)return!1;var c=n.quadraticProjectPoint(t,e,i,a,o,r,l,h,null);return u/2>=c}}},function(t,e){"use strict";function i(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}function n(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var a=function(){this._track=[]};a.prototype={constructor:a,recognize:function(t,e){return this._doTrack(t,e),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e){var i=t.touches;if(i){for(var n={points:[],touches:[],target:e,event:t},a=0,o=i.length;o>a;a++){var r=i[a];n.points.push([r.clientX,r.clientY]),n.touches.push(r)}this._track.push(n)}},_recognize:function(t){for(var e in o)if(o.hasOwnProperty(e)){var i=o[e](this._track,t);if(i)return i}}};var o={pinch:function(t,e){var a=t.length;if(a){var o=(t[a-1]||{}).points,r=(t[a-2]||{}).points||o;if(r&&r.length>1&&o&&o.length>1){var s=i(o)/i(r);!isFinite(s)&&(s=1),e.pinchScale=s;var l=n(o);return e.pinchX=l[0],e.pinchY=l[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=a},function(t,e){var i=function(){this.head=null,this.tail=null,this._len=0},n=i.prototype;n.insert=function(t){var e=new a(t);return this.insertEntry(e),e},n.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this._len++},n.remove=function(t){var e=t.prev,i=t.next;e?e.next=i:this.head=i,i?i.prev=e:this.tail=e,t.next=t.prev=null,this._len--},n.len=function(){return this._len};var a=function(t){this.value=t,this.next,this.prev},o=function(t){this._list=new i,this._map={},this._maxSize=t||10},r=o.prototype;r.put=function(t,e){var i=this._list,n=this._map;if(null==n[t]){var a=i.len();if(a>=this._maxSize&&a>0){var o=i.head;i.remove(o),delete n[o.key]}var r=i.insert(e);r.key=t,n[t]=r}},r.get=function(t){var e=this._map[t],i=this._list;return null!=e?(e!==i.tail&&(i.remove(e),i.insertEntry(e)),e.value):void 0},r.clear=function(){this._list.clear(),this._map={}},t.exports=o},function(t,e,i){"use strict";var n=i(1),a=i(16),o=function(t,e,i,n){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==i?.5:i,a.call(this,n)};o.prototype={constructor:o,type:"radial",updateCanvasGradient:function(t,e){for(var i=t.getBoundingRect(),n=i.width,a=i.height,o=Math.min(n,a),r=this.x*n+i.x,s=this.y*a+i.y,l=this.r*o,h=e.createRadialGradient(r,s,0,r,s,l),u=this.colorStops,c=0;cy;y++)a(d,d,t[y]),o(f,f,t[y]);a(d,d,h[0]),o(f,f,h[1])}for(var y=0,x=t.length;x>y;y++){var _=t[y];if(i)u=t[y?y-1:x-1],c=t[(y+1)%x];else{if(0===y||y===x-1){p.push(n.clone(t[y]));continue}u=t[y-1], +c=t[y+1]}n.sub(g,c,u),r(g,g,e);var w=s(_,u),b=s(_,c),M=w+b;0!==M&&(w/=M,b/=M),r(m,g,-w),r(v,g,b);var S=l([],_,m),A=l([],_,v);h&&(o(S,S,d),a(S,S,f),o(A,A,d),a(A,A,f)),p.push(S),p.push(A)}return i&&p.push(p.shift()),p}},function(t,e,i){function n(t,e,i,n,a,o,r){var s=.5*(i-t),l=.5*(n-e);return(2*(e-i)+s+l)*r+(-3*(e-i)-2*s-l)*o+s*a+e}var a=i(5);t.exports=function(t,e){for(var i=t.length,o=[],r=0,s=1;i>s;s++)r+=a.distance(t[s-1],t[s]);var l=r/2;l=i>l?i:l;for(var s=0;l>s;s++){var h,u,c,d=s/(l-1)*(e?i:i-1),f=Math.floor(d),p=d-f,g=t[f%i];e?(h=t[(f-1+i)%i],u=t[(f+1)%i],c=t[(f+2)%i]):(h=t[0===f?f:f-1],u=t[f>i-2?i-1:f+1],c=t[f>i-3?i-1:f+2]);var m=p*p,v=p*m;o.push([n(h[0],g[0],u[0],c[0],p,m,v),n(h[1],g[1],u[1],c[1],p,m,v)])}return o}},function(t,e,i){t.exports=i(6).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.cx,n=e.cy,a=Math.max(e.r,0),o=e.startAngle,r=e.endAngle,s=e.clockwise,l=Math.cos(o),h=Math.sin(o);t.moveTo(l*a+i,h*a+n),t.arc(i,n,a,o,r,!s)}})},function(t,e,i){"use strict";var n=i(18),a=n.quadraticSubdivide,o=n.cubicSubdivide,r=n.quadraticAt,s=n.cubicAt,l=[];t.exports=i(6).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,r=e.x2,s=e.y2,h=e.cpx1,u=e.cpy1,c=e.cpx2,d=e.cpy2,f=e.percent;0!==f&&(t.moveTo(i,n),null==c||null==d?(1>f&&(a(i,h,r,f,l),h=l[1],r=l[2],a(n,u,s,f,l),u=l[1],s=l[2]),t.quadraticCurveTo(h,u,r,s)):(1>f&&(o(i,h,c,r,f,l),h=l[1],c=l[2],r=l[3],o(n,u,d,s,f,l),u=l[1],d=l[2],s=l[3]),t.bezierCurveTo(h,u,c,d,r,s)))},pointAt:function(t){var e=this.shape,i=e.cpx2,n=e.cpy2;return null===i||null===n?[r(e.x1,e.cpx1,e.x2,t),r(e.y1,e.cpy1,e.y2,t)]:[s(e.x1,e.cpx1,e.cpx1,e.x2,t),s(e.y1,e.cpy1,e.cpy1,e.y2,t)]}})},function(t,e,i){"use strict";t.exports=i(6).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e){t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,i){t.exports=i(6).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.x1,n=e.y1,a=e.x2,o=e.y2,r=e.percent;0!==r&&(t.moveTo(i,n),1>r&&(a=i*(1-r)+a*r,o=n*(1-r)+o*r),t.lineTo(a,o))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,i){var n=i(59);t.exports=i(6).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){n.buildPath(t,e,!0)}})},function(t,e,i){var n=i(59);t.exports=i(6).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){n.buildPath(t,e,!1)}})},function(t,e,i){var n=i(60);t.exports=i(6).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var i=e.x,a=e.y,o=e.width,r=e.height;e.r?n.buildPath(t,e):t.rect(i,a,o,r),t.closePath()}})},function(t,e,i){t.exports=i(6).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var i=e.cx,n=e.cy,a=2*Math.PI;t.moveTo(i+e.r,n),t.arc(i,n,e.r,0,a,!1),t.moveTo(i+e.r0,n),t.arc(i,n,e.r0,0,a,!0)}})},function(t,e,i){t.exports=i(6).extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},buildPath:function(t,e){var i=e.cx,n=e.cy,a=Math.max(e.r0||0,0),o=Math.max(e.r,0),r=e.startAngle,s=e.endAngle,l=e.clockwise,h=Math.cos(r),u=Math.sin(r);t.moveTo(h*a+i,u*a+n),t.lineTo(h*o+i,u*o+n),t.arc(i,n,o,r,s,!l),t.lineTo(Math.cos(s)*a+i,Math.sin(s)*a+n),0!==a&&t.arc(i,n,a,s,r,l),t.closePath()}})},function(t,e,i){"use strict";var n=i(56),a=i(1),o=a.isString,r=a.isFunction,s=a.isObject,l=i(45),h=function(){this.animators=[]};h.prototype={constructor:h,animate:function(t,e){var i,o=!1,r=this,s=this.__zr;if(t){var h=t.split("."),u=r;o="shape"===h[0];for(var c=0,d=h.length;d>c;c++)u&&(u=u[h[c]]);u&&(i=u)}else i=r;if(!i)return void l('Property "'+t+'" is not existed in element '+r.id);var f=r.animators,p=new n(i,e);return p.during(function(t){r.dirty(o)}).done(function(){f.splice(a.indexOf(f,p),1)}),f.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,i=e.length,n=0;i>n;n++)e[n].stop(t);return e.length=0,this},animateTo:function(t,e,i,n,a){function s(){h--,h||a&&a()}o(i)?(a=n,n=i,i=0):r(n)?(a=n,n="linear",i=0):r(i)?(a=i,i=0):r(e)?(a=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,i,n,a);var l=this.animators.slice(),h=l.length;h||a&&a();for(var u=0;u0&&this.animate(t,!1).when(null==n?500:n,r).delay(o||0),this}},t.exports=h},function(t,e){function i(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}i.prototype={constructor:i,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this._dispatchProxy(e,"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var i=t.offsetX,n=t.offsetY,a=i-this._x,o=n-this._y;this._x=i,this._y=n,e.drift(a,o,t),this._dispatchProxy(e,"drag",t.event);var r=this.findHover(i,n,e),s=this._dropTarget;this._dropTarget=r,e!==r&&(s&&r!==s&&this._dispatchProxy(s,"dragleave",t.event),r&&r!==s&&this._dispatchProxy(r,"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this._dispatchProxy(e,"dragend",t.event),this._dropTarget&&this._dispatchProxy(this._dropTarget,"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=i},function(t,e,i){function n(t,e,i,n,a,o,r,s,l,h,u){var g=l*(p/180),y=f(g)*(t-i)/2+d(g)*(e-n)/2,x=-1*d(g)*(t-i)/2+f(g)*(e-n)/2,_=y*y/(r*r)+x*x/(s*s);_>1&&(r*=c(_),s*=c(_));var w=(a===o?-1:1)*c((r*r*(s*s)-r*r*(x*x)-s*s*(y*y))/(r*r*(x*x)+s*s*(y*y)))||0,b=w*r*x/s,M=w*-s*y/r,S=(t+i)/2+f(g)*b-d(g)*M,A=(e+n)/2+d(g)*b+f(g)*M,I=v([1,0],[(y-b)/r,(x-M)/s]),T=[(y-b)/r,(x-M)/s],C=[(-1*y-b)/r,(-1*x-M)/s],L=v(T,C);m(T,C)<=-1&&(L=p),m(T,C)>=1&&(L=0),0===o&&L>0&&(L-=2*p),1===o&&0>L&&(L+=2*p),u.addData(h,S,A,r,s,I,L,g,o)}function a(t){if(!t)return[];var e,i=t.replace(/-/g," -").replace(/ /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e0&&""===m[0]&&m.shift();for(var v=0;vn;n++)i=t[n],i.__dirty&&i.buildPath(i.path,i.shape),a.push(i.path);var s=new r(e);return s.buildPath=function(t){t.appendPath(a);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,i){function n(t,e){var i,n,o,u,c,d,f=t.data,p=a.M,g=a.C,m=a.L,v=a.R,y=a.A,x=a.Q;for(o=0,u=0;oc;c++){var d=s[c];d[0]=f[o++],d[1]=f[o++],r(d,d,e),f[u++]=d[0],f[u++]=d[1]}}}var a=i(27).CMD,o=i(5),r=o.applyTransform,s=[[],[],[]],l=Math.sqrt,h=Math.atan2;t.exports=n},function(t,e,i){if(!i(15).canvasSupported){var n,a="urn:schemas-microsoft-com:vml",o=window,r=o.document,s=!1;try{!r.namespaces.zrvml&&r.namespaces.add("zrvml",a),n=function(t){return r.createElement("')}}catch(l){n=function(t){return r.createElement("<"+t+' xmlns="'+a+'" class="zrvml">')}}var h=function(){if(!s){s=!0;var t=r.styleSheets;t.length<31?r.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}};t.exports={doc:r,initVML:h,createNode:n}}},function(t,e,i){"use strict";function n(t){return null==t.value?t:t.value}var a=i(14),o=i(31),r=i(263),s=i(1),l={_baseAxisDim:null,getInitialData:function(t,e){var i,r,s=e.getComponent("xAxis",this.get("xAxisIndex")),l=e.getComponent("yAxis",this.get("yAxisIndex")),h=s.get("type"),u=l.get("type");"category"===h?(t.layout="horizontal",i=s.getCategories(),r=!0):"category"===u?(t.layout="vertical",i=l.getCategories(),r=!0):t.layout=t.layout||"horizontal",this._baseAxisDim="horizontal"===t.layout?"x":"y";var c=t.data,d=this.dimensions=["base"].concat(this.valueDimensions);o(d,c);var f=new a(d,this);return f.initData(c,i?i.slice():null,function(t,e,i,a){var o=n(t);return r?"base"===e?i:o[a-1]:o[a]}),f},coordDimToDataDim:function(t){var e=this.valueDimensions.slice(),i=["base"],n={horizontal:{x:i,y:e},vertical:{x:e,y:i}};return n[this.get("layout")][t]},dataDimToCoordDim:function(t){var e;return s.each(["x","y"],function(i,n){var a=this.coordDimToDataDim(i);s.indexOf(a,t)>=0&&(e=i)},this),e},getBaseAxis:function(){var t=this._baseAxisDim;return this.ecModel.getComponent(t+"Axis",this.get(t+"AxisIndex")).axis}},h={init:function(){var t=this._whiskerBoxDraw=new r(this.getStyleUpdater());this.group.add(t.group)},render:function(t,e,i){this._whiskerBoxDraw.updateData(t.getData())},remove:function(t){this._whiskerBoxDraw.remove()}};t.exports={seriesModelMixin:l,viewMixin:h}},function(t,e,i){function n(t,e,i){v.call(this),this.type=t,this.zr=e,this.opt=y.clone(i),this.group=new x.Group,this._containerRect=null,this._track=[],this._dragging,this._cover,this._disabled=!0,this._handlers={mousedown:_(s,this),mousemove:_(l,this),mouseup:_(h,this)},w(T,function(t){this.zr.on(t,this._handlers[t])},this)}function a(t){t.traverse(function(t){t.z=A})}function o(t,e){var i=this.group.transformCoordToLocal(t,e);return!this._containerRect||this._containerRect.contain(i[0],i[1])}function r(t){var e=t.event;e.preventDefault&&e.preventDefault()}function s(t){if(!(this._disabled||t.target&&t.target.draggable)){r(t);var e=t.offsetX,i=t.offsetY;o.call(this,e,i)&&(this._dragging=!0,this._track=[[e,i]])}}function l(t){this._dragging&&!this._disabled&&(r(t),u.call(this,t))}function h(t){this._dragging&&!this._disabled&&(r(t),u.call(this,t,!0),this._dragging=!1,this._track=[])}function u(t,e){var i=t.offsetX,n=t.offsetY;if(o.call(this,i,n)){this._track.push([i,n]);var a=c.call(this)?C[this.type].getRanges.call(this):[];d.call(this,a),this.trigger("selected",y.clone(a)),e&&this.trigger("selectEnd",y.clone(a))}}function c(){var t=this._track;if(!t.length)return!1;var e=t[t.length-1],i=t[0],n=e[0]-i[0],a=e[1]-i[1],o=S(n*n+a*a,.5);return o>I}function d(t){var e=C[this.type];t&&t.length?(this._cover||(this._cover=e.create.call(this),this.group.add(this._cover)),e.update.call(this,t)):(this.group.remove(this._cover),this._cover=null),a(this.group)}function f(){var t=this.group,e=t.parent;e&&e.remove(t)}function p(){var t=this.opt;return new x.Rect({style:{stroke:t.stroke,fill:t.fill,lineWidth:t.lineWidth,opacity:t.opacity}})}function g(){return y.map(this._track,function(t){return this.group.transformCoordToLocal(t[0],t[1])},this)}function m(){var t=g.call(this),e=t.length-1;return 0>e&&(e=0),[t[0],t[e]]}var v=i(21),y=i(1),x=i(3),_=y.bind,w=y.each,b=Math.min,M=Math.max,S=Math.pow,A=1e4,I=2,T=["mousedown","mousemove","mouseup"];n.prototype={constructor:n,enable:function(t,e){this._disabled=!1,f.call(this),this._containerRect=e!==!1?e||t.getBoundingRect():null,t.add(this.group)},update:function(t){d.call(this,t&&y.clone(t))},disable:function(){this._disabled=!0,f.call(this)},dispose:function(){this.disable(),w(T,function(t){this.zr.off(t,this._handlers[t])},this)}},y.mixin(n,v);var C={line:{create:p,getRanges:function(){var t=m.call(this),e=b(t[0][0],t[1][0]),i=M(t[0][0],t[1][0]);return[[e,i]]},update:function(t){var e=t[0],i=this.opt.width;this._cover.setShape({x:e[0],y:-i/2,width:e[1]-e[0],height:i})}},rect:{create:p,getRanges:function(){var t=m.call(this),e=[b(t[1][0],t[0][0]),b(t[1][1],t[0][1])],i=[M(t[1][0],t[0][0]),M(t[1][1],t[0][1])];return[[[e[0],i[0]],[e[1],i[1]]]]},update:function(t){var e=t[0];this._cover.setShape({x:e[0][0],y:e[1][0],width:e[0][1]-e[0][0],height:e[1][1]-e[1][0]})}}};t.exports=n},function(t,e,i){function n(){this.group=new a.Group,this._symbolEl=new s({silent:!0})}var a=i(3),o=i(24),r=i(1),s=a.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(t,e){for(var i=e.points,n=e.sizes,a=this.symbolProxy,o=a.shape,r=0;rt.get("largeThreshold")?a:o;this._symbolDraw=s,s.updateData(n),r.add(s.group),r.remove(s===a?o.group:a.group)},updateLayout:function(t){this._symbolDraw.updateLayout(t)},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e,!0)}})},function(t,e,i){i(101),i(39),i(40),i(172),i(173),i(168),i(169),i(99),i(98)},function(t,e,i){function n(t,e){var i=[1/0,-(1/0)];return h(e,function(e){var n=e.getData();n&&h(e.coordDimToDataDim(t),function(t){var e=n.getDataExtent(t);e[0]i[1]&&(i[1]=e[1])})},this),i}function a(t,e,i){var n=i.getAxisModel(),a=n.axis.scale,r=[0,100],s=[t.start,t.end],c=[];return e=e.slice(),o(e,n,a),h(["startValue","endValue"],function(e){c.push(null!=t[e]?a.parse(t[e]):null)}),h([0,1],function(t){var i=c[t],n=s[t];null!=n||null==i?(null==n&&(n=r[t]),i=a.parse(l.linearMap(n,r,e,!0))):n=l.linearMap(i,e,r,!0),c[t]=l.round(i),s[t]=l.round(n)}),{valueWindow:u(c),percentWindow:u(s)}}function o(t,e,i){return h(["min","max"],function(n,a){var o=e.get(n,!0);null!=o&&(o+"").toLowerCase()!=="data"+n&&(t[a]=i.parse(o))}),e.get("scale",!0)||(t[0]>0&&(t[0]=0),t[1]<0&&(t[1]=0)),t}function r(t,e){var i=t.getAxisModel(),n=t._percentWindow,a=t._valueWindow;if(n){var o=e||0===n[0]&&100===n[1],r=!e&&l.getPixelPrecision(a,[0,500]),s=!(e||20>r&&r>=0),h=e||o||s;i.setRange&&i.setRange(h?null:+a[0].toFixed(r),h?null:+a[1].toFixed(r))}}var s=i(1),l=i(4),h=s.each,u=l.asc,c=function(t,e,i,n){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this.ecModel=n,this._dataZoomModel=i};c.prototype={constructor:c,hostedBy:function(t){return this._dataZoomModel===t},getDataExtent:function(){return this._dataExtent.slice()},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[];return this.ecModel.eachSeries(function(e){this._axisIndex===e.get(this._dimName+"AxisIndex")&&t.push(e)},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,i=this._dimName,n=this.ecModel,a=this.getAxisModel(),o="x"===i||"y"===i;o?(e="gridIndex",t="x"===i?"y":"x"):(e="polarIndex",t="angle"===i?"radius":"angle");var r;return n.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(a.get(e)||0)&&(r=t)}),r},reset:function(t){if(t===this._dataZoomModel){var e=this._dataExtent=n(this._dimName,this.getTargetSeriesModels()),i=a(t.option,e,this);this._valueWindow=i.valueWindow,this._percentWindow=i.percentWindow,r(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,r(this,!0))},filterData:function(t){function e(t){return t>=o[0]&&t<=o[1]}if(t===this._dataZoomModel){var i=this._dimName,n=this.getTargetSeriesModels(),a=t.get("filterMode"),o=this._valueWindow,r=this.getOtherAxisModel();t.get("$fromToolbox")&&r&&"category"===r.get("type")&&(a="empty"),h(n,function(t){var n=t.getData();n&&h(t.coordDimToDataDim(i),function(i){"empty"===a?t.setData(n.map(i,function(t){return e(t)?t:NaN})):n.filterSelf(i,e)})})}}},t.exports=c},function(t,e,i){t.exports=i(39).extend({type:"dataZoom.inside",defaultOption:{zoomLock:!1}})},function(t,e,i){function n(t,e,i,n){e=e.slice();var a=n.axisModels[0];if(a){var r=o(t,a,i),s=r.signal*(e[1]-e[0])*r.pixel/r.pixelLength;return h(s,e,[0,100],"rigid"),e}}function a(t,e,i,n,a,s){i=i.slice();var l=a.axisModels[0];if(l){var h=o(e,l,n),u=h.pixel-h.pixelStart,c=u/h.pixelLength*(i[1]-i[0])+i[0];return t=Math.max(t,0),i[0]=(i[0]-c)*t+c,i[1]=(i[1]-c)*t+c,r(i)}}function o(t,e,i){var n=e.axis,a=i.rect,o={};return"x"===n.dim?(o.pixel=t[0],o.pixelLength=a.width,o.pixelStart=a.x,o.signal=n.inverse?1:-1):(o.pixel=t[1],o.pixelLength=a.height,o.pixelStart=a.y,o.signal=n.inverse?-1:1),o}function r(t){var e=[0,100];return!(t[0]<=e[1])&&(t[0]=e[1]),!(t[1]<=e[1])&&(t[1]=e[1]),!(t[0]>=e[0])&&(t[0]=e[0]),!(t[1]>=e[0])&&(t[1]=e[0]),t}var s=i(40),l=i(1),h=i(71),u=i(174),c=l.bind,d=s.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,i,n){d.superApply(this,"render",arguments),u.shouldRecordRange(n,t.id)&&(this._range=t.getPercentRange());var a=this.getTargetInfo().cartesians,o=l.map(a,function(t){return u.generateCoordId(t.model)});l.each(a,function(e){var n=e.model;u.register(i,{coordId:u.generateCoordId(n),allCoordIds:o,coordinateSystem:n.coordinateSystem,dataZoomId:t.id,throttleRage:t.get("throttle",!0),panGetRange:c(this._onPan,this,e),zoomGetRange:c(this._onZoom,this,e)})},this)},remove:function(){u.unregister(this.api,this.dataZoomModel.id),d.superApply(this,"remove",arguments),this._range=null},dispose:function(){u.unregister(this.api,this.dataZoomModel.id),d.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,i,a){return this._range=n([i,a],this._range,e,t)},_onZoom:function(t,e,i,n,o){var r=this.dataZoomModel;return r.option.zoomLock?this._range:this._range=a(1/i,[n,o],this._range,e,t,r)}});t.exports=d},function(t,e,i){var n=i(39);t.exports=n.extend({type:"dataZoom.select"})},function(t,e,i){t.exports=i(40).extend({type:"dataZoom.select"})},function(t,e,i){var n=i(39),a=(i(11),i(1),n.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackgroundColor:"#ddd",fillerColor:"rgba(47,69,84,0.15)",handleColor:"rgba(148,164,165,0.95)",handleSize:10,labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}},mergeOption:function(t){a.superApply(this,"mergeOption",arguments)}}));t.exports=a},function(t,e,i){function n(t){return"x"===t?"y":"x"}var a=i(1),o=i(3),r=i(126),s=i(40),l=o.Rect,h=i(4),u=h.linearMap,c=i(11),d=i(71),f=h.asc,p=a.bind,g=Math.round,m=Math.max,v=a.each,y=7,x=1,_=30,w="horizontal",b="vertical",M=5,S=["line","bar","candlestick","scatter"],A=s.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._halfHandleSize,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){return A.superApply(this,"render",arguments),r.createOrUpdate(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),this._halfHandleSize=g(t.get("handleSize")/2),this.dataZoomModel.get("show")===!1?void this.group.removeAll():(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),void this._updateView())},remove:function(){A.superApply(this,"remove",arguments),r.clear(this,"_dispatchZoomAction")},dispose:function(){A.superApply(this,"dispose",arguments),r.clear(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new o.Group;this._renderBackground(),this._renderDataShadow(),this._renderHandle(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},o=this._orient===w?{right:n.width-i.x-i.width,top:n.height-_-y,width:i.width,height:_}:{right:y,top:i.y,width:_,height:i.height},r=c.getLayoutParams(t.option);a.each(["right","top","width","height"],function(t){"ph"===r[t]&&(r[t]=o[t])});var s=c.getLayoutRect(r,n,t.padding);this._location={x:s.x,y:s.y},this._size=[s.width,s.height],this._orient===b&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),a=n&&n.get("inverse"),o=this._displayables.barGroup,r=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(i!==w||a?i===w&&a?{scale:r?[-1,1]:[-1,-1]}:i!==b||a?{scale:r?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:r?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:r?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.position[0]=e.x-s.x,t.position[1]=e.y-s.y},_getViewExtent:function(){var t=this._halfHandleSize,e=m(this._size[0],4*t),i=[t,e-t];return i},_renderBackground:function(){var t=this.dataZoomModel,e=this._size;this._displayables.barGroup.add(new l({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")}}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),a=i.getShadowDim?i.getShadowDim():t.otherDim,r=n.getDataExtent(a),s=.3*(r[1]-r[0]);r=[r[0]-s,r[1]+s];var l=[0,e[1]],h=[0,e[0]],c=[[e[0],0],[0,0]],d=h[1]/(n.count()-1),f=0,p=Math.round(n.count()/e[0]);n.each([a],function(t,e){if(p>0&&e%p)return void(f+=d);var i=null==t||isNaN(t)||""===t?null:u(t,r,l,!0);null!=i&&c.push([f,i]),f+=d}),this._displayables.barGroup.add(new o.Polyline({shape:{points:c},style:{fill:this.dataZoomModel.get("dataBackgroundColor"),lineWidth:0},silent:!0,z2:-20}))}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(e!==!1){var i,o=this.ecModel;return t.eachTargetAxis(function(r,s){var l=t.getAxisProxy(r.name,s).getTargetSeriesModels();a.each(l,function(t){if(!(i||e!==!0&&a.indexOf(S,t.get("type"))<0)){var l=n(r.name),h=o.getComponent(r.axis,s).axis;i={thisAxis:h,series:t,thisDim:r.name,otherDim:l,otherAxisInverse:t.coordinateSystem.getOtherAxis(h).inverse}}},this)},this),i}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],i=t.handleLabels=[],n=this._displayables.barGroup,a=this._size;n.add(t.filler=new l({draggable:!0,cursor:"move",drift:p(this._onDragMove,this,"all"),ondragend:p(this._onDragEnd,this),onmouseover:p(this._showDataInfo,this,!0),onmouseout:p(this._showDataInfo,this,!1),style:{fill:this.dataZoomModel.get("fillerColor"),textPosition:"inside"}})),n.add(new l(o.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:a[0],height:a[1]},style:{stroke:this.dataZoomModel.get("dataBackgroundColor"),lineWidth:x,fill:"rgba(0,0,0,0)"}}))),v([0,1],function(t){n.add(e[t]=new l({style:{fill:this.dataZoomModel.get("handleColor")},cursor:"move",draggable:!0,drift:p(this._onDragMove,this,t),ondragend:p(this._onDragEnd,this),onmouseover:p(this._showDataInfo,this,!0),onmouseout:p(this._showDataInfo,this,!1)}));var a=this.dataZoomModel.textStyleModel;this.group.add(i[t]=new o.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",fill:a.getTextColor(),textFont:a.getFont()}}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[u(t[0],[0,100],e,!0),u(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var i=this._handleEnds,n=this._getViewExtent();d(e,i,n,"all"===t||this.dataZoomModel.get("zoomLock")?"rigid":"cross",t),this._range=f([u(i[0],n,[0,100],!0),u(i[1],n,[0,100],!0)])},_updateView:function(){var t=this._displayables,e=this._handleEnds,i=f(e.slice()),n=this._size,a=this._halfHandleSize;v([0,1],function(i){var o=t.handles[i];o.setShape({x:e[i]-a,y:-1,width:2*a,height:n[1]+2,r:1})},this),t.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:this._size[1]}),this._updateDataInfo()},_updateDataInfo:function(){function t(t){var e=o.getTransform(i.handles[t],this.group),s=o.transformDirection(0===t?"right":"left",e),l=this._halfHandleSize+M,u=o.applyTransform([h[t]+(0===t?-l:l),this._size[1]/2],e);n[t].setStyle({x:u[0],y:u[1],textVerticalAlign:a===w?"middle":s,textAlign:a===w?s:"center",text:r[t]})}var e=this.dataZoomModel,i=this._displayables,n=i.handleLabels,a=this._orient,r=["",""];if(e.get("showDetail")){var s,l;e.eachTargetAxis(function(t,i){s||(s=e.getAxisProxy(t.name,i).getDataValueWindow(),l=this.ecModel.getComponent(t.axis,i).axis)},this),s&&(r=[this._formatLabel(s[0],l),this._formatLabel(s[1],l)])}var h=f(this._handleEnds.slice());t.call(this,0),t.call(this,1)},_formatLabel:function(t,e){var i=this.dataZoomModel,n=i.get("labelFormatter");if(a.isFunction(n))return n(t);var o=i.get("labelPrecision");return null!=o&&"auto"!==o||(o=e.getPixelPrecision()),t=null==t&&isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(o,20)),a.isString(n)&&(t=n.replace("{value}",t)),t},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,i){this._dragging=!0;var n=this._applyBarTransform([e,i],!0);this._updateInterval(t,n[0]),this._updateView(),this.dataZoomModel.get("realtime")&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_applyBarTransform:function(t,e){var i=this._displayables.barGroup.getLocalTransform();return o.applyTransform(t,i,e)},_findCoordRect:function(){var t,e=this.getTargetInfo();if(e.cartesians.length)t=e.cartesians[0].model.coordinateSystem.getRect();else{var i=this.api.getWidth(),n=this.api.getHeight();t={x:.2*i,y:.2*n,width:.6*i,height:.6*n}}return t}});t.exports=A},function(t,e,i){function n(t){var e=t.getZr();return e[p]||(e[p]={})}function a(t,e,i){var n=new c(t.getZr());return n.enable(),n.on("pan",f(r,i)),n.on("zoom",f(s,i)),n}function o(t){u.each(t,function(e,i){e.count||(e.controller.off("pan").off("zoom"),delete t[i])})}function r(t,e,i){l(t,function(n){return n.panGetRange(t.controller,e,i)})}function s(t,e,i,n){l(t,function(a){return a.zoomGetRange(t.controller,e,i,n)})}function l(t,e){var i=[];u.each(t.dataZoomInfos,function(t){var n=e(t);n&&i.push({dataZoomId:t.dataZoomId,start:n[0],end:n[1]})}),t.dispatchAction(i)}function h(t,e){t.dispatchAction({type:"dataZoom",batch:e})}var u=i(1),c=i(70),d=i(126),f=u.curry,p="\x00_ec_dataZoom_roams",g={register:function(t,e){var i=n(t),r=e.dataZoomId,s=e.coordId;u.each(i,function(t,i){var n=t.dataZoomInfos;n[r]&&u.indexOf(e.allCoordIds,s)<0&&(delete n[r],t.count--)}),o(i);var l=i[s];l||(l=i[s]={coordId:s,dataZoomInfos:{},count:0},l.controller=a(t,e,l),l.dispatchAction=u.curry(h,t)),l.controller.rect=e.coordinateSystem.getRect().clone(),d.createOrUpdate(l,"dispatchAction",e.throttleRate,"fixRate"),!l.dataZoomInfos[r]&&l.count++,l.dataZoomInfos[r]=e},unregister:function(t,e){var i=n(t);u.each(i,function(t){var i=t.dataZoomInfos;i[e]&&(delete i[e],t.count--)}),o(i)},shouldRecordRange:function(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var i=0,n=t.batch.length;n>i;i++)if(t.batch[i].dataZoomId===e)return!1;return!0},generateCoordId:function(t){return t.type+"\x00_"+t.id}};t.exports=g},function(t,e,i){i(101),i(39),i(40),i(170),i(171),i(99),i(98)},function(t,e,i){i(177),i(179),i(178);var n=i(2);n.registerProcessor("filter",i(180))},function(t,e,i){"use strict"; +var n=i(1),a=i(12),o=i(2).extendComponentModel({type:"legend",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,i){this.mergeDefaultAndTheme(t,i),t.selected=t.selected||{},this._updateData(i);var n=this._data,a=this.option.selected;if(n[0]&&"single"===this.get("selectedMode")){var o=!1;for(var r in a)a[r]&&(this.select(r),o=!0);!o&&this.select(n[0].get("name"))}},mergeOption:function(t){o.superCall(this,"mergeOption",t),this._updateData(this.ecModel)},_updateData:function(t){var e=n.map(this.get("data")||[],function(t){return"string"==typeof t&&(t={name:t}),new a(t,this,this.ecModel)},this);this._data=e;var i=n.map(t.getSeries(),function(t){return t.name});t.eachSeries(function(t){if(t.legendDataProvider){var e=t.legendDataProvider();i=i.concat(e.mapArray(e.getName))}}),this._availableNames=i},getData:function(){return this._data},select:function(t){var e=this.option.selected,i=this.get("selectedMode");if("single"===i){var a=this._data;n.each(a,function(t){e[t.get("name")]=!1})}e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;t in e||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(t in e&&!e[t])&&n.indexOf(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:"top",align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,textStyle:{color:"#333"},selectedMode:!0}});t.exports=o},function(t,e,i){function n(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function a(t,e,i){t.get("legendHoverLink")&&i.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function o(t,e,i){t.get("legendHoverLink")&&i.dispatchAction({type:"downplay",seriesName:t.name,name:e})}var r=i(1),s=i(24),l=i(3),h=i(103),u=r.curry,c="#ccc";t.exports=i(2).extendComponentView({type:"legend",init:function(){this._symbolTypeStore={}},render:function(t,e,i){var s=this.group;if(s.removeAll(),t.get("show")){var c=t.get("selectedMode"),d=t.get("align");"auto"===d&&(d="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left");var f={},p={};r.each(t.getData(),function(r){var h=r.get("name");""!==h&&"\n"!==h||s.add(new l.Group({newline:!0}));var g=e.getSeriesByName(h)[0];if(f[h]=r,g&&!p[h]){var m=g.getData(),v=m.getVisual("color");"function"==typeof v&&(v=v(g.getDataParams(0)));var y=m.getVisual("legendSymbol")||"roundRect",x=m.getVisual("symbol"),_=this._createItem(h,r,t,y,x,d,v,c);_.on("click",u(n,h,i)).on("mouseover",u(a,g,"",i)).on("mouseout",u(o,g,"",i)),p[h]=!0}},this),e.eachRawSeries(function(e){if(e.legendDataProvider){var r=e.legendDataProvider();r.each(function(s){var l=r.getName(s);if(f[l]&&!p[l]){var h=r.getItemVisual(s,"color"),g="roundRect",m=this._createItem(l,f[l],t,g,null,d,h,c);m.on("click",u(n,l,i)).on("mouseover",u(a,e,l,i)).on("mouseout",u(o,e,l,i)),p[l]=!0}},!1,this)}},this),h.layout(s,t,i),h.addBackground(s,t)}},_createItem:function(t,e,i,n,a,o,r,h){var u=i.get("itemWidth"),d=i.get("itemHeight"),f=i.isSelected(t),p=new l.Group,g=e.getModel("textStyle"),m=e.get("icon");if(n=m||n,p.add(s.createSymbol(n,0,0,u,d,f?r:c)),!m&&a&&(a!==n||"none"==a)){var v=.8*d;"none"===a&&(a="circle"),p.add(s.createSymbol(a,(u-v)/2,(d-v)/2,v,v,f?r:c))}var y="left"===o?u+5:-5,x=o,_=i.get("formatter");"string"==typeof _&&_?t=_.replace("{name}",t):"function"==typeof _&&(t=_(t));var w=new l.Text({style:{text:t,x:y,y:d/2,fill:f?g.getTextColor():c,textFont:g.getFont(),textAlign:x,textVerticalAlign:"middle"}});return p.add(w),p.add(new l.Rect({shape:p.getBoundingRect(),invisible:!0})),p.eachChild(function(t){t.silent=!h}),this.group.add(p),l.setHoverStyle(p),p}})},function(t,e,i){function n(t,e,i){var n,a={},r="toggleSelected"===t;return i.eachComponent("legend",function(i){r&&null!=n?i[n?"select":"unSelect"](e.name):(i[t](e.name),n=i.isSelected(e.name));var s=i.getData();o.each(s,function(t){var e=t.get("name");if("\n"!==e&&""!==e){var n=i.isSelected(e);e in a?a[e]=a[e]&&n:a[e]=n}})}),{name:e.name,selected:a}}var a=i(2),o=i(1);a.registerAction("legendToggleSelect","legendselectchanged",o.curry(n,"toggleSelected")),a.registerAction("legendSelect","legendselected",o.curry(n,"select")),a.registerAction("legendUnSelect","legendunselected",o.curry(n,"unSelect"))},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var i=0;i=0&&(p=+p.toFixed(g)),c[h]=d[h]=p,n=[c,d,{type:o,valueIndex:n.valueIndex,value:p}]}return n=[f.dataTransform(t,n[0]),f.dataTransform(t,n[1]),r.extend({},n[2])],n[2].type=n[2].type||"",r.merge(n[2],n[0]),r.merge(n[2],n[1]),n},m={formatTooltip:function(t){var e=this._data,i=this.getRawValue(t),n=r.isArray(i)?r.map(i,c).join(", "):c(i),a=e.getName(t);return this.name+"
            "+((a?d(a)+" : ":"")+n)},getRawDataArray:function(){return this.option.data},getData:function(){return this._data},setData:function(t){this._data=t}};r.defaults(m,h.dataFormatMixin),i(2).extendComponentView({type:"markLine",init:function(){this._markLineMap={}},render:function(t,e,i){var n=this._markLineMap;for(var a in n)n[a].__keep=!1;e.eachSeries(function(t){var n=t.markLineModel;n&&this._renderSeriesML(t,n,e,i)},this);for(var a in n)n[a].__keep||this.group.remove(n[a].group)},updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markLineModel;if(e){var n=e.getData(),o=e.__from,r=e.__to;o.each(function(e){var s=n.getItemModel(e),l=s.get("type"),h=s.get("valueIndex");a(o,e,!0,l,h,t,i),a(r,e,!1,l,h,t,i)}),n.each(function(t){n.setItemLayout(t,[o.getItemLayout(t),r.getItemLayout(t)])}),this._markLineMap[t.name].updateLayout()}},this)},_renderSeriesML:function(t,e,i,n){function s(e,i,o,r,s){var l=e.getItemModel(i);a(e,i,o,r,s,t,n),e.setItemVisual(i,{symbolSize:l.get("symbolSize")||_[o?0:1],symbol:l.get("symbol",!0)||x[o?0:1],color:l.get("itemStyle.normal.color")||u.getVisual("color")})}var l=t.coordinateSystem,h=t.name,u=t.getData(),c=this._markLineMap,d=c[h];d||(d=c[h]=new p),this.group.add(d.group);var f=o(l,t,e),g=f.from,v=f.to,y=f.line;e.__from=g,e.__to=v,r.extend(e,m),e.setData(y);var x=e.get("symbol"),_=e.get("symbolSize");r.isArray(x)||(x=[x,x]),"number"==typeof _&&(_=[_,_]),f.from.each(function(t){var e=y.getItemModel(t),i=e.get("type"),n=e.get("valueIndex");s(g,t,!0,i,n),s(v,t,!1,i,n)}),y.each(function(t){var e=y.getItemModel(t).get("lineStyle.normal.color");y.setItemVisual(t,{color:e||g.getItemVisual(t,"color")}),y.setItemLayout(t,[g.getItemLayout(t),v.getItemLayout(t)])}),d.updateData(y,g,v),f.line.eachItemGraphicEl(function(t,i){t.traverse(function(t){t.dataModel=e})}),d.__keep=!0}})},function(t,e,i){var n=i(7),a=i(2).extendComponentModel({type:"markPoint",dependencies:["series","grid","polar"],init:function(t,e,i,n){this.mergeDefaultAndTheme(t,i),this.mergeOption(t,i,n.createdBySelf,!0)},mergeOption:function(t,e,i,o){i||e.eachSeries(function(t){var i=t.get("markPoint"),r=t.markPointModel;if(!i||!i.data)return void(t.markPointModel=null);if(r)r.mergeOption(i,e,!0);else{o&&n.defaultEmphasis(i.label,["position","show","textStyle","distance","formatter"]);var s={seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0};r=new a(i,this,e,s)}t.markPointModel=r},this)},defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2},emphasis:{}}}});t.exports=a},function(t,e,i){function n(t,e,i){var n=e.coordinateSystem;t.each(function(a){var o,r=t.getItemModel(a),s=r.getShallow("x"),l=r.getShallow("y");if(null!=s&&null!=l)o=[h.parsePercent(s,i.getWidth()),h.parsePercent(l,i.getHeight())];else if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,a));else if(n){var u=t.get(n.dimensions[0],a),c=t.get(n.dimensions[1],a);o=n.dataToPoint([u,c])}t.setItemLayout(a,o)})}function a(t,e,i){var n;n=t?r.map(t&&t.dimensions,function(t){var i=e.getData().getDimensionInfo(e.coordDimToDataDim(t)[0])||{};return i.name=t,i}):[{name:"value",type:"float"}];var a=new d(n,i),o=r.map(i.get("data"),r.curry(f.dataTransform,e));return t&&(o=r.filter(o,r.curry(f.dataFilter,t))),a.initData(o,null,t?f.dimValueGetter:function(t){return t.value}),a}var o=i(38),r=i(1),s=i(9),l=i(7),h=i(4),u=s.addCommas,c=s.encodeHTML,d=i(14),f=i(104),p={getRawDataArray:function(){return this.option.data},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=r.isArray(i)?r.map(i,u).join(", "):u(i),a=e.getName(t);return this.name+"
            "+((a?c(a)+" : ":"")+n)},getData:function(){return this._data},setData:function(t){this._data=t}};r.defaults(p,l.dataFormatMixin),i(2).extendComponentView({type:"markPoint",init:function(){this._symbolDrawMap={}},render:function(t,e,i){var n=this._symbolDrawMap;for(var a in n)n[a].__keep=!1;e.eachSeries(function(t){var e=t.markPointModel;e&&this._renderSeriesMP(t,e,i)},this);for(var a in n)n[a].__keep||(n[a].remove(),this.group.remove(n[a].group))},updateLayout:function(t,e,i){e.eachSeries(function(t){var e=t.markPointModel;e&&(n(e.getData(),t,i),this._symbolDrawMap[t.name].updateLayout(e))},this)},_renderSeriesMP:function(t,e,i){var s=t.coordinateSystem,l=t.name,h=t.getData(),u=this._symbolDrawMap,c=u[l];c||(c=u[l]=new o);var d=a(s,t,e);r.mixin(e,p),e.setData(d),n(e.getData(),t,i),d.each(function(t){var i=d.getItemModel(t),n=i.getShallow("symbolSize");"function"==typeof n&&(n=n(e.getRawValue(t),e.getDataParams(t))),d.setItemVisual(t,{symbolSize:n,color:i.get("itemStyle.normal.color")||h.getVisual("color"),symbol:i.getShallow("symbol")})}),c.updateData(d),this.group.add(c.group),d.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),c.__keep=!0}})},function(t,e,i){"use strict";var n=i(2),a=i(3),o=i(11);n.extendComponentModel({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),n.extendComponentView({type:"title",render:function(t,e,i){if(this.group.removeAll(),t.get("show")){var n=this.group,r=t.getModel("textStyle"),s=t.getModel("subtextStyle"),l=t.get("textAlign"),h=new a.Text({style:{text:t.get("text"),textFont:r.getFont(),fill:r.getTextColor(),textBaseline:"top"},z2:10}),u=h.getBoundingRect(),c=t.get("subtext"),d=new a.Text({style:{text:c,textFont:s.getFont(),fill:s.getTextColor(),y:u.height+t.get("itemGap"),textBaseline:"top"},z2:10}),f=t.get("link"),p=t.get("sublink");h.silent=!f,d.silent=!p,f&&h.on("click",function(){window.open(f,t.get("target"))}),p&&d.on("click",function(){window.open(p,t.get("subtarget"))}),n.add(h),c&&n.add(d);var g=n.getBoundingRect(),m=t.getBoxLayoutParams();m.width=g.width,m.height=g.height;var v=o.getLayoutRect(m,{width:i.getWidth(),height:i.getHeight()},t.get("padding"));l||(l=t.get("left")||t.get("right"),"middle"===l&&(l="center"),"right"===l?v.x+=v.width:"center"===l&&(v.x+=v.width/2)),n.position=[v.x,v.y],h.setStyle("textAlign",l),d.setStyle("textAlign",l),g=n.getBoundingRect();var y=v.margin,x=t.getItemStyle(["color","opacity"]);x.fill=t.get("backgroundColor");var _=new a.Rect({shape:{x:g.x-y[3],y:g.y-y[0],width:g.width+y[1]+y[3],height:g.height+y[0]+y[2]},style:x,silent:!0});a.subPixelOptimizeRect(_),n.add(_)}}})},function(t,e,i){i(189),i(190),i(195),i(193),i(191),i(192),i(194)},function(t,e,i){var n=i(29),a=i(1),o=i(2).extendComponentModel({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){o.superApply(this,"mergeDefaultAndTheme",arguments),a.each(this.option.feature,function(t,e){var i=n.get(e);i&&a.merge(t,i.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:"#666",color:"none"},emphasis:{borderColor:"#3E98C5"}}}});t.exports=o},function(t,e,i){(function(e){function n(t){return 0===t.indexOf("my")}var a=i(29),o=i(1),r=i(3),s=i(12),l=i(52),h=i(103),u=i(17);t.exports=i(2).extendComponentView({type:"toolbox",render:function(t,e,i){function c(o,r){var l,h=v[o],u=v[r],c=g[h],f=new s(c,t,t.ecModel);if(h&&!u){if(n(h))l={model:f,onclick:f.option.onclick,featureName:h};else{var p=a.get(h);if(!p)return;l=new p(f)}m[h]=l}else{if(l=m[u],!l)return;l.model=f}return!h&&u?void(l.dispose&&l.dispose(e,i)):!f.get("show")||l.unusable?void(l.remove&&l.remove(e,i)):(d(f,l,h),f.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},void(l.render&&l.render(f,e,i)))}function d(n,a,s){var l=n.getModel("iconStyle"),h=a.getIcons?a.getIcons():n.get("icon"),u=n.get("title")||{};if("string"==typeof h){var c=h,d=u;h={},u={},h[s]=c,u[s]=d}var g=n.iconPaths={};o.each(h,function(s,h){var c=l.getModel("normal").getItemStyle(),d=l.getModel("emphasis").getItemStyle(),m={x:-p/2,y:-p/2,width:p,height:p},v=0===s.indexOf("image://")?(m.image=s.slice(8),new r.Image({style:m})):r.makePath(s.replace("path://",""),{style:c,hoverStyle:d,rectHover:!0},m,"center");r.setHoverStyle(v),t.get("showTitle")&&(v.__title=u[h],v.on("mouseover",function(){v.setStyle({text:u[h],textPosition:d.textPosition||"bottom",textFill:d.fill||d.stroke||"#000",textAlign:d.textAlign||"center"})}).on("mouseout",function(){v.setStyle({textFill:null})})),v.trigger(n.get("iconStatus."+h)||"normal"),f.add(v),v.on("click",o.bind(a.onclick,a,e,i,h)),g[h]=v})}var f=this.group;if(f.removeAll(),t.get("show")){var p=+t.get("itemSize"),g=t.get("feature")||{},m=this._features||(this._features={}),v=[];o.each(g,function(t,e){v.push(e)}),new l(this._featureNames||[],v).add(c).update(c).remove(o.curry(c,null)).execute(),this._featureNames=v,h.layout(f,t,i),h.addBackground(f,t),f.eachChild(function(t){var e=t.__title,n=t.hoverStyle;if(n&&e){var a=u.getBoundingRect(e,n.font),o=t.position[0]+f.position[0],r=t.position[1]+f.position[1]+p,s=!1;r+a.height>i.getHeight()&&(n.textPosition="top",s=!0);var l=s?-5-a.height:p+8;o+a.width/2>i.getWidth()?(n.textPosition=["100%",l],n.textAlign="right"):o-a.width/2<0&&(n.textPosition=[0,l],n.textAlign="left")}})}},remove:function(t,e){o.each(this._features,function(i){i.remove&&i.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){o.each(this._features,function(i){i.dispose&&i.dispose(t,e)})}})}).call(e,i(201))},function(t,e,i){function n(t){var e={},i=[],n=[];return t.eachRawSeries(function(t){var a=t.coordinateSystem;if(!a||"cartesian2d"!==a.type&&"polar"!==a.type)i.push(t);else{var o=a.getBaseAxis();if("category"===o.type){var r=o.dim+"_"+o.index;e[r]||(e[r]={categoryAxis:o,valueAxis:a.getOtherAxis(o),series:[]},n.push({axisDim:o.dim,axisIndex:o.index})),e[r].series.push(t)}else i.push(t)}}),{seriesGroupByCategoryAxis:e,other:i,meta:n}}function a(t){var e=[];return p.each(t,function(t,i){var n=t.categoryAxis,a=t.valueAxis,o=a.dim,r=[" "].concat(p.map(t.series,function(t){return t.name})),s=[n.model.getCategories()];p.each(t.series,function(t){s.push(t.getRawData().mapArray(o,function(t){return t}))});for(var l=[r.join(v)],h=0;hr;r++)n[r]=arguments[r];i.push((o?o+v:"")+n.join(v))}),i.join("\n")}).join("\n\n"+m+"\n\n")}function r(t){var e=n(t);return{value:p.filter([a(e.seriesGroupByCategoryAxis),o(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+m+"\n\n"),meta:e.meta}}function s(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function l(t){var e=t.slice(0,t.indexOf("\n"));return e.indexOf(v)>=0?!0:void 0}function h(t){for(var e=t.split(/\n+/g),i=s(e.shift()).split(y),n=[],a=p.map(i,function(t){return{name:t,data:[]}}),o=0;o1?"emphasis":"normal")}var h=i(1),u=i(4),c=i(160),d=i(8),f=i(26),p=i(100),g=i(102),m=h.each,v=u.asc;i(175);var y="\x00_ec_\x00toolbox-dataZoom_";n.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:{zoom:"区域缩放",back:"区域缩放还原"}};var x=n.prototype;x.render=function(t,e,i){l(t,e)},x.onclick=function(t,e,i){var n=this._controllerGroup;this._controllerGroup||(n=this._controllerGroup=new f,e.getZr().add(n)),_[i].call(this,n,this.model,t,e)},x.remove=function(t,e){this._disposeController(),g.release("globalPan",e.getZr())},x.dispose=function(t,e){var i=e.getZr();g.release("globalPan",i),this._disposeController(),this._controllerGroup&&i.remove(this._controllerGroup)};var _={zoom:function(t,e,i,n){var a=this._isZoomActive=!this._isZoomActive,o=n.getZr();g[a?"take":"release"]("globalPan",o),e.setIconStatus("zoom",a?"emphasis":"normal"),a?(o.setDefaultCursorStyle("crosshair"),this._createController(t,e,i,n)):(o.setDefaultCursorStyle("default"),this._disposeController())},back:function(t,e,i,n){this._dispatchAction(p.pop(i),n)}};x._createController=function(t,e,i,n){var a=this._controller=new c("rect",n.getZr(),{lineWidth:3,stroke:"#333",fill:"rgba(0,0,0,0.2)"});a.on("selectEnd",h.bind(this._onSelected,this,a,e,i,n)),a.enable(t,!1)},x._disposeController=function(){var t=this._controller;t&&(t.off("selected"),t.dispose())},x._onSelected=function(t,e,i,n,o){if(o.length){var l=o[0];t.update();var h={};i.eachComponent("grid",function(t,e){var n=t.coordinateSystem,o=a(n,i),u=r(l,o);if(u){var c=s(u,o,0,"x"),d=s(u,o,1,"y");c&&(h[c.dataZoomId]=c),d&&(h[d.dataZoomId]=d)}},this),p.push(i,h),this._dispatchAction(h,n)}},x._dispatchAction=function(t,e){var i=[];m(t,function(t){i.push(t)}),i.length&&e.dispatchAction({type:"dataZoom",from:this.uid,batch:h.clone(i,!0)})},i(29).register("dataZoom",n),i(2).registerPreprocessor(function(t){function e(t,e){if(e){var a=t+"Index",o=e[a];null==o||h.isArray(o)||(o=o===!1?[]:[o]),i(t,function(e,i){if(null==o||-1!==h.indexOf(o,i)){var r={type:"select",$fromToolbox:!0,id:y+t+i};r[a]=i,n.push(r)}})}}function i(e,i){var n=t[e];h.isArray(n)||(n=n?[n]:[]),m(n,i)}if(t){var n=t.dataZoom||(t.dataZoom=[]);h.isArray(n)||(n=[n]);var a=t.toolbox;if(a&&(h.isArray(a)&&(a=a[0]),a&&a.feature)){var o=a.feature.dataZoom;e("xAxis",o),e("yAxis",o)}}}),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var a=i(1);n.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"},option:{},seriesIndex:{}};var o=n.prototype;o.getIcons=function(){var t=this.model,e=t.get("icon"),i={};return a.each(t.get("type"),function(t){e[t]&&(i[t]=e[t])}),i};var r={line:function(t,e,i,n){return"bar"===t?a.merge({id:e,type:"line",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.line")||{},!0):void 0},bar:function(t,e,i,n){return"line"===t?a.merge({id:e,type:"bar",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.bar")||{},!0):void 0},stack:function(t,e,i,n){return"line"===t||"bar"===t?a.merge({id:e,stack:"__ec_magicType_stack__"},n.get("option.stack")||{},!0):void 0},tiled:function(t,e,i,n){return"line"===t||"bar"===t?a.merge({id:e,stack:""},n.get("option.tiled")||{},!0):void 0}},s=[["line","bar"],["stack","tiled"]];o.onclick=function(t,e,i){var n=this.model,o=n.get("seriesIndex."+i);if(r[i]){var l={series:[]},h=function(t){var e=t.subType,o=t.id,s=r[i](e,o,t,n);s&&(a.defaults(s,t.option),l.series.push(s));var h=t.coordinateSystem;if(h&&"cartesian2d"===h.type&&("line"===i||"bar"===i)){var u=h.getAxesByScale("ordinal")[0];if(u){var c=u.dim,d=t.get(c+"AxisIndex"),f=c+"Axis";l[f]=l[f]||[];for(var p=0;d>=p;p++)l[f][d]=l[f][d]||{};l[f][d].boundaryGap="bar"===i}}};a.each(s,function(t){a.indexOf(t,i)>=0&&a.each(t,function(t){n.setIconStatus(t,"normal")})}),n.setIconStatus(i,"emphasis"),t.eachComponent({mainType:"series",query:null==o?null:{seriesIndex:o}},h),e.dispatchAction({type:"changeMagicType",currentType:i,newOption:l})}};var l=i(2);l.registerAction({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),i(29).register("magicType",n),t.exports=n},function(t,e,i){"use strict";function n(t){this.model=t}var a=i(100);n.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:"还原"};var o=n.prototype;o.onclick=function(t,e,i){a.clear(t),e.dispatchAction({type:"restore",from:this.uid})},i(29).register("restore",n),i(2).registerAction({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")}),t.exports=n},function(t,e,i){function n(t){this.model=t}var a=i(15);n.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:"保存为图片",type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:["右键另存为图片"]},n.prototype.unusable=!a.canvasSupported;var o=n.prototype;o.onclick=function(t,e){var i=this.model,n=i.get("name")||t.get("title.0.text")||"echarts",a=document.createElement("a"),o=i.get("type",!0)||"png";a.download=n+"."+o,a.target="_blank";var r=e.getConnectedDataURL({type:o,backgroundColor:i.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:i.get("excludeComponents"),pixelRatio:i.get("pixelRatio")});if(a.href=r,"function"==typeof MouseEvent){var s=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});a.dispatchEvent(s)}else{var l=i.get("lang"),h='',u=window.open();u.document.write(h)}},i(29).register("saveAsImage",n),t.exports=n},function(t,e,i){i(198),i(199),i(2).registerAction({type:"showTip",event:"showTip",update:"none"},function(){}),i(2).registerAction({type:"hideTip",event:"hideTip",update:"none"},function(){})},function(t,e,i){function n(t){var e="cubic-bezier(0.23, 1, 0.32, 1)",i="left "+t+"s "+e+",top "+t+"s "+e;return l.map(p,function(t){return t+"transition:"+i}).join(";")}function a(t){var e=[],i=t.get("fontSize"),n=t.getTextColor();return n&&e.push("color:"+n),e.push("font:"+t.getFont()),i&&e.push("line-height:"+Math.round(3*i/2)+"px"),d(["decoration","align"],function(i){var n=t.get(i);n&&e.push("text-"+i+":"+n)}),e.join(";")}function o(t){t=t;var e=[],i=t.get("transitionDuration"),o=t.get("backgroundColor"),r=t.getModel("textStyle"),s=t.get("padding");return i&&e.push(n(i)),o&&(e.push("background-Color:"+h.toHex(o)),e.push("filter:alpha(opacity=70)"),e.push("background-Color:"+o)),d(["width","color","radius"],function(i){var n="border-"+i,a=f(n),o=t.get(a);null!=o&&e.push(n+":"+o+("color"===i?"":"px"))}),e.push(a(r)),null!=s&&e.push("padding:"+c.normalizeCssArray(s).join("px ")+"px"),e.join(";")+";"}function r(t,e){var i=document.createElement("div"),n=e.getZr();this.el=i,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(i),this._container=t,this._show=!1,this._hideTimeout;var a=this;i.onmouseenter=function(){a.enterable&&(clearTimeout(a._hideTimeout),a._show=!0),a._inContent=!0},i.onmousemove=function(e){if(!a.enterable){ +var i=n.handler;u.normalizeEvent(t,e),i.dispatch("mousemove",e)}},i.onmouseleave=function(){a.enterable&&a._show&&a.hideLater(a._hideDelay),a._inContent=!1},s(i,t)}function s(t,e){function i(t){n(t.target)&&t.preventDefault()}function n(i){for(;i&&i!==e;){if(i===t)return!0;i=i.parentNode}}u.addEventListener(e,"touchstart",i),u.addEventListener(e,"touchmove",i),u.addEventListener(e,"touchend",i)}var l=i(1),h=i(22),u=i(33),c=i(9),d=l.each,f=c.toCamelCase,p=["","-webkit-","-moz-","-o-"],g="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;";r.prototype={constructor:r,enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),i=t.style;"absolute"!==i.position&&"absolute"!==e.position&&(i.position="relative")},show:function(t){clearTimeout(this._hideTimeout),this.el.style.cssText=g+o(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),this._show=!0},setContent:function(t){var e=this.el;e.innerHTML=t,e.style.display=t?"block":"none"},moveTo:function(t,e){var i=this.el.style;i.left=t+"px",i.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this.enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(l.bind(this.hide,this),t)):this.hide())},isShow:function(){return this._show}},t.exports=r},function(t,e,i){i(2).extendComponentModel({type:"tooltip",defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove",alwaysShowContent:!1,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:!0,animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",lineStyle:{color:"#555",width:1,type:"solid"},crossStyle:{color:"#555",width:1,type:"dashed",textStyle:{}},shadowStyle:{color:"rgba(150,150,150,0.3)"}},textStyle:{color:"#fff",fontSize:14}}})},function(t,e,i){function n(t,e){if(!t||!e)return!1;var i=g.round;return i(t[0])===i(e[0])&&i(t[1])===i(e[1])}function a(t,e,i,n){return{x1:t,y1:e,x2:i,y2:n}}function o(t,e,i,n){return{x:t,y:e,width:i,height:n}}function r(t,e,i,n,a,o){return{cx:t,cy:e,r0:i,r:n,startAngle:a,endAngle:o,clockwise:!0}}function s(t,e,i,n,a){var o=i.clientWidth,r=i.clientHeight,s=20;return t+o+s>n?t-=o+s:t+=s,e+r+s>a?e-=r+s:e+=s,[t,e]}function l(t,e,i){var n=i.clientWidth,a=i.clientHeight,o=5,r=0,s=0,l=e.width,h=e.height;switch(t){case"inside":r=e.x+l/2-n/2,s=e.y+h/2-a/2;break;case"top":r=e.x+l/2-n/2,s=e.y-a-o;break;case"bottom":r=e.x+l/2-n/2,s=e.y+h+o;break;case"left":r=e.x-n-o,s=e.y+h/2-a/2;break;case"right":r=e.x+l+o,s=e.y+h/2-a/2}return[r,s]}function h(t,e,i,n,a,o,r){var h=r.getWidth(),u=r.getHeight(),c=o&&o.getBoundingRect().clone();if(o&&c.applyTransform(o.transform),"function"==typeof t&&(t=t([e,i],a,c)),f.isArray(t))e=m(t[0],h),i=m(t[1],u);else if("string"==typeof t&&o){var d=l(t,c,n.el);e=d[0],i=d[1]}else{var d=s(e,i,n.el,h,u);e=d[0],i=d[1]}n.moveTo(e,i)}function u(t){var e=t.coordinateSystem,i=t.get("tooltip.trigger",!0);return!(!e||"cartesian2d"!==e.type&&"polar"!==e.type&&"single"!==e.type||"item"===i)}var c=i(197),d=i(3),f=i(1),p=i(9),g=i(4),m=g.parsePercent,v=i(15);i(2).extendComponentView({type:"tooltip",_axisPointers:{},init:function(t,e){if(!v.node){var i=new c(e.getDom(),e);this._tooltipContent=i,e.on("showTip",this._manuallyShowTip,this),e.on("hideTip",this._manuallyHideTip,this)}},render:function(t,e,i){if(!v.node){this.group.removeAll(),this._axisPointers={},this._tooltipModel=t,this._ecModel=e,this._api=i,this._lastHover={};var n=this._tooltipContent;n.update(),n.enterable=t.get("enterable"),this._alwaysShowContent=t.get("alwaysShowContent"),this._seriesGroupByAxis=this._prepareAxisTriggerData(t,e);var a=this._crossText;if(a&&this.group.add(a),null!=this._lastX&&null!=this._lastY){var o=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){o._manuallyShowTip({x:o._lastX,y:o._lastY})})}var r=this._api.getZr(),s=this._tryShow;r.off("click",s),r.off("mousemove",s),r.off("mouseout",this._hide),"click"===t.get("triggerOn")?r.on("click",s,this):(r.on("mousemove",s,this),r.on("mouseout",this._hide,this))}},_manuallyShowTip:function(t){if(t.from!==this.uid){var e=this._ecModel,i=t.seriesIndex,n=t.dataIndex,a=e.getSeriesByIndex(i),o=this._api;if(null==t.x||null==t.y){if(a||e.eachSeries(function(t){u(t)&&!a&&(a=t)}),a){var r=a.getData();null==n&&(n=r.indexOfName(t.name));var s,l,h=r.getItemGraphicEl(n),c=a.coordinateSystem;if(c&&c.dataToPoint){var d=c.dataToPoint(r.getValues(c.dimensions,n,!0));s=d&&d[0],l=d&&d[1]}else if(h){var f=h.getBoundingRect().clone();f.applyTransform(h.transform),s=f.x+f.width/2,l=f.y+f.height/2}null!=s&&null!=l&&this._tryShow({offsetX:s,offsetY:l,target:h,event:{}})}}else{var h=o.getZr().handler.findHover(t.x,t.y);this._tryShow({offsetX:t.x,offsetY:t.y,target:h,event:{}})}}},_manuallyHideTip:function(t){t.from!==this.uid&&this._hide()},_prepareAxisTriggerData:function(t,e){var i={};return e.eachSeries(function(t){if(u(t)){var e,n,a=t.coordinateSystem;"cartesian2d"===a.type?(e=a.getBaseAxis(),n=e.dim+e.index):"single"===a.type?(e=a.getAxis(),n=e.dim+e.type):(e=a.getBaseAxis(),n=e.dim+a.name),i[n]=i[n]||{coordSys:[],series:[]},i[n].coordSys.push(a),i[n].series.push(t)}},this),i},_tryShow:function(t){var e=t.target,i=this._tooltipModel,n=i.get("trigger"),a=this._ecModel,o=this._api;if(i)if(this._lastX=t.offsetX,this._lastY=t.offsetY,e&&null!=e.dataIndex){var r=e.dataModel||a.getSeriesByIndex(e.seriesIndex),s=e.dataIndex,l=r.getData().getItemModel(s);"axis"===(l.get("tooltip.trigger")||n)?this._showAxisTooltip(i,a,t):(this._ticket="",this._hideAxisPointer(),this._resetLastHover(),this._showItemTooltipContent(r,s,t)),o.dispatchAction({type:"showTip",from:this.uid,dataIndex:e.dataIndex,seriesIndex:e.seriesIndex})}else"item"===n?this._hide():this._showAxisTooltip(i,a,t),"cross"===i.get("axisPointer.type")&&o.dispatchAction({type:"showTip",from:this.uid,x:t.offsetX,y:t.offsetY})},_showAxisTooltip:function(t,e,i){var a=t.getModel("axisPointer"),o=a.get("type");if("cross"===o){var r=i.target;if(r&&null!=r.dataIndex){var s=e.getSeriesByIndex(r.seriesIndex),l=r.dataIndex;this._showItemTooltipContent(s,l,i)}}this._showAxisPointer();var h=!0;f.each(this._seriesGroupByAxis,function(t){var e=t.coordSys,r=e[0],s=[i.offsetX,i.offsetY];if(!r.containPoint(s))return void this._hideAxisPointer(r.name);h=!1;var l=r.dimensions,u=r.pointToData(s,!0);s=r.dataToPoint(u);var c=r.getBaseAxis(),d=a.get("axis");"auto"===d&&(d=c.dim);var p=!1,g=this._lastHover;if("cross"===o)n(g.data,u)&&(p=!0),g.data=u;else{var m=f.indexOf(l,d);g.data===u[m]&&(p=!0),g.data=u[m]}"cartesian2d"!==r.type||p?"polar"!==r.type||p?"single"!==r.type||p||this._showSinglePointer(a,r,d,s):this._showPolarPointer(a,r,d,s):this._showCartesianPointer(a,r,d,s),"cross"!==o&&this._dispatchAndShowSeriesTooltipContent(r,t.series,s,u,p)},this),h&&this._hide()},_showCartesianPointer:function(t,e,i,n){function r(i,n,o){var r="x"===i?a(n[0],o[0],n[0],o[1]):a(o[0],n[1],o[1],n[1]),s=l._getPointerElement(e,t,i,r);u?d.updateProps(s,{shape:r},t):s.attr({shape:r})}function s(i,n,a){var r=e.getAxis(i),s=r.getBandWidth(),h=a[1]-a[0],c="x"===i?o(n[0]-s/2,a[0],s,h):o(a[0],n[1]-s/2,h,s),f=l._getPointerElement(e,t,i,c);u?d.updateProps(f,{shape:c},t):f.attr({shape:c})}var l=this,h=t.get("type"),u="cross"!==h;if("cross"===h)r("x",n,e.getAxis("y").getGlobalExtent()),r("y",n,e.getAxis("x").getGlobalExtent()),this._updateCrossText(e,n,t);else{var c=e.getAxis("x"===i?"y":"x"),f=c.getGlobalExtent();"cartesian2d"===e.type&&("line"===h?r:s)(i,n,f)}},_showSinglePointer:function(t,e,i,n){function o(i,n,o){var s=e.getAxis(),h=s.orient,u="horizontal"===h?a(n[0],o[0],n[0],o[1]):a(o[0],n[1],o[1],n[1]),c=r._getPointerElement(e,t,i,u);l?d.updateProps(c,{shape:u},t):c.attr({shape:u})}var r=this,s=t.get("type"),l="cross"!==s,h=e.getRect(),u=[h.y,h.y+h.height];o(i,n,u)},_showPolarPointer:function(t,e,i,n){function o(i,n,o){var r,s=e.pointToCoord(n);if("angle"===i){var h=e.coordToPoint([o[0],s[1]]),u=e.coordToPoint([o[1],s[1]]);r=a(h[0],h[1],u[0],u[1])}else r={cx:e.cx,cy:e.cy,r:s[0]};var c=l._getPointerElement(e,t,i,r);f?d.updateProps(c,{shape:r},t):c.attr({shape:r})}function s(i,n,a){var o,s=e.getAxis(i),h=s.getBandWidth(),u=e.pointToCoord(n),c=Math.PI/180;o="angle"===i?r(e.cx,e.cy,a[0],a[1],(-u[1]-h/2)*c,(-u[1]+h/2)*c):r(e.cx,e.cy,u[0]-h/2,u[0]+h/2,0,2*Math.PI);var p=l._getPointerElement(e,t,i,o);f?d.updateProps(p,{shape:o},t):p.attr({shape:o})}var l=this,h=t.get("type"),u=e.getAngleAxis(),c=e.getRadiusAxis(),f="cross"!==h;if("cross"===h)o("angle",n,c.getExtent()),o("radius",n,u.getExtent()),this._updateCrossText(e,n,t);else{var p=e.getAxis("radius"===i?"angle":"radius"),g=p.getExtent();("line"===h?o:s)(i,n,g)}},_updateCrossText:function(t,e,i){var n=i.getModel("crossStyle"),a=n.getModel("textStyle"),o=this._tooltipModel,r=this._crossText;r||(r=this._crossText=new d.Text({style:{textAlign:"left",textVerticalAlign:"bottom"}}),this.group.add(r));var s=t.pointToData(e),l=t.dimensions;s=f.map(s,function(e,i){var n=t.getAxis(l[i]);return e="category"===n.type||"time"===n.type?n.scale.getLabel(e):p.addCommas(e.toFixed(n.getPixelPrecision()))}),r.setStyle({fill:a.getTextColor()||n.get("color"),textFont:a.getFont(),text:s.join(", "),x:e[0]+5,y:e[1]-5}),r.z=o.get("z"),r.zlevel=o.get("zlevel")},_getPointerElement:function(t,e,i,n){var a=this._tooltipModel,o=a.get("z"),r=a.get("zlevel"),s=this._axisPointers,l=t.name;if(s[l]=s[l]||{},s[l][i])return s[l][i];var h=e.get("type"),u=e.getModel(h+"Style"),c="shadow"===h,f=u[c?"getAreaStyle":"getLineStyle"](),p="polar"===t.type?c?"Sector":"radius"===i?"Circle":"Line":c?"Rect":"Line";c?f.stroke=null:f.fill=null;var g=s[l][i]=new d[p]({style:f,z:o,zlevel:r,silent:!0,shape:n});return this.group.add(g),g},_dispatchAndShowSeriesTooltipContent:function(t,e,i,n,a){var o=this._tooltipModel,r=this._tooltipContent,s=t.getBaseAxis(),l=f.map(e,function(t){return{seriesIndex:t.seriesIndex,dataIndex:t.getAxisTooltipDataIndex?t.getAxisTooltipDataIndex(t.coordDimToDataDim(s.dim),n,s):t.getData().indexOfNearest(t.coordDimToDataDim(s.dim)[0],n["x"===s.dim||"radius"===s.dim?0:1])}}),u=this._lastHover,c=this._api;if(u.payloadBatch&&!a&&c.dispatchAction({type:"downplay",batch:u.payloadBatch}),a||(c.dispatchAction({type:"highlight",batch:l}),u.payloadBatch=l),c.dispatchAction({type:"showTip",dataIndex:l[0].dataIndex,seriesIndex:l[0].seriesIndex,from:this.uid}),s&&o.get("showContent")){var d,g=o.get("formatter"),m=o.get("position"),v=f.map(e,function(t,e){return t.getDataParams(l[e].dataIndex)});r.show(o);var y=l[0].dataIndex;if(!a){if(this._ticket="",g){if("string"==typeof g)d=p.formatTpl(g,v);else if("function"==typeof g){var x=this,_="axis_"+t.name+"_"+y,w=function(t,e){t===x._ticket&&(r.setContent(e),h(m,i[0],i[1],r,v,null,c))};x._ticket=_,d=g(v,_,w)}}else{var b=e[0].getData().getName(y);d=(b?b+"
            ":"")+f.map(e,function(t,e){return t.formatTooltip(l[e].dataIndex,!0)}).join("
            ")}r.setContent(d)}h(m,i[0],i[1],r,v,null,c)}},_showItemTooltipContent:function(t,e,i){var n=this._api,a=t.getData(),o=a.getItemModel(e),r=this._tooltipModel,s=this._tooltipContent,l=o.getModel("tooltip");if(l.parentModel?l.parentModel.parentModel=r:l.parentModel=this._tooltipModel,l.get("showContent")){var u,c=l.get("formatter"),d=l.get("position"),f=t.getDataParams(e);if(c){if("string"==typeof c)u=p.formatTpl(c,f);else if("function"==typeof c){var g=this,m="item_"+t.name+"_"+e,v=function(t,e){t===g._ticket&&(s.setContent(e),h(d,i.offsetX,i.offsetY,s,f,i.target,n))};g._ticket=m,u=c(f,m,v)}}else u=t.formatTooltip(e);s.show(l),s.setContent(u),h(d,i.offsetX,i.offsetY,s,f,i.target,n)}},_showAxisPointer:function(t){if(t){var e=this._axisPointers[t];e&&f.each(e,function(t){t.show()})}else this.group.eachChild(function(t){t.show()}),this.group.show()},_resetLastHover:function(){var t=this._lastHover;t.payloadBatch&&this._api.dispatchAction({type:"downplay",batch:t.payloadBatch}),this._lastHover={}},_hideAxisPointer:function(t){if(t){var e=this._axisPointers[t];e&&f.each(e,function(t){t.hide()})}else this.group.hide()},_hide:function(){this._hideAxisPointer(),this._resetLastHover(),this._alwaysShowContent||this._tooltipContent.hideLater(this._tooltipModel.get("hideDelay")),this._api.dispatchAction({type:"hideTip",from:this.uid})},dispose:function(t,e){if(!v.node){var i=e.getZr();this._tooltipContent.hide(),i.off("click",this._tryShow),i.off("mousemove",this._tryShow),i.off("mouseout",this._hide),e.off("showTip",this._manuallyShowTip),e.off("hideTip",this._manuallyHideTip)}}})},function(t,e,i){function n(t,e){var i=t.get("center"),n=t.get("radius"),a=e.getWidth(),o=e.getHeight(),r=s.parsePercent;this.cx=r(i[0],a),this.cy=r(i[1],o);var l=this.getRadiusAxis(),h=Math.min(a,o)/2;l.setExtent(0,r(n,h))}function a(t,e){var i=this,n=i.getAngleAxis(),a=i.getRadiusAxis();if(n.scale.setExtent(1/0,-(1/0)),a.scale.setExtent(1/0,-(1/0)),t.eachSeries(function(t){if(t.coordinateSystem===i){var e=t.getData();a.scale.unionExtent(e.getDataExtent("radius","category"!==a.type)),n.scale.unionExtent(e.getDataExtent("angle","category"!==n.type))}}),h(n,n.model),h(a,a.model),"category"===n.type&&!n.onBand){var o=n.getExtent(),r=360/n.scale.count();n.inverse?o[1]+=r:o[1]-=r,n.setExtent(o[0],o[1])}}function o(t,e){if(t.type=e.get("type"),t.scale=l.createScaleByModel(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,"angleAxis"===e.mainType){var i=e.get("startAngle");t.inverse=e.get("inverse")^e.get("clockwise"),t.setExtent(i,i+(t.inverse?-360:360))}e.axis=t,t.model=e}var r=i(337),s=i(4),l=i(23),h=l.niceScaleExtent;i(338);var u={dimensions:r.prototype.dimensions,create:function(t,e){var i=[];return t.eachComponent("polar",function(t,s){var l=new r(s);l.resize=n,l.update=a;var h=l.getRadiusAxis(),u=l.getAngleAxis(),c=t.findAxisModel("radiusAxis"),d=t.findAxisModel("angleAxis");o(h,c),o(u,d),l.resize(t,e),i.push(l),t.coordinateSystem=l}),t.eachSeries(function(t){"polar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("polarIndex")])}),i}};i(28).register("polar",u)},function(t,e){function i(){h=!1,r.length?l=r.concat(l):u=-1,l.length&&n()}function n(){if(!h){var t=setTimeout(i);h=!0;for(var e=l.length;e;){for(r=l,l=[];++u1)for(var i=1;i=0?parseFloat(t)/100*e:parseFloat(t):t},E=function(t,e,i){var n=r.parse(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=D(n[0],n[1],n[2]),t.opacity=i*n[3])},O=function(t){var e=r.parse(t);return[D(e[0],e[1],e[2]),e[3]]},V=function(t,e,i){var n=e.fill;if(null!=n)if(n instanceof f){var a,o=0,r=[0,0],s=0,l=1,h=i.getBoundingRect(),u=h.width,c=h.height;if("linear"===n.type){a="gradient";var d=i.transform,p=[n.x*u,n.y*c],g=[n.x2*u,n.y2*c];d&&(w(p,p,d),w(g,g,d));var m=g[0]-p[0],v=g[1]-p[1];o=180*Math.atan2(m,v)/Math.PI,0>o&&(o+=360),1e-6>o&&(o=0)}else{a="gradientradial";var p=[n.x*u,n.y*c],d=i.transform,y=i.scale,x=u,b=c;r=[(p[0]-h.x)/x,(p[1]-h.y)/b],d&&w(p,p,d),x/=y[0]*S,b/=y[1]*S;var M=_(x,b);s=0/M,l=2*n.r/M-s}var A=n.colorStops.slice();A.sort(function(t,e){return t.offset-e.offset});for(var I=A.length,T=[],C=[],L=0;I>L;L++){var D=A[L],P=O(D.color);C.push(D.offset*l+s+" "+P[0]),0!==L&&L!==I-1||T.push(P)}if(I>=2){var k=T[0][0],z=T[1][0],R=T[0][1]*e.opacity,V=T[1][1]*e.opacity;t.type=a,t.method="none",t.focus="100%",t.angle=o,t.color=k,t.color2=z,t.colors=C.join(","),t.opacity=V,t.opacity2=R}"radial"===a&&(t.focusposition=r.join(","))}else E(t,n,e.opacity)},N=function(t,e){null!=e.lineJoin&&(t.joinstyle=e.lineJoin),null!=e.miterLimit&&(t.miterlimit=e.miterLimit*S),null!=e.lineCap&&(t.endcap=e.lineCap),null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof f||E(t,e.stroke,e.opacity)},B=function(t,e,i,n){var a="fill"==e,o=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(a||!a&&i.lineWidth)?(t[a?"filled":"stroked"]="true",i[e]instanceof f&&k(t,o),o||(o=p.createNode(e)),a?V(o,i,n):N(o,i),P(t,o)):(t[a?"filled":"stroked"]="false",k(t,o))},G=[[],[],[]],F=function(t,e){var i,n,a,r,s,l,h=o.M,u=o.C,c=o.L,d=o.A,f=o.Q,p=[];for(r=0;r0){p.push(n);for(var U=0;i>U;U++){var X=G[U];e&&w(X,X,e),p.push(g(X[0]*S-A),b,g(X[1]*S-A),i-1>U?b:"")}}}return p.join("")};d.prototype.brushVML=function(t){var e=this.style,i=this._vmlEl;i||(i=p.createNode("shape"),C(i),this._vmlEl=i),B(i,"fill",e,this),B(i,"stroke",e,this);var n=this.transform,a=null!=n,o=i.getElementsByTagName("stroke")[0];if(o){var r=e.lineWidth;if(a&&!e.strokeNoScale){var s=n[0]*n[3]-n[1]*n[2];r*=m(v(s))}o.weight=r+"px"}var l=this.path;this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),this.__dirtyPath=!1),i.path=F(l.data,this.transform),i.style.zIndex=z(this.zlevel,this.z,this.z2),P(t,i),e.text&&this.drawRectText(t,this.getBoundingRect())},d.prototype.onRemove=function(t){k(t,this._vmlEl),this.removeRectText(t)},d.prototype.onAdd=function(t){P(t,this._vmlEl),this.appendRectText(t)};var W=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};u.prototype.brushVML=function(t){var e,i,n=this.style,a=n.image;if(W(a)){var o=a.src;if(o===this._imageSrc)e=this._imageWidth,i=this._imageHeight;else{var r=a.runtimeStyle,s=r.width,l=r.height;r.width="auto",r.height="auto",e=a.width,i=a.height,r.width=s,r.height=l,this._imageSrc=o,this._imageWidth=e,this._imageHeight=i}a=o}else a===this._imageSrc&&(e=this._imageWidth,i=this._imageHeight);if(a){var h=n.x||0,u=n.y||0,c=n.width,d=n.height,f=n.sWidth,v=n.sHeight,y=n.sx||0,x=n.sy||0,S=f&&v,A=this._vmlEl;A||(A=p.doc.createElement("div"),C(A),this._vmlEl=A);var I,T=A.style,L=!1,D=1,k=1;if(this.transform&&(I=this.transform,D=m(I[0]*I[0]+I[1]*I[1]),k=m(I[2]*I[2]+I[3]*I[3]),L=I[1]||I[2]),L){var R=[h,u],E=[h+c,u],O=[h,u+d],V=[h+c,u+d];w(R,R,I),w(E,E,I),w(O,O,I),w(V,V,I);var N=_(R[0],E[0],O[0],V[0]),B=_(R[1],E[1],O[1],V[1]),G=[];G.push("M11=",I[0]/D,b,"M12=",I[2]/k,b,"M21=",I[1]/D,b,"M22=",I[3]/k,b,"Dx=",g(h*D+I[4]),b,"Dy=",g(u*k+I[5])),T.padding="0 "+g(N)+"px "+g(B)+"px 0",T.filter=M+".Matrix("+G.join("")+", SizingMethod=clip)"}else I&&(h=h*D+I[4],u=u*k+I[5]),T.filter="",T.left=g(h)+"px",T.top=g(u)+"px";var F=this._imageEl,H=this._cropEl;F||(F=p.doc.createElement("div"),this._imageEl=F);var Z=F.style;if(S){if(e&&i)Z.width=g(D*e*c/f)+"px",Z.height=g(k*i*d/v)+"px";else{var q=new Image,j=this;q.onload=function(){q.onload=null,e=q.width,i=q.height,Z.width=g(D*e*c/f)+"px",Z.height=g(k*i*d/v)+"px",j._imageWidth=e,j._imageHeight=i,j._imageSrc=a},q.src=a}H||(H=p.doc.createElement("div"),H.style.overflow="hidden",this._cropEl=H);var U=H.style;U.width=g((c+y*c/f)*D),U.height=g((d+x*d/v)*k),U.filter=M+".Matrix(Dx="+-y*c/f*D+",Dy="+-x*d/v*k+")",H.parentNode||A.appendChild(H),F.parentNode!=H&&H.appendChild(F)}else Z.width=g(D*c)+"px",Z.height=g(k*d)+"px",A.appendChild(F),H&&H.parentNode&&(A.removeChild(H),this._cropEl=null);var X="",Y=n.opacity;1>Y&&(X+=".Alpha(opacity="+g(100*Y)+") "),X+=M+".AlphaImageLoader(src="+a+", SizingMethod=scale)",Z.filter=X,A.style.zIndex=z(this.zlevel,this.z,this.z2),P(t,A),n.text&&this.drawRectText(t,this.getBoundingRect())}},u.prototype.onRemove=function(t){k(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},u.prototype.onAdd=function(t){P(t,this._vmlEl),this.appendRectText(t)};var H,Z="normal",q={},j=0,U=100,X=document.createElement("div"),Y=function(t){var e=q[t];if(!e){j>U&&(j=0,q={});var i,n=X.style;try{n.font=t,i=n.fontFamily.split(",")[0]}catch(a){}e={style:n.fontStyle||Z,variant:n.fontVariant||Z,weight:n.fontWeight||Z,size:0|parseFloat(n.fontSize||12),family:i||"Microsoft YaHei"},q[t]=e,j++}return e};s.measureText=function(t,e){var i=p.doc;H||(H=i.createElement("div"),H.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",p.doc.body.appendChild(H));try{H.style.font=e}catch(n){}return H.innerHTML="",H.appendChild(i.createTextNode(t)),{width:H.offsetWidth}};for(var K=new a,Q=function(t,e,i,n){var a=this.style,o=a.text;if(o){var r,l,h=a.textAlign,u=Y(a.textFont),c=u.style+" "+u.variant+" "+u.weight+" "+u.size+'px "'+u.family+'"',d=a.textBaseline,f=a.textVerticalAlign;i=i||s.getBoundingRect(o,c,h,d);var m=this.transform;if(m&&!n&&(K.copy(e),K.applyTransform(m),e=K),n)r=e.x,l=e.y;else{var v=a.textPosition,y=a.textDistance;if(v instanceof Array)r=e.x+R(v[0],e.width),l=e.y+R(v[1],e.height),h=h||"left",d=d||"top";else{var x=s.adjustTextPositionOnRect(v,e,i,y);r=x.x,l=x.y,h=h||x.textAlign,d=d||x.textBaseline}}if(f){switch(f){case"middle":l-=i.height/2;break;case"bottom":l-=i.height}d="top"}var _=u.size;switch(d){case"hanging":case"top":l+=_/1.75;break;case"middle":break;default:l-=_/2.25}switch(h){case"left":break;case"center":r-=i.width/2;break;case"right":r-=i.width}var M,S,A,I=p.createNode,T=this._textVmlEl;T?(A=T.firstChild,M=A.nextSibling,S=M.nextSibling):(T=I("line"),M=I("path"),S=I("textpath"),A=I("skew"),S.style["v-text-align"]="left",C(T),M.textpathok=!0,S.on=!0,T.from="0 0",T.to="1000 0.05",P(T,A),P(T,M),P(T,S),this._textVmlEl=T);var D=[r,l],k=T.style;m&&n?(w(D,D,m),A.on=!0,A.matrix=m[0].toFixed(3)+b+m[2].toFixed(3)+b+m[1].toFixed(3)+b+m[3].toFixed(3)+",0,0",A.offset=(g(D[0])||0)+","+(g(D[1])||0),A.origin="0 0",k.left="0px",k.top="0px"):(A.on=!1,k.left=g(r)+"px",k.top=g(l)+"px"),S.string=L(o);try{S.style.font=c}catch(E){}B(T,"fill",{fill:n?a.fill:a.textFill,opacity:a.opacity},this),B(T,"stroke",{stroke:n?a.stroke:a.textStroke,opacity:a.opacity,lineDash:a.lineDash},this),T.style.zIndex=z(this.zlevel,this.z,this.z2),P(t,T)}},$=function(t){k(t,this._textVmlEl),this._textVmlEl=null},J=function(t){P(t,this._textVmlEl)},tt=[l,h,u,d,c],et=0;et0&&(e=[l,h]),t.setLayout([n,a,e])})}}},function(t,e){t.exports=function(t){var e=t.coordinateSystem;if(!e||"view"===e.type){var i=t.getGraph();i.eachNode(function(t){var e=t.getModel();t.setLayout([+e.get("x"),+e.get("y")])}),i.eachEdge(function(t){var e,i=t.getModel().get("lineStyle.normal.curveness")||0,n=t.node1.getLayout(),a=t.node2.getLayout();i>0&&(e=[(n[0]+a[0])/2-(n[1]-a[1])*i,(n[1]+a[1])/2-(a[0]-n[0])*i]),t.setLayout([n,a,e])})}}},function(t,e,i){var n=i(14),a=i(343),o=i(223),r=i(31),s=i(1);t.exports=function(t,e,i,l){for(var h=new a(l),u=0;u "+o[0]:o[0]+" - "+o[1]:o},resetTargetSeries:function(t,e){var i=this.option,n=this._autoSeriesIndex=null==(e?i:t).seriesIndex;i.seriesIndex=n?[]:s.normalizeToArray(i.seriesIndex),n&&this.ecModel.eachSeries(function(t,e){var n=t.getData();"list"===n.type&&i.seriesIndex.push(e)})},resetExtent:function(){var t=this.option,e=g([t.min,t.max]);this._dataExtent=e},getDataDimension:function(t){var e=this.option.dimension;return null!=e?e:t.dimensions.length-1},getExtent:function(){return this._dataExtent.slice()},resetVisual:function(t){function e(e,n){p(this.stateList,function(a){var o=n[a]||(n[a]={}),r=this.option[e][a]||{};p(r,function(e,n){if(h.isValidType(n)){var r={type:n,dataExtent:i,visual:e};t&&t.call(this,r,a),o[n]=new h(r)}},this)},this)}var i=this.getExtent();e.call(this,"controller",this.controllerVisuals),e.call(this,"target",this.targetVisuals)},completeVisualOption:function(){function t(t){f(n.color)&&!t.inRange&&(t.inRange={color:n.color.slice().reverse()}),p(this.stateList,function(e){var i=t[e];if(a.isString(i)){var n=l.get(i,"active",d);n?(t[e]={},t[e][i]=n):delete t[e]}},this)}function e(t,e,i){var n=t[e],a=t[i];n&&!a&&(a=t[i]={},p(n,function(t,e){var i=l.get(e,"inactive",d);h.isValidType(e)&&i&&(a[e]=i)}))}function i(t){var e=(t.inRange||{}).symbol||(t.outOfRange||{}).symbol,i=(t.inRange||{}).symbolSize||(t.outOfRange||{}).symbolSize,n=this.get("inactiveColor");p(this.stateList,function(o){var r=this.itemSize,s=t[o];s||(s=t[o]={color:d?n:[n]}),s.symbol||(s.symbol=e&&a.clone(e)||(d?"roundRect":["roundRect"])),s.symbolSize||(s.symbolSize=i&&a.clone(i)||(d?r[0]:[r[0],r[0]])),s.symbol=u(s.symbol,function(t){return"none"===t||"square"===t?"roundRect":t});var l=s.symbolSize;if(l){var h=-(1/0);c(l,function(t){t>h&&(h=t)}),s.symbolSize=u(l,function(t){return m(t,[0,h],[0,r[0]],!0)})}},this)}var n=this.option,o={inRange:n.inRange,outOfRange:n.outOfRange},r=n.target||(n.target={}),s=n.controller||(n.controller={});a.merge(r,o),a.merge(s,o);var d=this.isCategory();t.call(this,r),t.call(this,s),e.call(this,r,"inRange","outOfRange"),e.call(this,r,"outOfRange","inRange"),i.call(this,s)},eachTargetSeries:function(t,e){a.each(this.option.seriesIndex,function(i){t.call(e,this.ecModel.getSeriesByIndex(i))},this)},isCategory:function(){return!!this.option.categories},resetItemSize:function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},setSelected:a.noop,getValueState:a.noop});t.exports=v},function(t,e,i){var n=i(2),a=i(1),o=i(3),r=i(9),s=i(11),l=i(73);t.exports=n.extendComponentView({type:"visualMap",autoPositionValues:{left:1,right:1,top:1,bottom:1},init:function(t,e){this.ecModel=t,this.api=e,this.visualMapModel,this._updatableShapes={}},render:function(t,e,i,n){return this.visualMapModel=t,t.get("show")===!1?void this.group.removeAll():void this.doRender.apply(this,arguments)},renderBackground:function(t){var e=this.visualMapModel,i=r.normalizeCssArray(e.get("padding")||0),n=t.getBoundingRect();t.add(new o.Rect({z2:-1,silent:!0,shape:{x:n.x-i[3],y:n.y-i[0],width:n.width+i[3]+i[1],height:n.height+i[0]+i[2]},style:{fill:e.get("backgroundColor"),stroke:e.get("borderColor"),lineWidth:e.get("borderWidth")}}))},getControllerVisual:function(t,e,i){function n(t){return c[t]}function o(t,e){c[t]=e}var r=this.visualMapModel,s=a.isArray(t);if(s&&(!e||"color"!==i))throw new Error(t);var h=r.controllerVisuals[e||r.getValueState(t)],u=r.get("contentColor"),c={symbol:r.get("itemSymbol"),color:s?[{color:u,offset:0},{color:u,offset:1}]:u},d=l.prepareVisualTypes(h);return a.each(d,function(e){var a=h[e];i&&!l.isInVisualCluster(e,i)||a&&a.applyVisual(t,n,o)}),c},positionGroup:function(t){var e=this.visualMapModel,i=this.api;s.positionGroup(t,e.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()})},doRender:a.noop})},function(t,e,i){var n=i(11),a={getItemAlign:function(t,e,i){var a=t.option,o=a.align;if(null!=o&&"auto"!==o)return o;for(var r={width:e.getWidth(),height:e.getHeight()},s="horizontal"===a.orient?1:0,l=[["left","right","width"],["top","bottom","height"]],h=l[s],u=[0,null,10],c={},d=0;3>d;d++)c[l[1-s][d]]=u[d],c[h[d]]=2===d?i[0]:a[h[d]];var f=[["x","width",3],["y","height",0]][s],p=n.getLayoutRect(c,r,a.padding);return h[(p.margin[f[2]]||0)+p[f[0]]+.5*p[f[1]]<.5*r[f[1]]?0:1]}};t.exports=a},function(t,e,i){function n(t,e){return t&&t.hasOwnProperty&&t.hasOwnProperty(e)}var a=i(1),o=a.each;t.exports=function(t){var e=t&&t.visualMap;a.isArray(e)||(e=e?[e]:[]),o(e,function(t){if(t){n(t,"splitList")&&!n(t,"pieces")&&(t.pieces=t.splitList,delete t.splitList);var e=t.pieces;e&&a.isArray(e)&&o(e,function(t){a.isObject(t)&&(n(t,"start")&&!n(t,"min")&&(t.min=t.start),n(t,"end")&&!n(t,"max")&&(t.max=t.end))})}})}},function(t,e,i){i(10).registerSubTypeDefaulter("visualMap",function(t){return t.categories||(t.pieces?t.pieces.length>0:t.splitNumber>0)&&!t.calculable?"piecewise":"continuous"})},function(t,e,i){function n(t,e){var i=t.targetVisuals,n={};r.each(["inRange","outOfRange"],function(t){var e=o.prepareVisualTypes(i[t]);n[t]=e}),t.eachTargetSeries(function(e){function a(t){return s.getItemVisual(r,t)}function o(t,e){s.setItemVisual(r,t,e)}var r,s=e.getData(),l=t.getDataDimension(s);s.each([l],function(e,s){r=s;for(var l=t.getValueState(e),h=i[l],u=n[l],c=0,d=u.length;d>c;c++){var f=u[c];h[f]&&h[f].applyVisual(e,a,o)}})})}var a=i(2),o=i(73),r=i(1);a.registerVisualCoding("component",function(t){t.eachComponent("visualMap",function(e){n(e,t)})})},function(t,e,i){var n=i(2),a={type:"selectDataRange",event:"dataRangeSelected",update:"update"};n.registerAction(a,function(t,e){e.eachComponent({mainType:"visualMap",query:t},function(e){e.setSelected(t.selected)})})},function(t,e,i){function n(){s.call(this)}function a(t){this.name=t,this.zoomLimit,s.call(this),this._roamTransform=new n,this._viewTransform=new n}var o=i(5),r=i(19),s=i(77),l=i(1),h=i(8),u=o.applyTransform;l.mixin(n,s),a.prototype={constructor:a,type:"view",dimensions:["x","y"],setBoundingRect:function(t,e,i,n){return this._rect=new h(t,e,i,n),this._rect},getBoundingRect:function(){return this._rect},setViewRect:function(t,e,i,n){this.transformTo(t,e,i,n),this._viewRect=new h(t,e,i,n)},transformTo:function(t,e,i,n){var a=this.getBoundingRect(),o=this._viewTransform;o.transform=a.calculateTransform(new h(t,e,i,n)),o.decomposeTransform(),this._updateTransform()},setPan:function(t,e){this._roamTransform.position=[t,e],this._updateTransform()},setZoom:function(t){var e=this.zoomLimit;e&&(t=Math.max(Math.min(t,e.max),e.min)),this._roamTransform.scale=[t,t],this._updateTransform()},getRoamTransform:function(){return this._roamTransform.transform},_updateTransform:function(){var t=this._roamTransform,e=this._viewTransform;e.parent=t,t.updateTransform(),e.updateTransform(),e.transform&&r.copy(this.transform||(this.transform=[]),e.transform),this.decomposeTransform()},getViewRect:function(){return this._viewRect},dataToPoint:function(t){var e=this.transform;return e?u([],t,e):[t[0],t[1]]},pointToData:function(t){var e=this.invTransform;return e?u([],t,e):[t[0],t[1]]}},l.mixin(a,s),t.exports=a},function(t,e,i){function n(t,e,i){if(this.name=t,this.contours=e,i)i=[i[0],i[1]];else{var n=this.getBoundingRect();i=[n.x+n.width/2,n.y+n.height/2]}this.center=i}var a=i(348),o=i(8),r=i(64),s=i(5);n.prototype={constructor:n,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,i=[e,e],n=[-e,-e],a=[],l=[],h=this.contours,u=0;un;n++)if(a.contain(i[n],t[0],t[1]))return!0;return!1},transformTo:function(t,e,i,n){var a=this.getBoundingRect(),r=a.width/a.height;i?n||(n=i/r):i=r*n;for(var l=new o(t,e,i,n),h=a.calculateTransform(l),u=this.contours,c=0;ca&&(a=i.length,i[a]=n,e[a]={axis:n,seriesModels:[]}),e[a].seriesModels.push(t)}),e}function a(t){var e,i,n=t.axis,a=t.seriesModels,o=a.length,s=t.boxWidthList=[],u=t.boxOffsetList=[],c=[];if("category"===n.type)i=n.getBandWidth();else{var d=0;h(a,function(t){d=Math.max(d,t.getData().count())}),e=n.getExtent(),Math.abs(e[1]-e[0])/d}h(a,function(t){var e=t.get("boxWidth");r.isArray(e)||(e=[e,e]),c.push([l(e[0],i)||0,l(e[1],i)||0])});var f=.8*i-2,p=f/o*.3,g=(f-p*(o-1))/o,m=g/2-f/2;h(a,function(t,e){u.push(m),m+=p+g,s.push(Math.min(Math.max(g,c[e][0]),c[e][1]))})}function o(t,e,i){var n=t.coordinateSystem,a=t.getData(),o=t.dimensions,r=t.get("layout"),s=i/2;a.each(o,function(){function t(t){var i=[];i[f]=c,i[p]=t;var a;return isNaN(c)||isNaN(t)?a=[NaN,NaN]:(a=n.dataToPoint(i),a[f]+=e),a}function i(t,e){var i=t.slice(),n=t.slice();i[f]+=s,n[f]-=s,e?x.push(i,n):x.push(n,i)}function l(t){var e=[t.slice(),t.slice()];e[0][f]-=s,e[1][f]+=s,y.push(e)}var h=arguments,u=o.length,c=h[0],d=h[u],f="horizontal"===r?0:1,p=1-f,g=t(h[3]),m=t(h[1]),v=t(h[5]),y=[[m,t(h[2])],[v,t(h[4])]];l(m),l(v),l(g);var x=[];i(y[0][1],0),i(y[1][1],1),a.setItemLayout(d,{chartLayout:r,initBaseline:g[p],median:g,bodyEnds:x,whiskerEnds:y})})}var r=i(1),s=i(4),l=s.parsePercent,h=r.each;t.exports=function(t,e){var i=n(t);h(i,function(t){var e=t.seriesModels;e.length&&(a(t),h(e,function(e,i){o(e,t.boxOffsetList[i],t.boxWidthList[i])}))})}},function(t,e){var i=["itemStyle","normal","borderColor"];t.exports=function(t,e){var n=t.get("color");t.eachRawSeriesByType("boxplot",function(e){var a=n[e.seriesIndex%n.length],o=e.getData();o.setVisual({legendSymbol:"roundRect",color:e.get(i)||a}),t.isSeriesFiltered(e)||o.each(function(t){var e=o.getItemModel(t);o.setItemVisual(t,{color:e.get(i,!0)})})})}},function(t,e,i){var n=i(2);i(230),i(231),n.registerPreprocessor(i(234)),n.registerVisualCoding("chart",i(233)),n.registerLayout(i(232))},function(t,e,i){"use strict";var n=i(1),a=i(13),o=i(159),r=i(9),s=r.encodeHTML,l=r.addCommas,h=a.extend({type:"series.candlestick",dependencies:["xAxis","yAxis","grid"],valueDimensions:["open","close","lowest","highest"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,layout:null,itemStyle:{normal:{color:"#c23531",color0:"#314656",borderWidth:1,borderColor:"#c23531",borderColor0:"#314656"},emphasis:{borderWidth:2}},animationUpdate:!1,animationEasing:"linear",animationDuration:300},getShadowDim:function(){return"open"},formatTooltip:function(t,e){var i=n.map(this.valueDimensions,function(e){return e+": "+l(this._data.get(e,t))},this);return s(this.name)+"
            "+i.join("
            ")}});n.mixin(h,o.seriesModelMixin,!0),t.exports=h},function(t,e,i){"use strict";function n(t,e,i){var n=e.getItemModel(i),a=n.getModel(h),o=e.getItemVisual(i,"color"),s=e.getItemVisual(i,"borderColor"),l=a.getItemStyle(["color","color0","borderColor","borderColor0"]),c=t.childAt(t.whiskerIndex);c.style.set(l),c.style.stroke=s,c.dirty();var d=t.childAt(t.bodyIndex);d.style.set(l),d.style.fill=o,d.style.stroke=s,d.dirty();var f=n.getModel(u).getItemStyle();r.setHoverStyle(t,f)}var a=i(1),o=i(25),r=i(3),s=i(159),l=o.extend({type:"candlestick",getStyleUpdater:function(){return n}});a.mixin(l,s.viewMixin,!0);var h=["itemStyle","normal"],u=["itemStyle","emphasis"];t.exports=l},function(t,e){function i(t,e){var i,r=t.getBaseAxis(),s="category"===r.type?r.getBandWidth():(i=r.getExtent(),Math.abs(i[1]-i[0])/e.count());return s/2-2>a?s/2-2:s-a>o?a:Math.max(s-o,n)}var n=2,a=5,o=4;t.exports=function(t,e){t.eachSeriesByType("candlestick",function(t){var e=t.coordinateSystem,n=t.getData(),a=t.dimensions,o=t.get("layout"),r=i(t,n);n.each(a,function(){function t(t){var i=[];return i[c]=h,i[d]=t,isNaN(h)||isNaN(t)?[NaN,NaN]:e.dataToPoint(i)}function i(t,e){var i=t.slice(),n=t.slice();i[c]+=r/2,n[c]-=r/2,e?S.push(i,n):S.push(n,i)}var s=arguments,l=a.length,h=s[0],u=s[l],c="horizontal"===o?0:1,d=1-c,f=s[1],p=s[2],g=s[3],m=s[4],v=Math.min(f,p),y=Math.max(f,p),x=t(v),_=t(y),w=t(g),b=t(m),M=[[b,_],[w,x]],S=[];i(_,0),i(x,1),n.setItemLayout(u,{chartLayout:o,sign:f>p?-1:p>f?1:0,initBaseline:f>p?_[d]:x[d],bodyEnds:S,whiskerEnds:M})},!0)})}},function(t,e){var i=["itemStyle","normal","borderColor"],n=["itemStyle","normal","borderColor0"],a=["itemStyle","normal","color"],o=["itemStyle","normal","color0"];t.exports=function(t,e){t.eachRawSeriesByType("candlestick",function(e){var r=e.getData();r.setVisual({legendSymbol:"roundRect"}),t.isSeriesFiltered(e)||r.each(function(t){var e=r.getItemModel(t),s=r.getItemLayout(t).sign;r.setItemVisual(t,{color:e.get(s>0?a:o),borderColor:e.get(s>0?i:n)})})})}},function(t,e,i){var n=i(1);t.exports=function(t){t&&n.isArray(t.series)&&n.each(t.series,function(t){n.isObject(t)&&"k"===t.type&&(t.type="candlestick")})}},function(t,e,i){var n=i(1),a=i(2);i(236),i(237),a.registerVisualCoding("chart",n.curry(i(44),"effectScatter","circle",null)),a.registerLayout(n.curry(i(53),"effectScatter"))},function(t,e,i){"use strict";var n=i(36),a=i(13);t.exports=a.extend({type:"series.effectScatter",dependencies:["grid","polar"],getInitialData:function(t,e){var i=n(t.data,this,e);return i},defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,effectType:"ripple",showEffectOn:"render",rippleEffect:{period:4,scale:2.5,brushType:"fill"},xAxisIndex:0,yAxisIndex:0,polarIndex:0,geoIndex:0,symbolSize:10}})},function(t,e,i){var n=i(38),a=i(262);i(2).extendChartView({type:"effectScatter",init:function(){this._symbolDraw=new n(a)},render:function(t,e,i){var n=t.getData(),a=this._symbolDraw;a.updateData(n),this.group.add(a.group)},updateLayout:function(){this._symbolDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(e)}})},function(t,e,i){var n=i(1),a=i(2);i(239),i(240),a.registerVisualCoding("chart",n.curry(i(63),"funnel")),a.registerLayout(i(241)),a.registerProcessor("filter",n.curry(i(62),"funnel"))},function(t,e,i){"use strict";var n=i(14),a=i(7),o=i(31),r=i(2).extendSeriesModel({type:"series.funnel",init:function(t){r.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._dataBeforeProcessed},this._defaultLabelLine(t)},getInitialData:function(t,e){var i=o(["value"],t.data),a=new n(i,this);return a.initData(t.data),a},_defaultLabelLine:function(t){a.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,i=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,i.show=i.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",gap:0,funnelAlign:"center",label:{normal:{show:!0,position:"outer"},emphasis:{show:!0}},labelLine:{normal:{show:!0,length:20,lineStyle:{width:1,type:"solid"}},emphasis:{}},itemStyle:{normal:{borderColor:"#fff",borderWidth:1},emphasis:{}}}});t.exports=r},function(t,e,i){function n(t,e){function i(){r.ignore=r.hoverIgnore,s.ignore=s.hoverIgnore}function n(){r.ignore=r.normalIgnore,s.ignore=s.normalIgnore}o.Group.call(this);var a=new o.Polygon,r=new o.Polyline,s=new o.Text;this.add(a),this.add(r),this.add(s),this.updateData(t,e,!0),this.on("emphasis",i).on("normal",n).on("mouseover",i).on("mouseout",n)}function a(t,e,i,n){var a=n.getModel("textStyle"),o=n.get("position"),s="inside"===o||"inner"===o||"center"===o;return{fill:a.getTextColor()||(s?"#fff":t.getItemVisual(e,"color")),textFont:a.getFont(),text:r.retrieve(t.hostModel.getFormattedLabel(e,i),t.getName(e))}}var o=i(3),r=i(1),s=n.prototype,l=["itemStyle","normal","opacity"];s.updateData=function(t,e,i){var n=this.childAt(0),a=t.hostModel,s=t.getItemModel(e),h=t.getItemLayout(e),u=t.getItemModel(e).get(l);u=null==u?1:u,i?(n.setShape({points:h.points}),n.setStyle({opacity:0}),o.updateProps(n,{style:{opacity:u}},a)):o.initProps(n,{shape:{points:h.points}},a);var c=s.getModel("itemStyle"),d=t.getItemVisual(e,"color");n.setStyle(r.defaults({fill:d},c.getModel("normal").getItemStyle())),n.hoverStyle=c.getModel("emphasis").getItemStyle(),this._updateLabel(t,e),o.setHoverStyle(this)},s._updateLabel=function(t,e){var i=this.childAt(1),n=this.childAt(2),r=t.hostModel,s=t.getItemModel(e),l=t.getItemLayout(e),h=l.label,u=t.getItemVisual(e,"color");o.updateProps(i,{shape:{points:h.linePoints||h.linePoints}},r),o.updateProps(n,{style:{x:h.x,y:h.y}},r),n.attr({style:{textAlign:h.textAlign,textVerticalAlign:h.verticalAlign,textFont:h.font},rotation:h.rotation,origin:[h.x,h.y],z2:10});var c=s.getModel("label.normal"),d=s.getModel("label.emphasis"),f=s.getModel("labelLine.normal"),p=s.getModel("labelLine.emphasis");n.setStyle(a(t,e,"normal",c)),n.ignore=n.normalIgnore=!c.get("show"),n.hoverIgnore=!d.get("show"),i.ignore=i.normalIgnore=!f.get("show"),i.hoverIgnore=!p.get("show"),i.setStyle({stroke:u}),i.setStyle(f.getModel("lineStyle").getLineStyle()),n.hoverStyle=a(t,e,"emphasis",d),i.hoverStyle=p.getModel("lineStyle").getLineStyle()},r.inherits(n,o.Group);var h=i(25).extend({type:"funnel",render:function(t,e,i){var a=t.getData(),o=this._data,r=this.group;a.diff(o).add(function(t){var e=new n(a,t);a.setItemGraphicEl(t,e),r.add(e)}).update(function(t,e){var i=o.getItemGraphicEl(e);i.updateData(a,t),r.add(i),a.setItemGraphicEl(t,i)}).remove(function(t){var e=o.getItemGraphicEl(t);r.remove(e)}).execute(),this._data=a},remove:function(){this.group.removeAll(),this._data=null}});t.exports=h},function(t,e,i){function n(t,e){return r.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function a(t,e){for(var i=t.mapArray("value",function(t){return t}),n=[],a="ascending"===e,o=0,r=t.count();r>o;o++)n[o]=o;return n.sort(function(t,e){return a?i[t]-i[e]:i[e]-i[t]}),n}function o(t){t.each(function(e){var i,n,a,o,r=t.getItemModel(e),s=r.getModel("label.normal"),l=s.get("position"),h=r.getModel("labelLine.normal"),u=t.getItemLayout(e),c=u.points,d="inner"===l||"inside"===l||"center"===l;if(d)n=(c[0][0]+c[1][0]+c[2][0]+c[3][0])/4,a=(c[0][1]+c[1][1]+c[2][1]+c[3][1])/4,i="center",o=[[n,a],[n,a]];else{var f,p,g,m=h.get("length");"left"===l?(f=(c[3][0]+c[0][0])/2,p=(c[3][1]+c[0][1])/2,g=f-m,n=g-5,i="right"):(f=(c[1][0]+c[2][0])/2,p=(c[1][1]+c[2][1])/2,g=f+m,n=g+5,i="left");var v=p;o=[[f,p],[g,v]],a=v}u.label={linePoints:o,x:n,y:a,verticalAlign:"middle",textAlign:i,inside:d}})}var r=i(11),s=i(4),l=s.parsePercent;t.exports=function(t,e){t.eachSeriesByType("funnel",function(t){var i=t.getData(),r=t.get("sort"),h=n(t,e),u=a(i,r),c=[l(t.get("minSize"),h.width),l(t.get("maxSize"),h.width)],d=i.getDataExtent("value"),f=t.get("min"),p=t.get("max");null==f&&(f=Math.min(d[0],0)),null==p&&(p=d[1]);var g=t.get("funnelAlign"),m=t.get("gap"),v=(h.height-m*(i.count()-1))/i.count(),y=h.y,x=function(t,e){var n,a=i.get("value",t)||0,o=s.linearMap(a,[f,p],c,!0);switch(g){case"left":n=h.x;break;case"center":n=h.x+(h.width-o)/2;break;case"right":n=h.x+h.width-o}return[[n,e],[n+o,e]]};"ascending"===r&&(v=-v,m=-m,y+=h.height,u=u.reverse());for(var _=0;_=t)return n[0][1];for(var e=0;e=t&&(0===e?0:n[e-1][0])=P;P++){var k=Math.cos(A),z=Math.sin(A);if(y.get("show")){var R=new r.Line({shape:{x1:k*g+f,y1:z*g+p,x2:k*(g-M)+f,y2:z*(g-M)+p},style:C,silent:!0});"auto"===C.stroke&&R.setStyle({stroke:n(P/w)}),d.add(R)}if(_.get("show")){var E=a(s.round(P/w*(v-m)+m),_.get("formatter")),O=new r.Text({style:{text:E,x:k*(g-M-5)+f,y:z*(g-M-5)+p,fill:D.getTextColor(),textFont:D.getFont(),textVerticalAlign:-.4>z?"top":z>.4?"bottom":"middle",textAlign:-.4>k?"left":k>.4?"right":"center"},silent:!0});"auto"===O.style.fill&&O.setStyle({fill:n(P/w)}),d.add(O)}if(x.get("show")&&P!==w){for(var V=0;b>=V;V++){var k=Math.cos(A),z=Math.sin(A),N=new r.Line({shape:{x1:k*g+f,y1:z*g+p,x2:k*(g-S)+f,y2:z*(g-S)+p},silent:!0,style:L});"auto"===L.stroke&&N.setStyle({stroke:n((P+V/b)/w)}),d.add(N),A+=T}A-=T}else A+=I}},_renderPointer:function(t,e,i,n,a,h,u,c){var d=s.linearMap,f=[+t.get("min"),+t.get("max")],p=[h,u];c||(p=p.reverse());var g=t.getData(),m=this._data,v=this.group;g.diff(m).add(function(e){var i=new o({shape:{angle:h}});r.updateProps(i,{shape:{angle:d(g.get("value",e),f,p)}},t),v.add(i),g.setItemGraphicEl(e,i)}).update(function(e,i){var n=m.getItemGraphicEl(i);r.updateProps(n,{shape:{angle:d(g.get("value",e),f,p)}},t),v.add(n),g.setItemGraphicEl(e,n)}).remove(function(t){var e=m.getItemGraphicEl(t);v.remove(e)}).execute(),g.eachItemGraphicEl(function(t,e){var i=g.getItemModel(e),o=i.getModel("pointer");t.attr({shape:{x:a.cx,y:a.cy,width:l(o.get("width"),a.r),r:l(o.get("length"),a.r)},style:i.getModel("itemStyle.normal").getItemStyle()}),"auto"===t.style.fill&&t.setStyle("fill",n((g.get("value",e)-f[0])/(f[1]-f[0]))),r.setHoverStyle(t,i.getModel("itemStyle.emphasis").getItemStyle())}),this._data=g},_renderTitle:function(t,e,i,n,a){var o=t.getModel("title");if(o.get("show")){var s=o.getModel("textStyle"),h=o.get("offsetCenter"),u=a.cx+l(h[0],a.r),c=a.cy+l(h[1],a.r),d=new r.Text({style:{x:u,y:c,text:t.getData().getName(0),fill:s.getTextColor(),textFont:s.getFont(),textAlign:"center",textVerticalAlign:"middle"}});this.group.add(d)}},_renderDetail:function(t,e,i,n,o){var s=t.getModel("detail"),h=t.get("min"),u=t.get("max");if(s.get("show")){var c=s.getModel("textStyle"),d=s.get("offsetCenter"),f=o.cx+l(d[0],o.r),p=o.cy+l(d[1],o.r),g=l(s.get("width"),o.r),m=l(s.get("height"),o.r),v=t.getData().get("value",0),y=new r.Rect({shape:{x:f-g/2,y:p-m/2,width:g,height:m},style:{text:a(v,s.get("formatter")),fill:s.get("backgroundColor"),textFill:c.getTextColor(),textFont:c.getFont()}});"auto"===y.style.textFill&&y.setStyle("textFill",n((v-h)/(u-h))),y.setStyle(s.getItemStyle(["color"])),this.group.add(y)}}});t.exports=u},function(t,e,i){t.exports=i(6).extend({type:"echartsGaugePointer",shape:{angle:0,width:10,r:10,x:0,y:0},buildPath:function(t,e){var i=Math.cos,n=Math.sin,a=e.r,o=e.width,r=e.angle,s=e.x-i(r)*o*(o>=a/3?1:2),l=e.y-n(r)*o*(o>=a/3?1:2);r=e.angle-Math.PI/2,t.moveTo(s,l),t.lineTo(e.x+i(r)*o,e.y+n(r)*o),t.lineTo(e.x+i(e.angle)*a,e.y+n(e.angle)*a),t.lineTo(e.x-i(r)*o,e.y-n(r)*o),t.lineTo(s,l)}})},function(t,e,i){var n=i(2),a=i(1);i(247),i(248),i(255),n.registerProcessor("filter",i(249)),n.registerVisualCoding("chart",a.curry(i(44),"graph","circle",null)),n.registerVisualCoding("chart",i(250)),n.registerLayout(i(256)),n.registerLayout(i(251)),n.registerLayout(i(254)),n.registerCoordinateSystem("graphView",{create:i(252)})},function(t,e,i){"use strict";var n=i(14),a=i(1),o=i(209),r=i(2).extendSeriesModel({type:"series.graph",init:function(t){r.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._categoriesData},this._updateCategoriesData()},mergeOption:function(t){r.superApply(this,"mergeOption",arguments),this._updateCategoriesData()},getInitialData:function(t,e){var i=t.edges||t.links,n=t.data||t.nodes;if(n&&i){var a=o(n,i,this,!0),r=a.data,s=this;return r.wrapMethod("getItemModel",function(t){var e=s._categoriesModels,i=t.getShallow("category"),n=e[i];return n&&(n.parentModel=t.parentModel,t.parentModel=n),t}),r}},restoreData:function(){r.superApply(this,"restoreData",arguments),this.getGraph().restoreData()},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},getCategoriesData:function(){ +return this._categoriesData},_updateCategoriesData:function(){var t=a.map(this.option.categories||[],function(t){return null!=t.value?t:a.extend({value:0},t)}),e=new n(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray(function(t){return e.getItemModel(t,!0)})},setRoamZoom:function(t){var e=this.option.roamDetail;e&&(e.zoom=t)},setRoamPan:function(t,e){var i=this.option.roamDetail;i&&(i.x=t,i.y=e)},defaultOption:{zlevel:0,z:2,color:["#61a0a8","#d14a61","#fd9c35","#675bba","#fec42c","#dd4444","#fd9c35","#cd4870"],coordinateSystem:"view",legendHoverLink:!0,hoverAnimation:!0,layout:null,force:{initLayout:null,repulsion:50,gravity:.1,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,draggable:!1,roam:!1,roamDetail:{x:0,y:0,zoom:1},nodeScaleRatio:.6,label:{normal:{show:!1},emphasis:{show:!0}},itemStyle:{normal:{},emphasis:{}},lineStyle:{normal:{color:"#aaa",width:1,curveness:0,opacity:.5},emphasis:{}}}});t.exports=r},function(t,e,i){var n=i(38),a=i(84),o=i(70),r=i(7),s=i(3);i(2).extendChartView({type:"graph",init:function(t,e){var i=new n,r=new a,s=this.group,l=new o(e.getZr(),s);s.add(i.group),s.add(r.group),this._symbolDraw=i,this._lineDraw=r,this._controller=l,this._firstRender=!0},render:function(t,e,i){var n=t.coordinateSystem;if("geo"===n.type||"view"===n.type){var a=t.getData();this._model=t;var o=this._symbolDraw,l=this._lineDraw;o.updateData(a);var h=a.graph.edgeData,u=t.option,c=r.createDataFormatModel(t,h,u.edges||u.links);c.formatTooltip=function(t){var e=this.getDataParams(t),i=a.graph.getEdgeByIndex(t),n=a.getName(i.node1.dataIndex),o=a.getName(i.node2.dataIndex),r=n+" > "+o;return e.value&&(r+=" : "+e.value),r},l.updateData(h,null,null),h.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=c})});var d=this.group,f={position:n.position,scale:n.scale};this._firstRender?d.attr(f):s.updateProps(d,f,t),this._nodeScaleRatio=t.get("nodeScaleRatio"),this._updateNodeAndLinkScale(),this._updateController(t,n,i),clearTimeout(this._layoutTimeout);var p=t.forceLayout,g=t.get("force.layoutAnimation");p&&this._startForceLayoutIteration(p,g),a.eachItemGraphicEl(function(t,e){var i=a.getItemModel(e).get("draggable");i&&p?t.on("drag",function(){p.warmUp(),!this._layouting&&this._startForceLayoutIteration(p,g),p.setFixed(e),a.setItemLayout(e,t.position)},this).on("dragend",function(){p.setUnfixed(e)},this):t.off("drag"),t.setDraggable(i)},this),this._firstRender=!1}},_startForceLayoutIteration:function(t,e){var i=this;!function n(){t.step(function(t){i.updateLayout(),(i._layouting=!t)&&(e?i._layoutTimeout=setTimeout(n,16):n())})}()},_updateController:function(t,e,i){var n=this._controller;n.rect=e.getViewRect(),n.enable(t.get("roam")),n.off("pan").off("zoom").on("pan",function(e,n){i.dispatchAction({seriesId:t.id,type:"graphRoam",dx:e,dy:n})}).on("zoom",function(e,n,a){i.dispatchAction({seriesId:t.id,type:"graphRoam",zoom:e,originX:n,originY:a})}).on("zoom",this._updateNodeAndLinkScale,this)},_updateNodeAndLinkScale:function(){var t=this._model,e=t.getData(),i=this.group,n=this._nodeScaleRatio,a=i.scale[0],o=(a-1)*n+1,r=[o/a,o/a];e.eachItemGraphicEl(function(t,e){t.attr("scale",r)})},updateLayout:function(t,e){this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()}})},function(t,e){t.exports=function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.eachSeriesByType("graph",function(t){var i=t.getCategoriesData(),n=t.getGraph(),a=n.data,o=i.mapArray(i.getName);a.filterSelf(function(t){var i=a.getItemModel(t),n=i.getShallow("category");if(null!=n){"number"==typeof n&&(n=o[n]);for(var r=0;rs;s++){var m=t[s];m.fixed||(n.sub(o,l,m.p),n.scaleAndAdd(m.p,m.p,o,h*d))}for(var s=0;r>s;s++)for(var c=t[s],v=s+1;r>v;v++){var f=t[v];n.sub(o,f.p,c.p);var p=n.len(o);0===p&&(n.set(o,Math.random()-.5,Math.random()-.5),p=1);var y=(c.rep+f.rep)/p/p;!c.fixed&&a(c.pp,c.pp,o,y),!f.fixed&&a(f.pp,f.pp,o,-y)}for(var x=[],s=0;r>s;s++){var m=t[s];m.fixed||(n.sub(x,m.p,m.pp),n.scaleAndAdd(m.p,m.p,x,d),n.copy(m.pp,m.p))}d=.992*d,i&&i(t,e,.01>d)}}}},function(t,e,i){var n=i(253),a=i(4),o=i(208),r=i(207),s=i(5);t.exports=function(t,e){t.eachSeriesByType("graph",function(t){if("force"===t.get("layout")){var e=t.preservedPoints||{},i=t.getGraph(),l=i.data,h=i.edgeData,u=t.getModel("force"),c=u.get("initLayout");t.preservedPoints?l.each(function(t){var i=l.getId(t);l.setItemLayout(t,e[i]||[NaN,NaN])}):c&&"none"!==c?"circular"===c&&r(t):o(t);var d=l.getDataExtent("value"),f=u.get("repulsion"),p=u.get("edgeLength"),g=l.mapArray("value",function(t,e){var i=l.getItemLayout(e),n=a.linearMap(t,d,[0,f])||f/2;return{w:n,rep:n,p:!i||isNaN(i[0])||isNaN(i[1])?null:i}}),m=h.mapArray("value",function(t,e){var n=i.getEdgeByIndex(e);return{n1:g[n.node1.dataIndex],n2:g[n.node2.dataIndex],d:p,curveness:n.getModel().get("lineStyle.normal.curveness")||0}}),v=t.coordinateSystem,y=v.getBoundingRect(),x=n(g,m,{rect:y,gravity:u.get("gravity")}),_=x.step;x.step=function(t){for(var n=0,a=g.length;a>n;n++)g[n].fixed&&s.copy(g[n].p,i.getNodeByIndex(n).getLayout());_(function(n,a,o){for(var r=0,s=n.length;s>r;r++)n[r].fixed||i.getNodeByIndex(r).setLayout(n[r].p),e[l.getId(r)]=n[r].p;for(var r=0,s=a.length;s>r;r++){var h=a[r],u=h.n1.p,c=h.n2.p,d=[u,c];h.curveness>0&&d.push([(u[0]+c[0])/2-(u[1]-c[1])*h.curveness,(u[1]+c[1])/2-(c[0]-u[0])*h.curveness]),i.getEdgeByIndex(r).setLayout(d)}t&&t(o)})},t.forceLayout=x,t.preservedPoints=e,x.step()}else t.forceLayout=null})}},function(t,e,i){var n=i(2),a=i(206),o={type:"graphRoam",event:"graphRoam",update:"none"};n.registerAction(o,function(t,e){e.eachComponent({mainType:"series",query:t},function(e){var i=e.coordinateSystem,n=e.getModel("roamDetail"),o=a.calcPanAndZoom(n,t);e.setRoamPan&&e.setRoamPan(o.x,o.y),e.setRoamZoom&&e.setRoamZoom(o.zoom),i&&i.setPan(o.x,o.y),i&&i.setZoom(o.zoom)})})},function(t,e,i){var n=i(208);t.exports=function(t,e){t.eachSeriesByType("graph",function(t){var e=t.get("layout");e&&"none"!==e||n(t)})}},function(t,e,i){i(259),i(260)},function(t,e,i){function n(){var t=o.createCanvas();this.canvas=t,this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={}}var a=256,o=i(1);n.prototype={update:function(t,e,i,n,o,r){var s=this._getBrush(),l=this._getGradient(t,o,"inRange"),h=this._getGradient(t,o,"outOfRange"),u=this.pointSize+this.blurSize,c=this.canvas,d=c.getContext("2d"),f=t.length;c.width=e,c.height=i;for(var p=0;f>p;++p){var g=t[p],m=g[0],v=g[1],y=g[2],x=n(y);d.globalAlpha=x,d.drawImage(s,m-u,v-u)}for(var _=d.getImageData(0,0,c.width,c.height),w=_.data,b=0,M=w.length,S=this.minOpacity,A=this.maxOpacity,I=A-S;M>b;){var x=w[b+3]/256,T=4*Math.floor(x*(a-1));if(x>0){var C=r(x)?l:h;x>0&&(x=x*I+S),w[b++]=C[T],w[b++]=C[T+1],w[b++]=C[T+2],w[b++]=C[T+3]*x*256}else b+=4}return d.putImageData(_,0,0),c},_getBrush:function(){var t=this._brushCanvas||(this._brushCanvas=o.createCanvas()),e=this.pointSize+this.blurSize,i=2*e;t.width=i,t.height=i;var n=t.getContext("2d");return n.clearRect(0,0,i,i),n.shadowOffsetX=i,n.shadowBlur=this.blurSize,n.shadowColor="#000",n.beginPath(),n.arc(-e,e,this.pointSize,0,2*Math.PI,!0),n.closePath(),n.fill(),t},_getGradient:function(t,e,i){for(var n=this._gradientPixels,a=n[i]||(n[i]=new Uint8ClampedArray(1024)),o=[],r=0,s=0;256>s;s++)e[i](s/255,!0,o),a[r++]=o[0],a[r++]=o[1],a[r++]=o[2],a[r++]=o[3];return a}},t.exports=n},function(t,e,i){var n=i(13),a=i(36);t.exports=n.extend({type:"series.heatmap",getInitialData:function(t,e){return a(t.data,this,e)},defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,xAxisIndex:0,yAxisIndex:0,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0}})},function(t,e,i){function n(t,e,i){var n=t[1]-t[0];e=l.map(e,function(e){return{interval:[(e.interval[0]-t[0])/n,(e.interval[1]-t[0])/n]}});var a=e.length,o=0;return function(t){for(var n=o;a>n;n++){var r=e[n].interval;if(r[0]<=t&&t<=r[1]){o=n;break}}if(n===a)for(var n=o-1;n>=0;n--){var r=e[n].interval;if(r[0]<=t&&t<=r[1]){o=n;break}}return n>=0&&a>n&&i[n]}}function a(t,e){var i=t[1]-t[0];return e=[(e[0]-t[0])/i,(e[1]-t[0])/i],function(t){return t>=e[0]&&t<=e[1]}}function o(t){var e=t.dimensions;return"lng"===e[0]&&"lat"===e[1]}var r=i(3),s=i(258),l=i(1);t.exports=i(2).extendChartView({type:"heatmap",render:function(t,e,i){var n;if(e.eachComponent("visualMap",function(e){e.eachTargetSeries(function(i){i===t&&(n=e)})}),!n)throw new Error("Heatmap must use with visualMap");this.group.removeAll();var a=t.coordinateSystem;"cartesian2d"===a.type?this._renderOnCartesian(a,t,i):o(a)&&this._renderOnGeo(a,t,n,i)},_renderOnCartesian:function(t,e,i){var n=t.getAxis("x"),a=t.getAxis("y"),o=this.group;if("category"!==n.type||"category"!==a.type)throw new Error("Heatmap on cartesian must have two category axes");if(!n.onBand||!a.onBand)throw new Error("Heatmap on cartesian must have two axes with boundaryGap true");var s=n.getBandWidth(),l=a.getBandWidth(),h=e.getData();h.each(["x","y","z"],function(i,n,a,u){var c=h.getItemModel(u),d=t.dataToPoint([i,n]);if(!isNaN(a)){var f=new r.Rect({shape:{x:d[0]-s/2,y:d[1]-l/2,width:s,height:l},style:{fill:h.getItemVisual(u,"color")}}),p=c.getModel("itemStyle.normal").getItemStyle(["color"]),g=c.getModel("itemStyle.emphasis").getItemStyle(),m=c.getModel("label.normal"),v=c.getModel("label.emphasis"),y=e.getRawValue(u),x="-";y&&null!=y[2]&&(x=y[2]),m.get("show")&&(r.setText(p,m),p.text=e.getFormattedLabel(u,"normal")||x),v.get("show")&&(r.setText(g,v),g.text=e.getFormattedLabel(u,"emphasis")||x),f.setStyle(p),r.setHoverStyle(f,g),o.add(f),h.setItemGraphicEl(u,f)}})},_renderOnGeo:function(t,e,i,o){var l=i.targetVisuals.inRange,h=i.targetVisuals.outOfRange,u=e.getData(),c=this._hmLayer||this._hmLayer||new s;c.blurSize=e.get("blurSize"),c.pointSize=e.get("pointSize"),c.minOpacity=e.get("minOpacity"),c.maxOpacity=e.get("maxOpacity");var d=t.getViewRect().clone(),f=t.getRoamTransform();d.applyTransform(f);var p=Math.max(d.x,0),g=Math.max(d.y,0),m=Math.min(d.width+d.x,o.getWidth()),v=Math.min(d.height+d.y,o.getHeight()),y=m-p,x=v-g,_=u.mapArray(["lng","lat","value"],function(e,i,n){var a=t.dataToPoint([e,i]);return a[0]-=p,a[1]-=g,a.push(n),a}),w=i.getExtent(),b="visualMap.continuous"===i.type?a(w,i.option.range):n(w,i.getPieceList(),i.option.selected);c.update(_,y,x,l.color.getNormalizer(),{inRange:l.color.getColorMapper(),outOfRange:h.color.getColorMapper()},b);var M=new r.Image({style:{width:y,height:x,x:p,y:g,image:c.canvas},silent:!0});this.group.add(M)}})},function(t,e,i){function n(t,e,i,n){r.Group.call(this);var a=new s(t,e,i,n);this.add(a),this._updateEffectSymbol(t,n)}function a(t,e){t.__p1=e[0],t.__p2=e[1],t.__cp1=e[2]||[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]}function o(){var t=this.__p1,e=this.__p2,i=this.__cp1,n=this.__t,a=this.position,o=u.quadraticAt,r=u.quadraticDerivativeAt;a[0]=o(t[0],i[0],e[0],n),a[1]=o(t[1],i[1],e[1],n);var s=r(t[0],i[0],e[0],n),l=r(t[1],i[1],e[1],n);this.rotation=-Math.atan2(l,s)-Math.PI/2,this.ignore=!1}var r=i(3),s=i(83),l=i(1),h=i(24),u=i(18),c=n.prototype;c._updateEffectSymbol=function(t,e){var i=t.getItemModel(e),n=i.getModel("effect"),r=n.get("symbolSize"),s=n.get("symbol");l.isArray(r)||(r=[r,r]);var u=n.get("color")||t.getItemVisual(e,"color"),c=this.childAt(1),d=1e3*n.get("period");this._symbolType===s&&d===this._period||(c=h.createSymbol(s,-.5,-.5,1,1,u),c.ignore=!0,c.z2=100,this._symbolType=s,this._period=d,this.add(c),c.__t=0,c.animate("",!0).when(d,{__t:1}).delay(e/t.count()*d/2).during(l.bind(o,c)).start()),c.setStyle("shadowColor",u),c.setStyle(n.getItemStyle(["color"])),c.attr("scale",r);var f=t.getItemLayout(e);a(c,f),c.setColor(u),c.attr("scale",r)},c.updateData=function(t,e,i,n){this.childAt(0).updateData(t,e,i,n),this._updateEffectSymbol(t,n)},c.updateLayout=function(t,e,i,n){this.childAt(0).updateLayout(t,e,i,n);var o=this.childAt(1),r=t.getItemLayout(n);a(o,r)},l.inherits(n,r.Group),t.exports=n},function(t,e,i){function n(t){return o.isArray(t)||(t=[+t,+t]),t}function a(t,e){u.call(this);var i=new h(t,e),n=new u;this.add(i),this.add(n),n.beforeUpdate=function(){this.attr(i.getScale())},this.updateData(t,e)}var o=i(1),r=i(24),s=i(3),l=i(4),h=i(47),u=s.Group,c=3,d=a.prototype;d.stopEffectAnimation=function(){this.childAt(1).removeAll()},d.startEffectAnimation=function(t,e,i,n,a,o){for(var s=this._symbolType,l=this._color,h=this.childAt(1),u=0;c>u;u++){var d=r.createSymbol(s,-.5,-.5,1,1,l);d.attr({style:{stroke:"stroke"===e?l:null,fill:"fill"===e?l:null,strokeNoScale:!0},z2:99,silent:!0,scale:[1,1],z:a,zlevel:o});var f=-u/c*t+n;d.animate("",!0).when(t,{scale:[i,i]}).delay(f).start(),d.animateStyle(!0).when(t,{opacity:0}).delay(f).start(),h.add(d)}},d.highlight=function(){this.trigger("emphasis")},d.downplay=function(){this.trigger("normal")},d.updateData=function(t,e){function i(){w.trigger("emphasis"),"render"!==p&&this.startEffectAnimation(v,m,g,y,x,_)}function a(){w.trigger("normal"),"render"!==p&&this.stopEffectAnimation()}var o=t.hostModel;this.childAt(0).updateData(t,e);var r=this.childAt(1),s=t.getItemModel(e),h=t.getItemVisual(e,"symbol"),u=n(t.getItemVisual(e,"symbolSize")),c=t.getItemVisual(e,"color");r.attr("scale",u),r.traverse(function(t){t.attr({fill:c})});var d=s.getShallow("symbolOffset");if(d){var f=r.position;f[0]=l.parsePercent(d[0],u[0]),f[1]=l.parsePercent(d[1],u[1])}this._symbolType=h,this._color=c;var p=o.get("showEffectOn"),g=s.get("rippleEffect.scale"),m=s.get("rippleEffect.brushType"),v=1e3*s.get("rippleEffect.period"),y=e/t.count(),x=s.getShallow("z")||0,_=s.getShallow("zlevel")||0;this.stopEffectAnimation(),"render"===p&&this.startEffectAnimation(v,m,g,y,x,_);var w=this.childAt(0);this.on("mouseover",i,this).on("mouseout",a,this).on("emphasis",i,this).on("normal",a,this)},d.fadeOut=function(t){t&&t()},o.inherits(a,u),t.exports=a},function(t,e,i){function n(t,e,i,n){l.Group.call(this),this.bodyIndex,this.whiskerIndex,this.styleUpdater=i,this._createContent(t,e,n),this.updateData(t,e,n),this._seriesModel}function a(t,e,i){return s.map(t,function(t){return t=t.slice(),t[e]=i.initBaseline,t})}function o(t){var e={};return s.each(t,function(t,i){e["ends"+i]=t}),e}function r(t){this.group=new l.Group,this.styleUpdater=t}var s=i(1),l=i(3),h=i(6),u=h.extend({type:"whiskerInBox",shape:{},buildPath:function(t,e){for(var i in e)if(0===i.indexOf("ends")){var n=e[i];t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1])}}}),c=n.prototype;c._createContent=function(t,e,i){var n=t.getItemLayout(e),r="horizontal"===n.chartLayout?1:0,h=0;this.add(new l.Polygon({shape:{points:i?a(n.bodyEnds,r,n):n.bodyEnds},style:{strokeNoScale:!0},z2:100})),this.bodyIndex=h++;var c=s.map(n.whiskerEnds,function(t){return i?a(t,r,n):t});this.add(new u({shape:o(c),style:{strokeNoScale:!0},z2:100})),this.whiskerIndex=h++},c.updateData=function(t,e,i){var n=this._seriesModel=t.hostModel,a=t.getItemLayout(e),r=l[i?"initProps":"updateProps"];r(this.childAt(this.bodyIndex),{shape:{points:a.bodyEnds}},n),r(this.childAt(this.whiskerIndex),{shape:o(a.whiskerEnds)},n),this.styleUpdater.call(null,this,t,e)},s.inherits(n,l.Group);var d=r.prototype;d.updateData=function(t){var e=this.group,i=this._data,a=this.styleUpdater;t.diff(i).add(function(i){if(t.hasValue(i)){var o=new n(t,i,a,!0);t.setItemGraphicEl(i,o),e.add(o)}}).update(function(o,r){var s=i.getItemGraphicEl(r);return t.hasValue(o)?(s?s.updateData(t,o):s=new n(t,o,a),e.add(s),void t.setItemGraphicEl(o,s)):void e.remove(s)}).remove(function(t){var n=i.getItemGraphicEl(t);n&&e.remove(n)}).execute(),this._data=t},d.remove=function(){var t=this.group,e=this._data;this._data=null,e&&e.eachItemGraphicEl(function(e){e&&t.remove(e)})},t.exports=r},function(t,e,i){i(265),i(266);var n=i(1),a=i(2);a.registerLayout(i(267)),a.registerVisualCoding("chart",n.curry(i(74),"lines","lineStyle"))},function(t,e,i){"use strict";var n=i(13),a=i(14),o=i(1),r=i(28);t.exports=n.extend({type:"series.lines",dependencies:["grid","polar"],getInitialData:function(t,e){function i(t,e,i,n){return t.coord&&t.coord[n]}var n=[],s=[],l=[];o.each(t.data,function(t){n.push(t[0]),s.push(t[1]),l.push(o.extend(o.extend({},o.isArray(t[0])?null:t[0]),o.isArray(t[1])?null:t[1]))});var h=r.get(t.coordinateSystem);if(!h)throw new Error("Invalid coordinate system");var u=h.dimensions,c=new a(u,this),d=new a(u,this),f=new a(["value"],this);return c.initData(n,null,i),d.initData(s,null,i),f.initData(l),this.fromData=c,this.toData=d,f},formatTooltip:function(t){var e=this.fromData.getName(t),i=this.toData.getName(t);return e+" > "+i},defaultOption:{coordinateSystem:"geo",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,geoIndex:0,effect:{show:!1,period:4,symbol:"circle",symbolSize:3,trailLength:.2},large:!1,largeThreshold:2e3,label:{normal:{show:!1,position:"end"}},lineStyle:{normal:{opacity:.5}}}})},function(t,e,i){var n=i(84),a=i(261),o=i(83);i(2).extendChartView({type:"lines",init:function(){},render:function(t,e,i){var r=t.getData(),s=this._lineDraw,l=t.get("effect.show");l!==this._hasEffet&&(s&&s.remove(),s=this._lineDraw=new n(l?a:o),this._hasEffet=l);var h=t.get("zlevel"),u=t.get("effect.trailLength"),c=i.getZr();c.painter.getLayer(h).clear(!0),null!=this._lastZlevel&&c.configLayer(this._lastZlevel,{motionBlur:!1}),l&&u&&c.configLayer(h,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(u/10+.9,1),0)}),this.group.add(s.group),s.updateData(r),this._lastZlevel=h},updateLayout:function(t,e,i){this._lineDraw.updateLayout();var n=i.getZr();n.painter.getLayer(this._lastZlevel).clear(!0)},remove:function(t,e){this._lineDraw&&this._lineDraw.remove(e,!0)}})},function(t,e){t.exports=function(t){t.eachSeriesByType("lines",function(t){var e=t.coordinateSystem,i=t.fromData,n=t.toData,a=t.getData(),o=e.dimensions;i.each(o,function(t,n,a){i.setItemLayout(a,e.dataToPoint([t,n]))}),n.each(o,function(t,i,a){n.setItemLayout(a,e.dataToPoint([t,i]))}),a.each(function(t){var e,o=i.getItemLayout(t),r=n.getItemLayout(t),s=a.getItemModel(t).get("lineStyle.normal.curveness");s>0&&(e=[(o[0]+r[0])/2-(o[1]-r[1])*s,(o[1]+r[1])/2-(r[0]-o[0])*s]),a.setItemLayout(t,[o,r,e])})})}},function(t,e,i){var n=i(2);i(269),i(270),i(205),i(221),n.registerLayout(i(273)),n.registerVisualCoding("chart",i(274)),n.registerProcessor("statistic",i(272)),n.registerPreprocessor(i(271)),i(68)("map",[{type:"mapToggleSelect",event:"mapselectchanged",method:"toggleSelected"},{type:"mapSelect",event:"mapselected",method:"select"},{type:"mapUnSelect",event:"mapunselected",method:"unSelect"}])},function(t,e,i){function n(t,e){for(var i={},n=e.features,a=0;a"+n+" : "+i},defaultOption:{zlevel:0,z:2,coordinateSystem:"geo",map:"china",left:"center",top:"center",showLegendSymbol:!0,dataRangeHoverLink:!0,roamDetail:{x:0,y:0,zoom:1},scaleLimit:null,label:{normal:{show:!1,textStyle:{color:"#000"}},emphasis:{show:!1,textStyle:{color:"#000"}}},itemStyle:{normal:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{areaColor:"rgba(255,215, 0, 0.8)"}}}});s.mixin(f,d),t.exports=f},function(t,e,i){var n=i(3),a=i(210);i(2).extendChartView({type:"map",render:function(t,e,i,n){if(!n||"mapToggleSelect"!==n.type||n.from!==this.uid){var o=this.group;if(o.removeAll(),n&&"geoRoam"===n.type&&"series"===n.component&&n.name===t.name){var r=this._mapDraw;r&&o.add(r.group)}else if(t.needsDrawMap){var r=this._mapDraw||new a(i,!0);o.add(r.group),r.draw(t,e,i,this),this._mapDraw=r}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get("showLegendSymbol")&&e.getComponent("legend")&&this._renderSymbols(t,e,i)}},remove:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},_renderSymbols:function(t,e,i){var a=t.getData(),o=this.group;a.each("value",function(t,e){if(!isNaN(t)){var i=a.getItemLayout(e);if(i&&i.point){var r=i.point,s=i.offset,l=new n.Circle({style:{fill:a.getVisual("color")},shape:{cx:r[0]+9*s,cy:r[1],r:3},silent:!0,z2:10});if(!s){var h=a.getName(e),u=a.getItemModel(e),c=u.getModel("label.normal"),d=u.getModel("label.emphasis"),f=c.getModel("textStyle"),p=d.getModel("textStyle"),g=a.getItemGraphicEl(e);l.setStyle({textPosition:"bottom"});var m=function(){l.setStyle({text:d.get("show")?h:"",textFill:p.getTextColor(),textFont:p.getFont()})},v=function(){l.setStyle({text:c.get("show")?h:"",textFill:f.getTextColor(),textFont:f.getFont()})};g.on("mouseover",m).on("mouseout",v).on("emphasis",m).on("normal",v),v()}o.add(l)}}})}})},function(t,e,i){function n(t){var e={};return a.each(o,function(i){null!=t[i]&&(e[i]=t[i])}),e}var a=i(1),o=["x","y","x2","y2","width","height","map","roam","roamDetail","label","itemStyle"],r={};t.exports=function(t){var e=[];a.each(t.series,function(t){"map"===t.type&&e.push(t),a.extend(r,t.geoCoord)});var i={};a.each(e,function(e){if(e.map=e.map||e.mapType,a.defaults(e,e.mapLocation),e.markPoint){var o=e.markPoint;if(o.data=a.map(o.data,function(t){if(!a.isArray(t.value)){var e;t.geoCoord?e=t.geoCoord:t.name&&(e=r[t.name]);var i=e?[e[0],e[1]]:[NaN,NaN];null!=t.value&&i.push(t.value),t.value=i}return t}),!e.data||!e.data.length){t.geo||(t.geo=[]);var s=i[e.map];s||(s=i[e.map]=n(e),t.geo.push(s));var l=e.markPoint;l.type=t.effect&&t.effect.show?"effectScatter":"scatter",l.coordinateSystem="geo",l.geoIndex=a.indexOf(t.geo,s),l.name=e.name,t.series.splice(a.indexOf(t.series,e),1,l)}}})}},function(t,e,i){function n(t,e){for(var i={},n=["value"],a=0;au;u++)s=Math.min(s,i[o][u]),l=Math.max(l,i[o][u]),r+=i[o][u];var c;return c="min"===e?s:"max"===e?l:"average"===e?r/h:r,0===h?NaN:c})}var a=i(1);t.exports=function(t){var e={};t.eachSeriesByType("map",function(t){var i=t.get("map");e[i]=e[i]||[],e[i].push(t)}),a.each(e,function(t,e){var i=n(a.map(t,function(t){return t.getData()}),t[0].get("mapValueCalculation"));t[0].seriesGroup=[],t[0].setData(i);for(var o=0;o=0?e:NaN}})}var a=i(14),o=i(1),r=i(13);t.exports=r.extend({type:"series.parallel",dependencies:["parallel"],getInitialData:function(t,e){var i=e.getComponent("parallel",this.get("parallelIndex")),r=i.dimensions,s=i.parallelAxisIndex,l=t.data,h=o.map(r,function(t,i){var a=e.getComponent("parallelAxis",s[i]);return"category"===a.get("type")?(n(a,t,l),{name:t,type:"ordinal"}):t}),u=new a(h,this);return u.initData(l),u},getRawIndicesByActiveState:function(t){var e=this.coordinateSystem,i=this.getData(),n=[];return e.eachActiveState(i,function(e,a){t===e&&n.push(i.getRawIndex(a))}),n},defaultOption:{zlevel:0,z:2,coordinateSystem:"parallel",parallelIndex:0,label:{normal:{show:!1},emphasis:{show:!1}},inactiveOpacity:.05,activeOpacity:1,lineStyle:{normal:{width:2,opacity:.45,type:"solid"}},animationEasing:"linear"}})},function(t,e,i){function n(t,e,i){var n=t.model,a=t.getRect(),o=new s.Rect({shape:{x:a.x,y:a.y,width:a.width,height:a.height}}),r="horizontal"===n.get("layout")?"width":"height";return o.setShape(r,0),s.initProps(o,{shape:{width:a.width,height:a.height}},e,i),o}function a(t,e,i,n){for(var a=0,o=e.length-1;o>a;a++){var s=e[a],l=e[a+1],h=t[a],u=t[a+1];n(r(h,i.getAxis(s).type)||r(u,i.getAxis(l).type)?null:[i.dataToPoint(h,s),i.dataToPoint(u,l)],a)}}function o(t){return new s.Polyline({shape:{points:t},silent:!0})}function r(t,e){return"category"===e?null==t:null==t||isNaN(t)}var s=i(3),l=i(1),h=i(25).extend({type:"parallel",init:function(){this._dataGroup=new s.Group,this.group.add(this._dataGroup),this._data},render:function(t,e,i,r){function h(t){var e=f.getValues(m,t),i=new s.Group;d.add(i),a(e,m,g,function(t,e){t&&i.add(o(t))}),f.setItemGraphicEl(t,i)}function u(e,i){var n=f.getValues(m,e),r=p.getItemGraphicEl(i),l=[],h=0;a(n,m,g,function(e,i){var n=r.childAt(h++);e&&!n?l.push(o(e)):e&&s.updateProps(n,{shape:{points:e}},t)});for(var u=r.childCount()-1;u>=h;u--)r.remove(r.childAt(u));for(var u=0,c=l.length;c>u;u++)r.add(l[u]);f.setItemGraphicEl(e,r)}function c(t){var e=p.getItemGraphicEl(t);d.remove(e)}var d=this._dataGroup,f=t.getData(),p=this._data,g=t.coordinateSystem,m=g.dimensions;f.diff(p).add(h).update(u).remove(c).execute(),f.eachItemGraphicEl(function(t,e){var i=f.getItemModel(e),n=i.getModel("lineStyle.normal");t.eachChild(function(t){t.setStyle(l.extend(n.getLineStyle(),{stroke:f.getItemVisual(e,"color"),opacity:f.getItemVisual(e,"opacity")}))})}),this._data||d.setClipPath(n(g,t,function(){d.removeClipPath()})),this._data=f},remove:function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null}});t.exports=h},function(t,e){t.exports=function(t,e){t.eachSeriesByType("parallel",function(e){var i=e.getModel("itemStyle.normal"),n=t.get("color"),a=i.get("color")||n[e.seriesIndex%n.length],o=e.get("inactiveOpacity"),r=e.get("activeOpacity"),s=e.getModel("lineStyle.normal").getLineStyle(),l=e.coordinateSystem,h=e.getData(),u={normal:s.opacity,active:r,inactive:o};l.eachActiveState(h,function(t,e){h.setItemVisual(e,"opacity",u[t])}),h.setVisual("color",a)})}},function(t,e,i){var n=i(1),a=i(2);i(305),i(280),i(281),a.registerVisualCoding("chart",n.curry(i(63),"radar")),a.registerVisualCoding("chart",n.curry(i(44),"radar","circle",null)),a.registerLayout(i(283)),a.registerProcessor("filter",n.curry(i(62),"radar")),a.registerPreprocessor(i(282))},function(t,e,i){"use strict";var n=i(13),a=i(14),o=i(31),r=i(1),s=i(9),l=n.extend({type:"series.radar",dependencies:["radar"],init:function(t){l.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._dataBeforeProcessed}},getInitialData:function(t,e){var i=t.data||[],n=o([],i,[],"indicator_"),r=new a(n,this);return r.initData(i),r},formatTooltip:function(t){var e=this.getRawValue(t),i=this.coordinateSystem,n=i.getIndicatorAxes();return this._data.getName(t)+"
            "+r.map(n,function(t,i){return t.name+" : "+e[i]}).join("
            ")},getFormattedLabel:function(t,e,i,n){e=e||"normal";var a=this.getData(),o=a.getItemModel(t),r=this.getDataParams(t);return null==i&&(i=o.get(["label",e,"formatter"])),r.value=r.value[n||0],"function"==typeof i?(r.status=e,i(r)):"string"==typeof i?s.formatTpl(i,r):void 0},defaultOption:{zlevel:0,z:2,coordinateSystem:"radar",legendHoverLink:!0,radarIndex:0,lineStyle:{normal:{width:2,type:"solid"}},label:{normal:{position:"top"}},symbol:"emptyCircle",symbolSize:4}});t.exports=l},function(t,e,i){function n(t){return o.isArray(t)||(t=[+t,+t]),t}var a=i(3),o=i(1),r=i(24);t.exports=i(2).extendChartView({type:"radar",render:function(t,e,i){function s(t,e){var i=t.getItemVisual(e,"symbol")||"circle",a=t.getItemVisual(e,"color");if("none"!==i){var o=r.createSymbol(i,-.5,-.5,1,1,a);return o.attr({style:{strokeNoScale:!0},z2:100,scale:n(t.getItemVisual(e,"symbolSize"))}),o}}function l(e,i,n,o,r,l){n.removeAll();for(var h=0;hh;h++){var c=n[h];c.setLayout({x:o},!0),c.setLayout({dx:e},!0);for(var d=0,f=c.outEdges.length;f>d;d++)a.push(c.outEdges[d].node2)}n=a,++o}s(t,o),r=(i-e)/(o-1),l(t,r)}function s(t,e){I.each(t,function(t){t.outEdges.length||t.setLayout({x:e-1},!0)})}function l(t,e){I.each(t,function(t){var i=t.getLayout().x*e;t.setLayout({x:i},!0)})}function h(t,e,i,n,a){var o=A().key(function(t){return t.getLayout().x}).sortKeys(b).entries(t).map(function(t){return t.values});u(t,o,e,i,n),c(o,n,i);for(var r=1;a>0;a--)r*=.99,d(o,r),c(o,n,i),p(o,r),c(o,n,i)}function u(t,e,i,n,a){var o=[];I.each(e,function(t){var e=t.length,i=0;I.each(t,function(t){i+=t.getLayout().value});var r=(n-(e-1)*a)/i;o.push(r)}),o.sort(function(t,e){return t-e});var r=o[0];I.each(e,function(t){I.each(t,function(t,e){t.setLayout({y:e},!0);var i=t.getLayout().value*r;t.setLayout({dy:i},!0)})}),I.each(i,function(t){var e=+t.getValue()*r;t.setLayout({dy:e},!0)})}function c(t,e,i){I.each(t,function(t){var n,a,o,r=0,s=t.length;for(t.sort(w),o=0;s>o;o++){if(n=t[o],a=r-n.getLayout().y,a>0){var l=n.getLayout().y+a;n.setLayout({y:l},!0)}r=n.getLayout().y+n.getLayout().dy+e}if(a=r-e-i,a>0){var l=n.getLayout().y-a;for(n.setLayout({y:l},!0),r=n.getLayout().y,o=s-2;o>=0;--o)n=t[o],a=n.getLayout().y+n.getLayout().dy+e-r,a>0&&(l=n.getLayout().y-a,n.setLayout({y:l},!0)),r=n.getLayout().y}})}function d(t,e){I.each(t.slice().reverse(),function(t){I.each(t,function(t){if(t.outEdges.length){var i=x(t.outEdges,f)/x(t.outEdges,M),n=t.getLayout().y+(i-_(t))*e;t.setLayout({y:n},!0)}})})}function f(t){return _(t.node2)*t.getValue()}function p(t,e){I.each(t,function(t){I.each(t,function(t){if(t.inEdges.length){var i=x(t.inEdges,g)/x(t.inEdges,M),n=t.getLayout().y+(i-_(t))*e;t.setLayout({y:n},!0)}})})}function g(t){return _(t.node1)*t.getValue()}function m(t){I.each(t,function(t){t.outEdges.sort(v),t.inEdges.sort(y)}),I.each(t,function(t){var e=0,i=0;I.each(t.outEdges,function(t){t.setLayout({sy:e},!0),e+=t.getLayout().dy}),I.each(t.inEdges,function(t){t.setLayout({ty:i},!0),i+=t.getLayout().dy})})}function v(t,e){return t.node2.getLayout().y-e.node2.getLayout().y}function y(t,e){return t.node1.getLayout().y-e.node1.getLayout().y}function x(t,e){var i,n=0,a=t.length,o=-1;if(1===arguments.length)for(;++ot?-1:t>e?1:t==e?0:NaN}function M(t){return t.getValue()}var S=i(11),A=i(346),I=i(1);t.exports=function(t,e){t.eachSeriesByType("sankey",function(t){var i=t.get("nodeWidth"),r=t.get("nodeGap"),s=n(t,e);t.layoutInfo=s;var l=s.width,h=s.height,u=t.getGraph(),c=u.nodes,d=u.edges;o(c);var f=c.filter(function(t){return 0===t.getLayout().value}),p=0!==f.length?0:t.get("layoutIterations");a(c,d,i,r,l,h,p)})}},function(t,e,i){var n=i(73);t.exports=function(t,e){t.eachSeriesByType("sankey",function(t){var e=t.getGraph(),i=e.nodes;i.sort(function(t,e){return t.getLayout().value-e.getLayout().value});var a=i[0].getLayout().value,o=i[i.length-1].getLayout().value;i.forEach(function(e){var i=new n({type:"color",mappingMethod:"linear",dataExtent:[a,o],visual:t.get("color")}),r=i.mapValueToVisual(e.getLayout().value);e.setVisual("color",r)})})}},function(t,e,i){var n=i(2);i(291),i(292),i(293),n.registerVisualCoding("chart",i(295)),n.registerLayout(i(294))},function(t,e,i){function n(t,e){this.group=new o.Group,t.add(this.group),this._onSelect=e||s.noop}function a(t,e,i,n,a,o){var r=[[a?t:t-u,e],[t+i,e],[t+i,e+n],[a?t:t-u,e+n]];return!o&&r.splice(2,0,[t+i+u,e+n/2]),!a&&r.push([t,e+n/2]),r}var o=i(3),r=i(11),s=i(1),l=8,h=8,u=5;n.prototype={constructor:n,render:function(t,e,i){var n=t.getModel("breadcrumb"),a=this.group;if(a.removeAll(),n.get("show")&&i){var o=n.getModel("itemStyle.normal"),s=o.getModel("textStyle"),l={pos:{left:n.get("left"),right:n.get("right"),top:n.get("top"),bottom:n.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:n.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(n,i,l,s),this._renderContent(n,i,l,o,s),r.positionGroup(a,l.pos,l.box)}},_prepare:function(t,e,i,n){for(var a=e;a;a=a.parentNode){var o=a.getModel().get("name"),r=n.getTextRect(o),s=Math.max(r.width+2*l,i.emptyItemWidth);i.totalWidth+=s+h,i.renderList.push({node:a,text:o,width:s})}},_renderContent:function(t,e,i,n,l){for(var u=0,c=i.emptyItemWidth,d=t.get("height"),f=r.getAvailableSize(i.pos,i.box),p=i.totalWidth,g=i.renderList,m=g.length-1;m>=0;m--){var v=g[m],y=v.width,x=v.text;p>f.width&&(p-=y-c,y=c,x=""),this.group.add(new o.Polygon({shape:{points:a(u,0,y,d,m===g.length-1,0===m)},style:s.defaults(n.getItemStyle(),{lineJoin:"bevel",text:x,textFill:l.getTextColor(),textFont:l.getFont()}),z:10,onclick:s.bind(this._onSelect,this,v.node)})),u+=y+h}},remove:function(){this.group.removeAll()}},t.exports=n},function(t,e,i){function n(t,e){var i=0;s.each(t.children,function(t){n(t,e);var a=t.value;s.isArray(a)&&(a=a[0]),i+=a});var a=t.value;e>=0&&(s.isArray(a)?a=a[0]:t.value=new Array(e)),(null==a||isNaN(a))&&(a=i),0>a&&(a=0),e>=0?t.value[0]=a:t.value=a}function a(t,e){var i=e.get("color");if(i){t=t||[];var n;if(s.each(t,function(t){var e=new l(t),i=e.get("color");(e.get("itemStyle.normal.color")||i&&"none"!==i)&&(n=!0)}),!n){var a=t[0]||(t[0]={});a.color=i.slice()}return t}}var o=i(13),r=i(344),s=i(1),l=i(12),h=i(9),u=(i(95),h.encodeHTML),c=h.addCommas;t.exports=o.extend({type:"series.treemap",dependencies:["grid","polar"],_viewRoot:null,defaultOption:{left:"center",top:"middle",right:null,bottom:null,width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,visualDimension:0,zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{normal:{color:"rgba(0,0,0,0.7)",borderColor:"rgba(255,255,255,0.7)",borderWidth:1,shadowColor:"rgba(150,150,150,1)",shadowBlur:3,shadowOffsetX:0,shadowOffsetY:0,textStyle:{color:"#fff"}},emphasis:{textStyle:{}}}},label:{normal:{show:!0,position:["50%","50%"],textStyle:{align:"center",baseline:"middle",color:"#fff",ellipsis:!0}}},itemStyle:{normal:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{}},color:"none",colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},getInitialData:function(t,e){var i=t.data||[],o=t.name;null==o&&(o=t.name);var l={name:o,children:t.data},h=(i[0]||{}).value;n(l,s.isArray(h)?h.length:-1);var u=t.levels||[];return u=t.levels=a(u,e),r.createTree(l,this,u).data},optionUpdated:function(){this.resetViewRoot()},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=c(s.isArray(i)?i[0]:i),a=e.getName(t);return u(a)+": "+n},getDataParams:function(t){for(var e=o.prototype.getDataParams.apply(this,arguments),i=this.getData(),n=i.tree.getNodeByDataIndex(t),a=e.treePathInfo=[];n;){var r=n.dataIndex;a.push({name:n.name,dataIndex:r,value:this.getRawValue(r)}),n=n.parentNode}return a.reverse(),e},setLayoutInfo:function(t){this.layoutInfo=this.layoutInfo||{},s.extend(this.layoutInfo,t)},mapIdToIndex:function(t){var e=this._idIndexMap;e||(e=this._idIndexMap={},this._idIndexMapCount=0);var i=e[t];return null==i&&(e[t]=i=this._idIndexMapCount++),i},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)}})},function(t,e,i){function n(){return{nodeGroup:[],background:[],content:[]}}var a=i(1),o=i(3),r=i(52),s=i(95),l=i(290),h=i(70),u=i(8),c=i(19),d=i(345),f=a.bind,p=o.Group,g=o.Rect,m=a.each,v=3;t.exports=i(2).extendChartView({type:"treemap",init:function(t,e){this._containerGroup,this._storage=n(),this._oldTree,this._breadcrumb,this._controller,this._state="ready",this._mayClick},render:function(t,e,i,n){var o=e.findComponents({mainType:"series",subType:"treemap",query:n});if(!(a.indexOf(o,t)<0)){this.seriesModel=t,this.api=i,this.ecModel=e;var r=s.retrieveTargetInfo(n,t),l=n&&n.type,h=t.layoutInfo,u=!this._oldTree,c=this._storage,d="treemapRootToNode"===l&&r&&c?{rootNodeGroup:c.nodeGroup[r.node.getRawIndex()],direction:n.direction}:null,f=this._giveContainerGroup(h),p=this._doRender(f,t,d);u||l&&"treemapZoomToNode"!==l&&"treemapRootToNode"!==l?p.renderFinally():this._doAnimation(f,p,t,d),this._resetController(i),this._renderBreadcrumb(t,i,r)}},_giveContainerGroup:function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new p,this._initEvents(e),this.group.add(e)),e.position=[t.x,t.y],e},_doRender:function(t,e,i){function o(t,e,i,n,s){function l(t){return t.getId()}function h(a,r){var l=null!=a?t[a]:null,h=null!=r?e[r]:null;if(!(!l||isNaN(s)||sL?z="":R.width>C&&(z=P.get("ellipsis")?P.ellipsis(z,C):""),o.setHoverStyle(T,k),T.dataIndex=l.dataIndex,T.seriesIndex=this.seriesModel.seriesIndex,T.culling=!0,T.setShape({x:I,y:I,width:C,height:L}),m(T,{fill:l.getVisual("color",!0),text:z,textPosition:D.get("position"),textFill:P.getTextColor(),textAlign:P.get("align"),textVerticalAlign:P.get("baseline"),textFont:P.getFont()}),M.add(T)}}return M}},_doAnimation:function(t,e,i,n){if(i.get("animation")){var o=i.get("animationDurationUpdate"),r=i.get("animationEasing"),s=d.createWrap();m(e.willDeleteEls,function(t,e){m(t,function(t,e){var i;if(!t.invisible&&(i=t.__tmWillDelete)){var a,l=t.parent;if(n&&"drilldown"===n.direction)l===n.rootNodeGroup?(a={shape:{x:0,y:0,width:l.__tmNodeWidth,height:l.__tmNodeHeight}},t.z=2):(a={style:{opacity:0}},t.z=1);else{var h=0,u=0;l.__tmWillDelete||(h=l.__tmNodeWidth/2,u=l.__tmNodeHeight/2),a="nodeGroup"===i?{position:[h,u],style:{opacity:0}}:{shape:{x:h,y:u,width:0,height:0},style:{opacity:0}}}a&&s.add(t,a,o,r)}})}),m(this._storage,function(t,i){m(t,function(t,n){var l=e.lastsForAnimation[i][n],h={};l&&("nodeGroup"===i?l.old&&(h.position=t.position.slice(),t.position=l.old):(l.old&&(h.shape=a.extend({},t.shape),t.setShape(l.old)),l.fadein?(t.setStyle("opacity",0),h.style={opacity:1}):1!==t.style.opacity&&(h.style={opacity:1})),s.add(t,h,o,r))})},this),this._state="animating",s.done(f(function(){this._state="ready",e.renderFinally()},this)).start()}},_resetController:function(t){var e=this._controller;e||(e=this._controller=new h(t.getZr()),e.enable(this.seriesModel.get("roam")),e.on("pan",f(this._onPan,this)),e.on("zoom",f(this._onZoom,this))),e.rect=new u(0,0,t.getWidth(),t.getHeight())},_clearController:function(){var t=this._controller;t&&(t.off("pan").off("zoom"),t=null)},_onPan:function(t,e){if(this._mayClick=!1,"animating"!==this._state&&(Math.abs(t)>v||Math.abs(e)>v)){var i=this.seriesModel.getViewRoot();if(!i)return;var n=i.getLayout();if(!n)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t,y:n.y+e,width:n.width,height:n.height}})}},_onZoom:function(t,e,i){if(this._mayClick=!1,"animating"!==this._state){var n=this.seriesModel.getViewRoot();if(!n)return;var a=n.getLayout();if(!a)return;var o=new u(a.x,a.y,a.width,a.height),r=this.seriesModel.layoutInfo;e-=r.x,i-=r.y;var s=c.create();c.translate(s,s,[-e,-i]),c.scale(s,s,[t,t]),c.translate(s,s,[e,i]),o.applyTransform(s),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},_initEvents:function(t){function e(t){var e=this.seriesModel.get("nodeClick",!0);if(e){var i=this.findTarget(t.offsetX,t.offsetY);if(i){var n=i.node;if(n.getLayout().isLeafRoot)this._rootToNode(i);else if("zoomToNode"===e)this._zoomToNode(i);else if("link"===e){var a=n.hostTree.data.getItemModel(n.dataIndex),o=a.get("link",!0),r=a.get("target",!0)||"blank";o&&window.open(o,r)}}}}t.on("mousedown",function(t){"ready"===this._state&&(this._mayClick=!0)},this),t.on("mouseup",function(t){this._mayClick&&(this._mayClick=!1,"ready"===this._state&&e.call(this,t))},this)},_renderBreadcrumb:function(t,e,i){function n(e){"animating"!==this._state&&(s.aboveViewRoot(t.getViewRoot(),e)?this._rootToNode({node:e}):this._zoomToNode({node:e}))}i||(i=this.findTarget(e.getWidth()/2,e.getHeight()/2),i||(i={node:t.getData().tree.root})),(this._breadcrumb||(this._breadcrumb=new l(this.group,f(n,this)))).render(t,e,i.node)},remove:function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage=n(),this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},dispose:function(){this._clearController()},_zoomToNode:function(t){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},_rootToNode:function(t){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},findTarget:function(t,e){var i,n=this.seriesModel.getViewRoot();return n.eachNode({attr:"viewChildren",order:"preorder"},function(n){var a=this._storage.background[n.getRawIndex()];if(a){var o=a.transformCoordToLocal(t,e),r=a.shape;if(!(r.x<=o[0]&&o[0]<=r.x+r.width&&r.y<=o[1]&&o[1]<=r.y+r.height))return!1;i={node:n,offsetX:o[0],offsetY:o[1]}}},this),i}})},function(t,e,i){for(var n=i(2),a=i(95),o=function(){},r=["treemapZoomToNode","treemapRender","treemapMove"],s=0;sS;){var I=x[S];M.push(I),M.area+=I.getLayout().area;var T=h(M,w,e.squareRatio);b>=T?(S++,b=T):(M.area-=M.pop().getLayout().area,u(M,w,_,f,!1),w=g(_.width,_.height),M.length=M.area=0,b=1/0)}if(M.length&&u(M,w,_,f,!0),!i){var C=v.get("childrenVisibleMin");null!=C&&C>y&&(i=!0)}for(var S=0,A=x.length;A>S;S++)a(x[S],e,i,n+1)}}}function o(t,e,i,n,a,o){var h=t.children||[],u=n.sort;"asc"!==u&&"desc"!==u&&(u=null);var c=null!=n.leafDepth&&n.leafDepth<=o;if(a&&!c)return t.viewChildren=[];h=m.filter(h,function(t){return!t.isRemoved()}),s(h,u);var d=l(e,h,u);if(0===d.sum)return t.viewChildren=[];if(d.sum=r(e,i,d.sum,u,h),0===d.sum)return t.viewChildren=[];for(var f=0,p=h.length;p>f;f++){var g=h[f].getValue()/d.sum*i;h[f].setLayout({area:g})}return c&&(h.length&&t.setLayout({isLeafRoot:!0},!0),h.length=0),t.viewChildren=h,t.setLayout({dataExtent:d.dataExtent},!0),h}function r(t,e,i,n,a){if(!n)return i;for(var o=t.get("visibleMin"),r=a.length,s=r,l=r-1;l>=0;l--){var h=a["asc"===n?r-l-1:l].getValue();o>h/i*e&&(s=l,i-=h)}return"asc"===n?a.splice(0,r-s):a.splice(s,r-s),i}function s(t,e){return e&&t.sort(function(t,i){return"asc"===e?t.getValue()-i.getValue():i.getValue()-t.getValue()}),t}function l(t,e,i){for(var n=0,a=0,o=e.length;o>a;a++)n+=e[a].getValue();var r,s=t.get("visualDimension");if(e&&e.length)if("value"===s&&i)r=[e[e.length-1].getValue(),e[0].getValue()],"asc"===i&&r.reverse();else{var r=[1/0,-(1/0)];m.each(e,function(t){var e=t.getValue(s);er[1]&&(r[1]=e)})}else r=[NaN,NaN];return{sum:n,dataExtent:r}}function h(t,e,i){for(var n,a=0,o=1/0,r=0,s=t.length;s>r;r++)n=t[r].getLayout().area,n&&(o>n&&(o=n),n>a&&(a=n));var l=t.area*t.area,h=e*e*i;return l?p(h*a/l,l/(h*o)):1/0}function u(t,e,i,n,a){var o=e===i.width?0:1,r=1-o,s=["x","y"],l=["width","height"],h=i[s[o]],u=e?t.area/e:0;(a||u>i[l[r]])&&(u=i[l[r]]);for(var c=0,d=t.length;d>c;c++){var f=t[c],m={},v=u?f.getLayout().area/u:0,y=m[l[r]]=p(u-2*n,0),x=i[s[o]]+i[l[o]]-h,_=c===d-1||v>x?x:v,w=m[l[o]]=p(_-2*n,0);m[s[r]]=i[s[r]]+g(n,y/2),m[s[o]]=h+g(n,w/2),h+=_,f.setLayout(m,!0)}i[s[r]]+=u,i[l[r]]-=u}function c(t,e,i,n,a){var o=(e||{}).node,r=[n,a];if(!o||o===i)return r;for(var s,l=n*a,h=l*t.option.zoomToNodeRatio;s=o.parentNode;){for(var u=0,c=s.children,d=0,f=c.length;f>d;d++)u+=c[d].getValue();var p=o.getValue();if(0===p)return r;h*=u/p;var g=s.getModel("itemStyle.normal").get("borderWidth");isFinite(g)&&(h+=4*g*g+4*g*Math.pow(h,.5)),h>v.MAX_SAFE_INTEGER&&(h=v.MAX_SAFE_INTEGER),o=s}l>h&&(h=l);var m=Math.pow(h/l,.5);return[n*m,a*m]}function d(t,e,i){if(e)return{x:e.x,y:e.y};var n={x:0,y:0};if(!i)return n;var a=i.node,o=a.getLayout();if(!o)return n;for(var r=[o.width/2,o.height/2],s=a;s;){var l=s.getLayout();r[0]+=l.x,r[1]+=l.y,s=s.parentNode}return{x:t.width/2-r[0],y:t.height/2-r[1]}}function f(t,e,i){var n=t.getLayout();t.setLayout({invisible:n?!e.intersect(n):!x.aboveViewRootByViewPath(i,t)},!0);for(var a=t.viewChildren||[],o=0,r=a.length;r>o;o++){var s=new b(e.x-n.x,e.y-n.y,e.width,e.height);f(a[o],s,i)}}var p=Math.max,g=Math.min,m=i(1),v=i(4),y=i(11),x=i(95),_=v.parsePercent,w=m.retrieve,b=i(8),x=i(95);t.exports=n},function(t,e,i){function n(t,e,i,s,h,c){var d=t.getModel(),p=t.getLayout();if(!p.invisible){var m,v=t.getModel(g),y=i[t.depth],x=a(v,e,y,s),_=v.get("borderColor"),w=v.get("borderColorSaturation");null!=w&&(m=o(x,t),_=r(w,m)),t.setVisual("borderColor",_);var b=t.viewChildren;if(b&&b.length){var M=l(t,d,p,v,x,b);f.each(b,function(t,e){if(t.depth>=h.length||t===h[t.depth]){var a=u(d,x,t,e,M,c);n(t,a,i,s,h,c)}})}else m=o(x,t),t.setVisual("color",m)}}function a(t,e,i,n){var a=f.extend({},e);return f.each(["color","colorAlpha","colorSaturation"],function(o){var r=t.get(o,!0);null==r&&i&&(r=i[o]),null==r&&(r=e[o]),null==r&&(r=n.get(o)),null!=r&&(a[o]=r)}),a}function o(t){var e=s(t,"color");if(e){var i=s(t,"colorAlpha"),n=s(t,"colorSaturation");return n&&(e=d.modifyHSL(e,null,null,n)),i&&(e=d.modifyAlpha(e,i)),e}}function r(t,e){return null!=e?d.modifyHSL(e,null,null,t):null}function s(t,e){var i=t[e];return null!=i&&"none"!==i?i:void 0}function l(t,e,i,n,a,o){if(o&&o.length){var r=h(e,"color")||null!=a.color&&"none"!==a.color&&(h(e,"colorAlpha")||h(e,"colorSaturation"));if(r){var s=e.get("colorMappingBy"),l={type:r.name,dataExtent:i.dataExtent,visual:r.range};"color"!==l.type||"index"!==s&&"id"!==s?l.mappingMethod="linear":(l.mappingMethod="category",l.loop=!0);var u=new c(l);return u.__drColorMappingBy=s,u}}}function h(t,e){var i=t.get(e);return p(i)&&i.length?{name:e,range:i}:null}function u(t,e,i,n,a,o){var r=f.extend({},e);if(a){var s=a.type,l="color"===s&&a.__drColorMappingBy,h="index"===l?n:"id"===l?o.mapIdToIndex(i.getId()):i.getValue(t.get("visualDimension"));r[s]=a.mapValueToVisual(h)}return r}var c=i(73),d=i(22),f=i(1),p=f.isArray,g="itemStyle.normal";t.exports=function(t,e){var i={mainType:"series",subType:"treemap",query:e};t.eachComponent(i,function(t){var e=t.getData().tree,i=e.root,a=t.getModel(g);if(!i.isRemoved()){var o=f.map(e.levelModels,function(t){return t?t.get(g):null});n(i,{},o,a,t.getViewRoot().getAncestors(),t)}})}},function(t,e,i){"use strict";i(200),i(297)},function(t,e,i){"use strict";function n(t,e,i,n){var a=t.coordToPoint([e,n]),o=t.coordToPoint([i,n]);return{x1:a[0],y1:a[1],x2:o[0],y2:o[1]}}var a=i(1),o=i(3),r=i(12),s=["axisLine","axisLabel","axisTick","splitLine","splitArea"];i(2).extendComponentView({type:"angleAxis",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=e.getComponent("polar",t.get("polarIndex")),n=t.axis,o=i.coordinateSystem,r=o.getRadiusAxis().getExtent(),l=n.getTicksCoords();"category"!==n.type&&l.pop(),a.each(s,function(e){t.get(e+".show")&&this["_"+e](t,o,l,r)},this)}},_axisLine:function(t,e,i,n){var a=t.getModel("axisLine.lineStyle"),r=new o.Circle({shape:{cx:e.cx,cy:e.cy,r:n[1]},style:a.getLineStyle(),z2:1,silent:!0});r.style.fill=null,this.group.add(r)},_axisTick:function(t,e,i,r){var s=t.getModel("axisTick"),l=(s.get("inside")?-1:1)*s.get("length"),h=a.map(i,function(t){return new o.Line({shape:n(e,r[1],r[1]+l,t)})});this.group.add(o.mergePath(h,{style:s.getModel("lineStyle").getLineStyle()}))},_axisLabel:function(t,e,i,n){for(var a=t.axis,s=t.get("data"),l=t.getModel("axisLabel"),h=l.getModel("textStyle"),u=t.getFormattedLabels(),c=l.get("margin"),d=a.getLabelsCoords(),f=0;fm?"left":"right",x=Math.abs(g[1]-v)/p<.3?"middle":g[1]>v?"top":"bottom",_=h;s&&s[f]&&s[f].textStyle&&(_=new r(s[f].textStyle,h)),this.group.add(new o.Text({style:{x:g[0],y:g[1],fill:_.getTextColor(),text:u[f],textAlign:y,textVerticalAlign:x,textFont:_.getFont()},silent:!0}))}},_splitLine:function(t,e,i,r){var s=t.getModel("splitLine"),l=s.getModel("lineStyle"),h=l.get("color"),u=0;h=h instanceof Array?h:[h];for(var c=[],d=0;d0)},c),f=new o(t,d);a.each(s,f.add,f);var p=f.getGroup();this.group.add(p),this._buildSelectController(p,h,t,i)}},_buildSelectController:function(t,e,i,n){var o=i.axis,s=this._selectController;s||(s=this._selectController=new r("line",n.getZr(),e),s.on("selected",a.bind(this._onSelected,this))),s.enable(t);var l=a.map(i.activeIntervals,function(t){return[o.dataToCoord(t[0],!0),o.dataToCoord(t[1],!0)]});s.update(l)},_onSelected:function(t){var e=this.axisModel,i=e.axis,n=a.map(t,function(t){return[i.coordToData(t[0],!0),i.coordToData(t[1],!0)]});this.api.dispatchAction({type:"axisAreaSelect",parallelAxisId:e.id,intervals:n})},remove:function(){this._selectController&&this._selectController.disable()},dispose:function(){this._selectController&&(this._selectController.dispose(), +this._selectController=null)}});t.exports=l},function(t,e,i){"use strict";function n(t,e,i){return{position:[t.cx,t.cy],rotation:i/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotation:e.getModel("axisLabel").get("rotate"),z2:1}}var a=i(1),o=i(3),r=i(48),s=["axisLine","axisLabel","axisTick","axisName"],l=["splitLine","splitArea"];i(2).extendComponentView({type:"radiusAxis",render:function(t,e){if(this.group.removeAll(),t.get("show")){var i=e.getComponent("polar",t.get("polarIndex")),o=i.coordinateSystem.getAngleAxis(),h=t.axis,u=i.coordinateSystem,c=h.getTicksCoords(),d=o.getExtent()[0],f=h.getExtent(),p=n(u,t,d),g=new r(t,p);a.each(s,g.add,g),this.group.add(g.getGroup()),a.each(l,function(e){t.get(e+".show")&&this["_"+e](t,u,d,f,c)},this)}},_splitLine:function(t,e,i,n,r){var s=t.getModel("splitLine"),l=s.getModel("lineStyle"),h=l.get("color"),u=0;h=h instanceof Array?h:[h];for(var c=[],d=0;d=w;w++){for(var A=[],I=0;I=0||"+"===i?"left":"right"},s={horizontal:i>=0||"+"===i?"top":"bottom",vertical:"middle"},l={horizontal:0,vertical:b/2},h="vertical"===a?o.height:o.width,u=t.getModel("controlStyle"),c=u.get("show"),d=c?u.get("itemSize"):0,f=c?u.get("itemGap"):0,p=d+f,g=t.get("label.normal.rotate")||0;g=g*b/180;var m,v,y,x,_=u.get("position",!0),c=u.get("show",!0),w=c&&u.get("showPlayBtn",!0),M=c&&u.get("showPrevBtn",!0),S=c&&u.get("showNextBtn",!0),A=0,I=h;return"left"===_||"bottom"===_?(w&&(m=[0,0],A+=p),M&&(v=[A,0],A+=p),S&&(y=[I-d,0],I-=p)):(w&&(m=[I-d,0],I-=p),M&&(v=[0,0],A+=p),S&&(y=[I-d,0],I-=p)),x=[A,I],t.get("inverse")&&x.reverse(),{viewRect:o,mainLength:h,orient:a,rotation:l[a],labelRotation:g,labelPosOpt:i,labelAlign:r[a],labelBaseline:s[a],playPosition:m,prevBtnPosition:v,nextBtnPosition:y,axisExtent:x,controlSize:d,controlGap:f}},_position:function(t,e){function i(t){var e=t.position;t.origin=[c[0][0]-e[0],c[1][0]-e[1]]}function n(t){return[[t.x,t.x+t.width],[t.y,t.y+t.height]]}function a(t,e,i,n,a){t[n]+=i[n][a]-e[n][a]}var o=this._mainGroup,r=this._labelGroup,s=t.viewRect;if("vertical"===t.orient){var l=g.create(),h=s.x,u=s.y+s.height;g.translate(l,l,[-h,-u]),g.rotate(l,l,-b/2),g.translate(l,l,[h,u]),s=s.clone(),s.applyTransform(l)}var c=n(s),d=n(o.getBoundingRect()),f=n(r.getBoundingRect()),p=o.position,m=r.position;m[0]=p[0]=c[0][0];var v=t.labelPosOpt;if(isNaN(v)){var y="+"===v?0:1;a(p,d,c,1,y),a(m,f,c,1,1-y)}else{var y=v>=0?0:1;a(p,d,c,1,y),m[1]=p[1]+v}o.position=p,r.position=m,o.rotation=r.rotation=t.rotation,i(o),i(r)},_createAxis:function(t,e){var i=e.getData(),n=e.get("axisType"),a=f.createScaleByModel(e,n),o=i.getDataExtent("value");a.setExtent(o[0],o[1]),this._customizeScale(a,i),a.niceTicks();var r=new c("value",a,t.axisExtent,n);return r.model=e,r},_customizeScale:function(t,e){t.getTicks=function(){return e.mapArray(["value"],function(t){return t})},t.getTicksLabels=function(){return s.map(this.getTicks(),t.getLabel,t)}},_createGroup:function(t){var e=this["_"+t]=new l.Group;return this.group.add(e),e},_renderAxisLine:function(t,e,i,n){var a=i.getExtent();n.get("lineStyle.show")&&e.add(new l.Line({shape:{x1:a[0],y1:0,x2:a[1],y2:0},style:s.extend({lineCap:"round"},n.getModel("lineStyle").getLineStyle()),silent:!0,z2:1}))},_renderAxisTick:function(t,e,i,n){var a=n.getData(),r=i.scale.getTicks(),s=this._prepareTooltipHostModel(a,n);w(r,function(t,n){var r=i.dataToCoord(t),h=a.getItemModel(n),u=h.getModel("itemStyle.normal"),c=h.getModel("itemStyle.emphasis"),d={position:[r,0],onclick:_(this._changeTimeline,this,n)},f=o(h,u,e,d);l.setHoverStyle(f,c.getItemStyle()),h.get("tooltip")?(f.dataIndex=n,f.dataModel=s):f.dataIndex=f.dataModel=null},this)},_prepareTooltipHostModel:function(t,e){var i=v.createDataFormatModel({},t,e.get("data")),n=this;return i.formatTooltip=function(t){return x(n._axis.scale.getLabel(t))},i},_renderAxisLabel:function(t,e,i,n){var a=n.getModel("label.normal");if(a.get("show")){var o=n.getData(),r=i.scale.getTicks(),s=f.getFormattedLabels(i,a.get("formatter")),h=i.getLabelInterval();w(r,function(n,a){if(!i.isLabelIgnored(a,h)){var r=o.getItemModel(a),u=r.getModel("label.normal.textStyle"),c=r.getModel("label.emphasis.textStyle"),d=i.dataToCoord(n),f=new l.Text({style:{text:s[a],textAlign:t.labelAlign,textVerticalAlign:t.labelBaseline,textFont:u.getFont(),fill:u.getTextColor()},position:[d,0],rotation:t.labelRotation-t.rotation,onclick:_(this._changeTimeline,this,a),silent:!1});e.add(f),l.setHoverStyle(f,c.getItemStyle())}},this)}},_renderControl:function(t,e,i,n){function o(t,i,o,d){if(t){var f={position:t,origin:[r/2,0],rotation:d?-s:0,rectHover:!0,style:h,onclick:o},p=a(n,i,c,f);e.add(p),l.setHoverStyle(p,u)}}var r=t.controlSize,s=t.rotation,h=n.getModel("controlStyle.normal").getItemStyle(),u=n.getModel("controlStyle.emphasis").getItemStyle(),c=[0,-r/2,r,r],d=n.getPlayState(),f=n.get("inverse",!0);o(t.nextBtnPosition,"controlStyle.nextIcon",_(this._changeTimeline,this,f?"-":"+")),o(t.prevBtnPosition,"controlStyle.prevIcon",_(this._changeTimeline,this,f?"+":"-")),o(t.playPosition,"controlStyle."+(d?"stopIcon":"playIcon"),_(this._handlePlayClick,this,!d),!0)},_renderCurrentPointer:function(t,e,i,n){var a=n.getData(),s=n.getCurrentIndex(),l=a.getItemModel(s).getModel("checkpointStyle"),h=this,u={onCreate:function(t){t.draggable=!0,t.drift=_(h._handlePointerDrag,h),t.ondragend=_(h._handlePointerDragend,h),r(t,s,i,n,!0)},onUpdate:function(t){r(t,s,i,n)}};this._currentPointer=o(l,l,this._mainGroup,{},this._currentPointer,u)},_handlePlayClick:function(t){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:t,from:this.uid})},_handlePointerDrag:function(t,e,i){this._clearTimer(),this._pointerChangeTimeline([i.offsetX,i.offsetY])},_handlePointerDragend:function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},_pointerChangeTimeline:function(t,e){var i=this._toAxisCoord(t)[0],n=this._axis,a=m.asc(n.getExtent().slice());i>a[1]&&(i=a[1]),is&&(n=s,e=o)}),e},_clearTimer:function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},_changeTimeline:function(t){var e=this.model.getCurrentIndex();"+"===t?t=e+1:"-"===t&&(t=e-1),this.api.dispatchAction({type:"timelineChange",currentIndex:t,from:this.uid})}})},function(t,e,i){var n=i(1),a=i(43),o=i(23),r=function(t,e,i,n){a.call(this,t,e,i),this.type=n||"value",this._autoLabelInterval,this.model=null};r.prototype={constructor:r,getLabelInterval:function(){var t=this.model,e=t.getModel("label.normal"),i=e.get("interval");if(null!=i&&"auto"!=i)return i;var i=this._autoLabelInterval;return i||(i=this._autoLabelInterval=o.getAxisLabelInterval(n.map(this.scale.getTicks(),this.dataToCoord,this),o.getFormattedLabels(this,e.get("formatter")),e.getModel("textStyle").getFont(),"horizontal"===t.get("orient"))),i},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}}},n.inherits(r,a),t.exports=r},function(t,e,i){var n=i(10),a=i(14),o=i(1),r=i(7),s=n.extend({type:"timeline",layoutMode:"box",defaultOption:{zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{normal:{},emphasis:{}},label:{normal:{textStyle:{color:"#000"}},emphasis:{}},data:[]},init:function(t,e,i){this._data,this._names,this.mergeDefaultAndTheme(t,i),this._initData()},mergeOption:function(t){s.superApply(this,"mergeOption",arguments),this._initData()},setCurrentIndex:function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(t>=e&&(t=e-1),0>t&&(t=0)),this.option.currentIndex=t},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(t){this.option.autoPlay=!!t},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var t=this.option,e=t.data||[],i=t.axisType,n=this._names=[];if("category"===i){var s=[];o.each(e,function(t,e){var i,a=r.getDataItemValue(t);o.isObject(t)?(i=o.clone(t),i.value=e):i=e,s.push(i),o.isString(a)||null!=a&&!isNaN(a)||(a=""),n.push(a+"")}),e=s}var l={category:"ordinal",time:"time"}[i]||"number",h=this._data=new a([{name:"value",type:l}],this);h.initData(e,n)},getData:function(){return this._data},getCategories:function(){return"category"===this.get("axisType")?this._names.slice():void 0}});t.exports=s},function(t,e,i){var n=i(54);t.exports=n.extend({type:"timeline"})},function(t,e,i){function n(t){var e=t.type,i={number:"value",time:"time"};if(i[e]&&(t.axisType=i[e],delete t.type),a(t),o(t,"controlPosition")){var n=t.controlStyle||(t.controlStyle={});o(n,"position")||(n.position=t.controlPosition),"none"!==n.position||o(n,"show")||(n.show=!1,delete n.position),delete t.controlPosition}r.each(t.data||[],function(t){r.isObject(t)&&!r.isArray(t)&&(!o(t,"value")&&o(t,"name")&&(t.value=t.name),a(t))})}function a(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.emphasis={}),n=t.label||t.label||{},a=n.normal||(n.normal={}),s={normal:1,emphasis:1};r.each(n,function(t,e){s[e]||o(a,e)||(a[e]=t)}),i.label&&!o(n,"emphasis")&&(n.emphasis=i.label,delete i.label)}function o(t,e){return t.hasOwnProperty(e)}var r=i(1);t.exports=function(t){var e=t&&t.timeline;r.isArray(e)||(e=e?[e]:[]),r.each(e,function(t){t&&n(t)})}},function(t,e,i){var n=i(2);n.registerAction({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},function(t,e){var i=e.getComponent("timeline");i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.setPlayState(!1)),e.resetOption("timeline")}),n.registerAction({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},function(t,e){var i=e.getComponent("timeline");i&&null!=t.playState&&i.setPlayState(t.playState)})},function(t,e,i){i(10).registerSubTypeDefaulter("timeline",function(){return"slider"})},function(t,e,i){i(322),i(323)},function(t,e,i){var n=i(212),a=i(1),o=i(4),r=[20,140],s=n.extend({type:"visualMap.continuous",defaultOption:{handlePosition:"auto",calculable:!1,range:[-(1/0),1/0],hoverLink:!0,realtime:!0,itemWidth:null,itemHeight:null},doMergeOption:function(t,e){s.superApply(this,"doMergeOption",arguments),this.resetTargetSeries(t,e),this.resetExtent(),this.resetVisual(function(t){t.mappingMethod="linear"}),this._resetRange()},resetItemSize:function(){n.prototype.resetItemSize.apply(this,arguments);var t=this.itemSize;"horizontal"===this._orient&&t.reverse(),(null==t[0]||isNaN(t[0]))&&(t[0]=r[0]),(null==t[1]||isNaN(t[1]))&&(t[1]=r[1])},_resetRange:function(){var t=this.getExtent(),e=this.option.range;e[0]>e[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1])},completeVisualOption:function(){n.prototype.completeVisualOption.apply(this,arguments),a.each(this.stateList,function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=0)},this)},setSelected:function(t){this.option.range=t.slice(),this._resetRange()},getSelected:function(){var t=this.getExtent(),e=o.asc((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=i[1]||t<=e[1])?"inRange":"outOfRange"}});t.exports=s},function(t,e,i){function n(t,e,i){return new r.Polygon({shape:{points:t},draggable:!!e,cursor:i,drift:e})}function a(t,e){return 0===t?[[0,0],[e,0],[e,-e]]:[[0,0],[e,0],[e,e]]}var o=i(213),r=i(3),s=i(1),l=i(4),h=i(71),u=l.linearMap,c=i(76),d=i(214),f=s.each,p=o.extend({type:"visualMap.continuous",init:function(){o.prototype.init.apply(this,arguments),this._shapes={},this._dataInterval=[],this._handleEnds=[],this._orient,this._useHandle},doRender:function(t,e,i,n){n&&"selectDataRange"===n.type&&n.from===this.uid?this._updateView():this._buildView()},_buildView:function(){this.group.removeAll();var t=this.visualMapModel,e=this.group;this._orient=t.get("orient"),this._useHandle=t.get("calculable"),this._resetInterval(),this._renderBar(e);var i=t.get("text");this._renderEndsText(e,i,0),this._renderEndsText(e,i,1),this._updateView(!0),this.renderBackground(e),this._updateView(),this.positionGroup(e)},_renderEndsText:function(t,e,i){if(e){var n=e[1-i];n=null!=n?n+"":"";var a=this.visualMapModel,o=a.get("textGap"),s=a.itemSize,l=this._shapes.barGroup,h=this._applyTransform([s[0]/2,0===i?-o:s[1]+o],l),u=this._applyTransform(0===i?"bottom":"top",l),c=this._orient,d=this.visualMapModel.textStyleModel;this.group.add(new r.Text({style:{x:h[0],y:h[1],textVerticalAlign:"horizontal"===c?"middle":u,textAlign:"horizontal"===c?u:"center",text:n,textFont:d.getFont(),fill:d.getTextColor()}}))}},_renderBar:function(t){var e=this.visualMapModel,i=this._shapes,a=e.itemSize,o=this._orient,r=this._useHandle,l=d.getItemAlign(e,this.api,a),h=i.barGroup=this._createBarGroup(l);h.add(i.outOfRange=n()),h.add(i.inRange=n(null,s.bind(this._modifyHandle,this,"all"),r?"move":null));var u=e.textStyleModel.getTextRect("国"),c=Math.max(u.width,u.height);r&&(i.handleGroups=[],i.handleThumbs=[],i.handleLabels=[],i.handleLabelPoints=[],this._createHandle(h,0,a,c,o,l),this._createHandle(h,1,a,c,o,l)),t.add(h)},_createHandle:function(t,e,i,o,l){var h=new r.Group({position:[i[0],0]}),u=n(a(e,o),s.bind(this._modifyHandle,this,e),"move");h.add(u);var c={x:"horizontal"===l?o/2:1.5*o,y:"horizontal"===l?0===e?-(1.5*o):1.5*o:0===e?-o/2:o/2},d=this.visualMapModel.textStyleModel,f=new r.Text({silent:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textFont:d.getFont(),fill:d.getTextColor()}});this.group.add(f);var p=this._shapes;p.handleThumbs[e]=u,p.handleGroups[e]=h,p.handleLabelPoints[e]=c,p.handleLabels[e]=f,t.add(h)},_modifyHandle:function(t,e,i){if(this._useHandle){var n=this._applyTransform([e,i],this._shapes.barGroup,!0);this._updateInterval(t,n[1]),this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()})}},_resetInterval:function(){var t=this.visualMapModel,e=this._dataInterval=t.getSelected(),i=t.getExtent(),n=[0,t.itemSize[1]];this._handleEnds=[u(e[0],i,n,!0),u(e[1],i,n,!0)]},_updateInterval:function(t,e){e=e||0;var i=this.visualMapModel,n=this._handleEnds;h(e,n,[0,i.itemSize[1]],"all"===t?"rigid":"push",t);var a=i.getExtent(),o=[0,i.itemSize[1]];this._dataInterval=[u(n[0],o,a,!0),u(n[1],o,a,!0)]},_updateView:function(t){var e=this.visualMapModel,i=e.getExtent(),n=this._shapes,a=this._dataInterval,o=[0,e.itemSize[1]],r=t?o:this._handleEnds,s=this._createBarVisual(a,i,r,"inRange"),l=this._createBarVisual(i,i,o,"outOfRange");n.inRange.setStyle("fill",s.barColor).setShape("points",s.barPoints),n.outOfRange.setStyle("fill",l.barColor).setShape("points",l.barPoints),this._useHandle&&f([0,1],function(t){n.handleThumbs[t].setStyle("fill",s.handlesColor[t]),n.handleLabels[t].setStyle({text:e.formatValueText(a[t]),textAlign:this._applyTransform("horizontal"===this._orient?0===t?"bottom":"top":"left",n.barGroup)})},this),this._updateHandlePosition(r)},_createBarVisual:function(t,e,i,n){var a=this.getControllerVisual(t,n,"color").color,o=[this.getControllerVisual(t[0],n,"symbolSize").symbolSize,this.getControllerVisual(t[1],n,"symbolSize").symbolSize],r=this._createBarPoints(i,o);return{barColor:new c(0,0,1,1,a),barPoints:r,handlesColor:[a[0].color,a[a.length-1].color]}},_createBarPoints:function(t,e){var i=this.visualMapModel.itemSize;return[[i[0]-e[0],t[0]],[i[0],t[0]],[i[0],t[1]],[i[0]-e[1],t[1]]]},_createBarGroup:function(t){var e=this._orient,i=this.visualMapModel.get("inverse");return new r.Group("horizontal"!==e||i?"horizontal"===e&&i?{scale:"bottom"===t?[-1,1]:[1,1],rotation:-Math.PI/2}:"vertical"!==e||i?{scale:"left"===t?[1,1]:[-1,1]}:{scale:"left"===t?[1,-1]:[-1,-1]}:{scale:"bottom"===t?[1,1]:[-1,1],rotation:Math.PI/2})},_updateHandlePosition:function(t){if(this._useHandle){var e=this._shapes;f([0,1],function(i){var n=e.handleGroups[i];n.position[1]=t[i];var a=e.handleLabelPoints[i],o=r.applyTransform([a.x,a.y],r.getTransform(n,this.group));e.handleLabels[i].setStyle({x:o[0],y:o[1]})},this)}},_applyTransform:function(t,e,i){var n=r.getTransform(e,this.group);return r[s.isArray(t)?"applyTransform":"transformDirection"](t,n,i)}});t.exports=p},function(t,e,i){function n(t,e){var i=t.inverse;("vertical"===t.orient?!i:i)&&e.reverse()}var a=i(212),o=i(1),r=i(73),s=a.extend({type:"visualMap.piecewise",defaultOption:{selected:null,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieceList:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10},doMergeOption:function(t,e){s.superApply(this,"doMergeOption",arguments),this._pieceList=[],this.resetTargetSeries(t,e),this.resetExtent();var i=this._mode=this._decideMode();l[this._mode].call(this),this._resetSelected(t,e);var n=this.option.categories;this.resetVisual(function(t,e){"categories"===i?(t.mappingMethod="category",t.categories=o.clone(n)):(t.mappingMethod="piecewise",t.pieceList=o.map(this._pieceList,function(t){var t=o.clone(t);return"inRange"!==e&&(t.visual=null),t}))})},_resetSelected:function(t,e){var i=this.option,n=this._pieceList,a=(e?i:t).selected||{};if(i.selected=a,o.each(n,function(t,e){var i=this.getSelectedMapKey(t);i in a||(a[i]=!0)},this),"single"===i.selectedMode){var r=!1;o.each(n,function(t,e){var i=this.getSelectedMapKey(t);a[i]&&(r?a[i]=!1:r=!0)},this)}},getSelectedMapKey:function(t){return"categories"===this._mode?t.value+"":t.index+""},getPieceList:function(){return this._pieceList},_decideMode:function(){var t=this.option;return t.pieces&&t.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},setSelected:function(t){this.option.selected=o.clone(t)},getValueState:function(t){var e=this._pieceList,i=r.findPieceIndex(t,e);return null!=i&&this.option.selected[this.getSelectedMapKey(e[i])]?"inRange":"outOfRange"}}),l={splitNumber:function(){var t=this.option,e=t.precision,i=this.getExtent(),n=t.splitNumber;n=Math.max(parseInt(n,10),1),t.splitNumber=n;for(var a=(i[1]-i[0])/n;+a.toFixed(e)!==a&&5>e;)e++;t.precision=e,a=+a.toFixed(e);for(var o=0,r=i[0];n>o;o++,r+=a){var s=o===n-1?i[1]:r+a;this._pieceList.push({text:this.formatValueText([r,s]),index:o,interval:[r,s]})}},categories:function(){var t=this.option;o.each(t.categories,function(t){this._pieceList.push({text:this.formatValueText(t,!0),value:t})},this),n(t,this._pieceList)},pieces:function(){var t=this.option;o.each(t.pieces,function(t,e){o.isObject(t)||(t={value:t});var i,n={text:"",index:e};if(null!=t.label&&(n.text=t.label,i=!0),t.hasOwnProperty("value"))n.value=t.value,i||(n.text=this.formatValueText(n.value));else{var a=t.min,s=t.max;null==a&&(a=-(1/0)),null==s&&(s=1/0),a===s&&(n.value=a),n.interval=[a,s],i||(n.text=this.formatValueText([a,s]))}n.visual=r.retrieveVisuals(t),this._pieceList.push(n)},this),n(t,this._pieceList)}};t.exports=s},function(t,e,i){var n=i(213),a=i(1),o=i(3),r=i(24),s=i(11),l=i(214),h=n.extend({type:"visualMap.piecewise",doRender:function(){function t(t){var i=new o.Group;i.onclick=a.bind(this._onItemClick,this,t.piece),this._createItemSymbol(i,t.piece,[0,0,c[0],c[1]]),f&&i.add(new o.Text({style:{x:"right"===u?-n:c[0]+n,y:c[1]/2,text:t.piece.text,textVerticalAlign:"middle",textAlign:u,textFont:l,fill:h}})),e.add(i)}var e=this.group;e.removeAll();var i=this.visualMapModel,n=i.get("textGap"),r=i.textStyleModel,l=r.getFont(),h=r.getTextColor(),u=this._getItemAlign(),c=i.itemSize,d=this._getViewData(),f=!d.endsText,p=!f;p&&this._renderEndsText(e,d.endsText[0],c),a.each(d.pieceList,t,this),p&&this._renderEndsText(e,d.endsText[1],c),s.box(i.get("orient"),e,i.get("itemGap")),this.renderBackground(e),this.positionGroup(e)},_getItemAlign:function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return l.getItemAlign(t,this.api,t.itemSize);var i=e.align;return i&&"auto"!==i||(i="left"),i},_renderEndsText:function(t,e,i){if(e){var n=new o.Group,a=this.visualMapModel.textStyleModel;n.add(new o.Text({style:{x:i[0]/2,y:i[1]/2,textVerticalAlign:"middle",textAlign:"center",text:e,textFont:a.getFont(),fill:a.getTextColor()}})),t.add(n)}},_getViewData:function(){var t=this.visualMapModel,e=a.map(t.getPieceList(),function(t,e){return{piece:t,index:e}}),i=t.get("text"),n=t.get("orient"),o=t.get("inverse");return("horizontal"===n?o:!o)?e.reverse():i&&(i=i.slice().reverse()),{pieceList:e,endsText:i}},_createItemSymbol:function(t,e,i){var n;if(this.visualMapModel.isCategory())n=e.value;else if(null!=e.value)n=e.value;else{var a=e.interval||[];n=(a[0]+a[1])/2}var o=this.getControllerVisual(n);t.add(r.createSymbol(o.symbol,i[0],i[1],i[2],i[3],o.color))},_onItemClick:function(t){var e=this.visualMapModel,i=e.option,n=a.clone(i.selected),o=e.getSelectedMapKey(t);"single"===i.selectedMode?(n[o]=!0,a.each(n,function(t,e){n[e]=e===o})):n[o]=!n[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:n})}});t.exports=h},function(t,e,i){i(2).registerPreprocessor(i(215)),i(216),i(217),i(318),i(319),i(218)},function(t,e,i){i(2).registerPreprocessor(i(215)),i(216),i(217),i(320),i(321),i(218)},function(t,e,i){function n(t,e,i,n,a){s.call(this,t),this.map=e,this._nameCoordMap={},this.loadGeoJson(i,n,a)}var a=i(329),o=i(1),r=i(8),s=i(219),l=[i(327),i(328),i(326)];n.prototype={constructor:n,type:"geo",dimensions:["lng","lat"],loadGeoJson:function(t,e,i){try{this.regions=t?a(t):[]}catch(n){throw"Invalid geoJson format\n"+n}e=e||{},i=i||{};for(var r=this.regions,s={},h=0;h>1^-(1&r),s=s>>1^-(1&s),r+=n,s+=a,n=r,a=s,i.push([r/1024,s/1024])}return i}function o(t){for(var e=[],i=0;i=0;i--)l.asc(e[i])},getActiveState:function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t)return"inactive";for(var i=0,n=e.length;n>i;i++)if(e[i][0]<=t&&t<=e[i][1])return"active";return"inactive"}}),u={type:"value",dim:null,parallelIndex:null,areaSelectStyle:{width:20,borderWidth:1,borderColor:"rgba(160,197,232)",color:"rgba(160,197,232)",opacity:.3},z:10};o.merge(h.prototype,i(49)),s("parallel",h,n,u),t.exports=h},function(t,e,i){function n(t,e,i){this._axesMap={},this._axesLayout={},this.dimensions=t.dimensions,this._rect,this._model=t,this._init(t,e,i)}var a=i(11),o=i(23),r=i(1),s=i(332),l=i(19),h=i(5),u=r.each,c=Math.PI;n.prototype={type:"parallel",constructor:n,_init:function(t,e,i){var n=t.dimensions,a=t.parallelAxisIndex;u(n,function(t,i){var n=a[i],r=e.getComponent("parallelAxis",n),l=this._axesMap[t]=new s(t,o.createScaleByModel(r),[0,0],r.get("type"),n),h="category"===l.type;l.onBand=h&&r.get("boundaryGap"),l.inverse=r.get("inverse"),r.axis=l,l.model=r},this)},update:function(t,e){this._updateAxesFromSeries(this._model,t)},_updateAxesFromSeries:function(t,e){e.eachSeries(function(i){if(t.contains(i,e)){var n=i.getData();u(this.dimensions,function(t){var e=this._axesMap[t];e.scale.unionExtent(n.getDataExtent(t)),o.niceScaleExtent(e,e.model)},this)}},this)},resize:function(t,e){this._rect=a.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),this._layoutAxes(t)},getRect:function(){return this._rect},_layoutAxes:function(t){var e=this._rect,i=t.get("layout"),n=this._axesMap,a=this.dimensions,o=[e.width,e.height],r="horizontal"===i?0:1,s=o[r],h=o[1-r],d=[0,h];u(n,function(t){var e=t.inverse?1:0;t.setExtent(d[e],d[1-e])}),u(a,function(t,n){var o=s*n/(a.length-1),r={horizontal:{x:o,y:h},vertical:{x:0,y:o}},u={horizontal:c/2,vertical:0},d=[r[i].x+e.x,r[i].y+e.y],f=u[i],p=l.create();l.rotate(p,p,f),l.translate(p,p,d),this._axesLayout[t]={position:d,rotation:f,transform:p,tickDirection:1,labelDirection:1}},this)},getAxis:function(t){return this._axesMap[t]},dataToPoint:function(t,e){return this.axisCoordToPoint(this._axesMap[e].dataToCoord(t),e)},eachActiveState:function(t,e,i){for(var n=this.dimensions,a=this._axesMap,o=!1,r=0,s=n.length;s>r;r++)"normal"!==a[n[r]].model.getActiveState()&&(o=!0);for(var l=0,h=t.count();h>l;l++){var u,c=t.getValues(n,l);if(o){u="active";for(var r=0,s=n.length;s>r;r++){var d=n[r],f=a[d].model.getActiveState(c[r],r);if("inactive"===f){u="inactive";break}}}else u="normal";e.call(i,u,l)}},axisCoordToPoint:function(t,e){var i=this._axesLayout[e],n=[t,0];return h.applyTransform(n,n,i.transform),n},getAxisLayout:function(t){return r.clone(this._axesLayout[t])}},t.exports=n},function(t,e,i){var n=i(1),a=i(43),o=function(t,e,i,n,o){a.call(this,t,e,i),this.type=n||"value",this.axisIndex=o};o.prototype={constructor:o,model:null},n.inherits(o,a),t.exports=o},function(t,e,i){var n=i(1),a=i(10);i(330),a.extend({type:"parallel",dependencies:["parallelAxis"],coordinateSystem:null,dimensions:null,parallelAxisIndex:null,defaultOption:{zlevel:0,z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",parallelAxisDefault:null},init:function(){a.prototype.init.apply(this,arguments),this.mergeOption({})},mergeOption:function(t){var e=this.option;t&&n.merge(e,t,!0),this._initDimensions()},contains:function(t,e){var i=t.get("parallelIndex");return null!=i&&e.getComponent("parallel",i)===this},_initDimensions:function(){var t=this.dimensions=[],e=this.parallelAxisIndex=[],i=n.filter(this.dependentModels.parallelAxis,function(t){return t.get("parallelIndex")===this.componentIndex});n.each(i,function(i){t.push("dim"+i.get("dim")),e.push(i.componentIndex)})}})},function(t,e,i){function n(t){if(!t.parallel){var e=!1;o.each(t.series,function(t){t&&"parallel"===t.type&&(e=!0)}),e&&(t.parallel=[{}])}}function a(t){var e=r.normalizeToArray(t.parallelAxis);o.each(e,function(e){if(o.isObject(e)){var i=e.parallelIndex||0,n=r.normalizeToArray(t.parallel)[i];n&&n.parallelAxisDefault&&o.merge(e,n.parallelAxisDefault,!1)}})}var o=i(1),r=i(7);t.exports=function(t){n(t),a(t)}},function(t,e,i){"use strict";function n(t,e){e=e||[0,360],o.call(this,"angle",t,e),this.type="category"}var a=i(1),o=i(43);n.prototype={constructor:n,dataToAngle:o.prototype.dataToCoord,angleToData:o.prototype.coordToData},a.inherits(n,o),t.exports=n},function(t,e,i){"use strict";function n(t,e){return e.type||(e.data?"category":"value")}var a=i(1),o=i(10),r=i(61),s=o.extend({type:"polarAxis",axis:null});a.merge(s.prototype,i(49));var l={angle:{polarIndex:0,startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:!1}},radius:{polarIndex:0,splitNumber:5}};r("angle",s,n,l.angle),r("radius",s,n,l.radius)},function(t,e,i){"use strict";var n=i(339),a=i(335),o=function(t){this.name=t||"",this.cx=0,this.cy=0,this._radiusAxis=new n,this._angleAxis=new a};o.prototype={constructor:o,type:"polar",dimensions:["radius","angle"],containPoint:function(t){var e=this.pointToCoord(t);return this._radiusAxis.contain(e[0])&&this._angleAxis.contain(e[1])},containData:function(t){return this._radiusAxis.containData(t[0])&&this._angleAxis.containData(t[1])},getAxis:function(t){return this["_"+t+"Axis"]},getAxesByScale:function(t){var e=[],i=this._angleAxis,n=this._radiusAxis;return i.scale.type===t&&e.push(i),n.scale.type===t&&e.push(n),e},getAngleAxis:function(){return this._angleAxis},getRadiusAxis:function(){return this._radiusAxis},getOtherAxis:function(t){var e=this._angleAxis;return t===e?this._radiusAxis:e},getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},dataToPoints:function(t){return t.mapArray(this.dimensions,function(t,e){return this.dataToPoint([t,e])},this)},dataToPoint:function(t,e){return this.coordToPoint([this._radiusAxis.dataToRadius(t[0],e),this._angleAxis.dataToAngle(t[1],e)])},pointToData:function(t,e){var i=this.pointToCoord(t);return[this._radiusAxis.radiusToData(i[0],e),this._angleAxis.angleToData(i[1],e)]},pointToCoord:function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=this.getAngleAxis(),a=n.getExtent(),o=Math.min(a[0],a[1]),r=Math.max(a[0],a[1]);n.inverse?o=r-360:r=o+360;var s=Math.sqrt(e*e+i*i);e/=s,i/=s;for(var l=Math.atan2(-i,e)/Math.PI*180,h=o>l?1:-1;o>l||l>r;)l+=360*h;return[s,l]},coordToPoint:function(t){var e=t[0],i=t[1]/180*Math.PI,n=Math.cos(i)*e+this.cx,a=-Math.sin(i)*e+this.cy;return[n,a]}},t.exports=o},function(t,e,i){"use strict";i(336),i(2).extendComponentModel({type:"polar",dependencies:["polarAxis","angleAxis"],coordinateSystem:null,findAxisModel:function(t){var e,i=this.ecModel;return i.eachComponent(t,function(t){i.getComponent("polar",t.getShallow("polarIndex"))===this&&(e=t)},this),e},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"80%"}})},function(t,e,i){"use strict";function n(t,e){o.call(this,"radius",t,e),this.type="category"}var a=i(1),o=i(43);n.prototype={constructor:n,dataToRadius:o.prototype.dataToCoord,radiusToData:o.prototype.coordToData},a.inherits(n,o),t.exports=n},function(t,e,i){function n(t,e,i){o.call(this,t,e,i),this.type="value",this.angle=0,this.name="",this.model}var a=i(1),o=i(43);a.inherits(n,o),t.exports=n},function(t,e,i){function n(t,e,i){this._model=t,this.dimensions=[],this._indicatorAxes=a.map(t.getIndicatorModels(),function(t,e){var i="indicator_"+e,n=new o(i,new r);return n.name=t.get("name"),n.model=t,t.axis=n,this.dimensions.push(i),n},this),this.resize(t,i),this.cx,this.cy,this.r,this.startAngle}var a=i(1),o=i(340),r=i(37),s=i(4),l=i(23);n.prototype.getIndicatorAxes=function(){return this._indicatorAxes},n.prototype.dataToPoint=function(t,e){var i=this._indicatorAxes[e];return this.coordToPoint(i.dataToCoord(t),e)},n.prototype.coordToPoint=function(t,e){var i=this._indicatorAxes[e],n=i.angle,a=this.cx+t*Math.cos(n),o=this.cy-t*Math.sin(n);return[a,o]},n.prototype.pointToData=function(t){var e=t[0]-this.cx,i=t[1]-this.cy,n=Math.sqrt(e*e+i*i);e/=n,i/=n;for(var a,o=Math.atan2(-i,e),r=1/0,s=-1,l=0;lu&&(a=h,s=l,r=u)}return[s,+(a&&a.coodToData(n))]},n.prototype.resize=function(t,e){var i=t.get("center"),n=e.getWidth(),o=e.getHeight(),r=Math.min(n,o)/2;this.cx=s.parsePercent(i[0],n),this.cy=s.parsePercent(i[1],o),this.startAngle=t.get("startAngle")*Math.PI/180,this.r=s.parsePercent(t.get("radius"),r),a.each(this._indicatorAxes,function(t,e){t.setExtent(0,this.r);var i=this.startAngle+e*Math.PI*2/this._indicatorAxes.length;i=Math.atan2(Math.sin(i),Math.cos(i)),t.angle=i},this)},n.prototype.update=function(t,e){function i(t){var e=Math.pow(10,Math.floor(Math.log(t)/Math.LN10)),i=t/e;return 2===i?i=5:i*=2,i*e}var n=this._indicatorAxes,o=this._model;a.each(n,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeriesByType("radar",function(e,i){if("radar"===e.get("coordinateSystem")&&t.getComponent("radar",e.get("radarIndex"))===o){var r=e.getData();a.each(n,function(t){t.scale.unionExtent(r.getDataExtent(t.dim))})}},this);var r=o.get("splitNumber");a.each(n,function(t,e){var n=l.getScaleExtent(t,t.model);l.niceScaleExtent(t,t.model);var a=t.model,o=t.scale,h=a.get("min"),u=a.get("max"),c=o.getInterval();if(null!=h&&null!=u)o.setInterval((u-h)/r);else if(null!=h){var d;do d=h+c*r,o.setExtent(+h,d),o.setInterval(c),c=i(c);while(dn[0]&&isFinite(f)&&isFinite(n[0]))}else{var p=o.getTicks().length-1;p>r&&(c=i(c));var g=Math.round((n[0]+n[1])/2/c)*c,m=Math.round(r/2);o.setExtent(s.round(g-m*c),s.round(g+(r-m)*c)),o.setInterval(c)}})},n.dimensions=[],n.create=function(t,e){var i=[];return t.eachComponent("radar",function(a){var o=new n(a,t,e);i.push(o),a.coordinateSystem=o}),t.eachSeriesByType("radar",function(t){"radar"===t.get("coordinateSystem")&&(t.coordinateSystem=i[t.get("radarIndex")||0])}),i},i(28).register("radar",n),t.exports=n},function(t,e,i){function n(t,e){return s.defaults({show:e},t)}var a=i(72),o=a.valueAxis,r=i(12),s=i(1),l=i(49),h=i(2).extendComponentModel({type:"radar",optionUpdated:function(){var t=this.get("boundaryGap"),e=this.get("splitNumber"),i=this.get("scale"),n=this.get("axisLine"),a=this.get("axisTick"),o=this.get("axisLabel"),h=this.get("name.textStyle"),u=this.get("name.show"),c=this.get("name.formatter"),d=this.get("nameGap"),f=s.map(this.get("indicator")||[],function(f){return null!=f.max&&f.max>0?f.min=0:null!=f.min&&f.min<0&&(f.max=0),f=s.merge(s.clone(f),{boundaryGap:t,splitNumber:e,scale:i,axisLine:n,axisTick:a,axisLabel:o,name:f.text,nameLocation:"end",nameGap:d,nameTextStyle:h},!1),u||(f.name=""),"string"==typeof c?f.name=c.replace("{value}",f.name):"function"==typeof c&&(f.name=c(f.name,f)),s.extend(new r(f,null,this.ecModel),l)},this);this.getIndicatorModels=function(){return f}},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"75%",startAngle:90,name:{show:!0},boundaryGap:[0,0],splitNumber:5,nameGap:15,scale:!1,shape:"polygon",axisLine:s.merge({lineStyle:{color:"#bbb"}},o.axisLine),axisLabel:n(o.axisLabel,!1),axisTick:n(o.axisTick,!1),splitLine:n(o.splitLine,!0),splitArea:n(o.splitArea,!0),indicator:[]}});t.exports=h},function(t,e,i){"use strict";function n(t,e){this.id=null==t?"":t,this.inEdges=[],this.outEdges=[],this.edges=[],this.hostGraph,this.dataIndex=null==e?-1:e}function a(t,e,i){this.node1=t,this.node2=e,this.dataIndex=null==i?-1:i}var o=i(1),r=function(t){this._directed=t||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this.data,this.edgeData},s=r.prototype;s.type="graph",s.isDirected=function(){return this._directed},s.addNode=function(t,e){var i=this._nodesMap;if(!i[t]){var a=new n(t,e);return a.hostGraph=this,this.nodes.push(a),i[t]=a,a}},s.getNodeByIndex=function(t){var e=this.data.getRawIndex(t);return this.nodes[e]},s.getNodeById=function(t){return this._nodesMap[t]},s.addEdge=function(t,e,i){var o=this._nodesMap,r=this._edgesMap;if(t instanceof n||(t=o[t]),e instanceof n||(e=o[e]),t&&e){var s=t.id+"-"+e.id;if(!r[s]){var l=new a(t,e,i);return l.hostGraph=this,this._directed&&(t.outEdges.push(l),e.inEdges.push(l)),t.edges.push(l),t!==e&&e.edges.push(l),this.edges.push(l),r[s]=l,l}}},s.getEdgeByIndex=function(t){var e=this.edgeData.getRawIndex(t);return this.edges[e]},s.getEdge=function(t,e){t instanceof n&&(t=t.id),e instanceof n&&(e=e.id);var i=this._edgesMap;return this._directed?i[t+"-"+e]:i[t+"-"+e]||i[e+"-"+t]},s.eachNode=function(t,e){for(var i=this.nodes,n=i.length,a=0;n>a;a++)i[a].dataIndex>=0&&t.call(e,i[a],a)},s.eachEdge=function(t,e){for(var i=this.edges,n=i.length,a=0;n>a;a++)i[a].dataIndex>=0&&i[a].node1.dataIndex>=0&&i[a].node2.dataIndex>=0&&t.call(e,i[a],a)},s.breadthFirstTraverse=function(t,e,i,a){if(e instanceof n||(e=this._nodesMap[e]),e){for(var o="out"===i?"outEdges":"in"===i?"inEdges":"edges",r=0;ra;a++)i[a].dataIndex=-1;for(var a=0,o=t.count();o>a;a++)i[t.getRawIndex(a)].dataIndex=a;e.filterSelf(function(t){var i=n[e.getRawIndex(t)];return i.node1.dataIndex>=0&&i.node2.dataIndex>=0});for(var a=0,o=n.length;o>a;a++)n[a].dataIndex=-1;for(var a=0,o=e.count();o>a;a++)n[e.getRawIndex(a)].dataIndex=a},s.setEdgeData=function(t){this.edgeData=t,this._edgeDataSaved=t.cloneShallow()},s.restoreData=function(){this.edgeData=this._edgeDataSaved.cloneShallow()},s.clone=function(){for(var t=new r(this._directed),e=this.nodes,i=this.edges,n=0;n=0&&this[t][e].setItemVisual(this.dataIndex,i,n)},getVisual:function(i,n){return this[t][e].getItemVisual(this.dataIndex,i,n)},setLayout:function(i,n){this.dataIndex>=0&&this[t][e].setItemLayout(this.dataIndex,i,n)},getLayout:function(){return this[t][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[t][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[t][e].getRawIndex(this.dataIndex)}}};o.mixin(n,l("hostGraph","data")),o.mixin(a,l("hostGraph","edgeData")),r.Node=n,r.Edge=a,t.exports=r},function(t,e,i){function n(t,e){this.root,this.data,this._nodes=[],this.hostModel=t,this.levelModels=o.map(e||[],function(e){return new r(e,t,t.ecModel)})}function a(t,e){var i=e.children;t.parentNode!==e&&(i.push(t),t.parentNode=e,e.hostTree._nodes.push(t))}var o=i(1),r=i(12),s=i(14),l=i(223),h=i(31),u=function(t,e,i){this.name=t||"",this.depth=0,this.height=0,this.parentNode=null,this.dataIndex=null==e?-1:e,this.children=[],this.viewChildren=[],this.hostTree=i};u.prototype={constructor:u,isRemoved:function(){return this.dataIndex<0},eachNode:function(t,e,i){"function"==typeof t&&(i=e,e=t,t=null),t=t||{},o.isString(t)&&(t={order:t});var n,a=t.order||"preorder",r=this[t.attr||"children"];"preorder"===a&&(n=e.call(i,this));for(var s=0;!n&&se&&(e=n.height)}this.height=e+1},getNodeById:function(t){if(this.getId()===t)return this;for(var e=0,i=this.children,n=i.length;n>e;e++){var a=i[e].getNodeById(t);if(a)return a}},contains:function(t){if(t===this)return!0;for(var e=0,i=this.children,n=i.length;n>e;e++){var a=i[e].contains(t);if(a)return a}},getAncestors:function(t){for(var e=[],i=t?this:this.parentNode;i;)e.push(i),i=i.parentNode;return e.reverse(),e},getValue:function(t){var e=this.hostTree.data;return e.get(e.getDimension(t||"value"),this.dataIndex)},setLayout:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,t,e)},getLayout:function(){return this.hostTree.data.getItemLayout(this.dataIndex)},getModel:function(t){if(!(this.dataIndex<0)){var e=this.hostTree,i=e.data.getItemModel(this.dataIndex),n=this.getLevelModel();return i.getModel(t,(n||e.hostModel).getModel(t))}},getLevelModel:function(){return(this.hostTree.levelModels||[])[this.depth]},setVisual:function(t,e){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,t,e)},getVisual:function(t,e){return this.hostTree.data.getItemVisual(this.dataIndex,t,e)},getRawIndex:function(){return this.hostTree.data.getRawIndex(this.dataIndex)},getId:function(){return this.hostTree.data.getId(this.dataIndex)}},n.prototype={constructor:n,type:"tree",eachNode:function(t,e,i){this.root.eachNode(t,e,i)},getNodeByDataIndex:function(t){var e=this.data.getRawIndex(t);return this._nodes[e]},getNodeByName:function(t){return this.root.getNodeByName(t)},update:function(){for(var t=this.data,e=this._nodes,i=0,n=e.length;n>i;i++)e[i].dataIndex=-1;for(var i=0,n=t.count();n>i;i++)e[t.getRawIndex(i)].dataIndex=i}},n.createTree=function(t,e,i){function o(t,e){c.push(t);var i=new u(t.name,c.length-1,r);e?a(i,e):r.root=i;var n=t.children;if(n)for(var s=0;so;o++){var s=e[o];s.el.animateTo(s.target,s.time,s.delay,s.easing,n)}return this}}}var a=i(1);t.exports={createWrap:n}},function(t,e,i){function n(){function t(e,n){if(n>=i.length)return e;for(var o=-1,r=e.length,s=i[n++],l={},h={};++o=i.length)return t;var r=[],s=n[o++];return a.each(t,function(t,i){r.push({key:i,values:e(t,o)})}),s?r.sort(function(t,e){return s(t.key,e.key)}):r}var i=[],n=[];return{key:function(t){return i.push(t),this},sortKeys:function(t){return n[i.length-1]=t,this},entries:function(i){return e(t(i,0),0)}}}var a=i(1);t.exports=n},function(t,e,i){var n=i(1),a={get:function(t,e,i){var a=n.clone((o[t]||{})[e]);return i&&n.isArray(a)?a[a.length-1]:a}},o={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}};t.exports=a},function(t,e,i){function n(t,e){return Math.abs(t-e)} + * @private + */ + this._chartsViews = []; + + /** + * @type {Object.} + * @private + */ + this._chartsMap = {}; + + /** + * @type {Array.} + * @private + */ + this._componentsViews = []; + + /** + * @type {Object.} + * @private + */ + this._componentsMap = {}; + + /** + * @type {module:echarts/ExtensionAPI} + * @private + */ + this._api = new ExtensionAPI(this); + + /** + * @type {module:echarts/CoordinateSystem} + * @private + */ + this._coordSysMgr = new CoordinateSystemManager(); + + Eventful.call(this); + + /** + * @type {module:echarts~MessageCenter} + * @private + */ + this._messageCenter = new MessageCenter(); + + // Init mouse events + this._initEvents(); + + // In case some people write `window.onresize = chart.resize` + this.resize = zrUtil.bind(this.resize, this); + } + + var echartsProto = ECharts.prototype; + + /** + * @return {HTMLDomElement} + */ + echartsProto.getDom = function () { + return this._dom; + }; + + /** + * @return {module:zrender~ZRender} + */ + echartsProto.getZr = function () { + return this._zr; + }; + + /** + * @param {Object} option + * @param {boolean} notMerge + * @param {boolean} [notRefreshImmediately=false] Useful when setOption frequently. + */ + echartsProto.setOption = function (option, notMerge, notRefreshImmediately) { + if (!this._model || notMerge) { + this._model = new GlobalModel( + null, null, this._theme, new OptionManager(this._api) + ); + } + + this._model.setOption(option, optionPreprocessorFuncs); + + updateMethods.prepareAndUpdate.call(this); + + !notRefreshImmediately && this._zr.refreshImmediately(); + }; + + /** + * @DEPRECATED + */ + echartsProto.setTheme = function () { + console.log('ECharts#setTheme() is DEPRECATED in ECharts 3.0'); + }; + + /** + * @return {module:echarts/model/Global} + */ + echartsProto.getModel = function () { + return this._model; + }; + + /** + * @return {Object} + */ + echartsProto.getOption = function () { + return this._model.getOption(); + }; + + /** + * @return {number} + */ + echartsProto.getWidth = function () { + return this._zr.getWidth(); + }; + + /** + * @return {number} + */ + echartsProto.getHeight = function () { + return this._zr.getHeight(); + }; + + /** + * Get canvas which has all thing rendered + * @param {Object} opts + * @param {string} [opts.backgroundColor] + */ + echartsProto.getRenderedCanvas = function (opts) { + if (!env.canvasSupported) { + return; + } + opts = opts || {}; + opts.pixelRatio = opts.pixelRatio || 1; + opts.backgroundColor = opts.backgroundColor + || this._model.get('backgroundColor'); + var zr = this._zr; + var list = zr.storage.getDisplayList(); + // Stop animations + zrUtil.each(list, function (el) { + el.stopAnimation(true); + }); + return zr.painter.getRenderedCanvas(opts); + }; + /** + * @return {string} + * @param {Object} opts + * @param {string} [opts.type='png'] + * @param {string} [opts.pixelRatio=1] + * @param {string} [opts.backgroundColor] + */ + echartsProto.getDataURL = function (opts) { + opts = opts || {}; + var excludeComponents = opts.excludeComponents; + var ecModel = this._model; + var excludesComponentViews = []; + var self = this; + + each(excludeComponents, function (componentType) { + ecModel.eachComponent({ + mainType: componentType + }, function (component) { + var view = self._componentsMap[component.__viewId]; + if (!view.group.ignore) { + excludesComponentViews.push(view); + view.group.ignore = true; + } + }); + }); + + var url = this.getRenderedCanvas(opts).toDataURL( + 'image/' + (opts && opts.type || 'png') + ); + + each(excludesComponentViews, function (view) { + view.group.ignore = false; + }); + return url; + }; + + + /** + * @return {string} + * @param {Object} opts + * @param {string} [opts.type='png'] + * @param {string} [opts.pixelRatio=1] + * @param {string} [opts.backgroundColor] + */ + echartsProto.getConnectedDataURL = function (opts) { + if (!env.canvasSupported) { + return; + } + var groupId = this.group; + var mathMin = Math.min; + var mathMax = Math.max; + var MAX_NUMBER = Infinity; + if (connectedGroups[groupId]) { + var left = MAX_NUMBER; + var top = MAX_NUMBER; + var right = -MAX_NUMBER; + var bottom = -MAX_NUMBER; + var canvasList = []; + var dpr = (opts && opts.pixelRatio) || 1; + for (var id in instances) { + var chart = instances[id]; + if (chart.group === groupId) { + var canvas = chart.getRenderedCanvas( + zrUtil.clone(opts) + ); + var boundingRect = chart.getDom().getBoundingClientRect(); + left = mathMin(boundingRect.left, left); + top = mathMin(boundingRect.top, top); + right = mathMax(boundingRect.right, right); + bottom = mathMax(boundingRect.bottom, bottom); + canvasList.push({ + dom: canvas, + left: boundingRect.left, + top: boundingRect.top + }); + } + } + + left *= dpr; + top *= dpr; + right *= dpr; + bottom *= dpr; + var width = right - left; + var height = bottom - top; + var targetCanvas = zrUtil.createCanvas(); + targetCanvas.width = width; + targetCanvas.height = height; + var zr = zrender.init(targetCanvas); + + each(canvasList, function (item) { + var img = new graphic.Image({ + style: { + x: item.left * dpr - left, + y: item.top * dpr - top, + image: item.dom + } + }); + zr.add(img); + }); + zr.refreshImmediately(); + + return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png')); + } + else { + return this.getDataURL(opts); + } + }; + + var updateMethods = { + + /** + * @param {Object} payload + * @private + */ + update: function (payload) { + // console.time && console.time('update'); + + var ecModel = this._model; + var api = this._api; + var coordSysMgr = this._coordSysMgr; + // update before setOption + if (!ecModel) { + return; + } + + ecModel.restoreData(); + + // TODO + // Save total ecModel here for undo/redo (after restoring data and before processing data). + // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call. + + // Create new coordinate system each update + // In LineView may save the old coordinate system and use it to get the orignal point + coordSysMgr.create(this._model, this._api); + + processData.call(this, ecModel, api); + + stackSeriesData.call(this, ecModel); + + coordSysMgr.update(ecModel, api); + + doLayout.call(this, ecModel, payload); + + doVisualCoding.call(this, ecModel, payload); + + doRender.call(this, ecModel, payload); + + // Set background + var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; + + var painter = this._zr.painter; + // TODO all use clearColor ? + if (painter.isSingleCanvas && painter.isSingleCanvas()) { + this._zr.configLayer(0, { + clearColor: backgroundColor + }); + } + else { + // In IE8 + if (!env.canvasSupported) { + var colorArr = colorTool.parse(backgroundColor); + backgroundColor = colorTool.stringify(colorArr, 'rgb'); + if (colorArr[3] === 0) { + backgroundColor = 'transparent'; + } + } + backgroundColor = backgroundColor; + this._dom.style.backgroundColor = backgroundColor; + } + + // console.time && console.timeEnd('update'); + }, + + // PENDING + /** + * @param {Object} payload + * @private + */ + updateView: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doLayout.call(this, ecModel, payload); + + doVisualCoding.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateView', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + updateVisual: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doVisualCoding.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateVisual', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + updateLayout: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + doLayout.call(this, ecModel, payload); + + invokeUpdateMethod.call(this, 'updateLayout', ecModel, payload); + }, + + /** + * @param {Object} payload + * @private + */ + highlight: function (payload) { + toggleHighlight.call(this, 'highlight', payload); + }, + + /** + * @param {Object} payload + * @private + */ + downplay: function (payload) { + toggleHighlight.call(this, 'downplay', payload); + }, + + /** + * @param {Object} payload + * @private + */ + prepareAndUpdate: function (payload) { + var ecModel = this._model; + + prepareView.call(this, 'component', ecModel); + + prepareView.call(this, 'chart', ecModel); + + updateMethods.update.call(this, payload); + } + }; + + /** + * @param {Object} payload + * @private + */ + function toggleHighlight(method, payload) { + var ecModel = this._model; + + // dispatchAction before setOption + if (!ecModel) { + return; + } + + ecModel.eachComponent( + {mainType: 'series', query: payload}, + function (seriesModel, index) { + var chartView = this._chartsMap[seriesModel.__viewId]; + if (chartView && chartView.__alive) { + chartView[method]( + seriesModel, ecModel, this._api, payload + ); + } + }, + this + ); + } + + /** + * Resize the chart + */ + echartsProto.resize = function () { + this._zr.resize(); + + var optionChanged = this._model && this._model.resetOption('media'); + updateMethods[optionChanged ? 'prepareAndUpdate' : 'update'].call(this); + + // Resize loading effect + this._loadingFX && this._loadingFX.resize(); + }; + + var defaultLoadingEffect = __webpack_require__(87); + /** + * Show loading effect + * @param {string} [name='default'] + * @param {Object} [cfg] + */ + echartsProto.showLoading = function (name, cfg) { + if (zrUtil.isObject(name)) { + cfg = name; + name = 'default'; + } + this.hideLoading(); + var el = defaultLoadingEffect(this._api, cfg); + var zr = this._zr; + this._loadingFX = el; + + zr.add(el); + }; + + /** + * Hide loading effect + */ + echartsProto.hideLoading = function () { + this._loadingFX && this._zr.remove(this._loadingFX); + this._loadingFX = null; + }; + + /** + * @param {Object} eventObj + * @return {Object} + */ + echartsProto.makeActionFromEvent = function (eventObj) { + var payload = zrUtil.extend({}, eventObj); + payload.type = eventActionMap[eventObj.type]; + return payload; + }; + + /** + * @pubilc + * @param {Object} payload + * @param {string} [payload.type] Action type + * @param {boolean} [silent=false] Whether trigger event. + */ + echartsProto.dispatchAction = function (payload, silent) { + var actionWrap = actions[payload.type]; + if (actionWrap) { + var actionInfo = actionWrap.actionInfo; + var updateMethod = actionInfo.update || 'update'; + + var payloads = [payload]; + var batched = false; + // Batch action + if (payload.batch) { + batched = true; + payloads = zrUtil.map(payload.batch, function (item) { + item = zrUtil.defaults(zrUtil.extend({}, item), payload); + item.batch = null; + return item; + }); + } + + var eventObjBatch = []; + var eventObj; + var isHighlightOrDownplay = payload.type === 'highlight' || payload.type === 'downplay'; + for (var i = 0; i < payloads.length; i++) { + var batchItem = payloads[i]; + // Action can specify the event by return it. + eventObj = actionWrap.action(batchItem, this._model); + // Emit event outside + eventObj = eventObj || zrUtil.extend({}, batchItem); + // Convert type to eventType + eventObj.type = actionInfo.event || eventObj.type; + eventObjBatch.push(eventObj); + + // Highlight and downplay are special. + isHighlightOrDownplay && updateMethods[updateMethod].call(this, batchItem); + } + + (updateMethod !== 'none' && !isHighlightOrDownplay) + && updateMethods[updateMethod].call(this, payload); + + if (!silent) { + // Follow the rule of action batch + if (batched) { + eventObj = { + type: actionInfo.event || payload.type, + batch: eventObjBatch + }; + } + else { + eventObj = eventObjBatch[0]; + } + this._messageCenter.trigger(eventObj.type, eventObj); + } + } + }; + + /** + * Register event + * @method + */ + echartsProto.on = createRegisterEventWithLowercaseName('on'); + echartsProto.off = createRegisterEventWithLowercaseName('off'); + echartsProto.one = createRegisterEventWithLowercaseName('one'); + + /** + * @param {string} methodName + * @private + */ + function invokeUpdateMethod(methodName, ecModel, payload) { + var api = this._api; + + // Update all components + each(this._componentsViews, function (component) { + var componentModel = component.__model; + component[methodName](componentModel, ecModel, api, payload); + + updateZ(componentModel, component); + }, this); + + // Upate all charts + ecModel.eachSeries(function (seriesModel, idx) { + var chart = this._chartsMap[seriesModel.__viewId]; + chart[methodName](seriesModel, ecModel, api, payload); + + updateZ(seriesModel, chart); + }, this); + + } + + /** + * Prepare view instances of charts and components + * @param {module:echarts/model/Global} ecModel + * @private + */ + function prepareView(type, ecModel) { + var isComponent = type === 'component'; + var viewList = isComponent ? this._componentsViews : this._chartsViews; + var viewMap = isComponent ? this._componentsMap : this._chartsMap; + var zr = this._zr; + + for (var i = 0; i < viewList.length; i++) { + viewList[i].__alive = false; + } + + ecModel[isComponent ? 'eachComponent' : 'eachSeries'](function (componentType, model) { + if (isComponent) { + if (componentType === 'series') { + return; + } + } + else { + model = componentType; + } + + // Consider: id same and type changed. + var viewId = model.id + '_' + model.type; + var view = viewMap[viewId]; + if (!view) { + var classType = ComponentModel.parseClassType(model.type); + var Clazz = isComponent + ? ComponentView.getClass(classType.main, classType.sub) + : ChartView.getClass(classType.sub); + if (Clazz) { + view = new Clazz(); + view.init(ecModel, this._api); + viewMap[viewId] = view; + viewList.push(view); + zr.add(view.group); + } + else { + // Error + return; + } + } + + model.__viewId = viewId; + view.__alive = true; + view.__id = viewId; + view.__model = model; + }, this); + + for (var i = 0; i < viewList.length;) { + var view = viewList[i]; + if (!view.__alive) { + zr.remove(view.group); + view.dispose(ecModel, this._api); + viewList.splice(i, 1); + delete viewMap[view.__id]; + } + else { + i++; + } + } + } + + /** + * Processor data in each series + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function processData(ecModel, api) { + each(PROCESSOR_STAGES, function (stage) { + each(dataProcessorFuncs[stage] || [], function (process) { + process(ecModel, api); + }); + }); + } + + /** + * @private + */ + function stackSeriesData(ecModel) { + var stackedDataMap = {}; + ecModel.eachSeries(function (series) { + var stack = series.get('stack'); + var data = series.getData(); + if (stack && data.type === 'list') { + var previousStack = stackedDataMap[stack]; + if (previousStack) { + data.stackedOn = previousStack; + } + stackedDataMap[stack] = data; + } + }); + } + + /** + * Layout before each chart render there series, after visual coding and data processing + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function doLayout(ecModel, payload) { + var api = this._api; + each(layoutFuncs, function (layout) { + layout(ecModel, api, payload); + }); + } + + /** + * Code visual infomation from data after data processing + * + * @param {module:echarts/model/Global} ecModel + * @private + */ + function doVisualCoding(ecModel, payload) { + each(VISUAL_CODING_STAGES, function (stage) { + each(visualCodingFuncs[stage] || [], function (visualCoding) { + visualCoding(ecModel, payload); + }); + }); + } + + /** + * Render each chart and component + * @private + */ + function doRender(ecModel, payload) { + var api = this._api; + // Render all components + each(this._componentsViews, function (componentView) { + var componentModel = componentView.__model; + componentView.render(componentModel, ecModel, api, payload); + + updateZ(componentModel, componentView); + }, this); + + each(this._chartsViews, function (chart) { + chart.__alive = false; + }, this); + + // Render all charts + ecModel.eachSeries(function (seriesModel, idx) { + var chartView = this._chartsMap[seriesModel.__viewId]; + chartView.__alive = true; + chartView.render(seriesModel, ecModel, api, payload); + + updateZ(seriesModel, chartView); + }, this); + + // Remove groups of unrendered charts + each(this._chartsViews, function (chart) { + if (!chart.__alive) { + chart.remove(ecModel, api); + } + }, this); + } + + var MOUSE_EVENT_NAMES = [ + 'click', 'dblclick', 'mouseover', 'mouseout', 'mousedown', 'mouseup', 'globalout' + ]; + /** + * @private + */ + echartsProto._initEvents = function () { + var zr = this._zr; + each(MOUSE_EVENT_NAMES, function (eveName) { + zr.on(eveName, function (e) { + var ecModel = this.getModel(); + var el = e.target; + if (el && el.dataIndex != null) { + var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex); + var params = dataModel && dataModel.getDataParams(el.dataIndex) || {}; + params.event = e; + params.type = eveName; + this.trigger(eveName, params); + } + }, this); + }, this); + + each(eventActionMap, function (actionType, eventType) { + this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, this); + }, this); + }; + + /** + * @return {boolean} + */ + echartsProto.isDisposed = function () { + return this._disposed; + }; + + /** + * Clear + */ + echartsProto.clear = function () { + this.setOption({}, true); + }; + /** + * Dispose instance + */ + echartsProto.dispose = function () { + this._disposed = true; + var api = this._api; + var ecModel = this._model; + + each(this._componentsViews, function (component) { + component.dispose(ecModel, api); + }); + each(this._chartsViews, function (chart) { + chart.dispose(ecModel, api); + }); + + this._zr.dispose(); + + delete instances[this.id]; + }; + + zrUtil.mixin(ECharts, Eventful); + + /** + * @param {module:echarts/model/Series|module:echarts/model/Component} model + * @param {module:echarts/view/Component|module:echarts/view/Chart} view + * @return {string} + */ + function updateZ(model, view) { + var z = model.get('z'); + var zlevel = model.get('zlevel'); + // Set z and zlevel + view.group.traverse(function (el) { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + }); + } + /** + * @type {Array.} + * @inner + */ + var actions = []; + + /** + * Map eventType to actionType + * @type {Object} + */ + var eventActionMap = {}; + + /** + * @type {Array.} + * @inner + */ + var layoutFuncs = []; + + /** + * Data processor functions of each stage + * @type {Array.>} + * @inner + */ + var dataProcessorFuncs = {}; + + /** + * @type {Array.} + * @inner + */ + var optionPreprocessorFuncs = []; + + /** + * Visual coding functions of each stage + * @type {Array.>} + * @inner + */ + var visualCodingFuncs = {}; + /** + * Theme storage + * @type {Object.} + */ + var themeStorage = {}; + + + var instances = {}; + var connectedGroups = {}; + + var idBase = new Date() - 0; + var groupIdBase = new Date() - 0; + var DOM_ATTRIBUTE_KEY = '_echarts_instance_'; + /** + * @alias module:echarts + */ + var echarts = { + /** + * @type {number} + */ + version: '3.1.6', + dependencies: { + zrender: '3.0.7' + } + }; + + function enableConnect(chart) { + + var STATUS_PENDING = 0; + var STATUS_UPDATING = 1; + var STATUS_UPDATED = 2; + var STATUS_KEY = '__connectUpdateStatus'; + function updateConnectedChartsStatus(charts, status) { + for (var i = 0; i < charts.length; i++) { + var otherChart = charts[i]; + otherChart[STATUS_KEY] = status; + } + } + zrUtil.each(eventActionMap, function (actionType, eventType) { + chart._messageCenter.on(eventType, function (event) { + if (connectedGroups[chart.group] && chart[STATUS_KEY] !== STATUS_PENDING) { + var action = chart.makeActionFromEvent(event); + var otherCharts = []; + for (var id in instances) { + var otherChart = instances[id]; + if (otherChart !== chart && otherChart.group === chart.group) { + otherCharts.push(otherChart); + } + } + updateConnectedChartsStatus(otherCharts, STATUS_PENDING); + each(otherCharts, function (otherChart) { + if (otherChart[STATUS_KEY] !== STATUS_UPDATING) { + otherChart.dispatchAction(action); + } + }); + updateConnectedChartsStatus(otherCharts, STATUS_UPDATED); + } + }); + }); + + } + /** + * @param {HTMLDomElement} dom + * @param {Object} [theme] + * @param {Object} opts + */ + echarts.init = function (dom, theme, opts) { + // Check version + if ((zrender.version.replace('.', '') - 0) < (echarts.dependencies.zrender.replace('.', '') - 0)) { + throw new Error( + 'ZRender ' + zrender.version + + ' is too old for ECharts ' + echarts.version + + '. Current version need ZRender ' + + echarts.dependencies.zrender + '+' + ); + } + if (!dom) { + throw new Error('Initialize failed: invalid dom.'); + } + + var chart = new ECharts(dom, theme, opts); + chart.id = 'ec_' + idBase++; + instances[chart.id] = chart; + + dom.setAttribute && + dom.setAttribute(DOM_ATTRIBUTE_KEY, chart.id); + + enableConnect(chart); + + return chart; + }; + + /** + * @return {string|Array.} groupId + */ + echarts.connect = function (groupId) { + // Is array of charts + if (zrUtil.isArray(groupId)) { + var charts = groupId; + groupId = null; + // If any chart has group + zrUtil.each(charts, function (chart) { + if (chart.group != null) { + groupId = chart.group; + } + }); + groupId = groupId || ('g_' + groupIdBase++); + zrUtil.each(charts, function (chart) { + chart.group = groupId; + }); + } + connectedGroups[groupId] = true; + return groupId; + }; + + /** + * @return {string} groupId + */ + echarts.disConnect = function (groupId) { + connectedGroups[groupId] = false; + }; + + /** + * Dispose a chart instance + * @param {module:echarts~ECharts|HTMLDomElement|string} chart + */ + echarts.dispose = function (chart) { + if (zrUtil.isDom(chart)) { + chart = echarts.getInstanceByDom(chart); + } + else if (typeof chart === 'string') { + chart = instances[chart]; + } + if ((chart instanceof ECharts) && !chart.isDisposed()) { + chart.dispose(); + } + }; + + /** + * @param {HTMLDomElement} dom + * @return {echarts~ECharts} + */ + echarts.getInstanceByDom = function (dom) { + var key = dom.getAttribute(DOM_ATTRIBUTE_KEY); + return instances[key]; + }; + /** + * @param {string} key + * @return {echarts~ECharts} + */ + echarts.getInstanceById = function (key) { + return instances[key]; + }; + + /** + * Register theme + */ + echarts.registerTheme = function (name, theme) { + themeStorage[name] = theme; + }; + + /** + * Register option preprocessor + * @param {Function} preprocessorFunc + */ + echarts.registerPreprocessor = function (preprocessorFunc) { + optionPreprocessorFuncs.push(preprocessorFunc); + }; + + /** + * @param {string} stage + * @param {Function} processorFunc + */ + echarts.registerProcessor = function (stage, processorFunc) { + if (zrUtil.indexOf(PROCESSOR_STAGES, stage) < 0) { + throw new Error('stage should be one of ' + PROCESSOR_STAGES); + } + var funcs = dataProcessorFuncs[stage] || (dataProcessorFuncs[stage] = []); + funcs.push(processorFunc); + }; + + /** + * Usage: + * registerAction('someAction', 'someEvent', function () { ... }); + * registerAction('someAction', function () { ... }); + * registerAction( + * {type: 'someAction', event: 'someEvent', update: 'updateView'}, + * function () { ... } + * ); + * + * @param {(string|Object)} actionInfo + * @param {string} actionInfo.type + * @param {string} [actionInfo.event] + * @param {string} [actionInfo.update] + * @param {string} [eventName] + * @param {Function} action + */ + echarts.registerAction = function (actionInfo, eventName, action) { + if (typeof eventName === 'function') { + action = eventName; + eventName = ''; + } + var actionType = zrUtil.isObject(actionInfo) + ? actionInfo.type + : ([actionInfo, actionInfo = { + event: eventName + }][0]); + + // Event name is all lowercase + actionInfo.event = (actionInfo.event || actionType).toLowerCase(); + eventName = actionInfo.event; + + if (!actions[actionType]) { + actions[actionType] = {action: action, actionInfo: actionInfo}; + } + eventActionMap[eventName] = actionType; + }; + + /** + * @param {string} type + * @param {*} CoordinateSystem + */ + echarts.registerCoordinateSystem = function (type, CoordinateSystem) { + CoordinateSystemManager.register(type, CoordinateSystem); + }; + + /** + * @param {*} layout + */ + echarts.registerLayout = function (layout) { + // PENDING All functions ? + if (zrUtil.indexOf(layoutFuncs, layout) < 0) { + layoutFuncs.push(layout); + } + }; + + /** + * @param {string} stage + * @param {Function} visualCodingFunc + */ + echarts.registerVisualCoding = function (stage, visualCodingFunc) { + if (zrUtil.indexOf(VISUAL_CODING_STAGES, stage) < 0) { + throw new Error('stage should be one of ' + VISUAL_CODING_STAGES); + } + var funcs = visualCodingFuncs[stage] || (visualCodingFuncs[stage] = []); + funcs.push(visualCodingFunc); + }; + + /** + * @param {Object} opts + */ + echarts.extendChartView = function (opts) { + return ChartView.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendComponentModel = function (opts) { + return ComponentModel.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendSeriesModel = function (opts) { + return SeriesModel.extend(opts); + }; + + /** + * @param {Object} opts + */ + echarts.extendComponentView = function (opts) { + return ComponentView.extend(opts); + }; + + /** + * ZRender need a canvas context to do measureText. + * But in node environment canvas may be created by node-canvas. + * So we need to specify how to create a canvas instead of using document.createElement('canvas') + * + * Be careful of using it in the browser. + * + * @param {Function} creator + * @example + * var Canvas = require('canvas'); + * var echarts = require('echarts'); + * echarts.setCanvasCreator(function () { + * // Small size is enough. + * return new Canvas(32, 32); + * }); + */ + echarts.setCanvasCreator = function (creator) { + zrUtil.createCanvas = creator; + }; + + echarts.registerVisualCoding('echarts', zrUtil.curry( + __webpack_require__(88), '', 'itemStyle' + )); + echarts.registerPreprocessor(__webpack_require__(89)); + + // Default action + echarts.registerAction({ + type: 'highlight', + event: 'highlight', + update: 'highlight' + }, zrUtil.noop); + echarts.registerAction({ + type: 'downplay', + event: 'downplay', + update: 'downplay' + }, zrUtil.noop); + + + // -------- + // Exports + // -------- + + echarts.graphic = __webpack_require__(42); + echarts.number = __webpack_require__(7); + echarts.format = __webpack_require__(6); + echarts.matrix = __webpack_require__(17); + echarts.vector = __webpack_require__(16); + + echarts.util = {}; + each([ + 'map', 'each', 'filter', 'indexOf', 'inherits', + 'reduce', 'filter', 'bind', 'curry', 'isArray', + 'isString', 'isObject', 'isFunction', 'extend' + ], + function (name) { + echarts.util[name] = zrUtil[name]; + } + ); + + module.exports = echarts; + + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * ECharts global model + * + * @module {echarts/model/Global} + * + */ + + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var Model = __webpack_require__(8); + var each = zrUtil.each; + var filter = zrUtil.filter; + var map = zrUtil.map; + var isArray = zrUtil.isArray; + var indexOf = zrUtil.indexOf; + var isObject = zrUtil.isObject; + + var ComponentModel = __webpack_require__(19); + + var globalDefault = __webpack_require__(23); + + var OPTION_INNER_KEY = '\0_ec_inner'; + + /** + * @alias module:echarts/model/Global + * + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {Object} theme + */ + var GlobalModel = Model.extend({ + + constructor: GlobalModel, + + init: function (option, parentModel, theme, optionManager) { + theme = theme || {}; + + this.option = null; // Mark as not initialized. + + /** + * @type {module:echarts/model/Model} + * @private + */ + this._theme = new Model(theme); + + /** + * @type {module:echarts/model/OptionManager} + */ + this._optionManager = optionManager; + }, + + setOption: function (option, optionPreprocessorFuncs) { + zrUtil.assert( + !(OPTION_INNER_KEY in option), + 'please use chart.getOption()' + ); + + this._optionManager.setOption(option, optionPreprocessorFuncs); + + this.resetOption(); + }, + + /** + * @param {string} type null/undefined: reset all. + * 'recreate': force recreate all. + * 'timeline': only reset timeline option + * 'media': only reset media query option + * @return {boolean} Whether option changed. + */ + resetOption: function (type) { + var optionChanged = false; + var optionManager = this._optionManager; + + if (!type || type === 'recreate') { + var baseOption = optionManager.mountOption(type === 'recreate'); + + if (!this.option || type === 'recreate') { + initBase.call(this, baseOption); + } + else { + this.restoreData(); + this.mergeOption(baseOption); + } + optionChanged = true; + } + + if (type === 'timeline' || type === 'media') { + this.restoreData(); + } + + if (!type || type === 'recreate' || type === 'timeline') { + var timelineOption = optionManager.getTimelineOption(this); + timelineOption && (this.mergeOption(timelineOption), optionChanged = true); + } + + if (!type || type === 'recreate' || type === 'media') { + var mediaOptions = optionManager.getMediaOption(this, this._api); + if (mediaOptions.length) { + each(mediaOptions, function (mediaOption) { + this.mergeOption(mediaOption, optionChanged = true); + }, this); + } + } + + return optionChanged; + }, + + /** + * @protected + */ + mergeOption: function (newOption) { + var option = this.option; + var componentsMap = this._componentsMap; + var newCptTypes = []; + + // 如果不存在对应的 component model 则直接 merge + each(newOption, function (componentOption, mainType) { + if (componentOption == null) { + return; + } + + if (!ComponentModel.hasClass(mainType)) { + option[mainType] = option[mainType] == null + ? zrUtil.clone(componentOption) + : zrUtil.merge(option[mainType], componentOption, true); + } + else { + newCptTypes.push(mainType); + } + }); + + // FIXME OPTION 同步是否要改回原来的 + ComponentModel.topologicalTravel( + newCptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this + ); + + function visitComponent(mainType, dependencies) { + var newCptOptionList = modelUtil.normalizeToArray(newOption[mainType]); + + var mapResult = modelUtil.mappingToExists( + componentsMap[mainType], newCptOptionList + ); + + makeKeyInfo(mainType, mapResult); + + var dependentModels = getComponentsByTypes( + componentsMap, dependencies + ); + + option[mainType] = []; + componentsMap[mainType] = []; + + each(mapResult, function (resultItem, index) { + var componentModel = resultItem.exist; + var newCptOption = resultItem.option; + + zrUtil.assert( + isObject(newCptOption) || componentModel, + 'Empty component definition' + ); + + // Consider where is no new option and should be merged using {}, + // see removeEdgeAndAdd in topologicalTravel and + // ComponentModel.getAllClassMainTypes. + if (!newCptOption) { + componentModel.mergeOption({}, this); + componentModel.optionUpdated(this); + } + else { + var ComponentModelClass = ComponentModel.getClass( + mainType, resultItem.keyInfo.subType, true + ); + + if (componentModel && componentModel instanceof ComponentModelClass) { + componentModel.mergeOption(newCptOption, this); + componentModel.optionUpdated(this); + } + else { + // PENDING Global as parent ? + componentModel = new ComponentModelClass( + newCptOption, this, this, + zrUtil.extend( + { + dependentModels: dependentModels, + componentIndex: index + }, + resultItem.keyInfo + ) + ); + // Call optionUpdated after init + componentModel.optionUpdated(this); + } + } + + componentsMap[mainType][index] = componentModel; + option[mainType][index] = componentModel.option; + }, this); + + // Backup series for filtering. + if (mainType === 'series') { + this._seriesIndices = createSeriesIndices(componentsMap.series); + } + } + }, + + /** + * Get option for output (cloned option and inner info removed) + * @public + * @return {Object} + */ + getOption: function () { + var option = zrUtil.clone(this.option); + + each(option, function (opts, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = modelUtil.normalizeToArray(opts); + for (var i = opts.length - 1; i >= 0; i--) { + // Remove options with inner id. + if (modelUtil.isIdInner(opts[i])) { + opts.splice(i, 1); + } + } + option[mainType] = opts; + } + }); + + delete option[OPTION_INNER_KEY]; + + return option; + }, + + /** + * @return {module:echarts/model/Model} + */ + getTheme: function () { + return this._theme; + }, + + /** + * @param {string} mainType + * @param {number} [idx=0] + * @return {module:echarts/model/Component} + */ + getComponent: function (mainType, idx) { + var list = this._componentsMap[mainType]; + if (list) { + return list[idx || 0]; + } + }, + + /** + * @param {Object} condition + * @param {string} condition.mainType + * @param {string} [condition.subType] If ignore, only query by mainType + * @param {number} [condition.index] Either input index or id or name. + * @param {string} [condition.id] Either input index or id or name. + * @param {string} [condition.name] Either input index or id or name. + * @return {Array.} + */ + queryComponents: function (condition) { + var mainType = condition.mainType; + if (!mainType) { + return []; + } + + var index = condition.index; + var id = condition.id; + var name = condition.name; + + var cpts = this._componentsMap[mainType]; + + if (!cpts || !cpts.length) { + return []; + } + + var result; + + if (index != null) { + if (!isArray(index)) { + index = [index]; + } + result = filter(map(index, function (idx) { + return cpts[idx]; + }), function (val) { + return !!val; + }); + } + else if (id != null) { + var isIdArray = isArray(id); + result = filter(cpts, function (cpt) { + return (isIdArray && indexOf(id, cpt.id) >= 0) + || (!isIdArray && cpt.id === id); + }); + } + else if (name != null) { + var isNameArray = isArray(name); + result = filter(cpts, function (cpt) { + return (isNameArray && indexOf(name, cpt.name) >= 0) + || (!isNameArray && cpt.name === name); + }); + } + + return filterBySubType(result, condition); + }, + + /** + * The interface is different from queryComponents, + * which is convenient for inner usage. + * + * @usage + * var result = findComponents( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}} + * ); + * var result = findComponents( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}} + * ); + * var result = findComponents( + * {mainType: 'series'}, + * function (model, index) {...} + * ); + * // result like [component0, componnet1, ...] + * + * @param {Object} condition + * @param {string} condition.mainType Mandatory. + * @param {string} [condition.subType] Optional. + * @param {Object} [condition.query] like {xxxIndex, xxxId, xxxName}, + * where xxx is mainType. + * If query attribute is null/undefined or has no index/id/name, + * do not filtering by query conditions, which is convenient for + * no-payload situations or when target of action is global. + * @param {Function} [condition.filter] parameter: component, return boolean. + * @return {Array.} + */ + findComponents: function (condition) { + var query = condition.query; + var mainType = condition.mainType; + + var queryCond = getQueryCond(query); + var result = queryCond + ? this.queryComponents(queryCond) + : this._componentsMap[mainType]; + + return doFilter(filterBySubType(result, condition)); + + function getQueryCond(q) { + var indexAttr = mainType + 'Index'; + var idAttr = mainType + 'Id'; + var nameAttr = mainType + 'Name'; + return q && ( + q.hasOwnProperty(indexAttr) + || q.hasOwnProperty(idAttr) + || q.hasOwnProperty(nameAttr) + ) + ? { + mainType: mainType, + // subType will be filtered finally. + index: q[indexAttr], + id: q[idAttr], + name: q[nameAttr] + } + : null; + } + + function doFilter(res) { + return condition.filter + ? filter(res, condition.filter) + : res; + } + }, + + /** + * @usage + * eachComponent('legend', function (legendModel, index) { + * ... + * }); + * eachComponent(function (componentType, model, index) { + * // componentType does not include subType + * // (componentType is 'xxx' but not 'xxx.aa') + * }); + * eachComponent( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}, + * function (model, index) {...} + * ); + * eachComponent( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}, + * function (model, index) {...} + * ); + * + * @param {string|Object=} mainType When mainType is object, the definition + * is the same as the method 'findComponents'. + * @param {Function} cb + * @param {*} context + */ + eachComponent: function (mainType, cb, context) { + var componentsMap = this._componentsMap; + + if (typeof mainType === 'function') { + context = cb; + cb = mainType; + each(componentsMap, function (components, componentType) { + each(components, function (component, index) { + cb.call(context, componentType, component, index); + }); + }); + } + else if (zrUtil.isString(mainType)) { + each(componentsMap[mainType], cb, context); + } + else if (isObject(mainType)) { + var queryResult = this.findComponents(mainType); + each(queryResult, cb, context); + } + }, + + /** + * @param {string} name + * @return {Array.} + */ + getSeriesByName: function (name) { + var series = this._componentsMap.series; + return filter(series, function (oneSeries) { + return oneSeries.name === name; + }); + }, + + /** + * @param {number} seriesIndex + * @return {module:echarts/model/Series} + */ + getSeriesByIndex: function (seriesIndex) { + return this._componentsMap.series[seriesIndex]; + }, + + /** + * @param {string} subType + * @return {Array.} + */ + getSeriesByType: function (subType) { + var series = this._componentsMap.series; + return filter(series, function (oneSeries) { + return oneSeries.subType === subType; + }); + }, + + /** + * @return {Array.} + */ + getSeries: function () { + return this._componentsMap.series.slice(); + }, + + /** + * After filtering, series may be different + * frome raw series. + * + * @param {Function} cb + * @param {*} context + */ + eachSeries: function (cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.series[rawSeriesIndex]; + cb.call(context, series, rawSeriesIndex); + }, this); + }, + + /** + * Iterate raw series before filtered. + * + * @param {Function} cb + * @param {*} context + */ + eachRawSeries: function (cb, context) { + each(this._componentsMap.series, cb, context); + }, + + /** + * After filtering, series may be different. + * frome raw series. + * + * @parma {string} subType + * @param {Function} cb + * @param {*} context + */ + eachSeriesByType: function (subType, cb, context) { + assertSeriesInitialized(this); + each(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.series[rawSeriesIndex]; + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }, + + /** + * Iterate raw series before filtered of given type. + * + * @parma {string} subType + * @param {Function} cb + * @param {*} context + */ + eachRawSeriesByType: function (subType, cb, context) { + return each(this.getSeriesByType(subType), cb, context); + }, + + /** + * @param {module:echarts/model/Series} seriesModel + */ + isSeriesFiltered: function (seriesModel) { + assertSeriesInitialized(this); + return zrUtil.indexOf(this._seriesIndices, seriesModel.componentIndex) < 0; + }, + + /** + * @param {Function} cb + * @param {*} context + */ + filterSeries: function (cb, context) { + assertSeriesInitialized(this); + var filteredSeries = filter( + this._componentsMap.series, cb, context + ); + this._seriesIndices = createSeriesIndices(filteredSeries); + }, + + restoreData: function () { + var componentsMap = this._componentsMap; + + this._seriesIndices = createSeriesIndices(componentsMap.series); + + var componentTypes = []; + each(componentsMap, function (components, componentType) { + componentTypes.push(componentType); + }); + + ComponentModel.topologicalTravel( + componentTypes, + ComponentModel.getAllClassMainTypes(), + function (componentType, dependencies) { + each(componentsMap[componentType], function (component) { + component.restoreData(); + }); + } + ); + } + + }); + + /** + * @inner + */ + function mergeTheme(option, theme) { + for (var name in theme) { + // 如果有 component model 则把具体的 merge 逻辑交给该 model 处理 + if (!ComponentModel.hasClass(name)) { + if (typeof theme[name] === 'object') { + option[name] = !option[name] + ? zrUtil.clone(theme[name]) + : zrUtil.merge(option[name], theme[name], false); + } + else { + if (option[name] == null) { + option[name] = theme[name]; + } + } + } + } + } + + function initBase(baseOption) { + baseOption = baseOption; + + // Using OPTION_INNER_KEY to mark that this option can not be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbiden. + this.option = {}; + this.option[OPTION_INNER_KEY] = 1; + + /** + * @type {Object.>} + * @private + */ + this._componentsMap = {}; + + /** + * Mapping between filtered series list and raw series list. + * key: filtered series indices, value: raw series indices. + * @type {Array.} + * @private + */ + this._seriesIndices = null; + + mergeTheme(baseOption, this._theme.option); + + // TODO Needs clone when merging to the unexisted property + zrUtil.merge(baseOption, globalDefault, false); + + this.mergeOption(baseOption); + } + + /** + * @inner + * @param {Array.|string} types model types + * @return {Object} key: {string} type, value: {Array.} models + */ + function getComponentsByTypes(componentsMap, types) { + if (!zrUtil.isArray(types)) { + types = types ? [types] : []; + } + + var ret = {}; + each(types, function (type) { + ret[type] = (componentsMap[type] || []).slice(); + }); + + return ret; + } + + /** + * @inner + */ + function makeKeyInfo(mainType, mapResult) { + // We use this id to hash component models and view instances + // in echarts. id can be specified by user, or auto generated. + + // The id generation rule ensures new view instance are able + // to mapped to old instance when setOption are called in + // no-merge mode. So we generate model id by name and plus + // type in view id. + + // name can be duplicated among components, which is convenient + // to specify multi components (like series) by one name. + + // Ensure that each id is distinct. + var idMap = {}; + + each(mapResult, function (item, index) { + var existCpt = item.exist; + existCpt && (idMap[existCpt.id] = item); + }); + + each(mapResult, function (item, index) { + var opt = item.option; + + zrUtil.assert( + !opt || opt.id == null || !idMap[opt.id] || idMap[opt.id] === item, + 'id duplicates: ' + (opt && opt.id) + ); + + opt && opt.id != null && (idMap[opt.id] = item); + + // Complete subType + if (isObject(opt)) { + var subType = determineSubType(mainType, opt, item.exist); + item.keyInfo = {mainType: mainType, subType: subType}; + } + }); + + // Make name and id. + each(mapResult, function (item, index) { + var existCpt = item.exist; + var opt = item.option; + var keyInfo = item.keyInfo; + + if (!isObject(opt)) { + return; + } + + // name can be overwitten. Consider case: axis.name = '20km'. + // But id generated by name will not be changed, which affect + // only in that case: setOption with 'not merge mode' and view + // instance will be recreated, which can be accepted. + keyInfo.name = opt.name != null + ? opt.name + '' + : existCpt + ? existCpt.name + : '\0-'; + + if (existCpt) { + keyInfo.id = existCpt.id; + } + else if (opt.id != null) { + keyInfo.id = opt.id + ''; + } + else { + // Consider this situatoin: + // optionA: [{name: 'a'}, {name: 'a'}, {..}] + // optionB [{..}, {name: 'a'}, {name: 'a'}] + // Series with the same name between optionA and optionB + // should be mapped. + var idNum = 0; + do { + keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++; + } + while (idMap[keyInfo.id]); + } + + idMap[keyInfo.id] = item; + }); + } + + /** + * @inner + */ + function determineSubType(mainType, newCptOption, existComponent) { + var subType = newCptOption.type + ? newCptOption.type + : existComponent + ? existComponent.subType + // Use determineSubType only when there is no existComponent. + : ComponentModel.determineSubType(mainType, newCptOption); + + // tooltip, markline, markpoint may always has no subType + return subType; + } + + /** + * @inner + */ + function createSeriesIndices(seriesModels) { + return map(seriesModels, function (series) { + return series.componentIndex; + }) || []; + } + + /** + * @inner + */ + function filterBySubType(components, condition) { + // Using hasOwnProperty for restrict. Consider + // subType is undefined in user payload. + return condition.hasOwnProperty('subType') + ? filter(components, function (cpt) { + return cpt.subType === condition.subType; + }) + : components; + } + + /** + * @inner + */ + function assertSeriesInitialized(ecModel) { + // Components that use _seriesIndices should depends on series component, + // which make sure that their initialization is after series. + if (!ecModel._seriesIndices) { + throw new Error('Series has not been initialized yet.'); + } + } + + module.exports = GlobalModel; + + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/core/util + */ + + var Gradient = __webpack_require__(4); + // 用于处理merge时无法遍历Date等对象的问题 + var BUILTIN_OBJECT = { + '[object Function]': 1, + '[object RegExp]': 1, + '[object Date]': 1, + '[object Error]': 1, + '[object CanvasGradient]': 1 + }; + + var objToString = Object.prototype.toString; + + var arrayProto = Array.prototype; + var nativeForEach = arrayProto.forEach; + var nativeFilter = arrayProto.filter; + var nativeSlice = arrayProto.slice; + var nativeMap = arrayProto.map; + var nativeReduce = arrayProto.reduce; + + /** + * @param {*} source + * @return {*} 拷贝后的新对象 + */ + function clone(source) { + if (typeof source == 'object' && source !== null) { + var result = source; + if (source instanceof Array) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + else if ( + !isBuildInObject(source) + // 是否为 dom 对象 + && !isDom(source) + ) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key)) { + result[key] = clone(source[key]); + } + } + } + + return result; + } + + return source; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} target + * @param {*} source + * @param {boolean} [overwrite=false] + */ + function merge(target, source, overwrite) { + // We should escapse that source is string + // and enter for ... in ... + if (!isObject(source) || !isObject(target)) { + return overwrite ? clone(source) : target; + } + + for (var key in source) { + if (source.hasOwnProperty(key)) { + var targetProp = target[key]; + var sourceProp = source[key]; + + if (isObject(sourceProp) + && isObject(targetProp) + && !isArray(sourceProp) + && !isArray(targetProp) + && !isDom(sourceProp) + && !isDom(targetProp) + && !isBuildInObject(sourceProp) + && !isBuildInObject(targetProp) + ) { + // 如果需要递归覆盖,就递归调用merge + merge(targetProp, sourceProp, overwrite); + } + else if (overwrite || !(key in target)) { + // 否则只处理overwrite为true,或者在目标对象中没有此属性的情况 + // NOTE,在 target[key] 不存在的时候也是直接覆盖 + target[key] = clone(source[key], true); + } + } + } + + return target; + } + + /** + * @param {Array} targetAndSources The first item is target, and the rests are source. + * @param {boolean} [overwrite=false] + * @return {*} target + */ + function mergeAll(targetAndSources, overwrite) { + var result = targetAndSources[0]; + for (var i = 1, len = targetAndSources.length; i < len; i++) { + result = merge(result, targetAndSources[i], overwrite); + } + return result; + } + + /** + * @param {*} target + * @param {*} source + * @memberOf module:zrender/core/util + */ + function extend(target, source) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + target[key] = source[key]; + } + } + return target; + } + + /** + * @param {*} target + * @param {*} source + * @param {boolen} [overlay=false] + * @memberOf module:zrender/core/util + */ + function defaults(target, source, overlay) { + for (var key in source) { + if (source.hasOwnProperty(key) + && (overlay ? source[key] != null : target[key] == null) + ) { + target[key] = source[key]; + } + } + return target; + } + + function createCanvas() { + return document.createElement('canvas'); + } + // FIXME + var _ctx; + function getContext() { + if (!_ctx) { + // Use util.createCanvas instead of createCanvas + // because createCanvas may be overwritten in different environment + _ctx = util.createCanvas().getContext('2d'); + } + return _ctx; + } + + /** + * 查询数组中元素的index + * @memberOf module:zrender/core/util + */ + function indexOf(array, value) { + if (array) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + } + return -1; + } + + /** + * 构造类继承关系 + * + * @memberOf module:zrender/core/util + * @param {Function} clazz 源类 + * @param {Function} baseClazz 基类 + */ + function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + function F() {} + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + + for (var prop in clazzPrototype) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; + } + + /** + * @memberOf module:zrender/core/util + * @param {Object|Function} target + * @param {Object|Function} sorce + * @param {boolean} overlay + */ + function mixin(target, source, overlay) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + + defaults(target, source, overlay); + } + + /** + * @param {Array|TypedArray} data + */ + function isArrayLike(data) { + if (! data) { + return; + } + if (typeof data == 'string') { + return false; + } + return typeof data.length == 'number'; + } + + /** + * 数组或对象遍历 + * @memberOf module:zrender/core/util + * @param {Object|Array} obj + * @param {Function} cb + * @param {*} [context] + */ + function each(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.forEach && obj.forEach === nativeForEach) { + obj.forEach(cb, context); + } + else if (obj.length === +obj.length) { + for (var i = 0, len = obj.length; i < len; i++) { + cb.call(context, obj[i], i, obj); + } + } + else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + cb.call(context, obj[key], key, obj); + } + } + } + } + + /** + * 数组映射 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function map(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.map && obj.map === nativeMap) { + return obj.map(cb, context); + } + else { + var result = []; + for (var i = 0, len = obj.length; i < len; i++) { + result.push(cb.call(context, obj[i], i, obj)); + } + return result; + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {Object} [memo] + * @param {*} [context] + * @return {Array} + */ + function reduce(obj, cb, memo, context) { + if (!(obj && cb)) { + return; + } + if (obj.reduce && obj.reduce === nativeReduce) { + return obj.reduce(cb, memo, context); + } + else { + for (var i = 0, len = obj.length; i < len; i++) { + memo = cb.call(context, memo, obj[i], i, obj); + } + return memo; + } + } + + /** + * 数组过滤 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function filter(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.filter && obj.filter === nativeFilter) { + return obj.filter(cb, context); + } + else { + var result = []; + for (var i = 0, len = obj.length; i < len; i++) { + if (cb.call(context, obj[i], i, obj)) { + result.push(obj[i]); + } + } + return result; + } + } + + /** + * 数组项查找 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ + function find(obj, cb, context) { + if (!(obj && cb)) { + return; + } + for (var i = 0, len = obj.length; i < len; i++) { + if (cb.call(context, obj[i], i, obj)) { + return obj[i]; + } + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Function} func + * @param {*} context + * @return {Function} + */ + function bind(func, context) { + var args = nativeSlice.call(arguments, 2); + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; + } + + /** + * @memberOf module:zrender/core/util + * @param {Function} func + * @return {Function} + */ + function curry(func) { + var args = nativeSlice.call(arguments, 1); + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isArray(value) { + return objToString.call(value) === '[object Array]'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isFunction(value) { + return typeof value === 'function'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isString(value) { + return objToString.call(value) === '[object String]'; + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isObject(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return type === 'function' || (!!value && type == 'object'); + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isBuildInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)] + || (value instanceof Gradient); + } + + /** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ + function isDom(value) { + return value && value.nodeType === 1 + && typeof(value.nodeName) == 'string'; + } + + /** + * If value1 is not null, then return value1, otherwise judget rest of values. + * @memberOf module:zrender/core/util + * @return {*} Final value + */ + function retrieve(values) { + for (var i = 0, len = arguments.length; i < len; i++) { + if (arguments[i] != null) { + return arguments[i]; + } + } + } + + /** + * @memberOf module:zrender/core/util + * @param {Array} arr + * @param {number} startIndex + * @param {number} endIndex + * @return {Array} + */ + function slice() { + return Function.call.apply(nativeSlice, arguments); + } + + /** + * @memberOf module:zrender/core/util + * @param {boolean} condition + * @param {string} message + */ + function assert(condition, message) { + if (!condition) { + throw new Error(message); + } + } + + var util = { + inherits: inherits, + mixin: mixin, + clone: clone, + merge: merge, + mergeAll: mergeAll, + extend: extend, + defaults: defaults, + getContext: getContext, + createCanvas: createCanvas, + indexOf: indexOf, + slice: slice, + find: find, + isArrayLike: isArrayLike, + each: each, + map: map, + reduce: reduce, + filter: filter, + bind: bind, + curry: curry, + isArray: isArray, + isString: isString, + isObject: isObject, + isFunction: isFunction, + isBuildInObject: isBuildInObject, + isDom: isDom, + retrieve: retrieve, + assert: assert, + noop: function () {} + }; + module.exports = util; + + + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + + + /** + * @param {Array.} colorStops + */ + var Gradient = function (colorStops) { + + this.colorStops = colorStops || []; + }; + + Gradient.prototype = { + + constructor: Gradient, + + addColorStop: function (offset, color) { + this.colorStops.push({ + + offset: offset, + + color: color + }); + } + }; + + module.exports = Gradient; + + +/***/ }, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + + + var formatUtil = __webpack_require__(6); + var nubmerUtil = __webpack_require__(7); + var zrUtil = __webpack_require__(3); + + var Model = __webpack_require__(8); + + var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle']; + + var modelUtil = {}; + + /** + * Create "each" method to iterate names. + * + * @pubilc + * @param {Array.} names + * @param {Array.=} attrs + * @return {Function} + */ + modelUtil.createNameEach = function (names, attrs) { + names = names.slice(); + var capitalNames = zrUtil.map(names, modelUtil.capitalFirst); + attrs = (attrs || []).slice(); + var capitalAttrs = zrUtil.map(attrs, modelUtil.capitalFirst); + + return function (callback, context) { + zrUtil.each(names, function (name, index) { + var nameObj = {name: name, capital: capitalNames[index]}; + + for (var j = 0; j < attrs.length; j++) { + nameObj[attrs[j]] = name + capitalAttrs[j]; + } + + callback.call(context, nameObj); + }); + }; + }; + + /** + * @public + */ + modelUtil.capitalFirst = function (str) { + return str ? str.charAt(0).toUpperCase() + str.substr(1) : str; + }; + + /** + * Iterate each dimension name. + * + * @public + * @param {Function} callback The parameter is like: + * { + * name: 'angle', + * capital: 'Angle', + * axis: 'angleAxis', + * axisIndex: 'angleAixs', + * index: 'angleIndex' + * } + * @param {Object} context + */ + modelUtil.eachAxisDim = modelUtil.createNameEach(AXIS_DIMS, ['axisIndex', 'axis', 'index']); + + /** + * If value is not array, then translate it to array. + * @param {*} value + * @return {Array} [value] or value + */ + modelUtil.normalizeToArray = function (value) { + return zrUtil.isArray(value) + ? value + : value == null + ? [] + : [value]; + }; + + /** + * If tow dataZoomModels has the same axis controlled, we say that they are 'linked'. + * dataZoomModels and 'links' make up one or more graphics. + * This function finds the graphic where the source dataZoomModel is in. + * + * @public + * @param {Function} forEachNode Node iterator. + * @param {Function} forEachEdgeType edgeType iterator + * @param {Function} edgeIdGetter Giving node and edgeType, return an array of edge id. + * @return {Function} Input: sourceNode, Output: Like {nodes: [], dims: {}} + */ + modelUtil.createLinkedNodesFinder = function (forEachNode, forEachEdgeType, edgeIdGetter) { + + return function (sourceNode) { + var result = { + nodes: [], + records: {} // key: edgeType.name, value: Object (key: edge id, value: boolean). + }; + + forEachEdgeType(function (edgeType) { + result.records[edgeType.name] = {}; + }); + + if (!sourceNode) { + return result; + } + + absorb(sourceNode, result); + + var existsLink; + do { + existsLink = false; + forEachNode(processSingleNode); + } + while (existsLink); + + function processSingleNode(node) { + if (!isNodeAbsorded(node, result) && isLinked(node, result)) { + absorb(node, result); + existsLink = true; + } + } + + return result; + }; + + function isNodeAbsorded(node, result) { + return zrUtil.indexOf(result.nodes, node) >= 0; + } + + function isLinked(node, result) { + var hasLink = false; + forEachEdgeType(function (edgeType) { + zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) { + result.records[edgeType.name][edgeId] && (hasLink = true); + }); + }); + return hasLink; + } + + function absorb(node, result) { + result.nodes.push(node); + forEachEdgeType(function (edgeType) { + zrUtil.each(edgeIdGetter(node, edgeType) || [], function (edgeId) { + result.records[edgeType.name][edgeId] = true; + }); + }); + } + }; + + /** + * Sync default option between normal and emphasis like `position` and `show` + * In case some one will write code like + * label: { + * normal: { + * show: false, + * position: 'outside', + * textStyle: { + * fontSize: 18 + * } + * }, + * emphasis: { + * show: true + * } + * } + * @param {Object} opt + * @param {Array.} subOpts + */ + modelUtil.defaultEmphasis = function (opt, subOpts) { + if (opt) { + var emphasisOpt = opt.emphasis = opt.emphasis || {}; + var normalOpt = opt.normal = opt.normal || {}; + + // Default emphasis option from normal + zrUtil.each(subOpts, function (subOptName) { + var val = zrUtil.retrieve(emphasisOpt[subOptName], normalOpt[subOptName]); + if (val != null) { + emphasisOpt[subOptName] = val; + } + }); + } + }; + + /** + * Create a model proxy to be used in tooltip for edge data, markLine data, markPoint data. + * @param {Object} opt + * @param {string} [opt.seriesIndex] + * @param {Object} [opt.name] + * @param {module:echarts/data/List} data + * @param {Array.} rawData + */ + modelUtil.createDataFormatModel = function (opt, data, rawData) { + var model = new Model(); + zrUtil.mixin(model, modelUtil.dataFormatMixin); + model.seriesIndex = opt.seriesIndex; + model.name = opt.name || ''; + + model.getData = function () { + return data; + }; + model.getRawDataArray = function () { + return rawData; + }; + return model; + }; + + /** + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method retieves value from data. + * @param {string|number|Date|Array|Object} dataItem + * @return {number|string|Date|Array.} + */ + modelUtil.getDataItemValue = function (dataItem) { + // Performance sensitive. + return dataItem && (dataItem.value == null ? dataItem : dataItem.value); + }; + + /** + * This helper method convert value in data. + * @param {string|number|Date} value + * @param {Object|string} [dimInfo] If string (like 'x'), dimType defaults 'number'. + */ + modelUtil.converDataValue = function (value, dimInfo) { + // Performance sensitive. + var dimType = dimInfo && dimInfo.type; + if (dimType === 'ordinal') { + return value; + } + + if (dimType === 'time' && !isFinite(value) && value != null && value !== '-') { + value = +nubmerUtil.parseDate(value); + } + + // dimType defaults 'number'. + // If dimType is not ordinal and value is null or undefined or NaN or '-', + // parse to NaN. + return (value == null || value === '') + ? NaN : +value; // If string (like '-'), using '+' parse to NaN + }; + + modelUtil.dataFormatMixin = { + /** + * Get params for formatter + * @param {number} dataIndex + * @return {Object} + */ + getDataParams: function (dataIndex) { + var data = this.getData(); + + var seriesIndex = this.seriesIndex; + var seriesName = this.name; + + var rawValue = this.getRawValue(dataIndex); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex, true); + + // Data may not exists in the option given by user + var rawDataArray = this.getRawDataArray(); + var itemOpt = rawDataArray && rawDataArray[rawDataIndex]; + + return { + seriesIndex: seriesIndex, + seriesName: seriesName, + name: name, + dataIndex: rawDataIndex, + data: itemOpt, + value: rawValue, + color: data.getItemVisual(dataIndex, 'color'), + + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ['seriesName', 'name', 'value'] + }; + }, + + /** + * Format label + * @param {number} dataIndex + * @param {string} [status='normal'] 'normal' or 'emphasis' + * @param {Function|string} [formatter] Default use the `itemStyle[status].label.formatter` + * @return {string} + */ + getFormattedLabel: function (dataIndex, status, formatter) { + status = status || 'normal'; + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + + var params = this.getDataParams(dataIndex); + if (formatter == null) { + formatter = itemModel.get(['label', status, 'formatter']); + } + + if (typeof formatter === 'function') { + params.status = status; + return formatter(params); + } + else if (typeof formatter === 'string') { + return formatUtil.formatTpl(formatter, params); + } + }, + + /** + * Get raw value in option + * @param {number} idx + * @return {Object} + */ + getRawValue: function (idx) { + var itemModel = this.getData().getItemModel(idx); + if (itemModel && itemModel.option != null) { + var dataItem = itemModel.option; + return (zrUtil.isObject(dataItem) && !zrUtil.isArray(dataItem)) + ? dataItem.value : dataItem; + } + } + }; + + /** + * Mapping to exists for merge. + * + * @public + * @param {Array.|Array.} exists + * @param {Object|Array.} newCptOptions + * @return {Array.} Result, like [{exist: ..., option: ...}, {}], + * which order is the same as exists. + */ + modelUtil.mappingToExists = function (exists, newCptOptions) { + // Mapping by the order by original option (but not order of + // new option) in merge mode. Because we should ensure + // some specified index (like xAxisIndex) is consistent with + // original option, which is easy to understand, espatially in + // media query. And in most case, merge option is used to + // update partial option but not be expected to change order. + newCptOptions = (newCptOptions || []).slice(); + + var result = zrUtil.map(exists || [], function (obj, index) { + return {exist: obj}; + }); + + // Mapping by id or name if specified. + zrUtil.each(newCptOptions, function (cptOption, index) { + if (!zrUtil.isObject(cptOption)) { + return; + } + + for (var i = 0; i < result.length; i++) { + var exist = result[i].exist; + if (!result[i].option // Consider name: two map to one. + && ( + // id has highest priority. + (cptOption.id != null && exist.id === cptOption.id + '') + || (cptOption.name != null + && !modelUtil.isIdInner(cptOption) + && !modelUtil.isIdInner(exist) + && exist.name === cptOption.name + '' + ) + ) + ) { + result[i].option = cptOption; + newCptOptions[index] = null; + break; + } + } + }); + + // Otherwise mapping by index. + zrUtil.each(newCptOptions, function (cptOption, index) { + if (!zrUtil.isObject(cptOption)) { + return; + } + + var i = 0; + for (; i < result.length; i++) { + var exist = result[i].exist; + if (!result[i].option + && !modelUtil.isIdInner(exist) + // Caution: + // Do not overwrite id. But name can be overwritten, + // because axis use name as 'show label text'. + // 'exist' always has id and name and we dont + // need to check it. + && cptOption.id == null + ) { + result[i].option = cptOption; + break; + } + } + + if (i >= result.length) { + result.push({option: cptOption}); + } + }); + + return result; + }; + + /** + * @public + * @param {Object} cptOption + * @return {boolean} + */ + modelUtil.isIdInner = function (cptOption) { + return zrUtil.isObject(cptOption) + && cptOption.id + && (cptOption.id + '').indexOf('\0_ec_\0') === 0; + }; + + module.exports = modelUtil; + + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + + /** + * 每三位默认加,格式化 + * @type {string|number} x + */ + function addCommas(x) { + if (isNaN(x)) { + return '-'; + } + x = (x + '').split('.'); + return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,') + + (x.length > 1 ? ('.' + x[1]) : ''); + } + + /** + * @param {string} str + * @return {string} str + */ + function toCamelCase(str) { + return str.toLowerCase().replace(/-(.)/g, function(match, group1) { + return group1.toUpperCase(); + }); + } + + /** + * Normalize css liked array configuration + * e.g. + * 3 => [3, 3, 3, 3] + * [4, 2] => [4, 2, 4, 2] + * [4, 3, 2] => [4, 3, 2, 3] + * @param {number|Array.} val + */ + function normalizeCssArray(val) { + var len = val.length; + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + else if (len === 2) { + // vertical | horizontal + return [val[0], val[1], val[0], val[1]]; + } + else if (len === 3) { + // top | horizontal | bottom + return [val[0], val[1], val[2], val[1]]; + } + return val; + } + + function encodeHTML(source) { + return String(source) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + + function wrapVar(varName, seriesIdx) { + return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}'; + } + /** + * Template formatter + * @param {string} tpl + * @param {Array.|Object} paramsList + * @return {string} + */ + function formatTpl(tpl, paramsList) { + if (!zrUtil.isArray(paramsList)) { + paramsList = [paramsList]; + } + var seriesLen = paramsList.length; + if (!seriesLen) { + return ''; + } + + var $vars = paramsList[0].$vars; + for (var i = 0; i < $vars.length; i++) { + var alias = TPL_VAR_ALIAS[i]; + tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); + } + for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { + for (var k = 0; k < $vars.length; k++) { + tpl = tpl.replace( + wrapVar(TPL_VAR_ALIAS[k], seriesIdx), + paramsList[seriesIdx][$vars[k]] + ); + } + } + + return tpl; + } + + /** + * ISO Date format + * @param {string} tpl + * @param {number} value + * @inner + */ + function formatTime(tpl, value) { + if (tpl === 'week' + || tpl === 'month' + || tpl === 'quarter' + || tpl === 'half-year' + || tpl === 'year' + ) { + tpl = 'MM-dd\nyyyy'; + } + + var date = numberUtil.parseDate(value); + var y = date.getFullYear(); + var M = date.getMonth() + 1; + var d = date.getDate(); + var h = date.getHours(); + var m = date.getMinutes(); + var s = date.getSeconds(); + + tpl = tpl.replace('MM', s2d(M)) + .toLowerCase() + .replace('yyyy', y) + .replace('yy', y % 100) + .replace('dd', s2d(d)) + .replace('d', d) + .replace('hh', s2d(h)) + .replace('h', h) + .replace('mm', s2d(m)) + .replace('m', m) + .replace('ss', s2d(s)) + .replace('s', s); + + return tpl; + } + + /** + * @param {string} str + * @return {string} + * @inner + */ + function s2d(str) { + return str < 10 ? ('0' + str) : str; + } + + module.exports = { + + normalizeCssArray: normalizeCssArray, + + addCommas: addCommas, + + toCamelCase: toCamelCase, + + encodeHTML: encodeHTML, + + formatTpl: formatTpl, + + formatTime: formatTime + }; + + +/***/ }, +/* 7 */ +/***/ function(module, exports) { + + /** + * 数值处理模块 + * @module echarts/util/number + */ + + + + var number = {}; + + var RADIAN_EPSILON = 1e-4; + + function _trim(str) { + return str.replace(/^\s+/, '').replace(/\s+$/, ''); + } + + /** + * Linear mapping a value from domain to range + * @memberOf module:echarts/util/number + * @param {(number|Array.)} val + * @param {Array.} domain Domain extent domain[0] can be bigger than domain[1] + * @param {Array.} range Range extent range[0] can be bigger than range[1] + * @param {boolean} clamp + * @return {(number|Array.} + */ + number.linearMap = function (val, domain, range, clamp) { + + var sub = domain[1] - domain[0]; + + if (sub === 0) { + return (range[0] + range[1]) / 2; + } + var t = (val - domain[0]) / sub; + + if (clamp) { + t = Math.min(Math.max(t, 0), 1); + } + + return t * (range[1] - range[0]) + range[0]; + }; + + /** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + * @memberOf module:echarts/util/number + * @param {string|number} percent + * @param {number} all + * @return {number} + */ + number.parsePercent = function(percent, all) { + switch (percent) { + case 'center': + case 'middle': + percent = '50%'; + break; + case 'left': + case 'top': + percent = '0%'; + break; + case 'right': + case 'bottom': + percent = '100%'; + break; + } + if (typeof percent === 'string') { + if (_trim(percent).match(/%$/)) { + return parseFloat(percent) / 100 * all; + } + + return parseFloat(percent); + } + + return percent == null ? NaN : +percent; + }; + + /** + * Fix rounding error of float numbers + * @param {number} x + * @return {number} + */ + number.round = function (x) { + // PENDING + return +(+x).toFixed(12); + }; + + number.asc = function (arr) { + arr.sort(function (a, b) { + return a - b; + }); + return arr; + }; + + /** + * Get precision + * @param {number} val + */ + number.getPrecision = function (val) { + if (isNaN(val)) { + return 0; + } + // It is much faster than methods converting number to string as follows + // var tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + var e = 1; + var count = 0; + while (Math.round(val * e) / e !== val) { + e *= 10; + count++; + } + return count; + }; + + /** + * @param {Array.} dataExtent + * @param {Array.} pixelExtent + * @return {number} precision + */ + number.getPixelPrecision = function (dataExtent, pixelExtent) { + var log = Math.log; + var LN10 = Math.LN10; + var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); + var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); + return Math.max( + -dataQuantity + sizeQuantity, + 0 + ); + }; + + // Number.MAX_SAFE_INTEGER, ie do not support. + number.MAX_SAFE_INTEGER = 9007199254740991; + + /** + * To 0 - 2 * PI, considering negative radian. + * @param {number} radian + * @return {number} + */ + number.remRadian = function (radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; + }; + + /** + * @param {type} radian + * @return {boolean} + */ + number.isRadianAroundZero = function (val) { + return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; + }; + + /** + * @param {string|Date|number} value + * @return {number} timestamp + */ + number.parseDate = function (value) { + return value instanceof Date + ? value + : new Date( + typeof value === 'string' + ? value.replace(/-/g, '/') + : Math.round(value) + ); + }; + + // "Nice Numbers for Graph Labels" of Graphic Gems + /** + * find a “nice” number approximately equal to x. Round the number if round = true, take ceiling if round = false + * The primary observation is that the “nicest” numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers. + * @param {number} val + * @param {boolean} round + * @return {number} + */ + number.nice = function (val, round) { + var exp = Math.floor(Math.log(val) / Math.LN10); + var exp10 = Math.pow(10, exp); + var f = val / exp10; // between 1 and 10 + var nf; + if (round) { + if (f < 1.5) { nf = 1; } + else if (f < 2.5) { nf = 2; } + else if (f < 4) { nf = 3; } + else if (f < 7) { nf = 5; } + else { nf = 10; } + } + else { + if (f < 1) { nf = 1; } + else if (f < 2) { nf = 2; } + else if (f < 3) { nf = 3; } + else if (f < 5) { nf = 5; } + else { nf = 10; } + } + return nf * exp10; + }; + + module.exports = number; + + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/model/Model + */ + + + var zrUtil = __webpack_require__(3); + var clazzUtil = __webpack_require__(9); + + /** + * @alias module:echarts/model/Model + * @constructor + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {module:echarts/model/Global} ecModel + * @param {Object} extraOpt + */ + function Model(option, parentModel, ecModel, extraOpt) { + /** + * @type {module:echarts/model/Model} + * @readOnly + */ + this.parentModel = parentModel; + + /** + * @type {module:echarts/model/Global} + * @readOnly + */ + this.ecModel = ecModel; + + /** + * @type {Object} + * @protected + */ + this.option = option; + + // Simple optimization + if (this.init) { + if (arguments.length <= 4) { + this.init(option, parentModel, ecModel, extraOpt); + } + else { + this.init.apply(this, arguments); + } + } + } + + Model.prototype = { + + constructor: Model, + + /** + * Model 的初始化函数 + * @param {Object} option + */ + init: null, + + /** + * 从新的 Option merge + */ + mergeOption: function (option) { + zrUtil.merge(this.option, option, true); + }, + + /** + * @param {string} path + * @param {boolean} [ignoreParent=false] + * @return {*} + */ + get: function (path, ignoreParent) { + if (!path) { + return this.option; + } + + if (typeof path === 'string') { + path = path.split('.'); + } + + var obj = this.option; + var parentModel = this.parentModel; + for (var i = 0; i < path.length; i++) { + // obj could be number/string/... (like 0) + obj = (obj && typeof obj === 'object') ? obj[path[i]] : null; + if (obj == null) { + break; + } + } + if (obj == null && parentModel && !ignoreParent) { + obj = parentModel.get(path); + } + return obj; + }, + + /** + * @param {string} key + * @param {boolean} [ignoreParent=false] + * @return {*} + */ + getShallow: function (key, ignoreParent) { + var option = this.option; + var val = option && option[key]; + var parentModel = this.parentModel; + if (val == null && parentModel && !ignoreParent) { + val = parentModel.getShallow(key); + } + return val; + }, + + /** + * @param {string} path + * @param {module:echarts/model/Model} [parentModel] + * @return {module:echarts/model/Model} + */ + getModel: function (path, parentModel) { + var obj = this.get(path, true); + var thisParentModel = this.parentModel; + var model = new Model( + obj, parentModel || (thisParentModel && thisParentModel.getModel(path)), + this.ecModel + ); + return model; + }, + + /** + * If model has option + */ + isEmpty: function () { + return this.option == null; + }, + + restoreData: function () {}, + + // Pending + clone: function () { + var Ctor = this.constructor; + return new Ctor(zrUtil.clone(this.option)); + }, + + setReadOnly: function (properties) { + clazzUtil.setReadOnly(this, properties); + } + }; + + // Enable Model.extend. + clazzUtil.enableClassExtend(Model); + + var mixin = zrUtil.mixin; + mixin(Model, __webpack_require__(10)); + mixin(Model, __webpack_require__(12)); + mixin(Model, __webpack_require__(13)); + mixin(Model, __webpack_require__(18)); + + module.exports = Model; + + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var clazz = {}; + + var TYPE_DELIMITER = '.'; + var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___'; + /** + * @public + */ + var parseClassType = clazz.parseClassType = function (componentType) { + var ret = {main: '', sub: ''}; + if (componentType) { + componentType = componentType.split(TYPE_DELIMITER); + ret.main = componentType[0] || ''; + ret.sub = componentType[1] || ''; + } + return ret; + }; + /** + * @public + */ + clazz.enableClassExtend = function (RootClass, preConstruct) { + RootClass.extend = function (proto) { + var ExtendedClass = function () { + preConstruct && preConstruct.apply(this, arguments); + RootClass.apply(this, arguments); + }; + + zrUtil.extend(ExtendedClass.prototype, proto); + + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + zrUtil.inherits(ExtendedClass, this); + ExtendedClass.superClass = this; + + return ExtendedClass; + }; + }; + + // superCall should have class info, which can not be fetch from 'this'. + // Consider this case: + // class A has method f, + // class B inherits class A, overrides method f, f call superApply('f'), + // class C inherits class B, do not overrides method f, + // then when method of class C is called, dead loop occured. + function superCall(context, methodName) { + var args = zrUtil.slice(arguments, 2); + return this.superClass.prototype[methodName].apply(context, args); + } + + function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); + } + + /** + * @param {Object} entity + * @param {Object} options + * @param {boolean} [options.registerWhenExtend] + * @public + */ + clazz.enableClassManagement = function (entity, options) { + options = options || {}; + + /** + * Component model classes + * key: componentType, + * value: + * componentClass, when componentType is 'xxx' + * or Object., when componentType is 'xxx.yy' + * @type {Object} + */ + var storage = {}; + + entity.registerClass = function (Clazz, componentType) { + if (componentType) { + componentType = parseClassType(componentType); + + if (!componentType.sub) { + if (storage[componentType.main]) { + throw new Error(componentType.main + 'exists.'); + } + storage[componentType.main] = Clazz; + } + else if (componentType.sub !== IS_CONTAINER) { + var container = makeContainer(componentType); + container[componentType.sub] = Clazz; + } + } + return Clazz; + }; + + entity.getClass = function (componentTypeMain, subType, throwWhenNotFound) { + var Clazz = storage[componentTypeMain]; + + if (Clazz && Clazz[IS_CONTAINER]) { + Clazz = subType ? Clazz[subType] : null; + } + + if (throwWhenNotFound && !Clazz) { + throw new Error( + 'Component ' + componentTypeMain + '.' + (subType || '') + ' not exists. Load it first.' + ); + } + + return Clazz; + }; + + entity.getClassesByMainType = function (componentType) { + componentType = parseClassType(componentType); + + var result = []; + var obj = storage[componentType.main]; + + if (obj && obj[IS_CONTAINER]) { + zrUtil.each(obj, function (o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } + else { + result.push(obj); + } + + return result; + }; + + entity.hasClass = function (componentType) { + // Just consider componentType.main. + componentType = parseClassType(componentType); + return !!storage[componentType.main]; + }; + + /** + * @return {Array.} Like ['aa', 'bb'], but can not be ['aa.xx'] + */ + entity.getAllClassMainTypes = function () { + var types = []; + zrUtil.each(storage, function (obj, type) { + types.push(type); + }); + return types; + }; + + /** + * If a main type is container and has sub types + * @param {string} mainType + * @return {boolean} + */ + entity.hasSubTypes = function (componentType) { + componentType = parseClassType(componentType); + var obj = storage[componentType.main]; + return obj && obj[IS_CONTAINER]; + }; + + entity.parseClassType = parseClassType; + + function makeContainer(componentType) { + var container = storage[componentType.main]; + if (!container || !container[IS_CONTAINER]) { + container = storage[componentType.main] = {}; + container[IS_CONTAINER] = true; + } + return container; + } + + if (options.registerWhenExtend) { + var originalExtend = entity.extend; + if (originalExtend) { + entity.extend = function (proto) { + var ExtendedClass = originalExtend.call(this, proto); + return entity.registerClass(ExtendedClass, proto.type); + }; + } + } + + return entity; + }; + + /** + * @param {string|Array.} properties + */ + clazz.setReadOnly = function (obj, properties) { + // FIXME It seems broken in IE8 simulation of IE11 + // if (!zrUtil.isArray(properties)) { + // properties = properties != null ? [properties] : []; + // } + // zrUtil.each(properties, function (prop) { + // var value = obj[prop]; + + // Object.defineProperty + // && Object.defineProperty(obj, prop, { + // value: value, writable: false + // }); + // zrUtil.isArray(obj[prop]) + // && Object.freeze + // && Object.freeze(obj[prop]); + // }); + }; + + module.exports = clazz; + + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + + var getLineStyle = __webpack_require__(11)( + [ + ['lineWidth', 'width'], + ['stroke', 'color'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ); + module.exports = { + getLineStyle: function (excludes) { + var style = getLineStyle.call(this, excludes); + var lineDash = this.getLineDash(); + lineDash && (style.lineDash = lineDash); + return style; + }, + + getLineDash: function () { + var lineType = this.get('type'); + return (lineType === 'solid' || lineType == null) ? null + : (lineType === 'dashed' ? [5, 5] : [1, 1]); + } + }; + + +/***/ }, +/* 11 */ +/***/ function(module, exports, __webpack_require__) { + + // TODO Parse shadow style + // TODO Only shallow path support + + var zrUtil = __webpack_require__(3); + + module.exports = function (properties) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + return function (excludes) { + var style = {}; + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + if (excludes && zrUtil.indexOf(excludes, propName) >= 0) { + continue; + } + var val = this.getShallow(propName); + if (val != null) { + style[properties[i][0]] = val; + } + } + return style; + }; + }; + + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getAreaStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['opacity'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 13 */ +/***/ function(module, exports, __webpack_require__) { + + + + var textContain = __webpack_require__(14); + + function getShallow(model, path) { + return model && model.getShallow(path); + } + + module.exports = { + /** + * Get color property or get color from option.textStyle.color + * @return {string} + */ + getTextColor: function () { + var ecModel = this.ecModel; + return this.getShallow('color') + || (ecModel && ecModel.get('textStyle.color')); + }, + + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + getFont: function () { + var ecModel = this.ecModel; + var gTextStyleModel = ecModel && ecModel.getModel('textStyle'); + return [ + // FIXME in node-canvas fontWeight is before fontStyle + this.getShallow('fontStyle') || getShallow(gTextStyleModel, 'fontStyle'), + this.getShallow('fontWeight') || getShallow(gTextStyleModel, 'fontWeight'), + (this.getShallow('fontSize') || getShallow(gTextStyleModel, 'fontSize') || 12) + 'px', + this.getShallow('fontFamily') || getShallow(gTextStyleModel, 'fontFamily') || 'sans-serif' + ].join(' '); + }, + + getTextRect: function (text) { + var textStyle = this.get('textStyle') || {}; + return textContain.getBoundingRect( + text, + this.getFont(), + textStyle.align, + textStyle.baseline + ); + }, + + ellipsis: function (text, containerWidth, options) { + return textContain.ellipsis( + text, this.getFont(), containerWidth, options + ); + } + }; + + +/***/ }, +/* 14 */ +/***/ function(module, exports, __webpack_require__) { + + + + var textWidthCache = {}; + var textWidthCacheCounter = 0; + var TEXT_CACHE_MAX = 5000; + + var util = __webpack_require__(3); + var BoundingRect = __webpack_require__(15); + + function getTextWidth(text, textFont) { + var key = text + ':' + textFont; + if (textWidthCache[key]) { + return textWidthCache[key]; + } + + var textLines = (text + '').split('\n'); + var width = 0; + + for (var i = 0, l = textLines.length; i < l; i++) { + // measureText 可以被覆盖以兼容不支持 Canvas 的环境 + width = Math.max(textContain.measureText(textLines[i], textFont).width, width); + } + + if (textWidthCacheCounter > TEXT_CACHE_MAX) { + textWidthCacheCounter = 0; + textWidthCache = {}; + } + textWidthCacheCounter++; + textWidthCache[key] = width; + + return width; + } + + function getTextRect(text, textFont, textAlign, textBaseline) { + var textLineLen = ((text || '') + '').split('\n').length; + + var width = getTextWidth(text, textFont); + // FIXME 高度计算比较粗暴 + var lineHeight = getTextWidth('国', textFont); + var height = textLineLen * lineHeight; + + var rect = new BoundingRect(0, 0, width, height); + // Text has a special line height property + rect.lineHeight = lineHeight; + + switch (textBaseline) { + case 'bottom': + case 'alphabetic': + rect.y -= lineHeight; + break; + case 'middle': + rect.y -= lineHeight / 2; + break; + // case 'hanging': + // case 'top': + } + + // FIXME Right to left language + switch (textAlign) { + case 'end': + case 'right': + rect.x -= rect.width; + break; + case 'center': + rect.x -= rect.width / 2; + break; + // case 'start': + // case 'left': + } + + return rect; + } + + function adjustTextPositionOnRect(textPosition, rect, textRect, distance) { + + var x = rect.x; + var y = rect.y; + + var height = rect.height; + var width = rect.width; + + var textHeight = textRect.height; + + var halfHeight = height / 2 - textHeight / 2; + + var textAlign = 'left'; + + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textAlign = 'left'; + break; + case 'top': + x += width / 2; + y -= distance + textHeight; + textAlign = 'center'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textAlign = 'left'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - textHeight - distance; + textAlign = 'center'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + textAlign = 'left'; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - textHeight - distance; + break; + case 'insideBottomRight': + x += width - distance; + y += height - textHeight - distance; + textAlign = 'right'; + break; + } + + return { + x: x, + y: y, + textAlign: textAlign, + textBaseline: 'top' + }; + } + + /** + * Show ellipsis if overflow. + * + * @param {string} text + * @param {string} textFont + * @param {string} containerWidth + * @param {Object} [options] + * @param {number} [options.ellipsis='...'] + * @param {number} [options.maxIterations=3] + * @param {number} [options.minCharacters=3] + * @return {string} + */ + function textEllipsis(text, textFont, containerWidth, options) { + if (!containerWidth) { + return ''; + } + + options = util.defaults({ + ellipsis: '...', + minCharacters: 3, + maxIterations: 3, + cnCharWidth: getTextWidth('国', textFont), + // FIXME + // 未考虑非等宽字体 + ascCharWidth: getTextWidth('a', textFont) + }, options, true); + + containerWidth -= getTextWidth(options.ellipsis); + + var textLines = (text + '').split('\n'); + + for (var i = 0, len = textLines.length; i < len; i++) { + textLines[i] = textLineTruncate( + textLines[i], textFont, containerWidth, options + ); + } + + return textLines.join('\n'); + } + + function textLineTruncate(text, textFont, containerWidth, options) { + // FIXME + // 粗糙得写的,尚未考虑性能和各种语言、字体的效果。 + for (var i = 0;; i++) { + var lineWidth = getTextWidth(text, textFont); + + if (lineWidth < containerWidth || i >= options.maxIterations) { + text += options.ellipsis; + break; + } + + var subLength = i === 0 + ? estimateLength(text, containerWidth, options) + : Math.floor(text.length * containerWidth / lineWidth); + + if (subLength < options.minCharacters) { + text = ''; + break; + } + + text = text.substr(0, subLength); + } + + return text; + } + + function estimateLength(text, containerWidth, options) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < containerWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) + ? options.ascCharWidth : options.cnCharWidth; + } + return i; + } + + var textContain = { + + getWidth: getTextWidth, + + getBoundingRect: getTextRect, + + adjustTextPositionOnRect: adjustTextPositionOnRect, + + ellipsis: textEllipsis, + + measureText: function (text, textFont) { + var ctx = util.getContext(); + ctx.font = textFont; + return ctx.measureText(text); + } + }; + + module.exports = textContain; + + +/***/ }, +/* 15 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module echarts/core/BoundingRect + */ + + + var vec2 = __webpack_require__(16); + var matrix = __webpack_require__(17); + + var v2ApplyTransform = vec2.applyTransform; + var mathMin = Math.min; + var mathAbs = Math.abs; + var mathMax = Math.max; + /** + * @alias module:echarts/core/BoundingRect + */ + function BoundingRect(x, y, width, height) { + /** + * @type {number} + */ + this.x = x; + /** + * @type {number} + */ + this.y = y; + /** + * @type {number} + */ + this.width = width; + /** + * @type {number} + */ + this.height = height; + } + + BoundingRect.prototype = { + + constructor: BoundingRect, + + /** + * @param {module:echarts/core/BoundingRect} other + */ + union: function (other) { + var x = mathMin(other.x, this.x); + var y = mathMin(other.y, this.y); + + this.width = mathMax( + other.x + other.width, + this.x + this.width + ) - x; + this.height = mathMax( + other.y + other.height, + this.y + this.height + ) - y; + this.x = x; + this.y = y; + }, + + /** + * @param {Array.} m + * @methods + */ + applyTransform: (function () { + var min = []; + var max = []; + return function (m) { + // In case usage like this + // el.getBoundingRect().applyTransform(el.transform) + // And element has no transform + if (!m) { + return; + } + min[0] = this.x; + min[1] = this.y; + max[0] = this.x + this.width; + max[1] = this.y + this.height; + + v2ApplyTransform(min, min, m); + v2ApplyTransform(max, max, m); + + this.x = mathMin(min[0], max[0]); + this.y = mathMin(min[1], max[1]); + this.width = mathAbs(max[0] - min[0]); + this.height = mathAbs(max[1] - min[1]); + }; + })(), + + /** + * Calculate matrix of transforming from self to target rect + * @param {module:zrender/core/BoundingRect} b + * @return {Array.} + */ + calculateTransform: function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + + var m = matrix.create(); + + // 矩阵右乘 + matrix.translate(m, m, [-a.x, -a.y]); + matrix.scale(m, m, [sx, sy]); + matrix.translate(m, m, [b.x, b.y]); + + return m; + }, + + /** + * @param {(module:echarts/core/BoundingRect|Object)} b + * @return {boolean} + */ + intersect: function (b) { + var a = this; + var ax0 = a.x; + var ax1 = a.x + a.width; + var ay0 = a.y; + var ay1 = a.y + a.height; + + var bx0 = b.x; + var bx1 = b.x + b.width; + var by0 = b.y; + var by1 = b.y + b.height; + + return ! (ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + }, + + contain: function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }, + + /** + * @return {module:echarts/core/BoundingRect} + */ + clone: function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }, + + /** + * Copy from another rect + */ + copy: function (other) { + this.x = other.x; + this.y = other.y; + this.width = other.width; + this.height = other.height; + } + }; + + module.exports = BoundingRect; + + +/***/ }, +/* 16 */ +/***/ function(module, exports) { + + + var ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + + /** + * @typedef {Float32Array|Array.} Vector2 + */ + /** + * 二维向量类 + * @exports zrender/tool/vector + */ + var vector = { + /** + * 创建一个向量 + * @param {number} [x=0] + * @param {number} [y=0] + * @return {Vector2} + */ + create: function (x, y) { + var out = new ArrayCtor(2); + out[0] = x || 0; + out[1] = y || 0; + return out; + }, + + /** + * 复制向量数据 + * @param {Vector2} out + * @param {Vector2} v + * @return {Vector2} + */ + copy: function (out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; + }, + + /** + * 克隆一个向量 + * @param {Vector2} v + * @return {Vector2} + */ + clone: function (v) { + var out = new ArrayCtor(2); + out[0] = v[0]; + out[1] = v[1]; + return out; + }, + + /** + * 设置向量的两个项 + * @param {Vector2} out + * @param {number} a + * @param {number} b + * @return {Vector2} 结果 + */ + set: function (out, a, b) { + out[0] = a; + out[1] = b; + return out; + }, + + /** + * 向量相加 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + add: function (out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; + }, + + /** + * 向量缩放后相加 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + * @param {number} a + */ + scaleAndAdd: function (out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; + }, + + /** + * 向量相减 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + sub: function (out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; + }, + + /** + * 向量长度 + * @param {Vector2} v + * @return {number} + */ + len: function (v) { + return Math.sqrt(this.lenSquare(v)); + }, + + /** + * 向量长度平方 + * @param {Vector2} v + * @return {number} + */ + lenSquare: function (v) { + return v[0] * v[0] + v[1] * v[1]; + }, + + /** + * 向量乘法 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + mul: function (out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; + }, + + /** + * 向量除法 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + div: function (out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; + }, + + /** + * 向量点乘 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + dot: function (v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; + }, + + /** + * 向量缩放 + * @param {Vector2} out + * @param {Vector2} v + * @param {number} s + */ + scale: function (out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; + }, + + /** + * 向量归一化 + * @param {Vector2} out + * @param {Vector2} v + */ + normalize: function (out, v) { + var d = vector.len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } + else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; + }, + + /** + * 计算向量间距离 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + distance: function (v1, v2) { + return Math.sqrt( + (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]) + ); + }, + + /** + * 向量距离平方 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ + distanceSquare: function (v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); + }, + + /** + * 求负向量 + * @param {Vector2} out + * @param {Vector2} v + */ + negate: function (out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; + }, + + /** + * 插值两个点 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + * @param {number} t + */ + lerp: function (out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; + }, + + /** + * 矩阵左乘向量 + * @param {Vector2} out + * @param {Vector2} v + * @param {Vector2} m + */ + applyTransform: function (out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; + }, + /** + * 求两个向量最小值 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + min: function (out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; + }, + /** + * 求两个向量最大值 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ + max: function (out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; + } + }; + + vector.length = vector.len; + vector.lengthSquare = vector.lenSquare; + vector.dist = vector.distance; + vector.distSquare = vector.distanceSquare; + + module.exports = vector; + + + +/***/ }, +/* 17 */ +/***/ function(module, exports) { + + + var ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + /** + * 3x2矩阵操作类 + * @exports zrender/tool/matrix + */ + var matrix = { + /** + * 创建一个单位矩阵 + * @return {Float32Array|Array.} + */ + create : function() { + var out = new ArrayCtor(6); + matrix.identity(out); + + return out; + }, + /** + * 设置矩阵为单位矩阵 + * @param {Float32Array|Array.} out + */ + identity : function(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; + }, + /** + * 复制矩阵 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} m + */ + copy: function(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; + }, + /** + * 矩阵相乘 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} m1 + * @param {Float32Array|Array.} m2 + */ + mul : function (out, m1, m2) { + // Consider matrix.mul(m, m2, m); + // where out is the same as m2. + // So use temp variable to escape error. + var out0 = m1[0] * m2[0] + m1[2] * m2[1]; + var out1 = m1[1] * m2[0] + m1[3] * m2[1]; + var out2 = m1[0] * m2[2] + m1[2] * m2[3]; + var out3 = m1[1] * m2[2] + m1[3] * m2[3]; + var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = out3; + out[4] = out4; + out[5] = out5; + return out; + }, + /** + * 平移变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {Float32Array|Array.} v + */ + translate : function(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; + }, + /** + * 旋转变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {number} rad + */ + rotate : function(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; + }, + /** + * 缩放变换 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + * @param {Float32Array|Array.} v + */ + scale : function(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; + }, + /** + * 求逆矩阵 + * @param {Float32Array|Array.} out + * @param {Float32Array|Array.} a + */ + invert : function(out, a) { + + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; + } + }; + + module.exports = matrix; + + + +/***/ }, +/* 18 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getItemStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['stroke', 'borderColor'], + ['lineWidth', 'borderWidth'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 19 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Component model + * + * @module echarts/model/Component + */ + + + var Model = __webpack_require__(8); + var zrUtil = __webpack_require__(3); + var arrayPush = Array.prototype.push; + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + var layout = __webpack_require__(21); + + /** + * @alias module:echarts/model/Component + * @constructor + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {module:echarts/model/Model} ecModel + */ + var ComponentModel = Model.extend({ + + type: 'component', + + /** + * @readOnly + * @type {string} + */ + id: '', + + /** + * @readOnly + */ + name: '', + + /** + * @readOnly + * @type {string} + */ + mainType: '', + + /** + * @readOnly + * @type {string} + */ + subType: '', + + /** + * @readOnly + * @type {number} + */ + componentIndex: 0, + + /** + * @type {Object} + * @protected + */ + defaultOption: null, + + /** + * @type {module:echarts/model/Global} + * @readOnly + */ + ecModel: null, + + /** + * key: componentType + * value: Component model list, can not be null. + * @type {Object.>} + * @readOnly + */ + dependentModels: [], + + /** + * @type {string} + * @readOnly + */ + uid: null, + + /** + * Support merge layout params. + * Only support 'box' now (left/right/top/bottom/width/height). + * @type {string|Object} Object can be {ignoreSize: true} + * @readOnly + */ + layoutMode: null, + + + init: function (option, parentModel, ecModel, extraOpt) { + this.mergeDefaultAndTheme(this.option, this.ecModel); + }, + + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? layout.getLayoutParams(option) : {}; + + var themeModel = ecModel.getTheme(); + zrUtil.merge(option, themeModel.get(this.mainType)); + zrUtil.merge(option, this.getDefaultOption()); + + if (layoutMode) { + layout.mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + mergeOption: function (option) { + zrUtil.merge(this.option, option, true); + + var layoutMode = this.layoutMode; + if (layoutMode) { + layout.mergeLayoutParam(this.option, option, layoutMode); + } + }, + + // Hooker after init or mergeOption + optionUpdated: function (ecModel) {}, + + getDefaultOption: function () { + if (!this.hasOwnProperty('__defaultOption')) { + var optList = []; + var Class = this.constructor; + while (Class) { + var opt = Class.prototype.defaultOption; + opt && optList.push(opt); + Class = Class.superClass; + } + + var defaultOption = {}; + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = zrUtil.merge(defaultOption, optList[i], true); + } + this.__defaultOption = defaultOption; + } + return this.__defaultOption; + } + + }); + + // Reset ComponentModel.extend, add preConstruct. + clazzUtil.enableClassExtend( + ComponentModel, + function (option, parentModel, ecModel, extraOpt) { + // Set dependentModels, componentIndex, name, id, mainType, subType. + zrUtil.extend(this, extraOpt); + + this.uid = componentUtil.getUID('componentModel'); + + // this.setReadOnly([ + // 'type', 'id', 'uid', 'name', 'mainType', 'subType', + // 'dependentModels', 'componentIndex' + // ]); + } + ); + + // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement( + ComponentModel, {registerWhenExtend: true} + ); + componentUtil.enableSubTypeDefaulter(ComponentModel); + + // Add capability of ComponentModel.topologicalTravel. + componentUtil.enableTopologicalTravel(ComponentModel, getDependencies); + + function getDependencies(componentType) { + var deps = []; + zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) { + arrayPush.apply(deps, Clazz.prototype.dependencies || []); + }); + // Ensure main type + return zrUtil.map(deps, function (type) { + return clazzUtil.parseClassType(type).main; + }); + } + + zrUtil.mixin(ComponentModel, __webpack_require__(22)); + + module.exports = ComponentModel; + + +/***/ }, +/* 20 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var clazz = __webpack_require__(9); + + var parseClassType = clazz.parseClassType; + + var base = 0; + + var componentUtil = {}; + + var DELIMITER = '_'; + + /** + * @public + * @param {string} type + * @return {string} + */ + componentUtil.getUID = function (type) { + // Considering the case of crossing js context, + // use Math.random to make id as unique as possible. + return [(type || ''), base++, Math.random()].join(DELIMITER); + }; + + /** + * @inner + */ + componentUtil.enableSubTypeDefaulter = function (entity) { + + var subTypeDefaulters = {}; + + entity.registerSubTypeDefaulter = function (componentType, defaulter) { + componentType = parseClassType(componentType); + subTypeDefaulters[componentType.main] = defaulter; + }; + + entity.determineSubType = function (componentType, option) { + var type = option.type; + if (!type) { + var componentTypeMain = parseClassType(componentType).main; + if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + return type; + }; + + return entity; + }; + + /** + * Topological travel on Activity Network (Activity On Vertices). + * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis']. + * + * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology. + * + * If there is circle dependencey, Error will be thrown. + * + */ + componentUtil.enableTopologicalTravel = function (entity, dependencyGetter) { + + /** + * @public + * @param {Array.} targetNameList Target Component type list. + * Can be ['aa', 'bb', 'aa.xx'] + * @param {Array.} fullNameList By which we can build dependency graph. + * @param {Function} callback Params: componentType, dependencies. + * @param {Object} context Scope of callback. + */ + entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var stack = result.noEntryList; + + var targetNameSet = {}; + zrUtil.each(targetNameList, function (name) { + targetNameSet[name] = true; + }); + + while (stack.length) { + var currComponentType = stack.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + zrUtil.each( + currVertex.successor, + isInTargetNameSet ? removeEdgeAndAdd : removeEdge + ); + } + + zrUtil.each(targetNameSet, function () { + throw new Error('Circle dependency may exists'); + }); + + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + if (graph[succComponentType].entryCount === 0) { + stack.push(succComponentType); + } + } + + // Consider this case: legend depends on series, and we call + // chart.setOption({series: [...]}), where only series is in option. + // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will + // not be called, but only sereis.mergeOption is called. Thus legend + // have no chance to update its local record about series (like which + // name of series is available in legend). + function removeEdgeAndAdd(succComponentType) { + targetNameSet[succComponentType] = true; + removeEdge(succComponentType); + } + }; + + /** + * DepndencyGraph: {Object} + * key: conponentType, + * value: { + * successor: [conponentTypes...], + * originalDeps: [conponentTypes...], + * entryCount: {number} + * } + */ + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + + zrUtil.each(fullNameList, function (name) { + + var thisItem = createDependencyGraphItem(graph, name); + var originalDeps = thisItem.originalDeps = dependencyGetter(name); + + var availableDeps = getAvailableDependencies(originalDeps, fullNameList); + thisItem.entryCount = availableDeps.length; + if (thisItem.entryCount === 0) { + noEntryList.push(name); + } + + zrUtil.each(availableDeps, function (dependentName) { + if (zrUtil.indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + var thatItem = createDependencyGraphItem(graph, dependentName); + if (zrUtil.indexOf(thatItem.successor, dependentName) < 0) { + thatItem.successor.push(name); + } + }); + }); + + return {graph: graph, noEntryList: noEntryList}; + } + + function createDependencyGraphItem(graph, name) { + if (!graph[name]) { + graph[name] = {predecessor: [], successor: []}; + } + return graph[name]; + } + + function getAvailableDependencies(originalDeps, fullNameList) { + var availableDeps = []; + zrUtil.each(originalDeps, function (dep) { + zrUtil.indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } + }; + + module.exports = componentUtil; + + +/***/ }, +/* 21 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Layout helpers for each component positioning + + + var zrUtil = __webpack_require__(3); + var BoundingRect = __webpack_require__(15); + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + var parsePercent = numberUtil.parsePercent; + var each = zrUtil.each; + + var layout = {}; + + var LOCATION_PARAMS = ['left', 'right', 'top', 'bottom', 'width', 'height']; + + function boxLayout(orient, group, gap, maxWidth, maxHeight) { + var x = 0; + var y = 0; + if (maxWidth == null) { + maxWidth = Infinity; + } + if (maxHeight == null) { + maxHeight = Infinity; + } + var currentLineMaxSize = 0; + group.eachChild(function (child, idx) { + var position = child.position; + var rect = child.getBoundingRect(); + var nextChild = group.childAt(idx + 1); + var nextChildRect = nextChild && nextChild.getBoundingRect(); + var nextX; + var nextY; + if (orient === 'horizontal') { + var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0); + nextX = x + moveX; + // Wrap when width exceeds maxWidth or meet a `newline` group + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } + else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); + } + } + else { + var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0); + nextY = y + moveY; + // Wrap when width exceeds maxHeight or meet a `newline` group + if (nextY > maxHeight || child.newline) { + x += currentLineMaxSize + gap; + y = 0; + nextY = moveY; + currentLineMaxSize = rect.width; + } + else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); + } + } + + if (child.newline) { + return; + } + + position[0] = x; + position[1] = y; + + orient === 'horizontal' + ? (x = nextX + gap) + : (y = nextY + gap); + }); + } + + /** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.box = boxLayout; + + /** + * VBox layouting + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.vbox = zrUtil.curry(boxLayout, 'vertical'); + + /** + * HBox layouting + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ + layout.hbox = zrUtil.curry(boxLayout, 'horizontal'); + + /** + * If x or x2 is not specified or 'center' 'left' 'right', + * the width would be as long as possible. + * If y or y2 is not specified or 'middle' 'top' 'bottom', + * the height would be as long as possible. + * + * @param {Object} positionInfo + * @param {number|string} [positionInfo.x] + * @param {number|string} [positionInfo.y] + * @param {number|string} [positionInfo.x2] + * @param {number|string} [positionInfo.y2] + * @param {Object} containerRect + * @param {string|number} margin + * @return {Object} {width, height} + */ + layout.getAvailableSize = function (positionInfo, containerRect, margin) { + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + + var x = parsePercent(positionInfo.x, containerWidth); + var y = parsePercent(positionInfo.y, containerHeight); + var x2 = parsePercent(positionInfo.x2, containerWidth); + var y2 = parsePercent(positionInfo.y2, containerHeight); + + (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0); + (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth); + (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0); + (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight); + + margin = formatUtil.normalizeCssArray(margin || 0); + + return { + width: Math.max(x2 - x - margin[1] - margin[3], 0), + height: Math.max(y2 - y - margin[0] - margin[2], 0) + }; + }; + + /** + * Parse position info. + * + * @param {Object} positionInfo + * @param {number|string} [positionInfo.left] + * @param {number|string} [positionInfo.top] + * @param {number|string} [positionInfo.right] + * @param {number|string} [positionInfo.bottom] + * @param {number|string} [positionInfo.width] + * @param {number|string} [positionInfo.height] + * @param {number|string} [positionInfo.aspect] Aspect is width / height + * @param {Object} containerRect + * @param {string|number} [margin] + * + * @return {module:zrender/core/BoundingRect} + */ + layout.getLayoutRect = function ( + positionInfo, containerRect, margin + ) { + margin = formatUtil.normalizeCssArray(margin || 0); + + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + + var left = parsePercent(positionInfo.left, containerWidth); + var top = parsePercent(positionInfo.top, containerHeight); + var right = parsePercent(positionInfo.right, containerWidth); + var bottom = parsePercent(positionInfo.bottom, containerHeight); + var width = parsePercent(positionInfo.width, containerWidth); + var height = parsePercent(positionInfo.height, containerHeight); + + var verticalMargin = margin[2] + margin[0]; + var horizontalMargin = margin[1] + margin[3]; + var aspect = positionInfo.aspect; + + // If width is not specified, calculate width from left and right + if (isNaN(width)) { + width = containerWidth - right - horizontalMargin - left; + } + if (isNaN(height)) { + height = containerHeight - bottom - verticalMargin - top; + } + + // If width and height are not given + // 1. Graph should not exceeds the container + // 2. Aspect must be keeped + // 3. Graph should take the space as more as possible + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } + else { + height = containerHeight * 0.8; + } + } + + if (aspect != null) { + // Calculate width or height with given aspect + if (isNaN(width)) { + width = aspect * height; + } + if (isNaN(height)) { + height = width / aspect; + } + } + + // If left is not specified, calculate left from right and width + if (isNaN(left)) { + left = containerWidth - right - width - horizontalMargin; + } + if (isNaN(top)) { + top = containerHeight - bottom - height - verticalMargin; + } + + // Align left and top + switch (positionInfo.left || positionInfo.right) { + case 'center': + left = containerWidth / 2 - width / 2 - margin[3]; + break; + case 'right': + left = containerWidth - width - horizontalMargin; + break; + } + switch (positionInfo.top || positionInfo.bottom) { + case 'middle': + case 'center': + top = containerHeight / 2 - height / 2 - margin[0]; + break; + case 'bottom': + top = containerHeight - height - verticalMargin; + break; + } + // If something is wrong and left, top, width, height are calculated as NaN + left = left || 0; + top = top || 0; + if (isNaN(width)) { + // Width may be NaN if only one value is given except width + width = containerWidth - left - (right || 0); + } + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - top - (bottom || 0); + } + + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; + }; + + /** + * Position group of component in viewport + * Group position is specified by either + * {left, top}, {right, bottom} + * If all properties exists, right and bottom will be igonred. + * + * @param {module:zrender/container/Group} group + * @param {Object} positionInfo + * @param {number|string} [positionInfo.left] + * @param {number|string} [positionInfo.top] + * @param {number|string} [positionInfo.right] + * @param {number|string} [positionInfo.bottom] + * @param {Object} containerRect + * @param {string|number} margin + */ + layout.positionGroup = function ( + group, positionInfo, containerRect, margin + ) { + var groupRect = group.getBoundingRect(); + + positionInfo = zrUtil.extend(zrUtil.clone(positionInfo), { + width: groupRect.width, + height: groupRect.height + }); + + positionInfo = layout.getLayoutRect( + positionInfo, containerRect, margin + ); + + group.position = [ + positionInfo.x - groupRect.x, + positionInfo.y - groupRect.y + ]; + }; + + /** + * Consider Case: + * When defulat option has {left: 0, width: 100}, and we set {right: 0} + * through setOption or media query, using normal zrUtil.merge will cause + * {right: 0} does not take effect. + * + * @example + * ComponentModel.extend({ + * init: function () { + * ... + * var inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param {Object} targetOption + * @param {Object} newOption + * @param {Object|string} [opt] + * @param {boolean} [opt.ignoreSize=false] Some component must has width and height. + */ + layout.mergeLayoutParam = function (targetOption, newOption, opt) { + !zrUtil.isObject(opt) && (opt = {}); + var hNames = ['width', 'left', 'right']; // Order by priority. + var vNames = ['height', 'top', 'bottom']; // Order by priority. + var hResult = merge(hNames); + var vResult = merge(vNames); + + copy(hNames, targetOption, hResult); + copy(vNames, targetOption, vResult); + + function merge(names) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = opt.ignoreSize ? 1 : 2; + + each(names, function (name) { + merged[name] = targetOption[name]; + }); + each(names, function (name) { + // Consider case: newOption.width is null, which is + // set by user for removing width setting. + hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); + hasValue(newParams, name) && newValueCount++; + hasValue(merged, name) && mergedValueCount++; + }); + + // Case: newOption: {width: ..., right: ...}, + // or targetOption: {right: ...} and newOption: {width: ...}, + // There is no conflict when merged only has params count + // little than enoughParamNumber. + if (mergedValueCount === enoughParamNumber || !newValueCount) { + return merged; + } + // Case: newOption: {width: ..., right: ...}, + // Than we can make sure user only want those two, and ignore + // all origin params in targetOption. + else if (newValueCount >= enoughParamNumber) { + return newParams; + } + else { + // Chose another param from targetOption by priority. + // When 'ignoreSize', enoughParamNumber is 1 and those will not happen. + for (var i = 0; i < names.length; i++) { + var name = names[i]; + if (!hasProp(newParams, name) && hasProp(targetOption, name)) { + newParams[name] = targetOption[name]; + break; + } + } + return newParams; + } + } + + function hasProp(obj, name) { + return obj.hasOwnProperty(name); + } + + function hasValue(obj, name) { + return obj[name] != null && obj[name] !== 'auto'; + } + + function copy(names, target, source) { + each(names, function (name) { + target[name] = source[name]; + }); + } + }; + + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + layout.getLayoutParams = function (source) { + return layout.copyLayoutParams({}, source); + }; + + /** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ + layout.copyLayoutParams = function (target, source) { + source && target && each(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; + }; + + module.exports = layout; + + +/***/ }, +/* 22 */ +/***/ function(module, exports) { + + + + module.exports = { + getBoxLayoutParams: function () { + return { + left: this.get('left'), + top: this.get('top'), + right: this.get('right'), + bottom: this.get('bottom'), + width: this.get('width'), + height: this.get('height') + }; + } + }; + + +/***/ }, +/* 23 */ +/***/ function(module, exports) { + + + var platform = ''; + // Navigator not exists in node + if (typeof navigator !== 'undefined') { + platform = navigator.platform || ''; + } + module.exports = { + // 全图默认背景 + // backgroundColor: 'rgba(0,0,0,0)', + + // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization + // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'], + // 浅色 + // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'], + // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'], + // 深色 + color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83', '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'], + + // 默认需要 Grid 配置项 + grid: {}, + // 主题,主题 + textStyle: { + // color: '#000', + // decoration: 'none', + // PENDING + fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif', + // fontFamily: 'Arial, Verdana, sans-serif', + fontSize: 12, + fontStyle: 'normal', + fontWeight: 'normal' + }, + // 主题,默认标志图形类型列表 + // symbolList: [ + // 'circle', 'rectangle', 'triangle', 'diamond', + // 'emptyCircle', 'emptyRectangle', 'emptyTriangle', 'emptyDiamond' + // ], + animation: true, // 过渡动画是否开启 + animationThreshold: 2000, // 动画元素阀值,产生的图形原素超过2000不出动画 + animationDuration: 1000, // 过渡动画参数:进入 + animationDurationUpdate: 300, // 过渡动画参数:更新 + animationEasing: 'exponentialOut', //BounceOut + animationEasingUpdate: 'cubicOut' + }; + + +/***/ }, +/* 24 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var echartsAPIList = [ + 'getDom', 'getZr', 'getWidth', 'getHeight', 'dispatchAction', + 'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption' + ]; + + function ExtensionAPI(chartInstance) { + zrUtil.each(echartsAPIList, function (name) { + this[name] = zrUtil.bind(chartInstance[name], chartInstance); + }, this); + } + + module.exports = ExtensionAPI; + + +/***/ }, +/* 25 */ +/***/ function(module, exports) { + + 'use strict'; + + + // var zrUtil = require('zrender/lib/core/util'); + var coordinateSystemCreators = {}; + + function CoordinateSystemManager() { + + this._coordinateSystems = []; + } + + CoordinateSystemManager.prototype = { + + constructor: CoordinateSystemManager, + + create: function (ecModel, api) { + var coordinateSystems = []; + for (var type in coordinateSystemCreators) { + var list = coordinateSystemCreators[type].create(ecModel, api); + list && (coordinateSystems = coordinateSystems.concat(list)); + } + + this._coordinateSystems = coordinateSystems; + }, + + update: function (ecModel, api) { + var coordinateSystems = this._coordinateSystems; + for (var i = 0; i < coordinateSystems.length; i++) { + // FIXME MUST have + coordinateSystems[i].update && coordinateSystems[i].update(ecModel, api); + } + } + }; + + CoordinateSystemManager.register = function (type, coordinateSystemCreator) { + coordinateSystemCreators[type] = coordinateSystemCreator; + }; + + CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; + }; + + module.exports = CoordinateSystemManager; + + +/***/ }, +/* 26 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * ECharts option manager + * + * @module {echarts/model/OptionManager} + */ + + + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var ComponentModel = __webpack_require__(19); + var each = zrUtil.each; + var clone = zrUtil.clone; + var map = zrUtil.map; + var merge = zrUtil.merge; + + var QUERY_REG = /^(min|max)?(.+)$/; + + /** + * TERM EXPLANATIONS: + * + * [option]: + * + * An object that contains definitions of components. For example: + * var option = { + * title: {...}, + * legend: {...}, + * visualMap: {...}, + * series: [ + * {data: [...]}, + * {data: [...]}, + * ... + * ] + * }; + * + * [rawOption]: + * + * An object input to echarts.setOption. 'rawOption' may be an + * 'option', or may be an object contains multi-options. For example: + * var option = { + * baseOption: { + * title: {...}, + * legend: {...}, + * series: [ + * {data: [...]}, + * {data: [...]}, + * ... + * ] + * }, + * timeline: {...}, + * options: [ + * {title: {...}, series: {data: [...]}}, + * {title: {...}, series: {data: [...]}}, + * ... + * ], + * media: [ + * { + * query: {maxWidth: 320}, + * option: {series: {x: 20}, visualMap: {show: false}} + * }, + * { + * query: {minWidth: 320, maxWidth: 720}, + * option: {series: {x: 500}, visualMap: {show: true}} + * }, + * { + * option: {series: {x: 1200}, visualMap: {show: true}} + * } + * ] + * }; + * + * @alias module:echarts/model/OptionManager + * @param {module:echarts/ExtensionAPI} api + */ + function OptionManager(api) { + + /** + * @private + * @type {module:echarts/ExtensionAPI} + */ + this._api = api; + + /** + * @private + * @type {Array.} + */ + this._timelineOptions = []; + + /** + * @private + * @type {Array.} + */ + this._mediaList = []; + + /** + * @private + * @type {Object} + */ + this._mediaDefault; + + /** + * -1, means default. + * empty means no media. + * @private + * @type {Array.} + */ + this._currentMediaIndices = []; + + /** + * @private + * @type {Object} + */ + this._optionBackup; + + /** + * @private + * @type {Object} + */ + this._newOptionBackup; + } + + // timeline.notMerge is not supported in ec3. Firstly there is rearly + // case that notMerge is needed. Secondly supporting 'notMerge' requires + // rawOption cloned and backuped when timeline changed, which does no + // good to performance. What's more, that both timeline and setOption + // method supply 'notMerge' brings complex and some problems. + // Consider this case: + // (step1) chart.setOption({timeline: {notMerge: false}, ...}, false); + // (step2) chart.setOption({timeline: {notMerge: true}, ...}, false); + + OptionManager.prototype = { + + constructor: OptionManager, + + /** + * @public + * @param {Object} rawOption Raw option. + * @param {module:echarts/model/Global} ecModel + * @param {Array.} optionPreprocessorFuncs + * @return {Object} Init option + */ + setOption: function (rawOption, optionPreprocessorFuncs) { + rawOption = clone(rawOption, true); + + // FIXME + // 如果 timeline options 或者 media 中设置了某个属性,而baseOption中没有设置,则进行警告。 + + var oldOptionBackup = this._optionBackup; + var newOptionBackup = this._newOptionBackup = parseRawOption.call( + this, rawOption, optionPreprocessorFuncs + ); + + // For setOption at second time (using merge mode); + if (oldOptionBackup) { + // Only baseOption can be merged. + mergeOption(oldOptionBackup.baseOption, newOptionBackup.baseOption); + + if (newOptionBackup.timelineOptions.length) { + oldOptionBackup.timelineOptions = newOptionBackup.timelineOptions; + } + if (newOptionBackup.mediaList.length) { + oldOptionBackup.mediaList = newOptionBackup.mediaList; + } + if (newOptionBackup.mediaDefault) { + oldOptionBackup.mediaDefault = newOptionBackup.mediaDefault; + } + } + else { + this._optionBackup = newOptionBackup; + } + }, + + /** + * @param {boolean} isRecreate + * @return {Object} + */ + mountOption: function (isRecreate) { + var optionBackup = isRecreate + // this._optionBackup can be only used when recreate. + // In other cases we use model.mergeOption to handle merge. + ? this._optionBackup : this._newOptionBackup; + + // FIXME + // 如果没有reset功能则不clone。 + + this._timelineOptions = map(optionBackup.timelineOptions, clone); + this._mediaList = map(optionBackup.mediaList, clone); + this._mediaDefault = clone(optionBackup.mediaDefault); + this._currentMediaIndices = []; + + return clone(optionBackup.baseOption); + }, + + /** + * @param {module:echarts/model/Global} ecModel + * @return {Object} + */ + getTimelineOption: function (ecModel) { + var option; + var timelineOptions = this._timelineOptions; + + if (timelineOptions.length) { + // getTimelineOption can only be called after ecModel inited, + // so we can get currentIndex from timelineModel. + var timelineModel = ecModel.getComponent('timeline'); + if (timelineModel) { + option = clone( + timelineOptions[timelineModel.getCurrentIndex()], + true + ); + } + } + + return option; + }, + + /** + * @param {module:echarts/model/Global} ecModel + * @return {Array.} + */ + getMediaOption: function (ecModel) { + var ecWidth = this._api.getWidth(); + var ecHeight = this._api.getHeight(); + var mediaList = this._mediaList; + var mediaDefault = this._mediaDefault; + var indices = []; + var result = []; + + // No media defined. + if (!mediaList.length && !mediaDefault) { + return result; + } + + // Multi media may be applied, the latter defined media has higher priority. + for (var i = 0, len = mediaList.length; i < len; i++) { + if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { + indices.push(i); + } + } + + // FIXME + // 是否mediaDefault应该强制用户设置,否则可能修改不能回归。 + if (!indices.length && mediaDefault) { + indices = [-1]; + } + + if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { + result = map(indices, function (index) { + return clone( + index === -1 ? mediaDefault.option : mediaList[index].option + ); + }); + } + // Otherwise return nothing. + + this._currentMediaIndices = indices; + + return result; + } + }; + + function parseRawOption(rawOption, optionPreprocessorFuncs) { + var timelineOptions = []; + var mediaList = []; + var mediaDefault; + var baseOption; + + // Compatible with ec2. + var timelineOpt = rawOption.timeline; + + if (rawOption.baseOption) { + baseOption = rawOption.baseOption; + } + + // For timeline + if (timelineOpt || rawOption.options) { + baseOption = baseOption || {}; + timelineOptions = (rawOption.options || []).slice(); + } + // For media query + if (rawOption.media) { + baseOption = baseOption || {}; + var media = rawOption.media; + each(media, function (singleMedia) { + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } + else if (!mediaDefault) { + // Use the first media default. + mediaDefault = singleMedia; + } + } + }); + } + + // For normal option + if (!baseOption) { + baseOption = rawOption; + } + + // Set timelineOpt to baseOption in ec3, + // which is convenient for merge option. + if (!baseOption.timeline) { + baseOption.timeline = timelineOpt; + } + + // Preprocess. + each([baseOption].concat(timelineOptions) + .concat(zrUtil.map(mediaList, function (media) { + return media.option; + })), + function (option) { + each(optionPreprocessorFuncs, function (preProcess) { + preProcess(option); + }); + } + ); + + return { + baseOption: baseOption, + timelineOptions: timelineOptions, + mediaDefault: mediaDefault, + mediaList: mediaList + }; + } + + /** + * @see + * Support: width, height, aspectRatio + * Can use max or min as prefix. + */ + function applyMediaQuery(query, ecWidth, ecHeight) { + var realMap = { + width: ecWidth, + height: ecHeight, + aspectratio: ecWidth / ecHeight // lowser case for convenientce. + }; + + var applicatable = true; + + zrUtil.each(query, function (value, attr) { + var matched = attr.match(QUERY_REG); + + if (!matched || !matched[1] || !matched[2]) { + return; + } + + var operator = matched[1]; + var realAttr = matched[2].toLowerCase(); + + if (!compare(realMap[realAttr], value, operator)) { + applicatable = false; + } + }); + + return applicatable; + } + + function compare(real, expect, operator) { + if (operator === 'min') { + return real >= expect; + } + else if (operator === 'max') { + return real <= expect; + } + else { // Equals + return real === expect; + } + } + + function indicesEquals(indices1, indices2) { + // indices is always order by asc and has only finite number. + return indices1.join(',') === indices2.join(','); + } + + /** + * Consider case: + * `chart.setOption(opt1);` + * Then user do some interaction like dataZoom, dataView changing. + * `chart.setOption(opt2);` + * Then user press 'reset button' in toolbox. + * + * After doing that all of the interaction effects should be reset, the + * chart should be the same as the result of invoke + * `chart.setOption(opt1); chart.setOption(opt2);`. + * + * Although it is not able ensure that + * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to + * `chart.setOption(merge(opt1, opt2));` exactly, + * this might be the only simple way to implement that feature. + * + * MEMO: We've considered some other approaches: + * 1. Each model handle its self restoration but not uniform treatment. + * (Too complex in logic and error-prone) + * 2. Use a shadow ecModel. (Performace expensive) + */ + function mergeOption(oldOption, newOption) { + newOption = newOption || {}; + + each(newOption, function (newCptOpt, mainType) { + if (newCptOpt == null) { + return; + } + + var oldCptOpt = oldOption[mainType]; + + if (!ComponentModel.hasClass(mainType)) { + oldOption[mainType] = merge(oldCptOpt, newCptOpt, true); + } + else { + newCptOpt = modelUtil.normalizeToArray(newCptOpt); + oldCptOpt = modelUtil.normalizeToArray(oldCptOpt); + + var mapResult = modelUtil.mappingToExists(oldCptOpt, newCptOpt); + + oldOption[mainType] = map(mapResult, function (item) { + return (item.option && item.exist) + ? merge(item.exist, item.option, true) + : (item.exist || item.option); + }); + } + }); + } + + module.exports = OptionManager; + + +/***/ }, +/* 27 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var formatUtil = __webpack_require__(6); + var modelUtil = __webpack_require__(5); + var ComponentModel = __webpack_require__(19); + + var encodeHTML = formatUtil.encodeHTML; + var addCommas = formatUtil.addCommas; + + var SeriesModel = ComponentModel.extend({ + + type: 'series.__base__', + + /** + * @readOnly + */ + seriesIndex: 0, + + // coodinateSystem will be injected in the echarts/CoordinateSystem + coordinateSystem: null, + + /** + * @type {Object} + * @protected + */ + defaultOption: null, + + /** + * Data provided for legend + * @type {Function} + */ + // PENDING + legendDataProvider: null, + + init: function (option, parentModel, ecModel, extraOpt) { + + /** + * @type {number} + * @readOnly + */ + this.seriesIndex = this.componentIndex; + + this.mergeDefaultAndTheme(option, ecModel); + + /** + * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph} + * @private + */ + this._dataBeforeProcessed = this.getInitialData(option, ecModel); + + // When using module:echarts/data/Tree or module:echarts/data/Graph, + // cloneShallow will cause this._data.graph.data pointing to new data list. + // Wo we make this._dataBeforeProcessed first, and then make this._data. + this._data = this._dataBeforeProcessed.cloneShallow(); + }, + + /** + * Util for merge default and theme to option + * @param {Object} option + * @param {module:echarts/model/Global} ecModel + */ + mergeDefaultAndTheme: function (option, ecModel) { + zrUtil.merge( + option, + ecModel.getTheme().get(this.subType) + ); + zrUtil.merge(option, this.getDefaultOption()); + + // Default label emphasis `position` and `show` + modelUtil.defaultEmphasis( + option.label, ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + + // Default data label emphasis `position` and `show` + // FIXME Tree structure data ? + var data = option.data || []; + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + modelUtil.defaultEmphasis( + data[i].label, ['position', 'show', 'textStyle', 'distance', 'formatter'] + ); + } + } + }, + + mergeOption: function (newSeriesOption, ecModel) { + newSeriesOption = zrUtil.merge(this.option, newSeriesOption, true); + + var data = this.getInitialData(newSeriesOption, ecModel); + // TODO Merge data? + if (data) { + this._data = data; + this._dataBeforeProcessed = data.cloneShallow(); + } + }, + + /** + * Init a data structure from data related option in series + * Must be overwritten + */ + getInitialData: function () {}, + + /** + * @return {module:echarts/data/List} + */ + getData: function () { + return this._data; + }, + + /** + * @param {module:echarts/data/List} data + */ + setData: function (data) { + this._data = data; + }, + + /** + * Get data before processed + * @return {module:echarts/data/List} + */ + getRawData: function () { + return this._dataBeforeProcessed; + }, + + /** + * Get raw data array given by user + * @return {Array.} + */ + getRawDataArray: function () { + return this.option.data; + }, + + /** + * Coord dimension to data dimension. + * + * By default the result is the same as dimensions of series data. + * But some series dimensions are different from coord dimensions (i.e. + * candlestick and boxplot). Override this method to handle those cases. + * + * Coord dimension to data dimension can be one-to-many + * + * @param {string} coordDim + * @return {Array.} dimensions on the axis. + */ + coordDimToDataDim: function (coordDim) { + return [coordDim]; + }, + + /** + * Convert data dimension to coord dimension. + * + * @param {string|number} dataDim + * @return {string} + */ + dataDimToCoordDim: function (dataDim) { + return dataDim; + }, + + /** + * Get base axis if has coordinate system and has axis. + * By default use coordSys.getBaseAxis(); + * Can be overrided for some chart. + * @return {type} description + */ + getBaseAxis: function () { + var coordSys = this.coordinateSystem; + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }, + + // FIXME + /** + * Default tooltip formatter + * + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + */ + formatTooltip: function (dataIndex, multipleSeries) { + var data = this._data; + var value = this.getRawValue(dataIndex); + var formattedValue = zrUtil.isArray(value) + ? zrUtil.map(value, addCommas).join(', ') : addCommas(value); + var name = data.getName(dataIndex); + var color = data.getItemVisual(dataIndex, 'color'); + var colorEl = ''; + + return !multipleSeries + ? (encodeHTML(this.name) + '
            ' + colorEl + + (name + ? encodeHTML(name) + ' : ' + formattedValue + : formattedValue) + ) + : (colorEl + encodeHTML(this.name) + ' : ' + formattedValue); + }, + + restoreData: function () { + this._data = this._dataBeforeProcessed.cloneShallow(); + } + }); + + zrUtil.mixin(SeriesModel, modelUtil.dataFormatMixin); + + module.exports = SeriesModel; + + +/***/ }, +/* 28 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Group = __webpack_require__(29); + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + + var Component = function () { + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = componentUtil.getUID('viewComponent'); + }; + + Component.prototype = { + + constructor: Component, + + init: function (ecModel, api) {}, + + render: function (componentModel, ecModel, api, payload) {}, + + dispose: function () {} + }; + + var componentProto = Component.prototype; + componentProto.updateView + = componentProto.updateLayout + = componentProto.updateVisual + = function (seriesModel, ecModel, api, payload) { + // Do nothing; + }; + // Enable Component.extend. + clazzUtil.enableClassExtend(Component); + + // Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement(Component, {registerWhenExtend: true}); + + module.exports = Component; + + +/***/ }, +/* 29 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Group是一个容器,可以插入子节点,Group的变换也会被应用到子节点上 + * @module zrender/graphic/Group + * @example + * var Group = require('zrender/lib/container/Group'); + * var Circle = require('zrender/lib/graphic/shape/Circle'); + * var g = new Group(); + * g.position[0] = 100; + * g.position[1] = 100; + * g.add(new Circle({ + * style: { + * x: 100, + * y: 100, + * r: 20, + * } + * })); + * zr.add(g); + */ + + + var zrUtil = __webpack_require__(3); + var Element = __webpack_require__(30); + var BoundingRect = __webpack_require__(15); + + /** + * @alias module:zrender/graphic/Group + * @constructor + * @extends module:zrender/mixin/Transformable + * @extends module:zrender/mixin/Eventful + */ + var Group = function (opts) { + + opts = opts || {}; + + Element.call(this, opts); + + for (var key in opts) { + this[key] = opts[key]; + } + + this._children = []; + + this.__storage = null; + + this.__dirty = true; + }; + + Group.prototype = { + + constructor: Group, + + /** + * @type {string} + */ + type: 'group', + + /** + * @return {Array.} + */ + children: function () { + return this._children.slice(); + }, + + /** + * 获取指定 index 的儿子节点 + * @param {number} idx + * @return {module:zrender/Element} + */ + childAt: function (idx) { + return this._children[idx]; + }, + + /** + * 获取指定名字的儿子节点 + * @param {string} name + * @return {module:zrender/Element} + */ + childOfName: function (name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }, + + /** + * @return {number} + */ + childCount: function () { + return this._children.length; + }, + + /** + * 添加子节点到最后 + * @param {module:zrender/Element} child + */ + add: function (child) { + if (child && child !== this && child.parent !== this) { + + this._children.push(child); + + this._doAdd(child); + } + + return this; + }, + + /** + * 添加子节点在 nextSibling 之前 + * @param {module:zrender/Element} child + * @param {module:zrender/Element} nextSibling + */ + addBefore: function (child, nextSibling) { + if (child && child !== this && child.parent !== this + && nextSibling && nextSibling.parent === this) { + + var children = this._children; + var idx = children.indexOf(nextSibling); + + if (idx >= 0) { + children.splice(idx, 0, child); + this._doAdd(child); + } + } + + return this; + }, + + _doAdd: function (child) { + if (child.parent) { + child.parent.remove(child); + } + + child.parent = this; + + var storage = this.__storage; + var zr = this.__zr; + if (storage && storage !== child.__storage) { + + storage.addToMap(child); + + if (child instanceof Group) { + child.addChildrenToStorage(storage); + } + } + + zr && zr.refresh(); + }, + + /** + * 移除子节点 + * @param {module:zrender/Element} child + */ + remove: function (child) { + var zr = this.__zr; + var storage = this.__storage; + var children = this._children; + + var idx = zrUtil.indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + + child.parent = null; + + if (storage) { + + storage.delFromMap(child.id); + + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + + zr && zr.refresh(); + + return this; + }, + + /** + * 移除所有子节点 + */ + removeAll: function () { + var children = this._children; + var storage = this.__storage; + var child; + var i; + for (i = 0; i < children.length; i++) { + child = children[i]; + if (storage) { + storage.delFromMap(child.id); + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + child.parent = null; + } + children.length = 0; + + return this; + }, + + /** + * 遍历所有子节点 + * @param {Function} cb + * @param {} context + */ + eachChild: function (cb, context) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + cb.call(context, child, i); + } + return this; + }, + + /** + * 深度优先遍历所有子孙节点 + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + cb.call(context, child); + + if (child.type === 'group') { + child.traverse(cb, context); + } + } + return this; + }, + + addChildrenToStorage: function (storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.addToMap(child); + if (child instanceof Group) { + child.addChildrenToStorage(storage); + } + } + }, + + delChildrenFromStorage: function (storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.delFromMap(child.id); + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + }, + + dirty: function () { + this.__dirty = true; + this.__zr && this.__zr.refresh(); + return this; + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function (includeChildren) { + // TODO Caching + // TODO Transform + var rect = null; + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.ignore || child.invisible) { + continue; + } + + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + if (transform) { + tmpRect.copy(childRect); + tmpRect.applyTransform(transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + } + }; + + zrUtil.inherits(Group, Element); + + module.exports = Group; + + +/***/ }, +/* 30 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module zrender/Element + */ + + + var guid = __webpack_require__(31); + var Eventful = __webpack_require__(32); + var Transformable = __webpack_require__(33); + var Animatable = __webpack_require__(34); + var zrUtil = __webpack_require__(3); + + /** + * @alias module:zrender/Element + * @constructor + * @extends {module:zrender/mixin/Animatable} + * @extends {module:zrender/mixin/Transformable} + * @extends {module:zrender/mixin/Eventful} + */ + var Element = function (opts) { + + Transformable.call(this, opts); + Eventful.call(this, opts); + Animatable.call(this, opts); + + /** + * 画布元素ID + * @type {string} + */ + this.id = opts.id || guid(); + }; + + Element.prototype = { + + /** + * 元素类型 + * Element type + * @type {string} + */ + type: 'element', + + /** + * 元素名字 + * Element name + * @type {string} + */ + name: '', + + /** + * ZRender 实例对象,会在 element 添加到 zrender 实例中后自动赋值 + * ZRender instance will be assigned when element is associated with zrender + * @name module:/zrender/Element#__zr + * @type {module:zrender/ZRender} + */ + __zr: null, + + /** + * 图形是否忽略,为true时忽略图形的绘制以及事件触发 + * If ignore drawing and events of the element object + * @name module:/zrender/Element#ignore + * @type {boolean} + * @default false + */ + ignore: false, + + /** + * 用于裁剪的路径(shape),所有 Group 内的路径在绘制时都会被这个路径裁剪 + * 该路径会继承被裁减对象的变换 + * @type {module:zrender/graphic/Path} + * @see http://www.w3.org/TR/2dcontext/#clipping-region + * @readOnly + */ + clipPath: null, + + /** + * Drift element + * @param {number} dx dx on the global space + * @param {number} dy dy on the global space + */ + drift: function (dx, dy) { + switch (this.draggable) { + case 'horizontal': + dy = 0; + break; + case 'vertical': + dx = 0; + break; + } + + var m = this.transform; + if (!m) { + m = this.transform = [1, 0, 0, 1, 0, 0]; + } + m[4] += dx; + m[5] += dy; + + this.decomposeTransform(); + this.dirty(); + }, + + /** + * Hook before update + */ + beforeUpdate: function () {}, + /** + * Hook after update + */ + afterUpdate: function () {}, + /** + * Update each frame + */ + update: function () { + this.updateTransform(); + }, + + /** + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) {}, + + /** + * @protected + */ + attrKV: function (key, value) { + if (key === 'position' || key === 'scale' || key === 'origin') { + // Copy the array + if (value) { + var target = this[key]; + if (!target) { + target = this[key] = []; + } + target[0] = value[0]; + target[1] = value[1]; + } + } + else { + this[key] = value; + } + }, + + /** + * Hide the element + */ + hide: function () { + this.ignore = true; + this.__zr && this.__zr.refresh(); + }, + + /** + * Show the element + */ + show: function () { + this.ignore = false; + this.__zr && this.__zr.refresh(); + }, + + /** + * @param {string|Object} key + * @param {*} value + */ + attr: function (key, value) { + if (typeof key === 'string') { + this.attrKV(key, value); + } + else if (zrUtil.isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.attrKV(name, key[name]); + } + } + } + this.dirty(); + + return this; + }, + + /** + * @param {module:zrender/graphic/Path} clipPath + */ + setClipPath: function (clipPath) { + var zr = this.__zr; + if (zr) { + clipPath.addSelfToZr(zr); + } + + // Remove previous clip path + if (this.clipPath && this.clipPath !== clipPath) { + this.removeClipPath(); + } + + this.clipPath = clipPath; + clipPath.__zr = zr; + clipPath.__clipTarget = this; + + this.dirty(); + }, + + /** + */ + removeClipPath: function () { + var clipPath = this.clipPath; + if (clipPath) { + if (clipPath.__zr) { + clipPath.removeSelfFromZr(clipPath.__zr); + } + + clipPath.__zr = null; + clipPath.__clipTarget = null; + this.clipPath = null; + + this.dirty(); + } + }, + + /** + * Add self from zrender instance. + * Not recursively because it will be invoked when element added to storage. + * @param {module:zrender/ZRender} zr + */ + addSelfToZr: function (zr) { + this.__zr = zr; + // 添加动画 + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.addAnimator(animators[i]); + } + } + + if (this.clipPath) { + this.clipPath.addSelfToZr(zr); + } + }, + + /** + * Remove self from zrender instance. + * Not recursively because it will be invoked when element added to storage. + * @param {module:zrender/ZRender} zr + */ + removeSelfFromZr: function (zr) { + this.__zr = null; + // 移除动画 + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.removeAnimator(animators[i]); + } + } + + if (this.clipPath) { + this.clipPath.removeSelfFromZr(zr); + } + } + }; + + zrUtil.mixin(Element, Animatable); + zrUtil.mixin(Element, Transformable); + zrUtil.mixin(Element, Eventful); + + module.exports = Element; + + +/***/ }, +/* 31 */ +/***/ function(module, exports) { + + /** + * zrender: 生成唯一id + * + * @author errorrik (errorrik@gmail.com) + */ + + + var idStart = 0x0907; + + module.exports = function () { + return 'zr_' + (idStart++); + }; + + + +/***/ }, +/* 32 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 事件扩展 + * @module zrender/mixin/Eventful + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * pissang (https://www.github.com/pissang) + */ + + + var arrySlice = Array.prototype.slice; + var zrUtil = __webpack_require__(3); + var indexOf = zrUtil.indexOf; + + /** + * 事件分发器 + * @alias module:zrender/mixin/Eventful + * @constructor + */ + var Eventful = function () { + this._$handlers = {}; + }; + + Eventful.prototype = { + + constructor: Eventful, + + /** + * 单次触发绑定,trigger后销毁 + * + * @param {string} event 事件名 + * @param {Function} handler 响应函数 + * @param {Object} context + */ + one: function (event, handler, context) { + var _h = this._$handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + if (indexOf(_h[event], event) >= 0) { + return this; + } + + _h[event].push({ + h: handler, + one: true, + ctx: context || this + }); + + return this; + }, + + /** + * 绑定事件 + * @param {string} event 事件名 + * @param {Function} handler 事件处理函数 + * @param {Object} [context] + */ + on: function (event, handler, context) { + var _h = this._$handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + _h[event].push({ + h: handler, + one: false, + ctx: context || this + }); + + return this; + }, + + /** + * 是否绑定了事件 + * @param {string} event + * @return {boolean} + */ + isSilent: function (event) { + var _h = this._$handlers; + return _h[event] && _h[event].length; + }, + + /** + * 解绑事件 + * @param {string} event 事件名 + * @param {Function} [handler] 事件处理函数 + */ + off: function (event, handler) { + var _h = this._$handlers; + + if (!event) { + this._$handlers = {}; + return this; + } + + if (handler) { + if (_h[event]) { + var newList = []; + for (var i = 0, l = _h[event].length; i < l; i++) { + if (_h[event][i]['h'] != handler) { + newList.push(_h[event][i]); + } + } + _h[event] = newList; + } + + if (_h[event] && _h[event].length === 0) { + delete _h[event]; + } + } + else { + delete _h[event]; + } + + return this; + }, + + /** + * 事件分发 + * + * @param {string} type 事件类型 + */ + trigger: function (type) { + if (this._$handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 3) { + args = arrySlice.call(args, 1); + } + + var _h = this._$handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(_h[i]['ctx']); + break; + case 2: + _h[i]['h'].call(_h[i]['ctx'], args[1]); + break; + case 3: + _h[i]['h'].call(_h[i]['ctx'], args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(_h[i]['ctx'], args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } + else { + i++; + } + } + } + + return this; + }, + + /** + * 带有context的事件分发, 最后一个参数是事件回调的context + * @param {string} type 事件类型 + */ + triggerWithContext: function (type) { + if (this._$handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 4) { + args = arrySlice.call(args, 1, args.length - 1); + } + var ctx = args[args.length - 1]; + + var _h = this._$handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(ctx); + break; + case 2: + _h[i]['h'].call(ctx, args[1]); + break; + case 3: + _h[i]['h'].call(ctx, args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(ctx, args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } + else { + i++; + } + } + } + + return this; + } + }; + + // 对象可以通过 onxxxx 绑定事件 + /** + * @event module:zrender/mixin/Eventful#onclick + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseover + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseout + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousemove + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousewheel + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmousedown + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#onmouseup + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragstart + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragend + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragenter + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragleave + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondragover + * @type {Function} + * @default null + */ + /** + * @event module:zrender/mixin/Eventful#ondrop + * @type {Function} + * @default null + */ + + module.exports = Eventful; + + + +/***/ }, +/* 33 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 提供变换扩展 + * @module zrender/mixin/Transformable + * @author pissang (https://www.github.com/pissang) + */ + + + var matrix = __webpack_require__(17); + var vector = __webpack_require__(16); + var mIdentity = matrix.identity; + + var EPSILON = 5e-5; + + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + + /** + * @alias module:zrender/mixin/Transformable + * @constructor + */ + var Transformable = function (opts) { + opts = opts || {}; + // If there are no given position, rotation, scale + if (!opts.position) { + /** + * 平移 + * @type {Array.} + * @default [0, 0] + */ + this.position = [0, 0]; + } + if (opts.rotation == null) { + /** + * 旋转 + * @type {Array.} + * @default 0 + */ + this.rotation = 0; + } + if (!opts.scale) { + /** + * 缩放 + * @type {Array.} + * @default [1, 1] + */ + this.scale = [1, 1]; + } + /** + * 旋转和缩放的原点 + * @type {Array.} + * @default null + */ + this.origin = this.origin || null; + }; + + var transformableProto = Transformable.prototype; + transformableProto.transform = null; + + /** + * 判断是否需要有坐标变换 + * 如果有坐标变换, 则从position, rotation, scale以及父节点的transform计算出自身的transform矩阵 + */ + transformableProto.needLocalTransform = function () { + return isNotAroundZero(this.rotation) + || isNotAroundZero(this.position[0]) + || isNotAroundZero(this.position[1]) + || isNotAroundZero(this.scale[0] - 1) + || isNotAroundZero(this.scale[1] - 1); + }; + + transformableProto.updateTransform = function () { + var parent = this.parent; + var parentHasTransform = parent && parent.transform; + var needLocalTransform = this.needLocalTransform(); + + var m = this.transform; + if (!(needLocalTransform || parentHasTransform)) { + m && mIdentity(m); + return; + } + + m = m || matrix.create(); + + if (needLocalTransform) { + this.getLocalTransform(m); + } + else { + mIdentity(m); + } + + // 应用父节点变换 + if (parentHasTransform) { + if (needLocalTransform) { + matrix.mul(m, parent.transform, m); + } + else { + matrix.copy(m, parent.transform); + } + } + // 保存这个变换矩阵 + this.transform = m; + + this.invTransform = this.invTransform || matrix.create(); + matrix.invert(this.invTransform, m); + }; + + transformableProto.getLocalTransform = function (m) { + m = m || []; + mIdentity(m); + + var origin = this.origin; + + var scale = this.scale; + var rotation = this.rotation; + var position = this.position; + if (origin) { + // Translate to origin + m[4] -= origin[0]; + m[5] -= origin[1]; + } + matrix.scale(m, m, scale); + if (rotation) { + matrix.rotate(m, m, rotation); + } + if (origin) { + // Translate back from origin + m[4] += origin[0]; + m[5] += origin[1]; + } + + m[4] += position[0]; + m[5] += position[1]; + + return m; + }; + /** + * 将自己的transform应用到context上 + * @param {Context2D} ctx + */ + transformableProto.setTransform = function (ctx) { + var m = this.transform; + if (m) { + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + }; + + var tmpTransform = []; + + /** + * 分解`transform`矩阵到`position`, `rotation`, `scale` + */ + transformableProto.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + // Get local transform and decompose them to position, scale, rotation + matrix.mul(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + var position = this.position; + var scale = this.scale; + if (isNotAroundZero(sx - 1)) { + sx = Math.sqrt(sx); + } + if (isNotAroundZero(sy - 1)) { + sy = Math.sqrt(sy); + } + if (m[0] < 0) { + sx = -sx; + } + if (m[3] < 0) { + sy = -sy; + } + position[0] = m[4]; + position[1] = m[5]; + scale[0] = sx; + scale[1] = sy; + this.rotation = Math.atan2(-m[1] / sy, m[0] / sx); + }; + + /** + * 变换坐标位置到 shape 的局部坐标空间 + * @method + * @param {number} x + * @param {number} y + * @return {Array.} + */ + transformableProto.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + vector.applyTransform(v2, v2, invTransform); + } + return v2; + }; + + /** + * 变换局部坐标位置到全局坐标空间 + * @method + * @param {number} x + * @param {number} y + * @return {Array.} + */ + transformableProto.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + vector.applyTransform(v2, v2, transform); + } + return v2; + }; + + module.exports = Transformable; + + + +/***/ }, +/* 34 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * @module zrender/mixin/Animatable + */ + + + var Animator = __webpack_require__(35); + var util = __webpack_require__(3); + var isString = util.isString; + var isFunction = util.isFunction; + var isObject = util.isObject; + var log = __webpack_require__(39); + + /** + * @alias modue:zrender/mixin/Animatable + * @constructor + */ + var Animatable = function () { + + /** + * @type {Array.} + * @readOnly + */ + this.animators = []; + }; + + Animatable.prototype = { + + constructor: Animatable, + + /** + * 动画 + * + * @param {string} path 需要添加动画的属性获取路径,可以通过a.b.c来获取深层的属性 + * @param {boolean} [loop] 动画是否循环 + * @return {module:zrender/animation/Animator} + * @example: + * el.animate('style', false) + * .when(1000, {x: 10} ) + * .done(function(){ // Animation done }) + * .start() + */ + animate: function (path, loop) { + var target; + var animatingShape = false; + var el = this; + var zr = this.__zr; + if (path) { + var pathSplitted = path.split('.'); + var prop = el; + // If animating shape + animatingShape = pathSplitted[0] === 'shape'; + for (var i = 0, l = pathSplitted.length; i < l; i++) { + if (!prop) { + continue; + } + prop = prop[pathSplitted[i]]; + } + if (prop) { + target = prop; + } + } + else { + target = el; + } + + if (!target) { + log( + 'Property "' + + path + + '" is not existed in element ' + + el.id + ); + return; + } + + var animators = el.animators; + + var animator = new Animator(target, loop); + + animator.during(function (target) { + el.dirty(animatingShape); + }) + .done(function () { + // FIXME Animator will not be removed if use `Animator#stop` to stop animation + animators.splice(util.indexOf(animators, animator), 1); + }); + + animators.push(animator); + + // If animate after added to the zrender + if (zr) { + zr.animation.addAnimator(animator); + } + + return animator; + }, + + /** + * 停止动画 + * @param {boolean} forwardToLast If move to last frame before stop + */ + stopAnimation: function (forwardToLast) { + var animators = this.animators; + var len = animators.length; + for (var i = 0; i < len; i++) { + animators[i].stop(forwardToLast); + } + animators.length = 0; + + return this; + }, + + /** + * @param {Object} target + * @param {number} [time=500] Time in ms + * @param {string} [easing='linear'] + * @param {number} [delay=0] + * @param {Function} [callback] + * + * @example + * // Animate position + * el.animateTo({ + * position: [10, 10] + * }, function () { // done }) + * + * // Animate shape, style and position in 100ms, delayed 100ms, with cubicOut easing + * el.animateTo({ + * shape: { + * width: 500 + * }, + * style: { + * fill: 'red' + * } + * position: [10, 10] + * }, 100, 100, 'cubicOut', function () { // done }) + */ + // TODO Return animation key + animateTo: function (target, time, delay, easing, callback) { + // animateTo(target, time, easing, callback); + if (isString(delay)) { + callback = easing; + easing = delay; + delay = 0; + } + // animateTo(target, time, delay, callback); + else if (isFunction(easing)) { + callback = easing; + easing = 'linear'; + delay = 0; + } + // animateTo(target, time, callback); + else if (isFunction(delay)) { + callback = delay; + delay = 0; + } + // animateTo(target, callback) + else if (isFunction(time)) { + callback = time; + time = 500; + } + // animateTo(target) + else if (!time) { + time = 500; + } + // Stop all previous animations + this.stopAnimation(); + this._animateToShallow('', this, target, time, delay, easing, callback); + + // Animators may be removed immediately after start + // if there is nothing to animate + var animators = this.animators.slice(); + var count = animators.length; + function done() { + count--; + if (!count) { + callback && callback(); + } + } + + // No animators. This should be checked before animators[i].start(), + // because 'done' may be executed immediately if no need to animate. + if (!count) { + callback && callback(); + } + // Start after all animators created + // Incase any animator is done immediately when all animation properties are not changed + for (var i = 0; i < animators.length; i++) { + animators[i] + .done(done) + .start(easing); + } + }, + + /** + * @private + * @param {string} path='' + * @param {Object} source=this + * @param {Object} target + * @param {number} [time=500] + * @param {number} [delay=0] + * + * @example + * // Animate position + * el._animateToShallow({ + * position: [10, 10] + * }) + * + * // Animate shape, style and position in 100ms, delayed 100ms + * el._animateToShallow({ + * shape: { + * width: 500 + * }, + * style: { + * fill: 'red' + * } + * position: [10, 10] + * }, 100, 100) + */ + _animateToShallow: function (path, source, target, time, delay) { + var objShallow = {}; + var propertyCount = 0; + for (var name in target) { + if (source[name] != null) { + if (isObject(target[name]) && !util.isArrayLike(target[name])) { + this._animateToShallow( + path ? path + '.' + name : name, + source[name], + target[name], + time, + delay + ); + } + else { + objShallow[name] = target[name]; + propertyCount++; + } + } + else if (target[name] != null) { + // Attr directly if not has property + // FIXME, if some property not needed for element ? + if (!path) { + this.attr(name, target[name]); + } + else { // Shape or style + var props = {}; + props[path] = {}; + props[path][name] = target[name]; + this.attr(props); + } + } + } + + if (propertyCount > 0) { + this.animate(path, false) + .when(time == null ? 500 : time, objShallow) + .delay(delay || 0); + } + + return this; + } + }; + + module.exports = Animatable; + + +/***/ }, +/* 35 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/animation/Animator + */ + + + var Clip = __webpack_require__(36); + var color = __webpack_require__(38); + var util = __webpack_require__(3); + var isArrayLike = util.isArrayLike; + + var arraySlice = Array.prototype.slice; + + function defaultGetter(target, key) { + return target[key]; + } + + function defaultSetter(target, key, value) { + target[key] = value; + } + + /** + * @param {number} p0 + * @param {number} p1 + * @param {number} percent + * @return {number} + */ + function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; + } + + /** + * @param {string} p0 + * @param {string} p1 + * @param {number} percent + * @return {string} + */ + function interpolateString(p0, p1, percent) { + return percent > 0.5 ? p1 : p0; + } + + /** + * @param {Array} p0 + * @param {Array} p1 + * @param {number} percent + * @param {Array} out + * @param {number} arrDim + */ + function interpolateArray(p0, p1, percent, out, arrDim) { + var len = p0.length; + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber(p0[i], p1[i], percent); + } + } + else { + var len2 = p0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber( + p0[i][j], p1[i][j], percent + ); + } + } + } + } + + function fillArr(arr0, arr1, arrDim) { + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len === arr1Len) { + return; + } + // FIXME Not work for TypedArray + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + // Cut the previous + arr0.length = arr1Len; + } + else { + // Fill the previous + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push( + arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]) + ); + } + } + } + + /** + * @param {Array} arr0 + * @param {Array} arr1 + * @param {number} arrDim + * @return {boolean} + */ + function isArraySame(arr0, arr1, arrDim) { + if (arr0 === arr1) { + return true; + } + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + if (arrDim === 1) { + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + } + else { + var len2 = arr0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + if (arr0[i][j] !== arr1[i][j]) { + return false; + } + } + } + } + return true; + } + + /** + * Catmull Rom interpolate array + * @param {Array} p0 + * @param {Array} p1 + * @param {Array} p2 + * @param {Array} p3 + * @param {number} t + * @param {number} t2 + * @param {number} t3 + * @param {Array} out + * @param {number} arrDim + */ + function catmullRomInterpolateArray( + p0, p1, p2, p3, t, t2, t3, out, arrDim + ) { + var len = p0.length; + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = catmullRomInterpolate( + p0[i], p1[i], p2[i], p3[i], t, t2, t3 + ); + } + } + else { + var len2 = p0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = catmullRomInterpolate( + p0[i][j], p1[i][j], p2[i][j], p3[i][j], + t, t2, t3 + ); + } + } + } + } + + /** + * Catmull Rom interpolate number + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @param {number} t2 + * @param {number} t3 + * @return {number} + */ + function catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; + } + + function cloneValue(value) { + if (isArrayLike(value)) { + var len = value.length; + if (isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } + + return arraySlice.call(value); + } + + return value; + } + + function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]); + rgba[1] = Math.floor(rgba[1]); + rgba[2] = Math.floor(rgba[2]); + + return 'rgba(' + rgba.join(',') + ')'; + } + + function createTrackClip (animator, easing, oneTrackDone, keyframes, propName) { + var getter = animator._getter; + var setter = animator._setter; + var useSpline = easing === 'spline'; + + var trackLen = keyframes.length; + if (!trackLen) { + return; + } + // Guess data type + var firstVal = keyframes[0].value; + var isValueArray = isArrayLike(firstVal); + var isValueColor = false; + var isValueString = false; + + // For vertices morphing + var arrDim = ( + isValueArray + && isArrayLike(firstVal[0]) + ) + ? 2 : 1; + var trackMaxTime; + // Sort keyframe as ascending + keyframes.sort(function(a, b) { + return a.time - b.time; + }); + + trackMaxTime = keyframes[trackLen - 1].time; + // Percents of each keyframe + var kfPercents = []; + // Value of each keyframe + var kfValues = []; + var prevValue = keyframes[0].value; + var isAllValueEqual = true; + for (var i = 0; i < trackLen; i++) { + kfPercents.push(keyframes[i].time / trackMaxTime); + // Assume value is a color when it is a string + var value = keyframes[i].value; + + // Check if value is equal, deep check if value is array + if (!((isValueArray && isArraySame(value, prevValue, arrDim)) + || (!isValueArray && value === prevValue))) { + isAllValueEqual = false; + } + prevValue = value; + + // Try converting a string to a color array + if (typeof value == 'string') { + var colorArray = color.parse(value); + if (colorArray) { + value = colorArray; + isValueColor = true; + } + else { + isValueString = true; + } + } + kfValues.push(value); + } + if (isAllValueEqual) { + return; + } + + if (isValueArray) { + var lastValue = kfValues[trackLen - 1]; + // Polyfill array + for (var i = 0; i < trackLen - 1; i++) { + fillArr(kfValues[i], lastValue, arrDim); + } + fillArr(getter(animator._target, propName), lastValue, arrDim); + } + + // Cache the key of last frame to speed up when + // animation playback is sequency + var lastFrame = 0; + var lastFramePercent = 0; + var start; + var w; + var p0; + var p1; + var p2; + var p3; + + if (isValueColor) { + var rgba = [0, 0, 0, 0]; + } + + var onframe = function (target, percent) { + // Find the range keyframes + // kf1-----kf2---------current--------kf3 + // find kf2 and kf3 and do interpolation + var frame; + if (percent < lastFramePercent) { + // Start from next key + start = Math.min(lastFrame + 1, trackLen - 1); + for (frame = start; frame >= 0; frame--) { + if (kfPercents[frame] <= percent) { + break; + } + } + frame = Math.min(frame, trackLen - 2); + } + else { + for (frame = lastFrame; frame < trackLen; frame++) { + if (kfPercents[frame] > percent) { + break; + } + } + frame = Math.min(frame - 1, trackLen - 2); + } + lastFrame = frame; + lastFramePercent = percent; + + var range = (kfPercents[frame + 1] - kfPercents[frame]); + if (range === 0) { + return; + } + else { + w = (percent - kfPercents[frame]) / range; + } + if (useSpline) { + p1 = kfValues[frame]; + p0 = kfValues[frame === 0 ? frame : frame - 1]; + p2 = kfValues[frame > trackLen - 2 ? trackLen - 1 : frame + 1]; + p3 = kfValues[frame > trackLen - 3 ? trackLen - 1 : frame + 2]; + if (isValueArray) { + catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + getter(target, propName), + arrDim + ); + } + else { + var value; + if (isValueColor) { + value = catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + rgba, 1 + ); + value = rgba2String(rgba); + } + else if (isValueString) { + // String is step(0.5) + return interpolateString(p1, p2, w); + } + else { + value = catmullRomInterpolate( + p0, p1, p2, p3, w, w * w, w * w * w + ); + } + setter( + target, + propName, + value + ); + } + } + else { + if (isValueArray) { + interpolateArray( + kfValues[frame], kfValues[frame + 1], w, + getter(target, propName), + arrDim + ); + } + else { + var value; + if (isValueColor) { + interpolateArray( + kfValues[frame], kfValues[frame + 1], w, + rgba, 1 + ); + value = rgba2String(rgba); + } + else if (isValueString) { + // String is step(0.5) + return interpolateString(kfValues[frame], kfValues[frame + 1], w); + } + else { + value = interpolateNumber(kfValues[frame], kfValues[frame + 1], w); + } + setter( + target, + propName, + value + ); + } + } + }; + + var clip = new Clip({ + target: animator._target, + life: trackMaxTime, + loop: animator._loop, + delay: animator._delay, + onframe: onframe, + ondestroy: oneTrackDone + }); + + if (easing && easing !== 'spline') { + clip.easing = easing; + } + + return clip; + } + + /** + * @alias module:zrender/animation/Animator + * @constructor + * @param {Object} target + * @param {boolean} loop + * @param {Function} getter + * @param {Function} setter + */ + var Animator = function(target, loop, getter, setter) { + this._tracks = {}; + this._target = target; + + this._loop = loop || false; + + this._getter = getter || defaultGetter; + this._setter = setter || defaultSetter; + + this._clipCount = 0; + + this._delay = 0; + + this._doneList = []; + + this._onframeList = []; + + this._clipList = []; + }; + + Animator.prototype = { + /** + * 设置动画关键帧 + * @param {number} time 关键帧时间,单位是ms + * @param {Object} props 关键帧的属性值,key-value表示 + * @return {module:zrender/animation/Animator} + */ + when: function(time /* ms */, props) { + var tracks = this._tracks; + for (var propName in props) { + if (!tracks[propName]) { + tracks[propName] = []; + // Invalid value + var value = this._getter(this._target, propName); + if (value == null) { + // zrLog('Invalid property ' + propName); + continue; + } + // If time is 0 + // Then props is given initialize value + // Else + // Initialize value from current prop value + if (time !== 0) { + tracks[propName].push({ + time: 0, + value: cloneValue(value) + }); + } + } + tracks[propName].push({ + time: time, + value: props[propName] + }); + } + return this; + }, + /** + * 添加动画每一帧的回调函数 + * @param {Function} callback + * @return {module:zrender/animation/Animator} + */ + during: function (callback) { + this._onframeList.push(callback); + return this; + }, + + _doneCallback: function () { + // Clear all tracks + this._tracks = {}; + // Clear all clips + this._clipList.length = 0; + + var doneList = this._doneList; + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + }, + /** + * 开始执行动画 + * @param {string|Function} easing + * 动画缓动函数,详见{@link module:zrender/animation/easing} + * @return {module:zrender/animation/Animator} + */ + start: function (easing) { + + var self = this; + var clipCount = 0; + + var oneTrackDone = function() { + clipCount--; + if (!clipCount) { + self._doneCallback(); + } + }; + + var lastClip; + for (var propName in this._tracks) { + var clip = createTrackClip( + this, easing, oneTrackDone, + this._tracks[propName], propName + ); + if (clip) { + this._clipList.push(clip); + clipCount++; + + // If start after added to animation + if (this.animation) { + this.animation.addClip(clip); + } + + lastClip = clip; + } + } + + // Add during callback on the last clip + if (lastClip) { + var oldOnFrame = lastClip.onframe; + lastClip.onframe = function (target, percent) { + oldOnFrame(target, percent); + + for (var i = 0; i < self._onframeList.length; i++) { + self._onframeList[i](target, percent); + } + }; + } + + if (!clipCount) { + this._doneCallback(); + } + return this; + }, + /** + * 停止动画 + * @param {boolean} forwardToLast If move to last frame before stop + */ + stop: function (forwardToLast) { + var clipList = this._clipList; + var animation = this.animation; + for (var i = 0; i < clipList.length; i++) { + var clip = clipList[i]; + if (forwardToLast) { + // Move to last frame before stop + clip.onframe(this._target, 1); + } + animation && animation.removeClip(clip); + } + clipList.length = 0; + }, + /** + * 设置动画延迟开始的时间 + * @param {number} time 单位ms + * @return {module:zrender/animation/Animator} + */ + delay: function (time) { + this._delay = time; + return this; + }, + /** + * 添加动画结束的回调 + * @param {Function} cb + * @return {module:zrender/animation/Animator} + */ + done: function(cb) { + if (cb) { + this._doneList.push(cb); + } + return this; + }, + + /** + * @return {Array.} + */ + getClips: function () { + return this._clipList; + } + }; + + module.exports = Animator; + + +/***/ }, +/* 36 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 动画主控制器 + * @config target 动画对象,可以是数组,如果是数组的话会批量分发onframe等事件 + * @config life(1000) 动画时长 + * @config delay(0) 动画延迟时间 + * @config loop(true) + * @config gap(0) 循环的间隔时间 + * @config onframe + * @config easing(optional) + * @config ondestroy(optional) + * @config onrestart(optional) + * + * TODO pause + */ + + + var easingFuncs = __webpack_require__(37); + + function Clip(options) { + + this._target = options.target; + + // 生命周期 + this._life = options.life || 1000; + // 延时 + this._delay = options.delay || 0; + // 开始时间 + // this._startTime = new Date().getTime() + this._delay;// 单位毫秒 + this._initialized = false; + + // 是否循环 + this.loop = options.loop == null ? false : options.loop; + + this.gap = options.gap || 0; + + this.easing = options.easing || 'Linear'; + + this.onframe = options.onframe; + this.ondestroy = options.ondestroy; + this.onrestart = options.onrestart; + } + + Clip.prototype = { + + constructor: Clip, + + step: function (time) { + // Set startTime on first step, or _startTime may has milleseconds different between clips + // PENDING + if (!this._initialized) { + this._startTime = new Date().getTime() + this._delay; + this._initialized = true; + } + + var percent = (time - this._startTime) / this._life; + + // 还没开始 + if (percent < 0) { + return; + } + + percent = Math.min(percent, 1); + + var easing = this.easing; + var easingFunc = typeof easing == 'string' ? easingFuncs[easing] : easing; + var schedule = typeof easingFunc === 'function' + ? easingFunc(percent) + : percent; + + this.fire('frame', schedule); + + // 结束 + if (percent == 1) { + if (this.loop) { + this.restart(); + // 重新开始周期 + // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件 + return 'restart'; + } + + // 动画完成将这个控制器标识为待删除 + // 在Animation.update中进行批量删除 + this._needsRemove = true; + return 'destroy'; + } + + return null; + }, + + restart: function() { + var time = new Date().getTime(); + var remainder = (time - this._startTime) % this._life; + this._startTime = new Date().getTime() - remainder + this.gap; + + this._needsRemove = false; + }, + + fire: function(eventType, arg) { + eventType = 'on' + eventType; + if (this[eventType]) { + this[eventType](this._target, arg); + } + } + }; + + module.exports = Clip; + + + +/***/ }, +/* 37 */ +/***/ function(module, exports) { + + /** + * 缓动代码来自 https://github.com/sole/tween.js/blob/master/src/Tween.js + * @see http://sole.github.io/tween.js/examples/03_graphs.html + * @exports zrender/animation/easing + */ + + var easing = { + /** + * @param {number} k + * @return {number} + */ + linear: function (k) { + return k; + }, + + /** + * @param {number} k + * @return {number} + */ + quadraticIn: function (k) { + return k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quadraticOut: function (k) { + return k * (2 - k); + }, + /** + * @param {number} k + * @return {number} + */ + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + + // 三次方的缓动(t^3) + /** + * @param {number} k + * @return {number} + */ + cubicIn: function (k) { + return k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + cubicOut: function (k) { + return --k * k * k + 1; + }, + /** + * @param {number} k + * @return {number} + */ + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + + // 四次方的缓动(t^4) + /** + * @param {number} k + * @return {number} + */ + quarticIn: function (k) { + return k * k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + /** + * @param {number} k + * @return {number} + */ + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + + // 五次方的缓动(t^5) + /** + * @param {number} k + * @return {number} + */ + quinticIn: function (k) { + return k * k * k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + /** + * @param {number} k + * @return {number} + */ + quinticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }, + + // 正弦曲线的缓动(sin(t)) + /** + * @param {number} k + * @return {number} + */ + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + /** + * @param {number} k + * @return {number} + */ + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + /** + * @param {number} k + * @return {number} + */ + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + + // 指数曲线的缓动(2^t) + /** + * @param {number} k + * @return {number} + */ + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + /** + * @param {number} k + * @return {number} + */ + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + /** + * @param {number} k + * @return {number} + */ + exponentialInOut: function (k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }, + + // 圆形曲线的缓动(sqrt(1-t^2)) + /** + * @param {number} k + * @return {number} + */ + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + /** + * @param {number} k + * @return {number} + */ + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + /** + * @param {number} k + * @return {number} + */ + circularInOut: function (k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }, + + // 创建类似于弹簧在停止前来回振荡的动画 + /** + * @param {number} k + * @return {number} + */ + elasticIn: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) * + Math.sin((k - s) * (2 * Math.PI) / p)); + }, + /** + * @param {number} k + * @return {number} + */ + elasticOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) * + Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }, + /** + * @param {number} k + * @return {number} + */ + elasticInOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + + }, + + // 在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动 + /** + * @param {number} k + * @return {number} + */ + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + /** + * @param {number} k + * @return {number} + */ + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + /** + * @param {number} k + * @return {number} + */ + backInOut: function (k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }, + + // 创建弹跳效果 + /** + * @param {number} k + * @return {number} + */ + bounceIn: function (k) { + return 1 - easing.bounceOut(1 - k); + }, + /** + * @param {number} k + * @return {number} + */ + bounceOut: function (k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } + else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } + else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } + else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }, + /** + * @param {number} k + * @return {number} + */ + bounceInOut: function (k) { + if (k < 0.5) { + return easing.bounceIn(k * 2) * 0.5; + } + return easing.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } + }; + + module.exports = easing; + + + + +/***/ }, +/* 38 */ +/***/ function(module, exports) { + + /** + * @module zrender/tool/color + */ + + + var kCSSColorTable = { + 'transparent': [0,0,0,0], 'aliceblue': [240,248,255,1], + 'antiquewhite': [250,235,215,1], 'aqua': [0,255,255,1], + 'aquamarine': [127,255,212,1], 'azure': [240,255,255,1], + 'beige': [245,245,220,1], 'bisque': [255,228,196,1], + 'black': [0,0,0,1], 'blanchedalmond': [255,235,205,1], + 'blue': [0,0,255,1], 'blueviolet': [138,43,226,1], + 'brown': [165,42,42,1], 'burlywood': [222,184,135,1], + 'cadetblue': [95,158,160,1], 'chartreuse': [127,255,0,1], + 'chocolate': [210,105,30,1], 'coral': [255,127,80,1], + 'cornflowerblue': [100,149,237,1], 'cornsilk': [255,248,220,1], + 'crimson': [220,20,60,1], 'cyan': [0,255,255,1], + 'darkblue': [0,0,139,1], 'darkcyan': [0,139,139,1], + 'darkgoldenrod': [184,134,11,1], 'darkgray': [169,169,169,1], + 'darkgreen': [0,100,0,1], 'darkgrey': [169,169,169,1], + 'darkkhaki': [189,183,107,1], 'darkmagenta': [139,0,139,1], + 'darkolivegreen': [85,107,47,1], 'darkorange': [255,140,0,1], + 'darkorchid': [153,50,204,1], 'darkred': [139,0,0,1], + 'darksalmon': [233,150,122,1], 'darkseagreen': [143,188,143,1], + 'darkslateblue': [72,61,139,1], 'darkslategray': [47,79,79,1], + 'darkslategrey': [47,79,79,1], 'darkturquoise': [0,206,209,1], + 'darkviolet': [148,0,211,1], 'deeppink': [255,20,147,1], + 'deepskyblue': [0,191,255,1], 'dimgray': [105,105,105,1], + 'dimgrey': [105,105,105,1], 'dodgerblue': [30,144,255,1], + 'firebrick': [178,34,34,1], 'floralwhite': [255,250,240,1], + 'forestgreen': [34,139,34,1], 'fuchsia': [255,0,255,1], + 'gainsboro': [220,220,220,1], 'ghostwhite': [248,248,255,1], + 'gold': [255,215,0,1], 'goldenrod': [218,165,32,1], + 'gray': [128,128,128,1], 'green': [0,128,0,1], + 'greenyellow': [173,255,47,1], 'grey': [128,128,128,1], + 'honeydew': [240,255,240,1], 'hotpink': [255,105,180,1], + 'indianred': [205,92,92,1], 'indigo': [75,0,130,1], + 'ivory': [255,255,240,1], 'khaki': [240,230,140,1], + 'lavender': [230,230,250,1], 'lavenderblush': [255,240,245,1], + 'lawngreen': [124,252,0,1], 'lemonchiffon': [255,250,205,1], + 'lightblue': [173,216,230,1], 'lightcoral': [240,128,128,1], + 'lightcyan': [224,255,255,1], 'lightgoldenrodyellow': [250,250,210,1], + 'lightgray': [211,211,211,1], 'lightgreen': [144,238,144,1], + 'lightgrey': [211,211,211,1], 'lightpink': [255,182,193,1], + 'lightsalmon': [255,160,122,1], 'lightseagreen': [32,178,170,1], + 'lightskyblue': [135,206,250,1], 'lightslategray': [119,136,153,1], + 'lightslategrey': [119,136,153,1], 'lightsteelblue': [176,196,222,1], + 'lightyellow': [255,255,224,1], 'lime': [0,255,0,1], + 'limegreen': [50,205,50,1], 'linen': [250,240,230,1], + 'magenta': [255,0,255,1], 'maroon': [128,0,0,1], + 'mediumaquamarine': [102,205,170,1], 'mediumblue': [0,0,205,1], + 'mediumorchid': [186,85,211,1], 'mediumpurple': [147,112,219,1], + 'mediumseagreen': [60,179,113,1], 'mediumslateblue': [123,104,238,1], + 'mediumspringgreen': [0,250,154,1], 'mediumturquoise': [72,209,204,1], + 'mediumvioletred': [199,21,133,1], 'midnightblue': [25,25,112,1], + 'mintcream': [245,255,250,1], 'mistyrose': [255,228,225,1], + 'moccasin': [255,228,181,1], 'navajowhite': [255,222,173,1], + 'navy': [0,0,128,1], 'oldlace': [253,245,230,1], + 'olive': [128,128,0,1], 'olivedrab': [107,142,35,1], + 'orange': [255,165,0,1], 'orangered': [255,69,0,1], + 'orchid': [218,112,214,1], 'palegoldenrod': [238,232,170,1], + 'palegreen': [152,251,152,1], 'paleturquoise': [175,238,238,1], + 'palevioletred': [219,112,147,1], 'papayawhip': [255,239,213,1], + 'peachpuff': [255,218,185,1], 'peru': [205,133,63,1], + 'pink': [255,192,203,1], 'plum': [221,160,221,1], + 'powderblue': [176,224,230,1], 'purple': [128,0,128,1], + 'red': [255,0,0,1], 'rosybrown': [188,143,143,1], + 'royalblue': [65,105,225,1], 'saddlebrown': [139,69,19,1], + 'salmon': [250,128,114,1], 'sandybrown': [244,164,96,1], + 'seagreen': [46,139,87,1], 'seashell': [255,245,238,1], + 'sienna': [160,82,45,1], 'silver': [192,192,192,1], + 'skyblue': [135,206,235,1], 'slateblue': [106,90,205,1], + 'slategray': [112,128,144,1], 'slategrey': [112,128,144,1], + 'snow': [255,250,250,1], 'springgreen': [0,255,127,1], + 'steelblue': [70,130,180,1], 'tan': [210,180,140,1], + 'teal': [0,128,128,1], 'thistle': [216,191,216,1], + 'tomato': [255,99,71,1], 'turquoise': [64,224,208,1], + 'violet': [238,130,238,1], 'wheat': [245,222,179,1], + 'white': [255,255,255,1], 'whitesmoke': [245,245,245,1], + 'yellow': [255,255,0,1], 'yellowgreen': [154,205,50,1] + }; + + function clampCssByte(i) { // Clamp to integer 0 .. 255. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 255 ? 255 : i; + } + + function clampCssAngle(i) { // Clamp to integer 0 .. 360. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 360 ? 360 : i; + } + + function clampCssFloat(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; + } + + function parseCssInt(str) { // int or percentage. + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); + } + + function parseCssFloat(str) { // float or percentage. + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssFloat(parseFloat(str) / 100); + } + return clampCssFloat(parseFloat(str)); + } + + function cssHueToRgb(m1, m2, h) { + if (h < 0) { + h += 1; + } + else if (h > 1) { + h -= 1; + } + + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2/3 - h) * 6; + } + return m1; + } + + function lerp(a, b, p) { + return a + (b - a) * p; + } + + /** + * @param {string} colorStr + * @return {Array.} + * @memberOf module:zrender/util/color + */ + function parse(colorStr) { + if (!colorStr) { + return; + } + // colorStr may be not string + colorStr = colorStr + ''; + // Remove all whitespace, not compliant, but should just be more accepting. + var str = colorStr.replace(/ /g, '').toLowerCase(); + + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) { + return kCSSColorTable[str].slice(); // dup. + } + + // #abc and #abc123 syntax. + if (str.charAt(0) === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xfff)) { + return; // Covers NaN. + } + return [ + ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), + (iv & 0xf0) | ((iv & 0xf0) >> 4), + (iv & 0xf) | ((iv & 0xf) << 4), + 1 + ]; + } + else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xffffff)) { + return; // Covers NaN. + } + return [ + (iv & 0xff0000) >> 16, + (iv & 0xff00) >> 8, + iv & 0xff, + 1 + ]; + } + + return; + } + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; // To allow case fallthrough. + switch (fname) { + case 'rgba': + if (params.length !== 4) { + return; + } + alpha = parseCssFloat(params.pop()); // jshint ignore:line + // Fall through. + case 'rgb': + if (params.length !== 3) { + return; + } + return [ + parseCssInt(params[0]), + parseCssInt(params[1]), + parseCssInt(params[2]), + alpha + ]; + case 'hsla': + if (params.length !== 4) { + return; + } + params[3] = parseCssFloat(params[3]); + return hsla2rgba(params); + case 'hsl': + if (params.length !== 3) { + return; + } + return hsla2rgba(params); + default: + return; + } + } + + return; + } + + /** + * @param {Array.} hsla + * @return {Array.} rgba + */ + function hsla2rgba(hsla) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; // 0 .. 1 + // NOTE(deanm): According to the CSS spec s/l should only be + // percentages, but we don't bother and let float or percentage. + var s = parseCssFloat(hsla[1]); + var l = parseCssFloat(hsla[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + + var rgba = [ + clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), + clampCssByte(cssHueToRgb(m1, m2, h) * 255), + clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255) + ]; + + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + + return rgba; + } + + /** + * @param {Array.} rgba + * @return {Array.} hsla + */ + function rgba2hsla(rgba) { + if (!rgba) { + return; + } + + // RGB from 0 to 255 + var R = rgba[0] / 255; + var G = rgba[1] / 255; + var B = rgba[2] / 255; + + var vMin = Math.min(R, G, B); // Min. value of RGB + var vMax = Math.max(R, G, B); // Max. value of RGB + var delta = vMax - vMin; // Delta RGB value + + var L = (vMax + vMin) / 2; + var H; + var S; + // HSL results from 0 to 1 + if (delta === 0) { + H = 0; + S = 0; + } + else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } + else { + S = delta / (2 - vMax - vMin); + } + + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + + if (R === vMax) { + H = deltaB - deltaG; + } + else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } + else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + + if (H < 0) { + H += 1; + } + + if (H > 1) { + H -= 1; + } + } + + var hsla = [H * 360, S, L]; + + if (rgba[3] != null) { + hsla.push(rgba[3]); + } + + return hsla; + } + + /** + * @param {string} color + * @param {number} level + * @return {string} + * @memberOf module:zrender/util/color + */ + function lift(color, level) { + var colorArr = parse(color); + if (colorArr) { + for (var i = 0; i < 3; i++) { + if (level < 0) { + colorArr[i] = colorArr[i] * (1 - level) | 0; + } + else { + colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } + } + + /** + * @param {string} color + * @return {string} + * @memberOf module:zrender/util/color + */ + function toHex(color, level) { + var colorArr = parse(color); + if (colorArr) { + return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1); + } + } + + /** + * Map value to color. Faster than mapToColor methods because color is represented by rgba array + * @param {number} normalizedValue A float between 0 and 1. + * @param {Array.>} colors List of rgba color array + * @param {Array.} [out] Mapped gba color array + * @return {Array.} + */ + function fastMapToColor(normalizedValue, colors, out) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1) + ) { + return; + } + out = out || [0, 0, 0, 0]; + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = colors[leftIndex]; + var rightColor = colors[rightIndex]; + var dv = value - leftIndex; + out[0] = clampCssByte(lerp(leftColor[0], rightColor[0], dv)); + out[1] = clampCssByte(lerp(leftColor[1], rightColor[1], dv)); + out[2] = clampCssByte(lerp(leftColor[2], rightColor[2], dv)); + out[3] = clampCssByte(lerp(leftColor[3], rightColor[3], dv)); + return out; + } + /** + * @param {number} normalizedValue A float between 0 and 1. + * @param {Array.} colors Color list. + * @param {boolean=} fullOutput Default false. + * @return {(string|Object)} Result color. If fullOutput, + * return {color: ..., leftIndex: ..., rightIndex: ..., value: ...}, + * @memberOf module:zrender/util/color + */ + function mapToColor(normalizedValue, colors, fullOutput) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1) + ) { + return; + } + + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = parse(colors[leftIndex]); + var rightColor = parse(colors[rightIndex]); + var dv = value - leftIndex; + + var color = stringify( + [ + clampCssByte(lerp(leftColor[0], rightColor[0], dv)), + clampCssByte(lerp(leftColor[1], rightColor[1], dv)), + clampCssByte(lerp(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerp(leftColor[3], rightColor[3], dv)) + ], + 'rgba' + ); + + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; + } + + /** + * @param {Array} interval Array length === 2, + * each item is normalized value ([0, 1]). + * @param {Array.} colors Color list. + * @return {Array.} colors corresponding to the interval, + * each item is {color: 'xxx', offset: ...} + * where offset is between 0 and 1. + * @memberOf module:zrender/util/color + */ + function mapIntervalToColor(interval, colors) { + if (interval.length !== 2 || interval[1] < interval[0]) { + return; + } + + var info0 = mapToColor(interval[0], colors, true); + var info1 = mapToColor(interval[1], colors, true); + + var result = [{color: info0.color, offset: 0}]; + + var during = info1.value - info0.value; + var start = Math.max(info0.value, info0.rightIndex); + var end = Math.min(info1.value, info1.leftIndex); + + for (var i = start; during > 0 && i <= end; i++) { + result.push({ + color: colors[i], + offset: (i - info0.value) / during + }); + } + result.push({color: info1.color, offset: 1}); + + return result; + } + + /** + * @param {string} color + * @param {number=} h 0 ~ 360, ignore when null. + * @param {number=} s 0 ~ 1, ignore when null. + * @param {number=} l 0 ~ 1, ignore when null. + * @return {string} Color string in rgba format. + * @memberOf module:zrender/util/color + */ + function modifyHSL(color, h, s, l) { + color = parse(color); + + if (color) { + color = rgba2hsla(color); + h != null && (color[0] = clampCssAngle(h)); + s != null && (color[1] = parseCssFloat(s)); + l != null && (color[2] = parseCssFloat(l)); + + return stringify(hsla2rgba(color), 'rgba'); + } + } + + /** + * @param {string} color + * @param {number=} alpha 0 ~ 1 + * @return {string} Color string in rgba format. + * @memberOf module:zrender/util/color + */ + function modifyAlpha(color, alpha) { + color = parse(color); + + if (color && alpha != null) { + color[3] = clampCssFloat(alpha); + return stringify(color, 'rgba'); + } + } + + /** + * @param {Array.} colors Color list. + * @param {string} type 'rgba', 'hsva', ... + * @return {string} Result color. + */ + function stringify(arrColor, type) { + if (type === 'rgb' || type === 'hsv' || type === 'hsl') { + arrColor = arrColor.slice(0, 3); + } + return type + '(' + arrColor.join(',') + ')'; + } + + module.exports = { + parse: parse, + lift: lift, + toHex: toHex, + fastMapToColor: fastMapToColor, + mapToColor: mapToColor, + mapIntervalToColor: mapIntervalToColor, + modifyHSL: modifyHSL, + modifyAlpha: modifyAlpha, + stringify: stringify + }; + + + + +/***/ }, +/* 39 */ +/***/ function(module, exports, __webpack_require__) { + + + var config = __webpack_require__(40); + + /** + * @exports zrender/tool/log + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + module.exports = function() { + if (config.debugMode === 0) { + return; + } + else if (config.debugMode == 1) { + for (var k in arguments) { + throw new Error(arguments[k]); + } + } + else if (config.debugMode > 1) { + for (var k in arguments) { + console.log(arguments[k]); + } + } + }; + + /* for debug + return function(mes) { + document.getElementById('wrong-message').innerHTML = + mes + ' ' + (new Date() - 0) + + '
            ' + + document.getElementById('wrong-message').innerHTML; + }; + */ + + + +/***/ }, +/* 40 */ +/***/ function(module, exports) { + + + var dpr = 1; + // If in browser environment + if (typeof window !== 'undefined') { + dpr = Math.max(window.devicePixelRatio || 1, 1); + } + /** + * config默认配置项 + * @exports zrender/config + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + var config = { + /** + * debug日志选项:catchBrushException为true下有效 + * 0 : 不生成debug数据,发布用 + * 1 : 异常抛出,调试用 + * 2 : 控制台输出,调试用 + */ + debugMode: 0, + + // retina 屏幕优化 + devicePixelRatio: dpr + }; + module.exports = config; + + + + +/***/ }, +/* 41 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Group = __webpack_require__(29); + var componentUtil = __webpack_require__(20); + var clazzUtil = __webpack_require__(9); + + function Chart() { + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = componentUtil.getUID('viewChart'); + } + + Chart.prototype = { + + type: 'chart', + + /** + * Init the chart + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + init: function (ecModel, api) {}, + + /** + * Render the chart + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + render: function (seriesModel, ecModel, api, payload) {}, + + /** + * Highlight series or specified data item + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + highlight: function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'emphasis'); + }, + + /** + * Downplay series or specified data item + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + downplay: function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'normal'); + }, + + /** + * Remove self + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + remove: function (ecModel, api) { + this.group.removeAll(); + }, + + /** + * Dispose self + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + dispose: function () {} + }; + + var chartProto = Chart.prototype; + chartProto.updateView + = chartProto.updateLayout + = chartProto.updateVisual + = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + + /** + * Set state of single element + * @param {module:zrender/Element} el + * @param {string} state + */ + function elSetState(el, state) { + if (el) { + el.trigger(state); + if (el.type === 'group') { + for (var i = 0; i < el.childCount(); i++) { + elSetState(el.childAt(i), state); + } + } + } + } + /** + * @param {module:echarts/data/List} data + * @param {Object} payload + * @param {string} state 'normal'|'emphasis' + * @inner + */ + function toggleHighlight(data, payload, state) { + if (payload.dataIndex != null) { + var el = data.getItemGraphicEl(payload.dataIndex); + elSetState(el, state); + } + else if (payload.name) { + var dataIndex = data.indexOfName(payload.name); + var el = data.getItemGraphicEl(dataIndex); + elSetState(el, state); + } + else { + data.eachItemGraphicEl(function (el) { + elSetState(el, state); + }); + } + } + + // Enable Chart.extend. + clazzUtil.enableClassExtend(Chart); + + // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. + clazzUtil.enableClassManagement(Chart, {registerWhenExtend: true}); + + module.exports = Chart; + + +/***/ }, +/* 42 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var pathTool = __webpack_require__(43); + var round = Math.round; + var Path = __webpack_require__(44); + var colorTool = __webpack_require__(38); + var matrix = __webpack_require__(17); + var vector = __webpack_require__(16); + var Gradient = __webpack_require__(4); + + var graphic = {}; + + graphic.Group = __webpack_require__(29); + + graphic.Image = __webpack_require__(59); + + graphic.Text = __webpack_require__(62); + + graphic.Circle = __webpack_require__(63); + + graphic.Sector = __webpack_require__(64); + + graphic.Ring = __webpack_require__(65); + + graphic.Polygon = __webpack_require__(66); + + graphic.Polyline = __webpack_require__(70); + + graphic.Rect = __webpack_require__(71); + + graphic.Line = __webpack_require__(72); + + graphic.BezierCurve = __webpack_require__(73); + + graphic.Arc = __webpack_require__(74); + + graphic.LinearGradient = __webpack_require__(75); + + graphic.RadialGradient = __webpack_require__(76); + + graphic.BoundingRect = __webpack_require__(15); + + /** + * Extend shape with parameters + */ + graphic.extendShape = function (opts) { + return Path.extend(opts); + }; + + /** + * Extend path + */ + graphic.extendPath = function (pathData, opts) { + return pathTool.extendFromString(pathData, opts); + }; + + /** + * Create a path element from path data string + * @param {string} pathData + * @param {Object} opts + * @param {module:zrender/core/BoundingRect} rect + * @param {string} [layout=cover] 'center' or 'cover' + */ + graphic.makePath = function (pathData, opts, rect, layout) { + var path = pathTool.createFromString(pathData, opts); + var boundingRect = path.getBoundingRect(); + if (rect) { + var aspect = boundingRect.width / boundingRect.height; + + if (layout === 'center') { + // Set rect to center, keep width / height ratio. + var width = rect.height * aspect; + var height; + if (width <= rect.width) { + height = rect.height; + } + else { + width = rect.width; + height = width / aspect; + } + var cx = rect.x + rect.width / 2; + var cy = rect.y + rect.height / 2; + + rect.x = cx - width / 2; + rect.y = cy - height / 2; + rect.width = width; + rect.height = height; + } + + this.resizePath(path, rect); + } + return path; + }; + + graphic.mergePath = pathTool.mergePath, + + /** + * Resize a path to fit the rect + * @param {module:zrender/graphic/Path} path + * @param {Object} rect + */ + graphic.resizePath = function (path, rect) { + if (!path.applyTransform) { + return; + } + + var pathRect = path.getBoundingRect(); + + var m = pathRect.calculateTransform(rect); + + path.applyTransform(m); + }; + + /** + * Sub pixel optimize line for canvas + * + * @param {Object} param + * @param {Object} [param.shape] + * @param {number} [param.shape.x1] + * @param {number} [param.shape.y1] + * @param {number} [param.shape.x2] + * @param {number} [param.shape.y2] + * @param {Object} [param.style] + * @param {number} [param.style.lineWidth] + * @return {Object} Modified param + */ + graphic.subPixelOptimizeLine = function (param) { + var subPixelOptimize = graphic.subPixelOptimize; + var shape = param.shape; + var lineWidth = param.style.lineWidth; + + if (round(shape.x1 * 2) === round(shape.x2 * 2)) { + shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true); + } + if (round(shape.y1 * 2) === round(shape.y2 * 2)) { + shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true); + } + return param; + }; + + /** + * Sub pixel optimize rect for canvas + * + * @param {Object} param + * @param {Object} [param.shape] + * @param {number} [param.shape.x] + * @param {number} [param.shape.y] + * @param {number} [param.shape.width] + * @param {number} [param.shape.height] + * @param {Object} [param.style] + * @param {number} [param.style.lineWidth] + * @return {Object} Modified param + */ + graphic.subPixelOptimizeRect = function (param) { + var subPixelOptimize = graphic.subPixelOptimize; + var shape = param.shape; + var lineWidth = param.style.lineWidth; + var originX = shape.x; + var originY = shape.y; + var originWidth = shape.width; + var originHeight = shape.height; + shape.x = subPixelOptimize(shape.x, lineWidth, true); + shape.y = subPixelOptimize(shape.y, lineWidth, true); + shape.width = Math.max( + subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x, + originWidth === 0 ? 0 : 1 + ); + shape.height = Math.max( + subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y, + originHeight === 0 ? 0 : 1 + ); + return param; + }; + + /** + * Sub pixel optimize for canvas + * + * @param {number} position Coordinate, such as x, y + * @param {number} lineWidth Should be nonnegative integer. + * @param {boolean=} positiveOrNegative Default false (negative). + * @return {number} Optimized position. + */ + graphic.subPixelOptimize = function (position, lineWidth, positiveOrNegative) { + // Assure that (position + lineWidth / 2) is near integer edge, + // otherwise line will be fuzzy in canvas. + var doubledPosition = round(position * 2); + return (doubledPosition + round(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; + }; + + /** + * @private + */ + function doSingleEnterHover(el) { + if (el.__isHover) { + return; + } + if (el.__hoverStlDirty) { + var stroke = el.style.stroke; + var fill = el.style.fill; + + // Create hoverStyle on mouseover + var hoverStyle = el.__hoverStl; + var lift = colorTool.lift; + hoverStyle.fill = hoverStyle.fill + || (fill && (fill instanceof Gradient ? fill : lift(fill, -0.1))); + hoverStyle.stroke = hoverStyle.stroke + || (stroke && (stroke instanceof Gradient ? stroke : lift(stroke, -0.1))); + + var normalStyle = {}; + for (var name in hoverStyle) { + if (hoverStyle.hasOwnProperty(name)) { + normalStyle[name] = el.style[name]; + } + } + + el.__normalStl = normalStyle; + + el.__hoverStlDirty = false; + } + el.setStyle(el.__hoverStl); + el.z2 += 1; + + el.__isHover = true; + } + + /** + * @inner + */ + function doSingleLeaveHover(el) { + if (!el.__isHover) { + return; + } + + var normalStl = el.__normalStl; + normalStl && el.setStyle(normalStl); + el.z2 -= 1; + + el.__isHover = false; + } + + /** + * @inner + */ + function doEnterHover(el) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + doSingleEnterHover(child); + } + }) + : doSingleEnterHover(el); + } + + function doLeaveHover(el) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + doSingleLeaveHover(child); + } + }) + : doSingleLeaveHover(el); + } + + /** + * @inner + */ + function setElementHoverStl(el, hoverStl) { + // If element has sepcified hoverStyle, then use it instead of given hoverStyle + // Often used when item group has a label element and it's hoverStyle is different + el.__hoverStl = el.hoverStyle || hoverStl || {}; + el.__hoverStlDirty = true; + } + + /** + * @inner + */ + function onElementMouseOver() { + // Only if element is not in emphasis status + !this.__isEmphasis && doEnterHover(this); + } + + /** + * @inner + */ + function onElementMouseOut() { + // Only if element is not in emphasis status + !this.__isEmphasis && doLeaveHover(this); + } + + /** + * @inner + */ + function enterEmphasis() { + this.__isEmphasis = true; + doEnterHover(this); + } + + /** + * @inner + */ + function leaveEmphasis() { + this.__isEmphasis = false; + doLeaveHover(this); + } + + /** + * Set hover style of element + * @param {module:zrender/Element} el + * @param {Object} [hoverStyle] + */ + graphic.setHoverStyle = function (el, hoverStyle) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + setElementHoverStl(child, hoverStyle); + } + }) + : setElementHoverStl(el, hoverStyle); + // Remove previous bound handlers + el.on('mouseover', onElementMouseOver) + .on('mouseout', onElementMouseOut); + + // Emphasis, normal can be triggered manually + el.on('emphasis', enterEmphasis) + .on('normal', leaveEmphasis); + }; + + /** + * Set text option in the style + * @param {Object} textStyle + * @param {module:echarts/model/Model} labelModel + * @param {string} color + */ + graphic.setText = function (textStyle, labelModel, color) { + var labelPosition = labelModel.getShallow('position') || 'inside'; + var labelColor = labelPosition.indexOf('inside') >= 0 ? 'white' : color; + var textStyleModel = labelModel.getModel('textStyle'); + zrUtil.extend(textStyle, { + textDistance: labelModel.getShallow('distance') || 5, + textFont: textStyleModel.getFont(), + textPosition: labelPosition, + textFill: textStyleModel.getTextColor() || labelColor + }); + }; + + function animateOrSetProps(isUpdate, el, props, animatableModel, cb) { + var postfix = isUpdate ? 'Update' : ''; + var duration = animatableModel + && animatableModel.getShallow('animationDuration' + postfix); + var animationEasing = animatableModel + && animatableModel.getShallow('animationEasing' + postfix); + + animatableModel && animatableModel.getShallow('animation') + ? el.animateTo(props, duration, animationEasing, cb) + : (el.attr(props), cb && cb()); + } + /** + * Update graphic element properties with or without animation according to the configuration in series + * @param {module:zrender/Element} el + * @param {Object} props + * @param {module:echarts/model/Model} [animatableModel] + * @param {Function} cb + */ + graphic.updateProps = zrUtil.curry(animateOrSetProps, true); + + /** + * Init graphic element properties with or without animation according to the configuration in series + * @param {module:zrender/Element} el + * @param {Object} props + * @param {module:echarts/model/Model} [animatableModel] + * @param {Function} cb + */ + graphic.initProps = zrUtil.curry(animateOrSetProps, false); + + /** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param {module:zrender/mixin/Transformable} target + * @param {module:zrender/mixin/Transformable} ancestor + */ + graphic.getTransform = function (target, ancestor) { + var mat = matrix.identity([]); + + while (target && target !== ancestor) { + matrix.mul(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + return mat; + }; + + /** + * Apply transform to an vertex. + * @param {Array.} vertex [x, y] + * @param {Array.} transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param {boolean=} invert Whether use invert matrix. + * @return {Array.} [x, y] + */ + graphic.applyTransform = function (vertex, transform, invert) { + if (invert) { + transform = matrix.invert([], transform); + } + return vector.applyTransform([], vertex, transform); + }; + + /** + * @param {string} direction 'left' 'right' 'top' 'bottom' + * @param {Array.} transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param {boolean=} invert Whether use invert matrix. + * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom' + */ + graphic.transformDirection = function (direction, transform, invert) { + + // Pick a base, ensure that transform result will not be (0, 0). + var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0) + ? 1 : Math.abs(2 * transform[4] / transform[0]); + var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0) + ? 1 : Math.abs(2 * transform[4] / transform[2]); + + var vertex = [ + direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, + direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0 + ]; + + vertex = graphic.applyTransform(vertex, transform, invert); + + return Math.abs(vertex[0]) > Math.abs(vertex[1]) + ? (vertex[0] > 0 ? 'right' : 'left') + : (vertex[1] > 0 ? 'bottom' : 'top'); + }; + + module.exports = graphic; + + +/***/ }, +/* 43 */ +/***/ function(module, exports, __webpack_require__) { + + + + var Path = __webpack_require__(44); + var PathProxy = __webpack_require__(48); + var transformPath = __webpack_require__(58); + var matrix = __webpack_require__(17); + + // command chars + var cc = [ + 'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', + 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A' + ]; + + var mathSqrt = Math.sqrt; + var mathSin = Math.sin; + var mathCos = Math.cos; + var PI = Math.PI; + + var vMag = function(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); + }; + var vRatio = function(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); + }; + var vAngle = function(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) + * Math.acos(vRatio(u, v)); + }; + + function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { + var psi = psiDeg * (PI / 180.0); + var xp = mathCos(psi) * (x1 - x2) / 2.0 + + mathSin(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0 + + mathCos(psi) * (y1 - y2) / 2.0; + + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + + if (lambda > 1) { + rx *= mathSqrt(lambda); + ry *= mathSqrt(lambda); + } + + var f = (fa === fs ? -1 : 1) + * mathSqrt((((rx * rx) * (ry * ry)) + - ((rx * rx) * (yp * yp)) + - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + + (ry * ry) * (xp * xp)) + ) || 0; + + var cxp = f * rx * yp / ry; + var cyp = f * -ry * xp / rx; + + var cx = (x1 + x2) / 2.0 + + mathCos(psi) * cxp + - mathSin(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin(psi) * cxp + + mathCos(psi) * cyp; + + var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]); + var u = [ (xp - cxp) / rx, (yp - cyp) / ry ]; + var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ]; + var dTheta = vAngle(u, v); + + if (vRatio(u, v) <= -1) { + dTheta = PI; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (fs === 0 && dTheta > 0) { + dTheta = dTheta - 2 * PI; + } + if (fs === 1 && dTheta < 0) { + dTheta = dTheta + 2 * PI; + } + + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); + } + + function createPathProxyFromString(data) { + if (!data) { + return []; + } + + // command string + var cs = data.replace(/-/g, ' -') + .replace(/ /g, ' ') + .replace(/ /g, ',') + .replace(/,,/g, ','); + + var n; + // create pipes so that we can split the data + for (n = 0; n < cc.length; n++) { + cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]); + } + + // create array + var arr = cs.split('|'); + // init context point + var cpx = 0; + var cpy = 0; + + var path = new PathProxy(); + var CMD = PathProxy.CMD; + + var prevCmd; + for (n = 1; n < arr.length; n++) { + var str = arr[n]; + var c = str.charAt(0); + var off = 0; + var p = str.slice(1).replace(/e,-/g, 'e-').split(','); + var cmd; + + if (p.length > 0 && p[0] === '') { + p.shift(); + } + + for (var i = 0; i < p.length; i++) { + p[i] = parseFloat(p[i]); + } + while (off < p.length && !isNaN(p[off])) { + if (isNaN(p[0])) { + break; + } + var ctlPtx; + var ctlPty; + + var rx; + var ry; + var psi; + var fa; + var fs; + + var x1 = cpx; + var y1 = cpy; + + // convert l, H, h, V, and v to L + switch (c) { + case 'l': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'L': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'm': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + c = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + c = 'L'; + break; + case 'h': + cpx += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'H': + cpx = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'v': + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'V': + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'C': + cmd = CMD.C; + path.addData( + cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++] + ); + cpx = p[off - 2]; + cpy = p[off - 1]; + break; + case 'c': + cmd = CMD.C; + path.addData( + cmd, + p[off++] + cpx, p[off++] + cpy, + p[off++] + cpx, p[off++] + cpy, + p[off++] + cpx, p[off++] + cpy + ); + cpx += p[off - 2]; + cpy += p[off - 1]; + break; + case 'S': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 's': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = cpx + p[off++]; + y1 = cpy + p[off++]; + cpx += p[off++]; + cpy += p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 'Q': + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'q': + x1 = p[off++] + cpx; + y1 = p[off++] + cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'T': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 't': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 'A': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + + x1 = cpx, y1 = cpy; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.A; + processArc( + x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path + ); + break; + case 'a': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + + x1 = cpx, y1 = cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.A; + processArc( + x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path + ); + break; + } + } + + if (c === 'z' || c === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + } + + prevCmd = cmd; + } + + path.toStatic(); + + return path; + } + + // TODO Optimize double memory cost problem + function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + var transform; + opts = opts || {}; + opts.buildPath = function (path) { + path.setData(pathProxy.data); + transform && transformPath(path, transform); + // Svg and vml renderer don't have context + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx); + } + }; + + opts.applyTransform = function (m) { + if (!transform) { + transform = matrix.create(); + } + matrix.mul(transform, m, transform); + }; + + return opts; + } + + module.exports = { + /** + * Create a Path object from path string data + * http://www.w3.org/TR/SVG/paths.html#PathData + * @param {Object} opts Other options + */ + createFromString: function (str, opts) { + return new Path(createPathOptions(str, opts)); + }, + + /** + * Create a Path class from path string data + * @param {string} str + * @param {Object} opts Other options + */ + extendFromString: function (str, opts) { + return Path.extend(createPathOptions(str, opts)); + }, + + /** + * Merge multiple paths + */ + // TODO Apply transform + // TODO stroke dash + // TODO Optimize double memory cost problem + mergePath: function (pathEls, opts) { + var pathList = []; + var len = pathEls.length; + var pathEl; + var i; + for (i = 0; i < len; i++) { + pathEl = pathEls[i]; + if (pathEl.__dirty) { + pathEl.buildPath(pathEl.path, pathEl.shape); + } + pathList.push(pathEl.path); + } + + var pathBundle = new Path(opts); + pathBundle.buildPath = function (path) { + path.appendPath(pathList); + // Svg and vml renderer don't have context + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx); + } + }; + + return pathBundle; + } + }; + + +/***/ }, +/* 44 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Path element + * @module zrender/graphic/Path + */ + + + + var Displayable = __webpack_require__(45); + var zrUtil = __webpack_require__(3); + var PathProxy = __webpack_require__(48); + var pathContain = __webpack_require__(51); + + var Gradient = __webpack_require__(4); + + function pathHasFill(style) { + var fill = style.fill; + return fill != null && fill !== 'none'; + } + + function pathHasStroke(style) { + var stroke = style.stroke; + return stroke != null && stroke !== 'none' && style.lineWidth > 0; + } + + var abs = Math.abs; + + /** + * @alias module:zrender/graphic/Path + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + function Path(opts) { + Displayable.call(this, opts); + + /** + * @type {module:zrender/core/PathProxy} + * @readOnly + */ + this.path = new PathProxy(); + } + + Path.prototype = { + + constructor: Path, + + type: 'path', + + __dirtyPath: true, + + strokeContainThreshold: 5, + + brush: function (ctx) { + ctx.save(); + + var style = this.style; + var path = this.path; + var hasStroke = pathHasStroke(style); + var hasFill = pathHasFill(style); + + if (this.__dirtyPath) { + // Update gradient because bounding rect may changed + if (hasFill && (style.fill instanceof Gradient)) { + style.fill.updateCanvasGradient(this, ctx); + } + if (hasStroke && (style.stroke instanceof Gradient)) { + style.stroke.updateCanvasGradient(this, ctx); + } + } + + style.bind(ctx, this); + this.setTransform(ctx); + + var lineDash = style.lineDash; + var lineDashOffset = style.lineDashOffset; + + var ctxLineDash = !!ctx.setLineDash; + + // Proxy context + // Rebuild path in following 2 cases + // 1. Path is dirty + // 2. Path needs javascript implemented lineDash stroking. + // In this case, lineDash information will not be saved in PathProxy + if (this.__dirtyPath || ( + lineDash && !ctxLineDash && hasStroke + )) { + path = this.path.beginPath(ctx); + + // Setting line dash before build path + if (lineDash && !ctxLineDash) { + path.setLineDash(lineDash); + path.setLineDashOffset(lineDashOffset); + } + + this.buildPath(path, this.shape); + + // Clear path dirty flag + this.__dirtyPath = false; + } + else { + // Replay path building + ctx.beginPath(); + this.path.rebuildPath(ctx); + } + + hasFill && path.fill(ctx); + + if (lineDash && ctxLineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + + hasStroke && path.stroke(ctx); + + // Draw rect text + if (style.text != null) { + // var rect = this.getBoundingRect(); + this.drawRectText(ctx, this.getBoundingRect()); + } + + ctx.restore(); + }, + + buildPath: function (ctx, shapeCfg) {}, + + getBoundingRect: function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var path = this.path; + if (this.__dirtyPath) { + path.beginPath(); + this.buildPath(path, this.shape); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + + if (pathHasStroke(style)) { + // Needs update rect with stroke lineWidth when + // 1. Element changes scale or lineWidth + // 2. Shape is changed + var rectWithStroke = this._rectWithStroke; + if (this.__dirty || needsUpdateRect) { + var rectWithStroke = this._rectWithStroke + || (this._rectWithStroke = rect.clone()); + rectWithStroke.copy(rect); + // FIXME Must after updateTransform + var w = style.lineWidth; + // PENDING, Min line width is needed when line is horizontal or vertical + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + + // Only add extra hover lineWidth when there are no fill + if (!pathHasFill(style)) { + w = Math.max(w, this.strokeContainThreshold); + } + // Consider line width + // Line scale can't be 0; + if (lineScale > 1e-10) { + rectWithStroke.width += w / lineScale; + rectWithStroke.height += w / lineScale; + rectWithStroke.x -= w / lineScale / 2; + rectWithStroke.y -= w / lineScale / 2; + } + } + + // Return rect with stroke + return rectWithStroke; + } + + return rect; + }, + + contain: function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + var style = this.style; + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + var pathData = this.path.data; + if (pathHasStroke(style)) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + // Line scale can't be 0; + if (lineScale > 1e-10) { + // Only add extra hover lineWidth when there are no fill + if (!pathHasFill(style)) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (pathContain.containStroke( + pathData, lineWidth / lineScale, x, y + )) { + return true; + } + } + } + if (pathHasFill(style)) { + return pathContain.contain(pathData, x, y); + } + } + return false; + }, + + /** + * @param {boolean} dirtyPath + */ + dirty: function (dirtyPath) { + if (arguments.length ===0) { + dirtyPath = true; + } + // Only mark dirty, not mark clean + if (dirtyPath) { + this.__dirtyPath = dirtyPath; + this._rect = null; + } + + this.__dirty = true; + + this.__zr && this.__zr.refresh(); + + // Used as a clipping path + if (this.__clipTarget) { + this.__clipTarget.dirty(); + } + }, + + /** + * Alias for animate('shape') + * @param {boolean} loop + */ + animateShape: function (loop) { + return this.animate('shape', loop); + }, + + // Overwrite attrKV + attrKV: function (key, value) { + // FIXME + if (key === 'shape') { + this.setShape(value); + } + else { + Displayable.prototype.attrKV.call(this, key, value); + } + }, + + /** + * @param {Object|string} key + * @param {*} value + */ + setShape: function (key, value) { + var shape = this.shape; + // Path from string may not have shape + if (shape) { + if (zrUtil.isObject(key)) { + for (var name in key) { + shape[name] = key[name]; + } + } + else { + shape[key] = value; + } + this.dirty(true); + } + return this; + }, + + getLineScale: function () { + var m = this.transform; + // Get the line scale. + // Determinant of `m` means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 + ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) + : 1; + } + }; + + /** + * 扩展一个 Path element, 比如星形,圆等。 + * Extend a path element + * @param {Object} props + * @param {string} props.type Path type + * @param {Function} props.init Initialize + * @param {Function} props.buildPath Overwrite buildPath method + * @param {Object} [props.style] Extended default style config + * @param {Object} [props.shape] Extended default shape config + */ + Path.extend = function (defaults) { + var Sub = function (opts) { + Path.call(this, opts); + + if (defaults.style) { + // Extend default style + this.style.extendFrom(defaults.style, false); + } + + // Extend default shape + var defaultShape = defaults.shape; + if (defaultShape) { + this.shape = this.shape || {}; + var thisShape = this.shape; + for (var name in defaultShape) { + if ( + ! thisShape.hasOwnProperty(name) + && defaultShape.hasOwnProperty(name) + ) { + thisShape[name] = defaultShape[name]; + } + } + } + + defaults.init && defaults.init.call(this, opts); + }; + + zrUtil.inherits(Sub, Path); + + // FIXME 不能 extend position, rotation 等引用对象 + for (var name in defaults) { + // Extending prototype values and methods + if (name !== 'style' && name !== 'shape') { + Sub.prototype[name] = defaults[name]; + } + } + + return Sub; + }; + + zrUtil.inherits(Path, Displayable); + + module.exports = Path; + + +/***/ }, +/* 45 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 可绘制的图形基类 + * Base class of all displayable graphic objects + * @module zrender/graphic/Displayable + */ + + + + var zrUtil = __webpack_require__(3); + + var Style = __webpack_require__(46); + + var Element = __webpack_require__(30); + var RectText = __webpack_require__(47); + // var Stateful = require('./mixin/Stateful'); + + /** + * @alias module:zrender/graphic/Displayable + * @extends module:zrender/Element + * @extends module:zrender/graphic/mixin/RectText + */ + function Displayable(opts) { + + opts = opts || {}; + + Element.call(this, opts); + + // Extend properties + for (var name in opts) { + if ( + opts.hasOwnProperty(name) && + name !== 'style' + ) { + this[name] = opts[name]; + } + } + + /** + * @type {module:zrender/graphic/Style} + */ + this.style = new Style(opts.style); + + this._rect = null; + // Shapes for cascade clipping. + this.__clipPaths = []; + + // FIXME Stateful must be mixined after style is setted + // Stateful.call(this, opts); + } + + Displayable.prototype = { + + constructor: Displayable, + + type: 'displayable', + + /** + * Displayable 是否为脏,Painter 中会根据该标记判断是否需要是否需要重新绘制 + * Dirty flag. From which painter will determine if this displayable object needs brush + * @name module:zrender/graphic/Displayable#__dirty + * @type {boolean} + */ + __dirty: true, + + /** + * 图形是否可见,为true时不绘制图形,但是仍能触发鼠标事件 + * If ignore drawing of the displayable object. Mouse event will still be triggered + * @name module:/zrender/graphic/Displayable#invisible + * @type {boolean} + * @default false + */ + invisible: false, + + /** + * @name module:/zrender/graphic/Displayable#z + * @type {number} + * @default 0 + */ + z: 0, + + /** + * @name module:/zrender/graphic/Displayable#z + * @type {number} + * @default 0 + */ + z2: 0, + + /** + * z层level,决定绘画在哪层canvas中 + * @name module:/zrender/graphic/Displayable#zlevel + * @type {number} + * @default 0 + */ + zlevel: 0, + + /** + * 是否可拖拽 + * @name module:/zrender/graphic/Displayable#draggable + * @type {boolean} + * @default false + */ + draggable: false, + + /** + * 是否正在拖拽 + * @name module:/zrender/graphic/Displayable#draggable + * @type {boolean} + * @default false + */ + dragging: false, + + /** + * 是否相应鼠标事件 + * @name module:/zrender/graphic/Displayable#silent + * @type {boolean} + * @default false + */ + silent: false, + + /** + * If enable culling + * @type {boolean} + * @default false + */ + culling: false, + + /** + * Mouse cursor when hovered + * @name module:/zrender/graphic/Displayable#cursor + * @type {string} + */ + cursor: 'pointer', + + /** + * If hover area is bounding rect + * @name module:/zrender/graphic/Displayable#rectHover + * @type {string} + */ + rectHover: false, + + beforeBrush: function (ctx) {}, + + afterBrush: function (ctx) {}, + + /** + * 图形绘制方法 + * @param {Canvas2DRenderingContext} ctx + */ + // Interface + brush: function (ctx) {}, + + /** + * 获取最小包围盒 + * @return {module:zrender/core/BoundingRect} + */ + // Interface + getBoundingRect: function () {}, + + /** + * 判断坐标 x, y 是否在图形上 + * If displayable element contain coord x, y + * @param {number} x + * @param {number} y + * @return {boolean} + */ + contain: function (x, y) { + return this.rectContain(x, y); + }, + + /** + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) { + cb.call(context, this); + }, + + /** + * 判断坐标 x, y 是否在图形的包围盒上 + * If bounding rect of element contain coord x, y + * @param {number} x + * @param {number} y + * @return {boolean} + */ + rectContain: function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }, + + /** + * 标记图形元素为脏,并且在下一帧重绘 + * Mark displayable element dirty and refresh next frame + */ + dirty: function () { + this.__dirty = true; + + this._rect = null; + + this.__zr && this.__zr.refresh(); + }, + + /** + * 图形是否会触发事件 + * If displayable object binded any event + * @return {boolean} + */ + // TODO, 通过 bind 绑定的事件 + // isSilent: function () { + // return !( + // this.hoverable || this.draggable + // || this.onmousemove || this.onmouseover || this.onmouseout + // || this.onmousedown || this.onmouseup || this.onclick + // || this.ondragenter || this.ondragover || this.ondragleave + // || this.ondrop + // ); + // }, + /** + * Alias for animate('style') + * @param {boolean} loop + */ + animateStyle: function (loop) { + return this.animate('style', loop); + }, + + attrKV: function (key, value) { + if (key !== 'style') { + Element.prototype.attrKV.call(this, key, value); + } + else { + this.style.set(value); + } + }, + + /** + * @param {Object|string} key + * @param {*} value + */ + setStyle: function (key, value) { + this.style.set(key, value); + this.dirty(false); + return this; + } + }; + + zrUtil.inherits(Displayable, Element); + + zrUtil.mixin(Displayable, RectText); + // zrUtil.mixin(Displayable, Stateful); + + module.exports = Displayable; + + +/***/ }, +/* 46 */ +/***/ function(module, exports) { + + /** + * @module zrender/graphic/Style + */ + + + + var STYLE_LIST_COMMON = [ + 'lineCap', 'lineJoin', 'miterLimit', + 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', 'shadowColor' + ]; + + var Style = function (opts) { + this.extendFrom(opts); + }; + + Style.prototype = { + + constructor: Style, + + /** + * @type {string} + */ + fill: '#000000', + + /** + * @type {string} + */ + stroke: null, + + /** + * @type {number} + */ + opacity: 1, + + /** + * @type {Array.} + */ + lineDash: null, + + /** + * @type {number} + */ + lineDashOffset: 0, + + /** + * @type {number} + */ + shadowBlur: 0, + + /** + * @type {number} + */ + shadowOffsetX: 0, + + /** + * @type {number} + */ + shadowOffsetY: 0, + + /** + * @type {number} + */ + lineWidth: 1, + + /** + * If stroke ignore scale + * @type {Boolean} + */ + strokeNoScale: false, + + // Bounding rect text configuration + // Not affected by element transform + /** + * @type {string} + */ + text: null, + + /** + * @type {string} + */ + textFill: '#000', + + /** + * @type {string} + */ + textStroke: null, + + /** + * 'inside', 'left', 'right', 'top', 'bottom' + * [x, y] + * @type {string|Array.} + * @default 'inside' + */ + textPosition: 'inside', + + /** + * @type {string} + */ + textBaseline: null, + + /** + * @type {string} + */ + textAlign: null, + + /** + * @type {string} + */ + textVerticalAlign: null, + + /** + * @type {number} + */ + textDistance: 5, + + /** + * @type {number} + */ + textShadowBlur: 0, + + /** + * @type {number} + */ + textShadowOffsetX: 0, + + /** + * @type {number} + */ + textShadowOffsetY: 0, + + /** + * @param {CanvasRenderingContext2D} ctx + */ + bind: function (ctx, el) { + var fill = this.fill; + var stroke = this.stroke; + for (var i = 0; i < STYLE_LIST_COMMON.length; i++) { + var styleName = STYLE_LIST_COMMON[i]; + + if (this[styleName] != null) { + ctx[styleName] = this[styleName]; + } + } + if (stroke != null) { + var lineWidth = this.lineWidth; + ctx.lineWidth = lineWidth / ( + (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1 + ); + } + if (fill != null) { + // Use canvas gradient if has + ctx.fillStyle = fill.canvasGradient ? fill.canvasGradient : fill; + } + if (stroke != null) { + // Use canvas gradient if has + ctx.strokeStyle = stroke.canvasGradient ? stroke.canvasGradient : stroke; + } + this.opacity != null && (ctx.globalAlpha = this.opacity); + }, + + /** + * Extend from other style + * @param {zrender/graphic/Style} otherStyle + * @param {boolean} overwrite + */ + extendFrom: function (otherStyle, overwrite) { + if (otherStyle) { + var target = this; + for (var name in otherStyle) { + if (otherStyle.hasOwnProperty(name) + && (overwrite || ! target.hasOwnProperty(name)) + ) { + target[name] = otherStyle[name]; + } + } + } + }, + + /** + * Batch setting style with a given object + * @param {Object|string} obj + * @param {*} [obj] + */ + set: function (obj, value) { + if (typeof obj === 'string') { + this[obj] = value; + } + else { + this.extendFrom(obj, true); + } + }, + + /** + * Clone + * @return {zrender/graphic/Style} [description] + */ + clone: function () { + var newStyle = new this.constructor(); + newStyle.extendFrom(this, true); + return newStyle; + } + }; + + var styleProto = Style.prototype; + var name; + var i; + for (i = 0; i < STYLE_LIST_COMMON.length; i++) { + name = STYLE_LIST_COMMON[i]; + if (!(name in styleProto)) { + styleProto[name] = null; + } + } + + module.exports = Style; + + +/***/ }, +/* 47 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Mixin for drawing text in a element bounding rect + * @module zrender/mixin/RectText + */ + + + + var textContain = __webpack_require__(14); + var BoundingRect = __webpack_require__(15); + + var tmpRect = new BoundingRect(); + + var RectText = function () {}; + + function parsePercent(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + } + + function setTransform(ctx, m) { + ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); + } + + RectText.prototype = { + + constructor: RectText, + + /** + * Draw text in a rect with specified position. + * @param {CanvasRenderingContext} ctx + * @param {Object} rect Displayable rect + * @return {Object} textRect Alternative precalculated text bounding rect + */ + drawRectText: function (ctx, rect, textRect) { + var style = this.style; + var text = style.text; + // Convert to string + text != null && (text += ''); + if (!text) { + return; + } + var x; + var y; + var textPosition = style.textPosition; + var distance = style.textDistance; + var align = style.textAlign; + var font = style.textFont || style.font; + var baseline = style.textBaseline; + var verticalAlign = style.textVerticalAlign; + + textRect = textRect || textContain.getBoundingRect(text, font, align, baseline); + + // Transform rect to view space + var transform = this.transform; + var invTransform = this.invTransform; + if (transform) { + tmpRect.copy(rect); + tmpRect.applyTransform(transform); + rect = tmpRect; + // Transform back + setTransform(ctx, invTransform); + } + + // Text position represented by coord + if (textPosition instanceof Array) { + // Percent + x = rect.x + parsePercent(textPosition[0], rect.width); + y = rect.y + parsePercent(textPosition[1], rect.height); + align = align || 'left'; + baseline = baseline || 'top'; + } + else { + var res = textContain.adjustTextPositionOnRect( + textPosition, rect, textRect, distance + ); + x = res.x; + y = res.y; + // Default align and baseline when has textPosition + align = align || res.textAlign; + baseline = baseline || res.textBaseline; + } + + ctx.textAlign = align; + if (verticalAlign) { + switch (verticalAlign) { + case 'middle': + y -= textRect.height / 2; + break; + case 'bottom': + y -= textRect.height; + break; + // 'top' + } + // Ignore baseline + ctx.textBaseline = 'top'; + } + else { + ctx.textBaseline = baseline; + } + + var textFill = style.textFill; + var textStroke = style.textStroke; + textFill && (ctx.fillStyle = textFill); + textStroke && (ctx.strokeStyle = textStroke); + ctx.font = font; + + // Text shadow + ctx.shadowColor = style.textShadowColor; + ctx.shadowBlur = style.textShadowBlur; + ctx.shadowOffsetX = style.textShadowOffsetX; + ctx.shadowOffsetY = style.textShadowOffsetY; + + var textLines = text.split('\n'); + for (var i = 0; i < textLines.length; i++) { + textFill && ctx.fillText(textLines[i], x, y); + textStroke && ctx.strokeText(textLines[i], x, y); + y += textRect.lineHeight; + } + + // Transform again + transform && setTransform(ctx, transform); + } + }; + + module.exports = RectText; + + +/***/ }, +/* 48 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Path 代理,可以在`buildPath`中用于替代`ctx`, 会保存每个path操作的命令到pathCommands属性中 + * 可以用于 isInsidePath 判断以及获取boundingRect + * + * @module zrender/core/PathProxy + * @author Yi Shen (http://www.github.com/pissang) + */ + + // TODO getTotalLength, getPointAtLength + + + var curve = __webpack_require__(49); + var vec2 = __webpack_require__(16); + var bbox = __webpack_require__(50); + var BoundingRect = __webpack_require__(15); + + var CMD = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + // Rect + R: 7 + }; + + var min = []; + var max = []; + var min2 = []; + var max2 = []; + var mathMin = Math.min; + var mathMax = Math.max; + var mathCos = Math.cos; + var mathSin = Math.sin; + var mathSqrt = Math.sqrt; + + var hasTypedArray = typeof Float32Array != 'undefined'; + + /** + * @alias module:zrender/core/PathProxy + * @constructor + */ + var PathProxy = function () { + + /** + * Path data. Stored as flat array + * @type {Array.} + */ + this.data = []; + + this._len = 0; + + this._ctx = null; + + this._xi = 0; + this._yi = 0; + + this._x0 = 0; + this._y0 = 0; + }; + + /** + * 快速计算Path包围盒(并不是最小包围盒) + * @return {Object} + */ + PathProxy.prototype = { + + constructor: PathProxy, + + _lineDash: null, + + _dashOffset: 0, + + _dashIdx: 0, + + _dashSum: 0, + + getContext: function () { + return this._ctx; + }, + + /** + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + beginPath: function (ctx) { + this._ctx = ctx; + + ctx && ctx.beginPath(); + + // Reset + this._len = 0; + + if (this._lineDash) { + this._lineDash = null; + + this._dashOffset = 0; + } + + return this; + }, + + /** + * @param {number} x + * @param {number} y + * @return {module:zrender/core/PathProxy} + */ + moveTo: function (x, y) { + this.addData(CMD.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + + // x0, y0, xi, yi 是记录在 _dashedXXXXTo 方法中使用 + // xi, yi 记录当前点, x0, y0 在 closePath 的时候回到起始点。 + // 有可能在 beginPath 之后直接调用 lineTo,这时候 x0, y0 需要 + // 在 lineTo 方法中记录,这里先不考虑这种情况,dashed line 也只在 IE10- 中不支持 + this._x0 = x; + this._y0 = y; + + this._xi = x; + this._yi = y; + + return this; + }, + + /** + * @param {number} x + * @param {number} y + * @return {module:zrender/core/PathProxy} + */ + lineTo: function (x, y) { + this.addData(CMD.L, x, y); + if (this._ctx) { + this._needsDash() ? this._dashedLineTo(x, y) + : this._ctx.lineTo(x, y); + } + this._xi = x; + this._yi = y; + return this; + }, + + /** + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @return {module:zrender/core/PathProxy} + */ + bezierCurveTo: function (x1, y1, x2, y2, x3, y3) { + this.addData(CMD.C, x1, y1, x2, y2, x3, y3); + if (this._ctx) { + this._needsDash() ? this._dashedBezierTo(x1, y1, x2, y2, x3, y3) + : this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + this._xi = x3; + this._yi = y3; + return this; + }, + + /** + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @return {module:zrender/core/PathProxy} + */ + quadraticCurveTo: function (x1, y1, x2, y2) { + this.addData(CMD.Q, x1, y1, x2, y2); + if (this._ctx) { + this._needsDash() ? this._dashedQuadraticTo(x1, y1, x2, y2) + : this._ctx.quadraticCurveTo(x1, y1, x2, y2); + } + this._xi = x2; + this._yi = y2; + return this; + }, + + /** + * @param {number} cx + * @param {number} cy + * @param {number} r + * @param {number} startAngle + * @param {number} endAngle + * @param {boolean} anticlockwise + * @return {module:zrender/core/PathProxy} + */ + arc: function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this.addData( + CMD.A, cx, cy, r, r, startAngle, endAngle - startAngle, 0, anticlockwise ? 0 : 1 + ); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + + this._xi = mathCos(endAngle) * r + cx; + this._xi = mathSin(endAngle) * r + cx; + return this; + }, + + // TODO + arcTo: function (x1, y1, x2, y2, radius) { + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }, + + // TODO + rect: function (x, y, w, h) { + this._ctx && this._ctx.rect(x, y, w, h); + this.addData(CMD.R, x, y, w, h); + return this; + }, + + /** + * @return {module:zrender/core/PathProxy} + */ + closePath: function () { + this.addData(CMD.Z); + + var ctx = this._ctx; + var x0 = this._x0; + var y0 = this._y0; + if (ctx) { + this._needsDash() && this._dashedLineTo(x0, y0); + ctx.closePath(); + } + + this._xi = x0; + this._yi = y0; + return this; + }, + + /** + * Context 从外部传入,因为有可能是 rebuildPath 完之后再 fill。 + * stroke 同样 + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + fill: function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }, + + /** + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + stroke: function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }, + + /** + * 必须在其它绘制命令前调用 + * Must be invoked before all other path drawing methods + * @return {module:zrender/core/PathProxy} + */ + setLineDash: function (lineDash) { + if (lineDash instanceof Array) { + this._lineDash = lineDash; + + this._dashIdx = 0; + + var lineDashSum = 0; + for (var i = 0; i < lineDash.length; i++) { + lineDashSum += lineDash[i]; + } + this._dashSum = lineDashSum; + } + return this; + }, + + /** + * 必须在其它绘制命令前调用 + * Must be invoked before all other path drawing methods + * @return {module:zrender/core/PathProxy} + */ + setLineDashOffset: function (offset) { + this._dashOffset = offset; + return this; + }, + + /** + * + * @return {boolean} + */ + len: function () { + return this._len; + }, + + /** + * 直接设置 Path 数据 + */ + setData: function (data) { + + var len = data.length; + + if (! (this.data && this.data.length == len) && hasTypedArray) { + this.data = new Float32Array(len); + } + + for (var i = 0; i < len; i++) { + this.data[i] = data[i]; + } + + this._len = len; + }, + + /** + * 添加子路径 + * @param {module:zrender/core/PathProxy|Array.} path + */ + appendPath: function (path) { + if (!(path instanceof Array)) { + path = [path]; + } + var len = path.length; + var appendSize = 0; + var offset = this._len; + for (var i = 0; i < len; i++) { + appendSize += path[i].len(); + } + if (hasTypedArray && (this.data instanceof Float32Array)) { + this.data = new Float32Array(offset + appendSize); + } + for (var i = 0; i < len; i++) { + var appendPathData = path[i].data; + for (var k = 0; k < appendPathData.length; k++) { + this.data[offset++] = appendPathData[k]; + } + } + this._len = offset; + }, + + /** + * 填充 Path 数据。 + * 尽量复用而不申明新的数组。大部分图形重绘的指令数据长度都是不变的。 + */ + addData: function (cmd) { + var data = this.data; + if (this._len + arguments.length > data.length) { + // 因为之前的数组已经转换成静态的 Float32Array + // 所以不够用时需要扩展一个新的动态数组 + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + + this._prevCmd = cmd; + }, + + _expandData: function () { + // Only if data is Float32Array + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }, + + /** + * If needs js implemented dashed line + * @return {boolean} + * @private + */ + _needsDash: function () { + return this._lineDash; + }, + + _dashedLineTo: function (x1, y1) { + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var ctx = this._ctx; + + var x0 = this._xi; + var y0 = this._yi; + var dx = x1 - x0; + var dy = y1 - y0; + var dist = mathSqrt(dx * dx + dy * dy); + var x = x0; + var y = y0; + var dash; + var nDash = lineDash.length; + var idx; + dx /= dist; + dy /= dist; + + if (offset < 0) { + // Convert to positive offset + offset = dashSum + offset; + } + offset %= dashSum; + x -= offset * dx; + y -= offset * dy; + + while ((dx >= 0 && x <= x1) || (dx < 0 && x > x1)) { + idx = this._dashIdx; + dash = lineDash[idx]; + x += dx * dash; + y += dy * dash; + this._dashIdx = (idx + 1) % nDash; + // Skip positive offset + if ((dx > 0 && x < x0) || (dx < 0 && x > x0)) { + continue; + } + ctx[idx % 2 ? 'moveTo' : 'lineTo']( + dx >= 0 ? mathMin(x, x1) : mathMax(x, x1), + dy >= 0 ? mathMin(y, y1) : mathMax(y, y1) + ); + } + // Offset for next lineTo + dx = x - x1; + dy = y - y1; + this._dashOffset = -mathSqrt(dx * dx + dy * dy); + }, + + // Not accurate dashed line to + _dashedBezierTo: function (x1, y1, x2, y2, x3, y3) { + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var ctx = this._ctx; + + var x0 = this._xi; + var y0 = this._yi; + var t; + var dx; + var dy; + var cubicAt = curve.cubicAt; + var bezierLen = 0; + var idx = this._dashIdx; + var nDash = lineDash.length; + + var x; + var y; + + var tmpLen = 0; + + if (offset < 0) { + // Convert to positive offset + offset = dashSum + offset; + } + offset %= dashSum; + // Bezier approx length + for (t = 0; t < 1; t += 0.1) { + dx = cubicAt(x0, x1, x2, x3, t + 0.1) + - cubicAt(x0, x1, x2, x3, t); + dy = cubicAt(y0, y1, y2, y3, t + 0.1) + - cubicAt(y0, y1, y2, y3, t); + bezierLen += mathSqrt(dx * dx + dy * dy); + } + + // Find idx after add offset + for (; idx < nDash; idx++) { + tmpLen += lineDash[idx]; + if (tmpLen > offset) { + break; + } + } + t = (tmpLen - offset) / bezierLen; + + while (t <= 1) { + + x = cubicAt(x0, x1, x2, x3, t); + y = cubicAt(y0, y1, y2, y3, t); + + // Use line to approximate dashed bezier + // Bad result if dash is long + idx % 2 ? ctx.moveTo(x, y) + : ctx.lineTo(x, y); + + t += lineDash[idx] / bezierLen; + + idx = (idx + 1) % nDash; + } + + // Finish the last segment and calculate the new offset + (idx % 2 !== 0) && ctx.lineTo(x3, y3); + dx = x3 - x; + dy = y3 - y; + this._dashOffset = -mathSqrt(dx * dx + dy * dy); + }, + + _dashedQuadraticTo: function (x1, y1, x2, y2) { + // Convert quadratic to cubic using degree elevation + var x3 = x2; + var y3 = y2; + x2 = (x2 + 2 * x1) / 3; + y2 = (y2 + 2 * y1) / 3; + x1 = (this._xi + 2 * x1) / 3; + y1 = (this._yi + 2 * y1) / 3; + + this._dashedBezierTo(x1, y1, x2, y2, x3, y3); + }, + + /** + * 转成静态的 Float32Array 减少堆内存占用 + * Convert dynamic array to static Float32Array + */ + toStatic: function () { + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray) { + this.data = new Float32Array(data); + } + } + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function () { + min[0] = min[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max[0] = max[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = data[i]; + yi = data[i + 1]; + + x0 = xi; + y0 = yi; + } + + switch (cmd) { + case CMD.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD.L: + bbox.fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + bbox.fromCubic( + xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + min2, max2 + ); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + bbox.fromQuadratic( + xi, yi, data[i++], data[i++], data[i], data[i + 1], + min2, max2 + ); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + // TODO Arc 旋转 + var psi = data[i++]; + var anticlockwise = 1 - data[i++]; + + if (i == 1) { + // 直接使用 arc 命令 + // 第一个命令起点还未定义 + x0 = mathCos(startAngle) * rx + cx; + y0 = mathSin(startAngle) * ry + cy; + } + + bbox.fromArc( + cx, cy, rx, ry, startAngle, endAngle, + anticlockwise, min2, max2 + ); + + xi = mathCos(endAngle) * rx + cx; + yi = mathSin(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + // Use fromLine + bbox.fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD.Z: + xi = x0; + yi = y0; + break; + } + + // Union + vec2.min(min, min, min2); + vec2.max(max, max, max2); + } + + // No data + if (i === 0) { + min[0] = min[1] = max[0] = max[1] = 0; + } + + return new BoundingRect( + min[0], min[1], max[0] - min[0], max[1] - min[1] + ); + }, + + /** + * Rebuild path from current data + * Rebuild path will not consider javascript implemented line dash. + * @param {CanvasRenderingContext} ctx + */ + rebuildPath: function (ctx) { + var d = this.data; + for (var i = 0; i < this._len;) { + var cmd = d[i++]; + switch (cmd) { + case CMD.M: + ctx.moveTo(d[i++], d[i++]); + break; + case CMD.L: + ctx.lineTo(d[i++], d[i++]); + break; + case CMD.C: + ctx.bezierCurveTo( + d[i++], d[i++], d[i++], d[i++], d[i++], d[i++] + ); + break; + case CMD.Q: + ctx.quadraticCurveTo(d[i++], d[i++], d[i++], d[i++]); + break; + case CMD.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var theta = d[i++]; + var dTheta = d[i++]; + var psi = d[i++]; + var fs = d[i++]; + var r = (rx > ry) ? rx : ry; + var scaleX = (rx > ry) ? 1 : rx / ry; + var scaleY = (rx > ry) ? ry / rx : 1; + var isEllipse = Math.abs(rx - ry) > 1e-3; + if (isEllipse) { + ctx.translate(cx, cy); + ctx.rotate(psi); + ctx.scale(scaleX, scaleY); + ctx.arc(0, 0, r, theta, theta + dTheta, 1 - fs); + ctx.scale(1 / scaleX, 1 / scaleY); + ctx.rotate(-psi); + ctx.translate(-cx, -cy); + } + else { + ctx.arc(cx, cy, r, theta, theta + dTheta, 1 - fs); + } + break; + case CMD.R: + ctx.rect(d[i++], d[i++], d[i++], d[i++]); + break; + case CMD.Z: + ctx.closePath(); + } + } + } + }; + + PathProxy.CMD = CMD; + + module.exports = PathProxy; + + +/***/ }, +/* 49 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 曲线辅助模块 + * @module zrender/core/curve + * @author pissang(https://www.github.com/pissang) + */ + + + var vec2 = __webpack_require__(16); + var v2Create = vec2.create; + var v2DistSquare = vec2.distSquare; + var mathPow = Math.pow; + var mathSqrt = Math.sqrt; + + var EPSILON = 1e-8; + var EPSILON_NUMERIC = 1e-4; + + var THREE_SQRT = mathSqrt(3); + var ONE_THIRD = 1 / 3; + + // 临时变量 + var _v0 = v2Create(); + var _v1 = v2Create(); + var _v2 = v2Create(); + // var _v3 = vec2.create(); + + function isAroundZero(val) { + return val > -EPSILON && val < EPSILON; + } + function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; + } + /** + * 计算三次贝塞尔值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @return {number} + */ + function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); + } + + /** + * 计算三次贝塞尔导数值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @return {number} + */ + function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * ( + ((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t + ); + } + + /** + * 计算三次贝塞尔方程根,使用盛金公式 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} val + * @param {Array.} roots + * @return {number} 有效根数目 + */ + function cubicRootAt(p0, p1, p2, p3, val, roots) { + // Evaluate roots of cubic functions + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + + var n = 0; + + if (isAroundZero(A) && isAroundZero(B)) { + if (isAroundZero(b)) { + roots[0] = 0; + } + else { + var t1 = -c / b; //t1, t2, t3, b is not zero + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = B * B - 4 * A * C; + + if (isAroundZero(disc)) { + var K = B / A; + var t1 = -b / a + K; // t1, a is not zero + var t2 = -K / 2; // t2, t3 + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -mathPow(-Y1, ONE_THIRD); + } + else { + Y1 = mathPow(Y1, ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -mathPow(-Y2, ONE_THIRD); + } + else { + Y2 = mathPow(Y2, ONE_THIRD); + } + var t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else { + var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = mathSqrt(A); + var tmp = Math.cos(theta); + + var t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a); + var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; + } + + /** + * 计算三次贝塞尔方程极限值的位置 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {Array.} extrema + * @return {number} 有效数目 + */ + function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <=1) { + extrema[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; + } + + /** + * 细分三次贝塞尔曲线 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @param {Array.} out + */ + function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + + var p0123 = (p123 - p012) * t + p012; + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + // Seg1 + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; + } + + /** + * 投射点到三次贝塞尔曲线上,返回投射距离。 + * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {number} x + * @param {number} y + * @param {Array.} [out] 投射点 + * @return {number} + */ + function cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, out + ) { + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = cubicAt(x0, x1, x2, x3, _t); + _v1[1] = cubicAt(y0, y1, y2, y3, _t); + d1 = v2DistSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + // t - interval + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + + d1 = v2DistSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + // t + interval + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = v2DistSquare(_v2, _v0); + + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = cubicAt(x0, x1, x2, x3, t); + out[1] = cubicAt(y0, y1, y2, y3, t); + } + // console.log(interval, i); + return mathSqrt(d); + } + + /** + * 计算二次方贝塞尔值 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @return {number} + */ + function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; + } + + /** + * 计算二次方贝塞尔导数值 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @return {number} + */ + function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); + } + + /** + * 计算二次方贝塞尔方程根 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @param {Array.} roots + * @return {number} 有效根数目 + */ + function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + var t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; + } + + /** + * 计算二次贝塞尔方程极限值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @return {number} + */ + function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + // p1 is center of p0 and p2 + return 0.5; + } + else { + return (p0 - p1) / divider; + } + } + + /** + * 细分二次贝塞尔曲线 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @param {Array.} out + */ + function quadraticSubdivide(p0, p1, p2, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p012 = (p12 - p01) * t + p01; + + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + + // Seg1 + out[3] = p012; + out[4] = p12; + out[5] = p2; + } + + /** + * 投射点到二次贝塞尔曲线上,返回投射距离。 + * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x + * @param {number} y + * @param {Array.} out 投射点 + * @return {number} + */ + function quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, out + ) { + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = quadraticAt(x0, x1, x2, _t); + _v1[1] = quadraticAt(y0, y1, y2, _t); + var d1 = v2DistSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + // t - interval + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + + var d1 = v2DistSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + // t + interval + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = v2DistSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = quadraticAt(x0, x1, x2, t); + out[1] = quadraticAt(y0, y1, y2, t); + } + // console.log(interval, i); + return mathSqrt(d); + } + + module.exports = { + + cubicAt: cubicAt, + + cubicDerivativeAt: cubicDerivativeAt, + + cubicRootAt: cubicRootAt, + + cubicExtrema: cubicExtrema, + + cubicSubdivide: cubicSubdivide, + + cubicProjectPoint: cubicProjectPoint, + + quadraticAt: quadraticAt, + + quadraticDerivativeAt: quadraticDerivativeAt, + + quadraticRootAt: quadraticRootAt, + + quadraticExtremum: quadraticExtremum, + + quadraticSubdivide: quadraticSubdivide, + + quadraticProjectPoint: quadraticProjectPoint + }; + + +/***/ }, +/* 50 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @author Yi Shen(https://github.com/pissang) + */ + + + var vec2 = __webpack_require__(16); + var curve = __webpack_require__(49); + + var bbox = {}; + var mathMin = Math.min; + var mathMax = Math.max; + var mathSin = Math.sin; + var mathCos = Math.cos; + + var start = vec2.create(); + var end = vec2.create(); + var extremity = vec2.create(); + + var PI2 = Math.PI * 2; + /** + * 从顶点数组中计算出最小包围盒,写入`min`和`max`中 + * @module zrender/core/bbox + * @param {Array} points 顶点数组 + * @param {number} min + * @param {number} max + */ + bbox.fromPoints = function(points, min, max) { + if (points.length === 0) { + return; + } + var p = points[0]; + var left = p[0]; + var right = p[0]; + var top = p[1]; + var bottom = p[1]; + var i; + + for (i = 1; i < points.length; i++) { + p = points[i]; + left = mathMin(left, p[0]); + right = mathMax(right, p[0]); + top = mathMin(top, p[1]); + bottom = mathMax(bottom, p[1]); + } + + min[0] = left; + min[1] = top; + max[0] = right; + max[1] = bottom; + }; + + /** + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromLine = function (x0, y0, x1, y1, min, max) { + min[0] = mathMin(x0, x1); + min[1] = mathMin(y0, y1); + max[0] = mathMax(x0, x1); + max[1] = mathMax(y0, y1); + }; + + var xDim = []; + var yDim = []; + /** + * 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒,写入`min`和`max`中 + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromCubic = function( + x0, y0, x1, y1, x2, y2, x3, y3, min, max + ) { + var cubicExtrema = curve.cubicExtrema; + var cubicAt = curve.cubicAt; + var i; + var n = cubicExtrema(x0, x1, x2, x3, xDim); + min[0] = Infinity; + min[1] = Infinity; + max[0] = -Infinity; + max[1] = -Infinity; + + for (i = 0; i < n; i++) { + var x = cubicAt(x0, x1, x2, x3, xDim[i]); + min[0] = mathMin(x, min[0]); + max[0] = mathMax(x, max[0]); + } + n = cubicExtrema(y0, y1, y2, y3, yDim); + for (i = 0; i < n; i++) { + var y = cubicAt(y0, y1, y2, y3, yDim[i]); + min[1] = mathMin(y, min[1]); + max[1] = mathMax(y, max[1]); + } + + min[0] = mathMin(x0, min[0]); + max[0] = mathMax(x0, max[0]); + min[0] = mathMin(x3, min[0]); + max[0] = mathMax(x3, max[0]); + + min[1] = mathMin(y0, min[1]); + max[1] = mathMax(y0, max[1]); + min[1] = mathMin(y3, min[1]); + max[1] = mathMax(y3, max[1]); + }; + + /** + * 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒,写入`min`和`max`中 + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromQuadratic = function(x0, y0, x1, y1, x2, y2, min, max) { + var quadraticExtremum = curve.quadraticExtremum; + var quadraticAt = curve.quadraticAt; + // Find extremities, where derivative in x dim or y dim is zero + var tx = + mathMax( + mathMin(quadraticExtremum(x0, x1, x2), 1), 0 + ); + var ty = + mathMax( + mathMin(quadraticExtremum(y0, y1, y2), 1), 0 + ); + + var x = quadraticAt(x0, x1, x2, tx); + var y = quadraticAt(y0, y1, y2, ty); + + min[0] = mathMin(x0, x2, x); + min[1] = mathMin(y0, y2, y); + max[0] = mathMax(x0, x2, x); + max[1] = mathMax(y0, y2, y); + }; + + /** + * 从圆弧中计算出最小包围盒,写入`min`和`max`中 + * @method + * @memberOf module:zrender/core/bbox + * @param {number} x + * @param {number} y + * @param {number} rx + * @param {number} ry + * @param {number} startAngle + * @param {number} endAngle + * @param {number} anticlockwise + * @param {Array.} min + * @param {Array.} max + */ + bbox.fromArc = function ( + x, y, rx, ry, startAngle, endAngle, anticlockwise, min, max + ) { + var vec2Min = vec2.min; + var vec2Max = vec2.max; + + var diff = Math.abs(startAngle - endAngle); + + + if (diff % PI2 < 1e-4 && diff > 1e-4) { + // Is a circle + min[0] = x - rx; + min[1] = y - ry; + max[0] = x + rx; + max[1] = y + ry; + return; + } + + start[0] = mathCos(startAngle) * rx + x; + start[1] = mathSin(startAngle) * ry + y; + + end[0] = mathCos(endAngle) * rx + x; + end[1] = mathSin(endAngle) * ry + y; + + vec2Min(min, start, end); + vec2Max(max, start, end); + + // Thresh to [0, Math.PI * 2] + startAngle = startAngle % (PI2); + if (startAngle < 0) { + startAngle = startAngle + PI2; + } + endAngle = endAngle % (PI2); + if (endAngle < 0) { + endAngle = endAngle + PI2; + } + + if (startAngle > endAngle && !anticlockwise) { + endAngle += PI2; + } + else if (startAngle < endAngle && anticlockwise) { + startAngle += PI2; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + + // var number = 0; + // var step = (anticlockwise ? -Math.PI : Math.PI) / 2; + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = mathCos(angle) * rx + x; + extremity[1] = mathSin(angle) * ry + y; + + vec2Min(min, extremity, min); + vec2Max(max, extremity, max); + } + } + }; + + module.exports = bbox; + + + +/***/ }, +/* 51 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var CMD = __webpack_require__(48).CMD; + var line = __webpack_require__(52); + var cubic = __webpack_require__(53); + var quadratic = __webpack_require__(54); + var arc = __webpack_require__(55); + var normalizeRadian = __webpack_require__(56).normalizeRadian; + var curve = __webpack_require__(49); + + var windingLine = __webpack_require__(57); + + var containStroke = line.containStroke; + + var PI2 = Math.PI * 2; + + var EPSILON = 1e-4; + + function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON; + } + + // 临时数组 + var roots = [-1, -1, -1]; + var extrema = [-1, -1]; + + function swapExtrema() { + var tmp = extrema[0]; + extrema[0] = extrema[1]; + extrema[1] = tmp; + } + + function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + // Quick reject + if ( + (y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3) + ) { + return 0; + } + var nRoots = curve.cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var w = 0; + var nExtrema = -1; + var y0_, y1_; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + var x_ = curve.cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { // Quick reject + continue; + } + if (nExtrema < 0) { + nExtrema = curve.cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = curve.cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = curve.cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema == 2) { + // 分成三段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } + else if (t < extrema[1]) { + w += y1_ < y0_ ? 1 : -1; + } + else { + w += y3 < y1_ ? 1 : -1; + } + } + else { + // 分成两段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? 1 : -1; + } + else { + w += y3 < y0_ ? 1 : -1; + } + } + } + return w; + } + } + + function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + // Quick reject + if ( + (y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2) + ) { + return 0; + } + var nRoots = curve.quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var t = curve.quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = curve.quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + var x_ = curve.quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { // Quick reject + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? 1 : -1; + } + else { + w += y2 < y_ ? 1 : -1; + } + } + return w; + } + else { + var x_ = curve.quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { // Quick reject + return 0; + } + return y2 < y0 ? 1 : -1; + } + } + } + + // TODO + // Arc 旋转 + function windingArc( + cx, cy, r, startAngle, endAngle, anticlockwise, x, y + ) { + y -= cy; + if (y > r || y < -r) { + return 0; + } + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + + var diff = Math.abs(startAngle - endAngle); + if (diff < 1e-4) { + return 0; + } + if (diff % PI2 < 1e-4) { + // Is a circle + startAngle = 0; + endAngle = PI2; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } else { + return 0; + } + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } + else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2; + } + + var w = 0; + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + var dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2 + angle; + } + if ( + (angle >= startAngle && angle <= endAngle) + || (angle + PI2 >= startAngle && angle + PI2 <= endAngle) + ) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; + } + + function containPath(data, lineWidth, isStroke, x, y) { + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + // Begin a new subpath + if (cmd === CMD.M && i > 1) { + // Close previous subpath + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + // 如果被任何一个 subpath 包含 + if (w !== 0) { + return true; + } + } + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = data[i]; + yi = data[i + 1]; + + x0 = xi; + y0 = yi; + } + + switch (cmd) { + case CMD.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD.L: + if (isStroke) { + if (containStroke(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + // NOTE 在第一个命令为 L, C, Q 的时候会计算出 NaN + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + if (isStroke) { + if (cubic.containStroke(xi, yi, + data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + lineWidth, x, y + )) { + return true; + } + } + else { + w += windingCubic( + xi, yi, + data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + x, y + ) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + if (isStroke) { + if (quadratic.containStroke(xi, yi, + data[i++], data[i++], data[i], data[i + 1], + lineWidth, x, y + )) { + return true; + } + } + else { + w += windingQuadratic( + xi, yi, + data[i++], data[i++], data[i], data[i + 1], + x, y + ) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + // TODO Arc 旋转 + var psi = data[i++]; + var anticlockwise = 1 - data[i++]; + var x1 = Math.cos(theta) * rx + cx; + var y1 = Math.sin(theta) * ry + cy; + // 不是直接使用 arc 命令 + if (i > 1) { + w += windingLine(xi, yi, x1, y1, x, y); + } + else { + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } + // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (arc.containStroke( + cx, cy, ry, theta, theta + dTheta, anticlockwise, + lineWidth, _x, y + )) { + return true; + } + } + else { + w += windingArc( + cx, cy, ry, theta, theta + dTheta, anticlockwise, + _x, y + ); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + var x1 = x0 + width; + var y1 = y0 + height; + if (isStroke) { + if (containStroke(x0, y0, x1, y0, lineWidth, x, y) + || containStroke(x1, y0, x1, y1, lineWidth, x, y) + || containStroke(x1, y1, x0, y1, lineWidth, x, y) + || containStroke(x0, y1, x1, y1, lineWidth, x, y) + ) { + return true; + } + } + else { + // FIXME Clockwise ? + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD.Z: + if (isStroke) { + if (containStroke( + xi, yi, x0, y0, lineWidth, x, y + )) { + return true; + } + } + else { + // Close a subpath + w += windingLine(xi, yi, x0, y0, x, y); + // 如果被任何一个 subpath 包含 + if (w !== 0) { + return true; + } + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; + } + + module.exports = { + contain: function (pathData, x, y) { + return containPath(pathData, 0, false, x, y); + }, + + containStroke: function (pathData, lineWidth, x, y) { + return containPath(pathData, lineWidth, true, x, y); + } + }; + + +/***/ }, +/* 52 */ +/***/ function(module, exports) { + + + module.exports = { + /** + * 线段包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function (x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l) + ) { + return false; + } + + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1) ; + } + else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; + } + }; + + +/***/ }, +/* 53 */ +/***/ function(module, exports, __webpack_require__) { + + + + var curve = __webpack_require__(49); + + module.exports = { + /** + * 三次贝塞尔曲线描边包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l) + ) { + return false; + } + var d = curve.cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, null + ); + return d <= _l / 2; + } + }; + + +/***/ }, +/* 54 */ +/***/ function(module, exports, __webpack_require__) { + + + + var curve = __webpack_require__(49); + + module.exports = { + /** + * 二次贝塞尔曲线描边包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ + containStroke: function (x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l) + ) { + return false; + } + var d = curve.quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, null + ); + return d <= _l / 2; + } + }; + + +/***/ }, +/* 55 */ +/***/ function(module, exports, __webpack_require__) { + + + + var normalizeRadian = __webpack_require__(56).normalizeRadian; + var PI2 = Math.PI * 2; + + module.exports = { + /** + * 圆弧描边包含判断 + * @param {number} cx + * @param {number} cy + * @param {number} r + * @param {number} startAngle + * @param {number} endAngle + * @param {boolean} anticlockwise + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {Boolean} + */ + containStroke: function ( + cx, cy, r, startAngle, endAngle, anticlockwise, + lineWidth, x, y + ) { + + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) % PI2 < 1e-4) { + // Is a circle + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2; + } + + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2 >= startAngle && angle + PI2 <= endAngle); + } + }; + + +/***/ }, +/* 56 */ +/***/ function(module, exports) { + + + + var PI2 = Math.PI * 2; + module.exports = { + normalizeRadian: function(angle) { + angle %= PI2; + if (angle < 0) { + angle += PI2; + } + return angle; + } + }; + + +/***/ }, +/* 57 */ +/***/ function(module, exports) { + + + module.exports = function windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + if (y1 === y0) { + return 0; + } + var dir = y1 < y0 ? 1 : -1; + var t = (y - y0) / (y1 - y0); + var x_ = t * (x1 - x0) + x0; + + return x_ > x ? dir : 0; + }; + + +/***/ }, +/* 58 */ +/***/ function(module, exports, __webpack_require__) { + + + + var CMD = __webpack_require__(48).CMD; + var vec2 = __webpack_require__(16); + var v2ApplyTransform = vec2.applyTransform; + + var points = [[], [], []]; + var mathSqrt = Math.sqrt; + var mathAtan2 = Math.atan2; + function transformPath(path, m) { + var data = path.data; + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + + var M = CMD.M; + var C = CMD.C; + var L = CMD.L; + var R = CMD.R; + var A = CMD.A; + var Q = CMD.Q; + + for (i = 0, j = 0; i < data.length;) { + cmd = data[i++]; + j = i; + nPoint = 0; + + switch (cmd) { + case M: + nPoint = 1; + break; + case L: + nPoint = 1; + break; + case C: + nPoint = 3; + break; + case Q: + nPoint = 2; + break; + case A: + var x = m[4]; + var y = m[5]; + var sx = mathSqrt(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + // cx + data[i++] += x; + // cy + data[i++] += y; + // Scale rx and ry + // FIXME Assume psi is 0 here + data[i++] *= sx; + data[i++] *= sy; + + // Start angle + data[i++] += angle; + // end angle + data[i++] += angle; + // FIXME psi + i += 2; + j = i; + break; + case R: + // x0, y0 + p[0] = data[i++]; + p[1] = data[i++]; + v2ApplyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + // x1, y1 + p[0] += data[i++]; + p[1] += data[i++]; + v2ApplyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + + for (k = 0; k < nPoint; k++) { + var p = points[k]; + p[0] = data[i++]; + p[1] = data[i++]; + + v2ApplyTransform(p, p, m); + // Write back + data[j++] = p[0]; + data[j++] = p[1]; + } + } + } + + module.exports = transformPath; + + +/***/ }, +/* 59 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Image element + * @module zrender/graphic/Image + */ + + + + var Displayable = __webpack_require__(45); + var BoundingRect = __webpack_require__(15); + var zrUtil = __webpack_require__(3); + var roundRectHelper = __webpack_require__(60); + + var LRU = __webpack_require__(61); + var globalImageCache = new LRU(50); + /** + * @alias zrender/graphic/Image + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + function ZImage(opts) { + Displayable.call(this, opts); + } + + ZImage.prototype = { + + constructor: ZImage, + + type: 'image', + + brush: function (ctx) { + var style = this.style; + var src = style.image; + var image; + // style.image is a url string + if (typeof src === 'string') { + image = this._image; + } + // style.image is an HTMLImageElement or HTMLCanvasElement or Canvas + else { + image = src; + } + // FIXME Case create many images with src + if (!image && src) { + // Try get from global image cache + var cachedImgObj = globalImageCache.get(src); + if (!cachedImgObj) { + // Create a new image + image = new Image(); + image.onload = function () { + image.onload = null; + for (var i = 0; i < cachedImgObj.pending.length; i++) { + cachedImgObj.pending[i].dirty(); + } + }; + cachedImgObj = { + image: image, + pending: [this] + }; + image.src = src; + globalImageCache.put(src, cachedImgObj); + this._image = image; + return; + } + else { + image = cachedImgObj.image; + this._image = image; + // Image is not complete finish, add to pending list + if (!image.width || !image.height) { + cachedImgObj.pending.push(this); + return; + } + } + } + + if (image) { + // 图片已经加载完成 + // if (image.nodeName.toUpperCase() == 'IMG') { + // if (!image.complete) { + // return; + // } + // } + // Else is canvas + + var width = style.width || image.width; + var height = style.height || image.height; + var x = style.x || 0; + var y = style.y || 0; + // 图片加载失败 + if (!image.width || !image.height) { + return; + } + + ctx.save(); + + style.bind(ctx); + + // 设置transform + this.setTransform(ctx); + + if (style.r) { + // Border radius clipping + // FIXME + ctx.beginPath(); + roundRectHelper.buildPath(ctx, style); + ctx.clip(); + } + + if (style.sWidth && style.sHeight) { + var sx = style.sx || 0; + var sy = style.sy || 0; + ctx.drawImage( + image, + sx, sy, style.sWidth, style.sHeight, + x, y, width, height + ); + } + else if (style.sx && style.sy) { + var sx = style.sx; + var sy = style.sy; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage( + image, + sx, sy, sWidth, sHeight, + x, y, width, height + ); + } + else { + ctx.drawImage(image, x, y, width, height); + } + + // 如果没设置宽和高的话自动根据图片宽高设置 + if (style.width == null) { + style.width = width; + } + if (style.height == null) { + style.height = height; + } + + // Draw rect text + if (style.text != null) { + this.drawRectText(ctx, this.getBoundingRect()); + } + + ctx.restore(); + } + }, + + getBoundingRect: function () { + var style = this.style; + if (! this._rect) { + this._rect = new BoundingRect( + style.x || 0, style.y || 0, style.width || 0, style.height || 0 + ); + } + return this._rect; + } + }; + + zrUtil.inherits(ZImage, Displayable); + + module.exports = ZImage; + + +/***/ }, +/* 60 */ +/***/ function(module, exports) { + + + + module.exports = { + buildPath: function (ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + var r = shape.r; + var r1; + var r2; + var r3; + var r4; + + // Convert width and height to positive for better borderRadius + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } + else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } + else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } + else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } + else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } + else { + r1 = r2 = r3 = r4 = 0; + } + + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.quadraticCurveTo( + x + width, y, x + width, y + r2 + ); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.quadraticCurveTo( + x + width, y + height, x + width - r3, y + height + ); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.quadraticCurveTo( + x, y + height, x, y + height - r4 + ); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.quadraticCurveTo(x, y, x + r1, y); + } + }; + + +/***/ }, +/* 61 */ +/***/ function(module, exports) { + + // Simple LRU cache use doubly linked list + // @module zrender/core/LRU + + + /** + * Simple double linked list. Compared with array, it has O(1) remove operation. + * @constructor + */ + var LinkedList = function() { + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.head = null; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.tail = null; + + this._len = 0; + }; + + var linkedListProto = LinkedList.prototype; + /** + * Insert a new value at the tail + * @param {} val + * @return {module:zrender/core/LRU~Entry} + */ + linkedListProto.insert = function(val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; + }; + + /** + * Insert an entry at the tail + * @param {module:zrender/core/LRU~Entry} entry + */ + linkedListProto.insertEntry = function(entry) { + if (!this.head) { + this.head = this.tail = entry; + } + else { + this.tail.next = entry; + entry.prev = this.tail; + this.tail = entry; + } + this._len++; + }; + + /** + * Remove entry. + * @param {module:zrender/core/LRU~Entry} entry + */ + linkedListProto.remove = function(entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } + else { + // Is head + this.head = next; + } + if (next) { + next.prev = prev; + } + else { + // Is tail + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; + }; + + /** + * @return {number} + */ + linkedListProto.len = function() { + return this._len; + }; + + /** + * @constructor + * @param {} val + */ + var Entry = function(val) { + /** + * @type {} + */ + this.value = val; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.next; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.prev; + }; + + /** + * LRU Cache + * @constructor + * @alias module:zrender/core/LRU + */ + var LRU = function(maxSize) { + + this._list = new LinkedList(); + + this._map = {}; + + this._maxSize = maxSize || 10; + }; + + var LRUProto = LRU.prototype; + + /** + * @param {string} key + * @param {} value + */ + LRUProto.put = function(key, value) { + var list = this._list; + var map = this._map; + if (map[key] == null) { + var len = list.len(); + if (len >= this._maxSize && len > 0) { + // Remove the least recently used + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + } + + var entry = list.insert(value); + entry.key = key; + map[key] = entry; + } + }; + + /** + * @param {string} key + * @return {} + */ + LRUProto.get = function(key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + // Put the latest used entry in the tail + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + + return entry.value; + } + }; + + /** + * Clear the cache + */ + LRUProto.clear = function() { + this._list.clear(); + this._map = {}; + }; + + module.exports = LRU; + + +/***/ }, +/* 62 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Text element + * @module zrender/graphic/Text + * + * TODO Wrapping + */ + + + + var Displayable = __webpack_require__(45); + var zrUtil = __webpack_require__(3); + var textContain = __webpack_require__(14); + + /** + * @alias zrender/graphic/Text + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ + var Text = function (opts) { + Displayable.call(this, opts); + }; + + Text.prototype = { + + constructor: Text, + + type: 'text', + + brush: function (ctx) { + var style = this.style; + var x = style.x || 0; + var y = style.y || 0; + // Convert to string + var text = style.text; + var textFill = style.fill; + var textStroke = style.stroke; + + // Convert to string + text != null && (text += ''); + + if (text) { + ctx.save(); + + this.style.bind(ctx); + this.setTransform(ctx); + + textFill && (ctx.fillStyle = textFill); + textStroke && (ctx.strokeStyle = textStroke); + + ctx.font = style.textFont || style.font; + ctx.textAlign = style.textAlign; + + if (style.textVerticalAlign) { + var rect = textContain.getBoundingRect( + text, ctx.font, style.textAlign, 'top' + ); + // Ignore textBaseline + ctx.textBaseline = 'top'; + switch (style.textVerticalAlign) { + case 'middle': + y -= rect.height / 2; + break; + case 'bottom': + y -= rect.height; + break; + // 'top' + } + } + else { + ctx.textBaseline = style.textBaseline; + } + var lineHeight = textContain.measureText('国', ctx.font).width; + + var textLines = text.split('\n'); + for (var i = 0; i < textLines.length; i++) { + textFill && ctx.fillText(textLines[i], x, y); + textStroke && ctx.strokeText(textLines[i], x, y); + y += lineHeight; + } + + ctx.restore(); + } + }, + + getBoundingRect: function () { + if (!this._rect) { + var style = this.style; + var textVerticalAlign = style.textVerticalAlign; + var rect = textContain.getBoundingRect( + style.text + '', style.textFont || style.font, style.textAlign, + textVerticalAlign ? 'top' : style.textBaseline + ); + switch (textVerticalAlign) { + case 'middle': + rect.y -= rect.height / 2; + break; + case 'bottom': + rect.y -= rect.height; + break; + } + rect.x += style.x || 0; + rect.y += style.y || 0; + this._rect = rect; + } + return this._rect; + } + }; + + zrUtil.inherits(Text, Displayable); + + module.exports = Text; + + +/***/ }, +/* 63 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 圆形 + * @module zrender/shape/Circle + */ + + + + module.exports = __webpack_require__(44).extend({ + + type: 'circle', + + shape: { + cx: 0, + cy: 0, + r: 0 + }, + + buildPath : function (ctx, shape) { + // Better stroking in ShapeBundle + ctx.moveTo(shape.cx + shape.r, shape.cy); + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2, true); + return; + } + }); + + + +/***/ }, +/* 64 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 扇形 + * @module zrender/graphic/shape/Sector + */ + + // FIXME clockwise seems wrong + + + module.exports = __webpack_require__(44).extend({ + + type: 'sector', + + shape: { + + cx: 0, + + cy: 0, + + r0: 0, + + r: 0, + + startAngle: 0, + + endAngle: Math.PI * 2, + + clockwise: true + }, + + buildPath: function (ctx, shape) { + + var x = shape.cx; + var y = shape.cy; + var r0 = Math.max(shape.r0 || 0, 0); + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + + ctx.moveTo(unitX * r0 + x, unitY * r0 + y); + + ctx.lineTo(unitX * r + x, unitY * r + y); + + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + + ctx.lineTo( + Math.cos(endAngle) * r0 + x, + Math.sin(endAngle) * r0 + y + ); + + if (r0 !== 0) { + ctx.arc(x, y, r0, endAngle, startAngle, clockwise); + } + + ctx.closePath(); + } + }); + + + +/***/ }, +/* 65 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 圆环 + * @module zrender/graphic/shape/Ring + */ + + + module.exports = __webpack_require__(44).extend({ + + type: 'ring', + + shape: { + cx: 0, + cy: 0, + r: 0, + r0: 0 + }, + + buildPath: function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var PI2 = Math.PI * 2; + ctx.moveTo(x + shape.r, y); + ctx.arc(x, y, shape.r, 0, PI2, false); + ctx.moveTo(x + shape.r0, y); + ctx.arc(x, y, shape.r0, 0, PI2, true); + } + }); + + + +/***/ }, +/* 66 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 多边形 + * @module zrender/shape/Polygon + */ + + + var polyHelper = __webpack_require__(67); + + module.exports = __webpack_require__(44).extend({ + + type: 'polygon', + + shape: { + points: null, + + smooth: false, + + smoothConstraint: null + }, + + buildPath: function (ctx, shape) { + polyHelper.buildPath(ctx, shape, true); + } + }); + + +/***/ }, +/* 67 */ +/***/ function(module, exports, __webpack_require__) { + + + + var smoothSpline = __webpack_require__(68); + var smoothBezier = __webpack_require__(69); + + module.exports = { + buildPath: function (ctx, shape, closePath) { + var points = shape.points; + var smooth = shape.smooth; + if (points && points.length >= 2) { + if (smooth && smooth !== 'spline') { + var controlPoints = smoothBezier( + points, smooth, closePath, shape.smoothConstraint + ); + + ctx.moveTo(points[0][0], points[0][1]); + var len = points.length; + for (var i = 0; i < (closePath ? len : len - 1); i++) { + var cp1 = controlPoints[i * 2]; + var cp2 = controlPoints[i * 2 + 1]; + var p = points[(i + 1) % len]; + ctx.bezierCurveTo( + cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1] + ); + } + } + else { + if (smooth === 'spline') { + points = smoothSpline(points, closePath); + } + + ctx.moveTo(points[0][0], points[0][1]); + for (var i = 1, l = points.length; i < l; i++) { + ctx.lineTo(points[i][0], points[i][1]); + } + } + + closePath && ctx.closePath(); + } + } + }; + + +/***/ }, +/* 68 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Catmull-Rom spline 插值折线 + * @module zrender/shape/util/smoothSpline + * @author pissang (https://www.github.com/pissang) + * Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + */ + + var vec2 = __webpack_require__(16); + + /** + * @inner + */ + function interpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; + } + + /** + * @alias module:zrender/shape/util/smoothSpline + * @param {Array} points 线段顶点数组 + * @param {boolean} isLoop + * @return {Array} + */ + module.exports = function (points, isLoop) { + var len = points.length; + var ret = []; + + var distance = 0; + for (var i = 1; i < len; i++) { + distance += vec2.distance(points[i - 1], points[i]); + } + + var segs = distance / 2; + segs = segs < len ? len : segs; + for (var i = 0; i < segs; i++) { + var pos = i / (segs - 1) * (isLoop ? len : len - 1); + var idx = Math.floor(pos); + + var w = pos - idx; + + var p0; + var p1 = points[idx % len]; + var p2; + var p3; + if (!isLoop) { + p0 = points[idx === 0 ? idx : idx - 1]; + p2 = points[idx > len - 2 ? len - 1 : idx + 1]; + p3 = points[idx > len - 3 ? len - 1 : idx + 2]; + } + else { + p0 = points[(idx - 1 + len) % len]; + p2 = points[(idx + 1) % len]; + p3 = points[(idx + 2) % len]; + } + + var w2 = w * w; + var w3 = w * w2; + + ret.push([ + interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3), + interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3) + ]); + } + return ret; + }; + + + +/***/ }, +/* 69 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 贝塞尔平滑曲线 + * @module zrender/shape/util/smoothBezier + * @author pissang (https://www.github.com/pissang) + * Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + */ + + + var vec2 = __webpack_require__(16); + var v2Min = vec2.min; + var v2Max = vec2.max; + var v2Scale = vec2.scale; + var v2Distance = vec2.distance; + var v2Add = vec2.add; + + /** + * 贝塞尔平滑曲线 + * @alias module:zrender/shape/util/smoothBezier + * @param {Array} points 线段顶点数组 + * @param {number} smooth 平滑等级, 0-1 + * @param {boolean} isLoop + * @param {Array} constraint 将计算出来的控制点约束在一个包围盒内 + * 比如 [[0, 0], [100, 100]], 这个包围盒会与 + * 整个折线的包围盒做一个并集用来约束控制点。 + * @param {Array} 计算出来的控制点数组 + */ + module.exports = function (points, smooth, isLoop, constraint) { + var cps = []; + + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + + var min, max; + if (constraint) { + min = [Infinity, Infinity]; + max = [-Infinity, -Infinity]; + for (var i = 0, len = points.length; i < len; i++) { + v2Min(min, min, points[i]); + v2Max(max, max, points[i]); + } + // 与指定的包围盒做并集 + v2Min(min, min, constraint[0]); + v2Max(max, max, constraint[1]); + } + + for (var i = 0, len = points.length; i < len; i++) { + var point = points[i]; + + if (isLoop) { + prevPoint = points[i ? i - 1 : len - 1]; + nextPoint = points[(i + 1) % len]; + } + else { + if (i === 0 || i === len - 1) { + cps.push(vec2.clone(points[i])); + continue; + } + else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + + vec2.sub(v, nextPoint, prevPoint); + + // use degree to scale the handle length + v2Scale(v, v, smooth); + + var d0 = v2Distance(point, prevPoint); + var d1 = v2Distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + + v2Scale(v1, v, -d0); + v2Scale(v2, v, d1); + var cp0 = v2Add([], point, v1); + var cp1 = v2Add([], point, v2); + if (constraint) { + v2Max(cp0, cp0, min); + v2Min(cp0, cp0, max); + v2Max(cp1, cp1, min); + v2Min(cp1, cp1, max); + } + cps.push(cp0); + cps.push(cp1); + } + + if (isLoop) { + cps.push(cps.shift()); + } + + return cps; + }; + + + +/***/ }, +/* 70 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/graphic/shape/Polyline + */ + + + var polyHelper = __webpack_require__(67); + + module.exports = __webpack_require__(44).extend({ + + type: 'polyline', + + shape: { + points: null, + + smooth: false, + + smoothConstraint: null + }, + + style: { + stroke: '#000', + + fill: null + }, + + buildPath: function (ctx, shape) { + polyHelper.buildPath(ctx, shape, false); + } + }); + + +/***/ }, +/* 71 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 矩形 + * @module zrender/graphic/shape/Rect + */ + + + var roundRectHelper = __webpack_require__(60); + + module.exports = __webpack_require__(44).extend({ + + type: 'rect', + + shape: { + // 左上、右上、右下、左下角的半径依次为r1、r2、r3、r4 + // r缩写为1 相当于 [1, 1, 1, 1] + // r缩写为[1] 相当于 [1, 1, 1, 1] + // r缩写为[1, 2] 相当于 [1, 2, 1, 2] + // r缩写为[1, 2, 3] 相当于 [1, 2, 3, 2] + r: 0, + + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + if (!shape.r) { + ctx.rect(x, y, width, height); + } + else { + roundRectHelper.buildPath(ctx, shape); + } + ctx.closePath(); + return; + } + }); + + + +/***/ }, +/* 72 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 直线 + * @module zrender/graphic/shape/Line + */ + + module.exports = __webpack_require__(44).extend({ + + type: 'line', + + shape: { + // Start point + x1: 0, + y1: 0, + // End point + x2: 0, + y2: 0, + + percent: 1 + }, + + style: { + stroke: '#000', + fill: null + }, + + buildPath: function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var percent = shape.percent; + + if (percent === 0) { + return; + } + + ctx.moveTo(x1, y1); + + if (percent < 1) { + x2 = x1 * (1 - percent) + x2 * percent; + y2 = y1 * (1 - percent) + y2 * percent; + } + ctx.lineTo(x2, y2); + }, + + /** + * Get point at percent + * @param {number} percent + * @return {Array.} + */ + pointAt: function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + } + }); + + + +/***/ }, +/* 73 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 贝塞尔曲线 + * @module zrender/shape/BezierCurve + */ + + + var curveTool = __webpack_require__(49); + var quadraticSubdivide = curveTool.quadraticSubdivide; + var cubicSubdivide = curveTool.cubicSubdivide; + var quadraticAt = curveTool.quadraticAt; + var cubicAt = curveTool.cubicAt; + + var out = []; + module.exports = __webpack_require__(44).extend({ + + type: 'bezier-curve', + + shape: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + cpx1: 0, + cpy1: 0, + // cpx2: 0, + // cpy2: 0 + + // Curve show percent, for animating + percent: 1 + }, + + style: { + stroke: '#000', + fill: null + }, + + buildPath: function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var cpx1 = shape.cpx1; + var cpy1 = shape.cpy1; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + var percent = shape.percent; + if (percent === 0) { + return; + } + + ctx.moveTo(x1, y1); + + if (cpx2 == null || cpy2 == null) { + if (percent < 1) { + quadraticSubdivide( + x1, cpx1, x2, percent, out + ); + cpx1 = out[1]; + x2 = out[2]; + quadraticSubdivide( + y1, cpy1, y2, percent, out + ); + cpy1 = out[1]; + y2 = out[2]; + } + + ctx.quadraticCurveTo( + cpx1, cpy1, + x2, y2 + ); + } + else { + if (percent < 1) { + cubicSubdivide( + x1, cpx1, cpx2, x2, percent, out + ); + cpx1 = out[1]; + cpx2 = out[2]; + x2 = out[3]; + cubicSubdivide( + y1, cpy1, cpy2, y2, percent, out + ); + cpy1 = out[1]; + cpy2 = out[2]; + y2 = out[3]; + } + ctx.bezierCurveTo( + cpx1, cpy1, + cpx2, cpy2, + x2, y2 + ); + } + }, + + /** + * Get point at percent + * @param {number} percent + * @return {Array.} + */ + pointAt: function (p) { + var shape = this.shape; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 === null || cpy2 === null) { + return [ + quadraticAt(shape.x1, shape.cpx1, shape.x2, p), + quadraticAt(shape.y1, shape.cpy1, shape.y2, p) + ]; + } + else { + return [ + cubicAt(shape.x1, shape.cpx1, shape.cpx1, shape.x2, p), + cubicAt(shape.y1, shape.cpy1, shape.cpy1, shape.y2, p) + ]; + } + } + }); + + + +/***/ }, +/* 74 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * 圆弧 + * @module zrender/graphic/shape/Arc + */ + + + module.exports = __webpack_require__(44).extend({ + + type: 'arc', + + shape: { + + cx: 0, + + cy: 0, + + r: 0, + + startAngle: 0, + + endAngle: Math.PI * 2, + + clockwise: true + }, + + style: { + + stroke: '#000', + + fill: null + }, + + buildPath: function (ctx, shape) { + + var x = shape.cx; + var y = shape.cy; + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + + ctx.moveTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + } + }); + + +/***/ }, +/* 75 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var Gradient = __webpack_require__(4); + + /** + * x, y, x2, y2 are all percent from 0 to 1 + * @param {number} [x=0] + * @param {number} [y=0] + * @param {number} [x2=1] + * @param {number} [y2=0] + * @param {Array.} colorStops + */ + var LinearGradient = function (x, y, x2, y2, colorStops) { + this.x = x == null ? 0 : x; + + this.y = y == null ? 0 : y; + + this.x2 = x2 == null ? 1 : x2; + + this.y2 = y2 == null ? 0 : y2; + + Gradient.call(this, colorStops); + }; + + LinearGradient.prototype = { + + constructor: LinearGradient, + + type: 'linear', + + updateCanvasGradient: function (shape, ctx) { + var rect = shape.getBoundingRect(); + // var size = + var x = this.x * rect.width + rect.x; + var x2 = this.x2 * rect.width + rect.x; + var y = this.y * rect.height + rect.y; + var y2 = this.y2 * rect.height + rect.y; + + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + + var colorStops = this.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop( + colorStops[i].offset, colorStops[i].color + ); + } + + this.canvasGradient = canvasGradient; + } + + }; + + zrUtil.inherits(LinearGradient, Gradient); + + module.exports = LinearGradient; + + +/***/ }, +/* 76 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + + var Gradient = __webpack_require__(4); + + /** + * x, y, r are all percent from 0 to 1 + * @param {number} [x=0.5] + * @param {number} [y=0.5] + * @param {number} [r=0.5] + * @param {Array.} [colorStops] + */ + var RadialGradient = function (x, y, r, colorStops) { + this.x = x == null ? 0.5 : x; + + this.y = y == null ? 0.5 : y; + + this.r = r == null ? 0.5 : r; + + Gradient.call(this, colorStops); + }; + + RadialGradient.prototype = { + + constructor: RadialGradient, + + type: 'radial', + + updateCanvasGradient: function (shape, ctx) { + var rect = shape.getBoundingRect(); + + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + // var max = Math.max(width, height); + + var x = this.x * width + rect.x; + var y = this.y * height + rect.y; + var r = this.r * min; + + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + + var colorStops = this.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop( + colorStops[i].offset, colorStops[i].color + ); + } + + this.canvasGradient = canvasGradient; + } + }; + + zrUtil.inherits(RadialGradient, Gradient); + + module.exports = RadialGradient; + + +/***/ }, +/* 77 */ +/***/ function(module, exports, __webpack_require__) { + + /*! + * ZRender, a high performance 2d drawing library. + * + * Copyright (c) 2013, Baidu Inc. + * All rights reserved. + * + * LICENSE + * https://github.com/ecomfe/zrender/blob/master/LICENSE.txt + */ + // Global defines + + var guid = __webpack_require__(31); + var env = __webpack_require__(78); + + var Handler = __webpack_require__(79); + var Storage = __webpack_require__(83); + var Animation = __webpack_require__(84); + + var useVML = !env.canvasSupported; + + var painterCtors = { + canvas: __webpack_require__(85) + }; + + var instances = {}; // ZRender实例map索引 + + var zrender = {}; + /** + * @type {string} + */ + zrender.version = '3.0.7'; + + /** + * Initializing a zrender instance + * @param {HTMLElement} dom + * @param {Object} opts + * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg' + * @param {number} [opts.devicePixelRatio] + * @return {module:zrender/ZRender} + */ + zrender.init = function(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances[zr.id] = zr; + return zr; + }; + + /** + * Dispose zrender instance + * @param {module:zrender/ZRender} zr + */ + zrender.dispose = function (zr) { + if (zr) { + zr.dispose(); + } + else { + for (var key in instances) { + instances[key].dispose(); + } + instances = {}; + } + + return zrender; + }; + + /** + * Get zrender instance by id + * @param {string} id zrender instance id + * @return {module:zrender/ZRender} + */ + zrender.getInstance = function (id) { + return instances[id]; + }; + + zrender.registerPainter = function (name, Ctor) { + painterCtors[name] = Ctor; + }; + + function delInstance(id) { + delete instances[id]; + } + + /** + * @module zrender/ZRender + */ + /** + * @constructor + * @alias module:zrender/ZRender + * @param {string} id + * @param {HTMLDomElement} dom + * @param {Object} opts + * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg' + * @param {number} [opts.devicePixelRatio] + */ + var ZRender = function(id, dom, opts) { + + opts = opts || {}; + + /** + * @type {HTMLDomElement} + */ + this.dom = dom; + + /** + * @type {string} + */ + this.id = id; + + var self = this; + var storage = new Storage(); + + var rendererType = opts.renderer; + if (useVML) { + if (!painterCtors.vml) { + throw new Error('You need to require \'zrender/vml/vml\' to support IE8'); + } + rendererType = 'vml'; + } + else if (!rendererType || !painterCtors[rendererType]) { + rendererType = 'canvas'; + } + var painter = new painterCtors[rendererType](dom, storage, opts); + + this.storage = storage; + this.painter = painter; + if (!env.node) { + this.handler = new Handler(painter.getViewportRoot(), storage, painter); + } + + /** + * @type {module:zrender/animation/Animation} + */ + this.animation = new Animation({ + stage: { + update: function () { + if (self._needsRefresh) { + self.refreshImmediately(); + } + } + } + }); + this.animation.start(); + + /** + * @type {boolean} + * @private + */ + this._needsRefresh; + + // 修改 storage.delFromMap, 每次删除元素之前删除动画 + // FIXME 有点ugly + var oldDelFromMap = storage.delFromMap; + var oldAddToMap = storage.addToMap; + + storage.delFromMap = function (elId) { + var el = storage.get(elId); + + oldDelFromMap.call(storage, elId); + + el && el.removeSelfFromZr(self); + }; + + storage.addToMap = function (el) { + oldAddToMap.call(storage, el); + + el.addSelfToZr(self); + }; + }; + + ZRender.prototype = { + + constructor: ZRender, + /** + * 获取实例唯一标识 + * @return {string} + */ + getId: function () { + return this.id; + }, + + /** + * 添加元素 + * @param {string|module:zrender/Element} el + */ + add: function (el) { + this.storage.addRoot(el); + this._needsRefresh = true; + }, + + /** + * 删除元素 + * @param {string|module:zrender/Element} el + */ + remove: function (el) { + this.storage.delRoot(el); + this._needsRefresh = true; + }, + + /** + * Change configuration of layer + * @param {string} zLevel + * @param {Object} config + * @param {string} [config.clearColor=0] Clear color + * @param {string} [config.motionBlur=false] If enable motion blur + * @param {number} [config.lastFrameAlpha=0.7] Motion blur factor. Larger value cause longer trailer + */ + configLayer: function (zLevel, config) { + this.painter.configLayer(zLevel, config); + this._needsRefresh = true; + }, + + /** + * Repaint the canvas immediately + */ + refreshImmediately: function () { + // Clear needsRefresh ahead to avoid something wrong happens in refresh + // Or it will cause zrender refreshes again and again. + this._needsRefresh = false; + this.painter.refresh(); + /** + * Avoid trigger zr.refresh in Element#beforeUpdate hook + */ + this._needsRefresh = false; + }, + + /** + * Mark and repaint the canvas in the next frame of browser + */ + refresh: function() { + this._needsRefresh = true; + }, + + /** + * Resize the canvas. + * Should be invoked when container size is changed + */ + resize: function() { + this.painter.resize(); + this.handler && this.handler.resize(); + }, + + /** + * Stop and clear all animation immediately + */ + clearAnimation: function () { + this.animation.clear(); + }, + + /** + * Get container width + */ + getWidth: function() { + return this.painter.getWidth(); + }, + + /** + * Get container height + */ + getHeight: function() { + return this.painter.getHeight(); + }, + + /** + * Export the canvas as Base64 URL + * @param {string} type + * @param {string} [backgroundColor='#fff'] + * @return {string} Base64 URL + */ + toDataURL: function(type, backgroundColor, args) { + return this.painter.toDataURL(type, backgroundColor, args); + }, + + /** + * Converting a path to image. + * It has much better performance of drawing image rather than drawing a vector path. + * @param {module:zrender/graphic/Path} e + * @param {number} width + * @param {number} height + */ + pathToImage: function(e, width, height) { + var id = guid(); + return this.painter.pathToImage(id, e, width, height); + }, + + /** + * Set default cursor + * @param {string} cursorStyle 例如 crosshair + */ + setDefaultCursorStyle: function (cursorStyle) { + this.handler.setDefaultCursorStyle(cursorStyle); + }, + + /** + * Bind event + * + * @param {string} eventName Event name + * @param {Function} eventHandler Handler function + * @param {Object} [context] Context object + */ + on: function(eventName, eventHandler, context) { + this.handler && this.handler.on(eventName, eventHandler, context); + }, + + /** + * Unbind event + * @param {string} eventName Event name + * @param {Function} [eventHandler] Handler function + */ + off: function(eventName, eventHandler) { + this.handler && this.handler.off(eventName, eventHandler); + }, + + /** + * Trigger event manually + * + * @param {string} eventName Event name + * @param {event=} event Event object + */ + trigger: function (eventName, event) { + this.handler && this.handler.trigger(eventName, event); + }, + + + /** + * Clear all objects and the canvas. + */ + clear: function () { + this.storage.delRoot(); + this.painter.clear(); + }, + + /** + * Dispose self. + */ + dispose: function () { + this.animation.stop(); + + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler && this.handler.dispose(); + + this.animation = + this.storage = + this.painter = + this.handler = null; + + delInstance(this.id); + } + }; + + module.exports = zrender; + + + +/***/ }, +/* 78 */ +/***/ function(module, exports) { + + /** + * echarts设备环境识别 + * + * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 + * @author firede[firede@firede.us] + * @desc thanks zepto. + */ + + var env = {}; + if (typeof navigator === 'undefined') { + // In node + env = { + browser: {}, + os: {}, + node: true, + // Assume canvas is supported + canvasSupported: true + }; + } + else { + env = detect(navigator.userAgent); + } + + module.exports = env; + + // Zepto.js + // (c) 2010-2013 Thomas Fuchs + // Zepto.js may be freely distributed under the MIT license. + + function detect(ua) { + var os = {}; + var browser = {}; + var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/); + var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); + var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/); + var touchpad = webos && ua.match(/TouchPad/); + var kindle = ua.match(/Kindle\/([\d.]+)/); + var silk = ua.match(/Silk\/([\d._]+)/); + var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); + var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/); + var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/); + var playbook = ua.match(/PlayBook/); + var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/); + var firefox = ua.match(/Firefox\/([\d.]+)/); + var safari = webkit && ua.match(/Mobile\//) && !chrome; + var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome; + var ie = ua.match(/MSIE\s([\d.]+)/) + // IE 11 Trident/7.0; rv:11.0 + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge\/([\d.]+)/); // IE 12 and 12+ + + // Todo: clean this up with a better OS/browser seperation: + // - discern (more) between multiple browsers on android + // - decide if kindle fire in silk mode is android or not + // - Firefox on Android doesn't specify the Android version + // - possibly devide in os, device and browser hashes + + if (browser.webkit = !!webkit) browser.version = webkit[1]; + + if (android) os.android = true, os.version = android[2]; + if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.'); + if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.'); + if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + if (webos) os.webos = true, os.version = webos[2]; + if (touchpad) os.touchpad = true; + if (blackberry) os.blackberry = true, os.version = blackberry[2]; + if (bb10) os.bb10 = true, os.version = bb10[2]; + if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2]; + if (playbook) browser.playbook = true; + if (kindle) os.kindle = true, os.version = kindle[1]; + if (silk) browser.silk = true, browser.version = silk[1]; + if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true; + if (chrome) browser.chrome = true, browser.version = chrome[1]; + if (firefox) browser.firefox = true, browser.version = firefox[1]; + if (ie) browser.ie = true, browser.version = ie[1]; + if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true; + if (webview) browser.webview = true; + if (ie) browser.ie = true, browser.version = ie[1]; + if (edge) browser.edge = true, browser.version = edge[1]; + + os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || + (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/))); + os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || blackberry || bb10 || + (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || + (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/)))); + + return { + browser: browser, + os: os, + node: false, + // 原生canvas支持,改极端点了 + // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9) + canvasSupported : document.createElement('canvas').getContext ? true : false, + // @see + // works on most browsers + // IE10/11 does not support touch event, and MS Edge supports them but not by + // default, so we dont check navigator.maxTouchPoints for them here. + touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge, + // . + pointerEventsSupported: 'onpointerdown' in window + // Firefox supports pointer but not by default, + // only MS browsers are reliable on pointer events currently. + && (browser.edge || (browser.ie && browser.version >= 10)) + }; + } + + +/***/ }, +/* 79 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Handler + * @module zrender/Handler + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + * pissang (shenyi.914@gmail.com) + */ + + + var env = __webpack_require__(78); + var eventTool = __webpack_require__(80); + var util = __webpack_require__(3); + var Draggable = __webpack_require__(81); + var GestureMgr = __webpack_require__(82); + + var Eventful = __webpack_require__(32); + + var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout' + ]; + !usePointerEvent() && mouseHandlerNames.push( + 'mouseup', 'mousedown', 'mousemove' + ); + + var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' + ]; + + var pointerHandlerNames = [ + 'pointerdown', 'pointerup', 'pointermove' + ]; + + var TOUCH_CLICK_DELAY = 300; + + // touch指尖错觉的尝试偏移量配置 + // var MOBILE_TOUCH_OFFSETS = [ + // { x: 10 }, + // { x: -20 }, + // { x: 10, y: 10 }, + // { y: -20 } + // ]; + + var addEventListener = eventTool.addEventListener; + var removeEventListener = eventTool.removeEventListener; + var normalizeEvent = eventTool.normalizeEvent; + + function makeEventPacket(eveType, target, event) { + return { + type: eveType, + event: event, + target: target, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta + }; + } + + var domHandlers = { + /** + * Mouse move handler + * @inner + * @param {Event} event + */ + mousemove: function (event) { + event = normalizeEvent(this.root, event); + + var x = event.zrX; + var y = event.zrY; + + var hovered = this.findHover(x, y, null); + var lastHovered = this._hovered; + + this._hovered = hovered; + + this.root.style.cursor = hovered ? hovered.cursor : this._defaultCursorStyle; + // Mouse out on previous hovered element + if (lastHovered && hovered !== lastHovered && lastHovered.__zr) { + this._dispatchProxy(lastHovered, 'mouseout', event); + } + + // Mouse moving on one element + this._dispatchProxy(hovered, 'mousemove', event); + + // Mouse over on a new element + if (hovered && hovered !== lastHovered) { + this._dispatchProxy(hovered, 'mouseover', event); + } + }, + + /** + * Mouse out handler + * @inner + * @param {Event} event + */ + mouseout: function (event) { + event = normalizeEvent(this.root, event); + + var element = event.toElement || event.relatedTarget; + if (element != this.root) { + while (element && element.nodeType != 9) { + // 忽略包含在root中的dom引起的mouseOut + if (element === this.root) { + return; + } + + element = element.parentNode; + } + } + + this._dispatchProxy(this._hovered, 'mouseout', event); + + this.trigger('globalout', { + event: event + }); + }, + + /** + * Touch开始响应函数 + * @inner + * @param {Event} event + */ + touchstart: function (event) { + // FIXME + // 移动端可能需要default行为,例如静态图表时。 + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + this._lastTouchMoment = new Date(); + + processGesture(this, event, 'start'); + + // 平板补充一次findHover + // this._mobileFindFixed(event); + // Trigger mousemove and mousedown + domHandlers.mousemove.call(this, event); + + domHandlers.mousedown.call(this, event); + + setTouchTimer(this); + }, + + /** + * Touch移动响应函数 + * @inner + * @param {Event} event + */ + touchmove: function (event) { + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + processGesture(this, event, 'change'); + + // Mouse move should always be triggered no matter whether + // there is gestrue event, because mouse move and pinch may + // be used at the same time. + domHandlers.mousemove.call(this, event); + + setTouchTimer(this); + }, + + /** + * Touch结束响应函数 + * @inner + * @param {Event} event + */ + touchend: function (event) { + // eventTool.stop(event);// 阻止浏览器默认事件,重要 + event = normalizeEvent(this.root, event); + + processGesture(this, event, 'end'); + + domHandlers.mouseup.call(this, event); + + // click event should always be triggered no matter whether + // there is gestrue event. System click can not be prevented. + if (+new Date() - this._lastTouchMoment < TOUCH_CLICK_DELAY) { + // this._mobileFindFixed(event); + domHandlers.click.call(this, event); + } + + setTouchTimer(this); + } + }; + + // Common handlers + util.each(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick'], function (name) { + domHandlers[name] = function (event) { + event = normalizeEvent(this.root, event); + // Find hover again to avoid click event is dispatched manually. Or click is triggered without mouseover + var hovered = this.findHover(event.zrX, event.zrY, null); + this._dispatchProxy(hovered, name, event); + }; + }); + + // Pointer event handlers + // util.each(['pointerdown', 'pointermove', 'pointerup'], function (name) { + // domHandlers[name] = function (event) { + // var mouseName = name.replace('pointer', 'mouse'); + // domHandlers[mouseName].call(this, event); + // }; + // }); + + function processGesture(zrHandler, event, stage) { + var gestureMgr = zrHandler._gestureMgr; + + stage === 'start' && gestureMgr.clear(); + + var gestureInfo = gestureMgr.recognize( + event, + zrHandler.findHover(event.zrX, event.zrY, null) + ); + + stage === 'end' && gestureMgr.clear(); + + if (gestureInfo) { + // eventTool.stop(event); + var type = gestureInfo.type; + event.gestureEvent = type; + + zrHandler._dispatchProxy(gestureInfo.target, type, gestureInfo.event); + } + } + + /** + * 为控制类实例初始化dom 事件处理函数 + * + * @inner + * @param {module:zrender/Handler} instance 控制类实例 + */ + function initDomHandler(instance) { + var handlerNames = touchHandlerNames.concat(pointerHandlerNames); + for (var i = 0; i < handlerNames.length; i++) { + var name = handlerNames[i]; + instance._handlers[name] = util.bind(domHandlers[name], instance); + } + + for (var i = 0; i < mouseHandlerNames.length; i++) { + var name = mouseHandlerNames[i]; + instance._handlers[name] = makeMouseHandler(domHandlers[name], instance); + } + + function makeMouseHandler(fn, instance) { + return function () { + if (instance._touching) { + return; + } + return fn.apply(instance, arguments); + }; + } + } + + /** + * @alias module:zrender/Handler + * @constructor + * @extends module:zrender/mixin/Eventful + * @param {HTMLElement} root Main HTML element for painting. + * @param {module:zrender/Storage} storage Storage instance. + * @param {module:zrender/Painter} painter Painter instance. + */ + var Handler = function(root, storage, painter) { + Eventful.call(this); + + this.root = root; + this.storage = storage; + this.painter = painter; + + /** + * @private + * @type {boolean} + */ + this._hovered; + + /** + * @private + * @type {Date} + */ + this._lastTouchMoment; + + /** + * @private + * @type {number} + */ + this._lastX; + + /** + * @private + * @type {number} + */ + this._lastY; + + /** + * @private + * @type {string} + */ + this._defaultCursorStyle = 'default'; + + /** + * @private + * @type {module:zrender/core/GestureMgr} + */ + this._gestureMgr = new GestureMgr(); + + /** + * @private + * @type {Array.} + */ + this._handlers = []; + + /** + * @private + * @type {boolean} + */ + this._touching = false; + + /** + * @private + * @type {number} + */ + this._touchTimer; + + initDomHandler(this); + + if (usePointerEvent()) { + mountHandlers(pointerHandlerNames, this); + } + else if (useTouchEvent()) { + mountHandlers(touchHandlerNames, this); + + // Handler of 'mouseout' event is needed in touch mode, which will be mounted below. + // addEventListener(root, 'mouseout', this._mouseoutHandler); + } + + // Considering some devices that both enable touch and mouse event (like MS Surface + // and lenovo X240, @see #2350), we make mouse event be always listened, otherwise + // mouse event can not be handle in those devices. + mountHandlers(mouseHandlerNames, this); + + Draggable.call(this); + + function mountHandlers(handlerNames, instance) { + util.each(handlerNames, function (name) { + addEventListener(root, eventNameFix(name), instance._handlers[name]); + }, instance); + } + }; + + Handler.prototype = { + + constructor: Handler, + + /** + * Resize + */ + resize: function (event) { + this._hovered = null; + }, + + /** + * Dispatch event + * @param {string} eventName + * @param {event=} eventArgs + */ + dispatch: function (eventName, eventArgs) { + var handler = this._handlers[eventName]; + handler && handler.call(this, eventArgs); + }, + + /** + * Dispose + */ + dispose: function () { + var root = this.root; + + var handlerNames = mouseHandlerNames.concat(touchHandlerNames); + + for (var i = 0; i < handlerNames.length; i++) { + var name = handlerNames[i]; + removeEventListener(root, eventNameFix(name), this._handlers[name]); + } + + this.root = + this.storage = + this.painter = null; + }, + + /** + * 设置默认的cursor style + * @param {string} cursorStyle 例如 crosshair + */ + setDefaultCursorStyle: function (cursorStyle) { + this._defaultCursorStyle = cursorStyle; + }, + + /** + * 事件分发代理 + * + * @private + * @param {Object} targetEl 目标图形元素 + * @param {string} eventName 事件名称 + * @param {Object} event 事件对象 + */ + _dispatchProxy: function (targetEl, eventName, event) { + var eventHandler = 'on' + eventName; + var eventPacket = makeEventPacket(eventName, targetEl, event); + + var el = targetEl; + + while (el) { + el[eventHandler] + && (eventPacket.cancelBubble = el[eventHandler].call(el, eventPacket)); + + el.trigger(eventName, eventPacket); + + el = el.parent; + + if (eventPacket.cancelBubble) { + break; + } + } + + if (!eventPacket.cancelBubble) { + // 冒泡到顶级 zrender 对象 + this.trigger(eventName, eventPacket); + // 分发事件到用户自定义层 + // 用户有可能在全局 click 事件中 dispose,所以需要判断下 painter 是否存在 + this.painter && this.painter.eachOtherLayer(function (layer) { + if (typeof(layer[eventHandler]) == 'function') { + layer[eventHandler].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + }, + + /** + * @private + * @param {number} x + * @param {number} y + * @param {module:zrender/graphic/Displayable} exclude + * @method + */ + findHover: function(x, y, exclude) { + var list = this.storage.getDisplayList(); + for (var i = list.length - 1; i >= 0 ; i--) { + if (!list[i].silent + && list[i] !== exclude + // getDisplayList may include ignored item in VML mode + && !list[i].ignore + && isHover(list[i], x, y)) { + return list[i]; + } + } + } + }; + + function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var p = displayable.parent; + while (p) { + if (p.clipPath && !p.clipPath.contain(x, y)) { + // Clipped by parents + return false; + } + p = p.parent; + } + return true; + } + + return false; + } + + /** + * Prevent mouse event from being dispatched after Touch Events action + * @see + * 1. Mobile browsers dispatch mouse events 300ms after touchend. + * 2. Chrome for Android dispatch mousedown for long-touch about 650ms + * Result: Blocking Mouse Events for 700ms. + */ + function setTouchTimer(instance) { + instance._touching = true; + clearTimeout(instance._touchTimer); + instance._touchTimer = setTimeout(function () { + instance._touching = false; + }, 700); + } + + /** + * Althought MS Surface support screen touch, IE10/11 do not support + * touch event and MS Edge supported them but not by default (but chrome + * and firefox do). Thus we use Pointer event on MS browsers to handle touch. + */ + function usePointerEvent() { + // TODO + // pointermove event dont trigger when using finger. + // We may figger it out latter. + return false; + // return env.pointerEventsSupported + // In no-touch device we dont use pointer evnets but just + // use mouse event for avoiding problems. + // && window.navigator.maxTouchPoints; + } + + function useTouchEvent() { + return env.touchEventsSupported; + } + + function eventNameFix(name) { + return (name === 'mousewheel' && env.browser.firefox) ? 'DOMMouseScroll' : name; + } + + util.mixin(Handler, Eventful); + util.mixin(Handler, Draggable); + + module.exports = Handler; + + +/***/ }, +/* 80 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 事件辅助类 + * @module zrender/core/event + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + + + var Eventful = __webpack_require__(32); + + var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener; + + function getBoundingClientRect(el) { + // BlackBerry 5, iOS 3 (original iPhone) don't have getBoundingRect + return el.getBoundingClientRect ? el.getBoundingClientRect() : { left: 0, top: 0}; + } + /** + * 如果存在第三方嵌入的一些dom触发的事件,或touch事件,需要转换一下事件坐标 + */ + function normalizeEvent(el, e) { + + e = e || window.event; + + if (e.zrX != null) { + return e; + } + + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + + if (!isTouch) { + var box = getBoundingClientRect(el); + e.zrX = e.clientX - box.left; + e.zrY = e.clientY - box.top; + e.zrDelta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3; + } + else { + var touch = eventType != 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + if (touch) { + var rBounding = getBoundingClientRect(el); + // touch事件坐标是全屏的~ + e.zrX = touch.clientX - rBounding.left; + e.zrY = touch.clientY - rBounding.top; + } + } + + return e; + } + + function addEventListener(el, name, handler) { + if (isDomLevel2) { + el.addEventListener(name, handler); + } + else { + el.attachEvent('on' + name, handler); + } + } + + function removeEventListener(el, name, handler) { + if (isDomLevel2) { + el.removeEventListener(name, handler); + } + else { + el.detachEvent('on' + name, handler); + } + } + + /** + * 停止冒泡和阻止默认行为 + * @memberOf module:zrender/core/event + * @method + * @param {Event} e : event对象 + */ + var stop = isDomLevel2 + ? function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + } + : function (e) { + e.returnValue = false; + e.cancelBubble = true; + }; + + module.exports = { + normalizeEvent: normalizeEvent, + addEventListener: addEventListener, + removeEventListener: removeEventListener, + + stop: stop, + // 做向上兼容 + Dispatcher: Eventful + }; + + + +/***/ }, +/* 81 */ +/***/ function(module, exports) { + + // TODO Draggable for group + // FIXME Draggable on element which has parent rotation or scale + + function Draggable() { + + this.on('mousedown', this._dragStart, this); + this.on('mousemove', this._drag, this); + this.on('mouseup', this._dragEnd, this); + this.on('globalout', this._dragEnd, this); + // this._dropTarget = null; + // this._draggingTarget = null; + + // this._x = 0; + // this._y = 0; + } + + Draggable.prototype = { + + constructor: Draggable, + + _dragStart: function (e) { + var draggingTarget = e.target; + if (draggingTarget && draggingTarget.draggable) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + + this._dispatchProxy(draggingTarget, 'dragstart', e.event); + } + }, + + _drag: function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + + var x = e.offsetX; + var y = e.offsetY; + + var dx = x - this._x; + var dy = y - this._y; + this._x = x; + this._y = y; + + draggingTarget.drift(dx, dy, e); + this._dispatchProxy(draggingTarget, 'drag', e.event); + + var dropTarget = this.findHover(x, y, draggingTarget); + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this._dispatchProxy(lastDropTarget, 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this._dispatchProxy(dropTarget, 'dragenter', e.event); + } + } + } + }, + + _dragEnd: function (e) { + var draggingTarget = this._draggingTarget; + + if (draggingTarget) { + draggingTarget.dragging = false; + } + + this._dispatchProxy(draggingTarget, 'dragend', e.event); + + if (this._dropTarget) { + this._dispatchProxy(this._dropTarget, 'drop', e.event); + } + + this._draggingTarget = null; + this._dropTarget = null; + } + + }; + + module.exports = Draggable; + + +/***/ }, +/* 82 */ +/***/ function(module, exports) { + + 'use strict'; + /** + * Only implements needed gestures for mobile. + */ + + + var GestureMgr = function () { + + /** + * @private + * @type {Array.} + */ + this._track = []; + }; + + GestureMgr.prototype = { + + constructor: GestureMgr, + + recognize: function (event, target) { + this._doTrack(event, target); + return this._recognize(event); + }, + + clear: function () { + this._track.length = 0; + return this; + }, + + _doTrack: function (event, target) { + var touches = event.touches; + + if (!touches) { + return; + } + + var trackItem = { + points: [], + touches: [], + target: target, + event: event + }; + + for (var i = 0, len = touches.length; i < len; i++) { + var touch = touches[i]; + trackItem.points.push([touch.clientX, touch.clientY]); + trackItem.touches.push(touch); + } + + this._track.push(trackItem); + }, + + _recognize: function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + } + }; + + function dist(pointPair) { + var dx = pointPair[1][0] - pointPair[0][0]; + var dy = pointPair[1][1] - pointPair[0][1]; + + return Math.sqrt(dx * dx + dy * dy); + } + + function center(pointPair) { + return [ + (pointPair[0][0] + pointPair[1][0]) / 2, + (pointPair[0][1] + pointPair[1][1]) / 2 + ]; + } + + var recognizers = { + + pinch: function (track, event) { + var trackLen = track.length; + + if (!trackLen) { + return; + } + + var pinchEnd = (track[trackLen - 1] || {}).points; + var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd; + + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1 + ) { + var pinchScale = dist(pinchEnd) / dist(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + + event.pinchScale = pinchScale; + + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + + return { + type: 'pinch', + target: track[0].target, + event: event + }; + } + } + + // Only pinch currently. + }; + + module.exports = GestureMgr; + + + +/***/ }, +/* 83 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Storage内容仓库模块 + * @module zrender/Storage + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * @author errorrik (errorrik@gmail.com) + * @author pissang (https://github.com/pissang/) + */ + + + var util = __webpack_require__(3); + + var Group = __webpack_require__(29); + + function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + if (a.z2 === b.z2) { + return a.__renderidx - b.__renderidx; + } + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; + } + /** + * 内容仓库 (M) + * @alias module:zrender/Storage + * @constructor + */ + var Storage = function () { + // 所有常规形状,id索引的map + this._elements = {}; + + this._roots = []; + + this._displayList = []; + + this._displayListLen = 0; + }; + + Storage.prototype = { + + constructor: Storage, + + /** + * 返回所有图形的绘制队列 + * @param {boolean} [update=false] 是否在返回前更新该数组 + * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组, 在 update 为 true 的时候有效 + * + * 详见{@link module:zrender/graphic/Displayable.prototype.updateDisplayList} + * @return {Array.} + */ + getDisplayList: function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + if (update) { + this.updateDisplayList(includeIgnore); + } + return this._displayList; + }, + + /** + * 更新图形的绘制队列。 + * 每次绘制前都会调用,该方法会先深度优先遍历整个树,更新所有Group和Shape的变换并且把所有可见的Shape保存到数组中, + * 最后根据绘制的优先级(zlevel > z > 插入顺序)排序得到绘制队列 + * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组 + */ + updateDisplayList: function (includeIgnore) { + this._displayListLen = 0; + var roots = this._roots; + var displayList = this._displayList; + for (var i = 0, len = roots.length; i < len; i++) { + this._updateAndAddDisplayable(roots[i], null, includeIgnore); + } + displayList.length = this._displayListLen; + + for (var i = 0, len = displayList.length; i < len; i++) { + displayList[i].__renderidx = i; + } + + displayList.sort(shapeCompareFunc); + }, + + _updateAndAddDisplayable: function (el, clipPaths, includeIgnore) { + + if (el.ignore && !includeIgnore) { + return; + } + + el.beforeUpdate(); + + el.update(); + + el.afterUpdate(); + + var clipPath = el.clipPath; + if (clipPath) { + // clipPath 的变换是基于 group 的变换 + clipPath.parent = el; + clipPath.updateTransform(); + + // FIXME 效率影响 + if (clipPaths) { + clipPaths = clipPaths.slice(); + clipPaths.push(clipPath); + } + else { + clipPaths = [clipPath]; + } + } + + if (el.type == 'group') { + var children = el._children; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + + // Force to mark as dirty if group is dirty + // FIXME __dirtyPath ? + child.__dirty = el.__dirty || child.__dirty; + + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + + // Mark group clean here + el.__dirty = false; + + } + else { + el.__clipPaths = clipPaths; + + this._displayList[this._displayListLen++] = el; + } + }, + + /** + * 添加图形(Shape)或者组(Group)到根节点 + * @param {module:zrender/Element} el + */ + addRoot: function (el) { + // Element has been added + if (this._elements[el.id]) { + return; + } + + if (el instanceof Group) { + el.addChildrenToStorage(this); + } + + this.addToMap(el); + this._roots.push(el); + }, + + /** + * 删除指定的图形(Shape)或者组(Group) + * @param {string|Array.} [elId] 如果为空清空整个Storage + */ + delRoot: function (elId) { + if (elId == null) { + // 不指定elId清空 + for (var i = 0; i < this._roots.length; i++) { + var root = this._roots[i]; + if (root instanceof Group) { + root.delChildrenFromStorage(this); + } + } + + this._elements = {}; + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + + return; + } + + if (elId instanceof Array) { + for (var i = 0, l = elId.length; i < l; i++) { + this.delRoot(elId[i]); + } + return; + } + + var el; + if (typeof(elId) == 'string') { + el = this._elements[elId]; + } + else { + el = elId; + } + + var idx = util.indexOf(this._roots, el); + if (idx >= 0) { + this.delFromMap(el.id); + this._roots.splice(idx, 1); + if (el instanceof Group) { + el.delChildrenFromStorage(this); + } + } + }, + + addToMap: function (el) { + if (el instanceof Group) { + el.__storage = this; + } + el.dirty(); + + this._elements[el.id] = el; + + return this; + }, + + get: function (elId) { + return this._elements[elId]; + }, + + delFromMap: function (elId) { + var elements = this._elements; + var el = elements[elId]; + if (el) { + delete elements[elId]; + if (el instanceof Group) { + el.__storage = null; + } + } + + return this; + }, + + /** + * 清空并且释放Storage + */ + dispose: function () { + this._elements = + this._renderList = + this._roots = null; + } + }; + + module.exports = Storage; + + + +/***/ }, +/* 84 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * 动画主类, 调度和管理所有动画控制器 + * + * @module zrender/animation/Animation + * @author pissang(https://github.com/pissang) + */ + // TODO Additive animation + // http://iosoteric.com/additive-animations-animatewithduration-in-ios-8/ + // https://developer.apple.com/videos/wwdc2014/#236 + + + var util = __webpack_require__(3); + var Dispatcher = __webpack_require__(80).Dispatcher; + + var requestAnimationFrame = (typeof window !== 'undefined' && + (window.requestAnimationFrame + || window.msRequestAnimationFrame + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame)) + || function (func) { + setTimeout(func, 16); + }; + + var Animator = __webpack_require__(35); + /** + * @typedef {Object} IZRenderStage + * @property {Function} update + */ + + /** + * @alias module:zrender/animation/Animation + * @constructor + * @param {Object} [options] + * @param {Function} [options.onframe] + * @param {IZRenderStage} [options.stage] + * @example + * var animation = new Animation(); + * var obj = { + * x: 100, + * y: 100 + * }; + * animation.animate(node.position) + * .when(1000, { + * x: 500, + * y: 500 + * }) + * .when(2000, { + * x: 100, + * y: 100 + * }) + * .start('spline'); + */ + var Animation = function (options) { + + options = options || {}; + + this.stage = options.stage || {}; + + this.onframe = options.onframe || function() {}; + + // private properties + this._clips = []; + + this._running = false; + + this._time = 0; + + Dispatcher.call(this); + }; + + Animation.prototype = { + + constructor: Animation, + /** + * 添加 clip + * @param {module:zrender/animation/Clip} clip + */ + addClip: function (clip) { + this._clips.push(clip); + }, + /** + * 添加 animator + * @param {module:zrender/animation/Animator} animator + */ + addAnimator: function (animator) { + animator.animation = this; + var clips = animator.getClips(); + for (var i = 0; i < clips.length; i++) { + this.addClip(clips[i]); + } + }, + /** + * 删除动画片段 + * @param {module:zrender/animation/Clip} clip + */ + removeClip: function(clip) { + var idx = util.indexOf(this._clips, clip); + if (idx >= 0) { + this._clips.splice(idx, 1); + } + }, + + /** + * 删除动画片段 + * @param {module:zrender/animation/Animator} animator + */ + removeAnimator: function (animator) { + var clips = animator.getClips(); + for (var i = 0; i < clips.length; i++) { + this.removeClip(clips[i]); + } + animator.animation = null; + }, + + _update: function() { + + var time = new Date().getTime(); + var delta = time - this._time; + var clips = this._clips; + var len = clips.length; + + var deferredEvents = []; + var deferredClips = []; + for (var i = 0; i < len; i++) { + var clip = clips[i]; + var e = clip.step(time); + // Throw out the events need to be called after + // stage.update, like destroy + if (e) { + deferredEvents.push(e); + deferredClips.push(clip); + } + } + + // Remove the finished clip + for (var i = 0; i < len;) { + if (clips[i]._needsRemove) { + clips[i] = clips[len - 1]; + clips.pop(); + len--; + } + else { + i++; + } + } + + len = deferredEvents.length; + for (var i = 0; i < len; i++) { + deferredClips[i].fire(deferredEvents[i]); + } + + this._time = time; + + this.onframe(delta); + + this.trigger('frame', delta); + + if (this.stage.update) { + this.stage.update(); + } + }, + /** + * 开始运行动画 + */ + start: function () { + var self = this; + + this._running = true; + + function step() { + if (self._running) { + + requestAnimationFrame(step); + + self._update(); + } + } + + this._time = new Date().getTime(); + requestAnimationFrame(step); + }, + /** + * 停止运行动画 + */ + stop: function () { + this._running = false; + }, + /** + * 清除所有动画片段 + */ + clear: function () { + this._clips = []; + }, + /** + * 对一个目标创建一个animator对象,可以指定目标中的属性使用动画 + * @param {Object} target + * @param {Object} options + * @param {boolean} [options.loop=false] 是否循环播放动画 + * @param {Function} [options.getter=null] + * 如果指定getter函数,会通过getter函数取属性值 + * @param {Function} [options.setter=null] + * 如果指定setter函数,会通过setter函数设置属性值 + * @return {module:zrender/animation/Animation~Animator} + */ + animate: function (target, options) { + options = options || {}; + var animator = new Animator( + target, + options.loop, + options.getter, + options.setter + ); + + return animator; + } + }; + + util.mixin(Animation, Dispatcher); + + module.exports = Animation; + + + +/***/ }, +/* 85 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Default canvas painter + * @module zrender/Painter + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + * pissang (https://www.github.com/pissang) + */ + + + var config = __webpack_require__(40); + var util = __webpack_require__(3); + var log = __webpack_require__(39); + var BoundingRect = __webpack_require__(15); + + var Layer = __webpack_require__(86); + + function parseInt10(val) { + return parseInt(val, 10); + } + + function isLayerValid(layer) { + if (!layer) { + return false; + } + + if (layer.isBuildin) { + return true; + } + + if (typeof(layer.resize) !== 'function' + || typeof(layer.refresh) !== 'function' + ) { + return false; + } + + return true; + } + + function preProcessLayer(layer) { + layer.__unusedCount++; + } + + function postProcessLayer(layer) { + layer.__dirty = false; + if (layer.__unusedCount == 1) { + layer.clear(); + } + } + + var tmpRect = new BoundingRect(0, 0, 0, 0); + var viewRect = new BoundingRect(0, 0, 0, 0); + function isDisplayableCulled(el, width, height) { + tmpRect.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect.applyTransform(el.transform); + } + viewRect.width = width; + viewRect.height = height; + return !tmpRect.intersect(viewRect); + } + + function isClipPathChanged(clipPaths, prevClipPaths) { + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } + } + + function doClip(clipPaths, ctx) { + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + var m; + if (clipPath.transform) { + m = clipPath.transform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + var path = clipPath.path; + path.beginPath(ctx); + clipPath.buildPath(path, clipPath.shape); + ctx.clip(); + // Transform back + if (clipPath.transform) { + m = clipPath.invTransform; + ctx.transform( + m[0], m[1], + m[2], m[3], + m[4], m[5] + ); + } + } + } + + /** + * @alias module:zrender/Painter + * @constructor + * @param {HTMLElement} root 绘图容器 + * @param {module:zrender/Storage} storage + * @param {Ojbect} opts + */ + var Painter = function (root, storage, opts) { + var singleCanvas = !root.nodeName // In node ? + || root.nodeName.toUpperCase() === 'CANVAS'; + + opts = opts || {}; + + /** + * @type {number} + */ + this.dpr = opts.devicePixelRatio || config.devicePixelRatio; + /** + * @type {boolean} + * @private + */ + this._singleCanvas = singleCanvas; + /** + * 绘图容器 + * @type {HTMLElement} + */ + this.root = root; + + var rootStyle = root.style; + + // In node environment using node-canvas + if (rootStyle) { + rootStyle['-webkit-tap-highlight-color'] = 'transparent'; + rootStyle['-webkit-user-select'] = 'none'; + rootStyle['user-select'] = 'none'; + rootStyle['-webkit-touch-callout'] = 'none'; + + root.innerHTML = ''; + } + + /** + * @type {module:zrender/Storage} + */ + this.storage = storage; + + if (!singleCanvas) { + var width = this._getWidth(); + var height = this._getHeight(); + this._width = width; + this._height = height; + + var domRoot = document.createElement('div'); + this._domRoot = domRoot; + var domRootStyle = domRoot.style; + + // domRoot.onselectstart = returnFalse; // 避免页面选中的尴尬 + domRootStyle.position = 'relative'; + domRootStyle.overflow = 'hidden'; + domRootStyle.width = this._width + 'px'; + domRootStyle.height = this._height + 'px'; + root.appendChild(domRoot); + + /** + * @type {Object.} + * @private + */ + this._layers = {}; + /** + * @type {Array.} + * @private + */ + this._zlevelList = []; + } + else { + // Use canvas width and height directly + var width = root.width; + var height = root.height; + this._width = width; + this._height = height; + + // Create layer if only one given canvas + // Device pixel ratio is fixed to 1 because given canvas has its specified width and height + var mainLayer = new Layer(root, this, 1); + mainLayer.initContext(); + // FIXME Use canvas width and height + // mainLayer.resize(width, height); + this._layers = { + 0: mainLayer + }; + this._zlevelList = [0]; + } + + this._layerConfig = {}; + + this.pathToImage = this._createPathToImage(); + }; + + Painter.prototype = { + + constructor: Painter, + + /** + * If painter use a single canvas + * @return {boolean} + */ + isSingleCanvas: function () { + return this._singleCanvas; + }, + /** + * @return {HTMLDivElement} + */ + getViewportRoot: function () { + return this._singleCanvas ? this._layers[0].dom : this._domRoot; + }, + + /** + * 刷新 + * @param {boolean} [paintAll=false] 强制绘制所有displayable + */ + refresh: function (paintAll) { + var list = this.storage.getDisplayList(true); + var zlevelList = this._zlevelList; + + this._paintList(list, paintAll); + + // Paint custum layers + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.isBuildin && layer.refresh) { + layer.refresh(); + } + } + + return this; + }, + + _paintList: function (list, paintAll) { + + if (paintAll == null) { + paintAll = false; + } + + this._updateLayerStatus(list); + + var currentLayer; + var currentZLevel; + var ctx; + + var viewWidth = this._width; + var viewHeight = this._height; + + this.eachBuildinLayer(preProcessLayer); + + // var invTransform = []; + var prevElClipPaths = null; + + for (var i = 0, l = list.length; i < l; i++) { + var el = list[i]; + var elZLevel = this._singleCanvas ? 0 : el.zlevel; + // Change draw layer + if (currentZLevel !== elZLevel) { + // Only 0 zlevel if only has one canvas + currentZLevel = elZLevel; + currentLayer = this.getLayer(currentZLevel); + + if (!currentLayer.isBuildin) { + log( + 'ZLevel ' + currentZLevel + + ' has been used by unkown layer ' + currentLayer.id + ); + } + + ctx = currentLayer.ctx; + + // Reset the count + currentLayer.__unusedCount = 0; + + if (currentLayer.__dirty || paintAll) { + currentLayer.clear(); + } + } + + if ( + (currentLayer.__dirty || paintAll) + // Ignore invisible element + && !el.invisible + // Ignore transparent element + && el.style.opacity !== 0 + // Ignore scale 0 element, in some environment like node-canvas + // Draw a scale 0 element can cause all following draw wrong + && el.scale[0] && el.scale[1] + // Ignore culled element + && !(el.culling && isDisplayableCulled(el, viewWidth, viewHeight)) + ) { + var clipPaths = el.__clipPaths; + + // Optimize when clipping on group with several elements + if (isClipPathChanged(clipPaths, prevElClipPaths)) { + // If has previous clipping state, restore from it + if (prevElClipPaths) { + ctx.restore(); + } + // New clipping state + if (clipPaths) { + ctx.save(); + doClip(clipPaths, ctx); + } + prevElClipPaths = clipPaths; + } + el.beforeBrush && el.beforeBrush(ctx); + el.brush(ctx, false); + el.afterBrush && el.afterBrush(ctx); + } + + el.__dirty = false; + } + + // If still has clipping state + if (prevElClipPaths) { + ctx.restore(); + } + + this.eachBuildinLayer(postProcessLayer); + }, + + /** + * 获取 zlevel 所在层,如果不存在则会创建一个新的层 + * @param {number} zlevel + * @return {module:zrender/Layer} + */ + getLayer: function (zlevel) { + if (this._singleCanvas) { + return this._layers[0]; + } + + var layer = this._layers[zlevel]; + if (!layer) { + // Create a new layer + layer = new Layer('zr_' + zlevel, this, this.dpr); + layer.isBuildin = true; + + if (this._layerConfig[zlevel]) { + util.merge(layer, this._layerConfig[zlevel], true); + } + + this.insertLayer(zlevel, layer); + + // Context is created after dom inserted to document + // Or excanvas will get 0px clientWidth and clientHeight + layer.initContext(); + } + + return layer; + }, + + insertLayer: function (zlevel, layer) { + + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var prevLayer = null; + var i = -1; + var domRoot = this._domRoot; + + if (layersMap[zlevel]) { + log('ZLevel ' + zlevel + ' has been used already'); + return; + } + // Check if is a valid layer + if (!isLayerValid(layer)) { + log('Layer of zlevel ' + zlevel + ' is not valid'); + return; + } + + if (len > 0 && zlevel > zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if ( + zlevelList[i] < zlevel + && zlevelList[i + 1] > zlevel + ) { + break; + } + } + prevLayer = layersMap[zlevelList[i]]; + } + zlevelList.splice(i + 1, 0, zlevel); + + if (prevLayer) { + var prevDom = prevLayer.dom; + if (prevDom.nextSibling) { + domRoot.insertBefore( + layer.dom, + prevDom.nextSibling + ); + } + else { + domRoot.appendChild(layer.dom); + } + } + else { + if (domRoot.firstChild) { + domRoot.insertBefore(layer.dom, domRoot.firstChild); + } + else { + domRoot.appendChild(layer.dom); + } + } + + layersMap[zlevel] = layer; + }, + + // Iterate each layer + eachLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }, + + // Iterate each buildin layer + eachBuildinLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var layer; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + layer = this._layers[z]; + if (layer.isBuildin) { + cb.call(context, layer, z); + } + } + }, + + // Iterate each other layer except buildin layer + eachOtherLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var layer; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + layer = this._layers[z]; + if (! layer.isBuildin) { + cb.call(context, layer, z); + } + } + }, + + /** + * 获取所有已创建的层 + * @param {Array.} [prevLayer] + */ + getLayers: function () { + return this._layers; + }, + + _updateLayerStatus: function (list) { + + var layers = this._layers; + + var elCounts = {}; + + this.eachBuildinLayer(function (layer, z) { + elCounts[z] = layer.elCount; + layer.elCount = 0; + }); + + for (var i = 0, l = list.length; i < l; i++) { + var el = list[i]; + var zlevel = this._singleCanvas ? 0 : el.zlevel; + var layer = layers[zlevel]; + if (layer) { + layer.elCount++; + // 已经被标记为需要刷新 + if (layer.__dirty) { + continue; + } + layer.__dirty = el.__dirty; + } + } + + // 层中的元素数量有发生变化 + this.eachBuildinLayer(function (layer, z) { + if (elCounts[z] !== layer.elCount) { + layer.__dirty = true; + } + }); + }, + + /** + * 清除hover层外所有内容 + */ + clear: function () { + this.eachBuildinLayer(this._clearLayer); + return this; + }, + + _clearLayer: function (layer) { + layer.clear(); + }, + + /** + * 修改指定zlevel的绘制参数 + * + * @param {string} zlevel + * @param {Object} config 配置对象 + * @param {string} [config.clearColor=0] 每次清空画布的颜色 + * @param {string} [config.motionBlur=false] 是否开启动态模糊 + * @param {number} [config.lastFrameAlpha=0.7] + * 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + */ + configLayer: function (zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } + else { + util.merge(layerConfig[zlevel], config, true); + } + + var layer = this._layers[zlevel]; + + if (layer) { + util.merge(layer, layerConfig[zlevel], true); + } + } + }, + + /** + * 删除指定层 + * @param {number} zlevel 层所在的zlevel + */ + delLayer: function (zlevel) { + var layers = this._layers; + var zlevelList = this._zlevelList; + var layer = layers[zlevel]; + if (!layer) { + return; + } + layer.dom.parentNode.removeChild(layer.dom); + delete layers[zlevel]; + + zlevelList.splice(util.indexOf(zlevelList, zlevel), 1); + }, + + /** + * 区域大小变化后重绘 + */ + resize: function (width, height) { + var domRoot = this._domRoot; + // FIXME Why ? + domRoot.style.display = 'none'; + + width = width || this._getWidth(); + height = height || this._getHeight(); + + domRoot.style.display = ''; + + // 优化没有实际改变的resize + if (this._width != width || height != this._height) { + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + + for (var id in this._layers) { + this._layers[id].resize(width, height); + } + + this.refresh(true); + } + + this._width = width; + this._height = height; + + return this; + }, + + /** + * 清除单独的一个层 + * @param {number} zlevel + */ + clearLayer: function (zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }, + + /** + * 释放 + */ + dispose: function () { + this.root.innerHTML = ''; + + this.root = + this.storage = + + this._domRoot = + this._layers = null; + }, + + /** + * Get canvas which has all thing rendered + * @param {Object} opts + * @param {string} [opts.backgroundColor] + */ + getRenderedCanvas: function (opts) { + opts = opts || {}; + if (this._singleCanvas) { + return this._layers[0].dom; + } + + var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + + var ctx = imageLayer.ctx; + imageLayer.clearColor = opts.backgroundColor; + imageLayer.clear(); + + var displayList = this.storage.getDisplayList(true); + + for (var i = 0; i < displayList.length; i++) { + var el = displayList[i]; + if (!el.invisible) { + el.beforeBrush && el.beforeBrush(ctx); + // TODO Check image cross origin + el.brush(ctx, false); + el.afterBrush && el.afterBrush(ctx); + } + } + + return imageLayer.dom; + }, + /** + * 获取绘图区域宽度 + */ + getWidth: function () { + return this._width; + }, + + /** + * 获取绘图区域高度 + */ + getHeight: function () { + return this._height; + }, + + _getWidth: function () { + var root = this.root; + var stl = document.defaultView.getComputedStyle(root); + + // FIXME Better way to get the width and height when element has not been append to the document + return ((root.clientWidth || parseInt10(stl.width) || parseInt10(root.style.width)) + - (parseInt10(stl.paddingLeft) || 0) + - (parseInt10(stl.paddingRight) || 0)) | 0; + }, + + _getHeight: function () { + var root = this.root; + var stl = document.defaultView.getComputedStyle(root); + + return ((root.clientHeight || parseInt10(stl.height) || parseInt10(root.style.height)) + - (parseInt10(stl.paddingTop) || 0) + - (parseInt10(stl.paddingBottom) || 0)) | 0; + }, + + _pathToImage: function (id, path, width, height, dpr) { + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + canvas.width = width * dpr; + canvas.height = height * dpr; + + ctx.clearRect(0, 0, width * dpr, height * dpr); + + var pathTransform = { + position: path.position, + rotation: path.rotation, + scale: path.scale + }; + path.position = [0, 0, 0]; + path.rotation = 0; + path.scale = [1, 1]; + if (path) { + path.brush(ctx); + } + + var ImageShape = __webpack_require__(59); + var imgShape = new ImageShape({ + id: id, + style: { + x: 0, + y: 0, + image: canvas + } + }); + + if (pathTransform.position != null) { + imgShape.position = path.position = pathTransform.position; + } + + if (pathTransform.rotation != null) { + imgShape.rotation = path.rotation = pathTransform.rotation; + } + + if (pathTransform.scale != null) { + imgShape.scale = path.scale = pathTransform.scale; + } + + return imgShape; + }, + + _createPathToImage: function () { + var me = this; + + return function (id, e, width, height) { + return me._pathToImage( + id, e, width, height, me.dpr + ); + }; + } + }; + + module.exports = Painter; + + + +/***/ }, +/* 86 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module zrender/Layer + * @author pissang(https://www.github.com/pissang) + */ + + + var util = __webpack_require__(3); + var config = __webpack_require__(40); + + function returnFalse() { + return false; + } + + /** + * 创建dom + * + * @inner + * @param {string} id dom id 待用 + * @param {string} type dom type,such as canvas, div etc. + * @param {Painter} painter painter instance + * @param {number} number + */ + function createDom(id, type, painter, dpr) { + var newDom = document.createElement(type); + var width = painter.getWidth(); + var height = painter.getHeight(); + + var newDomStyle = newDom.style; + // 没append呢,请原谅我这样写,清晰~ + newDomStyle.position = 'absolute'; + newDomStyle.left = 0; + newDomStyle.top = 0; + newDomStyle.width = width + 'px'; + newDomStyle.height = height + 'px'; + newDom.width = width * dpr; + newDom.height = height * dpr; + + // id不作为索引用,避免可能造成的重名,定义为私有属性 + newDom.setAttribute('data-zr-dom-id', id); + return newDom; + } + + /** + * @alias module:zrender/Layer + * @constructor + * @extends module:zrender/mixin/Transformable + * @param {string} id + * @param {module:zrender/Painter} painter + * @param {number} [dpr] + */ + var Layer = function(id, painter, dpr) { + var dom; + dpr = dpr || config.devicePixelRatio; + if (typeof id === 'string') { + dom = createDom(id, 'canvas', painter, dpr); + } + // Not using isDom because in node it will return false + else if (util.isObject(id)) { + dom = id; + id = dom.id; + } + this.id = id; + this.dom = dom; + + var domStyle = dom.style; + if (domStyle) { // Not in node + dom.onselectstart = returnFalse; // 避免页面选中的尴尬 + domStyle['-webkit-user-select'] = 'none'; + domStyle['user-select'] = 'none'; + domStyle['-webkit-touch-callout'] = 'none'; + domStyle['-webkit-tap-highlight-color'] = 'rgba(0,0,0,0)'; + } + + this.domBack = null; + this.ctxBack = null; + + this.painter = painter; + + this.config = null; + + // Configs + /** + * 每次清空画布的颜色 + * @type {string} + * @default 0 + */ + this.clearColor = 0; + /** + * 是否开启动态模糊 + * @type {boolean} + * @default false + */ + this.motionBlur = false; + /** + * 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + * @type {number} + * @default 0.7 + */ + this.lastFrameAlpha = 0.7; + + /** + * Layer dpr + * @type {number} + */ + this.dpr = dpr; + }; + + Layer.prototype = { + + constructor: Layer, + + elCount: 0, + + __dirty: true, + + initContext: function () { + this.ctx = this.dom.getContext('2d'); + + var dpr = this.dpr; + if (dpr != 1) { + this.ctx.scale(dpr, dpr); + } + }, + + createBackBuffer: function () { + var dpr = this.dpr; + + this.domBack = createDom('back-' + this.id, 'canvas', this.painter, dpr); + this.ctxBack = this.domBack.getContext('2d'); + + if (dpr != 1) { + this.ctxBack.scale(dpr, dpr); + } + }, + + /** + * @param {number} width + * @param {number} height + */ + resize: function (width, height) { + var dpr = this.dpr; + + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + + dom.width = width * dpr; + dom.height = height * dpr; + + if (dpr != 1) { + this.ctx.scale(dpr, dpr); + } + + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + + if (dpr != 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }, + + /** + * 清空该层画布 + * @param {boolean} clearAll Clear all with out motion blur + */ + clear: function (clearAll) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + + var haveClearColor = this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + + var dpr = this.dpr; + + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage( + dom, 0, 0, + width / dpr, + height / dpr + ); + } + + ctx.clearRect(0, 0, width / dpr, height / dpr); + if (haveClearColor) { + ctx.save(); + ctx.fillStyle = this.clearColor; + ctx.fillRect(0, 0, width / dpr, height / dpr); + ctx.restore(); + } + + if (haveMotionBLur) { + var domBack = this.domBack; + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, 0, 0, width / dpr, height / dpr); + ctx.restore(); + } + } + }; + + module.exports = Layer; + + +/***/ }, +/* 87 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + var PI = Math.PI; + /** + * @param {module:echarts/ExtensionAPI} api + * @param {Object} [opts] + * @param {string} [opts.text] + * @param {string} [opts.color] + * @param {string} [opts.textColor] + * @return {module:zrender/Element} + */ + module.exports = function (api, opts) { + opts = opts || {}; + zrUtil.defaults(opts, { + text: 'loading', + color: '#c23531', + textColor: '#000', + maskColor: 'rgba(255, 255, 255, 0.8)', + zlevel: 0 + }); + var mask = new graphic.Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + var arc = new graphic.Arc({ + shape: { + startAngle: -PI / 2, + endAngle: -PI / 2 + 0.1, + r: 10 + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: 5 + }, + zlevel: opts.zlevel, + z: 10001 + }); + var labelRect = new graphic.Rect({ + style: { + fill: 'none', + text: opts.text, + textPosition: 'right', + textDistance: 10, + textFill: opts.textColor + }, + zlevel: opts.zlevel, + z: 10001 + }); + + arc.animateShape(true) + .when(1000, { + endAngle: PI * 3 / 2 + }) + .start('circularInOut'); + arc.animateShape(true) + .when(1000, { + startAngle: PI * 3 / 2 + }) + .delay(300) + .start('circularInOut'); + + var group = new graphic.Group(); + group.add(arc); + group.add(labelRect); + group.add(mask); + // Inject resize + group.resize = function () { + var cx = api.getWidth() / 2; + var cy = api.getHeight() / 2; + arc.setShape({ + cx: cx, + cy: cy + }); + var r = arc.shape.r; + labelRect.setShape({ + x: cx - r, + y: cy - r, + width: r * 2, + height: r * 2 + }); + + mask.setShape({ + x: 0, + y: 0, + width: api.getWidth(), + height: api.getHeight() + }); + }; + group.resize(); + return group; + }; + + +/***/ }, +/* 88 */ +/***/ function(module, exports, __webpack_require__) { + + + var Gradient = __webpack_require__(4); + module.exports = function (seriesType, styleType, ecModel) { + function encodeColor(seriesModel) { + var colorAccessPath = [styleType, 'normal', 'color']; + var colorList = ecModel.get('color'); + var data = seriesModel.getData(); + var color = seriesModel.get(colorAccessPath) // Set in itemStyle + || colorList[seriesModel.seriesIndex % colorList.length]; // Default color + + // FIXME Set color function or use the platte color + data.setVisual('color', color); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + if (typeof color === 'function' && !(color instanceof Gradient)) { + data.each(function (idx) { + data.setItemVisual( + idx, 'color', color(seriesModel.getDataParams(idx)) + ); + }); + } + + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var color = itemModel.get(colorAccessPath, true); + if (color != null) { + data.setItemVisual(idx, 'color', color); + } + }); + } + } + seriesType ? ecModel.eachSeriesByType(seriesType, encodeColor) + : ecModel.eachSeries(encodeColor); + }; + + +/***/ }, +/* 89 */ +/***/ function(module, exports, __webpack_require__) { + + // Compatitable with 2.0 + + + var zrUtil = __webpack_require__(3); + var compatStyle = __webpack_require__(90); + + function get(opt, path) { + path = path.split(','); + var obj = opt; + for (var i = 0; i < path.length; i++) { + obj = obj && obj[path[i]]; + if (obj == null) { + break; + } + } + return obj; + } + + function set(opt, path, val, overwrite) { + path = path.split(','); + var obj = opt; + var key; + for (var i = 0; i < path.length - 1; i++) { + key = path[i]; + if (obj[key] == null) { + obj[key] = {}; + } + obj = obj[key]; + } + if (overwrite || obj[path[i]] == null) { + obj[path[i]] = val; + } + } + + function compatLayoutProperties(option) { + each(LAYOUT_PROPERTIES, function (prop) { + if (prop[0] in option && !(prop[1] in option)) { + option[prop[1]] = option[prop[0]]; + } + }); + } + + var LAYOUT_PROPERTIES = [ + ['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom'] + ]; + + var COMPATITABLE_COMPONENTS = [ + 'grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline' + ]; + + var COMPATITABLE_SERIES = [ + 'bar', 'boxplot', 'candlestick', 'chord', 'effectScatter', + 'funnel', 'gauge', 'lines', 'graph', 'heatmap', 'line', 'map', 'parallel', + 'pie', 'radar', 'sankey', 'scatter', 'treemap' + ]; + + var each = zrUtil.each; + + module.exports = function (option) { + each(option.series, function (seriesOpt) { + if (!zrUtil.isObject(seriesOpt)) { + return; + } + + var seriesType = seriesOpt.type; + + compatStyle(seriesOpt); + + if (seriesType === 'pie' || seriesType === 'gauge') { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + } + } + if (seriesType === 'gauge') { + var pointerColor = get(seriesOpt, 'pointer.color'); + pointerColor != null + && set(seriesOpt, 'itemStyle.normal.color', pointerColor); + } + + for (var i = 0; i < COMPATITABLE_SERIES.length; i++) { + if (COMPATITABLE_SERIES[i] === seriesOpt.type) { + compatLayoutProperties(seriesOpt); + break; + } + } + }); + + // dataRange has changed to visualMap + if (option.dataRange) { + option.visualMap = option.dataRange; + } + + each(COMPATITABLE_COMPONENTS, function (componentName) { + var options = option[componentName]; + if (options) { + if (!zrUtil.isArray(options)) { + options = [options]; + } + each(options, function (option) { + compatLayoutProperties(option); + }); + } + }); + }; + + +/***/ }, +/* 90 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var POSSIBLE_STYLES = [ + 'areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', + 'chordStyle', 'label', 'labelLine' + ]; + + function compatItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + if (itemStyleOpt) { + zrUtil.each(POSSIBLE_STYLES, function (styleName) { + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } + else { + zrUtil.merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + normalItemStyleOpt[styleName] = null; + } + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } + else { + zrUtil.merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + emphasisItemStyleOpt[styleName] = null; + } + }); + } + } + + module.exports = function (seriesOpt) { + if (!seriesOpt) { + return; + } + compatItemStyle(seriesOpt); + compatItemStyle(seriesOpt.markPoint); + compatItemStyle(seriesOpt.markLine); + var data = seriesOpt.data; + if (data) { + for (var i = 0; i < data.length; i++) { + compatItemStyle(data[i]); + } + // mark point data + var markPoint = seriesOpt.markPoint; + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + for (var i = 0; i < mpData.length; i++) { + compatItemStyle(mpData[i]); + } + } + // mark line data + var markLine = seriesOpt.markLine; + if (markLine && markLine.data) { + var mlData = markLine.data; + for (var i = 0; i < mlData.length; i++) { + if (zrUtil.isArray(mlData[i])) { + compatItemStyle(mlData[i][0]); + compatItemStyle(mlData[i][1]); + } + else { + compatItemStyle(mlData[i]); + } + } + } + } + }; + + +/***/ }, +/* 91 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(92); + __webpack_require__(97); + + echarts.registerVisualCoding('chart', zrUtil.curry( + __webpack_require__(103), 'line', 'circle', 'line' + )); + echarts.registerLayout(zrUtil.curry( + __webpack_require__(104), 'line' + )); + + // Down sample after filter + echarts.registerProcessor('statistic', zrUtil.curry( + __webpack_require__(105), 'line' + )); + + // In case developer forget to include grid component + __webpack_require__(106); + + +/***/ }, +/* 92 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var createListFromArray = __webpack_require__(93); + var SeriesModel = __webpack_require__(27); + + module.exports = SeriesModel.extend({ + + type: 'series.line', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + return createListFromArray(option.data, this, ecModel); + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + + hoverAnimation: true, + // stack: null + xAxisIndex: 0, + yAxisIndex: 0, + + polarIndex: 0, + + // If clip the overflow value + clipOverflow: true, + + label: { + normal: { + // show: false, + position: 'top' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + } + // emphasis: { + // show: false, + // position: 'top' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // } + }, + // itemStyle: { + // normal: { + // // color: 各异 + // }, + // emphasis: { + // // color: 各异, + // } + // }, + lineStyle: { + normal: { + width: 2, + type: 'solid' + } + }, + // areaStyle: { + // }, + // smooth: false, + // smoothMonotone: null, + // 拐点图形类型 + symbol: 'emptyCircle', + // 拐点图形大小 + symbolSize: 4, + // 拐点图形旋转控制 + // symbolRotate: null, + + // 是否显示 symbol, 只有在 tooltip hover 的时候显示 + showSymbol: true, + // 标志图形默认只有主轴显示(随主轴标签间隔隐藏策略) + // showAllSymbol: false + // + // 大数据过滤,'average', 'max', 'min', 'sum' + // sampling: 'none' + + animationEasing: 'linear' + } + }); + + +/***/ }, +/* 93 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var completeDimensions = __webpack_require__(96); + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var CoordinateSystem = __webpack_require__(25); + var getDataItemValue = modelUtil.getDataItemValue; + var converDataValue = modelUtil.converDataValue; + + function firstDataNotNull(data) { + var i = 0; + while (i < data.length && data[i] == null) { + i++; + } + return data[i]; + } + function ifNeedCompleteOrdinalData(data) { + var sampleItem = firstDataNotNull(data); + return sampleItem != null + && !zrUtil.isArray(getDataItemValue(sampleItem)); + } + + /** + * Helper function to create a list from option data + */ + function createListFromArray(data, seriesModel, ecModel) { + // If data is undefined + data = data || []; + + var coordSysName = seriesModel.get('coordinateSystem'); + var creator = creators[coordSysName]; + var registeredCoordSys = CoordinateSystem.get(coordSysName); + // FIXME + var result = creator && creator(data, seriesModel, ecModel); + var dimensions = result && result.dimensions; + if (!dimensions) { + // Get dimensions from registered coordinate system + dimensions = (registeredCoordSys && registeredCoordSys.dimensions) || ['x', 'y']; + dimensions = completeDimensions(dimensions, data, dimensions.concat(['value'])); + } + var categoryAxisModel = result && result.categoryAxisModel; + + var categoryDimIndex = dimensions[0].type === 'ordinal' + ? 0 : (dimensions[1].type === 'ordinal' ? 1 : -1); + + var list = new List(dimensions, seriesModel); + + var nameList = createNameList(result, data); + + var dimValueGetter = (categoryAxisModel && ifNeedCompleteOrdinalData(data)) + ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === categoryDimIndex + ? dataIndex + : converDataValue(getDataItemValue(itemOpt), dimensions[dimIndex]); + } + : function (itemOpt, dimName, dataIndex, dimIndex) { + var val = getDataItemValue(itemOpt); + return converDataValue(val && val[dimIndex], dimensions[dimIndex]); + }; + + list.initData(data, nameList, dimValueGetter); + + return list; + } + + function isStackable(axisType) { + return axisType !== 'category' && axisType !== 'time'; + } + + function getDimTypeByAxis(axisType) { + return axisType === 'category' + ? 'ordinal' + : axisType === 'time' + ? 'time' + : 'float'; + } + + /** + * Creaters for each coord system. + * @return {Object} {dimensions, categoryAxisModel}; + */ + var creators = { + + cartesian2d: function (data, seriesModel, ecModel) { + var xAxisModel = ecModel.getComponent('xAxis', seriesModel.get('xAxisIndex')); + var yAxisModel = ecModel.getComponent('yAxis', seriesModel.get('yAxisIndex')); + var xAxisType = xAxisModel.get('type'); + var yAxisType = yAxisModel.get('type'); + + var dimensions = [ + { + name: 'x', + type: getDimTypeByAxis(xAxisType), + stackable: isStackable(xAxisType) + }, + { + name: 'y', + // If two category axes + type: getDimTypeByAxis(yAxisType), + stackable: isStackable(yAxisType) + } + ]; + + var isXAxisCateogry = xAxisType === 'category'; + + completeDimensions(dimensions, data, ['x', 'y', 'z']); + + return { + dimensions: dimensions, + categoryIndex: isXAxisCateogry ? 0 : 1, + categoryAxisModel: isXAxisCateogry + ? xAxisModel + : (yAxisType === 'category' ? yAxisModel : null) + }; + }, + + polar: function (data, seriesModel, ecModel) { + var polarIndex = seriesModel.get('polarIndex') || 0; + + var axisFinder = function (axisModel) { + return axisModel.get('polarIndex') === polarIndex; + }; + + var angleAxisModel = ecModel.findComponents({ + mainType: 'angleAxis', filter: axisFinder + })[0]; + var radiusAxisModel = ecModel.findComponents({ + mainType: 'radiusAxis', filter: axisFinder + })[0]; + + var radiusAxisType = radiusAxisModel.get('type'); + var angleAxisType = angleAxisModel.get('type'); + + var dimensions = [ + { + name: 'radius', + type: getDimTypeByAxis(radiusAxisType), + stackable: isStackable(radiusAxisType) + }, + { + name: 'angle', + type: getDimTypeByAxis(angleAxisType), + stackable: isStackable(angleAxisType) + } + ]; + var isAngleAxisCateogry = angleAxisType === 'category'; + + completeDimensions(dimensions, data, ['radius', 'angle', 'value']); + + return { + dimensions: dimensions, + categoryIndex: isAngleAxisCateogry ? 1 : 0, + categoryAxisModel: isAngleAxisCateogry + ? angleAxisModel + : (radiusAxisType === 'category' ? radiusAxisModel : null) + }; + }, + + geo: function (data, seriesModel, ecModel) { + // TODO Region + // 多个散点图系列在同一个地区的时候 + return { + dimensions: completeDimensions([ + {name: 'lng'}, + {name: 'lat'} + ], data, ['lng', 'lat', 'value']) + }; + } + }; + + function createNameList(result, data) { + var nameList = []; + + if (result && result.categoryAxisModel) { + // FIXME Two category axis + var categories = result.categoryAxisModel.getCategories(); + if (categories) { + var dataLen = data.length; + // Ordered data is given explicitly like + // [[3, 0.2], [1, 0.3], [2, 0.15]] + // or given scatter data, + // pick the category + if (zrUtil.isArray(data[0]) && data[0].length > 1) { + nameList = []; + for (var i = 0; i < dataLen; i++) { + nameList[i] = categories[data[i][result.categoryIndex || 0]]; + } + } + else { + nameList = categories.slice(0); + } + } + } + + return nameList; + } + + module.exports = createListFromArray; + + + +/***/ }, +/* 94 */ +/***/ function(module, exports, __webpack_require__) { + + /* WEBPACK VAR INJECTION */(function(global) {/** + * List for data storage + * @module echarts/data/List + */ + + + var UNDEFINED = 'undefined'; + var globalObj = typeof window === 'undefined' ? global : window; + var Float64Array = typeof globalObj.Float64Array === UNDEFINED + ? Array : globalObj.Float64Array; + var Int32Array = typeof globalObj.Int32Array === UNDEFINED + ? Array : globalObj.Int32Array; + + var dataCtors = { + 'float': Float64Array, + 'int': Int32Array, + // Ordinal data type can be string or int + 'ordinal': Array, + 'number': Array, + 'time': Array + }; + + var Model = __webpack_require__(8); + var DataDiffer = __webpack_require__(95); + + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var isObject = zrUtil.isObject; + + var IMMUTABLE_PROPERTIES = [ + 'stackedOn', '_nameList', '_idList', '_rawData' + ]; + + var transferImmuProperties = function (a, b, wrappedMethod) { + zrUtil.each(IMMUTABLE_PROPERTIES.concat(wrappedMethod || []), function (propName) { + if (b.hasOwnProperty(propName)) { + a[propName] = b[propName]; + } + }); + }; + + /** + * @constructor + * @alias module:echarts/data/List + * + * @param {Array.} dimensions + * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius + * @param {module:echarts/model/Model} hostModel + */ + var List = function (dimensions, hostModel) { + + dimensions = dimensions || ['x', 'y']; + + var dimensionInfos = {}; + var dimensionNames = []; + for (var i = 0; i < dimensions.length; i++) { + var dimensionName; + var dimensionInfo = {}; + if (typeof dimensions[i] === 'string') { + dimensionName = dimensions[i]; + dimensionInfo = { + name: dimensionName, + stackable: false, + // Type can be 'float', 'int', 'number' + // Default is number, Precision of float may not enough + type: 'number' + }; + } + else { + dimensionInfo = dimensions[i]; + dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || 'number'; + } + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + } + /** + * @readOnly + * @type {Array.} + */ + this.dimensions = dimensionNames; + + /** + * Infomation of each data dimension, like data type. + * @type {Object} + */ + this._dimensionInfos = dimensionInfos; + + /** + * @type {module:echarts/model/Model} + */ + this.hostModel = hostModel; + + /** + * Indices stores the indices of data subset after filtered. + * This data subset will be used in chart. + * @type {Array.} + * @readOnly + */ + this.indices = []; + + /** + * Data storage + * @type {Object.} + * @private + */ + this._storage = {}; + + /** + * @type {Array.} + */ + this._nameList = []; + /** + * @type {Array.} + */ + this._idList = []; + /** + * Models of data option is stored sparse for optimizing memory cost + * @type {Array.} + * @private + */ + this._optionModels = []; + + /** + * @param {module:echarts/data/List} + */ + this.stackedOn = null; + + /** + * Global visual properties after visual coding + * @type {Object} + * @private + */ + this._visual = {}; + + /** + * Globel layout properties. + * @type {Object} + * @private + */ + this._layout = {}; + + /** + * Item visual properties after visual coding + * @type {Array.} + * @private + */ + this._itemVisuals = []; + + /** + * Item layout properties after layout + * @type {Array.} + * @private + */ + this._itemLayouts = []; + + /** + * Graphic elemnents + * @type {Array.} + * @private + */ + this._graphicEls = []; + + /** + * @type {Array.} + * @private + */ + this._rawData; + + /** + * @type {Object} + * @private + */ + this._extent; + }; + + var listProto = List.prototype; + + listProto.type = 'list'; + + /** + * Get dimension name + * @param {string|number} dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + listProto.getDimension = function (dim) { + if (!isNaN(dim)) { + dim = this.dimensions[dim] || dim; + } + return dim; + }; + /** + * Get type and stackable info of particular dimension + * @param {string|number} dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ + listProto.getDimensionInfo = function (dim) { + return zrUtil.clone(this._dimensionInfos[this.getDimension(dim)]); + }; + + /** + * Initialize from data + * @param {Array.} data + * @param {Array.} [nameList] + * @param {Function} [dimValueGetter] (dataItem, dimName, dataIndex, dimIndex) => number + */ + listProto.initData = function (data, nameList, dimValueGetter) { + data = data || []; + + this._rawData = data; + + // Clear + var storage = this._storage = {}; + var indices = this.indices = []; + + var dimensions = this.dimensions; + var size = data.length; + var dimensionInfoMap = this._dimensionInfos; + + var idList = []; + var nameRepeatCount = {}; + + nameList = nameList || []; + + // Init storage + for (var i = 0; i < dimensions.length; i++) { + var dimInfo = dimensionInfoMap[dimensions[i]]; + var DataCtor = dataCtors[dimInfo.type]; + storage[dimensions[i]] = new DataCtor(size); + } + + // Default dim value getter + dimValueGetter = dimValueGetter || function (dataItem, dimName, dataIndex, dimIndex) { + var value = modelUtil.getDataItemValue(dataItem); + return modelUtil.converDataValue( + zrUtil.isArray(value) + ? value[dimIndex] + // If value is a single number or something else not array. + : value, + dimensionInfoMap[dimName] + ); + }; + + for (var idx = 0; idx < data.length; idx++) { + var dataItem = data[idx]; + // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of cateogry + // Use a tempValue to normalize the value to be a (x, y) value + + // Store the data by dimensions + for (var k = 0; k < dimensions.length; k++) { + var dim = dimensions[k]; + var dimStorage = storage[dim]; + // PENDING NULL is empty or zero + dimStorage[idx] = dimValueGetter(dataItem, dim, idx, k); + } + + indices.push(idx); + } + + // Use the name in option and create id + for (var i = 0; i < data.length; i++) { + var id = ''; + if (!nameList[i]) { + nameList[i] = data[i].name; + // Try using the id in option + id = data[i].id; + } + var name = nameList[i] || ''; + if (!id && name) { + // Use name as id and add counter to avoid same name + nameRepeatCount[name] = nameRepeatCount[name] || 0; + id = name; + if (nameRepeatCount[name] > 0) { + id += '__ec__' + nameRepeatCount[name]; + } + nameRepeatCount[name]++; + } + id && (idList[i] = id); + } + + this._nameList = nameList; + this._idList = idList; + }; + + /** + * @return {number} + */ + listProto.count = function () { + return this.indices.length; + }; + + /** + * Get value. Return NaN if idx is out of range. + * @param {string} dim Dim must be concrete name. + * @param {number} idx + * @param {boolean} stack + * @return {number} + */ + listProto.get = function (dim, idx, stack) { + var storage = this._storage; + var dataIndex = this.indices[idx]; + + // If value not exists + if (dataIndex == null) { + return NaN; + } + + var value = storage[dim] && storage[dim][dataIndex]; + // FIXME ordinal data type is not stackable + if (stack) { + var dimensionInfo = this._dimensionInfos[dim]; + if (dimensionInfo && dimensionInfo.stackable) { + var stackedOn = this.stackedOn; + while (stackedOn) { + // Get no stacked data of stacked on + var stackedValue = stackedOn.get(dim, idx); + // Considering positive stack, negative stack and empty data + if ((value >= 0 && stackedValue > 0) // Positive stack + || (value <= 0 && stackedValue < 0) // Negative stack + ) { + value += stackedValue; + } + stackedOn = stackedOn.stackedOn; + } + } + } + return value; + }; + + /** + * Get value for multi dimensions. + * @param {Array.} [dimensions] If ignored, using all dimensions. + * @param {number} idx + * @param {boolean} stack + * @return {number} + */ + listProto.getValues = function (dimensions, idx, stack) { + var values = []; + + if (!zrUtil.isArray(dimensions)) { + stack = idx; + idx = dimensions; + dimensions = this.dimensions; + } + + for (var i = 0, len = dimensions.length; i < len; i++) { + values.push(this.get(dimensions[i], idx, stack)); + } + + return values; + }; + + /** + * If value is NaN. Inlcuding '-' + * @param {string} dim + * @param {number} idx + * @return {number} + */ + listProto.hasValue = function (idx) { + var dimensions = this.dimensions; + var dimensionInfos = this._dimensionInfos; + for (var i = 0, len = dimensions.length; i < len; i++) { + if ( + // Ordinal type can be string or number + dimensionInfos[dimensions[i]].type !== 'ordinal' + && isNaN(this.get(dimensions[i], idx)) + ) { + return false; + } + } + return true; + }; + + /** + * Get extent of data in one dimension + * @param {string} dim + * @param {boolean} stack + */ + listProto.getDataExtent = function (dim, stack) { + var dimData = this._storage[dim]; + var dimInfo = this.getDimensionInfo(dim); + stack = (dimInfo && dimInfo.stackable) && stack; + var dimExtent = (this._extent || (this._extent = {}))[dim + (!!stack)]; + var value; + if (dimExtent) { + return dimExtent; + } + // var dimInfo = this._dimensionInfos[dim]; + if (dimData) { + var min = Infinity; + var max = -Infinity; + // var isOrdinal = dimInfo.type === 'ordinal'; + for (var i = 0, len = this.count(); i < len; i++) { + value = this.get(dim, i, stack); + // FIXME + // if (isOrdinal && typeof value === 'string') { + // value = zrUtil.indexOf(dimData, value); + // console.log(value); + // } + value < min && (min = value); + value > max && (max = value); + } + return (this._extent[dim + stack] = [min, max]); + } + else { + return [Infinity, -Infinity]; + } + }; + + /** + * Get sum of data in one dimension + * @param {string} dim + * @param {boolean} stack + */ + listProto.getSum = function (dim, stack) { + var dimData = this._storage[dim]; + var sum = 0; + if (dimData) { + for (var i = 0, len = this.count(); i < len; i++) { + var value = this.get(dim, i, stack); + if (!isNaN(value)) { + sum += value; + } + } + } + return sum; + }; + + /** + * Retreive the index with given value + * @param {number} idx + * @param {number} value + * @return {number} + */ + // FIXME Precision of float value + listProto.indexOf = function (dim, value) { + var storage = this._storage; + var dimData = storage[dim]; + var indices = this.indices; + + if (dimData) { + for (var i = 0, len = indices.length; i < len; i++) { + var rawIndex = indices[i]; + if (dimData[rawIndex] === value) { + return i; + } + } + } + return -1; + }; + + /** + * Retreive the index with given name + * @param {number} idx + * @param {number} name + * @return {number} + */ + listProto.indexOfName = function (name) { + var indices = this.indices; + var nameList = this._nameList; + + for (var i = 0, len = indices.length; i < len; i++) { + var rawIndex = indices[i]; + if (nameList[rawIndex] === name) { + return i; + } + } + + return -1; + }; + + /** + * Retreive the index of nearest value + * @param {string>} dim + * @param {number} value + * @param {boolean} stack If given value is after stacked + * @return {number} + */ + listProto.indexOfNearest = function (dim, value, stack) { + var storage = this._storage; + var dimData = storage[dim]; + + if (dimData) { + var minDist = Number.MAX_VALUE; + var nearestIdx = -1; + for (var i = 0, len = this.count(); i < len; i++) { + var diff = value - this.get(dim, i, stack); + var dist = Math.abs(diff); + if (dist < minDist + // For the case of two data are same on xAxis, which has sequence data. + // Show the nearest index + // https://github.com/ecomfe/echarts/issues/2869 + || (dist === minDist && diff > 0) + ) { + minDist = dist; + nearestIdx = i; + } + } + return nearestIdx; + } + return -1; + }; + + /** + * Get raw data index + * @param {number} idx + * @return {number} + */ + listProto.getRawIndex = function (idx) { + var rawIdx = this.indices[idx]; + return rawIdx == null ? -1 : rawIdx; + }; + + /** + * @param {number} idx + * @param {boolean} [notDefaultIdx=false] + * @return {string} + */ + listProto.getName = function (idx) { + return this._nameList[this.indices[idx]] || ''; + }; + + /** + * @param {number} idx + * @param {boolean} [notDefaultIdx=false] + * @return {string} + */ + listProto.getId = function (idx) { + return this._idList[this.indices[idx]] || (this.getRawIndex(idx) + ''); + }; + + + function normalizeDimensions(dimensions) { + if (!zrUtil.isArray(dimensions)) { + dimensions = [dimensions]; + } + return dimensions; + } + + /** + * Data iteration + * @param {string|Array.} + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * + * @example + * list.each('x', function (x, idx) {}); + * list.each(['x', 'y'], function (x, y, idx) {}); + * list.each(function (idx) {}) + */ + listProto.each = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var value = []; + var dimSize = dimensions.length; + var indices = this.indices; + + context = context || this; + + for (var i = 0; i < indices.length; i++) { + if (dimSize === 0) { + cb.call(context, i); + } + // Simple optimization + else if (dimSize === 1) { + cb.call(context, this.get(dimensions[0], i, stack), i); + } + else { + for (var k = 0; k < dimSize; k++) { + value[k] = this.get(dimensions[k], i, stack); + } + // Index + value[k] = i; + cb.apply(context, value); + } + } + }; + + /** + * Data filter + * @param {string|Array.} + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + */ + listProto.filterSelf = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var newIndices = []; + var value = []; + var dimSize = dimensions.length; + var indices = this.indices; + + context = context || this; + + for (var i = 0; i < indices.length; i++) { + var keep; + // Simple optimization + if (dimSize === 1) { + keep = cb.call( + context, this.get(dimensions[0], i, stack), i + ); + } + else { + for (var k = 0; k < dimSize; k++) { + value[k] = this.get(dimensions[k], i, stack); + } + value[k] = i; + keep = cb.apply(context, value); + } + if (keep) { + newIndices.push(indices[i]); + } + } + + this.indices = newIndices; + + // Reset data extent + this._extent = {}; + + return this; + }; + + /** + * Data mapping to a plain array + * @param {string|Array.} [dimensions] + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * @return {Array} + */ + listProto.mapArray = function (dimensions, cb, stack, context) { + if (typeof dimensions === 'function') { + context = stack; + stack = cb; + cb = dimensions; + dimensions = []; + } + + var result = []; + this.each(dimensions, function () { + result.push(cb && cb.apply(this, arguments)); + }, stack, context); + return result; + }; + + function cloneListForMapAndSample(original, excludeDimensions) { + var allDimensions = original.dimensions; + var list = new List( + zrUtil.map(allDimensions, original.getDimensionInfo, original), + original.hostModel + ); + // FIXME If needs stackedOn, value may already been stacked + transferImmuProperties(list, original, original._wrappedMethods); + + var storage = list._storage = {}; + var originalStorage = original._storage; + // Init storage + for (var i = 0; i < allDimensions.length; i++) { + var dim = allDimensions[i]; + var dimStore = originalStorage[dim]; + if (zrUtil.indexOf(excludeDimensions, dim) >= 0) { + storage[dim] = new dimStore.constructor( + originalStorage[dim].length + ); + } + else { + // Direct reference for other dimensions + storage[dim] = originalStorage[dim]; + } + } + return list; + } + + /** + * Data mapping to a new List with given dimensions + * @param {string|Array.} dimensions + * @param {Function} cb + * @param {boolean} [stack=false] + * @param {*} [context=this] + * @return {Array} + */ + listProto.map = function (dimensions, cb, stack, context) { + dimensions = zrUtil.map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + var list = cloneListForMapAndSample(this, dimensions); + // Following properties are all immutable. + // So we can reference to the same value + var indices = list.indices = this.indices; + + var storage = list._storage; + + var tmpRetValue = []; + this.each(dimensions, function () { + var idx = arguments[arguments.length - 1]; + var retValue = cb && cb.apply(this, arguments); + if (retValue != null) { + // a number + if (typeof retValue === 'number') { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + for (var i = 0; i < retValue.length; i++) { + var dim = dimensions[i]; + var dimStore = storage[dim]; + var rawIdx = indices[idx]; + if (dimStore) { + dimStore[rawIdx] = retValue[i]; + } + } + } + }, stack, context); + + return list; + }; + + /** + * Large data down sampling on given dimension + * @param {string} dimension + * @param {number} rate + * @param {Function} sampleValue + * @param {Function} sampleIndex Sample index for name and id + */ + listProto.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this, [dimension]); + var storage = this._storage; + var targetStorage = list._storage; + + var originalIndices = this.indices; + var indices = list.indices = []; + + var frameValues = []; + var frameIndices = []; + var frameSize = Math.floor(1 / rate); + + var dimStore = targetStorage[dimension]; + var len = this.count(); + // Copy data from original data + for (var i = 0; i < storage[dimension].length; i++) { + targetStorage[dimension][i] = storage[dimension][i]; + } + for (var i = 0; i < len; i += frameSize) { + // Last frame + if (frameSize > len - i) { + frameSize = len - i; + frameValues.length = frameSize; + } + for (var k = 0; k < frameSize; k++) { + var idx = originalIndices[i + k]; + frameValues[k] = dimStore[idx]; + frameIndices[k] = idx; + } + var value = sampleValue(frameValues); + var idx = frameIndices[sampleIndex(frameValues, value) || 0]; + // Only write value on the filtered data + dimStore[idx] = value; + indices.push(idx); + } + return list; + }; + + /** + * Get model of one data item. + * + * @param {number} idx + */ + // FIXME Model proxy ? + listProto.getItemModel = function (idx) { + var hostModel = this.hostModel; + idx = this.indices[idx]; + return new Model(this._rawData[idx], hostModel, hostModel.ecModel); + }; + + /** + * Create a data differ + * @param {module:echarts/data/List} otherList + * @return {module:echarts/data/DataDiffer} + */ + listProto.diff = function (otherList) { + var idList = this._idList; + var otherIdList = otherList && otherList._idList; + return new DataDiffer( + otherList ? otherList.indices : [], this.indices, function (idx) { + return otherIdList[idx] || (idx + ''); + }, function (idx) { + return idList[idx] || (idx + ''); + } + ); + }; + /** + * Get visual property. + * @param {string} key + */ + listProto.getVisual = function (key) { + var visual = this._visual; + return visual && visual[key]; + }; + + /** + * Set visual property + * @param {string|Object} key + * @param {*} [value] + * + * @example + * setVisual('color', color); + * setVisual({ + * 'color': color + * }); + */ + listProto.setVisual = function (key, val) { + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.setVisual(name, key[name]); + } + } + return; + } + this._visual = this._visual || {}; + this._visual[key] = val; + }; + + /** + * Set layout property. + * @param {string} key + * @param {*} [val] + */ + listProto.setLayout = function (key, val) { + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.setLayout(name, key[name]); + } + } + return; + } + this._layout[key] = val; + }; + + /** + * Get layout property. + * @param {string} key. + * @return {*} + */ + listProto.getLayout = function (key) { + return this._layout[key]; + }; + + /** + * Get layout of single data item + * @param {number} idx + */ + listProto.getItemLayout = function (idx) { + return this._itemLayouts[idx]; + }, + + /** + * Set layout of single data item + * @param {number} idx + * @param {Object} layout + * @param {boolean=} [merge=false] + */ + listProto.setItemLayout = function (idx, layout, merge) { + this._itemLayouts[idx] = merge + ? zrUtil.extend(this._itemLayouts[idx] || {}, layout) + : layout; + }, + + /** + * Get visual property of single data item + * @param {number} idx + * @param {string} key + * @param {boolean} ignoreParent + */ + listProto.getItemVisual = function (idx, key, ignoreParent) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + if (val == null && !ignoreParent) { + // Use global visual property + return this.getVisual(key); + } + return val; + }, + + /** + * Set visual property of single data item + * + * @param {number} idx + * @param {string|Object} key + * @param {*} [value] + * + * @example + * setItemVisual(0, 'color', color); + * setItemVisual(0, { + * 'color': color + * }); + */ + listProto.setItemVisual = function (idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + this._itemVisuals[idx] = itemVisual; + + if (isObject(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + itemVisual[name] = key[name]; + } + } + return; + } + itemVisual[key] = value; + }; + + var setItemDataAndSeriesIndex = function (child) { + child.seriesIndex = this.seriesIndex; + child.dataIndex = this.dataIndex; + }; + /** + * Set graphic element relative to data. It can be set as null + * @param {number} idx + * @param {module:zrender/Element} [el] + */ + listProto.setItemGraphicEl = function (idx, el) { + var hostModel = this.hostModel; + + if (el) { + // Add data index and series index for indexing the data by element + // Useful in tooltip + el.dataIndex = idx; + el.seriesIndex = hostModel && hostModel.seriesIndex; + if (el.type === 'group') { + el.traverse(setItemDataAndSeriesIndex, el); + } + } + + this._graphicEls[idx] = el; + }; + + /** + * @param {number} idx + * @return {module:zrender/Element} + */ + listProto.getItemGraphicEl = function (idx) { + return this._graphicEls[idx]; + }; + + /** + * @param {Function} cb + * @param {*} context + */ + listProto.eachItemGraphicEl = function (cb, context) { + zrUtil.each(this._graphicEls, function (el, idx) { + if (el) { + cb && cb.call(context, el, idx); + } + }); + }; + + /** + * Shallow clone a new list except visual and layout properties, and graph elements. + * New list only change the indices. + */ + listProto.cloneShallow = function () { + var dimensionInfoList = zrUtil.map(this.dimensions, this.getDimensionInfo, this); + var list = new List(dimensionInfoList, this.hostModel); + + // FIXME + list._storage = this._storage; + + transferImmuProperties(list, this, this._wrappedMethods); + + list.indices = this.indices.slice(); + + return list; + }; + + /** + * Wrap some method to add more feature + * @param {string} methodName + * @param {Function} injectFunction + */ + listProto.wrapMethod = function (methodName, injectFunction) { + var originalMethod = this[methodName]; + if (typeof originalMethod !== 'function') { + return; + } + this._wrappedMethods = this._wrappedMethods || []; + this._wrappedMethods.push(methodName); + this[methodName] = function () { + var res = originalMethod.apply(this, arguments); + return injectFunction.call(this, res); + }; + }; + + module.exports = List; + + /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) + +/***/ }, +/* 95 */ +/***/ function(module, exports) { + + 'use strict'; + + + function defaultKeyGetter(item) { + return item; + } + + function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter) { + this._old = oldArr; + this._new = newArr; + + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; + } + + DataDiffer.prototype = { + + constructor: DataDiffer, + + /** + * Callback function when add a data + */ + add: function (func) { + this._add = func; + return this; + }, + + /** + * Callback function when update a data + */ + update: function (func) { + this._update = func; + return this; + }, + + /** + * Callback function when remove a data + */ + remove: function (func) { + this._remove = func; + return this; + }, + + execute: function () { + var oldArr = this._old; + var newArr = this._new; + var oldKeyGetter = this._oldKeyGetter; + var newKeyGetter = this._newKeyGetter; + + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var i; + + initIndexMap(oldArr, oldDataIndexMap, oldKeyGetter); + initIndexMap(newArr, newDataIndexMap, newKeyGetter); + + // Travel by inverted order to make sure order consistency + // when duplicate keys exists (consider newDataIndex.pop() below). + // For performance consideration, these code below do not look neat. + for (i = 0; i < oldArr.length; i++) { + var key = oldKeyGetter(oldArr[i]); + var idx = newDataIndexMap[key]; + + // idx can never be empty array here. see 'set null' logic below. + if (idx != null) { + // Consider there is duplicate key (for example, use dataItem.name as key). + // We should make sure every item in newArr and oldArr can be visited. + var len = idx.length; + if (len) { + len === 1 && (newDataIndexMap[key] = null); + idx = idx.unshift(); + } + else { + newDataIndexMap[key] = null; + } + this._update && this._update(idx, i); + } + else { + this._remove && this._remove(i); + } + } + + for (var key in newDataIndexMap) { + if (newDataIndexMap.hasOwnProperty(key)) { + var idx = newDataIndexMap[key]; + if (idx == null) { + continue; + } + // idx can never be empty array here. see 'set null' logic above. + if (!idx.length) { + this._add && this._add(idx); + } + else { + for (var i = 0, len = idx.length; i < len; i++) { + this._add && this._add(idx[i]); + } + } + } + } + } + }; + + function initIndexMap(arr, map, keyGetter) { + for (var i = 0; i < arr.length; i++) { + var key = keyGetter(arr[i]); + var existence = map[key]; + if (existence == null) { + map[key] = i; + } + else { + if (!existence.length) { + map[key] = existence = [existence]; + } + existence.push(i); + } + } + } + + module.exports = DataDiffer; + + +/***/ }, +/* 96 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Complete dimensions by data (guess dimension). + */ + + + var zrUtil = __webpack_require__(3); + + /** + * Complete the dimensions array guessed from the data structure. + * @param {Array.} dimensions Necessary dimensions, like ['x', 'y'] + * @param {Array} data Data list. [[1, 2, 3], [2, 3, 4]] + * @param {Array.} defaultNames Default names to fill not necessary dimensions, like ['value'] + * @param {string} extraPrefix Prefix of name when filling the left dimensions. + * @return {Array.} + */ + function completeDimensions(dimensions, data, defaultNames, extraPrefix) { + if (!data) { + return dimensions; + } + + var value0 = retrieveValue(data[0]); + var dimSize = zrUtil.isArray(value0) && value0.length || 1; + + defaultNames = defaultNames || []; + extraPrefix = extraPrefix || 'extra'; + for (var i = 0; i < dimSize; i++) { + if (!dimensions[i]) { + var name = defaultNames[i] || (extraPrefix + (i - defaultNames.length)); + dimensions[i] = guessOrdinal(data, i) + ? {type: 'ordinal', name: name} + : name; + } + } + + return dimensions; + } + + // The rule should not be complex, otherwise user might not + // be able to known where the data is wrong. + function guessOrdinal(data, dimIndex) { + for (var i = 0, len = data.length; i < len; i++) { + var value = retrieveValue(data[i]); + + if (!zrUtil.isArray(value)) { + return false; + } + + var value = value[dimIndex]; + if (value != null && isFinite(value)) { + return false; + } + else if (zrUtil.isString(value) && value !== '-') { + return true; + } + } + return false; + } + + function retrieveValue(o) { + return zrUtil.isArray(o) ? o : zrUtil.isObject(o) ? o.value: o; + } + + module.exports = completeDimensions; + + + +/***/ }, +/* 97 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var SymbolDraw = __webpack_require__(98); + var Symbol = __webpack_require__(99); + var lineAnimationDiff = __webpack_require__(101); + var graphic = __webpack_require__(42); + + var polyHelper = __webpack_require__(102); + + var ChartView = __webpack_require__(41); + + function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + for (var i = 0; i < points1.length; i++) { + var p1 = points1[i]; + var p2 = points2[i]; + if (p1[0] !== p2[0] || p1[1] !== p2[1]) { + return; + } + } + return true; + } + + function getSmooth(smooth) { + return typeof (smooth) === 'number' ? smooth : (smooth ? 0.3 : 0); + } + + function getAxisExtentWithGap(axis) { + var extent = axis.getGlobalExtent(); + if (axis.onBand) { + // Remove extra 1px to avoid line miter in clipped edge + var halfBandWidth = axis.getBandWidth() / 2 - 1; + var dir = extent[1] > extent[0] ? 1 : -1; + extent[0] += dir * halfBandWidth; + extent[1] -= dir * halfBandWidth; + } + return extent; + } + + function sign(val) { + return val >= 0 ? 1 : -1; + } + /** + * @param {module:echarts/coord/cartesian/Cartesian2D|module:echarts/coord/polar/Polar} coordSys + * @param {module:echarts/data/List} data + * @param {Array.>} points + * @private + */ + function getStackedOnPoints(coordSys, data) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = baseAxis.onZero + ? 0 : valueAxis.scale.getExtent()[0]; + + var valueDim = valueAxis.dim; + + var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0; + + return data.mapArray([valueDim], function (val, idx) { + var stackedOnSameSign; + var stackedOn = data.stackedOn; + // Find first stacked value with same sign + while (stackedOn && + sign(stackedOn.get(valueDim, idx)) === sign(val) + ) { + stackedOnSameSign = stackedOn; + break; + } + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseAxis.dim, idx); + stackedData[1 - baseDataOffset] = stackedOnSameSign + ? stackedOnSameSign.get(valueDim, idx, true) : valueStart; + + return coordSys.dataToPoint(stackedData); + }, true); + } + + function queryDataIndex(data, payload) { + if (payload.dataIndex != null) { + return payload.dataIndex; + } + else if (payload.name != null) { + return data.indexOfName(payload.name); + } + } + + function createGridClipShape(cartesian, hasAnimation, seriesModel) { + var xExtent = getAxisExtentWithGap(cartesian.getAxis('x')); + var yExtent = getAxisExtentWithGap(cartesian.getAxis('y')); + var isHorizontal = cartesian.getBaseAxis().isHorizontal(); + + var x = xExtent[0]; + var y = yExtent[0]; + var width = xExtent[1] - x; + var height = yExtent[1] - y; + // Expand clip shape to avoid line value exceeds axis + if (!seriesModel.get('clipOverflow')) { + if (isHorizontal) { + y -= height; + height *= 3; + } + else { + x -= width; + width *= 3; + } + } + var clipPath = new graphic.Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + + if (hasAnimation) { + clipPath.shape[isHorizontal ? 'width' : 'height'] = 0; + graphic.initProps(clipPath, { + shape: { + width: width, + height: height + } + }, seriesModel); + } + + return clipPath; + } + + function createPolarClipShape(polar, hasAnimation, seriesModel) { + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); + + var radiusExtent = radiusAxis.getExtent(); + var angleExtent = angleAxis.getExtent(); + + var RADIAN = Math.PI / 180; + + var clipPath = new graphic.Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: radiusExtent[0], + r: radiusExtent[1], + startAngle: -angleExtent[0] * RADIAN, + endAngle: -angleExtent[1] * RADIAN, + clockwise: angleAxis.inverse + } + }); + + if (hasAnimation) { + clipPath.shape.endAngle = -angleExtent[0] * RADIAN; + graphic.initProps(clipPath, { + shape: { + endAngle: -angleExtent[1] * RADIAN + } + }, seriesModel); + } + + return clipPath; + } + + function createClipShape(coordSys, hasAnimation, seriesModel) { + return coordSys.type === 'polar' + ? createPolarClipShape(coordSys, hasAnimation, seriesModel) + : createGridClipShape(coordSys, hasAnimation, seriesModel); + } + + module.exports = ChartView.extend({ + + type: 'line', + + init: function () { + var lineGroup = new graphic.Group(); + + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + }, + + render: function (seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel('lineStyle.normal'); + var areaStyleModel = seriesModel.getModel('areaStyle.normal'); + + var points = data.mapArray(data.getItemLayout, true); + + var isCoordSysPolar = coordSys.type === 'polar'; + var prevCoordSys = this._coordSys; + + var symbolDraw = this._symbolDraw; + var polyline = this._polyline; + var polygon = this._polygon; + + var lineGroup = this._lineGroup; + + var hasAnimation = seriesModel.get('animation'); + + var isAreaChart = !areaStyleModel.isEmpty(); + var stackedOnPoints = getStackedOnPoints(coordSys, data); + + var showSymbol = seriesModel.get('showSymbol'); + + var isSymbolIgnore = showSymbol && !isCoordSysPolar && !seriesModel.get('showAllSymbol') + && this._getSymbolIgnoreFunc(data, coordSys); + + // Remove temporary symbols + var oldData = this._data; + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + + // Remove previous created symbols if showSymbol changed to false + if (!showSymbol) { + symbolDraw.remove(); + } + + group.add(lineGroup); + + // Initialization animation or coordinate system changed + if ( + !(polyline && prevCoordSys.type === coordSys.type) + ) { + showSymbol && symbolDraw.updateData(data, isSymbolIgnore); + + polyline = this._newPolyline(points, coordSys, hasAnimation); + if (isAreaChart) { + polygon = this._newPolygon( + points, stackedOnPoints, + coordSys, hasAnimation + ); + } + lineGroup.setClipPath(createClipShape(coordSys, true, seriesModel)); + } + else { + if (isAreaChart && !polygon) { + // If areaStyle is added + polygon = this._newPolygon( + points, stackedOnPoints, + coordSys, hasAnimation + ); + } + else if (polygon && !isAreaChart) { + // If areaStyle is removed + lineGroup.remove(polygon); + polygon = this._polygon = null; + } + + // Update clipPath + lineGroup.setClipPath(createClipShape(coordSys, false, seriesModel)); + + // Always update, or it is wrong in the case turning on legend + // because points are not changed + showSymbol && symbolDraw.updateData(data, isSymbolIgnore); + + // Stop symbol animation and sync with line points + // FIXME performance? + data.eachItemGraphicEl(function (el) { + el.stopAnimation(true); + }); + + // In the case data zoom triggerred refreshing frequently + // Data may not change if line has a category axis. So it should animate nothing + if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) + || !isPointsSame(this._points, points) + ) { + if (hasAnimation) { + this._updateAnimation( + data, stackedOnPoints, coordSys, api + ); + } + else { + polyline.setShape({ + points: points + }); + polygon && polygon.setShape({ + points: points, + stackedOnPoints: stackedOnPoints + }); + } + } + } + + polyline.setStyle(zrUtil.defaults( + // Use color in lineStyle first + lineStyleModel.getLineStyle(), + { + stroke: data.getVisual('color'), + lineJoin: 'bevel' + } + )); + + var smooth = seriesModel.get('smooth'); + smooth = getSmooth(seriesModel.get('smooth')); + polyline.setShape({ + smooth: smooth, + smoothMonotone: seriesModel.get('smoothMonotone') + }); + + if (polygon) { + var stackedOn = data.stackedOn; + var stackedOnSmooth = 0; + + polygon.style.opacity = 0.7; + polygon.setStyle(zrUtil.defaults( + areaStyleModel.getAreaStyle(), + { + fill: data.getVisual('color'), + lineJoin: 'bevel' + } + )); + + if (stackedOn) { + var stackedOnSeries = stackedOn.hostModel; + stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth')); + } + + polygon.setShape({ + smooth: smooth, + stackedOnSmooth: stackedOnSmooth, + smoothMonotone: seriesModel.get('smoothMonotone') + }); + } + + this._data = data; + // Save the coordinate system for transition animation when data changed + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + }, + + highlight: function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (!symbol) { + // Create a temporary symbol if it is not exists + var pt = data.getItemLayout(dataIndex); + symbol = new Symbol(data, dataIndex, api); + symbol.position = pt; + symbol.setZ( + seriesModel.get('zlevel'), + seriesModel.get('z') + ); + symbol.ignore = isNaN(pt[0]) || isNaN(pt[1]); + symbol.__temp = true; + data.setItemGraphicEl(dataIndex, symbol); + + // Stop scale animation + symbol.stopSymbolAnimation(true); + + this.group.add(symbol); + } + symbol.highlight(); + } + else { + // Highlight whole series + ChartView.prototype.highlight.call( + this, seriesModel, ecModel, api, payload + ); + } + }, + + downplay: function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (symbol) { + if (symbol.__temp) { + data.setItemGraphicEl(dataIndex, null); + this.group.remove(symbol); + } + else { + symbol.downplay(); + } + } + } + else { + // Downplay whole series + ChartView.prototype.downplay.call( + this, seriesModel, ecModel, api, payload + ); + } + }, + + /** + * @param {module:zrender/container/Group} group + * @param {Array.>} points + * @private + */ + _newPolyline: function (points) { + var polyline = this._polyline; + // Remove previous created polyline + if (polyline) { + this._lineGroup.remove(polyline); + } + + polyline = new polyHelper.Polyline({ + shape: { + points: points + }, + silent: true, + z2: 10 + }); + + this._lineGroup.add(polyline); + + this._polyline = polyline; + + return polyline; + }, + + /** + * @param {module:zrender/container/Group} group + * @param {Array.>} stackedOnPoints + * @param {Array.>} points + * @private + */ + _newPolygon: function (points, stackedOnPoints) { + var polygon = this._polygon; + // Remove previous created polygon + if (polygon) { + this._lineGroup.remove(polygon); + } + + polygon = new polyHelper.Polygon({ + shape: { + points: points, + stackedOnPoints: stackedOnPoints + }, + silent: true + }); + + this._lineGroup.add(polygon); + + this._polygon = polygon; + return polygon; + }, + /** + * @private + */ + _getSymbolIgnoreFunc: function (data, coordSys) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + // `getLabelInterval` is provided by echarts/component/axis + if (categoryAxis && categoryAxis.isLabelIgnored) { + return zrUtil.bind(categoryAxis.isLabelIgnored, categoryAxis); + } + }, + + /** + * @private + */ + // FIXME Two value axis + _updateAnimation: function (data, stackedOnPoints, coordSys, api) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + + var diff = lineAnimationDiff( + this._data, data, + this._stackedOnPoints, stackedOnPoints, + this._coordSys, coordSys + ); + polyline.shape.points = diff.current; + + graphic.updateProps(polyline, { + shape: { + points: diff.next + } + }, seriesModel); + + if (polygon) { + polygon.setShape({ + points: diff.current, + stackedOnPoints: diff.stackedOnCurrent + }); + graphic.updateProps(polygon, { + shape: { + points: diff.next, + stackedOnPoints: diff.stackedOnNext + } + }, seriesModel); + } + + var updatedDataInfo = []; + var diffStatus = diff.status; + + for (var i = 0; i < diffStatus.length; i++) { + var cmd = diffStatus[i].cmd; + if (cmd === '=') { + var el = data.getItemGraphicEl(diffStatus[i].idx1); + if (el) { + updatedDataInfo.push({ + el: el, + ptIdx: i // Index of points + }); + } + } + } + + if (polyline.animators && polyline.animators.length) { + polyline.animators[0].during(function () { + for (var i = 0; i < updatedDataInfo.length; i++) { + var el = updatedDataInfo[i].el; + el.attr('position', polyline.shape.points[updatedDataInfo[i].ptIdx]); + } + }); + } + }, + + remove: function (ecModel) { + var group = this.group; + var oldData = this._data; + this._lineGroup.removeAll(); + this._symbolDraw.remove(true); + // Remove temporary created elements when highlighting + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + + this._polyline = + this._polygon = + this._coordSys = + this._points = + this._stackedOnPoints = + this._data = null; + } + }); + + +/***/ }, +/* 98 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/SymbolDraw + */ + + + var graphic = __webpack_require__(42); + var Symbol = __webpack_require__(99); + + /** + * @constructor + * @alias module:echarts/chart/helper/SymbolDraw + * @param {module:zrender/graphic/Group} [symbolCtor] + */ + function SymbolDraw(symbolCtor) { + this.group = new graphic.Group(); + + this._symbolCtor = symbolCtor || Symbol; + } + + var symbolDrawProto = SymbolDraw.prototype; + + function symbolNeedsDraw(data, idx, isIgnore) { + var point = data.getItemLayout(idx); + return point && !isNaN(point[0]) && !isNaN(point[1]) && !(isIgnore && isIgnore(idx)) + && data.getItemVisual(idx, 'symbol') !== 'none'; + } + /** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + * @param {Array.} [isIgnore] + */ + symbolDrawProto.updateData = function (data, isIgnore) { + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + + var SymbolCtor = this._symbolCtor; + + data.diff(oldData) + .add(function (newIdx) { + var point = data.getItemLayout(newIdx); + if (symbolNeedsDraw(data, newIdx, isIgnore)) { + var symbolEl = new SymbolCtor(data, newIdx); + symbolEl.attr('position', point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }) + .update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = data.getItemLayout(newIdx); + if (!symbolNeedsDraw(data, newIdx, isIgnore)) { + group.remove(symbolEl); + return; + } + if (!symbolEl) { + symbolEl = new SymbolCtor(data, newIdx); + symbolEl.attr('position', point); + } + else { + symbolEl.updateData(data, newIdx); + graphic.updateProps(symbolEl, { + position: point + }, seriesModel); + } + + // Add back + group.add(symbolEl); + + data.setItemGraphicEl(newIdx, symbolEl); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && el.fadeOut(function () { + group.remove(el); + }); + }) + .execute(); + + this._data = data; + }; + + symbolDrawProto.updateLayout = function () { + var data = this._data; + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + el.attr('position', data.getItemLayout(idx)); + }); + } + }; + + symbolDrawProto.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; + if (data) { + if (enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }); + }); + } + else { + group.removeAll(); + } + } + }; + + module.exports = SymbolDraw; + + +/***/ }, +/* 99 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * @module echarts/chart/helper/Symbol + */ + + + var zrUtil = __webpack_require__(3); + var symbolUtil = __webpack_require__(100); + var graphic = __webpack_require__(42); + var numberUtil = __webpack_require__(7); + + function normalizeSymbolSize(symbolSize) { + if (!zrUtil.isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + return symbolSize; + } + + /** + * @constructor + * @alias {module:echarts/chart/helper/Symbol} + * @param {module:echarts/data/List} data + * @param {number} idx + * @extends {module:zrender/graphic/Group} + */ + function Symbol(data, idx) { + graphic.Group.call(this); + + this.updateData(data, idx); + } + + var symbolProto = Symbol.prototype; + + function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); + } + + symbolProto._createSymbol = function (symbolType, data, idx) { + // Remove paths created before + this.removeAll(); + + var seriesModel = data.hostModel; + var color = data.getItemVisual(idx, 'color'); + + var symbolPath = symbolUtil.createSymbol( + symbolType, -0.5, -0.5, 1, 1, color + ); + + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + culling: true, + scale: [0, 0] + }); + // Rewrite drift method + symbolPath.drift = driftSymbol; + + var size = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + + graphic.initProps(symbolPath, { + scale: size + }, seriesModel); + + this._symbolType = symbolType; + + this.add(symbolPath); + }; + + /** + * Stop animation + * @param {boolean} toLastFrame + */ + symbolProto.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(toLastFrame); + }; + + /** + * Get scale(aka, current symbol size). + * Including the change caused by animation + * @param {Array.} toLastFrame + */ + symbolProto.getScale = function () { + return this.childAt(0).scale; + }; + + /** + * Highlight symbol + */ + symbolProto.highlight = function () { + this.childAt(0).trigger('emphasis'); + }; + + /** + * Downplay symbol + */ + symbolProto.downplay = function () { + this.childAt(0).trigger('normal'); + }; + + /** + * @param {number} zlevel + * @param {number} z + */ + symbolProto.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; + }; + + symbolProto.setDraggable = function (draggable) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = draggable ? 'move' : 'pointer'; + }; + /** + * Update symbol properties + * @param {module:echarts/data/List} data + * @param {number} idx + */ + symbolProto.updateData = function (data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + if (symbolType !== this._symbolType) { + this._createSymbol(symbolType, data, idx); + } + else { + var symbolPath = this.childAt(0); + graphic.updateProps(symbolPath, { + scale: symbolSize + }, seriesModel); + } + this._updateCommon(data, idx, symbolSize); + + this._seriesModel = seriesModel; + }; + + // Update common properties + var normalStyleAccessPath = ['itemStyle', 'normal']; + var emphasisStyleAccessPath = ['itemStyle', 'emphasis']; + var normalLabelAccessPath = ['label', 'normal']; + var emphasisLabelAccessPath = ['label', 'emphasis']; + + symbolProto._updateCommon = function (data, idx, symbolSize) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var normalItemStyleModel = itemModel.getModel(normalStyleAccessPath); + var color = data.getItemVisual(idx, 'color'); + + var hoverStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle(); + + symbolPath.rotation = itemModel.getShallow('symbolRotate') * Math.PI / 180 || 0; + + var symbolOffset = itemModel.getShallow('symbolOffset'); + if (symbolOffset) { + var pos = symbolPath.position; + pos[0] = numberUtil.parsePercent(symbolOffset[0], symbolSize[0]); + pos[1] = numberUtil.parsePercent(symbolOffset[1], symbolSize[1]); + } + + symbolPath.setColor(color); + + zrUtil.extend( + symbolPath.style, + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + normalItemStyleModel.getItemStyle(['color']) + ); + + var labelModel = itemModel.getModel(normalLabelAccessPath); + var hoverLabelModel = itemModel.getModel(emphasisLabelAccessPath); + + var elStyle = symbolPath.style; + + // Get last value dim + var dimensions = data.dimensions.slice(); + var valueDim = dimensions.pop(); + var dataType; + while ( + ((dataType = data.getDimensionInfo(valueDim).type) === 'ordinal') + || (dataType === 'time') + ) { + valueDim = dimensions.pop(); + } + + if (labelModel.get('show')) { + graphic.setText(elStyle, labelModel, color); + elStyle.text = zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'normal'), + data.get(valueDim, idx) + ); + } + else { + elStyle.text = ''; + } + + if (hoverLabelModel.getShallow('show')) { + graphic.setText(hoverStyle, hoverLabelModel, color); + hoverStyle.text = zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'emphasis'), + data.get(valueDim, idx) + ); + } + else { + hoverStyle.text = ''; + } + + var size = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize')); + + symbolPath.off('mouseover') + .off('mouseout') + .off('emphasis') + .off('normal'); + + graphic.setHoverStyle(symbolPath, hoverStyle); + + if (itemModel.getShallow('hoverAnimation')) { + var onEmphasis = function() { + var ratio = size[1] / size[0]; + this.animateTo({ + scale: [ + Math.max(size[0] * 1.1, size[0] + 3), + Math.max(size[1] * 1.1, size[1] + 3 * ratio) + ] + }, 400, 'elasticOut'); + }; + var onNormal = function() { + this.animateTo({ + scale: size + }, 400, 'elasticOut'); + }; + symbolPath.on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + } + }; + + symbolProto.fadeOut = function (cb) { + var symbolPath = this.childAt(0); + // Not show text when animating + symbolPath.style.text = ''; + graphic.updateProps(symbolPath, { + scale: [0, 0] + }, this._seriesModel, cb); + }; + + zrUtil.inherits(Symbol, graphic.Group); + + module.exports = Symbol; + + +/***/ }, +/* 100 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Symbol factory + + + var graphic = __webpack_require__(42); + var BoundingRect = __webpack_require__(15); + + /** + * Triangle shape + * @inner + */ + var Triangle = graphic.extendShape({ + type: 'triangle', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy + height); + path.lineTo(cx - width, cy + height); + path.closePath(); + } + }); + /** + * Diamond shape + * @inner + */ + var Diamond = graphic.extendShape({ + type: 'diamond', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy); + path.lineTo(cx, cy + height); + path.lineTo(cx - width, cy); + path.closePath(); + } + }); + + /** + * Pin shape + * @inner + */ + var Pin = graphic.extendShape({ + type: 'pin', + shape: { + // x, y on the cusp + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (path, shape) { + var x = shape.x; + var y = shape.y; + var w = shape.width / 5 * 3; + // Height must be larger than width + var h = Math.max(w, shape.height); + var r = w / 2; + + // Dist on y with tangent point and circle center + var dy = r * r / (h - r); + var cy = y - h + r + dy; + var angle = Math.asin(dy / r); + // Dist on x with tangent point and circle center + var dx = Math.cos(angle) * r; + + var tanX = Math.sin(angle); + var tanY = Math.cos(angle); + + path.arc( + x, cy, r, + Math.PI - angle, + Math.PI * 2 + angle + ); + + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + path.bezierCurveTo( + x + dx - tanX * cpLen, cy + dy + tanY * cpLen, + x, y - cpLen2, + x, y + ); + path.bezierCurveTo( + x, y - cpLen2, + x - dx + tanX * cpLen, cy + dy + tanY * cpLen, + x - dx, cy + dy + ); + path.closePath(); + } + }); + + /** + * Arrow shape + * @inner + */ + var Arrow = graphic.extendShape({ + + type: 'arrow', + + shape: { + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (ctx, shape) { + var height = shape.height; + var width = shape.width; + var x = shape.x; + var y = shape.y; + var dx = width / 3 * 2; + ctx.moveTo(x, y); + ctx.lineTo(x + dx, y + height); + ctx.lineTo(x, y + height / 4 * 3); + ctx.lineTo(x - dx, y + height); + ctx.lineTo(x, y); + ctx.closePath(); + } + }); + + /** + * Map of path contructors + * @type {Object.} + */ + var symbolCtors = { + line: graphic.Line, + + rect: graphic.Rect, + + roundRect: graphic.Rect, + + square: graphic.Rect, + + circle: graphic.Circle, + + diamond: Diamond, + + pin: Pin, + + arrow: Arrow, + + triangle: Triangle + }; + + var symbolShapeMakers = { + + line: function (x, y, w, h, shape) { + // FIXME + shape.x1 = x; + shape.y1 = y + h / 2; + shape.x2 = x + w; + shape.y2 = y + h / 2; + }, + + rect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + }, + + roundRect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + shape.r = Math.min(w, h) / 4; + }, + + square: function (x, y, w, h, shape) { + var size = Math.min(w, h); + shape.x = x; + shape.y = y; + shape.width = size; + shape.height = size; + }, + + circle: function (x, y, w, h, shape) { + // Put circle in the center of square + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.r = Math.min(w, h) / 2; + }, + + diamond: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + }, + + pin: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + + arrow: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + + triangle: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + } + }; + + var symbolBuildProxies = {}; + for (var name in symbolCtors) { + symbolBuildProxies[name] = new symbolCtors[name](); + } + + var Symbol = graphic.extendShape({ + + type: 'symbol', + + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + + beforeBrush: function () { + var style = this.style; + var shape = this.shape; + // FIXME + if (shape.symbolType === 'pin' && style.textPosition === 'inside') { + style.textPosition = ['50%', '40%']; + style.textAlign = 'center'; + style.textVerticalAlign = 'middle'; + } + }, + + buildPath: function (ctx, shape) { + var symbolType = shape.symbolType; + var proxySymbol = symbolBuildProxies[symbolType]; + if (shape.symbolType !== 'none') { + if (!proxySymbol) { + // Default rect + symbolType = 'rect'; + proxySymbol = symbolBuildProxies[symbolType]; + } + symbolShapeMakers[symbolType]( + shape.x, shape.y, shape.width, shape.height, proxySymbol.shape + ); + proxySymbol.buildPath(ctx, proxySymbol.shape); + } + } + }); + + // Provide setColor helper method to avoid determine if set the fill or stroke outside + var symbolPathSetColor = function (color) { + if (this.type !== 'image') { + var symbolStyle = this.style; + var symbolShape = this.shape; + if (symbolShape && symbolShape.symbolType === 'line') { + symbolStyle.stroke = color; + } + else if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = '#fff'; + } + else { + // FIXME 判断图形默认是填充还是描边,使用 onlyStroke ? + symbolStyle.fill && (symbolStyle.fill = color); + symbolStyle.stroke && (symbolStyle.stroke = color); + } + this.dirty(); + } + }; + + var symbolUtil = { + /** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + * @param {string} symbolType + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + * @param {string} color + */ + createSymbol: function (symbolType, x, y, w, h, color) { + var isEmpty = symbolType.indexOf('empty') === 0; + if (isEmpty) { + symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); + } + var symbolPath; + + if (symbolType.indexOf('image://') === 0) { + symbolPath = new graphic.Image({ + style: { + image: symbolType.slice(8), + x: x, + y: y, + width: w, + height: h + } + }); + } + else if (symbolType.indexOf('path://') === 0) { + symbolPath = graphic.makePath(symbolType.slice(7), {}, new BoundingRect(x, y, w, h)); + } + else { + symbolPath = new Symbol({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + + symbolPath.__isEmptyBrush = isEmpty; + + symbolPath.setColor = symbolPathSetColor; + + symbolPath.setColor(color); + + return symbolPath; + } + }; + + module.exports = symbolUtil; + + +/***/ }, +/* 101 */ +/***/ function(module, exports) { + + + + // var arrayDiff = require('zrender/lib/core/arrayDiff'); + // 'zrender/core/arrayDiff' has been used before, but it did + // not do well in performance when roam with fixed dataZoom window. + + function sign(val) { + return val >= 0 ? 1 : -1; + } + + function getStackedOnPoint(coordSys, data, idx) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = baseAxis.onZero + ? 0 : valueAxis.scale.getExtent()[0]; + + var valueDim = valueAxis.dim; + var baseDataOffset = valueDim === 'x' || valueDim === 'radius' ? 1 : 0; + + var stackedOnSameSign; + var stackedOn = data.stackedOn; + var val = data.get(valueDim, idx); + // Find first stacked value with same sign + while (stackedOn && + sign(stackedOn.get(valueDim, idx)) === sign(val) + ) { + stackedOnSameSign = stackedOn; + break; + } + var stackedData = []; + stackedData[baseDataOffset] = data.get(baseAxis.dim, idx); + stackedData[1 - baseDataOffset] = stackedOnSameSign + ? stackedOnSameSign.get(valueDim, idx, true) : valueStart; + + return coordSys.dataToPoint(stackedData); + } + + // function convertToIntId(newIdList, oldIdList) { + // // Generate int id instead of string id. + // // Compare string maybe slow in score function of arrDiff + + // // Assume id in idList are all unique + // var idIndicesMap = {}; + // var idx = 0; + // for (var i = 0; i < newIdList.length; i++) { + // idIndicesMap[newIdList[i]] = idx; + // newIdList[i] = idx++; + // } + // for (var i = 0; i < oldIdList.length; i++) { + // var oldId = oldIdList[i]; + // // Same with newIdList + // if (idIndicesMap[oldId]) { + // oldIdList[i] = idIndicesMap[oldId]; + // } + // else { + // oldIdList[i] = idx++; + // } + // } + // } + + function diffData(oldData, newData) { + var diffResult = []; + + newData.diff(oldData) + .add(function (idx) { + diffResult.push({cmd: '+', idx: idx}); + }) + .update(function (newIdx, oldIdx) { + diffResult.push({cmd: '=', idx: oldIdx, idx1: newIdx}); + }) + .remove(function (idx) { + diffResult.push({cmd: '-', idx: idx}); + }) + .execute(); + + return diffResult; + } + + module.exports = function ( + oldData, newData, + oldStackedOnPoints, newStackedOnPoints, + oldCoordSys, newCoordSys + ) { + var diff = diffData(oldData, newData); + + // var newIdList = newData.mapArray(newData.getId); + // var oldIdList = oldData.mapArray(oldData.getId); + + // convertToIntId(newIdList, oldIdList); + + // // FIXME One data ? + // diff = arrayDiff(oldIdList, newIdList); + + var currPoints = []; + var nextPoints = []; + // Points for stacking base line + var currStackedPoints = []; + var nextStackedPoints = []; + + var status = []; + var sortedIndices = []; + var rawIndices = []; + var dims = newCoordSys.dimensions; + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + + // FIXME, animation is not so perfect when dataZoom window moves fast + // Which is in case remvoing or add more than one data in the tail or head + switch (diffItem.cmd) { + case '=': + var currentPt = oldData.getItemLayout(diffItem.idx); + var nextPt = newData.getItemLayout(diffItem.idx1); + // If previous data is NaN, use next point directly + if (isNaN(currentPt[0]) || isNaN(currentPt[1])) { + currentPt = nextPt.slice(); + } + currPoints.push(currentPt); + nextPoints.push(nextPt); + + currStackedPoints.push(oldStackedOnPoints[diffItem.idx]); + nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]); + + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + case '+': + var idx = diffItem.idx; + currPoints.push( + oldCoordSys.dataToPoint([ + newData.get(dims[0], idx, true), newData.get(dims[1], idx, true) + ]) + ); + + nextPoints.push(newData.getItemLayout(idx).slice()); + + currStackedPoints.push( + getStackedOnPoint(oldCoordSys, newData, idx) + ); + nextStackedPoints.push(newStackedOnPoints[idx]); + + rawIndices.push(newData.getRawIndex(idx)); + break; + case '-': + var idx = diffItem.idx; + var rawIndex = oldData.getRawIndex(idx); + // Data is replaced. In the case of dynamic data queue + // FIXME FIXME FIXME + if (rawIndex !== idx) { + currPoints.push(oldData.getItemLayout(idx)); + nextPoints.push(newCoordSys.dataToPoint([ + oldData.get(dims[0], idx, true), oldData.get(dims[1], idx, true) + ])); + + currStackedPoints.push(oldStackedOnPoints[idx]); + nextStackedPoints.push( + getStackedOnPoint( + newCoordSys, oldData, idx + ) + ); + + rawIndices.push(rawIndex); + } + else { + pointAdded = false; + } + } + + // Original indices + if (pointAdded) { + status.push(diffItem); + sortedIndices.push(sortedIndices.length); + } + } + + // Diff result may be crossed if all items are changed + // Sort by data index + sortedIndices.sort(function (a, b) { + return rawIndices[a] - rawIndices[b]; + }); + + var sortedCurrPoints = []; + var sortedNextPoints = []; + + var sortedCurrStackedPoints = []; + var sortedNextStackedPoints = []; + + var sortedStatus = []; + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + sortedCurrPoints[i] = currPoints[idx]; + sortedNextPoints[i] = nextPoints[idx]; + + sortedCurrStackedPoints[i] = currStackedPoints[idx]; + sortedNextStackedPoints[i] = nextStackedPoints[idx]; + + sortedStatus[i] = status[idx]; + } + + return { + current: sortedCurrPoints, + next: sortedNextPoints, + + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + + status: sortedStatus + }; + }; + + +/***/ }, +/* 102 */ +/***/ function(module, exports, __webpack_require__) { + + // Poly path support NaN point + + + var Path = __webpack_require__(44); + var vec2 = __webpack_require__(16); + + var vec2Min = vec2.min; + var vec2Max = vec2.max; + + var scaleAndAdd = vec2.scaleAndAdd; + var v2Copy = vec2.copy; + + // Temporary variable + var v = []; + var cp0 = []; + var cp1 = []; + + function drawSegment( + ctx, points, start, stop, len, + dir, smoothMin, smoothMax, smooth, smoothMonotone + ) { + var idx = start; + for (var k = 0; k < len; k++) { + var p = points[idx]; + if (idx >= stop || idx < 0 || isNaN(p[0]) || isNaN(p[1])) { + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]); + v2Copy(cp0, p); + } + else { + if (smooth > 0) { + var prevIdx = idx - dir; + var nextIdx = idx + dir; + + var ratioNextSeg = 0.5; + var prevP = points[prevIdx]; + var nextP = points[nextIdx]; + // Last point + if ((dir > 0 && (idx === len - 1 || isNaN(nextP[0]) || isNaN(nextP[1]))) + || (dir <= 0 && (idx === 0 || isNaN(nextP[0]) || isNaN(nextP[1]))) + ) { + v2Copy(cp1, p); + } + else { + // If next data is null + if (isNaN(nextP[0]) || isNaN(nextP[1])) { + nextP = p; + } + + vec2.sub(v, nextP, prevP); + + var lenPrevSeg; + var lenNextSeg; + if (smoothMonotone === 'x' || smoothMonotone === 'y') { + var dim = smoothMonotone === 'x' ? 0 : 1; + lenPrevSeg = Math.abs(p[dim] - prevP[dim]); + lenNextSeg = Math.abs(p[dim] - nextP[dim]); + } + else { + lenPrevSeg = vec2.dist(p, prevP); + lenNextSeg = vec2.dist(p, nextP); + } + + // Use ratio of seg length + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + + scaleAndAdd(cp1, p, v, -smooth * (1 - ratioNextSeg)); + } + // Smooth constraint + vec2Min(cp0, cp0, smoothMax); + vec2Max(cp0, cp0, smoothMin); + vec2Min(cp1, cp1, smoothMax); + vec2Max(cp1, cp1, smoothMin); + + ctx.bezierCurveTo( + cp0[0], cp0[1], + cp1[0], cp1[1], + p[0], p[1] + ); + // cp0 of next segment + scaleAndAdd(cp0, p, v, smooth * ratioNextSeg); + } + else { + ctx.lineTo(p[0], p[1]); + } + } + + idx += dir; + } + + return k; + } + + function getBoundingBox(points, smoothConstraint) { + var ptMin = [Infinity, Infinity]; + var ptMax = [-Infinity, -Infinity]; + if (smoothConstraint) { + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + if (pt[0] < ptMin[0]) { ptMin[0] = pt[0]; } + if (pt[1] < ptMin[1]) { ptMin[1] = pt[1]; } + if (pt[0] > ptMax[0]) { ptMax[0] = pt[0]; } + if (pt[1] > ptMax[1]) { ptMax[1] = pt[1]; } + } + } + return { + min: smoothConstraint ? ptMin : ptMax, + max: smoothConstraint ? ptMax : ptMin + }; + } + + module.exports = { + + Polyline: Path.extend({ + + type: 'ec-polyline', + + shape: { + points: [], + + smooth: 0, + + smoothConstraint: true, + + smoothMonotone: null + }, + + style: { + fill: null, + + stroke: '#000' + }, + + buildPath: function (ctx, shape) { + var points = shape.points; + + var i = 0; + var len = points.length; + + var result = getBoundingBox(points, shape.smoothConstraint); + + while (i < len) { + i += drawSegment( + ctx, points, i, len, len, + 1, result.min, result.max, shape.smooth, + shape.smoothMonotone + ) + 1; + } + } + }), + + Polygon: Path.extend({ + + type: 'ec-polygon', + + shape: { + points: [], + + // Offset between stacked base points and points + stackedOnPoints: [], + + smooth: 0, + + stackedOnSmooth: 0, + + smoothConstraint: true, + + smoothMonotone: null + }, + + buildPath: function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + + var i = 0; + var len = points.length; + var smoothMonotone = shape.smoothMonotone; + var bbox = getBoundingBox(points, shape.smoothConstraint); + var stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint); + while (i < len) { + var k = drawSegment( + ctx, points, i, len, len, + 1, bbox.min, bbox.max, shape.smooth, + smoothMonotone + ); + drawSegment( + ctx, stackedOnPoints, i + k - 1, len, k, + -1, stackedOnBBox.min, stackedOnBBox.max, shape.stackedOnSmooth, + smoothMonotone + ); + i += k + 1; + + ctx.closePath(); + } + } + }) + }; + + +/***/ }, +/* 103 */ +/***/ function(module, exports) { + + + + module.exports = function (seriesType, defaultSymbolType, legendSymbol, ecModel, api) { + + // Encoding visual for all series include which is filtered for legend drawing + ecModel.eachRawSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + + var symbolType = seriesModel.get('symbol') || defaultSymbolType; + var symbolSize = seriesModel.get('symbolSize'); + + data.setVisual({ + legendSymbol: legendSymbol || symbolType, + symbol: symbolType, + symbolSize: symbolSize + }); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + if (typeof symbolSize === 'function') { + data.each(function (idx) { + var rawValue = seriesModel.getRawValue(idx); + // FIXME + var params = seriesModel.getDataParams(idx); + data.setItemVisual(idx, 'symbolSize', symbolSize(rawValue, params)); + }); + } + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var itemSymbolType = itemModel.get('symbol', true); + var itemSymbolSize = itemModel.get('symbolSize', true); + // If has item symbol + if (itemSymbolType != null) { + data.setItemVisual(idx, 'symbol', itemSymbolType); + } + if (itemSymbolSize != null) { + // PENDING Transform symbolSize ? + data.setItemVisual(idx, 'symbolSize', itemSymbolSize); + } + }); + } + }); + }; + + +/***/ }, +/* 104 */ +/***/ function(module, exports) { + + + + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + + var dims = coordSys.dimensions; + data.each(dims, function (x, y, idx) { + var point; + if (!isNaN(x) && !isNaN(y)) { + point = coordSys.dataToPoint([x, y]); + } + else { + // Also {Array.}, not undefined to avoid if...else... statement + point = [NaN, NaN]; + } + + data.setItemLayout(idx, point); + }, true); + }); + }; + + +/***/ }, +/* 105 */ +/***/ function(module, exports) { + + + var samplers = { + average: function (frame) { + var sum = 0; + var count = 0; + for (var i = 0; i < frame.length; i++) { + if (!isNaN(frame[i])) { + sum += frame[i]; + count++; + } + } + // Return NaN if count is 0 + return count === 0 ? NaN : sum / count; + }, + sum: function (frame) { + var sum = 0; + for (var i = 0; i < frame.length; i++) { + // Ignore NaN + sum += frame[i] || 0; + } + return sum; + }, + max: function (frame) { + var max = -Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] > max && (max = frame[i]); + } + return max; + }, + min: function (frame) { + var min = Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } + return min; + } + }; + + var indexSampler = function (frame, value) { + return Math.round(frame.length / 2); + }; + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + // Only cartesian2d support down sampling + if (coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + // Coordinste system has been resized + var size = extent[1] - extent[0]; + var rate = Math.round(data.count() / size); + if (rate > 1) { + var sampler; + if (typeof sampling === 'string') { + sampler = samplers[sampling]; + } + else if (typeof sampling === 'function') { + sampler = sampling; + } + if (sampler) { + data = data.downSample( + valueAxis.dim, 1 / rate, sampler, indexSampler + ); + seriesModel.setData(data); + } + } + } + }, this); + }; + + +/***/ }, +/* 106 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + __webpack_require__(107); + + __webpack_require__(124); + + // Grid view + __webpack_require__(1).extendComponentView({ + + type: 'grid', + + render: function (gridModel, ecModel) { + this.group.removeAll(); + if (gridModel.get('show')) { + this.group.add(new graphic.Rect({ + shape:gridModel.coordinateSystem.getRect(), + style: zrUtil.defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true + })); + } + } + }); + + +/***/ }, +/* 107 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Grid is a region which contains at most 4 cartesian systems + * + * TODO Default cartesian + */ + var factory = exports; + + var layout = __webpack_require__(21); + var axisHelper = __webpack_require__(108); + + var zrUtil = __webpack_require__(3); + var Cartesian2D = __webpack_require__(114); + var Axis2D = __webpack_require__(116); + + var each = zrUtil.each; + + var ifAxisCrossZero = axisHelper.ifAxisCrossZero; + var niceScaleExtent = axisHelper.niceScaleExtent; + + // 依赖 GridModel, AxisModel 做预处理 + __webpack_require__(119); + + /** + * Check if the axis is used in the specified grid + * @inner + */ + function isAxisUsedInTheGrid(axisModel, gridModel, ecModel) { + return ecModel.getComponent('grid', axisModel.get('gridIndex')) === gridModel; + } + + function getLabelUnionRect(axis) { + var axisModel = axis.model; + var labels = axisModel.getFormattedLabels(); + var rect; + var step = 1; + var labelCount = labels.length; + if (labelCount > 40) { + // Simple optimization for large amount of labels + step = Math.ceil(labelCount / 40); + } + for (var i = 0; i < labelCount; i += step) { + if (!axis.isLabelIgnored(i)) { + var singleRect = axisModel.getTextRect(labels[i]); + // FIXME consider label rotate + rect ? rect.union(singleRect) : (rect = singleRect); + } + } + return rect; + } + + function Grid(gridModel, ecModel, api) { + /** + * @type {Object.} + * @private + */ + this._coordsMap = {}; + + /** + * @type {Array.} + * @private + */ + this._coordsList = []; + + /** + * @type {Object.} + * @private + */ + this._axesMap = {}; + + /** + * @type {Array.} + * @private + */ + this._axesList = []; + + this._initCartesian(gridModel, ecModel, api); + + this._model = gridModel; + } + + var gridProto = Grid.prototype; + + gridProto.type = 'grid'; + + gridProto.getRect = function () { + return this._rect; + }; + + gridProto.update = function (ecModel, api) { + + var axesMap = this._axesMap; + + this._updateScale(ecModel, this._model); + + function ifAxisCanNotOnZero(otherAxisDim) { + var axes = axesMap[otherAxisDim]; + for (var idx in axes) { + var axis = axes[idx]; + if (axis && (axis.type === 'category' || !ifAxisCrossZero(axis))) { + return true; + } + } + return false; + } + + each(axesMap.x, function (xAxis) { + niceScaleExtent(xAxis, xAxis.model); + }); + each(axesMap.y, function (yAxis) { + niceScaleExtent(yAxis, yAxis.model); + }); + // Fix configuration + each(axesMap.x, function (xAxis) { + // onZero can not be enabled in these two situations + // 1. When any other axis is a category axis + // 2. When any other axis not across 0 point + if (ifAxisCanNotOnZero('y')) { + xAxis.onZero = false; + } + }); + each(axesMap.y, function (yAxis) { + if (ifAxisCanNotOnZero('x')) { + yAxis.onZero = false; + } + }); + + // Resize again if containLabel is enabled + // FIXME It may cause getting wrong grid size in data processing stage + this.resize(this._model, api); + }; + + /** + * Resize the grid + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {module:echarts/ExtensionAPI} api + */ + gridProto.resize = function (gridModel, api) { + + var gridRect = layout.getLayoutRect( + gridModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + + this._rect = gridRect; + + var axesList = this._axesList; + + adjustAxes(); + + // Minus label size + if (gridModel.get('containLabel')) { + each(axesList, function (axis) { + if (!axis.model.get('axisLabel.inside')) { + var labelUnionRect = getLabelUnionRect(axis); + if (labelUnionRect) { + var dim = axis.isHorizontal() ? 'height' : 'width'; + var margin = axis.model.get('axisLabel.margin'); + gridRect[dim] -= labelUnionRect[dim] + margin; + if (axis.position === 'top') { + gridRect.y += labelUnionRect.height + margin; + } + else if (axis.position === 'left') { + gridRect.x += labelUnionRect.width + margin; + } + } + } + }); + + adjustAxes(); + } + + function adjustAxes() { + each(axesList, function (axis) { + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + updateAxisTransfrom(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } + }; + + /** + * @param {string} axisType + * @param {ndumber} [axisIndex] + */ + gridProto.getAxis = function (axisType, axisIndex) { + var axesMapOnDim = this._axesMap[axisType]; + if (axesMapOnDim != null) { + if (axisIndex == null) { + // Find first axis + for (var name in axesMapOnDim) { + return axesMapOnDim[name]; + } + } + return axesMapOnDim[axisIndex]; + } + }; + + gridProto.getCartesian = function (xAxisIndex, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + return this._coordsMap[key]; + }; + + /** + * Initialize cartesian coordinate systems + * @private + */ + gridProto._initCartesian = function (gridModel, ecModel, api) { + var axisPositionUsed = { + left: false, + right: false, + top: false, + bottom: false + }; + + var axesMap = { + x: {}, + y: {} + }; + var axesCount = { + x: 0, + y: 0 + }; + + /// Create axis + ecModel.eachComponent('xAxis', createAxisCreator('x'), this); + ecModel.eachComponent('yAxis', createAxisCreator('y'), this); + + if (!axesCount.x || !axesCount.y) { + // Roll back when there no either x or y axis + this._axesMap = {}; + this._axesList = []; + return; + } + + this._axesMap = axesMap; + + /// Create cartesian2d + each(axesMap.x, function (xAxis, xAxisIndex) { + each(axesMap.y, function (yAxis, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + var cartesian = new Cartesian2D(key); + + cartesian.grid = this; + + this._coordsMap[key] = cartesian; + this._coordsList.push(cartesian); + + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }, this); + }, this); + + function createAxisCreator(axisType) { + return function (axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel, ecModel)) { + return; + } + + var axisPosition = axisModel.get('position'); + if (axisType === 'x') { + // Fix position + if (axisPosition !== 'top' && axisPosition !== 'bottom') { + // Default bottom of X + axisPosition = 'bottom'; + } + if (axisPositionUsed[axisPosition]) { + axisPosition = axisPosition === 'top' ? 'bottom' : 'top'; + } + } + else { + // Fix position + if (axisPosition !== 'left' && axisPosition !== 'right') { + // Default left of Y + axisPosition = 'left'; + } + if (axisPositionUsed[axisPosition]) { + axisPosition = axisPosition === 'left' ? 'right' : 'left'; + } + } + axisPositionUsed[axisPosition] = true; + + var axis = new Axis2D( + axisType, axisHelper.createScaleByModel(axisModel), + [0, 0], + axisModel.get('type'), + axisPosition + ); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + + axis.onZero = axisModel.get('axisLine.onZero'); + + // Inject axis into axisModel + axisModel.axis = axis; + + // Inject axisModel into axis + axis.model = axisModel; + + // Index of axis, can be used as key + axis.index = idx; + + this._axesList.push(axis); + + axesMap[axisType][idx] = axis; + axesCount[axisType]++; + }; + } + }; + + /** + * Update cartesian properties from series + * @param {module:echarts/model/Option} option + * @private + */ + gridProto._updateScale = function (ecModel, gridModel) { + // Reset scale + zrUtil.each(this._axesList, function (axis) { + axis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'cartesian2d') { + var xAxisIndex = seriesModel.get('xAxisIndex'); + var yAxisIndex = seriesModel.get('yAxisIndex'); + + var xAxisModel = ecModel.getComponent('xAxis', xAxisIndex); + var yAxisModel = ecModel.getComponent('yAxis', yAxisIndex); + + if (!isAxisUsedInTheGrid(xAxisModel, gridModel, ecModel) + || !isAxisUsedInTheGrid(yAxisModel, gridModel, ecModel) + ) { + return; + } + + var cartesian = this.getCartesian(xAxisIndex, yAxisIndex); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + + if (data.type === 'list') { + unionExtent(data, xAxis, seriesModel); + unionExtent(data, yAxis, seriesModel); + } + } + }, this); + + function unionExtent(data, axis, seriesModel) { + each(seriesModel.coordDimToDataDim(axis.dim), function (dim) { + axis.scale.unionExtent(data.getDataExtent( + dim, axis.scale.type !== 'ordinal' + )); + }); + } + }; + + /** + * @inner + */ + function updateAxisTransfrom(axis, coordBase) { + var axisExtent = axis.getExtent(); + var axisExtentSum = axisExtent[0] + axisExtent[1]; + + // Fast transform + axis.toGlobalCoord = axis.dim === 'x' + ? function (coord) { + return coord + coordBase; + } + : function (coord) { + return axisExtentSum - coord + coordBase; + }; + axis.toLocalCoord = axis.dim === 'x' + ? function (coord) { + return coord - coordBase; + } + : function (coord) { + return axisExtentSum - coord + coordBase; + }; + } + + Grid.create = function (ecModel, api) { + var grids = []; + ecModel.eachComponent('grid', function (gridModel, idx) { + var grid = new Grid(gridModel, ecModel, api); + grid.name = 'grid_' + idx; + grid.resize(gridModel, api); + + gridModel.coordinateSystem = grid; + + grids.push(grid); + }); + + // Inject the coordinateSystems into seriesModel + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') !== 'cartesian2d') { + return; + } + var xAxisIndex = seriesModel.get('xAxisIndex'); + // TODO Validate + var xAxisModel = ecModel.getComponent('xAxis', xAxisIndex); + var grid = grids[xAxisModel.get('gridIndex')]; + seriesModel.coordinateSystem = grid.getCartesian( + xAxisIndex, seriesModel.get('yAxisIndex') + ); + }); + + return grids; + }; + + // For deciding which dimensions to use when creating list data + Grid.dimensions = Cartesian2D.prototype.dimensions; + + __webpack_require__(25).register('cartesian2d', Grid); + + module.exports = Grid; + + +/***/ }, +/* 108 */ +/***/ function(module, exports, __webpack_require__) { + + + + var OrdinalScale = __webpack_require__(109); + var IntervalScale = __webpack_require__(111); + __webpack_require__(112); + __webpack_require__(113); + var Scale = __webpack_require__(110); + + var numberUtil = __webpack_require__(7); + var zrUtil = __webpack_require__(3); + var textContain = __webpack_require__(14); + var axisHelper = {}; + + /** + * Get axis scale extent before niced. + */ + axisHelper.getScaleExtent = function (axis, model) { + var scale = axis.scale; + var originalExtent = scale.getExtent(); + var span = originalExtent[1] - originalExtent[0]; + if (scale.type === 'ordinal') { + // If series has no data, scale extent may be wrong + if (!isFinite(span)) { + return [0, 0]; + } + else { + return originalExtent; + } + } + var min = model.getMin ? model.getMin() : model.get('min'); + var max = model.getMax ? model.getMax() : model.get('max'); + var crossZero = model.getNeedCrossZero + ? model.getNeedCrossZero() : !model.get('scale'); + var boundaryGap = model.get('boundaryGap'); + if (!zrUtil.isArray(boundaryGap)) { + boundaryGap = [boundaryGap || 0, boundaryGap || 0]; + } + boundaryGap[0] = numberUtil.parsePercent(boundaryGap[0], 1); + boundaryGap[1] = numberUtil.parsePercent(boundaryGap[1], 1); + var fixMin = true; + var fixMax = true; + // Add boundary gap + if (min == null) { + min = originalExtent[0] - boundaryGap[0] * span; + fixMin = false; + } + if (max == null) { + max = originalExtent[1] + boundaryGap[1] * span; + fixMax = false; + } + // TODO Only one data + if (min === 'dataMin') { + min = originalExtent[0]; + } + if (max === 'dataMax') { + max = originalExtent[1]; + } + // Evaluate if axis needs cross zero + if (crossZero) { + // Axis is over zero and min is not set + if (min > 0 && max > 0 && !fixMin) { + min = 0; + } + // Axis is under zero and max is not set + if (min < 0 && max < 0 && !fixMax) { + max = 0; + } + } + return [min, max]; + }; + + axisHelper.niceScaleExtent = function (axis, model) { + var scale = axis.scale; + var extent = axisHelper.getScaleExtent(axis, model); + var fixMin = (model.getMin ? model.getMin() : model.get('min')) != null; + var fixMax = (model.getMax ? model.getMax() : model.get('max')) != null; + scale.setExtent(extent[0], extent[1]); + scale.niceExtent(model.get('splitNumber'), fixMin, fixMax); + + // If some one specified the min, max. And the default calculated interval + // is not good enough. He can specify the interval. It is often appeared + // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard + // to be 60. + // FIXME + var interval = model.get('interval'); + if (interval != null) { + scale.setInterval && scale.setInterval(interval); + } + }; + + /** + * @param {module:echarts/model/Model} model + * @param {string} [axisType] Default retrieve from model.type + * @return {module:echarts/scale/*} + */ + axisHelper.createScaleByModel = function(model, axisType) { + axisType = axisType || model.get('type'); + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale( + model.getCategories(), [Infinity, -Infinity] + ); + case 'value': + return new IntervalScale(); + // Extended scale, like time and log + default: + return (Scale.getClass(axisType) || IntervalScale).create(model); + } + } + }; + + /** + * Check if the axis corss 0 + */ + axisHelper.ifAxisCrossZero = function (axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !((min > 0 && max > 0) || (min < 0 && max < 0)); + }; + + /** + * @param {Array.} tickCoords In axis self coordinate. + * @param {Array.} labels + * @param {string} font + * @param {boolean} isAxisHorizontal + * @return {number} + */ + axisHelper.getAxisLabelInterval = function (tickCoords, labels, font, isAxisHorizontal) { + // FIXME + // 不同角的axis和label,不只是horizontal和vertical. + + var textSpaceTakenRect; + var autoLabelInterval = 0; + var accumulatedLabelInterval = 0; + + var step = 1; + if (labels.length > 40) { + // Simple optimization for large amount of labels + step = Math.round(labels.length / 40); + } + for (var i = 0; i < tickCoords.length; i += step) { + var tickCoord = tickCoords[i]; + var rect = textContain.getBoundingRect( + labels[i], font, 'center', 'top' + ); + rect[isAxisHorizontal ? 'x' : 'y'] += tickCoord; + rect[isAxisHorizontal ? 'width' : 'height'] *= 1.5; + if (!textSpaceTakenRect) { + textSpaceTakenRect = rect.clone(); + } + // There is no space for current label; + else if (textSpaceTakenRect.intersect(rect)) { + accumulatedLabelInterval++; + autoLabelInterval = Math.max(autoLabelInterval, accumulatedLabelInterval); + } + else { + textSpaceTakenRect.union(rect); + // Reset + accumulatedLabelInterval = 0; + } + } + if (autoLabelInterval === 0 && step > 1) { + return step; + } + return autoLabelInterval * step; + }; + + /** + * @param {Object} axis + * @param {Function} labelFormatter + * @return {Array.} + */ + axisHelper.getFormattedLabels = function (axis, labelFormatter) { + var scale = axis.scale; + var labels = scale.getTicksLabels(); + var ticks = scale.getTicks(); + if (typeof labelFormatter === 'string') { + labelFormatter = (function (tpl) { + return function (val) { + return tpl.replace('{value}', val); + }; + })(labelFormatter); + return zrUtil.map(labels, labelFormatter); + } + else if (typeof labelFormatter === 'function') { + return zrUtil.map(ticks, function (tick, idx) { + return labelFormatter( + axis.type === 'category' ? scale.getLabel(tick) : tick, + idx + ); + }, this); + } + else { + return labels; + } + }; + + module.exports = axisHelper; + + +/***/ }, +/* 109 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Linear continuous scale + * @module echarts/coord/scale/Ordinal + * + * http://en.wikipedia.org/wiki/Level_of_measurement + */ + + // FIXME only one data + + + var zrUtil = __webpack_require__(3); + var Scale = __webpack_require__(110); + + var scaleProto = Scale.prototype; + + var OrdinalScale = Scale.extend({ + + type: 'ordinal', + + init: function (data, extent) { + this._data = data; + this._extent = extent || [0, data.length - 1]; + }, + + parse: function (val) { + return typeof val === 'string' + ? zrUtil.indexOf(this._data, val) + // val might be float. + : Math.round(val); + }, + + contain: function (rank) { + rank = this.parse(rank); + return scaleProto.contain.call(this, rank) + && this._data[rank] != null; + }, + + /** + * Normalize given rank or name to linear [0, 1] + * @param {number|string} [val] + * @return {number} + */ + normalize: function (val) { + return scaleProto.normalize.call(this, this.parse(val)); + }, + + scale: function (val) { + return Math.round(scaleProto.scale.call(this, val)); + }, + + /** + * @return {Array} + */ + getTicks: function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + + while (rank <= extent[1]) { + ticks.push(rank); + rank++; + } + + return ticks; + }, + + /** + * Get item on rank n + * @param {number} n + * @return {string} + */ + getLabel: function (n) { + return this._data[n]; + }, + + /** + * @return {number} + */ + count: function () { + return this._extent[1] - this._extent[0] + 1; + }, + + niceTicks: zrUtil.noop, + niceExtent: zrUtil.noop + }); + + /** + * @return {module:echarts/scale/Time} + */ + OrdinalScale.create = function () { + return new OrdinalScale(); + }; + + module.exports = OrdinalScale; + + +/***/ }, +/* 110 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * // Scale class management + * @module echarts/scale/Scale + */ + + + var clazzUtil = __webpack_require__(9); + + function Scale() { + /** + * Extent + * @type {Array.} + * @protected + */ + this._extent = [Infinity, -Infinity]; + + /** + * Step is calculated in adjustExtent + * @type {Array.} + * @protected + */ + this._interval = 0; + + this.init && this.init.apply(this, arguments); + } + + var scaleProto = Scale.prototype; + + /** + * Parse input val to valid inner number. + * @param {*} val + * @return {number} + */ + scaleProto.parse = function (val) { + // Notice: This would be a trap here, If the implementation + // of this method depends on extent, and this method is used + // before extent set (like in dataZoom), it would be wrong. + // Nevertheless, parse does not depend on extent generally. + return val; + }; + + scaleProto.contain = function (val) { + var extent = this._extent; + return val >= extent[0] && val <= extent[1]; + }; + + /** + * Normalize value to linear [0, 1], return 0.5 if extent span is 0 + * @param {number} val + * @return {number} + */ + scaleProto.normalize = function (val) { + var extent = this._extent; + if (extent[1] === extent[0]) { + return 0.5; + } + return (val - extent[0]) / (extent[1] - extent[0]); + }; + + /** + * Scale normalized value + * @param {number} val + * @return {number} + */ + scaleProto.scale = function (val) { + var extent = this._extent; + return val * (extent[1] - extent[0]) + extent[0]; + }; + + /** + * Set extent from data + * @param {Array.} other + */ + scaleProto.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); + }; + + /** + * Get extent + * @return {Array.} + */ + scaleProto.getExtent = function () { + return this._extent.slice(); + }; + + /** + * Set extent + * @param {number} start + * @param {number} end + */ + scaleProto.setExtent = function (start, end) { + var thisExtent = this._extent; + if (!isNaN(start)) { + thisExtent[0] = start; + } + if (!isNaN(end)) { + thisExtent[1] = end; + } + }; + + /** + * @return {Array.} + */ + scaleProto.getTicksLabels = function () { + var labels = []; + var ticks = this.getTicks(); + for (var i = 0; i < ticks.length; i++) { + labels.push(this.getLabel(ticks[i])); + } + return labels; + }; + + clazzUtil.enableClassExtend(Scale); + clazzUtil.enableClassManagement(Scale, { + registerWhenExtend: true + }); + + module.exports = Scale; + + +/***/ }, +/* 111 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Interval scale + * @module echarts/scale/Interval + */ + + + + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + var Scale = __webpack_require__(110); + + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + /** + * @alias module:echarts/coord/scale/Interval + * @constructor + */ + var IntervalScale = Scale.extend({ + + type: 'interval', + + _interval: 0, + + setExtent: function (start, end) { + var thisExtent = this._extent; + //start,end may be a Number like '25',so... + if (!isNaN(start)) { + thisExtent[0] = parseFloat(start); + } + if (!isNaN(end)) { + thisExtent[1] = parseFloat(end); + } + }, + + unionExtent: function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + + // unionExtent may called by it's sub classes + IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]); + }, + /** + * Get interval + */ + getInterval: function () { + if (!this._interval) { + this.niceTicks(); + } + return this._interval; + }, + + /** + * Set interval + */ + setInterval: function (interval) { + this._interval = interval; + // Dropped auto calculated niceExtent and use user setted extent + // We assume user wan't to set both interval, min, max to get a better result + this._niceExtent = this._extent.slice(); + }, + + /** + * @return {Array.} + */ + getTicks: function () { + if (!this._interval) { + this.niceTicks(); + } + var interval = this._interval; + var extent = this._extent; + var ticks = []; + + // Consider this case: using dataZoom toolbox, zoom and zoom. + var safeLimit = 10000; + + if (interval) { + var niceExtent = this._niceExtent; + if (extent[0] < niceExtent[0]) { + ticks.push(extent[0]); + } + var tick = niceExtent[0]; + while (tick <= niceExtent[1]) { + ticks.push(tick); + // Avoid rounding error + tick = numberUtil.round(tick + interval); + if (ticks.length > safeLimit) { + return []; + } + } + if (extent[1] > niceExtent[1]) { + ticks.push(extent[1]); + } + } + + return ticks; + }, + + /** + * @return {Array.} + */ + getTicksLabels: function () { + var labels = []; + var ticks = this.getTicks(); + for (var i = 0; i < ticks.length; i++) { + labels.push(this.getLabel(ticks[i])); + } + return labels; + }, + + /** + * @param {number} n + * @return {number} + */ + getLabel: function (data) { + return formatUtil.addCommas(data); + }, + + /** + * Update interval and extent of intervals for nice ticks + * + * @param {number} [splitNumber = 5] Desired number of ticks + */ + niceTicks: function (splitNumber) { + splitNumber = splitNumber || 5; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (!isFinite(span)) { + return; + } + // User may set axis min 0 and data are all negative + // FIXME If it needs to reverse ? + if (span < 0) { + span = -span; + extent.reverse(); + } + + // From "Nice Numbers for Graph Labels" of Graphic Gems + // var niceSpan = numberUtil.nice(span, false); + var step = numberUtil.nice(span / splitNumber, true); + + // Niced extent inside original extent + var niceExtent = [ + numberUtil.round(mathCeil(extent[0] / step) * step), + numberUtil.round(mathFloor(extent[1] / step) * step) + ]; + + this._interval = step; + this._niceExtent = niceExtent; + }, + + /** + * Nice extent. + * @param {number} [splitNumber = 5] Given approx tick number + * @param {boolean} [fixMin=false] + * @param {boolean} [fixMax=false] + */ + niceExtent: function (splitNumber, fixMin, fixMax) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + if (extent[0] !== 0) { + // Expand extent + var expandSize = extent[0] / 2; + extent[0] -= expandSize; + extent[1] += expandSize; + } + else { + extent[1] = 1; + } + } + var span = extent[1] - extent[0]; + // If there are no data and extent are [Infinity, -Infinity] + if (!isFinite(span)) { + extent[0] = 0; + extent[1] = 1; + } + + this.niceTicks(splitNumber); + + // var extent = this._extent; + var interval = this._interval; + + if (!fixMin) { + extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval); + } + if (!fixMax) { + extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval); + } + } + }); + + /** + * @return {module:echarts/scale/Time} + */ + IntervalScale.create = function () { + return new IntervalScale(); + }; + + module.exports = IntervalScale; + + + +/***/ }, +/* 112 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Interval scale + * @module echarts/coord/scale/Time + */ + + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var formatUtil = __webpack_require__(6); + + var IntervalScale = __webpack_require__(111); + + var intervalScaleProto = IntervalScale.prototype; + + var mathCeil = Math.ceil; + var mathFloor = Math.floor; + var ONE_DAY = 3600000 * 24; + + // FIXME 公用? + var bisect = function (a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + if (a[mid][2] < x) { + lo = mid + 1; + } + else { + hi = mid; + } + } + return lo; + }; + + /** + * @alias module:echarts/coord/scale/Time + * @constructor + */ + var TimeScale = IntervalScale.extend({ + type: 'time', + + // Overwrite + getLabel: function (val) { + var stepLvl = this._stepLvl; + + var date = new Date(val); + + return formatUtil.formatTime(stepLvl[0], date); + }, + + // Overwrite + niceExtent: function (approxTickNum, fixMin, fixMax) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + // Expand extent + extent[0] -= ONE_DAY; + extent[1] += ONE_DAY; + } + // If there are no data and extent are [Infinity, -Infinity] + if (extent[1] === -Infinity && extent[0] === Infinity) { + var d = new Date(); + extent[1] = new Date(d.getFullYear(), d.getMonth(), d.getDate()); + extent[0] = extent[1] - ONE_DAY; + } + + this.niceTicks(approxTickNum, fixMin, fixMax); + + // var extent = this._extent; + var interval = this._interval; + + if (!fixMin) { + extent[0] = numberUtil.round(mathFloor(extent[0] / interval) * interval); + } + if (!fixMax) { + extent[1] = numberUtil.round(mathCeil(extent[1] / interval) * interval); + } + }, + + // Overwrite + niceTicks: function (approxTickNum) { + approxTickNum = approxTickNum || 10; + + var extent = this._extent; + var span = extent[1] - extent[0]; + var approxInterval = span / approxTickNum; + var scaleLevelsLen = scaleLevels.length; + var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen); + + var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)]; + var interval = level[2]; + // Same with interval scale if span is much larger than 1 year + if (level[0] === 'year') { + var yearSpan = span / interval; + + // From "Nice Numbers for Graph Labels" of Graphic Gems + // var niceYearSpan = numberUtil.nice(yearSpan, false); + var yearStep = numberUtil.nice(yearSpan / approxTickNum, true); + + interval *= yearStep; + } + + var niceExtent = [ + mathCeil(extent[0] / interval) * interval, + mathFloor(extent[1] / interval) * interval + ]; + + this._stepLvl = level; + // Interval will be used in getTicks + this._interval = interval; + this._niceExtent = niceExtent; + }, + + parse: function (val) { + // val might be float. + return +numberUtil.parseDate(val); + } + }); + + zrUtil.each(['contain', 'normalize'], function (methodName) { + TimeScale.prototype[methodName] = function (val) { + return intervalScaleProto[methodName].call(this, this.parse(val)); + }; + }); + + // Steps from d3 + var scaleLevels = [ + // Format step interval + ['hh:mm:ss', 1, 1000], // 1s + ['hh:mm:ss', 5, 1000 * 5], // 5s + ['hh:mm:ss', 10, 1000 * 10], // 10s + ['hh:mm:ss', 15, 1000 * 15], // 15s + ['hh:mm:ss', 30, 1000 * 30], // 30s + ['hh:mm\nMM-dd',1, 60000], // 1m + ['hh:mm\nMM-dd',5, 60000 * 5], // 5m + ['hh:mm\nMM-dd',10, 60000 * 10], // 10m + ['hh:mm\nMM-dd',15, 60000 * 15], // 15m + ['hh:mm\nMM-dd',30, 60000 * 30], // 30m + ['hh:mm\nMM-dd',1, 3600000], // 1h + ['hh:mm\nMM-dd',2, 3600000 * 2], // 2h + ['hh:mm\nMM-dd',6, 3600000 * 6], // 6h + ['hh:mm\nMM-dd',12, 3600000 * 12], // 12h + ['MM-dd\nyyyy', 1, ONE_DAY], // 1d + ['week', 7, ONE_DAY * 7], // 7d + ['month', 1, ONE_DAY * 31], // 1M + ['quarter', 3, ONE_DAY * 380 / 4], // 3M + ['half-year', 6, ONE_DAY * 380 / 2], // 6M + ['year', 1, ONE_DAY * 380] // 1Y + ]; + + /** + * @return {module:echarts/scale/Time} + */ + TimeScale.create = function () { + return new TimeScale(); + }; + + module.exports = TimeScale; + + +/***/ }, +/* 113 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Log scale + * @module echarts/scale/Log + */ + + + var zrUtil = __webpack_require__(3); + var Scale = __webpack_require__(110); + var numberUtil = __webpack_require__(7); + + // Use some method of IntervalScale + var IntervalScale = __webpack_require__(111); + + var scaleProto = Scale.prototype; + var intervalScaleProto = IntervalScale.prototype; + + var mathFloor = Math.floor; + var mathCeil = Math.ceil; + var mathPow = Math.pow; + + var LOG_BASE = 10; + var mathLog = Math.log; + + var LogScale = Scale.extend({ + + type: 'log', + + /** + * @return {Array.} + */ + getTicks: function () { + return zrUtil.map(intervalScaleProto.getTicks.call(this), function (val) { + return numberUtil.round(mathPow(LOG_BASE, val)); + }); + }, + + /** + * @param {number} val + * @return {string} + */ + getLabel: intervalScaleProto.getLabel, + + /** + * @param {number} val + * @return {number} + */ + scale: function (val) { + val = scaleProto.scale.call(this, val); + return mathPow(LOG_BASE, val); + }, + + /** + * @param {number} start + * @param {number} end + */ + setExtent: function (start, end) { + start = mathLog(start) / mathLog(LOG_BASE); + end = mathLog(end) / mathLog(LOG_BASE); + intervalScaleProto.setExtent.call(this, start, end); + }, + + /** + * @return {number} end + */ + getExtent: function () { + var extent = scaleProto.getExtent.call(this); + extent[0] = mathPow(LOG_BASE, extent[0]); + extent[1] = mathPow(LOG_BASE, extent[1]); + return extent; + }, + + /** + * @param {Array.} extent + */ + unionExtent: function (extent) { + extent[0] = mathLog(extent[0]) / mathLog(LOG_BASE); + extent[1] = mathLog(extent[1]) / mathLog(LOG_BASE); + scaleProto.unionExtent.call(this, extent); + }, + + /** + * Update interval and extent of intervals for nice ticks + * @param {number} [approxTickNum = 10] Given approx tick number + */ + niceTicks: function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (span === Infinity || span <= 0) { + return; + } + + var interval = mathPow(10, mathFloor(mathLog(span / approxTickNum) / Math.LN10)); + var err = approxTickNum / span * interval; + + // Filter ticks to get closer to the desired count. + if (err <= 0.5) { + interval *= 10; + } + var niceExtent = [ + numberUtil.round(mathCeil(extent[0] / interval) * interval), + numberUtil.round(mathFloor(extent[1] / interval) * interval) + ]; + + this._interval = interval; + this._niceExtent = niceExtent; + }, + + /** + * Nice extent. + * @param {number} [approxTickNum = 10] Given approx tick number + * @param {boolean} [fixMin=false] + * @param {boolean} [fixMax=false] + */ + niceExtent: intervalScaleProto.niceExtent + }); + + zrUtil.each(['contain', 'normalize'], function (methodName) { + LogScale.prototype[methodName] = function (val) { + val = mathLog(val) / mathLog(LOG_BASE); + return scaleProto[methodName].call(this, val); + }; + }); + + LogScale.create = function () { + return new LogScale(); + }; + + module.exports = LogScale; + + +/***/ }, +/* 114 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var Cartesian = __webpack_require__(115); + + function Cartesian2D(name) { + + Cartesian.call(this, name); + } + + Cartesian2D.prototype = { + + constructor: Cartesian2D, + + type: 'cartesian2d', + + /** + * @type {Array.} + * @readOnly + */ + dimensions: ['x', 'y'], + + /** + * Base axis will be used on stacking. + * + * @return {module:echarts/coord/cartesian/Axis2D} + */ + getBaseAxis: function () { + return this.getAxesByScale('ordinal')[0] + || this.getAxesByScale('time')[0] + || this.getAxis('x'); + }, + + /** + * If contain point + * @param {Array.} point + * @return {boolean} + */ + containPoint: function (point) { + var axisX = this.getAxis('x'); + var axisY = this.getAxis('y'); + return axisX.contain(axisX.toLocalCoord(point[0])) + && axisY.contain(axisY.toLocalCoord(point[1])); + }, + + /** + * If contain data + * @param {Array.} data + * @return {boolean} + */ + containData: function (data) { + return this.getAxis('x').containData(data[0]) + && this.getAxis('y').containData(data[1]); + }, + + /** + * Convert series data to an array of points + * @param {module:echarts/data/List} data + * @param {boolean} stack + * @return {Array} + * Return array of points. For example: + * `[[10, 10], [20, 20], [30, 30]]` + */ + dataToPoints: function (data, stack) { + return data.mapArray(['x', 'y'], function (x, y) { + return this.dataToPoint([x, y]); + }, stack, this); + }, + + /** + * @param {Array.} data + * @param {boolean} [clamp=false] + * @return {Array.} + */ + dataToPoint: function (data, clamp) { + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + return [ + xAxis.toGlobalCoord(xAxis.dataToCoord(data[0], clamp)), + yAxis.toGlobalCoord(yAxis.dataToCoord(data[1], clamp)) + ]; + }, + + /** + * @param {Array.} point + * @param {boolean} [clamp=false] + * @return {Array.} + */ + pointToData: function (point, clamp) { + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + return [ + xAxis.coordToData(xAxis.toLocalCoord(point[0]), clamp), + yAxis.coordToData(yAxis.toLocalCoord(point[1]), clamp) + ]; + }, + + /** + * Get other axis + * @param {module:echarts/coord/cartesian/Axis2D} axis + */ + getOtherAxis: function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + } + }; + + zrUtil.inherits(Cartesian2D, Cartesian); + + module.exports = Cartesian2D; + + +/***/ }, +/* 115 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Cartesian coordinate system + * @module echarts/coord/Cartesian + * + */ + + + var zrUtil = __webpack_require__(3); + + function dimAxisMapper(dim) { + return this._axes[dim]; + } + + /** + * @alias module:echarts/coord/Cartesian + * @constructor + */ + var Cartesian = function (name) { + this._axes = {}; + + this._dimList = []; + + /** + * @type {string} + */ + this.name = name || ''; + }; + + Cartesian.prototype = { + + constructor: Cartesian, + + type: 'cartesian', + + /** + * Get axis + * @param {number|string} dim + * @return {module:echarts/coord/Cartesian~Axis} + */ + getAxis: function (dim) { + return this._axes[dim]; + }, + + /** + * Get axes list + * @return {Array.} + */ + getAxes: function () { + return zrUtil.map(this._dimList, dimAxisMapper, this); + }, + + /** + * Get axes list by given scale type + */ + getAxesByScale: function (scaleType) { + scaleType = scaleType.toLowerCase(); + return zrUtil.filter( + this.getAxes(), + function (axis) { + return axis.scale.type === scaleType; + } + ); + }, + + /** + * Add axis + * @param {module:echarts/coord/Cartesian.Axis} + */ + addAxis: function (axis) { + var dim = axis.dim; + + this._axes[dim] = axis; + + this._dimList.push(dim); + }, + + /** + * Convert data to coord in nd space + * @param {Array.|Object.} val + * @return {Array.|Object.} + */ + dataToCoord: function (val) { + return this._dataCoordConvert(val, 'dataToCoord'); + }, + + /** + * Convert coord in nd space to data + * @param {Array.|Object.} val + * @return {Array.|Object.} + */ + coordToData: function (val) { + return this._dataCoordConvert(val, 'coordToData'); + }, + + _dataCoordConvert: function (input, method) { + var dimList = this._dimList; + + var output = input instanceof Array ? [] : {}; + + for (var i = 0; i < dimList.length; i++) { + var dim = dimList[i]; + var axis = this._axes[dim]; + + output[dim] = axis[method](input[dim]); + } + + return output; + } + }; + + module.exports = Cartesian; + + +/***/ }, +/* 116 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var Axis = __webpack_require__(117); + var axisLabelInterval = __webpack_require__(118); + + /** + * Extend axis 2d + * @constructor module:echarts/coord/cartesian/Axis2D + * @extends {module:echarts/coord/cartesian/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.} coordExtent + * @param {string} axisType + * @param {string} position + */ + var Axis2D = function (dim, scale, coordExtent, axisType, position) { + Axis.call(this, dim, scale, coordExtent); + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * Axis position + * - 'top' + * - 'bottom' + * - 'left' + * - 'right' + */ + this.position = position || 'bottom'; + }; + + Axis2D.prototype = { + + constructor: Axis2D, + + /** + * Index of axis, can be used as key + */ + index: 0, + /** + * If axis is on the zero position of the other axis + * @type {boolean} + */ + onZero: false, + + /** + * Axis model + * @param {module:echarts/coord/cartesian/AxisModel} + */ + model: null, + + isHorizontal: function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }, + + getGlobalExtent: function () { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + return ret; + }, + + /** + * @return {number} + */ + getLabelInterval: function () { + var labelInterval = this._labelInterval; + if (!labelInterval) { + labelInterval = this._labelInterval = axisLabelInterval(this); + } + return labelInterval; + }, + + /** + * If label is ignored. + * Automatically used when axis is category and label can not be all shown + * @param {number} idx + * @return {boolean} + */ + isLabelIgnored: function (idx) { + if (this.type === 'category') { + var labelInterval = this.getLabelInterval(); + return ((typeof labelInterval === 'function') + && !labelInterval(idx, this.scale.getLabel(idx))) + || idx % (labelInterval + 1); + } + }, + + /** + * Transform global coord to local coord, + * i.e. var localCoord = axis.toLocalCoord(80); + * designate by module:echarts/coord/cartesian/Grid. + * @type {Function} + */ + toLocalCoord: null, + + /** + * Transform global coord to local coord, + * i.e. var globalCoord = axis.toLocalCoord(40); + * designate by module:echarts/coord/cartesian/Grid. + * @type {Function} + */ + toGlobalCoord: null + + }; + zrUtil.inherits(Axis2D, Axis); + + module.exports = Axis2D; + + +/***/ }, +/* 117 */ +/***/ function(module, exports, __webpack_require__) { + + + + var numberUtil = __webpack_require__(7); + var linearMap = numberUtil.linearMap; + var zrUtil = __webpack_require__(3); + + function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; + } + + var normalizedExtent = [0, 1]; + /** + * @name module:echarts/coord/CartesianAxis + * @constructor + */ + var Axis = function (dim, scale, extent) { + + /** + * Axis dimension. Such as 'x', 'y', 'z', 'angle', 'radius' + * @type {string} + */ + this.dim = dim; + + /** + * Axis scale + * @type {module:echarts/coord/scale/*} + */ + this.scale = scale; + + /** + * @type {Array.} + * @private + */ + this._extent = extent || [0, 0]; + + /** + * @type {boolean} + */ + this.inverse = false; + + /** + * Usually true when axis has a ordinal scale + * @type {boolean} + */ + this.onBand = false; + }; + + Axis.prototype = { + + constructor: Axis, + + /** + * If axis extent contain given coord + * @param {number} coord + * @return {boolean} + */ + contain: function (coord) { + var extent = this._extent; + var min = Math.min(extent[0], extent[1]); + var max = Math.max(extent[0], extent[1]); + return coord >= min && coord <= max; + }, + + /** + * If axis extent contain given data + * @param {number} data + * @return {boolean} + */ + containData: function (data) { + return this.contain(this.dataToCoord(data)); + }, + + /** + * Get coord extent. + * @return {Array.} + */ + getExtent: function () { + var ret = this._extent.slice(); + return ret; + }, + + /** + * Get precision used for formatting + * @param {Array.} [dataExtent] + * @return {number} + */ + getPixelPrecision: function (dataExtent) { + return numberUtil.getPixelPrecision( + dataExtent || this.scale.getExtent(), + this._extent + ); + }, + + /** + * Set coord extent + * @param {number} start + * @param {number} end + */ + setExtent: function (start, end) { + var extent = this._extent; + extent[0] = start; + extent[1] = end; + }, + + /** + * Convert data to coord. Data is the rank if it has a ordinal scale + * @param {number} data + * @param {boolean} clamp + * @return {number} + */ + dataToCoord: function (data, clamp) { + var extent = this._extent; + var scale = this.scale; + data = scale.normalize(data); + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + return linearMap(data, normalizedExtent, extent, clamp); + }, + + /** + * Convert coord to data. Data is the rank if it has a ordinal scale + * @param {number} coord + * @param {boolean} clamp + * @return {number} + */ + coordToData: function (coord, clamp) { + var extent = this._extent; + var scale = this.scale; + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + var t = linearMap(coord, extent, normalizedExtent, clamp); + + return this.scale.scale(t); + }, + /** + * @return {Array.} + */ + getTicksCoords: function () { + if (this.onBand) { + var bands = this.getBands(); + var coords = []; + for (var i = 0; i < bands.length; i++) { + coords.push(bands[i][0]); + } + if (bands[i - 1]) { + coords.push(bands[i - 1][1]); + } + return coords; + } + else { + return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this); + } + }, + + /** + * Coords of labels are on the ticks or on the middle of bands + * @return {Array.} + */ + getLabelsCoords: function () { + if (this.onBand) { + var bands = this.getBands(); + var coords = []; + var band; + for (var i = 0; i < bands.length; i++) { + band = bands[i]; + coords.push((band[0] + band[1]) / 2); + } + return coords; + } + else { + return zrUtil.map(this.scale.getTicks(), this.dataToCoord, this); + } + }, + + /** + * Get bands. + * + * If axis has labels [1, 2, 3, 4]. Bands on the axis are + * |---1---|---2---|---3---|---4---|. + * + * @return {Array} + */ + // FIXME Situation when labels is on ticks + getBands: function () { + var extent = this.getExtent(); + var bands = []; + var len = this.scale.count(); + var start = extent[0]; + var end = extent[1]; + var span = end - start; + + for (var i = 0; i < len; i++) { + bands.push([ + span * i / len + start, + span * (i + 1) / len + start + ]); + } + return bands; + }, + + /** + * Get width of band + * @return {number} + */ + getBandWidth: function () { + var axisExtent = this._extent; + var dataExtent = this.scale.getExtent(); + + var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); + // Fix #2728, avoid NaN when only one data. + len === 0 && (len = 1); + + var size = Math.abs(axisExtent[1] - axisExtent[0]); + + return Math.abs(size) / len; + } + }; + + module.exports = Axis; + + +/***/ }, +/* 118 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + /** + * Helper function for axisLabelInterval calculation + */ + + + + var zrUtil = __webpack_require__(3); + var axisHelper = __webpack_require__(108); + + module.exports = function (axis) { + var axisModel = axis.model; + var labelModel = axisModel.getModel('axisLabel'); + var labelInterval = labelModel.get('interval'); + if (!(axis.type === 'category' && labelInterval === 'auto')) { + return labelInterval === 'auto' ? 0 : labelInterval; + } + + return axisHelper.getAxisLabelInterval( + zrUtil.map(axis.scale.getTicks(), axis.dataToCoord, axis), + axisModel.getFormattedLabels(), + labelModel.getModel('textStyle').getFont(), + axis.isHorizontal() + ); + }; + + +/***/ }, +/* 119 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // Grid 是在有直角坐标系的时候必须要存在的 + // 所以这里也要被 Cartesian2D 依赖 + + + __webpack_require__(120); + var ComponentModel = __webpack_require__(19); + + module.exports = ComponentModel.extend({ + + type: 'grid', + + dependencies: ['xAxis', 'yAxis'], + + layoutMode: 'box', + + /** + * @type {module:echarts/coord/cartesian/Grid} + */ + coordinateSystem: null, + + defaultOption: { + show: false, + zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 60, + // If grid size contain label + containLabel: false, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 1, + borderColor: '#ccc' + } + }); + + +/***/ }, +/* 120 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var ComponentModel = __webpack_require__(19); + var zrUtil = __webpack_require__(3); + var axisModelCreator = __webpack_require__(121); + + var AxisModel = ComponentModel.extend({ + + type: 'cartesian2dAxis', + + /** + * @type {module:echarts/coord/cartesian/Axis2D} + */ + axis: null, + + /** + * @override + */ + init: function () { + AxisModel.superApply(this, 'init', arguments); + this._resetRange(); + }, + + /** + * @override + */ + mergeOption: function () { + AxisModel.superApply(this, 'mergeOption', arguments); + this._resetRange(); + }, + + /** + * @override + */ + restoreData: function () { + AxisModel.superApply(this, 'restoreData', arguments); + this._resetRange(); + }, + + /** + * @public + * @param {number} rangeStart + * @param {number} rangeEnd + */ + setRange: function (rangeStart, rangeEnd) { + this.option.rangeStart = rangeStart; + this.option.rangeEnd = rangeEnd; + }, + + /** + * @public + * @return {Array.} + */ + getMin: function () { + var option = this.option; + return option.rangeStart != null ? option.rangeStart : option.min; + }, + + /** + * @public + * @return {Array.} + */ + getMax: function () { + var option = this.option; + return option.rangeEnd != null ? option.rangeEnd : option.max; + }, + + /** + * @public + * @return {boolean} + */ + getNeedCrossZero: function () { + var option = this.option; + return (option.rangeStart != null || option.rangeEnd != null) + ? false : !option.scale; + }, + + /** + * @private + */ + _resetRange: function () { + // rangeStart and rangeEnd is readonly. + this.option.rangeStart = this.option.rangeEnd = null; + } + + }); + + function getAxisType(axisDim, option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); + } + + zrUtil.merge(AxisModel.prototype, __webpack_require__(123)); + + var extraOption = { + gridIndex: 0 + }; + + axisModelCreator('x', AxisModel, getAxisType, extraOption); + axisModelCreator('y', AxisModel, getAxisType, extraOption); + + module.exports = AxisModel; + + +/***/ }, +/* 121 */ +/***/ function(module, exports, __webpack_require__) { + + + + var axisDefault = __webpack_require__(122); + var zrUtil = __webpack_require__(3); + var ComponentModel = __webpack_require__(19); + var layout = __webpack_require__(21); + + // FIXME axisType is fixed ? + var AXIS_TYPES = ['value', 'category', 'time', 'log']; + + /** + * Generate sub axis model class + * @param {string} axisName 'x' 'y' 'radius' 'angle' 'parallel' + * @param {module:echarts/model/Component} BaseAxisModelClass + * @param {Function} axisTypeDefaulter + * @param {Object} [extraDefaultOption] + */ + module.exports = function (axisName, BaseAxisModelClass, axisTypeDefaulter, extraDefaultOption) { + + zrUtil.each(AXIS_TYPES, function (axisType) { + + BaseAxisModelClass.extend({ + + type: axisName + 'Axis.' + axisType, + + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? layout.getLayoutParams(option) : {}; + + var themeModel = ecModel.getTheme(); + zrUtil.merge(option, themeModel.get(axisType + 'Axis')); + zrUtil.merge(option, this.getDefaultOption()); + + option.type = axisTypeDefaulter(axisName, option); + + if (layoutMode) { + layout.mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + defaultOption: zrUtil.mergeAll( + [ + {}, + axisDefault[axisType + 'Axis'], + extraDefaultOption + ], + true + ) + }); + }); + + ComponentModel.registerSubTypeDefaulter( + axisName + 'Axis', + zrUtil.curry(axisTypeDefaulter, axisName) + ); + }; + + +/***/ }, +/* 122 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + var defaultOption = { + show: true, + zlevel: 0, // 一级层叠 + z: 0, // 二级层叠 + // 反向坐标轴 + inverse: false, + // 坐标轴名字,默认为空 + name: '', + // 坐标轴名字位置,支持'start' | 'middle' | 'end' + nameLocation: 'end', + // 坐标轴文字样式,默认取全局样式 + nameTextStyle: {}, + // 文字与轴线距离 + nameGap: 15, + // 坐标轴线 + axisLine: { + // 默认显示,属性show控制显示与否 + show: true, + onZero: true, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#333', + width: 1, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认显示 + show: true, + // 控制小标记是否在grid里 + inside: false, + // 属性length控制线长 + length: 5, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#333', + width: 1 + } + }, + // 坐标轴文本标签,详见axis.axisLabel + axisLabel: { + show: true, + // 控制文本标签是否在grid里 + inside: false, + rotate: 0, + margin: 8, + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + textStyle: { + color: '#333', + fontSize: 12 + } + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: ['#ccc'], + width: 1, + type: 'solid' + } + }, + // 分隔区域 + splitArea: { + // 默认不显示,属性show控制显示与否 + show: false, + // 属性areaStyle(详见areaStyle)控制区域样式 + areaStyle: { + color: ['rgba(250,250,250,0.3)','rgba(200,200,200,0.3)'] + } + } + }; + + var categoryAxis = zrUtil.merge({ + // 类目起始和结束两端空白策略 + boundaryGap: true, + // 坐标轴小标记 + axisTick: { + interval: 'auto' + }, + // 坐标轴文本标签,详见axis.axisLabel + axisLabel: { + interval: 'auto' + } + }, defaultOption); + + var valueAxis = zrUtil.defaults({ + // 数值起始和结束两端空白策略 + boundaryGap: [0, 0], + // 最小值, 设置成 'dataMin' 则从数据中计算最小值 + // min: null, + // 最大值,设置成 'dataMax' 则从数据中计算最大值 + // max: null, + // Readonly prop, specifies start value of the range when using data zoom. + // rangeStart: null + // Readonly prop, specifies end value of the range when using data zoom. + // rangeEnd: null + // 脱离0值比例,放大聚焦到最终_min,_max区间 + // scale: false, + // 分割段数,默认为5 + splitNumber: 5 + }, defaultOption); + + // FIXME + var timeAxis = zrUtil.defaults({ + scale: true, + min: 'dataMin', + max: 'dataMax' + }, valueAxis); + var logAxis = zrUtil.defaults({}, valueAxis); + logAxis.scale = true; + + module.exports = { + categoryAxis: categoryAxis, + valueAxis: valueAxis, + timeAxis: timeAxis, + logAxis: logAxis + }; + + +/***/ }, +/* 123 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var axisHelper = __webpack_require__(108); + + function getName(obj) { + if (zrUtil.isObject(obj) && obj.value != null) { + return obj.value; + } + else { + return obj; + } + } + /** + * Get categories + */ + function getCategories() { + return this.get('type') === 'category' + && zrUtil.map(this.get('data'), getName); + } + + /** + * Format labels + * @return {Array.} + */ + function getFormattedLabels() { + return axisHelper.getFormattedLabels( + this.axis, + this.get('axisLabel.formatter') + ); + } + + module.exports = { + + getFormattedLabels: getFormattedLabels, + + getCategories: getCategories + }; + + +/***/ }, +/* 124 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // TODO boundaryGap + + + __webpack_require__(120); + + __webpack_require__(125); + + +/***/ }, +/* 125 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var AxisBuilder = __webpack_require__(126); + var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick; + var getInterval = AxisBuilder.getInterval; + + var axisBuilderAttrs = [ + 'axisLine', 'axisLabel', 'axisTick', 'axisName' + ]; + var selfBuilderAttrs = [ + 'splitLine', 'splitArea' + ]; + + var AxisView = __webpack_require__(1).extendComponentView({ + + type: 'axis', + + render: function (axisModel, ecModel) { + + this.group.removeAll(); + + if (!axisModel.get('show')) { + return; + } + + var gridModel = ecModel.getComponent('grid', axisModel.get('gridIndex')); + + var layout = layoutAxis(gridModel, axisModel); + + var axisBuilder = new AxisBuilder(axisModel, layout); + + zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder); + + this.group.add(axisBuilder.getGroup()); + + zrUtil.each(selfBuilderAttrs, function (name) { + if (axisModel.get(name +'.show')) { + this['_' + name](axisModel, gridModel, layout.labelInterval); + } + }, this); + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {number|Function} labelInterval + * @private + */ + _splitLine: function (axisModel, gridModel, labelInterval) { + var axis = axisModel.axis; + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineWidth = lineStyleModel.get('width'); + var lineColors = lineStyleModel.get('color'); + + var lineInterval = getInterval(splitLineModel, labelInterval); + + lineColors = zrUtil.isArray(lineColors) ? lineColors : [lineColors]; + + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + + var splitLines = []; + var lineCount = 0; + + var ticksCoords = axis.getTicksCoords(); + + var p1 = []; + var p2 = []; + for (var i = 0; i < ticksCoords.length; i++) { + if (ifIgnoreOnTick(axis, i, lineInterval)) { + continue; + } + + var tickCoord = axis.toGlobalCoord(ticksCoords[i]); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } + else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = (lineCount++) % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new graphic.Line(graphic.subPixelOptimizeLine({ + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: { + lineWidth: lineWidth + }, + silent: true + }))); + } + + // Simple optimization + // Batching the lines if color are the same + var lineStyle = lineStyleModel.getLineStyle(); + for (var i = 0; i < splitLines.length; i++) { + this.group.add(graphic.mergePath(splitLines[i], { + style: zrUtil.defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyle), + silent: true + })); + } + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {number|Function} labelInterval + * @private + */ + _splitArea: function (axisModel, gridModel, labelInterval) { + var axis = axisModel.axis; + + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + + var gridRect = gridModel.coordinateSystem.getRect(); + var ticksCoords = axis.getTicksCoords(); + + var prevX = axis.toGlobalCoord(ticksCoords[0]); + var prevY = axis.toGlobalCoord(ticksCoords[0]); + + var splitAreaRects = []; + var count = 0; + + var areaInterval = getInterval(splitAreaModel, labelInterval); + + areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors]; + + for (var i = 1; i < ticksCoords.length; i++) { + if (ifIgnoreOnTick(axis, i, areaInterval)) { + continue; + } + + var tickCoord = axis.toGlobalCoord(ticksCoords[i]); + + var x; + var y; + var width; + var height; + if (axis.isHorizontal()) { + x = prevX; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + } + else { + x = gridRect.x; + y = prevY; + width = gridRect.width; + height = tickCoord - y; + } + + var colorIndex = (count++) % areaColors.length; + splitAreaRects[colorIndex] = splitAreaRects[colorIndex] || []; + splitAreaRects[colorIndex].push(new graphic.Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + }, + silent: true + })); + + prevX = x + width; + prevY = y + height; + } + + // Simple optimization + // Batching the rects if color are the same + var areaStyle = areaStyleModel.getAreaStyle(); + for (var i = 0; i < splitAreaRects.length; i++) { + this.group.add(graphic.mergePath(splitAreaRects[i], { + style: zrUtil.defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyle), + silent: true + })); + } + } + }); + + AxisView.extend({ + type: 'xAxis' + }); + AxisView.extend({ + type: 'yAxis' + }); + + /** + * @inner + */ + function layoutAxis(gridModel, axisModel) { + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + + var rawAxisPosition = axis.position; + var axisPosition = axis.onZero ? 'onZero' : rawAxisPosition; + var axisDim = axis.dim; + + // [left, right, top, bottom] + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + + var posMap = { + x: {top: rectBound[2], bottom: rectBound[3]}, + y: {left: rectBound[0], right: rectBound[1]} + }; + posMap.x.onZero = Math.max(Math.min(getZero('y'), posMap.x.bottom), posMap.x.top); + posMap.y.onZero = Math.max(Math.min(getZero('x'), posMap.y.right), posMap.y.left); + + function getZero(dim, val) { + var theAxis = grid.getAxis(dim); + return theAxis.toGlobalCoord(theAxis.dataToCoord(0)); + } + + // Axis position + layout.position = [ + axisDim === 'y' ? posMap.y[axisPosition] : rectBound[0], + axisDim === 'x' ? posMap.x[axisPosition] : rectBound[3] + ]; + + // Axis rotation + var r = {x: 0, y: 1}; + layout.rotation = Math.PI / 2 * r[axisDim]; + + // Tick and label direction, x y is axisDim + var dirMap = {top: -1, bottom: 1, left: -1, right: 1}; + + layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition]; + if (axis.onZero) { + layout.labelOffset = posMap[axisDim][rawAxisPosition] - posMap[axisDim].onZero; + } + + if (axisModel.getModel('axisTick').get('inside')) { + layout.tickDirection = -layout.tickDirection; + } + if (axisModel.getModel('axisLabel').get('inside')) { + layout.labelDirection = -layout.labelDirection; + } + + // Special label rotation + var labelRotation = axisModel.getModel('axisLabel').get('rotate'); + layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation; + + // label interval when auto mode. + layout.labelInterval = axis.getLabelInterval(); + + // Over splitLine and splitArea + layout.z2 = 1; + + return layout; + } + + +/***/ }, +/* 126 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + var Model = __webpack_require__(8); + var numberUtil = __webpack_require__(7); + var remRadian = numberUtil.remRadian; + var isRadianAroundZero = numberUtil.isRadianAroundZero; + + var PI = Math.PI; + + /** + * A final axis is translated and rotated from a "standard axis". + * So opt.position and opt.rotation is required. + * + * A standard axis is and axis from [0, 0] to [0, axisExtent[1]], + * for example: (0, 0) ------------> (0, 50) + * + * nameDirection or tickDirection or labelDirection is 1 means tick + * or label is below the standard axis, whereas is -1 means above + * the standard axis. labelOffset means offset between label and axis, + * which is useful when 'onZero', where axisLabel is in the grid and + * label in outside grid. + * + * Tips: like always, + * positive rotation represents anticlockwise, and negative rotation + * represents clockwise. + * The direction of position coordinate is the same as the direction + * of screen coordinate. + * + * Do not need to consider axis 'inverse', which is auto processed by + * axis extent. + * + * @param {module:zrender/container/Group} group + * @param {Object} axisModel + * @param {Object} opt Standard axis parameters. + * @param {Array.} opt.position [x, y] + * @param {number} opt.rotation by radian + * @param {number} [opt.nameDirection=1] 1 or -1 Used when nameLocation is 'middle'. + * @param {number} [opt.tickDirection=1] 1 or -1 + * @param {number} [opt.labelDirection=1] 1 or -1 + * @param {number} [opt.labelOffset=0] Usefull when onZero. + * @param {string} [opt.axisName] default get from axisModel. + * @param {number} [opt.labelRotation] by degree, default get from axisModel. + * @param {number} [opt.labelInterval] Default label interval when label + * interval from model is null or 'auto'. + * @param {number} [opt.strokeContainThreshold] Default label interval when label + * @param {number} [opt.silent=true] + */ + var AxisBuilder = function (axisModel, opt) { + + /** + * @readOnly + */ + this.opt = opt; + + /** + * @readOnly + */ + this.axisModel = axisModel; + + // Default value + zrUtil.defaults( + opt, + { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true + } + ); + + /** + * @readOnly + */ + this.group = new graphic.Group({ + position: opt.position.slice(), + rotation: opt.rotation + }); + }; + + AxisBuilder.prototype = { + + constructor: AxisBuilder, + + hasBuilder: function (name) { + return !!builders[name]; + }, + + add: function (name) { + builders[name].call(this); + }, + + getGroup: function () { + return this.group; + } + + }; + + var builders = { + + /** + * @private + */ + axisLine: function () { + var opt = this.opt; + var axisModel = this.axisModel; + + if (!axisModel.get('axisLine.show')) { + return; + } + + var extent = this.axisModel.axis.getExtent(); + + this.group.add(new graphic.Line({ + shape: { + x1: extent[0], + y1: 0, + x2: extent[1], + y2: 0 + }, + style: zrUtil.extend( + {lineCap: 'round'}, + axisModel.getModel('axisLine.lineStyle').getLineStyle() + ), + strokeContainThreshold: opt.strokeContainThreshold, + silent: !!opt.silent, + z2: 1 + })); + }, + + /** + * @private + */ + axisTick: function () { + var axisModel = this.axisModel; + + if (!axisModel.get('axisTick.show')) { + return; + } + + var axis = axisModel.axis; + var tickModel = axisModel.getModel('axisTick'); + var opt = this.opt; + + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickLen = tickModel.get('length'); + var tickInterval = getInterval(tickModel, opt.labelInterval); + var ticksCoords = axis.getTicksCoords(); + var tickLines = []; + + for (var i = 0; i < ticksCoords.length; i++) { + // Only ordinal scale support tick interval + if (ifIgnoreOnTick(axis, i, tickInterval)) { + continue; + } + + var tickCoord = ticksCoords[i]; + + // Tick line + tickLines.push(new graphic.Line(graphic.subPixelOptimizeLine({ + shape: { + x1: tickCoord, + y1: 0, + x2: tickCoord, + y2: opt.tickDirection * tickLen + }, + style: { + lineWidth: lineStyleModel.get('width') + }, + silent: true + }))); + } + + this.group.add(graphic.mergePath(tickLines, { + style: lineStyleModel.getLineStyle(), + z2: 2, + silent: true + })); + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @private + */ + axisLabel: function () { + var axisModel = this.axisModel; + + if (!axisModel.get('axisLabel.show')) { + return; + } + + var opt = this.opt; + var axis = axisModel.axis; + var labelModel = axisModel.getModel('axisLabel'); + var textStyleModel = labelModel.getModel('textStyle'); + var labelMargin = labelModel.get('margin'); + var ticks = axis.scale.getTicks(); + var labels = axisModel.getFormattedLabels(); + + // Special label rotate. + var labelRotation = opt.labelRotation; + if (labelRotation == null) { + labelRotation = labelModel.get('rotate') || 0; + } + // To radian. + labelRotation = labelRotation * PI / 180; + + var labelLayout = innerTextLayout(opt, labelRotation, opt.labelDirection); + var categoryData = axisModel.get('data'); + + var textEls = []; + for (var i = 0; i < ticks.length; i++) { + if (ifIgnoreOnTick(axis, i, opt.labelInterval)) { + continue; + } + + var itemTextStyleModel = textStyleModel; + if (categoryData && categoryData[i] && categoryData[i].textStyle) { + itemTextStyleModel = new Model( + categoryData[i].textStyle, textStyleModel, axisModel.ecModel + ); + } + + var tickCoord = axis.dataToCoord(ticks[i]); + var pos = [ + tickCoord, + opt.labelOffset + opt.labelDirection * labelMargin + ]; + + var textEl = new graphic.Text({ + style: { + text: labels[i], + textAlign: itemTextStyleModel.get('align', true) || labelLayout.textAlign, + textVerticalAlign: itemTextStyleModel.get('baseline', true) || labelLayout.verticalAlign, + textFont: itemTextStyleModel.getFont(), + fill: itemTextStyleModel.getTextColor() + }, + position: pos, + rotation: labelLayout.rotation, + silent: true, + z2: 10 + }); + textEls.push(textEl); + this.group.add(textEl); + } + + function isTwoLabelOverlapped(current, next) { + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + if (firstRect && nextRect) { + firstRect.applyTransform(current.getLocalTransform()); + nextRect.applyTransform(next.getLocalTransform()); + return firstRect.intersect(nextRect); + } + } + if (axis.type !== 'category') { + // If min or max are user set, we need to check + // If the tick on min(max) are overlap on their neighbour tick + // If they are overlapped, we need to hide the min(max) tick label + if (axisModel.getMin ? axisModel.getMin() : axisModel.get('min')) { + var firstLabel = textEls[0]; + var nextLabel = textEls[1]; + if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + firstLabel.ignore = true; + } + } + if (axisModel.getMax ? axisModel.getMax() : axisModel.get('max')) { + var lastLabel = textEls[textEls.length - 1]; + var prevLabel = textEls[textEls.length - 2]; + if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + lastLabel.ignore = true; + } + } + } + }, + + /** + * @private + */ + axisName: function () { + var opt = this.opt; + var axisModel = this.axisModel; + + var name = this.opt.axisName; + // If name is '', do not get name from axisMode. + if (name == null) { + name = axisModel.get('name'); + } + + if (!name) { + return; + } + + var nameLocation = axisModel.get('nameLocation'); + var nameDirection = opt.nameDirection; + var textStyleModel = axisModel.getModel('nameTextStyle'); + var gap = axisModel.get('nameGap') || 0; + + var extent = this.axisModel.axis.getExtent(); + var gapSignal = extent[0] > extent[1] ? -1 : 1; + var pos = [ + nameLocation === 'start' + ? extent[0] - gapSignal * gap + : nameLocation === 'end' + ? extent[1] + gapSignal * gap + : (extent[0] + extent[1]) / 2, // 'middle' + // Reuse labelOffset. + nameLocation === 'middle' ? opt.labelOffset + nameDirection * gap : 0 + ]; + + var labelLayout; + + if (nameLocation === 'middle') { + labelLayout = innerTextLayout(opt, opt.rotation, nameDirection); + } + else { + labelLayout = endTextLayout(opt, nameLocation, extent); + } + + this.group.add(new graphic.Text({ + style: { + text: name, + textFont: textStyleModel.getFont(), + fill: textStyleModel.getTextColor() + || axisModel.get('axisLine.lineStyle.color'), + textAlign: labelLayout.textAlign, + textVerticalAlign: labelLayout.verticalAlign + }, + position: pos, + rotation: labelLayout.rotation, + silent: true, + z2: 1 + })); + } + + }; + + /** + * @inner + */ + function innerTextLayout(opt, textRotation, direction) { + var rotationDiff = remRadian(textRotation - opt.rotation); + var textAlign; + var verticalAlign; + + if (isRadianAroundZero(rotationDiff)) { // Label is parallel with axis line. + verticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } + else if (isRadianAroundZero(rotationDiff - PI)) { // Label is inverse parallel with axis line. + verticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } + else { + verticalAlign = 'middle'; + + if (rotationDiff > 0 && rotationDiff < PI) { + textAlign = direction > 0 ? 'right' : 'left'; + } + else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + verticalAlign: verticalAlign + }; + } + + /** + * @inner + */ + function endTextLayout(opt, textPosition, extent) { + var rotationDiff = remRadian(-opt.rotation); + var textAlign; + var verticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = (textPosition === 'start' && !inverse) + || (textPosition !== 'start' && inverse); + + if (isRadianAroundZero(rotationDiff - PI / 2)) { + verticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } + else if (isRadianAroundZero(rotationDiff - PI * 1.5)) { + verticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } + else { + verticalAlign = 'middle'; + if (rotationDiff < PI * 1.5 && rotationDiff > PI / 2) { + textAlign = onLeft ? 'left' : 'right'; + } + else { + textAlign = onLeft ? 'right' : 'left'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + verticalAlign: verticalAlign + }; + } + + /** + * @static + */ + var ifIgnoreOnTick = AxisBuilder.ifIgnoreOnTick = function (axis, i, interval) { + var rawTick; + var scale = axis.scale; + return scale.type === 'ordinal' + && ( + typeof interval === 'function' + ? ( + rawTick = scale.getTicks()[i], + !interval(rawTick, scale.getLabel(rawTick)) + ) + : i % (interval + 1) + ); + }; + + /** + * @static + */ + var getInterval = AxisBuilder.getInterval = function (model, labelInterval) { + var interval = model.get('interval'); + if (interval == null || interval == 'auto') { + interval = labelInterval; + } + return interval; + }; + + module.exports = AxisBuilder; + + + +/***/ }, +/* 127 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + + __webpack_require__(107); + + __webpack_require__(128); + __webpack_require__(129); + + var barLayoutGrid = __webpack_require__(131); + var echarts = __webpack_require__(1); + + echarts.registerLayout(zrUtil.curry(barLayoutGrid, 'bar')); + // Visual coding for legend + echarts.registerVisualCoding('chart', function (ecModel) { + ecModel.eachSeriesByType('bar', function (seriesModel) { + var data = seriesModel.getData(); + data.setVisual('legendSymbol', 'roundRect'); + }); + }); + + // In case developer forget to include grid component + __webpack_require__(106); + + +/***/ }, +/* 128 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var SeriesModel = __webpack_require__(27); + var createListFromArray = __webpack_require__(93); + + module.exports = SeriesModel.extend({ + + type: 'series.bar', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + return createListFromArray(option.data, this, ecModel); + }, + + getMarkerPosition: function (value) { + var coordSys = this.coordinateSystem; + if (coordSys) { + var pt = coordSys.dataToPoint(value); + var data = this.getData(); + var offset = data.getLayout('offset'); + var size = data.getLayout('size'); + var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1; + pt[offsetIndex] += offset + size / 2; + return pt; + } + return [NaN, NaN]; + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // stack: null + + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + // 最小高度改为0 + barMinHeight: 0, + + // barMaxWidth: null, + // 默认自适应 + // barWidth: null, + // 柱间距离,默认为柱形宽度的30%,可设固定值 + // barGap: '30%', + // 类目间柱形距离,默认为类目间距的20%,可设固定值 + // barCategoryGap: '20%', + // label: { + // normal: { + // show: false + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + + // // 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // // 'inside' | 'insideleft' | 'insideTop' | 'insideRight' | 'insideBottom' | + // // 'outside' |'left' | 'right'|'top'|'bottom' + // position: + + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // } + // }, + itemStyle: { + normal: { + // color: '各异', + // 柱条边线 + barBorderColor: '#fff', + // 柱条边线线宽,单位px,默认为1 + barBorderWidth: 0 + }, + emphasis: { + // color: '各异', + // 柱条边线 + barBorderColor: '#fff', + // 柱条边线线宽,单位px,默认为1 + barBorderWidth: 0 + } + } + } + }); + + +/***/ }, +/* 129 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var graphic = __webpack_require__(42); + + zrUtil.extend(__webpack_require__(8).prototype, __webpack_require__(130)); + + function fixLayoutWithLineWidth(layout, lineWidth) { + var signX = layout.width > 0 ? 1 : -1; + var signY = layout.height > 0 ? 1 : -1; + // In case width or height are too small. + lineWidth = Math.min(lineWidth, Math.abs(layout.width), Math.abs(layout.height)); + layout.x += signX * lineWidth / 2; + layout.y += signY * lineWidth / 2; + layout.width -= signX * lineWidth; + layout.height -= signY * lineWidth; + } + + module.exports = __webpack_require__(1).extendChartView({ + + type: 'bar', + + render: function (seriesModel, ecModel, api) { + var coordinateSystemType = seriesModel.get('coordinateSystem'); + + if (coordinateSystemType === 'cartesian2d') { + this._renderOnCartesian(seriesModel, ecModel, api); + } + + return this.group; + }, + + _renderOnCartesian: function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = baseAxis.isHorizontal(); + + var enableAnimation = seriesModel.get('animation'); + + var barBorderWidthQuery = ['itemStyle', 'normal', 'barBorderWidth']; + + function createRect(dataIndex, isUpdate) { + var layout = data.getItemLayout(dataIndex); + var lineWidth = data.getItemModel(dataIndex).get(barBorderWidthQuery) || 0; + fixLayoutWithLineWidth(layout, lineWidth); + + var rect = new graphic.Rect({ + shape: zrUtil.extend({}, layout) + }); + // Animation + if (enableAnimation) { + var rectShape = rect.shape; + var animateProperty = isHorizontal ? 'height' : 'width'; + var animateTarget = {}; + rectShape[animateProperty] = 0; + animateTarget[animateProperty] = layout[animateProperty]; + graphic[isUpdate? 'updateProps' : 'initProps'](rect, { + shape: animateTarget + }, seriesModel); + } + return rect; + } + data.diff(oldData) + .add(function (dataIndex) { + // 空数据 + if (!data.hasValue(dataIndex)) { + return; + } + + var rect = createRect(dataIndex); + + data.setItemGraphicEl(dataIndex, rect); + + group.add(rect); + + }) + .update(function (newIndex, oldIndex) { + var rect = oldData.getItemGraphicEl(oldIndex); + // 空数据 + if (!data.hasValue(newIndex)) { + group.remove(rect); + return; + } + if (!rect) { + rect = createRect(newIndex, true); + } + + var layout = data.getItemLayout(newIndex); + var lineWidth = data.getItemModel(newIndex).get(barBorderWidthQuery) || 0; + fixLayoutWithLineWidth(layout, lineWidth); + + graphic.updateProps(rect, { + shape: layout + }, seriesModel); + + data.setItemGraphicEl(newIndex, rect); + + // Add back + group.add(rect); + }) + .remove(function (idx) { + var rect = oldData.getItemGraphicEl(idx); + if (rect) { + // Not show text when animating + rect.style.text = ''; + graphic.updateProps(rect, { + shape: { + width: 0 + } + }, seriesModel, function () { + group.remove(rect); + }); + } + }) + .execute(); + + this._updateStyle(seriesModel, data, isHorizontal); + + this._data = data; + }, + + _updateStyle: function (seriesModel, data, isHorizontal) { + function setLabel(style, model, color, labelText, labelPositionOutside) { + graphic.setText(style, model, color); + style.text = labelText; + if (style.textPosition === 'outside') { + style.textPosition = labelPositionOutside; + } + } + + data.eachItemGraphicEl(function (rect, idx) { + var itemModel = data.getItemModel(idx); + var color = data.getItemVisual(idx, 'color'); + var layout = data.getItemLayout(idx); + var itemStyleModel = itemModel.getModel('itemStyle.normal'); + + var hoverStyle = itemModel.getModel('itemStyle.emphasis').getBarItemStyle(); + + rect.setShape('r', itemStyleModel.get('barBorderRadius') || 0); + + rect.setStyle(zrUtil.defaults( + { + fill: color + }, + itemStyleModel.getBarItemStyle() + )); + + var labelPositionOutside = isHorizontal + ? (layout.height > 0 ? 'bottom' : 'top') + : (layout.width > 0 ? 'left' : 'right'); + + var labelModel = itemModel.getModel('label.normal'); + var hoverLabelModel = itemModel.getModel('label.emphasis'); + var rectStyle = rect.style; + if (labelModel.get('show')) { + setLabel( + rectStyle, labelModel, color, + zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'normal'), + seriesModel.getRawValue(idx) + ), + labelPositionOutside + ); + } + else { + rectStyle.text = ''; + } + if (hoverLabelModel.get('show')) { + setLabel( + hoverStyle, hoverLabelModel, color, + zrUtil.retrieve( + seriesModel.getFormattedLabel(idx, 'emphasis'), + seriesModel.getRawValue(idx) + ), + labelPositionOutside + ); + } + else { + hoverStyle.text = ''; + } + graphic.setHoverStyle(rect, hoverStyle); + }); + }, + + remove: function (ecModel, api) { + var group = this.group; + if (ecModel.get('animation')) { + if (this._data) { + this._data.eachItemGraphicEl(function (el) { + // Not show text when animating + el.style.text = ''; + graphic.updateProps(el, { + shape: { + width: 0 + } + }, ecModel, function () { + group.remove(el); + }); + }); + } + } + else { + group.removeAll(); + } + } + }); + + +/***/ }, +/* 130 */ +/***/ function(module, exports, __webpack_require__) { + + + module.exports = { + getBarItemStyle: __webpack_require__(11)( + [ + ['fill', 'color'], + ['stroke', 'borderColor'], + ['lineWidth', 'borderWidth'], + // Compatitable with 2 + ['stroke', 'barBorderColor'], + ['lineWidth', 'barBorderWidth'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] + ) + }; + + +/***/ }, +/* 131 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var zrUtil = __webpack_require__(3); + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + + function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || '__ec_stack_' + seriesModel.seriesIndex; + } + + function calBarWidthAndOffset(barSeries, api) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + + zrUtil.each(barSeries, function (seriesModel, idx) { + var cartesian = seriesModel.coordinateSystem; + + var baseAxis = cartesian.getBaseAxis(); + + var columnsOnAxis = columnsMap[baseAxis.index] || { + remainedWidth: baseAxis.getBandWidth(), + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + axis: baseAxis, + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[baseAxis.index] = columnsOnAxis; + + var stackId = getSeriesStackId(seriesModel); + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + + var barWidth = seriesModel.get('barWidth'); + var barMaxWidth = seriesModel.get('barMaxWidth'); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + // TODO + if (barWidth && ! stacks[stackId].width) { + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + stacks[stackId].width = barWidth; + columnsOnAxis.remainedWidth -= barWidth; + } + + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + (barGap != null) && (columnsOnAxis.gap = barGap); + (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap); + }); + + var result = {}; + + zrUtil.each(columnsMap, function (columnsOnAxis, coordSysName) { + + result[coordSysName] = {}; + + var stacks = columnsOnAxis.stacks; + var baseAxis = columnsOnAxis.axis; + var bandWidth = baseAxis.getBandWidth(); + var categoryGap = parsePercent(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent(columnsOnAxis.gap, 1); + + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + // Find if any auto calculated bar exceeded maxBarWidth + zrUtil.each(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + if (!column.width && maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + remainedWidth -= maxWidth; + column.width = maxWidth; + autoWidthCount--; + } + }); + + // Recalculate width again + autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + var widthSum = 0; + var lastColumn; + zrUtil.each(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + zrUtil.each(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + + offset += column.width * (1 + barGapPercent); + }); + }); + + return result; + } + + /** + * @param {string} seriesType + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + function barLayoutGrid(seriesType, ecModel, api) { + + var barWidthAndOffset = calBarWidthAndOffset( + zrUtil.filter( + ecModel.getSeriesByType(seriesType), + function (seriesModel) { + return !ecModel.isSeriesFiltered(seriesModel) + && seriesModel.coordinateSystem + && seriesModel.coordinateSystem.type === 'cartesian2d'; + } + ) + ); + + var lastStackCoords = {}; + + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + + var stackId = getSeriesStackId(seriesModel); + var columnLayoutInfo = barWidthAndOffset[baseAxis.index][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = cartesian.getOtherAxis(baseAxis); + + var barMinHeight = seriesModel.get('barMinHeight') || 0; + + var valueAxisStart = baseAxis.onZero + ? valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)) + : valueAxis.getGlobalExtent()[0]; + + var coords = cartesian.dataToPoints(data, true); + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + + data.setLayout({ + offset: columnOffset, + size: columnWidth + }); + data.each(valueAxis.dim, function (value, idx) { + // 空数据 + if (isNaN(value)) { + return; + } + if (!lastStackCoords[stackId][idx]) { + lastStackCoords[stackId][idx] = { + // Positive stack + p: valueAxisStart, + // Negative stack + n: valueAxisStart + }; + } + var sign = value >= 0 ? 'p' : 'n'; + var coord = coords[idx]; + var lastCoord = lastStackCoords[stackId][idx][sign]; + var x, y, width, height; + if (valueAxis.isHorizontal()) { + x = lastCoord; + y = coord[1] + columnOffset; + width = coord[0] - lastCoord; + height = columnWidth; + + if (Math.abs(width) < barMinHeight) { + width = (width < 0 ? -1 : 1) * barMinHeight; + } + lastStackCoords[stackId][idx][sign] += width; + } + else { + x = coord[0] + columnOffset; + y = lastCoord; + width = columnWidth; + height = coord[1] - lastCoord; + if (Math.abs(height) < barMinHeight) { + // Include zero to has a positive bar + height = (height <= 0 ? -1 : 1) * barMinHeight; + } + lastStackCoords[stackId][idx][sign] += height; + } + + data.setItemLayout(idx, { + x: x, + y: y, + width: width, + height: height + }); + }, true); + + }, this); + } + + module.exports = barLayoutGrid; + + +/***/ }, +/* 132 */ +/***/ function(module, exports, __webpack_require__) { + + + + var zrUtil = __webpack_require__(3); + var echarts = __webpack_require__(1); + + __webpack_require__(133); + __webpack_require__(135); + + __webpack_require__(136)('pie', [{ + type: 'pieToggleSelect', + event: 'pieselectchanged', + method: 'toggleSelected' + }, { + type: 'pieSelect', + event: 'pieselected', + method: 'select' + }, { + type: 'pieUnSelect', + event: 'pieunselected', + method: 'unSelect' + }]); + + echarts.registerVisualCoding( + 'chart', zrUtil.curry(__webpack_require__(137), 'pie') + ); + + echarts.registerLayout(zrUtil.curry( + __webpack_require__(138), 'pie' + )); + + echarts.registerProcessor( + 'filter', zrUtil.curry(__webpack_require__(140), 'pie') + ); + + +/***/ }, +/* 133 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + + var List = __webpack_require__(94); + var zrUtil = __webpack_require__(3); + var modelUtil = __webpack_require__(5); + var completeDimensions = __webpack_require__(96); + + var dataSelectableMixin = __webpack_require__(134); + + var PieSeries = __webpack_require__(1).extendSeriesModel({ + + type: 'series.pie', + + // Overwrite + init: function (option) { + PieSeries.superApply(this, 'init', arguments); + + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this._dataBeforeProcessed; + }; + + this.updateSelectedMap(); + + this._defaultLabelLine(option); + }, + + // Overwrite + mergeOption: function (newOption) { + PieSeries.superCall(this, 'mergeOption', newOption); + this.updateSelectedMap(); + }, + + getInitialData: function (option, ecModel) { + var dimensions = completeDimensions(['value'], option.data); + var list = new List(dimensions, this); + list.initData(option.data); + return list; + }, + + // Overwrite + getDataParams: function (dataIndex) { + var data = this._data; + var params = PieSeries.superCall(this, 'getDataParams', dataIndex); + var sum = data.getSum('value'); + // FIXME toFixed? + // + // Percent is 0 if sum is 0 + params.percent = !sum ? 0 : +(data.get('value', dataIndex) / sum * 100).toFixed(2); + + params.$vars.push('percent'); + return params; + }, + + _defaultLabelLine: function (option) { + // Extend labelLine emphasis + modelUtil.defaultEmphasis(option.labelLine, ['show']); + + var labelLineNormalOpt = option.labelLine.normal; + var labelLineEmphasisOpt = option.labelLine.emphasis; + // Not show label line if `label.normal.show = false` + labelLineNormalOpt.show = labelLineNormalOpt.show + && option.label.normal.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show + && option.label.emphasis.show; + }, + + defaultOption: { + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // 选中是扇区偏移量 + selectedOffset: 10, + + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + + label: { + normal: { + // If rotate around circle + rotate: false, + show: true, + // 'outer', 'inside', 'center' + position: 'outer' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // textStyle: null // 默认使用全局文本样式,详见TEXTSTYLE + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + }, + emphasis: {} + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + normal: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + } + }, + itemStyle: { + normal: { + // color: 各异, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 1 + }, + emphasis: { + // color: 各异, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 1 + } + }, + + animationEasing: 'cubicOut', + + data: [] + } + }); + + zrUtil.mixin(PieSeries, dataSelectableMixin); + + module.exports = PieSeries; + + +/***/ }, +/* 134 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * Data selectable mixin for chart series. + * To eanble data select, option of series must have `selectedMode`. + * And each data item will use `selected` to toggle itself selected status + * + * @module echarts/chart/helper/DataSelectable + */ + + + var zrUtil = __webpack_require__(3); + + module.exports = { + + updateSelectedMap: function () { + var option = this.option; + this._dataOptMap = zrUtil.reduce(option.data, function (dataOptMap, dataOpt) { + dataOptMap[dataOpt.name] = dataOpt; + return dataOptMap; + }, {}); + }, + /** + * @param {string} name + */ + // PENGING If selectedMode is null ? + select: function (name) { + var dataOptMap = this._dataOptMap; + var dataOpt = dataOptMap[name]; + var selectedMode = this.get('selectedMode'); + if (selectedMode === 'single') { + zrUtil.each(dataOptMap, function (dataOpt) { + dataOpt.selected = false; + }); + } + dataOpt && (dataOpt.selected = true); + }, + + /** + * @param {string} name + */ + unSelect: function (name) { + var dataOpt = this._dataOptMap[name]; + // var selectedMode = this.get('selectedMode'); + // selectedMode !== 'single' && dataOpt && (dataOpt.selected = false); + dataOpt && (dataOpt.selected = false); + }, + + /** + * @param {string} name + */ + toggleSelected: function (name) { + var dataOpt = this._dataOptMap[name]; + if (dataOpt != null) { + this[dataOpt.selected ? 'unSelect' : 'select'](name); + return dataOpt.selected; + } + }, + + /** + * @param {string} name + */ + isSelected: function (name) { + var dataOpt = this._dataOptMap[name]; + return dataOpt && dataOpt.selected; + } + }; + + +/***/ }, +/* 135 */ +/***/ function(module, exports, __webpack_require__) { + + + + var graphic = __webpack_require__(42); + var zrUtil = __webpack_require__(3); + + /** + * @param {module:echarts/model/Series} seriesModel + * @param {boolean} hasAnimation + * @inner + */ + function updateDataSelected(uid, seriesModel, hasAnimation, api) { + var data = seriesModel.getData(); + var dataIndex = this.dataIndex; + var name = data.getName(dataIndex); + var selectedOffset = seriesModel.get('selectedOffset'); + + api.dispatchAction({ + type: 'pieToggleSelect', + from: uid, + name: name, + seriesId: seriesModel.id + }); + + data.each(function (idx) { + toggleItemSelected( + data.getItemGraphicEl(idx), + data.getItemLayout(idx), + seriesModel.isSelected(data.getName(idx)), + selectedOffset, + hasAnimation + ); + }); + } + + /** + * @param {module:zrender/graphic/Sector} el + * @param {Object} layout + * @param {boolean} isSelected + * @param {number} selectedOffset + * @param {boolean} hasAnimation + * @inner + */ + function toggleItemSelected(el, layout, isSelected, selectedOffset, hasAnimation) { + var midAngle = (layout.startAngle + layout.endAngle) / 2; + + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var offset = isSelected ? selectedOffset : 0; + var position = [dx * offset, dy * offset]; + + hasAnimation + // animateTo will stop revious animation like update transition + ? el.animate() + .when(200, { + position: position + }) + .start('bounceOut') + : el.attr('position', position); + } + + /** + * Piece of pie including Sector, Label, LabelLine + * @constructor + * @extends {module:zrender/graphic/Group} + */ + function PiePiece(data, idx) { + + graphic.Group.call(this); + + var sector = new graphic.Sector({ + z2: 2 + }); + var polyline = new graphic.Polyline(); + var text = new graphic.Text(); + this.add(sector); + this.add(polyline); + this.add(text); + + this.updateData(data, idx, true); + + // Hover to change label and labelLine + function onEmphasis() { + polyline.ignore = polyline.hoverIgnore; + text.ignore = text.hoverIgnore; + } + function onNormal() { + polyline.ignore = polyline.normalIgnore; + text.ignore = text.normalIgnore; + } + this.on('emphasis', onEmphasis) + .on('normal', onNormal) + .on('mouseover', onEmphasis) + .on('mouseout', onNormal); + } + + var piePieceProto = PiePiece.prototype; + + function getLabelStyle(data, idx, state, labelModel, labelPosition) { + var textStyleModel = labelModel.getModel('textStyle'); + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + return { + fill: textStyleModel.getTextColor() + || (isLabelInside ? '#fff' : data.getItemVisual(idx, 'color')), + textFont: textStyleModel.getFont(), + text: zrUtil.retrieve( + data.hostModel.getFormattedLabel(idx, state), data.getName(idx) + ) + }; + } + + piePieceProto.updateData = function (data, idx, firstCreate) { + + var sector = this.childAt(0); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var sectorShape = zrUtil.extend({}, layout); + sectorShape.label = null; + if (firstCreate) { + sector.setShape(sectorShape); + sector.shape.endAngle = layout.startAngle; + graphic.updateProps(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel); + } + else { + graphic.updateProps(sector, { + shape: sectorShape + }, seriesModel); + } + + // Update common style + var itemStyleModel = itemModel.getModel('itemStyle'); + var visualColor = data.getItemVisual(idx, 'color'); + + sector.setStyle( + zrUtil.defaults( + { + fill: visualColor + }, + itemStyleModel.getModel('normal').getItemStyle() + ) + ); + sector.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle(); + + // Toggle selected + toggleItemSelected( + this, + data.getItemLayout(idx), + itemModel.get('selected'), + seriesModel.get('selectedOffset'), + seriesModel.get('animation') + ); + + function onEmphasis() { + // Sector may has animation of updating data. Force to move to the last frame + // Or it may stopped on the wrong shape + sector.stopAnimation(true); + sector.animateTo({ + shape: { + r: layout.r + 10 + } + }, 300, 'elasticOut'); + } + function onNormal() { + sector.stopAnimation(true); + sector.animateTo({ + shape: { + r: layout.r + } + }, 300, 'elasticOut'); + } + sector.off('mouseover').off('mouseout').off('emphasis').off('normal'); + if (itemModel.get('hoverAnimation')) { + sector + .on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + } + + this._updateLabel(data, idx); + + graphic.setHoverStyle(this); + }; + + piePieceProto._updateLabel = function (data, idx) { + + var labelLine = this.childAt(1); + var labelText = this.childAt(2); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var visualColor = data.getItemVisual(idx, 'color'); + + graphic.updateProps(labelLine, { + shape: { + points: labelLayout.linePoints || [ + [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y] + ] + } + }, seriesModel); + + graphic.updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel); + labelText.attr({ + style: { + textVerticalAlign: labelLayout.verticalAlign, + textAlign: labelLayout.textAlign, + textFont: labelLayout.font + }, + rotation: labelLayout.rotation, + origin: [labelLayout.x, labelLayout.y], + z2: 10 + }); + + var labelModel = itemModel.getModel('label.normal'); + var labelHoverModel = itemModel.getModel('label.emphasis'); + var labelLineModel = itemModel.getModel('labelLine.normal'); + var labelLineHoverModel = itemModel.getModel('labelLine.emphasis'); + var labelPosition = labelModel.get('position') || labelHoverModel.get('position'); + + labelText.setStyle(getLabelStyle(data, idx, 'normal', labelModel, labelPosition)); + + labelText.ignore = labelText.normalIgnore = !labelModel.get('show'); + labelText.hoverIgnore = !labelHoverModel.get('show'); + + labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show'); + labelLine.hoverIgnore = !labelLineHoverModel.get('show'); + + // Default use item visual color + labelLine.setStyle({ + stroke: visualColor + }); + labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle()); + + labelText.hoverStyle = getLabelStyle(data, idx, 'emphasis', labelHoverModel, labelPosition); + labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle(); + + var smooth = labelLineModel.get('smooth'); + if (smooth && smooth === true) { + smooth = 0.4; + } + labelLine.setShape({ + smooth: smooth + }); + }; + + zrUtil.inherits(PiePiece, graphic.Group); + + + // Pie view + var Pie = __webpack_require__(41).extend({ + + type: 'pie', + + init: function () { + var sectorGroup = new graphic.Group(); + this._sectorGroup = sectorGroup; + }, + + render: function (seriesModel, ecModel, api, payload) { + if (payload && (payload.from === this.uid)) { + return; + } + + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + + var hasAnimation = ecModel.get('animation'); + var isFirstRender = !oldData; + + var onSectorClick = zrUtil.curry( + updateDataSelected, this.uid, seriesModel, hasAnimation, api + ); + + var selectedMode = seriesModel.get('selectedMode'); + + data.diff(oldData) + .add(function (idx) { + var piePiece = new PiePiece(data, idx); + if (isFirstRender) { + piePiece.eachChild(function (child) { + child.stopAnimation(true); + }); + } + + selectedMode && piePiece.on('click', onSectorClick); + + data.setItemGraphicEl(idx, piePiece); + + group.add(piePiece); + }) + .update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + + piePiece.updateData(data, newIdx); + + piePiece.off('click'); + selectedMode && piePiece.on('click', onSectorClick); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }) + .remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + group.remove(piePiece); + }) + .execute(); + + if (hasAnimation && isFirstRender && data.count() > 0) { + var shape = data.getItemLayout(0); + var r = Math.max(api.getWidth(), api.getHeight()) / 2; + + var removeClipPath = zrUtil.bind(group.removeClipPath, group); + group.setClipPath(this._createClipPath( + shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel + )); + } + + this._data = data; + }, + + _createClipPath: function ( + cx, cy, r, startAngle, clockwise, cb, seriesModel + ) { + var clipPath = new graphic.Sector({ + shape: { + cx: cx, + cy: cy, + r0: 0, + r: r, + startAngle: startAngle, + endAngle: startAngle, + clockwise: clockwise + } + }); + + graphic.initProps(clipPath, { + shape: { + endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2 + } + }, seriesModel, cb); + + return clipPath; + } + }); + + module.exports = Pie; + + +/***/ }, +/* 136 */ +/***/ function(module, exports, __webpack_require__) { + + + var echarts = __webpack_require__(1); + var zrUtil = __webpack_require__(3); + module.exports = function (seriesType, actionInfos) { + zrUtil.each(actionInfos, function (actionInfo) { + actionInfo.update = 'updateView'; + /** + * @payload + * @property {string} seriesName + * @property {string} name + */ + echarts.registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + ecModel.eachComponent( + {mainType: 'series', subType: seriesType, query: payload}, + function (seriesModel) { + if (seriesModel[actionInfo.method]) { + seriesModel[actionInfo.method](payload.name); + } + var data = seriesModel.getData(); + // Create selected map + data.each(function (idx) { + var name = data.getName(idx); + selected[name] = seriesModel.isSelected(name) || false; + }); + } + ); + return { + name: payload.name, + selected: selected + }; + }); + }); + }; + + +/***/ }, +/* 137 */ +/***/ function(module, exports) { + + // Pick color from palette for each data item + + + module.exports = function (seriesType, ecModel) { + var globalColorList = ecModel.get('color'); + var offset = 0; + ecModel.eachRawSeriesByType(seriesType, function (seriesModel) { + var colorList = seriesModel.get('color', true); + var dataAll = seriesModel.getRawData(); + if (!ecModel.isSeriesFiltered(seriesModel)) { + var data = seriesModel.getData(); + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var rawIdx = data.getRawIndex(idx); + // If series.itemStyle.normal.color is a function. itemVisual may be encoded + var singleDataColor = data.getItemVisual(idx, 'color', true); + if (!singleDataColor) { + var paletteColor = colorList ? colorList[rawIdx % colorList.length] + : globalColorList[(rawIdx + offset) % globalColorList.length]; + var color = itemModel.get('itemStyle.normal.color') || paletteColor; + // Legend may use the visual info in data before processed + dataAll.setItemVisual(rawIdx, 'color', color); + data.setItemVisual(idx, 'color', color); + } + else { + // Set data all color for legend + dataAll.setItemVisual(rawIdx, 'color', singleDataColor); + } + }); + } + offset += dataAll.count(); + }); + }; + + +/***/ }, +/* 138 */ +/***/ function(module, exports, __webpack_require__) { + + // TODO minAngle + + + + var numberUtil = __webpack_require__(7); + var parsePercent = numberUtil.parsePercent; + var labelLayout = __webpack_require__(139); + var zrUtil = __webpack_require__(3); + + var PI2 = Math.PI * 2; + var RADIAN = Math.PI / 180; + + module.exports = function (seriesType, ecModel, api) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!zrUtil.isArray(radius)) { + radius = [0, radius]; + } + if (!zrUtil.isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent(center[0], width); + var cy = parsePercent(center[1], height); + var r0 = parsePercent(radius[0], size / 2); + var r = parsePercent(radius[1], size / 2); + + var data = seriesModel.getData(); + + var startAngle = -seriesModel.get('startAngle') * RADIAN; + + var minAngle = seriesModel.get('minAngle') * RADIAN; + + var sum = data.getSum('value'); + // Sum may be 0 + var unitRadian = Math.PI / (sum || data.count()) * 2; + + var clockwise = seriesModel.get('clockwise'); + + var roseType = seriesModel.get('roseType'); + + // [0...max] + var extent = data.getDataExtent('value'); + extent[0] = 0; + + // In the case some sector angle is smaller than minAngle + var restAngle = PI2; + var valueSumLargerThanMinAngle = 0; + + var currentAngle = startAngle; + + var dir = clockwise ? 1 : -1; + data.each('value', function (value, idx) { + var angle; + // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + if (roseType !== 'area') { + angle = sum === 0 ? unitRadian : (value * unitRadian); + } + else { + angle = PI2 / (data.count() || 1); + } + + if (angle < minAngle) { + angle = minAngle; + restAngle -= minAngle; + } + else { + valueSumLargerThanMinAngle += value; + } + + var endAngle = currentAngle + dir * angle; + data.setItemLayout(idx, { + angle: angle, + startAngle: currentAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType + ? numberUtil.linearMap(value, extent, [r0, r]) + : r + }); + + currentAngle = endAngle; + }, true); + + // Some sector is constrained by minAngle + // Rest sectors needs recalculate angle + if (restAngle < PI2) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle + if (restAngle <= 1e-3) { + var angle = PI2 / data.count(); + data.each(function (idx) { + var layout = data.getItemLayout(idx); + layout.startAngle = startAngle + dir * idx * angle; + layout.endAngle = startAngle + dir * (idx + 1) * angle; + }); + } + else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each('value', function (value, idx) { + var layout = data.getItemLayout(idx); + var angle = layout.angle === minAngle + ? minAngle : value * unitRadian; + layout.startAngle = currentAngle; + layout.endAngle = currentAngle + dir * angle; + currentAngle += angle; + }); + } + } + + labelLayout(seriesModel, r, width, height); + }); + }; + + +/***/ }, +/* 139 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + // FIXME emphasis label position is not same with normal label position + + + var textContain = __webpack_require__(14); + + function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) { + list.sort(function (a, b) { + return a.y - b.y; + }); + + // 压 + function shiftDown(start, end, delta, dir) { + for (var j = start; j < end; j++) { + list[j].y += delta; + if (j > start + && j + 1 < end + && list[j + 1].y > list[j].y + list[j].height + ) { + shiftUp(j, delta / 2); + return; + } + } + + shiftUp(end - 1, delta / 2); + } + + // 弹 + function shiftUp(end, delta) { + for (var j = end; j >= 0; j--) { + list[j].y -= delta; + if (j > 0 + && list[j].y > list[j - 1].y + list[j - 1].height + ) { + break; + } + } + } + + function changeX(list, isDownList, cx, cy, r, dir) { + var lastDeltaX = dir > 0 + ? isDownList // 右侧 + ? Number.MAX_VALUE // 下 + : 0 // 上 + : isDownList // 左侧 + ? Number.MAX_VALUE // 下 + : 0; // 上 + + for (var i = 0, l = list.length; i < l; i++) { + // Not change x for center label + if (list[i].position === 'center') { + continue; + } + var deltaY = Math.abs(list[i].y - cy); + var length = list[i].len; + var length2 = list[i].len2; + var deltaX = (deltaY < r + length) + ? Math.sqrt( + (r + length + length2) * (r + length + length2) + - deltaY * deltaY + ) + : Math.abs(list[i].x - cx); + if (isDownList && deltaX >= lastDeltaX) { + // 右下,左下 + deltaX = lastDeltaX - 10; + } + if (!isDownList && deltaX <= lastDeltaX) { + // 右上,左上 + deltaX = lastDeltaX + 10; + } + + list[i].x = cx + deltaX * dir; + lastDeltaX = deltaX; + } + } + + var lastY = 0; + var delta; + var len = list.length; + var upList = []; + var downList = []; + for (var i = 0; i < len; i++) { + delta = list[i].y - lastY; + if (delta < 0) { + shiftDown(i, len, -delta, dir); + } + lastY = list[i].y + list[i].height; + } + if (viewHeight - lastY < 0) { + shiftUp(len - 1, lastY - viewHeight); + } + for (var i = 0; i < len; i++) { + if (list[i].y >= cy) { + downList.push(list[i]); + } + else { + upList.push(list[i]); + } + } + changeX(upList, false, cx, cy, r, dir); + changeX(downList, true, cx, cy, r, dir); + } + + function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) { + var leftList = []; + var rightList = []; + for (var i = 0; i < labelLayoutList.length; i++) { + if (labelLayoutList[i].x < cx) { + leftList.push(labelLayoutList[i]); + } + else { + rightList.push(labelLayoutList[i]); + } + } + + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight); + + for (var i = 0; i < labelLayoutList.length; i++) { + var linePoints = labelLayoutList[i].linePoints; + if (linePoints) { + var dist = linePoints[1][0] - linePoints[2][0]; + if (labelLayoutList[i].x < cx) { + linePoints[2][0] = labelLayoutList[i].x + 3; + } + else { + linePoints[2][0] = labelLayoutList[i].x - 3; + } + linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y; + linePoints[1][0] = linePoints[2][0] + dist; + } + } + } + + module.exports = function (seriesModel, r, viewWidth, viewHeight) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + + data.each(function (idx) { + var layout = data.getItemLayout(idx); + + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label.normal'); + // Use position in normal or emphasis + var labelPosition = labelModel.get('position') || itemModel.get('label.emphasis.position'); + + var labelLineModel = itemModel.getModel('labelLine.normal'); + var labelLineLen = labelLineModel.get('length'); + var labelLineLen2 = labelLineModel.get('length2'); + + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var textX; + var textY; + var linePoints; + var textAlign; + + cx = layout.cx; + cy = layout.cy; + + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + if (labelPosition === 'center') { + textX = layout.cx; + textY = layout.cy; + textAlign = 'center'; + } + else { + var x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx; + var y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy; + + textX = x1 + dx * 3; + textY = y1 + dy * 3; + + if (!isLabelInside) { + // For roseType + var x2 = x1 + dx * (labelLineLen + r - layout.r); + var y2 = y1 + dy * (labelLineLen + r - layout.r); + var x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2); + var y3 = y2; + + textX = x3 + (dx < 0 ? -5 : 5); + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + + textAlign = isLabelInside ? 'center' : (dx > 0 ? 'left' : 'right'); + } + var font = labelModel.getModel('textStyle').getFont(); + + var labelRotate = labelModel.get('rotate') + ? (dx < 0 ? -midAngle + Math.PI : -midAngle) : 0; + var text = seriesModel.getFormattedLabel(idx, 'normal') + || data.getName(idx); + var textRect = textContain.getBoundingRect( + text, font, textAlign, 'top' + ); + hasLabelRotate = !!labelRotate; + layout.label = { + x: textX, + y: textY, + position: labelPosition, + height: textRect.height, + len: labelLineLen, + len2: labelLineLen2, + linePoints: linePoints, + textAlign: textAlign, + verticalAlign: 'middle', + font: font, + rotation: labelRotate + }; + + // Not layout the inside label + if (!isLabelInside) { + labelLayoutList.push(layout.label); + } + }); + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight); + } + }; + + +/***/ }, +/* 140 */ +/***/ function(module, exports) { + + + module.exports = function (seriesType, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (!legendModels || !legendModels.length) { + return; + } + ecModel.eachSeriesByType(seriesType, function (series) { + var data = series.getData(); + data.filterSelf(function (idx) { + var name = data.getName(idx); + // If in any legend component the status is not selected. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(name)) { + return false; + } + } + return true; + }, this); + }, this); + }; + + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.simple.min.js b/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.simple.min.js new file mode 100644 index 0000000..76c78ed --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/echarts/echarts.simple.min.js @@ -0,0 +1,24 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.echarts=e():t.echarts=e()}(this,function(){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={exports:{},id:i,loaded:!1};return t[i].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p="",e(0)}([function(t,e,n){t.exports=n(2),n(85),n(79),n(90),n(34)},function(t,e,n){function i(t){if("object"==typeof t&&null!==t){var e=t;if(t instanceof Array){e=[];for(var n=0,r=t.length;r>n;n++)e[n]=i(t[n])}else if(!C(t)&&!T(t)){e={};for(var a in t)t.hasOwnProperty(a)&&(e[a]=i(t[a]))}return e}return t}function r(t,e,n){if(!S(e)||!S(t))return n?i(e):t;for(var a in e)if(e.hasOwnProperty(a)){var o=t[a],s=e[a];!S(s)||!S(o)||b(s)||b(o)||T(s)||T(o)||C(s)||C(o)?!n&&a in t||(t[a]=i(e[a],!0)):r(o,s,n)}return t}function a(t,e){for(var n=t[0],i=1,a=t.length;a>i;i++)n=r(n,t[i],e);return n}function o(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function s(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function h(){return document.createElement("canvas")}function l(){return L||(L=V.createCanvas().getContext("2d")),L}function u(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;i>n;n++)if(t[n]===e)return n}return-1}function c(t,e){function n(){}var i=t.prototype;n.prototype=e.prototype,t.prototype=new n;for(var r in i)t.prototype[r]=i[r];t.prototype.constructor=t,t.superClass=e}function f(t,e,n){t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,s(t,e,n)}function d(t){return t?"string"==typeof t?!1:"number"==typeof t.length:void 0}function p(t,e,n){if(t&&e)if(t.forEach&&t.forEach===E)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;r>i;i++)e.call(n,t[i],i,t);else for(var a in t)t.hasOwnProperty(a)&&e.call(n,t[a],a,t)}function g(t,e,n){if(t&&e){if(t.map&&t.map===N)return t.map(e,n);for(var i=[],r=0,a=t.length;a>r;r++)i.push(e.call(n,t[r],r,t));return i}}function v(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===F)return t.reduce(e,n,i);for(var r=0,a=t.length;a>r;r++)n=e.call(i,n,t[r],r,t);return n}}function m(t,e,n){if(t&&e){if(t.filter&&t.filter===B)return t.filter(e,n);for(var i=[],r=0,a=t.length;a>r;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function y(t,e,n){if(t&&e)for(var i=0,r=t.length;r>i;i++)if(e.call(n,t[i],i,t))return t[i]}function x(t,e){var n=R.call(arguments,2);return function(){return t.apply(e,n.concat(R.call(arguments)))}}function _(t){var e=R.call(arguments,1);return function(){return t.apply(this,e.concat(R.call(arguments)))}}function b(t){return"[object Array]"===O.call(t)}function w(t){return"function"==typeof t}function M(t){return"[object String]"===O.call(t)}function S(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function C(t){return!!D[O.call(t)]||t instanceof P}function T(t){return t&&1===t.nodeType&&"string"==typeof t.nodeName}function A(t){for(var e=0,n=arguments.length;n>e;e++)if(null!=arguments[e])return arguments[e]}function k(){return Function.call.apply(R,arguments)}function I(t,e){if(!t)throw new Error(e)}var L,P=n(16),D={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1},O=Object.prototype.toString,z=Array.prototype,E=z.forEach,B=z.filter,R=z.slice,N=z.map,F=z.reduce,V={inherits:c,mixin:f,clone:i,merge:r,mergeAll:a,extend:o,defaults:s,getContext:l,createCanvas:h,indexOf:u,slice:k,find:y,isArrayLike:d,each:p,map:g,reduce:v,filter:m,bind:x,curry:_,isArray:b,isString:M,isObject:S,isFunction:w,isBuildInObject:C,isDom:T,retrieve:A,assert:I,noop:function(){}};t.exports=V},function(t,e,n){function i(t){return function(e,n,i){e=e&&e.toLowerCase(),I.prototype[t].call(this,e,n,i)}}function r(){I.call(this)}function a(t,e,n){n=n||{},"string"==typeof e&&(e=W[e]),e&&L(G,function(t){t(e)}),this.id,this.group,this._dom=t,this._zr=C.init(t,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio}),this._theme=T.clone(e),this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._api=new m(this),this._coordSysMgr=new y,I.call(this),this._messageCenter=new r,this._initEvents(),this.resize=T.bind(this.resize,this)}function o(t,e){var n=this._model;n&&n.eachComponent({mainType:"series",query:e},function(i,r){var a=this._chartsMap[i.__viewId];a&&a.__alive&&a[t](i,n,this._api,e)},this)}function s(t,e,n){var i=this._api;L(this._componentsViews,function(r){var a=r.__model;r[t](a,e,i,n),p(a,r)},this),e.eachSeries(function(r,a){var o=this._chartsMap[r.__viewId];o[t](r,e,i,n),p(r,o)},this)}function h(t,e){for(var n="component"===t,i=n?this._componentsViews:this._chartsViews,r=n?this._componentsMap:this._chartsMap,a=this._zr,o=0;o=0?"white":n,a=e.getModel("textStyle");d.extend(t,{textDistance:e.getShallow("distance")||5,textFont:a.getFont(),textPosition:i,textFill:a.getTextColor()||r})},b.updateProps=d.curry(f,!0),b.initProps=d.curry(f,!1),b.getTransform=function(t,e){for(var n=y.identity([]);t&&t!==e;)y.mul(n,t.getLocalTransform(),n),t=t.parent;return n},b.applyTransform=function(t,e,n){return n&&(e=y.invert([],e)),x.applyTransform([],t,e)},b.transformDirection=function(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return a=b.applyTransform(a,e,n),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"},t.exports=b},function(t,e){function n(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}var i={},r=1e-4;i.linearMap=function(t,e,n,i){var r=e[1]-e[0];if(0===r)return(n[0]+n[1])/2;var a=(t-e[0])/r;return i&&(a=Math.min(Math.max(a,0),1)),a*(n[1]-n[0])+n[0]},i.parsePercent=function(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?n(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t},i.round=function(t){return+(+t).toFixed(12)},i.asc=function(t){return t.sort(function(t,e){return t-e}),t},i.getPrecision=function(t){if(isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n},i.getPixelPrecision=function(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),a=Math.round(n(Math.abs(e[1]-e[0]))/i);return Math.max(-r+a,0)},i.MAX_SAFE_INTEGER=9007199254740991,i.remRadian=function(t){var e=2*Math.PI;return(t%e+e)%e},i.isRadianAroundZero=function(t){return t>-r&&r>t},i.parseDate=function(t){return t instanceof Date?t:new Date("string"==typeof t?t.replace(/-/g,"/"):Math.round(t))},i.nice=function(t,e){var n,i=Math.floor(Math.log(t)/Math.LN10),r=Math.pow(10,i),a=t/r;return n=e?1.5>a?1:2.5>a?2:4>a?3:7>a?5:10:1>a?1:2>a?2:3>a?3:5>a?5:10,n*r},t.exports=i},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(t,e){var i=new n(2);return i[0]=t||0,i[1]=e||0,i},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t},clone:function(t){var e=new n(2);return e[0]=t[0],e[1]=t[1],e},set:function(t,e,n){return t[0]=e,t[1]=n,t},add:function(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t},scaleAndAdd:function(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t},sub:function(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t},len:function(t){return Math.sqrt(this.lenSquare(t))},lenSquare:function(t){return t[0]*t[0]+t[1]*t[1]},mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:function(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t},normalize:function(t,e){var n=i.len(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t},distance:function(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))},distanceSquare:function(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])},negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t},applyTransform:function(t,e,n){var i=e[0],r=e[1];return t[0]=n[0]*i+n[2]*r+n[4],t[1]=n[1]*i+n[3]*r+n[5],t},min:function(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t},max:function(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}};i.length=i.len,i.lengthSquare=i.lenSquare,i.dist=i.distance,i.distSquare=i.distanceSquare,t.exports=i},function(t,e,n){function i(t){var e=t.fill;return null!=e&&"none"!==e}function r(t){var e=t.stroke;return null!=e&&"none"!==e&&t.lineWidth>0}function a(t){o.call(this,t),this.path=new h}var o=n(35),s=n(1),h=n(27),l=n(137),u=n(16),c=Math.abs;a.prototype={constructor:a,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t){t.save();var e=this.style,n=this.path,a=r(e),o=i(e);this.__dirtyPath&&(o&&e.fill instanceof u&&e.fill.updateCanvasGradient(this,t),a&&e.stroke instanceof u&&e.stroke.updateCanvasGradient(this,t)),e.bind(t,this),this.setTransform(t);var s=e.lineDash,h=e.lineDashOffset,l=!!t.setLineDash;this.__dirtyPath||s&&!l&&a?(n=this.path.beginPath(t),s&&!l&&(n.setLineDash(s),n.setLineDashOffset(h)),this.buildPath(n,this.shape),this.__dirtyPath=!1):(t.beginPath(),this.path.rebuildPath(t)),o&&n.fill(t),s&&l&&(t.setLineDash(s),t.lineDashOffset=h),a&&n.stroke(t),null!=e.text&&this.drawRectText(t,this.getBoundingRect()),t.restore()},buildPath:function(t,e){},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var a=this.path;this.__dirtyPath&&(a.beginPath(),this.buildPath(a,this.shape)),t=a.getBoundingRect()}if(this._rect=t,r(e)){var o=this._rectWithStroke;if(this.__dirty||n){var o=this._rectWithStroke||(this._rectWithStroke=t.clone());o.copy(t);var s=e.lineWidth,h=e.strokeNoScale?this.getLineScale():1;i(e)||(s=Math.max(s,this.strokeContainThreshold)),h>1e-10&&(o.width+=s/h,o.height+=s/h,o.x-=s/h/2,o.y-=s/h/2)}return o}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),a=this.getBoundingRect(),o=this.style;if(t=n[0],e=n[1],a.contain(t,e)){var s=this.path.data;if(r(o)){var h=o.lineWidth,u=o.strokeNoScale?this.getLineScale():1;if(u>1e-10&&(i(o)||(h=Math.max(h,this.strokeContainThreshold)),l.containStroke(s,h/u,t,e)))return!0}if(i(o))return l.contain(s,t,e)}return!1},dirty:function(t){0===arguments.length&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?this.setShape(e):o.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(s.isObject(t))for(var i in t)n[i]=t[i];else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&c(t[0]-1)>1e-10&&c(t[3]-1)>1e-10?Math.sqrt(c(t[0]*t[3]-t[2]*t[1])):1}},a.extend=function(t){var e=function(e){a.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var n=t.shape;if(n){this.shape=this.shape||{};var i=this.shape;for(var r in n)!i.hasOwnProperty(r)&&n.hasOwnProperty(r)&&(i[r]=n[r])}t.init&&t.init.call(this,e)};s.inherits(e,a);for(var n in t)"style"!==n&&"shape"!==n&&(e.prototype[n]=t[n]);return e},s.inherits(a,o),t.exports=a},function(t,e,n){var i=n(9),r=n(4),a=n(1),o=n(12),s=["x","y","z","radius","angle"],h={};h.createNameEach=function(t,e){t=t.slice();var n=a.map(t,h.capitalFirst);e=(e||[]).slice();var i=a.map(e,h.capitalFirst);return function(r,o){a.each(t,function(t,a){for(var s={name:t,capital:n[a]},h=0;h=0}function r(t,i){var r=!1;return e(function(e){a.each(n(t,e)||[],function(t){i.records[e.name][t]&&(r=!0)})}),r}function o(t,i){i.nodes.push(t),e(function(e){a.each(n(t,e)||[],function(t){i.records[e.name][t]=!0})})}return function(n){function a(t){!i(t,s)&&r(t,s)&&(o(t,s),h=!0)}var s={nodes:[],records:{}};if(e(function(t){s.records[t.name]={}}),!n)return s;o(n,s);var h;do h=!1,t(a);while(h);return s}},h.defaultEmphasis=function(t,e){if(t){var n=t.emphasis=t.emphasis||{},i=t.normal=t.normal||{};a.each(e,function(t){var e=a.retrieve(n[t],i[t]);null!=e&&(n[t]=e)})}},h.createDataFormatModel=function(t,e,n){var i=new o;return a.mixin(i,h.dataFormatMixin),i.seriesIndex=t.seriesIndex,i.name=t.name||"",i.getData=function(){return e},i.getRawDataArray=function(){return n},i},h.getDataItemValue=function(t){return t&&(null==t.value?t:t.value)},h.converDataValue=function(t,e){var n=e&&e.type;return"ordinal"===n?t:("time"!==n||isFinite(t)||null==t||"-"===t||(t=+r.parseDate(t)),null==t||""===t?NaN:+t)},h.dataFormatMixin={getDataParams:function(t){var e=this.getData(),n=this.seriesIndex,i=this.name,r=this.getRawValue(t),a=e.getRawIndex(t),o=e.getName(t,!0),s=this.getRawDataArray(),h=s&&s[a];return{seriesIndex:n,seriesName:i,name:o,dataIndex:a,data:h,value:r,color:e.getItemVisual(t,"color"),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,n){e=e||"normal";var r=this.getData(),a=r.getItemModel(t),o=this.getDataParams(t);return null==n&&(n=a.get(["label",e,"formatter"])),"function"==typeof n?(o.status=e,n(o)):"string"==typeof n?i.formatTpl(n,o):void 0},getRawValue:function(t){var e=this.getData().getItemModel(t);if(e&&null!=e.option){var n=e.option;return a.isObject(n)&&!a.isArray(n)?n.value:n}}},h.mappingToExists=function(t,e){e=(e||[]).slice();var n=a.map(t||[],function(t,e){return{exist:t}});return a.each(e,function(t,i){if(a.isObject(t))for(var r=0;r=n.length&&n.push({option:t})}}),n},h.isIdInner=function(t){return a.isObject(t)&&t.id&&0===(t.id+"").indexOf("\x00_ec_\x00")},t.exports=h},function(t,e,n){"use strict";function i(t,e,n,i){this.x=t,this.y=e,this.width=n,this.height=i}var r=n(5),a=n(19),o=r.applyTransform,s=Math.min,h=Math.abs,l=Math.max;i.prototype={constructor:i,union:function(t){var e=s(t.x,this.x),n=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:function(){var t=[],e=[];return function(n){n&&(t[0]=this.x,t[1]=this.y,e[0]=this.x+this.width,e[1]=this.y+this.height,o(t,t,n),o(e,e,n),this.x=s(t[0],e[0]),this.y=s(t[1],e[1]),this.width=h(e[0]-t[0]),this.height=h(e[1]-t[1]))}}(),calculateTransform:function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=a.create();return a.translate(r,r,[-e.x,-e.y]),a.scale(r,r,[n,i]),a.translate(r,r,[t.x,t.y]),r},intersect:function(t){var e=this,n=e.x,i=e.x+e.width,r=e.y,a=e.y+e.height,o=t.x,s=t.x+t.width,h=t.y,l=t.y+t.height;return!(o>i||n>s||h>a||r>l)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new i(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height}},t.exports=i},function(t,e,n){function i(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))}function r(t){return t.toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()})}function a(t){var e=t.length;return"number"==typeof t?[t,t,t,t]:2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function o(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function s(t,e){return"{"+t+(null==e?"":e)+"}"}function h(t,e){c.isArray(e)||(e=[e]);var n=e.length;if(!n)return"";for(var i=e[0].$vars,r=0;ro;o++)for(var h=0;ht?"0"+t:t}var c=n(1),f=n(4),d=["a","b","c","d","e","f","g"];t.exports={normalizeCssArray:a,addCommas:i,toCamelCase:r,encodeHTML:o,formatTpl:h,formatTime:l}},function(t,e,n){function i(t){var e=[];return a.each(u.getClassesByMainType(t),function(t){o.apply(e,t.prototype.dependencies||[])}),a.map(e,function(t){return h.parseClassType(t).main})}var r=n(12),a=n(1),o=Array.prototype.push,s=n(41),h=n(20),l=n(11),u=r.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,init:function(t,e,n,i){this.mergeDefaultAndTheme(this.option,this.ecModel)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,i=n?l.getLayoutParams(t):{},r=e.getTheme();a.merge(t,r.get(this.mainType)),a.merge(t,this.getDefaultOption()),n&&l.mergeLayoutParam(t,i,n)},mergeOption:function(t){a.merge(this.option,t,!0);var e=this.layoutMode;e&&l.mergeLayoutParam(this.option,t,e)},optionUpdated:function(t){},getDefaultOption:function(){if(!this.hasOwnProperty("__defaultOption")){for(var t=[],e=this.constructor;e;){var n=e.prototype.defaultOption;n&&t.push(n),e=e.superClass}for(var i={},r=t.length-1;r>=0;r--)i=a.merge(i,t[r],!0);this.__defaultOption=i}return this.__defaultOption}});h.enableClassExtend(u,function(t,e,n,i){a.extend(this,i),this.uid=s.getUID("componentModel")}),h.enableClassManagement(u,{registerWhenExtend:!0}),s.enableSubTypeDefaulter(u),s.enableTopologicalTravel(u,i),a.mixin(u,n(116)),t.exports=u},function(t,e,n){"use strict";function i(t,e,n,i,r){var a=0,o=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(h,l){var u,c,f=h.position,d=h.getBoundingRect(),p=e.childAt(l+1),g=p&&p.getBoundingRect();if("horizontal"===t){var v=d.width+(g?-g.x+d.x:0);u=a+v,u>i||h.newline?(a=0,u=v,o+=s+n,s=d.height):s=Math.max(s,d.height)}else{var m=d.height+(g?-g.y+d.y:0);c=o+m,c>r||h.newline?(a+=s+n,o=0,c=m,s=d.width):s=Math.max(s,d.width)}h.newline||(f[0]=a,f[1]=o,"horizontal"===t?a=u+n:o=c+n)})}var r=n(1),a=n(8),o=n(4),s=n(9),h=o.parsePercent,l=r.each,u={},c=["left","right","top","bottom","width","height"];u.box=i,u.vbox=r.curry(i,"vertical"),u.hbox=r.curry(i,"horizontal"),u.getAvailableSize=function(t,e,n){var i=e.width,r=e.height,a=h(t.x,i),o=h(t.y,r),l=h(t.x2,i),u=h(t.y2,r);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(l)||isNaN(parseFloat(t.x2)))&&(l=i),(isNaN(o)||isNaN(parseFloat(t.y)))&&(o=0),(isNaN(u)||isNaN(parseFloat(t.y2)))&&(u=r),n=s.normalizeCssArray(n||0),{width:Math.max(l-a-n[1]-n[3],0),height:Math.max(u-o-n[0]-n[2],0)}},u.getLayoutRect=function(t,e,n){n=s.normalizeCssArray(n||0);var i=e.width,r=e.height,o=h(t.left,i),l=h(t.top,r),u=h(t.right,i),c=h(t.bottom,r),f=h(t.width,i),d=h(t.height,r),p=n[2]+n[0],g=n[1]+n[3],v=t.aspect;switch(isNaN(f)&&(f=i-u-g-o),isNaN(d)&&(d=r-c-p-l),isNaN(f)&&isNaN(d)&&(v>i/r?f=.8*i:d=.8*r),null!=v&&(isNaN(f)&&(f=v*d),isNaN(d)&&(d=f/v)),isNaN(o)&&(o=i-u-f-g),isNaN(l)&&(l=r-c-d-p),t.left||t.right){case"center":o=i/2-f/2-n[3];break;case"right":o=i-f-g}switch(t.top||t.bottom){case"middle":case"center":l=r/2-d/2-n[0];break;case"bottom":l=r-d-p}o=o||0,l=l||0,isNaN(f)&&(f=i-o-(u||0)),isNaN(d)&&(d=r-l-(c||0));var m=new a(o+n[3],l+n[0],f,d);return m.margin=n,m},u.positionGroup=function(t,e,n,i){var a=t.getBoundingRect();e=r.extend(r.clone(e),{width:a.width,height:a.height}),e=u.getLayoutRect(e,n,i),t.position=[e.x-a.x,e.y-a.y]},u.mergeLayoutParam=function(t,e,n){function i(i){var r={},s=0,h={},u=0,c=n.ignoreSize?1:2;if(l(i,function(e){h[e]=t[e]}),l(i,function(t){a(e,t)&&(r[t]=h[t]=e[t]),o(r,t)&&s++,o(h,t)&&u++}),u!==c&&s){if(s>=c)return r;for(var f=0;f';return e?u+s(this.name)+" : "+a:s(this.name)+"
            "+u+(o?s(o)+" : "+a:a)},restoreData:function(){this._data=this._dataBeforeProcessed.cloneShallow()}});i.mixin(l,a.dataFormatMixin),t.exports=l},function(t,e,n){(function(e){function i(t){return f.isArray(t)||(t=[t]),t}function r(t,e){var n=t.dimensions,i=new m(f.map(n,t.getDimensionInfo,t),t.hostModel);v(i,t,t._wrappedMethods);for(var r=i._storage={},a=t._storage,o=0;o=0?r[s]=new h.constructor(a[s].length):r[s]=a[s]}return i}var a="undefined",o="undefined"==typeof window?e:window,s=typeof o.Float64Array===a?Array:o.Float64Array,h=typeof o.Int32Array===a?Array:o.Int32Array,l={"float":s,"int":h,ordinal:Array,number:Array,time:Array},u=n(12),c=n(52),f=n(1),d=n(7),p=f.isObject,g=["stackedOn","_nameList","_idList","_rawData"],v=function(t,e,n){f.each(g.concat(n||[]),function(n){e.hasOwnProperty(n)&&(t[n]=e[n])})},m=function(t,e){t=t||["x","y"];for(var n={},i=[],r=0;r0&&(b+="__ec__"+u[w]),u[w]++),b&&(h[c]=b)}this._nameList=e,this._idList=h},y.count=function(){return this.indices.length},y.get=function(t,e,n){var i=this._storage,r=this.indices[e];if(null==r)return NaN;var a=i[t]&&i[t][r];if(n){var o=this._dimensionInfos[t];if(o&&o.stackable)for(var s=this.stackedOn;s;){var h=s.get(t,e);(a>=0&&h>0||0>=a&&0>h)&&(a+=h),s=s.stackedOn}}return a},y.getValues=function(t,e,n){var i=[];f.isArray(t)||(n=e,e=t,t=this.dimensions);for(var r=0,a=t.length;a>r;r++)i.push(this.get(t[r],e,n));return i},y.hasValue=function(t){for(var e=this.dimensions,n=this._dimensionInfos,i=0,r=e.length;r>i;i++)if("ordinal"!==n[e[i]].type&&isNaN(this.get(e[i],t)))return!1;return!0},y.getDataExtent=function(t,e){var n=this._storage[t],i=this.getDimensionInfo(t);e=i&&i.stackable&&e;var r,a=(this._extent||(this._extent={}))[t+!!e];if(a)return a;if(n){for(var o=1/0,s=-(1/0),h=0,l=this.count();l>h;h++)r=this.get(t,h,e),o>r&&(o=r),r>s&&(s=r);return this._extent[t+e]=[o,s]}return[1/0,-(1/0)]},y.getSum=function(t,e){var n=this._storage[t],i=0;if(n)for(var r=0,a=this.count();a>r;r++){ +var o=this.get(t,r,e);isNaN(o)||(i+=o)}return i},y.indexOf=function(t,e){var n=this._storage,i=n[t],r=this.indices;if(i)for(var a=0,o=r.length;o>a;a++){var s=r[a];if(i[s]===e)return a}return-1},y.indexOfName=function(t){for(var e=this.indices,n=this._nameList,i=0,r=e.length;r>i;i++){var a=e[i];if(n[a]===t)return i}return-1},y.indexOfNearest=function(t,e,n){var i=this._storage,r=i[t];if(r){for(var a=Number.MAX_VALUE,o=-1,s=0,h=this.count();h>s;s++){var l=e-this.get(t,s,n),u=Math.abs(l);(a>u||u===a&&l>0)&&(a=u,o=s)}return o}return-1},y.getRawIndex=function(t){var e=this.indices[t];return null==e?-1:e},y.getName=function(t){return this._nameList[this.indices[t]]||""},y.getId=function(t){return this._idList[this.indices[t]]||this.getRawIndex(t)+""},y.each=function(t,e,n,r){"function"==typeof t&&(r=n,n=e,e=t,t=[]),t=f.map(i(t),this.getDimension,this);var a=[],o=t.length,s=this.indices;r=r||this;for(var h=0;hl;l++)a[l]=this.get(t[l],h,n);a[l]=h,e.apply(r,a)}},y.filterSelf=function(t,e,n,r){"function"==typeof t&&(r=n,n=e,e=t,t=[]),t=f.map(i(t),this.getDimension,this);var a=[],o=[],s=t.length,h=this.indices;r=r||this;for(var l=0;lc;c++)o[c]=this.get(t[c],l,n);o[c]=l,u=e.apply(r,o)}u&&a.push(h[l])}return this.indices=a,this._extent={},this},y.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]);var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n,i),r},y.map=function(t,e,n,a){t=f.map(i(t),this.getDimension,this);var o=r(this,t),s=o.indices=this.indices,h=o._storage,l=[];return this.each(t,function(){var n=arguments[arguments.length-1],i=e&&e.apply(this,arguments);if(null!=i){"number"==typeof i&&(l[0]=i,i=l);for(var r=0;rg;g+=f){f>p-g&&(f=p-g,u.length=f);for(var v=0;f>v;v++){var m=h[g+v];u[v]=d[m],c[v]=m}var y=n(u),m=c[i(u,y)||0];d[m]=y,l.push(m)}return a},y.getItemModel=function(t){var e=this.hostModel;return t=this.indices[t],new u(this._rawData[t],e,e.ecModel)},y.diff=function(t){var e=this._idList,n=t&&t._idList;return new c(t?t.indices:[],this.indices,function(t){return n[t]||t+""},function(t){return e[t]||t+""})},y.getVisual=function(t){var e=this._visual;return e&&e[t]},y.setVisual=function(t,e){if(p(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},y.setLayout=function(t,e){if(p(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},y.getLayout=function(t){return this._layout[t]},y.getItemLayout=function(t){return this._itemLayouts[t]},y.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?f.extend(this._itemLayouts[t]||{},e):e},y.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},y.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{};if(this._itemVisuals[t]=i,p(e))for(var r in e)e.hasOwnProperty(r)&&(i[r]=e[r]);else i[e]=n};var x=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex};y.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(x,e)),this._graphicEls[t]=e},y.getItemGraphicEl=function(t){return this._graphicEls[t]},y.eachItemGraphicEl=function(t,e){f.each(this._graphicEls,function(n,i){n&&t&&t.call(e,n,i)})},y.cloneShallow=function(){var t=f.map(this.dimensions,this.getDimensionInfo,this),e=new m(t,this.hostModel);return e._storage=this._storage,v(e,this,this._wrappedMethods),e.indices=this.indices.slice(),e},y.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this._wrappedMethods=this._wrappedMethods||[],this._wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.call(this,t)})},t.exports=m}).call(e,function(){return this}())},function(t,e){function n(t){var e={},n={},i=t.match(/Web[kK]it[\/]{0,1}([\d.]+)/),r=t.match(/(Android);?[\s\/]+([\d.]+)?/),a=t.match(/(iPad).*OS\s([\d_]+)/),o=t.match(/(iPod)(.*OS\s([\d_]+))?/),s=!a&&t.match(/(iPhone\sOS)\s([\d_]+)/),h=t.match(/(webOS|hpwOS)[\s\/]([\d.]+)/),l=h&&t.match(/TouchPad/),u=t.match(/Kindle\/([\d.]+)/),c=t.match(/Silk\/([\d._]+)/),f=t.match(/(BlackBerry).*Version\/([\d.]+)/),d=t.match(/(BB10).*Version\/([\d.]+)/),p=t.match(/(RIM\sTablet\sOS)\s([\d.]+)/),g=t.match(/PlayBook/),v=t.match(/Chrome\/([\d.]+)/)||t.match(/CriOS\/([\d.]+)/),m=t.match(/Firefox\/([\d.]+)/),y=i&&t.match(/Mobile\//)&&!v,x=t.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/)&&!v,_=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),b=t.match(/Edge\/([\d.]+)/);return(n.webkit=!!i)&&(n.version=i[1]),r&&(e.android=!0,e.version=r[2]),s&&!o&&(e.ios=e.iphone=!0,e.version=s[2].replace(/_/g,".")),a&&(e.ios=e.ipad=!0,e.version=a[2].replace(/_/g,".")),o&&(e.ios=e.ipod=!0,e.version=o[3]?o[3].replace(/_/g,"."):null),h&&(e.webos=!0,e.version=h[2]),l&&(e.touchpad=!0),f&&(e.blackberry=!0,e.version=f[2]),d&&(e.bb10=!0,e.version=d[2]),p&&(e.rimtabletos=!0,e.version=p[2]),g&&(n.playbook=!0),u&&(e.kindle=!0,e.version=u[1]),c&&(n.silk=!0,n.version=c[1]),!c&&e.android&&t.match(/Kindle Fire/)&&(n.silk=!0),v&&(n.chrome=!0,n.version=v[1]),m&&(n.firefox=!0,n.version=m[1]),_&&(n.ie=!0,n.version=_[1]),y&&(t.match(/Safari/)||e.ios)&&(n.safari=!0),x&&(n.webview=!0),_&&(n.ie=!0,n.version=_[1]),b&&(n.edge=!0,n.version=b[1]),e.tablet=!!(a||g||r&&!t.match(/Mobile/)||m&&t.match(/Tablet/)||_&&!t.match(/Phone/)&&t.match(/Touch/)),e.phone=!(e.tablet||e.ipod||!(r||s||h||f||d||v&&t.match(/Android/)||v&&t.match(/CriOS\/([\d.]+)/)||m&&t.match(/Mobile/)||_&&t.match(/Touch/))),{browser:n,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,touchEventsSupported:"ontouchstart"in window&&!n.ie&&!n.edge,pointerEventsSupported:"onpointerdown"in window&&(n.edge||n.ie&&n.version>=10)}}var i={};i="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0}:n(navigator.userAgent),t.exports=i},function(t,e){var n=function(t){this.colorStops=t||[]};n.prototype={constructor:n,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}},t.exports=n},function(t,e,n){function i(t,e){var n=t+":"+e;if(l[n])return l[n];for(var i=(t+"").split("\n"),r=0,a=0,o=i.length;o>a;a++)r=Math.max(p.measureText(i[a],e).width,r);return u>c&&(u=0,l={}),u++,l[n]=r,r}function r(t,e,n,r){var a=((t||"")+"").split("\n").length,o=i(t,e),s=i("国",e),h=a*s,l=new d(0,0,o,h);switch(l.lineHeight=s,r){case"bottom":case"alphabetic":l.y-=s;break;case"middle":l.y-=s/2}switch(n){case"end":case"right":l.x-=l.width;break;case"center":l.x-=l.width/2}return l}function a(t,e,n,i){var r=e.x,a=e.y,o=e.height,s=e.width,h=n.height,l=o/2-h/2,u="left";switch(t){case"left":r-=i,a+=l,u="right";break;case"right":r+=i+s,a+=l,u="left";break;case"top":r+=s/2,a-=i+h,u="center";break;case"bottom":r+=s/2,a+=o+i,u="center";break;case"inside":r+=s/2,a+=l,u="center";break;case"insideLeft":r+=i,a+=l,u="left";break;case"insideRight":r+=s-i,a+=l,u="right";break;case"insideTop":r+=s/2,a+=i,u="center";break;case"insideBottom":r+=s/2,a+=o-h-i,u="center";break;case"insideTopLeft":r+=i,a+=i,u="left";break;case"insideTopRight":r+=s-i,a+=i,u="right";break;case"insideBottomLeft":r+=i,a+=o-h-i;break;case"insideBottomRight":r+=s-i,a+=o-h-i,u="right"}return{x:r,y:a,textAlign:u,textBaseline:"top"}}function o(t,e,n,r){if(!n)return"";r=f.defaults({ellipsis:"...",minCharacters:3,maxIterations:3,cnCharWidth:i("国",e),ascCharWidth:i("a",e)},r,!0),n-=i(r.ellipsis);for(var a=(t+"").split("\n"),o=0,h=a.length;h>o;o++)a[o]=s(a[o],e,n,r);return a.join("\n")}function s(t,e,n,r){for(var a=0;;a++){var o=i(t,e);if(n>o||a>=r.maxIterations){t+=r.ellipsis;break}var s=0===a?h(t,n,r):Math.floor(t.length*n/o);if(sr&&e>i;r++){var o=t.charCodeAt(r);i+=o>=0&&127>=o?n.ascCharWidth:n.cnCharWidth}return r}var l={},u=0,c=5e3,f=n(1),d=n(8),p={getWidth:i,getBoundingRect:r,adjustTextPositionOnRect:a,ellipsis:o,measureText:function(t,e){var n=f.getContext();return n.font=e,n.measureText(t)}};t.exports=p},function(t,e,n){"use strict";function i(t){return t>-w&&w>t}function r(t){return t>w||-w>t}function a(t,e,n,i,r){var a=1-r;return a*a*(a*t+3*r*e)+r*r*(r*i+3*a*n)}function o(t,e,n,i,r){var a=1-r;return 3*(((e-t)*a+2*(n-e)*r)*a+(i-n)*r*r)}function s(t,e,n,r,a,o){var s=r+3*(e-n)-t,h=3*(n-2*e+t),l=3*(e-t),u=t-a,c=h*h-3*s*l,f=h*l-9*s*u,d=l*l-3*h*u,p=0;if(i(c)&&i(f))if(i(h))o[0]=0;else{var g=-l/h;g>=0&&1>=g&&(o[p++]=g)}else{var v=f*f-4*c*d;if(i(v)){var m=f/c,g=-h/s+m,y=-m/2;g>=0&&1>=g&&(o[p++]=g),y>=0&&1>=y&&(o[p++]=y)}else if(v>0){var x=b(v),w=c*h+1.5*s*(-f+x),M=c*h+1.5*s*(-f-x);w=0>w?-_(-w,C):_(w,C),M=0>M?-_(-M,C):_(M,C);var g=(-h-(w+M))/(3*s);g>=0&&1>=g&&(o[p++]=g)}else{var T=(2*c*h-3*s*f)/(2*b(c*c*c)),A=Math.acos(T)/3,k=b(c),I=Math.cos(A),g=(-h-2*k*I)/(3*s),y=(-h+k*(I+S*Math.sin(A)))/(3*s),L=(-h+k*(I-S*Math.sin(A)))/(3*s);g>=0&&1>=g&&(o[p++]=g),y>=0&&1>=y&&(o[p++]=y),L>=0&&1>=L&&(o[p++]=L)}}return p}function h(t,e,n,a,o){var s=6*n-12*e+6*t,h=9*e+3*a-3*t-9*n,l=3*e-3*t,u=0;if(i(h)){if(r(s)){var c=-l/s;c>=0&&1>=c&&(o[u++]=c)}}else{var f=s*s-4*h*l;if(i(f))o[0]=-s/(2*h);else if(f>0){var d=b(f),c=(-s+d)/(2*h),p=(-s-d)/(2*h);c>=0&&1>=c&&(o[u++]=c),p>=0&&1>=p&&(o[u++]=p)}}return u}function l(t,e,n,i,r,a){var o=(e-t)*r+t,s=(n-e)*r+e,h=(i-n)*r+n,l=(s-o)*r+o,u=(h-s)*r+s,c=(u-l)*r+l;a[0]=t,a[1]=o,a[2]=l,a[3]=c,a[4]=c,a[5]=u,a[6]=h,a[7]=i}function u(t,e,n,i,r,o,s,h,l,u,c){var f,d,p,g,v,m=.005,y=1/0;T[0]=l,T[1]=u;for(var _=0;1>_;_+=.05)A[0]=a(t,n,r,s,_),A[1]=a(e,i,o,h,_),g=x(T,A),y>g&&(f=_,y=g);y=1/0;for(var w=0;32>w&&!(M>m);w++)d=f-m,p=f+m,A[0]=a(t,n,r,s,d),A[1]=a(e,i,o,h,d),g=x(A,T),d>=0&&y>g?(f=d,y=g):(k[0]=a(t,n,r,s,p),k[1]=a(e,i,o,h,p),v=x(k,T),1>=p&&y>v?(f=p,y=v):m*=.5);return c&&(c[0]=a(t,n,r,s,f),c[1]=a(e,i,o,h,f)),b(y)}function c(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function f(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function d(t,e,n,a,o){var s=t-2*e+n,h=2*(e-t),l=t-a,u=0;if(i(s)){if(r(h)){var c=-l/h;c>=0&&1>=c&&(o[u++]=c)}}else{var f=h*h-4*s*l;if(i(f)){var c=-h/(2*s);c>=0&&1>=c&&(o[u++]=c)}else if(f>0){var d=b(f),c=(-h+d)/(2*s),p=(-h-d)/(2*s);c>=0&&1>=c&&(o[u++]=c),p>=0&&1>=p&&(o[u++]=p)}}return u}function p(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function g(t,e,n,i,r){var a=(e-t)*i+t,o=(n-e)*i+e,s=(o-a)*i+a;r[0]=t,r[1]=a,r[2]=s,r[3]=s,r[4]=o,r[5]=n}function v(t,e,n,i,r,a,o,s,h){var l,u=.005,f=1/0;T[0]=o,T[1]=s;for(var d=0;1>d;d+=.05){A[0]=c(t,n,r,d),A[1]=c(e,i,a,d);var p=x(T,A);f>p&&(l=d,f=p)}f=1/0;for(var g=0;32>g&&!(M>u);g++){var v=l-u,m=l+u;A[0]=c(t,n,r,v),A[1]=c(e,i,a,v);var p=x(A,T);if(v>=0&&f>p)l=v,f=p;else{k[0]=c(t,n,r,m),k[1]=c(e,i,a,m);var y=x(k,T);1>=m&&f>y?(l=m,f=y):u*=.5}}return h&&(h[0]=c(t,n,r,l),h[1]=c(e,i,a,l)),b(f)}var m=n(5),y=m.create,x=m.distSquare,_=Math.pow,b=Math.sqrt,w=1e-8,M=1e-4,S=b(3),C=1/3,T=y(),A=y(),k=y();t.exports={cubicAt:a,cubicDerivativeAt:o,cubicRootAt:s,cubicExtrema:h,cubicSubdivide:l,cubicProjectPoint:u,quadraticAt:c,quadraticDerivativeAt:f,quadraticRootAt:d,quadraticExtremum:p,quadraticSubdivide:g,quadraticProjectPoint:v}},function(t,e){var n="undefined"==typeof Float32Array?Array:Float32Array,i={create:function(){var t=new n(6);return i.identity(t),t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},copy:function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t},mul:function(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],a=e[0]*n[2]+e[2]*n[3],o=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],h=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=a,t[3]=o,t[4]=s,t[5]=h,t},translate:function(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t},rotate:function(t,e,n){var i=e[0],r=e[2],a=e[4],o=e[1],s=e[3],h=e[5],l=Math.sin(n),u=Math.cos(n);return t[0]=i*u+o*l,t[1]=-i*l+o*u,t[2]=r*u+s*l,t[3]=-r*l+u*s,t[4]=u*a+l*h,t[5]=u*h-l*a,t},scale:function(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t},invert:function(t,e){var n=e[0],i=e[2],r=e[4],a=e[1],o=e[3],s=e[5],h=n*o-a*i;return h?(h=1/h,t[0]=o*h,t[1]=-a*h,t[2]=-i*h,t[3]=n*h,t[4]=(i*s-o*r)*h,t[5]=(a*r-n*s)*h,t):null}};t.exports=i},function(t,e,n){function i(t,e){var n=a.slice(arguments,2);return this.superClass.prototype[e].apply(t,n)}function r(t,e,n){return this.superClass.prototype[e].apply(t,n)}var a=n(1),o={},s=".",h="___EC__COMPONENT__CONTAINER___",l=o.parseClassType=function(t){var e={main:"",sub:""};return t&&(t=t.split(s),e.main=t[0]||"",e.sub=t[1]||""),e};o.enableClassExtend=function(t,e){t.extend=function(n){var o=function(){e&&e.apply(this,arguments),t.apply(this,arguments)};return a.extend(o.prototype,n),o.extend=this.extend,o.superCall=i,o.superApply=r,a.inherits(o,this),o.superClass=this,o}},o.enableClassManagement=function(t,e){function n(t){var e=i[t.main];return e&&e[h]||(e=i[t.main]={},e[h]=!0),e}e=e||{};var i={};if(t.registerClass=function(t,e){if(e)if(e=l(e),e.sub){if(e.sub!==h){var r=n(e);r[e.sub]=t}}else{if(i[e.main])throw new Error(e.main+"exists.");i[e.main]=t}return t},t.getClass=function(t,e,n){var r=i[t];if(r&&r[h]&&(r=e?r[e]:null),n&&!r)throw new Error("Component "+t+"."+(e||"")+" not exists. Load it first.");return r},t.getClassesByMainType=function(t){t=l(t);var e=[],n=i[t.main];return n&&n[h]?a.each(n,function(t,n){n!==h&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=l(t),!!i[t.main]},t.getAllClassMainTypes=function(){var t=[];return a.each(i,function(e,n){t.push(n)}),t},t.hasSubTypes=function(t){t=l(t);var e=i[t.main];return e&&e[h]},t.parseClassType=l,e.registerWhenExtend){var r=t.extend;r&&(t.extend=function(e){var n=r.call(this,e);return t.registerClass(n,e.type)})}return t},o.setReadOnly=function(t,e){},t.exports=o},function(t,e,n){var i=Array.prototype.slice,r=n(1),a=r.indexOf,o=function(){this._$handlers={}};o.prototype={constructor:o,one:function(t,e,n){var i=this._$handlers;return e&&t?(i[t]||(i[t]=[]),a(i[t],t)>=0?this:(i[t].push({h:e,one:!0,ctx:n||this}),this)):this},on:function(t,e,n){var i=this._$handlers;return e&&t?(i[t]||(i[t]=[]),i[t].push({h:e,one:!1,ctx:n||this}),this):this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,a=n[t].length;a>r;r++)n[t][r].h!=e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>3&&(e=i.call(e,1));for(var r=this._$handlers[t],a=r.length,o=0;a>o;){switch(n){case 1:r[o].h.call(r[o].ctx);break;case 2:r[o].h.call(r[o].ctx,e[1]);break;case 3:r[o].h.call(r[o].ctx,e[1],e[2]);break;default:r[o].h.apply(r[o].ctx,e)}r[o].one?(r.splice(o,1),a--):o++}}return this},triggerWithContext:function(t){if(this._$handlers[t]){var e=arguments,n=e.length;n>4&&(e=i.call(e,1,e.length-1));for(var r=e[e.length-1],a=this._$handlers[t],o=a.length,s=0;o>s;){switch(n){case 1:a[s].h.call(r);break;case 2:a[s].h.call(r,e[1]);break;case 3:a[s].h.call(r,e[1],e[2]);break;default:a[s].h.apply(r,e)}a[s].one?(a.splice(s,1),o--):s++}}return this}},t.exports=o},function(t,e){function n(t){return t=Math.round(t),0>t?0:t>255?255:t}function i(t){return t=Math.round(t),0>t?0:t>360?360:t}function r(t){return 0>t?0:t>1?1:t}function a(t){return n(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function o(t){return r(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function s(t,e,n){return 0>n?n+=1:n>1&&(n-=1),1>6*n?t+(e-t)*n*6:1>2*n?e:2>3*n?t+(e-t)*(2/3-n)*6:t}function h(t,e,n){return t+(e-t)*n}function l(t){if(t){t+="";var e=t.replace(/ /g,"").toLowerCase();if(e in _)return _[e].slice();if("#"!==e.charAt(0)){var n=e.indexOf("("),i=e.indexOf(")");if(-1!==n&&i+1===e.length){var r=e.substr(0,n),s=e.substr(n+1,i-(n+1)).split(","),h=1;switch(r){case"rgba":if(4!==s.length)return;h=o(s.pop());case"rgb":if(3!==s.length)return;return[a(s[0]),a(s[1]),a(s[2]),h];case"hsla":if(4!==s.length)return;return s[3]=o(s[3]),u(s);case"hsl":if(3!==s.length)return;return u(s);default:return}}}else{if(4===e.length){var l=parseInt(e.substr(1),16);if(!(l>=0&&4095>=l))return;return[(3840&l)>>4|(3840&l)>>8,240&l|(240&l)>>4,15&l|(15&l)<<4,1]}if(7===e.length){var l=parseInt(e.substr(1),16);if(!(l>=0&&16777215>=l))return;return[(16711680&l)>>16,(65280&l)>>8,255&l,1]}}}}function u(t){var e=(parseFloat(t[0])%360+360)%360/360,i=o(t[1]),r=o(t[2]),a=.5>=r?r*(i+1):r+i-r*i,h=2*r-a,l=[n(255*s(h,a,e+1/3)),n(255*s(h,a,e)),n(255*s(h,a,e-1/3))];return 4===t.length&&(l[3]=t[3]),l}function c(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,a=t[2]/255,o=Math.min(i,r,a),s=Math.max(i,r,a),h=s-o,l=(s+o)/2;if(0===h)e=0,n=0;else{n=.5>l?h/(s+o):h/(2-s-o);var u=((s-i)/6+h/2)/h,c=((s-r)/6+h/2)/h,f=((s-a)/6+h/2)/h;i===s?e=f-c:r===s?e=1/3+u-f:a===s&&(e=2/3+c-u),0>e&&(e+=1),e>1&&(e-=1)}var d=[360*e,n,l];return null!=t[3]&&d.push(t[3]),d}}function f(t,e){var n=l(t);if(n){for(var i=0;3>i;i++)0>e?n[i]=n[i]*(1-e)|0:n[i]=(255-n[i])*e+n[i]|0;return x(n,4===n.length?"rgba":"rgb")}}function d(t,e){var n=l(t);return n?((1<<24)+(n[0]<<16)+(n[1]<<8)+ +n[2]).toString(16).slice(1):void 0}function p(t,e,i){if(e&&e.length&&t>=0&&1>=t){i=i||[0,0,0,0];var r=t*(e.length-1),a=Math.floor(r),o=Math.ceil(r),s=e[a],l=e[o],u=r-a;return i[0]=n(h(s[0],l[0],u)),i[1]=n(h(s[1],l[1],u)),i[2]=n(h(s[2],l[2],u)),i[3]=n(h(s[3],l[3],u)),i}}function g(t,e,i){if(e&&e.length&&t>=0&&1>=t){var a=t*(e.length-1),o=Math.floor(a),s=Math.ceil(a),u=l(e[o]),c=l(e[s]),f=a-o,d=x([n(h(u[0],c[0],f)),n(h(u[1],c[1],f)),n(h(u[2],c[2],f)),r(h(u[3],c[3],f))],"rgba");return i?{color:d,leftIndex:o,rightIndex:s,value:a}:d}}function v(t,e){if(!(2!==t.length||t[1]0&&s>=h;h++)r.push({color:e[h],offset:(h-n.value)/a});return r.push({color:i.color,offset:1}),r}}function m(t,e,n,r){return t=l(t),t?(t=c(t),null!=e&&(t[0]=i(e)),null!=n&&(t[1]=o(n)),null!=r&&(t[2]=o(r)),x(u(t),"rgba")):void 0}function y(t,e){return t=l(t),t&&null!=e?(t[3]=r(e),x(t,"rgba")):void 0}function x(t,e){return"rgb"!==e&&"hsv"!==e&&"hsl"!==e||(t=t.slice(0,3)),e+"("+t.join(",")+")"}var _={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};t.exports={parse:l,lift:f,toHex:d,fastMapToColor:p,mapToColor:g,mapIntervalToColor:v,modifyHSL:m,modifyAlpha:y,stringify:x}},function(t,e,n){var i=n(124),r=n(37);n(125),n(123);var a=n(32),o=n(4),s=n(1),h=n(17),l={};l.getScaleExtent=function(t,e){var n=t.scale,i=n.getExtent(),r=i[1]-i[0];if("ordinal"===n.type)return isFinite(r)?i:[0,0];var a=e.getMin?e.getMin():e.get("min"),h=e.getMax?e.getMax():e.get("max"),l=e.getNeedCrossZero?e.getNeedCrossZero():!e.get("scale"),u=e.get("boundaryGap");s.isArray(u)||(u=[u||0,u||0]),u[0]=o.parsePercent(u[0],1),u[1]=o.parsePercent(u[1],1);var c=!0,f=!0;return null==a&&(a=i[0]-u[0]*r,c=!1),null==h&&(h=i[1]+u[1]*r,f=!1),"dataMin"===a&&(a=i[0]),"dataMax"===h&&(h=i[1]),l&&(a>0&&h>0&&!c&&(a=0),0>a&&0>h&&!f&&(h=0)),[a,h]},l.niceScaleExtent=function(t,e){var n=t.scale,i=l.getScaleExtent(t,e),r=null!=(e.getMin?e.getMin():e.get("min")),a=null!=(e.getMax?e.getMax():e.get("max"));n.setExtent(i[0],i[1]),n.niceExtent(e.get("splitNumber"),r,a);var o=e.get("interval");null!=o&&n.setInterval&&n.setInterval(o)},l.createScaleByModel=function(t,e){if(e=e||t.get("type"))switch(e){case"category":return new i(t.getCategories(),[1/0,-(1/0)]);case"value":return new r;default:return(a.getClass(e)||r).create(t)}},l.ifAxisCrossZero=function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||0>n&&0>i)},l.getAxisLabelInterval=function(t,e,n,i){var r,a=0,o=0,s=1;e.length>40&&(s=Math.round(e.length/40));for(var l=0;l1?s:a*s},l.getFormattedLabels=function(t,e){var n=t.scale,i=n.getTicksLabels(),r=n.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",e)}}(e),s.map(i,e)):"function"==typeof e?s.map(r,function(i,r){return e("category"===t.type?n.getLabel(i):i,r)},this):i},t.exports=l},function(t,e,n){"use strict";var i=n(3),r=n(8),a=i.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i+a),t.lineTo(n-r,i+a),t.closePath()}}),o=i.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,a=e.height/2;t.moveTo(n,i-a),t.lineTo(n+r,i),t.lineTo(n,i+a),t.lineTo(n-r,i),t.closePath()}}),s=i.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,a=Math.max(r,e.height),o=r/2,s=o*o/(a-o),h=i-a+o+s,l=Math.asin(s/o),u=Math.cos(l)*o,c=Math.sin(l),f=Math.cos(l);t.arc(n,h,o,Math.PI-l,2*Math.PI+l);var d=.6*o,p=.7*o;t.bezierCurveTo(n+u-c*d,h+s+f*d,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-u+c*d,h+s+f*d,n-u,h+s),t.closePath()}}),h=i.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,a=e.y,o=i/3*2;t.moveTo(r,a),t.lineTo(r+o,a+n),t.lineTo(r,a+n/4*3),t.lineTo(r-o,a+n),t.lineTo(r,a),t.closePath()}}),l={line:i.Line,rect:i.Rect,roundRect:i.Rect,square:i.Rect,circle:i.Circle,diamond:o,pin:s,arrow:h,triangle:a},u={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var a=Math.min(n,i);r.x=t,r.y=e,r.width=a,r.height=a},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},c={};for(var f in l)c[f]=new l[f];var d=i.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style,e=this.shape;"pin"===e.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e){var n=e.symbolType,i=c[n];"none"!==e.symbolType&&(i||(n="rect",i=c[n]),u[n](e.x,e.y,e.width,e.height,i.shape),i.buildPath(t,i.shape))}}),p=function(t){if("image"!==this.type){var e=this.style,n=this.shape;n&&"line"===n.symbolType?e.stroke=t:this.__isEmptyBrush?(e.stroke=t,e.fill="#fff"):(e.fill&&(e.fill=t),e.stroke&&(e.stroke=t)),this.dirty()}},g={createSymbol:function(t,e,n,a,o,s){var h=0===t.indexOf("empty");h&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var l;return l=0===t.indexOf("image://")?new i.Image({style:{image:t.slice(8),x:e,y:n,width:a,height:o}}):0===t.indexOf("path://")?i.makePath(t.slice(7),{},new r(e,n,a,o)):new d({shape:{symbolType:t,x:e,y:n,width:a,height:o}}),l.__isEmptyBrush=h,l.setColor=p,l.setColor(s),l}};t.exports=g},function(t,e,n){function i(){this.group=new o,this.uid=s.getUID("viewChart")}function r(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var n=0;n=0&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToMap(t),t instanceof o&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,r=this._children,a=i.indexOf(r,t);return 0>a?this:(r.splice(a,1),t.parent=null,n&&(n.delFromMap(t.id),t instanceof o&&t.delChildrenFromStorage(n)),e&&e.refresh(),this)},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;en;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;e>r;r++)n+=t[r].len();m&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(var r=0;e>r;r++)for(var a=t[r].data,o=0;oe.length&&(this._expandData(),e=this.data);for(var n=0;na&&(a=r+a),a%=r,g-=a*u,m-=a*c;u>=0&&t>=g||0>u&&g>t;)i=this._dashIdx,n=o[i],g+=u*n,m+=c*n,this._dashIdx=(i+1)%y,u>0&&h>g||0>u&&g>h||s[i%2?"moveTo":"lineTo"](u>=0?f(g,t):d(g,t),c>=0?f(m,e):d(m,e));u=g-t,c=m-e,this._dashOffset=-v(u*u+c*c)},_dashedBezierTo:function(t,e,n,r,a,o){var s,h,l,u,c,f=this._dashSum,d=this._dashOffset,p=this._lineDash,g=this._ctx,m=this._xi,y=this._yi,x=i.cubicAt,_=0,b=this._dashIdx,w=p.length,M=0;for(0>d&&(d=f+d),d%=f,s=0;1>s;s+=.1)h=x(m,t,n,a,s+.1)-x(m,t,n,a,s),l=x(y,e,r,o,s+.1)-x(y,e,r,o,s),_+=v(h*h+l*l);for(;w>b&&(M+=p[b],!(M>d));b++);for(s=(M-d)/_;1>=s;)u=x(m,t,n,a,s),c=x(y,e,r,o,s),b%2?g.moveTo(u,c):g.lineTo(u,c),s+=p[b]/_,b=(b+1)%w;b%2!==0&&g.lineTo(a,o),h=a-u,l=o-c,this._dashOffset=-v(h*h+l*l)},_dashedQuadraticTo:function(t,e,n,i){var r=n,a=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,m&&(this.data=new Float32Array(t)))},getBoundingRect:function(){h[0]=h[1]=u[0]=u[1]=Number.MAX_VALUE,l[0]=l[1]=c[0]=c[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,n=0,i=0,f=0,d=0;dh?o:h,p=o>h?1:o/h,g=o>h?h/o:1,v=Math.abs(o-h)>.001;v?(t.translate(r,a),t.rotate(c),t.scale(p,g),t.arc(0,0,d,l,l+u,1-f),t.scale(1/p,1/g),t.rotate(-c),t.translate(-r,-a)):t.arc(r,a,d,l,l+u,1-f);break;case s.R:t.rect(e[n++],e[n++],e[n++],e[n++]);break;case s.Z:t.closePath()}}}},y.CMD=s,t.exports=y},function(t,e){"use strict";function n(){this._coordinateSystems=[]}var i={};n.prototype={constructor:n,create:function(t,e){var n=[];for(var r in i){var a=i[r].create(t,e);a&&(n=n.concat(a))}this._coordinateSystems=n},update:function(t,e){for(var n=this._coordinateSystems,i=0;i=0)){var o=this.getShallow(a);null!=o&&(n[t[r][0]]=o)}}return n}}},function(t,e,n){function i(t,e,n,i){if(!e)return t;var s=a(e[0]),h=o.isArray(s)&&s.length||1;n=n||[],i=i||"extra";for(var l=0;h>l;l++)if(!t[l]){var u=n[l]||i+(l-n.length);t[l]=r(e,l)?{type:"ordinal",name:u}:u}return t}function r(t,e){for(var n=0,i=t.length;i>n;n++){var r=a(t[n]);if(!o.isArray(r))return!1;var r=r[e];if(null!=r&&isFinite(r))return!1;if(o.isString(r)&&"-"!==r)return!0}return!1}function a(t){return o.isArray(t)?t:o.isObject(t)?t.value:t}var o=n(1);t.exports=i},function(t,e,n){function i(){this._extent=[1/0,-(1/0)],this._interval=0,this.init&&this.init.apply(this,arguments)}var r=n(20),a=i.prototype;a.parse=function(t){return t},a.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},a.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},a.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},a.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1])},a.getExtent=function(){return this._extent.slice()},a.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},a.getTicksLabels=function(){for(var t=[],e=this.getTicks(),n=0;n=0;if(r){var a="touchend"!=n?e.targetTouches[0]:e.changedTouches[0];if(a){var o=i(t);e.zrX=a.clientX-o.left,e.zrY=a.clientY-o.top}}else{var s=i(t);e.zrX=e.clientX-s.left,e.zrY=e.clientY-s.top,e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3}return e}function a(t,e,n){h?t.addEventListener(e,n):t.attachEvent("on"+e,n)}function o(t,e,n){h?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}var s=n(21),h="undefined"!=typeof window&&!!window.addEventListener,l=h?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};t.exports={normalizeEvent:r,addEventListener:a,removeEventListener:o,stop:l,Dispatcher:s}},function(t,e,n){"use strict";var i=n(3),r=n(1);n(51),n(96),n(2).extendComponentView({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new i.Rect({shape:t.coordinateSystem.getRect(),style:r.defaults({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0}))}})},function(t,e,n){function i(t){t=t||{},o.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new a(t.style),this._rect=null,this.__clipPaths=[]}var r=n(1),a=n(142),o=n(55),s=n(66);i.prototype={constructor:i,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect();return i.contain(n[0],n[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?o.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this}},r.inherits(i,o),r.mixin(i,s),t.exports=i},function(t,e,n){"use strict";function i(t){for(var e=0;e1){n=[];for(var a=0;r>a;a++)n[a]=i[e[a][t.categoryIndex||0]]}else n=i.slice(0)}}return n}var l=n(14),u=n(31),c=n(1),f=n(7),d=n(28),p=f.getDataItemValue,g=f.converDataValue,v={cartesian2d:function(t,e,n){var i=n.getComponent("xAxis",e.get("xAxisIndex")),r=n.getComponent("yAxis",e.get("yAxisIndex")),a=i.get("type"),h=r.get("type"),l=[{name:"x",type:s(a),stackable:o(a)},{name:"y",type:s(h),stackable:o(h)}],c="category"===a;return u(l,t,["x","y","z"]),{dimensions:l,categoryIndex:c?0:1,categoryAxisModel:c?i:"category"===h?r:null}},polar:function(t,e,n){var i=e.get("polarIndex")||0,r=function(t){return t.get("polarIndex")===i},a=n.findComponents({mainType:"angleAxis",filter:r})[0],h=n.findComponents({mainType:"radiusAxis",filter:r})[0],l=h.get("type"),c=a.get("type"),f=[{name:"radius",type:s(l),stackable:o(l)},{name:"angle",type:s(c),stackable:o(c)}],d="category"===c;return u(f,t,["radius","angle","value"]),{dimensions:f,categoryIndex:d?1:0,categoryAxisModel:d?a:"category"===l?h:null}},geo:function(t,e,n){return{dimensions:u([{name:"lng"},{name:"lat"}],t,["lng","lat","value"])}}};t.exports=a},function(t,e,n){var i=n(4),r=n(9),a=n(32),o=Math.floor,s=Math.ceil,h=a.extend({type:"interval",_interval:0,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),h.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval||this.niceTicks(),this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice()},getTicks:function(){this._interval||this.niceTicks();var t=this._interval,e=this._extent,n=[],r=1e4;if(t){var a=this._niceExtent;e[0]r)return[];e[1]>a[1]&&n.push(e[1])}return n},getTicksLabels:function(){for(var t=[],e=this.getTicks(),n=0;nn&&(n=-n,e.reverse());var r=i.nice(n/t,!0),a=[i.round(s(e[0]/r)*r),i.round(o(e[1]/r)*r)];this._interval=r,this._niceExtent=a}},niceExtent:function(t,e,n){var r=this._extent;if(r[0]===r[1])if(0!==r[0]){var a=r[0]/2;r[0]-=a,r[1]+=a}else r[1]=1;var h=r[1]-r[0];isFinite(h)||(r[0]=0,r[1]=1),this.niceTicks(t);var l=this._interval;e||(r[0]=i.round(o(r[0]/l)*l)),n||(r[1]=i.round(s(r[1]/l)*l))}});h.create=function(){return new h},t.exports=h},function(t,e,n){function i(t){this.group=new a.Group,this._symbolCtor=t||o}function r(t,e,n){var i=t.getItemLayout(e);return i&&!isNaN(i[0])&&!isNaN(i[1])&&!(n&&n(e))&&"none"!==t.getItemVisual(e,"symbol")}var a=n(3),o=n(47),s=i.prototype;s.updateData=function(t,e){var n=this.group,i=t.hostModel,o=this._data,s=this._symbolCtor;t.diff(o).add(function(i){var a=t.getItemLayout(i);if(r(t,i,e)){var o=new s(t,i);o.attr("position",a),t.setItemGraphicEl(i,o),n.add(o)}}).update(function(h,l){var u=o.getItemGraphicEl(l),c=t.getItemLayout(h);return r(t,h,e)?(u?(u.updateData(t,h),a.updateProps(u,{position:c},i)):(u=new s(t,h),u.attr("position",c)),n.add(u),void t.setItemGraphicEl(h,u)):void n.remove(u)}).remove(function(t){var e=o.getItemGraphicEl(t);e&&e.fadeOut(function(){n.remove(e)})}).execute(),this._data=t},s.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,n){e.attr("position",t.getItemLayout(n))})},s.remove=function(t){var e=this.group,n=this._data;n&&(t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll())},t.exports=i},,,function(t,e,n){var i=n(1),r=n(20),a=r.parseClassType,o=0,s={},h="_";s.getUID=function(t){return[t||"",o++,Math.random()].join(h)},s.enableSubTypeDefaulter=function(t){var e={};return t.registerSubTypeDefaulter=function(t,n){t=a(t),e[t.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=a(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r},t},s.enableTopologicalTravel=function(t,e){function n(t){var n={},o=[];return i.each(t,function(s){var h=r(n,s),l=h.originalDeps=e(s),u=a(l,t);h.entryCount=u.length,0===h.entryCount&&o.push(s),i.each(u,function(t){i.indexOf(h.predecessor,t)<0&&h.predecessor.push(t);var e=r(n,t);i.indexOf(e.successor,t)<0&&e.successor.push(s)})}),{graph:n,noEntryList:o}}function r(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function a(t,e){var n=[];return i.each(t,function(t){i.indexOf(e,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,e,r,a){function o(t){l[t].entryCount--,0===l[t].entryCount&&u.push(t)}function s(t){c[t]=!0,o(t)}if(t.length){var h=n(e),l=h.graph,u=h.noEntryList,c={};for(i.each(t,function(t){c[t]=!0});u.length;){var f=u.pop(),d=l[f],p=!!c[f];p&&(r.call(a,f,d.originalDeps.slice()),delete c[f]),i.each(d.successor,p?s:o)}i.each(c,function(){throw new Error("Circle dependency may exists")})}}},t.exports=s},function(t,e){var n=1;"undefined"!=typeof window&&(n=Math.max(window.devicePixelRatio||1,1));var i={debugMode:0,devicePixelRatio:n};t.exports=i},function(t,e,n){function i(t,e){var n=t[1]-t[0],i=e,r=n/i/2;t[0]+=r,t[1]-=r}var r=n(4),a=r.linearMap,o=n(1),s=[0,1],h=function(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1};h.prototype={constructor:h,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&i>=t},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){var t=this._extent.slice();return t},getPixelPrecision:function(t){return r.getPixelPrecision(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,r=this.scale;return t=r.normalize(t),this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count())),a(t,s,n,e)},coordToData:function(t,e){var n=this._extent,r=this.scale;this.onBand&&"ordinal"===r.type&&(n=n.slice(),i(n,r.count()));var o=a(t,n,s,e);return this.scale.scale(o)},getTicksCoords:function(){if(this.onBand){for(var t=this.getBands(),e=[],n=0;no;o++)e.push([a*o/n+i,a*(o+1)/n+i]);return e},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n}},t.exports=h},function(t,e){t.exports=function(t,e,n,i,r){i.eachRawSeriesByType(t,function(t){var r=t.getData(),a=t.get("symbol")||e,o=t.get("symbolSize");r.setVisual({legendSymbol:n||a,symbol:a,symbolSize:o}),i.isSeriesFiltered(t)||("function"==typeof o&&r.each(function(e){var n=t.getRawValue(e),i=t.getDataParams(e);r.setItemVisual(e,"symbolSize",o(n,i))}),r.each(function(t){var e=r.getItemModel(t),n=e.get("symbol",!0),i=e.get("symbolSize",!0);null!=n&&r.setItemVisual(t,"symbol",n),null!=i&&r.setItemVisual(t,"symbolSize",i)}))})}},function(t,e,n){var i=n(42);t.exports=function(){if(0!==i.debugMode)if(1==i.debugMode)for(var t in arguments)throw new Error(arguments[t]);else if(i.debugMode>1)for(var t in arguments)console.log(arguments[t])}},function(t,e,n){function i(t){r.call(this,t)}var r=n(35),a=n(8),o=n(1),s=n(60),h=n(140),l=new h(50);i.prototype={constructor:i,type:"image",brush:function(t){var e,n=this.style,i=n.image;if(e="string"==typeof i?this._image:i,!e&&i){var r=l.get(i);if(!r)return e=new Image,e.onload=function(){e.onload=null;for(var t=0;t0?"top":"bottom",i="center"):u(a-c)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=a>0&&c>a?n>0?"right":"left":n>0?"left":"right"),{rotation:a,textAlign:i,verticalAlign:r}}function r(t,e,n){var i,r,a=l(-t.rotation),o=n[0]>n[1],s="start"===e&&!o||"start"!==e&&o;return u(a-c/2)?(r=s?"bottom":"top",i="center"):u(a-1.5*c)?(r=s?"top":"bottom",i="center"):(r="middle",i=1.5*c>a&&a>c/2?s?"left":"right":s?"right":"left"),{rotation:a,textAlign:i,verticalAlign:r}}var a=n(1),o=n(3),s=n(12),h=n(4),l=h.remRadian,u=h.isRadianAroundZero,c=Math.PI,f=function(t,e){this.opt=e,this.axisModel=t,a.defaults(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new o.Group({position:e.position.slice(),rotation:e.rotation})};f.prototype={constructor:f,hasBuilder:function(t){return!!d[t]},add:function(t){d[t].call(this)},getGroup:function(){return this.group}};var d={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var n=this.axisModel.axis.getExtent();this.group.add(new o.Line({shape:{x1:n[0],y1:0,x2:n[1],y2:0},style:a.extend({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle()),strokeContainThreshold:t.strokeContainThreshold,silent:!!t.silent,z2:1}))}},axisTick:function(){var t=this.axisModel;if(t.get("axisTick.show")){for(var e=t.axis,n=t.getModel("axisTick"),i=this.opt,r=n.getModel("lineStyle"),a=n.get("length"),s=g(n,i.labelInterval),h=e.getTicksCoords(),l=[],u=0;uc[1]?-1:1,d=["start"===s?c[0]-f*u:"end"===s?c[1]+f*u:(c[0]+c[1])/2,"middle"===s?t.labelOffset+h*u:0];a="middle"===s?i(t,t.rotation,h):r(t,s,c),this.group.add(new o.Text({style:{text:n,textFont:l.getFont(),fill:l.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:a.textAlign,textVerticalAlign:a.verticalAlign},position:d,rotation:a.rotation,silent:!0,z2:1}))}}},p=f.ifIgnoreOnTick=function(t,e,n){var i,r=t.scale;return"ordinal"===r.type&&("function"==typeof n?(i=r.getTicks()[e],!n(i,r.getLabel(i))):e%(n+1))},g=f.getInterval=function(t,e){var n=t.get("interval");return null!=n&&"auto"!=n||(n=e),n};t.exports=f},function(t,e,n){function i(t){return o.isObject(t)&&null!=t.value?t.value:t}function r(){return"category"===this.get("type")&&o.map(this.get("data"),i)}function a(){return s.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))}var o=n(1),s=n(23);t.exports={getFormattedLabels:a,getCategories:r}},function(t,e,n){"use strict";function i(t,e){return e.type||(e.data?"category":"value")}var r=n(10),a=n(1),o=n(61),s=r.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this._resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this._resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this._resetRange()},setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},getMin:function(){var t=this.option;return null!=t.rangeStart?t.rangeStart:t.min},getMax:function(){var t=this.option;return null!=t.rangeEnd?t.rangeEnd:t.max},getNeedCrossZero:function(){var t=this.option;return null!=t.rangeStart||null!=t.rangeEnd?!1:!t.scale},_resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}});a.merge(s.prototype,n(49));var h={gridIndex:0};o("x",s,i,h),o("y",s,i,h),t.exports=s},function(t,e,n){function i(t,e,n){return n.getComponent("grid",t.get("gridIndex"))===e}function r(t){var e,n=t.model,i=n.getFormattedLabels(),r=1,a=i.length;a>40&&(r=Math.ceil(a/40));for(var o=0;a>o;o+=r)if(!t.isLabelIgnored(o)){var s=n.getTextRect(i[o]);e?e.union(s):e=s}return e}function a(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this._model=t}function o(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}var s=n(11),h=n(23),l=n(1),u=n(107),c=n(105),f=l.each,d=h.ifAxisCrossZero,p=h.niceScaleExtent;n(108);var g=a.prototype;g.type="grid",g.getRect=function(){return this._rect},g.update=function(t,e){function n(t){var e=i[t];for(var n in e){var r=e[n];if(r&&("category"===r.type||!d(r)))return!0}return!1}var i=this._axesMap;this._updateScale(t,this._model),f(i.x,function(t){p(t,t.model)}),f(i.y,function(t){p(t,t.model)}),f(i.x,function(t){n("y")&&(t.onZero=!1)}),f(i.y,function(t){n("x")&&(t.onZero=!1)}),this.resize(this._model,e)},g.resize=function(t,e){function n(){f(a,function(t){var e=t.isHorizontal(),n=e?[0,i.width]:[0,i.height],r=t.inverse?1:0;t.setExtent(n[r],n[1-r]),o(t,e?i.x:i.y)})}var i=s.getLayoutRect(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=i;var a=this._axesList;n(),t.get("containLabel")&&(f(a,function(t){if(!t.model.get("axisLabel.inside")){var e=r(t);if(e){var n=t.isHorizontal()?"height":"width",a=t.model.get("axisLabel.margin");i[n]-=e[n]+a,"top"===t.position?i.y+=e.height+a:"left"===t.position&&(i.x+=e.width+a)}}}),n())},g.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)return n[i];return n[e]}},g.getCartesian=function(t,e){var n="x"+t+"y"+e;return this._coordsMap[n]},g._initCartesian=function(t,e,n){function r(n){return function(r,l){if(i(r,t,e)){var u=r.get("position");"x"===n?("top"!==u&&"bottom"!==u&&(u="bottom"),a[u]&&(u="top"===u?"bottom":"top")):("left"!==u&&"right"!==u&&(u="left"),a[u]&&(u="left"===u?"right":"left")),a[u]=!0;var f=new c(n,h.createScaleByModel(r),[0,0],r.get("type"),u),d="category"===f.type;f.onBand=d&&r.get("boundaryGap"),f.inverse=r.get("inverse"),f.onZero=r.get("axisLine.onZero"),r.axis=f,f.model=r,f.index=l,this._axesList.push(f),o[n][l]=f,s[n]++}}}var a={left:!1,right:!1,top:!1,bottom:!1},o={x:{},y:{}},s={x:0,y:0};return e.eachComponent("xAxis",r("x"),this),e.eachComponent("yAxis",r("y"),this),s.x&&s.y?(this._axesMap=o,void f(o.x,function(t,e){f(o.y,function(n,i){var r="x"+e+"y"+i,a=new u(r);a.grid=this,this._coordsMap[r]=a,this._coordsList.push(a),a.addAxis(t),a.addAxis(n)},this)},this)):(this._axesMap={},void(this._axesList=[]))},g._updateScale=function(t,e){function n(t,e,n){f(n.coordDimToDataDim(e.dim),function(n){e.scale.unionExtent(t.getDataExtent(n,"ordinal"!==e.scale.type))})}l.each(this._axesList,function(t){t.scale.setExtent(1/0,-(1/0))}),t.eachSeries(function(r){if("cartesian2d"===r.get("coordinateSystem")){var a=r.get("xAxisIndex"),o=r.get("yAxisIndex"),s=t.getComponent("xAxis",a),h=t.getComponent("yAxis",o);if(!i(s,e,t)||!i(h,e,t))return;var l=this.getCartesian(a,o),u=r.getData(),c=l.getAxis("x"),f=l.getAxis("y");"list"===u.type&&(n(u,c,r),n(u,f,r))}},this)},a.create=function(t,e){var n=[];return t.eachComponent("grid",function(i,r){var o=new a(i,t,e);o.name="grid_"+r,o.resize(i,e),i.coordinateSystem=o,n.push(o)}),t.eachSeries(function(e){if("cartesian2d"===e.get("coordinateSystem")){var i=e.get("xAxisIndex"),r=t.getComponent("xAxis",i),a=n[r.get("gridIndex")];e.coordinateSystem=a.getCartesian(i,e.get("yAxisIndex"))}}),n},a.dimensions=u.prototype.dimensions,n(28).register("cartesian2d",a),t.exports=a},function(t,e){"use strict";function n(t){return t}function i(t,e,i,r){this._old=t,this._new=e,this._oldKeyGetter=i||n,this._newKeyGetter=r||n}function r(t,e,n){for(var i=0;it;t++)this._add&&this._add(l[t]);else this._add&&this._add(l)}}},t.exports=i},function(t,e){t.exports=function(t,e,n){e.eachSeriesByType(t,function(t){var e=t.getData(),n=t.coordinateSystem,i=n.dimensions;e.each(i,function(t,i,r){var a;a=isNaN(t)||isNaN(i)?[NaN,NaN]:n.dataToPoint([t,i]),e.setItemLayout(r,a)},!0)})}},function(t,e,n){var i=n(26),r=n(41),a=n(20),o=function(){this.group=new i,this.uid=r.getUID("viewComponent")};o.prototype={constructor:o,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){}};var s=o.prototype;s.updateView=s.updateLayout=s.updateVisual=function(t,e,n,i){},a.enableClassExtend(o),a.enableClassManagement(o,{registerWhenExtend:!0}),t.exports=o},function(t,e,n){"use strict";var i=n(58),r=n(21),a=n(77),o=n(154),s=n(1),h=function(t){a.call(this,t),r.call(this,t),o.call(this,t),this.id=t.id||i()};h.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty()},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];n||(n=this[t]=[]),n[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty()},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty())},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n.5?e:t}function s(t,e,n,i,r){var o=t.length;if(1==r)for(var s=0;o>s;s++)i[s]=a(t[s],e[s],n);else for(var h=t[0].length,s=0;o>s;s++)for(var l=0;h>l;l++)i[s][l]=a(t[s][l],e[s][l],n)}function h(t,e,n){var i=t.length,r=e.length;if(i!==r){var a=i>r;if(a)t.length=r;else for(var o=i;r>o;o++)t.push(1===n?e[o]:x.call(e[o]))}}function l(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(var r=0;i>r;r++)if(t[r]!==e[r])return!1}else for(var a=t[0].length,r=0;i>r;r++)for(var o=0;a>o;o++)if(t[r][o]!==e[r][o])return!1;return!0}function u(t,e,n,i,r,a,o,s,h){var l=t.length;if(1==h)for(var u=0;l>u;u++)s[u]=c(t[u],e[u],n[u],i[u],r,a,o);else for(var f=t[0].length,u=0;l>u;u++)for(var d=0;f>d;d++)s[u][d]=c(t[u][d],e[u][d],n[u][d],i[u][d],r,a,o)}function c(t,e,n,i,r,a,o){var s=.5*(n-t),h=.5*(i-e);return(2*(e-n)+s+h)*o+(-3*(e-n)-2*s-h)*a+s*r+e}function f(t){if(y(t)){var e=t.length;if(y(t[0])){for(var n=[],i=0;e>i;i++)n.push(x.call(t[i]));return n}return x.call(t)}return t}function d(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function p(t,e,n,i,r){var f=t._getter,p=t._setter,m="spline"===e,x=i.length;if(x){var _,b=i[0].value,w=y(b),M=!1,S=!1,C=w&&y(b[0])?2:1;i.sort(function(t,e){return t.time-e.time}),_=i[x-1].time;for(var T=[],A=[],k=i[0].value,I=!0,L=0;x>L;L++){T.push(i[L].time/_);var P=i[L].value;if(w&&l(P,k,C)||!w&&P===k||(I=!1),k=P,"string"==typeof P){var D=v.parse(P);D?(P=D,M=!0):S=!0}A.push(P)}if(!I){if(w){for(var O=A[x-1],L=0;x-1>L;L++)h(A[L],O,C);h(f(t._target,r),O,C)}var z,E,B,R,N,F,V=0,G=0;if(M)var q=[0,0,0,0];var W=function(t,e){var n;if(G>e){for(z=Math.min(V+1,x-1),n=z;n>=0&&!(T[n]<=e);n--);n=Math.min(n,x-2)}else{for(n=V;x>n&&!(T[n]>e);n++);n=Math.min(n-1,x-2)}V=n,G=e;var i=T[n+1]-T[n];if(0!==i)if(E=(e-T[n])/i,m)if(R=A[n],B=A[0===n?n:n-1],N=A[n>x-2?x-1:n+1],F=A[n>x-3?x-1:n+2],w)u(B,R,N,F,E,E*E,E*E*E,f(t,r),C);else{var h;if(M)h=u(B,R,N,F,E,E*E,E*E*E,q,1),h=d(q);else{if(S)return o(R,N,E);h=c(B,R,N,F,E,E*E,E*E*E)}p(t,r,h)}else if(w)s(A[n],A[n+1],E,f(t,r),C);else{var h;if(M)s(A[n],A[n+1],E,q,1),h=d(q);else{if(S)return o(A[n],A[n+1],E);h=a(A[n],A[n+1],E)}p(t,r,h)}},H=new g({target:t._target,life:_,loop:t._loop,delay:t._delay,onframe:W,ondestroy:n});return e&&"spline"!==e&&(H.easing=e),H}}}var g=n(132),v=n(22),m=n(1),y=m.isArrayLike,x=Array.prototype.slice,_=function(t,e,n,a){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||i,this._setter=a||r,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var n=this._tracks;for(var i in e){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:f(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;e>n;n++)t[n].call(this)},start:function(t){var e,n=this,i=0,r=function(){i--,i||n._doneCallback()};for(var a in this._tracks){var o=p(this,t,r,this._tracks[a],a);o&&(this._clipList.push(o),i++,this.animation&&this.animation.addClip(o),e=o)}if(e){var s=e.onframe;e.onframe=function(t,e){s(t,e);for(var i=0;it&&(t+=n),t}}},function(t,e){var n=2311;t.exports=function(){return"zr_"+n++}},function(t,e,n){var i=n(144),r=n(143);t.exports={buildPath:function(t,e,n){var a=e.points,o=e.smooth;if(a&&a.length>=2){if(o&&"spline"!==o){var s=r(a,o,n,e.smoothConstraint);t.moveTo(a[0][0],a[0][1]);for(var h=a.length,l=0;(n?h:h-1)>l;l++){var u=s[2*l],c=s[2*l+1],f=a[(l+1)%h];t.bezierCurveTo(u[0],u[1],c[0],c[1],f[0],f[1])}}else{"spline"===o&&(a=i(a,n)),t.moveTo(a[0][0],a[0][1]);for(var l=1,d=a.length;d>l;l++)t.lineTo(a[l][0],a[l][1])}n&&t.closePath()}}}},function(t,e){t.exports={buildPath:function(t,e){var n,i,r,a,o=e.x,s=e.y,h=e.width,l=e.height,u=e.r;0>h&&(o+=h,h=-h),0>l&&(s+=l,l=-l),"number"==typeof u?n=i=r=a=u:u instanceof Array?1===u.length?n=i=r=a=u[0]:2===u.length?(n=r=u[0],i=a=u[1]):3===u.length?(n=u[0],i=a=u[1],r=u[2]):(n=u[0],i=u[1],r=u[2],a=u[3]):n=i=r=a=0;var c;n+i>h&&(c=n+i,n*=h/c,i*=h/c),r+a>h&&(c=r+a,r*=h/c,a*=h/c),i+r>l&&(c=i+r,i*=l/c,r*=l/c),n+a>l&&(c=n+a,n*=l/c,a*=l/c),t.moveTo(o+n,s),t.lineTo(o+h-i,s),0!==i&&t.quadraticCurveTo(o+h,s,o+h,s+i),t.lineTo(o+h,s+l-r),0!==r&&t.quadraticCurveTo(o+h,s+l,o+h-r,s+l),t.lineTo(o+a,s+l),0!==a&&t.quadraticCurveTo(o,s+l,o,s+l-a),t.lineTo(o,s+n),0!==n&&t.quadraticCurveTo(o,s,o+n,s)}}},function(t,e,n){var i=n(72),r=n(1),a=n(10),o=n(11),s=["value","category","time","log"];t.exports=function(t,e,n,h){r.each(s,function(a){e.extend({type:t+"Axis."+a,mergeDefaultAndTheme:function(e,i){var s=this.layoutMode,h=s?o.getLayoutParams(e):{},l=i.getTheme();r.merge(e,l.get(a+"Axis")),r.merge(e,this.getDefaultOption()),e.type=n(t,e),s&&o.mergeLayoutParam(e,h,s)},defaultOption:r.mergeAll([{},i[a+"Axis"],h],!0)})}),a.registerSubTypeDefaulter(t+"Axis",r.curry(n,t))}},function(t,e){t.exports=function(t,e){var n=e.findComponents({mainType:"legend"});n&&n.length&&e.eachSeriesByType(t,function(t){var e=t.getData();e.filterSelf(function(t){for(var i=e.getName(t),r=0;rd;d++){var x=m(t,n,a,l,p[d]);c[0]=o(x,c[0]),f[0]=s(x,f[0])}for(y=v(e,i,h,u,g),d=0;y>d;d++){var _=m(e,i,h,u,g[d]);c[1]=o(_,c[1]),f[1]=s(_,f[1])}c[0]=o(t,c[0]),f[0]=s(t,f[0]),c[0]=o(l,c[0]),f[0]=s(l,f[0]),c[1]=o(e,c[1]),f[1]=s(e,f[1]),c[1]=o(u,c[1]),f[1]=s(u,f[1])},a.fromQuadratic=function(t,e,n,i,a,h,l,u){var c=r.quadraticExtremum,f=r.quadraticAt,d=s(o(c(t,n,a),1),0),p=s(o(c(e,i,h),1),0),g=f(t,n,a,d),v=f(e,i,h,p);l[0]=o(t,a,g),l[1]=o(e,h,v),u[0]=s(t,a,g),u[1]=s(e,h,v)},a.fromArc=function(t,e,n,r,a,o,s,p,g){var v=i.min,m=i.max,y=Math.abs(a-o);if(1e-4>y%d&&y>1e-4)return p[0]=t-n,p[1]=e-r,g[0]=t+n,void(g[1]=e+r);if(u[0]=l(a)*n+t,u[1]=h(a)*r+e,c[0]=l(o)*n+t,c[1]=h(o)*r+e,v(p,u,c),m(g,u,c),a%=d,0>a&&(a+=d),o%=d,0>o&&(o+=d),a>o&&!s?o+=d:o>a&&s&&(a+=d),s){var x=o;o=a,a=x}for(var _=0;o>_;_+=Math.PI/2)_>a&&(f[0]=l(_)*n+t,f[1]=h(_)*r+e,v(p,f,p),m(g,f,g))},t.exports=a},function(t,e,n){var i=n(35),r=n(1),a=n(17),o=function(t){i.call(this,t)};o.prototype={constructor:o,type:"text",brush:function(t){var e=this.style,n=e.x||0,i=e.y||0,r=e.text,o=e.fill,s=e.stroke;if(null!=r&&(r+=""),r){if(t.save(),this.style.bind(t),this.setTransform(t),o&&(t.fillStyle=o),s&&(t.strokeStyle=s),t.font=e.textFont||e.font,t.textAlign=e.textAlign,e.textVerticalAlign){var h=a.getBoundingRect(r,t.font,e.textAlign,"top");switch(t.textBaseline="top",e.textVerticalAlign){case"middle":i-=h.height/2;break;case"bottom":i-=h.height}}else t.textBaseline=e.textBaseline;for(var l=a.measureText("国",t.font).width,u=r.split("\n"),c=0;c=0?parseFloat(t)/100*e:parseFloat(t):t}function r(t,e){t.transform(e[0],e[1],e[2],e[3],e[4],e[5])}var a=n(17),o=n(8),s=new o,h=function(){};h.prototype={constructor:h,drawRectText:function(t,e,n){var o=this.style,h=o.text;if(null!=h&&(h+=""),h){var l,u,c=o.textPosition,f=o.textDistance,d=o.textAlign,p=o.textFont||o.font,g=o.textBaseline,v=o.textVerticalAlign;n=n||a.getBoundingRect(h,p,d,g);var m=this.transform,y=this.invTransform;if(m&&(s.copy(e),s.applyTransform(m),e=s,r(t,y)),c instanceof Array)l=e.x+i(c[0],e.width),u=e.y+i(c[1],e.height),d=d||"left",g=g||"top";else{var x=a.adjustTextPositionOnRect(c,e,n,f);l=x.x,u=x.y,d=d||x.textAlign,g=g||x.textBaseline}if(t.textAlign=d,v){switch(v){case"middle":u-=n.height/2;break;case"bottom":u-=n.height}t.textBaseline="top"}else t.textBaseline=g;var _=o.textFill,b=o.textStroke;_&&(t.fillStyle=_),b&&(t.strokeStyle=b),t.font=p,t.shadowColor=o.textShadowColor,t.shadowBlur=o.textShadowBlur,t.shadowOffsetX=o.textShadowOffsetX,t.shadowOffsetY=o.textShadowOffsetY;for(var w=h.split("\n"),M=0;Me&&a>i||e>a&&i>a)return 0;if(i===e)return 0;var o=e>i?1:-1,s=(a-e)/(i-e),h=s*(n-t)+t;return h>r?o:0}},function(t,e,n){"use strict";var i=n(1),r=n(16),a=function(t,e,n,i,a){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,r.call(this,a)};a.prototype={constructor:a,type:"linear",updateCanvasGradient:function(t,e){for(var n=t.getBoundingRect(),i=this.x*n.width+n.x,r=this.x2*n.width+n.x,a=this.y*n.height+n.y,o=this.y2*n.height+n.y,s=e.createLinearGradient(i,a,r,o),h=this.colorStops,l=0;ls||-s>t}var r=n(19),a=n(5),o=r.identity,s=5e-5,h=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},l=h.prototype;l.transform=null,l.needLocalTransform=function(){return i(this.rotation)||i(this.position[0])||i(this.position[1])||i(this.scale[0]-1)||i(this.scale[1]-1)},l.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;return n||e?(i=i||r.create(),n?this.getLocalTransform(i):o(i),e&&(n?r.mul(i,t.transform,i):r.copy(i,t.transform)),this.transform=i,this.invTransform=this.invTransform||r.create(),void r.invert(this.invTransform,i)):void(i&&o(i))},l.getLocalTransform=function(t){t=t||[],o(t);var e=this.origin,n=this.scale,i=this.rotation,a=this.position;return e&&(t[4]-=e[0],t[5]-=e[1]),r.scale(t,t,n),i&&r.rotate(t,t,i),e&&(t[4]+=e[0],t[5]+=e[1]),t[4]+=a[0],t[5]+=a[1],t},l.setTransform=function(t){var e=this.transform;e&&t.transform(e[0],e[1],e[2],e[3],e[4],e[5])};var u=[];l.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(r.mul(u,t.invTransform,e),e=u);var n=e[0]*e[0]+e[1]*e[1],a=e[2]*e[2]+e[3]*e[3],o=this.position,s=this.scale;i(n-1)&&(n=Math.sqrt(n)),i(a-1)&&(a=Math.sqrt(a)),e[0]<0&&(n=-n),e[3]<0&&(a=-a),o[0]=e[4],o[1]=e[5],s[0]=n,s[1]=a,this.rotation=Math.atan2(-e[1]/a,e[0]/n)}},l.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&a.applyTransform(n,n,i),n},l.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&a.applyTransform(n,n,i),n},t.exports=h},function(t,e,n){"use strict";function i(t){r.each(a,function(e){this[e]=r.bind(t[e],t)},this)}var r=n(1),a=["getDom","getZr","getWidth","getHeight","dispatchAction","on","off","getDataURL","getConnectedDataURL","getModel","getOption"];t.exports=i},function(t,e,n){var i=n(1);n(51),n(80),n(81);var r=n(110),a=n(2);a.registerLayout(i.curry(r,"bar")),a.registerVisualCoding("chart",function(t){t.eachSeriesByType("bar",function(t){var e=t.getData();e.setVisual("legendSymbol","roundRect")})}),n(34)},function(t,e,n){"use strict";var i=n(13),r=n(36);t.exports=i.extend({type:"series.bar",dependencies:["grid","polar"],getInitialData:function(t,e){return r(t.data,this,e)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(t),i=this.getData(),r=i.getLayout("offset"),a=i.getLayout("size"),o=e.getBaseAxis().isHorizontal()?0:1;return n[o]+=r+a/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,barMinHeight:0,itemStyle:{normal:{barBorderColor:"#fff",barBorderWidth:0},emphasis:{barBorderColor:"#fff",barBorderWidth:0}}}})},function(t,e,n){"use strict";function i(t,e){var n=t.width>0?1:-1,i=t.height>0?1:-1;e=Math.min(e,Math.abs(t.width),Math.abs(t.height)),t.x+=n*e/2,t.y+=i*e/2,t.width-=n*e,t.height-=i*e}var r=n(1),a=n(3);r.extend(n(12).prototype,n(82)),t.exports=n(2).extendChartView({type:"bar",render:function(t,e,n){var i=t.get("coordinateSystem");return"cartesian2d"===i&&this._renderOnCartesian(t,e,n),this.group},_renderOnCartesian:function(t,e,n){function o(e,n){var o=h.getItemLayout(e),s=h.getItemModel(e).get(p)||0;i(o,s);var l=new a.Rect({shape:r.extend({},o)});if(d){var u=l.shape,c=f?"height":"width",g={};u[c]=0,g[c]=o[c],a[n?"updateProps":"initProps"](l,{shape:g},t)}return l}var s=this.group,h=t.getData(),l=this._data,u=t.coordinateSystem,c=u.getBaseAxis(),f=c.isHorizontal(),d=t.get("animation"),p=["itemStyle","normal","barBorderWidth"];h.diff(l).add(function(t){if(h.hasValue(t)){var e=o(t);h.setItemGraphicEl(t,e),s.add(e)}}).update(function(e,n){var r=l.getItemGraphicEl(n);if(!h.hasValue(e))return void s.remove(r);r||(r=o(e,!0));var u=h.getItemLayout(e),c=h.getItemModel(e).get(p)||0;i(u,c),a.updateProps(r,{shape:u},t),h.setItemGraphicEl(e,r),s.add(r)}).remove(function(e){var n=l.getItemGraphicEl(e);n&&(n.style.text="",a.updateProps(n,{shape:{width:0}},t,function(){s.remove(n)}))}).execute(),this._updateStyle(t,h,f),this._data=h},_updateStyle:function(t,e,n){function i(t,e,n,i,r){a.setText(t,e,n),t.text=i,"outside"===t.textPosition&&(t.textPosition=r)}e.eachItemGraphicEl(function(o,s){var h=e.getItemModel(s),l=e.getItemVisual(s,"color"),u=e.getItemLayout(s),c=h.getModel("itemStyle.normal"),f=h.getModel("itemStyle.emphasis").getBarItemStyle();o.setShape("r",c.get("barBorderRadius")||0),o.setStyle(r.defaults({fill:l},c.getBarItemStyle()));var d=n?u.height>0?"bottom":"top":u.width>0?"left":"right",p=h.getModel("label.normal"),g=h.getModel("label.emphasis"),v=o.style;p.get("show")?i(v,p,l,r.retrieve(t.getFormattedLabel(s,"normal"),t.getRawValue(s)),d):v.text="",g.get("show")?i(f,g,l,r.retrieve(t.getFormattedLabel(s,"emphasis"),t.getRawValue(s)),d):f.text="",a.setHoverStyle(o,f)})},remove:function(t,e){var n=this.group;t.get("animation")?this._data&&this._data.eachItemGraphicEl(function(e){e.style.text="",a.updateProps(e,{shape:{width:0}},t,function(){n.remove(e)})}):n.removeAll()}})},function(t,e,n){t.exports={getBarItemStyle:n(30)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]])}},,,function(t,e,n){var i=n(1),r=n(2);n(86),n(87),r.registerVisualCoding("chart",i.curry(n(44),"line","circle","line")),r.registerLayout(i.curry(n(53),"line")),r.registerProcessor("statistic",i.curry(n(122),"line")),n(34)},function(t,e,n){"use strict";var i=n(36),r=n(13);t.exports=r.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return i(t.data,this,e)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,polarIndex:0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},symbol:"emptyCircle",symbolSize:4,showSymbol:!0,animationEasing:"linear"}})},function(t,e,n){"use strict";function i(t,e){if(t.length===e.length){for(var n=0;ne[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function o(t){return t>=0?1:-1}function s(t,e){var n=t.getBaseAxis(),i=t.getOtherAxis(n),r=n.onZero?0:i.scale.getExtent()[0],a=i.dim,s="x"===a||"radius"===a?1:0;return e.mapArray([a],function(i,h){for(var l,u=e.stackedOn;u&&o(u.get(a,h))===o(i);){l=u;break}var c=[];return c[s]=e.get(n.dim,h),c[1-s]=l?l.get(a,h,!0):r,t.dataToPoint(c)},!0)}function h(t,e){return null!=e.dataIndex?e.dataIndex:null!=e.name?t.indexOfName(e.name):void 0}function l(t,e,n){var i=a(t.getAxis("x")),r=a(t.getAxis("y")),o=t.getBaseAxis().isHorizontal(),s=i[0],h=r[0],l=i[1]-s,u=r[1]-h;n.get("clipOverflow")||(o?(h-=u,u*=3):(s-=l,l*=3));var c=new v.Rect({shape:{x:s,y:h,width:l,height:u}});return e&&(c.shape[o?"width":"height"]=0,v.initProps(c,{shape:{width:l,height:u}},n)),c}function u(t,e,n){var i=t.getAngleAxis(),r=t.getRadiusAxis(),a=r.getExtent(),o=i.getExtent(),s=Math.PI/180,h=new v.Sector({shape:{cx:t.cx,cy:t.cy,r0:a[0],r:a[1],startAngle:-o[0]*s,endAngle:-o[1]*s,clockwise:i.inverse}});return e&&(h.shape.endAngle=-o[0]*s,v.initProps(h,{shape:{endAngle:-o[1]*s}},n)),h}function c(t,e,n){return"polar"===t.type?u(t,e,n):l(t,e,n)}var f=n(1),d=n(38),p=n(47),g=n(88),v=n(3),m=n(89),y=n(25);t.exports=y.extend({type:"line",init:function(){var t=new v.Group,e=new d;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var a=t.coordinateSystem,o=this.group,h=t.getData(),l=t.getModel("lineStyle.normal"),u=t.getModel("areaStyle.normal"),d=h.mapArray(h.getItemLayout,!0),p="polar"===a.type,g=this._coordSys,v=this._symbolDraw,m=this._polyline,y=this._polygon,x=this._lineGroup,_=t.get("animation"),b=!u.isEmpty(),w=s(a,h),M=t.get("showSymbol"),S=M&&!p&&!t.get("showAllSymbol")&&this._getSymbolIgnoreFunc(h,a),C=this._data;C&&C.eachItemGraphicEl(function(t,e){t.__temp&&(o.remove(t),C.setItemGraphicEl(e,null))}),M||v.remove(),o.add(x),m&&g.type===a.type?(b&&!y?y=this._newPolygon(d,w,a,_):y&&!b&&(x.remove(y),y=this._polygon=null),x.setClipPath(c(a,!1,t)),M&&v.updateData(h,S),h.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),i(this._stackedOnPoints,w)&&i(this._points,d)||(_?this._updateAnimation(h,w,a,n):(m.setShape({points:d}),y&&y.setShape({points:d,stackedOnPoints:w})))):(M&&v.updateData(h,S),m=this._newPolyline(d,a,_),b&&(y=this._newPolygon(d,w,a,_)),x.setClipPath(c(a,!0,t))),m.setStyle(f.defaults(l.getLineStyle(),{stroke:h.getVisual("color"),lineJoin:"bevel"}));var T=t.get("smooth");if(T=r(t.get("smooth")),m.setShape({smooth:T,smoothMonotone:t.get("smoothMonotone")}),y){var A=h.stackedOn,k=0;if(y.style.opacity=.7,y.setStyle(f.defaults(u.getAreaStyle(),{fill:h.getVisual("color"),lineJoin:"bevel"})),A){var I=A.hostModel;k=r(I.get("smooth"))}y.setShape({smooth:T,stackedOnSmooth:k,smoothMonotone:t.get("smoothMonotone")})}this._data=h,this._coordSys=a,this._stackedOnPoints=w,this._points=d},highlight:function(t,e,n,i){var r=t.getData(),a=h(r,i);if(null!=a&&a>=0){var o=r.getItemGraphicEl(a);if(!o){var s=r.getItemLayout(a);o=new p(r,a,n),o.position=s,o.setZ(t.get("zlevel"),t.get("z")),o.ignore=isNaN(s[0])||isNaN(s[1]),o.__temp=!0,r.setItemGraphicEl(a,o),o.stopSymbolAnimation(!0),this.group.add(o)}o.highlight()}else y.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),a=h(r,i);if(null!=a&&a>=0){var o=r.getItemGraphicEl(a);o&&(o.__temp?(r.setItemGraphicEl(a,null),this.group.remove(o)):o.downplay())}else y.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new m.Polyline({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new m.Polygon({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_getSymbolIgnoreFunc:function(t,e){var n=e.getAxesByScale("ordinal")[0];return n&&n.isLabelIgnored?f.bind(n.isLabelIgnored,n):void 0},_updateAnimation:function(t,e,n,i){var r=this._polyline,a=this._polygon,o=t.hostModel,s=g(this._data,t,this._stackedOnPoints,e,this._coordSys,n);r.shape.points=s.current,v.updateProps(r,{shape:{points:s.next}},o),a&&(a.setShape({points:s.current,stackedOnPoints:s.stackedOnCurrent}),v.updateProps(a,{shape:{points:s.next,stackedOnPoints:s.stackedOnNext}},o));for(var h=[],l=s.status,u=0;u=0?1:-1}function i(t,e,i){for(var r,a=t.getBaseAxis(),o=t.getOtherAxis(a),s=a.onZero?0:o.scale.getExtent()[0],h=o.dim,l="x"===h||"radius"===h?1:0,u=e.stackedOn,c=e.get(h,i);u&&n(u.get(h,i))===n(c);){r=u;break}var f=[];return f[l]=e.get(a.dim,i),f[1-l]=r?r.get(h,i,!0):s,t.dataToPoint(f)}function r(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}t.exports=function(t,e,n,a,o,s){for(var h=r(t,e),l=[],u=[],c=[],f=[],d=[],p=[],g=[],v=s.dimensions,m=0;mx;x++){var _=e[y];if(y>=i||0>y||isNaN(_[0])||isNaN(_[1]))break;if(y===n)t[a>0?"moveTo":"lineTo"](_[0],_[1]),u(f,_);else if(v>0){var b=y-a,w=y+a,M=.5,S=e[b],C=e[w];if(a>0&&(y===r-1||isNaN(C[0])||isNaN(C[1]))||0>=a&&(0===y||isNaN(C[0])||isNaN(C[1])))u(d,_);else{(isNaN(C[0])||isNaN(C[1]))&&(C=_),o.sub(c,C,S);var T,A;if("x"===m||"y"===m){var k="x"===m?0:1;T=Math.abs(_[k]-S[k]),A=Math.abs(_[k]-C[k])}else T=o.dist(_,S),A=o.dist(_,C);M=A/(A+T),l(d,_,c,-v*(1-M))}s(f,f,g),h(f,f,p),s(d,d,g),h(d,d,p),t.bezierCurveTo(f[0],f[1],d[0],d[1],_[0],_[1]),l(f,_,c,v*M)}else t.lineTo(_[0],_[1]);y+=a}return x}function r(t,e){var n=[1/0,1/0],i=[-(1/0),-(1/0)];if(e)for(var r=0;ri[0]&&(i[0]=a[0]),a[1]>i[1]&&(i[1]=a[1])}return{min:e?n:i,max:e?i:n}}var a=n(6),o=n(5),s=o.min,h=o.max,l=o.scaleAndAdd,u=o.copy,c=[],f=[],d=[];t.exports={Polyline:a.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null},style:{fill:null,stroke:"#000"},buildPath:function(t,e){for(var n=e.points,a=0,o=n.length,s=r(n,e.smoothConstraint);o>a;)a+=i(t,n,a,o,o,1,s.min,s.max,e.smooth,e.smoothMonotone)+1}}),Polygon:a.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null},buildPath:function(t,e){for(var n=e.points,a=e.stackedOnPoints,o=0,s=n.length,h=e.smoothMonotone,l=r(n,e.smoothConstraint),u=r(a,e.smoothConstraint);s>o;){var c=i(t,n,o,s,s,1,l.min,l.max,e.smooth,h);i(t,a,o+c-1,s,c,-1,u.min,u.max,e.stackedOnSmooth,h),o+=c+1,t.closePath()}}})}},function(t,e,n){var i=n(1),r=n(2);n(91),n(92),n(68)("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),r.registerVisualCoding("chart",i.curry(n(63),"pie")),r.registerLayout(i.curry(n(94),"pie")),r.registerProcessor("filter",i.curry(n(62),"pie"))},function(t,e,n){"use strict";var i=n(14),r=n(1),a=n(7),o=n(31),s=n(69),h=n(2).extendSeriesModel({type:"series.pie",init:function(t){h.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._dataBeforeProcessed},this.updateSelectedMap(),this._defaultLabelLine(t)},mergeOption:function(t){h.superCall(this,"mergeOption",t),this.updateSelectedMap()},getInitialData:function(t,e){var n=o(["value"],t.data),r=new i(n,this);return r.initData(t.data),r},getDataParams:function(t){var e=this._data,n=h.superCall(this,"getDataParams",t),i=e.getSum("value");return n.percent=i?+(e.get("value",t)/i*100).toFixed(2):0,n.$vars.push("percent"),n},_defaultLabelLine:function(t){a.defaultEmphasis(t.labelLine,["show"]);var e=t.labelLine.normal,n=t.labelLine.emphasis;e.show=e.show&&t.label.normal.show,n.show=n.show&&t.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,avoidLabelOverlap:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderColor:"rgba(0,0,0,0)",borderWidth:1},emphasis:{borderColor:"rgba(0,0,0,0)",borderWidth:1}},animationEasing:"cubicOut",data:[]}});r.mixin(h,s),t.exports=h},function(t,e,n){function i(t,e,n,i){var a=e.getData(),o=this.dataIndex,s=a.getName(o),h=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:s,seriesId:e.id}),a.each(function(t){r(a.getItemGraphicEl(t),a.getItemLayout(t),e.isSelected(a.getName(t)),h,n)})}function r(t,e,n,i,r){var a=(e.startAngle+e.endAngle)/2,o=Math.cos(a),s=Math.sin(a),h=n?i:0,l=[o*h,s*h];r?t.animate().when(200,{position:l}).start("bounceOut"):t.attr("position",l)}function a(t,e){function n(){a.ignore=a.hoverIgnore,o.ignore=o.hoverIgnore}function i(){a.ignore=a.normalIgnore,o.ignore=o.normalIgnore}s.Group.call(this);var r=new s.Sector({z2:2}),a=new s.Polyline,o=new s.Text;this.add(r),this.add(a),this.add(o),this.updateData(t,e,!0),this.on("emphasis",n).on("normal",i).on("mouseover",n).on("mouseout",i)}function o(t,e,n,i,r){var a=i.getModel("textStyle"),o="inside"===r||"inner"===r;return{fill:a.getTextColor()||(o?"#fff":t.getItemVisual(e,"color")),textFont:a.getFont(),text:h.retrieve(t.hostModel.getFormattedLabel(e,n),t.getName(e))}}var s=n(3),h=n(1),l=a.prototype;l.updateData=function(t,e,n){function i(){o.stopAnimation(!0),o.animateTo({shape:{r:c.r+10}},300,"elasticOut")}function a(){o.stopAnimation(!0),o.animateTo({shape:{r:c.r}},300,"elasticOut")}var o=this.childAt(0),l=t.hostModel,u=t.getItemModel(e),c=t.getItemLayout(e),f=h.extend({},c);f.label=null,n?(o.setShape(f),o.shape.endAngle=c.startAngle,s.updateProps(o,{shape:{endAngle:c.endAngle}},l)):s.updateProps(o,{shape:f},l);var d=u.getModel("itemStyle"),p=t.getItemVisual(e,"color");o.setStyle(h.defaults({fill:p},d.getModel("normal").getItemStyle())),o.hoverStyle=d.getModel("emphasis").getItemStyle(),r(this,t.getItemLayout(e),u.get("selected"),l.get("selectedOffset"),l.get("animation")),o.off("mouseover").off("mouseout").off("emphasis").off("normal"),u.get("hoverAnimation")&&o.on("mouseover",i).on("mouseout",a).on("emphasis",i).on("normal",a),this._updateLabel(t,e),s.setHoverStyle(this)},l._updateLabel=function(t,e){var n=this.childAt(1),i=this.childAt(2),r=t.hostModel,a=t.getItemModel(e),h=t.getItemLayout(e),l=h.label,u=t.getItemVisual(e,"color");s.updateProps(n,{shape:{points:l.linePoints||[[l.x,l.y],[l.x,l.y],[l.x,l.y]]}},r),s.updateProps(i,{style:{x:l.x,y:l.y}},r),i.attr({style:{textVerticalAlign:l.verticalAlign,textAlign:l.textAlign,textFont:l.font},rotation:l.rotation,origin:[l.x,l.y],z2:10});var c=a.getModel("label.normal"),f=a.getModel("label.emphasis"),d=a.getModel("labelLine.normal"),p=a.getModel("labelLine.emphasis"),g=c.get("position")||f.get("position");i.setStyle(o(t,e,"normal",c,g)),i.ignore=i.normalIgnore=!c.get("show"),i.hoverIgnore=!f.get("show"),n.ignore=n.normalIgnore=!d.get("show"),n.hoverIgnore=!p.get("show"),n.setStyle({stroke:u}),n.setStyle(d.getModel("lineStyle").getLineStyle()),i.hoverStyle=o(t,e,"emphasis",f,g),n.hoverStyle=p.getModel("lineStyle").getLineStyle();var v=d.get("smooth");v&&v===!0&&(v=.4),n.setShape({smooth:v})},h.inherits(a,s.Group);var u=n(25).extend({type:"pie",init:function(){var t=new s.Group;this._sectorGroup=t},render:function(t,e,n,r){if(!r||r.from!==this.uid){var o=t.getData(),s=this._data,l=this.group,u=e.get("animation"),c=!s,f=h.curry(i,this.uid,t,u,n),d=t.get("selectedMode");if(o.diff(s).add(function(t){var e=new a(o,t);c&&e.eachChild(function(t){t.stopAnimation(!0)}),d&&e.on("click",f),o.setItemGraphicEl(t,e),l.add(e)}).update(function(t,e){var n=s.getItemGraphicEl(e);n.updateData(o,t),n.off("click"),d&&n.on("click",f),l.add(n),o.setItemGraphicEl(t,n)}).remove(function(t){var e=s.getItemGraphicEl(t);l.remove(e)}).execute(),u&&c&&o.count()>0){var p=o.getItemLayout(0),g=Math.max(n.getWidth(),n.getHeight())/2,v=h.bind(l.removeClipPath,l);l.setClipPath(this._createClipPath(p.cx,p.cy,g,p.startAngle,p.clockwise,v,t))}this._data=o}},_createClipPath:function(t,e,n,i,r,a,o){var h=new s.Sector({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return s.initProps(h,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},o,a),h}});t.exports=u},function(t,e,n){"use strict";function i(t,e,n,i,r,a,o){function s(e,n,i,r){for(var a=e;n>a;a++)if(t[a].y+=i,a>e&&n>a+1&&t[a+1].y>t[a].y+t[a].height)return void h(a,i/2);h(n-1,i/2)}function h(e,n){for(var i=e;i>=0&&(t[i].y-=n,!(i>0&&t[i].y>t[i-1].y+t[i-1].height));i--);}function l(t,e,n,i,r,a){for(var o=a>0?e?Number.MAX_VALUE:0:e?Number.MAX_VALUE:0,s=0,h=t.length;h>s;s++)if("center"!==t[s].position){var l=Math.abs(t[s].y-i),u=t[s].len,c=t[s].len2,f=r+u>l?Math.sqrt((r+u+c)*(r+u+c)-l*l):Math.abs(t[s].x-n);e&&f>=o&&(f=o-10),!e&&o>=f&&(f=o+10),t[s].x=n+f*a,o=f}}t.sort(function(t,e){return t.y-e.y});for(var u,c=0,f=t.length,d=[],p=[],g=0;f>g;g++)u=t[g].y-c,0>u&&s(g,f,-u,r),c=t[g].y+t[g].height;0>o-c&&h(f-1,c-o);for(var g=0;f>g;g++)t[g].y>=n?p.push(t[g]):d.push(t[g]);l(d,!1,e,n,i,r),l(p,!0,e,n,i,r)}function r(t,e,n,r,a,o){for(var s=[],h=[],l=0;lb?-1:1)*x,I=A;i=k+(0>b?-5:5),r=I,c=[[S,C],[T,A],[k,I]]}f=M?"center":b>0?"left":"right"}var L=g.getModel("textStyle").getFont(),P=g.get("rotate")?0>b?-_+Math.PI:-_:0,D=t.getFormattedLabel(n,"normal")||h.getName(n),O=a.getBoundingRect(D,L,f,"top");u=!!P,d.label={x:i,y:r,position:v,height:O.height,len:y,len2:x,linePoints:c,textAlign:f,verticalAlign:"middle",font:L,rotation:P},M||l.push(d.label)}),!u&&t.get("avoidLabelOverlap")&&r(l,o,s,e,n,i)}},function(t,e,n){var i=n(4),r=i.parsePercent,a=n(93),o=n(1),s=2*Math.PI,h=Math.PI/180;t.exports=function(t,e,n){e.eachSeriesByType(t,function(t){var e=t.get("center"),l=t.get("radius");o.isArray(l)||(l=[0,l]),o.isArray(e)||(e=[e,e]);var u=n.getWidth(),c=n.getHeight(),f=Math.min(u,c),d=r(e[0],u),p=r(e[1],c),g=r(l[0],f/2),v=r(l[1],f/2),m=t.getData(),y=-t.get("startAngle")*h,x=t.get("minAngle")*h,_=m.getSum("value"),b=Math.PI/(_||m.count())*2,w=t.get("clockwise"),M=t.get("roseType"),S=m.getDataExtent("value");S[0]=0;var C=s,T=0,A=y,k=w?1:-1;if(m.each("value",function(t,e){var n;n="area"!==M?0===_?b:t*b:s/(m.count()||1),x>n?(n=x,C-=x):T+=t;var r=A+k*n;m.setItemLayout(e,{angle:n,startAngle:A,endAngle:r,clockwise:w,cx:d,cy:p,r0:g,r:M?i.linearMap(t,S,[g,v]):v}),A=r},!0),s>C)if(.001>=C){var I=s/m.count();m.each(function(t){var e=m.getItemLayout(t);e.startAngle=y+k*t*I,e.endAngle=y+k*(t+1)*I})}else b=C/T,A=y,m.each("value",function(t,e){var n=m.getItemLayout(e),i=n.angle===x?x:t*b;n.startAngle=A,n.endAngle=A+k*i,A+=i});a(t,v,u,c)})}},,function(t,e,n){"use strict";n(50),n(97)},function(t,e,n){function i(t,e){function n(t,e){var n=i.getAxis(t);return n.toGlobalCoord(n.dataToCoord(0))}var i=t.coordinateSystem,r=e.axis,a={},o=r.position,s=r.onZero?"onZero":o,h=r.dim,l=i.getRect(),u=[l.x,l.x+l.width,l.y,l.y+l.height],c={x:{top:u[2],bottom:u[3]},y:{left:u[0],right:u[1]}};c.x.onZero=Math.max(Math.min(n("y"),c.x.bottom),c.x.top),c.y.onZero=Math.max(Math.min(n("x"),c.y.right),c.y.left),a.position=["y"===h?c.y[s]:u[0],"x"===h?c.x[s]:u[3]];var f={x:0,y:1};a.rotation=Math.PI/2*f[h];var d={top:-1,bottom:1,left:-1,right:1};a.labelDirection=a.tickDirection=a.nameDirection=d[o],r.onZero&&(a.labelOffset=c[h][o]-c[h].onZero),e.getModel("axisTick").get("inside")&&(a.tickDirection=-a.tickDirection),e.getModel("axisLabel").get("inside")&&(a.labelDirection=-a.labelDirection);var p=e.getModel("axisLabel").get("rotate");return a.labelRotation="top"===s?-p:p,a.labelInterval=r.getLabelInterval(),a.z2=1,a}var r=n(1),a=n(3),o=n(48),s=o.ifIgnoreOnTick,h=o.getInterval,l=["axisLine","axisLabel","axisTick","axisName"],u=["splitLine","splitArea"],c=n(2).extendComponentView({type:"axis",render:function(t,e){if(this.group.removeAll(),t.get("show")){var n=e.getComponent("grid",t.get("gridIndex")),a=i(n,t),s=new o(t,a);r.each(l,s.add,s),this.group.add(s.getGroup()),r.each(u,function(e){t.get(e+".show")&&this["_"+e](t,n,a.labelInterval)},this)}},_splitLine:function(t,e,n){var i=t.axis,o=t.getModel("splitLine"),l=o.getModel("lineStyle"),u=l.get("width"),c=l.get("color"),f=h(o,n);c=r.isArray(c)?c:[c];for(var d=e.coordinateSystem.getRect(),p=i.isHorizontal(),g=[],v=0,m=i.getTicksCoords(),y=[],x=[],_=0;_n&&(n=Math.min(n,u),u-=n,t.width=n,c--)}),f=(u-s)/(c+(c-1)*l),f=Math.max(f,0);var d,p=0;o.each(n,function(t,e){t.width||(t.width=f),d=t,p+=t.width*(1+l)}),d&&(p-=d.width*l);var g=-p/2;o.each(n,function(t,n){r[e][n]=r[e][n]||{offset:g,width:t.width},g+=t.width*(1+l)})}),r}function a(t,e,n){var a=r(o.filter(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),s={};e.eachSeriesByType(t,function(t){var e=t.getData(),n=t.coordinateSystem,r=n.getBaseAxis(),o=i(t),h=a[r.index][o],l=h.offset,u=h.width,c=n.getOtherAxis(r),f=t.get("barMinHeight")||0,d=r.onZero?c.toGlobalCoord(c.dataToCoord(0)):c.getGlobalExtent()[0],p=n.dataToPoints(e,!0);s[o]=s[o]||[],e.setLayout({offset:l,size:u}),e.each(c.dim,function(t,n){if(!isNaN(t)){s[o][n]||(s[o][n]={p:d,n:d});var i,r,a,h,g=t>=0?"p":"n",v=p[n],m=s[o][n][g];c.isHorizontal()?(i=m,r=v[1]+l,a=v[0]-m,h=u,Math.abs(a)a?-1:1)*f),s[o][n][g]+=a):(i=v[0]+l,r=m,a=u,h=v[1]-m,Math.abs(h)=h?-1:1)*f),s[o][n][g]+=h),e.setItemLayout(n,{x:i,y:r,width:a,height:h})}},!0)},this)}var o=n(1),s=n(4),h=s.parsePercent;t.exports=a},function(t,e,n){var i=n(3),r=n(1),a=Math.PI;t.exports=function(t,e){e=e||{},r.defaults(e,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var n=new i.Rect({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),o=new i.Arc({shape:{startAngle:-a/2,endAngle:-a/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),s=new i.Rect({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});o.animateShape(!0).when(1e3,{endAngle:3*a/2}).start("circularInOut"),o.animateShape(!0).when(1e3,{startAngle:3*a/2}).delay(300).start("circularInOut");var h=new i.Group;return h.add(o),h.add(s),h.add(n),h.resize=function(){var e=t.getWidth()/2,i=t.getHeight()/2;o.setShape({cx:e,cy:i});var r=o.shape.r;s.setShape({x:e-r,y:i-r,width:2*r,height:2*r}),n.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},h.resize(),h}},function(t,e,n){function i(t,e){for(var n in e)_.hasClass(n)||("object"==typeof e[n]?t[n]=t[n]?c.merge(t[n],e[n],!1):c.clone(e[n]):null==t[n]&&(t[n]=e[n]))}function r(t){t=t,this.option={},this.option[w]=1,this._componentsMap={},this._seriesIndices=null,i(t,this._theme.option),c.merge(t,b,!1),this.mergeOption(t)}function a(t,e){c.isArray(e)||(e=e?[e]:[]);var n={};return p(e,function(e){n[e]=(t[e]||[]).slice()}),n}function o(t,e){var n={};p(e,function(t,e){var i=t.exist;i&&(n[i.id]=t)}),p(e,function(e,i){var r=e.option;if(c.assert(!r||null==r.id||!n[r.id]||n[r.id]===e,"id duplicates: "+(r&&r.id)),r&&null!=r.id&&(n[r.id]=e),x(r)){var a=s(t,r,e.exist);e.keyInfo={mainType:t,subType:a}}}),p(e,function(t,e){var i=t.exist,r=t.option,a=t.keyInfo;if(x(r)){if(a.name=null!=r.name?r.name+"":i?i.name:"\x00-",i)a.id=i.id;else if(null!=r.id)a.id=r.id+"";else{var o=0;do a.id="\x00"+a.name+"\x00"+o++;while(n[a.id])}n[a.id]=t}})}function s(t,e,n){var i=e.type?e.type:n?n.subType:_.determineSubType(t,e);return i}function h(t){return v(t,function(t){return t.componentIndex})||[]}function l(t,e){return e.hasOwnProperty("subType")?g(t,function(t){return t.subType===e.subType}):t}function u(t){if(!t._seriesIndices)throw new Error("Series has not been initialized yet.")}var c=n(1),f=n(7),d=n(12),p=c.each,g=c.filter,v=c.map,m=c.isArray,y=c.indexOf,x=c.isObject,_=n(10),b=n(114),w="\x00_ec_inner",M=d.extend({constructor:M,init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new d(n),this._optionManager=i},setOption:function(t,e){c.assert(!(w in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption()},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var i=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(i)):r.call(this,i),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var a=n.getTimelineOption(this);a&&(this.mergeOption(a),e=!0)}if(!t||"recreate"===t||"media"===t){var o=n.getMediaOption(this,this._api);o.length&&p(o,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){function e(e,r){var s=f.normalizeToArray(t[e]),l=f.mappingToExists(i[e],s);o(e,l);var u=a(i,r);n[e]=[],i[e]=[],p(l,function(t,r){var a=t.exist,o=t.option;if(c.assert(x(o)||a,"Empty component definition"),o){var s=_.getClass(e,t.keyInfo.subType,!0);a&&a instanceof s?(a.mergeOption(o,this),a.optionUpdated(this)):(a=new s(o,this,this,c.extend({dependentModels:u,componentIndex:r},t.keyInfo)),a.optionUpdated(this))}else a.mergeOption({},this),a.optionUpdated(this);i[e][r]=a,n[e][r]=a.option},this),"series"===e&&(this._seriesIndices=h(i.series))}var n=this.option,i=this._componentsMap,r=[];p(t,function(t,e){null!=t&&(_.hasClass(e)?r.push(e):n[e]=null==n[e]?c.clone(t):c.merge(n[e],t,!0))}),_.topologicalTravel(r,_.getAllClassMainTypes(),e,this)},getOption:function(){var t=c.clone(this.option);return p(t,function(e,n){if(_.hasClass(n)){for(var e=f.normalizeToArray(e),i=e.length-1;i>=0;i--)f.isIdInner(e[i])&&e.splice(i,1);t[n]=e}}),delete t[w],t},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap[t];return n?n[e||0]:void 0},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n=t.index,i=t.id,r=t.name,a=this._componentsMap[e];if(!a||!a.length)return[];var o;if(null!=n)m(n)||(n=[n]),o=g(v(n,function(t){return a[t]}),function(t){return!!t});else if(null!=i){var s=m(i);o=g(a,function(t){return s&&y(i,t.id)>=0||!s&&t.id===i})}else if(null!=r){var h=m(r);o=g(a,function(t){return h&&y(r,t.name)>=0||!h&&t.name===r})}return l(o,t)},findComponents:function(t){function e(t){var e=r+"Index",n=r+"Id",i=r+"Name";return t&&(t.hasOwnProperty(e)||t.hasOwnProperty(n)||t.hasOwnProperty(i))?{mainType:r,index:t[e],id:t[n],name:t[i]}:null}function n(e){return t.filter?g(e,t.filter):e}var i=t.query,r=t.mainType,a=e(i),o=a?this.queryComponents(a):this._componentsMap[r];return n(l(o,t))},eachComponent:function(t,e,n){var i=this._componentsMap;if("function"==typeof t)n=e,e=t,p(i,function(t,i){p(t,function(t,r){e.call(n,i,t,r)})});else if(c.isString(t))p(i[t],e,n);else if(x(t)){var r=this.findComponents(t);p(r,e,n)}},getSeriesByName:function(t){var e=this._componentsMap.series;return g(e,function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.series[t]},getSeriesByType:function(t){var e=this._componentsMap.series;return g(e,function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.series.slice()},eachSeries:function(t,e){u(this),p(this._seriesIndices,function(n){var i=this._componentsMap.series[n];t.call(e,i,n)},this)},eachRawSeries:function(t,e){p(this._componentsMap.series,t,e)},eachSeriesByType:function(t,e,n){u(this),p(this._seriesIndices,function(i){var r=this._componentsMap.series[i];r.subType===t&&e.call(n,r,i)},this)},eachRawSeriesByType:function(t,e,n){return p(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return u(this),c.indexOf(this._seriesIndices,t.componentIndex)<0},filterSeries:function(t,e){u(this);var n=g(this._componentsMap.series,t,e);this._seriesIndices=h(n)},restoreData:function(){var t=this._componentsMap;this._seriesIndices=h(t.series);var e=[];p(t,function(t,n){e.push(n)}),_.topologicalTravel(e,_.getAllClassMainTypes(),function(e,n){p(t[e],function(t){t.restoreData()})})}});t.exports=M},function(t,e,n){function i(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newOptionBackup}function r(t,e){var n,i,r=[],a=[],o=t.timeline;if(t.baseOption&&(i=t.baseOption),(o||t.options)&&(i=i||{},r=(t.options||[]).slice()),t.media){i=i||{};var s=t.media;f(s,function(t){t&&t.option&&(t.query?a.push(t):n||(n=t))})}return i||(i=t),i.timeline||(i.timeline=o),f([i].concat(r).concat(l.map(a,function(t){return t.option})),function(t){f(e,function(e){e(t)})}),{baseOption:i,timelineOptions:r,mediaDefault:n,mediaList:a}}function a(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return l.each(t,function(t,e){var n=e.match(v);if(n&&n[1]&&n[2]){var a=n[1],s=n[2].toLowerCase();o(i[s],t,a)||(r=!1)}}),r}function o(t,e,n){return"min"===n?t>=e:"max"===n?e>=t:t===e}function s(t,e){return t.join(",")===e.join(",")}function h(t,e){e=e||{},f(e,function(e,n){if(null!=e){var i=t[n];if(c.hasClass(n)){e=u.normalizeToArray(e),i=u.normalizeToArray(i);var r=u.mappingToExists(i,e);t[n]=p(r,function(t){return t.option&&t.exist?g(t.exist,t.option,!0):t.exist||t.option})}else t[n]=g(i,e,!0)}})}var l=n(1),u=n(7),c=n(10),f=l.each,d=l.clone,p=l.map,g=l.merge,v=/^(min|max)?(.+)$/;i.prototype={constructor:i,setOption:function(t,e){t=d(t,!0);var n=this._optionBackup,i=this._newOptionBackup=r.call(this,t,e);n?(h(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=t?this._optionBackup:this._newOptionBackup;return this._timelineOptions=p(e.timelineOptions,d),this._mediaList=p(e.mediaList,d),this._mediaDefault=d(e.mediaDefault),this._currentMediaIndices=[],d(e.baseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=d(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,o=[],h=[];if(!i.length&&!r)return h;for(var l=0,u=i.length;u>l;l++)a(i[l].query,e,n)&&o.push(l);return!o.length&&r&&(o=[-1]),o.length&&!s(o,this._currentMediaIndices)&&(h=p(o,function(t){return d(-1===t?r.option:i[t].option)})),this._currentMediaIndices=o,h}},t.exports=i},function(t,e){var n="";"undefined"!=typeof navigator&&(n=navigator.platform||""),t.exports={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],grid:{},textStyle:{fontFamily:n.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},animation:!0,animationThreshold:2e3,animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut"}},function(t,e,n){t.exports={getAreaStyle:n(30)([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]])}},function(t,e){t.exports={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}},function(t,e,n){t.exports={getItemStyle:n(30)([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]])}},function(t,e,n){var i=n(30)([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);t.exports={getLineStyle:function(t){var e=i.call(this,t),n=this.getLineDash();return n&&(e.lineDash=n),e},getLineDash:function(){var t=this.get("type");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}}},function(t,e,n){function i(t,e){return t&&t.getShallow(e)}var r=n(17);t.exports={getTextColor:function(){var t=this.ecModel;return this.getShallow("color")||t&&t.get("textStyle.color")},getFont:function(){var t=this.ecModel,e=t&&t.getModel("textStyle");return[this.getShallow("fontStyle")||i(e,"fontStyle"),this.getShallow("fontWeight")||i(e,"fontWeight"),(this.getShallow("fontSize")||i(e,"fontSize")||12)+"px",this.getShallow("fontFamily")||i(e,"fontFamily")||"sans-serif"].join(" ")},getTextRect:function(t){var e=this.get("textStyle")||{};return r.getBoundingRect(t,this.getFont(),e.align,e.baseline)},ellipsis:function(t,e,n){return r.ellipsis(t,this.getFont(),e,n)}}},function(t,e,n){function i(t,e){e=e.split(",");for(var n=t,i=0;ie&&(e=t[n]);return e},min:function(t){for(var e=1/0,n=0;n1){var c;"string"==typeof r?c=n[r]:"function"==typeof r&&(c=r),c&&(e=e.downSample(s.dim,1/u,c,i),t.setData(e))}}},this)}},function(t,e,n){var i=n(1),r=n(32),a=n(4),o=n(37),s=r.prototype,h=o.prototype,l=Math.floor,u=Math.ceil,c=Math.pow,f=10,d=Math.log,p=r.extend({type:"log",getTicks:function(){return i.map(h.getTicks.call(this),function(t){return a.round(c(f,t))})},getLabel:h.getLabel,scale:function(t){return t=s.scale.call(this,t),c(f,t)},setExtent:function(t,e){t=d(t)/d(f),e=d(e)/d(f),h.setExtent.call(this,t,e)},getExtent:function(){var t=s.getExtent.call(this);return t[0]=c(f,t[0]),t[1]=c(f,t[1]),t},unionExtent:function(t){t[0]=d(t[0])/d(f),t[1]=d(t[1])/d(f),s.unionExtent.call(this,t)},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||0>=n)){var i=c(10,l(d(n/t)/Math.LN10)),r=t/n*i;.5>=r&&(i*=10);var o=[a.round(u(e[0]/i)*i),a.round(l(e[1]/i)*i)];this._interval=i,this._niceExtent=o}},niceExtent:h.niceExtent});i.each(["contain","normalize"],function(t){p.prototype[t]=function(e){return e=d(e)/d(f),s[t].call(this,e)}}),p.create=function(){return new p},t.exports=p},function(t,e,n){var i=n(1),r=n(32),a=r.prototype,o=r.extend({type:"ordinal",init:function(t,e){this._data=t,this._extent=e||[0,t.length-1]},parse:function(t){return"string"==typeof t?i.indexOf(this._data,t):Math.round(t)},contain:function(t){return t=this.parse(t),a.contain.call(this,t)&&null!=this._data[t]},normalize:function(t){return a.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(a.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){return this._data[t]},count:function(){return this._extent[1]-this._extent[0]+1},niceTicks:i.noop,niceExtent:i.noop});o.create=function(){return new o},t.exports=o},function(t,e,n){var i=n(1),r=n(4),a=n(9),o=n(37),s=o.prototype,h=Math.ceil,l=Math.floor,u=864e5,c=function(t,e,n,i){for(;i>n;){var r=n+i>>>1;t[r][2]=0;r--)if(!i[r].silent&&i[r]!==n&&!i[r].ignore&&o(i[r],t,e))return i[r]}},d.mixin(C,v),d.mixin(C,p),t.exports=C},function(t,e,n){function i(){return!1}function r(t,e,n,i){var r=document.createElement(e),a=n.getWidth(),o=n.getHeight(),s=r.style;return s.position="absolute",s.left=0,s.top=0,s.width=a+"px",s.height=o+"px",r.width=a*i,r.height=o*i,r.setAttribute("data-zr-dom-id",t),r}var a=n(1),o=n(42),s=function(t,e,n){var s;n=n||o.devicePixelRatio,"string"==typeof t?s=r(t,"canvas",e,n):a.isObject(t)&&(s=t,t=s.id),this.id=t,this.dom=s;var h=s.style;h&&(s.onselectstart=i,h["-webkit-user-select"]="none",h["user-select"]="none",h["-webkit-touch-callout"]="none",h["-webkit-tap-highlight-color"]="rgba(0,0,0,0)"),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n};s.prototype={constructor:s,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d");var t=this.dpr;1!=t&&this.ctx.scale(t,t)},createBackBuffer:function(){var t=this.dpr;this.domBack=r("back-"+this.id,"canvas",this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,a=this.domBack;r.width=t+"px",r.height=e+"px",i.width=t*n,i.height=e*n,1!=n&&this.ctx.scale(n,n),a&&(a.width=t*n,a.height=e*n,1!=n&&this.ctxBack.scale(n,n))},clear:function(t){var e=this.dom,n=this.ctx,i=e.width,r=e.height,a=this.clearColor,o=this.motionBlur&&!t,s=this.lastFrameAlpha,h=this.dpr;if(o&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(e,0,0,i/h,r/h)),n.clearRect(0,0,i/h,r/h),a&&(n.save(),n.fillStyle=this.clearColor,n.fillRect(0,0,i/h,r/h),n.restore()),o){var l=this.domBack;n.save(),n.globalAlpha=s,n.drawImage(l,0,0,i/h,r/h),n.restore()}}},t.exports=s},function(t,e,n){"use strict";function i(t){return parseInt(t,10)}function r(t){return t?t.isBuildin?!0:"function"==typeof t.resize&&"function"==typeof t.refresh:!1}function a(t){t.__unusedCount++}function o(t){t.__dirty=!1,1==t.__unusedCount&&t.clear()}function s(t,e,n){return g.copy(t.getBoundingRect()),t.transform&&g.applyTransform(t.transform),v.width=e,v.height=n,!g.intersect(v)}function h(t,e){if(!t||!e||t.length!==e.length)return!0;for(var n=0;np;p++){var v=t[p],m=this._singleCanvas?0:v.zlevel;if(i!==m&&(i=m,n=this.getLayer(i),n.isBuildin||f("ZLevel "+i+" has been used by unkown layer "+n.id),r=n.ctx,n.__unusedCount=0,(n.__dirty||e)&&n.clear()),(n.__dirty||e)&&!v.invisible&&0!==v.style.opacity&&v.scale[0]&&v.scale[1]&&(!v.culling||!s(v,u,c))){var y=v.__clipPaths;h(y,d)&&(d&&r.restore(),y&&(r.save(),l(y,r)),d=y),v.beforeBrush&&v.beforeBrush(r),v.brush(r,!1),v.afterBrush&&v.afterBrush(r)}v.__dirty=!1}d&&r.restore(),this.eachBuildinLayer(o)},getLayer:function(t){if(this._singleCanvas)return this._layers[0];var e=this._layers[t];return e||(e=new p("zr_"+t,this,this.dpr),e.isBuildin=!0,this._layerConfig[t]&&c.merge(e,this._layerConfig[t],!0),this.insertLayer(t,e),e.initContext()),e},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,a=i.length,o=null,s=-1,h=this._domRoot;if(n[t])return void f("ZLevel "+t+" has been used already");if(!r(e))return void f("Layer of zlevel "+t+" is not valid");if(a>0&&t>i[0]){for(s=0;a-1>s&&!(i[s]t);s++);o=n[i[s]]}if(i.splice(s+1,0,t),o){var l=o.dom;l.nextSibling?h.insertBefore(e.dom,l.nextSibling):h.appendChild(e.dom)}else h.firstChild?h.insertBefore(e.dom,h.firstChild):h.appendChild(e.dom);n[t]=e},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;ii;i++){var a=t[i],o=this._singleCanvas?0:a.zlevel,s=e[o];if(s){if(s.elCount++,s.__dirty)continue;s.__dirty=a.__dirty}}this.eachBuildinLayer(function(t,e){n[e]!==t.elCount&&(t.__dirty=!0)})},clear:function(){return this.eachBuildinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?c.merge(n[t],e,!0):n[t]=e;var i=this._layers[t];i&&c.merge(i,n[t],!0)}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(c.indexOf(n,t),1))},resize:function(t,e){var n=this._domRoot;if(n.style.display="none",t=t||this._getWidth(),e=e||this._getHeight(),n.style.display="",this._width!=t||e!=this._height){n.style.width=t+"px",n.style.height=e+"px";for(var i in this._layers)this._layers[i].resize(t,e);this.refresh(!0)}return this._width=t,this._height=e,this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas)return this._layers[0].dom;var e=new p("image",this,t.pixelRatio||this.dpr);e.initContext();var n=e.ctx;e.clearColor=t.backgroundColor,e.clear();for(var i=this.storage.getDisplayList(!0),r=0;rr;r++)this._updateAndAddDisplayable(e[r],null,t);n.length=this._displayListLen;for(var r=0,a=n.length;a>r;r++)n[r].__renderidx=r;n.sort(i)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.update(),t.afterUpdate();var i=t.clipPath;if(i&&(i.parent=t,i.updateTransform(),e?(e=e.slice(),e.push(i)):e=[i]),"group"==t.type){for(var r=t._children,a=0;ae;e++)this.delRoot(t[e]);else{var o;o="string"==typeof t?this._elements[t]:t;var s=r.indexOf(this._roots,o);s>=0&&(this.delFromMap(o.id),this._roots.splice(s,1),o instanceof a&&o.delChildrenFromStorage(this))}},addToMap:function(t){return t instanceof a&&(t.__storage=this),t.dirty(),this._elements[t.id]=t,this},get:function(t){return this._elements[t]},delFromMap:function(t){var e=this._elements,n=e[t];return n&&(delete e[t],n instanceof a&&(n.__storage=null)),this},dispose:function(){this._elements=this._renderList=this._roots=null}},t.exports=o},function(t,e,n){"use strict";var i=n(1),r=n(33).Dispatcher,a="undefined"!=typeof window&&(window.requestAnimationFrame||window.msRequestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},o=n(56),s=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time=0,r.call(this)};s.prototype={constructor:s,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;no;o++){var s=n[o],h=s.step(t);h&&(r.push(h),a.push(s))}for(var o=0;i>o;)n[o]._needsRemove?(n[o]=n[i-1],n.pop(),i--):o++;i=r.length;for(var o=0;i>o;o++)a[o].fire(r[o]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},start:function(){function t(){e._running&&(a(t),e._update())}var e=this;this._running=!0,this._time=(new Date).getTime(),a(t)},stop:function(){this._running=!1},clear:function(){this._clips=[]},animate:function(t,e){e=e||{};var n=new o(t,e.loop,e.getter,e.setter);return n}},i.mixin(s,r),t.exports=s},function(t,e,n){function i(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null==t.loop?!1:t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart}var r=n(133);i.prototype={constructor:i,step:function(t){this._initialized||(this._startTime=(new Date).getTime()+this._delay,this._initialized=!0);var e=(t-this._startTime)/this._life;if(!(0>e)){e=Math.min(e,1);var n=this.easing,i="string"==typeof n?r[n]:n,a="function"==typeof i?i(e):e;return this.fire("frame",a),1==e?this.loop?(this.restart(),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(){var t=(new Date).getTime(),e=(t-this._startTime)%this._life;this._startTime=(new Date).getTime()-e+this.gap,this._needsRemove=!1},fire:function(t,e){t="on"+t,this[t]&&this[t](this._target,e)}},t.exports=i},function(t,e){var n={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(-Math.pow(2,-10*(t-1))+2)},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||1>n?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),-(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)))},elasticOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||1>n?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/i)+1)},elasticInOut:function(t){var e,n=.1,i=.4;return 0===t?0:1===t?1:(!n||1>n?(n=1,e=i/4):e=i*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?-.5*(n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)):n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/i)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?.5*(t*t*((e+1)*t-e)):.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-n.bounceOut(1-t)},bounceOut:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return.5>t?.5*n.bounceIn(2*t):.5*n.bounceOut(2*t-1)+.5}};t.exports=n},function(t,e,n){var i=n(57).normalizeRadian,r=2*Math.PI;t.exports={containStroke:function(t,e,n,a,o,s,h,l,u){if(0===h)return!1;var c=h;l-=t,u-=e;var f=Math.sqrt(l*l+u*u);if(f-c>n||n>f+c)return!1;if(Math.abs(a-o)%r<1e-4)return!0;if(s){var d=a;a=i(o),o=i(d)}else a=i(a),o=i(o);a>o&&(o+=r);var p=Math.atan2(u,l);return 0>p&&(p+=r),p>=a&&o>=p||p+r>=a&&o>=p+r}}},function(t,e,n){var i=n(18);t.exports={containStroke:function(t,e,n,r,a,o,s,h,l,u,c){if(0===l)return!1;var f=l;if(c>e+f&&c>r+f&&c>o+f&&c>h+f||e-f>c&&r-f>c&&o-f>c&&h-f>c||u>t+f&&u>n+f&&u>a+f&&u>s+f||t-f>u&&n-f>u&&a-f>u&&s-f>u)return!1;var d=i.cubicProjectPoint(t,e,n,r,a,o,s,h,u,c,null);return f/2>=d}}},function(t,e){t.exports={containStroke:function(t,e,n,i,r,a,o){if(0===r)return!1;var s=r,h=0,l=t;if(o>e+s&&o>i+s||e-s>o&&i-s>o||a>t+s&&a>n+s||t-s>a&&n-s>a)return!1;if(t===n)return Math.abs(a-t)<=s/2;h=(e-i)/(t-n),l=(t*i-n*e)/(t-n);var u=h*a-o+l,c=u*u/(h*h+1);return s/2*s/2>=c}}},function(t,e,n){"use strict";function i(t,e){return Math.abs(t-e)e&&u>i&&u>o&&u>h||e>u&&i>u&&o>u&&h>u)return 0;var c=g.cubicRootAt(e,i,o,h,u,_);if(0===c)return 0;for(var f,d,p=0,v=-1,m=0;c>m;m++){var y=_[m],x=g.cubicAt(t,n,a,s,y);l>x||(0>v&&(v=g.cubicExtrema(e,i,o,h,b),b[1]1&&r(),f=g.cubicAt(e,i,o,h,b[0]),v>1&&(d=g.cubicAt(e,i,o,h,b[1]))),p+=2==v?yf?1:-1:yd?1:-1:d>h?1:-1:yf?1:-1:f>h?1:-1)}return p}function o(t,e,n,i,r,a,o,s){if(s>e&&s>i&&s>a||e>s&&i>s&&a>s)return 0;var h=g.quadraticRootAt(e,i,a,s,_);if(0===h)return 0;var l=g.quadraticExtremum(e,i,a);if(l>=0&&1>=l){for(var u=0,c=g.quadraticAt(e,i,a,l),f=0;h>f;f++){var d=g.quadraticAt(t,n,r,_[f]);o>d||(u+=_[f]c?1:-1:c>a?1:-1)}return u}var d=g.quadraticAt(t,n,r,_[0]);return o>d?0:e>a?1:-1}function s(t,e,n,i,r,a,o,s){if(s-=e,s>n||-n>s)return 0;var h=Math.sqrt(n*n-s*s);_[0]=-h,_[1]=h;var l=Math.abs(i-r);if(1e-4>l)return 0;if(1e-4>l%y){i=0,r=y;var u=a?1:-1;return o>=_[0]+t&&o<=_[1]+t?u:0}if(a){var h=i;i=p(r),r=p(h)}else i=p(i),r=p(r);i>r&&(r+=y);for(var c=0,f=0;2>f;f++){var d=_[f];if(d+t>o){var g=Math.atan2(s,d),u=a?1:-1;0>g&&(g=y+g),(g>=i&&r>=g||g+y>=i&&r>=g+y)&&(g>Math.PI/2&&g<1.5*Math.PI&&(u=-u),c+=u)}}return c}function h(t,e,n,r,h){for(var u=0,p=0,g=0,y=0,x=0,_=0;_1&&(n||(u+=v(p,g,y,x,r,h)),0!==u))return!0;switch(1==_&&(p=t[_],g=t[_+1],y=p,x=g),b){case l.M:y=t[_++],x=t[_++],p=y,g=x;break;case l.L:if(n){if(m(p,g,t[_],t[_+1],e,r,h))return!0}else u+=v(p,g,t[_],t[_+1],r,h)||0;p=t[_++],g=t[_++];break;case l.C:if(n){if(c.containStroke(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],e,r,h))return!0}else u+=a(p,g,t[_++],t[_++],t[_++],t[_++],t[_],t[_+1],r,h)||0;p=t[_++],g=t[_++];break;case l.Q:if(n){if(f.containStroke(p,g,t[_++],t[_++],t[_],t[_+1],e,r,h))return!0}else u+=o(p,g,t[_++],t[_++],t[_],t[_+1],r,h)||0;p=t[_++],g=t[_++];break;case l.A:var w=t[_++],M=t[_++],S=t[_++],C=t[_++],T=t[_++],A=t[_++],k=(t[_++],1-t[_++]),I=Math.cos(T)*S+w,L=Math.sin(T)*C+M;_>1?u+=v(p,g,I,L,r,h):(y=I,x=L);var P=(r-w)*C/S+w;if(n){if(d.containStroke(w,M,C,T,T+A,k,e,P,h))return!0}else u+=s(w,M,C,T,T+A,k,P,h);p=Math.cos(T+A)*S+w,g=Math.sin(T+A)*C+M;break;case l.R:y=p=t[_++],x=g=t[_++];var D=t[_++],O=t[_++],I=y+D,L=x+O;if(n){if(m(y,x,I,x,e,r,h)||m(I,x,I,L,e,r,h)||m(I,L,y,L,e,r,h)||m(y,L,I,L,e,r,h))return!0}else u+=v(I,x,I,L,r,h),u+=v(y,L,y,x,r,h);break;case l.Z:if(n){if(m(p,g,y,x,e,r,h))return!0}else if(u+=v(p,g,y,x,r,h),0!==u)return!0;p=y,g=x}}return n||i(g,x)||(u+=v(p,g,y,x,r,h)||0),0!==u}var l=n(27).CMD,u=n(136),c=n(135),f=n(138),d=n(134),p=n(57).normalizeRadian,g=n(18),v=n(75),m=u.containStroke,y=2*Math.PI,x=1e-4,_=[-1,-1,-1],b=[-1,-1];t.exports={contain:function(t,e,n){return h(t,0,!1,e,n)},containStroke:function(t,e,n,i){return h(t,e,!0,n,i)}}},function(t,e,n){var i=n(18);t.exports={containStroke:function(t,e,n,r,a,o,s,h,l){if(0===s)return!1;var u=s;if(l>e+u&&l>r+u&&l>o+u||e-u>l&&r-u>l&&o-u>l||h>t+u&&h>n+u&&h>a+u||t-u>h&&n-u>h&&a-u>h)return!1;var c=i.quadraticProjectPoint(t,e,n,r,a,o,h,l,null);return u/2>=c}}},function(t,e){"use strict";function n(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function i(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}var r=function(){this._track=[]};r.prototype={constructor:r,recognize:function(t,e){return this._doTrack(t,e),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e){var n=t.touches;if(n){for(var i={points:[],touches:[],target:e,event:t},r=0,a=n.length;a>r;r++){var o=n[r];i.points.push([o.clientX,o.clientY]),i.touches.push(o)}this._track.push(i)}},_recognize:function(t){for(var e in a)if(a.hasOwnProperty(e)){var n=a[e](this._track,t);if(n)return n}}};var a={pinch:function(t,e){var r=t.length;if(r){var a=(t[r-1]||{}).points,o=(t[r-2]||{}).points||a;if(o&&o.length>1&&a&&a.length>1){var s=n(a)/n(o);!isFinite(s)&&(s=1),e.pinchScale=s;var h=i(a);return e.pinchX=h[0],e.pinchY=h[1],{type:"pinch",target:t[0].target,event:e}}}}};t.exports=r},function(t,e){var n=function(){this.head=null,this.tail=null,this._len=0},i=n.prototype;i.insert=function(t){var e=new r(t);return this.insertEntry(e),e},i.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,this.tail=t):this.head=this.tail=t,this._len++},i.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},i.len=function(){return this._len};var r=function(t){this.value=t,this.next,this.prev},a=function(t){this._list=new n,this._map={},this._maxSize=t||10},o=a.prototype;o.put=function(t,e){var n=this._list,i=this._map;if(null==i[t]){var r=n.len();if(r>=this._maxSize&&r>0){var a=n.head;n.remove(a),delete i[a.key]}var o=n.insert(e);o.key=t,i[t]=o}},o.get=function(t){var e=this._map[t],n=this._list;return null!=e?(e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value):void 0},o.clear=function(){this._list.clear(),this._map={}},t.exports=a},function(t,e,n){"use strict";var i=n(1),r=n(16),a=function(t,e,n,i){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,r.call(this,i)};a.prototype={constructor:a,type:"radial",updateCanvasGradient:function(t,e){for(var n=t.getBoundingRect(),i=n.width,r=n.height,a=Math.min(i,r),o=this.x*i+n.x,s=this.y*r+n.y,h=this.r*a,l=e.createRadialGradient(o,s,0,o,s,h),u=this.colorStops,c=0;cy;y++)r(f,f,t[y]),a(d,d,t[y]);r(f,f,l[0]),a(d,d,l[1])}for(var y=0,x=t.length;x>y;y++){var _=t[y];if(n)u=t[y?y-1:x-1],c=t[(y+1)%x];else{if(0===y||y===x-1){p.push(i.clone(t[y]));continue}u=t[y-1],c=t[y+1]}i.sub(g,c,u),o(g,g,e);var b=s(_,u),w=s(_,c),M=b+w;0!==M&&(b/=M,w/=M),o(v,g,-b),o(m,g,w);var S=h([],_,v),C=h([],_,m);l&&(a(S,S,f),r(S,S,d),a(C,C,f),r(C,C,d)),p.push(S),p.push(C)}return n&&p.push(p.shift()),p}},function(t,e,n){function i(t,e,n,i,r,a,o){var s=.5*(n-t),h=.5*(i-e);return(2*(e-n)+s+h)*o+(-3*(e-n)-2*s-h)*a+s*r+e}var r=n(5);t.exports=function(t,e){for(var n=t.length,a=[],o=0,s=1;n>s;s++)o+=r.distance(t[s-1],t[s]);var h=o/2;h=n>h?n:h;for(var s=0;h>s;s++){var l,u,c,f=s/(h-1)*(e?n:n-1),d=Math.floor(f),p=f-d,g=t[d%n];e?(l=t[(d-1+n)%n],u=t[(d+1)%n],c=t[(d+2)%n]):(l=t[0===d?d:d-1],u=t[d>n-2?n-1:d+1],c=t[d>n-3?n-1:d+2]);var v=p*p,m=p*v;a.push([i(l[0],g[0],u[0],c[0],p,v,m),i(l[1],g[1],u[1],c[1],p,v,m)])}return a}},function(t,e,n){t.exports=n(6).extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),a=e.startAngle,o=e.endAngle,s=e.clockwise,h=Math.cos(a),l=Math.sin(a);t.moveTo(h*r+n,l*r+i),t.arc(n,i,r,a,o,!s)}})},function(t,e,n){"use strict";var i=n(18),r=i.quadraticSubdivide,a=i.cubicSubdivide,o=i.quadraticAt,s=i.cubicAt,h=[];t.exports=n(6).extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,o=e.x2,s=e.y2,l=e.cpx1,u=e.cpy1,c=e.cpx2,f=e.cpy2,d=e.percent;0!==d&&(t.moveTo(n,i),null==c||null==f?(1>d&&(r(n,l,o,d,h),l=h[1],o=h[2],r(i,u,s,d,h),u=h[1],s=h[2]),t.quadraticCurveTo(l,u,o,s)):(1>d&&(a(n,l,c,o,d,h),l=h[1],c=h[2],o=h[3],a(i,u,f,s,d,h),u=h[1],f=h[2],s=h[3]),t.bezierCurveTo(l,u,c,f,o,s)))},pointAt:function(t){var e=this.shape,n=e.cpx2,i=e.cpy2;return null===n||null===i?[o(e.x1,e.cpx1,e.x2,t),o(e.y1,e.cpy1,e.y2,t)]:[s(e.x1,e.cpx1,e.cpx1,e.x2,t),s(e.y1,e.cpy1,e.cpy1,e.y2,t)]}})},function(t,e,n){"use strict";t.exports=n(6).extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e){t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}})},function(t,e,n){t.exports=n(6).extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,a=e.y2,o=e.percent;0!==o&&(t.moveTo(n,i),1>o&&(r=n*(1-o)+r*o,a=i*(1-o)+a*o),t.lineTo(r,a))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}})},function(t,e,n){var i=n(59);t.exports=n(6).extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){i.buildPath(t,e,!0)}})},function(t,e,n){var i=n(59);t.exports=n(6).extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){i.buildPath(t,e,!1)}})},function(t,e,n){var i=n(60);t.exports=n(6).extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,r=e.y,a=e.width,o=e.height;e.r?i.buildPath(t,e):t.rect(n,r,a,o),t.closePath()}})},function(t,e,n){t.exports=n(6).extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}})},function(t,e,n){t.exports=n(6).extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),a=Math.max(e.r,0),o=e.startAngle,s=e.endAngle,h=e.clockwise,l=Math.cos(o),u=Math.sin(o);t.moveTo(l*r+n,u*r+i),t.lineTo(l*a+n,u*a+i),t.arc(n,i,a,o,s,!h),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,o,h),t.closePath()}})},function(t,e,n){"use strict";var i=n(56),r=n(1),a=r.isString,o=r.isFunction,s=r.isObject,h=n(45),l=function(){this.animators=[]};l.prototype={constructor:l,animate:function(t,e){var n,a=!1,o=this,s=this.__zr;if(t){var l=t.split("."),u=o;a="shape"===l[0];for(var c=0,f=l.length;f>c;c++)u&&(u=u[l[c]]);u&&(n=u)}else n=o;if(!n)return void h('Property "'+t+'" is not existed in element '+o.id);var d=o.animators,p=new i(n,e);return p.during(function(t){o.dirty(a)}).done(function(){d.splice(r.indexOf(d,p),1)}),d.push(p),s&&s.animation.addAnimator(p),p},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;n>i;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r){function s(){l--,l||r&&r()}a(n)?(r=i,i=n,n=0):o(i)?(r=i,i="linear",n=0):o(n)?(r=n,n=0):o(e)?(r=e,e=500):e||(e=500),this.stopAnimation(),this._animateToShallow("",this,t,e,n,i,r);var h=this.animators.slice(),l=h.length;l||r&&r();for(var u=0;u0&&this.animate(t,!1).when(null==i?500:i,o).delay(a||0),this}},t.exports=l},function(t,e){function n(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}n.prototype={constructor:n,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this._dispatchProxy(e,"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,i=t.offsetY,r=n-this._x,a=i-this._y;this._x=n,this._y=i,e.drift(r,a,t),this._dispatchProxy(e,"drag",t.event);var o=this.findHover(n,i,e),s=this._dropTarget;this._dropTarget=o,e!==o&&(s&&o!==s&&this._dispatchProxy(s,"dragleave",t.event),o&&o!==s&&this._dispatchProxy(o,"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this._dispatchProxy(e,"dragend",t.event),this._dropTarget&&this._dispatchProxy(this._dropTarget,"drop",t.event),this._draggingTarget=null,this._dropTarget=null}},t.exports=n},function(t,e,n){function i(t,e,n,i,r,a,o,s,h,l,u){var g=h*(p/180),y=d(g)*(t-n)/2+f(g)*(e-i)/2,x=-1*f(g)*(t-n)/2+d(g)*(e-i)/2,_=y*y/(o*o)+x*x/(s*s);_>1&&(o*=c(_),s*=c(_));var b=(r===a?-1:1)*c((o*o*(s*s)-o*o*(x*x)-s*s*(y*y))/(o*o*(x*x)+s*s*(y*y)))||0,w=b*o*x/s,M=b*-s*y/o,S=(t+n)/2+d(g)*w-f(g)*M,C=(e+i)/2+f(g)*w+d(g)*M,T=m([1,0],[(y-w)/o,(x-M)/s]),A=[(y-w)/o,(x-M)/s],k=[(-1*y-w)/o,(-1*x-M)/s],I=m(A,k);v(A,k)<=-1&&(I=p),v(A,k)>=1&&(I=0),0===a&&I>0&&(I-=2*p),1===a&&0>I&&(I+=2*p),u.addData(l,S,C,o,s,T,I,g,a)}function r(t){if(!t)return[];var e,n=t.replace(/-/g," -").replace(/ /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e0&&""===v[0]&&v.shift();for(var m=0;mi;i++)n=t[i],n.__dirty&&n.buildPath(n.path,n.shape),r.push(n.path);var s=new o(e);return s.buildPath=function(t){t.appendPath(r);var e=t.getContext();e&&t.rebuildPath(e)},s}}},function(t,e,n){function i(t,e){var n,i,a,u,c,f,d=t.data,p=r.M,g=r.C,v=r.L,m=r.R,y=r.A,x=r.Q;for(a=0,u=0;ac;c++){var f=s[c];f[0]=d[a++],f[1]=d[a++],o(f,f,e),d[u++]=f[0],d[u++]=f[1]}}}var r=n(27).CMD,a=n(5),o=a.applyTransform,s=[[],[],[]],h=Math.sqrt,l=Math.atan2;t.exports=i}])}); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/bmap.js b/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/bmap.js new file mode 100644 index 0000000..cd3d6e8 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/bmap.js @@ -0,0 +1,364 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("echarts")); + else if(typeof define === 'function' && define.amd) + define(["echarts"], factory); + else if(typeof exports === 'object') + exports["bmap"] = factory(require("echarts")); + else + root["echarts"] = root["echarts"] || {}, root["echarts"]["bmap"] = factory(root["echarts"]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/** + * BMap component extension + */ + !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) { + + __webpack_require__(1).registerCoordinateSystem( + 'bmap', __webpack_require__(2) + ); + __webpack_require__(3); + __webpack_require__(4); + + // Action + __webpack_require__(1).registerAction({ + type: 'bmapRoam', + event: 'bmapRoam', + update: 'updateLayout' + }, function (payload, ecModel) { + ecModel.eachComponent('bmap', function (bMapModel) { + var bmap = bMapModel.getBMap(); + var center = bmap.getCenter(); + bMapModel.setCenterAndZoom([center.lng, center.lat], bmap.getZoom()); + }); + }); + + return { + version: '1.0.0' + }; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ }, +/* 1 */ +/***/ function(module, exports) { + + module.exports = __WEBPACK_EXTERNAL_MODULE_1__; + +/***/ }, +/* 2 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) { + + var echarts = __webpack_require__(1); + + function BMapCoordSys(bmap, api) { + this._bmap = bmap; + this.dimensions = ['lng', 'lat']; + this._mapOffset = [0, 0]; + + this._api = api; + } + + BMapCoordSys.prototype.dimensions = ['lng', 'lat']; + + BMapCoordSys.prototype.setMapOffset = function (mapOffset) { + this._mapOffset = mapOffset; + }; + + BMapCoordSys.prototype.getBMap = function () { + return this._bmap; + }; + + BMapCoordSys.prototype.dataToPoint = function (data) { + var point = new BMap.Point(data[0], data[1]); + var px = this._bmap.pointToOverlayPixel(point); + var mapOffset = this._mapOffset; + return [px.x - mapOffset[0], px.y - mapOffset[1]]; + }; + + BMapCoordSys.prototype.pointToData = function (pt) { + var mapOffset = this._mapOffset; + var pt = this._bmap.overlayPixelToPoint({ + x: pt[0] + mapOffset[0], + y: pt[1] + mapOffset[1] + }); + return [pt.lng, pt.lat]; + }; + + BMapCoordSys.prototype.getViewRect = function () { + var api = this._api; + return new echarts.graphic.BoundingRect(0, 0, api.getWidth(), api.getHeight()); + }; + + BMapCoordSys.prototype.getRoamTransform = function () { + return echarts.matrix.create(); + }; + + var Overlay; + + // For deciding which dimensions to use when creating list data + BMapCoordSys.dimensions = BMapCoordSys.prototype.dimensions; + + function createOverlayCtor() { + function Overlay(root) { + this._root = root; + } + + Overlay.prototype = new BMap.Overlay(); + /** + * 初始化 + * + * @param {BMap.Map} map + * @override + */ + Overlay.prototype.initialize = function (map) { + map.getPanes().labelPane.appendChild(this._root); + return this._root; + }; + /** + * @override + */ + Overlay.prototype.draw = function () {}; + + return Overlay; + } + + BMapCoordSys.create = function (ecModel, api) { + var bmapCoordSys; + var root = api.getDom(); + + // TODO Dispose + ecModel.eachComponent('bmap', function (bmapModel) { + var viewportRoot = api.getZr().painter.getViewportRoot(); + if (typeof BMap === 'undefined') { + throw new Error('BMap api is not loaded'); + } + Overlay = Overlay || createOverlayCtor(); + if (bmapCoordSys) { + throw new Error('Only one bmap component can exist'); + } + if (!bmapModel.__bmap) { + // Not support IE8 + var bmapRoot = root.querySelector('.ec-extension-bmap'); + if (bmapRoot) { + // Reset viewport left and top, which will be changed + // in moving handler in BMapView + viewportRoot.style.left = '0px'; + viewportRoot.style.top = '0px'; + root.removeChild(bmapRoot); + } + bmapRoot = document.createElement('div'); + bmapRoot.style.cssText = 'width:100%;height:100%'; + // Not support IE8 + bmapRoot.classList.add('ec-extension-bmap'); + root.appendChild(bmapRoot); + var bmap = bmapModel.__bmap = new BMap.Map(bmapRoot); + + var overlay = new Overlay(viewportRoot); + bmap.addOverlay(overlay); + } + var bmap = bmapModel.__bmap; + + // Set bmap options + // centerAndZoom before layout and render + var center = bmapModel.get('center'); + var zoom = bmapModel.get('zoom'); + if (center && zoom) { + var pt = new BMap.Point(center[0], center[1]); + bmap.centerAndZoom(pt, zoom); + } + + bmapCoordSys = new BMapCoordSys(bmap, api); + bmapCoordSys.setMapOffset(bmapModel.__mapOffset || [0, 0]); + bmapModel.coordinateSystem = bmapCoordSys; + }); + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'bmap') { + seriesModel.coordinateSystem = bmapCoordSys; + } + }); + }; + + return BMapCoordSys; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ }, +/* 3 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) { + + function v2Equal(a, b) { + return a && b && a[0] === b[0] && a[1] === b[1]; + } + + return __webpack_require__(1).extendComponentModel({ + type: 'bmap', + + getBMap: function () { + // __bmap is injected when creating BMapCoordSys + return this.__bmap; + }, + + setCenterAndZoom: function (center, zoom) { + this.option.center = center; + this.option.zoom = zoom; + }, + + centerOrZoomChanged: function (center, zoom) { + var option = this.option; + return !(v2Equal(center, option.center) && zoom === option.zoom); + }, + + defaultOption: { + center: null, + + zoom: 1, + + mapStyle: {}, + + roam: false + } + }); + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ }, +/* 4 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) { + + return __webpack_require__(1).extendComponentView({ + type: 'bmap', + + render: function (bMapModel, ecModel, api) { + var rendering = true; + + var bmap = bMapModel.getBMap(); + var viewportRoot = api.getZr().painter.getViewportRoot(); + var coordSys = bMapModel.coordinateSystem; + var moveHandler = function (type, target) { + if (rendering) { + return; + } + var offsetEl = viewportRoot.parentNode.parentNode.parentNode; + var mapOffset = [ + -parseInt(offsetEl.style.left, 10) || 0, + -parseInt(offsetEl.style.top, 10) || 0 + ]; + viewportRoot.style.left = mapOffset[0] + 'px'; + viewportRoot.style.top = mapOffset[1] + 'px'; + + coordSys.setMapOffset(mapOffset); + bMapModel.__mapOffset = mapOffset; + + api.dispatchAction({ + type: 'bmapRoam' + }); + }; + + function zoomEndHandler() { + if (rendering) { + return; + } + api.dispatchAction({ + type: 'bmapRoam' + }); + } + + bmap.removeEventListener('moving', this._oldMoveHandler); + // FIXME + // Moveend may be triggered by centerAndZoom method when creating coordSys next time + // bmap.removeEventListener('moveend', this._oldMoveHandler); + bmap.removeEventListener('zoomend', this._oldZoomEndHandler); + bmap.addEventListener('moving', moveHandler); + // bmap.addEventListener('moveend', moveHandler); + bmap.addEventListener('zoomend', zoomEndHandler); + + this._oldMoveHandler = moveHandler; + this._oldZoomEndHandler = zoomEndHandler; + + var roam = bMapModel.get('roam'); + if (roam && roam !== 'scale') { + bmap.enableDragging(); + } + else { + bmap.disableDragging(); + } + if (roam && roam !== 'move') { + bmap.enableScrollWheelZoom(); + bmap.enableDoubleClickZoom(); + bmap.enablePinchToZoom(); + } + else { + bmap.disableScrollWheelZoom(); + bmap.disableDoubleClickZoom(); + bmap.disablePinchToZoom(); + } + + var originalStyle = bMapModel.__mapStyle; + + var newMapStyle = bMapModel.get('mapStyle') || {}; + // FIXME, Not use JSON methods + var mapStyleStr = JSON.stringify(newMapStyle); + if (JSON.stringify(originalStyle) !== mapStyleStr) { + bmap.setMapStyle(newMapStyle); + bMapModel.__mapStyle = JSON.parse(mapStyleStr); + } + + rendering = false; + } + }); + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/bmap.min.js b/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/bmap.min.js new file mode 100644 index 0000000..1fbc219 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/bmap.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("echarts")):"function"==typeof define&&define.amd?define(["echarts"],t):"object"==typeof exports?exports.bmap=t(require("echarts")):(e.echarts=e.echarts||{},e.echarts.bmap=t(e.echarts))}(this,function(e){return function(e){function t(n){if(o[n])return o[n].exports;var r=o[n]={exports:{},id:n,loaded:!1};return e[n].call(r.exports,r,r.exports,t),r.loaded=!0,r.exports}var o={};return t.m=e,t.c=o,t.p="",t(0)}([function(e,t,o){var n;n=function(e){return o(1).registerCoordinateSystem("bmap",o(2)),o(3),o(4),o(1).registerAction({type:"bmapRoam",event:"bmapRoam",update:"updateLayout"},function(e,t){t.eachComponent("bmap",function(e){var t=e.getBMap(),o=t.getCenter();e.setCenterAndZoom([o.lng,o.lat],t.getZoom())})}),{version:"1.0.0"}}.call(t,o,t,e),!(void 0!==n&&(e.exports=n))},function(t,o){t.exports=e},function(e,t,o){var n;n=function(e){function t(e,t){this._bmap=e,this.dimensions=["lng","lat"],this._mapOffset=[0,0],this._api=t}function n(){function e(e){this._root=e}return e.prototype=new BMap.Overlay,e.prototype.initialize=function(e){return e.getPanes().labelPane.appendChild(this._root),this._root},e.prototype.draw=function(){},e}var r=o(1);t.prototype.dimensions=["lng","lat"],t.prototype.setMapOffset=function(e){this._mapOffset=e},t.prototype.getBMap=function(){return this._bmap},t.prototype.dataToPoint=function(e){var t=new BMap.Point(e[0],e[1]),o=this._bmap.pointToOverlayPixel(t),n=this._mapOffset;return[o.x-n[0],o.y-n[1]]},t.prototype.pointToData=function(e){var t=this._mapOffset,e=this._bmap.overlayPixelToPoint({x:e[0]+t[0],y:e[1]+t[1]});return[e.lng,e.lat]},t.prototype.getViewRect=function(){var e=this._api;return new r.graphic.BoundingRect(0,0,e.getWidth(),e.getHeight())},t.prototype.getRoamTransform=function(){return r.matrix.create()};var a;return t.dimensions=t.prototype.dimensions,t.create=function(e,o){var r,i=o.getDom();e.eachComponent("bmap",function(e){var p=o.getZr().painter.getViewportRoot();if("undefined"==typeof BMap)throw new Error("BMap api is not loaded");if(a=a||n(),r)throw new Error("Only one bmap component can exist");if(!e.__bmap){var s=i.querySelector(".ec-extension-bmap");s&&(p.style.left="0px",p.style.top="0px",i.removeChild(s)),s=document.createElement("div"),s.style.cssText="width:100%;height:100%",s.classList.add("ec-extension-bmap"),i.appendChild(s);var c=e.__bmap=new BMap.Map(s),m=new a(p);c.addOverlay(m)}var c=e.__bmap,l=e.get("center"),d=e.get("zoom");if(l&&d){var f=new BMap.Point(l[0],l[1]);c.centerAndZoom(f,d)}r=new t(c,o),r.setMapOffset(e.__mapOffset||[0,0]),e.coordinateSystem=r}),e.eachSeries(function(e){"bmap"===e.get("coordinateSystem")&&(e.coordinateSystem=r)})},t}.call(t,o,t,e),!(void 0!==n&&(e.exports=n))},function(e,t,o){var n;n=function(e){function t(e,t){return e&&t&&e[0]===t[0]&&e[1]===t[1]}return o(1).extendComponentModel({type:"bmap",getBMap:function(){return this.__bmap},setCenterAndZoom:function(e,t){this.option.center=e,this.option.zoom=t},centerOrZoomChanged:function(e,o){var n=this.option;return!(t(e,n.center)&&o===n.zoom)},defaultOption:{center:null,zoom:1,mapStyle:{},roam:!1}})}.call(t,o,t,e),!(void 0!==n&&(e.exports=n))},function(e,t,o){var n;n=function(e){return o(1).extendComponentView({type:"bmap",render:function(e,t,o){function n(){r||o.dispatchAction({type:"bmapRoam"})}var r=!0,a=e.getBMap(),i=o.getZr().painter.getViewportRoot(),p=e.coordinateSystem,s=function(t,n){if(!r){var a=i.parentNode.parentNode.parentNode,s=[-parseInt(a.style.left,10)||0,-parseInt(a.style.top,10)||0];i.style.left=s[0]+"px",i.style.top=s[1]+"px",p.setMapOffset(s),e.__mapOffset=s,o.dispatchAction({type:"bmapRoam"})}};a.removeEventListener("moving",this._oldMoveHandler),a.removeEventListener("zoomend",this._oldZoomEndHandler),a.addEventListener("moving",s),a.addEventListener("zoomend",n),this._oldMoveHandler=s,this._oldZoomEndHandler=n;var c=e.get("roam");c&&"scale"!==c?a.enableDragging():a.disableDragging(),c&&"move"!==c?(a.enableScrollWheelZoom(),a.enableDoubleClickZoom(),a.enablePinchToZoom()):(a.disableScrollWheelZoom(),a.disableDoubleClickZoom(),a.disablePinchToZoom());var m=e.__mapStyle,l=e.get("mapStyle")||{},d=JSON.stringify(l);JSON.stringify(m)!==d&&(a.setMapStyle(l),e.__mapStyle=JSON.parse(d)),r=!1}})}.call(t,o,t,e),!(void 0!==n&&(e.exports=n))}])}); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/dataTool.js b/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/dataTool.js new file mode 100644 index 0000000..32ae959 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/dataTool.js @@ -0,0 +1,405 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("echarts")); + else if(typeof define === 'function' && define.amd) + define(["echarts"], factory); + else if(typeof exports === 'object') + exports["dataTool"] = factory(require("echarts")); + else + root["echarts"] = root["echarts"] || {}, root["echarts"]["dataTool"] = factory(root["echarts"]); +})(this, function(__WEBPACK_EXTERNAL_MODULE_1__) { +return /******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; + +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; + +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; + +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); + +/******/ // Flag the module as loaded +/******/ module.loaded = true; + +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } + + +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; + +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; + +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; + +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) { + var echarts = __webpack_require__(1); + echarts.dataTool = { + version: '1.0.0', + gexf: __webpack_require__(5), + prepareBoxplotData: __webpack_require__(6) + }; + return echarts.dataTool; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ }, +/* 1 */ +/***/ function(module, exports) { + + module.exports = __WEBPACK_EXTERNAL_MODULE_1__; + +/***/ }, +/* 2 */, +/* 3 */, +/* 4 */, +/* 5 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;// GEXF File Parser + // http://gexf.net/1.2draft/gexf-12draft-primer.pdf + !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) { + + 'use strict'; + var zrUtil = __webpack_require__(1).util; + + function parse(xml) { + var doc; + if (typeof xml === 'string') { + var parser = new DOMParser(); + doc = parser.parseFromString(xml, 'text/xml'); + } + else { + doc = xml; + } + if (!doc || doc.getElementsByTagName('parsererror').length) { + return null; + } + + var gexfRoot = getChildByTagName(doc, 'gexf'); + + if (!gexfRoot) { + return null; + } + + var graphRoot = getChildByTagName(gexfRoot, 'graph'); + + var attributes = parseAttributes(getChildByTagName(graphRoot, 'attributes')); + var attributesMap = {}; + for (var i = 0; i < attributes.length; i++) { + attributesMap[attributes[i].id] = attributes[i]; + } + + return { + nodes: parseNodes(getChildByTagName(graphRoot, 'nodes'), attributesMap), + links: parseEdges(getChildByTagName(graphRoot, 'edges')) + }; + } + + function parseAttributes(parent) { + return parent ? zrUtil.map(getChildrenByTagName(parent, 'attribute'), function (attribDom) { + return { + id: getAttr(attribDom, 'id'), + title: getAttr(attribDom, 'title'), + type: getAttr(attribDom, 'type') + }; + }) : []; + } + + function parseNodes(parent, attributesMap) { + return parent ? zrUtil.map(getChildrenByTagName(parent, 'node'), function (nodeDom) { + + var id = getAttr(nodeDom, 'id'); + var label = getAttr(nodeDom, 'label'); + + var node = { + id: id, + name: label, + itemStyle: { + normal: {} + } + }; + + var vizSizeDom = getChildByTagName(nodeDom, 'viz:size'); + var vizPosDom = getChildByTagName(nodeDom, 'viz:position'); + var vizColorDom = getChildByTagName(nodeDom, 'viz:color'); + // var vizShapeDom = getChildByTagName(nodeDom, 'viz:shape'); + + var attvaluesDom = getChildByTagName(nodeDom, 'attvalues'); + + if (vizSizeDom) { + node.symbolSize = parseFloat(getAttr(vizSizeDom, 'value')); + } + if (vizPosDom) { + node.x = parseFloat(getAttr(vizPosDom, 'x')); + node.y = parseFloat(getAttr(vizPosDom, 'y')); + // z + } + if (vizColorDom) { + node.itemStyle.normal.color = 'rgb(' +[ + getAttr(vizColorDom, 'r') | 0, + getAttr(vizColorDom, 'g') | 0, + getAttr(vizColorDom, 'b') | 0 + ].join(',') + ')'; + } + // if (vizShapeDom) { + // node.shape = getAttr(vizShapeDom, 'shape'); + // } + if (attvaluesDom) { + var attvalueDomList = getChildrenByTagName(attvaluesDom, 'attvalue'); + + node.attributes = {}; + + for (var j = 0; j < attvalueDomList.length; j++) { + var attvalueDom = attvalueDomList[j]; + var attId = getAttr(attvalueDom, 'for'); + var attValue = getAttr(attvalueDom, 'value'); + var attribute = attributesMap[attId]; + + if (attribute) { + switch (attribute.type) { + case 'integer': + case 'long': + attValue = parseInt(attValue, 10); + break; + case 'float': + case 'double': + attValue = parseFloat(attValue); + break; + case 'boolean': + attValue = attValue.toLowerCase() == 'true'; + break; + default: + } + node.attributes[attId] = attValue; + } + } + } + + return node; + }) : []; + } + + function parseEdges(parent) { + return parent ? zrUtil.map(getChildrenByTagName(parent, 'edge'), function (edgeDom) { + var id = getAttr(edgeDom, 'id'); + var label = getAttr(edgeDom, 'label'); + + var sourceId = getAttr(edgeDom, 'source'); + var targetId = getAttr(edgeDom, 'target'); + + var edge = { + id: id, + name: label, + source: sourceId, + target: targetId, + lineStyle: { + normal: {} + } + }; + + var lineStyle = edge.lineStyle.normal; + + var vizThicknessDom = getChildByTagName(edgeDom, 'viz:thickness'); + var vizColorDom = getChildByTagName(edgeDom, 'viz:color'); + // var vizShapeDom = getChildByTagName(edgeDom, 'viz:shape'); + + if (vizThicknessDom) { + lineStyle.width = parseFloat(vizThicknessDom.getAttribute('value')); + } + if (vizColorDom) { + lineStyle.color = 'rgb(' + [ + getAttr(vizColorDom, 'r') | 0, + getAttr(vizColorDom, 'g') | 0, + getAttr(vizColorDom, 'b') | 0 + ].join(',') + ')'; + } + // if (vizShapeDom) { + // edge.shape = vizShapeDom.getAttribute('shape'); + // } + + return edge; + }) : []; + } + + function getAttr(el, attrName) { + return el.getAttribute(attrName); + } + + function getChildByTagName (parent, tagName) { + var node = parent.firstChild; + + while (node) { + if ( + node.nodeType != 1 || + node.nodeName.toLowerCase() != tagName.toLowerCase() + ) { + node = node.nextSibling; + } else { + return node; + } + } + + return null; + } + + function getChildrenByTagName (parent, tagName) { + var node = parent.firstChild; + var children = []; + while (node) { + if (node.nodeName.toLowerCase() == tagName.toLowerCase()) { + children.push(node); + } + node = node.nextSibling; + } + + return children; + } + + return { + parse: parse + }; + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ }, +/* 6 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) { + + var quantile = __webpack_require__(7); + var numberUtil = __webpack_require__(1).number; + + /** + * Helper method for preparing data. + * @param {Array.} rawData like + * [ + * [12,232,443], (raw data set for the first box) + * [3843,5545,1232], (raw datat set for the second box) + * ... + * ] + * @param {Object} [opt] + * + * @param {(number|string)} [opt.boundIQR=1.5] Data less than min bound is outlier. + * default 1.5, means Q1 - 1.5 * (Q3 - Q1). + * If pass 'none', min bound will not be used. + * @param {(number|string)} [opt.layout='horizontal'] + * Box plot layout, can be 'horizontal' or 'vertical' + */ + return function (rawData, opt) { + opt = opt || []; + var boxData = []; + var outliers = []; + var axisData = []; + var boundIQR = opt.boundIQR; + + for (var i = 0; i < rawData.length; i++) { + axisData.push(i + ''); + var ascList = numberUtil.asc(rawData[i].slice()); + + var Q1 = quantile(ascList, 0.25); + var Q2 = quantile(ascList, 0.5); + var Q3 = quantile(ascList, 0.75); + var IQR = Q3 - Q1; + + var low = boundIQR === 'none' + ? ascList[0] + : Q1 - (boundIQR == null ? 1.5 : boundIQR) * IQR; + var high = boundIQR === 'none' + ? ascList[ascList.length - 1] + : Q3 + (boundIQR == null ? 1.5 : boundIQR) * IQR; + + boxData.push([low, Q1, Q2, Q3, high]); + + for (var j = 0; j < ascList.length; j++) { + var dataItem = ascList[j]; + if (dataItem < low || dataItem > high) { + var outlier = [i, dataItem]; + opt.layout === 'vertical' && outlier.reverse(); + outliers.push(outlier); + } + } + } + return { + boxData: boxData, + outliers: outliers, + axisData: axisData + }; + }; + + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_RESULT__;/** + * Copyright (c) 2010-2015, Michael Bostock + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * The name Michael Bostock may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + !(__WEBPACK_AMD_DEFINE_RESULT__ = function (require) { + + /** + * @see + * @see + * @param {Array.} ascArr + */ + return function(ascArr, p) { + var H = (ascArr.length - 1) * p + 1, + h = Math.floor(H), + v = +ascArr[h - 1], + e = H - h; + return e ? v + e * (ascArr[h] - v) : v; + }; + + }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + +/***/ } +/******/ ]) +}); +; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/dataTool.min.js b/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/dataTool.min.js new file mode 100644 index 0000000..bf5496a --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/echarts/extension/dataTool.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("echarts")):"function"==typeof define&&define.amd?define(["echarts"],t):"object"==typeof exports?exports.dataTool=t(require("echarts")):(e.echarts=e.echarts||{},e.echarts.dataTool=t(e.echarts))}(this,function(e){return function(e){function t(o){if(r[o])return r[o].exports;var n=r[o]={exports:{},id:o,loaded:!1};return e[o].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){var o;o=function(e){var t=r(1);return t.dataTool={version:"1.0.0",gexf:r(5),prepareBoxplotData:r(6)},t.dataTool}.call(t,r,t,e),!(void 0!==o&&(e.exports=o))},function(t,r){t.exports=e},,,,function(e,t,r){var o;o=function(e){"use strict";function t(e){var t;if("string"==typeof e){var r=new DOMParser;t=r.parseFromString(e,"text/xml")}else t=e;if(!t||t.getElementsByTagName("parsererror").length)return null;var i=l(t,"gexf");if(!i)return null;for(var u=l(i,"graph"),s=o(l(u,"attributes")),c={},f=0;fb||b>g){var x=[u,b];"vertical"===r.layout&&x.reverse(),a.push(x)}}}return{boxData:n,outliers:a,axisData:i}}}.call(t,r,t,e),!(void 0!==o&&(e.exports=o))},function(e,t,r){var o;o=function(e){return function(e,t){var r=(e.length-1)*t+1,o=Math.floor(r),n=+e[o-1],a=r-o;return a?n+a*(e[o]-n):n}}.call(t,r,t,e),!(void 0!==o&&(e.exports=o))}])}); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/hcharts/canvg.js b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/canvg.js new file mode 100644 index 0000000..78e62de --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/canvg.js @@ -0,0 +1,3913 @@ +/** + * 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 RGBColor(color_string) +{ + this.ok = false; + + // strip any leading # + if (color_string.charAt(0) == '#') { // remove # if any + color_string = color_string.substr(1,6); + } + + color_string = color_string.replace(/ /g,''); + color_string = color_string.toLowerCase(); + + // before getting into regexps, try simple matches + // and overwrite the input + var simple_colors = { + 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' + }; + for (var key in simple_colors) { + if (color_string == key) { + color_string = simple_colors[key]; + } + } + // emd of simple type-in colors + + // array of color definition objects + var color_defs = [ + { + re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, + example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], + process: function (bits){ + return [ + parseInt(bits[1]), + parseInt(bits[2]), + parseInt(bits[3]) + ]; + } + }, + { + re: /^(\w{2})(\w{2})(\w{2})$/, + example: ['#00ff00', '336699'], + process: function (bits){ + return [ + parseInt(bits[1], 16), + parseInt(bits[2], 16), + parseInt(bits[3], 16) + ]; + } + }, + { + re: /^(\w{1})(\w{1})(\w{1})$/, + example: ['#fb0', 'f0f'], + process: function (bits){ + return [ + parseInt(bits[1] + bits[1], 16), + parseInt(bits[2] + bits[2], 16), + parseInt(bits[3] + bits[3], 16) + ]; + } + } + ]; + + // search through the definitions to find a match + for (var i = 0; i < color_defs.length; i++) { + var re = color_defs[i].re; + var processor = color_defs[i].process; + var bits = re.exec(color_string); + if (bits) { + channels = processor(bits); + this.r = channels[0]; + this.g = channels[1]; + this.b = channels[2]; + this.ok = true; + } + + } + + // validate/cleanup values + this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 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); + + // some getters + this.toRGB = function () { + return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')'; + } + this.toHex = function () { + var r = this.r.toString(16); + var g = this.g.toString(16); + var b = this.b.toString(16); + if (r.length == 1) r = '0' + r; + if (g.length == 1) g = '0' + g; + if (b.length == 1) b = '0' + b; + return '#' + r + g + b; + } + + // help + this.getHelpXML = function () { + + var examples = new Array(); + // add regexps + for (var i = 0; i < color_defs.length; i++) { + var example = color_defs[i].example; + for (var j = 0; j < example.length; j++) { + examples[examples.length] = example[j]; + } + } + // add type-in colors + for (var sc in simple_colors) { + examples[examples.length] = sc; + } + + var xml = document.createElement('ul'); + xml.setAttribute('id', 'rgbcolor-examples'); + for (var i = 0; i < examples.length; i++) { + try { + var list_item = document.createElement('li'); + var list_color = new RGBColor(examples[i]); + var example_div = document.createElement('div'); + example_div.style.cssText = + 'margin: 3px; ' + + 'border: 1px solid black; ' + + 'background:' + list_color.toHex() + '; ' + + 'color:' + list_color.toHex() + ; + example_div.appendChild(document.createTextNode('test')); + var list_item_value = document.createTextNode( + ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex() + ); + list_item.appendChild(example_div); + list_item.appendChild(list_item_value); + xml.appendChild(list_item); + + } catch(e){} + } + return xml; + + } + +} +/* + * canvg.js - Javascript SVG parser and renderer on Canvas + * MIT Licensed + * Gabe Lerner (gabelerner@gmail.com) + * http://code.google.com/p/canvg/ + * + * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/ + */ +(function(){ + // canvg(target, s) + // empty parameters: replace all 'svg' elements on page with 'canvas' elements + // target: canvas element or the id of a canvas element + // s: svg string, url to svg file, or xml document + // opts: optional hash of options + // ignoreMouse: true => ignore mouse events + // ignoreAnimation: true => ignore animations + // ignoreDimensions: true => does not try to resize canvas + // ignoreClear: true => does not clear canvas + // offsetX: int => draws at a x offset + // offsetY: int => draws at a y offset + // scaleWidth: int => scales horizontally to width + // scaleHeight: int => scales vertically to height + // renderCallback: function => will call the function after the first render is completed + // forceRedraw: function => will call the function on every frame, if it returns true, will redraw + this.canvg = function (target, s, opts) { + // no parameters + if (target == null && s == null && opts == null) { + var svgTags = document.querySelectorAll('svg'); + for (var i=0; i~\.\[:]+)/g; + var classRegex = /(\.[^\s\+>~\.\[:]+)/g; + var pseudoElementRegex = /(::[^\s\+>~\.\[:]+|:first-line|:first-letter|:before|:after)/gi; + var pseudoClassWithBracketsRegex = /(:[\w-]+\([^\)]*\))/gi; + var pseudoClassRegex = /(:[^\s\+>~\.\[:]+)/g; + var elementRegex = /([^\s\+>~\.\[:]+)/g; + function getSelectorSpecificity(selector) { + var typeCount = [0, 0, 0]; + var findMatch = function(regex, type) { + var matches = selector.match(regex); + if (matches == null) { + return; + } + typeCount[type] += matches.length; + selector = selector.replace(regex, ' '); + }; + + selector = selector.replace(/:not\(([^\)]*)\)/g, ' $1 '); + selector = selector.replace(/{[^]*/gm, ' '); + findMatch(attributeRegex, 1); + findMatch(idRegex, 0); + findMatch(classRegex, 1); + findMatch(pseudoElementRegex, 2); + findMatch(pseudoClassWithBracketsRegex, 1); + findMatch(pseudoClassRegex, 1); + selector = selector.replace(/[\*\s\+>~]/g, ' '); + selector = selector.replace(/[#\.]/g, ' '); + findMatch(elementRegex, 2); + return typeCount.join(''); + } + + function build(opts) { + var svg = { opts: opts }; + + svg.FRAMERATE = 30; + svg.MAX_VIRTUAL_PIXELS = 30000; + + svg.log = function(msg) {}; + if (svg.opts['log'] == true && typeof(console) != 'undefined') { + svg.log = function(msg) { console.log(msg); }; + }; + + // globals + svg.init = function(ctx) { + var uniqueId = 0; + svg.UniqueId = function () { uniqueId++; return 'canvg' + uniqueId; }; + svg.Definitions = {}; + svg.Styles = {}; + svg.StylesSpecificity = {}; + svg.Animations = []; + svg.Images = []; + svg.ctx = ctx; + svg.ViewPort = new (function () { + this.viewPorts = []; + this.Clear = function() { this.viewPorts = []; } + this.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); } + this.RemoveCurrent = function() { this.viewPorts.pop(); } + this.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; } + this.width = function() { return this.Current().width; } + this.height = function() { return this.Current().height; } + this.ComputeSize = function(d) { + if (d != null && typeof(d) == 'number') return d; + if (d == 'x') return this.width(); + if (d == 'y') return this.height(); + return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2); + } + }); + } + svg.init(); + + // images loaded + svg.ImagesLoaded = function() { + for (var i=0; i]*>/, ''); + var xmlDoc = new ActiveXObject('Microsoft.XMLDOM'); + xmlDoc.async = 'false'; + xmlDoc.loadXML(xml); + return xmlDoc; + } + } + + svg.Property = function(name, value) { + this.name = name; + this.value = value; + } + svg.Property.prototype.getValue = function() { + return this.value; + } + + svg.Property.prototype.hasValue = function() { + return (this.value != null && this.value !== ''); + } + + // return the numerical value of the property + svg.Property.prototype.numValue = function() { + if (!this.hasValue()) return 0; + + var n = parseFloat(this.value); + if ((this.value + '').match(/%$/)) { + n = n / 100.0; + } + return n; + } + + svg.Property.prototype.valueOrDefault = function(def) { + if (this.hasValue()) return this.value; + return def; + } + + svg.Property.prototype.numValueOrDefault = function(def) { + if (this.hasValue()) return this.numValue(); + return def; + } + + // color extensions + // augment the current color value with the opacity + svg.Property.prototype.addOpacity = function(opacityProp) { + var newValue = this.value; + if (opacityProp.value != null && opacityProp.value != '' && typeof(this.value)=='string') { // can only add opacity to colors, not patterns + var color = new RGBColor(this.value); + if (color.ok) { + newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')'; + } + } + return new svg.Property(this.name, newValue); + } + + // definition extensions + // get the definition from the definitions table + svg.Property.prototype.getDefinition = function() { + var name = this.value.match(/#([^\)'"]+)/); + if (name) { name = name[1]; } + if (!name) { name = this.value; } + return svg.Definitions[name]; + } + + svg.Property.prototype.isUrlDefinition = function() { + return this.value.indexOf('url(') == 0 + } + + svg.Property.prototype.getFillStyleDefinition = function(e, opacityProp) { + var def = this.getDefinition(); + + // gradient + if (def != null && def.createGradient) { + return def.createGradient(svg.ctx, e, opacityProp); + } + + // pattern + if (def != null && def.createPattern) { + if (def.getHrefAttribute().hasValue()) { + var pt = def.attribute('patternTransform'); + def = def.getHrefAttribute().getDefinition(); + if (pt.hasValue()) { def.attribute('patternTransform', true).value = pt.value; } + } + return def.createPattern(svg.ctx, e); + } + + return null; + } + + // length extensions + svg.Property.prototype.getDPI = function(viewPort) { + return 96.0; // TODO: compute? + } + + svg.Property.prototype.getEM = function(viewPort) { + var em = 12; + + var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); + if (fontSize.hasValue()) em = fontSize.toPixels(viewPort); + + return em; + } + + svg.Property.prototype.getUnits = function() { + var s = this.value+''; + return s.replace(/[0-9\.\-]/g,''); + } + + // get the length as pixels + svg.Property.prototype.toPixels = function(viewPort, processPercent) { + if (!this.hasValue()) return 0; + var s = this.value+''; + if (s.match(/em$/)) return this.numValue() * this.getEM(viewPort); + if (s.match(/ex$/)) return this.numValue() * this.getEM(viewPort) / 2.0; + if (s.match(/px$/)) return this.numValue(); + if (s.match(/pt$/)) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0); + if (s.match(/pc$/)) return this.numValue() * 15; + if (s.match(/cm$/)) return this.numValue() * this.getDPI(viewPort) / 2.54; + if (s.match(/mm$/)) return this.numValue() * this.getDPI(viewPort) / 25.4; + if (s.match(/in$/)) return this.numValue() * this.getDPI(viewPort); + if (s.match(/%$/)) return this.numValue() * svg.ViewPort.ComputeSize(viewPort); + var n = this.numValue(); + if (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort); + return n; + } + + // time extensions + // get the time as milliseconds + svg.Property.prototype.toMilliseconds = function() { + if (!this.hasValue()) return 0; + var s = this.value+''; + if (s.match(/s$/)) return this.numValue() * 1000; + if (s.match(/ms$/)) return this.numValue(); + return this.numValue(); + } + + // angle extensions + // get the angle as radians + svg.Property.prototype.toRadians = function() { + if (!this.hasValue()) return 0; + var s = this.value+''; + if (s.match(/deg$/)) return this.numValue() * (Math.PI / 180.0); + if (s.match(/grad$/)) return this.numValue() * (Math.PI / 200.0); + if (s.match(/rad$/)) return this.numValue(); + return this.numValue() * (Math.PI / 180.0); + } + + // text extensions + // get the text baseline + var textBaselineMapping = { + 'baseline': 'alphabetic', + 'before-edge': 'top', + 'text-before-edge': 'top', + 'middle': 'middle', + 'central': 'middle', + 'after-edge': 'bottom', + 'text-after-edge': 'bottom', + 'ideographic': 'ideographic', + 'alphabetic': 'alphabetic', + 'hanging': 'hanging', + 'mathematical': 'alphabetic' + }; + svg.Property.prototype.toTextBaseline = function () { + if (!this.hasValue()) return null; + return textBaselineMapping[this.value]; + } + + // fonts + svg.Font = new (function() { + this.Styles = 'normal|italic|oblique|inherit'; + this.Variants = 'normal|small-caps|inherit'; + this.Weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit'; + + this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { + var f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font); + return { + fontFamily: fontFamily || f.fontFamily, + fontSize: fontSize || f.fontSize, + fontStyle: fontStyle || f.fontStyle, + fontWeight: fontWeight || f.fontWeight, + fontVariant: fontVariant || f.fontVariant, + toString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } + } + } + + var that = this; + this.Parse = function(s) { + var f = {}; + var d = svg.trim(svg.compressSpaces(s || '')).split(' '); + var set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false } + var ff = ''; + for (var i=0; i this.x2) this.x2 = x; + } + + if (y != null) { + if (isNaN(this.y1) || isNaN(this.y2)) { + this.y1 = y; + this.y2 = y; + } + if (y < this.y1) this.y1 = y; + if (y > this.y2) this.y2 = y; + } + } + this.addX = function(x) { this.addPoint(x, null); } + this.addY = function(y) { this.addPoint(null, y); } + + this.addBoundingBox = function(bb) { + this.addPoint(bb.x1, bb.y1); + this.addPoint(bb.x2, bb.y2); + } + + this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) { + var cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0) + var cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0) + var cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0) + var cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0) + this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y); + } + + this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { + // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + var p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y]; + this.addPoint(p0[0], p0[1]); + this.addPoint(p3[0], p3[1]); + + for (i=0; i<=1; i++) { + var f = function(t) { + return Math.pow(1-t, 3) * p0[i] + + 3 * Math.pow(1-t, 2) * t * p1[i] + + 3 * (1-t) * Math.pow(t, 2) * p2[i] + + Math.pow(t, 3) * p3[i]; + } + + var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; + var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; + var c = 3 * p1[i] - 3 * p0[i]; + + if (a == 0) { + if (b == 0) continue; + var t = -c / b; + if (0 < t && t < 1) { + if (i == 0) this.addX(f(t)); + if (i == 1) this.addY(f(t)); + } + continue; + } + + var b2ac = Math.pow(b, 2) - 4 * c * a; + if (b2ac < 0) continue; + var t1 = (-b + Math.sqrt(b2ac)) / (2 * a); + if (0 < t1 && t1 < 1) { + if (i == 0) this.addX(f(t1)); + if (i == 1) this.addY(f(t1)); + } + var t2 = (-b - Math.sqrt(b2ac)) / (2 * a); + if (0 < t2 && t2 < 1) { + if (i == 0) this.addX(f(t2)); + if (i == 1) this.addY(f(t2)); + } + } + } + + this.isPointInBox = function(x, y) { + return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2); + } + + this.addPoint(x1, y1); + this.addPoint(x2, y2); + } + + // transforms + svg.Transform = function(v) { + var that = this; + this.Type = {} + + // translate + this.Type.translate = function(s) { + this.p = svg.CreatePoint(s); + this.apply = function(ctx) { + ctx.translate(this.p.x || 0.0, this.p.y || 0.0); + } + this.unapply = function(ctx) { + ctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0); + } + this.applyToPoint = function(p) { + p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); + } + } + + // rotate + this.Type.rotate = function(s) { + var a = svg.ToNumberArray(s); + this.angle = new svg.Property('angle', a[0]); + this.cx = a[1] || 0; + this.cy = a[2] || 0; + this.apply = function(ctx) { + ctx.translate(this.cx, this.cy); + ctx.rotate(this.angle.toRadians()); + ctx.translate(-this.cx, -this.cy); + } + this.unapply = function(ctx) { + ctx.translate(this.cx, this.cy); + ctx.rotate(-1.0 * this.angle.toRadians()); + ctx.translate(-this.cx, -this.cy); + } + this.applyToPoint = function(p) { + var a = this.angle.toRadians(); + p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); + p.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]); + p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]); + } + } + + this.Type.scale = function(s) { + this.p = svg.CreatePoint(s); + this.apply = function(ctx) { + ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0); + } + this.unapply = function(ctx) { + ctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0); + } + this.applyToPoint = function(p) { + p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]); + } + } + + this.Type.matrix = function(s) { + this.m = svg.ToNumberArray(s); + this.apply = function(ctx) { + ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]); + } + this.unapply = function(ctx) { + var a = this.m[0]; + var b = this.m[2]; + var c = this.m[4]; + var d = this.m[1]; + var e = this.m[3]; + var f = this.m[5]; + var g = 0.0; + var h = 0.0; + var i = 1.0; + var det = 1 / (a*(e*i-f*h)-b*(d*i-f*g)+c*(d*h-e*g)); + ctx.transform( + det*(e*i-f*h), + det*(f*g-d*i), + det*(c*h-b*i), + det*(a*i-c*g), + det*(b*f-c*e), + det*(c*d-a*f) + ); + } + this.applyToPoint = function(p) { + p.applyTransform(this.m); + } + } + + this.Type.SkewBase = function(s) { + this.base = that.Type.matrix; + this.base(s); + this.angle = new svg.Property('angle', s); + } + this.Type.SkewBase.prototype = new this.Type.matrix; + + this.Type.skewX = function(s) { + this.base = that.Type.SkewBase; + this.base(s); + this.m = [1, 0, Math.tan(this.angle.toRadians()), 1, 0, 0]; + } + this.Type.skewX.prototype = new this.Type.SkewBase; + + this.Type.skewY = function(s) { + this.base = that.Type.SkewBase; + this.base(s); + this.m = [1, Math.tan(this.angle.toRadians()), 0, 1, 0, 0]; + } + this.Type.skewY.prototype = new this.Type.SkewBase; + + this.transforms = []; + + this.apply = function(ctx) { + for (var i=0; i=0; i--) { + this.transforms[i].unapply(ctx); + } + } + + this.applyToPoint = function(p) { + for (var i=0; i existingSpecificity) { + this.styles[name] = styles[name]; + this.stylesSpecificity[name] = specificity; + } + } + } + } + } + }; + + if (node != null && node.nodeType == 1) { //ELEMENT_NODE + // add attributes + for (var i=0; i= this.tokens.length - 1; + } + + this.isCommandOrEnd = function() { + if (this.isEnd()) return true; + return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null; + } + + this.isRelativeCommand = function() { + switch(this.command) + { + case 'm': + case 'l': + case 'h': + case 'v': + case 'c': + case 's': + case 'q': + case 't': + case 'a': + case 'z': + return true; + break; + } + return false; + } + + this.getToken = function() { + this.i++; + return this.tokens[this.i]; + } + + this.getScalar = function() { + return parseFloat(this.getToken()); + } + + this.nextCommand = function() { + this.previousCommand = this.command; + this.command = this.getToken(); + } + + this.getPoint = function() { + var p = new svg.Point(this.getScalar(), this.getScalar()); + return this.makeAbsolute(p); + } + + this.getAsControlPoint = function() { + var p = this.getPoint(); + this.control = p; + return p; + } + + this.getAsCurrentPoint = function() { + var p = this.getPoint(); + this.current = p; + return p; + } + + this.getReflectedControlPoint = function() { + if (this.previousCommand.toLowerCase() != 'c' && + this.previousCommand.toLowerCase() != 's' && + this.previousCommand.toLowerCase() != 'q' && + this.previousCommand.toLowerCase() != 't' ){ + return this.current; + } + + // reflect point + var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y); + return p; + } + + this.makeAbsolute = function(p) { + if (this.isRelativeCommand()) { + p.x += this.current.x; + p.y += this.current.y; + } + return p; + } + + this.addMarker = function(p, from, priorTo) { + // if the last angle isn't filled in because we didn't have this point yet ... + if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) { + this.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo); + } + this.addMarkerAngle(p, from == null ? null : from.angleTo(p)); + } + + this.addMarkerAngle = function(p, a) { + this.points.push(p); + this.angles.push(a); + } + + this.getMarkerPoints = function() { return this.points; } + this.getMarkerAngles = function() { + for (var i=0; i 1) { + rx *= Math.sqrt(l); + ry *= Math.sqrt(l); + } + // cx', cy' + var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt( + ((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) / + (Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2)) + ); + if (isNaN(s)) s = 0; + var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); + // cx, cy + var centp = new svg.Point( + (curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, + (curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y + ); + // vector magnitude + var m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); } + // ratio between two vectors + var r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) } + // angle between two vectors + var a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); } + // initial angle + var a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]); + // angle delta + var u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]; + var v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry]; + var ad = a(u, v); + if (r(u,v) <= -1) ad = Math.PI; + if (r(u,v) >= 1) ad = 0; + + // for markers + var dir = 1 - sweepFlag ? 1.0 : -1.0; + var ah = a1 + dir * (ad / 2.0); + var halfWay = new svg.Point( + centp.x + rx * Math.cos(ah), + centp.y + ry * Math.sin(ah) + ); + pp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2); + pp.addMarkerAngle(cp, ah - dir * Math.PI); + + bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better + if (ctx != null) { + var r = rx > ry ? rx : ry; + var sx = rx > ry ? 1 : rx / ry; + var sy = rx > ry ? ry / rx : 1; + + ctx.translate(centp.x, centp.y); + ctx.rotate(xAxisRotation); + ctx.scale(sx, sy); + ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag); + ctx.scale(1/sx, 1/sy); + ctx.rotate(-xAxisRotation); + ctx.translate(-centp.x, -centp.y); + } + } + break; + case 'Z': + case 'z': + if (ctx != null) ctx.closePath(); + pp.current = pp.start; + } + } + + return bb; + } + + this.getMarkers = function() { + var points = this.PathParser.getMarkerPoints(); + var angles = this.PathParser.getMarkerAngles(); + + var markers = []; + for (var i=0; i 1) this.offset = 1; + + var stopColor = this.style('stop-color', true); + if (stopColor.value === '') stopColor.value = '#000'; + if (this.style('stop-opacity').hasValue()) stopColor = stopColor.addOpacity(this.style('stop-opacity')); + this.color = stopColor.value; + } + svg.Element.stop.prototype = new svg.Element.ElementBase; + + // animation base element + svg.Element.AnimateBase = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + + svg.Animations.push(this); + + this.duration = 0.0; + this.begin = this.attribute('begin').toMilliseconds(); + this.maxDuration = this.begin + this.attribute('dur').toMilliseconds(); + + this.getProperty = function() { + var attributeType = this.attribute('attributeType').value; + var attributeName = this.attribute('attributeName').value; + + if (attributeType == 'CSS') { + return this.parent.style(attributeName, true); + } + return this.parent.attribute(attributeName, true); + }; + + this.initialValue = null; + this.initialUnits = ''; + this.removed = false; + + this.calcValue = function() { + // OVERRIDE ME! + return ''; + } + + this.update = function(delta) { + // set initial value + if (this.initialValue == null) { + this.initialValue = this.getProperty().value; + this.initialUnits = this.getProperty().getUnits(); + } + + // if we're past the end time + if (this.duration > this.maxDuration) { + // loop for indefinitely repeating animations + if (this.attribute('repeatCount').value == 'indefinite' + || this.attribute('repeatDur').value == 'indefinite') { + this.duration = 0.0 + } + else if (this.attribute('fill').valueOrDefault('remove') == 'freeze' && !this.frozen) { + this.frozen = true; + this.parent.animationFrozen = true; + this.parent.animationFrozenValue = this.getProperty().value; + } + else if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) { + this.removed = true; + this.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue; + return true; + } + return false; + } + this.duration = this.duration + delta; + + // if we're past the begin time + var updated = false; + if (this.begin < this.duration) { + var newValue = this.calcValue(); // tween + + if (this.attribute('type').hasValue()) { + // for transform, etc. + var type = this.attribute('type').value; + newValue = type + '(' + newValue + ')'; + } + + this.getProperty().value = newValue; + updated = true; + } + + return updated; + } + + this.from = this.attribute('from'); + this.to = this.attribute('to'); + this.values = this.attribute('values'); + if (this.values.hasValue()) this.values.value = this.values.value.split(';'); + + // fraction of duration we've covered + this.progress = function() { + var ret = { progress: (this.duration - this.begin) / (this.maxDuration - this.begin) }; + if (this.values.hasValue()) { + var p = ret.progress * (this.values.value.length - 1); + var lb = Math.floor(p), ub = Math.ceil(p); + ret.from = new svg.Property('from', parseFloat(this.values.value[lb])); + ret.to = new svg.Property('to', parseFloat(this.values.value[ub])); + ret.progress = (p - lb) / (ub - lb); + } + else { + ret.from = this.from; + ret.to = this.to; + } + return ret; + } + } + svg.Element.AnimateBase.prototype = new svg.Element.ElementBase; + + // animate element + svg.Element.animate = function(node) { + this.base = svg.Element.AnimateBase; + this.base(node); + + this.calcValue = function() { + var p = this.progress(); + + // tween value linearly + var newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress; + return newValue + this.initialUnits; + }; + } + svg.Element.animate.prototype = new svg.Element.AnimateBase; + + // animate color element + svg.Element.animateColor = function(node) { + this.base = svg.Element.AnimateBase; + this.base(node); + + this.calcValue = function() { + var p = this.progress(); + var from = new RGBColor(p.from.value); + var to = new RGBColor(p.to.value); + + if (from.ok && to.ok) { + // tween color linearly + var r = from.r + (to.r - from.r) * p.progress; + var g = from.g + (to.g - from.g) * p.progress; + var b = from.b + (to.b - from.b) * p.progress; + return 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')'; + } + return this.attribute('from').value; + }; + } + svg.Element.animateColor.prototype = new svg.Element.AnimateBase; + + // animate transform element + svg.Element.animateTransform = function(node) { + this.base = svg.Element.AnimateBase; + this.base(node); + + this.calcValue = function() { + var p = this.progress(); + + // tween value linearly + var from = svg.ToNumberArray(p.from.value); + var to = svg.ToNumberArray(p.to.value); + var newValue = ''; + for (var i=0; i startI && child.attribute('x').hasValue()) break; // new group + width += child.measureTextRecursive(ctx); + } + return -1 * (textAnchor == 'end' ? width : width / 2.0); + } + return 0; + } + + this.renderChild = function(ctx, parent, i) { + var child = parent.children[i]; + if (child.attribute('x').hasValue()) { + child.x = child.attribute('x').toPixels('x') + this.getAnchorDelta(ctx, parent, i); + if (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x'); + } + else { + if (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x'); + if (child.attribute('dx').hasValue()) this.x += child.attribute('dx').toPixels('x'); + child.x = this.x; + } + this.x = child.x + child.measureText(ctx); + + if (child.attribute('y').hasValue()) { + child.y = child.attribute('y').toPixels('y'); + if (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y'); + } + else { + if (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y'); + if (child.attribute('dy').hasValue()) this.y += child.attribute('dy').toPixels('y'); + child.y = this.y; + } + this.y = child.y; + + child.render(ctx); + + for (var i=0; i0 && text[i-1]!=' ' && i0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial'; + if (typeof(font.glyphs[c]) != 'undefined') { + glyph = font.glyphs[c][arabicForm]; + if (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c]; + } + } + else { + glyph = font.glyphs[c]; + } + if (glyph == null) glyph = font.missingGlyph; + return glyph; + } + + this.renderChildren = function(ctx) { + var customFont = this.parent.style('font-family').getDefinition(); + if (customFont != null) { + var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); + var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle); + var text = this.getText(); + if (customFont.isRTL) text = text.split("").reverse().join(""); + + var dx = svg.ToNumberArray(this.parent.attribute('dx').value); + for (var i=0; i 0) { return ''; } + return this.text; + } + } + svg.Element.tspan.prototype = new svg.Element.TextElementBase; + + // tref + svg.Element.tref = function(node) { + this.base = svg.Element.TextElementBase; + this.base(node); + + this.getText = function() { + var element = this.getHrefAttribute().getDefinition(); + if (element != null) return element.children[0].getText(); + } + } + svg.Element.tref.prototype = new svg.Element.TextElementBase; + + // a element + svg.Element.a = function(node) { + this.base = svg.Element.TextElementBase; + this.base(node); + + this.hasText = node.childNodes.length > 0; + for (var i=0; i 0) { + // render as temporary group + var g = new svg.Element.g(); + g.children = this.children; + g.parent = this; + g.render(ctx); + } + } + + this.onclick = function() { + window.open(this.getHrefAttribute().value); + } + + this.onmousemove = function() { + svg.ctx.canvas.style.cursor = 'pointer'; + } + } + svg.Element.a.prototype = new svg.Element.TextElementBase; + + // image element + svg.Element.image = function(node) { + this.base = svg.Element.RenderedElementBase; + this.base(node); + + var href = this.getHrefAttribute().value; + if (href == '') { return; } + var isSvg = href.match(/\.svg$/) + + svg.Images.push(this); + this.loaded = false; + if (!isSvg) { + this.img = document.createElement('img'); + if (svg.opts['useCORS'] == true) { this.img.crossOrigin = 'Anonymous'; } + var self = this; + this.img.onload = function() { self.loaded = true; } + this.img.onerror = function() { svg.log('ERROR: image "' + href + '" not found'); self.loaded = true; } + this.img.src = href; + } + else { + this.img = svg.ajax(href); + this.loaded = true; + } + + this.renderChildren = function(ctx) { + var x = this.attribute('x').toPixels('x'); + var y = this.attribute('y').toPixels('y'); + + var width = this.attribute('width').toPixels('x'); + var height = this.attribute('height').toPixels('y'); + if (width == 0 || height == 0) return; + + ctx.save(); + if (isSvg) { + ctx.drawSvg(this.img, x, y, width, height); + } + else { + ctx.translate(x, y); + svg.AspectRatio(ctx, + this.attribute('preserveAspectRatio').value, + width, + this.img.width, + height, + this.img.height, + 0, + 0); + ctx.drawImage(this.img, 0, 0); + } + ctx.restore(); + } + + this.getBoundingBox = function() { + var x = this.attribute('x').toPixels('x'); + var y = this.attribute('y').toPixels('y'); + var width = this.attribute('width').toPixels('x'); + var height = this.attribute('height').toPixels('y'); + return new svg.BoundingBox(x, y, x + width, y + height); + } + } + svg.Element.image.prototype = new svg.Element.RenderedElementBase; + + // group element + svg.Element.g = function(node) { + this.base = svg.Element.RenderedElementBase; + this.base(node); + + this.getBoundingBox = function() { + var bb = new svg.BoundingBox(); + for (var i=0; i 0) { + var urlStart = srcs[s].indexOf('url'); + var urlEnd = srcs[s].indexOf(')', urlStart); + var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6); + var doc = svg.parseXml(svg.ajax(url)); + var fonts = doc.getElementsByTagName('font'); + for (var f=0; f> shg_sum; + if ( pa != 0 ) + { + pa = 255 / pa; + pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa; + pixels[yi+1] = ((g_sum * mul_sum) >> shg_sum) * pa; + pixels[yi+2] = ((b_sum * mul_sum) >> shg_sum) * pa; + } else { + pixels[yi] = pixels[yi+1] = pixels[yi+2] = 0; + } + + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + a_sum -= a_out_sum; + + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + a_out_sum -= stackIn.a; + + p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2; + + r_in_sum += ( stackIn.r = pixels[p]); + g_in_sum += ( stackIn.g = pixels[p+1]); + b_in_sum += ( stackIn.b = pixels[p+2]); + a_in_sum += ( stackIn.a = pixels[p+3]); + + r_sum += r_in_sum; + g_sum += g_in_sum; + b_sum += b_in_sum; + a_sum += a_in_sum; + + stackIn = stackIn.next; + + r_out_sum += ( pr = stackOut.r ); + g_out_sum += ( pg = stackOut.g ); + b_out_sum += ( pb = stackOut.b ); + a_out_sum += ( pa = stackOut.a ); + + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + a_in_sum -= pa; + + stackOut = stackOut.next; + + yi += 4; + } + yw += width; + } + + + for ( x = 0; x < width; x++ ) + { + g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0; + + yi = x << 2; + r_out_sum = radiusPlus1 * ( pr = pixels[yi]); + g_out_sum = radiusPlus1 * ( pg = pixels[yi+1]); + b_out_sum = radiusPlus1 * ( pb = pixels[yi+2]); + a_out_sum = radiusPlus1 * ( pa = pixels[yi+3]); + + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + a_sum += sumFactor * pa; + + stack = stackStart; + + for( i = 0; i < radiusPlus1; i++ ) + { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack.a = pa; + stack = stack.next; + } + + yp = width; + + for( i = 1; i <= radius; i++ ) + { + yi = ( yp + x ) << 2; + + r_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i ); + g_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs; + b_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs; + a_sum += ( stack.a = ( pa = pixels[yi+3])) * rbs; + + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + a_in_sum += pa; + + stack = stack.next; + + if( i < heightMinus1 ) + { + yp += width; + } + } + + yi = x; + stackIn = stackStart; + stackOut = stackEnd; + for ( y = 0; y < height; y++ ) + { + p = yi << 2; + pixels[p+3] = pa = (a_sum * mul_sum) >> shg_sum; + if ( pa > 0 ) + { + pa = 255 / pa; + pixels[p] = ((r_sum * mul_sum) >> shg_sum ) * pa; + pixels[p+1] = ((g_sum * mul_sum) >> shg_sum ) * pa; + pixels[p+2] = ((b_sum * mul_sum) >> shg_sum ) * pa; + } else { + pixels[p] = pixels[p+1] = pixels[p+2] = 0; + } + + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + a_sum -= a_out_sum; + + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + a_out_sum -= stackIn.a; + + p = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2; + + r_sum += ( r_in_sum += ( stackIn.r = pixels[p])); + g_sum += ( g_in_sum += ( stackIn.g = pixels[p+1])); + b_sum += ( b_in_sum += ( stackIn.b = pixels[p+2])); + a_sum += ( a_in_sum += ( stackIn.a = pixels[p+3])); + + stackIn = stackIn.next; + + r_out_sum += ( pr = stackOut.r ); + g_out_sum += ( pg = stackOut.g ); + b_out_sum += ( pb = stackOut.b ); + a_out_sum += ( pa = stackOut.a ); + + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + a_in_sum -= pa; + + stackOut = stackOut.next; + + yi += width; + } + } + + context.putImageData( imageData, top_x, top_y ); + +} + + +function stackBlurCanvasRGB( id, top_x, top_y, width, height, radius ) +{ + if ( isNaN(radius) || radius < 1 ) return; + radius |= 0; + + var canvas = document.getElementById( id ); + var context = canvas.getContext("2d"); + var imageData; + + try { + try { + imageData = context.getImageData( top_x, top_y, width, height ); + } catch(e) { + + // NOTE: this part is supposedly only needed if you want to work with local files + // so it might be okay to remove the whole try/catch block and just use + // imageData = context.getImageData( top_x, top_y, width, height ); + try { + netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead"); + imageData = context.getImageData( top_x, top_y, width, height ); + } catch(e) { + alert("Cannot access local image"); + throw new Error("unable to access local image data: " + e); + return; + } + } + } catch(e) { + alert("Cannot access image"); + throw new Error("unable to access image data: " + e); + } + + var pixels = imageData.data; + + var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, + r_out_sum, g_out_sum, b_out_sum, + r_in_sum, g_in_sum, b_in_sum, + pr, pg, pb, rbs; + + var div = radius + radius + 1; + var w4 = width << 2; + var widthMinus1 = width - 1; + var heightMinus1 = height - 1; + var radiusPlus1 = radius + 1; + var sumFactor = radiusPlus1 * ( radiusPlus1 + 1 ) / 2; + + var stackStart = new BlurStack(); + var stack = stackStart; + for ( i = 1; i < div; i++ ) + { + stack = stack.next = new BlurStack(); + if ( i == radiusPlus1 ) var stackEnd = stack; + } + stack.next = stackStart; + var stackIn = null; + var stackOut = null; + + yw = yi = 0; + + var mul_sum = mul_table[radius]; + var shg_sum = shg_table[radius]; + + for ( y = 0; y < height; y++ ) + { + r_in_sum = g_in_sum = b_in_sum = r_sum = g_sum = b_sum = 0; + + r_out_sum = radiusPlus1 * ( pr = pixels[yi] ); + g_out_sum = radiusPlus1 * ( pg = pixels[yi+1] ); + b_out_sum = radiusPlus1 * ( pb = pixels[yi+2] ); + + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + + stack = stackStart; + + for( i = 0; i < radiusPlus1; i++ ) + { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack = stack.next; + } + + for( i = 1; i < radiusPlus1; i++ ) + { + p = yi + (( widthMinus1 < i ? widthMinus1 : i ) << 2 ); + r_sum += ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i ); + g_sum += ( stack.g = ( pg = pixels[p+1])) * rbs; + b_sum += ( stack.b = ( pb = pixels[p+2])) * rbs; + + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + + stack = stack.next; + } + + + stackIn = stackStart; + stackOut = stackEnd; + for ( x = 0; x < width; x++ ) + { + pixels[yi] = (r_sum * mul_sum) >> shg_sum; + pixels[yi+1] = (g_sum * mul_sum) >> shg_sum; + pixels[yi+2] = (b_sum * mul_sum) >> shg_sum; + + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + + p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2; + + r_in_sum += ( stackIn.r = pixels[p]); + g_in_sum += ( stackIn.g = pixels[p+1]); + b_in_sum += ( stackIn.b = pixels[p+2]); + + r_sum += r_in_sum; + g_sum += g_in_sum; + b_sum += b_in_sum; + + stackIn = stackIn.next; + + r_out_sum += ( pr = stackOut.r ); + g_out_sum += ( pg = stackOut.g ); + b_out_sum += ( pb = stackOut.b ); + + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + + stackOut = stackOut.next; + + yi += 4; + } + yw += width; + } + + + for ( x = 0; x < width; x++ ) + { + g_in_sum = b_in_sum = r_in_sum = g_sum = b_sum = r_sum = 0; + + yi = x << 2; + r_out_sum = radiusPlus1 * ( pr = pixels[yi]); + g_out_sum = radiusPlus1 * ( pg = pixels[yi+1]); + b_out_sum = radiusPlus1 * ( pb = pixels[yi+2]); + + r_sum += sumFactor * pr; + g_sum += sumFactor * pg; + b_sum += sumFactor * pb; + + stack = stackStart; + + for( i = 0; i < radiusPlus1; i++ ) + { + stack.r = pr; + stack.g = pg; + stack.b = pb; + stack = stack.next; + } + + yp = width; + + for( i = 1; i <= radius; i++ ) + { + yi = ( yp + x ) << 2; + + r_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i ); + g_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs; + b_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs; + + r_in_sum += pr; + g_in_sum += pg; + b_in_sum += pb; + + stack = stack.next; + + if( i < heightMinus1 ) + { + yp += width; + } + } + + yi = x; + stackIn = stackStart; + stackOut = stackEnd; + for ( y = 0; y < height; y++ ) + { + p = yi << 2; + pixels[p] = (r_sum * mul_sum) >> shg_sum; + pixels[p+1] = (g_sum * mul_sum) >> shg_sum; + pixels[p+2] = (b_sum * mul_sum) >> shg_sum; + + r_sum -= r_out_sum; + g_sum -= g_out_sum; + b_sum -= b_out_sum; + + r_out_sum -= stackIn.r; + g_out_sum -= stackIn.g; + b_out_sum -= stackIn.b; + + p = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2; + + r_sum += ( r_in_sum += ( stackIn.r = pixels[p])); + g_sum += ( g_in_sum += ( stackIn.g = pixels[p+1])); + b_sum += ( b_in_sum += ( stackIn.b = pixels[p+2])); + + stackIn = stackIn.next; + + r_out_sum += ( pr = stackOut.r ); + g_out_sum += ( pg = stackOut.g ); + b_out_sum += ( pb = stackOut.b ); + + r_in_sum -= pr; + g_in_sum -= pg; + b_in_sum -= pb; + + stackOut = stackOut.next; + + yi += width; + } + } + + context.putImageData( imageData, top_x, top_y ); + +} + +function BlurStack() +{ + this.r = 0; + this.g = 0; + this.b = 0; + this.a = 0; + this.next = null; +} diff --git a/asset/thirdlib/CECT54.WebUI/plugins/hcharts/export-csv.js b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/export-csv.js new file mode 100644 index 0000000..1ad09f8 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/export-csv.js @@ -0,0 +1,231 @@ +/** + * A Highcharts plugin for exporting data from a rendered chart as CSV, XLS or HTML table + * + * Author: Torstein Honsi + * Licence: MIT + * Version: 1.3.1 + */ +/*global Highcharts, window, document, Blob */ +(function (Highcharts) { + + 'use strict'; + + var each = Highcharts.each, + downloadAttrSupported = document.createElement('a').download !== undefined; + + + /** + * Get the data rows as a two dimensional array + */ + Highcharts.Chart.prototype.getDataRows = function () { + var options = (this.options.exporting || {}).csv || {}, + xAxis = this.xAxis[0], + rows = {}, + rowArr = [], + dataRows, + names = [], + i, + x, + + // Options + dateFormat = options.dateFormat || '%Y-%m-%d %H:%M:%S'; + + // Loop the series and index values + i = 0; + each(this.series, function (series) { + if (series.options.includeInCSVExport !== false) { + names.push(series.name); + each(series.points, function (point) { + if (!rows[point.x]) { + rows[point.x] = []; + } + rows[point.x].x = point.x; + + // Pies, funnels etc. use point name in X row + if (!series.xAxis) { + rows[point.x].name = point.name; + } + + rows[point.x][i] = point.y; + }); + i += 1; + } + }); + + // Make a sortable array + for (x in rows) { + if (rows.hasOwnProperty(x)) { + rowArr.push(rows[x]); + } + } + // Sort it by X values + rowArr.sort(function (a, b) { + return a.x - b.x; + }); + + // Add header row + dataRows = [[xAxis.isDatetimeAxis ? '时间' : '类别'].concat(names)]; + + // Transform the rows to CSV + each(rowArr, function (row) { + + // Add the X/date/category + row.unshift(row.name || (xAxis.isDatetimeAxis ? Highcharts.dateFormat(dateFormat, row.x) : xAxis.categories ? Highcharts.pick(xAxis.categories[row.x], row.x) : row.x)); + dataRows.push(row); + }); + + return dataRows; + }; + + /** + * Get a CSV string + */ + Highcharts.Chart.prototype.getCSV = function (useLocalDecimalPoint) { + var csv = '', + rows = this.getDataRows(), + options = (this.options.exporting || {}).csv || {}, + itemDelimiter = options.itemDelimiter || ',', // use ';' for direct import to Excel + lineDelimiter = options.lineDelimiter || '\n'; // '\n' isn't working with the js csv data extraction + + // Transform the rows to CSV + each(rows, function (row, i) { + var val = '', + j = row.length, + n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.'; + while (j--) { + val = row[j]; + if (typeof val === "string") { + val = '"' + val + '"'; + } + if (typeof val === 'number') { + if (n === ',') { + val = val.toString().replace(".", ","); + } + } + row[j] = val; + } + // Add the values + csv += row.join(itemDelimiter); + + // Add the line delimiter + if (i < rows.length - 1) { + csv += lineDelimiter; + } + }); + return csv; + }; + + /** + * Build a HTML table with the data + */ + Highcharts.Chart.prototype.getTable = function (useLocalDecimalPoint) { + var html = '
            ', + rows = this.getDataRows(); + + // Transform the rows to HTML + each(rows, function (row, i) { + var tag = i ? 'td' : 'th', + val, + j, + n = useLocalDecimalPoint ? (1.1).toLocaleString()[1] : '.'; + + html += ''; + for (j = 0; j < row.length; j++) { + val = row[j]; + // Add the cell + if (typeof val === 'number') { + if (n === ',') { + //(typeof val === 'number' ? ' class="number"' : '') + html += '<' + tag + '' + '>' + val.toString().replace(".", ",") + ''; + } else { + html += '<' + tag + '' + '>' + val.toString() + ''; + } + } else { + html += '<' + tag + '>' + val + ''; + } + } + + html += ''; + }); + html += '
            '; + return html; + }; + + function getContent(chart, href, extention, content, MIME) { + var a, + blobObject, + name = (chart.title ? chart.title.textStr.replace(/ /g, '-').toLowerCase() : 'chart'), + options = (chart.options.exporting || {}).csv || {}, + url = options.url || 'http://www.highcharts.com/studies/csv-export/download.php'; + + // Download attribute supported + if (downloadAttrSupported) { + a = document.createElement('a'); + a.href = href; + a.target = '_blank'; + a.download = name + '.' + extention; + document.body.appendChild(a); + a.click(); + a.remove(); + + } else if (window.Blob && window.navigator.msSaveOrOpenBlob) { + // Falls to msSaveOrOpenBlob if download attribute is not supported + blobObject = new Blob([content]); + window.navigator.msSaveOrOpenBlob(blobObject, name + '.' + extention); + + } else { + // Fall back to server side handling + Highcharts.post(url, { + data: content, + type: MIME, + extension: extention + }); + } + } + + // Add "Download CSV" to the exporting menu. Use download attribute if supported, else + // run a simple PHP script that returns a file. The source code for the PHP script can be viewed at + // https://raw.github.com/highslide-software/highcharts.com/master/studies/csv-export/csv.php + if (Highcharts.getOptions().exporting) { + Highcharts.getOptions().exporting.buttons.contextButton.menuItems.push({ + text: Highcharts.getOptions().lang.downloadCSV || '生成CSV', + onclick: function () { + var csv = this.getCSV(true); + getContent( + this, + 'data:text/csv,' + csv.replace(/\n/g, '%0A'), + 'csv', + csv, + 'text/csv' + ); + } + + }, { + text: Highcharts.getOptions().lang.downloadXLS || '生成XLS', + onclick: function () { + var uri = 'data:application/vnd.ms-excel;base64,', + template = '' + + '' + + '' + + '' + + '' + + '' + + this.getTable(true) + + '', + base64 = function (s) { + return window.btoa(unescape(encodeURIComponent(s))); + }; + getContent( + this, + //uri + base64(template), + '', + 'xls', + template, + 'application/vnd.ms-excel' + ); + } + }); + } +}(Highcharts)); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-3d.js b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-3d.js new file mode 100644 index 0000000..2d1c05a --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-3d.js @@ -0,0 +1,44 @@ +/* + Highcharts JS v4.1.3 (2015-02-27) + + (c) 2009-2013 Torstein Hønsi + + License: www.highcharts.com/license +*/ +(function(c){function n(d,a,b){var e,f,g=a.options.chart.options3d,h=!1;b?(h=a.inverted,b=a.plotWidth/2,a=a.plotHeight/2,e=g.depth/2,f=A(g.depth,1)*A(g.viewDistance,0)):(b=a.plotLeft+a.plotWidth/2,a=a.plotTop+a.plotHeight/2,e=g.depth/2,f=A(g.depth,1)*A(g.viewDistance,0));var j=[],i=b,k=a,v=e,p=f,b=y*(h?g.beta:-g.beta),g=y*(h?-g.alpha:g.alpha),o=l(b),s=m(b),t=l(g),u=m(g),w,x,r,n,q,z;c.each(d,function(a){w=(h?a.y:a.x)-i;x=(h?a.x:a.y)-k;r=(a.z||0)-v;n=s*w-o*r;q=-o*t*w-s*t*r+u*x;z=o*u*w+s*u*r+t*x;p>0&& +pf&&g-f>o/2+1.0E-4?(i=i.concat(r(d,a,b,e,f,f+o/2,c,j)),i=i.concat(r(d,a,b,e,f+o/2,g,c,j))):go/2+1.0E-4? +(i=i.concat(r(d,a,b,e,f,f-o/2,c,j)),i=i.concat(r(d,a,b,e,f-o/2,g,c,j))):(i=g-f,["C",d+b*m(f)-b*B*i*l(f)+c,a+e*l(f)+e*B*i*m(f)+j,d+b*m(g)+b*B*i*l(g)+c,a+e*l(g)-e*B*i*m(g)+j,d+b*m(g)+c,a+e*l(g)+j])}function F(d){if(this.chart.is3d()){var a=this.chart.options.plotOptions.column.grouping;a!==void 0&&!a&&this.group.zIndex!==void 0&&this.group.attr({zIndex:this.group.zIndex*10});var b=this.options,e=this.options.states;this.borderWidth=b.borderWidth=b.edgeWidth||1;c.each(this.data,function(a){if(a.y!== +null)a=a.pointAttr,this.borderColor=c.pick(b.edgeColor,a[""].fill),a[""].stroke=this.borderColor,a.hover.stroke=c.pick(e.hover.edgeColor,this.borderColor),a.select.stroke=c.pick(e.select.edgeColor,this.borderColor)})}d.apply(this,[].slice.call(arguments,1))}var o=Math.PI,y=o/180,l=Math.sin,m=Math.cos,A=c.pick,G=Math.round;c.perspective=n;var B=4*(Math.sqrt(2)-1)/3/(o/2);c.SVGRenderer.prototype.toLinePath=function(d,a){var b=[];c.each(d,function(a){b.push("L",a.x,a.y)});d.length&&(b[0]="M",a&&b.push("Z")); +return b};c.SVGRenderer.prototype.cuboid=function(d){var a=this.g(),d=this.cuboidPath(d);a.front=this.path(d[0]).attr({zIndex:d[3],"stroke-linejoin":"round"}).add(a);a.top=this.path(d[1]).attr({zIndex:d[4],"stroke-linejoin":"round"}).add(a);a.side=this.path(d[2]).attr({zIndex:d[5],"stroke-linejoin":"round"}).add(a);a.fillSetter=function(a){var d=c.Color(a).brighten(0.1).get(),f=c.Color(a).brighten(-0.1).get();this.front.attr({fill:a});this.top.attr({fill:d});this.side.attr({fill:f});this.color=a; +return this};a.opacitySetter=function(a){this.front.attr({opacity:a});this.top.attr({opacity:a});this.side.attr({opacity:a});return this};a.attr=function(a){a.shapeArgs||q(a.x)?(a=this.renderer.cuboidPath(a.shapeArgs||a),this.front.attr({d:a[0],zIndex:a[3]}),this.top.attr({d:a[1],zIndex:a[4]}),this.side.attr({d:a[2],zIndex:a[5]})):c.SVGElement.prototype.attr.call(this,a);return this};a.animate=function(a,d,f){q(a.x)&&q(a.y)?(a=this.renderer.cuboidPath(a),this.front.attr({zIndex:a[3]}).animate({d:a[0]}, +d,f),this.top.attr({zIndex:a[4]}).animate({d:a[1]},d,f),this.side.attr({zIndex:a[5]}).animate({d:a[2]},d,f)):a.opacity?(this.front.animate(a,d,f),this.top.animate(a,d,f),this.side.animate(a,d,f)):c.SVGElement.prototype.animate.call(this,a,d,f);return this};a.destroy=function(){this.front.destroy();this.top.destroy();this.side.destroy();return null};a.attr({zIndex:-d[3]});return a};c.SVGRenderer.prototype.cuboidPath=function(d){var a=d.x,b=d.y,e=d.z,f=d.height,g=d.width,h=d.depth,j=c.map,i=[{x:a,y:b, +z:e},{x:a+g,y:b,z:e},{x:a+g,y:b+f,z:e},{x:a,y:b+f,z:e},{x:a,y:b+f,z:e+h},{x:a+g,y:b+f,z:e+h},{x:a+g,y:b,z:e+h},{x:a,y:b,z:e+h}],i=n(i,c.charts[this.chartIndex],d.insidePlotArea),b=function(a,b){a=j(a,function(a){return i[a]});b=j(b,function(a){return i[a]});return E(a)<0?a:E(b)<0?b:[]},d=b([3,2,1,0],[7,6,5,4]),a=b([1,6,7,0],[4,5,2,3]),b=b([1,2,5,6],[0,7,4,3]);return[this.toLinePath(d,!0),this.toLinePath(a,!0),this.toLinePath(b,!0),D(d),D(a),D(b)]};c.SVGRenderer.prototype.arc3d=function(d){d.alpha*= +y;d.beta*=y;var a=this.g(),b=this.arc3dPath(d),e=a.renderer,f=b.zTop*100;a.shapeArgs=d;a.top=e.path(b.top).attr({zIndex:b.zTop}).add(a);a.side1=e.path(b.side2).attr({zIndex:b.zSide1});a.side2=e.path(b.side1).attr({zIndex:b.zSide2});a.inn=e.path(b.inn).attr({zIndex:b.zInn});a.out=e.path(b.out).attr({zIndex:b.zOut});a.fillSetter=function(a){this.color=a;var b=c.Color(a).brighten(-0.1).get();this.side1.attr({fill:b});this.side2.attr({fill:b});this.inn.attr({fill:b});this.out.attr({fill:b});this.top.attr({fill:a}); +return this};a.translateXSetter=function(a){this.out.attr({translateX:a});this.inn.attr({translateX:a});this.side1.attr({translateX:a});this.side2.attr({translateX:a});this.top.attr({translateX:a})};a.translateYSetter=function(a){this.out.attr({translateY:a});this.inn.attr({translateY:a});this.side1.attr({translateY:a});this.side2.attr({translateY:a});this.top.attr({translateY:a})};a.animate=function(a,b,d){q(a.end)||q(a.start)?(this._shapeArgs=this.shapeArgs,c.SVGElement.prototype.animate.call(this, +{_args:a},{duration:b,step:function(){var a=arguments[1],b=a.elem,d=b._shapeArgs,e=a.end,a=a.pos,d=c.merge(d,{x:d.x+(e.x-d.x)*a,y:d.y+(e.y-d.y)*a,r:d.r+(e.r-d.r)*a,innerR:d.innerR+(e.innerR-d.innerR)*a,start:d.start+(e.start-d.start)*a,end:d.end+(e.end-d.end)*a}),e=b.renderer.arc3dPath(d);b.shapeArgs=d;b.top.attr({d:e.top,zIndex:e.zTop});b.inn.attr({d:e.inn,zIndex:e.zInn});b.out.attr({d:e.out,zIndex:e.zOut});b.side1.attr({d:e.side1,zIndex:e.zSide1});b.side2.attr({d:e.side2,zIndex:e.zSide2})}},d)): +c.SVGElement.prototype.animate.call(this,a,b,d);return this};a.destroy=function(){this.top.destroy();this.out.destroy();this.inn.destroy();this.side1.destroy();this.side2.destroy();c.SVGElement.prototype.destroy.call(this)};a.hide=function(){this.top.hide();this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};a.show=function(){this.top.show();this.out.show();this.inn.show();this.side1.show();this.side2.show()};a.zIndex=f;a.attr({zIndex:f});return a};c.SVGRenderer.prototype.arc3dPath= +function(d){var a=d.x,b=d.y,e=d.start,c=d.end-1.0E-5,g=d.r,h=d.innerR,j=d.depth,i=d.alpha,k=d.beta,v=m(e),p=l(e),d=m(c),n=l(c),s=g*m(k),t=g*m(i),u=h*m(k);h*=m(i);var w=j*l(k),x=j*l(i),j=["M",a+s*v,b+t*p],j=j.concat(r(a,b,s,t,e,c,0,0)),j=j.concat(["L",a+u*d,b+h*n]),j=j.concat(r(a,b,u,h,c,e,0,0)),j=j.concat(["Z"]),k=k>0?o/2:0,i=i>0?0:o/2,k=e>-k?e:c>-k?-k:e,q=c0?4:-1}).css({stroke:g.color}).add()):(c={x:l,y:p,z:j+1,width:k,height:i+g.size,depth:h.size,insidePlotArea:!1},this.backFrame?this.backFrame.animate(c):this.backFrame=b.cuboid(c).attr({fill:h.color,zIndex:-3}).css({stroke:h.color}).add(),this.axisLine&&this.axisLine.hide(),a={x:(a.yAxis[0].opposite?k:0)+l- +f.size,y:p,z:0,width:f.size,height:i+g.size,depth:j+h.size,insidePlotArea:!1},this.sideFrame?this.sideFrame.animate(a):this.sideFrame=b.cuboid(a).attr({fill:f.color,zIndex:-2}).css({stroke:f.color}).add())}});c.wrap(c.Axis.prototype,"getPlotLinePath",function(c){var a=c.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d())return a;if(a===null)return a;var b=this.chart.options.chart.options3d.depth,a=[{x:a[1],y:a[2],z:this.horiz||this.opposite?b:0},{x:a[1],y:a[2],z:b},{x:a[4],y:a[5],z:b},{x:a[4], +y:a[5],z:this.horiz||this.opposite?0:b}],a=n(a,this.chart,!1);return a=this.chart.renderer.toLinePath(a,!1)});c.wrap(c.Axis.prototype,"getPlotBandPath",function(c){if(this.chart.is3d()){var a=arguments,b=a[1],a=this.getPlotLinePath(a[2]);(b=this.getPlotLinePath(b))&&a?b.push(a[7],a[8],a[4],a[5],a[1],a[2]):b=null;return b}else return c.apply(this,[].slice.call(arguments,1))});c.wrap(c.Tick.prototype,"getMarkPath",function(c){var a=c.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return a; +a=[{x:a[1],y:a[2],z:0},{x:a[4],y:a[5],z:0}];a=n(a,this.axis.chart,!1);return a=["M",a[0].x,a[0].y,"L",a[1].x,a[1].y]});c.wrap(c.Tick.prototype,"getLabelPosition",function(c){var a=c.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return a;a=n([{x:a.x,y:a.y,z:0}],this.axis.chart,!1)[0];a.x-=!this.axis.horiz&&this.axis.opposite?this.axis.transA:0;return a});c.wrap(c.Axis.prototype,"drawCrosshair",function(c){var a=arguments;this.chart.is3d()&&a[2]&&(a[2]={plotX:a[2].plotXold||a[2].plotX, +plotY:a[2].plotYold||a[2].plotY});c.apply(this,[].slice.call(a,1))});c.wrap(c.seriesTypes.column.prototype,"translate",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=this.options,e=b.depth||25,f=(b.stacking?b.stack||0:this._i)*(e+(b.groupZPadding||1));b.grouping!==!1&&(f=0);f+=b.groupZPadding||1;c.each(this.data,function(b){if(b.y!==null){var c=b.shapeArgs,d=b.tooltipPos;b.shapeType="cuboid";c.z=f;c.depth=e;c.insidePlotArea=!0;d=n([{x:d[0],y:d[1],z:f}], +a,!1)[0];b.tooltipPos=[d.x,d.y]}})}});c.wrap(c.seriesTypes.column.prototype,"animate",function(d){if(this.chart.is3d()){var a=arguments[1],b=this.yAxis,e=this,f=this.yAxis.reversed;if(c.svg)a?c.each(e.data,function(a){if(a.y!==null&&(a.height=a.shapeArgs.height,a.shapey=a.shapeArgs.y,a.shapeArgs.height=1,!f))a.shapeArgs.y=a.stackY?a.plotY+b.translate(a.stackY):a.plotY+(a.negative?-a.height:a.height)}):(c.each(e.data,function(a){if(a.y!==null)a.shapeArgs.height=a.height,a.shapeArgs.y=a.shapey,a.graphic&& +a.graphic.animate(a.shapeArgs,e.options.animation)}),this.drawDataLabels(),e.animate=null)}else d.apply(this,[].slice.call(arguments,1))});c.wrap(c.seriesTypes.column.prototype,"init",function(c){c.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.options,b=a.grouping,e=a.stacking,f=0;if(b===void 0||b){b=this.chart.retrieveStacks(e);e=a.stack||0;for(f=0;f0?l(h)*g:0);b[3]+=-d*(1-m(h))*l(c)+(l(c)>0?l(h)*g:0);b[5]+=-d*(1-m(h))*l(c)+(l(c)>0?l(h)*g:0)})}d.apply(this,[].slice.call(arguments,1))});c.wrap(c.seriesTypes.pie.prototype,"addPoint",function(c){c.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update(this.userOptions,!0)});c.wrap(c.seriesTypes.pie.prototype,"animate",function(d){if(this.chart.is3d()){var a= +arguments[1],b=this.options.animation,e=this.center,f=this.group,g=this.markerGroup;if(c.svg)if(b===!0&&(b={}),a){if(f.oldtranslateX=f.translateX,f.oldtranslateY=f.translateY,a={translateX:e[0],translateY:e[1],scaleX:0.001,scaleY:0.001},f.attr(a),g)g.attrSetters=f.attrSetters,g.attr(a)}else a={translateX:f.oldtranslateX,translateY:f.oldtranslateY,scaleX:1,scaleY:1},f.animate(a,b),g&&g.animate(a,b),this.animate=null}else d.apply(this,[].slice.call(arguments,1))});c.wrap(c.seriesTypes.scatter.prototype, +"translate",function(c){c.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var a=this.chart,b=a.options.chart.options3d.depth,e=a.options.zAxis||{min:0,max:b},f=b/(e.max-e.min),g=[],h;for(h=0;h{point.x}
            y: {point.y}
            z: {point.z}
            ":"x: {point.x}
            y: {point.y}
            z: {point.z}
            ";return a});if(c.VMLRenderer)c.setOptions({animate:!1}),c.VMLRenderer.prototype.cuboid=c.SVGRenderer.prototype.cuboid,c.VMLRenderer.prototype.cuboidPath=c.SVGRenderer.prototype.cuboidPath, +c.VMLRenderer.prototype.toLinePath=c.SVGRenderer.prototype.toLinePath,c.VMLRenderer.prototype.createElement3D=c.SVGRenderer.prototype.createElement3D,c.VMLRenderer.prototype.arc3d=function(d){d=c.SVGRenderer.prototype.arc3d.call(this,d);d.css({zIndex:d.zIndex});return d},c.VMLRenderer.prototype.arc3dPath=c.SVGRenderer.prototype.arc3dPath,c.wrap(c.Axis.prototype,"render",function(c){c.apply(this,[].slice.call(arguments,1));this.sideFrame&&(this.sideFrame.css({zIndex:0}),this.sideFrame.front.attr({fill:this.sideFrame.color})); +this.bottomFrame&&(this.bottomFrame.css({zIndex:1}),this.bottomFrame.front.attr({fill:this.bottomFrame.color}));this.backFrame&&(this.backFrame.css({zIndex:0}),this.backFrame.front.attr({fill:this.backFrame.color}))})})(Highcharts); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-export-clientside.js b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-export-clientside.js new file mode 100644 index 0000000..b7f6568 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-export-clientside.js @@ -0,0 +1,371 @@ +(function (H) { + if (!H.exporting) { + H.exporting = function () { + }; + } + + // This will be redefined later; + var oldExport = H.Chart.prototype.exportChart; + H.Chart.prototype.exportChart = function () { + }; + + // Set the URL of the export server to a non-existant one, just to be sure. + H.getOptions().exporting.url = "http://127.0.0.1:666/"; + + var MIME_TYPES = { + "PDF": "application/pdf", + "PNG": "image/png", + "JPEG": "image/jpeg", + "SVG": "image/svg+xml", + "CSV": "text/csv", + "XLS": "application/vnd.ms-excel" + }; + + var MIME_TYPE_TO_EXTENSION = { + "application/pdf": ".pdf", + "image/png": ".png", + "image/jpeg": ".jpeg", + "image/svg+xml": ".svg", + "text/csv": ".csv", + "application/vnd.ms-excel": ".xls" + }; + + var TRANSLATION_KEY_TO_MIME_TYPES = { + "downloadPDF": "application/pdf", + "downloadPNG": "image/png", + "downloadJPEG": "image/jpeg", + "downloadSVG": "image/svg+xml" + }; + TRANSLATION_KEY_TO_MIME_TYPES[H.getOptions().lang.downloadCSV || '生成CSV'] = "text/csv"; + TRANSLATION_KEY_TO_MIME_TYPES[H.getOptions().lang.downloadXLS || '生成XLS'] = "application/vnd.ms-excel"; + + // This var indicates if the browser supports HTML5 download feature + var browserSupportDownload = false; + var a = document.createElement('a'); + if (typeof window.btoa != "undefined" && typeof a.download != "undefined") { + browserSupportDownload = true; + } + // This is for IE support of Blob + var browserSupportBlob = window.Blob && window.navigator.msSaveOrOpenBlob; + + /** + * Describes the MIME types that this module supports. + * Additionnally, you can call `support(mimeType)` to check + * that this type is available on the current platform. + */ + H.exporting.MIME_TYPES = MIME_TYPES; + + var supportStatus = {}; + var buildSupportStatus = function () { + var hasDownloadOrBlob = browserSupportDownload || browserSupportBlob; + + supportStatus[MIME_TYPES.CSV] = hasDownloadOrBlob && (H.Chart.prototype.getCSV !== undefined); + supportStatus[MIME_TYPES.XLS] = hasDownloadOrBlob && (H.Chart.prototype.getTable !== undefined); + + var svgSupport = (H.Chart.prototype.getSVG !== undefined); + + supportStatus[MIME_TYPES.SVG] = hasDownloadOrBlob && svgSupport && (window.btoa !== undefined); + + // Canvg uses a function named RGBColor, but it's also a not widely known standard object + // http://www.w3.org/TR/2000/REC-DOM-Level-2-Style-20001113/css.html#CSS-RGBColor + // Fugly, but heh. + var rbgColorSupport = false; + try { + rbgColorSupport = (new RGBColor("").ok) !== undefined; + } + catch (e) { + } + // We also check that a canvas element can be created. + var canvas = document.createElement('canvas'); + var canvgSupport = typeof canvg !== "undefined" && typeof RGBColor != "undefined" && + rbgColorSupport && canvas.getContext && canvas.getContext('2d'); + + supportStatus[MIME_TYPES.PNG] = hasDownloadOrBlob && svgSupport && canvgSupport; + // On IE, it relies on canvas.msToBlob() which always returns PNG + supportStatus[MIME_TYPES.JPEG] = /* useless, see last param: hasDownloadOrBlob && */ + svgSupport && canvgSupport && browserSupportDownload; + + supportStatus[MIME_TYPES.PDF] = hasDownloadOrBlob && svgSupport && canvgSupport && (typeof jsPDF !== "undefined"); + + }; + buildSupportStatus(); + + /** + * Checks if the supplied MIME type is available on the + * current platform for a chart to be exported in. + * @param mimeType {String} The MIME type. + * @returns {boolean} true if the MIME type is available on the + * current platform. + */ + H.exporting.supports = function (mimeType) { + if (supportStatus[mimeType]) { + return supportStatus[mimeType]; + } + else { + return false; + } + }; + + + // Remove unsupported download features from the menu + var menuItems = H.getOptions().exporting.buttons.contextButton.menuItems, + menuItem, + textKey, + text, + mimeType, + handlerBuilder = function (mimeType) { + return function () { + this.exportChartLocal({ + type: mimeType, + csv: { + itemDelimiter: ';' + } + }); + } + }; + for (var i in menuItems) { + menuItem = menuItems[i]; + textKey = menuItems[i].textKey; + text = menuItems[i].text; // export-csv do not use a textKey attribute + mimeType = TRANSLATION_KEY_TO_MIME_TYPES[textKey] || TRANSLATION_KEY_TO_MIME_TYPES[text]; + if (mimeType) { + if (!H.exporting.supports(mimeType)) { + // Setting enabled = false isn't enough. + delete menuItems[i]; + } + else { + // Redefines click handler to use our method. + menuItems[i].onclick = handlerBuilder(mimeType); + } + } + } + + /* + * Converts a SVG string to a canvas element + * thanks to canvg. + * @param svg {String} A SVG string. + * @param width {Integer} The rasterized width. + * @param height {Integer} The rasterized height. + * @return {DOMNode} a canvas element. + */ + var svgToCanvas = function (svg, width, height) { + var canvas = document.createElement('canvas'); + + canvas.setAttribute('width', width); + canvas.setAttribute('height', height); + + canvas.getContext('2d').drawSvg(svg, 0, 0, width, height); + + return canvas; + }; + + /** + * An object to simplifies the retrieval of options in + * multiple bundles. + * @param opts {Object} Multiple, an object containing options. + */ + var Opt = function (opts1, opt2, dotdotdot) { + this.bundles = arguments; + }; + + /** + * Fetch the value associated with the specified key in the bundles. + * First one defined is the one returned. + * @param key {String} The key. + * @param value {mixed} The first defined value in the bundles or + * undefined if none is found. + */ + Opt.prototype.get = function (key) { + for (var i = 0; i < this.bundles.length; i++) { + if (this.bundles[i] && this.bundles[i][key] !== undefined) { + return this.bundles[i][key]; + } + } + return undefined; + }; + + // Default options. + var defaultExportOptions = { + type: MIME_TYPES.PNG, + scale: 2, + filename: "chart", + csv: { + useLocalDecimalPoint: true + } + }; + + /** + * Redefines the export function of the official exporting module. + * @param options {Object} Overload the export options defined in the chart. + * @param chartOptions {Object} Additionnal chart options. + */ + H.Chart.prototype.exportChartLocal = function (options, chartOptions) { + var opt = new Opt(options, this.options.exporting, defaultExportOptions); + + var type = opt.get("type"); + if (!H.exporting.supports(type)) { + throw new Error("Unsupported export format on this platform: " + type); + } + + var filename = opt.get("filename") + MIME_TYPE_TO_EXTENSION[type]; + + var data = { + content: undefined, + datauri: undefined, + blob: undefined + }; + + if (type == MIME_TYPES.CSV) { + // Copies some values from the options, so we can set it and change those + // through the options argument. + var hasCSVOptions = this.options.exporting && this.options.exporting.csv; + var csvOpt = new Opt((options || {}).csv, (this.options.exporting || {}).csv, defaultExportOptions.csv); + + var oldOptions = {}, + optionsToCopy = ["dateFormat", "itemDelimiter", "lineDelimiter"], + optionToCopy; + for (var i in optionsToCopy) { + optionToCopy = optionsToCopy[i]; + if (csvOpt.get(optionToCopy)) { + if (!this.options.exporting) { + this.options.exporting = {}; + } + if (!this.options.exporting.csv) { + this.options.exporting.csv = {}; + } + + oldOptions[optionToCopy] = this.options.exporting.csv[optionToCopy]; + this.options.exporting.csv[optionToCopy] = csvOpt.get(optionToCopy); + } + } + + var useLocalDecimalPoint = csvOpt.get("useLocalDecimalPoint"); + + var csv = this.getCSV(useLocalDecimalPoint); + data.content = csv; + + if (hasCSVOptions) { + for (var i in optionsToCopy) { + optionToCopy = optionsToCopy[i]; + if (csvOpt.get(optionToCopy)) { + this.options.exporting.csv[optionToCopy] = oldOptions[optionToCopy]; + } + } + } + else { + delete this.options.exporting.csv; + } + } + else if (type == MIME_TYPES.XLS) { + // Same as above + var hasCSVOptions = this.options.exporting && this.options.exporting.csv; + var csvOpt = new Opt((options || {}).csv, (this.options.exporting || {}).csv, defaultExportOptions.csv); + + var oldOptions = {}, + optionsToCopy = ["dateFormat"], + optionToCopy; + for (var i in optionsToCopy) { + optionToCopy = optionsToCopy[i]; + if (csvOpt.get(optionToCopy)) { + if (!this.options.exporting) { + this.options.exporting = {}; + } + if (!this.options.exporting.csv) { + this.options.exporting.csv = {}; + } + + oldOptions[optionToCopy] = this.options.exporting.csv[optionToCopy]; + this.options.exporting.csv[optionToCopy] = csvOpt.get(optionToCopy); + } + } + + var useLocalDecimalPoint = csvOpt.get("useLocalDecimalPoint"); + + var xls = '' + + '' + + '' + + '' + + '' + + '' + + this.getTable(useLocalDecimalPoint) + + ''; + data.content = xls; + + if (hasCSVOptions) { + for (var i in optionsToCopy) { + optionToCopy = optionsToCopy[i]; + if (csvOpt.get(optionToCopy)) { + this.options.exporting.csv[optionToCopy] = oldOptions[optionToCopy]; + } + } + } + else { + delete this.options.exporting.csv; + } + } + // Image processing + else { + var scale = opt.get("scale"), + sourceWidth = this.options.exporting.width || opt.get("sourceWidth") || this.chartWidth, + sourceHeight = this.options.exporting.height || opt.get("sourceHeight") || this.chartHeight, + destWidth = sourceWidth * scale, + destHeight = sourceHeight * scale; + + var cChartOptions = chartOptions || this.options.exporting && this.options.exporting.chartOptions || {}; + if (!cChartOptions.chart) { + cChartOptions.chart = {width: destWidth, height: destHeight}; + } + else { + cChartOptions.chart.width = destWidth; + cChartOptions.chart.height = destHeight; + } + + var svg = this.getSVG(cChartOptions); + + if (type == MIME_TYPES.SVG) { + data.content = svg; + } + else if (type == MIME_TYPES.PNG || type == MIME_TYPES.JPEG) { + var canvas = svgToCanvas(svg, destWidth, destHeight); + data.datauri = browserSupportDownload && canvas.toDataURL && canvas.toDataURL(type); + data.blob = (type == MIME_TYPES.PNG) && !browserSupportDownload && canvas.msToBlob && canvas.msToBlob(); + } + else if (type == MIME_TYPES.PDF) { + var canvas = svgToCanvas(svg, destWidth, destHeight); + + var doc = new jsPDF('l', 'mm', [destWidth, destHeight]); + ; + doc.addImage(canvas, 'JPEG', 0, 0, destWidth, destHeight); + + data.datauri = browserSupportDownload && doc.output('datauristring'); + data.blob = !browserSupportDownload && doc.output('blob'); + } + } + + if (!data.content && !(data.datauri || data.blob)) { + throw new Error("Something went wrong while exporting the chart"); + } + + if (browserSupportDownload && (data.datauri || data.content)) { + a = document.createElement('a'); + a.href = data.datauri || ('data:' + type + ';base64,' + window.btoa(unescape(encodeURIComponent(data.content)))); + a.download = filename; + document.body.appendChild(a); + a.click(); + a.remove(); + } + else if (browserSupportBlob && (data.blob || data.content)) { + blobObject = data.blob || new Blob([data.content], {type: type}); + window.navigator.msSaveOrOpenBlob(blobObject, filename); + } + else { + window.open(data); + } + } + + // Forces method from export module to use the local version + H.Chart.prototype.exportChart = H.Chart.prototype.exportChartLocal; + +}(Highcharts)); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-more.js b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-more.js new file mode 100644 index 0000000..e8d2a54 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts-more.js @@ -0,0 +1,54 @@ +/* + Highcharts JS v4.1.3 (2015-02-27) + + (c) 2009-2014 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(k,D){function K(a,b,c){this.init.call(this,a,b,c)}var P=k.arrayMin,Q=k.arrayMax,u=k.each,H=k.extend,o=k.merge,R=k.map,q=k.pick,x=k.pInt,p=k.getOptions().plotOptions,g=k.seriesTypes,v=k.extendClass,L=k.splat,r=k.wrap,M=k.Axis,y=k.Tick,I=k.Point,S=k.Pointer,T=k.CenteredSeriesMixin,z=k.TrackerMixin,s=k.Series,w=Math,E=w.round,B=w.floor,N=w.max,U=k.Color,t=function(){};H(K.prototype,{init:function(a,b,c){var d=this,e=d.defaultOptions;d.chart=b;if(b.angular)e.background={};d.options=a=o(e,a); +(a=a.background)&&u([].concat(L(a)).reverse(),function(a){var h=a.backgroundColor,b=c.userOptions,a=o(d.defaultBackgroundOptions,a);if(h)a.backgroundColor=h;a.color=a.backgroundColor;c.options.plotBands.unshift(a);b.plotBands=b.plotBands||[];b.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"silver",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#FFF"],[1,"#DDD"]]},from:-Number.MAX_VALUE, +innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});var G=M.prototype,y=y.prototype,V={getOffset:t,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:t,setCategories:t,setTitle:t},O={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1, +labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=o(this.defaultOptions,this.defaultRadialOptions,a);if(!a.plotBands)a.plotBands=[]},getOffset:function(){G.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center=T.getCenter.call(this.pane)},getLinePath:function(a, +b){var c=this.center,b=q(b,c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){G.setAxisTranslation.call(this);if(this.center)this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0},beforeSetTickPositions:function(){this.autoConnect&& +(this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){G.setAxisSize.call(this);if(this.isRadial){this.center=this.pane.center=k.CenteredSeriesMixin.getCenter.call(this.pane);if(this.isCircular)this.sector=this.endAngleRad-this.startAngleRad;this.len=this.width=this.height=this.center[2]*q(this.sector,1)/2}},getPosition:function(a,b){return this.postTranslate(this.isCircular?this.translate(a):0,q(this.isCircular?b:this.translate(a),this.center[2]/2)-this.offset)}, +postTranslate:function(a,b){var c=this.chart,d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,e=this.startAngleRad,f=d[2]/2,h=[q(c.outerRadius,"100%"),c.innerRadius,q(c.thickness,10)],i=/%$/,l,m=this.isCircular;this.options.gridLineInterpolation==="polygon"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(a=Math.max(a,this.min),b=Math.min(b,this.max),m||(h[0]=this.translate(a), +h[1]=this.translate(b)),h=R(h,function(a){i.test(a)&&(a=x(a,10)*f/100);return a}),c.shape==="circle"||!m?(a=-Math.PI/2,b=Math.PI*1.5,l=!0):(a=e+this.translate(a),b=e+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],h[0],h[0],{start:Math.min(a,b),end:Math.max(a,b),innerR:q(h[1],h[0]-h[2]),open:l}));return d},getPlotLinePath:function(a,b){var c=this,d=c.center,e=c.chart,f=c.getPosition(a),h,i,l;c.isCircular?l=["M",d[0]+e.plotLeft,d[1]+e.plotTop,"L",f.x,f.y]:c.options.gridLineInterpolation=== +"circle"?(a=c.translate(a))&&(l=c.getLinePath(0,a)):(u(e.xAxis,function(a){a.pane===c.pane&&(h=a)}),l=[],a=c.translate(a),d=h.tickPositions,h.autoConnect&&(d=d.concat([d[0]])),b&&(d=[].concat(d).reverse()),u(d,function(f,c){i=h.getPosition(f,a);l.push(c?"L":"M",i.x,i.y)}));return l},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};r(G,"init",function(a,b,c){var j; +var d=b.angular,e=b.polar,f=c.isX,h=d&&f,i,l;l=b.options;var m=c.pane||0;if(d){if(H(this,h?V:O),i=!f)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else if(e)H(this,O),this.defaultRadialOptions=(i=f)?this.defaultRadialXOptions:o(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!h&&(d||e)){a=this.options;if(!b.panes)b.panes=[];this.pane=(j=b.panes[m]=b.panes[m]||new K(L(l.pane)[m],b,this),m=j);m=m.options;b.inverted=!1;l.chart.zoomType=null;this.startAngleRad=b=(m.startAngle- +90)*Math.PI/180;this.endAngleRad=l=(q(m.endAngle,m.startAngle+360)-90)*Math.PI/180;this.offset=a.offset||0;if((this.isCircular=i)&&c.max===D&&l-b===2*Math.PI)this.autoConnect=!0}});r(y,"getPosition",function(a,b,c,d,e){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,e)});r(y,"getLabelPosition",function(a,b,c,d,e,f,h,i,l){var m=this.axis,j=f.y,n=20,g=f.align,A=(m.translate(this.pos)+m.startAngleRad+Math.PI/2)/Math.PI*180%360;m.isRadial?(a=m.getPosition(this.pos,m.center[2]/ +2+q(f.distance,-25)),f.rotation==="auto"?d.attr({rotation:A}):j===null&&(j=m.chart.renderer.fontMetrics(d.styles.fontSize).b-d.getBBox().height/2),g===null&&(m.isCircular?(this.label.getBBox().width>m.len*m.tickInterval/(m.max-m.min)&&(n=0),g=A>n&&A<180-n?"left":A>180+n&&A<360-n?"right":"center"):g="center",d.attr({align:g})),a.x+=f.x,a.y+=j):a=a.call(this,b,c,d,e,f,h,i,l);return a});r(y,"getMarkPath",function(a,b,c,d,e,f,h){var i=this.axis;i.isRadial?(a=i.getPosition(this.pos,i.center[2]/2+d),b= +["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,e,f,h);return b});p.arearange=o(p.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:' {series.name}: {point.low} - {point.high}
            '},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}});g.arearange=v(g.area,{type:"arearange",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0, +highToXY:function(a){var b=this.chart,c=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=c.x-b.plotLeft;a.plotHigh=c.y-b.plotTop},getSegments:function(){var a=this;u(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y=null;else if(b.low===null&&b.high!==null)b.y=b.high});s.prototype.getSegments.call(this)},translate:function(){var a=this,b=a.yAxis;g.area.prototype.translate.apply(a);u(a.points,function(a){var d=a.low,e=a.high,f=a.plotY;e=== +null&&d===null?a.y=null:d===null?(a.plotLow=a.plotY=null,a.plotHigh=b.translate(e,0,1,0,1)):e===null?(a.plotLow=f,a.plotHigh=null):(a.plotLow=f,a.plotHigh=b.translate(e,0,1,0,1))});this.chart.polar&&u(this.points,function(c){a.highToXY(c)})},getSegmentPath:function(a){var b,c=[],d=a.length,e=s.prototype.getSegmentPath,f,h;h=this.options;var i=h.step;for(b=HighchartsAdapter.grep(a,function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotHighX||f.plotX,plotY:f.plotHigh}); +a=e.call(this,b);if(i)i===!0&&(i="left"),h.step={left:"right",center:"center",right:"left"}[i];c=e.call(this,c);h.step=i;h=[].concat(a,c);this.chart.polar||(c[0]="L");this.areaPath=this.areaPath.concat(a,c);return h},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],e=s.prototype,f=this.options.dataLabels,h=f.align,i,l=this.chart.inverted;if(f.enabled||this._hasPointLabels){for(c=b;c--;)if(i=a[c],i.y=i.high,i._plotY=i.plotY,i.plotY=i.plotHigh,d[c]=i.dataLabel,i.dataLabel=i.dataLabelUpper, +i.below=!1,l){if(!h)f.align="left";f.x=f.xHigh}else f.y=f.yHigh;e.drawDataLabels&&e.drawDataLabels.apply(this,arguments);for(c=b;c--;)if(i=a[c],i.dataLabelUpper=i.dataLabel,i.dataLabel=d[c],i.y=i.low,i.plotY=i._plotY,i.below=!0,l){if(!h)f.align="right";f.x=f.xLow}else f.y=f.yLow;e.drawDataLabels&&e.drawDataLabels.apply(this,arguments)}f.align=h},alignDataLabel:function(){g.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:t,getSymbol:t,drawPoints:t});p.areasplinerange=o(p.arearange); +g.areasplinerange=v(g.arearange,{type:"areasplinerange",getPointSpline:g.spline.prototype.getPointSpline});(function(){var a=g.column.prototype;p.columnrange=o(p.column,p.arearange,{lineWidth:1,pointRange:null});g.columnrange=v(g.arearange,{type:"columnrange",translate:function(){var b=this,c=b.yAxis,d;a.translate.apply(b);u(b.points,function(a){var f=a.shapeArgs,h=b.options.minPointLength,i;a.tooltipPos=null;a.plotHigh=d=c.translate(a.high,0,1,0,1);a.plotLow=a.plotY;i=d;a=a.plotY-d;a {series.name}
            Maximum: {point.high}
            Upper quartile: {point.q3}
            Median: {point.median}
            Lower quartile: {point.q1}
            Minimum: {point.low}
            '},whiskerLength:"50%",whiskerWidth:2});g.boxplot=v(g.column,{type:"boxplot",pointArrayMap:["low","q1","median","q3","high"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttrToOptions:{fill:"fillColor",stroke:"color", +"stroke-width":"lineWidth"},drawDataLabels:t,translate:function(){var a=this.yAxis,b=this.pointArrayMap;g.column.prototype.translate.apply(this);u(this.points,function(c){u(b,function(b){c[b]!==null&&(c[b+"Plot"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a=this,b=a.points,c=a.options,d=a.chart.renderer,e,f,h,i,l,m,j,n,g,A,k,J,p,o,r,t,v,s,w,x,z,y,F=a.doQuartiles!==!1,C=parseInt(a.options.whiskerLength,10)/100;u(b,function(b){g=b.graphic;z=b.shapeArgs;k={};o={};t={};y=b.color||a.color; +if(b.plotY!==D)if(e=b.pointAttr[b.selected?"selected":""],v=z.width,s=B(z.x),w=s+v,x=E(v/2),f=B(F?b.q1Plot:b.lowPlot),h=B(F?b.q3Plot:b.lowPlot),i=B(b.highPlot),l=B(b.lowPlot),k.stroke=b.stemColor||c.stemColor||y,k["stroke-width"]=q(b.stemWidth,c.stemWidth,c.lineWidth),k.dashstyle=b.stemDashStyle||c.stemDashStyle,o.stroke=b.whiskerColor||c.whiskerColor||y,o["stroke-width"]=q(b.whiskerWidth,c.whiskerWidth,c.lineWidth),t.stroke=b.medianColor||c.medianColor||y,t["stroke-width"]=q(b.medianWidth,c.medianWidth, +c.lineWidth),j=k["stroke-width"]%2/2,n=s+x+j,A=["M",n,h,"L",n,i,"M",n,f,"L",n,l],F&&(j=e["stroke-width"]%2/2,n=B(n)+j,f=B(f)+j,h=B(h)+j,s+=j,w+=j,J=["M",s,h,"L",s,f,"L",w,f,"L",w,h,"L",s,h,"z"]),C&&(j=o["stroke-width"]%2/2,i+=j,l+=j,p=["M",n-x*C,i,"L",n+x*C,i,"M",n-x*C,l,"L",n+x*C,l]),j=t["stroke-width"]%2/2,m=E(b.medianPlot)+j,r=["M",s,m,"L",w,m],g)b.stem.animate({d:A}),C&&b.whiskers.animate({d:p}),F&&b.box.animate({d:J}),b.medianShape.animate({d:r});else{b.graphic=g=d.g().add(a.group);b.stem=d.path(A).attr(k).add(g); +if(C)b.whiskers=d.path(p).attr(o).add(g);if(F)b.box=d.path(J).attr(e).add(g);b.medianShape=d.path(r).attr(t).add(g)}})}});p.errorbar=o(p.boxplot,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:' {series.name}: {point.low} - {point.high}
            '},whiskerWidth:null});g.errorbar=v(g.boxplot,{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:g.arearange? +g.arearange.prototype.drawDataLabels:t,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||g.column.prototype.getColumnMetrics.call(this)}});p.waterfall=o(p.column,{lineWidth:1,lineColor:"#333",dashStyle:"dot",borderColor:"#333",dataLabels:{inside:!0},states:{hover:{lineWidthPlus:0}}});g.waterfall=v(g.column,{type:"waterfall",upColorProp:"fill",pointArrayMap:["low","y"],pointValKey:"y",translate:function(){var a=this.options,b=this.yAxis,c,d,e,f,h,i,l,m,j,n=a.threshold, +k=a.stacking;g.column.prototype.translate.apply(this);l=m=n;d=this.points;for(c=0,a=d.length;c0?b.translate(l,0,1)-f.y:b.translate(l,0,1)-b.translate(l-i,0,1);l+=i}e.plotY=f.y=E(f.y)-this.borderWidth%2/2;f.height=N(E(f.height),0.001);e.yBottom=f.y+f.height;f=e.plotY+(e.negative?f.height:0);this.chart.inverted?e.tooltipPos[0]=b.len-f:e.tooltipPos[1]=f}},processData:function(a){var b=this.yData,c=this.options.data,d,e=b.length,f,h,i,l,m,j;h=f=i=l=this.options.threshold||0;for(j=0;j0?(b.pointAttr=e,b.color=d):b.pointAttr=a.pointAttr})},getGraphPath:function(){var a=this.data,b=a.length,c=E(this.options.lineWidth+this.borderWidth)%2/2,d=[],e,f,h;for(h=1;h0?(i[f]-a)/(b-a):0.5,m&&h>=0&&(h=Math.sqrt(h)),l.push(w.ceil(c+h*(d-c))/2);this.radii=l},animate:function(a){var b=this.options.animation;if(!a)u(this.points,function(a){var d=a.graphic,a=a.shapeArgs; +d&&a&&(d.attr("r",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,e=this.radii;g.scatter.prototype.translate.call(this);for(a=b.length;a--;)c=b[a],d=e?e[a]:0,d>=this.minPxSize/2?(c.shapeType="circle",c.shapeArgs={x:c.plotX,y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d,height:2*d}):c.shapeArgs=c.plotY=c.dlBox=D},drawLegendSymbol:function(a,b){var c=x(a.itemStyle.fontSize)/2;b.legendSymbol=this.chart.renderer.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup); +b.legendSymbol.isMarker=!0},drawPoints:g.column.prototype.drawPoints,alignDataLabel:g.column.prototype.alignDataLabel,buildKDTree:t,applyZones:t});M.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,e=b,f=this.isXAxis,h=f?"xData":"yData",i=this.min,l={},m=w.min(c.plotWidth,c.plotHeight),j=Number.MAX_VALUE,n=-Number.MAX_VALUE,g=this.max-i,k=b/g,p=[];u(this.series,function(b){var h=b.options;if(b.bubblePadding&&(b.visible||!c.options.chart.ignoreHiddenSeries))if(a.allowZoomOutside= +!0,p.push(b),f)u(["minSize","maxSize"],function(a){var b=h[a],f=/%$/.test(b),b=x(b);l[a]=f?m*b/100:b}),b.minPxSize=l.minSize,b=b.zData,b.length&&(j=q(h.zMin,w.min(j,w.max(P(b),h.displayNegative===!1?h.zThreshold:-Number.MAX_VALUE))),n=q(h.zMax,w.max(n,Q(b))))});u(p,function(a){var b=a[h],c=b.length,m;f&&a.getRadii(j,n,l.minSize,l.maxSize);if(g>0)for(;c--;)typeof b[c]==="number"&&(m=a.radii[c],d=Math.min((b[c]-i)*k-m,d),e=Math.max((b[c]-i)*k+m,e))});p.length&&g>0&&q(this.options.min,this.userMin)=== +D&&q(this.options.max,this.userMax)===D&&(e-=b,k*=(b+d-e)/b,this.min+=d/k,this.max+=e/k)};(function(){function a(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var b=this.xAxis.center;a.push("L",b[0],b[1])},this.closedStacks=!0}function b(a,b){var c=this.chart,d=this.options.animation,e=this.group,j=this.markerGroup,n=this.xAxis.center,g=c.plotLeft,k=c.plotTop;if(c.polar){if(c.renderer.isSVG)d===!0&&(d={}),b?(c={translateX:n[0]+g,translateY:n[1]+k,scaleX:0.001,scaleY:0.001}, +e.attr(c),j&&j.attr(c)):(c={translateX:g,translateY:k,scaleX:1,scaleY:1},e.animate(c,d),j&&j.animate(c,d),this.animate=null)}else a.call(this,b)}var c=s.prototype,d=S.prototype,e;c.searchPolarPoint=function(a){var b=this.chart,c=this.xAxis.pane.center,d=a.chartX-c[0]-b.plotLeft,a=a.chartY-c[1]-b.plotTop;this.kdAxisArray=["clientX"];a={clientX:180+Math.atan2(d,a)*(-180/Math.PI)};return this.searchKDTree(a)};r(c,"buildKDTree",function(a){if(this.chart.polar)this.kdAxisArray=["clientX"];a.apply(this)}); +r(c,"searchPoint",function(a,b){return this.chart.polar?this.searchPolarPoint(b):a.call(this,b)});c.toXY=function(a){var b,c=this.chart,d=a.plotX;b=a.plotY;a.rectPlotX=d;a.rectPlotY=b;d=(d/Math.PI*180+this.xAxis.pane.options.startAngle)%360;d<0&&(d+=360);a.clientX=d;b=this.xAxis.postTranslate(a.plotX,this.yAxis.len-b);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop};g.area&&r(g.area.prototype,"init",a);g.areaspline&&r(g.areaspline.prototype,"init",a);g.spline&&r(g.spline.prototype, +"getPointSpline",function(a,b,c,d){var e,j,n,g,k,p,o;if(this.chart.polar){e=c.plotX;j=c.plotY;a=b[d-1];n=b[d+1];this.connectEnds&&(a||(a=b[b.length-2]),n||(n=b[1]));if(a&&n)g=a.plotX,k=a.plotY,b=n.plotX,p=n.plotY,g=(1.5*e+g)/2.5,k=(1.5*j+k)/2.5,n=(1.5*e+b)/2.5,o=(1.5*j+p)/2.5,b=Math.sqrt(Math.pow(g-e,2)+Math.pow(k-j,2)),p=Math.sqrt(Math.pow(n-e,2)+Math.pow(o-j,2)),g=Math.atan2(k-j,g-e),k=Math.atan2(o-j,n-e),o=Math.PI/2+(g+k)/2,Math.abs(g-o)>Math.PI/2&&(o-=Math.PI),g=e+Math.cos(o)*b,k=j+Math.sin(o)* +b,n=e+Math.cos(Math.PI+o)*p,o=j+Math.sin(Math.PI+o)*p,c.rightContX=n,c.rightContY=o;d?(c=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,g||e,k||j,e,j],a.rightContX=a.rightContY=null):c=["M",e,j]}else c=a.call(this,b,c,d);return c});r(c,"translate",function(a){a.call(this);if(this.chart.polar&&!this.preventPostTranslate)for(var a=this.points,b=a.length;b--;)this.toXY(a[b])});r(c,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length- +1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});r(c,"animate",b);if(g.column)e=g.column.prototype,r(e,"animate",b),r(e,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,e=b.startAngleRad,j=this.chart.renderer,g,k;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(k=b.length;k--;)g=b[k],a=g.barX+e,g.shapeType="path",g.shapeArgs={d:j.symbols.arc(d[0],d[1],c-g.plotY,null,{start:a,end:a+g.pointWidth,innerR:c-q(g.yBottom,c)})}, +this.toXY(g),g.tooltipPos=[g.plotX,g.plotY],g.ttBelow=g.plotY>d[1]}}),r(e,"alignDataLabel",function(a,b,d,e,g,j){if(this.chart.polar){a=b.rectPlotX/Math.PI*180;if(e.align===null)e.align=a>20&&a<160?"left":a>200&&a<340?"right":"center";if(e.verticalAlign===null)e.verticalAlign=a<45||a>315?"bottom":a>135&&a<225?"top":"middle";c.alignDataLabel.call(this,b,d,e,g,j)}else a.call(this,b,d,e,g,j)});r(d,"getCoordinates",function(a,b){var c=this.chart,d={xAxis:[],yAxis:[]};c.polar?u(c.axes,function(a){var e= +a.isXAxis,f=a.center,g=b.chartX-f[0]-c.plotLeft,f=b.chartY-f[1]-c.plotTop;d[e?"xAxis":"yAxis"].push({axis:a,value:a.translate(e?Math.PI-Math.atan2(g,f):Math.sqrt(Math.pow(g,2)+Math.pow(f,2)),!0)})}):d=a.call(this,b);return d})})()})(Highcharts); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts.js b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts.js new file mode 100644 index 0000000..5558353 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/highcharts.js @@ -0,0 +1,323 @@ +/* + Highcharts JS v4.1.3 (2015-02-27) + + (c) 2009-2014 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(){function y(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!=="object"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c==="object"&&Object.prototype.toString.call(c)!=="[object Array]"&&d!=="renderTo"&&typeof c.nodeType!=="number"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a-1?h.thousandsSep:""))):e=Oa(f,e)}j.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}j.push(a);return j.join("")}function nb(a){return V.pow(10,U(V.log(a)/V.LN10))}function ob(a,b,c,d,e){var f,g=a,c=p(c,1);f=a/c;b||(b=[1,2,2.5,5,10],d===!1&&(c=== +1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d=a||!e&&f<=(b[d]+(b[d+1]||b[d]))/2)break;g*=c;return g}function pb(a,b){var c=a.length,d,e;for(e=0;ec&&(c=a[b]);return c}function Qa(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(), +delete a[c]}function Ra(a){fb||(fb=Y(Ka));a&&fb.appendChild(a);fb.innerHTML=""}function ka(a,b){var c="Highcharts error #"+a;if(b)throw c;O.console&&console.log(c)}function da(a){return parseFloat(a.toPrecision(14))}function Sa(a,b){xa=p(a,b.animation)}function Cb(){var a=S.global,b=a.useUTC,c=b?"getUTC":"get",d=b?"setUTC":"set";ya=a.Date||window.Date;mb=b&&a.timezoneOffset;eb=b&&a.getTimezoneOffset;gb=function(a,c,d,h,i,j){var k;b?(k=ya.UTC.apply(0,arguments),k+= +Wa(k)):k=(new ya(a,c,p(d,1),p(h,0),p(i,0),p(j,0))).getTime();return k};qb=c+"Minutes";rb=c+"Hours";sb=c+"Day";Xa=c+"Date";Ya=c+"Month";Za=c+"FullYear";Db=d+"Minutes";Eb=d+"Hours";tb=d+"Date";ub=d+"Month";vb=d+"FullYear"}function L(){}function Ta(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function Fb(a,b,c,d,e){var f=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.alignOptions={align:b.align|| +(f?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(f?"middle":c?"bottom":"top"),y:p(b.y,f?4:c?14:-6),x:p(b.x,f?c?-6:6:0)};this.textAlign=b.textAlign||(f?c?"right":"left":"center")}var u,C=document,O=window,V=Math,x=V.round,U=V.floor,ra=V.ceil,t=V.max,H=V.min,P=V.abs,W=V.cos,Z=V.sin,la=V.PI,ga=la*2/360,za=navigator.userAgent,Gb=O.opera,wa=/(msie|trident)/i.test(za)&&!Gb,hb=C.documentMode===8,wb=/AppleWebKit/.test(za),La=/Firefox/.test(za),Hb=/(Mobile|Android|Windows Phone)/.test(za),Aa= +"http://www.w3.org/2000/svg",ba=!!C.createElementNS&&!!C.createElementNS(Aa,"svg").createSVGRect,Lb=La&&parseInt(za.split("Firefox/")[1],10)<4,ea=!ba&&!wa&&!!C.createElement("canvas").getContext,$a,ab,Ib={},xb=0,fb,S,Oa,xa,yb,F,ma=function(){return u},$=[],bb=0,Ka="div",M="none",Mb=/^[0-9]+$/,ib=["plotTop","marginRight","marginBottom","plotLeft"],Nb="stroke-width",ya,gb,mb,eb,qb,rb,sb,Xa,Ya,Za,Db,Eb,tb,ub,vb,N={},z;z=O.Highcharts=O.Highcharts?ka(16,!0):{};z.seriesTypes=N;var q=z.extend=function(a, +b){var c;a||(a={});for(c in b)a[c]=b[c];return a},p=z.pick=function(){var a=arguments,b,c,d=a.length;for(b=0;b3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+P(a-c).toFixed(f).slice(2):"")};yb={init:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h,i,j=function(a){for(g=a.length;g--;)a[g]==="M"&&a.splice(g+ +1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(j(b),j(c));a.isArea&&(h=b.splice(b.length-6,6),i=c.splice(c.length-6,6));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=[].concat(c).splice(0,f).concat(c);a.shift=0;if(b.length)for(a=c.length;b.length{point.key}
            ',pointFormat:' {series.name}: {point.y}
            ', +shadow:!0,snap:Hb?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:false,text:"",href:"",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var aa=S.plotOptions,Q=aa.line;Cb();var Rb=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,Sb=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, +Tb=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,na=function(a){var b=[],c,d;(function(a){a&&a.stops?d=Ua(a.stops,function(a){return na(a[1])}):(c=Rb.exec(a))?b=[B(c[1]),B(c[2]),B(c[3]),parseFloat(c[4],10)]:(c=Sb.exec(a))?b=[B(c[1],16),B(c[2],16),B(c[3],16),1]:(c=Tb.exec(a))&&(b=[B(c[1]),B(c[2]),B(c[3]),1])})(a);return{get:function(c){var f;d?(f=y(a),f.stops=[].concat(f.stops),n(d,function(a,b){f.stops[b]=[f.stops[b][0],a.get(c)]})):f=b&&!isNaN(b[0])?c==="rgb"?"rgb("+b[0]+","+ +b[1]+","+b[2]+")":c==="a"?b[3]:"rgba("+b.join(",")+")":a;return f},brighten:function(a){if(d)n(d,function(b){b.brighten(a)});else if(pa(a)&&a!==0){var c;for(c=0;c<3;c++)b[c]+=B(a*255),b[c]<0&&(b[c]=0),b[c]>255&&(b[c]=255)}return this},rgba:b,setOpacity:function(a){b[3]=a;return this}}};L.prototype={opacity:1,textProps:"fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration,textShadow".split(","),init:function(a,b){this.element=b==="span"?Y(b):C.createElementNS(Aa,b);this.renderer=a}, +animate:function(a,b,c){b=p(b,xa,!0);db(this);if(b){b=y(b,{});if(c)b.complete=c;kb(this,a,b)}else this.attr(a),c&&c();return this},colorGradient:function(a,b,c){var d=this.renderer,e,f,g,h,i,j,k,l,m,o,s=[];a.linearGradient?f="linearGradient":a.radialGradient&&(f="radialGradient");if(f){g=a[f];h=d.gradients;j=a.stops;m=c.radialReference;Ha(g)&&(a[f]=g={x1:g[0],y1:g[1],x2:g[2],y2:g[3],gradientUnits:"userSpaceOnUse"});f==="radialGradient"&&m&&!r(g.gradientUnits)&&(g=y(g,{cx:m[0]-m[2]/2+g.cx*m[2],cy:m[1]- +m[2]/2+g.cy*m[2],r:g.r*m[2],gradientUnits:"userSpaceOnUse"}));for(o in g)o!=="id"&&s.push(o,g[o]);for(o in j)s.push(j[o]);s=s.join(",");h[s]?a=h[s].attr("id"):(g.id=a="highcharts-"+xb++,h[s]=i=d.createElement(f).attr(g).add(d.defs),i.stops=[],n(j,function(a){a[1].indexOf("rgba")===0?(e=na(a[1]),k=e.get("rgb"),l=e.get("a")):(k=a[1],l=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":k,"stop-opacity":l}).add(i);i.stops.push(a)}));c.setAttribute(b,"url("+d.url+"#"+a+")")}},applyTextShadow:function(a){var b= +this.element,c,d=a.indexOf("contrast")!==-1,e=this.renderer.forExport||b.style.textShadow!==u&&!wa;d&&(a=a.replace(/contrast/g,this.renderer.getContrast(b.style.fill)));e?d&&J(b,{textShadow:a}):(this.fakeTS=!0,this.ySetter=this.xSetter,c=[].slice.call(b.getElementsByTagName("tspan")),n(a.split(/\s?,\s?/g),function(a){var d=b.firstChild,e,i,a=a.split(" ");e=a[a.length-1];(i=a[a.length-2])&&n(c,function(a,c){var f;c===0&&(a.setAttribute("x",b.getAttribute("x")),c=b.getAttribute("y"),a.setAttribute("y", +c||0),c===null&&b.setAttribute("y",0));f=a.cloneNode(1);I(f,{"class":"highcharts-text-shadow",fill:e,stroke:e,"stroke-opacity":1/t(B(i),3),"stroke-width":i,"stroke-linejoin":"round"});b.insertBefore(f,d)})}))},attr:function(a,b){var c,d,e=this.element,f,g=this,h;typeof a==="string"&&b!==u&&(c=a,a={},a[c]=b);if(typeof a==="string")g=(this[a+"Getter"]||this._defaultGetter).call(this,a,e);else{for(c in a){d=a[c];h=!1;this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c)&& +(f||(this.symbolAttr(a),f=!0),h=!0);if(this.rotation&&(c==="x"||c==="y"))this.doTransform=!0;h||(this[c+"Setter"]||this._defaultSetter).call(this,d,c,e);this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(c)&&this.updateShadows(c,d)}if(this.doTransform)this.updateTransform(),this.doTransform=!1}return g},updateShadows:function(a,b){for(var c=this.shadows,d=c.length;d--;)c[d].setAttribute(a,a==="height"?t(b-(c[d].cutHeight||0),0):a==="d"?this.d:b)},addClass:function(a){var b=this.element, +c=I(b,"class")||"";c.indexOf(a)===-1&&I(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=p(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path",a?"url("+this.renderer.url+"#"+a.id+")":M)},crisp:function(a){var b,c={},d,e=a.strokeWidth||this.strokeWidth||0;d=x(e)%2/2;a.x=U(a.x||this.x||0)+d;a.y=U(a.y||this.y||0)+d;a.width= +U((a.width||this.width||0)-2*d);a.height=U((a.height||this.height||0)-2*d);a.strokeWidth=e;for(b in a)this[b]!==a[b]&&(this[b]=c[b]=a[b]);return c},css:function(a){var b=this.styles,c={},d=this.element,e,f,g="";e=!b;if(a&&a.color)a.fill=a.color;if(b)for(f in a)a[f]!==b[f]&&(c[f]=a[f],e=!0);if(e){e=this.textWidth=a&&a.width&&d.nodeName.toLowerCase()==="text"&&B(a.width)||this.textWidth;b&&(a=q(b,c));this.styles=a;e&&(ea||!ba&&this.renderer.forExport)&&delete a.width;if(wa&&!ba)J(this.element,a);else{b= +function(a,b){return"-"+b.toLowerCase()};for(f in a)g+=f.replace(/([A-Z])/g,b)+":"+a[f]+";";I(d,"style",g)}e&&this.added&&this.renderer.buildText(this)}return this},on:function(a,b){var c=this,d=c.element;ab&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=ya.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(za.indexOf("Android")===-1||ya.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){this.element.radialReference=a;return this}, +translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.scaleX,d=this.scaleY,e=this.inverted,f=this.rotation,g=this.element;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(g.getAttribute("x")||0)+" "+(g.getAttribute("y")||0)+")");(r(c)||r(d))&& +a.push("scale("+p(c,1)+" "+p(d,1)+")");a.length&&g.setAttribute("transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects;if(a){if(this.alignOptions=a,this.alignByTranslate=b,!c||Da(c))this.alignTo=d=c||"renderer",ia(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=p(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+ +(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=x(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=x(g);this[this.placed?"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(a){var b,c=this.renderer,d,e=this.rotation,f=this.element,g=this.styles,h=e*ga;d=this.textStr;var i,j=f.style,k,l;d!==u&&(l=["",e||0,g&&g.fontSize,f.style.width].join(","),l=d=== +""||Mb.test(d)?"num:"+d.toString().length+l:d+l);l&&!a&&(b=c.cache[l]);if(!b){if(f.namespaceURI===Aa||c.forExport){try{k=this.fakeTS&&function(a){n(f.querySelectorAll(".highcharts-text-shadow"),function(b){b.style.display=a})},La&&j.textShadow?(i=j.textShadow,j.textShadow=""):k&&k(M),b=f.getBBox?q({},f.getBBox()):{width:f.offsetWidth,height:f.offsetHeight},i?j.textShadow=i:k&&k("")}catch(m){}if(!b||b.width<0)b={width:0,height:0}}else b=this.htmlGetBBox();if(c.isSVG){a=b.width;d=b.height;if(wa&&g&& +g.fontSize==="11px"&&d.toPrecision(3)==="16.9")b.height=d=14;if(e)b.width=P(d*Z(h))+P(a*W(h)),b.height=P(d*W(h))+P(a*Z(h))}c.cache[l]=b}return b},show:function(a){a&&this.element.namespaceURI===Aa?this.element.removeAttribute("visibility"):this.attr({visibility:a?"inherit":"visible"});return this},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.attr({y:-9999})}})},add:function(a){var b=this.renderer, +c=this.element,d;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)d=this.zIndexSetter();d||(a?a.element:b.box).appendChild(c);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point= +null;db(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f]*>/g, +"")},textSetter:function(a){if(a!==this.textStr)delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this)},fillSetter:function(a,b,c){typeof a==="string"?c.setAttribute(b,a):a&&this.colorGradient(a,b,c)},zIndexSetter:function(a,b){var c=this.renderer,d=this.parentGroup,c=(d||c).element||c.box,e,f,g=this.element,h,i;r(a)&&(g.setAttribute(b,a),this[b]=+a);if(this.added){if((a=this.zIndex)&&d)d.handleZ=!0;d=c.childNodes;for(i=0;i +a||!r(a)&&r(f)))c.insertBefore(g,e),h=!0;h||c.appendChild(g)}return h},_defaultSetter:function(a,b,c){c.setAttribute(b,a)}};L.prototype.yGetter=L.prototype.xGetter;L.prototype.translateXSetter=L.prototype.translateYSetter=L.prototype.rotationSetter=L.prototype.verticalAlignSetter=L.prototype.scaleXSetter=L.prototype.scaleYSetter=function(a,b){this[b]=a;this.doTransform=!0};L.prototype["stroke-widthSetter"]=L.prototype.strokeSetter=function(a,b,c){this[b]=a;if(this.stroke&&this["stroke-width"])this.strokeWidth= +this["stroke-width"],L.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",this["stroke-width"]),this.hasStroke=!0;else if(b==="stroke-width"&&a===0&&this.hasStroke)c.removeAttribute("stroke"),this.hasStroke=!1};var sa=function(){this.init.apply(this,arguments)};sa.prototype={Element:L,init:function(a,b,c,d,e){var f=location,g,d=this.createElement("svg").attr({version:"1.1"}).css(this.getStyle(d));g=d.element;a.appendChild(g);a.innerHTML.indexOf("xmlns")===-1&&I(g, +"xmlns",Aa);this.isSVG=!0;this.box=g;this.boxWrapper=d;this.alignedObjects=[];this.url=(La||wb)&&C.getElementsByTagName("base").length?f.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(C.createTextNode("Created with Highcharts 4.1.3"));this.defs=this.createElement("defs").add();this.forExport=e;this.gradients={};this.cache={};this.setSize(b,c,!1);var h;if(La&&a.getBoundingClientRect)this.subPixelFix=b=function(){J(a, +{left:0,top:0});h=a.getBoundingClientRect();J(a,{left:ra(h.left)-h.left+"px",top:ra(h.top)-h.top+"px"})},b(),K(O,"resize",b)},getStyle:function(a){return this.style=q({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Qa(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&& +X(O,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element;b.init(this,a);return b},draw:function(){},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=p(a.textStr,"").toString(),f=e.indexOf("<")!==-1,g=b.childNodes,h,i,j=I(b,"x"),k=a.styles,l=a.textWidth,m=k&&k.lineHeight,o=k&&k.textShadow,s=k&&k.textOverflow==="ellipsis",w=g.length,T=l&&!a.added&&this.box,D=function(a){return m?B(m):c.fontMetrics(/(px|em)$/.test(a&&a.style.fontSize)? +a.style.fontSize:k&&k.fontSize||c.style.fontSize||12,a).h},v=function(a){return a.replace(/</g,"<").replace(/>/g,">")};w--;)b.removeChild(g[w]);!f&&!o&&!s&&e.indexOf(" ")===-1?b.appendChild(C.createTextNode(v(e))):(h=/<.*style="([^"]+)".*>/,i=/<.*href="(http[^"]+)".*>/,T&&T.appendChild(b),e=f?e.replace(/<(b|strong)>/g,'').replace(/<(i|em)>/g,'').replace(//g,"").split(//g): +[e],e[e.length-1]===""&&e.pop(),n(e,function(e,f){var g,m=0,e=e.replace(//g,"|||");g=e.split("|||");n(g,function(e){if(e!==""||g.length===1){var o={},w=C.createElementNS(Aa,"tspan"),p;h.test(e)&&(p=e.match(h)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),I(w,"style",p));i.test(e)&&!d&&(I(w,"onclick",'location.href="'+e.match(i)[1]+'"'),J(w,{cursor:"pointer"}));e=v(e.replace(/<(.|\n)*?>/g,"")||" ");if(e!==" "){w.appendChild(C.createTextNode(e));if(m)o.dx=0; +else if(f&&j!==null)o.x=j;I(w,o);b.appendChild(w);!m&&f&&(!ba&&d&&J(w,{display:"block"}),I(w,"dy",D(w)));if(l){for(var o=e.replace(/([^\^])-/g,"$1- ").split(" "),n=g.length>1||f||o.length>1&&k.whiteSpace!=="nowrap",T,r,u,Ba=[],t=D(w),x=1,q=a.rotation,y=e,z=y.length;(n||s)&&(o.length||Ba.length);)a.rotation=0,T=a.getBBox(!0),u=T.width,!ba&&c.forExport&&(u=c.measureSpanWidth(w.firstChild.data,a.styles)),T=u>l,r===void 0&&(r=T),s&&r?(z/=2,y===""||!T&&z<0.5?o=[]:(T&&(r=!0),y=e.substring(0,y.length+(T? +-1:1)*ra(z)),o=[y+"…"],w.removeChild(w.firstChild))):!T||o.length===1?(o=Ba,Ba=[],o.length&&(x++,w=C.createElementNS(Aa,"tspan"),I(w,{dy:t,x:j}),p&&I(w,"style",p),b.appendChild(w)),u>l&&(l=u)):(w.removeChild(w.firstChild),Ba.unshift(o.pop())),o.length&&w.appendChild(C.createTextNode(o.join(" ").replace(/- /g,"-")));r&&a.attr("title",a.textStr);a.rotation=q}m++}}})}),T&&T.removeChild(b),o&&a.applyTextShadow&&a.applyTextShadow(o))},getContrast:function(a){a=na(a).rgba;return a[0]+a[1]+a[2]>384?"#000": +"#FFF"},button:function(a,b,c,d,e,f,g,h,i){var j=this.label(a,b,c,i,null,null,null,null,"button"),k=0,l,m,o,s,w,p,a={x1:0,y1:0,x2:0,y2:1},e=y({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);o=e.style;delete e.style;f=y(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);s=f.style;delete f.style;g=y(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);w=g.style;delete g.style; +h=y(e,{style:{color:"#CCC"}},h);p=h.style;delete h.style;K(j.element,wa?"mouseover":"mouseenter",function(){k!==3&&j.attr(f).css(s)});K(j.element,wa?"mouseout":"mouseleave",function(){k!==3&&(l=[e,f,g][k],m=[o,s,w][k],j.attr(l).css(m))});j.setState=function(a){(j.state=k=a)?a===2?j.attr(g).css(w):a===3&&j.attr(h).css(p):j.attr(e).css(o)};return j.on("click",function(){k!==3&&d.call(j)}).attr(e).css(q({cursor:"default"},o))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=x(a[1])-b%2/2);a[2]===a[5]&& +(a[2]=a[5]=x(a[2])+b%2/2);return a},path:function(a){var b={fill:M};Ha(a)?b.d=a:ca(a)&&q(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=ca(a)?a:{x:a,y:b,r:c};b=this.createElement("circle");b.xSetter=function(a){this.element.setAttribute("cx",a)};b.ySetter=function(a){this.element.setAttribute("cy",a)};return b.attr(a)},arc:function(a,b,c,d,e,f){if(ca(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0}); +a.r=c;return a},rect:function(a,b,c,d,e,f){var e=ca(a)?a.r:e,g=this.createElement("rect"),a=ca(a)?a:a===u?{}:{x:a,y:b,width:t(c,0),height:t(d,0)};if(f!==u)a.strokeWidth=f,a=g.crisp(a);if(e)a.r=e;g.rSetter=function(a){I(this.element,{rx:a,ry:a})};return g.attr(a)},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[p(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return r(a)?b.attr({"class":"highcharts-"+ +a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:M};arguments.length>1&&q(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g,h=this.symbols[a],h=h&&h(x(b),x(c),d,e,f),i=/^url\((.*?)\)$/,j,k;if(h)g=this.path(h),q(g,{symbolName:a,x:b,y:c,width:d,height:e}),f&&q(g,f);else if(i.test(a))k=function(a,b){a.element&& +(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(x((d-b[0])/2),x((e-b[1])/2)))},j=a.match(i)[1],a=Ib[j]||f&&f.width&&f.height&&[f.width,f.height],g=this.image(j).attr({x:b,y:c}),g.isImg=!0,a?k(g,a):(g.attr({width:0,height:0}),Y("img",{onload:function(){k(g,Ib[j]=[this.width,this.height])},src:j}));return g},symbols:{circle:function(a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L", +a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=W(f),j=Z(f),k=W(g),g=Z(g),e=e.end-fc&&i>b+g&&ib+g&&id&&h>a+g&&ha+g&&hm&&/[ \-]/.test(b.textContent||b.innerText))J(b,{width:m+"px",display:"block",whiteSpace:j&&j.whiteSpace||"normal"}),i=m;this.getSpanCorrection(i,l,h,k,g)}J(b,{left:e+(this.xCorr||0)+"px",top:f+(this.yCorr||0)+"px"});if(wb)l=b.offsetHeight;this.cTT=o}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,c){var d={},e=wa?"-ms-transform":wb?"-webkit-transform":La?"MozTransform":Gb?"-o-transform":"";d[e]=d.transform="rotate("+a+"deg)"; +d[e+(La?"Origin":"-origin")]=d.transformOrigin=b*100+"% "+c+"px";J(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});q(sa.prototype,{html:function(a,b,c){var d=this.createElement("span"),e=d.element,f=d.renderer;d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=this.textStr=a};d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,b){b==="align"&&(b="textAlign");d[b]=a;d.htmlUpdateTransform()};d.attr({text:a,x:x(b),y:x(c)}).css({position:"absolute", +fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});e.style.whiteSpace="nowrap";d.css=d.htmlCss;if(f.isSVG)d.add=function(a){var b,c=f.box.parentNode,j=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)j.push(a),a=a.parentGroup;n(j.reverse(),function(a){var d;b=a.div=a.div||Y(Ka,{className:I(a.element,"class")},{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;q(a,{translateXSetter:function(b,c){d.left=b+"px";a[c]=b;a.doTransform=!0},translateYSetter:function(b, +c){d.top=b+"px";a[c]=b;a.doTransform=!0},visibilitySetter:function(a,b){d[b]=a}})})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d};return d}});if(!ba&&!ea){A={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===Ka;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element= +Y(c);this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box,d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();return this},updateTransform:L.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=W(a*ga),c=Z(a*ga);J(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",b,", M12=",-c,", M21=",c,", M22=",b,", sizingMethod='auto expand')"].join(""): +M})},getSpanCorrection:function(a,b,c,d,e){var f=d?W(d*ga):1,g=d?Z(d*ga):0,h=p(this.elemHeight,this.element.offsetHeight),i;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!=="left"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),J(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,c=[];b--;)if(pa(a[b]))c[b]=x(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))c[b+5]=== +c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]?1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(" ")||"x"},clip:function(a){var b=this,c;a?(c=a.members,ia(c,b),c.push(b),b.destroyClip=function(){ia(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:hb?"inherit":"rect(auto)"});return b.css(a)},css:L.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Ra(a)},destroy:function(){this.destroyClip&&this.destroyClip();return L.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+ +a]=function(){var a=O.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=B(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,j,k=f.path,l,m,o,s;k&&typeof k.value!=="string"&&(k="x");m=k;if(a){o=p(a.width,3);s=(a.opacity||0.15)/o;for(e=1;e<=3;e++){l=o*2+1-2*e;c&&(m=this.cutOffPath(k.value,l+0.5));j=[''];h=Y(g.prepVML(j),null,{left:B(i.left)+p(a.offsetX,1),top:B(i.top)+p(a.offsetY,1)});if(c)h.cutOff=l+1;j=[''];Y(g.prepVML(j),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this},updateShadows:ma,setAttr:function(a,b){hb?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){this.element.className=a},dashstyleSetter:function(a, +b,c){(c.getElementsByTagName("stroke")[0]||Y(this.renderer.prepVML([""]),null,null,c))[b]=a||"solid";this[b]=a},dSetter:function(a,b,c){var d=this.shadows,a=a||[];this.d=a.join&&a.join(" ");c.path=a=this.pathToVML(a);if(d)for(c=d.length;c--;)d[c].path=d[c].cutOff?this.cutOffPath(a,d[c].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,c){var d=c.nodeName;if(d==="SPAN")c.style.color=a;else if(d!=="IMG")c.filled=a!==M,this.setAttr("fillcolor",this.renderer.color(a,c,b,this))},opacitySetter:ma, +rotationSetter:function(a,b,c){c=c.style;this[b]=c[b]=a;c.left=-x(Z(a*ga)+1)+"px";c.top=x(W(a*ga))+"px"},strokeSetter:function(a,b,c){this.setAttr("strokecolor",this.renderer.color(a,c,b))},"stroke-widthSetter":function(a,b,c){c.stroked=!!a;this[b]=a;pa(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,c){a==="inherit"&&(a="visible");this.shadows&&n(this.shadows,function(c){c.style[b]=a});c.nodeName==="DIV"&&(a=a==="hidden"?"-999em": +0,hb||(c.style[b]=a?"visible":"hidden"),b="top");c.style[b]=a},xSetter:function(a,b,c){this[b]=a;b==="x"?b="left":b==="y"&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):c.style[b]=a},zIndexSetter:function(a,b,c){c.style[b]=a}};z.VMLElement=A=ja(L,A);A.prototype.ySetter=A.prototype.widthSetter=A.prototype.heightSetter=A.prototype.xSetter;var Na={Element:A,isIE8:za.indexOf("MSIE 8.0")>-1,init:function(a,b,c,d){var e;this.alignedObjects=[];d=this.createElement(Ka).css(q(this.getStyle(d), +{position:"relative"}));e=d.element;a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.cache={};this.setSize(b,c,!1);if(!C.namespaces.hcv){C.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{C.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){C.styleSheets[0].cssText+="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}}, +isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=ca(a);return q(e,{members:[],count:0,left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+x(a?e:d)+"px,"+x(a?f:b)+"px,"+x(a?b:f)+"px,"+x(a?d:e)+"px)"};!a&&hb&&c==="DIV"&&q(d,{width:b+"px",height:f+"px"});return d}, +updateClipping:function(){n(e.members,function(a){a.element&&a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,j=M;a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var k,l,m=a.linearGradient||a.radialGradient,o,s,w,p,D,v="",a=a.stops,r,fa=[],u=function(){h=[''];Y(e.prepVML(h),null,null,b)};o=a[0];r=a[a.length-1];o[0]>0&&a.unshift([0,o[1]]); +r[0]<1&&a.push([1,r[1]]);n(a,function(a,b){g.test(a[1])?(f=na(a[1]),k=f.get("rgb"),l=f.get("a")):(k=a[1],l=1);fa.push(a[0]*100+"% "+k);b?(w=l,p=k):(s=l,D=k)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,o=m.x2||m[2]||0,m=m.y2||m[3]||0,v='angle="'+(90-V.atan((m-a)/(o-c))*180/la)+'"',u();else{var j=m.r,t=j*2,x=j*2,q=m.cx,E=m.cy,y=b.radialReference,z,j=function(){y&&(z=d.getBBox(),q+=(y[0]-z.x)/z.width-0.5,E+=(y[1]-z.y)/z.height-0.5,t*=y[2]/z.width,x*=y[2]/z.height);v='src="'+S.global.VMLRadialGradientURL+ +'" size="'+t+","+x+'" origin="0.5,0.5" position="'+q+","+E+'" color2="'+D+'" ';u()};d.added?j():d.onAdd=j;j=p}else j=k}else if(g.test(a)&&b.tagName!=="IMG")f=na(a),h=["<",c,' opacity="',f.get("a"),'"/>'],Y(this.prepVML(h),null,null,b),j=f.get("rgb");else{j=b.getElementsByTagName(c);if(j.length)j[0].opacity=1,j[0].type="solid";j=a}return j},prepVML:function(a){var b=this.isIE8,a=a.join("");b?(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'): +a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","1&&f.attr({x:b,y:c,width:d,height:e});return f},createElement:function(a){return a==="rect"?this.symbol(a):sa.prototype.createElement.call(this,a)},invertChild:function(a,b){var c=this,d=b.style,e=a.tagName==="IMG"&&a.style;J(a,{flip:"x",left:B(d.width)-(e?B(e.top):1),top:B(d.height)-(e?B(e.left):1),rotation:-90});n(a.childNodes,function(b){c.invertChild(b,a)})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c|| +d,c=e.innerR,d=W(f),i=Z(f),j=W(g),k=Z(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*j,b+h*k];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*j,b+c*k,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c,b+d/2,"e"]},rect:function(a,b,c,d,e){return sa.prototype.symbols[!r(e)||!e.r?"square":"callout"].call(0,a,b,c,d,e)}}};z.VMLRenderer=A=function(){this.init.apply(this, +arguments)};A.prototype=y(sa.prototype,Na);$a=A}sa.prototype.measureSpanWidth=function(a,b){var c=C.createElement("span"),d;d=C.createTextNode(a);c.appendChild(d);J(c,b);this.box.appendChild(c);d=c.offsetWidth;Ra(c);return d};var Jb;if(ea)z.CanVGRenderer=A=function(){Aa="http://www.w3.org/1999/xhtml"},A.prototype.symbols={},Jb=function(){function a(){var a=b.length,d;for(d=0;d0&&c+i*j>e&&(k=x((d-c)/W(h*ga)));else{d=c-i*j;c+=i*j;if(de)b-=c-e,a.x=e,g.attr({align:"right"});j>b&&(k=b)}k&&g.css({width:k,textOverflow:"ellipsis"})},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,j=i.transA,k=i.reversed, +l=i.staggerLines,m=i.tickRotCorr||{x:0,y:0},c=p(e.y,m.y+(i.side===2?8:-(c.getBBox().height/2))),a=a+e.x+m.x-(f&&d?f*j*(k?-1:1):0),b=b+c-(f&&!d?f*j*(k?1:-1):0);l&&(b+=g/(h||1)%l*(i.labelOffset/l));return{x:a,y:x(b)}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,j=this.pos,k=e.labels,l=this.gridLine,m=h?h+"Grid":"grid",o=h?h+"Tick":"tick",s=e[m+"LineWidth"], +w=e[m+"LineColor"],n=e[m+"LineDashStyle"],D=e[o+"Length"],m=e[o+"Width"]||0,v=e[o+"Color"],r=e[o+"Position"],o=this.mark,fa=k.step,t=!0,x=d.tickmarkOffset,q=this.getPosition(g,j,x,b),z=q.x,q=q.y,y=g&&z===d.pos+d.len||!g&&q===d.pos?-1:1,c=p(c,1);this.isActive=!0;if(s){j=d.getPlotLinePath(j+x,s*y,b,!0);if(l===u){l={stroke:w,"stroke-width":s};if(n)l.dashstyle=n;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=s?f.path(j).attr(l).add(d.gridGroup):null}if(!b&&l&&j)l[this.isNew?"attr":"animate"]({d:j, +opacity:c})}if(m&&D)r==="inside"&&(D=-D),d.opposite&&(D=-D),h=this.getMarkPath(z,q,D,m*y,g,f),o?o.animate({d:h,opacity:c}):this.mark=f.path(h).attr({stroke:v,"stroke-width":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(z))i.xy=q=this.getLabelPosition(z,q,i,g,k,x,a,fa),this.isFirst&&!this.isLast&&!p(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(e.showLastLabel,1)?t=!1:g&&!d.isRadial&&!k.step&&!k.rotation&&!b&&c!==0&&this.handleOverflow(q),fa&&a%fa&&(t=!1),t&&!isNaN(q.y)?(q.opacity=c,i[this.isNew? +"attr":"animate"](q),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Qa(this,this.axis)}};z.PlotLineOrBand=function(a,b){this.axis=a;if(b)this.options=b,this.id=b.id};z.PlotLineOrBand.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=a.options,e=d.label,f=a.label,g=d.width,h=d.to,i=d.from,j=r(i)&&r(h),k=d.value,l=d.dashStyle,m=a.svgElem,o=[],s,w=d.color,p=d.zIndex,n=d.events,v={},t=b.chart.renderer;b.isLog&&(i=Ea(i),h=Ea(h),k=Ea(k));if(g){if(o=b.getPlotLinePath(k,g),v={stroke:w,"stroke-width":g}, +l)v.dashstyle=l}else if(j){o=b.getPlotBandPath(i,h,d);if(w)v.fill=w;if(d.borderWidth)v.stroke=d.borderColor,v["stroke-width"]=d.borderWidth}else return;if(r(p))v.zIndex=p;if(m)if(o)m.animate({d:o},null,m.onGetPath);else{if(m.hide(),m.onGetPath=function(){m.show()},f)a.label=f=f.destroy()}else if(o&&o.length&&(a.svgElem=m=t.path(o).attr(v).add(),n))for(s in d=function(b){m.on(b,function(c){n[b].apply(a,[c])})},n)d(s);if(e&&r(e.text)&&o&&o.length&&b.width>0&&b.height>0){e=y({align:c&&j&&"center",x:c? +!j&&4:10,verticalAlign:!c&&j&&"middle",y:c?j?16:10:j?6:-4,rotation:c&&!j&&90},e);if(!f){v={align:e.textAlign||e.align,rotation:e.rotation};if(r(p))v.zIndex=p;a.label=f=t.text(e.text,0,0,e.useHTML).attr(v).css(e.style).add()}b=[o[1],o[4],j?o[6]:o[1]];j=[o[2],o[5],j?o[7]:o[2]];o=Pa(b);c=Pa(j);f.align(e,!1,{x:o,y:c,width:Fa(b)-o,height:Fa(j)-c});f.show()}else f&&f.hide();return a},destroy:function(){ia(this.axis.plotLinesAndBands,this);delete this.axis;Qa(this)}};var ta=z.Axis=function(){this.init.apply(this, +arguments)};ta.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#D8D8D8",labels:{enabled:!0,style:{color:"#606060",cursor:"default",fontSize:"11px"},x:0,y:15},lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1, +startOnTick:!1,tickColor:"#C0D0E0",tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#707070"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return z.numberFormat(this.total,-1)},style:y(aa.line.dataLabels.style, +{color:"#000000"})}},defaultLeftAxisOptions:{labels:{x:-15,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0,y:null},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0,y:-15},title:{rotation:0}},init:function(a,b){var c=b.isX;this.horiz=a.inverted?!c:c;this.coll=(this.isXAxis=c)?"xAxis":"yAxis";this.opposite=b.opposite;this.side=b.side||(this.horiz?this.opposite?0:2:this.opposite? +1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.chart=a;this.reversed=d.reversed;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.names=this.names||[];this.isLog=e==="logarithmic";this.isDatetimeAxis=e==="datetime";this.isLinked=r(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len= +0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.min=this.max=null;this.crosshair=p(d.crosshair,qa(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;Ma(this,a.axes)===-1&&(c&&!this.isColorAxis?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];if(a.inverted&&c&&this.reversed===u)this.reversed=!0;this.removePlotLine=this.removePlotBand= +this.removePlotBandOrLine;for(f in d)K(this,f,d[f]);if(this.isLog)this.val2lin=Ea,this.lin2val=ha},setOptions:function(a){this.options=y(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],y(S[this.coll],a))},defaultLabelFormatter:function(){var a=this.axis,b=this.value,c=a.categories,d=this.dateTimeLabelFormat,e=S.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format, +a=a.isLog?b:a.tickInterval;if(h)g=Ja(h,this);else if(c)g=b;else if(d)g=Oa(d,b);else if(f&&a>=1E3)for(;f--&&g===u;)c=Math.pow(1E3,f+1),a>=c&&e[f]!==null&&(g=z.numberFormat(b/c,-1)+e[f]);g===u&&(g=P(b)>=1E4?z.numberFormat(b,0):z.numberFormat(b,-1,u,""));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.ignoreMinPadding=a.ignoreMaxPadding=null;a.buildStacks&&a.buildStacks();n(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d; +d=c.options.threshold;var e;a.hasVisibleSeries=!0;a.isLog&&d<=0&&(d=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=H(p(a.dataMin,d[0]),Pa(d)),a.dataMax=t(p(a.dataMax,d[0]),Fa(d))}else{c.getExtremes();e=c.dataMax;c=c.dataMin;if(r(c)&&r(e))a.dataMin=H(p(a.dataMin,c),c),a.dataMax=t(p(a.dataMax,e),e);if(r(d))if(a.dataMin>=d)a.dataMin=d,a.ignoreMinPadding=!0;else if(a.dataMaxc)d?a=H(t(b,a),c):m=!0;return a},e=p(e,this.translate(a,null,null,c)),a=c=x(e+i);i=j=x(k-e-i);isNaN(e)?m=!0:this.horiz?(i=h,j=k-this.bottom,a=c=o(a,g,g+this.width)):(a=g,c=l-this.right,i=j=o(i,h,h+this.height));return m&&!d?null:f.renderer.crispLine(["M",a,i,"L",c,j],b||1)},getLinearTickPositions:function(a, +b,c){var d,e=da(U(b/a)*a),f=da(ra(c/a)*a),g=[];if(b===c&&pa(b))return[b];for(b=e;b<=f;){g.push(b);b=da(b+a);if(b===d)break;d=b}return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e,f=this.min;e=this.max;var g=e-f;if(g&&g/c=this.minRange,f,g,h,i,j;if(this.isXAxis&&this.minRange===u&&!this.isLog)r(a.min)||r(a.max)?this.minRange=null:(n(this.series,function(a){i=a.xData;for(g=j=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]-i[g-1],f===u||hc&&(h=0);d=t(d,h);b.single||(f=t(f,Da(j)?0:h/2),g=t(g,j==="on"?0:h));!a.noSharedTooltip&&r(o)&&(e=r(e)?H(e,o):o)}),h=b.ordinalSlope&&e?b.ordinalSlope/e:1,b.minPointOffset=f*=h,b.pointRangePadding=g*=h,b.pointRange=H(d,c),b.closestPointRange=e;if(a)b.oldTransA=j;b.translationSlope=b.transA=j=b.len/(c+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding=j*f},setTickInterval:function(a){var b=this,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=d.maxPadding,j=d.minPadding, +k=d.tickInterval,l=d.tickPixelInterval,m=b.categories;!f&&!m&&!h&&this.getTickAmount();h?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=p(c.min,c.dataMin),b.max=p(c.max,c.dataMax),d.type!==b.linkedParent.options.type&&ka(11,1)):(b.min=p(b.userMin,d.min,b.dataMin),b.max=p(b.userMax,d.max,b.dataMax));if(e)!a&&H(b.min,p(b.dataMin,b.min))<=0&&ka(10,1),b.min=da(Ea(b.min)),b.max=da(Ea(b.max));if(b.range&&r(b.max))b.userMin=b.min=t(b.min,b.max-b.range),b.userMax=b.max,b.range= +null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!m&&!b.axisPointRange&&!b.usePercentage&&!h&&r(b.min)&&r(b.max)&&(c=b.max-b.min)){if(!r(d.min)&&!r(b.userMin)&&j&&(b.dataMin<0||!b.ignoreMinPadding))b.min-=c*j;if(!r(d.max)&&!r(b.userMax)&&i&&(b.dataMax>0||!b.ignoreMaxPadding))b.max+=c*i}if(pa(d.floor))b.min=t(b.min,d.floor);if(pa(d.ceiling))b.max=H(b.max,d.ceiling);b.tickInterval=b.min===b.max||b.min===void 0||b.max===void 0?1:h&&!k&&l===b.linkedParent.options.tickPixelInterval?b.linkedParent.tickInterval: +p(k,this.tickAmount?(b.max-b.min)/t(this.tickAmount-1,1):void 0,m?1:(b.max-b.min)*l/t(b.len,l));g&&!a&&n(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange)b.tickInterval=t(b.pointRange,b.tickInterval);a=p(d.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);if(!k&&b.tickInterval0.5&&b.tickInterval<5&&b.max>1E3&&b.max<9999)),!!this.tickAmount);if(!this.tickAmount&&this.len)b.tickInterval=b.unsquish();this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,e=a.startOnTick,f=a.endOnTick,g;this.tickmarkOffset=this.categories&&a.tickmarkPlacement==="between"&&this.tickInterval===1?0.5:0;this.minorTickInterval=a.minorTickInterval=== +"auto"&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=a.tickPositions&&a.tickPositions.slice();if(!b&&(this.tickPositions=b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),d&&(d=d.apply(this,[this.min, +this.max]))))this.tickPositions=b=d;if(!this.isLinked)this.trimTicks(b,e,f),this.min===this.max&&r(this.min)&&!this.tickAmount&&(g=!0,this.min-=0.5,this.max+=0.5),this.single=g,!c&&!d&&this.adjustTickAmount()},trimTicks:function(a,b,c){var d=a[0],e=a[a.length-1],f=this.minPointOffset||0;b?this.min=d:this.min-f>d&&a.shift();c?this.max=e:this.max+fc&&(this.tickInterval*=2,this.setTickPositions());if(r(d)){for(a=c=b.length;a--;)(d===3&&a%2===1||d<=2&&a>0&&a=t(d,p(e.max,d))&&(b=u));this.displayBtn=a!==u||b!==u;this.setExtremes(a,b,!1,u,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft|| +0,d=this.horiz,e=p(b.width,a.plotWidth-c+(b.offsetRight||0)),f=p(b.height,a.plotHeight),g=p(b.top,a.plotTop),b=p(b.left,a.plotLeft+c),c=/%$/;c.test(f)&&(f=parseFloat(f)/100*a.plotHeight);c.test(g)&&(g=parseFloat(g)/100*a.plotHeight+a.plotTop);this.left=b;this.top=g;this.width=e;this.height=f;this.bottom=a.chartHeight-f-g;this.right=a.chartWidth-e-b;this.len=t(d?e:f,0);this.pos=d?b:g},getExtremes:function(){var a=this.isLog;return{min:a?da(ha(this.min)):this.min,max:a?da(ha(this.max)):this.max,dataMin:this.dataMin, +dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?ha(this.min):this.min,b=b?ha(this.max):this.max;c>a||a===null?a=c:b15&&a<165?"right":a>195&&a<345?"left":"center"},unsquish:function(){var a=this.ticks,b=this.options.labels,c=this.horiz,d=this.tickInterval,e=d,f=this.len/(((this.categories?1:0)+this.max-this.min)/d),g,h=b.rotation, +i=this.chart.renderer.fontMetrics(b.style.fontSize,a[0]&&a[0].label),j,k=Number.MAX_VALUE,l,m=function(a){a/=f||1;a=a>1?ra(a):1;return a*d};c?(l=r(h)?[h]:f<80&&!b.staggerLines&&!b.step&&b.autoRotation)&&n(l,function(a){var b;a&&a>=-90&&a<=90&&(j=m(P(i.h/Z(ga*a))),b=j+P(a/360),bl)l=a.labelLength}),l>i&&l>g.h?j.rotation=this.labelRotation:this.labelRotation=0;else if(h){k={width:i+"px",textOverflow:"clip"};for(h=c.length;!f&&h--;)if(i=c[h],(i=d[i].label)&&this.len/ +c.length-4a.chartHeight*0.5?a.chartHeight*0.33:a.chartHeight)+"px",textOverflow:"ellipsis"});this.labelAlign=j.align=e.align||this.autoLabelAlign(this.labelRotation);n(c,function(a){var b=(a=d[a])&&a.label;if(b)k&&b.css(y(k,b.specCss)),delete b.specCss,b.attr(j),a.rotation=j.rotation});this.tickRotCorr=b.rotCorr(g.b,this.labelRotation||0,this.side===2)},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options, +e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,j,k,l=0,m,o=0,s=d.title,w=d.labels,T=0,D=b.axisOffset,b=b.clipOffset,v=[-1,1,1,-1][h],q;a.hasData=j=a.hasVisibleSeries||r(a.min)&&r(a.max)&&!!e;a.showAxis=k=j||p(d.showEmpty,!0);a.staggerLines=a.horiz&&w.staggerLines;if(!a.axisGroup)a.gridGroup=c.g("grid").attr({zIndex:d.gridZIndex||1}).add(),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(),a.labelGroup=c.g("axis-labels").attr({zIndex:w.zIndex||7}).addClass("highcharts-"+ +a.coll.toLowerCase()+"-labels").add();if(j||a.isLinked){if(n(e,function(b){f[b]?f[b].addLabel():f[b]=new Ta(a,b)}),a.renderUnsquish(),n(e,function(b){if(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign)T=t(f[b].getLabelSize(),T)}),a.staggerLines)T*=a.staggerLines,a.labelOffset=T}else for(q in f)f[q].destroy(),delete f[q];if(s&&s.text&&s.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(s.text,0,0,s.useHTML).attr({zIndex:7,rotation:s.rotation||0,align:s.textAlign||{low:"left",middle:"center",high:"right"}[s.align]}).addClass("highcharts-"+ +this.coll.toLowerCase()+"-title").css(s.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(k)l=a.axisTitle.getBBox()[g?"height":"width"],m=s.offset,o=r(m)?0:p(s.margin,g?5:10);a.axisTitle[k?"show":"hide"]()}a.offset=v*p(d.offset,D[h]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=h===2?a.tickRotCorr.y:0;g=T+o+(T&&v*(g?p(w.y,a.tickRotCorr.y+8):w.x)-c);a.axisTitleMargin=p(m,g);D[h]=t(D[h],a.axisTitleMargin+l+v*a.offset,g);b[i]=t(b[i],U(d.lineWidth/2)*2)},getLinePath:function(a){var b=this.chart,c=this.opposite, +d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?this.left:f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=B(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)* +this.axisTitleMargin+(this.side===2?i:0);return{x:a?d:b+(g?this.width:0)+h+(e.x||0),y:a?b-(g?this.height:0)+h:d+(e.y||0)}},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.ticks,j=a.minorTicks,k=a.alternateBands,l=d.stackLabels,m=d.alternateGridColor,o=a.tickmarkOffset,s=d.lineWidth,w,p=b.hasRendered&&r(a.oldMin)&&!isNaN(a.oldMin);w=a.hasData;var D=a.showAxis,v,q;a.labelEdge.length=0;a.overlap=!1;n([i,j,k],function(a){for(var b in a)a[b].isActive= +!1});if(w||f){a.minorTickInterval&&!a.categories&&n(a.getMinorTickPositions(),function(b){j[b]||(j[b]=new Ta(a,b,"minor"));p&&j[b].isNew&&j[b].render(null,!0);j[b].render(null,!1,1)});if(g.length&&(n(g,function(b,c){if(!f||b>=a.min&&b<=a.max)i[b]||(i[b]=new Ta(a,b)),p&&i[b].isNew&&i[b].render(c,!0,0.1),i[b].render(c)}),o&&(a.min===0||a.single)))i[-1]||(i[-1]=new Ta(a,-1,null,!0)),i[-1].render(-1);m&&n(g,function(b,c){if(c%2===0&&b= +F.second?0:k*U(i.getMilliseconds()/k));j>=F.second&&i.setSeconds(j>=F.minute?0:k*U(i.getSeconds()/k));if(j>=F.minute)i[Db](j>=F.hour?0:k*U(i[qb]()/k));if(j>=F.hour)i[Eb](j>=F.day?0:k*U(i[rb]()/k));if(j>=F.day)i[tb](j>=F.month?1:k*U(i[Xa]()/k));j>=F.month&&(i[ub](j>=F.year?0:k*U(i[Ya]()/k)),h=i[Za]());j>=F.year&&(h-=h%k,i[vb](h));if(j===F.week)i[tb](i[Xa]()-i[sb]()+p(d,1));b=1;if(mb||eb)i=i.getTime(),i=new ya(i+Wa(i));h=i[Za]();for(var d=i.getTime(),l=i[Ya](),m=i[Xa](),o=(F.day+(g?Wa(i):i.getTimezoneOffset()* +6E4))%F.day;d=0.5)a=x(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=U(b),h, +i,j,k,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];fb&&(!d||k<=c)&&k!==u&&g.push(k),k>c&&(l=!0),k=j}else if(b=ha(b),c=ha(c),a=e[d?"minorTickInterval":"tickInterval"],a=p(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=ob(a,null,nb(a)),g=Ua(this.getLinearTickPositions(a,b,c),Ea),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g};var Kb= +z.Tooltip=function(){this.init.apply(this,arguments)};Kb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=B(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=a.renderer.label("",0,0,b.shape||"callout",null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-9999});ea||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){if(this.label)this.label= +this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden&&(P(a-f.x)>1||P(b-f.y)>1),h=e.followPointer||e.len>1;q(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:h?u:g?(2*f.anchorX+c)/3:c,anchorY:h?u:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g)clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(a){var b=this,c;clearTimeout(this.hideTimer); +if(!this.isHidden)c=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){b.label.fadeOut();b.isHidden=!0},p(a,this.options.hideDelay,500)),c&&n(c,function(a){a.setState()}),this.chart.hoverPoints=null,this.chart.hoverSeries=null},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted,f=d.plotTop,g=d.plotLeft,h=0,i=0,j,k,a=qa(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===u&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(n(a,function(a){j=a.series.yAxis;k=a.series.xAxis; +h+=a.plotX+(!e&&k?k.left-g:0);i+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&j?j.top-f:0)}),h/=a.length,i/=a.length,c=[e?d.plotWidth-i:h,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-h:i]);return Ua(c,x)},getPosition:function(a,b,c){var d=this.chart,e=this.distance,f={},g,h=["y",d.chartHeight,b,c.plotY+d.plotTop],i=["x",d.chartWidth,a,c.plotX+d.plotLeft],j=p(c.ttBelow,d.inverted&&!c.negative||!d.inverted&&c.negative),k=function(a,b,c,d){var g=cb-e)return!1;else f[a]=db-c/2?b-c-2:d-c/2},m=function(a){var b=h;h=i;i=b;g=a},o=function(){k.apply(0,h)!==!1?l.apply(0,i)===!1&&!g&&(m(!0),o()):g?f.x=f.y=0:(m(!0),o())};(d.inverted||this.len>1)&&m();o();return f},defaultFormatter:function(a){var b=this.points||qa(this),c;c=[a.tooltipFooterHeaderFormatter(b[0])];c=c.concat(a.bodyFormatter(b));c.push(a.tooltipFooterHeaderFormatter(b[0],!0)); +return c.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h={},i,j=[];i=e.formatter||this.defaultFormatter;var h=c.hoverPoints,k,l=this.shared;clearTimeout(this.hideTimer);this.followPointer=qa(a)[0].series.tooltipOptions.followPointer;g=this.getAnchor(a,b);f=g[0];g=g[1];l&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,h&&n(h,function(a){a.setState()}),n(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),h={x:a[0].category,y:a[0].y},h.points=j, +this.len=j.length,a=a[0]):h=a.getLabelConfig();i=i.call(h,this);h=a.series;this.distance=p(h.tooltipOptions.distance,16);i===!1?this.hide():(this.isHidden&&(db(d),d.attr("opacity",1).show()),d.attr({text:i}),k=e.borderColor||a.color||h.color||"#606060",d.attr({stroke:k}),this.updatePosition({plotX:f,plotY:g,negative:a.negative,ttBelow:a.ttBelow}),this.isHidden=!1);G(c,"tooltipRefresh",{text:i,x:f+c.plotLeft,y:g+c.plotTop,borderColor:k})},updatePosition:function(a){var b=this.chart,c=this.label,c= +(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(x(c.x),x(c.y),a.plotX+b.plotLeft,a.plotY+b.plotTop)},getXDateFormat:function(a,b,c){var d,b=b.dateTimeLabelFormats,e=c&&c.closestPointRange,f,g={millisecond:15,second:12,minute:9,hour:6,day:3},h,i;if(e){h=Oa("%m-%d %H:%M:%S.%L",a.x);for(f in F){if(e===F.week&&+Oa("%w",a.x)===c.options.startOfWeek&&h.substr(6)==="00:00:00.000"){f="week";break}else if(F[f]>e){f=i;break}else if(g[f]&&h.substr(g[f])!=="01-01 00:00:00.000".substr(g[f]))break; +f!=="week"&&(i=f)}f&&(d=b[f])}else d=b.day;return d||b.year},tooltipFooterHeaderFormatter:function(a,b){var c=b?"footer":"header",d=a.series,e=d.tooltipOptions,f=e.xDateFormat,g=d.xAxis,h=g&&g.options.type==="datetime"&&pa(a.key),c=e[c+"Format"];h&&!f&&(f=this.getXDateFormat(a,e,g));h&&f&&(c=c.replace("{point.key}","{point.key:"+f+"}"));return Ja(c,{point:a,series:d})},bodyFormatter:function(a){return Ua(a,function(a){var c=a.series.tooltipOptions;return(c.pointFormatter||a.point.tooltipFormatter).call(a.point, +c.pointFormat)})}};var Ca;ab=C.documentElement.ontouchstart!==u;var Va=z.Pointer=function(a,b){this.init(a,b)};Va.prototype={init:function(a,b){var c=b.chart,d=c.events,e=ea?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.hasZoom=f||e;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(z.Tooltip&&b.tooltip.enabled)a.tooltip=new Kb(a,b.tooltip),this.followTouchMove= +p(b.tooltip.followTouchMove,!0);this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||window.event,a=Qb(a);if(!a.target)a.target=a.srcElement;d=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;if(!b)this.chartPosition=b=Pb(this.chart.container);d.pageX===u?(c=t(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return q(a,{chartX:x(c),chartY:x(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};n(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c, +value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},runPointActions:function(a){var b=this,c=b.chart,d=c.series,e=c.tooltip,f=e?e.shared:!1,g,h=c.hoverPoint,i=c.hoverSeries,j=c.chartWidth,k=c.chartWidth,l,m=[],o,s;if(!f&&!i)for(g=0;g1)&&a.dist.distRh+j&&(d=h+j);ei+k&&(e=i+k);this.hasDragged=Math.sqrt(Math.pow(m-d,2)+Math.pow(o-e,2));if(this.hasDragged> +10){l=b.isInsidePlot(m-h,o-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!s&&!this.selectionMarker)this.selectionMarker=b.renderer.rect(h,i,f?1:j,g?1:k,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&f&&(d-=m,this.selectionMarker.attr({width:P(d),x:(d>0?0:d)+m}));this.selectionMarker&&g&&(d=e-o,this.selectionMarker.attr({height:P(d),y:(d>0?0:d)+o}));l&&!this.selectionMarker&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this, +c=this.chart,d=this.hasPinched;if(this.selectionMarker){var e={xAxis:[],yAxis:[],originalEvent:a.originalEvent||a},f=this.selectionMarker,g=f.attr?f.attr("x"):f.x,h=f.attr?f.attr("y"):f.y,i=f.attr?f.attr("width"):f.width,j=f.attr?f.attr("height"):f.height,k;if(this.hasDragged||d)n(c.axes,function(c){if(c.zoomEnabled&&r(c.min)&&(d||b[{xAxis:"zoomX",yAxis:"zoomY"}[c.coll]])){var f=c.horiz,o=a.type==="touchend"?c.minPixelPadding:0,s=c.toValue((f?g:h)+o),f=c.toValue((f?g+i:h+j)-o);e[c.coll].push({axis:c, +min:H(s,f),max:t(s,f)});k=!0}}),k&&G(c,"selection",e,function(a){c.zoom(q(a,d?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();d&&this.scaleGroups()}if(c)J(c.container,{cursor:c._cursor}),c.cancelClick=this.hasDragged>10,c.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault();this.dragStart(a)},onDocumentMouseUp:function(a){$[Ca]&&$[Ca].pointer.drop(a)},onDocumentMouseMove:function(a){var b= +this.chart,c=this.chartPosition,a=this.normalize(a,c);c&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(){var a=$[Ca];if(a)a.pointer.reset(),a.pointer.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart;Ca=b.index;a=this.normalize(a);a.returnValue=!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY- +b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=I(a,"class"))if(c.indexOf(b)!==-1)return!0;else if(c.indexOf("highcharts-container")!==-1)return!1;a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries,c=(a=a.relatedTarget||a.toElement)&&a.point&&a.point.series;if(b&&!b.options.stickyTracking&&!this.inClass(a,"highcharts-tooltip")&&c!==b)b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop, +a=this.normalize(a);a.cancelBubble=!0;b.cancelClick||(c&&this.inClass(a.target,"highcharts-tracker")?(G(c.series,"click",q(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(q(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&G(b,"click",a)))},setDOMEvents:function(){var a=this,b=a.chart.container;b.onmousedown=function(b){a.onContainerMouseDown(b)};b.onmousemove=function(b){a.onContainerMouseMove(b)};b.onclick=function(b){a.onContainerClick(b)};K(b,"mouseleave",a.onContainerMouseLeave); +bb===1&&K(C,"mouseup",a.onDocumentMouseUp);if(ab)b.ontouchstart=function(b){a.onContainerTouchStart(b)},b.ontouchmove=function(b){a.onContainerTouchMove(b)},bb===1&&K(C,"touchend",a.onDocumentTouchEnd)},destroy:function(){var a;X(this.chart.container,"mouseleave",this.onContainerMouseLeave);bb||(X(C,"mouseup",this.onDocumentMouseUp),X(C,"touchend",this.onDocumentTouchEnd));clearInterval(this.tooltipTimeout);for(a in this)this[a]=null}};q(z.Pointer.prototype,{pinchTranslate:function(a,b,c,d,e,f){(this.zoomHor|| +this.pinchHor)&&this.pinchTranslateDirection(!0,a,b,c,d,e,f);(this.zoomVert||this.pinchVert)&&this.pinchTranslateDirection(!1,a,b,c,d,e,f)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,j=a?"x":"y",k=a?"X":"Y",l="chart"+k,m=a?"width":"height",o=i["plot"+(a?"Left":"Top")],s,p,n=h||1,D=i.inverted,v=i.bounds[a?"h":"v"],r=b.length===1,q=b[0][l],t=c[0][l],u=!r&&b[1][l],x=!r&&c[1][l],z,c=function(){!r&&P(q-u)>20&&(n=h||P(t-x)/P(q-u));p=(o-t)/n+q;s=i["plot"+(a?"Width":"Height")]/n}; +c();b=p;bv.max&&(b=v.max-s,z=!0);z?(t-=0.8*(t-g[j][0]),r||(x-=0.8*(x-g[j][1])),c()):g[j]=[t,x];D||(f[j]=p-o,f[m]=s);f=D?1/n:n;e[m]=s;e[j]=b;d[D?a?"scaleY":"scaleX":"scale"+k]=n;d["translate"+k]=f*o+(t-f*q)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=a.touches,f=e.length,g=b.lastValidTouch,h=b.hasZoom,i=b.selectionMarker,j={},k=f===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||b.runChartClick),l={};h&&!k&&a.preventDefault();Ua(e,function(a){return b.normalize(a)}); +if(a.type==="touchstart")n(e,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),g.x=[d[0].chartX,d[1]&&d[1].chartX],g.y=[d[0].chartY,d[1]&&d[1].chartY],n(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(p(a.options.min,a.dataMin)),f=a.toPixels(p(a.options.max,a.dataMax)),g=H(e,f),e=t(e,f);b.min=H(a.pos,g-d);b.max=t(a.pos+a.len,e+d)}}),b.res=!0;else if(d.length){if(!i)b.selectionMarker=i=q({destroy:ma},c.plotBox);b.pinchTranslate(d,e,j,i,l,g); +b.hasPinched=h;b.scaleGroups(j,l);if(!h&&b.followTouchMove&&f===1)this.runPointActions(b.normalize(a));else if(b.res)b.res=!1,this.reset(!1,0)}},onContainerTouchStart:function(a){var b=this.chart;Ca=b.index;a.touches.length===1?(a=this.normalize(a),b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&!b.openMenu?(this.runPointActions(a),this.pinch(a)):this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchMove:function(a){(a.touches.length===1||a.touches.length===2)&&this.pinch(a)}, +onDocumentTouchEnd:function(a){$[Ca]&&$[Ca].pointer.drop(a)}});if(O.PointerEvent||O.MSPointerEvent){var ua={},Ab=!!O.PointerEvent,Ub=function(){var a,b=[];b.item=function(a){return this[a]};for(a in ua)ua.hasOwnProperty(a)&&b.push({pageX:ua[a].pageX,pageY:ua[a].pageY,target:ua[a].target});return b},Bb=function(a,b,c,d){a=a.originalEvent||a;if((a.pointerType==="touch"||a.pointerType===a.MSPOINTER_TYPE_TOUCH)&&$[Ca])d(a),d=$[Ca].pointer,d[b]({type:c,target:a.currentTarget,preventDefault:ma,touches:Ub()})}; +q(Va.prototype,{onContainerPointerDown:function(a){Bb(a,"onContainerTouchStart","touchstart",function(a){ua[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){Bb(a,"onContainerTouchMove","touchmove",function(a){ua[a.pointerId]={pageX:a.pageX,pageY:a.pageY};if(!ua[a.pointerId].target)ua[a.pointerId].target=a.currentTarget})},onDocumentPointerUp:function(a){Bb(a,"onContainerTouchEnd","touchend",function(a){delete ua[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container, +Ab?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,Ab?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(C,Ab?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});cb(Va.prototype,"init",function(a,b,c){a.call(this,b,c);(this.hasZoom||this.followTouchMove)&&J(b.container,{"-ms-touch-action":M,"touch-action":M})});cb(Va.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(K)});cb(Va.prototype,"destroy", +function(a){this.batchMSEvents(X);a.call(this)})}var lb=z.Legend=function(a,b){this.init(a,b)};lb.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=b.itemMarginTop||0;this.options=b;if(b.enabled)c.itemStyle=d,c.itemHiddenStyle=y(d,b.itemHiddenStyle),c.itemMarginTop=e,c.padding=d=p(b.padding,8),c.initialItemX=d,c.initialItemY=d-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.symbolWidth=p(b.symbolWidth,16),c.pages=[],c.render(),K(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a, +b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.legendColor||a.color||"#CCC":g,g=a.options&&a.options.marker,i={fill:h},j;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(j in i.stroke=h,g=a.convertAttribs(g),g)d=g[j],d!==u&&(i[j]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;a.legendGroup&&a.legendGroup.translate(b? +e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;n(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ra(a.checkbox)},clearItems:function(){var a=this;n(a.getAllItems(),function(b){a.destroyItem(b)})},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy();if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight;if(b)c=b.translateY, +n(this.allItems,function(e){var f=e.checkbox,g;f&&(g=c+f.y+(a||0)+3,J(f,{left:b.translateX+e.checkboxOffset+f.x-20+"px",top:g+"px",display:g>c-6&&g(m||b.chartWidth-2*j-w-d.x))this.itemX=w,this.itemY+=s+this.lastLineHeight+o;this.maxItemWidth=t(this.maxItemWidth,f);this.lastItemY=s+this.itemY+o;this.lastLineHeight=t(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=f:(this.itemY+=s+g+o,this.lastLineHeight=g);this.offsetWidth=m||t((e?this.itemX-w-k:f)+j,this.offsetWidth)},getAllItems:function(){var a=[];n(this.chart.series,function(b){var c= +b.options;if(p(c.showInLegend,!r(c.linkedTo)?u:!1,!0))a=a.concat(b.legendItems||(c.legendType==="point"?b.data:b))});return a},adjustMargins:function(a,b){var c=this.chart,d=this.options,e=d.align[0]+d.verticalAlign[0]+d.layout[0];this.display&&!d.floating&&n([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(f,g){f.test(e)&&!r(a[g])&&(c[ib[g]]=t(c[ib[g]],c.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*d[g%2?"x":"y"]+p(d.margin,12)+b[g]))})},render:function(){var a= +this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,j=a.options,k=a.padding,l=j.borderWidth,m=j.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=a.getAllItems();pb(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});j.reversed&&e.reverse();a.allItems=e; +a.display=f=!!e.length;a.lastLineHeight=0;n(e,function(b){a.renderItem(b)});g=(j.width||a.offsetWidth)+k;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);h+=k;if(l||m){if(i){if(g>0&&h>0)i[i.isNew?"attr":"animate"](i.crisp({width:g,height:h})),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,j.borderRadius,l||0).attr({stroke:j.borderColor,"stroke-width":l||0,fill:m||M}).add(d).shadow(j.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;n(e,function(b){a.positionItem(b)}); +f&&d.align(q({width:g,height:h},j),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h,i=this.clipRect,j=e.navigation,k=p(j.animation,!0),l=j.arrowSize||12,m=this.nav,o=this.pages,s,w=this.allItems;e.layout==="horizontal"&&(f/=2);g&&(f=H(f,g));o.length=0;if(a>f&&!e.useHTML){this.clipHeight=h=t(f-20-this.titleHeight-this.padding, +0);this.currentPage=p(this.currentPage,1);this.fullHeight=a;n(w,function(a,b){var c=a._legendItemPos[1],d=x(a.legendItem.getBBox().height),e=o.length;if(!e||c-o[e-1]>h&&(s||c)!==o[e-1])o.push(s||c),e++;b===w.length-1&&c+d-o[e-1]>h&&o.push(c);c!==s&&(s=c)});if(!i)i=b.clipRect=d.clipRect(0,this.padding,9999,0),b.contentGroup.clip(i);i.attr({height:h});if(!m)this.nav=m=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,l,l).on("click",function(){b.scroll(-1,k)}).add(m),this.pager= +d.text("",15,10).css(j.style).add(m),this.down=d.symbol("triangle-down",0,0,l,l).on("click",function(){b.scroll(1,k)}).add(m);b.scroll(0);a=f}else if(m)i.attr({height:c.chartHeight}),m.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages,d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,h=g.activeColor,g=g.inactiveColor,i=this.pager,j=this.padding;e>d&&(e=d);if(e>0)b!==u&&Sa(b,this.chart),this.nav.attr({translateX:j, +translateY:f+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:e===1?g:h}).css({cursor:e===1?"default":"pointer"}),i.attr({text:e+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e===d?"default":"pointer"}),c=-c[e-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};Na=z.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||12;b.legendSymbol=this.chart.renderer.rect(0, +a.baseline-5-c/2,a.symbolWidth,c,a.options.symbolRadius||0).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b=this.options,c=b.marker,d;d=a.symbolWidth;var e=this.chart.renderer,f=this.legendGroup,a=a.baseline-x(e.fontMetrics(a.options.itemStyle.fontSize,this.legendItem).b*0.3),g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=b.dashStyle;this.legendLine=e.path(["M",0,a,"L",d,a]).attr(g).add(f)}if(c&&c.enabled!==!1)b=c.radius,this.legendSymbol=d=e.symbol(this.symbol, +d/2-b,a-b,2*b,2*b).add(f),d.isMarker=!0}};(/Trident\/7\.0/.test(za)||La)&&cb(lb.prototype,"positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c,b)};d();setTimeout(d)});A=z.Chart=function(){this.init.apply(this,arguments)};A.prototype={callbacks:[],init:function(a,b){var c,d=a.series;a.series=null;c=y(S,a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds={h:{},v:{}}; +this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=$.length;$.push(f);bb++;d.reflow!==!1&&K(f,"load",function(){f.initReflow()});if(e)for(g in e)K(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=ea?!1:p(d.animation,!0);f.pointCount=f.colorCounter=f.symbolCounter=0;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=N[a.type||b.type||b.defaultSeriesType])||ka(17,!0);b=new b;b.init(this,a);return b},isInsidePlot:function(a, +b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.hasCartesianSeries,j=this.isDirtyBox,k=c.length,l=k,m=this.renderer,o=m.isHidden(),s=[];Sa(a,this);o&&this.cloneRenderTo();for(this.layOutTitles();l--;)if(a=c[l],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(l=k;l--;)if(a=c[l],a.options.stacking)a.isDirty=!0;n(c,function(a){a.isDirty&&a.options.legendType=== +"point"&&(f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(i&&!this.isResizing)this.maxTicks=null,n(b,function(a){a.setScale()});this.getMargins();i&&(n(b,function(a){a.isDirty&&(j=!0)}),n(b,function(a){if(a.isDirtyExtremes)a.isDirtyExtremes=!1,s.push(function(){G(a,"afterSetExtremes",q(a.eventArgs,a.getExtremes()));delete a.eventArgs});(j||g)&&a.redraw()}));j&&this.drawChartBox();n(c,function(a){a.isDirty&&a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()}); +d&&d.reset(!0);m.draw();G(this,"redraw");o&&this.cloneRenderTo(!0);n(s,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ra(b),delete this.renderToClone):(c&& +c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),J(b,{position:"absolute",top:"-9999px",display:"block"}),b.style.setProperty&&b.style.setProperty("display","block","important"),C.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options.chart,c,d,e;this.renderTo=a=b.renderTo;e="highcharts-"+xb++;if(Da(a))this.renderTo=a=C.getElementById(a);a||ka(13,!0);c=B(I(a,"data-highcharts-chart"));!isNaN(c)&&$[c]&&$[c].hasRendered&& +$[c].destroy();I(a,"data-highcharts-chart",this.index);a.innerHTML="";!b.skipClone&&!a.offsetWidth&&this.cloneRenderTo();this.getChartSize();c=this.chartWidth;d=this.chartHeight;this.container=a=Y(Ka,{className:"highcharts-container"+(b.className?" "+b.className:""),id:e},q({position:"relative",overflow:"hidden",width:c+"px",height:d+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},b.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer= +b.forExport?new sa(a,c,d,b.style,!0):new $a(a,c,d,b.style);ea&&this.renderer.create(this,a,c,d);this.renderer.chartIndex=this.index},getMargins:function(a){var b=this.spacing,c=this.margin,d=this.titleOffset;this.resetMargins();if(d&&!r(c[0]))this.plotTop=t(this.plotTop,d+this.options.title.margin+b[0]);this.legend.adjustMargins(c,b);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a= +this,b=a.axisOffset=[0,0,0,0],c=a.margin;a.hasCartesianSeries&&n(a.axes,function(a){a.getOffset()});n(ib,function(d,e){r(c[e])||(a[d]+=b[e])});a.setChartSize()},reflow:function(a){var b=this,c=b.options.chart,d=b.renderTo,e=c.width||jb(d,"width"),f=c.height||jb(d,"height"),c=a?a.target:O,d=function(){if(b.container)b.setSize(e,f,!1),b.hasUserSize=null};if(!b.hasUserSize&&e&&f&&(c===O||c===C)){if(e!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),a?b.reflowTimeout=setTimeout(d, +100):d();b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};K(O,"resize",b);K(a,"destroy",function(){X(O,"resize",b)})},setSize:function(a,b,c){var d=this,e,f,g;d.isResizing+=1;g=function(){d&&G(d,"endResize",null,function(){d.isResizing-=1})};Sa(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(r(a))d.chartWidth=e=t(0,x(a)),d.hasUserSize=!!e;if(r(b))d.chartHeight=f=t(0,x(b));(xa?kb:J)(d.container,{width:e+"px",height:f+"px"},xa); +d.setChartSize(!0);d.renderer.setSize(e,f,c);d.maxTicks=null;n(d.axes,function(a){a.isDirty=!0;a.setScale()});n(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles();d.getMargins();d.redraw(c);d.oldChartHeight=null;G(d,"resize");xa===!1?g():setTimeout(g,xa&&xa.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,j,k,l;this.plotLeft=i=x(this.plotLeft); +this.plotTop=j=x(this.plotTop);this.plotWidth=k=t(0,x(d-i-this.marginRight));this.plotHeight=l=t(0,x(e-j-this.marginBottom));this.plotSizeX=b?l:k;this.plotSizeY=b?k:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:j,width:k,height:l};d=2*U(this.plotBorderWidth/2);b=ra(t(d,h[3])/2);c=ra(t(d,h[0])/2);this.clipBox={x:b,y:c,width:U(this.plotSizeX-t(d,h[1])/2-b),height:t(0,U(this.plotSizeY-t(d,h[2])/ +2-c))};a||n(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this;n(ib,function(b,c){a[b]=p(a.margin[c],a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,j=a.backgroundColor,k=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth|| +0,o,s=this.plotLeft,p=this.plotTop,n=this.plotWidth,r=this.plotHeight,v=this.plotBox,q=this.clipRect,t=this.clipBox;o=i+(a.shadow?8:0);if(i||j)if(e)e.animate(e.crisp({width:c-o,height:d-o}));else{e={fill:j||M};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(o/2,o/2,c-o,d-o,a.borderRadius,i).attr(e).addClass("highcharts-background").add().shadow(a.shadow)}if(k)f?f.animate(v):this.plotBackground=b.rect(s,p,n,r,0).attr({fill:k}).add().shadow(a.plotShadow);if(l)h?h.animate(v): +this.plotBGImage=b.image(l,s,p,n,r).add();q?q.animate({width:t.width,height:t.height}):this.clipRect=b.clipRect(t);if(m)g?g.animate(g.crisp({x:s,y:p,width:n,height:r,strokeWidth:-m})):this.plotBorder=b.rect(s,p,n,r,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,fill:M,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;n(["inverted","angular","polar"],function(g){c=N[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g]; +for(e=d&&d.length;!f&&e--;)(c=N[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;n(b,function(a){a.linkedSeries.length=0});n(b,function(b){var d=b.options.linkedTo;if(Da(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d})},renderSeries:function(){n(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&n(b.items,function(c){var d=q(b.style,c.style),e=B(d.left)+ +a.plotLeft,f=B(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(c.html,e,f).attr({zIndex:2}).css(d).add()})},render:function(){var a=this.axes,b=this.renderer,c=this.options,d,e,f,g;this.setTitle();this.legend=new lb(this,c.legend);this.getStacks();this.getMargins(!0);this.setChartSize();d=this.plotWidth;e=this.plotHeight-=13;n(a,function(a){a.setScale()});this.getAxisMargins();f=d/this.plotWidth>1.2;g=e/this.plotHeight>1.1;if(f||g)this.maxTicks=null,n(a,function(a){(a.horiz&&f||!a.horiz&& +g)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&n(a,function(a){a.render()});if(!this.seriesGroup)this.seriesGroup=b.g("series-group").attr({zIndex:3}).add();this.renderSeries();this.renderLabels();this.showCredits(c.credits);this.hasRendered=!0},showCredits:function(a){if(a.enabled&&!this.credits)this.credits=this.renderer.text(a.text,0,0).on("click",function(){if(a.href)location.href=a.href}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position)}, +destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;G(a,"destroy");$[a.index]=u;bb--;a.renderTo.removeAttribute("data-highcharts-chart");X(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML= +"",X(d),f&&Ra(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this;return!ba&&O==O.top&&C.readyState!=="complete"||ea&&!O.canvg?(ea?Jb.push(function(){a.firstRender()},a.options.global.canvasToolsURL):C.attachEvent("onreadystatechange",function(){C.detachEvent("onreadystatechange",a.firstRender);C.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options,c=a.callback;if(a.isReadyToRender()){a.getContainer();G(a,"init");a.resetMargins();a.setChartSize(); +a.propFromSeries();a.getAxes();n(b.series||[],function(b){a.initSeries(b)});a.linkSeries();G(a,"beforeRender");if(z.Pointer)a.pointer=new Va(a,b);a.render();a.renderer.draw();c&&c.apply(a,[a]);n(a.callbacks,function(b){a.index!==u&&b.apply(a,[a])});G(a,"load");a.cloneRenderTo(!0)}},splashArray:function(a,b){var c=b[a],c=ca(c)?c:[c,c,c,c];return[p(b[a+"Top"],c[0]),p(b[a+"Right"],c[1]),p(b[a+"Bottom"],c[2]),p(b[a+"Left"],c[3])]}};var Vb=z.CenteredSeriesMixin={getCenter:function(){var a=this.options, +b=this.chart,c=2*(a.slicedOffset||0),d=b.plotWidth-2*c,b=b.plotHeight-2*c,e=a.center,e=[p(e[0],"50%"),p(e[1],"50%"),a.size||"100%",a.innerSize||0],f=H(d,b),g,h,i;for(h=0;h<4;++h)i=e[h],g=/%$/.test(i),a=h<2||h===2&&g,e[h]=(g?[d,b,f,e[2]][h]*B(i)/100:B(i))+(a?c:0);return e}},Ga=function(){};Ga.prototype={init:function(a,b,c){this.series=a;this.color=a.color;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors,this.color=this.color||b[a.colorCounter++], +a.colorCounter===b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.options.pointValKey||c.pointValKey,a=Ga.prototype.optionsToObject.call(this,a);q(this,a);this.options=this.options?q(this.options,a):a;if(d)this.y=this[d];if(this.x===u&&c)this.x=b===u?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.pointArrayMap||["y"],e=d.length,f=0,g=0;if(typeof a==="number"||a===null)b[d[0]]=a;else if(Ha(a)){if(a.length> +e){c=typeof a[0];if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];f++}for(;ga+1&&b.push(d.slice(a+1,g)),a=g):g===e-1&&b.push(d.slice(a+1,g+1))});this.segments=b},setOptions:function(a){var b= +this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=y(e,c.series,a);this.tooltipOptions=y(S.tooltip,S.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();if((c.negativeColor||c.negativeFillColor)&&!c.zones)a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,color:c.negativeColor, +fillColor:c.negativeFillColor});a.length&&r(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor});return c},getCyclic:function(a,b,c){var d=this.userOptions,e="_"+a+"Index",f=a+"Counter";b||(r(d[e])?b=d[e]:(d[e]=b=this.chart[f]%c.length,this.chart[f]+=1),b=c[b]);this[a]=b},getColor:function(){this.options.colorByPoint||this.getCyclic("color",this.options.color||aa[this.type].color,this.chart.options.colors)},getSymbol:function(){var a=this.options.marker;this.getCyclic("symbol", +a.symbol,this.chart.options.symbols);if(/^url/.test(this.symbol))a.radius=0},drawLegendSymbol:Na.drawLineMarker,setData:function(a,b,c,d){var e=this,f=e.points,g=f&&f.length||0,h,i=e.options,j=e.chart,k=null,l=e.xAxis,m=l&&!!l.categories,o=i.turboThreshold,s=this.xData,w=this.yData,r=(h=e.pointArrayMap)&&h.length,a=a||[];h=a.length;b=p(b,!0);if(d!==!1&&h&&g===h&&!e.cropped&&!e.hasGroupedData&&e.visible)n(a,function(a,b){f[b].update(a,!1,null,!1)});else{e.xIncrement=null;e.pointRange=m?1:i.pointRange; +e.colorCounter=0;n(this.parallelArrays,function(a){e[a+"Data"].length=0});if(o&&h>o){for(c=0;k===null&&ci||this.forceCrop))if(b[d- +1]m)b=[],c=[];else if(b[0]m)e=this.cropData(this.xData,this.yData,l,m),b=e.xData,c=e.yData,e=e.start,f=!0;for(i=b.length-1;i>=0;i--)d=b[i]-b[i-1],d>0&&(g===u||d=c){f=t(0,i-h);break}for(;i +d){g=i+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,j=this.hasGroupedData,k,l=[],m;if(!b&&!j)b=[],b.length=a.length,b=this.data=b;for(m=0;m0),j=this.getExtremesFromAll||this.cropped||(c[l+1]||j)>=g&&(c[l-1]||j)<=h,i&&j)if(i=k.length)for(;i--;)k[i]!==null&&(e[f++]=k[i]);else e[f++]= +k;this.dataMin=p(void 0,Pa(e));this.dataMax=p(void 0,Fa(e))},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,j=i==="between"||pa(i),k=a.threshold,l,m,o,s=Number.MAX_VALUE,a=0;a=0&&m<=e.len&&l>=0&&l<=c.len; +n.clientX=j?c.translate(q,0,0,0,1):l;n.negative=n.y<(k||0);n.category=d&&d[n.x]!==u?d[n.x]:n.x;a&&(s=H(s,P(l-o)));o=l}this.closestPointRangePx=s;this.getSegments()},setClip:function(a){var b=this.chart,c=b.renderer,d=b.inverted,e=this.clipBox,f=e||b.clipBox,g=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,f.height].join(","),h=b[g],i=b[g+"m"];if(!h){if(a)f.width=0,b[g+"m"]=i=c.clipRect(-99,d?-b.plotLeft:-b.plotTop,99,d?b.chartWidth:b.chartHeight);b[g]=h=c.clipRect(f)}a&&(h.count+=1); +if(this.options.clip!==!1)this.group.clip(a||e?h:b.clipRect),this.markerGroup.clip(i),this.sharedClipKey=g;a||(h.count-=1,h.count<=0&&g&&b[g]&&(e||(b[g]=b[g].destroy()),b[g+"m"]&&(b[g+"m"]=b[g+"m"].destroy())))},animate:function(a){var b=this.chart,c=this.options.animation,d;if(c&&!ca(c))c=aa[this.type].animation;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+99},c),this.animate=null)},afterAnimate:function(){this.setClip(); +G(this,"afterAnimate")},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,j,k,l=this.options.marker,m=this.pointAttr[""],o,n,w,r=this.markerGroup,t=p(l.enabled,this.xAxis.isRadial,this.closestPointRangePx>2*l.radius);if(l.enabled!==!1||this._hasPointMarkers)for(f=b.length;f--;)if(g=b[f],d=U(g.plotX),e=g.plotY,k=g.graphic,o=g.marker||{},n=!!g.marker,a=t&&o.enabled===u||o.enabled,w=g.isInside,a&&e!==u&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""]||m,h=a.r,i=p(o.symbol, +this.symbol),j=i.indexOf("url")===0,k)k[w?"show":"hide"](!0).animate(q({x:d-h,y:e-h},k.symbolName?{width:2*h,height:2*h}:{}));else{if(w&&(h>0||j))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h,n?o:l).attr(a).add(r)}else if(k)g.graphic=k.destroy()},convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=p(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=aa[a.type].marker?b.marker:b,d=c.states,e=d.hover, +f,g=a.color,h=a.options.negativeColor;f={stroke:g,fill:g};var i=a.points||[],j,k=[],l,m=a.pointAttrToOptions;l=a.hasPointSpecificOptions;var o=c.lineColor,p=c.fillColor;j=b.turboThreshold;var w=a.zones,t=a.zoneAxis||"y",u;b.marker?(e.radius=e.radius||c.radius+e.radiusPlus,e.lineWidth=e.lineWidth||c.lineWidth+e.lineWidthPlus):(e.color=e.color||na(e.color||g).brighten(e.brightness).get(),e.negativeColor=e.negativeColor||na(e.negativeColor||h).brighten(e.brightness).get());k[""]=a.convertAttribs(c,f); +n(["hover","select"],function(b){k[b]=a.convertAttribs(d[b],k[""])});a.pointAttr=k;g=i.length;if(!j||g=f.value;)f=w[++l];j.color=j.fillColor=f.color}l=b.colorByPoint||j.color;if(j.options)for(u in m)r(c[m[u]])&&(l=!0);if(l){c=c||{};l=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker)f.color=f.color||!j.options.color&&e[j.negative&&h?"negativeColor":"color"]||na(j.color).brighten(f.brightness|| +e.brightness).get();f={color:j.color};if(!p)f.fillColor=j.color;if(!o)f.lineColor=j.color;l[""]=a.convertAttribs(q(f,c),k[""]);l.hover=a.convertAttribs(d.hover,k.hover,l[""]);l.select=a.convertAttribs(d.select,k.select,l[""])}else l=k;j.pointAttr=l}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(za),d,e,f=a.data||[],g,h,i;G(a,"destroy");X(a);n(a.axisTypes||[],function(b){if(i=a[b])ia(i.series,a),i.isDirty=i.forceRedraw=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(e=f.length;e--;)(g= +f[e])&&g.destroy&&g.destroy();a.points=null;clearTimeout(a.animationTimeout);n("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),function(b){a[b]&&(d=c&&b==="group"?"hide":"destroy",a[b][d]())});if(b.hoverSeries===a)b.hoverSeries=null;ia(b.series,a);for(h in a)delete a[h]},getSegmentPath:function(a){var b=this,c=[],d=b.options.step;n(a,function(e,f){var g=e.plotX,h=e.plotY,i;b.getPointSpline?c.push.apply(c,b.getPointSpline(a,e,f)):(c.push(f?"L":"M"), +d&&f&&(i=a[f-1],d==="right"?c.push(i.plotX,h):d==="center"?c.push((i.plotX+g)/2,i.plotY,(i.plotX+g)/2,h):c.push(g,i.plotY)),c.push(e.plotX,e.plotY))});return c},getGraphPath:function(){var a=this,b=[],c,d=[];n(a.segments,function(e){c=a.getSegmentPath(e);e.length>1?b=b.concat(c):d.push(e[0])});a.singlePoints=d;return a.graphPath=b},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color,b.dashStyle]],d=b.lineWidth,e=b.linecap!=="square",f=this.getGraphPath(),g=this.fillGraph&& +this.color||M;n(this.zones,function(d,e){c.push(["colorGraph"+e,d.color||a.color,d.dashStyle||b.dashStyle])});n(c,function(c,i){var j=c[0],k=a[j];if(k)db(k),k.animate({d:f});else if((d||g)&&f.length)k={stroke:c[1],"stroke-width":d,fill:g,zIndex:1},c[2]?k.dashstyle=c[2]:e&&(k["stroke-linecap"]=k["stroke-linejoin"]="round"),a[j]=a.chart.renderer.path(f).attr(k).add(a.group).shadow(!i&&b.shadow)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],h,i=this.graph, +j=this.area,k=t(b.chartWidth,b.chartHeight),l=this[(this.zoneAxis||"y")+"Axis"],m=l.reversed,o=l.horiz,s=!1;if(d.length&&(i||j))i.hide(),j&&j.hide(),n(d,function(d,i){e=p(f,m?o?b.plotWidth:0:o?0:l.toPixels(l.min));f=x(l.toPixels(p(d.value,l.max),!0));s&&(e=f=l.toPixels(l.max));if(l.isXAxis){if(h={x:m?f:e,y:0,width:Math.abs(e-f),height:k},!o)h.x=b.plotHeight-h.x}else if(h={x:0,y:m?e:f,width:k,height:Math.abs(e-f)},o)h.y=b.plotWidth-h.y;b.inverted&&c.isVML&&(h=l.isXAxis?{x:0,y:m?e:f,height:h.width, +width:b.chartWidth}:{x:h.y-b.plotLeft-b.spacingBox.x,y:0,width:h.height,height:b.chartHeight});g[i]?g[i].animate(h):(g[i]=c.clipRect(h),a["colorGraph"+i].clip(g[i]),j&&a["colorArea"+i].clip(g[i]));s=d.value>l.max}),this.clips=g},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)K(c,"resize",a),K(b,"destroy",function(){X(c,"resize",a)}),a(),b.invertGroups=a},plotGroup:function(a, +b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({visibility:c,zIndex:d||0.1}).add(e));f[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;if(a.inverted)b=c,c=this.xAxis;return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=(c=d.animation)&&!!a.animate&&b.renderer.isSVG&&p(c.duration,500)||0,f=a.visible?"visible":"hidden",g= +d.zIndex,h=a.hasRendered,i=b.seriesGroup;c=a.plotGroup("group","series",f,g,i);a.markerGroup=a.plotGroup("markerGroup","markers",f,g,i);e&&a.animate(!0);a.getAttribs();c.inverted=a.isCartesian?b.inverted:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());n(a.points,function(a){a.redraw&&a.redraw()});a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&a.options.enableMouseTracking!==!1&&a.drawTracker();b.inverted&&a.invertGroups();d.clip!==!1&&!a.sharedClipKey&&!h&&c.clip(b.clipRect); +e&&a.animate();if(!h)e?a.animationTimeout=setTimeout(function(){a.afterAnimate()},e):a.afterAnimate();a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:p(d&&d.left,a.plotLeft),translateY:p(e&&e.top,a.plotTop)}));this.translate();this.render();b&&(delete this.kdTree,G(this,"updatedData"))},kdDimensions:1,kdTree:null,kdAxisArray:["plotX", +"plotY"],kdComparer:"distX",searchPoint:function(a){var b=this.xAxis,c=this.yAxis,d=this.chart.inverted;a.plotX=d?b.len-a.chartY+b.pos:a.chartX-b.pos;a.plotY=d?c.len-a.chartX+c.pos:a.chartY-c.pos;return this.searchKDTree(a)},buildKDTree:function(){function a(b,d,g){var h,i;if(i=b&&b.length)return h=c.kdAxisArray[d%g],b.sort(function(a,b){return a[h]-b[h]}),i=Math.floor(i/2),{point:b[i],left:a(b.slice(0,i),d+1,g),right:a(b.slice(i+1),d+1,g)}}function b(){c.kdTree=a(c.points.slice(),d,d)}var c=this, +d=c.kdDimensions;delete c.kdTree;c.options.kdSync?b():setTimeout(b)},searchKDTree:function(a){function b(a,h,i,j){var k=h.point,l=c.kdAxisArray[i%j],m,o=k;m=r(a[e])&&r(k[e])?Math.pow(a[e]-k[e],2):null;var n=r(a[f])&&r(k[f])?Math.pow(a[f]-k[f],2):null,p=(m||0)+(n||0);m={distX:r(m)?Math.sqrt(m):Number.MAX_VALUE,distY:r(n)?Math.sqrt(n):Number.MAX_VALUE,distR:r(p)?Math.sqrt(p):Number.MAX_VALUE};k.dist=m;l=a[l]-k[l];m=l<0?"left":"right";h[m]&&(m=b(a,h[m],i+1,j),o=m.dist[d]g;)h--;this.updateParallelArrays(d,"splice",h,0,0);this.updateParallelArrays(d,h);if(j&&d.name)j[g]=d.name;l.splice(h, +0,a);m&&(this.data.splice(h,0,null),this.processData());e.legendType==="point"&&this.generatePoints();c&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(d,"shift"),l.shift()));this.isDirtyData=this.isDirty=!0;b&&(this.getAttribs(),i.redraw())},removePoint:function(a,b,c){var d=this,e=d.data,f=e[a],g=d.points,h=d.chart,i=function(){e.length===g.length&&g.splice(a,1);e.splice(a,1);d.options.data.splice(a,1);d.updateParallelArrays(f||{series:d},"splice",a,1);f&&f.destroy();d.isDirty= +!0;d.isDirtyData=!0;b&&h.redraw()};Sa(c,h);b=p(b,!0);f?f.firePointEvent("remove",null,i):i()},remove:function(a,b){var c=this,d=c.chart,a=p(a,!0);if(!c.isRemoving)c.isRemoving=!0,G(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();a&&d.redraw(b)});c.isRemoving=!1},update:function(a,b){var c=this,d=this.chart,e=this.userOptions,f=this.type,g=N[f].prototype,h=["group","markerGroup","dataLabelsGroup"],i;if(a.type&&a.type!==f||a.zIndex!==void 0)h.length=0;n(h,function(a){h[a]= +c[a];delete c[a]});a=y(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);for(i in g)this[i]=u;q(this,N[a.type||f].prototype);n(h,function(a){c[a]=h[a]});this.init(d,a);d.linkSeries();p(b,!0)&&d.redraw(!1)}});q(ta.prototype,{update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=y(this.userOptions,a);this.destroy(!0);this._addedPlotLB=u;this.init(c,q(a,{events:u}));c.isDirtyBox=!0;p(b,!0)&&c.redraw()},remove:function(a){for(var b= +this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);ia(b.axes,this);ia(b[c],this);b.options[c].splice(this.options.index,1);n(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;p(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});var va=ja(R);N.line=va;aa.area=y(Q,{threshold:0});var oa=ja(R,{type:"area",getSegments:function(){var a=this,b=[],c=[],d=[],e=this.xAxis,f=this.yAxis,g= +f.stacks[this.stackKey],h={},i,j,k=this.points,l=this.options.connectNulls,m,o;if(this.options.stacking&&!this.cropped){for(m=0;m=0;d--)g=p(a[d].yBottom,f),da&&i>e?(i=t(a,e),k=2*e-i):ig&&k>e?(k=t(g,e),i=2*e-k):kg?d-g:f-(e.translate(c.y,0,1,0,1)<=f?g:0)));c.barX=n;c.pointWidth=i;c.tooltipPos=b.inverted?[e.len+e.pos-b.plotLeft-h,a.xAxis.len-n-r/2]:[n+r/2,h+e.pos-b.plotTop];r=x(n+r)+l;n=x(n)+l;r-=n;d=P(q)<0.5;u=H(x(q+u)+m,9E4);q=x(q)+m;u-=q;d&&(q-=1,u+=1);c.shapeType="rect";c.shapeArgs={x:n,y:q,width:r,height:u}})},getSymbol:ma,drawLegendSymbol:Na.drawRectangle,drawGraph:ma,drawPoints:function(){var a= +this,b=this.chart,c=a.options,d=b.renderer,e=c.animationLimit||250,f,g;n(a.points,function(h){var i=h.plotY,j=h.graphic;if(i!==u&&!isNaN(i)&&h.y!==null)f=h.shapeArgs,i=r(a.borderWidth)?{"stroke-width":a.borderWidth}:{},g=h.pointAttr[h.selected?"select":""]||a.pointAttr[""],j?(db(j),j.attr(i)[b.pointCount {series.name}
            ',pointFormat:"x: {point.x}
            y: {point.y}
            "}});oa=ja(R,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,kdDimensions:2,kdComparer:"distR",drawGraph:function(){this.options.lineWidth&&R.prototype.drawGraph.call(this)}}); +N.scatter=oa;aa.pie=y(Q,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});Q={type:"pie",isCartesian:!1,pointClass:ja(Ga,{init:function(){Ga.prototype.init.apply(this,arguments);var a=this,b;q(a,{visible:a.visible!== +!1,name:p(a.name,"Slice")});b=function(b){a.slice(b.type==="select")};K(a,"select",b);K(a,"unselect",b);return a},setVisible:function(a){var b=this,c=b.series,d=c.chart,e=!c.isDirty&&c.options.ignoreHiddenPoint;b.visible=b.options.visible=a=a===u?!b.visible:a;c.options.data[Ma(b,c.data)]=b.options;n(["graphic","dataLabel","connector","shadowGroup"],function(c){if(b[c])b[c][a?"show":"hide"](!0)});b.legendItem&&(d.hasRendered&&(c.updateTotals(),d.legend.clearItems(),e||d.legend.render()),d.legend.colorizeItem(b, +a));if(e)c.isDirty=!0,d.redraw()},slice:function(a,b,c){var d=this.series;Sa(c,d.chart);p(b,!0);this.sliced=this.options.sliced=a=r(a)?a:!this.sliced;d.options.data[Ma(this,d.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var b=this.shapeArgs,c=this.series.chart;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.plotLeft+b.x,c.plotTop+b.y,b.r+a,b.r+a,{innerR:this.shapeArgs.r, +start:b.start,end:b.end})}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:ma,animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)n(c,function(a){var c=a.graphic,a=a.shapeArgs;c&&(c.attr({r:b.center[3]/2,start:d,end:d}),c.animate({r:a.r,start:a.start,end:a.end},b.options.animation))}),b.animate=null},setData:function(a,b,c,d){R.prototype.setData.call(this, +a,!1,c,d);this.processData();this.generatePoints();p(b,!0)&&this.chart.redraw(c)},updateTotals:function(){var a,b=0,c,d,e,f=this.options.ignoreHiddenPoint;c=this.points;d=c.length;for(a=0;a0&&(e.visible||!f)?e.y/b*100:0,e.total=b},generatePoints:function(){R.prototype.generatePoints.call(this);this.updateTotals()},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset, +e=d+c.borderWidth,f,g,h,i=c.startAngle||0,j=this.startAngleRad=la/180*(i-90),i=(this.endAngleRad=la/180*(p(c.endAngle,i+360)-90))-j,k=this.points,l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,o=k.length,n;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=V.asin(H((b-a[1])/(a[2]/2+l),1));return a[0]+(c?-1:1)*W(h)*(a[2]/2+l)};for(m=0;m1.5*la?h-=2*la:h<-la/2&&(h+=2*la);n.slicedTranslation={translateX:x(W(h)*d),translateY:x(Z(h)*d)};f=W(h)*a[2]/2;g=Z(h)*a[2]/2;n.tooltipPos=[a[0]+f*0.7,a[1]+g*0.7];n.half=h<-la/2||h>la/2?1:0;n.angle=h;e=H(e,l/2);n.labelPos=[a[0]+f+W(h)*l,a[1]+g+Z(h)*l,a[0]+f+W(h)*e,a[1]+g+Z(h)*e,a[0]+f,a[1]+g,l<0?"center":n.half?"right":"left",h]}},drawGraph:null,drawPoints:function(){var a=this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group); +n(a.points,function(h){d=h.graphic;g=h.shapeArgs;f=h.shadowGroup;if(e&&!f)f=h.shadowGroup=b.g("shadow").add(a.shadowGroup);c=h.sliced?h.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);d?d.animate(q(g,c)):h.graphic=d=b[h.shapeType](g).setRadialReference(a.center).attr(h.pointAttr[h.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(c).add(a.group).shadow(e,f);h.visible!==void 0&&h.setVisible(h.visible)})},searchPoint:ma,sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!== +void 0&&(d.angle-a.angle)*b})},drawLegendSymbol:Na.drawRectangle,getCenter:Vb.getCenter,getSymbol:ma};Q=ja(R,Q);N.pie=Q;R.prototype.drawDataLabels=function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,e=a.points,f,g,h=a.hasRendered||0,i,j,k=a.chart.renderer;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(d),j=a.plotGroup("dataLabelsGroup","data-labels",d.defer?"hidden":"visible",d.zIndex||6),p(d.defer,!0)&&(j.attr({opacity:+h}),h||K(a,"afterAnimate",function(){a.visible&& +j.show();j[b.animation?"animate":"attr"]({opacity:1},{duration:200})})),g=d,n(e,function(e){var h,o=e.dataLabel,n,t,x=e.connector,z=!0,v,C={};f=e.dlOptions||e.options&&e.options.dataLabels;h=p(f&&f.enabled,g.enabled);if(o&&!h)e.dataLabel=o.destroy();else if(h){d=y(g,f);v=d.style;h=d.rotation;n=e.getLabelConfig();i=d.format?Ja(d.format,n):d.formatter.call(n,d);v.color=p(d.color,v.color,a.color,"black");if(o)if(r(i))o.attr({text:i}),z=!1;else{if(e.dataLabel=o=o.destroy(),x)e.connector=x.destroy()}else if(r(i)){o= +{fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:h,padding:d.padding,zIndex:1};if(v.color==="contrast")C.color=d.inside||d.distance<0||b.stacking?k.getContrast(e.color||a.color):"#000000";if(c)C.cursor=c;for(t in o)o[t]===u&&delete o[t];o=e.dataLabel=k[h?"text":"label"](i,0,-999,d.shape,null,null,d.useHTML).attr(o).css(q(v,C)).add(j).shadow(d.shadow)}o&&a.alignDataLabel(e,o,d,null,z)}})};R.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart, +g=f.inverted,h=p(a.plotX,-999),i=p(a.plotY,-999),j=b.getBBox(),k=f.renderer.fontMetrics(c.style.fontSize).b,l=this.visible&&(a.series.forceDL||f.isInsidePlot(h,x(i),g)||d&&f.isInsidePlot(h,g?d.x+1:d.y+d.height-1,g));if(l)d=q({x:g?f.plotWidth-i:h,y:x(g?f.plotHeight-h:i),width:0,height:0},d),q(c,{width:j.width,height:j.height}),c.rotation?(a=f.renderer.rotCorr(k,c.rotation),b[e?"attr":"animate"]({x:d.x+c.x+d.width/2+a.x,y:d.y+c.y+d.height/2}).attr({align:c.align})):(b.align(c,null,d),g=b.alignAttr, +p(c.overflow,"justify")==="justify"?this.justifyDataLabel(b,c,g,j,d,e):p(c.crop,!0)&&(l=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+j.width,g.y+j.height)),c.shape&&b.attr({anchorX:a.plotX,anchorY:a.plotY}));if(!l)b.attr({y:-999}),b.placed=!1};R.prototype.justifyDataLabel=function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,j,k,l=a.box?0:a.padding||0;j=c.x+l;if(j<0)h==="right"?b.align="left":b.x=-j,k=!0;j=c.x+d.width-l;if(j>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-j,k=!0; +j=c.y+l;if(j<0)i==="bottom"?b.verticalAlign="top":b.y=-j,k=!0;j=c.y+d.height-l;if(j>g.plotHeight)i==="top"?b.verticalAlign="bottom":b.y=g.plotHeight-j,k=!0;if(k)a.placed=!f,a.align(b,null,e)};if(N.pie)N.pie.prototype.drawDataLabels=function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=p(e.connectorPadding,10),g=p(e.connectorWidth,1),h=d.plotWidth,i=d.plotHeight,j,k,l=p(e.softConnector,!0),m=e.distance,o=a.center,q=o[2]/2,r=o[1],u=m>0,z,v,y,C=[[],[]],B,A,F,J,E,G=[0,0,0,0],N=function(a, +b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){R.prototype.drawDataLabels.apply(a);n(b,function(a){a.dataLabel&&a.visible&&C[a.half].push(a)});for(J=2;J--;){var K=[],O=[],I=C[J],M=I.length,L;if(M){a.sortByAngle(I,J-0.5);for(E=b=0;!b&&I[E];)b=I[E]&&I[E].dataLabel&&(I[E].dataLabel.getBBox().height||21),E++;if(m>0){v=H(r+q+m,d.plotHeight);for(E=t(0,r-q-m);E<=v;E+=b)K.push(E);v=K.length;if(M>v){c=[].concat(I);c.sort(N);for(E=M;E--;)c[E].rank=E;for(E=M;E--;)I[E].rank>=v&&I.splice(E,1); +M=I.length}for(E=0;E0){if(v=O.pop(),L=v.i,A=v.y,c>A&&K[L+1]!==null||ch-f&&(G[1]=t(x(B+v-h+f),G[1])),A-b/2<0?G[0]=t(x(-A+b/2),G[0]):A+b/2>i&&(G[2]=t(x(A+b/2-i),G[2]))}}}if(Fa(G)===0||this.verifyDataLabelOverflow(G))this.placeDataLabels(),u&&g&&n(this.points,function(b){j=b.connector;y=b.labelPos;if((z=b.dataLabel)&&z._pos)F=z._attr.visibility,B=z.connX,A=z.connY,k=l?["M",B+(y[6]==="left"?5:-5),A, +"C",B,A,2*y[2]-y[4],2*y[3]-y[5],y[2],y[3],"L",y[4],y[5]]:["M",B+(y[6]==="left"?5:-5),A,"L",y[2],y[3],"L",y[4],y[5]],j?(j.animate({d:k}),j.attr("visibility",F)):b.connector=j=a.chart.renderer.path(k).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:F}).add(a.dataLabelsGroup);else if(j)b.connector=j.destroy()})}},N.pie.prototype.placeDataLabels=function(){n(this.points,function(a){var a=a.dataLabel,b;if(a)(b=a._pos)?(a.attr(a._attr),a[a.moved?"animate":"attr"](b),a.moved= +!0):a&&a.attr({y:-999})})},N.pie.prototype.alignDataLabel=ma,N.pie.prototype.verifyDataLabelOverflow=function(a){var b=this.center,c=this.options,d=c.center,e=c=c.minSize||80,f;d[0]!==null?e=t(b[2]-t(a[1],a[3]),c):(e=t(b[2]-a[1]-a[3],c),b[0]+=(a[3]-a[1])/2);d[1]!==null?e=t(H(e,b[2]-t(a[0],a[2])),c):(e=t(H(e,b[2]-a[0]-a[2]),c),b[1]+=(a[0]-a[2])/2);ep(this.translatedThreshold,g.yAxis.len),j=p(c.inside,!!this.options.stacking);if(h&&(d=y(h),f&&(d={x:g.yAxis.len-d.y-d.height,y:g.xAxis.len-d.x-d.width,width:d.height,height:d.width}),!j))f?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0);c.align=p(c.align,!f||j?"center":i?"right":"left");c.verticalAlign=p(c.verticalAlign,f||j?"middle":i?"top": +"bottom");R.prototype.alignDataLabel.call(this,a,b,c,d,e)};(function(a){var b=a.Chart,c=a.each,d=HighchartsAdapter.addEvent;b.prototype.callbacks.push(function(a){function b(){var d=[];c(a.series,function(a){var b=a.options.dataLabels;(b.enabled||a._hasPointLabels)&&!b.allowOverlap&&a.visible&&c(a.points,function(a){if(a.dataLabel)a.dataLabel.labelrank=a.labelrank,d.push(a.dataLabel)})});a.hideOverlappingLabels(d)}b();d(a,"redraw",b)});b.prototype.hideOverlappingLabels=function(a){var b=a.length, +c,d,i,j;for(d=0;di.alignAttr.x+i.width||j.alignAttr.x+j.widthi.alignAttr.y+i.height||j.alignAttr.y+j.heightd;if(h.series.length&&(i||l>H(k.dataMin,k.min))&&(!i||j=c?(d-c)%a:a-(c-d)%a;return g.inclusive?a<=b:a=this.closestPointRange)){for(b=0;b=b)break;else if(c.isInBreak(a,b)){e-=b-a.from;break}return e};this.lin2val=function(b){var e,a;for(a=0;a=b)break;else e.tok;)i-=h;for(;ib.to?o(d,"pointBreak",{point:c,brk:b}):o(d,"pointInBreak",{point:c,brk:b})}})})(Highcharts); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/hcharts/modules/broken-axis.src.js b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/modules/broken-axis.src.js new file mode 100644 index 0000000..07e147c --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/modules/broken-axis.src.js @@ -0,0 +1,304 @@ +/** + * Highcharts JS v4.1.3 (2015-02-27) + * Highcharts Broken Axis module + * + * Author: Stephane Vanraes, Torstein Honsi + * License: www.highcharts.com/license + */ + +/*global HighchartsAdapter*/ +(function (H) { + + "use strict"; + + var pick = H.pick, + wrap = H.wrap, + extend = H.extend, + fireEvent = HighchartsAdapter.fireEvent, + Axis = H.Axis, + Series = H.Series; + + function stripArguments() { + return Array.prototype.slice.call(arguments, 1); + } + + extend(Axis.prototype, { + isInBreak: function (brk, val) { + var repeat = brk.repeat || Infinity, + from = brk.from, + length = brk.to - brk.from, + test = (val >= from ? (val - from) % repeat : repeat - ((from - val) % repeat)); + + if (!brk.inclusive) { + return (test < length && test !== 0); + } else { + return (test <= length); + } + }, + + isInAnyBreak: function (val, testKeep) { + // Sanity Check + if (!this.options.breaks) { return false; } + + var breaks = this.options.breaks, + i = breaks.length, + inbrk = false, + keep = false; + + + while (i--) { + if (this.isInBreak(breaks[i], val)) { + inbrk = true; + if (!keep) { + keep = pick(breaks[i].showPoints, this.isXAxis ? false : true); + } + } + } + + if (inbrk && testKeep) { + return inbrk && !keep; + } else { + return inbrk; + } + } + }); + + wrap(Axis.prototype, 'setTickPositions', function (proceed) { + proceed.apply(this, Array.prototype.slice.call(arguments, 1)); + + if (this.options.breaks) { + var axis = this, + tickPositions = this.tickPositions, + info = this.tickPositions.info, + newPositions = [], + i; + + if (info && info.totalRange >= axis.closestPointRange) { + return; + } + + for (i = 0; i < tickPositions.length; i++) { + if (!axis.isInAnyBreak(tickPositions[i])) { + newPositions.push(tickPositions[i]); + } + } + + this.tickPositions = newPositions; + this.tickPositions.info = info; + } + }); + + wrap(Axis.prototype, 'init', function (proceed, chart, userOptions) { + // Force Axis to be not-ordinal when breaks are defined + if (userOptions.breaks && userOptions.breaks.length) { + userOptions.ordinal = false; + } + + proceed.call(this, chart, userOptions); + + if (this.options.breaks) { + + var axis = this; + + axis.doPostTranslate = true; + + this.val2lin = function (val) { + var nval = val, + brk, + i; + + for (i = 0; i < axis.breakArray.length; i++) { + brk = axis.breakArray[i]; + if (brk.to <= val) { + nval -= (brk.len); + } else if (brk.from >= val) { + break; + } else if (axis.isInBreak(brk, val)) { + nval -= (val - brk.from); + break; + } + } + + return nval; + }; + + this.lin2val = function (val) { + var nval = val, + brk, + i; + + for (i = 0; i < axis.breakArray.length; i++) { + brk = axis.breakArray[i]; + if (brk.from >= nval) { + break; + } else if (brk.to < nval) { + nval += (brk.to - brk.from); + } else if (axis.isInBreak(brk, nval)) { + nval += (brk.to - brk.from); + } + } + + return nval; + }; + + this.setExtremes = function (newMin, newMax, redraw, animation, eventArguments) { + // If trying to set extremes inside a break, extend it to before and after the break ( #3857 ) + while (this.isInAnyBreak(newMin)) { + newMin -= this.closestPointRange; + } + while (this.isInAnyBreak(newMax)) { + newMax -= this.closestPointRange; + } + Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments); + }; + + this.setAxisTranslation = function (saveOld) { + Axis.prototype.setAxisTranslation.call(this, saveOld); + + var breaks = axis.options.breaks, + breakArrayT = [], // Temporary one + breakArray = [], + length = 0, + inBrk, + repeat, + brk, + min = axis.userMin || axis.min, + max = axis.userMax || axis.max, + start, + i, + j; + + // Min & Max Check + for (i in breaks) { + brk = breaks[i]; + if (axis.isInBreak(brk, min)) { + min += (brk.to % brk.repeat) - (min % brk.repeat); + } + if (axis.isInBreak(brk, max)) { + max -= (max % brk.repeat) - (brk.from % brk.repeat); + } + } + + // Construct an array holding all breaks in the axis + for (i in breaks) { + brk = breaks[i]; + start = brk.from; + repeat = brk.repeat || Infinity; + + while (start - repeat > min) { + start -= repeat; + } + while (start < min) { + start += repeat; + } + + for (j = start; j < max; j += repeat) { + breakArrayT.push({ + value: j, + move: 'in' + }); + breakArrayT.push({ + value: j + (brk.to - brk.from), + move: 'out', + size: brk.breakSize + }); + } + } + + breakArrayT.sort(function (a, b) { + if (a.value === b.value) { + return (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1); + } else { + return a.value - b.value; + } + }); + + // Simplify the breaks + inBrk = 0; + start = min; + + for (i in breakArrayT) { + brk = breakArrayT[i]; + inBrk += (brk.move === 'in' ? 1 : -1); + + if (inBrk === 1 && brk.move === 'in') { + start = brk.value; + } + if (inBrk === 0) { + breakArray.push({ + from: start, + to: brk.value, + len: brk.value - start - (brk.size || 0) + }); + length += brk.value - start - (brk.size || 0); + } + } + + axis.breakArray = breakArray; + + fireEvent(axis, 'afterBreaks'); + + axis.transA *= ((max - axis.min) / (max - min - length)); + + axis.min = min; + axis.max = max; + + }; + } + }); + + wrap(Series.prototype, 'generatePoints', function (proceed) { + + proceed.apply(this, stripArguments(arguments)); + + var series = this, + xAxis = series.xAxis, + yAxis = series.yAxis, + points = series.points, + point, + i = points.length; + + + if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) { + while (i--) { + point = points[i]; + + if (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true)) { + points.splice(i, 1); + this.data[i].destroyElements(); // removes the graphics for this point if they exist + } + } + } + + }); + + wrap(H.seriesTypes.column.prototype, 'drawPoints', function (proceed) { + proceed.apply(this); + + var series = this, + points = series.points, + yAxis = series.yAxis, + breaks = yAxis.breakArray || [], + point, + brk, + i, + j, + y; + + for (i = 0; i < points.length; i++) { + point = points[i]; + y = point.stackY || point.y; + for (j = 0; j < breaks.length; j++) { + brk = breaks[j]; + if (y < brk.from) { + break; + } else if (y > brk.to) { + fireEvent(yAxis, 'pointBreak', {point: point, brk: brk}); + } else { + fireEvent(yAxis, 'pointInBreak', {point: point, brk: brk}); + } + } + } + + }); +}(Highcharts)); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/hcharts/modules/canvas-tools.js b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/modules/canvas-tools.js new file mode 100644 index 0000000..82120a8 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/hcharts/modules/canvas-tools.js @@ -0,0 +1,133 @@ +/* + A class to parse color values + @author Stoyan Stefanov + @link http://www.phpied.com/rgb-color-parser-in-javascript/ + Use it if you like it + + canvg.js - Javascript SVG parser and renderer on Canvas + MIT Licensed + Gabe Lerner (gabelerner@gmail.com) + http://code.google.com/p/canvg/ + + Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/ + + Highcharts JS v4.1.3 (2015-02-27) + CanVGRenderer Extension module + + (c) 2011-2012 Torstein Honsi, Erik Olsson + + License: www.highcharts.com/license +*/ +function RGBColor(m){this.ok=!1;m.charAt(0)=="#"&&(m=m.substr(1,6));var m=m.replace(/ /g,""),m=m.toLowerCase(),a={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"},c;for(c in a)m==c&&(m=a[c]);var d=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(b){return[parseInt(b[1]),parseInt(b[2]),parseInt(b[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/, +example:["#00ff00","336699"],process:function(b){return[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(b){return[parseInt(b[1]+b[1],16),parseInt(b[2]+b[2],16),parseInt(b[3]+b[3],16)]}}];for(c=0;c255?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 b=this.r.toString(16),a=this.g.toString(16),d=this.b.toString(16);b.length==1&&(b="0"+b);a.length==1&&(a="0"+a);d.length==1&&(d="0"+d);return"#"+b+a+d};this.getHelpXML=function(){for(var b=[],k=0;k "+o.toRGB()+" -> "+o.toHex());l.appendChild(n);l.appendChild(q);c.appendChild(l)}catch(p){}return c}} +if(!window.console)window.console={},window.console.log=function(){},window.console.dir=function(){};if(!Array.prototype.indexOf)Array.prototype.indexOf=function(m){for(var a=0;a]*>/,""),d=new ActiveXObject("Microsoft.XMLDOM");d.async="false";d.loadXML(a);return d}};a.Property=function(c,d){this.name=c;this.value=d;this.hasValue=function(){return this.value!=null&&this.value!==""};this.numValue=function(){if(!this.hasValue())return 0;var b=parseFloat(this.value);(this.value+"").match(/%$/)&& +(b/=100);return b};this.valueOrDefault=function(b){return this.hasValue()?this.value:b};this.numValueOrDefault=function(b){return this.hasValue()?this.numValue():b};var b=this;this.Color={addOpacity:function(d){var c=b.value;if(d!=null&&d!=""){var f=new RGBColor(b.value);f.ok&&(c="rgba("+f.r+", "+f.g+", "+f.b+", "+d+")")}return new a.Property(b.name,c)}};this.Definition={getDefinition:function(){var d=b.value.replace(/^(url\()?#([^\)]+)\)?$/,"$2");return a.Definitions[d]},isUrl:function(){return b.value.indexOf("url(")== +0},getFillStyle:function(b){var d=this.getDefinition();return d!=null&&d.createGradient?d.createGradient(a.ctx,b):d!=null&&d.createPattern?d.createPattern(a.ctx,b):null}};this.Length={DPI:function(){return 96},EM:function(b){var d=12,c=new a.Property("fontSize",a.Font.Parse(a.ctx.font).fontSize);c.hasValue()&&(d=c.Length.toPixels(b));return d},toPixels:function(d){if(!b.hasValue())return 0;var c=b.value+"";return c.match(/em$/)?b.numValue()*this.EM(d):c.match(/ex$/)?b.numValue()*this.EM(d)/2:c.match(/px$/)? +b.numValue():c.match(/pt$/)?b.numValue()*1.25:c.match(/pc$/)?b.numValue()*15:c.match(/cm$/)?b.numValue()*this.DPI(d)/2.54:c.match(/mm$/)?b.numValue()*this.DPI(d)/25.4:c.match(/in$/)?b.numValue()*this.DPI(d):c.match(/%$/)?b.numValue()*a.ViewPort.ComputeSize(d):b.numValue()}};this.Time={toMilliseconds:function(){if(!b.hasValue())return 0;var a=b.value+"";if(a.match(/s$/))return b.numValue()*1E3;a.match(/ms$/);return b.numValue()}};this.Angle={toRadians:function(){if(!b.hasValue())return 0;var a=b.value+ +"";return a.match(/deg$/)?b.numValue()*(Math.PI/180):a.match(/grad$/)?b.numValue()*(Math.PI/200):a.match(/rad$/)?b.numValue():b.numValue()*(Math.PI/180)}}};a.Font=new function(){this.Styles=["normal","italic","oblique","inherit"];this.Variants=["normal","small-caps","inherit"];this.Weights="normal,bold,bolder,lighter,100,200,300,400,500,600,700,800,900,inherit".split(",");this.CreateFont=function(d,b,c,e,f,g){g=g!=null?this.Parse(g):this.CreateFont("","","","","",a.ctx.font);return{fontFamily:f|| +g.fontFamily,fontSize:e||g.fontSize,fontStyle:d||g.fontStyle,fontWeight:c||g.fontWeight,fontVariant:b||g.fontVariant,toString:function(){return[this.fontStyle,this.fontVariant,this.fontWeight,this.fontSize,this.fontFamily].join(" ")}}};var c=this;this.Parse=function(d){for(var b={},d=a.trim(a.compressSpaces(d||"")).split(" "),k=!1,e=!1,f=!1,g=!1,j="",h=0;hthis.x2)this.x2=b}if(a!=null){if(isNaN(this.y1)||isNaN(this.y2))this.y2=this.y1=a;if(athis.y2)this.y2=a}};this.addX=function(b){this.addPoint(b,null)};this.addY=function(b){this.addPoint(null,b)};this.addBoundingBox=function(b){this.addPoint(b.x1,b.y1);this.addPoint(b.x2,b.y2)};this.addQuadraticCurve=function(b,a,d,c,k,l){d=b+2/3*(d-b);c=a+2/3*(c- +a);this.addBezierCurve(b,a,d,d+1/3*(k-b),c,c+1/3*(l-a),k,l)};this.addBezierCurve=function(b,a,d,c,k,l,o,n){var q=[b,a],p=[d,c],t=[k,l],m=[o,n];this.addPoint(q[0],q[1]);this.addPoint(m[0],m[1]);for(i=0;i<=1;i++)b=function(b){return Math.pow(1-b,3)*q[i]+3*Math.pow(1-b,2)*b*p[i]+3*(1-b)*Math.pow(b,2)*t[i]+Math.pow(b,3)*m[i]},a=6*q[i]-12*p[i]+6*t[i],d=-3*q[i]+9*p[i]-9*t[i]+3*m[i],c=3*p[i]-3*q[i],d==0?a!=0&&(a=-c/a,0=this.tokens.length-1};this.isCommandOrEnd=function(){return this.isEnd()? +!0:this.tokens[this.i+1].match(/^[A-Za-z]$/)!=null};this.isRelativeCommand=function(){return this.command==this.command.toLowerCase()};this.getToken=function(){this.i+=1;return this.tokens[this.i]};this.getScalar=function(){return parseFloat(this.getToken())};this.nextCommand=function(){this.previousCommand=this.command;this.command=this.getToken()};this.getPoint=function(){return this.makeAbsolute(new a.Point(this.getScalar(),this.getScalar()))};this.getAsControlPoint=function(){var b=this.getPoint(); +return this.control=b};this.getAsCurrentPoint=function(){var b=this.getPoint();return this.current=b};this.getReflectedControlPoint=function(){return this.previousCommand.toLowerCase()!="c"&&this.previousCommand.toLowerCase()!="s"?this.current:new a.Point(2*this.current.x-this.control.x,2*this.current.y-this.control.y)};this.makeAbsolute=function(b){if(this.isRelativeCommand())b.x=this.current.x+b.x,b.y=this.current.y+b.y;return b};this.addMarker=function(b,a,d){d!=null&&this.angles.length>0&&this.angles[this.angles.length- +1]==null&&(this.angles[this.angles.length-1]=this.points[this.points.length-1].angleTo(d));this.addMarkerAngle(b,a==null?null:a.angleTo(b))};this.addMarkerAngle=function(b,a){this.points.push(b);this.angles.push(a)};this.getMarkerPoints=function(){return this.points};this.getMarkerAngles=function(){for(var b=0;b1&&(h*=Math.sqrt(q),l*=Math.sqrt(q));o=(o==j?-1:1)*Math.sqrt((Math.pow(h,2)*Math.pow(l,2)-Math.pow(h,2)*Math.pow(n.y,2)-Math.pow(l,2)*Math.pow(n.x,2))/(Math.pow(h,2)*Math.pow(n.y,2)+Math.pow(l,2)*Math.pow(n.x,2)));isNaN(o)&&(o=0);var p=new a.Point(o*h*n.y/l,o*-l*n.x/h),g=new a.Point((g.x+e.x)/2+Math.cos(f)* +p.x-Math.sin(f)*p.y,(g.y+e.y)/2+Math.sin(f)*p.x+Math.cos(f)*p.y),m=function(b,a){return(b[0]*a[0]+b[1]*a[1])/(Math.sqrt(Math.pow(b[0],2)+Math.pow(b[1],2))*Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2)))},s=function(b,a){return(b[0]*a[1]=1&&(n=0);j==0&&n>0&&(n-=2*Math.PI);j==1&&n<0&&(n+=2*Math.PI);q=new a.Point(g.x-h*Math.cos((o+n)/ +2),g.y-l*Math.sin((o+n)/2));b.addMarkerAngle(q,(o+n)/2+(j==0?1:-1)*Math.PI/2);b.addMarkerAngle(e,n+(j==0?1:-1)*Math.PI/2);c.addPoint(e.x,e.y);d!=null&&(m=h>l?h:l,e=h>l?1:h/l,h=h>l?l/h:1,d.translate(g.x,g.y),d.rotate(f),d.scale(e,h),d.arc(0,0,m,o,o+n,1-j),d.scale(1/e,1/h),d.rotate(-f),d.translate(-g.x,-g.y))}break;case "Z":d!=null&&d.closePath(),b.current=b.start}return c};this.getMarkers=function(){for(var a=this.PathParser.getMarkerPoints(),b=this.PathParser.getMarkerAngles(),c=[],e=0;ethis.maxDuration)if(this.attribute("repeatCount").value=="indefinite")this.duration=0;else return this.attribute("fill").valueOrDefault("remove")=="remove"&&!this.removed?(this.removed=!0,this.getProperty().value=this.initialValue,!0):!1;this.duration+=a;a=!1;if(this.begin0&&b[c-1]!=" "&&c0&&b[c-1]!=" "&&(c==b.length-1||b[c+1]==" "))g="initial";typeof a.glyphs[e]!="undefined"&&(f=a.glyphs[e][g],f==null&&a.glyphs[e].type=="glyph"&&(f=a.glyphs[e]))}else f=a.glyphs[e];if(f==null)f=a.missingGlyph;return f};this.renderChildren=function(c){var b=this.parent.style("font-family").Definition.getDefinition();if(b!=null){var k=this.parent.style("font-size").numValueOrDefault(a.Font.Parse(a.ctx.font).fontSize), +e=this.parent.style("font-style").valueOrDefault(a.Font.Parse(a.ctx.font).fontStyle),f=this.getText();b.isRTL&&(f=f.split("").reverse().join(""));for(var g=a.ToNumberArray(this.parent.attribute("dx").value),j=0;j0?c.childNodes[0].nodeValue:c.text;this.getText=function(){return this.text}};a.Element.tspan.prototype=new a.Element.TextElementBase;a.Element.tref=function(c){this.base=a.Element.TextElementBase;this.base(c);this.getText=function(){var a=this.attribute("xlink:href").Definition.getDefinition();if(a!=null)return a.children[0].getText()}};a.Element.tref.prototype=new a.Element.TextElementBase; +a.Element.a=function(c){this.base=a.Element.TextElementBase;this.base(c);this.hasText=!0;for(var d=0;d1?c.childNodes[1].nodeValue: +""),c=c.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm,""),c=a.compressSpaces(c),c=c.split("}"),d=0;d0){l=g[j].indexOf("url");h=g[j].indexOf(")",l);l=g[j].substr(l+5,h-l-6);l=a.parseXml(a.ajax(l)).getElementsByTagName("font");for(h=0;h + * @link http://www.phpied.com/rgb-color-parser-in-javascript/ + * Use it if you like it + * + */ +function RGBColor(color_string) +{ + this.ok = false; + + // strip any leading # + if (color_string.charAt(0) == '#') { // remove # if any + color_string = color_string.substr(1,6); + } + + color_string = color_string.replace(/ /g,''); + color_string = color_string.toLowerCase(); + + // before getting into regexps, try simple matches + // and overwrite the input + var simple_colors = { + 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' + }; + for (var key in simple_colors) { + if (color_string == key) { + color_string = simple_colors[key]; + } + } + // emd of simple type-in colors + + // array of color definition objects + var color_defs = [ + { + re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, + example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], + process: function (bits){ + return [ + parseInt(bits[1]), + parseInt(bits[2]), + parseInt(bits[3]) + ]; + } + }, + { + re: /^(\w{2})(\w{2})(\w{2})$/, + example: ['#00ff00', '336699'], + process: function (bits){ + return [ + parseInt(bits[1], 16), + parseInt(bits[2], 16), + parseInt(bits[3], 16) + ]; + } + }, + { + re: /^(\w{1})(\w{1})(\w{1})$/, + example: ['#fb0', 'f0f'], + process: function (bits){ + return [ + parseInt(bits[1] + bits[1], 16), + parseInt(bits[2] + bits[2], 16), + parseInt(bits[3] + bits[3], 16) + ]; + } + } + ]; + + // search through the definitions to find a match + for (var i = 0; i < color_defs.length; i++) { + var re = color_defs[i].re; + var processor = color_defs[i].process; + var bits = re.exec(color_string); + if (bits) { + channels = processor(bits); + this.r = channels[0]; + this.g = channels[1]; + this.b = channels[2]; + this.ok = true; + } + + } + + // validate/cleanup values + this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 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); + + // some getters + this.toRGB = function () { + return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')'; + } + this.toHex = function () { + var r = this.r.toString(16); + var g = this.g.toString(16); + var b = this.b.toString(16); + if (r.length == 1) r = '0' + r; + if (g.length == 1) g = '0' + g; + if (b.length == 1) b = '0' + b; + return '#' + r + g + b; + } + + // help + this.getHelpXML = function () { + + var examples = new Array(); + // add regexps + for (var i = 0; i < color_defs.length; i++) { + var example = color_defs[i].example; + for (var j = 0; j < example.length; j++) { + examples[examples.length] = example[j]; + } + } + // add type-in colors + for (var sc in simple_colors) { + examples[examples.length] = sc; + } + + var xml = document.createElement('ul'); + xml.setAttribute('id', 'rgbcolor-examples'); + for (var i = 0; i < examples.length; i++) { + try { + var list_item = document.createElement('li'); + var list_color = new RGBColor(examples[i]); + var example_div = document.createElement('div'); + example_div.style.cssText = + 'margin: 3px; ' + + 'border: 1px solid black; ' + + 'background:' + list_color.toHex() + '; ' + + 'color:' + list_color.toHex() + ; + example_div.appendChild(document.createTextNode('test')); + var list_item_value = document.createTextNode( + ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex() + ); + list_item.appendChild(example_div); + list_item.appendChild(list_item_value); + xml.appendChild(list_item); + + } catch(e){} + } + return xml; + + } + +} + +/** + * @license canvg.js - Javascript SVG parser and renderer on Canvas + * MIT Licensed + * Gabe Lerner (gabelerner@gmail.com) + * http://code.google.com/p/canvg/ + * + * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/ + * + */ +if(!window.console) { + window.console = {}; + window.console.log = function(str) {}; + window.console.dir = function(str) {}; +} + +if(!Array.prototype.indexOf){ + Array.prototype.indexOf = function(obj){ + for(var i=0; i ignore mouse events + // ignoreAnimation: true => ignore animations + // ignoreDimensions: true => does not try to resize canvas + // ignoreClear: true => does not clear canvas + // offsetX: int => draws at a x offset + // offsetY: int => draws at a y offset + // scaleWidth: int => scales horizontally to width + // scaleHeight: int => scales vertically to height + // renderCallback: function => will call the function after the first render is completed + // forceRedraw: function => will call the function on every frame, if it returns true, will redraw + this.canvg = function (target, s, opts) { + // no parameters + if (target == null && s == null && opts == null) { + var svgTags = document.getElementsByTagName('svg'); + for (var i=0; i]*>/, ''); + var xmlDoc = new ActiveXObject('Microsoft.XMLDOM'); + xmlDoc.async = 'false'; + xmlDoc.loadXML(xml); + return xmlDoc; + } + } + + svg.Property = function(name, value) { + this.name = name; + this.value = value; + + this.hasValue = function() { + return (this.value != null && this.value !== ''); + } + + // return the numerical value of the property + this.numValue = function() { + if (!this.hasValue()) return 0; + + var n = parseFloat(this.value); + if ((this.value + '').match(/%$/)) { + n = n / 100.0; + } + return n; + } + + this.valueOrDefault = function(def) { + if (this.hasValue()) return this.value; + return def; + } + + this.numValueOrDefault = function(def) { + if (this.hasValue()) return this.numValue(); + return def; + } + + /* EXTENSIONS */ + var that = this; + + // color extensions + this.Color = { + // augment the current color value with the opacity + addOpacity: function(opacity) { + var newValue = that.value; + if (opacity != null && opacity != '') { + var color = new RGBColor(that.value); + if (color.ok) { + newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacity + ')'; + } + } + return new svg.Property(that.name, newValue); + } + } + + // definition extensions + this.Definition = { + // get the definition from the definitions table + getDefinition: function() { + var name = that.value.replace(/^(url\()?#([^\)]+)\)?$/, '$2'); + return svg.Definitions[name]; + }, + + isUrl: function() { + return that.value.indexOf('url(') == 0 + }, + + getFillStyle: function(e) { + var def = this.getDefinition(); + + // gradient + if (def != null && def.createGradient) { + return def.createGradient(svg.ctx, e); + } + + // pattern + if (def != null && def.createPattern) { + return def.createPattern(svg.ctx, e); + } + + return null; + } + } + + // length extensions + this.Length = { + DPI: function(viewPort) { + return 96.0; // TODO: compute? + }, + + EM: function(viewPort) { + var em = 12; + + var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); + if (fontSize.hasValue()) em = fontSize.Length.toPixels(viewPort); + + return em; + }, + + // get the length as pixels + toPixels: function(viewPort) { + if (!that.hasValue()) return 0; + var s = that.value+''; + if (s.match(/em$/)) return that.numValue() * this.EM(viewPort); + if (s.match(/ex$/)) return that.numValue() * this.EM(viewPort) / 2.0; + if (s.match(/px$/)) return that.numValue(); + if (s.match(/pt$/)) return that.numValue() * 1.25; + if (s.match(/pc$/)) return that.numValue() * 15; + if (s.match(/cm$/)) return that.numValue() * this.DPI(viewPort) / 2.54; + if (s.match(/mm$/)) return that.numValue() * this.DPI(viewPort) / 25.4; + if (s.match(/in$/)) return that.numValue() * this.DPI(viewPort); + if (s.match(/%$/)) return that.numValue() * svg.ViewPort.ComputeSize(viewPort); + return that.numValue(); + } + } + + // time extensions + this.Time = { + // get the time as milliseconds + toMilliseconds: function() { + if (!that.hasValue()) return 0; + var s = that.value+''; + if (s.match(/s$/)) return that.numValue() * 1000; + if (s.match(/ms$/)) return that.numValue(); + return that.numValue(); + } + } + + // angle extensions + this.Angle = { + // get the angle as radians + toRadians: function() { + if (!that.hasValue()) return 0; + var s = that.value+''; + if (s.match(/deg$/)) return that.numValue() * (Math.PI / 180.0); + if (s.match(/grad$/)) return that.numValue() * (Math.PI / 200.0); + if (s.match(/rad$/)) return that.numValue(); + return that.numValue() * (Math.PI / 180.0); + } + } + } + + // fonts + svg.Font = new (function() { + this.Styles = ['normal','italic','oblique','inherit']; + this.Variants = ['normal','small-caps','inherit']; + this.Weights = ['normal','bold','bolder','lighter','100','200','300','400','500','600','700','800','900','inherit']; + + this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { + var f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font); + return { + fontFamily: fontFamily || f.fontFamily, + fontSize: fontSize || f.fontSize, + fontStyle: fontStyle || f.fontStyle, + fontWeight: fontWeight || f.fontWeight, + fontVariant: fontVariant || f.fontVariant, + toString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } + } + } + + var that = this; + this.Parse = function(s) { + var f = {}; + var d = svg.trim(svg.compressSpaces(s || '')).split(' '); + var set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false } + var ff = ''; + for (var i=0; i this.x2) this.x2 = x; + } + + if (y != null) { + if (isNaN(this.y1) || isNaN(this.y2)) { + this.y1 = y; + this.y2 = y; + } + if (y < this.y1) this.y1 = y; + if (y > this.y2) this.y2 = y; + } + } + this.addX = function(x) { this.addPoint(x, null); } + this.addY = function(y) { this.addPoint(null, y); } + + this.addBoundingBox = function(bb) { + this.addPoint(bb.x1, bb.y1); + this.addPoint(bb.x2, bb.y2); + } + + this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) { + var cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0) + var cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0) + var cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0) + var cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0) + this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y); + } + + this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { + // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html + var p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y]; + this.addPoint(p0[0], p0[1]); + this.addPoint(p3[0], p3[1]); + + for (i=0; i<=1; i++) { + var f = function(t) { + return Math.pow(1-t, 3) * p0[i] + + 3 * Math.pow(1-t, 2) * t * p1[i] + + 3 * (1-t) * Math.pow(t, 2) * p2[i] + + Math.pow(t, 3) * p3[i]; + } + + var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; + var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; + var c = 3 * p1[i] - 3 * p0[i]; + + if (a == 0) { + if (b == 0) continue; + var t = -c / b; + if (0 < t && t < 1) { + if (i == 0) this.addX(f(t)); + if (i == 1) this.addY(f(t)); + } + continue; + } + + var b2ac = Math.pow(b, 2) - 4 * c * a; + if (b2ac < 0) continue; + var t1 = (-b + Math.sqrt(b2ac)) / (2 * a); + if (0 < t1 && t1 < 1) { + if (i == 0) this.addX(f(t1)); + if (i == 1) this.addY(f(t1)); + } + var t2 = (-b - Math.sqrt(b2ac)) / (2 * a); + if (0 < t2 && t2 < 1) { + if (i == 0) this.addX(f(t2)); + if (i == 1) this.addY(f(t2)); + } + } + } + + this.isPointInBox = function(x, y) { + return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2); + } + + this.addPoint(x1, y1); + this.addPoint(x2, y2); + } + + // transforms + svg.Transform = function(v) { + var that = this; + this.Type = {} + + // translate + this.Type.translate = function(s) { + this.p = svg.CreatePoint(s); + this.apply = function(ctx) { + ctx.translate(this.p.x || 0.0, this.p.y || 0.0); + } + this.applyToPoint = function(p) { + p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); + } + } + + // rotate + this.Type.rotate = function(s) { + var a = svg.ToNumberArray(s); + this.angle = new svg.Property('angle', a[0]); + this.cx = a[1] || 0; + this.cy = a[2] || 0; + this.apply = function(ctx) { + ctx.translate(this.cx, this.cy); + ctx.rotate(this.angle.Angle.toRadians()); + ctx.translate(-this.cx, -this.cy); + } + this.applyToPoint = function(p) { + var a = this.angle.Angle.toRadians(); + p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); + p.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]); + p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]); + } + } + + this.Type.scale = function(s) { + this.p = svg.CreatePoint(s); + this.apply = function(ctx) { + ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0); + } + this.applyToPoint = function(p) { + p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]); + } + } + + this.Type.matrix = function(s) { + this.m = svg.ToNumberArray(s); + this.apply = function(ctx) { + ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]); + } + this.applyToPoint = function(p) { + p.applyTransform(this.m); + } + } + + this.Type.SkewBase = function(s) { + this.base = that.Type.matrix; + this.base(s); + this.angle = new svg.Property('angle', s); + } + this.Type.SkewBase.prototype = new this.Type.matrix; + + this.Type.skewX = function(s) { + this.base = that.Type.SkewBase; + this.base(s); + this.m = [1, 0, Math.tan(this.angle.Angle.toRadians()), 1, 0, 0]; + } + this.Type.skewX.prototype = new this.Type.SkewBase; + + this.Type.skewY = function(s) { + this.base = that.Type.SkewBase; + this.base(s); + this.m = [1, Math.tan(this.angle.Angle.toRadians()), 0, 1, 0, 0]; + } + this.Type.skewY.prototype = new this.Type.SkewBase; + + this.transforms = []; + + this.apply = function(ctx) { + for (var i=0; i= this.tokens.length - 1; + } + + this.isCommandOrEnd = function() { + if (this.isEnd()) return true; + return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null; + } + + this.isRelativeCommand = function() { + return this.command == this.command.toLowerCase(); + } + + this.getToken = function() { + this.i = this.i + 1; + return this.tokens[this.i]; + } + + this.getScalar = function() { + return parseFloat(this.getToken()); + } + + this.nextCommand = function() { + this.previousCommand = this.command; + this.command = this.getToken(); + } + + this.getPoint = function() { + var p = new svg.Point(this.getScalar(), this.getScalar()); + return this.makeAbsolute(p); + } + + this.getAsControlPoint = function() { + var p = this.getPoint(); + this.control = p; + return p; + } + + this.getAsCurrentPoint = function() { + var p = this.getPoint(); + this.current = p; + return p; + } + + this.getReflectedControlPoint = function() { + if (this.previousCommand.toLowerCase() != 'c' && this.previousCommand.toLowerCase() != 's') { + return this.current; + } + + // reflect point + var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y); + return p; + } + + this.makeAbsolute = function(p) { + if (this.isRelativeCommand()) { + p.x = this.current.x + p.x; + p.y = this.current.y + p.y; + } + return p; + } + + this.addMarker = function(p, from, priorTo) { + // if the last angle isn't filled in because we didn't have this point yet ... + if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) { + this.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo); + } + this.addMarkerAngle(p, from == null ? null : from.angleTo(p)); + } + + this.addMarkerAngle = function(p, a) { + this.points.push(p); + this.angles.push(a); + } + + this.getMarkerPoints = function() { return this.points; } + this.getMarkerAngles = function() { + for (var i=0; i 1) { + rx *= Math.sqrt(l); + ry *= Math.sqrt(l); + } + // cx', cy' + var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt( + ((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) / + (Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2)) + ); + if (isNaN(s)) s = 0; + var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); + // cx, cy + var centp = new svg.Point( + (curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, + (curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y + ); + // vector magnitude + var m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); } + // ratio between two vectors + var r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) } + // angle between two vectors + var a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); } + // initial angle + var a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]); + // angle delta + var u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]; + var v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry]; + var ad = a(u, v); + if (r(u,v) <= -1) ad = Math.PI; + if (r(u,v) >= 1) ad = 0; + + if (sweepFlag == 0 && ad > 0) ad = ad - 2 * Math.PI; + if (sweepFlag == 1 && ad < 0) ad = ad + 2 * Math.PI; + + // for markers + var halfWay = new svg.Point( + centp.x - rx * Math.cos((a1 + ad) / 2), + centp.y - ry * Math.sin((a1 + ad) / 2) + ); + pp.addMarkerAngle(halfWay, (a1 + ad) / 2 + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2); + pp.addMarkerAngle(cp, ad + (sweepFlag == 0 ? 1 : -1) * Math.PI / 2); + + bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better + if (ctx != null) { + var r = rx > ry ? rx : ry; + var sx = rx > ry ? 1 : rx / ry; + var sy = rx > ry ? ry / rx : 1; + + ctx.translate(centp.x, centp.y); + ctx.rotate(xAxisRotation); + ctx.scale(sx, sy); + ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag); + ctx.scale(1/sx, 1/sy); + ctx.rotate(-xAxisRotation); + ctx.translate(-centp.x, -centp.y); + } + } + break; + case 'Z': + if (ctx != null) ctx.closePath(); + pp.current = pp.start; + } + } + + return bb; + } + + this.getMarkers = function() { + var points = this.PathParser.getMarkerPoints(); + var angles = this.PathParser.getMarkerAngles(); + + var markers = []; + for (var i=0; i this.maxDuration) { + // loop for indefinitely repeating animations + if (this.attribute('repeatCount').value == 'indefinite') { + this.duration = 0.0 + } + else if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) { + this.removed = true; + this.getProperty().value = this.initialValue; + return true; + } + else { + return false; // no updates made + } + } + this.duration = this.duration + delta; + + // if we're past the begin time + var updated = false; + if (this.begin < this.duration) { + var newValue = this.calcValue(); // tween + + if (this.attribute('type').hasValue()) { + // for transform, etc. + var type = this.attribute('type').value; + newValue = type + '(' + newValue + ')'; + } + + this.getProperty().value = newValue; + updated = true; + } + + return updated; + } + + // fraction of duration we've covered + this.progress = function() { + return ((this.duration - this.begin) / (this.maxDuration - this.begin)); + } + } + svg.Element.AnimateBase.prototype = new svg.Element.ElementBase; + + // animate element + svg.Element.animate = function(node) { + this.base = svg.Element.AnimateBase; + this.base(node); + + this.calcValue = function() { + var from = this.attribute('from').numValue(); + var to = this.attribute('to').numValue(); + + // tween value linearly + return from + (to - from) * this.progress(); + }; + } + svg.Element.animate.prototype = new svg.Element.AnimateBase; + + // animate color element + svg.Element.animateColor = function(node) { + this.base = svg.Element.AnimateBase; + this.base(node); + + this.calcValue = function() { + var from = new RGBColor(this.attribute('from').value); + var to = new RGBColor(this.attribute('to').value); + + if (from.ok && to.ok) { + // tween color linearly + var r = from.r + (to.r - from.r) * this.progress(); + var g = from.g + (to.g - from.g) * this.progress(); + var b = from.b + (to.b - from.b) * this.progress(); + return 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')'; + } + return this.attribute('from').value; + }; + } + svg.Element.animateColor.prototype = new svg.Element.AnimateBase; + + // animate transform element + svg.Element.animateTransform = function(node) { + this.base = svg.Element.animate; + this.base(node); + } + svg.Element.animateTransform.prototype = new svg.Element.animate; + + // font element + svg.Element.font = function(node) { + this.base = svg.Element.ElementBase; + this.base(node); + + this.horizAdvX = this.attribute('horiz-adv-x').numValue(); + + this.isRTL = false; + this.isArabic = false; + this.fontFace = null; + this.missingGlyph = null; + this.glyphs = []; + for (var i=0; i0 && text[i-1]!=' ' && i0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial'; + if (typeof(font.glyphs[c]) != 'undefined') { + glyph = font.glyphs[c][arabicForm]; + if (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c]; + } + } + else { + glyph = font.glyphs[c]; + } + if (glyph == null) glyph = font.missingGlyph; + return glyph; + } + + this.renderChildren = function(ctx) { + var customFont = this.parent.style('font-family').Definition.getDefinition(); + if (customFont != null) { + var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); + var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle); + var text = this.getText(); + if (customFont.isRTL) text = text.split("").reverse().join(""); + + var dx = svg.ToNumberArray(this.parent.attribute('dx').value); + for (var i=0; i 0 ? node.childNodes[0].nodeValue : // element + node.text; + this.getText = function() { + return this.text; + } + } + svg.Element.tspan.prototype = new svg.Element.TextElementBase; + + // tref + svg.Element.tref = function(node) { + this.base = svg.Element.TextElementBase; + this.base(node); + + this.getText = function() { + var element = this.attribute('xlink:href').Definition.getDefinition(); + if (element != null) return element.children[0].getText(); + } + } + svg.Element.tref.prototype = new svg.Element.TextElementBase; + + // a element + svg.Element.a = function(node) { + this.base = svg.Element.TextElementBase; + this.base(node); + + this.hasText = true; + for (var i=0; i 1 ? node.childNodes[1].nodeValue : ''); + css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, ''); // remove comments + css = svg.compressSpaces(css); // replace whitespace + var cssDefs = css.split('}'); + for (var i=0; i 0) { + var urlStart = srcs[s].indexOf('url'); + var urlEnd = srcs[s].indexOf(')', urlStart); + var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6); + var doc = svg.parseXml(svg.ajax(url)); + var fonts = doc.getElementsByTagName('font'); + for (var f=0; f
            ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('fileActionName')) { + $('#filePickerReady').after($('
            ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('fileFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
          • ' + + '

            ' + file.name + '

            ' + + '

            ' + + '

            ' + + '
          • '), + + $btns = $('
            ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
            ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

            ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + _this.fileList.push(json); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + getInsertList: function () { + var i, link, data, list = [], + prefix = editor.getOpt('fileUrlPrefix'); + for (i = 0; i < this.fileList.length; i++) { + data = this.fileList[i]; + link = data.url; + list.push({ + title: data.original || link.substr(link.lastIndexOf('/') + 1), + url: prefix + link + }); + } + return list; + } + }; + + + /* 在线附件 */ + function OnlineFile(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineFile.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + this.initData(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('fileList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getFileData(); + } + }); + /* 选中图片 */ + domUtils.on(this.list, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('fileManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getFileData(); + }, + /* 向后台拉取图片列表数据 */ + getFileData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + ajax.request(editor.getActionUrl(editor.getOpt('fileManagerActionName')), { + timeout: 100000, + data: utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + method: 'get', + onsuccess: function (r) { + try { + var json = eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + onerror: function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, filetype, preview, icon, _this = this, + urlPrefix = editor.getOpt('fileManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + icon = document.createElement('span'); + filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1); + + if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) { + preview = document.createElement('img'); + domUtils.on(preview, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + }; + })(preview)); + preview.width = 113; + preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + } else { + var ic = document.createElement('i'), + textSpan = document.createElement('span'); + textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1); + preview = document.createElement('div'); + preview.appendChild(ic); + preview.appendChild(textSpan); + domUtils.addClass(preview, 'file-wrapper'); + domUtils.addClass(textSpan, 'file-title'); + domUtils.addClass(ic, 'file-type-' + filetype); + domUtils.addClass(ic, 'file-preview'); + } + domUtils.addClass(icon, 'icon'); + item.setAttribute('data-url', urlPrefix + list[i].url); + if (list[i].original) { + item.setAttribute('data-title', list[i].original); + } + + item.appendChild(preview); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = []; + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var url = lis[i].getAttribute('data-url'); + var title = lis[i].getAttribute('data-title') || url.substr(url.lastIndexOf('/') + 1); + list.push({ + title: title, + url: url + }); + } + } + return list; + } + }; + + +})(); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif new file mode 100644 index 0000000..9ca4fb6 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_chm.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_default.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_default.png new file mode 100644 index 0000000..50ac1cb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_default.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif new file mode 100644 index 0000000..206fede Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_doc.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif new file mode 100644 index 0000000..2e3b7a2 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_exe.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif new file mode 100644 index 0000000..5d5dec0 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_jpg.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif new file mode 100644 index 0000000..b351a1f Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_mp3.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif new file mode 100644 index 0000000..26019b0 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_mv.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif new file mode 100644 index 0000000..bbb65c8 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_pdf.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif new file mode 100644 index 0000000..ccb26fb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_ppt.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif new file mode 100644 index 0000000..2e8743a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_psd.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif new file mode 100644 index 0000000..5359e46 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_rar.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif new file mode 100644 index 0000000..e7b8dd2 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_txt.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif new file mode 100644 index 0000000..e86c1c6 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/fileTypeImages/icon_xls.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/alignicon.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/alignicon.gif new file mode 100644 index 0000000..005a5ac Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/alignicon.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/alignicon.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/alignicon.png new file mode 100644 index 0000000..4b6c444 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/alignicon.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/bg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/bg.png new file mode 100644 index 0000000..580be0a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/file-icons.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/file-icons.gif new file mode 100644 index 0000000..d8c02c2 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/file-icons.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/file-icons.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/file-icons.png new file mode 100644 index 0000000..3ff82c8 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/file-icons.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/icons.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/icons.gif new file mode 100644 index 0000000..78459de Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/icons.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/icons.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/icons.png new file mode 100644 index 0000000..12e4700 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/icons.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/image.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/image.png new file mode 100644 index 0000000..19699f6 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/image.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/progress.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/progress.png new file mode 100644 index 0000000..717c486 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/progress.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/success.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/success.gif new file mode 100644 index 0000000..8d4f311 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/success.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/success.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/success.png new file mode 100644 index 0000000..94f968d Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/attachment/images/success.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.css new file mode 100644 index 0000000..5c41fe9 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.css @@ -0,0 +1,94 @@ +.wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative} +.tabbody{height:225px;} +.tabbody .panel { position: absolute;width:100%; height:100%;background: #fff; display: none;} +.tabbody .focus { display: block;} + +body{font-size: 12px;color: #888;overflow: hidden;} +input,label{vertical-align:middle} +.clear{clear: both;} +.pl{padding-left: 18px;padding-left: 23px\9;} + +#imageList {width: 420px;height: 215px;margin-top: 10px;overflow: hidden;overflow-y: auto;} +#imageList div {float: left;width: 100px;height: 95px;margin: 5px 10px;} +#imageList img {cursor: pointer;border: 2px solid white;} + +.bgarea{margin: 10px;padding: 5px;height: 84%;border: 1px solid #A8A297;} +.content div{margin: 10px 0 10px 5px;} +.content .iptradio{margin: 0px 5px 5px 0px;} +.txt{width:280px;} + +.wrapcolor{height: 19px;} +div.color{float: left;margin: 0;} +#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;margin: 0;float: left;} +div.alignment,#custom{margin-left: 23px;margin-left: 28px\9;} +#custom input{height: 15px;min-height: 15px;width:20px;} +#repeatType{width:100px;} + + +/* 图片管理样式 */ +#imgManager { + width: 100%; + height: 225px; +} +#imgManager #imageList{ + width: 100%; + overflow-x: hidden; + overflow-y: auto; +} +#imgManager ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +#imgManager li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 9px 0 0 19px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#imgManager li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#imgManager li img { + cursor: pointer; +} +#imgManager li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#imgManager li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} +#imgManager li.selected .icon { + background-image: url(images/success.png); + background-position: 75px 75px; +} +#imgManager li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.html new file mode 100644 index 0000000..3cc2ac1 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.html @@ -0,0 +1,56 @@ + + + + + + + + +
            +
            + + +
            +
            +
            +
            + +
            +
            + + +
            +
            +
            + : +
            +
            +
            +
            +
            + +
            +
            + : +
            +
            + :x:px  y:px +
            +
            +
            + +
            +
            +
            +
            +
            +
            + + + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.js new file mode 100644 index 0000000..9a4a131 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/background.js @@ -0,0 +1,376 @@ +(function () { + + var onlineImage, + backupStyle = editor.queryCommandValue('background'); + + window.onload = function () { + initTabs(); + initColorSelector(); + }; + + /* 初始化tab标签 */ + function initTabs(){ + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + for (var j = 0; j < tabs.length; j++) { + if(tabs[j] == target){ + tabs[j].className = "focus"; + var contentId = tabs[j].getAttribute('data-content-id'); + $G(contentId).style.display = "block"; + if(contentId == 'imgManager') { + initImagePanel(); + } + }else { + tabs[j].className = ""; + $G(tabs[j].getAttribute('data-content-id')).style.display = "none"; + } + } + }); + } + } + + /* 初始化颜色设置 */ + function initColorSelector () { + var obj = editor.queryCommandValue('background'); + if (obj) { + var color = obj['background-color'], + repeat = obj['background-repeat'] || 'repeat', + image = obj['background-image'] || '', + position = obj['background-position'] || 'center center', + pos = position.split(' '), + x = parseInt(pos[0]) || 0, + y = parseInt(pos[1]) || 0; + + if(repeat == 'no-repeat' && (x || y)) repeat = 'self'; + + image = image.match(/url[\s]*\(([^\)]*)\)/); + image = image ? image[1]:''; + updateFormState('colored', color, image, repeat, x, y); + } else { + updateFormState(); + } + + var updateHandler = function () { + updateFormState(); + updateBackground(); + } + domUtils.on($G('nocolorRadio'), 'click', updateBackground); + domUtils.on($G('coloredRadio'), 'click', updateHandler); + domUtils.on($G('url'), 'keyup', function(){ + if($G('url').value && $G('alignment').style.display == "none") { + utils.each($G('repeatType').children, function(item){ + item.selected = ('repeat' == item.getAttribute('value') ? 'selected':false); + }); + } + updateHandler(); + }); + domUtils.on($G('repeatType'), 'change', updateHandler); + domUtils.on($G('x'), 'keyup', updateBackground); + domUtils.on($G('y'), 'keyup', updateBackground); + + initColorPicker(); + } + + /* 初始化颜色选择器 */ + function initColorPicker() { + var me = editor, + cp = $G("colorPicker"); + + /* 生成颜色选择器ui对象 */ + var popup = new UE.ui.Popup({ + content: new UE.ui.ColorPicker({ + noColorText: me.getLang("clearColor"), + editor: me, + onpickcolor: function (t, color) { + updateFormState('colored', color); + updateBackground(); + UE.ui.Popup.postHide(); + }, + onpicknocolor: function (t, color) { + updateFormState('colored', 'transparent'); + updateBackground(); + UE.ui.Popup.postHide(); + } + }), + editor: me, + onhide: function () { + } + }); + + /* 设置颜色选择器 */ + domUtils.on(cp, "click", function () { + popup.showAnchor(this); + }); + domUtils.on(document, 'mousedown', function (evt) { + var el = evt.target || evt.srcElement; + UE.ui.Popup.postHide(el); + }); + domUtils.on(window, 'scroll', function () { + UE.ui.Popup.postHide(); + }); + } + + /* 初始化在线图片列表 */ + function initImagePanel() { + onlineImage = onlineImage || new OnlineImage('imageList'); + } + + /* 更新背景色设置面板 */ + function updateFormState (radio, color, url, align, x, y) { + var nocolorRadio = $G('nocolorRadio'), + coloredRadio = $G('coloredRadio'); + + if(radio) { + nocolorRadio.checked = (radio == 'colored' ? false:'checked'); + coloredRadio.checked = (radio == 'colored' ? 'checked':false); + } + if(color) { + domUtils.setStyle($G("colorPicker"), "background-color", color); + } + + if(url && /^\//.test(url)) { + var a = document.createElement('a'); + a.href = url; + browser.ie && (a.href = a.href); + url = browser.ie ? a.href:(a.protocol + '//' + a.host + a.pathname + a.search + a.hash); + } + + if(url || url === '') { + $G('url').value = url; + } + if(align) { + utils.each($G('repeatType').children, function(item){ + item.selected = (align == item.getAttribute('value') ? 'selected':false); + }); + } + if(x || y) { + $G('x').value = parseInt(x) || 0; + $G('y').value = parseInt(y) || 0; + } + + $G('alignment').style.display = coloredRadio.checked && $G('url').value ? '':'none'; + $G('custom').style.display = coloredRadio.checked && $G('url').value && $G('repeatType').value == 'self' ? '':'none'; + } + + /* 更新背景颜色 */ + function updateBackground () { + if ($G('coloredRadio').checked) { + var color = domUtils.getStyle($G("colorPicker"), "background-color"), + bgimg = $G("url").value, + align = $G("repeatType").value, + backgroundObj = { + "background-repeat": "no-repeat", + "background-position": "center center" + }; + + if (color) backgroundObj["background-color"] = color; + if (bgimg) backgroundObj["background-image"] = 'url(' + bgimg + ')'; + if (align == 'self') { + backgroundObj["background-position"] = $G("x").value + "px " + $G("y").value + "px"; + } else if (align == 'repeat-x' || align == 'repeat-y' || align == 'repeat') { + backgroundObj["background-repeat"] = align; + } + + editor.execCommand('background', backgroundObj); + } else { + editor.execCommand('background', null); + } + } + + + /* 在线图片 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.id = 'imageListUl'; + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('imageList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 选中图片 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode, + nodes = $G('imageListUl').childNodes; + + if (li.tagName.toLowerCase() == 'li') { + updateFormState('nocolor', null, ''); + for (var i = 0, node; node = nodes[i++];) { + if (node == li && !domUtils.hasClass(node, 'selected')) { + domUtils.addClass(node, 'selected'); + updateFormState('colored', null, li.firstChild.getAttribute("_src"), 'repeat'); + } else { + domUtils.removeClasses(node, 'selected'); + } + } + updateBackground(); + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getImageData(); + }, + /* 重置界面 */ + reset: function() { + this.initContainer(); + this.initData(); + }, + /* 向后台拉取图片列表数据 */ + getImageData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), + isJsonp = utils.isCrossDomainUrl(url); + ajax.request(url, { + 'timeout': 100000, + 'dataType': isJsonp ? 'jsonp':'', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + var json = isJsonp ? r:eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + img = document.createElement('img'); + icon = document.createElement('span'); + + domUtils.on(img, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + } + })(img)); + img.width = 113; + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + img.setAttribute('_src', urlPrefix + list[i].url); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + floatStyle: align + }); + } + + } + return list; + } + }; + + dialog.onok = function () { + updateBackground(); + editor.fireEvent('saveScene'); + }; + dialog.oncancel = function () { + editor.execCommand('background', backupStyle); + }; + +})(); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/images/bg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/images/bg.png new file mode 100644 index 0000000..580be0a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/images/bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/images/success.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/images/success.png new file mode 100644 index 0000000..94f968d Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/background/images/success.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/chart.config.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/chart.config.js new file mode 100644 index 0000000..678b00d --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/chart.config.js @@ -0,0 +1,65 @@ +/* + * 图表配置文件 + * */ + + +//不同类型的配置 +var typeConfig = [ + { + chart: { + type: 'line' + }, + plotOptions: { + line: { + dataLabels: { + enabled: false + }, + enableMouseTracking: true + } + } + }, { + chart: { + type: 'line' + }, + plotOptions: { + line: { + dataLabels: { + enabled: true + }, + enableMouseTracking: false + } + } + }, { + chart: { + type: 'area' + } + }, { + chart: { + type: 'bar' + } + }, { + chart: { + type: 'column' + } + }, { + chart: { + plotBackgroundColor: null, + plotBorderWidth: null, + plotShadow: false + }, + plotOptions: { + pie: { + allowPointSelect: true, + cursor: 'pointer', + dataLabels: { + enabled: true, + color: '#000000', + connectorColor: '#000000', + formatter: function() { + return ''+ this.point.name +': '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; + } + } + } + } + } +]; diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.css new file mode 100644 index 0000000..ac3c764 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.css @@ -0,0 +1,165 @@ +html, body { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + overflow-x: hidden; +} + +.main { + width: 100%; + overflow: hidden; +} + +.table-view { + height: 100%; + float: left; + margin: 20px; + width: 40%; +} + +.table-view .table-container { + width: 100%; + margin-bottom: 50px; + overflow: scroll; +} + +.table-view th { + padding: 5px 10px; + background-color: #F7F7F7; +} + +.table-view td { + width: 50px; + text-align: center; + padding:0; +} + +.table-container input { + width: 40px; + padding: 5px; + border: none; + outline: none; +} + +.table-view caption { + font-size: 18px; + text-align: left; +} + +.charts-view { + /*margin-left: 49%!important;*/ + width: 50%; + margin-left: 49%; + height: 400px; +} + +.charts-container { + border-left: 1px solid #c3c3c3; +} + +.charts-format fieldset { + padding-left: 20px; + margin-bottom: 50px; +} + +.charts-format legend { + padding-left: 10px; + padding-right: 10px; +} + +.format-item-container { + padding: 20px; +} + +.format-item-container label { + display: block; + margin: 10px 0; +} + +.charts-format .data-item { + border: 1px solid black; + outline: none; + padding: 2px 3px; +} + +/* 图表类型 */ + +.charts-type { + margin-top: 50px; + height: 300px; +} + +.scroll-view { + border: 1px solid #c3c3c3; + border-left: none; + border-right: none; + overflow: hidden; +} + +.scroll-container { + margin: 20px; + width: 100%; + overflow: hidden; +} + +.scroll-bed { + width: 10000px; + _margin-top: 20px; + -webkit-transition: margin-left .5s ease; + -moz-transition: margin-left .5s ease; + transition: margin-left .5s ease; +} + +.view-box { + display: inline-block; + *display: inline; + *zoom: 1; + margin-right: 20px; + border: 2px solid white; + line-height: 0; + overflow: hidden; + cursor: pointer; +} + +.view-box img { + border: 1px solid #cecece; +} + +.view-box.selected { + border-color: #7274A7; +} + +.button-container { + margin-bottom: 20px; + text-align: center; +} + +.button-container a { + display: inline-block; + width: 100px; + height: 25px; + line-height: 25px; + border: 1px solid #c2ccd1; + margin-right: 30px; + text-decoration: none; + color: black; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; +} + +.button-container a:HOVER { + background: #fcfcfc; +} + +.button-container a:ACTIVE { + border-top-color: #c2ccd1; + box-shadow:inset 0 5px 4px -4px rgba(49, 49, 64, 0.1); +} + +.edui-charts-not-data { + height: 100px; + line-height: 100px; + text-align: center; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.html new file mode 100644 index 0000000..70e2314 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.html @@ -0,0 +1,89 @@ + + + + chart + + + + + +
            + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.js new file mode 100644 index 0000000..37344fd --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/charts.js @@ -0,0 +1,519 @@ +/* + * 图片转换对话框脚本 + **/ + +var tableData = [], + //编辑器页面table + editorTable = null, + chartsConfig = window.typeConfig, + resizeTimer = null, + //初始默认图表类型 + currentChartType = 0; + +window.onload = function () { + + editorTable = domUtils.findParentByTagName( editor.selection.getRange().startContainer, 'table', true); + + //未找到表格, 显示错误页面 + if ( !editorTable ) { + document.body.innerHTML = "
            未找到数据
            "; + return; + } + + //初始化图表类型选择 + initChartsTypeView(); + renderTable( editorTable ); + initEvent(); + initUserConfig( editorTable.getAttribute( "data-chart" ) ); + $( "#scrollBed .view-box:eq("+ currentChartType +")" ).trigger( "click" ); + updateViewType( currentChartType ); + + dialog.addListener( "resize", function () { + + if ( resizeTimer != null ) { + window.clearTimeout( resizeTimer ); + } + + resizeTimer = window.setTimeout( function () { + + resizeTimer = null; + + renderCharts(); + + }, 500 ); + + } ); + +}; + +function initChartsTypeView () { + + var contents = []; + + for ( var i = 0, len = chartsConfig.length; i
            ' ); + + } + + $( "#scrollBed" ).html( contents.join( "" ) ); + +} + +//渲染table, 以便用户修改数据 +function renderTable ( table ) { + + var tableHtml = []; + + //构造数据 + for ( var i = 0, row; row = table.rows[ i ]; i++ ) { + + tableData[ i ] = []; + tableHtml[ i ] = []; + + for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { + + var value = getCellValue( cell ); + + if ( i > 0 && j > 0 ) { + value = +value; + } + + if ( i === 0 || j === 0 ) { + tableHtml[ i ].push( ''+ value +'' ); + } else { + tableHtml[ i ].push( '' ); + } + + tableData[ i ][ j ] = value; + + } + + tableHtml[ i ] = tableHtml[ i ].join( "" ); + + } + + //draw 表格 + $( "#tableContainer" ).html( ''+ tableHtml.join( "" ) +'
            ' ); + +} + +/* + * 根据表格已有的图表属性初始化当前图表属性 + */ +function initUserConfig ( config ) { + + var parsedConfig = {}; + + if ( !config ) { + return; + } + + config = config.split( ";" ); + + $.each( config, function ( index, item ) { + + item = item.split( ":" ); + parsedConfig[ item[ 0 ] ] = item[ 1 ]; + + } ); + + setUserConfig( parsedConfig ); + +} + +function initEvent () { + + var cacheValue = null, + //图表类型数 + typeViewCount = chartsConfig.length- 1, + $chartsTypeViewBox = $( '#scrollBed .view-box' ); + + $( ".charts-format" ).delegate( ".format-ctrl", "change", function () { + + renderCharts(); + + } ) + + $( ".table-view" ).delegate( ".data-item", "focus", function () { + + cacheValue = this.value; + + } ).delegate( ".data-item", "blur", function () { + + if ( this.value !== cacheValue ) { + renderCharts(); + } + + cacheValue = null; + + } ); + + $( "#buttonContainer" ).delegate( "a", "click", function (e) { + + e.preventDefault(); + + if ( this.getAttribute( "data-title" ) === 'prev' ) { + + if ( currentChartType > 0 ) { + currentChartType--; + updateViewType( currentChartType ); + } + + } else { + + if ( currentChartType < typeViewCount ) { + currentChartType++; + updateViewType( currentChartType ); + } + + } + + } ); + + //图表类型变化 + $( '#scrollBed' ).delegate( ".view-box", "click", function (e) { + + var index = $( this ).attr( "data-chart-type" ); + $chartsTypeViewBox.removeClass( "selected" ); + $( $chartsTypeViewBox[ index ] ).addClass( "selected" ); + + currentChartType = index | 0; + + //饼图, 禁用部分配置 + if ( currentChartType === chartsConfig.length - 1 ) { + + disableNotPieConfig(); + + //启用完整配置 + } else { + + enableNotPieConfig(); + + } + + renderCharts(); + + } ); + +} + +function renderCharts () { + + var data = collectData(); + + $('#chartsContainer').highcharts( $.extend( {}, chartsConfig[ currentChartType ], { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: data.title, + x: -20 //center + }, + subtitle: { + text: data.subTitle, + x: -20 + }, + xAxis: { + title: { + text: data.xTitle + }, + categories: data.categories + }, + yAxis: { + title: { + text: data.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: data.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: data.series + + } )); + +} + +function updateViewType ( index ) { + + $( "#scrollBed" ).css( 'marginLeft', -index*324+'px' ); + +} + +function collectData () { + + var form = document.forms[ 'data-form' ], + data = null; + + if ( currentChartType !== chartsConfig.length - 1 ) { + + data = getSeriesAndCategories(); + $.extend( data, getUserConfig() ); + + //饼图数据格式 + } else { + data = getSeriesForPieChart(); + data.title = form[ 'title' ].value; + data.suffix = form[ 'unit' ].value; + } + + return data; + +} + +/** + * 获取用户配置信息 + */ +function getUserConfig () { + + var form = document.forms[ 'data-form' ], + info = { + title: form[ 'title' ].value, + subTitle: form[ 'sub-title' ].value, + xTitle: form[ 'x-title' ].value, + yTitle: form[ 'y-title' ].value, + suffix: form[ 'unit' ].value, + //数据对齐方式 + tableDataFormat: getTableDataFormat (), + //饼图提示文字 + tip: $( "#tipInput" ).val() + }; + + return info; + +} + +function setUserConfig ( config ) { + + var form = document.forms[ 'data-form' ]; + + config.title && ( form[ 'title' ].value = config.title ); + config.subTitle && ( form[ 'sub-title' ].value = config.subTitle ); + config.xTitle && ( form[ 'x-title' ].value = config.xTitle ); + config.yTitle && ( form[ 'y-title' ].value = config.yTitle ); + config.suffix && ( form[ 'unit' ].value = config.suffix ); + config.dataFormat == "-1" && ( form[ 'charts-format' ][ 1 ].checked = true ); + config.tip && ( form[ 'tip' ].value = config.tip ); + currentChartType = config.chartType || 0; + +} + +function getSeriesAndCategories () { + + var form = document.forms[ 'data-form' ], + series = [], + categories = [], + tmp = [], + tableData = getTableData(); + + //反转数据 + if ( getTableDataFormat() === "-1" ) { + + for ( var i = 0, len = tableData.length; i < len; i++ ) { + + for ( var j = 0, jlen = tableData[ i ].length; j < jlen; j++ ) { + + if ( !tmp[ j ] ) { + tmp[ j ] = []; + } + + tmp[ j ][ i ] = tableData[ i ][ j ]; + + } + + } + + tableData = tmp; + + } + + categories = tableData[0].slice( 1 ); + + for ( var i = 1, data; data = tableData[ i ]; i++ ) { + + series.push( { + name: data[ 0 ], + data: data.slice( 1 ) + } ); + + } + + return { + series: series, + categories: categories + }; + +} + +/* + * 获取数据源数据对齐方式 + */ +function getTableDataFormat () { + + var form = document.forms[ 'data-form' ], + items = form['charts-format']; + + return items[ 0 ].checked ? items[ 0 ].value : items[ 1 ].value; + +} + +/* + * 禁用非饼图类型的配置项 + */ +function disableNotPieConfig() { + + updateConfigItem( 'disable' ); + +} + +/* + * 启用非饼图类型的配置项 + */ +function enableNotPieConfig() { + + updateConfigItem( 'enable' ); + +} + +function updateConfigItem ( value ) { + + var table = $( "#showTable" )[ 0 ], + isDisable = value === 'disable' ? true : false; + + //table中的input处理 + for ( var i = 2 , row; row = table.rows[ i ]; i++ ) { + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + $( "input", cell ).attr( "disabled", isDisable ); + + } + + } + + //其他项处理 + $( "input.not-pie-item" ).attr( "disabled", isDisable ); + $( "#tipInput" ).attr( "disabled", !isDisable ) + +} + +/* + * 获取饼图数据 + * 饼图的数据只取第一行的 + **/ +function getSeriesForPieChart () { + + var series = { + type: 'pie', + name: $("#tipInput").val(), + data: [] + }, + tableData = getTableData(); + + + for ( var j = 1, jlen = tableData[ 0 ].length; j < jlen; j++ ) { + + var title = tableData[ 0 ][ j ], + val = tableData[ 1 ][ j ]; + + series.data.push( [ title, val ] ); + + } + + return { + series: [ series ] + }; + +} + +function getTableData () { + + var table = document.getElementById( "showTable" ), + xCount = table.rows[0].cells.length - 1, + values = getTableInputValue(); + + for ( var i = 0, value; value = values[ i ]; i++ ) { + + tableData[ Math.floor( i / xCount ) + 1 ][ i % xCount + 1 ] = values[ i ]; + + } + + return tableData; + +} + +function getTableInputValue () { + + var table = document.getElementById( "showTable" ), + inputs = table.getElementsByTagName( "input" ), + values = []; + + for ( var i = 0, input; input = inputs[ i ]; i++ ) { + values.push( input.value | 0 ); + } + + return values; + +} + +function getCellValue ( cell ) { + + var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); + + return value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); + +} + + +//dialog确认事件 +dialog.onok = function () { + + //收集信息 + var form = document.forms[ 'data-form' ], + info = getUserConfig(); + + //添加图表类型 + info.chartType = currentChartType; + + //同步表格数据到编辑器 + syncTableData(); + + //执行图表命令 + editor.execCommand( 'charts', info ); + +}; + +/* + * 同步图表编辑视图的表格数据到编辑器里的原始表格 + */ +function syncTableData () { + + var tableData = getTableData(); + + for ( var i = 1, row; row = editorTable.rows[ i ]; i++ ) { + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + cell.innerHTML = tableData[ i ] [ j ]; + + } + + } + +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts0.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts0.png new file mode 100644 index 0000000..9485e5e Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts0.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts1.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts1.png new file mode 100644 index 0000000..b5a0039 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts1.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts2.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts2.png new file mode 100644 index 0000000..7c91a39 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts2.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts3.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts3.png new file mode 100644 index 0000000..a6bc29b Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts3.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts4.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts4.png new file mode 100644 index 0000000..742006a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts4.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts5.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts5.png new file mode 100644 index 0000000..c49a296 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/charts/images/charts5.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.css new file mode 100644 index 0000000..f801105 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.css @@ -0,0 +1,43 @@ +.jd img{ + background:transparent url(images/jxface2.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.pp img{ + background:transparent url(images/fface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:25px;height:25px;display:block; +} +.ldw img{ + background:transparent url(images/wface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.tsj img{ + background:transparent url(images/tface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.cat img{ + background:transparent url(images/cface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.bb img{ + background:transparent url(images/bface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} +.youa img{ + background:transparent url(images/yface.gif?v=1.1) no-repeat scroll left top; + cursor:pointer;width:35px;height:35px;display:block; +} + +.smileytable td {height: 37px;} +#tabPanel{margin-left:5px;overflow: hidden;} +#tabContent {float:left;background:#FFFFFF;} +#tabContent div{display: none;width:480px;overflow:hidden;} +#tabIconReview.show{left:17px;display:block;} +.menuFocus{background:#ACCD3C;} +.menuDefault{background:#FFFFFF;} +#tabIconReview{position:absolute;left:406px;left:398px \9;top:41px;z-index:65533;width:90px;height:76px;} +img.review{width:90px;height:76px;border:2px solid #9cb945;background:#FFFFFF;background-position:center;background-repeat:no-repeat;} + +.wrapper .tabbody{position:relative;float:left;clear:both;padding:10px;width: 95%;} +.tabbody table{width: 100%;} +.tabbody td{border:1px solid #BAC498;} +.tabbody td span{display: block;zoom:1;padding:0 4px;} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.html new file mode 100644 index 0000000..fca0850 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.html @@ -0,0 +1,54 @@ + + + + + + + + + + +
            +
            + + + + + + + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + +
            + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.js new file mode 100644 index 0000000..6e158a9 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/emotion.js @@ -0,0 +1,186 @@ +window.onload = function () { + editor.setOpt({ + emotionLocalization:false + }); + + emotion.SmileyPath = editor.options.emotionLocalization === true ? 'images/' : "http://img.baidu.com/hi/"; + emotion.SmileyBox = createTabList( emotion.tabNum ); + emotion.tabExist = createArr( emotion.tabNum ); + + initImgName(); + initEvtHandler( "tabHeads" ); +}; + +function initImgName() { + for ( var pro in emotion.SmilmgName ) { + var tempName = emotion.SmilmgName[pro], + tempBox = emotion.SmileyBox[pro], + tempStr = ""; + + if ( tempBox.length ) return; + for ( var i = 1; i <= tempName[1]; i++ ) { + tempStr = tempName[0]; + if ( i < 10 ) tempStr = tempStr + '0'; + tempStr = tempStr + i + '.gif'; + tempBox.push( tempStr ); + } + } +} + +function initEvtHandler( conId ) { + var tabHeads = $G( conId ); + for ( var i = 0, j = 0; i < tabHeads.childNodes.length; i++ ) { + var tabObj = tabHeads.childNodes[i]; + if ( tabObj.nodeType == 1 ) { + domUtils.on( tabObj, "click", (function ( index ) { + return function () { + switchTab( index ); + }; + })( j ) ); + j++; + } + } + switchTab( 0 ); + $G( "tabIconReview" ).style.display = 'none'; +} + +function InsertSmiley( url, evt ) { + var obj = { + src:editor.options.emotionLocalization ? editor.options.UEDITOR_HOME_URL + "dialogs/emotion/" + url : url + }; + obj._src = obj.src; + editor.execCommand( 'insertimage', obj ); + if ( !evt.ctrlKey ) { + dialog.popup.hide(); + } +} + +function switchTab( index ) { + + autoHeight( index ); + if ( emotion.tabExist[index] == 0 ) { + emotion.tabExist[index] = 1; + createTab( 'tab' + index ); + } + //获取呈现元素句柄数组 + var tabHeads = $G( "tabHeads" ).getElementsByTagName( "span" ), + tabBodys = $G( "tabBodys" ).getElementsByTagName( "div" ), + i = 0, L = tabHeads.length; + //隐藏所有呈现元素 + for ( ; i < L; i++ ) { + tabHeads[i].className = ""; + tabBodys[i].style.display = "none"; + } + //显示对应呈现元素 + tabHeads[index].className = "focus"; + tabBodys[index].style.display = "block"; +} + +function autoHeight( index ) { + var iframe = dialog.getDom( "iframe" ), + parent = iframe.parentNode.parentNode; + switch ( index ) { + case 0: + iframe.style.height = "380px"; + parent.style.height = "392px"; + break; + case 1: + iframe.style.height = "220px"; + parent.style.height = "232px"; + break; + case 2: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 3: + iframe.style.height = "300px"; + parent.style.height = "312px"; + break; + case 4: + iframe.style.height = "140px"; + parent.style.height = "152px"; + break; + case 5: + iframe.style.height = "260px"; + parent.style.height = "272px"; + break; + case 6: + iframe.style.height = "230px"; + parent.style.height = "242px"; + break; + default: + + } +} + + +function createTab( tabName ) { + var faceVersion = "?v=1.1", //版本号 + tab = $G( tabName ), //获取将要生成的Div句柄 + imagePath = emotion.SmileyPath + emotion.imageFolders[tabName], //获取显示表情和预览表情的路径 + positionLine = 11 / 2, //中间数 + iWidth = iHeight = 35, //图片长宽 + iColWidth = 3, //表格剩余空间的显示比例 + tableCss = emotion.imageCss[tabName], + cssOffset = emotion.imageCssOffset[tabName], + textHTML = [''], + i = 0, imgNum = emotion.SmileyBox[tabName].length, imgColNum = 11, faceImage, + sUrl, realUrl, posflag, offset, infor; + + for ( ; i < imgNum; ) { + textHTML.push( '' ); + for ( var j = 0; j < imgColNum; j++, i++ ) { + faceImage = emotion.SmileyBox[tabName][i]; + if ( faceImage ) { + sUrl = imagePath + faceImage + faceVersion; + realUrl = imagePath + faceImage; + posflag = j < positionLine ? 0 : 1; + offset = cssOffset * i * (-1) - 1; + infor = emotion.SmileyInfor[tabName][i]; + + textHTML.push( '' ); + } + textHTML.push( '' ); + } + textHTML.push( '
            ' ); + textHTML.push( '' ); + textHTML.push( '' ); + textHTML.push( '' ); + } else { + textHTML.push( '' ); + } + textHTML.push( '
            ' ); + textHTML = textHTML.join( "" ); + tab.innerHTML = textHTML; +} + +function over( td, srcPath, posFlag ) { + td.style.backgroundColor = "#ACCD3C"; + $G( 'faceReview' ).style.backgroundImage = "url(" + srcPath + ")"; + if ( posFlag == 1 ) $G( "tabIconReview" ).className = "show"; + $G( "tabIconReview" ).style.display = 'block'; +} + +function out( td ) { + td.style.backgroundColor = "transparent"; + var tabIconRevew = $G( "tabIconReview" ); + tabIconRevew.className = ""; + tabIconRevew.style.display = 'none'; +} + +function createTabList( tabNum ) { + var obj = {}; + for ( var i = 0; i < tabNum; i++ ) { + obj["tab" + i] = []; + } + return obj; +} + +function createArr( tabNum ) { + var arr = []; + for ( var i = 0; i < tabNum; i++ ) { + arr[i] = 0; + } + return arr; +} + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/0.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/0.gif new file mode 100644 index 0000000..6964168 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/0.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/bface.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/bface.gif new file mode 100644 index 0000000..14fe618 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/bface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/cface.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/cface.gif new file mode 100644 index 0000000..bff947f Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/cface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/fface.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/fface.gif new file mode 100644 index 0000000..0d8a6af Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/fface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/jxface2.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/jxface2.gif new file mode 100644 index 0000000..a959c90 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/jxface2.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/neweditor-tab-bg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/neweditor-tab-bg.png new file mode 100644 index 0000000..8f398b0 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/neweditor-tab-bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/tface.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/tface.gif new file mode 100644 index 0000000..1354f54 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/tface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/wface.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/wface.gif new file mode 100644 index 0000000..5667160 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/wface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/yface.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/yface.gif new file mode 100644 index 0000000..51608be Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/emotion/images/yface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/gmap/gmap.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/gmap/gmap.html new file mode 100644 index 0000000..c4cbfe6 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/gmap/gmap.html @@ -0,0 +1,89 @@ + + + + + + + + + + +
            + + + + + + +
            +
            +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.css new file mode 100644 index 0000000..4478475 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.css @@ -0,0 +1,7 @@ +.wrapper{width: 370px;margin: 10px auto;zoom: 1;} +.tabbody{height: 360px;} +.tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;} +.tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;} +.tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;} +.tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;} +.tabbody table thead{font-weight: bold;line-height: 25px;} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.html new file mode 100644 index 0000000..9e50060 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.html @@ -0,0 +1,82 @@ + + + + 帮助 + + + + + +
            +
            + + +
            +
            +
            +

            UEditor

            +

            +

            +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            ctrl+b
            ctrl+c
            ctrl+x
            ctrl+v
            ctrl+y
            ctrl+z
            ctrl+i
            ctrl+u
            ctrl+a
            shift+enter
            alt+z
            +
            +
            +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.js new file mode 100644 index 0000000..9a2272e --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/help/help.js @@ -0,0 +1,56 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午1:06 + * To change this template use File | Settings | File Templates. + */ +/** + * tab点击处理事件 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler( tabHeads,tabBodys,obj ) { + //head样式更改 + for ( var k = 0, len = tabHeads.length; k < len; k++ ) { + tabHeads[k].className = ""; + } + obj.className = "focus"; + //body显隐 + var tabSrc = obj.getAttribute( "tabSrc" ); + for ( var j = 0, length = tabBodys.length; j < length; j++ ) { + var body = tabBodys[j], + id = body.getAttribute( "id" ); + body.onclick = function(){ + this.style.zoom = 1; + }; + if ( id != tabSrc ) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB切换 + * @param tabParentId tab的父节点ID或者对象本身 + */ +function switchTab( tabParentId ) { + var tabElements = $G( tabParentId ).children, + tabHeads = tabElements[0].children, + tabBodys = tabElements[1].children; + + for ( var i = 0, length = tabHeads.length; i < length; i++ ) { + var head = tabHeads[i]; + if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + head.onclick = function () { + clickHandler(tabHeads,tabBodys,this); + } + } +} +switchTab("helptab"); + +document.getElementById('version').innerHTML = parent.UE.version; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.css new file mode 100644 index 0000000..52c2295 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.css @@ -0,0 +1,894 @@ +@charset "utf-8"; +/* dialog样式 */ +.wrapper { + zoom: 1; + width: 630px; + *width: 626px; + height: 380px; + margin: 0 auto; + padding: 10px; + position: relative; + font-family: sans-serif; +} + +/*tab样式框大小*/ +.tabhead { + float:left; +} +.tabbody { + width: 100%; + height: 346px; + position: relative; + clear: both; +} + +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} + +.tabbody .panel.focus { + width: 100%; + height: 346px; + display: block; +} + +/* 图片对齐方式 */ +.alignBar{ + float:right; + margin-top: 5px; + position: relative; +} + +.alignBar .algnLabel{ + float:left; + height: 20px; + line-height: 20px; +} + +.alignBar #alignIcon{ + zoom:1; + _display: inline; + display: inline-block; + position: relative; +} +.alignBar #alignIcon span{ + float: left; + cursor: pointer; + display: block; + width: 19px; + height: 17px; + margin-right: 3px; + margin-left: 3px; + background-image: url(./images/alignicon.jpg); +} +.alignBar #alignIcon .none-align{ + background-position: 0 -18px; +} +.alignBar #alignIcon .left-align{ + background-position: -20px -18px; +} +.alignBar #alignIcon .right-align{ + background-position: -40px -18px; +} +.alignBar #alignIcon .center-align{ + background-position: -60px -18px; +} +.alignBar #alignIcon .none-align.focus{ + background-position: 0 0; +} +.alignBar #alignIcon .left-align.focus{ + background-position: -20px 0; +} +.alignBar #alignIcon .right-align.focus{ + background-position: -40px 0; +} +.alignBar #alignIcon .center-align.focus{ + background-position: -60px 0; +} + + + + +/* 远程图片样式 */ +#remote { + z-index: 200; +} + +#remote .top{ + width: 100%; + margin-top: 25px; +} +#remote .left{ + display: block; + float: left; + width: 300px; + height:10px; +} +#remote .right{ + display: block; + float: right; + width: 300px; + height:10px; +} +#remote .row{ + margin-left: 20px; + clear: both; + height: 40px; +} + +#remote .row label{ + text-align: center; + width: 50px; + zoom:1; + _display: inline; + display:inline-block; + vertical-align: middle; +} +#remote .row label.algnLabel{ + float: left; + +} + +#remote input.text{ + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +#remote input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#remote #url{ + width: 500px; + margin-bottom: 2px; +} +#remote #width, +#remote #height{ + width: 20px; + margin-left: 2px; + margin-right: 2px; +} +#remote #border, +#remote #vhSpace, +#remote #title{ + width: 180px; + margin-right: 5px; +} +#remote #lock{ +} +#remote #lockicon{ + zoom: 1; + _display:inline; + display: inline-block; + width: 20px; + height: 20px; + background: url("../../themes/default/images/lock.gif") -13px -13px no-repeat; + vertical-align: middle; +} +#remote #preview{ + clear: both; + width: 260px; + height: 240px; + z-index: 9999; + margin-top: 10px; + background-color: #eee; + overflow: hidden; +} + +/* 上传图片 */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} + +.tabbody #upload.panel.focus { + width: 100%; + height: 346px; + display: block; + clip: auto; +} + +#upload .queueList { + margin: 0; + width: 100%; + height: 100%; + position: absolute; + overflow: hidden; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 172px; + padding-top: 150px; + text-align: center; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *top: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 300px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; + position: relative; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 9px 0 0 9px; + *margin: 6px 0 0 6px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display:none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background: url(./images/success.gif) no-repeat right bottom \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + + +/* 图片管理样式 */ +#online { + width: 100%; + height: 336px; + padding: 10px 0 0 0; +} +#online #imageList{ + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + position: relative; +} +#online ul { + display: block; + list-style: none; + margin: 0; + padding: 0; +} +#online li { + float: left; + display: block; + list-style: none; + padding: 0; + width: 113px; + height: 113px; + margin: 0 0 9px 9px; + *margin: 0 0 6px 6px; + background-color: #eee; + overflow: hidden; + cursor: pointer; + position: relative; +} +#online li.clearFloat { + float: none; + clear: both; + display: block; + width:0; + height:0; + margin: 0; + padding: 0; +} +#online li img { + cursor: pointer; +} +#online li .icon { + cursor: pointer; + width: 113px; + height: 113px; + position: absolute; + top: 0; + left: 0; + z-index: 2; + border: 0; + background-repeat: no-repeat; +} +#online li .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; +} +#online li.selected .icon { + background-image: url(images/success.png); + background-image: url(images/success.gif)\9; + background-position: 75px 75px; +} +#online li.selected .icon:hover { + width: 107px; + height: 107px; + border: 3px solid #1094fa; + background-position: 72px 72px; +} + + +/* 图片搜索样式 */ +#search .searchBar { + width: 100%; + height: 30px; + margin: 10px 0 5px 0; + padding: 0; +} + +#search input.text{ + width: 150px; + padding: 3px 6px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +#search input.text:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); +} +#search input.searchTxt { + margin-left:5px; + padding-left: 5px; + background: #FFF; + width: 300px; + *width: 260px; + height: 21px; + line-height: 21px; + float: left; + dislay: block; +} + +#search .searchType { + width: 65px; + height: 28px; + padding:0; + line-height: 28px; + border: 1px solid #d7d7d7; + border-radius: 0; + vertical-align: top; + margin-left: 5px; + float: left; + dislay: block; +} + +#search #searchBtn, +#search #searchReset { + display: inline-block; + margin-bottom: 0; + margin-right: 5px; + padding: 4px 10px; + font-weight: 400; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + font-size: 14px; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + vertical-align: top; + float: right; +} + +#search #searchBtn { + color: white; + border-color: #285e8e; + background-color: #3b97d7; +} +#search #searchReset { + color: #333; + border-color: #ccc; + background-color: #fff; +} +#search #searchBtn:hover { + background-color: #3276b1; +} +#search #searchReset:hover { + background-color: #eee; +} + +#search .msg { + margin-left: 5px; +} + +#search .searchList{ + width: 100%; + height: 300px; + overflow: hidden; + clear: both; +} +#search .searchList ul{ + margin:0; + padding:0; + list-style:none; + clear: both; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + zoom: 1; + position: relative; +} + +#search .searchList li { + list-style:none; + float: left; + display: block; + width: 115px; + margin: 5px 10px 5px 20px; + *margin: 5px 10px 5px 15px; + padding:0; + font-size: 12px; + box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3); + position: relative; + vertical-align: top; + text-align: center; + overflow: hidden; + cursor: pointer; + filter: alpha(Opacity=100); + -moz-opacity: 1; + opacity: 1; + border: 2px solid #eee; +} + +#search .searchList li.selected { + filter: alpha(Opacity=40); + -moz-opacity: 0.4; + opacity: 0.4; + border: 2px solid #00a0e9; +} + +#search .searchList li p { + background-color: #eee; + margin: 0; + padding: 0; + position: relative; + width:100%; + height:115px; + overflow: hidden; +} + +#search .searchList li p img { + cursor: pointer; + border: 0; +} + +#search .searchList li a { + color: #999; + border-top: 1px solid #F2F2F2; + background: #FAFAFA; + text-align: center; + display: block; + padding: 0 5px; + width: 105px; + height:32px; + line-height:32px; + white-space:nowrap; + text-overflow:ellipsis; + text-decoration: none; + overflow: hidden; + word-break: break-all; +} + +#search .searchList a:hover { + text-decoration: underline; + color: #333; +} +#search .searchList .clearFloat{ + clear: both; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.html new file mode 100644 index 0000000..5245413 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.html @@ -0,0 +1,120 @@ + + + + + ueditor图片对话框 + + + + + + + + + + + + + + +
            +
            + + + +
            +
            + + + + + + + + +
            +
            + + +
            +
            +
            + + +
            +
            +
            +
            + +   px +   px + +
            +
            + + px +
            +
            + + px +
            +
            + + +
            +
            +
            +
            + + +
            +
            +
            +
            + 0% + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
              +
            • +
            +
            +
            + + +
            +
            +
            + + + + +
            +
            + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.js new file mode 100644 index 0000000..dee16bb --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/image.js @@ -0,0 +1,1142 @@ +/** + * User: Jinqn + * Date: 14-04-08 + * Time: 下午16:34 + * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片 + */ + +(function () { + + var remoteImage, + uploadImage, + onlineImage, + searchImage; + + window.onload = function () { + initTabs(); + initAlign(); + initButtons(); + }; + + /* 初始化tab标签 */ + function initTabs() { + var tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var target = e.target || e.srcElement; + setTabFocus(target.getAttribute('data-content-id')); + }); + } + + var img = editor.selection.getRange().getClosedNode(); + if (img && img.tagName && img.tagName.toLowerCase() == 'img') { + setTabFocus('remote'); + } else { + setTabFocus('upload'); + } + } + + /* 初始化tabbody */ + function setTabFocus(id) { + if(!id) return; + var i, bodyId, tabs = $G('tabhead').children; + for (i = 0; i < tabs.length; i++) { + bodyId = tabs[i].getAttribute('data-content-id'); + if (bodyId == id) { + domUtils.addClass(tabs[i], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + } else { + domUtils.removeClasses(tabs[i], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + switch (id) { + case 'remote': + remoteImage = remoteImage || new RemoteImage(); + break; + case 'upload': + setAlign(editor.getOpt('imageInsertAlign')); + uploadImage = uploadImage || new UploadImage('queueList'); + break; + case 'online': + setAlign(editor.getOpt('imageManagerInsertAlign')); + onlineImage = onlineImage || new OnlineImage('imageList'); + onlineImage.reset(); + break; + case 'search': + setAlign(editor.getOpt('imageManagerInsertAlign')); + searchImage = searchImage || new SearchImage(); + break; + } + } + + /* 初始化onok事件 */ + function initButtons() { + + dialog.onok = function () { + var remote = false, list = [], id, tabs = $G('tabhead').children; + for (var i = 0; i < tabs.length; i++) { + if (domUtils.hasClass(tabs[i], 'focus')) { + id = tabs[i].getAttribute('data-content-id'); + break; + } + } + + switch (id) { + case 'remote': + list = remoteImage.getInsertList(); + break; + case 'upload': + list = uploadImage.getInsertList(); + var count = uploadImage.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } + break; + case 'online': + list = onlineImage.getInsertList(); + break; + case 'search': + list = searchImage.getInsertList(); + remote = true; + break; + } + + if(list) { + editor.execCommand('insertimage', list); + remote && editor.fireEvent("catchRemoteImage"); + } + }; + } + + + /* 初始化对其方式的点击事件 */ + function initAlign(){ + /* 点击align图标 */ + domUtils.on($G("alignIcon"), 'click', function(e){ + var target = e.target || e.srcElement; + if(target.className && target.className.indexOf('-align') != -1) { + setAlign(target.getAttribute('data-align')); + } + }); + } + + /* 设置对齐方式 */ + function setAlign(align){ + align = align || 'none'; + var aligns = $G("alignIcon").children; + for(i = 0; i < aligns.length; i++){ + if(aligns[i].getAttribute('data-align') == align) { + domUtils.addClass(aligns[i], 'focus'); + $G("align").value = aligns[i].getAttribute('data-align'); + } else { + domUtils.removeClasses(aligns[i], 'focus'); + } + } + } + /* 获取对齐方式 */ + function getAlign(){ + var align = $G("align").value || 'none'; + return align == 'none' ? '':align; + } + + + /* 在线图片 */ + function RemoteImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + RemoteImage.prototype = { + init: function () { + this.initContainer(); + this.initEvents(); + }, + initContainer: function () { + this.dom = { + 'url': $G('url'), + 'width': $G('width'), + 'height': $G('height'), + 'border': $G('border'), + 'vhSpace': $G('vhSpace'), + 'title': $G('title'), + 'align': $G('align') + }; + var img = editor.selection.getRange().getClosedNode(); + if (img) { + this.setImage(img); + } + }, + initEvents: function () { + var _this = this, + locker = $G('lock'); + + /* 改变url */ + domUtils.on($G("url"), 'keyup', updatePreview); + domUtils.on($G("border"), 'keyup', updatePreview); + domUtils.on($G("title"), 'keyup', updatePreview); + + domUtils.on($G("width"), 'keyup', function(){ + updatePreview(); + if(locker.checked) { + var proportion =locker.getAttribute('data-proportion'); + $G('height').value = Math.round(this.value / proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("height"), 'keyup', function(){ + updatePreview(); + if(locker.checked) { + var proportion =locker.getAttribute('data-proportion'); + $G('width').value = Math.round(this.value * proportion); + } else { + _this.updateLocker(); + } + }); + domUtils.on($G("lock"), 'change', function(){ + var proportion = parseInt($G("width").value) /parseInt($G("height").value); + locker.setAttribute('data-proportion', proportion); + }); + + function updatePreview(){ + _this.setPreview(); + } + }, + updateLocker: function(){ + var width = $G('width').value, + height = $G('height').value, + locker = $G('lock'); + if(width && height && width == parseInt(width) && height == parseInt(height)) { + locker.disabled = false; + locker.title = ''; + } else { + locker.checked = false; + locker.disabled = 'disabled'; + locker.title = lang.remoteLockError; + } + }, + setImage: function(img){ + /* 不是正常的图片 */ + if (!img.tagName || img.tagName.toLowerCase() != 'img' && !img.getAttribute("src") || !img.src) return; + + var wordImgFlag = img.getAttribute("word_img"), + src = wordImgFlag ? wordImgFlag.replace("&", "&") : (img.getAttribute('_src') || img.getAttribute("src", 2).replace("&", "&")), + align = editor.queryCommandValue("imageFloat"); + + /* 防止onchange事件循环调用 */ + if (src !== $G("url").value) $G("url").value = src; + if(src) { + /* 设置表单内容 */ + $G("width").value = img.width || ''; + $G("height").value = img.height || ''; + $G("border").value = img.getAttribute("border") || '0'; + $G("vhSpace").value = img.getAttribute("vspace") || '0'; + $G("title").value = img.title || img.alt || ''; + setAlign(align); + this.setPreview(); + this.updateLocker(); + } + }, + getData: function(){ + var data = {}; + for(var k in this.dom){ + data[k] = this.dom[k].value; + } + return data; + }, + setPreview: function(){ + var url = $G('url').value, + ow = parseInt($G('width').value, 10) || 0, + oh = parseInt($G('height').value, 10) || 0, + border = parseInt($G('border').value, 10) || 0, + title = $G('title').value, + preview = $G('preview'), + width, + height; + + url = utils.unhtmlForUrl(url); + title = utils.unhtml(title); + + width = ((!ow || !oh) ? preview.offsetWidth:Math.min(ow, preview.offsetWidth)); + width = width+(border*2) > preview.offsetWidth ? width:(preview.offsetWidth - (border*2)); + height = (!ow || !oh) ? '':width*oh/ow; + + if(url) { + preview.innerHTML = ''; + } + }, + getInsertList: function () { + var data = this.getData(); + if(data['url']) { + return [{ + src: data['url'], + _src: data['url'], + width: data['width'] || '', + height: data['height'] || '', + border: data['border'] || '', + floatStyle: data['align'] || '', + vspace: data['vhSpace'] || '', + title: data['title'] || '', + alt: data['title'] || '', + style: "width:" + data['width'] + "px;height:" + data['height'] + "px;" + }]; + } else { + return []; + } + } + }; + + + + /* 上传图片 */ + function UploadImage(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadImage.prototype = { + init: function () { + this.imageList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('imageActionName')), + acceptExtensions = (editor.getOpt('imageAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, ''), + imageMaxSize = editor.getOpt('imageMaxSize'), + imageCompressBorder = editor.getOpt('imageCompressBorder'); + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
            ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('imageActionName')) { + $('#filePickerReady').after($('
            ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + accept: { + title: 'Images', + extensions: acceptExtensions, + mimeTypes: 'image/*' + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('imageFieldName'), + duplicate: true, + fileSingleSizeLimit: imageMaxSize, // 默认 2 M + compress: editor.getOpt('imageCompressEnable') ? { + width: imageCompressBorder, + height: imageCompressBorder, + // 图片质量,只有type为`image/jpeg`的时候才有效。 + quality: 90, + // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false. + allowMagnify: false, + // 是否允许裁剪。 + crop: false, + // 是否保留头部meta信息。 + preserveHeaders: true + }:false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
          • ' + + '

            ' + file.name + '

            ' + + '

            ' + + '

            ' + + '
          • '), + + $btns = $('
            ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
            ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

            ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + _this.imageList.push(json); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + destroy: function () { + this.$wrap.remove(); + }, + getInsertList: function () { + var i, data, list = [], + align = getAlign(), + prefix = editor.getOpt('imageUrlPrefix'); + for (i = 0; i < this.imageList.length; i++) { + data = this.imageList[i]; + list.push({ + src: prefix + data.url, + _src: prefix + data.url, + title: data.title, + alt: data.original, + floatStyle: align + }); + } + return list; + } + }; + + + /* 在线图片 */ + function OnlineImage(target) { + this.container = utils.isString(target) ? document.getElementById(target) : target; + this.init(); + } + OnlineImage.prototype = { + init: function () { + this.reset(); + this.initEvents(); + }, + /* 初始化容器 */ + initContainer: function () { + this.container.innerHTML = ''; + this.list = document.createElement('ul'); + this.clearFloat = document.createElement('li'); + + domUtils.addClass(this.list, 'list'); + domUtils.addClass(this.clearFloat, 'clearFloat'); + + this.list.appendChild(this.clearFloat); + this.container.appendChild(this.list); + }, + /* 初始化滚动事件,滚动到地步自动拉取数据 */ + initEvents: function () { + var _this = this; + + /* 滚动拉取图片 */ + domUtils.on($G('imageList'), 'scroll', function(e){ + var panel = this; + if (panel.scrollHeight - (panel.offsetHeight + panel.scrollTop) < 10) { + _this.getImageData(); + } + }); + /* 选中图片 */ + domUtils.on(this.container, 'click', function (e) { + var target = e.target || e.srcElement, + li = target.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + /* 初始化第一次的数据 */ + initData: function () { + + /* 拉取数据需要使用的值 */ + this.state = 0; + this.listSize = editor.getOpt('imageManagerListSize'); + this.listIndex = 0; + this.listEnd = false; + + /* 第一次拉取数据 */ + this.getImageData(); + }, + /* 重置界面 */ + reset: function() { + this.initContainer(); + this.initData(); + }, + /* 向后台拉取图片列表数据 */ + getImageData: function () { + var _this = this; + + if(!_this.listEnd && !this.isLoadingData) { + this.isLoadingData = true; + var url = editor.getActionUrl(editor.getOpt('imageManagerActionName')), + isJsonp = utils.isCrossDomainUrl(url); + ajax.request(url, { + 'timeout': 100000, + 'dataType': isJsonp ? 'jsonp':'', + 'data': utils.extend({ + start: this.listIndex, + size: this.listSize + }, editor.queryCommandValue('serverparam')), + 'method': 'get', + 'onsuccess': function (r) { + try { + var json = isJsonp ? r:eval('(' + r.responseText + ')'); + if (json.state == 'SUCCESS') { + _this.pushData(json.list); + _this.listIndex = parseInt(json.start) + parseInt(json.list.length); + if(_this.listIndex >= json.total) { + _this.listEnd = true; + } + _this.isLoadingData = false; + } + } catch (e) { + if(r.responseText.indexOf('ue_separate_ue') != -1) { + var list = r.responseText.split(r.responseText); + _this.pushData(list); + _this.listIndex = parseInt(list.length); + _this.listEnd = true; + _this.isLoadingData = false; + } + } + }, + 'onerror': function () { + _this.isLoadingData = false; + } + }); + } + }, + /* 添加图片到列表界面上 */ + pushData: function (list) { + var i, item, img, icon, _this = this, + urlPrefix = editor.getOpt('imageManagerUrlPrefix'); + for (i = 0; i < list.length; i++) { + if(list[i] && list[i].url) { + item = document.createElement('li'); + img = document.createElement('img'); + icon = document.createElement('span'); + + domUtils.on(img, 'load', (function(image){ + return function(){ + _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight); + } + })(img)); + img.width = 113; + img.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) ); + img.setAttribute('_src', urlPrefix + list[i].url); + domUtils.addClass(icon, 'icon'); + + item.appendChild(img); + item.appendChild(icon); + this.list.insertBefore(item, this.clearFloat); + } + } + }, + /* 改变图片大小 */ + scale: function (img, w, h, type) { + var ow = img.width, + oh = img.height; + + if (type == 'justify') { + if (ow >= oh) { + img.width = w; + img.height = h * oh / ow; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w * ow / oh; + img.height = h; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } else { + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + } + }, + getInsertList: function () { + var i, lis = this.list.children, list = [], align = getAlign(); + for (i = 0; i < lis.length; i++) { + if (domUtils.hasClass(lis[i], 'selected')) { + var img = lis[i].firstChild, + src = img.getAttribute('_src'); + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + + } + return list; + } + }; + + /*搜索图片 */ + function SearchImage() { + this.init(); + } + SearchImage.prototype = { + init: function () { + this.initEvents(); + }, + initEvents: function(){ + var _this = this; + + /* 点击搜索按钮 */ + domUtils.on($G('searchBtn'), 'click', function(){ + var key = $G('searchTxt').value; + if(key && key != lang.searchRemind) { + _this.getImageData(); + } + }); + /* 点击清除妞 */ + domUtils.on($G('searchReset'), 'click', function(){ + $G('searchTxt').value = lang.searchRemind; + $G('searchListUl').innerHTML = ''; + $G('searchType').selectedIndex = 0; + }); + /* 搜索框聚焦 */ + domUtils.on($G('searchTxt'), 'focus', function(){ + var key = $G('searchTxt').value; + if(key && key == lang.searchRemind) { + $G('searchTxt').value = ''; + } + }); + /* 搜索框回车键搜索 */ + domUtils.on($G('searchTxt'), 'keydown', function(e){ + var keyCode = e.keyCode || e.which; + if (keyCode == 13) { + $G('searchBtn').click(); + } + }); + + /* 选中图片 */ + domUtils.on($G('searchList'), 'click', function(e){ + var target = e.target || e.srcElement, + li = target.parentNode.parentNode; + + if (li.tagName.toLowerCase() == 'li') { + if (domUtils.hasClass(li, 'selected')) { + domUtils.removeClasses(li, 'selected'); + } else { + domUtils.addClass(li, 'selected'); + } + } + }); + }, + encodeToGb2312:function (str){ + if(!str) return ''; + var strOut = "", + z = 'D2BBB6A18140C6DF814181428143CDF2D5C9C8FDC9CFCFC2D8A2B2BBD3EB8144D8A4B3F38145D7A8C7D2D8A7CAC08146C7F0B1FBD2B5B4D4B6ABCBBFD8A9814781488149B6AA814AC1BDD1CF814BC9A5D8AD814CB8F6D1BEE3DCD6D0814D814EB7E1814FB4AE8150C1D98151D8BC8152CDE8B5A4CEAAD6F78153C0F6BED9D8AF815481558156C4CB8157BEC38158D8B1C3B4D2E58159D6AECEDAD5A7BAF5B7A6C0D6815AC6B9C5D2C7C7815BB9D4815CB3CBD2D2815D815ED8BFBEC5C6F2D2B2CFB0CFE7815F816081618162CAE981638164D8C081658166816781688169816AC2F2C2D2816BC8E9816C816D816E816F817081718172817381748175C7AC8176817781788179817A817B817CC1CB817DD3E8D5F9817ECAC2B6FED8A1D3DABFF78180D4C6BBA5D8C1CEE5BEAE81818182D8A88183D1C7D0A9818481858186D8BDD9EFCDF6BFBA8187BDBBBAA5D2E0B2FABAE0C4B68188CFEDBEA9CDA4C1C18189818A818BC7D7D9F1818CD9F4818D818E818F8190C8CBD8E9819181928193D2DACAB2C8CAD8ECD8EAD8C6BDF6C6CDB3F08194D8EBBDF1BDE98195C8D4B4D381968197C2D88198B2D6D7D0CACBCBFBD5CCB8B6CFC98199819A819BD9DAD8F0C7AA819CD8EE819DB4FAC1EED2D4819E819FD8ED81A0D2C7D8EFC3C781A181A281A3D1F681A4D6D9D8F281A5D8F5BCFEBCDB81A681A781A8C8CE81A9B7DD81AAB7C281ABC6F381AC81AD81AE81AF81B081B181B2D8F8D2C181B381B4CEE9BCBFB7FCB7A5D0DD81B581B681B781B881B9D6DAD3C5BBEFBBE1D8F181BA81BBC9A1CEB0B4AB81BCD8F381BDC9CBD8F6C2D7D8F781BE81BFCEB1D8F981C081C181C2B2AEB9C081C3D9A381C4B0E981C5C1E681C6C9EC81C7CBC581C8CBC6D9A481C981CA81CB81CC81CDB5E881CE81CFB5AB81D081D181D281D381D481D5CEBBB5CDD7A1D7F4D3D381D6CCE581D7BACE81D8D9A2D9DCD3E0D8FDB7F0D7F7D8FED8FAD9A1C4E381D981DAD3B6D8F4D9DD81DBD8FB81DCC5E581DD81DEC0D081DF81E0D1F0B0DB81E181E2BCD1D9A681E3D9A581E481E581E681E7D9ACD9AE81E8D9ABCAB981E981EA81EBD9A9D6B681EC81ED81EEB3DED9A881EFC0FD81F0CACC81F1D9AA81F2D9A781F381F4D9B081F581F6B6B181F781F881F9B9A981FAD2C081FB81FCCFC081FD81FEC2C28240BDC4D5ECB2E0C7C8BFEBD9AD8241D9AF8242CEEABAEE82438244824582468247C7D682488249824A824B824C824D824E824F8250B1E3825182528253B4D9B6EDD9B48254825582568257BFA182588259825AD9DEC7CEC0FED9B8825B825C825D825E825FCBD7B7FD8260D9B58261D9B7B1A3D3E1D9B98262D0C58263D9B682648265D9B18266D9B2C1A9D9B382678268BCF3D0DEB8A98269BEE3826AD9BD826B826C826D826ED9BA826FB0B3827082718272D9C28273827482758276827782788279827A827B827C827D827E8280D9C4B1B68281D9BF82828283B5B98284BEF3828582868287CCC8BAF2D2D08288D9C38289828ABDE8828BB3AB828C828D828ED9C5BEEB828FD9C6D9BBC4DF8290D9BED9C1D9C0829182928293829482958296829782988299829A829BD5AE829CD6B5829DC7E3829E829F82A082A1D9C882A282A382A4BCD9D9CA82A582A682A7D9BC82A8D9CBC6AB82A982AA82AB82AC82ADD9C982AE82AF82B082B1D7F682B2CDA382B382B482B582B682B782B882B982BABDA182BB82BC82BD82BE82BF82C0D9CC82C182C282C382C482C582C682C782C882C9C5BCCDB582CA82CB82CCD9CD82CD82CED9C7B3A5BFFE82CF82D082D182D2B8B582D382D4C0FC82D582D682D782D8B0F882D982DA82DB82DC82DD82DE82DF82E082E182E282E382E482E582E682E782E882E982EA82EB82EC82EDB4F682EED9CE82EFD9CFB4A2D9D082F082F1B4DF82F282F382F482F582F6B0C182F782F882F982FA82FB82FC82FDD9D1C9B582FE8340834183428343834483458346834783488349834A834B834C834D834E834F83508351CFF1835283538354835583568357D9D283588359835AC1C5835B835C835D835E835F836083618362836383648365D9D6C9AE8366836783688369D9D5D9D4D9D7836A836B836C836DCBDB836EBDA9836F8370837183728373C6A7837483758376837783788379837A837B837C837DD9D3D9D8837E83808381D9D9838283838384838583868387C8E583888389838A838B838C838D838E838F839083918392839383948395C0DC8396839783988399839A839B839C839D839E839F83A083A183A283A383A483A583A683A783A883A983AA83AB83AC83AD83AE83AF83B083B183B2B6F9D8A3D4CA83B3D4AAD0D6B3E4D5D783B4CFC8B9E283B5BFCB83B6C3E283B783B883B9B6D283BA83BBCDC3D9EED9F083BC83BD83BEB5B383BFB6B583C083C183C283C383C4BEA483C583C6C8EB83C783C8C8AB83C983CAB0CBB9ABC1F9D9E283CBC0BCB9B283CCB9D8D0CBB1F8C6E4BEDFB5E4D7C883CDD1F8BCE6CADE83CE83CFBCBDD9E6D8E783D083D1C4DA83D283D3B8D4C8BD83D483D5B2E1D4D983D683D783D883D9C3B083DA83DBC3E1DAA2C8DF83DCD0B483DDBEFCC5A983DE83DF83E0B9DA83E1DAA383E2D4A9DAA483E383E483E583E683E7D9FBB6AC83E883E9B7EBB1F9D9FCB3E5BEF683EABFF6D2B1C0E483EB83EC83EDB6B3D9FED9FD83EE83EFBEBB83F083F183F2C6E083F3D7BCDAA183F4C1B983F5B5F2C1E883F683F7BCF583F8B4D583F983FA83FB83FC83FD83FE844084418442C1DD8443C4FD84448445BCB8B7B284468447B7EF84488449844A844B844C844DD9EC844EC6BE844FBFADBBCB84508451B5CA8452DBC9D0D78453CDB9B0BCB3F6BBF7DBCABAAF8454D4E4B5B6B5F3D8D6C8D084558456B7D6C7D0D8D78457BFAF84588459DBBBD8D8845A845BD0CCBBAE845C845D845EEBBEC1D0C1F5D4F2B8D5B4B4845FB3F584608461C9BE846284638464C5D0846584668467C5D9C0FB8468B1F08469D8D9B9CE846AB5BD846B846CD8DA846D846ED6C6CBA2C8AFC9B2B4CCBFCC846FB9F48470D8DBD8DCB6E7BCC1CCEA847184728473847484758476CFF78477D8DDC7B084788479B9D0BDA3847A847BCCDE847CC6CA847D847E848084818482D8E08483D8DE84848485D8DF848684878488B0FE8489BEE7848ACAA3BCF4848B848C848D848EB8B1848F8490B8EE849184928493849484958496849784988499849AD8E2849BBDCB849CD8E4D8E3849D849E849F84A084A1C5FC84A284A384A484A584A684A784A8D8E584A984AAD8E684AB84AC84AD84AE84AF84B084B1C1A684B2C8B0B0ECB9A6BCD3CEF1DBBDC1D384B384B484B584B6B6AFD6FAC5ACBDD9DBBEDBBF84B784B884B9C0F8BEA2C0CD84BA84BB84BC84BD84BE84BF84C084C184C284C3DBC0CAC684C484C584C6B2AA84C784C884C9D3C284CAC3E384CBD1AB84CC84CD84CE84CFDBC284D0C0D584D184D284D3DBC384D4BFB184D584D684D784D884D984DAC4BC84DB84DC84DD84DEC7DA84DF84E084E184E284E384E484E584E684E784E884E9DBC484EA84EB84EC84ED84EE84EF84F084F1D9E8C9D784F284F384F4B9B4CEF0D4C884F584F684F784F8B0FCB4D284F9D0D984FA84FB84FC84FDD9E984FEDECBD9EB8540854185428543D8B0BBAFB1B18544B3D7D8CE85458546D4D185478548BDB3BFEF8549CFBB854A854BD8D0854C854D854EB7CB854F85508551D8D185528553855485558556855785588559855A855BC6A5C7F8D2BD855C855DD8D2C4E4855ECAAE855FC7A78560D8A68561C9FDCEE7BBDCB0EB856285638564BBAAD0AD8565B1B0D7E4D7BF8566B5A5C2F4C4CF85678568B2A98569B2B7856AB1E5DFB2D5BCBFA8C2ACD8D5C2B1856BD8D4CED4856CDAE0856DCEC0856E856FD8B4C3AED3A1CEA38570BCB4C8B4C2D18571BEEDD0B68572DAE18573857485758576C7E485778578B3A78579B6F2CCFCC0FA857A857BC0F7857CD1B9D1E1D8C7857D857E85808581858285838584B2DE85858586C0E58587BAF185888589D8C8858AD4AD858B858CCFE1D8C9858DD8CACFC3858EB3F8BEC7858F859085918592D8CB8593859485958596859785988599DBCC859A859B859C859DC8A5859E859F85A0CFD885A1C8FEB2CE85A285A385A485A585A6D3D6B2E6BCB0D3D1CBABB7B485A785A885A9B7A285AA85ABCAE585ACC8A1CADCB1E4D0F085ADC5D185AE85AF85B0DBC5B5FE85B185B2BFDAB9C5BEE4C1ED85B3DFB6DFB5D6BBBDD0D5D9B0C8B6A3BFC9CCA8DFB3CAB7D3D285B4D8CFD2B6BAC5CBBECCBE85B5DFB7B5F0DFB485B685B785B8D3F585B9B3D4B8F785BADFBA85BBBACFBCAAB5F585BCCDACC3FBBAF3C0F4CDC2CFF2DFB8CFC585BDC2C0DFB9C2F085BE85BF85C0BEFD85C1C1DFCDCCD2F7B7CDDFC185C2DFC485C385C4B7F1B0C9B6D6B7D485C5BAACCCFDBFD4CBB1C6F485C6D6A8DFC585C7CEE2B3B385C885C9CEFCB4B585CACEC7BAF085CBCEE185CCD1BD85CD85CEDFC085CF85D0B4F485D1B3CA85D2B8E6DFBB85D385D485D585D6C4C585D7DFBCDFBDDFBEC5BBDFBFDFC2D4B1DFC385D8C7BACED885D985DA85DB85DC85DDC4D885DEDFCA85DFDFCF85E0D6DC85E185E285E385E485E585E685E785E8DFC9DFDACEB685E9BAC7DFCEDFC8C5DE85EA85EBC9EBBAF4C3FC85EC85EDBED785EEDFC685EFDFCD85F0C5D885F185F285F385F4D5A6BACD85F5BECCD3BDB8C085F6D6E485F7DFC7B9BEBFA785F885F9C1FCDFCBDFCC85FADFD085FB85FC85FD85FE8640DFDBDFE58641DFD7DFD6D7C9DFE3DFE4E5EBD2A7DFD28642BFA98643D4DB8644BFC8DFD4864586468647CFCC86488649DFDD864AD1CA864BDFDEB0A7C6B7DFD3864CBAE5864DB6DFCDDBB9FED4D5864E864FDFDFCFECB0A5DFE7DFD1D1C6DFD5DFD8DFD9DFDC8650BBA98651DFE0DFE18652DFE2DFE6DFE8D3B486538654865586568657B8E7C5B6DFEAC9DAC1A8C4C486588659BFDECFF8865A865B865CD5DCDFEE865D865E865F866086618662B2B88663BADFDFEC8664DBC18665D1E48666866786688669CBF4B4BD866AB0A6866B866C866D866E866FDFF1CCC6DFF286708671DFED867286738674867586768677DFE986788679867A867BDFEB867CDFEFDFF0BBBD867D867EDFF386808681DFF48682BBA38683CADBCEA8E0A7B3AA8684E0A6868586868687E0A186888689868A868BDFFE868CCDD9DFFC868DDFFA868EBFD0D7C4868FC9CC86908691DFF8B0A186928693869486958696DFFD869786988699869ADFFBE0A2869B869C869D869E869FE0A886A086A186A286A3B7C886A486A5C6A1C9B6C0B2DFF586A686A7C5BE86A8D8C4DFF9C4F686A986AA86AB86AC86AD86AEE0A3E0A4E0A5D0A586AF86B0E0B4CCE486B1E0B186B2BFA6E0AFCEB9E0ABC9C686B386B4C0AEE0AEBAEDBAB0E0A986B586B686B7DFF686B8E0B386B986BAE0B886BB86BC86BDB4ADE0B986BE86BFCFB2BAC886C0E0B086C186C286C386C486C586C686C7D0FA86C886C986CA86CB86CC86CD86CE86CF86D0E0AC86D1D4FB86D2DFF786D3C5E786D4E0AD86D5D3F786D6E0B6E0B786D786D886D986DA86DBE0C4D0E186DC86DD86DEE0BC86DF86E0E0C9E0CA86E186E286E3E0BEE0AAC9A4E0C186E4E0B286E586E686E786E886E9CAC8E0C386EAE0B586EBCECB86ECCBC3E0CDE0C6E0C286EDE0CB86EEE0BAE0BFE0C086EF86F0E0C586F186F2E0C7E0C886F3E0CC86F4E0BB86F586F686F786F886F9CBD4E0D586FAE0D6E0D286FB86FC86FD86FE87408741E0D0BCCE87428743E0D18744B8C2D8C587458746874787488749874A874B874CD0EA874D874EC2EF874F8750E0CFE0BD875187528753E0D4E0D387548755E0D78756875787588759E0DCE0D8875A875B875CD6F6B3B0875DD7EC875ECBBB875F8760E0DA8761CEFB876287638764BAD987658766876787688769876A876B876C876D876E876F8770E0E1E0DDD2AD87718772877387748775E0E287768777E0DBE0D9E0DF87788779E0E0877A877B877C877D877EE0DE8780E0E4878187828783C6F7D8ACD4EBE0E6CAC98784878587868787E0E587888789878A878BB8C1878C878D878E878FE0E7E0E887908791879287938794879587968797E0E9E0E387988799879A879B879C879D879EBABFCCE7879F87A087A1E0EA87A287A387A487A587A687A787A887A987AA87AB87AC87AD87AE87AF87B0CFF987B187B287B387B487B587B687B787B887B987BA87BBE0EB87BC87BD87BE87BF87C087C187C2C8C287C387C487C587C6BDC087C787C887C987CA87CB87CC87CD87CE87CF87D087D187D287D3C4D287D487D587D687D787D887D987DA87DB87DCE0EC87DD87DEE0ED87DF87E0C7F4CBC487E1E0EEBBD8D8B6D2F2E0EFCDC587E2B6DA87E387E487E587E687E787E8E0F187E9D4B087EA87EBC0A7B4D187EC87EDCEA7E0F087EE87EF87F0E0F2B9CC87F187F2B9FACDBCE0F387F387F487F5C6D4E0F487F6D4B287F7C8A6E0F6E0F587F887F987FA87FB87FC87FD87FE8840884188428843884488458846884788488849E0F7884A884BCDC1884C884D884ECAA5884F885088518852D4DADBD7DBD98853DBD8B9E7DBDCDBDDB5D888548855DBDA8856885788588859885ADBDBB3A1DBDF885B885CBBF8885DD6B7885EDBE0885F886088618862BEF988638864B7BB8865DBD0CCAEBFB2BBB5D7F8BFD38866886788688869886ABFE9886B886CBCE1CCB3DBDEB0D3CEEBB7D8D7B9C6C2886D886EC0A4886FCCB98870DBE7DBE1C6BADBE38871DBE88872C5F7887388748875DBEA88768877DBE9BFC088788879887ADBE6DBE5887B887C887D887E8880B4B9C0ACC2A2DBE2DBE48881888288838884D0CDDBED88858886888788888889C0DDDBF2888A888B888C888D888E888F8890B6E28891889288938894DBF3DBD2B9B8D4ABDBEC8895BFD1DBF08896DBD18897B5E68898DBEBBFE58899889A889BDBEE889CDBF1889D889E889FDBF988A088A188A288A388A488A588A688A788A8B9A1B0A388A988AA88AB88AC88AD88AE88AFC2F188B088B1B3C7DBEF88B288B3DBF888B4C6D2DBF488B588B6DBF5DBF7DBF688B788B8DBFE88B9D3F2B2BA88BA88BB88BCDBFD88BD88BE88BF88C088C188C288C388C4DCA488C5DBFB88C688C788C888C9DBFA88CA88CB88CCDBFCC5E0BBF988CD88CEDCA388CF88D0DCA588D1CCC388D288D388D4B6D1DDC088D588D688D7DCA188D8DCA288D988DA88DBC7B588DC88DD88DEB6E988DF88E088E1DCA788E288E388E488E5DCA688E6DCA9B1A488E788E8B5CC88E988EA88EB88EC88EDBFB088EE88EF88F088F188F2D1DF88F388F488F588F6B6C288F788F888F988FA88FB88FC88FD88FE894089418942894389448945DCA88946894789488949894A894B894CCBFAEBF3894D894E894FCBDC89508951CBFE895289538954CCC189558956895789588959C8FB895A895B895C895D895E895FDCAA89608961896289638964CCEEDCAB89658966896789688969896A896B896C896D896E896F897089718972897389748975DBD38976DCAFDCAC8977BEB38978CAFB8979897A897BDCAD897C897D897E89808981898289838984C9CAC4B989858986898789888989C7BDDCAE898A898B898CD4F6D0E6898D898E898F89908991899289938994C4ABB6D589958996899789988999899A899B899C899D899E899F89A089A189A289A389A489A589A6DBD489A789A889A989AAB1DA89AB89AC89ADDBD589AE89AF89B089B189B289B389B489B589B689B789B8DBD689B989BA89BBBABE89BC89BD89BE89BF89C089C189C289C389C489C589C689C789C889C9C8C089CA89CB89CC89CD89CE89CFCABFC8C989D0D7B389D1C9F989D289D3BFC789D489D5BAF889D689D7D2BC89D889D989DA89DB89DC89DD89DE89DFE2BA89E0B4A689E189E2B1B889E389E489E589E689E7B8B489E8CFC489E989EA89EB89ECD9E7CFA6CDE289ED89EED9EDB6E089EFD2B989F089F1B9BB89F289F389F489F5E2B9E2B789F6B4F389F7CCECCCABB7F289F8D8B2D1EBBABB89F9CAA789FA89FBCDB789FC89FDD2C4BFE4BCD0B6E189FEDEC58A408A418A428A43DEC6DBBC8A44D1D98A458A46C6E6C4CEB7EE8A47B7DC8A488A49BFFCD7E08A4AC6F58A4B8A4CB1BCDEC8BDB1CCD7DECA8A4DDEC98A4E8A4F8A508A518A52B5EC8A53C9DD8A548A55B0C28A568A578A588A598A5A8A5B8A5C8A5D8A5E8A5F8A608A618A62C5AEC5AB8A63C4CC8A64BCE9CBFD8A658A668A67BAC38A688A698A6AE5F9C8E7E5FACDFD8A6BD7B1B8BEC2E88A6CC8D18A6D8A6EE5FB8A6F8A708A718A72B6CABCCB8A738A74D1FDE6A18A75C3EE8A768A778A788A79E6A48A7A8A7B8A7C8A7DE5FEE6A5CDD78A7E8A80B7C1E5FCE5FDE6A38A818A82C4DDE6A88A838A84E6A78A858A868A878A888A898A8AC3C38A8BC6DE8A8C8A8DE6AA8A8E8A8F8A908A918A928A938A94C4B78A958A968A97E6A2CABC8A988A998A9A8A9BBDE3B9C3E6A6D0D5CEAF8A9C8A9DE6A9E6B08A9ED2A68A9FBDAAE6AD8AA08AA18AA28AA38AA4E6AF8AA5C0D18AA68AA7D2CC8AA88AA98AAABCA78AAB8AAC8AAD8AAE8AAF8AB08AB18AB28AB38AB48AB58AB6E6B18AB7D2F68AB88AB98ABAD7CB8ABBCDFE8ABCCDDEC2A6E6ABE6ACBDBFE6AEE6B38ABD8ABEE6B28ABF8AC08AC18AC2E6B68AC3E6B88AC48AC58AC68AC7C4EF8AC88AC98ACAC4C88ACB8ACCBEEAC9EF8ACD8ACEE6B78ACFB6F08AD08AD18AD2C3E48AD38AD48AD58AD68AD78AD88AD9D3E9E6B48ADAE6B58ADBC8A28ADC8ADD8ADE8ADF8AE0E6BD8AE18AE28AE3E6B98AE48AE58AE68AE78AE8C6C58AE98AEACDF1E6BB8AEB8AEC8AED8AEE8AEF8AF08AF18AF28AF38AF4E6BC8AF58AF68AF78AF8BBE98AF98AFA8AFB8AFC8AFD8AFE8B40E6BE8B418B428B438B44E6BA8B458B46C0B78B478B488B498B4A8B4B8B4C8B4D8B4E8B4FD3A4E6BFC9F4E6C38B508B51E6C48B528B538B548B55D0F68B568B578B588B598B5A8B5B8B5C8B5D8B5E8B5F8B608B618B628B638B648B658B668B67C3BD8B688B698B6A8B6B8B6C8B6D8B6EC3C4E6C28B6F8B708B718B728B738B748B758B768B778B788B798B7A8B7B8B7CE6C18B7D8B7E8B808B818B828B838B84E6C7CFB18B85EBF48B868B87E6CA8B888B898B8A8B8B8B8CE6C58B8D8B8EBCDEC9A98B8F8B908B918B928B938B94BCB58B958B96CFD38B978B988B998B9A8B9BE6C88B9CE6C98B9DE6CE8B9EE6D08B9F8BA08BA1E6D18BA28BA38BA4E6CBB5D58BA5E6CC8BA68BA7E6CF8BA88BA9C4DB8BAAE6C68BAB8BAC8BAD8BAE8BAFE6CD8BB08BB18BB28BB38BB48BB58BB68BB78BB88BB98BBA8BBB8BBC8BBD8BBE8BBF8BC08BC18BC28BC38BC48BC58BC6E6D28BC78BC88BC98BCA8BCB8BCC8BCD8BCE8BCF8BD08BD18BD2E6D4E6D38BD38BD48BD58BD68BD78BD88BD98BDA8BDB8BDC8BDD8BDE8BDF8BE08BE18BE28BE38BE48BE58BE68BE78BE88BE98BEA8BEB8BECE6D58BEDD9F88BEE8BEFE6D68BF08BF18BF28BF38BF48BF58BF68BF7E6D78BF88BF98BFA8BFB8BFC8BFD8BFE8C408C418C428C438C448C458C468C47D7D3E6DD8C48E6DEBFD7D4D08C49D7D6B4E6CBEFE6DAD8C3D7CED0A28C4AC3CF8C4B8C4CE6DFBCBEB9C2E6DBD1A78C4D8C4EBAA2C2CF8C4FD8AB8C508C518C52CAEBE5EE8C53E6DC8C54B7F58C558C568C578C58C8E68C598C5AC4F58C5B8C5CE5B2C4FE8C5DCBFCE5B3D5AC8C5ED3EECAD8B0B28C5FCBCECDEA8C608C61BAEA8C628C638C64E5B58C65E5B48C66D7DAB9D9D6E6B6A8CDF0D2CBB1A6CAB58C67B3E8C9F3BFCDD0FBCAD2E5B6BBC28C688C698C6ACFDCB9AC8C6B8C6C8C6D8C6ED4D78C6F8C70BAA6D1E7CFFCBCD28C71E5B7C8DD8C728C738C74BFEDB1F6CBDE8C758C76BCC58C77BCC4D2FAC3DCBFDC8C788C798C7A8C7BB8BB8C7C8C7D8C7EC3C28C80BAAED4A28C818C828C838C848C858C868C878C888C89C7DEC4AFB2EC8C8AB9D18C8B8C8CE5BBC1C88C8D8C8ED5AF8C8F8C908C918C928C93E5BC8C94E5BE8C958C968C978C988C998C9A8C9BB4E7B6D4CBC2D1B0B5BC8C9C8C9DCAD98C9EB7E28C9F8CA0C9E48CA1BDAB8CA28CA3CEBED7F08CA48CA58CA68CA7D0A18CA8C9D98CA98CAAB6FBE6D8BCE28CABB3BE8CACC9D08CADE6D9B3A28CAE8CAF8CB08CB1DECC8CB2D3C8DECD8CB3D2A28CB48CB58CB68CB7DECE8CB88CB98CBA8CBBBECD8CBC8CBDDECF8CBE8CBF8CC0CAACD2FCB3DFE5EAC4E1BEA1CEB2C4F2BED6C6A8B2E38CC18CC2BED38CC38CC4C7FCCCEBBDECCEDD8CC58CC6CABAC6C1E5ECD0BC8CC78CC88CC9D5B98CCA8CCB8CCCE5ED8CCD8CCE8CCF8CD0CAF48CD1CDC0C2C58CD2E5EF8CD3C2C4E5F08CD48CD58CD68CD78CD88CD98CDAE5F8CDCD8CDBC9BD8CDC8CDD8CDE8CDF8CE08CE18CE2D2D9E1A88CE38CE48CE58CE6D3EC8CE7CBEAC6F18CE88CE98CEA8CEB8CECE1AC8CED8CEE8CEFE1A7E1A98CF08CF1E1AAE1AF8CF28CF3B2ED8CF4E1ABB8DAE1ADE1AEE1B0B5BAE1B18CF58CF68CF78CF88CF9E1B3E1B88CFA8CFB8CFC8CFD8CFED1D28D40E1B6E1B5C1EB8D418D428D43E1B78D44D4C08D45E1B28D46E1BAB0B68D478D488D498D4AE1B48D4BBFF98D4CE1B98D4D8D4EE1BB8D4F8D508D518D528D538D54E1BE8D558D568D578D588D598D5AE1BC8D5B8D5C8D5D8D5E8D5F8D60D6C58D618D628D638D648D658D668D67CFBF8D688D69E1BDE1BFC2CD8D6AB6EB8D6BD3F88D6C8D6DC7CD8D6E8D6FB7E58D708D718D728D738D748D758D768D778D788D79BEFE8D7A8D7B8D7C8D7D8D7E8D80E1C0E1C18D818D82E1C7B3E78D838D848D858D868D878D88C6E98D898D8A8D8B8D8C8D8DB4DE8D8ED1C28D8F8D908D918D92E1C88D938D94E1C68D958D968D978D988D99E1C58D9AE1C3E1C28D9BB1C08D9C8D9D8D9ED5B8E1C48D9F8DA08DA18DA28DA3E1CB8DA48DA58DA68DA78DA88DA98DAA8DABE1CCE1CA8DAC8DAD8DAE8DAF8DB08DB18DB28DB3EFFA8DB48DB5E1D3E1D2C7B68DB68DB78DB88DB98DBA8DBB8DBC8DBD8DBE8DBF8DC0E1C98DC18DC2E1CE8DC3E1D08DC48DC58DC68DC78DC88DC98DCA8DCB8DCC8DCD8DCEE1D48DCFE1D1E1CD8DD08DD1E1CF8DD28DD38DD48DD5E1D58DD68DD78DD88DD98DDA8DDB8DDC8DDD8DDE8DDF8DE08DE18DE2E1D68DE38DE48DE58DE68DE78DE88DE98DEA8DEB8DEC8DED8DEE8DEF8DF08DF18DF28DF38DF48DF58DF68DF78DF8E1D78DF98DFA8DFBE1D88DFC8DFD8DFE8E408E418E428E438E448E458E468E478E488E498E4A8E4B8E4C8E4D8E4E8E4F8E508E518E528E538E548E55E1DA8E568E578E588E598E5A8E5B8E5C8E5D8E5E8E5F8E608E618E62E1DB8E638E648E658E668E678E688E69CEA18E6A8E6B8E6C8E6D8E6E8E6F8E708E718E728E738E748E758E76E7DD8E77B4A8D6DD8E788E79D1B2B3B28E7A8E7BB9A4D7F3C7C9BEDEB9AE8E7CCED78E7D8E7EB2EEDBCF8E80BCBAD2D1CBC8B0CD8E818E82CFEF8E838E848E858E868E87D9E3BDED8E888E89B1D2CAD0B2BC8E8ACBA7B7AB8E8BCAA68E8C8E8D8E8ECFA38E8F8E90E0F8D5CAE0FB8E918E92E0FAC5C1CCFB8E93C1B1E0F9D6E3B2AFD6C4B5DB8E948E958E968E978E988E998E9A8E9BB4F8D6A18E9C8E9D8E9E8E9F8EA0CFAFB0EF8EA18EA2E0FC8EA38EA48EA58EA68EA7E1A1B3A38EA88EA9E0FDE0FEC3B18EAA8EAB8EAC8EADC3DD8EAEE1A2B7F98EAF8EB08EB18EB28EB38EB4BBCF8EB58EB68EB78EB88EB98EBA8EBBE1A3C4BB8EBC8EBD8EBE8EBF8EC0E1A48EC18EC2E1A58EC38EC4E1A6B4B18EC58EC68EC78EC88EC98ECA8ECB8ECC8ECD8ECE8ECF8ED08ED18ED28ED3B8C9C6BDC4EA8ED4B2A28ED5D0D28ED6E7DBBBC3D3D7D3C48ED7B9E3E2CF8ED88ED98EDAD7AF8EDBC7ECB1D38EDC8EDDB4B2E2D18EDE8EDF8EE0D0F2C2AEE2D08EE1BFE2D3A6B5D7E2D2B5EA8EE2C3EDB8FD8EE3B8AE8EE4C5D3B7CFE2D48EE58EE68EE78EE8E2D3B6C8D7F98EE98EEA8EEB8EEC8EEDCDA58EEE8EEF8EF08EF18EF2E2D88EF3E2D6CAFCBFB5D3B9E2D58EF48EF58EF68EF7E2D78EF88EF98EFA8EFB8EFC8EFD8EFE8F408F418F42C1AEC0C88F438F448F458F468F478F48E2DBE2DAC0AA8F498F4AC1CE8F4B8F4C8F4D8F4EE2DC8F4F8F508F518F528F538F548F558F568F578F588F598F5AE2DD8F5BE2DE8F5C8F5D8F5E8F5F8F608F618F628F638F64DBC88F65D1D3CDA28F668F67BDA88F688F698F6ADEC3D8A5BFAADBCDD2ECC6FAC5AA8F6B8F6C8F6DDEC48F6EB1D7DFAE8F6F8F708F71CABD8F72DFB18F73B9AD8F74D2FD8F75B8A5BAEB8F768F77B3DA8F788F798F7AB5DCD5C58F7B8F7C8F7D8F7EC3D6CFD2BBA18F80E5F3E5F28F818F82E5F48F83CDE48F84C8F58F858F868F878F888F898F8A8F8BB5AFC7BF8F8CE5F68F8D8F8E8F8FECB08F908F918F928F938F948F958F968F978F988F998F9A8F9B8F9C8F9D8F9EE5E68F9FB9E9B5B18FA0C2BCE5E8E5E7E5E98FA18FA28FA38FA4D2CD8FA58FA68FA7E1EAD0CE8FA8CDAE8FA9D1E58FAA8FABB2CAB1EB8FACB1F2C5ED8FAD8FAED5C3D3B08FAFE1DC8FB08FB18FB2E1DD8FB3D2DB8FB4B3B9B1CB8FB58FB68FB7CDF9D5F7E1DE8FB8BEB6B4FD8FB9E1DFBADCE1E0BBB2C2C9E1E18FBA8FBB8FBCD0EC8FBDCDBD8FBE8FBFE1E28FC0B5C3C5C7E1E38FC18FC2E1E48FC38FC48FC58FC6D3F98FC78FC88FC98FCA8FCB8FCCE1E58FCDD1AD8FCE8FCFE1E6CEA28FD08FD18FD28FD38FD48FD5E1E78FD6B5C28FD78FD88FD98FDAE1E8BBD58FDB8FDC8FDD8FDE8FDFD0C4E2E0B1D8D2E48FE08FE1E2E18FE28FE3BCC9C8CC8FE4E2E3ECFEECFDDFAF8FE58FE68FE7E2E2D6BECDFCC3A68FE88FE98FEAE3C38FEB8FECD6D2E2E78FED8FEEE2E88FEF8FF0D3C78FF18FF2E2ECBFEC8FF3E2EDE2E58FF48FF5B3C08FF68FF78FF8C4EE8FF98FFAE2EE8FFB8FFCD0C38FFDBAF6E2E9B7DEBBB3CCACCBCBE2E4E2E6E2EAE2EB8FFE90409041E2F790429043E2F4D4F5E2F390449045C5AD9046D5FAC5C2B2C090479048E2EF9049E2F2C1AFCBBC904A904BB5A1E2F9904C904D904EBCB1E2F1D0D4D4B9E2F5B9D6E2F6904F90509051C7D390529053905490559056E2F0905790589059905A905BD7DCEDA1905C905DE2F8905EEDA5E2FECAD1905F906090619062906390649065C1B59066BBD090679068BFD69069BAE3906A906BCBA1906C906D906EEDA6EDA3906F9070EDA29071907290739074BBD6EDA7D0F490759076EDA4BADEB6F7E3A1B6B2CCF1B9A79077CFA2C7A190789079BFD2907A907BB6F1907CE2FAE2FBE2FDE2FCC4D5E3A2907DD3C1907E90809081E3A7C7C49082908390849085CFA490869087E3A9BAB790889089908A908BE3A8908CBBDA908DE3A3908E908F9090E3A4E3AA9091E3A69092CEF2D3C690939094BBBC90959096D4C39097C4FA90989099EDA8D0FCE3A5909AC3F5909BE3ADB1AF909CE3B2909D909E909FBCC290A090A1E3ACB5BF90A290A390A490A590A690A790A890A9C7E9E3B090AA90AB90ACBEAACDEF90AD90AE90AF90B090B1BBF390B290B390B4CCE890B590B6E3AF90B7E3B190B8CFA7E3AE90B9CEA9BBDD90BA90BB90BC90BD90BEB5EBBEE5B2D2B3CD90BFB1B9E3ABB2D1B5ACB9DFB6E890C090C1CFEBE3B790C2BBCC90C390C4C8C7D0CA90C590C690C790C890C9E3B8B3EE90CA90CB90CC90CDEDA990CED3FAD3E490CF90D090D1EDAAE3B9D2E290D290D390D490D590D6E3B590D790D890D990DAD3DE90DB90DC90DD90DEB8D0E3B390DF90E0E3B6B7DF90E1E3B4C0A290E290E390E4E3BA90E590E690E790E890E990EA90EB90EC90ED90EE90EF90F090F190F290F390F490F590F690F7D4B890F890F990FA90FB90FC90FD90FE9140B4C89141E3BB9142BBC59143C9F791449145C9E5914691479148C4BD9149914A914B914C914D914E914FEDAB9150915191529153C2FD9154915591569157BBDBBFAE91589159915A915B915C915D915ECEBF915F916091619162E3BC9163BFB6916491659166916791689169916A916B916C916D916E916F9170917191729173917491759176B1EF91779178D4F79179917A917B917C917DE3BE917E9180918191829183918491859186EDAD918791889189918A918B918C918D918E918FE3BFBAA9EDAC91909191E3BD91929193919491959196919791989199919A919BE3C0919C919D919E919F91A091A1BAB691A291A391A4B6AE91A591A691A791A891A9D0B891AAB0C3EDAE91AB91AC91AD91AE91AFEDAFC0C191B0E3C191B191B291B391B491B591B691B791B891B991BA91BB91BC91BD91BE91BF91C091C1C5B391C291C391C491C591C691C791C891C991CA91CB91CC91CD91CE91CFE3C291D091D191D291D391D491D591D691D791D8DCB291D991DA91DB91DC91DD91DEEDB091DFB8EA91E0CEECEAA7D0E7CAF9C8D6CFB7B3C9CED2BDE491E191E2E3DEBBF2EAA8D5BD91E3C6DDEAA991E491E591E6EAAA91E7EAACEAAB91E8EAAEEAAD91E991EA91EB91ECBDD891EDEAAF91EEC2BE91EF91F091F191F2B4C1B4F791F391F4BBA791F591F691F791F891F9ECE6ECE5B7BFCBF9B1E291FAECE791FB91FC91FDC9C8ECE8ECE991FECAD6DED0B2C5D4FA92409241C6CBB0C7B4F2C8D3924292439244CDD092459246BFB8924792489249924A924B924C924DBFDB924E924FC7A4D6B49250C0A9DED1C9A8D1EFC5A4B0E7B3B6C8C592519252B0E292539254B7F692559256C5FA92579258B6F39259D5D2B3D0BCBC925A925B925CB3AD925D925E925F9260BEF1B0D1926192629263926492659266D2D6CAE3D7A59267CDB6B6B6BFB9D5DB9268B8A7C5D79269926A926BDED2BFD9C2D5C7C0926CBBA4B1A8926D926EC5EA926F9270C5FBCCA79271927292739274B1A7927592769277B5D692789279927AC4A8927BDED3D1BAB3E9927CC3F2927D927EB7F79280D6F4B5A3B2F0C4B4C4E9C0ADDED49281B0E8C5C4C1E09282B9D59283BEDCCDD8B0CE9284CDCFDED6BED0D7BEDED5D5D0B0DD92859286C4E292879288C2A3BCF09289D3B5C0B9C5A1B2A6D4F1928A928BC0A8CAC3DED7D5FC928CB9B0928DC8ADCBA9928EDED9BFBD928F929092919292C6B4D7A7CAB0C4C39293B3D6B9D29294929592969297D6B8EAFCB0B492989299929A929BBFE6929C929DCCF4929E929F92A092A1CDDA92A292A392A4D6BFC2CE92A5CECECCA2D0AEC4D3B5B2DED8D5F5BCB7BBD392A692A7B0A492A8C5B2B4EC92A992AA92ABD5F192AC92ADEAFD92AE92AF92B092B192B292B3DEDACDA692B492B5CDEC92B692B792B892B9CEE6DEDC92BACDB1C0A692BB92BCD7BD92BDDEDBB0C6BAB4C9D3C4F3BEE892BE92BF92C092C1B2B692C292C392C492C592C692C792C892C9C0CCCBF092CABCF1BBBBB5B792CB92CC92CDC5F592CEDEE692CF92D092D1DEE3BEDD92D292D3DEDF92D492D592D692D7B4B7BDDD92D892D9DEE0C4ED92DA92DB92DC92DDCFC692DEB5E092DF92E092E192E2B6DECADAB5F4DEE592E3D5C692E4DEE1CCCDC6FE92E5C5C592E692E792E8D2B492E9BEF292EA92EB92EC92ED92EE92EF92F0C2D392F1CCBDB3B892F2BDD392F3BFD8CDC6D1DAB4EB92F4DEE4DEDDDEE792F5EAFE92F692F7C2B0DEE292F892F9D6C0B5A792FAB2F492FBDEE892FCDEF292FD92FE934093419342DEED9343DEF193449345C8E0934693479348D7E1DEEFC3E8CCE19349B2E5934A934B934CD2BE934D934E934F9350935193529353DEEE9354DEEBCED59355B4A79356935793589359935ABFABBEBE935B935CBDD2935D935E935F9360DEE99361D4AE9362DEDE9363DEEA9364936593669367C0BF9368DEECB2F3B8E9C2A79369936ABDC1936B936C936D936E936FDEF5DEF893709371B2ABB4A493729373B4EAC9A6937493759376937793789379DEF6CBD1937AB8E3937BDEF7DEFA937C937D937E9380DEF9938193829383CCC29384B0E1B4EE93859386938793889389938AE5BA938B938C938D938E938FD0AF93909391B2EB9392EBA19393DEF493949395C9E3DEF3B0DAD2A1B1F79396CCAF939793989399939A939B939C939DDEF0939ECBA4939F93A093A1D5AA93A293A393A493A593A6DEFB93A793A893A993AA93AB93AC93AD93AEB4DD93AFC4A693B093B193B2DEFD93B393B493B593B693B793B893B993BA93BB93BCC3FEC4A1DFA193BD93BE93BF93C093C193C293C3C1CC93C4DEFCBEEF93C5C6B293C693C793C893C993CA93CB93CC93CD93CEB3C5C8F693CF93D0CBBADEFE93D193D2DFA493D393D493D593D6D7B293D793D893D993DA93DBB3B793DC93DD93DE93DFC1C393E093E1C7CBB2A5B4E993E2D7AB93E393E493E593E6C4EC93E7DFA2DFA393E8DFA593E9BAB393EA93EB93ECDFA693EDC0DE93EE93EFC9C393F093F193F293F393F493F593F6B2D9C7E693F7DFA793F8C7DC93F993FA93FB93FCDFA8EBA293FD93FE944094419442CBD3944394449445DFAA9446DFA99447B2C194489449944A944B944C944D944E944F9450945194529453945494559456945794589459945A945B945C945D945E945F9460C5CA94619462946394649465946694679468DFAB9469946A946B946C946D946E946F9470D4DC94719472947394749475C8C19476947794789479947A947B947C947D947E948094819482DFAC94839484948594869487BEF094889489DFADD6A7948A948B948C948DEAB7EBB6CAD5948ED8FCB8C4948FB9A594909491B7C5D5FE94929493949494959496B9CA94979498D0A7F4CD9499949AB5D0949B949CC3F4949DBEC8949E949F94A0EBB7B0BD94A194A2BDCC94A3C1B294A4B1D6B3A894A594A694A7B8D2C9A294A894A9B6D894AA94AB94AC94ADEBB8BEB494AE94AF94B0CAFD94B1C7C394B2D5FB94B394B4B7F394B594B694B794B894B994BA94BB94BC94BD94BE94BF94C094C194C294C3CEC494C494C594C6D5ABB1F394C794C894C9ECB3B0DF94CAECB594CB94CC94CDB6B794CEC1CF94CFF5FAD0B194D094D1D5E594D2CED394D394D4BDEFB3E294D5B8AB94D6D5B694D7EDBD94D8B6CF94D9CBB9D0C294DA94DB94DC94DD94DE94DF94E094E1B7BD94E294E3ECB6CAA994E494E594E6C5D494E7ECB9ECB8C2C3ECB794E894E994EA94EBD0FDECBA94ECECBBD7E594ED94EEECBC94EF94F094F1ECBDC6EC94F294F394F494F594F694F794F894F9CEDE94FABCC894FB94FCC8D5B5A9BEC9D6BCD4E794FD94FED1AED0F1EAB8EAB9EABABAB59540954195429543CAB1BFF595449545CDFA9546954795489549954AEAC0954BB0BAEABE954C954DC0A5954E954F9550EABB9551B2FD9552C3F7BBE8955395549555D2D7CEF4EABF955695579558EABC9559955A955BEAC3955CD0C7D3B3955D955E955F9560B4BA9561C3C1D7F29562956395649565D5D19566CAC79567EAC595689569EAC4EAC7EAC6956A956B956C956D956ED6E7956FCFD495709571EACB9572BBCE9573957495759576957795789579BDFAC9CE957A957BEACC957C957DC9B9CFFEEACAD4CEEACDEACF957E9580CDED9581958295839584EAC99585EACE95869587CEEE9588BBDE9589B3BF958A958B958C958D958EC6D5BEB0CEFA958F95909591C7E79592BEA7EAD095939594D6C7959595969597C1C095989599959AD4DD959BEAD1959C959DCFBE959E959F95A095A1EAD295A295A395A495A5CAEE95A695A795A895A9C5AFB0B595AA95AB95AC95AD95AEEAD495AF95B095B195B295B395B495B595B695B7EAD3F4DF95B895B995BA95BB95BCC4BA95BD95BE95BF95C095C1B1A995C295C395C495C5E5DF95C695C795C895C9EAD595CA95CB95CC95CD95CE95CF95D095D195D295D395D495D595D695D795D895D995DA95DB95DC95DD95DE95DF95E095E195E295E3CAEF95E4EAD6EAD7C6D895E595E695E795E895E995EA95EB95ECEAD895ED95EEEAD995EF95F095F195F295F395F4D4BB95F5C7FAD2B7B8FC95F695F7EAC295F8B2DC95F995FAC2FC95FBD4F8CCE6D7EE95FC95FD95FE9640964196429643D4C2D3D0EBC3C5F39644B7FE96459646EBD4964796489649CBB7EBDE964AC0CA964B964C964DCDFB964EB3AF964FC6DA965096519652965396549655EBFC9656C4BE9657CEB4C4A9B1BED4FD9658CAF59659D6EC965A965BC6D3B6E4965C965D965E965FBBFA96609661D0E096629663C9B19664D4D3C8A896659666B8CB9667E8BEC9BC96689669E8BB966AC0EED0D3B2C4B4E5966BE8BC966C966DD5C8966E966F967096719672B6C59673E8BDCAF8B8DCCCF5967496759676C0B496779678D1EEE8BFE8C29679967ABABC967BB1ADBDDC967CEABDE8C3967DE8C6967EE8CB9680968196829683E8CC9684CBC9B0E59685BCAB96869687B9B996889689E8C1968ACDF7968BE8CA968C968D968E968FCEF69690969196929693D5ED9694C1D6E8C49695C3B69696B9FBD6A6E8C8969796989699CAE0D4E6969AE8C0969BE8C5E8C7969CC7B9B7E3969DE8C9969EBFDDE8D2969F96A0E8D796A1E8D5BCDCBCCFE8DB96A296A396A496A596A696A796A896A9E8DE96AAE8DAB1FA96AB96AC96AD96AE96AF96B096B196B296B396B4B0D8C4B3B8CCC6E2C8BEC8E196B596B696B7E8CFE8D4E8D696B8B9F1E8D8D7F596B9C4FB96BAE8DC96BB96BCB2E996BD96BE96BFE8D196C096C1BCED96C296C3BFC2E8CDD6F996C4C1F8B2F196C596C696C796C896C996CA96CB96CCE8DF96CDCAC1E8D996CE96CF96D096D1D5A496D2B1EAD5BBE8CEE8D0B6B0E8D396D3E8DDC0B896D4CAF796D5CBA896D696D7C6DCC0F596D896D996DA96DB96DCE8E996DD96DE96DFD0A396E096E196E296E396E496E596E6E8F2D6EA96E796E896E996EA96EB96EC96EDE8E0E8E196EE96EF96F0D1F9BACBB8F996F196F2B8F1D4D4E8EF96F3E8EEE8ECB9F0CCD2E8E6CEA6BFF296F4B0B8E8F1E8F096F5D7C096F6E8E496F7CDA9C9A396F8BBB8BDDBE8EA96F996FA96FB96FC96FD96FE9740974197429743E8E2E8E3E8E5B5B5E8E7C7C5E8EBE8EDBDB0D7AE9744E8F897459746974797489749974A974B974CE8F5974DCDB0E8F6974E974F9750975197529753975497559756C1BA9757E8E89758C3B7B0F09759975A975B975C975D975E975F9760E8F4976197629763E8F7976497659766B9A3976797689769976A976B976C976D976E976F9770C9D2977197729773C3CECEE0C0E69774977597769777CBF39778CCDDD0B59779977ACAE1977BE8F3977C977D977E9780978197829783978497859786BCEC9787E8F997889789978A978B978C978DC3DE978EC6E5978FB9F79790979197929793B0F497949795D7D897969797BCAC9798C5EF9799979A979B979C979DCCC4979E979FE9A697A097A197A297A397A497A597A697A797A897A9C9AD97AAE9A2C0E297AB97AC97ADBFC397AE97AF97B0E8FEB9D797B1E8FB97B297B397B497B5E9A497B697B797B8D2CE97B997BA97BB97BC97BDE9A397BED6B2D7B597BFE9A797C0BDB797C197C297C397C497C597C697C797C897C997CA97CB97CCE8FCE8FD97CD97CE97CFE9A197D097D197D297D397D497D597D697D7CDD697D897D9D2AC97DA97DB97DCE9B297DD97DE97DF97E0E9A997E197E297E3B4AA97E4B4BB97E597E6E9AB97E797E897E997EA97EB97EC97ED97EE97EF97F097F197F297F397F497F597F697F7D0A897F897F9E9A597FA97FBB3FE97FC97FDE9ACC0E397FEE9AA98409841E9B998429843E9B89844984598469847E9AE98489849E8FA984A984BE9A8984C984D984E984F9850BFACE9B1E9BA98519852C2A5985398549855E9AF9856B8C59857E9AD9858D3DCE9B4E9B5E9B79859985A985BE9C7985C985D985E985F98609861C0C6E9C598629863E9B098649865E9BBB0F19866986798689869986A986B986C986D986E986FE9BCD5A598709871E9BE9872E9BF987398749875E9C198769877C1F198789879C8B6987A987B987CE9BD987D987E988098819882E9C29883988498859886988798889889988AE9C3988BE9B3988CE9B6988DBBB1988E988F9890E9C0989198929893989498959896BCF7989798989899E9C4E9C6989A989B989C989D989E989F98A098A198A298A398A498A5E9CA98A698A798A898A9E9CE98AA98AB98AC98AD98AE98AF98B098B198B298B3B2DB98B4E9C898B598B698B798B898B998BA98BB98BC98BD98BEB7AE98BF98C098C198C298C398C498C598C698C798C898C998CAE9CBE9CC98CB98CC98CD98CE98CF98D0D5C198D1C4A398D298D398D498D598D698D7E9D898D8BAE198D998DA98DB98DCE9C998DDD3A398DE98DF98E0E9D498E198E298E398E498E598E698E7E9D7E9D098E898E998EA98EB98ECE9CF98ED98EEC7C198EF98F098F198F298F398F498F598F6E9D298F798F898F998FA98FB98FC98FDE9D9B3C898FEE9D399409941994299439944CFF0994599469947E9CD99489949994A994B994C994D994E994F995099519952B3F79953995499559956995799589959E9D6995A995BE9DA995C995D995ECCB4995F99609961CFAD99629963996499659966996799689969996AE9D5996BE9DCE9DB996C996D996E996F9970E9DE99719972997399749975997699779978E9D19979997A997B997C997D997E99809981E9DD9982E9DFC3CA9983998499859986998799889989998A998B998C998D998E998F9990999199929993999499959996999799989999999A999B999C999D999E999F99A099A199A299A399A499A599A699A799A899A999AA99AB99AC99AD99AE99AF99B099B199B299B399B499B599B699B799B899B999BA99BB99BC99BD99BE99BF99C099C199C299C399C499C599C699C799C899C999CA99CB99CC99CD99CE99CF99D099D199D299D399D499D599D699D799D899D999DA99DB99DC99DD99DE99DF99E099E199E299E399E499E599E699E799E899E999EA99EB99EC99ED99EE99EF99F099F199F299F399F499F5C7B7B4CEBBB6D0C0ECA399F699F7C5B799F899F999FA99FB99FC99FD99FE9A409A419A42D3FB9A439A449A459A46ECA49A47ECA5C6DB9A489A499A4ABFEE9A4B9A4C9A4D9A4EECA69A4F9A50ECA7D0AA9A51C7B89A529A53B8E89A549A559A569A579A589A599A5A9A5B9A5C9A5D9A5E9A5FECA89A609A619A629A639A649A659A669A67D6B9D5FDB4CBB2BDCEE4C6E79A689A69CDE19A6A9A6B9A6C9A6D9A6E9A6F9A709A719A729A739A749A759A769A77B4F59A78CBC0BCDF9A799A7A9A7B9A7CE9E2E9E3D1EAE9E59A7DB4F9E9E49A7ED1B3CAE2B2D09A80E9E89A819A829A839A84E9E6E9E79A859A86D6B39A879A889A89E9E9E9EA9A8A9A8B9A8C9A8D9A8EE9EB9A8F9A909A919A929A939A949A959A96E9EC9A979A989A999A9A9A9B9A9C9A9D9A9EECAFC5B9B6CE9A9FD2F39AA09AA19AA29AA39AA49AA59AA6B5EE9AA7BBD9ECB19AA89AA9D2E39AAA9AAB9AAC9AAD9AAECEE39AAFC4B89AB0C3BF9AB19AB2B6BED8B9B1C8B1CFB1D1C5FE9AB3B1D09AB4C3AB9AB59AB69AB79AB89AB9D5B19ABA9ABB9ABC9ABD9ABE9ABF9AC09AC1EBA4BAC19AC29AC39AC4CCBA9AC59AC69AC7EBA59AC8EBA79AC99ACA9ACBEBA89ACC9ACD9ACEEBA69ACF9AD09AD19AD29AD39AD49AD5EBA9EBABEBAA9AD69AD79AD89AD99ADAEBAC9ADBCACFD8B5C3F19ADCC3A5C6F8EBADC4CA9ADDEBAEEBAFEBB0B7D59ADE9ADF9AE0B7FA9AE1EBB1C7E29AE2EBB39AE3BAA4D1F5B0B1EBB2EBB49AE49AE59AE6B5AAC2C8C7E89AE7EBB59AE8CBAEE3DF9AE99AEAD3C09AEB9AEC9AED9AEED9DB9AEF9AF0CDA1D6ADC7F39AF19AF29AF3D9E0BBE39AF4BABAE3E29AF59AF69AF79AF89AF9CFAB9AFA9AFB9AFCE3E0C9C79AFDBAB99AFE9B409B41D1B4E3E1C8EAB9AFBDADB3D8CEDB9B429B43CCC09B449B459B46E3E8E3E9CDF49B479B489B499B4A9B4BCCAD9B4CBCB39B4DE3EA9B4EE3EB9B4F9B50D0DA9B519B529B53C6FBB7DA9B549B55C7DFD2CACED69B56E3E4E3EC9B57C9F2B3C19B589B59E3E79B5A9B5BC6E3E3E59B5C9B5DEDB3E3E69B5E9B5F9B609B61C9B39B62C5E69B639B649B65B9B59B66C3BB9B67E3E3C5BDC1A4C2D9B2D79B68E3EDBBA6C4AD9B69E3F0BEDA9B6A9B6BE3FBE3F5BAD39B6C9B6D9B6E9B6FB7D0D3CD9B70D6CED5D3B9C1D5B4D1D89B719B729B739B74D0B9C7F69B759B769B77C8AAB2B49B78C3DA9B799B7A9B7BE3EE9B7C9B7DE3FCE3EFB7A8E3F7E3F49B7E9B809B81B7BA9B829B83C5A29B84E3F6C5DDB2A8C6FC9B85C4E09B869B87D7A29B88C0E1E3F99B899B8AE3FAE3FDCCA9E3F39B8BD3BE9B8CB1C3EDB4E3F1E3F29B8DE3F8D0BAC6C3D4F3E3FE9B8E9B8FBDE09B909B91E4A79B929B93E4A69B949B959B96D1F3E4A39B97E4A99B989B999B9AC8F79B9B9B9C9B9D9B9ECFB49B9FE4A8E4AEC2E59BA09BA1B6B49BA29BA39BA49BA59BA69BA7BDF29BA8E4A29BA99BAABAE9E4AA9BAB9BACE4AC9BAD9BAEB6FDD6DEE4B29BAFE4AD9BB09BB19BB2E4A19BB3BBEECDDDC7A2C5C99BB49BB5C1F79BB6E4A49BB7C7B3BDACBDBDE4A59BB8D7C7B2E29BB9E4ABBCC3E4AF9BBABBEBE4B0C5A8E4B19BBB9BBC9BBD9BBED5E3BFA39BBFE4BA9BC0E4B79BC1E4BB9BC29BC3E4BD9BC49BC5C6D69BC69BC7BAC6C0CB9BC89BC99BCAB8A1E4B49BCB9BCC9BCD9BCED4A19BCF9BD0BAA3BDFE9BD19BD29BD3E4BC9BD49BD59BD69BD79BD8CDBF9BD99BDAC4F99BDB9BDCCFFBC9E69BDD9BDED3BF9BDFCFD19BE09BE1E4B39BE2E4B8E4B9CCE99BE39BE49BE59BE69BE7CCCE9BE8C0D4E4B5C1B0E4B6CED09BE9BBC1B5D39BEAC8F3BDA7D5C7C9ACB8A2E4CA9BEB9BECE4CCD1C49BED9BEED2BA9BEF9BF0BAAD9BF19BF2BAD49BF39BF49BF59BF69BF79BF8E4C3B5ED9BF99BFA9BFBD7CDE4C0CFFDE4BF9BFC9BFD9BFEC1DCCCCA9C409C419C429C43CAE79C449C459C469C47C4D79C48CCD4E4C89C499C4A9C4BE4C7E4C19C4CE4C4B5AD9C4D9C4ED3D99C4FE4C69C509C519C529C53D2F9B4E39C54BBB49C559C56C9EE9C57B4BE9C589C599C5ABBEC9C5BD1CD9C5CCCEDEDB59C5D9C5E9C5F9C609C619C629C639C64C7E59C659C669C679C68D4A89C69E4CBD7D5E4C29C6ABDA5E4C59C6B9C6CD3E69C6DE4C9C9F89C6E9C6FE4BE9C709C71D3E59C729C73C7FEB6C99C74D4FCB2B3E4D79C759C769C77CEC29C78E4CD9C79CEBC9C7AB8DB9C7B9C7CE4D69C7DBFCA9C7E9C809C81D3CE9C82C3EC9C839C849C859C869C879C889C899C8AC5C8E4D89C8B9C8C9C8D9C8E9C8F9C909C919C92CDC4E4CF9C939C949C959C96E4D4E4D59C97BAFE9C98CFE69C999C9AD5BF9C9B9C9C9C9DE4D29C9E9C9F9CA09CA19CA29CA39CA49CA59CA69CA79CA8E4D09CA99CAAE4CE9CAB9CAC9CAD9CAE9CAF9CB09CB19CB29CB39CB49CB59CB69CB79CB89CB9CDE5CAAA9CBA9CBB9CBCC0A39CBDBDA6E4D39CBE9CBFB8C89CC09CC19CC29CC39CC4E4E7D4B49CC59CC69CC79CC89CC99CCA9CCBE4DB9CCC9CCD9CCEC1EF9CCF9CD0E4E99CD19CD2D2E79CD39CD4E4DF9CD5E4E09CD69CD7CFAA9CD89CD99CDA9CDBCBDD9CDCE4DAE4D19CDDE4E59CDEC8DCE4E39CDF9CE0C4E7E4E29CE1E4E19CE29CE39CE4B3FCE4E89CE59CE69CE79CE8B5E19CE99CEA9CEBD7CC9CEC9CED9CEEE4E69CEFBBAC9CF0D7D2CCCFEBF89CF1E4E49CF29CF3B9F69CF49CF59CF6D6CDE4D9E4DCC2FAE4DE9CF7C2CBC0C4C2D09CF8B1F5CCB29CF99CFA9CFB9CFC9CFD9CFE9D409D419D429D43B5CE9D449D459D469D47E4EF9D489D499D4A9D4B9D4C9D4D9D4E9D4FC6AF9D509D519D52C6E19D539D54E4F59D559D569D579D589D59C2A99D5A9D5B9D5CC0ECD1DDE4EE9D5D9D5E9D5F9D609D619D629D639D649D659D66C4AE9D679D689D69E4ED9D6A9D6B9D6C9D6DE4F6E4F4C2FE9D6EE4DD9D6FE4F09D70CAFE9D71D5C49D729D73E4F19D749D759D769D779D789D799D7AD1FA9D7B9D7C9D7D9D7E9D809D819D82E4EBE4EC9D839D849D85E4F29D86CEAB9D879D889D899D8A9D8B9D8C9D8D9D8E9D8F9D90C5CB9D919D929D93C7B19D94C2BA9D959D969D97E4EA9D989D999D9AC1CA9D9B9D9C9D9D9D9E9D9F9DA0CCB6B3B19DA19DA29DA3E4FB9DA4E4F39DA59DA69DA7E4FA9DA8E4FD9DA9E4FC9DAA9DAB9DAC9DAD9DAE9DAF9DB0B3CE9DB19DB29DB3B3BAE4F79DB49DB5E4F9E4F8C5EC9DB69DB79DB89DB99DBA9DBB9DBC9DBD9DBE9DBF9DC09DC19DC2C0BD9DC39DC49DC59DC6D4E89DC79DC89DC99DCA9DCBE5A29DCC9DCD9DCE9DCF9DD09DD19DD29DD39DD49DD59DD6B0C49DD79DD8E5A49DD99DDAE5A39DDB9DDC9DDD9DDE9DDF9DE0BCA49DE1E5A59DE29DE39DE49DE59DE69DE7E5A19DE89DE99DEA9DEB9DEC9DED9DEEE4FEB1F49DEF9DF09DF19DF29DF39DF49DF59DF69DF79DF89DF9E5A89DFAE5A9E5A69DFB9DFC9DFD9DFE9E409E419E429E439E449E459E469E47E5A7E5AA9E489E499E4A9E4B9E4C9E4D9E4E9E4F9E509E519E529E539E549E559E569E579E589E599E5A9E5B9E5C9E5D9E5E9E5F9E609E619E629E639E649E659E669E679E68C6D99E699E6A9E6B9E6C9E6D9E6E9E6F9E70E5ABE5AD9E719E729E739E749E759E769E77E5AC9E789E799E7A9E7B9E7C9E7D9E7E9E809E819E829E839E849E859E869E879E889E89E5AF9E8A9E8B9E8CE5AE9E8D9E8E9E8F9E909E919E929E939E949E959E969E979E989E999E9A9E9B9E9C9E9D9E9EB9E09E9F9EA0E5B09EA19EA29EA39EA49EA59EA69EA79EA89EA99EAA9EAB9EAC9EAD9EAEE5B19EAF9EB09EB19EB29EB39EB49EB59EB69EB79EB89EB99EBABBF0ECE1C3F09EBBB5C6BBD29EBC9EBD9EBE9EBFC1E9D4EE9EC0BEC49EC19EC29EC3D7C69EC4D4D6B2D3ECBE9EC59EC69EC79EC8EAC19EC99ECA9ECBC2AFB4B69ECC9ECD9ECED1D79ECF9ED09ED1B3B49ED2C8B2BFBBECC09ED39ED4D6CB9ED59ED6ECBFECC19ED79ED89ED99EDA9EDB9EDC9EDD9EDE9EDF9EE09EE19EE29EE3ECC5BEE6CCBFC5DABEBC9EE4ECC69EE5B1FE9EE69EE79EE8ECC4D5A8B5E39EE9ECC2C1B6B3E39EEA9EEBECC3CBB8C0C3CCFE9EEC9EED9EEE9EEFC1D29EF0ECC89EF19EF29EF39EF49EF59EF69EF79EF89EF99EFA9EFB9EFC9EFDBAE6C0D39EFED6F29F409F419F42D1CC9F439F449F459F46BFBE9F47B7B3C9D5ECC7BBE29F48CCCCBDFDC8C89F49CFA99F4A9F4B9F4C9F4D9F4E9F4F9F50CDE99F51C5EB9F529F539F54B7E99F559F569F579F589F599F5A9F5B9F5C9F5D9F5E9F5FD1C9BAB89F609F619F629F639F64ECC99F659F66ECCA9F67BBC0ECCB9F68ECE2B1BAB7D99F699F6A9F6B9F6C9F6D9F6E9F6F9F709F719F729F73BDB99F749F759F769F779F789F799F7A9F7BECCCD1E6ECCD9F7C9F7D9F7E9F80C8BB9F819F829F839F849F859F869F879F889F899F8A9F8B9F8C9F8D9F8EECD19F8F9F909F919F92ECD39F93BBCD9F94BCE59F959F969F979F989F999F9A9F9B9F9C9F9D9F9E9F9F9FA09FA1ECCF9FA2C9B79FA39FA49FA59FA69FA7C3BA9FA8ECE3D5D5ECD09FA99FAA9FAB9FAC9FADD6F39FAE9FAF9FB0ECD2ECCE9FB19FB29FB39FB4ECD49FB5ECD59FB69FB7C9BF9FB89FB99FBA9FBB9FBC9FBDCFA89FBE9FBF9FC09FC19FC2D0DC9FC39FC49FC59FC6D1AC9FC79FC89FC99FCAC8DB9FCB9FCC9FCDECD6CEF59FCE9FCF9FD09FD19FD2CAECECDA9FD39FD49FD59FD69FD79FD89FD9ECD99FDA9FDB9FDCB0BE9FDD9FDE9FDF9FE09FE19FE2ECD79FE3ECD89FE49FE59FE6ECE49FE79FE89FE99FEA9FEB9FEC9FED9FEE9FEFC8BC9FF09FF19FF29FF39FF49FF59FF69FF79FF89FF9C1C79FFA9FFB9FFC9FFD9FFEECDCD1E0A040A041A042A043A044A045A046A047A048A049ECDBA04AA04BA04CA04DD4EFA04EECDDA04FA050A051A052A053A054DBC6A055A056A057A058A059A05AA05BA05CA05DA05EECDEA05FA060A061A062A063A064A065A066A067A068A069A06AB1ACA06BA06CA06DA06EA06FA070A071A072A073A074A075A076A077A078A079A07AA07BA07CA07DA07EA080A081ECDFA082A083A084A085A086A087A088A089A08AA08BECE0A08CD7A6A08DC5C0A08EA08FA090EBBCB0AEA091A092A093BEF4B8B8D2AFB0D6B5F9A094D8B3A095CBACA096E3DDA097A098A099A09AA09BA09CA09DC6ACB0E6A09EA09FA0A0C5C6EBB9A0A1A0A2A0A3A0A4EBBAA0A5A0A6A0A7EBBBA0A8A0A9D1C0A0AAC5A3A0ABEAF2A0ACC4B2A0ADC4B5C0CEA0AEA0AFA0B0EAF3C4C1A0B1CEEFA0B2A0B3A0B4A0B5EAF0EAF4A0B6A0B7C9FCA0B8A0B9C7A3A0BAA0BBA0BCCCD8CEFEA0BDA0BEA0BFEAF5EAF6CFACC0E7A0C0A0C1EAF7A0C2A0C3A0C4A0C5A0C6B6BFEAF8A0C7EAF9A0C8EAFAA0C9A0CAEAFBA0CBA0CCA0CDA0CEA0CFA0D0A0D1A0D2A0D3A0D4A0D5A0D6EAF1A0D7A0D8A0D9A0DAA0DBA0DCA0DDA0DEA0DFA0E0A0E1A0E2C8AEE1EBA0E3B7B8E1ECA0E4A0E5A0E6E1EDA0E7D7B4E1EEE1EFD3CCA0E8A0E9A0EAA0EBA0ECA0EDA0EEE1F1BFF1E1F0B5D2A0EFA0F0A0F1B1B7A0F2A0F3A0F4A0F5E1F3E1F2A0F6BAFCA0F7E1F4A0F8A0F9A0FAA0FBB9B7A0FCBED1A0FDA0FEAA40AA41C4FCAA42BADDBDC6AA43AA44AA45AA46AA47AA48E1F5E1F7AA49AA4AB6C0CFC1CAA8E1F6D5F8D3FCE1F8E1FCE1F9AA4BAA4CE1FAC0EAAA4DE1FEE2A1C0C7AA4EAA4FAA50AA51E1FBAA52E1FDAA53AA54AA55AA56AA57AA58E2A5AA59AA5AAA5BC1D4AA5CAA5DAA5EAA5FE2A3AA60E2A8B2FEE2A2AA61AA62AA63C3CDB2C2E2A7E2A6AA64AA65E2A4E2A9AA66AA67E2ABAA68AA69AA6AD0C9D6EDC3A8E2ACAA6BCFD7AA6CAA6DE2AEAA6EAA6FBAEFAA70AA71E9E0E2ADE2AAAA72AA73AA74AA75BBABD4B3AA76AA77AA78AA79AA7AAA7BAA7CAA7DAA7EAA80AA81AA82AA83E2B0AA84AA85E2AFAA86E9E1AA87AA88AA89AA8AE2B1AA8BAA8CAA8DAA8EAA8FAA90AA91AA92E2B2AA93AA94AA95AA96AA97AA98AA99AA9AAA9BAA9CAA9DE2B3CCA1AA9EE2B4AA9FAAA0AB40AB41AB42AB43AB44AB45AB46AB47AB48AB49AB4AAB4BE2B5AB4CAB4DAB4EAB4FAB50D0FEAB51AB52C2CAAB53D3F1AB54CDF5AB55AB56E7E0AB57AB58E7E1AB59AB5AAB5BAB5CBEC1AB5DAB5EAB5FAB60C2EAAB61AB62AB63E7E4AB64AB65E7E3AB66AB67AB68AB69AB6AAB6BCDE6AB6CC3B5AB6DAB6EE7E2BBB7CFD6AB6FC1E1E7E9AB70AB71AB72E7E8AB73AB74E7F4B2A3AB75AB76AB77AB78E7EAAB79E7E6AB7AAB7BAB7CAB7DAB7EE7ECE7EBC9BAAB80AB81D5E4AB82E7E5B7A9E7E7AB83AB84AB85AB86AB87AB88AB89E7EEAB8AAB8BAB8CAB8DE7F3AB8ED6E9AB8FAB90AB91AB92E7EDAB93E7F2AB94E7F1AB95AB96AB97B0E0AB98AB99AB9AAB9BE7F5AB9CAB9DAB9EAB9FABA0AC40AC41AC42AC43AC44AC45AC46AC47AC48AC49AC4AC7F2AC4BC0C5C0EDAC4CAC4DC1F0E7F0AC4EAC4FAC50AC51E7F6CBF6AC52AC53AC54AC55AC56AC57AC58AC59AC5AE8A2E8A1AC5BAC5CAC5DAC5EAC5FAC60D7C1AC61AC62E7FAE7F9AC63E7FBAC64E7F7AC65E7FEAC66E7FDAC67E7FCAC68AC69C1D5C7D9C5FDC5C3AC6AAC6BAC6CAC6DAC6EC7EDAC6FAC70AC71AC72E8A3AC73AC74AC75AC76AC77AC78AC79AC7AAC7BAC7CAC7DAC7EAC80AC81AC82AC83AC84AC85AC86E8A6AC87E8A5AC88E8A7BAF7E7F8E8A4AC89C8F0C9AAAC8AAC8BAC8CAC8DAC8EAC8FAC90AC91AC92AC93AC94AC95AC96E8A9AC97AC98B9E5AC99AC9AAC9BAC9CAC9DD1FEE8A8AC9EAC9FACA0AD40AD41AD42E8AAAD43E8ADE8AEAD44C1A7AD45AD46AD47E8AFAD48AD49AD4AE8B0AD4BAD4CE8ACAD4DE8B4AD4EAD4FAD50AD51AD52AD53AD54AD55AD56AD57AD58E8ABAD59E8B1AD5AAD5BAD5CAD5DAD5EAD5FAD60AD61E8B5E8B2E8B3AD62AD63AD64AD65AD66AD67AD68AD69AD6AAD6BAD6CAD6DAD6EAD6FAD70AD71E8B7AD72AD73AD74AD75AD76AD77AD78AD79AD7AAD7BAD7CAD7DAD7EAD80AD81AD82AD83AD84AD85AD86AD87AD88AD89E8B6AD8AAD8BAD8CAD8DAD8EAD8FAD90AD91AD92B9CFAD93F0ACAD94F0ADAD95C6B0B0EAC8BFAD96CDDFAD97AD98AD99AD9AAD9BAD9CAD9DCECDEAB1AD9EAD9FADA0AE40EAB2AE41C6BFB4C9AE42AE43AE44AE45AE46AE47AE48EAB3AE49AE4AAE4BAE4CD5E7AE4DAE4EAE4FAE50AE51AE52AE53AE54DDF9AE55EAB4AE56EAB5AE57EAB6AE58AE59AE5AAE5BB8CADFB0C9F5AE5CCCF0AE5DAE5EC9FAAE5FAE60AE61AE62AE63C9FBAE64AE65D3C3CBA6AE66B8A6F0AEB1C2AE67E5B8CCEFD3C9BCD7C9EAAE68B5E7AE69C4D0B5E9AE6AEEAEBBADAE6BAE6CE7DEAE6DEEAFAE6EAE6FAE70AE71B3A9AE72AE73EEB2AE74AE75EEB1BDE7AE76EEB0CEB7AE77AE78AE79AE7AC5CFAE7BAE7CAE7DAE7EC1F4DBCEEEB3D0F3AE80AE81AE82AE83AE84AE85AE86AE87C2D4C6E8AE88AE89AE8AB7ACAE8BAE8CAE8DAE8EAE8FAE90AE91EEB4AE92B3EBAE93AE94AE95BBFBEEB5AE96AE97AE98AE99AE9AE7DCAE9BAE9CAE9DEEB6AE9EAE9FBDAEAEA0AF40AF41AF42F1E2AF43AF44AF45CAE8AF46D2C9F0DAAF47F0DBAF48F0DCC1C6AF49B8EDBECEAF4AAF4BF0DEAF4CC5B1F0DDD1F1AF4DF0E0B0CCBDEAAF4EAF4FAF50AF51AF52D2DFF0DFAF53B4AFB7E8F0E6F0E5C6A3F0E1F0E2B4C3AF54AF55F0E3D5EEAF56AF57CCDBBED2BCB2AF58AF59AF5AF0E8F0E7F0E4B2A1AF5BD6A2D3B8BEB7C8ACAF5CAF5DF0EAAF5EAF5FAF60AF61D1F7AF62D6CCBADBF0E9AF63B6BBAF64AF65CDB4AF66AF67C6A6AF68AF69AF6AC1A1F0EBF0EEAF6BF0EDF0F0F0ECAF6CBBBEF0EFAF6DAF6EAF6FAF70CCB5F0F2AF71AF72B3D5AF73AF74AF75AF76B1D4AF77AF78F0F3AF79AF7AF0F4F0F6B4E1AF7BF0F1AF7CF0F7AF7DAF7EAF80AF81F0FAAF82F0F8AF83AF84AF85F0F5AF86AF87AF88AF89F0FDAF8AF0F9F0FCF0FEAF8BF1A1AF8CAF8DAF8ECEC1F1A4AF8FF1A3AF90C1F6F0FBCADDAF91AF92B4F1B1F1CCB1AF93F1A6AF94AF95F1A7AF96AF97F1ACD5CEF1A9AF98AF99C8B3AF9AAF9BAF9CF1A2AF9DF1ABF1A8F1A5AF9EAF9FF1AAAFA0B040B041B042B043B044B045B046B0A9F1ADB047B048B049B04AB04BB04CF1AFB04DF1B1B04EB04FB050B051B052F1B0B053F1AEB054B055B056B057D1A2B058B059B05AB05BB05CB05DB05EF1B2B05FB060B061F1B3B062B063B064B065B066B067B068B069B9EFB06AB06BB5C7B06CB0D7B0D9B06DB06EB06FD4EDB070B5C4B071BDD4BBCAF0A7B072B073B8DEB074B075F0A8B076B077B0A8B078F0A9B079B07ACDEEB07BB07CF0AAB07DB07EB080B081B082B083B084B085B086B087F0ABB088B089B08AB08BB08CB08DB08EB08FB090C6A4B091B092D6E5F1E4B093F1E5B094B095B096B097B098B099B09AB09BB09CB09DC3F3B09EB09FD3DBB0A0B140D6D1C5E8B141D3AFB142D2E6B143B144EEC1B0BBD5B5D1CEBCE0BAD0B145BFF8B146B8C7B5C1C5CCB147B148CAA2B149B14AB14BC3CBB14CB14DB14EB14FB150EEC2B151B152B153B154B155B156B157B158C4BFB6A2B159EDECC3A4B15AD6B1B15BB15CB15DCFE0EDEFB15EB15FC5CEB160B6DCB161B162CAA1B163B164EDEDB165B166EDF0EDF1C3BCB167BFB4B168EDEEB169B16AB16BB16CB16DB16EB16FB170B171B172B173EDF4EDF2B174B175B176B177D5E6C3DFB178EDF3B179B17AB17BEDF6B17CD5A3D1A3B17DB17EB180EDF5B181C3D0B182B183B184B185B186EDF7BFF4BEECEDF8B187CCF7B188D1DBB189B18AB18BD7C5D5F6B18CEDFCB18DB18EB18FEDFBB190B191B192B193B194B195B196B197EDF9EDFAB198B199B19AB19BB19CB19DB19EB19FEDFDBEA6B1A0B240B241B242B243CBAFEEA1B6BDB244EEA2C4C0B245EDFEB246B247BDDEB2C7B248B249B24AB24BB24CB24DB24EB24FB250B251B252B253B6C3B254B255B256EEA5D8BAEEA3EEA6B257B258B259C3E9B3F2B25AB25BB25CB25DB25EB25FEEA7EEA4CFB9B260B261EEA8C2F7B262B263B264B265B266B267B268B269B26AB26BB26CB26DEEA9EEAAB26EDEABB26FB270C6B3B271C7C6B272D6F5B5C9B273CBB2B274B275B276EEABB277B278CDABB279EEACB27AB27BB27CB27DB27ED5B0B280EEADB281F6C4B282B283B284B285B286B287B288B289B28AB28BB28CB28DB28EDBC7B28FB290B291B292B293B294B295B296B297B4A3B298B299B29AC3ACF1E6B29BB29CB29DB29EB29FCAB8D2D3B2A0D6AAB340EFF2B341BED8B342BDC3EFF3B6CCB0ABB343B344B345B346CAAFB347B348EDB6B349EDB7B34AB34BB34CB34DCEF9B7AFBFF3EDB8C2EBC9B0B34EB34FB350B351B352B353EDB9B354B355C6F6BFB3B356B357B358EDBCC5F8B359D1D0B35AD7A9EDBAEDBBB35BD1E2B35CEDBFEDC0B35DEDC4B35EB35FB360EDC8B361EDC6EDCED5E8B362EDC9B363B364EDC7EDBEB365B366C5E9B367B368B369C6C6B36AB36BC9E9D4D2EDC1EDC2EDC3EDC5B36CC0F9B36DB4A1B36EB36FB370B371B9E8B372EDD0B373B374B375B376EDD1B377EDCAB378EDCFB379CEF8B37AB37BCBB6EDCCEDCDB37CB37DB37EB380B381CFF5B382B383B384B385B386B387B388B389B38AB38BB38CB38DEDD2C1F2D3B2EDCBC8B7B38EB38FB390B391B392B393B394B395BCEFB396B397B398B399C5F0B39AB39BB39CB39DB39EB39FB3A0B440B441B442EDD6B443B5EFB444B445C2B5B0ADCBE9B446B447B1AEB448EDD4B449B44AB44BCDEBB5E2B44CEDD5EDD3EDD7B44DB44EB5FAB44FEDD8B450EDD9B451EDDCB452B1CCB453B454B455B456B457B458B459B45AC5F6BCEEEDDACCBCB2EAB45BB45CB45DB45EEDDBB45FB460B461B462C4EBB463B464B4C5B465B466B467B0F5B468B469B46AEDDFC0DAB4E8B46BB46CB46DB46EC5CDB46FB470B471EDDDBFC4B472B473B474EDDEB475B476B477B478B479B47AB47BB47CB47DB47EB480B481B482B483C4A5B484B485B486EDE0B487B488B489B48AB48BEDE1B48CEDE3B48DB48EC1D7B48FB490BBC7B491B492B493B494B495B496BDB8B497B498B499EDE2B49AB49BB49CB49DB49EB49FB4A0B540B541B542B543B544B545EDE4B546B547B548B549B54AB54BB54CB54DB54EB54FEDE6B550B551B552B553B554EDE5B555B556B557B558B559B55AB55BB55CB55DB55EB55FB560B561B562B563EDE7B564B565B566B567B568CABEECEAC0F1B569C9E7B56AECEBC6EEB56BB56CB56DB56EECECB56FC6EDECEDB570B571B572B573B574B575B576B577B578ECF0B579B57AD7E6ECF3B57BB57CECF1ECEEECEFD7A3C9F1CBEEECF4B57DECF2B57EB580CFE9B581ECF6C6B1B582B583B584B585BCC0B586ECF5B587B588B589B58AB58BB58CB58DB5BBBBF6B58EECF7B58FB590B591B592B593D9F7BDFBB594B595C2BBECF8B596B597B598B599ECF9B59AB59BB59CB59DB8A3B59EB59FB5A0B640B641B642B643B644B645B646ECFAB647B648B649B64AB64BB64CB64DB64EB64FB650B651B652ECFBB653B654B655B656B657B658B659B65AB65BB65CB65DECFCB65EB65FB660B661B662D3EDD8AEC0EBB663C7DDBACCB664D0E3CBBDB665CDBAB666B667B8D1B668B669B1FCB66AC7EFB66BD6D6B66CB66DB66EBFC6C3EBB66FB670EFF5B671B672C3D8B673B674B675B676B677B678D7E2B679B67AB67BEFF7B3D3B67CC7D8D1EDB67DD6C8B67EEFF8B680EFF6B681BBFDB3C6B682B683B684B685B686B687B688BDD5B689B68AD2C6B68BBBE0B68CB68DCFA1B68EEFFCEFFBB68FB690EFF9B691B692B693B694B3CCB695C9D4CBB0B696B697B698B699B69AEFFEB69BB69CB0DEB69DB69ED6C9B69FB6A0B740EFFDB741B3EDB742B743F6D5B744B745B746B747B748B749B74AB74BB74CB74DB74EB74FB750B751B752CEC8B753B754B755F0A2B756F0A1B757B5BEBCDABBFCB758B8E5B759B75AB75BB75CB75DB75EC4C2B75FB760B761B762B763B764B765B766B767B768F0A3B769B76AB76BB76CB76DCBEBB76EB76FB770B771B772B773B774B775B776B777B778B779B77AB77BB77CB77DB77EB780B781B782B783B784B785B786F0A6B787B788B789D1A8B78ABEBFC7EEF1B6F1B7BFD5B78BB78CB78DB78EB4A9F1B8CDBBB78FC7D4D5ADB790F1B9B791F1BAB792B793B794B795C7CFB796B797B798D2A4D6CFB799B79AF1BBBDD1B4B0BEBDB79BB79CB79DB4DCCED1B79EBFDFF1BDB79FB7A0B840B841BFFAF1BCB842F1BFB843B844B845F1BEF1C0B846B847B848B849B84AF1C1B84BB84CB84DB84EB84FB850B851B852B853B854B855C1FEB856B857B858B859B85AB85BB85CB85DB85EB85FB860C1A2B861B862B863B864B865B866B867B868B869B86ACAFAB86BB86CD5BEB86DB86EB86FB870BEBABEB9D5C2B871B872BFA2B873CDAFF1B5B874B875B876B877B878B879BDDFB87AB6CBB87BB87CB87DB87EB880B881B882B883B884D6F1F3C3B885B886F3C4B887B8CDB888B889B88AF3C6F3C7B88BB0CAB88CF3C5B88DF3C9CBF1B88EB88FB890F3CBB891D0A6B892B893B1CAF3C8B894B895B896F3CFB897B5D1B898B899F3D7B89AF3D2B89BB89CB89DF3D4F3D3B7FBB89EB1BFB89FF3CEF3CAB5DAB8A0F3D0B940B941F3D1B942F3D5B943B944B945B946F3CDB947BCE3B948C1FDB949F3D6B94AB94BB94CB94DB94EB94FF3DAB950F3CCB951B5C8B952BDEEF3DCB953B954B7A4BFF0D6FECDB2B955B4F0B956B2DFB957F3D8B958F3D9C9B8B959F3DDB95AB95BF3DEB95CF3E1B95DB95EB95FB960B961B962B963B964B965B966B967F3DFB968B969F3E3F3E2B96AB96BF3DBB96CBFEAB96DB3EFB96EF3E0B96FB970C7A9B971BCF2B972B973B974B975F3EBB976B977B978B979B97AB97BB97CB9BFB97DB97EF3E4B980B981B982B2ADBBFEB983CBE3B984B985B986B987F3EDF3E9B988B989B98AB9DCF3EEB98BB98CB98DF3E5F3E6F3EAC2E1F3ECF3EFF3E8BCFDB98EB98FB990CFE4B991B992F3F0B993B994B995F3E7B996B997B998B999B99AB99BB99CB99DF3F2B99EB99FB9A0BA40D7ADC6AABA41BA42BA43BA44F3F3BA45BA46BA47BA48F3F1BA49C2A8BA4ABA4BBA4CBA4DBA4EB8DDF3F5BA4FBA50F3F4BA51BA52BA53B4DBBA54BA55BA56F3F6F3F7BA57BA58BA59F3F8BA5ABA5BBA5CC0BABA5DBA5EC0E9BA5FBA60BA61BA62BA63C5F1BA64BA65BA66BA67F3FBBA68F3FABA69BA6ABA6BBA6CBA6DBA6EBA6FBA70B4D8BA71BA72BA73F3FEF3F9BA74BA75F3FCBA76BA77BA78BA79BA7ABA7BF3FDBA7CBA7DBA7EBA80BA81BA82BA83BA84F4A1BA85BA86BA87BA88BA89BA8AF4A3BBC9BA8BBA8CF4A2BA8DBA8EBA8FBA90BA91BA92BA93BA94BA95BA96BA97BA98BA99F4A4BA9ABA9BBA9CBA9DBA9EBA9FB2BEF4A6F4A5BAA0BB40BB41BB42BB43BB44BB45BB46BB47BB48BB49BCAEBB4ABB4BBB4CBB4DBB4EBB4FBB50BB51BB52BB53BB54BB55BB56BB57BB58BB59BB5ABB5BBB5CBB5DBB5EBB5FBB60BB61BB62BB63BB64BB65BB66BB67BB68BB69BB6ABB6BBB6CBB6DBB6EC3D7D9E1BB6FBB70BB71BB72BB73BB74C0E0F4CCD7D1BB75BB76BB77BB78BB79BB7ABB7BBB7CBB7DBB7EBB80B7DBBB81BB82BB83BB84BB85BB86BB87F4CEC1A3BB88BB89C6C9BB8AB4D6D5B3BB8BBB8CBB8DF4D0F4CFF4D1CBDABB8EBB8FF4D2BB90D4C1D6E0BB91BB92BB93BB94B7E0BB95BB96BB97C1B8BB98BB99C1BBF4D3BEACBB9ABB9BBB9CBB9DBB9EB4E2BB9FBBA0F4D4F4D5BEABBC40BC41F4D6BC42BC43BC44F4DBBC45F4D7F4DABC46BAFDBC47F4D8F4D9BC48BC49BC4ABC4BBC4CBC4DBC4EB8E2CCC7F4DCBC4FB2DABC50BC51C3D3BC52BC53D4E3BFB7BC54BC55BC56BC57BC58BC59BC5AF4DDBC5BBC5CBC5DBC5EBC5FBC60C5B4BC61BC62BC63BC64BC65BC66BC67BC68F4E9BC69BC6ACFB5BC6BBC6CBC6DBC6EBC6FBC70BC71BC72BC73BC74BC75BC76BC77BC78CEC9BC79BC7ABC7BBC7CBC7DBC7EBC80BC81BC82BC83BC84BC85BC86BC87BC88BC89BC8ABC8BBC8CBC8DBC8ECBD8BC8FCBF7BC90BC91BC92BC93BDF4BC94BC95BC96D7CFBC97BC98BC99C0DBBC9ABC9BBC9CBC9DBC9EBC9FBCA0BD40BD41BD42BD43BD44BD45BD46BD47BD48BD49BD4ABD4BBD4CBD4DBD4EBD4FBD50BD51BD52BD53BD54BD55BD56BD57BD58BD59BD5ABD5BBD5CBD5DBD5EBD5FBD60BD61BD62BD63BD64BD65BD66BD67BD68BD69BD6ABD6BBD6CBD6DBD6EBD6FBD70BD71BD72BD73BD74BD75BD76D0F5BD77BD78BD79BD7ABD7BBD7CBD7DBD7EF4EABD80BD81BD82BD83BD84BD85BD86BD87BD88BD89BD8ABD8BBD8CBD8DBD8EBD8FBD90BD91BD92BD93BD94BD95BD96BD97BD98BD99BD9ABD9BBD9CBD9DBD9EBD9FBDA0BE40BE41BE42BE43BE44BE45BE46BE47BE48BE49BE4ABE4BBE4CF4EBBE4DBE4EBE4FBE50BE51BE52BE53F4ECBE54BE55BE56BE57BE58BE59BE5ABE5BBE5CBE5DBE5EBE5FBE60BE61BE62BE63BE64BE65BE66BE67BE68BE69BE6ABE6BBE6CBE6DBE6EBE6FBE70BE71BE72BE73BE74BE75BE76BE77BE78BE79BE7ABE7BBE7CBE7DBE7EBE80BE81BE82BE83BE84BE85BE86BE87BE88BE89BE8ABE8BBE8CBE8DBE8EBE8FBE90BE91BE92BE93BE94BE95BE96BE97BE98BE99BE9ABE9BBE9CBE9DBE9EBE9FBEA0BF40BF41BF42BF43BF44BF45BF46BF47BF48BF49BF4ABF4BBF4CBF4DBF4EBF4FBF50BF51BF52BF53BF54BF55BF56BF57BF58BF59BF5ABF5BBF5CBF5DBF5EBF5FBF60BF61BF62BF63BF64BF65BF66BF67BF68BF69BF6ABF6BBF6CBF6DBF6EBF6FBF70BF71BF72BF73BF74BF75BF76BF77BF78BF79BF7ABF7BBF7CBF7DBF7EBF80F7E3BF81BF82BF83BF84BF85B7B1BF86BF87BF88BF89BF8AF4EDBF8BBF8CBF8DBF8EBF8FBF90BF91BF92BF93BF94BF95BF96BF97BF98BF99BF9ABF9BBF9CBF9DBF9EBF9FBFA0C040C041C042C043C044C045C046C047C048C049C04AC04BC04CC04DC04EC04FC050C051C052C053C054C055C056C057C058C059C05AC05BC05CC05DC05EC05FC060C061C062C063D7EBC064C065C066C067C068C069C06AC06BC06CC06DC06EC06FC070C071C072C073C074C075C076C077C078C079C07AC07BF4EEC07CC07DC07EE6F9BEC0E6FABAECE6FBCFCBE6FCD4BCBCB6E6FDE6FEBCCDC8D2CEB3E7A1C080B4BFE7A2C9B4B8D9C4C9C081D7DDC2DAB7D7D6BDCEC6B7C4C082C083C5A6E7A3CFDFE7A4E7A5E7A6C1B7D7E9C9F0CFB8D6AFD6D5E7A7B0EDE7A8E7A9C9DCD2EFBEADE7AAB0F3C8DEBDE1E7ABC8C6C084E7ACBBE6B8F8D1A4E7ADC2E7BEF8BDCACDB3E7AEE7AFBEEED0E5C085CBE7CCD0BCCCE7B0BCA8D0F7E7B1C086D0F8E7B2E7B3B4C2E7B4E7B5C9FECEACC3E0E7B7B1C1B3F1C087E7B8E7B9D7DBD5C0E7BAC2CCD7BAE7BBE7BCE7BDBCEAC3E5C0C2E7BEE7BFBCA9C088E7C0E7C1E7B6B6D0E7C2C089E7C3E7C4BBBAB5DEC2C6B1E0E7C5D4B5E7C6B8BFE7C8E7C7B7ECC08AE7C9B2F8E7CAE7CBE7CCE7CDE7CEE7CFE7D0D3A7CBF5E7D1E7D2E7D3E7D4C9C9E7D5E7D6E7D7E7D8E7D9BDC9E7DAF3BEC08BB8D7C08CC8B1C08DC08EC08FC090C091C092C093F3BFC094F3C0F3C1C095C096C097C098C099C09AC09BC09CC09DC09EB9DECDF8C09FC0A0D8E8BAB1C140C2DEEEB7C141B7A3C142C143C144C145EEB9C146EEB8B0D5C147C148C149C14AC14BEEBBD5D6D7EFC14CC14DC14ED6C3C14FC150EEBDCAF0C151EEBCC152C153C154C155EEBEC156C157C158C159EEC0C15AC15BEEBFC15CC15DC15EC15FC160C161C162C163D1F2C164C7BCC165C3C0C166C167C168C169C16AB8E1C16BC16CC16DC16EC16FC1E7C170C171F4C6D0DFF4C7C172CFDBC173C174C8BAC175C176F4C8C177C178C179C17AC17BC17CC17DF4C9F4CAC17EF4CBC180C181C182C183C184D9FAB8FEC185C186E5F1D3F0C187F4E0C188CECCC189C18AC18BB3E1C18CC18DC18EC18FF1B4C190D2EEC191F4E1C192C193C194C195C196CFE8F4E2C197C198C7CCC199C19AC19BC19CC19DC19EB5D4B4E4F4E4C19FC1A0C240F4E3F4E5C241C242F4E6C243C244C245C246F4E7C247BAB2B0BFC248F4E8C249C24AC24BC24CC24DC24EC24FB7ADD2EDC250C251C252D2ABC0CFC253BFBCEBA3D5DFEAC8C254C255C256C257F1F3B6F8CBA3C258C259C4CDC25AF1E7C25BF1E8B8FBF1E9BAC4D4C5B0D2C25CC25DF1EAC25EC25FC260F1EBC261F1ECC262C263F1EDF1EEF1EFF1F1F1F0C5D5C264C265C266C267C268C269F1F2C26AB6FAC26BF1F4D2AEDEC7CBCAC26CC26DB3DCC26EB5A2C26FB9A2C270C271C4F4F1F5C272C273F1F6C274C275C276C1C4C1FBD6B0F1F7C277C278C279C27AF1F8C27BC1AAC27CC27DC27EC6B8C280BEDBC281C282C283C284C285C286C287C288C289C28AC28BC28CC28DC28EF1F9B4CFC28FC290C291C292C293C294F1FAC295C296C297C298C299C29AC29BC29CC29DC29EC29FC2A0C340EDB2EDB1C341C342CBE0D2DEC343CBC1D5D8C344C8E2C345C0DFBCA1C346C347C348C349C34AC34BEBC1C34CC34DD0A4C34ED6E2C34FB6C7B8D8EBC0B8CEC350EBBFB3A6B9C9D6ABC351B7F4B7CAC352C353C354BCE7B7BEEBC6C355EBC7B0B9BFCFC356EBC5D3FDC357EBC8C358C359EBC9C35AC35BB7CEC35CEBC2EBC4C9F6D6D7D5CDD0B2EBCFCEB8EBD0C35DB5A8C35EC35FC360C361C362B1B3EBD2CCA5C363C364C365C366C367C368C369C5D6EBD3C36AEBD1C5DFEBCECAA4EBD5B0FBC36BC36CBAFAC36DC36ED8B7F1E3C36FEBCAEBCBEBCCEBCDEBD6E6C0EBD9C370BFE8D2C8EBD7EBDCB8ECEBD8C371BDBAC372D0D8C373B0B7C374EBDDC4DCC375C376C377C378D6ACC379C37AC37BB4E0C37CC37DC2F6BCB9C37EC380EBDAEBDBD4E0C6EAC4D4EBDFC5A7D9F5C381B2B1C382EBE4C383BDC5C384C385C386EBE2C387C388C389C38AC38BC38CC38DC38EC38FC390C391C392C393EBE3C394C395B8ACC396CDD1EBE5C397C398C399EBE1C39AC1B3C39BC39CC39DC39EC39FC6A2C3A0C440C441C442C443C444C445CCF3C446EBE6C447C0B0D2B8EBE7C448C449C44AB8AFB8ADC44BEBE8C7BBCDF3C44CC44DC44EEBEAEBEBC44FC450C451C452C453EBEDC454C455C456C457D0C8C458EBF2C459EBEEC45AC45BC45CEBF1C8F9C45DD1FCEBECC45EC45FEBE9C460C461C462C463B8B9CFD9C4E5EBEFEBF0CCDACDC8B0F2C464EBF6C465C466C467C468C469EBF5C46AB2B2C46BC46CC46DC46EB8E0C46FEBF7C470C471C472C473C474C475B1ECC476C477CCC5C4A4CFA5C478C479C47AC47BC47CEBF9C47DC47EECA2C480C5F2C481EBFAC482C483C484C485C486C487C488C489C9C5C48AC48BC48CC48DC48EC48FE2DFEBFEC490C491C492C493CDCEECA1B1DBD3B7C494C495D2DCC496C497C498EBFDC499EBFBC49AC49BC49CC49DC49EC49FC4A0C540C541C542C543C544C545C546C547C548C549C54AC54BC54CC54DC54EB3BCC54FC550C551EAB0C552C553D7D4C554F4ABB3F4C555C556C557C558C559D6C1D6C2C55AC55BC55CC55DC55EC55FD5E9BECAC560F4A7C561D2A8F4A8F4A9C562F4AABECBD3DFC563C564C565C566C567C9E0C9E1C568C569F3C2C56ACAE6C56BCCF2C56CC56DC56EC56FC570C571E2B6CBB4C572CEE8D6DBC573F4ADF4AEF4AFC574C575C576C577F4B2C578BABDF4B3B0E3F4B0C579F4B1BDA2B2D5C57AF4B6F4B7B6E6B2B0CFCFF4B4B4ACC57BF4B5C57CC57DF4B8C57EC580C581C582C583F4B9C584C585CDA7C586F4BAC587F4BBC588C589C58AF4BCC58BC58CC58DC58EC58FC590C591C592CBD2C593F4BDC594C595C596C597F4BEC598C599C59AC59BC59CC59DC59EC59FF4BFC5A0C640C641C642C643F4DEC1BCBCE8C644C9ABD1DEE5F5C645C646C647C648DCB3D2D5C649C64ADCB4B0ACDCB5C64BC64CBDDAC64DDCB9C64EC64FC650D8C2C651DCB7D3F3C652C9D6DCBADCB6C653DCBBC3A2C654C655C656C657DCBCDCC5DCBDC658C659CEDFD6A5C65ADCCFC65BDCCDC65CC65DDCD2BDE6C2ABC65EDCB8DCCBDCCEDCBEB7D2B0C5DCC7D0BEDCC1BBA8C65FB7BCDCCCC660C661DCC6DCBFC7DBC662C663C664D1BFDCC0C665C666DCCAC667C668DCD0C669C66ACEADDCC2C66BDCC3DCC8DCC9B2D4DCD1CBD5C66CD4B7DCDBDCDFCCA6DCE6C66DC3E7DCDCC66EC66FBFC1DCD9C670B0FAB9B6DCE5DCD3C671DCC4DCD6C8F4BFE0C672C673C674C675C9BBC676C677C678B1BDC679D3A2C67AC67BDCDAC67CC67DDCD5C67EC6BBC680DCDEC681C682C683C684C685D7C2C3AFB7B6C7D1C3A9DCE2DCD8DCEBDCD4C686C687DCDDC688BEA5DCD7C689DCE0C68AC68BDCE3DCE4C68CDCF8C68DC68EDCE1DDA2DCE7C68FC690C691C692C693C694C695C696C697C698BCEBB4C4C699C69AC3A3B2E7DCFAC69BDCF2C69CDCEFC69DDCFCDCEED2F0B2E8C69EC8D7C8E3DCFBC69FDCEDC6A0C740C741DCF7C742C743DCF5C744C745BEA3DCF4C746B2DDC747C748C749C74AC74BDCF3BCF6DCE8BBC4C74CC0F3C74DC74EC74FC750C751BCD4DCE9DCEAC752DCF1DCF6DCF9B5B4C753C8D9BBE7DCFEDCFDD3ABDDA1DDA3DDA5D2F1DDA4DDA6DDA7D2A9C754C755C756C757C758C759C75ABAC9DDA9C75BC75CDDB6DDB1DDB4C75DC75EC75FC760C761C762C763DDB0C6CEC764C765C0F2C766C767C768C769C9AFC76AC76BC76CDCECDDAEC76DC76EC76FC770DDB7C771C772DCF0DDAFC773DDB8C774DDACC775C776C777C778C779C77AC77BDDB9DDB3DDADC4AAC77CC77DC77EC780DDA8C0B3C1ABDDAADDABC781DDB2BBF1DDB5D3A8DDBAC782DDBBC3A7C783C784DDD2DDBCC785C786C787DDD1C788B9BDC789C78ABED5C78BBEFAC78CC78DBACAC78EC78FC790C791DDCAC792DDC5C793DDBFC794C795C796B2CBDDC3C797DDCBB2A4DDD5C798C799C79ADDBEC79BC79CC79DC6D0DDD0C79EC79FC7A0C840C841DDD4C1E2B7C6C842C843C844C845C846DDCEDDCFC847C848C849DDC4C84AC84BC84CDDBDC84DDDCDCCD1C84EDDC9C84FC850C851C852DDC2C3C8C6BCCEAEDDCCC853DDC8C854C855C856C857C858C859DDC1C85AC85BC85CDDC6C2DCC85DC85EC85FC860C861C862D3A9D3AADDD3CFF4C8F8C863C864C865C866C867C868C869C86ADDE6C86BC86CC86DC86EC86FC870DDC7C871C872C873DDE0C2E4C874C875C876C877C878C879C87AC87BDDE1C87CC87DC87EC880C881C882C883C884C885C886DDD7C887C888C889C88AC88BD6F8C88CDDD9DDD8B8F0DDD6C88DC88EC88FC890C6CFC891B6ADC892C893C894C895C896DDE2C897BAF9D4E1DDE7C898C899C89AB4D0C89BDDDAC89CBFFBDDE3C89DDDDFC89EDDDDC89FC8A0C940C941C942C943C944B5D9C945C946C947C948DDDBDDDCDDDEC949BDAFDDE4C94ADDE5C94BC94CC94DC94EC94FC950C951C952DDF5C953C3C9C954C955CBE2C956C957C958C959DDF2C95AC95BC95CC95DC95EC95FC960C961C962C963C964C965C966D8E1C967C968C6D1C969DDF4C96AC96BC96CD5F4DDF3DDF0C96DC96EDDECC96FDDEFC970DDE8C971C972D0EEC973C974C975C976C8D8DDEEC977C978DDE9C979C97ADDEACBF2C97BDDEDC97CC97DB1CDC97EC980C981C982C983C984C0B6C985BCBBDDF1C986C987DDF7C988DDF6DDEBC989C98AC98BC98CC98DC5EEC98EC98FC990DDFBC991C992C993C994C995C996C997C998C999C99AC99BDEA4C99CC99DDEA3C99EC99FC9A0CA40CA41CA42CA43CA44CA45CA46CA47CA48DDF8CA49CA4ACA4BCA4CC3EFCA4DC2FBCA4ECA4FCA50D5E1CA51CA52CEB5CA53CA54CA55CA56DDFDCA57B2CCCA58CA59CA5ACA5BCA5CCA5DCA5ECA5FCA60C4E8CADFCA61CA62CA63CA64CA65CA66CA67CA68CA69CA6AC7BEDDFADDFCDDFEDEA2B0AAB1CECA6BCA6CCA6DCA6ECA6FDEACCA70CA71CA72CA73DEA6BDB6C8EFCA74CA75CA76CA77CA78CA79CA7ACA7BCA7CCA7DCA7EDEA1CA80CA81DEA5CA82CA83CA84CA85DEA9CA86CA87CA88CA89CA8ADEA8CA8BCA8CCA8DDEA7CA8ECA8FCA90CA91CA92CA93CA94CA95CA96DEADCA97D4CCCA98CA99CA9ACA9BDEB3DEAADEAECA9CCA9DC0D9CA9ECA9FCAA0CB40CB41B1A1DEB6CB42DEB1CB43CB44CB45CB46CB47CB48CB49DEB2CB4ACB4BCB4CCB4DCB4ECB4FCB50CB51CB52CB53CB54D1A6DEB5CB55CB56CB57CB58CB59CB5ACB5BDEAFCB5CCB5DCB5EDEB0CB5FD0BDCB60CB61CB62DEB4CAEDDEB9CB63CB64CB65CB66CB67CB68DEB8CB69DEB7CB6ACB6BCB6CCB6DCB6ECB6FCB70DEBBCB71CB72CB73CB74CB75CB76CB77BDE5CB78CB79CB7ACB7BCB7CB2D8C3EACB7DCB7EDEBACB80C5BACB81CB82CB83CB84CB85CB86DEBCCB87CB88CB89CB8ACB8BCB8CCB8DCCD9CB8ECB8FCB90CB91B7AACB92CB93CB94CB95CB96CB97CB98CB99CB9ACB9BCB9CCB9DCB9ECB9FCBA0CC40CC41D4E5CC42CC43CC44DEBDCC45CC46CC47CC48CC49DEBFCC4ACC4BCC4CCC4DCC4ECC4FCC50CC51CC52CC53CC54C4A2CC55CC56CC57CC58DEC1CC59CC5ACC5BCC5CCC5DCC5ECC5FCC60CC61CC62CC63CC64CC65CC66CC67CC68DEBECC69DEC0CC6ACC6BCC6CCC6DCC6ECC6FCC70CC71CC72CC73CC74CC75CC76CC77D5BACC78CC79CC7ADEC2CC7BCC7CCC7DCC7ECC80CC81CC82CC83CC84CC85CC86CC87CC88CC89CC8ACC8BF2AEBBA2C2B2C5B0C2C7CC8CCC8DF2AFCC8ECC8FCC90CC91CC92D0E9CC93CC94CC95D3DDCC96CC97CC98EBBDCC99CC9ACC9BCC9CCC9DCC9ECC9FCCA0B3E6F2B0CD40F2B1CD41CD42CAADCD43CD44CD45CD46CD47CD48CD49BAE7F2B3F2B5F2B4CBE4CFBAF2B2CAB4D2CFC2ECCD4ACD4BCD4CCD4DCD4ECD4FCD50CEC3F2B8B0F6F2B7CD51CD52CD53CD54CD55F2BECD56B2CFCD57CD58CD59CD5ACD5BCD5CD1C1F2BACD5DCD5ECD5FCD60CD61F2BCD4E9CD62CD63F2BBF2B6F2BFF2BDCD64F2B9CD65CD66F2C7F2C4F2C6CD67CD68F2CAF2C2F2C0CD69CD6ACD6BF2C5CD6CCD6DCD6ECD6FCD70D6FBCD71CD72CD73F2C1CD74C7F9C9DFCD75F2C8B9C6B5B0CD76CD77F2C3F2C9F2D0F2D6CD78CD79BBD7CD7ACD7BCD7CF2D5CDDCCD7DD6EBCD7ECD80F2D2F2D4CD81CD82CD83CD84B8F2CD85CD86CD87CD88F2CBCD89CD8ACD8BF2CEC2F9CD8CD5DDF2CCF2CDF2CFF2D3CD8DCD8ECD8FF2D9D3BCCD90CD91CD92CD93B6EACD94CAF1CD95B7E4F2D7CD96CD97CD98F2D8F2DAF2DDF2DBCD99CD9AF2DCCD9BCD9CCD9DCD9ED1D1F2D1CD9FCDC9CDA0CECFD6A9CE40F2E3CE41C3DBCE42F2E0CE43CE44C0AFF2ECF2DECE45F2E1CE46CE47CE48F2E8CE49CE4ACE4BCE4CF2E2CE4DCE4EF2E7CE4FCE50F2E6CE51CE52F2E9CE53CE54CE55F2DFCE56CE57F2E4F2EACE58CE59CE5ACE5BCE5CCE5DCE5ED3ACF2E5B2F5CE5FCE60F2F2CE61D0ABCE62CE63CE64CE65F2F5CE66CE67CE68BBC8CE69F2F9CE6ACE6BCE6CCE6DCE6ECE6FF2F0CE70CE71F2F6F2F8F2FACE72CE73CE74CE75CE76CE77CE78CE79F2F3CE7AF2F1CE7BCE7CCE7DBAFBCE7EB5FBCE80CE81CE82CE83F2EFF2F7F2EDF2EECE84CE85CE86F2EBF3A6CE87F3A3CE88CE89F3A2CE8ACE8BF2F4CE8CC8DACE8DCE8ECE8FCE90CE91F2FBCE92CE93CE94F3A5CE95CE96CE97CE98CE99CE9ACE9BC3F8CE9CCE9DCE9ECE9FCEA0CF40CF41CF42F2FDCF43CF44F3A7F3A9F3A4CF45F2FCCF46CF47CF48F3ABCF49F3AACF4ACF4BCF4CCF4DC2DDCF4ECF4FF3AECF50CF51F3B0CF52CF53CF54CF55CF56F3A1CF57CF58CF59F3B1F3ACCF5ACF5BCF5CCF5DCF5EF3AFF2FEF3ADCF5FCF60CF61CF62CF63CF64CF65F3B2CF66CF67CF68CF69F3B4CF6ACF6BCF6CCF6DF3A8CF6ECF6FCF70CF71F3B3CF72CF73CF74F3B5CF75CF76CF77CF78CF79CF7ACF7BCF7CCF7DCF7ED0B7CF80CF81CF82CF83F3B8CF84CF85CF86CF87D9F9CF88CF89CF8ACF8BCF8CCF8DF3B9CF8ECF8FCF90CF91CF92CF93CF94CF95F3B7CF96C8E4F3B6CF97CF98CF99CF9AF3BACF9BCF9CCF9DCF9ECF9FF3BBB4C0CFA0D040D041D042D043D044D045D046D047D048D049D04AD04BD04CD04DEEC3D04ED04FD050D051D052D053F3BCD054D055F3BDD056D057D058D1AAD059D05AD05BF4ACD0C6D05CD05DD05ED05FD060D061D0D0D1DCD062D063D064D065D066D067CFCED068D069BDD6D06AD1C3D06BD06CD06DD06ED06FD070D071BAE2E1E9D2C2F1C2B2B9D072D073B1EDF1C3D074C9C0B3C4D075D9F2D076CBA5D077F1C4D078D079D07AD07BD6D4D07CD07DD07ED080D081F1C5F4C0F1C6D082D4ACF1C7D083B0C0F4C1D084D085F4C2D086D087B4FCD088C5DBD089D08AD08BD08CCCBBD08DD08ED08FD0E4D090D091D092D093D094CDE0D095D096D097D098D099F1C8D09AD9F3D09BD09CD09DD09ED09FD0A0B1BBD140CFAED141D142D143B8A4D144D145D146D147D148F1CAD149D14AD14BD14CF1CBD14DD14ED14FD150B2C3C1D1D151D152D7B0F1C9D153D154F1CCD155D156D157D158F1CED159D15AD15BD9F6D15CD2E1D4A3D15DD15EF4C3C8B9D15FD160D161D162D163F4C4D164D165F1CDF1CFBFE3F1D0D166D167F1D4D168D169D16AD16BD16CD16DD16EF1D6F1D1D16FC9D1C5E1D170D171D172C2E3B9FCD173D174F1D3D175F1D5D176D177D178B9D3D179D17AD17BD17CD17DD17ED180F1DBD181D182D183D184D185BAD6D186B0FDF1D9D187D188D189D18AD18BF1D8F1D2F1DAD18CD18DD18ED18FD190F1D7D191D192D193C8ECD194D195D196D197CDCAF1DDD198D199D19AD19BE5BDD19CD19DD19EF1DCD19FF1DED1A0D240D241D242D243D244D245D246D247D248F1DFD249D24ACFE5D24BD24CD24DD24ED24FD250D251D252D253D254D255D256D257D258D259D25AD25BD25CD25DD25ED25FD260D261D262D263F4C5BDF3D264D265D266D267D268D269F1E0D26AD26BD26CD26DD26ED26FD270D271D272D273D274D275D276D277D278D279D27AD27BD27CD27DF1E1D27ED280D281CEF7D282D2AAD283F1FBD284D285B8B2D286D287D288D289D28AD28BD28CD28DD28ED28FD290D291D292D293D294D295D296D297D298D299D29AD29BD29CD29DD29ED29FD2A0D340D341D342D343D344D345D346D347D348D349D34AD34BD34CD34DD34ED34FD350D351D352D353D354D355D356D357D358D359D35AD35BD35CD35DD35EBCFBB9DBD35FB9E6C3D9CAD3EAE8C0C0BEF5EAE9EAEAEAEBD360EAECEAEDEAEEEAEFBDC7D361D362D363F5FBD364D365D366F5FDD367F5FED368F5FCD369D36AD36BD36CBDE2D36DF6A1B4A5D36ED36FD370D371F6A2D372D373D374F6A3D375D376D377ECB2D378D379D37AD37BD37CD37DD37ED380D381D382D383D384D1D4D385D386D387D388D389D38AD9EAD38BD38CD38DD38ED38FD390D391D392D393D394D395D396D397D398D399D39AD39BD39CD39DD39ED39FD3A0D440D441D442D443D444D445D446D447D448D449D44AD44BD44CD44DD44ED44FD450D451D452D453D454D455D456D457D458D459D45AD45BD45CD45DD45ED45FF6A4D460D461D462D463D464D465D466D467D468EEBAD469D46AD46BD46CD46DD46ED46FD470D471D472D473D474D475D476D477D478D479D47AD47BD47CD47DD47ED480D481D482D483D484D485D486D487D488D489D48AD48BD48CD48DD48ED48FD490D491D492D493D494D495D496D497D498D499D5B2D49AD49BD49CD49DD49ED49FD4A0D540D541D542D543D544D545D546D547D3FECCDCD548D549D54AD54BD54CD54DD54ED54FCAC4D550D551D552D553D554D555D556D557D558D559D55AD55BD55CD55DD55ED55FD560D561D562D563D564D565D566D567D568D569D56AD56BD56CD56DD56ED56FD570D571D572D573D574D575D576D577D578D579D57AD57BD57CD57DD57ED580D581D582D583D584D585D586D587D588D589D58AD58BD58CD58DD58ED58FD590D591D592D593D594D595D596D597D598D599D59AD59BD59CD59DD59ED59FD5A0D640D641D642D643D644D645D646D647D648D649D64AD64BD64CD64DD64ED64FD650D651D652D653D654D655D656D657D658D659D65AD65BD65CD65DD65ED65FD660D661D662E5C0D663D664D665D666D667D668D669D66AD66BD66CD66DD66ED66FD670D671D672D673D674D675D676D677D678D679D67AD67BD67CD67DD67ED680D681F6A5D682D683D684D685D686D687D688D689D68AD68BD68CD68DD68ED68FD690D691D692D693D694D695D696D697D698D699D69AD69BD69CD69DD69ED69FD6A0D740D741D742D743D744D745D746D747D748D749D74AD74BD74CD74DD74ED74FD750D751D752D753D754D755D756D757D758D759D75AD75BD75CD75DD75ED75FBEAFD760D761D762D763D764C6A9D765D766D767D768D769D76AD76BD76CD76DD76ED76FD770D771D772D773D774D775D776D777D778D779D77AD77BD77CD77DD77ED780D781D782D783D784D785D786D787D788D789D78AD78BD78CD78DD78ED78FD790D791D792D793D794D795D796D797D798DAA5BCC6B6A9B8BCC8CFBCA5DAA6DAA7CCD6C8C3DAA8C6FDD799D1B5D2E9D1B6BCC7D79ABDB2BBE4DAA9DAAAD1C8DAABD0EDB6EFC2DBD79BCBCFB7EDC9E8B7C3BEF7D6A4DAACDAADC6C0D7E7CAB6D79CD5A9CBDFD5EFDAAED6DFB4CADAB0DAAFD79DD2EBDAB1DAB2DAB3CAD4DAB4CAABDAB5DAB6B3CFD6EFDAB7BBB0B5AEDAB8DAB9B9EED1AFD2E8DABAB8C3CFEAB2EFDABBDABCD79EBDEBCEDCD3EFDABDCEF3DABED3D5BBE5DABFCBB5CBD0DAC0C7EBD6EEDAC1C5B5B6C1DAC2B7CCBFCEDAC3DAC4CBADDAC5B5F7DAC6C1C2D7BBDAC7CCB8D79FD2EAC4B1DAC8B5FDBBD1DAC9D0B3DACADACBCEBDDACCDACDDACEB2F7DAD1DACFD1E8DAD0C3D5DAD2D7A0DAD3DAD4DAD5D0BBD2A5B0F9DAD6C7ABDAD7BDF7C3A1DAD8DAD9C3FDCCB7DADADADBC0BEC6D7DADCDADDC7B4DADEDADFB9C8D840D841D842D843D844D845D846D847D848BBEDD849D84AD84BD84CB6B9F4F8D84DF4F9D84ED84FCDE3D850D851D852D853D854D855D856D857F5B9D858D859D85AD85BEBE0D85CD85DD85ED85FD860D861CFF3BBBFD862D863D864D865D866D867D868BAC0D4A5D869D86AD86BD86CD86DD86ED86FE1D9D870D871D872D873F5F4B1AAB2F2D874D875D876D877D878D879D87AF5F5D87BD87CF5F7D87DD87ED880BAD1F5F6D881C3B2D882D883D884D885D886D887D888F5F9D889D88AD88BF5F8D88CD88DD88ED88FD890D891D892D893D894D895D896D897D898D899D89AD89BD89CD89DD89ED89FD8A0D940D941D942D943D944D945D946D947D948D949D94AD94BD94CD94DD94ED94FD950D951D952D953D954D955D956D957D958D959D95AD95BD95CD95DD95ED95FD960D961D962D963D964D965D966D967D968D969D96AD96BD96CD96DD96ED96FD970D971D972D973D974D975D976D977D978D979D97AD97BD97CD97DD97ED980D981D982D983D984D985D986D987D988D989D98AD98BD98CD98DD98ED98FD990D991D992D993D994D995D996D997D998D999D99AD99BD99CD99DD99ED99FD9A0DA40DA41DA42DA43DA44DA45DA46DA47DA48DA49DA4ADA4BDA4CDA4DDA4EB1B4D5EAB8BADA4FB9B1B2C6D4F0CFCDB0DCD5CBBBF5D6CAB7B7CCB0C6B6B1E1B9BAD6FCB9E1B7A1BCFAEADAEADBCCF9B9F3EADCB4FBC3B3B7D1BAD8EADDD4F4EADEBCD6BBDFEADFC1DEC2B8D4DFD7CAEAE0EAE1EAE4EAE2EAE3C9DEB8B3B6C4EAE5CAEAC9CDB4CDDA50DA51E2D9C5E2EAE6C0B5DA52D7B8EAE7D7ACC8FCD8D3D8CDD4DEDA53D4F9C9C4D3AEB8D3B3E0DA54C9E2F4F6DA55DA56DA57BAD5DA58F4F7DA59DA5AD7DFDA5BDA5CF4F1B8B0D5D4B8CFC6F0DA5DDA5EDA5FDA60DA61DA62DA63DA64DA65B3C3DA66DA67F4F2B3ACDA68DA69DA6ADA6BD4BDC7F7DA6CDA6DDA6EDA6FDA70F4F4DA71DA72F4F3DA73DA74DA75DA76DA77DA78DA79DA7ADA7BDA7CCCCBDA7DDA7EDA80C8A4DA81DA82DA83DA84DA85DA86DA87DA88DA89DA8ADA8BDA8CDA8DF4F5DA8ED7E3C5BFF5C0DA8FDA90F5BBDA91F5C3DA92F5C2DA93D6BAF5C1DA94DA95DA96D4BEF5C4DA97F5CCDA98DA99DA9ADA9BB0CFB5F8DA9CF5C9F5CADA9DC5DCDA9EDA9FDAA0DB40F5C5F5C6DB41DB42F5C7F5CBDB43BEE0F5C8B8FADB44DB45DB46F5D0F5D3DB47DB48DB49BFE7DB4AB9F2F5BCF5CDDB4BDB4CC2B7DB4DDB4EDB4FCCF8DB50BCF9DB51F5CEF5CFF5D1B6E5F5D2DB52F5D5DB53DB54DB55DB56DB57DB58DB59F5BDDB5ADB5BDB5CF5D4D3BBDB5DB3ECDB5EDB5FCCA4DB60DB61DB62DB63F5D6DB64DB65DB66DB67DB68DB69DB6ADB6BF5D7BEE1F5D8DB6CDB6DCCDFF5DBDB6EDB6FDB70DB71DB72B2C8D7D9DB73F5D9DB74F5DAF5DCDB75F5E2DB76DB77DB78F5E0DB79DB7ADB7BF5DFF5DDDB7CDB7DF5E1DB7EDB80F5DEF5E4F5E5DB81CCE3DB82DB83E5BFB5B8F5E3F5E8CCA3DB84DB85DB86DB87DB88F5E6F5E7DB89DB8ADB8BDB8CDB8DDB8EF5BEDB8FDB90DB91DB92DB93DB94DB95DB96DB97DB98DB99DB9AB1C4DB9BDB9CF5BFDB9DDB9EB5C5B2E4DB9FF5ECF5E9DBA0B6D7DC40F5EDDC41F5EADC42DC43DC44DC45DC46F5EBDC47DC48B4DADC49D4EADC4ADC4BDC4CF5EEDC4DB3F9DC4EDC4FDC50DC51DC52DC53DC54F5EFF5F1DC55DC56DC57F5F0DC58DC59DC5ADC5BDC5CDC5DDC5EF5F2DC5FF5F3DC60DC61DC62DC63DC64DC65DC66DC67DC68DC69DC6ADC6BC9EDB9AADC6CDC6DC7FBDC6EDC6FB6E3DC70DC71DC72DC73DC74DC75DC76CCC9DC77DC78DC79DC7ADC7BDC7CDC7DDC7EDC80DC81DC82DC83DC84DC85DC86DC87DC88DC89DC8AEAA6DC8BDC8CDC8DDC8EDC8FDC90DC91DC92DC93DC94DC95DC96DC97DC98DC99DC9ADC9BDC9CDC9DDC9EDC9FDCA0DD40DD41DD42DD43DD44DD45DD46DD47DD48DD49DD4ADD4BDD4CDD4DDD4EDD4FDD50DD51DD52DD53DD54DD55DD56DD57DD58DD59DD5ADD5BDD5CDD5DDD5EDD5FDD60DD61DD62DD63DD64DD65DD66DD67DD68DD69DD6ADD6BDD6CDD6DDD6EDD6FDD70DD71DD72DD73DD74DD75DD76DD77DD78DD79DD7ADD7BDD7CDD7DDD7EDD80DD81DD82DD83DD84DD85DD86DD87DD88DD89DD8ADD8BDD8CDD8DDD8EDD8FDD90DD91DD92DD93DD94DD95DD96DD97DD98DD99DD9ADD9BDD9CDD9DDD9EDD9FDDA0DE40DE41DE42DE43DE44DE45DE46DE47DE48DE49DE4ADE4BDE4CDE4DDE4EDE4FDE50DE51DE52DE53DE54DE55DE56DE57DE58DE59DE5ADE5BDE5CDE5DDE5EDE5FDE60B3B5D4FEB9ECD0F9DE61E9EDD7AAE9EEC2D6C8EDBAE4E9EFE9F0E9F1D6E1E9F2E9F3E9F5E9F4E9F6E9F7C7E1E9F8D4D8E9F9BDCEDE62E9FAE9FBBDCFE9FCB8A8C1BEE9FDB1B2BBD4B9F5E9FEDE63EAA1EAA2EAA3B7F8BCADDE64CAE4E0CED4AFCFBDD5B7EAA4D5DEEAA5D0C1B9BCDE65B4C7B1D9DE66DE67DE68C0B1DE69DE6ADE6BDE6CB1E6B1E7DE6DB1E8DE6EDE6FDE70DE71B3BDC8E8DE72DE73DE74DE75E5C1DE76DE77B1DFDE78DE79DE7AC1C9B4EFDE7BDE7CC7A8D3D8DE7DC6F9D1B8DE7EB9FDC2F5DE80DE81DE82DE83DE84D3ADDE85D4CBBDFCDE86E5C2B7B5E5C3DE87DE88BBB9D5E2DE89BDF8D4B6CEA5C1ACB3D9DE8ADE8BCCF6DE8CE5C6E5C4E5C8DE8DE5CAE5C7B5CFC6C8DE8EB5FCE5C5DE8FCAF6DE90DE91E5C9DE92DE93DE94C3D4B1C5BCA3DE95DE96DE97D7B7DE98DE99CDCBCBCDCACACCD3E5CCE5CBC4E6DE9ADE9BD1A1D1B7E5CDDE9CE5D0DE9DCDB8D6F0E5CFB5DDDE9ECDBEDE9FE5D1B6BADEA0DF40CDA8B9E4DF41CAC5B3D1CBD9D4ECE5D2B7EADF42DF43DF44E5CEDF45DF46DF47DF48DF49DF4AE5D5B4FEE5D6DF4BDF4CDF4DDF4EDF4FE5D3E5D4DF50D2DDDF51DF52C2DFB1C6DF53D3E2DF54DF55B6DDCBECDF56E5D7DF57DF58D3F6DF59DF5ADF5BDF5CDF5DB1E9DF5EB6F4E5DAE5D8E5D9B5C0DF5FDF60DF61D2C5E5DCDF62DF63E5DEDF64DF65DF66DF67DF68DF69E5DDC7B2DF6AD2A3DF6BDF6CE5DBDF6DDF6EDF6FDF70D4E2D5DADF71DF72DF73DF74DF75E5E0D7F1DF76DF77DF78DF79DF7ADF7BDF7CE5E1DF7DB1DCD1FBDF7EE5E2E5E4DF80DF81DF82DF83E5E3DF84DF85E5E5DF86DF87DF88DF89DF8AD2D8DF8BB5CBDF8CE7DFDF8DDAF5DF8EDAF8DF8FDAF6DF90DAF7DF91DF92DF93DAFAD0CFC4C7DF94DF95B0EEDF96DF97DF98D0B0DF99DAF9DF9AD3CABAAADBA2C7F1DF9BDAFCDAFBC9DBDAFDDF9CDBA1D7DEDAFEC1DADF9DDF9EDBA5DF9FDFA0D3F4E040E041DBA7DBA4E042DBA8E043E044BDBCE045E046E047C0C9DBA3DBA6D6A3E048DBA9E049E04AE04BDBADE04CE04DE04EDBAEDBACBAC2E04FE050E051BFA4DBABE052E053E054DBAAD4C7B2BFE055E056DBAFE057B9F9E058DBB0E059E05AE05BE05CB3BBE05DE05EE05FB5A6E060E061E062E063B6BCDBB1E064E065E066B6F5E067DBB2E068E069E06AE06BE06CE06DE06EE06FE070E071E072E073E074E075E076E077E078E079E07AE07BB1C9E07CE07DE07EE080DBB4E081E082E083DBB3DBB5E084E085E086E087E088E089E08AE08BE08CE08DE08EDBB7E08FDBB6E090E091E092E093E094E095E096DBB8E097E098E099E09AE09BE09CE09DE09EE09FDBB9E0A0E140DBBAE141E142D3CFF4FAC7F5D7C3C5E4F4FCF4FDF4FBE143BEC6E144E145E146E147D0EFE148E149B7D3E14AE14BD4CDCCAAE14CE14DF5A2F5A1BAA8F4FECBD6E14EE14FE150F5A4C0D2E151B3EAE152CDAAF5A5F5A3BDB4F5A8E153F5A9BDCDC3B8BFE1CBE1F5AAE154E155E156F5A6F5A7C4F0E157E158E159E15AE15BF5ACE15CB4BCE15DD7EDE15EB4D7F5ABF5AEE15FE160F5ADF5AFD0D1E161E162E163E164E165E166E167C3D1C8A9E168E169E16AE16BE16CE16DF5B0F5B1E16EE16FE170E171E172E173F5B2E174E175F5B3F5B4F5B5E176E177E178E179F5B7F5B6E17AE17BE17CE17DF5B8E17EE180E181E182E183E184E185E186E187E188E189E18AB2C9E18BD3D4CACDE18CC0EFD6D8D2B0C1BFE18DBDF0E18EE18FE190E191E192E193E194E195E196E197B8AAE198E199E19AE19BE19CE19DE19EE19FE1A0E240E241E242E243E244E245E246E247E248E249E24AE24BE24CE24DE24EE24FE250E251E252E253E254E255E256E257E258E259E25AE25BE25CE25DE25EE25FE260E261E262E263E264E265E266E267E268E269E26AE26BE26CE26DE26EE26FE270E271E272E273E274E275E276E277E278E279E27AE27BE27CE27DE27EE280E281E282E283E284E285E286E287E288E289E28AE28BE28CE28DE28EE28FE290E291E292E293E294E295E296E297E298E299E29AE29BE29CE29DE29EE29FE2A0E340E341E342E343E344E345E346E347E348E349E34AE34BE34CE34DE34EE34FE350E351E352E353E354E355E356E357E358E359E35AE35BE35CE35DE35EE35FE360E361E362E363E364E365E366E367E368E369E36AE36BE36CE36DBCF8E36EE36FE370E371E372E373E374E375E376E377E378E379E37AE37BE37CE37DE37EE380E381E382E383E384E385E386E387F6C6E388E389E38AE38BE38CE38DE38EE38FE390E391E392E393E394E395E396E397E398E399E39AE39BE39CE39DE39EE39FE3A0E440E441E442E443E444E445F6C7E446E447E448E449E44AE44BE44CE44DE44EE44FE450E451E452E453E454E455E456E457E458E459E45AE45BE45CE45DE45EF6C8E45FE460E461E462E463E464E465E466E467E468E469E46AE46BE46CE46DE46EE46FE470E471E472E473E474E475E476E477E478E479E47AE47BE47CE47DE47EE480E481E482E483E484E485E486E487E488E489E48AE48BE48CE48DE48EE48FE490E491E492E493E494E495E496E497E498E499E49AE49BE49CE49DE49EE49FE4A0E540E541E542E543E544E545E546E547E548E549E54AE54BE54CE54DE54EE54FE550E551E552E553E554E555E556E557E558E559E55AE55BE55CE55DE55EE55FE560E561E562E563E564E565E566E567E568E569E56AE56BE56CE56DE56EE56FE570E571E572E573F6C9E574E575E576E577E578E579E57AE57BE57CE57DE57EE580E581E582E583E584E585E586E587E588E589E58AE58BE58CE58DE58EE58FE590E591E592E593E594E595E596E597E598E599E59AE59BE59CE59DE59EE59FF6CAE5A0E640E641E642E643E644E645E646E647E648E649E64AE64BE64CE64DE64EE64FE650E651E652E653E654E655E656E657E658E659E65AE65BE65CE65DE65EE65FE660E661E662F6CCE663E664E665E666E667E668E669E66AE66BE66CE66DE66EE66FE670E671E672E673E674E675E676E677E678E679E67AE67BE67CE67DE67EE680E681E682E683E684E685E686E687E688E689E68AE68BE68CE68DE68EE68FE690E691E692E693E694E695E696E697E698E699E69AE69BE69CE69DF6CBE69EE69FE6A0E740E741E742E743E744E745E746E747F7E9E748E749E74AE74BE74CE74DE74EE74FE750E751E752E753E754E755E756E757E758E759E75AE75BE75CE75DE75EE75FE760E761E762E763E764E765E766E767E768E769E76AE76BE76CE76DE76EE76FE770E771E772E773E774E775E776E777E778E779E77AE77BE77CE77DE77EE780E781E782E783E784E785E786E787E788E789E78AE78BE78CE78DE78EE78FE790E791E792E793E794E795E796E797E798E799E79AE79BE79CE79DE79EE79FE7A0E840E841E842E843E844E845E846E847E848E849E84AE84BE84CE84DE84EF6CDE84FE850E851E852E853E854E855E856E857E858E859E85AE85BE85CE85DE85EE85FE860E861E862E863E864E865E866E867E868E869E86AE86BE86CE86DE86EE86FE870E871E872E873E874E875E876E877E878E879E87AF6CEE87BE87CE87DE87EE880E881E882E883E884E885E886E887E888E889E88AE88BE88CE88DE88EE88FE890E891E892E893E894EEC4EEC5EEC6D5EBB6A4EEC8EEC7EEC9EECAC7A5EECBEECCE895B7B0B5F6EECDEECFE896EECEE897B8C6EED0EED1EED2B6DBB3AED6D3C4C6B1B5B8D6EED3EED4D4BFC7D5BEFBCED9B9B3EED6EED5EED8EED7C5A5EED9EEDAC7AEEEDBC7AFEEDCB2A7EEDDEEDEEEDFEEE0EEE1D7EAEEE2EEE3BCD8EEE4D3CBCCFAB2ACC1E5EEE5C7A6C3ADE898EEE6EEE7EEE8EEE9EEEAEEEBEEECE899EEEDEEEEEEEFE89AE89BEEF0EEF1EEF2EEF4EEF3E89CEEF5CDADC2C1EEF6EEF7EEF8D5A1EEF9CFB3EEFAEEFBE89DEEFCEEFDEFA1EEFEEFA2B8F5C3FAEFA3EFA4BDC2D2BFB2F9EFA5EFA6EFA7D2F8EFA8D6FDEFA9C6CCE89EEFAAEFABC1B4EFACCFFACBF8EFAEEFADB3FAB9F8EFAFEFB0D0E2EFB1EFB2B7E6D0BFEFB3EFB4EFB5C8F1CCE0EFB6EFB7EFB8EFB9EFBAD5E0EFBBB4EDC3AAEFBCE89FEFBDEFBEEFBFE8A0CEFDEFC0C2E0B4B8D7B6BDF5E940CFC7EFC3EFC1EFC2EFC4B6A7BCFCBEE2C3CCEFC5EFC6E941EFC7EFCFEFC8EFC9EFCAC7C2EFF1B6CDEFCBE942EFCCEFCDB6C6C3BEEFCEE943EFD0EFD1EFD2D5F2E944EFD3C4F7E945EFD4C4F8EFD5EFD6B8E4B0F7EFD7EFD8EFD9E946EFDAEFDBEFDCEFDDE947EFDEBEB5EFE1EFDFEFE0E948EFE2EFE3C1CDEFE4EFE5EFE6EFE7EFE8EFE9EFEAEFEBEFECC0D8E949EFEDC1ADEFEEEFEFEFF0E94AE94BCFE2E94CE94DE94EE94FE950E951E952E953B3A4E954E955E956E957E958E959E95AE95BE95CE95DE95EE95FE960E961E962E963E964E965E966E967E968E969E96AE96BE96CE96DE96EE96FE970E971E972E973E974E975E976E977E978E979E97AE97BE97CE97DE97EE980E981E982E983E984E985E986E987E988E989E98AE98BE98CE98DE98EE98FE990E991E992E993E994E995E996E997E998E999E99AE99BE99CE99DE99EE99FE9A0EA40EA41EA42EA43EA44EA45EA46EA47EA48EA49EA4AEA4BEA4CEA4DEA4EEA4FEA50EA51EA52EA53EA54EA55EA56EA57EA58EA59EA5AEA5BC3C5E3C5C9C1E3C6EA5CB1D5CECAB4B3C8F2E3C7CFD0E3C8BCE4E3C9E3CAC3C6D5A2C4D6B9EBCEC5E3CBC3F6E3CCEA5DB7A7B8F3BAD2E3CDE3CED4C4E3CFEA5EE3D0D1CBE3D1E3D2E3D3E3D4D1D6E3D5B2FBC0BBE3D6EA5FC0ABE3D7E3D8E3D9EA60E3DAE3DBEA61B8B7DAE2EA62B6D3EA63DAE4DAE3EA64EA65EA66EA67EA68EA69EA6ADAE6EA6BEA6CEA6DC8EEEA6EEA6FDAE5B7C0D1F4D2F5D5F3BDD7EA70EA71EA72EA73D7E8DAE8DAE7EA74B0A2CDD3EA75DAE9EA76B8BDBCCAC2BDC2A4B3C2DAEAEA77C2AAC4B0BDB5EA78EA79CFDEEA7AEA7BEA7CDAEBC9C2EA7DEA7EEA80EA81EA82B1DDEA83EA84EA85DAECEA86B6B8D4BAEA87B3FDEA88EA89DAEDD4C9CFD5C5E3EA8ADAEEEA8BEA8CEA8DEA8EEA8FDAEFEA90DAF0C1EACCD5CFDDEA91EA92EA93EA94EA95EA96EA97EA98EA99EA9AEA9BEA9CEA9DD3E7C2A1EA9EDAF1EA9FEAA0CBE5EB40DAF2EB41CBE6D2FEEB42EB43EB44B8F4EB45EB46DAF3B0AFCFB6EB47EB48D5CFEB49EB4AEB4BEB4CEB4DEB4EEB4FEB50EB51EB52CBEDEB53EB54EB55EB56EB57EB58EB59EB5ADAF4EB5BEB5CE3C4EB5DEB5EC1A5EB5FEB60F6BFEB61EB62F6C0F6C1C4D1EB63C8B8D1E3EB64EB65D0DBD1C5BCAFB9CDEB66EFF4EB67EB68B4C6D3BAF6C2B3FBEB69EB6AF6C3EB6BEB6CB5F1EB6DEB6EEB6FEB70EB71EB72EB73EB74EB75EB76F6C5EB77EB78EB79EB7AEB7BEB7CEB7DD3EAF6A7D1A9EB7EEB80EB81EB82F6A9EB83EB84EB85F6A8EB86EB87C1E3C0D7EB88B1A2EB89EB8AEB8BEB8CCEEDEB8DD0E8F6ABEB8EEB8FCFF6EB90F6AAD5F0F6ACC3B9EB91EB92EB93BBF4F6AEF6ADEB94EB95EB96C4DEEB97EB98C1D8EB99EB9AEB9BEB9CEB9DCBAAEB9ECFBCEB9FEBA0EC40EC41EC42EC43EC44EC45EC46EC47EC48F6AFEC49EC4AF6B0EC4BEC4CF6B1EC4DC2B6EC4EEC4FEC50EC51EC52B0D4C5F9EC53EC54EC55EC56F6B2EC57EC58EC59EC5AEC5BEC5CEC5DEC5EEC5FEC60EC61EC62EC63EC64EC65EC66EC67EC68EC69C7E0F6A6EC6AEC6BBEB8EC6CEC6DBEB2EC6EB5E5EC6FEC70B7C7EC71BFBFC3D2C3E6EC72EC73D8CCEC74EC75EC76B8EFEC77EC78EC79EC7AEC7BEC7CEC7DEC7EEC80BDF9D1A5EC81B0D0EC82EC83EC84EC85EC86F7B0EC87EC88EC89EC8AEC8BEC8CEC8DEC8EF7B1EC8FEC90EC91EC92EC93D0ACEC94B0B0EC95EC96EC97F7B2F7B3EC98F7B4EC99EC9AEC9BC7CAEC9CEC9DEC9EEC9FECA0ED40ED41BECFED42ED43F7B7ED44ED45ED46ED47ED48ED49ED4AF7B6ED4BB1DEED4CF7B5ED4DED4EF7B8ED4FF7B9ED50ED51ED52ED53ED54ED55ED56ED57ED58ED59ED5AED5BED5CED5DED5EED5FED60ED61ED62ED63ED64ED65ED66ED67ED68ED69ED6AED6BED6CED6DED6EED6FED70ED71ED72ED73ED74ED75ED76ED77ED78ED79ED7AED7BED7CED7DED7EED80ED81CEA4C8CDED82BAABE8B8E8B9E8BABEC2ED83ED84ED85ED86ED87D2F4ED88D4CFC9D8ED89ED8AED8BED8CED8DED8EED8FED90ED91ED92ED93ED94ED95ED96ED97ED98ED99ED9AED9BED9CED9DED9EED9FEDA0EE40EE41EE42EE43EE44EE45EE46EE47EE48EE49EE4AEE4BEE4CEE4DEE4EEE4FEE50EE51EE52EE53EE54EE55EE56EE57EE58EE59EE5AEE5BEE5CEE5DEE5EEE5FEE60EE61EE62EE63EE64EE65EE66EE67EE68EE69EE6AEE6BEE6CEE6DEE6EEE6FEE70EE71EE72EE73EE74EE75EE76EE77EE78EE79EE7AEE7BEE7CEE7DEE7EEE80EE81EE82EE83EE84EE85EE86EE87EE88EE89EE8AEE8BEE8CEE8DEE8EEE8FEE90EE91EE92EE93EE94EE95EE96EE97EE98EE99EE9AEE9BEE9CEE9DEE9EEE9FEEA0EF40EF41EF42EF43EF44EF45D2B3B6A5C7EAF1FCCFEECBB3D0EBE7EFCDE7B9CBB6D9F1FDB0E4CBCCF1FED4A4C2ADC1ECC6C4BEB1F2A1BCD5EF46F2A2F2A3EF47F2A4D2C3C6B5EF48CDC7F2A5EF49D3B1BFC5CCE2EF4AF2A6F2A7D1D5B6EEF2A8F2A9B5DFF2AAF2ABEF4BB2FCF2ACF2ADC8A7EF4CEF4DEF4EEF4FEF50EF51EF52EF53EF54EF55EF56EF57EF58EF59EF5AEF5BEF5CEF5DEF5EEF5FEF60EF61EF62EF63EF64EF65EF66EF67EF68EF69EF6AEF6BEF6CEF6DEF6EEF6FEF70EF71B7E7EF72EF73ECA9ECAAECABEF74ECACEF75EF76C6AEECADECAEEF77EF78EF79B7C9CAB3EF7AEF7BEF7CEF7DEF7EEF80EF81E2B8F7CFEF82EF83EF84EF85EF86EF87EF88EF89EF8AEF8BEF8CEF8DEF8EEF8FEF90EF91EF92EF93EF94EF95EF96EF97EF98EF99EF9AEF9BEF9CEF9DEF9EEF9FEFA0F040F041F042F043F044F7D0F045F046B2CDF047F048F049F04AF04BF04CF04DF04EF04FF050F051F052F053F054F055F056F057F058F059F05AF05BF05CF05DF05EF05FF060F061F062F063F7D1F064F065F066F067F068F069F06AF06BF06CF06DF06EF06FF070F071F072F073F074F075F076F077F078F079F07AF07BF07CF07DF07EF080F081F082F083F084F085F086F087F088F089F7D3F7D2F08AF08BF08CF08DF08EF08FF090F091F092F093F094F095F096E2BBF097BCA2F098E2BCE2BDE2BEE2BFE2C0E2C1B7B9D2FBBDA4CACEB1A5CBC7F099E2C2B6FCC8C4E2C3F09AF09BBDC8F09CB1FDE2C4F09DB6F6E2C5C4D9F09EF09FE2C6CFDAB9DDE2C7C0A1F0A0E2C8B2F6F140E2C9F141C1F3E2CAE2CBC2F8E2CCE2CDE2CECAD7D8B8D9E5CFE3F142F143F144F145F146F147F148F149F14AF14BF14CF0A5F14DF14EDCB0F14FF150F151F152F153F154F155F156F157F158F159F15AF15BF15CF15DF15EF15FF160F161F162F163F164F165F166F167F168F169F16AF16BF16CF16DF16EF16FF170F171F172F173F174F175F176F177F178F179F17AF17BF17CF17DF17EF180F181F182F183F184F185F186F187F188F189F18AF18BF18CF18DF18EF18FF190F191F192F193F194F195F196F197F198F199F19AF19BF19CF19DF19EF19FF1A0F240F241F242F243F244F245F246F247F248F249F24AF24BF24CF24DF24EF24FF250F251F252F253F254F255F256F257F258F259F25AF25BF25CF25DF25EF25FF260F261F262F263F264F265F266F267F268F269F26AF26BF26CF26DF26EF26FF270F271F272F273F274F275F276F277F278F279F27AF27BF27CF27DF27EF280F281F282F283F284F285F286F287F288F289F28AF28BF28CF28DF28EF28FF290F291F292F293F294F295F296F297F298F299F29AF29BF29CF29DF29EF29FF2A0F340F341F342F343F344F345F346F347F348F349F34AF34BF34CF34DF34EF34FF350F351C2EDD4A6CDD4D1B1B3DBC7FDF352B2B5C2BFE6E0CABBE6E1E6E2BED4E6E3D7A4CDD5E6E5BCDDE6E4E6E6E6E7C2EEF353BDBEE6E8C2E6BAA7E6E9F354E6EAB3D2D1E9F355F356BFA5E6EBC6EFE6ECE6EDF357F358E6EEC6ADE6EFF359C9A7E6F0E6F1E6F2E5B9E6F3E6F4C2E2E6F5E6F6D6E8E6F7F35AE6F8B9C7F35BF35CF35DF35EF35FF360F361F7BBF7BAF362F363F364F365F7BEF7BCBAA1F366F7BFF367F7C0F368F369F36AF7C2F7C1F7C4F36BF36CF7C3F36DF36EF36FF370F371F7C5F7C6F372F373F374F375F7C7F376CBE8F377F378F379F37AB8DFF37BF37CF37DF37EF380F381F7D4F382F7D5F383F384F385F386F7D6F387F388F389F38AF7D8F38BF7DAF38CF7D7F38DF38EF38FF390F391F392F393F394F395F7DBF396F7D9F397F398F399F39AF39BF39CF39DD7D7F39EF39FF3A0F440F7DCF441F442F443F444F445F446F7DDF447F448F449F7DEF44AF44BF44CF44DF44EF44FF450F451F452F453F454F7DFF455F456F457F7E0F458F459F45AF45BF45CF45DF45EF45FF460F461F462DBCBF463F464D8AAF465F466F467F468F469F46AF46BF46CE5F7B9EDF46DF46EF46FF470BFFDBBEAF7C9C6C7F7C8F471F7CAF7CCF7CBF472F473F474F7CDF475CEBAF476F7CEF477F478C4A7F479F47AF47BF47CF47DF47EF480F481F482F483F484F485F486F487F488F489F48AF48BF48CF48DF48EF48FF490F491F492F493F494F495F496F497F498F499F49AF49BF49CF49DF49EF49FF4A0F540F541F542F543F544F545F546F547F548F549F54AF54BF54CF54DF54EF54FF550F551F552F553F554F555F556F557F558F559F55AF55BF55CF55DF55EF55FF560F561F562F563F564F565F566F567F568F569F56AF56BF56CF56DF56EF56FF570F571F572F573F574F575F576F577F578F579F57AF57BF57CF57DF57EF580F581F582F583F584F585F586F587F588F589F58AF58BF58CF58DF58EF58FF590F591F592F593F594F595F596F597F598F599F59AF59BF59CF59DF59EF59FF5A0F640F641F642F643F644F645F646F647F648F649F64AF64BF64CF64DF64EF64FF650F651F652F653F654F655F656F657F658F659F65AF65BF65CF65DF65EF65FF660F661F662F663F664F665F666F667F668F669F66AF66BF66CF66DF66EF66FF670F671F672F673F674F675F676F677F678F679F67AF67BF67CF67DF67EF680F681F682F683F684F685F686F687F688F689F68AF68BF68CF68DF68EF68FF690F691F692F693F694F695F696F697F698F699F69AF69BF69CF69DF69EF69FF6A0F740F741F742F743F744F745F746F747F748F749F74AF74BF74CF74DF74EF74FF750F751F752F753F754F755F756F757F758F759F75AF75BF75CF75DF75EF75FF760F761F762F763F764F765F766F767F768F769F76AF76BF76CF76DF76EF76FF770F771F772F773F774F775F776F777F778F779F77AF77BF77CF77DF77EF780D3E3F781F782F6CFF783C2B3F6D0F784F785F6D1F6D2F6D3F6D4F786F787F6D6F788B1ABF6D7F789F6D8F6D9F6DAF78AF6DBF6DCF78BF78CF78DF78EF6DDF6DECFCAF78FF6DFF6E0F6E1F6E2F6E3F6E4C0F0F6E5F6E6F6E7F6E8F6E9F790F6EAF791F6EBF6ECF792F6EDF6EEF6EFF6F0F6F1F6F2F6F3F6F4BEA8F793F6F5F6F6F6F7F6F8F794F795F796F797F798C8FAF6F9F6FAF6FBF6FCF799F79AF6FDF6FEF7A1F7A2F7A3F7A4F7A5F79BF79CF7A6F7A7F7A8B1EEF7A9F7AAF7ABF79DF79EF7ACF7ADC1DBF7AEF79FF7A0F7AFF840F841F842F843F844F845F846F847F848F849F84AF84BF84CF84DF84EF84FF850F851F852F853F854F855F856F857F858F859F85AF85BF85CF85DF85EF85FF860F861F862F863F864F865F866F867F868F869F86AF86BF86CF86DF86EF86FF870F871F872F873F874F875F876F877F878F879F87AF87BF87CF87DF87EF880F881F882F883F884F885F886F887F888F889F88AF88BF88CF88DF88EF88FF890F891F892F893F894F895F896F897F898F899F89AF89BF89CF89DF89EF89FF8A0F940F941F942F943F944F945F946F947F948F949F94AF94BF94CF94DF94EF94FF950F951F952F953F954F955F956F957F958F959F95AF95BF95CF95DF95EF95FF960F961F962F963F964F965F966F967F968F969F96AF96BF96CF96DF96EF96FF970F971F972F973F974F975F976F977F978F979F97AF97BF97CF97DF97EF980F981F982F983F984F985F986F987F988F989F98AF98BF98CF98DF98EF98FF990F991F992F993F994F995F996F997F998F999F99AF99BF99CF99DF99EF99FF9A0FA40FA41FA42FA43FA44FA45FA46FA47FA48FA49FA4AFA4BFA4CFA4DFA4EFA4FFA50FA51FA52FA53FA54FA55FA56FA57FA58FA59FA5AFA5BFA5CFA5DFA5EFA5FFA60FA61FA62FA63FA64FA65FA66FA67FA68FA69FA6AFA6BFA6CFA6DFA6EFA6FFA70FA71FA72FA73FA74FA75FA76FA77FA78FA79FA7AFA7BFA7CFA7DFA7EFA80FA81FA82FA83FA84FA85FA86FA87FA88FA89FA8AFA8BFA8CFA8DFA8EFA8FFA90FA91FA92FA93FA94FA95FA96FA97FA98FA99FA9AFA9BFA9CFA9DFA9EFA9FFAA0FB40FB41FB42FB43FB44FB45FB46FB47FB48FB49FB4AFB4BFB4CFB4DFB4EFB4FFB50FB51FB52FB53FB54FB55FB56FB57FB58FB59FB5AFB5BC4F1F0AFBCA6F0B0C3F9FB5CC5B8D1BBFB5DF0B1F0B2F0B3F0B4F0B5D1BCFB5ED1ECFB5FF0B7F0B6D4A7FB60CDD2F0B8F0BAF0B9F0BBF0BCFB61FB62B8EBF0BDBAE8FB63F0BEF0BFBEE9F0C0B6ECF0C1F0C2F0C3F0C4C8B5F0C5F0C6FB64F0C7C5F4FB65F0C8FB66FB67FB68F0C9FB69F0CAF7BDFB6AF0CBF0CCF0CDFB6BF0CEFB6CFB6DFB6EFB6FF0CFBAD7FB70F0D0F0D1F0D2F0D3F0D4F0D5F0D6F0D8FB71FB72D3A5F0D7FB73F0D9FB74FB75FB76FB77FB78FB79FB7AFB7BFB7CFB7DF5BAC2B9FB7EFB80F7E4FB81FB82FB83FB84F7E5F7E6FB85FB86F7E7FB87FB88FB89FB8AFB8BFB8CF7E8C2B4FB8DFB8EFB8FFB90FB91FB92FB93FB94FB95F7EAFB96F7EBFB97FB98FB99FB9AFB9BFB9CC2F3FB9DFB9EFB9FFBA0FC40FC41FC42FC43FC44FC45FC46FC47FC48F4F0FC49FC4AFC4BF4EFFC4CFC4DC2E9FC4EF7E1F7E2FC4FFC50FC51FC52FC53BBC6FC54FC55FC56FC57D9E4FC58FC59FC5ACAF2C0E8F0A4FC5BBADAFC5CFC5DC7ADFC5EFC5FFC60C4ACFC61FC62F7ECF7EDF7EEFC63F7F0F7EFFC64F7F1FC65FC66F7F4FC67F7F3FC68F7F2F7F5FC69FC6AFC6BFC6CF7F6FC6DFC6EFC6FFC70FC71FC72FC73FC74FC75EDE9FC76EDEAEDEBFC77F6BCFC78FC79FC7AFC7BFC7CFC7DFC7EFC80FC81FC82FC83FC84F6BDFC85F6BEB6A6FC86D8BEFC87FC88B9C4FC89FC8AFC8BD8BBFC8CDCB1FC8DFC8EFC8FFC90FC91FC92CAF3FC93F7F7FC94FC95FC96FC97FC98FC99FC9AFC9BFC9CF7F8FC9DFC9EF7F9FC9FFCA0FD40FD41FD42FD43FD44F7FBFD45F7FAFD46B1C7FD47F7FCF7FDFD48FD49FD4AFD4BFD4CF7FEFD4DFD4EFD4FFD50FD51FD52FD53FD54FD55FD56FD57C6EBECB4FD58FD59FD5AFD5BFD5CFD5DFD5EFD5FFD60FD61FD62FD63FD64FD65FD66FD67FD68FD69FD6AFD6BFD6CFD6DFD6EFD6FFD70FD71FD72FD73FD74FD75FD76FD77FD78FD79FD7AFD7BFD7CFD7DFD7EFD80FD81FD82FD83FD84FD85B3DDF6B3FD86FD87F6B4C1E4F6B5F6B6F6B7F6B8F6B9F6BAC8A3F6BBFD88FD89FD8AFD8BFD8CFD8DFD8EFD8FFD90FD91FD92FD93C1FAB9A8EDE8FD94FD95FD96B9EAD9DFFD97FD98FD99FD9AFD9'; + + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i), + code = str.charCodeAt(i); + if (c == " ") strOut += "+"; + else if (code >= 19968 && code <= 40869) { + var index = code - 19968; + strOut += "%" + z.substr(index * 4, 2) + "%" + z.substr(index * 4 + 2, 2); + } else { + strOut += "%" + str.charCodeAt(i).toString(16); + } + } + return strOut; + }, + /* 改变图片大小 */ + scale: function (img, w, h) { + var ow = img.width, + oh = img.height; + + if (ow >= oh) { + img.width = w * ow / oh; + img.height = h; + img.style.marginLeft = '-' + parseInt((img.width - w) / 2) + 'px'; + } else { + img.width = w; + img.height = h * oh / ow; + img.style.marginTop = '-' + parseInt((img.height - h) / 2) + 'px'; + } + }, + getImageData: function(){ + var _this = this, + key = $G('searchTxt').value, + type = $G('searchType').value, + keepOriginName = editor.options.keepOriginName ? "1" : "0", + url = "http://image.baidu.com/i?ct=201326592&cl=2&lm=-1&st=-1&tn=baiduimagejson&istype=2&rn=32&fm=index&pv=&word=" + _this.encodeToGb2312(key) + type + "&keeporiginname=" + keepOriginName + "&" + +new Date; + + $G('searchListUl').innerHTML = lang.searchLoading; + ajax.request(url, { + 'dataType': 'jsonp', + 'charset': 'GB18030', + 'onsuccess':function(json){ + var list = []; + if(json && json.data) { + for(var i = 0; i < json.data.length; i++) { + if(json.data[i].objURL) { + list.push({ + title: json.data[i].fromPageTitleEnc, + src: json.data[i].objURL, + url: json.data[i].fromURL + }); + } + } + } + _this.setList(list); + }, + 'onerror':function(){ + $G('searchListUl').innerHTML = lang.searchRetry; + } + }); + }, + /* 添加图片到列表界面上 */ + setList: function (list) { + var i, item, p, img, link, _this = this, + listUl = $G('searchListUl'); + + listUl.innerHTML = ''; + if(list.length) { + for (i = 0; i < list.length; i++) { + item = document.createElement('li'); + p = document.createElement('p'); + img = document.createElement('img'); + link = document.createElement('a'); + + img.onload = function () { + _this.scale(this, 113, 113); + }; + img.width = 113; + img.setAttribute('src', list[i].src); + + link.href = list[i].url; + link.target = '_blank'; + link.title = list[i].title; + link.innerHTML = list[i].title; + + p.appendChild(img); + item.appendChild(p); + item.appendChild(link); + listUl.appendChild(item); + } + } else { + listUl.innerHTML = lang.searchRetry; + } + }, + getInsertList: function () { + var child, + src, + align = getAlign(), + list = [], + items = $G('searchListUl').children; + for(var i = 0; i < items.length; i++) { + child = items[i].firstChild && items[i].firstChild.firstChild; + if(child.tagName && child.tagName.toLowerCase() == 'img' && domUtils.hasClass(items[i], 'selected')) { + src = child.src; + list.push({ + src: src, + _src: src, + alt: src.substr(src.lastIndexOf('/') + 1), + floatStyle: align + }); + } + } + return list; + } + }; + +})(); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/alignicon.jpg b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/alignicon.jpg new file mode 100644 index 0000000..754755b Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/alignicon.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/bg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/bg.png new file mode 100644 index 0000000..580be0a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/icons.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/icons.gif new file mode 100644 index 0000000..78459de Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/icons.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/icons.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/icons.png new file mode 100644 index 0000000..12e4700 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/icons.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/image.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/image.png new file mode 100644 index 0000000..19699f6 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/image.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/progress.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/progress.png new file mode 100644 index 0000000..717c486 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/progress.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/success.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/success.gif new file mode 100644 index 0000000..8d4f311 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/success.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/success.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/success.png new file mode 100644 index 0000000..94f968d Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/image/images/success.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/insertframe/insertframe.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/insertframe/insertframe.html new file mode 100644 index 0000000..7f1f3e9 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/insertframe/insertframe.html @@ -0,0 +1,98 @@ + + + + + + + + + +
            + + + + + + + + + + + + + + + + + + + +
            + + +
            px
            px
            + +
            +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/internal.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/internal.js new file mode 100644 index 0000000..44dc17f --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/internal.js @@ -0,0 +1,81 @@ +(function () { + var parent = window.parent; + //dialog对象 + dialog = parent.$EDITORUI[window.frameElement.id.replace( /_iframe$/, '' )]; + //当前打开dialog的编辑器实例 + editor = dialog.editor; + + UE = parent.UE; + + domUtils = UE.dom.domUtils; + + utils = UE.utils; + + browser = UE.browser; + + ajax = UE.ajax; + + $G = function ( id ) { + return document.getElementById( id ) + }; + //focus元素 + $focus = function ( node ) { + setTimeout( function () { + if ( browser.ie ) { + var r = node.createTextRange(); + r.collapse( false ); + r.select(); + } else { + node.focus() + } + }, 0 ) + }; + utils.loadFile(document,{ + href:editor.options.themePath + editor.options.theme + "/dialogbase.css?cache="+Math.random(), + tag:"link", + type:"text/css", + rel:"stylesheet" + }); + lang = editor.getLang(dialog.className.split( "-" )[2]); + if(lang){ + domUtils.on(window,'load',function () { + + var langImgPath = editor.options.langPath + editor.options.lang + "/images/"; + //针对静态资源 + for ( var i in lang["static"] ) { + var dom = $G( i ); + if(!dom) continue; + var tagName = dom.tagName, + content = lang["static"][i]; + if(content.src){ + //clone + content = utils.extend({},content,false); + content.src = langImgPath + content.src; + } + if(content.style){ + content = utils.extend({},content,false); + content.style = content.style.replace(/url\s*\(/g,"url(" + langImgPath) + } + switch ( tagName.toLowerCase() ) { + case "var": + dom.parentNode.replaceChild( document.createTextNode( content ), dom ); + break; + case "select": + var ops = dom.options; + for ( var j = 0, oj; oj = ops[j]; ) { + oj.innerHTML = content.options[j++]; + } + for ( var p in content ) { + p != "options" && dom.setAttribute( p, content[p] ); + } + break; + default : + domUtils.setAttributes( dom, content); + } + } + } ); + } + + +})(); + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/link/link.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/link/link.html new file mode 100644 index 0000000..55ab4d1 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/link/link.html @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + + +
            + + + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/map/map.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/map/map.html new file mode 100644 index 0000000..e763b8e --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/map/map.html @@ -0,0 +1,135 @@ + + + + + + + + + + +
            + + + + + + + + + +
            ::
            +
            + +
            + + + + + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/map/show.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/map/show.html new file mode 100644 index 0000000..329cfeb --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/map/show.html @@ -0,0 +1,118 @@ + + + + + + + 百度地图API自定义地图 + + + + + + + +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.css new file mode 100644 index 0000000..8fb7a94 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.css @@ -0,0 +1,30 @@ +.wrapper{margin: 5px 10px;} + +.searchBar{height:30px;padding:7px 0 3px;text-align:center;} +.searchBtn{font-size:13px;height:24px;} + +.resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;} + +.listPanel{overflow: hidden;} +.panelon{display:block;} +.paneloff{display:none} + +.page{width:220px;margin:20px auto;overflow: hidden;} +.pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center} +.pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff; + border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;} + +.m-box{width:460px;} +.m-m{float: left;line-height: 20px;height: 20px;} +.m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;} +.m-l{float:left;width:40px; } +.m-t{float:left;width:140px;} +.m-s{float:left;width:110px;} +.m-z{float:left;width:100px;} +.m-try-t{float: left;width: 60px;;} + +.m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;} +.m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;} + +.loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat} +.empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.html new file mode 100644 index 0000000..e7ef04f --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.html @@ -0,0 +1,32 @@ + + + + + 插入音乐 + + + + +
            + +
            + +
            +
            +
            +
            + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.js new file mode 100644 index 0000000..1c538bf --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/music/music.js @@ -0,0 +1,192 @@ +function Music() { + this.init(); +} +(function () { + var pages = [], + panels = [], + selectedItem = null; + Music.prototype = { + total:70, + pageSize:10, + dataUrl:"http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.search.common", + playerUrl:"http://box.baidu.com/widget/flash/bdspacesong.swf", + + init:function () { + var me = this; + domUtils.on($G("J_searchName"), "keyup", function (event) { + var e = window.event || event; + if (e.keyCode == 13) { + me.dosearch(); + } + }); + domUtils.on($G("J_searchBtn"), "click", function () { + me.dosearch(); + }); + }, + callback:function (data) { + var me = this; + me.data = data.song_list; + setTimeout(function () { + $G('J_resultBar').innerHTML = me._renderTemplate(data.song_list); + }, 300); + }, + dosearch:function () { + var me = this; + selectedItem = null; + var key = $G('J_searchName').value; + if (utils.trim(key) == "")return false; + key = encodeURIComponent(key); + me._sent(key); + }, + doselect:function (i) { + var me = this; + if (typeof i == 'object') { + selectedItem = i; + } else if (typeof i == 'number') { + selectedItem = me.data[i]; + } + }, + onpageclick:function (id) { + var me = this; + for (var i = 0; i < pages.length; i++) { + $G(pages[i]).className = 'pageoff'; + $G(panels[i]).className = 'paneloff'; + } + $G('page' + id).className = 'pageon'; + $G('panel' + id).className = 'panelon'; + }, + listenTest:function (elem) { + var me = this, + view = $G('J_preview'), + is_play_action = (elem.className == 'm-try'), + old_trying = me._getTryingElem(); + + if (old_trying) { + old_trying.className = 'm-try'; + view.innerHTML = ''; + } + if (is_play_action) { + elem.className = 'm-trying'; + view.innerHTML = me._buildMusicHtml(me._getUrl(true)); + } + }, + _sent:function (param) { + var me = this; + $G('J_resultBar').innerHTML = '
            '; + + utils.loadFile(document, { + src:me.dataUrl + '&query=' + param + '&page_size=' + me.total + '&callback=music.callback&.r=' + Math.random(), + tag:"script", + type:"text/javascript", + defer:"defer" + }); + }, + _removeHtml:function (str) { + var reg = /<\s*\/?\s*[^>]*\s*>/gi; + return str.replace(reg, ""); + }, + _getUrl:function (isTryListen) { + var me = this; + var param = 'from=tiebasongwidget&url=&name=' + encodeURIComponent(me._removeHtml(selectedItem.title)) + '&artist=' + + encodeURIComponent(me._removeHtml(selectedItem.author)) + '&extra=' + + encodeURIComponent(me._removeHtml(selectedItem.album_title)) + + '&autoPlay='+isTryListen+'' + '&loop=true'; + return me.playerUrl + "?" + param; + }, + _getTryingElem:function () { + var s = $G('J_listPanel').getElementsByTagName('span'); + + for (var i = 0; i < s.length; i++) { + if (s[i].className == 'm-trying') + return s[i]; + } + return null; + }, + _buildMusicHtml:function (playerUrl) { + var html = ' 12) + return s.substring(0, 5) + '...'; + if (!s) s = " "; + return s; + }, + _rebuildData:function (data) { + var me = this, + newData = [], + d = me.pageSize, + itembox; + for (var i = 0; i < data.length; i++) { + if ((i + d) % d == 0) { + itembox = []; + newData.push(itembox) + } + itembox.push(data[i]); + } + return newData; + }, + _renderTemplate:function (data) { + var me = this; + if (data.length == 0)return '
            ' + lang.emptyTxt + '
            '; + data = me._rebuildData(data); + var s = [], p = [], t = []; + s.push('
            '); + p.push('
            '); + for (var i = 0, tmpList; tmpList = data[i++];) { + panels.push('panel' + i); + pages.push('page' + i); + if (i == 1) { + s.push('
            '); + if (data.length != 1) { + t.push('
            ' + (i ) + '
            '); + } + } else { + s.push('
            '); + t.push('
            ' + (i ) + '
            '); + } + s.push('
            '); + s.push('
            ' + lang.chapter + '' + lang.singer + + '' + lang.special + '' + lang.listenTest + '
            '); + for (var j = 0, tmpObj; tmpObj = tmpList[j++];) { + s.push(''); + } + s.push('
            '); + s.push('
            '); + } + t.reverse(); + p.push(t.join('')); + s.push('
            '); + p.push('
            '); + return s.join('') + p.join(''); + }, + exec:function () { + var me = this; + if (selectedItem == null) return; + $G('J_preview').innerHTML = ""; + editor.execCommand('music', { + url:me._getUrl(false), + width:400, + height:95 + }); + } + }; +})(); + + + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/preview/preview.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/preview/preview.html new file mode 100644 index 0000000..f6b433b --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/preview/preview.html @@ -0,0 +1,40 @@ + + + + + + + + + + +
            + +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/addimg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/addimg.png new file mode 100644 index 0000000..03a8713 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/addimg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/brush.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/brush.png new file mode 100644 index 0000000..efa6fdb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/brush.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/delimg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/delimg.png new file mode 100644 index 0000000..5a892e4 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/delimg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/delimgH.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/delimgH.png new file mode 100644 index 0000000..2f0c5c9 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/delimgH.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/empty.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/empty.png new file mode 100644 index 0000000..0375196 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/empty.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/emptyH.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/emptyH.png new file mode 100644 index 0000000..838ca72 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/emptyH.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/eraser.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/eraser.png new file mode 100644 index 0000000..63e87ce Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/eraser.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/redo.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/redo.png new file mode 100644 index 0000000..12cd9bb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/redo.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/redoH.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/redoH.png new file mode 100644 index 0000000..d9f33d3 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/redoH.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/scale.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/scale.png new file mode 100644 index 0000000..935a3f3 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/scale.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/scaleH.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/scaleH.png new file mode 100644 index 0000000..72e64a9 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/scaleH.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/size.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/size.png new file mode 100644 index 0000000..8366845 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/size.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/undo.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/undo.png new file mode 100644 index 0000000..084c7cc Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/undo.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/undoH.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/undoH.png new file mode 100644 index 0000000..fde7eb3 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/images/undoH.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.css new file mode 100644 index 0000000..b18430d --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.css @@ -0,0 +1,72 @@ +/*common +*/ +body{margin: 0;} +table{width:100%;} +table td{padding:2px 4px;vertical-align: middle;} +a{text-decoration: none;} +em{font-style: normal;} +.border_style1{border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} +/*module +*/ +.main{margin: 8px;overflow: hidden;} + +.hot{float:left;height:335px;} +.drawBoard{position: relative; cursor: crosshair;} +.brushBorad{position: absolute;left:0;top:0;z-index: 998;} +.picBoard{border: none;text-align: center;line-height: 300px;cursor: default;} +.operateBar{margin-top:10px;font-size:12px;text-align: center;} +.operateBar span{margin-left: 10px;} + +.drawToolbar{float:right;width:110px;height:300px;overflow: hidden;} +.colorBar{margin-top:10px;font-size: 12px;text-align: center;} +.colorBar a{display:block;width: 10px;height: 10px;border:1px solid #1006F1;border-radius: 3px; box-shadow:2px 2px 5px #d3d6da;opacity: 0.3} +.sectionBar{margin-top:15px;font-size: 12px;text-align: center;} +.sectionBar a{display:inline-block;width:10px;height:12px;color: #888;text-indent: -999px;opacity: 0.3} +.size1{background: url('images/size.png') 1px center no-repeat ;} +.size2{background: url('images/size.png') -10px center no-repeat;} +.size3{background: url('images/size.png') -22px center no-repeat;} +.size4{background: url('images/size.png') -35px center no-repeat;} + +.addImgH{position: relative;} +.addImgH_form{position: absolute;left: 18px;top: -1px;width: 75px;height: 21px;opacity: 0;cursor: pointer;} +.addImgH_form input{width: 100%;} +/*scrawl遮罩层 +*/ +.maskLayerNull{display: none;} +.maskLayer{position: absolute;top:0;left:0;width: 100%; height: 100%;opacity: 0.7; + background-color: #fff;text-align:center;font-weight:bold;line-height:300px;z-index: 1000;} +/*btn state +*/ +.previousStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undoH.png');cursor: pointer;} +.previousStepH .text{color:#888;cursor:pointer;} +.previousStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/undo.png');cursor:default;} +.previousStep .text{color:#ccc;cursor:default;} + +.nextStepH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redoH.png');cursor: pointer;} +.nextStepH .text{color:#888;cursor:pointer;} +.nextStep .icon{display: inline-block;width:16px;height:16px;background-image: url('images/redo.png');cursor:default;} +.nextStep .text{color:#ccc;cursor:default;} + +.clearBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/emptyH.png');cursor: pointer;} +.clearBoardH .text{color:#888;cursor:pointer;} +.clearBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/empty.png');cursor:default;} +.clearBoard .text{color:#ccc;cursor:default;} + +.scaleBoardH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scaleH.png');cursor: pointer;} +.scaleBoardH .text{color:#888;cursor:pointer;} +.scaleBoard .icon{display: inline-block;width:16px;height:16px;background-image: url('images/scale.png');cursor:default;} +.scaleBoard .text{color:#ccc;cursor:default;} + +.removeImgH .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimgH.png');cursor: pointer;} +.removeImgH .text{color:#888;cursor:pointer;} +.removeImg .icon{display: inline-block;width:16px;height:16px;background-image: url('images/delimg.png');cursor:default;} +.removeImg .text{color:#ccc;cursor:default;} + +.addImgH .icon{vertical-align:top;display: inline-block;width:16px;height:16px;background-image: url('images/addimg.png')} +.addImgH .text{color:#888;cursor:pointer;} +/*icon +*/ +.brushIcon{display: inline-block;width:16px;height:16px;background-image: url('images/brush.png')} +.eraserIcon{display: inline-block;width:16px;height:16px;background-image: url('images/eraser.png')} + + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.html new file mode 100644 index 0000000..9371abd --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.html @@ -0,0 +1,95 @@ + + + + + + + + + + +
            +
            +
            + +
            +
            +
            + + + + + + + + + + + + + + + + +
            +
            +
            +
            +
            + + 1 + 3 + 5 + 7 +
            +
            + + 1 + 3 + 5 + 7 +
            +
            +
            + + +
            + +
            + +
            +
            +
            + + + + +
            +
            +
            +
            + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.js new file mode 100644 index 0000000..e0c005e --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/scrawl/scrawl.js @@ -0,0 +1,671 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-5-22 + * Time: 上午11:38 + * To change this template use File | Settings | File Templates. + */ +var scrawl = function (options) { + options && this.initOptions(options); +}; +(function () { + var canvas = $G("J_brushBoard"), + context = canvas.getContext('2d'), + drawStep = [], //undo redo存储 + drawStepIndex = 0; //undo redo指针 + + scrawl.prototype = { + isScrawl:false, //是否涂鸦 + brushWidth:-1, //画笔粗细 + brushColor:"", //画笔颜色 + + initOptions:function (options) { + var me = this; + me.originalState(options);//初始页面状态 + me._buildToolbarColor(options.colorList);//动态生成颜色选择集合 + + me._addBoardListener(options.saveNum);//添加画板处理 + me._addOPerateListener(options.saveNum);//添加undo redo clearBoard处理 + me._addColorBarListener();//添加颜色选择处理 + me._addBrushBarListener();//添加画笔大小处理 + me._addEraserBarListener();//添加橡皮大小处理 + me._addAddImgListener();//添加增添背景图片处理 + me._addRemoveImgListenter();//删除背景图片处理 + me._addScalePicListenter();//添加缩放处理 + me._addClearSelectionListenter();//添加清楚选中状态处理 + + me._originalColorSelect(options.drawBrushColor);//初始化颜色选中 + me._originalBrushSelect(options.drawBrushSize);//初始化画笔选中 + me._clearSelection();//清楚选中状态 + }, + + originalState:function (options) { + var me = this; + + me.brushWidth = options.drawBrushSize;//同步画笔粗细 + me.brushColor = options.drawBrushColor;//同步画笔颜色 + + context.lineWidth = me.brushWidth;//初始画笔大小 + context.strokeStyle = me.brushColor;//初始画笔颜色 + context.fillStyle = "transparent";//初始画布背景颜色 + context.lineCap = "round";//去除锯齿 + context.fill(); + }, + _buildToolbarColor:function (colorList) { + var tmp = null, arr = []; + arr.push(""); + for (var i = 0, color; color = colorList[i++];) { + if ((i - 1) % 5 == 0) { + if (i != 1) { + arr.push(""); + } + arr.push(""); + } + tmp = '#' + color; + arr.push(""); + } + arr.push("
            "); + $G("J_colorBar").innerHTML = arr.join(""); + }, + + _addBoardListener:function (saveNum) { + var me = this, + margin = 0, + startX = -1, + startY = -1, + isMouseDown = false, + isMouseMove = false, + isMouseUp = false, + buttonPress = 0, button, flag = ''; + + margin = parseInt(domUtils.getComputedStyle($G("J_wrap"), "margin-left")); + drawStep.push(context.getImageData(0, 0, context.canvas.width, context.canvas.height)); + drawStepIndex += 1; + + domUtils.on(canvas, ["mousedown", "mousemove", "mouseup", "mouseout"], function (e) { + button = browser.webkit ? e.which : buttonPress; + switch (e.type) { + case 'mousedown': + buttonPress = 1; + flag = 1; + isMouseDown = true; + isMouseUp = false; + isMouseMove = false; + me.isScrawl = true; + startX = e.clientX - margin;//10为外边距总和 + startY = e.clientY - margin; + context.beginPath(); + break; + case 'mousemove' : + if (!flag && button == 0) { + return; + } + if (!flag && button) { + startX = e.clientX - margin;//10为外边距总和 + startY = e.clientY - margin; + context.beginPath(); + flag = 1; + } + if (isMouseUp || !isMouseDown) { + return; + } + var endX = e.clientX - margin, + endY = e.clientY - margin; + + context.moveTo(startX, startY); + context.lineTo(endX, endY); + context.stroke(); + startX = endX; + startY = endY; + isMouseMove = true; + break; + case 'mouseup': + buttonPress = 0; + if (!isMouseDown)return; + if (!isMouseMove) { + context.arc(startX, startY, context.lineWidth, 0, Math.PI * 2, false); + context.fillStyle = context.strokeStyle; + context.fill(); + } + context.closePath(); + me._saveOPerate(saveNum); + isMouseDown = false; + isMouseMove = false; + isMouseUp = true; + startX = -1; + startY = -1; + break; + case 'mouseout': + flag = ''; + buttonPress = 0; + if (button == 1) return; + context.closePath(); + break; + } + }); + }, + _addOPerateListener:function (saveNum) { + var me = this; + domUtils.on($G("J_previousStep"), "click", function () { + if (drawStepIndex > 1) { + drawStepIndex -= 1; + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex - 1], 0, 0); + me.btn2Highlight("J_nextStep"); + drawStepIndex == 1 && me.btn2disable("J_previousStep"); + } + }); + domUtils.on($G("J_nextStep"), "click", function () { + if (drawStepIndex > 0 && drawStepIndex < drawStep.length) { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + context.putImageData(drawStep[drawStepIndex], 0, 0); + drawStepIndex += 1; + me.btn2Highlight("J_previousStep"); + drawStepIndex == drawStep.length && me.btn2disable("J_nextStep"); + } + }); + domUtils.on($G("J_clearBoard"), "click", function () { + context.clearRect(0, 0, context.canvas.width, context.canvas.height); + drawStep = []; + me._saveOPerate(saveNum); + drawStepIndex = 1; + me.isScrawl = false; + me.btn2disable("J_previousStep"); + me.btn2disable("J_nextStep"); + me.btn2disable("J_clearBoard"); + }); + }, + _addColorBarListener:function () { + var me = this; + domUtils.on($G("J_colorBar"), "click", function (e) { + var target = me.getTarget(e), + color = target.title; + if (!!color) { + me._addColorSelect(target); + + me.brushColor = color; + context.globalCompositeOperation = "source-over"; + context.lineWidth = me.brushWidth; + context.strokeStyle = color; + } + }); + }, + _addBrushBarListener:function () { + var me = this; + domUtils.on($G("J_brushBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.globalCompositeOperation = "source-over"; + context.lineWidth = parseInt(size); + context.strokeStyle = me.brushColor; + me.brushWidth = context.lineWidth; + } + }); + }, + _addEraserBarListener:function () { + var me = this; + domUtils.on($G("J_eraserBar"), "click", function (e) { + var target = me.getTarget(e), + size = browser.ie ? target.innerText : target.text; + if (!!size) { + me._addBESelect(target); + + context.lineWidth = parseInt(size); + context.globalCompositeOperation = "destination-out"; + context.strokeStyle = "#FFF"; + } + }); + }, + _addAddImgListener:function () { + var file = $G("J_imgTxt"); + if (!window.FileReader) { + $G("J_addImg").style.display = 'none'; + $G("J_removeImg").style.display = 'none'; + $G("J_sacleBoard").style.display = 'none'; + } + domUtils.on(file, "change", function (e) { + var frm = file.parentNode; + addMaskLayer(lang.backgroundUploading); + + var target = e.target || e.srcElement, + reader = new FileReader(); + reader.onload = function(evt){ + var target = evt.target || evt.srcElement; + ue_callback(target.result, 'SUCCESS'); + }; + reader.readAsDataURL(target.files[0]); + frm.reset(); + }); + }, + _addRemoveImgListenter:function () { + var me = this; + domUtils.on($G("J_removeImg"), "click", function () { + $G("J_picBoard").innerHTML = ""; + me.btn2disable("J_removeImg"); + me.btn2disable("J_sacleBoard"); + }); + }, + _addScalePicListenter:function () { + domUtils.on($G("J_sacleBoard"), "click", function () { + var picBoard = $G("J_picBoard"), + scaleCon = $G("J_scaleCon"), + img = picBoard.children[0]; + + if (img) { + if (!scaleCon) { + picBoard.style.cssText = "position:relative;z-index:999;"+picBoard.style.cssText; + img.style.cssText = "position: absolute;top:" + (canvas.height - img.height) / 2 + "px;left:" + (canvas.width - img.width) / 2 + "px;"; + var scale = new ScaleBoy(); + picBoard.appendChild(scale.init()); + scale.startScale(img); + } else { + if (scaleCon.style.visibility == "visible") { + scaleCon.style.visibility = "hidden"; + picBoard.style.position = ""; + picBoard.style.zIndex = ""; + } else { + scaleCon.style.visibility = "visible"; + picBoard.style.cssText += "position:relative;z-index:999"; + } + } + } + }); + }, + _addClearSelectionListenter:function () { + var doc = document; + domUtils.on(doc, 'mousemove', function (e) { + if (browser.ie && browser.version < 11) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + }); + }, + _clearSelection:function () { + var list = ["J_operateBar", "J_colorBar", "J_brushBar", "J_eraserBar", "J_picBoard"]; + for (var i = 0, group; group = list[i++];) { + domUtils.unSelectable($G(group)); + } + }, + + _saveOPerate:function (saveNum) { + var me = this; + if (drawStep.length <= saveNum) { + if(drawStepIndex"); + } + scale.innerHTML = arr.join(""); + return scale; + } + + var rect = [ + //[left, top, width, height] + [1, 1, -1, -1], + [0, 1, 0, -1], + [0, 1, 1, -1], + [1, 0, -1, 0], + [0, 0, 1, 0], + [1, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + ScaleBoy.prototype = { + init:function () { + _appendStyle(); + var me = this, + scale = me.dom = _getDom(); + + me.scaleMousemove.fp = me; + domUtils.on(scale, 'mousedown', function (e) { + var target = e.target || e.srcElement; + me.start = {x:e.clientX, y:e.clientY}; + if (target.className.indexOf('hand') != -1) { + me.dir = target.className.replace('hand', ''); + } + domUtils.on(document.body, 'mousemove', me.scaleMousemove); + e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true; + }); + domUtils.on(document.body, 'mouseup', function (e) { + if (me.start) { + domUtils.un(document.body, 'mousemove', me.scaleMousemove); + if (me.moved) { + me.updateScaledElement({position:{x:scale.style.left, y:scale.style.top}, size:{w:scale.style.width, h:scale.style.height}}); + } + delete me.start; + delete me.moved; + delete me.dir; + } + }); + return scale; + }, + startScale:function (objElement) { + var me = this, Idom = me.dom; + + Idom.style.cssText = 'visibility:visible;top:' + objElement.style.top + ';left:' + objElement.style.left + ';width:' + objElement.offsetWidth + 'px;height:' + objElement.offsetHeight + 'px;'; + me.scalingElement = objElement; + }, + updateScaledElement:function (objStyle) { + var cur = this.scalingElement, + pos = objStyle.position, + size = objStyle.size; + if (pos) { + typeof pos.x != 'undefined' && (cur.style.left = pos.x); + typeof pos.y != 'undefined' && (cur.style.top = pos.y); + } + if (size) { + size.w && (cur.style.width = size.w); + size.h && (cur.style.height = size.h); + } + }, + updateStyleByDir:function (dir, offset) { + var me = this, + dom = me.dom, tmp; + + rect['def'] = [1, 1, 0, 0]; + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp('left', tmp) + 'px'; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp('top', tmp) + 'px'; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp('width', tmp) + 'px'; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp('height', tmp) + 'px'; + } + if (dir === 'def') { + me.updateScaledElement({position:{x:dom.style.left, y:dom.style.top}}); + } + }, + scaleMousemove:function (e) { + var me = arguments.callee.fp, + start = me.start, + dir = me.dir || 'def', + offset = {x:e.clientX - start.x, y:e.clientY - start.y}; + + me.updateStyleByDir(dir, offset); + arguments.callee.fp.start = {x:e.clientX, y:e.clientY}; + arguments.callee.fp.moved = 1; + }, + _validScaledProp:function (prop, value) { + var ele = this.dom, + wrap = $G("J_picBoard"); + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; + case 'top': + return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; + case 'width': + return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; + case 'height': + return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; + } + } + }; +})(); + +//后台回调 +function ue_callback(url, state) { + var doc = document, + picBorard = $G("J_picBoard"), + img = doc.createElement("img"); + + //图片缩放 + function scale(img, max, oWidth, oHeight) { + var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; + if (ow > max || oh > max) { + if (ow >= oh) { + if (width = ow - max) { + percent = (width / ow).toFixed(2); + img.height = oh - oh * percent; + img.width = max; + } + } else { + if (height = oh - max) { + percent = (height / oh).toFixed(2); + img.width = ow - ow * percent; + img.height = max; + } + } + } + } + + //移除遮罩层 + removeMaskLayer(); + //状态响应 + if (state == "SUCCESS") { + picBorard.innerHTML = ""; + img.onload = function () { + scale(this, 300); + picBorard.appendChild(img); + + var obj = new scrawl(); + obj.btn2Highlight("J_removeImg"); + //trace 2457 + obj.btn2Highlight("J_sacleBoard"); + }; + img.src = url; + } else { + alert(state); + } +} +//去掉遮罩层 +function removeMaskLayer() { + var maskLayer = $G("J_maskLayer"); + maskLayer.className = "maskLayerNull"; + maskLayer.innerHTML = ""; + dialog.buttons[0].setDisabled(false); +} +//添加遮罩层 +function addMaskLayer(html) { + var maskLayer = $G("J_maskLayer"); + dialog.buttons[0].setDisabled(true); + maskLayer.className = "maskLayer"; + maskLayer.innerHTML = html; +} +//执行确认按钮方法 +function exec(scrawlObj) { + if (scrawlObj.isScrawl) { + addMaskLayer(lang.scrawlUpLoading); + var base64 = scrawlObj.getCanvasData(); + if (!!base64) { + var options = { + timeout:100000, + onsuccess:function (xhr) { + if (!scrawlObj.isCancelScrawl) { + var responseObj; + responseObj = eval("(" + xhr.responseText + ")"); + if (responseObj.state == "SUCCESS") { + var imgObj = {}, + url = editor.options.scrawlUrlPrefix + responseObj.url; + imgObj.src = url; + imgObj._src = url; + imgObj.alt = responseObj.original || ''; + imgObj.title = responseObj.title || ''; + editor.execCommand("insertImage", imgObj); + dialog.close(); + } else { + alert(responseObj.state); + } + + } + }, + onerror:function () { + alert(lang.imageError); + dialog.close(); + } + }; + options[editor.getOpt('scrawlFieldName')] = base64; + + var actionUrl = editor.getActionUrl(editor.getOpt('scrawlActionName')), + params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); + ajax.request(url, options); + } + } else { + addMaskLayer(lang.noScarwl + "   "); + } +} + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/searchreplace/searchreplace.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/searchreplace/searchreplace.html new file mode 100644 index 0000000..b91f190 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/searchreplace/searchreplace.html @@ -0,0 +1,102 @@ + + + + + + + + + +
            + +
            +
            + + + + + + + + + + + + + + + + + + + + + + +
            :
            + +
            + + +
            +   +
            + +
            +
            +
            + + + + + + + + + + + + + + + + + + + + + + + + + + +
            :
            :
            + +
            + + + + +
            +   +
            + +
            +
            +
            +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/searchreplace/searchreplace.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/searchreplace/searchreplace.js new file mode 100644 index 0000000..1b52857 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/searchreplace/searchreplace.js @@ -0,0 +1,164 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午12:29 + * To change this template use File | Settings | File Templates. + */ + +//清空上次查选的痕迹 +editor.firstForSR = 0; +editor.currentRangeForSR = null; +//给tab注册切换事件 +/** + * tab点击处理事件 + * @param tabHeads + * @param tabBodys + * @param obj + */ +function clickHandler( tabHeads,tabBodys,obj ) { + //head样式更改 + for ( var k = 0, len = tabHeads.length; k < len; k++ ) { + tabHeads[k].className = ""; + } + obj.className = "focus"; + //body显隐 + var tabSrc = obj.getAttribute( "tabSrc" ); + for ( var j = 0, length = tabBodys.length; j < length; j++ ) { + var body = tabBodys[j], + id = body.getAttribute( "id" ); + if ( id != tabSrc ) { + body.style.zIndex = 1; + } else { + body.style.zIndex = 200; + } + } + +} + +/** + * TAB切换 + * @param tabParentId tab的父节点ID或者对象本身 + */ +function switchTab( tabParentId ) { + var tabElements = $G( tabParentId ).children, + tabHeads = tabElements[0].children, + tabBodys = tabElements[1].children; + + for ( var i = 0, length = tabHeads.length; i < length; i++ ) { + var head = tabHeads[i]; + if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); + head.onclick = function () { + clickHandler(tabHeads,tabBodys,this); + } + } +} +$G('searchtab').onmousedown = function(){ + $G('search-msg').innerHTML = ''; + $G('replace-msg').innerHTML = '' +} +//是否区分大小写 +function getMatchCase(id) { + return $G(id).checked ? true : false; +} +//查找 +$G("nextFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + var bk = editor.selection.getRange().createBookmark(); + $G('search-msg').innerHTML = lang.getEnd; + editor.selection.getRange().moveToBookmark(bk).select(); + + + } +}; +$G("nextReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase1") + }; + frCommond(obj); +}; +$G("preFindBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:-1, + casesensitive:getMatchCase("matchCase") + }; + if (!frCommond(obj)) { + $G('search-msg').innerHTML = lang.getStart; + } +}; +$G("preReplaceBtn").onclick = function (txt, dir, mcase) { + var findtxt = $G("findtxt1").value, obj; + if (!findtxt) { + return false; + } + obj = { + searchStr:findtxt, + dir:-1, + casesensitive:getMatchCase("matchCase1") + }; + frCommond(obj); +}; +//替换 +$G("repalceBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr:findtxt, + dir:1, + casesensitive:getMatchCase("matchCase1"), + replaceStr:replacetxt + }; + frCommond(obj); +}; +//全部替换 +$G("repalceAllBtn").onclick = function () { + var findtxt = $G("findtxt1").value.replace(/^\s|\s$/g, ""), obj, + replacetxt = $G("replacetxt").value.replace(/^\s|\s$/g, ""); + if (!findtxt) { + return false; + } + if (findtxt == replacetxt || (!getMatchCase("matchCase1") && findtxt.toLowerCase() == replacetxt.toLowerCase())) { + return false; + } + obj = { + searchStr:findtxt, + casesensitive:getMatchCase("matchCase1"), + replaceStr:replacetxt, + all:true + }; + var num = frCommond(obj); + if (num) { + $G('replace-msg').innerHTML = lang.countMsg.replace("{#count}", num); + } +}; +//执行 +var frCommond = function (obj) { + return editor.execCommand("searchreplace", obj); +}; +switchTab("searchtab"); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/snapscreen/snapscreen.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/snapscreen/snapscreen.html new file mode 100644 index 0000000..cf8209e --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/snapscreen/snapscreen.html @@ -0,0 +1,58 @@ + + + + + + + + + +
            +

            +
            +
            +
            +
            +
            +
            + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/spechars/spechars.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/spechars/spechars.html new file mode 100644 index 0000000..0b5c416 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/spechars/spechars.html @@ -0,0 +1,21 @@ + + + + + + + + + +
            +
            +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/spechars/spechars.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/spechars/spechars.js new file mode 100644 index 0000000..f4c155e --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/spechars/spechars.js @@ -0,0 +1,57 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-9-26 + * Time: 下午1:09 + * To change this template use File | Settings | File Templates. + */ +var charsContent = [ + { name:"tsfh", title:lang.tsfh, content:toArray("、,。,·,ˉ,ˇ,¨,〃,々,—,~,‖,…,‘,’,“,”,〔,〕,〈,〉,《,》,「,」,『,』,〖,〗,【,】,±,×,÷,∶,∧,∨,∑,∏,∪,∩,∈,∷,√,⊥,∥,∠,⌒,⊙,∫,∮,≡,≌,≈,∽,∝,≠,≮,≯,≤,≥,∞,∵,∴,♂,♀,°,′,″,℃,$,¤,¢,£,‰,§,№,☆,★,○,●,◎,◇,◆,□,■,△,▲,※,→,←,↑,↓,〓,〡,〢,〣,〤,〥,〦,〧,〨,〩,㊣,㎎,㎏,㎜,㎝,㎞,㎡,㏄,㏎,㏑,㏒,㏕,︰,¬,¦,℡,ˊ,ˋ,˙,–,―,‥,‵,℅,℉,↖,↗,↘,↙,∕,∟,∣,≒,≦,≧,⊿,═,║,╒,╓,╔,╕,╖,╗,╘,╙,╚,╛,╜,╝,╞,╟,╠,╡,╢,╣,╤,╥,╦,╧,╨,╩,╪,╫,╬,╭,╮,╯,╰,╱,╲,╳,▁,▂,▃,▄,▅,▆,▇,�,█,▉,▊,▋,▌,▍,▎,▏,▓,▔,▕,▼,▽,◢,◣,◤,◥,☉,⊕,〒,〝,〞")}, + { name:"lmsz", title:lang.lmsz, content:toArray("ⅰ,ⅱ,ⅲ,ⅳ,ⅴ,ⅵ,ⅶ,ⅷ,ⅸ,ⅹ,Ⅰ,Ⅱ,Ⅲ,Ⅳ,Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ")}, + { name:"szfh", title:lang.szfh, content:toArray("⒈,⒉,⒊,⒋,⒌,⒍,⒎,⒏,⒐,⒑,⒒,⒓,⒔,⒕,⒖,⒗,⒘,⒙,⒚,⒛,⑴,⑵,⑶,⑷,⑸,⑹,⑺,⑻,⑼,⑽,⑾,⑿,⒀,⒁,⒂,⒃,⒄,⒅,⒆,⒇,①,②,③,④,⑤,⑥,⑦,⑧,⑨,⑩,㈠,㈡,㈢,㈣,㈤,㈥,㈦,㈧,㈨,㈩")}, + { name:"rwfh", title:lang.rwfh, content:toArray("ぁ,あ,ぃ,い,ぅ,う,ぇ,え,ぉ,お,か,が,き,ぎ,く,ぐ,け,げ,こ,ご,さ,ざ,し,じ,す,ず,せ,ぜ,そ,ぞ,た,だ,ち,ぢ,っ,つ,づ,て,で,と,ど,な,に,ぬ,ね,の,は,ば,ぱ,ひ,び,ぴ,ふ,ぶ,ぷ,へ,べ,ぺ,ほ,ぼ,ぽ,ま,み,む,め,も,ゃ,や,ゅ,ゆ,ょ,よ,ら,り,る,れ,ろ,ゎ,わ,ゐ,ゑ,を,ん,ァ,ア,ィ,イ,ゥ,ウ,ェ,エ,ォ,オ,カ,ガ,キ,ギ,ク,グ,ケ,ゲ,コ,ゴ,サ,ザ,シ,ジ,ス,ズ,セ,ゼ,ソ,ゾ,タ,ダ,チ,ヂ,ッ,ツ,ヅ,テ,デ,ト,ド,ナ,ニ,ヌ,ネ,ノ,ハ,バ,パ,ヒ,ビ,ピ,フ,ブ,プ,ヘ,ベ,ペ,ホ,ボ,ポ,マ,ミ,ム,メ,モ,ャ,ヤ,ュ,ユ,ョ,ヨ,ラ,リ,ル,レ,ロ,ヮ,ワ,ヰ,ヱ,ヲ,ン,ヴ,ヵ,ヶ")}, + { name:"xlzm", title:lang.xlzm, content:toArray("Α,Β,Γ,Δ,Ε,Ζ,Η,Θ,Ι,Κ,Λ,Μ,Ν,Ξ,Ο,Π,Ρ,Σ,Τ,Υ,Φ,Χ,Ψ,Ω,α,β,γ,δ,ε,ζ,η,θ,ι,κ,λ,μ,ν,ξ,ο,π,ρ,σ,τ,υ,φ,χ,ψ,ω")}, + { name:"ewzm", title:lang.ewzm, content:toArray("А,Б,В,Г,Д,Е,Ё,Ж,З,И,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ъ,Ы,Ь,Э,Ю,Я,а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я")}, + { name:"pyzm", title:lang.pyzm, content:toArray("ā,á,ǎ,à,ē,é,ě,è,ī,í,ǐ,ì,ō,ó,ǒ,ò,ū,ú,ǔ,ù,ǖ,ǘ,ǚ,ǜ,ü")}, + { name:"yyyb", title:lang.yyyb, content:toArray("i:,i,e,æ,ʌ,ə:,ə,u:,u,ɔ:,ɔ,a:,ei,ai,ɔi,əu,au,iə,εə,uə,p,t,k,b,d,g,f,s,ʃ,θ,h,v,z,ʒ,ð,tʃ,tr,ts,dʒ,dr,dz,m,n,ŋ,l,r,w,j,")}, + { name:"zyzf", title:lang.zyzf, content:toArray("ㄅ,ㄆ,ㄇ,ㄈ,ㄉ,ㄊ,ㄋ,ㄌ,ㄍ,ㄎ,ㄏ,ㄐ,ㄑ,ㄒ,ㄓ,ㄔ,ㄕ,ㄖ,ㄗ,ㄘ,ㄙ,ㄚ,ㄛ,ㄜ,ㄝ,ㄞ,ㄟ,ㄠ,ㄡ,ㄢ,ㄣ,ㄤ,ㄥ,ㄦ,ㄧ,ㄨ")} +]; +(function createTab(content) { + for (var i = 0, ci; ci = content[i++];) { + var span = document.createElement("span"); + span.setAttribute("tabSrc", ci.name); + span.innerHTML = ci.title; + if (i == 1)span.className = "focus"; + domUtils.on(span, "click", function () { + var tmps = $G("tabHeads").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.className = ""; + } + tmps = $G("tabBodys").children; + for (var k = 0, sk; sk = tmps[k++];) { + sk.style.display = "none"; + } + this.className = "focus"; + $G(this.getAttribute("tabSrc")).style.display = ""; + }); + $G("tabHeads").appendChild(span); + domUtils.insertAfter(span, document.createTextNode("\n")); + var div = document.createElement("div"); + div.id = ci.name; + div.style.display = (i == 1) ? "" : "none"; + var cons = ci.content; + for (var j = 0, con; con = cons[j++];) { + var charSpan = document.createElement("span"); + charSpan.innerHTML = con; + domUtils.on(charSpan, "click", function () { + editor.execCommand("insertHTML", this.innerHTML); + dialog.close(); + }); + div.appendChild(charSpan); + } + $G("tabBodys").appendChild(div); + } +})(charsContent); +function toArray(str) { + return str.split(","); +} diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/dragicon.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/dragicon.png new file mode 100644 index 0000000..f26203b Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/dragicon.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.css new file mode 100644 index 0000000..c6f9396 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.css @@ -0,0 +1,84 @@ +body{ + overflow: hidden; + width: 540px; +} +.wrapper { + margin: 10px auto 0; + font-size: 12px; + overflow: hidden; + width: 520px; + height: 315px; +} + +.clear { + clear: both; +} + +.wrapper .left { + float: left; + margin-left: 10px;; +} + +.wrapper .right { + float: right; + border-left: 2px dotted #EDEDED; + padding-left: 15px; +} + +.section { + margin-bottom: 15px; + width: 240px; + overflow: hidden; +} + +.section h3 { + font-weight: bold; + padding: 5px 0; + margin-bottom: 10px; + border-bottom: 1px solid #EDEDED; + font-size: 12px; +} + +.section ul { + list-style: none; + overflow: hidden; + clear: both; + +} + +.section li { + float: left; + width: 120px;; +} + +.section .tone { + width: 80px;; +} + +.section .preview { + width: 220px; +} + +.section .preview table { + text-align: center; + vertical-align: middle; + color: #666; +} + +.section .preview caption { + font-weight: bold; +} + +.section .preview td { + border-width: 1px; + border-style: solid; + height: 22px; +} + +.section .preview th { + border-style: solid; + border-color: #DDD; + border-width: 2px 1px 1px 1px; + height: 22px; + background-color: #F7F7F7; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.html new file mode 100644 index 0000000..3c412fb --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.html @@ -0,0 +1,64 @@ + + + + + + + + +
            +
            +
            +

            +
              +
            • + +
            • +
            • + +
            • +
            +
              +
            • + +
            • +
            • + +
            • +
            +
            +
            +
            +

            +
              +
            • + +
            • +
            • + +
            • +
            +
            +
            +
            +

            +
              +
            • + + +
            • +
            +
            +
            +
            +
            +
            +

            +
            +
            +
            +
            +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.js new file mode 100644 index 0000000..11dbee7 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittable.js @@ -0,0 +1,237 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-12-19 + * Time: 下午4:55 + * To change this template use File | Settings | File Templates. + */ +(function () { + var title = $G("J_title"), + titleCol = $G("J_titleCol"), + caption = $G("J_caption"), + sorttable = $G("J_sorttable"), + autoSizeContent = $G("J_autoSizeContent"), + autoSizePage = $G("J_autoSizePage"), + tone = $G("J_tone"), + me, + preview = $G("J_preview"); + + var editTable = function () { + me = this; + me.init(); + }; + editTable.prototype = { + init:function () { + var colorPiker = new UE.ui.ColorPicker({ + editor:editor + }), + colorPop = new UE.ui.Popup({ + editor:editor, + content:colorPiker + }); + + title.checked = editor.queryCommandState("inserttitle") == -1; + titleCol.checked = editor.queryCommandState("inserttitlecol") == -1; + caption.checked = editor.queryCommandState("insertcaption") == -1; + sorttable.checked = editor.queryCommandState("enablesort") == 1; + + var enablesortState = editor.queryCommandState("enablesort"), + disablesortState = editor.queryCommandState("disablesort"); + + sorttable.checked = !!(enablesortState < 0 && disablesortState >=0); + sorttable.disabled = !!(enablesortState < 0 && disablesortState < 0); + sorttable.title = enablesortState < 0 && disablesortState < 0 ? lang.errorMsg:''; + + me.createTable(title.checked, titleCol.checked, caption.checked); + me.setAutoSize(); + me.setColor(me.getColor()); + + domUtils.on(title, "click", me.titleHanler); + domUtils.on(titleCol, "click", me.titleColHanler); + domUtils.on(caption, "click", me.captionHanler); + domUtils.on(sorttable, "click", me.sorttableHanler); + domUtils.on(autoSizeContent, "click", me.autoSizeContentHanler); + domUtils.on(autoSizePage, "click", me.autoSizePageHanler); + + domUtils.on(tone, "click", function () { + colorPop.showAnchor(tone); + }); + domUtils.on(document, 'mousedown', function () { + colorPop.hide(); + }); + colorPiker.addListener("pickcolor", function () { + me.setColor(arguments[1]); + colorPop.hide(); + }); + colorPiker.addListener("picknocolor", function () { + me.setColor(""); + colorPop.hide(); + }); + }, + + createTable:function (hasTitle, hasTitleCol, hasCaption) { + var arr = [], + sortSpan = '^'; + arr.push(""); + if (hasCaption) { + arr.push("") + } + if (hasTitle) { + arr.push(""); + if(hasTitleCol) { arr.push(""); } + for (var j = 0; j < 5; j++) { + arr.push(""); + } + arr.push(""); + } + for (var i = 0; i < 6; i++) { + arr.push(""); + if(hasTitleCol) { arr.push("") } + for (var k = 0; k < 5; k++) { + arr.push("") + } + arr.push(""); + } + arr.push("
            " + lang.captionName + "
            " + lang.titleName + "" + lang.titleName + "
            " + lang.titleName + "" + lang.cellsName + "
            "); + preview.innerHTML = arr.join(""); + this.updateSortSpan(); + }, + titleHanler:function () { + var example = $G("J_example"), + frg=document.createDocumentFragment(), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colCount = example.rows[0].children.length; + + if (title.checked) { + example.insertRow(0); + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + frg.appendChild(node); + } + example.rows[0].appendChild(frg); + + } else { + domUtils.remove(example.rows[0]); + } + me.setColor(color); + me.updateSortSpan(); + }, + titleColHanler:function () { + var example = $G("J_example"), + color = domUtils.getComputedStyle(domUtils.getElementsByTagName(example, "td")[0], "border-color"), + colArr = example.rows, + colCount = colArr.length; + + if (titleCol.checked) { + for (var i = 0, node; i < colCount; i++) { + node = document.createElement("th"); + node.innerHTML = lang.titleName; + colArr[i].insertBefore(node, colArr[i].children[0]); + } + } else { + for (var i = 0; i < colCount; i++) { + domUtils.remove(colArr[i].children[0]); + } + } + me.setColor(color); + me.updateSortSpan(); + }, + captionHanler:function () { + var example = $G("J_example"); + if (caption.checked) { + var row = document.createElement('caption'); + row.innerHTML = lang.captionName; + example.insertBefore(row, example.firstChild); + } else { + domUtils.remove(domUtils.getElementsByTagName(example, 'caption')[0]); + } + }, + sorttableHanler:function(){ + me.updateSortSpan(); + }, + autoSizeContentHanler:function () { + var example = $G("J_example"); + example.removeAttribute("width"); + }, + autoSizePageHanler:function () { + var example = $G("J_example"); + var tds = example.getElementsByTagName(example, "td"); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + example.setAttribute('width', '100%'); + }, + updateSortSpan: function(){ + var example = $G("J_example"), + row = example.rows[0]; + + var spans = domUtils.getElementsByTagName(example,"span"); + utils.each(spans,function(span){ + span.parentNode.removeChild(span); + }); + if (sorttable.checked) { + utils.each(row.cells, function(cell, i){ + var span = document.createElement("span"); + span.innerHTML = "^"; + cell.appendChild(span); + }); + } + }, + getColor:function () { + var start = editor.selection.getStart(), color, + cell = domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + color = cell && domUtils.getComputedStyle(cell, "border-color"); + if (!color) color = "#DDDDDD"; + return color; + }, + setColor:function (color) { + var example = $G("J_example"), + arr = domUtils.getElementsByTagName(example, "td").concat( + domUtils.getElementsByTagName(example, "th"), + domUtils.getElementsByTagName(example, "caption") + ); + + tone.value = color; + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + + }, + setAutoSize:function () { + var me = this; + autoSizePage.checked = true; + me.autoSizePageHanler(); + } + }; + + new editTable; + + dialog.onok = function () { + editor.__hasEnterExecCommand = true; + + var checks = { + title:"inserttitle deletetitle", + titleCol:"inserttitlecol deletetitlecol", + caption:"insertcaption deletecaption", + sorttable:"enablesort disablesort" + }; + editor.fireEvent('saveScene'); + for(var i in checks){ + var cmds = checks[i].split(" "), + input = $G("J_" + i); + if(input["checked"]){ + editor.queryCommandState(cmds[0])!=-1 &&editor.execCommand(cmds[0]); + }else{ + editor.queryCommandState(cmds[1])!=-1 &&editor.execCommand(cmds[1]); + } + } + + editor.execCommand("edittable", tone.value); + autoSizeContent.checked ?editor.execCommand('adaptbytext') : ""; + autoSizePage.checked ? editor.execCommand("adaptbywindow") : ""; + editor.fireEvent('saveScene'); + + editor.__hasEnterExecCommand = false; + }; +})(); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittd.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittd.html new file mode 100644 index 0000000..49a52f7 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittd.html @@ -0,0 +1,61 @@ + + + + + + + + +
            + + +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittip.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittip.html new file mode 100644 index 0000000..954f7bb --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/table/edittip.html @@ -0,0 +1,33 @@ + + + + 表格删除提示 + + + + +
            +
            + +
            +
            + +
            +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/config.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/config.js new file mode 100644 index 0000000..417b8f7 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/config.js @@ -0,0 +1,42 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 下午2:00 + * To change this template use File | Settings | File Templates. + */ +var templates = [ + { + "pre":"pre0.png", + 'title':lang.blank, + 'preHtml':'

             欢迎使用UEditor!

            ', + "html":'

            欢迎使用UEditor!

            ' + + }, + { + "pre":"pre1.png", + 'title':lang.blog, + 'preHtml':'

            深入理解Range

            UEditor二次开发

            什么是Range

            对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。


            Range能干什么

            在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。

            ', + "html":'

            [键入文档标题]

            [键入文档副标题]

            [标题 1]

            对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。

            [标题 2]

            在“开始”选项卡上,通过从快速样式库中为所选文本选择一种外观,您可以方便地更改文档中所选文本的格式。 您还可以使用“开始”选项卡上的其他控件来直接设置文本格式。大多数控件都允许您选择是使用当前主题外观,还是使用某种直接指定的格式。

            [标题 3]

            对于“插入”选项卡上的库,在设计时都充分考虑了其中的项与文档整体外观的协调性。 您可以使用这些库来插入表格、页眉、页脚、列表、封面以及其他文档构建基块。 您创建的图片、图表或关系图也将与当前的文档外观协调一致。


            ' + + }, + { + "pre":"pre2.png", + 'title':lang.resume, + 'preHtml':'

            WEB前端开发简历


            联系电话:[键入您的电话]

            电子邮件:[键入您的电子邮件地址]

            家庭住址:[键入您的地址]

            目标职位

            WEB前端研发工程师

            学历

            1. [起止时间] [学校名称] [所学专业] [所获学位]

            工作经验


            ', + "html":'

            [此处键入简历标题]


            【此处插入照片】


            联系电话:[键入您的电话]


            电子邮件:[键入您的电子邮件地址]


            家庭住址:[键入您的地址]


            目标职位

            [此处键入您的期望职位]

            学历

            1. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

            2. [键入起止时间] [键入学校名称] [键入所学专业] [键入所获学位]

            工作经验

            1. [键入起止时间] [键入公司名称] [键入职位名称]

              1. [键入负责项目] [键入项目简介]

              2. [键入负责项目] [键入项目简介]

            2. [键入起止时间] [键入公司名称] [键入职位名称]

              1. [键入负责项目] [键入项目简介]

            掌握技能

             [这里可以键入您所掌握的技能]

            ' + + }, + { + "pre":"pre3.png", + 'title':lang.richText, + 'preHtml':'

            [此处键入文章标题]

            图文混排方法

            图片居左,文字围绕图片排版

            方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文


            还有没有什么其他的环绕方式呢?这里是居右环绕


            欢迎大家多多尝试,为UEditor提供更多高质量模板!

            ', + "html":'


            [此处键入文章标题]

            图文混排方法

            1. 图片居左,文字围绕图片排版

            方法:在文字前面插入图片,设置居左对齐,然后即可在右边输入多行文本


            2. 图片居右,文字围绕图片排版

            方法:在文字前面插入图片,设置居右对齐,然后即可在左边输入多行文本


            3. 图片居中环绕排版

            方法:亲,这个真心没有办法。。。



            还有没有什么其他的环绕方式呢?这里是居右环绕


            欢迎大家多多尝试,为UEditor提供更多高质量模板!


            占位


            占位


            占位


            占位


            占位



            ' + }, + { + "pre":"pre4.png", + 'title':lang.sciPapers, + 'preHtml':'

            [键入文章标题]

            摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

            标题 1

            这里可以输入很多内容,可以图文混排,可以有列表等。

            标题 2

            1. 列表 1

            2. 列表 2

              1. 多级列表 1

              2. 多级列表 2

            3. 列表 3

            标题 3

            来个文字图文混排的


            ', + 'html':'

            [键入文章标题]

            摘要:这里可以输入很长很长很长很长很长很长很长很长很差的摘要

            标题 1

            这里可以输入很多内容,可以图文混排,可以有列表等。

            标题 2

            来个列表瞅瞅:

            1. 列表 1

            2. 列表 2

              1. 多级列表 1

              2. 多级列表 2

            3. 列表 3

            标题 3

            来个文字图文混排的

            这里可以多行

            右边是图片

            绝对没有问题的,不信你也可以试试看


            ' + } +]; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/bg.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/bg.gif new file mode 100644 index 0000000..8c1d10a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/bg.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre0.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre0.png new file mode 100644 index 0000000..8f3c16a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre0.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre1.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre1.png new file mode 100644 index 0000000..5a03f96 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre1.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre2.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre2.png new file mode 100644 index 0000000..5a55672 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre2.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre3.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre3.png new file mode 100644 index 0000000..d852d29 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre3.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre4.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre4.png new file mode 100644 index 0000000..0d7bc72 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/images/pre4.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.css new file mode 100644 index 0000000..6c1608d --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.css @@ -0,0 +1,18 @@ +.wrap{ padding: 5px;font-size: 14px;} +.left{width:425px;float: left;} +.right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;} +.right .pre{height: 332px;overflow-y: auto;} +.right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;} +.right .preitem:hover{background-color: lemonChiffon;cursor: pointer;border: #ccc 1px solid;} +.right .preitem img{display: block;margin: 0 auto;width:100px;} +.clear{clear: both;} +.top{height:26px;line-height: 26px;padding: 5px;} +.bottom{height:320px;width:100%;margin: 0 auto;} +.transparent{ background: url("images/bg.gif") repeat;} +.bottom table tr td{border:1px dashed #ccc;} +#colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;} +.border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} +p{margin: 5px 0} +table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;} +li{clear:both} +ol{padding-left:40px; } \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.html new file mode 100644 index 0000000..d9903a4 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.html @@ -0,0 +1,26 @@ + + + + + + + + + +
            +
            +
            + +
            +
            +
            +
            + +
            +
            +
            +
            + + + + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.js new file mode 100644 index 0000000..80a334b --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/template/template.js @@ -0,0 +1,53 @@ +/** + * Created with JetBrains PhpStorm. + * User: xuheng + * Date: 12-8-8 + * Time: 下午2:09 + * To change this template use File | Settings | File Templates. + */ +(function () { + var me = editor, + preview = $G( "preview" ), + preitem = $G( "preitem" ), + tmps = templates, + currentTmp; + var initPre = function () { + var str = ""; + for ( var i = 0, tmp; tmp = tmps[i++]; ) { + str += '
            '; + } + preitem.innerHTML = str; + }; + var pre = function ( n ) { + var tmp = tmps[n - 1]; + currentTmp = tmp; + clearItem(); + domUtils.setStyles( preitem.childNodes[n - 1], { + "background-color":"lemonChiffon", + "border":"#ccc 1px solid" + } ); + preview.innerHTML = tmp.preHtml ? tmp.preHtml : ""; + }; + var clearItem = function () { + var items = preitem.children; + for ( var i = 0, item; item = items[i++]; ) { + domUtils.setStyles( item, { + "background-color":"", + "border":"white 1px solid" + } ); + } + }; + dialog.onok = function () { + if ( !$G( "issave" ).checked ){ + me.execCommand( "cleardoc" ); + } + var obj = { + html:currentTmp && currentTmp.html + }; + me.execCommand( "template", obj ); + }; + initPre(); + window.pre = pre; + pre(2) + +})(); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/bg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/bg.png new file mode 100644 index 0000000..580be0a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/center_focus.jpg b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/center_focus.jpg new file mode 100644 index 0000000..262b029 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/center_focus.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/file-icons.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/file-icons.gif new file mode 100644 index 0000000..d8c02c2 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/file-icons.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/file-icons.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/file-icons.png new file mode 100644 index 0000000..3ff82c8 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/file-icons.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/icons.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/icons.gif new file mode 100644 index 0000000..78459de Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/icons.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/icons.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/icons.png new file mode 100644 index 0000000..12e4700 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/icons.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/image.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/image.png new file mode 100644 index 0000000..19699f6 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/image.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/left_focus.jpg b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/left_focus.jpg new file mode 100644 index 0000000..7886d27 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/left_focus.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/none_focus.jpg b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/none_focus.jpg new file mode 100644 index 0000000..7c768dc Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/none_focus.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/progress.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/progress.png new file mode 100644 index 0000000..717c486 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/progress.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/right_focus.jpg b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/right_focus.jpg new file mode 100644 index 0000000..173e10d Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/right_focus.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/success.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/success.gif new file mode 100644 index 0000000..8d4f311 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/success.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/success.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/success.png new file mode 100644 index 0000000..94f968d Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/images/success.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.css new file mode 100644 index 0000000..5870e7a --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.css @@ -0,0 +1,635 @@ +@charset "utf-8"; +.wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative} +.tabbody{height: 335px;} +.tabbody .panel { + position: absolute; + width: 0; + height: 0; + background: #fff; + overflow: hidden; + display: none; +} +.tabbody .panel.focus { + width: 100%; + height: 335px; + display: block; +} + +.tabbody .panel table td{vertical-align: middle;} +#videoUrl { + width: 490px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +#videoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;} +#searchList{width: 570px;overflow: auto;zoom:1;height: 270px;} +#searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;} +#searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/ +#searchList p{margin-left: 10px;} +#videoType{ + width: 65px; + height: 23px; + line-height: 22px; + border: 1px solid #d7d7d7; +} +#videoSearchBtn,#videoSearchReset{ + /*width: 80px;*/ + height: 25px; + line-height: 25px; + background: #eee; + border: 1px solid #d7d7d7; + cursor: pointer; + padding: 0 5px; +} + + + +#preview{position: relative;width: 420px;padding:0;overflow: hidden; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left} +#preview .previewMsg {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;background-color: #666;} +#preview .previewMsg span{display:block;margin: 125px auto 0 auto;text-align:center;font-size:18px;color:#fff;} +#preview .previewVideo {position:absolute;top:0;margin:0;padding:0;height:280px;width:100%;} +.edui-video-wrapper fieldset{ + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} + +#videoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;} +fieldset{ + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} +fieldset legend{font-weight: bold;} +fieldset p{line-height: 30px;} +fieldset input.txt{ + width: 65px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +label.url{font-weight: bold;margin-left: 5px;color: #06c;} +#videoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} +#videoFloat .focus{opacity: 1;filter: alpha(opacity = 100)} +span.view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue} + + + + +/* upload video */ +.tabbody #upload.panel { + width: 0; + height: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); + background: #fff; + display: block; +} +.tabbody #upload.panel.focus { + width: 100%; + height: 335px; + display: block; + clip: auto; +} +#upload_alignment div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} +#upload_alignment .focus{opacity: 1;filter: alpha(opacity = 100)} +#upload_left { width:427px; float:left; } +#upload_left .controller { height: 30px; clear: both; } +#uploadVideoInfo{margin-top:10px;float:right;padding-right:8px;} + +#upload .queueList { + margin: 0; +} + +#upload p { + margin: 0; +} + +.element-invisible { + width: 0 !important; + height: 0 !important; + border: 0; + padding: 0; + margin: 0; + overflow: hidden; + position: absolute !important; + clip: rect(1px, 1px, 1px, 1px); +} + +#upload .placeholder { + margin: 10px; + margin-right:0; + border: 2px dashed #e6e6e6; + *border: 0px dashed #e6e6e6; + height: 161px; + padding-top: 150px; + text-align: center; + width: 97%; + float: left; + background: url(./images/image.png) center 70px no-repeat; + color: #cccccc; + font-size: 18px; + position: relative; + top:0; + *margin-left: 0; + *left: 10px; +} + +#upload .placeholder .webuploader-pick { + font-size: 18px; + background: #00b7ee; + border-radius: 3px; + line-height: 44px; + padding: 0 30px; + *width: 120px; + color: #fff; + display: inline-block; + margin: 0 auto 20px auto; + cursor: pointer; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} + +#upload .placeholder .webuploader-pick-hover { + background: #00a2d4; +} + + +#filePickerContainer { + text-align: center; +} + +#upload .placeholder .flashTip { + color: #666666; + font-size: 12px; + position: absolute; + width: 100%; + text-align: center; + bottom: 20px; +} + +#upload .placeholder .flashTip a { + color: #0785d1; + text-decoration: none; +} + +#upload .placeholder .flashTip a:hover { + text-decoration: underline; +} + +#upload .placeholder.webuploader-dnd-over { + border-color: #999999; +} + +#upload .filelist { + list-style: none; + margin: 0; + padding: 0; + overflow-x: hidden; + overflow-y: auto; + position: relative; + height: 285px; +} + +#upload .filelist:after { + content: ''; + display: block; + width: 0; + height: 0; + overflow: hidden; + clear: both; +} + +#upload .filelist li { + width: 113px; + height: 113px; + background: url(./images/bg.png); + text-align: center; + margin: 15px 0 0 20px; + *margin: 15px 0 0 15px; + position: relative; + display: block; + float: left; + overflow: hidden; + font-size: 12px; +} + +#upload .filelist li p.log { + position: relative; + top: -45px; +} + +#upload .filelist li p.title { + position: absolute; + top: 0; + left: 0; + width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + top: 5px; + text-indent: 5px; + text-align: left; +} + +#upload .filelist li p.progress { + position: absolute; + width: 100%; + bottom: 0; + left: 0; + height: 8px; + overflow: hidden; + z-index: 50; + margin: 0; + border-radius: 0; + background: none; + -webkit-box-shadow: 0 0 0; +} + +#upload .filelist li p.progress span { + display: none; + overflow: hidden; + width: 0; + height: 100%; + background: #1483d8 url(./images/progress.png) repeat-x; + + -webit-transition: width 200ms linear; + -moz-transition: width 200ms linear; + -o-transition: width 200ms linear; + -ms-transition: width 200ms linear; + transition: width 200ms linear; + + -webkit-animation: progressmove 2s linear infinite; + -moz-animation: progressmove 2s linear infinite; + -o-animation: progressmove 2s linear infinite; + -ms-animation: progressmove 2s linear infinite; + animation: progressmove 2s linear infinite; + + -webkit-transform: translateZ(0); +} + +@-webkit-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@-moz-keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +@keyframes progressmove { + 0% { + background-position: 0 0; + } + 100% { + background-position: 17px 0; + } +} + +#upload .filelist li p.imgWrap { + position: relative; + z-index: 2; + line-height: 113px; + vertical-align: middle; + overflow: hidden; + width: 113px; + height: 113px; + + -webkit-transform-origin: 50% 50%; + -moz-transform-origin: 50% 50%; + -o-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + + -webit-transition: 200ms ease-out; + -moz-transition: 200ms ease-out; + -o-transition: 200ms ease-out; + -ms-transition: 200ms ease-out; + transition: 200ms ease-out; +} +#upload .filelist li p.imgWrap.notimage { + margin-top: 0; + width: 111px; + height: 111px; + border: 1px #eeeeee solid; +} +#upload .filelist li p.imgWrap.notimage i.file-preview { + margin-top: 15px; +} + +#upload .filelist li img { + width: 100%; +} + +#upload .filelist li p.error { + background: #f43838; + color: #fff; + position: absolute; + bottom: 0; + left: 0; + height: 28px; + line-height: 28px; + width: 100%; + z-index: 100; + display:none; +} + +#upload .filelist li .success { + display: block; + position: absolute; + left: 0; + bottom: 0; + height: 40px; + width: 100%; + z-index: 200; + background: url(./images/success.png) no-repeat right bottom; + background-image: url(./images/success.gif) \9; +} + +#upload .filelist li.filePickerBlock { + width: 113px; + height: 113px; + background: url(./images/image.png) no-repeat center 12px; + border: 1px solid #eeeeee; + border-radius: 0; +} +#upload .filelist li.filePickerBlock div.webuploader-pick { + width: 100%; + height: 100%; + margin: 0; + padding: 0; + opacity: 0; + background: none; + font-size: 0; +} + +#upload .filelist div.file-panel { + position: absolute; + height: 0; + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#80000000', endColorstr='#80000000') \0; + background: rgba(0, 0, 0, 0.5); + width: 100%; + top: 0; + left: 0; + overflow: hidden; + z-index: 300; +} + +#upload .filelist div.file-panel span { + width: 24px; + height: 24px; + display: inline; + float: right; + text-indent: -9999px; + overflow: hidden; + background: url(./images/icons.png) no-repeat; + background: url(./images/icons.gif) no-repeat \9; + margin: 5px 1px 1px; + cursor: pointer; + -webkit-tap-highlight-color: rgba(0,0,0,0); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#upload .filelist div.file-panel span.rotateLeft { + display:none; + background-position: 0 -24px; +} + +#upload .filelist div.file-panel span.rotateLeft:hover { + background-position: 0 0; +} + +#upload .filelist div.file-panel span.rotateRight { + display:none; + background-position: -24px -24px; +} + +#upload .filelist div.file-panel span.rotateRight:hover { + background-position: -24px 0; +} + +#upload .filelist div.file-panel span.cancel { + background-position: -48px -24px; +} + +#upload .filelist div.file-panel span.cancel:hover { + background-position: -48px 0; +} + +#upload .statusBar { + height: 45px; + border-bottom: 1px solid #dadada; + margin: 0 10px; + padding: 0; + line-height: 45px; + vertical-align: middle; + position: relative; +} + +#upload .statusBar .progress { + border: 1px solid #1483d8; + width: 198px; + background: #fff; + height: 18px; + position: absolute; + top: 12px; + display: none; + text-align: center; + line-height: 18px; + color: #6dbfff; + margin: 0 10px 0 0; +} +#upload .statusBar .progress span.percentage { + width: 0; + height: 100%; + left: 0; + top: 0; + background: #1483d8; + position: absolute; +} +#upload .statusBar .progress span.text { + position: relative; + z-index: 10; +} + +#upload .statusBar .info { + display: inline-block; + font-size: 14px; + color: #666666; +} + +#upload .statusBar .btns { + position: absolute; + top: 7px; + right: 0; + line-height: 30px; +} + +#filePickerBtn { + display: inline-block; + float: left; +} +#upload .statusBar .btns .webuploader-pick, +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-uploading, +#upload .statusBar .btns .uploadBtn.state-paused { + background: #ffffff; + border: 1px solid #cfcfcf; + color: #565656; + padding: 0 18px; + display: inline-block; + border-radius: 3px; + margin-left: 10px; + cursor: pointer; + font-size: 14px; + float: left; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +#upload .statusBar .btns .webuploader-pick-hover, +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-uploading:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover { + background: #f0f0f0; +} + +#upload .statusBar .btns .uploadBtn, +#upload .statusBar .btns .uploadBtn.state-paused{ + background: #00b7ee; + color: #fff; + border-color: transparent; +} +#upload .statusBar .btns .uploadBtn:hover, +#upload .statusBar .btns .uploadBtn.state-paused:hover{ + background: #00a2d4; +} + +#upload .statusBar .btns .uploadBtn.disabled { + pointer-events: none; + filter:alpha(opacity=60); + -moz-opacity:0.6; + -khtml-opacity: 0.6; + opacity: 0.6; +} + + +/* 在线文件的文件预览图标 */ +i.file-preview { + display: block; + margin: 10px auto; + width: 70px; + height: 70px; + background-image: url("./images/file-icons.png"); + background-image: url("./images/file-icons.gif") \9; + background-position: -140px center; + background-repeat: no-repeat; +} +i.file-preview.file-type-dir{ + background-position: 0 center; +} +i.file-preview.file-type-file{ + background-position: -140px center; +} +i.file-preview.file-type-filelist{ + background-position: -210px center; +} +i.file-preview.file-type-zip, +i.file-preview.file-type-rar, +i.file-preview.file-type-7z, +i.file-preview.file-type-tar, +i.file-preview.file-type-gz, +i.file-preview.file-type-bz2{ + background-position: -280px center; +} +i.file-preview.file-type-xls, +i.file-preview.file-type-xlsx{ + background-position: -350px center; +} +i.file-preview.file-type-doc, +i.file-preview.file-type-docx{ + background-position: -420px center; +} +i.file-preview.file-type-ppt, +i.file-preview.file-type-pptx{ + background-position: -490px center; +} +i.file-preview.file-type-vsd{ + background-position: -560px center; +} +i.file-preview.file-type-pdf{ + background-position: -630px center; +} +i.file-preview.file-type-txt, +i.file-preview.file-type-md, +i.file-preview.file-type-json, +i.file-preview.file-type-htm, +i.file-preview.file-type-xml, +i.file-preview.file-type-html, +i.file-preview.file-type-js, +i.file-preview.file-type-css, +i.file-preview.file-type-php, +i.file-preview.file-type-jsp, +i.file-preview.file-type-asp{ + background-position: -700px center; +} +i.file-preview.file-type-apk{ + background-position: -770px center; +} +i.file-preview.file-type-exe{ + background-position: -840px center; +} +i.file-preview.file-type-ipa{ + background-position: -910px center; +} +i.file-preview.file-type-mp4, +i.file-preview.file-type-swf, +i.file-preview.file-type-mkv, +i.file-preview.file-type-avi, +i.file-preview.file-type-flv, +i.file-preview.file-type-mov, +i.file-preview.file-type-mpg, +i.file-preview.file-type-mpeg, +i.file-preview.file-type-ogv, +i.file-preview.file-type-webm, +i.file-preview.file-type-rm, +i.file-preview.file-type-rmvb{ + background-position: -980px center; +} +i.file-preview.file-type-ogg, +i.file-preview.file-type-wav, +i.file-preview.file-type-wmv, +i.file-preview.file-type-mid, +i.file-preview.file-type-mp3{ + background-position: -1050px center; +} +i.file-preview.file-type-jpg, +i.file-preview.file-type-jpeg, +i.file-preview.file-type-gif, +i.file-preview.file-type-bmp, +i.file-preview.file-type-png, +i.file-preview.file-type-psd{ + background-position: -140px center; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.html new file mode 100644 index 0000000..5007882 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.html @@ -0,0 +1,86 @@ + + + + + + + + + +
            +
            +
            + + +
            +
            +
            +
            +
            +
            +
            + + + + +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            +
            +
            + 0% + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            +
              +
            • +
            +
            +
            +
            +
            + + + + +
            +
            +
            + +
            +
            +
            +
            +
            +
            +
            + + + + + + + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.js new file mode 100644 index 0000000..a8c34d9 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/video/video.js @@ -0,0 +1,791 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-2-20 + * Time: 上午11:19 + * To change this template use File | Settings | File Templates. + */ + +(function(){ + + var video = {}, + uploadVideoList = [], + isModifyUploadVideo = false, + uploadFile; + + window.onload = function(){ + $focus($G("videoUrl")); + initTabs(); + initVideo(); + initUpload(); + }; + + /* 初始化tab标签 */ + function initTabs(){ + var tabs = $G('tabHeads').children; + for (var i = 0; i < tabs.length; i++) { + domUtils.on(tabs[i], "click", function (e) { + var j, bodyId, target = e.target || e.srcElement; + for (j = 0; j < tabs.length; j++) { + bodyId = tabs[j].getAttribute('data-content-id'); + if(tabs[j] == target){ + domUtils.addClass(tabs[j], 'focus'); + domUtils.addClass($G(bodyId), 'focus'); + }else { + domUtils.removeClasses(tabs[j], 'focus'); + domUtils.removeClasses($G(bodyId), 'focus'); + } + } + }); + } + } + + function initVideo(){ + createAlignButton( ["videoFloat", "upload_alignment"] ); + addUrlChangeListener($G("videoUrl")); + addOkListener(); + + //编辑视频时初始化相关信息 + (function(){ + var img = editor.selection.getRange().getClosedNode(),url; + if(img && img.className){ + var hasFakedClass = (img.className == "edui-faked-video"), + hasUploadClass = img.className.indexOf("edui-upload-video")!=-1; + if(hasFakedClass || hasUploadClass) { + $G("videoUrl").value = url = img.getAttribute("_url"); + $G("videoWidth").value = img.width; + $G("videoHeight").value = img.height; + var align = domUtils.getComputedStyle(img,"float"), + parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align"); + updateAlignButton(parentAlign==="center"?"center":align); + } + if(hasUploadClass) { + isModifyUploadVideo = true; + } + } + createPreviewVideo(url); + })(); + } + + /** + * 监听确认和取消两个按钮事件,用户执行插入或者清空正在播放的视频实例操作 + */ + function addOkListener(){ + dialog.onok = function(){ + $G("preview").innerHTML = ""; + var currentTab = findFocus("tabHeads","tabSrc"); + switch(currentTab){ + case "video": + return insertSingle(); + break; + case "videoSearch": + return insertSearch("searchList"); + break; + case "upload": + return insertUpload(); + break; + } + }; + dialog.oncancel = function(){ + $G("preview").innerHTML = ""; + }; + } + + /** + * 依据传入的align值更新按钮信息 + * @param align + */ + function updateAlignButton( align ) { + var aligns = $G( "videoFloat" ).children; + for ( var i = 0, ci; ci = aligns[i++]; ) { + if ( ci.getAttribute( "name" ) == align ) { + if ( ci.className !="focus" ) { + ci.className = "focus"; + } + } else { + if ( ci.className =="focus" ) { + ci.className = ""; + } + } + } + } + + /** + * 将单个视频信息插入编辑器中 + */ + function insertSingle(){ + var width = $G("videoWidth"), + height = $G("videoHeight"), + url=$G('videoUrl').value, + align = findFocus("videoFloat","name"); + if(!url) return false; + if ( !checkNum( [width, height] ) ) return false; + editor.execCommand('insertvideo', { + url: convert_url(url), + width: width.value, + height: height.value, + align: align + }, isModifyUploadVideo ? 'upload':null); + } + + /** + * 将元素id下的所有代表视频的图片插入编辑器中 + * @param id + */ + function insertSearch(id){ + var imgs = domUtils.getElementsByTagName($G(id),"img"), + videoObjs=[]; + for(var i=0,img; img=imgs[i++];){ + if(img.getAttribute("selected")){ + videoObjs.push({ + url:img.getAttribute("ue_video_url"), + width:420, + height:280, + align:"none" + }); + } + } + editor.execCommand('insertvideo',videoObjs); + } + + /** + * 找到id下具有focus类的节点并返回该节点下的某个属性 + * @param id + * @param returnProperty + */ + function findFocus( id, returnProperty ) { + var tabs = $G( id ).children, + property; + for ( var i = 0, ci; ci = tabs[i++]; ) { + if ( ci.className=="focus" ) { + property = ci.getAttribute( returnProperty ); + break; + } + } + return property; + } + function convert_url(url){ + if ( !url ) return ''; + url = utils.trim(url) + .replace(/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, 'player.youku.com/player.php/sid/$1/v.swf') + .replace(/(www\.)?youtube\.com\/watch\?v=([\w\-]+)/i, "www.youtube.com/v/$2") + .replace(/youtu.be\/(\w+)$/i, "www.youtube.com/v/$1") + .replace(/v\.ku6\.com\/.+\/([\w\.]+)\.html.*$/i, "player.ku6.com/refer/$1/v.swf") + .replace(/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "player.56.com/v_$1.swf") + .replace(/v\.pps\.tv\/play_([\w]+)\.html.*$/i, "player.pps.tv/player/sid/$1/v.swf") + .replace(/www\.letv\.com\/ptv\/vplay\/([\d]+)\.html.*$/i, "i7.imgs.letv.com/player/swfPlayer.swf?id=$1&autoplay=0") + .replace(/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "www.tudou.com/v/$1") + .replace(/v\.qq\.com\/cover\/[\w]+\/[\w]+\/([\w]+)\.html/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/v\.qq\.com\/.+[\?\&]vid=([^&]+).*$/i, "static.video.qq.com/TPout.swf?vid=$1") + .replace(/my\.tv\.sohu\.com\/[\w]+\/[\d]+\/([\d]+)\.shtml.*$/i, "share.vrs.sohu.com/my/v.swf&id=$1"); + + return url; + } + + /** + * 检测传入的所有input框中输入的长宽是否是正数 + * @param nodes input框集合, + */ + function checkNum( nodes ) { + for ( var i = 0, ci; ci = nodes[i++]; ) { + var value = ci.value; + if ( !isNumber( value ) && value) { + alert( lang.numError ); + ci.value = ""; + ci.focus(); + return false; + } + } + return true; + } + + /** + * 数字判断 + * @param value + */ + function isNumber( value ) { + return /(0|^[1-9]\d*$)/.test( value ); + } + + /** + * 创建图片浮动选择按钮 + * @param ids + */ + function createAlignButton( ids ) { + for ( var i = 0, ci; ci = ids[i++]; ) { + var floatContainer = $G( ci ), + nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight, "center":lang.block}; + for ( var j in nameMaps ) { + var div = document.createElement( "div" ); + div.setAttribute( "name", j ); + if ( j == "none" ) div.className="focus"; + div.style.cssText = "background:url(images/" + j + "_focus.jpg);"; + div.setAttribute( "title", nameMaps[j] ); + floatContainer.appendChild( div ); + } + switchSelect( ci ); + } + } + + /** + * 选择切换 + * @param selectParentId + */ + function switchSelect( selectParentId ) { + var selects = $G( selectParentId ).children; + for ( var i = 0, ci; ci = selects[i++]; ) { + domUtils.on( ci, "click", function () { + for ( var j = 0, cj; cj = selects[j++]; ) { + cj.className = ""; + cj.removeAttribute && cj.removeAttribute( "class" ); + } + this.className = "focus"; + } ) + } + } + + /** + * 监听url改变事件 + * @param url + */ + function addUrlChangeListener(url){ + if (browser.ie) { + url.onpropertychange = function () { + createPreviewVideo( this.value ); + } + } else { + url.addEventListener( "input", function () { + createPreviewVideo( this.value ); + }, false ); + } + } + + /** + * 根据url生成视频预览 + * @param url + */ + function createPreviewVideo(url){ + if ( !url )return; + + var conUrl = convert_url(url); + + conUrl = utils.unhtmlForUrl(conUrl); + + $G("preview").innerHTML = '
            '+lang.urlError+'
            '+ + '' + + ''; + } + + + /* 插入上传视频 */ + function insertUpload(){ + var videoObjs=[], + uploadDir = editor.getOpt('videoUrlPrefix'), + width = parseInt($G('upload_width').value, 10) || 420, + height = parseInt($G('upload_height').value, 10) || 280, + align = findFocus("upload_alignment","name") || 'none'; + for(var key in uploadVideoList) { + var file = uploadVideoList[key]; + videoObjs.push({ + url: uploadDir + file.url, + width:width, + height:height, + align:align + }); + } + + var count = uploadFile.getQueueCount(); + if (count) { + $('.info', '#queueList').html('' + '还有2个未上传文件'.replace(/[\d]/, count) + ''); + return false; + } else { + editor.execCommand('insertvideo', videoObjs, 'upload'); + } + } + + /*初始化上传标签*/ + function initUpload(){ + uploadFile = new UploadFile('queueList'); + } + + + /* 上传附件 */ + function UploadFile(target) { + this.$wrap = target.constructor == String ? $('#' + target) : $(target); + this.init(); + } + UploadFile.prototype = { + init: function () { + this.fileList = []; + this.initContainer(); + this.initUploader(); + }, + initContainer: function () { + this.$queue = this.$wrap.find('.filelist'); + }, + /* 初始化容器 */ + initUploader: function () { + var _this = this, + $ = jQuery, // just in case. Make sure it's not an other libaray. + $wrap = _this.$wrap, + // 图片容器 + $queue = $wrap.find('.filelist'), + // 状态栏,包括进度和控制按钮 + $statusBar = $wrap.find('.statusBar'), + // 文件总体选择信息。 + $info = $statusBar.find('.info'), + // 上传按钮 + $upload = $wrap.find('.uploadBtn'), + // 上传按钮 + $filePickerBtn = $wrap.find('.filePickerBtn'), + // 上传按钮 + $filePickerBlock = $wrap.find('.filePickerBlock'), + // 没选择文件之前的内容。 + $placeHolder = $wrap.find('.placeholder'), + // 总体进度条 + $progress = $statusBar.find('.progress').hide(), + // 添加的文件数量 + fileCount = 0, + // 添加的文件总大小 + fileSize = 0, + // 优化retina, 在retina下这个值是2 + ratio = window.devicePixelRatio || 1, + // 缩略图大小 + thumbnailWidth = 113 * ratio, + thumbnailHeight = 113 * ratio, + // 可能有pedding, ready, uploading, confirm, done. + state = '', + // 所有文件的进度信息,key为file id + percentages = {}, + supportTransition = (function () { + var s = document.createElement('p').style, + r = 'transition' in s || + 'WebkitTransition' in s || + 'MozTransition' in s || + 'msTransition' in s || + 'OTransition' in s; + s = null; + return r; + })(), + // WebUploader实例 + uploader, + actionUrl = editor.getActionUrl(editor.getOpt('videoActionName')), + fileMaxSize = editor.getOpt('videoMaxSize'), + acceptExtensions = (editor.getOpt('videoAllowFiles') || []).join('').replace(/\./g, ',').replace(/^[,]/, '');; + + if (!WebUploader.Uploader.support()) { + $('#filePickerReady').after($('
            ').html(lang.errorNotSupport)).hide(); + return; + } else if (!editor.getOpt('videoActionName')) { + $('#filePickerReady').after($('
            ').html(lang.errorLoadConfig)).hide(); + return; + } + + uploader = _this.uploader = WebUploader.create({ + pick: { + id: '#filePickerReady', + label: lang.uploadSelectFile + }, + swf: '../../third-party/webuploader/Uploader.swf', + server: actionUrl, + fileVal: editor.getOpt('videoFieldName'), + duplicate: true, + fileSingleSizeLimit: fileMaxSize, + compress: false + }); + uploader.addButton({ + id: '#filePickerBlock' + }); + uploader.addButton({ + id: '#filePickerBtn', + label: lang.uploadAddFile + }); + + setState('pedding'); + + // 当有文件添加进来时执行,负责view的创建 + function addFile(file) { + var $li = $('
          • ' + + '

            ' + file.name + '

            ' + + '

            ' + + '

            ' + + '
          • '), + + $btns = $('
            ' + + '' + lang.uploadDelete + '' + + '' + lang.uploadTurnRight + '' + + '' + lang.uploadTurnLeft + '
            ').appendTo($li), + $prgress = $li.find('p.progress span'), + $wrap = $li.find('p.imgWrap'), + $info = $('

            ').hide().appendTo($li), + + showError = function (code) { + switch (code) { + case 'exceed_size': + text = lang.errorExceedSize; + break; + case 'interrupt': + text = lang.errorInterrupt; + break; + case 'http': + text = lang.errorHttp; + break; + case 'not_allow_type': + text = lang.errorFileType; + break; + default: + text = lang.errorUploadRetry; + break; + } + $info.text(text).show(); + }; + + if (file.getStatus() === 'invalid') { + showError(file.statusText); + } else { + $wrap.text(lang.uploadPreview); + if ('|png|jpg|jpeg|bmp|gif|'.indexOf('|'+file.ext.toLowerCase()+'|') == -1) { + $wrap.empty().addClass('notimage').append('' + + '' + file.name + ''); + } else { + if (browser.ie && browser.version <= 7) { + $wrap.text(lang.uploadNoPreview); + } else { + uploader.makeThumb(file, function (error, src) { + if (error || !src || (/^data:/.test(src) && browser.ie && browser.version <= 7)) { + $wrap.text(lang.uploadNoPreview); + } else { + var $img = $(''); + $wrap.empty().append($img); + $img.on('error', function () { + $wrap.text(lang.uploadNoPreview); + }); + } + }, thumbnailWidth, thumbnailHeight); + } + } + percentages[ file.id ] = [ file.size, 0 ]; + file.rotation = 0; + + /* 检查文件格式 */ + if (!file.ext || acceptExtensions.indexOf(file.ext.toLowerCase()) == -1) { + showError('not_allow_type'); + uploader.removeFile(file); + } + } + + file.on('statuschange', function (cur, prev) { + if (prev === 'progress') { + $prgress.hide().width(0); + } else if (prev === 'queued') { + $li.off('mouseenter mouseleave'); + $btns.remove(); + } + // 成功 + if (cur === 'error' || cur === 'invalid') { + showError(file.statusText); + percentages[ file.id ][ 1 ] = 1; + } else if (cur === 'interrupt') { + showError('interrupt'); + } else if (cur === 'queued') { + percentages[ file.id ][ 1 ] = 0; + } else if (cur === 'progress') { + $info.hide(); + $prgress.css('display', 'block'); + } else if (cur === 'complete') { + } + + $li.removeClass('state-' + prev).addClass('state-' + cur); + }); + + $li.on('mouseenter', function () { + $btns.stop().animate({height: 30}); + }); + $li.on('mouseleave', function () { + $btns.stop().animate({height: 0}); + }); + + $btns.on('click', 'span', function () { + var index = $(this).index(), + deg; + + switch (index) { + case 0: + uploader.removeFile(file); + return; + case 1: + file.rotation += 90; + break; + case 2: + file.rotation -= 90; + break; + } + + if (supportTransition) { + deg = 'rotate(' + file.rotation + 'deg)'; + $wrap.css({ + '-webkit-transform': deg, + '-mos-transform': deg, + '-o-transform': deg, + 'transform': deg + }); + } else { + $wrap.css('filter', 'progid:DXImageTransform.Microsoft.BasicImage(rotation=' + (~~((file.rotation / 90) % 4 + 4) % 4) + ')'); + } + + }); + + $li.insertBefore($filePickerBlock); + } + + // 负责view的销毁 + function removeFile(file) { + var $li = $('#' + file.id); + delete percentages[ file.id ]; + updateTotalProgress(); + $li.off().find('.file-panel').off().end().remove(); + } + + function updateTotalProgress() { + var loaded = 0, + total = 0, + spans = $progress.children(), + percent; + + $.each(percentages, function (k, v) { + total += v[ 0 ]; + loaded += v[ 0 ] * v[ 1 ]; + }); + + percent = total ? loaded / total : 0; + + spans.eq(0).text(Math.round(percent * 100) + '%'); + spans.eq(1).css('width', Math.round(percent * 100) + '%'); + updateStatus(); + } + + function setState(val, files) { + + if (val != state) { + + var stats = uploader.getStats(); + + $upload.removeClass('state-' + state); + $upload.addClass('state-' + val); + + switch (val) { + + /* 未选择文件 */ + case 'pedding': + $queue.addClass('element-invisible'); + $statusBar.addClass('element-invisible'); + $placeHolder.removeClass('element-invisible'); + $progress.hide(); $info.hide(); + uploader.refresh(); + break; + + /* 可以开始上传 */ + case 'ready': + $placeHolder.addClass('element-invisible'); + $queue.removeClass('element-invisible'); + $statusBar.removeClass('element-invisible'); + $progress.hide(); $info.show(); + $upload.text(lang.uploadStart); + uploader.refresh(); + break; + + /* 上传中 */ + case 'uploading': + $progress.show(); $info.hide(); + $upload.text(lang.uploadPause); + break; + + /* 暂停上传 */ + case 'paused': + $progress.show(); $info.hide(); + $upload.text(lang.uploadContinue); + break; + + case 'confirm': + $progress.show(); $info.hide(); + $upload.text(lang.uploadStart); + + stats = uploader.getStats(); + if (stats.successNum && !stats.uploadFailNum) { + setState('finish'); + return; + } + break; + + case 'finish': + $progress.hide(); $info.show(); + if (stats.uploadFailNum) { + $upload.text(lang.uploadRetry); + } else { + $upload.text(lang.uploadStart); + } + break; + } + + state = val; + updateStatus(); + + } + + if (!_this.getQueueCount()) { + $upload.addClass('disabled') + } else { + $upload.removeClass('disabled') + } + + } + + function updateStatus() { + var text = '', stats; + + if (state === 'ready') { + text = lang.updateStatusReady.replace('_', fileCount).replace('_KB', WebUploader.formatSize(fileSize)); + } else if (state === 'confirm') { + stats = uploader.getStats(); + if (stats.uploadFailNum) { + text = lang.updateStatusConfirm.replace('_', stats.successNum).replace('_', stats.successNum); + } + } else { + stats = uploader.getStats(); + text = lang.updateStatusFinish.replace('_', fileCount). + replace('_KB', WebUploader.formatSize(fileSize)). + replace('_', stats.successNum); + + if (stats.uploadFailNum) { + text += lang.updateStatusError.replace('_', stats.uploadFailNum); + } + } + + $info.html(text); + } + + uploader.on('fileQueued', function (file) { + fileCount++; + fileSize += file.size; + + if (fileCount === 1) { + $placeHolder.addClass('element-invisible'); + $statusBar.show(); + } + + addFile(file); + }); + + uploader.on('fileDequeued', function (file) { + fileCount--; + fileSize -= file.size; + + removeFile(file); + updateTotalProgress(); + }); + + uploader.on('filesQueued', function (file) { + if (!uploader.isInProgress() && (state == 'pedding' || state == 'finish' || state == 'confirm' || state == 'ready')) { + setState('ready'); + } + updateTotalProgress(); + }); + + uploader.on('all', function (type, files) { + switch (type) { + case 'uploadFinished': + setState('confirm', files); + break; + case 'startUpload': + /* 添加额外的GET参数 */ + var params = utils.serializeParam(editor.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params); + uploader.option('server', url); + setState('uploading', files); + break; + case 'stopUpload': + setState('paused', files); + break; + } + }); + + uploader.on('uploadBeforeSend', function (file, data, header) { + //这里可以通过data对象添加POST参数 + header['X_Requested_With'] = 'XMLHttpRequest'; + }); + + uploader.on('uploadProgress', function (file, percentage) { + var $li = $('#' + file.id), + $percent = $li.find('.progress span'); + + $percent.css('width', percentage * 100 + '%'); + percentages[ file.id ][ 1 ] = percentage; + updateTotalProgress(); + }); + + uploader.on('uploadSuccess', function (file, ret) { + var $file = $('#' + file.id); + try { + var responseText = (ret._raw || ret), + json = utils.str2json(responseText); + if (json.state == 'SUCCESS') { + uploadVideoList.push({ + 'url': json.url, + 'type': json.type, + 'original':json.original + }); + $file.append(''); + } else { + $file.find('.error').text(json.state).show(); + } + } catch (e) { + $file.find('.error').text(lang.errorServerUpload).show(); + } + }); + + uploader.on('uploadError', function (file, code) { + }); + uploader.on('error', function (code, file) { + if (code == 'Q_TYPE_DENIED' || code == 'F_EXCEED_SIZE') { + addFile(file); + } + }); + uploader.on('uploadComplete', function (file, ret) { + }); + + $upload.on('click', function () { + if ($(this).hasClass('disabled')) { + return false; + } + + if (state === 'ready') { + uploader.upload(); + } else if (state === 'paused') { + uploader.upload(); + } else if (state === 'uploading') { + uploader.stop(); + } + }); + + $upload.addClass('state-' + state); + updateTotalProgress(); + }, + getQueueCount: function () { + var file, i, status, readyFile = 0, files = this.uploader.getFiles(); + for (i = 0; file = files[i++]; ) { + status = file.getStatus(); + if (status == 'queued' || status == 'uploading' || status == 'progress') readyFile++; + } + return readyFile; + }, + refresh: function(){ + this.uploader.refresh(); + } + }; + +})(); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/webapp/webapp.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/webapp/webapp.html new file mode 100644 index 0000000..1614377 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/webapp/webapp.html @@ -0,0 +1,53 @@ + + + + + + + + + +
            +
            +
            + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/fClipboard_ueditor.swf b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/fClipboard_ueditor.swf new file mode 100644 index 0000000..ac5d27f Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/fClipboard_ueditor.swf differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/imageUploader.swf b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/imageUploader.swf new file mode 100644 index 0000000..2a554ca Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/imageUploader.swf differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/tangram.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/tangram.js new file mode 100644 index 0000000..2ebd8fd --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/tangram.js @@ -0,0 +1,1495 @@ +// Copyright (c) 2009, Baidu Inc. All rights reserved. +// +// Licensed under the BSD License +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http:// tangram.baidu.com/license.html +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS-IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + /** + * @namespace T Tangram七巧板 + * @name T + * @version 1.6.0 +*/ + +/** + * 声明baidu包 + * @author: allstar, erik, meizz, berg + */ +var T, + baidu = T = baidu || {version: "1.5.0"}; +baidu.guid = "$BAIDU$"; +baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}}; + +/** + * 使用flash资源封装的一些功能 + * @namespace baidu.flash + */ +baidu.flash = baidu.flash || {}; + +/** + * 操作dom的方法 + * @namespace baidu.dom + */ +baidu.dom = baidu.dom || {}; + + +/** + * 从文档中获取指定的DOM元素 + * @name baidu.dom.g + * @function + * @grammar baidu.dom.g(id) + * @param {string|HTMLElement} id 元素的id或DOM元素. + * @shortcut g,T.G + * @meta standard + * @see baidu.dom.q + * + * @return {HTMLElement|null} 获取的元素,查找不到时返回null,如果参数不合法,直接返回参数. + */ +baidu.dom.g = function(id) { + if (!id) return null; + if ('string' == typeof id || id instanceof String) { + return document.getElementById(id); + } else if (id.nodeName && (id.nodeType == 1 || id.nodeType == 9)) { + return id; + } + return null; +}; +baidu.g = baidu.G = baidu.dom.g; + + +/** + * 操作数组的方法 + * @namespace baidu.array + */ + +baidu.array = baidu.array || {}; + + +/** + * 遍历数组中所有元素 + * @name baidu.array.each + * @function + * @grammar baidu.array.each(source, iterator[, thisObject]) + * @param {Array} source 需要遍历的数组 + * @param {Function} iterator 对每个数组元素进行调用的函数,该函数有两个参数,第一个为数组元素,第二个为数组索引值,function (item, index)。 + * @param {Object} [thisObject] 函数调用时的this指针,如果没有此参数,默认是当前遍历的数组 + * @remark + * each方法不支持对Object的遍历,对Object的遍历使用baidu.object.each 。 + * @shortcut each + * @meta standard + * + * @returns {Array} 遍历的数组 + */ + +baidu.each = baidu.array.forEach = baidu.array.each = function (source, iterator, thisObject) { + var returnValue, item, i, len = source.length; + + if ('function' == typeof iterator) { + for (i = 0; i < len; i++) { + item = source[i]; + returnValue = iterator.call(thisObject || source, item, i); + + if (returnValue === false) { + break; + } + } + } + return source; +}; + +/** + * 对语言层面的封装,包括类型判断、模块扩展、继承基类以及对象自定义事件的支持。 + * @namespace baidu.lang + */ +baidu.lang = baidu.lang || {}; + + +/** + * 判断目标参数是否为function或Function实例 + * @name baidu.lang.isFunction + * @function + * @grammar baidu.lang.isFunction(source) + * @param {Any} source 目标参数 + * @version 1.2 + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * @meta standard + * @returns {boolean} 类型判断结果 + */ +baidu.lang.isFunction = function (source) { + return '[object Function]' == Object.prototype.toString.call(source); +}; + +/** + * 判断目标参数是否string类型或String对象 + * @name baidu.lang.isString + * @function + * @grammar baidu.lang.isString(source) + * @param {Any} source 目标参数 + * @shortcut isString + * @meta standard + * @see baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isArray,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * + * @returns {boolean} 类型判断结果 + */ +baidu.lang.isString = function (source) { + return '[object String]' == Object.prototype.toString.call(source); +}; +baidu.isString = baidu.lang.isString; + + +/** + * 判断浏览器类型和特性的属性 + * @namespace baidu.browser + */ +baidu.browser = baidu.browser || {}; + + +/** + * 判断是否为opera浏览器 + * @property opera opera版本号 + * @grammar baidu.browser.opera + * @meta standard + * @see baidu.browser.ie,baidu.browser.firefox,baidu.browser.safari,baidu.browser.chrome + * @returns {Number} opera版本号 + */ + +/** + * opera 从10开始不是用opera后面的字符串进行版本的判断 + * 在Browser identification最后添加Version + 数字进行版本标识 + * opera后面的数字保持在9.80不变 + */ +baidu.browser.opera = /opera(\/| )(\d+(\.\d+)?)(.+?(version\/(\d+(\.\d+)?)))?/i.test(navigator.userAgent) ? + ( RegExp["\x246"] || RegExp["\x242"] ) : undefined; + + +/** + * 在目标元素的指定位置插入HTML代码 + * @name baidu.dom.insertHTML + * @function + * @grammar baidu.dom.insertHTML(element, position, html) + * @param {HTMLElement|string} element 目标元素或目标元素的id + * @param {string} position 插入html的位置信息,取值为beforeBegin,afterBegin,beforeEnd,afterEnd + * @param {string} html 要插入的html + * @remark + * + * 对于position参数,大小写不敏感
            + * 参数的意思:beforeBegin<span>afterBegin this is span! beforeEnd</span> afterEnd
            + * 此外,如果使用本函数插入带有script标签的HTML字符串,script标签对应的脚本将不会被执行。 + * + * @shortcut insertHTML + * @meta standard + * + * @returns {HTMLElement} 目标元素 + */ +baidu.dom.insertHTML = function (element, position, html) { + element = baidu.dom.g(element); + var range,begin; + if (element.insertAdjacentHTML && !baidu.browser.opera) { + element.insertAdjacentHTML(position, html); + } else { + range = element.ownerDocument.createRange(); + position = position.toUpperCase(); + if (position == 'AFTERBEGIN' || position == 'BEFOREEND') { + range.selectNodeContents(element); + range.collapse(position == 'AFTERBEGIN'); + } else { + begin = position == 'BEFOREBEGIN'; + range[begin ? 'setStartBefore' : 'setEndAfter'](element); + range.collapse(begin); + } + range.insertNode(range.createContextualFragment(html)); + } + return element; +}; + +baidu.insertHTML = baidu.dom.insertHTML; + +/** + * 操作flash对象的方法,包括创建flash对象、获取flash对象以及判断flash插件的版本号 + * @namespace baidu.swf + */ +baidu.swf = baidu.swf || {}; + + +/** + * 浏览器支持的flash插件版本 + * @property version 浏览器支持的flash插件版本 + * @grammar baidu.swf.version + * @return {String} 版本号 + * @meta standard + */ +baidu.swf.version = (function () { + var n = navigator; + if (n.plugins && n.mimeTypes.length) { + var plugin = n.plugins["Shockwave Flash"]; + if (plugin && plugin.description) { + return plugin.description + .replace(/([a-zA-Z]|\s)+/, "") + .replace(/(\s)+r/, ".") + ".0"; + } + } else if (window.ActiveXObject && !window.opera) { + for (var i = 12; i >= 2; i--) { + try { + var c = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.' + i); + if (c) { + var version = c.GetVariable("$version"); + return version.replace(/WIN/g,'').replace(/,/g,'.'); + } + } catch(e) {} + } + } +})(); + +/** + * 操作字符串的方法 + * @namespace baidu.string + */ +baidu.string = baidu.string || {}; + + +/** + * 对目标字符串进行html编码 + * @name baidu.string.encodeHTML + * @function + * @grammar baidu.string.encodeHTML(source) + * @param {string} source 目标字符串 + * @remark + * 编码字符有5个:&<>"' + * @shortcut encodeHTML + * @meta standard + * @see baidu.string.decodeHTML + * + * @returns {string} html编码后的字符串 + */ +baidu.string.encodeHTML = function (source) { + return String(source) + .replace(/&/g,'&') + .replace(//g,'>') + .replace(/"/g, """) + .replace(/'/g, "'"); +}; + +baidu.encodeHTML = baidu.string.encodeHTML; + +/** + * 创建flash对象的html字符串 + * @name baidu.swf.createHTML + * @function + * @grammar baidu.swf.createHTML(options) + * + * @param {Object} options 创建flash的选项参数 + * @param {string} options.id 要创建的flash的标识 + * @param {string} options.url flash文件的url + * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 + * @param {string} options.ver 最低需要的flash player版本号 + * @param {string} options.width flash的宽度 + * @param {string} options.height flash的高度 + * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom + * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL + * @param {string} options.bgcolor swf文件的背景色 + * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false + * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false + * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false + * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best + * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit + * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent + * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain + * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none + * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false + * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false + * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false + * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false + * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 + * + * @see baidu.swf.create + * @meta standard + * @returns {string} flash对象的html字符串 + */ +baidu.swf.createHTML = function (options) { + options = options || {}; + var version = baidu.swf.version, + needVersion = options['ver'] || '6.0.0', + vUnit1, vUnit2, i, k, len, item, tmpOpt = {}, + encodeHTML = baidu.string.encodeHTML; + for (k in options) { + tmpOpt[k] = options[k]; + } + options = tmpOpt; + if (version) { + version = version.split('.'); + needVersion = needVersion.split('.'); + for (i = 0; i < 3; i++) { + vUnit1 = parseInt(version[i], 10); + vUnit2 = parseInt(needVersion[i], 10); + if (vUnit2 < vUnit1) { + break; + } else if (vUnit2 > vUnit1) { + return ''; + } + } + } else { + return ''; + } + + var vars = options['vars'], + objProperties = ['classid', 'codebase', 'id', 'width', 'height', 'align']; + options['align'] = options['align'] || 'middle'; + options['classid'] = 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'; + options['codebase'] = 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0'; + options['movie'] = options['url'] || ''; + delete options['vars']; + delete options['url']; + if ('string' == typeof vars) { + options['flashvars'] = vars; + } else { + var fvars = []; + for (k in vars) { + item = vars[k]; + fvars.push(k + "=" + encodeURIComponent(item)); + } + options['flashvars'] = fvars.join('&'); + } + var str = [''); + var params = { + 'wmode' : 1, + 'scale' : 1, + 'quality' : 1, + 'play' : 1, + 'loop' : 1, + 'menu' : 1, + 'salign' : 1, + 'bgcolor' : 1, + 'base' : 1, + 'allowscriptaccess' : 1, + 'allownetworking' : 1, + 'allowfullscreen' : 1, + 'seamlesstabbing' : 1, + 'devicefont' : 1, + 'swliveconnect' : 1, + 'flashvars' : 1, + 'movie' : 1 + }; + + for (k in options) { + item = options[k]; + k = k.toLowerCase(); + if (params[k] && (item || item === false || item === 0)) { + str.push(''); + } + } + options['src'] = options['movie']; + options['name'] = options['id']; + delete options['id']; + delete options['movie']; + delete options['classid']; + delete options['codebase']; + options['type'] = 'application/x-shockwave-flash'; + options['pluginspage'] = 'http://www.macromedia.com/go/getflashplayer'; + str.push(''); + + return str.join(''); +}; + + +/** + * 在页面中创建一个flash对象 + * @name baidu.swf.create + * @function + * @grammar baidu.swf.create(options[, container]) + * + * @param {Object} options 创建flash的选项参数 + * @param {string} options.id 要创建的flash的标识 + * @param {string} options.url flash文件的url + * @param {String} options.errorMessage 未安装flash player或flash player版本号过低时的提示 + * @param {string} options.ver 最低需要的flash player版本号 + * @param {string} options.width flash的宽度 + * @param {string} options.height flash的高度 + * @param {string} options.align flash的对齐方式,允许值:middle/left/right/top/bottom + * @param {string} options.base 设置用于解析swf文件中的所有相对路径语句的基本目录或URL + * @param {string} options.bgcolor swf文件的背景色 + * @param {string} options.salign 设置缩放的swf文件在由width和height设置定义的区域内的位置。允许值:l/r/t/b/tl/tr/bl/br + * @param {boolean} options.menu 是否显示右键菜单,允许值:true/false + * @param {boolean} options.loop 播放到最后一帧时是否重新播放,允许值: true/false + * @param {boolean} options.play flash是否在浏览器加载时就开始播放。允许值:true/false + * @param {string} options.quality 设置flash播放的画质,允许值:low/medium/high/autolow/autohigh/best + * @param {string} options.scale 设置flash内容如何缩放来适应设置的宽高。允许值:showall/noborder/exactfit + * @param {string} options.wmode 设置flash的显示模式。允许值:window/opaque/transparent + * @param {string} options.allowscriptaccess 设置flash与页面的通信权限。允许值:always/never/sameDomain + * @param {string} options.allownetworking 设置swf文件中允许使用的网络API。允许值:all/internal/none + * @param {boolean} options.allowfullscreen 是否允许flash全屏。允许值:true/false + * @param {boolean} options.seamlesstabbing 允许设置执行无缝跳格,从而使用户能跳出flash应用程序。该参数只能在安装Flash7及更高版本的Windows中使用。允许值:true/false + * @param {boolean} options.devicefont 设置静态文本对象是否以设备字体呈现。允许值:true/false + * @param {boolean} options.swliveconnect 第一次加载flash时浏览器是否应启动Java。允许值:true/false + * @param {Object} options.vars 要传递给flash的参数,支持JSON或string类型。 + * + * @param {HTMLElement|string} [container] flash对象的父容器元素,不传递该参数时在当前代码位置创建flash对象。 + * @meta standard + * @see baidu.swf.createHTML,baidu.swf.getMovie + */ +baidu.swf.create = function (options, target) { + options = options || {}; + var html = baidu.swf.createHTML(options) + || options['errorMessage'] + || ''; + + if (target && 'string' == typeof target) { + target = document.getElementById(target); + } + baidu.dom.insertHTML( target || document.body ,'beforeEnd',html ); +}; +/** + * 判断是否为ie浏览器 + * @name baidu.browser.ie + * @field + * @grammar baidu.browser.ie + * @returns {Number} IE版本号 + */ +baidu.browser.ie = baidu.ie = /msie (\d+\.\d+)/i.test(navigator.userAgent) ? (document.documentMode || + RegExp['\x241']) : undefined; + +/** + * 移除数组中的项 + * @name baidu.array.remove + * @function + * @grammar baidu.array.remove(source, match) + * @param {Array} source 需要移除项的数组 + * @param {Any} match 要移除的项 + * @meta standard + * @see baidu.array.removeAt + * + * @returns {Array} 移除后的数组 + */ +baidu.array.remove = function (source, match) { + var len = source.length; + + while (len--) { + if (len in source && source[len] === match) { + source.splice(len, 1); + } + } + return source; +}; + +/** + * 判断目标参数是否Array对象 + * @name baidu.lang.isArray + * @function + * @grammar baidu.lang.isArray(source) + * @param {Any} source 目标参数 + * @meta standard + * @see baidu.lang.isString,baidu.lang.isObject,baidu.lang.isNumber,baidu.lang.isElement,baidu.lang.isBoolean,baidu.lang.isDate + * + * @returns {boolean} 类型判断结果 + */ +baidu.lang.isArray = function (source) { + return '[object Array]' == Object.prototype.toString.call(source); +}; + + + +/** + * 将一个变量转换成array + * @name baidu.lang.toArray + * @function + * @grammar baidu.lang.toArray(source) + * @param {mix} source 需要转换成array的变量 + * @version 1.3 + * @meta standard + * @returns {array} 转换后的array + */ +baidu.lang.toArray = function (source) { + if (source === null || source === undefined) + return []; + if (baidu.lang.isArray(source)) + return source; + if (typeof source.length !== 'number' || typeof source === 'string' || baidu.lang.isFunction(source)) { + return [source]; + } + if (source.item) { + var l = source.length, array = new Array(l); + while (l--) + array[l] = source[l]; + return array; + } + + return [].slice.call(source); +}; + +/** + * 获得flash对象的实例 + * @name baidu.swf.getMovie + * @function + * @grammar baidu.swf.getMovie(name) + * @param {string} name flash对象的名称 + * @see baidu.swf.create + * @meta standard + * @returns {HTMLElement} flash对象的实例 + */ +baidu.swf.getMovie = function (name) { + var movie = document[name], ret; + return baidu.browser.ie == 9 ? + movie && movie.length ? + (ret = baidu.array.remove(baidu.lang.toArray(movie),function(item){ + return item.tagName.toLowerCase() != "embed"; + })).length == 1 ? ret[0] : ret + : movie + : movie || window[name]; +}; + + +baidu.flash._Base = (function(){ + + var prefix = 'bd__flash__'; + + /** + * 创建一个随机的字符串 + * @private + * @return {String} + */ + function _createString(){ + return prefix + Math.floor(Math.random() * 2147483648).toString(36); + }; + + /** + * 检查flash状态 + * @private + * @param {Object} target flash对象 + * @return {Boolean} + */ + function _checkReady(target){ + if(typeof target !== 'undefined' && typeof target.flashInit !== 'undefined' && target.flashInit()){ + return true; + }else{ + return false; + } + }; + + /** + * 调用之前进行压栈的函数 + * @private + * @param {Array} callQueue 调用队列 + * @param {Object} target flash对象 + * @return {Null} + */ + function _callFn(callQueue, target){ + var result = null; + + callQueue = callQueue.reverse(); + baidu.each(callQueue, function(item){ + result = target.call(item.fnName, item.params); + item.callBack(result); + }); + }; + + /** + * 为传入的匿名函数创建函数名 + * @private + * @param {String|Function} fun 传入的匿名函数或者函数名 + * @return {String} + */ + function _createFunName(fun){ + var name = ''; + + if(baidu.lang.isFunction(fun)){ + name = _createString(); + window[name] = function(){ + fun.apply(window, arguments); + }; + + return name; + }else if(baidu.lang.isString){ + return fun; + } + }; + + /** + * 绘制flash + * @private + * @param {Object} options 创建参数 + * @return {Object} + */ + function _render(options){ + if(!options.id){ + options.id = _createString(); + } + + var container = options.container || ''; + delete(options.container); + + baidu.swf.create(options, container); + + return baidu.swf.getMovie(options.id); + }; + + return function(options, callBack){ + var me = this, + autoRender = (typeof options.autoRender !== 'undefined' ? options.autoRender : true), + createOptions = options.createOptions || {}, + target = null, + isReady = false, + callQueue = [], + timeHandle = null, + callBack = callBack || []; + + /** + * 将flash文件绘制到页面上 + * @public + * @return {Null} + */ + me.render = function(){ + target = _render(createOptions); + + if(callBack.length > 0){ + baidu.each(callBack, function(funName, index){ + callBack[index] = _createFunName(options[funName] || new Function()); + }); + } + me.call('setJSFuncName', [callBack]); + }; + + /** + * 返回flash状态 + * @return {Boolean} + */ + me.isReady = function(){ + return isReady; + }; + + /** + * 调用flash接口的统一入口 + * @param {String} fnName 调用的函数名 + * @param {Array} params 传入的参数组成的数组,若不许要参数,需传入空数组 + * @param {Function} [callBack] 异步调用后将返回值作为参数的调用回调函数,如无返回值,可以不传入此参数 + * @return {Null} + */ + me.call = function(fnName, params, callBack){ + if(!fnName) return null; + callBack = callBack || new Function(); + + var result = null; + + if(isReady){ + result = target.call(fnName, params); + callBack(result); + }else{ + callQueue.push({ + fnName: fnName, + params: params, + callBack: callBack + }); + + (!timeHandle) && (timeHandle = setInterval(_check, 200)); + } + }; + + /** + * 为传入的匿名函数创建函数名 + * @public + * @param {String|Function} fun 传入的匿名函数或者函数名 + * @return {String} + */ + me.createFunName = function(fun){ + return _createFunName(fun); + }; + + /** + * 检查flash是否ready, 并进行调用 + * @private + * @return {Null} + */ + function _check(){ + if(_checkReady(target)){ + clearInterval(timeHandle); + timeHandle = null; + _call(); + + isReady = true; + } + }; + + /** + * 调用之前进行压栈的函数 + * @private + * @return {Null} + */ + function _call(){ + _callFn(callQueue, target); + callQueue = []; + } + + autoRender && me.render(); + }; +})(); + + + +/** + * 创建flash based imageUploader + * @class + * @grammar baidu.flash.imageUploader(options) + * @param {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 + * @config {Object} vars 创建imageUploader时所需要的参数 + * @config {Number} vars.gridWidth 每一个预览图片所占的宽度,应该为flash寛的整除 + * @config {Number} vars.gridHeight 每一个预览图片所占的高度,应该为flash高的整除 + * @config {Number} vars.picWidth 单张预览图片的宽度 + * @config {Number} vars.picHeight 单张预览图片的高度 + * @config {String} vars.uploadDataFieldName POST请求中图片数据的key,默认值'picdata' + * @config {String} vars.picDescFieldName POST请求中图片描述的key,默认值'picDesc' + * @config {Number} vars.maxSize 文件的最大体积,单位'MB' + * @config {Number} vars.compressSize 上传前如果图片体积超过该值,会先压缩 + * @config {Number} vars.maxNum:32 最大上传多少个文件 + * @config {Number} vars.compressLength 能接受的最大边长,超过该值会等比压缩 + * @config {String} vars.url 上传的url地址 + * @config {Number} vars.mode mode == 0时,是使用滚动条,mode == 1时,拉伸flash, 默认值为0 + * @see baidu.swf.createHTML + * @param {String} backgroundUrl 背景图片路径 + * @param {String} listBacgroundkUrl 布局控件背景 + * @param {String} buttonUrl 按钮图片不背景 + * @param {String|Function} selectFileCallback 选择文件的回调 + * @param {String|Function} exceedFileCallback文件超出限制的最大体积时的回调 + * @param {String|Function} deleteFileCallback 删除文件的回调 + * @param {String|Function} startUploadCallback 开始上传某个文件时的回调 + * @param {String|Function} uploadCompleteCallback 某个文件上传完成的回调 + * @param {String|Function} uploadErrorCallback 某个文件上传失败的回调 + * @param {String|Function} allCompleteCallback 全部上传完成时的回调 + * @param {String|Function} changeFlashHeight 改变Flash的高度,mode==1的时候才有用 + */ +baidu.flash.imageUploader = baidu.flash.imageUploader || function(options){ + + var me = this, + options = options || {}, + _flash = new baidu.flash._Base(options, [ + 'selectFileCallback', + 'exceedFileCallback', + 'deleteFileCallback', + 'startUploadCallback', + 'uploadCompleteCallback', + 'uploadErrorCallback', + 'allCompleteCallback', + 'changeFlashHeight' + ]); + /** + * 开始或回复上传图片 + * @public + * @return {Null} + */ + me.upload = function(){ + _flash.call('upload'); + }; + + /** + * 暂停上传图片 + * @public + * @return {Null} + */ + me.pause = function(){ + _flash.call('pause'); + }; + me.addCustomizedParams = function(index,obj){ + _flash.call('addCustomizedParams',[index,obj]); + } +}; + +/** + * 操作原生对象的方法 + * @namespace baidu.object + */ +baidu.object = baidu.object || {}; + + +/** + * 将源对象的所有属性拷贝到目标对象中 + * @author erik + * @name baidu.object.extend + * @function + * @grammar baidu.object.extend(target, source) + * @param {Object} target 目标对象 + * @param {Object} source 源对象 + * @see baidu.array.merge + * @remark + * +1.目标对象中,与源对象key相同的成员将会被覆盖。
            +2.源对象的prototype成员不会拷贝。 + + * @shortcut extend + * @meta standard + * + * @returns {Object} 目标对象 + */ +baidu.extend = +baidu.object.extend = function (target, source) { + for (var p in source) { + if (source.hasOwnProperty(p)) { + target[p] = source[p]; + } + } + + return target; +}; + + + + + +/** + * 创建flash based fileUploader + * @class + * @grammar baidu.flash.fileUploader(options) + * @param {Object} options + * @config {Object} createOptions 创建flash时需要的参数,请参照baidu.swf.create文档 + * @config {String} createOptions.width + * @config {String} createOptions.height + * @config {Number} maxNum 最大可选文件数 + * @config {Function|String} selectFile + * @config {Function|String} exceedMaxSize + * @config {Function|String} deleteFile + * @config {Function|String} uploadStart + * @config {Function|String} uploadComplete + * @config {Function|String} uploadError + * @config {Function|String} uploadProgress + */ +baidu.flash.fileUploader = baidu.flash.fileUploader || function(options){ + var me = this, + options = options || {}; + + options.createOptions = baidu.extend({ + wmod: 'transparent' + },options.createOptions || {}); + + var _flash = new baidu.flash._Base(options, [ + 'selectFile', + 'exceedMaxSize', + 'deleteFile', + 'uploadStart', + 'uploadComplete', + 'uploadError', + 'uploadProgress' + ]); + + _flash.call('setMaxNum', options.maxNum ? [options.maxNum] : [1]); + + /** + * 设置当鼠标移动到flash上时,是否变成手型 + * @public + * @param {Boolean} isCursor + * @return {Null} + */ + me.setHandCursor = function(isCursor){ + _flash.call('setHandCursor', [isCursor || false]); + }; + + /** + * 设置鼠标相应函数名 + * @param {String|Function} fun + */ + me.setMSFunName = function(fun){ + _flash.call('setMSFunName',[_flash.createFunName(fun)]); + }; + + /** + * 执行上传操作 + * @param {String} url 上传的url + * @param {String} fieldName 上传的表单字段名 + * @param {Object} postData 键值对,上传的POST数据 + * @param {Number|Array|null|-1} [index]上传的文件序列 + * Int值上传该文件 + * Array一次串行上传该序列文件 + * -1/null上传所有文件 + * @return {Null} + */ + me.upload = function(url, fieldName, postData, index){ + + if(typeof url !== 'string' || typeof fieldName !== 'string') return null; + if(typeof index === 'undefined') index = -1; + + _flash.call('upload', [url, fieldName, postData, index]); + }; + + /** + * 取消上传操作 + * @public + * @param {Number|-1} index + */ + me.cancel = function(index){ + if(typeof index === 'undefined') index = -1; + _flash.call('cancel', [index]); + }; + + /** + * 删除文件 + * @public + * @param {Number|Array} [index] 要删除的index,不传则全部删除 + * @param {Function} callBack + * */ + me.deleteFile = function(index, callBack){ + + var callBackAll = function(list){ + callBack && callBack(list); + }; + + if(typeof index === 'undefined'){ + _flash.call('deleteFilesAll', [], callBackAll); + return; + }; + + if(typeof index === 'Number') index = [index]; + index.sort(function(a,b){ + return b-a; + }); + baidu.each(index, function(item){ + _flash.call('deleteFileBy', item, callBackAll); + }); + }; + + /** + * 添加文件类型,支持macType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.addFileType = function(type){ + var type = type || [[]]; + + if(type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('addFileTypes', type); + }; + + /** + * 设置文件类型,支持macType + * @public + * @param {Object|Array[Object]} type {description:String, extention:String} + * @return {Null}; + */ + me.setFileType = function(type){ + var type = type || [[]]; + + if(type instanceof Array) type = [type]; + else type = [[type]]; + _flash.call('setFileTypes', type); + }; + + /** + * 设置可选文件的数量限制 + * @public + * @param {Number} num + * @return {Null} + */ + me.setMaxNum = function(num){ + _flash.call('setMaxNum', [num]); + }; + + /** + * 设置可选文件大小限制,以兆M为单位 + * @public + * @param {Number} num,0为无限制 + * @return {Null} + */ + me.setMaxSize = function(num){ + _flash.call('setMaxSize', [num]); + }; + + /** + * @public + */ + me.getFileAll = function(callBack){ + _flash.call('getFileAll', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {Function} [callBack] + */ + me.getFileByIndex = function(index, callBack){ + _flash.call('getFileByIndex', [], callBack); + }; + + /** + * @public + * @param {Number} index + * @param {function} [callBack] + */ + me.getStatusByIndex = function(index, callBack){ + _flash.call('getStatusByIndex', [], callBack); + }; +}; + +/** + * 使用动态script标签请求服务器资源,包括由服务器端的回调和浏览器端的回调 + * @namespace baidu.sio + */ +baidu.sio = baidu.sio || {}; + +/** + * + * @param {HTMLElement} src script节点 + * @param {String} url script节点的地址 + * @param {String} [charset] 编码 + */ +baidu.sio._createScriptTag = function(scr, url, charset){ + scr.setAttribute('type', 'text/javascript'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); +}; + +/** + * 删除script的属性,再删除script标签,以解决修复内存泄漏的问题 + * + * @param {HTMLElement} src script节点 + */ +baidu.sio._removeScriptTag = function(scr){ + if (scr.clearAttributes) { + scr.clearAttributes(); + } else { + for (var attr in scr) { + if (scr.hasOwnProperty(attr)) { + delete scr[attr]; + } + } + } + if(scr && scr.parentNode){ + scr.parentNode.removeChild(scr); + } + scr = null; +}; + + +/** + * 通过script标签加载数据,加载完成由浏览器端触发回调 + * @name baidu.sio.callByBrowser + * @function + * @grammar baidu.sio.callByBrowser(url, opt_callback, opt_options) + * @param {string} url 加载数据的url + * @param {Function|string} opt_callback 数据加载结束时调用的函数或函数名 + * @param {Object} opt_options 其他可选项 + * @config {String} [charset] script的字符集 + * @config {Integer} [timeOut] 超时时间,超过这个时间将不再响应本请求,并触发onfailure函数 + * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 + * @remark + * 1、与callByServer不同,callback参数只支持Function类型,不支持string。 + * 2、如果请求了一个不存在的页面,callback函数在IE/opera下也会被调用,因此使用者需要在onsuccess函数中判断数据是否正确加载。 + * @meta standard + * @see baidu.sio.callByServer + */ +baidu.sio.callByBrowser = function (url, opt_callback, opt_options) { + var scr = document.createElement("SCRIPT"), + scriptLoaded = 0, + options = opt_options || {}, + charset = options['charset'], + callback = opt_callback || function(){}, + timeOut = options['timeOut'] || 0, + timer; + scr.onload = scr.onreadystatechange = function () { + if (scriptLoaded) { + return; + } + + var readyState = scr.readyState; + if ('undefined' == typeof readyState + || readyState == "loaded" + || readyState == "complete") { + scriptLoaded = 1; + try { + callback(); + clearTimeout(timer); + } finally { + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + } + } + }; + + if( timeOut ){ + timer = setTimeout(function(){ + scr.onload = scr.onreadystatechange = null; + baidu.sio._removeScriptTag(scr); + options.onfailure && options.onfailure(); + }, timeOut); + } + + baidu.sio._createScriptTag(scr, url, charset); +}; + +/** + * 通过script标签加载数据,加载完成由服务器端触发回调 + * @name baidu.sio.callByServer + * @function + * @grammar baidu.sio.callByServer(url, callback[, opt_options]) + * @param {string} url 加载数据的url. + * @param {Function|string} callback 服务器端调用的函数或函数名。如果没有指定本参数,将在URL中寻找options['queryField']做为callback的方法名. + * @param {Object} opt_options 加载数据时的选项. + * @config {string} [charset] script的字符集 + * @config {string} [queryField] 服务器端callback请求字段名,默认为callback + * @config {Integer} [timeOut] 超时时间(单位:ms),超过这个时间将不再响应本请求,并触发onfailure函数 + * @config {Function} [onfailure] timeOut设定后才生效,到达超时时间时触发本函数 + * @remark + * 如果url中已经包含key为“options['queryField']”的query项,将会被替换成callback中参数传递或自动生成的函数名。 + * @meta standard + * @see baidu.sio.callByBrowser + */ +baidu.sio.callByServer = /**@function*/function(url, callback, opt_options) { + var scr = document.createElement('SCRIPT'), + prefix = 'bd__cbs__', + callbackName, + callbackImpl, + options = opt_options || {}, + charset = options['charset'], + queryField = options['queryField'] || 'callback', + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + queryField + '=([^&]*)'), + matches; + + if (baidu.lang.isFunction(callback)) { + callbackName = prefix + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackName] = getCallBack(0); + } else if(baidu.lang.isString(callback)){ + callbackName = callback; + } else { + if (matches = reg.exec(url)) { + callbackName = matches[2]; + } + } + + if( timeOut ){ + timer = setTimeout(getCallBack(1), timeOut); + } + url = url.replace(reg, '\x241' + queryField + '=' + callbackName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + queryField + '=' + callbackName; + } + baidu.sio._createScriptTag(scr, url, charset); + + /* + * 返回一个函数,用于立即(挂在window上)或者超时(挂在setTimeout中)时执行 + */ + function getCallBack(onTimeOut){ + /*global callbackName, callback, scr, options;*/ + return function(){ + try { + if( onTimeOut ){ + options.onfailure && options.onfailure(); + }else{ + callback.apply(window, arguments); + clearTimeout(timer); + } + window[callbackName] = null; + delete window[callbackName]; + } catch (exception) { + } finally { + baidu.sio._removeScriptTag(scr); + } + } + } +}; + +/** + * 通过请求一个图片的方式令服务器存储一条日志 + * @function + * @grammar baidu.sio.log(url) + * @param {string} url 要发送的地址. + * @author: int08h,leeight + */ +baidu.sio.log = function(url) { + var img = new Image(), + key = 'tangram_sio_log_' + Math.floor(Math.random() * + 2147483648).toString(36); + window[key] = img; + + img.onload = img.onerror = img.onabort = function() { + img.onload = img.onerror = img.onabort = null; + + window[key] = null; + img = null; + }; + img.src = url; +}; + + + +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json.js + * author: erik + * version: 1.1.0 + * date: 2009/12/02 + */ + + +/** + * 操作json对象的方法 + * @namespace baidu.json + */ +baidu.json = baidu.json || {}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/parse.js + * author: erik, berg + * version: 1.2 + * date: 2009/11/23 + */ + + + +/** + * 将字符串解析成json对象。注:不会自动祛除空格 + * @name baidu.json.parse + * @function + * @grammar baidu.json.parse(data) + * @param {string} source 需要解析的字符串 + * @remark + * 该方法的实现与ecma-262第五版中规定的JSON.parse不同,暂时只支持传入一个参数。后续会进行功能丰富。 + * @meta standard + * @see baidu.json.stringify,baidu.json.decode + * + * @returns {JSON} 解析结果json对象 + */ +baidu.json.parse = function (data) { + //2010/12/09:更新至不使用原生parse,不检测用户输入是否正确 + return (new Function("return (" + data + ")"))(); +}; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/decode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + + +/** + * 将字符串解析成json对象,为过时接口,今后会被baidu.json.parse代替 + * @name baidu.json.decode + * @function + * @grammar baidu.json.decode(source) + * @param {string} source 需要解析的字符串 + * @meta out + * @see baidu.json.encode,baidu.json.parse + * + * @returns {JSON} 解析结果json对象 + */ +baidu.json.decode = baidu.json.parse; +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/stringify.js + * author: erik + * version: 1.1.0 + * date: 2010/01/11 + */ + + + +/** + * 将json对象序列化 + * @name baidu.json.stringify + * @function + * @grammar baidu.json.stringify(value) + * @param {JSON} value 需要序列化的json对象 + * @remark + * 该方法的实现与ecma-262第五版中规定的JSON.stringify不同,暂时只支持传入一个参数。后续会进行功能丰富。 + * @meta standard + * @see baidu.json.parse,baidu.json.encode + * + * @returns {string} 序列化后的字符串 + */ +baidu.json.stringify = (function () { + /** + * 字符串处理时需要转义的字符表 + * @private + */ + var escapeMap = { + "\b": '\\b', + "\t": '\\t', + "\n": '\\n', + "\f": '\\f', + "\r": '\\r', + '"' : '\\"', + "\\": '\\\\' + }; + + /** + * 字符串序列化 + * @private + */ + function encodeString(source) { + if (/["\\\x00-\x1f]/.test(source)) { + source = source.replace( + /["\\\x00-\x1f]/g, + function (match) { + var c = escapeMap[match]; + if (c) { + return c; + } + c = match.charCodeAt(); + return "\\u00" + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }); + } + return '"' + source + '"'; + } + + /** + * 数组序列化 + * @private + */ + function encodeArray(source) { + var result = ["["], + l = source.length, + preComma, i, item; + + for (i = 0; i < l; i++) { + item = source[i]; + + switch (typeof item) { + case "undefined": + case "function": + case "unknown": + break; + default: + if(preComma) { + result.push(','); + } + result.push(baidu.json.stringify(item)); + preComma = 1; + } + } + result.push("]"); + return result.join(""); + } + + /** + * 处理日期序列化时的补零 + * @private + */ + function pad(source) { + return source < 10 ? '0' + source : source; + } + + /** + * 日期序列化 + * @private + */ + function encodeDate(source){ + return '"' + source.getFullYear() + "-" + + pad(source.getMonth() + 1) + "-" + + pad(source.getDate()) + "T" + + pad(source.getHours()) + ":" + + pad(source.getMinutes()) + ":" + + pad(source.getSeconds()) + '"'; + } + + return function (value) { + switch (typeof value) { + case 'undefined': + return 'undefined'; + + case 'number': + return isFinite(value) ? String(value) : "null"; + + case 'string': + return encodeString(value); + + case 'boolean': + return String(value); + + default: + if (value === null) { + return 'null'; + } else if (value instanceof Array) { + return encodeArray(value); + } else if (value instanceof Date) { + return encodeDate(value); + } else { + var result = ['{'], + encode = baidu.json.stringify, + preComma, + item; + + for (var key in value) { + if (Object.prototype.hasOwnProperty.call(value, key)) { + item = value[key]; + switch (typeof item) { + case 'undefined': + case 'unknown': + case 'function': + break; + default: + if (preComma) { + result.push(','); + } + preComma = 1; + result.push(encode(key) + ':' + encode(item)); + } + } + } + result.push('}'); + return result.join(''); + } + } + }; +})(); +/* + * Tangram + * Copyright 2009 Baidu Inc. All rights reserved. + * + * path: baidu/json/encode.js + * author: erik, cat + * version: 1.3.4 + * date: 2010/12/23 + */ + + + +/** + * 将json对象序列化,为过时接口,今后会被baidu.json.stringify代替 + * @name baidu.json.encode + * @function + * @grammar baidu.json.encode(value) + * @param {JSON} value 需要序列化的json对象 + * @meta out + * @see baidu.json.decode,baidu.json.stringify + * + * @returns {string} 序列化后的字符串 + */ +baidu.json.encode = baidu.json.stringify; diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/wordimage.html b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/wordimage.html new file mode 100644 index 0000000..6cf6067 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/wordimage.html @@ -0,0 +1,111 @@ + + + + + + + + + +
            +
            + +
            +
            +
            +
            +
            + +
            + : +
            +
            +
            + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/wordimage.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/wordimage.js new file mode 100644 index 0000000..98f3a22 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/dialogs/wordimage/wordimage.js @@ -0,0 +1,157 @@ +/** + * Created by JetBrains PhpStorm. + * User: taoqili + * Date: 12-1-30 + * Time: 下午12:50 + * To change this template use File | Settings | File Templates. + */ + + + +var wordImage = {}; +//(function(){ +var g = baidu.g, + flashObj,flashContainer; + +wordImage.init = function(opt, callbacks) { + showLocalPath("localPath"); + //createCopyButton("clipboard","localPath"); + createFlashUploader(opt, callbacks); + addUploadListener(); + addOkListener(); +}; + +function hideFlash(){ + flashObj = null; + flashContainer.innerHTML = ""; +} +function addOkListener() { + dialog.onok = function() { + if (!imageUrls.length) return; + var urlPrefix = editor.getOpt('imageUrlPrefix'), + images = domUtils.getElementsByTagName(editor.document,"img"); + editor.fireEvent('saveScene'); + for (var i = 0,img; img = images[i++];) { + var src = img.getAttribute("word_img"); + if (!src) continue; + for (var j = 0,url; url = imageUrls[j++];) { + if (src.indexOf(url.original.replace(" ","")) != -1) { + img.src = urlPrefix + url.url; + img.setAttribute("_src", urlPrefix + url.url); //同时修改"_src"属性 + img.setAttribute("title",url.title); + domUtils.removeAttributes(img, ["word_img","style","width","height"]); + editor.fireEvent("selectionchange"); + break; + } + } + } + editor.fireEvent('saveScene'); + hideFlash(); + }; + dialog.oncancel = function(){ + hideFlash(); + } +} + +/** + * 绑定开始上传事件 + */ +function addUploadListener() { + g("upload").onclick = function () { + flashObj.upload(); + this.style.display = "none"; + }; +} + +function showLocalPath(id) { + //单张编辑 + var img = editor.selection.getRange().getClosedNode(); + var images = editor.execCommand('wordimage'); + if(images.length==1 || img && img.tagName == 'IMG'){ + g(id).value = images[0]; + return; + } + var path = images[0]; + var leftSlashIndex = path.lastIndexOf("/")||0, //不同版本的doc和浏览器都可能影响到这个符号,故直接判断两种 + rightSlashIndex = path.lastIndexOf("\\")||0, + separater = leftSlashIndex > rightSlashIndex ? "/":"\\" ; + + path = path.substring(0, path.lastIndexOf(separater)+1); + g(id).value = path; +} + +function createFlashUploader(opt, callbacks) { + //由于lang.flashI18n是静态属性,不可以直接进行修改,否则会影响到后续内容 + var i18n = utils.extend({},lang.flashI18n); + //处理图片资源地址的编码,补全等问题 + for(var i in i18n){ + if(!(i in {"lang":1,"uploadingTF":1,"imageTF":1,"textEncoding":1}) && i18n[i]){ + i18n[i] = encodeURIComponent(editor.options.langPath + editor.options.lang + "/images/" + i18n[i]); + } + } + opt = utils.extend(opt,i18n,false); + var option = { + createOptions:{ + id:'flash', + url:opt.flashUrl, + width:opt.width, + height:opt.height, + errorMessage:lang.flashError, + wmode:browser.safari ? 'transparent' : 'window', + ver:'10.0.0', + vars:opt, + container:opt.container + } + }; + + option = extendProperty(callbacks, option); + flashObj = new baidu.flash.imageUploader(option); + flashContainer = $G(opt.container); +} + +function extendProperty(fromObj, toObj) { + for (var i in fromObj) { + if (!toObj[i]) { + toObj[i] = fromObj[i]; + } + } + return toObj; +} + +//})(); + +function getPasteData(id) { + baidu.g("msg").innerHTML = lang.copySuccess + "
            "; + setTimeout(function() { + baidu.g("msg").innerHTML = ""; + }, 5000); + return baidu.g(id).value; +} + +function createCopyButton(id, dataFrom) { + baidu.swf.create({ + id:"copyFlash", + url:"fClipboard_ueditor.swf", + width:"58", + height:"25", + errorMessage:"", + bgColor:"#CBCBCB", + wmode:"transparent", + ver:"10.0.0", + vars:{ + tid:dataFrom + } + }, id + ); + + var clipboard = baidu.swf.getMovie("copyFlash"); + var clipinterval = setInterval(function() { + if (clipboard && clipboard.flashInit) { + clearInterval(clipinterval); + clipboard.setHandCursor(true); + clipboard.setContentFuncName("getPasteData"); + //clipboard.setMEFuncName("mouseEventHandler"); + } + }, 500); +} +createCopyButton("clipboard", "localPath"); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/config.json b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/config.json new file mode 100644 index 0000000..53b6c97 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/config.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "", /* 图片访问路径前缀 */ + "imagePathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "/ueditor/jsp/upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "/ueditor/jsp/upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "/ueditor/jsp/upload/image/", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "/ueditor/jsp/upload/file/", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/controller.jsp b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/controller.jsp new file mode 100644 index 0000000..6a3ef2f --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/controller.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + import="com.baidu.ueditor.ActionEnter" + pageEncoding="UTF-8"%> +<%@ page trimDirectiveWhitespaces="true" %> +<% + + request.setCharacterEncoding( "utf-8" ); + response.setHeader("Content-Type" , "text/html"); + + String rootPath = application.getRealPath( "/" ); + + out.write( new ActionEnter( request, rootPath ).exec() ); + +%> \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-codec-1.9.jar b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-codec-1.9.jar new file mode 100644 index 0000000..ef35f1c Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-codec-1.9.jar differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-fileupload-1.3.1.jar b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-fileupload-1.3.1.jar new file mode 100644 index 0000000..af0cda2 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-fileupload-1.3.1.jar differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-io-2.4.jar b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-io-2.4.jar new file mode 100644 index 0000000..90035a4 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/commons-io-2.4.jar differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/json.jar b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/json.jar new file mode 100644 index 0000000..ed0bc93 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/json.jar differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/ueditor-1.1.1.jar b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/ueditor-1.1.1.jar new file mode 100644 index 0000000..8bed6b7 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/ueditor-1.1.1.jar differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/ueditor-1.1.2.jar b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/ueditor-1.1.2.jar new file mode 100644 index 0000000..4819fe0 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/jsp/lib/ueditor-1.1.2.jar differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/en.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/en.js new file mode 100644 index 0000000..c7e22f5 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/en.js @@ -0,0 +1,684 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-6-12 + * Time: 下午6:57 + * To change this template use File | Settings | File Templates. + */ +UE.I18N['en'] = { + 'labelMap':{ + 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', + 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border', + 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote', + 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview', + 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date', + 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown', + 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code', + 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle', + 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable", + 'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph','simpleupload':'Single Image','insertimage':'Multi Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link', + 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap', + 'insertvideo':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter', + 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL', + 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight', + 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default', + 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage', + 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', + 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', + 'music':'Music', 'charts': 'charts','drafts': 'Load from Drafts' + }, + 'insertorderedlist':{ + 'num':'1,2,3...', + 'num1':'1),2),3)...', + 'num2':'(1),(2),(3)...', + 'cn':'一,二,三....', + 'cn1':'一),二),三)....', + 'cn2':'(一),(二),(三)....', + 'decimal':'1,2,3...', + 'lower-alpha':'a,b,c...', + 'lower-roman':'i,ii,iii...', + 'upper-alpha':'A,B,C...', + 'upper-roman':'I,II,III...' + }, + 'insertunorderedlist':{ + 'circle':'○ Circle', + 'disc':'● Circle dot', + 'square':'■ Rectangle ', + 'dash' :'- Dash', + 'dot' : '。dot' + }, + 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'}, + 'fontfamily':{ + 'songti':'Sim Sun', + 'kaiti':'Sim Kai', + 'heiti':'Sim Hei', + 'lishu':'Sim Li', + 'yahei': 'Microsoft YaHei', + 'andaleMono':'Andale Mono', + 'arial': 'Arial', + 'arialBlack':'Arial Black', + 'comicSansMs':'Comic Sans MS', + 'impact':'Impact', + 'timesNewRoman':'Times New Roman' + }, + 'customstyle':{ + 'tc':'Title center', + 'tl':'Title left', + 'im':'Important', + 'hi':'Highlight' + }, + 'autoupload': { + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format Error', + 'loading':"loading...", + 'loadError':"load error", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'simpleupload':{ + 'exceedSizeError': 'File Size Exceed', + 'exceedTypeError': 'File Type Not Allow', + 'jsonEncodeError': 'Server Return Format Error', + 'loading':"loading...", + 'loadError':"load error", + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + }, + 'elementPathTip':"Path", + 'wordCountTip':"Word Count", + 'wordCountMsg':'{#count} characters entered,{#leave} left. ', + 'wordOverFlowMsg':'The number of characters has exceeded allowable maximum values, the server may refuse to save!', + 'ok':"OK", + 'cancel':"Cancel", + 'closeDialog':"closeDialog", + 'tableDrag':"You must import the file uiUtils.js before drag! ", + 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!", + 'loadconfigError': 'Get server config error.', + 'loadconfigFormatError': 'Server config format error.', + 'loadconfigHttpError': 'Get server config http error.', + 'snapScreen_plugin':{ + 'browserMsg':"Only IE supported!", + 'callBackErrorMsg':"The callback data is wrong,please check the config!", + 'uploadErrorMsg':"Upload error,please check your server environment! " + }, + 'insertcode':{ + 'as3':'ActionScript 3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'CSS', + 'cf':'ColdFusion', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'HTML', + 'java':'Java', + 'jfx':'JavaFX', + 'js':'JavaScript', + 'pl':'Perl', + 'php':'PHP', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'SQL', + 'vb':'Visual Basic', + 'xml':'XML' + }, + 'confirmClear':"Do you confirm to clear the Document?", + 'contextMenu':{ + 'delete':"Delete", + 'selectall':"Select all", + 'deletecode':"Delete Code", + 'cleardoc':"Clear Document", + 'confirmclear':"Do you confirm to clear the Document?", + 'unlink':"Unlink", + 'paragraph':"Paragraph", + 'edittable':"Table property", + 'aligncell':'Align cell', + 'aligntable':'Table alignment', + 'tableleft':'Left float', + 'tablecenter':'Center', + 'tableright':'Right float', + 'aligntd':'Cell alignment', + 'edittd':"Cell property", + 'setbordervisible':'set table edge visible', + 'table':"Table", + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justifyjustify':'Default', + 'deletetable':"Delete table", + 'insertparagraphbefore':"InsertedBeforeLine", + 'insertparagraphafter':'InsertedAfterLine', + 'inserttable':'Insert table', + 'insertcaption':'Insert caption', + 'deletecaption':'Delete Caption', + 'inserttitle':'Insert Title', + 'deletetitle':'Delete Title', + 'inserttitlecol':'Insert Title Col', + 'deletetitlecol':'Delete Title Col', + 'averageDiseRow':'AverageDise Row', + 'averageDisCol':'AverageDis Col', + 'deleterow':"Delete row", + 'deletecol':"Delete col", + 'insertrow':"Insert row", + 'insertcol':"Insert col", + 'insertrownext':'Insert Row Next', + 'insertcolnext':'Insert Col Next', + 'mergeright':"Merge right", + 'mergeleft':"Merge left", + 'mergedown':"Merge down", + 'mergecells':"Merge cells", + 'splittocells':"Split to cells", + 'splittocols':"Split to Cols", + 'splittorows':"Split to Rows", + 'tablesort':'Table sorting', + 'enablesort':'Sorting Enable', + 'disablesort':'Sorting Disable', + 'reversecurrent':'Reverse current', + 'orderbyasc':'Order By ASCII', + 'reversebyasc':'Reverse By ASCII', + 'orderbynum':'Order By Num', + 'reversebynum':'Reverse By Num', + 'borderbk':'Border shading', + 'setcolor':'interlaced color', + 'unsetcolor':'Cancel interlacedcolor', + 'setbackground':'Background interlaced', + 'unsetbackground':'Cancel Bk interlaced', + 'redandblue':'Blue and red', + 'threecolorgradient':'Three-color gradient', + 'copy':"Copy(Ctrl + c)", + 'copymsg':"Browser does not support. Please use 'Ctrl + c' instead!", + 'paste':"Paste(Ctrl + v)", + 'pastemsg':"Browser does not support. Please use 'Ctrl + v' instead!" + }, + 'copymsg': "Browser does not support. Please use 'Ctrl + c' instead!", + 'pastemsg': "Browser does not support. Please use 'Ctrl + v' instead!", + 'anthorMsg':"Link", + 'clearColor':'Clear', + 'standardColor':'Standard color', + 'themeColor':'Theme color', + 'property':'Property', + 'default':'Default', + 'modify':'Modify', + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justify':'Default', + 'clear':'Clear', + 'anchorMsg':'Anchor', + 'delete':'Delete', + 'clickToUpload':"Click to upload", + 'unset':'Language hasn\'t been set!', + 't_row':'row', + 't_col':'col', + 'pasteOpt':'Paste Option', + 'pasteSourceFormat':"Keep Source Formatting", + 'tagFormat':'Keep tag', + 'pasteTextFormat':'Keep Text only', + 'more':'More', + 'autoTypeSet':{ + 'mergeLine':"Merge empty line", + 'delLine':"Del empty line", + 'removeFormat':"Remove format", + 'indent':"Indent", + 'alignment':"Alignment", + 'imageFloat':"Image float", + 'removeFontsize':"Remove font size", + 'removeFontFamily':"Remove fontFamily", + 'removeHtml':"Remove redundant HTML code", + 'pasteFilter':"Paste filter", + 'run':"Done", + 'symbol':'Symbol Conversion', + 'bdc2sb':'Full-width to Half-width', + 'tobdc':'Half-width to Full-width' + }, + + 'background':{ + 'static':{ + 'lang_background_normal':'Normal', + 'lang_background_local':'Online', + 'lang_background_set':'Background Set', + 'lang_background_none':'No Background', + 'lang_background_colored':'Colored Background', + 'lang_background_color':'Color Set', + 'lang_background_netimg':'Net-Image', + 'lang_background_align':'Align Type', + 'lang_background_position':'Position', + 'repeatType':{'options':["Center", "Repeat-x", "Repeat-y", "Tile","Custom"]} + }, + 'noUploadImage':"No pictures has been uploaded!", + 'toggleSelect':'Change the active state by click!\n Image Size: ' + }, + //===============dialog i18N======================= + 'insertimage':{ + 'static':{ + 'lang_tab_remote':"Insert", + 'lang_tab_upload':"Local", + 'lang_tab_online':"Manager", + 'lang_tab_search':"Search", + 'lang_input_url':"Address:", + 'lang_input_size':"Size:", + 'lang_input_width':"Width", + 'lang_input_height':"Height", + 'lang_input_border':"Border:", + 'lang_input_vhspace':"Margins:", + 'lang_input_title':"Title:", + 'lang_input_align':'Image Float Style:', + 'lang_imgLoading':"Loading...", + 'lang_start_upload':"Start Upload", + 'lock':{'title':"Lock rate"}, + 'searchType':{'title':"ImageType", 'options':["News", "Wallpaper", "emotions", "photo"]}, + 'searchTxt':{'value':"Enter the search keyword!"}, + 'searchBtn':{'value':"Search"}, + 'searchReset':{'value':"Clear"}, + 'noneAlign':{'title':'None Float'}, + 'leftAlign':{'title':'Left Float'}, + 'rightAlign':{'title':'Right Float'}, + 'centerAlign':{'title':'Center In A Line'} + }, + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'uploadNoPreview':'Can Not Preview', + 'updateStatusReady': 'Selected _ pictures, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ pictures (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.', + 'remoteLockError':"Cannot Lock the Proportion between width and height", + 'numError':"Please enter the correct Num. e.g 123,400", + 'imageUrlError':"The image format may be wrong!", + 'imageLoadError':"Error,please check the network or URL!", + 'searchRemind':"Enter the search keyword!", + 'searchLoading':"Image is loading,please wait...", + 'searchRetry':" Sorry,can't find the image,please try again!" + }, + 'attachment':{ + 'static':{ + 'lang_tab_upload': 'Upload', + 'lang_tab_online': 'Online', + 'lang_start_upload':"Start upload", + 'lang_drop_remind':"You can drop files here, a single maximum of 300 files" + }, + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'updateStatusReady': 'Selected _ files, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.' + }, + + 'insertvideo':{ + 'static':{ + 'lang_tab_insertV':"Video", + 'lang_tab_searchV':"Search", + 'lang_tab_uploadV':"Upload", + 'lang_video_url':" URL ", + 'lang_video_size':"Video Size", + 'lang_videoW':"Width", + 'lang_videoH':"Height", + 'lang_alignment':"Alignment", + 'videoSearchTxt':{'value':"Enter the search keyword!"}, + 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, + 'videoSearchBtn':{'value':"Search in Baidu"}, + 'videoSearchReset':{'value':"Clear result"}, + + 'lang_input_fileStatus':' No file uploaded!', + 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, + + 'lang_upload_size':"Video Size", + 'lang_upload_width':"Width", + 'lang_upload_height':"Height", + 'lang_upload_alignment':"Alignment", + 'lang_format_advice':"Recommends mp4 format." + }, + 'numError':"Please enter the correct Num. e.g 123,400", + 'floatLeft':"Float left", + 'floatRight':"Float right", + 'default':"Default", + 'block':"Display in block", + 'urlError':"The video url format may be wrong!", + 'loading':"  The video is loading, please wait…", + 'clickToSelect':"Click to select", + 'goToSource':'Visit source video ', + 'noVideo':"    Sorry,can't find the video,please try again!", + + 'browseFiles':'Open files', + 'uploadSuccess':'Upload Successful!', + 'delSuccessFile':'Remove from the success of the queue', + 'delFailSaveFile':'Remove the save failed file', + 'statusPrompt':' file(s) uploaded! ', + 'flashVersionError':'The current Flash version is too low, please update FlashPlayer,then try again!', + 'flashLoadingError':'The Flash failed loading! Please check the path or network state', + 'fileUploadReady':'Wait for uploading...', + 'delUploadQueue':'Remove from the uploading queue ', + 'limitPrompt1':'Can not choose more than single', + 'limitPrompt2':'file(s)!Please choose again!', + 'delFailFile':'Remove failure file', + 'fileSizeLimit':'File size exceeds the limit!', + 'emptyFile':'Can not upload an empty file!', + 'fileTypeError':'File type error!', + 'unknownError':'Unknown error!', + 'fileUploading':'Uploading,please wait...', + 'cancelUpload':'Cancel upload', + 'netError':'Network error', + 'failUpload':'Upload failed', + 'serverIOError':'Server IO error!', + 'noAuthority':'No Permission!', + 'fileNumLimit':'Upload limit to the number', + 'failCheck':'Authentication fails, the upload is skipped!', + 'fileCanceling':'Cancel, please wait...', + 'stopUploading':'Upload has stopped...', + + 'uploadSelectFile':'Select File', + 'uploadAddFile':'Add File', + 'uploadStart':'Start Upload', + 'uploadPause':'Pause Upload', + 'uploadContinue':'Continue Upload', + 'uploadRetry':'Retry Upload', + 'uploadDelete':'Delete', + 'uploadTurnLeft':'Turn Left', + 'uploadTurnRight':'Turn Right', + 'uploadPreview':'Doing Preview', + 'updateStatusReady': 'Selected _ files, total _KB.', + 'updateStatusConfirm': '_ uploaded successfully and _ upload failed', + 'updateStatusFinish': 'Total _ files (_KB), _ uploaded successfully', + 'updateStatusError': ' and _ upload failed', + 'errorNotSupport': 'WebUploader does not support the browser you are using. Please upgrade your browser or flash player', + 'errorLoadConfig': 'Server config not loaded, upload can not work.', + 'errorExceedSize':'File Size Exceed', + 'errorFileType':'File Type Not Allow', + 'errorInterrupt':'File Upload Interrupted', + 'errorUploadRetry':'Upload Error, Please Retry.', + 'errorHttp':'Http Error', + 'errorServerUpload':'Server Result Error.' + }, + 'webapp':{ + 'tip1':"This function provided by Baidu APP,please apply for baidu APPKey webmaster first!", + 'tip2':"And then open the file ueditor.config.js to set it! ", + 'applyFor':"APPLY FOR", + 'anthorApi':"Baidu API" + }, + 'template':{ + 'static':{ + 'lang_template_bkcolor':'Background Color', + 'lang_template_clear' : 'Keep Content', + 'lang_template_select':'Select Template' + }, + 'blank':"Blank", + 'blog':"Blog", + 'resume':"Resume", + 'richText':"Rich Text", + 'scrPapers':"Scientific Papers" + }, + scrawl:{ + 'static':{ + 'lang_input_previousStep':"Previous", + 'lang_input_nextsStep':"Next", + 'lang_input_clear':'Clear', + 'lang_input_addPic':'AddImage', + 'lang_input_ScalePic':'ScaleImage', + 'lang_input_removePic':'RemoveImage', + 'J_imgTxt':{title:'Add background image'} + }, + 'noScarwl':"No paint, a white paper...", + 'scrawlUpLoading':"Image is uploading, please wait...", + 'continueBtn':"Try again", + 'imageError':"Image failed to load!", + 'backgroundUploading':'Image is uploading,please wait...' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"Input singer/song/album, search you interested in music!", + 'J_searchBtn':{value:'Search songs'} + }, + 'emptyTxt':'Not search to the relevant music results, please change a keyword try.', + 'chapter':'Songs', + 'singer':'Singer', + 'special':'Album', + 'listenTest':'Audition' + }, + anchor:{ + 'static':{ + 'lang_input_anchorName':'Anchor Name:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'Data source:', + 'lang_chart_format': 'Chart format:', + 'lang_data_align': 'Align', + 'lang_chart_align_same': 'Consistent with the X-axis Y-axis', + 'lang_chart_align_reverse': 'X-axis Y-axis opposite', + 'lang_chart_title': 'Title', + 'lang_chart_main_title': 'main title:', + 'lang_chart_sub_title': 'sub title:', + 'lang_chart_x_title': 'X-axis title:', + 'lang_chart_y_title': 'Y-axis title:', + 'lang_chart_tip': 'Prompt', + 'lang_cahrt_tip_prefix': 'prefix:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': 'Unit', + 'lang_chart_data_unit_title': 'unit:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': 'Chart type:', + 'lang_prev_btn': 'Previous', + 'lang_next_btn': 'Next' + } + }, + emotion:{ + 'static':{ + 'lang_input_choice':'Choice', + 'lang_input_Tuzki':'Tuzki', + 'lang_input_lvdouwa':'LvDouWa', + 'lang_input_BOBO':'BOBO', + 'lang_input_babyCat':'BabyCat', + 'lang_input_bubble':'Bubble', + 'lang_input_youa':'YouA' + } + }, + gmap:{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_search':'Search', + 'address':{value:"Beijing"} + }, + searchError:'Unable to locate the address!' + }, + help:{ + 'static':{ + 'lang_input_about':'About', + 'lang_input_shortcuts':'Shortcuts', + 'lang_input_introduction':"UEditor is developed by Baidu Co.ltd. It is lightweight, customizable , focusing on user experience and etc. , UEditor is based on open source BSD license , allowing free use and redistribution.", + 'lang_Txt_shortcuts':'Shortcuts', + 'lang_Txt_func':'Function', + 'lang_Txt_bold':'Bold', + 'lang_Txt_copy':'Copy', + 'lang_Txt_cut':'Cut', + 'lang_Txt_Paste':'Paste', + 'lang_Txt_undo':'Undo', + 'lang_Txt_redo':'Redo', + 'lang_Txt_italic':'Italic', + 'lang_Txt_underline':'Underline', + 'lang_Txt_selectAll':'Select All', + 'lang_Txt_visualEnter':'Submit', + 'lang_Txt_fullscreen':'Fullscreen' + } + }, + insertframe:{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_width':'Width:', + 'lang_input_height':'height:', + 'lang_input_isScroll':'Enable scrollbars:', + 'lang_input_frameborder':'Show frame border:', + 'lang_input_alignMode':'Alignment:', + 'align':{title:"Alignment", options:["Default", "Left", "Right", "Center"]} + }, + 'enterAddress':'Please enter an address!' + }, + link:{ + 'static':{ + 'lang_input_text':'Text:', + 'lang_input_url':'URL:', + 'lang_input_title':'Title:', + 'lang_input_target':'open in new window:' + }, + 'validLink':'Supports only effective when a link is selected', + 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' + }, + map:{ + 'static':{ + lang_city:"City", + lang_address:"Address", + city:{value:"Beijing"}, + lang_search:"Search", + lang_dynamicmap:"Dynamic map" + }, + cityMsg:"Please enter the city name!", + errorMsg:"Can't find the place!" + }, + searchreplace:{ + 'static':{ + lang_tab_search:"Search", + lang_tab_replace:"Replace", + lang_search1:"Search", + lang_search2:"Search", + lang_replace:"Replace", + lang_searchReg:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_searchReg1:'Support regular expression ,which starts and ends with a slash ,for example "/expression/"', + lang_case_sensitive1:"Case sense", + lang_case_sensitive2:"Case sense", + nextFindBtn:{value:"Next"}, + preFindBtn:{value:"Preview"}, + nextReplaceBtn:{value:"Next"}, + preReplaceBtn:{value:"Preview"}, + repalceBtn:{value:"Replace"}, + repalceAllBtn:{value:"Replace all"} + }, + getEnd:"Has the search to the bottom!", + getStart:"Has the search to the top!", + countMsg:"Altogether replaced {#count} character(s)!" + }, + snapscreen:{ + 'static':{ + lang_showMsg:"You should install the UEditor screenshots program first!", + lang_download:"Download!", + lang_step1:"Step1:Download the program and then run it", + lang_step2:"Step2:After complete install,try to click the button again" + } + }, + spechars:{ + 'static':{}, + tsfh:"Special", + lmsz:"Roman", + szfh:"Numeral", + rwfh:"Japanese", + xlzm:"The Greek", + ewzm:"Russian", + pyzm:"Phonetic", + yyyb:"English", + zyzf:"Others" + }, + 'edittable':{ + 'static':{ + 'lang_tableStyle':'Table style', + 'lang_insertCaption':'Add table header row', + 'lang_insertTitle':'Add table title row', + 'lang_insertTitleCol':'Add table title col', + 'lang_tableSize':'Automatically adjust table size', + 'lang_autoSizeContent':'Adaptive by form text', + 'lang_orderbycontent':"Table of contents sortable", + 'lang_autoSizePage':'Page width adaptive', + 'lang_example':'Example', + 'lang_borderStyle':'Table Border', + 'lang_color':'Color:' + }, + captionName:'Caption', + titleName:'Title', + cellsName:'text', + errorMsg:'There are merged cells, can not sort.' + }, + 'edittip':{ + 'static':{ + lang_delRow:'Delete entire row', + lang_delCol:'Delete entire col' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'Background Color:' + } + }, + 'formula':{ + 'static':{ + } + }, + wordimage:{ + 'static':{ + lang_resave:"The re-save step", + uploadBtn:{src:"upload.png", alt:"Upload"}, + clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, + lang_step:" 1. Click top button to copy the url and then open the dialog to paste it. 2. Open after choose photos uploaded process." + }, + fileType:"Image", + flashError:"Flash initialization failed!", + netError:"Network error! Please try again!", + copySuccess:"URL has been copied!", + + 'flashI18n':{ + lang:encodeURI( '{"UploadingState":"totalNum: ${a},uploadComplete: ${b}", "BeforeUpload":"waitingNum: ${a}", "ExceedSize":"Size exceed${a}", "ErrorInPreview":"Preview failed", "DefaultDescription":"Description", "LoadingImage":"Loading..."}' ), + uploadingTF:encodeURI( '{"font":"Arial", "size":12, "color":"0x000", "bold":"true", "italic":"false", "underline":"false"}' ), + imageTF:encodeURI( '{"font":"Arial", "size":11, "color":"red", "bold":"false", "italic":"false", "underline":"false"}' ), + textEncoding:"utf-8", + addImageSkinURL:"addImage.png", + allDeleteBtnUpSkinURL:"allDeleteBtnUpSkin.png", + allDeleteBtnHoverSkinURL:"allDeleteBtnHoverSkin.png", + rotateLeftBtnEnableSkinURL:"rotateLeftEnable.png", + rotateLeftBtnDisableSkinURL:"rotateLeftDisable.png", + rotateRightBtnEnableSkinURL:"rotateRightEnable.png", + rotateRightBtnDisableSkinURL:"rotateRightDisable.png", + deleteBtnEnableSkinURL:"deleteEnable.png", + deleteBtnDisableSkinURL:"deleteDisable.png", + backgroundURL:'', + listBackgroundURL:'', + buttonURL:'button.png' + } + }, + 'autosave': { + 'success':'Local conservation success' + } +}; diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/addimage.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/addimage.png new file mode 100644 index 0000000..3a2fd17 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/addimage.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/alldeletebtnhoverskin.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/alldeletebtnhoverskin.png new file mode 100644 index 0000000..355eeab Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/alldeletebtnhoverskin.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/alldeletebtnupskin.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/alldeletebtnupskin.png new file mode 100644 index 0000000..61658ce Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/alldeletebtnupskin.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/background.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/background.png new file mode 100644 index 0000000..d5bf5fd Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/background.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/button.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/button.png new file mode 100644 index 0000000..098874c Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/button.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/copy.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/copy.png new file mode 100644 index 0000000..f982e8b Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/copy.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/deletedisable.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/deletedisable.png new file mode 100644 index 0000000..c8ee750 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/deletedisable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/deleteenable.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/deleteenable.png new file mode 100644 index 0000000..26acc88 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/deleteenable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/listbackground.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/listbackground.png new file mode 100644 index 0000000..4f82ccd Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/listbackground.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/localimage.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/localimage.png new file mode 100644 index 0000000..12c8e6a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/localimage.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/music.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/music.png new file mode 100644 index 0000000..2f495fe Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/music.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotateleftdisable.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotateleftdisable.png new file mode 100644 index 0000000..741526e Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotateleftdisable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotateleftenable.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotateleftenable.png new file mode 100644 index 0000000..e164ddb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotateleftenable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotaterightdisable.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotaterightdisable.png new file mode 100644 index 0000000..5a78c26 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotaterightdisable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotaterightenable.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotaterightenable.png new file mode 100644 index 0000000..d768531 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/rotaterightenable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/upload.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/upload.png new file mode 100644 index 0000000..7bb15b3 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/en/images/upload.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/copy.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/copy.png new file mode 100644 index 0000000..b2536aa Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/copy.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/localimage.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/localimage.png new file mode 100644 index 0000000..7303c36 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/localimage.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/music.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/music.png new file mode 100644 index 0000000..354edeb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/music.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/upload.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/upload.png new file mode 100644 index 0000000..08d4d92 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/images/upload.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/zh-cn.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/zh-cn.js new file mode 100644 index 0000000..4d5178f --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/lang/zh-cn/zh-cn.js @@ -0,0 +1,669 @@ +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-6-12 + * Time: 下午5:02 + * To change this template use File | Settings | File Templates. + */ +UE.I18N['zh-cn'] = { + 'labelMap':{ + 'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图', + 'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框', + 'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用', + 'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览', + 'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期', + 'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格', + 'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行', + 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格','deletecaption':'删除表格标题','inserttitle':'插入标题', + 'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言', + 'fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'simpleupload':'单图上传', 'insertimage':'多图上传','edittable':'表格属性','edittd':'单元格属性', 'link':'超链接', + 'emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'Baidu地图', 'gmap':'Google地图', + 'insertvideo':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表', + 'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入', + 'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认', + 'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存', + 'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版', + 'webapp':'百度应用','touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦', + 'music':'音乐','inserttable':'插入表格','drafts': '从草稿箱加载', 'charts': '图表' + }, + 'insertorderedlist':{ + 'num':'1,2,3...', + 'num1':'1),2),3)...', + 'num2':'(1),(2),(3)...', + 'cn':'一,二,三....', + 'cn1':'一),二),三)....', + 'cn2':'(一),(二),(三)....', + 'decimal':'1,2,3...', + 'lower-alpha':'a,b,c...', + 'lower-roman':'i,ii,iii...', + 'upper-alpha':'A,B,C...', + 'upper-roman':'I,II,III...' + }, + 'insertunorderedlist':{ + 'circle':'○ 大圆圈', + 'disc':'● 小黑点', + 'square':'■ 小方块 ', + 'dash' :'— 破折号', + 'dot':' 。 小圆圈' + }, + 'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'}, + 'fontfamily':{ + 'songti':'宋体', + 'kaiti':'楷体', + 'heiti':'黑体', + 'lishu':'隶书', + 'yahei':'微软雅黑', + 'andaleMono':'andale mono', + 'arial': 'arial', + 'arialBlack':'arial black', + 'comicSansMs':'comic sans ms', + 'impact':'impact', + 'timesNewRoman':'times new roman' + }, + 'customstyle':{ + 'tc':'标题居中', + 'tl':'标题居左', + 'im':'强调', + 'hi':'明显强调' + }, + 'autoupload': { + 'exceedSizeError': '文件大小超出限制', + 'exceedTypeError': '文件格式不允许', + 'jsonEncodeError': '服务器返回格式错误', + 'loading':"正在上传...", + 'loadError':"上传错误", + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!' + }, + 'simpleupload':{ + 'exceedSizeError': '文件大小超出限制', + 'exceedTypeError': '文件格式不允许', + 'jsonEncodeError': '服务器返回格式错误', + 'loading':"正在上传...", + 'loadError':"上传错误", + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!' + }, + 'elementPathTip':"元素路径", + 'wordCountTip':"字数统计", + 'wordCountMsg':'当前已输入{#count}个字符, 您还可以输入{#leave}个字符。 ', + 'wordOverFlowMsg':'字数超出最大允许值,服务器可能拒绝保存!', + 'ok':"确认", + 'cancel':"取消", + 'closeDialog':"关闭对话框", + 'tableDrag':"表格拖动必须引入uiUtils.js文件!", + 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", + 'loadconfigError': '获取后台配置项请求出错,上传功能将不能正常使用!', + 'loadconfigFormatError': '后台配置项返回格式出错,上传功能将不能正常使用!', + 'loadconfigHttpError': '请求后台配置项http错误,上传功能将不能正常使用!', + 'snapScreen_plugin':{ + 'browserMsg':"仅支持IE浏览器!", + 'callBackErrorMsg':"服务器返回数据有误,请检查配置项之后重试。", + 'uploadErrorMsg':"截图上传失败,请检查服务器端环境! " + }, + 'insertcode':{ + 'as3':'ActionScript 3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'CSS', + 'cf':'ColdFusion', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'HTML', + 'java':'Java', + 'jfx':'JavaFX', + 'js':'JavaScript', + 'pl':'Perl', + 'php':'PHP', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'SQL', + 'vb':'Visual Basic', + 'xml':'XML' + }, + 'confirmClear':"确定清空当前文档么?", + 'contextMenu':{ + 'delete':"删除", + 'selectall':"全选", + 'deletecode':"删除代码", + 'cleardoc':"清空文档", + 'confirmclear':"确定清空当前文档么?", + 'unlink':"删除超链接", + 'paragraph':"段落格式", + 'edittable':"表格属性", + 'aligntd':"单元格对齐方式", + 'aligntable':'表格对齐方式', + 'tableleft':'左浮动', + 'tablecenter':'居中显示', + 'tableright':'右浮动', + 'edittd':"单元格属性", + 'setbordervisible':'设置表格边线可见', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', + 'table':"表格", + 'inserttable':'插入表格', + 'deletetable':"删除表格", + 'insertparagraphbefore':"前插入段落", + 'insertparagraphafter':'后插入段落', + 'deleterow':"删除当前行", + 'deletecol':"删除当前列", + 'insertrow':"前插入行", + 'insertcol':"左插入列", + 'insertrownext':'后插入行', + 'insertcolnext':'右插入列', + 'insertcaption':'插入表格名称', + 'deletecaption':'删除表格名称', + 'inserttitle':'插入表格标题行', + 'deletetitle':'删除表格标题行', + 'inserttitlecol':'插入表格标题列', + 'deletetitlecol':'删除表格标题列', + 'averageDiseRow':'平均分布各行', + 'averageDisCol':'平均分布各列', + 'mergeright':"向右合并", + 'mergeleft':"向左合并", + 'mergedown':"向下合并", + 'mergecells':"合并单元格", + 'splittocells':"完全拆分单元格", + 'splittocols':"拆分成列", + 'splittorows':"拆分成行", + 'tablesort':'表格排序', + 'enablesort':'设置表格可排序', + 'disablesort':'取消表格可排序', + 'reversecurrent':'逆序当前', + 'orderbyasc':'按ASCII字符升序', + 'reversebyasc':'按ASCII字符降序', + 'orderbynum':'按数值大小升序', + 'reversebynum':'按数值大小降序', + 'borderbk':'边框底纹', + 'setcolor':'表格隔行变色', + 'unsetcolor':'取消表格隔行变色', + 'setbackground':'选区背景隔行', + 'unsetbackground':'取消选区背景', + 'redandblue':'红蓝相间', + 'threecolorgradient':'三色渐变', + 'copy':"复制(Ctrl + c)", + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'paste':"粘贴(Ctrl + v)", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'" + }, + 'copymsg': "浏览器不支持,请使用 'Ctrl + c'", + 'pastemsg': "浏览器不支持,请使用 'Ctrl + v'", + 'anthorMsg':"链接", + 'clearColor':'清空颜色', + 'standardColor':'标准颜色', + 'themeColor':'主题颜色', + 'property':'属性', + 'default':'默认', + 'modify':'修改', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中', + 'justify':'默认', + 'clear':'清除', + 'anchorMsg':'锚点', + 'delete':'删除', + 'clickToUpload':"点击上传", + 'unset':'尚未设置语言文件', + 't_row':'行', + 't_col':'列', + 'more':'更多', + 'pasteOpt':'粘贴选项', + 'pasteSourceFormat':"保留源格式", + 'tagFormat':'只保留标签', + 'pasteTextFormat':'只保留文本', + 'autoTypeSet':{ + 'mergeLine':"合并空行", + 'delLine':"清除空行", + 'removeFormat':"清除格式", + 'indent':"首行缩进", + 'alignment':"对齐方式", + 'imageFloat':"图片浮动", + 'removeFontsize':"清除字号", + 'removeFontFamily':"清除字体", + 'removeHtml':"清除冗余HTML代码", + 'pasteFilter':"粘贴过滤", + 'run':"执行", + 'symbol':'符号转换', + 'bdc2sb':'全角转半角', + 'tobdc':'半角转全角' + }, + + 'background':{ + 'static':{ + 'lang_background_normal':'背景设置', + 'lang_background_local':'在线图片', + 'lang_background_set':'选项', + 'lang_background_none':'无背景色', + 'lang_background_colored':'有背景色', + 'lang_background_color':'颜色设置', + 'lang_background_netimg':'网络图片', + 'lang_background_align':'对齐方式', + 'lang_background_position':'精确定位', + 'repeatType':{'options':["居中", "横向重复", "纵向重复", "平铺","自定义"]} + + }, + 'noUploadImage':"当前未上传过任何图片!", + 'toggleSelect':"单击可切换选中状态\n原图尺寸: " + }, + //===============dialog i18N======================= + 'insertimage':{ + 'static':{ + 'lang_tab_remote':"插入图片", //节点 + 'lang_tab_upload':"本地上传", + 'lang_tab_online':"在线管理", + 'lang_tab_search':"图片搜索", + 'lang_input_url':"地 址:", + 'lang_input_size':"大 小:", + 'lang_input_width':"宽度", + 'lang_input_height':"高度", + 'lang_input_border':"边 框:", + 'lang_input_vhspace':"边 距:", + 'lang_input_title':"描 述:", + 'lang_input_align':'图片浮动方式:', + 'lang_imgLoading':" 图片加载中……", + 'lang_start_upload':"开始上传", + 'lock':{'title':"锁定宽高比例"}, //属性 + 'searchType':{'title':"图片类型", 'options':["新闻", "壁纸", "表情", "头像"]}, //select的option + 'searchTxt':{'value':"请输入搜索关键词"}, + 'searchBtn':{'value':"百度一下"}, + 'searchReset':{'value':"清空搜索"}, + 'noneAlign':{'title':'无浮动'}, + 'leftAlign':{'title':'左浮动'}, + 'rightAlign':{'title':'右浮动'}, + 'centerAlign':{'title':'居中独占一行'} + }, + 'uploadSelectFile':'点击选择图片', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'uploadNoPreview':'不能预览', + 'updateStatusReady': '选中_张图片,共_KB。', + 'updateStatusConfirm': '已成功上传_张照片,_张照片上传失败', + 'updateStatusFinish': '共_张(_KB),_张上传成功', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错', + 'remoteLockError':"宽高不正确,不能所定比例", + 'numError':"请输入正确的长度或者宽度值!例如:123,400", + 'imageUrlError':"不允许的图片格式或者图片域!", + 'imageLoadError':"图片加载失败!请检查链接地址或网络状态!", + 'searchRemind':"请输入搜索关键词", + 'searchLoading':"图片加载中,请稍后……", + 'searchRetry':" :( ,抱歉,没有找到图片!请重试一次!" + }, + 'attachment':{ + 'static':{ + 'lang_tab_upload': '上传附件', + 'lang_tab_online': '在线附件', + 'lang_start_upload':"开始上传", + 'lang_drop_remind':"可以将文件拖到这里,单次最多可选100个文件" + }, + 'uploadSelectFile':'点击选择文件', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '已成功上传_个文件,_个文件上传失败', + 'updateStatusFinish': '共_个(_KB),_个上传成功', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错' + }, + 'insertvideo':{ + 'static':{ + 'lang_tab_insertV':"插入视频", + 'lang_tab_searchV':"搜索视频", + 'lang_tab_uploadV':"上传视频", + 'lang_video_url':"视频网址", + 'lang_video_size':"视频尺寸", + 'lang_videoW':"宽度", + 'lang_videoH':"高度", + 'lang_alignment':"对齐方式", + 'videoSearchTxt':{'value':"请输入搜索关键字!"}, + 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, + 'videoSearchBtn':{'value':"百度一下"}, + 'videoSearchReset':{'value':"清空结果"}, + + 'lang_input_fileStatus':' 当前未上传文件', + 'startUpload':{'style':"background:url(upload.png) no-repeat;"}, + + 'lang_upload_size':"视频尺寸", + 'lang_upload_width':"宽度", + 'lang_upload_height':"高度", + 'lang_upload_alignment':"对齐方式", + 'lang_format_advice':"建议使用mp4格式." + + }, + 'numError':"请输入正确的数值,如123,400", + 'floatLeft':"左浮动", + 'floatRight':"右浮动", + '"default"':"默认", + 'block':"独占一行", + 'urlError':"输入的视频地址有误,请检查后再试!", + 'loading':"  视频加载中,请等待……", + 'clickToSelect':"点击选中", + 'goToSource':'访问源视频', + 'noVideo':"    抱歉,找不到对应的视频,请重试!", + + 'browseFiles':'浏览文件', + 'uploadSuccess':'上传成功!', + 'delSuccessFile':'从成功队列中移除', + 'delFailSaveFile':'移除保存失败文件', + 'statusPrompt':' 个文件已上传! ', + 'flashVersionError':'当前Flash版本过低,请更新FlashPlayer后重试!', + 'flashLoadingError':'Flash加载失败!请检查路径或网络状态', + 'fileUploadReady':'等待上传……', + 'delUploadQueue':'从上传队列中移除', + 'limitPrompt1':'单次不能选择超过', + 'limitPrompt2':'个文件!请重新选择!', + 'delFailFile':'移除失败文件', + 'fileSizeLimit':'文件大小超出限制!', + 'emptyFile':'空文件无法上传!', + 'fileTypeError':'文件类型不允许!', + 'unknownError':'未知错误!', + 'fileUploading':'上传中,请等待……', + 'cancelUpload':'取消上传', + 'netError':'网络错误', + 'failUpload':'上传失败!', + 'serverIOError':'服务器IO错误!', + 'noAuthority':'无权限!', + 'fileNumLimit':'上传个数限制', + 'failCheck':'验证失败,本次上传被跳过!', + 'fileCanceling':'取消中,请等待……', + 'stopUploading':'上传已停止……', + + 'uploadSelectFile':'点击选择文件', + 'uploadAddFile':'继续添加', + 'uploadStart':'开始上传', + 'uploadPause':'暂停上传', + 'uploadContinue':'继续上传', + 'uploadRetry':'重试上传', + 'uploadDelete':'删除', + 'uploadTurnLeft':'向左旋转', + 'uploadTurnRight':'向右旋转', + 'uploadPreview':'预览中', + 'updateStatusReady': '选中_个文件,共_KB。', + 'updateStatusConfirm': '成功上传_个,_个失败', + 'updateStatusFinish': '共_个(_KB),_个成功上传', + 'updateStatusError': ',_张上传失败。', + 'errorNotSupport': 'WebUploader 不支持您的浏览器!如果你使用的是IE浏览器,请尝试升级 flash 播放器。', + 'errorLoadConfig': '后端配置项没有正常加载,上传插件不能正常使用!', + 'errorExceedSize':'文件大小超出', + 'errorFileType':'文件格式不允许', + 'errorInterrupt':'文件传输中断', + 'errorUploadRetry':'上传失败,请重试', + 'errorHttp':'http请求错误', + 'errorServerUpload':'服务器返回出错' + }, + 'webapp':{ + 'tip1':"本功能由百度APP提供,如看到此页面,请各位站长首先申请百度APPKey!", + 'tip2':"申请完成之后请至ueditor.config.js中配置获得的appkey! ", + 'applyFor':"点此申请", + 'anthorApi':"百度API" + }, + 'template':{ + 'static':{ + 'lang_template_bkcolor':'背景颜色', + 'lang_template_clear' : '保留原有内容', + 'lang_template_select' : '选择模板' + }, + 'blank':"空白文档", + 'blog':"博客文章", + 'resume':"个人简历", + 'richText':"图文混排", + 'sciPapers':"科技论文" + + + }, + 'scrawl':{ + 'static':{ + 'lang_input_previousStep':"上一步", + 'lang_input_nextsStep':"下一步", + 'lang_input_clear':'清空', + 'lang_input_addPic':'添加背景', + 'lang_input_ScalePic':'缩放背景', + 'lang_input_removePic':'删除背景', + 'J_imgTxt':{title:'添加背景图片'} + }, + 'noScarwl':"尚未作画,白纸一张~", + 'scrawlUpLoading':"涂鸦上传中,别急哦~", + 'continueBtn':"继续", + 'imageError':"糟糕,图片读取失败了!", + 'backgroundUploading':'背景图片上传中,别急哦~' + }, + 'music':{ + 'static':{ + 'lang_input_tips':"输入歌手/歌曲/专辑,搜索您感兴趣的音乐!", + 'J_searchBtn':{value:'搜索歌曲'} + }, + 'emptyTxt':'未搜索到相关音乐结果,请换一个关键词试试。', + 'chapter':'歌曲', + 'singer':'歌手', + 'special':'专辑', + 'listenTest':'试听' + }, + 'anchor':{ + 'static':{ + 'lang_input_anchorName':'锚点名字:' + } + }, + 'charts':{ + 'static':{ + 'lang_data_source':'数据源:', + 'lang_chart_format': '图表格式:', + 'lang_data_align': '数据对齐方式', + 'lang_chart_align_same': '数据源与图表X轴Y轴一致', + 'lang_chart_align_reverse': '数据源与图表X轴Y轴相反', + 'lang_chart_title': '图表标题', + 'lang_chart_main_title': '主标题:', + 'lang_chart_sub_title': '子标题:', + 'lang_chart_x_title': 'X轴标题:', + 'lang_chart_y_title': 'Y轴标题:', + 'lang_chart_tip': '提示文字', + 'lang_cahrt_tip_prefix': '提示文字前缀:', + 'lang_cahrt_tip_description': '仅饼图有效, 当鼠标移动到饼图中相应的块上时,提示框内的文字的前缀', + 'lang_chart_data_unit': '数据单位', + 'lang_chart_data_unit_title': '单位:', + 'lang_chart_data_unit_description': '显示在每个数据点上的数据的单位, 比如: 温度的单位 ℃', + 'lang_chart_type': '图表类型:', + 'lang_prev_btn': '上一个', + 'lang_next_btn': '下一个' + } + }, + 'emotion':{ + 'static':{ + 'lang_input_choice':'精选', + 'lang_input_Tuzki':'兔斯基', + 'lang_input_BOBO':'BOBO', + 'lang_input_lvdouwa':'绿豆蛙', + 'lang_input_babyCat':'baby猫', + 'lang_input_bubble':'泡泡', + 'lang_input_youa':'有啊' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'地址', + 'lang_input_search':'搜索', + 'address':{value:"北京"} + }, + searchError:'无法定位到该地址!' + }, + 'help':{ + 'static':{ + 'lang_input_about':'关于UEditor', + 'lang_input_shortcuts':'快捷键', + 'lang_input_introduction':'UEditor是由百度web前端研发部开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。开源基于BSD协议,允许自由使用和修改代码。', + 'lang_Txt_shortcuts':'快捷键', + 'lang_Txt_func':'功能', + 'lang_Txt_bold':'给选中字设置为加粗', + 'lang_Txt_copy':'复制选中内容', + 'lang_Txt_cut':'剪切选中内容', + 'lang_Txt_Paste':'粘贴', + 'lang_Txt_undo':'重新执行上次操作', + 'lang_Txt_redo':'撤销上一次操作', + 'lang_Txt_italic':'给选中字设置为斜体', + 'lang_Txt_underline':'给选中字加下划线', + 'lang_Txt_selectAll':'全部选中', + 'lang_Txt_visualEnter':'软回车', + 'lang_Txt_fullscreen':'全屏' + } + }, + 'insertframe':{ + 'static':{ + 'lang_input_address':'地址:', + 'lang_input_width':'宽度:', + 'lang_input_height':'高度:', + 'lang_input_isScroll':'允许滚动条:', + 'lang_input_frameborder':'显示框架边框:', + 'lang_input_alignMode':'对齐方式:', + 'align':{title:"对齐方式", options:["默认", "左对齐", "右对齐", "居中"]} + }, + 'enterAddress':'请输入地址!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'文本内容:', + 'lang_input_url':'链接地址:', + 'lang_input_title':'标题:', + 'lang_input_target':'是否在新窗口打开:' + }, + 'validLink':'只支持选中一个链接时生效', + 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' + }, + 'map':{ + 'static':{ + lang_city:"城市", + lang_address:"地址", + city:{value:"北京"}, + lang_search:"搜索", + lang_dynamicmap:"插入动态地图" + }, + cityMsg:"请选择城市", + errorMsg:"抱歉,找不到该位置!" + }, + 'searchreplace':{ + 'static':{ + lang_tab_search:"查找", + lang_tab_replace:"替换", + lang_search1:"查找", + lang_search2:"查找", + lang_replace:"替换", + lang_searchReg:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_searchReg1:'支持正则表达式,添加前后斜杠标示为正则表达式,例如“/表达式/”', + lang_case_sensitive1:"区分大小写", + lang_case_sensitive2:"区分大小写", + nextFindBtn:{value:"下一个"}, + preFindBtn:{value:"上一个"}, + nextReplaceBtn:{value:"下一个"}, + preReplaceBtn:{value:"上一个"}, + repalceBtn:{value:"替换"}, + repalceAllBtn:{value:"全部替换"} + }, + getEnd:"已经搜索到文章末尾!", + getStart:"已经搜索到文章头部", + countMsg:"总共替换了{#count}处!" + }, + 'snapscreen':{ + 'static':{ + lang_showMsg:"截图功能需要首先安装UEditor截图插件! ", + lang_download:"点此下载", + lang_step1:"第一步,下载UEditor截图插件并运行安装。", + lang_step2:"第二步,插件安装完成后即可使用,如不生效,请重启浏览器后再试!" + } + }, + 'spechars':{ + 'static':{}, + tsfh:"特殊字符", + lmsz:"罗马字符", + szfh:"数学字符", + rwfh:"日文字符", + xlzm:"希腊字母", + ewzm:"俄文字符", + pyzm:"拼音字母", + yyyb:"英语音标", + zyzf:"其他" + }, + 'edittable':{ + 'static':{ + 'lang_tableStyle':'表格样式', + 'lang_insertCaption':'添加表格名称行', + 'lang_insertTitle':'添加表格标题行', + 'lang_insertTitleCol':'添加表格标题列', + 'lang_orderbycontent':"使表格内容可排序", + 'lang_tableSize':'自动调整表格尺寸', + 'lang_autoSizeContent':'按表格文字自适应', + 'lang_autoSizePage':'按页面宽度自适应', + 'lang_example':'示例', + 'lang_borderStyle':'表格边框', + 'lang_color':'颜色:' + }, + captionName:'表格名称', + titleName:'标题', + cellsName:'内容', + errorMsg:'有合并单元格,不可排序' + }, + 'edittip':{ + 'static':{ + lang_delRow:'删除整行', + lang_delCol:'删除整列' + } + }, + 'edittd':{ + 'static':{ + lang_tdBkColor:'背景颜色:' + } + }, + 'formula':{ + 'static':{ + } + }, + 'wordimage':{ + 'static':{ + lang_resave:"转存步骤", + uploadBtn:{src:"upload.png",alt:"上传"}, + clipboard:{style:"background: url(copy.png) -153px -1px no-repeat;"}, + lang_step:"1、点击顶部复制按钮,将地址复制到剪贴板;2、点击添加照片按钮,在弹出的对话框中使用Ctrl+V粘贴地址;3、点击打开后选择图片上传流程。" + }, + 'fileType':"图片", + 'flashError':"FLASH初始化失败,请检查FLASH插件是否正确安装!", + 'netError':"网络连接错误,请重试!", + 'copySuccess':"图片地址已经复制!", + 'flashI18n':{} //留空默认中文 + }, + 'autosave': { + 'saving':'保存中...', + 'success':'本地保存成功' + } +}; diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/Config.cs b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/Config.cs new file mode 100644 index 0000000..91c130f --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/Config.cs @@ -0,0 +1,55 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.IO; +using System.Linq; +using System.Web; + +/// +/// Config 的摘要说明 +/// +public static class Config +{ + private static bool noCache = true; + private static JObject BuildItems() + { + var json = File.ReadAllText(HttpContext.Current.Server.MapPath("config.json")); + return JObject.Parse(json); + } + + public static JObject Items + { + get + { + if (noCache || _Items == null) + { + _Items = BuildItems(); + } + return _Items; + } + } + private static JObject _Items; + + + public static T GetValue(string key) + { + return Items[key].Value(); + } + + public static String[] GetStringList(string key) + { + return Items[key].Select(x => x.Value()).ToArray(); + } + + public static String GetString(string key) + { + return GetValue(key); + } + + public static int GetInt(string key) + { + return GetValue(key); + } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/ConfigHandler.cs b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/ConfigHandler.cs new file mode 100644 index 0000000..03cdc9a --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/ConfigHandler.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +/// +/// Config 的摘要说明 +/// +public class ConfigHandler : Handler +{ + public ConfigHandler(HttpContext context) : base(context) { } + + public override void Process() + { + WriteJson(Config.Items); + } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/CrawlerHandler.cs b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/CrawlerHandler.cs new file mode 100644 index 0000000..8213a77 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/CrawlerHandler.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Web; + +/// +/// Crawler 的摘要说明 +/// +public class CrawlerHandler : Handler +{ + private string[] Sources; + private Crawler[] Crawlers; + public CrawlerHandler(HttpContext context) : base(context) { } + + public override void Process() + { + Sources = Request.Form.GetValues("source[]"); + if (Sources == null || Sources.Length == 0) + { + WriteJson(new + { + state = "参数错误:没有指定抓取源" + }); + return; + } + Crawlers = Sources.Select(x => new Crawler(x, Server).Fetch()).ToArray(); + WriteJson(new + { + state = "SUCCESS", + list = Crawlers.Select(x => new + { + state = x.State, + source = x.SourceUrl, + url = x.ServerUrl + }) + }); + } +} + +public class Crawler +{ + public string SourceUrl { get; set; } + public string ServerUrl { get; set; } + public string State { get; set; } + + private HttpServerUtility Server { get; set; } + + + public Crawler(string sourceUrl, HttpServerUtility server) + { + this.SourceUrl = sourceUrl; + this.Server = server; + } + + public Crawler Fetch() + { + var request = HttpWebRequest.Create(this.SourceUrl) as HttpWebRequest; + using (var response = request.GetResponse() as HttpWebResponse) + { + if (response.StatusCode != HttpStatusCode.OK) + { + State = "Url returns " + response.StatusCode + ", " + response.StatusDescription; + return this; + } + if (response.ContentType.IndexOf("image") == -1) + { + State = "Url is not an image"; + return this; + } + ServerUrl = PathFormatter.Format(Path.GetFileName(this.SourceUrl), Config.GetString("catcherPathFormat")); + var savePath = Server.MapPath(ServerUrl); + if (!Directory.Exists(Path.GetDirectoryName(savePath))) + { + Directory.CreateDirectory(Path.GetDirectoryName(savePath)); + } + try + { + var stream = response.GetResponseStream(); + var reader = new BinaryReader(stream); + byte[] bytes; + using (var ms = new MemoryStream()) + { + byte[] buffer = new byte[4096]; + int count; + while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) + { + ms.Write(buffer, 0, count); + } + bytes = ms.ToArray(); + } + File.WriteAllBytes(savePath, bytes); + State = "SUCCESS"; + } + catch (Exception e) + { + State = "抓取错误:" + e.Message; + } + return this; + } + } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/Handler.cs b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/Handler.cs new file mode 100644 index 0000000..4d20ed5 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/Handler.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Newtonsoft.Json; + + +/// +/// Handler 的摘要说明 +/// +public abstract class Handler +{ + public Handler(HttpContext context) + { + this.Request = context.Request; + this.Response = context.Response; + this.Context = context; + this.Server = context.Server; + } + + public abstract void Process(); + + protected void WriteJson(object response) + { + string jsonpCallback = Request["callback"], + json = JsonConvert.SerializeObject(response); + if (String.IsNullOrWhiteSpace(jsonpCallback)) + { + Response.AddHeader("Content-Type", "text/plain"); + Response.Write(json); + } + else + { + Response.AddHeader("Content-Type", "application/javascript"); + Response.Write(String.Format("{0}({1});", jsonpCallback, json)); + } + Response.End(); + } + + public HttpRequest Request { get; private set; } + public HttpResponse Response { get; private set; } + public HttpContext Context { get; private set; } + public HttpServerUtility Server { get; private set; } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/ListFileHandler.cs b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/ListFileHandler.cs new file mode 100644 index 0000000..2cfa22a --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/ListFileHandler.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Web; + +/// +/// FileManager 的摘要说明 +/// +public class ListFileManager : Handler +{ + enum ResultState + { + Success, + InvalidParam, + AuthorizError, + IOError, + PathNotFound + } + + private int Start; + private int Size; + private int Total; + private ResultState State; + private String PathToList; + private String[] FileList; + private String[] SearchExtensions; + + public ListFileManager(HttpContext context, string pathToList, string[] searchExtensions) + : base(context) + { + this.SearchExtensions = searchExtensions.Select(x => x.ToLower()).ToArray(); + this.PathToList = pathToList; + } + + public override void Process() + { + try + { + Start = String.IsNullOrEmpty(Request["start"]) ? 0 : Convert.ToInt32(Request["start"]); + Size = String.IsNullOrEmpty(Request["size"]) ? Config.GetInt("imageManagerListSize") : Convert.ToInt32(Request["size"]); + } + catch (FormatException) + { + State = ResultState.InvalidParam; + WriteResult(); + return; + } + var buildingList = new List(); + try + { + var localPath = Server.MapPath(PathToList); + buildingList.AddRange(Directory.GetFiles(localPath, "*", SearchOption.AllDirectories) + .Where(x => SearchExtensions.Contains(Path.GetExtension(x).ToLower())) + .Select(x => PathToList + x.Substring(localPath.Length).Replace("\\", "/"))); + Total = buildingList.Count; + FileList = buildingList.OrderBy(x => x).Skip(Start).Take(Size).ToArray(); + } + catch (UnauthorizedAccessException) + { + State = ResultState.AuthorizError; + } + catch (DirectoryNotFoundException) + { + State = ResultState.PathNotFound; + } + catch (IOException) + { + State = ResultState.IOError; + } + finally + { + WriteResult(); + } + } + + private void WriteResult() + { + WriteJson(new + { + state = GetStateString(), + list = FileList == null ? null : FileList.Select(x => new { url = x }), + start = Start, + size = Size, + total = Total + }); + } + + private string GetStateString() + { + switch (State) + { + case ResultState.Success: + return "SUCCESS"; + case ResultState.InvalidParam: + return "参数不正确"; + case ResultState.PathNotFound: + return "路径不存在"; + case ResultState.AuthorizError: + return "文件系统权限不足"; + case ResultState.IOError: + return "文件系统读取错误"; + } + return "未知错误"; + } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/NotSupportedHandler.cs b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/NotSupportedHandler.cs new file mode 100644 index 0000000..d9d7323 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/NotSupportedHandler.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +/// +/// NotSupportedHandler 的摘要说明 +/// +public class NotSupportedHandler : Handler +{ + public NotSupportedHandler(HttpContext context) + : base(context) + { + } + + public override void Process() + { + WriteJson(new + { + state = "action 参数为空或者 action 不被支持。" + }); + } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/PathFormater.cs b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/PathFormater.cs new file mode 100644 index 0000000..e6fbfd4 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/PathFormater.cs @@ -0,0 +1,50 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Web; + +/// +/// PathFormater 的摘要说明 +/// +public static class PathFormatter +{ + public static string Format(string originFileName, string pathFormat) + { + if (String.IsNullOrWhiteSpace(pathFormat)) + { + pathFormat = "{filename}{rand:6}"; + } + + var invalidPattern = new Regex(@"[\\\/\:\*\?\042\<\>\|]"); + originFileName = invalidPattern.Replace(originFileName, ""); + + string extension = Path.GetExtension(originFileName); + string filename = Path.GetFileNameWithoutExtension(originFileName); + + pathFormat = pathFormat.Replace("{filename}", filename); + pathFormat = new Regex(@"\{rand(\:?)(\d+)\}", RegexOptions.Compiled).Replace(pathFormat, new MatchEvaluator(delegate(Match match) + { + var digit = 6; + if (match.Groups.Count > 2) + { + digit = Convert.ToInt32(match.Groups[2].Value); + } + var rand = new Random(); + return rand.Next((int)Math.Pow(10, digit), (int)Math.Pow(10, digit + 1)).ToString(); + })); + + pathFormat = pathFormat.Replace("{time}", DateTime.Now.Ticks.ToString()); + pathFormat = pathFormat.Replace("{yyyy}", DateTime.Now.Year.ToString()); + pathFormat = pathFormat.Replace("{yy}", (DateTime.Now.Year % 100).ToString("D2")); + pathFormat = pathFormat.Replace("{mm}", DateTime.Now.Month.ToString("D2")); + pathFormat = pathFormat.Replace("{dd}", DateTime.Now.Day.ToString("D2")); + pathFormat = pathFormat.Replace("{hh}", DateTime.Now.Hour.ToString("D2")); + pathFormat = pathFormat.Replace("{ii}", DateTime.Now.Minute.ToString("D2")); + pathFormat = pathFormat.Replace("{ss}", DateTime.Now.Second.ToString("D2")); + + return pathFormat + extension; + } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/UploadHandler.cs b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/UploadHandler.cs new file mode 100644 index 0000000..ea45e79 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/App_Code/UploadHandler.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Web; + +/// +/// UploadHandler 的摘要说明 +/// +public class UploadHandler : Handler +{ + + public UploadConfig UploadConfig { get; private set; } + public UploadResult Result { get; private set; } + + public UploadHandler(HttpContext context, UploadConfig config) + : base(context) + { + this.UploadConfig = config; + this.Result = new UploadResult() { State = UploadState.Unknown }; + } + + public override void Process() + { + byte[] uploadFileBytes = null; + string uploadFileName = null; + + if (UploadConfig.Base64) + { + uploadFileName = UploadConfig.Base64Filename; + uploadFileBytes = Convert.FromBase64String(Request[UploadConfig.UploadFieldName]); + } + else + { + var file = Request.Files[UploadConfig.UploadFieldName]; + uploadFileName = file.FileName; + + if (!CheckFileType(uploadFileName)) + { + Result.State = UploadState.TypeNotAllow; + WriteResult(); + return; + } + if (!CheckFileSize(file.ContentLength)) + { + Result.State = UploadState.SizeLimitExceed; + WriteResult(); + return; + } + + uploadFileBytes = new byte[file.ContentLength]; + try + { + file.InputStream.Read(uploadFileBytes, 0, file.ContentLength); + } + catch (Exception) + { + Result.State = UploadState.NetworkError; + WriteResult(); + } + } + + Result.OriginFileName = uploadFileName; + + var savePath = PathFormatter.Format(uploadFileName, UploadConfig.PathFormat); + var localPath = Server.MapPath(savePath); + try + { + if (!Directory.Exists(Path.GetDirectoryName(localPath))) + { + Directory.CreateDirectory(Path.GetDirectoryName(localPath)); + } + File.WriteAllBytes(localPath, uploadFileBytes); + Result.Url = savePath; + Result.State = UploadState.Success; + } + catch (Exception e) + { + Result.State = UploadState.FileAccessError; + Result.ErrorMessage = e.Message; + } + finally + { + WriteResult(); + } + } + + private void WriteResult() + { + this.WriteJson(new + { + state = GetStateMessage(Result.State), + url = Result.Url, + title = Result.OriginFileName, + original = Result.OriginFileName, + error = Result.ErrorMessage + }); + } + + private string GetStateMessage(UploadState state) + { + switch (state) + { + case UploadState.Success: + return "SUCCESS"; + case UploadState.FileAccessError: + return "文件访问出错,请检查写入权限"; + case UploadState.SizeLimitExceed: + return "文件大小超出服务器限制"; + case UploadState.TypeNotAllow: + return "不允许的文件格式"; + case UploadState.NetworkError: + return "网络错误"; + } + return "未知错误"; + } + + private bool CheckFileType(string filename) + { + var fileExtension = Path.GetExtension(filename).ToLower(); + return UploadConfig.AllowExtensions.Select(x => x.ToLower()).Contains(fileExtension); + } + + private bool CheckFileSize(int size) + { + return size < UploadConfig.SizeLimit; + } +} + +public class UploadConfig +{ + /// + /// 文件命名规则 + /// + public string PathFormat { get; set; } + + /// + /// 上传表单域名称 + /// + public string UploadFieldName { get; set; } + + /// + /// 上传大小限制 + /// + public int SizeLimit { get; set; } + + /// + /// 上传允许的文件格式 + /// + public string[] AllowExtensions { get; set; } + + /// + /// 文件是否以 Base64 的形式上传 + /// + public bool Base64 { get; set; } + + /// + /// Base64 字符串所表示的文件名 + /// + public string Base64Filename { get; set; } +} + +public class UploadResult +{ + public UploadState State { get; set; } + public string Url { get; set; } + public string OriginFileName { get; set; } + + public string ErrorMessage { get; set; } +} + +public enum UploadState +{ + Success = 0, + SizeLimitExceed = -1, + TypeNotAllow = -2, + FileAccessError = -3, + NetworkError = -4, + Unknown = 1, +} + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.dll b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.dll new file mode 100644 index 0000000..551ed2c Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.dll differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.pdb b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.pdb new file mode 100644 index 0000000..dd6a719 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.pdb differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.xml b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.xml new file mode 100644 index 0000000..5204a37 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Bin/Newtonsoft.Json.xml @@ -0,0 +1,8472 @@ + + + + Newtonsoft.Json + + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized Json data. + + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized Json data. + + + + + Initializes a new instance of the class with the specified . + + + + + Reads the next JSON token from the stream. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the state based on current token type. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the to Closed. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the underlying stream or + should be closed when the reader is closed. + + + true to close the underlying stream or when + the reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Get or set how time zones are handling when reading JSON. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets The Common Language Runtime (CLR) type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Specifies the state of the reader. + + + + + The Read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The Close method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Initializes a new instance of the class. + + The stream. + + + + Initializes a new instance of the class. + + The reader. + + + + Initializes a new instance of the class. + + The stream. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The reader. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the stream as a . + + + A or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + + A . This method will return null at the end of an array. + + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the to Closed. + + + + + Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating Json data. + + + + + Creates an instance of the JsonWriter class. + + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a Json object. + + + + + Writes the end of a Json object. + + + + + Writes the beginning of a Json array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current Json object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes out the given white space. + + The string of white space characters. + + + + Sets the state of the JsonWriter, + + The JsonToken being written. + The value being written. + + + + Gets or sets a value indicating whether the underlying stream or + should be closed when the writer is closed. + + + true to close the underlying stream or when + the writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling when writing JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Get or set how and values are formatting when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + The stream. + + + + Initializes a new instance of the class. + + The writer. + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a Json array. + + + + + Writes the beginning of a Json object. + + + + + Writes the property name of a name/value pair on a Json object. + + The name of the property. + + + + Closes this stream and the underlying stream. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Represents a BSON Oid (object id). + + + + + Initializes a new instance of the class. + + The Oid value. + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Converts a binary value to and from a base 64 string value. + + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets the of the JSON produced by the JsonConverter. + + The of the JSON produced by the JsonConverter. + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Create a custom object + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework EntityKey to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an ExpandoObject to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Initializes a new instance of the class. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets a value indicating whether integer values are allowed. + + true if integers are allowed; otherwise, false. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a paramatized constructor. + + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Instructs the how to serialize the collection. + + + + + Instructs the how to serialize the object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets the collection's items converter. + + The collection's items converter. + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during Json serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Represents a trace writer that writes to the application's instances. + + + + + Represents a trace writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Get and set values for a using dynamic methods. + + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the method called immediately after deserialization of the object. + + The method called immediately after deserialization of the object. + + + + Gets or sets the method called during deserialization of the object. + + The method called during deserialization of the object. + + + + Gets or sets the method called after serialization of the object graph. + + The method called after serialization of the object graph. + + + + Gets or sets the method called before serialization of the object. + + The method called before serialization of the object. + + + + Gets or sets the method called when an error is thrown during the serialization of the object. + + The method called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non public. + + true if the default object creator is non-public; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if LineNumber and LinePosition can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Represents a raw JSON string. + + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Represents an abstract JSON token. + + + + + Represents a collection of objects. + + The type of token + + + + Gets the with the specified key. + + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output is formatted. + A collection of which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Creates an for this token. + + An that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object + + + + Creates the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + An positioned at the token to read into this . + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Creates a from a . + + An positioned at the token to read into this . + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A , or null. + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + An that contains the selected elements. + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Gets the with the specified key. + + The with the specified key. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + The parameter is null. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not the same type as this instance. + + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Gets or sets the ISerializable object constructor. + + The ISerializable object constructor. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides data for the Error event. + + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. When the or methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that + + + + Gets the reference for the sepecified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement ISerializable. + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that is is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable typesl; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and sets members to their default value when deserializing. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Initializes a new instance of the class. + + Type of the converter. + + + + Gets the type of the converter. + + The type of the converter. + + + + Instructs the how to serialize the object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Specifies the settings on a object. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + + Null value handling. + + + + Gets or sets how null default are handled during serialization and deserialization. + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + + The type name handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Get or set how and values are formatting when writing JSON text. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling during serialization and deserialization. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written as JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Represents a reader that provides validation. + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Reads the next JSON token from the stream as a . + + A . + + + + Reads the next JSON token from the stream as a . + + + A or a null reference if the next JSON token is null. + + + + + Reads the next JSON token from the stream as a . + + A . + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the Common Language Runtime (CLR) type for the current JSON token. + + + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members must be marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Converts a to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Converts a to and from a JavaScript date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts XML to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the attributeName is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + True if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements. + + The name of the deserialize root element. + + + + Gets or sets a flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attibute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The TextReader containing the XML data to read. + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the stream as a . + + + A or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Changes the state to closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if LineNumber and LinePosition can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + + + + + Instructs the to always serialize the member with the specified name. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization and deserialization of a member. + + The numeric order of serialization or deserialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating Json data. + + + + + Creates an instance of the JsonWriter class using the specified . + + The TextWriter to write to. + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a Json object. + + + + + Writes the beginning of a Json array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a Json object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes out the given white space. + + The string of white space characters. + + + + Gets or sets how many IndentChars to write for each level in the hierarchy when is set to Formatting.Indented. + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to Formatting.Indented. + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + The exception thrown when an error occurs while reading Json text. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + The exception thrown when an error occurs while reading Json text. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Represents a collection of . + + + + + Provides methods for converting between common language runtime types and JSON types. + + + + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output is formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output is formatted. + A collection converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be is used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be is used. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be is used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be is used. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + A JSON string representation of the object. + + + + + Asynchronously serializes the specified object to a JSON string. + Serialization will happen on a new thread. + + The object to serialize. + + A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + + + + + Asynchronously serializes the specified object to a JSON string using formatting. + Serialization will happen on a new thread. + + The object to serialize. + Indicates how the output is formatted. + + A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + + + + + Asynchronously serializes the specified object to a JSON string using formatting and a collection of . + Serialization will happen on a new thread. + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be is used. + + A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the Json string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be is used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the Json string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the Json string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be infered from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be infered from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be is used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be is used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be is used. + + The deserialized object from the JSON string. + + + + Asynchronously deserializes the JSON to the specified .NET type. + Deserialization will happen on a new thread. + + The type of the object to deserialize to. + The JSON to deserialize. + + A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + + + + + Asynchronously deserializes the JSON to the specified .NET type using . + Deserialization will happen on a new thread. + + The type of the object to deserialize to. + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be is used. + + + A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + + + + + Asynchronously deserializes the JSON to the specified .NET type. + Deserialization will happen on a new thread. + + The JSON to deserialize. + + A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + + + + + Asynchronously deserializes the JSON to the specified .NET type using . + Deserialization will happen on a new thread. + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be is used. + + + A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be is used. + + + + + Asynchronously populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be is used. + + + A task that represents the asynchronous populate operation. + + + + + Serializes the XML node to a JSON string. + + The node to serialize. + A JSON string of the XmlNode. + + + + Serializes the XML node to a JSON string using formatting. + + The node to serialize. + Indicates how the output is formatted. + A JSON string of the XmlNode. + + + + Serializes the XML node to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output is formatted. + Omits writing the root object. + A JSON string of the XmlNode. + + + + Deserializes the XmlNode from a JSON string. + + The JSON string. + The deserialized XmlNode + + + + Deserializes the XmlNode from a JSON string nested in a root elment specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized XmlNode + + + + Deserializes the XmlNode from a JSON string nested in a root elment specified by + and writes a .NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized XmlNode + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the XNode. + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output is formatted. + A JSON string of the XNode. + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output is formatted. + Omits writing the root object. + A JSON string of the XNode. + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized XNode + + + + Deserializes the from a JSON string nested in a root elment specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized XNode + + + + Deserializes the from a JSON string nested in a root elment specified by + and writes a .NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized XNode + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + The exception thrown when an error occurs during Json serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings. + + + A new instance. + The will not use default settings. + + + + + Creates a new instance using the specified . + The will not use default settings. + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings. + + + + + Creates a new instance. + The will use default settings. + + + A new instance. + The will use default settings. + + + + + Creates a new instance using the specified . + The will use default settings. + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings. + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to reader values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to reader values from. + The target object to populate values onto. + + + + Deserializes the Json structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the Json structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the Json structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the Json structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the Json structure + to a Stream using the specified . + + The used to write the Json structure. + The to serialize. + + + + Serializes the specified and writes the Json structure + to a Stream using the specified . + + The used to write the Json structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + + + Serializes the specified and writes the Json structure + to a Stream using the specified . + + The used to write the Json structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + + + Serializes the specified and writes the Json structure + to a Stream using the specified . + + The used to write the Json structure. + The to serialize. + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + + + + + Get or set how reference loops (e.g. a class referencing itself) is handled. + + + + + Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + + + + + Get or set how null values are handled during serialization and deserialization. + + + + + Get or set how null default are handled during serialization and deserialization. + + + + + Gets or sets how objects are created during deserialization. + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + + The constructor handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling during serialization and deserialization. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written as JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Get or set how and values are formatting when writing JSON text. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every node in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every node in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every node in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every node in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every node in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every node in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every node in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every node in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a JSON constructor. + + + + + Represents a token that can contain other tokens. + + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An containing the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates an that can be used to add tokens to the . + + An that is ready to have content written to it. + + + + Replaces the children nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Gets the with the specified key. + + The with the specified key. + + + + Represents a collection of objects. + + The type of token + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Gets the with the specified key. + + + + + + Represents a JSON object. + + + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets an of this object's properties. + + An of this object's properties. + + + + Gets a the specified name. + + The property name. + A with the specified name or null. + + + + Gets an of this object's property values. + + An of this object's property values. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries the get value. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the properties for this instance of a component. + + + A that represents the properties for this component instance. + + + + + Returns the properties for this instance of a component using the attribute array as a filter. + + An array of type that is used as a filter. + + A that represents the filtered properties for this component instance. + + + + + Returns a collection of custom attributes for this instance of a component. + + + An containing the attributes for this object. + + + + + Returns the class name of this instance of a component. + + + The class name of the object, or null if the class does not have a name. + + + + + Returns the name of this instance of a component. + + + The name of the object, or null if the object does not have a name. + + + + + Returns a type converter for this instance of a component. + + + A that is the converter for this object, or null if there is no for this object. + + + + + Returns the default event for this instance of a component. + + + An that represents the default event for this object, or null if this object does not have events. + + + + + Returns the default property for this instance of a component. + + + A that represents the default property for this object, or null if this object does not have properties. + + + + + Returns an editor of the specified type for this instance of a component. + + A that represents the editor for this object. + + An of the specified type that is the editor for this object, or null if the editor cannot be found. + + + + + Returns the events for this instance of a component using the specified attribute array as a filter. + + An array of type that is used as a filter. + + An that represents the filtered events for this component instance. + + + + + Returns the events for this instance of a component. + + + An that represents the events for this component instance. + + + + + Returns an object that contains the property described by the specified property descriptor. + + A that represents the property whose owner is to be found. + + An that represents the owner of the specified property. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Gets the node type for this . + + The type. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Represents a JSON array. + + + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + The is read-only. + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + The is read-only. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + The is read-only. + + + + Removes all items from the . + + The is read-only. + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies to. + + The array. + Index of the array. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + The is read-only. + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized Json data. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Reads the next JSON token from the stream as a . + + + A or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating Json data. + + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a Json object. + + + + + Writes the beginning of a Json array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a Json object. + + The name of the property. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Gets the token being writen. + + The token being writen. + + + + Represents a JSON property. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Gets the node type for this . + + The type. + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Contains the JSON schema extension methods. + + + + + Determines whether the is valid. + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + Determines whether the is valid. + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + Validates the specified . + + The source to test. + The schema to test with. + + + + Validates the specified . + + The source to test. + The schema to test with. + The validation event handler. + + + + Returns detailed information about the schema exception. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Resolves from an id. + + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Specifies undefined schema Id handling options for the . + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + Returns detailed information related to the . + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + Represents the callback method that will handle JSON schema validation events and the . + + + + + Resolves member mappings for a type, camel casing property names. + + + + + Used by to resolves a for a given . + + + + + Used by to resolves a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + If set to true the will use a cached shared with other resolvers of the same type. + Sharing the cache will significantly performance because expensive reflection will only happen once but could cause unexpected + behavior if different instances of the resolver are suppose to produce different results. When set to false it is highly + recommended to reuse instances with the . + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Name of the property. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Resolves the name of the property. + + Name of the property. + The property name camel cased. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization and deserialization of a member. + + The numeric order of serialization or deserialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes presidence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialize. + + A predicate used to determine whether the property should be serialize. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of propertyName and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + An in-memory representation of a JSON Schema. + + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains schema JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Parses the specified json. + + The json. + The resolver. + A populated from the string that contains JSON. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisble by. + + A number that the value should be divisble by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the "minimum" attribute. + + A flag indicating whether the value can not equal the number defined by the "minimum" attribute. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the "maximum" attribute. + + A flag indicating whether the value can not equal the number defined by the "maximum" attribute. + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallow types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Generates a from a specified . + + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + The value types allowed by the . + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets the object's properties. + + The object's properties. + + + + Gets the constructor parameters required for any non-default constructor + + + + + Gets or sets the override constructor used to create the object. + This is set when a constructor is marked up using the + JsonConstructor attribute. + + The override constructor. + + + + Gets or sets the parametrized constructor used to create the object. + + The parametrized constructor. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Represents a method that constructs an object. + + The object type to create. + + + + Specifies type name handling options for the . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + + + + + Converts the value to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert the value to. + The converted type. + + + + Converts the value to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert the value to. + The converted value if the conversion was successful or the default value of T if it failed. + + true if initialValue was converted successfully; otherwise, false. + + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Gets a dictionary of the names and values of an Enum type. + + + + + + Gets a dictionary of the names and values of an Enum type. + + The enum type to get names and values for. + + + + + Specifies the type of Json token. + + + + + This is returned by the if a method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer. + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic IList. + + The list to add to. + The collection of elements to add. + + + + Returns the index of the first occurrence in a sequence by using a specified IEqualityComparer. + + The type of the elements of source. + A sequence in which to locate a value. + The object to locate in the sequence + An equality comparer to compare values. + The zero-based index of the first occurrence of value within the entire sequence, if found; otherwise, –1. + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the member is an indexed property. + + The member. + + true if the member is an indexed property; otherwise, false. + + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Nulls an empty string. + + The string. + Null if the string was null, otherwise the string unchanged. + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls results in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + A array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/README.md b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/README.md new file mode 100644 index 0000000..b7c7ddd --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/README.md @@ -0,0 +1,141 @@ +UEditor ASP.NET 后台使用说明 +===== + +## 背景 + +UEditor 在 1.4 版本之后进行了一次[前后端统一配置](../_doc/3.1 后端请求规范.md)的整理,.Net 的后台也进行了一次重写,跟之前的版本差别较大,升级的用户注意阅读本文档。 + +本文档介绍 UEditor ASP.NET 后台的部署、配置、源码说明。 + + +## 1. 部署说明 + +### 1.1. 安装并注册 .NET Framework 4.0 + +代码的运行时环境是 .NET Framework 4.0,首先要确认 IIS 已经安装了 .NET 4.0 的运行时框架。方法是打开「IIS 管理器」,选择根目录下的「应用程序池」,在右侧查看是否有一个应用程序池的版本是 v4.0,如果存在,则 IIS 已经安装了所需的运行时环境,此时读者可以跳过本节。 + +![检查 .NET 4.0 安装情况](../_doc/images/net-publish-1.png) + +如果没有找到对应的应用程序池,需要手动安装。 + +Windows 7 和 Windows Server 2008 R2 默认安装了 .Net Framework 4.0,如果是 Server 03 和老掉牙的 Windows XP,则需要手动安装 [.NET Framework 4.0](http://www.microsoft.com/zh-cn/download/details.aspx?id=17718)。 + +安装完 .NET Framework 4.0 后,还需要向 IIS 注册应用程序池,注册的方法是,使用**管理员权限**打开命令提示符(CMD),输入以下命令: + +```shell +C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -i +``` + +安装完毕后,在 IIS 管理器刷新就能看到 4.0 的应用程序池。 + +### 1.2. 设置 .NET 应用程序 + +代码要求以应用程序的形式来运行(可以方便加入库依赖和组织代码)。需要把 `net` 目录转换为应用程序。 + +1. 在 IIS 中,展开到 `ueditor/net` 目录,在目录上右击,点击「转换为应用程序」。 + + ![转换为应用程序](../_doc/images/net-publish-2.png) + +2. 弹出的对话框中,点击「选择...」来指定使用的应用程序池。选择版本为 4.0 的应用程序池,然后点确定。 + + ![选择应用程序池](../_doc/images/net-publish-3.png) + +3. 设置连接凭据。点击「链接为...」按钮,在弹出的对话框中指定一个对目录具有读写权限的用户(如 administrator),然后点确定。 + + ![设置连接凭据](../_doc/images/net-publish-4.png) + + 设置完毕后,可以点击「测试设置...」来测试权限是否正常。 + + ![设置连接凭据](../_doc/images/net-publish-5.png) + +### 1.3. 运行测试 + +在浏览器中运行 `net/controller.ashx`,如果返回 "`{"state":"action 参数为空或者 action 不被支持。"}`",则表示应用程序运行成功。 + +如果你确认上述步骤已经执行,但是依然有问题,请给我们[提 Issue](https://github.com/fex-team/ueditor/issues/new?labels=NET%E5%90%8E%E5%8F%B0),我们会尽快答复解决。 + +## 2. 配置说明 + +前后端配置统一之后,配置文件由后台读取,返回给前端。但是部分配置是给后台使用的。 + +### 2.1. 上传配置说明 + +关于上传的部分,后台需要关心以下模板的配置项。 + +```json +{ + "{tpl}FieldName": "upfile", + "{tpl}PathFormat": "upload/{tpl}/{yyyy}{mm}{dd}/{time}{rand:6}", + "{tpl}UrlPrefix": "/ueditor/net/", + "{tpl}AllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], + "{tpl}MaxSize": 2048000 +} +``` + +"{tpl}FieldName" 表示提交的表单的文件域名称。 + +"{tpl}PathFormat" 表示上传文件保存的路径和名称。注意,这里的路径是相对应用程序的,如果需要修改的话,请自行修改源码。 + +"{tpl}UrlPrefix" 表示上传文件访问的 URL 前缀。注意,这里应该给出应用程序的 URL 路径,否则上传的文件不能正确定位。 + +> 举个例子,如果你的 UEditor 的位置在 `http://www.mydomain.com/myapp/ueditor`,对应的本地路径是 `C:\iis_pub\www\myapp\ueditor`,那么 .NET 应用程序的位置在 `http://www.mydomain.com/myapp/ueditor/net`,对应的本地路径是 `C:\iis_pub\www\myapp\ueditor\net`。图片上传配置项应该如下: +> +> { +> "imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", +> "imageUrlPrefix": "/myapp/ueditor/net/", +> } +> +> 上传的文件会保存在 `C:\iis_pub\www\myapp\ueditor\net\upload\image\{日期}\{文件名}` + +"{tpl}AllowFiles" 限制文件上传的类型,注意要有 "."。 + +"{tpl}MaxSize" 限制文件上传的大小。注意这里的限制是代码上的判断,应用程序本身还有一个请求报文大小限制。该限制在 web.config 文件中修改,注意要有以下的节: + +```xml + + + + + +``` + +maxRequestLength 就是请求报文大小限制,该大小应该要比设置的所有上传大小都大,否则应用程序执行之前,请求会被被拒绝。 + +## 3. 源码说明 + +可以看到 net 目录内的源码结构是这样的: + +``` +net + App_Code + Config.cs + Handler.cs + PathFormatter.cs + *Handler.cs + Bin + Newtonsoft.Json.dll + config.json + controller.ashx + net.sln + README.md + Web.config +``` + +App_Code 上的文件是应用程序的源码。 + +- Config.cs 负责读取配置文件 +- Handler.cs 是请求处理器的基类,提供了一些基本对象的访问以及输出控制。如果需要增加处理器,应该从该基类继承 +- PathFormatter.cs 解析 PathFormat,把信息填充为运行时信息。 +- *Handler.cs 是各种处理器,处理各种 UEditor 需要的请求。 + +Bin 里面的是应用程序的依赖库,当前依赖 Newtonsoft 的 Json 库。Bin 目录和 App_Code 目录受应用程序保护,不用担心被用户访问到。 + +config.json 是 UEditor 后端的配置文件,上一节已经介绍了比较重要的配置项。 + +controller.ashx 是 UEditor 请求的入口,它把不同的 action 分发到不同的 Handler 来处理。 + +net.sln 是项目的解决方案文件,安装 Visual Studio 2013 或以上的机器可以打开进行项目的改造。 + +README.md 是本说明文件。 + +Web.config 是应用程序的配置文件。 diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Web.config b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Web.config new file mode 100644 index 0000000..992ee52 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/Web.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/config.json b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/config.json new file mode 100644 index 0000000..55d948f --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/config.json @@ -0,0 +1,94 @@ +/* 前后端通信相关的配置,注释只允许使用多行方式 */ +{ + /* 上传图片配置项 */ + "imageActionName": "uploadimage", /* 执行上传图片的action名称 */ + "imageFieldName": "upfile", /* 提交的图片表单名称 */ + "imageMaxSize": 2048000, /* 上传大小限制,单位B */ + "imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */ + "imageCompressEnable": true, /* 是否压缩图片,默认是true */ + "imageCompressBorder": 1600, /* 图片压缩最长边限制 */ + "imageInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "imagePathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + /* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */ + /* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */ + /* {time} 会替换成时间戳 */ + /* {yyyy} 会替换成四位年份 */ + /* {yy} 会替换成两位年份 */ + /* {mm} 会替换成两位月份 */ + /* {dd} 会替换成两位日期 */ + /* {hh} 会替换成两位小时 */ + /* {ii} 会替换成两位分钟 */ + /* {ss} 会替换成两位秒 */ + /* 非法字符 \ : * ? " < > | */ + /* 具请体看线上文档: fex.baidu.com/ueditor/#use-format_upload_filename */ + + /* 涂鸦图片上传配置项 */ + "scrawlActionName": "uploadscrawl", /* 执行上传涂鸦的action名称 */ + "scrawlFieldName": "upfile", /* 提交的图片表单名称 */ + "scrawlPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "scrawlMaxSize": 2048000, /* 上传大小限制,单位B */ + "scrawlUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "scrawlInsertAlign": "none", + + /* 截图工具上传 */ + "snapscreenActionName": "uploadimage", /* 执行上传截图的action名称 */ + "snapscreenPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "snapscreenUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "snapscreenInsertAlign": "none", /* 插入的图片浮动方式 */ + + /* 抓取远程图片配置 */ + "catcherLocalDomain": ["127.0.0.1", "localhost", "img.baidu.com"], + "catcherActionName": "catchimage", /* 执行抓取远程图片的action名称 */ + "catcherFieldName": "source", /* 提交的图片列表表单名称 */ + "catcherPathFormat": "upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "catcherUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "catcherMaxSize": 2048000, /* 上传大小限制,单位B */ + "catcherAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */ + + /* 上传视频配置 */ + "videoActionName": "uploadvideo", /* 执行上传视频的action名称 */ + "videoFieldName": "upfile", /* 提交的视频表单名称 */ + "videoPathFormat": "upload/video/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "videoUrlPrefix": "/ueditor/net/", /* 视频访问路径前缀 */ + "videoMaxSize": 102400000, /* 上传大小限制,单位B,默认100MB */ + "videoAllowFiles": [ + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid"], /* 上传视频格式显示 */ + + /* 上传文件配置 */ + "fileActionName": "uploadfile", /* controller里,执行上传视频的action名称 */ + "fileFieldName": "upfile", /* 提交的文件表单名称 */ + "filePathFormat": "upload/file/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */ + "fileUrlPrefix": "/ueditor/net/", /* 文件访问路径前缀 */ + "fileMaxSize": 51200000, /* 上传大小限制,单位B,默认50MB */ + "fileAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ], /* 上传文件格式显示 */ + + /* 列出指定目录下的图片 */ + "imageManagerActionName": "listimage", /* 执行图片管理的action名称 */ + "imageManagerListPath": "upload/image", /* 指定要列出图片的目录 */ + "imageManagerListSize": 20, /* 每次列出文件数量 */ + "imageManagerUrlPrefix": "/ueditor/net/", /* 图片访问路径前缀 */ + "imageManagerInsertAlign": "none", /* 插入的图片浮动方式 */ + "imageManagerAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */ + + /* 列出指定目录下的文件 */ + "fileManagerActionName": "listfile", /* 执行文件管理的action名称 */ + "fileManagerListPath": "upload/file", /* 指定要列出文件的目录 */ + "fileManagerUrlPrefix": "/ueditor/net/", /* 文件访问路径前缀 */ + "fileManagerListSize": 20, /* 每次列出文件数量 */ + "fileManagerAllowFiles": [ + ".png", ".jpg", ".jpeg", ".gif", ".bmp", + ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", + ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", + ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", + ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml" + ] /* 列出的文件类型 */ + +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/controller.ashx b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/controller.ashx new file mode 100644 index 0000000..320714e --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/controller.ashx @@ -0,0 +1,80 @@ +<%@ WebHandler Language="C#" Class="UEditorHandler" %> + +using System; +using System.Web; +using System.IO; +using System.Collections; +using Newtonsoft.Json; + +public class UEditorHandler : IHttpHandler +{ + public void ProcessRequest(HttpContext context) + { + Handler action = null; + switch (context.Request["action"]) + { + case "config": + action = new ConfigHandler(context); + break; + case "uploadimage": + action = new UploadHandler(context, new UploadConfig() + { + AllowExtensions = Config.GetStringList("imageAllowFiles"), + PathFormat = Config.GetString("imagePathFormat"), + SizeLimit = Config.GetInt("imageMaxSize"), + UploadFieldName = Config.GetString("imageFieldName") + }); + break; + case "uploadscrawl": + action = new UploadHandler(context, new UploadConfig() + { + AllowExtensions = new string[] { ".png" }, + PathFormat = Config.GetString("scrawlPathFormat"), + SizeLimit = Config.GetInt("scrawlMaxSize"), + UploadFieldName = Config.GetString("scrawlFieldName"), + Base64 = true, + Base64Filename = "scrawl.png" + }); + break; + case "uploadvideo": + action = new UploadHandler(context, new UploadConfig() + { + AllowExtensions = Config.GetStringList("videoAllowFiles"), + PathFormat = Config.GetString("videoPathFormat"), + SizeLimit = Config.GetInt("videoMaxSize"), + UploadFieldName = Config.GetString("videoFieldName") + }); + break; + case "uploadfile": + action = new UploadHandler(context, new UploadConfig() + { + AllowExtensions = Config.GetStringList("fileAllowFiles"), + PathFormat = Config.GetString("filePathFormat"), + SizeLimit = Config.GetInt("fileMaxSize"), + UploadFieldName = Config.GetString("fileFieldName") + }); + break; + case "listimage": + action = new ListFileManager(context, Config.GetString("imageManagerListPath"), Config.GetStringList("imageManagerAllowFiles")); + break; + case "listfile": + action = new ListFileManager(context, Config.GetString("fileManagerListPath"), Config.GetStringList("fileManagerAllowFiles")); + break; + case "catchimage": + action = new CrawlerHandler(context); + break; + default: + action = new NotSupportedHandler(context); + break; + } + action.Process(); + } + + public bool IsReusable + { + get + { + return false; + } + } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/net.sln b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/net.sln new file mode 100644 index 0000000..280d399 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/net/net.sln @@ -0,0 +1,38 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "net", "http://localhost:7957", "{36F65A7F-64E7-4E05-BBC2-EAB6E4EDAF30}" + ProjectSection(WebsiteProperties) = preProject + UseIISExpress = "true" + TargetFrameworkMoniker = ".NETFramework,Version%3Dv4.0" + Debug.AspNetCompiler.VirtualPath = "/localhost_7957" + Debug.AspNetCompiler.PhysicalPath = "..\..\..\..\prj\ueditor\net\" + Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\localhost_7957\" + Debug.AspNetCompiler.Updateable = "true" + Debug.AspNetCompiler.ForceOverwrite = "true" + Debug.AspNetCompiler.FixedNames = "false" + Debug.AspNetCompiler.Debug = "True" + Release.AspNetCompiler.VirtualPath = "/localhost_7957" + Release.AspNetCompiler.PhysicalPath = "..\..\..\..\prj\ueditor\net\" + Release.AspNetCompiler.TargetPath = "PrecompiledWeb\localhost_7957\" + Release.AspNetCompiler.Updateable = "true" + Release.AspNetCompiler.ForceOverwrite = "true" + Release.AspNetCompiler.FixedNames = "false" + Release.AspNetCompiler.Debug = "False" + SlnRelativePath = "..\..\..\..\prj\ueditor\net\" + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {36F65A7F-64E7-4E05-BBC2-EAB6E4EDAF30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {36F65A7F-64E7-4E05-BBC2-EAB6E4EDAF30}.Debug|Any CPU.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/css/ueditor.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/css/ueditor.css new file mode 100644 index 0000000..44ae805 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/css/ueditor.css @@ -0,0 +1,1903 @@ +/*基础UI构建 +*/ +/* common layer */ +.edui-default .edui-box { + border: none; + padding: 0; + margin: 0; + overflow: hidden; +} + +.edui-default a.edui-box { + display: block; + text-decoration: none; + color: black; +} + +.edui-default a.edui-box:hover { + text-decoration: none; +} + +.edui-default a.edui-box:active { + text-decoration: none; +} + +.edui-default table.edui-box { + border-collapse: collapse; +} + +.edui-default ul.edui-box { + list-style-type: none; +} + +div.edui-box { + position: relative; + display: -moz-inline-box !important; + display: inline-block !important; + vertical-align: top; +} + +.edui-default .edui-clearfix { + zoom: 1 +} + +.edui-default .edui-clearfix:after { + content: '\20'; + display: block; + clear: both; +} + + * html div.edui-box { + display: inline !important; +} + +*:first-child+html div.edui-box { + display: inline !important; +} + +/* control layout */ +.edui-default .edui-button-body, .edui-splitbutton-body, .edui-menubutton-body, .edui-combox-body { + position: relative; +} + +.edui-default .edui-popup { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; +} + +.edui-default .edui-popup .edui-shadow { + position: absolute; + z-index: -1; +} + +.edui-default .edui-popup .edui-bordereraser { + position: absolute; + overflow: hidden; +} + +.edui-default .edui-tablepicker .edui-canvas { + position: relative; +} + +.edui-default .edui-tablepicker .edui-canvas .edui-overlay { + position: absolute; +} + +.edui-default .edui-dialog-modalmask, .edui-dialog-dragmask { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-toolbar { + position: relative; +} + +/* + * default theme + */ +.edui-default .edui-label { + cursor: default; +} + +.edui-default span.edui-clickable { + color: blue; + cursor: pointer; + text-decoration: underline; +} + +.edui-default span.edui-unclickable { + color: gray; + cursor: default; +} +/* 工具栏 */ +.edui-default .edui-toolbar { + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + padding: 1px; + overflow: hidden; /*全屏下单独一行不占位*/ + zoom: 1; + width:auto; + height:auto; +} + +.edui-default .edui-toolbar .edui-button, +.edui-default .edui-toolbar .edui-splitbutton, +.edui-default .edui-toolbar .edui-menubutton, +.edui-default .edui-toolbar .edui-combox { + margin: 1px; +} +/*UI工具栏、编辑区域、底部*/ +.edui-default .edui-editor { + border: 1px solid #d4d4d4; + background-color: white; + position: relative; + overflow: visible; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.edui-editor div{ + width:auto; + height:auto; +} +.edui-default .edui-editor-toolbarbox { + position: relative; + zoom: 1; + -webkit-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + -moz-box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + box-shadow:0 1px 4px rgba(204, 204, 204, 0.6); + border-top-left-radius:2px; + border-top-right-radius:2px; +} + +.edui-default .edui-editor-toolbarboxouter { + border-bottom: 1px solid #d4d4d4; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + /*border: 1px solid #d4d4d4;*/ + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.edui-default .edui-editor-toolbarboxinner { + padding: 2px; +} + +.edui-default .edui-editor-iframeholder { + position: relative; + /*for fix ie6 toolbarmsg under iframe bug. relative -> static */ + /*_position: static !important;* +} + +.edui-default .edui-editor-iframeholder textarea { + font-family: consolas, "Courier New", "lucida console", monospace; + font-size: 12px; + line-height: 18px; +} + +.edui-default .edui-editor-bottombar { + /*border-top: 1px solid #ccc;*/ + /*height: 20px;*/ + /*width: 40%;*/ + /*float: left;*/ + /*overflow: hidden;*/ +} + +.edui-default .edui-editor-bottomContainer { + overflow: hidden; +} + +.edui-default .edui-editor-bottomContainer table { + width: 100%; + height: 0; + overflow: hidden; + border-spacing: 0; +} + +.edui-default .edui-editor-bottomContainer td { + white-space: nowrap; + border-top: 1px solid #ccc; + line-height: 20px; + font-size: 12px; + font-family: Arial, Helvetica, Tahoma, Verdana, Sans-Serif; +} + +.edui-default .edui-editor-wordcount { + text-align: right; + margin-right: 5px; + color: #aaa; +} +.edui-default .edui-editor-scale { + width: 12px; +} +.edui-default .edui-editor-scale .edui-editor-icon { + float: right; + width: 100%; + height: 12px; + margin-top: 10px; + background: url(../images/scale.png) no-repeat; + cursor: se-resize; +} +.edui-default .edui-editor-breadcrumb { + margin: 2px 0 0 3px; +} + +.edui-default .edui-editor-breadcrumb span { + cursor: pointer; + text-decoration: underline; + color: blue; +} + +.edui-default .edui-toolbar .edui-for-fullscreen { + float: right; +} + +.edui-default .edui-bubble .edui-popup-content { + border: 1px solid #DCAC6C; + background-color: #fff6d9; + padding: 5px; + font-size: 10pt; + font-family: "宋体"; +} + +.edui-default .edui-bubble .edui-shadow { + /*box-shadow: 1px 1px 3px #818181;*/ + /*-webkit-box-shadow: 2px 2px 3px #818181;*/ + /*-moz-box-shadow: 2px 2px 3px #818181;*/ + /*filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius = '2', MakeShadow = 'true', ShadowOpacity = '0.5');*/ +} + +.edui-default .edui-editor-toolbarmsg { + background-color: #FFF6D9; + border-bottom: 1px solid #ccc; + position: absolute; + bottom: -25px; + left: 0; + z-index: 1009; + width: 99.9%; +} + +.edui-default .edui-editor-toolbarmsg-upload { + font-size: 14px; + color: blue; + width: 100px; + height: 16px; + line-height: 16px; + cursor: pointer; + position: absolute; + top: 5px; + left: 350px; +} + +.edui-default .edui-editor-toolbarmsg-label { + font-size: 12px; + line-height: 16px; + padding: 4px; +} + +.edui-default .edui-editor-toolbarmsg-close { + float: right; + width: 20px; + height: 16px; + line-height: 16px; + cursor: pointer; + color: red; +} +/*可选中菜单按钮*/ +.edui-default .edui-list .edui-bordereraser { + display: none; +} + +.edui-default .edui-listitem { + padding: 1px; + white-space: nowrap; +} + +.edui-default .edui-list .edui-state-hover { + position: relative; + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-for-fontfamily .edui-listitem-label { + min-width: 130px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-default .edui-for-insertcode .edui-listitem-label { + min-width: 120px; + _width: 120px; + font-size: 12px; + height: 22px; + line-height: 22px; + padding-left: 5px; +} +.edui-default .edui-for-underline .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + font-size: 12px; +} + +.edui-default .edui-for-fontsize .edui-listitem-label { + min-width: 120px; + _width: 120px; + padding: 3px 5px; + +} + +.edui-default .edui-for-paragraph .edui-listitem-label { + min-width: 200px; + _width: 200px; + padding: 2px 5px; +} + +.edui-default .edui-for-rowspacingtop .edui-listitem-label, +.edui-default .edui-for-rowspacingbottom .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-lineheight .edui-listitem-label { + min-width: 53px; + _width: 53px; + padding: 2px 5px; +} + +.edui-default .edui-for-customstyle .edui-listitem-label { + min-width: 200px; + _width: 200px; + width: 200px !important; + padding: 2px 5px; +} +/* 可选中按钮弹出菜单*/ +.edui-default .edui-menu { + z-index: 3000; +} + +.edui-default .edui-menu .edui-popup-content { + padding: 3px; +} + +.edui-default .edui-menu-body { + _width: 150px; + min-width: 170px; + background: url("../images/sparator_v.png") repeat-y 25px; +} + +.edui-default .edui-menuitem-body { +} + +.edui-default .edui-menuitem { + height: 20px; + cursor: default; + vertical-align: top; +} + +.edui-default .edui-menuitem .edui-icon { + width: 20px !important; + height: 20px !important; + background: url(../images/icons.png) 0 -4000px; + background: url(../images/icons.gif) 0 -4000px\9; +} + +.edui-default .edui-menuitem .edui-label { + font-size: 12px; + line-height: 20px; + height: 20px; + padding-left: 10px; +} + +.edui-default .edui-state-checked .edui-menuitem-body { + background: url("../images/icons-all.gif") no-repeat 6px -205px; +} + +.edui-default .edui-state-disabled .edui-menuitem-label { + color: gray; +} + + +/*不可选中菜单按钮 */ +.edui-default .edui-toolbar .edui-combox-body .edui-button-body { + width: 60px; + font-size: 12px; + height: 20px; + line-height: 20px; + padding-left: 5px; + white-space: nowrap; + margin: 0 3px 0 0; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-combox .edui-combox-body { + border: 1px solid #CCC; + background-color: white; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-splitborder { + display: none; +} + +.edui-default .edui-toolbar .edui-combox-body .edui-arrow { + border-left: 1px solid #CCC; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow { + border-left: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-checked .edui-combox-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow { + border-left: 1px solid #DCAC6C; +} + +.edui-toolbar .edui-state-disabled .edui-combox-body { + background-color: #F0F0EE; + opacity: 0.3; + filter: alpha(opacity = 30); +} + +.edui-toolbar .edui-state-opened .edui-combox-body { + background-color: white; + border: 1px solid gray; +} +/*普通按钮样式及状态*/ +.edui-default .edui-toolbar .edui-button .edui-icon, +.edui-default .edui-toolbar .edui-menubutton .edui-icon, +.edui-default .edui-toolbar .edui-splitbutton .edui-icon { + height: 20px !important; + width: 20px !important; + background-image: url(../images/icons.png); + background-image: url(../images/icons.gif) \9; +} + +.edui-default .edui-toolbar .edui-button .edui-button-wrap { + padding: 1px; + position: relative; +} + +.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap { + background-color: #fff5d4; + padding: 0; + border: 1px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap { + background-color: #ffe69f; + padding: 0; + border: 1px solid #dcac6c; + border-radius: 2px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; +} + +.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap { + background-color: #ffffff; + padding: 0; + border: 1px solid gray; +} +.edui-default .edui-toolbar .edui-state-disabled .edui-label { + color: #ccc; +} +.edui-default .edui-toolbar .edui-state-disabled .edui-icon { + opacity: 0.3; + filter: alpha(opacity = 30); +} + +/* toolbar icons */ +.edui-default .edui-for-undo .edui-icon { + background-position: -160px 0; +} + +.edui-default .edui-for-redo .edui-icon { + background-position: -100px 0; +} + +.edui-default .edui-for-bold .edui-icon { + background-position: 0 0; +} + +.edui-default .edui-for-italic .edui-icon { + background-position: -60px 0; +} + +.edui-default .edui-for-fontborder .edui-icon { + background-position:-160px -40px; +} +.edui-default .edui-for-underline .edui-icon { + background-position: -140px 0; +} + +.edui-default .edui-for-strikethrough .edui-icon { + background-position: -120px 0; +} + +.edui-default .edui-for-subscript .edui-icon { + background-position: -600px 0; +} + +.edui-default .edui-for-superscript .edui-icon { + background-position: -620px 0; +} + +.edui-default .edui-for-blockquote .edui-icon { + background-position: -220px 0; +} + +.edui-default .edui-for-forecolor .edui-icon { + background-position: -720px 0; +} + +.edui-default .edui-for-backcolor .edui-icon { + background-position: -760px 0; +} + +.edui-default .edui-for-inserttable .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-autotypeset .edui-icon { + background-position: -640px -40px; +} + +.edui-default .edui-for-justifyleft .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-justifycenter .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-justifyright .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-justifyjustify .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-insertorderedlist .edui-icon { + background-position: -80px 0; +} + +.edui-default .edui-for-insertunorderedlist .edui-icon { + background-position: -20px 0; +} + +.edui-default .edui-for-lineheight .edui-icon { + background-position: -725px -40px; +} + +.edui-default .edui-for-rowspacingbottom .edui-icon { + background-position: -745px -40px; +} + +.edui-default .edui-for-rowspacingtop .edui-icon { + background-position: -765px -40px; +} + +.edui-default .edui-for-horizontal .edui-icon { + background-position: -360px 0; +} + +.edui-default .edui-for-link .edui-icon { + background-position: -500px 0; +} + +.edui-default .edui-for-code .edui-icon { + background-position: -440px -40px; +} + +.edui-default .edui-for-insertimage .edui-icon { + background-position: -726px -77px; +} + +.edui-default .edui-for-insertframe .edui-icon { + background-position: -240px -40px; +} + +.edui-default .edui-for-emoticon .edui-icon { + background-position: -60px -20px; +} + +.edui-default .edui-for-spechars .edui-icon { + background-position: -240px 0; +} + +.edui-default .edui-for-help .edui-icon { + background-position: -340px 0; +} + +.edui-default .edui-for-print .edui-icon { + background-position: -440px -20px; +} + +.edui-default .edui-for-preview .edui-icon { + background-position: -420px -20px; +} + +.edui-default .edui-for-selectall .edui-icon { + background-position: -400px -20px; +} + +.edui-default .edui-for-searchreplace .edui-icon { + background-position: -520px -20px; +} + +.edui-default .edui-for-map .edui-icon { + background-position: -40px -40px; +} + +.edui-default .edui-for-gmap .edui-icon { + background-position: -260px -40px; +} + +.edui-default .edui-for-insertvideo .edui-icon { + background-position: -320px -20px; +} + +.edui-default .edui-for-time .edui-icon { + background-position: -160px -20px; +} + +.edui-default .edui-for-date .edui-icon { + background-position: -140px -20px; +} + +.edui-default .edui-for-cut .edui-icon { + background-position: -680px 0; +} + +.edui-default .edui-for-copy .edui-icon { + background-position: -700px 0; +} + +.edui-default .edui-for-paste .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-formatmatch .edui-icon { + background-position: -40px 0; +} + +.edui-default .edui-for-pasteplain .edui-icon { + background-position: -360px -20px; +} + +.edui-default .edui-for-directionalityltr .edui-icon { + background-position: -20px -20px; +} + +.edui-default .edui-for-directionalityrtl .edui-icon { + background-position: -40px -20px; +} + +.edui-default .edui-for-source .edui-icon { + background-position: -261px -0px; +} + +.edui-default .edui-for-removeformat .edui-icon { + background-position: -580px 0; +} + +.edui-default .edui-for-unlink .edui-icon { + background-position: -640px 0; +} + +.edui-default .edui-for-touppercase .edui-icon { + background-position: -786px 0; +} + +.edui-default .edui-for-tolowercase .edui-icon { + background-position: -806px 0; +} + +.edui-default .edui-for-insertrow .edui-icon { + background-position: -478px -76px; +} + +.edui-default .edui-for-insertrownext .edui-icon { + background-position: -498px -76px; +} + +.edui-default .edui-for-insertcol .edui-icon { + background-position: -455px -76px; +} + +.edui-default .edui-for-insertcolnext .edui-icon { + background-position: -429px -76px; +} + +.edui-default .edui-for-mergeright .edui-icon { + background-position: -60px -40px; +} + +.edui-default .edui-for-mergedown .edui-icon { + background-position: -80px -40px; +} + +.edui-default .edui-for-splittorows .edui-icon { + background-position: -100px -40px; +} + +.edui-default .edui-for-splittocols .edui-icon { + background-position: -120px -40px; +} + +.edui-default .edui-for-insertparagraphbeforetable .edui-icon { + background-position: -140px -40px; +} + +.edui-default .edui-for-deleterow .edui-icon { + background-position: -660px -20px; +} + +.edui-default .edui-for-deletecol .edui-icon { + background-position: -640px -20px; +} + +.edui-default .edui-for-splittocells .edui-icon { + background-position: -800px -20px; +} + +.edui-default .edui-for-mergecells .edui-icon { + background-position: -760px -20px; +} + +.edui-default .edui-for-deletetable .edui-icon { + background-position: -620px -20px; +} + +.edui-default .edui-for-cleardoc .edui-icon { + background-position: -520px 0; +} + +.edui-default .edui-for-fullscreen .edui-icon { + background-position: -100px -20px; +} + +.edui-default .edui-for-anchor .edui-icon { + background-position: -200px 0; +} + +.edui-default .edui-for-pagebreak .edui-icon { + background-position: -460px -40px; +} + +.edui-default .edui-for-imagenone .edui-icon { + background-position: -480px -40px; +} + +.edui-default .edui-for-imageleft .edui-icon { + background-position: -500px -40px; +} + +.edui-default .edui-for-wordimage .edui-icon { + background-position: -660px -40px; +} + +.edui-default .edui-for-imageright .edui-icon { + background-position: -520px -40px; +} + +.edui-default .edui-for-imagecenter .edui-icon { + background-position: -540px -40px; +} + +.edui-default .edui-for-indent .edui-icon { + background-position: -400px 0; +} + +.edui-default .edui-for-outdent .edui-icon { + background-position: -540px 0; +} + +.edui-default .edui-for-webapp .edui-icon { + background-position: -601px -40px +} + +.edui-default .edui-for-table .edui-icon { + background-position: -580px -20px; +} + +.edui-default .edui-for-edittable .edui-icon { + background-position: -420px -40px; +} + +.edui-default .edui-for-template .edui-icon { + background-position: -339px -40px; +} + +.edui-default .edui-for-delete .edui-icon { + background-position: -360px -40px; +} + +.edui-default .edui-for-attachment .edui-icon { + background-position: -620px -40px; +} + +.edui-default .edui-for-edittd .edui-icon { + background-position: -700px -40px; +} + +.edui-default .edui-for-snapscreen .edui-icon { + background-position: -581px -40px +} + +.edui-default .edui-for-scrawl .edui-icon { + background-position: -801px -41px +} + +.edui-default .edui-for-background .edui-icon { + background-position: -680px -40px; +} + +.edui-default .edui-for-music .edui-icon { + background-position: -18px -40px +} + +.edui-default .edui-for-formula .edui-icon { + background-position: -200px -40px +} + +.edui-default .edui-for-aligntd .edui-icon { + background-position: -236px -76px; +} + +.edui-default .edui-for-insertparagraphtrue .edui-icon { + background-position: -625px -76px; +} + +.edui-default .edui-for-insertparagraph .edui-icon { + background-position: -602px -76px; +} + +.edui-default .edui-for-insertcaption .edui-icon { + background-position: -336px -76px; +} + +.edui-default .edui-for-deletecaption .edui-icon { + background-position: -362px -76px; +} + +.edui-default .edui-for-inserttitle .edui-icon { + background-position: -286px -76px; +} + +.edui-default .edui-for-deletetitle .edui-icon { + background-position: -311px -76px; +} + +.edui-default .edui-for-aligntable .edui-icon { + background-position: -440px 0; +} + +.edui-default .edui-for-tablealignment-left .edui-icon { + background-position: -460px 0; +} + +.edui-default .edui-for-tablealignment-center .edui-icon { + background-position: -420px 0; +} + +.edui-default .edui-for-tablealignment-right .edui-icon { + background-position: -480px 0; +} + +.edui-default .edui-for-drafts .edui-icon { + background-position: -560px 0; +} + +.edui-default .edui-for-charts .edui-icon { + background: url( ../images/charts.png ) no-repeat 2px 3px!important; +} + +.edui-default .edui-for-inserttitlecol .edui-icon { + background-position: -673px -76px; +} + +.edui-default .edui-for-deletetitlecol .edui-icon { + background-position: -698px -76px; +} + +.edui-default .edui-for-simpleupload .edui-icon { + background-position: -380px 0px; +} +/*splitbutton*/ +.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow, +.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow { + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; + height: 20px; + width: 9px; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body { + padding: 1px; +} + +.edui-default .edui-toolbar .edui-splitborder { + width: 1px; + height: 20px; +} + +.edui-default .edui-toolbar .edui-state-hover .edui-splitborder { + width: 1px; + border-left: 0px solid #dcac6c; +} + +.edui-default .edui-toolbar .edui-state-active .edui-splitborder { + width: 0; + border-left: 1px solid gray; +} + +.edui-default .edui-toolbar .edui-state-opened .edui-splitborder { + width: 1px; + border: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body { + background-color: #fff5d4; + border: 1px solid #dcac6c; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body { + background-color: #FFE69F; + border: 1px solid #DCAC6C; + padding: 0; +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body { + background-color: #ffffff; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-state-disabled .edui-arrow { + opacity: 0.3; + _filter: alpha(opacity = 30); +} + +.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body, +.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body { + background-color: white; + border: 1px solid gray; + padding: 0; +} + +.edui-default .edui-for-insertorderedlist .edui-bordereraser, +.edui-default .edui-for-lineheight .edui-bordereraser, +.edui-default .edui-for-rowspacingtop .edui-bordereraser, +.edui-default .edui-for-rowspacingbottom .edui-bordereraser, +.edui-default .edui-for-insertunorderedlist .edui-bordereraser { + background-color: white; +} + +/* 解决嵌套导致的图标问题 */ +.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon, +.edui-default .edui-for-lineheight .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon, +.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon, +.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon { + /*background-position: 0 -40px;*/ + background-image: none ; +} + +/* 弹出菜单 */ +.edui-default .edui-popup { + z-index: 3000; + background-color: #ffffff; + width:auto; + height:auto; + +} + +.edui-default .edui-popup .edui-shadow { + left: 0; + top: 0; + width: 100%; + height: 100%; +} + +.edui-default .edui-popup-content { + border:1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 4px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + padding: 5px; + background:#ffffff; +} + +.edui-default .edui-popup .edui-bordereraser { + background-color: white; + height: 3px; +} + +.edui-default .edui-menu .edui-bordereraser { + height: 3px; +} + +.edui-default .edui-anchor-topleft .edui-bordereraser { + left: 1px; + top: -2px; +} + +.edui-default .edui-anchor-topright .edui-bordereraser { + right: 1px; + top: -2px; +} + +.edui-default .edui-anchor-bottomleft .edui-bordereraser { + left: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-default .edui-anchor-bottomright .edui-bordereraser { + right: 0; + bottom: -6px; + height: 7px; + border-left: 1px solid gray; + border-right: 1px solid gray; +} + +.edui-popup div{ + width:auto; + height:auto; +} +.edui-default .edui-editor-messageholder { + display: block; + width: 150px; + height: auto; + border: 0; + margin: 0; + padding: 0; + position: absolute; + top: 28px; + right: 3px; +} + +.edui-default .edui-message{ + min-height: 10px; + text-shadow: 0 1px 0 rgba(255,255,255,0.5); + padding: 0; + margin-bottom: 3px; + position: relative; +} +.edui-default .edui-message-body{ + border-radius: 3px; + padding: 8px 15px 8px 8px; + color: #c09853; + background-color: #fcf8e3; + border: 1px solid #fbeed5; +} +.edui-default .edui-message-type-info{ + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1 +} +.edui-default .edui-message-type-success{ + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6 +} +.edui-default .edui-message-type-danger, +.edui-default .edui-message-type-error{ + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7 +} +.edui-default .edui-message .edui-message-closer { + display: block; + width: 16px; + height: 16px; + line-height: 16px; + position: absolute; + top: 0; + right: 0; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + float: right; + font-size: 20px; + font-weight: bold; + color: #999; + text-shadow: 0 1px 0 #fff; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; +} +.edui-default .edui-message .edui-message-content { + font-size: 10pt; + word-wrap: break-word; + word-break: normal; +} +/* 弹出对话框按钮和对话框大小 */ +.edui-default .edui-dialog { + z-index: 2000; + position: absolute; + +} + +.edui-dialog div{ + width:auto; +} + +.edui-default .edui-dialog-wrap { + margin-right: 6px; + margin-bottom: 6px; +} + +.edui-default .edui-dialog-fullscreen-flag { + margin-right: 0; + margin-bottom: 0; +} + +.edui-default .edui-dialog-body { + position: relative; + padding:2px 0 0 2px; + _zoom: 1; +} + +.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body { + padding: 0; +} + +.edui-default .edui-dialog-shadow { + position: absolute; + z-index: -1; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.edui-default .edui-dialog-foot { + background-color: white; +} + +.edui-default .edui-dialog-titlebar { + height: 26px; + border-bottom: 1px solid #c6c6c6; + background: url(../images/dialog-title-bg.png) repeat-x bottom; + position: relative; + cursor: move; +} +.edui-default .edui-dialog-caption { + font-weight: bold; + font-size: 12px; + line-height: 26px; + padding-left: 5px; +} + +.edui-default .edui-dialog-draghandle { + height: 26px; +} + +.edui-default .edui-dialog-closebutton { + position: absolute !important; + right: 5px; + top: 3px; +} + +.edui-default .edui-dialog-closebutton .edui-button-body { + height: 20px; + width: 20px; + cursor: pointer; + background: url("../images/icons-all.gif") no-repeat 0 -59px; +} + +.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -89px; +} + +.edui-default .edui-dialog-foot { + height: 40px; +} + +.edui-default .edui-dialog-buttons { + position: absolute; + right: 0; +} + +.edui-default .edui-dialog-buttons .edui-button { + margin-right: 10px; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-button-body { + background: url("../images/icons-all.gif") no-repeat; + height: 24px; + width: 96px; + font-size: 12px; + line-height: 24px; + text-align: center; + cursor: default; +} + +.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body { + background: url("../images/icons-all.gif") no-repeat 0 -30px; +} + +.edui-default .edui-dialog iframe { + border: 0; + padding: 0; + margin: 0; + vertical-align: top; +} + +.edui-default .edui-dialog-modalmask { + opacity: 0.3; + filter: alpha(opacity = 30); + background-color: #ccc; + position: absolute; + /*z-index: 1999;*/ +} + +.edui-default .edui-dialog-dragmask { + position: absolute; + /*z-index: 2001;*/ + background-color: transparent; + cursor: move; +} + +.edui-default .edui-dialog-content { + position: relative; +} + +.edui-default .dialogcontmask { + cursor: move; + visibility: hidden; + display: block; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + filter: alpha(opacity = 0); +} + +/*link-dialog*/ +.edui-default .edui-for-link .edui-dialog-content { + width: 420px; + height: 200px; + overflow: hidden; +} +/*background-dialog*/ +.edui-default .edui-for-background .edui-dialog-content { + width: 440px; + height: 280px; + overflow: hidden; +} + +/*template-dialog*/ +.edui-default .edui-for-template .edui-dialog-content { + width: 630px; + height: 390px; + overflow: hidden; +} + +/*scrawl-dialog*/ +.edui-default .edui-for-scrawl .edui-dialog-content { + width: 515px; + *width: 506px; + height: 360px; +} + +/*spechars-dialog*/ +.edui-default .edui-for-spechars .edui-dialog-content { + width: 620px; + height: 500px; + *width: 630px; + *height: 570px; +} + +/*image-dialog*/ +.edui-default .edui-for-insertimage .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} +/*webapp-dialog*/ +.edui-default .edui-for-webapp .edui-dialog-content { + width: 560px; + _width: 565px; + height: 450px; + overflow: hidden; +} + +/*image-insertframe*/ +.edui-default .edui-for-insertframe .edui-dialog-content { + width: 350px; + height: 200px; + overflow: hidden; +} + +/*wordImage-dialog*/ +.edui-default .edui-for-wordimage .edui-dialog-content { + width: 620px; + height: 380px; + overflow: hidden; +} + +/*attachment-dialog*/ +.edui-default .edui-for-attachment .edui-dialog-content { + width: 650px; + height: 400px; + overflow: hidden; +} + + +/*map-dialog*/ +.edui-default .edui-for-map .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*gmap-dialog*/ +.edui-default .edui-for-gmap .edui-dialog-content { + width: 550px; + height: 400px; +} + +/*video-dialog*/ +.edui-default .edui-for-insertvideo .edui-dialog-content { + width: 590px; + height: 390px; +} + +/*anchor-dialog*/ +.edui-default .edui-for-anchor .edui-dialog-content { + width: 320px; + height: 60px; + overflow: hidden; +} + +/*searchreplace-dialog*/ +.edui-default .edui-for-searchreplace .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*help-dialog*/ +.edui-default .edui-for-help .edui-dialog-content { + width: 400px; + height: 420px; +} + +/*edittable-dialog*/ +.edui-default .edui-for-edittable .edui-dialog-content { + width: 540px; + _width:590px; + height: 335px; +} + +/*edittip-dialog*/ +.edui-default .edui-for-edittip .edui-dialog-content { + width: 225px; + height: 60px; +} + +/*edittd-dialog*/ +.edui-default .edui-for-edittd .edui-dialog-content { + width: 240px; + height: 50px; +} +/*snapscreen-dialog*/ +.edui-default .edui-for-snapscreen .edui-dialog-content { + width: 400px; + height: 220px; +} + +/*music-dialog*/ +.edui-default .edui-for-music .edui-dialog-content { + width: 515px; + height: 360px; +} + +/*段落弹出菜单*/ +.edui-default .edui-for-paragraph .edui-listitem-label { + font-family: Tahoma, Verdana, Arial, Helvetica; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p { + font-size: 22px; + line-height: 27px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1 { + font-weight: bolder; + font-size: 32px; + line-height: 36px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2 { + font-weight: bolder; + font-size: 27px; + line-height: 29px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3 { + font-weight: bolder; + font-size: 19px; + line-height: 23px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4 { + font-weight: bolder; + font-size: 16px; + line-height: 19px +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5 { + font-weight: bolder; + font-size: 13px; + line-height: 16px; +} + +.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6 { + font-weight: bolder; + font-size: 12px; + line-height: 14px; +} +/* 表格弹出菜单 */ +.edui-default .edui-for-inserttable .edui-splitborder { + display: none +} +.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow { + width: 0 +} +.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{ + border-left: 1px solid transparent; +} +.edui-default .edui-tablepicker .edui-infoarea { + height: 14px; + line-height: 14px; + font-size: 12px; + width: 220px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-label { + float: left; +} + +.edui-default .edui-dialog-buttons .edui-label { + line-height: 24px; +} + +.edui-default .edui-tablepicker .edui-infoarea .edui-clickable { + float: right; +} + +.edui-default .edui-tablepicker .edui-pickarea { + background: url("../images/unhighlighted.gif") repeat; + height: 220px; + width: 220px; +} + +.edui-default .edui-tablepicker .edui-pickarea .edui-overlay { + background: url("../images/highlighted.gif") repeat; +} + +/* 颜色弹出菜单 */ +.edui-default .edui-colorpicker-topbar { + height: 27px; + width: 200px; + /*border-bottom: 1px gray dashed;*/ +} + +.edui-default .edui-colorpicker-preview { + height: 20px; + border: 1px inset black; + margin-left: 1px; + width: 128px; + float: left; +} + +.edui-default .edui-colorpicker-nocolor { + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 14px; + height: 14px; + border: 1px solid #333; + padding: 3px 5px; + cursor: pointer; +} + +.edui-default .edui-colorpicker-tablefirstrow { + height: 30px; +} + +.edui-default .edui-colorpicker-colorcell { + width: 14px; + height: 14px; + display: block; + margin: 0; + cursor: pointer; +} + +.edui-default .edui-colorpicker-colorcell:hover { + width: 14px; + height: 14px; + margin: 0; +} +.edui-default .edui-colorpicker-advbtn{ + display: block; + text-align: center; + cursor: pointer; + height:20px; +} +.arrow_down{ + background: white url('../images/arrow_down.png') no-repeat center; +} +.arrow_up{ + background: white url('../images/arrow_up.png') no-repeat center; +} +/*高级的样式*/ +.edui-colorpicker-adv{ + position: relative; + overflow: hidden; + height: 180px; + display: none; +} +.edui-colorpicker-plant, .edui-colorpicker-hue { + border: solid 1px #666; +} +.edui-colorpicker-pad { + width: 150px; + height: 150px; + left: 14px; + top: 13px; + position: absolute; + background: red; + overflow: hidden; + cursor: crosshair; +} +.edui-colorpicker-cover{ + position: absolute; + top: 0; + left: 0; + width: 150px; + height: 150px; + background: url("../images/tangram-colorpicker.png") -160px -200px; +} +.edui-colorpicker-padDot{ + position: absolute; + top: 0; + left: 0; + width: 11px; + height: 11px; + overflow: hidden; + background: url(../images/tangram-colorpicker.png) 0px -200px repeat-x; + z-index: 1000; + +} +.edui-colorpicker-sliderMain { + position: absolute; + left: 171px; + top: 13px; + width: 19px; + height: 152px; + background: url(../images/tangram-colorpicker.png) -179px -12px no-repeat; + +} +.edui-colorpicker-slider { + width: 100%; + height: 100%; + cursor: pointer; +} +.edui-colorpicker-thumb{ + position: absolute; + top: 0; + cursor: pointer; + height: 3px; + left: -1px; + right: -1px; + border: 1px solid black; + background: white; + opacity: .8; +} +/*自动排版弹出菜单*/ +.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body { + font-size: 12px; + margin-bottom: 3px; + clear: both; +} + +.edui-default .edui-autotypesetpicker-body table { + border-collapse: separate; + border-spacing: 2px; +} + +.edui-default .edui-autotypesetpicker-body td { + font-size: 12px; + word-wrap:break-word; +} + +.edui-default .edui-autotypesetpicker-body td input { + margin: 3px 3px 3px 4px; + *margin: 1px 0 0 0; +} +/*自动排版弹出菜单*/ +.edui-default .edui-cellalignpicker .edui-cellalignpicker-body { + width: 70px; + font-size: 12px; + cursor: default; +} + +.edui-default .edui-cellalignpicker-body table { + border-collapse: separate; + border-spacing: 0; +} +.edui-default .edui-cellalignpicker-body td{ + padding: 1px; +} +.edui-default .edui-cellalignpicker-body .edui-icon{ + height: 20px; + width: 20px; + padding: 1px; + background-image: url(../images/table-cell-align.png); +} + +.edui-default .edui-cellalignpicker-body .edui-left{ + background-position: 0 0; +} + +.edui-default .edui-cellalignpicker-body .edui-center{ + background-position: -25px 0; +} +.edui-default .edui-cellalignpicker-body .edui-right{ + background-position: -51px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{ + background-position: -73px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{ + background-position: -98px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{ + background-position: -124px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left { + background-position: -146px 0; + background-color: #f1f4f5; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center { + background-position: -245px 0; +} + +.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right { + background-position: -271px 0; +} +/*分隔线*/ +.edui-default .edui-toolbar .edui-separator { + width: 2px; + height: 20px; + margin: 2px 4px 2px 3px; + background: url(../images/icons.png) -181px 0; + background: url(../images/icons.gif) -181px 0 \9; +} + +/*颜色按钮 */ +.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump { + position: absolute; + overflow: hidden; + bottom: 1px; + left: 1px; + width: 18px; + height: 4px; +} +/*表情按钮及弹出菜单*/ +/*去除了表情的下拉箭头*/ +.edui-default .edui-for-emotion .edui-icon { + background-position: -60px -20px; +} +.edui-default .edui-for-emotion .edui-popup-content iframe +{ + width: 514px; + height: 380px; + overflow: hidden; +} +.edui-default .edui-for-emotion .edui-popup-content +{ + position: relative; + z-index: 555 +} + +.edui-default .edui-for-emotion .edui-splitborder { + display: none +} + +.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow +{ + width: 0 +} +.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder +{ + border-left: 1px solid transparent; +} +/*contextmenu*/ +.edui-default .edui-hassubmenu .edui-arrow { + height: 20px; + width: 20px; + float: right; + background: url("../images/icons-all.gif") no-repeat 10px -233px; +} + +.edui-default .edui-menu-body .edui-menuitem { + padding: 1px; +} + +.edui-default .edui-menuseparator { + margin: 2px 0; + height: 1px; + overflow: hidden; +} + +.edui-default .edui-menuseparator-inner { + border-bottom: 1px solid #e2e3e3; + margin-left: 29px; + margin-right: 1px; +} + +.edui-default .edui-menu-body .edui-state-hover { + padding: 0 !important; + background-color: #fff5d4; + border: 1px solid #dcac6c; +} +/*弹出菜单*/ +.edui-default .edui-shortcutmenu { + padding: 2px; + width: 190px; + height: 50px; + background-color: #fff; + border: 1px solid #ccc; + border-radius: 5px; +} + +/*粘贴弹出菜单*/ +.edui-default .edui-wordpastepop .edui-popup-content{ + border: none; + padding: 0; + width: 54px; + height: 21px; +} +.edui-default .edui-pasteicon { + width: 100%; + height: 100%; + background-image: url('../images/wordpaste.png'); + background-position: 0 0; +} + +.edui-default .edui-pasteicon.edui-state-opened { + background-position: 0 -34px; +} + +.edui-default .edui-pastecontainer { + position: relative; + visibility: hidden; + width: 97px; + background: #fff; + border: 1px solid #ccc; +} + +.edui-default .edui-pastecontainer .edui-title { + font-weight: bold; + background: #F8F8FF; + height: 25px; + line-height: 25px; + font-size: 12px; + padding-left: 5px; +} + +.edui-default .edui-pastecontainer .edui-button { + overflow: hidden; + margin: 3px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon, +.edui-default .edui-pastecontainer .edui-button .edui-tagicon, +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{ + float: left; + cursor: pointer; + width: 29px; + height: 29px; + margin-left: 5px; + background-image: url('../images/wordpaste.png'); + background-repeat: no-repeat; +} +.edui-default .edui-pastecontainer .edui-button .edui-richtxticon { + margin-left: 0; + background-position: -109px 0; +} +.edui-default .edui-pastecontainer .edui-button .edui-tagicon { + background-position: -148px 1px; +} + +.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon { + background-position: -72px 0; +} + +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon { + background-position: -109px -34px; +} +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{ + background-position: -148px -34px; +} +.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{ + background-position: -72px -34px; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/css/ueditor.min.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/css/ueditor.min.css new file mode 100644 index 0000000..eb2e7af --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/css/ueditor.min.css @@ -0,0 +1,8 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:16 GMT+0800 (CST) + */ + + +.edui-default .edui-box{border:0;padding:0;margin:0;overflow:hidden}.edui-default a.edui-box{display:block;text-decoration:none;color:#000}.edui-default a.edui-box:hover{text-decoration:none}.edui-default a.edui-box:active{text-decoration:none}.edui-default table.edui-box{border-collapse:collapse}.edui-default ul.edui-box{list-style-type:none}div.edui-box{position:relative;display:-moz-inline-box!important;display:inline-block!important;vertical-align:top}.edui-default .edui-clearfix{zoom:1}.edui-default .edui-clearfix:after{content:'\20';display:block;clear:both}* html div.edui-box{display:inline!important}:first-child+html div.edui-box{display:inline!important}.edui-default .edui-button-body,.edui-splitbutton-body,.edui-menubutton-body,.edui-combox-body{position:relative}.edui-default .edui-popup{position:absolute;-webkit-user-select:none;-moz-user-select:none}.edui-default .edui-popup .edui-shadow{position:absolute;z-index:-1}.edui-default .edui-popup .edui-bordereraser{position:absolute;overflow:hidden}.edui-default .edui-tablepicker .edui-canvas{position:relative}.edui-default .edui-tablepicker .edui-canvas .edui-overlay{position:absolute}.edui-default .edui-dialog-modalmask,.edui-dialog-dragmask{position:absolute;left:0;top:0;width:100%;height:100%}.edui-default .edui-toolbar{position:relative}.edui-default .edui-label{cursor:default}.edui-default span.edui-clickable{color:#00f;cursor:pointer;text-decoration:underline}.edui-default span.edui-unclickable{color:gray;cursor:default}.edui-default .edui-toolbar{cursor:default;-webkit-user-select:none;-moz-user-select:none;padding:1px;overflow:hidden;zoom:1;width:auto;height:auto}.edui-default .edui-toolbar .edui-button,.edui-default .edui-toolbar .edui-splitbutton,.edui-default .edui-toolbar .edui-menubutton,.edui-default .edui-toolbar .edui-combox{margin:1px}.edui-default .edui-editor{border:1px solid #d4d4d4;background-color:#fff;position:relative;overflow:visible;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.edui-editor div{width:auto;height:auto}.edui-default .edui-editor-toolbarbox{position:relative;zoom:1;-webkit-box-shadow:0 1px 4px rgba(204,204,204,.6);-moz-box-shadow:0 1px 4px rgba(204,204,204,.6);box-shadow:0 1px 4px rgba(204,204,204,.6);border-top-left-radius:2px;border-top-right-radius:2px}.edui-default .edui-editor-toolbarboxouter{border-bottom:1px solid #d4d4d4;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,.065);box-shadow:0 1px 4px rgba(0,0,0,.065)}.edui-default .edui-editor-toolbarboxinner{padding:2px}.edui-default .edui-editor-iframeholder{position:relative}.edui-default .edui-editor-bottomContainer{overflow:hidden}.edui-default .edui-editor-bottomContainer table{width:100%;height:0;overflow:hidden;border-spacing:0}.edui-default .edui-editor-bottomContainer td{white-space:nowrap;border-top:1px solid #ccc;line-height:20px;font-size:12px;font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif}.edui-default .edui-editor-wordcount{text-align:right;margin-right:5px;color:#aaa}.edui-default .edui-editor-scale{width:12px}.edui-default .edui-editor-scale .edui-editor-icon{float:right;width:100%;height:12px;margin-top:10px;background:url(../images/scale.png) no-repeat;cursor:se-resize}.edui-default .edui-editor-breadcrumb{margin:2px 0 0 3px}.edui-default .edui-editor-breadcrumb span{cursor:pointer;text-decoration:underline;color:#00f}.edui-default .edui-toolbar .edui-for-fullscreen{float:right}.edui-default .edui-bubble .edui-popup-content{border:1px solid #DCAC6C;background-color:#fff6d9;padding:5px;font-size:10pt;font-family:"宋体"}.edui-default .edui-bubble .edui-shadow{}.edui-default .edui-editor-toolbarmsg{background-color:#FFF6D9;border-bottom:1px solid #ccc;position:absolute;bottom:-25px;left:0;z-index:1009;width:99.9%}.edui-default .edui-editor-toolbarmsg-upload{font-size:14px;color:#00f;width:100px;height:16px;line-height:16px;cursor:pointer;position:absolute;top:5px;left:350px}.edui-default .edui-editor-toolbarmsg-label{font-size:12px;line-height:16px;padding:4px}.edui-default .edui-editor-toolbarmsg-close{float:right;width:20px;height:16px;line-height:16px;cursor:pointer;color:red}.edui-default .edui-list .edui-bordereraser{display:none}.edui-default .edui-listitem{padding:1px;white-space:nowrap}.edui-default .edui-list .edui-state-hover{position:relative;background-color:#fff5d4;border:1px solid #dcac6c;padding:0}.edui-default .edui-for-fontfamily .edui-listitem-label{min-width:130px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-default .edui-for-insertcode .edui-listitem-label{min-width:120px;_width:120px;font-size:12px;height:22px;line-height:22px;padding-left:5px}.edui-default .edui-for-underline .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px;font-size:12px}.edui-default .edui-for-fontsize .edui-listitem-label{min-width:120px;_width:120px;padding:3px 5px}.edui-default .edui-for-paragraph .edui-listitem-label{min-width:200px;_width:200px;padding:2px 5px}.edui-default .edui-for-rowspacingtop .edui-listitem-label,.edui-default .edui-for-rowspacingbottom .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-default .edui-for-lineheight .edui-listitem-label{min-width:53px;_width:53px;padding:2px 5px}.edui-default .edui-for-customstyle .edui-listitem-label{min-width:200px;_width:200px;width:200px!important;padding:2px 5px}.edui-default .edui-menu{z-index:3000}.edui-default .edui-menu .edui-popup-content{padding:3px}.edui-default .edui-menu-body{_width:150px;min-width:170px;background:url(../images/sparator_v.png) repeat-y 25px}.edui-default .edui-menuitem-body{}.edui-default .edui-menuitem{height:20px;cursor:default;vertical-align:top}.edui-default .edui-menuitem .edui-icon{width:20px!important;height:20px!important;background:url(../images/icons.png) 0 -4000px;background:url(../images/icons.gif) 0 -4000px\9}.edui-default .edui-menuitem .edui-label{font-size:12px;line-height:20px;height:20px;padding-left:10px}.edui-default .edui-state-checked .edui-menuitem-body{background:url(../images/icons-all.gif) no-repeat 6px -205px}.edui-default .edui-state-disabled .edui-menuitem-label{color:gray}.edui-default .edui-toolbar .edui-combox-body .edui-button-body{width:60px;font-size:12px;height:20px;line-height:20px;padding-left:5px;white-space:nowrap;margin:0 3px 0 0}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0;height:20px;width:9px}.edui-default .edui-toolbar .edui-combox .edui-combox-body{border:1px solid #CCC;background-color:#fff;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-combox-body .edui-splitborder{display:none}.edui-default .edui-toolbar .edui-combox-body .edui-arrow{border-left:1px solid #CCC}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body{background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-hover .edui-combox-body .edui-arrow{border-left:1px solid #dcac6c}.edui-default .edui-toolbar .edui-state-checked .edui-combox-body{background-color:#FFE69F;border:1px solid #DCAC6C}.edui-toolbar .edui-state-checked .edui-combox-body .edui-arrow{border-left:1px solid #DCAC6C}.edui-toolbar .edui-state-disabled .edui-combox-body{background-color:#F0F0EE;opacity:.3;filter:alpha(opacity=30)}.edui-toolbar .edui-state-opened .edui-combox-body{background-color:#fff;border:1px solid gray}.edui-default .edui-toolbar .edui-button .edui-icon,.edui-default .edui-toolbar .edui-menubutton .edui-icon,.edui-default .edui-toolbar .edui-splitbutton .edui-icon{height:20px!important;width:20px!important;background-image:url(../images/icons.png);background-image:url(../images/icons.gif) \9}.edui-default .edui-toolbar .edui-button .edui-button-wrap{padding:1px;position:relative}.edui-default .edui-toolbar .edui-button .edui-state-hover .edui-button-wrap{background-color:#fff5d4;padding:0;border:1px solid #dcac6c}.edui-default .edui-toolbar .edui-button .edui-state-checked .edui-button-wrap{background-color:#ffe69f;padding:0;border:1px solid #dcac6c;border-radius:2px;-webkit-border-radius:2px;-moz-border-radius:2px}.edui-default .edui-toolbar .edui-button .edui-state-active .edui-button-wrap{background-color:#fff;padding:0;border:1px solid gray}.edui-default .edui-toolbar .edui-state-disabled .edui-label{color:#ccc}.edui-default .edui-toolbar .edui-state-disabled .edui-icon{opacity:.3;filter:alpha(opacity=30)}.edui-default .edui-for-undo .edui-icon{background-position:-160px 0}.edui-default .edui-for-redo .edui-icon{background-position:-100px 0}.edui-default .edui-for-bold .edui-icon{background-position:0 0}.edui-default .edui-for-italic .edui-icon{background-position:-60px 0}.edui-default .edui-for-fontborder .edui-icon{background-position:-160px -40px}.edui-default .edui-for-underline .edui-icon{background-position:-140px 0}.edui-default .edui-for-strikethrough .edui-icon{background-position:-120px 0}.edui-default .edui-for-subscript .edui-icon{background-position:-600px 0}.edui-default .edui-for-superscript .edui-icon{background-position:-620px 0}.edui-default .edui-for-blockquote .edui-icon{background-position:-220px 0}.edui-default .edui-for-forecolor .edui-icon{background-position:-720px 0}.edui-default .edui-for-backcolor .edui-icon{background-position:-760px 0}.edui-default .edui-for-inserttable .edui-icon{background-position:-580px -20px}.edui-default .edui-for-autotypeset .edui-icon{background-position:-640px -40px}.edui-default .edui-for-justifyleft .edui-icon{background-position:-460px 0}.edui-default .edui-for-justifycenter .edui-icon{background-position:-420px 0}.edui-default .edui-for-justifyright .edui-icon{background-position:-480px 0}.edui-default .edui-for-justifyjustify .edui-icon{background-position:-440px 0}.edui-default .edui-for-insertorderedlist .edui-icon{background-position:-80px 0}.edui-default .edui-for-insertunorderedlist .edui-icon{background-position:-20px 0}.edui-default .edui-for-lineheight .edui-icon{background-position:-725px -40px}.edui-default .edui-for-rowspacingbottom .edui-icon{background-position:-745px -40px}.edui-default .edui-for-rowspacingtop .edui-icon{background-position:-765px -40px}.edui-default .edui-for-horizontal .edui-icon{background-position:-360px 0}.edui-default .edui-for-link .edui-icon{background-position:-500px 0}.edui-default .edui-for-code .edui-icon{background-position:-440px -40px}.edui-default .edui-for-insertimage .edui-icon{background-position:-726px -77px}.edui-default .edui-for-insertframe .edui-icon{background-position:-240px -40px}.edui-default .edui-for-emoticon .edui-icon{background-position:-60px -20px}.edui-default .edui-for-spechars .edui-icon{background-position:-240px 0}.edui-default .edui-for-help .edui-icon{background-position:-340px 0}.edui-default .edui-for-print .edui-icon{background-position:-440px -20px}.edui-default .edui-for-preview .edui-icon{background-position:-420px -20px}.edui-default .edui-for-selectall .edui-icon{background-position:-400px -20px}.edui-default .edui-for-searchreplace .edui-icon{background-position:-520px -20px}.edui-default .edui-for-map .edui-icon{background-position:-40px -40px}.edui-default .edui-for-gmap .edui-icon{background-position:-260px -40px}.edui-default .edui-for-insertvideo .edui-icon{background-position:-320px -20px}.edui-default .edui-for-time .edui-icon{background-position:-160px -20px}.edui-default .edui-for-date .edui-icon{background-position:-140px -20px}.edui-default .edui-for-cut .edui-icon{background-position:-680px 0}.edui-default .edui-for-copy .edui-icon{background-position:-700px 0}.edui-default .edui-for-paste .edui-icon{background-position:-560px 0}.edui-default .edui-for-formatmatch .edui-icon{background-position:-40px 0}.edui-default .edui-for-pasteplain .edui-icon{background-position:-360px -20px}.edui-default .edui-for-directionalityltr .edui-icon{background-position:-20px -20px}.edui-default .edui-for-directionalityrtl .edui-icon{background-position:-40px -20px}.edui-default .edui-for-source .edui-icon{background-position:-261px -0px}.edui-default .edui-for-removeformat .edui-icon{background-position:-580px 0}.edui-default .edui-for-unlink .edui-icon{background-position:-640px 0}.edui-default .edui-for-touppercase .edui-icon{background-position:-786px 0}.edui-default .edui-for-tolowercase .edui-icon{background-position:-806px 0}.edui-default .edui-for-insertrow .edui-icon{background-position:-478px -76px}.edui-default .edui-for-insertrownext .edui-icon{background-position:-498px -76px}.edui-default .edui-for-insertcol .edui-icon{background-position:-455px -76px}.edui-default .edui-for-insertcolnext .edui-icon{background-position:-429px -76px}.edui-default .edui-for-mergeright .edui-icon{background-position:-60px -40px}.edui-default .edui-for-mergedown .edui-icon{background-position:-80px -40px}.edui-default .edui-for-splittorows .edui-icon{background-position:-100px -40px}.edui-default .edui-for-splittocols .edui-icon{background-position:-120px -40px}.edui-default .edui-for-insertparagraphbeforetable .edui-icon{background-position:-140px -40px}.edui-default .edui-for-deleterow .edui-icon{background-position:-660px -20px}.edui-default .edui-for-deletecol .edui-icon{background-position:-640px -20px}.edui-default .edui-for-splittocells .edui-icon{background-position:-800px -20px}.edui-default .edui-for-mergecells .edui-icon{background-position:-760px -20px}.edui-default .edui-for-deletetable .edui-icon{background-position:-620px -20px}.edui-default .edui-for-cleardoc .edui-icon{background-position:-520px 0}.edui-default .edui-for-fullscreen .edui-icon{background-position:-100px -20px}.edui-default .edui-for-anchor .edui-icon{background-position:-200px 0}.edui-default .edui-for-pagebreak .edui-icon{background-position:-460px -40px}.edui-default .edui-for-imagenone .edui-icon{background-position:-480px -40px}.edui-default .edui-for-imageleft .edui-icon{background-position:-500px -40px}.edui-default .edui-for-wordimage .edui-icon{background-position:-660px -40px}.edui-default .edui-for-imageright .edui-icon{background-position:-520px -40px}.edui-default .edui-for-imagecenter .edui-icon{background-position:-540px -40px}.edui-default .edui-for-indent .edui-icon{background-position:-400px 0}.edui-default .edui-for-outdent .edui-icon{background-position:-540px 0}.edui-default .edui-for-webapp .edui-icon{background-position:-601px -40px}.edui-default .edui-for-table .edui-icon{background-position:-580px -20px}.edui-default .edui-for-edittable .edui-icon{background-position:-420px -40px}.edui-default .edui-for-template .edui-icon{background-position:-339px -40px}.edui-default .edui-for-delete .edui-icon{background-position:-360px -40px}.edui-default .edui-for-attachment .edui-icon{background-position:-620px -40px}.edui-default .edui-for-edittd .edui-icon{background-position:-700px -40px}.edui-default .edui-for-snapscreen .edui-icon{background-position:-581px -40px}.edui-default .edui-for-scrawl .edui-icon{background-position:-801px -41px}.edui-default .edui-for-background .edui-icon{background-position:-680px -40px}.edui-default .edui-for-music .edui-icon{background-position:-18px -40px}.edui-default .edui-for-formula .edui-icon{background-position:-200px -40px}.edui-default .edui-for-aligntd .edui-icon{background-position:-236px -76px}.edui-default .edui-for-insertparagraphtrue .edui-icon{background-position:-625px -76px}.edui-default .edui-for-insertparagraph .edui-icon{background-position:-602px -76px}.edui-default .edui-for-insertcaption .edui-icon{background-position:-336px -76px}.edui-default .edui-for-deletecaption .edui-icon{background-position:-362px -76px}.edui-default .edui-for-inserttitle .edui-icon{background-position:-286px -76px}.edui-default .edui-for-deletetitle .edui-icon{background-position:-311px -76px}.edui-default .edui-for-aligntable .edui-icon{background-position:-440px 0}.edui-default .edui-for-tablealignment-left .edui-icon{background-position:-460px 0}.edui-default .edui-for-tablealignment-center .edui-icon{background-position:-420px 0}.edui-default .edui-for-tablealignment-right .edui-icon{background-position:-480px 0}.edui-default .edui-for-drafts .edui-icon{background-position:-560px 0}.edui-default .edui-for-charts .edui-icon{background:url( ../images/charts.png ) no-repeat 2px 3px!important}.edui-default .edui-for-inserttitlecol .edui-icon{background-position:-673px -76px}.edui-default .edui-for-deletetitlecol .edui-icon{background-position:-698px -76px}.edui-default .edui-for-simpleupload .edui-icon{background-position:-380px 0}.edui-default .edui-toolbar .edui-splitbutton-body .edui-arrow,.edui-default .edui-toolbar .edui-menubutton-body .edui-arrow{background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0;height:20px;width:9px}.edui-default .edui-toolbar .edui-splitbutton .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-menubutton-body{padding:1px}.edui-default .edui-toolbar .edui-splitborder{width:1px;height:20px}.edui-default .edui-toolbar .edui-state-hover .edui-splitborder{width:1px;border-left:0 solid #dcac6c}.edui-default .edui-toolbar .edui-state-active .edui-splitborder{width:0;border-left:1px solid gray}.edui-default .edui-toolbar .edui-state-opened .edui-splitborder{width:1px;border:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-hover .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-hover .edui-menubutton-body{background-color:#fff5d4;border:1px solid #dcac6c;padding:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-checked .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-checked .edui-menubutton-body{background-color:#FFE69F;border:1px solid #DCAC6C;padding:0}.edui-default .edui-toolbar .edui-splitbutton .edui-state-active .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-active .edui-menubutton-body{background-color:#fff;border:1px solid gray;padding:0}.edui-default .edui-state-disabled .edui-arrow{opacity:.3;_filter:alpha(opacity=30)}.edui-default .edui-toolbar .edui-splitbutton .edui-state-opened .edui-splitbutton-body,.edui-default .edui-toolbar .edui-menubutton .edui-state-opened .edui-menubutton-body{background-color:#fff;border:1px solid gray;padding:0}.edui-default .edui-for-insertorderedlist .edui-bordereraser,.edui-default .edui-for-lineheight .edui-bordereraser,.edui-default .edui-for-rowspacingtop .edui-bordereraser,.edui-default .edui-for-rowspacingbottom .edui-bordereraser,.edui-default .edui-for-insertunorderedlist .edui-bordereraser{background-color:#fff}.edui-default .edui-for-insertorderedlist .edui-popup-body .edui-icon,.edui-default .edui-for-lineheight .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingtop .edui-popup-body .edui-icon,.edui-default .edui-for-rowspacingbottom .edui-popup-body .edui-icon,.edui-default .edui-for-insertunorderedlist .edui-popup-body .edui-icon{background-image:none}.edui-default .edui-popup{z-index:3000;background-color:#fff;width:auto;height:auto}.edui-default .edui-popup .edui-shadow{left:0;top:0;width:100%;height:100%}.edui-default .edui-popup-content{border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 4px rgba(0,0,0,.2);-moz-box-shadow:0 3px 4px rgba(0,0,0,.2);box-shadow:0 3px 4px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;padding:5px;background:#fff}.edui-default .edui-popup .edui-bordereraser{background-color:#fff;height:3px}.edui-default .edui-menu .edui-bordereraser{height:3px}.edui-default .edui-anchor-topleft .edui-bordereraser{left:1px;top:-2px}.edui-default .edui-anchor-topright .edui-bordereraser{right:1px;top:-2px}.edui-default .edui-anchor-bottomleft .edui-bordereraser{left:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-default .edui-anchor-bottomright .edui-bordereraser{right:0;bottom:-6px;height:7px;border-left:1px solid gray;border-right:1px solid gray}.edui-popup div{width:auto;height:auto}.edui-default .edui-editor-messageholder{display:block;width:150px;height:auto;border:0;margin:0;padding:0;position:absolute;top:28px;right:3px}.edui-default .edui-message{min-height:10px;text-shadow:0 1px 0 rgba(255,255,255,.5);padding:0;margin-bottom:3px;position:relative}.edui-default .edui-message-body{border-radius:3px;padding:8px 15px 8px 8px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5}.edui-default .edui-message-type-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.edui-default .edui-message-type-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.edui-default .edui-message-type-danger,.edui-default .edui-message-type-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.edui-default .edui-message .edui-message-closer{display:block;width:16px;height:16px;line-height:16px;position:absolute;top:0;right:0;padding:0;cursor:pointer;background:transparent;border:0;float:right;font-size:20px;font-weight:700;color:#999;text-shadow:0 1px 0 #fff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.edui-default .edui-message .edui-message-content{font-size:10pt;word-wrap:break-word;word-break:normal}.edui-default .edui-dialog{z-index:2000;position:absolute}.edui-dialog div{width:auto}.edui-default .edui-dialog-wrap{margin-right:6px;margin-bottom:6px}.edui-default .edui-dialog-fullscreen-flag{margin-right:0;margin-bottom:0}.edui-default .edui-dialog-body{position:relative;padding:2px 0 0 2px;_zoom:1}.edui-default .edui-dialog-fullscreen-flag .edui-dialog-body{padding:0}.edui-default .edui-dialog-shadow{position:absolute;z-index:-1;left:0;top:0;width:100%;height:100%;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.edui-default .edui-dialog-foot{background-color:#fff}.edui-default .edui-dialog-titlebar{height:26px;border-bottom:1px solid #c6c6c6;background:url(../images/dialog-title-bg.png) repeat-x bottom;position:relative;cursor:move}.edui-default .edui-dialog-caption{font-weight:700;font-size:12px;line-height:26px;padding-left:5px}.edui-default .edui-dialog-draghandle{height:26px}.edui-default .edui-dialog-closebutton{position:absolute!important;right:5px;top:3px}.edui-default .edui-dialog-closebutton .edui-button-body{height:20px;width:20px;cursor:pointer;background:url(../images/icons-all.gif) no-repeat 0 -59px}.edui-default .edui-dialog-closebutton .edui-state-hover .edui-button-body{background:url(../images/icons-all.gif) no-repeat 0 -89px}.edui-default .edui-dialog-foot{height:40px}.edui-default .edui-dialog-buttons{position:absolute;right:0}.edui-default .edui-dialog-buttons .edui-button{margin-right:10px}.edui-default .edui-dialog-buttons .edui-button .edui-button-body{background:url(../images/icons-all.gif) no-repeat;height:24px;width:96px;font-size:12px;line-height:24px;text-align:center;cursor:default}.edui-default .edui-dialog-buttons .edui-button .edui-state-hover .edui-button-body{background:url(../images/icons-all.gif) no-repeat 0 -30px}.edui-default .edui-dialog iframe{border:0;padding:0;margin:0;vertical-align:top}.edui-default .edui-dialog-modalmask{opacity:.3;filter:alpha(opacity=30);background-color:#ccc;position:absolute}.edui-default .edui-dialog-dragmask{position:absolute;background-color:transparent;cursor:move}.edui-default .edui-dialog-content{position:relative}.edui-default .dialogcontmask{cursor:move;visibility:hidden;display:block;position:absolute;width:100%;height:100%;opacity:0;filter:alpha(opacity=0)}.edui-default .edui-for-link .edui-dialog-content{width:420px;height:200px;overflow:hidden}.edui-default .edui-for-background .edui-dialog-content{width:440px;height:280px;overflow:hidden}.edui-default .edui-for-template .edui-dialog-content{width:630px;height:390px;overflow:hidden}.edui-default .edui-for-scrawl .edui-dialog-content{width:515px;*width:506px;height:360px}.edui-default .edui-for-spechars .edui-dialog-content{width:620px;height:500px;*width:630px;*height:570px}.edui-default .edui-for-insertimage .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-webapp .edui-dialog-content{width:560px;_width:565px;height:450px;overflow:hidden}.edui-default .edui-for-insertframe .edui-dialog-content{width:350px;height:200px;overflow:hidden}.edui-default .edui-for-wordimage .edui-dialog-content{width:620px;height:380px;overflow:hidden}.edui-default .edui-for-attachment .edui-dialog-content{width:650px;height:400px;overflow:hidden}.edui-default .edui-for-map .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-gmap .edui-dialog-content{width:550px;height:400px}.edui-default .edui-for-insertvideo .edui-dialog-content{width:590px;height:390px}.edui-default .edui-for-anchor .edui-dialog-content{width:320px;height:60px;overflow:hidden}.edui-default .edui-for-searchreplace .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-help .edui-dialog-content{width:400px;height:420px}.edui-default .edui-for-edittable .edui-dialog-content{width:540px;_width:590px;height:335px}.edui-default .edui-for-edittip .edui-dialog-content{width:225px;height:60px}.edui-default .edui-for-edittd .edui-dialog-content{width:240px;height:50px}.edui-default .edui-for-snapscreen .edui-dialog-content{width:400px;height:220px}.edui-default .edui-for-music .edui-dialog-content{width:515px;height:360px}.edui-default .edui-for-paragraph .edui-listitem-label{font-family:Tahoma,Verdana,Arial,Helvetica}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-p{font-size:22px;line-height:27px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h1{font-weight:bolder;font-size:32px;line-height:36px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h2{font-weight:bolder;font-size:27px;line-height:29px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h3{font-weight:bolder;font-size:19px;line-height:23px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h4{font-weight:bolder;font-size:16px;line-height:19px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h5{font-weight:bolder;font-size:13px;line-height:16px}.edui-default .edui-for-paragraph .edui-listitem-label .edui-for-h6{font-weight:bolder;font-size:12px;line-height:14px}.edui-default .edui-for-inserttable .edui-splitborder{display:none}.edui-default .edui-for-inserttable .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-inserttable .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-tablepicker .edui-infoarea{height:14px;line-height:14px;font-size:12px;width:220px;margin-bottom:3px;clear:both}.edui-default .edui-tablepicker .edui-infoarea .edui-label{float:left}.edui-default .edui-dialog-buttons .edui-label{line-height:24px}.edui-default .edui-tablepicker .edui-infoarea .edui-clickable{float:right}.edui-default .edui-tablepicker .edui-pickarea{background:url(../images/unhighlighted.gif) repeat;height:220px;width:220px}.edui-default .edui-tablepicker .edui-pickarea .edui-overlay{background:url(../images/highlighted.gif) repeat}.edui-default .edui-colorpicker-topbar{height:27px;width:200px}.edui-default .edui-colorpicker-preview{height:20px;border:1px inset #000;margin-left:1px;width:128px;float:left}.edui-default .edui-colorpicker-nocolor{float:right;margin-right:1px;font-size:12px;line-height:14px;height:14px;border:1px solid #333;padding:3px 5px;cursor:pointer}.edui-default .edui-colorpicker-tablefirstrow{height:30px}.edui-default .edui-colorpicker-colorcell{width:14px;height:14px;display:block;margin:0;cursor:pointer}.edui-default .edui-colorpicker-colorcell:hover{width:14px;height:14px;margin:0}.edui-default .edui-colorpicker-advbtn{display:block;text-align:center;cursor:pointer;height:20px}.arrow_down{background:#fff url(../images/arrow_down.png) no-repeat center}.arrow_up{background:#fff url(../images/arrow_up.png) no-repeat center}.edui-colorpicker-adv{position:relative;overflow:hidden;height:180px;display:none}.edui-colorpicker-plant,.edui-colorpicker-hue{border:solid 1px #666}.edui-colorpicker-pad{width:150px;height:150px;left:14px;top:13px;position:absolute;background:red;overflow:hidden;cursor:crosshair}.edui-colorpicker-cover{position:absolute;top:0;left:0;width:150px;height:150px;background:url(../images/tangram-colorpicker.png) -160px -200px}.edui-colorpicker-padDot{position:absolute;top:0;left:0;width:11px;height:11px;overflow:hidden;background:url(../images/tangram-colorpicker.png) 0 -200px repeat-x;z-index:1000}.edui-colorpicker-sliderMain{position:absolute;left:171px;top:13px;width:19px;height:152px;background:url(../images/tangram-colorpicker.png) -179px -12px no-repeat}.edui-colorpicker-slider{width:100%;height:100%;cursor:pointer}.edui-colorpicker-thumb{position:absolute;top:0;cursor:pointer;height:3px;left:-1px;right:-1px;border:1px solid #000;background:#fff;opacity:.8}.edui-default .edui-autotypesetpicker .edui-autotypesetpicker-body{font-size:12px;margin-bottom:3px;clear:both}.edui-default .edui-autotypesetpicker-body table{border-collapse:separate;border-spacing:2px}.edui-default .edui-autotypesetpicker-body td{font-size:12px;word-wrap:break-word}.edui-default .edui-autotypesetpicker-body td input{margin:3px 3px 3px 4px;*margin:1px 0 0}.edui-default .edui-cellalignpicker .edui-cellalignpicker-body{width:70px;font-size:12px;cursor:default}.edui-default .edui-cellalignpicker-body table{border-collapse:separate;border-spacing:0}.edui-default .edui-cellalignpicker-body td{padding:1px}.edui-default .edui-cellalignpicker-body .edui-icon{height:20px;width:20px;padding:1px;background-image:url(../images/table-cell-align.png)}.edui-default .edui-cellalignpicker-body .edui-left{background-position:0 0}.edui-default .edui-cellalignpicker-body .edui-center{background-position:-25px 0}.edui-default .edui-cellalignpicker-body .edui-right{background-position:-51px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-left{background-position:-73px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-center{background-position:-98px 0}.edui-default .edui-cellalignpicker-body td.edui-state-hover .edui-right{background-position:-124px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-left{background-position:-146px 0;background-color:#f1f4f5}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-center{background-position:-245px 0}.edui-default .edui-cellalignpicker-body td.edui-cellalign-selected .edui-right{background-position:-271px 0}.edui-default .edui-toolbar .edui-separator{width:2px;height:20px;margin:2px 4px 2px 3px;background:url(../images/icons.png) -181px 0;background:url(../images/icons.gif) -181px 0 \9}.edui-default .edui-toolbar .edui-colorbutton .edui-colorlump{position:absolute;overflow:hidden;bottom:1px;left:1px;width:18px;height:4px}.edui-default .edui-for-emotion .edui-icon{background-position:-60px -20px}.edui-default .edui-for-emotion .edui-popup-content iframe{width:514px;height:380px;overflow:hidden}.edui-default .edui-for-emotion .edui-popup-content{position:relative;z-index:555}.edui-default .edui-for-emotion .edui-splitborder{display:none}.edui-default .edui-for-emotion .edui-splitbutton-body .edui-arrow{width:0}.edui-default .edui-toolbar .edui-for-emotion .edui-state-active .edui-splitborder{border-left:1px solid transparent}.edui-default .edui-hassubmenu .edui-arrow{height:20px;width:20px;float:right;background:url(../images/icons-all.gif) no-repeat 10px -233px}.edui-default .edui-menu-body .edui-menuitem{padding:1px}.edui-default .edui-menuseparator{margin:2px 0;height:1px;overflow:hidden}.edui-default .edui-menuseparator-inner{border-bottom:1px solid #e2e3e3;margin-left:29px;margin-right:1px}.edui-default .edui-menu-body .edui-state-hover{padding:0!important;background-color:#fff5d4;border:1px solid #dcac6c}.edui-default .edui-shortcutmenu{padding:2px;width:190px;height:50px;background-color:#fff;border:1px solid #ccc;border-radius:5px}.edui-default .edui-wordpastepop .edui-popup-content{border:0;padding:0;width:54px;height:21px}.edui-default .edui-pasteicon{width:100%;height:100%;background-image:url(../images/wordpaste.png);background-position:0 0}.edui-default .edui-pasteicon.edui-state-opened{background-position:0 -34px}.edui-default .edui-pastecontainer{position:relative;visibility:hidden;width:97px;background:#fff;border:1px solid #ccc}.edui-default .edui-pastecontainer .edui-title{font-weight:700;background:#F8F8FF;height:25px;line-height:25px;font-size:12px;padding-left:5px}.edui-default .edui-pastecontainer .edui-button{overflow:hidden;margin:3px 0}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon,.edui-default .edui-pastecontainer .edui-button .edui-tagicon,.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{float:left;cursor:pointer;width:29px;height:29px;margin-left:5px;background-image:url(../images/wordpaste.png);background-repeat:no-repeat}.edui-default .edui-pastecontainer .edui-button .edui-richtxticon{margin-left:0;background-position:-109px 0}.edui-default .edui-pastecontainer .edui-button .edui-tagicon{background-position:-148px 1px}.edui-default .edui-pastecontainer .edui-button .edui-plaintxticon{background-position:-72px 0}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-richtxticon{background-position:-109px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-tagicon{background-position:-148px -34px}.edui-default .edui-pastecontainer .edui-button .edui-state-hover .edui-plaintxticon{background-position:-72px -34px} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/dialogbase.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/dialogbase.css new file mode 100644 index 0000000..cd663d5 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/dialogbase.css @@ -0,0 +1,100 @@ +/*弹出对话框页面样式组件 +*/ + +/*reset +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0; + padding: 0; + outline: 0; + font-size: 100%; +} + +body { + line-height: 1; +} + +ol, ul { + list-style: none; +} + +blockquote, q { + quotes: none; +} + +ins { + text-decoration: none; +} + +del { + text-decoration: line-through; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} + +/*module +*/ +body { + background-color: #fff; + font: 12px/1.5 sans-serif, "宋体", "Arial Narrow", HELVETICA; + color: #646464; +} + +/*tab*/ +.tabhead { + position: relative; + z-index: 10; +} + +.tabhead span { + display: inline-block; + padding: 0 5px; + height: 30px; + border: 1px solid #ccc; + background: url("images/dialog-title-bg.png") repeat-x; + text-align: center; + line-height: 30px; + cursor: pointer; + *margin-right: 5px; +} + +.tabhead span.focus { + height: 31px; + border-bottom: none; + background: #fff; +} + +.tabbody { + position: relative; + top: -1px; + margin: 0 auto; + border: 1px solid #ccc; +} + +/*button*/ +a.button { + display: block; + text-align: center; + line-height: 24px; + text-decoration: none; + height: 24px; + width: 95px; + border: 0; + color: #838383; + background: url(../../themes/default/images/icons-all.gif) no-repeat; +} + +a.button:hover { + background-position: 0 -30px; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/anchor.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/anchor.gif new file mode 100644 index 0000000..5aa797b Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/anchor.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow.png new file mode 100644 index 0000000..d900886 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow_down.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow_down.png new file mode 100644 index 0000000..e9257e8 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow_down.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow_up.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow_up.png new file mode 100644 index 0000000..74277af Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/arrow_up.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/button-bg.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/button-bg.gif new file mode 100644 index 0000000..ec7fa2e Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/button-bg.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cancelbutton.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cancelbutton.gif new file mode 100644 index 0000000..df4bc2c Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cancelbutton.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/charts.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/charts.png new file mode 100644 index 0000000..713965c Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/charts.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_h.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_h.gif new file mode 100644 index 0000000..d7c3e7e Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_h.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_h.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_h.png new file mode 100644 index 0000000..2088fc2 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_h.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_v.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_v.gif new file mode 100644 index 0000000..bb508db Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_v.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_v.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_v.png new file mode 100644 index 0000000..6f39ca3 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/cursor_v.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/dialog-title-bg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/dialog-title-bg.png new file mode 100644 index 0000000..f744f26 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/dialog-title-bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/filescan.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/filescan.png new file mode 100644 index 0000000..1d27158 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/filescan.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/highlighted.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/highlighted.gif new file mode 100644 index 0000000..9272b49 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/highlighted.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons-all.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons-all.gif new file mode 100644 index 0000000..21915e5 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons-all.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons.gif new file mode 100644 index 0000000..7abd30a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons.png new file mode 100644 index 0000000..c015e3a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/icons.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/loaderror.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/loaderror.png new file mode 100644 index 0000000..35ff333 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/loaderror.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/loading.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/loading.gif new file mode 100644 index 0000000..b713e27 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/loading.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/lock.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/lock.gif new file mode 100644 index 0000000..b4e6d78 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/lock.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/neweditor-tab-bg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/neweditor-tab-bg.png new file mode 100644 index 0000000..8f398b0 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/neweditor-tab-bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/pagebreak.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/pagebreak.gif new file mode 100644 index 0000000..8d1cffd Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/pagebreak.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/scale.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/scale.png new file mode 100644 index 0000000..f45adb5 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/scale.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/sortable.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/sortable.png new file mode 100644 index 0000000..1bca649 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/sortable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/spacer.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/spacer.gif new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/spacer.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/sparator_v.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/sparator_v.png new file mode 100644 index 0000000..8cf5662 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/sparator_v.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/table-cell-align.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/table-cell-align.png new file mode 100644 index 0000000..ddf4285 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/table-cell-align.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/tangram-colorpicker.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/tangram-colorpicker.png new file mode 100644 index 0000000..738e500 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/tangram-colorpicker.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/toolbar_bg.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/toolbar_bg.png new file mode 100644 index 0000000..7ab685f Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/toolbar_bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/unhighlighted.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/unhighlighted.gif new file mode 100644 index 0000000..7ad0b67 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/unhighlighted.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/upload.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/upload.png new file mode 100644 index 0000000..08d4d92 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/upload.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/videologo.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/videologo.gif new file mode 100644 index 0000000..555af74 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/videologo.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/word.gif b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/word.gif new file mode 100644 index 0000000..9ef5d09 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/word.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/wordpaste.png b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/wordpaste.png new file mode 100644 index 0000000..9367758 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/default/images/wordpaste.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/iframe.css b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/iframe.css new file mode 100644 index 0000000..774013a --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/themes/iframe.css @@ -0,0 +1 @@ +/*可以在这里添加你自己的css*/ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/third-party/SyntaxHighlighter/shCore.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/third-party/SyntaxHighlighter/shCore.js new file mode 100644 index 0000000..3249184 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/third-party/SyntaxHighlighter/shCore.js @@ -0,0 +1,3655 @@ +// XRegExp 1.5.1 +// (c) 2007-2012 Steven Levithan +// MIT License +// +// Provides an augmented, extensible, cross-browser implementation of regular expressions, +// including support for additional syntax, flags, and methods + +var XRegExp; + +if (XRegExp) { + // Avoid running twice, since that would break references to native globals + throw Error("can't load XRegExp twice in the same frame"); +} + +// Run within an anonymous function to protect variables and avoid new globals +(function (undefined) { + + //--------------------------------- + // Constructor + //--------------------------------- + + // Accepts a pattern and flags; returns a new, extended `RegExp` object. Differs from a native + // regular expression in that additional syntax and flags are supported and cross-browser + // syntax inconsistencies are ameliorated. `XRegExp(/regex/)` clones an existing regex and + // converts to type XRegExp + XRegExp = function (pattern, flags) { + var output = [], + currScope = XRegExp.OUTSIDE_CLASS, + pos = 0, + context, tokenResult, match, chr, regex; + + if (XRegExp.isRegExp(pattern)) { + if (flags !== undefined) + throw TypeError("can't supply flags when constructing one RegExp from another"); + return clone(pattern); + } + // Tokens become part of the regex construction process, so protect against infinite + // recursion when an XRegExp is constructed within a token handler or trigger + if (isInsideConstructor) + throw Error("can't call the XRegExp constructor within token definition functions"); + + flags = flags || ""; + context = { // `this` object for custom tokens + hasNamedCapture: false, + captureNames: [], + hasFlag: function (flag) {return flags.indexOf(flag) > -1;}, + setFlag: function (flag) {flags += flag;} + }; + + while (pos < pattern.length) { + // Check for custom tokens at the current position + tokenResult = runTokens(pattern, pos, currScope, context); + + if (tokenResult) { + output.push(tokenResult.output); + pos += (tokenResult.match[0].length || 1); + } else { + // Check for native multicharacter metasequences (excluding character classes) at + // the current position + if (match = nativ.exec.call(nativeTokens[currScope], pattern.slice(pos))) { + output.push(match[0]); + pos += match[0].length; + } else { + chr = pattern.charAt(pos); + if (chr === "[") + currScope = XRegExp.INSIDE_CLASS; + else if (chr === "]") + currScope = XRegExp.OUTSIDE_CLASS; + // Advance position one character + output.push(chr); + pos++; + } + } + } + + regex = RegExp(output.join(""), nativ.replace.call(flags, flagClip, "")); + regex._xregexp = { + source: pattern, + captureNames: context.hasNamedCapture ? context.captureNames : null + }; + return regex; + }; + + + //--------------------------------- + // Public properties + //--------------------------------- + + XRegExp.version = "1.5.1"; + + // Token scope bitflags + XRegExp.INSIDE_CLASS = 1; + XRegExp.OUTSIDE_CLASS = 2; + + + //--------------------------------- + // Private variables + //--------------------------------- + + var replacementToken = /\$(?:(\d\d?|[$&`'])|{([$\w]+)})/g, + flagClip = /[^gimy]+|([\s\S])(?=[\s\S]*\1)/g, // Nonnative and duplicate flags + quantifier = /^(?:[?*+]|{\d+(?:,\d*)?})\??/, + isInsideConstructor = false, + tokens = [], + // Copy native globals for reference ("native" is an ES3 reserved keyword) + nativ = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = nativ.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + nativ.test.call(x, ""); + return !x.lastIndex; + }(), + hasNativeY = RegExp.prototype.sticky !== undefined, + nativeTokens = {}; + + // `nativeTokens` match native multicharacter metasequences only (including deprecated octals, + // excluding character classes) + nativeTokens[XRegExp.INSIDE_CLASS] = /^(?:\\(?:[0-3][0-7]{0,2}|[4-7][0-7]?|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S]))/; + nativeTokens[XRegExp.OUTSIDE_CLASS] = /^(?:\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9]\d*|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|c[A-Za-z]|[\s\S])|\(\?[:=!]|[?*+]\?|{\d+(?:,\d*)?}\??)/; + + + //--------------------------------- + // Public methods + //--------------------------------- + + // Lets you extend or change XRegExp syntax and create custom flags. This is used internally by + // the XRegExp library and can be used to create XRegExp plugins. This function is intended for + // users with advanced knowledge of JavaScript's regular expression syntax and behavior. It can + // be disabled by `XRegExp.freezeTokens` + XRegExp.addToken = function (regex, handler, scope, trigger) { + tokens.push({ + pattern: clone(regex, "g" + (hasNativeY ? "y" : "")), + handler: handler, + scope: scope || XRegExp.OUTSIDE_CLASS, + trigger: trigger || null + }); + }; + + // Accepts a pattern and flags; returns an extended `RegExp` object. If the pattern and flag + // combination has previously been cached, the cached copy is returned; otherwise the newly + // created regex is cached + XRegExp.cache = function (pattern, flags) { + var key = pattern + "/" + (flags || ""); + return XRegExp.cache[key] || (XRegExp.cache[key] = XRegExp(pattern, flags)); + }; + + // Accepts a `RegExp` instance; returns a copy with the `/g` flag set. The copy has a fresh + // `lastIndex` (set to zero). If you want to copy a regex without forcing the `global` + // property, use `XRegExp(regex)`. Do not use `RegExp(regex)` because it will not preserve + // special properties required for named capture + XRegExp.copyAsGlobal = function (regex) { + return clone(regex, "g"); + }; + + // Accepts a string; returns the string with regex metacharacters escaped. The returned string + // can safely be used at any point within a regex to match the provided literal string. Escaped + // characters are [ ] { } ( ) * + ? - . , \ ^ $ | # and whitespace + XRegExp.escape = function (str) { + return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + }; + + // Accepts a string to search, regex to search with, position to start the search within the + // string (default: 0), and an optional Boolean indicating whether matches must start at-or- + // after the position or at the specified position only. This function ignores the `lastIndex` + // of the provided regex in its own handling, but updates the property for compatibility + XRegExp.execAt = function (str, regex, pos, anchored) { + var r2 = clone(regex, "g" + ((anchored && hasNativeY) ? "y" : "")), + match; + r2.lastIndex = pos = pos || 0; + match = r2.exec(str); // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (anchored && match && match.index !== pos) + match = null; + if (regex.global) + regex.lastIndex = match ? r2.lastIndex : 0; + return match; + }; + + // Breaks the unrestorable link to XRegExp's private list of tokens, thereby preventing + // syntax and flag changes. Should be run after XRegExp and any plugins are loaded + XRegExp.freezeTokens = function () { + XRegExp.addToken = function () { + throw Error("can't run addToken after freezeTokens"); + }; + }; + + // Accepts any value; returns a Boolean indicating whether the argument is a `RegExp` object. + // Note that this is also `true` for regex literals and regexes created by the `XRegExp` + // constructor. This works correctly for variables created in another frame, when `instanceof` + // and `constructor` checks would fail to work as intended + XRegExp.isRegExp = function (o) { + return Object.prototype.toString.call(o) === "[object RegExp]"; + }; + + // Executes `callback` once per match within `str`. Provides a simpler and cleaner way to + // iterate over regex matches compared to the traditional approaches of subverting + // `String.prototype.replace` or repeatedly calling `exec` within a `while` loop + XRegExp.iterate = function (str, regex, callback, context) { + var r2 = clone(regex, "g"), + i = -1, match; + while (match = r2.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (regex.global) + regex.lastIndex = r2.lastIndex; // Doing this to follow expectations if `lastIndex` is checked within `callback` + callback.call(context, match, ++i, str, regex); + if (r2.lastIndex === match.index) + r2.lastIndex++; + } + if (regex.global) + regex.lastIndex = 0; + }; + + // Accepts a string and an array of regexes; returns the result of using each successive regex + // to search within the matches of the previous regex. The array of regexes can also contain + // objects with `regex` and `backref` properties, in which case the named or numbered back- + // references specified are passed forward to the next regex or returned. E.g.: + // var xregexpImgFileNames = XRegExp.matchChain(html, [ + // {regex: /]+)>/i, backref: 1}, // tag attributes + // {regex: XRegExp('(?ix) \\s src=" (? [^"]+ )'), backref: "src"}, // src attribute values + // {regex: XRegExp("^http://xregexp\\.com(/[^#?]+)", "i"), backref: 1}, // xregexp.com paths + // /[^\/]+$/ // filenames (strip directory paths) + // ]); + XRegExp.matchChain = function (str, chain) { + return function recurseChain (values, level) { + var item = chain[level].regex ? chain[level] : {regex: chain[level]}, + regex = clone(item.regex, "g"), + matches = [], i; + for (i = 0; i < values.length; i++) { + XRegExp.iterate(values[i], regex, function (match) { + matches.push(item.backref ? (match[item.backref] || "") : match[0]); + }); + } + return ((level === chain.length - 1) || !matches.length) ? + matches : recurseChain(matches, level + 1); + }([str], 0); + }; + + + //--------------------------------- + // New RegExp prototype methods + //--------------------------------- + + // Accepts a context object and arguments array; returns the result of calling `exec` with the + // first value in the arguments array. the context is ignored but is accepted for congruity + // with `Function.prototype.apply` + RegExp.prototype.apply = function (context, args) { + return this.exec(args[0]); + }; + + // Accepts a context object and string; returns the result of calling `exec` with the provided + // string. the context is ignored but is accepted for congruity with `Function.prototype.call` + RegExp.prototype.call = function (context, str) { + return this.exec(str); + }; + + + //--------------------------------- + // Overriden native methods + //--------------------------------- + + // Adds named capture support (with backreferences returned as `result.name`), and fixes two + // cross-browser issues per ES3: + // - Captured values for nonparticipating capturing groups should be returned as `undefined`, + // rather than the empty string. + // - `lastIndex` should not be incremented after zero-length matches. + RegExp.prototype.exec = function (str) { + var match, name, r2, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.apply(this, arguments); + if (match) { + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, nativ.replace.call(getNativeFlags(this), "g", "")); + // Using `str.slice(match.index)` rather than `match[0]` in case lookahead allowed + // matching due to characters outside the match + nativ.replace.call((str + "").slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + // Attach named capture properties + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + // Fix browsers that increment `lastIndex` after zero-length matches + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return match; + }; + + // Fix browser bugs in native method + RegExp.prototype.test = function (str) { + // Use the native `exec` to skip some processing overhead, even though the altered + // `exec` would take care of the `lastIndex` fixes + var match, origLastIndex; + if (!this.global) + origLastIndex = this.lastIndex; + match = nativ.exec.call(this, str); + // Fix browsers that increment `lastIndex` after zero-length matches + if (match && !compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + if (!this.global) + this.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + return !!match; + }; + + // Adds named capture support and fixes browser bugs in native method + String.prototype.match = function (regex) { + if (!XRegExp.isRegExp(regex)) + regex = RegExp(regex); // Native `RegExp` + if (regex.global) { + var result = nativ.match.apply(this, arguments); + regex.lastIndex = 0; // Fix IE bug + return result; + } + return regex.exec(this); // Run the altered `exec` + }; + + // Adds support for `${n}` tokens for named and numbered backreferences in replacement text, + // and provides named backreferences to replacement functions as `arguments[0].name`. Also + // fixes cross-browser differences in replacement text syntax when performing a replacement + // using a nonregex search value, and the value of replacement regexes' `lastIndex` property + // during replacement iterations. Note that this doesn't support SpiderMonkey's proprietary + // third (`flags`) parameter + String.prototype.replace = function (search, replacement) { + var isRegex = XRegExp.isRegExp(search), + captureNames, result, str, origLastIndex; + + // There are too many combinations of search/replacement types/values and browser bugs that + // preclude passing to native `replace`, so don't try + //if (...) + // return nativ.replace.apply(this, arguments); + + if (isRegex) { + if (search._xregexp) + captureNames = search._xregexp.captureNames; // Array or `null` + if (!search.global) + origLastIndex = search.lastIndex; + } else { + search = search + ""; // Type conversion + } + + if (Object.prototype.toString.call(replacement) === "[object Function]") { + result = nativ.replace.call(this + "", search, function () { + if (captureNames) { + // Change the `arguments[0]` string primitive to a String object which can store properties + arguments[0] = new String(arguments[0]); + // Store named backreferences on `arguments[0]` + for (var i = 0; i < captureNames.length; i++) { + if (captureNames[i]) + arguments[0][captureNames[i]] = arguments[i + 1]; + } + } + // Update `lastIndex` before calling `replacement` (fix browsers) + if (isRegex && search.global) + search.lastIndex = arguments[arguments.length - 2] + arguments[0].length; + return replacement.apply(null, arguments); + }); + } else { + str = this + ""; // Type conversion, so `args[args.length - 1]` will be a string (given nonstring `this`) + result = nativ.replace.call(str, search, function () { + var args = arguments; // Keep this function's `arguments` available through closure + return nativ.replace.call(replacement + "", replacementToken, function ($0, $1, $2) { + // Numbered backreference (without delimiters) or special variable + if ($1) { + switch ($1) { + case "$": return "$"; + case "&": return args[0]; + case "`": return args[args.length - 1].slice(0, args[args.length - 2]); + case "'": return args[args.length - 1].slice(args[args.length - 2] + args[0].length); + // Numbered backreference + default: + // What does "$10" mean? + // - Backreference 10, if 10 or more capturing groups exist + // - Backreference 1 followed by "0", if 1-9 capturing groups exist + // - Otherwise, it's the string "$10" + // Also note: + // - Backreferences cannot be more than two digits (enforced by `replacementToken`) + // - "$01" is equivalent to "$1" if a capturing group exists, otherwise it's the string "$01" + // - There is no "$0" token ("$&" is the entire match) + var literalNumbers = ""; + $1 = +$1; // Type conversion; drop leading zero + if (!$1) // `$1` was "0" or "00" + return $0; + while ($1 > args.length - 3) { + literalNumbers = String.prototype.slice.call($1, -1) + literalNumbers; + $1 = Math.floor($1 / 10); // Drop the last digit + } + return ($1 ? args[$1] || "" : "$") + literalNumbers; + } + // Named backreference or delimited numbered backreference + } else { + // What does "${n}" mean? + // - Backreference to numbered capture n. Two differences from "$n": + // - n can be more than two digits + // - Backreference 0 is allowed, and is the entire match + // - Backreference to named capture n, if it exists and is not a number overridden by numbered capture + // - Otherwise, it's the string "${n}" + var n = +$2; // Type conversion; drop leading zeros + if (n <= args.length - 3) + return args[n]; + n = captureNames ? indexOf(captureNames, $2) : -1; + return n > -1 ? args[n + 1] : $0; + } + }); + }); + } + + if (isRegex) { + if (search.global) + search.lastIndex = 0; // Fix IE, Safari bug (last tested IE 9.0.5, Safari 5.1.2 on Windows) + else + search.lastIndex = origLastIndex; // Fix IE, Opera bug (last tested IE 9.0.5, Opera 11.61 on Windows) + } + + return result; + }; + + // A consistent cross-browser, ES3 compliant `split` + String.prototype.split = function (s /* separator */, limit) { + // If separator `s` is not a regex, use the native `split` + if (!XRegExp.isRegExp(s)) + return nativ.split.apply(this, arguments); + + var str = this + "", // Type conversion + output = [], + lastLastIndex = 0, + match, lastLength; + + // Behavior for `limit`: if it's... + // - `undefined`: No limit + // - `NaN` or zero: Return an empty array + // - A positive number: Use `Math.floor(limit)` + // - A negative number: No limit + // - Other: Type-convert, then use the above rules + if (limit === undefined || +limit < 0) { + limit = Infinity; + } else { + limit = Math.floor(+limit); + if (!limit) + return []; + } + + // This is required if not `s.global`, and it avoids needing to set `s.lastIndex` to zero + // and restore it to its original value when we're done using the regex + s = XRegExp.copyAsGlobal(s); + + while (match = s.exec(str)) { // Run the altered `exec` (required for `lastIndex` fix, etc.) + if (s.lastIndex > lastLastIndex) { + output.push(str.slice(lastLastIndex, match.index)); + + if (match.length > 1 && match.index < str.length) + Array.prototype.push.apply(output, match.slice(1)); + + lastLength = match[0].length; + lastLastIndex = s.lastIndex; + + if (output.length >= limit) + break; + } + + if (s.lastIndex === match.index) + s.lastIndex++; + } + + if (lastLastIndex === str.length) { + if (!nativ.test.call(s, "") || lastLength) + output.push(""); + } else { + output.push(str.slice(lastLastIndex)); + } + + return output.length > limit ? output.slice(0, limit) : output; + }; + + + //--------------------------------- + // Private helper functions + //--------------------------------- + + // Supporting function for `XRegExp`, `XRegExp.copyAsGlobal`, etc. Returns a copy of a `RegExp` + // instance with a fresh `lastIndex` (set to zero), preserving properties required for named + // capture. Also allows adding new flags in the process of copying the regex + function clone (regex, additionalFlags) { + if (!XRegExp.isRegExp(regex)) + throw TypeError("type RegExp expected"); + var x = regex._xregexp; + regex = XRegExp(regex.source, getNativeFlags(regex) + (additionalFlags || "")); + if (x) { + regex._xregexp = { + source: x.source, + captureNames: x.captureNames ? x.captureNames.slice(0) : null + }; + } + return regex; + } + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + } + + function runTokens (pattern, index, scope, context) { + var i = tokens.length, + result, match, t; + // Protect against constructing XRegExps within token handler and trigger functions + isInsideConstructor = true; + // Must reset `isInsideConstructor`, even if a `trigger` or `handler` throws + try { + while (i--) { // Run in reverse order + t = tokens[i]; + if ((scope & t.scope) && (!t.trigger || t.trigger.call(context))) { + t.pattern.lastIndex = index; + match = t.pattern.exec(pattern); // Running the altered `exec` here allows use of named backreferences, etc. + if (match && match.index === index) { + result = { + output: t.handler.call(context, match, scope), + match: match + }; + break; + } + } + } + } catch (err) { + throw err; + } finally { + isInsideConstructor = false; + } + return result; + } + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + } + + + //--------------------------------- + // Built-in tokens + //--------------------------------- + + // Augment XRegExp's regular expression syntax and flags. Note that when adding tokens, the + // third (`scope`) argument defaults to `XRegExp.OUTSIDE_CLASS` + + // Comment pattern: (?# ) + XRegExp.addToken( + /\(\?#[^)]*\)/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + } + ); + + // Capturing group (match the opening parenthesis only). + // Required for support of named capturing groups + XRegExp.addToken( + /\((?!\?)/, + function () { + this.captureNames.push(null); + return "("; + } + ); + + // Named capturing group (match the opening delimiter only): (? + XRegExp.addToken( + /\(\?<([$\w]+)>/, + function (match) { + this.captureNames.push(match[1]); + this.hasNamedCapture = true; + return "("; + } + ); + + // Named backreference: \k + XRegExp.addToken( + /\\k<([\w$]+)>/, + function (match) { + var index = indexOf(this.captureNames, match[1]); + // Keep backreferences separate from subsequent literal numbers. Preserve back- + // references to named groups that are undefined at this point as literal strings + return index > -1 ? + "\\" + (index + 1) + (isNaN(match.input.charAt(match.index + match[0].length)) ? "" : "(?:)") : + match[0]; + } + ); + + // Empty character class: [] or [^] + XRegExp.addToken( + /\[\^?]/, + function (match) { + // For cross-browser compatibility with ES3, convert [] to \b\B and [^] to [\s\S]. + // (?!) should work like \b\B, but is unreliable in Firefox + return match[0] === "[]" ? "\\b\\B" : "[\\s\\S]"; + } + ); + + // Mode modifier at the start of the pattern only, with any combination of flags imsx: (?imsx) + // Does not support x(?i), (?-i), (?i-m), (?i: ), (?i)(?m), etc. + XRegExp.addToken( + /^\(\?([imsx]+)\)/, + function (match) { + this.setFlag(match[1]); + return ""; + } + ); + + // Whitespace and comments, in free-spacing (aka extended) mode only + XRegExp.addToken( + /(?:\s+|#.*)+/, + function (match) { + // Keep tokens separated unless the following token is a quantifier + return nativ.test.call(quantifier, match.input.slice(match.index + match[0].length)) ? "" : "(?:)"; + }, + XRegExp.OUTSIDE_CLASS, + function () {return this.hasFlag("x");} + ); + + // Dot, in dotall (aka singleline) mode only + XRegExp.addToken( + /\./, + function () {return "[\\s\\S]";}, + XRegExp.OUTSIDE_CLASS, + function () {return this.hasFlag("s");} + ); + + + //--------------------------------- + // Backward compatibility + //--------------------------------- + + // Uncomment the following block for compatibility with XRegExp 1.0-1.2: + /* + XRegExp.matchWithinChain = XRegExp.matchChain; + RegExp.prototype.addFlags = function (s) {return clone(this, s);}; + RegExp.prototype.execAll = function (s) {var r = []; XRegExp.iterate(s, this, function (m) {r.push(m);}); return r;}; + RegExp.prototype.forEachExec = function (s, f, c) {return XRegExp.iterate(s, this, f, c);}; + RegExp.prototype.validate = function (s) {var r = RegExp("^(?:" + this.source + ")$(?!\\s)", getNativeFlags(this)); if (this.global) this.lastIndex = 0; return s.search(r) === 0;}; + */ + +})(); + +// +// Begin anonymous function. This is used to contain local scope variables without polutting global scope. +// +if (typeof(SyntaxHighlighter) == 'undefined') var SyntaxHighlighter = function() { + +// CommonJS + if (typeof(require) != 'undefined' && typeof(XRegExp) == 'undefined') + { + XRegExp = require('XRegExp').XRegExp; + } + +// Shortcut object which will be assigned to the SyntaxHighlighter variable. +// This is a shorthand for local reference in order to avoid long namespace +// references to SyntaxHighlighter.whatever... + var sh = { + defaults : { + /** Additional CSS class names to be added to highlighter elements. */ + 'class-name' : '', + + /** First line number. */ + 'first-line' : 1, + + /** + * Pads line numbers. Possible values are: + * + * false - don't pad line numbers. + * true - automaticaly pad numbers with minimum required number of leading zeroes. + * [int] - length up to which pad line numbers. + */ + 'pad-line-numbers' : false, + + /** Lines to highlight. */ + 'highlight' : false, + + /** Title to be displayed above the code block. */ + 'title' : null, + + /** Enables or disables smart tabs. */ + 'smart-tabs' : true, + + /** Gets or sets tab size. */ + 'tab-size' : 4, + + /** Enables or disables gutter. */ + 'gutter' : true, + + /** Enables or disables toolbar. */ + 'toolbar' : true, + + /** Enables quick code copy and paste from double click. */ + 'quick-code' : true, + + /** Forces code view to be collapsed. */ + 'collapse' : false, + + /** Enables or disables automatic links. */ + 'auto-links' : false, + + /** Gets or sets light mode. Equavalent to turning off gutter and toolbar. */ + 'light' : false, + + 'unindent' : true, + + 'html-script' : false + }, + + config : { + space : ' ', + + /** Enables use of + * + * ``` + */ + findParent:function (node, filterFn, includeSelf) { + if (node && !domUtils.isBody(node)) { + node = includeSelf ? node : node.parentNode; + while (node) { + if (!filterFn || filterFn(node) || domUtils.isBody(node)) { + return filterFn && !filterFn(node) && domUtils.isBody(node) ? null : node; + } + node = node.parentNode; + } + } + return null; + }, + /** + * 查找node的节点名为tagName的第一个祖先节点, 查找的起点是node节点的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var node = UE.dom.domUtils.findParentByTagName( document.getElementsByTagName("div")[0], [ "BODY" ] ); + * //output: BODY + * console.log( node.tagName ); + * ``` + */ + + /** + * 查找node的节点名为tagName的祖先节点, 如果includeSelf的值为true,则查找的起点是给定的节点node, + * 否则, 起点是node的父节点。 + * @method findParentByTagName + * @param { Node } node 需要查找的节点对象 + * @param { Array } tagNames 需要查找的父节点的名称数组 + * @param { Boolean } includeSelf 查找过程是否包含node节点自身 + * @warning 查找的终点是到body节点为止 + * @return { Node | NULL } 如果找到符合条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var queryTarget = document.getElementsByTagName("div")[0]; + * var node = UE.dom.domUtils.findParentByTagName( queryTarget, [ "DIV" ], true ); + * //output: true + * console.log( queryTarget === node ); + * ``` + */ + findParentByTagName:function (node, tagNames, includeSelf, excludeFn) { + tagNames = utils.listToMap(utils.isArray(tagNames) ? tagNames : [tagNames]); + return domUtils.findParent(node, function (node) { + return tagNames[node.tagName] && !(excludeFn && excludeFn(node)); + }, includeSelf); + }, + /** + * 查找节点node的祖先节点集合, 查找的起点是给定节点的父节点,结果集中不包含给定的节点。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + * @grammar UE.dom.domUtils.findParents(node) => Array //返回一个祖先节点数组集合,不包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf) => Array //返回一个祖先节点数组集合,includeSelf指定是否包含自身 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn) => Array //返回一个祖先节点数组集合,filterFn指定过滤条件,返回true的node将被选取 + * @grammar UE.dom.domUtils.findParents(node,includeSelf,filterFn,closerFirst) => Array //返回一个祖先节点数组集合,closerFirst为true的话,node的直接父亲节点是数组的第0个 + */ + + /** + * 查找节点node的祖先节点集合, 如果includeSelf的值为true, + * 则返回的结果集中允许出现当前给定的节点, 否则, 该节点不会出现在其结果集中。 + * @method findParents + * @param { Node } node 需要查找的节点对象 + * @param { Boolean } includeSelf 查找的结果中是否允许包含当前查找的节点对象 + * @return { Array } 给定节点的祖先节点数组 + */ + findParents:function (node, includeSelf, filterFn, closerFirst) { + var parents = includeSelf && ( filterFn && filterFn(node) || !filterFn ) ? [node] : []; + while (node = domUtils.findParent(node, filterFn)) { + parents.push(node); + } + return closerFirst ? parents : parents.reverse(); + }, + + /** + * 在节点node后面插入新节点newNode + * @method insertAfter + * @param { Node } node 目标节点 + * @param { Node } newNode 新插入的节点, 该节点将置于目标节点之后 + * @return { Node } 新插入的节点 + */ + insertAfter:function (node, newNode) { + return node.nextSibling ? node.parentNode.insertBefore(newNode, node.nextSibling): + node.parentNode.appendChild(newNode); + }, + + /** + * 删除节点node及其下属的所有节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
            + *
            你好
            + *
            + * + * ``` + */ + + /** + * 删除节点node,并根据keepChildren的值决定是否保留子节点 + * @method remove + * @param { Node } node 需要删除的节点对象 + * @param { Boolean } keepChildren 是否需要保留子节点 + * @return { Node } 返回刚删除的节点对象 + * @example + * ```html + *
            + *
            你好
            + *
            + * + * ``` + */ + remove:function (node, keepChildren) { + var parent = node.parentNode, + child; + if (parent) { + if (keepChildren && node.hasChildNodes()) { + while (child = node.firstChild) { + parent.insertBefore(child, node); + } + } + parent.removeChild(node); + } + return node; + }, + + /** + * 取得node节点的下一个兄弟节点, 如果该节点其后没有兄弟节点, 则递归查找其父节点之后的第一个兄弟节点, + * 直到找到满足条件的节点或者递归到BODY节点之后才会结束。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```html + * + *
            + * + *
            + * xxx + * + * + * ``` + * @example + * ```html + * + *
            + * + * xxx + *
            + * xxx + * + * + * ``` + */ + + /** + * 取得node节点的下一个兄弟节点, 如果startFromChild的值为ture,则先获取其子节点, + * 如果有子节点则直接返回第一个子节点;如果没有子节点或者startFromChild的值为false, + * 则执行getNextDomNode(Node node)的查找过程。 + * @method getNextDomNode + * @param { Node } node 需要获取其后的兄弟节点的节点对象 + * @param { Boolean } startFromChild 查找过程是否从其子节点开始 + * @return { Node | NULL } 如果找满足条件的节点, 则返回该节点, 否则返回NULL + * @see UE.dom.domUtils.getNextDomNode(Node) + */ + getNextDomNode:function (node, startFromChild, filterFn, guard) { + return getDomNode(node, 'firstChild', 'nextSibling', startFromChild, filterFn, guard); + }, + getPreDomNode:function (node, startFromChild, filterFn, guard) { + return getDomNode(node, 'lastChild', 'previousSibling', startFromChild, filterFn, guard); + }, + /** + * 检测节点node是否属是UEditor定义的bookmark节点 + * @method isBookmarkNode + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是bookmark节点 + * @example + * ```html + * + * + * ``` + */ + isBookmarkNode:function (node) { + return node.nodeType == 1 && node.id && /^_baidu_bookmark_/i.test(node.id); + }, + /** + * 获取节点node所属的window对象 + * @method getWindow + * @param { Node } node 节点对象 + * @return { Window } 当前节点所属的window对象 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.getWindow( document.body ) === window ); + * ``` + */ + getWindow:function (node) { + var doc = node.ownerDocument || node; + return doc.defaultView || doc.parentWindow; + }, + /** + * 获取离nodeA与nodeB最近的公共的祖先节点 + * @method getCommonAncestor + * @param { Node } nodeA 第一个节点 + * @param { Node } nodeB 第二个节点 + * @remind 如果给定的两个节点是同一个节点, 将直接返回该节点。 + * @return { Node | NULL } 如果未找到公共节点, 返回NULL, 否则返回最近的公共祖先节点。 + * @example + * ```javascript + * var commonAncestor = UE.dom.domUtils.getCommonAncestor( document.body, document.body.firstChild ); + * //output: true + * console.log( commonAncestor.tagName.toLowerCase() === 'body' ); + * ``` + */ + getCommonAncestor:function (nodeA, nodeB) { + if (nodeA === nodeB) + return nodeA; + var parentsA = [nodeA] , parentsB = [nodeB], parent = nodeA, i = -1; + while (parent = parent.parentNode) { + if (parent === nodeB) { + return parent; + } + parentsA.push(parent); + } + parent = nodeB; + while (parent = parent.parentNode) { + if (parent === nodeA) + return parent; + parentsB.push(parent); + } + parentsA.reverse(); + parentsB.reverse(); + while (i++, parentsA[i] === parentsB[i]) { + } + return i == 0 ? null : parentsA[i - 1]; + + }, + /** + * 清除node节点左右连续为空的兄弟inline节点 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * 则这些兄弟节点将被删除 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext) //ignoreNext指定是否忽略右边空节点 + * @grammar UE.dom.domUtils.clearEmptySibling(node,ignoreNext,ignorePre) //ignorePre指定是否忽略左边空节点 + * @example + * ```html + * + *
            + * + * + * + * xxx + * + * + * + * ``` + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + + /** + * 清除node节点左右连续为空的兄弟inline节点, 如果ignoreNext的值为true, + * 则忽略对右边兄弟节点的操作, 如果ignorePre的值为true,则忽略对左边兄弟节点的操作。 + * @method clearEmptySibling + * @param { Node } node 执行的节点对象, 如果该节点的左右连续的兄弟节点是空的inline节点, + * @param { Boolean } ignoreNext 是否忽略忽略对右边的兄弟节点的操作 + * @param { Boolean } ignorePre 是否忽略忽略对左边的兄弟节点的操作 + * 则这些兄弟节点将被删除 + * @see UE.dom.domUtils.clearEmptySibling(Node) + */ + clearEmptySibling:function (node, ignoreNext, ignorePre) { + function clear(next, dir) { + var tmpNode; + while (next && !domUtils.isBookmarkNode(next) && (domUtils.isEmptyInlineElement(next) + //这里不能把空格算进来会吧空格干掉,出现文字间的空格丢掉了 + || !new RegExp('[^\t\n\r' + domUtils.fillChar + ']').test(next.nodeValue) )) { + tmpNode = next[dir]; + domUtils.remove(next); + next = tmpNode; + } + } + !ignoreNext && clear(node.nextSibling, 'nextSibling'); + !ignorePre && clear(node.previousSibling, 'previousSibling'); + }, + /** + * 将一个文本节点textNode拆分成两个文本节点,offset指定拆分位置 + * @method split + * @param { Node } textNode 需要拆分的文本节点对象 + * @param { int } offset 需要拆分的位置, 位置计算从0开始 + * @return { Node } 拆分后形成的新节点 + * @example + * ```html + *
            abcdef
            + * + * ``` + */ + split:function (node, offset) { + var doc = node.ownerDocument; + if (browser.ie && offset == node.nodeValue.length) { + var next = doc.createTextNode(''); + return domUtils.insertAfter(node, next); + } + var retval = node.splitText(offset); + //ie8下splitText不会跟新childNodes,我们手动触发他的更新 + if (browser.ie8) { + var tmpNode = doc.createTextNode(''); + domUtils.insertAfter(retval, tmpNode); + domUtils.remove(tmpNode); + } + return retval; + }, + + /** + * 检测文本节点textNode是否为空节点(包括空格、换行、占位符等字符) + * @method isWhitespace + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 检测的节点是否为空 + * @example + * ```html + *
            + * + *
            + * + * ``` + */ + isWhitespace:function (node) { + return !new RegExp('[^ \t\n\r' + domUtils.fillChar + ']').test(node.nodeValue); + }, + /** + * 获取元素element相对于viewport的位置坐标 + * @method getXY + * @param { Node } element 需要计算位置的节点对象 + * @return { Object } 返回形如{x:left,y:top}的一个key-value映射对象, 其中键x代表水平偏移距离, + * y代表垂直偏移距离。 + * + * @example + * ```javascript + * var location = UE.dom.domUtils.getXY( document.getElementById("test") ); + * //output: test的坐标为: 12, 24 + * console.log( 'test的坐标为: ', location.x, ',', location.y ); + * ``` + */ + getXY:function (element) { + var x = 0, y = 0; + while (element.offsetParent) { + y += element.offsetTop; + x += element.offsetLeft; + element = element.offsetParent; + } + return { 'x':x, 'y':y}; + }, + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { String } type 绑定的事件类型 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,"click",function(e){ + * //e为事件对象,this为被点击元素对戏那个 + * }); + * ``` + */ + + /** + * 为元素element绑定原生DOM事件,type为事件类型,handler为处理函数 + * @method on + * @param { Node } element 需要绑定事件的节点对象 + * @param { Array } type 绑定的事件类型数组 + * @param { Function } handler 事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.on(document.body,["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + on:function (element, type, handler) { + + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els : [] + }; + } + var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); + if (!handler._d[key] || index == -1) { + if(index == -1){ + handler._d.els.push(element); + } + if(!handler._d[key]){ + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } + + + element.attachEvent('on' + type, handler._d[key]); + } + } + } + element = null; + }, + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { String } type 需要接触绑定的事件类型 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body,"click",function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + + /** + * 解除DOM事件绑定 + * @method un + * @param { Node } element 需要解除事件绑定的节点对象 + * @param { Array } type 需要接触绑定的事件类型数组 + * @param { Function } handler 对应的事件处理器 + * @example + * ```javascript + * UE.dom.domUtils.un(document.body, ["click","mousedown"],function(evt){ + * //evt为事件对象,this为被点击元素对象 + * }); + * ``` + */ + un:function (element, type, handler) { + var types = utils.isArray(type) ? type : utils.trim(type).split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try{ + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + }catch(e){} + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els,element); + if(index!=-1){ + handler._d.els.splice(index,1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } + } + }, + + /** + * 比较节点nodeA与节点nodeB是否具有相同的标签名、属性名以及属性值 + * @method isSameElement + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的标签名、属性名以及属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + isSameElement:function (nodeA, nodeB) { + if (nodeA.tagName != nodeB.tagName) { + return false; + } + var thisAttrs = nodeA.attributes, + otherAttrs = nodeB.attributes; + if (!ie && thisAttrs.length != otherAttrs.length) { + return false; + } + var attrA, attrB, al = 0, bl = 0; + for (var i = 0; attrA = thisAttrs[i++];) { + if (attrA.nodeName == 'style') { + if (attrA.specified) { + al++; + } + if (domUtils.isSameStyle(nodeA, nodeB)) { + continue; + } else { + return false; + } + } + if (ie) { + if (attrA.specified) { + al++; + attrB = otherAttrs.getNamedItem(attrA.nodeName); + } else { + continue; + } + } else { + attrB = nodeB.attributes[attrA.nodeName]; + } + if (!attrB.specified || attrA.nodeValue != attrB.nodeValue) { + return false; + } + } + // 有可能attrB的属性包含了attrA的属性之外还有自己的属性 + if (ie) { + for (i = 0; attrB = otherAttrs[i++];) { + if (attrB.specified) { + bl++; + } + } + if (al != bl) { + return false; + } + } + return true; + }, + + /** + * 判断节点nodeA与节点nodeB的元素的style属性是否一致 + * @method isSameStyle + * @param { Node } nodeA 需要比较的节点 + * @param { Node } nodeB 需要比较的节点 + * @return { Boolean } 两个节点是否具有相同的style属性值 + * @example + * ```html + * ssss + * bbbbb + * ssss + * bbbbb + * + * + * ``` + */ + isSameStyle:function (nodeA, nodeB) { + var styleA = nodeA.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'), + styleB = nodeB.style.cssText.replace(/( ?; ?)/g, ';').replace(/( ?: ?)/g, ':'); + if (browser.opera) { + styleA = nodeA.style; + styleB = nodeB.style; + if (styleA.length != styleB.length) + return false; + for (var p in styleA) { + if (/^(\d+|csstext)$/i.test(p)) { + continue; + } + if (styleA[p] != styleB[p]) { + return false; + } + } + return true; + } + if (!styleA || !styleB) { + return styleA == styleB; + } + styleA = styleA.split(';'); + styleB = styleB.split(';'); + if (styleA.length != styleB.length) { + return false; + } + for (var i = 0, ci; ci = styleA[i++];) { + if (utils.indexOf(styleB, ci) == -1) { + return false; + } + } + return true; + }, + /** + * 检查节点node是否为block元素 + * @method isBlockElm + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 是否是block元素节点 + * @warning 该方法的判断规则如下: 如果该元素原本是block元素, 则不论该元素当前的css样式是什么都会返回true; + * 否则,检测该元素的css样式, 如果该元素当前是block元素, 则返回true。 其余情况下都返回false。 + * @example + * ```html + * + * + *
            + * + * + * ``` + */ + isBlockElm:function (node) { + return node.nodeType == 1 && (dtd.$block[node.tagName] || styleBlock[domUtils.getComputedStyle(node, 'display')]) && !dtd.$nonChild[node.tagName]; + }, + /** + * 检测node节点是否为body节点 + * @method isBody + * @param { Element } node 需要检测的dom元素 + * @return { Boolean } 给定的元素是否是body元素 + * @example + * ```javascript + * //output: true + * console.log( UE.dom.domUtils.isBody( document.body ) ); + * ``` + */ + isBody:function (node) { + return node && node.nodeType == 1 && node.tagName.toLowerCase() == 'body'; + }, + /** + * 以node节点为分界,将该节点的指定祖先节点parent拆分成两个独立的节点, + * 拆分形成的两个节点之间是node节点 + * @method breakParent + * @param { Node } node 作为分界的节点对象 + * @param { Node } parent 该节点必须是node节点的祖先节点, 且是block节点。 + * @return { Node } 给定的node分界节点 + * @example + * ```javascript + * + * var node = document.createElement("span"), + * wrapNode = document.createElement( "div" ), + * parent = document.createElement("p"); + * + * parent.appendChild( node ); + * wrapNode.appendChild( parent ); + * + * //拆分前 + * //output:

            + * console.log( wrapNode.innerHTML ); + * + * + * UE.dom.domUtils.breakParent( node, parent ); + * //拆分后 + * //output:

            + * console.log( wrapNode.innerHTML ); + * + * ``` + */ + breakParent:function (node, parent) { + var tmpNode, + parentClone = node, + clone = node, + leftNodes, + rightNodes; + do { + parentClone = parentClone.parentNode; + if (leftNodes) { + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(leftNodes); + leftNodes = tmpNode; + tmpNode = parentClone.cloneNode(false); + tmpNode.appendChild(rightNodes); + rightNodes = tmpNode; + } else { + leftNodes = parentClone.cloneNode(false); + rightNodes = leftNodes.cloneNode(false); + } + while (tmpNode = clone.previousSibling) { + leftNodes.insertBefore(tmpNode, leftNodes.firstChild); + } + while (tmpNode = clone.nextSibling) { + rightNodes.appendChild(tmpNode); + } + clone = parentClone; + } while (parent !== parentClone); + tmpNode = parent.parentNode; + tmpNode.insertBefore(leftNodes, parent); + tmpNode.insertBefore(rightNodes, parent); + tmpNode.insertBefore(node, rightNodes); + domUtils.remove(parent); + return node; + }, + /** + * 检查节点node是否是空inline节点 + * @method isEmptyInlineElement + * @param { Node } node 需要检测的节点对象 + * @return { Number } 如果给定的节点是空的inline节点, 则返回1, 否则返回0。 + * @example + * ```html + * => 1 + * => 1 + * => 1 + * xx => 0 + * ``` + */ + isEmptyInlineElement:function (node) { + if (node.nodeType != 1 || !dtd.$removeEmpty[ node.tagName ]) { + return 0; + } + node = node.firstChild; + while (node) { + //如果是创建的bookmark就跳过 + if (domUtils.isBookmarkNode(node)) { + return 0; + } + if (node.nodeType == 1 && !domUtils.isEmptyInlineElement(node) || + node.nodeType == 3 && !domUtils.isWhitespace(node) + ) { + return 0; + } + node = node.nextSibling; + } + return 1; + + }, + + /** + * 删除node节点下首尾两端的空白文本子节点 + * @method trimWhiteTextNode + * @param { Element } node 需要执行删除操作的元素对象 + * @example + * ```javascript + * var node = document.createElement("div"); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * node.appendChild( document.createElement("div") ); + * + * node.appendChild( document.createTextNode( "" ) ); + * + * //3 + * console.log( node.childNodes.length ); + * + * UE.dom.domUtils.trimWhiteTextNode( node ); + * + * //1 + * console.log( node.childNodes.length ); + * ``` + */ + trimWhiteTextNode:function (node) { + function remove(dir) { + var child; + while ((child = node[dir]) && child.nodeType == 3 && domUtils.isWhitespace(child)) { + node.removeChild(child); + } + } + remove('firstChild'); + remove('lastChild'); + }, + + /** + * 合并node节点下相同的子节点 + * @name mergeChild + * @desc + * UE.dom.domUtils.mergeChild(node,tagName) //tagName要合并的子节点的标签 + * @example + *

            xxaaxx

            + * ==> UE.dom.domUtils.mergeChild(node,'span') + *

            xxaaxx

            + */ + mergeChild:function (node, tagName, attrs) { + var list = domUtils.getElementsByTagName(node, node.tagName.toLowerCase()); + for (var i = 0, ci; ci = list[i++];) { + if (!ci.parentNode || domUtils.isBookmarkNode(ci)) { + continue; + } + //span单独处理 + if (ci.tagName.toLowerCase() == 'span') { + if (node === ci.parentNode) { + domUtils.trimWhiteTextNode(node); + if (node.childNodes.length == 1) { + node.style.cssText = ci.style.cssText + ";" + node.style.cssText; + domUtils.remove(ci, true); + continue; + } + } + ci.style.cssText = node.style.cssText + ';' + ci.style.cssText; + if (attrs) { + var style = attrs.style; + if (style) { + style = style.split(';'); + for (var j = 0, s; s = style[j++];) { + ci.style[utils.cssStyleToDomStyle(s.split(':')[0])] = s.split(':')[1]; + } + } + } + if (domUtils.isSameStyle(ci, node)) { + domUtils.remove(ci, true); + } + continue; + } + if (domUtils.isSameElement(node, ci)) { + domUtils.remove(ci, true); + } + } + }, + + /** + * 原生方法getElementsByTagName的封装 + * @method getElementsByTagName + * @param { Node } node 目标节点对象 + * @param { String } tagName 需要查找的节点的tagName, 多个tagName以空格分割 + * @return { Array } 符合条件的节点集合 + */ + getElementsByTagName:function (node, name,filter) { + if(filter && utils.isString(filter)){ + var className = filter; + filter = function(node){return domUtils.hasClass(node,className)} + } + name = utils.trim(name).replace(/[ ]{2,}/g,' ').split(' '); + var arr = []; + for(var n = 0,ni;ni=name[n++];){ + var list = node.getElementsByTagName(ni); + for (var i = 0, ci; ci = list[i++];) { + if(!filter || filter(ci)) + arr.push(ci); + } + } + + return arr; + }, + /** + * 将节点node提取到父节点上 + * @method mergeToParent + * @param { Element } node 需要提取的元素对象 + * @example + * ```html + *
            + *
            + * + *
            + *
            + * + * + * ``` + */ + mergeToParent:function (node) { + var parent = node.parentNode; + while (parent && dtd.$removeEmpty[parent.tagName]) { + if (parent.tagName == node.tagName || parent.tagName == 'A') {//针对a标签单独处理 + domUtils.trimWhiteTextNode(parent); + //span需要特殊处理 不处理这样的情况 xxxxxxxxx + if (parent.tagName == 'SPAN' && !domUtils.isSameStyle(parent, node) + || (parent.tagName == 'A' && node.tagName == 'SPAN')) { + if (parent.childNodes.length > 1 || parent !== node.parentNode) { + node.style.cssText = parent.style.cssText + ";" + node.style.cssText; + parent = parent.parentNode; + continue; + } else { + parent.style.cssText += ";" + node.style.cssText; + //trace:952 a标签要保持下划线 + if (parent.tagName == 'A') { + parent.style.textDecoration = 'underline'; + } + } + } + if (parent.tagName != 'A') { + parent === node.parentNode && domUtils.remove(node, true); + break; + } + } + parent = parent.parentNode; + } + }, + /** + * 合并节点node的左右兄弟节点 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点, 可以根据给定的条件选择是否忽略合并左节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + + /** + * 合并节点node的左右兄弟节点,可以根据给定的条件选择是否忽略合并左右节点。 + * @method mergeSibling + * @param { Element } node 需要合并的目标节点 + * @param { Boolean } ignorePre 是否忽略合并左节点 + * @param { Boolean } ignoreNext 是否忽略合并右节点 + * @remind 如果同时忽略左右节点, 则该操作什么也不会做 + * @example + * ```html + * xxxxoooxxxx + * + * + * ``` + */ + mergeSibling:function (node, ignorePre, ignoreNext) { + function merge(rtl, start, node) { + var next; + if ((next = node[rtl]) && !domUtils.isBookmarkNode(next) && next.nodeType == 1 && domUtils.isSameElement(node, next)) { + while (next.firstChild) { + if (start == 'firstChild') { + node.insertBefore(next.lastChild, node.firstChild); + } else { + node.appendChild(next.firstChild); + } + } + domUtils.remove(next); + } + } + !ignorePre && merge('previousSibling', 'firstChild', node); + !ignoreNext && merge('nextSibling', 'lastChild', node); + }, + + /** + * 设置节点node及其子节点不会被选中 + * @method unSelectable + * @param { Element } node 需要执行操作的dom元素 + * @remind 执行该操作后的节点, 将不能被鼠标选中 + * @example + * ```javascript + * UE.dom.domUtils.unSelectable( document.body ); + * ``` + */ + unSelectable:ie && browser.ie9below || browser.opera ? function (node) { + //for ie9 + node.onselectstart = function () { + return false; + }; + node.onclick = node.onkeyup = node.onkeydown = function () { + return false; + }; + node.unselectable = 'on'; + node.setAttribute("unselectable", "on"); + for (var i = 0, ci; ci = node.all[i++];) { + switch (ci.tagName.toLowerCase()) { + case 'iframe' : + case 'textarea' : + case 'input' : + case 'select' : + break; + default : + ci.unselectable = 'on'; + node.setAttribute("unselectable", "on"); + } + } + } : function (node) { + node.style.MozUserSelect = + node.style.webkitUserSelect = + node.style.msUserSelect = + node.style.KhtmlUserSelect = 'none'; + }, + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { String } attrNames 可以是空格隔开的多个属性名称,该操作将会依次删除相应的属性 + * @example + * ```html + *
            + * xxxxx + *
            + * + * + * ``` + */ + + /** + * 删除节点node上的指定属性名称的属性 + * @method removeAttributes + * @param { Node } node 需要删除属性的节点对象 + * @param { Array } attrNames 需要删除的属性名数组 + * @example + * ```html + *
            + * xxxxx + *
            + * + * + * ``` + */ + removeAttributes:function (node, attrNames) { + attrNames = utils.isArray(attrNames) ? attrNames : utils.trim(attrNames).replace(/[ ]{2,}/g,' ').split(' '); + for (var i = 0, ci; ci = attrNames[i++];) { + ci = attrFix[ci] || ci; + switch (ci) { + case 'className': + node[ci] = ''; + break; + case 'style': + node.style.cssText = ''; + var val = node.getAttributeNode('style'); + !browser.ie && val && node.removeAttributeNode(val); + } + node.removeAttribute(ci); + } + }, + /** + * 在doc下创建一个标签名为tag,属性为attrs的元素 + * @method createElement + * @param { DomDocument } doc 新创建的元素属于该document节点创建 + * @param { String } tagName 需要创建的元素的标签名 + * @param { Object } attrs 新创建的元素的属性key-value集合 + * @return { Element } 新创建的元素对象 + * @example + * ```javascript + * var ele = UE.dom.domUtils.createElement( document, 'div', { + * id: 'test' + * } ); + * + * //output: DIV + * console.log( ele.tagName ); + * + * //output: test + * console.log( ele.id ); + * + * ``` + */ + createElement:function (doc, tag, attrs) { + return domUtils.setAttributes(doc.createElement(tag), attrs) + }, + /** + * 为节点node添加属性attrs,attrs为属性键值对 + * @method setAttributes + * @param { Element } node 需要设置属性的元素对象 + * @param { Object } attrs 需要设置的属性名-值对 + * @return { Element } 设置属性的元素对象 + * @example + * ```html + * + * + * + * + */ + setAttributes:function (node, attrs) { + for (var attr in attrs) { + if(attrs.hasOwnProperty(attr)){ + var value = attrs[attr]; + switch (attr) { + case 'class': + //ie下要这样赋值,setAttribute不起作用 + node.className = value; + break; + case 'style' : + node.style.cssText = node.style.cssText + ";" + value; + break; + case 'innerHTML': + node[attr] = value; + break; + case 'value': + node.value = value; + break; + default: + node.setAttribute(attrFix[attr] || attr, value); + } + } + } + return node; + }, + + /** + * 获取元素element经过计算后的样式值 + * @method getComputedStyle + * @param { Element } element 需要获取样式的元素对象 + * @param { String } styleName 需要获取的样式名 + * @return { String } 获取到的样式值 + * @example + * ```html + * + * + * + * + * + * ``` + */ + getComputedStyle:function (element, styleName) { + //一下的属性单独处理 + var pros = 'width height top left'; + + if(pros.indexOf(styleName) > -1){ + return element['offset' + styleName.replace(/^\w/,function(s){return s.toUpperCase()})] + 'px'; + } + //忽略文本节点 + if (element.nodeType == 3) { + element = element.parentNode; + } + //ie下font-size若body下定义了font-size,则从currentStyle里会取到这个font-size. 取不到实际值,故此修改. + if (browser.ie && browser.version < 9 && styleName == 'font-size' && !element.style.fontSize && + !dtd.$empty[element.tagName] && !dtd.$nonChild[element.tagName]) { + var span = element.ownerDocument.createElement('span'); + span.style.cssText = 'padding:0;border:0;font-family:simsun;'; + span.innerHTML = '.'; + element.appendChild(span); + var result = span.offsetHeight; + element.removeChild(span); + span = null; + return result + 'px'; + } + try { + var value = domUtils.getStyle(element, styleName) || + (window.getComputedStyle ? domUtils.getWindow(element).getComputedStyle(element, '').getPropertyValue(styleName) : + ( element.currentStyle || element.style )[utils.cssStyleToDomStyle(styleName)]); + + } catch (e) { + return ""; + } + return utils.transUnitToPx(utils.fixColor(styleName, value)); + }, + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { String } classNames 需要删除的className, 多个className之间以空格分开 + * @example + * ```html + * xxx + * + * + * ``` + */ + + /** + * 删除元素element指定的className + * @method removeClasses + * @param { Element } ele 需要删除class的元素节点 + * @param { Array } classNames 需要删除的className数组 + * @example + * ```html + * xxx + * + * + * ``` + */ + removeClasses:function (elm, classNames) { + classNames = utils.isArray(classNames) ? classNames : + utils.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') + } + cls = utils.trim(cls).replace(/[ ]{2,}/g,' '); + if(cls){ + elm.className = cls; + }else{ + domUtils.removeAttributes(elm,['class']); + } + }, + /** + * 给元素element添加className + * @method addClass + * @param { Node } ele 需要增加className的元素 + * @param { String } classNames 需要添加的className, 多个className之间以空格分割 + * @remind 相同的类名不会被重复添加 + * @example + * ```html + * + * + * + * ``` + */ + + /** + * 判断元素element是否包含给定的样式类名className + * @method hasClass + * @param { Node } ele 需要检测的元素 + * @param { Array } classNames 需要检测的className数组 + * @return { Boolean } 元素是否包含所有给定的className + * @example + * ```html + * + * + * + * ``` + */ + hasClass:function (element, className) { + if(utils.isRegExp(className)){ + return className.test(element.className) + } + className = utils.trim(className).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = element.className;ci=className[i++];){ + if(!new RegExp('\\b' + ci + '\\b','i').test(cls)){ + return false; + } + } + return i - 1 == className.length; + }, + + /** + * 阻止事件默认行为 + * @method preventDefault + * @param { Event } evt 需要阻止默认行为的事件对象 + * @example + * ```javascript + * UE.dom.domUtils.preventDefault( evt ); + * ``` + */ + preventDefault:function (evt) { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + }, + /** + * 删除元素element指定的样式 + * @method removeStyle + * @param { Element } element 需要删除样式的元素 + * @param { String } styleName 需要删除的样式名 + * @example + * ```html + * + * + * + * ``` + */ + removeStyle:function (element, name) { + if(browser.ie ){ + //针对color先单独处理一下 + if(name == 'color'){ + name = '(^|;)' + name; + } + element.style.cssText = element.style.cssText.replace(new RegExp(name + '[^:]*:[^;]+;?','ig'),'') + }else{ + if (element.style.removeProperty) { + element.style.removeProperty (name); + }else { + element.style.removeAttribute (utils.cssStyleToDomStyle(name)); + } + } + + + if (!element.style.cssText) { + domUtils.removeAttributes(element, ['style']); + } + }, + /** + * 获取元素element的style属性的指定值 + * @method getStyle + * @param { Element } element 需要获取属性值的元素 + * @param { String } styleName 需要获取的style的名称 + * @warning 该方法仅获取元素style属性中所标明的值 + * @return { String } 该元素包含指定的style属性值 + * @example + * ```html + *
            + * + * + * ``` + */ + getStyle:function (element, name) { + var value = element.style[ utils.cssStyleToDomStyle(name) ]; + return utils.fixColor(name, value); + }, + /** + * 为元素element设置样式属性值 + * @method setStyle + * @param { Element } element 需要设置样式的元素 + * @param { String } styleName 样式名 + * @param { String } styleValue 样式值 + * @example + * ```html + *
            + * + * + * ``` + */ + setStyle:function (element, name, value) { + element.style[utils.cssStyleToDomStyle(name)] = value; + if(!utils.trim(element.style.cssText)){ + this.removeAttributes(element,'style') + } + }, + /** + * 为元素element设置多个样式属性值 + * @method setStyles + * @param { Element } element 需要设置样式的元素 + * @param { Object } styles 样式名值对 + * @example + * ```html + *
            + * + * + * ``` + */ + setStyles:function (element, styles) { + for (var name in styles) { + if (styles.hasOwnProperty(name)) { + domUtils.setStyle(element, name, styles[name]); + } + } + }, + /** + * 删除_moz_dirty属性 + * @private + * @method removeDirtyAttr + */ + removeDirtyAttr:function (node) { + for (var i = 0, ci, nodes = node.getElementsByTagName('*'); ci = nodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + node.removeAttribute('_moz_dirty'); + }, + /** + * 获取子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @return { Number } 给定的node元素的子节点数量 + * @example + * ```html + *
            + * + *
            + * + * + * ``` + */ + + /** + * 根据给定的过滤规则, 获取符合条件的子节点的数量 + * @method getChildCount + * @param { Element } node 需要检测的元素 + * @param { Function } fn 过滤器, 要求对符合条件的子节点返回true, 反之则要求返回false + * @return { Number } 符合过滤条件的node元素的子节点数量 + * @example + * ```html + *
            + * + *
            + * + * + * ``` + */ + getChildCount:function (node, fn) { + var count = 0, first = node.firstChild; + fn = fn || function () { + return 1; + }; + while (first) { + if (fn(first)) { + count++; + } + first = first.nextSibling; + } + return count; + }, + + /** + * 判断给定节点是否为空节点 + * @method isEmptyNode + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否为空 + * @example + * ```javascript + * UE.dom.domUtils.isEmptyNode( document.body ); + * ``` + */ + isEmptyNode:function (node) { + return !node.firstChild || domUtils.getChildCount(node, function (node) { + return !domUtils.isBr(node) && !domUtils.isBookmarkNode(node) && !domUtils.isWhitespace(node) + }) == 0 + }, + clearSelectedArr:function (nodes) { + var node; + while (node = nodes.pop()) { + domUtils.removeAttributes(node, ['class']); + } + }, + /** + * 将显示区域滚动到指定节点的位置 + * @method scrollToView + * @param {Node} node 节点 + * @param {window} win window对象 + * @param {Number} offsetTop 距离上方的偏移量 + */ + scrollToView:function (node, win, offsetTop) { + var getViewPaneSize = function () { + var doc = win.document, + mode = doc.compatMode == 'CSS1Compat'; + return { + width:( mode ? doc.documentElement.clientWidth : doc.body.clientWidth ) || 0, + height:( mode ? doc.documentElement.clientHeight : doc.body.clientHeight ) || 0 + }; + }, + getScrollPosition = function (win) { + if ('pageXOffset' in win) { + return { + x:win.pageXOffset || 0, + y:win.pageYOffset || 0 + }; + } + else { + var doc = win.document; + return { + x:doc.documentElement.scrollLeft || doc.body.scrollLeft || 0, + y:doc.documentElement.scrollTop || doc.body.scrollTop || 0 + }; + } + }; + var winHeight = getViewPaneSize().height, offset = winHeight * -1 + offsetTop; + offset += (node.offsetHeight || 0); + var elementPosition = domUtils.getXY(node); + offset += elementPosition.y; + var currentScroll = getScrollPosition(win).y; + // offset += 50; + if (offset > currentScroll || offset < currentScroll - winHeight) { + win.scrollTo(0, offset + (offset < 0 ? -20 : 20)); + } + }, + /** + * 判断给定节点是否为br + * @method isBr + * @param { Node } node 需要判断的节点对象 + * @return { Boolean } 给定的节点是否是br节点 + */ + isBr:function (node) { + return node.nodeType == 1 && node.tagName == 'BR'; + }, + /** + * 判断给定的节点是否是一个“填充”节点 + * @private + * @method isFillChar + * @param { Node } node 需要判断的节点 + * @param { Boolean } isInStart 是否从节点内容的开始位置匹配 + * @returns { Boolean } 节点是否是填充节点 + */ + isFillChar:function (node,isInStart) { + if(node.nodeType != 3) + return false; + var text = node.nodeValue; + if(isInStart){ + return new RegExp('^' + domUtils.fillChar).test(text) + } + return !text.replace(new RegExp(domUtils.fillChar,'g'), '').length + }, + isStartInblock:function (range) { + var tmpRange = range.cloneRange(), + flag = 0, + start = tmpRange.startContainer, + tmp; + if(start.nodeType == 1 && start.childNodes[tmpRange.startOffset]){ + start = start.childNodes[tmpRange.startOffset]; + var pre = start.previousSibling; + while(pre && domUtils.isFillChar(pre)){ + start = pre; + pre = pre.previousSibling; + } + } + if(this.isFillChar(start,true) && tmpRange.startOffset == 1){ + tmpRange.setStartBefore(start); + start = tmpRange.startContainer; + } + + while (start && domUtils.isFillChar(start)) { + tmp = start; + start = start.previousSibling + } + if (tmp) { + tmpRange.setStartBefore(tmp); + start = tmpRange.startContainer; + } + if (start.nodeType == 1 && domUtils.isEmptyNode(start) && tmpRange.startOffset == 1) { + tmpRange.setStart(start, 0).collapse(true); + } + while (!tmpRange.startOffset) { + start = tmpRange.startContainer; + if (domUtils.isBlockElm(start) || domUtils.isBody(start)) { + flag = 1; + break; + } + var pre = tmpRange.startContainer.previousSibling, + tmpNode; + if (!pre) { + tmpRange.setStartBefore(tmpRange.startContainer); + } else { + while (pre && domUtils.isFillChar(pre)) { + tmpNode = pre; + pre = pre.previousSibling; + } + if (tmpNode) { + tmpRange.setStartBefore(tmpNode); + } else { + tmpRange.setStartBefore(tmpRange.startContainer); + } + } + } + return flag && !domUtils.isBody(tmpRange.startContainer) ? 1 : 0; + }, + + /** + * 判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @return { Boolean } 是否是空元素 + * @example + * ```html + *
            + * + * + * ``` + */ + + /** + * 根据指定的判断规则判断给定的元素是否是一个空元素 + * @method isEmptyBlock + * @param { Element } node 需要判断的元素 + * @param { RegExp } reg 对内容执行判断的正则表达式对象 + * @return { Boolean } 是否是空元素 + */ + isEmptyBlock:function (node,reg) { + if(node.nodeType != 1) + return 0; + reg = reg || new RegExp('[ \xa0\t\r\n' + domUtils.fillChar + ']', 'g'); + + if (node[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').length > 0) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + }, + + /** + * 移动元素使得该元素的位置移动指定的偏移量的距离 + * @method setViewportOffset + * @param { Element } element 需要设置偏移量的元素 + * @param { Object } offset 偏移量, 形如{ left: 100, top: 50 }的一个键值对, 表示该元素将在 + * 现有的位置上向水平方向偏移offset.left的距离, 在竖直方向上偏移 + * offset.top的距离 + * @example + * ```html + *
            + * + * + * ``` + */ + setViewportOffset:function (element, offset) { + var left = parseInt(element.style.left) | 0; + var top = parseInt(element.style.top) | 0; + var rect = element.getBoundingClientRect(); + var offsetLeft = offset.left - rect.left; + var offsetTop = offset.top - rect.top; + if (offsetLeft) { + element.style.left = left + offsetLeft + 'px'; + } + if (offsetTop) { + element.style.top = top + offsetTop + 'px'; + } + }, + + /** + * 用“填充字符”填充节点 + * @method fillNode + * @private + * @param { DomDocument } doc 填充的节点所在的docment对象 + * @param { Node } node 需要填充的节点对象 + * @example + * ```html + *
            + * + * + * ``` + */ + fillNode:function (doc, node) { + var tmpNode = browser.ie ? doc.createTextNode(domUtils.fillChar) : doc.createElement('br'); + node.innerHTML = ''; + node.appendChild(tmpNode); + }, + + /** + * 把节点src的所有子节点追加到另一个节点tag上去 + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被追加到该节点下 + * @example + * ```html + *
            + * + *
            + *
            + *
            + *
            + * + * + * ``` + */ + + /** + * 把节点src的所有子节点移动到另一个节点tag上去, 可以通过dir参数控制附加的行为是“追加”还是“插入顶部” + * @method moveChild + * @param { Node } src 源节点, 该节点下的所有子节点将被移除 + * @param { Node } tag 目标节点, 从源节点移除的子节点将被附加到该节点下 + * @param { Boolean } dir 附加方式, 如果为true, 则附加进去的节点将被放到目标节点的顶部, 反之,则放到末尾 + * @example + * ```html + *
            + * + *
            + *
            + *
            + *
            + * + * + * ``` + */ + moveChild:function (src, tag, dir) { + while (src.firstChild) { + if (dir && tag.firstChild) { + tag.insertBefore(src.lastChild, tag.firstChild); + } else { + tag.appendChild(src.firstChild); + } + } + }, + + /** + * 判断节点的标签上是否不存在任何属性 + * @method hasNoAttributes + * @private + * @param { Node } node 需要检测的节点对象 + * @return { Boolean } 节点是否不包含任何属性 + * @example + * ```html + *
            xxxx
            + * + * + * ``` + */ + hasNoAttributes:function (node) { + return browser.ie ? /^<\w+\s*?>/.test(node.outerHTML) : node.attributes.length == 0; + }, + + /** + * 检测节点是否是UEditor所使用的辅助节点 + * @method isCustomeNode + * @private + * @param { Node } node 需要检测的节点 + * @remind 辅助节点是指编辑器要完成工作临时添加的节点, 在输出的时候将会从编辑器内移除, 不会影响最终的结果。 + * @return { Boolean } 给定的节点是否是一个辅助节点 + */ + isCustomeNode:function (node) { + return node.nodeType == 1 && node.getAttribute('_ue_custom_node_'); + }, + + /** + * 检测节点的标签是否是给定的标签 + * @method isTagNode + * @param { Node } node 需要检测的节点对象 + * @param { String } tagName 标签 + * @return { Boolean } 节点的标签是否是给定的标签 + * @example + * ```html + *
            + * + * + * ``` + */ + isTagNode:function (node, tagNames) { + return node.nodeType == 1 && new RegExp('\\b' + node.tagName + '\\b','i').test(tagNames) + }, + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 获取其中满足过滤条件的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @return { Node | NULL } 如果找到符合过滤条件的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() !== 'div'; + * } ) ); + * ``` + */ + + /** + * 给定一个节点数组nodeList和一组标签名tagNames, 获取其中能够匹配标签名的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { String } tagNames 需要匹配的标签名, 多个标签名之间用空格分割 + * @return { Node | NULL } 如果找到标签名匹配的节点, 则返回该节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: null + * console.log( UE.dom.domUtils.filterNodeList( divNodes, 'a span' ) ); + * ``` + */ + + /** + * 给定一个节点数组,在通过指定的过滤器过滤后, 如果参数forAll为true, 则会返回所有满足过滤 + * 条件的节点集合, 否则, 返回满足条件的节点集合中的第一个节点 + * @method filterNodeList + * @param { Array } nodeList 需要过滤的节点数组 + * @param { Function } fn 过滤器, 对符合条件的节点, 执行结果返回true, 反之则返回false + * @param { Boolean } forAll 是否返回整个节点数组, 如果该参数为false, 则返回节点集合中的第一个节点 + * @return { Array | Node | NULL } 如果找到符合过滤条件的节点, 则根据参数forAll的值决定返回满足 + * 过滤条件的节点数组或第一个节点, 否则返回NULL + * @example + * ```javascript + * var divNodes = document.getElementsByTagName("div"); + * divNodes = [].slice.call( divNodes, 0 ); + * + * //output: 3(假定有3个div) + * console.log( divNodes.length ); + * + * var nodes = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, true ); + * + * //output: 3 + * console.log( nodes.length ); + * + * var node = UE.dom.domUtils.filterNodeList( divNodes, function ( node ) { + * return node.tagName.toLowerCase() === 'div'; + * }, false ); + * + * //output: div + * console.log( node.nodeName ); + * ``` + */ + filterNodeList : function(nodelist,filter,forAll){ + var results = []; + if(!utils .isFunction(filter)){ + var str = filter; + filter = function(n){ + return utils.indexOf(utils.isArray(str) ? str:str.split(' '), n.tagName.toLowerCase()) != -1 + }; + } + utils.each(nodelist,function(n){ + filter(n) && results.push(n) + }); + return results.length == 0 ? null : results.length == 1 || !forAll ? results[0] : results + }, + + /** + * 查询给定的range选区是否在给定的node节点内,且在该节点的最末尾 + * @method isInNodeEndBoundary + * @param { UE.dom.Range } rng 需要判断的range对象, 该对象的startContainer不能为NULL + * @param node 需要检测的节点对象 + * @return { Number } 如果给定的选取range对象是在node内部的最末端, 则返回1, 否则返回0 + */ + isInNodeEndBoundary : function (rng,node){ + var start = rng.startContainer; + if(start.nodeType == 3 && rng.startOffset != start.nodeValue.length){ + return 0; + } + if(start.nodeType == 1 && rng.startOffset != start.childNodes.length){ + return 0; + } + while(start !== node){ + if(start.nextSibling){ + return 0 + }; + start = start.parentNode; + } + return 1; + }, + isBoundaryNode : function (node,dir){ + var tmp; + while(!domUtils.isBody(node)){ + tmp = node; + node = node.parentNode; + if(tmp !== node[dir]){ + return false; + } + } + return true; + }, + fillHtml : browser.ie11below ? ' ' : '
            ' +}; +var fillCharReg = new RegExp(domUtils.fillChar, 'g'); + +// core/Range.js +/** + * Range封装 + * @file + * @module UE.dom + * @class Range + * @since 1.2.6.1 + */ + +/** + * dom操作封装 + * @unfile + * @module UE.dom + */ + +/** + * Range实现类,本类是UEditor底层核心类,封装不同浏览器之间的Range操作。 + * @unfile + * @module UE.dom + * @class Range + */ + + +(function () { + var guid = 0, + fillChar = domUtils.fillChar, + fillData; + + /** + * 更新range的collapse状态 + * @param {Range} range range对象 + */ + function updateCollapse(range) { + range.collapsed = + range.startContainer && range.endContainer && + range.startContainer === range.endContainer && + range.startOffset == range.endOffset; + } + + function selectOneNode(rng){ + return !rng.collapsed && rng.startContainer.nodeType == 1 && rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset == 1 + } + function setEndPoint(toStart, node, offset, range) { + //如果node是自闭合标签要处理 + if (node.nodeType == 1 && (dtd.$empty[node.tagName] || dtd.$nonChild[node.tagName])) { + offset = domUtils.getNodeIndex(node) + (toStart ? 0 : 1); + node = node.parentNode; + } + if (toStart) { + range.startContainer = node; + range.startOffset = offset; + if (!range.endContainer) { + range.collapse(true); + } + } else { + range.endContainer = node; + range.endOffset = offset; + if (!range.startContainer) { + range.collapse(false); + } + } + updateCollapse(range); + return range; + } + + function execContentsAction(range, action) { + //调整边界 + //range.includeBookmark(); + var start = range.startContainer, + end = range.endContainer, + startOffset = range.startOffset, + endOffset = range.endOffset, + doc = range.document, + frag = doc.createDocumentFragment(), + tmpStart, tmpEnd; + if (start.nodeType == 1) { + start = start.childNodes[startOffset] || (tmpStart = start.appendChild(doc.createTextNode(''))); + } + if (end.nodeType == 1) { + end = end.childNodes[endOffset] || (tmpEnd = end.appendChild(doc.createTextNode(''))); + } + if (start === end && start.nodeType == 3) { + frag.appendChild(doc.createTextNode(start.substringData(startOffset, endOffset - startOffset))); + //is not clone + if (action) { + start.deleteData(startOffset, endOffset - startOffset); + range.collapse(true); + } + return frag; + } + var current, currentLevel, clone = frag, + startParents = domUtils.findParents(start, true), endParents = domUtils.findParents(end, true); + for (var i = 0; startParents[i] == endParents[i];) { + i++; + } + for (var j = i, si; si = startParents[j]; j++) { + current = si.nextSibling; + if (si == start) { + if (!tmpStart) { + if (range.startContainer.nodeType == 3) { + clone.appendChild(doc.createTextNode(start.nodeValue.slice(startOffset))); + //is not clone + if (action) { + start.deleteData(startOffset, start.nodeValue.length - startOffset); + } + } else { + clone.appendChild(!action ? start.cloneNode(true) : start); + } + } + } else { + currentLevel = si.cloneNode(false); + clone.appendChild(currentLevel); + } + while (current) { + if (current === end || current === endParents[j]) { + break; + } + si = current.nextSibling; + clone.appendChild(!action ? current.cloneNode(true) : current); + current = si; + } + clone = currentLevel; + } + clone = frag; + if (!startParents[i]) { + clone.appendChild(startParents[i - 1].cloneNode(false)); + clone = clone.firstChild; + } + for (var j = i, ei; ei = endParents[j]; j++) { + current = ei.previousSibling; + if (ei == end) { + if (!tmpEnd && range.endContainer.nodeType == 3) { + clone.appendChild(doc.createTextNode(end.substringData(0, endOffset))); + //is not clone + if (action) { + end.deleteData(0, endOffset); + } + } + } else { + currentLevel = ei.cloneNode(false); + clone.appendChild(currentLevel); + } + //如果两端同级,右边第一次已经被开始做了 + if (j != i || !startParents[i]) { + while (current) { + if (current === start) { + break; + } + ei = current.previousSibling; + clone.insertBefore(!action ? current.cloneNode(true) : current, clone.firstChild); + current = ei; + } + } + clone = currentLevel; + } + if (action) { + range.setStartBefore(!endParents[i] ? endParents[i - 1] : !startParents[i] ? startParents[i - 1] : endParents[i]).collapse(true); + } + tmpStart && domUtils.remove(tmpStart); + tmpEnd && domUtils.remove(tmpEnd); + return frag; + } + + /** + * 创建一个跟document绑定的空的Range实例 + * @constructor + * @param { Document } document 新建的选区所属的文档对象 + */ + + /** + * @property { Node } startContainer 当前Range的开始边界的容器节点, 可以是一个元素节点或者是文本节点 + */ + + /** + * @property { Node } startOffset 当前Range的开始边界容器节点的偏移量, 如果是元素节点, + * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 + */ + + /** + * @property { Node } endContainer 当前Range的结束边界的容器节点, 可以是一个元素节点或者是文本节点 + */ + + /** + * @property { Node } endOffset 当前Range的结束边界容器节点的偏移量, 如果是元素节点, + * 该值就是childNodes中的第几个节点, 如果是文本节点就是文本内容的第几个字符 + */ + + /** + * @property { Boolean } collapsed 当前Range是否闭合 + * @default true + * @remind Range是闭合的时候, startContainer === endContainer && startOffset === endOffset + */ + + /** + * @property { Document } document 当前Range所属的Document对象 + * @remind 不同range的的document属性可以是不同的 + */ + var Range = dom.Range = function (document) { + var me = this; + me.startContainer = + me.startOffset = + me.endContainer = + me.endOffset = null; + me.document = document; + me.collapsed = true; + }; + + /** + * 删除fillData + * @param doc + * @param excludeNode + */ + function removeFillData(doc, excludeNode) { + try { + if (fillData && domUtils.inDoc(fillData, doc)) { + if (!fillData.nodeValue.replace(fillCharReg, '').length) { + var tmpNode = fillData.parentNode; + domUtils.remove(fillData); + while (tmpNode && domUtils.isEmptyInlineElement(tmpNode) && + //safari的contains有bug + (browser.safari ? !(domUtils.getPosition(tmpNode,excludeNode) & domUtils.POSITION_CONTAINS) : !tmpNode.contains(excludeNode)) + ) { + fillData = tmpNode.parentNode; + domUtils.remove(tmpNode); + tmpNode = fillData; + } + } else { + fillData.nodeValue = fillData.nodeValue.replace(fillCharReg, ''); + } + } + } catch (e) { + } + } + + /** + * @param node + * @param dir + */ + function mergeSibling(node, dir) { + var tmpNode; + node = node[dir]; + while (node && domUtils.isFillChar(node)) { + tmpNode = node[dir]; + domUtils.remove(node); + node = tmpNode; + } + } + + Range.prototype = { + + /** + * 克隆选区的内容到一个DocumentFragment里 + * @method cloneContents + * @return { DocumentFragment | NULL } 如果选区是闭合的将返回null, 否则, 返回包含所clone内容的DocumentFragment元素 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + cloneContents:function () { + return this.collapsed ? null : execContentsAction(this, 0); + }, + + /** + * 删除当前选区范围中的所有内容 + * @method deleteContents + * @remind 执行完该操作后, 当前Range对象变成了闭合状态 + * @return { UE.dom.Range } 当前操作的Range对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + * ``` + */ + deleteContents:function () { + var txt; + if (!this.collapsed) { + execContentsAction(this, 1); + } + if (browser.webkit) { + txt = this.startContainer; + if (txt.nodeType == 3 && !txt.nodeValue.length) { + this.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + } + return this; + }, + + /** + * 将当前选区的内容提取到一个DocumentFragment里 + * @method extractContents + * @remind 执行该操作后, 选区将变成闭合状态 + * @warning 执行该操作后, 原来选区所选中的内容将从dom树上剥离出来 + * @return { DocumentFragment } 返回包含所提取内容的DocumentFragment对象 + * @example + * ```html + * + * + * xx[xxx]x + * + * + * + */ + extractContents:function () { + return this.collapsed ? null : execContentsAction(this, 2); + }, + + /** + * 设置Range的开始容器节点和偏移量 + * @method setStart + * @remind 如果给定的节点是元素节点,那么offset指的是其子元素中索引为offset的元素, + * 如果是文本节点,那么offset指的是其文本内容的第offset个字符 + * @remind 如果提供的容器节点是一个不能包含子元素的节点, 则该选区的开始容器将被设置 + * 为该节点的父节点, 此时, 其距离开始容器的偏移量也变成了该节点在其父节点 + * 中的索引 + * @param { Node } node 将被设为当前选区开始边界容器的节点对象 + * @param { int } offset 选区的开始位置偏移量 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxxxxxxxx[xxx] + * + * + * ``` + * @example + * ```html + * + * xxx[xx]x + * + * + * ``` + */ + setStart:function (node, offset) { + return setEndPoint(true, node, offset, this); + }, + + /** + * 设置Range的结束容器和偏移量 + * @method setEnd + * @param { Node } node 作为当前选区结束边界容器的节点对象 + * @param { int } offset 结束边界的偏移量 + * @see UE.dom.Range:setStart(Node,int) + * @return { UE.dom.Range } 当前range对象 + */ + setEnd:function (node, offset) { + return setEndPoint(false, node, offset, this); + }, + + /** + * 将Range开始位置设置到node节点之后 + * @method setStartAfter + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 选区的开始边界将紧接着该节点之后 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxxxx[xxxx] + * + * + * ``` + */ + setStartAfter:function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range开始位置设置到node节点之前 + * @method setStartBefore + * @remind 该操作将会把给定节点的父节点作为range的开始容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 新的选区开始位置在该节点之前 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartBefore:function (node) { + return this.setStart(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 将Range结束位置设置到node节点之后 + * @method setEndAfter + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引+1 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAfter(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * [xxxxxxx]xxxx + * + * + * ``` + */ + setEndAfter:function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node) + 1); + }, + + /** + * 将Range结束位置设置到node节点之前 + * @method setEndBefore + * @remind 该操作将会把给定节点的父节点作为range的结束容器, 且偏移量是该节点在其父节点中的位置索引 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setEndAfter(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndBefore:function (node) { + return this.setEnd(node.parentNode, domUtils.getNodeIndex(node)); + }, + + /** + * 设置Range的开始位置到node节点内的第一个子节点之前 + * @method setStartAtFirst + * @remind 选区的开始容器将变成给定的节点, 且偏移量为0 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartBefore(Node) + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + setStartAtFirst:function (node) { + return this.setStart(node, 0); + }, + + /** + * 设置Range的开始位置到node节点内的最后一个节点之后 + * @method setStartAtLast + * @remind 选区的开始容器将变成给定的节点, 且偏移量为该节点的子节点数 + * @remind 如果给定的节点是元素节点, 则该节点必须是允许包含子节点的元素。 + * @param { Node } node 目标节点 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setStartAtLast:function (node) { + return this.setStart(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); + }, + + /** + * 设置Range的结束位置到node节点内的第一个节点之前 + * @method setEndAtFirst + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为0 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtFirst:function (node) { + return this.setEnd(node, 0); + }, + + /** + * 设置Range的结束位置到node节点内的最后一个节点之后 + * @method setEndAtLast + * @param { Node } node 目标节点 + * @remind 选区的结束容器将变成给定的节点, 且偏移量为该节点的子节点数量 + * @remind node必须是一个元素节点, 且必须是允许包含子节点的元素。 + * @see UE.dom.Range:setStartAtFirst(Node) + * @return { UE.dom.Range } 当前range对象 + */ + setEndAtLast:function (node) { + return this.setEnd(node, node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length); + }, + + /** + * 选中给定节点 + * @method selectNode + * @remind 此时, 选区的开始容器和结束容器都是该节点的父节点, 其startOffset是该节点在父节点中的位置索引, + * 而endOffset为startOffset+1 + * @param { Node } node 需要选中的节点 + * @return { UE.dom.Range } 当前range对象,此时的range仅包含当前给定的节点对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNode:function (node) { + return this.setStartBefore(node).setEndAfter(node); + }, + + /** + * 选中给定节点内部的所有节点 + * @method selectNodeContents + * @remind 此时, 选区的开始容器和结束容器都是该节点, 其startOffset为0, + * 而endOffset是该节点的子节点数。 + * @param { Node } node 目标节点, 当前range将包含该节点内的所有节点 + * @return { UE.dom.Range } 当前range对象, 此时range仅包含给定节点的所有子节点 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + selectNodeContents:function (node) { + return this.setStart(node, 0).setEndAtLast(node); + }, + + /** + * clone当前Range对象 + * @method cloneRange + * @remind 返回的range是一个全新的range对象, 其内部所有属性与当前被clone的range相同。 + * @return { UE.dom.Range } 当前range对象的一个副本 + */ + cloneRange:function () { + var me = this; + return new Range(me.document).setStart(me.startContainer, me.startOffset).setEnd(me.endContainer, me.endOffset); + + }, + + /** + * 向当前选区的结束处闭合选区 + * @method collapse + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + + /** + * 闭合当前选区,根据给定的toStart参数项决定是向当前选区开始处闭合还是向结束处闭合, + * 如果toStart的值为true,则向开始位置闭合, 反之,向结束位置闭合。 + * @method collapse + * @param { Boolean } toStart 是否向选区开始处闭合 + * @return { UE.dom.Range } 当前range对象,此时range对象处于闭合状态 + * @see UE.dom.Range:collapse() + * @example + * ```html + * + * xxxxx[xx]xxxx + * + * + * ``` + */ + collapse:function (toStart) { + var me = this; + if (toStart) { + me.endContainer = me.startContainer; + me.endOffset = me.startOffset; + } else { + me.startContainer = me.endContainer; + me.startOffset = me.endOffset; + } + me.collapsed = true; + return me; + }, + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置 + * @method shrinkBoundary + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * xxxx[xxxxx] => xxxx[xxxxx] + * ``` + * + * @example + * ```html + * + * x[xx]xxx + * + * + * ``` + * + * @example + * ```html + * [xxxxxxxxxxx] => [xxxxxxxxxxx] + * ``` + */ + + /** + * 调整range的开始位置和结束位置,使其"收缩"到最小的位置, + * 如果ignoreEnd的值为true,则忽略对结束位置的调整 + * @method shrinkBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束位置的调整 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.domUtils.Range:shrinkBoundary() + */ + shrinkBoundary:function (ignoreEnd) { + var me = this, child, + collapsed = me.collapsed; + function check(node){ + return node.nodeType == 1 && !domUtils.isBookmarkNode(node) && !dtd.$empty[node.tagName] && !dtd.$nonChild[node.tagName] + } + while (me.startContainer.nodeType == 1 //是element + && (child = me.startContainer.childNodes[me.startOffset]) //子节点也是element + && check(child)) { + me.setStart(child, 0); + } + if (collapsed) { + return me.collapse(true); + } + if (!ignoreEnd) { + while (me.endContainer.nodeType == 1//是element + && me.endOffset > 0 //如果是空元素就退出 endOffset=0那么endOffst-1为负值,childNodes[endOffset]报错 + && (child = me.endContainer.childNodes[me.endOffset - 1]) //子节点也是element + && check(child)) { + me.setEnd(child, child.childNodes.length); + } + } + return me; + }, + + /** + * 获取离当前选区内包含的所有节点最近的公共祖先节点, + * @method getCommonAncestor + * @remind 返回的公共祖先节点一定不是range自身的容器节点, 但有可能是一个文本节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @example + * ```html + * //选区示例 + * xxxx[xxx]xxxxxx + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @example + * ```html + * + * + * + * xxxxxxxxx[xxx]xxxxxxxx + * + * + * + * + * ``` + */ + + /** + * 获取当前选区所包含的所有节点的公共祖先节点, 可以根据给定的参数 includeSelf 决定获取到 + * 的公共祖先节点是否可以是当前选区的startContainer或endContainer节点, 如果 includeSelf + * 的取值为true, 则返回的节点可以是自身的容器节点, 否则, 则不能是容器节点; 同时可以根据 + * ignoreTextNode 参数的取值决定是否忽略类型为文本节点的祖先节点。 + * @method getCommonAncestor + * @param { Boolean } includeSelf 是否允许获取到的公共祖先节点是当前range对象的容器节点 + * @param { Boolean } ignoreTextNode 获取祖先节点的过程中是否忽略类型为文本节点的祖先节点 + * @return { Node } 当前range对象内所有节点的公共祖先节点 + * @see UE.dom.Range:getCommonAncestor() + * @see UE.dom.Range:getCommonAncestor(Boolean) + * @example + * ```html + * + * + * + * xxxxxxxx[x]xxxxxxxxxxx + * + * + * + * + * ``` + */ + getCommonAncestor:function (includeSelf, ignoreTextNode) { + var me = this, + start = me.startContainer, + end = me.endContainer; + if (start === end) { + if (includeSelf && selectOneNode(this)) { + start = start.childNodes[me.startOffset]; + if(start.nodeType == 1) + return start; + } + //只有在上来就相等的情况下才会出现是文本的情况 + return ignoreTextNode && start.nodeType == 3 ? start.parentNode : start; + } + return domUtils.getCommonAncestor(start, end); + }, + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上 + * @method trimBoundary + * @remind 该操作有可能会引起文本节点被切开 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + + /** + * 调整当前Range的开始和结束边界容器,如果是容器节点是文本节点,就调整到包含该文本节点的父节点上, + * 可以根据 ignoreEnd 参数的值决定是否调整对结束边界的调整 + * @method trimBoundary + * @param { Boolean } ignoreEnd 是否忽略对结束边界的调整 + * @return { UE.dom.Range } 当前range对象 + * @example + * ```html + * + * //选区示例 + * xxx[xxxxx]xxx + * + * + * ``` + */ + trimBoundary:function (ignoreEnd) { + this.txtToElmBoundary(); + var start = this.startContainer, + offset = this.startOffset, + collapsed = this.collapsed, + end = this.endContainer; + if (start.nodeType == 3) { + if (offset == 0) { + this.setStartBefore(start); + } else { + if (offset >= start.nodeValue.length) { + this.setStartAfter(start); + } else { + var textNode = domUtils.split(start, offset); + //跟新结束边界 + if (start === end) { + this.setEnd(textNode, this.endOffset - offset); + } else if (start.parentNode === end) { + this.endOffset += 1; + } + this.setStartBefore(textNode); + } + } + if (collapsed) { + return this.collapse(true); + } + } + if (!ignoreEnd) { + offset = this.endOffset; + end = this.endContainer; + if (end.nodeType == 3) { + if (offset == 0) { + this.setEndBefore(end); + } else { + offset < end.nodeValue.length && domUtils.split(end, offset); + this.setEndAfter(end); + } + } + } + return this; + }, + + /** + * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则什么也不做 + * @method txtToElmBoundary + * @remind 该操作不会修改dom节点 + * @return { UE.dom.Range } 当前range对象 + */ + + /** + * 如果选区在文本的边界上,就扩展选区到文本的父节点上, 如果当前选区是闭合的, 则根据参数项 + * ignoreCollapsed 的值决定是否执行该调整 + * @method txtToElmBoundary + * @param { Boolean } ignoreCollapsed 是否忽略选区的闭合状态, 如果该参数取值为true, 则 + * 不论选区是否闭合, 都会执行该操作, 反之, 则不会对闭合的选区执行该操作 + * @return { UE.dom.Range } 当前range对象 + */ + txtToElmBoundary:function (ignoreCollapsed) { + function adjust(r, c) { + var container = r[c + 'Container'], + offset = r[c + 'Offset']; + if (container.nodeType == 3) { + if (!offset) { + r['set' + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + 'Before'](container); + } else if (offset >= container.nodeValue.length) { + r['set' + c.replace(/(\w)/, function (a) { + return a.toUpperCase(); + }) + 'After' ](container); + } + } + } + + if (ignoreCollapsed || !this.collapsed) { + adjust(this, 'start'); + adjust(this, 'end'); + } + return this; + }, + + /** + * 在当前选区的开始位置前插入节点,新插入的节点会被该range包含 + * @method insertNode + * @param { Node } node 需要插入的节点 + * @remind 插入的节点可以是一个DocumentFragment依次插入多个节点 + * @return { UE.dom.Range } 当前range对象 + */ + insertNode:function (node) { + var first = node, length = 1; + if (node.nodeType == 11) { + first = node.firstChild; + length = node.childNodes.length; + } + this.trimBoundary(true); + var start = this.startContainer, + offset = this.startOffset; + var nextNode = start.childNodes[ offset ]; + if (nextNode) { + start.insertBefore(node, nextNode); + } else { + start.appendChild(node); + } + if (first.parentNode === this.endContainer) { + this.endOffset = this.endOffset + length; + } + return this.setStartBefore(first); + }, + + /** + * 闭合选区到当前选区的开始位置, 并且定位光标到闭合后的位置 + * @method setCursor + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse() + */ + + /** + * 闭合选区,可以根据参数toEnd的值控制选区是向前闭合还是向后闭合, 并且定位光标到闭合后的位置。 + * @method setCursor + * @param { Boolean } toEnd 是否向后闭合, 如果为true, 则闭合选区时, 将向结束容器方向闭合, + * 反之,则向开始容器方向闭合 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:collapse(Boolean) + */ + setCursor:function (toEnd, noFillData) { + return this.collapse(!toEnd).select(noFillData); + }, + + /** + * 创建当前range的一个书签,记录下当前range的位置,方便当dom树改变时,还能找回原来的选区位置 + * @method createBookmark + * @param { Boolean } serialize 控制返回的标记位置是对当前位置的引用还是ID,如果该值为true,则 + * 返回标记位置的ID, 反之则返回标记位置节点的引用 + * @return { Object } 返回一个书签记录键值对, 其包含的key有: start => 开始标记的ID或者引用, + * end => 结束标记的ID或引用, id => 当前标记的类型, 如果为true,则表示 + * 返回的记录的类型为ID, 反之则为引用 + */ + createBookmark:function (serialize, same) { + var endNode, + startNode = this.document.createElement('span'); + startNode.style.cssText = 'display:none;line-height:0px;'; + startNode.appendChild(this.document.createTextNode('\u200D')); + startNode.id = '_baidu_bookmark_start_' + (same ? '' : guid++); + + if (!this.collapsed) { + endNode = startNode.cloneNode(true); + endNode.id = '_baidu_bookmark_end_' + (same ? '' : guid++); + } + this.insertNode(startNode); + if (endNode) { + this.collapse().insertNode(endNode).setEndBefore(endNode); + } + this.setStartAfter(startNode); + return { + start:serialize ? startNode.id : startNode, + end:endNode ? serialize ? endNode.id : endNode : null, + id:serialize + } + }, + + /** + * 调整当前range的边界到书签位置,并删除该书签对象所标记的位置内的节点 + * @method moveToBookmark + * @param { BookMark } bookmark createBookmark所创建的标签对象 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:createBookmark(Boolean) + */ + moveToBookmark:function (bookmark) { + var start = bookmark.id ? this.document.getElementById(bookmark.start) : bookmark.start, + end = bookmark.end && bookmark.id ? this.document.getElementById(bookmark.end) : bookmark.end; + this.setStartBefore(start); + domUtils.remove(start); + if (end) { + this.setEndBefore(end); + domUtils.remove(end); + } else { + this.collapse(true); + } + return this; + }, + + /** + * 调整range的边界,使其"放大"到最近的父节点 + * @method enlarge + * @remind 会引起选区的变化 + * @return { UE.dom.Range } 当前range对象 + */ + + /** + * 调整range的边界,使其"放大"到最近的父节点,根据参数 toBlock 的取值, 可以 + * 要求扩大之后的父节点是block节点 + * @method enlarge + * @param { Boolean } toBlock 是否要求扩大之后的父节点必须是block节点 + * @return { UE.dom.Range } 当前range对象 + */ + enlarge:function (toBlock, stopFn) { + var isBody = domUtils.isBody, + pre, node, tmp = this.document.createTextNode(''); + if (toBlock) { + node = this.startContainer; + if (node.nodeType == 1) { + if (node.childNodes[this.startOffset]) { + pre = node = node.childNodes[this.startOffset] + } else { + node.appendChild(tmp); + pre = node = tmp; + } + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.previousSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setStartBefore(node); + break; + } + pre = node; + node = node.parentNode; + } + node = this.endContainer; + if (node.nodeType == 1) { + if (pre = node.childNodes[this.endOffset]) { + node.insertBefore(tmp, pre); + } else { + node.appendChild(tmp); + } + pre = node = tmp; + } else { + pre = node; + } + while (1) { + if (domUtils.isBlockElm(node)) { + node = pre; + while ((pre = node.nextSibling) && !domUtils.isBlockElm(pre)) { + node = pre; + } + this.setEndAfter(node); + break; + } + pre = node; + node = node.parentNode; + } + if (tmp.parentNode === this.endContainer) { + this.endOffset--; + } + domUtils.remove(tmp); + } + + // 扩展边界到最大 + if (!this.collapsed) { + while (this.startOffset == 0) { + if (stopFn && stopFn(this.startContainer)) { + break; + } + if (isBody(this.startContainer)) { + break; + } + this.setStartBefore(this.startContainer); + } + while (this.endOffset == (this.endContainer.nodeType == 1 ? this.endContainer.childNodes.length : this.endContainer.nodeValue.length)) { + if (stopFn && stopFn(this.endContainer)) { + break; + } + if (isBody(this.endContainer)) { + break; + } + this.setEndAfter(this.endContainer); + } + } + return this; + }, + enlargeToBlockElm:function(ignoreEnd){ + while(!domUtils.isBlockElm(this.startContainer)){ + this.setStartBefore(this.startContainer); + } + if(!ignoreEnd){ + while(!domUtils.isBlockElm(this.endContainer)){ + this.setEndAfter(this.endContainer); + } + } + return this; + }, + /** + * 调整Range的边界,使其"缩小"到最合适的位置 + * @method adjustmentBoundary + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:shrinkBoundary() + */ + adjustmentBoundary:function () { + if (!this.collapsed) { + while (!domUtils.isBody(this.startContainer) && + this.startOffset == this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length && + this.startContainer[this.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + + this.setStartAfter(this.startContainer); + } + while (!domUtils.isBody(this.endContainer) && !this.endOffset && + this.endContainer[this.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + this.setEndBefore(this.endContainer); + } + } + return this; + }, + + /** + * 给range选区中的内容添加给定的inline标签 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @example + * ```html + *

            xxxx[xxxx]x

            ==> range.applyInlineStyle("strong") ==>

            xxxx[xxxx]x

            + * ``` + */ + + /** + * 给range选区中的内容添加给定的inline标签, 并且为标签附加上一些初始化属性。 + * @method applyInlineStyle + * @param { String } tagName 需要添加的标签名 + * @param { Object } attrs 跟随新添加的标签的属性 + * @return { UE.dom.Range } 当前选区 + * @example + * ```html + *

            xxxx[xxxx]x

            + * + * ==> + * + * + * range.applyInlineStyle("strong",{"style":"font-size:12px"}) + * + * ==> + * + *

            xxxx[xxxx]x

            + * ``` + */ + applyInlineStyle:function (tagName, attrs, list) { + if (this.collapsed)return this; + this.trimBoundary().enlarge(false, + function (node) { + return node.nodeType == 1 && domUtils.isBlockElm(node) + }).adjustmentBoundary(); + var bookmark = this.createBookmark(), + end = bookmark.end, + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); + }, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn), + node, + pre, + range = this.cloneRange(); + while (current && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + if (current.nodeType == 3 || dtd[tagName][current.tagName]) { + range.setStartBefore(current); + node = current; + while (node && (node.nodeType == 3 || dtd[tagName][node.tagName]) && node !== end) { + pre = node; + node = domUtils.getNextDomNode(node, node.nodeType == 1, null, function (parent) { + return dtd[tagName][parent.tagName]; + }); + } + var frag = range.setEndAfter(pre).extractContents(), elm; + if (list && list.length > 0) { + var level, top; + top = level = list[0].cloneNode(false); + for (var i = 1, ci; ci = list[i++];) { + level.appendChild(ci.cloneNode(false)); + level = level.firstChild; + } + elm = level; + } else { + elm = range.document.createElement(tagName); + } + if (attrs) { + domUtils.setAttributes(elm, attrs); + } + elm.appendChild(frag); + range.insertNode(list ? top : elm); + //处理下滑线在a上的情况 + var aNode; + if (tagName == 'span' && attrs.style && /text\-decoration/.test(attrs.style) && (aNode = domUtils.findParentByTagName(elm, 'a', true))) { + domUtils.setAttributes(aNode, attrs); + domUtils.remove(elm, true); + elm = aNode; + } else { + domUtils.mergeSibling(elm); + domUtils.clearEmptySibling(elm); + } + //去除子节点相同的 + domUtils.mergeChild(elm, attrs); + current = domUtils.getNextDomNode(elm, false, filterFn); + domUtils.mergeToParent(elm); + if (node === end) { + break; + } + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return this.moveToBookmark(bookmark); + }, + + /** + * 移除当前选区内指定的inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { String } tagName 需要移除的标签名 + * @return { UE.dom.Range } 当前的range对象 + * @example + * ```html + * xx[xxxxyyyzz]z => range.removeInlineStyle(["em"]) => xx[xxxxyyyzz]z + * ``` + */ + + /** + * 移除当前选区内指定的一组inline标签,但保留其中的内容 + * @method removeInlineStyle + * @param { Array } tagNameArr 需要移除的标签名的数组 + * @return { UE.dom.Range } 当前的range对象 + * @see UE.dom.Range:removeInlineStyle(String) + */ + removeInlineStyle:function (tagNames) { + if (this.collapsed)return this; + tagNames = utils.isArray(tagNames) ? tagNames : [tagNames]; + this.shrinkBoundary().adjustmentBoundary(); + var start = this.startContainer, end = this.endContainer; + while (1) { + if (start.nodeType == 1) { + if (utils.indexOf(tagNames, start.tagName.toLowerCase()) > -1) { + break; + } + if (start.tagName.toLowerCase() == 'body') { + start = null; + break; + } + } + start = start.parentNode; + } + while (1) { + if (end.nodeType == 1) { + if (utils.indexOf(tagNames, end.tagName.toLowerCase()) > -1) { + break; + } + if (end.tagName.toLowerCase() == 'body') { + end = null; + break; + } + } + end = end.parentNode; + } + var bookmark = this.createBookmark(), + frag, + tmpRange; + if (start) { + tmpRange = this.cloneRange().setEndBefore(bookmark.start).setStartBefore(start); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(start, true); + start.parentNode.insertBefore(bookmark.start, start); + } + if (end) { + tmpRange = this.cloneRange().setStartAfter(bookmark.end).setEndAfter(end); + frag = tmpRange.extractContents(); + tmpRange.insertNode(frag); + domUtils.clearEmptySibling(end, false, true); + end.parentNode.insertBefore(bookmark.end, end.nextSibling); + } + var current = domUtils.getNextDomNode(bookmark.start, false, function (node) { + return node.nodeType == 1; + }), next; + while (current && current !== bookmark.end) { + next = domUtils.getNextDomNode(current, true, function (node) { + return node.nodeType == 1; + }); + if (utils.indexOf(tagNames, current.tagName.toLowerCase()) > -1) { + domUtils.remove(current, true); + } + current = next; + } + return this.moveToBookmark(bookmark); + }, + + /** + * 获取当前选中的自闭合的节点 + * @method getClosedNode + * @return { Node | NULL } 如果当前选中的是自闭合节点, 则返回该节点, 否则返回NULL + */ + getClosedNode:function () { + var node; + if (!this.collapsed) { + var range = this.cloneRange().adjustmentBoundary().shrinkBoundary(); + if (selectOneNode(range)) { + var child = range.startContainer.childNodes[range.startOffset]; + if (child && child.nodeType == 1 && (dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName])) { + node = child; + } + } + } + return node; + }, + + /** + * 在页面上高亮range所表示的选区 + * @method select + * @return { UE.dom.Range } 返回当前Range对象 + */ + //这里不区分ie9以上,trace:3824 + select:browser.ie ? function (noFillData, textRange) { + var nativeRange; + if (!this.collapsed) + this.shrinkBoundary(); + var node = this.getClosedNode(); + if (node && !textRange) { + try { + nativeRange = this.document.body.createControlRange(); + nativeRange.addElement(node); + nativeRange.select(); + } catch (e) {} + return this; + } + var bookmark = this.createBookmark(), + start = bookmark.start, + end; + nativeRange = this.document.body.createTextRange(); + nativeRange.moveToElementText(start); + nativeRange.moveStart('character', 1); + if (!this.collapsed) { + var nativeRangeEnd = this.document.body.createTextRange(); + end = bookmark.end; + nativeRangeEnd.moveToElementText(end); + nativeRange.setEndPoint('EndToEnd', nativeRangeEnd); + } else { + if (!noFillData && this.startContainer.nodeType != 3) { + //使用|x固定住光标 + var tmpText = this.document.createTextNode(fillChar), + tmp = this.document.createElement('span'); + tmp.appendChild(this.document.createTextNode(fillChar)); + start.parentNode.insertBefore(tmp, start); + start.parentNode.insertBefore(tmpText, start); + //当点b,i,u时,不能清除i上边的b + removeFillData(this.document, tmpText); + fillData = tmpText; + mergeSibling(tmp, 'previousSibling'); + mergeSibling(start, 'nextSibling'); + nativeRange.moveStart('character', -1); + nativeRange.collapse(true); + } + } + this.moveToBookmark(bookmark); + tmp && domUtils.remove(tmp); + //IE在隐藏状态下不支持range操作,catch一下 + try { + nativeRange.select(); + } catch (e) { + } + return this; + } : function (notInsertFillData) { + function checkOffset(rng){ + + function check(node,offset,dir){ + if(node.nodeType == 3 && node.nodeValue.length < offset){ + rng[dir + 'Offset'] = node.nodeValue.length + } + } + check(rng.startContainer,rng.startOffset,'start'); + check(rng.endContainer,rng.endOffset,'end'); + } + var win = domUtils.getWindow(this.document), + sel = win.getSelection(), + txtNode; + //FF下关闭自动长高时滚动条在关闭dialog时会跳 + //ff下如果不body.focus将不能定位闭合光标到编辑器内 + browser.gecko ? this.document.body.focus() : win.focus(); + if (sel) { + sel.removeAllRanges(); + // trace:870 chrome/safari后边是br对于闭合得range不能定位 所以去掉了判断 + // this.startContainer.nodeType != 3 &&! ((child = this.startContainer.childNodes[this.startOffset]) && child.nodeType == 1 && child.tagName == 'BR' + if (this.collapsed && !notInsertFillData) { +// //opear如果没有节点接着,原生的不能够定位,不能在body的第一级插入空白节点 +// if (notInsertFillData && browser.opera && !domUtils.isBody(this.startContainer) && this.startContainer.nodeType == 1) { +// var tmp = this.document.createTextNode(''); +// this.insertNode(tmp).setStart(tmp, 0).collapse(true); +// } +// + //处理光标落在文本节点的情况 + //处理以下的情况 + //|xxxx + //xxxx|xxxx + //xxxx| + var start = this.startContainer,child = start; + if(start.nodeType == 1){ + child = start.childNodes[this.startOffset]; + + } + if( !(start.nodeType == 3 && this.startOffset) && + (child ? + (!child.previousSibling || child.previousSibling.nodeType != 3) + : + (!start.lastChild || start.lastChild.nodeType != 3) + ) + ){ + txtNode = this.document.createTextNode(fillChar); + //跟着前边走 + this.insertNode(txtNode); + removeFillData(this.document, txtNode); + mergeSibling(txtNode, 'previousSibling'); + mergeSibling(txtNode, 'nextSibling'); + fillData = txtNode; + this.setStart(txtNode, browser.webkit ? 1 : 0).collapse(true); + } + } + var nativeRange = this.document.createRange(); + if(this.collapsed && browser.opera && this.startContainer.nodeType == 1){ + var child = this.startContainer.childNodes[this.startOffset]; + if(!child){ + //往前靠拢 + child = this.startContainer.lastChild; + if( child && domUtils.isBr(child)){ + this.setStartBefore(child).collapse(true); + } + }else{ + //向后靠拢 + while(child && domUtils.isBlockElm(child)){ + if(child.nodeType == 1 && child.childNodes[0]){ + child = child.childNodes[0] + }else{ + break; + } + } + child && this.setStartBefore(child).collapse(true) + } + + } + //是createAddress最后一位算的不准,现在这里进行微调 + checkOffset(this); + nativeRange.setStart(this.startContainer, this.startOffset); + nativeRange.setEnd(this.endContainer, this.endOffset); + sel.addRange(nativeRange); + } + return this; + }, + + /** + * 滚动到当前range开始的位置 + * @method scrollToView + * @param { Window } win 当前range对象所属的window对象 + * @return { UE.dom.Range } 当前Range对象 + */ + + /** + * 滚动到距离当前range开始位置 offset 的位置处 + * @method scrollToView + * @param { Window } win 当前range对象所属的window对象 + * @param { Number } offset 距离range开始位置处的偏移量, 如果为正数, 则向下偏移, 反之, 则向上偏移 + * @return { UE.dom.Range } 当前Range对象 + */ + scrollToView:function (win, offset) { + win = win ? window : domUtils.getWindow(this.document); + var me = this, + span = me.document.createElement('span'); + //trace:717 + span.innerHTML = ' '; + me.cloneRange().insertNode(span); + domUtils.scrollToView(span, win, offset); + domUtils.remove(span); + return me; + }, + + /** + * 判断当前选区内容是否占位符 + * @private + * @method inFillChar + * @return { Boolean } 如果是占位符返回true,否则返回false + */ + inFillChar : function(){ + var start = this.startContainer; + if(this.collapsed && start.nodeType == 3 + && start.nodeValue.replace(new RegExp('^' + domUtils.fillChar),'').length + 1 == start.nodeValue.length + ){ + return true; + } + return false; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

            + * aaaa + * + * + * bbbb + * + * + *

            + * + * + * + * ``` + */ + createAddress : function(ignoreEnd,ignoreTxt){ + var addr = {},me = this; + + function getAddress(isStart){ + var node = isStart ? me.startContainer : me.endContainer; + var parents = domUtils.findParents(node,true,function(node){return !domUtils.isBody(node)}), + addrs = []; + for(var i = 0,ci;ci = parents[i++];){ + addrs.push(domUtils.getNodeIndex(ci,ignoreTxt)); + } + var firstIndex = 0; + + if(ignoreTxt){ + if(node.nodeType == 3){ + var tmpNode = node.previousSibling; + while(tmpNode && tmpNode.nodeType == 3){ + firstIndex += tmpNode.nodeValue.replace(fillCharReg,'').length; + tmpNode = tmpNode.previousSibling; + } + firstIndex += (isStart ? me.startOffset : me.endOffset)// - (fillCharReg.test(node.nodeValue) ? 1 : 0 ) + }else{ + node = node.childNodes[ isStart ? me.startOffset : me.endOffset]; + if(node){ + firstIndex = domUtils.getNodeIndex(node,ignoreTxt); + }else{ + node = isStart ? me.startContainer : me.endContainer; + var first = node.firstChild; + while(first){ + if(domUtils.isFillChar(first)){ + first = first.nextSibling; + continue; + } + firstIndex++; + if(first.nodeType == 3){ + while( first && first.nodeType == 3){ + first = first.nextSibling; + } + }else{ + first = first.nextSibling; + } + } + } + } + + }else{ + firstIndex = isStart ? domUtils.isFillChar(node) ? 0 : me.startOffset : me.endOffset + } + if(firstIndex < 0){ + firstIndex = 0; + } + addrs.push(firstIndex); + return addrs; + } + addr.startAddress = getAddress(true); + if(!ignoreEnd){ + addr.endAddress = me.collapsed ? [].concat(addr.startAddress) : getAddress(); + } + return addr; + }, + + /** + * 保存 + * @method createAddress + * @private + * @return { Boolean } 返回开始和结束的位置 + * @example + * ```html + * + *

            + * aaaa + * + * + * bbbb + * + * + *

            + * + * + * + * ``` + */ + moveToAddress : function(addr,ignoreEnd){ + var me = this; + function getNode(address,isStart){ + var tmpNode = me.document.body, + parentNode,offset; + for(var i= 0,ci,l=address.length;i + * + * + * + * + * + * + * + * + * ``` + */ + + /** + * 遍历range内的节点。 + * 每当遍历一个节点时, 都会执行参数项 doFn 指定的函数, 该函数的接受当前遍历的节点 + * 作为其参数。 + * 可以通过参数项 filterFn 来指定一个过滤器, 只有符合该过滤器过滤规则的节点才会触 + * 发doFn函数的执行 + * @method traversal + * @param { Function } doFn 对每个遍历的节点要执行的方法, 该方法接受当前遍历的节点作为其参数 + * @param { Function } filterFn 过滤器, 该函数接受当前遍历的节点作为参数, 如果该节点满足过滤 + * 规则, 请返回true, 该节点会触发doFn, 否则, 请返回false, 则该节点不 + * 会触发doFn。 + * @return { UE.dom.Range } 当前range对象 + * @see UE.dom.Range:traversal(Function) + * @example + * ```html + * + * + * + * + * + * + * + * + * + * + * ``` + */ + traversal:function(doFn,filterFn){ + if (this.collapsed) + return this; + var bookmark = this.createBookmark(), + end = bookmark.end, + current = domUtils.getNextDomNode(bookmark.start, false, filterFn); + while (current && current !== end && (domUtils.getPosition(current, end) & domUtils.POSITION_PRECEDING)) { + var tmpNode = domUtils.getNextDomNode(current,false,filterFn); + doFn(current); + current = tmpNode; + } + return this.moveToBookmark(bookmark); + } + }; +})(); + +// core/Selection.js +/** + * 选集 + * @file + * @module UE.dom + * @class Selection + * @since 1.2.6.1 + */ + +/** + * 选区集合 + * @unfile + * @module UE.dom + * @class Selection + */ +(function () { + + function getBoundaryInformation( range, start ) { + var getIndex = domUtils.getNodeIndex; + range = range.duplicate(); + range.collapse( start ); + var parent = range.parentElement(); + //如果节点里没有子节点,直接退出 + if ( !parent.hasChildNodes() ) { + return {container:parent, offset:0}; + } + var siblings = parent.children, + child, + testRange = range.duplicate(), + startIndex = 0, endIndex = siblings.length - 1, index = -1, + distance; + while ( startIndex <= endIndex ) { + index = Math.floor( (startIndex + endIndex) / 2 ); + child = siblings[index]; + testRange.moveToElementText( child ); + var position = testRange.compareEndPoints( 'StartToStart', range ); + if ( position > 0 ) { + endIndex = index - 1; + } else if ( position < 0 ) { + startIndex = index + 1; + } else { + //trace:1043 + return {container:parent, offset:getIndex( child )}; + } + } + if ( index == -1 ) { + testRange.moveToElementText( parent ); + testRange.setEndPoint( 'StartToStart', range ); + distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; + siblings = parent.childNodes; + if ( !distance ) { + child = siblings[siblings.length - 1]; + return {container:child, offset:child.nodeValue.length}; + } + + var i = siblings.length; + while ( distance > 0 ){ + distance -= siblings[ --i ].nodeValue.length; + } + return {container:siblings[i], offset:-distance}; + } + testRange.collapse( position > 0 ); + testRange.setEndPoint( position > 0 ? 'StartToStart' : 'EndToStart', range ); + distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length; + if ( !distance ) { + return dtd.$empty[child.tagName] || dtd.$nonChild[child.tagName] ? + {container:parent, offset:getIndex( child ) + (position > 0 ? 0 : 1)} : + {container:child, offset:position > 0 ? 0 : child.childNodes.length} + } + while ( distance > 0 ) { + try { + var pre = child; + child = child[position > 0 ? 'previousSibling' : 'nextSibling']; + distance -= child.nodeValue.length; + } catch ( e ) { + return {container:parent, offset:getIndex( pre )}; + } + } + return {container:child, offset:position > 0 ? -distance : child.nodeValue.length + distance} + } + + /** + * 将ieRange转换为Range对象 + * @param {Range} ieRange ieRange对象 + * @param {Range} range Range对象 + * @return {Range} range 返回转换后的Range对象 + */ + function transformIERangeToRange( ieRange, range ) { + if ( ieRange.item ) { + range.selectNode( ieRange.item( 0 ) ); + } else { + var bi = getBoundaryInformation( ieRange, true ); + range.setStart( bi.container, bi.offset ); + if ( ieRange.compareEndPoints( 'StartToEnd', ieRange ) != 0 ) { + bi = getBoundaryInformation( ieRange, false ); + range.setEnd( bi.container, bi.offset ); + } + } + return range; + } + + /** + * 获得ieRange + * @param {Selection} sel Selection对象 + * @return {ieRange} 得到ieRange + */ + function _getIERange( sel ) { + var ieRange; + //ie下有可能报错 + try { + ieRange = sel.getNative().createRange(); + } catch ( e ) { + return null; + } + var el = ieRange.item ? ieRange.item( 0 ) : ieRange.parentElement(); + if ( ( el.ownerDocument || el ) === sel.document ) { + return ieRange; + } + return null; + } + + var Selection = dom.Selection = function ( doc ) { + var me = this, iframe; + me.document = doc; + if ( browser.ie9below ) { + iframe = domUtils.getWindow( doc ).frameElement; + domUtils.on( iframe, 'beforedeactivate', function () { + me._bakIERange = me.getIERange(); + } ); + domUtils.on( iframe, 'activate', function () { + try { + if ( !_getIERange( me ) && me._bakIERange ) { + me._bakIERange.select(); + } + } catch ( ex ) { + } + me._bakIERange = null; + } ); + } + iframe = doc = null; + }; + + Selection.prototype = { + + rangeInBody : function(rng,txtRange){ + var node = browser.ie9below || txtRange ? rng.item ? rng.item() : rng.parentElement() : rng.startContainer; + + return node === this.document.body || domUtils.inDoc(node,this.document); + }, + + /** + * 获取原生seleciton对象 + * @method getNative + * @return { Object } 获得selection对象 + * @example + * ```javascript + * editor.selection.getNative(); + * ``` + */ + getNative:function () { + var doc = this.document; + try { + return !doc ? null : browser.ie9below ? doc.selection : domUtils.getWindow( doc ).getSelection(); + } catch ( e ) { + return null; + } + }, + + /** + * 获得ieRange + * @method getIERange + * @return { Object } 返回ie原生的Range + * @example + * ```javascript + * editor.selection.getIERange(); + * ``` + */ + getIERange:function () { + var ieRange = _getIERange( this ); + if ( !ieRange ) { + if ( this._bakIERange ) { + return this._bakIERange; + } + } + return ieRange; + }, + + /** + * 缓存当前选区的range和选区的开始节点 + * @method cache + */ + cache:function () { + this.clear(); + this._cachedRange = this.getRange(); + this._cachedStartElement = this.getStart(); + this._cachedStartElementPath = this.getStartElementPath(); + }, + + /** + * 获取选区开始位置的父节点到body + * @method getStartElementPath + * @return { Array } 返回父节点集合 + * @example + * ```javascript + * editor.selection.getStartElementPath(); + * ``` + */ + getStartElementPath:function () { + if ( this._cachedStartElementPath ) { + return this._cachedStartElementPath; + } + var start = this.getStart(); + if ( start ) { + return domUtils.findParents( start, true, null, true ) + } + return []; + }, + + /** + * 清空缓存 + * @method clear + */ + clear:function () { + this._cachedStartElementPath = this._cachedRange = this._cachedStartElement = null; + }, + + /** + * 编辑器是否得到了选区 + * @method isFocus + */ + isFocus:function () { + try { + if(browser.ie9below){ + + var nativeRange = _getIERange(this); + return !!(nativeRange && this.rangeInBody(nativeRange)); + }else{ + return !!this.getNative().rangeCount; + } + } catch ( e ) { + return false; + } + + }, + + /** + * 获取选区对应的Range + * @method getRange + * @return { Object } 得到Range对象 + * @example + * ```javascript + * editor.selection.getRange(); + * ``` + */ + getRange:function () { + var me = this; + function optimze( range ) { + var child = me.document.body.firstChild, + collapsed = range.collapsed; + while ( child && child.firstChild ) { + range.setStart( child, 0 ); + child = child.firstChild; + } + if ( !range.startContainer ) { + range.setStart( me.document.body, 0 ) + } + if ( collapsed ) { + range.collapse( true ); + } + } + + if ( me._cachedRange != null ) { + return this._cachedRange; + } + var range = new baidu.editor.dom.Range( me.document ); + + if ( browser.ie9below ) { + var nativeRange = me.getIERange(); + if ( nativeRange ) { + //备份的_bakIERange可能已经实效了,dom树发生了变化比如从源码模式切回来,所以try一下,实效就放到body开始位置 + try{ + transformIERangeToRange( nativeRange, range ); + }catch(e){ + optimze( range ); + } + + } else { + optimze( range ); + } + } else { + var sel = me.getNative(); + if ( sel && sel.rangeCount ) { + var firstRange = sel.getRangeAt( 0 ); + var lastRange = sel.getRangeAt( sel.rangeCount - 1 ); + range.setStart( firstRange.startContainer, firstRange.startOffset ).setEnd( lastRange.endContainer, lastRange.endOffset ); + if ( range.collapsed && domUtils.isBody( range.startContainer ) && !range.startOffset ) { + optimze( range ); + } + } else { + //trace:1734 有可能已经不在dom树上了,标识的节点 + if ( this._bakRange && domUtils.inDoc( this._bakRange.startContainer, this.document ) ){ + return this._bakRange; + } + optimze( range ); + } + } + return this._bakRange = range; + }, + + /** + * 获取开始元素,用于状态反射 + * @method getStart + * @return { Element } 获得开始元素 + * @example + * ```javascript + * editor.selection.getStart(); + * ``` + */ + getStart:function () { + if ( this._cachedStartElement ) { + return this._cachedStartElement; + } + var range = browser.ie9below ? this.getIERange() : this.getRange(), + tmpRange, + start, tmp, parent; + if ( browser.ie9below ) { + if ( !range ) { + //todo 给第一个值可能会有问题 + return this.document.body.firstChild; + } + //control元素 + if ( range.item ){ + return range.item( 0 ); + } + tmpRange = range.duplicate(); + //修正ie下x[xx] 闭合后 x|xx + tmpRange.text.length > 0 && tmpRange.moveStart( 'character', 1 ); + tmpRange.collapse( 1 ); + start = tmpRange.parentElement(); + parent = tmp = range.parentElement(); + while ( tmp = tmp.parentNode ) { + if ( tmp == start ) { + start = parent; + break; + } + } + } else { + range.shrinkBoundary(); + start = range.startContainer; + if ( start.nodeType == 1 && start.hasChildNodes() ){ + start = start.childNodes[Math.min( start.childNodes.length - 1, range.startOffset )]; + } + if ( start.nodeType == 3 ){ + return start.parentNode; + } + } + return start; + }, + + /** + * 得到选区中的文本 + * @method getText + * @return { String } 选区中包含的文本 + * @example + * ```javascript + * editor.selection.getText(); + * ``` + */ + getText:function () { + var nativeSel, nativeRange; + if ( this.isFocus() && (nativeSel = this.getNative()) ) { + nativeRange = browser.ie9below ? nativeSel.createRange() : nativeSel.getRangeAt( 0 ); + return browser.ie9below ? nativeRange.text : nativeRange.toString(); + } + return ''; + }, + + /** + * 清除选区 + * @method clearRange + * @example + * ```javascript + * editor.selection.clearRange(); + * ``` + */ + clearRange : function(){ + this.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + } + }; +})(); + +// core/Editor.js +/** + * 编辑器主类,包含编辑器提供的大部分公用接口 + * @file + * @module UE + * @class Editor + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * UEditor的核心类,为用户提供与编辑器交互的接口。 + * @unfile + * @module UE + * @class Editor + */ + +(function () { + var uid = 0, _selectionChangeTimer; + + /** + * 获取编辑器的html内容,赋值到编辑器所在表单的textarea文本域里面 + * @private + * @method setValue + * @param { UE.Editor } editor 编辑器事例 + */ + function setValue(form, editor) { + var textarea; + if (editor.textarea) { + if (utils.isString(editor.textarea)) { + for (var i = 0, ti, tis = domUtils.getElementsByTagName(form, 'textarea'); ti = tis[i++];) { + if (ti.id == 'ueditor_textarea_' + editor.options.textarea) { + textarea = ti; + break; + } + } + } else { + textarea = editor.textarea; + } + } + if (!textarea) { + form.appendChild(textarea = domUtils.createElement(document, 'textarea', { + 'name': editor.options.textarea, + 'id': 'ueditor_textarea_' + editor.options.textarea, + 'style': "display:none" + })); + //不要产生多个textarea + editor.textarea = textarea; + } + !textarea.getAttribute('name') && textarea.setAttribute('name', editor.options.textarea ); + textarea.value = editor.hasContents() ? + (editor.options.allHtmlEnabled ? editor.getAllHtml() : editor.getContent(null, null, true)) : + '' + } + function loadPlugins(me){ + //初始化插件 + for (var pi in UE.plugins) { + UE.plugins[pi].call(me); + } + + } + function checkCurLang(I18N){ + for(var lang in I18N){ + return lang + } + } + + function langReadied(me){ + me.langIsReady = true; + + me.fireEvent("langReady"); + } + + /** + * 编辑器准备就绪后会触发该事件 + * @module UE + * @class Editor + * @event ready + * @remind render方法执行完成之后,会触发该事件 + * @remind + * @example + * ```javascript + * editor.addListener( 'ready', function( editor ) { + * editor.execCommand( 'focus' ); //编辑器家在完成后,让编辑器拿到焦点 + * } ); + * ``` + */ + /** + * 执行destroy方法,会触发该事件 + * @module UE + * @class Editor + * @event destroy + * @see UE.Editor:destroy() + */ + /** + * 执行reset方法,会触发该事件 + * @module UE + * @class Editor + * @event reset + * @see UE.Editor:reset() + */ + /** + * 执行focus方法,会触发该事件 + * @module UE + * @class Editor + * @event focus + * @see UE.Editor:focus(Boolean) + */ + /** + * 语言加载完成会触发该事件 + * @module UE + * @class Editor + * @event langReady + */ + /** + * 运行命令之后会触发该命令 + * @module UE + * @class Editor + * @event beforeExecCommand + */ + /** + * 运行命令之后会触发该命令 + * @module UE + * @class Editor + * @event afterExecCommand + */ + /** + * 运行命令之前会触发该命令 + * @module UE + * @class Editor + * @event firstBeforeExecCommand + */ + /** + * 在getContent方法执行之前会触发该事件 + * @module UE + * @class Editor + * @event beforeGetContent + * @see UE.Editor:getContent() + */ + /** + * 在getContent方法执行之后会触发该事件 + * @module UE + * @class Editor + * @event afterGetContent + * @see UE.Editor:getContent() + */ + /** + * 在getAllHtml方法执行时会触发该事件 + * @module UE + * @class Editor + * @event getAllHtml + * @see UE.Editor:getAllHtml() + */ + /** + * 在setContent方法执行之前会触发该事件 + * @module UE + * @class Editor + * @event beforeSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 在setContent方法执行之后会触发该事件 + * @module UE + * @class Editor + * @event afterSetContent + * @see UE.Editor:setContent(String) + */ + /** + * 每当编辑器内部选区发生改变时,将触发该事件 + * @event selectionchange + * @warning 该事件的触发非常频繁,不建议在该事件的处理过程中做重量级的处理 + * @example + * ```javascript + * editor.addListener( 'selectionchange', function( editor ) { + * console.log('选区发生改变'); + * } + */ + /** + * 在所有selectionchange的监听函数执行之前,会触发该事件 + * @module UE + * @class Editor + * @event beforeSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 在所有selectionchange的监听函数执行完之后,会触发该事件 + * @module UE + * @class Editor + * @event afterSelectionChange + * @see UE.Editor:selectionchange + */ + /** + * 编辑器内容发生改变时会触发该事件 + * @module UE + * @class Editor + * @event contentChange + */ + + + /** + * 以默认参数构建一个编辑器实例 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + + /** + * 以给定的参数集合创建一个编辑器实例,对于未指定的参数,将应用默认参数。 + * @constructor + * @remind 通过 改构造方法实例化的编辑器,不带ui层.需要render到一个容器,编辑器实例才能正常渲染到页面 + * @param { Object } setting 创建编辑器的参数 + * @example + * ```javascript + * var editor = new UE.Editor(); + * editor.execCommand('blod'); + * ``` + * @see UE.Config + */ + var Editor = UE.Editor = function (options) { + var me = this; + me.uid = uid++; + EventBase.call(me); + me.commands = {}; + me.options = utils.extend(utils.clone(options || {}), UEDITOR_CONFIG, true); + me.shortcutkeys = {}; + me.inputRules = []; + me.outputRules = []; + //设置默认的常用属性 + me.setOpt(Editor.defaultOptions(me)); + + /* 尝试异步加载后台配置 */ + me.loadServerConfig(); + + if(!utils.isEmptyObject(UE.I18N)){ + //修改默认的语言类型 + me.options.lang = checkCurLang(UE.I18N); + UE.plugin.load(me); + langReadied(me); + + }else{ + utils.loadFile(document, { + src: me.options.langPath + me.options.lang + "/" + me.options.lang + ".js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + UE.plugin.load(me); + langReadied(me); + }); + } + + UE.instants['ueditorInstant' + me.uid] = me; + }; + Editor.prototype = { + registerCommand : function(name,obj){ + this.commands[name] = obj; + }, + /** + * 编辑器对外提供的监听ready事件的接口, 通过调用该方法,达到的效果与监听ready事件是一致的 + * @method ready + * @param { Function } fn 编辑器ready之后所执行的回调, 如果在注册事件之前编辑器已经ready,将会 + * 立即触发该回调。 + * @remind 需要等待编辑器加载完成后才能执行的代码,可以使用该方法传入 + * @example + * ```javascript + * editor.ready( function( editor ) { + * editor.setContent('初始化完毕'); + * } ); + * ``` + * @see UE.Editor.event:ready + */ + ready: function (fn) { + var me = this; + if (fn) { + me.isReady ? fn.apply(me) : me.addListener('ready', fn); + } + }, + + /** + * 该方法是提供给插件里面使用,设置配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { String } key 编辑器的可接受的选项名称 + * @param { * } val 该选项可接受的值 + * @example + * ```javascript + * editor.setOpt( 'initContent', '欢迎使用编辑器' ); + * ``` + */ + + /** + * 该方法是提供给插件里面使用,以{key:value}集合的方式设置插件内用到的配置项默认值 + * @method setOpt + * @warning 三处设置配置项的优先级: 实例化时传入参数 > setOpt()设置 > config文件里设置 + * @warning 该方法仅供编辑器插件内部和编辑器初始化时调用,其他地方不能调用。 + * @param { Object } options 将要设置的选项的键值对对象 + * @example + * ```javascript + * editor.setOpt( { + * 'initContent': '欢迎使用编辑器' + * } ); + * ``` + */ + setOpt: function (key, val) { + var obj = {}; + if (utils.isString(key)) { + obj[key] = val + } else { + obj = key; + } + utils.extend(this.options, obj, true); + }, + getOpt:function(key){ + return this.options[key] + }, + /** + * 销毁编辑器实例,使用textarea代替 + * @method destroy + * @example + * ```javascript + * editor.destroy(); + * ``` + */ + destroy: function () { + + var me = this; + me.fireEvent('destroy'); + var container = me.container.parentNode; + var textarea = me.textarea; + if (!textarea) { + textarea = document.createElement('textarea'); + container.parentNode.insertBefore(textarea, container); + } else { + textarea.style.display = '' + } + + textarea.style.width = me.iframe.offsetWidth + 'px'; + textarea.style.height = me.iframe.offsetHeight + 'px'; + textarea.value = me.getContent(); + textarea.id = me.key; + container.innerHTML = ''; + domUtils.remove(container); + var key = me.key; + //trace:2004 + for (var p in me) { + if (me.hasOwnProperty(p)) { + delete this[p]; + } + } + UE.delEditor(key); + }, + + /** + * 渲染编辑器的DOM到指定容器 + * @method render + * @param { String } containerId 指定一个容器ID + * @remind 执行该方法,会触发ready事件 + * @warning 必须且只能调用一次 + */ + + /** + * 渲染编辑器的DOM到指定容器 + * @method render + * @param { Element } containerDom 直接指定容器对象 + * @remind 执行该方法,会触发ready事件 + * @warning 必须且只能调用一次 + */ + render: function (container) { + var me = this, + options = me.options, + getStyleValue=function(attr){ + return parseInt(domUtils.getComputedStyle(container,attr)); + }; + if (utils.isString(container)) { + container = document.getElementById(container); + } + if (container) { + if(options.initialFrameWidth){ + options.minFrameWidth = options.initialFrameWidth + }else{ + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + } + if(options.initialFrameHeight){ + options.minFrameHeight = options.initialFrameHeight + }else{ + options.initialFrameHeight = options.minFrameHeight = container.offsetHeight; + } + + container.style.width = /%$/.test(options.initialFrameWidth) ? '100%' : options.initialFrameWidth- + getStyleValue("padding-left")- getStyleValue("padding-right") +'px'; + container.style.height = /%$/.test(options.initialFrameHeight) ? '100%' : options.initialFrameHeight - + getStyleValue("padding-top")- getStyleValue("padding-bottom") +'px'; + + container.style.zIndex = options.zIndex; + + var html = ( ie && browser.version < 9 ? '' : '') + + '' + + '' + + ( options.iframeCssUrl ? '' : '' ) + + (options.initialStyle ? '' : '') + + '' + + ''; + container.appendChild(domUtils.createElement(document, 'iframe', { + id: 'ueditor_' + me.uid, + width: "100%", + height: "100%", + frameborder: "0", + //先注释掉了,加的原因忘记了,但开启会直接导致全屏模式下内容多时不会出现滚动条 +// scrolling :'no', + src: 'javascript:void(function(){document.open();' + (options.customDomain && document.domain != location.hostname ? 'document.domain="' + document.domain + '";' : '') + + 'document.write("' + html + '");document.close();}())' + })); + container.style.overflow = 'hidden'; + //解决如果是给定的百分比,会导致高度算不对的问题 + setTimeout(function(){ + if( /%$/.test(options.initialFrameWidth)){ + options.minFrameWidth = options.initialFrameWidth = container.offsetWidth; + //如果这里给定宽度,会导致ie在拖动窗口大小时,编辑区域不随着变化 +// container.style.width = options.initialFrameWidth + 'px'; + } + if(/%$/.test(options.initialFrameHeight)){ + options.minFrameHeight = options.initialFrameHeight = container.offsetHeight; + container.style.height = options.initialFrameHeight + 'px'; + } + }) + } + }, + + /** + * 编辑器初始化 + * @method _setup + * @private + * @param { Element } doc 编辑器Iframe中的文档对象 + */ + _setup: function (doc) { + + var me = this, + options = me.options; + if (ie) { + doc.body.disabled = true; + doc.body.contentEditable = true; + doc.body.disabled = false; + } else { + doc.body.contentEditable = true; + } + doc.body.spellcheck = false; + me.document = doc; + me.window = doc.defaultView || doc.parentWindow; + me.iframe = me.window.frameElement; + me.body = doc.body; + me.selection = new dom.Selection(doc); + //gecko初始化就能得到range,无法判断isFocus了 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + this._initEvents(); + //为form提交提供一个隐藏的textarea + for (var form = this.iframe.parentNode; !domUtils.isBody(form); form = form.parentNode) { + if (form.tagName == 'FORM') { + me.form = form; + if(me.options.autoSyncData){ + domUtils.on(me.window,'blur',function(){ + setValue(form,me); + }); + }else{ + domUtils.on(form, 'submit', function () { + setValue(this, me); + }); + } + break; + } + } + if (options.initialContent) { + if (options.autoClearinitialContent) { + var oldExecCommand = me.execCommand; + me.execCommand = function () { + me.fireEvent('firstBeforeExecCommand'); + return oldExecCommand.apply(me, arguments); + }; + this._setDefaultContent(options.initialContent); + } else + this.setContent(options.initialContent, false, true); + } + + //编辑器不能为空内容 + + if (domUtils.isEmptyNode(me.body)) { + me.body.innerHTML = '

            ' + (browser.ie ? '' : '
            ') + '

            '; + } + //如果要求focus, 就把光标定位到内容开始 + if (options.focus) { + setTimeout(function () { + me.focus(me.options.focusInEnd); + //如果自动清除开着,就不需要做selectionchange; + !me.options.autoClearinitialContent && me._selectionChange(); + }, 0); + } + if (!me.container) { + me.container = this.iframe.parentNode; + } + if (options.fullscreen && me.ui) { + me.ui.setFullScreen(true); + } + + try { + me.document.execCommand('2D-position', false, false); + } catch (e) { + } + try { + me.document.execCommand('enableInlineTableEditing', false, false); + } catch (e) { + } + try { + me.document.execCommand('enableObjectResizing', false, false); + } catch (e) { + } + + //挂接快捷键 + me._bindshortcutKeys(); + me.isReady = 1; + me.fireEvent('ready'); + options.onready && options.onready.call(me); + if (!browser.ie9below) { + domUtils.on(me.window, ['blur', 'focus'], function (e) { + //chrome下会出现alt+tab切换时,导致选区位置不对 + if (e.type == 'blur') { + me._bakRange = me.selection.getRange(); + try { + me._bakNativeRange = me.selection.getNative().getRangeAt(0); + me.selection.getNative().removeAllRanges(); + } catch (e) { + me._bakNativeRange = null; + } + + } else { + try { + me._bakRange && me._bakRange.select(); + } catch (e) { + } + } + }); + } + //trace:1518 ff3.6body不够寛,会导致点击空白处无法获得焦点 + if (browser.gecko && browser.version <= 10902) { + //修复ff3.6初始化进来,不能点击获得焦点 + me.body.contentEditable = false; + setTimeout(function () { + me.body.contentEditable = true; + }, 100); + setInterval(function () { + me.body.style.height = me.iframe.offsetHeight - 20 + 'px' + }, 100) + } + + !options.isShow && me.setHide(); + options.readonly && me.setDisabled(); + }, + + /** + * 同步数据到编辑器所在的form + * 从编辑器的容器节点向上查找form元素,若找到,就同步编辑内容到找到的form里,为提交数据做准备,主要用于是手动提交的情况 + * 后台取得数据的键值,使用你容器上的name属性,如果没有就使用参数里的textarea项 + * @method sync + * @example + * ```javascript + * editor.sync(); + * form.sumbit(); //form变量已经指向了form元素 + * ``` + */ + + /** + * 根据传入的formId,在页面上查找要同步数据的表单,若找到,就同步编辑内容到找到的form里,为提交数据做准备 + * 后台取得数据的键值,该键值默认使用给定的编辑器容器的name属性,如果没有name属性则使用参数项里给定的“textarea”项 + * @method sync + * @param { String } formID 指定一个要同步数据的form的id,编辑器的数据会同步到你指定form下 + */ + sync: function (formId) { + var me = this, + form = formId ? document.getElementById(formId) : + domUtils.findParent(me.iframe.parentNode, function (node) { + return node.tagName == 'FORM' + }, true); + form && setValue(form, me); + }, + + /** + * 设置编辑器高度 + * @method setHeight + * @remind 当配置项autoHeightEnabled为真时,该方法无效 + * @param { Number } number 设置的高度值,纯数值,不带单位 + * @example + * ```javascript + * editor.setHeight(number); + * ``` + */ + setHeight: function (height,notSetHeight) { + if (height !== parseInt(this.iframe.parentNode.style.height)) { + this.iframe.parentNode.style.height = height + 'px'; + } + !notSetHeight && (this.options.minFrameHeight = this.options.initialFrameHeight = height); + this.body.style.height = height + 'px'; + !notSetHeight && this.trigger('setHeight') + }, + + /** + * 为编辑器的编辑命令提供快捷键 + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { Object } keyset 命令名和快捷键键值对对象,多个按钮的快捷键用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey({ + * "Bold" : "ctrl+66",//^B + * "Italic" : "ctrl+73", //^I + * }); + * ``` + */ + /** + * 这个接口是为插件扩展提供的接口,主要是为新添加的插件,如果需要添加快捷键,所提供的接口 + * @method addshortcutkey + * @param { String } cmd 触发快捷键时,响应的命令 + * @param { String } keys 快捷键的字符串,多个按钮用“+”分隔 + * @example + * ```javascript + * editor.addshortcutkey("Underline", "ctrl+85"); //^U + * ``` + */ + addshortcutkey: function (cmd, keys) { + var obj = {}; + if (keys) { + obj[cmd] = keys + } else { + obj = cmd; + } + utils.extend(this.shortcutkeys, obj) + }, + + /** + * 对编辑器设置keydown事件监听,绑定快捷键和命令,当快捷键组合触发成功,会响应对应的命令 + * @method _bindshortcutKeys + * @private + */ + _bindshortcutKeys: function () { + var me = this, shortcutkeys = this.shortcutkeys; + me.addListener('keydown', function (type, e) { + var keyCode = e.keyCode || e.which; + for (var i in shortcutkeys) { + var tmp = shortcutkeys[i].split(','); + for (var t = 0, ti; ti = tmp[t++];) { + ti = ti.split(':'); + var key = ti[0], param = ti[1]; + if (/^(ctrl)(\+shift)?\+(\d+)$/.test(key.toLowerCase()) || /^(\d+)$/.test(key)) { + if (( (RegExp.$1 == 'ctrl' ? (e.ctrlKey || e.metaKey) : 0) + && (RegExp.$2 != "" ? e[RegExp.$2.slice(1) + "Key"] : 1) + && keyCode == RegExp.$3 + ) || + keyCode == RegExp.$1 + ) { + if (me.queryCommandState(i,param) != -1) + me.execCommand(i, param); + domUtils.preventDefault(e); + } + } + } + + } + }); + }, + + /** + * 获取编辑器的内容 + * @method getContent + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串, 如果编辑器的内容为空,或者是空的标签内容(如:”<p><br/></p>“), 则返回空字符串 + * @example + * ```javascript + * //编辑器html内容:

            123456

            + * var content = editor.getContent(); //返回值:

            123456

            + * ``` + */ + + /** + * 获取编辑器的内容。 可以通过参数定义编辑器内置的判空规则 + * @method getContent + * @param { Function } fn 自定的判空规则, 要求该方法返回一个boolean类型的值, + * 代表当前编辑器的内容是否空, + * 如果返回true, 则该方法将直接返回空字符串;如果返回false,则编辑器将返回 + * 经过内置过滤规则处理后的内容。 + * @remind 该方法在处理包含有初始化内容的时候能起到很好的作用。 + * @warning 该方法获取到的是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @return { String } 编辑器的内容字符串 + * @example + * ```javascript + * // editor 是一个编辑器的实例 + * var content = editor.getContent( function ( editor ) { + * return editor.body.innerHTML === '欢迎使用UEditor'; //返回空字符串 + * } ); + * ``` + */ + getContent: function (cmd, fn,notSetCursor,ignoreBlank,formatter) { + var me = this; + if (cmd && utils.isFunction(cmd)) { + fn = cmd; + cmd = ''; + } + if (fn ? !fn() : !this.hasContents()) { + return ''; + } + me.fireEvent('beforegetcontent'); + var root = UE.htmlparser(me.body.innerHTML,ignoreBlank); + me.filterOutputRule(root); + me.fireEvent('aftergetcontent', cmd,root); + return root.toHtml(formatter); + }, + + /** + * 取得完整的html代码,可以直接显示成完整的html文档 + * @method getAllHtml + * @return { String } 编辑器的内容html文档字符串 + * @eaxmple + * ```javascript + * editor.getAllHtml(); //返回格式大致是: ...... + * ``` + */ + getAllHtml: function () { + var me = this, + headHtml = [], + html = ''; + me.fireEvent('getAllHtml', headHtml); + if (browser.ie && browser.version > 8) { + var headHtmlForIE9 = ''; + utils.each(me.document.styleSheets, function (si) { + headHtmlForIE9 += ( si.href ? '' : ''); + }); + utils.each(me.document.getElementsByTagName('script'), function (si) { + headHtmlForIE9 += si.outerHTML; + }); + + } + return '' + (me.options.charset ? '' : '') + + (headHtmlForIE9 || me.document.getElementsByTagName('head')[0].innerHTML) + headHtml.join('\n') + '' + + '' + me.getContent(null, null, true) + ''; + }, + + /** + * 得到编辑器的纯文本内容,但会保留段落格式 + * @method getPlainTxt + * @return { String } 编辑器带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

            1

            2

            + * console.log(editor.getPlainTxt()); //输出:"1\n2\n + * ``` + */ + getPlainTxt: function () { + var reg = new RegExp(domUtils.fillChar, 'g'), + html = this.body.innerHTML.replace(/[\n\r]/g, '');//ie要先去了\n在处理 + html = html.replace(/<(p|div)[^>]*>(| )<\/\1>/gi, '\n') + .replace(//gi, '\n') + .replace(/<[^>/]+>/g, '') + .replace(/(\n)?<\/([^>]+)>/g, function (a, b, c) { + return dtd.$block[c] ? '\n' : b ? b : ''; + }); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return html.replace(reg, '').replace(/\u00a0/g, ' ').replace(/ /g, ' '); + }, + + /** + * 获取编辑器中的纯文本内容,没有段落格式 + * @method getContentTxt + * @return { String } 编辑器不带段落格式的纯文本内容字符串 + * @example + * ```javascript + * //编辑器html内容:

            1

            2

            + * console.log(editor.getPlainTxt()); //输出:"12 + * ``` + */ + getContentTxt: function () { + var reg = new RegExp(domUtils.fillChar, 'g'); + //取出来的空格会有c2a0会变成乱码,处理这种情况\u00a0 + return this.body[browser.ie ? 'innerText' : 'textContent'].replace(reg, '').replace(/\u00a0/g, ' '); + }, + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @example + * ```javascript + * editor.getContent('

            test

            '); + * ``` + */ + + /** + * 设置编辑器的内容,可修改编辑器当前的html内容 + * @method setContent + * @warning 通过该方法插入的内容,是经过编辑器内置的过滤规则进行过滤后得到的内容 + * @warning 该方法会触发selectionchange事件 + * @param { String } html 要插入的html内容 + * @param { Boolean } isAppendTo 若传入true,不清空原来的内容,在最后插入内容,否则,清空内容再插入 + * @example + * ```javascript + * //假设设置前的编辑器内容是

            old text

            + * editor.setContent('

            new text

            ', true); //插入的结果是

            old text

            new text

            + * ``` + */ + setContent: function (html, isAppendTo, notFireSelectionchange) { + var me = this; + + me.fireEvent('beforesetcontent', html); + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + + me.body.innerHTML = (isAppendTo ? me.body.innerHTML : '') + html; + + + function isCdataDiv(node){ + return node.tagName == 'DIV' && node.getAttribute('cdata_tag'); + } + //给文本或者inline节点套p标签 + if (me.options.enterTag == 'p') { + + var child = this.body.firstChild, tmpNode; + if (!child || child.nodeType == 1 && + (dtd.$cdata[child.tagName] || isCdataDiv(child) || + domUtils.isCustomeNode(child) + ) + && child === this.body.lastChild) { + this.body.innerHTML = '

            ' + (browser.ie ? ' ' : '
            ') + '

            ' + this.body.innerHTML; + + } else { + var p = me.document.createElement('p'); + while (child) { + while (child && (child.nodeType == 3 || child.nodeType == 1 && dtd.p[child.tagName] && !dtd.$cdata[child.tagName])) { + tmpNode = child.nextSibling; + p.appendChild(child); + child = tmpNode; + } + if (p.firstChild) { + if (!child) { + me.body.appendChild(p); + break; + } else { + child.parentNode.insertBefore(p, child); + p = me.document.createElement('p'); + } + } + child = child.nextSibling; + } + } + } + me.fireEvent('aftersetcontent'); + me.fireEvent('contentchange'); + + !notFireSelectionchange && me._selectionChange(); + //清除保存的选区 + me._bakRange = me._bakIERange = me._bakNativeRange = null; + //trace:1742 setContent后gecko能得到焦点问题 + var geckoSel; + if (browser.gecko && (geckoSel = this.selection.getNative())) { + geckoSel.removeAllRanges(); + } + if(me.options.autoSyncData){ + me.form && setValue(me.form,me); + } + }, + + /** + * 让编辑器获得焦点,默认focus到编辑器头部 + * @method focus + * @example + * ```javascript + * editor.focus() + * ``` + */ + + /** + * 让编辑器获得焦点,toEnd确定focus位置 + * @method focus + * @param { Boolean } toEnd 默认focus到编辑器头部,toEnd为true时focus到内容尾部 + * @example + * ```javascript + * editor.focus(true) + * ``` + */ + focus: function (toEnd) { + try { + var me = this, + rng = me.selection.getRange(); + if (toEnd) { + var node = me.body.lastChild; + if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){ + if(domUtils.isEmptyBlock(node)){ + rng.setStartAtFirst(node) + }else{ + rng.setStartAtLast(node) + } + rng.collapse(true); + } + rng.setCursor(true); + } else { + if(!rng.collapsed && domUtils.isBody(rng.startContainer) && rng.startOffset == 0){ + + var node = me.body.firstChild; + if(node && node.nodeType == 1 && !dtd.$empty[node.tagName]){ + rng.setStartAtFirst(node).collapse(true); + } + } + + rng.select(true); + + } + this.fireEvent('focus selectionchange'); + } catch (e) { + } + + }, + isFocus:function(){ + return this.selection.isFocus(); + }, + blur:function(){ + var sel = this.selection.getNative(); + if(sel.empty && browser.ie){ + var nativeRng = document.body.createTextRange(); + nativeRng.moveToElementText(document.body); + nativeRng.collapse(true); + nativeRng.select(); + sel.empty() + }else{ + sel.removeAllRanges() + } + + //this.fireEvent('blur selectionchange'); + }, + /** + * 初始化UE事件及部分事件代理 + * @method _initEvents + * @private + */ + _initEvents: function () { + var me = this, + doc = me.document, + win = me.window; + me._proxyDomEvent = utils.bind(me._proxyDomEvent, me); + domUtils.on(doc, ['click', 'contextmenu', 'mousedown', 'keydown', 'keyup', 'keypress', 'mouseup', 'mouseover', 'mouseout', 'selectstart'], me._proxyDomEvent); + domUtils.on(win, ['focus', 'blur'], me._proxyDomEvent); + domUtils.on(me.body,'drop',function(e){ + //阻止ff下默认的弹出新页面打开图片 + if(browser.gecko && e.stopPropagation) { e.stopPropagation(); } + me.fireEvent('contentchange') + }); + domUtils.on(doc, ['mouseup', 'keydown'], function (evt) { + //特殊键不触发selectionchange + if (evt.type == 'keydown' && (evt.ctrlKey || evt.metaKey || evt.shiftKey || evt.altKey)) { + return; + } + if (evt.button == 2)return; + me._selectionChange(250, evt); + }); + }, + /** + * 触发事件代理 + * @method _proxyDomEvent + * @private + * @return { * } fireEvent的返回值 + * @see UE.EventBase:fireEvent(String) + */ + _proxyDomEvent: function (evt) { + if(this.fireEvent('before' + evt.type.replace(/^on/, '').toLowerCase()) === false){ + return false; + } + if(this.fireEvent(evt.type.replace(/^on/, ''), evt) === false){ + return false; + } + return this.fireEvent('after' + evt.type.replace(/^on/, '').toLowerCase()) + }, + /** + * 变化选区 + * @method _selectionChange + * @private + */ + _selectionChange: function (delay, evt) { + var me = this; + //有光标才做selectionchange 为了解决未focus时点击source不能触发更改工具栏状态的问题(source命令notNeedUndo=1) +// if ( !me.selection.isFocus() ){ +// return; +// } + + + var hackForMouseUp = false; + var mouseX, mouseY; + if (browser.ie && browser.version < 9 && evt && evt.type == 'mouseup') { + var range = this.selection.getRange(); + if (!range.collapsed) { + hackForMouseUp = true; + mouseX = evt.clientX; + mouseY = evt.clientY; + } + } + clearTimeout(_selectionChangeTimer); + _selectionChangeTimer = setTimeout(function () { + if (!me.selection || !me.selection.getNative()) { + return; + } + //修复一个IE下的bug: 鼠标点击一段已选择的文本中间时,可能在mouseup后的一段时间内取到的range是在selection的type为None下的错误值. + //IE下如果用户是拖拽一段已选择文本,则不会触发mouseup事件,所以这里的特殊处理不会对其有影响 + var ieRange; + if (hackForMouseUp && me.selection.getNative().type == 'None') { + ieRange = me.document.body.createTextRange(); + try { + ieRange.moveToPoint(mouseX, mouseY); + } catch (ex) { + ieRange = null; + } + } + var bakGetIERange; + if (ieRange) { + bakGetIERange = me.selection.getIERange; + me.selection.getIERange = function () { + return ieRange; + }; + } + me.selection.cache(); + if (bakGetIERange) { + me.selection.getIERange = bakGetIERange; + } + if (me.selection._cachedRange && me.selection._cachedStartElement) { + me.fireEvent('beforeselectionchange'); + // 第二个参数causeByUi为true代表由用户交互造成的selectionchange. + me.fireEvent('selectionchange', !!evt); + me.fireEvent('afterselectionchange'); + me.selection.clear(); + } + }, delay || 50); + }, + + /** + * 执行编辑命令 + * @method _callCmdFn + * @private + * @param { String } fnName 函数名称 + * @param { * } args 传给命令函数的参数 + * @return { * } 返回命令函数运行的返回值 + */ + _callCmdFn: function (fnName, args) { + var cmdName = args[0].toLowerCase(), + cmd, cmdFn; + cmd = this.commands[cmdName] || UE.commands[cmdName]; + cmdFn = cmd && cmd[fnName]; + //没有querycommandstate或者没有command的都默认返回0 + if ((!cmd || !cmdFn) && fnName == 'queryCommandState') { + return 0; + } else if (cmdFn) { + return cmdFn.apply(this, args); + } + }, + + /** + * 执行编辑命令cmdName,完成富文本编辑效果 + * @method execCommand + * @param { String } cmdName 需要执行的命令 + * @remind 具体命令的使用请参考命令列表 + * @return { * } 返回命令函数运行的返回值 + * @example + * ```javascript + * editor.execCommand(cmdName); + * ``` + */ + execCommand: function (cmdName) { + cmdName = cmdName.toLowerCase(); + var me = this, + result, + cmd = me.commands[cmdName] || UE.commands[cmdName]; + if (!cmd || !cmd.execCommand) { + return null; + } + if (!cmd.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + if (me.queryCommandState.apply(me,arguments) != -1) { + me.fireEvent('saveScene'); + me.fireEvent.apply(me, ['beforeexeccommand', cmdName].concat(arguments)); + result = this._callCmdFn('execCommand', arguments); + //保存场景时,做了内容对比,再看是否进行contentchange触发,这里多触发了一次,去掉 +// (!cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange'); + me.fireEvent.apply(me, ['afterexeccommand', cmdName].concat(arguments)); + me.fireEvent('saveScene'); + } + me.__hasEnterExecCommand = false; + } else { + result = this._callCmdFn('execCommand', arguments); + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me.fireEvent('contentchange') + } + (!me.__hasEnterExecCommand && !cmd.ignoreContentChange && !me._ignoreContentChange) && me._selectionChange(); + return result; + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,返回命令的状态 + * @method queryCommandState + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @return { Number } number 返回放前命令的状态,返回值三种情况:(-1|0|1) + * @example + * ```javascript + * editor.queryCommandState(cmdName) => (-1|0|1) + * ``` + * @see COMMAND.LIST + */ + queryCommandState: function (cmdName) { + return this._callCmdFn('queryCommandState', arguments); + }, + + /** + * 根据传入的command命令,查选编辑器当前的选区,根据命令返回相关的值 + * @method queryCommandValue + * @param { String } cmdName 需要查询的命令名称 + * @remind 具体命令的使用请参考命令列表 + * @remind 只有部分插件有此方法 + * @return { * } 返回每个命令特定的当前状态值 + * @grammar editor.queryCommandValue(cmdName) => {*} + * @see COMMAND.LIST + */ + queryCommandValue: function (cmdName) { + return this._callCmdFn('queryCommandValue', arguments); + }, + + /** + * 检查编辑区域中是否有内容 + * @method hasContents + * @remind 默认有文本内容,或者有以下节点都不认为是空 + * table,ul,ol,dl,iframe,area,base,col,hr,img,embed,input,link,meta,param + * @return { Boolean } 检查有内容返回true,否则返回false + * @example + * ```javascript + * editor.hasContents() + * ``` + */ + + /** + * 检查编辑区域中是否有内容,若包含参数tags中的节点类型,直接返回true + * @method hasContents + * @param { Array } tags 传入数组判断时用到的节点类型 + * @return { Boolean } 若文档中包含tags数组里对应的tag,返回true,否则返回false + * @example + * ```javascript + * editor.hasContents(['span']); + * ``` + */ + hasContents: function (tags) { + if (tags) { + for (var i = 0, ci; ci = tags[i++];) { + if (this.document.getElementsByTagName(ci).length > 0) { + return true; + } + } + } + if (!domUtils.isEmptyBlock(this.body)) { + return true + } + //随时添加,定义的特殊标签如果存在,不能认为是空 + tags = ['div']; + for (i = 0; ci = tags[i++];) { + var nodes = domUtils.getElementsByTagName(this.document, ci); + for (var n = 0, cn; cn = nodes[n++];) { + if (domUtils.isCustomeNode(cn)) { + return true; + } + } + } + return false; + }, + + /** + * 重置编辑器,可用来做多个tab使用同一个编辑器实例 + * @method reset + * @remind 此方法会清空编辑器内容,清空回退列表,会触发reset事件 + * @example + * ```javascript + * editor.reset() + * ``` + */ + reset: function () { + this.fireEvent('reset'); + }, + + /** + * 设置当前编辑区域可以编辑 + * @method setEnabled + * @example + * ```javascript + * editor.setEnabled() + * ``` + */ + setEnabled: function () { + var me = this, range; + if (me.body.contentEditable == 'false') { + me.body.contentEditable = true; + range = me.selection.getRange(); + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk + } catch (e) { + range.setStartAtFirst(me.body).collapse(true) + } + range.select(true); + if (me.bkqueryCommandState) { + me.queryCommandState = me.bkqueryCommandState; + delete me.bkqueryCommandState; + } + if (me.bkqueryCommandValue) { + me.queryCommandValue = me.bkqueryCommandValue; + delete me.bkqueryCommandValue; + } + me.fireEvent('selectionchange'); + } + }, + enable: function () { + return this.setEnabled(); + }, + + /** 设置当前编辑区域不可编辑 + * @method setDisabled + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { String } except 例外命令的字符串 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled('bold'); //禁用工具栏中除加粗之外的所有功能 + * ``` + */ + + /** 设置当前编辑区域不可编辑,except中的命令除外 + * @method setDisabled + * @param { Array } except 例外命令的字符串数组,数组中的命令仍然可以执行 + * @remind 即使设置了disable,此处配置的例外命令仍然可以执行 + * @example + * ```javascript + * editor.setDisabled(['bold','insertimage']); //禁用工具栏中除加粗和插入图片之外的所有功能 + * ``` + */ + setDisabled: function (except) { + var me = this; + except = except ? utils.isArray(except) ? except : [except] : []; + if (me.body.contentEditable == 'true') { + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.body.contentEditable = false; + me.bkqueryCommandState = me.queryCommandState; + me.bkqueryCommandValue = me.queryCommandValue; + me.queryCommandState = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandState.apply(me, arguments); + } + return -1; + }; + me.queryCommandValue = function (type) { + if (utils.indexOf(except, type) != -1) { + return me.bkqueryCommandValue.apply(me, arguments); + } + return null; + }; + me.fireEvent('selectionchange'); + } + }, + disable: function (except) { + return this.setDisabled(except); + }, + + /** + * 设置默认内容 + * @method _setDefaultContent + * @private + * @param { String } cont 要存入的内容 + */ + _setDefaultContent: function () { + function clear() { + var me = this; + if (me.document.getElementById('initContent')) { + me.body.innerHTML = '

            ' + (ie ? '' : '
            ') + '

            '; + me.removeListener('firstBeforeExecCommand focus', clear); + setTimeout(function () { + me.focus(); + me._selectionChange(); + }, 0) + } + } + + return function (cont) { + var me = this; + me.body.innerHTML = '

            ' + cont + '

            '; + + me.addListener('firstBeforeExecCommand focus', clear); + } + }(), + + /** + * 显示编辑器 + * @method setShow + * @example + * ```javascript + * editor.setShow() + * ``` + */ + setShow: function () { + var me = this, range = me.selection.getRange(); + if (me.container.style.display == 'none') { + //有可能内容丢失了 + try { + range.moveToBookmark(me.lastBk); + delete me.lastBk + } catch (e) { + range.setStartAtFirst(me.body).collapse(true) + } + //ie下focus实效,所以做了个延迟 + setTimeout(function () { + range.select(true); + }, 100); + me.container.style.display = ''; + } + + }, + show: function () { + return this.setShow(); + }, + /** + * 隐藏编辑器 + * @method setHide + * @example + * ```javascript + * editor.setHide() + * ``` + */ + setHide: function () { + var me = this; + if (!me.lastBk) { + me.lastBk = me.selection.getRange().createBookmark(true); + } + me.container.style.display = 'none' + }, + hide: function () { + return this.setHide(); + }, + + /** + * 根据指定的路径,获取对应的语言资源 + * @method getLang + * @param { String } path 路径根据的是lang目录下的语言文件的路径结构 + * @return { Object | String } 根据路径返回语言资源的Json格式对象或者语言字符串 + * @example + * ```javascript + * editor.getLang('contextMenu.delete'); //如果当前是中文,那返回是的是'删除' + * ``` + */ + getLang: function (path) { + var lang = UE.I18N[this.options.lang]; + if (!lang) { + throw Error("not import language file"); + } + path = (path || "").split("."); + for (var i = 0, ci; ci = path[i++];) { + lang = lang[ci]; + if (!lang)break; + } + return lang; + }, + + /** + * 计算编辑器html内容字符串的长度 + * @method getContentLength + * @return { Number } 返回计算的长度 + * @example + * ```javascript + * //编辑器html内容

            132

            + * editor.getContentLength() //返回27 + * ``` + */ + /** + * 计算编辑器当前纯文本内容的长度 + * @method getContentLength + * @param { Boolean } ingoneHtml 传入true时,只按照纯文本来计算 + * @return { Number } 返回计算的长度,内容中有hr/img/iframe标签,长度加1 + * @example + * ```javascript + * //编辑器html内容

            132

            + * editor.getContentLength() //返回3 + * ``` + */ + getContentLength: function (ingoneHtml, tagNames) { + var count = this.getContent(false,false,true).length; + if (ingoneHtml) { + tagNames = (tagNames || []).concat([ 'hr', 'img', 'iframe']); + count = this.getContentTxt().replace(/[\t\r\n]+/g, '').length; + for (var i = 0, ci; ci = tagNames[i++];) { + count += this.document.getElementsByTagName(ci).length; + } + } + return count; + }, + + /** + * 注册输入过滤规则 + * @method addInputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addInputRule(function(root){ + * $.each(root.getNodesByTagName('div'),function(i,node){ + * node.tagName="p"; + * }); + * }); + * ``` + */ + addInputRule: function (rule) { + this.inputRules.push(rule); + }, + + /** + * 执行注册的过滤规则 + * @method filterInputRule + * @param { UE.uNode } root 要过滤的uNode节点 + * @remind 执行editor.setContent方法和执行'inserthtml'命令后,会运行该过滤函数 + * @example + * ```javascript + * editor.filterInputRule(editor.body); + * ``` + * @see UE.Editor:addInputRule + */ + filterInputRule: function (root) { + for (var i = 0, ci; ci = this.inputRules[i++];) { + ci.call(this, root) + } + }, + + /** + * 注册输出过滤规则 + * @method addOutputRule + * @param { Function } rule 要添加的过滤规则 + * @example + * ```javascript + * editor.addOutputRule(function(root){ + * $.each(root.getNodesByTagName('p'),function(i,node){ + * node.tagName="div"; + * }); + * }); + * ``` + */ + addOutputRule: function (rule) { + this.outputRules.push(rule) + }, + + /** + * 根据输出过滤规则,过滤编辑器内容 + * @method filterOutputRule + * @remind 执行editor.getContent方法的时候,会先运行该过滤函数 + * @param { UE.uNode } root 要过滤的uNode节点 + * @example + * ```javascript + * editor.filterOutputRule(editor.body); + * ``` + * @see UE.Editor:addOutputRule + */ + filterOutputRule: function (root) { + for (var i = 0, ci; ci = this.outputRules[i++];) { + ci.call(this, root) + } + }, + + /** + * 根据action名称获取请求的路径 + * @method getActionUrl + * @remind 假如没有设置serverUrl,会根据imageUrl设置默认的controller路径 + * @param { String } action action名称 + * @example + * ```javascript + * editor.getActionUrl('config'); //返回 "/ueditor/php/controller.php?action=config" + * editor.getActionUrl('image'); //返回 "/ueditor/php/controller.php?action=uplaodimage" + * editor.getActionUrl('scrawl'); //返回 "/ueditor/php/controller.php?action=uplaodscrawl" + * editor.getActionUrl('imageManager'); //返回 "/ueditor/php/controller.php?action=listimage" + * ``` + */ + getActionUrl: function(action){ + var actionName = this.getOpt(action) || action, + imageUrl = this.getOpt('imageUrl'), + serverUrl = this.getOpt('serverUrl'); + + if(!serverUrl && imageUrl) { + serverUrl = imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2'); + } + + if(serverUrl) { + serverUrl = serverUrl + (serverUrl.indexOf('?') == -1 ? '?':'&') + 'action=' + (actionName || ''); + return utils.formatUrl(serverUrl); + } else { + return ''; + } + } + }; + utils.inherits(Editor, EventBase); +})(); + + +// core/Editor.defaultoptions.js +//维护编辑器一下默认的不在插件中的配置项 +UE.Editor.defaultOptions = function(editor){ + + var _url = editor.options.UEDITOR_HOME_URL; + return { + isShow: true, + initialContent: '', + initialStyle:'', + autoClearinitialContent: false, + iframeCssUrl: _url + 'themes/iframe.css', + textarea: 'editorValue', + focus: false, + focusInEnd: true, + autoClearEmptyNode: true, + fullscreen: false, + readonly: false, + zIndex: 999, + imagePopup: true, + enterTag: 'p', + customDomain: false, + lang: 'zh-cn', + langPath: _url + 'lang/', + theme: 'default', + themePath: _url + 'themes/', + allHtmlEnabled: false, + scaleEnabled: false, + tableNativeEditInFF: false, + autoSyncData : true, + fileNameFormat: '{time}{rand:6}' + } +}; + +// core/loadconfig.js +(function(){ + + UE.Editor.prototype.loadServerConfig = function(){ + var me = this; + setTimeout(function(){ + try{ + me.options.imageUrl && me.setOpt('serverUrl', me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/, '$1controller$2')); + + var configUrl = me.getActionUrl('config'), + isJsonp = utils.isCrossDomainUrl(configUrl); + + /* 发出ajax请求 */ + me._serverConfigLoaded = false; + + configUrl && UE.ajax.request(configUrl,{ + 'method': 'GET', + 'dataType': isJsonp ? 'jsonp':'', + 'onsuccess':function(r){ + try { + var config = isJsonp ? r:eval("("+r.responseText+")"); + utils.extend(me.options, config); + me.fireEvent('serverConfigLoaded'); + me._serverConfigLoaded = true; + } catch (e) { + showErrorMsg(me.getLang('loadconfigFormatError')); + } + }, + 'onerror':function(){ + showErrorMsg(me.getLang('loadconfigHttpError')); + } + }); + } catch(e){ + showErrorMsg(me.getLang('loadconfigError')); + } + }); + + function showErrorMsg(msg) { + console && console.error(msg); + //me.fireEvent('showMessage', { + // 'title': msg, + // 'type': 'error' + //}); + } + }; + + UE.Editor.prototype.isServerConfigLoaded = function(){ + var me = this; + return me._serverConfigLoaded || false; + }; + + UE.Editor.prototype.afterConfigReady = function(handler){ + if (!handler || !utils.isFunction(handler)) return; + var me = this; + var readyHandler = function(){ + handler.apply(me, arguments); + me.removeListener('serverConfigLoaded', readyHandler); + }; + + if (me.isServerConfigLoaded()) { + handler.call(me, 'serverConfigLoaded'); + } else { + me.addListener('serverConfigLoaded', readyHandler); + } + }; + +})(); + + +// core/ajax.js +/** + * @file + * @module UE.ajax + * @since 1.2.6.1 + */ + +/** + * 提供对ajax请求的支持 + * @module UE.ajax + */ +UE.ajax = function() { + + //创建一个ajaxRequest对象 + var fnStr = 'XMLHttpRequest()'; + try { + new ActiveXObject("Msxml2.XMLHTTP"); + fnStr = 'ActiveXObject(\'Msxml2.XMLHTTP\')'; + } catch (e) { + try { + new ActiveXObject("Microsoft.XMLHTTP"); + fnStr = 'ActiveXObject(\'Microsoft.XMLHTTP\')' + } catch (e) { + } + } + var creatAjaxRequest = new Function('return new ' + fnStr); + + + /** + * 将json参数转化成适合ajax提交的参数列表 + * @param json + */ + function json2str(json) { + var strArr = []; + for (var i in json) { + //忽略默认的几个参数 + if(i=="method" || i=="timeout" || i=="async" || i=="dataType" || i=="callback") continue; + //忽略控制 + if(json[i] == undefined || json[i] == null) continue; + //传递过来的对象和函数不在提交之列 + if (!((typeof json[i]).toLowerCase() == "function" || (typeof json[i]).toLowerCase() == "object")) { + strArr.push( encodeURIComponent(i) + "="+encodeURIComponent(json[i]) ); + } else if (utils.isArray(json[i])) { + //支持传数组内容 + for(var j = 0; j < json[i].length; j++) { + strArr.push( encodeURIComponent(i) + "[]="+encodeURIComponent(json[i][j]) ); + } + } + } + return strArr.join("&"); + } + + function doAjax(url, ajaxOptions) { + var xhr = creatAjaxRequest(), + //是否超时 + timeIsOut = false, + //默认参数 + defaultAjaxOptions = { + method:"POST", + timeout:5000, + async:true, + data:{},//需要传递对象的话只能覆盖 + onsuccess:function() { + }, + onerror:function() { + } + }; + + if (typeof url === "object") { + ajaxOptions = url; + url = ajaxOptions.url; + } + if (!xhr || !url) return; + var ajaxOpts = ajaxOptions ? utils.extend(defaultAjaxOptions,ajaxOptions) : defaultAjaxOptions; + + var submitStr = json2str(ajaxOpts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(ajaxOpts.data)){ + submitStr += (submitStr? "&":"") + json2str(ajaxOpts.data); + } + //超时检测 + var timerID = setTimeout(function() { + if (xhr.readyState != 4) { + timeIsOut = true; + xhr.abort(); + clearTimeout(timerID); + } + }, ajaxOpts.timeout); + + var method = ajaxOpts.method.toUpperCase(); + var str = url + (url.indexOf("?")==-1?"?":"&") + (method=="POST"?"":submitStr+ "&noCache=" + +new Date); + xhr.open(method, str, ajaxOpts.async); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (!timeIsOut && xhr.status == 200) { + ajaxOpts.onsuccess(xhr); + } else { + ajaxOpts.onerror(xhr); + } + } + }; + if (method == "POST") { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + xhr.send(submitStr); + } else { + xhr.send(null); + } + } + + function doJsonp(url, opts) { + + var successhandler = opts.onsuccess || function(){}, + scr = document.createElement('SCRIPT'), + options = opts || {}, + charset = options['charset'], + callbackField = options['jsonp'] || 'callback', + callbackFnName, + timeOut = options['timeOut'] || 0, + timer, + reg = new RegExp('(\\?|&)' + callbackField + '=([^&]*)'), + matches; + + if (utils.isFunction(successhandler)) { + callbackFnName = 'bd__editor__' + Math.floor(Math.random() * 2147483648).toString(36); + window[callbackFnName] = getCallBack(0); + } else if(utils.isString(successhandler)){ + callbackFnName = successhandler; + } else { + if (matches = reg.exec(url)) { + callbackFnName = matches[2]; + } + } + + url = url.replace(reg, '\x241' + callbackField + '=' + callbackFnName); + + if (url.search(reg) < 0) { + url += (url.indexOf('?') < 0 ? '?' : '&') + callbackField + '=' + callbackFnName; + } + + var queryStr = json2str(opts); // { name:"Jim",city:"Beijing" } --> "name=Jim&city=Beijing" + //如果用户直接通过data参数传递json对象过来,则也要将此json对象转化为字符串 + if (!utils.isEmptyObject(opts.data)){ + queryStr += (queryStr? "&":"") + json2str(opts.data); + } + if (queryStr) { + url = url.replace(/\?/, '?' + queryStr + '&'); + } + + scr.onerror = getCallBack(1); + if( timeOut ){ + timer = setTimeout(getCallBack(1), timeOut); + } + createScriptTag(scr, url, charset); + + function createScriptTag(scr, url, charset) { + scr.setAttribute('type', 'text/javascript'); + scr.setAttribute('defer', 'defer'); + charset && scr.setAttribute('charset', charset); + scr.setAttribute('src', url); + document.getElementsByTagName('head')[0].appendChild(scr); + } + + function getCallBack(onTimeOut){ + return function(){ + try { + if(onTimeOut){ + options.onerror && options.onerror(); + }else{ + try{ + clearTimeout(timer); + successhandler.apply(window, arguments); + } catch (e){} + } + } catch (exception) { + options.onerror && options.onerror.call(window, exception); + } finally { + options.oncomplete && options.oncomplete.apply(window, arguments); + scr.parentNode && scr.parentNode.removeChild(scr); + window[callbackFnName] = null; + try { + delete window[callbackFnName]; + }catch(e){} + } + } + } + } + + return { + /** + * 根据给定的参数项,向指定的url发起一个ajax请求。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调 + * @method request + * @param { URLString } url ajax请求的url地址 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * //向sayhello.php发起一个异步的Ajax GET请求, 请求超时时间为10s, 请求完成后执行相应的回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求方法。可选值: 'GET', 'POST',默认值是'POST' + * method: 'GET', + * + * //超时时间。 默认为5000, 单位是ms + * timeout: 10000, + * + * //是否是异步请求。 true为异步请求, false为同步请求 + * async: true, + * + * //请求携带的数据。如果请求为GET请求, data会经过stringify后附加到请求url之后。 + * data: { + * name: 'ueditor' + * }, + * + * //请求成功后的回调, 该回调接受当前的XMLHttpRequest对象作为参数。 + * onsuccess: function ( xhr ) { + * console.log( xhr.responseText ); + * }, + * + * //请求失败或者超时后的回调。 + * onerror: function ( xhr ) { + * alert( 'Ajax请求失败' ); + * } + * + * } ); + * ``` + */ + + /** + * 根据给定的参数项发起一个ajax请求, 参数项里必须包含一个url地址。 ajax请求完成后,会根据请求结果调用相应回调: 如果请求 + * 成功, 则调用onsuccess回调, 失败则调用 onerror 回调。 + * @method request + * @warning 如果在参数项里未提供一个key为“url”的地址值,则该请求将直接退出。 + * @param { Object } ajaxOptions ajax请求选项的键值对,支持的选项如下: + * @example + * ```javascript + * + * //向sayhello.php发起一个异步的Ajax POST请求, 请求超时时间为5s, 请求完成后不执行任何回调。 + * UE.ajax.requeset( 'sayhello.php', { + * + * //请求的地址, 该项是必须的。 + * url: 'sayhello.php' + * + * } ); + * ``` + */ + request:function(url, opts) { + if (opts && opts.dataType == 'jsonp') { + doJsonp(url, opts); + } else { + doAjax(url, opts); + } + }, + getJSONP:function(url, data, fn) { + var opts = { + 'data': data, + 'oncomplete': fn + }; + doJsonp(url, opts); + } + }; + + +}(); + + +// core/filterword.js +/** + * UE过滤word的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + + +/** + * 根据传入html字符串过滤word + * @module UE + * @since 1.2.6.1 + * @method filterWord + * @param { String } html html字符串 + * @return { String } 已过滤后的结果字符串 + * @example + * ```javascript + * UE.filterWord(html); + * ``` + */ +var filterWord = UE.filterWord = function () { + + //是否是word过来的内容 + function isWordDocument( str ) { + return /(class="?Mso|style="[^"]*\bmso\-|w:WordDocument|<(v|o):|lang=)/ig.test( str ); + } + //去掉小数 + function transUnit( v ) { + v = v.replace( /[\d.]+\w+/g, function ( m ) { + return utils.transUnitToPx(m); + } ); + return v; + } + + function filterPasteWord( str ) { + return str.replace(/[\t\r\n]+/g,' ') + .replace( //ig, "" ) + //转换图片 + .replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(str){ + //opera能自己解析出image所这里直接返回空 + if(browser.opera){ + return ''; + } + try{ + //有可能是bitmap占为图,无用,直接过滤掉,主要体现在粘贴excel表格中 + if(/Bitmap/i.test(str)){ + return ''; + } + var width = str.match(/width:([ \d.]*p[tx])/i)[1], + height = str.match(/height:([ \d.]*p[tx])/i)[1], + src = str.match(/src=\s*"([^"]*)"/i)[1]; + return ''; + } catch(e){ + return ''; + } + }) + //针对wps添加的多余标签处理 + .replace(/<\/?div[^>]*>/g,'') + //去掉多余的属性 + .replace( /v:\w+=(["']?)[^'"]+\1/g, '' ) + .replace( /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi, "" ) + .replace( /

            ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "

            $1

            " ) + //去掉多余的属性 + .replace( /\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/ig, function(str,name,marks,val){ + //保留list的标示 + return name == 'class' && val == 'MsoListParagraph' ? str : '' + }) + //清除多余的font/span不能匹配 有可能是空格 + .replace( /<(font|span)[^>]*>(\s*)<\/\1>/gi, function(a,b,c){ + return c.replace(/[\t\r\n ]+/g,' ') + }) + //处理style的问题 + .replace( /(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi, function( str, tag, tmp, style ) { + var n = [], + s = style.replace( /^\s+|\s+$/, '' ) + .replace(/'/g,'\'') + .replace( /"/gi, "'" ) + .replace(/[\d.]+(cm|pt)/g,function(str){ + return utils.transUnitToPx(str) + }) + .split( /;\s*/g ); + + for ( var i = 0,v; v = s[i];i++ ) { + + var name, value, + parts = v.split( ":" ); + + if ( parts.length == 2 ) { + name = parts[0].toLowerCase(); + value = parts[1].toLowerCase(); + if(/^(background)\w*/.test(name) && value.replace(/(initial|\s)/g,'').length == 0 + || + /^(margin)\w*/.test(name) && /^0\w+$/.test(value) + ){ + continue; + } + + switch ( name ) { + case "mso-padding-alt": + case "mso-padding-top-alt": + case "mso-padding-right-alt": + case "mso-padding-bottom-alt": + case "mso-padding-left-alt": + case "mso-margin-alt": + case "mso-margin-top-alt": + case "mso-margin-right-alt": + case "mso-margin-bottom-alt": + case "mso-margin-left-alt": + //ie下会出现挤到一起的情况 + //case "mso-table-layout-alt": + case "mso-height": + case "mso-width": + case "mso-vertical-align-alt": + //trace:1819 ff下会解析出padding在table上 + if(!/]/.test(html)) { + return UE.htmlparser(html).children[0] + } else { + return new uNode({ + type:'element', + children:[], + tagName:html + }) + } + }; + uNode.createText = function (data,noTrans) { + return new UE.uNode({ + type:'text', + 'data':noTrans ? data : utils.unhtml(data || '') + }) + }; + function nodeToHtml(node, arr, formatter, current) { + switch (node.type) { + case 'root': + for (var i = 0, ci; ci = node.children[i++];) { + //插入新行 + if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { + insertLine(arr, current, true); + insertIndent(arr, current) + } + nodeToHtml(ci, arr, formatter, current) + } + break; + case 'text': + isText(node, arr); + break; + case 'element': + isElement(node, arr, formatter, current); + break; + case 'comment': + isComment(node, arr, formatter); + } + return arr; + } + + function isText(node, arr) { + if(node.parentNode.tagName == 'pre'){ + //源码模式下输入html标签,不能做转换处理,直接输出 + arr.push(node.data) + }else{ + arr.push(notTransTagName[node.parentNode.tagName] ? utils.html(node.data) : node.data.replace(/[ ]{2}/g,'  ')) + } + + } + + function isElement(node, arr, formatter, current) { + var attrhtml = ''; + if (node.attrs) { + attrhtml = []; + var attrs = node.attrs; + for (var a in attrs) { + //这里就针对 + //

            '

            + //这里边的\"做转换,要不用innerHTML直接被截断了,属性src + //有可能做的不够 + attrhtml.push(a + (attrs[a] !== undefined ? '="' + (notTransAttrs[a] ? utils.html(attrs[a]).replace(/["]/g, function (a) { + return '"' + }) : utils.unhtml(attrs[a])) + '"' : '')) + } + attrhtml = attrhtml.join(' '); + } + arr.push('<' + node.tagName + + (attrhtml ? ' ' + attrhtml : '') + + (dtd.$empty[node.tagName] ? '\/' : '' ) + '>' + ); + //插入新行 + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { + if(node.children && node.children.length){ + current = insertLine(arr, current, true); + insertIndent(arr, current) + } + + } + if (node.children && node.children.length) { + for (var i = 0, ci; ci = node.children[i++];) { + if (formatter && ci.type == 'element' && !dtd.$inlineWithA[ci.tagName] && i > 1) { + insertLine(arr, current); + insertIndent(arr, current) + } + nodeToHtml(ci, arr, formatter, current) + } + } + if (!dtd.$empty[node.tagName]) { + if (formatter && !dtd.$inlineWithA[node.tagName] && node.tagName != 'pre') { + + if(node.children && node.children.length){ + current = insertLine(arr, current); + insertIndent(arr, current) + } + } + arr.push('<\/' + node.tagName + '>'); + } + + } + + function isComment(node, arr) { + arr.push(''); + } + + function getNodeById(root, id) { + var node; + if (root.type == 'element' && root.getAttr('id') == id) { + return root; + } + if (root.children && root.children.length) { + for (var i = 0, ci; ci = root.children[i++];) { + if (node = getNodeById(ci, id)) { + return node; + } + } + } + } + + function getNodesByTagName(node, tagName, arr) { + if (node.type == 'element' && node.tagName == tagName) { + arr.push(node); + } + if (node.children && node.children.length) { + for (var i = 0, ci; ci = node.children[i++];) { + getNodesByTagName(ci, tagName, arr) + } + } + } + function nodeTraversal(root,fn){ + if(root.children && root.children.length){ + for(var i= 0,ci;ci=root.children[i];){ + nodeTraversal(ci,fn); + //ci被替换的情况,这里就不再走 fn了 + if(ci.parentNode ){ + if(ci.children && ci.children.length){ + fn(ci) + } + if(ci.parentNode) i++ + } + } + }else{ + fn(root) + } + + } + uNode.prototype = { + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml(); + * ``` + */ + + /** + * 当前节点对象,转换成html文本 + * @method toHtml + * @param { Boolean } formatter 是否格式化返回值 + * @return { String } 返回转换后的html字符串 + * @example + * ```javascript + * node.toHtml( true ); + * ``` + */ + toHtml:function (formatter) { + var arr = []; + nodeToHtml(this, arr, formatter, 0); + return arr.join('') + }, + + /** + * 获取节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的html内容 + * @example + * ```javascript + * var htmlstr = node.innerHTML(); + * ``` + */ + + /** + * 设置节点的html内容 + * @method innerHTML + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } htmlstr 传入要设置的html内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * node.innerHTML('text'); + * ``` + */ + innerHTML:function (htmlstr) { + if (this.type != 'element' || dtd.$empty[this.tagName]) { + return this; + } + if (utils.isString(htmlstr)) { + if(this.children){ + for (var i = 0, ci; ci = this.children[i++];) { + ci.parentNode = null; + } + } + this.children = []; + var tmpRoot = UE.htmlparser(htmlstr); + for (var i = 0, ci; ci = tmpRoot.children[i++];) { + this.children.push(ci); + ci.parentNode = this; + } + return this; + } else { + var tmpRoot = new UE.uNode({ + type:'root', + children:this.children + }); + return tmpRoot.toHtml(); + } + }, + + /** + * 获取节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @return { String } 返回节点的存文本内容 + * @example + * ```javascript + * var textStr = node.innerText(); + * ``` + */ + + /** + * 设置节点的纯文本内容 + * @method innerText + * @warning 假如节点的type不是'element',或节点的标签名称不在dtd列表里,直接返回当前节点 + * @param { String } textStr 传入要设置的文本内容 + * @return { UE.uNode } 返回节点本身 + * @example + * ```javascript + * node.innerText('text'); + * ``` + */ + innerText:function (textStr,noTrans) { + if (this.type != 'element' || dtd.$empty[this.tagName]) { + return this; + } + if (textStr) { + if(this.children){ + for (var i = 0, ci; ci = this.children[i++];) { + ci.parentNode = null; + } + } + this.children = []; + this.appendChild(uNode.createText(textStr,noTrans)); + return this; + } else { + return this.toHtml().replace(/<[^>]+>/g, ''); + } + }, + + /** + * 获取当前对象的data属性 + * @method getData + * @return { Object } 若节点的type值是elemenet,返回空字符串,否则返回节点的data属性 + * @example + * ```javascript + * node.getData(); + * ``` + */ + getData:function () { + if (this.type == 'element') + return ''; + return this.data + }, + + /** + * 获取当前节点下的第一个子节点 + * @method firstChild + * @return { UE.uNode } 返回第一个子节点 + * @example + * ```javascript + * node.firstChild(); //返回第一个子节点 + * ``` + */ + firstChild:function () { +// if (this.type != 'element' || dtd.$empty[this.tagName]) { +// return this; +// } + return this.children ? this.children[0] : null; + }, + + /** + * 获取当前节点下的最后一个子节点 + * @method lastChild + * @return { UE.uNode } 返回最后一个子节点 + * @example + * ```javascript + * node.lastChild(); //返回最后一个子节点 + * ``` + */ + lastChild:function () { +// if (this.type != 'element' || dtd.$empty[this.tagName] ) { +// return this; +// } + return this.children ? this.children[this.children.length - 1] : null; + }, + + /** + * 获取和当前节点有相同父亲节点的前一个节点 + * @method previousSibling + * @return { UE.uNode } 返回前一个节点 + * @example + * ```javascript + * node.children[2].previousSibling(); //返回子节点node.children[1] + * ``` + */ + previousSibling : function(){ + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i]; i++) { + if (ci === this) { + return i == 0 ? null : parent.children[i-1]; + } + } + + }, + + /** + * 获取和当前节点有相同父亲节点的后一个节点 + * @method nextSibling + * @return { UE.uNode } 返回后一个节点,找不到返回null + * @example + * ```javascript + * node.children[2].nextSibling(); //如果有,返回子节点node.children[3] + * ``` + */ + nextSibling : function(){ + var parent = this.parentNode; + for (var i = 0, ci; ci = parent.children[i++];) { + if (ci === this) { + return parent.children[i]; + } + } + }, + + /** + * 用新的节点替换当前节点 + * @method replaceChild + * @param { UE.uNode } target 要替换成该节点参数 + * @param { UE.uNode } source 要被替换掉的节点 + * @return { UE.uNode } 返回替换之后的节点对象 + * @example + * ```javascript + * node.replaceChild(newNode, childNode); //用newNode替换childNode,childNode是node的子节点 + * ``` + */ + replaceChild:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i, 1, target); + source.parentNode = null; + target.parentNode = this; + return target; + } + } + } + }, + + /** + * 在节点的子节点列表最后位置插入一个节点 + * @method appendChild + * @param { UE.uNode } node 要插入的节点 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.appendChild( newNode ); //在node内插入子节点newNode + * ``` + */ + appendChild:function (node) { + if (this.type == 'root' || (this.type == 'element' && !dtd.$empty[this.tagName])) { + if (!this.children) { + this.children = [] + } + if(node.parentNode){ + node.parentNode.removeChild(node); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === node) { + this.children.splice(i, 1); + break; + } + } + this.children.push(node); + node.parentNode = this; + return node; + } + + + }, + + /** + * 在传入节点的前面插入一个节点 + * @method insertBefore + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点前面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.parentNode.insertBefore(newNode, node); //在node节点后面插入newNode + * ``` + */ + insertBefore:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i, 0, target); + target.parentNode = this; + return target; + } + } + + } + }, + + /** + * 在传入节点的后面插入一个节点 + * @method insertAfter + * @param { UE.uNode } target 要插入的节点 + * @param { UE.uNode } source 在该参数节点后面插入 + * @return { UE.uNode } 返回刚插入的子节点 + * @example + * ```javascript + * node.parentNode.insertAfter(newNode, node); //在node节点后面插入newNode + * ``` + */ + insertAfter:function (target, source) { + if (this.children) { + if(target.parentNode){ + target.parentNode.removeChild(target); + } + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === source) { + this.children.splice(i + 1, 0, target); + target.parentNode = this; + return target; + } + + } + } + }, + + /** + * 从当前节点的子节点列表中,移除节点 + * @method removeChild + * @param { UE.uNode } node 要移除的节点引用 + * @param { Boolean } keepChildren 是否保留移除节点的子节点,若传入true,自动把移除节点的子节点插入到移除的位置 + * @return { * } 返回刚移除的子节点 + * @example + * ```javascript + * node.removeChild(childNode,true); //在node的子节点列表中移除child节点,并且吧child的子节点插入到移除的位置 + * ``` + */ + removeChild:function (node,keepChildren) { + if (this.children) { + for (var i = 0, ci; ci = this.children[i]; i++) { + if (ci === node) { + this.children.splice(i, 1); + ci.parentNode = null; + if(keepChildren && ci.children && ci.children.length){ + for(var j= 0,cj;cj=ci.children[j];j++){ + this.children.splice(i+j,0,cj); + cj.parentNode = this; + + } + } + return ci; + } + } + } + }, + + /** + * 获取当前节点所代表的元素属性,即获取attrs对象下的属性值 + * @method getAttr + * @param { String } attrName 要获取的属性名称 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.getAttr('title'); + * ``` + */ + getAttr:function (attrName) { + return this.attrs && this.attrs[attrName.toLowerCase()] + }, + + /** + * 设置当前节点所代表的元素属性,即设置attrs对象下的属性值 + * @method setAttr + * @param { String } attrName 要设置的属性名称 + * @param { * } attrVal 要设置的属性值,类型视设置的属性而定 + * @return { * } 返回attrs对象下的属性值 + * @example + * ```javascript + * node.setAttr('title','标题'); + * ``` + */ + setAttr:function (attrName, attrVal) { + if (!attrName) { + delete this.attrs; + return; + } + if(!this.attrs){ + this.attrs = {}; + } + if (utils.isObject(attrName)) { + for (var a in attrName) { + if (!attrName[a]) { + delete this.attrs[a] + } else { + this.attrs[a.toLowerCase()] = attrName[a]; + } + } + } else { + if (!attrVal) { + delete this.attrs[attrName] + } else { + this.attrs[attrName.toLowerCase()] = attrVal; + } + + } + }, + + /** + * 获取当前节点在父节点下的位置索引 + * @method getIndex + * @return { Number } 返回索引数值,如果没有父节点,返回-1 + * @example + * ```javascript + * node.getIndex(); + * ``` + */ + getIndex:function(){ + var parent = this.parentNode; + for(var i= 0,ci;ci=parent.children[i];i++){ + if(ci === this){ + return i; + } + } + return -1; + }, + + /** + * 在当前节点下,根据id查找节点 + * @method getNodeById + * @param { String } id 要查找的id + * @return { UE.uNode } 返回找到的节点 + * @example + * ```javascript + * node.getNodeById('textId'); + * ``` + */ + getNodeById:function (id) { + var node; + if (this.children && this.children.length) { + for (var i = 0, ci; ci = this.children[i++];) { + if (node = getNodeById(ci, id)) { + return node; + } + } + } + }, + + /** + * 在当前节点下,根据元素名称查找节点列表 + * @method getNodesByTagName + * @param { String } tagNames 要查找的元素名称 + * @return { Array } 返回找到的节点列表 + * @example + * ```javascript + * node.getNodesByTagName('span'); + * ``` + */ + getNodesByTagName:function (tagNames) { + tagNames = utils.trim(tagNames).replace(/[ ]{2,}/g, ' ').split(' '); + var arr = [], me = this; + utils.each(tagNames, function (tagName) { + if (me.children && me.children.length) { + for (var i = 0, ci; ci = me.children[i++];) { + getNodesByTagName(ci, tagName, arr) + } + } + }); + return arr; + }, + + /** + * 根据样式名称,获取节点的样式值 + * @method getStyle + * @param { String } name 要获取的样式名称 + * @return { String } 返回样式值 + * @example + * ```javascript + * node.getStyle('font-size'); + * ``` + */ + getStyle:function (name) { + var cssStyle = this.getAttr('style'); + if (!cssStyle) { + return '' + } + var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+)','i'); + var match = cssStyle.match(reg); + if (match && match[0]) { + return match[2] + } + return ''; + }, + + /** + * 给节点设置样式 + * @method setStyle + * @param { String } name 要设置的的样式名称 + * @param { String } val 要设置的的样值 + * @example + * ```javascript + * node.setStyle('font-size', '12px'); + * ``` + */ + setStyle:function (name, val) { + function exec(name, val) { + var reg = new RegExp('(^|;)\\s*' + name + ':([^;]+;?)', 'gi'); + cssStyle = cssStyle.replace(reg, '$1'); + if (val) { + cssStyle = name + ':' + utils.unhtml(val) + ';' + cssStyle + } + + } + + var cssStyle = this.getAttr('style'); + if (!cssStyle) { + cssStyle = ''; + } + if (utils.isObject(name)) { + for (var a in name) { + exec(a, name[a]) + } + } else { + exec(name, val) + } + this.setAttr('style', utils.trim(cssStyle)) + }, + + /** + * 传入一个函数,递归遍历当前节点下的所有节点 + * @method traversal + * @param { Function } fn 遍历到节点的时,传入节点作为参数,运行此函数 + * @example + * ```javascript + * traversal(node, function(){ + * console.log(node.type); + * }); + * ``` + */ + traversal:function(fn){ + if(this.children && this.children.length){ + nodeTraversal(this,fn); + } + return this; + } + } +})(); + + +// core/htmlparser.js +/** + * html字符串转换成uNode节点 + * @file + * @module UE + * @since 1.2.6.1 + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @unfile + * @module UE + */ + +/** + * html字符串转换成uNode节点的静态方法 + * @method htmlparser + * @param { String } htmlstr 要转换的html代码 + * @param { Boolean } ignoreBlank 若设置为true,转换的时候忽略\n\r\t等空白字符 + * @return { uNode } 给定的html片段转换形成的uNode对象 + * @example + * ```javascript + * var root = UE.htmlparser('

            htmlparser

            ', true); + * ``` + */ + +var htmlparser = UE.htmlparser = function (htmlstr,ignoreBlank) { + //todo 原来的方式 [^"'<>\/] 有\/就不能配对上 ') + } + html.push('') + } + //禁止指定table-width + return '
            这样的标签了 + //先去掉了,加上的原因忘了,这里先记录 + var re_tag = /<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g, + re_attr = /([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g; + + //ie下取得的html可能会有\n存在,要去掉,在处理replace(/[\t\r\n]*/g,'');代码高量的\n不能去除 + var allowEmptyTags = { + b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1, + sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1 + }; + htmlstr = htmlstr.replace(new RegExp(domUtils.fillChar, 'g'), ''); + if(!ignoreBlank){ + htmlstr = htmlstr.replace(new RegExp('[\\r\\t\\n'+(ignoreBlank?'':' ')+']*<\/?(\\w+)\\s*(?:[^>]*)>[\\r\\t\\n'+(ignoreBlank?'':' ')+']*','g'), function(a,b){ + //br暂时单独处理 + if(b && allowEmptyTags[b.toLowerCase()]){ + return a.replace(/(^[\n\r]+)|([\n\r]+$)/g,''); + } + return a.replace(new RegExp('^[\\r\\n'+(ignoreBlank?'':' ')+']+'),'').replace(new RegExp('[\\r\\n'+(ignoreBlank?'':' ')+']+$'),''); + }); + } + + var notTransAttrs = { + 'href':1, + 'src':1 + }; + + var uNode = UE.uNode, + needParentNode = { + 'td':'tr', + 'tr':['tbody','thead','tfoot'], + 'tbody':'table', + 'th':'tr', + 'thead':'table', + 'tfoot':'table', + 'caption':'table', + 'li':['ul', 'ol'], + 'dt':'dl', + 'dd':'dl', + 'option':'select' + }, + needChild = { + 'ol':'li', + 'ul':'li' + }; + + function text(parent, data) { + + if(needChild[parent.tagName]){ + var tmpNode = uNode.createElement(needChild[parent.tagName]); + parent.appendChild(tmpNode); + tmpNode.appendChild(uNode.createText(data)); + parent = tmpNode; + }else{ + + parent.appendChild(uNode.createText(data)); + } + } + + function element(parent, tagName, htmlattr) { + var needParentTag; + if (needParentTag = needParentNode[tagName]) { + var tmpParent = parent,hasParent; + while(tmpParent.type != 'root'){ + if(utils.isArray(needParentTag) ? utils.indexOf(needParentTag, tmpParent.tagName) != -1 : needParentTag == tmpParent.tagName){ + parent = tmpParent; + hasParent = true; + break; + } + tmpParent = tmpParent.parentNode; + } + if(!hasParent){ + parent = element(parent, utils.isArray(needParentTag) ? needParentTag[0] : needParentTag) + } + } + //按dtd处理嵌套 +// if(parent.type != 'root' && !dtd[parent.tagName][tagName]) +// parent = parent.parentNode; + var elm = new uNode({ + parentNode:parent, + type:'element', + tagName:tagName.toLowerCase(), + //是自闭合的处理一下 + children:dtd.$empty[tagName] ? null : [] + }); + //如果属性存在,处理属性 + if (htmlattr) { + var attrs = {}, match; + while (match = re_attr.exec(htmlattr)) { + attrs[match[1].toLowerCase()] = notTransAttrs[match[1].toLowerCase()] ? (match[2] || match[3] || match[4]) : utils.unhtml(match[2] || match[3] || match[4]) + } + elm.attrs = attrs; + } + //trace:3970 +// //如果parent下不能放elm +// if(dtd.$inline[parent.tagName] && dtd.$block[elm.tagName] && !dtd[parent.tagName][elm.tagName]){ +// parent = parent.parentNode; +// elm.parentNode = parent; +// } + parent.children.push(elm); + //如果是自闭合节点返回父亲节点 + return dtd.$empty[tagName] ? parent : elm + } + + function comment(parent, data) { + parent.children.push(new uNode({ + type:'comment', + data:data, + parentNode:parent + })); + } + + var match, currentIndex = 0, nextIndex = 0; + //设置根节点 + var root = new uNode({ + type:'root', + children:[] + }); + var currentParent = root; + + while (match = re_tag.exec(htmlstr)) { + currentIndex = match.index; + try{ + if (currentIndex > nextIndex) { + //text node + text(currentParent, htmlstr.slice(nextIndex, currentIndex)); + } + if (match[3]) { + + if(dtd.$cdata[currentParent.tagName]){ + text(currentParent, match[0]); + }else{ + //start tag + currentParent = element(currentParent, match[3].toLowerCase(), match[4]); + } + + + } else if (match[1]) { + if(currentParent.type != 'root'){ + if(dtd.$cdata[currentParent.tagName] && !dtd.$cdata[match[1]]){ + text(currentParent, match[0]); + }else{ + var tmpParent = currentParent; + while(currentParent.type == 'element' && currentParent.tagName != match[1].toLowerCase()){ + currentParent = currentParent.parentNode; + if(currentParent.type == 'root'){ + currentParent = tmpParent; + throw 'break' + } + } + //end tag + currentParent = currentParent.parentNode; + } + + } + + } else if (match[2]) { + //comment + comment(currentParent, match[2]) + } + }catch(e){} + + nextIndex = re_tag.lastIndex; + + } + //如果结束是文本,就有可能丢掉,所以这里手动判断一下 + //例如
          • sdfsdfsdf
          • sdfsdfsdfsdf + if (nextIndex < htmlstr.length) { + text(currentParent, htmlstr.slice(nextIndex)); + } + return root; +}; + + +// core/filternode.js +/** + * UE过滤节点的静态方法 + * @file + */ + +/** + * UEditor公用空间,UEditor所有的功能都挂载在该空间下 + * @module UE + */ + + +/** + * 根据传入节点和过滤规则过滤相应节点 + * @module UE + * @since 1.2.6.1 + * @method filterNode + * @param { Object } root 指定root节点 + * @param { Object } rules 过滤规则json对象 + * @example + * ```javascript + * UE.filterNode(root,editor.options.filterRules); + * ``` + */ +var filterNode = UE.filterNode = function () { + function filterNode(node,rules){ + switch (node.type) { + case 'text': + break; + case 'element': + var val; + if(val = rules[node.tagName]){ + if(val === '-'){ + node.parentNode.removeChild(node) + }else if(utils.isFunction(val)){ + var parentNode = node.parentNode, + index = node.getIndex(); + val(node); + if(node.parentNode){ + if(node.children){ + for(var i = 0,ci;ci=node.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + }else{ + for(var i = index,ci;ci=parentNode.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + + + }else{ + var attrs = val['$']; + if(attrs && node.attrs){ + var tmpAttrs = {},tmpVal; + for(var a in attrs){ + tmpVal = node.getAttr(a); + //todo 只先对style单独处理 + if(a == 'style' && utils.isArray(attrs[a])){ + var tmpCssStyle = []; + utils.each(attrs[a],function(v){ + var tmp; + if(tmp = node.getStyle(v)){ + tmpCssStyle.push(v + ':' + tmp); + } + }); + tmpVal = tmpCssStyle.join(';') + } + if(tmpVal){ + tmpAttrs[a] = tmpVal; + } + + } + node.attrs = tmpAttrs; + } + if(node.children){ + for(var i = 0,ci;ci=node.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + } + }else{ + //如果不在名单里扣出子节点并删除该节点,cdata除外 + if(dtd.$cdata[node.tagName]){ + node.parentNode.removeChild(node) + }else{ + var parentNode = node.parentNode, + index = node.getIndex(); + node.parentNode.removeChild(node,true); + for(var i = index,ci;ci=parentNode.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + } + } + break; + case 'comment': + node.parentNode.removeChild(node) + } + + } + return function(root,rules){ + if(utils.isEmptyObject(rules)){ + return root; + } + var val; + if(val = rules['-']){ + utils.each(val.split(' '),function(k){ + rules[k] = '-' + }) + } + for(var i= 0,ci;ci=root.children[i];){ + filterNode(ci,rules); + if(ci.parentNode){ + i++; + } + } + return root; + } +}(); + +// core/plugin.js +/** + * Created with JetBrains PhpStorm. + * User: campaign + * Date: 10/8/13 + * Time: 6:15 PM + * To change this template use File | Settings | File Templates. + */ +UE.plugin = function(){ + var _plugins = {}; + return { + register : function(pluginName,fn,oldOptionName,afterDisabled){ + if(oldOptionName && utils.isFunction(oldOptionName)){ + afterDisabled = oldOptionName; + oldOptionName = null + } + _plugins[pluginName] = { + optionName : oldOptionName || pluginName, + execFn : fn, + //当插件被禁用时执行 + afterDisabled : afterDisabled + } + }, + load : function(editor){ + utils.each(_plugins,function(plugin){ + var _export = plugin.execFn.call(editor); + if(editor.options[plugin.optionName] !== false){ + if(_export){ + //后边需要再做扩展 + utils.each(_export,function(v,k){ + switch(k.toLowerCase()){ + case 'shortcutkey': + editor.addshortcutkey(v); + break; + case 'bindevents': + utils.each(v,function(fn,eventName){ + editor.addListener(eventName,fn); + }); + break; + case 'bindmultievents': + utils.each(utils.isArray(v) ? v:[v],function(event){ + var types = utils.trim(event.type).split(/\s+/); + utils.each(types,function(eventName){ + editor.addListener(eventName, event.handler); + }); + }); + break; + case 'commands': + utils.each(v,function(execFn,execName){ + editor.commands[execName] = execFn + }); + break; + case 'outputrule': + editor.addOutputRule(v); + break; + case 'inputrule': + editor.addInputRule(v); + break; + case 'defaultoptions': + editor.setOpt(v) + } + }) + } + + }else if(plugin.afterDisabled){ + plugin.afterDisabled.call(editor) + } + + }); + //向下兼容 + utils.each(UE.plugins,function(plugin){ + plugin.call(editor); + }); + }, + run : function(pluginName,editor){ + var plugin = _plugins[pluginName]; + if(plugin){ + plugin.exeFn.call(editor) + } + } + } +}(); + +// core/keymap.js +var keymap = UE.keymap = { + 'Backspace' : 8, + 'Tab' : 9, + 'Enter' : 13, + + 'Shift':16, + 'Control':17, + 'Alt':18, + 'CapsLock':20, + + 'Esc':27, + + 'Spacebar':32, + + 'PageUp':33, + 'PageDown':34, + 'End':35, + 'Home':36, + + 'Left':37, + 'Up':38, + 'Right':39, + 'Down':40, + + 'Insert':45, + + 'Del':46, + + 'NumLock':144, + + 'Cmd':91, + + '=':187, + '-':189, + + "b":66, + 'i':73, + //回退 + 'z':90, + 'y':89, + //粘贴 + 'v' : 86, + 'x' : 88, + + 's' : 83, + + 'n' : 78 +}; + +// core/localstorage.js +//存储媒介封装 +var LocalStorage = UE.LocalStorage = (function () { + + var storage = window.localStorage || getUserData() || null, + LOCAL_FILE = 'localStorage'; + + return { + + saveLocalData: function (key, data) { + + if (storage && data) { + storage.setItem(key, data); + return true; + } + + return false; + + }, + + getLocalData: function (key) { + + if (storage) { + return storage.getItem(key); + } + + return null; + + }, + + removeItem: function (key) { + + storage && storage.removeItem(key); + + } + + }; + + function getUserData() { + + var container = document.createElement("div"); + container.style.display = "none"; + + if (!container.addBehavior) { + return null; + } + + container.addBehavior("#default#userdata"); + + return { + + getItem: function (key) { + + var result = null; + + try { + document.body.appendChild(container); + container.load(LOCAL_FILE); + result = container.getAttribute(key); + document.body.removeChild(container); + } catch (e) { + } + + return result; + + }, + + setItem: function (key, value) { + + document.body.appendChild(container); + container.setAttribute(key, value); + container.save(LOCAL_FILE); + document.body.removeChild(container); + + }, + + //// 暂时没有用到 + //clear: function () { + // + // var expiresTime = new Date(); + // expiresTime.setFullYear(expiresTime.getFullYear() - 1); + // document.body.appendChild(container); + // container.expires = expiresTime.toUTCString(); + // container.save(LOCAL_FILE); + // document.body.removeChild(container); + // + //}, + + removeItem: function (key) { + + document.body.appendChild(container); + container.removeAttribute(key); + container.save(LOCAL_FILE); + document.body.removeChild(container); + + } + + }; + + } + +})(); + +(function () { + + var ROOTKEY = 'ueditor_preference'; + + UE.Editor.prototype.setPreferences = function(key,value){ + var obj = {}; + if (utils.isString(key)) { + obj[ key ] = value; + } else { + obj = key; + } + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + utils.extend(data, obj); + } else { + data = obj; + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + + UE.Editor.prototype.getPreferences = function(key){ + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + return key ? data[key] : data + } + return null; + }; + + UE.Editor.prototype.removePreferences = function (key) { + var data = LocalStorage.getLocalData(ROOTKEY); + if (data && (data = utils.str2json(data))) { + data[key] = undefined; + delete data[key] + } + data && LocalStorage.saveLocalData(ROOTKEY, utils.json2str(data)); + }; + +})(); + + +// plugins/defaultfilter.js +///import core +///plugin 编辑器默认的过滤转换机制 + +UE.plugins['defaultfilter'] = function () { + var me = this; + me.setOpt({ + 'allowDivTransToP':true, + 'disabledTableInTable':true + }); + //默认的过滤处理 + //进入编辑器的内容处理 + me.addInputRule(function (root) { + var allowDivTransToP = this.options.allowDivTransToP; + var val; + function tdParent(node){ + while(node && node.type == 'element'){ + if(node.tagName == 'td'){ + return true; + } + node = node.parentNode; + } + return false; + } + //进行默认的处理 + root.traversal(function (node) { + if (node.type == 'element') { + if (!dtd.$cdata[node.tagName] && me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { + if (!node.firstChild()) node.parentNode.removeChild(node); + else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { + node.parentNode.removeChild(node, true) + } + return; + } + switch (node.tagName) { + case 'style': + case 'script': + node.setAttr({ + cdata_tag: node.tagName, + cdata_data: (node.innerHTML() || ''), + '_ue_custom_node_':'true' + }); + node.tagName = 'div'; + node.innerHTML(''); + break; + case 'a': + if (val = node.getAttr('href')) { + node.setAttr('_href', val) + } + break; + case 'img': + //todo base64暂时去掉,后边做远程图片上传后,干掉这个 + if (val = node.getAttr('src')) { + if (/^data:/.test(val)) { + node.parentNode.removeChild(node); + break; + } + } + node.setAttr('_src', node.getAttr('src')); + break; + case 'span': + if (browser.webkit && (val = node.getStyle('white-space'))) { + if (/nowrap|normal/.test(val)) { + node.setStyle('white-space', ''); + if (me.options.autoClearEmptyNode && utils.isEmptyObject(node.attrs)) { + node.parentNode.removeChild(node, true) + } + } + } + val = node.getAttr('id'); + if(val && /^_baidu_bookmark_/i.test(val)){ + node.parentNode.removeChild(node) + } + break; + case 'p': + if (val = node.getAttr('align')) { + node.setAttr('align'); + node.setStyle('text-align', val) + } + //trace:3431 +// var cssStyle = node.getAttr('style'); +// if (cssStyle) { +// cssStyle = cssStyle.replace(/(margin|padding)[^;]+/g, ''); +// node.setAttr('style', cssStyle) +// +// } + //p标签不允许嵌套 + utils.each(node.children,function(n){ + if(n.type == 'element' && n.tagName == 'p'){ + var next = n.nextSibling(); + node.parentNode.insertAfter(n,node); + var last = n; + while(next){ + var tmp = next.nextSibling(); + node.parentNode.insertAfter(next,last); + last = next; + next = tmp; + } + return false; + } + }); + if (!node.firstChild()) { + node.innerHTML(browser.ie ? ' ' : '
            ') + } + break; + case 'div': + if(node.getAttr('cdata_tag')){ + break; + } + //针对代码这里不处理插入代码的div + val = node.getAttr('class'); + if(val && /^line number\d+/.test(val)){ + break; + } + if(!allowDivTransToP){ + break; + } + var tmpNode, p = UE.uNode.createElement('p'); + while (tmpNode = node.firstChild()) { + if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement('p'); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + break; + case 'dl': + node.tagName = 'ul'; + break; + case 'dt': + case 'dd': + node.tagName = 'li'; + break; + case 'li': + var className = node.getAttr('class'); + if (!className || !/list\-/.test(className)) { + node.setAttr() + } + var tmpNodes = node.getNodesByTagName('ol ul'); + UE.utils.each(tmpNodes, function (n) { + node.parentNode.insertAfter(n, node); + }); + break; + case 'td': + case 'th': + case 'caption': + if(!node.children || !node.children.length){ + node.appendChild(browser.ie11below ? UE.uNode.createText(' ') : UE.uNode.createElement('br')) + } + break; + case 'table': + if(me.options.disabledTableInTable && tdParent(node)){ + node.parentNode.insertBefore(UE.uNode.createText(node.innerText()),node); + node.parentNode.removeChild(node) + } + } + + } +// if(node.type == 'comment'){ +// node.parentNode.removeChild(node); +// } + }) + + }); + + //从编辑器出去的内容处理 + me.addOutputRule(function (root) { + + var val; + root.traversal(function (node) { + if (node.type == 'element') { + + if (me.options.autoClearEmptyNode && dtd.$inline[node.tagName] && !dtd.$empty[node.tagName] && (!node.attrs || utils.isEmptyObject(node.attrs))) { + + if (!node.firstChild()) node.parentNode.removeChild(node); + else if (node.tagName == 'span' && (!node.attrs || utils.isEmptyObject(node.attrs))) { + node.parentNode.removeChild(node, true) + } + return; + } + switch (node.tagName) { + case 'div': + if (val = node.getAttr('cdata_tag')) { + node.tagName = val; + node.appendChild(UE.uNode.createText(node.getAttr('cdata_data'))); + node.setAttr({cdata_tag: '', cdata_data: '','_ue_custom_node_':''}); + } + break; + case 'a': + if (val = node.getAttr('_href')) { + node.setAttr({ + 'href': utils.html(val), + '_href': '' + }) + } + break; + break; + case 'span': + val = node.getAttr('id'); + if(val && /^_baidu_bookmark_/i.test(val)){ + node.parentNode.removeChild(node) + } + break; + case 'img': + if (val = node.getAttr('_src')) { + node.setAttr({ + 'src': node.getAttr('_src'), + '_src': '' + }) + } + + + } + } + + }) + + + }); +}; + + +// plugins/inserthtml.js +/** + * 插入html字符串插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入html代码 + * @command inserthtml + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } html 插入的html字符串 + * @remaind 插入的标签内容是在当前的选区位置上插入,如果当前是闭合状态,那直接插入内容, 如果当前是选中状态,将先清除当前选中内容后,再做插入 + * @warning 注意:该命令会对当前选区的位置,对插入的内容进行过滤转换处理。 过滤的规则遵循html语意化的原则。 + * @example + * ```javascript + * //xxx[BB]xxx 当前选区为非闭合选区,选中BB这两个文本 + * //执行命令,插入CC + * //插入后的效果 xxxCCxxx + * //

            xx|xxx

            当前选区为闭合状态 + * //插入

            CC

            + * //结果

            xx

            CC

            xxx

            + * //

            xxxx

            |

            xxx

            当前选区在两个p标签之间 + * //插入 xxxx + * //结果

            xxxx

            xxxx

            xxx

            + * ``` + */ + +UE.commands['inserthtml'] = { + execCommand: function (command,html,notNeedFilter){ + var me = this, + range, + div; + if(!html){ + return; + } + if(me.fireEvent('beforeinserthtml',html) === true){ + return; + } + range = me.selection.getRange(); + div = range.document.createElement( 'div' ); + div.style.display = 'inline'; + + if (!notNeedFilter) { + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if(me.options.filterRules){ + UE.filterNode(root,me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + html = root.toHtml() + } + div.innerHTML = utils.trim( html ); + + if ( !range.collapsed ) { + var tmpNode = range.startContainer; + if(domUtils.isFillChar(tmpNode)){ + range.setStartBefore(tmpNode) + } + tmpNode = range.endContainer; + if(domUtils.isFillChar(tmpNode)){ + range.setEndAfter(tmpNode) + } + range.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
            + if(range.endContainer && range.endContainer.nodeType == 1){ + tmpNode = range.endContainer.childNodes[range.endOffset]; + if(tmpNode && domUtils.isBr(tmpNode)){ + range.setEndAfter(tmpNode); + } + } + if(range.startOffset == 0){ + tmpNode = range.startContainer; + if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ + tmpNode = range.endContainer; + if(range.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ + me.body.innerHTML = '

            '+(browser.ie ? '' : '
            ')+'

            '; + range.setStart(me.body.firstChild,0).collapse(true) + + } + } + } + !range.collapsed && range.deleteContents(); + if(range.startContainer.nodeType == 1){ + var child = range.startContainer.childNodes[range.startOffset],pre; + if(child && domUtils.isBlockElm(child) && (pre = child.previousSibling) && domUtils.isBlockElm(pre)){ + range.setEnd(pre,pre.childNodes.length).collapse(); + while(child.firstChild){ + pre.appendChild(child.firstChild); + } + domUtils.remove(child); + } + } + + } + + + var child,parent,pre,tmp,hadBreak = 0, nextNode; + //如果当前位置选中了fillchar要干掉,要不会产生空行 + if(range.inFillChar()){ + child = range.startContainer; + if(domUtils.isFillChar(child)){ + range.setStartBefore(child).collapse(true); + domUtils.remove(child); + }else if(domUtils.isFillChar(child,true)){ + child.nodeValue = child.nodeValue.replace(fillCharReg,''); + range.startOffset--; + range.collapsed && range.collapse(true) + } + } + //列表单独处理 + var li = domUtils.findParentByTagName(range.startContainer,'li',true); + if(li){ + var next,last; + while(child = div.firstChild){ + //针对hr单独处理一下先 + while(child && (child.nodeType == 3 || !domUtils.isBlockElm(child) || child.tagName=='HR' )){ + next = child.nextSibling; + range.insertNode( child).collapse(); + last = child; + child = next; + + } + if(child){ + if(/^(ol|ul)$/i.test(child.tagName)){ + while(child.firstChild){ + last = child.firstChild; + domUtils.insertAfter(li,child.firstChild); + li = li.nextSibling; + } + domUtils.remove(child) + }else{ + var tmpLi; + next = child.nextSibling; + tmpLi = me.document.createElement('li'); + domUtils.insertAfter(li,tmpLi); + tmpLi.appendChild(child); + last = child; + child = next; + li = tmpLi; + } + } + } + li = domUtils.findParentByTagName(range.startContainer,'li',true); + if(domUtils.isEmptyBlock(li)){ + domUtils.remove(li) + } + if(last){ + + range.setStartAfter(last).collapse(true).select(true) + } + }else{ + while ( child = div.firstChild ) { + if(hadBreak){ + var p = me.document.createElement('p'); + while(child && (child.nodeType == 3 || !dtd.$block[child.tagName])){ + nextNode = child.nextSibling; + p.appendChild(child); + child = nextNode; + } + if(p.firstChild){ + + child = p + } + } + range.insertNode( child ); + nextNode = child.nextSibling; + if ( !hadBreak && child.nodeType == domUtils.NODE_ELEMENT && domUtils.isBlockElm( child ) ){ + + parent = domUtils.findParent( child,function ( node ){ return domUtils.isBlockElm( node ); } ); + if ( parent && parent.tagName.toLowerCase() != 'body' && !(dtd[parent.tagName][child.nodeName] && child.parentNode === parent)){ + if(!dtd[parent.tagName][child.nodeName]){ + pre = parent; + }else{ + tmp = child.parentNode; + while (tmp !== parent){ + pre = tmp; + tmp = tmp.parentNode; + + } + } + + + domUtils.breakParent( child, pre || tmp ); + //去掉break后前一个多余的节点

            |<[p> ==>

            |

            + var pre = child.previousSibling; + domUtils.trimWhiteTextNode(pre); + if(!pre.childNodes.length){ + domUtils.remove(pre); + } + //trace:2012,在非ie的情况,切开后剩下的节点有可能不能点入光标添加br占位 + + if(!browser.ie && + (next = child.nextSibling) && + domUtils.isBlockElm(next) && + next.lastChild && + !domUtils.isBr(next.lastChild)){ + next.appendChild(me.document.createElement('br')); + } + hadBreak = 1; + } + } + var next = child.nextSibling; + if(!div.firstChild && next && domUtils.isBlockElm(next)){ + + range.setStart(next,0).collapse(true); + break; + } + range.setEndAfter( child ).collapse(); + + } + + child = range.startContainer; + + if(nextNode && domUtils.isBr(nextNode)){ + domUtils.remove(nextNode) + } + //用chrome可能有空白展位符 + if(domUtils.isBlockElm(child) && domUtils.isEmptyNode(child)){ + if(nextNode = child.nextSibling){ + domUtils.remove(child); + if(nextNode.nodeType == 1 && dtd.$block[nextNode.tagName]){ + + range.setStart(nextNode,0).collapse(true).shrinkBoundary() + } + }else{ + + try{ + child.innerHTML = browser.ie ? domUtils.fillChar : '
            '; + }catch(e){ + range.setStartBefore(child); + domUtils.remove(child) + } + + } + + } + //加上true因为在删除表情等时会删两次,第一次是删的fillData + try{ + range.select(true); + }catch(e){} + + } + + + + setTimeout(function(){ + range = me.selection.getRange(); + range.scrollToView(me.autoHeightEnabled,me.autoHeightEnabled ? domUtils.getXY(me.iframe).y:0); + me.fireEvent('afterinserthtml', html); + },200); + } +}; + + +// plugins/autotypeset.js +/** + * 自动排版 + * @file + * @since 1.2.6.1 + */ + +/** + * 对当前编辑器的内容执行自动排版, 排版的行为根据config配置文件里的“autotypeset”选项进行控制。 + * @command autotypeset + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autotypeset' ); + * ``` + */ + +UE.plugins['autotypeset'] = function(){ + + this.setOpt({'autotypeset': { + mergeEmptyline: true, //合并空行 + removeClass: true, //去掉冗余的class + removeEmptyline: false, //去掉空行 + textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + pasteFilter: false, //根据规则过滤没事粘贴进来的内容 + clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 + clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 + removeEmptyNode: false, // 去掉空节点 + //可以去掉的标签 + removeTagNames: utils.extend({div:1},dtd.$removeEmpty), + indent: false, // 行首缩进 + indentValue : '2em', //行首缩进的大小 + bdc2sb: false, + tobdc: false + }}); + + var me = this, + opt = me.options.autotypeset, + remainClass = { + 'selectTdClass':1, + 'pagebreak':1, + 'anchorclass':1 + }, + remainTag = { + 'li':1 + }, + tags = { + div:1, + p:1, + //trace:2183 这些也认为是行 + blockquote:1,center:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1, + span:1 + }, + highlightCont; + //升级了版本,但配置项目里没有autotypeset + if(!opt){ + return; + } + + readLocalOpts(); + + function isLine(node,notEmpty){ + if(!node || node.nodeType == 3) + return 0; + if(domUtils.isBr(node)) + return 1; + if(node && node.parentNode && tags[node.tagName.toLowerCase()]){ + if(highlightCont && highlightCont.contains(node) + || + node.getAttribute('pagebreak') + ){ + return 0; + } + + return notEmpty ? !domUtils.isEmptyBlock(node) : domUtils.isEmptyBlock(node,new RegExp('[\\s'+domUtils.fillChar + +']','g')); + } + } + + function removeNotAttributeSpan(node){ + if(!node.style.cssText){ + domUtils.removeAttributes(node,['style']); + if(node.tagName.toLowerCase() == 'span' && domUtils.hasNoAttributes(node)){ + domUtils.remove(node,true); + } + } + } + function autotype(type,html){ + + var me = this,cont; + if(html){ + if(!opt.pasteFilter){ + return; + } + cont = me.document.createElement('div'); + cont.innerHTML = html.html; + }else{ + cont = me.document.body; + } + var nodes = domUtils.getElementsByTagName(cont,'*'); + + // 行首缩进,段落方向,段间距,段内间距 + for(var i=0,ci;ci=nodes[i++];){ + + if(me.fireEvent('excludeNodeinautotype',ci) === true){ + continue; + } + //font-size + if(opt.clearFontSize && ci.style.fontSize){ + domUtils.removeStyle(ci,'font-size'); + + removeNotAttributeSpan(ci); + + } + //font-family + if(opt.clearFontFamily && ci.style.fontFamily){ + domUtils.removeStyle(ci,'font-family'); + removeNotAttributeSpan(ci); + } + + if(isLine(ci)){ + //合并空行 + if(opt.mergeEmptyline ){ + var next = ci.nextSibling,tmpNode,isBr = domUtils.isBr(ci); + while(isLine(next)){ + tmpNode = next; + next = tmpNode.nextSibling; + if(isBr && (!next || next && !domUtils.isBr(next))){ + break; + } + domUtils.remove(tmpNode); + } + + } + //去掉空行,保留占位的空行 + if(opt.removeEmptyline && domUtils.inDoc(ci,cont) && !remainTag[ci.parentNode.tagName.toLowerCase()] ){ + if(domUtils.isBr(ci)){ + next = ci.nextSibling; + if(next && !domUtils.isBr(next)){ + continue; + } + } + domUtils.remove(ci); + continue; + + } + + } + if(isLine(ci,true) && ci.tagName != 'SPAN'){ + if(opt.indent){ + ci.style.textIndent = opt.indentValue; + } + if(opt.textAlign){ + ci.style.textAlign = opt.textAlign; + } + // if(opt.lineHeight) + // ci.style.lineHeight = opt.lineHeight + 'cm'; + + } + + //去掉class,保留的class不去掉 + if(opt.removeClass && ci.className && !remainClass[ci.className.toLowerCase()]){ + + if(highlightCont && highlightCont.contains(ci)){ + continue; + } + domUtils.removeAttributes(ci,['class']); + } + + //表情不处理 + if(opt.imageBlockLine && ci.tagName.toLowerCase() == 'img' && !ci.getAttribute('emotion')){ + if(html){ + var img = ci; + switch (opt.imageBlockLine){ + case 'left': + case 'right': + case 'none': + var pN = img.parentNode,tmpNode,pre,next; + while(dtd.$inline[pN.tagName] || pN.tagName == 'A'){ + pN = pN.parentNode; + } + tmpNode = pN; + if(tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode,'text-align') == 'center'){ + if(!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1){ + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if(pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)){ + pre.appendChild(tmpNode.firstChild); + while(next.firstChild){ + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + }else{ + domUtils.setStyle(tmpNode,'text-align',''); + } + + + } + + + } + domUtils.setStyle(img,'float', opt.imageBlockLine); + break; + case 'center': + if(me.queryCommandValue('imagefloat') != 'center'){ + pN = img.parentNode; + domUtils.setStyle(img,'float','none'); + tmpNode = img; + while(pN && domUtils.getChildCount(pN,function(node){return !domUtils.isBr(node) && !domUtils.isWhitespace(node)}) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')){ + tmpNode = pN; + pN = pN.parentNode; + } + var pNode = me.document.createElement('p'); + domUtils.setAttributes(pNode,{ + + style:'text-align:center' + }); + tmpNode.parentNode.insertBefore(pNode,tmpNode); + pNode.appendChild(tmpNode); + domUtils.setStyle(tmpNode,'float',''); + + } + + + } + } else { + var range = me.selection.getRange(); + range.selectNode(ci).select(); + me.execCommand('imagefloat', opt.imageBlockLine); + } + + } + + //去掉冗余的标签 + if(opt.removeEmptyNode){ + if(opt.removeTagNames[ci.tagName.toLowerCase()] && domUtils.hasNoAttributes(ci) && domUtils.isEmptyBlock(ci)){ + domUtils.remove(ci); + } + } + } + if(opt.tobdc){ + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function(node){ + if(node.type == 'text'){ + node.data = ToDBC(node.data) + } + }); + cont.innerHTML = root.toHtml() + } + if(opt.bdc2sb){ + var root = UE.htmlparser(cont.innerHTML); + root.traversal(function(node){ + if(node.type == 'text'){ + node.data = DBC2SB(node.data) + } + }); + cont.innerHTML = root.toHtml() + } + if(html){ + html.html = cont.innerHTML; + } + } + if(opt.pasteFilter){ + me.addListener('beforepaste',autotype); + } + + function DBC2SB(str) { + var result = ''; + for (var i = 0; i < str.length; i++) { + var code = str.charCodeAt(i); //获取当前字符的unicode编码 + if (code >= 65281 && code <= 65373)//在这个unicode编码范围中的是所有的英文字母已经各种字符 + { + result += String.fromCharCode(str.charCodeAt(i) - 65248); //把全角字符的unicode编码转换为对应半角字符的unicode码 + } else if (code == 12288)//空格 + { + result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32); + } else { + result += str.charAt(i); + } + } + return result; + } + function ToDBC(txtstring) { + txtstring = utils.html(txtstring); + var tmp = ""; + var mark = "";/*用于判断,如果是html尖括里的标记,则不进行全角的转换*/ + for (var i = 0; i < txtstring.length; i++) { + if (txtstring.charCodeAt(i) == 32) { + tmp = tmp + String.fromCharCode(12288); + } + else if (txtstring.charCodeAt(i) < 127) { + tmp = tmp + String.fromCharCode(txtstring.charCodeAt(i) + 65248); + } + else { + tmp += txtstring.charAt(i); + } + } + return tmp; + } + + function readLocalOpts() { + var cookieOpt = me.getPreferences('autotypeset'); + utils.extend(me.options.autotypeset, cookieOpt); + } + + me.commands['autotypeset'] = { + execCommand:function () { + me.removeListener('beforepaste',autotype); + if(opt.pasteFilter){ + me.addListener('beforepaste',autotype); + } + autotype.call(me) + } + + }; + +}; + + + +// plugins/autosubmit.js +/** + * 快捷键提交 + * @file + * @since 1.2.6.1 + */ + +/** + * 提交表单 + * @command autosubmit + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'autosubmit' ); + * ``` + */ + +UE.plugin.register('autosubmit',function(){ + return { + shortcutkey:{ + "autosubmit":"ctrl+13" //手动提交 + }, + commands:{ + 'autosubmit':{ + execCommand:function () { + var me=this, + form = domUtils.findParentByTagName(me.iframe,"form", false); + if (form){ + if(me.fireEvent("beforesubmit")===false){ + return; + } + me.sync(); + form.submit(); + } + } + } + } + } +}); + +// plugins/background.js +/** + * 背景插件,为UEditor提供设置背景功能 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('background', function () { + var me = this, + cssRuleId = 'editor_background', + isSetColored, + reg = new RegExp('body[\\s]*\\{(.+)\\}', 'i'); + + function stringToObj(str) { + var obj = {}, styles = str.split(';'); + utils.each(styles, function (v) { + var index = v.indexOf(':'), + key = utils.trim(v.substr(0, index)).toLowerCase(); + key && (obj[key] = utils.trim(v.substr(index + 1) || '')); + }); + return obj; + } + + function setBackground(obj) { + if (obj) { + var styles = []; + for (var name in obj) { + if (obj.hasOwnProperty(name)) { + styles.push(name + ":" + obj[name] + '; '); + } + } + utils.cssRule(cssRuleId, styles.length ? ('body{' + styles.join("") + '}') : '', me.document); + } else { + utils.cssRule(cssRuleId, '', me.document) + } + } + //重写editor.hasContent方法 + + var orgFn = me.hasContents; + me.hasContents = function(){ + if(me.queryCommandValue('background')){ + return true + } + return orgFn.apply(me,arguments); + }; + return { + bindEvents: { + 'getAllHtml': function (type, headHtml) { + var body = this.body, + su = domUtils.getComputedStyle(body, "background-image"), + url = ""; + if (su.indexOf(me.options.imagePath) > 0) { + url = su.substring(su.indexOf(me.options.imagePath), su.length - 1).replace(/"|\(|\)/ig, ""); + } else { + url = su != "none" ? su.replace(/url\("?|"?\)/ig, "") : ""; + } + var html = ' '; + headHtml.push(html); + }, + 'aftersetcontent': function () { + if(isSetColored == false) setBackground(); + } + }, + inputRule: function (root) { + isSetColored = false; + utils.each(root.getNodesByTagName('p'), function (p) { + var styles = p.getAttr('data-background'); + if (styles) { + isSetColored = true; + setBackground(stringToObj(styles)); + p.parentNode.removeChild(p); + } + }) + }, + outputRule: function (root) { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); + if (styles) { + root.appendChild(UE.uNode.createElement('


            ')); + } + }, + commands: { + 'background': { + execCommand: function (cmd, obj) { + setBackground(obj); + }, + queryCommandValue: function () { + var me = this, + styles = (utils.cssRule(cssRuleId, me.document) || '').replace(/[\n\r]+/g, '').match(reg); + return styles ? stringToObj(styles[1]) : null; + }, + notNeedUndo: true + } + } + } +}); + +// plugins/image.js +/** + * 图片插入、排版插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 图片对齐方式 + * @command imagefloat + * @method execCommand + * @remind 值center为独占一行居中 + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式,可传left、right、none、center + * @remaind center表示图片独占一行 + * @example + * ```javascript + * editor.execCommand( 'imagefloat', 'center' ); + * ``` + */ + +/** + * 如果选区所在位置是图片区域 + * @command imagefloat + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回图片对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'imagefloat' ); + * ``` + */ + +UE.commands['imagefloat'] = { + execCommand:function (cmd, align) { + var me = this, + range = me.selection.getRange(); + if (!range.collapsed) { + var img = range.getClosedNode(); + if (img && img.tagName == 'IMG') { + switch (align) { + case 'left': + case 'right': + case 'none': + var pN = img.parentNode, tmpNode, pre, next; + while (dtd.$inline[pN.tagName] || pN.tagName == 'A') { + pN = pN.parentNode; + } + tmpNode = pN; + if (tmpNode.tagName == 'P' && domUtils.getStyle(tmpNode, 'text-align') == 'center') { + if (!domUtils.isBody(tmpNode) && domUtils.getChildCount(tmpNode, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1) { + pre = tmpNode.previousSibling; + next = tmpNode.nextSibling; + if (pre && next && pre.nodeType == 1 && next.nodeType == 1 && pre.tagName == next.tagName && domUtils.isBlockElm(pre)) { + pre.appendChild(tmpNode.firstChild); + while (next.firstChild) { + pre.appendChild(next.firstChild); + } + domUtils.remove(tmpNode); + domUtils.remove(next); + } else { + domUtils.setStyle(tmpNode, 'text-align', ''); + } + + + } + + range.selectNode(img).select(); + } + domUtils.setStyle(img, 'float', align == 'none' ? '' : align); + if(align == 'none'){ + domUtils.removeAttributes(img,'align'); + } + + break; + case 'center': + if (me.queryCommandValue('imagefloat') != 'center') { + pN = img.parentNode; + domUtils.setStyle(img, 'float', ''); + domUtils.removeAttributes(img,'align'); + tmpNode = img; + while (pN && domUtils.getChildCount(pN, function (node) { + return !domUtils.isBr(node) && !domUtils.isWhitespace(node); + }) == 1 + && (dtd.$inline[pN.tagName] || pN.tagName == 'A')) { + tmpNode = pN; + pN = pN.parentNode; + } + range.setStartBefore(tmpNode).setCursor(false); + pN = me.document.createElement('div'); + pN.appendChild(tmpNode); + domUtils.setStyle(tmpNode, 'float', ''); + + me.execCommand('insertHtml', '

            ' + pN.innerHTML + '

            '); + + tmpNode = me.document.getElementById('_img_parent_tmp'); + tmpNode.removeAttribute('id'); + tmpNode = tmpNode.firstChild; + range.selectNode(tmpNode).select(); + //去掉后边多余的元素 + next = tmpNode.parentNode.nextSibling; + if (next && domUtils.isEmptyNode(next)) { + domUtils.remove(next); + } + + } + + break; + } + + } + } + }, + queryCommandValue:function () { + var range = this.selection.getRange(), + startNode, floatStyle; + if (range.collapsed) { + return 'none'; + } + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + floatStyle = domUtils.getComputedStyle(startNode, 'float') || startNode.getAttribute('align'); + + if (floatStyle == 'none') { + floatStyle = domUtils.getComputedStyle(startNode.parentNode, 'text-align') == 'center' ? 'center' : floatStyle; + } + return { + left:1, + right:1, + center:1 + }[floatStyle] ? floatStyle : 'none'; + } + return 'none'; + + + }, + queryCommandState:function () { + var range = this.selection.getRange(), + startNode; + + if (range.collapsed) return -1; + + startNode = range.getClosedNode(); + if (startNode && startNode.nodeType == 1 && startNode.tagName == 'IMG') { + return 0; + } + return -1; + } +}; + + +/** + * 插入图片 + * @command insertimage + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } opt 属性键值对,这些属性都将被复制到当前插入图片 + * @remind 该命令第二个参数可接受一个图片配置项对象的数组,可以插入多张图片, + * 此时数组的每一个元素都是一个Object类型的图片属性集合。 + * @example + * ```javascript + * editor.execCommand( 'insertimage', { + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * } ); + * ``` + * @example + * ```javascript + * editor.execCommand( 'insertimage', [{ + * src:'a/b/c.jpg', + * width:'100', + * height:'100' + * },{ + * src:'a/b/d.jpg', + * width:'100', + * height:'100' + * }] ); + * ``` + */ + +UE.commands['insertimage'] = { + execCommand:function (cmd, opt) { + + opt = utils.isArray(opt) ? opt : [opt]; + if (!opt.length) { + return; + } + var me = this, + range = me.selection.getRange(), + img = range.getClosedNode(); + + if(me.fireEvent('beforeinsertimage', opt) === true){ + return; + } + + function unhtmlData(imgCi) { + + utils.each('width,height,border,hspace,vspace'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = parseInt(imgCi[item], 10) || 0; + } + }); + + utils.each('src,_src'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtmlForUrl(imgCi[item]); + } + }); + utils.each('title,alt'.split(','), function (item) { + + if (imgCi[item]) { + imgCi[item] = utils.unhtml(imgCi[item]); + } + }); + } + + if (img && /img/i.test(img.tagName) && (img.className != "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1) && !img.getAttribute("word_img")) { + var first = opt.shift(); + var floatStyle = first['floatStyle']; + delete first['floatStyle']; +//// img.style.border = (first.border||0) +"px solid #000"; +//// img.style.margin = (first.margin||0) +"px"; +// img.style.cssText += ';margin:' + (first.margin||0) +"px;" + 'border:' + (first.border||0) +"px solid #000"; + domUtils.setAttributes(img, first); + me.execCommand('imagefloat', floatStyle); + if (opt.length > 0) { + range.setStartAfter(img).setCursor(false, true); + me.execCommand('insertimage', opt); + } + + } else { + var html = [], str = '', ci; + ci = opt[0]; + if (opt.length == 1) { + unhtmlData(ci); + + str = '' + ci.alt + ''; + if (ci['floatStyle'] == 'center') { + str = '

            ' + str + '

            '; + } + html.push(str); + + } else { + for (var i = 0; ci = opt[i++];) { + unhtmlData(ci); + str = '

            '; + html.push(str); + } + } + + me.execCommand('insertHtml', html.join('')); + } + + me.fireEvent('afterinsertimage', opt) + } +}; + + +// plugins/justify.js +/** + * 段落格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落对齐方式 + * @command justify + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } align 对齐方式:left => 居左,right => 居右,center => 居中,justify => 两端对齐 + * @example + * ```javascript + * editor.execCommand( 'justify', 'center' ); + * ``` + */ +/** + * 如果选区所在位置是段落区域,返回当前段落对齐方式 + * @command justify + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回段落对齐方式 + * @example + * ```javascript + * editor.queryCommandValue( 'justify' ); + * ``` + */ + +UE.plugins['justify']=function(){ + var me=this, + block = domUtils.isBlockElm, + defaultValue = { + left:1, + right:1, + center:1, + justify:1 + }, + doJustify = function (range, style) { + var bookmark = range.createBookmark(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }; + + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode; + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + if (current.nodeType == 3 || !block(current)) { + tmpRange.setStartBefore(current); + while (current && current !== bookmark2.end && !block(current)) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !block(node); + }); + } + tmpRange.setEndAfter(tmpNode); + var common = tmpRange.getCommonAncestor(); + if (!domUtils.isBody(common) && block(common)) { + domUtils.setStyles(common, utils.isString(style) ? {'text-align':style} : style); + current = common; + } else { + var p = range.document.createElement('p'); + domUtils.setStyles(p, utils.isString(style) ? {'text-align':style} : style); + var frag = tmpRange.extractContents(); + p.appendChild(frag); + tmpRange.insertNode(p); + current = p; + } + current = domUtils.getNextDomNode(current, false, filterFn); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + return range.moveToBookmark(bookmark2).moveToBookmark(bookmark); + }; + + UE.commands['justify'] = { + execCommand:function (cmdName, align) { + var range = this.selection.getRange(), + txt; + + //闭合时单独处理 + if (range.collapsed) { + txt = this.document.createTextNode('p'); + range.insertNode(txt); + } + doJustify(range, align); + if (txt) { + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + + + return true; + }, + queryCommandValue:function () { + var startNode = this.selection.getStart(), + value = domUtils.getComputedStyle(startNode, 'text-align'); + return defaultValue[value] ? value : 'left'; + }, + queryCommandState:function () { + var start = this.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th","caption"], true); + + return cell? -1:0; + } + + }; +}; + + +// plugins/font.js +/** + * 字体颜色,背景色,字号,字体,下划线,删除线 + * @file + * @since 1.2.6.1 + */ + +/** + * 字体颜色 + * @command forecolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'forecolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command forecolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'forecolor' ); + * ``` + */ + +/** + * 字体背景颜色 + * @command backcolor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 色值(必须十六进制) + * @example + * ```javascript + * editor.execCommand( 'backcolor', '#000' ); + * ``` + */ +/** + * 返回选区字体颜色 + * @command backcolor + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体背景颜色 + * @example + * ```javascript + * editor.queryCommandValue( 'backcolor' ); + * ``` + */ + +/** + * 字体大小 + * @command fontsize + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体大小 + * @example + * ```javascript + * editor.execCommand( 'fontsize', '14px' ); + * ``` + */ +/** + * 返回选区字体大小 + * @command fontsize + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体大小 + * @example + * ```javascript + * editor.queryCommandValue( 'fontsize' ); + * ``` + */ + +/** + * 字体样式 + * @command fontfamily + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 字体样式 + * @example + * ```javascript + * editor.execCommand( 'fontfamily', '微软雅黑' ); + * ``` + */ +/** + * 返回选区字体样式 + * @command fontfamily + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回字体样式 + * @example + * ```javascript + * editor.queryCommandValue( 'fontfamily' ); + * ``` + */ + +/** + * 字体下划线,与删除线互斥 + * @command underline + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'underline' ); + * ``` + */ + +/** + * 字体删除线,与下划线互斥 + * @command strikethrough + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'strikethrough' ); + * ``` + */ + +/** + * 字体边框 + * @command fontborder + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'fontborder' ); + * ``` + */ + +UE.plugins['font'] = function () { + var me = this, + fonts = { + 'forecolor': 'color', + 'backcolor': 'background-color', + 'fontsize': 'font-size', + 'fontfamily': 'font-family', + 'underline': 'text-decoration', + 'strikethrough': 'text-decoration', + 'fontborder': 'border' + }, + needCmd = {'underline': 1, 'strikethrough': 1, 'fontborder': 1}, + needSetChild = { + 'forecolor': 'color', + 'backcolor': 'background-color', + 'fontsize': 'font-size', + 'fontfamily': 'font-family' + + }; + me.setOpt({ + 'fontfamily': [ + { name: 'songti', val: '宋体,SimSun'}, + { name: 'yahei', val: '微软雅黑,Microsoft YaHei'}, + { name: 'kaiti', val: '楷体,楷体_GB2312, SimKai'}, + { name: 'heiti', val: '黑体, SimHei'}, + { name: 'lishu', val: '隶书, SimLi'}, + { name: 'andaleMono', val: 'andale mono'}, + { name: 'arial', val: 'arial, helvetica,sans-serif'}, + { name: 'arialBlack', val: 'arial black,avant garde'}, + { name: 'comicSansMs', val: 'comic sans ms'}, + { name: 'impact', val: 'impact,chicago'}, + { name: 'timesNewRoman', val: 'times new roman'} + ], + 'fontsize': [10, 11, 12, 14, 16, 18, 20, 24, 36] + }); + + function mergeWithParent(node){ + var parent; + while(parent = node.parentNode){ + if(parent.tagName == 'SPAN' && domUtils.getChildCount(parent,function(child){ + return !domUtils.isBookmarkNode(child) && !domUtils.isBr(child) + }) == 1) { + parent.style.cssText += node.style.cssText; + domUtils.remove(node,true); + node = parent; + + }else{ + break; + } + } + + } + function mergeChild(rng,cmdName,value){ + if(needSetChild[cmdName]){ + rng.adjustmentBoundary(); + if(!rng.collapsed && rng.startContainer.nodeType == 1){ + var start = rng.startContainer.childNodes[rng.startOffset]; + if(start && domUtils.isTagNode(start,'span')){ + var bk = rng.createBookmark(); + utils.each(domUtils.getElementsByTagName(start, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span))return; + if(cmdName == 'backcolor' && domUtils.getComputedStyle(span,'background-color').toLowerCase() === value){ + return; + } + domUtils.removeStyle(span,needSetChild[cmdName]); + if(span.style.cssText.replace(/^\s+$/,'').length == 0){ + domUtils.remove(span,true) + } + }); + rng.moveToBookmark(bk) + } + } + } + + } + function mergesibling(rng,cmdName,value) { + var collapsed = rng.collapsed, + bk = rng.createBookmark(), common; + if (collapsed) { + common = bk.start.parentNode; + while (dtd.$inline[common.tagName]) { + common = common.parentNode; + } + } else { + common = domUtils.getCommonAncestor(bk.start, bk.end); + } + utils.each(domUtils.getElementsByTagName(common, 'span'), function (span) { + if (!span.parentNode || domUtils.isBookmarkNode(span))return; + if (/\s*border\s*:\s*none;?\s*/i.test(span.style.cssText)) { + if(/^\s*border\s*:\s*none;?\s*$/.test(span.style.cssText)){ + domUtils.remove(span, true); + }else{ + domUtils.removeStyle(span,'border'); + } + return + } + if (/border/i.test(span.style.cssText) && span.parentNode.tagName == 'SPAN' && /border/i.test(span.parentNode.style.cssText)) { + span.style.cssText = span.style.cssText.replace(/border[^:]*:[^;]+;?/gi, ''); + } + if(!(cmdName=='fontborder' && value=='none')){ + var next = span.nextSibling; + while (next && next.nodeType == 1 && next.tagName == 'SPAN' ) { + if(domUtils.isBookmarkNode(next) && cmdName == 'fontborder') { + span.appendChild(next); + next = span.nextSibling; + continue; + } + if (next.style.cssText == span.style.cssText) { + domUtils.moveChild(next, span); + domUtils.remove(next); + } + if (span.nextSibling === next) + break; + next = span.nextSibling; + } + } + + + mergeWithParent(span); + if(browser.ie && browser.version > 8 ){ + //拷贝父亲们的特别的属性,这里只做背景颜色的处理 + var parent = domUtils.findParent(span,function(n){return n.tagName == 'SPAN' && /background-color/.test(n.style.cssText)}); + if(parent && !/background-color/.test(span.style.cssText)){ + span.style.backgroundColor = parent.style.backgroundColor; + } + } + + }); + rng.moveToBookmark(bk); + mergeChild(rng,cmdName,value) + } + + me.addInputRule(function (root) { + utils.each(root.getNodesByTagName('u s del font strike'), function (node) { + if (node.tagName == 'font') { + var cssStyle = []; + for (var p in node.attrs) { + switch (p) { + case 'size': + cssStyle.push('font-size:' + + ({ + '1':'10', + '2':'12', + '3':'16', + '4':'18', + '5':'24', + '6':'32', + '7':'48' + }[node.attrs[p]] || node.attrs[p]) + 'px'); + break; + case 'color': + cssStyle.push('color:' + node.attrs[p]); + break; + case 'face': + cssStyle.push('font-family:' + node.attrs[p]); + break; + case 'style': + cssStyle.push(node.attrs[p]); + } + } + node.attrs = { + 'style': cssStyle.join(';') + }; + } else { + var val = node.tagName == 'u' ? 'underline' : 'line-through'; + node.attrs = { + 'style': (node.getAttr('style') || '') + 'text-decoration:' + val + ';' + } + } + node.tagName = 'span'; + }); +// utils.each(root.getNodesByTagName('span'), function (node) { +// var val; +// if(val = node.getAttr('class')){ +// if(/fontstrikethrough/.test(val)){ +// node.setStyle('text-decoration','line-through'); +// if(node.attrs['class']){ +// node.attrs['class'] = node.attrs['class'].replace(/fontstrikethrough/,''); +// }else{ +// node.setAttr('class') +// } +// } +// if(/fontborder/.test(val)){ +// node.setStyle('border','1px solid #000'); +// if(node.attrs['class']){ +// node.attrs['class'] = node.attrs['class'].replace(/fontborder/,''); +// }else{ +// node.setAttr('class') +// } +// } +// } +// }); + }); +// me.addOutputRule(function(root){ +// utils.each(root.getNodesByTagName('span'), function (node) { +// var val; +// if(val = node.getStyle('text-decoration')){ +// if(/line-through/.test(val)){ +// if(node.attrs['class']){ +// node.attrs['class'] += ' fontstrikethrough'; +// }else{ +// node.setAttr('class','fontstrikethrough') +// } +// } +// +// node.setStyle('text-decoration') +// } +// if(val = node.getStyle('border')){ +// if(/1px/.test(val) && /solid/.test(val)){ +// if(node.attrs['class']){ +// node.attrs['class'] += ' fontborder'; +// +// }else{ +// node.setAttr('class','fontborder') +// } +// } +// node.setStyle('border') +// +// } +// }); +// }); + for (var p in fonts) { + (function (cmd, style) { + UE.commands[cmd] = { + execCommand: function (cmdName, value) { + value = value || (this.queryCommandState(cmdName) ? 'none' : cmdName == 'underline' ? 'underline' : + cmdName == 'fontborder' ? '1px solid #000' : + 'line-through'); + var me = this, + range = this.selection.getRange(), + text; + + if (value == 'default') { + + if (range.collapsed) { + text = me.document.createTextNode('font'); + range.insertNode(text).select(); + + } + me.execCommand('removeFormat', 'span,a', style); + if (text) { + range.setStartBefore(text).collapse(true); + domUtils.remove(text); + } + mergesibling(range,cmdName,value); + range.select() + } else { + if (!range.collapsed) { + if (needCmd[cmd] && me.queryCommandValue(cmd)) { + me.execCommand('removeFormat', 'span,a', style); + } + range = me.selection.getRange(); + + range.applyInlineStyle('span', {'style': style + ':' + value}); + mergesibling(range, cmdName,value); + range.select(); + } else { + + var span = domUtils.findParentByTagName(range.startContainer, 'span', true); + text = me.document.createTextNode('font'); + if (span && !span.children.length && !span[browser.ie ? 'innerText' : 'textContent'].replace(fillCharReg, '').length) { + //for ie hack when enter + range.insertNode(text); + if (needCmd[cmd]) { + range.selectNode(text).select(); + me.execCommand('removeFormat', 'span,a', style, null); + + span = domUtils.findParentByTagName(text, 'span', true); + range.setStartBefore(text); + + } + span && (span.style.cssText += ';' + style + ':' + value); + range.collapse(true).select(); + + + } else { + range.insertNode(text); + range.selectNode(text).select(); + span = range.document.createElement('span'); + + if (needCmd[cmd]) { + //a标签内的不处理跳过 + if (domUtils.findParentByTagName(text, 'a', true)) { + range.setStartBefore(text).setCursor(); + domUtils.remove(text); + return; + } + me.execCommand('removeFormat', 'span,a', style); + } + + span.style.cssText = style + ':' + value; + + + text.parentNode.insertBefore(span, text); + //修复,span套span 但样式不继承的问题 + if (!browser.ie || browser.ie && browser.version == 9) { + var spanParent = span.parentNode; + while (!domUtils.isBlockElm(spanParent)) { + if (spanParent.tagName == 'SPAN') { + //opera合并style不会加入";" + span.style.cssText = spanParent.style.cssText + ";" + span.style.cssText; + } + spanParent = spanParent.parentNode; + } + } + + + if (opera) { + setTimeout(function () { + range.setStart(span, 0).collapse(true); + mergesibling(range, cmdName,value); + range.select(); + }); + } else { + range.setStart(span, 0).collapse(true); + mergesibling(range,cmdName,value); + range.select(); + } + + //trace:981 + //domUtils.mergeToParent(span) + } + domUtils.remove(text); + } + + + } + return true; + }, + queryCommandValue: function (cmdName) { + var startNode = this.selection.getStart(); + + //trace:946 + if (cmdName == 'underline' || cmdName == 'strikethrough') { + var tmpNode = startNode, value; + while (tmpNode && !domUtils.isBlockElm(tmpNode) && !domUtils.isBody(tmpNode)) { + if (tmpNode.nodeType == 1) { + value = domUtils.getComputedStyle(tmpNode, style); + if (value != 'none') { + return value; + } + } + + tmpNode = tmpNode.parentNode; + } + return 'none'; + } + if (cmdName == 'fontborder') { + var tmp = startNode, val; + while (tmp && dtd.$inline[tmp.tagName]) { + if (val = domUtils.getComputedStyle(tmp, 'border')) { + + if (/1px/.test(val) && /solid/.test(val)) { + return val; + } + } + tmp = tmp.parentNode; + } + return '' + } + + if( cmdName == 'FontSize' ) { + var styleVal = domUtils.getComputedStyle(startNode, style), + tmp = /^([\d\.]+)(\w+)$/.exec( styleVal ); + + if( tmp ) { + + return Math.floor( tmp[1] ) + tmp[2]; + + } + + return styleVal; + + } + + return domUtils.getComputedStyle(startNode, style); + }, + queryCommandState: function (cmdName) { + if (!needCmd[cmdName]) + return 0; + var val = this.queryCommandValue(cmdName); + if (cmdName == 'fontborder') { + return /1px/.test(val) && /solid/.test(val) + } else { + return cmdName == 'underline' ? /underline/.test(val) : /line\-through/.test(val); + + } + + } + }; + })(p, fonts[p]); + } +}; + +// plugins/link.js +/** + * 超链接 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入超链接 + * @command link + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } options 设置自定义属性,例如:url、title、target + * @example + * ```javascript + * editor.execCommand( 'link', '{ + * url:'ueditor.baidu.com', + * title:'ueditor', + * target:'_blank' + * }' ); + * ``` + */ +/** + * 返回当前选中的第一个超链接节点 + * @command link + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { Element } 超链接节点 + * @example + * ```javascript + * editor.queryCommandValue( 'link' ); + * ``` + */ + +/** + * 取消超链接 + * @command unlink + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'unlink'); + * ``` + */ + +UE.plugins['link'] = function(){ + function optimize( range ) { + var start = range.startContainer,end = range.endContainer; + + if ( start = domUtils.findParentByTagName( start, 'a', true ) ) { + range.setStartBefore( start ); + } + if ( end = domUtils.findParentByTagName( end, 'a', true ) ) { + range.setEndAfter( end ); + } + } + + + UE.commands['unlink'] = { + execCommand : function() { + var range = this.selection.getRange(), + bookmark; + if(range.collapsed && !domUtils.findParentByTagName( range.startContainer, 'a', true )){ + return; + } + bookmark = range.createBookmark(); + optimize( range ); + range.removeInlineStyle( 'a' ).moveToBookmark( bookmark ).select(); + }, + queryCommandState : function(){ + return !this.highlight && this.queryCommandValue('link') ? 0 : -1; + } + + }; + function doLink(range,opt,me){ + var rngClone = range.cloneRange(), + link = me.queryCommandValue('link'); + optimize( range = range.adjustmentBoundary() ); + var start = range.startContainer; + if(start.nodeType == 1 && link){ + start = start.childNodes[range.startOffset]; + if(start && start.nodeType == 1 && start.tagName == 'A' && /^(?:https?|ftp|file)\s*:\s*\/\//.test(start[browser.ie?'innerText':'textContent'])){ + start[browser.ie ? 'innerText' : 'textContent'] = utils.html(opt.textValue||opt.href); + + } + } + if( !rngClone.collapsed || link){ + range.removeInlineStyle( 'a' ); + rngClone = range.cloneRange(); + } + + if ( rngClone.collapsed ) { + var a = range.document.createElement( 'a'), + text = ''; + if(opt.textValue){ + + text = utils.html(opt.textValue); + delete opt.textValue; + }else{ + text = utils.html(opt.href); + + } + domUtils.setAttributes( a, opt ); + start = domUtils.findParentByTagName( rngClone.startContainer, 'a', true ); + if(start && domUtils.isInNodeEndBoundary(rngClone,start)){ + range.setStartAfter(start).collapse(true); + + } + a[browser.ie ? 'innerText' : 'textContent'] = text; + range.insertNode(a).selectNode( a ); + } else { + range.applyInlineStyle( 'a', opt ); + + } + } + UE.commands['link'] = { + execCommand : function( cmdName, opt ) { + var range; + opt._href && (opt._href = utils.unhtml(opt._href,/[<">]/g)); + opt.href && (opt.href = utils.unhtml(opt.href,/[<">]/g)); + opt.textValue && (opt.textValue = utils.unhtml(opt.textValue,/[<">]/g)); + doLink(range=this.selection.getRange(),opt,this); + //闭合都不加占位符,如果加了会在a后边多个占位符节点,导致a是图片背景组成的列表,出现空白问题 + range.collapse().select(true); + + }, + queryCommandValue : function() { + var range = this.selection.getRange(), + node; + if ( range.collapsed ) { +// node = this.selection.getStart(); + //在ie下getstart()取值偏上了 + node = range.startContainer; + node = node.nodeType == 1 ? node : node.parentNode; + + if ( node && (node = domUtils.findParentByTagName( node, 'a', true )) && ! domUtils.isInNodeEndBoundary(range,node)) { + + return node; + } + } else { + //trace:1111 如果是

            xx

            startContainer是p就会找不到a + range.shrinkBoundary(); + var start = range.startContainer.nodeType == 3 || !range.startContainer.childNodes[range.startOffset] ? range.startContainer : range.startContainer.childNodes[range.startOffset], + end = range.endContainer.nodeType == 3 || range.endOffset == 0 ? range.endContainer : range.endContainer.childNodes[range.endOffset-1], + common = range.getCommonAncestor(); + node = domUtils.findParentByTagName( common, 'a', true ); + if ( !node && common.nodeType == 1){ + + var as = common.getElementsByTagName( 'a' ), + ps,pe; + + for ( var i = 0,ci; ci = as[i++]; ) { + ps = domUtils.getPosition( ci, start ),pe = domUtils.getPosition( ci,end); + if ( (ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) + && + (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) + ) { + node = ci; + break; + } + } + } + return node; + } + + }, + queryCommandState : function() { + //判断如果是视频的话连接不可用 + //fix 853 + var img = this.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-video" || img.className.indexOf("edui-upload-video")!=-1); + return flag ? -1 : 0; + } + }; +}; + +// plugins/iframe.js +///import core +///import plugins\inserthtml.js +///commands 插入框架 +///commandsName InsertFrame +///commandsTitle 插入Iframe +///commandsDialog dialogs\insertframe + +UE.plugins['insertframe'] = function() { + var me =this; + function deleteIframe(){ + me._iframe && delete me._iframe; + } + + me.addListener("selectionchange",function(){ + deleteIframe(); + }); + +}; + + + +// plugins/scrawl.js +///import core +///commands 涂鸦 +///commandsName Scrawl +///commandsTitle 涂鸦 +///commandsDialog dialogs\scrawl +UE.commands['scrawl'] = { + queryCommandState : function(){ + return ( browser.ie && browser.version <= 8 ) ? -1 :0; + } +}; + + +// plugins/removeformat.js +/** + * 清除格式 + * @file + * @since 1.2.6.1 + */ + +/** + * 清除文字样式 + * @command removeformat + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} tags 以逗号隔开的标签。如:strong + * @param {String} style 样式如:color + * @param {String} attrs 属性如:width + * @example + * ```javascript + * editor.execCommand( 'removeformat', 'strong','color','width' ); + * ``` + */ + +UE.plugins['removeformat'] = function(){ + var me = this; + me.setOpt({ + 'removeFormatTags': 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var', + 'removeFormatAttributes':'class,style,lang,width,height,align,hspace,valign' + }); + me.commands['removeformat'] = { + execCommand : function( cmdName, tags, style, attrs,notIncludeA ) { + + var tagReg = new RegExp( '^(?:' + (tags || this.options.removeFormatTags).replace( /,/g, '|' ) + ')$', 'i' ) , + removeFormatAttributes = style ? [] : (attrs || this.options.removeFormatAttributes).split( ',' ), + range = new dom.Range( this.document ), + bookmark,node,parent, + filter = function( node ) { + return node.nodeType == 1; + }; + + function isRedundantSpan (node) { + if (node.nodeType == 3 || node.tagName.toLowerCase() != 'span'){ + return 0; + } + if (browser.ie) { + //ie 下判断实效,所以只能简单用style来判断 + //return node.style.cssText == '' ? 1 : 0; + var attrs = node.attributes; + if ( attrs.length ) { + for ( var i = 0,l = attrs.length; i + var node = range.startContainer, + tmp, + collapsed = range.collapsed; + while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ + tmp = node.parentNode; + range.setStartBefore(node); + //trace:937 + //更新结束边界 + if(range.startContainer === range.endContainer){ + range.endOffset--; + } + domUtils.remove(node); + node = tmp; + } + + if(!collapsed){ + node = range.endContainer; + while(node.nodeType == 1 && domUtils.isEmptyNode(node) && dtd.$removeEmpty[node.tagName]){ + tmp = node.parentNode; + range.setEndBefore(node); + domUtils.remove(node); + + node = tmp; + } + + + } + } + + + + range = this.selection.getRange(); + doRemove( range ); + range.select(); + + } + + }; + +}; + + +// plugins/blockquote.js +/** + * 添加引用 + * @file + * @since 1.2.6.1 + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'blockquote' ); + * ``` + */ + +/** + * 添加引用 + * @command blockquote + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } attrs 节点属性 + * @example + * ```javascript + * editor.execCommand( 'blockquote',{ + * style: "color: red;" + * } ); + * ``` + */ + + +UE.plugins['blockquote'] = function(){ + var me = this; + function getObj(editor){ + return domUtils.filterNodeList(editor.selection.getStartElementPath(),'blockquote'); + } + me.commands['blockquote'] = { + execCommand : function( cmdName, attrs ) { + var range = this.selection.getRange(), + obj = getObj(this), + blockquote = dtd.blockquote, + bookmark = range.createBookmark(); + + if ( obj ) { + + var start = range.startContainer, + startBlock = domUtils.isBlockElm(start) ? start : domUtils.findParent(start,function(node){return domUtils.isBlockElm(node)}), + + end = range.endContainer, + endBlock = domUtils.isBlockElm(end) ? end : domUtils.findParent(end,function(node){return domUtils.isBlockElm(node)}); + + //处理一下li + startBlock = domUtils.findParentByTagName(startBlock,'li',true) || startBlock; + endBlock = domUtils.findParentByTagName(endBlock,'li',true) || endBlock; + + + if(startBlock.tagName == 'LI' || startBlock.tagName == 'TD' || startBlock === obj || domUtils.isBody(startBlock)){ + domUtils.remove(obj,true); + }else{ + domUtils.breakParent(startBlock,obj); + } + + if(startBlock !== endBlock){ + obj = domUtils.findParentByTagName(endBlock,'blockquote'); + if(obj){ + if(endBlock.tagName == 'LI' || endBlock.tagName == 'TD'|| domUtils.isBody(endBlock)){ + obj.parentNode && domUtils.remove(obj,true); + }else{ + domUtils.breakParent(endBlock,obj); + } + + } + } + + var blockquotes = domUtils.getElementsByTagName(this.document,'blockquote'); + for(var i=0,bi;bi=blockquotes[i++];){ + if(!bi.childNodes.length){ + domUtils.remove(bi); + }else if(domUtils.getPosition(bi,startBlock)&domUtils.POSITION_FOLLOWING && domUtils.getPosition(bi,endBlock)&domUtils.POSITION_PRECEDING){ + domUtils.remove(bi,true); + } + } + + + + + } else { + + var tmpRange = range.cloneRange(), + node = tmpRange.startContainer.nodeType == 1 ? tmpRange.startContainer : tmpRange.startContainer.parentNode, + preNode = node, + doEnd = 1; + + //调整开始 + while ( 1 ) { + if ( domUtils.isBody(node) ) { + if ( preNode !== node ) { + if ( range.collapsed ) { + tmpRange.selectNode( preNode ); + doEnd = 0; + } else { + tmpRange.setStartBefore( preNode ); + } + }else{ + tmpRange.setStart(node,0); + } + + break; + } + if ( !blockquote[node.tagName] ) { + if ( range.collapsed ) { + tmpRange.selectNode( preNode ); + } else{ + tmpRange.setStartBefore( preNode); + } + break; + } + + preNode = node; + node = node.parentNode; + } + + //调整结束 + if ( doEnd ) { + preNode = node = node = tmpRange.endContainer.nodeType == 1 ? tmpRange.endContainer : tmpRange.endContainer.parentNode; + while ( 1 ) { + + if ( domUtils.isBody( node ) ) { + if ( preNode !== node ) { + + tmpRange.setEndAfter( preNode ); + + } else { + tmpRange.setEnd( node, node.childNodes.length ); + } + + break; + } + if ( !blockquote[node.tagName] ) { + tmpRange.setEndAfter( preNode ); + break; + } + + preNode = node; + node = node.parentNode; + } + + } + + + node = range.document.createElement( 'blockquote' ); + domUtils.setAttributes( node, attrs ); + node.appendChild( tmpRange.extractContents() ); + tmpRange.insertNode( node ); + //去除重复的 + var childs = domUtils.getElementsByTagName(node,'blockquote'); + for(var i=0,ci;ci=childs[i++];){ + if(ci.parentNode){ + domUtils.remove(ci,true); + } + } + + } + range.moveToBookmark( bookmark ).select(); + }, + queryCommandState : function() { + return getObj(this) ? 1 : 0; + } + }; +}; + + + +// plugins/convertcase.js +/** + * 大小写转换 + * @file + * @since 1.2.6.1 + */ + +/** + * 把选区内文本变大写,与“tolowercase”命令互斥 + * @command touppercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'touppercase' ); + * ``` + */ + +/** + * 把选区内文本变小写,与“touppercase”命令互斥 + * @command tolowercase + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'tolowercase' ); + * ``` + */ +UE.commands['touppercase'] = +UE.commands['tolowercase'] = { + execCommand:function (cmd) { + var me = this; + var rng = me.selection.getRange(); + if(rng.collapsed){ + return rng; + } + var bk = rng.createBookmark(), + bkEnd = bk.end, + filterFn = function( node ) { + return !domUtils.isBr(node) && !domUtils.isWhitespace( node ); + }, + curNode = domUtils.getNextDomNode( bk.start, false, filterFn ); + while ( curNode && (domUtils.getPosition( curNode, bkEnd ) & domUtils.POSITION_PRECEDING) ) { + + if ( curNode.nodeType == 3 ) { + curNode.nodeValue = curNode.nodeValue[cmd == 'touppercase' ? 'toUpperCase' : 'toLowerCase'](); + } + curNode = domUtils.getNextDomNode( curNode, true, filterFn ); + if(curNode === bkEnd){ + break; + } + + } + rng.moveToBookmark(bk).select(); + } +}; + + + +// plugins/indent.js +/** + * 首行缩进 + * @file + * @since 1.2.6.1 + */ + +/** + * 缩进 + * @command indent + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'indent' ); + * ``` + */ +UE.commands['indent'] = { + execCommand : function() { + var me = this,value = me.queryCommandState("indent") ? "0em" : (me.options.indentValue || '2em'); + me.execCommand('Paragraph','p',{style:'text-indent:'+ value}); + }, + queryCommandState : function() { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6'); + return pN && pN.style.textIndent && parseInt(pN.style.textIndent) ? 1 : 0; + } + +}; + + +// plugins/print.js +/** + * 打印 + * @file + * @since 1.2.6.1 + */ + +/** + * 打印 + * @command print + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'print' ); + * ``` + */ +UE.commands['print'] = { + execCommand : function(){ + this.window.print(); + }, + notNeedUndo : 1 +}; + + + +// plugins/preview.js +/** + * 预览 + * @file + * @since 1.2.6.1 + */ + +/** + * 预览 + * @command preview + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'preview' ); + * ``` + */ +UE.commands['preview'] = { + execCommand : function(){ + var w = window.open('', '_blank', ''), + d = w.document; + d.open(); + d.write('
            '+this.getContent(null,null,true)+'
            '); + d.close(); + }, + notNeedUndo : 1 +}; + + +// plugins/selectall.js +/** + * 全选 + * @file + * @since 1.2.6.1 + */ + +/** + * 选中所有内容 + * @command selectall + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'selectall' ); + * ``` + */ +UE.plugins['selectall'] = function(){ + var me = this; + me.commands['selectall'] = { + execCommand : function(){ + //去掉了原生的selectAll,因为会出现报错和当内容为空时,不能出现闭合状态的光标 + var me = this,body = me.body, + range = me.selection.getRange(); + range.selectNodeContents(body); + if(domUtils.isEmptyBlock(body)){ + //opera不能自动合并到元素的里边,要手动处理一下 + if(browser.opera && body.firstChild && body.firstChild.nodeType == 1){ + range.setStartAtFirst(body.firstChild); + } + range.collapse(true); + } + range.select(true); + }, + notNeedUndo : 1 + }; + + + //快捷键 + me.addshortcutkey({ + "selectAll" : "ctrl+65" + }); +}; + + +// plugins/paragraph.js +/** + * 段落样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 段落格式 + * @command paragraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @param {String} style 标签值为:'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' + * @param {Object} attrs 标签的属性 + * @example + * ```javascript + * editor.execCommand( 'Paragraph','h1','{ + * class:'test' + * }' ); + * ``` + */ + +/** + * 返回选区内节点标签名 + * @command paragraph + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 节点标签名 + * @example + * ```javascript + * editor.queryCommandValue( 'Paragraph' ); + * ``` + */ + +UE.plugins['paragraph'] = function() { + var me = this, + block = domUtils.isBlockElm, + notExchange = ['TD','LI','PRE'], + + doParagraph = function(range,style,attrs,sourceCmdName){ + var bookmark = range.createBookmark(), + filterFn = function( node ) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' && !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace( node ); + }, + para; + + range.enlarge( true ); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ), + tmpRange = range.cloneRange(), + tmpNode; + while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) { + if ( current.nodeType == 3 || !block( current ) ) { + tmpRange.setStartBefore( current ); + while ( current && current !== bookmark2.end && !block( current ) ) { + tmpNode = current; + current = domUtils.getNextDomNode( current, false, null, function( node ) { + return !block( node ); + } ); + } + tmpRange.setEndAfter( tmpNode ); + + para = range.document.createElement( style ); + if(attrs){ + domUtils.setAttributes(para,attrs); + if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){ + para.style.cssText = attrs.style; + } + } + para.appendChild( tmpRange.extractContents() ); + //需要内容占位 + if(domUtils.isEmptyNode(para)){ + domUtils.fillChar(range.document,para); + + } + + tmpRange.insertNode( para ); + + var parent = para.parentNode; + //如果para上一级是一个block元素且不是body,td就删除它 + if ( block( parent ) && !domUtils.isBody( para.parentNode ) && utils.indexOf(notExchange,parent.tagName)==-1) { + //存储dir,style + if(!(sourceCmdName && sourceCmdName == 'customstyle')){ + parent.getAttribute('dir') && para.setAttribute('dir',parent.getAttribute('dir')); + //trace:1070 + parent.style.cssText && (para.style.cssText = parent.style.cssText + ';' + para.style.cssText); + //trace:1030 + parent.style.textAlign && !para.style.textAlign && (para.style.textAlign = parent.style.textAlign); + parent.style.textIndent && !para.style.textIndent && (para.style.textIndent = parent.style.textIndent); + parent.style.padding && !para.style.padding && (para.style.padding = parent.style.padding); + } + + //trace:1706 选择的就是h1-6要删除 + if(attrs && /h\d/i.test(parent.tagName) && !/h\d/i.test(para.tagName) ){ + domUtils.setAttributes(parent,attrs); + if(sourceCmdName && sourceCmdName == 'customstyle' && attrs.style){ + parent.style.cssText = attrs.style; + } + domUtils.remove(para,true); + para = parent; + }else{ + domUtils.remove( para.parentNode, true ); + } + + } + if( utils.indexOf(notExchange,parent.tagName)!=-1){ + current = parent; + }else{ + current = para; + } + + + current = domUtils.getNextDomNode( current, false, filterFn ); + } else { + current = domUtils.getNextDomNode( current, true, filterFn ); + } + } + return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark ); + }; + me.setOpt('paragraph',{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''}); + me.commands['paragraph'] = { + execCommand : function( cmdName, style,attrs,sourceCmdName ) { + var range = this.selection.getRange(); + //闭合时单独处理 + if(range.collapsed){ + var txt = this.document.createTextNode('p'); + range.insertNode(txt); + //去掉冗余的fillchar + if(browser.ie){ + var node = txt.previousSibling; + if(node && domUtils.isWhitespace(node)){ + domUtils.remove(node); + } + node = txt.nextSibling; + if(node && domUtils.isWhitespace(node)){ + domUtils.remove(node); + } + } + + } + range = doParagraph(range,style,attrs,sourceCmdName); + if(txt){ + range.setStartBefore(txt).collapse(true); + pN = txt.parentNode; + + domUtils.remove(txt); + + if(domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)){ + domUtils.fillNode(this.document,pN); + } + + } + + if(browser.gecko && range.collapsed && range.startContainer.nodeType == 1){ + var child = range.startContainer.childNodes[range.startOffset]; + if(child && child.nodeType == 1 && child.tagName.toLowerCase() == style){ + range.setStart(child,0).collapse(true); + } + } + //trace:1097 原来有true,原因忘了,但去了就不能清除多余的占位符了 + range.select(); + + + return true; + }, + queryCommandValue : function() { + var node = domUtils.filterNodeList(this.selection.getStartElementPath(),'p h1 h2 h3 h4 h5 h6'); + return node ? node.tagName.toLowerCase() : ''; + } + }; +}; + + +// plugins/directionality.js +/** + * 设置文字输入的方向的插件 + * @file + * @since 1.2.6.1 + */ +(function() { + var block = domUtils.isBlockElm , + getObj = function(editor){ +// var startNode = editor.selection.getStart(), +// parents; +// if ( startNode ) { +// //查找所有的是block的父亲节点 +// parents = domUtils.findParents( startNode, true, block, true ); +// for ( var i = 0,ci; ci = parents[i++]; ) { +// if ( ci.getAttribute( 'dir' ) ) { +// return ci; +// } +// } +// } + return domUtils.filterNodeList(editor.selection.getStartElementPath(),function(n){return n && n.nodeType == 1 && n.getAttribute('dir')}); + + }, + doDirectionality = function(range,editor,forward){ + + var bookmark, + filterFn = function( node ) { + return node.nodeType == 1 ? !domUtils.isBookmarkNode(node) : !domUtils.isWhitespace(node); + }, + + obj = getObj( editor ); + + if ( obj && range.collapsed ) { + obj.setAttribute( 'dir', forward ); + return range; + } + bookmark = range.createBookmark(); + range.enlarge( true ); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode( bookmark2.start, false, filterFn ), + tmpRange = range.cloneRange(), + tmpNode; + while ( current && !(domUtils.getPosition( current, bookmark2.end ) & domUtils.POSITION_FOLLOWING) ) { + if ( current.nodeType == 3 || !block( current ) ) { + tmpRange.setStartBefore( current ); + while ( current && current !== bookmark2.end && !block( current ) ) { + tmpNode = current; + current = domUtils.getNextDomNode( current, false, null, function( node ) { + return !block( node ); + } ); + } + tmpRange.setEndAfter( tmpNode ); + var common = tmpRange.getCommonAncestor(); + if ( !domUtils.isBody( common ) && block( common ) ) { + //遍历到了block节点 + common.setAttribute( 'dir', forward ); + current = common; + } else { + //没有遍历到,添加一个block节点 + var p = range.document.createElement( 'p' ); + p.setAttribute( 'dir', forward ); + var frag = tmpRange.extractContents(); + p.appendChild( frag ); + tmpRange.insertNode( p ); + current = p; + } + + current = domUtils.getNextDomNode( current, false, filterFn ); + } else { + current = domUtils.getNextDomNode( current, true, filterFn ); + } + } + return range.moveToBookmark( bookmark2 ).moveToBookmark( bookmark ); + }; + + /** + * 文字输入方向 + * @command directionality + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } forward 传入'ltr'表示从左向右输入,传入'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.execCommand( 'directionality', 'ltr'); + * ``` + */ + + /** + * 查询当前选区的文字输入方向 + * @command directionality + * @method queryCommandValue + * @param { String } cmdName 命令字符串 + * @return { String } 返回'ltr'表示从左向右输入,返回'rtl'表示从右向左输入 + * @example + * ```javascript + * editor.queryCommandValue( 'directionality'); + * ``` + */ + UE.commands['directionality'] = { + execCommand : function( cmdName,forward ) { + var range = this.selection.getRange(); + //闭合时单独处理 + if(range.collapsed){ + var txt = this.document.createTextNode('d'); + range.insertNode(txt); + } + doDirectionality(range,this,forward); + if(txt){ + range.setStartBefore(txt).collapse(true); + domUtils.remove(txt); + } + + range.select(); + return true; + }, + queryCommandValue : function() { + var node = getObj(this); + return node ? node.getAttribute('dir') : 'ltr'; + } + }; +})(); + + + +// plugins/horizontal.js +/** + * 插入分割线插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入分割线 + * @command horizontal + * @method execCommand + * @param { String } cmdName 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'horizontal' ); + * ``` + */ +UE.plugins['horizontal'] = function(){ + var me = this; + me.commands['horizontal'] = { + execCommand : function( cmdName ) { + var me = this; + if(me.queryCommandState(cmdName)!==-1){ + me.execCommand('insertHtml','
            '); + var range = me.selection.getRange(), + start = range.startContainer; + if(start.nodeType == 1 && !start.childNodes[range.startOffset] ){ + + var tmp; + if(tmp = start.childNodes[range.startOffset - 1]){ + if(tmp.nodeType == 1 && tmp.tagName == 'HR'){ + if(me.options.enterTag == 'p'){ + tmp = me.document.createElement('p'); + range.insertNode(tmp); + range.setStart(tmp,0).setCursor(); + + }else{ + tmp = me.document.createElement('br'); + range.insertNode(tmp); + range.setStartBefore(tmp).setCursor(); + } + } + } + + } + return true; + } + + }, + //边界在table里不能加分隔线 + queryCommandState : function() { + return domUtils.filterNodeList(this.selection.getStartElementPath(),'table') ? -1 : 0; + } + }; +// me.addListener('delkeyup',function(){ +// var rng = this.selection.getRange(); +// if(browser.ie && browser.version > 8){ +// rng.txtToElmBoundary(true); +// if(domUtils.isStartInblock(rng)){ +// var tmpNode = rng.startContainer; +// var pre = tmpNode.previousSibling; +// if(pre && domUtils.isTagNode(pre,'hr')){ +// domUtils.remove(pre); +// rng.select(); +// return; +// } +// } +// } +// if(domUtils.isBody(rng.startContainer)){ +// var hr = rng.startContainer.childNodes[rng.startOffset -1]; +// if(hr && hr.nodeName == 'HR'){ +// var next = hr.nextSibling; +// if(next){ +// rng.setStart(next,0) +// }else if(hr.previousSibling){ +// rng.setStartAtLast(hr.previousSibling) +// }else{ +// var p = this.document.createElement('p'); +// hr.parentNode.insertBefore(p,hr); +// domUtils.fillNode(this.document,p); +// rng.setStart(p,0); +// } +// domUtils.remove(hr); +// rng.setCursor(false,true); +// } +// } +// }) + me.addListener('delkeydown',function(name,evt){ + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + if(domUtils.isStartInblock(rng)){ + var tmpNode = rng.startContainer; + var pre = tmpNode.previousSibling; + if(pre && domUtils.isTagNode(pre,'hr')){ + domUtils.remove(pre); + rng.select(); + domUtils.preventDefault(evt); + return true; + + } + } + + }) +}; + + + +// plugins/time.js +/** + * 插入时间和日期 + * @file + * @since 1.2.6.1 + */ + +/** + * 插入时间,默认格式:12:59:59 + * @command time + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'time'); + * ``` + */ + +/** + * 插入日期,默认格式:2013-08-30 + * @command date + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'date'); + * ``` + */ +UE.commands['time'] = UE.commands["date"] = { + execCommand : function(cmd, format){ + var date = new Date; + + function formatTime(date, format) { + var hh = ('0' + date.getHours()).slice(-2), + ii = ('0' + date.getMinutes()).slice(-2), + ss = ('0' + date.getSeconds()).slice(-2); + format = format || 'hh:ii:ss'; + return format.replace(/hh/ig, hh).replace(/ii/ig, ii).replace(/ss/ig, ss); + } + function formatDate(date, format) { + var yyyy = ('000' + date.getFullYear()).slice(-4), + yy = yyyy.slice(-2), + mm = ('0' + (date.getMonth()+1)).slice(-2), + dd = ('0' + date.getDate()).slice(-2); + format = format || 'yyyy-mm-dd'; + return format.replace(/yyyy/ig, yyyy).replace(/yy/ig, yy).replace(/mm/ig, mm).replace(/dd/ig, dd); + } + + this.execCommand('insertHtml',cmd == "time" ? formatTime(date, format):formatDate(date, format) ); + } +}; + + +// plugins/rowspacing.js +/** + * 段前段后间距插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 设置段间距 + * @command rowspacing + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } value 段间距的值,以px为单位 + * @param { String } dir 间距位置,top或bottom,分别表示段前和段后 + * @example + * ```javascript + * editor.execCommand( 'rowspacing', '10', 'top' ); + * ``` + */ + +UE.plugins['rowspacing'] = function(){ + var me = this; + me.setOpt({ + 'rowspacingtop':['5', '10', '15', '20', '25'], + 'rowspacingbottom':['5', '10', '15', '20', '25'] + + }); + me.commands['rowspacing'] = { + execCommand : function( cmdName,value,dir ) { + this.execCommand('paragraph','p',{style:'margin-'+dir+':'+value + 'px'}); + return true; + }, + queryCommandValue : function(cmdName,dir) { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node) }), + value; + //trace:1026 + if(pN){ + value = domUtils.getComputedStyle(pN,'margin-'+dir).replace(/[^\d]/g,''); + return !value ? 0 : value; + } + return 0; + + } + }; +}; + + + + +// plugins/lineheight.js +/** + * 设置行内间距 + * @file + * @since 1.2.6.1 + */ +UE.plugins['lineheight'] = function(){ + var me = this; + me.setOpt({'lineheight':['1', '1.5','1.75','2', '3', '4', '5']}); + + /** + * 行距 + * @command lineheight + * @method execCommand + * @param { String } cmdName 命令字符串 + * @param { String } value 传入的行高值, 该值是当前字体的倍数, 例如: 1.5, 1.75 + * @example + * ```javascript + * editor.execCommand( 'lineheight', 1.5); + * ``` + */ + /** + * 查询当前选区内容的行高大小 + * @command lineheight + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前行高大小 + * @example + * ```javascript + * editor.queryCommandValue( 'lineheight' ); + * ``` + */ + + me.commands['lineheight'] = { + execCommand : function( cmdName,value ) { + this.execCommand('paragraph','p',{style:'line-height:'+ (value == "1" ? "normal" : value + 'em') }); + return true; + }, + queryCommandValue : function() { + var pN = domUtils.filterNodeList(this.selection.getStartElementPath(),function(node){return domUtils.isBlockElm(node)}); + if(pN){ + var value = domUtils.getComputedStyle(pN,'line-height'); + return value == 'normal' ? 1 : value.replace(/[^\d.]*/ig,""); + } + } + }; +}; + + + + +// plugins/insertcode.js +/** + * 插入代码插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['insertcode'] = function() { + var me = this; + me.ready(function(){ + utils.cssRule('pre','pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}', + me.document) + }); + me.setOpt('insertcode',{ + 'as3':'ActionScript3', + 'bash':'Bash/Shell', + 'cpp':'C/C++', + 'css':'Css', + 'cf':'CodeFunction', + 'c#':'C#', + 'delphi':'Delphi', + 'diff':'Diff', + 'erlang':'Erlang', + 'groovy':'Groovy', + 'html':'Html', + 'java':'Java', + 'jfx':'JavaFx', + 'js':'Javascript', + 'pl':'Perl', + 'php':'Php', + 'plain':'Plain Text', + 'ps':'PowerShell', + 'python':'Python', + 'ruby':'Ruby', + 'scala':'Scala', + 'sql':'Sql', + 'vb':'Vb', + 'xml':'Xml' + }); + + /** + * 插入代码 + * @command insertcode + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } lang 插入代码的语言 + * @example + * ```javascript + * editor.execCommand( 'insertcode', 'javascript' ); + * ``` + */ + + /** + * 如果选区所在位置是插入插入代码区域,返回代码的语言 + * @command insertcode + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回代码的语言 + * @example + * ```javascript + * editor.queryCommandValue( 'insertcode' ); + * ``` + */ + + me.commands['insertcode'] = { + execCommand : function(cmd,lang){ + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + pre.className = 'brush:'+lang+';toolbar:false;'; + }else{ + var code = ''; + if(rng.collapsed){ + code = browser.ie && browser.ie11below ? (browser.version <= 8 ? ' ':''):'
            '; + }else{ + var frag = rng.extractContents(); + var div = me.document.createElement('div'); + div.appendChild(frag); + + utils.each(UE.filterNode(UE.htmlparser(div.innerHTML.replace(/[\r\t]/g,'')),me.options.filterTxtRules).children,function(node){ + if(browser.ie && browser.ie11below && browser.version > 8){ + + if(node.type =='element'){ + if(node.tagName == 'br'){ + code += '\n' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + code += '\n' + }else if(!dtd.$empty[node.tagName]){ + code += cn.innerText(); + } + }else{ + code += cn.data + } + }) + if(!/\n$/.test(code)){ + code += '\n'; + } + } + }else{ + code += node.data + '\n' + } + if(!node.nextSibling() && /\n$/.test(code)){ + code = code.replace(/\n$/,''); + } + }else{ + if(browser.ie && browser.ie11below){ + + if(node.type =='element'){ + if(node.tagName == 'br'){ + code += '
            ' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + code += '
            ' + }else if(!dtd.$empty[node.tagName]){ + code += cn.innerText(); + } + }else{ + code += cn.data + } + }); + if(!/br>$/.test(code)){ + code += '
            '; + } + } + }else{ + code += node.data + '
            ' + } + if(!node.nextSibling() && /
            $/.test(code)){ + code = code.replace(/
            $/,''); + } + + }else{ + code += (node.type == 'element' ? (dtd.$empty[node.tagName] ? '' : node.innerText()) : node.data); + if(!/br\/?\s*>$/.test(code)){ + if(!node.nextSibling()) + return; + code += '
            ' + } + } + + } + + }); + } + me.execCommand('inserthtml','
            '+code+'
            ',true); + + pre = me.document.getElementById('coder'); + domUtils.removeAttributes(pre,'id'); + var tmpNode = pre.previousSibling; + + if(tmpNode && (tmpNode.nodeType == 3 && tmpNode.nodeValue.length == 1 && browser.ie && browser.version == 6 || domUtils.isEmptyBlock(tmpNode))){ + + domUtils.remove(tmpNode) + } + var rng = me.selection.getRange(); + if(domUtils.isEmptyBlock(pre)){ + rng.setStart(pre,0).setCursor(false,true) + }else{ + rng.selectNodeContents(pre).select() + } + } + + + + }, + queryCommandValue : function(){ + var path = this.selection.getStartElementPath(); + var lang = ''; + utils.each(path,function(node){ + if(node.nodeName =='PRE'){ + var match = node.className.match(/brush:([^;]+)/); + lang = match && match[1] ? match[1] : ''; + return false; + } + }); + return lang; + } + }; + + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('pre'),function(pre){ + var brs = pre.getNodesByTagName('br'); + if(brs.length){ + browser.ie && browser.ie11below && browser.version > 8 && utils.each(brs,function(br){ + var txt = UE.uNode.createText('\n'); + br.parentNode.insertBefore(txt,br); + br.parentNode.removeChild(br); + }); + return; + } + if(browser.ie && browser.ie11below && browser.version > 8) + return; + var code = pre.innerText().split(/\n/); + pre.innerHTML(''); + utils.each(code,function(c){ + if(c.length){ + pre.appendChild(UE.uNode.createText(c)); + } + pre.appendChild(UE.uNode.createElement('br')) + }) + }) + }); + me.addOutputRule(function(root){ + utils.each(root.getNodesByTagName('pre'),function(pre){ + var code = ''; + utils.each(pre.children,function(n){ + if(n.type == 'text'){ + //在ie下文本内容有可能末尾带有\n要去掉 + //trace:3396 + code += n.data.replace(/[ ]/g,' ').replace(/\n$/,''); + }else{ + if(n.tagName == 'br'){ + code += '\n' + }else{ + code += (!dtd.$empty[n.tagName] ? '' : n.innerText()); + } + + } + + }); + + pre.innerText(code.replace(/( |\n)+$/,'')) + }) + }); + //不需要判断highlight的command列表 + me.notNeedCodeQuery ={ + help:1, + undo:1, + redo:1, + source:1, + print:1, + searchreplace:1, + fullscreen:1, + preview:1, + insertparagraph:1, + elementpath:1, + insertcode:1, + inserthtml:1, + selectall:1 + }; + //将queyCommamndState重置 + var orgQuery = me.queryCommandState; + me.queryCommandState = function(cmd){ + var me = this; + + if(!me.notNeedCodeQuery[cmd.toLowerCase()] && me.selection && me.queryCommandValue('insertcode')){ + return -1; + } + return UE.Editor.prototype.queryCommandState.apply(this,arguments) + }; + me.addListener('beforeenterkeydown',function(){ + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + me.fireEvent('saveScene'); + if(!rng.collapsed){ + rng.deleteContents(); + } + if(!browser.ie || browser.ie9above){ + var tmpNode = me.document.createElement('br'),pre; + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true); + var next = tmpNode.nextSibling; + if(!next && (!browser.ie || browser.version > 10)){ + rng.insertNode(tmpNode.cloneNode(false)); + }else{ + rng.setStartAfter(tmpNode); + } + pre = tmpNode.previousSibling; + var tmp; + while(pre ){ + tmp = pre; + pre = pre.previousSibling; + if(!pre || pre.nodeName == 'BR'){ + pre = tmp; + break; + } + } + if(pre){ + var str = ''; + while(pre && pre.nodeName != 'BR' && new RegExp('^[\\s'+domUtils.fillChar+']*$').test(pre.nodeValue)){ + str += pre.nodeValue; + pre = pre.nextSibling; + } + if(pre.nodeName != 'BR'){ + var match = pre.nodeValue.match(new RegExp('^([\\s'+domUtils.fillChar+']+)')); + if(match && match[1]){ + str += match[1] + } + + } + if(str){ + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + } + rng.collapse(true).select(true); + }else{ + if(browser.version > 8){ + + var txt = me.document.createTextNode('\n'); + var start = rng.startContainer; + if(rng.startOffset == 0){ + var preNode = start.previousSibling; + if(preNode){ + rng.insertNode(txt); + var fillchar = me.document.createTextNode(' '); + rng.setStartAfter(txt).insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true) + } + }else{ + rng.insertNode(txt).setStartAfter(txt); + var fillchar = me.document.createTextNode(' '); + start = rng.startContainer.childNodes[rng.startOffset]; + if(start && !/^\n/.test(start.nodeValue)){ + rng.setStartBefore(txt) + } + rng.insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true) + } + + }else{ + var tmpNode = me.document.createElement('br'); + rng.insertNode(tmpNode); + rng.insertNode(me.document.createTextNode(domUtils.fillChar)); + rng.setStartAfter(tmpNode); + pre = tmpNode.previousSibling; + var tmp; + while(pre ){ + tmp = pre; + pre = pre.previousSibling; + if(!pre || pre.nodeName == 'BR'){ + pre = tmp; + break; + } + } + if(pre){ + var str = ''; + while(pre && pre.nodeName != 'BR' && new RegExp('^[ '+domUtils.fillChar+']*$').test(pre.nodeValue)){ + str += pre.nodeValue; + pre = pre.nextSibling; + } + if(pre.nodeName != 'BR'){ + var match = pre.nodeValue.match(new RegExp('^([ '+domUtils.fillChar+']+)')); + if(match && match[1]){ + str += match[1] + } + + } + + str = me.document.createTextNode(str); + rng.insertNode(str).setStartAfter(str); + } + rng.collapse(true).select(); + } + + + } + me.fireEvent('saveScene'); + return true; + } + + + }); + + me.addListener('tabkeydown',function(cmd,evt){ + var rng = me.selection.getRange(); + var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + me.fireEvent('saveScene'); + if(evt.shiftKey){ + + }else{ + if(!rng.collapsed){ + var bk = rng.createBookmark(); + var start = bk.start.previousSibling; + + while(start){ + if(pre.firstChild === start && !domUtils.isBr(start)){ + pre.insertBefore(me.document.createTextNode(' '),start); + + break; + } + if(domUtils.isBr(start)){ + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling); + + break; + } + start = start.previousSibling; + } + var end = bk.end; + start = bk.start.nextSibling; + if(pre.firstChild === bk.start){ + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling) + + } + while(start && start !== end){ + if(domUtils.isBr(start) && start.nextSibling){ + if(start.nextSibling === end){ + break; + } + pre.insertBefore(me.document.createTextNode(' '),start.nextSibling) + } + + start = start.nextSibling; + } + rng.moveToBookmark(bk).select(); + }else{ + var tmpNode = me.document.createTextNode(' '); + rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true).select(true); + } + } + + + me.fireEvent('saveScene'); + return true; + } + + + }); + + + me.addListener('beforeinserthtml',function(evtName,html){ + var me = this, + rng = me.selection.getRange(), + pre = domUtils.findParentByTagName(rng.startContainer,'pre',true); + if(pre){ + if(!rng.collapsed){ + rng.deleteContents() + } + var htmlstr = ''; + if(browser.ie && browser.version > 8){ + + utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){ + if(node.type =='element'){ + if(node.tagName == 'br'){ + htmlstr += '\n' + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + htmlstr += '\n' + }else if(!dtd.$empty[node.tagName]){ + htmlstr += cn.innerText(); + } + }else{ + htmlstr += cn.data + } + }) + if(!/\n$/.test(htmlstr)){ + htmlstr += '\n'; + } + } + }else{ + htmlstr += node.data + '\n' + } + if(!node.nextSibling() && /\n$/.test(htmlstr)){ + htmlstr = htmlstr.replace(/\n$/,''); + } + }); + var tmpNode = me.document.createTextNode(utils.html(htmlstr.replace(/ /g,' '))); + rng.insertNode(tmpNode).selectNode(tmpNode).select(); + }else{ + var frag = me.document.createDocumentFragment(); + + utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){ + if(node.type =='element'){ + if(node.tagName == 'br'){ + frag.appendChild(me.document.createElement('br')) + }else if(!dtd.$empty[node.tagName]){ + utils.each(node.children,function(cn){ + if(cn.type =='element'){ + if(cn.tagName == 'br'){ + + frag.appendChild(me.document.createElement('br')) + }else if(!dtd.$empty[node.tagName]){ + frag.appendChild(me.document.createTextNode(utils.html(cn.innerText().replace(/ /g,' ')))); + + } + }else{ + frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/ /g,' ')))); + + } + }) + if(frag.lastChild.nodeName != 'BR'){ + frag.appendChild(me.document.createElement('br')) + } + } + }else{ + frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/ /g,' ')))); + } + if(!node.nextSibling() && frag.lastChild.nodeName == 'BR'){ + frag.removeChild(frag.lastChild) + } + + + }); + rng.insertNode(frag).select(); + + } + + return true; + } + }); + //方向键的处理 + me.addListener('keydown',function(cmd,evt){ + var me = this,keyCode = evt.keyCode || evt.which; + if(keyCode == 40){ + var rng = me.selection.getRange(),pre,start = rng.startContainer; + if(rng.collapsed && (pre = domUtils.findParentByTagName(rng.startContainer,'pre',true)) && !pre.nextSibling){ + var last = pre.lastChild + while(last && last.nodeName == 'BR'){ + last = last.previousSibling; + } + if(last === start || rng.startContainer === pre && rng.startOffset == pre.childNodes.length){ + me.execCommand('insertparagraph'); + domUtils.preventDefault(evt) + } + + } + } + }); + //trace:3395 + me.addListener('delkeydown',function(type,evt){ + var rng = this.selection.getRange(); + rng.txtToElmBoundary(true); + var start = rng.startContainer; + if(domUtils.isTagNode(start,'pre') && rng.collapsed && domUtils.isStartInblock(rng)){ + var p = me.document.createElement('p'); + domUtils.fillNode(me.document,p); + start.parentNode.insertBefore(p,start); + domUtils.remove(start); + rng.setStart(p,0).setCursor(false,true); + domUtils.preventDefault(evt); + return true; + } + }) +}; + + +// plugins/cleardoc.js +/** + * 清空文档插件 + * @file + * @since 1.2.6.1 + */ + +/** + * 清空文档 + * @command cleardoc + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('cleardoc'); + * ``` + */ + +UE.commands['cleardoc'] = { + execCommand : function( cmdName) { + var me = this, + enterTag = me.options.enterTag, + range = me.selection.getRange(); + if(enterTag == "br"){ + me.body.innerHTML = "
            "; + range.setStart(me.body,0).setCursor(); + }else{ + me.body.innerHTML = "

            "+(ie ? "" : "
            ")+"

            "; + range.setStart(me.body.firstChild,0).setCursor(false,true); + } + setTimeout(function(){ + me.fireEvent("clearDoc"); + },0); + + } +}; + + + +// plugins/anchor.js +/** + * 锚点插件,为UEditor提供插入锚点支持 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('anchor', function (){ + + return { + bindEvents:{ + 'ready':function(){ + utils.cssRule('anchor', + '.anchorclass{background: url(\'' + + this.options.themePath + + this.options.theme +'/images/anchor.gif\') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}', + this.document); + } + }, + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(a){ + var val; + if(val = a.getAttr('anchorname')){ + a.tagName = 'a'; + a.setAttr({ + anchorname : '', + name : val, + 'class' : '' + }) + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('a'),function(a){ + var val; + if((val = a.getAttr('name')) && !a.getAttr('href')){ + a.tagName = 'img'; + a.setAttr({ + anchorname :a.getAttr('name'), + 'class' : 'anchorclass' + }); + a.setAttr('name') + + } + }) + + }, + commands:{ + /** + * 插入锚点 + * @command anchor + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } name 锚点名称字符串 + * @example + * ```javascript + * //editor 是编辑器实例 + * editor.execCommand('anchor', 'anchor1'); + * ``` + */ + 'anchor':{ + execCommand:function (cmd, name) { + var range = this.selection.getRange(),img = range.getClosedNode(); + if (img && img.getAttribute('anchorname')) { + if (name) { + img.setAttribute('anchorname', name); + } else { + range.setStartBefore(img).setCursor(); + domUtils.remove(img); + } + } else { + if (name) { + //只在选区的开始插入 + var anchor = this.document.createElement('img'); + range.collapse(true); + domUtils.setAttributes(anchor,{ + 'anchorname':name, + 'class':'anchorclass' + }); + range.insertNode(anchor).setStartAfter(anchor).setCursor(false,true); + } + } + } + } + } + } +}); + + +// plugins/wordcount.js +///import core +///commands 字数统计 +///commandsName WordCount,wordCount +///commandsTitle 字数统计 +/* + * Created by JetBrains WebStorm. + * User: taoqili + * Date: 11-9-7 + * Time: 下午8:18 + * To change this template use File | Settings | File Templates. + */ + +UE.plugins['wordcount'] = function(){ + var me = this; + me.setOpt('wordCount',true); + me.addListener('contentchange',function(){ + me.fireEvent('wordcount'); + }); + var timer; + me.addListener('ready',function(){ + var me = this; + domUtils.on(me.body,"keyup",function(evt){ + var code = evt.keyCode||evt.which, + //忽略的按键,ctr,alt,shift,方向键 + ignores = {"16":1,"18":1,"20":1,"37":1,"38":1,"39":1,"40":1}; + if(code in ignores) return; + clearTimeout(timer); + timer = setTimeout(function(){ + me.fireEvent('wordcount'); + },200) + }) + }); +}; + + +// plugins/pagebreak.js +/** + * 分页功能插件 + * @file + * @since 1.2.6.1 + */ +UE.plugins['pagebreak'] = function () { + var me = this, + notBreakTags = ['td']; + me.setOpt('pageBreakTag','_ueditor_page_break_tag_'); + + function fillNode(node){ + if(domUtils.isEmptyBlock(node)){ + var firstChild = node.firstChild,tmpNode; + + while(firstChild && firstChild.nodeType == 1 && domUtils.isEmptyBlock(firstChild)){ + tmpNode = firstChild; + firstChild = firstChild.firstChild; + } + !tmpNode && (tmpNode = node); + domUtils.fillNode(me.document,tmpNode); + } + } + //分页符样式添加 + + me.ready(function(){ + utils.cssRule('pagebreak','.pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}',me.document); + }); + function isHr(node){ + return node && node.nodeType == 1 && node.tagName == 'HR' && node.className == 'pagebreak'; + } + me.addInputRule(function(root){ + root.traversal(function(node){ + if(node.type == 'text' && node.data == me.options.pageBreakTag){ + var hr = UE.uNode.createElement('
            '); + node.parentNode.insertBefore(hr,node); + node.parentNode.removeChild(node) + } + }) + }); + me.addOutputRule(function(node){ + utils.each(node.getNodesByTagName('hr'),function(n){ + if(n.getAttr('class') == 'pagebreak'){ + var txt = UE.uNode.createText(me.options.pageBreakTag); + n.parentNode.insertBefore(txt,n); + n.parentNode.removeChild(n); + } + }) + + }); + + /** + * 插入分页符 + * @command pagebreak + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 在表格中插入分页符会把表格切分成两部分 + * @remind 获取编辑器内的数据时, 编辑器会把分页符转换成“_ueditor_page_break_tag_”字符串, + * 以便于提交数据到服务器端后处理分页。 + * @example + * ```javascript + * editor.execCommand( 'pagebreak'); //插入一个hr标签,带有样式类名pagebreak + * ``` + */ + + me.commands['pagebreak'] = { + execCommand:function () { + var range = me.selection.getRange(),hr = me.document.createElement('hr'); + domUtils.setAttributes(hr,{ + 'class' : 'pagebreak', + noshade:"noshade", + size:"5" + }); + domUtils.unSelectable(hr); + //table单独处理 + var node = domUtils.findParentByTagName(range.startContainer, notBreakTags, true), + + parents = [], pN; + if (node) { + switch (node.tagName) { + case 'TD': + pN = node.parentNode; + if (!pN.previousSibling) { + var table = domUtils.findParentByTagName(pN, 'table'); +// var tableWrapDiv = table.parentNode; +// if(tableWrapDiv && tableWrapDiv.nodeType == 1 +// && tableWrapDiv.tagName == 'DIV' +// && tableWrapDiv.getAttribute('dropdrag') +// ){ +// domUtils.remove(tableWrapDiv,true); +// } + table.parentNode.insertBefore(hr, table); + parents = domUtils.findParents(hr, true); + + } else { + pN.parentNode.insertBefore(hr, pN); + parents = domUtils.findParents(hr); + + } + pN = parents[1]; + if (hr !== pN) { + domUtils.breakParent(hr, pN); + + } + //table要重写绑定一下拖拽 + me.fireEvent('afteradjusttable',me.document); + } + + } else { + + if (!range.collapsed) { + range.deleteContents(); + var start = range.startContainer; + while ( !domUtils.isBody(start) && domUtils.isBlockElm(start) && domUtils.isEmptyNode(start)) { + range.setStartBefore(start).collapse(true); + domUtils.remove(start); + start = range.startContainer; + } + + } + range.insertNode(hr); + + var pN = hr.parentNode, nextNode; + while (!domUtils.isBody(pN)) { + domUtils.breakParent(hr, pN); + nextNode = hr.nextSibling; + if (nextNode && domUtils.isEmptyBlock(nextNode)) { + domUtils.remove(nextNode); + } + pN = hr.parentNode; + } + nextNode = hr.nextSibling; + var pre = hr.previousSibling; + if(isHr(pre)){ + domUtils.remove(pre); + }else{ + pre && fillNode(pre); + } + + if(!nextNode){ + var p = me.document.createElement('p'); + + hr.parentNode.appendChild(p); + domUtils.fillNode(me.document,p); + range.setStart(p,0).collapse(true); + }else{ + if(isHr(nextNode)){ + domUtils.remove(nextNode); + }else{ + fillNode(nextNode); + } + range.setEndAfter(hr).collapse(false); + } + + range.select(true); + + } + + } + }; +}; + +// plugins/wordimage.js +///import core +///commands 本地图片引导上传 +///commandsName WordImage +///commandsTitle 本地图片引导上传 +///commandsDialog dialogs\wordimage + +UE.plugin.register('wordimage',function(){ + var me = this, + images = []; + return { + commands : { + 'wordimage':{ + execCommand:function () { + var images = domUtils.getElementsByTagName(me.body, "img"); + var urlList = []; + for (var i = 0, ci; ci = images[i++];) { + var url = ci.getAttribute("word_img"); + url && urlList.push(url); + } + return urlList; + }, + queryCommandState:function () { + images = domUtils.getElementsByTagName(me.body, "img"); + for (var i = 0, ci; ci = images[i++];) { + if (ci.getAttribute("word_img")) { + return 1; + } + } + return -1; + }, + notNeedUndo:true + } + }, + inputRule : function (root) { + utils.each(root.getNodesByTagName('img'), function (img) { + var attrs = img.attrs, + flag = parseInt(attrs.width) < 128 || parseInt(attrs.height) < 43, + opt = me.options, + src = opt.UEDITOR_HOME_URL + 'themes/default/images/spacer.gif'; + if (attrs['src'] && /^(?:(file:\/+))/.test(attrs['src'])) { + img.setAttr({ + width:attrs.width, + height:attrs.height, + alt:attrs.alt, + word_img: attrs.src, + src:src, + 'style':'background:url(' + ( flag ? opt.themePath + opt.theme + '/images/word.gif' : opt.langPath + opt.lang + '/images/localimage.png') + ') no-repeat center center;border:1px solid #ddd' + }) + } + }) + } + } +}); + +// plugins/dragdrop.js +UE.plugins['dragdrop'] = function (){ + + var me = this; + me.ready(function(){ + domUtils.on(this.body,'dragend',function(){ + var rng = me.selection.getRange(); + var node = rng.getClosedNode()||me.selection.getStart(); + + if(node && node.tagName == 'IMG'){ + + var pre = node.previousSibling,next; + while(next = node.nextSibling){ + if(next.nodeType == 1 && next.tagName == 'SPAN' && !next.firstChild){ + domUtils.remove(next) + }else{ + break; + } + } + + + if((pre && pre.nodeType == 1 && !domUtils.isEmptyBlock(pre) || !pre) && (!next || next && !domUtils.isEmptyBlock(next))){ + if(pre && pre.tagName == 'P' && !domUtils.isEmptyBlock(pre)){ + pre.appendChild(node); + domUtils.moveChild(next,pre); + domUtils.remove(next); + }else if(next && next.tagName == 'P' && !domUtils.isEmptyBlock(next)){ + next.insertBefore(node,next.firstChild); + } + + if(pre && pre.tagName == 'P' && domUtils.isEmptyBlock(pre)){ + domUtils.remove(pre) + } + if(next && next.tagName == 'P' && domUtils.isEmptyBlock(next)){ + domUtils.remove(next) + } + rng.selectNode(node).select(); + me.fireEvent('saveScene'); + + } + + } + + }) + }); + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var rng = me.selection.getRange(),node; + if(node = domUtils.findParentByTagName(rng.startContainer,'p',true)){ + if(domUtils.getComputedStyle(node,'text-align') == 'center'){ + domUtils.removeStyle(node,'text-align') + } + } + } + }) +}; + + +// plugins/undo.js +/** + * undo redo + * @file + * @since 1.2.6.1 + */ + +/** + * 撤销上一次执行的命令 + * @command undo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'undo' ); + * ``` + */ + +/** + * 重做上一次执行的命令 + * @command redo + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'redo' ); + * ``` + */ + +UE.plugins['undo'] = function () { + var saveSceneTimer; + var me = this, + maxUndoCount = me.options.maxUndoCount || 20, + maxInputCount = me.options.maxInputCount || 20, + fillchar = new RegExp(domUtils.fillChar + '|<\/hr>', 'gi');// ie会产生多余的 + var noNeedFillCharTags = { + ol:1,ul:1,table:1,tbody:1,tr:1,body:1 + }; + var orgState = me.options.autoClearEmptyNode; + function compareAddr(indexA, indexB) { + if (indexA.length != indexB.length) + return 0; + for (var i = 0, l = indexA.length; i < l; i++) { + if (indexA[i] != indexB[i]) + return 0 + } + return 1; + } + + function compareRangeAddress(rngAddrA, rngAddrB) { + if (rngAddrA.collapsed != rngAddrB.collapsed) { + return 0; + } + if (!compareAddr(rngAddrA.startAddress, rngAddrB.startAddress) || !compareAddr(rngAddrA.endAddress, rngAddrB.endAddress)) { + return 0; + } + return 1; + } + + function UndoManager() { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.undo = function () { + if (this.hasUndo) { + if (!this.list[this.index - 1] && this.list.length == 1) { + this.reset(); + return; + } + while (this.list[this.index].content == this.list[this.index - 1].content) { + this.index--; + if (this.index == 0) { + return this.restore(0); + } + } + this.restore(--this.index); + } + }; + this.redo = function () { + if (this.hasRedo) { + while (this.list[this.index].content == this.list[this.index + 1].content) { + this.index++; + if (this.index == this.list.length - 1) { + return this.restore(this.index); + } + } + this.restore(++this.index); + } + }; + + this.restore = function () { + var me = this.editor; + var scene = this.list[this.index]; + var root = UE.htmlparser(scene.content.replace(fillchar, '')); + me.options.autoClearEmptyNode = false; + me.filterInputRule(root); + me.options.autoClearEmptyNode = orgState; + //trace:873 + //去掉展位符 + me.document.body.innerHTML = root.toHtml(); + me.fireEvent('afterscencerestore'); + //处理undo后空格不展位的问题 + if (browser.ie) { + utils.each(domUtils.getElementsByTagName(me.document,'td th caption p'),function(node){ + if(domUtils.isEmptyNode(node)){ + domUtils.fillNode(me.document, node); + } + }) + } + + try{ + var rng = new dom.Range(me.document).moveToAddress(scene.address); + rng.select(noNeedFillCharTags[rng.startContainer.nodeName.toLowerCase()]); + }catch(e){} + + this.update(); + this.clearKey(); + //不能把自己reset了 + me.fireEvent('reset', true); + }; + + this.getScene = function () { + var me = this.editor; + var rng = me.selection.getRange(), + rngAddress = rng.createAddress(false,true); + me.fireEvent('beforegetscene'); + var root = UE.htmlparser(me.body.innerHTML); + me.options.autoClearEmptyNode = false; + me.filterOutputRule(root); + me.options.autoClearEmptyNode = orgState; + var cont = root.toHtml(); + //trace:3461 + //这个会引起回退时导致空格丢失的情况 +// browser.ie && (cont = cont.replace(/> <').replace(/\s*\s*/g, '>')); + me.fireEvent('aftergetscene'); + + return { + address:rngAddress, + content:cont + } + }; + this.save = function (notCompareRange,notSetCursor) { + clearTimeout(saveSceneTimer); + var currentScene = this.getScene(notSetCursor), + lastScene = this.list[this.index]; + + if(lastScene && lastScene.content != currentScene.content){ + me.trigger('contentchange') + } + //内容相同位置相同不存 + if (lastScene && lastScene.content == currentScene.content && + ( notCompareRange ? 1 : compareRangeAddress(lastScene.address, currentScene.address) ) + ) { + return; + } + this.list = this.list.slice(0, this.index + 1); + this.list.push(currentScene); + //如果大于最大数量了,就把最前的剔除 + if (this.list.length > maxUndoCount) { + this.list.shift(); + } + this.index = this.list.length - 1; + this.clearKey(); + //跟新undo/redo状态 + this.update(); + + }; + this.update = function () { + this.hasRedo = !!this.list[this.index + 1]; + this.hasUndo = !!this.list[this.index - 1]; + }; + this.reset = function () { + this.list = []; + this.index = 0; + this.hasUndo = false; + this.hasRedo = false; + this.clearKey(); + }; + this.clearKey = function () { + keycont = 0; + lastKeyCode = null; + }; + } + + me.undoManger = new UndoManager(); + me.undoManger.editor = me; + function saveScene() { + this.undoManger.save(); + } + + me.addListener('saveScene', function () { + var args = Array.prototype.splice.call(arguments,1); + this.undoManger.save.apply(this.undoManger,args); + }); + +// me.addListener('beforeexeccommand', saveScene); +// me.addListener('afterexeccommand', saveScene); + + me.addListener('reset', function (type, exclude) { + if (!exclude) { + this.undoManger.reset(); + } + }); + me.commands['redo'] = me.commands['undo'] = { + execCommand:function (cmdName) { + this.undoManger[cmdName](); + }, + queryCommandState:function (cmdName) { + return this.undoManger['has' + (cmdName.toLowerCase() == 'undo' ? 'Undo' : 'Redo')] ? 0 : -1; + }, + notNeedUndo:1 + }; + + var keys = { + // /*Backspace*/ 8:1, /*Delete*/ 46:1, + /*Shift*/ 16:1, /*Ctrl*/ 17:1, /*Alt*/ 18:1, + 37:1, 38:1, 39:1, 40:1 + + }, + keycont = 0, + lastKeyCode; + //输入法状态下不计算字符数 + var inputType = false; + me.addListener('ready', function () { + domUtils.on(this.body, 'compositionstart', function () { + inputType = true; + }); + domUtils.on(this.body, 'compositionend', function () { + inputType = false; + }) + }); + //快捷键 + me.addshortcutkey({ + "Undo":"ctrl+90", //undo + "Redo":"ctrl+89" //redo + + }); + var isCollapsed = true; + me.addListener('keydown', function (type, evt) { + + var me = this; + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + + if(!me.selection.getRange().collapsed){ + me.undoManger.save(false,true); + isCollapsed = false; + return; + } + if (me.undoManger.list.length == 0) { + me.undoManger.save(true); + } + clearTimeout(saveSceneTimer); + function save(cont){ + cont.undoManger.save(false,true); + cont.fireEvent('selectionchange'); + } + saveSceneTimer = setTimeout(function(){ + if(inputType){ + var interalTimer = setInterval(function(){ + if(!inputType){ + save(me); + clearInterval(interalTimer) + } + },300) + return; + } + save(me); + },200); + + lastKeyCode = keyCode; + keycont++; + if (keycont >= maxInputCount ) { + save(me) + } + } + }); + me.addListener('keyup', function (type, evt) { + var keyCode = evt.keyCode || evt.which; + if (!keys[keyCode] && !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + if (inputType) + return; + if(!isCollapsed){ + this.undoManger.save(false,true); + isCollapsed = true; + } + } + }); + //扩展实例,添加关闭和开启命令undo + me.stopCmdUndo = function(){ + me.__hasEnterExecCommand = true; + }; + me.startCmdUndo = function(){ + me.__hasEnterExecCommand = false; + } +}; + + +// plugins/copy.js +UE.plugin.register('copy', function () { + + var me = this; + + function initZeroClipboard() { + + ZeroClipboard.config({ + debug: false, + swfPath: me.options.UEDITOR_HOME_URL + 'third-party/zeroclipboard/ZeroClipboard.swf' + }); + + var client = me.zeroclipboard = new ZeroClipboard(); + + // 复制内容 + client.on('copy', function (e) { + var client = e.client, + rng = me.selection.getRange(), + div = document.createElement('div'); + + div.appendChild(rng.cloneContents()); + client.setText(div.innerText || div.textContent); + client.setHtml(div.innerHTML); + rng.select(); + }); + // hover事件传递到target + client.on('mouseover mouseout', function (e) { + var target = e.target; + if (e.type == 'mouseover') { + domUtils.addClass(target, 'edui-state-hover'); + } else if (e.type == 'mouseout') { + domUtils.removeClasses(target, 'edui-state-hover'); + } + }); + // flash加载不成功 + client.on('wrongflash noflash', function () { + ZeroClipboard.destroy(); + }); + } + + return { + bindEvents: { + 'ready': function () { + if (!browser.ie) { + if (window.ZeroClipboard) { + initZeroClipboard(); + } else { + utils.loadFile(document, { + src: me.options.UEDITOR_HOME_URL + "third-party/zeroclipboard/ZeroClipboard.js", + tag: "script", + type: "text/javascript", + defer: "defer" + }, function () { + initZeroClipboard(); + }); + } + } + } + }, + commands: { + 'copy': { + execCommand: function (cmd) { + if (!me.document.execCommand('copy')) { + alert(me.getLang('copymsg')); + } + } + } + } + } +}); + + +// plugins/paste.js +///import core +///import plugins/inserthtml.js +///import plugins/undo.js +///import plugins/serialize.js +///commands 粘贴 +///commandsName PastePlain +///commandsTitle 纯文本粘贴模式 +/** + * @description 粘贴 + * @author zhanyi + */ +UE.plugins['paste'] = function () { + function getClipboardData(callback) { + var doc = this.document; + if (doc.getElementById('baidu_pastebin')) { + return; + } + var range = this.selection.getRange(), + bk = range.createBookmark(), + //创建剪贴的容器div + pastebin = doc.createElement('div'); + pastebin.id = 'baidu_pastebin'; + // Safari 要求div必须有内容,才能粘贴内容进来 + browser.webkit && pastebin.appendChild(doc.createTextNode(domUtils.fillChar + domUtils.fillChar)); + doc.body.appendChild(pastebin); + //trace:717 隐藏的span不能得到top + //bk.start.innerHTML = ' '; + bk.start.style.display = ''; + pastebin.style.cssText = "position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" + + //要在现在光标平行的位置加入,否则会出现跳动的问题 + domUtils.getXY(bk.start).y + 'px'; + + range.selectNodeContents(pastebin).select(true); + + setTimeout(function () { + if (browser.webkit) { + for (var i = 0, pastebins = doc.querySelectorAll('#baidu_pastebin'), pi; pi = pastebins[i++];) { + if (domUtils.isEmptyNode(pi)) { + domUtils.remove(pi); + } else { + pastebin = pi; + break; + } + } + } + try { + pastebin.parentNode.removeChild(pastebin); + } catch (e) { + } + range.moveToBookmark(bk).select(true); + callback(pastebin); + }, 0); + } + + var me = this; + + me.setOpt({ + retainOnlyLabelPasted : false + }); + + var txtContent, htmlContent, address; + + function getPureHtml(html){ + return html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function (a, b, tagName, attrs) { + tagName = tagName.toLowerCase(); + if ({img: 1}[tagName]) { + return a; + } + attrs = attrs.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi, function (str, atr, val) { + if ({ + 'src': 1, + 'href': 1, + 'name': 1 + }[atr.toLowerCase()]) { + return atr + '=' + val + ' ' + } + return '' + }); + if ({ + 'span': 1, + 'div': 1 + }[tagName]) { + return '' + } else { + + return '<' + b + tagName + ' ' + utils.trim(attrs) + '>' + } + + }); + } + function filter(div) { + var html; + if (div.firstChild) { + //去掉cut中添加的边界值 + var nodes = domUtils.getElementsByTagName(div, 'span'); + for (var i = 0, ni; ni = nodes[i++];) { + if (ni.id == '_baidu_cut_start' || ni.id == '_baidu_cut_end') { + domUtils.remove(ni); + } + } + + if (browser.webkit) { + + var brs = div.querySelectorAll('div br'); + for (var i = 0, bi; bi = brs[i++];) { + var pN = bi.parentNode; + if (pN.tagName == 'DIV' && pN.childNodes.length == 1) { + pN.innerHTML = '


            '; + domUtils.remove(pN); + } + } + var divs = div.querySelectorAll('#baidu_pastebin'); + for (var i = 0, di; di = divs[i++];) { + var tmpP = me.document.createElement('p'); + di.parentNode.insertBefore(tmpP, di); + while (di.firstChild) { + tmpP.appendChild(di.firstChild); + } + domUtils.remove(di); + } + + var metas = div.querySelectorAll('meta'); + for (var i = 0, ci; ci = metas[i++];) { + domUtils.remove(ci); + } + + var brs = div.querySelectorAll('br'); + for (i = 0; ci = brs[i++];) { + if (/^apple-/i.test(ci.className)) { + domUtils.remove(ci); + } + } + } + if (browser.gecko) { + var dirtyNodes = div.querySelectorAll('[_moz_dirty]'); + for (i = 0; ci = dirtyNodes[i++];) { + ci.removeAttribute('_moz_dirty'); + } + } + if (!browser.ie) { + var spans = div.querySelectorAll('span.Apple-style-span'); + for (var i = 0, ci; ci = spans[i++];) { + domUtils.remove(ci, true); + } + } + + //ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉 + html = div.innerHTML;//.replace(/>(?:(\s| )*?)<'); + + //过滤word粘贴过来的冗余属性 + html = UE.filterWord(html); + //取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签 + var root = UE.htmlparser(html); + //如果给了过滤规则就先进行过滤 + if (me.options.filterRules) { + UE.filterNode(root, me.options.filterRules); + } + //执行默认的处理 + me.filterInputRule(root); + //针对chrome的处理 + if (browser.webkit) { + var br = root.lastChild(); + if (br && br.type == 'element' && br.tagName == 'br') { + root.removeChild(br) + } + utils.each(me.body.querySelectorAll('div'), function (node) { + if (domUtils.isEmptyBlock(node)) { + domUtils.remove(node,true) + } + }) + } + html = {'html': root.toHtml()}; + me.fireEvent('beforepaste', html, root); + //抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴 + if(!html.html){ + return; + } + root = UE.htmlparser(html.html,true); + //如果开启了纯文本模式 + if (me.queryCommandState('pasteplain') === 1) { + me.execCommand('insertHtml', UE.filterNode(root, me.options.filterTxtRules).toHtml(), true); + } else { + //文本模式 + UE.filterNode(root, me.options.filterTxtRules); + txtContent = root.toHtml(); + //完全模式 + htmlContent = html.html; + + address = me.selection.getRange().createAddress(true); + me.execCommand('insertHtml', me.getOpt('retainOnlyLabelPasted') === true ? getPureHtml(htmlContent) : htmlContent, true); + } + me.fireEvent("afterpaste", html); + } + } + + me.addListener('pasteTransfer', function (cmd, plainType) { + + if (address && txtContent && htmlContent && txtContent != htmlContent) { + var range = me.selection.getRange(); + range.moveToAddress(address, true); + + if (!range.collapsed) { + + while (!domUtils.isBody(range.startContainer) + ) { + var start = range.startContainer; + if(start.nodeType == 1){ + start = start.childNodes[range.startOffset]; + if(!start){ + range.setStartBefore(range.startContainer); + continue; + } + var pre = start.previousSibling; + + if(pre && pre.nodeType == 3 && new RegExp('^[\n\r\t '+domUtils.fillChar+']*$').test(pre.nodeValue)){ + range.setStartBefore(pre) + } + } + if(range.startOffset == 0){ + range.setStartBefore(range.startContainer); + }else{ + break; + } + + } + while (!domUtils.isBody(range.endContainer) + ) { + var end = range.endContainer; + if(end.nodeType == 1){ + end = end.childNodes[range.endOffset]; + if(!end){ + range.setEndAfter(range.endContainer); + continue; + } + var next = end.nextSibling; + if(next && next.nodeType == 3 && new RegExp('^[\n\r\t'+domUtils.fillChar+']*$').test(next.nodeValue)){ + range.setEndAfter(next) + } + } + if(range.endOffset == range.endContainer[range.endContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length){ + range.setEndAfter(range.endContainer); + }else{ + break; + } + + } + + } + + range.deleteContents(); + range.select(true); + me.__hasEnterExecCommand = true; + var html = htmlContent; + if (plainType === 2 ) { + html = getPureHtml(html); + } else if (plainType) { + html = txtContent; + } + me.execCommand('inserthtml', html, true); + me.__hasEnterExecCommand = false; + var rng = me.selection.getRange(); + while (!domUtils.isBody(rng.startContainer) && !rng.startOffset && + rng.startContainer[rng.startContainer.nodeType == 3 ? 'nodeValue' : 'childNodes'].length + ) { + rng.setStartBefore(rng.startContainer); + } + var tmpAddress = rng.createAddress(true); + address.endAddress = tmpAddress.startAddress; + } + }); + + me.addListener('ready', function () { + domUtils.on(me.body, 'cut', function () { + var range = me.selection.getRange(); + if (!range.collapsed && me.undoManger) { + me.undoManger.save(); + } + }); + + //ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理 + domUtils.on(me.body, browser.ie || browser.opera ? 'keydown' : 'paste', function (e) { + if ((browser.ie || browser.opera) && ((!e.ctrlKey && !e.metaKey) || e.keyCode != '86')) { + return; + } + getClipboardData.call(me, function (div) { + filter(div); + }); + }); + + }); + + me.commands['paste'] = { + execCommand: function (cmd) { + if (browser.ie) { + getClipboardData.call(me, function (div) { + filter(div); + }); + me.document.execCommand('paste'); + } else { + alert(me.getLang('pastemsg')); + } + } + } +}; + + + +// plugins/puretxtpaste.js +/** + * 纯文本粘贴插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['pasteplain'] = function(){ + var me = this; + me.setOpt({ + 'pasteplain':false, + 'filterTxtRules' : function(){ + function transP(node){ + node.tagName = 'p'; + node.setStyle(); + } + function removeNode(node){ + node.parentNode.removeChild(node,true) + } + return { + //直接删除及其字节点内容 + '-' : 'script style object iframe embed input select', + 'p': {$:{}}, + 'br':{$:{}}, + div: function (node) { + var tmpNode, p = UE.uNode.createElement('p'); + while (tmpNode = node.firstChild()) { + if (tmpNode.type == 'text' || !UE.dom.dtd.$block[tmpNode.tagName]) { + p.appendChild(tmpNode); + } else { + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + p = UE.uNode.createElement('p'); + } else { + node.parentNode.insertBefore(tmpNode, node); + } + } + } + if (p.firstChild()) { + node.parentNode.insertBefore(p, node); + } + node.parentNode.removeChild(node); + }, + ol: removeNode, + ul: removeNode, + dl:removeNode, + dt:removeNode, + dd:removeNode, + 'li':removeNode, + 'caption':transP, + 'th':transP, + 'tr':transP, + 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, + 'td':function(node){ + //没有内容的td直接删掉 + var txt = !!node.innerText(); + if(txt){ + node.parentNode.insertAfter(UE.uNode.createText('    '),node); + } + node.parentNode.removeChild(node,node.innerText()) + } + } + }() + }); + //暂时这里支持一下老版本的属性 + var pasteplain = me.options.pasteplain; + + /** + * 启用或取消纯文本粘贴模式 + * @command pasteplain + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + + /** + * 查询当前是否处于纯文本粘贴模式 + * @command pasteplain + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果处于纯文本模式,返回1,否则,返回0 + * @example + * ```javascript + * editor.queryCommandState( 'pasteplain' ); + * ``` + */ + me.commands['pasteplain'] = { + queryCommandState: function (){ + return pasteplain ? 1 : 0; + }, + execCommand: function (){ + pasteplain = !pasteplain|0; + }, + notNeedUndo : 1 + }; +}; + +// plugins/list.js +/** + * 有序列表,无序列表插件 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['list'] = function () { + var me = this, + notExchange = { + 'TD':1, + 'PRE':1, + 'BLOCKQUOTE':1 + }; + var customStyle = { + 'cn' : 'cn-1-', + 'cn1' : 'cn-2-', + 'cn2' : 'cn-3-', + 'num': 'num-1-', + 'num1' : 'num-2-', + 'num2' : 'num-3-', + 'dash' : 'dash', + 'dot':'dot' + }; + + me.setOpt( { + 'autoTransWordToList':false, + 'insertorderedlist':{ + 'num':'', + 'num1':'', + 'num2':'', + 'cn':'', + 'cn1':'', + 'cn2':'', + 'decimal':'', + 'lower-alpha':'', + 'lower-roman':'', + 'upper-alpha':'', + 'upper-roman':'' + }, + 'insertunorderedlist':{ + 'circle':'', + 'disc':'', + 'square':'', + 'dash' : '', + 'dot':'' + }, + listDefaultPaddingLeft : '30', + listiconpath : 'http://bs.baidu.com/listicon/', + maxListLevel : -1,//-1不限制 + disablePInList:false + } ); + function listToArray(list){ + var arr = []; + for(var p in list){ + arr.push(p) + } + return arr; + } + var listStyle = { + 'OL':listToArray(me.options.insertorderedlist), + 'UL':listToArray(me.options.insertunorderedlist) + }; + var liiconpath = me.options.listiconpath; + + //根据用户配置,调整customStyle + for(var s in customStyle){ + if(!me.options.insertorderedlist.hasOwnProperty(s) && !me.options.insertunorderedlist.hasOwnProperty(s)){ + delete customStyle[s]; + } + } + + me.ready(function () { + var customCss = []; + for(var p in customStyle){ + if(p == 'dash' || p == 'dot'){ + customCss.push('li.list-' + customStyle[p] + '{background-image:url(' + liiconpath +customStyle[p]+'.gif)}'); + customCss.push('ul.custom_'+p+'{list-style:none;}ul.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}'); + }else{ + for(var i= 0;i<99;i++){ + customCss.push('li.list-' + customStyle[p] + i + '{background-image:url(' + liiconpath + 'list-'+customStyle[p] + i + '.gif)}') + } + customCss.push('ol.custom_'+p+'{list-style:none;}ol.custom_'+p+' li{background-position:0 3px;background-repeat:no-repeat}'); + } + switch(p){ + case 'cn': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn1': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:30px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn2': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:40px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:55px}'); + customCss.push('li.list-'+p+'-paddingleft-3{padding-left:68px}'); + break; + case 'num': + case 'num1': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:25px}'); + break; + case 'num2': + customCss.push('li.list-'+p+'-paddingleft-1{padding-left:35px}'); + customCss.push('li.list-'+p+'-paddingleft-2{padding-left:40px}'); + break; + case 'dash': + customCss.push('li.list-'+p+'-paddingleft{padding-left:35px}'); + break; + case 'dot': + customCss.push('li.list-'+p+'-paddingleft{padding-left:20px}'); + } + } + customCss.push('.list-paddingleft-1{padding-left:0}'); + customCss.push('.list-paddingleft-2{padding-left:'+me.options.listDefaultPaddingLeft+'px}'); + customCss.push('.list-paddingleft-3{padding-left:'+me.options.listDefaultPaddingLeft*2+'px}'); + //如果不给宽度会在自定应样式里出现滚动条 + utils.cssRule('list', 'ol,ul{margin:0;pading:0;'+(browser.ie ? '' : 'width:95%')+'}li{clear:both;}'+customCss.join('\n'), me.document); + }); + //单独处理剪切的问题 + me.ready(function(){ + domUtils.on(me.body,'cut',function(){ + setTimeout(function(){ + var rng = me.selection.getRange(),li; + //trace:3416 + if(!rng.collapsed){ + if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){ + if(!li.nextSibling && domUtils.isEmptyBlock(li)){ + var pn = li.parentNode,node; + if(node = pn.previousSibling){ + domUtils.remove(pn); + rng.setStartAtLast(node).collapse(true); + rng.select(true); + }else if(node = pn.nextSibling){ + domUtils.remove(pn); + rng.setStartAtFirst(node).collapse(true); + rng.select(true); + }else{ + var tmpNode = me.document.createElement('p'); + domUtils.fillNode(me.document,tmpNode); + pn.parentNode.insertBefore(tmpNode,pn); + domUtils.remove(pn); + rng.setStart(tmpNode,0).collapse(true); + rng.select(true); + } + } + } + } + + }) + }) + }); + + function getStyle(node){ + var cls = node.className; + if(domUtils.hasClass(node,/custom_/)){ + return cls.match(/custom_(\w+)/)[1] + } + return domUtils.getStyle(node, 'list-style-type') + + } + + me.addListener('beforepaste',function(type,html){ + var me = this, + rng = me.selection.getRange(),li; + var root = UE.htmlparser(html.html,true); + if(li = domUtils.findParentByTagName(rng.startContainer,'li',true)){ + var list = li.parentNode,tagName = list.tagName == 'OL' ? 'ul':'ol'; + utils.each(root.getNodesByTagName(tagName),function(n){ + n.tagName = list.tagName; + n.setAttr(); + if(n.parentNode === root){ + type = getStyle(list) || (list.tagName == 'OL' ? 'decimal' : 'disc') + }else{ + var className = n.parentNode.getAttr('class'); + if(className && /custom_/.test(className)){ + type = className.match(/custom_(\w+)/)[1] + }else{ + type = n.parentNode.getStyle('list-style-type'); + } + if(!type){ + type = list.tagName == 'OL' ? 'decimal' : 'disc'; + } + } + var index = utils.indexOf(listStyle[list.tagName], type); + if(n.parentNode !== root) + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + if(customStyle[currentStyle]){ + n.setAttr('class', 'custom_' + currentStyle) + + }else{ + n.setStyle('list-style-type',currentStyle) + } + }) + + } + + html.html = root.toHtml(); + }); + //导出时,去掉p标签 + me.getOpt('disablePInList') === true && me.addOutputRule(function(root){ + utils.each(root.getNodesByTagName('li'),function(li){ + var newChildrens = [],index=0; + utils.each(li.children,function(n){ + if(n.tagName == 'p'){ + var tmpNode; + while(tmpNode = n.children.pop()) { + newChildrens.splice(index,0,tmpNode); + tmpNode.parentNode = li; + lastNode = tmpNode; + } + tmpNode = newChildrens[newChildrens.length-1]; + if(!tmpNode || tmpNode.type != 'element' || tmpNode.tagName != 'br'){ + var br = UE.uNode.createElement('br'); + br.parentNode = li; + newChildrens.push(br); + } + + index = newChildrens.length; + } + }); + if(newChildrens.length){ + li.children = newChildrens; + } + }); + }); + //进入编辑器的li要套p标签 + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('li'),function(li){ + var tmpP = UE.uNode.createElement('p'); + for(var i= 0,ci;ci=li.children[i];){ + if(ci.type == 'text' || dtd.p[ci.tagName]){ + tmpP.appendChild(ci); + }else{ + if(tmpP.firstChild()){ + li.insertBefore(tmpP,ci); + tmpP = UE.uNode.createElement('p'); + i = i + 2; + }else{ + i++; + } + + } + } + if(tmpP.firstChild() && !tmpP.parentNode || !li.firstChild()){ + li.appendChild(tmpP); + } + //trace:3357 + //p不能为空 + if (!tmpP.firstChild()) { + tmpP.innerHTML(browser.ie ? ' ' : '
            ') + } + //去掉末尾的空白 + var p = li.firstChild(); + var lastChild = p.lastChild(); + if(lastChild && lastChild.type == 'text' && /^\s*$/.test(lastChild.data)){ + p.removeChild(lastChild) + } + }); + if(me.options.autoTransWordToList){ + var orderlisttype = { + 'num1':/^\d+\)/, + 'decimal':/^\d+\./, + 'lower-alpha':/^[a-z]+\)/, + 'upper-alpha':/^[A-Z]+\./, + 'cn':/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/, + 'cn2':/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/ + }, + unorderlisttype = { + 'square':'n' + }; + function checkListType(content,container){ + var span = container.firstChild(); + if(span && span.type == 'element' && span.tagName == 'span' && /Wingdings|Symbol/.test(span.getStyle('font-family'))){ + for(var p in unorderlisttype){ + if(unorderlisttype[p] == span.data){ + return p + } + } + return 'disc' + } + for(var p in orderlisttype){ + if(orderlisttype[p].test(content)){ + return p; + } + } + + } + utils.each(root.getNodesByTagName('p'),function(node){ + if(node.getAttr('class') != 'MsoListParagraph'){ + return + } + + //word粘贴过来的会带有margin要去掉,但这样也可能会误命中一些央视 + node.setStyle('margin',''); + node.setStyle('margin-left',''); + node.setAttr('class',''); + + function appendLi(list,p,type){ + if(list.tagName == 'ol'){ + if(browser.ie){ + var first = p.firstChild(); + if(first.type =='element' && first.tagName == 'span' && orderlisttype[type].test(first.innerText())){ + p.removeChild(first); + } + }else{ + p.innerHTML(p.innerHTML().replace(orderlisttype[type],'')); + } + }else{ + p.removeChild(p.firstChild()) + } + + var li = UE.uNode.createElement('li'); + li.appendChild(p); + list.appendChild(li); + } + var tmp = node,type,cacheNode = node; + + if(node.parentNode.tagName != 'li' && (type = checkListType(node.innerText(),node))){ + + var list = UE.uNode.createElement(me.options.insertorderedlist.hasOwnProperty(type) ? 'ol' : 'ul'); + if(customStyle[type]){ + list.setAttr('class','custom_'+type) + }else{ + list.setStyle('list-style-type',type) + } + while(node && node.parentNode.tagName != 'li' && checkListType(node.innerText(),node)){ + tmp = node.nextSibling(); + if(!tmp){ + node.parentNode.insertBefore(list,node) + } + appendLi(list,node,type); + node = tmp; + } + if(!list.parentNode && node && node.parentNode){ + node.parentNode.insertBefore(list,node) + } + } + var span = cacheNode.firstChild(); + if(span && span.type == 'element' && span.tagName == 'span' && /^\s*( )+\s*$/.test(span.innerText())){ + span.parentNode.removeChild(span) + } + }) + } + + }); + + //调整索引标签 + me.addListener('contentchange',function(){ + adjustListStyle(me.document) + }); + + function adjustListStyle(doc,ignore){ + utils.each(domUtils.getElementsByTagName(doc,'ol ul'),function(node){ + + if(!domUtils.inDoc(node,doc)) + return; + + var parent = node.parentNode; + if(parent.tagName == node.tagName){ + var nodeStyleType = getStyle(node) || (node.tagName == 'OL' ? 'decimal' : 'disc'), + parentStyleType = getStyle(parent) || (parent.tagName == 'OL' ? 'decimal' : 'disc'); + if(nodeStyleType == parentStyleType){ + var styleIndex = utils.indexOf(listStyle[node.tagName], nodeStyleType); + styleIndex = styleIndex + 1 == listStyle[node.tagName].length ? 0 : styleIndex + 1; + setListStyle(node,listStyle[node.tagName][styleIndex]) + } + + } + var index = 0,type = 2; + if( domUtils.hasClass(node,/custom_/)){ + if(!(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/))){ + type = 1; + } + }else{ + if(/[ou]l/i.test(parent.tagName) && domUtils.hasClass(parent,/custom_/)){ + type = 3; + } + } + + var style = domUtils.getStyle(node, 'list-style-type'); + style && (node.style.cssText = 'list-style-type:' + style); + node.className = utils.trim(node.className.replace(/list-paddingleft-\w+/,'')) + ' list-paddingleft-' + type; + utils.each(domUtils.getElementsByTagName(node,'li'),function(li){ + li.style.cssText && (li.style.cssText = ''); + if(!li.firstChild){ + domUtils.remove(li); + return; + } + if(li.parentNode !== node){ + return; + } + index++; + if(domUtils.hasClass(node,/custom_/) ){ + var paddingLeft = 1,currentStyle = getStyle(node); + if(node.tagName == 'OL'){ + if(currentStyle){ + switch(currentStyle){ + case 'cn' : + case 'cn1': + case 'cn2': + if(index > 10 && (index % 10 == 0 || index > 10 && index < 20)){ + paddingLeft = 2 + }else if(index > 20){ + paddingLeft = 3 + } + break; + case 'num2' : + if(index > 9){ + paddingLeft = 2 + } + } + } + li.className = 'list-'+customStyle[currentStyle]+ index + ' ' + 'list-'+currentStyle+'-paddingleft-' + paddingLeft; + }else{ + li.className = 'list-'+customStyle[currentStyle] + ' ' + 'list-'+currentStyle+'-paddingleft'; + } + }else{ + li.className = li.className.replace(/list-[\w\-]+/gi,''); + } + var className = li.getAttribute('class'); + if(className !== null && !className.replace(/\s/g,'')){ + domUtils.removeAttributes(li,'class') + } + }); + !ignore && adjustList(node,node.tagName.toLowerCase(),getStyle(node)||domUtils.getStyle(node, 'list-style-type'),true); + }) + } + function adjustList(list, tag, style,ignoreEmpty) { + var nextList = list.nextSibling; + if (nextList && nextList.nodeType == 1 && nextList.tagName.toLowerCase() == tag && (getStyle(nextList) || domUtils.getStyle(nextList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { + domUtils.moveChild(nextList, list); + if (nextList.childNodes.length == 0) { + domUtils.remove(nextList); + } + } + if(nextList && domUtils.isFillChar(nextList)){ + domUtils.remove(nextList); + } + var preList = list.previousSibling; + if (preList && preList.nodeType == 1 && preList.tagName.toLowerCase() == tag && (getStyle(preList) || domUtils.getStyle(preList, 'list-style-type') || (tag == 'ol' ? 'decimal' : 'disc')) == style) { + domUtils.moveChild(list, preList); + } + if(preList && domUtils.isFillChar(preList)){ + domUtils.remove(preList); + } + !ignoreEmpty && domUtils.isEmptyBlock(list) && domUtils.remove(list); + if(getStyle(list)){ + adjustListStyle(list.ownerDocument,true) + } + } + + function setListStyle(list,style){ + if(customStyle[style]){ + list.className = 'custom_' + style; + } + try{ + domUtils.setStyle(list, 'list-style-type', style); + }catch(e){} + } + function clearEmptySibling(node) { + var tmpNode = node.previousSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + tmpNode = node.nextSibling; + if (tmpNode && domUtils.isEmptyBlock(tmpNode)) { + domUtils.remove(tmpNode); + } + } + + me.addListener('keydown', function (type, evt) { + function preventAndSave() { + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + me.fireEvent('contentchange'); + me.undoManger && me.undoManger.save(); + } + function findList(node,filterFn){ + while(node && !domUtils.isBody(node)){ + if(filterFn(node)){ + return null + } + if(node.nodeType == 1 && /[ou]l/i.test(node.tagName)){ + return node; + } + node = node.parentNode; + } + return null; + } + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13 && !evt.shiftKey) {//回车 + var rng = me.selection.getRange(), + parent = domUtils.findParent(rng.startContainer,function(node){return domUtils.isBlockElm(node)},true), + li = domUtils.findParentByTagName(rng.startContainer,'li',true); + if(parent && parent.tagName != 'PRE' && !li){ + var html = parent.innerHTML.replace(new RegExp(domUtils.fillChar, 'g'),''); + if(/^\s*1\s*\.[^\d]/.test(html)){ + parent.innerHTML = html.replace(/^\s*1\s*\./,''); + rng.setStartAtLast(parent).collapse(true).select(); + me.__hasEnterExecCommand = true; + me.execCommand('insertorderedlist'); + me.__hasEnterExecCommand = false; + } + } + var range = me.selection.getRange(), + start = findList(range.startContainer,function (node) { + return node.tagName == 'TABLE'; + }), + end = range.collapsed ? start : findList(range.endContainer,function (node) { + return node.tagName == 'TABLE'; + }); + + if (start && end && start === end) { + + if (!range.collapsed) { + start = domUtils.findParentByTagName(range.startContainer, 'li', true); + end = domUtils.findParentByTagName(range.endContainer, 'li', true); + if (start && end && start === end) { + range.deleteContents(); + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if (li && domUtils.isEmptyBlock(li)) { + + pre = li.previousSibling; + next = li.nextSibling; + p = me.document.createElement('p'); + + domUtils.fillNode(me.document, p); + parentList = li.parentNode; + if (pre && next) { + range.setStart(next, 0).collapse(true).select(true); + domUtils.remove(li); + + } else { + if (!pre && !next || !pre) { + + parentList.parentNode.insertBefore(p, parentList); + + + } else { + li.parentNode.parentNode.insertBefore(p, parentList.nextSibling); + } + domUtils.remove(li); + if (!parentList.firstChild) { + domUtils.remove(parentList); + } + range.setStart(p, 0).setCursor(); + + + } + preventAndSave(); + return; + + } + } else { + var tmpRange = range.cloneRange(), + bk = tmpRange.collapse(false).createBookmark(); + + range.deleteContents(); + tmpRange.moveToBookmark(bk); + var li = domUtils.findParentByTagName(tmpRange.startContainer, 'li', true); + + clearEmptySibling(li); + tmpRange.select(); + preventAndSave(); + return; + } + } + + + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + + if (li) { + if (domUtils.isEmptyBlock(li)) { + bk = range.createBookmark(); + var parentList = li.parentNode; + if (li !== parentList.lastChild) { + domUtils.breakParent(li, parentList); + clearEmptySibling(li); + } else { + + parentList.parentNode.insertBefore(li, parentList.nextSibling); + if (domUtils.isEmptyNode(parentList)) { + domUtils.remove(parentList); + } + } + //嵌套不处理 + if (!dtd.$list[li.parentNode.tagName]) { + + if (!domUtils.isBlockElm(li.firstChild)) { + p = me.document.createElement('p'); + li.parentNode.insertBefore(p, li); + while (li.firstChild) { + p.appendChild(li.firstChild); + } + domUtils.remove(li); + } else { + domUtils.remove(li, true); + } + } + range.moveToBookmark(bk).select(); + + + } else { + var first = li.firstChild; + if (!first || !domUtils.isBlockElm(first)) { + var p = me.document.createElement('p'); + + !li.firstChild && domUtils.fillNode(me.document, p); + while (li.firstChild) { + + p.appendChild(li.firstChild); + } + li.appendChild(p); + first = p; + } + + var span = me.document.createElement('span'); + + range.insertNode(span); + domUtils.breakParent(span, li); + + var nextLi = span.nextSibling; + first = nextLi.firstChild; + + if (!first) { + p = me.document.createElement('p'); + + domUtils.fillNode(me.document, p); + nextLi.appendChild(p); + first = p; + } + if (domUtils.isEmptyNode(first)) { + first.innerHTML = ''; + domUtils.fillNode(me.document, first); + } + + range.setStart(first, 0).collapse(true).shrinkBoundary().select(); + domUtils.remove(span); + var pre = nextLi.previousSibling; + if (pre && domUtils.isEmptyBlock(pre)) { + pre.innerHTML = '

            '; + domUtils.fillNode(me.document, pre.firstChild); + } + + } +// } + preventAndSave(); + } + + + } + + + } + if (keyCode == 8) { + //修中ie中li下的问题 + range = me.selection.getRange(); + if (range.collapsed && domUtils.isStartInblock(range)) { + tmpRange = range.cloneRange().trimBoundary(); + li = domUtils.findParentByTagName(range.startContainer, 'li', true); + //要在li的最左边,才能处理 + if (li && domUtils.isStartInblock(tmpRange)) { + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + if (start && start !== li.firstChild) { + var parentList = domUtils.findParentByTagName(start,['ol','ul']); + domUtils.breakParent(start,parentList); + clearEmptySibling(start); + me.fireEvent('contentchange'); + range.setStart(start,0).setCursor(false,true); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + + if (li && (pre = li.previousSibling)) { + if (keyCode == 46 && li.childNodes.length) { + return; + } + //有可能上边的兄弟节点是个2级菜单,要追加到2级菜单的最后的li + if (dtd.$list[pre.tagName]) { + pre = pre.lastChild; + } + me.undoManger && me.undoManger.save(); + first = li.firstChild; + if (domUtils.isBlockElm(first)) { + if (domUtils.isEmptyNode(first)) { +// range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + pre.appendChild(first); + range.setStart(first, 0).setCursor(false, true); + //first不是唯一的节点 + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } else { + + span = me.document.createElement('span'); + range.insertNode(span); + //判断pre是否是空的节点,如果是


            类型的空节点,干掉p标签防止它占位 + if (domUtils.isEmptyBlock(pre)) { + pre.innerHTML = ''; + } + domUtils.moveChild(li, pre); + range.setStartBefore(span).collapse(true).select(true); + + domUtils.remove(span); + + } + } else { + if (domUtils.isEmptyNode(li)) { + var p = me.document.createElement('p'); + pre.appendChild(p); + range.setStart(p, 0).setCursor(); +// range.setEnd(pre, pre.childNodes.length).shrinkBoundary().collapse().select(true); + } else { + range.setEnd(pre, pre.childNodes.length).collapse().select(true); + while (li.firstChild) { + pre.appendChild(li.firstChild); + } + } + } + domUtils.remove(li); + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + + } + //trace:980 + + if (li && !li.previousSibling) { + var parentList = li.parentNode; + var bk = range.createBookmark(); + if(domUtils.isTagNode(parentList.parentNode,'ol ul')){ + parentList.parentNode.insertBefore(li,parentList); + if(domUtils.isEmptyNode(parentList)){ + domUtils.remove(parentList) + } + }else{ + + while(li.firstChild){ + parentList.parentNode.insertBefore(li.firstChild,parentList); + } + + domUtils.remove(li); + if(domUtils.isEmptyNode(parentList)){ + domUtils.remove(parentList) + } + + } + range.moveToBookmark(bk).setCursor(false,true); + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + + } + + + } + + + } + + } + }); + + me.addListener('keyup',function(type, evt){ + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8) { + var rng = me.selection.getRange(),list; + if(list = domUtils.findParentByTagName(rng.startContainer,['ol', 'ul'],true)){ + adjustList(list,list.tagName.toLowerCase(),getStyle(list)||domUtils.getComputedStyle(list,'list-style-type'),true) + } + } + }); + //处理tab键 + me.addListener('tabkeydown',function(){ + + var range = me.selection.getRange(); + + //控制级数 + function checkLevel(li){ + if(me.options.maxListLevel != -1){ + var level = li.parentNode,levelNum = 0; + while(/[ou]l/i.test(level.tagName)){ + levelNum++; + level = level.parentNode; + } + if(levelNum >= me.options.maxListLevel){ + return true; + } + } + } + //只以开始为准 + //todo 后续改进 + var li = domUtils.findParentByTagName(range.startContainer, 'li', true); + if(li){ + + var bk; + if(range.collapsed){ + if(checkLevel(li)) + return true; + var parentLi = li.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type')); + index = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][index]; + setListStyle(list,currentStyle); + if(domUtils.isStartInblock(range)){ + me.fireEvent('saveScene'); + bk = range.createBookmark(); + parentLi.insertBefore(list, li); + list.appendChild(li); + adjustList(list,list.tagName.toLowerCase(),currentStyle); + me.fireEvent('contentchange'); + range.moveToBookmark(bk).select(true); + return true; + } + }else{ + me.fireEvent('saveScene'); + bk = range.createBookmark(); + for(var i= 0,closeList,parents = domUtils.findParents(li),ci;ci=parents[i++];){ + if(domUtils.isTagNode(ci,'ol ul')){ + closeList = ci; + break; + } + } + var current = li; + if(bk.end){ + while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){ + if(checkLevel(current)){ + current = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList}); + continue; + } + var parentLi = current.parentNode, + list = me.document.createElement(parentLi.tagName), + index = utils.indexOf(listStyle[list.tagName], getStyle(parentLi)||domUtils.getComputedStyle(parentLi, 'list-style-type')); + var currentIndex = index + 1 == listStyle[list.tagName].length ? 0 : index + 1; + var currentStyle = listStyle[list.tagName][currentIndex]; + setListStyle(list,currentStyle); + parentLi.insertBefore(list, current); + while(current && !(domUtils.getPosition(current, bk.end) & domUtils.POSITION_FOLLOWING)){ + li = current.nextSibling; + list.appendChild(current); + if(!li || domUtils.isTagNode(li,'ol ul')){ + if(li){ + while(li = li.firstChild){ + if(li.tagName == 'LI'){ + break; + } + } + }else{ + li = domUtils.getNextDomNode(current,false,null,function(node){return node !== closeList}); + } + break; + } + current = li; + } + adjustList(list,list.tagName.toLowerCase(),currentStyle); + current = li; + } + } + me.fireEvent('contentchange'); + range.moveToBookmark(bk).select(); + return true; + } + } + + }); + function getLi(start){ + while(start && !domUtils.isBody(start)){ + if(start.nodeName == 'TABLE'){ + return null; + } + if(start.nodeName == 'LI'){ + return start + } + start = start.parentNode; + } + } + + /** + * 有序列表,与“insertunorderedlist”命令互斥 + * @command insertorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的有序列表类型,值为:decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.execCommand( 'insertorderedlist','decimal'); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前选区是有序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertorderedlist + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @return { String } 返回当前有序列表的类型,值为null或decimal,lower-alpha,lower-roman,upper-alpha,upper-roman,cn,cn1,cn2,num,num1,num2 + * @example + * ```javascript + * editor.queryCommandValue( 'insertorderedlist' ); + * ``` + */ + + /** + * 无序列表,与“insertorderedlist”命令互斥 + * @command insertunorderedlist + * @method execCommand + * @param { String } command 命令字符串 + * @param { String } style 插入的无序列表类型,值为:circle,disc,square,dash,dot + * @example + * ```javascript + * editor.execCommand( 'insertunorderedlist','circle'); + * ``` + */ + /** + * 查询当前是否有word文档粘贴进来的图片 + * @command insertunorderedlist + * @method insertunorderedlist + * @param { String } command 命令字符串 + * @return { int } 如果当前选区是无序列表返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'insertunorderedlist' ); + * ``` + */ + /** + * 查询当前选区内容是否有序列表 + * @command insertunorderedlist + * @method queryCommandValue + * @param { String } command 命令字符串 + * @return { String } 返回当前无序列表的类型,值为null或circle,disc,square,dash,dot + * @example + * ```javascript + * editor.queryCommandValue( 'insertunorderedlist' ); + * ``` + */ + + me.commands['insertorderedlist'] = + me.commands['insertunorderedlist'] = { + execCommand:function (command, style) { + + if (!style) { + style = command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'; + } + var me = this, + range = this.selection.getRange(), + filterFn = function (node) { + return node.nodeType == 1 ? node.tagName.toLowerCase() != 'br' : !domUtils.isWhitespace(node); + }, + tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul', + frag = me.document.createDocumentFragment(); + //去掉是因为会出现选到末尾,导致adjustmentBoundary缩到ol/ul的位置 + //range.shrinkBoundary();//.adjustmentBoundary(); + range.adjustmentBoundary().shrinkBoundary(); + var bko = range.createBookmark(true), + start = getLi(me.document.getElementById(bko.start)), + modifyStart = 0, + end = getLi(me.document.getElementById(bko.end)), + modifyEnd = 0, + startParent, endParent, + list, tmp; + + if (start || end) { + start && (startParent = start.parentNode); + if (!bko.end) { + end = start; + } + end && (endParent = end.parentNode); + + if (startParent === endParent) { + while (start !== end) { + tmp = start; + start = start.nextSibling; + if (!domUtils.isBlockElm(tmp.firstChild)) { + var p = me.document.createElement('p'); + while (tmp.firstChild) { + p.appendChild(tmp.firstChild); + } + tmp.appendChild(p); + } + frag.appendChild(tmp); + } + tmp = me.document.createElement('span'); + startParent.insertBefore(tmp, end); + if (!domUtils.isBlockElm(end.firstChild)) { + p = me.document.createElement('p'); + while (end.firstChild) { + p.appendChild(end.firstChild); + } + end.appendChild(p); + } + frag.appendChild(end); + domUtils.breakParent(tmp, startParent); + if (domUtils.isEmptyNode(tmp.previousSibling)) { + domUtils.remove(tmp.previousSibling); + } + if (domUtils.isEmptyNode(tmp.nextSibling)) { + domUtils.remove(tmp.nextSibling) + } + var nodeStyle = getStyle(startParent) || domUtils.getComputedStyle(startParent, 'list-style-type') || (command.toLowerCase() == 'insertorderedlist' ? 'decimal' : 'disc'); + if (startParent.tagName.toLowerCase() == tag && nodeStyle == style) { + for (var i = 0, ci, tmpFrag = me.document.createDocumentFragment(); ci = frag.firstChild;) { + if(domUtils.isTagNode(ci,'ol ul')){ +// 删除时,子列表不处理 +// utils.each(domUtils.getElementsByTagName(ci,'li'),function(li){ +// while(li.firstChild){ +// tmpFrag.appendChild(li.firstChild); +// } +// +// }); + tmpFrag.appendChild(ci); + }else{ + while (ci.firstChild) { + + tmpFrag.appendChild(ci.firstChild); + domUtils.remove(ci); + } + } + + } + tmp.parentNode.insertBefore(tmpFrag, tmp); + } else { + list = me.document.createElement(tag); + setListStyle(list,style); + list.appendChild(frag); + tmp.parentNode.insertBefore(list, tmp); + } + + domUtils.remove(tmp); + list && adjustList(list, tag, style); + range.moveToBookmark(bko).select(); + return; + } + //开始 + if (start) { + while (start) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, 'ol ul')) { + frag.appendChild(start); + } else { + var tmpfrag = me.document.createDocumentFragment(), + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + var tmpP = me.document.createElement('p'); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + + start = tmp; + } + startParent.parentNode.insertBefore(frag, startParent.nextSibling); + if (domUtils.isEmptyNode(startParent)) { + range.setStartBefore(startParent); + domUtils.remove(startParent); + } else { + range.setStartAfter(startParent); + } + modifyStart = 1; + } + + if (end && domUtils.inDoc(endParent, me.document)) { + //结束 + start = endParent.firstChild; + while (start && start !== end) { + tmp = start.nextSibling; + if (domUtils.isTagNode(start, 'ol ul')) { + frag.appendChild(start); + } else { + tmpfrag = me.document.createDocumentFragment(); + hasBlock = 0; + while (start.firstChild) { + if (domUtils.isBlockElm(start.firstChild)) { + hasBlock = 1; + } + tmpfrag.appendChild(start.firstChild); + } + if (!hasBlock) { + tmpP = me.document.createElement('p'); + tmpP.appendChild(tmpfrag); + frag.appendChild(tmpP); + } else { + frag.appendChild(tmpfrag); + } + domUtils.remove(start); + } + start = tmp; + } + var tmpDiv = domUtils.createElement(me.document, 'div', { + 'tmpDiv':1 + }); + domUtils.moveChild(end, tmpDiv); + + frag.appendChild(tmpDiv); + domUtils.remove(end); + endParent.parentNode.insertBefore(frag, endParent); + range.setEndBefore(endParent); + if (domUtils.isEmptyNode(endParent)) { + domUtils.remove(endParent); + } + + modifyEnd = 1; + } + + + } + + if (!modifyStart) { + range.setStartBefore(me.document.getElementById(bko.start)); + } + if (bko.end && !modifyEnd) { + range.setEndAfter(me.document.getElementById(bko.end)); + } + range.enlarge(true, function (node) { + return notExchange[node.tagName]; + }); + + frag = me.document.createDocumentFragment(); + + var bk = range.createBookmark(), + current = domUtils.getNextDomNode(bk.start, false, filterFn), + tmpRange = range.cloneRange(), + tmpNode, + block = domUtils.isBlockElm; + + while (current && current !== bk.end && (domUtils.getPosition(current, bk.end) & domUtils.POSITION_PRECEDING)) { + + if (current.nodeType == 3 || dtd.li[current.tagName]) { + if (current.nodeType == 1 && dtd.$list[current.tagName]) { + while (current.firstChild) { + frag.appendChild(current.firstChild); + } + tmpNode = domUtils.getNextDomNode(current, false, filterFn); + domUtils.remove(current); + current = tmpNode; + continue; + + } + tmpNode = current; + tmpRange.setStartBefore(current); + + while (current && current !== bk.end && (!block(current) || domUtils.isBookmarkNode(current) )) { + tmpNode = current; + current = domUtils.getNextDomNode(current, false, null, function (node) { + return !notExchange[node.tagName]; + }); + } + + if (current && block(current)) { + tmp = domUtils.getNextDomNode(tmpNode, false, filterFn); + if (tmp && domUtils.isBookmarkNode(tmp)) { + current = domUtils.getNextDomNode(tmp, false, filterFn); + tmpNode = tmp; + } + } + tmpRange.setEndAfter(tmpNode); + + current = domUtils.getNextDomNode(tmpNode, false, filterFn); + + var li = range.document.createElement('li'); + + li.appendChild(tmpRange.extractContents()); + if(domUtils.isEmptyNode(li)){ + var tmpNode = range.document.createElement('p'); + while(li.firstChild){ + tmpNode.appendChild(li.firstChild) + } + li.appendChild(tmpNode); + } + frag.appendChild(li); + } else { + current = domUtils.getNextDomNode(current, true, filterFn); + } + } + range.moveToBookmark(bk).collapse(true); + list = me.document.createElement(tag); + setListStyle(list,style); + list.appendChild(frag); + range.insertNode(list); + //当前list上下看能否合并 + adjustList(list, tag, style); + //去掉冗余的tmpDiv + for (var i = 0, ci, tmpDivs = domUtils.getElementsByTagName(list, 'div'); ci = tmpDivs[i++];) { + if (ci.getAttribute('tmpDiv')) { + domUtils.remove(ci, true) + } + } + range.moveToBookmark(bko).select(); + + }, + queryCommandState:function (command) { + var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; + var path = this.selection.getStartElementPath(); + for(var i= 0,ci;ci = path[i++];){ + if(ci.nodeName == 'TABLE'){ + return 0 + } + if(tag == ci.nodeName.toLowerCase()){ + return 1 + }; + } + return 0; + + }, + queryCommandValue:function (command) { + var tag = command.toLowerCase() == 'insertorderedlist' ? 'ol' : 'ul'; + var path = this.selection.getStartElementPath(), + node; + for(var i= 0,ci;ci = path[i++];){ + if(ci.nodeName == 'TABLE'){ + node = null; + break; + } + if(tag == ci.nodeName.toLowerCase()){ + node = ci; + break; + }; + } + return node ? getStyle(node) || domUtils.getComputedStyle(node, 'list-style-type') : null; + } + }; +}; + + + +// plugins/source.js +/** + * 源码编辑插件 + * @file + * @since 1.2.6.1 + */ + +(function (){ + var sourceEditors = { + textarea: function (editor, holder){ + var textarea = holder.ownerDocument.createElement('textarea'); + textarea.style.cssText = 'position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;'; + // todo: IE下只有onresize属性可用... 很纠结 + if (browser.ie && browser.version < 8) { + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + holder.onresize = function (){ + textarea.style.width = holder.offsetWidth + 'px'; + textarea.style.height = holder.offsetHeight + 'px'; + }; + } + holder.appendChild(textarea); + return { + setContent: function (content){ + textarea.value = content; + }, + getContent: function (){ + return textarea.value; + }, + select: function (){ + var range; + if (browser.ie) { + range = textarea.createTextRange(); + range.collapse(true); + range.select(); + } else { + //todo: chrome下无法设置焦点 + textarea.setSelectionRange(0, 0); + textarea.focus(); + } + }, + dispose: function (){ + holder.removeChild(textarea); + // todo + holder.onresize = null; + textarea = null; + holder = null; + } + }; + }, + codemirror: function (editor, holder){ + + var codeEditor = window.CodeMirror(holder, { + mode: "text/html", + tabMode: "indent", + lineNumbers: true, + lineWrapping:true + }); + var dom = codeEditor.getWrapperElement(); + dom.style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;'; + codeEditor.getScrollerElement().style.cssText = 'position:absolute;left:0;top:0;width:100%;height:100%;'; + codeEditor.refresh(); + return { + getCodeMirror:function(){ + return codeEditor; + }, + setContent: function (content){ + codeEditor.setValue(content); + }, + getContent: function (){ + return codeEditor.getValue(); + }, + select: function (){ + codeEditor.focus(); + }, + dispose: function (){ + holder.removeChild(dom); + dom = null; + codeEditor = null; + } + }; + } + }; + + UE.plugins['source'] = function (){ + var me = this; + var opt = this.options; + var sourceMode = false; + var sourceEditor; + var orgSetContent; + opt.sourceEditor = browser.ie ? 'textarea' : (opt.sourceEditor || 'codemirror'); + + me.setOpt({ + sourceEditorFirst:false + }); + function createSourceEditor(holder){ + return sourceEditors[opt.sourceEditor == 'codemirror' && window.CodeMirror ? 'codemirror' : 'textarea'](me, holder); + } + + var bakCssText; + //解决在源码模式下getContent不能得到最新的内容问题 + var oldGetContent, + bakAddress; + + /** + * 切换源码模式和编辑模式 + * @command source + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'source'); + * ``` + */ + + /** + * 查询当前编辑区域的状态是源码模式还是可视化模式 + * @command source + * @method queryCommandState + * @param { String } cmd 命令字符串 + * @return { int } 如果当前是源码编辑模式,返回1,否则返回0 + * @example + * ```javascript + * editor.queryCommandState( 'source' ); + * ``` + */ + + me.commands['source'] = { + execCommand: function (){ + + sourceMode = !sourceMode; + if (sourceMode) { + bakAddress = me.selection.getRange().createAddress(false,true); + me.undoManger && me.undoManger.save(true); + if(browser.gecko){ + me.body.contentEditable = false; + } + + bakCssText = me.iframe.style.cssText; + me.iframe.style.cssText += 'position:absolute;left:-32768px;top:-32768px;'; + + + me.fireEvent('beforegetcontent'); + var root = UE.htmlparser(me.body.innerHTML); + me.filterOutputRule(root); + root.traversal(function (node) { + if (node.type == 'element') { + switch (node.tagName) { + case 'td': + case 'th': + case 'caption': + if(node.children && node.children.length == 1){ + if(node.firstChild().tagName == 'br' ){ + node.removeChild(node.firstChild()) + } + }; + break; + case 'pre': + node.innerText(node.innerText().replace(/ /g,' ')) + + } + } + }); + + me.fireEvent('aftergetcontent'); + + var content = root.toHtml(true); + + sourceEditor = createSourceEditor(me.iframe.parentNode); + + sourceEditor.setContent(content); + + orgSetContent = me.setContent; + + me.setContent = function(html){ + //这里暂时不触发事件,防止报错 + var root = UE.htmlparser(html); + me.filterInputRule(root); + html = root.toHtml(); + sourceEditor.setContent(html); + }; + + setTimeout(function (){ + sourceEditor.select(); + me.addListener('fullscreenchanged', function(){ + try{ + sourceEditor.getCodeMirror().refresh() + }catch(e){} + }); + }); + + //重置getContent,源码模式下取值也能是最新的数据 + oldGetContent = me.getContent; + me.getContent = function (){ + return sourceEditor.getContent() || '

            ' + (browser.ie ? '' : '
            ')+'

            '; + }; + } else { + me.iframe.style.cssText = bakCssText; + var cont = sourceEditor.getContent() || '

            ' + (browser.ie ? '' : '
            ')+'

            '; + //处理掉block节点前后的空格,有可能会误命中,暂时不考虑 + cont = cont.replace(new RegExp('[\\r\\t\\n ]*<\/?(\\w+)\\s*(?:[^>]*)>','g'), function(a,b){ + if(b && !dtd.$inlineWithA[b.toLowerCase()]){ + return a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,''); + } + return a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,'') + }); + + me.setContent = orgSetContent; + + me.setContent(cont); + sourceEditor.dispose(); + sourceEditor = null; + //还原getContent方法 + me.getContent = oldGetContent; + var first = me.body.firstChild; + //trace:1106 都删除空了,下边会报错,所以补充一个p占位 + if(!first){ + me.body.innerHTML = '

            '+(browser.ie?'':'
            ')+'

            '; + first = me.body.firstChild; + } + + + //要在ifm为显示时ff才能取到selection,否则报错 + //这里不能比较位置了 + me.undoManger && me.undoManger.save(true); + + if(browser.gecko){ + + var input = document.createElement('input'); + input.style.cssText = 'position:absolute;left:0;top:-32768px'; + + document.body.appendChild(input); + + me.body.contentEditable = false; + setTimeout(function(){ + domUtils.setViewportOffset(input, { left: -32768, top: 0 }); + input.focus(); + setTimeout(function(){ + me.body.contentEditable = true; + me.selection.getRange().moveToAddress(bakAddress).select(true); + domUtils.remove(input); + }); + + }); + }else{ + //ie下有可能报错,比如在代码顶头的情况 + try{ + me.selection.getRange().moveToAddress(bakAddress).select(true); + }catch(e){} + + } + } + this.fireEvent('sourcemodechanged', sourceMode); + }, + queryCommandState: function (){ + return sourceMode|0; + }, + notNeedUndo : 1 + }; + var oldQueryCommandState = me.queryCommandState; + + me.queryCommandState = function (cmdName){ + cmdName = cmdName.toLowerCase(); + if (sourceMode) { + //源码模式下可以开启的命令 + return cmdName in { + 'source' : 1, + 'fullscreen' : 1 + } ? 1 : -1 + } + return oldQueryCommandState.apply(this, arguments); + }; + + if(opt.sourceEditor == "codemirror"){ + + me.addListener("ready",function(){ + utils.loadFile(document,{ + src : opt.codeMirrorJsUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + if(opt.sourceEditorFirst){ + setTimeout(function(){ + me.execCommand("source"); + },0); + } + }); + utils.loadFile(document,{ + tag : "link", + rel : "stylesheet", + type : "text/css", + href : opt.codeMirrorCssUrl || opt.UEDITOR_HOME_URL + "third-party/codemirror/codemirror.css" + }); + + }); + } + + }; + +})(); + +// plugins/enterkey.js +///import core +///import plugins/undo.js +///commands 设置回车标签p或br +///commandsName EnterKey +///commandsTitle 设置回车标签p或br +/** + * @description 处理回车 + * @author zhanyi + */ +UE.plugins['enterkey'] = function() { + var hTag, + me = this, + tag = me.options.enterTag; + me.addListener('keyup', function(type, evt) { + + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) { + var range = me.selection.getRange(), + start = range.startContainer, + doSave; + + //修正在h1-h6里边回车后不能嵌套p的问题 + if (!browser.ie) { + + if (/h\d/i.test(hTag)) { + if (browser.gecko) { + var h = domUtils.findParentByTagName(start, [ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption','table'], true); + if (!h) { + me.document.execCommand('formatBlock', false, '

            '); + doSave = 1; + } + } else { + //chrome remove div + if (start.nodeType == 1) { + var tmp = me.document.createTextNode(''),div; + range.insertNode(tmp); + div = domUtils.findParentByTagName(tmp, 'div', true); + if (div) { + var p = me.document.createElement('p'); + while (div.firstChild) { + p.appendChild(div.firstChild); + } + div.parentNode.insertBefore(p, div); + domUtils.remove(div); + range.setStartBefore(tmp).setCursor(); + doSave = 1; + } + domUtils.remove(tmp); + + } + } + + if (me.undoManger && doSave) { + me.undoManger.save(); + } + } + //没有站位符,会出现多行的问题 + browser.opera && range.select(); + }else{ + me.fireEvent('saveScene',true,true) + } + } + }); + + me.addListener('keydown', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + if (keyCode == 13) {//回车 + if(me.fireEvent('beforeenterkeydown')){ + domUtils.preventDefault(evt); + return; + } + me.fireEvent('saveScene',true,true); + hTag = ''; + + + var range = me.selection.getRange(); + + if (!range.collapsed) { + //跨td不能删 + var start = range.startContainer, + end = range.endContainer, + startTd = domUtils.findParentByTagName(start, 'td', true), + endTd = domUtils.findParentByTagName(end, 'td', true); + if (startTd && endTd && startTd !== endTd || !startTd && endTd || startTd && !endTd) { + evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); + return; + } + } + if (tag == 'p') { + + + if (!browser.ie) { + + start = domUtils.findParentByTagName(range.startContainer, ['ol','ul','p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6','blockquote','caption'], true); + + //opera下执行formatblock会在table的场景下有问题,回车在opera原生支持很好,所以暂时在opera去掉调用这个原生的command + //trace:2431 + if (!start && !browser.opera) { + + me.document.execCommand('formatBlock', false, '

            '); + + if (browser.gecko) { + range = me.selection.getRange(); + start = domUtils.findParentByTagName(range.startContainer, 'p', true); + start && domUtils.removeDirtyAttr(start); + } + + + } else { + hTag = start.tagName; + start.tagName.toLowerCase() == 'p' && browser.gecko && domUtils.removeDirtyAttr(start); + } + + } + + } else { + evt.preventDefault ? evt.preventDefault() : ( evt.returnValue = false); + + if (!range.collapsed) { + range.deleteContents(); + start = range.startContainer; + if (start.nodeType == 1 && (start = start.childNodes[range.startOffset])) { + while (start.nodeType == 1) { + if (dtd.$empty[start.tagName]) { + range.setStartBefore(start).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + if (!start.firstChild) { + var br = range.document.createElement('br'); + start.appendChild(br); + range.setStart(start, 0).setCursor(); + if (me.undoManger) { + me.undoManger.save(); + } + return false; + } + start = start.firstChild; + } + if (start === range.startContainer.childNodes[range.startOffset]) { + br = range.document.createElement('br'); + range.insertNode(br).setCursor(); + + } else { + range.setStart(start, 0).setCursor(); + } + + + } else { + br = range.document.createElement('br'); + range.insertNode(br).setStartAfter(br).setCursor(); + } + + + } else { + br = range.document.createElement('br'); + range.insertNode(br); + var parent = br.parentNode; + if (parent.lastChild === br) { + br.parentNode.insertBefore(br.cloneNode(true), br); + range.setStartBefore(br); + } else { + range.setStartAfter(br); + } + range.setCursor(); + + } + + } + + } + }); +}; + + +// plugins/keystrokes.js +/* 处理特殊键的兼容性问题 */ +UE.plugins['keystrokes'] = function() { + var me = this; + var collapsed = true; + me.addListener('keydown', function(type, evt) { + var keyCode = evt.keyCode || evt.which, + rng = me.selection.getRange(); + + //处理全选的情况 + if(!rng.collapsed && !(evt.ctrlKey || evt.shiftKey || evt.altKey || evt.metaKey) && (keyCode >= 65 && keyCode <=90 + || keyCode >= 48 && keyCode <= 57 || + keyCode >= 96 && keyCode <= 111 || { + 13:1, + 8:1, + 46:1 + }[keyCode]) + ){ + + var tmpNode = rng.startContainer; + if(domUtils.isFillChar(tmpNode)){ + rng.setStartBefore(tmpNode) + } + tmpNode = rng.endContainer; + if(domUtils.isFillChar(tmpNode)){ + rng.setEndAfter(tmpNode) + } + rng.txtToElmBoundary(); + //结束边界可能放到了br的前边,要把br包含进来 + // x[xxx]
            + if(rng.endContainer && rng.endContainer.nodeType == 1){ + tmpNode = rng.endContainer.childNodes[rng.endOffset]; + if(tmpNode && domUtils.isBr(tmpNode)){ + rng.setEndAfter(tmpNode); + } + } + if(rng.startOffset == 0){ + tmpNode = rng.startContainer; + if(domUtils.isBoundaryNode(tmpNode,'firstChild') ){ + tmpNode = rng.endContainer; + if(rng.endOffset == (tmpNode.nodeType == 3 ? tmpNode.nodeValue.length : tmpNode.childNodes.length) && domUtils.isBoundaryNode(tmpNode,'lastChild')){ + me.fireEvent('saveScene'); + me.body.innerHTML = '

            '+(browser.ie ? '' : '
            ')+'

            '; + rng.setStart(me.body.firstChild,0).setCursor(false,true); + me._selectionChange(); + return; + } + } + } + } + + //处理backspace + if (keyCode == keymap.Backspace) { + rng = me.selection.getRange(); + collapsed = rng.collapsed; + if(me.fireEvent('delkeydown',evt)){ + return; + } + var start,end; + //避免按两次删除才能生效的问题 + if(rng.collapsed && rng.inFillChar()){ + start = rng.startContainer; + + if(domUtils.isFillChar(start)){ + rng.setStartBefore(start).shrinkBoundary(true).collapse(true); + domUtils.remove(start) + }else{ + start.nodeValue = start.nodeValue.replace(new RegExp('^' + domUtils.fillChar ),''); + rng.startOffset--; + rng.collapse(true).select(true) + } + } + + //解决选中control元素不能删除的问题 + if (start = rng.getClosedNode()) { + me.fireEvent('saveScene'); + rng.setStartBefore(start); + domUtils.remove(start); + rng.setCursor(); + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + return; + } + //阻止在table上的删除 + if (!browser.ie) { + start = domUtils.findParentByTagName(rng.startContainer, 'table', true); + end = domUtils.findParentByTagName(rng.endContainer, 'table', true); + if (start && !end || !start && end || start !== end) { + evt.preventDefault(); + return; + } + } + + } + //处理tab键的逻辑 + if (keyCode == keymap.Tab) { + //不处理以下标签 + var excludeTagNameForTabKey = { + 'ol' : 1, + 'ul' : 1, + 'table':1 + }; + //处理组件里的tab按下事件 + if(me.fireEvent('tabkeydown',evt)){ + domUtils.preventDefault(evt); + return; + } + var range = me.selection.getRange(); + me.fireEvent('saveScene'); + for (var i = 0,txt = '',tabSize = me.options.tabSize|| 4,tabNode = me.options.tabNode || ' '; i < tabSize; i++) { + txt += tabNode; + } + var span = me.document.createElement('span'); + span.innerHTML = txt + domUtils.fillChar; + if (range.collapsed) { + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var filterFn = function(node) { + return domUtils.isBlockElm(node) && !excludeTagNameForTabKey[node.tagName.toLowerCase()] + + }; + //普通的情况 + start = domUtils.findParent(range.startContainer, filterFn,true); + end = domUtils.findParent(range.endContainer, filterFn,true); + if (start && end && start === end) { + range.deleteContents(); + range.insertNode(span.cloneNode(true).firstChild).setCursor(true); + } else { + var bookmark = range.createBookmark(); + range.enlarge(true); + var bookmark2 = range.createBookmark(), + current = domUtils.getNextDomNode(bookmark2.start, false, filterFn); + while (current && !(domUtils.getPosition(current, bookmark2.end) & domUtils.POSITION_FOLLOWING)) { + current.insertBefore(span.cloneNode(true).firstChild, current.firstChild); + current = domUtils.getNextDomNode(current, false, filterFn); + } + range.moveToBookmark(bookmark2).moveToBookmark(bookmark).select(); + } + } + domUtils.preventDefault(evt) + } + //trace:1634 + //ff的del键在容器空的时候,也会删除 + if(browser.gecko && keyCode == 46){ + range = me.selection.getRange(); + if(range.collapsed){ + start = range.startContainer; + if(domUtils.isEmptyBlock(start)){ + var parent = start.parentNode; + while(domUtils.getChildCount(parent) == 1 && !domUtils.isBody(parent)){ + start = parent; + parent = parent.parentNode; + } + if(start === parent.lastChild) + evt.preventDefault(); + return; + } + } + } + }); + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which, + rng,me = this; + if(keyCode == keymap.Backspace){ + if(me.fireEvent('delkeyup')){ + return; + } + rng = me.selection.getRange(); + if(rng.collapsed){ + var tmpNode, + autoClearTagName = ['h1','h2','h3','h4','h5','h6']; + if(tmpNode = domUtils.findParentByTagName(rng.startContainer,autoClearTagName,true)){ + if(domUtils.isEmptyBlock(tmpNode)){ + var pre = tmpNode.previousSibling; + if(pre && pre.nodeName != 'TABLE'){ + domUtils.remove(tmpNode); + rng.setStartAtLast(pre).setCursor(false,true); + return; + }else{ + var next = tmpNode.nextSibling; + if(next && next.nodeName != 'TABLE'){ + domUtils.remove(tmpNode); + rng.setStartAtFirst(next).setCursor(false,true); + return; + } + } + } + } + //处理当删除到body时,要重新给p标签展位 + if(domUtils.isBody(rng.startContainer)){ + var tmpNode = domUtils.createElement(me.document,'p',{ + 'innerHTML' : browser.ie ? domUtils.fillChar : '
            ' + }); + rng.insertNode(tmpNode).setStart(tmpNode,0).setCursor(false,true); + } + } + + + //chrome下如果删除了inline标签,浏览器会有记忆,在输入文字还是会套上刚才删除的标签,所以这里再选一次就不会了 + if( !collapsed && (rng.startContainer.nodeType == 3 || rng.startContainer.nodeType == 1 && domUtils.isEmptyBlock(rng.startContainer))){ + if(browser.ie){ + var span = rng.document.createElement('span'); + rng.insertNode(span).setStartBefore(span).collapse(true); + rng.select(); + domUtils.remove(span) + }else{ + rng.select() + } + + } + } + + + }) +}; + +// plugins/fiximgclick.js +///import core +///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小 +///commandsName FixImgClick +///commandsTitle 修复chrome下图片不能点击的问题,出现八个角可改变大小 +//修复chrome下图片不能点击的问题,出现八个角可改变大小 + +UE.plugins['fiximgclick'] = (function () { + + var elementUpdated = false; + function Scale() { + this.editor = null; + this.resizer = null; + this.cover = null; + this.doc = document; + this.prePos = {x: 0, y: 0}; + this.startPos = {x: 0, y: 0}; + } + + (function () { + var rect = [ + //[left, top, width, height] + [0, 0, -1, -1], + [0, 0, 0, -1], + [0, 0, 1, -1], + [0, 0, -1, 0], + [0, 0, 1, 0], + [0, 0, -1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1] + ]; + + Scale.prototype = { + init: function (editor) { + var me = this; + me.editor = editor; + me.startPos = this.prePos = {x: 0, y: 0}; + me.dragId = -1; + + var hands = [], + cover = me.cover = document.createElement('div'), + resizer = me.resizer = document.createElement('div'); + + cover.id = me.editor.ui.id + '_imagescale_cover'; + cover.style.cssText = 'position:absolute;display:none;z-index:' + (me.editor.options.zIndex) + ';filter:alpha(opacity=0); opacity:0;background:#CCC;'; + domUtils.on(cover, 'mousedown click', function () { + me.hide(); + }); + + for (i = 0; i < 8; i++) { + hands.push(''); + } + resizer.id = me.editor.ui.id + '_imagescale'; + resizer.className = 'edui-editor-imagescale'; + resizer.innerHTML = hands.join(''); + resizer.style.cssText += ';display:none;border:1px solid #3b77ff;z-index:' + (me.editor.options.zIndex) + ';'; + + me.editor.ui.getDom().appendChild(cover); + me.editor.ui.getDom().appendChild(resizer); + + me.initStyle(); + me.initEvents(); + }, + initStyle: function () { + utils.cssRule('imagescale', '.edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}' + + '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}' + + '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}'); + }, + initEvents: function () { + var me = this; + + me.startPos.x = me.startPos.y = 0; + me.isDraging = false; + }, + _eventHandler: function (e) { + var me = this; + switch (e.type) { + case 'mousedown': + var hand = e.target || e.srcElement, hand; + if (hand.className.indexOf('edui-editor-imagescale-hand') != -1 && me.dragId == -1) { + me.dragId = hand.className.slice(-1); + me.startPos.x = me.prePos.x = e.clientX; + me.startPos.y = me.prePos.y = e.clientY; + domUtils.on(me.doc,'mousemove', me.proxy(me._eventHandler, me)); + } + break; + case 'mousemove': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); + me.prePos.x = e.clientX; + me.prePos.y = e.clientY; + elementUpdated = true; + me.updateTargetElement(); + + } + break; + case 'mouseup': + if (me.dragId != -1) { + me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y}); + me.updateTargetElement(); + if (me.target.parentNode) me.attachTo(me.target); + me.dragId = -1; + } + domUtils.un(me.doc,'mousemove', me.proxy(me._eventHandler, me)); + //修复只是点击挪动点,但没有改变大小,不应该触发contentchange + if(elementUpdated){ + elementUpdated = false; + me.editor.fireEvent('contentchange'); + } + + break; + default: + break; + } + }, + updateTargetElement: function () { + var me = this; + domUtils.setStyles(me.target, { + 'width': me.resizer.style.width, + 'height': me.resizer.style.height + }); + me.target.width = parseInt(me.resizer.style.width); + me.target.height = parseInt(me.resizer.style.height); + me.attachTo(me.target); + }, + updateContainerStyle: function (dir, offset) { + var me = this, + dom = me.resizer, tmp; + + if (rect[dir][0] != 0) { + tmp = parseInt(dom.style.left) + offset.x; + dom.style.left = me._validScaledProp('left', tmp) + 'px'; + } + if (rect[dir][1] != 0) { + tmp = parseInt(dom.style.top) + offset.y; + dom.style.top = me._validScaledProp('top', tmp) + 'px'; + } + if (rect[dir][2] != 0) { + tmp = dom.clientWidth + rect[dir][2] * offset.x; + dom.style.width = me._validScaledProp('width', tmp) + 'px'; + } + if (rect[dir][3] != 0) { + tmp = dom.clientHeight + rect[dir][3] * offset.y; + dom.style.height = me._validScaledProp('height', tmp) + 'px'; + } + }, + _validScaledProp: function (prop, value) { + var ele = this.resizer, + wrap = document; + + value = isNaN(value) ? 0 : value; + switch (prop) { + case 'left': + return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value; + case 'top': + return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value; + case 'width': + return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value; + case 'height': + return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value; + } + }, + hideCover: function () { + this.cover.style.display = 'none'; + }, + showCover: function () { + var me = this, + editorPos = domUtils.getXY(me.editor.ui.getDom()), + iframePos = domUtils.getXY(me.editor.iframe); + + domUtils.setStyles(me.cover, { + 'width': me.editor.iframe.offsetWidth + 'px', + 'height': me.editor.iframe.offsetHeight + 'px', + 'top': iframePos.y - editorPos.y + 'px', + 'left': iframePos.x - editorPos.x + 'px', + 'position': 'absolute', + 'display': '' + }) + }, + show: function (targetObj) { + var me = this; + me.resizer.style.display = 'block'; + if(targetObj) me.attachTo(targetObj); + + domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me)); + domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); + + me.showCover(); + me.editor.fireEvent('afterscaleshow', me); + me.editor.fireEvent('saveScene'); + }, + hide: function () { + var me = this; + me.hideCover(); + me.resizer.style.display = 'none'; + + domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me)); + domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me)); + me.editor.fireEvent('afterscalehide', me); + }, + proxy: function( fn, context ) { + return function(e) { + return fn.apply( context || this, arguments); + }; + }, + attachTo: function (targetObj) { + var me = this, + target = me.target = targetObj, + resizer = this.resizer, + imgPos = domUtils.getXY(target), + iframePos = domUtils.getXY(me.editor.iframe), + editorPos = domUtils.getXY(resizer.parentNode); + + domUtils.setStyles(resizer, { + 'width': target.width + 'px', + 'height': target.height + 'px', + 'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px', + 'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px' + }); + } + } + })(); + + return function () { + var me = this, + imageScale; + + me.setOpt('imageScaleEnabled', true); + + if ( !browser.ie && me.options.imageScaleEnabled) { + me.addListener('click', function (type, e) { + + var range = me.selection.getRange(), + img = range.getClosedNode(); + + if (img && img.tagName == 'IMG' && me.body.contentEditable!="false") { + + if (img.className.indexOf("edui-faked-music") != -1 || + img.getAttribute("anchorname") || + domUtils.hasClass(img, 'loadingclass') || + domUtils.hasClass(img, 'loaderrorclass')) { return } + + if (!imageScale) { + imageScale = new Scale(); + imageScale.init(me); + me.ui.getDom().appendChild(imageScale.resizer); + + var _keyDownHandler = function (e) { + imageScale.hide(); + if(imageScale.target) me.selection.getRange().selectNode(imageScale.target).select(); + }, _mouseDownHandler = function (e) { + var ele = e.target || e.srcElement; + if (ele && (ele.className===undefined || ele.className.indexOf('edui-editor-imagescale') == -1)) { + _keyDownHandler(e); + } + }, timer; + + me.addListener('afterscaleshow', function (e) { + me.addListener('beforekeydown', _keyDownHandler); + me.addListener('beforemousedown', _mouseDownHandler); + domUtils.on(document, 'keydown', _keyDownHandler); + domUtils.on(document,'mousedown', _mouseDownHandler); + me.selection.getNative().removeAllRanges(); + }); + me.addListener('afterscalehide', function (e) { + me.removeListener('beforekeydown', _keyDownHandler); + me.removeListener('beforemousedown', _mouseDownHandler); + domUtils.un(document, 'keydown', _keyDownHandler); + domUtils.un(document,'mousedown', _mouseDownHandler); + var target = imageScale.target; + if (target.parentNode) { + me.selection.getRange().selectNode(target).select(); + } + }); + //TODO 有iframe的情况,mousedown不能往下传。。 + domUtils.on(imageScale.resizer, 'mousedown', function (e) { + me.selection.getNative().removeAllRanges(); + var ele = e.target || e.srcElement; + if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { + timer = setTimeout(function () { + imageScale.hide(); + if(imageScale.target) me.selection.getRange().selectNode(ele).select(); + }, 200); + } + }); + domUtils.on(imageScale.resizer, 'mouseup', function (e) { + var ele = e.target || e.srcElement; + if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) { + clearTimeout(timer); + } + }); + } + imageScale.show(img); + } else { + if (imageScale && imageScale.resizer.style.display != 'none') imageScale.hide(); + } + }); + } + + if (browser.webkit) { + me.addListener('click', function (type, e) { + if (e.target.tagName == 'IMG' && me.body.contentEditable!="false") { + var range = new dom.Range(me.document); + range.selectNode(e.target).select(); + } + }); + } + } +})(); + +// plugins/autolink.js +///import core +///commands 为非ie浏览器自动添加a标签 +///commandsName AutoLink +///commandsTitle 自动增加链接 +/** + * @description 为非ie浏览器自动添加a标签 + * @author zhanyi + */ + +UE.plugin.register('autolink',function(){ + var cont = 0; + + return !browser.ie ? { + + bindEvents:{ + 'reset' : function(){ + cont = 0; + }, + 'keydown':function(type, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + + var sel = me.selection.getNative(), + range = sel.getRangeAt(0).cloneRange(), + offset, + charCode; + + var start = range.startContainer; + while (start.nodeType == 1 && range.startOffset > 0) { + start = range.startContainer.childNodes[range.startOffset - 1]; + if (!start){ + break; + } + range.setStart(start, start.nodeType == 1 ? start.childNodes.length : start.nodeValue.length); + range.collapse(true); + start = range.startContainer; + } + + do{ + if (range.startOffset == 0) { + start = range.startContainer.previousSibling; + + while (start && start.nodeType == 1) { + start = start.lastChild; + } + if (!start || domUtils.isFillChar(start)){ + break; + } + offset = start.nodeValue.length; + } else { + start = range.startContainer; + offset = range.startOffset; + } + range.setStart(start, offset - 1); + charCode = range.toString().charCodeAt(0); + } while (charCode != 160 && charCode != 32); + + if (range.toString().replace(new RegExp(domUtils.fillChar, 'g'), '').match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)) { + while(range.toString().length){ + if(/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(range.toString())){ + break; + } + try{ + range.setStart(range.startContainer,range.startOffset+1); + }catch(e){ + //trace:2121 + var start = range.startContainer; + while(!(next = start.nextSibling)){ + if(domUtils.isBody(start)){ + return; + } + start = start.parentNode; + + } + range.setStart(next,0); + + } + + } + //range的开始边界已经在a标签里的不再处理 + if(domUtils.findParentByTagName(range.startContainer,'a',true)){ + return; + } + var a = me.document.createElement('a'),text = me.document.createTextNode(' '),href; + + me.undoManger && me.undoManger.save(); + a.appendChild(range.extractContents()); + a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g,''); + href = a.getAttribute("href").replace(new RegExp(domUtils.fillChar,'g'),''); + href = /^(?:https?:\/\/)/ig.test(href) ? href : "http://"+ href; + a.setAttribute('_src',utils.html(href)); + a.href = utils.html(href); + + range.insertNode(a); + a.parentNode.insertBefore(text, a.nextSibling); + range.setStart(text, 0); + range.collapse(true); + sel.removeAllRanges(); + sel.addRange(range); + me.undoManger && me.undoManger.save(); + } + } + } + } + }:{} + },function(){ + var keyCodes = { + 37:1, 38:1, 39:1, 40:1, + 13:1,32:1 + }; + function checkIsCludeLink(node){ + if(node.nodeType == 3){ + return null + } + if(node.nodeName == 'A'){ + return node; + } + var lastChild = node.lastChild; + + while(lastChild){ + if(lastChild.nodeName == 'A'){ + return lastChild; + } + if(lastChild.nodeType == 3){ + if(domUtils.isWhitespace(lastChild)){ + lastChild = lastChild.previousSibling; + continue; + } + return null + } + lastChild = lastChild.lastChild; + } + } + browser.ie && this.addListener('keyup',function(cmd,evt){ + var me = this,keyCode = evt.keyCode; + if(keyCodes[keyCode]){ + var rng = me.selection.getRange(); + var start = rng.startContainer; + + if(keyCode == 13){ + while(start && !domUtils.isBody(start) && !domUtils.isBlockElm(start)){ + start = start.parentNode; + } + if(start && !domUtils.isBody(start) && start.nodeName == 'P'){ + var pre = start.previousSibling; + if(pre && pre.nodeType == 1){ + var pre = checkIsCludeLink(pre); + if(pre && !pre.getAttribute('_href')){ + domUtils.remove(pre,true); + } + } + } + }else if(keyCode == 32 ){ + if(start.nodeType == 3 && /^\s$/.test(start.nodeValue)){ + start = start.previousSibling; + if(start && start.nodeName == 'A' && !start.getAttribute('_href')){ + domUtils.remove(start,true); + } + } + }else { + start = domUtils.findParentByTagName(start,'a',true); + if(start && !start.getAttribute('_href')){ + var bk = rng.createBookmark(); + + domUtils.remove(start,true); + rng.moveToBookmark(bk).select(true) + } + } + + } + + + }); + } +); + +// plugins/autoheight.js +///import core +///commands 当输入内容超过编辑器高度时,编辑器自动增高 +///commandsName AutoHeight,autoHeightEnabled +///commandsTitle 自动增高 +/** + * @description 自动伸展 + * @author zhanyi + */ +UE.plugins['autoheight'] = function () { + var me = this; + //提供开关,就算加载也可以关闭 + me.autoHeightEnabled = me.options.autoHeightEnabled !== false; + if (!me.autoHeightEnabled) { + return; + } + + var bakOverflow, + lastHeight = 0, + options = me.options, + currentHeight, + timer; + + function adjustHeight() { + var me = this; + clearTimeout(timer); + if(isFullscreen)return; + if (!me.queryCommandState || me.queryCommandState && me.queryCommandState('source') != 1) { + timer = setTimeout(function(){ + + var node = me.body.lastChild; + while(node && node.nodeType != 1){ + node = node.previousSibling; + } + if(node && node.nodeType == 1){ + node.style.clear = 'both'; + currentHeight = Math.max(domUtils.getXY(node).y + node.offsetHeight + 25 ,Math.max(options.minFrameHeight, options.initialFrameHeight)) ; + if (currentHeight != lastHeight) { + if (currentHeight !== parseInt(me.iframe.parentNode.style.height)) { + me.iframe.parentNode.style.height = currentHeight + 'px'; + } + me.body.style.height = currentHeight + 'px'; + lastHeight = currentHeight; + } + domUtils.removeStyle(node,'clear'); + } + + + },50) + } + } + var isFullscreen; + me.addListener('fullscreenchanged',function(cmd,f){ + isFullscreen = f + }); + me.addListener('destroy', function () { + me.removeListener('contentchange afterinserthtml keyup mouseup',adjustHeight) + }); + me.enableAutoHeight = function () { + var me = this; + if (!me.autoHeightEnabled) { + return; + } + var doc = me.document; + me.autoHeightEnabled = true; + bakOverflow = doc.body.style.overflowY; + doc.body.style.overflowY = 'hidden'; + me.addListener('contentchange afterinserthtml keyup mouseup',adjustHeight); + //ff不给事件算得不对 + + setTimeout(function () { + adjustHeight.call(me); + }, browser.gecko ? 100 : 0); + me.fireEvent('autoheightchanged', me.autoHeightEnabled); + }; + me.disableAutoHeight = function () { + + me.body.style.overflowY = bakOverflow || ''; + + me.removeListener('contentchange', adjustHeight); + me.removeListener('keyup', adjustHeight); + me.removeListener('mouseup', adjustHeight); + me.autoHeightEnabled = false; + me.fireEvent('autoheightchanged', me.autoHeightEnabled); + }; + + me.on('setHeight',function(){ + me.disableAutoHeight() + }); + me.addListener('ready', function () { + me.enableAutoHeight(); + //trace:1764 + var timer; + domUtils.on(browser.ie ? me.body : me.document, browser.webkit ? 'dragover' : 'drop', function () { + clearTimeout(timer); + timer = setTimeout(function () { + //trace:3681 + adjustHeight.call(me); + }, 100); + + }); + //修复内容过多时,回到顶部,顶部内容被工具栏遮挡问题 + var lastScrollY; + window.onscroll = function(){ + if(lastScrollY === null){ + lastScrollY = this.scrollY + }else if(this.scrollY == 0 && lastScrollY != 0){ + me.window.scrollTo(0,0); + lastScrollY = null; + } + } + }); + + +}; + + + +// plugins/autofloat.js +///import core +///commands 悬浮工具栏 +///commandsName AutoFloat,autoFloatEnabled +///commandsTitle 悬浮工具栏 +/** + * modified by chengchao01 + * 注意: 引入此功能后,在IE6下会将body的背景图片覆盖掉! + */ +UE.plugins['autofloat'] = function() { + var me = this, + lang = me.getLang(); + me.setOpt({ + topOffset:0 + }); + var optsAutoFloatEnabled = me.options.autoFloatEnabled !== false, + topOffset = me.options.topOffset; + + + //如果不固定toolbar的位置,则直接退出 + if(!optsAutoFloatEnabled){ + return; + } + var uiUtils = UE.ui.uiUtils, + LteIE6 = browser.ie && browser.version <= 6, + quirks = browser.quirks; + + function checkHasUI(){ + if(!UE.ui){ + alert(lang.autofloatMsg); + return 0; + } + return 1; + } + function fixIE6FixedPos(){ + var docStyle = document.body.style; + docStyle.backgroundImage = 'url("about:blank")'; + docStyle.backgroundAttachment = 'fixed'; + } + var bakCssText, + placeHolder = document.createElement('div'), + toolbarBox,orgTop, + getPosition, + flag =true; //ie7模式下需要偏移 + function setFloating(){ + var toobarBoxPos = domUtils.getXY(toolbarBox), + origalFloat = domUtils.getComputedStyle(toolbarBox,'position'), + origalLeft = domUtils.getComputedStyle(toolbarBox,'left'); + toolbarBox.style.width = toolbarBox.offsetWidth + 'px'; + toolbarBox.style.zIndex = me.options.zIndex * 1 + 1; + toolbarBox.parentNode.insertBefore(placeHolder, toolbarBox); + if (LteIE6 || (quirks && browser.ie)) { + if(toolbarBox.style.position != 'absolute'){ + toolbarBox.style.position = 'absolute'; + } + toolbarBox.style.top = (document.body.scrollTop||document.documentElement.scrollTop) - orgTop + topOffset + 'px'; + } else { + if (browser.ie7Compat && flag) { + flag = false; + toolbarBox.style.left = domUtils.getXY(toolbarBox).x - document.documentElement.getBoundingClientRect().left+2 + 'px'; + } + if(toolbarBox.style.position != 'fixed'){ + toolbarBox.style.position = 'fixed'; + toolbarBox.style.top = topOffset +"px"; + ((origalFloat == 'absolute' || origalFloat == 'relative') && parseFloat(origalLeft)) && (toolbarBox.style.left = toobarBoxPos.x + 'px'); + } + } + } + function unsetFloating(){ + flag = true; + if(placeHolder.parentNode){ + placeHolder.parentNode.removeChild(placeHolder); + } + + toolbarBox.style.cssText = bakCssText; + } + + function updateFloating(){ + var rect3 = getPosition(me.container); + var offset=me.options.toolbarTopOffset||0; + if (rect3.top < 0 && rect3.bottom - toolbarBox.offsetHeight > offset) { + setFloating(); + }else{ + unsetFloating(); + } + } + var defer_updateFloating = utils.defer(function(){ + updateFloating(); + },browser.ie ? 200 : 100,true); + + me.addListener('destroy',function(){ + domUtils.un(window, ['scroll','resize'], updateFloating); + me.removeListener('keydown', defer_updateFloating); + }); + + me.addListener('ready', function(){ + if(checkHasUI(me)){ + //加载了ui组件,但在new时,没有加载ui,导致编辑器实例上没有ui类,所以这里做判断 + if(!me.ui){ + return; + } + getPosition = uiUtils.getClientRect; + toolbarBox = me.ui.getDom('toolbarbox'); + orgTop = getPosition(toolbarBox).top; + bakCssText = toolbarBox.style.cssText; + placeHolder.style.height = toolbarBox.offsetHeight + 'px'; + if(LteIE6){ + fixIE6FixedPos(); + } + domUtils.on(window, ['scroll','resize'], updateFloating); + me.addListener('keydown', defer_updateFloating); + + me.addListener('beforefullscreenchange', function (t, enabled){ + if (enabled) { + unsetFloating(); + } + }); + me.addListener('fullscreenchanged', function (t, enabled){ + if (!enabled) { + updateFloating(); + } + }); + me.addListener('sourcemodechanged', function (t, enabled){ + setTimeout(function (){ + updateFloating(); + },0); + }); + me.addListener("clearDoc",function(){ + setTimeout(function(){ + updateFloating(); + },0); + + }) + } + }); +}; + + +// plugins/video.js +/** + * video插件, 为UEditor提供视频插入支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['video'] = function (){ + var me =this; + + /** + * 创建插入视频字符窜 + * @param url 视频地址 + * @param width 视频宽度 + * @param height 视频高度 + * @param align 视频对齐 + * @param toEmbed 是否以flash代替显示 + * @param addParagraph 是否需要添加P 标签 + */ + function creatInsertStr(url,width,height,id,align,classname,type){ + + url = utils.unhtmlForUrl(url); + align = utils.unhtml(align); + classname = utils.unhtml(classname); + + width = parseInt(width, 10) || 0; + height = parseInt(height, 10) || 0; + + var str; + switch (type){ + case 'image': + str = '' + break; + case 'embed': + str = ''; + break; + case 'video': + var ext = url.substr(url.lastIndexOf('.') + 1); + if(ext == 'ogv') ext = 'ogg'; + str = '' + + ''; + break; + } + return str; + } + + function switchImgAndVideo(root,img2video){ + utils.each(root.getNodesByTagName(img2video ? 'img' : 'embed video'),function(node){ + var className = node.getAttr('class'); + if(className && className.indexOf('edui-faked-video') != -1){ + var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'embed':'image'); + node.parentNode.replaceChild(UE.uNode.createElement(html),node); + } + if(className && className.indexOf('edui-upload-video') != -1){ + var html = creatInsertStr( img2video ? node.getAttr('_url') : node.getAttr('src'),node.getAttr('width'),node.getAttr('height'),null,node.getStyle('float') || '',className,img2video ? 'video':'image'); + node.parentNode.replaceChild(UE.uNode.createElement(html),node); + } + }) + } + + me.addOutputRule(function(root){ + switchImgAndVideo(root,true) + }); + me.addInputRule(function(root){ + switchImgAndVideo(root) + }); + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } videoAttr 键值对对象, 描述一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }; + * + * //editor 是编辑器实例 + * //向编辑器插入单个视频 + * editor.execCommand( 'insertvideo', videoAttr ); + * ``` + */ + + /** + * 插入视频 + * @command insertvideo + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Array } videoArr 需要插入的视频的数组, 其中的每一个元素都是一个键值对对象, 描述了一个视频的所有属性 + * @example + * ```javascript + * + * var videoAttr1 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * }, + * videoAttr2 = { + * //视频地址 + * url: 'http://www.youku.com/xxx', + * //视频宽高值, 单位px + * width: 200, + * height: 100 + * } + * + * //editor 是编辑器实例 + * //该方法将会向编辑器内插入两个视频 + * editor.execCommand( 'insertvideo', [ videoAttr1, videoAttr2 ] ); + * ``` + */ + + /** + * 查询当前光标所在处是否是一个视频 + * @command insertvideo + * @method queryCommandState + * @param { String } cmd 需要查询的命令字符串 + * @return { int } 如果当前光标所在处的元素是一个视频对象, 则返回1,否则返回0 + * @example + * ```javascript + * + * //editor 是编辑器实例 + * editor.queryCommandState( 'insertvideo' ); + * ``` + */ + me.commands["insertvideo"] = { + execCommand: function (cmd, videoObjs, type){ + videoObjs = utils.isArray(videoObjs)?videoObjs:[videoObjs]; + var html = [],id = 'tmpVedio', cl; + for(var i=0,vi,len = videoObjs.length;i 0) { + return 0; + } + for (var i in dtd.$isNotEmpty) if (dtd.$isNotEmpty.hasOwnProperty(i)) { + if (node.getElementsByTagName(i).length) { + return 0; + } + } + return 1; + }; + UETable.getWidth = function (cell) { + if (!cell)return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + }; + + /** + * 获取单元格或者单元格组的“对齐”状态。 如果当前的检测对象是一个单元格组, 只有在满足所有单元格的 水平和竖直 对齐属性都相同的 + * 条件时才会返回其状态值,否则将返回null; 如果当前只检测了一个单元格, 则直接返回当前单元格的对齐状态; + * @param table cell or table cells , 支持单个单元格dom对象 或者 单元格dom对象数组 + * @return { align: 'left' || 'right' || 'center', valign: 'top' || 'middle' || 'bottom' } 或者 null + */ + UETable.getTableCellAlignState = function ( cells ) { + + !utils.isArray( cells ) && ( cells = [cells] ); + + var result = {}, + status = ['align', 'valign'], + tempStatus = null, + isSame = true;//状态是否相同 + + utils.each( cells, function( cellNode ){ + + utils.each( status, function( currentState ){ + + tempStatus = cellNode.getAttribute( currentState ); + + if( !result[ currentState ] && tempStatus ) { + result[ currentState ] = tempStatus; + } else if( !result[ currentState ] || ( tempStatus !== result[ currentState ] ) ) { + isSame = false; + return false; + } + + } ); + + return isSame; + + }); + + return isSame ? result : null; + + }; + + /** + * 根据当前选区获取相关的table信息 + * @return {Object} + */ + UETable.getTableItemsByRange = function (editor) { + var start = editor.selection.getStart(); + + //ff下会选中bookmark + if( start && start.id && start.id.indexOf('_baidu_bookmark_start_') === 0 && start.nextSibling) { + start = start.nextSibling; + } + + //在table或者td边缘有可能存在选中tr的情况 + var cell = start && domUtils.findParentByTagName(start, ["td", "th"], true), + tr = cell && cell.parentNode, + caption = start && domUtils.findParentByTagName(start, 'caption', true), + table = caption ? caption.parentNode : tr && tr.parentNode.parentNode; + + return { + cell:cell, + tr:tr, + table:table, + caption:caption + } + }; + UETable.getUETableBySelected = function (editor) { + var table = UETable.getTableItemsByRange(editor).table; + if (table && table.ueTable && table.ueTable.selectedTds.length) { + return table.ueTable; + } + return null; + }; + + UETable.getDefaultValue = function (editor, table) { + var borderMap = { + thin:'0px', + medium:'1px', + thick:'2px' + }, + tableBorder, tdPadding, tdBorder, tmpValue; + if (!table) { + table = editor.document.createElement('table'); + table.insertRow(0).insertCell(0).innerHTML = 'xxx'; + editor.body.appendChild(table); + var td = table.getElementsByTagName('td')[0]; + tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'padding-left'); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + domUtils.remove(table); + return { + tableBorder:tableBorder, + tdPadding:tdPadding, + tdBorder:tdBorder + }; + } else { + td = table.getElementsByTagName('td')[0]; + tmpValue = domUtils.getComputedStyle(table, 'border-left-width'); + tableBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'padding-left'); + tdPadding = parseInt(borderMap[tmpValue] || tmpValue, 10); + tmpValue = domUtils.getComputedStyle(td, 'border-left-width'); + tdBorder = parseInt(borderMap[tmpValue] || tmpValue, 10); + return { + tableBorder:tableBorder, + tdPadding:tdPadding, + tdBorder:tdBorder + }; + } + }; + /** + * 根据当前点击的td或者table获取索引对象 + * @param tdOrTable + */ + UETable.getUETable = function (tdOrTable) { + var tag = tdOrTable.tagName.toLowerCase(); + tdOrTable = (tag == "td" || tag == "th" || tag == 'caption') ? domUtils.findParentByTagName(tdOrTable, "table", true) : tdOrTable; + if (!tdOrTable.ueTable) { + tdOrTable.ueTable = new UETable(tdOrTable); + } + return tdOrTable.ueTable; + }; + + UETable.cloneCell = function(cell,ignoreMerge,keepPro){ + if (!cell || utils.isString(cell)) { + return this.table.ownerDocument.createElement(cell || 'td'); + } + var flag = domUtils.hasClass(cell, "selectTdClass"); + flag && domUtils.removeClasses(cell, "selectTdClass"); + var tmpCell = cell.cloneNode(true); + if (ignoreMerge) { + tmpCell.rowSpan = tmpCell.colSpan = 1; + } + //去掉宽高 + !keepPro && domUtils.removeAttributes(tmpCell,'width height'); + !keepPro && domUtils.removeAttributes(tmpCell,'style'); + + tmpCell.style.borderLeftStyle = ""; + tmpCell.style.borderTopStyle = ""; + tmpCell.style.borderLeftColor = cell.style.borderRightColor; + tmpCell.style.borderLeftWidth = cell.style.borderRightWidth; + tmpCell.style.borderTopColor = cell.style.borderBottomColor; + tmpCell.style.borderTopWidth = cell.style.borderBottomWidth; + flag && domUtils.addClass(cell, "selectTdClass"); + return tmpCell; + } + + UETable.prototype = { + getMaxRows:function () { + var rows = this.table.rows, maxLen = 1; + for (var i = 0, row; row = rows[i]; i++) { + var currentMax = 1; + for (var j = 0, cj; cj = row.cells[j++];) { + currentMax = Math.max(cj.rowSpan || 1, currentMax); + } + maxLen = Math.max(currentMax + i, maxLen); + } + return maxLen; + }, + /** + * 获取当前表格的最大列数 + */ + getMaxCols:function () { + var rows = this.table.rows, maxLen = 0, cellRows = {}; + for (var i = 0, row; row = rows[i]; i++) { + var cellsNum = 0; + for (var j = 0, cj; cj = row.cells[j++];) { + cellsNum += (cj.colSpan || 1); + if (cj.rowSpan && cj.rowSpan > 1) { + for (var k = 1; k < cj.rowSpan; k++) { + if (!cellRows['row_' + (i + k)]) { + cellRows['row_' + (i + k)] = (cj.colSpan || 1); + } else { + cellRows['row_' + (i + k)]++ + } + } + + } + } + cellsNum += cellRows['row_' + i] || 0; + maxLen = Math.max(cellsNum, maxLen); + } + return maxLen; + }, + getCellColIndex:function (cell) { + + }, + /** + * 获取当前cell旁边的单元格, + * @param cell + * @param right + */ + getHSideCell:function (cell, right) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ((!right && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (right && (!len ? (cellInfo.colIndex == (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; + + previewRowIndex = !len ? cellInfo.rowIndex : range.beginRowIndex; + previewColIndex = !right ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) + : ( !len ? cellInfo.colIndex + 1 : range.endColIndex + 1); + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + getTabNextCell:function (cell, preRowIndex) { + var cellInfo = this.getCellInfo(cell), + rowIndex = preRowIndex || cellInfo.rowIndex, + colIndex = cellInfo.colIndex + 1 + (cellInfo.colSpan - 1), + nextCell; + try { + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } catch (e) { + try { + rowIndex = rowIndex * 1 + 1; + colIndex = 0; + nextCell = this.getCell(this.indexTable[rowIndex][colIndex].rowIndex, this.indexTable[rowIndex][colIndex].cellIndex); + } catch (e) { + } + } + return nextCell; + + }, + /** + * 获取视觉上的后置单元格 + * @param cell + * @param bottom + */ + getVSideCell:function (cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; + + nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) + : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + /** + * 获取相同结束位置的单元格,xOrY指代了是获取x轴相同还是y轴相同 + */ + getSameEndPosCells:function (cell, xOrY) { + try { + var flag = (xOrY.toLowerCase() === "x"), + end = domUtils.getXY(cell)[flag ? 'x' : 'y'] + cell["offset" + (flag ? 'Width' : 'Height')], + rows = this.table.rows, + cells = null, returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; tmpCell = cells[j++];) { + var tmpEnd = domUtils.getXY(tmpCell)[flag ? 'x' : 'y'] + tmpCell["offset" + (flag ? 'Width' : 'Height')]; + //对应行的td已经被上面行rowSpan了 + if (tmpEnd > end && flag) break; + if (cell == tmpCell || end == tmpEnd) { + //只获取单一的单元格 + //todo 仅获取单一单元格在特定情况下会造成returns为空,从而影响后续的拖拽实现,修正这个。需考虑性能 + if (tmpCell[flag ? "colSpan" : "rowSpan"] == 1) { + returns.push(tmpCell); + } + if (flag) break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + setCellContent:function (cell, content) { + cell.innerHTML = content || (browser.ie ? domUtils.fillChar : "
            "); + }, + cloneCell:UETable.cloneCell, + /** + * 获取跟当前单元格的右边竖线为左边的所有未合并单元格 + */ + getSameStartPosXCells:function (cell) { + try { + var start = domUtils.getXY(cell).x + cell.offsetWidth, + rows = this.table.rows, cells , returns = []; + for (var i = 0; i < this.rowsNum; i++) { + cells = rows[i].cells; + for (var j = 0, tmpCell; tmpCell = cells[j++];) { + var tmpStart = domUtils.getXY(tmpCell).x; + if (tmpStart > start) break; + if (tmpStart == start && tmpCell.colSpan == 1) { + returns.push(tmpCell); + break; + } + } + } + return returns; + } catch (e) { + showError(e); + } + }, + /** + * 更新table对应的索引表 + */ + update:function (table) { + this.table = table || this.table; + this.selectedTds = []; + this.cellsRange = {}; + this.indexTable = []; + var rows = this.table.rows, + rowsNum = this.getMaxRows(), + dNum = rowsNum - rows.length, + colsNum = this.getMaxCols(); + while (dNum--) { + this.table.insertRow(rows.length); + } + this.rowsNum = rowsNum; + this.colsNum = colsNum; + for (var i = 0, len = rows.length; i < len; i++) { + this.indexTable[i] = new Array(colsNum); + } + //填充索引表 + for (var rowIndex = 0, row; row = rows[rowIndex]; rowIndex++) { + for (var cellIndex = 0, cell, cells = row.cells; cell = cells[cellIndex]; cellIndex++) { + //修正整行被rowSpan时导致的行数计算错误 + if (cell.rowSpan > rowsNum) { + cell.rowSpan = rowsNum; + } + var colIndex = cellIndex, + rowSpan = cell.rowSpan || 1, + colSpan = cell.colSpan || 1; + //当已经被上一行rowSpan或者被前一列colSpan了,则跳到下一个单元格进行 + while (this.indexTable[rowIndex][colIndex]) colIndex++; + for (var j = 0; j < rowSpan; j++) { + for (var k = 0; k < colSpan; k++) { + this.indexTable[rowIndex + j][colIndex + k] = { + rowIndex:rowIndex, + cellIndex:cellIndex, + colIndex:colIndex, + rowSpan:rowSpan, + colSpan:colSpan + } + } + } + } + } + //修复残缺td + for (j = 0; j < rowsNum; j++) { + for (k = 0; k < colsNum; k++) { + if (this.indexTable[j][k] === undefined) { + row = rows[j]; + cell = row.cells[row.cells.length - 1]; + cell = cell ? cell.cloneNode(true) : this.table.ownerDocument.createElement("td"); + this.setCellContent(cell); + if (cell.colSpan !== 1)cell.colSpan = 1; + if (cell.rowSpan !== 1)cell.rowSpan = 1; + row.appendChild(cell); + this.indexTable[j][k] = { + rowIndex:j, + cellIndex:cell.cellIndex, + colIndex:k, + rowSpan:1, + colSpan:1 + } + } + } + } + //当框选后删除行或者列后撤销,需要重建选区。 + var tds = domUtils.getElementsByTagName(this.table, "td"), + selectTds = []; + utils.each(tds, function (td) { + if (domUtils.hasClass(td, "selectTdClass")) { + selectTds.push(td); + } + }); + if (selectTds.length) { + var start = selectTds[0], + end = selectTds[selectTds.length - 1], + startInfo = this.getCellInfo(start), + endInfo = this.getCellInfo(end); + this.selectedTds = selectTds; + this.cellsRange = { + beginRowIndex:startInfo.rowIndex, + beginColIndex:startInfo.colIndex, + endRowIndex:endInfo.rowIndex + endInfo.rowSpan - 1, + endColIndex:endInfo.colIndex + endInfo.colSpan - 1 + }; + } + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if(!domUtils.hasClass(this.table.rows[0], "firstRow")) { + domUtils.addClass(this.table.rows[0], "firstRow"); + for(var i = 1; i< this.table.rows.length; i++) { + domUtils.removeClasses(this.table.rows[i], "firstRow"); + } + } + }, + /** + * 获取单元格的索引信息 + */ + getCellInfo:function (cell) { + if (!cell) return; + var cellIndex = cell.cellIndex, + rowIndex = cell.parentNode.rowIndex, + rowInfo = this.indexTable[rowIndex], + numCols = this.colsNum; + for (var colIndex = cellIndex; colIndex < numCols; colIndex++) { + var cellInfo = rowInfo[colIndex]; + if (cellInfo.rowIndex === rowIndex && cellInfo.cellIndex === cellIndex) { + return cellInfo; + } + } + }, + /** + * 根据行列号获取单元格 + */ + getCell:function (rowIndex, cellIndex) { + return rowIndex < this.rowsNum && this.table.rows[rowIndex].cells[cellIndex] || null; + }, + /** + * 删除单元格 + */ + deleteCell:function (cell, rowIndex) { + rowIndex = typeof rowIndex == 'number' ? rowIndex : cell.parentNode.rowIndex; + var row = this.table.rows[rowIndex]; + row.deleteCell(cell.cellIndex); + }, + /** + * 根据始末两个单元格获取被框选的所有单元格范围 + */ + getCellsRange:function (cellA, cellB) { + function checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex) { + var tmpBeginRowIndex = beginRowIndex, + tmpBeginColIndex = beginColIndex, + tmpEndRowIndex = endRowIndex, + tmpEndColIndex = endColIndex, + cellInfo, colIndex, rowIndex; + // 通过indexTable检查是否存在超出TableRange上边界的情况 + if (beginRowIndex > 0) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[beginRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex; + if (rowIndex < beginRowIndex) { + tmpBeginRowIndex = Math.min(rowIndex, tmpBeginRowIndex); + } + } + } + // 通过indexTable检查是否存在超出TableRange右边界的情况 + if (endColIndex < me.colsNum) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][endColIndex]; + colIndex = cellInfo.colIndex + cellInfo.colSpan - 1; + if (colIndex > endColIndex) { + tmpEndColIndex = Math.max(colIndex, tmpEndColIndex); + } + } + } + // 检查是否有超出TableRange下边界的情况 + if (endRowIndex < me.rowsNum) { + for (colIndex = beginColIndex; colIndex < endColIndex; colIndex++) { + cellInfo = me.indexTable[endRowIndex][colIndex]; + rowIndex = cellInfo.rowIndex + cellInfo.rowSpan - 1; + if (rowIndex > endRowIndex) { + tmpEndRowIndex = Math.max(rowIndex, tmpEndRowIndex); + } + } + } + // 检查是否有超出TableRange左边界的情况 + if (beginColIndex > 0) { + for (rowIndex = beginRowIndex; rowIndex < endRowIndex; rowIndex++) { + cellInfo = me.indexTable[rowIndex][beginColIndex]; + colIndex = cellInfo.colIndex; + if (colIndex < beginColIndex) { + tmpBeginColIndex = Math.min(cellInfo.colIndex, tmpBeginColIndex); + } + } + } + //递归调用直至所有完成所有框选单元格的扩展 + if (tmpBeginRowIndex != beginRowIndex || tmpBeginColIndex != beginColIndex || tmpEndRowIndex != endRowIndex || tmpEndColIndex != endColIndex) { + return checkRange(tmpBeginRowIndex, tmpBeginColIndex, tmpEndRowIndex, tmpEndColIndex); + } else { + // 不需要扩展TableRange的情况 + return { + beginRowIndex:beginRowIndex, + beginColIndex:beginColIndex, + endRowIndex:endRowIndex, + endColIndex:endColIndex + }; + } + } + + try { + var me = this, + cellAInfo = me.getCellInfo(cellA); + if (cellA === cellB) { + return { + beginRowIndex:cellAInfo.rowIndex, + beginColIndex:cellAInfo.colIndex, + endRowIndex:cellAInfo.rowIndex + cellAInfo.rowSpan - 1, + endColIndex:cellAInfo.colIndex + cellAInfo.colSpan - 1 + }; + } + var cellBInfo = me.getCellInfo(cellB); + // 计算TableRange的四个边 + var beginRowIndex = Math.min(cellAInfo.rowIndex, cellBInfo.rowIndex), + beginColIndex = Math.min(cellAInfo.colIndex, cellBInfo.colIndex), + endRowIndex = Math.max(cellAInfo.rowIndex + cellAInfo.rowSpan - 1, cellBInfo.rowIndex + cellBInfo.rowSpan - 1), + endColIndex = Math.max(cellAInfo.colIndex + cellAInfo.colSpan - 1, cellBInfo.colIndex + cellBInfo.colSpan - 1); + + return checkRange(beginRowIndex, beginColIndex, endRowIndex, endColIndex); + } catch (e) { + //throw e; + } + }, + /** + * 依据cellsRange获取对应的单元格集合 + */ + getCells:function (range) { + //每次获取cells之前必须先清除上次的选择,否则会对后续获取操作造成影响 + this.clearSelected(); + var beginRowIndex = range.beginRowIndex, + beginColIndex = range.beginColIndex, + endRowIndex = range.endRowIndex, + endColIndex = range.endColIndex, + cellInfo, rowIndex, colIndex, tdHash = {}, returnTds = []; + for (var i = beginRowIndex; i <= endRowIndex; i++) { + for (var j = beginColIndex; j <= endColIndex; j++) { + cellInfo = this.indexTable[i][j]; + rowIndex = cellInfo.rowIndex; + colIndex = cellInfo.colIndex; + // 如果Cells里已经包含了此Cell则跳过 + var key = rowIndex + '|' + colIndex; + if (tdHash[key]) continue; + tdHash[key] = 1; + if (rowIndex < i || colIndex < j || rowIndex + cellInfo.rowSpan - 1 > endRowIndex || colIndex + cellInfo.colSpan - 1 > endColIndex) { + return null; + } + returnTds.push(this.getCell(rowIndex, cellInfo.cellIndex)); + } + } + return returnTds; + }, + /** + * 清理已经选中的单元格 + */ + clearSelected:function () { + UETable.removeSelectedClass(this.selectedTds); + this.selectedTds = []; + this.cellsRange = {}; + }, + /** + * 根据range设置已经选中的单元格 + */ + setSelected:function (range) { + var cells = this.getCells(range); + UETable.addSelectedClass(cells); + this.selectedTds = cells; + this.cellsRange = range; + }, + isFullRow:function () { + var range = this.cellsRange; + return (range.endColIndex - range.beginColIndex + 1) == this.colsNum; + }, + isFullCol:function () { + var range = this.cellsRange, + table = this.table, + ths = table.getElementsByTagName("th"), + rows = range.endRowIndex - range.beginRowIndex + 1; + return !ths.length ? rows == this.rowsNum : rows == this.rowsNum || (rows == this.rowsNum - 1); + + }, + /** + * 获取视觉上的前置单元格,默认是左边,top传入时 + * @param cell + * @param top + */ + getNextCell:function (cell, bottom, ignoreRange) { + try { + var cellInfo = this.getCellInfo(cell), + nextRowIndex, nextColIndex; + var len = this.selectedTds.length && !ignoreRange, + range = this.cellsRange; + //末行或者末列没有后置单元格 + if ((!bottom && (cellInfo.rowIndex == 0)) || (bottom && (!len ? (cellInfo.rowIndex + cellInfo.rowSpan > this.rowsNum - 1) : (range.endRowIndex == this.rowsNum - 1)))) return null; + + nextRowIndex = !bottom ? ( !len ? cellInfo.rowIndex - 1 : range.beginRowIndex - 1) + : ( !len ? (cellInfo.rowIndex + cellInfo.rowSpan) : range.endRowIndex + 1); + nextColIndex = !len ? cellInfo.colIndex : range.beginColIndex; + return this.getCell(this.indexTable[nextRowIndex][nextColIndex].rowIndex, this.indexTable[nextRowIndex][nextColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + getPreviewCell:function (cell, top) { + try { + var cellInfo = this.getCellInfo(cell), + previewRowIndex, previewColIndex; + var len = this.selectedTds.length, + range = this.cellsRange; + //首行或者首列没有前置单元格 + if ((!top && (!len ? !cellInfo.colIndex : !range.beginColIndex)) || (top && (!len ? (cellInfo.rowIndex > (this.colsNum - 1)) : (range.endColIndex == this.colsNum - 1)))) return null; + + previewRowIndex = !top ? ( !len ? cellInfo.rowIndex : range.beginRowIndex ) + : ( !len ? (cellInfo.rowIndex < 1 ? 0 : (cellInfo.rowIndex - 1)) : range.beginRowIndex); + previewColIndex = !top ? ( !len ? (cellInfo.colIndex < 1 ? 0 : (cellInfo.colIndex - 1)) : range.beginColIndex - 1) + : ( !len ? cellInfo.colIndex : range.endColIndex + 1); + return this.getCell(this.indexTable[previewRowIndex][previewColIndex].rowIndex, this.indexTable[previewRowIndex][previewColIndex].cellIndex); + } catch (e) { + showError(e); + } + }, + /** + * 移动单元格中的内容 + */ + moveContent:function (cellTo, cellFrom) { + if (UETable.isEmptyBlock(cellFrom)) return; + if (UETable.isEmptyBlock(cellTo)) { + cellTo.innerHTML = cellFrom.innerHTML; + return; + } + var child = cellTo.lastChild; + if (child.nodeType == 3 || !dtd.$block[child.tagName]) { + cellTo.appendChild(cellTo.ownerDocument.createElement('br')) + } + while (child = cellFrom.firstChild) { + cellTo.appendChild(child); + } + }, + /** + * 向右合并单元格 + */ + mergeRight:function (cell) { + var cellInfo = this.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan, + rightCellInfo = this.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = this.getCell(rightCellInfo.rowIndex, rightCellInfo.cellIndex); + //合并 + cell.colSpan = cellInfo.colSpan + rightCellInfo.colSpan; + //被合并的单元格不应存在宽度属性 + cell.removeAttribute("width"); + //移动内容 + this.moveContent(cell, rightCell); + //删掉被合并的Cell + this.deleteCell(rightCell, rightCellInfo.rowIndex); + this.update(); + }, + /** + * 向下合并单元格 + */ + mergeDown:function (cell) { + var cellInfo = this.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan, + downCellInfo = this.indexTable[downRowIndex][cellInfo.colIndex], + downCell = this.getCell(downCellInfo.rowIndex, downCellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + downCellInfo.rowSpan; + cell.removeAttribute("height"); + this.moveContent(cell, downCell); + this.deleteCell(downCell, downCellInfo.rowIndex); + this.update(); + }, + /** + * 合并整个range中的内容 + */ + mergeRange:function () { + //由于合并操作可以在任意时刻进行,所以无法通过鼠标位置等信息实时生成range,只能通过缓存实例中的cellsRange对象来访问 + var range = this.cellsRange, + leftTopCell = this.getCell(range.beginRowIndex, this.indexTable[range.beginRowIndex][range.beginColIndex].cellIndex); + + if (leftTopCell.tagName == "TH" && range.endRowIndex !== range.beginRowIndex) { + var index = this.indexTable, + info = this.getCellInfo(leftTopCell); + leftTopCell = this.getCell(1, index[1][info.colIndex].cellIndex); + range = this.getCellsRange(leftTopCell, this.getCell(index[this.rowsNum - 1][info.colIndex].rowIndex, index[this.rowsNum - 1][info.colIndex].cellIndex)); + } + + // 删除剩余的Cells + var cells = this.getCells(range); + for(var i= 0,ci;ci=cells[i++];){ + if (ci !== leftTopCell) { + this.moveContent(leftTopCell, ci); + this.deleteCell(ci); + } + } + // 修改左上角Cell的rowSpan和colSpan,并调整宽度属性设置 + leftTopCell.rowSpan = range.endRowIndex - range.beginRowIndex + 1; + leftTopCell.rowSpan > 1 && leftTopCell.removeAttribute("height"); + leftTopCell.colSpan = range.endColIndex - range.beginColIndex + 1; + leftTopCell.colSpan > 1 && leftTopCell.removeAttribute("width"); + if (leftTopCell.rowSpan == this.rowsNum && leftTopCell.colSpan != 1) { + leftTopCell.colSpan = 1; + } + + if (leftTopCell.colSpan == this.colsNum && leftTopCell.rowSpan != 1) { + var rowIndex = leftTopCell.parentNode.rowIndex; + //解决IE下的表格操作问题 + if( this.table.deleteRow ) { + for (var i = rowIndex+ 1, curIndex=rowIndex+ 1, len=leftTopCell.rowSpan; i < len; i++) { + this.table.deleteRow(curIndex); + } + } else { + for (var i = 0, len=leftTopCell.rowSpan - 1; i < len; i++) { + var row = this.table.rows[rowIndex + 1]; + row.parentNode.removeChild(row); + } + } + leftTopCell.rowSpan = 1; + } + this.update(); + }, + /** + * 插入一行单元格 + */ + insertRow:function (rowIndex, sourceCell) { + var numCols = this.colsNum, + table = this.table, + row = table.insertRow(rowIndex), cell, + isInsertTitle = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; + + function replaceTdToTh(colIndex, cell, tableRow) { + if (colIndex == 0) { + var tr = tableRow.nextSibling || tableRow.previousSibling, + th = tr.cells[colIndex]; + if (th.tagName == 'TH') { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell) + } + }else{ + if (cell.tagName == 'TH') { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell) + } + } + } + + //首行直接插入,无需考虑部分单元格被rowspan的情况 + if (rowIndex == 0 || rowIndex == this.rowsNum) { + for (var colIndex = 0; colIndex < numCols; colIndex++) { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + cell.getAttribute('vAlign') && cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + row.appendChild(cell); + if(!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } else { + var infoRow = this.indexTable[rowIndex], + cellIndex = 0; + for (colIndex = 0; colIndex < numCols; colIndex++) { + var cellInfo = infoRow[colIndex]; + //如果存在某个单元格的rowspan穿过待插入行的位置,则修改该单元格的rowspan即可,无需插入单元格 + if (cellInfo.rowIndex < rowIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.rowSpan = cellInfo.rowSpan + 1; + } else { + cell = this.cloneCell(sourceCell, true); + this.setCellContent(cell); + row.appendChild(cell); + } + if(!isInsertTitle) replaceTdToTh(colIndex, cell, row); + } + } + //框选时插入不触发contentchange,需要手动更新索引。 + this.update(); + return row; + }, + /** + * 删除一行单元格 + * @param rowIndex + */ + deleteRow:function (rowIndex) { + var row = this.table.rows[rowIndex], + infoRow = this.indexTable[rowIndex], + colsNum = this.colsNum, + count = 0; //处理计数 + for (var colIndex = 0; colIndex < colsNum;) { + var cellInfo = infoRow[colIndex], + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (cell.rowSpan > 1) { + if (cellInfo.rowIndex == rowIndex) { + var clone = cell.cloneNode(true); + clone.rowSpan = cell.rowSpan - 1; + clone.innerHTML = ""; + cell.rowSpan = 1; + var nextRowIndex = rowIndex + 1, + nextRow = this.table.rows[nextRowIndex], + insertCellIndex, + preMerged = this.getPreviewMergedCellsNum(nextRowIndex, colIndex) - count; + if (preMerged < colIndex) { + insertCellIndex = colIndex - preMerged - 1; + //nextRow.insertCell(insertCellIndex); + domUtils.insertAfter(nextRow.cells[insertCellIndex], clone); + } else { + if (nextRow.cells.length) nextRow.insertBefore(clone, nextRow.cells[0]) + } + count += 1; + //cell.parentNode.removeChild(cell); + } + } + colIndex += cell.colSpan || 1; + } + var deleteTds = [], cacheMap = {}; + for (colIndex = 0; colIndex < colsNum; colIndex++) { + var tmpRowIndex = infoRow[colIndex].rowIndex, + tmpCellIndex = infoRow[colIndex].cellIndex, + key = tmpRowIndex + "_" + tmpCellIndex; + if (cacheMap[key])continue; + cacheMap[key] = 1; + cell = this.getCell(tmpRowIndex, tmpCellIndex); + deleteTds.push(cell); + } + var mergeTds = []; + utils.each(deleteTds, function (td) { + if (td.rowSpan == 1) { + td.parentNode.removeChild(td); + } else { + mergeTds.push(td); + } + }); + utils.each(mergeTds, function (td) { + td.rowSpan--; + }); + row.parentNode.removeChild(row); + //浏览器方法本身存在bug,采用自定义方法删除 + //this.table.deleteRow(rowIndex); + this.update(); + }, + insertCol:function (colIndex, sourceCell, defaultValue) { + var rowsNum = this.rowsNum, + rowIndex = 0, + tableRow, cell, + backWidth = parseInt((this.table.offsetWidth - (this.colsNum + 1) * 20 - (this.colsNum + 1)) / (this.colsNum + 1), 10), + isInsertTitleCol = typeof sourceCell == 'string' && sourceCell.toUpperCase() == 'TH'; + + function replaceTdToTh(rowIndex, cell, tableRow) { + if (rowIndex == 0) { + var th = cell.nextSibling || cell.previousSibling; + if (th.tagName == 'TH') { + th = cell.ownerDocument.createElement("th"); + th.appendChild(cell.firstChild); + tableRow.insertBefore(th, cell); + domUtils.remove(cell) + } + }else{ + if (cell.tagName == 'TH') { + var td = cell.ownerDocument.createElement("td"); + td.appendChild(cell.firstChild); + tableRow.insertBefore(td, cell); + domUtils.remove(cell) + } + } + } + + var preCell; + if (colIndex == 0 || colIndex == this.colsNum) { + for (; rowIndex < rowsNum; rowIndex++) { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[colIndex == 0 ? colIndex : tableRow.cells.length]; + cell = this.cloneCell(sourceCell, true); //tableRow.insertCell(colIndex == 0 ? colIndex : tableRow.cells.length); + this.setCellContent(cell); + cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + preCell && cell.setAttribute('width', preCell.getAttribute('width')); + if (!colIndex) { + tableRow.insertBefore(cell, tableRow.cells[0]); + } else { + domUtils.insertAfter(tableRow.cells[tableRow.cells.length - 1], cell); + } + if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow) + } + } else { + for (; rowIndex < rowsNum; rowIndex++) { + var cellInfo = this.indexTable[rowIndex][colIndex]; + if (cellInfo.colIndex < colIndex) { + cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + cell.colSpan = cellInfo.colSpan + 1; + } else { + tableRow = this.table.rows[rowIndex]; + preCell = tableRow.cells[cellInfo.cellIndex]; + + cell = this.cloneCell(sourceCell, true);//tableRow.insertCell(cellInfo.cellIndex); + this.setCellContent(cell); + cell.setAttribute('vAlign', cell.getAttribute('vAlign')); + preCell && cell.setAttribute('width', preCell.getAttribute('width')); + //防止IE下报错 + preCell ? tableRow.insertBefore(cell, preCell) : tableRow.appendChild(cell); + } + if(!isInsertTitleCol) replaceTdToTh(rowIndex, cell, tableRow); + } + } + //框选时插入不触发contentchange,需要手动更新索引 + this.update(); + this.updateWidth(backWidth, defaultValue || {tdPadding:10, tdBorder:1}); + }, + updateWidth:function (width, defaultValue) { + var table = this.table, + tmpWidth = UETable.getWidth(table) - defaultValue.tdPadding * 2 - defaultValue.tdBorder + width; + if (tmpWidth < table.ownerDocument.body.offsetWidth) { + table.setAttribute("width", tmpWidth); + return; + } + var tds = domUtils.getElementsByTagName(this.table, "td th"); + utils.each(tds, function (td) { + td.setAttribute("width", width); + }) + }, + deleteCol:function (colIndex) { + var indexTable = this.indexTable, + tableRows = this.table.rows, + backTableWidth = this.table.getAttribute("width"), + backTdWidth = 0, + rowsNum = this.rowsNum, + cacheMap = {}; + for (var rowIndex = 0; rowIndex < rowsNum;) { + var infoRow = indexTable[rowIndex], + cellInfo = infoRow[colIndex], + key = cellInfo.rowIndex + '_' + cellInfo.colIndex; + // 跳过已经处理过的Cell + if (cacheMap[key])continue; + cacheMap[key] = 1; + var cell = this.getCell(cellInfo.rowIndex, cellInfo.cellIndex); + if (!backTdWidth) backTdWidth = cell && parseInt(cell.offsetWidth / cell.colSpan, 10).toFixed(0); + // 如果Cell的colSpan大于1, 就修改colSpan, 否则就删掉这个Cell + if (cell.colSpan > 1) { + cell.colSpan--; + } else { + tableRows[rowIndex].deleteCell(cellInfo.cellIndex); + } + rowIndex += cellInfo.rowSpan || 1; + } + this.table.setAttribute("width", backTableWidth - backTdWidth); + this.update(); + }, + splitToCells:function (cell) { + var me = this, + cells = this.splitToRows(cell); + utils.each(cells, function (cell) { + me.splitToCols(cell); + }) + }, + splitToRows:function (cell) { + var cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.rowSpan = 1; + results.push(cell); + // 补齐单元格 + for (var i = rowIndex, endRow = rowIndex + cellInfo.rowSpan; i < endRow; i++) { + if (i == rowIndex)continue; + var tableRow = this.table.rows[i], + tmpCell = tableRow.insertCell(colIndex - this.getPreviewMergedCellsNum(i, colIndex)); + tmpCell.colSpan = cellInfo.colSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); + tmpCell.setAttribute('align', cell.getAttribute('align')); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + results.push(tmpCell); + } + this.update(); + return results; + }, + getPreviewMergedCellsNum:function (rowIndex, colIndex) { + var indexRow = this.indexTable[rowIndex], + num = 0; + for (var i = 0; i < colIndex;) { + var colSpan = indexRow[i].colSpan, + tmpRowIndex = indexRow[i].rowIndex; + num += (colSpan - (tmpRowIndex == rowIndex ? 1 : 0)); + i += colSpan; + } + return num; + }, + splitToCols:function (cell) { + var backWidth = (cell.offsetWidth / cell.colSpan - 22).toFixed(0), + + cellInfo = this.getCellInfo(cell), + rowIndex = cellInfo.rowIndex, + colIndex = cellInfo.colIndex, + results = []; + // 修改Cell的rowSpan + cell.colSpan = 1; + cell.setAttribute("width", backWidth); + results.push(cell); + // 补齐单元格 + for (var j = colIndex, endCol = colIndex + cellInfo.colSpan; j < endCol; j++) { + if (j == colIndex)continue; + var tableRow = this.table.rows[rowIndex], + tmpCell = tableRow.insertCell(this.indexTable[rowIndex][j].cellIndex + 1); + tmpCell.rowSpan = cellInfo.rowSpan; + this.setCellContent(tmpCell); + tmpCell.setAttribute('vAlign', cell.getAttribute('vAlign')); + tmpCell.setAttribute('align', cell.getAttribute('align')); + tmpCell.setAttribute('width', backWidth); + if (cell.style.cssText) { + tmpCell.style.cssText = cell.style.cssText; + } + //处理th的情况 + if (cell.tagName == 'TH') { + var th = cell.ownerDocument.createElement('th'); + th.appendChild(tmpCell.firstChild); + th.setAttribute('vAlign', cell.getAttribute('vAlign')); + th.rowSpan = tmpCell.rowSpan; + tableRow.insertBefore(th, tmpCell); + domUtils.remove(tmpCell); + } + results.push(tmpCell); + } + this.update(); + return results; + }, + isLastCell:function (cell, rowsNum, colsNum) { + rowsNum = rowsNum || this.rowsNum; + colsNum = colsNum || this.colsNum; + var cellInfo = this.getCellInfo(cell); + return ((cellInfo.rowIndex + cellInfo.rowSpan) == rowsNum) && + ((cellInfo.colIndex + cellInfo.colSpan) == colsNum); + }, + getLastCell:function (cells) { + cells = cells || this.table.getElementsByTagName("td"); + var firstInfo = this.getCellInfo(cells[0]); + var me = this, last = cells[0], + tr = last.parentNode, + cellsNum = 0, cols = 0, rows; + utils.each(cells, function (cell) { + if (cell.parentNode == tr)cols += cell.colSpan || 1; + cellsNum += cell.rowSpan * cell.colSpan || 1; + }); + rows = cellsNum / cols; + utils.each(cells, function (cell) { + if (me.isLastCell(cell, rows, cols)) { + last = cell; + return false; + } + }); + return last; + + }, + selectRow:function (rowIndex) { + var indexRow = this.indexTable[rowIndex], + start = this.getCell(indexRow[0].rowIndex, indexRow[0].cellIndex), + end = this.getCell(indexRow[this.colsNum - 1].rowIndex, indexRow[this.colsNum - 1].cellIndex), + range = this.getCellsRange(start, end); + this.setSelected(range); + }, + selectTable:function () { + var tds = this.table.getElementsByTagName("td"), + range = this.getCellsRange(tds[0], tds[tds.length - 1]); + this.setSelected(range); + }, + setBackground:function (cells, value) { + if (typeof value === "string") { + utils.each(cells, function (cell) { + cell.style.backgroundColor = value; + }) + } else if (typeof value === "object") { + value = utils.extend({ + repeat:true, + colorList:["#ddd", "#fff"] + }, value); + var rowIndex = this.getCellInfo(cells[0]).rowIndex, + count = 0, + colors = value.colorList, + getColor = function (list, index, repeat) { + return list[index] ? list[index] : repeat ? list[index % list.length] : ""; + }; + for (var i = 0, cell; cell = cells[i++];) { + var cellInfo = this.getCellInfo(cell); + cell.style.backgroundColor = getColor(colors, ((rowIndex + count) == cellInfo.rowIndex) ? count : ++count, value.repeat); + } + } + }, + removeBackground:function (cells) { + utils.each(cells, function (cell) { + cell.style.backgroundColor = ""; + }) + } + + + }; + function showError(e) { + } +})(); + +// plugins/table.cmds.js +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 13-2-20 + * Time: 下午6:25 + * To change this template use File | Settings | File Templates. + */ +; +(function () { + var UT = UE.UETable, + getTableItemsByRange = function (editor) { + return UT.getTableItemsByRange(editor); + }, + getUETableBySelected = function (editor) { + return UT.getUETableBySelected(editor) + }, + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); + }, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }; + + + UE.commands['inserttable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? -1 : 0; + }, + execCommand: function (cmd, opt) { + function createTable(opt, tdWidth) { + var html = [], + rowsNum = opt.numRows, + colsNum = opt.numCols; + for (var r = 0; r < rowsNum; r++) { + html.push(''); + for (var c = 0; c < colsNum; c++) { + html.push('
          • ' + (browser.ie && browser.version < 11 ? domUtils.fillChar : '
            ') + '
            ' + html.join('') + '
            ' + } + + if (!opt) { + opt = utils.extend({}, { + numCols: this.options.defaultCols, + numRows: this.options.defaultRows, + tdvalign: this.options.tdvalign + }) + } + var me = this; + var range = this.selection.getRange(), + start = range.startContainer, + firstParentBlock = domUtils.findParent(start, function (node) { + return domUtils.isBlockElm(node); + }, true) || me.body; + + var defaultValue = getDefaultValue(me), + tableWidth = firstParentBlock.offsetWidth, + tdWidth = Math.floor(tableWidth / opt.numCols - defaultValue.tdPadding * 2 - defaultValue.tdBorder); + + //todo其他属性 + !opt.tdvalign && (opt.tdvalign = me.options.tdvalign); + me.execCommand("inserthtml", createTable(opt, tdWidth)); + } + }; + + UE.commands['insertparagraphbeforetable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).cell ? 0 : -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var p = this.document.createElement("p"); + p.innerHTML = browser.ie ? ' ' : '
            '; + table.parentNode.insertBefore(p, table); + this.selection.getRange().setStart(p, 0).setCursor(); + } + } + }; + + UE.commands['deletetable'] = { + queryCommandState: function () { + var rng = this.selection.getRange(); + return domUtils.findParentByTagName(rng.startContainer, 'table', true) ? 0 : -1; + }, + execCommand: function (cmd, table) { + var rng = this.selection.getRange(); + table = table || domUtils.findParentByTagName(rng.startContainer, 'table', true); + if (table) { + var next = table.nextSibling; + if (!next) { + next = domUtils.createElement(this.document, 'p', { + 'innerHTML': browser.ie ? domUtils.fillChar : '
            ' + }); + table.parentNode.insertBefore(next, table); + } + domUtils.remove(table); + rng = this.selection.getRange(); + if (next.nodeType == 3) { + rng.setStartBefore(next) + } else { + rng.setStart(next, 0) + } + rng.setCursor(false, true) + this.fireEvent("tablehasdeleted") + + } + + } + }; + UE.commands['cellalign'] = { + queryCommandState: function () { + return getSelectedArr(this).length ? 0 : -1 + }, + execCommand: function (cmd, align) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; ci = selectedTds[i++];) { + ci.setAttribute('align', align); + } + } + } + }; + UE.commands['cellvalign'] = { + queryCommandState: function () { + return getSelectedArr(this).length ? 0 : -1; + }, + execCommand: function (cmd, valign) { + var selectedTds = getSelectedArr(this); + if (selectedTds.length) { + for (var i = 0, ci; ci = selectedTds[i++];) { + ci.setAttribute('vAlign', valign); + } + } + } + }; + UE.commands['insertcaption'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + return table.getElementsByTagName('caption').length == 0 ? 1 : -1; + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var caption = this.document.createElement('caption'); + caption.innerHTML = browser.ie ? domUtils.fillChar : '
            '; + table.insertBefore(caption, table.firstChild); + var range = this.selection.getRange(); + range.setStart(caption, 0).setCursor(); + } + + } + }; + UE.commands['deletecaption'] = { + queryCommandState: function () { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + return table.getElementsByTagName('caption').length == 0 ? -1 : 1; + } + return -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + domUtils.remove(table.getElementsByTagName('caption')[0]); + var range = this.selection.getRange(); + range.setStart(table.rows[0].cells[0], 0).setCursor(); + } + + } + }; + UE.commands['inserttitle'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() != 'th' ? 0 : -1 + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertRow(0, 'th'); + } + var th = table.getElementsByTagName('th')[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands['deletetitle'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var firstRow = table.rows[0]; + return firstRow.cells[firstRow.cells.length-1].tagName.toLowerCase() == 'th' ? 0 : -1 + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + domUtils.remove(table.rows[0]) + } + var td = table.getElementsByTagName('td')[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + UE.commands['inserttitlecol'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length-1]; + return lastRow.getElementsByTagName('th').length ? -1 : 0; + } + return -1; + }, + execCommand: function (cmd) { + var table = getTableItemsByRange(this).table; + if (table) { + getUETable(table).insertCol(0, 'th'); + } + resetTdWidth(table, this); + var th = table.getElementsByTagName('th')[0]; + this.selection.getRange().setStart(th, 0).setCursor(false, true); + } + }; + UE.commands['deletetitlecol'] = { + queryCommandState: function () { + var table = getTableItemsByRange(this).table; + if (table) { + var lastRow = table.rows[table.rows.length-1]; + return lastRow.getElementsByTagName('th').length ? 0 : -1; + } + return -1; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + if (table) { + for(var i = 0; i< table.rows.length; i++ ){ + domUtils.remove(table.rows[i].children[0]) + } + } + resetTdWidth(table, this); + var td = table.getElementsByTagName('td')[0]; + this.selection.getRange().setStart(td, 0).setCursor(false, true); + } + }; + + UE.commands["mergeright"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length) return -1; + + var cellInfo = ut.getCellInfo(cell), + rightColIndex = cellInfo.colIndex + cellInfo.colSpan; + if (rightColIndex >= ut.colsNum) return -1; // 如果处于最右边则不能向右合并 + + var rightCellInfo = ut.indexTable[cellInfo.rowIndex][rightColIndex], + rightCell = table.rows[rightCellInfo.rowIndex].cells[rightCellInfo.cellIndex]; + if (!rightCell || cell.tagName != rightCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return (rightCellInfo.rowIndex == cellInfo.rowIndex && rightCellInfo.rowSpan == cellInfo.rowSpan) ? 0 : -1; + }, + execCommand: function (cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeRight(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergedown"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table, + cell = tableItems.cell; + + if (!table || !cell) return -1; + var ut = getUETable(table); + if (ut.selectedTds.length)return -1; + + var cellInfo = ut.getCellInfo(cell), + downRowIndex = cellInfo.rowIndex + cellInfo.rowSpan; + if (downRowIndex >= ut.rowsNum) return -1; // 如果处于最下边则不能向下合并 + + var downCellInfo = ut.indexTable[downRowIndex][cellInfo.colIndex], + downCell = table.rows[downCellInfo.rowIndex].cells[downCellInfo.cellIndex]; + if (!downCell || cell.tagName != downCell.tagName) return -1; // TH和TD不能相互合并 + + // 当且仅当两个Cell的开始列号和结束列号一致时能进行合并 + return (downCellInfo.colIndex == cellInfo.colIndex && downCellInfo.colSpan == cellInfo.colSpan) ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.mergeDown(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["mergecells"] = { + queryCommandState: function () { + return getUETableBySelected(this) ? 0 : -1; + }, + execCommand: function () { + var ut = getUETableBySelected(this); + if (ut && ut.selectedTds.length) { + var cell = ut.selectedTds[0]; + ut.mergeRange(); + var rng = this.selection.getRange(); + if (domUtils.isEmptyBlock(cell)) { + rng.setStart(cell, 0).collapse(true) + } else { + rng.selectNodeContents(cell) + } + rng.select(); + } + + + } + }; + UE.commands["insertrow"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && tableItems.tr !== tableItems.table.rows[0])) && + getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length ? cellInfo.rowIndex:ut.cellsRange.beginRowIndex,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { + ut.insertRow(range.beginRowIndex, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + //后插入行 + UE.commands["insertrownext"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD") && getUETable(tableItems.table).rowsNum < this.options.maxRowNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell, + table = tableItems.table, + ut = getUETable(table), + cellInfo = ut.getCellInfo(cell); + //ut.insertRow(!ut.selectedTds.length? cellInfo.rowIndex + cellInfo.rowSpan : ut.cellsRange.endRowIndex + 1,''); + if (!ut.selectedTds.length) { + ut.insertRow(cellInfo.rowIndex + cellInfo.rowSpan, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endRowIndex - range.beginRowIndex + 1; i < len; i++) { + ut.insertRow(range.endRowIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + UE.commands["deleterow"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function () { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellsRange = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getVSideCell(cell), + nextCell = ut.getVSideCell(cell, true), + rng = this.selection.getRange(); + if (utils.isEmptyObject(cellsRange)) { + ut.deleteRow(cellInfo.rowIndex); + } else { + for (var i = cellsRange.beginRowIndex; i < cellsRange.endRowIndex + 1; i++) { + ut.deleteRow(cellsRange.beginRowIndex); + } + } + var table = ut.table; + if (!table.getElementsByTagName('td').length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (cellInfo.rowSpan == 1 || cellInfo.rowSpan == cellsRange.endRowIndex - cellsRange.beginRowIndex + 1) { + if (nextCell || preCell) rng.selectNodeContents(nextCell || preCell).setCursor(false, true); + } else { + var newCell = ut.getCell(cellInfo.rowIndex, ut.indexTable[cellInfo.rowIndex][cellInfo.colIndex].cellIndex); + if (newCell) rng.selectNodeContents(newCell).setCursor(false, true); + } + } + if (table.getAttribute("interlaced") === "enabled")this.fireEvent("interlacetable", table); + } + }; + UE.commands["insertcol"] = { + queryCommandState: function (cmd) { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && (cell.tagName == "TD" || (cell.tagName == 'TH' && cell !== tableItems.tr.cells[0])) && + getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; + }, + execCommand: function (cmd) { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + if (this.queryCommandState(cmd) == -1)return; + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex:ut.cellsRange.beginColIndex); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { + ut.insertCol(range.beginColIndex, cell); + } + } + rng.moveToBookmark(bk).select(true); + } + }; + UE.commands["insertcolnext"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + return cell && getUETable(tableItems.table).colsNum < this.options.maxColNum ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + cellInfo = ut.getCellInfo(cell); + //ut.insertCol(!ut.selectedTds.length ? cellInfo.colIndex + cellInfo.colSpan:ut.cellsRange.endColIndex +1); + if (!ut.selectedTds.length) { + ut.insertCol(cellInfo.colIndex + cellInfo.colSpan, cell); + } else { + var range = ut.cellsRange; + for (var i = 0, len = range.endColIndex - range.beginColIndex + 1; i < len; i++) { + ut.insertCol(range.endColIndex + 1, cell); + } + } + rng.moveToBookmark(bk).select(); + } + }; + + UE.commands["deletecol"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this); + return tableItems.cell ? 0 : -1; + }, + execCommand: function () { + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell), + range = ut.cellsRange, + cellInfo = ut.getCellInfo(cell), + preCell = ut.getHSideCell(cell), + nextCell = ut.getHSideCell(cell, true); + if (utils.isEmptyObject(range)) { + ut.deleteCol(cellInfo.colIndex); + } else { + for (var i = range.beginColIndex; i < range.endColIndex + 1; i++) { + ut.deleteCol(range.beginColIndex); + } + } + var table = ut.table, + rng = this.selection.getRange(); + + if (!table.getElementsByTagName('td').length) { + var nextSibling = table.nextSibling; + domUtils.remove(table); + if (nextSibling) { + rng.setStart(nextSibling, 0).setCursor(false, true); + } + } else { + if (domUtils.inDoc(cell, this.document)) { + rng.setStart(cell, 0).setCursor(false, true); + } else { + if (nextCell && domUtils.inDoc(nextCell, this.document)) { + rng.selectNodeContents(nextCell).setCursor(false, true); + } else { + if (preCell && domUtils.inDoc(preCell, this.document)) { + rng.selectNodeContents(preCell).setCursor(true, true); + } + } + } + } + } + }; + UE.commands["splittocells"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && (cell.colSpan > 1 || cell.rowSpan > 1) ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCells(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittorows"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.rowSpan > 1 ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToRows(cell); + rng.moveToBookmark(bk).select(); + } + }; + UE.commands["splittocols"] = { + queryCommandState: function () { + var tableItems = getTableItemsByRange(this), + cell = tableItems.cell; + if (!cell) return -1; + var ut = getUETable(tableItems.table); + if (ut.selectedTds.length > 0) return -1; + return cell && cell.colSpan > 1 ? 0 : -1; + }, + execCommand: function () { + var rng = this.selection.getRange(), + bk = rng.createBookmark(true); + var cell = getTableItemsByRange(this).cell, + ut = getUETable(cell); + ut.splitToCols(cell); + rng.moveToBookmark(bk).select(); + + } + }; + + UE.commands["adaptbytext"] = + UE.commands["adaptbywindow"] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd) { + var tableItems = getTableItemsByRange(this), + table = tableItems.table; + if (table) { + if (cmd == 'adaptbywindow') { + resetTdWidth(table, this); + } else { + var cells = domUtils.getElementsByTagName(table, "td th"); + utils.each(cells, function (cell) { + cell.removeAttribute("width"); + }); + table.removeAttribute("width"); + } + } + } + }; + + //平均分配各列 + UE.commands['averagedistributecol'] = { + queryCommandState: function () { + var ut = getUETableBySelected(this); + if (!ut) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function (cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageWidth() { + var tb = ut.table, + averageWidth, sumWidth = 0, colsNum = 0, + tbAttr = getDefaultValue(me, tb); + + if (ut.isFullRow()) { + sumWidth = tb.offsetWidth; + colsNum = ut.colsNum; + } else { + var begin = ut.cellsRange.beginColIndex, + end = ut.cellsRange.endColIndex, + node; + for (var i = begin; i <= end;) { + node = ut.selectedTds[i]; + sumWidth += node.offsetWidth; + i += node.colSpan; + colsNum += 1; + } + } + averageWidth = Math.ceil(sumWidth / colsNum) - tbAttr.tdBorder * 2 - tbAttr.tdPadding * 2; + return averageWidth; + } + + function setAverageWidth(averageWidth) { + utils.each(domUtils.getElementsByTagName(ut.table, "th"), function (node) { + node.setAttribute("width", ""); + }); + var cells = ut.isFullRow() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; + + utils.each(cells, function (node) { + if (node.colSpan == 1) { + node.setAttribute("width", averageWidth); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageWidth(getAverageWidth()); + } + } + }; + //平均分配各行 + UE.commands['averagedistributerow'] = { + queryCommandState: function () { + var ut = getUETableBySelected(this); + if (!ut) return -1; + if (ut.selectedTds && /th/ig.test(ut.selectedTds[0].tagName)) return -1; + return ut.isFullRow() || ut.isFullCol() ? 0 : -1; + }, + execCommand: function (cmd) { + var me = this, + ut = getUETableBySelected(me); + + function getAverageHeight() { + var averageHeight, rowNum, sumHeight = 0, + tb = ut.table, + tbAttr = getDefaultValue(me, tb), + tdpadding = parseInt(domUtils.getComputedStyle(tb.getElementsByTagName('td')[0], "padding-top")); + + if (ut.isFullCol()) { + var captionArr = domUtils.getElementsByTagName(tb, "caption"), + thArr = domUtils.getElementsByTagName(tb, "th"), + captionHeight, thHeight; + + if (captionArr.length > 0) { + captionHeight = captionArr[0].offsetHeight; + } + if (thArr.length > 0) { + thHeight = thArr[0].offsetHeight; + } + + sumHeight = tb.offsetHeight - (captionHeight || 0) - (thHeight || 0); + rowNum = thArr.length == 0 ? ut.rowsNum : (ut.rowsNum - 1); + } else { + var begin = ut.cellsRange.beginRowIndex, + end = ut.cellsRange.endRowIndex, + count = 0, + trs = domUtils.getElementsByTagName(tb, "tr"); + for (var i = begin; i <= end; i++) { + sumHeight += trs[i].offsetHeight; + count += 1; + } + rowNum = count; + } + //ie8下是混杂模式 + if (browser.ie && browser.version < 9) { + averageHeight = Math.ceil(sumHeight / rowNum); + } else { + averageHeight = Math.ceil(sumHeight / rowNum) - tbAttr.tdBorder * 2 - tdpadding * 2; + } + return averageHeight; + } + + function setAverageHeight(averageHeight) { + var cells = ut.isFullCol() ? domUtils.getElementsByTagName(ut.table, "td") : ut.selectedTds; + utils.each(cells, function (node) { + if (node.rowSpan == 1) { + node.setAttribute("height", averageHeight); + } + }); + } + + if (ut && ut.selectedTds.length) { + setAverageHeight(getAverageHeight()); + } + } + }; + + //单元格对齐方式 + UE.commands['cellalignment'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, data) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (!/caption/ig.test(cell.tagName)) { + domUtils.setAttributes(cell, data); + } else { + cell.style.textAlign = data.align; + cell.style.verticalAlign = data.vAlign; + } + me.selection.getRange().setCursor(true); + } else { + utils.each(ut.selectedTds, function (cell) { + domUtils.setAttributes(cell, data); + }); + } + }, + /** + * 查询当前点击的单元格的对齐状态, 如果当前已经选择了多个单元格, 则会返回所有单元格经过统一协调过后的状态 + * @see UE.UETable.getTableCellAlignState + */ + queryCommandValue: function (cmd) { + + var activeMenuCell = getTableItemsByRange( this).cell; + + if( !activeMenuCell ) { + activeMenuCell = getSelectedArr(this)[0]; + } + + if (!activeMenuCell) { + + return null; + + } else { + + //获取同时选中的其他单元格 + var cells = UE.UETable.getUETable(activeMenuCell).selectedTds; + + !cells.length && ( cells = activeMenuCell ); + + return UE.UETable.getTableCellAlignState(cells); + + } + + } + }; + //表格对齐方式 + UE.commands['tablealignment'] = { + queryCommandState: function () { + if (browser.ie && browser.version < 8) { + return -1; + } + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, value) { + var me = this, + start = me.selection.getStart(), + table = start && domUtils.findParentByTagName(start, ["table"], true); + + if (table) { + table.setAttribute("align",value); + } + } + }; + + //表格属性 + UE.commands['edittable'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, color) { + var rng = this.selection.getRange(), + table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + var arr = domUtils.getElementsByTagName(table, "td").concat( + domUtils.getElementsByTagName(table, "th"), + domUtils.getElementsByTagName(table, "caption") + ); + utils.each(arr, function (node) { + node.style.borderColor = color; + }); + } + } + }; + //单元格属性 + UE.commands['edittd'] = { + queryCommandState: function () { + return getTableItemsByRange(this).table ? 0 : -1 + }, + execCommand: function (cmd, bkColor) { + var me = this, + ut = getUETableBySelected(me); + + if (!ut) { + var start = me.selection.getStart(), + cell = start && domUtils.findParentByTagName(start, ["td", "th", "caption"], true); + if (cell) { + cell.style.backgroundColor = bkColor; + } + } else { + utils.each(ut.selectedTds, function (cell) { + cell.style.backgroundColor = bkColor; + }); + } + } + }; + + UE.commands["settablebackground"] = { + queryCommandState: function () { + return getSelectedArr(this).length > 1 ? 0 : -1; + }, + execCommand: function (cmd, value) { + var cells, ut; + cells = getSelectedArr(this); + ut = getUETable(cells[0]); + ut.setBackground(cells, value); + } + }; + + UE.commands["cleartablebackground"] = { + queryCommandState: function () { + var cells = getSelectedArr(this); + if (!cells.length)return -1; + for (var i = 0, cell; cell = cells[i++];) { + if (cell.style.backgroundColor !== "") return 0; + } + return -1; + }, + execCommand: function () { + var cells = getSelectedArr(this), + ut = getUETable(cells[0]); + ut.removeBackground(cells); + } + }; + + UE.commands["interlacetable"] = UE.commands["uninterlacetable"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + var interlaced = table.getAttribute("interlaced"); + if (cmd == "interlacetable") { + //TODO 待定 + //是否需要待定,如果设置,则命令只能单次执行成功,但反射具备toggle效果;否则可以覆盖前次命令,但反射将不存在toggle效果 + return (interlaced === "enabled") ? -1 : 0; + } else { + return (!interlaced || interlaced === "disabled") ? -1 : 0; + } + }, + execCommand: function (cmd, classList) { + var table = getTableItemsByRange(this).table; + if (cmd == "interlacetable") { + table.setAttribute("interlaced", "enabled"); + this.fireEvent("interlacetable", table, classList); + } else { + table.setAttribute("interlaced", "disabled"); + this.fireEvent("uninterlacetable", table); + } + } + }; + UE.commands["setbordervisible"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if (!table) return -1; + return 0; + }, + execCommand: function () { + var table = getTableItemsByRange(this).table; + utils.each(domUtils.getElementsByTagName(table,'td'),function(td){ + td.style.borderWidth = '1px'; + td.style.borderStyle = 'solid'; + }) + } + }; + function resetTdWidth(table, editor) { + var tds = domUtils.getElementsByTagName(table,'td th'); + utils.each(tds, function (td) { + td.removeAttribute("width"); + }); + table.setAttribute('width', getTableWidth(editor, true, getDefaultValue(editor, table))); + var tdsWidths = []; + setTimeout(function () { + utils.each(tds, function (td) { + (td.colSpan == 1) && tdsWidths.push(td.offsetWidth) + }) + utils.each(tds, function (td,i) { + (td.colSpan == 1) && td.setAttribute("width", tdsWidths[i] + ""); + }) + }, 0); + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); + } + + function getSelectedArr(editor) { + var cell = getTableItemsByRange(editor).cell; + if (cell) { + var ut = getUETable(cell); + return ut.selectedTds.length ? ut.selectedTds : [cell]; + } else { + return []; + } + } +})(); + + +// plugins/table.action.js +/** + * Created with JetBrains PhpStorm. + * User: taoqili + * Date: 12-10-12 + * Time: 上午10:05 + * To change this template use File | Settings | File Templates. + */ +UE.plugins['table'] = function () { + var me = this, + tabTimer = null, + //拖动计时器 + tableDragTimer = null, + //双击计时器 + tableResizeTimer = null, + //单元格最小宽度 + cellMinWidth = 5, + isInResizeBuffer = false, + //单元格边框大小 + cellBorderWidth = 5, + //鼠标偏移距离 + offsetOfTableCell = 10, + //记录在有限时间内的点击状态, 共有3个取值, 0, 1, 2。 0代表未初始化, 1代表单击了1次,2代表2次 + singleClickState = 0, + userActionStatus = null, + //双击允许的时间范围 + dblclickTime = 360, + UT = UE.UETable, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getUETableBySelected = function (editor) { + return UT.getUETableBySelected(editor); + }, + getDefaultValue = function (editor, table) { + return UT.getDefaultValue(editor, table); + }, + removeSelectedClass = function (cells) { + return UT.removeSelectedClass(cells); + }; + + function showError(e) { +// throw e; + } + me.ready(function(){ + var me = this; + var orgGetText = me.selection.getText; + me.selection.getText = function(){ + var table = getUETableBySelected(me); + if(table){ + var str = ''; + utils.each(table.selectedTds,function(td){ + str += td[browser.ie?'innerText':'textContent']; + }) + return str; + }else{ + return orgGetText.call(me.selection) + } + + } + }) + + //处理拖动及框选相关方法 + var startTd = null, //鼠标按下时的锚点td + currentTd = null, //当前鼠标经过时的td + onDrag = "", //指示当前拖动状态,其值可为"","h","v" ,分别表示未拖动状态,横向拖动状态,纵向拖动状态,用于鼠标移动过程中的判断 + onBorder = false, //检测鼠标按下时是否处在单元格边缘位置 + dragButton = null, + dragOver = false, + dragLine = null, //模拟的拖动线 + dragTd = null; //发生拖动的目标td + + var mousedown = false, + //todo 判断混乱模式 + needIEHack = true; + + me.setOpt({ + 'maxColNum':20, + 'maxRowNum':100, + 'defaultCols':5, + 'defaultRows':5, + 'tdvalign':'top', + 'cursorpath':me.options.UEDITOR_HOME_URL + "themes/default/images/cursor_", + 'tableDragable':false, + 'classList':["ue-table-interlace-color-single","ue-table-interlace-color-double"] + }); + me.getUETable = getUETable; + var commands = { + 'deletetable':1, + 'inserttable':1, + 'cellvalign':1, + 'insertcaption':1, + 'deletecaption':1, + 'inserttitle':1, + 'deletetitle':1, + "mergeright":1, + "mergedown":1, + "mergecells":1, + "insertrow":1, + "insertrownext":1, + "deleterow":1, + "insertcol":1, + "insertcolnext":1, + "deletecol":1, + "splittocells":1, + "splittorows":1, + "splittocols":1, + "adaptbytext":1, + "adaptbywindow":1, + "adaptbycustomer":1, + "insertparagraph":1, + "insertparagraphbeforetable":1, + "averagedistributecol":1, + "averagedistributerow":1 + }; + me.ready(function () { + utils.cssRule('table', + //选中的td上的样式 + '.selectTdClass{background-color:#edf5fa !important}' + + 'table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}' + + //插入的表格的默认样式 + 'table{margin-bottom:10px;border-collapse:collapse;display:table;}' + + 'td,th{padding: 5px 10px;border: 1px solid #DDD;}' + + 'caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + + 'th{border-top:1px solid #BBB;background-color:#F7F7F7;}' + + 'table tr.firstRow th{border-top-width:2px;}' + + '.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }' + + 'td p{margin:0;padding:0;}', me.document); + + var tableCopyList, isFullCol, isFullRow; + //注册del/backspace事件 + me.addListener('keydown', function (cmd, evt) { + var me = this; + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 8) { + + var ut = getUETableBySelected(me); + if (ut && ut.selectedTds.length) { + + if (ut.isFullCol()) { + me.execCommand('deletecol') + } else if (ut.isFullRow()) { + me.execCommand('deleterow') + } else { + me.fireEvent('delcells'); + } + domUtils.preventDefault(evt); + } + + var caption = domUtils.findParentByTagName(me.selection.getStart(), 'caption', true), + range = me.selection.getRange(); + if (range.collapsed && caption && isEmptyBlock(caption)) { + me.fireEvent('saveScene'); + var table = caption.parentNode; + domUtils.remove(caption); + if (table) { + range.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + me.fireEvent('saveScene'); + } + + } + + if (keyCode == 46) { + + ut = getUETableBySelected(me); + if (ut) { + me.fireEvent('saveScene'); + for (var i = 0, ci; ci = ut.selectedTds[i++];) { + domUtils.fillNode(me.document, ci) + } + me.fireEvent('saveScene'); + domUtils.preventDefault(evt); + + } + + } + if (keyCode == 13) { + + var rng = me.selection.getRange(), + caption = domUtils.findParentByTagName(rng.startContainer, 'caption', true); + if (caption) { + var table = domUtils.findParentByTagName(caption, 'table'); + if (!rng.collapsed) { + + rng.deleteContents(); + me.fireEvent('saveScene'); + } else { + if (caption) { + rng.setStart(table.rows[0].cells[0], 0).setCursor(false, true); + } + } + domUtils.preventDefault(evt); + return; + } + if (rng.collapsed) { + var table = domUtils.findParentByTagName(rng.startContainer, 'table'); + if (table) { + var cell = table.rows[0].cells[0], + start = domUtils.findParentByTagName(me.selection.getStart(), ['td', 'th'], true), + preNode = table.previousSibling; + if (cell === start && (!preNode || preNode.nodeType == 1 && preNode.tagName == 'TABLE' ) && domUtils.isStartInblock(rng)) { + var first = domUtils.findParent(me.selection.getStart(), function(n){return domUtils.isBlockElm(n)}, true); + if(first && ( /t(h|d)/i.test(first.tagName) || first === start.firstChild )){ + me.execCommand('insertparagraphbeforetable'); + domUtils.preventDefault(evt); + } + + } + } + } + } + + if ((evt.ctrlKey || evt.metaKey) && evt.keyCode == '67') { + tableCopyList = null; + var ut = getUETableBySelected(me); + if (ut) { + var tds = ut.selectedTds; + isFullCol = ut.isFullCol(); + isFullRow = ut.isFullRow(); + tableCopyList = [ + [ut.cloneCell(tds[0],null,true)] + ]; + for (var i = 1, ci; ci = tds[i]; i++) { + if (ci.parentNode !== tds[i - 1].parentNode) { + tableCopyList.push([ut.cloneCell(ci,null,true)]); + } else { + tableCopyList[tableCopyList.length - 1].push(ut.cloneCell(ci,null,true)); + } + + } + } + } + }); + me.addListener("tablehasdeleted",function(){ + toggleDraggableState(this, false, "", null); + if (dragButton)domUtils.remove(dragButton); + }); + + me.addListener('beforepaste', function (cmd, html) { + var me = this; + var rng = me.selection.getRange(); + if (domUtils.findParentByTagName(rng.startContainer, 'caption', true)) { + var div = me.document.createElement("div"); + div.innerHTML = html.html; + //trace:3729 + html.html = div[browser.ie9below ? 'innerText' : 'textContent']; + return; + } + var table = getUETableBySelected(me); + if (tableCopyList) { + me.fireEvent('saveScene'); + var rng = me.selection.getRange(); + var td = domUtils.findParentByTagName(rng.startContainer, ['td', 'th'], true), tmpNode, preNode; + if (td) { + var ut = getUETable(td); + if (isFullRow) { + var rowIndex = ut.getCellInfo(td).rowIndex; + if (td.tagName == 'TH') { + rowIndex++; + } + for (var i = 0, ci; ci = tableCopyList[i++];) { + var tr = ut.insertRow(rowIndex++, "td"); + for (var j = 0, cj; cj = ci[j]; j++) { + var cell = tr.cells[j]; + if (!cell) { + cell = tr.insertCell(j) + } + cell.innerHTML = cj.innerHTML; + cj.getAttribute('width') && cell.setAttribute('width', cj.getAttribute('width')); + cj.getAttribute('vAlign') && cell.setAttribute('vAlign', cj.getAttribute('vAlign')); + cj.getAttribute('align') && cell.setAttribute('align', cj.getAttribute('align')); + cj.style.cssText && (cell.style.cssText = cj.style.cssText) + } + for (var j = 0, cj; cj = tr.cells[j]; j++) { + if (!ci[j]) + break; + cj.innerHTML = ci[j].innerHTML; + ci[j].getAttribute('width') && cj.setAttribute('width', ci[j].getAttribute('width')); + ci[j].getAttribute('vAlign') && cj.setAttribute('vAlign', ci[j].getAttribute('vAlign')); + ci[j].getAttribute('align') && cj.setAttribute('align', ci[j].getAttribute('align')); + ci[j].style.cssText && (cj.style.cssText = ci[j].style.cssText) + } + } + } else { + if (isFullCol) { + cellInfo = ut.getCellInfo(td); + var maxColNum = 0; + for (var j = 0, ci = tableCopyList[0], cj; cj = ci[j++];) { + maxColNum += cj.colSpan || 1; + } + me.__hasEnterExecCommand = true; + for (i = 0; i < maxColNum; i++) { + me.execCommand('insertcol'); + } + me.__hasEnterExecCommand = false; + td = ut.table.rows[0].cells[cellInfo.cellIndex]; + if (td.tagName == 'TH') { + td = ut.table.rows[1].cells[cellInfo.cellIndex]; + } + } + for (var i = 0, ci; ci = tableCopyList[i++];) { + tmpNode = td; + for (var j = 0, cj; cj = ci[j++];) { + if (td) { + td.innerHTML = cj.innerHTML; + //todo 定制处理 + cj.getAttribute('width') && td.setAttribute('width', cj.getAttribute('width')); + cj.getAttribute('vAlign') && td.setAttribute('vAlign', cj.getAttribute('vAlign')); + cj.getAttribute('align') && td.setAttribute('align', cj.getAttribute('align')); + cj.style.cssText && (td.style.cssText = cj.style.cssText); + preNode = td; + td = td.nextSibling; + } else { + var cloneTd = cj.cloneNode(true); + domUtils.removeAttributes(cloneTd, ['class', 'rowSpan', 'colSpan']); + + preNode.parentNode.appendChild(cloneTd) + } + } + td = ut.getNextCell(tmpNode, true, true); + if (!tableCopyList[i]) + break; + if (!td) { + var cellInfo = ut.getCellInfo(tmpNode); + ut.table.insertRow(ut.table.rows.length); + ut.update(); + td = ut.getVSideCell(tmpNode, true); + } + } + } + ut.update(); + } else { + table = me.document.createElement('table'); + for (var i = 0, ci; ci = tableCopyList[i++];) { + var tr = table.insertRow(table.rows.length); + for (var j = 0, cj; cj = ci[j++];) { + cloneTd = UT.cloneCell(cj,null,true); + domUtils.removeAttributes(cloneTd, ['class']); + tr.appendChild(cloneTd) + } + if (j == 2 && cloneTd.rowSpan > 1) { + cloneTd.rowSpan = 1; + } + } + + var defaultValue = getDefaultValue(me), + width = me.body.offsetWidth - + (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0); + me.execCommand('insertHTML', '' + table.innerHTML.replace(/>\s*<').replace(/\bth\b/gi, "td") + '
            ') + } + me.fireEvent('contentchange'); + me.fireEvent('saveScene'); + html.html = ''; + return true; + } else { + var div = me.document.createElement("div"), tables; + div.innerHTML = html.html; + tables = div.getElementsByTagName("table"); + if (domUtils.findParentByTagName(me.selection.getStart(), 'table')) { + utils.each(tables, function (t) { + domUtils.remove(t) + }); + if (domUtils.findParentByTagName(me.selection.getStart(), 'caption', true)) { + div.innerHTML = div[browser.ie ? 'innerText' : 'textContent']; + } + } else { + utils.each(tables, function (table) { + removeStyleSize(table, true); + domUtils.removeAttributes(table, ['style', 'border']); + utils.each(domUtils.getElementsByTagName(table, "td"), function (td) { + if (isEmptyBlock(td)) { + domUtils.fillNode(me.document, td); + } + removeStyleSize(td, true); +// domUtils.removeAttributes(td, ['style']) + }); + }); + } + html.html = div.innerHTML; + } + }); + + me.addListener('afterpaste', function () { + utils.each(domUtils.getElementsByTagName(me.body, "table"), function (table) { + if (table.offsetWidth > me.body.offsetWidth) { + var defaultValue = getDefaultValue(me, table); + table.style.width = me.body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(me.body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (me.options.offsetWidth || 0) + 'px' + } + }) + }); + me.addListener('blur', function () { + tableCopyList = null; + }); + var timer; + me.addListener('keydown', function () { + clearTimeout(timer); + timer = setTimeout(function () { + var rng = me.selection.getRange(), + cell = domUtils.findParentByTagName(rng.startContainer, ['th', 'td'], true); + if (cell) { + var table = cell.parentNode.parentNode.parentNode; + if (table.offsetWidth > table.getAttribute("width")) { + cell.style.wordBreak = "break-all"; + } + } + + }, 100); + }); + me.addListener("selectionchange", function () { + toggleDraggableState(me, false, "", null); + }); + + + //内容变化时触发索引更新 + //todo 可否考虑标记检测,如果不涉及表格的变化就不进行索引重建和更新 + me.addListener("contentchange", function () { + var me = this; + //尽可能排除一些不需要更新的状况 + hideDragLine(me); + if (getUETableBySelected(me))return; + var rng = me.selection.getRange(); + var start = rng.startContainer; + start = domUtils.findParentByTagName(start, ['td', 'th'], true); + utils.each(domUtils.getElementsByTagName(me.document, 'table'), function (table) { + if (me.fireEvent("excludetable", table) === true) return; + table.ueTable = new UT(table); + //trace:3742 +// utils.each(domUtils.getElementsByTagName(me.document, 'td'), function (td) { +// +// if (domUtils.isEmptyBlock(td) && td !== start) { +// domUtils.fillNode(me.document, td); +// if (browser.ie && browser.version == 6) { +// td.innerHTML = ' ' +// } +// } +// }); +// utils.each(domUtils.getElementsByTagName(me.document, 'th'), function (th) { +// if (domUtils.isEmptyBlock(th) && th !== start) { +// domUtils.fillNode(me.document, th); +// if (browser.ie && browser.version == 6) { +// th.innerHTML = ' ' +// } +// } +// }); + table.onmouseover = function () { + me.fireEvent('tablemouseover', table); + }; + table.onmousemove = function () { + me.fireEvent('tablemousemove', table); + me.options.tableDragable && toggleDragButton(true, this, me); + utils.defer(function(){ + me.fireEvent('contentchange',50) + },true) + }; + table.onmouseout = function () { + me.fireEvent('tablemouseout', table); + toggleDraggableState(me, false, "", null); + hideDragLine(me); + }; + table.onclick = function (evt) { + evt = me.window.event || evt; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (!target)return; + var ut = getUETable(target), + table = ut.table, + cellInfo = ut.getCellInfo(target), + cellsRange, + rng = me.selection.getRange(); +// if ("topLeft" == inPosition(table, mouseCoords(evt))) { +// cellsRange = ut.getCellsRange(ut.table.rows[0].cells[0], ut.getLastCell()); +// ut.setSelected(cellsRange); +// return; +// } +// if ("bottomRight" == inPosition(table, mouseCoords(evt))) { +// +// return; +// } + if (inTableSide(table, target, evt, true)) { + var endTdCol = ut.getCell(ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].rowIndex, ut.indexTable[ut.rowsNum - 1][cellInfo.colIndex].cellIndex); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdCol) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } else { + if (target !== endTdCol) { + cellsRange = ut.getCellsRange(target, endTdCol); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdCol).select(); + } + } + return; + } + if (inTableSide(table, target, evt)) { + var endTdRow = ut.getCell(ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].rowIndex, ut.indexTable[cellInfo.rowIndex][ut.colsNum - 1].cellIndex); + if (evt.shiftKey && ut.selectedTds.length) { + if (ut.selectedTds[0] !== endTdRow) { + cellsRange = ut.getCellsRange(ut.selectedTds[0], endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } else { + if (target !== endTdRow) { + cellsRange = ut.getCellsRange(target, endTdRow); + ut.setSelected(cellsRange); + } else { + rng && rng.selectNodeContents(endTdRow).select(); + } + } + } + }; + }); + + switchBorderColor(me, true); + }); + + domUtils.on(me.document, "mousemove", mouseMoveEvent); + + domUtils.on(me.document, "mouseout", function (evt) { + var target = evt.target || evt.srcElement; + if (target.tagName == "TABLE") { + toggleDraggableState(me, false, "", null); + } + }); + /** + * 表格隔行变色 + */ + me.addListener("interlacetable",function(type,table,classList){ + if(!table) return; + var me = this, + rows = table.rows, + len = rows.length, + getClass = function(list,index,repeat){ + return list[index] ? list[index] : repeat ? list[index % list.length]: ""; + }; + for(var i = 0;i 1 ? currentRowIndex : ua.getCellInfo(cell).rowIndex; + var nextCell = ua.getTabNextCell(cell, currentRowIndex); + if (nextCell) { + if (isEmptyBlock(nextCell)) { + range.setStart(nextCell, 0).setCursor(false, true) + } else { + range.selectNodeContents(nextCell).select() + } + } else { + me.fireEvent('saveScene'); + me.__hasEnterExecCommand = true; + this.execCommand('insertrownext'); + me.__hasEnterExecCommand = false; + range = this.selection.getRange(); + range.setStart(table.rows[table.rows.length - 1].cells[0], 0).setCursor(); + me.fireEvent('saveScene'); + } + } + return true; + } + + }); + browser.ie && me.addListener('selectionchange', function () { + toggleDraggableState(this, false, "", null); + }); + me.addListener("keydown", function (type, evt) { + var me = this; + //处理在表格的最后一个输入tab产生新的表格 + var keyCode = evt.keyCode || evt.which; + if (keyCode == 8 || keyCode == 46) { + return; + } + var notCtrlKey = !evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey; + notCtrlKey && removeSelectedClass(domUtils.getElementsByTagName(me.body, "td")); + var ut = getUETableBySelected(me); + if (!ut) return; + notCtrlKey && ut.clearSelected(); + }); + + me.addListener("beforegetcontent", function () { + switchBorderColor(this, false); + browser.ie && utils.each(this.document.getElementsByTagName('caption'), function (ci) { + if (domUtils.isEmptyNode(ci)) { + ci.innerHTML = ' ' + } + }); + }); + me.addListener("aftergetcontent", function () { + switchBorderColor(this, true); + }); + me.addListener("getAllHtml", function () { + removeSelectedClass(me.document.getElementsByTagName("td")); + }); + //修正全屏状态下插入的表格宽度在非全屏状态下撑开编辑器的情况 + me.addListener("fullscreenchanged", function (type, fullscreen) { + if (!fullscreen) { + var ratio = this.body.offsetWidth / document.body.offsetWidth, + tables = domUtils.getElementsByTagName(this.body, "table"); + utils.each(tables, function (table) { + if (table.offsetWidth < me.body.offsetWidth) return false; + var tds = domUtils.getElementsByTagName(table, "td"), + backWidths = []; + utils.each(tds, function (td) { + backWidths.push(td.offsetWidth); + }); + for (var i = 0, td; td = tds[i]; i++) { + td.setAttribute("width", Math.floor(backWidths[i] * ratio)); + } + table.setAttribute("width", Math.floor(getTableWidth(me, needIEHack, getDefaultValue(me)))) + }); + } + }); + + //重写execCommand命令,用于处理框选时的处理 + var oldExecCommand = me.execCommand; + me.execCommand = function (cmd, datatat) { + + var me = this, + args = arguments; + + cmd = cmd.toLowerCase(); + var ut = getUETableBySelected(me), tds, + range = new dom.Range(me.document), + cmdFun = me.commands[cmd] || UE.commands[cmd], + result; + if (!cmdFun) return; + if (ut && !commands[cmd] && !cmdFun.notNeedUndo && !me.__hasEnterExecCommand) { + me.__hasEnterExecCommand = true; + me.fireEvent("beforeexeccommand", cmd); + tds = ut.selectedTds; + var lastState = -2, lastValue = -2, value, state; + for (var i = 0, td; td = tds[i]; i++) { + if (isEmptyBlock(td)) { + range.setStart(td, 0).setCursor(false, true) + } else { + range.selectNode(td).select(true); + } + state = me.queryCommandState(cmd); + value = me.queryCommandValue(cmd); + if (state != -1) { + if (lastState !== state || lastValue !== value) { + me._ignoreContentChange = true; + result = oldExecCommand.apply(me, arguments); + me._ignoreContentChange = false; + + } + lastState = me.queryCommandState(cmd); + lastValue = me.queryCommandValue(cmd); + if (domUtils.isEmptyBlock(td)) { + domUtils.fillNode(me.document, td) + } + } + } + range.setStart(tds[0], 0).shrinkBoundary(true).setCursor(false, true); + me.fireEvent('contentchange'); + me.fireEvent("afterexeccommand", cmd); + me.__hasEnterExecCommand = false; + me._selectionChange(); + } else { + result = oldExecCommand.apply(me, arguments); + } + return result; + }; + + + }); + /** + * 删除obj的宽高style,改成属性宽高 + * @param obj + * @param replaceToProperty + */ + function removeStyleSize(obj, replaceToProperty) { + removeStyle(obj, "width", true); + removeStyle(obj, "height", true); + } + + function removeStyle(obj, styleName, replaceToProperty) { + if (obj.style[styleName]) { + replaceToProperty && obj.setAttribute(styleName, parseInt(obj.style[styleName], 10)); + obj.style[styleName] = ""; + } + } + + function getParentTdOrTh(ele) { + if (ele.tagName == "TD" || ele.tagName == "TH") return ele; + var td; + if (td = domUtils.findParentByTagName(ele, "td", true) || domUtils.findParentByTagName(ele, "th", true)) return td; + return null; + } + + function isEmptyBlock(node) { + var reg = new RegExp(domUtils.fillChar, 'g'); + if (node[browser.ie ? 'innerText' : 'textContent'].replace(/^\s*$/, '').replace(reg, '').length > 0) { + return 0; + } + for (var n in dtd.$isNotEmpty) { + if (node.getElementsByTagName(n).length) { + return 0; + } + } + return 1; + } + + + function mouseCoords(evt) { + if (evt.pageX || evt.pageY) { + return { x:evt.pageX, y:evt.pageY }; + } + return { + x:evt.clientX + me.document.body.scrollLeft - me.document.body.clientLeft, + y:evt.clientY + me.document.body.scrollTop - me.document.body.clientTop + }; + } + + function mouseMoveEvent(evt) { + + if( isEditorDisabled() ) { + return; + } + + try { + + //普通状态下鼠标移动 + var target = getParentTdOrTh(evt.target || evt.srcElement), + pos; + + //区分用户的行为是拖动还是双击 + if( isInResizeBuffer ) { + + me.body.style.webkitUserSelect = 'none'; + + if( Math.abs( userActionStatus.x - evt.clientX ) > offsetOfTableCell || Math.abs( userActionStatus.y - evt.clientY ) > offsetOfTableCell ) { + clearTableDragTimer(); + isInResizeBuffer = false; + singleClickState = 0; + //drag action + tableBorderDrag(evt); + } + } + + //修改单元格大小时的鼠标移动 + if (onDrag && dragTd) { + singleClickState = 0; + me.body.style.webkitUserSelect = 'none'; + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + pos = mouseCoords(evt); + toggleDraggableState(me, true, onDrag, pos, target); + if (onDrag == "h") { + dragLine.style.left = getPermissionX(dragTd, evt) + "px"; + } else if (onDrag == "v") { + dragLine.style.top = getPermissionY(dragTd, evt) + "px"; + } + return; + } + //当鼠标处于table上时,修改移动过程中的光标状态 + if (target) { + //针对使用table作为容器的组件不触发拖拽效果 + if (me.fireEvent('excludetable', target) === true) + return; + pos = mouseCoords(evt); + var state = getRelation(target, pos), + table = domUtils.findParentByTagName(target, "table", true); + + if (inTableSide(table, target, evt, true)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = "url(" + me.options.cursorpath + "h.png),pointer"; + } else if (inTableSide(table, target, evt)) { + if (me.fireEvent("excludetable", table) === true) return; + me.body.style.cursor = "url(" + me.options.cursorpath + "v.png),pointer"; + } else { + me.body.style.cursor = "text"; + var curCell = target; + if (/\d/.test(state)) { + state = state.replace(/\d/, ''); + target = getUETable(target).getPreviewCell(target, state == "v"); + } + //位于第一行的顶部或者第一列的左边时不可拖动 + toggleDraggableState(me, target ? !!state : false, target ? state : '', pos, target); + + } + } else { + toggleDragButton(false, table, me); + } + + } catch (e) { + showError(e); + } + } + + var dragButtonTimer; + + function toggleDragButton(show, table, editor) { + if (!show) { + if (dragOver)return; + dragButtonTimer = setTimeout(function () { + !dragOver && dragButton && dragButton.parentNode && dragButton.parentNode.removeChild(dragButton); + }, 2000); + } else { + createDragButton(table, editor); + } + } + + function createDragButton(table, editor) { + var pos = domUtils.getXY(table), + doc = table.ownerDocument; + if (dragButton && dragButton.parentNode)return dragButton; + dragButton = doc.createElement("div"); + dragButton.contentEditable = false; + dragButton.innerHTML = ""; + dragButton.style.cssText = "width:15px;height:15px;background-image:url(" + editor.options.UEDITOR_HOME_URL + "dialogs/table/dragicon.png);position: absolute;cursor:move;top:" + (pos.y - 15) + "px;left:" + (pos.x) + "px;"; + domUtils.unSelectable(dragButton); + dragButton.onmouseover = function (evt) { + dragOver = true; + }; + dragButton.onmouseout = function (evt) { + dragOver = false; + }; + domUtils.on(dragButton, 'click', function (type, evt) { + doClick(evt, this); + }); + domUtils.on(dragButton, 'dblclick', function (type, evt) { + doDblClick(evt); + }); + domUtils.on(dragButton, 'dragstart', function (type, evt) { + domUtils.preventDefault(evt); + }); + var timer; + + function doClick(evt, button) { + // 部分浏览器下需要清理 + clearTimeout(timer); + timer = setTimeout(function () { + editor.fireEvent("tableClicked", table, button); + }, 300); + } + + function doDblClick(evt) { + clearTimeout(timer); + var ut = getUETable(table), + start = table.rows[0].cells[0], + end = ut.getLastCell(), + range = ut.getCellsRange(start, end); + editor.selection.getRange().setStart(start, 0).setCursor(false, true); + ut.setSelected(range); + } + + doc.body.appendChild(dragButton); + } + + +// function inPosition(table, pos) { +// var tablePos = domUtils.getXY(table), +// width = table.offsetWidth, +// height = table.offsetHeight; +// if (pos.x - tablePos.x < 5 && pos.y - tablePos.y < 5) { +// return "topLeft"; +// } else if (tablePos.x + width - pos.x < 5 && tablePos.y + height - pos.y < 5) { +// return "bottomRight"; +// } +// } + + function inTableSide(table, cell, evt, top) { + var pos = mouseCoords(evt), + state = getRelation(cell, pos); + + if (top) { + var caption = table.getElementsByTagName("caption")[0], + capHeight = caption ? caption.offsetHeight : 0; + return (state == "v1") && ((pos.y - domUtils.getXY(table).y - capHeight) < 8); + } else { + return (state == "h1") && ((pos.x - domUtils.getXY(table).x) < 8); + } + } + + /** + * 获取拖动时允许的X轴坐标 + * @param dragTd + * @param evt + */ + function getPermissionX(dragTd, evt) { + var ut = getUETable(dragTd); + if (ut) { + var preTd = ut.getSameEndPosCells(dragTd, "x")[0], + nextTd = ut.getSameStartPosXCells(dragTd)[0], + mouseX = mouseCoords(evt).x, + left = (preTd ? domUtils.getXY(preTd).x : domUtils.getXY(ut.table).x) + 20 , + right = nextTd ? domUtils.getXY(nextTd).x + nextTd.offsetWidth - 20 : (me.body.offsetWidth + 5 || parseInt(domUtils.getComputedStyle(me.body, "width"), 10)); + + left += cellMinWidth; + right -= cellMinWidth; + + return mouseX < left ? left : mouseX > right ? right : mouseX; + } + } + + /** + * 获取拖动时允许的Y轴坐标 + */ + function getPermissionY(dragTd, evt) { + try { + var top = domUtils.getXY(dragTd).y, + mousePosY = mouseCoords(evt).y; + return mousePosY < top ? top : mousePosY; + } catch (e) { + showError(e); + } + } + + /** + * 移动状态切换 + */ + function toggleDraggableState(editor, draggable, dir, mousePos, cell) { + try { + editor.body.style.cursor = dir == "h" ? "col-resize" : dir == "v" ? "row-resize" : "text"; + if (browser.ie) { + if (dir && !mousedown && !getUETableBySelected(editor)) { + getDragLine(editor, editor.document); + showDragLineAt(dir, cell); + } else { + hideDragLine(editor) + } + } + onBorder = draggable; + } catch (e) { + showError(e); + } + } + + /** + * 获取与UETable相关的resize line + * @param uetable UETable对象 + */ + function getResizeLineByUETable() { + + var lineId = '_UETableResizeLine', + line = this.document.getElementById( lineId ); + + if( !line ) { + line = this.document.createElement("div"); + line.id = lineId; + line.contnetEditable = false; + line.setAttribute("unselectable", "on"); + + var styles = { + width: 2*cellBorderWidth + 1 + 'px', + position: 'absolute', + 'z-index': 100000, + cursor: 'col-resize', + background: 'red', + display: 'none' + }; + + //切换状态 + line.onmouseout = function(){ + this.style.display = 'none'; + }; + + utils.extend( line.style, styles ); + + this.document.body.appendChild( line ); + + } + + return line; + + } + + /** + * 更新resize-line + */ + function updateResizeLine( cell, uetable ) { + + var line = getResizeLineByUETable.call( this ), + table = uetable.table, + styles = { + top: domUtils.getXY( table ).y + 'px', + left: domUtils.getXY( cell).x + cell.offsetWidth - cellBorderWidth + 'px', + display: 'block', + height: table.offsetHeight + 'px' + }; + + utils.extend( line.style, styles ); + + } + + /** + * 显示resize-line + */ + function showResizeLine( cell ) { + + var uetable = getUETable( cell ); + + updateResizeLine.call( this, cell, uetable ); + + } + + /** + * 获取鼠标与当前单元格的相对位置 + * @param ele + * @param mousePos + */ + function getRelation(ele, mousePos) { + var elePos = domUtils.getXY(ele); + + if( !elePos ) { + return ''; + } + + if (elePos.x + ele.offsetWidth - mousePos.x < cellBorderWidth) { + return "h"; + } + if (mousePos.x - elePos.x < cellBorderWidth) { + return 'h1' + } + if (elePos.y + ele.offsetHeight - mousePos.y < cellBorderWidth) { + return "v"; + } + if (mousePos.y - elePos.y < cellBorderWidth) { + return 'v1' + } + return ''; + } + + function mouseDownEvent(type, evt) { + + if( isEditorDisabled() ) { + return ; + } + + userActionStatus = { + x: evt.clientX, + y: evt.clientY + }; + + //右键菜单单独处理 + if (evt.button == 2) { + var ut = getUETableBySelected(me), + flag = false; + + if (ut) { + var td = getTargetTd(me, evt); + utils.each(ut.selectedTds, function (ti) { + if (ti === td) { + flag = true; + } + }); + if (!flag) { + removeSelectedClass(domUtils.getElementsByTagName(me.body, "th td")); + ut.clearSelected() + } else { + td = ut.selectedTds[0]; + setTimeout(function () { + me.selection.getRange().setStart(td, 0).setCursor(false, true); + }, 0); + + } + } + } else { + tableClickHander( evt ); + } + + } + + //清除表格的计时器 + function clearTableTimer() { + tabTimer && clearTimeout( tabTimer ); + tabTimer = null; + } + + //双击收缩 + function tableDbclickHandler(evt) { + singleClickState = 0; + evt = evt || me.window.event; + var target = getParentTdOrTh(evt.target || evt.srcElement); + if (target) { + var h; + if (h = getRelation(target, mouseCoords(evt))) { + + hideDragLine( me ); + + if (h == 'h1') { + h = 'h'; + if (inTableSide(domUtils.findParentByTagName(target, "table"), target, evt)) { + me.execCommand('adaptbywindow'); + } else { + target = getUETable(target).getPreviewCell(target); + if (target) { + var rng = me.selection.getRange(); + rng.selectNodeContents(target).setCursor(true, true) + } + } + } + if (h == 'h') { + var ut = getUETable(target), + table = ut.table, + cells = getCellsByMoveBorder( target, table, true ); + + cells = extractArray( cells, 'left' ); + + ut.width = ut.offsetWidth; + + var oldWidth = [], + newWidth = []; + + utils.each( cells, function( cell ){ + + oldWidth.push( cell.offsetWidth ); + + } ); + + utils.each( cells, function( cell ){ + + cell.removeAttribute("width"); + + } ); + + window.setTimeout( function(){ + + //是否允许改变 + var changeable = true; + + utils.each( cells, function( cell, index ){ + + var width = cell.offsetWidth; + + if( width > oldWidth[index] ) { + changeable = false; + return false; + } + + newWidth.push( width ); + + } ); + + var change = changeable ? newWidth : oldWidth; + + utils.each( cells, function( cell, index ){ + + cell.width = change[index] - getTabcellSpace(); + + } ); + + + }, 0 ); + +// minWidth -= cellMinWidth; +// +// table.removeAttribute("width"); +// utils.each(cells, function (cell) { +// cell.style.width = ""; +// cell.width -= minWidth; +// }); + + } + } + } + } + + function tableClickHander( evt ) { + + removeSelectedClass(domUtils.getElementsByTagName(me.body, "td th")); + //trace:3113 + //选中单元格,点击table外部,不会清掉table上挂的ueTable,会引起getUETableBySelected方法返回值 + utils.each(me.document.getElementsByTagName('table'), function (t) { + t.ueTable = null; + }); + startTd = getTargetTd(me, evt); + if( !startTd ) return; + var table = domUtils.findParentByTagName(startTd, "table", true); + ut = getUETable(table); + ut && ut.clearSelected(); + + //判断当前鼠标状态 + if (!onBorder) { + me.document.body.style.webkitUserSelect = ''; + mousedown = true; + me.addListener('mouseover', mouseOverEvent); + } else { + //边框上的动作处理 + borderActionHandler( evt ); + } + + + } + + //处理表格边框上的动作, 这里做延时处理,避免两种动作互相影响 + function borderActionHandler( evt ) { + + if ( browser.ie ) { + evt = reconstruct(evt ); + } + + clearTableDragTimer(); + + //是否正在等待resize的缓冲中 + isInResizeBuffer = true; + + tableDragTimer = setTimeout(function(){ + tableBorderDrag( evt ); + }, dblclickTime); + + } + + function extractArray( originArr, key ) { + + var result = [], + tmp = null; + + for( var i = 0, len = originArr.length; i 0 && singleClickState--; + }, dblclickTime ); + + if( singleClickState === 2 ) { + + singleClickState = 0; + tableDbclickHandler(evt); + return; + + } + + } + + if (evt.button == 2)return; + var me = this; + //清除表格上原生跨选问题 + var range = me.selection.getRange(), + start = domUtils.findParentByTagName(range.startContainer, 'table', true), + end = domUtils.findParentByTagName(range.endContainer, 'table', true); + + if (start || end) { + if (start === end) { + start = domUtils.findParentByTagName(range.startContainer, ['td', 'th', 'caption'], true); + end = domUtils.findParentByTagName(range.endContainer, ['td', 'th', 'caption'], true); + if (start !== end) { + me.selection.clearRange() + } + } else { + me.selection.clearRange() + } + } + mousedown = false; + me.document.body.style.webkitUserSelect = ''; + //拖拽状态下的mouseUP + if ( onDrag && dragTd ) { + + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + + singleClickState = 0; + dragLine = me.document.getElementById('ue_tableDragLine'); + + // trace 3973 + if (dragLine) { + var dragTdPos = domUtils.getXY(dragTd), + dragLinePos = domUtils.getXY(dragLine); + + switch (onDrag) { + case "h": + changeColWidth(dragTd, dragLinePos.x - dragTdPos.x); + break; + case "v": + changeRowHeight(dragTd, dragLinePos.y - dragTdPos.y - dragTd.offsetHeight); + break; + default: + } + onDrag = ""; + dragTd = null; + + hideDragLine(me); + me.fireEvent('saveScene'); + return; + } + } + //正常状态下的mouseup + if (!startTd) { + var target = domUtils.findParentByTagName(evt.target || evt.srcElement, "td", true); + if (!target) target = domUtils.findParentByTagName(evt.target || evt.srcElement, "th", true); + if (target && (target.tagName == "TD" || target.tagName == "TH")) { + if (me.fireEvent("excludetable", target) === true) return; + range = new dom.Range(me.document); + range.setStart(target, 0).setCursor(false, true); + } + } else { + var ut = getUETable(startTd), + cell = ut ? ut.selectedTds[0] : null; + if (cell) { + range = new dom.Range(me.document); + if (domUtils.isEmptyBlock(cell)) { + range.setStart(cell, 0).setCursor(false, true); + } else { + range.selectNodeContents(cell).shrinkBoundary().setCursor(false, true); + } + } else { + range = me.selection.getRange().shrinkBoundary(); + if (!range.collapsed) { + var start = domUtils.findParentByTagName(range.startContainer, ['td', 'th'], true), + end = domUtils.findParentByTagName(range.endContainer, ['td', 'th'], true); + //在table里边的不能清除 + if (start && !end || !start && end || start && end && start !== end) { + range.setCursor(false, true); + } + } + } + startTd = null; + me.removeListener('mouseover', mouseOverEvent); + } + me._selectionChange(250, evt); + } + + function mouseOverEvent(type, evt) { + + if( isEditorDisabled() ) { + return; + } + + var me = this, + tar = evt.target || evt.srcElement; + currentTd = domUtils.findParentByTagName(tar, "td", true) || domUtils.findParentByTagName(tar, "th", true); + //需要判断两个TD是否位于同一个表格内 + if (startTd && currentTd && + ((startTd.tagName == "TD" && currentTd.tagName == "TD") || (startTd.tagName == "TH" && currentTd.tagName == "TH")) && + domUtils.findParentByTagName(startTd, 'table') == domUtils.findParentByTagName(currentTd, 'table')) { + var ut = getUETable(currentTd); + if (startTd != currentTd) { + me.document.body.style.webkitUserSelect = 'none'; + me.selection.getNative()[browser.ie9below ? 'empty' : 'removeAllRanges'](); + var range = ut.getCellsRange(startTd, currentTd); + ut.setSelected(range); + } else { + me.document.body.style.webkitUserSelect = ''; + ut.clearSelected(); + } + + } + evt.preventDefault ? evt.preventDefault() : (evt.returnValue = false); + } + + function setCellHeight(cell, height, backHeight) { + var lineHight = parseInt(domUtils.getComputedStyle(cell, "line-height"), 10), + tmpHeight = backHeight + height; + height = tmpHeight < lineHight ? lineHight : tmpHeight; + if (cell.style.height) cell.style.height = ""; + cell.rowSpan == 1 ? cell.setAttribute("height", height) : (cell.removeAttribute && cell.removeAttribute("height")); + } + + function getWidth(cell) { + if (!cell)return 0; + return parseInt(domUtils.getComputedStyle(cell, "width"), 10); + } + + function changeColWidth(cell, changeValue) { + + var ut = getUETable(cell); + if (ut) { + + //根据当前移动的边框获取相关的单元格 + var table = ut.table, + cells = getCellsByMoveBorder( cell, table ); + + table.style.width = ""; + table.removeAttribute("width"); + + //修正改变量 + changeValue = correctChangeValue( changeValue, cell, cells ); + + if (cell.nextSibling) { + + var i=0; + + utils.each( cells, function( cellGroup ){ + + cellGroup.left.width = (+cellGroup.left.width)+changeValue; + cellGroup.right && ( cellGroup.right.width = (+cellGroup.right.width)-changeValue ); + + } ); + + } else { + + utils.each( cells, function( cellGroup ){ + cellGroup.left.width -= -changeValue; + } ); + + } + } + + } + + function isEditorDisabled() { + return me.body.contentEditable === "false"; + } + + function changeRowHeight(td, changeValue) { + if (Math.abs(changeValue) < 10) return; + var ut = getUETable(td); + if (ut) { + var cells = ut.getSameEndPosCells(td, "y"), + //备份需要连带变化的td的原始高度,否则后期无法获取正确的值 + backHeight = cells[0] ? cells[0].offsetHeight : 0; + for (var i = 0, cell; cell = cells[i++];) { + setCellHeight(cell, changeValue, backHeight); + } + } + + } + + /** + * 获取调整单元格大小的相关单元格 + * @isContainMergeCell 返回的结果中是否包含发生合并后的单元格 + */ + function getCellsByMoveBorder( cell, table, isContainMergeCell ) { + + if( !table ) { + table = domUtils.findParentByTagName( cell, 'table' ); + } + + if( !table ) { + return null; + } + + //获取到该单元格所在行的序列号 + var index = domUtils.getNodeIndex( cell ), + temp = cell, + rows = table.rows, + colIndex = 0; + + while( temp ) { + //获取到当前单元格在未发生单元格合并时的序列 + if( temp.nodeType === 1 ) { + colIndex += (temp.colSpan || 1); + } + temp = temp.previousSibling; + } + + temp = null; + + //记录想关的单元格 + var borderCells = []; + + utils.each(rows, function( tabRow ){ + + var cells = tabRow.cells, + currIndex = 0; + + utils.each( cells, function( tabCell ){ + + currIndex += (tabCell.colSpan || 1); + + if( currIndex === colIndex ) { + + borderCells.push({ + left: tabCell, + right: tabCell.nextSibling || null + }); + + return false; + + } else if( currIndex > colIndex ) { + + if( isContainMergeCell ) { + borderCells.push({ + left: tabCell + }); + } + + return false; + } + + + } ); + + }); + + return borderCells; + + } + + + /** + * 通过给定的单元格集合获取最小的单元格width + */ + function getMinWidthByTableCells( cells ) { + + var minWidth = Number.MAX_VALUE; + + for( var i = 0, curCell; curCell = cells[ i ] ; i++ ) { + + minWidth = Math.min( minWidth, curCell.width || getTableCellWidth( curCell ) ); + + } + + return minWidth; + + } + + function correctChangeValue( changeValue, relatedCell, cells ) { + + //为单元格的paading预留空间 + changeValue -= getTabcellSpace(); + + if( changeValue < 0 ) { + return 0; + } + + changeValue -= getTableCellWidth( relatedCell ); + + //确定方向 + var direction = changeValue < 0 ? 'left':'right'; + + changeValue = Math.abs(changeValue); + + //只关心非最后一个单元格就可以 + utils.each( cells, function( cellGroup ){ + + var curCell = cellGroup[direction]; + + //为单元格保留最小空间 + if( curCell ) { + changeValue = Math.min( changeValue, getTableCellWidth( curCell )-cellMinWidth ); + } + + + } ); + + + //修正越界 + changeValue = changeValue < 0 ? 0 : changeValue; + + return direction === 'left' ? -changeValue : changeValue; + + } + + function getTableCellWidth( cell ) { + + var width = 0, + //偏移纠正量 + offset = 0, + width = cell.offsetWidth - getTabcellSpace(); + + //最后一个节点纠正一下 + if( !cell.nextSibling ) { + + width -= getTableCellOffset( cell ); + + } + + width = width < 0 ? 0 : width; + + try { + cell.width = width; + } catch(e) { + } + + return width; + + } + + /** + * 获取单元格所在表格的最末单元格的偏移量 + */ + function getTableCellOffset( cell ) { + + tab = domUtils.findParentByTagName( cell, "table", false); + + if( tab.offsetVal === undefined ) { + + var prev = cell.previousSibling; + + if( prev ) { + + //最后一个单元格和前一个单元格的width diff结果 如果恰好为一个border width, 则条件成立 + tab.offsetVal = cell.offsetWidth - prev.offsetWidth === UT.borderWidth ? UT.borderWidth : 0; + + } else { + tab.offsetVal = 0; + } + + } + + return tab.offsetVal; + + } + + function getTabcellSpace() { + + if( UT.tabcellSpace === undefined ) { + + var cell = null, + tab = me.document.createElement("table"), + tbody = me.document.createElement("tbody"), + trow = me.document.createElement("tr"), + tabcell = me.document.createElement("td"), + mirror = null; + + tabcell.style.cssText = 'border: 0;'; + tabcell.width = 1; + + trow.appendChild( tabcell ); + trow.appendChild( mirror = tabcell.cloneNode( false ) ); + + tbody.appendChild( trow ); + + tab.appendChild( tbody ); + + tab.style.cssText = "visibility: hidden;"; + + me.body.appendChild( tab ); + + UT.paddingSpace = tabcell.offsetWidth - 1; + + var tmpTabWidth = tab.offsetWidth; + + tabcell.style.cssText = ''; + mirror.style.cssText = ''; + + UT.borderWidth = ( tab.offsetWidth - tmpTabWidth ) / 3; + + UT.tabcellSpace = UT.paddingSpace + UT.borderWidth; + + me.body.removeChild( tab ); + + } + + getTabcellSpace = function(){ return UT.tabcellSpace; }; + + return UT.tabcellSpace; + + } + + function getDragLine(editor, doc) { + if (mousedown)return; + dragLine = editor.document.createElement("div"); + domUtils.setAttributes(dragLine, { + id:"ue_tableDragLine", + unselectable:'on', + contenteditable:false, + 'onresizestart':'return false', + 'ondragstart':'return false', + 'onselectstart':'return false', + style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)" + }); + editor.body.appendChild(dragLine); + } + + function hideDragLine(editor) { + if (mousedown)return; + var line; + while (line = editor.document.getElementById('ue_tableDragLine')) { + domUtils.remove(line) + } + } + + /** + * 依据state(v|h)在cell位置显示横线 + * @param state + * @param cell + */ + function showDragLineAt(state, cell) { + if (!cell) return; + var table = domUtils.findParentByTagName(cell, "table"), + caption = table.getElementsByTagName('caption'), + width = table.offsetWidth, + height = table.offsetHeight - (caption.length > 0 ? caption[0].offsetHeight : 0), + tablePos = domUtils.getXY(table), + cellPos = domUtils.getXY(cell), css; + switch (state) { + case "h": + css = 'height:' + height + 'px;top:' + (tablePos.y + (caption.length > 0 ? caption[0].offsetHeight : 0)) + 'px;left:' + (cellPos.x + cell.offsetWidth); + dragLine.style.cssText = css + 'px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)'; + break; + case "v": + css = 'width:' + width + 'px;left:' + tablePos.x + 'px;top:' + (cellPos.y + cell.offsetHeight ); + //必须加上border:0和color:blue,否则低版ie不支持背景色显示 + dragLine.style.cssText = css + 'px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)'; + break; + default: + } + } + + /** + * 当表格边框颜色为白色时设置为虚线,true为添加虚线 + * @param editor + * @param flag + */ + function switchBorderColor(editor, flag) { + var tableArr = domUtils.getElementsByTagName(editor.body, "table"), color; + for (var i = 0, node; node = tableArr[i++];) { + var td = domUtils.getElementsByTagName(node, "td"); + if (td[0]) { + if (flag) { + color = (td[0].style.borderColor).replace(/\s/g, ""); + if (/(#ffffff)|(rgb\(255,255,255\))/ig.test(color)) + domUtils.addClass(node, "noBorderTable") + } else { + domUtils.removeClasses(node, "noBorderTable") + } + } + + } + } + + function getTableWidth(editor, needIEHack, defaultValue) { + var body = editor.body; + return body.offsetWidth - (needIEHack ? parseInt(domUtils.getComputedStyle(body, 'margin-left'), 10) * 2 : 0) - defaultValue.tableBorder * 2 - (editor.options.offsetWidth || 0); + } + + /** + * 获取当前拖动的单元格 + */ + function getTargetTd(editor, evt) { + + var target = domUtils.findParentByTagName(evt.target || evt.srcElement, ["td", "th"], true), + dir = null; + + if( !target ) { + return null; + } + + dir = getRelation( target, mouseCoords( evt ) ); + + //如果有前一个节点, 需要做一个修正, 否则可能会得到一个错误的td + + if( !target ) { + return null; + } + + if( dir === 'h1' && target.previousSibling ) { + + var position = domUtils.getXY( target), + cellWidth = target.offsetWidth; + + if( Math.abs( position.x + cellWidth - evt.clientX ) > cellWidth / 3 ) { + target = target.previousSibling; + } + + } else if( dir === 'v1' && target.parentNode.previousSibling ) { + + var position = domUtils.getXY( target), + cellHeight = target.offsetHeight; + + if( Math.abs( position.y + cellHeight - evt.clientY ) > cellHeight / 3 ) { + target = target.parentNode.previousSibling.firstChild; + } + + } + + + //排除了非td内部以及用于代码高亮部分的td + return target && !(editor.fireEvent("excludetable", target) === true) ? target : null; + } + +}; + + +// plugins/table.sort.js +/** + * Created with JetBrains PhpStorm. + * User: Jinqn + * Date: 13-10-12 + * Time: 上午10:20 + * To change this template use File | Settings | File Templates. + */ + +UE.UETable.prototype.sortTable = function (sortByCellIndex, compareFn) { + var table = this.table, + rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + if(this.selectedTds.length){ + var range = this.cellsRange, + len = range.endRowIndex + 1; + for (var i = range.beginRowIndex; i < len; i++) { + trArray[i] = rows[i]; + } + trArray.splice(0,range.beginRowIndex); + lastRowIndex = (range.endRowIndex +1) === this.rowsNum ? 0 : range.endRowIndex +1; + }else{ + for (var i = 0,len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + } + + var Fn = { + 'reversecurrent': function(td1,td2){ + return 1; + }, + 'orderbyasc': function(td1,td2){ + var value1 = td1.innerText||td1.textContent, + value2 = td2.innerText||td2.textContent; + return value1.localeCompare(value2); + }, + 'reversebyasc': function(td1,td2){ + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + 'orderbynum': function(td1,td2){ + var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value1||0) - (value2||0); + }, + 'reversebynum': function(td1,td2){ + var value1 = td1[browser.ie ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[browser.ie ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value2||0) - (value1||0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:''); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = utils.sort(trArray,function (tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else { + result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if(!lastRowIndex){ + tbody.appendChild(fragment); + }else{ + tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1]) + } +}; + +UE.plugins['tablesort'] = function () { + var me = this, + UT = UE.UETable, + getUETable = function (tdOrTable) { + return UT.getUETable(tdOrTable); + }, + getTableItemsByRange = function (editor) { + return UT.getTableItemsByRange(editor); + }; + + + me.ready(function () { + //添加表格可排序的样式 + utils.cssRule('tablesort', + 'table.sortEnabled tr.firstRow th,table.sortEnabled tr.firstRow td{padding-right:20px;background-repeat: no-repeat;background-position: center right;' + + ' background-image:url(' + me.options.themePath + me.options.theme + '/images/sortable.png);}', + me.document); + + //做单元格合并操作时,清除可排序标识 + me.addListener("afterexeccommand", function (type, cmd) { + if( cmd == 'mergeright' || cmd == 'mergedown' || cmd == 'mergecells') { + this.execCommand('disablesort'); + } + }); + }); + + + + //表格排序 + UE.commands['sorttable'] = { + queryCommandState: function () { + var me = this, + tableItems = getTableItemsByRange(me); + if (!tableItems.cell) return -1; + var table = tableItems.table, + cells = table.getElementsByTagName("td"); + for (var i = 0, cell; cell = cells[i++];) { + if (cell.rowSpan != 1 || cell.colSpan != 1) return -1; + } + return 0; + }, + execCommand: function (cmd, fn) { + var me = this, + range = me.selection.getRange(), + bk = range.createBookmark(true), + tableItems = getTableItemsByRange(me), + cell = tableItems.cell, + ut = getUETable(tableItems.table), + cellInfo = ut.getCellInfo(cell); + ut.sortTable(cellInfo.cellIndex, fn); + range.moveToBookmark(bk); + try{ + range.select(); + }catch(e){} + } + }; + + //设置表格可排序,清除表格可排序 + UE.commands["enablesort"] = UE.commands["disablesort"] = { + queryCommandState: function (cmd) { + var table = getTableItemsByRange(this).table; + if(table && cmd=='enablesort') { + var cells = domUtils.getElementsByTagName(table, 'th td'); + for(var i = 0; i1 || cells[i].getAttribute('rowspan')>1) return -1; + } + } + + return !table ? -1: cmd=='enablesort' ^ table.getAttribute('data-sort')!='sortEnabled' ? -1:0; + }, + execCommand: function (cmd) { + var table = getTableItemsByRange(this).table; + table.setAttribute("data-sort", cmd == "enablesort" ? "sortEnabled" : "sortDisabled"); + cmd == "enablesort" ? domUtils.addClass(table,"sortEnabled"):domUtils.removeClasses(table,"sortEnabled"); + } + }; +}; + + +// plugins/contextmenu.js +///import core +///commands 右键菜单 +///commandsName ContextMenu +///commandsTitle 右键菜单 +/** + * 右键菜单 + * @function + * @name baidu.editor.plugins.contextmenu + * @author zhanyi + */ + +UE.plugins['contextmenu'] = function () { + var me = this; + me.setOpt('enableContextMenu',true); + if(me.getOpt('enableContextMenu') === false){ + return; + } + var lang = me.getLang( "contextMenu" ), + menu, + items = me.options.contextMenu || [ + {label:lang['selectall'], cmdName:'selectall'}, + { + label:lang.cleardoc, + cmdName:'cleardoc', + exec:function () { + if ( confirm( lang.confirmclear ) ) { + this.execCommand( 'cleardoc' ); + } + } + }, + '-', + { + label:lang.unlink, + cmdName:'unlink' + }, + '-', + { + group:lang.paragraph, + icon:'justifyjustify', + subMenu:[ + { + label:lang.justifyleft, + cmdName:'justify', + value:'left' + }, + { + label:lang.justifyright, + cmdName:'justify', + value:'right' + }, + { + label:lang.justifycenter, + cmdName:'justify', + value:'center' + }, + { + label:lang.justifyjustify, + cmdName:'justify', + value:'justify' + } + ] + }, + '-', + { + group:lang.table, + icon:'table', + subMenu:[ + { + label:lang.inserttable, + cmdName:'inserttable' + }, + { + label:lang.deletetable, + cmdName:'deletetable' + }, + '-', + { + label:lang.deleterow, + cmdName:'deleterow' + }, + { + label:lang.deletecol, + cmdName:'deletecol' + }, + { + label:lang.insertcol, + cmdName:'insertcol' + }, + { + label:lang.insertcolnext, + cmdName:'insertcolnext' + }, + { + label:lang.insertrow, + cmdName:'insertrow' + }, + { + label:lang.insertrownext, + cmdName:'insertrownext' + }, + '-', + { + label:lang.insertcaption, + cmdName:'insertcaption' + }, + { + label:lang.deletecaption, + cmdName:'deletecaption' + }, + { + label:lang.inserttitle, + cmdName:'inserttitle' + }, + { + label:lang.deletetitle, + cmdName:'deletetitle' + }, + { + label:lang.inserttitlecol, + cmdName:'inserttitlecol' + }, + { + label:lang.deletetitlecol, + cmdName:'deletetitlecol' + }, + '-', + { + label:lang.mergecells, + cmdName:'mergecells' + }, + { + label:lang.mergeright, + cmdName:'mergeright' + }, + { + label:lang.mergedown, + cmdName:'mergedown' + }, + '-', + { + label:lang.splittorows, + cmdName:'splittorows' + }, + { + label:lang.splittocols, + cmdName:'splittocols' + }, + { + label:lang.splittocells, + cmdName:'splittocells' + }, + '-', + { + label:lang.averageDiseRow, + cmdName:'averagedistributerow' + }, + { + label:lang.averageDisCol, + cmdName:'averagedistributecol' + }, + '-', + { + label:lang.edittd, + cmdName:'edittd', + exec:function () { + if ( UE.ui['edittd'] ) { + new UE.ui['edittd']( this ); + } + this.getDialog('edittd').open(); + } + }, + { + label:lang.edittable, + cmdName:'edittable', + exec:function () { + if ( UE.ui['edittable'] ) { + new UE.ui['edittable']( this ); + } + this.getDialog('edittable').open(); + } + }, + { + label:lang.setbordervisible, + cmdName:'setbordervisible' + } + ] + }, + { + group:lang.tablesort, + icon:'tablesort', + subMenu:[ + { + label:lang.enablesort, + cmdName:'enablesort' + }, + { + label:lang.disablesort, + cmdName:'disablesort' + }, + '-', + { + label:lang.reversecurrent, + cmdName:'sorttable', + value:'reversecurrent' + }, + { + label:lang.orderbyasc, + cmdName:'sorttable', + value:'orderbyasc' + }, + { + label:lang.reversebyasc, + cmdName:'sorttable', + value:'reversebyasc' + }, + { + label:lang.orderbynum, + cmdName:'sorttable', + value:'orderbynum' + }, + { + label:lang.reversebynum, + cmdName:'sorttable', + value:'reversebynum' + } + ] + }, + { + group:lang.borderbk, + icon:'borderBack', + subMenu:[ + { + label:lang.setcolor, + cmdName:"interlacetable", + exec:function(){ + this.execCommand("interlacetable"); + } + }, + { + label:lang.unsetcolor, + cmdName:"uninterlacetable", + exec:function(){ + this.execCommand("uninterlacetable"); + } + }, + { + label:lang.setbackground, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#bbb","#ccc"]}); + } + }, + { + label:lang.unsetbackground, + cmdName:"cleartablebackground", + exec:function(){ + this.execCommand("cleartablebackground"); + } + }, + { + label:lang.redandblue, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["red","blue"]}); + } + }, + { + label:lang.threecolorgradient, + cmdName:"settablebackground", + exec:function(){ + this.execCommand("settablebackground",{repeat:true,colorList:["#aaa","#bbb","#ccc"]}); + } + } + ] + }, + { + group:lang.aligntd, + icon:'aligntd', + subMenu:[ + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'top'} + }, + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'middle'} + }, + { + cmdName:'cellalignment', + value:{align:'left',vAlign:'bottom'} + }, + { + cmdName:'cellalignment', + value:{align:'center',vAlign:'bottom'} + }, + { + cmdName:'cellalignment', + value:{align:'right',vAlign:'bottom'} + } + ] + }, + { + group:lang.aligntable, + icon:'aligntable', + subMenu:[ + { + cmdName:'tablealignment', + className: 'left', + label:lang.tableleft, + value:"left" + }, + { + cmdName:'tablealignment', + className: 'center', + label:lang.tablecenter, + value:"center" + }, + { + cmdName:'tablealignment', + className: 'right', + label:lang.tableright, + value:"right" + } + ] + }, + '-', + { + label:lang.insertparagraphbefore, + cmdName:'insertparagraph', + value:true + }, + { + label:lang.insertparagraphafter, + cmdName:'insertparagraph' + }, + { + label:lang['copy'], + cmdName:'copy' + }, + { + label:lang['paste'], + cmdName:'paste' + } + ]; + if ( !items.length ) { + return; + } + var uiUtils = UE.ui.uiUtils; + + me.addListener( 'contextmenu', function ( type, evt ) { + + var offset = uiUtils.getViewportOffsetByEvent( evt ); + me.fireEvent( 'beforeselectionchange' ); + if ( menu ) { + menu.destroy(); + } + for ( var i = 0, ti, contextItems = []; ti = items[i]; i++ ) { + var last; + (function ( item ) { + if ( item == '-' ) { + if ( (last = contextItems[contextItems.length - 1 ] ) && last !== '-' ) { + contextItems.push( '-' ); + } + } else if ( item.hasOwnProperty( "group" ) ) { + for ( var j = 0, cj, subMenu = []; cj = item.subMenu[j]; j++ ) { + (function ( subItem ) { + if ( subItem == '-' ) { + if ( (last = subMenu[subMenu.length - 1 ] ) && last !== '-' ) { + subMenu.push( '-' ); + }else{ + subMenu.splice(subMenu.length-1); + } + } else { + if ( (me.commands[subItem.cmdName] || UE.commands[subItem.cmdName] || subItem.query) && + (subItem.query ? subItem.query() : me.queryCommandState( subItem.cmdName )) > -1 ) { + subMenu.push( { + 'label':subItem.label || me.getLang( "contextMenu." + subItem.cmdName + (subItem.value || '') )||"", + 'className':'edui-for-' +subItem.cmdName + ( subItem.className ? ( ' edui-for-' + subItem.cmdName + '-' + subItem.className ) : '' ), + onclick:subItem.exec ? function () { + subItem.exec.call( me ); + } : function () { + me.execCommand( subItem.cmdName, subItem.value ); + } + } ); + } + } + })( cj ); + } + if ( subMenu.length ) { + function getLabel(){ + switch (item.icon){ + case "table": + return me.getLang( "contextMenu.table" ); + case "justifyjustify": + return me.getLang( "contextMenu.paragraph" ); + case "aligntd": + return me.getLang("contextMenu.aligntd"); + case "aligntable": + return me.getLang("contextMenu.aligntable"); + case "tablesort": + return lang.tablesort; + case "borderBack": + return lang.borderbk; + default : + return ''; + } + } + contextItems.push( { + //todo 修正成自动获取方式 + 'label':getLabel(), + className:'edui-for-' + item.icon, + 'subMenu':{ + items:subMenu, + editor:me + } + } ); + } + + } else { + //有可能commmand没有加载右键不能出来,或者没有command也想能展示出来添加query方法 + if ( (me.commands[item.cmdName] || UE.commands[item.cmdName] || item.query) && + (item.query ? item.query.call(me) : me.queryCommandState( item.cmdName )) > -1 ) { + + contextItems.push( { + 'label':item.label || me.getLang( "contextMenu." + item.cmdName ), + className:'edui-for-' + (item.icon ? item.icon : item.cmdName + (item.value || '')), + onclick:item.exec ? function () { + item.exec.call( me ); + } : function () { + me.execCommand( item.cmdName, item.value ); + } + } ); + } + + } + + })( ti ); + } + if ( contextItems[contextItems.length - 1] == '-' ) { + contextItems.pop(); + } + + menu = new UE.ui.Menu( { + items:contextItems, + className:"edui-contextmenu", + editor:me + } ); + menu.render(); + menu.showAt( offset ); + + me.fireEvent("aftershowcontextmenu",menu); + + domUtils.preventDefault( evt ); + if ( browser.ie ) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch ( e ) { + return; + } + if ( ieRange.item ) { + var range = new dom.Range( me.document ); + range.selectNode( ieRange.item( 0 ) ).select( true, true ); + } + } + }); + + // 添加复制的flash按钮 + me.addListener('aftershowcontextmenu', function(type, menu) { + if (me.zeroclipboard) { + var items = menu.items; + for (var key in items) { + if (items[key].className == 'edui-for-copy') { + me.zeroclipboard.clip(items[key].getDom()); + } + } + } + }); + +}; + + +// plugins/shortcutmenu.js +///import core +///commands 弹出菜单 +// commandsName popupmenu +///commandsTitle 弹出菜单 +/** + * 弹出菜单 + * @function + * @name baidu.editor.plugins.popupmenu + * @author xuheng + */ + +UE.plugins['shortcutmenu'] = function () { + var me = this, + menu, + items = me.options.shortcutMenu || []; + + if (!items.length) { + return; + } + + me.addListener ('contextmenu mouseup' , function (type , e) { + var me = this, + customEvt = { + type : type , + target : e.target || e.srcElement , + screenX : e.screenX , + screenY : e.screenY , + clientX : e.clientX , + clientY : e.clientY + }; + + setTimeout (function () { + var rng = me.selection.getRange (); + if (rng.collapsed === false || type == "contextmenu") { + + if (!menu) { + menu = new baidu.editor.ui.ShortCutMenu ({ + editor : me , + items : items , + theme : me.options.theme , + className : 'edui-shortcutmenu' + }); + + menu.render (); + me.fireEvent ("afterrendershortcutmenu" , menu); + } + + menu.show (customEvt , !!UE.plugins['contextmenu']); + } + }); + + if (type == 'contextmenu') { + domUtils.preventDefault (e); + if (browser.ie9below) { + var ieRange; + try { + ieRange = me.selection.getNative().createRange(); + } catch (e) { + return; + } + if (ieRange.item) { + var range = new dom.Range (me.document); + range.selectNode (ieRange.item (0)).select (true , true); + + } + } + } + }); + + me.addListener ('keydown' , function (type) { + if (type == "keydown") { + menu && !menu.isHidden && menu.hide (); + } + + }); + +}; + + + + +// plugins/basestyle.js +/** + * B、I、sub、super命令支持 + * @file + * @since 1.2.6.1 + */ + +UE.plugins['basestyle'] = function(){ + + /** + * 字体加粗 + * @command bold + * @param { String } cmd 命令字符串 + * @remind 对已加粗的文本内容执行该命令, 将取消加粗 + * @method execCommand + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行加粗操作 + * //第一次执行, 文本内容加粗 + * editor.execCommand( 'bold' ); + * + * //第二次执行, 文本内容取消加粗 + * editor.execCommand( 'bold' ); + * ``` + */ + + + /** + * 字体倾斜 + * @command italic + * @method execCommand + * @param { String } cmd 命令字符串 + * @remind 对已倾斜的文本内容执行该命令, 将取消倾斜 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行斜体操作 + * //第一次操作, 文本内容将变成斜体 + * editor.execCommand( 'italic' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'italic' ); + * ``` + */ + + /** + * 下标文本,与“superscript”命令互斥 + * @command subscript + * @method execCommand + * @remind 把选中的文本内容切换成下标文本, 如果当前选中的文本已经是下标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行下标操作 + * //第一次操作, 文本内容将变成下标文本 + * editor.execCommand( 'subscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'subscript' ); + * ``` + */ + + /** + * 上标文本,与“subscript”命令互斥 + * @command superscript + * @method execCommand + * @remind 把选中的文本内容切换成上标文本, 如果当前选中的文本已经是上标, 则该操作会把文本内容还原成正常文本 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //对当前选中的文本内容执行上标操作 + * //第一次操作, 文本内容将变成上标文本 + * editor.execCommand( 'superscript' ); + * + * //再次对同一文本内容执行, 则文本内容将恢复正常 + * editor.execCommand( 'superscript' ); + * ``` + */ + var basestyles = { + 'bold':['strong','b'], + 'italic':['em','i'], + 'subscript':['sub'], + 'superscript':['sup'] + }, + getObj = function(editor,tagNames){ + return domUtils.filterNodeList(editor.selection.getStartElementPath(),tagNames); + }, + me = this; + //添加快捷键 + me.addshortcutkey({ + "Bold" : "ctrl+66",//^B + "Italic" : "ctrl+73", //^I + "Underline" : "ctrl+85"//^U + }); + me.addInputRule(function(root){ + utils.each(root.getNodesByTagName('b i'),function(node){ + switch (node.tagName){ + case 'b': + node.tagName = 'strong'; + break; + case 'i': + node.tagName = 'em'; + } + }); + }); + for ( var style in basestyles ) { + (function( cmd, tagNames ) { + me.commands[cmd] = { + execCommand : function( cmdName ) { + var range = me.selection.getRange(),obj = getObj(this,tagNames); + if ( range.collapsed ) { + if ( obj ) { + var tmpText = me.document.createTextNode(''); + range.insertNode( tmpText ).removeInlineStyle( tagNames ); + range.setStartBefore(tmpText); + domUtils.remove(tmpText); + } else { + var tmpNode = range.document.createElement( tagNames[0] ); + if(cmdName == 'superscript' || cmdName == 'subscript'){ + tmpText = me.document.createTextNode(''); + range.insertNode(tmpText) + .removeInlineStyle(['sub','sup']) + .setStartBefore(tmpText) + .collapse(true); + } + range.insertNode( tmpNode ).setStart( tmpNode, 0 ); + } + range.collapse( true ); + } else { + if(cmdName == 'superscript' || cmdName == 'subscript'){ + if(!obj || obj.tagName.toLowerCase() != cmdName){ + range.removeInlineStyle(['sub','sup']); + } + } + obj ? range.removeInlineStyle( tagNames ) : range.applyInlineStyle( tagNames[0] ); + } + range.select(); + }, + queryCommandState : function() { + return getObj(this,tagNames) ? 1 : 0; + } + }; + })( style, basestyles[style] ); + } +}; + + + +// plugins/elementpath.js +/** + * 选取路径命令 + * @file + */ +UE.plugins['elementpath'] = function(){ + var currentLevel, + tagNames, + me = this; + me.setOpt('elementPathEnabled',true); + if(!me.options.elementPathEnabled){ + return; + } + me.commands['elementpath'] = { + execCommand : function( cmdName, level ) { + var start = tagNames[level], + range = me.selection.getRange(); + currentLevel = level*1; + range.selectNode(start).select(); + }, + queryCommandValue : function() { + //产生一个副本,不能修改原来的startElementPath; + var parents = [].concat(this.selection.getStartElementPath()).reverse(), + names = []; + tagNames = parents; + for(var i=0,ci;ci=parents[i];i++){ + if(ci.nodeType == 3) { + continue; + } + var name = ci.tagName.toLowerCase(); + if(name == 'img' && ci.getAttribute('anchorname')){ + name = 'anchor'; + } + names[i] = name; + if(currentLevel == i){ + currentLevel = -1; + break; + } + } + return names; + } + }; +}; + + + +// plugins/formatmatch.js +/** + * 格式刷,只格式inline的 + * @file + * @since 1.2.6.1 + */ + +/** + * 格式刷 + * @command formatmatch + * @method execCommand + * @remind 该操作不能复制段落格式 + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * //获取格式刷 + * editor.execCommand( 'formatmatch' ); + * ``` + */ +UE.plugins['formatmatch'] = function(){ + + var me = this, + list = [],img, + flag = 0; + + me.addListener('reset',function(){ + list = []; + flag = 0; + }); + + function addList(type,evt){ + + if(browser.webkit){ + var target = evt.target.tagName == 'IMG' ? evt.target : null; + } + + function addFormat(range){ + + if(text){ + range.selectNode(text); + } + return range.applyInlineStyle(list[list.length-1].tagName,null,list); + + } + + me.undoManger && me.undoManger.save(); + + var range = me.selection.getRange(), + imgT = target || range.getClosedNode(); + if(img && imgT && imgT.tagName == 'IMG'){ + //trace:964 + + imgT.style.cssText += ';float:' + (img.style.cssFloat || img.style.styleFloat ||'none') + ';display:' + (img.style.display||'inline'); + + img = null; + }else{ + if(!img){ + var collapsed = range.collapsed; + if(collapsed){ + var text = me.document.createTextNode('match'); + range.insertNode(text).select(); + + + } + me.__hasEnterExecCommand = true; + //不能把block上的属性干掉 + //trace:1553 + var removeFormatAttributes = me.options.removeFormatAttributes; + me.options.removeFormatAttributes = ''; + me.execCommand('removeformat'); + me.options.removeFormatAttributes = removeFormatAttributes; + me.__hasEnterExecCommand = false; + //trace:969 + range = me.selection.getRange(); + if(list.length){ + addFormat(range); + } + if(text){ + range.setStartBefore(text).collapse(true); + + } + range.select(); + text && domUtils.remove(text); + } + + } + + + + + me.undoManger && me.undoManger.save(); + me.removeListener('mouseup',addList); + flag = 0; + } + + me.commands['formatmatch'] = { + execCommand : function( cmdName ) { + + if(flag){ + flag = 0; + list = []; + me.removeListener('mouseup',addList); + return; + } + + + + var range = me.selection.getRange(); + img = range.getClosedNode(); + if(!img || img.tagName != 'IMG'){ + range.collapse(true).shrinkBoundary(); + var start = range.startContainer; + list = domUtils.findParents(start,true,function(node){ + return !domUtils.isBlockElm(node) && node.nodeType == 1; + }); + //a不能加入格式刷, 并且克隆节点 + for(var i=0,ci;ci=list[i];i++){ + if(ci.tagName == 'A'){ + list.splice(i,1); + break; + } + } + + } + + me.addListener('mouseup',addList); + flag = 1; + + + }, + queryCommandState : function() { + return flag; + }, + notNeedUndo : 1 + }; +}; + + + +// plugins/searchreplace.js +///import core +///commands 查找替换 +///commandsName SearchReplace +///commandsTitle 查询替换 +///commandsDialog dialogs\searchreplace +/** + * @description 查找替换 + * @author zhanyi + */ + +UE.plugin.register('searchreplace',function(){ + var me = this; + + var _blockElm = {'table':1,'tbody':1,'tr':1,'ol':1,'ul':1}; + + function findTextInString(textContent,opt,currentIndex){ + var str = opt.searchStr; + if(opt.dir == -1){ + textContent = textContent.split('').reverse().join(''); + str = str.split('').reverse().join(''); + currentIndex = textContent.length - currentIndex; + + } + var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),match; + + while(match = reg.exec(textContent)){ + if(match.index >= currentIndex){ + return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index; + } + } + return -1 + } + function findTextBlockElm(node,currentIndex,opt){ + var textContent,index,methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode'; + if(domUtils.isBody(node)){ + node = node.firstChild; + } + var first = 1; + while(node){ + textContent = node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']; + index = findTextInString(textContent,opt,currentIndex ); + first = 0; + if(index!=-1){ + return { + 'node':node, + 'index':index + } + } + node = domUtils[methodName](node); + while(node && _blockElm[node.nodeName.toLowerCase()]){ + node = domUtils[methodName](node,true); + } + if(node){ + currentIndex = opt.dir == -1 ? (node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent']).length : 0; + } + + } + } + function findNTextInBlockElm(node,index,str){ + var currentIndex = 0, + currentNode = node.firstChild, + currentNodeLength = 0, + result; + while(currentNode){ + if(currentNode.nodeType == 3){ + currentNodeLength = currentNode.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length; + currentIndex += currentNodeLength; + if(currentIndex >= index){ + return { + 'node':currentNode, + 'index': currentNodeLength - (currentIndex - index) + } + } + }else if(!dtd.$empty[currentNode.tagName]){ + currentNodeLength = currentNode[browser.ie ? 'innerText' : 'textContent'].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length + currentIndex += currentNodeLength; + if(currentIndex >= index){ + result = findNTextInBlockElm(currentNode,currentNodeLength - (currentIndex - index),str); + if(result){ + return result; + } + } + } + currentNode = domUtils.getNextDomNode(currentNode); + + } + } + + function searchReplace(me,opt){ + + var rng = me.selection.getRange(), + startBlockNode, + searchStr = opt.searchStr, + span = me.document.createElement('span'); + span.innerHTML = '$$ueditor_searchreplace_key$$'; + + rng.shrinkBoundary(true); + + //判断是不是第一次选中 + if(!rng.collapsed){ + rng.select(); + var rngText = me.selection.getText(); + if(new RegExp('^' + opt.searchStr + '$',(opt.casesensitive ? '' : 'i')).test(rngText)){ + if(opt.replaceStr != undefined){ + replaceText(rng,opt.replaceStr); + rng.select(); + return true; + }else{ + rng.collapse(opt.dir == -1) + } + + } + } + + + rng.insertNode(span); + rng.enlargeToBlockElm(true); + startBlockNode = rng.startContainer; + var currentIndex = startBlockNode[browser.ie ? 'innerText' : 'textContent'].indexOf('$$ueditor_searchreplace_key$$'); + rng.setStartBefore(span); + domUtils.remove(span); + var result = findTextBlockElm(startBlockNode,currentIndex,opt); + if(result){ + var rngStart = findNTextInBlockElm(result.node,result.index,searchStr); + var rngEnd = findNTextInBlockElm(result.node,result.index + searchStr.length,searchStr); + rng.setStart(rngStart.node,rngStart.index).setEnd(rngEnd.node,rngEnd.index); + + if(opt.replaceStr !== undefined){ + replaceText(rng,opt.replaceStr) + } + rng.select(); + return true; + }else{ + rng.setCursor() + } + + } + function replaceText(rng,str){ + + str = me.document.createTextNode(str); + rng.deleteContents().insertNode(str); + + } + return { + commands:{ + 'searchreplace':{ + execCommand:function(cmdName,opt){ + utils.extend(opt,{ + all : false, + casesensitive : false, + dir : 1 + },true); + var num = 0; + if(opt.all){ + + var rng = me.selection.getRange(), + first = me.body.firstChild; + if(first && first.nodeType == 1){ + rng.setStart(first,0); + rng.shrinkBoundary(true); + }else if(first.nodeType == 3){ + rng.setStartBefore(first) + } + rng.collapse(true).select(true); + if(opt.replaceStr !== undefined){ + me.fireEvent('saveScene'); + } + while(searchReplace(this,opt)){ + num++; + } + if(num){ + me.fireEvent('saveScene'); + } + }else{ + if(opt.replaceStr !== undefined){ + me.fireEvent('saveScene'); + } + if(searchReplace(this,opt)){ + num++ + } + if(num){ + me.fireEvent('saveScene'); + } + + } + + return num; + }, + notNeedUndo:1 + } + } + } +}); + +// plugins/customstyle.js +/** + * 自定义样式 + * @file + * @since 1.2.6.1 + */ + +/** + * 根据config配置文件里“customstyle”选项的值对匹配的标签执行样式替换。 + * @command customstyle + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand( 'customstyle' ); + * ``` + */ +UE.plugins['customstyle'] = function() { + var me = this; + me.setOpt({ 'customstyle':[ + {tag:'h1',name:'tc', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, + {tag:'h1',name:'tl', style:'font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;'}, + {tag:'span',name:'im', style:'font-size:16px;font-style:italic;font-weight:bold;line-height:18px;'}, + {tag:'span',name:'hi', style:'font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;'} + ]}); + me.commands['customstyle'] = { + execCommand : function(cmdName, obj) { + var me = this, + tagName = obj.tag, + node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label'); + }, true), + range,bk,tmpObj = {}; + for (var p in obj) { + if(obj[p]!==undefined) + tmpObj[p] = obj[p]; + } + delete tmpObj.tag; + if (node && node.getAttribute('label') == obj.label) { + range = this.selection.getRange(); + bk = range.createBookmark(); + if (range.collapsed) { + //trace:1732 删掉自定义标签,要有p来回填站位 + if(dtd.$block[node.tagName]){ + var fillNode = me.document.createElement('p'); + domUtils.moveChild(node, fillNode); + node.parentNode.insertBefore(fillNode, node); + domUtils.remove(node); + }else{ + domUtils.remove(node,true); + } + + } else { + + var common = domUtils.getCommonAncestor(bk.start, bk.end), + nodes = domUtils.getElementsByTagName(common, tagName); + if(new RegExp(tagName,'i').test(common.tagName)){ + nodes.push(common); + } + for (var i = 0,ni; ni = nodes[i++];) { + if (ni.getAttribute('label') == obj.label) { + var ps = domUtils.getPosition(ni, bk.start),pe = domUtils.getPosition(ni, bk.end); + if ((ps & domUtils.POSITION_FOLLOWING || ps & domUtils.POSITION_CONTAINS) + && + (pe & domUtils.POSITION_PRECEDING || pe & domUtils.POSITION_CONTAINS) + ) + if (dtd.$block[tagName]) { + var fillNode = me.document.createElement('p'); + domUtils.moveChild(ni, fillNode); + ni.parentNode.insertBefore(fillNode, ni); + } + domUtils.remove(ni, true); + } + } + node = domUtils.findParent(common, function(node) { + return node.getAttribute('label') == obj.label; + }, true); + if (node) { + + domUtils.remove(node, true); + + } + + } + range.moveToBookmark(bk).select(); + } else { + if (dtd.$block[tagName]) { + this.execCommand('paragraph', tagName, tmpObj,'customstyle'); + range = me.selection.getRange(); + if (!range.collapsed) { + range.collapse(); + node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label') == obj.label; + }, true); + var pNode = me.document.createElement('p'); + domUtils.insertAfter(node, pNode); + domUtils.fillNode(me.document, pNode); + range.setStart(pNode, 0).setCursor(); + } + } else { + + range = me.selection.getRange(); + if (range.collapsed) { + node = me.document.createElement(tagName); + domUtils.setAttributes(node, tmpObj); + range.insertNode(node).setStart(node, 0).setCursor(); + + return; + } + + bk = range.createBookmark(); + range.applyInlineStyle(tagName, tmpObj).moveToBookmark(bk).select(); + } + } + + }, + queryCommandValue : function() { + var parent = domUtils.filterNodeList( + this.selection.getStartElementPath(), + function(node){return node.getAttribute('label')} + ); + return parent ? parent.getAttribute('label') : ''; + } + }; + //当去掉customstyle是,如果是块元素,用p代替 + me.addListener('keyup', function(type, evt) { + var keyCode = evt.keyCode || evt.which; + + if (keyCode == 32 || keyCode == 13) { + var range = me.selection.getRange(); + if (range.collapsed) { + var node = domUtils.findParent(me.selection.getStart(), function(node) { + return node.getAttribute('label'); + }, true); + if (node && dtd.$block[node.tagName] && domUtils.isEmptyNode(node)) { + var p = me.document.createElement('p'); + domUtils.insertAfter(node, p); + domUtils.fillNode(me.document, p); + domUtils.remove(node); + range.setStart(p, 0).setCursor(); + + + } + } + } + }); +}; + +// plugins/catchremoteimage.js +///import core +///commands 远程图片抓取 +///commandsName catchRemoteImage,catchremoteimageenable +///commandsTitle 远程图片抓取 +/** + * 远程图片抓取,当开启本插件时所有不符合本地域名的图片都将被抓取成为本地服务器上的图片 + */ +UE.plugins['catchremoteimage'] = function () { + var me = this, + ajax = UE.ajax; + + /* 设置默认值 */ + if (me.options.catchRemoteImageEnable === false) return; + me.setOpt({ + catchRemoteImageEnable: false + }); + + me.addListener("afterpaste", function () { + me.fireEvent("catchRemoteImage"); + }); + + me.addListener("catchRemoteImage", function () { + + var catcherLocalDomain = me.getOpt('catcherLocalDomain'), + catcherActionUrl = me.getActionUrl(me.getOpt('catcherActionName')), + catcherUrlPrefix = me.getOpt('catcherUrlPrefix'), + catcherFieldName = me.getOpt('catcherFieldName'); + + var remoteImages = [], + imgs = domUtils.getElementsByTagName(me.document, "img"), + test = function (src, urls) { + if (src.indexOf(location.host) != -1 || /(^\.)|(^\/)/.test(src)) { + return true; + } + if (urls) { + for (var j = 0, url; url = urls[j++];) { + if (src.indexOf(url) !== -1) { + return true; + } + } + } + return false; + }; + + for (var i = 0, ci; ci = imgs[i++];) { + if (ci.getAttribute("word_img")) { + continue; + } + var src = ci.getAttribute("_src") || ci.src || ""; + if (/^(https?|ftp):/i.test(src) && !test(src, catcherLocalDomain)) { + remoteImages.push(src); + } + } + + if (remoteImages.length) { + catchremoteimage(remoteImages, { + //成功抓取 + success: function (r) { + try { + var info = r.state !== undefined ? r:eval("(" + r.responseText + ")"); + } catch (e) { + return; + } + + /* 获取源路径和新路径 */ + var i, j, ci, cj, oldSrc, newSrc, list = info.list; + + for (i = 0; ci = imgs[i++];) { + oldSrc = ci.getAttribute("_src") || ci.src || ""; + for (j = 0; cj = list[j++];) { + if (oldSrc == cj.source && cj.state == "SUCCESS") { //抓取失败时不做替换处理 + newSrc = catcherUrlPrefix + cj.url; + domUtils.setAttributes(ci, { + "src": newSrc, + "_src": newSrc + }); + break; + } + } + } + me.fireEvent('catchremotesuccess') + }, + //回调失败,本次请求超时 + error: function () { + me.fireEvent("catchremoteerror"); + } + }); + } + + function catchremoteimage(imgs, callbacks) { + var params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(catcherActionUrl + (catcherActionUrl.indexOf('?') == -1 ? '?':'&') + params), + isJsonp = utils.isCrossDomainUrl(url), + opt = { + 'method': 'POST', + 'dataType': isJsonp ? 'jsonp':'', + 'timeout': 60000, //单位:毫秒,回调请求超时设置。目标用户如果网速不是很快的话此处建议设置一个较大的数值 + 'onsuccess': callbacks["success"], + 'onerror': callbacks["error"] + }; + opt[catcherFieldName] = imgs; + ajax.request(url, opt); + } + + }); +}; + +// plugins/snapscreen.js +/** + * 截屏插件,为UEditor提供插入支持 + * @file + * @since 1.4.2 + */ +UE.plugin.register('snapscreen', function (){ + + var me = this; + var snapplugin; + + function getLocation(url){ + var search, + a = document.createElement('a'), + params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; + + a.href = url; + if (browser.ie) { + a.href = a.href; + } + + + search = a.search; + if (params) { + search = search + (search.indexOf('?') == -1 ? '?':'&')+ params; + search = search.replace(/[&]+/ig, '&'); + } + return { + 'port': a.port, + 'hostname': a.hostname, + 'path': a.pathname + search || + a.hash + } + } + + return { + commands:{ + /** + * 字体背景颜色 + * @command snapscreen + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('snapscreen'); + * ``` + */ + 'snapscreen':{ + execCommand:function (cmd) { + var url, local, res; + var lang = me.getLang("snapScreen_plugin"); + + if(!snapplugin){ + var container = me.container; + var doc = me.container.ownerDocument || me.container.document; + snapplugin = doc.createElement("object"); + try{snapplugin.type = "application/x-pluginbaidusnap";}catch(e){ + return; + } + snapplugin.style.cssText = "position:absolute;left:-9999px;width:0;height:0;"; + snapplugin.setAttribute("width","0"); + snapplugin.setAttribute("height","0"); + container.appendChild(snapplugin); + } + + function onSuccess(rs){ + try{ + rs = eval("("+ rs +")"); + if(rs.state == 'SUCCESS'){ + var opt = me.options; + me.execCommand('insertimage', { + src: opt.snapscreenUrlPrefix + rs.url, + _src: opt.snapscreenUrlPrefix + rs.url, + alt: rs.title || '', + floatStyle: opt.snapscreenImgAlign + }); + } else { + alert(rs.state); + } + }catch(e){ + alert(lang.callBackErrorMsg); + } + } + url = me.getActionUrl(me.getOpt('snapscreenActionName')); + local = getLocation(url); + setTimeout(function () { + try{ + res =snapplugin.saveSnapshot(local.hostname, local.path, local.port); + }catch(e){ + me.ui._dialogs['snapscreenDialog'].open(); + return; + } + + onSuccess(res); + }, 50); + }, + queryCommandState: function(){ + return (navigator.userAgent.indexOf("Windows",0) != -1) ? 0:-1; + } + } + } + } +}); + + +// plugins/insertparagraph.js +/** + * 插入段落 + * @file + * @since 1.2.6.1 + */ + + +/** + * 插入段落 + * @command insertparagraph + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * //editor是编辑器实例 + * editor.execCommand( 'insertparagraph' ); + * ``` + */ + +UE.commands['insertparagraph'] = { + execCommand : function( cmdName,front) { + var me = this, + range = me.selection.getRange(), + start = range.startContainer,tmpNode; + while(start ){ + if(domUtils.isBody(start)){ + break; + } + tmpNode = start; + start = start.parentNode; + } + if(tmpNode){ + var p = me.document.createElement('p'); + if(front){ + tmpNode.parentNode.insertBefore(p,tmpNode) + }else{ + tmpNode.parentNode.insertBefore(p,tmpNode.nextSibling) + } + domUtils.fillNode(me.document,p); + range.setStart(p,0).setCursor(false,true); + } + } +}; + + + +// plugins/webapp.js +/** + * 百度应用 + * @file + * @since 1.2.6.1 + */ + + +/** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + +//UE.plugins['webapp'] = function () { +// var me = this; +// function createInsertStr( obj, toIframe, addParagraph ) { +// return !toIframe ? +// (addParagraph ? '

            ' : '') + '' + +// (addParagraph ? '

            ' : '') +// : +// ''; +// } +// +// function switchImgAndIframe( img2frame ) { +// var tmpdiv, +// nodes = domUtils.getElementsByTagName( me.document, !img2frame ? "iframe" : "img" ); +// for ( var i = 0, node; node = nodes[i++]; ) { +// if ( node.className != "edui-faked-webapp" ){ +// continue; +// } +// tmpdiv = me.document.createElement( "div" ); +// tmpdiv.innerHTML = createInsertStr( img2frame ? {url:node.getAttribute( "_url" ), width:node.width, height:node.height,title:node.title,logo:node.style.backgroundImage.replace("url(","").replace(")","")} : {url:node.getAttribute( "src", 2 ),title:node.title, width:node.width, height:node.height,logo:node.getAttribute("logo_url")}, img2frame ? true : false,false ); +// node.parentNode.replaceChild( tmpdiv.firstChild, node ); +// } +// } +// +// me.addListener( "beforegetcontent", function () { +// switchImgAndIframe( true ); +// } ); +// me.addListener( 'aftersetcontent', function () { +// switchImgAndIframe( false ); +// } ); +// me.addListener( 'aftergetcontent', function ( cmdName ) { +// if ( cmdName == 'aftergetcontent' && me.queryCommandState( 'source' ) ){ +// return; +// } +// switchImgAndIframe( false ); +// } ); +// +// me.commands['webapp'] = { +// execCommand:function ( cmd, obj ) { +// me.execCommand( "inserthtml", createInsertStr( obj, false,true ) ); +// } +// }; +//}; + +UE.plugin.register('webapp', function (){ + var me = this; + function createInsertStr(obj,toEmbed){ + return !toEmbed ? + '' + : + '' + + } + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(node){ + var html; + if(node.getAttr('class') == 'edui-faked-webapp'){ + html = createInsertStr({ + title:node.getAttr('title'), + 'width':node.getAttr('width'), + 'height':node.getAttr('height'), + 'align':node.getAttr('align'), + 'cssfloat':node.getStyle('float'), + 'url':node.getAttr("_url"), + 'logo':node.getAttr('_logo_url') + },true); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed,node); + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('iframe'),function(node){ + if(node.getAttr('class') == 'edui-faked-webapp'){ + var img = UE.uNode.createElement(createInsertStr({ + title:node.getAttr('title'), + 'width':node.getAttr('width'), + 'height':node.getAttr('height'), + 'align':node.getAttr('align'), + 'cssfloat':node.getStyle('float'), + 'url':node.getAttr("src"), + 'logo':node.getAttr('logo_url') + })); + node.parentNode.replaceChild(img,node); + } + }) + + }, + commands:{ + /** + * 插入百度应用 + * @command webapp + * @method execCommand + * @remind 需要百度APPKey + * @remind 百度应用主页: http://app.baidu.com/ + * @param { Object } appOptions 应用所需的参数项, 支持的key有: title=>应用标题, width=>应用容器宽度, + * height=>应用容器高度,logo=>应用logo,url=>应用地址 + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'webapp' , { + * title: '植物大战僵尸', + * width: 560, + * height: 465, + * logo: '应用展示的图片', + * url: '百度应用的地址' + * } ); + * ``` + */ + 'webapp':{ + execCommand:function (cmd, obj) { + + var me = this, + str = createInsertStr(utils.extend(obj,{ + align:'none' + }), false); + me.execCommand("inserthtml",str); + }, + queryCommandState:function () { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-webapp"); + return flag ? 1 : 0; + } + } + } + } +}); + +// plugins/template.js +///import core +///import plugins\inserthtml.js +///import plugins\cleardoc.js +///commands 模板 +///commandsName template +///commandsTitle 模板 +///commandsDialog dialogs\template +UE.plugins['template'] = function () { + UE.commands['template'] = { + execCommand:function (cmd, obj) { + obj.html && this.execCommand("inserthtml", obj.html); + } + }; + this.addListener("click", function (type, evt) { + var el = evt.target || evt.srcElement, + range = this.selection.getRange(); + var tnode = domUtils.findParent(el, function (node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, true); + tnode && range.selectNode(tnode).shrinkBoundary().select(); + }); + this.addListener("keydown", function (type, evt) { + var range = this.selection.getRange(); + if (!range.collapsed) { + if (!evt.ctrlKey && !evt.metaKey && !evt.shiftKey && !evt.altKey) { + var tnode = domUtils.findParent(range.startContainer, function (node) { + if (node.className && domUtils.hasClass(node, "ue_t")) { + return node; + } + }, true); + if (tnode) { + domUtils.removeClasses(tnode, ["ue_t"]); + } + } + } + }); +}; + + +// plugins/music.js +/** + * 插入音乐命令 + * @file + */ +UE.plugin.register('music', function (){ + var me = this; + function creatInsertStr(url,width,height,align,cssfloat,toEmbed){ + return !toEmbed ? + '' + : + ''; + } + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(node){ + var html; + if(node.getAttr('class') == 'edui-faked-music'){ + var cssfloat = node.getStyle('float'); + var align = node.getAttr('align'); + html = creatInsertStr(node.getAttr("_url"), node.getAttr('width'), node.getAttr('height'), align, cssfloat, true); + var embed = UE.uNode.createElement(html); + node.parentNode.replaceChild(embed,node); + } + }) + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('embed'),function(node){ + if(node.getAttr('class') == 'edui-faked-music'){ + var cssfloat = node.getStyle('float'); + var align = node.getAttr('align'); + html = creatInsertStr(node.getAttr("src"), node.getAttr('width'), node.getAttr('height'), align, cssfloat,false); + var img = UE.uNode.createElement(html); + node.parentNode.replaceChild(img,node); + } + }) + + }, + commands:{ + /** + * 插入音乐 + * @command music + * @method execCommand + * @param { Object } musicOptions 插入音乐的参数项, 支持的key有: url=>音乐地址; + * width=>音乐容器宽度;height=>音乐容器高度;align=>音乐文件的对齐方式, 可选值有: left, center, right, none + * @example + * ```javascript + * //editor是编辑器实例 + * //在编辑器里插入一个“植物大战僵尸”的APP + * editor.execCommand( 'music' , { + * width: 400, + * height: 95, + * align: "center", + * url: "音乐地址" + * } ); + * ``` + */ + 'music':{ + execCommand:function (cmd, musicObj) { + var me = this, + str = creatInsertStr(musicObj.url, musicObj.width || 400, musicObj.height || 95, "none", false); + me.execCommand("inserthtml",str); + }, + queryCommandState:function () { + var me = this, + img = me.selection.getRange().getClosedNode(), + flag = img && (img.className == "edui-faked-music"); + return flag ? 1 : 0; + } + } + } + } +}); + +// plugins/autoupload.js +/** + * @description + * 1.拖放文件到编辑区域,自动上传并插入到选区 + * 2.插入粘贴板的图片,自动上传并插入到选区 + * @author Jinqn + * @date 2013-10-14 + */ +UE.plugin.register('autoupload', function (){ + + function sendAndInsertFile(file, editor) { + var me = editor; + //模拟数据 + var fieldName, urlPrefix, maxSize, allowFiles, actionUrl, + loadingHtml, errorHandler, successHandler, + filetype = /image\/\w+/i.test(file.type) ? 'image':'file', + loadingId = 'loading_' + (+new Date()).toString(36); + + fieldName = me.getOpt(filetype + 'FieldName'); + urlPrefix = me.getOpt(filetype + 'UrlPrefix'); + maxSize = me.getOpt(filetype + 'MaxSize'); + allowFiles = me.getOpt(filetype + 'AllowFiles'); + actionUrl = me.getActionUrl(me.getOpt(filetype + 'ActionName')); + errorHandler = function(title) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent('showmessage', { + 'id': loadingId, + 'content': title, + 'type': 'error', + 'timeout': 4000 + }); + }; + + if (filetype == 'image') { + loadingHtml = ''; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + if (loader) { + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', data.title || ''); + loader.setAttribute('alt', data.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } + }; + } else { + loadingHtml = '

            ' + + '' + + '

            '; + successHandler = function(data) { + var link = urlPrefix + data.url, + loader = me.document.getElementById(loadingId); + + var rng = me.selection.getRange(), + bk = rng.createBookmark(); + rng.selectNode(loader).select(); + me.execCommand('insertfile', {'url': link}); + rng.moveToBookmark(bk).select(); + }; + } + + /* 插入loading的占位符 */ + me.execCommand('inserthtml', loadingHtml); + + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt(filetype + 'ActionName')) { + errorHandler(me.getLang('autoupload.errorLoadConfig')); + return; + } + /* 判断文件大小是否超出限制 */ + if(file.size > maxSize) { + errorHandler(me.getLang('autoupload.exceedSizeError')); + return; + } + /* 判断文件格式是否超出允许 */ + var fileext = file.name ? file.name.substr(file.name.lastIndexOf('.')):''; + if ((fileext && filetype != 'image') || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { + errorHandler(me.getLang('autoupload.exceedTypeError')); + return; + } + + /* 创建Ajax并提交 */ + var xhr = new XMLHttpRequest(), + fd = new FormData(), + params = utils.serializeParam(me.queryCommandValue('serverparam')) || '', + url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + params); + + fd.append(fieldName, file, file.name || ('blob.' + file.type.substr('image/'.length))); + fd.append('type', 'ajax'); + xhr.open("post", url, true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + xhr.addEventListener('load', function (e) { + try{ + var json = (new Function("return " + utils.trim(e.target.response)))(); + if (json.state == 'SUCCESS' && json.url) { + successHandler(json); + } else { + errorHandler(json.state); + } + }catch(er){ + errorHandler(me.getLang('autoupload.loadError')); + } + }); + xhr.send(fd); + } + + function getPasteImage(e){ + return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items:null; + } + function getDropImage(e){ + return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files:null; + } + + return { + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(n){ + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + utils.each(root.getNodesByTagName('p'),function(n){ + if (/\bloadpara\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + }, + bindEvents:{ + //插入粘贴板的图片,拖放插入图片 + 'ready':function(e){ + var me = this; + if(window.FormData && window.FileReader) { + domUtils.on(me.body, 'paste drop', function(e){ + var hasImg = false, + items; + //获取粘贴板文件列表或者拖放文件列表 + items = e.type == 'paste' ? getPasteImage(e):getDropImage(e); + if(items){ + var len = items.length, + file; + while (len--){ + file = items[len]; + if(file.getAsFile) file = file.getAsFile(); + if(file && file.size > 0) { + sendAndInsertFile(file, me); + hasImg = true; + } + } + hasImg && e.preventDefault(); + } + + }); + //取消拖放图片时出现的文字光标位置提示 + domUtils.on(me.body, 'dragover', function (e) { + if(e.dataTransfer.types[0] == 'Files') { + e.preventDefault(); + } + }); + + //设置loading的样式 + utils.cssRule('loading', + '.loadingclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n' + + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + + '}', + this.document); + } + } + } + } +}); + +// plugins/autosave.js +UE.plugin.register('autosave', function (){ + + var me = this, + //无限循环保护 + lastSaveTime = new Date(), + //最小保存间隔时间 + MIN_TIME = 20, + //auto save key + saveKey = null; + + function save ( editor ) { + + var saveData; + + if ( new Date() - lastSaveTime < MIN_TIME ) { + return; + } + + if ( !editor.hasContents() ) { + //这里不能调用命令来删除, 会造成事件死循环 + saveKey && me.removePreferences( saveKey ); + return; + } + + lastSaveTime = new Date(); + + editor._saveFlag = null; + + saveData = me.body.innerHTML; + + if ( editor.fireEvent( "beforeautosave", { + content: saveData + } ) === false ) { + return; + } + + me.setPreferences( saveKey, saveData ); + + editor.fireEvent( "afterautosave", { + content: saveData + } ); + + } + + return { + defaultOptions: { + //默认间隔时间 + saveInterval: 500 + }, + bindEvents:{ + 'ready':function(){ + + var _suffix = "-drafts-data", + key = null; + + if ( me.key ) { + key = me.key + _suffix; + } else { + key = ( me.container.parentNode.id || 'ue-common' ) + _suffix; + } + + //页面地址+编辑器ID 保持唯一 + saveKey = ( location.protocol + location.host + location.pathname ).replace( /[.:\/]/g, '_' ) + key; + + }, + + 'contentchange': function () { + if (!me.getOpt('enableAutoSave')) {return;} + if ( !saveKey ) { + return; + } + + if ( me._saveFlag ) { + window.clearTimeout( me._saveFlag ); + } + + if ( me.options.saveInterval > 0 ) { + + me._saveFlag = window.setTimeout( function () { + + save( me ); + + }, me.options.saveInterval ); + + } else { + + save(me); + + } + + + } + }, + commands:{ + 'clearlocaldata':{ + execCommand:function (cmd, name) { + if ( saveKey && me.getPreferences( saveKey ) ) { + me.removePreferences( saveKey ) + } + }, + notNeedUndo: true, + ignoreContentChange:true + }, + + 'getlocaldata':{ + execCommand:function (cmd, name) { + return saveKey ? me.getPreferences( saveKey ) || '' : ''; + }, + notNeedUndo: true, + ignoreContentChange:true + }, + + 'drafts':{ + execCommand:function (cmd, name) { + if ( saveKey ) { + me.body.innerHTML = me.getPreferences( saveKey ) || '

            '+domUtils.fillHtml+'

            '; + me.focus(true); + } + }, + queryCommandState: function () { + return saveKey ? ( me.getPreferences( saveKey ) === null ? -1 : 0 ) : -1; + }, + notNeedUndo: true, + ignoreContentChange:true + } + } + } + +}); + +// plugins/charts.js +UE.plugin.register('charts', function (){ + + var me = this; + + return { + bindEvents: { + 'chartserror': function () { + } + }, + commands:{ + 'charts': { + execCommand: function ( cmd, data ) { + + var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true), + flagText = [], + config = {}; + + if ( !tableNode ) { + return false; + } + + if ( !validData( tableNode ) ) { + me.fireEvent( "chartserror" ); + return false; + } + + config.title = data.title || ''; + config.subTitle = data.subTitle || ''; + config.xTitle = data.xTitle || ''; + config.yTitle = data.yTitle || ''; + config.suffix = data.suffix || ''; + config.tip = data.tip || ''; + //数据对齐方式 + config.dataFormat = data.tableDataFormat || ''; + //图表类型 + config.chartType = data.chartType || 0; + + for ( var key in config ) { + + if ( !config.hasOwnProperty( key ) ) { + continue; + } + + flagText.push( key+":"+config[ key ] ); + + } + + tableNode.setAttribute( "data-chart", flagText.join( ";" ) ); + domUtils.addClass( tableNode, "edui-charts-table" ); + + + + }, + queryCommandState: function ( cmd, name ) { + + var tableNode = domUtils.findParentByTagName(this.selection.getRange().startContainer, 'table', true); + return tableNode && validData( tableNode ) ? 0 : -1; + + } + } + }, + inputRule:function(root){ + utils.each(root.getNodesByTagName('table'),function( tableNode ){ + + if ( tableNode.getAttr("data-chart") !== undefined ) { + tableNode.setAttr("style"); + } + + }) + + }, + outputRule:function(root){ + utils.each(root.getNodesByTagName('table'),function( tableNode ){ + + if ( tableNode.getAttr("data-chart") !== undefined ) { + tableNode.setAttr("style", "display: none;"); + } + + }) + + } + } + + function validData ( table ) { + + var firstRows = null, + cellCount = 0; + + //行数不够 + if ( table.rows.length < 2 ) { + return false; + } + + //列数不够 + if ( table.rows[0].cells.length < 2 ) { + return false; + } + + //第一行所有cell必须是th + firstRows = table.rows[ 0 ].cells; + cellCount = firstRows.length; + + for ( var i = 0, cell; cell = firstRows[ i ]; i++ ) { + + if ( cell.tagName.toLowerCase() !== 'th' ) { + return false; + } + + } + + for ( var i = 1, row; row = table.rows[ i ]; i++ ) { + + //每行单元格数不匹配, 返回false + if ( row.cells.length != cellCount ) { + return false; + } + + //第一列不是th也返回false + if ( row.cells[0].tagName.toLowerCase() !== 'th' ) { + return false; + } + + for ( var j = 1, cell; cell = row.cells[ j ]; j++ ) { + + var value = utils.trim( ( cell.innerText || cell.textContent || '' ) ); + + value = value.replace( new RegExp( UE.dom.domUtils.fillChar, 'g' ), '' ).replace( /^\s+|\s+$/g, '' ); + + //必须是数字 + if ( !/^\d*\.?\d+$/.test( value ) ) { + return false; + } + + } + + } + + return true; + + } + +}); + +// plugins/section.js +/** + * 目录大纲支持插件 + * @file + * @since 1.3.0 + */ +UE.plugin.register('section', function (){ + /* 目录节点对象 */ + function Section(option){ + this.tag = ''; + this.level = -1, + this.dom = null; + this.nextSection = null; + this.previousSection = null; + this.parentSection = null; + this.startAddress = []; + this.endAddress = []; + this.children = []; + } + function getSection(option) { + var section = new Section(); + return utils.extend(section, option); + } + function getNodeFromAddress(startAddress, root) { + var current = root; + for(var i = 0;i < startAddress.length; i++) { + if(!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var me = this; + + return { + bindMultiEvents:{ + type: 'aftersetcontent afterscencerestore', + handler: function(){ + me.fireEvent('updateSections'); + } + }, + bindEvents:{ + /* 初始化、拖拽、粘贴、执行setcontent之后 */ + 'ready': function (){ + me.fireEvent('updateSections'); + domUtils.on(me.body, 'drop paste', function(){ + me.fireEvent('updateSections'); + }); + }, + /* 执行paragraph命令之后 */ + 'afterexeccommand': function (type, cmd) { + if(cmd == 'paragraph') { + me.fireEvent('updateSections'); + } + }, + /* 部分键盘操作,触发updateSections事件 */ + 'keyup': function (type, e) { + var me = this, + range = me.selection.getRange(); + if(range.collapsed != true) { + me.fireEvent('updateSections'); + } else { + var keyCode = e.keyCode || e.which; + if(keyCode == 13 || keyCode == 8 || keyCode == 46) { + me.fireEvent('updateSections'); + } + } + } + }, + commands:{ + 'getsections': { + execCommand: function (cmd, levels) { + var levelFn = levels || ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; + + for (var i = 0; i < levelFn.length; i++) { + if (typeof levelFn[i] == 'string') { + levelFn[i] = function(fn){ + return function(node){ + return node.tagName == fn.toUpperCase() + }; + }(levelFn[i]); + } else if (typeof levelFn[i] != 'function') { + levelFn[i] = function (node) { + return null; + } + } + } + function getSectionLevel(node) { + for (var i = 0; i < levelFn.length; i++) { + if (levelFn[i](node)) return i; + } + return -1; + } + + var me = this, + Directory = getSection({'level':-1, 'title':'root'}), + previous = Directory; + + function traversal(node, Directory) { + var level, + tmpSection = null, + parent, + child, + children = node.childNodes; + for (var i = 0, len = children.length; i < len; i++) { + child = children[i]; + level = getSectionLevel(child); + if (level >= 0) { + var address = me.selection.getRange().selectNode(child).createAddress(true).startAddress, + current = getSection({ + 'tag': child.tagName, + 'title': child.innerText || child.textContent || '', + 'level': level, + 'dom': child, + 'startAddress': utils.clone(address, []), + 'endAddress': utils.clone(address, []), + 'children': [] + }); + previous.nextSection = current; + current.previousSection = previous; + parent = previous; + while(level <= parent.level){ + parent = parent.parentSection; + } + current.parentSection = parent; + parent.children.push(current); + tmpSection = previous = current; + } else { + child.nodeType === 1 && traversal(child, Directory); + tmpSection && tmpSection.endAddress[tmpSection.endAddress.length - 1] ++; + } + } + } + traversal(me.body, Directory); + return Directory; + }, + notNeedUndo: true + }, + 'movesection': { + execCommand: function (cmd, sourceSection, targetSection, isAfter) { + + var me = this, + targetAddress, + target; + + if(!sourceSection || !targetSection || targetSection.level == -1) return; + + targetAddress = isAfter ? targetSection.endAddress:targetSection.startAddress; + target = getNodeFromAddress(targetAddress, me.body); + + /* 判断目标地址是否被源章节包含 */ + if(!targetAddress || !target || isContainsAddress(sourceSection.startAddress, sourceSection.endAddress, targetAddress)) return; + + var startNode = getNodeFromAddress(sourceSection.startAddress, me.body), + endNode = getNodeFromAddress(sourceSection.endAddress, me.body), + current, + nextNode; + + if(isAfter) { + current = endNode; + while ( current && !(domUtils.getPosition( startNode, current ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.previousSibling; + domUtils.insertAfter(target, current); + if(current == startNode) break; + current = nextNode; + } + } else { + current = startNode; + while ( current && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.nextSibling; + target.parentNode.insertBefore(current, target); + if(current == endNode) break; + current = nextNode; + } + } + + me.fireEvent('updateSections'); + + /* 获取地址的包含关系 */ + function isContainsAddress(startAddress, endAddress, addressTarget){ + var isAfterStartAddress = false, + isBeforeEndAddress = false; + for(var i = 0; i< startAddress.length; i++){ + if(i >= addressTarget.length) break; + if(addressTarget[i] > startAddress[i]) { + isAfterStartAddress = true; + break; + } else if(addressTarget[i] < startAddress[i]) { + break; + } + } + for(var i = 0; i< endAddress.length; i++){ + if(i >= addressTarget.length) break; + if(addressTarget[i] < startAddress[i]) { + isBeforeEndAddress = true; + break; + } else if(addressTarget[i] > startAddress[i]) { + break; + } + } + return isAfterStartAddress && isBeforeEndAddress; + } + } + }, + 'deletesection': { + execCommand: function (cmd, section, keepChildren) { + var me = this; + + if(!section) return; + + function getNodeFromAddress(startAddress) { + var current = me.body; + for(var i = 0;i < startAddress.length; i++) { + if(!current.childNodes) return null; + current = current.childNodes[startAddress[i]]; + } + return current; + } + + var startNode = getNodeFromAddress(section.startAddress), + endNode = getNodeFromAddress(section.endAddress), + current = startNode, + nextNode; + + if(!keepChildren) { + while ( current && domUtils.inDoc(endNode, me.document) && !(domUtils.getPosition( current, endNode ) & domUtils.POSITION_FOLLOWING) ) { + nextNode = current.nextSibling; + domUtils.remove(current); + current = nextNode; + } + } else { + domUtils.remove(current); + } + + me.fireEvent('updateSections'); + } + }, + 'selectsection': { + execCommand: function (cmd, section) { + if(!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + 'startAddress':utils.clone(section.startAddress, []), + 'endAddress':utils.clone(section.endAddress, []) + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).select().scrollToView(); + return true; + }, + notNeedUndo: true + }, + 'scrolltosection': { + execCommand: function (cmd, section) { + if(!section && !section.dom) return false; + var me = this, + range = me.selection.getRange(), + address = { + 'startAddress':section.startAddress, + 'endAddress':section.endAddress + }; + address.endAddress[address.endAddress.length - 1]++; + range.moveToAddress(address).scrollToView(); + return true; + }, + notNeedUndo: true + } + } + } +}); + +// plugins/simpleupload.js +/** + * @description + * 简单上传:点击按钮,直接选择文件上传 + * @author Jinqn + * @date 2014-03-31 + */ +UE.plugin.register('simpleupload', function (){ + var me = this, + isLoaded = false, + containerBtn; + + function initUploadBtn(){ + var w = containerBtn.offsetWidth || 20, + h = containerBtn.offsetHeight || 20, + btnIframe = document.createElement('iframe'), + btnStyle = 'display:block;width:' + w + 'px;height:' + h + 'px;overflow:hidden;border:0;margin:0;padding:0;position:absolute;top:0;left:0;filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity: 0;opacity: 0;cursor:pointer;'; + + domUtils.on(btnIframe, 'load', function(){ + + var timestrap = (+new Date()).toString(36), + wrapper, + btnIframeDoc, + btnIframeBody; + + btnIframeDoc = (btnIframe.contentDocument || btnIframe.contentWindow.document); + btnIframeBody = btnIframeDoc.body; + wrapper = btnIframeDoc.createElement('div'); + + wrapper.innerHTML = '
            ' + + '' + + '
            ' + + ''; + + wrapper.className = 'edui-' + me.options.theme; + wrapper.id = me.ui.id + '_iframeupload'; + btnIframeBody.style.cssText = btnStyle; + btnIframeBody.style.width = w + 'px'; + btnIframeBody.style.height = h + 'px'; + btnIframeBody.appendChild(wrapper); + + if (btnIframeBody.parentNode) { + btnIframeBody.parentNode.style.width = w + 'px'; + btnIframeBody.parentNode.style.height = w + 'px'; + } + + var form = btnIframeDoc.getElementById('edui_form_' + timestrap); + var input = btnIframeDoc.getElementById('edui_input_' + timestrap); + var iframe = btnIframeDoc.getElementById('edui_iframe_' + timestrap); + + domUtils.on(input, 'change', function(){ + if(!input.value) return; + var loadingId = 'loading_' + (+new Date()).toString(36); + var params = utils.serializeParam(me.queryCommandValue('serverparam')) || ''; + + var imageActionUrl = me.getActionUrl(me.getOpt('imageActionName')); + var allowFiles = me.getOpt('imageAllowFiles'); + + me.focus(); + me.execCommand('inserthtml', ''); + + function callback(){ + try{ + var link, json, loader, + body = (iframe.contentDocument || iframe.contentWindow.document).body, + result = body.innerText || body.textContent || ''; + json = (new Function("return " + result))(); + link = me.options.imageUrlPrefix + json.url; + if(json.state == 'SUCCESS' && json.url) { + loader = me.document.getElementById(loadingId); + loader.setAttribute('src', link); + loader.setAttribute('_src', link); + loader.setAttribute('title', json.title || ''); + loader.setAttribute('alt', json.original || ''); + loader.removeAttribute('id'); + domUtils.removeClasses(loader, 'loadingclass'); + } else { + showErrorLoader && showErrorLoader(json.state); + } + }catch(er){ + showErrorLoader && showErrorLoader(me.getLang('simpleupload.loadError')); + } + form.reset(); + domUtils.un(iframe, 'load', callback); + } + function showErrorLoader(title){ + if(loadingId) { + var loader = me.document.getElementById(loadingId); + loader && domUtils.remove(loader); + me.fireEvent('showmessage', { + 'id': loadingId, + 'content': title, + 'type': 'error', + 'timeout': 4000 + }); + } + } + + /* 判断后端配置是否没有加载成功 */ + if (!me.getOpt('imageActionName')) { + errorHandler(me.getLang('autoupload.errorLoadConfig')); + return; + } + // 判断文件格式是否错误 + var filename = input.value, + fileext = filename ? filename.substr(filename.lastIndexOf('.')):''; + if (!fileext || (allowFiles && (allowFiles.join('') + '.').indexOf(fileext.toLowerCase() + '.') == -1)) { + showErrorLoader(me.getLang('simpleupload.exceedTypeError')); + return; + } + + domUtils.on(iframe, 'load', callback); + form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?':'&') + params); + form.submit(); + }); + + var stateTimer; + me.addListener('selectionchange', function () { + clearTimeout(stateTimer); + stateTimer = setTimeout(function() { + var state = me.queryCommandState('simpleupload'); + if (state == -1) { + input.disabled = 'disabled'; + } else { + input.disabled = false; + } + }, 400); + }); + isLoaded = true; + }); + + btnIframe.style.cssText = btnStyle; + containerBtn.appendChild(btnIframe); + } + + return { + bindEvents:{ + 'ready': function() { + //设置loading的样式 + utils.cssRule('loading', + '.loadingclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loading.gif\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n' + + '.loaderrorclass{display:inline-block;cursor:default;background: url(\'' + + this.options.themePath + + this.options.theme +'/images/loaderror.png\') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;' + + '}', + this.document); + }, + /* 初始化简单上传按钮 */ + 'simpleuploadbtnready': function(type, container) { + containerBtn = container; + me.afterConfigReady(initUploadBtn); + } + }, + outputRule: function(root){ + utils.each(root.getNodesByTagName('img'),function(n){ + if (/\b(loaderrorclass)|(bloaderrorclass)\b/.test(n.getAttr('class'))) { + n.parentNode.removeChild(n); + } + }); + }, + commands: { + 'simpleupload': { + queryCommandState: function () { + return isLoaded ? 0:-1; + } + } + } + } +}); + +// plugins/serverparam.js +/** + * 服务器提交的额外参数列表设置插件 + * @file + * @since 1.2.6.1 + */ +UE.plugin.register('serverparam', function (){ + + var me = this, + serverParam = {}; + + return { + commands:{ + /** + * 修改服务器提交的额外参数列表,清除所有项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.execCommand('serverparam'); + * editor.queryCommandValue('serverparam'); //返回空 + * ``` + */ + /** + * 修改服务器提交的额外参数列表,删除指定项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要清除的属性 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name'); //删除属性name + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用键值添加项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { String } key 要添加的属性 + * @param { String } value 要添加属性的值 + * @example + * ```javascript + * editor.execCommand('serverparam', 'name', 'hello'); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,传入键值对对象添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Object } key 传入的键值对对象 + * @example + * ```javascript + * editor.execCommand('serverparam', {'name': 'hello'}); + * editor.queryCommandValue('serverparam'); //返回对象 {'name': 'hello'} + * ``` + */ + /** + * 修改服务器提交的额外参数列表,使用自定义函数添加多项 + * @command serverparam + * @method execCommand + * @param { String } cmd 命令字符串 + * @param { Function } key 自定义获取参数的函数 + * @example + * ```javascript + * editor.execCommand('serverparam', function(editor){ + * return {'key': 'value'}; + * }); + * editor.queryCommandValue('serverparam'); //返回对象 {'key': 'value'} + * ``` + */ + + /** + * 获取服务器提交的额外参数列表 + * @command serverparam + * @method queryCommandValue + * @param { String } cmd 命令字符串 + * @example + * ```javascript + * editor.queryCommandValue( 'serverparam' ); //返回对象 {'key': 'value'} + * ``` + */ + 'serverparam':{ + execCommand:function (cmd, key, value) { + if (key === undefined || key === null) { //不传参数,清空列表 + serverParam = {}; + } else if (utils.isString(key)) { //传入键值 + if(value === undefined || value === null) { + delete serverParam[key]; + } else { + serverParam[key] = value; + } + } else if (utils.isObject(key)) { //传入对象,覆盖列表项 + utils.extend(serverParam, key, true); + } else if (utils.isFunction(key)){ //传入函数,添加列表项 + utils.extend(serverParam, key(), true); + } + }, + queryCommandValue: function(){ + return serverParam || {}; + } + } + } + } +}); + + +// plugins/insertfile.js +/** + * 插入附件 + */ +UE.plugin.register('insertfile', function (){ + + var me = this; + + function getFileIcon(url){ + var ext = url.substr(url.lastIndexOf('.') + 1).toLowerCase(), + maps = { + "rar":"icon_rar.gif", + "zip":"icon_rar.gif", + "tar":"icon_rar.gif", + "gz":"icon_rar.gif", + "bz2":"icon_rar.gif", + "doc":"icon_doc.gif", + "docx":"icon_doc.gif", + "pdf":"icon_pdf.gif", + "mp3":"icon_mp3.gif", + "xls":"icon_xls.gif", + "chm":"icon_chm.gif", + "ppt":"icon_ppt.gif", + "pptx":"icon_ppt.gif", + "avi":"icon_mv.gif", + "rmvb":"icon_mv.gif", + "wmv":"icon_mv.gif", + "flv":"icon_mv.gif", + "swf":"icon_mv.gif", + "rm":"icon_mv.gif", + "exe":"icon_exe.gif", + "psd":"icon_psd.gif", + "txt":"icon_txt.gif", + "jpg":"icon_jpg.gif", + "png":"icon_jpg.gif", + "jpeg":"icon_jpg.gif", + "gif":"icon_jpg.gif", + "ico":"icon_jpg.gif", + "bmp":"icon_jpg.gif" + }; + return maps[ext] ? maps[ext]:maps['txt']; + } + + return { + commands:{ + 'insertfile': { + execCommand: function (command, filelist){ + filelist = utils.isArray(filelist) ? filelist : [filelist]; + + var i, item, icon, title, + html = '', + URL = me.getOpt('UEDITOR_HOME_URL'), + iconDir = URL + (URL.substr(URL.length - 1) == '/' ? '':'/') + 'dialogs/attachment/fileTypeImages/'; + for (i = 0; i < filelist.length; i++) { + item = filelist[i]; + icon = iconDir + getFileIcon(item.url); + title = item.title || item.url.substr(item.url.lastIndexOf('/') + 1); + html += '

            ' + + '' + + '' + title + '' + + '

            '; + } + me.execCommand('insertHtml', html); + } + } + } + } +}); + + + + +// plugins/xssFilter.js +/** + * @file xssFilter.js + * @desc xss过滤器 + * @author robbenmu + */ + +UE.plugins.xssFilter = function() { + + var config = UEDITOR_CONFIG; + var whitList = config.whitList; + + function filter(node) { + + var tagName = node.tagName; + var attrs = node.attrs; + + if (!whitList.hasOwnProperty(tagName)) { + node.parentNode.removeChild(node); + return false; + } + + UE.utils.each(attrs, function (val, key) { + + if (whitList[tagName].indexOf(key) === -1) { + node.setAttr(key); + } + }); + } + + // 添加inserthtml\paste等操作用的过滤规则 + if (whitList && config.xssFilterRules) { + this.options.filterRules = function () { + + var result = {}; + + UE.utils.each(whitList, function(val, key) { + result[key] = function (node) { + return filter(node); + }; + }); + + return result; + }(); + } + + var tagList = []; + + UE.utils.each(whitList, function (val, key) { + tagList.push(key); + }); + + // 添加input过滤规则 + // + if (whitList && config.inputXssFilter) { + this.addInputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + // 添加output过滤规则 + // + if (whitList && config.outputXssFilter) { + this.addOutputRule(function (root) { + + root.traversal(function(node) { + if (node.type !== 'element') { + return false; + } + filter(node); + }); + }); + } + +}; + + +// ui/ui.js +var baidu = baidu || {}; +baidu.editor = baidu.editor || {}; +UE.ui = baidu.editor.ui = {}; + +// ui/uiutils.js +(function (){ + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils; + + var magic = '$EDITORUI'; + var root = window[magic] = {}; + var uidMagic = 'ID' + magic; + var uidCount = 0; + + var uiUtils = baidu.editor.ui.uiUtils = { + uid: function (obj){ + return (obj ? obj[uidMagic] || (obj[uidMagic] = ++ uidCount) : ++ uidCount); + }, + hook: function ( fn, callback ) { + var dg; + if (fn && fn._callbacks) { + dg = fn; + } else { + dg = function (){ + var q; + if (fn) { + q = fn.apply(this, arguments); + } + var callbacks = dg._callbacks; + var k = callbacks.length; + while (k --) { + var r = callbacks[k].apply(this, arguments); + if (q === undefined) { + q = r; + } + } + return q; + }; + dg._callbacks = []; + } + dg._callbacks.push(callback); + return dg; + }, + createElementByHtml: function (html){ + var el = document.createElement('div'); + el.innerHTML = html; + el = el.firstChild; + el.parentNode.removeChild(el); + return el; + }, + getViewportElement: function (){ + return (browser.ie && browser.quirks) ? + document.body : document.documentElement; + }, + getClientRect: function (element){ + var bcr; + //trace IE6下在控制编辑器显隐时可能会报错,catch一下 + try{ + bcr = element.getBoundingClientRect(); + }catch(e){ + bcr={left:0,top:0,height:0,width:0} + } + var rect = { + left: Math.round(bcr.left), + top: Math.round(bcr.top), + height: Math.round(bcr.bottom - bcr.top), + width: Math.round(bcr.right - bcr.left) + }; + var doc; + while ((doc = element.ownerDocument) !== document && + (element = domUtils.getWindow(doc).frameElement)) { + bcr = element.getBoundingClientRect(); + rect.left += bcr.left; + rect.top += bcr.top; + } + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; + }, + getViewportRect: function (){ + var viewportEl = uiUtils.getViewportElement(); + var width = (window.innerWidth || viewportEl.clientWidth) | 0; + var height = (window.innerHeight ||viewportEl.clientHeight) | 0; + return { + left: 0, + top: 0, + height: height, + width: width, + bottom: height, + right: width + }; + }, + setViewportOffset: function (element, offset){ + var rect; + var fixedLayer = uiUtils.getFixedLayer(); + if (element.parentNode === fixedLayer) { + element.style.left = offset.left + 'px'; + element.style.top = offset.top + 'px'; + } else { + domUtils.setViewportOffset(element, offset); + } + }, + getEventOffset: function (evt){ + var el = evt.target || evt.srcElement; + var rect = uiUtils.getClientRect(el); + var offset = uiUtils.getViewportOffsetByEvent(evt); + return { + left: offset.left - rect.left, + top: offset.top - rect.top + }; + }, + getViewportOffsetByEvent: function (evt){ + var el = evt.target || evt.srcElement; + var frameEl = domUtils.getWindow(el).frameElement; + var offset = { + left: evt.clientX, + top: evt.clientY + }; + if (frameEl && el.ownerDocument !== document) { + var rect = uiUtils.getClientRect(frameEl); + offset.left += rect.left; + offset.top += rect.top; + } + return offset; + }, + setGlobal: function (id, obj){ + root[id] = obj; + return magic + '["' + id + '"]'; + }, + unsetGlobal: function (id){ + delete root[id]; + }, + copyAttributes: function (tgt, src){ + var attributes = src.attributes; + var k = attributes.length; + while (k --) { + var attrNode = attributes[k]; + if ( attrNode.nodeName != 'style' && attrNode.nodeName != 'class' && (!browser.ie || attrNode.specified) ) { + tgt.setAttribute(attrNode.nodeName, attrNode.nodeValue); + } + } + if (src.className) { + domUtils.addClass(tgt,src.className); + } + if (src.style.cssText) { + tgt.style.cssText += ';' + src.style.cssText; + } + }, + removeStyle: function (el, styleName){ + if (el.style.removeProperty) { + el.style.removeProperty(styleName); + } else if (el.style.removeAttribute) { + el.style.removeAttribute(styleName); + } else throw ''; + }, + contains: function (elA, elB){ + return elA && elB && (elA === elB ? false : ( + elA.contains ? elA.contains(elB) : + elA.compareDocumentPosition(elB) & 16 + )); + }, + startDrag: function (evt, callbacks,doc){ + var doc = doc || document; + var startX = evt.clientX; + var startY = evt.clientY; + function handleMouseMove(evt){ + var x = evt.clientX - startX; + var y = evt.clientY - startY; + callbacks.ondragmove(x, y,evt); + if (evt.stopPropagation) { + evt.stopPropagation(); + } else { + evt.cancelBubble = true; + } + } + if (doc.addEventListener) { + function handleMouseUp(evt){ + doc.removeEventListener('mousemove', handleMouseMove, true); + doc.removeEventListener('mouseup', handleMouseUp, true); + window.removeEventListener('mouseup', handleMouseUp, true); + callbacks.ondragstop(); + } + doc.addEventListener('mousemove', handleMouseMove, true); + doc.addEventListener('mouseup', handleMouseUp, true); + window.addEventListener('mouseup', handleMouseUp, true); + + evt.preventDefault(); + } else { + var elm = evt.srcElement; + elm.setCapture(); + function releaseCaptrue(){ + elm.releaseCapture(); + elm.detachEvent('onmousemove', handleMouseMove); + elm.detachEvent('onmouseup', releaseCaptrue); + elm.detachEvent('onlosecaptrue', releaseCaptrue); + callbacks.ondragstop(); + } + elm.attachEvent('onmousemove', handleMouseMove); + elm.attachEvent('onmouseup', releaseCaptrue); + elm.attachEvent('onlosecaptrue', releaseCaptrue); + evt.returnValue = false; + } + callbacks.ondragstart(); + }, + getFixedLayer: function (){ + var layer = document.getElementById('edui_fixedlayer'); + if (layer == null) { + layer = document.createElement('div'); + layer.id = 'edui_fixedlayer'; + document.body.appendChild(layer); + if (browser.ie && browser.version <= 8) { + layer.style.position = 'absolute'; + bindFixedLayer(); + setTimeout(updateFixedOffset); + } else { + layer.style.position = 'fixed'; + } + layer.style.left = '0'; + layer.style.top = '0'; + layer.style.width = '0'; + layer.style.height = '0'; + } + return layer; + }, + makeUnselectable: function (element){ + if (browser.opera || (browser.ie && browser.version < 9)) { + element.unselectable = 'on'; + if (element.hasChildNodes()) { + for (var i=0; i
            '; + } + }; + utils.inherits(Separator, UIBase); + +})(); + + +// ui/mask.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + uiUtils = baidu.editor.ui.uiUtils; + + var Mask = baidu.editor.ui.Mask = function (options){ + this.initOptions(options); + this.initUIBase(); + }; + Mask.prototype = { + getHtmlTpl: function (){ + return '
            '; + }, + postRender: function (){ + var me = this; + domUtils.on(window, 'resize', function (){ + setTimeout(function (){ + if (!me.isHidden()) { + me._fill(); + } + }); + }); + }, + show: function (zIndex){ + this._fill(); + this.getDom().style.display = ''; + this.getDom().style.zIndex = zIndex; + }, + hide: function (){ + this.getDom().style.display = 'none'; + this.getDom().style.zIndex = ''; + }, + isHidden: function (){ + return this.getDom().style.display == 'none'; + }, + _onMouseDown: function (){ + return false; + }, + _onClick: function (e, target){ + this.fireEvent('click', e, target); + }, + _fill: function (){ + var el = this.getDom(); + var vpRect = uiUtils.getViewportRect(); + el.style.width = vpRect.width + 'px'; + el.style.height = vpRect.height + 'px'; + } + }; + utils.inherits(Mask, UIBase); +})(); + + +// ui/popup.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Popup = baidu.editor.ui.Popup = function (options){ + this.initOptions(options); + this.initPopup(); + }; + + var allPopups = []; + function closeAllPopup( evt,el ){ + for ( var i = 0; i < allPopups.length; i++ ) { + var pop = allPopups[i]; + if (!pop.isHidden()) { + if (pop.queryAutoHide(el) !== false) { + if(evt&&/scroll/ig.test(evt.type)&&pop.className=="edui-wordpastepop") return; + pop.hide(); + } + } + } + + if(allPopups.length) + pop.editor.fireEvent("afterhidepop"); + } + + Popup.postHide = closeAllPopup; + + var ANCHOR_CLASSES = ['edui-anchor-topleft','edui-anchor-topright', + 'edui-anchor-bottomleft','edui-anchor-bottomright']; + Popup.prototype = { + SHADOW_RADIUS: 5, + content: null, + _hidden: false, + autoRender: true, + canSideLeft: true, + canSideUp: true, + initPopup: function (){ + this.initUIBase(); + allPopups.push( this ); + }, + getHtmlTpl: function (){ + return '
            ' + + '
            ' + + ' ' + + '
            ' + + '
            ' + + this.getContentHtmlTpl() + + '
            ' + + '
            ' + + '
            '; + }, + getContentHtmlTpl: function (){ + if(this.content){ + if (typeof this.content == 'string') { + return this.content; + } + return this.content.renderHtml(); + }else{ + return '' + } + + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function (){ + + + if (this.content instanceof UIBase) { + this.content.postRender(); + } + + //捕获鼠标滚轮 + if( this.captureWheel && !this.captured ) { + + this.captured = true; + + var winHeight = ( document.documentElement.clientHeight || document.body.clientHeight ) - 80, + _height = this.getDom().offsetHeight, + _top = uiUtils.getClientRect( this.combox.getDom() ).top, + content = this.getDom('content'), + ifr = this.getDom('body').getElementsByTagName('iframe'), + me = this; + + ifr.length && ( ifr = ifr[0] ); + + while( _top + _height > winHeight ) { + _height -= 30; + } + content.style.height = _height + 'px'; + //同步更改iframe高度 + ifr && ( ifr.style.height = _height + 'px' ); + + //阻止在combox上的鼠标滚轮事件, 防止用户的正常操作被误解 + if( window.XMLHttpRequest ) { + + domUtils.on( content, ( 'onmousewheel' in document.body ) ? 'mousewheel' :'DOMMouseScroll' , function(e){ + + if(e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + + if( e.wheelDelta ) { + + content.scrollTop -= ( e.wheelDelta / 120 )*60; + + } else { + + content.scrollTop -= ( e.detail / -3 )*60; + + } + + }); + + } else { + + //ie6 + domUtils.on( this.getDom(), 'mousewheel' , function(e){ + + e.returnValue = false; + + me.getDom('content').scrollTop -= ( e.wheelDelta / 120 )*60; + + }); + + } + + } + this.fireEvent('postRenderAfter'); + this.hide(true); + this._UIBase_postRender(); + }, + _doAutoRender: function (){ + if (!this.getDom() && this.autoRender) { + this.render(); + } + }, + mesureSize: function (){ + var box = this.getDom('content'); + return uiUtils.getClientRect(box); + }, + fitSize: function (){ + if( this.captureWheel && this.sized ) { + return this.__size; + } + this.sized = true; + var popBodyEl = this.getDom('body'); + popBodyEl.style.width = ''; + popBodyEl.style.height = ''; + var size = this.mesureSize(); + if( this.captureWheel ) { + popBodyEl.style.width = -(-20 -size.width) + 'px'; + var height = parseInt( this.getDom('content').style.height, 10 ); + !window.isNaN( height ) && ( size.height = height ); + } else { + popBodyEl.style.width = size.width + 'px'; + } + popBodyEl.style.height = size.height + 'px'; + this.__size = size; + this.captureWheel && (this.getDom('content').style.overflow = 'auto'); + return size; + }, + showAnchor: function ( element, hoz ){ + this.showAnchorRect( uiUtils.getClientRect( element ), hoz ); + }, + showAnchorRect: function ( rect, hoz, adj ){ + this._doAutoRender(); + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.visibility = 'hidden'; + this._show(); + var popSize = this.fitSize(); + + var sideLeft, sideUp, left, top; + if (hoz) { + sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); + sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); + left = (sideLeft ? rect.left - popSize.width : rect.right); + top = (sideUp ? rect.bottom - popSize.height : rect.top); + } else { + sideLeft = this.canSideLeft && (rect.right + popSize.width > vpRect.right && rect.left > popSize.width); + sideUp = this.canSideUp && (rect.top + popSize.height > vpRect.bottom && rect.bottom > popSize.height); + left = (sideLeft ? rect.right - popSize.width : rect.left); + top = (sideUp ? rect.top - popSize.height : rect.bottom); + } + + var popEl = this.getDom(); + uiUtils.setViewportOffset(popEl, { + left: left, + top: top + }); + domUtils.removeClasses(popEl, ANCHOR_CLASSES); + popEl.className += ' ' + ANCHOR_CLASSES[(sideUp ? 1 : 0) * 2 + (sideLeft ? 1 : 0)]; + if(this.editor){ + popEl.style.zIndex = this.editor.container.style.zIndex * 1 + 10; + baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex = popEl.style.zIndex - 1; + } + this.getDom().style.visibility = 'visible'; + + }, + showAt: function (offset) { + var left = offset.left; + var top = offset.top; + var rect = { + left: left, + top: top, + right: left, + bottom: top, + height: 0, + width: 0 + }; + this.showAnchorRect(rect, false, true); + }, + _show: function (){ + if (this._hidden) { + var box = this.getDom(); + box.style.display = ''; + this._hidden = false; +// if (box.setActive) { +// box.setActive(); +// } + this.fireEvent('show'); + } + }, + isHidden: function (){ + return this._hidden; + }, + show: function (){ + this._doAutoRender(); + this._show(); + }, + hide: function (notNofity){ + if (!this._hidden && this.getDom()) { + this.getDom().style.display = 'none'; + this._hidden = true; + if (!notNofity) { + this.fireEvent('hide'); + } + } + }, + queryAutoHide: function (el){ + return !el || !uiUtils.contains(this.getDom(), el); + } + }; + utils.inherits(Popup, UIBase); + + domUtils.on( document, 'mousedown', function ( evt ) { + var el = evt.target || evt.srcElement; + closeAllPopup( evt,el ); + } ); + domUtils.on( window, 'scroll', function (evt,el) { + closeAllPopup( evt,el ); + } ); + +})(); + + +// ui/colorpicker.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + ColorPicker = baidu.editor.ui.ColorPicker = function (options){ + this.initOptions(options); + this.noColorText = this.noColorText || this.editor.getLang("clearColor"); + this.initUIBase(); + }; + + ColorPicker.prototype = { + getHtmlTpl: function (){ + return genColorPicker(this.noColorText,this.editor); + }, + _onTableClick: function (evt){ + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute('data-color'); + if (color) { + this.fireEvent('pickcolor', color); + } + }, + _onTableOver: function (evt){ + var tgt = evt.target || evt.srcElement; + var color = tgt.getAttribute('data-color'); + if (color) { + this.getDom('preview').style.backgroundColor = color; + } + }, + _onTableOut: function (){ + this.getDom('preview').style.backgroundColor = ''; + }, + _onPickNoColor: function (){ + this.fireEvent('picknocolor'); + } + }; + utils.inherits(ColorPicker, UIBase); + + var COLORS = ( + 'ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,' + + 'f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,' + + 'd8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,' + + 'bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,' + + 'a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,' + + '7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,' + + 'c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,').split(','); + + function genColorPicker(noColorText,editor){ + var html = '
            ' + + '
            ' + + '
            ' + + '
            '+ noColorText +'
            ' + + '
            ' + + '' + + ''+ + ''; + for (var i=0; i':'')+''; + } + html += i<70 ? '':''; + } + html += '
            '+editor.getLang("themeColor")+'
            '+editor.getLang("standardColor")+'
            '; + return html; + } +})(); + + +// ui/tablepicker.js +///import core +///import uicore +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; + + var TablePicker = baidu.editor.ui.TablePicker = function (options){ + this.initOptions(options); + this.initTablePicker(); + }; + TablePicker.prototype = { + defaultNumRows: 10, + defaultNumCols: 10, + maxNumRows: 20, + maxNumCols: 20, + numRows: 10, + numCols: 10, + lengthOfCellSide: 22, + initTablePicker: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + var me = this; + return '
            ' + + '
            ' + + '
            ' + + '' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            '; + }, + _UIBase_render: UIBase.prototype.render, + render: function (holder){ + this._UIBase_render(holder); + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_row")+' x 0'+this.editor.getLang("t_col"); + }, + _track: function (numCols, numRows){ + var style = this.getDom('overlay').style; + var sideLen = this.lengthOfCellSide; + style.width = numCols * sideLen + 'px'; + style.height = numRows * sideLen + 'px'; + var label = this.getDom('label'); + label.innerHTML = numCols +this.editor.getLang("t_col")+' x ' + numRows + this.editor.getLang("t_row"); + this.numCols = numCols; + this.numRows = numRows; + }, + _onMouseOver: function (evt, el){ + var rel = evt.relatedTarget || evt.fromElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_col")+' x 0'+this.editor.getLang("t_row"); + this.getDom('overlay').style.visibility = ''; + } + }, + _onMouseOut: function (evt, el){ + var rel = evt.relatedTarget || evt.toElement; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.getDom('label').innerHTML = '0'+this.editor.getLang("t_col")+' x 0'+this.editor.getLang("t_row"); + this.getDom('overlay').style.visibility = 'hidden'; + } + }, + _onMouseMove: function (evt, el){ + var style = this.getDom('overlay').style; + var offset = uiUtils.getEventOffset(evt); + var sideLen = this.lengthOfCellSide; + var numCols = Math.ceil(offset.left / sideLen); + var numRows = Math.ceil(offset.top / sideLen); + this._track(numCols, numRows); + }, + _onClick: function (){ + this.fireEvent('picktable', this.numCols, this.numRows); + } + }; + utils.inherits(TablePicker, UIBase); +})(); + + +// ui/stateful.js +(function (){ + var browser = baidu.editor.browser, + domUtils = baidu.editor.dom.domUtils, + uiUtils = baidu.editor.ui.uiUtils; + + var TPL_STATEFUL = 'onmousedown="$$.Stateful_onMouseDown(event, this);"' + + ' onmouseup="$$.Stateful_onMouseUp(event, this);"' + + ( browser.ie ? ( + ' onmouseenter="$$.Stateful_onMouseEnter(event, this);"' + + ' onmouseleave="$$.Stateful_onMouseLeave(event, this);"' ) + : ( + ' onmouseover="$$.Stateful_onMouseOver(event, this);"' + + ' onmouseout="$$.Stateful_onMouseOut(event, this);"' )); + + baidu.editor.ui.Stateful = { + alwalysHoverable: false, + target:null,//目标元素和this指向dom不一样 + Stateful_init: function (){ + this._Stateful_dGetHtmlTpl = this.getHtmlTpl; + this.getHtmlTpl = this.Stateful_getHtmlTpl; + }, + Stateful_getHtmlTpl: function (){ + var tpl = this._Stateful_dGetHtmlTpl(); + // 使用function避免$转义 + return tpl.replace(/stateful/g, function (){ return TPL_STATEFUL; }); + }, + Stateful_onMouseEnter: function (evt, el){ + this.target=el; + if (!this.isDisabled() || this.alwalysHoverable) { + this.addState('hover'); + this.fireEvent('over'); + } + }, + Stateful_onMouseLeave: function (evt, el){ + if (!this.isDisabled() || this.alwalysHoverable) { + this.removeState('hover'); + this.removeState('active'); + this.fireEvent('out'); + } + }, + Stateful_onMouseOver: function (evt, el){ + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseEnter(evt, el); + } + }, + Stateful_onMouseOut: function (evt, el){ + var rel = evt.relatedTarget; + if (!uiUtils.contains(el, rel) && el !== rel) { + this.Stateful_onMouseLeave(evt, el); + } + }, + Stateful_onMouseDown: function (evt, el){ + if (!this.isDisabled()) { + this.addState('active'); + } + }, + Stateful_onMouseUp: function (evt, el){ + if (!this.isDisabled()) { + this.removeState('active'); + } + }, + Stateful_postRender: function (){ + if (this.disabled && !this.hasState('disabled')) { + this.addState('disabled'); + } + }, + hasState: function (state){ + return domUtils.hasClass(this.getStateDom(), 'edui-state-' + state); + }, + addState: function (state){ + if (!this.hasState(state)) { + this.getStateDom().className += ' edui-state-' + state; + } + }, + removeState: function (state){ + if (this.hasState(state)) { + domUtils.removeClasses(this.getStateDom(), ['edui-state-' + state]); + } + }, + getStateDom: function (){ + return this.getDom('state'); + }, + isChecked: function (){ + return this.hasState('checked'); + }, + setChecked: function (checked){ + if (!this.isDisabled() && checked) { + this.addState('checked'); + } else { + this.removeState('checked'); + } + }, + isDisabled: function (){ + return this.hasState('disabled'); + }, + setDisabled: function (disabled){ + if (disabled) { + this.removeState('hover'); + this.removeState('checked'); + this.removeState('active'); + this.addState('disabled'); + } else { + this.removeState('disabled'); + } + } + }; +})(); + + +// ui/button.js +///import core +///import uicore +///import ui/stateful.js +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + Button = baidu.editor.ui.Button = function (options){ + if(options.name){ + var btnName = options.name; + var cssRules = options.cssRules; + if(!options.className){ + options.className = 'edui-for-' + btnName; + } + options.cssRules = '.edui-default .edui-for-'+ btnName +' .edui-icon {'+ cssRules +'}' + } + this.initOptions(options); + this.initButton(); + }; + Button.prototype = { + uiName: 'button', + label: '', + title: '', + showIcon: true, + showText: true, + cssRules:'', + initButton: function (){ + this.initUIBase(); + this.Stateful_init(); + if(this.cssRules){ + utils.cssRule('edui-customize-'+this.name+'-style',this.cssRules); + } + }, + getHtmlTpl: function (){ + return '
            ' + + '
            ' + + '
            ' + + (this.showIcon ? '
            ' : '') + + (this.showText ? '
            ' + this.label + '
            ' : '') + + '
            ' + + '
            ' + + '
            '; + }, + postRender: function (){ + this.Stateful_postRender(); + this.setDisabled(this.disabled) + }, + _onMouseDown: function (e){ + var target = e.target || e.srcElement, + tagName = target && target.tagName && target.tagName.toLowerCase(); + if (tagName == 'input' || tagName == 'object' || tagName == 'object') { + return false; + } + }, + _onClick: function (){ + if (!this.isDisabled()) { + this.fireEvent('click'); + } + }, + setTitle: function(text){ + var label = this.getDom('label'); + label.innerHTML = text; + } + }; + utils.inherits(Button, UIBase); + utils.extend(Button.prototype, Stateful); + +})(); + + +// ui/splitbutton.js +///import core +///import uicore +///import ui/stateful.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Stateful = baidu.editor.ui.Stateful, + SplitButton = baidu.editor.ui.SplitButton = function (options){ + this.initOptions(options); + this.initSplitButton(); + }; + SplitButton.prototype = { + popup: null, + uiName: 'splitbutton', + title: '', + initSplitButton: function (){ + this.initUIBase(); + this.Stateful_init(); + var me = this; + if (this.popup != null) { + var popup = this.popup; + this.popup = null; + this.setPopup(popup); + } + }, + _UIBase_postRender: UIBase.prototype.postRender, + postRender: function (){ + this.Stateful_postRender(); + this._UIBase_postRender(); + }, + setPopup: function (popup){ + if (this.popup === popup) return; + if (this.popup != null) { + this.popup.dispose(); + } + popup.addListener('show', utils.bind(this._onPopupShow, this)); + popup.addListener('hide', utils.bind(this._onPopupHide, this)); + popup.addListener('postrender', utils.bind(function (){ + popup.getDom('body').appendChild( + uiUtils.createElementByHtml('
            ') + ); + popup.getDom().className += ' ' + this.className; + }, this)); + this.popup = popup; + }, + _onPopupShow: function (){ + this.addState('opened'); + }, + _onPopupHide: function (){ + this.removeState('opened'); + }, + getHtmlTpl: function (){ + return '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            '; + }, + showPopup: function (){ + // 当popup往上弹出的时候,做特殊处理 + var rect = uiUtils.getClientRect(this.getDom()); + rect.top -= this.popup.SHADOW_RADIUS; + rect.height += this.popup.SHADOW_RADIUS; + this.popup.showAnchorRect(rect); + }, + _onArrowClick: function (event, el){ + if (!this.isDisabled()) { + this.showPopup(); + } + }, + _onButtonClick: function (){ + if (!this.isDisabled()) { + this.fireEvent('buttonclick'); + } + } + }; + utils.inherits(SplitButton, UIBase); + utils.extend(SplitButton.prototype, Stateful, true); + +})(); + + +// ui/colorbutton.js +///import core +///import uicore +///import ui/colorpicker.js +///import ui/popup.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + ColorPicker = baidu.editor.ui.ColorPicker, + Popup = baidu.editor.ui.Popup, + SplitButton = baidu.editor.ui.SplitButton, + ColorButton = baidu.editor.ui.ColorButton = function (options){ + this.initOptions(options); + this.initColorButton(); + }; + ColorButton.prototype = { + initColorButton: function (){ + var me = this; + this.popup = new Popup({ + content: new ColorPicker({ + noColorText: me.editor.getLang("clearColor"), + editor:me.editor, + onpickcolor: function (t, color){ + me._onPickColor(color); + }, + onpicknocolor: function (t, color){ + me._onPickNoColor(color); + } + }), + editor:me.editor + }); + this.initSplitButton(); + }, + _SplitButton_postRender: SplitButton.prototype.postRender, + postRender: function (){ + this._SplitButton_postRender(); + this.getDom('button_body').appendChild( + uiUtils.createElementByHtml('
            ') + ); + this.getDom().className += ' edui-colorbutton'; + }, + setColor: function (color){ + this.getDom('colorlump').style.backgroundColor = color; + this.color = color; + }, + _onPickColor: function (color){ + if (this.fireEvent('pickcolor', color) !== false) { + this.setColor(color); + this.popup.hide(); + } + }, + _onPickNoColor: function (color){ + if (this.fireEvent('picknocolor') !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(ColorButton, SplitButton); + +})(); + + +// ui/tablebutton.js +///import core +///import uicore +///import ui/popup.js +///import ui/tablepicker.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + TablePicker = baidu.editor.ui.TablePicker, + SplitButton = baidu.editor.ui.SplitButton, + TableButton = baidu.editor.ui.TableButton = function (options){ + this.initOptions(options); + this.initTableButton(); + }; + TableButton.prototype = { + initTableButton: function (){ + var me = this; + this.popup = new Popup({ + content: new TablePicker({ + editor:me.editor, + onpicktable: function (t, numCols, numRows){ + me._onPickTable(numCols, numRows); + } + }), + 'editor':me.editor + }); + this.initSplitButton(); + }, + _onPickTable: function (numCols, numRows){ + if (this.fireEvent('picktable', numCols, numRows) !== false) { + this.popup.hide(); + } + } + }; + utils.inherits(TableButton, SplitButton); + +})(); + + +// ui/autotypesetpicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase; + + var AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker = function (options) { + this.initOptions(options); + this.initAutoTypeSetPicker(); + }; + AutoTypeSetPicker.prototype = { + initAutoTypeSetPicker:function () { + this.initUIBase(); + }, + getHtmlTpl:function () { + var me = this.editor, + opt = me.options.autotypeset, + lang = me.getLang("autoTypeSet"); + + var textAlignInputName = 'textAlignValue' + me.uid, + imageBlockInputName = 'imageBlockLineValue' + me.uid, + symbolConverInputName = 'symbolConverValue' + me.uid; + + return '
            ' + + '
            ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
            ' + lang.mergeLine + '' + lang.delLine + '
            ' + lang.removeFormat + '' + lang.indent + '
            ' + lang.alignment + '' + + '' + me.getLang("justifyleft") + + '' + me.getLang("justifycenter") + + '' + me.getLang("justifyright") + + '
            ' + lang.imageFloat + '' + + '' + me.getLang("default") + + '' + me.getLang("justifyleft") + + '' + me.getLang("justifycenter") + + '' + me.getLang("justifyright") + + '
            ' + lang.removeFontsize + '' + lang.removeFontFamily + '
            ' + lang.removeHtml + '
            ' + lang.pasteFilter + '
            ' + lang.symbol + '' + + '' + lang.bdc2sb + + '' + lang.tobdc + '' + + '
            ' + + '
            ' + + '
            '; + + + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(AutoTypeSetPicker, UIBase); +})(); + + +// ui/autotypesetbutton.js +///import core +///import uicore +///import ui/popup.js +///import ui/autotypesetpicker.js +///import ui/splitbutton.js +(function (){ + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + AutoTypeSetPicker = baidu.editor.ui.AutoTypeSetPicker, + SplitButton = baidu.editor.ui.SplitButton, + AutoTypeSetButton = baidu.editor.ui.AutoTypeSetButton = function (options){ + this.initOptions(options); + this.initAutoTypeSetButton(); + }; + function getPara(me){ + + var opt = {}, + cont = me.getDom(), + editorId = me.editor.uid, + inputType = null, + attrName = null, + ipts = domUtils.getElementsByTagName(cont,"input"); + for(var i=ipts.length-1,ipt;ipt=ipts[i--];){ + inputType = ipt.getAttribute("type"); + if(inputType=="checkbox"){ + attrName = ipt.getAttribute("name"); + opt[attrName] && delete opt[attrName]; + if(ipt.checked){ + var attrValue = document.getElementById( attrName + "Value" + editorId ); + if(attrValue){ + if(/input/ig.test(attrValue.tagName)){ + opt[attrName] = attrValue.value; + } else { + var iptChilds = attrValue.getElementsByTagName("input"); + for(var j=iptChilds.length-1,iptchild;iptchild=iptChilds[j--];){ + if(iptchild.checked){ + opt[attrName] = iptchild.value; + break; + } + } + } + } else { + opt[attrName] = true; + } + } else { + opt[attrName] = false; + } + } else { + opt[ipt.getAttribute("value")] = ipt.checked; + } + + } + + var selects = domUtils.getElementsByTagName(cont,"select"); + for(var i=0,si;si=selects[i++];){ + var attr = si.getAttribute('name'); + opt[attr] = opt[attr] ? si.value : ''; + } + + utils.extend(me.editor.options.autotypeset,opt); + + me.editor.setPreferences('autotypeset', opt); + } + + AutoTypeSetButton.prototype = { + initAutoTypeSetButton: function (){ + + var me = this; + this.popup = new Popup({ + //传入配置参数 + content: new AutoTypeSetPicker({editor:me.editor}), + 'editor':me.editor, + hide : function(){ + if (!this._hidden && this.getDom()) { + getPara(this); + this.getDom().style.display = 'none'; + this._hidden = true; + this.fireEvent('hide'); + } + } + }); + var flag = 0; + this.popup.addListener('postRenderAfter',function(){ + var popupUI = this; + if(flag)return; + var cont = this.getDom(), + btn = cont.getElementsByTagName('button')[0]; + + btn.onclick = function(){ + getPara(popupUI); + me.editor.execCommand('autotypeset'); + popupUI.hide() + }; + + domUtils.on(cont, 'click', function(e) { + var target = e.target || e.srcElement, + editorId = me.editor.uid; + if (target && target.tagName == 'INPUT') { + + // 点击图片浮动的checkbox,去除对应的radio + if (target.name == 'imageBlockLine' || target.name == 'textAlign' || target.name == 'symbolConver') { + var checked = target.checked, + radioTd = document.getElementById( target.name + 'Value' + editorId), + radios = radioTd.getElementsByTagName('input'), + defalutSelect = { + 'imageBlockLine': 'none', + 'textAlign': 'left', + 'symbolConver': 'tobdc' + }; + + for (var i = 0; i < radios.length; i++) { + if (checked) { + if (radios[i].value == defalutSelect[target.name]) { + radios[i].checked = 'checked'; + } + } else { + radios[i].checked = false; + } + } + } + // 点击radio,选中对应的checkbox + if (target.name == ('imageBlockLineValue' + editorId) || target.name == ('textAlignValue' + editorId) || target.name == 'bdc') { + var checkboxs = target.parentNode.previousSibling.getElementsByTagName('input'); + checkboxs && (checkboxs[0].checked = true); + } + + getPara(popupUI); + } + }); + + flag = 1; + }); + this.initSplitButton(); + } + }; + utils.inherits(AutoTypeSetButton, SplitButton); + +})(); + + +// ui/cellalignpicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + Popup = baidu.editor.ui.Popup, + Stateful = baidu.editor.ui.Stateful, + UIBase = baidu.editor.ui.UIBase; + + /** + * 该参数将新增一个参数: selected, 参数类型为一个Object, 形如{ 'align': 'center', 'valign': 'top' }, 表示单元格的初始 + * 对齐状态为: 竖直居上,水平居中; 其中 align的取值为:'center', 'left', 'right'; valign的取值为: 'top', 'middle', 'bottom' + * @update 2013/4/2 hancong03@baidu.com + */ + var CellAlignPicker = baidu.editor.ui.CellAlignPicker = function (options) { + this.initOptions(options); + this.initSelected(); + this.initCellAlignPicker(); + }; + CellAlignPicker.prototype = { + //初始化选中状态, 该方法将根据传递进来的参数获取到应该选中的对齐方式图标的索引 + initSelected: function(){ + + var status = { + + valign: { + top: 0, + middle: 1, + bottom: 2 + }, + align: { + left: 0, + center: 1, + right: 2 + }, + count: 3 + + }, + result = -1; + + if( this.selected ) { + this.selectedIndex = status.valign[ this.selected.valign ] * status.count + status.align[ this.selected.align ]; + } + + }, + initCellAlignPicker:function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl:function () { + + var alignType = [ 'left', 'center', 'right' ], + COUNT = 9, + tempClassName = null, + tempIndex = -1, + tmpl = []; + + + for( var i= 0; i'); + + tmpl.push( '
            ' ); + + tempIndex === 2 && tmpl.push(''); + + } + + return '
            ' + + '
            ' + + '' + + tmpl.join('') + + '
            ' + + '
            ' + + '
            '; + }, + getStateDom: function (){ + return this.target; + }, + _onClick: function (evt){ + var target= evt.target || evt.srcElement; + if(/icon/.test(target.className)){ + this.items[target.parentNode.getAttribute("index")].onclick(); + Popup.postHide(evt); + } + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(CellAlignPicker, UIBase); + utils.extend(CellAlignPicker.prototype, Stateful,true); +})(); + + + + + +// ui/pastepicker.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + Stateful = baidu.editor.ui.Stateful, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase; + + var PastePicker = baidu.editor.ui.PastePicker = function (options) { + this.initOptions(options); + this.initPastePicker(); + }; + PastePicker.prototype = { + initPastePicker:function () { + this.initUIBase(); + this.Stateful_init(); + }, + getHtmlTpl:function () { + return '
            ' + + '
            ' + + '
            ' + this.editor.getLang("pasteOpt") + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + }, + getStateDom:function () { + return this.target; + }, + format:function (param) { + this.editor.ui._isTransfer = true; + this.editor.fireEvent('pasteTransfer', param); + }, + _onClick:function (cur) { + var node = domUtils.getNextDomNode(cur), + screenHt = uiUtils.getViewportRect().height, + subPop = uiUtils.getClientRect(node); + + if ((subPop.top + subPop.height) > screenHt) + node.style.top = (-subPop.height - cur.offsetHeight) + "px"; + else + node.style.top = ""; + + if (/hidden/ig.test(domUtils.getComputedStyle(node, "visibility"))) { + node.style.visibility = "visible"; + domUtils.addClass(cur, "edui-state-opened"); + } else { + node.style.visibility = "hidden"; + domUtils.removeClasses(cur, "edui-state-opened") + } + }, + _UIBase_render:UIBase.prototype.render + }; + utils.inherits(PastePicker, UIBase); + utils.extend(PastePicker.prototype, Stateful, true); +})(); + + + + + + +// ui/toolbar.js +(function (){ + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + Toolbar = baidu.editor.ui.Toolbar = function (options){ + this.initOptions(options); + this.initToolbar(); + }; + Toolbar.prototype = { + items: null, + initToolbar: function (){ + this.items = this.items || []; + this.initUIBase(); + }, + add: function (item,index){ + if(index === undefined){ + this.items.push(item); + }else{ + this.items.splice(index,0,item) + } + + }, + getHtmlTpl: function (){ + var buff = []; + for (var i=0; i' + + buff.join('') + + '
            ' + }, + postRender: function (){ + var box = this.getDom(); + for (var i=0; i
            '; + }, + postRender:function () { + }, + queryAutoHide:function () { + return true; + } + }; + Menu.prototype = { + items:null, + uiName:'menu', + initMenu:function () { + this.items = this.items || []; + this.initPopup(); + this.initItems(); + }, + initItems:function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item == '-') { + this.items[i] = this.getSeparator(); + } else if (!(item instanceof MenuItem)) { + item.editor = this.editor; + item.theme = this.editor.options.theme; + this.items[i] = this.createItem(item); + } + } + }, + getSeparator:function () { + return menuSeparator; + }, + createItem:function (item) { + //新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + item.menu = this; + return new MenuItem(item); + }, + _Popup_getContentHtmlTpl:Popup.prototype.getContentHtmlTpl, + getContentHtmlTpl:function () { + if (this.items.length == 0) { + return this._Popup_getContentHtmlTpl(); + } + var buff = []; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + buff[i] = item.renderHtml(); + } + return ('
            ' + buff.join('') + '
            '); + }, + _Popup_postRender:Popup.prototype.postRender, + postRender:function () { + var me = this; + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + item.ownerMenu = this; + item.postRender(); + } + domUtils.on(this.getDom(), 'mouseover', function (evt) { + evt = evt || event; + var rel = evt.relatedTarget || evt.fromElement; + var el = me.getDom(); + if (!uiUtils.contains(el, rel) && el !== rel) { + me.fireEvent('over'); + } + }); + this._Popup_postRender(); + }, + queryAutoHide:function (el) { + if (el) { + if (uiUtils.contains(this.getDom(), el)) { + return false; + } + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + if (item.queryAutoHide(el) === false) { + return false; + } + } + } + }, + clearItems:function () { + for (var i = 0; i < this.items.length; i++) { + var item = this.items[i]; + clearTimeout(item._showingTimer); + clearTimeout(item._closingTimer); + if (item.subMenu) { + item.subMenu.destroy(); + } + } + this.items = []; + }, + destroy:function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + this.clearItems(); + }, + dispose:function () { + this.destroy(); + } + }; + utils.inherits(Menu, Popup); + + /** + * @update 2013/04/03 hancong03 新增一个参数menu, 该参数存储了menuItem所对应的menu引用 + * @type {Function} + */ + var MenuItem = baidu.editor.ui.MenuItem = function (options) { + this.initOptions(options); + this.initUIBase(); + this.Stateful_init(); + if (this.subMenu && !(this.subMenu instanceof Menu)) { + if (options.className && options.className.indexOf("aligntd") != -1) { + var me = this; + + //获取单元格对齐初始状态 + this.subMenu.selected = this.editor.queryCommandValue( 'cellalignment' ); + + this.subMenu = new Popup({ + content:new CellAlignPicker(this.subMenu), + parentMenu:me, + editor:me.editor, + destroy:function () { + if (this.getDom()) { + domUtils.remove(this.getDom()); + } + } + }); + this.subMenu.addListener("postRenderAfter", function () { + domUtils.on(this.getDom(), "mouseover", function () { + me.addState('opened'); + }); + }); + } else { + this.subMenu = new Menu(this.subMenu); + } + } + }; + MenuItem.prototype = { + label:'', + subMenu:null, + ownerMenu:null, + uiName:'menuitem', + alwalysHoverable:true, + getHtmlTpl:function () { + return '
            ' + + '
            ' + + this.renderLabelHtml() + + '
            ' + + '
            '; + }, + postRender:function () { + var me = this; + this.addListener('over', function () { + me.ownerMenu.fireEvent('submenuover', me); + if (me.subMenu) { + me.delayShowSubMenu(); + } + }); + if (this.subMenu) { + this.getDom().className += ' edui-hassubmenu'; + this.subMenu.render(); + this.addListener('out', function () { + me.delayHideSubMenu(); + }); + this.subMenu.addListener('over', function () { + clearTimeout(me._closingTimer); + me._closingTimer = null; + me.addState('opened'); + }); + this.ownerMenu.addListener('hide', function () { + me.hideSubMenu(); + }); + this.ownerMenu.addListener('submenuover', function (t, subMenu) { + if (subMenu !== me) { + me.delayHideSubMenu(); + } + }); + this.subMenu._bakQueryAutoHide = this.subMenu.queryAutoHide; + this.subMenu.queryAutoHide = function (el) { + if (el && uiUtils.contains(me.getDom(), el)) { + return false; + } + return this._bakQueryAutoHide(el); + }; + } + this.getDom().style.tabIndex = '-1'; + uiUtils.makeUnselectable(this.getDom()); + this.Stateful_postRender(); + }, + delayShowSubMenu:function () { + var me = this; + if (!me.isDisabled()) { + me.addState('opened'); + clearTimeout(me._showingTimer); + clearTimeout(me._closingTimer); + me._closingTimer = null; + me._showingTimer = setTimeout(function () { + me.showSubMenu(); + }, 250); + } + }, + delayHideSubMenu:function () { + var me = this; + if (!me.isDisabled()) { + me.removeState('opened'); + clearTimeout(me._showingTimer); + if (!me._closingTimer) { + me._closingTimer = setTimeout(function () { + if (!me.hasState('opened')) { + me.hideSubMenu(); + } + me._closingTimer = null; + }, 400); + } + } + }, + renderLabelHtml:function () { + return '
            ' + + '
            ' + + '
            ' + (this.label || '') + '
            '; + }, + getStateDom:function () { + return this.getDom(); + }, + queryAutoHide:function (el) { + if (this.subMenu && this.hasState('opened')) { + return this.subMenu.queryAutoHide(el); + } + }, + _onClick:function (event, this_) { + if (this.hasState('disabled')) return; + if (this.fireEvent('click', event, this_) !== false) { + if (this.subMenu) { + this.showSubMenu(); + } else { + Popup.postHide(event); + } + } + }, + showSubMenu:function () { + var rect = uiUtils.getClientRect(this.getDom()); + rect.right -= 5; + rect.left += 2; + rect.width -= 7; + rect.top -= 4; + rect.bottom += 4; + rect.height += 8; + this.subMenu.showAnchorRect(rect, true, true); + }, + hideSubMenu:function () { + this.subMenu.hide(); + } + }; + utils.inherits(MenuItem, UIBase); + utils.extend(MenuItem.prototype, Stateful, true); +})(); + + +// ui/combox.js +///import core +///import uicore +///import ui/menu.js +///import ui/splitbutton.js +(function (){ + // todo: menu和item提成通用list + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + Menu = baidu.editor.ui.Menu, + SplitButton = baidu.editor.ui.SplitButton, + Combox = baidu.editor.ui.Combox = function (options){ + this.initOptions(options); + this.initCombox(); + }; + Combox.prototype = { + uiName: 'combox', + onbuttonclick:function () { + this.showPopup(); + }, + initCombox: function (){ + var me = this; + this.items = this.items || []; + for (var i=0; i vpRect.right) { + left = vpRect.right - rect.width; + } + var top = offset.top; + if (top + rect.height > vpRect.bottom) { + top = vpRect.bottom - rect.height; + } + el.style.left = Math.max(left, 0) + 'px'; + el.style.top = Math.max(top, 0) + 'px'; + }, + showAtCenter: function (){ + + var vpRect = uiUtils.getViewportRect(); + + if ( !this.fullscreen ) { + this.getDom().style.display = ''; + var popSize = this.fitSize(); + var titleHeight = this.getDom('titlebar').offsetHeight | 0; + var left = vpRect.width / 2 - popSize.width / 2; + var top = vpRect.height / 2 - (popSize.height - titleHeight) / 2 - titleHeight; + var popEl = this.getDom(); + this.safeSetOffset({ + left: Math.max(left | 0, 0), + top: Math.max(top | 0, 0) + }); + if (!domUtils.hasClass(popEl, 'edui-state-centered')) { + popEl.className += ' edui-state-centered'; + } + } else { + var dialogWrapNode = this.getDom(), + contentNode = this.getDom('content'); + + dialogWrapNode.style.display = "block"; + + var wrapRect = UE.ui.uiUtils.getClientRect( dialogWrapNode ), + contentRect = UE.ui.uiUtils.getClientRect( contentNode ); + dialogWrapNode.style.left = "-100000px"; + + contentNode.style.width = ( vpRect.width - wrapRect.width + contentRect.width ) + "px"; + contentNode.style.height = ( vpRect.height - wrapRect.height + contentRect.height ) + "px"; + + dialogWrapNode.style.width = vpRect.width + "px"; + dialogWrapNode.style.height = vpRect.height + "px"; + dialogWrapNode.style.left = 0; + + //保存环境的overflow值 + this._originalContext = { + html: { + overflowX: document.documentElement.style.overflowX, + overflowY: document.documentElement.style.overflowY + }, + body: { + overflowX: document.body.style.overflowX, + overflowY: document.body.style.overflowY + } + }; + + document.documentElement.style.overflowX = 'hidden'; + document.documentElement.style.overflowY = 'hidden'; + document.body.style.overflowX = 'hidden'; + document.body.style.overflowY = 'hidden'; + + } + + this._show(); + }, + getContentHtml: function (){ + var contentHtml = ''; + if (typeof this.content == 'string') { + contentHtml = this.content; + } else if (this.iframeUrl) { + contentHtml = ''; + } + return contentHtml; + }, + getHtmlTpl: function (){ + var footHtml = ''; + + if (this.buttons) { + var buff = []; + for (var i=0; i' + buff.join('') + '
            ' + + '
            '; + } + + return '
            ' + + '
            ' + + '
            ' + + '
            ' + + '' + (this.title || '') + '' + + '
            ' + + this.closeButton.renderHtml() + + '
            ' + + '
            '+ ( this.autoReset ? '' : this.getContentHtml()) +'
            ' + + footHtml + + '
            '; + }, + postRender: function (){ + // todo: 保持居中/记住上次关闭位置选项 + if (!this.modalMask.getDom()) { + this.modalMask.render(); + this.modalMask.hide(); + } + if (!this.dragMask.getDom()) { + this.dragMask.render(); + this.dragMask.hide(); + } + var me = this; + this.addListener('show', function (){ + me.modalMask.show(this.getDom().style.zIndex - 2); + }); + this.addListener('hide', function (){ + me.modalMask.hide(); + }); + if (this.buttons) { + for (var i=0; i'; + me.editor.container.style.zIndex && (this.getDom().style.zIndex = me.editor.container.style.zIndex * 1 + 1); + } + } + // canSideUp:false, + // canSideLeft:false + }); + this.onbuttonclick = function(){ + this.showPopup(); + }; + this.initSplitButton(); + } + + }; + + utils.inherits(MultiMenuPop, SplitButton); +})(); + + +// ui/shortcutmenu.js +(function () { + var UI = baidu.editor.ui, + UIBase = UI.UIBase, + uiUtils = UI.uiUtils, + utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils; + + var allMenus = [],//存储所有快捷菜单 + timeID, + isSubMenuShow = false;//是否有子pop显示 + + var ShortCutMenu = UI.ShortCutMenu = function (options) { + this.initOptions (options); + this.initShortCutMenu (); + }; + + ShortCutMenu.postHide = hideAllMenu; + + ShortCutMenu.prototype = { + isHidden : true , + SPACE : 5 , + initShortCutMenu : function () { + this.items = this.items || []; + this.initUIBase (); + this.initItems (); + this.initEvent (); + allMenus.push (this); + } , + initEvent : function () { + var me = this, + doc = me.editor.document; + + domUtils.on (doc , "mousemove" , function (e) { + if (me.isHidden === false) { + //有pop显示就不隐藏快捷菜单 + if (me.getSubMenuMark () || me.eventType == "contextmenu") return; + + + var flag = true, + el = me.getDom (), + wt = el.offsetWidth, + ht = el.offsetHeight, + distanceX = wt / 2 + me.SPACE,//距离中心X标准 + distanceY = ht / 2,//距离中心Y标准 + x = Math.abs (e.screenX - me.left),//离中心距离横坐标 + y = Math.abs (e.screenY - me.top);//离中心距离纵坐标 + + clearTimeout (timeID); + timeID = setTimeout (function () { + if (y > 0 && y < distanceY) { + me.setOpacity (el , "1"); + } else if (y > distanceY && y < distanceY + 70) { + me.setOpacity (el , "0.5"); + flag = false; + } else if (y > distanceY + 70 && y < distanceY + 140) { + me.hide (); + } + + if (flag && x > 0 && x < distanceX) { + me.setOpacity (el , "1") + } else if (x > distanceX && x < distanceX + 70) { + me.setOpacity (el , "0.5") + } else if (x > distanceX + 70 && x < distanceX + 140) { + me.hide (); + } + }); + } + }); + + //ie\ff下 mouseout不准 + if (browser.chrome) { + domUtils.on (doc , "mouseout" , function (e) { + var relatedTgt = e.relatedTarget || e.toElement; + + if (relatedTgt == null || relatedTgt.tagName == "HTML") { + me.hide (); + } + }); + } + + me.editor.addListener ("afterhidepop" , function () { + if (!me.isHidden) { + isSubMenuShow = true; + } + }); + + } , + initItems : function () { + if (utils.isArray (this.items)) { + for (var i = 0, len = this.items.length ; i < len ; i++) { + var item = this.items[i].toLowerCase (); + + if (UI[item]) { + this.items[i] = new UI[item] (this.editor); + this.items[i].className += " edui-shortcutsubmenu "; + } + } + } + } , + setOpacity : function (el , value) { + if (browser.ie && browser.version < 9) { + el.style.filter = "alpha(opacity = " + parseFloat (value) * 100 + ");" + } else { + el.style.opacity = value; + } + } , + getSubMenuMark : function () { + isSubMenuShow = false; + var layerEle = uiUtils.getFixedLayer (); + var list = domUtils.getElementsByTagName (layerEle , "div" , function (node) { + return domUtils.hasClass (node , "edui-shortcutsubmenu edui-popup") + }); + + for (var i = 0, node ; node = list[i++] ;) { + if (node.style.display != "none") { + isSubMenuShow = true; + } + } + return isSubMenuShow; + } , + show : function (e , hasContextmenu) { + var me = this, + offset = {}, + el = this.getDom (), + fixedlayer = uiUtils.getFixedLayer (); + + function setPos (offset) { + if (offset.left < 0) { + offset.left = 0; + } + if (offset.top < 0) { + offset.top = 0; + } + el.style.cssText = "position:absolute;left:" + offset.left + "px;top:" + offset.top + "px;"; + } + + function setPosByCxtMenu (menu) { + if (!menu.tagName) { + menu = menu.getDom (); + } + offset.left = parseInt (menu.style.left); + offset.top = parseInt (menu.style.top); + offset.top -= el.offsetHeight + 15; + setPos (offset); + } + + + me.eventType = e.type; + el.style.cssText = "display:block;left:-9999px"; + + if (e.type == "contextmenu" && hasContextmenu) { + var menu = domUtils.getElementsByTagName (fixedlayer , "div" , "edui-contextmenu")[0]; + if (menu) { + setPosByCxtMenu (menu) + } else { + me.editor.addListener ("aftershowcontextmenu" , function (type , menu) { + setPosByCxtMenu (menu); + }); + } + } else { + offset = uiUtils.getViewportOffsetByEvent (e); + offset.top -= el.offsetHeight + me.SPACE; + offset.left += me.SPACE + 20; + setPos (offset); + me.setOpacity (el , 0.2); + } + + + me.isHidden = false; + me.left = e.screenX + el.offsetWidth / 2 - me.SPACE; + me.top = e.screenY - (el.offsetHeight / 2) - me.SPACE; + + if (me.editor) { + el.style.zIndex = me.editor.container.style.zIndex * 1 + 10; + fixedlayer.style.zIndex = el.style.zIndex - 1; + } + } , + hide : function () { + if (this.getDom ()) { + this.getDom ().style.display = "none"; + } + this.isHidden = true; + } , + postRender : function () { + if (utils.isArray (this.items)) { + for (var i = 0, item ; item = this.items[i++] ;) { + item.postRender (); + } + } + } , + getHtmlTpl : function () { + var buff; + if (utils.isArray (this.items)) { + buff = []; + for (var i = 0 ; i < this.items.length ; i++) { + buff[i] = this.items[i].renderHtml (); + } + buff = buff.join (""); + } else { + buff = this.items; + } + + return '
            ' + + buff + + '
            '; + } + }; + + utils.inherits (ShortCutMenu , UIBase); + + function hideAllMenu (e) { + var tgt = e.target || e.srcElement, + cur = domUtils.findParent (tgt , function (node) { + return domUtils.hasClass (node , "edui-shortcutmenu") || domUtils.hasClass (node , "edui-popup"); + } , true); + + if (!cur) { + for (var i = 0, menu ; menu = allMenus[i++] ;) { + menu.hide () + } + } + } + + domUtils.on (document , 'mousedown' , function (e) { + hideAllMenu (e); + }); + + domUtils.on (window , 'scroll' , function (e) { + hideAllMenu (e); + }); + +}) (); + + +// ui/breakline.js +(function (){ + var utils = baidu.editor.utils, + UIBase = baidu.editor.ui.UIBase, + Breakline = baidu.editor.ui.Breakline = function (options){ + this.initOptions(options); + this.initSeparator(); + }; + Breakline.prototype = { + uiName: 'Breakline', + initSeparator: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + return '
            '; + } + }; + utils.inherits(Breakline, UIBase); + +})(); + + +// ui/message.js +///import core +///import uicore +(function () { + var utils = baidu.editor.utils, + domUtils = baidu.editor.dom.domUtils, + UIBase = baidu.editor.ui.UIBase, + Message = baidu.editor.ui.Message = function (options){ + this.initOptions(options); + this.initMessage(); + }; + + Message.prototype = { + initMessage: function (){ + this.initUIBase(); + }, + getHtmlTpl: function (){ + return '
            ' + + '
            ×
            ' + + '
            ' + + ' ' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + '
            '; + }, + reset: function(opt){ + var me = this; + if (!opt.keepshow) { + clearTimeout(this.timer); + me.timer = setTimeout(function(){ + me.hide(); + }, opt.timeout || 4000); + } + + opt.content !== undefined && me.setContent(opt.content); + opt.type !== undefined && me.setType(opt.type); + + me.show(); + }, + postRender: function(){ + var me = this, + closer = this.getDom('closer'); + closer && domUtils.on(closer, 'click', function(){ + me.hide(); + }); + }, + setContent: function(content){ + this.getDom('content').innerHTML = content; + }, + setType: function(type){ + type = type || 'info'; + var body = this.getDom('body'); + body.className = body.className.replace(/edui-message-type-[\w-]+/, 'edui-message-type-' + type); + }, + getContent: function(){ + return this.getDom('content').innerHTML; + }, + getType: function(){ + var arr = this.getDom('body').match(/edui-message-type-([\w-]+)/); + return arr ? arr[1]:''; + }, + show: function (){ + this.getDom().style.display = 'block'; + }, + hide: function (){ + var dom = this.getDom(); + if (dom) { + dom.style.display = 'none'; + dom.parentNode && dom.parentNode.removeChild(dom); + } + } + }; + + utils.inherits(Message, UIBase); + +})(); + + +// adapter/editorui.js +//ui跟编辑器的适配層 +//那个按钮弹出是dialog,是下拉筐等都是在这个js中配置 +//自己写的ui也要在这里配置,放到baidu.editor.ui下边,当编辑器实例化的时候会根据ueditor.config中的toolbars找到相应的进行实例化 +(function () { + var utils = baidu.editor.utils; + var editorui = baidu.editor.ui; + var _Dialog = editorui.Dialog; + editorui.buttons = {}; + + editorui.Dialog = function (options) { + var dialog = new _Dialog(options); + dialog.addListener('hide', function () { + + if (dialog.editor) { + var editor = dialog.editor; + try { + if (browser.gecko) { + var y = editor.window.scrollY, + x = editor.window.scrollX; + editor.body.focus(); + editor.window.scrollTo(x, y); + } else { + editor.focus(); + } + + + } catch (ex) { + } + } + }); + return dialog; + }; + + var iframeUrlMap = { + 'anchor':'~/dialogs/anchor/anchor.html', + 'insertimage':'~/dialogs/image/image.html', + 'link':'~/dialogs/link/link.html', + 'spechars':'~/dialogs/spechars/spechars.html', + 'searchreplace':'~/dialogs/searchreplace/searchreplace.html', + 'map':'~/dialogs/map/map.html', + 'gmap':'~/dialogs/gmap/gmap.html', + 'insertvideo':'~/dialogs/video/video.html', + 'help':'~/dialogs/help/help.html', + 'preview':'~/dialogs/preview/preview.html', + 'emotion':'~/dialogs/emotion/emotion.html', + 'wordimage':'~/dialogs/wordimage/wordimage.html', + 'attachment':'~/dialogs/attachment/attachment.html', + 'insertframe':'~/dialogs/insertframe/insertframe.html', + 'edittip':'~/dialogs/table/edittip.html', + 'edittable':'~/dialogs/table/edittable.html', + 'edittd':'~/dialogs/table/edittd.html', + 'webapp':'~/dialogs/webapp/webapp.html', + 'snapscreen':'~/dialogs/snapscreen/snapscreen.html', + 'scrawl':'~/dialogs/scrawl/scrawl.html', + 'music':'~/dialogs/music/music.html', + 'template':'~/dialogs/template/template.html', + 'background':'~/dialogs/background/background.html', + 'charts': '~/dialogs/charts/charts.html' + }; + //为工具栏添加按钮,以下都是统一的按钮触发命令,所以写在一起 + var btnCmds = ['undo', 'redo', 'formatmatch', + 'bold', 'italic', 'underline', 'fontborder', 'touppercase', 'tolowercase', + 'strikethrough', 'subscript', 'superscript', 'source', 'indent', 'outdent', + 'blockquote', 'pasteplain', 'pagebreak', + 'selectall', 'print','horizontal', 'removeformat', 'time', 'date', 'unlink', + 'insertparagraphbeforetable', 'insertrow', 'insertcol', 'mergeright', 'mergedown', 'deleterow', + 'deletecol', 'splittorows', 'splittocols', 'splittocells', 'mergecells', 'deletetable', 'drafts']; + + for (var i = 0, ci; ci = btnCmds[i++];) { + ci = ci.toLowerCase(); + editorui[ci] = function (cmd) { + return function (editor) { + var ui = new editorui.Button({ + className:'edui-for-' + cmd, + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', + onclick:function () { + editor.execCommand(cmd); + }, + theme:editor.options.theme, + showText:false + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + }(ci); + } + + //清除文档 + editorui.cleardoc = function (editor) { + var ui = new editorui.Button({ + className:'edui-for-cleardoc', + title:editor.options.labelMap.cleardoc || editor.getLang("labelMap.cleardoc") || '', + theme:editor.options.theme, + onclick:function () { + if (confirm(editor.getLang("confirmClear"))) { + editor.execCommand('cleardoc'); + } + } + }); + editorui.buttons["cleardoc"] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('cleardoc') == -1); + }); + return ui; + }; + + //排版,图片排版,文字方向 + var typeset = { + 'justify':['left', 'right', 'center', 'justify'], + 'imagefloat':['none', 'left', 'center', 'right'], + 'directionality':['ltr', 'rtl'] + }; + + for (var p in typeset) { + + (function (cmd, val) { + for (var i = 0, ci; ci = val[i++];) { + (function (cmd2) { + editorui[cmd.replace('float', '') + cmd2] = function (editor) { + var ui = new editorui.Button({ + className:'edui-for-' + cmd.replace('float', '') + cmd2, + title:editor.options.labelMap[cmd.replace('float', '') + cmd2] || editor.getLang("labelMap." + cmd.replace('float', '') + cmd2) || '', + theme:editor.options.theme, + onclick:function () { + editor.execCommand(cmd, cmd2); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + ui.setChecked(editor.queryCommandValue(cmd) == cmd2 && !uiReady); + }); + return ui; + }; + })(ci) + } + })(p, typeset[p]) + } + + //字体颜色和背景颜色 + for (var i = 0, ci; ci = ['backcolor', 'forecolor'][i++];) { + editorui[ci] = function (cmd) { + return function (editor) { + var ui = new editorui.ColorButton({ + className:'edui-for-' + cmd, + color:'default', + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || '', + editor:editor, + onpickcolor:function (t, color) { + editor.execCommand(cmd, color); + }, + onpicknocolor:function () { + editor.execCommand(cmd, 'default'); + this.setColor('transparent'); + this.color = 'default'; + }, + onbuttonclick:function () { + editor.execCommand(cmd, this.color); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1); + }); + return ui; + }; + }(ci); + } + + + var dialogBtns = { + noOk:['searchreplace', 'help', 'spechars', 'webapp','preview'], + ok:['attachment', 'anchor', 'link', 'insertimage', 'map', 'gmap', 'insertframe', 'wordimage', + 'insertvideo', 'insertframe', 'edittip', 'edittable', 'edittd', 'scrawl', 'template', 'music', 'background', 'charts'] + }; + + for (var p in dialogBtns) { + (function (type, vals) { + for (var i = 0, ci; ci = vals[i++];) { + //todo opera下存在问题 + if (browser.opera && ci === "searchreplace") { + continue; + } + (function (cmd) { + editorui[cmd] = function (editor, iframeUrl, title) { + iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]; + title = editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd) || ''; + + var dialog; + //没有iframeUrl不创建dialog + if (iframeUrl) { + dialog = new editorui.Dialog(utils.extend({ + iframeUrl:editor.ui.mapUrl(iframeUrl), + editor:editor, + className:'edui-for-' + cmd, + title:title, + holdScroll: cmd === 'insertimage', + fullscreen: /charts|preview/.test(cmd), + closeDialog:editor.getLang("closeDialog") + }, type == 'ok' ? { + buttons:[ + { + className:'edui-okbutton', + label:editor.getLang("ok"), + editor:editor, + onclick:function () { + dialog.close(true); + } + }, + { + className:'edui-cancelbutton', + label:editor.getLang("cancel"), + editor:editor, + onclick:function () { + dialog.close(false); + } + } + ] + } : {})); + + editor.ui._dialogs[cmd + "Dialog"] = dialog; + } + + var ui = new editorui.Button({ + className:'edui-for-' + cmd, + title:title, + onclick:function () { + if (dialog) { + switch (cmd) { + case "wordimage": + var images = editor.execCommand("wordimage"); + if (images && images.length) { + dialog.render(); + dialog.open(); + } + break; + case "scrawl": + if (editor.queryCommandState("scrawl") != -1) { + dialog.render(); + dialog.open(); + } + + break; + default: + dialog.render(); + dialog.open(); + } + } + }, + theme:editor.options.theme, + disabled:(cmd == 'scrawl' && editor.queryCommandState("scrawl") == -1) || ( cmd == 'charts' ) + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + //只存在于右键菜单而无工具栏按钮的ui不需要检测状态 + var unNeedCheckState = {'edittable':1}; + if (cmd in unNeedCheckState)return; + + var state = editor.queryCommandState(cmd); + if (ui.getDom()) { + ui.setDisabled(state == -1); + ui.setChecked(state); + } + + }); + + return ui; + }; + })(ci.toLowerCase()) + } + })(p, dialogBtns[p]); + } + + editorui.snapscreen = function (editor, iframeUrl, title) { + title = editor.options.labelMap['snapscreen'] || editor.getLang("labelMap.snapscreen") || ''; + var ui = new editorui.Button({ + className:'edui-for-snapscreen', + title:title, + onclick:function () { + editor.execCommand("snapscreen"); + }, + theme:editor.options.theme + + }); + editorui.buttons['snapscreen'] = ui; + iframeUrl = iframeUrl || (editor.options.iframeUrlMap || {})["snapscreen"] || iframeUrlMap["snapscreen"]; + if (iframeUrl) { + var dialog = new editorui.Dialog({ + iframeUrl:editor.ui.mapUrl(iframeUrl), + editor:editor, + className:'edui-for-snapscreen', + title:title, + buttons:[ + { + className:'edui-okbutton', + label:editor.getLang("ok"), + editor:editor, + onclick:function () { + dialog.close(true); + } + }, + { + className:'edui-cancelbutton', + label:editor.getLang("cancel"), + editor:editor, + onclick:function () { + dialog.close(false); + } + } + ] + + }); + dialog.render(); + editor.ui._dialogs["snapscreenDialog"] = dialog; + } + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('snapscreen') == -1); + }); + return ui; + }; + + editorui.insertcode = function (editor, list, title) { + list = editor.options['insertcode'] || []; + title = editor.options.labelMap['insertcode'] || editor.getLang("labelMap.insertcode") || ''; + // if (!list.length) return; + var items = []; + utils.each(list,function(key,val){ + items.push({ + label:key, + value:val, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
            ' + (this.label || '') + '
            '; + } + }); + }); + + var ui = new editorui.Combox({ + editor:editor, + items:items, + onselect:function (t, index) { + editor.execCommand('insertcode', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + title:title, + initValue:title, + className:'edui-for-insertcode', + indexByValue:function (value) { + if (value) { + for (var i = 0, ci; ci = this.items[i]; i++) { + if (ci.value.indexOf(value) != -1) + return i; + } + } + + return -1; + } + }); + editorui.buttons['insertcode'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('insertcode'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('insertcode'); + if(!value){ + ui.setValue(title); + return; + } + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + ui.setValue(value); + + } + } + + }); + return ui; + }; + editorui.fontfamily = function (editor, list, title) { + + list = editor.options['fontfamily'] || []; + title = editor.options.labelMap['fontfamily'] || editor.getLang("labelMap.fontfamily") || ''; + if (!list.length) return; + for (var i = 0, ci, items = []; ci = list[i]; i++) { + var langLabel = editor.getLang('fontfamily')[ci.name] || ""; + (function (key, val) { + items.push({ + label:key, + value:val, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
            ' + (this.label || '') + '
            '; + } + }); + })(ci.label || langLabel, ci.val) + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + onselect:function (t, index) { + editor.execCommand('FontFamily', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + title:title, + initValue:title, + className:'edui-for-fontfamily', + indexByValue:function (value) { + if (value) { + for (var i = 0, ci; ci = this.items[i]; i++) { + if (ci.value.indexOf(value) != -1) + return i; + } + } + + return -1; + } + }); + editorui.buttons['fontfamily'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('FontFamily'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('FontFamily'); + //trace:1871 ie下从源码模式切换回来时,字体会带单引号,而且会有逗号 + value && (value = value.replace(/['"]/g, '').split(',')[0]); + ui.setValue(value); + + } + } + + }); + return ui; + }; + + editorui.fontsize = function (editor, list, title) { + title = editor.options.labelMap['fontsize'] || editor.getLang("labelMap.fontsize") || ''; + list = list || editor.options['fontsize'] || []; + if (!list.length) return; + var items = []; + for (var i = 0; i < list.length; i++) { + var size = list[i] + 'px'; + items.push({ + label:size, + value:size, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
            ' + (this.label || '') + '
            '; + } + }); + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + onselect:function (t, index) { + editor.execCommand('FontSize', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + className:'edui-for-fontsize' + }); + editorui.buttons['fontsize'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('FontSize'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + ui.setValue(editor.queryCommandValue('FontSize')); + } + } + + }); + return ui; + }; + + editorui.paragraph = function (editor, list, title) { + title = editor.options.labelMap['paragraph'] || editor.getLang("labelMap.paragraph") || ''; + list = editor.options['paragraph'] || []; + if (utils.isEmptyObject(list)) return; + var items = []; + for (var i in list) { + items.push({ + value:i, + label:list[i] || editor.getLang("paragraph")[i], + theme:editor.options.theme, + renderLabelHtml:function () { + return '
            ' + (this.label || '') + '
            '; + } + }) + } + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + className:'edui-for-paragraph', + onselect:function (t, index) { + editor.execCommand('Paragraph', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + } + }); + editorui.buttons['paragraph'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('Paragraph'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('Paragraph'); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + + }); + return ui; + }; + + + //自定义标题 + editorui.customstyle = function (editor) { + var list = editor.options['customstyle'] || [], + title = editor.options.labelMap['customstyle'] || editor.getLang("labelMap.customstyle") || ''; + if (!list.length)return; + var langCs = editor.getLang('customstyle'); + for (var i = 0, items = [], t; t = list[i++];) { + (function (t) { + var ck = {}; + ck.label = t.label ? t.label : langCs[t.name]; + ck.style = t.style; + ck.className = t.className; + ck.tag = t.tag; + items.push({ + label:ck.label, + value:ck, + theme:editor.options.theme, + renderLabelHtml:function () { + return '
            ' + '<' + ck.tag + ' ' + (ck.className ? ' class="' + ck.className + '"' : "") + + (ck.style ? ' style="' + ck.style + '"' : "") + '>' + ck.label + "<\/" + ck.tag + ">" + + '
            '; + } + }); + })(t); + } + + var ui = new editorui.Combox({ + editor:editor, + items:items, + title:title, + initValue:title, + className:'edui-for-customstyle', + onselect:function (t, index) { + editor.execCommand('customstyle', this.items[index].value); + }, + onbuttonclick:function () { + this.showPopup(); + }, + indexByValue:function (value) { + for (var i = 0, ti; ti = this.items[i++];) { + if (ti.label == value) { + return i - 1 + } + } + return -1; + } + }); + editorui.buttons['customstyle'] = ui; + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + if (!uiReady) { + var state = editor.queryCommandState('customstyle'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('customstyle'); + var index = ui.indexByValue(value); + if (index != -1) { + ui.setValue(value); + } else { + ui.setValue(ui.initValue); + } + } + } + + }); + return ui; + }; + editorui.inserttable = function (editor, iframeUrl, title) { + title = editor.options.labelMap['inserttable'] || editor.getLang("labelMap.inserttable") || ''; + var ui = new editorui.TableButton({ + editor:editor, + title:title, + className:'edui-for-inserttable', + onpicktable:function (t, numCols, numRows) { + editor.execCommand('InsertTable', {numRows:numRows, numCols:numCols, border:1}); + }, + onbuttonclick:function () { + this.showPopup(); + } + }); + editorui.buttons['inserttable'] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('inserttable') == -1); + }); + return ui; + }; + + editorui.lineheight = function (editor) { + var val = editor.options.lineheight || []; + if (!val.length)return; + for (var i = 0, ci, items = []; ci = val[i++];) { + items.push({ + //todo:写死了 + label:ci, + value:ci, + theme:editor.options.theme, + onclick:function () { + editor.execCommand("lineheight", this.value); + } + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-lineheight', + title:editor.options.labelMap['lineheight'] || editor.getLang("labelMap.lineheight") || '', + items:items, + onbuttonclick:function () { + var value = editor.queryCommandValue('LineHeight') || this.value; + editor.execCommand("LineHeight", value); + } + }); + editorui.buttons['lineheight'] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('LineHeight'); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('LineHeight'); + value && ui.setValue((value + '').replace(/cm/, '')); + ui.setChecked(state) + } + }); + return ui; + }; + + var rowspacings = ['top', 'bottom']; + for (var r = 0, ri; ri = rowspacings[r++];) { + (function (cmd) { + editorui['rowspacing' + cmd] = function (editor) { + var val = editor.options['rowspacing' + cmd] || []; + if (!val.length) return null; + for (var i = 0, ci, items = []; ci = val[i++];) { + items.push({ + label:ci, + value:ci, + theme:editor.options.theme, + onclick:function () { + editor.execCommand("rowspacing", this.value, cmd); + } + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-rowspacing' + cmd, + title:editor.options.labelMap['rowspacing' + cmd] || editor.getLang("labelMap.rowspacing" + cmd) || '', + items:items, + onbuttonclick:function () { + var value = editor.queryCommandValue('rowspacing', cmd) || this.value; + editor.execCommand("rowspacing", value, cmd); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('rowspacing', cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue('rowspacing', cmd); + value && ui.setValue((value + '').replace(/%/, '')); + ui.setChecked(state) + } + }); + return ui; + } + })(ri) + } + //有序,无序列表 + var lists = ['insertorderedlist', 'insertunorderedlist']; + for (var l = 0, cl; cl = lists[l++];) { + (function (cmd) { + editorui[cmd] = function (editor) { + var vals = editor.options[cmd], + _onMenuClick = function () { + editor.execCommand(cmd, this.value); + }, items = []; + for (var i in vals) { + items.push({ + label:vals[i] || editor.getLang()[cmd][i] || "", + value:i, + theme:editor.options.theme, + onclick:_onMenuClick + }) + } + var ui = new editorui.MenuButton({ + editor:editor, + className:'edui-for-' + cmd, + title:editor.getLang("labelMap." + cmd) || '', + 'items':items, + onbuttonclick:function () { + var value = editor.queryCommandValue(cmd) || this.value; + editor.execCommand(cmd, value); + } + }); + editorui.buttons[cmd] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState(cmd); + if (state == -1) { + ui.setDisabled(true); + } else { + ui.setDisabled(false); + var value = editor.queryCommandValue(cmd); + ui.setValue(value); + ui.setChecked(state) + } + }); + return ui; + }; + })(cl) + } + + editorui.fullscreen = function (editor, title) { + title = editor.options.labelMap['fullscreen'] || editor.getLang("labelMap.fullscreen") || ''; + var ui = new editorui.Button({ + className:'edui-for-fullscreen', + title:title, + theme:editor.options.theme, + onclick:function () { + if (editor.ui) { + editor.ui.setFullScreen(!editor.ui.isFullScreen()); + } + this.setChecked(editor.ui.isFullScreen()); + } + }); + editorui.buttons['fullscreen'] = ui; + editor.addListener('selectionchange', function () { + var state = editor.queryCommandState('fullscreen'); + ui.setDisabled(state == -1); + ui.setChecked(editor.ui.isFullScreen()); + }); + return ui; + }; + + // 表情 + editorui["emotion"] = function (editor, iframeUrl) { + var cmd = "emotion"; + var ui = new editorui.MultiMenuPop({ + title:editor.options.labelMap[cmd] || editor.getLang("labelMap." + cmd + "") || '', + editor:editor, + className:'edui-for-' + cmd, + iframeUrl:editor.ui.mapUrl(iframeUrl || (editor.options.iframeUrlMap || {})[cmd] || iframeUrlMap[cmd]) + }); + editorui.buttons[cmd] = ui; + + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState(cmd) == -1) + }); + return ui; + }; + + editorui.autotypeset = function (editor) { + var ui = new editorui.AutoTypeSetButton({ + editor:editor, + title:editor.options.labelMap['autotypeset'] || editor.getLang("labelMap.autotypeset") || '', + className:'edui-for-autotypeset', + onbuttonclick:function () { + editor.execCommand('autotypeset') + } + }); + editorui.buttons['autotypeset'] = ui; + editor.addListener('selectionchange', function () { + ui.setDisabled(editor.queryCommandState('autotypeset') == -1); + }); + return ui; + }; + + /* 简单上传插件 */ + editorui["simpleupload"] = function (editor) { + var name = 'simpleupload', + ui = new editorui.Button({ + className:'edui-for-' + name, + title:editor.options.labelMap[name] || editor.getLang("labelMap." + name) || '', + onclick:function () {}, + theme:editor.options.theme, + showText:false + }); + editorui.buttons[name] = ui; + editor.addListener('ready', function() { + var b = ui.getDom('body'), + iconSpan = b.children[0]; + editor.fireEvent('simpleuploadbtnready', iconSpan); + }); + editor.addListener('selectionchange', function (type, causeByUi, uiReady) { + var state = editor.queryCommandState(name); + if (state == -1) { + ui.setDisabled(true); + ui.setChecked(false); + } else { + if (!uiReady) { + ui.setDisabled(false); + ui.setChecked(state); + } + } + }); + return ui; + }; + +})(); + + +// adapter/editor.js +///import core +///commands 全屏 +///commandsName FullScreen +///commandsTitle 全屏 +(function () { + var utils = baidu.editor.utils, + uiUtils = baidu.editor.ui.uiUtils, + UIBase = baidu.editor.ui.UIBase, + domUtils = baidu.editor.dom.domUtils; + var nodeStack = []; + + function EditorUI(options) { + this.initOptions(options); + this.initEditorUI(); + } + + EditorUI.prototype = { + uiName:'editor', + initEditorUI:function () { + this.editor.ui = this; + this._dialogs = {}; + this.initUIBase(); + this._initToolbars(); + var editor = this.editor, + me = this; + + editor.addListener('ready', function () { + //提供getDialog方法 + editor.getDialog = function (name) { + return editor.ui._dialogs[name + "Dialog"]; + }; + domUtils.on(editor.window, 'scroll', function (evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + //提供编辑器实时宽高(全屏时宽高不变化) + editor.ui._actualFrameWidth = editor.options.initialFrameWidth; + + UE.browser.ie && UE.browser.version === 6 && editor.container.ownerDocument.execCommand("BackgroundImageCache", false, true); + + //display bottom-bar label based on config + if (editor.options.elementPathEnabled) { + editor.ui.getDom('elementpath').innerHTML = '
            ' + editor.getLang("elementPathTip") + ':
            '; + } + if (editor.options.wordCount) { + function countFn() { + setCount(editor,me); + domUtils.un(editor.document, "click", arguments.callee); + } + domUtils.on(editor.document, "click", countFn); + editor.ui.getDom('wordcount').innerHTML = editor.getLang("wordCountTip"); + } + editor.ui._scale(); + if (editor.options.scaleEnabled) { + if (editor.autoHeightEnabled) { + editor.disableAutoHeight(); + } + me.enableScale(); + } else { + me.disableScale(); + } + if (!editor.options.elementPathEnabled && !editor.options.wordCount && !editor.options.scaleEnabled) { + editor.ui.getDom('elementpath').style.display = "none"; + editor.ui.getDom('wordcount').style.display = "none"; + editor.ui.getDom('scale').style.display = "none"; + } + + if (!editor.selection.isFocus())return; + editor.fireEvent('selectionchange', false, true); + + + }); + + editor.addListener('mousedown', function (t, evt) { + var el = evt.target || evt.srcElement; + baidu.editor.ui.Popup.postHide(evt, el); + baidu.editor.ui.ShortCutMenu.postHide(evt); + + }); + editor.addListener("delcells", function () { + if (UE.ui['edittip']) { + new UE.ui['edittip'](editor); + } + editor.getDialog('edittip').open(); + }); + + var pastePop, isPaste = false, timer; + editor.addListener("afterpaste", function () { + if(editor.queryCommandState('pasteplain')) + return; + if(baidu.editor.ui.PastePicker){ + pastePop = new baidu.editor.ui.Popup({ + content:new baidu.editor.ui.PastePicker({editor:editor}), + editor:editor, + className:'edui-wordpastepop' + }); + pastePop.render(); + } + isPaste = true; + }); + + editor.addListener("afterinserthtml", function () { + clearTimeout(timer); + timer = setTimeout(function () { + if (pastePop && (isPaste || editor.ui._isTransfer)) { + if(pastePop.isHidden()){ + var span = domUtils.createElement(editor.document, 'span', { + 'style':"line-height:0px;", + 'innerHTML':'\ufeff' + }), + range = editor.selection.getRange(); + range.insertNode(span); + var tmp= getDomNode(span, 'firstChild', 'previousSibling'); + tmp && pastePop.showAnchor(tmp.nodeType == 3 ? tmp.parentNode : tmp); + domUtils.remove(span); + }else{ + pastePop.show(); + } + delete editor.ui._isTransfer; + isPaste = false; + } + }, 200) + }); + editor.addListener('contextmenu', function (t, evt) { + baidu.editor.ui.Popup.postHide(evt); + }); + editor.addListener('keydown', function (t, evt) { + if (pastePop) pastePop.dispose(evt); + var keyCode = evt.keyCode || evt.which; + if(evt.altKey&&keyCode==90){ + UE.ui.buttons['fullscreen'].onclick(); + } + }); + editor.addListener('wordcount', function (type) { + setCount(this,me); + }); + function setCount(editor,ui) { + editor.setOpt({ + wordCount:true, + maximumWords:10000, + wordCountMsg:editor.options.wordCountMsg || editor.getLang("wordCountMsg"), + wordOverFlowMsg:editor.options.wordOverFlowMsg || editor.getLang("wordOverFlowMsg") + }); + var opt = editor.options, + max = opt.maximumWords, + msg = opt.wordCountMsg , + errMsg = opt.wordOverFlowMsg, + countDom = ui.getDom('wordcount'); + if (!opt.wordCount) { + return; + } + var count = editor.getContentLength(true); + if (count > max) { + countDom.innerHTML = errMsg; + editor.fireEvent("wordcountoverflow"); + } else { + countDom.innerHTML = msg.replace("{#leave}", max - count).replace("{#count}", count); + } + } + + editor.addListener('selectionchange', function () { + if (editor.options.elementPathEnabled) { + me[(editor.queryCommandState('elementpath') == -1 ? 'dis' : 'en') + 'ableElementPath']() + } + if (editor.options.scaleEnabled) { + me[(editor.queryCommandState('scale') == -1 ? 'dis' : 'en') + 'ableScale'](); + + } + }); + var popup = new baidu.editor.ui.Popup({ + editor:editor, + content:'', + className:'edui-bubble', + _onEditButtonClick:function () { + this.hide(); + editor.ui._dialogs.linkDialog.open(); + }, + _onImgEditButtonClick:function (name) { + this.hide(); + editor.ui._dialogs[name] && editor.ui._dialogs[name].open(); + + }, + _onImgSetFloat:function (value) { + this.hide(); + editor.execCommand("imagefloat", value); + + }, + _setIframeAlign:function (value) { + var frame = popup.anchorEl; + var newFrame = frame.cloneNode(true); + switch (value) { + case -2: + newFrame.setAttribute("align", ""); + break; + case -1: + newFrame.setAttribute("align", "left"); + break; + case 1: + newFrame.setAttribute("align", "right"); + break; + } + frame.parentNode.insertBefore(newFrame, frame); + domUtils.remove(frame); + popup.anchorEl = newFrame; + popup.showAnchor(popup.anchorEl); + }, + _updateIframe:function () { + var frame = editor._iframe = popup.anchorEl; + if(domUtils.hasClass(frame, 'ueditor_baidumap')) { + editor.selection.getRange().selectNode(frame).select(); + editor.ui._dialogs.mapDialog.open(); + popup.hide(); + } else { + editor.ui._dialogs.insertframeDialog.open(); + popup.hide(); + } + }, + _onRemoveButtonClick:function (cmdName) { + editor.execCommand(cmdName); + this.hide(); + }, + queryAutoHide:function (el) { + if (el && el.ownerDocument == editor.document) { + if (el.tagName.toLowerCase() == 'img' || domUtils.findParentByTagName(el, 'a', true)) { + return el !== popup.anchorEl; + } + } + return baidu.editor.ui.Popup.prototype.queryAutoHide.call(this, el); + } + }); + popup.render(); + if (editor.options.imagePopup) { + editor.addListener('mouseover', function (t, evt) { + evt = evt || window.event; + var el = evt.target || evt.srcElement; + if (editor.ui._dialogs.insertframeDialog && /iframe/ig.test(el.tagName)) { + var html = popup.formatHtml( + '' + editor.getLang("property") + ': ' + editor.getLang("default") + '  ' + editor.getLang("justifyleft") + '  ' + editor.getLang("justifyright") + '  ' + + ' ' + editor.getLang("modify") + ''); + if (html) { + popup.getDom('content').innerHTML = html; + popup.anchorEl = el; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + } + }); + editor.addListener('selectionchange', function (t, causeByUi) { + if (!causeByUi) return; + var html = '', str = "", + img = editor.selection.getRange().getClosedNode(), + dialogs = editor.ui._dialogs; + if (img && img.tagName == 'IMG') { + var dialogName = 'insertimageDialog'; + if (img.className.indexOf("edui-faked-video") != -1 || img.className.indexOf("edui-upload-video") != -1) { + dialogName = "insertvideoDialog" + } + if (img.className.indexOf("edui-faked-webapp") != -1) { + dialogName = "webappDialog" + } + if (img.src.indexOf("http://api.map.baidu.com") != -1) { + dialogName = "mapDialog" + } + if (img.className.indexOf("edui-faked-music") != -1) { + dialogName = "musicDialog" + } + if (img.src.indexOf("http://maps.google.com/maps/api/staticmap") != -1) { + dialogName = "gmapDialog" + } + if (img.getAttribute("anchorname")) { + dialogName = "anchorDialog"; + html = popup.formatHtml( + '' + editor.getLang("property") + ': ' + editor.getLang("modify") + '  ' + + '' + editor.getLang("delete") + ''); + } + if (img.getAttribute("word_img")) { + //todo 放到dialog去做查询 + editor.word_img = [img.getAttribute("word_img")]; + dialogName = "wordimageDialog" + } + if(domUtils.hasClass(img, 'loadingclass') || domUtils.hasClass(img, 'loaderrorclass')) { + dialogName = ""; + } + if (!dialogs[dialogName]) { + return; + } + str = '' + editor.getLang("property") + ': '+ + '' + editor.getLang("default") + '  ' + + '' + editor.getLang("justifyleft") + '  ' + + '' + editor.getLang("justifyright") + '  ' + + '' + editor.getLang("justifycenter") + '  '+ + '' + editor.getLang("modify") + ''; + + !html && (html = popup.formatHtml(str)) + + } + if (editor.ui._dialogs.linkDialog) { + var link = editor.queryCommandValue('link'); + var url; + if (link && (url = (link.getAttribute('_href') || link.getAttribute('href', 2)))) { + var txt = url; + if (url.length > 30) { + txt = url.substring(0, 20) + "..."; + } + if (html) { + html += '
            ' + } + html += popup.formatHtml( + '' + editor.getLang("anthorMsg") + ': ' + txt + '' + + ' ' + editor.getLang("modify") + '' + + ' ' + editor.getLang("clear") + ''); + popup.showAnchor(link); + } + } + + if (html) { + popup.getDom('content').innerHTML = html; + popup.anchorEl = img || link; + popup.showAnchor(popup.anchorEl); + } else { + popup.hide(); + } + }); + } + + }, + _initToolbars:function () { + var editor = this.editor; + var toolbars = this.toolbars || []; + var toolbarUis = []; + for (var i = 0; i < toolbars.length; i++) { + var toolbar = toolbars[i]; + var toolbarUi = new baidu.editor.ui.Toolbar({theme:editor.options.theme}); + for (var j = 0; j < toolbar.length; j++) { + var toolbarItem = toolbar[j]; + var toolbarItemUi = null; + if (typeof toolbarItem == 'string') { + toolbarItem = toolbarItem.toLowerCase(); + if (toolbarItem == '|') { + toolbarItem = 'Separator'; + } + if(toolbarItem == '||'){ + toolbarItem = 'Breakline'; + } + if (baidu.editor.ui[toolbarItem]) { + toolbarItemUi = new baidu.editor.ui[toolbarItem](editor); + } + + //fullscreen这里单独处理一下,放到首行去 + if (toolbarItem == 'fullscreen') { + if (toolbarUis && toolbarUis[0]) { + toolbarUis[0].items.splice(0, 0, toolbarItemUi); + } else { + toolbarItemUi && toolbarUi.items.splice(0, 0, toolbarItemUi); + } + + continue; + + + } + } else { + toolbarItemUi = toolbarItem; + } + if (toolbarItemUi && toolbarItemUi.id) { + + toolbarUi.add(toolbarItemUi); + } + } + toolbarUis[i] = toolbarUi; + } + + //接受外部定制的UI + + utils.each(UE._customizeUI,function(obj,key){ + var itemUI,index; + if(obj.id && obj.id != editor.key){ + return false; + } + itemUI = obj.execFn.call(editor,editor,key); + if(itemUI){ + index = obj.index; + if(index === undefined){ + index = toolbarUi.items.length; + } + toolbarUi.add(itemUI,index) + } + }); + + this.toolbars = toolbarUis; + }, + getHtmlTpl:function () { + return '
            ' + + '
            ' + + (this.toolbars.length ? + '
            ' + + this.renderToolbarBoxHtml() + + '
            ' : '') + + '' + + '
            ' + + '
            ' + + '
            ' + + '
            ' + + //modify wdcount by matao + '
            ' + + '' + + '' + + '' + + '
            ' + + '
            ' + + '
            '; + }, + showWordImageDialog:function () { + this._dialogs['wordimageDialog'].open(); + }, + renderToolbarBoxHtml:function () { + var buff = []; + for (var i = 0; i < this.toolbars.length; i++) { + buff.push(this.toolbars[i].renderHtml()); + } + return buff.join(''); + }, + setFullScreen:function (fullscreen) { + + var editor = this.editor, + container = editor.container.parentNode.parentNode; + if (this._fullscreen != fullscreen) { + this._fullscreen = fullscreen; + this.editor.fireEvent('beforefullscreenchange', fullscreen); + if (baidu.editor.browser.gecko) { + var bk = editor.selection.getRange().createBookmark(); + } + if (fullscreen) { + while (container.tagName != "BODY") { + var position = baidu.editor.dom.domUtils.getComputedStyle(container, "position"); + nodeStack.push(position); + container.style.position = "static"; + container = container.parentNode; + } + this._bakHtmlOverflow = document.documentElement.style.overflow; + this._bakBodyOverflow = document.body.style.overflow; + this._bakAutoHeight = this.editor.autoHeightEnabled; + this._bakScrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop); + + this._bakEditorContaninerWidth = editor.iframe.parentNode.offsetWidth; + if (this._bakAutoHeight) { + //当全屏时不能执行自动长高 + editor.autoHeightEnabled = false; + this.editor.disableAutoHeight(); + } + + document.documentElement.style.overflow = 'hidden'; + //修复,滚动条不收起的问题 + + window.scrollTo(0,window.scrollY); + this._bakCssText = this.getDom().style.cssText; + this._bakCssText1 = this.getDom('iframeholder').style.cssText; + editor.iframe.parentNode.style.width = ''; + this._updateFullScreen(); + } else { + while (container.tagName != "BODY") { + container.style.position = nodeStack.shift(); + container = container.parentNode; + } + this.getDom().style.cssText = this._bakCssText; + this.getDom('iframeholder').style.cssText = this._bakCssText1; + if (this._bakAutoHeight) { + editor.autoHeightEnabled = true; + this.editor.enableAutoHeight(); + } + + document.documentElement.style.overflow = this._bakHtmlOverflow; + document.body.style.overflow = this._bakBodyOverflow; + editor.iframe.parentNode.style.width = this._bakEditorContaninerWidth + 'px'; + window.scrollTo(0, this._bakScrollTop); + } + if (browser.gecko && editor.body.contentEditable === 'true') { + var input = document.createElement('input'); + document.body.appendChild(input); + editor.body.contentEditable = false; + setTimeout(function () { + input.focus(); + setTimeout(function () { + editor.body.contentEditable = true; + editor.fireEvent('fullscreenchanged', fullscreen); + editor.selection.getRange().moveToBookmark(bk).select(true); + baidu.editor.dom.domUtils.remove(input); + fullscreen && window.scroll(0, 0); + }, 0) + }, 0) + } + + if(editor.body.contentEditable === 'true'){ + this.editor.fireEvent('fullscreenchanged', fullscreen); + this.triggerLayout(); + } + + } + }, + _updateFullScreen:function () { + if (this._fullscreen) { + var vpRect = uiUtils.getViewportRect(); + this.getDom().style.cssText = 'border:0;position:absolute;left:0;top:' + (this.editor.options.topOffset || 0) + 'px;width:' + vpRect.width + 'px;height:' + vpRect.height + 'px;z-index:' + (this.getDom().style.zIndex * 1 + 100); + uiUtils.setViewportOffset(this.getDom(), { left:0, top:this.editor.options.topOffset || 0 }); + this.editor.setHeight(vpRect.height - this.getDom('toolbarbox').offsetHeight - this.getDom('bottombar').offsetHeight - (this.editor.options.topOffset || 0),true); + //不手动调一下,会导致全屏失效 + if(browser.gecko){ + try{ + window.onresize(); + }catch(e){ + + } + + } + } + }, + _updateElementPath:function () { + var bottom = this.getDom('elementpath'), list; + if (this.elementPathEnabled && (list = this.editor.queryCommandValue('elementpath'))) { + + var buff = []; + for (var i = 0, ci; ci = list[i]; i++) { + buff[i] = this.formatHtml('' + ci + ''); + } + bottom.innerHTML = '
            ' + this.editor.getLang("elementPathTip") + ': ' + buff.join(' > ') + '
            '; + + } else { + bottom.style.display = 'none' + } + }, + disableElementPath:function () { + var bottom = this.getDom('elementpath'); + bottom.innerHTML = ''; + bottom.style.display = 'none'; + this.elementPathEnabled = false; + + }, + enableElementPath:function () { + var bottom = this.getDom('elementpath'); + bottom.style.display = ''; + this.elementPathEnabled = true; + this._updateElementPath(); + }, + _scale:function () { + var doc = document, + editor = this.editor, + editorHolder = editor.container, + editorDocument = editor.document, + toolbarBox = this.getDom("toolbarbox"), + bottombar = this.getDom("bottombar"), + scale = this.getDom("scale"), + scalelayer = this.getDom("scalelayer"); + + var isMouseMove = false, + position = null, + minEditorHeight = 0, + minEditorWidth = editor.options.minFrameWidth, + pageX = 0, + pageY = 0, + scaleWidth = 0, + scaleHeight = 0; + + function down() { + position = domUtils.getXY(editorHolder); + + if (!minEditorHeight) { + minEditorHeight = editor.options.minFrameHeight + toolbarBox.offsetHeight + bottombar.offsetHeight; + } + + scalelayer.style.cssText = "position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:" + editorHolder.offsetWidth + "px;height:" + + editorHolder.offsetHeight + "px;z-index:" + (editor.options.zIndex + 1); + + domUtils.on(doc, "mousemove", move); + domUtils.on(editorDocument, "mouseup", up); + domUtils.on(doc, "mouseup", up); + } + + var me = this; + //by xuheng 全屏时关掉缩放 + this.editor.addListener('fullscreenchanged', function (e, fullScreen) { + if (fullScreen) { + me.disableScale(); + + } else { + if (me.editor.options.scaleEnabled) { + me.enableScale(); + var tmpNode = me.editor.document.createElement('span'); + me.editor.body.appendChild(tmpNode); + me.editor.body.style.height = Math.max(domUtils.getXY(tmpNode).y, me.editor.iframe.offsetHeight - 20) + 'px'; + domUtils.remove(tmpNode) + } + } + }); + function move(event) { + clearSelection(); + var e = event || window.event; + pageX = e.pageX || (doc.documentElement.scrollLeft + e.clientX); + pageY = e.pageY || (doc.documentElement.scrollTop + e.clientY); + scaleWidth = pageX - position.x; + scaleHeight = pageY - position.y; + + if (scaleWidth >= minEditorWidth) { + isMouseMove = true; + scalelayer.style.width = scaleWidth + 'px'; + } + if (scaleHeight >= minEditorHeight) { + isMouseMove = true; + scalelayer.style.height = scaleHeight + "px"; + } + } + + function up() { + if (isMouseMove) { + isMouseMove = false; + editor.ui._actualFrameWidth = scalelayer.offsetWidth - 2; + editorHolder.style.width = editor.ui._actualFrameWidth + 'px'; + + editor.setHeight(scalelayer.offsetHeight - bottombar.offsetHeight - toolbarBox.offsetHeight - 2,true); + } + if (scalelayer) { + scalelayer.style.display = "none"; + } + clearSelection(); + domUtils.un(doc, "mousemove", move); + domUtils.un(editorDocument, "mouseup", up); + domUtils.un(doc, "mouseup", up); + } + + function clearSelection() { + if (browser.ie) + doc.selection.clear(); + else + window.getSelection().removeAllRanges(); + } + + this.enableScale = function () { + //trace:2868 + if (editor.queryCommandState("source") == 1) return; + scale.style.display = ""; + this.scaleEnabled = true; + domUtils.on(scale, "mousedown", down); + }; + this.disableScale = function () { + scale.style.display = "none"; + this.scaleEnabled = false; + domUtils.un(scale, "mousedown", down); + }; + }, + isFullScreen:function () { + return this._fullscreen; + }, + postRender:function () { + UIBase.prototype.postRender.call(this); + for (var i = 0; i < this.toolbars.length; i++) { + this.toolbars[i].postRender(); + } + var me = this; + var timerId, + domUtils = baidu.editor.dom.domUtils, + updateFullScreenTime = function () { + clearTimeout(timerId); + timerId = setTimeout(function () { + me._updateFullScreen(); + }); + }; + domUtils.on(window, 'resize', updateFullScreenTime); + + me.addListener('destroy', function () { + domUtils.un(window, 'resize', updateFullScreenTime); + clearTimeout(timerId); + }) + }, + showToolbarMsg:function (msg, flag) { + this.getDom('toolbarmsg_label').innerHTML = msg; + this.getDom('toolbarmsg').style.display = ''; + // + if (!flag) { + var w = this.getDom('upload_dialog'); + w.style.display = 'none'; + } + }, + hideToolbarMsg:function () { + this.getDom('toolbarmsg').style.display = 'none'; + }, + mapUrl:function (url) { + return url ? url.replace('~/', this.editor.options.UEDITOR_HOME_URL || '') : '' + }, + triggerLayout:function () { + var dom = this.getDom(); + if (dom.style.zoom == '1') { + dom.style.zoom = '100%'; + } else { + dom.style.zoom = '1'; + } + } + }; + utils.inherits(EditorUI, baidu.editor.ui.UIBase); + + + var instances = {}; + + + UE.ui.Editor = function (options) { + var editor = new UE.Editor(options); + editor.options.editor = editor; + utils.loadFile(document, { + href:editor.options.themePath + editor.options.theme + "/css/ueditor.css", + tag:"link", + type:"text/css", + rel:"stylesheet" + }); + + var oldRender = editor.render; + editor.render = function (holder) { + if (holder.constructor === String) { + editor.key = holder; + instances[holder] = editor; + } + utils.domReady(function () { + editor.langIsReady ? renderUI() : editor.addListener("langReady", renderUI); + function renderUI() { + editor.setOpt({ + labelMap:editor.options.labelMap || editor.getLang('labelMap') + }); + new EditorUI(editor.options); + if (holder) { + if (holder.constructor === String) { + holder = document.getElementById(holder); + } + holder && holder.getAttribute('name') && ( editor.options.textarea = holder.getAttribute('name')); + if (holder && /script|textarea/ig.test(holder.tagName)) { + var newDiv = document.createElement('div'); + holder.parentNode.insertBefore(newDiv, holder); + var cont = holder.value || holder.innerHTML; + editor.options.initialContent = /^[\t\r\n ]*$/.test(cont) ? editor.options.initialContent : + cont.replace(/>[\n\r\t]+([ ]{4})+/g, '>') + .replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<'); + holder.className && (newDiv.className = holder.className); + holder.style.cssText && (newDiv.style.cssText = holder.style.cssText); + if (/textarea/i.test(holder.tagName)) { + editor.textarea = holder; + editor.textarea.style.display = 'none'; + + + } else { + holder.parentNode.removeChild(holder); + + + } + if(holder.id){ + newDiv.id = holder.id; + domUtils.removeAttributes(holder,'id'); + } + holder = newDiv; + holder.innerHTML = ''; + } + + } + domUtils.addClass(holder, "edui-" + editor.options.theme); + editor.ui.render(holder); + var opt = editor.options; + //给实例添加一个编辑器的容器引用 + editor.container = editor.ui.getDom(); + var parents = domUtils.findParents(holder,true); + var displays = []; + for(var i = 0 ,ci;ci=parents[i];i++){ + displays[i] = ci.style.display; + ci.style.display = 'block' + } + if (opt.initialFrameWidth) { + opt.minFrameWidth = opt.initialFrameWidth; + } else { + opt.minFrameWidth = opt.initialFrameWidth = holder.offsetWidth; + var styleWidth = holder.style.width; + if(/%$/.test(styleWidth)) { + opt.initialFrameWidth = styleWidth; + } + } + if (opt.initialFrameHeight) { + opt.minFrameHeight = opt.initialFrameHeight; + } else { + opt.initialFrameHeight = opt.minFrameHeight = holder.offsetHeight; + } + for(var i = 0 ,ci;ci=parents[i];i++){ + ci.style.display = displays[i] + } + //编辑器最外容器设置了高度,会导致,编辑器不占位 + //todo 先去掉,没有找到原因 + if(holder.style.height){ + holder.style.height = '' + } + editor.container.style.width = opt.initialFrameWidth + (/%$/.test(opt.initialFrameWidth) ? '' : 'px'); + editor.container.style.zIndex = opt.zIndex; + oldRender.call(editor, editor.ui.getDom('iframeholder')); + editor.fireEvent("afteruiready"); + } + }) + }; + return editor; + }; + + + /** + * @file + * @name UE + * @short UE + * @desc UEditor的顶部命名空间 + */ + /** + * @name getEditor + * @since 1.2.4+ + * @grammar UE.getEditor(id,[opt]) => Editor实例 + * @desc 提供一个全局的方法得到编辑器实例 + * + * * ''id'' 放置编辑器的容器id, 如果容器下的编辑器已经存在,就直接返回 + * * ''opt'' 编辑器的可选参数 + * @example + * UE.getEditor('containerId',{onready:function(){//创建一个编辑器实例 + * this.setContent('hello') + * }}); + * UE.getEditor('containerId'); //返回刚创建的实例 + * + */ + UE.getEditor = function (id, opt) { + var editor = instances[id]; + if (!editor) { + editor = instances[id] = new UE.ui.Editor(opt); + editor.render(id); + } + return editor; + }; + + + UE.delEditor = function (id) { + var editor; + if (editor = instances[id]) { + editor.key && editor.destroy(); + delete instances[id] + } + }; + + UE.registerUI = function(uiName,fn,index,editorId){ + utils.each(uiName.split(/\s+/), function (name) { + UE._customizeUI[name] = { + id : editorId, + execFn:fn, + index:index + }; + }) + + } + +})(); + +// adapter/message.js +UE.registerUI('message', function(editor) { + + var editorui = baidu.editor.ui; + var Message = editorui.Message; + var holder; + var _messageItems = []; + var me = editor; + + me.addListener('ready', function(){ + holder = document.getElementById(me.ui.id + '_message_holder'); + updateHolderPos(); + setTimeout(function(){ + updateHolderPos(); + }, 500); + }); + + me.addListener('showmessage', function(type, opt){ + opt = utils.isString(opt) ? { + 'content': opt + } : opt; + var message = new Message({ + 'timeout': opt.timeout, + 'type': opt.type, + 'content': opt.content, + 'keepshow': opt.keepshow, + 'editor': me + }), + mid = opt.id || ('msg_' + (+new Date()).toString(36)); + message.render(holder); + _messageItems[mid] = message; + message.reset(opt); + updateHolderPos(); + return mid; + }); + + me.addListener('updatemessage',function(type, id, opt){ + opt = utils.isString(opt) ? { + 'content': opt + } : opt; + var message = _messageItems[id]; + message.render(holder); + message && message.reset(opt); + }); + + me.addListener('hidemessage',function(type, id){ + var message = _messageItems[id]; + message && message.hide(); + }); + + function updateHolderPos(){ + var toolbarbox = me.ui.getDom('toolbarbox'); + if (toolbarbox) { + holder.style.top = toolbarbox.offsetHeight + 3 + 'px'; + } + holder.style.zIndex = Math.max(me.options.zIndex, me.iframe.style.zIndex) + 1; + } + +}); + + +// adapter/autosave.js +UE.registerUI('autosave', function(editor) { + var timer = null,uid = null; + editor.on('afterautosave',function(){ + clearTimeout(timer); + + timer = setTimeout(function(){ + if(uid){ + editor.trigger('hidemessage',uid); + } + uid = editor.trigger('showmessage',{ + content : editor.getLang('autosave.success'), + timeout : 2000 + }); + + },2000) + }) + +}); + + + +})(); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.all.min.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.all.min.js new file mode 100644 index 0000000..b357d50 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.all.min.js @@ -0,0 +1,18 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:16 GMT+0800 (CST) + */ + +!function(){function getListener(a,b,c){var d;return b=b.toLowerCase(),(d=a.__allListeners||c&&(a.__allListeners={}))&&(d[b]||c&&(d[b]=[]))}function getDomNode(a,b,c,d,e,f){var g,h=d&&a[b];for(!h&&(h=a[c]);!h&&(g=(g||a).parentNode);){if("BODY"==g.tagName||f&&!f(g))return null;h=g[c]}return h&&e&&!e(h)?getDomNode(h,b,c,!1,e):h}UEDITOR_CONFIG=window.UEDITOR_CONFIG||{};var baidu=window.baidu||{};window.baidu=baidu,window.UE=baidu.editor=window.UE||{},UE.plugins={},UE.commands={},UE.instants={},UE.I18N={},UE._customizeUI={},UE.version="1.4.3";var dom=UE.dom={},browser=UE.browser=function(){var a=navigator.userAgent.toLowerCase(),b=window.opera,c={ie:/(msie\s|trident.*rv:)([\w.]+)/.test(a),opera:!!b&&b.version,webkit:a.indexOf(" applewebkit/")>-1,mac:a.indexOf("macintosh")>-1,quirks:"BackCompat"==document.compatMode};c.gecko="Gecko"==navigator.product&&!c.webkit&&!c.opera&&!c.ie;var d=0;if(c.ie){var e=a.match(/(?:msie\s([\w.]+))/),f=a.match(/(?:trident.*rv:([\w.]+))/);d=e&&f&&e[1]&&f[1]?Math.max(1*e[1],1*f[1]):e&&e[1]?1*e[1]:f&&f[1]?1*f[1]:0,c.ie11Compat=11==document.documentMode,c.ie9Compat=9==document.documentMode,c.ie8=!!document.documentMode,c.ie8Compat=8==document.documentMode,c.ie7Compat=7==d&&!document.documentMode||7==document.documentMode,c.ie6Compat=d<7||c.quirks,c.ie9above=d>8,c.ie9below=d<9,c.ie11above=d>10,c.ie11below=d<11}if(c.gecko){var g=a.match(/rv:([\d\.]+)/);g&&(g=g[1].split("."),d=1e4*g[0]+100*(g[1]||0)+1*(g[2]||0))}return/chrome\/(\d+\.\d)/i.test(a)&&(c.chrome=+RegExp.$1),/(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(a)&&!/chrome/i.test(a)&&(c.safari=+(RegExp.$1||RegExp.$2)),c.opera&&(d=parseFloat(b.version())),c.webkit&&(d=parseFloat(a.match(/ applewebkit\/(\d+)/)[1])),c.version=d,c.isCompatible=!c.mobile&&(c.ie&&d>=6||c.gecko&&d>=10801||c.opera&&d>=9.5||c.air&&d>=1||c.webkit&&d>=522||!1),c}(),ie=browser.ie,webkit=browser.webkit,gecko=browser.gecko,opera=browser.opera,utils=UE.utils={each:function(a,b,c){if(null!=a)if(a.length===+a.length){for(var d=0,e=a.length;d=c&&a===b)return d=e,!1}),d},removeItem:function(a,b){for(var c=0,d=a.length;c'](?:(amp|lt|quot|gt|#39|nbsp|#\d+);)?/g,function(a,b){return b?a:{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},unhtmlForUrl:function(a,b){return a?a.replace(b||/[<">']/g,function(a){return{"<":"<","&":"&",'"':""",">":">","'":"'"}[a]}):""},html:function(a){return a?a.replace(/&((g|l|quo)t|amp|#39|nbsp);/g,function(a){return{"<":"<","&":"&",""":'"',">":">","'":"'"," ":" "}[a]}):""},cssStyleToDomStyle:function(){var a=document.createElement("div").style,b={"float":void 0!=a.cssFloat?"cssFloat":void 0!=a.styleFloat?"styleFloat":"float"};return function(a){return b[a]||(b[a]=a.toLowerCase().replace(/-./g,function(a){return a.charAt(1).toUpperCase()}))}}(),loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url settings of file ueditor.config.js ")},c.getElementsByTagName("head")[0].appendChild(i)}}}(),isEmptyObject:function(a){if(null==a)return!0;if(this.isArray(a)||this.isString(a))return 0===a.length;for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},fixColor:function(a,b){if(/color/i.test(a)&&/rgba?/.test(b)){var c=b.split(",");if(c.length>3)return"";b="#";for(var d,e=0;d=c[e++];)d=parseInt(d.replace(/[^\d]/gi,""),10).toString(16),b+=1==d.length?"0"+d:d;b=b.toUpperCase()}return b},optCss:function(a){function b(a,b){if(!a)return"";var c=a.top,d=a.bottom,e=a.left,f=a.right,g="";if(c&&e&&d&&f)g+=";"+b+":"+(c==d&&d==e&&e==f?c:c==d&&e==f?c+" "+e:e==f?c+" "+e+" "+d:c+" "+f+" "+d+" "+e)+";";else for(var h in a)g+=";"+b+"-"+h+":"+a[h]+";";return g}var c,d;return a=a.replace(/(padding|margin|border)\-([^:]+):([^;]+);?/gi,function(a,b,e,f){if(1==f.split(" ").length)switch(b){case"padding":return!c&&(c={}),c[e]=f,"";case"margin":return!d&&(d={}),d[e]=f,"";case"border":return"initial"==f?"":a}return a}),a+=b(c,"padding")+b(d,"margin"),a.replace(/^[ \n\r\t;]*|[ \n\r\t]*$/,"").replace(/;([ \n\r\t]+)|\1;/g,";").replace(/(&((l|g)t|quot|#39))?;{2,}/g,function(a,b){return b?b+";;":";"})},clone:function(a,b){var c;b=b||{};for(var d in a)a.hasOwnProperty(d)&&(c=a[d],"object"==typeof c?(b[d]=utils.isArray(c)?[]:{},utils.clone(a[d],b[d])):b[d]=c);return b},transUnitToPx:function(a){if(!/(pt|cm)/.test(a))return a;var b;switch(a.replace(/([\d.]+)(\w+)/,function(c,d,e){a=d,b=e}),b){case"cm":a=25*parseFloat(a);break;case"pt":a=Math.round(96*parseFloat(a)/72)}return a+(a?"px":"")},domReady:function(){function a(a){a.isReady=!0;for(var c;c=b.pop();c());}var b=[];return function(c,d){d=d||window;var e=d.document;c&&b.push(c),"complete"===e.readyState?a(e):(e.isReady&&a(e),browser.ie&&11!=browser.version?(!function(){if(!e.isReady){try{e.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a(e)}}(),d.attachEvent("onload",function(){a(e)})):(e.addEventListener("DOMContentLoaded",function(){e.removeEventListener("DOMContentLoaded",arguments.callee,!1),a(e)},!1),d.addEventListener("load",function(){a(e)},!1)))}}(),cssRule:browser.ie&&11!=browser.version?function(a,b,c){var d,e;if(void 0===b||b&&b.nodeType&&9==b.nodeType){if(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.indexList||(c.indexList={}),e=d[a],void 0!==e)return c.styleSheets[e].cssText}else{if(c=c||document,d=c.indexList||(c.indexList={}),e=d[a],""===b)return void 0!==e&&(c.styleSheets[e].cssText="",delete d[a],!0);void 0!==e?sheetStyle=c.styleSheets[e]:(sheetStyle=c.createStyleSheet("",e=c.styleSheets.length),d[a]=e),sheetStyle.cssText=b}}:function(a,b,c){var d;return void 0===b||b&&b.nodeType&&9==b.nodeType?(c=b&&b.nodeType&&9==b.nodeType?b:c||document,d=c.getElementById(a),d?d.innerHTML:void 0):(c=c||document,d=c.getElementById(a),""===b?!!d&&(d.parentNode.removeChild(d),!0):void(d?d.innerHTML=b:(d=c.createElement("style"),d.id=a,d.innerHTML=b,c.getElementsByTagName("head")[0].appendChild(d))))},sort:function(a,b){b=b||function(a,b){return a.localeCompare(b)};for(var c=0,d=a.length;c0){var g=a[c];a[c]=a[e],a[e]=g}return a},serializeParam:function(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c)if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d1||b!==a.parentNode){a.style.cssText=b.style.cssText+";"+a.style.cssText,b=b.parentNode;continue}b.style.cssText+=";"+a.style.cssText,"A"==b.tagName&&(b.style.textDecoration="underline")}if("A"!=b.tagName){b===a.parentNode&&domUtils.remove(a,!0);break}}b=b.parentNode}},mergeSibling:function(a,b,c){function d(a,b,c){var d;if((d=c[a])&&!domUtils.isBookmarkNode(d)&&1==d.nodeType&&domUtils.isSameElement(c,d)){for(;d.firstChild;)"firstChild"==b?c.insertBefore(d.lastChild,c.firstChild):c.appendChild(d.firstChild);domUtils.remove(d)}}!b&&d("previousSibling","firstChild",a),!c&&d("nextSibling","lastChild",a)},unSelectable:ie&&browser.ie9below||browser.opera?function(a){a.onselectstart=function(){return!1},a.onclick=a.onkeyup=a.onkeydown=function(){return!1},a.unselectable="on",a.setAttribute("unselectable","on");for(var b,c=0;b=a.all[c++];)switch(b.tagName.toLowerCase()){case"iframe":case"textarea":case"input":case"select":break;default:b.unselectable="on",a.setAttribute("unselectable","on")}}:function(a){a.style.MozUserSelect=a.style.webkitUserSelect=a.style.msUserSelect=a.style.KhtmlUserSelect="none"},removeAttributes:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0;c=b[d++];){switch(c=attrFix[c]||c){case"className":a[c]="";break;case"style":a.style.cssText="";var e=a.getAttributeNode("style");!browser.ie&&e&&a.removeAttributeNode(e)}a.removeAttribute(c)}},createElement:function(a,b,c){return domUtils.setAttributes(a.createElement(b),c)},setAttributes:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];switch(c){case"class":a.className=d;break;case"style":a.style.cssText=a.style.cssText+";"+d;break;case"innerHTML":a[c]=d;break;case"value":a.value=d;break;default:a.setAttribute(attrFix[c]||c,d)}}return a},getComputedStyle:function(a,b){var c="width height top left";if(c.indexOf(b)>-1)return a["offset"+b.replace(/^\w/,function(a){return a.toUpperCase()})]+"px";if(3==a.nodeType&&(a=a.parentNode),browser.ie&&browser.version<9&&"font-size"==b&&!a.style.fontSize&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]){var d=a.ownerDocument.createElement("span");d.style.cssText="padding:0;border:0;font-family:simsun;",d.innerHTML=".",a.appendChild(d);var e=d.offsetHeight;return a.removeChild(d),d=null,e+"px"}try{var f=domUtils.getStyle(a,b)||(window.getComputedStyle?domUtils.getWindow(a).getComputedStyle(a,"").getPropertyValue(b):(a.currentStyle||a.style)[utils.cssStyleToDomStyle(b)])}catch(g){return""}return utils.transUnitToPx(utils.fixColor(b,f))},removeClasses:function(a,b){b=utils.isArray(b)?b:utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=utils.trim(e).replace(/[ ]{2,}/g," "),e?a.className=e:domUtils.removeAttributes(a,["class"])},addClass:function(a,b){if(a){b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)new RegExp("\\b"+c+"\\b").test(e)||(e+=" "+c);a.className=utils.trim(e)}},hasClass:function(a,b){if(utils.isRegExp(b))return b.test(a.className);b=utils.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},preventDefault:function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},removeStyle:function(a,b){browser.ie?("color"==b&&(b="(^|;)"+b),a.style.cssText=a.style.cssText.replace(new RegExp(b+"[^:]*:[^;]+;?","ig"),"")):a.style.removeProperty?a.style.removeProperty(b):a.style.removeAttribute(utils.cssStyleToDomStyle(b)),a.style.cssText||domUtils.removeAttributes(a,["style"])},getStyle:function(a,b){var c=a.style[utils.cssStyleToDomStyle(b)];return utils.fixColor(b,c)},setStyle:function(a,b,c){a.style[utils.cssStyleToDomStyle(b)]=c,utils.trim(a.style.cssText)||this.removeAttributes(a,"style")},setStyles:function(a,b){for(var c in b)b.hasOwnProperty(c)&&domUtils.setStyle(a,c,b[c])},removeDirtyAttr:function(a){for(var b,c=0,d=a.getElementsByTagName("*");b=d[c++];)b.removeAttribute("_moz_dirty");a.removeAttribute("_moz_dirty")},getChildCount:function(a,b){var c=0,d=a.firstChild;for(b=b||function(){return 1};d;)b(d)&&c++,d=d.nextSibling;return c},isEmptyNode:function(a){return!a.firstChild||0==domUtils.getChildCount(a,function(a){return!domUtils.isBr(a)&&!domUtils.isBookmarkNode(a)&&!domUtils.isWhitespace(a)})},clearSelectedArr:function(a){for(var b;b=a.pop();)domUtils.removeAttributes(b,["class"])},scrollToView:function(a,b,c){var d=function(){var a=b.document,c="CSS1Compat"==a.compatMode;return{width:(c?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(c?a.documentElement.clientHeight:a.body.clientHeight)||0}},e=function(a){if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};var b=a.document;return{x:b.documentElement.scrollLeft||b.body.scrollLeft||0,y:b.documentElement.scrollTop||b.body.scrollTop||0}},f=d().height,g=f*-1+c;g+=a.offsetHeight||0;var h=domUtils.getXY(a);g+=h.y;var i=e(b).y;(g>i||g0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1},setViewportOffset:function(a,b){var c=0|parseInt(a.style.left),d=0|parseInt(a.style.top),e=a.getBoundingClientRect(),f=b.left-e.left,g=b.top-e.top;f&&(a.style.left=c+f+"px"),g&&(a.style.top=d+g+"px")},fillNode:function(a,b){var c=browser.ie?a.createTextNode(domUtils.fillChar):a.createElement("br");b.innerHTML="",b.appendChild(c)},moveChild:function(a,b,c){for(;a.firstChild;)c&&b.firstChild?b.insertBefore(a.lastChild,b.firstChild):b.appendChild(a.firstChild)},hasNoAttributes:function(a){return browser.ie?/^<\w+\s*?>/.test(a.outerHTML):0==a.attributes.length},isCustomeNode:function(a){return 1==a.nodeType&&a.getAttribute("_ue_custom_node_")},isTagNode:function(a,b){return 1==a.nodeType&&new RegExp("\\b"+a.tagName+"\\b","i").test(b)},filterNodeList:function(a,b,c){var d=[];if(!utils.isFunction(b)){var e=b;b=function(a){return utils.indexOf(utils.isArray(e)?e:e.split(" "),a.tagName.toLowerCase())!=-1}}return utils.each(a,function(a){b(a)&&d.push(a)}),0==d.length?null:1!=d.length&&c?d:d[0]},isInNodeEndBoundary:function(a,b){var c=a.startContainer;if(3==c.nodeType&&a.startOffset!=c.nodeValue.length)return 0;if(1==c.nodeType&&a.startOffset!=c.childNodes.length)return 0;for(;c!==b;){if(c.nextSibling)return 0;c=c.parentNode}return 1},isBoundaryNode:function(a,b){for(var c;!domUtils.isBody(a);)if(c=a,a=a.parentNode,c!==a[b])return!1;return!0},fillHtml:browser.ie11below?" ":"
            "},fillCharReg=new RegExp(domUtils.fillChar,"g");!function(){function a(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer===a.endContainer&&a.startOffset==a.endOffset}function b(a){return!a.collapsed&&1==a.startContainer.nodeType&&a.startContainer===a.endContainer&&a.endOffset-a.startOffset==1}function c(b,c,d,e){return 1==c.nodeType&&(dtd.$empty[c.tagName]||dtd.$nonChild[c.tagName])&&(d=domUtils.getNodeIndex(c)+(b?0:1),c=c.parentNode),b?(e.startContainer=c,e.startOffset=d,e.endContainer||e.collapse(!0)):(e.endContainer=c,e.endOffset=d,e.startContainer||e.collapse(!1)),a(e),e}function d(a,b){var c,d,e=a.startContainer,f=a.endContainer,g=a.startOffset,h=a.endOffset,i=a.document,j=i.createDocumentFragment();if(1==e.nodeType&&(e=e.childNodes[g]||(c=e.appendChild(i.createTextNode("")))),1==f.nodeType&&(f=f.childNodes[h]||(d=f.appendChild(i.createTextNode("")))),e===f&&3==e.nodeType)return j.appendChild(i.createTextNode(e.substringData(g,h-g))),b&&(e.deleteData(g,h-g),a.collapse(!0)),j;for(var k,l,m=j,n=domUtils.findParents(e,!0),o=domUtils.findParents(f,!0),p=0;n[p]==o[p];)p++;for(var q,r=p;q=n[r];r++){for(k=q.nextSibling,q==e?c||(3==a.startContainer.nodeType?(m.appendChild(i.createTextNode(e.nodeValue.slice(g))),b&&e.deleteData(g,e.nodeValue.length-g)):m.appendChild(b?e:e.cloneNode(!0))):(l=q.cloneNode(!1),m.appendChild(l));k&&k!==f&&k!==o[r];)q=k.nextSibling,m.appendChild(b?k:k.cloneNode(!0)),k=q;m=l}m=j,n[p]||(m.appendChild(n[p-1].cloneNode(!1)),m=m.firstChild);for(var s,r=p;s=o[r];r++){if(k=s.previousSibling,s==f?d||3!=a.endContainer.nodeType||(m.appendChild(i.createTextNode(f.substringData(0,h))),b&&f.deleteData(0,h)):(l=s.cloneNode(!1),m.appendChild(l)),r!=p||!n[p])for(;k&&k!==e;)s=k.previousSibling,m.insertBefore(b?k:k.cloneNode(!0),m.firstChild),k=s;m=l}return b&&a.setStartBefore(o[p]?n[p]?o[p]:n[p-1]:o[p-1]).collapse(!0),c&&domUtils.remove(c),d&&domUtils.remove(d),j}function e(a,b){try{if(g&&domUtils.inDoc(g,a))if(g.nodeValue.replace(fillCharReg,"").length)g.nodeValue=g.nodeValue.replace(fillCharReg,"");else{var c=g.parentNode;for(domUtils.remove(g);c&&domUtils.isEmptyInlineElement(c)&&(browser.safari?!(domUtils.getPosition(c,b)&domUtils.POSITION_CONTAINS):!c.contains(b));)g=c.parentNode,domUtils.remove(c),c=g}}catch(d){} +}function f(a,b){var c;for(a=a[b];a&&domUtils.isFillChar(a);)c=a[b],domUtils.remove(a),a=c}var g,h=0,i=domUtils.fillChar,j=dom.Range=function(a){var b=this;b.startContainer=b.startOffset=b.endContainer=b.endOffset=null,b.document=a,b.collapsed=!0};j.prototype={cloneContents:function(){return this.collapsed?null:d(this,0)},deleteContents:function(){var a;return this.collapsed||d(this,1),browser.webkit&&(a=this.startContainer,3!=a.nodeType||a.nodeValue.length||(this.setStartBefore(a).collapse(!0),domUtils.remove(a))),this},extractContents:function(){return this.collapsed?null:d(this,2)},setStart:function(a,b){return c(!0,a,b,this)},setEnd:function(a,b){return c(!1,a,b,this)},setStartAfter:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a)+1)},setStartBefore:function(a){return this.setStart(a.parentNode,domUtils.getNodeIndex(a))},setEndAfter:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a)+1)},setEndBefore:function(a){return this.setEnd(a.parentNode,domUtils.getNodeIndex(a))},setStartAtFirst:function(a){return this.setStart(a,0)},setStartAtLast:function(a){return this.setStart(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},setEndAtFirst:function(a){return this.setEnd(a,0)},setEndAtLast:function(a){return this.setEnd(a,3==a.nodeType?a.nodeValue.length:a.childNodes.length)},selectNode:function(a){return this.setStartBefore(a).setEndAfter(a)},selectNodeContents:function(a){return this.setStart(a,0).setEndAtLast(a)},cloneRange:function(){var a=this;return new j(a.document).setStart(a.startContainer,a.startOffset).setEnd(a.endContainer,a.endOffset)},collapse:function(a){var b=this;return a?(b.endContainer=b.startContainer,b.endOffset=b.startOffset):(b.startContainer=b.endContainer,b.startOffset=b.endOffset),b.collapsed=!0,b},shrinkBoundary:function(a){function b(a){return 1==a.nodeType&&!domUtils.isBookmarkNode(a)&&!dtd.$empty[a.tagName]&&!dtd.$nonChild[a.tagName]}for(var c,d=this,e=d.collapsed;1==d.startContainer.nodeType&&(c=d.startContainer.childNodes[d.startOffset])&&b(c);)d.setStart(c,0);if(e)return d.collapse(!0);if(!a)for(;1==d.endContainer.nodeType&&d.endOffset>0&&(c=d.endContainer.childNodes[d.endOffset-1])&&b(c);)d.setEnd(c,c.childNodes.length);return d},getCommonAncestor:function(a,c){var d=this,e=d.startContainer,f=d.endContainer;return e===f?a&&b(this)&&(e=e.childNodes[d.startOffset],1==e.nodeType)?e:c&&3==e.nodeType?e.parentNode:e:domUtils.getCommonAncestor(e,f)},trimBoundary:function(a){this.txtToElmBoundary();var b=this.startContainer,c=this.startOffset,d=this.collapsed,e=this.endContainer;if(3==b.nodeType){if(0==c)this.setStartBefore(b);else if(c>=b.nodeValue.length)this.setStartAfter(b);else{var f=domUtils.split(b,c);b===e?this.setEnd(f,this.endOffset-c):b.parentNode===e&&(this.endOffset+=1),this.setStartBefore(f)}if(d)return this.collapse(!0)}return a||(c=this.endOffset,e=this.endContainer,3==e.nodeType&&(0==c?this.setEndBefore(e):(c=c.nodeValue.length&&a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"After"](c):a["set"+b.replace(/(\w)/,function(a){return a.toUpperCase()})+"Before"](c))}return!a&&this.collapsed||(b(this,"start"),b(this,"end")),this},insertNode:function(a){var b=a,c=1;11==a.nodeType&&(b=a.firstChild,c=a.childNodes.length),this.trimBoundary(!0);var d=this.startContainer,e=this.startOffset,f=d.childNodes[e];return f?d.insertBefore(a,f):d.appendChild(a),b.parentNode===this.endContainer&&(this.endOffset=this.endOffset+c),this.setStartBefore(b)},setCursor:function(a,b){return this.collapse(!a).select(b)},createBookmark:function(a,b){var c,d=this.document.createElement("span");return d.style.cssText="display:none;line-height:0px;",d.appendChild(this.document.createTextNode("‍")),d.id="_baidu_bookmark_start_"+(b?"":h++),this.collapsed||(c=d.cloneNode(!0),c.id="_baidu_bookmark_end_"+(b?"":h++)),this.insertNode(d),c&&this.collapse().insertNode(c).setEndBefore(c),this.setStartAfter(d),{start:a?d.id:d,end:c?a?c.id:c:null,id:a}},moveToBookmark:function(a){var b=a.id?this.document.getElementById(a.start):a.start,c=a.end&&a.id?this.document.getElementById(a.end):a.end;return this.setStartBefore(b),domUtils.remove(b),c?(this.setEndBefore(c),domUtils.remove(c)):this.collapse(!0),this},enlarge:function(a,b){var c,d,e=domUtils.isBody,f=this.document.createTextNode("");if(a){for(d=this.startContainer,1==d.nodeType?d.childNodes[this.startOffset]?c=d=d.childNodes[this.startOffset]:(d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.previousSibling)&&!domUtils.isBlockElm(c);)d=c;this.setStartBefore(d);break}c=d,d=d.parentNode}for(d=this.endContainer,1==d.nodeType?((c=d.childNodes[this.endOffset])?d.insertBefore(f,c):d.appendChild(f),c=d=f):c=d;;){if(domUtils.isBlockElm(d)){for(d=c;(c=d.nextSibling)&&!domUtils.isBlockElm(c);)d=c;this.setEndAfter(d);break}c=d,d=d.parentNode}f.parentNode===this.endContainer&&this.endOffset--,domUtils.remove(f)}if(!this.collapsed){for(;!(0!=this.startOffset||b&&b(this.startContainer)||e(this.startContainer));)this.setStartBefore(this.startContainer);for(;!(this.endOffset!=(1==this.endContainer.nodeType?this.endContainer.childNodes.length:this.endContainer.nodeValue.length)||b&&b(this.endContainer)||e(this.endContainer));)this.setEndAfter(this.endContainer)}return this},enlargeToBlockElm:function(a){for(;!domUtils.isBlockElm(this.startContainer);)this.setStartBefore(this.startContainer);if(!a)for(;!domUtils.isBlockElm(this.endContainer);)this.setEndAfter(this.endContainer);return this},adjustmentBoundary:function(){if(!this.collapsed){for(;!domUtils.isBody(this.startContainer)&&this.startOffset==this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length&&this.startContainer[3==this.startContainer.nodeType?"nodeValue":"childNodes"].length;)this.setStartAfter(this.startContainer);for(;!domUtils.isBody(this.endContainer)&&!this.endOffset&&this.endContainer[3==this.endContainer.nodeType?"nodeValue":"childNodes"].length;)this.setEndBefore(this.endContainer)}return this},applyInlineStyle:function(a,b,c){if(this.collapsed)return this;this.trimBoundary().enlarge(!1,function(a){return 1==a.nodeType&&domUtils.isBlockElm(a)}).adjustmentBoundary();for(var d,e,f=this.createBookmark(),g=f.end,h=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},i=domUtils.getNextDomNode(f.start,!1,h),j=this.cloneRange();i&&domUtils.getPosition(i,g)&domUtils.POSITION_PRECEDING;)if(3==i.nodeType||dtd[a][i.tagName]){for(j.setStartBefore(i),d=i;d&&(3==d.nodeType||dtd[a][d.tagName])&&d!==g;)e=d,d=domUtils.getNextDomNode(d,1==d.nodeType,null,function(b){return dtd[a][b.tagName]});var k,l=j.setEndAfter(e).extractContents();if(c&&c.length>0){var m,n;n=m=c[0].cloneNode(!1);for(var o,p=1;o=c[p++];)m.appendChild(o.cloneNode(!1)),m=m.firstChild;k=m}else k=j.document.createElement(a);b&&domUtils.setAttributes(k,b),k.appendChild(l),j.insertNode(c?n:k);var q;if("span"==a&&b.style&&/text\-decoration/.test(b.style)&&(q=domUtils.findParentByTagName(k,"a",!0))?(domUtils.setAttributes(q,b),domUtils.remove(k,!0),k=q):(domUtils.mergeSibling(k),domUtils.clearEmptySibling(k)),domUtils.mergeChild(k,b),i=domUtils.getNextDomNode(k,!1,h),domUtils.mergeToParent(k),d===g)break}else i=domUtils.getNextDomNode(i,!0,h);return this.moveToBookmark(f)},removeInlineStyle:function(a){if(this.collapsed)return this;a=utils.isArray(a)?a:[a],this.shrinkBoundary().adjustmentBoundary();for(var b=this.startContainer,c=this.endContainer;;){if(1==b.nodeType){if(utils.indexOf(a,b.tagName.toLowerCase())>-1)break;if("body"==b.tagName.toLowerCase()){b=null;break}}b=b.parentNode}for(;;){if(1==c.nodeType){if(utils.indexOf(a,c.tagName.toLowerCase())>-1)break;if("body"==c.tagName.toLowerCase()){c=null;break}}c=c.parentNode}var d,e,f=this.createBookmark();b&&(e=this.cloneRange().setEndBefore(f.start).setStartBefore(b),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(b,!0),b.parentNode.insertBefore(f.start,b)),c&&(e=this.cloneRange().setStartAfter(f.end).setEndAfter(c),d=e.extractContents(),e.insertNode(d),domUtils.clearEmptySibling(c,!1,!0),c.parentNode.insertBefore(f.end,c.nextSibling));for(var g,h=domUtils.getNextDomNode(f.start,!1,function(a){return 1==a.nodeType});h&&h!==f.end;)g=domUtils.getNextDomNode(h,!0,function(a){return 1==a.nodeType}),utils.indexOf(a,h.tagName.toLowerCase())>-1&&domUtils.remove(h,!0),h=g;return this.moveToBookmark(f)},getClosedNode:function(){var a;if(!this.collapsed){var c=this.cloneRange().adjustmentBoundary().shrinkBoundary();if(b(c)){var d=c.startContainer.childNodes[c.startOffset];d&&1==d.nodeType&&(dtd.$empty[d.tagName]||dtd.$nonChild[d.tagName])&&(a=d)}}return a},select:browser.ie?function(a,b){var c;this.collapsed||this.shrinkBoundary();var d=this.getClosedNode();if(d&&!b){try{c=this.document.body.createControlRange(),c.addElement(d),c.select()}catch(h){}return this}var j,k=this.createBookmark(),l=k.start;if(c=this.document.body.createTextRange(),c.moveToElementText(l),c.moveStart("character",1),this.collapsed){if(!a&&3!=this.startContainer.nodeType){var m=this.document.createTextNode(i),n=this.document.createElement("span");n.appendChild(this.document.createTextNode(i)),l.parentNode.insertBefore(n,l),l.parentNode.insertBefore(m,l),e(this.document,m),g=m,f(n,"previousSibling"),f(l,"nextSibling"),c.moveStart("character",-1),c.collapse(!0)}}else{var o=this.document.body.createTextRange();j=k.end,o.moveToElementText(j),c.setEndPoint("EndToEnd",o)}this.moveToBookmark(k),n&&domUtils.remove(n);try{c.select()}catch(h){}return this}:function(a){function b(a){function b(b,c,d){3==b.nodeType&&b.nodeValue.length0)j=k-1;else{if(!(l<0))return{container:d,offset:c(e)};i=k+1}}if(k==-1){if(h.moveToElementText(d),h.setEndPoint("StartToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,g=d.childNodes,!f)return e=g[g.length-1],{container:e,offset:e.nodeValue.length};for(var m=g.length;f>0;)f-=g[--m].nodeValue.length;return{container:g[m],offset:-f}}if(h.collapse(l>0),h.setEndPoint(l>0?"StartToStart":"EndToStart",a),f=h.text.replace(/(\r\n|\r)/g,"\n").length,!f)return dtd.$empty[e.tagName]||dtd.$nonChild[e.tagName]?{container:d,offset:c(e)+(l>0?0:1)}:{container:e,offset:l>0?0:e.childNodes.length};for(;f>0;)try{var n=e;e=e[l>0?"previousSibling":"nextSibling"],f-=e.nodeValue.length}catch(o){return{container:d,offset:c(n)}}return{container:e,offset:l>0?-f:e.nodeValue.length+f}}function b(b,c){if(b.item)c.selectNode(b.item(0));else{var d=a(b,!0);c.setStart(d.container,d.offset),0!=b.compareEndPoints("StartToEnd",b)&&(d=a(b,!1),c.setEnd(d.container,d.offset))}return c}function c(a){var b;try{b=a.getNative().createRange()}catch(c){return null}var d=b.item?b.item(0):b.parentElement();return(d.ownerDocument||d)===a.document?b:null}var d=dom.Selection=function(a){var b,d=this;d.document=a,browser.ie9below&&(b=domUtils.getWindow(a).frameElement,domUtils.on(b,"beforedeactivate",function(){d._bakIERange=d.getIERange()}),domUtils.on(b,"activate",function(){try{!c(d)&&d._bakIERange&&d._bakIERange.select()}catch(a){}d._bakIERange=null})),b=a=null};d.prototype={rangeInBody:function(a,b){var c=browser.ie9below||b?a.item?a.item():a.parentElement():a.startContainer;return c===this.document.body||domUtils.inDoc(c,this.document)},getNative:function(){var a=this.document;try{return a?browser.ie9below?a.selection:domUtils.getWindow(a).getSelection():null}catch(b){return null}},getIERange:function(){var a=c(this);return!a&&this._bakIERange?this._bakIERange:a},cache:function(){this.clear(),this._cachedRange=this.getRange(),this._cachedStartElement=this.getStart(),this._cachedStartElementPath=this.getStartElementPath()},getStartElementPath:function(){if(this._cachedStartElementPath)return this._cachedStartElementPath;var a=this.getStart();return a?domUtils.findParents(a,!0,null,!0):[]},clear:function(){this._cachedStartElementPath=this._cachedRange=this._cachedStartElement=null},isFocus:function(){try{if(browser.ie9below){var a=c(this);return!(!a||!this.rangeInBody(a))}return!!this.getNative().rangeCount}catch(b){return!1}},getRange:function(){function a(a){for(var b=c.document.body.firstChild,d=a.collapsed;b&&b.firstChild;)a.setStart(b,0),b=b.firstChild;a.startContainer||a.setStart(c.document.body,0),d&&a.collapse(!0)}var c=this;if(null!=c._cachedRange)return this._cachedRange;var d=new baidu.editor.dom.Range(c.document);if(browser.ie9below){var e=c.getIERange();if(e)try{b(e,d)}catch(f){a(d)}else a(d)}else{var g=c.getNative();if(g&&g.rangeCount){var h=g.getRangeAt(0),i=g.getRangeAt(g.rangeCount-1);d.setStart(h.startContainer,h.startOffset).setEnd(i.endContainer,i.endOffset),d.collapsed&&domUtils.isBody(d.startContainer)&&!d.startOffset&&a(d)}else{if(this._bakRange&&domUtils.inDoc(this._bakRange.startContainer,this.document))return this._bakRange;a(d)}}return this._bakRange=d},getStart:function(){if(this._cachedStartElement)return this._cachedStartElement;var a,b,c,d,e=browser.ie9below?this.getIERange():this.getRange();if(browser.ie9below){if(!e)return this.document.body.firstChild;if(e.item)return e.item(0);for(a=e.duplicate(),a.text.length>0&&a.moveStart("character",1),a.collapse(1),b=a.parentElement(),d=c=e.parentElement();c=c.parentNode;)if(c==b){b=d;break}}else if(e.shrinkBoundary(),b=e.startContainer,1==b.nodeType&&b.hasChildNodes()&&(b=b.childNodes[Math.min(b.childNodes.length-1,e.startOffset)]),3==b.nodeType)return b.parentNode;return b},getText:function(){var a,b;return this.isFocus()&&(a=this.getNative())?(b=browser.ie9below?a.createRange():a.getRangeAt(0),browser.ie9below?b.text:b.toString()):""},clearRange:function(){this.getNative()[browser.ie9below?"empty":"removeAllRanges"]()}}}(),function(){function a(a,b){var c;if(b.textarea)if(utils.isString(b.textarea)){for(var d,e=0,f=domUtils.getElementsByTagName(a,"textarea");d=f[e++];)if(d.id=="ueditor_textarea_"+b.options.textarea){c=d;break}}else c=b.textarea;c||(a.appendChild(c=domUtils.createElement(document,"textarea",{name:b.options.textarea,id:"ueditor_textarea_"+b.options.textarea,style:"display:none"})),b.textarea=c),!c.getAttribute("name")&&c.setAttribute("name",b.options.textarea),c.value=b.hasContents()?b.options.allHtmlEnabled?b.getAllHtml():b.getContent(null,null,!0):""}function b(a){for(var b in a)return b}function c(a){a.langIsReady=!0,a.fireEvent("langReady")}var d,e=0,f=UE.Editor=function(a){var d=this;d.uid=e++,EventBase.call(d),d.commands={},d.options=utils.extend(utils.clone(a||{}),UEDITOR_CONFIG,!0),d.shortcutkeys={},d.inputRules=[],d.outputRules=[],d.setOpt(f.defaultOptions(d)),d.loadServerConfig(),utils.isEmptyObject(UE.I18N)?utils.loadFile(document,{src:d.options.langPath+d.options.lang+"/"+d.options.lang+".js",tag:"script",type:"text/javascript",defer:"defer"},function(){UE.plugin.load(d),c(d)}):(d.options.lang=b(UE.I18N),UE.plugin.load(d),c(d)),UE.instants["ueditorInstant"+d.uid]=d};f.prototype={registerCommand:function(a,b){this.commands[a]=b},ready:function(a){var b=this;a&&(b.isReady?a.apply(b):b.addListener("ready",a))},setOpt:function(a,b){var c={};utils.isString(a)?c[a]=b:c=a,utils.extend(this.options,c,!0)},getOpt:function(a){return this.options[a]},destroy:function(){var a=this;a.fireEvent("destroy");var b=a.container.parentNode,c=a.textarea;c?c.style.display="":(c=document.createElement("textarea"),b.parentNode.insertBefore(c,b)),c.style.width=a.iframe.offsetWidth+"px",c.style.height=a.iframe.offsetHeight+"px",c.value=a.getContent(),c.id=a.key,b.innerHTML="",domUtils.remove(b);var d=a.key;for(var e in a)a.hasOwnProperty(e)&&delete this[e];UE.delEditor(d)},render:function(a){var b=this,c=b.options,d=function(b){return parseInt(domUtils.getComputedStyle(a,b))};if(utils.isString(a)&&(a=document.getElementById(a)),a){c.initialFrameWidth?c.minFrameWidth=c.initialFrameWidth:c.minFrameWidth=c.initialFrameWidth=a.offsetWidth,c.initialFrameHeight?c.minFrameHeight=c.initialFrameHeight:c.initialFrameHeight=c.minFrameHeight=a.offsetHeight,a.style.width=/%$/.test(c.initialFrameWidth)?"100%":c.initialFrameWidth-d("padding-left")-d("padding-right")+"px",a.style.height=/%$/.test(c.initialFrameHeight)?"100%":c.initialFrameHeight-d("padding-top")-d("padding-bottom")+"px",a.style.zIndex=c.zIndex;var e=(ie&&browser.version<9?"":"")+""+(c.iframeCssUrl?"":"")+(c.initialStyle?"":"")+"";a.appendChild(domUtils.createElement(document,"iframe",{id:"ueditor_"+b.uid,width:"100%",height:"100%",frameborder:"0",src:"javascript:void(function(){document.open();"+(c.customDomain&&document.domain!=location.hostname?'document.domain="'+document.domain+'";':"")+'document.write("'+e+'");document.close();}())'})),a.style.overflow="hidden",setTimeout(function(){/%$/.test(c.initialFrameWidth)&&(c.minFrameWidth=c.initialFrameWidth=a.offsetWidth),/%$/.test(c.initialFrameHeight)&&(c.minFrameHeight=c.initialFrameHeight=a.offsetHeight,a.style.height=c.initialFrameHeight+"px")})}},_setup:function(b){var c=this,d=c.options;ie?(b.body.disabled=!0,b.body.contentEditable=!0,b.body.disabled=!1):b.body.contentEditable=!0,b.body.spellcheck=!1,c.document=b,c.window=b.defaultView||b.parentWindow,c.iframe=c.window.frameElement,c.body=b.body,c.selection=new dom.Selection(b);var e;browser.gecko&&(e=this.selection.getNative())&&e.removeAllRanges(),this._initEvents();for(var f=this.iframe.parentNode;!domUtils.isBody(f);f=f.parentNode)if("FORM"==f.tagName){c.form=f,c.options.autoSyncData?domUtils.on(c.window,"blur",function(){a(f,c)}):domUtils.on(f,"submit",function(){a(this,c)});break}if(d.initialContent)if(d.autoClearinitialContent){var g=c.execCommand;c.execCommand=function(){return c.fireEvent("firstBeforeExecCommand"),g.apply(c,arguments)},this._setDefaultContent(d.initialContent)}else this.setContent(d.initialContent,!1,!0);domUtils.isEmptyNode(c.body)&&(c.body.innerHTML="

            "+(browser.ie?"":"
            ")+"

            "),d.focus&&setTimeout(function(){c.focus(c.options.focusInEnd),!c.options.autoClearinitialContent&&c._selectionChange()},0),c.container||(c.container=this.iframe.parentNode),d.fullscreen&&c.ui&&c.ui.setFullScreen(!0);try{c.document.execCommand("2D-position",!1,!1)}catch(h){}try{c.document.execCommand("enableInlineTableEditing",!1,!1)}catch(h){}try{c.document.execCommand("enableObjectResizing",!1,!1)}catch(h){}c._bindshortcutKeys(),c.isReady=1,c.fireEvent("ready"),d.onready&&d.onready.call(c),browser.ie9below||domUtils.on(c.window,["blur","focus"],function(a){if("blur"==a.type){c._bakRange=c.selection.getRange();try{c._bakNativeRange=c.selection.getNative().getRangeAt(0),c.selection.getNative().removeAllRanges()}catch(a){c._bakNativeRange=null}}else try{c._bakRange&&c._bakRange.select()}catch(a){}}),browser.gecko&&browser.version<=10902&&(c.body.contentEditable=!1,setTimeout(function(){c.body.contentEditable=!0},100),setInterval(function(){c.body.style.height=c.iframe.offsetHeight-20+"px"},100)),!d.isShow&&c.setHide(),d.readonly&&c.setDisabled()},sync:function(b){var c=this,d=b?document.getElementById(b):domUtils.findParent(c.iframe.parentNode,function(a){return"FORM"==a.tagName},!0);d&&a(d,c)},setHeight:function(a,b){a!==parseInt(this.iframe.parentNode.style.height)&&(this.iframe.parentNode.style.height=a+"px"),!b&&(this.options.minFrameHeight=this.options.initialFrameHeight=a),this.body.style.height=a+"px",!b&&this.trigger("setHeight")},addshortcutkey:function(a,b){var c={};b?c[a]=b:c=a,utils.extend(this.shortcutkeys,c)},_bindshortcutKeys:function(){var a=this,b=this.shortcutkeys;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which;for(var f in b)for(var g,h=b[f].split(","),i=0;g=h[i++];){g=g.split(":");var j=g[0],k=g[1];(/^(ctrl)(\+shift)?\+(\d+)$/.test(j.toLowerCase())||/^(\d+)$/.test(j))&&(("ctrl"==RegExp.$1?d.ctrlKey||d.metaKey:0)&&(""!=RegExp.$2?d[RegExp.$2.slice(1)+"Key"]:1)&&e==RegExp.$3||e==RegExp.$1)&&(a.queryCommandState(f,k)!=-1&&a.execCommand(f,k),domUtils.preventDefault(d))}})},getContent:function(a,b,c,d,e){var f=this;if(a&&utils.isFunction(a)&&(b=a,a=""),b?!b():!this.hasContents())return"";f.fireEvent("beforegetcontent");var g=UE.htmlparser(f.body.innerHTML,d);return f.filterOutputRule(g),f.fireEvent("aftergetcontent",a,g),g.toHtml(e)},getAllHtml:function(){var a=this,b=[];if(a.fireEvent("getAllHtml",b),browser.ie&&browser.version>8){var c="";utils.each(a.document.styleSheets,function(a){c+=a.href?'':""}),utils.each(a.document.getElementsByTagName("script"),function(a){c+=a.outerHTML})}return""+(a.options.charset?'':"")+(c||a.document.getElementsByTagName("head")[0].innerHTML)+b.join("\n")+""+a.getContent(null,null,!0)+""},getPlainTxt:function(){var a=new RegExp(domUtils.fillChar,"g"),b=this.body.innerHTML.replace(/[\n\r]/g,"");return b=b.replace(/<(p|div)[^>]*>(| )<\/\1>/gi,"\n").replace(//gi,"\n").replace(/<[^>\/]+>/g,"").replace(/(\n)?<\/([^>]+)>/g,function(a,b,c){return dtd.$block[c]?"\n":b?b:""}),b.replace(a,"").replace(/\u00a0/g," ").replace(/ /g," ")},getContentTxt:function(){var a=new RegExp(domUtils.fillChar,"g");return this.body[browser.ie?"innerText":"textContent"].replace(a,"").replace(/\u00a0/g," ")},setContent:function(b,c,d){function e(a){return"DIV"==a.tagName&&a.getAttribute("cdata_tag")}var f=this;f.fireEvent("beforesetcontent",b);var g=UE.htmlparser(b);if(f.filterInputRule(g),b=g.toHtml(),f.body.innerHTML=(c?f.body.innerHTML:"")+b,"p"==f.options.enterTag){var h,i=this.body.firstChild;if(!i||1==i.nodeType&&(dtd.$cdata[i.tagName]||e(i)||domUtils.isCustomeNode(i))&&i===this.body.lastChild)this.body.innerHTML="

            "+(browser.ie?" ":"
            ")+"

            "+this.body.innerHTML;else for(var j=f.document.createElement("p");i;){for(;i&&(3==i.nodeType||1==i.nodeType&&dtd.p[i.tagName]&&!dtd.$cdata[i.tagName]);)h=i.nextSibling,j.appendChild(i),i=h;if(j.firstChild){if(!i){f.body.appendChild(j);break}i.parentNode.insertBefore(j,i),j=f.document.createElement("p")}i=i.nextSibling}}f.fireEvent("aftersetcontent"),f.fireEvent("contentchange"),!d&&f._selectionChange(),f._bakRange=f._bakIERange=f._bakNativeRange=null;var k;browser.gecko&&(k=this.selection.getNative())&&k.removeAllRanges(),f.options.autoSyncData&&f.form&&a(f.form,f)},focus:function(a){try{var b=this,c=b.selection.getRange();if(a){var d=b.body.lastChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&(domUtils.isEmptyBlock(d)?c.setStartAtFirst(d):c.setStartAtLast(d),c.collapse(!0)),c.setCursor(!0)}else{if(!c.collapsed&&domUtils.isBody(c.startContainer)&&0==c.startOffset){var d=b.body.firstChild;d&&1==d.nodeType&&!dtd.$empty[d.tagName]&&c.setStartAtFirst(d).collapse(!0)}c.select(!0)}this.fireEvent("focus selectionchange")}catch(e){}},isFocus:function(){return this.selection.isFocus()},blur:function(){var a=this.selection.getNative();if(a.empty&&browser.ie){var b=document.body.createTextRange();b.moveToElementText(document.body),b.collapse(!0),b.select(),a.empty()}else a.removeAllRanges()},_initEvents:function(){var a=this,b=a.document,c=a.window;a._proxyDomEvent=utils.bind(a._proxyDomEvent,a),domUtils.on(b,["click","contextmenu","mousedown","keydown","keyup","keypress","mouseup","mouseover","mouseout","selectstart"],a._proxyDomEvent),domUtils.on(c,["focus","blur"],a._proxyDomEvent),domUtils.on(a.body,"drop",function(b){browser.gecko&&b.stopPropagation&&b.stopPropagation(),a.fireEvent("contentchange")}),domUtils.on(b,["mouseup","keydown"],function(b){"keydown"==b.type&&(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)||2!=b.button&&a._selectionChange(250,b)})},_proxyDomEvent:function(a){return this.fireEvent("before"+a.type.replace(/^on/,"").toLowerCase())!==!1&&(this.fireEvent(a.type.replace(/^on/,""),a)!==!1&&this.fireEvent("after"+a.type.replace(/^on/,"").toLowerCase()))},_selectionChange:function(a,b){var c,e,f=this,g=!1;if(browser.ie&&browser.version<9&&b&&"mouseup"==b.type){var h=this.selection.getRange();h.collapsed||(g=!0,c=b.clientX,e=b.clientY)}clearTimeout(d),d=setTimeout(function(){if(f.selection&&f.selection.getNative()){var a;if(g&&"None"==f.selection.getNative().type){a=f.document.body.createTextRange();try{a.moveToPoint(c,e)}catch(d){a=null}}var h;a&&(h=f.selection.getIERange,f.selection.getIERange=function(){return a}),f.selection.cache(),h&&(f.selection.getIERange=h),f.selection._cachedRange&&f.selection._cachedStartElement&&(f.fireEvent("beforeselectionchange"),f.fireEvent("selectionchange",!!b),f.fireEvent("afterselectionchange"),f.selection.clear())}},a||50)},_callCmdFn:function(a,b){var c,d,e=b[0].toLowerCase();return c=this.commands[e]||UE.commands[e],d=c&&c[a],c&&d||"queryCommandState"!=a?d?d.apply(this,b):void 0:0},execCommand:function(a){a=a.toLowerCase();var b,c=this,d=c.commands[a]||UE.commands[a];return d&&d.execCommand?(d.notNeedUndo||c.__hasEnterExecCommand?(b=this._callCmdFn("execCommand",arguments),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c.fireEvent("contentchange")):(c.__hasEnterExecCommand=!0,c.queryCommandState.apply(c,arguments)!=-1&&(c.fireEvent("saveScene"),c.fireEvent.apply(c,["beforeexeccommand",a].concat(arguments)),b=this._callCmdFn("execCommand",arguments),c.fireEvent.apply(c,["afterexeccommand",a].concat(arguments)),c.fireEvent("saveScene")),c.__hasEnterExecCommand=!1),!c.__hasEnterExecCommand&&!d.ignoreContentChange&&!c._ignoreContentChange&&c._selectionChange(),b):null},queryCommandState:function(a){return this._callCmdFn("queryCommandState",arguments)},queryCommandValue:function(a){return this._callCmdFn("queryCommandValue",arguments)},hasContents:function(a){if(a)for(var b,c=0;b=a[c++];)if(this.document.getElementsByTagName(b).length>0)return!0;if(!domUtils.isEmptyBlock(this.body))return!0;for(a=["div"],c=0;b=a[c++];)for(var d,e=domUtils.getElementsByTagName(this.document,b),f=0;d=e[f++];)if(domUtils.isCustomeNode(d))return!0;return!1},reset:function(){this.fireEvent("reset")},setEnabled:function(){var a,b=this;if("false"==b.body.contentEditable){b.body.contentEditable=!0,a=b.selection.getRange();try{a.moveToBookmark(b.lastBk),delete b.lastBk}catch(c){a.setStartAtFirst(b.body).collapse(!0)}a.select(!0),b.bkqueryCommandState&&(b.queryCommandState=b.bkqueryCommandState,delete b.bkqueryCommandState),b.bkqueryCommandValue&&(b.queryCommandValue=b.bkqueryCommandValue,delete b.bkqueryCommandValue),b.fireEvent("selectionchange")}},enable:function(){return this.setEnabled()},setDisabled:function(a){var b=this;a=a?utils.isArray(a)?a:[a]:[],"true"==b.body.contentEditable&&(b.lastBk||(b.lastBk=b.selection.getRange().createBookmark(!0)),b.body.contentEditable=!1,b.bkqueryCommandState=b.queryCommandState,b.bkqueryCommandValue=b.queryCommandValue,b.queryCommandState=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandState.apply(b,arguments):-1},b.queryCommandValue=function(c){return utils.indexOf(a,c)!=-1?b.bkqueryCommandValue.apply(b,arguments):null},b.fireEvent("selectionchange"))},disable:function(a){return this.setDisabled(a)},_setDefaultContent:function(){function a(){var b=this;b.document.getElementById("initContent")&&(b.body.innerHTML="

            "+(ie?"":"
            ")+"

            ",b.removeListener("firstBeforeExecCommand focus",a),setTimeout(function(){b.focus(),b._selectionChange()},0))}return function(b){var c=this;c.body.innerHTML='

            '+b+"

            ",c.addListener("firstBeforeExecCommand focus",a)}}(),setShow:function(){var a=this,b=a.selection.getRange();if("none"==a.container.style.display){try{b.moveToBookmark(a.lastBk),delete a.lastBk}catch(c){b.setStartAtFirst(a.body).collapse(!0)}setTimeout(function(){b.select(!0)},100),a.container.style.display=""}},show:function(){return this.setShow()},setHide:function(){ +var a=this;a.lastBk||(a.lastBk=a.selection.getRange().createBookmark(!0)),a.container.style.display="none"},hide:function(){return this.setHide()},getLang:function(a){var b=UE.I18N[this.options.lang];if(!b)throw Error("not import language file");a=(a||"").split(".");for(var c,d=0;(c=a[d++])&&(b=b[c],b););return b},getContentLength:function(a,b){var c=this.getContent(!1,!1,!0).length;if(a){b=(b||[]).concat(["hr","img","iframe"]),c=this.getContentTxt().replace(/[\t\r\n]+/g,"").length;for(var d,e=0;d=b[e++];)c+=this.document.getElementsByTagName(d).length}return c},addInputRule:function(a){this.inputRules.push(a)},filterInputRule:function(a){for(var b,c=0;b=this.inputRules[c++];)b.call(this,a)},addOutputRule:function(a){this.outputRules.push(a)},filterOutputRule:function(a){for(var b,c=0;b=this.outputRules[c++];)b.call(this,a)},getActionUrl:function(a){var b=this.getOpt(a)||a,c=this.getOpt("imageUrl"),d=this.getOpt("serverUrl");return!d&&c&&(d=c.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2")),d?(d=d+(d.indexOf("?")==-1?"?":"&")+"action="+(b||""),utils.formatUrl(d)):""}},utils.inherits(f,EventBase)}(),UE.Editor.defaultOptions=function(a){var b=a.options.UEDITOR_HOME_URL;return{isShow:!0,initialContent:"",initialStyle:"",autoClearinitialContent:!1,iframeCssUrl:b+"themes/iframe.css",textarea:"editorValue",focus:!1,focusInEnd:!0,autoClearEmptyNode:!0,fullscreen:!1,readonly:!1,zIndex:999,imagePopup:!0,enterTag:"p",customDomain:!1,lang:"zh-cn",langPath:b+"lang/",theme:"default",themePath:b+"themes/",allHtmlEnabled:!1,scaleEnabled:!1,tableNativeEditInFF:!1,autoSyncData:!0,fileNameFormat:"{time}{rand:6}"}},function(){UE.Editor.prototype.loadServerConfig=function(){function showErrorMsg(a){console&&console.error(a)}var me=this;setTimeout(function(){try{me.options.imageUrl&&me.setOpt("serverUrl",me.options.imageUrl.replace(/^(.*[\/]).+([\.].+)$/,"$1controller$2"));var configUrl=me.getActionUrl("config"),isJsonp=utils.isCrossDomainUrl(configUrl);me._serverConfigLoaded=!1,configUrl&&UE.ajax.request(configUrl,{method:"GET",dataType:isJsonp?"jsonp":"",onsuccess:function(r){try{var config=isJsonp?r:eval("("+r.responseText+")");utils.extend(me.options,config),me.fireEvent("serverConfigLoaded"),me._serverConfigLoaded=!0}catch(e){showErrorMsg(me.getLang("loadconfigFormatError"))}},onerror:function(){showErrorMsg(me.getLang("loadconfigHttpError"))}})}catch(e){showErrorMsg(me.getLang("loadconfigError"))}})},UE.Editor.prototype.isServerConfigLoaded=function(){var a=this;return a._serverConfigLoaded||!1},UE.Editor.prototype.afterConfigReady=function(a){if(a&&utils.isFunction(a)){var b=this,c=function(){a.apply(b,arguments),b.removeListener("serverConfigLoaded",c)};b.isServerConfigLoaded()?a.call(b,"serverConfigLoaded"):b.addListener("serverConfigLoaded",c)}}}(),UE.ajax=function(){function a(a){var b=[];for(var c in a)if("method"!=c&&"timeout"!=c&&"async"!=c&&"dataType"!=c&&"callback"!=c&&void 0!=a[c]&&null!=a[c])if("function"!=(typeof a[c]).toLowerCase()&&"object"!=(typeof a[c]).toLowerCase())b.push(encodeURIComponent(c)+"="+encodeURIComponent(a[c]));else if(utils.isArray(a[c]))for(var d=0;d/gi,"").replace(/]*>[\s\S]*?.<\/v:shape>/gi,function(a){if(browser.opera)return"";try{if(/Bitmap/i.test(a))return"";var c=a.match(/width:([ \d.]*p[tx])/i)[1],d=a.match(/height:([ \d.]*p[tx])/i)[1],e=a.match(/src=\s*"([^"]*)"/i)[1];return''}catch(f){return""}}).replace(/<\/?div[^>]*>/g,"").replace(/v:\w+=(["']?)[^'"]+\1/g,"").replace(/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|xml|meta|link|style|\w+:\w+)(?=[\s\/>]))[^>]*>/gi,"").replace(/

            ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

            $1

            ").replace(/\s+(class|lang|align)\s*=\s*(['"]?)([\w-]+)\2/gi,function(a,b,c,d){return"class"==b&&"MsoListParagraph"==d?a:""}).replace(/<(font|span)[^>]*>(\s*)<\/\1>/gi,function(a,b,c){return c.replace(/[\t\r\n ]+/g," ")}).replace(/(<[a-z][^>]*)\sstyle=(["'])([^\2]*?)\2/gi,function(a,c,d,e){for(var f,g=[],h=e.replace(/^\s+|\s+$/,"").replace(/'/g,"'").replace(/"/gi,"'").replace(/[\d.]+(cm|pt)/g,function(a){return utils.transUnitToPx(a)}).split(/;\s*/g),i=0;f=h[i];i++){var j,k,l=f.split(":");if(2==l.length){if(j=l[0].toLowerCase(),k=l[1].toLowerCase(),/^(background)\w*/.test(j)&&0==k.replace(/(initial|\s)/g,"").length||/^(margin)\w*/.test(j)&&/^0\w+$/.test(k))continue;switch(j){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":/1&&(a(h,j,!0),b(h,j)),c(k,h,i,j);break;case"text":d(g,h);break;case"element":e(g,h,i,j);break;case"comment":f(g,h,i)}return h}function d(a,b){"pre"==a.parentNode.tagName?b.push(a.data):b.push(l[a.parentNode.tagName]?utils.html(a.data):a.data.replace(/[ ]{2}/g,"  "))}function e(d,e,f,g){var h="";if(d.attrs){h=[];var i=d.attrs;for(var j in i)h.push(j+(void 0!==i[j]?'="'+(k[j]?utils.html(i[j]).replace(/["]/g,function(a){return"""}):utils.unhtml(i[j]))+'"':""));h=h.join(" ")}if(e.push("<"+d.tagName+(h?" "+h:"")+(dtd.$empty[d.tagName]?"/":"")+">"),f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g,!0),b(e,g)),d.children&&d.children.length)for(var l,m=0;l=d.children[m++];)f&&"element"==l.type&&!dtd.$inlineWithA[l.tagName]&&m>1&&(a(e,g),b(e,g)),c(l,e,f,g);dtd.$empty[d.tagName]||(f&&!dtd.$inlineWithA[d.tagName]&&"pre"!=d.tagName&&d.children&&d.children.length&&(g=a(e,g),b(e,g)),e.push(""))}function f(a,b){b.push("")}function g(a,b){var c;if("element"==a.type&&a.getAttr("id")==b)return a;if(a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)if(c=g(d,b))return c}function h(a,b,c){if("element"==a.type&&a.tagName==b&&c.push(a),a.children&&a.children.length)for(var d,e=0;d=a.children[e++];)h(d,b,c)}function i(a,b){if(a.children&&a.children.length)for(var c,d=0;c=a.children[d];)i(c,b),c.parentNode&&(c.children&&c.children.length&&b(c),c.parentNode&&d++);else b(a)}var j=UE.uNode=function(a){this.type=a.type,this.data=a.data,this.tagName=a.tagName,this.parentNode=a.parentNode,this.attrs=a.attrs||{},this.children=a.children},k={href:1,src:1,_src:1,_href:1,cdata_data:1},l={style:1,script:1},m=" ",n="\n";j.createElement=function(a){return/[<>]/.test(a)?UE.htmlparser(a).children[0]:new j({type:"element",children:[],tagName:a})},j.createText=function(a,b){return new UE.uNode({type:"text",data:b?a:utils.unhtml(a||"")})},j.prototype={toHtml:function(a){var b=[];return c(this,b,a,0),b.join("")},innerHTML:function(a){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(utils.isString(a)){if(this.children)for(var b,c=0;b=this.children[c++];)b.parentNode=null;this.children=[];for(var b,d=UE.htmlparser(a),c=0;b=d.children[c++];)this.children.push(b),b.parentNode=this;return this}var d=new UE.uNode({type:"root",children:this.children});return d.toHtml()},innerText:function(a,b){if("element"!=this.type||dtd.$empty[this.tagName])return this;if(a){if(this.children)for(var c,d=0;c=this.children[d++];)c.parentNode=null;return this.children=[],this.appendChild(j.createText(a,b)),this}return this.toHtml().replace(/<[^>]+>/g,"")},getData:function(){return"element"==this.type?"":this.data},firstChild:function(){return this.children?this.children[0]:null},lastChild:function(){return this.children?this.children[this.children.length-1]:null},previousSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return 0==c?null:b.children[c-1]},nextSibling:function(){for(var a,b=this.parentNode,c=0;a=b.children[c++];)if(a===this)return b.children[c]},replaceChild:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,1,a),b.parentNode=null,a.parentNode=this,a}},appendChild:function(a){if("root"==this.type||"element"==this.type&&!dtd.$empty[this.tagName]){this.children||(this.children=[]),a.parentNode&&a.parentNode.removeChild(a);for(var b,c=0;b=this.children[c];c++)if(b===a){this.children.splice(c,1);break}return this.children.push(a),a.parentNode=this,a}},insertBefore:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d,0,a),a.parentNode=this,a}},insertAfter:function(a,b){if(this.children){a.parentNode&&a.parentNode.removeChild(a);for(var c,d=0;c=this.children[d];d++)if(c===b)return this.children.splice(d+1,0,a),a.parentNode=this,a}},removeChild:function(a,b){if(this.children)for(var c,d=0;c=this.children[d];d++)if(c===a){if(this.children.splice(d,1),c.parentNode=null,b&&c.children&&c.children.length)for(var e,f=0;e=c.children[f];f++)this.children.splice(d+f,0,e),e.parentNode=this;return c}},getAttr:function(a){return this.attrs&&this.attrs[a.toLowerCase()]},setAttr:function(a,b){if(!a)return void delete this.attrs;if(this.attrs||(this.attrs={}),utils.isObject(a))for(var c in a)a[c]?this.attrs[c.toLowerCase()]=a[c]:delete this.attrs[c];else b?this.attrs[a.toLowerCase()]=b:delete this.attrs[a]},getIndex:function(){for(var a,b=this.parentNode,c=0;a=b.children[c];c++)if(a===this)return c;return-1},getNodeById:function(a){var b;if(this.children&&this.children.length)for(var c,d=0;c=this.children[d++];)if(b=g(c,a))return b},getNodesByTagName:function(a){a=utils.trim(a).replace(/[ ]{2,}/g," ").split(" ");var b=[],c=this;return utils.each(a,function(a){if(c.children&&c.children.length)for(var d,e=0;d=c.children[e++];)h(d,a,b)}),b},getStyle:function(a){var b=this.getAttr("style");if(!b)return"";var c=new RegExp("(^|;)\\s*"+a+":([^;]+)","i"),d=b.match(c);return d&&d[0]?d[2]:""},setStyle:function(a,b){function c(a,b){var c=new RegExp("(^|;)\\s*"+a+":([^;]+;?)","gi");d=d.replace(c,"$1"),b&&(d=a+":"+utils.unhtml(b)+";"+d)}var d=this.getAttr("style");if(d||(d=""),utils.isObject(a))for(var e in a)c(e,a[e]);else c(a,b);this.setAttr("style",utils.trim(d))},traversal:function(a){return this.children&&this.children.length&&i(this,a),this}}}();var htmlparser=UE.htmlparser=function(a,b){function c(a,b){if(m[a.tagName]){var c=k.createElement(m[a.tagName]);a.appendChild(c),c.appendChild(k.createText(b)),a=c}else a.appendChild(k.createText(b))}function d(a,b,c){var e;if(e=l[b]){for(var f,h=a;"root"!=h.type;){if(utils.isArray(e)?utils.indexOf(e,h.tagName)!=-1:e==h.tagName){a=h,f=!0;break}h=h.parentNode}f||(a=d(a,utils.isArray(e)?e[0]:e))}var i=new k({parentNode:a,type:"element",tagName:b.toLowerCase(),children:dtd.$empty[b]?null:[]});if(c){for(var m,n={};m=g.exec(c);)n[m[1].toLowerCase()]=j[m[1].toLowerCase()]?m[2]||m[3]||m[4]:utils.unhtml(m[2]||m[3]||m[4]);i.attrs=n}return a.children.push(i),dtd.$empty[b]?a:i}function e(a,b){a.children.push(new k({type:"comment",data:b,parentNode:a}))}var f=/<(?:(?:\/([^>]+)>)|(?:!--([\S|\s]*?)-->)|(?:([^\s\/<>]+)\s*((?:(?:"[^"]*")|(?:'[^']*')|[^"'<>])*)\/?>))/g,g=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,h={b:1,code:1,i:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,span:1,sub:1,img:1,sup:1,font:1,big:1,small:1,iframe:1,a:1,br:1,pre:1};a=a.replace(new RegExp(domUtils.fillChar,"g"),""),b||(a=a.replace(new RegExp("[\\r\\t\\n"+(b?"":" ")+"]*]*)>[\\r\\t\\n"+(b?"":" ")+"]*","g"),function(a,c){return c&&h[c.toLowerCase()]?a.replace(/(^[\n\r]+)|([\n\r]+$)/g,""):a.replace(new RegExp("^[\\r\\n"+(b?"":" ")+"]+"),"").replace(new RegExp("[\\r\\n"+(b?"":" ")+"]+$"),"")}));for(var i,j={href:1,src:1},k=UE.uNode,l={td:"tr",tr:["tbody","thead","tfoot"],tbody:"table",th:"tr",thead:"table",tfoot:"table",caption:"table",li:["ul","ol"],dt:"dl",dd:"dl",option:"select"},m={ol:"li",ul:"li"},n=0,o=0,p=new k({type:"root",children:[]}),q=p;i=f.exec(a);){n=i.index;try{if(n>o&&c(q,a.slice(o,n)),i[3])dtd.$cdata[q.tagName]?c(q,i[0]):q=d(q,i[3].toLowerCase(),i[4]);else if(i[1]){if("root"!=q.type)if(dtd.$cdata[q.tagName]&&!dtd.$cdata[i[1]])c(q,i[0]);else{for(var r=q;"element"==q.type&&q.tagName!=i[1].toLowerCase();)if(q=q.parentNode,"root"==q.type)throw q=r,"break";q=q.parentNode}}else i[2]&&e(q,i[2])}catch(s){}o=f.lastIndex}return o");break;case"div":if(b.getAttr("cdata_tag"))break;if(d=b.getAttr("class"),d&&/^line number\d+/.test(d))break;if(!e)break;for(var f,g=UE.uNode.createElement("p");f=b.firstChild();)"text"!=f.type&&UE.dom.dtd.$block[f.tagName]?g.firstChild()?(b.parentNode.insertBefore(g,b),g=UE.uNode.createElement("p")):b.parentNode.insertBefore(f,b):g.appendChild(f);g.firstChild()&&b.parentNode.insertBefore(g,b),b.parentNode.removeChild(b);break;case"dl":b.tagName="ul";break;case"dt":case"dd":b.tagName="li";break;case"li":var h=b.getAttr("class");h&&/list\-/.test(h)||b.setAttr();var i=b.getNodesByTagName("ol ul");UE.utils.each(i,function(a){b.parentNode.insertAfter(a,b)});break;case"td":case"th":case"caption":b.children&&b.children.length||b.appendChild(browser.ie11below?UE.uNode.createText(" "):UE.uNode.createElement("br"));break;case"table":a.options.disabledTableInTable&&c(b)&&(b.parentNode.insertBefore(UE.uNode.createText(b.innerText()),b),b.parentNode.removeChild(b))}}})}),a.addOutputRule(function(b){var c;b.traversal(function(b){if("element"==b.type){if(a.options.autoClearEmptyNode&&dtd.$inline[b.tagName]&&!dtd.$empty[b.tagName]&&(!b.attrs||utils.isEmptyObject(b.attrs)))return void(b.firstChild()?"span"!=b.tagName||b.attrs&&!utils.isEmptyObject(b.attrs)||b.parentNode.removeChild(b,!0):b.parentNode.removeChild(b));switch(b.tagName){case"div":(c=b.getAttr("cdata_tag"))&&(b.tagName=c,b.appendChild(UE.uNode.createText(b.getAttr("cdata_data"))),b.setAttr({cdata_tag:"",cdata_data:"",_ue_custom_node_:""}));break;case"a":(c=b.getAttr("_href"))&&b.setAttr({href:utils.html(c),_href:""});break;case"span":c=b.getAttr("id"),c&&/^_baidu_bookmark_/i.test(c)&&b.parentNode.removeChild(b);break;case"img":(c=b.getAttr("_src"))&&b.setAttr({src:b.getAttr("_src"),_src:""})}}})})},UE.commands.inserthtml={execCommand:function(a,b,c){var d,e,f=this;if(b&&f.fireEvent("beforeinserthtml",b)!==!0){if(d=f.selection.getRange(),e=d.document.createElement("div"),e.style.display="inline",!c){var g=UE.htmlparser(b);f.options.filterRules&&UE.filterNode(g,f.options.filterRules),f.filterInputRule(g),b=g.toHtml()}if(e.innerHTML=utils.trim(b),!d.collapsed){var h=d.startContainer;if(domUtils.isFillChar(h)&&d.setStartBefore(h),h=d.endContainer,domUtils.isFillChar(h)&&d.setEndAfter(h),d.txtToElmBoundary(),d.endContainer&&1==d.endContainer.nodeType&&(h=d.endContainer.childNodes[d.endOffset],h&&domUtils.isBr(h)&&d.setEndAfter(h)),0==d.startOffset&&(h=d.startContainer,domUtils.isBoundaryNode(h,"firstChild")&&(h=d.endContainer,d.endOffset==(3==h.nodeType?h.nodeValue.length:h.childNodes.length)&&domUtils.isBoundaryNode(h,"lastChild")&&(f.body.innerHTML="

            "+(browser.ie?"":"
            ")+"

            ",d.setStart(f.body.firstChild,0).collapse(!0)))),!d.collapsed&&d.deleteContents(),1==d.startContainer.nodeType){var i,j=d.startContainer.childNodes[d.startOffset];if(j&&domUtils.isBlockElm(j)&&(i=j.previousSibling)&&domUtils.isBlockElm(i)){for(d.setEnd(i,i.childNodes.length).collapse();j.firstChild;)i.appendChild(j.firstChild);domUtils.remove(j)}}}var j,k,i,l,m,n=0;d.inFillChar()&&(j=d.startContainer,domUtils.isFillChar(j)?(d.setStartBefore(j).collapse(!0),domUtils.remove(j)):domUtils.isFillChar(j,!0)&&(j.nodeValue=j.nodeValue.replace(fillCharReg,""),d.startOffset--,d.collapsed&&d.collapse(!0)));var o=domUtils.findParentByTagName(d.startContainer,"li",!0);if(o){for(var p,q;j=e.firstChild;){for(;j&&(3==j.nodeType||!domUtils.isBlockElm(j)||"HR"==j.tagName);)p=j.nextSibling,d.insertNode(j).collapse(),q=j,j=p;if(j)if(/^(ol|ul)$/i.test(j.tagName)){for(;j.firstChild;)q=j.firstChild,domUtils.insertAfter(o,j.firstChild),o=o.nextSibling;domUtils.remove(j)}else{var r;p=j.nextSibling,r=f.document.createElement("li"),domUtils.insertAfter(o,r),r.appendChild(j),q=j,j=p,o=r}}o=domUtils.findParentByTagName(d.startContainer,"li",!0),domUtils.isEmptyBlock(o)&&domUtils.remove(o),q&&d.setStartAfter(q).collapse(!0).select(!0)}else{for(;j=e.firstChild;){if(n){for(var s=f.document.createElement("p");j&&(3==j.nodeType||!dtd.$block[j.tagName]);)m=j.nextSibling,s.appendChild(j),j=m;s.firstChild&&(j=s)}if(d.insertNode(j),m=j.nextSibling,!n&&j.nodeType==domUtils.NODE_ELEMENT&&domUtils.isBlockElm(j)&&(k=domUtils.findParent(j,function(a){return domUtils.isBlockElm(a)}),k&&"body"!=k.tagName.toLowerCase()&&(!dtd[k.tagName][j.nodeName]||j.parentNode!==k))){if(dtd[k.tagName][j.nodeName])for(l=j.parentNode;l!==k;)i=l,l=l.parentNode;else i=k;domUtils.breakParent(j,i||l);var i=j.previousSibling;domUtils.trimWhiteTextNode(i),i.childNodes.length||domUtils.remove(i),!browser.ie&&(p=j.nextSibling)&&domUtils.isBlockElm(p)&&p.lastChild&&!domUtils.isBr(p.lastChild)&&p.appendChild(f.document.createElement("br")),n=1}var p=j.nextSibling;if(!e.firstChild&&p&&domUtils.isBlockElm(p)){d.setStart(p,0).collapse(!0);break}d.setEndAfter(j).collapse()}if(j=d.startContainer,m&&domUtils.isBr(m)&&domUtils.remove(m),domUtils.isBlockElm(j)&&domUtils.isEmptyNode(j))if(m=j.nextSibling)domUtils.remove(j),1==m.nodeType&&dtd.$block[m.tagName]&&d.setStart(m,0).collapse(!0).shrinkBoundary();else try{j.innerHTML=browser.ie?domUtils.fillChar:"
            "}catch(t){d.setStartBefore(j),domUtils.remove(j)}try{d.select(!0)}catch(t){}}setTimeout(function(){d=f.selection.getRange(),d.scrollToView(f.autoHeightEnabled,f.autoHeightEnabled?domUtils.getXY(f.iframe).y:0),f.fireEvent("afterinserthtml",b)},200)}}},UE.plugins.autotypeset=function(){function a(a,b){return a&&3!=a.nodeType?domUtils.isBr(a)?1:a&&a.parentNode&&l[a.tagName.toLowerCase()]?g&&g.contains(a)||a.getAttribute("pagebreak")?0:b?!domUtils.isEmptyBlock(a):domUtils.isEmptyBlock(a,new RegExp("[\\s"+domUtils.fillChar+"]","g")):void 0:0}function b(a){a.style.cssText||(domUtils.removeAttributes(a,["style"]),"span"==a.tagName.toLowerCase()&&domUtils.hasNoAttributes(a)&&domUtils.remove(a,!0))}function c(c,f){var h,l=this;if(f){if(!i.pasteFilter)return;h=l.document.createElement("div"),h.innerHTML=f.html}else h=l.document.body;for(var m,n=domUtils.getElementsByTagName(h,"*"),o=0;m=n[o++];)if(l.fireEvent("excludeNodeinautotype",m)!==!0){if(i.clearFontSize&&m.style.fontSize&&(domUtils.removeStyle(m,"font-size"),b(m)),i.clearFontFamily&&m.style.fontFamily&&(domUtils.removeStyle(m,"font-family"),b(m)),a(m)){if(i.mergeEmptyline)for(var p,q=m.nextSibling,r=domUtils.isBr(m);a(q)&&(p=q,q=p.nextSibling,!r||q&&(!q||domUtils.isBr(q)));)domUtils.remove(p);if(i.removeEmptyline&&domUtils.inDoc(m,h)&&!k[m.parentNode.tagName.toLowerCase()]){if(domUtils.isBr(m)&&(q=m.nextSibling,q&&!domUtils.isBr(q)))continue;domUtils.remove(m);continue}}if(a(m,!0)&&"SPAN"!=m.tagName&&(i.indent&&(m.style.textIndent=i.indentValue),i.textAlign&&(m.style.textAlign=i.textAlign)),i.removeClass&&m.className&&!j[m.className.toLowerCase()]){if(g&&g.contains(m))continue;domUtils.removeAttributes(m,["class"])}if(i.imageBlockLine&&"img"==m.tagName.toLowerCase()&&!m.getAttribute("emotion"))if(f){var s=m;switch(i.imageBlockLine){case"left":case"right":case"none":for(var p,t,q,u=s.parentNode;dtd.$inline[u.tagName]||"A"==u.tagName;)u=u.parentNode;if(p=u,"P"==p.tagName&&"center"==domUtils.getStyle(p,"text-align")&&!domUtils.isBody(p)&&1==domUtils.getChildCount(p,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(t=p.previousSibling,q=p.nextSibling,t&&q&&1==t.nodeType&&1==q.nodeType&&t.tagName==q.tagName&&domUtils.isBlockElm(t)){for(t.appendChild(p.firstChild);q.firstChild;)t.appendChild(q.firstChild);domUtils.remove(p),domUtils.remove(q)}else domUtils.setStyle(p,"text-align","");domUtils.setStyle(s,"float",i.imageBlockLine);break;case"center":if("center"!=l.queryCommandValue("imagefloat")){for(u=s.parentNode,domUtils.setStyle(s,"float","none"),p=s;u&&1==domUtils.getChildCount(u,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[u.tagName]||"A"==u.tagName);)p=u,u=u.parentNode;var v=l.document.createElement("p");domUtils.setAttributes(v,{style:"text-align:center"}),p.parentNode.insertBefore(v,p),v.appendChild(p),domUtils.setStyle(p,"float","")}}}else{var w=l.selection.getRange();w.selectNode(m).select(),l.execCommand("imagefloat",i.imageBlockLine)}i.removeEmptyNode&&i.removeTagNames[m.tagName.toLowerCase()]&&domUtils.hasNoAttributes(m)&&domUtils.isEmptyBlock(m)&&domUtils.remove(m)}if(i.tobdc){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=e(a.data))}),h.innerHTML=x.toHtml()}if(i.bdc2sb){var x=UE.htmlparser(h.innerHTML);x.traversal(function(a){"text"==a.type&&(a.data=d(a.data))}),h.innerHTML=x.toHtml()}f&&(f.html=h.innerHTML)}function d(a){for(var b="",c=0;c=65281&&d<=65373?String.fromCharCode(a.charCodeAt(c)-65248):12288==d?String.fromCharCode(a.charCodeAt(c)-12288+32):a.charAt(c)}return b}function e(a){a=utils.html(a);for(var b="",c=0;c0?e.substring(e.indexOf(d.options.imagePath),e.length-1).replace(/"|\(|\)/gi,""):"none"!=e?e.replace(/url\("?|"?\)/gi,""):"";var g=' ",b.push(g)},aftersetcontent:function(){0==c&&b()}},inputRule:function(d){c=!1,utils.each(d.getNodesByTagName("p"),function(d){var e=d.getAttr("data-background");e&&(c=!0,b(a(e)),d.parentNode.removeChild(d))})},outputRule:function(a){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);c&&a.appendChild(UE.uNode.createElement('


            '))},commands:{background:{execCommand:function(a,c){b(c)},queryCommandValue:function(){var b=this,c=(utils.cssRule(e,b.document)||"").replace(/[\n\r]+/g,"").match(f);return c?a(c[1]):null},notNeedUndo:!0}}}}),UE.commands.imagefloat={execCommand:function(a,b){var c=this,d=c.selection.getRange();if(!d.collapsed){var e=d.getClosedNode();if(e&&"IMG"==e.tagName)switch(b){case"left":case"right":case"none":for(var f,g,h,i=e.parentNode;dtd.$inline[i.tagName]||"A"==i.tagName;)i=i.parentNode;if(f=i,"P"==f.tagName&&"center"==domUtils.getStyle(f,"text-align")){if(!domUtils.isBody(f)&&1==domUtils.getChildCount(f,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)}))if(g=f.previousSibling,h=f.nextSibling,g&&h&&1==g.nodeType&&1==h.nodeType&&g.tagName==h.tagName&&domUtils.isBlockElm(g)){for(g.appendChild(f.firstChild);h.firstChild;)g.appendChild(h.firstChild);domUtils.remove(f),domUtils.remove(h)}else domUtils.setStyle(f,"text-align","");d.selectNode(e).select()}domUtils.setStyle(e,"float","none"==b?"":b),"none"==b&&domUtils.removeAttributes(e,"align");break;case"center":if("center"!=c.queryCommandValue("imagefloat")){for(i=e.parentNode,domUtils.setStyle(e,"float",""),domUtils.removeAttributes(e,"align"),f=e;i&&1==domUtils.getChildCount(i,function(a){return!domUtils.isBr(a)&&!domUtils.isWhitespace(a)})&&(dtd.$inline[i.tagName]||"A"==i.tagName);)f=i,i=i.parentNode;d.setStartBefore(f).setCursor(!1),i=c.document.createElement("div"),i.appendChild(f),domUtils.setStyle(f,"float",""),c.execCommand("insertHtml",'

            '+i.innerHTML+"

            "),f=c.document.getElementById("_img_parent_tmp"),f.removeAttribute("id"),f=f.firstChild,d.selectNode(f).select(),h=f.parentNode.nextSibling,h&&domUtils.isEmptyNode(h)&&domUtils.remove(h)}}}},queryCommandValue:function(){var a,b,c=this.selection.getRange();return c.collapsed?"none":(a=c.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?(b=domUtils.getComputedStyle(a,"float")||a.getAttribute("align"),"none"==b&&(b="center"==domUtils.getComputedStyle(a.parentNode,"text-align")?"center":b),{left:1,right:1,center:1}[b]?b:"none"):"none")},queryCommandState:function(){var a,b=this.selection.getRange();return b.collapsed?-1:(a=b.getClosedNode(),a&&1==a.nodeType&&"IMG"==a.tagName?0:-1)}},UE.commands.insertimage={execCommand:function(a,b){function c(a){utils.each("width,height,border,hspace,vspace".split(","),function(b){a[b]&&(a[b]=parseInt(a[b],10)||0)}),utils.each("src,_src".split(","),function(b){a[b]&&(a[b]=utils.unhtmlForUrl(a[b]))}),utils.each("title,alt".split(","),function(b){a[b]&&(a[b]=utils.unhtml(a[b]))})}if(b=utils.isArray(b)?b:[b],b.length){var d=this,e=d.selection.getRange(),f=e.getClosedNode();if(d.fireEvent("beforeinsertimage",b)!==!0){if(!f||!/img/i.test(f.tagName)||"edui-faked-video"==f.className&&f.className.indexOf("edui-upload-video")==-1||f.getAttribute("word_img")){var g,h=[],i="";if(g=b[0],1==b.length)c(g),i=''+g.alt+'","center"==g.floatStyle&&(i='

            '+i+"

            "),h.push(i);else for(var j=0;g=b[j++];)c(g),i="

            ",h.push(i);d.execCommand("insertHtml",h.join(""))}else{var k=b.shift(),l=k.floatStyle;delete k.floatStyle,domUtils.setAttributes(f,k),d.execCommand("imagefloat",l),b.length>0&&(e.setStartAfter(f).setCursor(!1,!0),d.execCommand("insertimage",b))}d.fireEvent("afterinsertimage",b)}}}},UE.plugins.justify=function(){var a=domUtils.isBlockElm,b={left:1,right:1,center:1,justify:1},c=function(b,c){var d=b.createBookmark(),e=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};b.enlarge(!0);for(var f,g=b.createBookmark(),h=domUtils.getNextDomNode(g.start,!1,e),i=b.cloneRange();h&&!(domUtils.getPosition(h,g.end)&domUtils.POSITION_FOLLOWING);)if(3!=h.nodeType&&a(h))h=domUtils.getNextDomNode(h,!0,e);else{for(i.setStartBefore(h);h&&h!==g.end&&!a(h);)f=h,h=domUtils.getNextDomNode(h,!1,null,function(b){return!a(b)});i.setEndAfter(f);var j=i.getCommonAncestor();if(!domUtils.isBody(j)&&a(j))domUtils.setStyles(j,utils.isString(c)?{"text-align":c}:c),h=j;else{var k=b.document.createElement("p");domUtils.setStyles(k,utils.isString(c)?{"text-align":c}:c);var l=i.extractContents();k.appendChild(l),i.insertNode(k),h=k}h=domUtils.getNextDomNode(h,!1,e)}return b.moveToBookmark(g).moveToBookmark(d)};UE.commands.justify={execCommand:function(a,b){var d,e=this.selection.getRange();return e.collapsed&&(d=this.document.createTextNode("p"),e.insertNode(d)),c(e,b),d&&(e.setStartBefore(d).collapse(!0),domUtils.remove(d)),e.select(),!0},queryCommandValue:function(){var a=this.selection.getStart(),c=domUtils.getComputedStyle(a,"text-align");return b[c]?c:"left"},queryCommandState:function(){var a=this.selection.getStart(),b=a&&domUtils.findParentByTagName(a,["td","th","caption"],!0);return b?-1:0}}},UE.plugins.font=function(){function a(a){for(var b;(b=a.parentNode)&&"SPAN"==b.tagName&&1==domUtils.getChildCount(b,function(a){return!domUtils.isBookmarkNode(a)&&!domUtils.isBr(a)});)b.style.cssText+=a.style.cssText,domUtils.remove(a,!0),a=b}function b(a,b,c){if(g[b]&&(a.adjustmentBoundary(),!a.collapsed&&1==a.startContainer.nodeType)){var d=a.startContainer.childNodes[a.startOffset];if(d&&domUtils.isTagNode(d,"span")){var e=a.createBookmark();utils.each(domUtils.getElementsByTagName(d,"span"),function(a){a.parentNode&&!domUtils.isBookmarkNode(a)&&("backcolor"==b&&domUtils.getComputedStyle(a,"background-color").toLowerCase()===c||(domUtils.removeStyle(a,g[b]),0==a.style.cssText.replace(/^\s+$/,"").length&&domUtils.remove(a,!0)))}),a.moveToBookmark(e)}}}function c(c,d,e){var f,g=c.collapsed,h=c.createBookmark();if(g)for(f=h.start.parentNode;dtd.$inline[f.tagName];)f=f.parentNode;else f=domUtils.getCommonAncestor(h.start,h.end);utils.each(domUtils.getElementsByTagName(f,"span"),function(b){if(b.parentNode&&!domUtils.isBookmarkNode(b)){if(/\s*border\s*:\s*none;?\s*/i.test(b.style.cssText))return void(/^\s*border\s*:\s*none;?\s*$/.test(b.style.cssText)?domUtils.remove(b,!0):domUtils.removeStyle(b,"border"));if(/border/i.test(b.style.cssText)&&"SPAN"==b.parentNode.tagName&&/border/i.test(b.parentNode.style.cssText)&&(b.style.cssText=b.style.cssText.replace(/border[^:]*:[^;]+;?/gi,"")),"fontborder"!=d||"none"!=e)for(var c=b.nextSibling;c&&1==c.nodeType&&"SPAN"==c.tagName;)if(domUtils.isBookmarkNode(c)&&"fontborder"==d)b.appendChild(c),c=b.nextSibling;else{if(c.style.cssText==b.style.cssText&&(domUtils.moveChild(c,b),domUtils.remove(c)),b.nextSibling===c)break;c=b.nextSibling}if(a(b),browser.ie&&browser.version>8){var f=domUtils.findParent(b,function(a){return"SPAN"==a.tagName&&/background-color/.test(a.style.cssText)});f&&!/background-color/.test(b.style.cssText)&&(b.style.backgroundColor=f.style.backgroundColor)}}}),c.moveToBookmark(h),b(c,d,e)}var d=this,e={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family",underline:"text-decoration",strikethrough:"text-decoration",fontborder:"border"},f={underline:1,strikethrough:1,fontborder:1},g={forecolor:"color",backcolor:"background-color",fontsize:"font-size",fontfamily:"font-family"};d.setOpt({fontfamily:[{name:"songti",val:"宋体,SimSun"},{name:"yahei",val:"微软雅黑,Microsoft YaHei"},{name:"kaiti",val:"楷体,楷体_GB2312, SimKai"},{name:"heiti",val:"黑体, SimHei"},{name:"lishu",val:"隶书, SimLi"},{name:"andaleMono",val:"andale mono"},{name:"arial",val:"arial, helvetica,sans-serif"},{name:"arialBlack",val:"arial black,avant garde"},{name:"comicSansMs",val:"comic sans ms"},{name:"impact",val:"impact,chicago"},{name:"timesNewRoman",val:"times new roman"}],fontsize:[10,11,12,14,16,18,20,24,36]}),d.addInputRule(function(a){utils.each(a.getNodesByTagName("u s del font strike"),function(a){if("font"==a.tagName){var b=[];for(var c in a.attrs)switch(c){case"size":b.push("font-size:"+({1:"10",2:"12",3:"16",4:"18",5:"24",6:"32",7:"48"}[a.attrs[c]]||a.attrs[c])+"px");break;case"color":b.push("color:"+a.attrs[c]);break;case"face":b.push("font-family:"+a.attrs[c]);break;case"style":b.push(a.attrs[c])}a.attrs={style:b.join(";")}}else{var d="u"==a.tagName?"underline":"line-through";a.attrs={style:(a.getAttr("style")||"")+"text-decoration:"+d+";"}}a.tagName="span"})});for(var h in e)!function(a,b){UE.commands[a]={execCommand:function(d,e){e=e||(this.queryCommandState(d)?"none":"underline"==d?"underline":"fontborder"==d?"1px solid #000":"line-through");var g,h=this,i=this.selection.getRange();if("default"==e)i.collapsed&&(g=h.document.createTextNode("font"),i.insertNode(g).select()),h.execCommand("removeFormat","span,a",b),g&&(i.setStartBefore(g).collapse(!0),domUtils.remove(g)),c(i,d,e),i.select();else if(i.collapsed){var j=domUtils.findParentByTagName(i.startContainer,"span",!0);if(g=h.document.createTextNode("font"),!j||j.children.length||j[browser.ie?"innerText":"textContent"].replace(fillCharReg,"").length){if(i.insertNode(g),i.selectNode(g).select(),j=i.document.createElement("span"),f[a]){if(domUtils.findParentByTagName(g,"a",!0))return i.setStartBefore(g).setCursor(),void domUtils.remove(g);h.execCommand("removeFormat","span,a",b)}if(j.style.cssText=b+":"+e,g.parentNode.insertBefore(j,g),!browser.ie||browser.ie&&9==browser.version)for(var k=j.parentNode;!domUtils.isBlockElm(k);)"SPAN"==k.tagName&&(j.style.cssText=k.style.cssText+";"+j.style.cssText),k=k.parentNode;opera?setTimeout(function(){i.setStart(j,0).collapse(!0),c(i,d,e),i.select()}):(i.setStart(j,0).collapse(!0),c(i,d,e),i.select())}else i.insertNode(g),f[a]&&(i.selectNode(g).select(),h.execCommand("removeFormat","span,a",b,null),j=domUtils.findParentByTagName(g,"span",!0),i.setStartBefore(g)),j&&(j.style.cssText+=";"+b+":"+e),i.collapse(!0).select();domUtils.remove(g)}else f[a]&&h.queryCommandValue(a)&&h.execCommand("removeFormat","span,a",b),i=h.selection.getRange(),i.applyInlineStyle("span",{style:b+":"+e}),c(i,d,e),i.select();return!0},queryCommandValue:function(a){var c=this.selection.getStart();if("underline"==a||"strikethrough"==a){for(var d,e=c;e&&!domUtils.isBlockElm(e)&&!domUtils.isBody(e);){if(1==e.nodeType&&(d=domUtils.getComputedStyle(e,b),"none"!=d))return d;e=e.parentNode}return"none"}if("fontborder"==a){for(var f,g=c;g&&dtd.$inline[g.tagName];){if((f=domUtils.getComputedStyle(g,"border"))&&/1px/.test(f)&&/solid/.test(f))return f;g=g.parentNode}return""}if("FontSize"==a){var h=domUtils.getComputedStyle(c,b),g=/^([\d\.]+)(\w+)$/.exec(h);return g?Math.floor(g[1])+g[2]:h}return domUtils.getComputedStyle(c,b)},queryCommandState:function(a){if(!f[a])return 0;var b=this.queryCommandValue(a);return"fontborder"==a?/1px/.test(b)&&/solid/.test(b):"underline"==a?/underline/.test(b):/line\-through/.test(b)}}}(h,e[h])},UE.plugins.link=function(){function a(a){var b=a.startContainer,c=a.endContainer;(b=domUtils.findParentByTagName(b,"a",!0))&&a.setStartBefore(b),(c=domUtils.findParentByTagName(c,"a",!0))&&a.setEndAfter(c)}function b(b,c,d){var e=b.cloneRange(),f=d.queryCommandValue("link");a(b=b.adjustmentBoundary());var g=b.startContainer;if(1==g.nodeType&&f&&(g=g.childNodes[b.startOffset],g&&1==g.nodeType&&"A"==g.tagName&&/^(?:https?|ftp|file)\s*:\s*\/\//.test(g[browser.ie?"innerText":"textContent"])&&(g[browser.ie?"innerText":"textContent"]=utils.html(c.textValue||c.href))),e.collapsed&&!f||(b.removeInlineStyle("a"),e=b.cloneRange()),e.collapsed){var h=b.document.createElement("a"),i="";c.textValue?(i=utils.html(c.textValue),delete c.textValue):i=utils.html(c.href),domUtils.setAttributes(h,c),g=domUtils.findParentByTagName(e.startContainer,"a",!0),g&&domUtils.isInNodeEndBoundary(e,g)&&b.setStartAfter(g).collapse(!0),h[browser.ie?"innerText":"textContent"]=i,b.insertNode(h).selectNode(h)}else b.applyInlineStyle("a",c)}UE.commands.unlink={execCommand:function(){var b,c=this.selection.getRange();c.collapsed&&!domUtils.findParentByTagName(c.startContainer,"a",!0)||(b=c.createBookmark(),a(c),c.removeInlineStyle("a").moveToBookmark(b).select())},queryCommandState:function(){return!this.highlight&&this.queryCommandValue("link")?0:-1}},UE.commands.link={execCommand:function(a,c){var d;c._href&&(c._href=utils.unhtml(c._href,/[<">]/g)),c.href&&(c.href=utils.unhtml(c.href,/[<">]/g)),c.textValue&&(c.textValue=utils.unhtml(c.textValue,/[<">]/g)),b(d=this.selection.getRange(),c,this),d.collapse().select(!0)},queryCommandValue:function(){var a,b=this.selection.getRange();if(!b.collapsed){b.shrinkBoundary();var c=3!=b.startContainer.nodeType&&b.startContainer.childNodes[b.startOffset]?b.startContainer.childNodes[b.startOffset]:b.startContainer,d=3==b.endContainer.nodeType||0==b.endOffset?b.endContainer:b.endContainer.childNodes[b.endOffset-1],e=b.getCommonAncestor();if(a=domUtils.findParentByTagName(e,"a",!0),!a&&1==e.nodeType)for(var f,g,h,i=e.getElementsByTagName("a"),j=0;h=i[j++];)if(f=domUtils.getPosition(h,c),g=domUtils.getPosition(h,d),(f&domUtils.POSITION_FOLLOWING||f&domUtils.POSITION_CONTAINS)&&(g&domUtils.POSITION_PRECEDING||g&domUtils.POSITION_CONTAINS)){a=h;break}return a}if(a=b.startContainer,a=1==a.nodeType?a:a.parentNode,a&&(a=domUtils.findParentByTagName(a,"a",!0))&&!domUtils.isInNodeEndBoundary(b,a))return a},queryCommandState:function(){var a=this.selection.getRange().getClosedNode(),b=a&&("edui-faked-video"==a.className||a.className.indexOf("edui-upload-video")!=-1);return b?-1:0}}},UE.plugins.insertframe=function(){function a(){b._iframe&&delete b._iframe}var b=this;b.addListener("selectionchange",function(){a()})},UE.commands.scrawl={queryCommandState:function(){return browser.ie&&browser.version<=8?-1:0}},UE.plugins.removeformat=function(){var a=this;a.setOpt({removeFormatTags:"b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var",removeFormatAttributes:"class,style,lang,width,height,align,hspace,valign"}),a.commands.removeformat={execCommand:function(a,b,c,d,e){function f(a){if(3==a.nodeType||"span"!=a.tagName.toLowerCase())return 0;if(browser.ie){var b=a.attributes;if(b.length){for(var c=0,d=b.length;c
            "+this.getContent(null,null,!0)+"
            "),b.close()},notNeedUndo:1},UE.plugins.selectall=function(){var a=this;a.commands.selectall={execCommand:function(){var a=this,b=a.body,c=a.selection.getRange();c.selectNodeContents(b),domUtils.isEmptyBlock(b)&&(browser.opera&&b.firstChild&&1==b.firstChild.nodeType&&c.setStartAtFirst(b.firstChild),c.collapse(!0)),c.select(!0)},notNeedUndo:1},a.addshortcutkey({selectAll:"ctrl+65"})},UE.plugins.paragraph=function(){var a=this,b=domUtils.isBlockElm,c=["TD","LI","PRE"],d=function(a,d,e,f){var g,h=a.createBookmark(),i=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase()&&!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)};a.enlarge(!0);for(var j,k=a.createBookmark(),l=domUtils.getNextDomNode(k.start,!1,i),m=a.cloneRange();l&&!(domUtils.getPosition(l,k.end)&domUtils.POSITION_FOLLOWING);)if(3!=l.nodeType&&b(l))l=domUtils.getNextDomNode(l,!0,i);else{for(m.setStartBefore(l);l&&l!==k.end&&!b(l);)j=l,l=domUtils.getNextDomNode(l,!1,null,function(a){return!b(a)});m.setEndAfter(j),g=a.document.createElement(d),e&&(domUtils.setAttributes(g,e),f&&"customstyle"==f&&e.style&&(g.style.cssText=e.style)),g.appendChild(m.extractContents()),domUtils.isEmptyNode(g)&&domUtils.fillChar(a.document,g),m.insertNode(g);var n=g.parentNode;b(n)&&!domUtils.isBody(g.parentNode)&&utils.indexOf(c,n.tagName)==-1&&(f&&"customstyle"==f||(n.getAttribute("dir")&&g.setAttribute("dir",n.getAttribute("dir")),n.style.cssText&&(g.style.cssText=n.style.cssText+";"+g.style.cssText),n.style.textAlign&&!g.style.textAlign&&(g.style.textAlign=n.style.textAlign),n.style.textIndent&&!g.style.textIndent&&(g.style.textIndent=n.style.textIndent),n.style.padding&&!g.style.padding&&(g.style.padding=n.style.padding)),e&&/h\d/i.test(n.tagName)&&!/h\d/i.test(g.tagName)?(domUtils.setAttributes(n,e),f&&"customstyle"==f&&e.style&&(n.style.cssText=e.style),domUtils.remove(g,!0),g=n):domUtils.remove(g.parentNode,!0)),l=utils.indexOf(c,n.tagName)!=-1?n:g,l=domUtils.getNextDomNode(l,!1,i)}return a.moveToBookmark(k).moveToBookmark(h)};a.setOpt("paragraph",{p:"",h1:"",h2:"",h3:"",h4:"",h5:"",h6:""}),a.commands.paragraph={execCommand:function(a,b,c,e){var f=this.selection.getRange();if(f.collapsed){var g=this.document.createTextNode("p");if(f.insertNode(g),browser.ie){var h=g.previousSibling;h&&domUtils.isWhitespace(h)&&domUtils.remove(h),h=g.nextSibling,h&&domUtils.isWhitespace(h)&&domUtils.remove(h)}}if(f=d(f,b,c,e),g&&(f.setStartBefore(g).collapse(!0),pN=g.parentNode,domUtils.remove(g),domUtils.isBlockElm(pN)&&domUtils.isEmptyNode(pN)&&domUtils.fillNode(this.document,pN)),browser.gecko&&f.collapsed&&1==f.startContainer.nodeType){var i=f.startContainer.childNodes[f.startOffset];i&&1==i.nodeType&&i.tagName.toLowerCase()==b&&f.setStart(i,0).collapse(!0)}return f.select(),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),"p h1 h2 h3 h4 h5 h6");return a?a.tagName.toLowerCase():""}}},function(){var a=domUtils.isBlockElm,b=function(a){return domUtils.filterNodeList(a.selection.getStartElementPath(),function(a){return a&&1==a.nodeType&&a.getAttribute("dir")})},c=function(c,d,e){var f,g=function(a){return 1==a.nodeType?!domUtils.isBookmarkNode(a):!domUtils.isWhitespace(a)},h=b(d);if(h&&c.collapsed)return h.setAttribute("dir",e),c;f=c.createBookmark(),c.enlarge(!0);for(var i,j=c.createBookmark(),k=domUtils.getNextDomNode(j.start,!1,g),l=c.cloneRange();k&&!(domUtils.getPosition(k,j.end)&domUtils.POSITION_FOLLOWING);)if(3!=k.nodeType&&a(k))k=domUtils.getNextDomNode(k,!0,g);else{for(l.setStartBefore(k);k&&k!==j.end&&!a(k);)i=k,k=domUtils.getNextDomNode(k,!1,null,function(b){return!a(b)});l.setEndAfter(i);var m=l.getCommonAncestor();if(!domUtils.isBody(m)&&a(m))m.setAttribute("dir",e),k=m;else{var n=c.document.createElement("p");n.setAttribute("dir",e);var o=l.extractContents();n.appendChild(o),l.insertNode(n),k=n}k=domUtils.getNextDomNode(k,!1,g)}return c.moveToBookmark(j).moveToBookmark(f)};UE.commands.directionality={execCommand:function(a,b){var d=this.selection.getRange();if(d.collapsed){var e=this.document.createTextNode("d");d.insertNode(e)}return c(d,this,b),e&&(d.setStartBefore(e).collapse(!0),domUtils.remove(e)),d.select(),!0},queryCommandValue:function(){var a=b(this);return a?a.getAttribute("dir"):"ltr"}}}(),UE.plugins.horizontal=function(){var a=this;a.commands.horizontal={execCommand:function(a){var b=this;if(b.queryCommandState(a)!==-1){b.execCommand("insertHtml","
            ");var c=b.selection.getRange(),d=c.startContainer;if(1==d.nodeType&&!d.childNodes[c.startOffset]){var e;(e=d.childNodes[c.startOffset-1])&&1==e.nodeType&&"HR"==e.tagName&&("p"==b.options.enterTag?(e=b.document.createElement("p"),c.insertNode(e),c.setStart(e,0).setCursor()):(e=b.document.createElement("br"),c.insertNode(e),c.setStartBefore(e).setCursor()))}return!0}},queryCommandState:function(){return domUtils.filterNodeList(this.selection.getStartElementPath(),"table")?-1:0}},a.addListener("delkeydown",function(a,b){var c=this.selection.getRange();if(c.txtToElmBoundary(!0),domUtils.isStartInblock(c)){var d=c.startContainer,e=d.previousSibling;if(e&&domUtils.isTagNode(e,"hr"))return domUtils.remove(e),c.select(),domUtils.preventDefault(b),!0}})},UE.commands.time=UE.commands.date={execCommand:function(a,b){function c(a,b){var c=("0"+a.getHours()).slice(-2),d=("0"+a.getMinutes()).slice(-2),e=("0"+a.getSeconds()).slice(-2);return b=b||"hh:ii:ss",b.replace(/hh/gi,c).replace(/ii/gi,d).replace(/ss/gi,e)}function d(a,b){var c=("000"+a.getFullYear()).slice(-4),d=c.slice(-2),e=("0"+(a.getMonth()+1)).slice(-2),f=("0"+a.getDate()).slice(-2);return b=b||"yyyy-mm-dd",b.replace(/yyyy/gi,c).replace(/yy/gi,d).replace(/mm/gi,e).replace(/dd/gi,f)}var e=new Date;this.execCommand("insertHtml","time"==a?c(e,b):d(e,b))}},UE.plugins.rowspacing=function(){var a=this;a.setOpt({rowspacingtop:["5","10","15","20","25"],rowspacingbottom:["5","10","15","20","25"]}),a.commands.rowspacing={execCommand:function(a,b,c){return this.execCommand("paragraph","p",{style:"margin-"+c+":"+b+"px"}),!0},queryCommandValue:function(a,b){var c,d=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});return d?(c=domUtils.getComputedStyle(d,"margin-"+b).replace(/[^\d]/g,""),c?c:0):0}}},UE.plugins.lineheight=function(){var a=this;a.setOpt({lineheight:["1","1.5","1.75","2","3","4","5"]}),a.commands.lineheight={execCommand:function(a,b){return this.execCommand("paragraph","p",{style:"line-height:"+("1"==b?"normal":b+"em")}),!0},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return domUtils.isBlockElm(a)});if(a){var b=domUtils.getComputedStyle(a,"line-height");return"normal"==b?1:b.replace(/[^\d.]*/gi,"")}}}},UE.plugins.insertcode=function(){var a=this;a.ready(function(){utils.cssRule("pre","pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",a.document)}),a.setOpt("insertcode",{as3:"ActionScript3",bash:"Bash/Shell",cpp:"C/C++",css:"Css",cf:"CodeFunction","c#":"C#",delphi:"Delphi",diff:"Diff",erlang:"Erlang",groovy:"Groovy",html:"Html",java:"Java",jfx:"JavaFx",js:"Javascript",pl:"Perl",php:"Php",plain:"Plain Text",ps:"PowerShell",python:"Python",ruby:"Ruby",scala:"Scala",sql:"Sql",vb:"Vb",xml:"Xml"}),a.commands.insertcode={execCommand:function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e)e.className="brush:"+b+";toolbar:false;";else{var f="";if(d.collapsed)f=browser.ie&&browser.ie11below?browser.version<=8?" ":"":"
            ";else{var g=d.extractContents(),h=c.document.createElement("div");h.appendChild(g),utils.each(UE.filterNode(UE.htmlparser(h.innerHTML.replace(/[\r\t]/g,"")),c.options.filterTxtRules).children,function(a){if(browser.ie&&browser.ie11below&&browser.version>8)"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""));else if(browser.ie&&browser.ie11below)"element"==a.type?"br"==a.tagName?f+="
            ":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="
            ":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/br>$/.test(f)||(f+="
            ")):f+=a.data+"
            ",!a.nextSibling()&&/
            $/.test(f)&&(f=f.replace(/
            $/,""));else if(f+="element"==a.type?dtd.$empty[a.tagName]?"":a.innerText():a.data,!/br\/?\s*>$/.test(f)){if(!a.nextSibling())return;f+="
            "}})}c.execCommand("inserthtml",'
            '+f+"
            ",!0),e=c.document.getElementById("coder"),domUtils.removeAttributes(e,"id");var i=e.previousSibling;i&&(3==i.nodeType&&1==i.nodeValue.length&&browser.ie&&6==browser.version||domUtils.isEmptyBlock(i))&&domUtils.remove(i);var d=c.selection.getRange();domUtils.isEmptyBlock(e)?d.setStart(e,0).setCursor(!1,!0):d.selectNodeContents(e).select()}},queryCommandValue:function(){var a=this.selection.getStartElementPath(),b="";return utils.each(a,function(a){if("PRE"==a.nodeName){var c=a.className.match(/brush:([^;]+)/);return b=c&&c[1]?c[1]:"",!1}}),b}},a.addInputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b=a.getNodesByTagName("br");if(b.length)return void(browser.ie&&browser.ie11below&&browser.version>8&&utils.each(b,function(a){var b=UE.uNode.createText("\n");a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}));if(!(browser.ie&&browser.ie11below&&browser.version>8)){var c=a.innerText().split(/\n/);a.innerHTML(""),utils.each(c,function(b){b.length&&a.appendChild(UE.uNode.createText(b)),a.appendChild(UE.uNode.createElement("br"))})}})}),a.addOutputRule(function(a){utils.each(a.getNodesByTagName("pre"),function(a){var b="";utils.each(a.children,function(a){b+="text"==a.type?a.data.replace(/[ ]/g," ").replace(/\n$/,""):"br"==a.tagName?"\n":dtd.$empty[a.tagName]?a.innerText():""}),a.innerText(b.replace(/( |\n)+$/,""))})}),a.notNeedCodeQuery={help:1,undo:1,redo:1,source:1,print:1,searchreplace:1,fullscreen:1,preview:1,insertparagraph:1,elementpath:1,insertcode:1,inserthtml:1,selectall:1};a.queryCommandState;a.queryCommandState=function(a){var b=this;return!b.notNeedCodeQuery[a.toLowerCase()]&&b.selection&&b.queryCommandValue("insertcode")?-1:UE.Editor.prototype.queryCommandState.apply(this,arguments)},a.addListener("beforeenterkeydown",function(){var b=a.selection.getRange(),c=domUtils.findParentByTagName(b.startContainer,"pre",!0);if(c){if(a.fireEvent("saveScene"),b.collapsed||b.deleteContents(),!browser.ie||browser.ie9above){var c,d=a.document.createElement("br");b.insertNode(d).setStartAfter(d).collapse(!0);var e=d.nextSibling;e||browser.ie&&!(browser.version>10)?b.setStartAfter(d):b.insertNode(d.cloneNode(!1)), +c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[\\s"+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([\\s"+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g&&(g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g))}b.collapse(!0).select(!0)}else if(browser.version>8){var i=a.document.createTextNode("\n"),j=b.startContainer;if(0==b.startOffset){var k=j.previousSibling;if(k){b.insertNode(i);var l=a.document.createTextNode(" ");b.setStartAfter(i).insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{b.insertNode(i).setStartAfter(i);var l=a.document.createTextNode(" ");j=b.startContainer.childNodes[b.startOffset],j&&!/^\n/.test(j.nodeValue)&&b.setStartBefore(i),b.insertNode(l).setStart(l,0).collapse(!0).select(!0)}}else{var d=a.document.createElement("br");b.insertNode(d),b.insertNode(a.document.createTextNode(domUtils.fillChar)),b.setStartAfter(d),c=d.previousSibling;for(var f;c;)if(f=c,c=c.previousSibling,!c||"BR"==c.nodeName){c=f;break}if(c){for(var g="";c&&"BR"!=c.nodeName&&new RegExp("^[ "+domUtils.fillChar+"]*$").test(c.nodeValue);)g+=c.nodeValue,c=c.nextSibling;if("BR"!=c.nodeName){var h=c.nodeValue.match(new RegExp("^([ "+domUtils.fillChar+"]+)"));h&&h[1]&&(g+=h[1])}g=a.document.createTextNode(g),b.insertNode(g).setStartAfter(g)}b.collapse(!0).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("tabkeydown",function(b,c){var d=a.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){if(a.fireEvent("saveScene"),c.shiftKey);else if(d.collapsed){var f=a.document.createTextNode(" ");d.insertNode(f).setStartAfter(f).collapse(!0).select(!0)}else{for(var g=d.createBookmark(),h=g.start.previousSibling;h;){if(e.firstChild===h&&!domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h);break}if(domUtils.isBr(h)){e.insertBefore(a.document.createTextNode(" "),h.nextSibling);break}h=h.previousSibling}var i=g.end;for(h=g.start.nextSibling,e.firstChild===g.start&&e.insertBefore(a.document.createTextNode(" "),h.nextSibling);h&&h!==i;){if(domUtils.isBr(h)&&h.nextSibling){if(h.nextSibling===i)break;e.insertBefore(a.document.createTextNode(" "),h.nextSibling)}h=h.nextSibling}d.moveToBookmark(g).select()}return a.fireEvent("saveScene"),!0}}),a.addListener("beforeinserthtml",function(a,b){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"pre",!0);if(e){d.collapsed||d.deleteContents();var f="";if(browser.ie&&browser.version>8){utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?f+="\n":dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?f+="\n":dtd.$empty[a.tagName]||(f+=b.innerText()):f+=b.data}),/\n$/.test(f)||(f+="\n")):f+=a.data+"\n",!a.nextSibling()&&/\n$/.test(f)&&(f=f.replace(/\n$/,""))});var g=c.document.createTextNode(utils.html(f.replace(/ /g," ")));d.insertNode(g).selectNode(g).select()}else{var h=c.document.createDocumentFragment();utils.each(UE.filterNode(UE.htmlparser(b),c.options.filterTxtRules).children,function(a){"element"==a.type?"br"==a.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||(utils.each(a.children,function(b){"element"==b.type?"br"==b.tagName?h.appendChild(c.document.createElement("br")):dtd.$empty[a.tagName]||h.appendChild(c.document.createTextNode(utils.html(b.innerText().replace(/ /g," ")))):h.appendChild(c.document.createTextNode(utils.html(b.data.replace(/ /g," "))))}),"BR"!=h.lastChild.nodeName&&h.appendChild(c.document.createElement("br"))):h.appendChild(c.document.createTextNode(utils.html(a.data.replace(/ /g," ")))),a.nextSibling()||"BR"!=h.lastChild.nodeName||h.removeChild(h.lastChild)}),d.insertNode(h).select()}return!0}}),a.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(40==d){var e,f=c.selection.getRange(),g=f.startContainer;if(f.collapsed&&(e=domUtils.findParentByTagName(f.startContainer,"pre",!0))&&!e.nextSibling){for(var h=e.lastChild;h&&"BR"==h.nodeName;)h=h.previousSibling;(h===g||f.startContainer===e&&f.startOffset==e.childNodes.length)&&(c.execCommand("insertparagraph"),domUtils.preventDefault(b))}}}),a.addListener("delkeydown",function(b,c){var d=this.selection.getRange();d.txtToElmBoundary(!0);var e=d.startContainer;if(domUtils.isTagNode(e,"pre")&&d.collapsed&&domUtils.isStartInblock(d)){var f=a.document.createElement("p");return domUtils.fillNode(a.document,f),e.parentNode.insertBefore(f,e),domUtils.remove(e),d.setStart(f,0).setCursor(!1,!0),domUtils.preventDefault(c),!0}})},UE.commands.cleardoc={execCommand:function(a){var b=this,c=b.options.enterTag,d=b.selection.getRange();"br"==c?(b.body.innerHTML="
            ",d.setStart(b.body,0).setCursor()):(b.body.innerHTML="

            "+(ie?"":"
            ")+"

            ",d.setStart(b.body.firstChild,0).setCursor(!1,!0)),setTimeout(function(){b.fireEvent("clearDoc")},0)}},UE.plugin.register("anchor",function(){return{bindEvents:{ready:function(){utils.cssRule("anchor",".anchorclass{background: url('"+this.options.themePath+this.options.theme+"/images/anchor.gif') no-repeat scroll left center transparent;cursor: auto;display: inline-block;height: 16px;width: 15px;}",this.document)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){var b;(b=a.getAttr("anchorname"))&&(a.tagName="a",a.setAttr({anchorname:"",name:b,"class":""}))})},inputRule:function(a){utils.each(a.getNodesByTagName("a"),function(a){var b;(b=a.getAttr("name"))&&!a.getAttr("href")&&(a.tagName="img",a.setAttr({anchorname:a.getAttr("name"),"class":"anchorclass"}),a.setAttr("name"))})},commands:{anchor:{execCommand:function(a,b){var c=this.selection.getRange(),d=c.getClosedNode();if(d&&d.getAttribute("anchorname"))b?d.setAttribute("anchorname",b):(c.setStartBefore(d).setCursor(),domUtils.remove(d));else if(b){var e=this.document.createElement("img");c.collapse(!0),domUtils.setAttributes(e,{anchorname:b,"class":"anchorclass"}),c.insertNode(e).setStartAfter(e).setCursor(!1,!0)}}}}}}),UE.plugins.wordcount=function(){var a=this;a.setOpt("wordCount",!0),a.addListener("contentchange",function(){a.fireEvent("wordcount")});var b;a.addListener("ready",function(){var a=this;domUtils.on(a.body,"keyup",function(c){var d=c.keyCode||c.which,e={16:1,18:1,20:1,37:1,38:1,39:1,40:1};d in e||(clearTimeout(b),b=setTimeout(function(){a.fireEvent("wordcount")},200))})})},UE.plugins.pagebreak=function(){function a(a){if(domUtils.isEmptyBlock(a)){for(var b,d=a.firstChild;d&&1==d.nodeType&&domUtils.isEmptyBlock(d);)b=d,d=d.firstChild;!b&&(b=a),domUtils.fillNode(c.document,b)}}function b(a){return a&&1==a.nodeType&&"HR"==a.tagName&&"pagebreak"==a.className}var c=this,d=["td"];c.setOpt("pageBreakTag","_ueditor_page_break_tag_"),c.ready(function(){utils.cssRule("pagebreak",".pagebreak{display:block;clear:both !important;cursor:default !important;width: 100% !important;margin:0;}",c.document)}),c.addInputRule(function(a){a.traversal(function(a){if("text"==a.type&&a.data==c.options.pageBreakTag){var b=UE.uNode.createElement('
            ');a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.addOutputRule(function(a){utils.each(a.getNodesByTagName("hr"),function(a){if("pagebreak"==a.getAttr("class")){var b=UE.uNode.createText(c.options.pageBreakTag);a.parentNode.insertBefore(b,a),a.parentNode.removeChild(a)}})}),c.commands.pagebreak={execCommand:function(){var e=c.selection.getRange(),f=c.document.createElement("hr");domUtils.setAttributes(f,{"class":"pagebreak",noshade:"noshade",size:"5"}),domUtils.unSelectable(f);var g,h=domUtils.findParentByTagName(e.startContainer,d,!0),i=[];if(h)switch(h.tagName){case"TD":if(g=h.parentNode,g.previousSibling)g.parentNode.insertBefore(f,g),i=domUtils.findParents(f);else{var j=domUtils.findParentByTagName(g,"table");j.parentNode.insertBefore(f,j),i=domUtils.findParents(f,!0)}g=i[1],f!==g&&domUtils.breakParent(f,g),c.fireEvent("afteradjusttable",c.document)}else{if(!e.collapsed){e.deleteContents();for(var k=e.startContainer;!domUtils.isBody(k)&&domUtils.isBlockElm(k)&&domUtils.isEmptyNode(k);)e.setStartBefore(k).collapse(!0),domUtils.remove(k),k=e.startContainer}e.insertNode(f);for(var l,g=f.parentNode;!domUtils.isBody(g);)domUtils.breakParent(f,g),l=f.nextSibling,l&&domUtils.isEmptyBlock(l)&&domUtils.remove(l),g=f.parentNode;l=f.nextSibling;var m=f.previousSibling;if(b(m)?domUtils.remove(m):m&&a(m),l)b(l)?domUtils.remove(l):a(l),e.setEndAfter(f).collapse(!1);else{var n=c.document.createElement("p");f.parentNode.appendChild(n),domUtils.fillNode(c.document,n),e.setStart(n,0).collapse(!0)}e.select(!0)}}}},UE.plugin.register("wordimage",function(){var a=this,b=[];return{commands:{wordimage:{execCommand:function(){for(var b,c=domUtils.getElementsByTagName(a.body,"img"),d=[],e=0;b=c[e++];){var f=b.getAttribute("word_img");f&&d.push(f)}return d},queryCommandState:function(){b=domUtils.getElementsByTagName(a.body,"img");for(var c,d=0;c=b[d++];)if(c.getAttribute("word_img"))return 1;return-1},notNeedUndo:!0}},inputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c=b.attrs,d=parseInt(c.width)<128||parseInt(c.height)<43,e=a.options,f=e.UEDITOR_HOME_URL+"themes/default/images/spacer.gif";c.src&&/^(?:(file:\/+))/.test(c.src)&&b.setAttr({width:c.width,height:c.height,alt:c.alt,word_img:c.src,src:f,style:"background:url("+(d?e.themePath+e.theme+"/images/word.gif":e.langPath+e.lang+"/images/localimage.png")+") no-repeat center center;border:1px solid #ddd"})})}}}),UE.plugins.dragdrop=function(){var a=this;a.ready(function(){domUtils.on(this.body,"dragend",function(){var b=a.selection.getRange(),c=b.getClosedNode()||a.selection.getStart();if(c&&"IMG"==c.tagName){for(var d,e=c.previousSibling;(d=c.nextSibling)&&1==d.nodeType&&"SPAN"==d.tagName&&!d.firstChild;)domUtils.remove(d);(!e||1!=e.nodeType||domUtils.isEmptyBlock(e))&&e||d&&(!d||domUtils.isEmptyBlock(d))||(e&&"P"==e.tagName&&!domUtils.isEmptyBlock(e)?(e.appendChild(c),domUtils.moveChild(d,e),domUtils.remove(d)):d&&"P"==d.tagName&&!domUtils.isEmptyBlock(d)&&d.insertBefore(c,d.firstChild),e&&"P"==e.tagName&&domUtils.isEmptyBlock(e)&&domUtils.remove(e),d&&"P"==d.tagName&&domUtils.isEmptyBlock(d)&&domUtils.remove(d),b.selectNode(c).select(),a.fireEvent("saveScene"))}})}),a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(13==d){var e,f=a.selection.getRange();(e=domUtils.findParentByTagName(f.startContainer,"p",!0))&&"center"==domUtils.getComputedStyle(e,"text-align")&&domUtils.removeStyle(e,"text-align")}})},UE.plugins.undo=function(){function a(a,b){if(a.length!=b.length)return 0;for(var c=0,d=a.length;cf&&this.list.shift(),this.index=this.list.length-1,this.clearKey(),this.update())},this.update=function(){this.hasRedo=!!this.list[this.index+1],this.hasUndo=!!this.list[this.index-1]},this.reset=function(){this.list=[],this.index=0,this.hasUndo=!1,this.hasRedo=!1,this.clearKey()},this.clearKey=function(){m=0,k=null}}var d,e=this,f=e.options.maxUndoCount||20,g=e.options.maxInputCount||20,h=new RegExp(domUtils.fillChar+"|","gi"),i={ol:1,ul:1,table:1,tbody:1,tr:1,body:1},j=e.options.autoClearEmptyNode;e.undoManger=new c,e.undoManger.editor=e,e.addListener("saveScene",function(){var a=Array.prototype.splice.call(arguments,1);this.undoManger.save.apply(this.undoManger,a)}),e.addListener("reset",function(a,b){b||this.undoManger.reset()}),e.commands.redo=e.commands.undo={execCommand:function(a){this.undoManger[a]()},queryCommandState:function(a){return this.undoManger["has"+("undo"==a.toLowerCase()?"Undo":"Redo")]?0:-1},notNeedUndo:1};var k,l={16:1,17:1,18:1,37:1,38:1,39:1,40:1},m=0,n=!1;e.addListener("ready",function(){domUtils.on(this.body,"compositionstart",function(){n=!0}),domUtils.on(this.body,"compositionend",function(){n=!1})}),e.addshortcutkey({Undo:"ctrl+90",Redo:"ctrl+89"});var o=!0;e.addListener("keydown",function(a,b){function c(a){a.undoManger.save(!1,!0),a.fireEvent("selectionchange")}var e=this,f=b.keyCode||b.which;if(!(l[f]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;if(!e.selection.getRange().collapsed)return e.undoManger.save(!1,!0),void(o=!1);0==e.undoManger.list.length&&e.undoManger.save(!0),clearTimeout(d),d=setTimeout(function(){if(n)var a=setInterval(function(){n||(c(e),clearInterval(a))},300);else c(e)},200),k=f,m++,m>=g&&c(e)}}),e.addListener("keyup",function(a,b){var c=b.keyCode||b.which;if(!(l[c]||b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){if(n)return;o||(this.undoManger.save(!1,!0),o=!0)}}),e.stopCmdUndo=function(){e.__hasEnterExecCommand=!0},e.startCmdUndo=function(){e.__hasEnterExecCommand=!1}},UE.plugin.register("copy",function(){function a(){ZeroClipboard.config({debug:!1,swfPath:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.swf"});var a=b.zeroclipboard=new ZeroClipboard;a.on("copy",function(a){var c=a.client,d=b.selection.getRange(),e=document.createElement("div");e.appendChild(d.cloneContents()),c.setText(e.innerText||e.textContent),c.setHtml(e.innerHTML),d.select()}),a.on("mouseover mouseout",function(a){var b=a.target;"mouseover"==a.type?domUtils.addClass(b,"edui-state-hover"):"mouseout"==a.type&&domUtils.removeClasses(b,"edui-state-hover")}),a.on("wrongflash noflash",function(){ZeroClipboard.destroy()})}var b=this;return{bindEvents:{ready:function(){browser.ie||(window.ZeroClipboard?a():utils.loadFile(document,{src:b.options.UEDITOR_HOME_URL+"third-party/zeroclipboard/ZeroClipboard.js",tag:"script",type:"text/javascript",defer:"defer"},function(){a()}))}},commands:{copy:{execCommand:function(a){b.document.execCommand("copy")||alert(b.getLang("copymsg"))}}}}}),UE.plugins.paste=function(){function a(a){var b=this.document;if(!b.getElementById("baidu_pastebin")){var c=this.selection.getRange(),d=c.createBookmark(),e=b.createElement("div");e.id="baidu_pastebin",browser.webkit&&e.appendChild(b.createTextNode(domUtils.fillChar+domUtils.fillChar)),b.body.appendChild(e),d.start.style.display="",e.style.cssText="position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:"+domUtils.getXY(d.start).y+"px",c.selectNodeContents(e).select(!0),setTimeout(function(){if(browser.webkit)for(var f,g=0,h=b.querySelectorAll("#baidu_pastebin");f=h[g++];){if(!domUtils.isEmptyNode(f)){e=f;break}domUtils.remove(f)}try{e.parentNode.removeChild(e)}catch(i){}c.moveToBookmark(d).select(!0),a(e)},0)}}function b(a){return a.replace(/<(\/?)([\w\-]+)([^>]*)>/gi,function(a,b,c,d){return c=c.toLowerCase(),{img:1}[c]?a:(d=d.replace(/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,function(a,b,c){return{src:1,href:1,name:1}[b.toLowerCase()]?b+"="+c+" ":""}),{span:1,div:1}[c]?"":"<"+b+c+" "+utils.trim(d)+">")})}function c(a){var c;if(a.firstChild){for(var h,i=domUtils.getElementsByTagName(a,"span"),j=0;h=i[j++];)"_baidu_cut_start"!=h.id&&"_baidu_cut_end"!=h.id||domUtils.remove(h);if(browser.webkit){for(var k,l=a.querySelectorAll("div br"),j=0;k=l[j++];){var m=k.parentNode;"DIV"==m.tagName&&1==m.childNodes.length&&(m.innerHTML="


            ",domUtils.remove(m))}for(var n,o=a.querySelectorAll("#baidu_pastebin"),j=0;n=o[j++];){var p=d.document.createElement("p");for(n.parentNode.insertBefore(p,n);n.firstChild;)p.appendChild(n.firstChild);domUtils.remove(n)}for(var q,r=a.querySelectorAll("meta"),j=0;q=r[j++];)domUtils.remove(q);var l=a.querySelectorAll("br");for(j=0;q=l[j++];)/^apple-/i.test(q.className)&&domUtils.remove(q)}if(browser.gecko){var s=a.querySelectorAll("[_moz_dirty]");for(j=0;q=s[j++];)q.removeAttribute("_moz_dirty")}if(!browser.ie)for(var q,t=a.querySelectorAll("span.Apple-style-span"),j=0;q=t[j++];)domUtils.remove(q,!0);c=a.innerHTML,c=UE.filterWord(c);var u=UE.htmlparser(c);if(d.options.filterRules&&UE.filterNode(u,d.options.filterRules),d.filterInputRule(u),browser.webkit){var v=u.lastChild();v&&"element"==v.type&&"br"==v.tagName&&u.removeChild(v),utils.each(d.body.querySelectorAll("div"),function(a){domUtils.isEmptyBlock(a)&&domUtils.remove(a,!0)})}if(c={html:u.toHtml()},d.fireEvent("beforepaste",c,u),!c.html)return;u=UE.htmlparser(c.html,!0),1===d.queryCommandState("pasteplain")?d.execCommand("insertHtml",UE.filterNode(u,d.options.filterTxtRules).toHtml(),!0):(UE.filterNode(u,d.options.filterTxtRules),e=u.toHtml(),f=c.html,g=d.selection.getRange().createAddress(!0),d.execCommand("insertHtml",d.getOpt("retainOnlyLabelPasted")===!0?b(f):f,!0)),d.fireEvent("afterpaste",c)}}var d=this;d.setOpt({retainOnlyLabelPasted:!1});var e,f,g;d.addListener("pasteTransfer",function(a,c){if(g&&e&&f&&e!=f){var h=d.selection.getRange();if(h.moveToAddress(g,!0),!h.collapsed){for(;!domUtils.isBody(h.startContainer);){var i=h.startContainer;if(1==i.nodeType){if(i=i.childNodes[h.startOffset],!i){h.setStartBefore(h.startContainer);continue}var j=i.previousSibling;j&&3==j.nodeType&&new RegExp("^[\n\r\t "+domUtils.fillChar+"]*$").test(j.nodeValue)&&h.setStartBefore(j)}if(0!=h.startOffset)break;h.setStartBefore(h.startContainer)}for(;!domUtils.isBody(h.endContainer);){var k=h.endContainer;if(1==k.nodeType){if(k=k.childNodes[h.endOffset],!k){h.setEndAfter(h.endContainer);continue}var l=k.nextSibling;l&&3==l.nodeType&&new RegExp("^[\n\r\t"+domUtils.fillChar+"]*$").test(l.nodeValue)&&h.setEndAfter(l)}if(h.endOffset!=h.endContainer[3==h.endContainer.nodeType?"nodeValue":"childNodes"].length)break;h.setEndAfter(h.endContainer)}}h.deleteContents(),h.select(!0),d.__hasEnterExecCommand=!0;var m=f;2===c?m=b(m):c&&(m=e),d.execCommand("inserthtml",m,!0),d.__hasEnterExecCommand=!1;for(var n=d.selection.getRange();!domUtils.isBody(n.startContainer)&&!n.startOffset&&n.startContainer[3==n.startContainer.nodeType?"nodeValue":"childNodes"].length;)n.setStartBefore(n.startContainer);var o=n.createAddress(!0);g.endAddress=o.startAddress}}),d.addListener("ready",function(){domUtils.on(d.body,"cut",function(){var a=d.selection.getRange();!a.collapsed&&d.undoManger&&d.undoManger.save()}),domUtils.on(d.body,browser.ie||browser.opera?"keydown":"paste",function(b){(!browser.ie&&!browser.opera||(b.ctrlKey||b.metaKey)&&"86"==b.keyCode)&&a.call(d,function(a){c(a)})})}),d.commands.paste={execCommand:function(b){browser.ie?(a.call(d,function(a){c(a)}),d.document.execCommand("paste")):alert(d.getLang("pastemsg"))}}},UE.plugins.pasteplain=function(){var a=this;a.setOpt({pasteplain:!1,filterTxtRules:function(){function a(a){a.tagName="p",a.setStyle()}function b(a){a.parentNode.removeChild(a,!0)}return{"-":"script style object iframe embed input select",p:{$:{}},br:{$:{}},div:function(a){for(var b,c=UE.uNode.createElement("p");b=a.firstChild();)"text"!=b.type&&UE.dom.dtd.$block[b.tagName]?c.firstChild()?(a.parentNode.insertBefore(c,a),c=UE.uNode.createElement("p")):a.parentNode.insertBefore(b,a):c.appendChild(b);c.firstChild()&&a.parentNode.insertBefore(c,a),a.parentNode.removeChild(a)},ol:b,ul:b,dl:b,dt:b,dd:b,li:b,caption:a,th:a,tr:a,h1:a,h2:a,h3:a,h4:a,h5:a,h6:a,td:function(a){var b=!!a.innerText();b&&a.parentNode.insertAfter(UE.uNode.createText("    "),a),a.parentNode.removeChild(a,a.innerText())}}}()});var b=a.options.pasteplain;a.commands.pasteplain={queryCommandState:function(){return b?1:0},execCommand:function(){b=0|!b},notNeedUndo:1}},UE.plugins.list=function(){function a(a){var b=[];for(var c in a)b.push(c);return b}function b(a){var b=a.className;return domUtils.hasClass(a,/custom_/)?b.match(/custom_(\w+)/)[1]:domUtils.getStyle(a,"list-style-type")}function c(a,c){utils.each(domUtils.getElementsByTagName(a,"ol ul"),function(f){if(domUtils.inDoc(f,a)){var g=f.parentNode;if(g.tagName==f.tagName){var h=b(f)||("OL"==f.tagName?"decimal":"disc"),i=b(g)||("OL"==g.tagName?"decimal":"disc");if(h==i){var l=utils.indexOf(k[f.tagName],h);l=l+1==k[f.tagName].length?0:l+1,e(f,k[f.tagName][l])}}var m=0,n=2;domUtils.hasClass(f,/custom_/)?/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)||(n=1):/[ou]l/i.test(g.tagName)&&domUtils.hasClass(g,/custom_/)&&(n=3);var o=domUtils.getStyle(f,"list-style-type");o&&(f.style.cssText="list-style-type:"+o),f.className=utils.trim(f.className.replace(/list-paddingleft-\w+/,""))+" list-paddingleft-"+n,utils.each(domUtils.getElementsByTagName(f,"li"),function(a){if(a.style.cssText&&(a.style.cssText=""),!a.firstChild)return void domUtils.remove(a);if(a.parentNode===f){if(m++,domUtils.hasClass(f,/custom_/)){var c=1,d=b(f);if("OL"==f.tagName){if(d)switch(d){case"cn":case"cn1":case"cn2":m>10&&(m%10==0||m>10&&m<20)?c=2:m>20&&(c=3);break;case"num2":m>9&&(c=2)}a.className="list-"+j[d]+m+" list-"+d+"-paddingleft-"+c}else a.className="list-"+j[d]+" list-"+d+"-paddingleft"}else a.className=a.className.replace(/list-[\w\-]+/gi,"");var e=a.getAttribute("class");null===e||e.replace(/\s/g,"")||domUtils.removeAttributes(a,"class")}}),!c&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getStyle(f,"list-style-type"),!0)}})}function d(a,d,e,f){var g=a.nextSibling;g&&1==g.nodeType&&g.tagName.toLowerCase()==d&&(b(g)||domUtils.getStyle(g,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&(domUtils.moveChild(g,a),0==g.childNodes.length&&domUtils.remove(g)),g&&domUtils.isFillChar(g)&&domUtils.remove(g);var h=a.previousSibling;h&&1==h.nodeType&&h.tagName.toLowerCase()==d&&(b(h)||domUtils.getStyle(h,"list-style-type")||("ol"==d?"decimal":"disc"))==e&&domUtils.moveChild(a,h),h&&domUtils.isFillChar(h)&&domUtils.remove(h),!f&&domUtils.isEmptyBlock(a)&&domUtils.remove(a),b(a)&&c(a.ownerDocument,!0)}function e(a,b){j[b]&&(a.className="custom_"+b);try{domUtils.setStyle(a,"list-style-type",b)}catch(c){}}function f(a){var b=a.previousSibling;b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b),b=a.nextSibling,b&&domUtils.isEmptyBlock(b)&&domUtils.remove(b)}function g(a){for(;a&&!domUtils.isBody(a);){if("TABLE"==a.nodeName)return null;if("LI"==a.nodeName)return a;a=a.parentNode}}var h=this,i={TD:1,PRE:1,BLOCKQUOTE:1},j={cn:"cn-1-",cn1:"cn-2-",cn2:"cn-3-",num:"num-1-",num1:"num-2-",num2:"num-3-",dash:"dash",dot:"dot"};h.setOpt({autoTransWordToList:!1,insertorderedlist:{num:"",num1:"",num2:"",cn:"",cn1:"",cn2:"",decimal:"","lower-alpha":"","lower-roman":"","upper-alpha":"","upper-roman":""},insertunorderedlist:{circle:"",disc:"",square:"",dash:"",dot:""},listDefaultPaddingLeft:"30",listiconpath:"http://bs.baidu.com/listicon/",maxListLevel:-1,disablePInList:!1});var k={OL:a(h.options.insertorderedlist),UL:a(h.options.insertunorderedlist)},l=h.options.listiconpath;for(var m in j)h.options.insertorderedlist.hasOwnProperty(m)||h.options.insertunorderedlist.hasOwnProperty(m)||delete j[m];h.ready(function(){var a=[];for(var b in j){if("dash"==b||"dot"==b)a.push("li.list-"+j[b]+"{background-image:url("+l+j[b]+".gif)}"),a.push("ul.custom_"+b+"{list-style:none;}ul.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}");else{for(var c=0;c<99;c++)a.push("li.list-"+j[b]+c+"{background-image:url("+l+"list-"+j[b]+c+".gif)}");a.push("ol.custom_"+b+"{list-style:none;}ol.custom_"+b+" li{background-position:0 3px;background-repeat:no-repeat}")}switch(b){case"cn":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn1":a.push("li.list-"+b+"-paddingleft-1{padding-left:30px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:55px}");break;case"cn2":a.push("li.list-"+b+"-paddingleft-1{padding-left:40px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:55px}"),a.push("li.list-"+b+"-paddingleft-3{padding-left:68px}");break;case"num":case"num1":a.push("li.list-"+b+"-paddingleft-1{padding-left:25px}");break;case"num2":a.push("li.list-"+b+"-paddingleft-1{padding-left:35px}"),a.push("li.list-"+b+"-paddingleft-2{padding-left:40px}");break;case"dash":a.push("li.list-"+b+"-paddingleft{padding-left:35px}");break;case"dot":a.push("li.list-"+b+"-paddingleft{padding-left:20px}")}}a.push(".list-paddingleft-1{padding-left:0}"),a.push(".list-paddingleft-2{padding-left:"+h.options.listDefaultPaddingLeft+"px}"),a.push(".list-paddingleft-3{padding-left:"+2*h.options.listDefaultPaddingLeft+"px}"),utils.cssRule("list","ol,ul{margin:0;pading:0;"+(browser.ie?"":"width:95%")+"}li{clear:both;}"+a.join("\n"),h.document)}),h.ready(function(){domUtils.on(h.body,"cut",function(){setTimeout(function(){var a,b=h.selection.getRange();if(!b.collapsed&&(a=domUtils.findParentByTagName(b.startContainer,"li",!0))&&!a.nextSibling&&domUtils.isEmptyBlock(a)){var c,d=a.parentNode;if(c=d.previousSibling)domUtils.remove(d),b.setStartAtLast(c).collapse(!0),b.select(!0);else if(c=d.nextSibling)domUtils.remove(d),b.setStartAtFirst(c).collapse(!0),b.select(!0);else{var e=h.document.createElement("p");domUtils.fillNode(h.document,e),d.parentNode.insertBefore(e,d),domUtils.remove(d),b.setStart(e,0).collapse(!0),b.select(!0)}}})})}),h.addListener("beforepaste",function(a,c){var d,e=this,f=e.selection.getRange(),g=UE.htmlparser(c.html,!0);if(d=domUtils.findParentByTagName(f.startContainer,"li",!0)){var h=d.parentNode,i="OL"==h.tagName?"ul":"ol";utils.each(g.getNodesByTagName(i),function(c){if(c.tagName=h.tagName,c.setAttr(),c.parentNode===g)a=b(h)||("OL"==h.tagName?"decimal":"disc");else{var d=c.parentNode.getAttr("class");a=d&&/custom_/.test(d)?d.match(/custom_(\w+)/)[1]:c.parentNode.getStyle("list-style-type"),a||(a="OL"==h.tagName?"decimal":"disc")}var e=utils.indexOf(k[h.tagName],a);c.parentNode!==g&&(e=e+1==k[h.tagName].length?0:e+1);var f=k[h.tagName][e];j[f]?c.setAttr("class","custom_"+f):c.setStyle("list-style-type",f)})}c.html=g.toHtml()}),h.getOpt("disablePInList")===!0&&h.addOutputRule(function(a){utils.each(a.getNodesByTagName("li"),function(a){var b=[],c=0;utils.each(a.children,function(d){if("p"==d.tagName){for(var e;e=d.children.pop();)b.splice(c,0,e),e.parentNode=a,lastNode=e;if(e=b[b.length-1],!e||"element"!=e.type||"br"!=e.tagName){var f=UE.uNode.createElement("br");f.parentNode=a,b.push(f)}c=b.length}}),b.length&&(a.children=b)})}),h.addInputRule(function(a){function b(a,b){var e=b.firstChild();if(e&&"element"==e.type&&"span"==e.tagName&&/Wingdings|Symbol/.test(e.getStyle("font-family"))){for(var f in d)if(d[f]==e.data)return f;return"disc"}for(var f in c)if(c[f].test(a))return f}if(utils.each(a.getNodesByTagName("li"),function(a){for(var b,c=UE.uNode.createElement("p"),d=0;b=a.children[d];)"text"==b.type||dtd.p[b.tagName]?c.appendChild(b):c.firstChild()?(a.insertBefore(c,b),c=UE.uNode.createElement("p"),d+=2):d++;(c.firstChild()&&!c.parentNode||!a.firstChild())&&a.appendChild(c),c.firstChild()||c.innerHTML(browser.ie?" ":"
            ");var e=a.firstChild(),f=e.lastChild();f&&"text"==f.type&&/^\s*$/.test(f.data)&&e.removeChild(f)}),h.options.autoTransWordToList){var c={num1:/^\d+\)/,decimal:/^\d+\./,"lower-alpha":/^[a-z]+\)/,"upper-alpha":/^[A-Z]+\./,cn:/^[\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+[\u3001]/,cn2:/^\([\u4E00\u4E8C\u4E09\u56DB\u516d\u4e94\u4e03\u516b\u4e5d]+\)/},d={square:"n"};utils.each(a.getNodesByTagName("p"),function(a){function d(a,b,d){if("ol"==a.tagName)if(browser.ie){var e=b.firstChild();"element"==e.type&&"span"==e.tagName&&c[d].test(e.innerText())&&b.removeChild(e)}else b.innerHTML(b.innerHTML().replace(c[d],""));else b.removeChild(b.firstChild());var f=UE.uNode.createElement("li");f.appendChild(b),a.appendChild(f)}if("MsoListParagraph"==a.getAttr("class")){a.setStyle("margin",""),a.setStyle("margin-left",""),a.setAttr("class","");var e,f=a,g=a;if("li"!=a.parentNode.tagName&&(e=b(a.innerText(),a))){var i=UE.uNode.createElement(h.options.insertorderedlist.hasOwnProperty(e)?"ol":"ul");for(j[e]?i.setAttr("class","custom_"+e):i.setStyle("list-style-type",e);a&&"li"!=a.parentNode.tagName&&b(a.innerText(),a);)f=a.nextSibling(),f||a.parentNode.insertBefore(i,a),d(i,a,e),a=f;!i.parentNode&&a&&a.parentNode&&a.parentNode.insertBefore(i,a)}var k=g.firstChild();k&&"element"==k.type&&"span"==k.tagName&&/^\s*( )+\s*$/.test(k.innerText())&&k.parentNode.removeChild(k)}})}}),h.addListener("contentchange",function(){c(h.document)}),h.addListener("keydown",function(a,b){function c(){b.preventDefault?b.preventDefault():b.returnValue=!1,h.fireEvent("contentchange"),h.undoManger&&h.undoManger.save()}function d(a,b){for(;a&&!domUtils.isBody(a);){if(b(a))return null;if(1==a.nodeType&&/[ou]l/i.test(a.tagName))return a;a=a.parentNode}return null}var e=b.keyCode||b.which;if(13==e&&!b.shiftKey){var g=h.selection.getRange(),i=domUtils.findParent(g.startContainer,function(a){return domUtils.isBlockElm(a)},!0),j=domUtils.findParentByTagName(g.startContainer,"li",!0);if(i&&"PRE"!=i.tagName&&!j){var k=i.innerHTML.replace(new RegExp(domUtils.fillChar,"g"),"");/^\s*1\s*\.[^\d]/.test(k)&&(i.innerHTML=k.replace(/^\s*1\s*\./,""),g.setStartAtLast(i).collapse(!0).select(),h.__hasEnterExecCommand=!0,h.execCommand("insertorderedlist"),h.__hasEnterExecCommand=!1)}var l=h.selection.getRange(),m=d(l.startContainer,function(a){return"TABLE"==a.tagName}),n=l.collapsed?m:d(l.endContainer,function(a){return"TABLE"==a.tagName});if(m&&n&&m===n){if(!l.collapsed){if(m=domUtils.findParentByTagName(l.startContainer,"li",!0),n=domUtils.findParentByTagName(l.endContainer,"li",!0),!m||!n||m!==n){var o=l.cloneRange(),p=o.collapse(!1).createBookmark();l.deleteContents(),o.moveToBookmark(p);var j=domUtils.findParentByTagName(o.startContainer,"li",!0);return f(j),o.select(),void c()}if(l.deleteContents(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isEmptyBlock(j))return v=j.previousSibling,next=j.nextSibling,s=h.document.createElement("p"),domUtils.fillNode(h.document,s),q=j.parentNode,v&&next?(l.setStart(next,0).collapse(!0).select(!0),domUtils.remove(j)):((v||next)&&v?j.parentNode.parentNode.insertBefore(s,q.nextSibling):q.parentNode.insertBefore(s,q),domUtils.remove(j),q.firstChild||domUtils.remove(q),l.setStart(s,0).setCursor()),void c()}if(j=domUtils.findParentByTagName(l.startContainer,"li",!0)){ +if(domUtils.isEmptyBlock(j)){p=l.createBookmark();var q=j.parentNode;if(j!==q.lastChild?(domUtils.breakParent(j,q),f(j)):(q.parentNode.insertBefore(j,q.nextSibling),domUtils.isEmptyNode(q)&&domUtils.remove(q)),!dtd.$list[j.parentNode.tagName])if(domUtils.isBlockElm(j.firstChild))domUtils.remove(j,!0);else{for(s=h.document.createElement("p"),j.parentNode.insertBefore(s,j);j.firstChild;)s.appendChild(j.firstChild);domUtils.remove(j)}l.moveToBookmark(p).select()}else{var r=j.firstChild;if(!r||!domUtils.isBlockElm(r)){var s=h.document.createElement("p");for(!j.firstChild&&domUtils.fillNode(h.document,s);j.firstChild;)s.appendChild(j.firstChild);j.appendChild(s),r=s}var t=h.document.createElement("span");l.insertNode(t),domUtils.breakParent(t,j);var u=t.nextSibling;r=u.firstChild,r||(s=h.document.createElement("p"),domUtils.fillNode(h.document,s),u.appendChild(s),r=s),domUtils.isEmptyNode(r)&&(r.innerHTML="",domUtils.fillNode(h.document,r)),l.setStart(r,0).collapse(!0).shrinkBoundary().select(),domUtils.remove(t);var v=u.previousSibling;v&&domUtils.isEmptyBlock(v)&&(v.innerHTML="

            ",domUtils.fillNode(h.document,v.firstChild))}c()}}}if(8==e&&(l=h.selection.getRange(),l.collapsed&&domUtils.isStartInblock(l)&&(o=l.cloneRange().trimBoundary(),j=domUtils.findParentByTagName(l.startContainer,"li",!0),j&&domUtils.isStartInblock(o)))){if(m=domUtils.findParentByTagName(l.startContainer,"p",!0),m&&m!==j.firstChild){var q=domUtils.findParentByTagName(m,["ol","ul"]);return domUtils.breakParent(m,q),f(m),h.fireEvent("contentchange"),l.setStart(m,0).setCursor(!1,!0),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&(v=j.previousSibling)){if(46==e&&j.childNodes.length)return;if(dtd.$list[v.tagName]&&(v=v.lastChild),h.undoManger&&h.undoManger.save(),r=j.firstChild,domUtils.isBlockElm(r))if(domUtils.isEmptyNode(r))for(v.appendChild(r),l.setStart(r,0).setCursor(!1,!0);j.firstChild;)v.appendChild(j.firstChild);else t=h.document.createElement("span"),l.insertNode(t),domUtils.isEmptyBlock(v)&&(v.innerHTML=""),domUtils.moveChild(j,v),l.setStartBefore(t).collapse(!0).select(!0),domUtils.remove(t);else if(domUtils.isEmptyNode(j)){var s=h.document.createElement("p");v.appendChild(s),l.setStart(s,0).setCursor()}else for(l.setEnd(v,v.childNodes.length).collapse().select(!0);j.firstChild;)v.appendChild(j.firstChild);return domUtils.remove(j),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}if(j&&!j.previousSibling){var q=j.parentNode,p=l.createBookmark();if(domUtils.isTagNode(q.parentNode,"ol ul"))q.parentNode.insertBefore(j,q),domUtils.isEmptyNode(q)&&domUtils.remove(q);else{for(;j.firstChild;)q.parentNode.insertBefore(j.firstChild,q);domUtils.remove(j),domUtils.isEmptyNode(q)&&domUtils.remove(q)}return l.moveToBookmark(p).setCursor(!1,!0),h.fireEvent("contentchange"),h.fireEvent("saveScene"),void domUtils.preventDefault(b)}}}),h.addListener("keyup",function(a,c){var e=c.keyCode||c.which;if(8==e){var f,g=h.selection.getRange();(f=domUtils.findParentByTagName(g.startContainer,["ol","ul"],!0))&&d(f,f.tagName.toLowerCase(),b(f)||domUtils.getComputedStyle(f,"list-style-type"),!0)}}),h.addListener("tabkeydown",function(){function a(a){if(h.options.maxListLevel!=-1){for(var b=a.parentNode,c=0;/[ou]l/i.test(b.tagName);)c++,b=b.parentNode;if(c>=h.options.maxListLevel)return!0}}var c=h.selection.getRange(),f=domUtils.findParentByTagName(c.startContainer,"li",!0);if(f){var g;if(!c.collapsed){h.fireEvent("saveScene"),g=c.createBookmark();for(var i,j,l=0,m=domUtils.findParents(f);j=m[l++];)if(domUtils.isTagNode(j,"ol ul")){i=j;break}var n=f;if(g.end)for(;n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);)if(a(n))n=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});else{var o=n.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type")),r=q+1==k[p.tagName].length?0:q+1,s=k[p.tagName][r];for(e(p,s),o.insertBefore(p,n);n&&!(domUtils.getPosition(n,g.end)&domUtils.POSITION_FOLLOWING);){if(f=n.nextSibling,p.appendChild(n),!f||domUtils.isTagNode(f,"ol ul")){if(f)for(;(f=f.firstChild)&&"LI"!=f.tagName;);else f=domUtils.getNextDomNode(n,!1,null,function(a){return a!==i});break}n=f}d(p,p.tagName.toLowerCase(),s),n=f}return h.fireEvent("contentchange"),c.moveToBookmark(g).select(),!0}if(a(f))return!0;var o=f.parentNode,p=h.document.createElement(o.tagName),q=utils.indexOf(k[p.tagName],b(o)||domUtils.getComputedStyle(o,"list-style-type"));q=q+1==k[p.tagName].length?0:q+1;var s=k[p.tagName][q];if(e(p,s),domUtils.isStartInblock(c))return h.fireEvent("saveScene"),g=c.createBookmark(),o.insertBefore(p,f),p.appendChild(f),d(p,p.tagName.toLowerCase(),s),h.fireEvent("contentchange"),c.moveToBookmark(g).select(!0),!0}}),h.commands.insertorderedlist=h.commands.insertunorderedlist={execCommand:function(a,c){c||(c="insertorderedlist"==a.toLowerCase()?"decimal":"disc");var f=this,h=this.selection.getRange(),j=function(a){return 1==a.nodeType?"br"!=a.tagName.toLowerCase():!domUtils.isWhitespace(a)},k="insertorderedlist"==a.toLowerCase()?"ol":"ul",l=f.document.createDocumentFragment();h.adjustmentBoundary().shrinkBoundary();var m,n,o,p,q=h.createBookmark(!0),r=g(f.document.getElementById(q.start)),s=0,t=g(f.document.getElementById(q.end)),u=0;if(r||t){if(r&&(m=r.parentNode),q.end||(t=r),t&&(n=t.parentNode),m===n){for(;r!==t;){if(p=r,r=r.nextSibling,!domUtils.isBlockElm(p.firstChild)){for(var v=f.document.createElement("p");p.firstChild;)v.appendChild(p.firstChild);p.appendChild(v)}l.appendChild(p)}if(p=f.document.createElement("span"),m.insertBefore(p,t),!domUtils.isBlockElm(t.firstChild)){for(v=f.document.createElement("p");t.firstChild;)v.appendChild(t.firstChild);t.appendChild(v)}l.appendChild(t),domUtils.breakParent(p,m),domUtils.isEmptyNode(p.previousSibling)&&domUtils.remove(p.previousSibling),domUtils.isEmptyNode(p.nextSibling)&&domUtils.remove(p.nextSibling);var w=b(m)||domUtils.getComputedStyle(m,"list-style-type")||("insertorderedlist"==a.toLowerCase()?"decimal":"disc");if(m.tagName.toLowerCase()==k&&w==c){for(var x,y=0,z=f.document.createDocumentFragment();x=l.firstChild;)if(domUtils.isTagNode(x,"ol ul"))z.appendChild(x);else for(;x.firstChild;)z.appendChild(x.firstChild),domUtils.remove(x);p.parentNode.insertBefore(z,p)}else o=f.document.createElement(k),e(o,c),o.appendChild(l),p.parentNode.insertBefore(o,p);return domUtils.remove(p),o&&d(o,k,c),void h.moveToBookmark(q).select()}if(r){for(;r;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(var A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);if(B)l.appendChild(A);else{var C=f.document.createElement("p");C.appendChild(A),l.appendChild(C)}domUtils.remove(r)}r=p}m.parentNode.insertBefore(l,m.nextSibling),domUtils.isEmptyNode(m)?(h.setStartBefore(m),domUtils.remove(m)):h.setStartAfter(m),s=1}if(t&&domUtils.inDoc(n,f.document)){for(r=n.firstChild;r&&r!==t;){if(p=r.nextSibling,domUtils.isTagNode(r,"ol ul"))l.appendChild(r);else{for(A=f.document.createDocumentFragment(),B=0;r.firstChild;)domUtils.isBlockElm(r.firstChild)&&(B=1),A.appendChild(r.firstChild);B?l.appendChild(A):(C=f.document.createElement("p"),C.appendChild(A),l.appendChild(C)),domUtils.remove(r)}r=p}var D=domUtils.createElement(f.document,"div",{tmpDiv:1});domUtils.moveChild(t,D),l.appendChild(D),domUtils.remove(t),n.parentNode.insertBefore(l,n),h.setEndBefore(n),domUtils.isEmptyNode(n)&&domUtils.remove(n),u=1}}s||h.setStartBefore(f.document.getElementById(q.start)),q.end&&!u&&h.setEndAfter(f.document.getElementById(q.end)),h.enlarge(!0,function(a){return i[a.tagName]}),l=f.document.createDocumentFragment();for(var E,F=h.createBookmark(),G=domUtils.getNextDomNode(F.start,!1,j),H=h.cloneRange(),I=domUtils.isBlockElm;G&&G!==F.end&&domUtils.getPosition(G,F.end)&domUtils.POSITION_PRECEDING;)if(3==G.nodeType||dtd.li[G.tagName]){if(1==G.nodeType&&dtd.$list[G.tagName]){for(;G.firstChild;)l.appendChild(G.firstChild);E=domUtils.getNextDomNode(G,!1,j),domUtils.remove(G),G=E;continue}for(E=G,H.setStartBefore(G);G&&G!==F.end&&(!I(G)||domUtils.isBookmarkNode(G));)E=G,G=domUtils.getNextDomNode(G,!1,null,function(a){return!i[a.tagName]});G&&I(G)&&(p=domUtils.getNextDomNode(E,!1,j),p&&domUtils.isBookmarkNode(p)&&(G=domUtils.getNextDomNode(p,!1,j),E=p)),H.setEndAfter(E),G=domUtils.getNextDomNode(E,!1,j);var J=h.document.createElement("li");if(J.appendChild(H.extractContents()),domUtils.isEmptyNode(J)){for(var E=h.document.createElement("p");J.firstChild;)E.appendChild(J.firstChild);J.appendChild(E)}l.appendChild(J)}else G=domUtils.getNextDomNode(G,!0,j);h.moveToBookmark(F).collapse(!0),o=f.document.createElement(k),e(o,c),o.appendChild(l),h.insertNode(o),d(o,k,c);for(var x,y=0,K=domUtils.getElementsByTagName(o,"div");x=K[y++];)x.getAttribute("tmpDiv")&&domUtils.remove(x,!0);h.moveToBookmark(q).select()},queryCommandState:function(a){for(var b,c="insertorderedlist"==a.toLowerCase()?"ol":"ul",d=this.selection.getStartElementPath(),e=0;b=d[e++];){if("TABLE"==b.nodeName)return 0;if(c==b.nodeName.toLowerCase())return 1}return 0},queryCommandValue:function(a){for(var c,d,e="insertorderedlist"==a.toLowerCase()?"ol":"ul",f=this.selection.getStartElementPath(),g=0;d=f[g++];){if("TABLE"==d.nodeName){c=null;break}if(e==d.nodeName.toLowerCase()){c=d;break}}return c?b(c)||domUtils.getComputedStyle(c,"list-style-type"):null}}},function(){var a={textarea:function(a,b){var c=b.ownerDocument.createElement("textarea");return c.style.cssText="position:absolute;resize:none;width:100%;height:100%;border:0;padding:0;margin:0;overflow-y:auto;",browser.ie&&browser.version<8&&(c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px",b.onresize=function(){c.style.width=b.offsetWidth+"px",c.style.height=b.offsetHeight+"px"}),b.appendChild(c),{setContent:function(a){c.value=a},getContent:function(){return c.value},select:function(){var a;browser.ie?(a=c.createTextRange(),a.collapse(!0),a.select()):(c.setSelectionRange(0,0),c.focus())},dispose:function(){b.removeChild(c),b.onresize=null,c=null,b=null}}},codemirror:function(a,b){var c=window.CodeMirror(b,{mode:"text/html",tabMode:"indent",lineNumbers:!0,lineWrapping:!0}),d=c.getWrapperElement();return d.style.cssText='position:absolute;left:0;top:0;width:100%;height:100%;font-family:consolas,"Courier new",monospace;font-size:13px;',c.getScrollerElement().style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;",c.refresh(),{getCodeMirror:function(){return c},setContent:function(a){c.setValue(a)},getContent:function(){return c.getValue()},select:function(){c.focus()},dispose:function(){b.removeChild(d),d=null,c=null}}}};UE.plugins.source=function(){function b(b){return a["codemirror"==f.sourceEditor&&window.CodeMirror?"codemirror":"textarea"](e,b)}var c,d,e=this,f=this.options,g=!1;f.sourceEditor=browser.ie?"textarea":f.sourceEditor||"codemirror",e.setOpt({sourceEditorFirst:!1});var h,i,j;e.commands.source={execCommand:function(){if(g=!g){j=e.selection.getRange().createAddress(!1,!0),e.undoManger&&e.undoManger.save(!0),browser.gecko&&(e.body.contentEditable=!1),h=e.iframe.style.cssText,e.iframe.style.cssText+="position:absolute;left:-32768px;top:-32768px;",e.fireEvent("beforegetcontent");var a=UE.htmlparser(e.body.innerHTML);e.filterOutputRule(a),a.traversal(function(a){if("element"==a.type)switch(a.tagName){case"td":case"th":case"caption":a.children&&1==a.children.length&&"br"==a.firstChild().tagName&&a.removeChild(a.firstChild());break;case"pre":a.innerText(a.innerText().replace(/ /g," "))}}),e.fireEvent("aftergetcontent");var f=a.toHtml(!0);c=b(e.iframe.parentNode),c.setContent(f),d=e.setContent,e.setContent=function(a){var b=UE.htmlparser(a);e.filterInputRule(b),a=b.toHtml(),c.setContent(a)},setTimeout(function(){c.select(),e.addListener("fullscreenchanged",function(){try{c.getCodeMirror().refresh()}catch(a){}})}),i=e.getContent,e.getContent=function(){return c.getContent()||"

            "+(browser.ie?"":"
            ")+"

            "}}else{e.iframe.style.cssText=h;var k=c.getContent()||"

            "+(browser.ie?"":"
            ")+"

            ";k=k.replace(new RegExp("[\\r\\t\\n ]*]*)>","g"),function(a,b){return b&&!dtd.$inlineWithA[b.toLowerCase()]?a.replace(/(^[\n\r\t ]*)|([\n\r\t ]*$)/g,""):a.replace(/(^[\n\r\t]*)|([\n\r\t]*$)/g,"")}),e.setContent=d,e.setContent(k),c.dispose(),c=null,e.getContent=i;var l=e.body.firstChild;if(l||(e.body.innerHTML="

            "+(browser.ie?"":"
            ")+"

            ",l=e.body.firstChild),e.undoManger&&e.undoManger.save(!0),browser.gecko){var m=document.createElement("input");m.style.cssText="position:absolute;left:0;top:-32768px",document.body.appendChild(m),e.body.contentEditable=!1,setTimeout(function(){domUtils.setViewportOffset(m,{left:-32768,top:0}),m.focus(),setTimeout(function(){e.body.contentEditable=!0,e.selection.getRange().moveToAddress(j).select(!0),domUtils.remove(m)})})}else try{e.selection.getRange().moveToAddress(j).select(!0)}catch(n){}}this.fireEvent("sourcemodechanged",g)},queryCommandState:function(){return 0|g},notNeedUndo:1};var k=e.queryCommandState;e.queryCommandState=function(a){return a=a.toLowerCase(),g?a in{source:1,fullscreen:1}?1:-1:k.apply(this,arguments)},"codemirror"==f.sourceEditor&&e.addListener("ready",function(){utils.loadFile(document,{src:f.codeMirrorJsUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.js",tag:"script",type:"text/javascript",defer:"defer"},function(){f.sourceEditorFirst&&setTimeout(function(){e.execCommand("source")},0)}),utils.loadFile(document,{tag:"link",rel:"stylesheet",type:"text/css",href:f.codeMirrorCssUrl||f.UEDITOR_HOME_URL+"third-party/codemirror/codemirror.css"})})}}(),UE.plugins.enterkey=function(){var a,b=this,c=b.options.enterTag;b.addListener("keyup",function(c,d){var e=d.keyCode||d.which;if(13==e){var f,g=b.selection.getRange(),h=g.startContainer;if(browser.ie)b.fireEvent("saveScene",!0,!0);else{if(/h\d/i.test(a)){if(browser.gecko){var i=domUtils.findParentByTagName(h,["h1","h2","h3","h4","h5","h6","blockquote","caption","table"],!0);i||(b.document.execCommand("formatBlock",!1,"

            "),f=1)}else if(1==h.nodeType){var j,k=b.document.createTextNode("");if(g.insertNode(k),j=domUtils.findParentByTagName(k,"div",!0)){for(var l=b.document.createElement("p");j.firstChild;)l.appendChild(j.firstChild);j.parentNode.insertBefore(l,j),domUtils.remove(j),g.setStartBefore(k).setCursor(),f=1}domUtils.remove(k)}b.undoManger&&f&&b.undoManger.save()}browser.opera&&g.select()}}}),b.addListener("keydown",function(d,e){var f=e.keyCode||e.which;if(13==f){if(b.fireEvent("beforeenterkeydown"))return void domUtils.preventDefault(e);b.fireEvent("saveScene",!0,!0),a="";var g=b.selection.getRange();if(!g.collapsed){var h=g.startContainer,i=g.endContainer,j=domUtils.findParentByTagName(h,"td",!0),k=domUtils.findParentByTagName(i,"td",!0);if(j&&k&&j!==k||!j&&k||j&&!k)return void(e.preventDefault?e.preventDefault():e.returnValue=!1)}if("p"==c)browser.ie||(h=domUtils.findParentByTagName(g.startContainer,["ol","ul","p","h1","h2","h3","h4","h5","h6","blockquote","caption"],!0),h||browser.opera?(a=h.tagName,"p"==h.tagName.toLowerCase()&&browser.gecko&&domUtils.removeDirtyAttr(h)):(b.document.execCommand("formatBlock",!1,"

            "),browser.gecko&&(g=b.selection.getRange(),h=domUtils.findParentByTagName(g.startContainer,"p",!0),h&&domUtils.removeDirtyAttr(h))));else if(e.preventDefault?e.preventDefault():e.returnValue=!1,g.collapsed){m=g.document.createElement("br"),g.insertNode(m);var l=m.parentNode;l.lastChild===m?(m.parentNode.insertBefore(m.cloneNode(!0),m),g.setStartBefore(m)):g.setStartAfter(m),g.setCursor()}else if(g.deleteContents(),h=g.startContainer,1==h.nodeType&&(h=h.childNodes[g.startOffset])){for(;1==h.nodeType;){if(dtd.$empty[h.tagName])return g.setStartBefore(h).setCursor(),b.undoManger&&b.undoManger.save(),!1;if(!h.firstChild){var m=g.document.createElement("br");return h.appendChild(m),g.setStart(h,0).setCursor(),b.undoManger&&b.undoManger.save(),!1}h=h.firstChild}h===g.startContainer.childNodes[g.startOffset]?(m=g.document.createElement("br"),g.insertNode(m).setCursor()):g.setStart(h,0).setCursor()}else m=g.document.createElement("br"),g.insertNode(m).setStartAfter(m).setCursor()}})},UE.plugins.keystrokes=function(){var a=this,b=!0;a.addListener("keydown",function(c,d){var e=d.keyCode||d.which,f=a.selection.getRange();if(!f.collapsed&&!(d.ctrlKey||d.shiftKey||d.altKey||d.metaKey)&&(e>=65&&e<=90||e>=48&&e<=57||e>=96&&e<=111||{13:1,8:1,46:1}[e])){var g=f.startContainer;if(domUtils.isFillChar(g)&&f.setStartBefore(g),g=f.endContainer,domUtils.isFillChar(g)&&f.setEndAfter(g),f.txtToElmBoundary(),f.endContainer&&1==f.endContainer.nodeType&&(g=f.endContainer.childNodes[f.endOffset],g&&domUtils.isBr(g)&&f.setEndAfter(g)),0==f.startOffset&&(g=f.startContainer,domUtils.isBoundaryNode(g,"firstChild")&&(g=f.endContainer,f.endOffset==(3==g.nodeType?g.nodeValue.length:g.childNodes.length)&&domUtils.isBoundaryNode(g,"lastChild"))))return a.fireEvent("saveScene"),a.body.innerHTML="

            "+(browser.ie?"":"
            ")+"

            ",f.setStart(a.body.firstChild,0).setCursor(!1,!0),void a._selectionChange()}if(e==keymap.Backspace){if(f=a.selection.getRange(),b=f.collapsed,a.fireEvent("delkeydown",d))return;var h,i;if(f.collapsed&&f.inFillChar()&&(h=f.startContainer,domUtils.isFillChar(h)?(f.setStartBefore(h).shrinkBoundary(!0).collapse(!0),domUtils.remove(h)):(h.nodeValue=h.nodeValue.replace(new RegExp("^"+domUtils.fillChar),""),f.startOffset--,f.collapse(!0).select(!0))),h=f.getClosedNode())return a.fireEvent("saveScene"),f.setStartBefore(h),domUtils.remove(h),f.setCursor(),a.fireEvent("saveScene"),void domUtils.preventDefault(d);if(!browser.ie&&(h=domUtils.findParentByTagName(f.startContainer,"table",!0),i=domUtils.findParentByTagName(f.endContainer,"table",!0),h&&!i||!h&&i||h!==i))return void d.preventDefault()}if(e==keymap.Tab){var j={ol:1,ul:1,table:1};if(a.fireEvent("tabkeydown",d))return void domUtils.preventDefault(d);var k=a.selection.getRange();a.fireEvent("saveScene");for(var l=0,m="",n=a.options.tabSize||4,o=a.options.tabNode||" ";l"});d.insertNode(g).setStart(g,0).setCursor(!1,!0)}}if(!b&&(3==d.startContainer.nodeType||1==d.startContainer.nodeType&&domUtils.isEmptyBlock(d.startContainer)))if(browser.ie){var k=d.document.createElement("span");d.insertNode(k).setStartBefore(k).collapse(!0),d.select(),domUtils.remove(k)}else d.select()}})},UE.plugins.fiximgclick=function(){function a(){this.editor=null,this.resizer=null,this.cover=null,this.doc=document,this.prePos={x:0,y:0},this.startPos={x:0,y:0}}var b=!1;return function(){var c=[[0,0,-1,-1],[0,0,0,-1],[0,0,1,-1],[0,0,-1,0],[0,0,1,0],[0,0,-1,1],[0,0,0,1],[0,0,1,1]];a.prototype={init:function(a){var b=this;b.editor=a,b.startPos=this.prePos={x:0,y:0},b.dragId=-1;var c=[],d=b.cover=document.createElement("div"),e=b.resizer=document.createElement("div");for(d.id=b.editor.ui.id+"_imagescale_cover",d.style.cssText="position:absolute;display:none;z-index:"+b.editor.options.zIndex+";filter:alpha(opacity=0); opacity:0;background:#CCC;",domUtils.on(d,"mousedown click",function(){b.hide()}),i=0;i<8;i++)c.push('');e.id=b.editor.ui.id+"_imagescale",e.className="edui-editor-imagescale",e.innerHTML=c.join(""),e.style.cssText+=";display:none;border:1px solid #3b77ff;z-index:"+b.editor.options.zIndex+";",b.editor.ui.getDom().appendChild(d),b.editor.ui.getDom().appendChild(e),b.initStyle(),b.initEvents()},initStyle:function(){utils.cssRule("imagescale",".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}")},initEvents:function(){var a=this;a.startPos.x=a.startPos.y=0,a.isDraging=!1},_eventHandler:function(a){var c=this;switch(a.type){case"mousedown":var d,d=a.target||a.srcElement;d.className.indexOf("edui-editor-imagescale-hand")!=-1&&c.dragId==-1&&(c.dragId=d.className.slice(-1),c.startPos.x=c.prePos.x=a.clientX,c.startPos.y=c.prePos.y=a.clientY,domUtils.on(c.doc,"mousemove",c.proxy(c._eventHandler,c)));break;case"mousemove":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.prePos.x=a.clientX,c.prePos.y=a.clientY,b=!0,c.updateTargetElement());break;case"mouseup":c.dragId!=-1&&(c.updateContainerStyle(c.dragId,{x:a.clientX-c.prePos.x,y:a.clientY-c.prePos.y}),c.updateTargetElement(),c.target.parentNode&&c.attachTo(c.target),c.dragId=-1),domUtils.un(c.doc,"mousemove",c.proxy(c._eventHandler,c)),b&&(b=!1,c.editor.fireEvent("contentchange"))}},updateTargetElement:function(){var a=this;domUtils.setStyles(a.target,{width:a.resizer.style.width,height:a.resizer.style.height}),a.target.width=parseInt(a.resizer.style.width),a.target.height=parseInt(a.resizer.style.height),a.attachTo(a.target)},updateContainerStyle:function(a,b){var d,e=this,f=e.resizer;0!=c[a][0]&&(d=parseInt(f.style.left)+b.x,f.style.left=e._validScaledProp("left",d)+"px"),0!=c[a][1]&&(d=parseInt(f.style.top)+b.y,f.style.top=e._validScaledProp("top",d)+"px"),0!=c[a][2]&&(d=f.clientWidth+c[a][2]*b.x,f.style.width=e._validScaledProp("width",d)+"px"),0!=c[a][3]&&(d=f.clientHeight+c[a][3]*b.y,f.style.height=e._validScaledProp("height",d)+"px")},_validScaledProp:function(a,b){var c=this.resizer,d=document;switch(b=isNaN(b)?0:b,a){case"left":return b<0?0:b+c.clientWidth>d.clientWidth?d.clientWidth-c.clientWidth:b;case"top":return b<0?0:b+c.clientHeight>d.clientHeight?d.clientHeight-c.clientHeight:b;case"width":return b<=0?1:b+c.offsetLeft>d.clientWidth?d.clientWidth-c.offsetLeft:b;case"height":return b<=0?1:b+c.offsetTop>d.clientHeight?d.clientHeight-c.offsetTop:b}},hideCover:function(){this.cover.style.display="none"},showCover:function(){var a=this,b=domUtils.getXY(a.editor.ui.getDom()),c=domUtils.getXY(a.editor.iframe);domUtils.setStyles(a.cover,{width:a.editor.iframe.offsetWidth+"px",height:a.editor.iframe.offsetHeight+"px",top:c.y-b.y+"px",left:c.x-b.x+"px",position:"absolute",display:""})},show:function(a){var b=this;b.resizer.style.display="block",a&&b.attachTo(a),domUtils.on(this.resizer,"mousedown",b.proxy(b._eventHandler,b)),domUtils.on(b.doc,"mouseup",b.proxy(b._eventHandler,b)),b.showCover(),b.editor.fireEvent("afterscaleshow",b),b.editor.fireEvent("saveScene")},hide:function(){var a=this;a.hideCover(),a.resizer.style.display="none",domUtils.un(a.resizer,"mousedown",a.proxy(a._eventHandler,a)),domUtils.un(a.doc,"mouseup",a.proxy(a._eventHandler,a)),a.editor.fireEvent("afterscalehide",a)},proxy:function(a,b){return function(c){return a.apply(b||this,arguments)}},attachTo:function(a){var b=this,c=b.target=a,d=this.resizer,e=domUtils.getXY(c),f=domUtils.getXY(b.editor.iframe),g=domUtils.getXY(d.parentNode);domUtils.setStyles(d,{width:c.width+"px",height:c.height+"px",left:f.x+e.x-b.editor.document.body.scrollLeft-g.x-parseInt(d.style.borderLeftWidth)+"px",top:f.y+e.y-b.editor.document.body.scrollTop-g.y-parseInt(d.style.borderTopWidth)+"px"})}}}(),function(){var b,c=this;c.setOpt("imageScaleEnabled",!0),!browser.ie&&c.options.imageScaleEnabled&&c.addListener("click",function(d,e){var f=c.selection.getRange(),g=f.getClosedNode();if(g&&"IMG"==g.tagName&&"false"!=c.body.contentEditable){if(g.className.indexOf("edui-faked-music")!=-1||g.getAttribute("anchorname")||domUtils.hasClass(g,"loadingclass")||domUtils.hasClass(g,"loaderrorclass"))return;if(!b){b=new a,b.init(c),c.ui.getDom().appendChild(b.resizer);var h,i=function(a){b.hide(),b.target&&c.selection.getRange().selectNode(b.target).select()},j=function(a){var b=a.target||a.srcElement;!b||void 0!==b.className&&b.className.indexOf("edui-editor-imagescale")!=-1||i(a)};c.addListener("afterscaleshow",function(a){c.addListener("beforekeydown",i),c.addListener("beforemousedown",j),domUtils.on(document,"keydown",i),domUtils.on(document,"mousedown",j),c.selection.getNative().removeAllRanges()}),c.addListener("afterscalehide",function(a){c.removeListener("beforekeydown",i),c.removeListener("beforemousedown",j),domUtils.un(document,"keydown",i),domUtils.un(document,"mousedown",j);var d=b.target;d.parentNode&&c.selection.getRange().selectNode(d).select()}),domUtils.on(b.resizer,"mousedown",function(a){c.selection.getNative().removeAllRanges();var d=a.target||a.srcElement;d&&d.className.indexOf("edui-editor-imagescale-hand")==-1&&(h=setTimeout(function(){b.hide(),b.target&&c.selection.getRange().selectNode(d).select()},200))}),domUtils.on(b.resizer,"mouseup",function(a){var b=a.target||a.srcElement;b&&b.className.indexOf("edui-editor-imagescale-hand")==-1&&clearTimeout(h)})}b.show(g)}else b&&"none"!=b.resizer.style.display&&b.hide()}),browser.webkit&&c.addListener("click",function(a,b){if("IMG"==b.target.tagName&&"false"!=c.body.contentEditable){var d=new dom.Range(c.document);d.selectNode(b.target).select()}})}}(),UE.plugin.register("autolink",function(){var a=0;return browser.ie?{}:{bindEvents:{reset:function(){a=0},keydown:function(a,b){var c=this,d=b.keyCode||b.which;if(32==d||13==d){for(var e,f,g=c.selection.getNative(),h=g.getRangeAt(0).cloneRange(),i=h.startContainer;1==i.nodeType&&h.startOffset>0&&(i=h.startContainer.childNodes[h.startOffset-1]);)h.setStart(i,1==i.nodeType?i.childNodes.length:i.nodeValue.length),h.collapse(!0),i=h.startContainer;do{if(0==h.startOffset){for(i=h.startContainer.previousSibling;i&&1==i.nodeType;)i=i.lastChild;if(!i||domUtils.isFillChar(i))break;e=i.nodeValue.length}else i=h.startContainer,e=h.startOffset;h.setStart(i,e-1),f=h.toString().charCodeAt(0)}while(160!=f&&32!=f);if(h.toString().replace(new RegExp(domUtils.fillChar,"g"),"").match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)){for(;h.toString().length&&!/^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(h.toString());)try{h.setStart(h.startContainer,h.startOffset+1)}catch(j){for(var i=h.startContainer;!(next=i.nextSibling);){if(domUtils.isBody(i))return;i=i.parentNode}h.setStart(next,0)}if(domUtils.findParentByTagName(h.startContainer,"a",!0))return;var k,l=c.document.createElement("a"),m=c.document.createTextNode(" ");c.undoManger&&c.undoManger.save(),l.appendChild(h.extractContents()),l.href=l.innerHTML=l.innerHTML.replace(/<[^>]+>/g,""),k=l.getAttribute("href").replace(new RegExp(domUtils.fillChar,"g"),""),k=/^(?:https?:\/\/)/gi.test(k)?k:"http://"+k,l.setAttribute("_src",utils.html(k)),l.href=utils.html(k),h.insertNode(l),l.parentNode.insertBefore(m,l.nextSibling),h.setStart(m,0),h.collapse(!0),g.removeAllRanges(),g.addRange(h),c.undoManger&&c.undoManger.save()}}}}}},function(){function a(a){if(3==a.nodeType)return null;if("A"==a.nodeName)return a;for(var b=a.lastChild;b;){if("A"==b.nodeName)return b;if(3==b.nodeType){if(domUtils.isWhitespace(b)){b=b.previousSibling;continue}return null}b=b.lastChild}}var b={37:1,38:1,39:1,40:1,13:1,32:1};browser.ie&&this.addListener("keyup",function(c,d){var e=this,f=d.keyCode;if(b[f]){var g=e.selection.getRange(),h=g.startContainer;if(13==f){for(;h&&!domUtils.isBody(h)&&!domUtils.isBlockElm(h);)h=h.parentNode;if(h&&!domUtils.isBody(h)&&"P"==h.nodeName){var i=h.previousSibling;if(i&&1==i.nodeType){var i=a(i);i&&!i.getAttribute("_href")&&domUtils.remove(i,!0)}}}else if(32==f)3==h.nodeType&&/^\s$/.test(h.nodeValue)&&(h=h.previousSibling,h&&"A"==h.nodeName&&!h.getAttribute("_href")&&domUtils.remove(h,!0));else if(h=domUtils.findParentByTagName(h,"a",!0),h&&!h.getAttribute("_href")){var j=g.createBookmark();domUtils.remove(h,!0),g.moveToBookmark(j).select(!0)}}})}),UE.plugins.autoheight=function(){function a(){var a=this;clearTimeout(e),f||(!a.queryCommandState||a.queryCommandState&&1!=a.queryCommandState("source"))&&(e=setTimeout(function(){for(var b=a.body.lastChild;b&&1!=b.nodeType;)b=b.previousSibling;b&&1==b.nodeType&&(b.style.clear="both",d=Math.max(domUtils.getXY(b).y+b.offsetHeight+25,Math.max(h.minFrameHeight,h.initialFrameHeight)),d!=g&&(d!==parseInt(a.iframe.parentNode.style.height)&&(a.iframe.parentNode.style.height=d+"px"),a.body.style.height=d+"px",g=d),domUtils.removeStyle(b,"clear"))},50))}var b=this;if(b.autoHeightEnabled=b.options.autoHeightEnabled!==!1,b.autoHeightEnabled){var c,d,e,f,g=0,h=b.options;b.addListener("fullscreenchanged",function(a,b){f=b}),b.addListener("destroy",function(){b.removeListener("contentchange afterinserthtml keyup mouseup",a)}),b.enableAutoHeight=function(){var b=this;if(b.autoHeightEnabled){var d=b.document;b.autoHeightEnabled=!0,c=d.body.style.overflowY,d.body.style.overflowY="hidden",b.addListener("contentchange afterinserthtml keyup mouseup",a),setTimeout(function(){a.call(b)},browser.gecko?100:0),b.fireEvent("autoheightchanged",b.autoHeightEnabled)}},b.disableAutoHeight=function(){b.body.style.overflowY=c||"",b.removeListener("contentchange",a),b.removeListener("keyup",a),b.removeListener("mouseup",a),b.autoHeightEnabled=!1,b.fireEvent("autoheightchanged",b.autoHeightEnabled)},b.on("setHeight",function(){b.disableAutoHeight()}),b.addListener("ready",function(){b.enableAutoHeight();var c;domUtils.on(browser.ie?b.body:b.document,browser.webkit?"dragover":"drop",function(){clearTimeout(c),c=setTimeout(function(){a.call(b)},100)});var d;window.onscroll=function(){ +null===d?d=this.scrollY:0==this.scrollY&&0!=d&&(b.window.scrollTo(0,0),d=null)}})}},UE.plugins.autofloat=function(){function a(){return UE.ui?1:(alert(g.autofloatMsg),0)}function b(){var a=document.body.style;a.backgroundImage='url("about:blank")',a.backgroundAttachment="fixed"}function c(){var a=domUtils.getXY(k),b=domUtils.getComputedStyle(k,"position"),c=domUtils.getComputedStyle(k,"left");k.style.width=k.offsetWidth+"px",k.style.zIndex=1*f.options.zIndex+1,k.parentNode.insertBefore(q,k),o||p&&browser.ie?("absolute"!=k.style.position&&(k.style.position="absolute"),k.style.top=(document.body.scrollTop||document.documentElement.scrollTop)-l+i+"px"):(browser.ie7Compat&&r&&(r=!1,k.style.left=domUtils.getXY(k).x-document.documentElement.getBoundingClientRect().left+2+"px"),"fixed"!=k.style.position&&(k.style.position="fixed",k.style.top=i+"px",("absolute"==b||"relative"==b)&&parseFloat(c)&&(k.style.left=a.x+"px")))}function d(){r=!0,q.parentNode&&q.parentNode.removeChild(q),k.style.cssText=j}function e(){var a=m(f.container),b=f.options.toolbarTopOffset||0;a.top<0&&a.bottom-k.offsetHeight>b?c():d()}var f=this,g=f.getLang();f.setOpt({topOffset:0});var h=f.options.autoFloatEnabled!==!1,i=f.options.topOffset;if(h){var j,k,l,m,n=UE.ui.uiUtils,o=browser.ie&&browser.version<=6,p=browser.quirks,q=document.createElement("div"),r=!0,s=utils.defer(function(){e()},browser.ie?200:100,!0);f.addListener("destroy",function(){domUtils.un(window,["scroll","resize"],e),f.removeListener("keydown",s)}),f.addListener("ready",function(){if(a(f)){if(!f.ui)return;m=n.getClientRect,k=f.ui.getDom("toolbarbox"),l=m(k).top,j=k.style.cssText,q.style.height=k.offsetHeight+"px",o&&b(),domUtils.on(window,["scroll","resize"],e),f.addListener("keydown",s),f.addListener("beforefullscreenchange",function(a,b){b&&d()}),f.addListener("fullscreenchanged",function(a,b){b||e()}),f.addListener("sourcemodechanged",function(a,b){setTimeout(function(){e()},0)}),f.addListener("clearDoc",function(){setTimeout(function(){e()},0)})}})}},UE.plugins.video=function(){function a(a,b,d,e,f,g,h){a=utils.unhtmlForUrl(a),f=utils.unhtml(f),g=utils.unhtml(g),b=parseInt(b,10)||0,d=parseInt(d,10)||0;var i;switch(h){case"image":i="';break;case"embed":i='';break;case"video":var j=a.substr(a.lastIndexOf(".")+1);"ogv"==j&&(j="ogg"),i="'}return i}function b(b,c){utils.each(b.getNodesByTagName(c?"img":"embed video"),function(b){var d=b.getAttr("class");if(d&&d.indexOf("edui-faked-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"embed":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}if(d&&d.indexOf("edui-upload-video")!=-1){var e=a(c?b.getAttr("_url"):b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),null,b.getStyle("float")||"",d,c?"video":"image");b.parentNode.replaceChild(UE.uNode.createElement(e),b)}})}var c=this;c.addOutputRule(function(a){b(a,!0)}),c.addInputRule(function(a){b(a)}),c.commands.insertvideo={execCommand:function(b,d,e){d=utils.isArray(d)?d:[d];for(var f,g,h=[],i="tmpVedio",j=0,k=d.length;j0)return 0;for(var c in dtd.$isNotEmpty)if(dtd.$isNotEmpty.hasOwnProperty(c)&&a.getElementsByTagName(c).length)return 0;return 1},b.getWidth=function(a){return a?parseInt(domUtils.getComputedStyle(a,"width"),10):0},b.getTableCellAlignState=function(a){!utils.isArray(a)&&(a=[a]);var b={},c=["align","valign"],d=null,e=!0;return utils.each(a,function(a){return utils.each(c,function(c){if(d=a.getAttribute(c),!b[c]&&d)b[c]=d;else if(!b[c]||d!==b[c])return e=!1,!1}),e}),e?b:null},b.getTableItemsByRange=function(a){var b=a.selection.getStart();b&&b.id&&0===b.id.indexOf("_baidu_bookmark_start_")&&b.nextSibling&&(b=b.nextSibling);var c=b&&domUtils.findParentByTagName(b,["td","th"],!0),d=c&&c.parentNode,e=b&&domUtils.findParentByTagName(b,"caption",!0),f=e?e.parentNode:d&&d.parentNode.parentNode;return{cell:c,tr:d,table:f,caption:e}},b.getUETableBySelected=function(a){var c=b.getTableItemsByRange(a).table;return c&&c.ueTable&&c.ueTable.selectedTds.length?c.ueTable:null},b.getDefaultValue=function(a,b){var c,d,e,f,g={thin:"0px",medium:"1px",thick:"2px"};if(b)return h=b.getElementsByTagName("td")[0],f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),{tableBorder:c,tdPadding:d,tdBorder:e};b=a.document.createElement("table"),b.insertRow(0).insertCell(0).innerHTML="xxx",a.body.appendChild(b);var h=b.getElementsByTagName("td")[0];return f=domUtils.getComputedStyle(b,"border-left-width"),c=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"padding-left"),d=parseInt(g[f]||f,10),f=domUtils.getComputedStyle(h,"border-left-width"),e=parseInt(g[f]||f,10),domUtils.remove(b),{tableBorder:c,tdPadding:d,tdBorder:e}},b.getUETable=function(a){var c=a.tagName.toLowerCase();return a="td"==c||"th"==c||"caption"==c?domUtils.findParentByTagName(a,"table",!0):a,a.ueTable||(a.ueTable=new b(a)),a.ueTable},b.cloneCell=function(a,b,c){if(!a||utils.isString(a))return this.table.ownerDocument.createElement(a||"td");var d=domUtils.hasClass(a,"selectTdClass");d&&domUtils.removeClasses(a,"selectTdClass");var e=a.cloneNode(!0);return b&&(e.rowSpan=e.colSpan=1),!c&&domUtils.removeAttributes(e,"width height"),!c&&domUtils.removeAttributes(e,"style"),e.style.borderLeftStyle="",e.style.borderTopStyle="",e.style.borderLeftColor=a.style.borderRightColor,e.style.borderLeftWidth=a.style.borderRightWidth,e.style.borderTopColor=a.style.borderBottomColor,e.style.borderTopWidth=a.style.borderBottomWidth,d&&domUtils.addClass(a,"selectTdClass"),e},b.prototype={getMaxRows:function(){for(var a,b=this.table.rows,c=1,d=0;a=b[d];d++){for(var e,f=1,g=0;e=a.cells[g++];)f=Math.max(e.rowSpan||1,f);c=Math.max(f+d,c)}return c},getMaxCols:function(){for(var a,b=this.table.rows,c=0,d={},e=0;a=b[e];e++){for(var f,g=0,h=0;f=a.cells[h++];)if(g+=f.colSpan||1,f.rowSpan&&f.rowSpan>1)for(var i=1;ithis.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getSameEndPosCells:function(b,c){try{for(var d="x"===c.toLowerCase(),e=domUtils.getXY(b)[d?"x":"y"]+b["offset"+(d?"Width":"Height")],f=this.table.rows,g=null,h=[],i=0;ie&&d)break;if((b==j||e==l)&&(1==j[d?"colSpan":"rowSpan"]&&h.push(j),d))break}}return h}catch(m){a(m)}},setCellContent:function(a,b){a.innerHTML=b||(browser.ie?domUtils.fillChar:"
            ")},cloneCell:b.cloneCell,getSameStartPosXCells:function(b){try{for(var c,d=domUtils.getXY(b).x+b.offsetWidth,e=this.table.rows,f=[],g=0;gd)break;if(j==d&&1==h.colSpan){f.push(h);break}}}return f}catch(k){a(k)}},update:function(a){this.table=a||this.table,this.selectedTds=[],this.cellsRange={},this.indexTable=[];for(var b=this.table.rows,c=this.getMaxRows(),d=c-b.length,e=this.getMaxCols();d--;)this.table.insertRow(b.length);this.rowsNum=c,this.colsNum=e;for(var f=0,g=b.length;fc&&(j.rowSpan=c);for(var m=k,n=j.rowSpan||1,o=j.colSpan||1;this.indexTable[i][m];)m++;for(var p=0;p0)for(h=b;hf&&(m=Math.max(h,m));if(ee&&(l=Math.max(i,l));if(b>0)for(i=a;ig||d+b.colSpan-1>h)return null;j.push(this.getCell(c,b.cellIndex))}}return j},clearSelected:function(){b.removeSelectedClass(this.selectedTds),this.selectedTds=[],this.cellsRange={}},setSelected:function(a){var c=this.getCells(a);b.addSelectedClass(c),this.selectedTds=c,this.cellsRange=a},isFullRow:function(){var a=this.cellsRange;return a.endColIndex-a.beginColIndex+1==this.colsNum},isFullCol:function(){var a=this.cellsRange,b=this.table,c=b.getElementsByTagName("th"),d=a.endRowIndex-a.beginRowIndex+1;return c.length?d==this.rowsNum||d==this.rowsNum-1:d==this.rowsNum},getNextCell:function(b,c,d){try{var e,f,g=this.getCellInfo(b),h=this.selectedTds.length&&!d,i=this.cellsRange;return!c&&0==g.rowIndex||c&&(h?i.endRowIndex==this.rowsNum-1:g.rowIndex+g.rowSpan>this.rowsNum-1)?null:(e=c?h?i.endRowIndex+1:g.rowIndex+g.rowSpan:h?i.beginRowIndex-1:g.rowIndex-1,f=h?i.beginColIndex:g.colIndex,this.getCell(this.indexTable[e][f].rowIndex,this.indexTable[e][f].cellIndex))}catch(j){a(j)}},getPreviewCell:function(b,c){try{var d,e,f=this.getCellInfo(b),g=this.selectedTds.length,h=this.cellsRange;return!c&&(g?!h.beginColIndex:!f.colIndex)||c&&(g?h.endColIndex==this.colsNum-1:f.rowIndex>this.colsNum-1)?null:(d=c?g?h.beginRowIndex:f.rowIndex<1?0:f.rowIndex-1:g?h.beginRowIndex:f.rowIndex,e=c?g?h.endColIndex+1:f.colIndex:g?h.beginColIndex-1:f.colIndex<1?0:f.colIndex-1,this.getCell(this.indexTable[d][e].rowIndex,this.indexTable[d][e].cellIndex))}catch(i){a(i)}},moveContent:function(a,c){if(!b.isEmptyBlock(c)){if(b.isEmptyBlock(a))return void(a.innerHTML=c.innerHTML);var d=a.lastChild;for(3!=d.nodeType&&dtd.$block[d.tagName]||a.appendChild(a.ownerDocument.createElement("br"));d=c.firstChild;)a.appendChild(d)}},mergeRight:function(a){var b=this.getCellInfo(a),c=b.colIndex+b.colSpan,d=this.indexTable[b.rowIndex][c],e=this.getCell(d.rowIndex,d.cellIndex);a.colSpan=b.colSpan+d.colSpan,a.removeAttribute("width"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeDown:function(a){var b=this.getCellInfo(a),c=b.rowIndex+b.rowSpan,d=this.indexTable[c][b.colIndex],e=this.getCell(d.rowIndex,d.cellIndex);a.rowSpan=b.rowSpan+d.rowSpan,a.removeAttribute("height"),this.moveContent(a,e),this.deleteCell(e,d.rowIndex),this.update()},mergeRange:function(){var a=this.cellsRange,b=this.getCell(a.beginRowIndex,this.indexTable[a.beginRowIndex][a.beginColIndex].cellIndex);if("TH"==b.tagName&&a.endRowIndex!==a.beginRowIndex){var c=this.indexTable,d=this.getCellInfo(b);b=this.getCell(1,c[1][d.colIndex].cellIndex),a=this.getCellsRange(b,this.getCell(c[this.rowsNum-1][d.colIndex].rowIndex,c[this.rowsNum-1][d.colIndex].cellIndex))}for(var e,f=this.getCells(a),g=0;e=f[g++];)e!==b&&(this.moveContent(b,e),this.deleteCell(e));if(b.rowSpan=a.endRowIndex-a.beginRowIndex+1,b.rowSpan>1&&b.removeAttribute("height"),b.colSpan=a.endColIndex-a.beginColIndex+1,b.colSpan>1&&b.removeAttribute("width"),b.rowSpan==this.rowsNum&&1!=b.colSpan&&(b.colSpan=1),b.colSpan==this.colsNum&&1!=b.rowSpan){var h=b.parentNode.rowIndex;if(this.table.deleteRow)for(var g=h+1,i=h+1,j=b.rowSpan;g1&&g.rowIndex==a){var i=h.cloneNode(!0);i.rowSpan=h.rowSpan-1,i.innerHTML="",h.rowSpan=1;var j,k=a+1,l=this.table.rows[k],m=this.getPreviewMergedCellsNum(k,f)-e;m1?l.colSpan--:c[h].deleteCell(j.cellIndex),h+=j.rowSpan||1}}this.table.setAttribute("width",d-e),this.update()},splitToCells:function(a){var b=this,c=this.splitToRows(a);utils.each(c,function(a){b.splitToCols(a)})},splitToRows:function(a){var b=this.getCellInfo(a),c=b.rowIndex,d=b.colIndex,e=[];a.rowSpan=1,e.push(a);for(var f=c,g=c+b.rowSpan;f");for(var g=0;g'+(browser.ie&&browser.version<11?domUtils.fillChar:"
            ")+"");c.push("")}return"
            "+c.join("")+"
            "}b||(b=utils.extend({},{numCols:this.options.defaultCols,numRows:this.options.defaultRows,tdvalign:this.options.tdvalign}));var d=this,e=this.selection.getRange(),f=e.startContainer,h=domUtils.findParent(f,function(a){return domUtils.isBlockElm(a)},!0)||d.body,i=g(d),j=h.offsetWidth,k=Math.floor(j/b.numCols-2*i.tdPadding-i.tdBorder);!b.tdvalign&&(b.tdvalign=d.options.tdvalign),d.execCommand("inserthtml",c(b,k))}},UE.commands.insertparagraphbeforetable={queryCommandState:function(){return e(this).cell?0:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("p");b.innerHTML=browser.ie?" ":"
            ",a.parentNode.insertBefore(b,a),this.selection.getRange().setStart(b,0).setCursor()}}},UE.commands.deletetable={queryCommandState:function(){var a=this.selection.getRange();return domUtils.findParentByTagName(a.startContainer,"table",!0)?0:-1},execCommand:function(a,b){var c=this.selection.getRange();if(b=b||domUtils.findParentByTagName(c.startContainer,"table",!0)){var d=b.nextSibling;d||(d=domUtils.createElement(this.document,"p",{innerHTML:browser.ie?domUtils.fillChar:"
            "}),b.parentNode.insertBefore(d,b)),domUtils.remove(b),c=this.selection.getRange(),3==d.nodeType?c.setStartBefore(d):c.setStart(d,0),c.setCursor(!1,!0),this.fireEvent("tablehasdeleted")}}},UE.commands.cellalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("align",b)}},UE.commands.cellvalign={queryCommandState:function(){return c(this).length?0:-1},execCommand:function(a,b){var d=c(this);if(d.length)for(var e,f=0;e=d[f++];)e.setAttribute("vAlign",b)}},UE.commands.insertcaption={queryCommandState:function(){var a=e(this).table;return a&&0==a.getElementsByTagName("caption").length?1:-1},execCommand:function(){var a=e(this).table;if(a){var b=this.document.createElement("caption");b.innerHTML=browser.ie?domUtils.fillChar:"
            ",a.insertBefore(b,a.firstChild);var c=this.selection.getRange();c.setStart(b,0).setCursor()}}},UE.commands.deletecaption={queryCommandState:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");return b?0==b.getElementsByTagName("caption").length?-1:1:-1},execCommand:function(){var a=this.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,"table");if(b){domUtils.remove(b.getElementsByTagName("caption")[0]);var c=this.selection.getRange();c.setStart(b.rows[0].cells[0],0).setCursor()}}},UE.commands.inserttitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"!=b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&h(a).insertRow(0,"th");var b=a.getElementsByTagName("th")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.deletetitle={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[0];return"th"==b.cells[b.cells.length-1].tagName.toLowerCase()?0:-1}return-1},execCommand:function(){var a=e(this).table;a&&domUtils.remove(a.rows[0]);var b=a.getElementsByTagName("td")[0];this.selection.getRange().setStart(b,0).setCursor(!1,!0)}},UE.commands.inserttitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?-1:0}return-1},execCommand:function(b){var c=e(this).table;c&&h(c).insertCol(0,"th"),a(c,this);var d=c.getElementsByTagName("th")[0];this.selection.getRange().setStart(d,0).setCursor(!1,!0)}},UE.commands.deletetitlecol={queryCommandState:function(){var a=e(this).table;if(a){var b=a.rows[a.rows.length-1];return b.getElementsByTagName("th").length?0:-1}return-1},execCommand:function(){var b=e(this).table;if(b)for(var c=0;c=f.colsNum)return-1;var j=f.indexTable[g.rowIndex][i],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.rowIndex==g.rowIndex&&j.rowSpan==g.rowSpan?0:-1},execCommand:function(a){var b=this.selection.getRange(),c=b.createBookmark(!0),d=e(this).cell,f=h(d);f.mergeRight(d),b.moveToBookmark(c).select()}},UE.commands.mergedown={queryCommandState:function(a){var b=e(this),c=b.table,d=b.cell;if(!c||!d)return-1;var f=h(c);if(f.selectedTds.length)return-1;var g=f.getCellInfo(d),i=g.rowIndex+g.rowSpan;if(i>=f.rowsNum)return-1;var j=f.indexTable[i][g.colIndex],k=c.rows[j.rowIndex].cells[j.cellIndex];return k&&d.tagName==k.tagName&&j.colIndex==g.colIndex&&j.colSpan==g.colSpan?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.mergeDown(c),a.moveToBookmark(b).select()}},UE.commands.mergecells={queryCommandState:function(){return f(this)?0:-1},execCommand:function(){var a=f(this);if(a&&a.selectedTds.length){var b=a.selectedTds[0];a.mergeRange();var c=this.selection.getRange();domUtils.isEmptyBlock(b)?c.setStart(b,0).collapse(!0):c.selectNodeContents(b),c.select()}}},UE.commands.insertrow={queryCommandState:function(){var a=e(this),b=a.cell;return b&&("TD"==b.tagName||"TH"==b.tagName&&a.tr!==a.table.rows[0])&&h(a.table).rowsNum0?-1:b&&(b.colSpan>1||b.rowSpan>1)?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCells(c),a.moveToBookmark(b).select()}},UE.commands.splittorows={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.rowSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToRows(c),a.moveToBookmark(b).select()}},UE.commands.splittocols={queryCommandState:function(){var a=e(this),b=a.cell;if(!b)return-1;var c=h(a.table);return c.selectedTds.length>0?-1:b&&b.colSpan>1?0:-1},execCommand:function(){var a=this.selection.getRange(),b=a.createBookmark(!0),c=e(this).cell,d=h(c);d.splitToCols(c),a.moveToBookmark(b).select()}},UE.commands.adaptbytext=UE.commands.adaptbywindow={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(b){var c=e(this),d=c.table;if(d)if("adaptbywindow"==b)a(d,this);else{var f=domUtils.getElementsByTagName(d,"td th");utils.each(f,function(a){a.removeAttribute("width")}),d.removeAttribute("width")}}},UE.commands.averagedistributecol={queryCommandState:function(){var a=f(this);return a&&(a.isFullRow()||a.isFullCol())?0:-1},execCommand:function(a){function b(){var a,b=e.table,c=0,f=0,h=g(d,b);if(e.isFullRow())c=b.offsetWidth,f=e.colsNum;else for(var i,j=e.cellsRange.beginColIndex,k=e.cellsRange.endColIndex,l=j;l<=k;)i=e.selectedTds[l],c+=i.offsetWidth,l+=i.colSpan,f+=1;return a=Math.ceil(c/f)-2*h.tdBorder-2*h.tdPadding}function c(a){utils.each(domUtils.getElementsByTagName(e.table,"th"),function(a){a.setAttribute("width","")});var b=e.isFullRow()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.colSpan&&b.setAttribute("width",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.averagedistributerow={queryCommandState:function(){var a=f(this);return a?a.selectedTds&&/th/gi.test(a.selectedTds[0].tagName)?-1:a.isFullRow()||a.isFullCol()?0:-1:-1},execCommand:function(a){function b(){var a,b,c=0,f=e.table,h=g(d,f),i=parseInt(domUtils.getComputedStyle(f.getElementsByTagName("td")[0],"padding-top"));if(e.isFullCol()){var j,k,l=domUtils.getElementsByTagName(f,"caption"),m=domUtils.getElementsByTagName(f,"th");l.length>0&&(j=l[0].offsetHeight),m.length>0&&(k=m[0].offsetHeight),c=f.offsetHeight-(j||0)-(k||0),b=0==m.length?e.rowsNum:e.rowsNum-1}else{for(var n=e.cellsRange.beginRowIndex,o=e.cellsRange.endRowIndex,p=0,q=domUtils.getElementsByTagName(f,"tr"),r=n;r<=o;r++)c+=q[r].offsetHeight,p+=1;b=p}return a=browser.ie&&browser.version<9?Math.ceil(c/b):Math.ceil(c/b)-2*h.tdBorder-2*i}function c(a){var b=e.isFullCol()?domUtils.getElementsByTagName(e.table,"td"):e.selectedTds;utils.each(b,function(b){1==b.rowSpan&&b.setAttribute("height",a)})}var d=this,e=f(d);e&&e.selectedTds.length&&c(b())}},UE.commands.cellalignment={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){domUtils.setAttributes(a,b)});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);/caption/gi.test(g.tagName)?(g.style.textAlign=b.align,g.style.verticalAlign=b.vAlign):domUtils.setAttributes(g,b),c.selection.getRange().setCursor(!0)}},queryCommandValue:function(a){var b=e(this).cell;if(b||(b=c(this)[0]),b){var d=UE.UETable.getUETable(b).selectedTds;return!d.length&&(d=b),UE.UETable.getTableCellAlignState(d)}return null}},UE.commands.tablealignment={queryCommandState:function(){return browser.ie&&browser.version<8?-1:e(this).table?0:-1},execCommand:function(a,b){var c=this,d=c.selection.getStart(),e=d&&domUtils.findParentByTagName(d,["table"],!0);e&&e.setAttribute("align",b)}},UE.commands.edittable={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this.selection.getRange(),d=domUtils.findParentByTagName(c.startContainer,"table");if(d){var e=domUtils.getElementsByTagName(d,"td").concat(domUtils.getElementsByTagName(d,"th"),domUtils.getElementsByTagName(d,"caption"));utils.each(e,function(a){a.style.borderColor=b})}}},UE.commands.edittd={queryCommandState:function(){return e(this).table?0:-1},execCommand:function(a,b){var c=this,d=f(c);if(d)utils.each(d.selectedTds,function(a){a.style.backgroundColor=b});else{var e=c.selection.getStart(),g=e&&domUtils.findParentByTagName(e,["td","th","caption"],!0);g&&(g.style.backgroundColor=b)}}},UE.commands.settablebackground={queryCommandState:function(){return c(this).length>1?0:-1},execCommand:function(a,b){var d,e;d=c(this),e=h(d[0]),e.setBackground(d,b)}},UE.commands.cleartablebackground={queryCommandState:function(){var a=c(this);if(!a.length)return-1;for(var b,d=0;b=a[d++];)if(""!==b.style.backgroundColor)return 0;return-1},execCommand:function(){var a=c(this),b=h(a[0]);b.removeBackground(a)}},UE.commands.interlacetable=UE.commands.uninterlacetable={queryCommandState:function(a){var b=e(this).table;if(!b)return-1;var c=b.getAttribute("interlaced");return"interlacetable"==a?"enabled"===c?-1:0:c&&"disabled"!==c?0:-1},execCommand:function(a,b){var c=e(this).table;"interlacetable"==a?(c.setAttribute("interlaced","enabled"),this.fireEvent("interlacetable",c,b)):(c.setAttribute("interlaced","disabled"),this.fireEvent("uninterlacetable",c))}},UE.commands.setbordervisible={queryCommandState:function(a){var b=e(this).table;return b?0:-1},execCommand:function(){var a=e(this).table;utils.each(domUtils.getElementsByTagName(a,"td"),function(a){a.style.borderWidth="1px",a.style.borderStyle="solid"})}}}(),UE.plugins.table=function(){function a(a){}function b(a,b){c(a,"width",!0),c(a,"height",!0)}function c(a,b,c){a.style[b]&&(c&&a.setAttribute(b,parseInt(a.style[b],10)),a.style[b]="")}function d(a){if("TD"==a.tagName||"TH"==a.tagName)return a;var b;return(b=domUtils.findParentByTagName(a,"td",!0)||domUtils.findParentByTagName(a,"th",!0))?b:null}function e(a){var b=new RegExp(domUtils.fillChar,"g");if(a[browser.ie?"innerText":"textContent"].replace(/^\s*$/,"").replace(b,"").length>0)return 0;for(var c in dtd.$isNotEmpty)if(a.getElementsByTagName(c).length)return 0;return 1}function f(a){return a.pageX||a.pageY?{x:a.pageX,y:a.pageY}:{x:a.clientX+N.document.body.scrollLeft-N.document.body.clientLeft,y:a.clientY+N.document.body.scrollTop-N.document.body.clientTop}}function g(b){if(!A())try{var c,e=d(b.target||b.srcElement);if(R&&(N.body.style.webkitUserSelect="none",(Math.abs(V.x-b.clientX)>T||Math.abs(V.y-b.clientY)>T)&&(t(),R=!1,U=0,v(b))),ca&&ha)return U=0,N.body.style.webkitUserSelect="none",N.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),c=f(b),m(N,!0,ca,c,e),void("h"==ca?ga.style.left=k(ha,b)+"px":"v"==ca&&(ga.style.top=l(ha,b)+"px"));if(e){if(N.fireEvent("excludetable",e)===!0)return;c=f(b);var g=n(e,c),i=domUtils.findParentByTagName(e,"table",!0);if(j(i,e,b,!0)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"h.png),pointer"}else if(j(i,e,b)){if(N.fireEvent("excludetable",i)===!0)return;N.body.style.cursor="url("+N.options.cursorpath+"v.png),pointer"}else{N.body.style.cursor="text";/\d/.test(g)&&(g=g.replace(/\d/,""),e=Y(e).getPreviewCell(e,"v"==g)),m(N,!!e&&!!g,e?g:"",c,e)}}else h(!1,i,N)}catch(o){a(o)}}function h(a,b,c){if(a)i(b,c);else{if(fa)return;la=setTimeout(function(){!fa&&ea&&ea.parentNode&&ea.parentNode.removeChild(ea)},2e3)}}function i(a,b){function c(c,d){clearTimeout(g),g=setTimeout(function(){b.fireEvent("tableClicked",a,d)},300)}function d(c){clearTimeout(g);var d=Y(a),e=a.rows[0].cells[0],f=d.getLastCell(),h=d.getCellsRange(e,f);b.selection.getRange().setStart(e,0).setCursor(!1,!0),d.setSelected(h)}var e=domUtils.getXY(a),f=a.ownerDocument;if(ea&&ea.parentNode)return ea;ea=f.createElement("div"),ea.contentEditable=!1,ea.innerHTML="",ea.style.cssText="width:15px;height:15px;background-image:url("+b.options.UEDITOR_HOME_URL+"dialogs/table/dragicon.png);position: absolute;cursor:move;top:"+(e.y-15)+"px;left:"+e.x+"px;",domUtils.unSelectable(ea),ea.onmouseover=function(a){fa=!0},ea.onmouseout=function(a){fa=!1},domUtils.on(ea,"click",function(a,b){c(b,this)}),domUtils.on(ea,"dblclick",function(a,b){d(b)}),domUtils.on(ea,"dragstart",function(a,b){domUtils.preventDefault(b)});var g;f.body.appendChild(ea)}function j(a,b,c,d){var e=f(c),g=n(b,e);if(d){var h=a.getElementsByTagName("caption")[0],i=h?h.offsetHeight:0;return"v1"==g&&e.y-domUtils.getXY(a).y-i<8}return"h1"==g&&e.x-domUtils.getXY(a).x<8}function k(a,b){var c=Y(a);if(c){var d=c.getSameEndPosCells(a,"x")[0],e=c.getSameStartPosXCells(a)[0],g=f(b).x,h=(d?domUtils.getXY(d).x:domUtils.getXY(c.table).x)+20,i=e?domUtils.getXY(e).x+e.offsetWidth-20:N.body.offsetWidth+5||parseInt(domUtils.getComputedStyle(N.body,"width"),10);return h+=Q,i-=Q,gi?i:g}}function l(b,c){try{var d=domUtils.getXY(b).y,e=f(c).y;return ek[c]?(a=!1,!1):void l.push(d)});var b=a?l:k;utils.each(i,function(a,c){a.width=b[c]-G()})},0)}}}}function q(a){if(_(domUtils.getElementsByTagName(N.body,"td th")),utils.each(N.document.getElementsByTagName("table"),function(a){a.ueTable=null}),aa=M(N,a)){var b=domUtils.findParentByTagName(aa,"table",!0);ut=Y(b),ut&&ut.clearSelected(),da?r(a):(N.document.body.style.webkitUserSelect="",ia=!0,N.addListener("mouseover",x))}}function r(a){browser.ie&&(a=u(a)),t(),R=!0,O=setTimeout(function(){v(a)},W)}function s(a,b){for(var c=[],d=null,e=0,f=a.length;e0&&U--},W),2===U))return U=0,void p(b);if(2!=b.button){var c=this,d=c.selection.getRange(),e=domUtils.findParentByTagName(d.startContainer,"table",!0),f=domUtils.findParentByTagName(d.endContainer,"table",!0);if((e||f)&&(e===f?(e=domUtils.findParentByTagName(d.startContainer,["td","th","caption"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th","caption"],!0),e!==f&&c.selection.clearRange()):c.selection.clearRange()),ia=!1,c.document.body.style.webkitUserSelect="",ca&&ha&&(c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"](),U=0,ga=c.document.getElementById("ue_tableDragLine"))){var g=domUtils.getXY(ha),h=domUtils.getXY(ga);switch(ca){case"h":z(ha,h.x-g.x);break;case"v":B(ha,h.y-g.y-ha.offsetHeight)}return ca="",ha=null,I(c),void c.fireEvent("saveScene")}if(aa){var i=Y(aa),j=i?i.selectedTds[0]:null;if(j)d=new dom.Range(c.document),domUtils.isEmptyBlock(j)?d.setStart(j,0).setCursor(!1,!0):d.selectNodeContents(j).shrinkBoundary().setCursor(!1,!0);else if(d=c.selection.getRange().shrinkBoundary(),!d.collapsed){var e=domUtils.findParentByTagName(d.startContainer,["td","th"],!0),f=domUtils.findParentByTagName(d.endContainer,["td","th"],!0);(e&&!f||!e&&f||e&&f&&e!==f)&&d.setCursor(!1,!0)}aa=null,c.removeListener("mouseover",x)}else{var k=domUtils.findParentByTagName(b.target||b.srcElement,"td",!0);if(k||(k=domUtils.findParentByTagName(b.target||b.srcElement,"th",!0)),k&&("TD"==k.tagName||"TH"==k.tagName)){if(c.fireEvent("excludetable",k)===!0)return;d=new dom.Range(c.document),d.setStart(k,0).setCursor(!1,!0)}}c._selectionChange(250,b)}}}function x(a,b){if(!A()){var c=this,d=b.target||b.srcElement;if(ba=domUtils.findParentByTagName(d,"td",!0)||domUtils.findParentByTagName(d,"th",!0),aa&&ba&&("TD"==aa.tagName&&"TD"==ba.tagName||"TH"==aa.tagName&&"TH"==ba.tagName)&&domUtils.findParentByTagName(aa,"table")==domUtils.findParentByTagName(ba,"table")){var e=Y(ba);if(aa!=ba){c.document.body.style.webkitUserSelect="none",c.selection.getNative()[browser.ie9below?"empty":"removeAllRanges"]();var f=e.getCellsRange(aa,ba);e.setSelected(f)}else c.document.body.style.webkitUserSelect="",e.clearSelected()}b.preventDefault?b.preventDefault():b.returnValue=!1}}function y(a,b,c){var d=parseInt(domUtils.getComputedStyle(a,"line-height"),10),e=c+b;b=ef?(c&&g.push({left:a}),!1):void 0})}),g}function D(a,b,c){if(a-=G(),a<0)return 0;a-=E(b);var d=a<0?"left":"right";return a=Math.abs(a),utils.each(c,function(b){var c=b[d];c&&(a=Math.min(a,E(c)-Q))}),a=a<0?0:a,"left"===d?-a:a}function E(a){var b=0,b=a.offsetWidth-G();a.nextSibling||(b-=F(a)),b=b<0?0:b;try{a.width=b}catch(c){}return b}function F(a){if(tab=domUtils.findParentByTagName(a,"table",!1),void 0===tab.offsetVal){var b=a.previousSibling;b?tab.offsetVal=a.offsetWidth-b.offsetWidth===X.borderWidth?X.borderWidth:0:tab.offsetVal=0}return tab.offsetVal}function G(){if(void 0===X.tabcellSpace){var a=N.document.createElement("table"),b=N.document.createElement("tbody"),c=N.document.createElement("tr"),d=N.document.createElement("td"),e=null;d.style.cssText="border: 0;",d.width=1,c.appendChild(d),c.appendChild(e=d.cloneNode(!1)),b.appendChild(c),a.appendChild(b),a.style.cssText="visibility: hidden;",N.body.appendChild(a),X.paddingSpace=d.offsetWidth-1;var f=a.offsetWidth;d.style.cssText="",e.style.cssText="",X.borderWidth=(a.offsetWidth-f)/3,X.tabcellSpace=X.paddingSpace+X.borderWidth,N.body.removeChild(a)}return G=function(){return X.tabcellSpace},X.tabcellSpace}function H(a,b){ia||(ga=a.document.createElement("div"),domUtils.setAttributes(ga,{id:"ue_tableDragLine",unselectable:"on",contenteditable:!1,onresizestart:"return false",ondragstart:"return false",onselectstart:"return false",style:"background-color:blue;position:absolute;padding:0;margin:0;background-image:none;border:0px none;opacity:0;filter:alpha(opacity=0)"}),a.body.appendChild(ga))}function I(a){if(!ia)for(var b;b=a.document.getElementById("ue_tableDragLine");)domUtils.remove(b)}function J(a,b){if(b){var c,d=domUtils.findParentByTagName(b,"table"),e=d.getElementsByTagName("caption"),f=d.offsetWidth,g=d.offsetHeight-(e.length>0?e[0].offsetHeight:0),h=domUtils.getXY(d),i=domUtils.getXY(b);switch(a){case"h":c="height:"+g+"px;top:"+(h.y+(e.length>0?e[0].offsetHeight:0))+"px;left:"+(i.x+b.offsetWidth),ga.style.cssText=c+"px;position: absolute;display:block;background-color:blue;width:1px;border:0; color:blue;opacity:.3;filter:alpha(opacity=30)";break;case"v":c="width:"+f+"px;left:"+h.x+"px;top:"+(i.y+b.offsetHeight),ga.style.cssText=c+"px;overflow:hidden;position: absolute;display:block;background-color:blue;height:1px;border:0;color:blue;opacity:.2;filter:alpha(opacity=20)"}}}function K(a,b){for(var c,d,e=domUtils.getElementsByTagName(a.body,"table"),f=0;d=e[f++];){var g=domUtils.getElementsByTagName(d,"td");g[0]&&(b?(c=g[0].style.borderColor.replace(/\s/g,""),/(#ffffff)|(rgb\(255,255,255\))/gi.test(c)&&domUtils.addClass(d,"noBorderTable")):domUtils.removeClasses(d,"noBorderTable"))}}function L(a,b,c){var d=a.body;return d.offsetWidth-(b?2*parseInt(domUtils.getComputedStyle(d,"margin-left"),10):0)-2*c.tableBorder-(a.options.offsetWidth||0)}function M(a,b){var c=domUtils.findParentByTagName(b.target||b.srcElement,["td","th"],!0),d=null;if(!c)return null;if(d=n(c,f(b)),!c)return null;if("h1"===d&&c.previousSibling){var e=domUtils.getXY(c),g=c.offsetWidth;Math.abs(e.x+g-b.clientX)>g/3&&(c=c.previousSibling)}else if("v1"===d&&c.parentNode.previousSibling){var e=domUtils.getXY(c),h=c.offsetHeight;Math.abs(e.y+h-b.clientY)>h/3&&(c=c.parentNode.previousSibling.firstChild)}return c&&a.fireEvent("excludetable",c)!==!0?c:null}var N=this,O=null,P=null,Q=5,R=!1,S=5,T=10,U=0,V=null,W=360,X=UE.UETable,Y=function(a){return X.getUETable(a)},Z=function(a){return X.getUETableBySelected(a)},$=function(a,b){return X.getDefaultValue(a,b)},_=function(a){return X.removeSelectedClass(a)};N.ready(function(){var a=this,b=a.selection.getText;a.selection.getText=function(){var c=Z(a);if(c){var d="";return utils.each(c.selectedTds,function(a){d+=a[browser.ie?"innerText":"textContent"]}),d}return b.call(a.selection)}});var aa=null,ba=null,ca="",da=!1,ea=null,fa=!1,ga=null,ha=null,ia=!1,ja=!0;N.setOpt({maxColNum:20,maxRowNum:100,defaultCols:5,defaultRows:5,tdvalign:"top",cursorpath:N.options.UEDITOR_HOME_URL+"themes/default/images/cursor_",tableDragable:!1,classList:["ue-table-interlace-color-single","ue-table-interlace-color-double"]}),N.getUETable=Y;var ka={deletetable:1,inserttable:1,cellvalign:1,insertcaption:1,deletecaption:1,inserttitle:1,deletetitle:1,mergeright:1,mergedown:1,mergecells:1,insertrow:1,insertrownext:1,deleterow:1,insertcol:1,insertcolnext:1,deletecol:1,splittocells:1,splittorows:1,splittocols:1,adaptbytext:1,adaptbywindow:1,adaptbycustomer:1,insertparagraph:1,insertparagraphbeforetable:1,averagedistributecol:1,averagedistributerow:1};N.ready(function(){utils.cssRule("table",".selectTdClass{background-color:#edf5fa !important}table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}table{margin-bottom:10px;border-collapse:collapse;display:table;}td,th{padding: 5px 10px;border: 1px solid #DDD;}caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}th{border-top:1px solid #BBB;background-color:#F7F7F7;}table tr.firstRow th{border-top-width:2px;}.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }td p{margin:0;padding:0;}",N.document);var a,c,f;N.addListener("keydown",function(b,d){var g=this,h=d.keyCode||d.which;if(8==h){var i=Z(g);i&&i.selectedTds.length&&(i.isFullCol()?g.execCommand("deletecol"):i.isFullRow()?g.execCommand("deleterow"):g.fireEvent("delcells"),domUtils.preventDefault(d));var j=domUtils.findParentByTagName(g.selection.getStart(),"caption",!0),k=g.selection.getRange();if(k.collapsed&&j&&e(j)){g.fireEvent("saveScene");var l=j.parentNode;domUtils.remove(j),l&&k.setStart(l.rows[0].cells[0],0).setCursor(!1,!0),g.fireEvent("saveScene")}}if(46==h&&(i=Z(g))){g.fireEvent("saveScene");for(var m,n=0;m=i.selectedTds[n++];)domUtils.fillNode(g.document,m);g.fireEvent("saveScene"),domUtils.preventDefault(d)}if(13==h){var o=g.selection.getRange(),j=domUtils.findParentByTagName(o.startContainer,"caption",!0);if(j){var l=domUtils.findParentByTagName(j,"table");return o.collapsed?j&&o.setStart(l.rows[0].cells[0],0).setCursor(!1,!0):(o.deleteContents(),g.fireEvent("saveScene")),void domUtils.preventDefault(d)}if(o.collapsed){var l=domUtils.findParentByTagName(o.startContainer,"table");if(l){var p=l.rows[0].cells[0],q=domUtils.findParentByTagName(g.selection.getStart(),["td","th"],!0),r=l.previousSibling;if(p===q&&(!r||1==r.nodeType&&"TABLE"==r.tagName)&&domUtils.isStartInblock(o)){var s=domUtils.findParent(g.selection.getStart(),function(a){return domUtils.isBlockElm(a)},!0);s&&(/t(h|d)/i.test(s.tagName)||s===q.firstChild)&&(g.execCommand("insertparagraphbeforetable"),domUtils.preventDefault(d))}}}}if((d.ctrlKey||d.metaKey)&&"67"==d.keyCode){a=null;var i=Z(g);if(i){var t=i.selectedTds;c=i.isFullCol(),f=i.isFullRow(),a=[[i.cloneCell(t[0],null,!0)]];for(var m,n=1;m=t[n];n++)m.parentNode!==t[n-1].parentNode?a.push([i.cloneCell(m,null,!0)]):a[a.length-1].push(i.cloneCell(m,null,!0))}}}),N.addListener("tablehasdeleted",function(){m(this,!1,"",null),ea&&domUtils.remove(ea)}),N.addListener("beforepaste",function(d,g){var h=this,i=h.selection.getRange();if(domUtils.findParentByTagName(i.startContainer,"caption",!0)){var j=h.document.createElement("div");return j.innerHTML=g.html,void(g.html=j[browser.ie9below?"innerText":"textContent"])}var k=Z(h);if(a){h.fireEvent("saveScene");var l,m,i=h.selection.getRange(),n=domUtils.findParentByTagName(i.startContainer,["td","th"],!0);if(n){var o=Y(n);if(f){var p=o.getCellInfo(n).rowIndex;"TH"==n.tagName&&p++;for(var q,r=0;q=a[r++];){for(var s,t=o.insertRow(p++,"td"),u=0;s=q[u];u++){var v=t.cells[u];v||(v=t.insertCell(u)),v.innerHTML=s.innerHTML,s.getAttribute("width")&&v.setAttribute("width",s.getAttribute("width")),s.getAttribute("vAlign")&&v.setAttribute("vAlign",s.getAttribute("vAlign")),s.getAttribute("align")&&v.setAttribute("align",s.getAttribute("align")),s.style.cssText&&(v.style.cssText=s.style.cssText)}for(var s,u=0;(s=t.cells[u])&&q[u];u++)s.innerHTML=q[u].innerHTML,q[u].getAttribute("width")&&s.setAttribute("width",q[u].getAttribute("width")),q[u].getAttribute("vAlign")&&s.setAttribute("vAlign",q[u].getAttribute("vAlign")),q[u].getAttribute("align")&&s.setAttribute("align",q[u].getAttribute("align")),q[u].style.cssText&&(s.style.cssText=q[u].style.cssText)}}else{if(c){y=o.getCellInfo(n);for(var s,w=0,u=0,q=a[0];s=q[u++];)w+=s.colSpan||1;for(h.__hasEnterExecCommand=!0,r=0;r1&&(x.rowSpan=1)}var z=$(h),A=h.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(h.body,"margin-left"),10):0)-2*z.tableBorder-(h.options.offsetWidth||0);h.execCommand("insertHTML",""+k.innerHTML.replace(/>\s*<").replace(/\bth\b/gi,"td")+"
            ")}return h.fireEvent("contentchange"),h.fireEvent("saveScene"),g.html="",!0}var B,j=h.document.createElement("div");j.innerHTML=g.html,B=j.getElementsByTagName("table"),domUtils.findParentByTagName(h.selection.getStart(),"table")?(utils.each(B,function(a){domUtils.remove(a)}),domUtils.findParentByTagName(h.selection.getStart(),"caption",!0)&&(j.innerHTML=j[browser.ie?"innerText":"textContent"])):utils.each(B,function(a){b(a,!0),domUtils.removeAttributes(a,["style","border"]),utils.each(domUtils.getElementsByTagName(a,"td"),function(a){e(a)&&domUtils.fillNode(h.document,a),b(a,!0)})}),g.html=j.innerHTML}),N.addListener("afterpaste",function(){utils.each(domUtils.getElementsByTagName(N.body,"table"),function(a){if(a.offsetWidth>N.body.offsetWidth){var b=$(N,a);a.style.width=N.body.offsetWidth-(ja?2*parseInt(domUtils.getComputedStyle(N.body,"margin-left"),10):0)-2*b.tableBorder-(N.options.offsetWidth||0)+"px"}})}),N.addListener("blur",function(){a=null});var i;N.addListener("keydown",function(){clearTimeout(i),i=setTimeout(function(){var a=N.selection.getRange(),b=domUtils.findParentByTagName(a.startContainer,["th","td"],!0);if(b){var c=b.parentNode.parentNode.parentNode;c.offsetWidth>c.getAttribute("width")&&(b.style.wordBreak="break-all")}},100)}),N.addListener("selectionchange",function(){m(N,!1,"",null)}),N.addListener("contentchange",function(){var a=this;if(I(a),!Z(a)){var b=a.selection.getRange(),c=b.startContainer;c=domUtils.findParentByTagName(c,["td","th"],!0),utils.each(domUtils.getElementsByTagName(a.document,"table"),function(b){a.fireEvent("excludetable",b)!==!0&&(b.ueTable=new X(b),b.onmouseover=function(){a.fireEvent("tablemouseover",b)},b.onmousemove=function(){a.fireEvent("tablemousemove",b),a.options.tableDragable&&h(!0,this,a),utils.defer(function(){a.fireEvent("contentchange",50)},!0)},b.onmouseout=function(){a.fireEvent("tablemouseout",b),m(a,!1,"",null),I(a)},b.onclick=function(b){b=a.window.event||b;var c=d(b.target||b.srcElement);if(c){var e,f=Y(c),g=f.table,h=f.getCellInfo(c),i=a.selection.getRange();if(j(g,c,b,!0)){var k=f.getCell(f.indexTable[f.rowsNum-1][h.colIndex].rowIndex,f.indexTable[f.rowsNum-1][h.colIndex].cellIndex);return void(b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==k?(e=f.getCellsRange(f.selectedTds[0],k),f.setSelected(e)):i&&i.selectNodeContents(k).select():c!==k?(e=f.getCellsRange(c,k),f.setSelected(e)):i&&i.selectNodeContents(k).select())}if(j(g,c,b)){var l=f.getCell(f.indexTable[h.rowIndex][f.colsNum-1].rowIndex,f.indexTable[h.rowIndex][f.colsNum-1].cellIndex);b.shiftKey&&f.selectedTds.length?f.selectedTds[0]!==l?(e=f.getCellsRange(f.selectedTds[0],l),f.setSelected(e)):i&&i.selectNodeContents(l).select():c!==l?(e=f.getCellsRange(c,l),f.setSelected(e)):i&&i.selectNodeContents(l).select()}}})}),K(a,!0)}}),domUtils.on(N.document,"mousemove",g),domUtils.on(N.document,"mouseout",function(a){var b=a.target||a.srcElement;"TABLE"==b.tagName&&m(N,!1,"",null)}),N.addListener("interlacetable",function(a,b,c){if(b)for(var d=this,e=b.rows,f=e.length,g=function(a,b,c){return a[b]?a[b]:c?a[b%a.length]:""},h=0;h1?k:f.getCellInfo(d).rowIndex;var g=f.getTabNextCell(d,k);g?e(g)?a.setStart(g,0).setCursor(!1,!0):a.selectNodeContents(g).select():(N.fireEvent("saveScene"),N.__hasEnterExecCommand=!0,this.execCommand("insertrownext"),N.__hasEnterExecCommand=!1,a=this.selection.getRange(),a.setStart(c.rows[c.rows.length-1].cells[0],0).setCursor(),N.fireEvent("saveScene"))}return!0}}),browser.ie&&N.addListener("selectionchange",function(){m(this,!1,"",null)}),N.addListener("keydown",function(a,b){var c=this,d=b.keyCode||b.which;if(8!=d&&46!=d){var e=!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey);e&&_(domUtils.getElementsByTagName(c.body,"td"));var f=Z(c);f&&e&&f.clearSelected()}}),N.addListener("beforegetcontent",function(){K(this,!1),browser.ie&&utils.each(this.document.getElementsByTagName("caption"),function(a){domUtils.isEmptyNode(a)&&(a.innerHTML=" ")})}),N.addListener("aftergetcontent",function(){K(this,!0)}),N.addListener("getAllHtml",function(){_(N.document.getElementsByTagName("td"))}),N.addListener("fullscreenchanged",function(a,b){if(!b){var c=this.body.offsetWidth/document.body.offsetWidth,d=domUtils.getElementsByTagName(this.body,"table");utils.each(d,function(a){if(a.offsetWidth1||c[e].getAttribute("rowspan")>1)return-1;return b?"enablesort"==a^"sortEnabled"!=b.getAttribute("data-sort")?-1:0:-1},execCommand:function(a){var b=d(this).table;b.setAttribute("data-sort","enablesort"==a?"sortEnabled":"sortDisabled"),"enablesort"==a?domUtils.addClass(b,"sortEnabled"):domUtils.removeClasses(b,"sortEnabled")}}},UE.plugins.contextmenu=function(){var a=this;if(a.setOpt("enableContextMenu",!0),a.getOpt("enableContextMenu")!==!1){var b,c=a.getLang("contextMenu"),d=a.options.contextMenu||[{label:c.selectall,cmdName:"selectall"},{label:c.cleardoc,cmdName:"cleardoc",exec:function(){confirm(c.confirmclear)&&this.execCommand("cleardoc")}},"-",{label:c.unlink,cmdName:"unlink"},"-",{group:c.paragraph,icon:"justifyjustify",subMenu:[{label:c.justifyleft,cmdName:"justify",value:"left"},{label:c.justifyright,cmdName:"justify",value:"right"},{label:c.justifycenter,cmdName:"justify",value:"center"},{label:c.justifyjustify,cmdName:"justify",value:"justify"}]},"-",{group:c.table,icon:"table",subMenu:[{label:c.inserttable,cmdName:"inserttable"},{label:c.deletetable,cmdName:"deletetable"},"-",{label:c.deleterow,cmdName:"deleterow"},{label:c.deletecol,cmdName:"deletecol"},{label:c.insertcol,cmdName:"insertcol"},{label:c.insertcolnext,cmdName:"insertcolnext"},{label:c.insertrow,cmdName:"insertrow"},{label:c.insertrownext,cmdName:"insertrownext"},"-",{label:c.insertcaption,cmdName:"insertcaption"},{label:c.deletecaption,cmdName:"deletecaption"},{label:c.inserttitle,cmdName:"inserttitle"},{label:c.deletetitle,cmdName:"deletetitle"},{label:c.inserttitlecol,cmdName:"inserttitlecol"},{label:c.deletetitlecol,cmdName:"deletetitlecol"},"-",{label:c.mergecells,cmdName:"mergecells"},{label:c.mergeright,cmdName:"mergeright"},{label:c.mergedown,cmdName:"mergedown"},"-",{label:c.splittorows,cmdName:"splittorows"},{label:c.splittocols,cmdName:"splittocols"},{label:c.splittocells,cmdName:"splittocells"},"-",{label:c.averageDiseRow,cmdName:"averagedistributerow"},{label:c.averageDisCol,cmdName:"averagedistributecol"},"-",{label:c.edittd,cmdName:"edittd",exec:function(){UE.ui.edittd&&new UE.ui.edittd(this),this.getDialog("edittd").open()}},{label:c.edittable,cmdName:"edittable",exec:function(){UE.ui.edittable&&new UE.ui.edittable(this),this.getDialog("edittable").open()}},{label:c.setbordervisible,cmdName:"setbordervisible"}]},{group:c.tablesort,icon:"tablesort",subMenu:[{label:c.enablesort,cmdName:"enablesort"},{label:c.disablesort,cmdName:"disablesort"},"-",{label:c.reversecurrent,cmdName:"sorttable",value:"reversecurrent"},{label:c.orderbyasc,cmdName:"sorttable",value:"orderbyasc"},{label:c.reversebyasc,cmdName:"sorttable",value:"reversebyasc"},{label:c.orderbynum,cmdName:"sorttable",value:"orderbynum"},{label:c.reversebynum,cmdName:"sorttable",value:"reversebynum"}]},{group:c.borderbk,icon:"borderBack",subMenu:[{label:c.setcolor,cmdName:"interlacetable",exec:function(){this.execCommand("interlacetable")}},{label:c.unsetcolor,cmdName:"uninterlacetable",exec:function(){this.execCommand("uninterlacetable")}},{label:c.setbackground,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#bbb","#ccc"]})}},{label:c.unsetbackground,cmdName:"cleartablebackground",exec:function(){this.execCommand("cleartablebackground")}},{label:c.redandblue,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["red","blue"]})}},{label:c.threecolorgradient,cmdName:"settablebackground",exec:function(){this.execCommand("settablebackground",{repeat:!0,colorList:["#aaa","#bbb","#ccc"]})}}]},{group:c.aligntd,icon:"aligntd",subMenu:[{cmdName:"cellalignment",value:{align:"left",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"top"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"middle"}},{cmdName:"cellalignment",value:{align:"left",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"center",vAlign:"bottom"}},{cmdName:"cellalignment",value:{align:"right",vAlign:"bottom"}}]},{group:c.aligntable,icon:"aligntable",subMenu:[{cmdName:"tablealignment",className:"left",label:c.tableleft,value:"left"},{cmdName:"tablealignment",className:"center",label:c.tablecenter,value:"center"},{cmdName:"tablealignment",className:"right",label:c.tableright,value:"right"}]},"-",{label:c.insertparagraphbefore,cmdName:"insertparagraph",value:!0},{label:c.insertparagraphafter,cmdName:"insertparagraph"},{label:c.copy,cmdName:"copy"},{label:c.paste,cmdName:"paste"}];if(d.length){var e=UE.ui.uiUtils;a.addListener("contextmenu",function(f,g){var h=e.getViewportOffsetByEvent(g);a.fireEvent("beforeselectionchange"),b&&b.destroy();for(var i,j=0,k=[];i=d[j];j++){var l;!function(b){function d(){switch(b.icon){case"table":return a.getLang("contextMenu.table");case"justifyjustify":return a.getLang("contextMenu.paragraph");case"aligntd":return a.getLang("contextMenu.aligntd");case"aligntable":return a.getLang("contextMenu.aligntable");case"tablesort":return c.tablesort;case"borderBack":return c.borderbk;default:return""}}if("-"==b)(l=k[k.length-1])&&"-"!==l&&k.push("-");else if(b.hasOwnProperty("group")){for(var e,f=0,g=[];e=b.subMenu[f];f++)!function(b){"-"==b?(l=g[g.length-1])&&"-"!==l?g.push("-"):g.splice(g.length-1):(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query():a.queryCommandState(b.cmdName))>-1&&g.push({label:b.label||a.getLang("contextMenu."+b.cmdName+(b.value||""))||"",className:"edui-for-"+b.cmdName+(b.className?" edui-for-"+b.cmdName+"-"+b.className:""),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(e);g.length&&k.push({label:d(),className:"edui-for-"+b.icon,subMenu:{items:g,editor:a}})}else(a.commands[b.cmdName]||UE.commands[b.cmdName]||b.query)&&(b.query?b.query.call(a):a.queryCommandState(b.cmdName))>-1&&k.push({label:b.label||a.getLang("contextMenu."+b.cmdName),className:"edui-for-"+(b.icon?b.icon:b.cmdName+(b.value||"")),onclick:b.exec?function(){b.exec.call(a)}:function(){a.execCommand(b.cmdName,b.value)}})}(i)}if("-"==k[k.length-1]&&k.pop(),b=new UE.ui.Menu({items:k,className:"edui-contextmenu",editor:a}),b.render(),b.showAt(h),a.fireEvent("aftershowcontextmenu",b),domUtils.preventDefault(g),browser.ie){var m;try{m=a.selection.getNative().createRange()}catch(n){return}if(m.item){var o=new dom.Range(a.document);o.selectNode(m.item(0)).select(!0,!0)}}}),a.addListener("aftershowcontextmenu",function(b,c){if(a.zeroclipboard){var d=c.items;for(var e in d)"edui-for-copy"==d[e].className&&a.zeroclipboard.clip(d[e].getDom())}})}}},UE.plugins.shortcutmenu=function(){var a,b=this,c=b.options.shortcutMenu||[];c.length&&(b.addListener("contextmenu mouseup",function(b,d){var e=this,f={type:b,target:d.target||d.srcElement,screenX:d.screenX,screenY:d.screenY,clientX:d.clientX,clientY:d.clientY};if(setTimeout(function(){var d=e.selection.getRange();d.collapsed!==!1&&"contextmenu"!=b||(a||(a=new baidu.editor.ui.ShortCutMenu({editor:e,items:c,theme:e.options.theme,className:"edui-shortcutmenu"}),a.render(),e.fireEvent("afterrendershortcutmenu",a)),a.show(f,!!UE.plugins.contextmenu))}),"contextmenu"==b&&(domUtils.preventDefault(d),browser.ie9below)){var g;try{g=e.selection.getNative().createRange()}catch(d){return}if(g.item){var h=new dom.Range(e.document);h.selectNode(g.item(0)).select(!0,!0)}}}),b.addListener("keydown",function(b){"keydown"==b&&a&&!a.isHidden&&a.hide()}))},UE.plugins.basestyle=function(){var a={bold:["strong","b"],italic:["em","i"],subscript:["sub"],superscript:["sup"]},b=function(a,b){return domUtils.filterNodeList(a.selection.getStartElementPath(),b)},c=this;c.addshortcutkey({Bold:"ctrl+66",Italic:"ctrl+73",Underline:"ctrl+85"}),c.addInputRule(function(a){utils.each(a.getNodesByTagName("b i"),function(a){switch(a.tagName){case"b":a.tagName="strong";break;case"i":a.tagName="em"}})});for(var d in a)!function(a,d){c.commands[a]={execCommand:function(a){var e=c.selection.getRange(),f=b(this,d);if(e.collapsed){if(f){var g=c.document.createTextNode("");e.insertNode(g).removeInlineStyle(d),e.setStartBefore(g),domUtils.remove(g)}else{var h=e.document.createElement(d[0]);"superscript"!=a&&"subscript"!=a||(g=c.document.createTextNode(""),e.insertNode(g).removeInlineStyle(["sub","sup"]).setStartBefore(g).collapse(!0)),e.insertNode(h).setStart(h,0)}e.collapse(!0)}else"superscript"!=a&&"subscript"!=a||f&&f.tagName.toLowerCase()==a||e.removeInlineStyle(["sub","sup"]),f?e.removeInlineStyle(d):e.applyInlineStyle(d[0]);e.select()},queryCommandState:function(){return b(this,d)?1:0}}}(d,a[d])},UE.plugins.elementpath=function(){var a,b,c=this;c.setOpt("elementPathEnabled",!0),c.options.elementPathEnabled&&(c.commands.elementpath={execCommand:function(d,e){var f=b[e],g=c.selection.getRange();a=1*e,g.selectNode(f).select()},queryCommandValue:function(){var c=[].concat(this.selection.getStartElementPath()).reverse(),d=[];b=c;for(var e,f=0;e=c[f];f++)if(3!=e.nodeType){var g=e.tagName.toLowerCase();if("img"==g&&e.getAttribute("anchorname")&&(g="anchor"),d[f]=g,a==f){a=-1;break}}return d}})},UE.plugins.formatmatch=function(){function a(f,g){function h(a){return m&&a.selectNode(m),a.applyInlineStyle(d[d.length-1].tagName,null,d)}if(browser.webkit)var i="IMG"==g.target.tagName?g.target:null;c.undoManger&&c.undoManger.save();var j=c.selection.getRange(),k=i||j.getClosedNode();if(b&&k&&"IMG"==k.tagName)k.style.cssText+=";float:"+(b.style.cssFloat||b.style.styleFloat||"none")+";display:"+(b.style.display||"inline"),b=null;else if(!b){var l=j.collapsed;if(l){var m=c.document.createTextNode("match");j.insertNode(m).select()}c.__hasEnterExecCommand=!0;var n=c.options.removeFormatAttributes;c.options.removeFormatAttributes="",c.execCommand("removeformat"),c.options.removeFormatAttributes=n,c.__hasEnterExecCommand=!1,j=c.selection.getRange(),d.length&&h(j),m&&j.setStartBefore(m).collapse(!0),j.select(),m&&domUtils.remove(m)}c.undoManger&&c.undoManger.save(),c.removeListener("mouseup",a),e=0}var b,c=this,d=[],e=0;c.addListener("reset",function(){d=[],e=0}),c.commands.formatmatch={execCommand:function(f){if(e)return e=0,d=[],void c.removeListener("mouseup",a);var g=c.selection.getRange();if(b=g.getClosedNode(),!b||"IMG"!=b.tagName){g.collapse(!0).shrinkBoundary();var h=g.startContainer;d=domUtils.findParents(h,!0,function(a){return!domUtils.isBlockElm(a)&&1==a.nodeType});for(var i,j=0;i=d[j];j++)if("A"==i.tagName){d.splice(j,1);break}}c.addListener("mouseup",a),e=1},queryCommandState:function(){return e},notNeedUndo:1}},UE.plugin.register("searchreplace",function(){function a(a,b,c){var d=b.searchStr;b.dir==-1&&(a=a.split("").reverse().join(""),d=d.split("").reverse().join(""),c=a.length-c);for(var e,f=new RegExp(d,"g"+(b.casesensitive?"":"i"));e=f.exec(a);)if(e.index>=c)return b.dir==-1?a.length-e.index-b.searchStr.length:e.index;return-1}function b(b,c,d){var e,f,h=d.all||1==d.dir?"getNextDomNode":"getPreDomNode";domUtils.isBody(b)&&(b=b.firstChild);for(var i=1;b;){if(e=3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"],f=a(e,d,c),i=0,f!=-1)return{node:b,index:f};for(b=domUtils[h](b);b&&g[b.nodeName.toLowerCase()];)b=domUtils[h](b,!0);b&&(c=d.dir==-1?(3==b.nodeType?b.nodeValue:b[browser.ie?"innerText":"textContent"]).length:0)}}function c(a,b,d){for(var e,f=0,g=a.firstChild,h=0;g;){if(3==g.nodeType){if(h=g.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b)return{node:g,index:h-(f-b)}}else if(!dtd.$empty[g.tagName]&&(h=g[browser.ie?"innerText":"textContent"].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,"").length,f+=h,f>=b&&(e=c(g,h-(f-b),d))))return e;g=domUtils.getNextDomNode(g)}}function d(a,d){var f,g=a.selection.getRange(),h=d.searchStr,i=a.document.createElement("span");if(i.innerHTML="$$ueditor_searchreplace_key$$",g.shrinkBoundary(!0),!g.collapsed){g.select();var j=a.selection.getText();if(new RegExp("^"+d.searchStr+"$",d.casesensitive?"":"i").test(j)){if(void 0!=d.replaceStr)return e(g,d.replaceStr),g.select(),!0;g.collapse(d.dir==-1)}}g.insertNode(i),g.enlargeToBlockElm(!0),f=g.startContainer;var k=f[browser.ie?"innerText":"textContent"].indexOf("$$ueditor_searchreplace_key$$");g.setStartBefore(i),domUtils.remove(i);var l=b(f,k,d);if(l){var m=c(l.node,l.index,h),n=c(l.node,l.index+h.length,h);return g.setStart(m.node,m.index).setEnd(n.node,n.index),void 0!==d.replaceStr&&e(g,d.replaceStr),g.select(),!0}g.setCursor()}function e(a,b){b=f.document.createTextNode(b),a.deleteContents().insertNode(b)}var f=this,g={table:1,tbody:1,tr:1,ol:1,ul:1};return{commands:{searchreplace:{execCommand:function(a,b){utils.extend(b,{all:!1,casesensitive:!1,dir:1},!0);var c=0;if(b.all){var e=f.selection.getRange(),g=f.body.firstChild;for(g&&1==g.nodeType?(e.setStart(g,0),e.shrinkBoundary(!0)):3==g.nodeType&&e.setStartBefore(g),e.collapse(!0).select(!0),void 0!==b.replaceStr&&f.fireEvent("saveScene");d(this,b);)c++;c&&f.fireEvent("saveScene")}else void 0!==b.replaceStr&&f.fireEvent("saveScene"),d(this,b)&&c++,c&&f.fireEvent("saveScene");return c},notNeedUndo:1}}}}),UE.plugins.customstyle=function(){var a=this;a.setOpt({customstyle:[{tag:"h1",name:"tc",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;"},{tag:"h1",name:"tl",style:"font-size:32px;font-weight:bold;border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:left;margin:0 0 10px 0;"},{tag:"span",name:"im",style:"font-size:16px;font-style:italic;font-weight:bold;line-height:18px;"},{tag:"span",name:"hi",style:"font-size:16px;font-style:italic;font-weight:bold;color:rgb(51, 153, 204);line-height:18px;"}]}),a.commands.customstyle={execCommand:function(a,b){var c,d,e=this,f=b.tag,g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")},!0),h={};for(var i in b)void 0!==b[i]&&(h[i]=b[i]);if(delete h.tag,g&&g.getAttribute("label")==b.label){if(c=this.selection.getRange(),d=c.createBookmark(),c.collapsed)if(dtd.$block[g.tagName]){var j=e.document.createElement("p");domUtils.moveChild(g,j),g.parentNode.insertBefore(j,g),domUtils.remove(g)}else domUtils.remove(g,!0);else{var k=domUtils.getCommonAncestor(d.start,d.end),l=domUtils.getElementsByTagName(k,f);new RegExp(f,"i").test(k.tagName)&&l.push(k);for(var m,n=0;m=l[n++];)if(m.getAttribute("label")==b.label){var o=domUtils.getPosition(m,d.start),p=domUtils.getPosition(m,d.end);if((o&domUtils.POSITION_FOLLOWING||o&domUtils.POSITION_CONTAINS)&&(p&domUtils.POSITION_PRECEDING||p&domUtils.POSITION_CONTAINS)&&dtd.$block[f]){var j=e.document.createElement("p");domUtils.moveChild(m,j),m.parentNode.insertBefore(j,m)}domUtils.remove(m,!0)}g=domUtils.findParent(k,function(a){return a.getAttribute("label")==b.label},!0),g&&domUtils.remove(g,!0)}c.moveToBookmark(d).select()}else if(dtd.$block[f]){if(this.execCommand("paragraph",f,h,"customstyle"),c=e.selection.getRange(),!c.collapsed){c.collapse(),g=domUtils.findParent(e.selection.getStart(),function(a){return a.getAttribute("label")==b.label},!0);var q=e.document.createElement("p");domUtils.insertAfter(g,q),domUtils.fillNode(e.document,q),c.setStart(q,0).setCursor()}}else{if(c=e.selection.getRange(),c.collapsed)return g=e.document.createElement(f),domUtils.setAttributes(g,h),void c.insertNode(g).setStart(g,0).setCursor();d=c.createBookmark(),c.applyInlineStyle(f,h).moveToBookmark(d).select()}},queryCommandValue:function(){var a=domUtils.filterNodeList(this.selection.getStartElementPath(),function(a){return a.getAttribute("label")});return a?a.getAttribute("label"):""}},a.addListener("keyup",function(b,c){var d=c.keyCode||c.which;if(32==d||13==d){var e=a.selection.getRange();if(e.collapsed){var f=domUtils.findParent(a.selection.getStart(),function(a){return a.getAttribute("label")},!0);if(f&&dtd.$block[f.tagName]&&domUtils.isEmptyNode(f)){var g=a.document.createElement("p");domUtils.insertAfter(f,g),domUtils.fillNode(a.document,g),domUtils.remove(f),e.setStart(g,0).setCursor()}}}})},UE.plugins.catchremoteimage=function(){var me=this,ajax=UE.ajax;me.options.catchRemoteImageEnable!==!1&&(me.setOpt({catchRemoteImageEnable:!1}),me.addListener("afterpaste",function(){me.fireEvent("catchRemoteImage")}),me.addListener("catchRemoteImage",function(){function catchremoteimage(a,b){var c=utils.serializeParam(me.queryCommandValue("serverparam"))||"",d=utils.formatUrl(catcherActionUrl+(catcherActionUrl.indexOf("?")==-1?"?":"&")+c),e=utils.isCrossDomainUrl(d),f={method:"POST",dataType:e?"jsonp":"",timeout:6e4,onsuccess:b.success,onerror:b.error};f[catcherFieldName]=a,ajax.request(d,f)}for(var catcherLocalDomain=me.getOpt("catcherLocalDomain"),catcherActionUrl=me.getActionUrl(me.getOpt("catcherActionName")),catcherUrlPrefix=me.getOpt("catcherUrlPrefix"),catcherFieldName=me.getOpt("catcherFieldName"),remoteImages=[],imgs=domUtils.getElementsByTagName(me.document,"img"),test=function(a,b){if(a.indexOf(location.host)!=-1||/(^\.)|(^\/)/.test(a))return!0;if(b)for(var c,d=0;c=b[d++];)if(a.indexOf(c)!==-1)return!0;return!1},i=0,ci;ci=imgs[i++];)if(!ci.getAttribute("word_img")){var src=ci.getAttribute("_src")||ci.src||"";/^(https?|ftp):/i.test(src)&&!test(src,catcherLocalDomain)&&remoteImages.push(src)}remoteImages.length&&catchremoteimage(remoteImages,{success:function(r){try{var info=void 0!==r.state?r:eval("("+r.responseText+")")}catch(e){return}var i,j,ci,cj,oldSrc,newSrc,list=info.list;for(i=0;ci=imgs[i++];)for(oldSrc=ci.getAttribute("_src")||ci.src||"",j=0;cj=list[j++];)if(oldSrc==cj.source&&"SUCCESS"==cj.state){newSrc=catcherUrlPrefix+cj.url,domUtils.setAttributes(ci,{src:newSrc,_src:newSrc});break}me.fireEvent("catchremotesuccess")},error:function(){me.fireEvent("catchremoteerror")}})}))},UE.plugin.register("snapscreen",function(){function getLocation(a){var b,c=document.createElement("a"),d=utils.serializeParam(me.queryCommandValue("serverparam"))||"";return c.href=a,browser.ie&&(c.href=c.href),b=c.search,d&&(b=b+(b.indexOf("?")==-1?"?":"&")+d,b=b.replace(/[&]+/gi,"&")),{port:c.port,hostname:c.hostname,path:c.pathname+b||+c.hash}}var me=this,snapplugin;return{commands:{snapscreen:{execCommand:function(cmd){function onSuccess(rs){try{if(rs=eval("("+rs+")"),"SUCCESS"==rs.state){var opt=me.options;me.execCommand("insertimage",{src:opt.snapscreenUrlPrefix+rs.url,_src:opt.snapscreenUrlPrefix+rs.url,alt:rs.title||"",floatStyle:opt.snapscreenImgAlign})}else alert(rs.state)}catch(e){alert(lang.callBackErrorMsg)}}var url,local,res,lang=me.getLang("snapScreen_plugin");if(!snapplugin){var container=me.container,doc=me.container.ownerDocument||me.container.document;snapplugin=doc.createElement("object");try{snapplugin.type="application/x-pluginbaidusnap"}catch(e){return}snapplugin.style.cssText="position:absolute;left:-9999px;width:0;height:0;",snapplugin.setAttribute("width","0"),snapplugin.setAttribute("height","0"),container.appendChild(snapplugin)}url=me.getActionUrl(me.getOpt("snapscreenActionName")),local=getLocation(url),setTimeout(function(){try{res=snapplugin.saveSnapshot(local.hostname,local.path,local.port)}catch(a){return void me.ui._dialogs.snapscreenDialog.open()}onSuccess(res)},50)},queryCommandState:function(){return navigator.userAgent.indexOf("Windows",0)!=-1?0:-1}}}}}),UE.commands.insertparagraph={execCommand:function(a,b){for(var c,d=this,e=d.selection.getRange(),f=e.startContainer;f&&!domUtils.isBody(f);)c=f,f=f.parentNode;if(c){var g=d.document.createElement("p");b?c.parentNode.insertBefore(g,c):c.parentNode.insertBefore(g,c.nextSibling),domUtils.fillNode(d.document,g),e.setStart(g,0).setCursor(!1,!0)}}},UE.plugin.register("webapp",function(){function a(a,c){return c?'':'"}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-webapp"==b.getAttr("class")){c=a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("_url"),logo:b.getAttr("_logo_url")},!0);var d=UE.uNode.createElement(c);b.parentNode.replaceChild(d,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("iframe"),function(b){if("edui-faked-webapp"==b.getAttr("class")){var c=UE.uNode.createElement(a({title:b.getAttr("title"),width:b.getAttr("width"),height:b.getAttr("height"),align:b.getAttr("align"),cssfloat:b.getStyle("float"),url:b.getAttr("src"),logo:b.getAttr("logo_url")}));b.parentNode.replaceChild(c,b)}})},commands:{webapp:{execCommand:function(b,c){var d=this,e=a(utils.extend(c,{align:"none"}),!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-webapp"==b.className;return c?1:0}}}}}),UE.plugins.template=function(){UE.commands.template={execCommand:function(a,b){b.html&&this.execCommand("inserthtml",b.html)}},this.addListener("click",function(a,b){var c=b.target||b.srcElement,d=this.selection.getRange(),e=domUtils.findParent(c,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);e&&d.selectNode(e).shrinkBoundary().select()}),this.addListener("keydown",function(a,b){var c=this.selection.getRange();if(!c.collapsed&&!(b.ctrlKey||b.metaKey||b.shiftKey||b.altKey)){var d=domUtils.findParent(c.startContainer,function(a){if(a.className&&domUtils.hasClass(a,"ue_t"))return a},!0);d&&domUtils.removeClasses(d,["ue_t"])}})},UE.plugin.register("music",function(){function a(a,c,d,e,f,g){return g?'':"'}var b=this;return{outputRule:function(b){utils.each(b.getNodesByTagName("img"),function(b){var c;if("edui-faked-music"==b.getAttr("class")){var d=b.getStyle("float"),e=b.getAttr("align");c=a(b.getAttr("_url"),b.getAttr("width"),b.getAttr("height"),e,d,!0);var f=UE.uNode.createElement(c);b.parentNode.replaceChild(f,b)}})},inputRule:function(b){utils.each(b.getNodesByTagName("embed"),function(b){if("edui-faked-music"==b.getAttr("class")){var c=b.getStyle("float"),d=b.getAttr("align");html=a(b.getAttr("src"),b.getAttr("width"),b.getAttr("height"),d,c,!1);var e=UE.uNode.createElement(html);b.parentNode.replaceChild(e,b)}})},commands:{music:{execCommand:function(b,c){var d=this,e=a(c.url,c.width||400,c.height||95,"none",!1);d.execCommand("inserthtml",e)},queryCommandState:function(){var a=this,b=a.selection.getRange().getClosedNode(),c=b&&"edui-faked-music"==b.className;return c?1:0}}}}}),UE.plugin.register("autoupload",function(){function a(a,b){var c,d,e,f,g,h,i,j,k=b,l=/image\/\w+/i.test(a.type)?"image":"file",m="loading_"+(+new Date).toString(36);if(c=k.getOpt(l+"FieldName"),d=k.getOpt(l+"UrlPrefix"),e=k.getOpt(l+"MaxSize"),f=k.getOpt(l+"AllowFiles"),g=k.getActionUrl(k.getOpt(l+"ActionName")),i=function(a){var b=k.document.getElementById(m);b&&domUtils.remove(b),k.fireEvent("showmessage",{id:m,content:a,type:"error",timeout:4e3})},"image"==l?(h='',j=function(a){var b=d+a.url,c=k.document.getElementById(m);c&&(c.setAttribute("src",b),c.setAttribute("_src",b),c.setAttribute("title",a.title||""),c.setAttribute("alt",a.original||""),c.removeAttribute("id"),domUtils.removeClasses(c,"loadingclass"))}):(h='

            ',j=function(a){var b=d+a.url,c=k.document.getElementById(m),e=k.selection.getRange(),f=e.createBookmark();e.selectNode(c).select(),k.execCommand("insertfile",{url:b}),e.moveToBookmark(f).select()}),k.execCommand("inserthtml",h),!k.getOpt(l+"ActionName"))return void i(k.getLang("autoupload.errorLoadConfig"));if(a.size>e)return void i(k.getLang("autoupload.exceedSizeError"));var n=a.name?a.name.substr(a.name.lastIndexOf(".")):"";if(n&&"image"!=l||f&&(f.join("")+".").indexOf(n.toLowerCase()+".")==-1)return void i(k.getLang("autoupload.exceedTypeError"));var o=new XMLHttpRequest,p=new FormData,q=utils.serializeParam(k.queryCommandValue("serverparam"))||"",r=utils.formatUrl(g+(g.indexOf("?")==-1?"?":"&")+q);p.append(c,a,a.name||"blob."+a.type.substr("image/".length)),p.append("type","ajax"),o.open("post",r,!0),o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.addEventListener("load",function(a){try{var b=new Function("return "+utils.trim(a.target.response))();"SUCCESS"==b.state&&b.url?j(b):i(b.state)}catch(c){i(k.getLang("autoupload.loadError"))}}),o.send(p)}function b(a){return a.clipboardData&&a.clipboardData.items&&1==a.clipboardData.items.length&&/^image\//.test(a.clipboardData.items[0].type)?a.clipboardData.items:null}function c(a){return a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:null}return{outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)}),utils.each(a.getNodesByTagName("p"),function(a){/\bloadpara\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},bindEvents:{ready:function(d){var e=this;window.FormData&&window.FileReader&&(domUtils.on(e.body,"paste drop",function(d){var f,g=!1;if(f="paste"==d.type?b(d):c(d)){for(var h,i=f.length;i--;)h=f[i],h.getAsFile&&(h=h.getAsFile()),h&&h.size>0&&(a(h,e),g=!0);g&&d.preventDefault()}}),domUtils.on(e.body,"dragover",function(a){"Files"==a.dataTransfer.types[0]&&a.preventDefault()}),utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-left:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document))}}}}),UE.plugin.register("autosave",function(){function a(a){var f;if(!(new Date-c0?b._saveFlag=window.setTimeout(function(){a(b)},b.options.saveInterval):a(b))}},commands:{clearlocaldata:{execCommand:function(a,c){e&&b.getPreferences(e)&&b.removePreferences(e)},notNeedUndo:!0,ignoreContentChange:!0},getlocaldata:{execCommand:function(a,c){return e?b.getPreferences(e)||"":""},notNeedUndo:!0,ignoreContentChange:!0},drafts:{execCommand:function(a,c){e&&(b.body.innerHTML=b.getPreferences(e)||"

            "+domUtils.fillHtml+"

            ",b.focus(!0))},queryCommandState:function(){return e?null===b.getPreferences(e)?-1:0:-1},notNeedUndo:!0,ignoreContentChange:!0}}}}),UE.plugin.register("charts",function(){function a(a){var b=null,c=0;if(a.rows.length<2)return!1;if(a.rows[0].cells.length<2)return!1;b=a.rows[0].cells,c=b.length;for(var d,e=0;d=b[e];e++)if("th"!==d.tagName.toLowerCase())return!1;for(var f,e=1;f=a.rows[e];e++){if(f.cells.length!=c)return!1;if("th"!==f.cells[0].tagName.toLowerCase())return!1;for(var d,g=1;d=f.cells[g];g++){var h=utils.trim(d.innerText||d.textContent||"");if(h=h.replace(new RegExp(UE.dom.domUtils.fillChar,"g"),"").replace(/^\s+|\s+$/g,""),!/^\d*\.?\d+$/.test(h))return!1}}return!0}var b=this;return{bindEvents:{chartserror:function(){}},commands:{charts:{execCommand:function(c,d){var e=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0),f=[],g={};if(!e)return!1;if(!a(e))return b.fireEvent("chartserror"),!1;g.title=d.title||"",g.subTitle=d.subTitle||"",g.xTitle=d.xTitle||"",g.yTitle=d.yTitle||"",g.suffix=d.suffix||"",g.tip=d.tip||"",g.dataFormat=d.tableDataFormat||"",g.chartType=d.chartType||0;for(var h in g)g.hasOwnProperty(h)&&f.push(h+":"+g[h]);e.setAttribute("data-chart",f.join(";")),domUtils.addClass(e,"edui-charts-table")},queryCommandState:function(b,c){ +var d=domUtils.findParentByTagName(this.selection.getRange().startContainer,"table",!0);return d&&a(d)?0:-1}}},inputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style")})},outputRule:function(a){utils.each(a.getNodesByTagName("table"),function(a){void 0!==a.getAttr("data-chart")&&a.setAttr("style","display: none;")})}}}),UE.plugin.register("section",function(){function a(a){this.tag="",this.level=-1,this.dom=null,this.nextSection=null,this.previousSection=null,this.parentSection=null,this.startAddress=[],this.endAddress=[],this.children=[]}function b(b){var c=new a;return utils.extend(c,b)}function c(a,b){for(var c=b,d=0;d=0){var o=h.selection.getRange().selectNode(i).createAddress(!0).startAddress,p=b({tag:i.tagName,title:i.innerText||i.textContent||"",level:f,dom:i,startAddress:utils.clone(o,[]),endAddress:utils.clone(o,[]),children:[]});for(j.nextSection=p,p.previousSection=j,g=j;f<=g.level;)g=g.parentSection;p.parentSection=g,g.children.push(p),k=j=p}else 1===i.nodeType&&e(i,c),k&&k.endAddress[k.endAddress.length-1]++}for(var f=c||["h1","h2","h3","h4","h5","h6"],g=0;g=c.length);f++){if(c[f]>a[f]){d=!0;break}if(c[f]=c.length);f++){if(c[f]a[f])break}return d&&e}var g,h,i=this;if(b&&d&&d.level!=-1&&(g=e?d.endAddress:d.startAddress,h=c(g,i.body),g&&h&&!f(b.startAddress,b.endAddress,g))){var j,k,l=c(b.startAddress,i.body),m=c(b.endAddress,i.body);if(e)for(j=m;j&&!(domUtils.getPosition(l,j)&domUtils.POSITION_FOLLOWING)&&(k=j.previousSibling,domUtils.insertAfter(h,j),j!=l);)j=k;else for(j=l;j&&!(domUtils.getPosition(j,m)&domUtils.POSITION_FOLLOWING)&&(k=j.nextSibling,h.parentNode.insertBefore(j,h),j!=m);)j=k;i.fireEvent("updateSections")}}},deletesection:{execCommand:function(a,b,c){function d(a){for(var b=e.body,c=0;c',b.className="edui-"+c.options.theme,b.id=c.ui.id+"_iframeupload",i.style.cssText=g,i.style.width=a+"px",i.style.height=e+"px",i.appendChild(b),i.parentNode&&(i.parentNode.style.width=a+"px",i.parentNode.style.height=a+"px");var k=h.getElementById("edui_form_"+j),l=h.getElementById("edui_input_"+j),m=h.getElementById("edui_iframe_"+j);domUtils.on(l,"change",function(){function a(){try{var e,f,g,h=(m.contentDocument||m.contentWindow.document).body,i=h.innerText||h.textContent||"";f=new Function("return "+i)(),e=c.options.imageUrlPrefix+f.url,"SUCCESS"==f.state&&f.url?(g=c.document.getElementById(d),g.setAttribute("src",e),g.setAttribute("_src",e),g.setAttribute("title",f.title||""),g.setAttribute("alt",f.original||""),g.removeAttribute("id"),domUtils.removeClasses(g,"loadingclass")):b&&b(f.state)}catch(j){b&&b(c.getLang("simpleupload.loadError"))}k.reset(),domUtils.un(m,"load",a)}function b(a){if(d){var b=c.document.getElementById(d);b&&domUtils.remove(b),c.fireEvent("showmessage",{id:d,content:a,type:"error",timeout:4e3})}}if(l.value){var d="loading_"+(+new Date).toString(36),e=utils.serializeParam(c.queryCommandValue("serverparam"))||"",f=c.getActionUrl(c.getOpt("imageActionName")),g=c.getOpt("imageAllowFiles");if(c.focus(),c.execCommand("inserthtml",''),!c.getOpt("imageActionName"))return void errorHandler(c.getLang("autoupload.errorLoadConfig"));var h=l.value,i=h?h.substr(h.lastIndexOf(".")):"";if(!i||g&&(g.join("")+".").indexOf(i.toLowerCase()+".")==-1)return void b(c.getLang("simpleupload.exceedTypeError"));domUtils.on(m,"load",a),k.action=utils.formatUrl(f+(f.indexOf("?")==-1?"?":"&")+e),k.submit()}});var n;c.addListener("selectionchange",function(){clearTimeout(n),n=setTimeout(function(){var a=c.queryCommandState("simpleupload");a==-1?l.disabled="disabled":l.disabled=!1},400)}),d=!0}),f.style.cssText=g,b.appendChild(f)}var b,c=this,d=!1;return{bindEvents:{ready:function(){utils.cssRule("loading",".loadingclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loading.gif') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}\n.loaderrorclass{display:inline-block;cursor:default;background: url('"+this.options.themePath+this.options.theme+"/images/loaderror.png') no-repeat center center transparent;border:1px solid #cccccc;margin-right:1px;height: 22px;width: 22px;}",this.document)},simpleuploadbtnready:function(d,e){b=e,c.afterConfigReady(a)}},outputRule:function(a){utils.each(a.getNodesByTagName("img"),function(a){/\b(loaderrorclass)|(bloaderrorclass)\b/.test(a.getAttr("class"))&&a.parentNode.removeChild(a)})},commands:{simpleupload:{queryCommandState:function(){return d?0:-1}}}}}),UE.plugin.register("serverparam",function(){var a={};return{commands:{serverparam:{execCommand:function(b,c,d){void 0===c||null===c?a={}:utils.isString(c)?void 0===d||null===d?delete a[c]:a[c]=d:utils.isObject(c)?utils.extend(a,c,!0):utils.isFunction(c)&&utils.extend(a,c(),!0)},queryCommandValue:function(){return a||{}}}}}}),UE.plugin.register("insertfile",function(){function a(a){var b=a.substr(a.lastIndexOf(".")+1).toLowerCase(),c={rar:"icon_rar.gif",zip:"icon_rar.gif",tar:"icon_rar.gif",gz:"icon_rar.gif",bz2:"icon_rar.gif",doc:"icon_doc.gif",docx:"icon_doc.gif",pdf:"icon_pdf.gif",mp3:"icon_mp3.gif",xls:"icon_xls.gif",chm:"icon_chm.gif",ppt:"icon_ppt.gif",pptx:"icon_ppt.gif",avi:"icon_mv.gif",rmvb:"icon_mv.gif",wmv:"icon_mv.gif",flv:"icon_mv.gif",swf:"icon_mv.gif",rm:"icon_mv.gif",exe:"icon_exe.gif",psd:"icon_psd.gif",txt:"icon_txt.gif",jpg:"icon_jpg.gif",png:"icon_jpg.gif",jpeg:"icon_jpg.gif",gif:"icon_jpg.gif",ico:"icon_jpg.gif",bmp:"icon_jpg.gif"};return c[b]?c[b]:c.txt}var b=this;return{commands:{insertfile:{execCommand:function(c,d){d=utils.isArray(d)?d:[d];var e,f,g,h,i="",j=b.getOpt("UEDITOR_HOME_URL"),k=j+("/"==j.substr(j.length-1)?"":"/")+"dialogs/attachment/fileTypeImages/";for(e=0;e'+h+"

            ";b.execCommand("insertHtml",i)}}}}}),UE.plugins.xssFilter=function(){function a(a){var b=a.tagName,d=a.attrs;return c.hasOwnProperty(b)?void UE.utils.each(d,function(d,e){c[b].indexOf(e)===-1&&a.setAttr(e)}):(a.parentNode.removeChild(a),!1)}var b=UEDITOR_CONFIG,c=b.whitList;c&&b.xssFilterRules&&(this.options.filterRules=function(){var b={};return UE.utils.each(c,function(c,d){b[d]=function(b){return a(b)}}),b}());var d=[];UE.utils.each(c,function(a,b){d.push(b)}),c&&b.inputXssFilter&&this.addInputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})}),c&&b.outputXssFilter&&this.addOutputRule(function(b){b.traversal(function(b){return"element"===b.type&&void a(b)})})};var baidu=baidu||{};baidu.editor=baidu.editor||{},UE.ui=baidu.editor.ui={},function(){function a(){var a=document.getElementById("edui_fixedlayer");i.setViewportOffset(a,{left:0,top:0})}function b(b){d.on(window,"scroll",a),d.on(window,"resize",baidu.editor.utils.defer(a,0,!0))}var c=baidu.editor.browser,d=baidu.editor.dom.domUtils,e="$EDITORUI",f=window[e]={},g="ID"+e,h=0,i=baidu.editor.ui.uiUtils={uid:function(a){return a?a[g]||(a[g]=++h):++h},hook:function(a,b){var c;return a&&a._callbacks?c=a:(c=function(){var b;a&&(b=a.apply(this,arguments));for(var d=c._callbacks,e=d.length;e--;){var f=d[e].apply(this,arguments);void 0===b&&(b=f)}return b},c._callbacks=[]),c._callbacks.push(b),c},createElementByHtml:function(a){var b=document.createElement("div");return b.innerHTML=a,b=b.firstChild,b.parentNode.removeChild(b),b},getViewportElement:function(){return c.ie&&c.quirks?document.body:document.documentElement},getClientRect:function(a){var b;try{b=a.getBoundingClientRect()}catch(c){b={left:0,top:0,height:0,width:0}}for(var e,f={left:Math.round(b.left),top:Math.round(b.top),height:Math.round(b.bottom-b.top),width:Math.round(b.right-b.left)};(e=a.ownerDocument)!==document&&(a=d.getWindow(e).frameElement);)b=a.getBoundingClientRect(),f.left+=b.left,f.top+=b.top;return f.bottom=f.top+f.height,f.right=f.left+f.width,f},getViewportRect:function(){var a=i.getViewportElement(),b=0|(window.innerWidth||a.clientWidth),c=0|(window.innerHeight||a.clientHeight);return{left:0,top:0,height:c,width:b,bottom:c,right:b}},setViewportOffset:function(a,b){var c=i.getFixedLayer();a.parentNode===c?(a.style.left=b.left+"px",a.style.top=b.top+"px"):d.setViewportOffset(a,b)},getEventOffset:function(a){var b=a.target||a.srcElement,c=i.getClientRect(b),d=i.getViewportOffsetByEvent(a);return{left:d.left-c.left,top:d.top-c.top}},getViewportOffsetByEvent:function(a){var b=a.target||a.srcElement,c=d.getWindow(b).frameElement,e={left:a.clientX,top:a.clientY};if(c&&b.ownerDocument!==document){var f=i.getClientRect(c);e.left+=f.left,e.top+=f.top}return e},setGlobal:function(a,b){return f[a]=b,e+'["'+a+'"]'},unsetGlobal:function(a){delete f[a]},copyAttributes:function(a,b){for(var e=b.attributes,f=e.length;f--;){var g=e[f];"style"==g.nodeName||"class"==g.nodeName||c.ie&&!g.specified||a.setAttribute(g.nodeName,g.nodeValue)}b.className&&d.addClass(a,b.className),b.style.cssText&&(a.style.cssText+=";"+b.style.cssText)},removeStyle:function(a,b){if(a.style.removeProperty)a.style.removeProperty(b);else{if(!a.style.removeAttribute)throw"";a.style.removeAttribute(b)}},contains:function(a,b){return a&&b&&a!==b&&(a.contains?a.contains(b):16&a.compareDocumentPosition(b))},startDrag:function(a,b,c){function d(a){var c=a.clientX-g,d=a.clientY-h;b.ondragmove(c,d,a),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function e(a){c.removeEventListener("mousemove",d,!0),c.removeEventListener("mouseup",e,!0),window.removeEventListener("mouseup",e,!0),b.ondragstop()}function f(){i.releaseCapture(),i.detachEvent("onmousemove",d),i.detachEvent("onmouseup",f),i.detachEvent("onlosecaptrue",f),b.ondragstop()}var c=c||document,g=a.clientX,h=a.clientY;if(c.addEventListener)c.addEventListener("mousemove",d,!0),c.addEventListener("mouseup",e,!0),window.addEventListener("mouseup",e,!0),a.preventDefault();else{var i=a.srcElement;i.setCapture(),i.attachEvent("onmousemove",d),i.attachEvent("onmouseup",f),i.attachEvent("onlosecaptrue",f),a.returnValue=!1}b.ondragstart()},getFixedLayer:function(){var d=document.getElementById("edui_fixedlayer");return null==d&&(d=document.createElement("div"),d.id="edui_fixedlayer",document.body.appendChild(d),c.ie&&c.version<=8?(d.style.position="absolute",b(),setTimeout(a)):d.style.position="fixed",d.style.left="0",d.style.top="0",d.style.width="0",d.style.height="0"),d},makeUnselectable:function(a){if(c.opera||c.ie&&c.version<9){if(a.unselectable="on",a.hasChildNodes())for(var b=0;b'}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.uiUtils,e=baidu.editor.ui.Mask=function(a){this.initOptions(a),this.initUIBase()};e.prototype={getHtmlTpl:function(){return'
            '},postRender:function(){var a=this;b.on(window,"resize",function(){setTimeout(function(){a.isHidden()||a._fill()})})},show:function(a){this._fill(),this.getDom().style.display="",this.getDom().style.zIndex=a},hide:function(){this.getDom().style.display="none",this.getDom().style.zIndex=""},isHidden:function(){return"none"==this.getDom().style.display},_onMouseDown:function(){return!1},_onClick:function(a,b){this.fireEvent("click",a,b)},_fill:function(){var a=this.getDom(),b=d.getViewportRect();a.style.width=b.width+"px",a.style.height=b.height+"px"}},a.inherits(e,c)}(),function(){function a(a,b){for(var c=0;c
            '+this.getContentHtmlTpl()+"
            "},getContentHtmlTpl:function(){return this.content?"string"==typeof this.content?this.content:this.content.renderHtml():""},_UIBase_postRender:e.prototype.postRender,postRender:function(){if(this.content instanceof e&&this.content.postRender(),this.captureWheel&&!this.captured){this.captured=!0;var a=(document.documentElement.clientHeight||document.body.clientHeight)-80,b=this.getDom().offsetHeight,f=c.getClientRect(this.combox.getDom()).top,g=this.getDom("content"),h=this.getDom("body").getElementsByTagName("iframe"),i=this;for(h.length&&(h=h[0]);f+b>a;)b-=30;g.style.height=b+"px",h&&(h.style.height=b+"px"),window.XMLHttpRequest?d.on(g,"onmousewheel"in document.body?"mousewheel":"DOMMouseScroll",function(a){a.preventDefault?a.preventDefault():a.returnValue=!1,a.wheelDelta?g.scrollTop-=a.wheelDelta/120*60:g.scrollTop-=a.detail/-3*60}):d.on(this.getDom(),"mousewheel",function(a){a.returnValue=!1,i.getDom("content").scrollTop-=a.wheelDelta/120*60})}this.fireEvent("postRenderAfter"),this.hide(!0),this._UIBase_postRender()},_doAutoRender:function(){!this.getDom()&&this.autoRender&&this.render()},mesureSize:function(){var a=this.getDom("content");return c.getClientRect(a)},fitSize:function(){if(this.captureWheel&&this.sized)return this.__size;this.sized=!0;var a=this.getDom("body");a.style.width="",a.style.height="";var b=this.mesureSize();if(this.captureWheel){a.style.width=-(-20-b.width)+"px";var c=parseInt(this.getDom("content").style.height,10);!window.isNaN(c)&&(b.height=c)}else a.style.width=b.width+"px";return a.style.height=b.height+"px",this.__size=b,this.captureWheel&&(this.getDom("content").style.overflow="auto"),b},showAnchor:function(a,b){this.showAnchorRect(c.getClientRect(a),b)},showAnchorRect:function(a,b,e){this._doAutoRender();var f=c.getViewportRect();this.getDom().style.visibility="hidden",this._show();var g,i,j,k,l=this.fitSize();b?(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.left-l.width:a.right,k=i?a.bottom-l.height:a.top):(g=this.canSideLeft&&a.right+l.width>f.right&&a.left>l.width,i=this.canSideUp&&a.top+l.height>f.bottom&&a.bottom>l.height,j=g?a.right-l.width:a.left,k=i?a.top-l.height:a.bottom);var m=this.getDom();c.setViewportOffset(m,{left:j,top:k}),d.removeClasses(m,h),m.className+=" "+h[2*(i?1:0)+(g?1:0)],this.editor&&(m.style.zIndex=1*this.editor.container.style.zIndex+10,baidu.editor.ui.uiUtils.getFixedLayer().style.zIndex=m.style.zIndex-1),this.getDom().style.visibility="visible"},showAt:function(a){var b=a.left,c=a.top,d={left:b,top:c,right:b,bottom:c,height:0,width:0};this.showAnchorRect(d,!1,!0)},_show:function(){if(this._hidden){var a=this.getDom();a.style.display="",this._hidden=!1,this.fireEvent("show")}},isHidden:function(){return this._hidden},show:function(){this._doAutoRender(),this._show()},hide:function(a){!this._hidden&&this.getDom()&&(this.getDom().style.display="none",this._hidden=!0,a||this.fireEvent("hide"))},queryAutoHide:function(a){return!a||!c.contains(this.getDom(),a)}},b.inherits(f,e),d.on(document,"mousedown",function(b){var c=b.target||b.srcElement;a(b,c)}),d.on(window,"scroll",function(b,c){a(b,c)})}(),function(){function a(a,b){for(var c='
            '+a+'
            ',d=0;d"+(60==d?'":"")+""),c+=d<70?'':"";return c+="
            '+b.getLang("themeColor")+'
            '+b.getLang("standardColor")+"
            =60?"border-width:1px;":d>=10&&d<20?"border-width:1px 1px 0 1px;":"border-width:0 1px 0 1px;")+'">
            "}var b=baidu.editor.utils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.ColorPicker=function(a){this.initOptions(a),this.noColorText=this.noColorText||this.editor.getLang("clearColor"),this.initUIBase()};d.prototype={getHtmlTpl:function(){return a(this.noColorText,this.editor)},_onTableClick:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&this.fireEvent("pickcolor",c)},_onTableOver:function(a){var b=a.target||a.srcElement,c=b.getAttribute("data-color");c&&(this.getDom("preview").style.backgroundColor=c)},_onTableOut:function(){this.getDom("preview").style.backgroundColor=""},_onPickNoColor:function(){this.fireEvent("picknocolor")}},b.inherits(d,c);var e="ffffff,000000,eeece1,1f497d,4f81bd,c0504d,9bbb59,8064a2,4bacc6,f79646,f2f2f2,7f7f7f,ddd9c3,c6d9f0,dbe5f1,f2dcdb,ebf1dd,e5e0ec,dbeef3,fdeada,d8d8d8,595959,c4bd97,8db3e2,b8cce4,e5b9b7,d7e3bc,ccc1d9,b7dde8,fbd5b5,bfbfbf,3f3f3f,938953,548dd4,95b3d7,d99694,c3d69b,b2a2c7,92cddc,fac08f,a5a5a5,262626,494429,17365d,366092,953734,76923c,5f497a,31859b,e36c09,7f7f7f,0c0c0c,1d1b10,0f243e,244061,632423,4f6128,3f3151,205867,974806,c00000,ff0000,ffc000,ffff00,92d050,00b050,00b0f0,0070c0,002060,7030a0,".split(",")}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.TablePicker=function(a){this.initOptions(a),this.initTablePicker()};d.prototype={defaultNumRows:10,defaultNumCols:10,maxNumRows:20,maxNumCols:20,numRows:10,numCols:10,lengthOfCellSide:22,initTablePicker:function(){this.initUIBase()},getHtmlTpl:function(){return'
            '},_UIBase_render:c.prototype.render,render:function(a){this._UIBase_render(a),this.getDom("label").innerHTML="0"+this.editor.getLang("t_row")+" x 0"+this.editor.getLang("t_col")},_track:function(a,b){var c=this.getDom("overlay").style,d=this.lengthOfCellSide;c.width=a*d+"px",c.height=b*d+"px";var e=this.getDom("label");e.innerHTML=a+this.editor.getLang("t_col")+" x "+b+this.editor.getLang("t_row"),this.numCols=a,this.numRows=b},_onMouseOver:function(a,c){var d=a.relatedTarget||a.fromElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="")},_onMouseOut:function(a,c){var d=a.relatedTarget||a.toElement;b.contains(c,d)||c===d||(this.getDom("label").innerHTML="0"+this.editor.getLang("t_col")+" x 0"+this.editor.getLang("t_row"),this.getDom("overlay").style.visibility="hidden")},_onMouseMove:function(a,c){var d=(this.getDom("overlay").style,b.getEventOffset(a)),e=this.lengthOfCellSide,f=Math.ceil(d.left/e),g=Math.ceil(d.top/e);this._track(f,g)},_onClick:function(){this.fireEvent("picktable",this.numCols,this.numRows)}},a.inherits(d,c)}(),function(){var a=baidu.editor.browser,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.uiUtils,d='onmousedown="$$.Stateful_onMouseDown(event, this);" onmouseup="$$.Stateful_onMouseUp(event, this);"'+(a.ie?' onmouseenter="$$.Stateful_onMouseEnter(event, this);" onmouseleave="$$.Stateful_onMouseLeave(event, this);"':' onmouseover="$$.Stateful_onMouseOver(event, this);" onmouseout="$$.Stateful_onMouseOut(event, this);"');baidu.editor.ui.Stateful={alwalysHoverable:!1,target:null,Stateful_init:function(){this._Stateful_dGetHtmlTpl=this.getHtmlTpl,this.getHtmlTpl=this.Stateful_getHtmlTpl},Stateful_getHtmlTpl:function(){var a=this._Stateful_dGetHtmlTpl();return a.replace(/stateful/g,function(){return d})},Stateful_onMouseEnter:function(a,b){this.target=b,this.isDisabled()&&!this.alwalysHoverable||(this.addState("hover"),this.fireEvent("over"))},Stateful_onMouseLeave:function(a,b){this.isDisabled()&&!this.alwalysHoverable||(this.removeState("hover"),this.removeState("active"),this.fireEvent("out"))},Stateful_onMouseOver:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseEnter(a,b)},Stateful_onMouseOut:function(a,b){var d=a.relatedTarget;c.contains(b,d)||b===d||this.Stateful_onMouseLeave(a,b)},Stateful_onMouseDown:function(a,b){this.isDisabled()||this.addState("active")},Stateful_onMouseUp:function(a,b){this.isDisabled()||this.removeState("active")},Stateful_postRender:function(){this.disabled&&!this.hasState("disabled")&&this.addState("disabled")},hasState:function(a){return b.hasClass(this.getStateDom(),"edui-state-"+a)},addState:function(a){this.hasState(a)||(this.getStateDom().className+=" edui-state-"+a)},removeState:function(a){this.hasState(a)&&b.removeClasses(this.getStateDom(),["edui-state-"+a])},getStateDom:function(){return this.getDom("state")},isChecked:function(){return this.hasState("checked")},setChecked:function(a){!this.isDisabled()&&a?this.addState("checked"):this.removeState("checked")},isDisabled:function(){return this.hasState("disabled")},setDisabled:function(a){a?(this.removeState("hover"),this.removeState("checked"),this.removeState("active"),this.addState("disabled")):this.removeState("disabled")}}}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Stateful,d=baidu.editor.ui.Button=function(a){if(a.name){var b=a.name,c=a.cssRules;a.className||(a.className="edui-for-"+b),a.cssRules=".edui-default .edui-for-"+b+" .edui-icon {"+c+"}"}this.initOptions(a),this.initButton()};d.prototype={uiName:"button",label:"",title:"",showIcon:!0,showText:!0,cssRules:"",initButton:function(){this.initUIBase(),this.Stateful_init(),this.cssRules&&a.cssRule("edui-customize-"+this.name+"-style",this.cssRules)},getHtmlTpl:function(){return'
            '+(this.showIcon?'
            ':"")+(this.showText?'
            '+this.label+"
            ":"")+"
            "},postRender:function(){this.Stateful_postRender(),this.setDisabled(this.disabled)},_onMouseDown:function(a){var b=a.target||a.srcElement,c=b&&b.tagName&&b.tagName.toLowerCase();if("input"==c||"object"==c||"object"==c)return!1},_onClick:function(){this.isDisabled()||this.fireEvent("click")},setTitle:function(a){var b=this.getDom("label");b.innerHTML=a}},a.inherits(d,b),a.extend(d.prototype,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=(baidu.editor.dom.domUtils,baidu.editor.ui.UIBase),d=baidu.editor.ui.Stateful,e=baidu.editor.ui.SplitButton=function(a){this.initOptions(a),this.initSplitButton()};e.prototype={popup:null,uiName:"splitbutton",title:"",initSplitButton:function(){this.initUIBase(),this.Stateful_init();if(null!=this.popup){var a=this.popup;this.popup=null,this.setPopup(a)}},_UIBase_postRender:c.prototype.postRender,postRender:function(){this.Stateful_postRender(),this._UIBase_postRender()},setPopup:function(c){this.popup!==c&&(null!=this.popup&&this.popup.dispose(),c.addListener("show",a.bind(this._onPopupShow,this)),c.addListener("hide",a.bind(this._onPopupHide,this)),c.addListener("postrender",a.bind(function(){c.getDom("body").appendChild(b.createElementByHtml('
            ')),c.getDom().className+=" "+this.className},this)),this.popup=c)},_onPopupShow:function(){this.addState("opened")},_onPopupHide:function(){this.removeState("opened")},getHtmlTpl:function(){return'
            '},showPopup:function(){var a=b.getClientRect(this.getDom());a.top-=this.popup.SHADOW_RADIUS,a.height+=this.popup.SHADOW_RADIUS,this.popup.showAnchorRect(a)},_onArrowClick:function(a,b){this.isDisabled()||this.showPopup()},_onButtonClick:function(){this.isDisabled()||this.fireEvent("buttonclick")}},a.inherits(e,c),a.extend(e.prototype,d,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.ColorPicker,d=baidu.editor.ui.Popup,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.ColorButton=function(a){this.initOptions(a),this.initColorButton()};f.prototype={initColorButton:function(){var a=this;this.popup=new d({content:new c({noColorText:a.editor.getLang("clearColor"),editor:a.editor,onpickcolor:function(b,c){a._onPickColor(c)},onpicknocolor:function(b,c){a._onPickNoColor(c)}}),editor:a.editor}),this.initSplitButton()},_SplitButton_postRender:e.prototype.postRender,postRender:function(){this._SplitButton_postRender(),this.getDom("button_body").appendChild(b.createElementByHtml('
            ')),this.getDom().className+=" edui-colorbutton"; +},setColor:function(a){this.getDom("colorlump").style.backgroundColor=a,this.color=a},_onPickColor:function(a){this.fireEvent("pickcolor",a)!==!1&&(this.setColor(a),this.popup.hide())},_onPickNoColor:function(a){this.fireEvent("picknocolor")!==!1&&this.popup.hide()}},a.inherits(f,e)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Popup,c=baidu.editor.ui.TablePicker,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.TableButton=function(a){this.initOptions(a),this.initTableButton()};e.prototype={initTableButton:function(){var a=this;this.popup=new b({content:new c({editor:a.editor,onpicktable:function(b,c,d){a._onPickTable(c,d)}}),editor:a.editor}),this.initSplitButton()},_onPickTable:function(a,b){this.fireEvent("picktable",a,b)!==!1&&this.popup.hide()}},a.inherits(e,d)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.AutoTypeSetPicker=function(a){this.initOptions(a),this.initAutoTypeSetPicker()};c.prototype={initAutoTypeSetPicker:function(){this.initUIBase()},getHtmlTpl:function(){var a=this.editor,b=a.options.autotypeset,c=a.getLang("autoTypeSet"),d="textAlignValue"+a.uid,e="imageBlockLineValue"+a.uid,f="symbolConverValue"+a.uid;return'
            "+c.mergeLine+'"+c.delLine+'
            "+c.removeFormat+'"+c.indent+'
            "+c.alignment+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
            "+c.imageFloat+'"+a.getLang("default")+'"+a.getLang("justifyleft")+'"+a.getLang("justifycenter")+'"+a.getLang("justifyright")+'
            "+c.removeFontsize+'"+c.removeFontFamily+'
            "+c.removeHtml+'
            "+c.pasteFilter+'
            "+c.symbol+'"+c.bdc2sb+'"+c.tobdc+'
            "},_UIBase_render:b.prototype.render},a.inherits(c,b)}(),function(){function a(a){for(var c,d={},e=a.getDom(),f=a.editor.uid,g=null,h=null,i=domUtils.getElementsByTagName(e,"input"),j=i.length-1;c=i[j--];)if(g=c.getAttribute("type"),"checkbox"==g)if(h=c.getAttribute("name"),d[h]&&delete d[h],c.checked){var k=document.getElementById(h+"Value"+f);if(k){if(/input/gi.test(k.tagName))d[h]=k.value;else for(var l,m=k.getElementsByTagName("input"),n=m.length-1;l=m[n--];)if(l.checked){d[h]=l.value;break}}else d[h]=!0}else d[h]=!1;else d[c.getAttribute("value")]=c.checked;for(var o,p=domUtils.getElementsByTagName(e,"select"),j=0;o=p[j++];){var q=o.getAttribute("name");d[q]=d[q]?o.value:""}b.extend(a.editor.options.autotypeset,d),a.editor.setPreferences("autotypeset",d)}var b=baidu.editor.utils,c=baidu.editor.ui.Popup,d=baidu.editor.ui.AutoTypeSetPicker,e=baidu.editor.ui.SplitButton,f=baidu.editor.ui.AutoTypeSetButton=function(a){this.initOptions(a),this.initAutoTypeSetButton()};f.prototype={initAutoTypeSetButton:function(){var b=this;this.popup=new c({content:new d({editor:b.editor}),editor:b.editor,hide:function(){!this._hidden&&this.getDom()&&(a(this),this.getDom().style.display="none",this._hidden=!0,this.fireEvent("hide"))}});var e=0;this.popup.addListener("postRenderAfter",function(){var c=this;if(!e){var d=this.getDom(),f=d.getElementsByTagName("button")[0];f.onclick=function(){a(c),b.editor.execCommand("autotypeset"),c.hide()},domUtils.on(d,"click",function(d){var e=d.target||d.srcElement,f=b.editor.uid;if(e&&"INPUT"==e.tagName){if("imageBlockLine"==e.name||"textAlign"==e.name||"symbolConver"==e.name)for(var g=e.checked,h=document.getElementById(e.name+"Value"+f),i=h.getElementsByTagName("input"),j={imageBlockLine:"none",textAlign:"left",symbolConver:"tobdc"},k=0;k"),e.push('
            '),2===d&&e.push("");return'
            '+e.join("")+"
            "},getStateDom:function(){return this.target},_onClick:function(a){var c=a.target||a.srcElement;/icon/.test(c.className)&&(this.items[c.parentNode.getAttribute("index")].onclick(),b.postHide(a))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,c,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.Stateful,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.ui.PastePicker=function(a){this.initOptions(a),this.initPastePicker()};e.prototype={initPastePicker:function(){this.initUIBase(),this.Stateful_init()},getHtmlTpl:function(){return'
            '+this.editor.getLang("pasteOpt")+'
            '},getStateDom:function(){return this.target},format:function(a){this.editor.ui._isTransfer=!0,this.editor.fireEvent("pasteTransfer",a)},_onClick:function(a){var b=domUtils.getNextDomNode(a),d=c.getViewportRect().height,e=c.getClientRect(b);e.top+e.height>d?b.style.top=-e.height-a.offsetHeight+"px":b.style.top="",/hidden/gi.test(domUtils.getComputedStyle(b,"visibility"))?(b.style.visibility="visible",domUtils.addClass(a,"edui-state-opened")):(b.style.visibility="hidden",domUtils.removeClasses(a,"edui-state-opened"))},_UIBase_render:d.prototype.render},a.inherits(e,d),a.extend(e.prototype,b,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Toolbar=function(a){this.initOptions(a),this.initToolbar()};d.prototype={items:null,initToolbar:function(){this.items=this.items||[],this.initUIBase()},add:function(a,b){void 0===b?this.items.push(a):this.items.splice(b,0,a)},getHtmlTpl:function(){for(var a=[],b=0;b'+a.join("")+""},postRender:function(){for(var a=this.getDom(),c=0;c
            '},postRender:function(){},queryAutoHide:function(){return!0}};h.prototype={items:null,uiName:"menu",initMenu:function(){this.items=this.items||[],this.initPopup(),this.initItems()},initItems:function(){for(var a=0;a'+a.join("")+""},_Popup_postRender:e.prototype.postRender,postRender:function(){for(var a=this,d=0;d
            '+this.renderLabelHtml()+"
            "},postRender:function(){var a=this;this.addListener("over",function(){a.ownerMenu.fireEvent("submenuover",a),a.subMenu&&a.delayShowSubMenu()}),this.subMenu&&(this.getDom().className+=" edui-hassubmenu",this.subMenu.render(),this.addListener("out",function(){a.delayHideSubMenu()}),this.subMenu.addListener("over",function(){clearTimeout(a._closingTimer),a._closingTimer=null,a.addState("opened")}),this.ownerMenu.addListener("hide",function(){a.hideSubMenu()}),this.ownerMenu.addListener("submenuover",function(b,c){c!==a&&a.delayHideSubMenu()}),this.subMenu._bakQueryAutoHide=this.subMenu.queryAutoHide,this.subMenu.queryAutoHide=function(b){return(!b||!c.contains(a.getDom(),b))&&this._bakQueryAutoHide(b)}),this.getDom().style.tabIndex="-1",c.makeUnselectable(this.getDom()),this.Stateful_postRender()},delayShowSubMenu:function(){var a=this;a.isDisabled()||(a.addState("opened"),clearTimeout(a._showingTimer),clearTimeout(a._closingTimer),a._closingTimer=null,a._showingTimer=setTimeout(function(){a.showSubMenu()},250))},delayHideSubMenu:function(){var a=this;a.isDisabled()||(a.removeState("opened"),clearTimeout(a._showingTimer),a._closingTimer||(a._closingTimer=setTimeout(function(){a.hasState("opened")||a.hideSubMenu(),a._closingTimer=null},400)))},renderLabelHtml:function(){return'
            '+(this.label||"")+"
            "},getStateDom:function(){return this.getDom()},queryAutoHide:function(a){if(this.subMenu&&this.hasState("opened"))return this.subMenu.queryAutoHide(a)},_onClick:function(a,b){this.hasState("disabled")||this.fireEvent("click",a,b)!==!1&&(this.subMenu?this.showSubMenu():e.postHide(a))},showSubMenu:function(){var a=c.getClientRect(this.getDom());a.right-=5,a.left+=2,a.width-=7,a.top-=4,a.bottom+=4,a.height+=8,this.subMenu.showAnchorRect(a,!0,!0)},hideSubMenu:function(){this.subMenu.hide()}},a.inherits(j,d),a.extend(j.prototype,f,!0)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.uiUtils,c=baidu.editor.ui.Menu,d=baidu.editor.ui.SplitButton,e=baidu.editor.ui.Combox=function(a){this.initOptions(a),this.initCombox()};e.prototype={uiName:"combox",onbuttonclick:function(){this.showPopup()},initCombox:function(){var a=this;this.items=this.items||[];for(var b=0;bd.right&&(g=d.right-e.width);var h=a.top;h+e.height>d.bottom&&(h=d.bottom-e.height),c.style.left=Math.max(g,0)+"px",c.style.top=Math.max(h,0)+"px"},showAtCenter:function(){var a=f.getViewportRect();if(this.fullscreen){var b=this.getDom(),c=this.getDom("content");b.style.display="block";var d=UE.ui.uiUtils.getClientRect(b),g=UE.ui.uiUtils.getClientRect(c);b.style.left="-100000px",c.style.width=a.width-d.width+g.width+"px",c.style.height=a.height-d.height+g.height+"px",b.style.width=a.width+"px",b.style.height=a.height+"px",b.style.left=0,this._originalContext={html:{overflowX:document.documentElement.style.overflowX,overflowY:document.documentElement.style.overflowY},body:{overflowX:document.body.style.overflowX,overflowY:document.body.style.overflowY}},document.documentElement.style.overflowX="hidden",document.documentElement.style.overflowY="hidden",document.body.style.overflowX="hidden",document.body.style.overflowY="hidden"}else{this.getDom().style.display="";var h=this.fitSize(),i=0|this.getDom("titlebar").offsetHeight,j=a.width/2-h.width/2,k=a.height/2-(h.height-i)/2-i,l=this.getDom();this.safeSetOffset({left:Math.max(0|j,0),top:Math.max(0|k,0)}),e.hasClass(l,"edui-state-centered")||(l.className+=" edui-state-centered")}this._show()},getContentHtml:function(){var a="";return"string"==typeof this.content?a=this.content:this.iframeUrl&&(a=''),a},getHtmlTpl:function(){var a="";if(this.buttons){for(var b=[],c=0;c
            '+b.join("")+"
            "}return'
            '+(this.title||"")+"
            "+this.closeButton.renderHtml()+'
            '+(this.autoReset?"":this.getContentHtml())+"
            "+a+"
            "},postRender:function(){this.modalMask.getDom()||(this.modalMask.render(),this.modalMask.hide()),this.dragMask.getDom()||(this.dragMask.render(),this.dragMask.hide());var a=this;if(this.addListener("show",function(){a.modalMask.show(this.getDom().style.zIndex-2)}),this.addListener("hide",function(){a.modalMask.hide()}),this.buttons)for(var b=0;b',a.editor.container.style.zIndex&&(this.getDom().style.zIndex=1*a.editor.container.style.zIndex+1))}}),this.onbuttonclick=function(){this.showPopup()},this.initSplitButton()}},a.inherits(d,c)}(),function(){function a(a){var b=a.target||a.srcElement,c=g.findParent(b,function(a){return g.hasClass(a,"edui-shortcutmenu")||g.hasClass(a,"edui-popup")},!0);if(!c)for(var d,e=0;d=h[e++];)d.hide()}var b,c=baidu.editor.ui,d=c.UIBase,e=c.uiUtils,f=baidu.editor.utils,g=baidu.editor.dom.domUtils,h=[],i=!1,j=c.ShortCutMenu=function(a){this.initOptions(a),this.initShortCutMenu()};j.postHide=a,j.prototype={isHidden:!0,SPACE:5,initShortCutMenu:function(){this.items=this.items||[],this.initUIBase(),this.initItems(),this.initEvent(),h.push(this)},initEvent:function(){var a=this,c=a.editor.document;g.on(c,"mousemove",function(c){if(a.isHidden===!1){if(a.getSubMenuMark()||"contextmenu"==a.eventType)return;var d=!0,e=a.getDom(),f=e.offsetWidth,g=e.offsetHeight,h=f/2+a.SPACE,i=g/2,j=Math.abs(c.screenX-a.left),k=Math.abs(c.screenY-a.top);clearTimeout(b),b=setTimeout(function(){k>0&&ki&&ki+70&&k0&&jh&&jh+70&&j'+a+""}},f.inherits(j,d),g.on(document,"mousedown",function(b){a(b)}),g.on(window,"scroll",function(b){a(b)})}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui.UIBase,c=baidu.editor.ui.Breakline=function(a){this.initOptions(a),this.initSeparator()};c.prototype={uiName:"Breakline",initSeparator:function(){this.initUIBase()},getHtmlTpl:function(){return"
            "}},a.inherits(c,b)}(),function(){var a=baidu.editor.utils,b=baidu.editor.dom.domUtils,c=baidu.editor.ui.UIBase,d=baidu.editor.ui.Message=function(a){this.initOptions(a),this.initMessage()};d.prototype={initMessage:function(){this.initUIBase()},getHtmlTpl:function(){return'
            ×
            '},reset:function(a){var b=this;a.keepshow||(clearTimeout(this.timer),b.timer=setTimeout(function(){b.hide()},a.timeout||4e3)),void 0!==a.content&&b.setContent(a.content),void 0!==a.type&&b.setType(a.type),b.show()},postRender:function(){var a=this,c=this.getDom("closer");c&&b.on(c,"click",function(){a.hide()})},setContent:function(a){this.getDom("content").innerHTML=a},setType:function(a){a=a||"info";var b=this.getDom("body");b.className=b.className.replace(/edui-message-type-[\w-]+/,"edui-message-type-"+a)},getContent:function(){return this.getDom("content").innerHTML},getType:function(){var a=this.getDom("body").match(/edui-message-type-([\w-]+)/);return a?a[1]:""},show:function(){this.getDom().style.display="block"},hide:function(){var a=this.getDom();a&&(a.style.display="none",a.parentNode&&a.parentNode.removeChild(a))}},a.inherits(d,c)}(),function(){var a=baidu.editor.utils,b=baidu.editor.ui,c=b.Dialog;b.buttons={},b.Dialog=function(a){var b=new c(a);return b.addListener("hide",function(){if(b.editor){var a=b.editor;try{if(browser.gecko){var c=a.window.scrollY,d=a.window.scrollX;a.body.focus(),a.window.scrollTo(d,c)}else a.focus()}catch(e){}}}),b};for(var d,e={anchor:"~/dialogs/anchor/anchor.html",insertimage:"~/dialogs/image/image.html",link:"~/dialogs/link/link.html",spechars:"~/dialogs/spechars/spechars.html",searchreplace:"~/dialogs/searchreplace/searchreplace.html",map:"~/dialogs/map/map.html",gmap:"~/dialogs/gmap/gmap.html",insertvideo:"~/dialogs/video/video.html",help:"~/dialogs/help/help.html",preview:"~/dialogs/preview/preview.html",emotion:"~/dialogs/emotion/emotion.html",wordimage:"~/dialogs/wordimage/wordimage.html",attachment:"~/dialogs/attachment/attachment.html",insertframe:"~/dialogs/insertframe/insertframe.html",edittip:"~/dialogs/table/edittip.html",edittable:"~/dialogs/table/edittable.html",edittd:"~/dialogs/table/edittd.html",webapp:"~/dialogs/webapp/webapp.html",snapscreen:"~/dialogs/snapscreen/snapscreen.html",scrawl:"~/dialogs/scrawl/scrawl.html",music:"~/dialogs/music/music.html",template:"~/dialogs/template/template.html",background:"~/dialogs/background/background.html",charts:"~/dialogs/charts/charts.html"},f=["undo","redo","formatmatch","bold","italic","underline","fontborder","touppercase","tolowercase","strikethrough","subscript","superscript","source","indent","outdent","blockquote","pasteplain","pagebreak","selectall","print","horizontal","removeformat","time","date","unlink","insertparagraphbeforetable","insertrow","insertcol","mergeright","mergedown","deleterow","deletecol","splittorows","splittocols","splittocells","mergecells","deletetable","drafts"],g=0;d=f[g++];)d=d.toLowerCase(),b[d]=function(a){return function(c){var d=new b.Button({className:"edui-for-"+a,title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",onclick:function(){c.execCommand(a)},theme:c.options.theme,showText:!1});return b.buttons[a]=d,c.addListener("selectionchange",function(b,e,f){var g=c.queryCommandState(a);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(d);b.cleardoc=function(a){var c=new b.Button({className:"edui-for-cleardoc",title:a.options.labelMap.cleardoc||a.getLang("labelMap.cleardoc")||"",theme:a.options.theme,onclick:function(){confirm(a.getLang("confirmClear"))&&a.execCommand("cleardoc")}});return b.buttons.cleardoc=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("cleardoc")==-1)}),c};var h={justify:["left","right","center","justify"],imagefloat:["none","left","center","right"],directionality:["ltr","rtl"]};for(var i in h)!function(a,c){for(var d,e=0;d=c[e++];)!function(c){b[a.replace("float","")+c]=function(d){var e=new b.Button({ +className:"edui-for-"+a.replace("float","")+c,title:d.options.labelMap[a.replace("float","")+c]||d.getLang("labelMap."+a.replace("float","")+c)||"",theme:d.options.theme,onclick:function(){d.execCommand(a,c)}});return b.buttons[a]=e,d.addListener("selectionchange",function(b,f,g){e.setDisabled(d.queryCommandState(a)==-1),e.setChecked(d.queryCommandValue(a)==c&&!g)}),e}}(d)}(i,h[i]);for(var d,g=0;d=["backcolor","forecolor"][g++];)b[d]=function(a){return function(c){var d=new b.ColorButton({className:"edui-for-"+a,color:"default",title:c.options.labelMap[a]||c.getLang("labelMap."+a)||"",editor:c,onpickcolor:function(b,d){c.execCommand(a,d)},onpicknocolor:function(){c.execCommand(a,"default"),this.setColor("transparent"),this.color="default"},onbuttonclick:function(){c.execCommand(a,this.color)}});return b.buttons[a]=d,c.addListener("selectionchange",function(){d.setDisabled(c.queryCommandState(a)==-1)}),d}}(d);var j={noOk:["searchreplace","help","spechars","webapp","preview"],ok:["attachment","anchor","link","insertimage","map","gmap","insertframe","wordimage","insertvideo","insertframe","edittip","edittable","edittd","scrawl","template","music","background","charts"]};for(var i in j)!function(c,d){for(var f,g=0;f=d[g++];)browser.opera&&"searchreplace"===f||!function(d){b[d]=function(f,g,h){g=g||(f.options.iframeUrlMap||{})[d]||e[d],h=f.options.labelMap[d]||f.getLang("labelMap."+d)||"";var i;g&&(i=new b.Dialog(a.extend({iframeUrl:f.ui.mapUrl(g),editor:f,className:"edui-for-"+d,title:h,holdScroll:"insertimage"===d,fullscreen:/charts|preview/.test(d),closeDialog:f.getLang("closeDialog")},"ok"==c?{buttons:[{className:"edui-okbutton",label:f.getLang("ok"),editor:f,onclick:function(){i.close(!0)}},{className:"edui-cancelbutton",label:f.getLang("cancel"),editor:f,onclick:function(){i.close(!1)}}]}:{})),f.ui._dialogs[d+"Dialog"]=i);var j=new b.Button({className:"edui-for-"+d,title:h,onclick:function(){if(i)switch(d){case"wordimage":var a=f.execCommand("wordimage");a&&a.length&&(i.render(),i.open());break;case"scrawl":f.queryCommandState("scrawl")!=-1&&(i.render(),i.open());break;default:i.render(),i.open()}},theme:f.options.theme,disabled:"scrawl"==d&&f.queryCommandState("scrawl")==-1||"charts"==d});return b.buttons[d]=j,f.addListener("selectionchange",function(){var a={edittable:1};if(!(d in a)){var b=f.queryCommandState(d);j.getDom()&&(j.setDisabled(b==-1),j.setChecked(b))}}),j}}(f.toLowerCase())}(i,j[i]);b.snapscreen=function(a,c,d){d=a.options.labelMap.snapscreen||a.getLang("labelMap.snapscreen")||"";var f=new b.Button({className:"edui-for-snapscreen",title:d,onclick:function(){a.execCommand("snapscreen")},theme:a.options.theme});if(b.buttons.snapscreen=f,c=c||(a.options.iframeUrlMap||{}).snapscreen||e.snapscreen){var g=new b.Dialog({iframeUrl:a.ui.mapUrl(c),editor:a,className:"edui-for-snapscreen",title:d,buttons:[{className:"edui-okbutton",label:a.getLang("ok"),editor:a,onclick:function(){g.close(!0)}},{className:"edui-cancelbutton",label:a.getLang("cancel"),editor:a,onclick:function(){g.close(!1)}}]});g.render(),a.ui._dialogs.snapscreenDialog=g}return a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState("snapscreen")==-1)}),f},b.insertcode=function(c,d,e){d=c.options.insertcode||[],e=c.options.labelMap.insertcode||c.getLang("labelMap.insertcode")||"";var f=[];a.each(d,function(a,b){f.push({label:a,value:b,theme:c.options.theme,renderLabelHtml:function(){return'
            '+(this.label||"")+"
            "}})});var g=new b.Combox({editor:c,items:f,onselect:function(a,b){c.execCommand("insertcode",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-insertcode",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.insertcode=g,c.addListener("selectionchange",function(a,b,d){if(!d){var f=c.queryCommandState("insertcode");if(f==-1)g.setDisabled(!0);else{g.setDisabled(!1);var h=c.queryCommandValue("insertcode");if(!h)return void g.setValue(e);h&&(h=h.replace(/['"]/g,"").split(",")[0]),g.setValue(h)}}}),g},b.fontfamily=function(c,d,e){if(d=c.options.fontfamily||[],e=c.options.labelMap.fontfamily||c.getLang("labelMap.fontfamily")||"",d.length){for(var f,g=0,h=[];f=d[g];g++){var i=c.getLang("fontfamily")[f.name]||"";!function(b,d){h.push({label:b,value:d,theme:c.options.theme,renderLabelHtml:function(){return'
            '+(this.label||"")+"
            "}})}(f.label||i,f.val)}var j=new b.Combox({editor:c,items:h,onselect:function(a,b){c.execCommand("FontFamily",this.items[b].value)},onbuttonclick:function(){this.showPopup()},title:e,initValue:e,className:"edui-for-fontfamily",indexByValue:function(a){if(a)for(var b,c=0;b=this.items[c];c++)if(b.value.indexOf(a)!=-1)return c;return-1}});return b.buttons.fontfamily=j,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("FontFamily");if(e==-1)j.setDisabled(!0);else{j.setDisabled(!1);var f=c.queryCommandValue("FontFamily");f&&(f=f.replace(/['"]/g,"").split(",")[0]),j.setValue(f)}}}),j}},b.fontsize=function(a,c,d){if(d=a.options.labelMap.fontsize||a.getLang("labelMap.fontsize")||"",c=c||a.options.fontsize||[],c.length){for(var e=[],f=0;f'+(this.label||"")+""}})}var h=new b.Combox({editor:a,items:e,title:d,initValue:d,onselect:function(b,c){a.execCommand("FontSize",this.items[c].value)},onbuttonclick:function(){this.showPopup()},className:"edui-for-fontsize"});return b.buttons.fontsize=h,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("FontSize");e==-1?h.setDisabled(!0):(h.setDisabled(!1),h.setValue(a.queryCommandValue("FontSize")))}}),h}},b.paragraph=function(c,d,e){if(e=c.options.labelMap.paragraph||c.getLang("labelMap.paragraph")||"",d=c.options.paragraph||[],!a.isEmptyObject(d)){var f=[];for(var g in d)f.push({value:g,label:d[g]||c.getLang("paragraph")[g],theme:c.options.theme,renderLabelHtml:function(){return'
            '+(this.label||"")+"
            "}});var h=new b.Combox({editor:c,items:f,title:e,initValue:e,className:"edui-for-paragraph",onselect:function(a,b){c.execCommand("Paragraph",this.items[b].value)},onbuttonclick:function(){this.showPopup()}});return b.buttons.paragraph=h,c.addListener("selectionchange",function(a,b,d){if(!d){var e=c.queryCommandState("Paragraph");if(e==-1)h.setDisabled(!0);else{h.setDisabled(!1);var f=c.queryCommandValue("Paragraph"),g=h.indexByValue(f);g!=-1?h.setValue(f):h.setValue(h.initValue)}}}),h}},b.customstyle=function(a){var c=a.options.customstyle||[],d=a.options.labelMap.customstyle||a.getLang("labelMap.customstyle")||"";if(c.length){for(var e,f=a.getLang("customstyle"),g=0,h=[];e=c[g++];)!function(b){var c={};c.label=b.label?b.label:f[b.name],c.style=b.style,c.className=b.className,c.tag=b.tag,h.push({label:c.label,value:c,theme:a.options.theme,renderLabelHtml:function(){return'
            <'+c.tag+" "+(c.className?' class="'+c.className+'"':"")+(c.style?' style="'+c.style+'"':"")+">"+c.label+"
            "}})}(e);var i=new b.Combox({editor:a,items:h,title:d,initValue:d,className:"edui-for-customstyle",onselect:function(b,c){a.execCommand("customstyle",this.items[c].value)},onbuttonclick:function(){this.showPopup()},indexByValue:function(a){for(var b,c=0;b=this.items[c++];)if(b.label==a)return c-1;return-1}});return b.buttons.customstyle=i,a.addListener("selectionchange",function(b,c,d){if(!d){var e=a.queryCommandState("customstyle");if(e==-1)i.setDisabled(!0);else{i.setDisabled(!1);var f=a.queryCommandValue("customstyle"),g=i.indexByValue(f);g!=-1?i.setValue(f):i.setValue(i.initValue)}}}),i}},b.inserttable=function(a,c,d){d=a.options.labelMap.inserttable||a.getLang("labelMap.inserttable")||"";var e=new b.TableButton({editor:a,title:d,className:"edui-for-inserttable",onpicktable:function(b,c,d){a.execCommand("InsertTable",{numRows:d,numCols:c,border:1})},onbuttonclick:function(){this.showPopup()}});return b.buttons.inserttable=e,a.addListener("selectionchange",function(){e.setDisabled(a.queryCommandState("inserttable")==-1)}),e},b.lineheight=function(a){var c=a.options.lineheight||[];if(c.length){for(var d,e=0,f=[];d=c[e++];)f.push({label:d,value:d,theme:a.options.theme,onclick:function(){a.execCommand("lineheight",this.value)}});var g=new b.MenuButton({editor:a,className:"edui-for-lineheight",title:a.options.labelMap.lineheight||a.getLang("labelMap.lineheight")||"",items:f,onbuttonclick:function(){var b=a.queryCommandValue("LineHeight")||this.value;a.execCommand("LineHeight",b)}});return b.buttons.lineheight=g,a.addListener("selectionchange",function(){var b=a.queryCommandState("LineHeight");if(b==-1)g.setDisabled(!0);else{g.setDisabled(!1);var c=a.queryCommandValue("LineHeight");c&&g.setValue((c+"").replace(/cm/,"")),g.setChecked(b)}}),g}};for(var k,l=["top","bottom"],m=0;k=l[m++];)!function(a){b["rowspacing"+a]=function(c){var d=c.options["rowspacing"+a]||[];if(!d.length)return null;for(var e,f=0,g=[];e=d[f++];)g.push({label:e,value:e,theme:c.options.theme,onclick:function(){c.execCommand("rowspacing",this.value,a)}});var h=new b.MenuButton({editor:c,className:"edui-for-rowspacing"+a,title:c.options.labelMap["rowspacing"+a]||c.getLang("labelMap.rowspacing"+a)||"",items:g,onbuttonclick:function(){var b=c.queryCommandValue("rowspacing",a)||this.value;c.execCommand("rowspacing",b,a)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState("rowspacing",a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue("rowspacing",a);d&&h.setValue((d+"").replace(/%/,"")),h.setChecked(b)}}),h}}(k);for(var n,o=["insertorderedlist","insertunorderedlist"],p=0;n=o[p++];)!function(a){b[a]=function(c){var d=c.options[a],e=function(){c.execCommand(a,this.value)},f=[];for(var g in d)f.push({label:d[g]||c.getLang()[a][g]||"",value:g,theme:c.options.theme,onclick:e});var h=new b.MenuButton({editor:c,className:"edui-for-"+a,title:c.getLang("labelMap."+a)||"",items:f,onbuttonclick:function(){var b=c.queryCommandValue(a)||this.value;c.execCommand(a,b)}});return b.buttons[a]=h,c.addListener("selectionchange",function(){var b=c.queryCommandState(a);if(b==-1)h.setDisabled(!0);else{h.setDisabled(!1);var d=c.queryCommandValue(a);h.setValue(d),h.setChecked(b)}}),h}}(n);b.fullscreen=function(a,c){c=a.options.labelMap.fullscreen||a.getLang("labelMap.fullscreen")||"";var d=new b.Button({className:"edui-for-fullscreen",title:c,theme:a.options.theme,onclick:function(){a.ui&&a.ui.setFullScreen(!a.ui.isFullScreen()),this.setChecked(a.ui.isFullScreen())}});return b.buttons.fullscreen=d,a.addListener("selectionchange",function(){var b=a.queryCommandState("fullscreen");d.setDisabled(b==-1),d.setChecked(a.ui.isFullScreen())}),d},b.emotion=function(a,c){var d="emotion",f=new b.MultiMenuPop({title:a.options.labelMap[d]||a.getLang("labelMap."+d)||"",editor:a,className:"edui-for-"+d,iframeUrl:a.ui.mapUrl(c||(a.options.iframeUrlMap||{})[d]||e[d])});return b.buttons[d]=f,a.addListener("selectionchange",function(){f.setDisabled(a.queryCommandState(d)==-1)}),f},b.autotypeset=function(a){var c=new b.AutoTypeSetButton({editor:a,title:a.options.labelMap.autotypeset||a.getLang("labelMap.autotypeset")||"",className:"edui-for-autotypeset",onbuttonclick:function(){a.execCommand("autotypeset")}});return b.buttons.autotypeset=c,a.addListener("selectionchange",function(){c.setDisabled(a.queryCommandState("autotypeset")==-1)}),c},b.simpleupload=function(a){var c="simpleupload",d=new b.Button({className:"edui-for-"+c,title:a.options.labelMap[c]||a.getLang("labelMap."+c)||"",onclick:function(){},theme:a.options.theme,showText:!1});return b.buttons[c]=d,a.addListener("ready",function(){var b=d.getDom("body"),c=b.children[0];a.fireEvent("simpleuploadbtnready",c)}),a.addListener("selectionchange",function(b,e,f){var g=a.queryCommandState(c);g==-1?(d.setDisabled(!0),d.setChecked(!1)):f||(d.setDisabled(!1),d.setChecked(g))}),d}}(),function(){function a(a){this.initOptions(a),this.initEditorUI()}var b=baidu.editor.utils,c=baidu.editor.ui.uiUtils,d=baidu.editor.ui.UIBase,e=baidu.editor.dom.domUtils,f=[];a.prototype={uiName:"editor",initEditorUI:function(){function a(a,b){a.setOpt({wordCount:!0,maximumWords:1e4,wordCountMsg:a.options.wordCountMsg||a.getLang("wordCountMsg"),wordOverFlowMsg:a.options.wordOverFlowMsg||a.getLang("wordOverFlowMsg")});var c=a.options,d=c.maximumWords,e=c.wordCountMsg,f=c.wordOverFlowMsg,g=b.getDom("wordcount");if(c.wordCount){var h=a.getContentLength(!0);h>d?(g.innerHTML=f,a.fireEvent("wordcountoverflow")):g.innerHTML=e.replace("{#leave}",d-h).replace("{#count}",h)}}this.editor.ui=this,this._dialogs={},this.initUIBase(),this._initToolbars();var b=this.editor,c=this;b.addListener("ready",function(){function d(){a(b,c),e.un(b.document,"click",arguments.callee)}b.getDialog=function(a){return b.ui._dialogs[a+"Dialog"]},e.on(b.window,"scroll",function(a){baidu.editor.ui.Popup.postHide(a)}),b.ui._actualFrameWidth=b.options.initialFrameWidth,UE.browser.ie&&6===UE.browser.version&&b.container.ownerDocument.execCommand("BackgroundImageCache",!1,!0),b.options.elementPathEnabled&&(b.ui.getDom("elementpath").innerHTML='
            '+b.getLang("elementPathTip")+":
            "),b.options.wordCount&&(e.on(b.document,"click",d),b.ui.getDom("wordcount").innerHTML=b.getLang("wordCountTip")),b.ui._scale(),b.options.scaleEnabled?(b.autoHeightEnabled&&b.disableAutoHeight(),c.enableScale()):c.disableScale(),b.options.elementPathEnabled||b.options.wordCount||b.options.scaleEnabled||(b.ui.getDom("elementpath").style.display="none",b.ui.getDom("wordcount").style.display="none",b.ui.getDom("scale").style.display="none"),b.selection.isFocus()&&b.fireEvent("selectionchange",!1,!0)}),b.addListener("mousedown",function(a,b){var c=b.target||b.srcElement;baidu.editor.ui.Popup.postHide(b,c),baidu.editor.ui.ShortCutMenu.postHide(b)}),b.addListener("delcells",function(){UE.ui.edittip&&new UE.ui.edittip(b),b.getDialog("edittip").open()});var d,f,g=!1;b.addListener("afterpaste",function(){b.queryCommandState("pasteplain")||(baidu.editor.ui.PastePicker&&(d=new baidu.editor.ui.Popup({content:new baidu.editor.ui.PastePicker({editor:b}),editor:b,className:"edui-wordpastepop"}),d.render()),g=!0)}),b.addListener("afterinserthtml",function(){clearTimeout(f),f=setTimeout(function(){if(d&&(g||b.ui._isTransfer)){if(d.isHidden()){var a=e.createElement(b.document,"span",{style:"line-height:0px;",innerHTML:"\ufeff"}),c=b.selection.getRange();c.insertNode(a);var f=getDomNode(a,"firstChild","previousSibling");f&&d.showAnchor(3==f.nodeType?f.parentNode:f),e.remove(a)}else d.show();delete b.ui._isTransfer,g=!1}},200)}),b.addListener("contextmenu",function(a,b){baidu.editor.ui.Popup.postHide(b)}),b.addListener("keydown",function(a,b){d&&d.dispose(b);var c=b.keyCode||b.which;b.altKey&&90==c&&UE.ui.buttons.fullscreen.onclick()}),b.addListener("wordcount",function(b){a(this,c)}),b.addListener("selectionchange",function(){b.options.elementPathEnabled&&c[(b.queryCommandState("elementpath")==-1?"dis":"en")+"ableElementPath"](),b.options.scaleEnabled&&c[(b.queryCommandState("scale")==-1?"dis":"en")+"ableScale"]()});var h=new baidu.editor.ui.Popup({editor:b,content:"",className:"edui-bubble",_onEditButtonClick:function(){this.hide(),b.ui._dialogs.linkDialog.open()},_onImgEditButtonClick:function(a){this.hide(),b.ui._dialogs[a]&&b.ui._dialogs[a].open()},_onImgSetFloat:function(a){this.hide(),b.execCommand("imagefloat",a)},_setIframeAlign:function(a){var b=h.anchorEl,c=b.cloneNode(!0);switch(a){case-2:c.setAttribute("align","");break;case-1:c.setAttribute("align","left");break;case 1:c.setAttribute("align","right")}b.parentNode.insertBefore(c,b),e.remove(b),h.anchorEl=c,h.showAnchor(h.anchorEl)},_updateIframe:function(){var a=b._iframe=h.anchorEl;e.hasClass(a,"ueditor_baidumap")?(b.selection.getRange().selectNode(a).select(),b.ui._dialogs.mapDialog.open(),h.hide()):(b.ui._dialogs.insertframeDialog.open(),h.hide())},_onRemoveButtonClick:function(a){b.execCommand(a),this.hide()},queryAutoHide:function(a){return a&&a.ownerDocument==b.document&&("img"==a.tagName.toLowerCase()||e.findParentByTagName(a,"a",!0))?a!==h.anchorEl:baidu.editor.ui.Popup.prototype.queryAutoHide.call(this,a)}});h.render(),b.options.imagePopup&&(b.addListener("mouseover",function(a,c){c=c||window.event;var d=c.target||c.srcElement;if(b.ui._dialogs.insertframeDialog&&/iframe/gi.test(d.tagName)){var e=h.formatHtml(""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'   '+b.getLang("modify")+"");e?(h.getDom("content").innerHTML=e,h.anchorEl=d,h.showAnchor(h.anchorEl)):h.hide()}}),b.addListener("selectionchange",function(a,c){if(c){var d="",f="",g=b.selection.getRange().getClosedNode(),i=b.ui._dialogs;if(g&&"IMG"==g.tagName){var j="insertimageDialog";if(g.className.indexOf("edui-faked-video")==-1&&g.className.indexOf("edui-upload-video")==-1||(j="insertvideoDialog"),g.className.indexOf("edui-faked-webapp")!=-1&&(j="webappDialog"),g.src.indexOf("http://api.map.baidu.com")!=-1&&(j="mapDialog"),g.className.indexOf("edui-faked-music")!=-1&&(j="musicDialog"),g.src.indexOf("http://maps.google.com/maps/api/staticmap")!=-1&&(j="gmapDialog"),g.getAttribute("anchorname")&&(j="anchorDialog",d=h.formatHtml(""+b.getLang("property")+': '+b.getLang("modify")+"  "+b.getLang("delete")+"")),g.getAttribute("word_img")&&(b.word_img=[g.getAttribute("word_img")],j="wordimageDialog"),(e.hasClass(g,"loadingclass")||e.hasClass(g,"loaderrorclass"))&&(j=""),!i[j])return;f=""+b.getLang("property")+': '+b.getLang("default")+'  '+b.getLang("justifyleft")+'  '+b.getLang("justifyright")+'  '+b.getLang("justifycenter")+"  '+b.getLang("modify")+"",!d&&(d=h.formatHtml(f))}if(b.ui._dialogs.linkDialog){var k,l=b.queryCommandValue("link");if(l&&(k=l.getAttribute("_href")||l.getAttribute("href",2))){var m=k;k.length>30&&(m=k.substring(0,20)+"..."),d&&(d+='
            '),d+=h.formatHtml(""+b.getLang("anthorMsg")+': '+m+' '+b.getLang("modify")+' '+b.getLang("clear")+""),h.showAnchor(l)}}d?(h.getDom("content").innerHTML=d,h.anchorEl=g||l,h.showAnchor(h.anchorEl)):h.hide()}}))},_initToolbars:function(){for(var a=this.editor,c=this.toolbars||[],d=[],e=0;e
            '+(this.toolbars.length?'
            '+this.renderToolbarBoxHtml()+"
            ":"")+'
            '},showWordImageDialog:function(){this._dialogs.wordimageDialog.open()},renderToolbarBoxHtml:function(){for(var a=[],b=0;b'+c+"");b.innerHTML='
            '+this.editor.getLang("elementPathTip")+": "+d.join(" > ")+"
            "}else b.style.display="none"},disableElementPath:function(){var a=this.getDom("elementpath");a.innerHTML="",a.style.display="none",this.elementPathEnabled=!1},enableElementPath:function(){var a=this.getDom("elementpath");a.style.display="",this.elementPathEnabled=!0,this._updateElementPath()},_scale:function(){function a(){o=e.getXY(h),p||(p=g.options.minFrameHeight+j.offsetHeight+k.offsetHeight),m.style.cssText="position:absolute;left:0;display:;top:0;background-color:#41ABFF;opacity:0.4;filter: Alpha(opacity=40);width:"+h.offsetWidth+"px;height:"+h.offsetHeight+"px;z-index:"+(g.options.zIndex+1),e.on(f,"mousemove",b),e.on(i,"mouseup",c),e.on(f,"mouseup",c)}function b(a){d();var b=a||window.event;r=b.pageX||f.documentElement.scrollLeft+b.clientX,s=b.pageY||f.documentElement.scrollTop+b.clientY,t=r-o.x,u=s-o.y,t>=q&&(n=!0,m.style.width=t+"px"),u>=p&&(n=!0,m.style.height=u+"px")}function c(){n&&(n=!1,g.ui._actualFrameWidth=m.offsetWidth-2,h.style.width=g.ui._actualFrameWidth+"px",g.setHeight(m.offsetHeight-k.offsetHeight-j.offsetHeight-2,!0)),m&&(m.style.display="none"),d(),e.un(f,"mousemove",b),e.un(i,"mouseup",c),e.un(f,"mouseup",c)}function d(){browser.ie?f.selection.clear():window.getSelection().removeAllRanges()}var f=document,g=this.editor,h=g.container,i=g.document,j=this.getDom("toolbarbox"),k=this.getDom("bottombar"),l=this.getDom("scale"),m=this.getDom("scalelayer"),n=!1,o=null,p=0,q=g.options.minFrameWidth,r=0,s=0,t=0,u=0,v=this;this.editor.addListener("fullscreenchanged",function(a,b){if(b)v.disableScale();else if(v.editor.options.scaleEnabled){v.enableScale();var c=v.editor.document.createElement("span");v.editor.body.appendChild(c),v.editor.body.style.height=Math.max(e.getXY(c).y,v.editor.iframe.offsetHeight-20)+"px",e.remove(c)}}),this.enableScale=function(){1!=g.queryCommandState("source")&&(l.style.display="",this.scaleEnabled=!0,e.on(l,"mousedown",a))},this.disableScale=function(){l.style.display="none",this.scaleEnabled=!1,e.un(l,"mousedown",a)}},isFullScreen:function(){return this._fullscreen},postRender:function(){d.prototype.postRender.call(this);for(var a=0;a[\n\r\t]+([ ]{4})+/g,">").replace(/[\n\r\t]+([ ]{4})+[\n\r\t]+<"),c.className&&(b.className=c.className),c.style.cssText&&(b.style.cssText=c.style.cssText),/textarea/i.test(c.tagName)?(d.textarea=c,d.textarea.style.display="none"):c.parentNode.removeChild(c),c.id&&(b.id=c.id,e.removeAttributes(c,"id")),c=b,c.innerHTML=""}e.addClass(c,"edui-"+d.options.theme),d.ui.render(c);var h=d.options;d.container=d.ui.getDom();for(var i,j=e.findParents(c,!0),k=[],l=0;i=j[l];l++)k[l]=i.style.display,i.style.display="block";if(h.initialFrameWidth)h.minFrameWidth=h.initialFrameWidth;else{h.minFrameWidth=h.initialFrameWidth=c.offsetWidth;var m=c.style.width;/%$/.test(m)&&(h.initialFrameWidth=m)}h.initialFrameHeight?h.minFrameHeight=h.initialFrameHeight:h.initialFrameHeight=h.minFrameHeight=c.offsetHeight;for(var i,l=0;i=j[l];l++)i.style.display=k[l];c.style.height&&(c.style.height=""),d.container.style.width=h.initialFrameWidth+(/%$/.test(h.initialFrameWidth)?"":"px"),d.container.style.zIndex=h.zIndex,f.call(d,d.ui.getDom("iframeholder")),d.fireEvent("afteruiready")}d.langIsReady?b():d.addListener("langReady",b)})},d},UE.getEditor=function(a,b){var c=g[a];return c||(c=g[a]=new UE.ui.Editor(b),c.render(a)),c},UE.delEditor=function(a){var b;(b=g[a])&&(b.key&&b.destroy(),delete g[a])},UE.registerUI=function(a,c,d,e){b.each(a.split(/\s+/),function(a){UE._customizeUI[a]={id:e,execFn:c,index:d}})}}(),UE.registerUI("message",function(a){function b(){var a=g.ui.getDom("toolbarbox");a&&(c.style.top=a.offsetHeight+3+"px"),c.style.zIndex=Math.max(g.options.zIndex,g.iframe.style.zIndex)+1}var c,d=baidu.editor.ui,e=d.Message,f=[],g=a;g.addListener("ready",function(){c=document.getElementById(g.ui.id+"_message_holder"),b(),setTimeout(function(){b()},500)}),g.addListener("showmessage",function(a,d){d=utils.isString(d)?{content:d}:d;var h=new e({timeout:d.timeout,type:d.type,content:d.content,keepshow:d.keepshow,editor:g}),i=d.id||"msg_"+(+new Date).toString(36);return h.render(c),f[i]=h,h.reset(d),b(),i}),g.addListener("updatemessage",function(a,b,d){d=utils.isString(d)?{content:d}:d;var e=f[b];e.render(c),e&&e.reset(d)}),g.addListener("hidemessage",function(a,b){var c=f[b];c&&c.hide()})}),UE.registerUI("autosave",function(a){var b=null,c=null;a.on("afterautosave",function(){clearTimeout(b),b=setTimeout(function(){c&&a.trigger("hidemessage",c),c=a.trigger("showmessage",{content:a.getLang("autosave.success"),timeout:2e3})},2e3)})})}(); \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.config.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.config.js new file mode 100644 index 0000000..b3cb1ee --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.config.js @@ -0,0 +1,497 @@ +/** + * ueditor完整配置项 + * 可以在这里配置整个编辑器的特性 + */ +/**************************提示******************************** + * 所有被注释的配置项均为UEditor默认值。 + * 修改默认配置请首先确保已经完全明确该参数的真实用途。 + * 主要有两种修改方案,一种是取消此处注释,然后修改成对应参数;另一种是在实例化编辑器时传入对应参数。 + * 当升级编辑器时,可直接使用旧版配置文件替换新版配置文件,不用担心旧版配置文件中因缺少新功能所需的参数而导致脚本报错。 + **************************提示********************************/ + +(function () { + + /** + * 编辑器资源文件根路径。它所表示的含义是:以编辑器实例化页面为当前路径,指向编辑器资源文件(即dialog等文件夹)的路径。 + * 鉴于很多同学在使用编辑器的时候出现的种种路径问题,此处强烈建议大家使用"相对于网站根目录的相对路径"进行配置。 + * "相对于网站根目录的相对路径"也就是以斜杠开头的形如"/myProject/ueditor/"这样的路径。 + * 如果站点中有多个不在同一层级的页面需要实例化编辑器,且引用了同一UEditor的时候,此处的URL可能不适用于每个页面的编辑器。 + * 因此,UEditor提供了针对不同页面的编辑器可单独配置的根路径,具体来说,在需要实例化编辑器的页面最顶部写上如下代码即可。当然,需要令此处的URL等于对应的配置。 + * window.UEDITOR_HOME_URL = "/xxxx/xxxx/"; + */ + var URL = window.UEDITOR_HOME_URL || getUEBasePath(); + + /** + * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 + */ + window.UEDITOR_CONFIG = { + + //为编辑器实例添加一个路径,这个不能被注释 + UEDITOR_HOME_URL: URL + + // 服务器统一请求接口路径 + , serverUrl: URL + "jsp/controller.jsp" + + //工具栏上的所有的功能按钮和下拉框,可以在new编辑器的实例时选择自己需要的重新定义 + , toolbars: [[ + 'fullscreen', 'source', '|', 'undo', 'redo', '|', + 'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|', + 'rowspacingtop', 'rowspacingbottom', 'lineheight', '|', + 'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|', + 'directionalityltr', 'directionalityrtl', 'indent', '|', + 'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|', + 'link', 'unlink', 'anchor', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|', + 'simpleupload', 'insertimage', 'emotion', 'scrawl', 'insertvideo', 'music', 'attachment', 'map', 'gmap', 'insertframe', 'insertcode', 'webapp', 'pagebreak', 'template', 'background', '|', + 'horizontal', 'date', 'time', 'spechars', 'snapscreen', 'wordimage', '|', + 'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', 'charts', '|', + 'print', 'preview', 'searchreplace', 'drafts', 'help' + ]] + //当鼠标放在工具栏上时显示的tooltip提示,留空支持自动多语言配置,否则以配置值为准 + //,labelMap:{ + // 'anchor':'', 'undo':'' + //} + + //语言配置项,默认是zh-cn。有需要的话也可以使用如下这样的方式来自动多语言切换,当然,前提条件是lang文件夹下存在对应的语言文件: + //lang值也可以通过自动获取 (navigator.language||navigator.browserLanguage ||navigator.userLanguage).toLowerCase() + //,lang:"zh-cn" + //,langPath:URL +"lang/" + + //主题配置项,默认是default。有需要的话也可以使用如下这样的方式来自动多主题切换,当然,前提条件是themes文件夹下存在对应的主题文件: + //现有如下皮肤:default + //,theme:'default' + //,themePath:URL +"themes/" + + //,zIndex : 900 //编辑器层级的基数,默认是900 + + //针对getAllHtml方法,会在对应的head标签中增加该编码设置。 + //,charset:"utf-8" + + //若实例化编辑器的页面手动修改的domain,此处需要设置为true + //,customDomain:false + + //常用配置项目 + //,isShow : true //默认显示编辑器 + + //,textarea:'editorValue' // 提交表单时,服务器获取编辑器提交内容的所用的参数,多实例时可以给容器name属性,会将name给定的值最为每个实例的键值,不用每次实例化的时候都设置这个值 + + //,initialContent:'欢迎使用ueditor!' //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子 + + //,autoClearinitialContent:true //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了 + + //,focus:false //初始化时,是否让编辑器获得焦点true或false + + //如果自定义,最好给p标签如下的行高,要不输入中文时,会有跳动感 + //,initialStyle:'p{line-height:1em}'//编辑器层级的基数,可以用来改变字体等 + + //,iframeCssUrl: URL + '/themes/iframe.css' //给编辑区域的iframe引入一个css文件 + + //indentValue + //首行缩进距离,默认是2em + //,indentValue:'2em' + + //,initialFrameWidth:1000 //初始化编辑器宽度,默认1000 + //,initialFrameHeight:320 //初始化编辑器高度,默认320 + + //,readonly : false //编辑器初始化结束后,编辑区域是否是只读的,默认是false + + //,autoClearEmptyNode : true //getContent时,是否删除空的inlineElement节点(包括嵌套的情况) + + //启用自动保存 + ,enableAutoSave: false + //自动保存间隔时间, 单位ms + ,saveInterval: 0 + + //,fullscreen : false //是否开启初始化时即全屏,默认关闭 + + //,imagePopup:true //图片操作的浮层开关,默认打开 + + //,autoSyncData:true //自动同步编辑器要提交的数据 + //,emotionLocalization:false //是否开启表情本地化,默认关闭。若要开启请确保emotion文件夹下包含官网提供的images表情文件夹 + + //粘贴只保留标签,去除标签所有属性 + //,retainOnlyLabelPasted: false + + //,pasteplain:false //是否默认为纯文本粘贴。false为不使用纯文本粘贴,true为使用纯文本粘贴 + //纯文本粘贴模式下的过滤规则 + //'filterTxtRules' : function(){ + // function transP(node){ + // node.tagName = 'p'; + // node.setStyle(); + // } + // return { + // //直接删除及其字节点内容 + // '-' : 'script style object iframe embed input select', + // 'p': {$:{}}, + // 'br':{$:{}}, + // 'div':{'$':{}}, + // 'li':{'$':{}}, + // 'caption':transP, + // 'th':transP, + // 'tr':transP, + // 'h1':transP,'h2':transP,'h3':transP,'h4':transP,'h5':transP,'h6':transP, + // 'td':function(node){ + // //没有内容的td直接删掉 + // var txt = !!node.innerText(); + // if(txt){ + // node.parentNode.insertAfter(UE.uNode.createText('    '),node); + // } + // node.parentNode.removeChild(node,node.innerText()) + // } + // } + //}() + + //,allHtmlEnabled:false //提交到后台的数据是否包含整个html字符串 + + //insertorderedlist + //有序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,'insertorderedlist':{ + // //自定的样式 + // 'num':'1,2,3...', + // 'num1':'1),2),3)...', + // 'num2':'(1),(2),(3)...', + // 'cn':'一,二,三....', + // 'cn1':'一),二),三)....', + // 'cn2':'(一),(二),(三)....', + // //系统自带 + // 'decimal' : '' , //'1,2,3...' + // 'lower-alpha' : '' , // 'a,b,c...' + // 'lower-roman' : '' , //'i,ii,iii...' + // 'upper-alpha' : '' , lang //'A,B,C' + // 'upper-roman' : '' //'I,II,III...' + //} + + //insertunorderedlist + //无序列表的下拉配置,值留空时支持多语言自动识别,若配置值,则以此值为准 + //,insertunorderedlist : { //自定的样式 + // 'dash' :'— 破折号', //-破折号 + // 'dot':' 。 小圆圈', //系统自带 + // 'circle' : '', // '○ 小圆圈' + // 'disc' : '', // '● 小圆点' + // 'square' : '' //'■ 小方块' + //} + //,listDefaultPaddingLeft : '30'//默认的左边缩进的基数倍 + //,listiconpath : 'http://bs.baidu.com/listicon/'//自定义标号的路径 + //,maxListLevel : 3 //限制可以tab的级数, 设置-1为不限制 + + //,autoTransWordToList:false //禁止word中粘贴进来的列表自动变成列表标签 + + //fontfamily + //字体设置 label留空支持多语言自动切换,若配置,则以配置值为准 + //,'fontfamily':[ + // { label:'',name:'songti',val:'宋体,SimSun'}, + // { label:'',name:'kaiti',val:'楷体,楷体_GB2312, SimKai'}, + // { label:'',name:'yahei',val:'微软雅黑,Microsoft YaHei'}, + // { label:'',name:'heiti',val:'黑体, SimHei'}, + // { label:'',name:'lishu',val:'隶书, SimLi'}, + // { label:'',name:'andaleMono',val:'andale mono'}, + // { label:'',name:'arial',val:'arial, helvetica,sans-serif'}, + // { label:'',name:'arialBlack',val:'arial black,avant garde'}, + // { label:'',name:'comicSansMs',val:'comic sans ms'}, + // { label:'',name:'impact',val:'impact,chicago'}, + // { label:'',name:'timesNewRoman',val:'times new roman'} + //] + + //fontsize + //字号 + //,'fontsize':[10, 11, 12, 14, 16, 18, 20, 24, 36] + + //paragraph + //段落格式 值留空时支持多语言自动识别,若配置,则以配置值为准 + //,'paragraph':{'p':'', 'h1':'', 'h2':'', 'h3':'', 'h4':'', 'h5':'', 'h6':''} + + //rowspacingtop + //段间距 值和显示的名字相同 + //,'rowspacingtop':['5', '10', '15', '20', '25'] + + //rowspacingBottom + //段间距 值和显示的名字相同 + //,'rowspacingbottom':['5', '10', '15', '20', '25'] + + //lineheight + //行内间距 值和显示的名字相同 + //,'lineheight':['1', '1.5','1.75','2', '3', '4', '5'] + + //customstyle + //自定义样式,不支持国际化,此处配置值即可最后显示值 + //block的元素是依据设置段落的逻辑设置的,inline的元素依据BIU的逻辑设置 + //尽量使用一些常用的标签 + //参数说明 + //tag 使用的标签名字 + //label 显示的名字也是用来标识不同类型的标识符,注意这个值每个要不同, + //style 添加的样式 + //每一个对象就是一个自定义的样式 + //,'customstyle':[ + // {tag:'h1', name:'tc', label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;text-align:center;margin:0 0 20px 0;'}, + // {tag:'h1', name:'tl',label:'', style:'border-bottom:#ccc 2px solid;padding:0 4px 0 0;margin:0 0 10px 0;'}, + // {tag:'span',name:'im', label:'', style:'font-style:italic;font-weight:bold'}, + // {tag:'span',name:'hi', label:'', style:'font-style:italic;font-weight:bold;color:rgb(51, 153, 204)'} + //] + + //打开右键菜单功能 + //,enableContextMenu: true + //右键菜单的内容,可以参考plugins/contextmenu.js里边的默认菜单的例子,label留空支持国际化,否则以此配置为准 + //,contextMenu:[ + // { + // label:'', //显示的名称 + // cmdName:'selectall',//执行的command命令,当点击这个右键菜单时 + // //exec可选,有了exec就会在点击时执行这个function,优先级高于cmdName + // exec:function () { + // //this是当前编辑器的实例 + // //this.ui._dialogs['inserttableDialog'].open(); + // } + // } + //] + + //快捷菜单 + //,shortcutMenu:["fontfamily", "fontsize", "bold", "italic", "underline", "forecolor", "backcolor", "insertorderedlist", "insertunorderedlist"] + + //elementPathEnabled + //是否启用元素路径,默认是显示 + //,elementPathEnabled : true + + //wordCount + //,wordCount:true //是否开启字数统计 + //,maximumWords:10000 //允许的最大字符数 + //字数统计提示,{#count}代表当前字数,{#leave}代表还可以输入多少字符数,留空支持多语言自动切换,否则按此配置显示 + //,wordCountMsg:'' //当前已输入 {#count} 个字符,您还可以输入{#leave} 个字符 + //超出字数限制提示 留空支持多语言自动切换,否则按此配置显示 + //,wordOverFlowMsg:'' //你输入的字符个数已经超出最大允许值,服务器可能会拒绝保存! + + //tab + //点击tab键时移动的距离,tabSize倍数,tabNode什么字符做为单位 + //,tabSize:4 + //,tabNode:' ' + + //removeFormat + //清除格式时可以删除的标签和属性 + //removeForamtTags标签 + //,removeFormatTags:'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var' + //removeFormatAttributes属性 + //,removeFormatAttributes:'class,style,lang,width,height,align,hspace,valign' + + //undo + //可以最多回退的次数,默认20 + //,maxUndoCount:20 + //当输入的字符数超过该值时,保存一次现场 + //,maxInputCount:1 + + //autoHeightEnabled + // 是否自动长高,默认true + //,autoHeightEnabled:true + + //scaleEnabled + //是否可以拉伸长高,默认true(当开启时,自动长高失效) + //,scaleEnabled:false + //,minFrameWidth:800 //编辑器拖动时最小宽度,默认800 + //,minFrameHeight:220 //编辑器拖动时最小高度,默认220 + + //autoFloatEnabled + //是否保持toolbar的位置不动,默认true + //,autoFloatEnabled:true + //浮动时工具栏距离浏览器顶部的高度,用于某些具有固定头部的页面 + //,topOffset:30 + //编辑器底部距离工具栏高度(如果参数大于等于编辑器高度,则设置无效) + //,toolbarTopOffset:400 + + //设置远程图片是否抓取到本地保存 + //,catchRemoteImageEnable: true //设置是否抓取远程图片 + + //pageBreakTag + //分页标识符,默认是_ueditor_page_break_tag_ + //,pageBreakTag:'_ueditor_page_break_tag_' + + //autotypeset + //自动排版参数 + //,autotypeset: { + // mergeEmptyline: true, //合并空行 + // removeClass: true, //去掉冗余的class + // removeEmptyline: false, //去掉空行 + // textAlign:"left", //段落的排版方式,可以是 left,right,center,justify 去掉这个属性表示不执行排版 + // imageBlockLine: 'center', //图片的浮动方式,独占一行剧中,左右浮动,默认: center,left,right,none 去掉这个属性表示不执行排版 + // pasteFilter: false, //根据规则过滤没事粘贴进来的内容 + // clearFontSize: false, //去掉所有的内嵌字号,使用编辑器默认的字号 + // clearFontFamily: false, //去掉所有的内嵌字体,使用编辑器默认的字体 + // removeEmptyNode: false, // 去掉空节点 + // //可以去掉的标签 + // removeTagNames: {标签名字:1}, + // indent: false, // 行首缩进 + // indentValue : '2em', //行首缩进的大小 + // bdc2sb: false, + // tobdc: false + //} + + //tableDragable + //表格是否可以拖拽 + //,tableDragable: true + + + + //sourceEditor + //源码的查看方式,codemirror 是代码高亮,textarea是文本框,默认是codemirror + //注意默认codemirror只能在ie8+和非ie中使用 + //,sourceEditor:"codemirror" + //如果sourceEditor是codemirror,还用配置一下两个参数 + //codeMirrorJsUrl js加载的路径,默认是 URL + "third-party/codemirror/codemirror.js" + //,codeMirrorJsUrl:URL + "third-party/codemirror/codemirror.js" + //codeMirrorCssUrl css加载的路径,默认是 URL + "third-party/codemirror/codemirror.css" + //,codeMirrorCssUrl:URL + "third-party/codemirror/codemirror.css" + //编辑器初始化完成后是否进入源码模式,默认为否。 + //,sourceEditorFirst:false + + //iframeUrlMap + //dialog内容的路径 ~会被替换成URL,垓属性一旦打开,将覆盖所有的dialog的默认路径 + //,iframeUrlMap:{ + // 'anchor':'~/dialogs/anchor/anchor.html', + //} + + //allowLinkProtocol 允许的链接地址,有这些前缀的链接地址不会自动添加http + //, allowLinkProtocols: ['http:', 'https:', '#', '/', 'ftp:', 'mailto:', 'tel:', 'git:', 'svn:'] + + //webAppKey 百度应用的APIkey,每个站长必须首先去百度官网注册一个key后方能正常使用app功能,注册介绍,http://app.baidu.com/static/cms/getapikey.html + //, webAppKey: "" + + //默认过滤规则相关配置项目 + //,disabledTableInTable:true //禁止表格嵌套 + //,allowDivTransToP:true //允许进入编辑器的div标签自动变成p标签 + //,rgb2Hex:true //默认产出的数据中的color自动从rgb格式变成16进制格式 + + // xss 过滤是否开启,inserthtml等操作 + ,xssFilterRules: true + //input xss过滤 + ,inputXssFilter: true + //output xss过滤 + ,outputXssFilter: true + // xss过滤白名单 名单来源: https://raw.githubusercontent.com/leizongmin/js-xss/master/lib/default.js + ,whitList: { + a: ['target', 'href', 'title', 'class', 'style'], + abbr: ['title', 'class', 'style'], + address: ['class', 'style'], + area: ['shape', 'coords', 'href', 'alt'], + article: [], + aside: [], + audio: ['autoplay', 'controls', 'loop', 'preload', 'src', 'class', 'style'], + b: ['class', 'style'], + bdi: ['dir'], + bdo: ['dir'], + big: [], + blockquote: ['cite', 'class', 'style'], + br: [], + caption: ['class', 'style'], + center: [], + cite: [], + code: ['class', 'style'], + col: ['align', 'valign', 'span', 'width', 'class', 'style'], + colgroup: ['align', 'valign', 'span', 'width', 'class', 'style'], + dd: ['class', 'style'], + del: ['datetime'], + details: ['open'], + div: ['class', 'style'], + dl: ['class', 'style'], + dt: ['class', 'style'], + em: ['class', 'style'], + font: ['color', 'size', 'face'], + footer: [], + h1: ['class', 'style'], + h2: ['class', 'style'], + h3: ['class', 'style'], + h4: ['class', 'style'], + h5: ['class', 'style'], + h6: ['class', 'style'], + header: [], + hr: [], + i: ['class', 'style'], + img: ['src', 'alt', 'title', 'width', 'height', 'id', '_src', 'loadingclass', 'class', 'data-latex'], + ins: ['datetime'], + li: ['class', 'style'], + mark: [], + nav: [], + ol: ['class', 'style'], + p: ['class', 'style'], + pre: ['class', 'style'], + s: [], + section:[], + small: [], + span: ['class', 'style'], + sub: ['class', 'style'], + sup: ['class', 'style'], + strong: ['class', 'style'], + table: ['width', 'border', 'align', 'valign', 'class', 'style'], + tbody: ['align', 'valign', 'class', 'style'], + td: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + tfoot: ['align', 'valign', 'class', 'style'], + th: ['width', 'rowspan', 'colspan', 'align', 'valign', 'class', 'style'], + thead: ['align', 'valign', 'class', 'style'], + tr: ['rowspan', 'align', 'valign', 'class', 'style'], + tt: [], + u: [], + ul: ['class', 'style'], + video: ['autoplay', 'controls', 'loop', 'preload', 'src', 'height', 'width', 'class', 'style'] + } + }; + + function getUEBasePath(docUrl, confUrl) { + + return getBasePath(docUrl || self.document.URL || self.location.href, confUrl || getConfigFilePath()); + + } + + function getConfigFilePath() { + + var configPath = document.getElementsByTagName('script'); + + return configPath[ configPath.length - 1 ].src; + + } + + function getBasePath(docUrl, confUrl) { + + var basePath = confUrl; + + + if (/^(\/|\\\\)/.test(confUrl)) { + + basePath = /^.+?\w(\/|\\\\)/.exec(docUrl)[0] + confUrl.replace(/^(\/|\\\\)/, ''); + + } else if (!/^[a-z]+:/i.test(confUrl)) { + + docUrl = docUrl.split("#")[0].split("?")[0].replace(/[^\\\/]+$/, ''); + + basePath = docUrl + "" + confUrl; + + } + + return optimizationPath(basePath); + + } + + function optimizationPath(path) { + + var protocol = /^[a-z]+:\/\//.exec(path)[ 0 ], + tmp = null, + res = []; + + path = path.replace(protocol, "").split("?")[0].split("#")[0]; + + path = path.replace(/\\/g, '/').split(/\//); + + path[ path.length - 1 ] = ""; + + while (path.length) { + + if (( tmp = path.shift() ) === "..") { + res.pop(); + } else if (tmp !== ".") { + res.push(tmp); + } + + } + + return protocol + res.join("/"); + + } + + window.UE = { + getUEBasePath: getUEBasePath + }; + +})(); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.parse.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.parse.js new file mode 100644 index 0000000..84421f2 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.parse.js @@ -0,0 +1,1022 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:16 GMT+0800 (CST) + */ + +(function(){ + +(function(){ + UE = window.UE || {}; + var isIE = !!window.ActiveXObject; + //定义utils工具 + var utils = { + removeLastbs : function(url){ + return url.replace(/\/$/,'') + }, + extend : function(t,s){ + var a = arguments, + notCover = this.isBoolean(a[a.length - 1]) ? a[a.length - 1] : false, + len = this.isBoolean(a[a.length - 1]) ? a.length - 1 : a.length; + for (var i = 1; i < len; i++) { + var x = a[i]; + for (var k in x) { + if (!notCover || !t.hasOwnProperty(k)) { + t[k] = x[k]; + } + } + } + return t; + }, + isIE : isIE, + cssRule : isIE ? function(key,style,doc){ + var indexList,index; + doc = doc || document; + if(doc.indexList){ + indexList = doc.indexList; + }else{ + indexList = doc.indexList = {}; + } + var sheetStyle; + if(!indexList[key]){ + if(style === undefined){ + return '' + } + sheetStyle = doc.createStyleSheet('',index = doc.styleSheets.length); + indexList[key] = index; + }else{ + sheetStyle = doc.styleSheets[indexList[key]]; + } + if(style === undefined){ + return sheetStyle.cssText + } + sheetStyle.cssText = sheetStyle.cssText + '\n' + (style || '') + } : function(key,style,doc){ + doc = doc || document; + var head = doc.getElementsByTagName('head')[0],node; + if(!(node = doc.getElementById(key))){ + if(style === undefined){ + return '' + } + node = doc.createElement('style'); + node.id = key; + head.appendChild(node) + } + if(style === undefined){ + return node.innerHTML + } + if(style !== ''){ + node.innerHTML = node.innerHTML + '\n' + style; + }else{ + head.removeChild(node) + } + }, + domReady : function (onready) { + var doc = window.document; + if (doc.readyState === "complete") { + onready(); + }else{ + if (isIE) { + (function () { + if (doc.isReady) return; + try { + doc.documentElement.doScroll("left"); + } catch (error) { + setTimeout(arguments.callee, 0); + return; + } + onready(); + })(); + window.attachEvent('onload', function(){ + onready() + }); + } else { + doc.addEventListener("DOMContentLoaded", function () { + doc.removeEventListener("DOMContentLoaded", arguments.callee, false); + onready(); + }, false); + window.addEventListener('load', function(){onready()}, false); + } + } + + }, + each : function(obj, iterator, context) { + if (obj == null) return; + if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + if(iterator.call(context, obj[i], i, obj) === false) + return false; + } + } else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if(iterator.call(context, obj[key], key, obj) === false) + return false; + } + } + } + }, + inArray : function(arr,item){ + var index = -1; + this.each(arr,function(v,i){ + if(v === item){ + index = i; + return false; + } + }); + return index; + }, + pushItem : function(arr,item){ + if(this.inArray(arr,item)==-1){ + arr.push(item) + } + }, + trim: function (str) { + return str.replace(/(^[ \t\n\r]+)|([ \t\n\r]+$)/g, ''); + }, + indexOf: function (array, item, start) { + var index = -1; + start = this.isNumber(start) ? start : 0; + this.each(array, function (v, i) { + if (i >= start && v === item) { + index = i; + return false; + } + }); + return index; + }, + hasClass: function (element, className) { + className = className.replace(/(^[ ]+)|([ ]+$)/g, '').replace(/[ ]{2,}/g, ' ').split(' '); + for (var i = 0, ci, cls = element.className; ci = className[i++];) { + if (!new RegExp('\\b' + ci + '\\b', 'i').test(cls)) { + return false; + } + } + return i - 1 == className.length; + }, + addClass:function (elm, classNames) { + if(!elm)return; + classNames = this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + if(!new RegExp('\\b' + ci + '\\b').test(cls)){ + cls += ' ' + ci; + } + } + elm.className = utils.trim(cls); + }, + removeClass:function (elm, classNames) { + classNames = this.isArray(classNames) ? classNames : + this.trim(classNames).replace(/[ ]{2,}/g,' ').split(' '); + for(var i = 0,ci,cls = elm.className;ci=classNames[i++];){ + cls = cls.replace(new RegExp('\\b' + ci + '\\b'),'') + } + cls = this.trim(cls).replace(/[ ]{2,}/g,' '); + elm.className = cls; + !cls && elm.removeAttribute('className'); + }, + on: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + if (!handler._d) { + handler._d = { + els : [] + }; + } + var key = type + handler.toString(),index = utils.indexOf(handler._d.els,element); + if (!handler._d[key] || index == -1) { + if(index == -1){ + handler._d.els.push(element); + } + if(!handler._d[key]){ + handler._d[key] = function (evt) { + return handler.call(evt.srcElement, evt || window.event); + }; + } + + + element.attachEvent('on' + type, handler._d[key]); + } + } + } + element = null; + }, + off: function (element, type, handler) { + var types = this.isArray(type) ? type : type.split(/\s+/), + k = types.length; + if (k) while (k--) { + type = types[k]; + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + var key = type + handler.toString(); + try{ + element.detachEvent('on' + type, handler._d ? handler._d[key] : handler); + }catch(e){} + if (handler._d && handler._d[key]) { + var index = utils.indexOf(handler._d.els,element); + if(index!=-1){ + handler._d.els.splice(index,1); + } + handler._d.els.length == 0 && delete handler._d[key]; + } + } + } + }, + loadFile : function () { + var tmpList = []; + function getItem(doc,obj){ + try{ + for(var i= 0,ci;ci=tmpList[i++];){ + if(ci.doc === doc && ci.url == (obj.src || obj.href)){ + return ci; + } + } + }catch(e){ + return null; + } + + } + return function (doc, obj, fn) { + var item = getItem(doc,obj); + if (item) { + if(item.ready){ + fn && fn(); + }else{ + item.funs.push(fn) + } + return; + } + tmpList.push({ + doc:doc, + url:obj.src||obj.href, + funs:[fn] + }); + if (!doc.body) { + var html = []; + for(var p in obj){ + if(p == 'tag')continue; + html.push(p + '="' + obj[p] + '"') + } + doc.write('<' + obj.tag + ' ' + html.join(' ') + ' >'); + return; + } + if (obj.id && doc.getElementById(obj.id)) { + return; + } + var element = doc.createElement(obj.tag); + delete obj.tag; + for (var p in obj) { + element.setAttribute(p, obj[p]); + } + element.onload = element.onreadystatechange = function () { + if (!this.readyState || /loaded|complete/.test(this.readyState)) { + item = getItem(doc,obj); + if (item.funs.length > 0) { + item.ready = 1; + for (var fi; fi = item.funs.pop();) { + fi(); + } + } + element.onload = element.onreadystatechange = null; + } + }; + element.onerror = function(){ + throw Error('The load '+(obj.href||obj.src)+' fails,check the url') + }; + doc.getElementsByTagName("head")[0].appendChild(element); + } + }() + }; + utils.each(['String', 'Function', 'Array', 'Number', 'RegExp', 'Object','Boolean'], function (v) { + utils['is' + v] = function (obj) { + return Object.prototype.toString.apply(obj) == '[object ' + v + ']'; + } + }); + var parselist = {}; + UE.parse = { + register : function(parseName,fn){ + parselist[parseName] = fn; + }, + load : function(opt){ + utils.each(parselist,function(v){ + v.call(opt,utils); + }) + } + }; + uParse = function(selector,opt){ + utils.domReady(function(){ + var contents; + if(document.querySelectorAll){ + contents = document.querySelectorAll(selector) + }else{ + if(/^#/.test(selector)){ + contents = [document.getElementById(selector.replace(/^#/,''))] + }else if(/^\./.test(selector)){ + var contents = []; + utils.each(document.getElementsByTagName('*'),function(node){ + if(node.className && new RegExp('\\b' + selector.replace(/^\./,'') + '\\b','i').test(node.className)){ + contents.push(node) + } + }) + }else{ + contents = document.getElementsByTagName(selector) + } + } + utils.each(contents,function(v){ + UE.parse.load(utils.extend({root:v,selector:selector},opt)) + }) + }) + } +})(); + +UE.parse.register('insertcode',function(utils){ + var pres = this.root.getElementsByTagName('pre'); + if(pres.length){ + if(typeof XRegExp == "undefined"){ + var jsurl,cssurl; + if(this.rootPath !== undefined){ + jsurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCore.js'; + cssurl = utils.removeLastbs(this.rootPath) + '/third-party/SyntaxHighlighter/shCoreDefault.css'; + }else{ + jsurl = this.highlightJsUrl; + cssurl = this.highlightCssUrl; + } + utils.loadFile(document,{ + id : "syntaxhighlighter_css", + tag : "link", + rel : "stylesheet", + type : "text/css", + href : cssurl + }); + utils.loadFile(document,{ + id : "syntaxhighlighter_js", + src : jsurl, + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + utils.each(pres,function(pi){ + if(pi && /brush/i.test(pi.className)){ + SyntaxHighlighter.highlight(pi); + } + }); + }); + }else{ + utils.each(pres,function(pi){ + if(pi && /brush/i.test(pi.className)){ + SyntaxHighlighter.highlight(pi); + } + }); + } + } + +}); +UE.parse.register('table', function (utils) { + var me = this, + root = this.root, + tables = root.getElementsByTagName('table'); + if (tables.length) { + var selector = this.selector; + //追加默认的表格样式 + utils.cssRule('table', + selector + ' table.noBorderTable td,' + + selector + ' table.noBorderTable th,' + + selector + ' table.noBorderTable caption{border:1px dashed #ddd !important}' + + selector + ' table.sortEnabled tr.firstRow th,' + selector + ' table.sortEnabled tr.firstRow td{padding-right:20px; background-repeat: no-repeat;' + + 'background-position: center right; background-image:url(' + this.rootPath + 'themes/default/images/sortable.png);}' + + selector + ' table.sortEnabled tr.firstRow th:hover,' + selector + ' table.sortEnabled tr.firstRow td:hover{background-color: #EEE;}' + + selector + ' table{margin-bottom:10px;border-collapse:collapse;display:table;}' + + selector + ' td,' + selector + ' th{ background:white; padding: 5px 10px;border: 1px solid #DDD;}' + + selector + ' caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}' + + selector + ' th{border-top:1px solid #BBB;background:#F7F7F7;}' + + selector + ' table tr.firstRow th{border-top:2px solid #BBB;background:#F7F7F7;}' + + selector + ' tr.ue-table-interlace-color-single td{ background: #fcfcfc; }' + + selector + ' tr.ue-table-interlace-color-double td{ background: #f7faff; }' + + selector + ' td p{margin:0;padding:0;}', + document); + //填充空的单元格 + + utils.each('td th caption'.split(' '), function (tag) { + var cells = root.getElementsByTagName(tag); + cells.length && utils.each(cells, function (node) { + if (!node.firstChild) { + node.innerHTML = ' '; + + } + }) + }); + + //表格可排序 + var tables = root.getElementsByTagName('table'); + utils.each(tables, function (table) { + if (/\bsortEnabled\b/.test(table.className)) { + utils.on(table, 'click', function(e){ + var target = e.target || e.srcElement, + cell = findParentByTagName(target, ['td', 'th']); + var table = findParentByTagName(target, 'table'), + colIndex = utils.indexOf(table.rows[0].cells, cell), + sortType = table.getAttribute('data-sort-type'); + if(colIndex != -1) { + sortTable(table, colIndex, me.tableSortCompareFn || sortType); + updateTable(table); + } + }); + } + }); + + //按照标签名查找父节点 + function findParentByTagName(target, tagNames) { + var i, current = target; + tagNames = utils.isArray(tagNames) ? tagNames:[tagNames]; + while(current){ + for(i = 0;i < tagNames.length; i++) { + if(current.tagName == tagNames[i].toUpperCase()) return current; + } + current = current.parentNode; + } + return null; + } + //表格排序 + function sortTable(table, sortByCellIndex, compareFn) { + var rows = table.rows, + trArray = [], + flag = rows[0].cells[0].tagName === "TH", + lastRowIndex = 0; + + for (var i = 0,len = rows.length; i < len; i++) { + trArray[i] = rows[i]; + } + + var Fn = { + 'reversecurrent': function(td1,td2){ + return 1; + }, + 'orderbyasc': function(td1,td2){ + var value1 = td1.innerText||td1.textContent, + value2 = td2.innerText||td2.textContent; + return value1.localeCompare(value2); + }, + 'reversebyasc': function(td1,td2){ + var value1 = td1.innerHTML, + value2 = td2.innerHTML; + return value2.localeCompare(value1); + }, + 'orderbynum': function(td1,td2){ + var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value1||0) - (value2||0); + }, + 'reversebynum': function(td1,td2){ + var value1 = td1[utils.isIE ? 'innerText':'textContent'].match(/\d+/), + value2 = td2[utils.isIE ? 'innerText':'textContent'].match(/\d+/); + if(value1) value1 = +value1[0]; + if(value2) value2 = +value2[0]; + return (value2||0) - (value1||0); + } + }; + + //对表格设置排序的标记data-sort-type + table.setAttribute('data-sort-type', compareFn && typeof compareFn === "string" && Fn[compareFn] ? compareFn:''); + + //th不参与排序 + flag && trArray.splice(0, 1); + trArray = sort(trArray,function (tr1, tr2) { + var result; + if (compareFn && typeof compareFn === "function") { + result = compareFn.call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else if (compareFn && typeof compareFn === "number") { + result = 1; + } else if (compareFn && typeof compareFn === "string" && Fn[compareFn]) { + result = Fn[compareFn].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } else { + result = Fn['orderbyasc'].call(this, tr1.cells[sortByCellIndex], tr2.cells[sortByCellIndex]); + } + return result; + }); + var fragment = table.ownerDocument.createDocumentFragment(); + for (var j = 0, len = trArray.length; j < len; j++) { + fragment.appendChild(trArray[j]); + } + var tbody = table.getElementsByTagName("tbody")[0]; + if(!lastRowIndex){ + tbody.appendChild(fragment); + }else{ + tbody.insertBefore(fragment,rows[lastRowIndex- range.endRowIndex + range.beginRowIndex - 1]) + } + } + //冒泡排序 + function sort(array, compareFn){ + compareFn = compareFn || function(item1, item2){ return item1.localeCompare(item2);}; + for(var i= 0,len = array.length; i 0){ + var t = array[i]; + array[i] = array[j]; + array[j] = t; + } + } + } + return array; + } + //更新表格 + function updateTable(table) { + //给第一行设置firstRow的样式名称,在排序图标的样式上使用到 + if(!utils.hasClass(table.rows[0], "firstRow")) { + for(var i = 1; i< table.rows.length; i++) { + utils.removeClass(table.rows[i], "firstRow"); + } + utils.addClass(table.rows[0], "firstRow"); + } + } + } +}); +UE.parse.register('charts',function( utils ){ + + utils.cssRule('chartsContainerHeight','.edui-chart-container { height:'+(this.chartContainerHeight||300)+'px}'); + var resourceRoot = this.rootPath, + containers = this.root, + sources = null; + + //不存在指定的根路径, 则直接退出 + if ( !resourceRoot ) { + return; + } + + if ( sources = parseSources() ) { + + loadResources(); + + } + + + function parseSources () { + + if ( !containers ) { + return null; + } + + return extractChartData( containers ); + + } + + /** + * 提取数据 + */ + function extractChartData ( rootNode ) { + + var data = [], + tables = rootNode.getElementsByTagName( "table" ); + + for ( var i = 0, tableNode; tableNode = tables[ i ]; i++ ) { + + if ( tableNode.getAttribute( "data-chart" ) !== null ) { + + data.push( formatData( tableNode ) ); + + } + + } + + return data.length ? data : null; + + } + + function formatData ( tableNode ) { + + var meta = tableNode.getAttribute( "data-chart" ), + metaConfig = {}, + data = []; + + //提取table数据 + for ( var i = 0, row; row = tableNode.rows[ i ]; i++ ) { + + var rowData = []; + + for ( var j = 0, cell; cell = row.cells[ j ]; j++ ) { + + var value = ( cell.innerText || cell.textContent || '' ); + rowData.push( cell.tagName == 'TH' ? value:(value | 0) ); + + } + + data.push( rowData ); + + } + + //解析元信息 + meta = meta.split( ";" ); + for ( var i = 0, metaData; metaData = meta[ i ]; i++ ) { + + metaData = metaData.split( ":" ); + metaConfig[ metaData[ 0 ] ] = metaData[ 1 ]; + + } + + + return { + table: tableNode, + meta: metaConfig, + data: data + }; + + } + + //加载资源 + function loadResources () { + + loadJQuery(); + + } + + function loadJQuery () { + + //不存在jquery, 则加载jquery + if ( !window.jQuery ) { + + utils.loadFile(document,{ + src : resourceRoot + "/third-party/jquery-1.10.2.min.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + loadHighcharts(); + + }); + + } else { + + loadHighcharts(); + + } + + } + + function loadHighcharts () { + + //不存在Highcharts, 则加载Highcharts + if ( !window.Highcharts ) { + + utils.loadFile(document,{ + src : resourceRoot + "/third-party/highcharts/highcharts.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + loadTypeConfig(); + + }); + + } else { + + loadTypeConfig(); + + } + + } + + //加载图表差异化配置文件 + function loadTypeConfig () { + + utils.loadFile(document,{ + src : resourceRoot + "/dialogs/charts/chart.config.js", + tag : "script", + type : "text/javascript", + defer : "defer" + },function(){ + + render(); + + }); + + } + + //渲染图表 + function render () { + + var config = null, + chartConfig = null, + container = null; + + for ( var i = 0, len = sources.length; i < len; i++ ) { + + config = sources[ i ]; + + chartConfig = analysisConfig( config ); + + container = createContainer( config.table ); + + renderChart( container, typeConfig[ config.meta.chartType ], chartConfig ); + + } + + + } + + /** + * 渲染图表 + * @param container 图表容器节点对象 + * @param typeConfig 图表类型配置 + * @param config 图表通用配置 + * */ + function renderChart ( container, typeConfig, config ) { + + + $( container ).highcharts( $.extend( {}, typeConfig, { + + credits: { + enabled: false + }, + exporting: { + enabled: false + }, + title: { + text: config.title, + x: -20 //center + }, + subtitle: { + text: config.subTitle, + x: -20 + }, + xAxis: { + title: { + text: config.xTitle + }, + categories: config.categories + }, + yAxis: { + title: { + text: config.yTitle + }, + plotLines: [{ + value: 0, + width: 1, + color: '#808080' + }] + }, + tooltip: { + enabled: true, + valueSuffix: config.suffix + }, + legend: { + layout: 'vertical', + align: 'right', + verticalAlign: 'middle', + borderWidth: 1 + }, + series: config.series + + } )); + + } + + /** + * 创建图表的容器 + * 新创建的容器会替换掉对应的table对象 + * */ + function createContainer ( tableNode ) { + + var container = document.createElement( "div" ); + container.className = "edui-chart-container"; + + tableNode.parentNode.replaceChild( container, tableNode ); + + return container; + + } + + //根据config解析出正确的类别和图表数据信息 + function analysisConfig ( config ) { + + var series = [], + //数据类别 + categories = [], + result = [], + data = config.data, + meta = config.meta; + + //数据对齐方式为相反的方式, 需要反转数据 + if ( meta.dataFormat != "1" ) { + + for ( var i = 0, len = data.length; i < len ; i++ ) { + + for ( var j = 0, jlen = data[ i ].length; j < jlen; j++ ) { + + if ( !result[ j ] ) { + result[ j ] = []; + } + + result[ j ][ i ] = data[ i ][ j ]; + + } + + } + + data = result; + + } + + result = {}; + + //普通图表 + if ( meta.chartType != typeConfig.length - 1 ) { + + categories = data[ 0 ].slice( 1 ); + + for ( var i = 1, curData; curData = data[ i ]; i++ ) { + series.push( { + name: curData[ 0 ], + data: curData.slice( 1 ) + } ); + } + + result.series = series; + result.categories = categories; + result.title = meta.title; + result.subTitle = meta.subTitle; + result.xTitle = meta.xTitle; + result.yTitle = meta.yTitle; + result.suffix = meta.suffix; + + } else { + + var curData = []; + + for ( var i = 1, len = data[ 0 ].length; i < len; i++ ) { + + curData.push( [ data[ 0 ][ i ], data[ 1 ][ i ] | 0 ] ); + + } + + //饼图 + series[ 0 ] = { + type: 'pie', + name: meta.tip, + data: curData + }; + + result.series = series; + result.title = meta.title; + result.suffix = meta.suffix; + + } + + return result; + + } + +}); +UE.parse.register('background', function (utils) { + var me = this, + root = me.root, + p = root.getElementsByTagName('p'), + styles; + + for (var i = 0,ci; ci = p[i++];) { + styles = ci.getAttribute('data-background'); + if (styles){ + ci.parentNode.removeChild(ci); + } + } + + //追加默认的表格样式 + styles && utils.cssRule('ueditor_background', me.selector + '{' + styles + '}', document); +}); +UE.parse.register('list',function(utils){ + var customCss = [], + customStyle = { + 'cn' : 'cn-1-', + 'cn1' : 'cn-2-', + 'cn2' : 'cn-3-', + 'num' : 'num-1-', + 'num1' : 'num-2-', + 'num2' : 'num-3-', + 'dash' : 'dash', + 'dot' : 'dot' + }; + + + utils.extend(this,{ + liiconpath : 'http://bs.baidu.com/listicon/', + listDefaultPaddingLeft : '20' + }); + + var root = this.root, + ols = root.getElementsByTagName('ol'), + uls = root.getElementsByTagName('ul'), + selector = this.selector; + + if(ols.length){ + applyStyle.call(this,ols); + } + + if(uls.length){ + applyStyle.call(this,uls); + } + + if(ols.length || uls.length){ + customCss.push(selector +' .list-paddingleft-1{padding-left:0}'); + customCss.push(selector +' .list-paddingleft-2{padding-left:'+ this.listDefaultPaddingLeft+'px}'); + customCss.push(selector +' .list-paddingleft-3{padding-left:'+ this.listDefaultPaddingLeft*2+'px}'); + + utils.cssRule('list', selector +' ol,'+selector +' ul{margin:0;padding:0;}li{clear:both;}'+customCss.join('\n'), document); + } + function applyStyle(nodes){ + var T = this; + utils.each(nodes,function(list){ + if(list.className && /custom_/i.test(list.className)){ + var listStyle = list.className.match(/custom_(\w+)/)[1]; + if(listStyle == 'dash' || listStyle == 'dot'){ + utils.pushItem(customCss,selector +' li.list-' + customStyle[listStyle] + '{background-image:url(' + T.liiconpath +customStyle[listStyle]+'.gif)}'); + utils.pushItem(customCss,selector +' ul.custom_'+listStyle+'{list-style:none;} '+ selector +' ul.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}'); + + }else{ + var index = 1; + utils.each(list.childNodes,function(li){ + if(li.tagName == 'LI'){ + utils.pushItem(customCss,selector + ' li.list-' + customStyle[listStyle] + index + '{background-image:url(' + T.liiconpath + 'list-'+customStyle[listStyle] +index + '.gif)}'); + index++; + } + }); + utils.pushItem(customCss,selector + ' ol.custom_'+listStyle+'{list-style:none;}'+selector+' ol.custom_'+listStyle+' li{background-position:0 3px;background-repeat:no-repeat}'); + } + switch(listStyle){ + case 'cn': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn1': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:30px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:55px}'); + break; + case 'cn2': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:40px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:55px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-3{padding-left:68px}'); + break; + case 'num': + case 'num1': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:25px}'); + break; + case 'num2': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-1{padding-left:35px}'); + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft-2{padding-left:40px}'); + break; + case 'dash': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:35px}'); + break; + case 'dot': + utils.pushItem(customCss,selector + ' li.list-'+listStyle+'-paddingleft{padding-left:20px}'); + } + } + }); + } + + +}); +UE.parse.register('vedio',function(utils){ + var video = this.root.getElementsByTagName('video'), + audio = this.root.getElementsByTagName('audio'); + + document.createElement('video');document.createElement('audio'); + if(video.length || audio.length){ + var sourcePath = utils.removeLastbs(this.rootPath), + jsurl = sourcePath + '/third-party/video-js/video.js', + cssurl = sourcePath + '/third-party/video-js/video-js.min.css', + swfUrl = sourcePath + '/third-party/video-js/video-js.swf'; + + if(window.videojs) { + videojs.autoSetup(); + } else { + utils.loadFile(document,{ + id : "video_css", + tag : "link", + rel : "stylesheet", + type : "text/css", + href : cssurl + }); + utils.loadFile(document,{ + id : "video_js", + src : jsurl, + tag : "script", + type : "text/javascript" + },function(){ + videojs.options.flash.swf = swfUrl; + videojs.autoSetup(); + }); + } + + } +}); + +})(); diff --git a/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.parse.min.js b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.parse.min.js new file mode 100644 index 0000000..9fe9a08 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/ueditor/ueditor.parse.min.js @@ -0,0 +1,7 @@ +/*! + * UEditor + * version: ueditor + * build: Wed Aug 10 2016 11:06:19 GMT+0800 (CST) + */ + +!function(){!function(){UE=window.UE||{};var a=!!window.ActiveXObject,b={removeLastbs:function(a){return a.replace(/\/$/,"")},extend:function(a,b){for(var c=arguments,d=!!this.isBoolean(c[c.length-1])&&c[c.length-1],e=this.isBoolean(c[c.length-1])?c.length-1:c.length,f=1;f=c&&a===b)return d=e,!1}),d},hasClass:function(a,b){b=b.replace(/(^[ ]+)|([ ]+$)/g,"").replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)if(!new RegExp("\\b"+c+"\\b","i").test(e))return!1;return d-1==b.length},addClass:function(a,c){if(a){c=this.trim(c).replace(/[ ]{2,}/g," ").split(" ");for(var d,e=0,f=a.className;d=c[e++];)new RegExp("\\b"+d+"\\b").test(f)||(f+=" "+d);a.className=b.trim(f)}},removeClass:function(a,b){b=this.isArray(b)?b:this.trim(b).replace(/[ ]{2,}/g," ").split(" ");for(var c,d=0,e=a.className;c=b[d++];)e=e.replace(new RegExp("\\b"+c+"\\b"),"");e=this.trim(e).replace(/[ ]{2,}/g," "),a.className=e,!e&&a.removeAttribute("className")},on:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.addEventListener)a.addEventListener(c,d,!1);else{d._d||(d._d={els:[]});var g=c+d.toString(),h=b.indexOf(d._d.els,a);d._d[g]&&h!=-1||(h==-1&&d._d.els.push(a),d._d[g]||(d._d[g]=function(a){return d.call(a.srcElement,a||window.event)}),a.attachEvent("on"+c,d._d[g]))}a=null},off:function(a,c,d){var e=this.isArray(c)?c:c.split(/\s+/),f=e.length;if(f)for(;f--;)if(c=e[f],a.removeEventListener)a.removeEventListener(c,d,!1);else{var g=c+d.toString();try{a.detachEvent("on"+c,d._d?d._d[g]:d)}catch(h){}if(d._d&&d._d[g]){var i=b.indexOf(d._d.els,a);i!=-1&&d._d.els.splice(i,1),0==d._d.els.length&&delete d._d[g]}}},loadFile:function(){function a(a,c){try{for(var d,e=0;d=b[e++];)if(d.doc===a&&d.url==(c.src||c.href))return d}catch(f){return null}}var b=[];return function(c,d,e){var f=a(c,d);if(f)return void(f.ready?e&&e():f.funs.push(e));if(b.push({doc:c,url:d.src||d.href,funs:[e]}),!c.body){var g=[];for(var h in d)"tag"!=h&&g.push(h+'="'+d[h]+'"');return void c.write("<"+d.tag+" "+g.join(" ")+" >")}if(!d.id||!c.getElementById(d.id)){var i=c.createElement(d.tag);delete d.tag;for(var h in d)i.setAttribute(h,d[h]);i.onload=i.onreadystatechange=function(){if(!this.readyState||/loaded|complete/.test(this.readyState)){if(f=a(c,d),f.funs.length>0){f.ready=1;for(var b;b=f.funs.pop();)b()}i.onload=i.onreadystatechange=null}},i.onerror=function(){throw Error("The load "+(d.href||d.src)+" fails,check the url")},c.getElementsByTagName("head")[0].appendChild(i)}}}()};b.each(["String","Function","Array","Number","RegExp","Object","Boolean"],function(a){b["is"+a]=function(b){return Object.prototype.toString.apply(b)=="[object "+a+"]"}});var c={};UE.parse={register:function(a,b){c[a]=b},load:function(a){b.each(c,function(c){c.call(a,b)})}},uParse=function(a,c){b.domReady(function(){var d;if(document.querySelectorAll)d=document.querySelectorAll(a);else if(/^#/.test(a))d=[document.getElementById(a.replace(/^#/,""))];else if(/^\./.test(a)){var d=[];b.each(document.getElementsByTagName("*"),function(b){b.className&&new RegExp("\\b"+a.replace(/^\./,"")+"\\b","i").test(b.className)&&d.push(b)})}else d=document.getElementsByTagName(a);b.each(d,function(d){UE.parse.load(b.extend({root:d,selector:a},c))})})}}(),UE.parse.register("insertcode",function(a){var b=this.root.getElementsByTagName("pre");if(b.length)if("undefined"==typeof XRegExp){var c,d;void 0!==this.rootPath?(c=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCore.js",d=a.removeLastbs(this.rootPath)+"/third-party/SyntaxHighlighter/shCoreDefault.css"):(c=this.highlightJsUrl,d=this.highlightCssUrl),a.loadFile(document,{id:"syntaxhighlighter_css",tag:"link",rel:"stylesheet",type:"text/css",href:d}),a.loadFile(document,{id:"syntaxhighlighter_js",src:c,tag:"script",type:"text/javascript",defer:"defer"},function(){a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})})}else a.each(b,function(a){a&&/brush/i.test(a.className)&&SyntaxHighlighter.highlight(a)})}),UE.parse.register("table",function(a){function b(b,c){var d,e=b;for(c=a.isArray(c)?c:[c];e;){for(d=0;d0){var g=a[c];a[c]=a[e],a[e]=g}return a}function e(b){if(!a.hasClass(b.rows[0],"firstRow")){for(var c=1;cemotion.css\">" + + "
            " + + "" + + "
            " + + "
            " + + "
            " + + "
            " + + "
            " + + "
            " + + "
            " + + "
            " + + "
            " + + "
            " + + "\" class=\'edui-emotion-JfaceReview edui-emotion-preview-img\'/>" + + "
            ", + + sourceData: { + emotion: { + tabNum:7, //切换面板数量 + SmilmgName:{ 'edui-emotion-Jtab0':['j_00', 84], 'edui-emotion-Jtab1':['t_00', 40], 'edui-emotion-Jtab2':['w_00', 52], 'edui-emotion-Jtab3':['B_00', 63], 'edui-emotion-Jtab4':['C_00', 20], 'edui-emotion-Jtab5':['i_f', 50], 'edui-emotion-Jtab6':['y_00', 40] }, //图片前缀名 + imageFolders:{ 'edui-emotion-Jtab0':'jx2/', 'edui-emotion-Jtab1':'tsj/', 'edui-emotion-Jtab2':'ldw/', 'edui-emotion-Jtab3':'bobo/', 'edui-emotion-Jtab4':'babycat/', 'edui-emotion-Jtab5':'face/', 'edui-emotion-Jtab6':'youa/'}, //图片对应文件夹路径 + imageCss:{'edui-emotion-Jtab0':'jd', 'edui-emotion-Jtab1':'tsj', 'edui-emotion-Jtab2':'ldw', 'edui-emotion-Jtab3':'bb', 'edui-emotion-Jtab4':'cat', 'edui-emotion-Jtab5':'pp', 'edui-emotion-Jtab6':'youa'}, //图片css类名 + imageCssOffset:{'edui-emotion-Jtab0':35, 'edui-emotion-Jtab1':35, 'edui-emotion-Jtab2':35, 'edui-emotion-Jtab3':35, 'edui-emotion-Jtab4':35, 'edui-emotion-Jtab5':25, 'edui-emotion-Jtab6':35}, //图片偏移 + SmileyInfor:{ + 'edui-emotion-Jtab0':['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '打酱油', '俯卧撑', '气愤', '?', '吻', '怒', '胜利', 'HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '微笑', '亲吻', '调皮', '惊恐', '耍酷', '发火', '害羞', '汗水', '大哭', '', '加油', '困', '你NB', '晕倒', '开心', '偷笑', '大哭', '滴汗', '叹气', '超赞', '??', '飞吻', '天使', '撒花', '生气', '被砸', '吓傻', '随意吐'], + 'edui-emotion-Jtab1':['Kiss', 'Love', 'Yeah', '啊!', '背扭', '顶', '抖胸', '88', '汗', '瞌睡', '鲁拉', '拍砖', '揉脸', '生日快乐', '摊手', '睡觉', '瘫坐', '无聊', '星星闪', '旋转', '也不行', '郁闷', '正Music', '抓墙', '撞墙至死', '歪头', '戳眼', '飘过', '互相拍砖', '砍死你', '扔桌子', '少林寺', '什么?', '转头', '我爱牛奶', '我踢', '摇晃', '晕厥', '在笼子里', '震荡'], + 'edui-emotion-Jtab2':['大笑', '瀑布汗~', '惊讶', '臭美', '傻笑', '抛媚眼', '发怒', '我错了', 'money', '气愤', '挑逗', '吻', '怒', '胜利', '委屈', '受伤', '说啥呢?', '闭嘴', '不', '逗你玩儿', '飞吻', '眩晕', '魔法', '我来了', '睡了', '我打', '闭嘴', '打', '打晕了', '刷牙', '爆揍', '炸弹', '倒立', '刮胡子', '邪恶的笑', '不要不要', '爱恋中', '放大仔细看', '偷窥', '超高兴', '晕', '松口气', '我跑', '享受', '修养', '哭', '汗', '啊~', '热烈欢迎', '打酱油', '俯卧撑', '?'], + 'edui-emotion-Jtab3':['HI', 'KISS', '不说', '不要', '扯花', '大心', '顶', '大惊', '飞吻', '鬼脸', '害羞', '口水', '狂哭', '来', '泪眼', '流泪', '生气', '吐舌', '喜欢', '旋转', '再见', '抓狂', '汗', '鄙视', '拜', '吐血', '嘘', '打人', '蹦跳', '变脸', '扯肉', '吃To', '吃花', '吹泡泡糖', '大变身', '飞天舞', '回眸', '可怜', '猛抽', '泡泡', '苹果', '亲', '', '骚舞', '烧香', '睡', '套娃娃', '捅捅', '舞倒', '西红柿', '爱慕', '摇', '摇摆', '杂耍', '招财', '被殴', '被球闷', '大惊', '理想', '欧打', '呕吐', '碎', '吐痰'], + 'edui-emotion-Jtab4':['发财了', '吃西瓜', '套牢', '害羞', '庆祝', '我来了', '敲打', '晕了', '胜利', '臭美', '被打了', '贪吃', '迎接', '酷', '顶', '幸运', '爱心', '躲', '送花', '选择'], + 'edui-emotion-Jtab5':['微笑', '亲吻', '调皮', '惊讶', '耍酷', '发火', '害羞', '汗水', '大哭', '得意', '鄙视', '困', '夸奖', '晕倒', '疑问', '媒婆', '狂吐', '青蛙', '发愁', '亲吻', '', '爱心', '心碎', '玫瑰', '礼物', '哭', '奸笑', '可爱', '得意', '呲牙', '暴汗', '楚楚可怜', '困', '哭', '生气', '惊讶', '口水', '彩虹', '夜空', '太阳', '钱钱', '灯泡', '咖啡', '蛋糕', '音乐', '爱', '胜利', '赞', '鄙视', 'OK'], + 'edui-emotion-Jtab6':['男兜', '女兜', '开心', '乖乖', '偷笑', '大笑', '抽泣', '大哭', '无奈', '滴汗', '叹气', '狂晕', '委屈', '超赞', '??', '疑问', '飞吻', '天使', '撒花', '生气', '被砸', '口水', '泪奔', '吓傻', '吐舌头', '点头', '随意吐', '旋转', '困困', '鄙视', '狂顶', '篮球', '再见', '欢迎光临', '恭喜发财', '稍等', '我在线', '恕不议价', '库房有货', '货在路上'] + } + } + }, + initContent:function( _editor, $widget ){ + + var me = this, + emotion = me.sourceData.emotion, + lang = _editor.getLang( 'emotion' )['static'], + emotionUrl = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/emotion/', + options = $.extend( {}, lang, { + emotion_url: emotionUrl + }), + $root = me.root(); + + if( me.inited ) { + me.preventDefault(); + this.switchToFirst(); + return; + } + + me.inited = true; + + editor = _editor; + this.widget = $widget; + + emotion.SmileyPath = _editor.options.emotionLocalization === true ? emotionUrl + 'images/' : "http://img.baidu.com/hi/"; + emotion.SmileyBox = me.createTabList( emotion.tabNum ); + emotion.tabExist = me.createArr( emotion.tabNum ); + + options['cover_img'] = emotion.SmileyPath + (editor.options.emotionLocalization ? '0.gif' : 'default/0.gif'); + + $root.html( $.parseTmpl( me.tpl, options ) ); + + me.tabs = $.eduitab({selector:".edui-emotion-tab-Jpanel"}); + + //缓存预览对象 + me.previewBox = $root.find(".edui-emotion-JtabIconReview"); + me.previewImg = $root.find(".edui-emotion-JfaceReview"); + + me.initImgName(); + + }, + initEvent:function(){ + + var me = this; + + //防止点击过后关闭popup + me.root().on('click', function(e){ + return false; + }); + + //移动预览 + me.root().delegate( 'td', 'mouseover mouseout', function( evt ){ + + var $td = $( this), + url = $td.attr('data-surl') || null; + + if( url ) { + me[evt.type]( this, url , $td.attr('data-posflag') ); + } + + return false; + + } ); + + //点击选中 + me.root().delegate( 'td', 'click', function( evt ){ + + var $td = $( this), + realUrl = $td.attr('data-realurl') || null; + + if( realUrl ) { + me.insertSmiley( realUrl.replace( /'/g, "\\'" ), evt ); + } + + return false; + + } ); + + //更新模板 + me.tabs.edui().on("beforeshow", function( evt ){ + + var contentId = $(evt.target).attr('data-context').replace( /^.*\.(?=[^\s]*$)/, '' ); + + evt.stopPropagation(); + + me.updateTab( contentId ); + + }); + + this.switchToFirst(); + + }, + initImgName: function() { + + var emotion = this.sourceData.emotion; + + for ( var pro in emotion.SmilmgName ) { + var tempName = emotion.SmilmgName[pro], + tempBox = emotion.SmileyBox[pro], + tempStr = ""; + + if ( tempBox.length ) return; + + for ( var i = 1; i <= tempName[1]; i++ ) { + tempStr = tempName[0]; + if ( i < 10 ) tempStr = tempStr + '0'; + tempStr = tempStr + i + '.gif'; + tempBox.push( tempStr ); + } + } + + }, + /** + * 切换到第一个tab + */ + switchToFirst: function(){ + this.root().find(".edui-emotion-Jtabnav .edui-tab-text:first").trigger('click'); + }, + updateTab: function( contentBoxId ) { + + var me = this, + emotion = me.sourceData.emotion; + + me.autoHeight( contentBoxId ); + + if ( !emotion.tabExist[ contentBoxId ] ) { + + emotion.tabExist[ contentBoxId ] = true; + me.createTab( contentBoxId ); + + } + + }, + autoHeight: function( ) { + this.widget.height(this.root() + 2); + }, + createTabList: function( tabNum ) { + var obj = {}; + for ( var i = 0; i < tabNum; i++ ) { + obj["edui-emotion-Jtab" + i] = []; + } + return obj; + }, + mouseover: function( td, srcPath, posFlag ) { + + posFlag -= 0; + + $(td).css( 'backgroundColor', '#ACCD3C' ); + + this.previewImg.css( "backgroundImage", "url(" + srcPath + ")" ); + posFlag && this.previewBox.addClass('edui-emotion-preview-left'); + this.previewBox.show(); + + }, + mouseout: function( td ) { + $(td).css( 'backgroundColor', 'transparent' ); + this.previewBox.removeClass('edui-emotion-preview-left').hide(); + }, + insertSmiley: function( url, evt ) { + var obj = { + src: url + }; + obj._src = obj.src; + editor.execCommand( 'insertimage', obj ); + if ( !evt.ctrlKey ) { + //关闭预览 + this.previewBox.removeClass('edui-emotion-preview-left').hide(); + this.widget.edui().hide(); + } + }, + createTab: function( contentBoxId ) { + + var faceVersion = "?v=1.1", //版本号 + me = this, + $contentBox = this.root().find("."+contentBoxId), + emotion = me.sourceData.emotion, + imagePath = emotion.SmileyPath + emotion.imageFolders[ contentBoxId ], //获取显示表情和预览表情的路径 + positionLine = 11 / 2, //中间数 + iWidth = iHeight = 35, //图片长宽 + iColWidth = 3, //表格剩余空间的显示比例 + tableCss = emotion.imageCss[ contentBoxId ], + cssOffset = emotion.imageCssOffset[ contentBoxId ], + textHTML = [''], + i = 0, imgNum = emotion.SmileyBox[ contentBoxId ].length, imgColNum = 11, faceImage, + sUrl, realUrl, posflag, offset, infor; + + for ( ; i < imgNum; ) { + textHTML.push( '' ); + for ( var j = 0; j < imgColNum; j++, i++ ) { + faceImage = emotion.SmileyBox[ contentBoxId ][i]; + if ( faceImage ) { + sUrl = imagePath + faceImage + faceVersion; + realUrl = imagePath + faceImage; + posflag = j < positionLine ? 0 : 1; + offset = cssOffset * i * (-1) - 1; + infor = emotion.SmileyInfor[ contentBoxId ][i]; + + textHTML.push( '' ); + } + textHTML.push( '' ); + } + textHTML.push( '
            ' ); + textHTML.push( '' ); + textHTML.push( '' ); + textHTML.push( '' ); + } else { + textHTML.push( '' ); + } + textHTML.push( '
            ' ); + textHTML = textHTML.join( "" ); + $contentBox.html( textHTML ); + }, + createArr: function( tabNum ) { + var arr = []; + for ( var i = 0; i < tabNum; i++ ) { + arr[i] = 0; + } + return arr; + }, + width:603, + height:400 + }); + +})(); + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/0.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/0.gif new file mode 100644 index 0000000..6964168 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/0.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/bface.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/bface.gif new file mode 100644 index 0000000..14fe618 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/bface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/cface.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/cface.gif new file mode 100644 index 0000000..bff947f Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/cface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/fface.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/fface.gif new file mode 100644 index 0000000..0d8a6af Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/fface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/jxface2.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/jxface2.gif new file mode 100644 index 0000000..a959c90 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/jxface2.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/neweditor-tab-bg.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/neweditor-tab-bg.png new file mode 100644 index 0000000..8f398b0 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/neweditor-tab-bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/tface.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/tface.gif new file mode 100644 index 0000000..1354f54 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/tface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/wface.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/wface.gif new file mode 100644 index 0000000..5667160 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/wface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/yface.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/yface.gif new file mode 100644 index 0000000..51608be Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/emotion/images/yface.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.css b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.css new file mode 100644 index 0000000..45d4865 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.css @@ -0,0 +1,32 @@ +.edui-popup-formula .edui-formula-wrapper { + padding: 15px; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-nav{ + height: auto; + *height: 31px; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-text { + font-size: 12px; +} +.edui-popup-formula .edui-formula-wrapper .edui-formula-clearboth { + clear: both; + width: 0; + height: 0; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-pane ul { + margin: 0px; + padding: 0px; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-content { + padding: 5px 0px 0px 0px; +} +.edui-popup-formula .edui-formula-wrapper .edui-tab-pane .edui-formula-latex-item { + display: block; + float: left; + margin: 0px 3px 3px 0px; + width: 30px; + height: 30px; + border:1px solid #cccccc; + background-image: url("images/formula.png"); + cursor: pointer; +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.html b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.html new file mode 100644 index 0000000..1271211 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.html @@ -0,0 +1,212 @@ + + + + + Document + + + + + +
            +
            +
            + +
            + +
            + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.js b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.js new file mode 100644 index 0000000..ffa9e78 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/formula.js @@ -0,0 +1,124 @@ +(function () { + + var editor = null; + + UM.registerWidget('formula', { + + tpl: "formula.css\">" + + "
            " + + "
              " + + "
              " + + "
              ", + + sourceData: { + formula: { + 'common': [ + "{/}frac{ }{ }", "^{ }/_{ }", "x^{ }", "x_{ }", "x^{ }_{ }", "{/}bar{ }", "{/}sqrt{ }", "{/}nthroot{ }{ }", + "{/}sum^{ }_{n=}", "{/}sum", "{/}log_{ }", "{/}ln", "{/}int_{ }^{ }", "{/}oint_{ }^{ }" + ], + 'symbol': [ + "+", "-", "{/}pm", "{/}times", "{/}ast", "{/}div", "/", "{/}bigtriangleup", + "=", "{/}ne", "{/}approx", ">", "<", "{/}ge", "{/}le", "{/}infty", + "{/}cap", "{/}cup", "{/}because", "{/}therefore", "{/}subset", "{/}supset", "{/}subseteq", "{/}supseteq", + "{/}nsubseteq", "{/}nsupseteq", "{/}in", "{/}ni", "{/}notin", "{/}mapsto", "{/}leftarrow", "{/}rightarrow", + "{/}Leftarrow", "{/}Rightarrow", "{/}leftrightarrow", "{/}Leftrightarrow" + ], + 'letter': [ + "{/}alpha", "{/}beta", "{/}gamma", "{/}delta", "{/}varepsilon", "{/}varphi", "{/}lambda", "{/}mu", + "{/}rho", "{/}sigma", "{/}omega", "{/}Gamma", "{/}Delta", "{/}Theta", "{/}Lambda", "{/}Xi", + "{/}Pi", "{/}Sigma", "{/}Upsilon", "{/}Phi", "{/}Psi", "{/}Omega" + ] + } + }, + initContent: function (_editor, $widget) { + + var me = this, + formula = me.sourceData.formula, + lang = _editor.getLang('formula').static, + formulaUrl = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/formula/', + options = $.extend({}, lang, { 'formula_url': formulaUrl }), + $root = me.root(); + + if (me.inited) { + me.preventDefault(); + return; + } + me.inited = true; + + editor = _editor; + me.$widget = $widget; + + $root.html($.parseTmpl(me.tpl, options)); + me.tabs = $.eduitab({selector: "#edui-formula-tab-Jpanel"}); + + /* 初始化popup的内容 */ + var headHtml = [], xMax = 0, yMax = 0, + $tabContent = me.root().find('.edui-tab-content'); + $.each(formula, function (k, v) { + var contentHtml = []; + $.each(v, function (i, f) { + contentHtml.push('
            • '); + if (++xMax >=8) { + ++yMax; xMax = 0; + } + }); + yMax++; xMax = 0; + $tabContent.append('
                ' + contentHtml.join('') + '
              '); + headHtml.push('
            • ' + lang['lang_tab_' + k] + '
            • '); + }); + headHtml.push('
            • '); + $root.find('.edui-tab-nav').html(headHtml.join('')); + $root.find('.edui-tab-content').append('
              '); + + /* 选中第一个tab */ + me.switchTab(0); + }, + initEvent: function () { + var me = this; + + //防止点击过后关闭popup + me.root().on('click', function (e) { + return false; + }); + + //点击tab切换菜单 + me.root().find('.edui-tab-nav').delegate('.edui-tab-item', 'click', function (evt) { + me.switchTab(this); + return false; + }); + + //点击选中公式 + me.root().find('.edui-tab-pane').delegate('.edui-formula-latex-item', 'click', function (evt) { + var $item = $(this), + latex = $item.attr('data-latex') || ''; + + if (latex) { + me.insertLatex(latex.replace("{/}", "\\")); + } + me.$widget.edui().hide(); + return false; + }); + }, + switchTab:function(index){ + var me = this, + $root = me.root(), + index = $.isNumeric(index) ? index:$.inArray(index, $root.find('.edui-tab-nav .edui-tab-item')); + + $root.find('.edui-tab-nav .edui-tab-item').removeClass('edui-active').eq(index).addClass('edui-active'); + $root.find('.edui-tab-content .edui-tab-pane').removeClass('edui-active').eq(index).addClass('edui-active'); + + /* 自动长高 */ + me.autoHeight(0); + }, + autoHeight: function () { + this.$widget.height(this.root() + 2); + }, + insertLatex: function (latex) { + editor.execCommand('formula', latex ); + }, + width: 350, + height: 400 + }); + +})(); + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/images/formula.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/images/formula.png new file mode 100644 index 0000000..04cbb3b Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/formula/images/formula.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/image.css b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/image.css new file mode 100644 index 0000000..5548391 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/image.css @@ -0,0 +1,42 @@ +.edui-dialog-image .edui-image-wrapper{font-size: 12px;margin: 15px;} + +/*upload*/ +.edui-dialog-image .edui-image-upload1{position: absolute;top:50%;left:50%;width:44px;height:38px;margin-top:-19px; margin-left: -22px;} +.edui-dialog-image .edui-image-upload2{position:relative;float:left;width:120px;height:120px;margin:5px 0 0 5px;} + +.edui-dialog-image .edui-image-form{position: absolute;left: 0px;top: 0px;width: 100%;height: 100%;opacity: 0;cursor: pointer;} +.edui-dialog-image .edui-image-form .edui-image-file{width: 100%;height:100%;filter: alpha(opacity=0)} + +.edui-dialog-image .edui-image-upload1 .edui-image-icon{display: inline-block;width:44px;height:38px;background-image: url('images/upload1.png')} +.edui-dialog-image .edui-image-upload1 .edui-image-icon.hover{background-position: -50px 0;} +.edui-dialog-image .edui-image-upload2 .edui-image-icon{display: inline-block;width:120px;height:120px;background-image: url('images/upload2.png')} + +.edui-dialog-image .edui-image-dragTip{position: absolute;display:none;top:50%;left:50%;margin-top:30px;margin-left: -60px; + color: #222;font-size:14px;text-shadow: 0px 2px 3px #555;} + +.edui-dialog-image .edui-image-content{height:330px;width:100%;position: relative;} + +.edui-dialog-image .edui-image-mask{display: none;position: absolute;top:0;left:0;width: 100%; height: 100%;background-color:#fff; + text-align: center;line-height:300px;color:#000;font-size:14px;font-weight:bold;opacity: 0.6;filter: alpha(opacity=60);} +.edui-dialog-image .edui-image-mask.edui-active{display: block;} + +/*network*/ +.edui-dialog-image .edui-image-searchBar{margin: 10px;} +.edui-dialog-image .edui-image-searchBar .edui-image-searchTxt{display: inline-block !important;*display: inline !important;*zoom:1;width:400px; border: 1px solid #c5d2ff; height: 20px; line-height: 18px; font-size: 14px; padding: 3px; margin: 0;outline:0;} +.edui-dialog-image .edui-image-searchBar .edui-image-searchAdd{display: inline-block !important;*display: inline !important;*zoom:1; + width:60px; text-align:center;height: 25px;text-align: center;line-height: 25px; + background-color: #ffffff;padding: 0; border: 1px solid #ababab;margin-left: 20px;cursor: pointer; +} +.edui-dialog-image .edui-image-searchBar .edui-image-searchAdd.hover{ + background-color: #d5e1f2; + padding: 0; + border: 1px solid #a3bde3; +} +.edui-dialog-image .edui-image-searchRes{height:280px;overflow:auto;} + + +/*common*/ +.edui-dialog-image .edui-image-item{position:relative;float:left;width:120px;height:120px;border: 1px solid #CCC;cursor: default;margin: 5px 0 0 5px;} +.edui-dialog-image .edui-image-item .edui-image-pic{position: absolute;left:-9999px;} +.edui-dialog-image .edui-image-item .edui-image-close{position:absolute;right:0;background: url('images/close.png');width:17px;height:17px;cursor:pointer;z-index:1} +.edui-dialog-image .edui-image-item.hover .edui-image-close{display: block;} diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/image.js b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/image.js new file mode 100644 index 0000000..b6222df --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/image.js @@ -0,0 +1,445 @@ +(function () { + + var utils = UM.utils, + browser = UM.browser, + Base = { + checkURL: function (url) { + if(!url) return false; + url = utils.trim(url); + if (url.length <= 0) { + return false; + } + if (url.search(/http:\/\/|https:\/\//) !== 0) { + url += 'http://'; + } + + url=url.replace(/\?[\s\S]*$/,""); + + if (!/(.gif|.jpg|.jpeg|.png)$/i.test(url)) { + return false; + } + return url; + }, + getAllPic: function (sel, $w, editor) { + var me = this, + arr = [], + $imgs = $(sel, $w); + + $.each($imgs, function (index, node) { + $(node).removeAttr("width").removeAttr("height"); + +// if (node.width > editor.options.initialFrameWidth) { +// me.scale(node, editor.options.initialFrameWidth - +// parseInt($(editor.body).css("padding-left")) - +// parseInt($(editor.body).css("padding-right"))); +// } + + return arr.push({ + _src: node.src, + src: node.src + }); + }); + + return arr; + }, + scale: function (img, max, oWidth, oHeight) { + var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight; + if (ow > max || oh > max) { + if (ow >= oh) { + if (width = ow - max) { + percent = (width / ow).toFixed(2); + img.height = oh - oh * percent; + img.width = max; + } + } else { + if (height = oh - max) { + percent = (height / oh).toFixed(2); + img.width = ow - ow * percent; + img.height = max; + } + } + } + + return this; + }, + close: function ($img) { + + $img.css({ + top: ($img.parent().height() - $img.height()) / 2, + left: ($img.parent().width()-$img.width())/2 + }).prev().on("click",function () { + + if ( $(this).parent().remove().hasClass("edui-image-upload-item") ) { + //显示图片计数-1 + Upload.showCount--; + Upload.updateView(); + } + + }); + + return this; + }, + createImgBase64: function (img, file, $w) { + if (browser.webkit) { + //Chrome8+ + img.src = window.webkitURL.createObjectURL(file); + } else if (browser.gecko) { + //FF4+ + img.src = window.URL.createObjectURL(file); + } else { + //实例化file reader对象 + var reader = new FileReader(); + reader.onload = function (e) { + img.src = this.result; + $w.append(img); + }; + reader.readAsDataURL(file); + } + }, + callback: function (editor, $w, url, state) { + + if (state == "SUCCESS") { + //显示图片计数+1 + Upload.showCount++; + var $img = $(""), + $item = $("
              ").append($img); + + if ($(".edui-image-upload2", $w).length < 1) { + $(".edui-image-content", $w).append($item); + + Upload.render(".edui-image-content", 2) + .config(".edui-image-upload2"); + } else { + $(".edui-image-upload2", $w).before($item).show(); + } + + $img.on("load", function () { + Base.scale(this, 120); + Base.close($(this)); + $(".edui-image-content", $w).focus(); + }); + + } else { + currentDialog.showTip( state ); + window.setTimeout( function () { + + currentDialog.hideTip(); + + }, 3000 ); + } + + Upload.toggleMask(); + + } + }; + + /* + * 本地上传 + * */ + var Upload = { + showCount: 0, + uploadTpl: '
              ' + + '' + + '
              ' + + '' + + '
              ' + + + '
              ', + init: function (editor, $w) { + var me = this; + + me.editor = editor; + me.dialog = $w; + me.render(".edui-image-local", 1); + me.config(".edui-image-upload1"); + me.submit(); + me.drag(); + + $(".edui-image-upload1").hover(function () { + $(".edui-image-icon", this).toggleClass("hover"); + }); + + if (!(UM.browser.ie && UM.browser.version <= 9)) { + $(".edui-image-dragTip", me.dialog).css("display", "block"); + } + + + return me; + }, + render: function (sel, t) { + var me = this; + + $(sel, me.dialog).append($(me.uploadTpl.replace(/%%/g, t))); + + return me; + }, + config: function (sel) { + var me = this, + url=me.editor.options.imageUrl; + + url=url + (url.indexOf("?") == -1 ? "?" : "&") + "editorid="+me.editor.id;//初始form提交地址; + + $("form", $(sel, me.dialog)).attr("action", url); + + return me; + }, + uploadComplete: function(r){ + var me = this; + try{ + var json = eval('('+r+')'); + Base.callback(me.editor, me.dialog, json.url, json.state); + }catch (e){ + var lang = me.editor.getLang('image'); + Base.callback(me.editor, me.dialog, '', (lang && lang.uploadError) || 'Error!'); + } + }, + submit: function (callback) { + + var me = this, + input = $( ''), + input = input[0]; + + $(me.dialog).delegate( ".edui-image-file", "change", function ( e ) { + + if ( !this.parentNode ) { + return; + } + + $('').insertBefore(me.dialog).on('load', function(){ + var r = this.contentWindow.document.body.innerHTML; + if(r == '')return; + me.uploadComplete(r); + $(this).unbind('load'); + $(this).remove(); + + }); + + $(this).parent()[0].submit(); + Upload.updateInput( input ); + me.toggleMask("Loading...."); + callback && callback(); + + }); + + return me; + }, + //更新input + updateInput: function ( inputField ) { + + $( ".edui-image-file", this.dialog ).each( function ( index, ele ) { + + ele.parentNode.replaceChild( inputField.cloneNode( true ), ele ); + + } ); + + }, + //更新上传框 + updateView: function () { + + if ( Upload.showCount !== 0 ) { + return; + } + + $(".edui-image-upload2", this.dialog).hide(); + $(".edui-image-dragTip", this.dialog).show(); + $(".edui-image-upload1", this.dialog).show(); + + }, + drag: function () { + var me = this; + //做拽上传的支持 + if (!UM.browser.ie9below) { + me.dialog.find('.edui-image-content').on('drop',function (e) { + + //获取文件列表 + var fileList = e.originalEvent.dataTransfer.files; + var img = document.createElement('img'); + var hasImg = false; + $.each(fileList, function (i, f) { + if (/^image/.test(f.type)) { + //创建图片的base64 + Base.createImgBase64(img, f, me.dialog); + + var xhr = new XMLHttpRequest(); + xhr.open("post", me.editor.getOpt('imageUrl') + "?type=ajax", true); + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + //模拟数据 + var fd = new FormData(); + fd.append(me.editor.getOpt('imageFieldName'), f); + + xhr.send(fd); + xhr.addEventListener('load', function (e) { + var r = e.target.response, json; + me.uploadComplete(r); + if (i == fileList.length - 1) { + $(img).remove() + } + }); + hasImg = true; + } + }); + if (hasImg) { + e.preventDefault(); + me.toggleMask("Loading...."); + } + + }).on('dragover', function (e) { + e.preventDefault(); + }); + } + }, + toggleMask: function (html) { + var me = this; + + var $mask = $(".edui-image-mask", me.dialog); + if (html) { + if (!(UM.browser.ie && UM.browser.version <= 9)) { + $(".edui-image-dragTip", me.dialog).css( "display", "none" ); + } + $(".edui-image-upload1", me.dialog).css( "display", "none" ); + $mask.addClass("edui-active").html(html); + } else { + + $mask.removeClass("edui-active").html(); + + if ( Upload.showCount > 0 ) { + return me; + } + + if (!(UM.browser.ie && UM.browser.version <= 9) ){ + $(".edui-image-dragTip", me.dialog).css("display", "block"); + } + $(".edui-image-upload1", me.dialog).css( "display", "block" ); + } + + return me; + } + }; + + /* + * 网络图片 + * */ + var NetWork = { + init: function (editor, $w) { + var me = this; + + me.editor = editor; + me.dialog = $w; + + me.initEvt(); + }, + initEvt: function () { + var me = this, + url, + $ele = $(".edui-image-searchTxt", me.dialog); + + $(".edui-image-searchAdd", me.dialog).on("click", function () { + url = Base.checkURL($ele.val()); + + if (url) { + + $("").on("load", function () { + + + + var $item = $("
              ").append(this); + + $(".edui-image-searchRes", me.dialog).append($item); + + Base.scale(this, 120); + + $item.width($(this).width()); + + Base.close($(this)); + + $ele.val(""); + }); + } + }) + .hover(function () { + $(this).toggleClass("hover"); + }); + } + }; + + var $tab = null, + currentDialog = null; + + UM.registerWidget('image', { + tpl: "image.css\">" + + "
              " + + "" + + "
              " + + "
              " + + "
              " + + "
              " + + "
              <%=lang_input_dragTip%>
              " + + "
              " + + "
              " + + "
              " + + "" + + "
              <%=lang_btn_add%>
              " + + "
              " + + "
              " + + "
              " + + "
              " + + "
              ", + initContent: function (editor, $dialog) { + var lang = editor.getLang('image')["static"], + opt = $.extend({}, lang, { + image_url: UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/image/' + }); + + Upload.showCount = 0; + + if (lang) { + var html = $.parseTmpl(this.tpl, opt); + } + + currentDialog = $dialog.edui(); + + this.root().html(html); + + }, + initEvent: function (editor, $w) { + $tab = $.eduitab({selector: ".edui-image-wrapper"}) + .edui().on("beforeshow", function (e) { + e.stopPropagation(); + }); + + Upload.init(editor, $w); + + NetWork.init(editor, $w); + }, + buttons: { + 'ok': { + exec: function (editor, $w) { + var sel = "", + index = $tab.activate(); + + if (index == 0) { + sel = ".edui-image-content .edui-image-pic"; + } else if (index == 1) { + sel = ".edui-image-searchRes .edui-image-pic"; + } + + var list = Base.getAllPic(sel, $w, editor); + + if (index != -1) { + editor.execCommand('insertimage', list); + } + } + }, + 'cancel': {} + }, + width: 700, + height: 408 + }, function (editor, $w, url, state) { + Base.callback(editor, $w, url, state) + }) +})(); + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/close.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/close.png new file mode 100644 index 0000000..d368388 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/close.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/upload1.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/upload1.png new file mode 100644 index 0000000..c9056ca Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/upload1.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/upload2.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/upload2.png new file mode 100644 index 0000000..57ce63f Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/image/images/upload2.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/link/link.js b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/link/link.js new file mode 100644 index 0000000..fd10afb --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/link/link.js @@ -0,0 +1,73 @@ +(function(){ + var utils = UM.utils; + function hrefStartWith(href, arr) { + href = href.replace(/^\s+|\s+$/g, ''); + for (var i = 0, ai; ai = arr[i++];) { + if (href.indexOf(ai) == 0) { + return true; + } + } + return false; + } + + UM.registerWidget('link', { + tpl: "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + +// "" + +// "" + +// "" + + "", + initContent: function (editor) { + var lang = editor.getLang('link'); + if (lang) { + var html = $.parseTmpl(this.tpl, lang.static); + } + this.root().html(html); + }, + initEvent: function (editor, $w) { + var link = editor.queryCommandValue('link'); + if(link){ + $('#edui-link-Jhref',$w).val(utils.html($(link).attr('href'))); + $('#edui-link-Jtitle',$w).val($(link).attr('title')); + $(link).attr('target') == '_blank' && $('#edui-link-Jtarget').attr('checked',true) + } + $('#edui-link-Jhref',$w).focus(); + }, + buttons: { + 'ok': { + exec: function (editor, $w) { + var href = $('#edui-link-Jhref').val().replace(/^\s+|\s+$/g, ''); + + if (href) { + editor.execCommand('link', { + 'href': href, + 'target': $("#edui-link-Jtarget:checked").length ? "_blank" : '_self', + 'title': $("#edui-link-Jtitle").val().replace(/^\s+|\s+$/g, ''), + '_href': href + }); + } + } + }, + 'cancel':{} + }, + width: 400 + }) +})(); + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/map/map.html b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/map/map.html new file mode 100644 index 0000000..be97a8c --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/map/map.html @@ -0,0 +1,148 @@ + + + + + + + 百度地图API自定义地图 + + + + + + + +
              + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/map/map.js b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/map/map.js new file mode 100644 index 0000000..6f898c4 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/map/map.js @@ -0,0 +1,263 @@ +(function () { + + var widgetName = 'map'; + + UM.registerWidget(widgetName, { + + tpl: "" + + "
              " + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""+ + "" + + "
              <%=lang_city%>:\"/><%=lang_address%>:<%=lang_search%>
              " + + "
              " + + "
              " + + "", + initContent: function (editor, $widget) { + + var me = this, + lang = editor.getLang(widgetName), + theme_url = editor.options.themePath + editor.options.theme; + + if( me.inited ) { + me.preventDefault(); + return false; + } + + me.inited = true; + + me.lang = lang; + me.editor = editor; + + me.root().html($.parseTmpl(me.tpl, $.extend({}, lang['static'], { + 'theme_url': theme_url + }))); + + me.initRequestApi(); + + }, + /** + * 初始化请求API + */ + initRequestApi: function () { + + var $ifr = null; + + //已经初始化过, 不用再次初始化 + if (window.BMap && window.BMap.Map) { + this.initBaiduMap(); + } else { + + $ifr = $(''); + $ifr.appendTo( this.root() ); + + $ifr = $ifr[ 0 ].contentWindow.document; + + $ifr.open(); + $ifr.write( this.root().find(".edui-tpl-container").html().replace( /scr_ipt/g, 'script').replace('<>',"'" + this.editor.id + "'") ); + + } + + }, + requestMapApi: function (src) { + + var me = this; + + if (src.length) { + + var _src = src[0]; + + src = src.slice(1); + + if (_src) { + $.getScript(_src, function () { + me.requestMapApi(src); + }); + } else { + me.requestMapApi(src); + } + + } else { + + me.initBaiduMap(); + + } + + + }, + initBaiduMap: function () { + + var $root = this.root(), + map = new BMap.Map($root.find(".edui-map-container")[0]), + me = this, + marker, + point, + imgcss, + img = $(me.editor.selection.getRange().getClosedNode()); + + map.enableInertialDragging(); + map.enableScrollWheelZoom(); + map.enableContinuousZoom(); + + if (img.length && /api[.]map[.]baidu[.]com/ig.test(img.attr("src"))) { + var url = img.attr("src"), + centerPos = me.getPars(url, "center").split(","), + markerPos = me.getPars(url, "markers").split(","); + point = new BMap.Point(Number(centerPos[0]), Number(centerPos[1])); + marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1]))); + map.addControl(new BMap.NavigationControl()); + map.centerAndZoom(point, Number(me.getPars(url, "zoom"))); + imgcss = img.attr('style'); + } else { + point = new BMap.Point(116.404, 39.915); // 创建点坐标 + marker = new BMap.Marker(point); + map.addControl(new BMap.NavigationControl()); + map.centerAndZoom(point, 10); // 初始化地图,设置中心点坐标和地图级别。 + } + marker.enableDragging(); + map.addOverlay(marker); + + me.map = map; + me.marker = marker; + me.imgcss = imgcss; + }, + doSearch: function () { + var me = this, + city = me.root().find('.edui-map-city').val(), + address = me.root().find('.edui-map-address').val(); + + if (!city) { + alert(me.lang.cityMsg); + return; + } + var search = new BMap.LocalSearch(city, { + onSearchComplete: function (results) { + if (results && results.getNumPois()) { + var points = []; + for (var i = 0; i < results.getCurrentNumPois(); i++) { + points.push(results.getPoi(i).point); + } + if (points.length > 1) { + me.map.setViewport(points); + } else { + me.map.centerAndZoom(points[0], 13); + } + point = me.map.getCenter(); + me.marker.setPoint(point); + } else { + alert(me.lang.errorMsg); + } + } + }); + search.search(address || city); + }, + getPars: function (str, par) { + var reg = new RegExp(par + "=((\\d+|[.,])*)", "g"); + return reg.exec(str)[1]; + }, + reset: function(){ + this.map && this.map.reset(); + }, + initEvent: function () { + var me = this, + $root = me.root(); + + $root.find('.edui-map-address').on('keydown', function (evt) { + evt = evt || event; + if (evt.keyCode == 13) { + me.doSearch(); + return false; + } + }); + + $root.find(".edui-map-button").on('click', function (evt) { + me.doSearch(); + }); + + $root.find(".edui-map-address").focus(); + + $root.on( "mousewheel DOMMouseScroll", function ( e ) { + return false; + } ); + + }, + width: 580, + height: 408, + buttons: { + ok: { + exec: function (editor) { + var widget = editor.getWidgetData(widgetName), + center = widget.map.getCenter(), + zoom = widget.map.getZoom(), + size = widget.map.getSize(), + point = widget.marker.P; + + if (widget.root().find(".edui-map-dynamic")[0].checked) { + var URL = editor.getOpt('UMEDITOR_HOME_URL'), + url = [URL + (/\/$/.test(URL) ? '':'/') + "dialogs/map/map.html" + + '#center=' + center.lng + ',' + center.lat, + '&zoom=' + zoom, + '&width=' + size.width, + '&height=' + size.height, + '&markers=' + point.lng + ',' + point.lat].join(''); + editor.execCommand('inserthtml', ''); + } else { + url = "http://api.map.baidu.com/staticimage?center=" + center.lng + ',' + center.lat + + "&zoom=" + zoom + "&width=" + size.width + '&height=' + size.height + "&markers=" + point.lng + ',' + point.lat; + editor.execCommand('inserthtml', '', true); + } + + widget.reset(); + } + }, + cancel: { + exec: function(editor){ + editor.getWidgetData(widgetName).reset(); + } + } + } + }); + +})(); + diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/center_focus.jpg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/center_focus.jpg new file mode 100644 index 0000000..262b029 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/center_focus.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/left_focus.jpg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/left_focus.jpg new file mode 100644 index 0000000..7886d27 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/left_focus.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/none_focus.jpg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/none_focus.jpg new file mode 100644 index 0000000..7c768dc Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/none_focus.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/right_focus.jpg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/right_focus.jpg new file mode 100644 index 0000000..173e10d Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/images/right_focus.jpg differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/video.css b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/video.css new file mode 100644 index 0000000..e046d8c --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/video.css @@ -0,0 +1,59 @@ +@charset "utf-8"; +.edui-dialog-video .edui-video-wrapper{ width: 570px;_width:575px;margin: 10px auto; zoom:1;position: relative} +.edui-dialog-video .edui-video-tabbody{height:335px;} +.edui-dialog-video .edui-video-panel { position: absolute;width:100%; height:100%;background: #fff;} +.edui-dialog-video .edui-video-panel table td{vertical-align: middle;} +.edui-dialog-video #eduiVideoUrl { + width: 470px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +.edui-dialog-video #eduiVideoSearchTxt{margin-left:15px;background: #FFF;width:200px;height:21px;line-height:21px;border: 1px solid #d7d7d7;} +.edui-dialog-video #searchList{width: 570px;overflow: auto;zoom:1;height: 270px;} +.edui-dialog-video #searchList div{float: left;width: 120px;height: 135px;margin: 5px 15px;} +.edui-dialog-video #searchList img{margin: 2px 8px;cursor: pointer;border: 2px solid #fff} /*不用缩略图*/ +.edui-dialog-video #searchList p{margin-left: 10px;} +.edui-dialog-video #eduiVideoType{ + width: 65px; + height: 23px; + line-height: 22px; + border: 1px solid #d7d7d7; +} +.edui-dialog-video #eduiVideoSearchBtn,.edui-dialog-video #eduiVideoSearchReset{ + /*width: 80px;*/ + height: 25px; + line-height: 25px; + background: #eee; + border: 1px solid #d7d7d7; + cursor: pointer; + padding: 0 5px; +} + + + +.edui-dialog-video #eduiVideoPreview{width: 420px; margin-left: 10px; _margin-left:5px; height: 280px;background-color: #ddd;float: left} +.edui-dialog-video #eduiVideoInfo {width: 120px;float: left;margin-left: 10px;_margin-left:7px;} +.edui-dialog-video .edui-video-wrapper fieldset{ + border: 1px solid #ddd; + padding-left: 5px; + margin-bottom: 20px; + padding-bottom: 5px; + width: 115px; +} +.edui-dialog-video .edui-video-wrapper fieldset legend{font-weight: bold;} +.edui-dialog-video .edui-video-wrapper fieldset p{line-height: 30px;} +.edui-dialog-video .edui-video-wrapper fieldset input.edui-video-txt{ + width: 65px; + height: 21px; + line-height: 21px; + margin: 8px 5px; + background: #FFF; + border: 1px solid #d7d7d7; +} +.edui-dialog-video .edui-video-wrapper label.edui-video-url{font-weight: bold;margin-left: 5px;color: #06c;} +.edui-dialog-video #eduiVideoFloat div{cursor:pointer;opacity: 0.5;filter: alpha(opacity = 50);margin:9px;_margin:5px;width:38px;height:36px;float:left;} +.edui-dialog-video #eduiVideoFloat .edui-video-focus{opacity: 1;filter: alpha(opacity = 100)} +.edui-dialog-video .edui-video-wrapper span.edui-video-view{display: inline-block;width: 30px;float: right;cursor: pointer;color: blue} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/video.js b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/video.js new file mode 100644 index 0000000..64a47ec --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/dialogs/video/video.js @@ -0,0 +1,282 @@ + +(function(){ + var domUtils = UM.dom.domUtils; + var widgetName = 'video'; + + UM.registerWidget( widgetName,{ + + tpl: "video.css\" />" + + "
              " + + "
              " + + "
              " + + "<%=lang_tab_insertV%>" + + "
              " + + "
              " + + "
              " + + "
              " + + "
              " + + "
              " + + "
              " + + "<%=lang_video_size%>" + + "" + + "" + + "" + + "
              " + + "
              " + + "
              " + + "<%=lang_alignment%>" + + "
              " + + "
              " + + "
              " + + "
              " + + "
              " + + "
              " + + "
              ", + initContent:function( editor, $widget ){ + + var me = this, + lang = editor.getLang( widgetName), + video_url = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/video/'; + + me.lang = lang; + me.editor = editor; + me.$widget = $widget; + me.root().html( $.parseTmpl( me.tpl, $.extend( { video_url: video_url }, lang['static'] ) ) ); + + me.initController( lang ); + + }, + initEvent:function(){ + + var me = this, + url = $("#eduiVideoUrl", me.$widget)[0]; + + if( 'oninput' in url ) { + url.oninput = function(){ + me.createPreviewVideo( this.value ); + }; + } else { + url.onpropertychange = function () { + me.createPreviewVideo( this.value ); + } + } + + }, + initController: function( lang ){ + + var me = this, + img = me.editor.selection.getRange().getClosedNode(), + url; + + me.createAlignButton( ["eduiVideoFloat"] ); + + //编辑视频时初始化相关信息 + if(img && img.className == "edui-faked-video"){ + $("#eduiVideoUrl", me.$widget)[0].value = url = img.getAttribute("_url"); + $("#eduiVideoWidth", me.$widget)[0].value = img.width; + $("#eduiVideoHeight", me.$widget)[0].value = img.height; + var align = domUtils.getComputedStyle(img,"float"), + parentAlign = domUtils.getComputedStyle(img.parentNode,"text-align"); + me.updateAlignButton(parentAlign==="center"?"center":align); + } + me.createPreviewVideo(url); + + }, + /** + * 根据url生成视频预览 + */ + createPreviewVideo: function(url){ + + if ( !url )return; + + var me = this, + lang = me.lang, + conUrl = me.convert_url(url); + + if(!me.endWith(conUrl,[".swf",".flv",".wmv"])){ + $("#eduiVideoPreview", me.$widget).html( lang.urlError ); + return; + } + $("#eduiVideoPreview", me.$widget)[0].innerHTML = ''; + + }, + /** + * 将单个视频信息插入编辑器中 + */ + insertSingle: function(){ + + var me = this, + width = $("#eduiVideoWidth", me.$widget)[0], + height = $("#eduiVideoHeight", me.$widget)[0], + url=$('#eduiVideoUrl', me.$widget)[0].value, + align = this.findFocus("eduiVideoFloat","name"); + + if(!url) return false; + if ( !me.checkNum( [width, height] ) ) return false; + this.editor.execCommand('insertvideo', { + url: me.convert_url(url), + width: width.value, + height: height.value, + align: align + }); + + }, + /** + * URL转换 + */ + convert_url: function(url){ + if ( !url ) return ''; + var matches = url.match(/youtu.be\/(\w+)$/) || + url.match(/youtube\.com\/watch\?v=(\w+)/) || + url.match(/youtube.com\/v\/(\w+)/), + youku = url.match(/youku\.com\/v_show\/id_(\w+)/), + youkuPlay = /player\.youku\.com/ig.test(url); + + if(youkuPlay){ + url = url.replace(/\?f=.*/, ""); + } else if (matches){ + url = "https://www.youtube.com/v/" + matches[1] + "?version=3&feature=player_embedded"; + }else if(youku){ + url = "http://player.youku.com/player.php/sid/"+youku[1]+"/v.swf" + } else { + url = url.replace(/http:\/\/www\.tudou\.com\/programs\/view\/([\w\-]+)\/?/i, "http://www.tudou.com/v/$1") + .replace(/http:\/\/www\.youtube\.com\/watch\?v=([\w\-]+)/i, "http://www.youtube.com/v/$1") + .replace(/http:\/\/v\.youku\.com\/v_show\/id_([\w\-=]+)\.html/i, "http://player.youku.com/player.php/sid/$1") + .replace(/http:\/\/www\.56\.com\/u\d+\/v_([\w\-]+)\.html/i, "http://player.56.com/v_$1.swf") + .replace(/http:\/\/www.56.com\/w\d+\/play_album\-aid\-\d+_vid\-([^.]+)\.html/i, "http://player.56.com/v_$1.swf") + .replace(/http:\/\/v\.ku6\.com\/.+\/([^.]+)\.html/i, "http://player.ku6.com/refer/$1/v.swf") + .replace(/\?f=.*/, ""); + } + return url; + }, + /** + * 检测传入的所有input框中输入的长宽是否是正数 + */ + checkNum: function checkNum( nodes ) { + + var me = this; + + for ( var i = 0, ci; ci = nodes[i++]; ) { + var value = ci.value; + if ( !me.isNumber( value ) && value) { + alert( me.lang.numError ); + ci.value = ""; + ci.focus(); + return false; + } + } + return true; + }, + /** + * 数字判断 + * @param value + */ + isNumber: function( value ) { + return /(0|^[1-9]\d*$)/.test( value ); + }, + updateAlignButton: function( align ) { + var aligns = $( "#eduiVideoFloat", this.$widget )[0].children; + + for ( var i = 0, ci; ci = aligns[i++]; ) { + if ( ci.getAttribute( "name" ) == align ) { + if ( ci.className !="edui-video-focus" ) { + ci.className = "edui-video-focus"; + } + } else { + if ( ci.className =="edui-video-focus" ) { + ci.className = ""; + } + } + } + + }, + /** + * 创建图片浮动选择按钮 + * @param ids + */ + createAlignButton: function( ids ) { + var lang = this.lang, + vidoe_home = UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/video/'; + + for ( var i = 0, ci; ci = ids[i++]; ) { + var floatContainer = $( "#" + ci, this.$widget ) [0], + nameMaps = {"none":lang['default'], "left":lang.floatLeft, "right":lang.floatRight}; + for ( var j in nameMaps ) { + var div = document.createElement( "div" ); + div.setAttribute( "name", j ); + if ( j == "none" ) div.className="edui-video-focus"; + div.style.cssText = "background:url("+ vidoe_home +"images/" + j + "_focus.jpg);"; + div.setAttribute( "title", nameMaps[j] ); + floatContainer.appendChild( div ); + } + this.switchSelect( ci ); + } + }, + /** + * 选择切换 + */ + switchSelect: function( selectParentId ) { + var selects = $( "#" + selectParentId, this.$widget )[0].children; + for ( var i = 0, ci; ci = selects[i++]; ) { + $(ci).on("click", function () { + for ( var j = 0, cj; cj = selects[j++]; ) { + cj.className = ""; + cj.removeAttribute && cj.removeAttribute( "class" ); + } + this.className = "edui-video-focus"; + } ) + } + }, + /** + * 找到id下具有focus类的节点并返回该节点下的某个属性 + * @param id + * @param returnProperty + */ + findFocus: function( id, returnProperty ) { + var tabs = $( "#" + id , this.$widget)[0].children, + property; + for ( var i = 0, ci; ci = tabs[i++]; ) { + if ( ci.className=="edui-video-focus" ) { + property = ci.getAttribute( returnProperty ); + break; + } + } + return property; + }, + /** + * 末尾字符检测 + */ + endWith: function(str,endStrArr){ + for(var i=0,len = endStrArr.length;i errorInfo = new HashMap(); + + public Uploader(HttpServletRequest request) { + this.request = request; + HashMap tmp = this.errorInfo; + tmp.put("SUCCESS", "SUCCESS"); //默认成功 + tmp.put("NOFILE", "未包含文件上传域"); + tmp.put("TYPE", "不允许的文件格式"); + tmp.put("SIZE", "文件大小超出限制"); + tmp.put("ENTYPE", "请求类型ENTYPE错误"); + tmp.put("REQUEST", "上传请求异常"); + tmp.put("IO", "IO异常"); + tmp.put("DIR", "目录创建失败"); + tmp.put("UNKNOWN", "未知错误"); + + } + + public void upload() throws Exception { + boolean isMultipart = ServletFileUpload.isMultipartContent(this.request); + if (!isMultipart) { + this.state = this.errorInfo.get("NOFILE"); + return; + } + DiskFileItemFactory dff = new DiskFileItemFactory(); + String savePath = this.getFolder(this.savePath); + dff.setRepository(new File(savePath)); + try { + ServletFileUpload sfu = new ServletFileUpload(dff); + sfu.setSizeMax(this.maxSize * 1024); + sfu.setHeaderEncoding("utf-8"); + FileItemIterator fii = sfu.getItemIterator(this.request); + while (fii.hasNext()) { + FileItemStream fis = fii.next(); + if (!fis.isFormField()) { + this.originalName = fis.getName().substring(fis.getName().lastIndexOf(System.getProperty("file.separator")) + 1); + if (!this.checkFileType(this.originalName)) { + this.state = this.errorInfo.get("TYPE"); + continue; + } + this.fileName = this.getName(this.originalName); + this.type = this.getFileExt(this.fileName); + this.url = savePath + "/" + this.fileName; + BufferedInputStream in = new BufferedInputStream(fis.openStream()); + File file = new File(this.getPhysicalPath(this.url)); + FileOutputStream out = new FileOutputStream( file ); + BufferedOutputStream output = new BufferedOutputStream(out); + Streams.copy(in, output, true); + this.state=this.errorInfo.get("SUCCESS"); + this.size = file.length(); + //UE中只会处理单张上传,完成后即退出 + break; + } else { + String fname = fis.getFieldName(); + //只处理title,其余表单请自行处理 + if(!fname.equals("pictitle")){ + continue; + } + BufferedInputStream in = new BufferedInputStream(fis.openStream()); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + StringBuffer result = new StringBuffer(); + while (reader.ready()) { + result.append((char)reader.read()); + } + this.title = new String(result.toString().getBytes(),"utf-8"); + reader.close(); + + } + } + } catch (SizeLimitExceededException e) { + this.state = this.errorInfo.get("SIZE"); + } catch (InvalidContentTypeException e) { + this.state = this.errorInfo.get("ENTYPE"); + } catch (FileUploadException e) { + this.state = this.errorInfo.get("REQUEST"); + } catch (Exception e) { + this.state = this.errorInfo.get("UNKNOWN"); + } + } + + /** + * 接受并保存以base64格式上传的文件 + * @param fieldName + */ + public void uploadBase64(String fieldName){ + String savePath = this.getFolder(this.savePath); + String base64Data = this.request.getParameter(fieldName); + this.fileName = this.getName("test.png"); + this.url = savePath + "/" + this.fileName; + BASE64Decoder decoder = new BASE64Decoder(); + try { + File outFile = new File(this.getPhysicalPath(this.url)); + OutputStream ro = new FileOutputStream(outFile); + byte[] b = decoder.decodeBuffer(base64Data); + for (int i = 0; i < b.length; ++i) { + if (b[i] < 0) { + b[i] += 256; + } + } + ro.write(b); + ro.flush(); + ro.close(); + this.state=this.errorInfo.get("SUCCESS"); + } catch (Exception e) { + this.state = this.errorInfo.get("IO"); + } + } + + /** + * 文件类型判断 + * + * @param fileName + * @return + */ + private boolean checkFileType(String fileName) { + Iterator type = Arrays.asList(this.allowFiles).iterator(); + while (type.hasNext()) { + String ext = type.next(); + if (fileName.toLowerCase().endsWith(ext)) { + return true; + } + } + return false; + } + + /** + * 获取文件扩展名 + * + * @return string + */ + private String getFileExt(String fileName) { + return fileName.substring(fileName.lastIndexOf(".")); + } + + /** + * 依据原始文件名生成新文件名 + * @return + */ + private String getName(String fileName) { + Random random = new Random(); + return this.fileName = "" + random.nextInt(10000) + + System.currentTimeMillis() + this.getFileExt(fileName); + } + + /** + * 根据字符串创建本地目录 并按照日期建立子目录返回 + * @param path + * @return + */ + private String getFolder(String path) { + SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd"); + path += "/" + formater.format(new Date()); + File dir = new File(this.getPhysicalPath(path)); + if (!dir.exists()) { + try { + dir.mkdirs(); + } catch (Exception e) { + this.state = this.errorInfo.get("DIR"); + return ""; + } + } + return path; + } + + /** + * 根据传入的虚拟路径获取物理路径 + * + * @param path + * @return + */ + private String getPhysicalPath(String path) { + String servletPath = this.request.getServletPath(); + String realPath = this.request.getSession().getServletContext() + .getRealPath(servletPath); + return new File(realPath).getParent() +"/" +path; + } + + public void setSavePath(String savePath) { + this.savePath = savePath; + } + + public void setAllowFiles(String[] allowFiles) { + this.allowFiles = allowFiles; + } + + public void setMaxSize(int size) { + this.maxSize = size; + } + + public long getSize() { + return this.size; + } + + public String getUrl() { + return this.url; + } + + public String getFileName() { + return this.fileName; + } + + public String getState() { + return this.state; + } + + public String getTitle() { + return this.title; + } + + public String getType() { + return this.type; + } + + public String getOriginalName() { + return this.originalName; + } +} diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/commons-fileupload-1.2.2.jar b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/commons-fileupload-1.2.2.jar new file mode 100644 index 0000000..131f192 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/commons-fileupload-1.2.2.jar differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/getContent.jsp b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/getContent.jsp new file mode 100644 index 0000000..6aee0c0 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/getContent.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> + + + + +<% +request.setCharacterEncoding("utf-8"); +response.setCharacterEncoding("utf-8"); +String content = request.getParameter("myEditor"); + + + +response.getWriter().print("
              "+content+"
              "); + +%> \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/imageUp.jsp b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/imageUp.jsp new file mode 100644 index 0000000..66d6dd9 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/imageUp.jsp @@ -0,0 +1,26 @@ + <%@ page language="java" contentType="text/html; charset=utf-8" + pageEncoding="utf-8"%> + <%@ page import="com.baidu.ueditor.um.Uploader" %> + + <% + request.setCharacterEncoding("utf-8"); + response.setCharacterEncoding("utf-8"); + Uploader up = new Uploader(request); + up.setSavePath("upload"); + String[] fileType = {".gif" , ".png" , ".jpg" , ".jpeg" , ".bmp"}; + up.setAllowFiles(fileType); + up.setMaxSize(10000); //单位KB + up.upload(); + + String callback = request.getParameter("callback"); + + String result = "{\"name\":\""+ up.getFileName() +"\", \"originalName\": \""+ up.getOriginalName() +"\", \"size\": "+ up.getSize() +", \"state\": \""+ up.getState() +"\", \"type\": \""+ up.getType() +"\", \"url\": \""+ up.getUrl() +"\"}"; + + result = result.replaceAll( "\\\\", "\\\\" ); + + if( callback == null ){ + response.getWriter().print( result ); + }else{ + response.getWriter().print(""); + } + %> diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/ueditor-mini.jar b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/ueditor-mini.jar new file mode 100644 index 0000000..af8f835 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/jsp/ueditor-mini.jar differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/en.js b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/en.js new file mode 100644 index 0000000..45b2f1a --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/en.js @@ -0,0 +1,150 @@ +/** + * English language package + */ +UM.I18N['en'] = { + 'labelMap':{ + 'anchor':'Anchor', 'undo':'Undo', 'redo':'Redo', 'bold':'Bold', 'indent':'Indent', 'snapscreen':'SnapScreen', + 'italic':'Italic', 'underline':'Underline', 'strikethrough':'Strikethrough', 'subscript':'SubScript','fontborder':'text border', + 'superscript':'SuperScript', 'formatmatch':'Format Match', 'source':'Source', 'blockquote':'BlockQuote', + 'pasteplain':'PastePlain', 'selectall':'SelectAll', 'print':'Print', 'preview':'Preview', + 'horizontal':'Horizontal', 'removeformat':'RemoveFormat', 'time':'Time', 'date':'Date', + 'unlink':'Unlink', 'insertrow':'InsertRow', 'insertcol':'InsertCol', 'mergeright':'MergeRight', 'mergedown':'MergeDown', + 'deleterow':'DeleteRow', 'deletecol':'DeleteCol', 'splittorows':'SplitToRows','insertcode':'insert code', + 'splittocols':'SplitToCols', 'splittocells':'SplitToCells','deletecaption':'DeleteCaption','inserttitle':'InsertTitle', + 'mergecells':'MergeCells', 'deletetable':'DeleteTable', 'cleardoc':'Clear', 'insertparagraphbeforetable':"InsertParagraphBeforeTable", + 'fontfamily':'FontFamily', 'fontsize':'FontSize', 'paragraph':'Paragraph', 'image':'Image','edittable':'Edit Table', 'edittd':'Edit Td','link':'Link', + 'emotion':'Emotion', 'spechars':'Spechars', 'searchreplace':'SearchReplace', 'map':'BaiduMap', 'gmap':'GoogleMap', + 'video':'Video', 'help':'Help', 'justifyleft':'JustifyLeft', 'justifyright':'JustifyRight', 'justifycenter':'JustifyCenter', + 'justifyjustify':'Justify', 'forecolor':'FontColor', 'backcolor':'BackColor', 'insertorderedlist':'OL', + 'insertunorderedlist':'UL', 'fullscreen':'FullScreen', 'directionalityltr':'EnterFromLeft', 'directionalityrtl':'EnterFromRight', + 'rowspacingtop':'RowSpacingTop', 'rowspacingbottom':'RowSpacingBottom', 'highlightcode':'Code', 'pagebreak':'PageBreak', 'insertframe':'Iframe', 'imagenone':'Default', + 'imageleft':'ImageLeft', 'imageright':'ImageRight', 'attachment':'Attachment', 'imagecenter':'ImageCenter', 'wordimage':'WordImage', + 'lineheight':'LineHeight','edittip':'EditTip','customstyle':'CustomStyle', 'scrawl':'Scrawl', 'autotypeset':'AutoTypeset', + 'webapp':'WebAPP', 'touppercase':'UpperCase', 'tolowercase':'LowerCase','template':'Template','background':'Background','inserttable':'InsertTable', + 'drafts': 'drafts', 'formula':'formula' + }, + 'paragraph':{'p':'Paragraph', 'h1':'Title 1', 'h2':'Title 2', 'h3':'Title 3', 'h4':'Title 4', 'h5':'Title 5', 'h6':'Title 6'}, + 'fontfamily':{ + 'songti':'Sim sun', + 'kaiti':'Sim kai', + 'heiti':'Sim hei', + 'lishu':'Sim li', + 'yahei': 'Microsoft yahei', + 'andaleMono':'Andale mono', + 'arial': 'Arial', + 'arialBlack':'Arial black', + 'comicSansMs':'Comic sans ms', + 'impact':'Impact', + 'timesNewRoman':'Times new roman' + }, + 'ok':"OK", + 'cancel':"Cancel", + 'closeDialog':"closeDialog", + 'tableDrag':"You must import the file uiUtils.js before drag! ", + 'autofloatMsg':"The plugin AutoFloat depends on EditorUI!", + 'anthorMsg':"Link", + 'clearColor':'Clear', + 'standardColor':'Standard color', + 'themeColor':'Theme color', + 'property':'Property', + 'default':'Default', + 'modify':'Modify', + 'justifyleft':'Justify Left', + 'justifyright':'Justify Right', + 'justifycenter':'Justify Center', + 'justify':'Default', + 'clear':'Clear', + 'anchorMsg':'Anchor', + 'delete':'Delete', + 'clickToUpload':"Click to upload", + 'unset':"Language hasn't been set!", + 't_row':'row', + 't_col':'col', + 'more':'More', + 'pasteOpt':'Paste Option', + 'pasteSourceFormat':"Keep Source Formatting", + 'tagFormat':'Keep tag', + 'pasteTextFormat':'Keep Text only', + + //===============dialog i18N======================= + 'image':{ + 'static':{ + 'lang_tab_local':"Local Upload", + 'lang_tab_imgSearch':"Network Pictures", + 'lang_input_dragTip':"Support drag upload", + 'lang_btn_add':"Add" + }, + 'uploadError': 'Upload Error' + }, + 'emotion':{ + 'static':{ + 'lang_input_choice':'Choice', + 'lang_input_Tuzki':'Tuzki', + 'lang_input_lvdouwa':'LvDouWa', + 'lang_input_BOBO':'BOBO', + 'lang_input_babyCat':'BabyCat', + 'lang_input_bubble':'Bubble', + 'lang_input_youa':'YouA' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'Address:', + 'lang_input_search':'Search', + 'address':{'value':"Beijing"} + }, + 'searchError':'Unable to locate the address!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'Text:', + 'lang_input_url':'URL:', + 'lang_input_title':'Title:', + 'lang_input_target':'open in new window:' + }, + 'validLink':'Supports only effective when a link is selected', + 'httpPrompt':'The hyperlink you enter should start with "http|https|ftp://"!' + }, + 'map':{ + 'static':{ + 'lang_city':"City", + 'lang_address':"Address", + 'city':{'value':"Beijing"}, + 'lang_search':"Search", + 'lang_dynamicmap':"Dynamic map" + }, + 'cityMsg':"Please enter the city name!", + 'errorMsg':"Can't find the place!" + }, + 'video':{ + 'static':{ + 'lang_tab_insertV':"Video", + 'lang_video_url':" URL ", + 'lang_video_size':"Video Size", + 'lang_videoW':"Width", + 'lang_videoH':"Height", + 'lang_alignment':"Alignment", + 'videoSearchTxt':{'value':"Enter the search keyword!"}, + 'videoType':{'options':["All", "Hot", "Entertainment", "Funny", "Sports", "Science", "variety"]}, + 'videoSearchBtn':{'value':"Search in Baidu"}, + 'videoSearchReset':{'value':"Clear result"} + }, + 'numError':"Please enter the correct Num. e.g 123,400", + 'floatLeft':"Float left", + 'floatRight':"Float right", + 'default':"Default", + 'block':"Display in block", + 'urlError':"The video url format may be wrong!", + 'loading':"  The video is loading, please wait…", + 'clickToSelect':"Click to select", + 'goToSource':'Visit source video ', + 'noVideo':"    Sorry,can't find the video,please try again!" + }, + 'formula':{ + 'static':{ + 'lang_tab_common':'Common', + 'lang_tab_symbol':'Symbol', + 'lang_tab_letter':'Letter' + } + } +}; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/addimage.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/addimage.png new file mode 100644 index 0000000..3a2fd17 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/addimage.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/alldeletebtnhoverskin.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/alldeletebtnhoverskin.png new file mode 100644 index 0000000..355eeab Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/alldeletebtnhoverskin.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/alldeletebtnupskin.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/alldeletebtnupskin.png new file mode 100644 index 0000000..61658ce Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/alldeletebtnupskin.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/background.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/background.png new file mode 100644 index 0000000..d5bf5fd Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/background.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/button.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/button.png new file mode 100644 index 0000000..098874c Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/button.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/copy.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/copy.png new file mode 100644 index 0000000..f982e8b Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/copy.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/deletedisable.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/deletedisable.png new file mode 100644 index 0000000..c8ee750 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/deletedisable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/deleteenable.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/deleteenable.png new file mode 100644 index 0000000..26acc88 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/deleteenable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/imglabel.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/imglabel.png new file mode 100644 index 0000000..da401e6 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/imglabel.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/listbackground.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/listbackground.png new file mode 100644 index 0000000..4f82ccd Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/listbackground.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/localimage.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/localimage.png new file mode 100644 index 0000000..12c8e6a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/localimage.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/music.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/music.png new file mode 100644 index 0000000..2f495fe Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/music.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotateleftdisable.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotateleftdisable.png new file mode 100644 index 0000000..741526e Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotateleftdisable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotateleftenable.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotateleftenable.png new file mode 100644 index 0000000..e164ddb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotateleftenable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotaterightdisable.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotaterightdisable.png new file mode 100644 index 0000000..5a78c26 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotaterightdisable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotaterightenable.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotaterightenable.png new file mode 100644 index 0000000..d768531 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/rotaterightenable.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/upload.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/upload.png new file mode 100644 index 0000000..7bb15b3 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/en/images/upload.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/copy.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/copy.png new file mode 100644 index 0000000..b2536aa Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/copy.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/imglabel.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/imglabel.png new file mode 100644 index 0000000..4fc3c88 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/imglabel.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/localimage.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/localimage.png new file mode 100644 index 0000000..7303c36 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/localimage.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/music.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/music.png new file mode 100644 index 0000000..354edeb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/music.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/upload.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/upload.png new file mode 100644 index 0000000..08d4d92 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/images/upload.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/zh-cn.js b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/zh-cn.js new file mode 100644 index 0000000..5f4a5e5 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/lang/zh-cn/zh-cn.js @@ -0,0 +1,150 @@ +/** + * 中文语言包 + */ +UM.I18N['zh-cn'] = { + 'labelMap':{ + 'anchor':'锚点', 'undo':'撤销', 'redo':'重做', 'bold':'加粗', 'indent':'首行缩进', 'snapscreen':'截图', + 'italic':'斜体', 'underline':'下划线', 'strikethrough':'删除线', 'subscript':'下标','fontborder':'字符边框', + 'superscript':'上标', 'formatmatch':'格式刷', 'source':'源代码', 'blockquote':'引用', + 'pasteplain':'纯文本粘贴模式', 'selectall':'全选', 'print':'打印', 'preview':'预览', + 'horizontal':'分隔线', 'removeformat':'清除格式', 'time':'时间', 'date':'日期', + 'unlink':'取消链接', 'insertrow':'前插入行', 'insertcol':'前插入列', 'mergeright':'右合并单元格', 'mergedown':'下合并单元格', + 'deleterow':'删除行', 'deletecol':'删除列', 'splittorows':'拆分成行', 'splittocols':'拆分成列', 'splittocells':'完全拆分单元格', + 'mergecells':'合并多个单元格', 'deletetable':'删除表格', 'cleardoc':'清空文档','insertparagraphbeforetable':"表格前插入行",'insertcode':'代码语言','fontfamily':'字体', 'fontsize':'字号', 'paragraph':'段落格式', 'image':'图片', + 'edittable':'表格属性','edittd':'单元格属性', 'link':'超链接','emotion':'表情', 'spechars':'特殊字符', 'searchreplace':'查询替换', 'map':'百度地图', 'gmap':'Google地图', + 'video':'视频', 'help':'帮助', 'justifyleft':'居左对齐', 'justifyright':'居右对齐', 'justifycenter':'居中对齐', + 'justifyjustify':'两端对齐', 'forecolor':'字体颜色', 'backcolor':'背景色', 'insertorderedlist':'有序列表', + 'insertunorderedlist':'无序列表', 'fullscreen':'全屏', 'directionalityltr':'从左向右输入', 'directionalityrtl':'从右向左输入', + 'rowspacingtop':'段前距', 'rowspacingbottom':'段后距', 'highlightcode':'插入代码', 'pagebreak':'分页', 'insertframe':'插入Iframe', 'imagenone':'默认', + 'imageleft':'左浮动', 'imageright':'右浮动', 'attachment':'附件', 'imagecenter':'居中', 'wordimage':'图片转存', + 'lineheight':'行间距','edittip' :'编辑提示','customstyle':'自定义标题', 'autotypeset':'自动排版', 'webapp':'百度应用', + 'touppercase':'字母大写', 'tolowercase':'字母小写','background':'背景','template':'模板','scrawl':'涂鸦','music':'音乐','inserttable':'插入表格', + 'drafts': '草稿箱', 'formula':'数学公式' + + + }, + 'paragraph':{'p':'段落', 'h1':'标题 1', 'h2':'标题 2', 'h3':'标题 3', 'h4':'标题 4', 'h5':'标题 5', 'h6':'标题 6'}, + 'fontfamily':{ + 'songti':'宋体', + 'kaiti':'楷体', + 'heiti':'黑体', + 'lishu':'隶书', + 'yahei':'微软雅黑', + 'andaleMono':'andale mono', + 'arial': 'arial', + 'arialBlack':'arial black', + 'comicSansMs':'comic sans ms', + 'impact':'impact', + 'timesNewRoman':'times new roman' + }, + 'ok':"确认", + 'cancel':"取消", + 'closeDialog':"关闭对话框", + 'tableDrag':"表格拖动必须引入uiUtils.js文件!", + 'autofloatMsg':"工具栏浮动依赖编辑器UI,您首先需要引入UI文件!", + 'anthorMsg':"链接", + 'clearColor':'清空颜色', + 'standardColor':'标准颜色', + 'themeColor':'主题颜色', + 'property':'属性', + 'default':'默认', + 'modify':'修改', + 'justifyleft':'左对齐', + 'justifyright':'右对齐', + 'justifycenter':'居中', + 'justify':'默认', + 'clear':'清除', + 'anchorMsg':'锚点', + 'delete':'删除', + 'clickToUpload':"点击上传", + 'unset':'尚未设置语言文件', + 't_row':'行', + 't_col':'列', + 'more':'更多', + 'pasteOpt':'粘贴选项', + 'pasteSourceFormat':"保留源格式", + 'tagFormat':'只保留标签', + 'pasteTextFormat':'只保留文本', + + //===============dialog i18N======================= + 'image':{ + 'static':{ + 'lang_tab_local':"本地上传", + 'lang_tab_imgSearch':"网络图片", + 'lang_input_dragTip':"支持图片拖拽上传", + 'lang_btn_add':"添加" + }, + 'uploadError': '上传出错' + }, + 'emotion':{ + 'static':{ + 'lang_input_choice':'精选', + 'lang_input_Tuzki':'兔斯基', + 'lang_input_BOBO':'BOBO', + 'lang_input_lvdouwa':'绿豆蛙', + 'lang_input_babyCat':'baby猫', + 'lang_input_bubble':'泡泡', + 'lang_input_youa':'有啊' + } + }, + 'gmap':{ + 'static':{ + 'lang_input_address':'地址', + 'lang_input_search':'搜索', + 'address':{'value':"北京"} + }, + 'searchError':'无法定位到该地址!' + }, + 'link':{ + 'static':{ + 'lang_input_text':'文本内容:', + 'lang_input_url':'链接地址:', + 'lang_input_title':'标题:', + 'lang_input_target':'是否在新窗口打开:' + }, + 'validLink':'只支持选中一个链接时生效', + 'httpPrompt':'您输入的超链接中不包含http等协议名称,默认将为您添加http://前缀' + }, + 'map':{ + 'static':{ + 'lang_city':"城市", + 'lang_address':"地址", + 'city':{'value':"北京"}, + 'lang_search':"搜索", + 'lang_dynamicmap':"插入动态地图" + }, + 'cityMsg':"请选择城市", + 'errorMsg':"抱歉,找不到该位置!" + }, + 'video':{ + 'static':{ + 'lang_tab_insertV':"插入视频", + 'lang_video_url':"视频网址", + 'lang_video_size':"视频尺寸", + 'lang_videoW':"宽度", + 'lang_videoH':"高度", + 'lang_alignment':"对齐方式", + 'videoSearchTxt':{'value':"请输入搜索关键字!"}, + 'videoType':{'options':["全部", "热门", "娱乐", "搞笑", "体育", "科技", "综艺"]}, + 'videoSearchBtn':{'value':"百度一下"}, + 'videoSearchReset':{'value':"清空结果"} + }, + 'numError':"请输入正确的数值,如123,400", + 'floatLeft':"左浮动", + 'floatRight':"右浮动", + 'default':"默认", + 'block':"独占一行", + 'urlError':"输入的视频地址有误,请检查后再试!", + 'loading':"  视频加载中,请等待……", + 'clickToSelect':"点击选中", + 'goToSource':'访问源视频', + 'noVideo':"    抱歉,找不到对应的视频,请重试!" + }, + 'formula':{ + 'static':{ + 'lang_tab_common':'常用公式', + 'lang_tab_symbol':'符号', + 'lang_tab_letter':'字母' + } + } +}; \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/Uploader.cs b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/Uploader.cs new file mode 100644 index 0000000..a8455b5 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/Uploader.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Web; +using System.IO; +using System.Collections; + + +/// +/// UEditor编辑器通用上传类 +/// +public class Uploader +{ + string state = "SUCCESS"; + + string URL = null; + string currentType = null; + string uploadpath = null; + string filename = null; + string originalName = null; + HttpPostedFile uploadFile = null; + + /** + * 上传文件的主处理方法 + * @param HttpContext + * @param string + * @param string[] + *@param int + * @return Hashtable + */ + public Hashtable upFile(HttpContext cxt, string pathbase, string[] filetype, int size) + { + pathbase = pathbase + DateTime.Now.ToString("yyyy-MM-dd") + "/"; + uploadpath = cxt.Server.MapPath(pathbase);//获取文件上传路径 + + try + { + uploadFile = cxt.Request.Files[0]; + originalName = uploadFile.FileName; + + //目录创建 + createFolder(); + + //格式验证 + if (checkType(filetype)) + { + state = "不允许的文件类型"; + } + //大小验证 + if (checkSize(size)) + { + state = "文件大小超出网站限制"; + } + //保存图片 + if (state == "SUCCESS") + { + filename = reName(); + uploadFile.SaveAs(uploadpath + filename); + URL = pathbase + filename; + } + } + catch (Exception e) + { + state = "未知错误"; + URL = ""; + } + return getUploadInfo(); + } + + /** + * 上传涂鸦的主处理方法 + * @param HttpContext + * @param string + * @param string[] + *@param string + * @return Hashtable + */ + public Hashtable upScrawl(HttpContext cxt, string pathbase, string tmppath, string base64Data) + { + pathbase = pathbase + DateTime.Now.ToString("yyyy-MM-dd") + "/"; + uploadpath = cxt.Server.MapPath(pathbase);//获取文件上传路径 + FileStream fs = null; + try + { + //创建目录 + createFolder(); + //生成图片 + filename = System.Guid.NewGuid() + ".png"; + fs = File.Create(uploadpath + filename); + byte[] bytes = Convert.FromBase64String(base64Data); + fs.Write(bytes, 0, bytes.Length); + + URL = pathbase + filename; + } + catch (Exception e) + { + state = "未知错误"; + URL = ""; + } + finally + { + fs.Close(); + deleteFolder(cxt.Server.MapPath(tmppath)); + } + return getUploadInfo(); + } + + /** +* 获取文件信息 +* @param context +* @param string +* @return string +*/ + public string getOtherInfo(HttpContext cxt, string field) + { + string info = null; + if (cxt.Request.Form[field] != null && !String.IsNullOrEmpty(cxt.Request.Form[field])) + { + info = field == "fileName" ? cxt.Request.Form[field].Split(',')[1] : cxt.Request.Form[field]; + } + return info; + } + + /** + * 获取上传信息 + * @return Hashtable + */ + private Hashtable getUploadInfo() + { + Hashtable infoList = new Hashtable(); + + infoList.Add("state", state); + infoList.Add("url", URL); + infoList.Add("originalName", originalName); + infoList.Add("name", Path.GetFileName(URL)); + infoList.Add("size", uploadFile.ContentLength); + infoList.Add("type", Path.GetExtension(originalName)); + + return infoList; + } + + /** + * 重命名文件 + * @return string + */ + private string reName() + { + return System.Guid.NewGuid() + getFileExt(); + } + + /** + * 文件类型检测 + * @return bool + */ + private bool checkType(string[] filetype) + { + currentType = getFileExt(); + return Array.IndexOf(filetype, currentType) == -1; + } + + /** + * 文件大小检测 + * @param int + * @return bool + */ + private bool checkSize(int size) + { + return uploadFile.ContentLength >= (size * 1024 * 1024); + } + + /** + * 获取文件扩展名 + * @return string + */ + private string getFileExt() + { + string[] temp = uploadFile.FileName.Split('.'); + return "." + temp[temp.Length - 1].ToLower(); + } + + /** + * 按照日期自动创建存储文件夹 + */ + private void createFolder() + { + if (!Directory.Exists(uploadpath)) + { + Directory.CreateDirectory(uploadpath); + } + } + + /** + * 删除存储文件夹 + * @param string + */ + public void deleteFolder(string path) + { + //if (Directory.Exists(path)) + //{ + // Directory.Delete(path, true); + //} + } +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/getContent.ashx b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/getContent.ashx new file mode 100644 index 0000000..708e3a9 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/getContent.ashx @@ -0,0 +1,40 @@ +<%@ WebHandler Language="C#" Class="getContent" %> +/** + * Created by visual studio 2010 + * User: xuheng + * Date: 12-3-6 + * Time: 下午21:23 + * To get the value of editor and output the value . + */ +using System; +using System.Web; + +public class getContent : IHttpHandler { + + public void ProcessRequest (HttpContext context) { + context.Response.ContentType = "text/html"; + + //获取数据 + string content = context.Request.Form["myEditor"]; + + + //存入数据库或者其他操作 + //------------- + + //显示 + + + context.Response.Write(""); + context.Response.Write(""); + context.Response.Write(""); + context.Response.Write("
              " + content + "
              "); + + } + + public bool IsReusable { + get { + return false; + } + } + +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/imageUp.ashx b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/imageUp.ashx new file mode 100644 index 0000000..10a5212 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/net/imageUp.ashx @@ -0,0 +1,60 @@ +<%@ WebHandler Language="C#" Class="imageUp" %> +<%@ Assembly Src="Uploader.cs" %> + +using System; +using System.Web; +using System.IO; +using System.Collections; +using System.Collections.Generic; + +public class imageUp : IHttpHandler +{ + + public void ProcessRequest(HttpContext context) + { + context.Response.ContentEncoding = System.Text.Encoding.UTF8; + //上传配置 + string pathbase = "upload/"; //保存路径 + int size = 10; //文件大小限制,单位mb //文件大小限制,单位KB + string[] filetype = { ".gif", ".png", ".jpg", ".jpeg", ".bmp" }; //文件允许格式 + + string callback = context.Request["callback"]; + string editorId = context.Request["editorid"]; + + //上传图片 + Hashtable info; + Uploader up = new Uploader(); + info = up.upFile(context, pathbase, filetype, size); //获取上传状态 + string json = BuildJson(info); + + context.Response.ContentType = "text/html"; + if (callback != null) + { + context.Response.Write(String.Format("", callback, json)); + } + else + { + context.Response.Write(json); + } + } + + public bool IsReusable + { + get + { + return false; + } + } + + private string BuildJson(Hashtable info) + { + List fields = new List(); + string[] keys = new string[] { "originalName", "name", "url", "size", "state", "type" }; + for (int i = 0; i < keys.Length; i++) + { + fields.Add(String.Format("\"{0}\": \"{1}\"", keys[i], info[keys[i]])); + } + return "{" + String.Join(",", fields) + "}"; + } + +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/css/umeditor.css b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/css/umeditor.css new file mode 100644 index 0000000..ebbac6d --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/css/umeditor.css @@ -0,0 +1,769 @@ +.edui-container{ + position: relative; + border: 1px solid #d4d4d4; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #fff; +} +.edui-container .edui-toolbar{ + position: relative; + width:auto; + border-bottom: 1px solid #e1e1e1; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #fafafa; + z-index: 99999; +} +.edui-toolbar .edui-btn-toolbar{ + position: relative; + padding: 3px; +} +.edui-container .edui-editor-body{ + background-color: #fff; +} +.edui-editor-body .edui-body-container p{margin:0;} +.edui-editor-body .edui-body-container{ + border:0; + outline:none; + cursor:text; + padding:5px 10px; + overflow:auto; + display:block; + word-wrap:break-word; + font-family:sans-serif; +} +.edui-editor-body.focus{border:1px solid #5c9dff} +.edui-editor-body table{margin:10px 0 10px;border-collapse:collapse;display:table;} +.edui-editor-body td{padding: 5px 10px;border: 1px solid #DDD;} +.edui-editor-body iframe.mathquill-embedded-latex{ + border: 0px; + padding: 0px; + display: inline; + margin: 0px; + background: none; + vertical-align: middle; + width: 0px; + height: 0px; +} +/*普通按钮*/ +.edui-btn-toolbar .edui-btn{ + position: relative; + display: inline-block; + vertical-align: top; + *display: inline; + *zoom:1; + width:auto; + margin: 0 1px; + padding:1px; + border:none; + background: none; +} +.edui-btn-toolbar .edui-btn .edui-icon{ + width: 20px; + height: 20px; + margin: 0; + padding:0; + background-repeat: no-repeat; + background-image: url(../images/icons.png); + background-image: url(../images/icons.gif) \9; +} + +/*状态反射*/ +.edui-btn-toolbar .edui-btn.edui-hover, +.edui-btn-toolbar .edui-btn.edui-active{ + background-color: #d5e1f2; + padding: 0; + border: 1px solid #a3bde3; + _z-index: 1; +} +.edui-btn-toolbar .edui-btn.edui-disabled{ + opacity: 0.3; + filter: alpha(opacity = 30); +} +.edui-btn-toolbar .edui-btn .edui-icon-source { + background-position:-260px -0px; +} +.edui-btn-toolbar .edui-btn .edui-icon-undo { + background-position: -160px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-redo { + background-position: -100px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-bold{ + background-position: 0 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-italic { + background-position: -60px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-underline { + background-position: -140px 0 +} +.edui-btn-toolbar .edui-btn .edui-icon-strikethrough { + background-position: -120px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-superscript { + background-position: -620px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-subscript { + background-position: -600px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-font, .edui-btn-toolbar .edui-btn .edui-icon-forecolor { + background-position: -720px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-backcolor { + background-position: -760px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-insertorderedlist { + background-position: -80px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-insertunorderedlist { + background-position: -20px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-selectall { + background-position: -400px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-cleardoc { + background-position: -520px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-paragraph { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-fontfamily { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-fontsize { + background-position: -140px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyleft { + background-position: -460px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifycenter { + background-position: -420px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyright { + background-position:-480px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-justifyjustify { + background-position: -440px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-link { + background-position: -500px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-unlink { + background-position: -640px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-image { + background-position: -380px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-emotion { + background-position: -60px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-video { + background-position: -320px -20px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-map { + background-position: -40px -40px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-gmap { + background-position: -260px -40px; +} +.edui-btn-toolbar .edui-btn .edui-icon-horizontal { + background-position: -360px 0; +} + +.edui-btn-toolbar .edui-btn .edui-icon-print { + background-position: -440px -20px; +} +.edui-btn-toolbar .edui-btn .edui-icon-preview { + background-position: -420px -20px; +} + +/*.edui-btn-toolbar .edui-btn-fullscreen{ + float:right; +}*/ +.edui-btn-toolbar .edui-btn .edui-icon-fullscreen { + background-position: -100px -20px; +} + +.edui-btn-toolbar .edui-btn .edui-icon-removeformat { + background-position: -580px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-drafts { + background-position: -560px 0; +} +.edui-btn-toolbar .edui-btn .edui-icon-formula { + background-position: -80px -20px; +} +.edui-btn-toolbar .edui-splitbutton{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + margin:0 2px; +} +.edui-splitbutton .edui-btn{ + margin: 0; +} +.edui-splitbutton .edui-caret{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + width: 8px; + height: 20px; + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; +} + +.edui-btn-toolbar .edui-splitbutton, +.edui-btn-toolbar .edui-splitbutton{ + _border: none; +} + +/*状态反射*/ +.edui-btn-toolbar .edui-splitbutton.edui-hover .edui-btn{ + background-color: #d5e1f2; +} + +.edui-btn-toolbar .edui-splitbutton.edui-disabled{ + opacity: 0.3; + filter: alpha(opacity = 30); +} +.edui-btn-toolbar .edui-splitbutton.edui-disabled .edui-caret{ + opacity: 0.3 \0; + filter: alpha(opacity = 30)\0; +} + + +.edui-btn-toolbar .edui-combobox{ + border: 1px solid #CCC; + padding:0; + margin:0 2px; + line-height: 20px; +} +.edui-combobox .edui-button-label{ + position: relative; + display: inline-block; + vertical-align: top; + *display: inline ; + *zoom:1; + width:60px; + height:20px; + line-height: 20px; + padding: 2px; + margin: 0; + font-size: 12px; + text-align: center; + cursor: default; +} +.edui-combobox .edui-button-spacing{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + height:20px; + margin: 0; + padding:0 3px; +} +.edui-combobox .edui-caret{ + position: relative; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + height:20px; + width: 12px; + margin: 0; + padding: 0; + background: url(../images/icons.png) -741px 0; + _background: url(../images/icons.gif) -741px 0; +} +.edui-btn-toolbar .edui-combobox.edui-disabled{ + opacity: 0.2; + filter: alpha(opacity = 20); +} +.edui-btn-toolbar .edui-combobox.edui-disabled .edui-button-label, +.edui-btn-toolbar .edui-combobox.edui-disabled .edui-caret{ + opacity: 0.2 \0; + filter: alpha(opacity = 20)\0; +} +.edui-combobox-menu{ + position: absolute; + top: 100%; + left: 0; + display: none; + list-style: none; + text-decoration: none; + margin: 0; + padding:5px; + background-color: #ffffff; + border: 1px solid #ccc; + font-size: 12px; + box-shadow: 2px 2px 5px #d3d6da; + min-width: 160px; + _width: 160px; +} + +.edui-combobox-menu .edui-combobox-item { + display: block; + border: 1px solid white; +} + +.edui-combobox-menu .edui-combobox-item-label { + height: 25px; + line-height: 25px; + display: inline-block; + _display: inline; + _zoom: 1; + margin-left: 10px; +} + +.edui-combobox-menu .edui-combobox-item:hover, .edui-combobox-menu .edui-combobox-stack-item:hover, .edui-combobox-menu .edui-combobox-item-hover { + background-color: #d5e1f2; + padding: 0; + border: 1px solid #a3bde3; +} + +.edui-combobox-menu .edui-combobox-item .edui-combobox-icon { + display: inline-block; + *zoom: 1; + *display: inline; + width: 24px; + height: 25px; + background: red; + vertical-align: bottom; + background: url(../images/ok.gif) no-repeat 1000px 1000px; +} + +.edui-combobox-menu .edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + + +.edui-combobox-menu .edui-combobox-item-separator { + min-width: 160px; + height: 1px; + line-height: 1px; + overflow: hidden; + background: #d3d3d3; + margin: 5px 0; + *margin-top: -8px; +} + +/* 字体样式校正 */ + +.edui-combobox-fontsize .edui-combobox-item-0.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +.edui-combobox-fontsize .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +/* 24 */ +.edui-combobox-fontsize .edui-combobox-item-4 .edui-combobox-item-label { + height: 27px; + line-height: 27px; +} + +.edui-combobox-fontsize .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 5px; +} + +/* 32 */ +.edui-combobox-fontsize .edui-combobox-item-5 .edui-combobox-item-label { + height: 31px; + line-height: 31px; +} + +.edui-combobox-fontsize .edui-combobox-item-5.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 4px; +} + + +/* 48 */ +.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-item-label { + height: 47px; + line-height: 47px; +} + +/*.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-icon {*/ + /*height: 25px;*/ + /*margin-bottom: 11px;*/ +/*}*/ + +/*.edui-combobox-fontsize .edui-combobox-item-6.edui-combobox-checked .edui-combobox-icon {*/ + /*background-position: 10px 7px;*/ +/*}*/ + + +/* 段落样式校正 */ +/* h1 */ +.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-item-label { + font-size: 32px; + height: 36px; + line-height: 36px; +} + +.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-icon { + height: 25px; + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 7px; +} + +/* h2 */ +.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-item-label { + font-size: 28px; + height: 27px; + line-height: 27px; +} + +.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-icon { + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 10px; +} + +/* h3 */ +.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-item-label { + font-size: 24px; + height: 25px; + line-height: 25px; +} + +.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-icon { + height: 25px; + margin-bottom: 5px; +} + +.edui-combobox-paragraph .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 11px; +} + +/* h4 */ +.edui-combobox-paragraph .edui-combobox-item-4 .edui-combobox-item-label { + font-size: 18px; + height: 25px; + line-height: 25px; +} + +.edui-combobox-paragraph .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon { + background-position: 10px 6px; +} + +/* h5 */ +.edui-combobox-paragraph .edui-combobox-item-5 .edui-combobox-item-label { + font-size: 16px; +} + +/* h6 */ +.edui-combobox-paragraph .edui-combobox-item-6 .edui-combobox-item-label { + font-size: 12px; +} +.edui-modal { + position: fixed; + _position: absolute; + top: 10%; + left: 50%; + border: 1px solid #acacac; + box-shadow: 2px 2px 5px #d3d6da; + background-color: #ffffff; + outline: 0; +} +.edui-modal-header { + padding: 5px 10px; + border-bottom: 1px solid #eee; +} +.edui-modal-header .edui-close { + float: right; + width:20px; + height:20px; + margin-top: 2px; + padding: 1px; + border: 0; + background: url("../images/close.png") no-repeat center center; + cursor: pointer; +} +.edui-modal-header .edui-close.edui-hover { + background-color: #d5e1f2; + padding:0; + border: 1px solid #a3bde3; +} +.edui-modal-header .edui-title { + margin: 0; + line-height: 25px; + font-size: 20px; +} +.edui-modal-body { + position: relative; + max-height: 400px; + font-size: 12px; + overflow-y: auto; +} +.edui-modal-footer { + float: right; + padding: 5px 15px 15px; + overflow: hidden; +} +.edui-modal-footer .edui-btn { + float: left; + height: 24px; + width: 96px; + margin: 0 10px; + background-color: #ffffff; + padding: 0; + border: 1px solid #ababab; + font-size: 12px; + line-height: 24px; + text-align: center; + cursor: pointer; +} +.edui-modal-footer .edui-btn.edui-hover{ + background-color: #d5e1f2; + border: 1px solid #a3bde3; +} +.edui-modal-backdrop{ + opacity: 0.5; + filter: alpha(opacity=50); + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #c6c6c6; +} + +.edui-modal .edui-modal-tip { + color: red; + position: absolute; + bottom: 10px; + left: 10px; + height: 30px; + line-height: 30px; + display: none; +} +/*图片上传*/ +.edui-dialog-image-body { + width: 700px; + height: 400px; +} +/*插入视频*/ +.edui-dialog-video-body{ + width: 600px; + height: 350px; +} +/*谷歌地图*/ +.edui-dialog-gmap-body{ + width:550px; + height: 400px; +} + +/*百度地图*/ +.edui-dialog-map-body{ + width:580px; + height: 400px; +} + +/*链接*/ +.edui-dialog-link-body{ + width:400px; + height:200px; +} +.edui-popup{ + display: none; + background: url('../images/pop-bg.png') repeat #fff; + padding: 2px; +} +.edui-popup .edui-popup-body{ + border: 1px solid #bfbfbf; + background-color: #fff; +} +.edui-popup .edui-popup-caret{ + width: 21px; + height: 11px; +} +.edui-popup .edui-popup-caret.up{ + background:url('../images/caret.png') no-repeat 0 0; +} +.edui-popup .edui-popup-caret.down{ + background:url('../images/caret.png') no-repeat 0 0; +} + + +.edui-tab-nav { + margin: 0; + padding:0; + border-bottom: 1px solid #ddd; + list-style: none; + height:30px; +} +.edui-tab-nav .edui-tab-item { + float:left; + margin-bottom: -1px; + margin-top: 1px; + margin-top: 0\9; +} +.edui-tab-nav .edui-tab-item .edui-tab-text{ + display: block; + padding:8px 12px; + border: 1px solid transparent; + color: #0088cc; + text-decoration: none; + outline: 0; + _border:1px solid #fff ; + cursor: pointer; +} +.edui-tab-nav .edui-tab-item .edui-tab-text:FOCUS { + outline: none; +} +.edui-tab-nav .edui-tab-item.edui-active .edui-tab-text{ + border: 1px solid #ddd; + border-bottom-color: transparent; + background-color: #fff; + padding:8px 12px; + color: #555555; + cursor: default; +} +.edui-tab-content .edui-tab-pane{ + padding: 1px; + position: relative; + display: none; + background-color: #fff; + clear: both; +} +.edui-tab-content .edui-tab-pane.edui-active{ + display: block; +} + + +.edui-btn-toolbar .edui-tooltip{ + position: absolute; + padding: 5px 0; + display: none; + /*opacity: 0.8;*/ + /*filter: alpha(opacity=80);*/ + z-index: 99999; +} +.edui-tooltip .edui-tooltip-arrow{ + position: absolute; + top: 0; + _top: -2px; + left: 50%; + width: 0; + height: 0; + padding: 0; + font-size:0; + margin-left: -5px; + border-color: transparent; + border-style: dashed dashed solid dashed; + border-bottom-color: #000000; + border-width: 0 5px 5px; + background: transparent; +} +.edui-tooltip .edui-tooltip-inner{ + padding: 6px; + color: #ffffff; + text-align: center; + text-decoration: none; + font-size: 10px; + background-color: #000000; + white-space: nowrap; + line-height: 12px; +} +.edui-splitbutton-color-label { + width: 16px; + height: 3px; + position: absolute; + bottom: 2px; + left: 50%; + margin-left: -8px; + overflow: hidden; + line-height: 3px; +} +.edui-popup .edui-colorpicker { + margin: 10px; + font-size: 12px; +} +.edui-colorpicker .edui-colorpicker-topbar{ + height: 27px; + width: 200px; + overflow: hidden; +} +.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-preview{ + height: 20px; + border: 1px inset black; + margin-left: 1px; + width: 128px; + float: left; +} +.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-nocolor{ + float: right; + margin-right: 1px; + font-size: 12px; + line-height: 14px; + height: 14px; + border: 1px solid #333; + padding: 3px 5px; + cursor: pointer; +} +.edui-colorpicker table{ + border-collapse: collapse; + border-spacing: 2px; +} +.edui-colorpicker tr.edui-colorpicker-firstrow{ + height: 30px; +} +.edui-colorpicker table td{ + padding: 0 2px; +} +.edui-colorpicker table td .edui-colorpicker-colorcell{ + display: block; + text-decoration: none; + color: black; + width: 14px; + height: 14px; + margin: 0; + cursor: pointer; +} +.edui-toolbar .edui-separator{ + width: 2px; + height: 20px; + padding: 1px 2px; + background: url(../images/icons.png) -179px 1px; + background: url(../images/icons.gif) -179px 1px \9; + display: inline-block ; + vertical-align: top; + *display: inline ; + *zoom:1; + border:none; + +} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/css/umeditor.min.css b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/css/umeditor.min.css new file mode 100644 index 0000000..1ff01d2 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/css/umeditor.min.css @@ -0,0 +1,8 @@ +/*! + * UEditor Mini版本 + * version: 1.2.2 + * build: Wed Mar 19 2014 17:14:25 GMT+0800 (中国标准时间) + */ + + +.edui-container{position:relative;border:1px solid #d4d4d4;box-shadow:2px 2px 5px #d3d6da;background-color:#fff}.edui-container .edui-toolbar{position:relative;width:auto;border-bottom:1px solid #e1e1e1;box-shadow:2px 2px 5px #d3d6da;background-color:#fafafa;z-index:99999}.edui-toolbar .edui-btn-toolbar{position:relative;padding:5px}.edui-container .edui-editor-body{background-color:#fff}.edui-editor-body .edui-body-container{}.edui-editor-body .edui-body-container p{margin:5px 0}.edui-editor-body .edui-body-container{border:0;outline:0;cursor:text;padding:0 10px;overflow:auto;display:block;word-wrap:break-word;font-size:16px;font-family:sans-serif}.edui-editor-body.focus{border:1px solid #5c9dff}.edui-editor-body table{margin:10px 0;border-collapse:collapse;display:table}.edui-editor-body td{padding:5px 10px;border:1px solid #DDD}.edui-editor-body iframe.mathquill-embedded-latex{border:0;padding:0;display:inline;margin:0;background:0 0;vertical-align:middle;width:0;height:0}.edui-btn-toolbar .edui-btn{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:auto;margin:0 1px;padding:1px;border:0;background:0 0}.edui-btn-toolbar .edui-btn .edui-icon{width:20px;height:20px;margin:0;padding:0;background-repeat:no-repeat;background-image:url(../images/icons.png);background-image:url(../images/icons.gif) \9}.edui-btn-toolbar .edui-btn.edui-hover,.edui-btn-toolbar .edui-btn.edui-active{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3;_z-index:1}.edui-btn-toolbar .edui-btn.edui-disabled{opacity:.3;filter:alpha(opacity=30)}.edui-btn-toolbar .edui-btn .edui-icon-source{background-position:-260px -0px}.edui-btn-toolbar .edui-btn .edui-icon-undo{background-position:-160px 0}.edui-btn-toolbar .edui-btn .edui-icon-redo{background-position:-100px 0}.edui-btn-toolbar .edui-btn .edui-icon-bold{background-position:0 0}.edui-btn-toolbar .edui-btn .edui-icon-italic{background-position:-60px 0}.edui-btn-toolbar .edui-btn .edui-icon-underline{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-strikethrough{background-position:-120px 0}.edui-btn-toolbar .edui-btn .edui-icon-superscript{background-position:-620px 0}.edui-btn-toolbar .edui-btn .edui-icon-subscript{background-position:-600px 0}.edui-btn-toolbar .edui-btn .edui-icon-font,.edui-btn-toolbar .edui-btn .edui-icon-forecolor{background-position:-720px 0}.edui-btn-toolbar .edui-btn .edui-icon-backcolor{background-position:-760px 0}.edui-btn-toolbar .edui-btn .edui-icon-insertorderedlist{background-position:-80px 0}.edui-btn-toolbar .edui-btn .edui-icon-insertunorderedlist{background-position:-20px 0}.edui-btn-toolbar .edui-btn .edui-icon-selectall{background-position:-400px -20px}.edui-btn-toolbar .edui-btn .edui-icon-cleardoc{background-position:-520px 0}.edui-btn-toolbar .edui-btn .edui-icon-paragraph{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-fontfamily{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-fontsize{background-position:-140px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyleft{background-position:-460px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifycenter{background-position:-420px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyright{background-position:-480px 0}.edui-btn-toolbar .edui-btn .edui-icon-justifyjustify{background-position:-440px 0}.edui-btn-toolbar .edui-btn .edui-icon-link{background-position:-500px 0}.edui-btn-toolbar .edui-btn .edui-icon-unlink{background-position:-640px 0}.edui-btn-toolbar .edui-btn .edui-icon-image{background-position:-380px 0}.edui-btn-toolbar .edui-btn .edui-icon-emotion{background-position:-60px -20px}.edui-btn-toolbar .edui-btn .edui-icon-video{background-position:-320px -20px}.edui-btn-toolbar .edui-btn .edui-icon-map{background-position:-40px -40px}.edui-btn-toolbar .edui-btn .edui-icon-gmap{background-position:-260px -40px}.edui-btn-toolbar .edui-btn .edui-icon-horizontal{background-position:-360px 0}.edui-btn-toolbar .edui-btn .edui-icon-print{background-position:-440px -20px}.edui-btn-toolbar .edui-btn .edui-icon-preview{background-position:-420px -20px}.edui-btn-toolbar .edui-btn-fullscreen{float:right}.edui-btn-toolbar .edui-btn .edui-icon-fullscreen{background-position:-100px -20px}.edui-btn-toolbar .edui-btn .edui-icon-removeformat{background-position:-580px 0}.edui-btn-toolbar .edui-btn .edui-icon-drafts{background-position:-560px 0}.edui-btn-toolbar .edui-btn .edui-icon-formula{background-position:-80px -20px}.edui-btn-toolbar .edui-splitbutton{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;margin:0 2px}.edui-splitbutton .edui-btn{margin:0}.edui-splitbutton .edui-caret{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:8px;height:20px;background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0}.edui-btn-toolbar .edui-splitbutton,.edui-btn-toolbar .edui-splitbutton{_border:0}.edui-btn-toolbar .edui-splitbutton.edui-hover .edui-btn{background-color:#d5e1f2}.edui-btn-toolbar .edui-splitbutton.edui-disabled{opacity:.3;filter:alpha(opacity=30)}.edui-btn-toolbar .edui-splitbutton.edui-disabled .edui-caret{opacity:.3 \0;filter:alpha(opacity=30)\0}.edui-btn-toolbar .edui-combobox{border:1px solid #CCC;padding:0;margin:0 2px;line-height:20px}.edui-combobox .edui-button-label{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;width:60px;height:20px;line-height:20px;padding:2px;margin:0;font-size:12px;text-align:center;cursor:default}.edui-combobox .edui-button-spacing{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;height:20px;margin:0;padding:0 3px}.edui-combobox .edui-caret{position:relative;display:inline-block;vertical-align:top;*display:inline;*zoom:1;height:20px;width:12px;margin:0;padding:0;background:url(../images/icons.png) -741px 0;_background:url(../images/icons.gif) -741px 0}.edui-btn-toolbar .edui-combobox.edui-disabled{opacity:.2;filter:alpha(opacity=20)}.edui-btn-toolbar .edui-combobox.edui-disabled .edui-button-label,.edui-btn-toolbar .edui-combobox.edui-disabled .edui-caret{opacity:.2 \0;filter:alpha(opacity=20)\0}.edui-combobox-menu{position:absolute;top:100%;left:0;display:none;list-style:none;text-decoration:none;margin:0;padding:5px;background-color:#fff;border:1px solid #ccc;font-size:12px;box-shadow:2px 2px 5px #d3d6da;min-width:160px;_width:160px}.edui-combobox-menu .edui-combobox-item{display:block;border:1px solid #fff}.edui-combobox-menu .edui-combobox-item-label{height:25px;line-height:25px;display:inline-block;_display:inline;_zoom:1;margin-left:10px}.edui-combobox-menu .edui-combobox-item:hover,.edui-combobox-menu .edui-combobox-stack-item:hover,.edui-combobox-menu .edui-combobox-item-hover{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3}.edui-combobox-menu .edui-combobox-item .edui-combobox-icon{display:inline-block;*zoom:1;*display:inline;width:24px;height:25px;background:red;vertical-align:bottom;background:url(../images/ok.gif) no-repeat 1000px 1000px}.edui-combobox-menu .edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-menu .edui-combobox-item-separator{min-width:160px;height:1px;line-height:1px;overflow:hidden;background:#d3d3d3;margin:5px 0;*margin-top:-8px}.edui-combobox-fontsize .edui-combobox-item-0.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-fontsize .edui-combobox-item-4 .edui-combobox-item-label{height:27px;line-height:27px}.edui-combobox-fontsize .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon{background-position:10px 5px}.edui-combobox-fontsize .edui-combobox-item-5 .edui-combobox-item-label{height:31px;line-height:31px}.edui-combobox-fontsize .edui-combobox-item-5.edui-combobox-checked .edui-combobox-icon{background-position:10px 4px}.edui-combobox-fontsize .edui-combobox-item-6 .edui-combobox-item-label{height:47px;line-height:47px}.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-item-label{font-size:32px;height:36px;line-height:36px}.edui-combobox-paragraph .edui-combobox-item-1 .edui-combobox-icon{height:25px;margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-1.edui-combobox-checked .edui-combobox-icon{background-position:10px 7px}.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-item-label{font-size:28px;height:27px;line-height:27px}.edui-combobox-paragraph .edui-combobox-item-2 .edui-combobox-icon{margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-2.edui-combobox-checked .edui-combobox-icon{background-position:10px 10px}.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-item-label{font-size:24px;height:25px;line-height:25px}.edui-combobox-paragraph .edui-combobox-item-3 .edui-combobox-icon{height:25px;margin-bottom:5px}.edui-combobox-paragraph .edui-combobox-item-3.edui-combobox-checked .edui-combobox-icon{background-position:10px 11px}.edui-combobox-paragraph .edui-combobox-item-4 .edui-combobox-item-label{font-size:18px;height:25px;line-height:25px}.edui-combobox-paragraph .edui-combobox-item-4.edui-combobox-checked .edui-combobox-icon{background-position:10px 6px}.edui-combobox-paragraph .edui-combobox-item-5 .edui-combobox-item-label{font-size:16px}.edui-combobox-paragraph .edui-combobox-item-6 .edui-combobox-item-label{font-size:12px}.edui-modal{position:fixed;_position:absolute;top:10%;left:50%;border:1px solid #acacac;box-shadow:2px 2px 5px #d3d6da;background-color:#fff;outline:0}.edui-modal-header{padding:5px 10px;border-bottom:1px solid #eee}.edui-modal-header .edui-close{float:right;width:20px;height:20px;margin-top:2px;padding:1px;border:0;background:url(../images/close.png) no-repeat center center;cursor:pointer}.edui-modal-header .edui-close.edui-hover{background-color:#d5e1f2;padding:0;border:1px solid #a3bde3}.edui-modal-header .edui-title{margin:0;line-height:25px;font-size:20px}.edui-modal-body{position:relative;max-height:400px;font-size:12px;overflow-y:auto}.edui-modal-footer{float:right;padding:5px 15px 15px;overflow:hidden}.edui-modal-footer .edui-btn{float:left;height:24px;width:96px;margin:0 10px;background-color:#fff;padding:0;border:1px solid #ababab;font-size:12px;line-height:24px;text-align:center;cursor:pointer}.edui-modal-footer .edui-btn.edui-hover{background-color:#d5e1f2;border:1px solid #a3bde3}.edui-modal-backdrop{opacity:.5;filter:alpha(opacity=50);position:fixed;top:0;right:0;bottom:0;left:0;background-color:#c6c6c6}.edui-modal .edui-modal-tip{color:red;position:absolute;bottom:10px;left:10px;height:30px;line-height:30px;display:none}.edui-dialog-image-body{width:700px;height:400px}.edui-dialog-video-body{width:600px;height:350px}.edui-dialog-gmap-body{width:550px;height:400px}.edui-dialog-map-body{width:580px;height:400px}.edui-dialog-link-body{width:400px;height:200px}.edui-popup{display:none;background:url(../images/pop-bg.png) repeat #fff;padding:2px}.edui-popup .edui-popup-body{border:1px solid #bfbfbf;background-color:#fff}.edui-popup .edui-popup-caret{width:21px;height:11px}.edui-popup .edui-popup-caret.up{background:url(../images/caret.png) no-repeat 0 0}.edui-popup .edui-popup-caret.down{background:url(../images/caret.png) no-repeat 0 0}.edui-tab-nav{margin:0;padding:0;border-bottom:1px solid #ddd;list-style:none;height:30px}.edui-tab-nav .edui-tab-item{float:left;margin-bottom:-1px;margin-top:1px;margin-top:0\9}.edui-tab-nav .edui-tab-item .edui-tab-text{display:block;padding:8px 12px;border:1px solid transparent;color:#08c;text-decoration:none;outline:0;_border:1px solid #fff;cursor:pointer}.edui-tab-nav .edui-tab-item .edui-tab-text:FOCUS{outline:0}.edui-tab-nav .edui-tab-item.edui-active .edui-tab-text{border:1px solid #ddd;border-bottom-color:transparent;background-color:#fff;padding:8px 12px;color:#555;cursor:default}.edui-tab-content .edui-tab-pane{padding:1px;position:relative;display:none;background-color:#fff;clear:both}.edui-tab-content .edui-tab-pane.edui-active{display:block}.edui-btn-toolbar .edui-tooltip{position:absolute;padding:5px 0;display:none;z-index:99999}.edui-tooltip .edui-tooltip-arrow{position:absolute;top:0;_top:-2px;left:50%;width:0;height:0;padding:0;font-size:0;margin-left:-5px;border-color:transparent;border-style:dashed dashed solid;border-bottom-color:#000;border-width:0 5px 5px;background:transparent}.edui-tooltip .edui-tooltip-inner{padding:6px;color:#fff;text-align:center;text-decoration:none;font-size:10px;background-color:#000;white-space:nowrap;line-height:12px}.edui-splitbutton-color-label{width:16px;height:3px;position:absolute;bottom:2px;left:50%;margin-left:-8px;overflow:hidden;line-height:3px}.edui-popup .edui-colorpicker{margin:10px;font-size:12px}.edui-colorpicker .edui-colorpicker-topbar{height:27px;width:200px;overflow:hidden}.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-preview{height:20px;border:1px inset #000;margin-left:1px;width:128px;float:left}.edui-colorpicker .edui-colorpicker-topbar .edui-colorpicker-nocolor{float:right;margin-right:1px;font-size:12px;line-height:14px;height:14px;border:1px solid #333;padding:3px 5px;cursor:pointer}.edui-colorpicker table{border-collapse:collapse;border-spacing:2px}.edui-colorpicker tr.edui-colorpicker-firstrow{height:30px}.edui-colorpicker table td{padding:0 2px}.edui-colorpicker table td .edui-colorpicker-colorcell{display:block;text-decoration:none;color:#000;width:14px;height:14px;margin:0;cursor:pointer}.edui-toolbar .edui-separator{width:2px;height:20px;padding:1px 2px;background:url(../images/icons.png) -179px 1px;background:url(../images/icons.gif) -179px 1px \9;display:inline-block;vertical-align:top;*display:inline;*zoom:1;border:0} \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/caret.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/caret.png new file mode 100644 index 0000000..cf06947 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/caret.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/close.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/close.png new file mode 100644 index 0000000..a57693f Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/close.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/icons.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/icons.gif new file mode 100644 index 0000000..8206560 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/icons.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/icons.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/icons.png new file mode 100644 index 0000000..de9a1bb Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/icons.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/ok.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/ok.gif new file mode 100644 index 0000000..9d1362c Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/ok.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/pop-bg.png b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/pop-bg.png new file mode 100644 index 0000000..d7a5a30 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/pop-bg.png differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/spacer.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/spacer.gif new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/spacer.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/videologo.gif b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/videologo.gif new file mode 100644 index 0000000..555af74 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/themes/default/images/videologo.gif differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.eot b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.eot new file mode 100644 index 0000000..0d10a95 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.eot differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.otf b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.otf new file mode 100644 index 0000000..d549563 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.otf differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.svg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.svg new file mode 100644 index 0000000..eff3111 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.svg @@ -0,0 +1,5102 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Designer : George Douros +Foundry : Free +Foundry URL : http://users.teilar.gr/_g1951d/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.ttf b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.ttf new file mode 100644 index 0000000..52337df Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.ttf differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.woff b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.woff new file mode 100644 index 0000000..b9bba23 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/Symbola.woff differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/STIXFontLicense2010.txt b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/STIXFontLicense2010.txt new file mode 100644 index 0000000..e6d9705 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/STIXFontLicense2010.txt @@ -0,0 +1,103 @@ +STIX Font License + +24 May 2010 + +Copyright (c) 2001-2010 by the STI Pub Companies, consisting of the American +Institute of Physics, the American Chemical Society, the American Mathematical +Society, the American Physical Society, Elsevier, Inc., and The Institute of +Electrical and Electronic Engineers, Inc. (www.stixfonts.org), with Reserved +Font Name STIX Fonts, STIX Fonts (TM) is a trademark of The Institute of +Electrical and Electronics Engineers, Inc. + +Portions copyright (c) 1998-2003 by MicroPress, Inc. (www.micropress-inc.com), +with Reserved Font Name TM Math. To obtain additional mathematical fonts, please +contact MicroPress, Inc., 68-30 Harrow Street, Forest Hills, NY 11375, USA, +Phone: (718) 575-1816. + +Portions copyright (c) 1990 by Elsevier, Inc. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +--------------------------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +--------------------------------------------------------------------------- + +PREAMBLE + +The goals of the Open Font License (OFL) are to stimulate worldwide development +of collaborative font projects, to support the font creation efforts of academic +and linguistic communities, and to provide a free and open framework in which +fonts may be shared and improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and redistributed +freely as long as they are not sold by themselves. The fonts, including any +derivative works, can be bundled, embedded, redistributed and/or sold with any +software provided that any reserved names are not used by derivative works. The +fonts and derivatives, however, cannot be released under any other type of license. +The requirement for fonts to remain under this license does not apply to any +document created using the fonts or their derivatives. + +DEFINITIONS + +"Font Software" refers to the set of files released by the Copyright Holder(s) under +this license and clearly marked as such. This may include source files, build +scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the copyright +statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, or +substituting -- in part or in whole -- any of the components of the Original Version, +by changing formats or by porting the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical writer or other +person who contributed to the Font Software. + +PERMISSION & CONDITIONS + +Permission is hereby granted, free of charge, to any person obtaining a copy of the +Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell +modified and unmodified copies of the Font Software, subject to the following +conditions: + +1) Neither the Font Software nor any of its individual components, in Original or +Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, redistributed +and/or sold with any software, provided that each copy contains the above copyright +notice and this license. These can be included either as stand-alone text files, +human-readable headers or in the appropriate machine-readable metadata fields within +text or binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless +explicit written permission is granted by the corresponding Copyright Holder. This +restriction only applies to the primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall +not be used to promote, endorse or advertise any Modified Version, except to +acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with +their explicit written permission. + +5) The Font Software, modified or unmodified, in part or in whole, must be distributed +entirely under this license, and must not be distributed under any other license. The +requirement for fonts to remain under this license does not apply to any document +created using the Font Software. + +TERMINATION + +This license becomes null and void if any of the above conditions are not met. + +DISCLAIMER + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER +RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR +INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.eot b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.eot new file mode 100644 index 0000000..7fb79c7 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.eot differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.svg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.svg new file mode 100644 index 0000000..d5a38c9 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.svg @@ -0,0 +1,3318 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Designer : MicroPress Inc., with final additions and corrections provided by Coen Hoffman, Elsevier (retired) +Foundry URL : http://www.stixfonts.org + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.ttf b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.ttf new file mode 100644 index 0000000..1559670 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.ttf differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.woff b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.woff new file mode 100644 index 0000000..c18a5b1 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneral-webfont.woff differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.eot b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.eot new file mode 100644 index 0000000..c2523d8 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.eot differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.svg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.svg new file mode 100644 index 0000000..c724882 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.svg @@ -0,0 +1,1738 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Designer : MicroPress Inc., with final additions and corrections provided by Coen Hoffman, Elsevier (retired) +Foundry URL : http://www.stixfonts.org + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.ttf b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.ttf new file mode 100644 index 0000000..837445a Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.ttf differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.woff b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.woff new file mode 100644 index 0000000..a7b6468 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbol-webfont.woff differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.eot b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.eot new file mode 100644 index 0000000..96db677 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.eot differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.svg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.svg new file mode 100644 index 0000000..5175320 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.svg @@ -0,0 +1,1137 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Designer : MicroPress Inc., with final additions and corrections provided by Coen Hoffman, Elsevier (retired) +Foundry URL : http://www.stixfonts.org + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.ttf b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.ttf new file mode 100644 index 0000000..6b8c251 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.ttf differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.woff b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.woff new file mode 100644 index 0000000..63a6f8e Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralbolita-webfont.woff differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.eot b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.eot new file mode 100644 index 0000000..3573ca1 Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.eot differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.svg b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.svg new file mode 100644 index 0000000..295068d --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.svg @@ -0,0 +1,1089 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Designer : MicroPress Inc., with final additions and corrections provided by Coen Hoffman, Elsevier (retired) +Foundry URL : http://www.stixfonts.org + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.ttf b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.ttf new file mode 100644 index 0000000..256bf6c Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.ttf differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.woff b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.woff new file mode 100644 index 0000000..c6d5aae Binary files /dev/null and b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/font/stixgeneral-bundle/stixgeneralitalic-webfont.woff differ diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/mathquill.css b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/mathquill.css new file mode 100644 index 0000000..adf27ea --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/mathquill.css @@ -0,0 +1,357 @@ +/* + * LaTeX Math in pure HTML and CSS -- No images whatsoever + * v0.xa + * by Jay and Han + * Lesser GPL Licensed: http: //www.gnu.org/licenses/lgpl.html + * + * This file is automatically included by mathquill.js + * + */ +@font-face { + font-family: Symbola; + src: url(font/Symbola.eot); + src: local("Symbola Regular"), local("Symbola"), url(font/Symbola.ttf) format("truetype"), url(font/Symbola.otf) format("opentype"), url(font/Symbola.svg#Symbola) format("svg"); +} +.mathquill-editable { + display: -moz-inline-box; + display: inline-block; + white-space: pre-wrap; +} +.mathquill-editable .cursor { + border-left: 1px solid black; + margin-right: -1px; + position: relative; + z-index: 1; + padding: 0; + display: -moz-inline-box; + display: inline-block; +} +.mathquill-editable .cursor.blink { + visibility: hidden; +} +.mathquill-editable, +.mathquill-embedded-latex .mathquill-editable { + border: 1px solid gray; + padding: 2px; +} +.mathquill-embedded-latex .mathquill-editable { + margin: 1px; +} +.mathquill-editable.hasCursor, +.mathquill-editable .hasCursor { + -webkit-box-shadow: #68b4df 0 0 3px 2px; + -moz-box-shadow: #68b4df 0 0 3px 2px; + box-shadow: #68b4df 0 0 3px 2px; +} +.mathquill-editable .latex-command-input { + color: inherit; + font-family: "Courier New", monospace; + border: 1px solid gray; + padding-right: 1px; + margin-right: 1px; + margin-left: 2px; +} +.mathquill-editable .latex-command-input.empty { + background: transparent; +} +.mathquill-editable .latex-command-input.hasCursor { + border-color: ActiveBorder; +} +.mathquill-editable.empty:after, +.mathquill-textbox:after, +.mathquill-rendered-math .empty:after { + visibility: hidden; + content: 'c'; +} +.mathquill-editable .cursor:only-child:after, +.mathquill-editable .textarea + .cursor:last-child:after { + visibility: hidden; + content: 'c'; +} +.mathquill-textbox { + overflow-x: auto; + overflow-y: hidden; +} +.mathquill-rendered-math { + font-variant: normal; + font-weight: normal; + font-style: normal; + font-size: 115%; + line-height: 1; + display: -moz-inline-box; + display: inline-block; +} +.mathquill-rendered-math .non-leaf, +.mathquill-rendered-math .scaled { + display: -moz-inline-box; + display: inline-block; +} +.mathquill-rendered-math var, +.mathquill-rendered-math .text, +.mathquill-rendered-math .nonSymbola { + font-family: "Times New Roman", Symbola, serif; + line-height: .9; +} +.mathquill-rendered-math * { + font-size: inherit; + line-height: inherit; + margin: 0; + padding: 0; + border-color: black; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mathquill-rendered-math .empty { + background: #ccc; +} +.mathquill-rendered-math.empty { + background: transparent; +} +.mathquill-rendered-math .text { + font-size: 87%; +} +.mathquill-rendered-math .font { + font: 1em "Times New Roman", Symbola, serif; +} +.mathquill-rendered-math .font * { + font-family: inherit; + font-style: inherit; +} +.mathquill-rendered-math b, +.mathquill-rendered-math b.font { + font-weight: bolder; +} +.mathquill-rendered-math var, +.mathquill-rendered-math i, +.mathquill-rendered-math i.font { + font-syle: italic; +} +.mathquill-rendered-math var.florin { + margin: 0 -0.1em; +} +.mathquill-rendered-math big { + font-size: 125%; +} +.mathquill-rendered-math .roman { + font-style: normal; +} +.mathquill-rendered-math .sans-serif { + font-family: sans-serif, Symbola, serif; +} +.mathquill-rendered-math .monospace { + font-family: monospace, Symbola, serif; +} +.mathquill-rendered-math .overline { + border-top: 1px solid black; + margin-top: 1px; +} +.mathquill-rendered-math .underline { + border-bottom: 1px solid black; + margin-bottom: 1px; +} +.mathquill-rendered-math .binary-operator { + padding: 0 0.2em; + display: -moz-inline-box; + display: inline-block; +} +.mathquill-rendered-math .unary-operator { + padding-left: 0.2em; +} +.mathquill-rendered-math sup, +.mathquill-rendered-math sub { + position: relative; + font-size: 90%; +} +.mathquill-rendered-math sup .binary-operator, +.mathquill-rendered-math sub .binary-operator { + padding: 0 .1em; +} +.mathquill-rendered-math sup .unary-operator, +.mathquill-rendered-math sub .unary-operator { + padding-left: .1em; +} +.mathquill-rendered-math sup.limit, +.mathquill-rendered-math sub.limit, +.mathquill-rendered-math sup.nthroot, +.mathquill-rendered-math sub.nthroot { + font-size: 80%; +} +.mathquill-rendered-math sup .fraction, +.mathquill-rendered-math sub .fraction { + font-size: 70%; + vertical-align: -0.4em; +} +.mathquill-rendered-math sup .numerator, +.mathquill-rendered-math sub .numerator { + padding-bottom: 0; +} +.mathquill-rendered-math sup .denominator, +.mathquill-rendered-math sub .denominator { + padding-top: 0; +} +.mathquill-rendered-math sup { + vertical-align: .5em; +} +.mathquill-rendered-math sup.limit, +.mathquill-rendered-math sup.nthroot { + vertical-align: 0.8em; +} +.mathquill-rendered-math sup.nthroot { + margin-right: -0.6em; + margin-left: .2em; + min-width: .5em; +} +.mathquill-rendered-math sub { + vertical-align: -0.4em; +} +.mathquill-rendered-math sub.limit { + vertical-align: -0.6em; +} +.mathquill-rendered-math .paren { + padding: 0 .1em; + vertical-align: bottom; + -webkit-transform-origin: bottom center; + -moz-transform-origin: bottom center; + -ms-transform-origin: bottom center; + -o-transform-origin: bottom center; + transform-origin: bottom center; +} +.mathquill-rendered-math .array { + vertical-align: middle; + text-align: center; +} +.mathquill-rendered-math .array > span { + display: block; +} +.mathquill-rendered-math .non-italicized-function { + font-family: Symbola, "Times New Roman", serif; + line-height: .9; + font-style: normal; + padding-right: .2em; +} +.mathquill-rendered-math .fraction { + font-size: 90%; + text-align: center; + vertical-align: -0.5em; + padding: 0 .2em; +} +.mathquill-rendered-math .fraction, +.mathquill-rendered-math x:-moz-any-link { + display: -moz-groupbox; +} +.mathquill-rendered-math .fraction, +.mathquill-rendered-math x:-moz-any-link, +.mathquill-rendered-math x:default { + display: inline-block; +} +.mathquill-rendered-math .numerator, +.mathquill-rendered-math .denominator { + display: block; +} +.mathquill-rendered-math .numerator { + padding: 0 0.1em; + margin-bottom: -0.1em; +} +.mathquill-rendered-math .denominator { + border-top: 1px solid; + float: right; + width: 100%; + padding: .1em .1em 0 .1em; + margin-right: -0.1em; + margin-left: -0.1em; +} +.mathquill-rendered-math .sqrt-prefix { + padding-top: 0; + position: relative; + top: .1em; + vertical-align: top; + -webkit-transform-origin: top; + -moz-transform-origin: top; + -ms-transform-origin: top; + -o-transform-origin: top; + transform-origin: top; +} +.mathquill-rendered-math .sqrt-stem { + border-top: 1px solid; + margin-top: 1px; + padding-left: .15em; + padding-right: .2em; + margin-right: .1em; +} +.mathquill-rendered-math .vector-prefix { + display: block; + text-align: center; + line-height: .25em; + margin-bottom: -0.1em; + font-size: 0.75em; +} +.mathquill-rendered-math .vector-stem { + display: block; +} +.mathquill-rendered-math, +.mathquill-rendered-math .mathquill-editable { + cursor: text; + font-family: Symbola, "Times New Roman", serif; +} +.mathquill-rendered-math .selection, +.mathquill-editable .selection, +.mathquill-rendered-math .selection .non-leaf, +.mathquill-editable .selection .non-leaf, +.mathquill-rendered-math .selection .scaled, +.mathquill-editable .selection .scaled { + background: #B4D5FE !important; + background: Highlight !important; + color: HighlightText; + border-color: HighlightText; +} +.mathquill-rendered-math .selection .matrixed, +.mathquill-editable .selection .matrixed { + background: #39F !important; +} +.mathquill-rendered-math .selection .matrixed-container, +.mathquill-editable .selection .matrixed-container { + filter: progid:DXImageTransform.Microsoft.Chroma(color='#3399FF') !important; +} +.mathquill-rendered-math .selection.blur, +.mathquill-editable .selection.blur, +.mathquill-rendered-math .selection.blur .non-leaf, +.mathquill-editable .selection.blur .non-leaf, +.mathquill-rendered-math .selection.blur .scaled, +.mathquill-editable .selection.blur .scaled, +.mathquill-rendered-math .selection.blur .matrixed, +.mathquill-editable .selection.blur .matrixed { + background: #D4D4D4 !important; + color: black; + border-color: black; +} +.mathquill-rendered-math .selection.blur .matrixed-container, +.mathquill-editable .selection.blur .matrixed-container { + filter: progid:DXImageTransform.Microsoft.Chroma(color='#D4D4D4') !important; +} +.mathquill-editable .textarea, +.mathquill-rendered-math .textarea { + position: relative; + -webkit-user-select: text; + -moz-user-select: text; + user-select: text; +} +.mathquill-editable .textarea textarea, +.mathquill-rendered-math .textarea textarea, +.mathquill-editable .selectable, +.mathquill-rendered-math .selectable { + -webkit-user-select: text; + -moz-user-select: text; + user-select: text; + position: absolute; + clip: rect(1em 1em 1em 1em); +} +.mathquill-rendered-math .matrixed { + background: white; + display: -moz-inline-box; + display: inline-block; +} +.mathquill-rendered-math .matrixed-container { + filter: progid:DXImageTransform.Microsoft.Chroma(color='white'); + margin-top: -0.1em; +} diff --git a/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/mathquill.js b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/mathquill.js new file mode 100644 index 0000000..5c8b991 --- /dev/null +++ b/asset/thirdlib/CECT54.WebUI/plugins/umeditor/third-party/mathquill/mathquill.js @@ -0,0 +1,3888 @@ +/** + * Copyleft 2010-2011 Jay and Han (laughinghan@gmail.com) + * under the GNU Lesser General Public License + * http://www.gnu.org/licenses/lgpl.html + * Project Website: http://mathquill.com + */ + +(function() { + +var jQuery = window.jQuery, + undefined, + _, //temp variable of prototypes + mqCmdId = 'mathquill-command-id', + mqBlockId = 'mathquill-block-id', + min = Math.min, + max = Math.max; + +var __slice = [].slice; + +function noop() {} + +/** + * sugar to make defining lots of commands easier. + * TODO: rethink this. + */ +function bind(cons /*, args... */) { + var args = __slice.call(arguments, 1); + return function() { + return cons.apply(this, args); + }; +} + +/** + * a development-only debug method. This definition and all + * calls to `pray` will be stripped from the minified + * build of mathquill. + * + * This function must be called by name to be removed + * at compile time. Do not define another function + * with the same name, and only call this function by + * name. + */ +function pray(message, cond) { + if (!cond) throw new Error('prayer failed: '+message); +} +var P = (function(prototype, ownProperty, undefined) { + // helper functions that also help minification + function isObject(o) { return typeof o === 'object'; } + function isFunction(f) { return typeof f === 'function'; } + + // a function that gets reused to make uninitialized objects + function BareConstructor() {} + + function P(_superclass /* = Object */, definition) { + // handle the case where no superclass is given + if (definition === undefined) { + definition = _superclass; + _superclass = Object; + } + + // C is the class to be returned. + // + // It delegates to instantiating an instance of `Bare`, so that it + // will always return a new instance regardless of the calling + // context. + // + // TODO: the Chrome inspector shows all created objects as `C` + // rather than `Object`. Setting the .name property seems to + // have no effect. Is there a way to override this behavior? + function C() { + var self = new Bare; + if (isFunction(self.init)) self.init.apply(self, arguments); + return self; + } + + // C.Bare is a class with a noop constructor. Its prototype is the + // same as C, so that instances of C.Bare are also instances of C. + // New objects can be allocated without initialization by calling + // `new MyClass.Bare`. + function Bare() {} + C.Bare = Bare; + + // Set up the prototype of the new class. + var _super = BareConstructor[prototype] = _superclass[prototype]; + var proto = Bare[prototype] = C[prototype] = new BareConstructor; + + // other variables, as a minifier optimization + var extensions; + + + // set the constructor property on the prototype, for convenience + proto.constructor = C; + + C.mixin = function(def) { + Bare[prototype] = C[prototype] = P(C, def)[prototype]; + return C; + } + + return (C.open = function(def) { + extensions = {}; + + if (isFunction(def)) { + // call the defining function with all the arguments you need + // extensions captures the return value. + extensions = def.call(C, proto, _super, C, _superclass); + } + else if (isObject(def)) { + // if you passed an object instead, we'll take it + extensions = def; + } + + // ...and extend it + if (isObject(extensions)) { + for (var ext in extensions) { + if (ownProperty.call(extensions, ext)) { + proto[ext] = extensions[ext]; + } + } + } + + // if there's no init, we assume we're inheriting a non-pjs class, so + // we default to applying the superclass's constructor. + if (!isFunction(proto.init)) { + proto.init = _superclass; + } + + return C; + })(definition); + } + + // ship it + return P; + + // as a minifier optimization, we've closured in a few helper functions + // and the string 'prototype' (C[p] is much shorter than C.prototype) +})('prototype', ({}).hasOwnProperty); +/************************************************* + * Textarea Manager + * + * An abstraction layer wrapping the textarea in + * an object with methods to manipulate and listen + * to events on, that hides all the nasty cross- + * browser incompatibilities behind a uniform API. + * + * Design goal: This is a *HARD* internal + * abstraction barrier. Cross-browser + * inconsistencies are not allowed to leak through + * and be dealt with by event handlers. All future + * cross-browser issues that arise must be dealt + * with here, and if necessary, the API updated. + * + * Organization: + * - key values map and stringify() + * - manageTextarea() + * + defer() and flush() + * + event handler logic + * + attach event handlers and export methods + ************************************************/ + +var manageTextarea = (function() { + // The following [key values][1] map was compiled from the + // [DOM3 Events appendix section on key codes][2] and + // [a widely cited report on cross-browser tests of key codes][3], + // except for 10: 'Enter', which I've empirically observed in Safari on iOS + // and doesn't appear to conflict with any other known key codes. + // + // [1]: http://www.w3.org/TR/2012/WD-DOM-Level-3-Events-20120614/#keys-keyvalues + // [2]: http://www.w3.org/TR/2012/WD-DOM-Level-3-Events-20120614/#fixed-virtual-key-codes + // [3]: http://unixpapa.com/js/key.html + var KEY_VALUES = { + 8: 'Backspace', + 9: 'Tab', + + 10: 'Enter', // for Safari on iOS + + 13: 'Enter', + + 16: 'Shift', + 17: 'Control', + 18: 'Alt', + 20: 'CapsLock', + + 27: 'Esc', + + 32: 'Spacebar', + + 33: 'PageUp', + 34: 'PageDown', + 35: 'End', + 36: 'Home', + + 37: 'Left', + 38: 'Up', + 39: 'Right', + 40: 'Down', + + 45: 'Insert', + + 46: 'Del', + + 144: 'NumLock' + }; + + // To the extent possible, create a normalized string representation + // of the key combo (i.e., key code and modifier keys). + function stringify(evt) { + var which = evt.which || evt.keyCode; + var keyVal = KEY_VALUES[which]; + var key; + var modifiers = []; + + if (evt.ctrlKey) modifiers.push('Ctrl'); + if (evt.originalEvent && evt.originalEvent.metaKey) modifiers.push('Meta'); + if (evt.altKey) modifiers.push('Alt'); + if (evt.shiftKey) modifiers.push('Shift'); + + key = keyVal || String.fromCharCode(which); + + if (!modifiers.length && !keyVal) return key; + + modifiers.push(key); + return modifiers.join('-'); + } + + // create a textarea manager that calls callbacks at useful times + // and exports useful public methods + return function manageTextarea(el, opts) { + var keydown = null; + var keypress = null; + + if (!opts) opts = {}; + var textCallback = opts.text || noop; + var keyCallback = opts.key || noop; + var pasteCallback = opts.paste || noop; + var onCut = opts.cut || noop; + + var textarea = jQuery(el); + var target = jQuery(opts.container || textarea); + + // checkTextareaFor() is called after keypress or paste events to + // say "Hey, I think something was just typed" or "pasted" (resp.), + // so that at all subsequent opportune times (next event or timeout), + // will check for expected typed or pasted text. + // Need to check repeatedly because #135: in Safari 5.1 (at least), + // after selecting something and then typing, the textarea is + // incorrectly reported as selected during the input event (but not + // subsequently). + var checkTextarea = noop, timeoutId; + function checkTextareaFor(checker) { + checkTextarea = checker; + clearTimeout(timeoutId); + timeoutId = setTimeout(checker); + } + target.bind('keydown keypress input keyup focusout paste', function() { checkTextarea(); }); + + + // -*- public methods -*- // + function select(text) { + // check textarea at least once/one last time before munging (so + // no race condition if selection happens after keypress/paste but + // before checkTextarea), then never again ('cos it's been munged) + checkTextarea(); + checkTextarea = noop; + clearTimeout(timeoutId); + + textarea.val(text); + if (text) textarea[0].select(); + } + + // -*- helper subroutines -*- // + + // Determine whether there's a selection in the textarea. + // This will always return false in IE < 9, which don't support + // HTMLTextareaElement::selection{Start,End}. + function hasSelection() { + var dom = textarea[0]; + + if (!('selectionStart' in dom)) return false; + return dom.selectionStart !== dom.selectionEnd; + } + + function popText(callback) { + var text = textarea.val(); + textarea.val(''); + if (text) callback(text); + } + + function handleKey() { + keyCallback(stringify(keydown), keydown); + } + + // -*- event handlers -*- // + function onKeydown(e) { + keydown = e; + keypress = null; + + handleKey(); + } + + function onKeypress(e) { + // call the key handler for repeated keypresses. + // This excludes keypresses that happen directly + // after keydown. In that case, there will be + // no previous keypress, so we skip it here + if (keydown && keypress) handleKey(); + + keypress = e; + + checkTextareaFor(typedText); + } + function typedText() { + // If there is a selection, the contents of the textarea couldn't + // possibly have just been typed in. + // This happens in browsers like Firefox and Opera that fire + // keypress for keystrokes that are not text entry and leave the + // selection in the textarea alone, such as Ctrl-C. + // Note: we assume that browsers that don't support hasSelection() + // also never fire keypress on keystrokes that are not text entry. + // This seems reasonably safe because: + // - all modern browsers including IE 9+ support hasSelection(), + // making it extremely unlikely any browser besides IE < 9 won't + // - as far as we know IE < 9 never fires keypress on keystrokes + // that aren't text entry, which is only as reliable as our + // tests are comprehensive, but the IE < 9 way to do + // hasSelection() is poorly documented and is also only as + // reliable as our tests are comprehensive + // If anything like #40 or #71 is reported in IE < 9, see + // b1318e5349160b665003e36d4eedd64101ceacd8 + if (hasSelection()) return; + + popText(textCallback); + } + + function onBlur() { keydown = keypress = null; } + + function onPaste(e) { + // browsers are dumb. + // + // In Linux, middle-click pasting causes onPaste to be called, + // when the textarea is not necessarily focused. We focus it + // here to ensure that the pasted text actually ends up in the + // textarea. + // + // It's pretty nifty that by changing focus in this handler, + // we can change the target of the default action. (This works + // on keydown too, FWIW). + // + // And by nifty, we mean dumb (but useful sometimes). + textarea.focus(); + + checkTextareaFor(pastedText); + } + function pastedText() { + popText(pasteCallback); + } + + // -*- attach event handlers -*- // + target.bind({ + keydown: onKeydown, + keypress: onKeypress, + focusout: onBlur, + cut: onCut, + paste: onPaste + }); + + // -*- export public methods -*- // + return { + select: select + }; + }; +}()); +var Parser = P(function(_, _super, Parser) { + // The Parser object is a wrapper for a parser function. + // Externally, you use one to parse a string by calling + // var result = SomeParser.parse('Me Me Me! Parse Me!'); + // You should never call the constructor, rather you should + // construct your Parser from the base parsers and the + // parser combinator methods. + + function parseError(stream, message) { + if (stream) { + stream = "'"+stream+"'"; + } + else { + stream = 'EOF'; + } + + throw 'Parse Error: '+message+' at '+stream; + } + + _.init = function(body) { this._ = body; }; + + _.parse = function(stream) { + return this.skip(eof)._(stream, success, parseError); + + function success(stream, result) { return result; } + }; + + // -*- primitive combinators -*- // + _.or = function(alternative) { + pray('or is passed a parser', alternative instanceof Parser); + + var self = this; + + return Parser(function(stream, onSuccess, onFailure) { + return self._(stream, onSuccess, failure); + + function failure(newStream) { + return alternative._(stream, onSuccess, onFailure); + } + }); + }; + + _.then = function(next) { + var self = this; + + return Parser(function(stream, onSuccess, onFailure) { + return self._(stream, success, onFailure); + + function success(newStream, result) { + var nextParser = (next instanceof Parser ? next : next(result)); + pray('a parser is returned', nextParser instanceof Parser); + return nextParser._(newStream, onSuccess, onFailure); + } + }); + }; + + // -*- optimized iterative combinators -*- // + _.many = function() { + var self = this; + + return Parser(function(stream, onSuccess, onFailure) { + var xs = []; + while (self._(stream, success, failure)); + return onSuccess(stream, xs); + + function success(newStream, x) { + stream = newStream; + xs.push(x); + return true; + } + + function failure() { + return false; + } + }); + }; + + _.times = function(min, max) { + if (arguments.length < 2) max = min; + var self = this; + + return Parser(function(stream, onSuccess, onFailure) { + var xs = []; + var result = true; + var failure; + + for (var i = 0; i < min; i += 1) { + result = self._(stream, success, firstFailure); + if (!result) return onFailure(stream, failure); + } + + for (; i < max && result; i += 1) { + result = self._(stream, success, secondFailure); + } + + return onSuccess(stream, xs); + + function success(newStream, x) { + xs.push(x); + stream = newStream; + return true; + } + + function firstFailure(newStream, msg) { + failure = msg; + stream = newStream; + return false; + } + + function secondFailure(newStream, msg) { + return false; + } + }); + }; + + // -*- higher-level combinators -*- // + _.result = function(res) { return this.then(succeed(res)); }; + _.atMost = function(n) { return this.times(0, n); }; + _.atLeast = function(n) { + var self = this; + return self.times(n).then(function(start) { + return self.many().map(function(end) { + return start.concat(end); + }); + }); + }; + + _.map = function(fn) { + return this.then(function(result) { return succeed(fn(result)); }); + }; + + _.skip = function(two) { + return this.then(function(result) { return two.result(result); }); + }; + + // -*- primitive parsers -*- // + var string = this.string = function(str) { + var len = str.length; + var expected = "expected '"+str+"'"; + + return Parser(function(stream, onSuccess, onFailure) { + var head = stream.slice(0, len); + + if (head === str) { + return onSuccess(stream.slice(len), head); + } + else { + return onFailure(stream, expected); + } + }); + }; + + var regex = this.regex = function(re) { + pray('regexp parser is anchored', re.toString().charAt(1) === '^'); + + var expected = 'expected '+re; + + return Parser(function(stream, onSuccess, onFailure) { + var match = re.exec(stream); + + if (match) { + var result = match[0]; + return onSuccess(stream.slice(result.length), result); + } + else { + return onFailure(stream, expected); + } + }); + }; + + var succeed = Parser.succeed = function(result) { + return Parser(function(stream, onSuccess) { + return onSuccess(stream, result); + }); + }; + + var fail = Parser.fail = function(msg) { + return Parser(function(stream, _, onFailure) { + return onFailure(stream, msg); + }); + }; + + var letter = Parser.letter = regex(/^[a-z]/i); + var letters = Parser.letters = regex(/^[a-z]*/i); + var digit = Parser.digit = regex(/^[0-9]/); + var digits = Parser.digits = regex(/^[0-9]*/); + var whitespace = Parser.whitespace = regex(/^\s+/); + var optWhitespace = Parser.optWhitespace = regex(/^\s*/); + + var any = Parser.any = Parser(function(stream, onSuccess, onFailure) { + if (!stream) return onFailure(stream, 'expected any character'); + + return onSuccess(stream.slice(1), stream.charAt(0)); + }); + + var all = Parser.all = Parser(function(stream, onSuccess, onFailure) { + return onSuccess('', stream); + }); + + var eof = Parser.eof = Parser(function(stream, onSuccess, onFailure) { + if (stream) return onFailure(stream, 'expected EOF'); + + return onSuccess(stream, stream); + }); +}); +/************************************************* + * Base classes of the MathQuill virtual DOM tree + * + * Only doing tree node manipulation via these + * adopt/ disown methods guarantees well-formedness + * of the tree. + ************************************************/ + +// L = 'left' +// R = 'right' +// +// the contract is that they can be used as object properties +// and (-L) === R, and (-R) === L. +var L = -1; +var R = 1; + +function prayDirection(dir) { + pray('a direction was passed', dir === L || dir === R); +} + +/** + * Tiny extension of jQuery adding directionalized DOM manipulation methods. + * + * Funny how Pjs v3 almost just works with `jQuery.fn.init`. + * + * jQuery features that don't work on $: + * - jQuery.*, like jQuery.ajax, obviously (Pjs doesn't and shouldn't + * copy constructor properties) + * + * - jQuery(function), the shortcut for `jQuery(document).ready(function)`, + * because `jQuery.fn.init` is idiosyncratic and Pjs doing, essentially, + * `jQuery.fn.init.apply(this, arguments)` isn't quite right, you need: + * + * _.init = function(s, c) { jQuery.fn.init.call(this, s, c, $(document)); }; + * + * if you actually give a shit (really, don't bother), + * see https://github.com/jquery/jquery/blob/1.7.2/src/core.js#L889 + * + * - jQuery(selector), because jQuery translates that to + * `jQuery(document).find(selector)`, but Pjs doesn't (should it?) let + * you override the result of a constructor call + * + note that because of the jQuery(document) shortcut-ness, there's also + * the 3rd-argument-needs-to-be-`$(document)` thing above, but the fix + * for that (as can be seen above) is really easy. This problem requires + * a way more intrusive fix + * + * And that's it! Everything else just magically works because jQuery internally + * uses `this.constructor()` everywhere (hence calling `$`), but never ever does + * `this.constructor.find` or anything like that, always doing `jQuery.find`. + */ +var $ = P(jQuery, function(_) { + _.insDirOf = function(dir, el) { + return dir === L ? + this.insertBefore(el.first()) : this.insertAfter(el.last()); + }; + _.insAtDirEnd = function(dir, el) { + return dir === L ? this.prependTo(el) : this.appendTo(el); + }; +}); + +var Point = P(function(_) { + _.parent = 0; + _[L] = 0; + _[R] = 0; + + _.init = function(parent, leftward, rightward) { + this.parent = parent; + this[L] = leftward; + this[R] = rightward; + }; +}); + +/** + * MathQuill virtual-DOM tree-node abstract base class + */ +var Node = P(function(_) { + _[L] = 0; + _[R] = 0 + _.parent = 0; + + _.init = function() { + this.ends = {}; + this.ends[L] = 0; + this.ends[R] = 0; + }; + + _.children = function() { + return Fragment(this.ends[L], this.ends[R]); + }; + + _.eachChild = function(fn) { + return this.children().each(fn); + }; + + _.foldChildren = function(fold, fn) { + return this.children().fold(fold, fn); + }; + + _.adopt = function(parent, leftward, rightward) { + Fragment(this, this).adopt(parent, leftward, rightward); + return this; + }; + + _.disown = function() { + Fragment(this, this).disown(); + return this; + }; +}); + +/** + * An entity outside the virtual tree with one-way pointers (so it's only a + * "view" of part of the tree, not an actual node/entity in the tree) that + * delimits a doubly-linked list of sibling nodes. + * It's like a fanfic love-child between HTML DOM DocumentFragment and the Range + * classes: like DocumentFragment, its contents must be sibling nodes + * (unlike Range, whose contents are arbitrary contiguous pieces of subtrees), + * but like Range, it has only one-way pointers to its contents, its contents + * have no reference to it and in fact may still be in the visible tree (unlike + * DocumentFragment, whose contents must be detached from the visible tree + * and have their 'parent' pointers set to the DocumentFragment). + */ +var Fragment = P(function(_) { + _.init = function(leftEnd, rightEnd) { + pray('no half-empty fragments', !leftEnd === !rightEnd); + + this.ends = {}; + + if (!leftEnd) return; + + pray('left end node is passed to Fragment', leftEnd instanceof Node); + pray('right end node is passed to Fragment', rightEnd instanceof Node); + pray('leftEnd and rightEnd have the same parent', + leftEnd.parent === rightEnd.parent); + + this.ends[L] = leftEnd; + this.ends[R] = rightEnd; + }; + + function prayWellFormed(parent, leftward, rightward) { + pray('a parent is always present', parent); + pray('leftward is properly set up', (function() { + // either it's empty and `rightward` is the left end child (possibly empty) + if (!leftward) return parent.ends[L] === rightward; + + // or it's there and its [R] and .parent are properly set up + return leftward[R] === rightward && leftward.parent === parent; + })()); + + pray('rightward is properly set up', (function() { + // either it's empty and `leftward` is the right end child (possibly empty) + if (!rightward) return parent.ends[R] === leftward; + + // or it's there and its [L] and .parent are properly set up + return rightward[L] === leftward && rightward.parent === parent; + })()); + } + + _.adopt = function(parent, leftward, rightward) { + prayWellFormed(parent, leftward, rightward); + + var self = this; + self.disowned = false; + + var leftEnd = self.ends[L]; + if (!leftEnd) return this; + + var rightEnd = self.ends[R]; + + if (leftward) { + // NB: this is handled in the ::each() block + // leftward[R] = leftEnd + } else { + parent.ends[L] = leftEnd; + } + + if (rightward) { + rightward[L] = rightEnd; + } else { + parent.ends[R] = rightEnd; + } + + self.ends[R][R] = rightward; + + self.each(function(el) { + el[L] = leftward; + el.parent = parent; + if (leftward) leftward[R] = el; + + leftward = el; + }); + + return self; + }; + + _.disown = function() { + var self = this; + var leftEnd = self.ends[L]; + + // guard for empty and already-disowned fragments + if (!leftEnd || self.disowned) return self; + + self.disowned = true; + + var rightEnd = self.ends[R] + var parent = leftEnd.parent; + + prayWellFormed(parent, leftEnd[L], leftEnd); + prayWellFormed(parent, rightEnd, rightEnd[R]); + + if (leftEnd[L]) { + leftEnd[L][R] = rightEnd[R]; + } else { + parent.ends[L] = rightEnd[R]; + } + + if (rightEnd[R]) { + rightEnd[R][L] = leftEnd[L]; + } else { + parent.ends[R] = leftEnd[L]; + } + + return self; + }; + + _.each = function(fn) { + var self = this; + var el = self.ends[L]; + if (!el) return self; + + for (;el !== self.ends[R][R]; el = el[R]) { + if (fn.call(self, el) === false) break; + } + + return self; + }; + + _.fold = function(fold, fn) { + this.each(function(el) { + fold = fn.call(this, fold, el); + }); + + return fold; + }; +}); +/************************************************* + * Abstract classes of math blocks and commands. + ************************************************/ + +var uuid = (function() { + var id = 0; + + return function() { return id += 1; }; +})(); + +/** + * Math tree node base class. + * Some math-tree-specific extensions to Node. + * Both MathBlock's and MathCommand's descend from it. + */ +var MathElement = P(Node, function(_, _super) { + _.init = function(obj) { + _super.init.call(this); + this.id = uuid(); + MathElement[this.id] = this; + }; + + _.toString = function() { + return '[MathElement '+this.id+']'; + }; + + _.bubble = function(event /*, args... */) { + var args = __slice.call(arguments, 1); + + for (var ancestor = this; ancestor; ancestor = ancestor.parent) { + var res = ancestor[event] && ancestor[event].apply(ancestor, args); + if (res === false) break; + } + + return this; + }; + + _.postOrder = function(fn /*, args... */) { + var args = __slice.call(arguments, 1); + + if (typeof fn === 'string') { + var methodName = fn; + fn = function(el) { + if (methodName in el) el[methodName].apply(el, args); + }; + } + + (function recurse(desc) { + desc.eachChild(recurse); + fn(desc); + })(this); + }; + + _.jQ = $(); + _.jQadd = function(jQ) { this.jQ = this.jQ.add(jQ); }; + + this.jQize = function(html) { + // Sets the .jQ of the entire math subtree rooted at this command. + // Expects .createBlocks() to have been called already, since it + // calls .html(). + var jQ = $(html); + jQ.find('*').andSelf().each(function() { + var jQ = $(this), + cmdId = jQ.attr('mathquill-command-id'), + blockId = jQ.attr('mathquill-block-id'); + if (cmdId) MathElement[cmdId].jQadd(jQ); + if (blockId) MathElement[blockId].jQadd(jQ); + }); + return jQ; + }; + + _.finalizeInsert = function() { + var self = this; + self.postOrder('finalizeTree'); + + // note: this order is important. + // empty elements need the empty box provided by blur to + // be present in order for their dimensions to be measured + // correctly in redraw. + self.postOrder('blur'); + + // adjust context-sensitive spacing + self.postOrder('respace'); + if (self[R].respace) self[R].respace(); + if (self[L].respace) self[L].respace(); + + self.postOrder('redraw'); + self.bubble('redraw'); + }; +}); + +/** + * Commands and operators, like subscripts, exponents, or fractions. + * Descendant commands are organized into blocks. + */ +var MathCommand = P(MathElement, function(_, _super) { + _.init = function(ctrlSeq, htmlTemplate, textTemplate) { + var cmd = this; + _super.init.call(cmd); + + if (!cmd.ctrlSeq) cmd.ctrlSeq = ctrlSeq; + if (htmlTemplate) cmd.htmlTemplate = htmlTemplate; + if (textTemplate) cmd.textTemplate = textTemplate; + }; + + // obvious methods + _.replaces = function(replacedFragment) { + replacedFragment.disown(); + this.replacedFragment = replacedFragment; + }; + _.isEmpty = function() { + return this.foldChildren(true, function(isEmpty, child) { + return isEmpty && child.isEmpty(); + }); + }; + + _.parser = function() { + var block = latexMathParser.block; + var self = this; + + return block.times(self.numBlocks()).map(function(blocks) { + self.blocks = blocks; + + for (var i = 0; i < blocks.length; i += 1) { + blocks[i].adopt(self, self.ends[R], 0); + } + + return self; + }); + }; + + // createLeftOf(cursor) and the methods it calls + _.createLeftOf = function(cursor) { + var cmd = this; + var replacedFragment = cmd.replacedFragment; + + cmd.createBlocks(); + MathElement.jQize(cmd.html()); + if (replacedFragment) { + replacedFragment.adopt(cmd.ends[L], 0, 0); + replacedFragment.jQ.appendTo(cmd.ends[L].jQ); + } + + cursor.jQ.before(cmd.jQ); + cursor[L] = cmd.adopt(cursor.parent, cursor[L], cursor[R]); + + cmd.finalizeInsert(cursor); + + cmd.placeCursor(cursor); + }; + _.createBlocks = function() { + var cmd = this, + numBlocks = cmd.numBlocks(), + blocks = cmd.blocks = Array(numBlocks); + + for (var i = 0; i < numBlocks; i += 1) { + var newBlock = blocks[i] = MathBlock(); + newBlock.adopt(cmd, cmd.ends[R], 0); + } + }; + _.respace = noop; //placeholder for context-sensitive spacing + _.placeCursor = function(cursor) { + //insert the cursor at the right end of the first empty child, searching + //left-to-right, or if none empty, the right end child + cursor.insAtRightEnd(this.foldChildren(this.ends[L], function(leftward, child) { + return leftward.isEmpty() ? leftward : child; + })); + }; + + // remove() + _.remove = function() { + this.disown(); + this.jQ.remove(); + + this.postOrder(function(el) { delete MathElement[el.id]; }); + + return this; + }; + + // methods involved in creating and cross-linking with HTML DOM nodes + /* + They all expect an .htmlTemplate like + '&0' + or + '&0&1' + + See html.test.js for more examples. + + Requirements: + - For each block of the command, there must be exactly one "block content + marker" of the form '&' where is the 0-based index of the + block. (Like the LaTeX \newcommand syntax, but with a 0-based rather than + 1-based index, because JavaScript because C because Dijkstra.) + - The block content marker must be the sole contents of the containing + element, there can't even be surrounding whitespace, or else we can't + guarantee sticking to within the bounds of the block content marker when + mucking with the HTML DOM. + - The HTML not only must be well-formed HTML (of course), but also must + conform to the XHTML requirements on tags, specifically all tags must + either be self-closing (like '
              ') or come in matching pairs. + Close tags are never optional. + + Note that & isn't well-formed HTML; if you wanted a literal '&123', + your HTML template would have to have '&123'. + */ + _.numBlocks = function() { + var matches = this.htmlTemplate.match(/&\d+/g); + return matches ? matches.length : 0; + }; + _.html = function() { + // Render the entire math subtree rooted at this command, as HTML. + // Expects .createBlocks() to have been called already, since it uses the + // .blocks array of child blocks. + // + // See html.test.js for example templates and intended outputs. + // + // Given an .htmlTemplate as described above, + // - insert the mathquill-command-id attribute into all top-level tags, + // which will be used to set this.jQ in .jQize(). + // This is straightforward: + // * tokenize into tags and non-tags + // * loop through top-level tokens: + // * add #cmdId attribute macro to top-level self-closing tags + // * else add #cmdId attribute macro to top-level open tags + // * skip the matching top-level close tag and all tag pairs + // in between + // - for each block content marker, + // + replace it with the contents of the corresponding block, + // rendered as HTML + // + insert the mathquill-block-id attribute into the containing tag + // This is even easier, a quick regex replace, since block tags cannot + // contain anything besides the block content marker. + // + // Two notes: + // - The outermost loop through top-level tokens should never encounter any + // top-level close tags, because we should have first encountered a + // matching top-level open tag, all inner tags should have appeared in + // matching pairs and been skipped, and then we should have skipped the + // close tag in question. + // - All open tags should have matching close tags, which means our inner + // loop should always encounter a close tag and drop nesting to 0. If + // a close tag is missing, the loop will continue until i >= tokens.length + // and token becomes undefined. This will not infinite loop, even in + // production without pray(), because it will then TypeError on .slice(). + + var cmd = this; + var blocks = cmd.blocks; + var cmdId = ' mathquill-command-id=' + cmd.id; + var tokens = cmd.htmlTemplate.match(/<[^<>]+>|[^<>]+/g); + + pray('no unmatched angle brackets', tokens.join('') === this.htmlTemplate); + + // add cmdId to all top-level tags + for (var i = 0, token = tokens[0]; token; i += 1, token = tokens[i]) { + // top-level self-closing tags + if (token.slice(-2) === '/>') { + tokens[i] = token.slice(0,-2) + cmdId + '/>'; + } + // top-level open tags + else if (token.charAt(0) === '<') { + pray('not an unmatched top-level close tag', token.charAt(1) !== '/'); + + tokens[i] = token.slice(0,-1) + cmdId + '>'; + + // skip matching top-level close tag and all tag pairs in between + var nesting = 1; + do { + i += 1, token = tokens[i]; + pray('no missing close tags', token); + // close tags + if (token.slice(0,2) === '') { + nesting += 1; + } + } while (nesting > 0); + } + } + return tokens.join('').replace(/>&(\d+)/g, function($0, $1) { + return ' mathquill-block-id=' + blocks[$1].id + '>' + blocks[$1].join('html'); + }); + }; + + // methods to export a string representation of the math tree + _.latex = function() { + return this.foldChildren(this.ctrlSeq, function(latex, child) { + return latex + '{' + (child.latex() || ' ') + '}'; + }); + }; + _.textTemplate = ['']; + _.text = function() { + var cmd = this, i = 0; + return cmd.foldChildren(cmd.textTemplate[i], function(text, child) { + i += 1; + var child_text = child.text(); + if (text && cmd.textTemplate[i] === '(' + && child_text[0] === '(' && child_text.slice(-1) === ')') + return text + child_text.slice(1, -1) + cmd.textTemplate[i]; + return text + child.text() + (cmd.textTemplate[i] || ''); + }); + }; +}); + +/** + * Lightweight command without blocks or children. + */ +var Symbol = P(MathCommand, function(_, _super) { + _.init = function(ctrlSeq, html, text) { + if (!text) text = ctrlSeq && ctrlSeq.length > 1 ? ctrlSeq.slice(1) : ctrlSeq; + + _super.init.call(this, ctrlSeq, html, [ text ]); + }; + + _.parser = function() { return Parser.succeed(this); }; + _.numBlocks = function() { return 0; }; + + _.replaces = function(replacedFragment) { + replacedFragment.remove(); + }; + _.createBlocks = noop; + _.latex = function(){ return this.ctrlSeq; }; + _.text = function(){ return this.textTemplate; }; + _.placeCursor = noop; + _.isEmpty = function(){ return true; }; +}); + +/** + * Children and parent of MathCommand's. Basically partitions all the + * symbols and operators that descend (in the Math DOM tree) from + * ancestor operators. + */ +var MathBlock = P(MathElement, function(_) { + _.join = function(methodName) { + return this.foldChildren('', function(fold, child) { + return fold + child[methodName](); + }); + }; + _.latex = function() { return this.join('latex'); }; + _.text = function() { + return this.ends[L] === this.ends[R] ? + this.ends[L].text() : + '(' + this.join('text') + ')' + ; + }; + _.isEmpty = function() { + return this.ends[L] === 0 && this.ends[R] === 0; + }; + _.write = function(cursor, ch, replacedFragment) { + var cmd; + if (ch.match(/^[a-eg-zA-Z]$/)) //exclude f because want florin + cmd = Variable(ch); + else if (cmd = CharCmds[ch] || LatexCmds[ch]) + cmd = cmd(ch); + else + cmd = VanillaSymbol(ch); + + if (replacedFragment) cmd.replaces(replacedFragment); + + cmd.createLeftOf(cursor); + }; + _.focus = function() { + this.jQ.addClass('hasCursor'); + this.jQ.removeClass('empty'); + + return this; + }; + _.blur = function() { + this.jQ.removeClass('hasCursor'); + if (this.isEmpty()) + this.jQ.addClass('empty'); + + return this; + }; +}); + +/** + * Math tree fragment base class. + * Some math-tree-specific extensions to Fragment. + */ +var MathFragment = P(Fragment, function(_, _super) { + _.init = function(leftEnd, rightEnd) { + // just select one thing if only one argument + _super.init.call(this, leftEnd, rightEnd || leftEnd); + this.jQ = this.fold($(), function(jQ, child){ return child.jQ.add(jQ); }); + }; + _.latex = function() { + return this.fold('', function(latex, el){ return latex + el.latex(); }); + }; + _.remove = function() { + this.jQ.remove(); + + this.each(function(el) { + el.postOrder(function(desc) { + delete MathElement[desc.id]; + }); + }); + + return this.disown(); + }; +}); +/********************************************* + * Root math elements with event delegation. + ********************************************/ + +function createRoot(jQ, root, textbox, editable) { + var contents = jQ.contents().detach(); + + if (!textbox) { + jQ.addClass('mathquill-rendered-math'); + } + + root.jQ = jQ.attr(mqBlockId, root.id); + root.revert = function() { + jQ.empty().unbind('.mathquill') + .removeClass('mathquill-rendered-math mathquill-editable mathquill-textbox') + .append(contents); + }; + + var cursor = root.cursor = Cursor(root); + + root.renderLatex(contents.text()); + + //textarea stuff + var textareaSpan = root.textarea = $(''), + textarea = textareaSpan.children(); + + /****** + * TODO [Han]: Document this + */ + var textareaSelectionTimeout; + root.selectionChanged = function() { + if (textareaSelectionTimeout === undefined) { + textareaSelectionTimeout = setTimeout(setTextareaSelection); + } + forceIERedraw(jQ[0]); + }; + function setTextareaSelection() { + textareaSelectionTimeout = undefined; + var latex = cursor.selection ? '$'+cursor.selection.latex()+'$' : ''; + textareaManager.select(latex); + } + + //prevent native selection except textarea + jQ.bind('selectstart.mathquill', function(e) { + if (e.target !== textarea[0]) e.preventDefault(); + e.stopPropagation(); + }); + + //drag-to-select event handling + var anticursor, blink = cursor.blink; + jQ.bind('mousedown.mathquill', function(e) { + function mousemove(e) { + cursor.seek($(e.target), e.pageX, e.pageY); + + if (cursor[L] !== anticursor[L] + || cursor.parent !== anticursor.parent) { + cursor.selectFrom(anticursor); + } + + return false; + } + + // docmousemove is attached to the document, so that + // selection still works when the mouse leaves the window. + function docmousemove(e) { + // [Han]: i delete the target because of the way seek works. + // it will not move the mouse to the target, but will instead + // just seek those X and Y coordinates. If there is a target, + // it will try to move the cursor to document, which will not work. + // cursor.seek needs to be refactored. + delete e.target; + + return mousemove(e); + } + + function mouseup(e) { + anticursor = undefined; + cursor.blink = blink; + if (!cursor.selection) { + if (editable) { + cursor.show(); + } + else { + textareaSpan.detach(); + } + } + + // delete the mouse handlers now that we're not dragging anymore + jQ.unbind('mousemove', mousemove); + $(e.target.ownerDocument).unbind('mousemove', docmousemove).unbind('mouseup', mouseup); + } + + setTimeout(function() { textarea.focus(); }); + // preventDefault won't prevent focus on mousedown in IE<9 + // that means immediately after this mousedown, whatever was + // mousedown-ed will receive focus + // http://bugs.jquery.com/ticket/10345 + + cursor.blink = noop; + cursor.seek($(e.target), e.pageX, e.pageY); + + anticursor = Point(cursor.parent, cursor[L], cursor[R]); + + if (!editable) jQ.prepend(textareaSpan); + + jQ.mousemove(mousemove); + $(e.target.ownerDocument).mousemove(docmousemove).mouseup(mouseup); + + return false; + }); + + if (!editable) { + var textareaManager = manageTextarea(textarea, { container: jQ }); + jQ.bind('cut paste', false).bind('copy', setTextareaSelection) + .prepend('$'+root.latex()+'$'); + textarea.blur(function() { + cursor.clearSelection(); + setTimeout(detach); //detaching during blur explodes in WebKit + }); + function detach() { + textareaSpan.detach(); + } + return; + } + + var textareaManager = manageTextarea(textarea, { + container: jQ, + key: function(key, evt) { + cursor.parent.bubble('onKey', key, evt); + }, + text: function(text) { + cursor.parent.bubble('onText', text); + }, + cut: function(e) { + if (cursor.selection) { + setTimeout(function() { + cursor.prepareEdit(); + cursor.parent.bubble('redraw'); + }); + } + + e.stopPropagation(); + }, + paste: function(text) { + // FIXME HACK the parser in RootTextBlock needs to be moved to + // Cursor::writeLatex or something so this'll work with + // MathQuill textboxes + if (text.slice(0,1) === '$' && text.slice(-1) === '$') { + text = text.slice(1, -1); + } + else { + text = '\\text{' + text + '}'; + } + + cursor.writeLatex(text).show(); + } + }); + + jQ.prepend(textareaSpan); + + //root CSS classes + jQ.addClass('mathquill-editable'); + if (textbox) + jQ.addClass('mathquill-textbox'); + + //focus and blur handling + textarea.focus(function(e) { + if (!cursor.parent) + cursor.insAtRightEnd(root); + cursor.parent.jQ.addClass('hasCursor'); + if (cursor.selection) { + cursor.selection.jQ.removeClass('blur'); + setTimeout(root.selectionChanged); //re-select textarea contents after tabbing away and back + } + else + cursor.show(); + e.stopPropagation(); + }).blur(function(e) { + cursor.hide().parent.blur(); + if (cursor.selection) + cursor.selection.jQ.addClass('blur'); + e.stopPropagation(); + }); + + jQ.bind('focus.mathquill blur.mathquill', function(e) { + textarea.trigger(e); + }).blur(); +} + +var RootMathBlock = P(MathBlock, function(_, _super) { + _.latex = function() { + return _super.latex.call(this).replace(/(\\[a-z]+) (?![a-z])/ig,'$1'); + }; + _.text = function() { + return this.foldChildren('', function(text, child) { + return text + child.text(); + }); + }; + _.renderLatex = function(latex) { + var jQ = this.jQ; + + jQ.children().slice(1).remove(); + this.ends[L] = this.ends[R] = 0; + + delete this.cursor.selection; + this.cursor.insAtRightEnd(this).writeLatex(latex); + }; + _.onKey = function(key, e) { + switch (key) { + case 'Ctrl-Shift-Backspace': + case 'Ctrl-Backspace': + while (this.cursor[L] || this.cursor.selection) { + this.cursor.backspace(); + } + break; + + case 'Shift-Backspace': + case 'Backspace': + this.cursor.backspace(); + break; + + // Tab or Esc -> go one block right if it exists, else escape right. + case 'Esc': + case 'Tab': + case 'Spacebar': + var parent = this.cursor.parent; + // cursor is in root editable, continue default + if (parent === this.cursor.root) { + if (key === 'Spacebar') e.preventDefault(); + return; + } + + this.cursor.prepareMove(); + if (parent[R]) { + // go one block right + this.cursor.insAtLeftEnd(parent[R]); + } else { + // get out of the block + this.cursor.insRightOf(parent.parent); + } + break; + + // Shift-Tab -> go one block left if it exists, else escape left. + case 'Shift-Tab': + case 'Shift-Esc': + case 'Shift-Spacebar': + var parent = this.cursor.parent; + //cursor is in root editable, continue default + if (parent === this.cursor.root) { + if (key === 'Shift-Spacebar') e.preventDefault(); + return; + } + + this.cursor.prepareMove(); + if (parent[L]) { + // go one block left + this.cursor.insAtRightEnd(parent[L]); + } else { + //get out of the block + this.cursor.insLeftOf(parent.parent); + } + break; + + // Prevent newlines from showing up + case 'Enter': break; + + + // End -> move to the end of the current block. + case 'End': + this.cursor.prepareMove().insAtRightEnd(this.cursor.parent); + break; + + // Ctrl-End -> move all the way to the end of the root block. + case 'Ctrl-End': + this.cursor.prepareMove().insAtRightEnd(this); + break; + + // Shift-End -> select to the end of the current block. + case 'Shift-End': + while (this.cursor[R]) { + this.cursor.selectRight(); + } + break; + + // Ctrl-Shift-End -> select to the end of the root block. + case 'Ctrl-Shift-End': + while (this.cursor[R] || this.cursor.parent !== this) { + this.cursor.selectRight(); + } + break; + + // Home -> move to the start of the root block or the current block. + case 'Home': + this.cursor.prepareMove().insAtLeftEnd(this.cursor.parent); + break; + + // Ctrl-Home -> move to the start of the current block. + case 'Ctrl-Home': + this.cursor.prepareMove().insAtLeftEnd(this); + break; + + // Shift-Home -> select to the start of the current block. + case 'Shift-Home': + while (this.cursor[L]) { + this.cursor.selectLeft(); + } + break; + + // Ctrl-Shift-Home -> move to the start of the root block. + case 'Ctrl-Shift-Home': + while (this.cursor[L] || this.cursor.parent !== this) { + this.cursor.selectLeft(); + } + break; + + case 'Left': this.cursor.moveLeft(); break; + case 'Shift-Left': this.cursor.selectLeft(); break; + case 'Ctrl-Left': break; + + case 'Right': this.cursor.moveRight(); break; + case 'Shift-Right': this.cursor.selectRight(); break; + case 'Ctrl-Right': break; + + case 'Up': this.cursor.moveUp(); break; + case 'Down': this.cursor.moveDown(); break; + + case 'Shift-Up': + if (this.cursor[L]) { + while (this.cursor[L]) this.cursor.selectLeft(); + } else { + this.cursor.selectLeft(); + } + + case 'Shift-Down': + if (this.cursor[R]) { + while (this.cursor[R]) this.cursor.selectRight(); + } + else { + this.cursor.selectRight(); + } + + case 'Ctrl-Up': break; + case 'Ctrl-Down': break; + + case 'Ctrl-Shift-Del': + case 'Ctrl-Del': + while (this.cursor[R] || this.cursor.selection) { + this.cursor.deleteForward(); + } + break; + + case 'Shift-Del': + case 'Del': + this.cursor.deleteForward(); + break; + + case 'Meta-A': + case 'Ctrl-A': + //so not stopPropagation'd at RootMathCommand + if (this !== this.cursor.root) return; + + this.cursor.prepareMove().insAtRightEnd(this); + while (this.cursor[L]) this.cursor.selectLeft(); + break; + + default: + return false; + } + e.preventDefault(); + return false; + }; + _.onText = function(ch) { + this.cursor.write(ch); + return false; + }; +}); + +var RootMathCommand = P(MathCommand, function(_, _super) { + _.init = function(cursor) { + _super.init.call(this, '$'); + this.cursor = cursor; + }; + _.htmlTemplate = '&0'; + _.createBlocks = function() { + this.ends[L] = + this.ends[R] = + RootMathBlock(); + + this.blocks = [ this.ends[L] ]; + + this.ends[L].parent = this; + + this.ends[L].cursor = this.cursor; + this.ends[L].write = function(cursor, ch, replacedFragment) { + if (ch !== '$') + MathBlock.prototype.write.call(this, cursor, ch, replacedFragment); + else if (this.isEmpty()) { + cursor.insRightOf(this.parent).backspace().show(); + VanillaSymbol('\\$','$').createLeftOf(cursor); + } + else if (!cursor[R]) + cursor.insRightOf(this.parent); + else if (!cursor[L]) + cursor.insLeftOf(this.parent); + else + MathBlock.prototype.write.call(this, cursor, ch, replacedFragment); + }; + }; + _.latex = function() { + return '$' + this.ends[L].latex() + '$'; + }; +}); + +var RootTextBlock = P(MathBlock, function(_) { + _.renderLatex = function(latex) { + var self = this; + var cursor = self.cursor; + self.jQ.children().slice(1).remove(); + self.ends[L] = self.ends[R] = 0; + delete cursor.selection; + cursor.show().insAtRightEnd(self); + + var regex = Parser.regex; + var string = Parser.string; + var eof = Parser.eof; + var all = Parser.all; + + // Parser RootMathCommand + var mathMode = string('$').then(latexMathParser) + // because TeX is insane, math mode doesn't necessarily + // have to end. So we allow for the case that math mode + // continues to the end of the stream. + .skip(string('$').or(eof)) + .map(function(block) { + // HACK FIXME: this shouldn't have to have access to cursor + var rootMathCommand = RootMathCommand(cursor); + + rootMathCommand.createBlocks(); + var rootMathBlock = rootMathCommand.ends[L]; + block.children().adopt(rootMathBlock, 0, 0); + + return rootMathCommand; + }) + ; + + var escapedDollar = string('\\$').result('$'); + var textChar = escapedDollar.or(regex(/^[^$]/)).map(VanillaSymbol); + var latexText = mathMode.or(textChar).many(); + var commands = latexText.skip(eof).or(all.result(false)).parse(latex); + + if (commands) { + for (var i = 0; i < commands.length; i += 1) { + commands[i].adopt(self, self.ends[R], 0); + } + + var html = self.join('html'); + MathElement.jQize(html).appendTo(self.jQ); + + this.finalizeInsert(); + } + }; + _.onKey = function(key) { + if (key === 'Spacebar' || key === 'Shift-Spacebar') return; + RootMathBlock.prototype.onKey.apply(this, arguments); + }; + _.onText = RootMathBlock.prototype.onText; + _.write = function(cursor, ch, replacedFragment) { + if (replacedFragment) replacedFragment.remove(); + if (ch === '$') + RootMathCommand(cursor).createLeftOf(cursor); + else { + var html; + if (ch === '<') html = '<'; + else if (ch === '>') html = '>'; + VanillaSymbol(ch, html).createLeftOf(cursor); + } + }; +}); +/*************************** + * Commands and Operators. + **************************/ + +var CharCmds = {}, LatexCmds = {}; //single character commands, LaTeX commands + +var scale, // = function(jQ, x, y) { ... } +//will use a CSS 2D transform to scale the jQuery-wrapped HTML elements, +//or the filter matrix transform fallback for IE 5.5-8, or gracefully degrade to +//increasing the fontSize to match the vertical Y scaling factor. + +//ideas from http://github.com/louisremi/jquery.transform.js +//see also http://msdn.microsoft.com/en-us/library/ms533014(v=vs.85).aspx + + forceIERedraw = noop, + div = document.createElement('div'), + div_style = div.style, + transformPropNames = { + transform:1, + WebkitTransform:1, + MozTransform:1, + OTransform:1, + msTransform:1 + }, + transformPropName; + +for (var prop in transformPropNames) { + if (prop in div_style) { + transformPropName = prop; + break; + } +} + +if (transformPropName) { + scale = function(jQ, x, y) { + jQ.css(transformPropName, 'scale('+x+','+y+')'); + }; +} +else if ('filter' in div_style) { //IE 6, 7, & 8 fallback, see https://github.com/laughinghan/mathquill/wiki/Transforms + forceIERedraw = function(el){ el.className = el.className; }; + scale = function(jQ, x, y) { //NOTE: assumes y > x + x /= (1+(y-1)/2); + jQ.css('fontSize', y + 'em'); + if (!jQ.hasClass('matrixed-container')) { + jQ.addClass('matrixed-container') + .wrapInner(''); + } + var innerjQ = jQ.children() + .css('filter', 'progid:DXImageTransform.Microsoft' + + '.Matrix(M11=' + x + ",SizingMethod='auto expand')" + ); + function calculateMarginRight() { + jQ.css('marginRight', (innerjQ.width()-1)*(x-1)/x + 'px'); + } + calculateMarginRight(); + var intervalId = setInterval(calculateMarginRight); + $(window).load(function() { + clearTimeout(intervalId); + calculateMarginRight(); + }); + }; +} +else { + scale = function(jQ, x, y) { + jQ.css('fontSize', y + 'em'); + }; +} + +var Style = P(MathCommand, function(_, _super) { + _.init = function(ctrlSeq, tagName, attrs) { + _super.init.call(this, ctrlSeq, '<'+tagName+' '+attrs+'>&0'); + }; +}); + +//fonts +LatexCmds.mathrm = bind(Style, '\\mathrm', 'span', 'class="roman font"'); +LatexCmds.mathit = bind(Style, '\\mathit', 'i', 'class="font"'); +LatexCmds.mathbf = bind(Style, '\\mathbf', 'b', 'class="font"'); +LatexCmds.mathsf = bind(Style, '\\mathsf', 'span', 'class="sans-serif font"'); +LatexCmds.mathtt = bind(Style, '\\mathtt', 'span', 'class="monospace font"'); +//text-decoration +LatexCmds.underline = bind(Style, '\\underline', 'span', 'class="non-leaf underline"'); +LatexCmds.overline = LatexCmds.bar = bind(Style, '\\overline', 'span', 'class="non-leaf overline"'); + +var SupSub = P(MathCommand, function(_, _super) { + _.init = function(ctrlSeq, tag, text) { + _super.init.call(this, ctrlSeq, '<'+tag+' class="non-leaf">&0', [ text ]); + }; + _.finalizeTree = function() { + //TODO: use inheritance + pray('SupSub is only _ and ^', + this.ctrlSeq === '^' || this.ctrlSeq === '_' + ); + + if (this.ctrlSeq === '_') { + this.down = this.ends[L]; + this.ends[L].up = insLeftOfMeUnlessAtEnd; + } + else { + this.up = this.ends[L]; + this.ends[L].down = insLeftOfMeUnlessAtEnd; + } + function insLeftOfMeUnlessAtEnd(cursor) { + // cursor.insLeftOf(cmd), unless cursor at the end of block, and every + // ancestor cmd is at the end of every ancestor block + var cmd = this.parent, ancestorCmd = cursor; + do { + if (ancestorCmd[R]) { + cursor.insLeftOf(cmd); + return false; + } + ancestorCmd = ancestorCmd.parent.parent; + } while (ancestorCmd !== cmd); + cursor.insRightOf(cmd); + return false; + } + }; + _.latex = function() { + var latex = this.ends[L].latex(); + if (latex.length === 1) + return this.ctrlSeq + latex; + else + return this.ctrlSeq + '{' + (latex || ' ') + '}'; + }; + _.redraw = function() { + if (this[L]) + this[L].respace(); + //SupSub::respace recursively calls respace on all the following SupSubs + //so if leftward is a SupSub, no need to call respace on this or following nodes + if (!(this[L] instanceof SupSub)) { + this.respace(); + //and if rightward is a SupSub, then this.respace() will have already called + //this[R].respace() + if (this[R] && !(this[R] instanceof SupSub)) + this[R].respace(); + } + }; + _.respace = function() { + if ( + this[L].ctrlSeq === '\\int ' || ( + this[L] instanceof SupSub && this[L].ctrlSeq != this.ctrlSeq + && this[L][L] && this[L][L].ctrlSeq === '\\int ' + ) + ) { + if (!this.limit) { + this.limit = true; + this.jQ.addClass('limit'); + } + } + else { + if (this.limit) { + this.limit = false; + this.jQ.removeClass('limit'); + } + } + + this.respaced = this[L] instanceof SupSub && this[L].ctrlSeq != this.ctrlSeq && !this[L].respaced; + if (this.respaced) { + var fontSize = +this.jQ.css('fontSize').slice(0,-2), + leftWidth = this[L].jQ.outerWidth(), + thisWidth = this.jQ.outerWidth(); + this.jQ.css({ + left: (this.limit && this.ctrlSeq === '_' ? -.25 : 0) - leftWidth/fontSize + 'em', + marginRight: .1 - min(thisWidth, leftWidth)/fontSize + 'em' + //1px extra so it doesn't wrap in retarded browsers (Firefox 2, I think) + }); + } + else if (this.limit && this.ctrlSeq === '_') { + this.jQ.css({ + left: '-.25em', + marginRight: '' + }); + } + else { + this.jQ.css({ + left: '', + marginRight: '' + }); + } + + if (this[R] instanceof SupSub) + this[R].respace(); + + return this; + }; +}); + +LatexCmds.subscript = +LatexCmds._ = bind(SupSub, '_', 'sub', '_'); + +LatexCmds.superscript = +LatexCmds.supscript = +LatexCmds['^'] = bind(SupSub, '^', 'sup', '**'); + +var Fraction = +LatexCmds.frac = +LatexCmds.dfrac = +LatexCmds.cfrac = +LatexCmds.fraction = P(MathCommand, function(_, _super) { + _.ctrlSeq = '\\frac'; + _.htmlTemplate = + '' + + '&0' + + '&1' + + ' ' + + '' + ; + _.textTemplate = ['(', '/', ')']; + _.finalizeTree = function() { + this.up = this.ends[R].up = this.ends[L]; + this.down = this.ends[L].down = this.ends[R]; + }; +}); + +var LiveFraction = +LatexCmds.over = +CharCmds['/'] = P(Fraction, function(_, _super) { + _.createLeftOf = function(cursor) { + if (!this.replacedFragment) { + var leftward = cursor[L]; + while (leftward && + !( + leftward instanceof BinaryOperator || + leftward instanceof TextBlock || + leftward instanceof BigSymbol || + ',;:'.split('').indexOf(leftward.ctrlSeq) > -1 + ) //lookbehind for operator + ) + leftward = leftward[L]; + + if (leftward instanceof BigSymbol && leftward[R] instanceof SupSub) { + leftward = leftward[R]; + if (leftward[R] instanceof SupSub && leftward[R].ctrlSeq != leftward.ctrlSeq) + leftward = leftward[R]; + } + + if (leftward !== cursor[L]) { + this.replaces(MathFragment(leftward[R] || cursor.parent.ends[L], cursor[L])); + cursor[L] = leftward; + } + } + _super.createLeftOf.call(this, cursor); + }; +}); + +var SquareRoot = +LatexCmds.sqrt = +LatexCmds['√'] = P(MathCommand, function(_, _super) { + _.ctrlSeq = '\\sqrt'; + _.htmlTemplate = + '' + + '' + + '&0' + + '' + ; + _.textTemplate = ['sqrt(', ')']; + _.parser = function() { + return latexMathParser.optBlock.then(function(optBlock) { + return latexMathParser.block.map(function(block) { + var nthroot = NthRoot(); + nthroot.blocks = [ optBlock, block ]; + optBlock.adopt(nthroot, 0, 0); + block.adopt(nthroot, optBlock, 0); + return nthroot; + }); + }).or(_super.parser.call(this)); + }; + _.redraw = function() { + var block = this.ends[R].jQ; + scale(block.prev(), 1, block.innerHeight()/+block.css('fontSize').slice(0,-2) - .1); + }; +}); + +var Vec = LatexCmds.vec = P(MathCommand, function(_, _super) { + _.ctrlSeq = '\\vec'; + _.htmlTemplate = + '' + + '' + + '&0' + + '' + ; + _.textTemplate = ['vec(', ')']; +}); + +var NthRoot = +LatexCmds.nthroot = P(SquareRoot, function(_, _super) { + _.htmlTemplate = + '&0' + + '' + + '' + + '&1' + + '' + ; + _.textTemplate = ['sqrt[', '](', ')']; + _.latex = function() { + return '\\sqrt['+this.ends[L].latex()+']{'+this.ends[R].latex()+'}'; + }; +}); + +// Round/Square/Curly/Angle Brackets (aka Parens/Brackets/Braces) +var Bracket = P(MathCommand, function(_, _super) { + _.init = function(open, close, ctrlSeq, end) { + _super.init.call(this, '\\left'+ctrlSeq, + '' + + ''+open+'' + + '&0' + + ''+close+'' + + '', + [open, close]); + this.end = '\\right'+end; + }; + _.jQadd = function() { + _super.jQadd.apply(this, arguments); + var jQ = this.jQ; + this.bracketjQs = jQ.children(':first').add(jQ.children(':last')); + }; + _.latex = function() { + return this.ctrlSeq + this.ends[L].latex() + this.end; + }; + _.redraw = function() { + var blockjQ = this.ends[L].jQ; + + var height = blockjQ.outerHeight()/+blockjQ.css('fontSize').slice(0,-2); + + scale(this.bracketjQs, min(1 + .2*(height - 1), 1.2), 1.05*height); + }; +}); + +LatexCmds.left = P(MathCommand, function(_) { + _.parser = function() { + var regex = Parser.regex; + var string = Parser.string; + var succeed = Parser.succeed; + var optWhitespace = Parser.optWhitespace; + + return optWhitespace.then(regex(/^(?:[([|]|\\\{)/)) + .then(function(open) { + if (open.charAt(0) === '\\') open = open.slice(1); + + var cmd = CharCmds[open](); + + return latexMathParser + .map(function (block) { + cmd.blocks = [ block ]; + block.adopt(cmd, 0, 0); + }) + .then(string('\\right')) + .skip(optWhitespace) + .then(regex(/^(?:[\])|]|\\\})/)) + .then(function(close) { + if (close.slice(-1) !== cmd.end.slice(-1)) { + return Parser.fail('open doesn\'t match close'); + } + + return succeed(cmd); + }) + ; + }) + ; + }; +}); + +LatexCmds.right = P(MathCommand, function(_) { + _.parser = function() { + return Parser.fail('unmatched \\right'); + }; +}); + +LatexCmds.lbrace = +CharCmds['{'] = bind(Bracket, '{', '}', '\\{', '\\}'); +LatexCmds.langle = +LatexCmds.lang = bind(Bracket, '⟨','⟩','\\langle ','\\rangle '); + +// Closing bracket matching opening bracket above +var CloseBracket = P(Bracket, function(_, _super) { + _.createLeftOf = function(cursor) { + // if I'm at the end of my parent who is a matching open-paren, + // and I am not replacing a selection fragment, don't create me, + // just put cursor after my parent + if (!cursor[R] && cursor.parent.parent && cursor.parent.parent.end === this.end && !this.replacedFragment) + cursor.insRightOf(cursor.parent.parent); + else + _super.createLeftOf.call(this, cursor); + }; + _.placeCursor = function(cursor) { + this.ends[L].blur(); + cursor.insRightOf(this); + }; +}); + +LatexCmds.rbrace = +CharCmds['}'] = bind(CloseBracket, '{','}','\\{','\\}'); +LatexCmds.rangle = +LatexCmds.rang = bind(CloseBracket, '⟨','⟩','\\langle ','\\rangle '); + +var parenMixin = function(_, _super) { + _.init = function(open, close) { + _super.init.call(this, open, close, open, close); + }; +}; + +var Paren = P(Bracket, parenMixin); + +LatexCmds.lparen = +CharCmds['('] = bind(Paren, '(', ')'); +LatexCmds.lbrack = +LatexCmds.lbracket = +CharCmds['['] = bind(Paren, '[', ']'); + +var CloseParen = P(CloseBracket, parenMixin); + +LatexCmds.rparen = +CharCmds[')'] = bind(CloseParen, '(', ')'); +LatexCmds.rbrack = +LatexCmds.rbracket = +CharCmds[']'] = bind(CloseParen, '[', ']'); + +var Pipes = +LatexCmds.lpipe = +LatexCmds.rpipe = +CharCmds['|'] = P(Paren, function(_, _super) { + _.init = function() { + _super.init.call(this, '|', '|'); + }; + + _.createLeftOf = CloseBracket.prototype.createLeftOf; +}); + +var TextBlock = +CharCmds.$ = +LatexCmds.text = +LatexCmds.textnormal = +LatexCmds.textrm = +LatexCmds.textup = +LatexCmds.textmd = P(MathCommand, function(_, _super) { + _.ctrlSeq = '\\text'; + _.htmlTemplate = '&0'; + _.replaces = function(replacedText) { + if (replacedText instanceof MathFragment) + this.replacedText = replacedText.remove().jQ.text(); + else if (typeof replacedText === 'string') + this.replacedText = replacedText; + }; + _.textTemplate = ['"', '"']; + _.parser = function() { + var self = this; + + // TODO: correctly parse text mode + var string = Parser.string; + var regex = Parser.regex; + var optWhitespace = Parser.optWhitespace; + return optWhitespace + .then(string('{')).then(regex(/^[^}]*/)).skip(string('}')) + .map(function(text) { + self.createBlocks(); + var block = self.ends[L]; + for (var i = 0; i < text.length; i += 1) { + var ch = VanillaSymbol(text.charAt(i)); + ch.adopt(block, block.ends[R], 0); + } + return self; + }) + ; + }; + _.createBlocks = function() { + //FIXME: another possible Law of Demeter violation, but this seems much cleaner, like it was supposed to be done this way + this.ends[L] = + this.ends[R] = + InnerTextBlock(); + + this.blocks = [ this.ends[L] ]; + + this.ends[L].parent = this; + }; + _.finalizeInsert = function() { + //FIXME HACK blur removes the TextBlock + this.ends[L].blur = function() { delete this.blur; return this; }; + _super.finalizeInsert.call(this); + }; + _.createLeftOf = function(cursor) { + _super.createLeftOf.call(this, this.cursor = cursor); + + if (this.replacedText) + for (var i = 0; i < this.replacedText.length; i += 1) + this.ends[L].write(cursor, this.replacedText.charAt(i)); + }; +}); + +var InnerTextBlock = P(MathBlock, function(_, _super) { + _.onKey = function(key, e) { + if (key === 'Spacebar' || key === 'Shift-Spacebar') return false; + }; + // backspace and delete at ends of block don't unwrap + _.deleteOutOf = function(dir, cursor) { + if (this.isEmpty()) cursor.insRightOf(this.parent); + }; + _.write = function(cursor, ch, replacedFragment) { + if (replacedFragment) replacedFragment.remove(); + + if (ch !== '$') { + var html; + if (ch === '<') html = '<'; + else if (ch === '>') html = '>'; + VanillaSymbol(ch, html).createLeftOf(cursor); + } + else if (this.isEmpty()) { + cursor.insRightOf(this.parent).backspace(); + VanillaSymbol('\\$','$').createLeftOf(cursor); + } + else if (!cursor[R]) + cursor.insRightOf(this.parent); + else if (!cursor[L]) + cursor.insLeftOf(this.parent); + else { //split apart + var rightward = TextBlock(); + rightward.replaces(MathFragment(cursor[R], this.ends[R])); + + cursor.insRightOf(this.parent); + + // FIXME HACK: pretend no prev so they don't get merged when + // .createLeftOf() calls blur on the InnerTextBlock + rightward.adopt = function() { + delete this.adopt; + this.adopt.apply(this, arguments); + this[L] = 0; + }; + rightward.createLeftOf(cursor); + rightward[L] = this.parent; + + cursor.insLeftOf(rightward); + } + return false; + }; + _.blur = function() { + this.jQ.removeClass('hasCursor'); + if (this.isEmpty()) { + var textblock = this.parent, cursor = textblock.cursor; + if (cursor.parent === this) + this.jQ.addClass('empty'); + else { + cursor.hide(); + textblock.remove(); + if (cursor[R] === textblock) + cursor[R] = textblock[R]; + else if (cursor[L] === textblock) + cursor[L] = textblock[L]; + + cursor.show().parent.bubble('redraw'); + } + } + return this; + }; + _.focus = function() { + _super.focus.call(this); + + var textblock = this.parent; + if (textblock[R].ctrlSeq === textblock.ctrlSeq) { //TODO: seems like there should be a better way to move MathElements around + var innerblock = this, + cursor = textblock.cursor, + rightward = textblock[R].ends[L]; + + rightward.eachChild(function(child){ + child.parent = innerblock; + child.jQ.appendTo(innerblock.jQ); + }); + + if (this.ends[R]) + this.ends[R][R] = rightward.ends[L]; + else + this.ends[L] = rightward.ends[L]; + + rightward.ends[L][L] = this.ends[R]; + this.ends[R] = rightward.ends[R]; + + rightward.parent.remove(); + + if (cursor[L]) + cursor.insRightOf(cursor[L]); + else + cursor.insAtLeftEnd(this); + + cursor.parent.bubble('redraw'); + } + else if (textblock[L].ctrlSeq === textblock.ctrlSeq) { + var cursor = textblock.cursor; + if (cursor[L]) + textblock[L].ends[L].focus(); + else + cursor.insAtRightEnd(textblock[L].ends[L]); + } + return this; + }; +}); + + +function makeTextBlock(latex, tagName, attrs) { + return P(TextBlock, { + ctrlSeq: latex, + htmlTemplate: '<'+tagName+' '+attrs+'>&0' + }); +} + +LatexCmds.em = LatexCmds.italic = LatexCmds.italics = +LatexCmds.emph = LatexCmds.textit = LatexCmds.textsl = + makeTextBlock('\\textit', 'i', 'class="text"'); +LatexCmds.strong = LatexCmds.bold = LatexCmds.textbf = + makeTextBlock('\\textbf', 'b', 'class="text"'); +LatexCmds.sf = LatexCmds.textsf = + makeTextBlock('\\textsf', 'span', 'class="sans-serif text"'); +LatexCmds.tt = LatexCmds.texttt = + makeTextBlock('\\texttt', 'span', 'class="monospace text"'); +LatexCmds.textsc = + makeTextBlock('\\textsc', 'span', 'style="font-variant:small-caps" class="text"'); +LatexCmds.uppercase = + makeTextBlock('\\uppercase', 'span', 'style="text-transform:uppercase" class="text"'); +LatexCmds.lowercase = + makeTextBlock('\\lowercase', 'span', 'style="text-transform:lowercase" class="text"'); + +// input box to type a variety of LaTeX commands beginning with a backslash +var LatexCommandInput = +CharCmds['\\'] = P(MathCommand, function(_, _super) { + _.ctrlSeq = '\\'; + _.replaces = function(replacedFragment) { + this._replacedFragment = replacedFragment.disown(); + this.isEmpty = function() { return false; }; + }; + _.htmlTemplate = '\\&0'; + _.textTemplate = ['\\']; + _.createBlocks = function() { + _super.createBlocks.call(this); + this.ends[L].focus = function() { + this.parent.jQ.addClass('hasCursor'); + if (this.isEmpty()) + this.parent.jQ.removeClass('empty'); + + return this; + }; + this.ends[L].blur = function() { + this.parent.jQ.removeClass('hasCursor'); + if (this.isEmpty()) + this.parent.jQ.addClass('empty'); + + return this; + }; + }; + _.createLeftOf = function(cursor) { + _super.createLeftOf.call(this, cursor); + + this.cursor = cursor.insAtRightEnd(this.ends[L]); + if (this._replacedFragment) { + var el = this.jQ[0]; + this.jQ = + this._replacedFragment.jQ.addClass('blur').bind( + 'mousedown mousemove', //FIXME: is monkey-patching the mousedown and mousemove handlers the right way to do this? + function(e) { + $(e.target = el).trigger(e); + return false; + } + ).insertBefore(this.jQ).add(this.jQ); + } + + this.ends[L].write = function(cursor, ch, replacedFragment) { + if (replacedFragment) replacedFragment.remove(); + + if (ch.match(/[a-z]/i)) VanillaSymbol(ch).createLeftOf(cursor); + else { + this.parent.renderCommand(); + if (ch !== '\\' || !this.isEmpty()) this.parent.parent.write(cursor, ch); + } + }; + }; + _.latex = function() { + return '\\' + this.ends[L].latex() + ' '; + }; + _.onKey = function(key, e) { + if (key === 'Tab' || key === 'Enter' || key === 'Spacebar') { + this.renderCommand(); + e.preventDefault(); + return false; + } + }; + _.renderCommand = function() { + this.jQ = this.jQ.last(); + this.remove(); + if (this[R]) { + this.cursor.insLeftOf(this[R]); + } else { + this.cursor.insAtRightEnd(this.parent); + } + + var latex = this.ends[L].latex(), cmd; + if (!latex) latex = 'backslash'; + this.cursor.insertCmd(latex, this._replacedFragment); + }; +}); + +var Binomial = +LatexCmds.binom = +LatexCmds.binomial = P(MathCommand, function(_, _super) { + _.ctrlSeq = '\\binom'; + _.htmlTemplate = + '(' + + '' + + '' + + '&0' + + '&1' + + '' + + '' + + ')' + ; + _.textTemplate = ['choose(',',',')']; + _.redraw = function() { + var blockjQ = this.jQ.eq(1); + + var height = blockjQ.outerHeight()/+blockjQ.css('fontSize').slice(0,-2); + + var parens = this.jQ.filter('.paren'); + scale(parens, min(1 + .2*(height - 1), 1.2), 1.05*height); + }; +}); + +var Choose = +LatexCmds.choose = P(Binomial, function(_) { + _.createLeftOf = LiveFraction.prototype.createLeftOf; +}); + +var Vector = +LatexCmds.vector = P(MathCommand, function(_, _super) { + _.ctrlSeq = '\\vector'; + _.htmlTemplate = '&0'; + _.latex = function() { + return '\\begin{matrix}' + this.foldChildren([], function(latex, child) { + latex.push(child.latex()); + return latex; + }).join('\\\\') + '\\end{matrix}'; + }; + _.text = function() { + return '[' + this.foldChildren([], function(text, child) { + text.push(child.text()); + return text; + }).join() + ']'; + }; + _.createLeftOf = function(cursor) { + _super.createLeftOf.call(this, this.cursor = cursor); + }; + _.onKey = function(key, e) { + var currentBlock = this.cursor.parent; + + if (currentBlock.parent === this) { + if (key === 'Enter') { //enter + var newBlock = MathBlock(); + newBlock.parent = this; + newBlock.jQ = $('') + .attr(mqBlockId, newBlock.id) + .insertAfter(currentBlock.jQ); + if (currentBlock[R]) + currentBlock[R][L] = newBlock; + else + this.ends[R] = newBlock; + + newBlock[R] = currentBlock[R]; + currentBlock[R] = newBlock; + newBlock[L] = currentBlock; + this.bubble('redraw').cursor.insAtRightEnd(newBlock); + + e.preventDefault(); + return false; + } + else if (key === 'Tab' && !currentBlock[R]) { + if (currentBlock.isEmpty()) { + if (currentBlock[L]) { + this.cursor.insRightOf(this); + delete currentBlock[L][R]; + this.ends[R] = currentBlock[L]; + currentBlock.jQ.remove(); + this.bubble('redraw'); + + e.preventDefault(); + return false; + } + else + return; + } + + var newBlock = MathBlock(); + newBlock.parent = this; + newBlock.jQ = $('').attr(mqBlockId, newBlock.id).appendTo(this.jQ); + this.ends[R] = newBlock; + currentBlock[R] = newBlock; + newBlock[L] = currentBlock; + this.bubble('redraw').cursor.insAtRightEnd(newBlock); + + e.preventDefault(); + return false; + } + else if (e.which === 8) { //backspace + if (currentBlock.isEmpty()) { + if (currentBlock[L]) { + this.cursor.insAtRightEnd(currentBlock[L]) + currentBlock[L][R] = currentBlock[R]; + } + else { + this.cursor.insLeftOf(this); + this.ends[L] = currentBlock[R]; + } + + if (currentBlock[R]) + currentBlock[R][L] = currentBlock[L]; + else + this.ends[R] = currentBlock[L]; + + currentBlock.jQ.remove(); + if (this.isEmpty()) + this.cursor.deleteForward(); + else + this.bubble('redraw'); + + e.preventDefault(); + return false; + } + else if (!this.cursor[L]) { + e.preventDefault(); + return false; + } + } + } + }; +}); + +LatexCmds.editable = P(RootMathCommand, function(_, _super) { + _.init = function() { + MathCommand.prototype.init.call(this, '\\editable'); + }; + + _.jQadd = function() { + var self = this; + // FIXME: this entire method is a giant hack to get around + // having to call createBlocks, and createRoot expecting to + // render the contents' LaTeX. Both need to be refactored. + _super.jQadd.apply(self, arguments); + var block = self.ends[L].disown(); + var blockjQ = self.jQ.children().detach(); + + self.ends[L] = + self.ends[R] = + RootMathBlock(); + + self.blocks = [ self.ends[L] ]; + + self.ends[L].parent = self; + + createRoot(self.jQ, self.ends[L], false, true); + self.cursor = self.ends[L].cursor; + + block.children().adopt(self.ends[L], 0, 0); + blockjQ.appendTo(self.ends[L].jQ); + + self.ends[L].cursor.insAtRightEnd(self.ends[L]); + }; + + _.latex = function(){ return this.ends[L].latex(); }; + _.text = function(){ return this.ends[L].text(); }; +}); +/********************************** + * Symbols and Special Characters + *********************************/ + +LatexCmds.f = bind(Symbol, 'f', 'ƒ '); + +var Variable = P(Symbol, function(_, _super) { + _.init = function(ch, html) { + _super.init.call(this, ch, ''+(html || ch)+''); + }; + _.text = function() { + var text = this.ctrlSeq; + if (this[L] && !(this[L] instanceof Variable) + && !(this[L] instanceof BinaryOperator)) + text = '*' + text; + if (this[R] && !(this[R] instanceof BinaryOperator) + && !(this[R].ctrlSeq === '^')) + text += '*'; + return text; + }; +}); + +var VanillaSymbol = P(Symbol, function(_, _super) { + _.init = function(ch, html) { + _super.init.call(this, ch, ''+(html || ch)+''); + }; +}); + +CharCmds[' '] = bind(VanillaSymbol, '\\:', ' '); + +LatexCmds.prime = CharCmds["'"] = bind(VanillaSymbol, "'", '′'); + +// does not use Symbola font +var NonSymbolaSymbol = P(Symbol, function(_, _super) { + _.init = function(ch, html) { + _super.init.call(this, ch, ''+(html || ch)+''); + }; +}); + +LatexCmds['@'] = NonSymbolaSymbol; +LatexCmds['&'] = bind(NonSymbolaSymbol, '\\&', '&'); +LatexCmds['%'] = bind(NonSymbolaSymbol, '\\%', '%'); + +//the following are all Greek to me, but this helped a lot: http://www.ams.org/STIX/ion/stixsig03.html + +//lowercase Greek letter variables +LatexCmds.alpha = +LatexCmds.beta = +LatexCmds.gamma = +LatexCmds.delta = +LatexCmds.zeta = +LatexCmds.eta = +LatexCmds.theta = +LatexCmds.iota = +LatexCmds.kappa = +LatexCmds.mu = +LatexCmds.nu = +LatexCmds.xi = +LatexCmds.rho = +LatexCmds.sigma = +LatexCmds.tau = +LatexCmds.chi = +LatexCmds.psi = +LatexCmds.omega = P(Variable, function(_, _super) { + _.init = function(latex) { + _super.init.call(this,'\\'+latex+' ','&'+latex+';'); + }; +}); + +//why can't anybody FUCKING agree on these +LatexCmds.phi = //W3C or Unicode? + bind(Variable,'\\phi ','ϕ'); + +LatexCmds.phiv = //Elsevier and 9573-13 +LatexCmds.varphi = //AMS and LaTeX + bind(Variable,'\\varphi ','φ'); + +LatexCmds.epsilon = //W3C or Unicode? + bind(Variable,'\\epsilon ','ϵ'); + +LatexCmds.epsiv = //Elsevier and 9573-13 +LatexCmds.varepsilon = //AMS and LaTeX + bind(Variable,'\\varepsilon ','ε'); + +LatexCmds.piv = //W3C/Unicode and Elsevier and 9573-13 +LatexCmds.varpi = //AMS and LaTeX + bind(Variable,'\\varpi ','ϖ'); + +LatexCmds.sigmaf = //W3C/Unicode +LatexCmds.sigmav = //Elsevier +LatexCmds.varsigma = //LaTeX + bind(Variable,'\\varsigma ','ς'); + +LatexCmds.thetav = //Elsevier and 9573-13 +LatexCmds.vartheta = //AMS and LaTeX +LatexCmds.thetasym = //W3C/Unicode + bind(Variable,'\\vartheta ','ϑ'); + +LatexCmds.upsilon = //AMS and LaTeX and W3C/Unicode +LatexCmds.upsi = //Elsevier and 9573-13 + bind(Variable,'\\upsilon ','υ'); + +//these aren't even mentioned in the HTML character entity references +LatexCmds.gammad = //Elsevier +LatexCmds.Gammad = //9573-13 -- WTF, right? I dunno if this was a typo in the reference (see above) +LatexCmds.digamma = //LaTeX + bind(Variable,'\\digamma ','ϝ'); + +LatexCmds.kappav = //Elsevier +LatexCmds.varkappa = //AMS and LaTeX + bind(Variable,'\\varkappa ','ϰ'); + +LatexCmds.rhov = //Elsevier and 9573-13 +LatexCmds.varrho = //AMS and LaTeX + bind(Variable,'\\varrho ','ϱ'); + +//Greek constants, look best in un-italicised Times New Roman +LatexCmds.pi = LatexCmds['π'] = bind(NonSymbolaSymbol,'\\pi ','π'); +LatexCmds.lambda = bind(NonSymbolaSymbol,'\\lambda ','λ'); + +//uppercase greek letters + +LatexCmds.Upsilon = //LaTeX +LatexCmds.Upsi = //Elsevier and 9573-13 +LatexCmds.upsih = //W3C/Unicode "upsilon with hook" +LatexCmds.Upsih = //'cos it makes sense to me + bind(Symbol,'\\Upsilon ','ϒ'); //Symbola's 'upsilon with a hook' is a capital Y without hooks :( + +//other symbols with the same LaTeX command and HTML character entity reference +LatexCmds.Gamma = +LatexCmds.Delta = +LatexCmds.Theta = +LatexCmds.Lambda = +LatexCmds.Xi = +LatexCmds.Pi = +LatexCmds.Sigma = +LatexCmds.Phi = +LatexCmds.Psi = +LatexCmds.Omega = +LatexCmds.forall = P(VanillaSymbol, function(_, _super) { + _.init = function(latex) { + _super.init.call(this,'\\'+latex+' ','&'+latex+';'); + }; +}); + +// symbols that aren't a single MathCommand, but are instead a whole +// Fragment. Creates the Fragment from a LaTeX string +var LatexFragment = P(MathCommand, function(_) { + _.init = function(latex) { this.latex = latex; }; + _.createLeftOf = function(cursor) { cursor.writeLatex(this.latex); }; + _.parser = function() { + var frag = latexMathParser.parse(this.latex).children(); + return Parser.succeed(frag); + }; +}); + +// for what seems to me like [stupid reasons][1], Unicode provides +// subscripted and superscripted versions of all ten Arabic numerals, +// as well as [so-called "vulgar fractions"][2]. +// Nobody really cares about most of them, but some of them actually +// predate Unicode, dating back to [ISO-8859-1][3], apparently also +// known as "Latin-1", which among other things [Windows-1252][4] +// largely coincides with, so Microsoft Word sometimes inserts them +// and they get copy-pasted into MathQuill. +// +// (Irrelevant but funny story: Windows-1252 is actually a strict +// superset of the "closely related but distinct"[3] "ISO 8859-1" -- +// see the lack of a dash after "ISO"? Completely different character +// set, like elephants vs elephant seals, or "Zombies" vs "Zombie +// Redneck Torture Family". What kind of idiot would get them confused. +// People in fact got them confused so much, it was so common to +// mislabel Windows-1252 text as ISO-8859-1, that most modern web +// browsers and email clients treat the MIME charset of ISO-8859-1 +// as actually Windows-1252, behavior now standard in the HTML5 spec.) +// +// [1]: http://en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts +// [2]: http://en.wikipedia.org/wiki/Number_Forms +// [3]: http://en.wikipedia.org/wiki/ISO/IEC_8859-1 +// [4]: http://en.wikipedia.org/wiki/Windows-1252 +LatexCmds['¹'] = bind(LatexFragment, '^1'); +LatexCmds['²'] = bind(LatexFragment, '^2'); +LatexCmds['³'] = bind(LatexFragment, '^3'); +LatexCmds['¼'] = bind(LatexFragment, '\\frac14'); +LatexCmds['½'] = bind(LatexFragment, '\\frac12'); +LatexCmds['¾'] = bind(LatexFragment, '\\frac34'); + +var BinaryOperator = P(Symbol, function(_, _super) { + _.init = function(ctrlSeq, html, text) { + _super.init.call(this, + ctrlSeq, ''+html+'', text + ); + }; +}); + +var PlusMinus = P(BinaryOperator, function(_) { + _.init = VanillaSymbol.prototype.init; + + _.respace = function() { + if (!this[L]) { + this.jQ[0].className = ''; + } + else if ( + this[L] instanceof BinaryOperator && + this[R] && !(this[R] instanceof BinaryOperator) + ) { + this.jQ[0].className = 'unary-operator'; + } + else { + this.jQ[0].className = 'binary-operator'; + } + return this; + }; +}); + +LatexCmds['+'] = bind(PlusMinus, '+', '+'); +//yes, these are different dashes, I think one is an en dash and the other is a hyphen +LatexCmds['–'] = LatexCmds['-'] = bind(PlusMinus, '-', '−'); +LatexCmds['±'] = LatexCmds.pm = LatexCmds.plusmn = LatexCmds.plusminus = + bind(PlusMinus,'\\pm ','±'); +LatexCmds.mp = LatexCmds.mnplus = LatexCmds.minusplus = + bind(PlusMinus,'\\mp ','∓'); + +CharCmds['*'] = LatexCmds.sdot = LatexCmds.cdot = + bind(BinaryOperator, '\\cdot ', '·'); +//semantically should be ⋅, but · looks better + +LatexCmds['='] = bind(BinaryOperator, '=', '='); +LatexCmds['<'] = bind(BinaryOperator, '<', '<'); +LatexCmds['>'] = bind(BinaryOperator, '>', '>'); + +LatexCmds.notin = +LatexCmds.sim = +LatexCmds.cong = +LatexCmds.equiv = +LatexCmds.oplus = +LatexCmds.otimes = P(BinaryOperator, function(_, _super) { + _.init = function(latex) { + _super.init.call(this, '\\'+latex+' ', '&'+latex+';'); + }; +}); + +LatexCmds.times = bind(BinaryOperator, '\\times ', '×', '[x]'); + +LatexCmds['÷'] = LatexCmds.div = LatexCmds.divide = LatexCmds.divides = + bind(BinaryOperator,'\\div ','÷', '[/]'); + +LatexCmds['≠'] = LatexCmds.ne = LatexCmds.neq = bind(BinaryOperator,'\\ne ','≠'); + +LatexCmds.ast = LatexCmds.star = LatexCmds.loast = LatexCmds.lowast = + bind(BinaryOperator,'\\ast ','∗'); + //case 'there4 = // a special exception for this one, perhaps? +LatexCmds.therefor = LatexCmds.therefore = + bind(BinaryOperator,'\\therefore ','∴'); + +LatexCmds.cuz = // l33t +LatexCmds.because = bind(BinaryOperator,'\\because ','∵'); + +LatexCmds.prop = LatexCmds.propto = bind(BinaryOperator,'\\propto ','∝'); + +LatexCmds['≈'] = LatexCmds.asymp = LatexCmds.approx = bind(BinaryOperator,'\\approx ','≈'); + +LatexCmds.lt = bind(BinaryOperator,'<','<'); + +LatexCmds.gt = bind(BinaryOperator,'>','>'); + +LatexCmds['≤'] = LatexCmds.le = LatexCmds.leq = bind(BinaryOperator,'\\le ','≤'); + +LatexCmds['≥'] = LatexCmds.ge = LatexCmds.geq = bind(BinaryOperator,'\\ge ','≥'); + +LatexCmds.isin = LatexCmds['in'] = bind(BinaryOperator,'\\in ','∈'); + +LatexCmds.ni = LatexCmds.contains = bind(BinaryOperator,'\\ni ','∋'); + +LatexCmds.notni = LatexCmds.niton = LatexCmds.notcontains = LatexCmds.doesnotcontain = + bind(BinaryOperator,'\\not\\ni ','∌'); + +LatexCmds.sub = LatexCmds.subset = bind(BinaryOperator,'\\subset ','⊂'); + +LatexCmds.sup = LatexCmds.supset = LatexCmds.superset = + bind(BinaryOperator,'\\supset ','⊃'); + +LatexCmds.nsub = LatexCmds.notsub = +LatexCmds.nsubset = LatexCmds.notsubset = + bind(BinaryOperator,'\\not\\subset ','⊄'); + +LatexCmds.nsup = LatexCmds.notsup = +LatexCmds.nsupset = LatexCmds.notsupset = +LatexCmds.nsuperset = LatexCmds.notsuperset = + bind(BinaryOperator,'\\not\\supset ','⊅'); + +LatexCmds.sube = LatexCmds.subeq = LatexCmds.subsete = LatexCmds.subseteq = + bind(BinaryOperator,'\\subseteq ','⊆'); + +LatexCmds.supe = LatexCmds.supeq = +LatexCmds.supsete = LatexCmds.supseteq = +LatexCmds.supersete = LatexCmds.superseteq = + bind(BinaryOperator,'\\supseteq ','⊇'); + +LatexCmds.nsube = LatexCmds.nsubeq = +LatexCmds.notsube = LatexCmds.notsubeq = +LatexCmds.nsubsete = LatexCmds.nsubseteq = +LatexCmds.notsubsete = LatexCmds.notsubseteq = + bind(BinaryOperator,'\\not\\subseteq ','⊈'); + +LatexCmds.nsupe = LatexCmds.nsupeq = +LatexCmds.notsupe = LatexCmds.notsupeq = +LatexCmds.nsupsete = LatexCmds.nsupseteq = +LatexCmds.notsupsete = LatexCmds.notsupseteq = +LatexCmds.nsupersete = LatexCmds.nsuperseteq = +LatexCmds.notsupersete = LatexCmds.notsuperseteq = + bind(BinaryOperator,'\\not\\supseteq ','⊉'); + + +//sum, product, coproduct, integral +var BigSymbol = P(Symbol, function(_, _super) { + _.init = function(ch, html) { + _super.init.call(this, ch, ''+html+''); + }; +}); + +LatexCmds['∑'] = LatexCmds.sum = LatexCmds.summation = bind(BigSymbol,'\\sum ','∑'); +LatexCmds['∏'] = LatexCmds.prod = LatexCmds.product = bind(BigSymbol,'\\prod ','∏'); +LatexCmds.coprod = LatexCmds.coproduct = bind(BigSymbol,'\\coprod ','∐'); +LatexCmds['∫'] = LatexCmds['int'] = LatexCmds.integral = bind(BigSymbol,'\\int ','∫'); + + + +//the canonical sets of numbers +LatexCmds.N = LatexCmds.naturals = LatexCmds.Naturals = + bind(VanillaSymbol,'\\mathbb{N}','ℕ'); + +LatexCmds.P = +LatexCmds.primes = LatexCmds.Primes = +LatexCmds.projective = LatexCmds.Projective = +LatexCmds.probability = LatexCmds.Probability = + bind(VanillaSymbol,'\\mathbb{P}','ℙ'); + +LatexCmds.Z = LatexCmds.integers = LatexCmds.Integers = + bind(VanillaSymbol,'\\mathbb{Z}','ℤ'); + +LatexCmds.Q = LatexCmds.rationals = LatexCmds.Rationals = + bind(VanillaSymbol,'\\mathbb{Q}','ℚ'); + +LatexCmds.R = LatexCmds.reals = LatexCmds.Reals = + bind(VanillaSymbol,'\\mathbb{R}','ℝ'); + +LatexCmds.C = +LatexCmds.complex = LatexCmds.Complex = +LatexCmds.complexes = LatexCmds.Complexes = +LatexCmds.complexplane = LatexCmds.Complexplane = LatexCmds.ComplexPlane = + bind(VanillaSymbol,'\\mathbb{C}','ℂ'); + +LatexCmds.H = LatexCmds.Hamiltonian = LatexCmds.quaternions = LatexCmds.Quaternions = + bind(VanillaSymbol,'\\mathbb{H}','ℍ'); + +//spacing +LatexCmds.quad = LatexCmds.emsp = bind(VanillaSymbol,'\\quad ',' '); +LatexCmds.qquad = bind(VanillaSymbol,'\\qquad ',' '); +/* spacing special characters, gonna have to implement this in LatexCommandInput::onText somehow +case ',': + return VanillaSymbol('\\, ',' '); +case ':': + return VanillaSymbol('\\: ',' '); +case ';': + return VanillaSymbol('\\; ',' '); +case '!': + return Symbol('\\! ',''); +*/ + +//binary operators +LatexCmds.diamond = bind(VanillaSymbol, '\\diamond ', '◇'); +LatexCmds.bigtriangleup = bind(VanillaSymbol, '\\bigtriangleup ', '△'); +LatexCmds.ominus = bind(VanillaSymbol, '\\ominus ', '⊖'); +LatexCmds.uplus = bind(VanillaSymbol, '\\uplus ', '⊎'); +LatexCmds.bigtriangledown = bind(VanillaSymbol, '\\bigtriangledown ', '▽'); +LatexCmds.sqcap = bind(VanillaSymbol, '\\sqcap ', '⊓'); +LatexCmds.triangleleft = bind(VanillaSymbol, '\\triangleleft ', '⊲'); +LatexCmds.sqcup = bind(VanillaSymbol, '\\sqcup ', '⊔'); +LatexCmds.triangleright = bind(VanillaSymbol, '\\triangleright ', '⊳'); +LatexCmds.odot = bind(VanillaSymbol, '\\odot ', '⊙'); +LatexCmds.bigcirc = bind(VanillaSymbol, '\\bigcirc ', '◯'); +LatexCmds.dagger = bind(VanillaSymbol, '\\dagger ', '†'); +LatexCmds.ddagger = bind(VanillaSymbol, '\\ddagger ', '‡'); +LatexCmds.wr = bind(VanillaSymbol, '\\wr ', '≀'); +LatexCmds.amalg = bind(VanillaSymbol, '\\amalg ', '∐'); + +//relationship symbols +LatexCmds.models = bind(VanillaSymbol, '\\models ', '⊨'); +LatexCmds.prec = bind(VanillaSymbol, '\\prec ', '≺'); +LatexCmds.succ = bind(VanillaSymbol, '\\succ ', '≻'); +LatexCmds.preceq = bind(VanillaSymbol, '\\preceq ', '≼'); +LatexCmds.succeq = bind(VanillaSymbol, '\\succeq ', '≽'); +LatexCmds.simeq = bind(VanillaSymbol, '\\simeq ', '≃'); +LatexCmds.mid = bind(VanillaSymbol, '\\mid ', '∣'); +LatexCmds.ll = bind(VanillaSymbol, '\\ll ', '≪'); +LatexCmds.gg = bind(VanillaSymbol, '\\gg ', '≫'); +LatexCmds.parallel = bind(VanillaSymbol, '\\parallel ', '∥'); +LatexCmds.bowtie = bind(VanillaSymbol, '\\bowtie ', '⋈'); +LatexCmds.sqsubset = bind(VanillaSymbol, '\\sqsubset ', '⊏'); +LatexCmds.sqsupset = bind(VanillaSymbol, '\\sqsupset ', '⊐'); +LatexCmds.smile = bind(VanillaSymbol, '\\smile ', '⌣'); +LatexCmds.sqsubseteq = bind(VanillaSymbol, '\\sqsubseteq ', '⊑'); +LatexCmds.sqsupseteq = bind(VanillaSymbol, '\\sqsupseteq ', '⊒'); +LatexCmds.doteq = bind(VanillaSymbol, '\\doteq ', '≐'); +LatexCmds.frown = bind(VanillaSymbol, '\\frown ', '⌢'); +LatexCmds.vdash = bind(VanillaSymbol, '\\vdash ', '⊦'); +LatexCmds.dashv = bind(VanillaSymbol, '\\dashv ', '⊣'); + +//arrows +LatexCmds.longleftarrow = bind(VanillaSymbol, '\\longleftarrow ', '←'); +LatexCmds.longrightarrow = bind(VanillaSymbol, '\\longrightarrow ', '→'); +LatexCmds.Longleftarrow = bind(VanillaSymbol, '\\Longleftarrow ', '⇐'); +LatexCmds.Longrightarrow = bind(VanillaSymbol, '\\Longrightarrow ', '⇒'); +LatexCmds.longleftrightarrow = bind(VanillaSymbol, '\\longleftrightarrow ', '↔'); +LatexCmds.updownarrow = bind(VanillaSymbol, '\\updownarrow ', '↕'); +LatexCmds.Longleftrightarrow = bind(VanillaSymbol, '\\Longleftrightarrow ', '⇔'); +LatexCmds.Updownarrow = bind(VanillaSymbol, '\\Updownarrow ', '⇕'); +LatexCmds.mapsto = bind(VanillaSymbol, '\\mapsto ', '↦'); +LatexCmds.nearrow = bind(VanillaSymbol, '\\nearrow ', '↗'); +LatexCmds.hookleftarrow = bind(VanillaSymbol, '\\hookleftarrow ', '↩'); +LatexCmds.hookrightarrow = bind(VanillaSymbol, '\\hookrightarrow ', '↪'); +LatexCmds.searrow = bind(VanillaSymbol, '\\searrow ', '↘'); +LatexCmds.leftharpoonup = bind(VanillaSymbol, '\\leftharpoonup ', '↼'); +LatexCmds.rightharpoonup = bind(VanillaSymbol, '\\rightharpoonup ', '⇀'); +LatexCmds.swarrow = bind(VanillaSymbol, '\\swarrow ', '↙'); +LatexCmds.leftharpoondown = bind(VanillaSymbol, '\\leftharpoondown ', '↽'); +LatexCmds.rightharpoondown = bind(VanillaSymbol, '\\rightharpoondown ', '⇁'); +LatexCmds.nwarrow = bind(VanillaSymbol, '\\nwarrow ', '↖'); + +//Misc +LatexCmds.ldots = bind(VanillaSymbol, '\\ldots ', '…'); +LatexCmds.cdots = bind(VanillaSymbol, '\\cdots ', '⋯'); +LatexCmds.vdots = bind(VanillaSymbol, '\\vdots ', '⋮'); +LatexCmds.ddots = bind(VanillaSymbol, '\\ddots ', '⋰'); +LatexCmds.surd = bind(VanillaSymbol, '\\surd ', '√'); +LatexCmds.triangle = bind(VanillaSymbol, '\\triangle ', '▵'); +LatexCmds.ell = bind(VanillaSymbol, '\\ell ', 'ℓ'); +LatexCmds.top = bind(VanillaSymbol, '\\top ', '⊤'); +LatexCmds.flat = bind(VanillaSymbol, '\\flat ', '♭'); +LatexCmds.natural = bind(VanillaSymbol, '\\natural ', '♮'); +LatexCmds.sharp = bind(VanillaSymbol, '\\sharp ', '♯'); +LatexCmds.wp = bind(VanillaSymbol, '\\wp ', '℘'); +LatexCmds.bot = bind(VanillaSymbol, '\\bot ', '⊥'); +LatexCmds.clubsuit = bind(VanillaSymbol, '\\clubsuit ', '♣'); +LatexCmds.diamondsuit = bind(VanillaSymbol, '\\diamondsuit ', '♢'); +LatexCmds.heartsuit = bind(VanillaSymbol, '\\heartsuit ', '♡'); +LatexCmds.spadesuit = bind(VanillaSymbol, '\\spadesuit ', '♠'); + +//variable-sized +LatexCmds.oint = bind(VanillaSymbol, '\\oint ', '∮'); +LatexCmds.bigcap = bind(VanillaSymbol, '\\bigcap ', '∩'); +LatexCmds.bigcup = bind(VanillaSymbol, '\\bigcup ', '∪'); +LatexCmds.bigsqcup = bind(VanillaSymbol, '\\bigsqcup ', '⊔'); +LatexCmds.bigvee = bind(VanillaSymbol, '\\bigvee ', '∨'); +LatexCmds.bigwedge = bind(VanillaSymbol, '\\bigwedge ', '∧'); +LatexCmds.bigodot = bind(VanillaSymbol, '\\bigodot ', '⊙'); +LatexCmds.bigotimes = bind(VanillaSymbol, '\\bigotimes ', '⊗'); +LatexCmds.bigoplus = bind(VanillaSymbol, '\\bigoplus ', '⊕'); +LatexCmds.biguplus = bind(VanillaSymbol, '\\biguplus ', '⊎'); + +//delimiters +LatexCmds.lfloor = bind(VanillaSymbol, '\\lfloor ', '⌊'); +LatexCmds.rfloor = bind(VanillaSymbol, '\\rfloor ', '⌋'); +LatexCmds.lceil = bind(VanillaSymbol, '\\lceil ', '⌈'); +LatexCmds.rceil = bind(VanillaSymbol, '\\rceil ', '⌉'); +LatexCmds.slash = bind(VanillaSymbol, '\\slash ', '/'); +LatexCmds.opencurlybrace = bind(VanillaSymbol, '\\opencurlybrace ', '{'); +LatexCmds.closecurlybrace = bind(VanillaSymbol, '\\closecurlybrace ', '}'); + +//various symbols + +LatexCmds.caret = bind(VanillaSymbol,'\\caret ','^'); +LatexCmds.underscore = bind(VanillaSymbol,'\\underscore ','_'); +LatexCmds.backslash = bind(VanillaSymbol,'\\backslash ','\\'); +LatexCmds.vert = bind(VanillaSymbol,'|'); +LatexCmds.perp = LatexCmds.perpendicular = bind(VanillaSymbol,'\\perp ','⊥'); +LatexCmds.nabla = LatexCmds.del = bind(VanillaSymbol,'\\nabla ','∇'); +LatexCmds.hbar = bind(VanillaSymbol,'\\hbar ','ℏ'); + +LatexCmds.AA = LatexCmds.Angstrom = LatexCmds.angstrom = + bind(VanillaSymbol,'\\text\\AA ','Å'); + +LatexCmds.ring = LatexCmds.circ = LatexCmds.circle = + bind(VanillaSymbol,'\\circ ','∘'); + +LatexCmds.bull = LatexCmds.bullet = bind(VanillaSymbol,'\\bullet ','•'); + +LatexCmds.setminus = LatexCmds.smallsetminus = + bind(VanillaSymbol,'\\setminus ','∖'); + +LatexCmds.not = //bind(Symbol,'\\not ','/'); +LatexCmds['¬'] = LatexCmds.neg = bind(VanillaSymbol,'\\neg ','¬'); + +LatexCmds['…'] = LatexCmds.dots = LatexCmds.ellip = LatexCmds.hellip = +LatexCmds.ellipsis = LatexCmds.hellipsis = + bind(VanillaSymbol,'\\dots ','…'); + +LatexCmds.converges = +LatexCmds.darr = LatexCmds.dnarr = LatexCmds.dnarrow = LatexCmds.downarrow = + bind(VanillaSymbol,'\\downarrow ','↓'); + +LatexCmds.dArr = LatexCmds.dnArr = LatexCmds.dnArrow = LatexCmds.Downarrow = + bind(VanillaSymbol,'\\Downarrow ','⇓'); + +LatexCmds.diverges = LatexCmds.uarr = LatexCmds.uparrow = + bind(VanillaSymbol,'\\uparrow ','↑'); + +LatexCmds.uArr = LatexCmds.Uparrow = bind(VanillaSymbol,'\\Uparrow ','⇑'); + +LatexCmds.to = bind(BinaryOperator,'\\to ','→'); + +LatexCmds.rarr = LatexCmds.rightarrow = bind(VanillaSymbol,'\\rightarrow ','→'); + +LatexCmds.implies = bind(BinaryOperator,'\\Rightarrow ','⇒'); + +LatexCmds.rArr = LatexCmds.Rightarrow = bind(VanillaSymbol,'\\Rightarrow ','⇒'); + +LatexCmds.gets = bind(BinaryOperator,'\\gets ','←'); + +LatexCmds.larr = LatexCmds.leftarrow = bind(VanillaSymbol,'\\leftarrow ','←'); + +LatexCmds.impliedby = bind(BinaryOperator,'\\Leftarrow ','⇐'); + +LatexCmds.lArr = LatexCmds.Leftarrow = bind(VanillaSymbol,'\\Leftarrow ','⇐'); + +LatexCmds.harr = LatexCmds.lrarr = LatexCmds.leftrightarrow = + bind(VanillaSymbol,'\\leftrightarrow ','↔'); + +LatexCmds.iff = bind(BinaryOperator,'\\Leftrightarrow ','⇔'); + +LatexCmds.hArr = LatexCmds.lrArr = LatexCmds.Leftrightarrow = + bind(VanillaSymbol,'\\Leftrightarrow ','⇔'); + +LatexCmds.Re = LatexCmds.Real = LatexCmds.real = bind(VanillaSymbol,'\\Re ','ℜ'); + +LatexCmds.Im = LatexCmds.imag = +LatexCmds.image = LatexCmds.imagin = LatexCmds.imaginary = LatexCmds.Imaginary = + bind(VanillaSymbol,'\\Im ','ℑ'); + +LatexCmds.part = LatexCmds.partial = bind(VanillaSymbol,'\\partial ','∂'); + +LatexCmds.inf = LatexCmds.infin = LatexCmds.infty = LatexCmds.infinity = + bind(VanillaSymbol,'\\infty ','∞'); + +LatexCmds.alef = LatexCmds.alefsym = LatexCmds.aleph = LatexCmds.alephsym = + bind(VanillaSymbol,'\\aleph ','ℵ'); + +LatexCmds.xist = //LOL +LatexCmds.xists = LatexCmds.exist = LatexCmds.exists = + bind(VanillaSymbol,'\\exists ','∃'); + +LatexCmds.and = LatexCmds.land = LatexCmds.wedge = + bind(VanillaSymbol,'\\wedge ','∧'); + +LatexCmds.or = LatexCmds.lor = LatexCmds.vee = bind(VanillaSymbol,'\\vee ','∨'); + +LatexCmds.o = LatexCmds.O = +LatexCmds.empty = LatexCmds.emptyset = +LatexCmds.oslash = LatexCmds.Oslash = +LatexCmds.nothing = LatexCmds.varnothing = + bind(BinaryOperator,'\\varnothing ','∅'); + +LatexCmds.cup = LatexCmds.union = bind(BinaryOperator,'\\cup ','∪'); + +LatexCmds.cap = LatexCmds.intersect = LatexCmds.intersection = + bind(BinaryOperator,'\\cap ','∩'); + +LatexCmds.deg = LatexCmds.degree = bind(VanillaSymbol,'^\\circ ','°'); + +LatexCmds.ang = LatexCmds.angle = bind(VanillaSymbol,'\\angle ','∠'); + + +var NonItalicizedFunction = P(Symbol, function(_, _super) { + _.init = function(fn) { + _super.init.call(this, '\\'+fn+' ', ''+fn+''); + }; + _.respace = function() + { + this.jQ[0].className = + (this[R] instanceof SupSub || this[R] instanceof Bracket) ? + '' : 'non-italicized-function'; + }; +}); + +LatexCmds.ln = +LatexCmds.lg = +LatexCmds.log = +LatexCmds.span = +LatexCmds.proj = +LatexCmds.det = +LatexCmds.dim = +LatexCmds.min = +LatexCmds.max = +LatexCmds.mod = +LatexCmds.lcm = +LatexCmds.gcd = +LatexCmds.gcf = +LatexCmds.hcf = +LatexCmds.lim = NonItalicizedFunction; + +(function() { + var trig = ['sin', 'cos', 'tan', 'sec', 'cosec', 'csc', 'cotan', 'cot']; + for (var i in trig) { + LatexCmds[trig[i]] = + LatexCmds[trig[i]+'h'] = + LatexCmds['a'+trig[i]] = LatexCmds['arc'+trig[i]] = + LatexCmds['a'+trig[i]+'h'] = LatexCmds['arc'+trig[i]+'h'] = + NonItalicizedFunction; + } +}()); + +// Parser MathCommand +var latexMathParser = (function() { + function commandToBlock(cmd) { + var block = MathBlock(); + cmd.adopt(block, 0, 0); + return block; + } + function joinBlocks(blocks) { + var firstBlock = blocks[0] || MathBlock(); + + for (var i = 1; i < blocks.length; i += 1) { + blocks[i].children().adopt(firstBlock, firstBlock.ends[R], 0); + } + + return firstBlock; + } + + var string = Parser.string; + var regex = Parser.regex; + var letter = Parser.letter; + var any = Parser.any; + var optWhitespace = Parser.optWhitespace; + var succeed = Parser.succeed; + var fail = Parser.fail; + + // Parsers yielding MathCommands + var variable = letter.map(Variable); + var symbol = regex(/^[^${}\\_^]/).map(VanillaSymbol); + + var controlSequence = + regex(/^[^\\a-eg-zA-Z]/) // hotfix #164; match MathBlock::write + .or(string('\\').then( + regex(/^[a-z]+/i) + .or(regex(/^\s+/).result(' ')) + .or(any) + )).then(function(ctrlSeq) { + var cmdKlass = LatexCmds[ctrlSeq]; + + if (cmdKlass) { + return cmdKlass(ctrlSeq).parser(); + } + else { + return fail('unknown command: \\'+ctrlSeq); + } + }) + ; + + var command = + controlSequence + .or(variable) + .or(symbol) + ; + + // Parsers yielding MathBlocks + var mathGroup = string('{').then(function() { return mathSequence; }).skip(string('}')); + var mathBlock = optWhitespace.then(mathGroup.or(command.map(commandToBlock))); + var mathSequence = mathBlock.many().map(joinBlocks).skip(optWhitespace); + + var optMathBlock = + string('[').then( + mathBlock.then(function(block) { + return block.join('latex') !== ']' ? succeed(block) : fail(); + }) + .many().map(joinBlocks).skip(optWhitespace) + ).skip(string(']')) + ; + + var latexMath = mathSequence; + + latexMath.block = mathBlock; + latexMath.optBlock = optMathBlock; + return latexMath; +})(); +/******************************************** + * Cursor and Selection "singleton" classes + *******************************************/ + +/* The main thing that manipulates the Math DOM. Makes sure to manipulate the +HTML DOM to match. */ + +/* Sort of singletons, since there should only be one per editable math +textbox, but any one HTML document can contain many such textboxes, so any one +JS environment could actually contain many instances. */ + +//A fake cursor in the fake textbox that the math is rendered in. +var Cursor = P(Point, function(_) { + _.init = function(root) { + this.parent = this.root = root; + var jQ = this.jQ = this._jQ = $(''); + + //closured for setInterval + this.blink = function(){ jQ.toggleClass('blink'); }; + + this.upDownCache = {}; + }; + + _.show = function() { + this.jQ = this._jQ.removeClass('blink'); + if ('intervalId' in this) //already was shown, just restart interval + clearInterval(this.intervalId); + else { //was hidden and detached, insert this.jQ back into HTML DOM + if (this[R]) { + if (this.selection && this.selection.ends[L][L] === this[L]) + this.jQ.insertBefore(this.selection.jQ); + else + this.jQ.insertBefore(this[R].jQ.first()); + } + else + this.jQ.appendTo(this.parent.jQ); + this.parent.focus(); + } + this.intervalId = setInterval(this.blink, 500); + return this; + }; + _.hide = function() { + if ('intervalId' in this) + clearInterval(this.intervalId); + delete this.intervalId; + this.jQ.detach(); + this.jQ = $(); + return this; + }; + + _.withDirInsertAt = function(dir, parent, withDir, oppDir) { + var oldParent = this.parent; + this.parent = parent; + this[dir] = withDir; + this[-dir] = oppDir; + oldParent.blur(); + }; + _.insDirOf = function(dir, el) { + prayDirection(dir); + this.withDirInsertAt(dir, el.parent, el[dir], el); + this.parent.jQ.addClass('hasCursor'); + this.jQ.insDirOf(dir, el.jQ); + return this; + }; + _.insLeftOf = function(el) { return this.insDirOf(L, el); }; + _.insRightOf = function(el) { return this.insDirOf(R, el); }; + + _.insAtDirEnd = function(dir, el) { + prayDirection(dir); + this.withDirInsertAt(dir, el, 0, el.ends[dir]); + + // never insert before textarea + if (dir === L && el.textarea) { + this.jQ.insDirOf(-dir, el.textarea); + } + else { + this.jQ.insAtDirEnd(dir, el.jQ); + } + + el.focus(); + + return this; + }; + _.insAtLeftEnd = function(el) { return this.insAtDirEnd(L, el); }; + _.insAtRightEnd = function(el) { return this.insAtDirEnd(R, el); }; + + _.hopDir = function(dir) { + prayDirection(dir); + + this.jQ.insDirOf(dir, this[dir].jQ); + this[-dir] = this[dir]; + this[dir] = this[dir][dir]; + return this; + }; + _.hopLeft = function() { return this.hopDir(L); }; + _.hopRight = function() { return this.hopDir(R); }; + + _.moveDirWithin = function(dir, block) { + prayDirection(dir); + + if (this[dir]) { + if (this[dir].ends[-dir]) this.insAtDirEnd(-dir, this[dir].ends[-dir]); + else this.hopDir(dir); + } + else { + // we're at the beginning/end of the containing block, so do nothing + if (this.parent === block) return; + + if (this.parent[dir]) this.insAtDirEnd(-dir, this.parent[dir]); + else this.insDirOf(dir, this.parent.parent); + } + }; + _.moveLeftWithin = function(block) { + return this.moveDirWithin(L, block); + }; + _.moveRightWithin = function(block) { + return this.moveDirWithin(R, block); + }; + _.moveDir = function(dir) { + prayDirection(dir); + + clearUpDownCache(this); + + if (this.selection) { + this.insDirOf(dir, this.selection.ends[dir]).clearSelection(); + } + else { + this.moveDirWithin(dir, this.root); + } + + return this.show(); + }; + _.moveLeft = function() { return this.moveDir(L); }; + _.moveRight = function() { return this.moveDir(R); }; + + /** + * moveUp and moveDown have almost identical algorithms: + * - first check left and right, if so insAtLeft/RightEnd of them + * - else check the parent's 'up'/'down' property - if it's a function, + * call it with the cursor as the sole argument and use the return value. + * + * Given undefined, will bubble up to the next ancestor block. + * Given false, will stop bubbling. + * Given a MathBlock, + * + moveUp will insAtRightEnd of it + * + moveDown will insAtLeftEnd of it + * + */ + _.moveUp = function() { return moveUpDown(this, 'up'); }; + _.moveDown = function() { return moveUpDown(this, 'down'); }; + function moveUpDown(self, dir) { + if (self[R][dir]) self.insAtLeftEnd(self[R][dir]); + else if (self[L][dir]) self.insAtRightEnd(self[L][dir]); + else { + var ancestorBlock = self.parent; + do { + var prop = ancestorBlock[dir]; + if (prop) { + if (typeof prop === 'function') prop = ancestorBlock[dir](self); + if (prop === false || prop instanceof MathBlock) { + self.upDownCache[ancestorBlock.id] = Point(self.parent, self[L], self[R]); + + if (prop instanceof MathBlock) { + var cached = self.upDownCache[prop.id]; + + if (cached) { + if (cached[R]) { + self.insLeftOf(cached[R]); + } else { + self.insAtRightEnd(cached.parent); + } + } else { + var pageX = offset(self).left; + self.insAtRightEnd(prop); + self.seekHoriz(pageX, prop); + } + } + break; + } + } + ancestorBlock = ancestorBlock.parent.parent; + } while (ancestorBlock); + } + + return self.clearSelection().show(); + } + + _.seek = function(target, pageX, pageY) { + clearUpDownCache(this); + var cmd, block, cursor = this.clearSelection().show(); + if (target.hasClass('empty')) { + cursor.insAtLeftEnd(MathElement[target.attr(mqBlockId)]); + return cursor; + } + + cmd = MathElement[target.attr(mqCmdId)]; + if (cmd instanceof Symbol) { //insert at whichever side is closer + if (target.outerWidth() > 2*(pageX - target.offset().left)) + cursor.insLeftOf(cmd); + else + cursor.insRightOf(cmd); + + return cursor; + } + if (!cmd) { + block = MathElement[target.attr(mqBlockId)]; + if (!block) { //if no MathQuill data, try parent, if still no, just start from the root + target = target.parent(); + cmd = MathElement[target.attr(mqCmdId)]; + if (!cmd) { + block = MathElement[target.attr(mqBlockId)]; + if (!block) block = cursor.root; + } + } + } + + if (cmd) + cursor.insRightOf(cmd); + else + cursor.insAtRightEnd(block); + + return cursor.seekHoriz(pageX, cursor.root); + }; + _.seekHoriz = function(pageX, block) { + //move cursor to position closest to click + var cursor = this; + var dist = offset(cursor).left - pageX; + var leftDist; + + do { + cursor.moveLeftWithin(block); + leftDist = dist; + dist = offset(cursor).left - pageX; + } + while (dist > 0 && (cursor[L] || cursor.parent !== block)); + + if (-dist > leftDist) cursor.moveRightWithin(block); + + return cursor; + }; + function offset(self) { + //in Opera 11.62, .getBoundingClientRect() and hence jQuery::offset() + //returns all 0's on inline elements with negative margin-right (like + //the cursor) at the end of their parent, so temporarily remove the + //negative margin-right when calling jQuery::offset() + //Opera bug DSK-360043 + //http://bugs.jquery.com/ticket/11523 + //https://github.com/jquery/jquery/pull/717 + var offset = self.jQ.removeClass('cursor').offset(); + self.jQ.addClass('cursor'); + return offset; + } + _.writeLatex = function(latex) { + var self = this; + clearUpDownCache(self); + self.show().deleteSelection(); + + var all = Parser.all; + var eof = Parser.eof; + + var block = latexMathParser.skip(eof).or(all.result(false)).parse(latex); + + if (block) { + block.children().adopt(self.parent, self[L], self[R]); + MathElement.jQize(block.join('html')).insertBefore(self.jQ); + self[L] = block.ends[R]; + block.finalizeInsert(); + self.parent.bubble('redraw'); + } + + return this.hide(); + }; + _.write = function(ch) { + var seln = this.prepareWrite(); + return this.insertCh(ch, seln); + }; + _.insertCh = function(ch, replacedFragment) { + this.parent.write(this, ch, replacedFragment); + return this; + }; + _.insertCmd = function(latexCmd, replacedFragment) { + var cmd = LatexCmds[latexCmd]; + if (cmd) { + cmd = cmd(latexCmd); + if (replacedFragment) cmd.replaces(replacedFragment); + cmd.createLeftOf(this); + } + else { + cmd = TextBlock(); + cmd.replaces(latexCmd); + cmd.ends[L].focus = function(){ delete this.focus; return this; }; + cmd.createLeftOf(this); + this.insRightOf(cmd); + if (replacedFragment) + replacedFragment.remove(); + } + return this; + }; + _.unwrapGramp = function() { + var gramp = this.parent.parent; + var greatgramp = gramp.parent; + var rightward = gramp[R]; + var cursor = this; + + var leftward = gramp[L]; + gramp.disown().eachChild(function(uncle) { + if (uncle.isEmpty()) return; + + uncle.children() + .adopt(greatgramp, leftward, rightward) + .each(function(cousin) { + cousin.jQ.insertBefore(gramp.jQ.first()); + }) + ; + + leftward = uncle.ends[R]; + }); + + if (!this[R]) { //then find something to be rightward to insLeftOf + if (this[L]) + this[R] = this[L][R]; + else { + while (!this[R]) { + this.parent = this.parent[R]; + if (this.parent) + this[R] = this.parent.ends[L]; + else { + this[R] = gramp[R]; + this.parent = greatgramp; + break; + } + } + } + } + if (this[R]) + this.insLeftOf(this[R]); + else + this.insAtRightEnd(greatgramp); + + gramp.jQ.remove(); + + if (gramp[L]) + gramp[L].respace(); + if (gramp[R]) + gramp[R].respace(); + }; + _.deleteDir = function(dir) { + prayDirection(dir); + clearUpDownCache(this); + this.show(); + + if (this.deleteSelection()); // pass + else if (this[dir]) { + if (this[dir].isEmpty()) + this[dir] = this[dir].remove()[dir]; + else + this.selectDir(dir); + } + else if (this.parent !== this.root) { + if (this.parent.parent.isEmpty()) + return this.insDirOf(-dir, this.parent.parent).deleteDir(dir); + else + this.unwrapGramp(); + } + + if (this[L]) + this[L].respace(); + if (this[R]) + this[R].respace(); + this.parent.bubble('redraw'); + + return this; + }; + _.backspace = function() { return this.deleteDir(L); }; + _.deleteForward = function() { return this.deleteDir(R); }; + _.selectFrom = function(anticursor) { + //find ancestors of each with common parent + var oneA = this, otherA = anticursor; //one ancestor, the other ancestor + loopThroughAncestors: while (true) { + for (var oneI = this; oneI !== oneA.parent.parent; oneI = oneI.parent.parent) //one intermediate, the other intermediate + if (oneI.parent === otherA.parent) { + left = oneI; + right = otherA; + break loopThroughAncestors; + } + + for (var otherI = anticursor; otherI !== otherA.parent.parent; otherI = otherI.parent.parent) + if (oneA.parent === otherI.parent) { + left = oneA; + right = otherI; + break loopThroughAncestors; + } + + if (oneA.parent.parent) + oneA = oneA.parent.parent; + if (otherA.parent.parent) + otherA = otherA.parent.parent; + } + //figure out which is leftward and which is rightward + var left, right, leftRight; + if (left[R] !== right) { + for (var rightward = left; rightward; rightward = rightward[R]) { + if (rightward === right[L]) { + leftRight = true; + break; + } + } + if (!leftRight) { + leftRight = right; + right = left; + left = leftRight; + } + } + this.hide().selection = Selection(left[L][R] || left.parent.ends[L], right[R][L] || right.parent.ends[R]); + this.insRightOf(right[R][L] || right.parent.ends[R]); + this.root.selectionChanged(); + }; + _.selectDir = function(dir) { + prayDirection(dir); + clearUpDownCache(this); + + if (this.selection) { + // if cursor is at the (dir) edge of selection + if (this.selection.ends[dir] === this[-dir]) { + // then extend (dir) if possible + if (this[dir]) this.hopDir(dir).selection.extendDir(dir); + // else level up if possible + else if (this.parent !== this.root) { + this.insDirOf(dir, this.parent.parent).selection.levelUp(); + } + } + // else cursor is at the (-dir) edge of selection, retract if possible + else { + this.hopDir(dir); + + // clear the selection if we only have one thing selected + if (this.selection.ends[dir] === this.selection.ends[-dir]) { + this.clearSelection().show(); + return; + } + + this.selection.retractDir(dir); + } + } + // no selection, create one + else { + if (this[dir]) this.hopDir(dir); + // else edge of a block + else { + if (this.parent === this.root) return; + + this.insDirOf(dir, this.parent.parent); + } + + this.hide().selection = Selection(this[-dir]); + } + + this.root.selectionChanged(); + }; + _.selectLeft = function() { return this.selectDir(L); }; + _.selectRight = function() { return this.selectDir(R); }; + + function clearUpDownCache(self) { + self.upDownCache = {}; + } + + _.prepareMove = function() { + clearUpDownCache(this); + return this.show().clearSelection(); + }; + _.prepareEdit = function() { + clearUpDownCache(this); + return this.show().deleteSelection(); + }; + _.prepareWrite = function() { + clearUpDownCache(this); + return this.show().replaceSelection(); + }; + + _.clearSelection = function() { + if (this.selection) { + this.selection.clear(); + delete this.selection; + this.root.selectionChanged(); + } + return this; + }; + _.deleteSelection = function() { + if (!this.selection) return false; + + this[L] = this.selection.ends[L][L]; + this[R] = this.selection.ends[R][R]; + this.selection.remove(); + this.root.selectionChanged(); + return delete this.selection; + }; + _.replaceSelection = function() { + var seln = this.selection; + if (seln) { + this[L] = seln.ends[L][L]; + this[R] = seln.ends[R][R]; + delete this.selection; + } + return seln; + }; +}); + +var Selection = P(MathFragment, function(_, _super) { + _.init = function() { + var frag = this; + _super.init.apply(frag, arguments); + + frag.jQwrap(frag.jQ); + }; + _.jQwrap = function(children) { + this.jQ = children.wrapAll('').parent(); + //can't do wrapAll(this.jQ = $(...)) because wrapAll will clone it + }; + _.adopt = function() { + this.jQ.replaceWith(this.jQ = this.jQ.children()); + return _super.adopt.apply(this, arguments); + }; + _.clear = function() { + this.jQ.replaceWith(this.jQ.children()); + return this; + }; + _.levelUp = function() { + var seln = this, + gramp = seln.ends[L] = seln.ends[R] = seln.ends[R].parent.parent; + seln.clear().jQwrap(gramp.jQ); + return seln; + }; + _.extendDir = function(dir) { + prayDirection(dir); + this.ends[dir] = this.ends[dir][dir]; + this.ends[dir].jQ.insAtDirEnd(dir, this.jQ); + return this; + }; + _.extendLeft = function() { return this.extendDir(L); }; + _.extendRight = function() { return this.extendDir(R); }; + + _.retractDir = function(dir) { + prayDirection(dir); + this.ends[-dir].jQ.insDirOf(-dir, this.jQ); + this.ends[-dir] = this.ends[-dir][dir]; + }; + _.retractRight = function() { return this.retractDir(R); }; + _.retractLeft = function() { return this.retractDir(L); }; +}); +/********************************************************* + * The actual jQuery plugin and document ready handlers. + ********************************************************/ + +//The publicy exposed method of jQuery.prototype, available (and meant to be +//called) on jQuery-wrapped HTML DOM elements. +jQuery.fn.mathquill = function(cmd, latex) { + switch (cmd) { + case 'redraw': + return this.each(function() { + var blockId = $(this).attr(mqBlockId), + rootBlock = blockId && MathElement[blockId]; + if (rootBlock) { + (function postOrderRedraw(el) { + el.eachChild(postOrderRedraw); + if (el.redraw) el.redraw(); + }(rootBlock)); + } + }); + case 'revert': + return this.each(function() { + var blockId = $(this).attr(mqBlockId), + block = blockId && MathElement[blockId]; + if (block && block.revert) + block.revert(); + }); + case 'latex': + if (arguments.length > 1) { + return this.each(function() { + var blockId = $(this).attr(mqBlockId), + block = blockId && MathElement[blockId]; + if (block) + block.renderLatex(latex); + }); + } + + var blockId = $(this).attr(mqBlockId), + block = blockId && MathElement[blockId]; + return block && block.latex(); + case 'text': + var blockId = $(this).attr(mqBlockId), + block = blockId && MathElement[blockId]; + return block && block.text(); + case 'html': + return this.html().replace(/ ?hasCursor|hasCursor /, '') + .replace(/ class=(""|(?= |>))/g, '') + .replace(/<\/span>/i, '') + .replace(/'),m=l.children(),n.selectionChanged=function(){g===a&&(g=setTimeout(s)),O(e[0])},e.bind("selectstart.mathquill",function(t){t.target!==m[0]&&t.preventDefault(),t.stopPropagation()}),v=c.blink,e.bind("mousedown.mathquill",function(n){function i(t){return c.seek(f(t.target),t.pageX,t.pageY),(c[u]!==b[u]||c.parent!==b.parent)&&c.selectFrom(b),!1}function s(t){return delete t.target,i(t)}function o(t){b=a,c.blink=v,c.selection||(r?c.show():l.detach()),e.unbind("mousemove",i),f(t.target.ownerDocument).unbind("mousemove",s).unbind("mouseup",o)}return setTimeout(function(){m.focus()}),c.blink=t,c.seek(f(n.target),n.pageX,n.pageY),b=d(c.parent,c[u],c[p]),r||e.prepend(l),e.mousemove(i),f(n.target.ownerDocument).mousemove(s).mouseup(o),!1}),r?(w=h(m,{container:e,key:function(t,e){c.parent.bubble("onKey",t,e)},text:function(t){c.parent.bubble("onText",t)},cut:function(t){c.selection&&setTimeout(function(){c.prepareEdit(),c.parent.bubble("redraw")}),t.stopPropagation()},paste:function(t){t="$"===t.slice(0,1)&&"$"===t.slice(-1)?t.slice(1,-1):"\\text{"+t+"}",c.writeLatex(t).show()}}),e.prepend(l),e.addClass("mathquill-editable"),i&&e.addClass("mathquill-textbox"),m.focus(function(t){c.parent||c.insAtRightEnd(n),c.parent.jQ.addClass("hasCursor"),c.selection?(c.selection.jQ.removeClass("blur"),setTimeout(n.selectionChanged)):c.show(),t.stopPropagation()}).blur(function(t){c.hide().parent.blur(),c.selection&&c.selection.jQ.addClass("blur"),t.stopPropagation()}),e.bind("focus.mathquill blur.mathquill",function(t){m.trigger(t)}).blur(),a):(w=h(m,{container:e}),e.bind("cut paste",!1).bind("copy",s).prepend('$'+n.latex()+"$"),m.blur(function(){c.clearSelection(),setTimeout(o)}),a)}function s(t,e,n){return c(K,{ctrlSeq:t,htmlTemplate:"<"+e+" "+n+">&0"})}var a,o,c,h,l,u,p,f,d,m,g,b,v,w,x,j,k,q,y,Q,C,S,L,D,O,E,A,R,T,z,B,I,$,_,W,M,F,P,U,H,K,N,G,X,Z,Y,J,V,te,ee,ne,ie,re,se,ae=window.jQuery,oe="mathquill-command-id",ce="mathquill-block-id",he=Math.min;Math.max,o=[].slice,c=function(t,e,n){function i(t){return"object"==typeof t}function r(t){return"function"==typeof t}function s(){}function a(o,c){function h(){var t=new l;return r(t.init)&&t.init.apply(t,arguments),t}function l(){}var u,p,f;return c===n&&(c=o,o=Object),h.Bare=l,u=s[t]=o[t],p=l[t]=h[t]=new s,p.constructor=h,h.mixin=function(e){return l[t]=h[t]=a(h,e)[t],h},(h.open=function(t){if(f={},r(t)?f=t.call(h,p,u,h,o):i(t)&&(f=t),i(f))for(var n in f)e.call(f,n)&&(p[n]=f[n]);return r(p.init)||(p.init=o),h})(c)}return a}("prototype",{}.hasOwnProperty),h=function(){function e(t){var e,i=t.which||t.keyCode,r=n[i],s=[];return t.ctrlKey&&s.push("Ctrl"),t.originalEvent&&t.originalEvent.metaKey&&s.push("Meta"),t.altKey&&s.push("Alt"),t.shiftKey&&s.push("Shift"),e=r||String.fromCharCode(i),s.length||r?(s.push(e),s.join("-")):e}var n={8:"Backspace",9:"Tab",10:"Enter",13:"Enter",16:"Shift",17:"Control",18:"Alt",20:"CapsLock",27:"Esc",32:"Spacebar",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",45:"Insert",46:"Del",144:"NumLock"};return function(n,i){function r(t){k=t,clearTimeout(j),j=setTimeout(t)}function s(e){k(),k=t,clearTimeout(j),w.val(e),e&&w[0].select()}function a(){var t=w[0];return"selectionStart"in t?t.selectionStart!==t.selectionEnd:!1}function o(t){var e=w.val();w.val(""),e&&t(e)}function c(){g(e(q),q)}function h(t){q=t,y=null,c()}function l(t){q&&y&&c(),y=t,r(u)}function u(){a()||o(m)}function p(){q=y=null}function f(){w.focus(),r(d)}function d(){o(b)}var m,g,b,v,w,x,j,k,q=null,y=null;return i||(i={}),m=i.text||t,g=i.key||t,b=i.paste||t,v=i.cut||t,w=ae(n),x=ae(i.container||w),k=t,x.bind("keydown keypress input keyup focusout paste",function(){k()}),x.bind({keydown:h,keypress:l,focusout:p,cut:v,paste:f}),{select:s}}}(),l=c(function(t,e,i){function r(t,e){throw t=t?"'"+t+"'":"EOF","Parse Error: "+e+" at "+t}var s,a,o;t.init=function(t){this._=t},t.parse=function(t){function e(t,e){return e}return this.skip(o)._(t,e,r)},t.or=function(t){n("or is passed a parser",t instanceof i);var e=this;return i(function(n,i,r){function s(){return t._(n,i,r)}return e._(n,i,s)})},t.then=function(t){var e=this;return i(function(r,s,a){function o(e,r){var o=t instanceof i?t:t(r);return n("a parser is returned",o instanceof i),o._(e,s,a)}return e._(r,o,a)})},t.many=function(){var t=this;return i(function(e,n){function i(t,n){return e=t,s.push(n),!0}function r(){return!1}for(var s=[];t._(e,i,r););return n(e,s)})},t.times=function(t,e){2>arguments.length&&(e=t);var n=this;return i(function(i,r,s){function a(t,e){return u.push(e),i=t,!0}function o(t,e){return h=e,i=t,!1}function c(){return!1}var h,l,u=[],p=!0;for(l=0;t>l;l+=1)if(p=n._(i,a,o),!p)return s(i,h);for(;e>l&&p;l+=1)p=n._(i,a,c);return r(i,u)})},t.result=function(t){return this.then(a(t))},t.atMost=function(t){return this.times(0,t)},t.atLeast=function(t){var e=this;return e.times(t).then(function(t){return e.many().map(function(e){return t.concat(e)})})},t.map=function(t){return this.then(function(e){return a(t(e))})},t.skip=function(t){return this.then(function(e){return t.result(e)})},this.string=function(t){var e=t.length,n="expected '"+t+"'";return i(function(i,r,s){var a=i.slice(0,e);return a===t?r(i.slice(e),a):s(i,n)})},s=this.regex=function(t){n("regexp parser is anchored","^"===(""+t).charAt(1));var e="expected "+t;return i(function(n,i,r){var s,a=t.exec(n);return a?(s=a[0],i(n.slice(s.length),s)):r(n,e)})},a=i.succeed=function(t){return i(function(e,n){return n(e,t)})},i.fail=function(t){return i(function(e,n,i){return i(e,t)})},i.letter=s(/^[a-z]/i),i.letters=s(/^[a-z]*/i),i.digit=s(/^[0-9]/),i.digits=s(/^[0-9]*/),i.whitespace=s(/^\s+/),i.optWhitespace=s(/^\s*/),i.any=i(function(t,e,n){return t?e(t.slice(1),t.charAt(0)):n(t,"expected any character")}),i.all=i(function(t,e){return e("",t)}),o=i.eof=i(function(t,e,n){return t?n(t,"expected EOF"):e(t,t)})}),u=-1,p=1,f=c(ae,function(t){t.insDirOf=function(t,e){return t===u?this.insertBefore(e.first()):this.insertAfter(e.last())},t.insAtDirEnd=function(t,e){return t===u?this.prependTo(e):this.appendTo(e)}}),d=c(function(t){t.parent=0,t[u]=0,t[p]=0,t.init=function(t,e,n){this.parent=t,this[u]=e,this[p]=n}}),m=c(function(t){t[u]=0,t[p]=0,t.parent=0,t.init=function(){this.ends={},this.ends[u]=0,this.ends[p]=0},t.children=function(){return g(this.ends[u],this.ends[p])},t.eachChild=function(t){return this.children().each(t)},t.foldChildren=function(t,e){return this.children().fold(t,e)},t.adopt=function(t,e,n){return g(this,this).adopt(t,e,n),this},t.disown=function(){return g(this,this).disown(),this}}),g=c(function(t){function e(t,e,i){n("a parent is always present",t),n("leftward is properly set up",function(){return e?e[p]===i&&e.parent===t:t.ends[u]===i}()),n("rightward is properly set up",function(){return i?i[u]===e&&i.parent===t:t.ends[p]===e}())}t.init=function(t,e){n("no half-empty fragments",!t==!e),this.ends={},t&&(n("left end node is passed to Fragment",t instanceof m),n("right end node is passed to Fragment",e instanceof m),n("leftEnd and rightEnd have the same parent",t.parent===e.parent),this.ends[u]=t,this.ends[p]=e)},t.adopt=function(t,n,i){var r,s,a;return e(t,n,i),r=this,r.disowned=!1,(s=r.ends[u])?(a=r.ends[p],n||(t.ends[u]=s),i?i[u]=a:t.ends[p]=a,r.ends[p][p]=i,r.each(function(e){e[u]=n,e.parent=t,n&&(n[p]=e),n=e}),r):this},t.disown=function(){var t,n,i=this,r=i.ends[u];return!r||i.disowned?i:(i.disowned=!0,t=i.ends[p],n=r.parent,e(n,r[u],r),e(n,t,t[p]),r[u]?r[u][p]=t[p]:n.ends[u]=t[p],t[p]?t[p][u]=r[u]:n.ends[p]=r[u],i)},t.each=function(t){var e=this,n=e.ends[u];if(!n)return e;for(;n!==e.ends[p][p]&&t.call(e,n)!==!1;n=n[p]);return e},t.fold=function(t,e){return this.each(function(n){t=e.call(this,t,n)}),t}}),b=function(){var t=0;return function(){return t+=1}}(),v=c(m,function(t,e){t.init=function(){e.init.call(this),this.id=b(),v[this.id]=this},t.toString=function(){return"[MathElement "+this.id+"]"},t.bubble=function(t){var e,n,i=o.call(arguments,1);for(e=this;e&&(n=e[t]&&e[t].apply(e,i),n!==!1);e=e.parent);return this},t.postOrder=function(t){var e,n=o.call(arguments,1);"string"==typeof t&&(e=t,t=function(t){e in t&&t[e].apply(t,n)}),function i(e){e.eachChild(i),t(e)}(this)},t.jQ=f(),t.jQadd=function(t){this.jQ=this.jQ.add(t)},this.jQize=function(t){var e=f(t);return e.find("*").andSelf().each(function(){var t=f(this),e=t.attr("mathquill-command-id"),n=t.attr("mathquill-block-id");e&&v[e].jQadd(t),n&&v[n].jQadd(t)}),e},t.finalizeInsert=function(){var t=this;t.postOrder("finalizeTree"),t.postOrder("blur"),t.postOrder("respace"),t[p].respace&&t[p].respace(),t[u].respace&&t[u].respace(),t.postOrder("redraw"),t.bubble("redraw")}}),w=c(v,function(e,i){e.init=function(t,e,n){var r=this;i.init.call(r),r.ctrlSeq||(r.ctrlSeq=t),e&&(r.htmlTemplate=e),n&&(r.textTemplate=n)},e.replaces=function(t){t.disown(),this.replacedFragment=t},e.isEmpty=function(){return this.foldChildren(!0,function(t,e){return t&&e.isEmpty()})},e.parser=function(){var t=ie.block,e=this;return t.times(e.numBlocks()).map(function(t){e.blocks=t;for(var n=0;t.length>n;n+=1)t[n].adopt(e,e.ends[p],0);return e})},e.createLeftOf=function(t){var e=this,n=e.replacedFragment;e.createBlocks(),v.jQize(e.html()),n&&(n.adopt(e.ends[u],0,0),n.jQ.appendTo(e.ends[u].jQ)),t.jQ.before(e.jQ),t[u]=e.adopt(t.parent,t[u],t[p]),e.finalizeInsert(t),e.placeCursor(t)},e.createBlocks=function(){var t,e,n=this,i=n.numBlocks(),r=n.blocks=Array(i);for(t=0;i>t;t+=1)e=r[t]=j(),e.adopt(n,n.ends[p],0)},e.respace=t,e.placeCursor=function(t){t.insAtRightEnd(this.foldChildren(this.ends[u],function(t,e){return t.isEmpty()?t:e}))},e.remove=function(){return this.disown(),this.jQ.remove(),this.postOrder(function(t){delete v[t.id]}),this},e.numBlocks=function(){var t=this.htmlTemplate.match(/&\d+/g);return t?t.length:0},e.html=function(){var t,e,i,r=this,s=r.blocks,a=" mathquill-command-id="+r.id,o=r.htmlTemplate.match(/<[^<>]+>|[^<>]+/g);for(n("no unmatched angle brackets",o.join("")===this.htmlTemplate),t=0,e=o[0];e;t+=1,e=o[t])if("/>"===e.slice(-2))o[t]=e.slice(0,-2)+a+"/>";else if("<"===e.charAt(0)){n("not an unmatched top-level close tag","/"!==e.charAt(1)),o[t]=e.slice(0,-1)+a+">",i=1;do t+=1,e=o[t],n("no missing close tags",e),""!==e.slice(-2)&&(i+=1);while(i>0)}return o.join("").replace(/>&(\d+)/g,function(t,e){return" mathquill-block-id="+s[e].id+">"+s[e].join("html")})},e.latex=function(){return this.foldChildren(this.ctrlSeq,function(t,e){return t+"{"+(e.latex()||" ")+"}"})},e.textTemplate=[""],e.text=function(){var t=this,e=0;return t.foldChildren(t.textTemplate[e],function(n,i){e+=1;var r=i.text();return n&&"("===t.textTemplate[e]&&"("===r[0]&&")"===r.slice(-1)?n+r.slice(1,-1)+t.textTemplate[e]:n+i.text()+(t.textTemplate[e]||"")})}}),x=c(w,function(e,n){e.init=function(t,e,i){i||(i=t&&t.length>1?t.slice(1):t),n.init.call(this,t,e,[i])},e.parser=function(){return l.succeed(this)},e.numBlocks=function(){return 0},e.replaces=function(t){t.remove()},e.createBlocks=t,e.latex=function(){return this.ctrlSeq},e.text=function(){return this.textTemplate},e.placeCursor=t,e.isEmpty=function(){return!0}}),j=c(v,function(t){t.join=function(t){return this.foldChildren("",function(e,n){return e+n[t]()})},t.latex=function(){return this.join("latex")},t.text=function(){return this.ends[u]===this.ends[p]?this.ends[u].text():"("+this.join("text")+")"},t.isEmpty=function(){return 0===this.ends[u]&&0===this.ends[p]},t.write=function(t,e,n){var i;i=e.match(/^[a-eg-zA-Z]$/)?X(e):(i=C[e]||S[e])?i(e):Z(e),n&&i.replaces(n),i.createLeftOf(t)},t.focus=function(){return this.jQ.addClass("hasCursor"),this.jQ.removeClass("empty"),this},t.blur=function(){return this.jQ.removeClass("hasCursor"),this.isEmpty()&&this.jQ.addClass("empty"),this}}),k=c(g,function(t,e){t.init=function(t,n){e.init.call(this,t,n||t),this.jQ=this.fold(f(),function(t,e){return e.jQ.add(t)})},t.latex=function(){return this.fold("",function(t,e){return t+e.latex()})},t.remove=function(){return this.jQ.remove(),this.each(function(t){t.postOrder(function(t){delete v[t.id]})}),this.disown()}}),q=c(j,function(t,e){t.latex=function(){return e.latex.call(this).replace(/(\\[a-z]+) (?![a-z])/gi,"$1")},t.text=function(){return this.foldChildren("",function(t,e){return t+e.text()})},t.renderLatex=function(t){var e=this.jQ;e.children().slice(1).remove(),this.ends[u]=this.ends[p]=0,delete this.cursor.selection,this.cursor.insAtRightEnd(this).writeLatex(t)},t.onKey=function(t,e){var n;switch(t){case"Ctrl-Shift-Backspace":case"Ctrl-Backspace":for(;this.cursor[u]||this.cursor.selection;)this.cursor.backspace();break;case"Shift-Backspace":case"Backspace":this.cursor.backspace();break;case"Esc":case"Tab":case"Spacebar":if(n=this.cursor.parent,n===this.cursor.root)return"Spacebar"===t&&e.preventDefault(),a;this.cursor.prepareMove(),n[p]?this.cursor.insAtLeftEnd(n[p]):this.cursor.insRightOf(n.parent);break;case"Shift-Tab":case"Shift-Esc":case"Shift-Spacebar":if(n=this.cursor.parent,n===this.cursor.root)return"Shift-Spacebar"===t&&e.preventDefault(),a;this.cursor.prepareMove(),n[u]?this.cursor.insAtRightEnd(n[u]):this.cursor.insLeftOf(n.parent);break;case"Enter":break;case"End":this.cursor.prepareMove().insAtRightEnd(this.cursor.parent);break;case"Ctrl-End":this.cursor.prepareMove().insAtRightEnd(this);break;case"Shift-End":for(;this.cursor[p];)this.cursor.selectRight();break;case"Ctrl-Shift-End":for(;this.cursor[p]||this.cursor.parent!==this;)this.cursor.selectRight();break;case"Home":this.cursor.prepareMove().insAtLeftEnd(this.cursor.parent);break;case"Ctrl-Home":this.cursor.prepareMove().insAtLeftEnd(this);break;case"Shift-Home":for(;this.cursor[u];)this.cursor.selectLeft();break;case"Ctrl-Shift-Home":for(;this.cursor[u]||this.cursor.parent!==this;)this.cursor.selectLeft();break;case"Left":this.cursor.moveLeft();break;case"Shift-Left":this.cursor.selectLeft();break;case"Ctrl-Left":break;case"Right":this.cursor.moveRight();break;case"Shift-Right":this.cursor.selectRight();break;case"Ctrl-Right":break;case"Up":this.cursor.moveUp();break;case"Down":this.cursor.moveDown();break;case"Shift-Up":if(this.cursor[u])for(;this.cursor[u];)this.cursor.selectLeft();else this.cursor.selectLeft();case"Shift-Down":if(this.cursor[p])for(;this.cursor[p];)this.cursor.selectRight();else this.cursor.selectRight();case"Ctrl-Up":break;case"Ctrl-Down":break;case"Ctrl-Shift-Del":case"Ctrl-Del":for(;this.cursor[p]||this.cursor.selection;)this.cursor.deleteForward();break;case"Shift-Del":case"Del":this.cursor.deleteForward();break;case"Meta-A":case"Ctrl-A":if(this!==this.cursor.root)return;for(this.cursor.prepareMove().insAtRightEnd(this);this.cursor[u];)this.cursor.selectLeft();break;default:return!1}return e.preventDefault(),!1},t.onText=function(t){return this.cursor.write(t),!1}}),y=c(w,function(t,e){t.init=function(t){e.init.call(this,"$"),this.cursor=t},t.htmlTemplate='&0',t.createBlocks=function(){this.ends[u]=this.ends[p]=q(),this.blocks=[this.ends[u]],this.ends[u].parent=this,this.ends[u].cursor=this.cursor,this.ends[u].write=function(t,e,n){"$"!==e?j.prototype.write.call(this,t,e,n):this.isEmpty()?(t.insRightOf(this.parent).backspace().show(),Z("\\$","$").createLeftOf(t)):t[p]?t[u]?j.prototype.write.call(this,t,e,n):t.insLeftOf(this.parent):t.insRightOf(this.parent)}},t.latex=function(){return"$"+this.ends[u].latex()+"$"}}),Q=c(j,function(t){t.renderLatex=function(t){var e,n,i,r,s,a,o,c,h,f,d,m=this,g=m.cursor;if(m.jQ.children().slice(1).remove(),m.ends[u]=m.ends[p]=0,delete g.selection,g.show().insAtRightEnd(m),e=l.regex,n=l.string,i=l.eof,r=l.all,s=n("$").then(ie).skip(n("$").or(i)).map(function(t){var e,n=y(g);return n.createBlocks(),e=n.ends[u],t.children().adopt(e,0,0),n}),a=n("\\$").result("$"),o=a.or(e(/^[^$]/)).map(Z),c=s.or(o).many(),h=c.skip(i).or(r.result(!1)).parse(t)){for(f=0;h.length>f;f+=1)h[f].adopt(m,m.ends[p],0);d=m.join("html"),v.jQize(d).appendTo(m.jQ),this.finalizeInsert()}},t.onKey=function(t){"Spacebar"!==t&&"Shift-Spacebar"!==t&&q.prototype.onKey.apply(this,arguments)},t.onText=q.prototype.onText,t.write=function(t,e,n){if(n&&n.remove(),"$"===e)y(t).createLeftOf(t);else{var i;"<"===e?i="<":">"===e&&(i=">"),Z(e,i).createLeftOf(t)}}}),C={},S={},O=t,E=document.createElement("div"),A=E.style,R={transform:1,WebkitTransform:1,MozTransform:1,OTransform:1,msTransform:1};for(T in R)if(T in A){D=T;break}D?L=function(t,e,n){t.css(D,"scale("+e+","+n+")")}:"filter"in A?(O=function(t){t.className=t.className},L=function(t,e,n){function i(){t.css("marginRight",(r.width()-1)*(e-1)/e+"px")}var r,s;e/=1+(n-1)/2,t.css("fontSize",n+"em"),t.hasClass("matrixed-container")||t.addClass("matrixed-container").wrapInner(''),r=t.children().css("filter","progid:DXImageTransform.Microsoft.Matrix(M11="+e+",SizingMethod='auto expand')"),i(),s=setInterval(i),f(window).load(function(){clearTimeout(s),i()})}):L=function(t,e,n){t.css("fontSize",n+"em")},z=c(w,function(t,e){t.init=function(t,n,i){e.init.call(this,t,"<"+n+" "+i+">&0")}}),S.mathrm=e(z,"\\mathrm","span",'class="roman font"'),S.mathit=e(z,"\\mathit","i",'class="font"'),S.mathbf=e(z,"\\mathbf","b",'class="font"'),S.mathsf=e(z,"\\mathsf","span",'class="sans-serif font"'),S.mathtt=e(z,"\\mathtt","span",'class="monospace font"'),S.underline=e(z,"\\underline","span",'class="non-leaf underline"'),S.overline=S.bar=e(z,"\\overline","span",'class="non-leaf overline"'),B=c(w,function(t,e){t.init=function(t,n,i){e.init.call(this,t,"<"+n+' class="non-leaf">&0",[i])},t.finalizeTree=function(){function t(t){var e=this.parent,n=t;do{if(n[p])return t.insLeftOf(e),!1;n=n.parent.parent}while(n!==e);return t.insRightOf(e),!1}n("SupSub is only _ and ^","^"===this.ctrlSeq||"_"===this.ctrlSeq),"_"===this.ctrlSeq?(this.down=this.ends[u],this.ends[u].up=t):(this.up=this.ends[u],this.ends[u].down=t)},t.latex=function(){var t=this.ends[u].latex();return 1===t.length?this.ctrlSeq+t:this.ctrlSeq+"{"+(t||" ")+"}"},t.redraw=function(){this[u]&&this[u].respace(),this[u]instanceof B||(this.respace(),!this[p]||this[p]instanceof B||this[p].respace())},t.respace=function(){if("\\int "===this[u].ctrlSeq||this[u]instanceof B&&this[u].ctrlSeq!=this.ctrlSeq&&this[u][u]&&"\\int "===this[u][u].ctrlSeq?this.limit||(this.limit=!0,this.jQ.addClass("limit")):this.limit&&(this.limit=!1,this.jQ.removeClass("limit")),this.respaced=this[u]instanceof B&&this[u].ctrlSeq!=this.ctrlSeq&&!this[u].respaced,this.respaced){var t=+this.jQ.css("fontSize").slice(0,-2),e=this[u].jQ.outerWidth(),n=this.jQ.outerWidth();this.jQ.css({left:(this.limit&&"_"===this.ctrlSeq?-.25:0)-e/t+"em",marginRight:.1-he(n,e)/t+"em"})}else this.limit&&"_"===this.ctrlSeq?this.jQ.css({left:"-.25em",marginRight:""}):this.jQ.css({left:"",marginRight:""});return this[p]instanceof B&&this[p].respace(),this}}),S.subscript=S._=e(B,"_","sub","_"),S.superscript=S.supscript=S["^"]=e(B,"^","sup","**"),I=S.frac=S.dfrac=S.cfrac=S.fraction=c(w,function(t){t.ctrlSeq="\\frac",t.htmlTemplate='&0&1 ',t.textTemplate=["(","/",")"],t.finalizeTree=function(){this.up=this.ends[p].up=this.ends[u],this.down=this.ends[u].down=this.ends[p]}}),$=S.over=C["/"]=c(I,function(t,e){t.createLeftOf=function(t){if(!this.replacedFragment){for(var n=t[u];n&&!(n instanceof V||n instanceof K||n instanceof ee||",;:".split("").indexOf(n.ctrlSeq)>-1);)n=n[u];n instanceof ee&&n[p]instanceof B&&(n=n[p],n[p]instanceof B&&n[p].ctrlSeq!=n.ctrlSeq&&(n=n[p])),n!==t[u]&&(this.replaces(k(n[p]||t.parent.ends[u],t[u])),t[u]=n)}e.createLeftOf.call(this,t)}}),_=S.sqrt=S["√"]=c(w,function(t,e){t.ctrlSeq="\\sqrt",t.htmlTemplate='&0',t.textTemplate=["sqrt(",")"],t.parser=function(){return ie.optBlock.then(function(t){return ie.block.map(function(e){var n=W();return n.blocks=[t,e],t.adopt(n,0,0),e.adopt(n,t,0),n})}).or(e.parser.call(this))},t.redraw=function(){var t=this.ends[p].jQ;L(t.prev(),1,t.innerHeight()/+t.css("fontSize").slice(0,-2)-.1)}}),S.vec=c(w,function(t){t.ctrlSeq="\\vec",t.htmlTemplate='&0',t.textTemplate=["vec(",")"]}),W=S.nthroot=c(_,function(t){t.htmlTemplate='&0&1',t.textTemplate=["sqrt[","](",")"],t.latex=function(){return"\\sqrt["+this.ends[u].latex()+"]{"+this.ends[p].latex()+"}"}}),M=c(w,function(t,e){t.init=function(t,n,i,r){e.init.call(this,"\\left"+i,''+t+""+'&0'+''+n+""+"",[t,n]),this.end="\\right"+r},t.jQadd=function(){e.jQadd.apply(this,arguments);var t=this.jQ;this.bracketjQs=t.children(":first").add(t.children(":last"))},t.latex=function(){return this.ctrlSeq+this.ends[u].latex()+this.end},t.redraw=function(){var t=this.ends[u].jQ,e=t.outerHeight()/+t.css("fontSize").slice(0,-2);L(this.bracketjQs,he(1+.2*(e-1),1.2),1.05*e)}}),S.left=c(w,function(t){t.parser=function(){var t=l.regex,e=l.string,n=l.succeed,i=l.optWhitespace;return i.then(t(/^(?:[([|]|\\\{)/)).then(function(r){"\\"===r.charAt(0)&&(r=r.slice(1));var s=C[r]();return ie.map(function(t){s.blocks=[t],t.adopt(s,0,0)}).then(e("\\right")).skip(i).then(t(/^(?:[\])|]|\\\})/)).then(function(t){return t.slice(-1)!==s.end.slice(-1)?l.fail("open doesn't match close"):n(s)})})}}),S.right=c(w,function(t){t.parser=function(){return l.fail("unmatched \\right")}}),S.lbrace=C["{"]=e(M,"{","}","\\{","\\}"),S.langle=S.lang=e(M,"⟨","⟩","\\langle ","\\rangle "),F=c(M,function(t,e){t.createLeftOf=function(t){t[p]||!t.parent.parent||t.parent.parent.end!==this.end||this.replacedFragment?e.createLeftOf.call(this,t):t.insRightOf(t.parent.parent)},t.placeCursor=function(t){this.ends[u].blur(),t.insRightOf(this)}}),S.rbrace=C["}"]=e(F,"{","}","\\{","\\}"),S.rangle=S.rang=e(F,"⟨","⟩","\\langle ","\\rangle "),P=function(t,e){t.init=function(t,n){e.init.call(this,t,n,t,n)}},U=c(M,P),S.lparen=C["("]=e(U,"(",")"),S.lbrack=S.lbracket=C["["]=e(U,"[","]"),H=c(F,P),S.rparen=C[")"]=e(H,"(",")"),S.rbrack=S.rbracket=C["]"]=e(H,"[","]"),S.lpipe=S.rpipe=C["|"]=c(U,function(t,e){t.init=function(){e.init.call(this,"|","|")},t.createLeftOf=F.prototype.createLeftOf}),K=C.$=S.text=S.textnormal=S.textrm=S.textup=S.textmd=c(w,function(t,e){t.ctrlSeq="\\text",t.htmlTemplate='&0',t.replaces=function(t){t instanceof k?this.replacedText=t.remove().jQ.text():"string"==typeof t&&(this.replacedText=t)},t.textTemplate=['"','"'],t.parser=function(){var t=this,e=l.string,n=l.regex,i=l.optWhitespace;return i.then(e("{")).then(n(/^[^}]*/)).skip(e("}")).map(function(e){var n,i,r;for(t.createBlocks(),n=t.ends[u],i=0;e.length>i;i+=1)r=Z(e.charAt(i)),r.adopt(n,n.ends[p],0);return t})},t.createBlocks=function(){this.ends[u]=this.ends[p]=N(),this.blocks=[this.ends[u]],this.ends[u].parent=this},t.finalizeInsert=function(){this.ends[u].blur=function(){return delete this.blur,this},e.finalizeInsert.call(this)},t.createLeftOf=function(t){if(e.createLeftOf.call(this,this.cursor=t),this.replacedText)for(var n=0;this.replacedText.length>n;n+=1)this.ends[u].write(t,this.replacedText.charAt(n))}}),N=c(j,function(t,e){t.onKey=function(t){return"Spacebar"===t||"Shift-Spacebar"===t?!1:a},t.deleteOutOf=function(t,e){this.isEmpty()&&e.insRightOf(this.parent)},t.write=function(t,e,n){var i,r;return n&&n.remove(),"$"!==e?("<"===e?i="<":">"===e&&(i=">"),Z(e,i).createLeftOf(t)):this.isEmpty()?(t.insRightOf(this.parent).backspace(),Z("\\$","$").createLeftOf(t)):t[p]?t[u]?(r=K(),r.replaces(k(t[p],this.ends[p])),t.insRightOf(this.parent),r.adopt=function(){delete this.adopt,this.adopt.apply(this,arguments),this[u]=0},r.createLeftOf(t),r[u]=this.parent,t.insLeftOf(r)):t.insLeftOf(this.parent):t.insRightOf(this.parent),!1},t.blur=function(){if(this.jQ.removeClass("hasCursor"),this.isEmpty()){var t=this.parent,e=t.cursor;e.parent===this?this.jQ.addClass("empty"):(e.hide(),t.remove(),e[p]===t?e[p]=t[p]:e[u]===t&&(e[u]=t[u]),e.show().parent.bubble("redraw"))}return this},t.focus=function(){var t,n,i,r;return e.focus.call(this),t=this.parent,t[p].ctrlSeq===t.ctrlSeq?(n=this,i=t.cursor,r=t[p].ends[u],r.eachChild(function(t){t.parent=n,t.jQ.appendTo(n.jQ)}),this.ends[p]?this.ends[p][p]=r.ends[u]:this.ends[u]=r.ends[u],r.ends[u][u]=this.ends[p],this.ends[p]=r.ends[p],r.parent.remove(),i[u]?i.insRightOf(i[u]):i.insAtLeftEnd(this),i.parent.bubble("redraw")):t[u].ctrlSeq===t.ctrlSeq&&(i=t.cursor,i[u]?t[u].ends[u].focus():i.insAtRightEnd(t[u].ends[u])),this}}),S.em=S.italic=S.italics=S.emph=S.textit=S.textsl=s("\\textit","i",'class="text"'),S.strong=S.bold=S.textbf=s("\\textbf","b",'class="text"'),S.sf=S.textsf=s("\\textsf","span",'class="sans-serif text"'),S.tt=S.texttt=s("\\texttt","span",'class="monospace text"'),S.textsc=s("\\textsc","span",'style="font-variant:small-caps" class="text"'),S.uppercase=s("\\uppercase","span",'style="text-transform:uppercase" class="text"'),S.lowercase=s("\\lowercase","span",'style="text-transform:lowercase" class="text"'),C["\\"]=c(w,function(t,e){t.ctrlSeq="\\",t.replaces=function(t){this._replacedFragment=t.disown(),this.isEmpty=function(){return!1}},t.htmlTemplate='\\&0',t.textTemplate=["\\"],t.createBlocks=function(){e.createBlocks.call(this),this.ends[u].focus=function(){return this.parent.jQ.addClass("hasCursor"),this.isEmpty()&&this.parent.jQ.removeClass("empty"),this},this.ends[u].blur=function(){return this.parent.jQ.removeClass("hasCursor"),this.isEmpty()&&this.parent.jQ.addClass("empty"),this}},t.createLeftOf=function(t){if(e.createLeftOf.call(this,t),this.cursor=t.insAtRightEnd(this.ends[u]),this._replacedFragment){var n=this.jQ[0];this.jQ=this._replacedFragment.jQ.addClass("blur").bind("mousedown mousemove",function(t){return f(t.target=n).trigger(t),!1}).insertBefore(this.jQ).add(this.jQ)}this.ends[u].write=function(t,e,n){n&&n.remove(),e.match(/[a-z]/i)?Z(e).createLeftOf(t):(this.parent.renderCommand(),"\\"===e&&this.isEmpty()||this.parent.parent.write(t,e))}},t.latex=function(){return"\\"+this.ends[u].latex()+" "},t.onKey=function(t,e){return"Tab"===t||"Enter"===t||"Spacebar"===t?(this.renderCommand(),e.preventDefault(),!1):a},t.renderCommand=function(){this.jQ=this.jQ.last(),this.remove(),this[p]?this.cursor.insLeftOf(this[p]):this.cursor.insAtRightEnd(this.parent);var t=this.ends[u].latex();t||(t="backslash"),this.cursor.insertCmd(t,this._replacedFragment)}}),G=S.binom=S.binomial=c(w,function(t){t.ctrlSeq="\\binom",t.htmlTemplate='(&0&1)',t.textTemplate=["choose(",",",")"],t.redraw=function(){var t=this.jQ.eq(1),e=t.outerHeight()/+t.css("fontSize").slice(0,-2),n=this.jQ.filter(".paren");L(n,he(1+.2*(e-1),1.2),1.05*e)}}),S.choose=c(G,function(t){t.createLeftOf=$.prototype.createLeftOf}),S.vector=c(w,function(t,e){t.ctrlSeq="\\vector",t.htmlTemplate='&0',t.latex=function(){return"\\begin{matrix}"+this.foldChildren([],function(t,e){return t.push(e.latex()),t}).join("\\\\")+"\\end{matrix}"},t.text=function(){return"["+this.foldChildren([],function(t,e){return t.push(e.text()),t}).join()+"]"},t.createLeftOf=function(t){e.createLeftOf.call(this,this.cursor=t)},t.onKey=function(t,e){var n,i=this.cursor.parent;if(i.parent===this){if("Enter"===t)return n=j(),n.parent=this,n.jQ=f("").attr(ce,n.id).insertAfter(i.jQ),i[p]?i[p][u]=n:this.ends[p]=n,n[p]=i[p],i[p]=n,n[u]=i,this.bubble("redraw").cursor.insAtRightEnd(n),e.preventDefault(),!1;if("Tab"===t&&!i[p])return i.isEmpty()?i[u]?(this.cursor.insRightOf(this),delete i[u][p],this.ends[p]=i[u],i.jQ.remove(),this.bubble("redraw"),e.preventDefault(),!1):a:(n=j(),n.parent=this,n.jQ=f("").attr(ce,n.id).appendTo(this.jQ),this.ends[p]=n,i[p]=n,n[u]=i,this.bubble("redraw").cursor.insAtRightEnd(n),e.preventDefault(),!1);if(8===e.which){if(i.isEmpty())return i[u]?(this.cursor.insAtRightEnd(i[u]),i[u][p]=i[p]):(this.cursor.insLeftOf(this),this.ends[u]=i[p]),i[p]?i[p][u]=i[u]:this.ends[p]=i[u],i.jQ.remove(),this.isEmpty()?this.cursor.deleteForward():this.bubble("redraw"),e.preventDefault(),!1;if(!this.cursor[u])return e.preventDefault(),!1}}}}),S.editable=c(y,function(t,e){t.init=function(){w.prototype.init.call(this,"\\editable")},t.jQadd=function(){var t,n,i=this;e.jQadd.apply(i,arguments),t=i.ends[u].disown(),n=i.jQ.children().detach(),i.ends[u]=i.ends[p]=q(),i.blocks=[i.ends[u]],i.ends[u].parent=i,r(i.jQ,i.ends[u],!1,!0),i.cursor=i.ends[u].cursor,t.children().adopt(i.ends[u],0,0),n.appendTo(i.ends[u].jQ),i.ends[u].cursor.insAtRightEnd(i.ends[u])},t.latex=function(){return this.ends[u].latex()},t.text=function(){return this.ends[u].text()}}),S.f=e(x,"f",'ƒ '),X=c(x,function(t,e){t.init=function(t,n){e.init.call(this,t,""+(n||t)+"")},t.text=function(){var t=this.ctrlSeq;return!this[u]||this[u]instanceof X||this[u]instanceof V||(t="*"+t),!this[p]||this[p]instanceof V||"^"===this[p].ctrlSeq||(t+="*"),t}}),Z=c(x,function(t,e){t.init=function(t,n){e.init.call(this,t,""+(n||t)+"")}}),C[" "]=e(Z,"\\:"," "),S.prime=C["'"]=e(Z,"'","′"),Y=c(x,function(t,e){t.init=function(t,n){e.init.call(this,t,''+(n||t)+"")}}),S["@"]=Y,S["&"]=e(Y,"\\&","&"),S["%"]=e(Y,"\\%","%"),S.alpha=S.beta=S.gamma=S.delta=S.zeta=S.eta=S.theta=S.iota=S.kappa=S.mu=S.nu=S.xi=S.rho=S.sigma=S.tau=S.chi=S.psi=S.omega=c(X,function(t,e){t.init=function(t){e.init.call(this,"\\"+t+" ","&"+t+";")}}),S.phi=e(X,"\\phi ","ϕ"),S.phiv=S.varphi=e(X,"\\varphi ","φ"),S.epsilon=e(X,"\\epsilon ","ϵ"),S.epsiv=S.varepsilon=e(X,"\\varepsilon ","ε"),S.piv=S.varpi=e(X,"\\varpi ","ϖ"),S.sigmaf=S.sigmav=S.varsigma=e(X,"\\varsigma ","ς"),S.thetav=S.vartheta=S.thetasym=e(X,"\\vartheta ","ϑ"),S.upsilon=S.upsi=e(X,"\\upsilon ","υ"),S.gammad=S.Gammad=S.digamma=e(X,"\\digamma ","ϝ"),S.kappav=S.varkappa=e(X,"\\varkappa ","ϰ"),S.rhov=S.varrho=e(X,"\\varrho ","ϱ"),S.pi=S["π"]=e(Y,"\\pi ","π"),S.lambda=e(Y,"\\lambda ","λ"),S.Upsilon=S.Upsi=S.upsih=S.Upsih=e(x,"\\Upsilon ",'ϒ'),S.Gamma=S.Delta=S.Theta=S.Lambda=S.Xi=S.Pi=S.Sigma=S.Phi=S.Psi=S.Omega=S.forall=c(Z,function(t,e){t.init=function(t){e.init.call(this,"\\"+t+" ","&"+t+";")}}),J=c(w,function(t){t.init=function(t){this.latex=t},t.createLeftOf=function(t){t.writeLatex(this.latex)},t.parser=function(){var t=ie.parse(this.latex).children();return l.succeed(t)}}),S["¹"]=e(J,"^1"),S["²"]=e(J,"^2"),S["³"]=e(J,"^3"),S["¼"]=e(J,"\\frac14"),S["½"]=e(J,"\\frac12"),S["¾"]=e(J,"\\frac34"),V=c(x,function(t,e){t.init=function(t,n,i){e.init.call(this,t,''+n+"",i) +}}),te=c(V,function(t){t.init=Z.prototype.init,t.respace=function(){return this.jQ[0].className=this[u]?this[u]instanceof V&&this[p]&&!(this[p]instanceof V)?"unary-operator":"binary-operator":"",this}}),S["+"]=e(te,"+","+"),S["–"]=S["-"]=e(te,"-","−"),S["±"]=S.pm=S.plusmn=S.plusminus=e(te,"\\pm ","±"),S.mp=S.mnplus=S.minusplus=e(te,"\\mp ","∓"),C["*"]=S.sdot=S.cdot=e(V,"\\cdot ","·"),S["="]=e(V,"=","="),S["<"]=e(V,"<","<"),S[">"]=e(V,">",">"),S.notin=S.sim=S.cong=S.equiv=S.oplus=S.otimes=c(V,function(t,e){t.init=function(t){e.init.call(this,"\\"+t+" ","&"+t+";")}}),S.times=e(V,"\\times ","×","[x]"),S["÷"]=S.div=S.divide=S.divides=e(V,"\\div ","÷","[/]"),S["≠"]=S.ne=S.neq=e(V,"\\ne ","≠"),S.ast=S.star=S.loast=S.lowast=e(V,"\\ast ","∗"),S.therefor=S.therefore=e(V,"\\therefore ","∴"),S.cuz=S.because=e(V,"\\because ","∵"),S.prop=S.propto=e(V,"\\propto ","∝"),S["≈"]=S.asymp=S.approx=e(V,"\\approx ","≈"),S.lt=e(V,"<","<"),S.gt=e(V,">",">"),S["≤"]=S.le=S.leq=e(V,"\\le ","≤"),S["≥"]=S.ge=S.geq=e(V,"\\ge ","≥"),S.isin=S["in"]=e(V,"\\in ","∈"),S.ni=S.contains=e(V,"\\ni ","∋"),S.notni=S.niton=S.notcontains=S.doesnotcontain=e(V,"\\not\\ni ","∌"),S.sub=S.subset=e(V,"\\subset ","⊂"),S.sup=S.supset=S.superset=e(V,"\\supset ","⊃"),S.nsub=S.notsub=S.nsubset=S.notsubset=e(V,"\\not\\subset ","⊄"),S.nsup=S.notsup=S.nsupset=S.notsupset=S.nsuperset=S.notsuperset=e(V,"\\not\\supset ","⊅"),S.sube=S.subeq=S.subsete=S.subseteq=e(V,"\\subseteq ","⊆"),S.supe=S.supeq=S.supsete=S.supseteq=S.supersete=S.superseteq=e(V,"\\supseteq ","⊇"),S.nsube=S.nsubeq=S.notsube=S.notsubeq=S.nsubsete=S.nsubseteq=S.notsubsete=S.notsubseteq=e(V,"\\not\\subseteq ","⊈"),S.nsupe=S.nsupeq=S.notsupe=S.notsupeq=S.nsupsete=S.nsupseteq=S.notsupsete=S.notsupseteq=S.nsupersete=S.nsuperseteq=S.notsupersete=S.notsuperseteq=e(V,"\\not\\supseteq ","⊉"),ee=c(x,function(t,e){t.init=function(t,n){e.init.call(this,t,""+n+"")}}),S["∑"]=S.sum=S.summation=e(ee,"\\sum ","∑"),S["∏"]=S.prod=S.product=e(ee,"\\prod ","∏"),S.coprod=S.coproduct=e(ee,"\\coprod ","∐"),S["∫"]=S["int"]=S.integral=e(ee,"\\int ","∫"),S.N=S.naturals=S.Naturals=e(Z,"\\mathbb{N}","ℕ"),S.P=S.primes=S.Primes=S.projective=S.Projective=S.probability=S.Probability=e(Z,"\\mathbb{P}","ℙ"),S.Z=S.integers=S.Integers=e(Z,"\\mathbb{Z}","ℤ"),S.Q=S.rationals=S.Rationals=e(Z,"\\mathbb{Q}","ℚ"),S.R=S.reals=S.Reals=e(Z,"\\mathbb{R}","ℝ"),S.C=S.complex=S.Complex=S.complexes=S.Complexes=S.complexplane=S.Complexplane=S.ComplexPlane=e(Z,"\\mathbb{C}","ℂ"),S.H=S.Hamiltonian=S.quaternions=S.Quaternions=e(Z,"\\mathbb{H}","ℍ"),S.quad=S.emsp=e(Z,"\\quad "," "),S.qquad=e(Z,"\\qquad "," "),S.diamond=e(Z,"\\diamond ","◇"),S.bigtriangleup=e(Z,"\\bigtriangleup ","△"),S.ominus=e(Z,"\\ominus ","⊖"),S.uplus=e(Z,"\\uplus ","⊎"),S.bigtriangledown=e(Z,"\\bigtriangledown ","▽"),S.sqcap=e(Z,"\\sqcap ","⊓"),S.triangleleft=e(Z,"\\triangleleft ","⊲"),S.sqcup=e(Z,"\\sqcup ","⊔"),S.triangleright=e(Z,"\\triangleright ","⊳"),S.odot=e(Z,"\\odot ","⊙"),S.bigcirc=e(Z,"\\bigcirc ","◯"),S.dagger=e(Z,"\\dagger ","†"),S.ddagger=e(Z,"\\ddagger ","‡"),S.wr=e(Z,"\\wr ","≀"),S.amalg=e(Z,"\\amalg ","∐"),S.models=e(Z,"\\models ","⊨"),S.prec=e(Z,"\\prec ","≺"),S.succ=e(Z,"\\succ ","≻"),S.preceq=e(Z,"\\preceq ","≼"),S.succeq=e(Z,"\\succeq ","≽"),S.simeq=e(Z,"\\simeq ","≃"),S.mid=e(Z,"\\mid ","∣"),S.ll=e(Z,"\\ll ","≪"),S.gg=e(Z,"\\gg ","≫"),S.parallel=e(Z,"\\parallel ","∥"),S.bowtie=e(Z,"\\bowtie ","⋈"),S.sqsubset=e(Z,"\\sqsubset ","⊏"),S.sqsupset=e(Z,"\\sqsupset ","⊐"),S.smile=e(Z,"\\smile ","⌣"),S.sqsubseteq=e(Z,"\\sqsubseteq ","⊑"),S.sqsupseteq=e(Z,"\\sqsupseteq ","⊒"),S.doteq=e(Z,"\\doteq ","≐"),S.frown=e(Z,"\\frown ","⌢"),S.vdash=e(Z,"\\vdash ","⊦"),S.dashv=e(Z,"\\dashv ","⊣"),S.longleftarrow=e(Z,"\\longleftarrow ","←"),S.longrightarrow=e(Z,"\\longrightarrow ","→"),S.Longleftarrow=e(Z,"\\Longleftarrow ","⇐"),S.Longrightarrow=e(Z,"\\Longrightarrow ","⇒"),S.longleftrightarrow=e(Z,"\\longleftrightarrow ","↔"),S.updownarrow=e(Z,"\\updownarrow ","↕"),S.Longleftrightarrow=e(Z,"\\Longleftrightarrow ","⇔"),S.Updownarrow=e(Z,"\\Updownarrow ","⇕"),S.mapsto=e(Z,"\\mapsto ","↦"),S.nearrow=e(Z,"\\nearrow ","↗"),S.hookleftarrow=e(Z,"\\hookleftarrow ","↩"),S.hookrightarrow=e(Z,"\\hookrightarrow ","↪"),S.searrow=e(Z,"\\searrow ","↘"),S.leftharpoonup=e(Z,"\\leftharpoonup ","↼"),S.rightharpoonup=e(Z,"\\rightharpoonup ","⇀"),S.swarrow=e(Z,"\\swarrow ","↙"),S.leftharpoondown=e(Z,"\\leftharpoondown ","↽"),S.rightharpoondown=e(Z,"\\rightharpoondown ","⇁"),S.nwarrow=e(Z,"\\nwarrow ","↖"),S.ldots=e(Z,"\\ldots ","…"),S.cdots=e(Z,"\\cdots ","⋯"),S.vdots=e(Z,"\\vdots ","⋮"),S.ddots=e(Z,"\\ddots ","⋰"),S.surd=e(Z,"\\surd ","√"),S.triangle=e(Z,"\\triangle ","▵"),S.ell=e(Z,"\\ell ","ℓ"),S.top=e(Z,"\\top ","⊤"),S.flat=e(Z,"\\flat ","♭"),S.natural=e(Z,"\\natural ","♮"),S.sharp=e(Z,"\\sharp ","♯"),S.wp=e(Z,"\\wp ","℘"),S.bot=e(Z,"\\bot ","⊥"),S.clubsuit=e(Z,"\\clubsuit ","♣"),S.diamondsuit=e(Z,"\\diamondsuit ","♢"),S.heartsuit=e(Z,"\\heartsuit ","♡"),S.spadesuit=e(Z,"\\spadesuit ","♠"),S.oint=e(Z,"\\oint ","∮"),S.bigcap=e(Z,"\\bigcap ","∩"),S.bigcup=e(Z,"\\bigcup ","∪"),S.bigsqcup=e(Z,"\\bigsqcup ","⊔"),S.bigvee=e(Z,"\\bigvee ","∨"),S.bigwedge=e(Z,"\\bigwedge ","∧"),S.bigodot=e(Z,"\\bigodot ","⊙"),S.bigotimes=e(Z,"\\bigotimes ","⊗"),S.bigoplus=e(Z,"\\bigoplus ","⊕"),S.biguplus=e(Z,"\\biguplus ","⊎"),S.lfloor=e(Z,"\\lfloor ","⌊"),S.rfloor=e(Z,"\\rfloor ","⌋"),S.lceil=e(Z,"\\lceil ","⌈"),S.rceil=e(Z,"\\rceil ","⌉"),S.slash=e(Z,"\\slash ","/"),S.opencurlybrace=e(Z,"\\opencurlybrace ","{"),S.closecurlybrace=e(Z,"\\closecurlybrace ","}"),S.caret=e(Z,"\\caret ","^"),S.underscore=e(Z,"\\underscore ","_"),S.backslash=e(Z,"\\backslash ","\\"),S.vert=e(Z,"|"),S.perp=S.perpendicular=e(Z,"\\perp ","⊥"),S.nabla=S.del=e(Z,"\\nabla ","∇"),S.hbar=e(Z,"\\hbar ","ℏ"),S.AA=S.Angstrom=S.angstrom=e(Z,"\\text\\AA ","Å"),S.ring=S.circ=S.circle=e(Z,"\\circ ","∘"),S.bull=S.bullet=e(Z,"\\bullet ","•"),S.setminus=S.smallsetminus=e(Z,"\\setminus ","∖"),S.not=S["¬"]=S.neg=e(Z,"\\neg ","¬"),S["…"]=S.dots=S.ellip=S.hellip=S.ellipsis=S.hellipsis=e(Z,"\\dots ","…"),S.converges=S.darr=S.dnarr=S.dnarrow=S.downarrow=e(Z,"\\downarrow ","↓"),S.dArr=S.dnArr=S.dnArrow=S.Downarrow=e(Z,"\\Downarrow ","⇓"),S.diverges=S.uarr=S.uparrow=e(Z,"\\uparrow ","↑"),S.uArr=S.Uparrow=e(Z,"\\Uparrow ","⇑"),S.to=e(V,"\\to ","→"),S.rarr=S.rightarrow=e(Z,"\\rightarrow ","→"),S.implies=e(V,"\\Rightarrow ","⇒"),S.rArr=S.Rightarrow=e(Z,"\\Rightarrow ","⇒"),S.gets=e(V,"\\gets ","←"),S.larr=S.leftarrow=e(Z,"\\leftarrow ","←"),S.impliedby=e(V,"\\Leftarrow ","⇐"),S.lArr=S.Leftarrow=e(Z,"\\Leftarrow ","⇐"),S.harr=S.lrarr=S.leftrightarrow=e(Z,"\\leftrightarrow ","↔"),S.iff=e(V,"\\Leftrightarrow ","⇔"),S.hArr=S.lrArr=S.Leftrightarrow=e(Z,"\\Leftrightarrow ","⇔"),S.Re=S.Real=S.real=e(Z,"\\Re ","ℜ"),S.Im=S.imag=S.image=S.imagin=S.imaginary=S.Imaginary=e(Z,"\\Im ","ℑ"),S.part=S.partial=e(Z,"\\partial ","∂"),S.inf=S.infin=S.infty=S.infinity=e(Z,"\\infty ","∞"),S.alef=S.alefsym=S.aleph=S.alephsym=e(Z,"\\aleph ","ℵ"),S.xist=S.xists=S.exist=S.exists=e(Z,"\\exists ","∃"),S.and=S.land=S.wedge=e(Z,"\\wedge ","∧"),S.or=S.lor=S.vee=e(Z,"\\vee ","∨"),S.o=S.O=S.empty=S.emptyset=S.oslash=S.Oslash=S.nothing=S.varnothing=e(V,"\\varnothing ","∅"),S.cup=S.union=e(V,"\\cup ","∪"),S.cap=S.intersect=S.intersection=e(V,"\\cap ","∩"),S.deg=S.degree=e(Z,"^\\circ ","°"),S.ang=S.angle=e(Z,"\\angle ","∠"),ne=c(x,function(t,e){t.init=function(t){e.init.call(this,"\\"+t+" ",""+t+"")},t.respace=function(){this.jQ[0].className=this[p]instanceof B||this[p]instanceof M?"":"non-italicized-function"}}),S.ln=S.lg=S.log=S.span=S.proj=S.det=S.dim=S.min=S.max=S.mod=S.lcm=S.gcd=S.gcf=S.hcf=S.lim=ne,function(){var t,e=["sin","cos","tan","sec","cosec","csc","cotan","cot"];for(t in e)S[e[t]]=S[e[t]+"h"]=S["a"+e[t]]=S["arc"+e[t]]=S["a"+e[t]+"h"]=S["arc"+e[t]+"h"]=ne}(),ie=function(){function t(t){var e=j();return t.adopt(e,0,0),e}function e(t){var e,n=t[0]||j();for(e=1;t.length>e;e+=1)t[e].children().adopt(n,n.ends[p],0);return n}var n=l.string,i=l.regex,r=l.letter,s=l.any,a=l.optWhitespace,o=l.succeed,c=l.fail,h=r.map(X),u=i(/^[^${}\\_^]/).map(Z),f=i(/^[^\\a-eg-zA-Z]/).or(n("\\").then(i(/^[a-z]+/i).or(i(/^\s+/).result(" ")).or(s))).then(function(t){var e=S[t];return e?e(t).parser():c("unknown command: \\"+t)}),d=f.or(h).or(u),m=n("{").then(function(){return b}).skip(n("}")),g=a.then(m.or(d.map(t))),b=g.many().map(e).skip(a),v=n("[").then(g.then(function(t){return"]"!==t.join("latex")?o(t):c()}).many().map(e).skip(a)).skip(n("]")),w=b;return w.block=g,w.optBlock=v,w}(),re=c(d,function(t){function e(t,e){var i,r,s,a;if(t[p][e])t.insAtLeftEnd(t[p][e]);else if(t[u][e])t.insAtRightEnd(t[u][e]);else{i=t.parent;do{if(r=i[e],r&&("function"==typeof r&&(r=i[e](t)),r===!1||r instanceof j)){t.upDownCache[i.id]=d(t.parent,t[u],t[p]),r instanceof j&&(s=t.upDownCache[r.id],s?s[p]?t.insLeftOf(s[p]):t.insAtRightEnd(s.parent):(a=n(t).left,t.insAtRightEnd(r),t.seekHoriz(a,r)));break}i=i.parent.parent}while(i)}return t.clearSelection().show()}function n(t){var e=t.jQ.removeClass("cursor").offset();return t.jQ.addClass("cursor"),e}function r(t){t.upDownCache={}}t.init=function(t){this.parent=this.root=t;var e=this.jQ=this._jQ=f('');this.blink=function(){e.toggleClass("blink")},this.upDownCache={}},t.show=function(){return this.jQ=this._jQ.removeClass("blink"),"intervalId"in this?clearInterval(this.intervalId):(this[p]?this.selection&&this.selection.ends[u][u]===this[u]?this.jQ.insertBefore(this.selection.jQ):this.jQ.insertBefore(this[p].jQ.first()):this.jQ.appendTo(this.parent.jQ),this.parent.focus()),this.intervalId=setInterval(this.blink,500),this},t.hide=function(){return"intervalId"in this&&clearInterval(this.intervalId),delete this.intervalId,this.jQ.detach(),this.jQ=f(),this},t.withDirInsertAt=function(t,e,n,i){var r=this.parent;this.parent=e,this[t]=n,this[-t]=i,r.blur()},t.insDirOf=function(t,e){return i(t),this.withDirInsertAt(t,e.parent,e[t],e),this.parent.jQ.addClass("hasCursor"),this.jQ.insDirOf(t,e.jQ),this},t.insLeftOf=function(t){return this.insDirOf(u,t)},t.insRightOf=function(t){return this.insDirOf(p,t)},t.insAtDirEnd=function(t,e){return i(t),this.withDirInsertAt(t,e,0,e.ends[t]),t===u&&e.textarea?this.jQ.insDirOf(-t,e.textarea):this.jQ.insAtDirEnd(t,e.jQ),e.focus(),this},t.insAtLeftEnd=function(t){return this.insAtDirEnd(u,t)},t.insAtRightEnd=function(t){return this.insAtDirEnd(p,t)},t.hopDir=function(t){return i(t),this.jQ.insDirOf(t,this[t].jQ),this[-t]=this[t],this[t]=this[t][t],this},t.hopLeft=function(){return this.hopDir(u)},t.hopRight=function(){return this.hopDir(p)},t.moveDirWithin=function(t,e){if(i(t),this[t])this[t].ends[-t]?this.insAtDirEnd(-t,this[t].ends[-t]):this.hopDir(t);else{if(this.parent===e)return;this.parent[t]?this.insAtDirEnd(-t,this.parent[t]):this.insDirOf(t,this.parent.parent)}},t.moveLeftWithin=function(t){return this.moveDirWithin(u,t)},t.moveRightWithin=function(t){return this.moveDirWithin(p,t)},t.moveDir=function(t){return i(t),r(this),this.selection?this.insDirOf(t,this.selection.ends[t]).clearSelection():this.moveDirWithin(t,this.root),this.show()},t.moveLeft=function(){return this.moveDir(u)},t.moveRight=function(){return this.moveDir(p)},t.moveUp=function(){return e(this,"up")},t.moveDown=function(){return e(this,"down")},t.seek=function(t,e){r(this);var n,i,s=this.clearSelection().show();return t.hasClass("empty")?(s.insAtLeftEnd(v[t.attr(ce)]),s):(n=v[t.attr(oe)],n instanceof x?(t.outerWidth()>2*(e-t.offset().left)?s.insLeftOf(n):s.insRightOf(n),s):(n||(i=v[t.attr(ce)],i||(t=t.parent(),n=v[t.attr(oe)],n||(i=v[t.attr(ce)],i||(i=s.root)))),n?s.insRightOf(n):s.insAtRightEnd(i),s.seekHoriz(e,s.root)))},t.seekHoriz=function(t,e){var i,r=this,s=n(r).left-t;do r.moveLeftWithin(e),i=s,s=n(r).left-t;while(s>0&&(r[u]||r.parent!==e));return-s>i&&r.moveRightWithin(e),r},t.writeLatex=function(t){var e,n,i,s=this;return r(s),s.show().deleteSelection(),e=l.all,n=l.eof,i=ie.skip(n).or(e.result(!1)).parse(t),i&&(i.children().adopt(s.parent,s[u],s[p]),v.jQize(i.join("html")).insertBefore(s.jQ),s[u]=i.ends[p],i.finalizeInsert(),s.parent.bubble("redraw")),this.hide()},t.write=function(t){var e=this.prepareWrite();return this.insertCh(t,e)},t.insertCh=function(t,e){return this.parent.write(this,t,e),this},t.insertCmd=function(t,e){var n=S[t];return n?(n=n(t),e&&n.replaces(e),n.createLeftOf(this)):(n=K(),n.replaces(t),n.ends[u].focus=function(){return delete this.focus,this},n.createLeftOf(this),this.insRightOf(n),e&&e.remove()),this},t.unwrapGramp=function(){var t=this.parent.parent,e=t.parent,n=t[p],i=t[u];if(t.disown().eachChild(function(r){r.isEmpty()||(r.children().adopt(e,i,n).each(function(e){e.jQ.insertBefore(t.jQ.first())}),i=r.ends[p])}),!this[p])if(this[u])this[p]=this[u][p];else for(;!this[p];){if(this.parent=this.parent[p],!this.parent){this[p]=t[p],this.parent=e;break}this[p]=this.parent.ends[u]}this[p]?this.insLeftOf(this[p]):this.insAtRightEnd(e),t.jQ.remove(),t[u]&&t[u].respace(),t[p]&&t[p].respace()},t.deleteDir=function(t){if(i(t),r(this),this.show(),this.deleteSelection());else if(this[t])this[t].isEmpty()?this[t]=this[t].remove()[t]:this.selectDir(t);else if(this.parent!==this.root){if(this.parent.parent.isEmpty())return this.insDirOf(-t,this.parent.parent).deleteDir(t);this.unwrapGramp()}return this[u]&&this[u].respace(),this[p]&&this[p].respace(),this.parent.bubble("redraw"),this},t.backspace=function(){return this.deleteDir(u)},t.deleteForward=function(){return this.deleteDir(p)},t.selectFrom=function(t){var e,n,i,r,s,a,o=this,c=t;t:for(;;){for(e=this;e!==o.parent.parent;e=e.parent.parent)if(e.parent===c.parent){i=e,r=c;break t}for(n=t;n!==c.parent.parent;n=n.parent.parent)if(o.parent===n.parent){i=o,r=n;break t}o.parent.parent&&(o=o.parent.parent),c.parent.parent&&(c=c.parent.parent)}if(i[p]!==r){for(a=i;a;a=a[p])if(a===r[u]){s=!0;break}s||(s=r,r=i,i=s)}this.hide().selection=se(i[u][p]||i.parent.ends[u],r[p][u]||r.parent.ends[p]),this.insRightOf(r[p][u]||r.parent.ends[p]),this.root.selectionChanged()},t.selectDir=function(t){if(i(t),r(this),this.selection)if(this.selection.ends[t]===this[-t])this[t]?this.hopDir(t).selection.extendDir(t):this.parent!==this.root&&this.insDirOf(t,this.parent.parent).selection.levelUp();else{if(this.hopDir(t),this.selection.ends[t]===this.selection.ends[-t])return this.clearSelection().show(),a;this.selection.retractDir(t)}else{if(this[t])this.hopDir(t);else{if(this.parent===this.root)return;this.insDirOf(t,this.parent.parent)}this.hide().selection=se(this[-t])}this.root.selectionChanged()},t.selectLeft=function(){return this.selectDir(u)},t.selectRight=function(){return this.selectDir(p)},t.prepareMove=function(){return r(this),this.show().clearSelection()},t.prepareEdit=function(){return r(this),this.show().deleteSelection()},t.prepareWrite=function(){return r(this),this.show().replaceSelection()},t.clearSelection=function(){return this.selection&&(this.selection.clear(),delete this.selection,this.root.selectionChanged()),this},t.deleteSelection=function(){return this.selection?(this[u]=this.selection.ends[u][u],this[p]=this.selection.ends[p][p],this.selection.remove(),this.root.selectionChanged(),delete this.selection):!1},t.replaceSelection=function(){var t=this.selection;return t&&(this[u]=t.ends[u][u],this[p]=t.ends[p][p],delete this.selection),t}}),se=c(k,function(t,e){t.init=function(){var t=this;e.init.apply(t,arguments),t.jQwrap(t.jQ)},t.jQwrap=function(t){this.jQ=t.wrapAll('').parent()},t.adopt=function(){return this.jQ.replaceWith(this.jQ=this.jQ.children()),e.adopt.apply(this,arguments)},t.clear=function(){return this.jQ.replaceWith(this.jQ.children()),this},t.levelUp=function(){var t=this,e=t.ends[u]=t.ends[p]=t.ends[p].parent.parent;return t.clear().jQwrap(e.jQ),t},t.extendDir=function(t){return i(t),this.ends[t]=this.ends[t][t],this.ends[t].jQ.insAtDirEnd(t,this.jQ),this},t.extendLeft=function(){return this.extendDir(u)},t.extendRight=function(){return this.extendDir(p)},t.retractDir=function(t){i(t),this.ends[-t].jQ.insDirOf(-t,this.jQ),this.ends[-t]=this.ends[-t][t]},t.retractRight=function(){return this.retractDir(p)},t.retractLeft=function(){return this.retractDir(u)}}),ae.fn.mathquill=function(t,e){var n,i,s,a,o;switch(t){case"redraw":return this.each(function(){var t=f(this).attr(ce),e=t&&v[t];e&&function n(t){t.eachChild(n),t.redraw&&t.redraw()}(e)});case"revert":return this.each(function(){var t=f(this).attr(ce),e=t&&v[t];e&&e.revert&&e.revert()});case"latex":return arguments.length>1?this.each(function(){var t=f(this).attr(ce),n=t&&v[t];n&&n.renderLatex(e)}):(n=f(this).attr(ce),i=n&&v[n],i&&i.latex());case"text":return n=f(this).attr(ce),i=n&&v[n],i&&i.text();case"html":return this.html().replace(/ ?hasCursor|hasCursor /,"").replace(/ class=(""|(?= |>))/g,"").replace(/<\/span>/i,"").replace(/

              >?P`4Tfm +>/?X6:oC-R(Nj6AquLr9*4kBd-S:6h?O4m\-aT\]ApJ!fAXG_Vf/pJg.2(;O,gIY +Ib9'q*2aDdeA3YC_=t;LNsNi(%ADj(ar$O;^T(\eH'Nqo-tF'=>T#"_ibK.'ASaf +U;4o8bUC#BdVh?r-,uW9%*)"e&9Je]A-8]A(t)Kd'0pgXUJP:bgtp1FQXcH+e^IR,iYi%.K>lj +19Jn[q=o#O7Pn@Vpd2)PF)NuT1&uIL&NhB?Mou_#+W);Q,I_q*56]AuI8#Qf)3?+dgH6'X%VB +>GGUg;P$)h=c%MPi;aAgeT8c%CQi+,Xc<#/n`)XN=!;bgH7m!oGi5rR$/GZK,>J1S?m(C+#SA-13?+M,>AMk-"@p+56K#$>b:ODOt;$_Z88-AG4$ +t*BT\HpP-s#_%,?F8]AdPYT56\6eZ&?FA$a6dgr$l]An&3$T4p:I-+i4H7LE4$7WS*rJ_sHWm: +O5\HL7)>s;p!^*o6:5Wu%":)B%Sd75;Gps@d-hg2noa(R;M3k4X-3TWBi1FWP,F9pn$19iJk +!-&6qC(1qm=Vrrh[?:F;dF=g;?L00NO@8jZ-lg?Qec*2Qr!/S,%/??^&_-Xa_NTaRh.:/Ydc +F<,[>2n@=>0dboK5p7/*A2EJg_/FpJH$=c]ALI>@JPN1WHtj2'&;6,pW'jE:[%@AV0JRr31CGVM1BIo;1/#qQbT#)'(h4Pm&g-#AB^9hJXXoiEePfQ +ImJrcVLJYOOoLf5fYsLKoJIZ51W>lu2itieSro$;+)adS^B*hr*l'R1#[-53+2b>-bM*+S$U +2?8^3Y9XQoOWeNWTZXS7Af$39tA@]ACB*N0*ams1s_._ob'K=/6npHJZ>\J_Mo2C^YhTY\g>g`mgq+gOZmJ0m +na`hWl0Q8%L@\&cH$;QZsfk$`&Bm)GWR.qTX>!`)H")u\V73Ulg>^B>S(_6+]ARK8n`D`0Gsq +CYFs6PkEM+jV=u1XcGR_FkSVq(Sf'uIk2dC%8$Igkr9=ulk.,#UE1!Z_A*S1N+F&U\^6N-%6 +OjW4d12Z_*UBFE8aCrZ,%?fF^J+"VQ@<@T.t1ucI)TgMZ-+2:n\f.hNWdm8gsi4&\>8eW#[otcS^_(eAON`W<1(JJ$LBnWjAA.@ +_Qn2^r$K7)UH;l!]A1OenINt>Q3iL&Qb?##,Sgd5]A)TItEWt&_KE?5"GIRs!WN@T/WOGN$;*6 +^PcLT\'*V7@3"jle+LJ1&2rWJ!Kb7JJhBpA-0%*7\9_QRe'cu^AKk;\YSMOpGBQ[Z+l!bRO$ +ITP3lYo#t.kAC]A%+lWYFhueOp0G,9-$pZ8qc>SKn'Yr*eOO +;[Gst3I7a!&7%r9W!eeihbR?mjH.O3Ffl;)dP=J)s9'/:i_mgQOSF/*n[Q3_hl#fqVAL;B/" +=s4Cf=q*0Jt*]A^C,![rHn09=?utdDFd6Vd*=#0GEYnOPZVZ(2[eXihAA-pGIIs^jKRdb2WVj +05TVX]AMM2tIfmA_aAg,Rnq"eBH$nh^[RVPo1"P-MI9YX>[(0bc@gP4W;(5[04M[-$Xc]A(4Fl +p4LkP*#_L>`a44l'CECg5//QuFJiXqKllJEXq#)FIr@u&ljt]AeY#(3D,*:u#/"i<.]A>U7Q-& +qfE28W9<1G[\^VFs#Q*LlqiS[G%*cNfi?mb5:Qp7C\Z2HZKMTsMgejE[bp"f4\l-:V*JsXBQ'UB'$q?m(-3 +A97f%R-`)T_PuBm,V;YBWld5`?i`]AUm=%Y!L3gOB`1VrACQ.@\/m'MB=tQE_k(MpFee$]Aad +6iR0Y4mWgakY'kDn;uNg+2H[O>[k,8Zr,6^,afa5u!'OromAZS)0KDr1_S%WFmdgN3*[X7,t +VU5n^:6#]A7*)3u"CVEN.M1M +K(;TPI1AiNbL52q1XH4OnaNMI.`\@E.ObV&6;5P!UC8MuP;P6i,U)%c$=n8'Ota9\6tO +:9=[ng&Vh(I[&>-[-,f*:Q!d7Fg!Nm*l"N:;Y5.qWg#77fgHY)_%sg@rhX%&i?P*ntp.`\9* +gNRF*;6^O6,NE:TX&M[D6`:G@OEq2&HQD(arL5^h6#;;U.7P"Z1r&4*i()IuJ,0R.4U4=I_U +>W.m-Mg;^A'QaKY4H;)p&Hg0[K9aJAbaoXKUh:2q*"(Bih!Hf,fB5C-@c5=*J>+bOe[r?\qe +sZRH7)>+(UhQ?Z+H?TBO2Frg>2?e-=&eA4E`l"A]AlKY#YQ%T2fn9<,OJ#Z`U,(Z4E8UA?dh- +SYh:]A!GaZ:O>DuQ9H$n5Z1T`jZ\6u\h\dJC7TY"5tKK*^?*#U`?fiZ5eX5@71]A9+b;e>`+09 +D1TJX9:h)*c/KaqG@_nOJ,VO@HKK"_pTj4)c=AaVb>`HV"!+3HB.KAs,4/Y7\A6\gU/1JK_CGFD=9$1i'aQIoLO_@1OgD7T6_Q5\9,]A->RHjKB=*)ZFN=>_F+__ +g-PLd4Kb84\s9hG33KL1C*LO&hjc$bp/s[GJ12MN&Gpg=,MoB&5'+pW70Q8aDEH6k((<]AX*' +Hph(e5Q:o,S>[k=;_,^D:R8^5#*;M5KUOSEMMr)t%,&JnMPtn3t+F`dNn\8X*B!pHZj4C[TO +m31-7e&OLJ\3h+6UH]A\FI\cNXG074K9SVFS2T_4D#&dXgE6?nsbBg]Aj=(:CT6Wr+INBE[/:_ +d)>K:AhYj+4!G\WmYMa5BB)=k3:(i$Q>3]A1P[1&<0;)U<.TN-&E2@g80-?:mAtjM`I2UAgmB +HdC9nh:Bs^L.4M67Y4=!qW@.2(E.PnTq;pj>XZrIq54u2P/n!'tl;#VB8/&r8OB#-HSF#E%K +NAJQX\YoJtJ>`.u%@9$GU?LYND[e8c%qW[(TKnu4ZGN3E$&le3n,2b8=4frAk9r@5i@&H&<_ +:RB$M&^6s6q_O(1keGkE5Pca5E1f/jI'@2ZEioH3N%]AEQDF8gGb%b`Q-b!>J+Ss:.W3sihWG +b$%^Slj6dD[5:t_rd(WUuof?E\X@JaU4N%$:>`$t%8,'N1kZ,epGkU@#-WkQ-a3VtEZVD9dk +%Vm;lb*ilLjPqNHu1faVS9;g1G`=\OagFDmW$\)jliA^?<_5QL3j+[7mCYPA@bP3gkdkJ%&I +!cci=t."SeWka@jmT\gKq$\Y-=BFf*hK,oi13kZGT@0@0]AIjsEnN7k-C'88Qu\,qaBH)ca50 +NFJn%j,Fb;R>q9$!b_WGU2'(-PC+]A7XUHj3%:8lp_/GRiXnV)%;1b=*-O-bm`0-776E-=GQ! +#.BH/ER@@mS\s#@.LCZ3,]AHQF#h&CRU]A96ZF$ZDUDp.TtsFJ07*2bdA5B/qX#$sS6[>oAf*+ +)R[_%D.gg7?O69`@1hYP]AldC_OH%Zu72"cNd+l9/^BThHK(I.GkTa1L2SLlG*>TuN*A"T'@; +Z&jSNMi@EkPXu\"'XbUIi&ld`]AI[d*GBr-,ti25r$#jd?s-Oo0&9sY)BhTEmfDu`85XZ`h+ +E+>/2,\T$\_rm:%TnVnU5"[MLNV%RPmj(?Y]A8qO!UuR$j&i@50D.ceumClX%7\FEsb!7([2, +)":Rp=Su<=(R[S3!#G1BbA6'[W%!Js+NC;H5Ah`":@GDlBcY7ak;")lWf?q=js^_qYItki3W +dKPKkCLAObI2HCu-CWCW'276Thhb>F"^;_me+Z>k4"PYO64^G"7&7$n2WmaDM\M;6_\L45Ro +GLd;"2'!P4l]A4Td[,jdq!Eoj"O[1X$d"!j9AR35CfV +9#p0An4K08F"7u#rB(GKFIQO\CCTt-*OT%sH%L>%h +6e![W;!5EMDJGL+iukZ5k.@oo/X-Rq.qd-Hj_2K$ssNE2VjQk(P8u#%_,ftmlE'L&"nP;OK]A +k&KP$mbjjhoZmocA*\ti3*r/F'qj5/ajorJt^2TN,_lTdMCoZTdcJS+2t2T#nb!tU&F@@m&\ +OS,Zl;Q:\fdbO\+G=6_NG@NS^Pg-8is08Z\K-<'RSgV]AK:845!Mpj"4$SV/Y#HZqDaoN:/P' +n!Hmh^B``4=4'a!>:0a^LC*nJ(j)kWYpk8!n@lp]A4XDRrht+Rb&\k$g'798G\WnR\PB9Q'+u +e$FrNtN414ETQUE8=U'u(l,_;iReR^#D37a="X@`VZ!-Q\*n*FOg:#U$W41<(=D2NL+pMANc +kW81,jY8K8HDG^cTFYd$rqu0E+#YD$)k2p;>=_H(:ba-\ZoLAhWY?NR;Q`9;CB +72qj8+'JM91AFG`IS$J]Aq(]AaL#0$Zp\cW!6R_YqIlo)3tL3:7+OkJ@A\YkPd)LL-)Y,8/i.` +RRQEp;+_D,V85U/P6lbpM(1jePnr*B[=Mue*5BNA6RK`2I) +Ct(mNjo"F\^]A-V:.%PI`j()rJ+iAB,'8=ASm2VU8VjL)0"\=p)ge'B$.;MdL6q%V7sT:tU_l +N,hti%%Wr>]AX!H=lX?GuW1g_)aWOY51^>LO$X7@^pJ^#R$oi:90iH?H_XS/Pjp:rKBF`"BpG +ok64DQ,*[FHFkX5TGbOtf/M^gN1Ra3UTW[4.HU7>-6'BtM+QA3pL?duClfC5$>RhU/ql2UPH +lB\dgK7/Z@Q_8Bp./>K?Ur`Ot$bRM>`.)M:J1#"R0'VBMC`lYoi1,hkj6"SttJ*(rI`NDerp +?JQ0k\Y1>X%;5J1;2[g=Bfi4b-Le_#!PF2VB`.K7_I9Tj"AZ`8pg9,XVD\MXjRsO5I6f]A*j* +Z@ESd(nZ%UC0R#?t5WG, +0*7c[0u]A>Q@U`a$5@KgF.=Z@6/%gpT^bG@Gh`FCR>QNdl'h5aLSFSH7Ka#ue[ocI9sr +H[d%ZU90NO;Q.L@X(ePedq67@[)A$V8o +#$P%2;EKZ1RR*Ai=tE_9&a=dL+26Y!>Xu#l>U,F'$Y,&D%e*7a`%6QC"h1OD!79lB2qkQOcL +$lOh$5]As/kf%fN7D?7am'XtHUA9&87uPbEotC18mRs0WSiF-hI<`qCHF<=2[i?`Z:4fqEeMBKZ"YTR[MV"=a^#Ti +A7lFI/]ApS@n+%kq_3:oC)AmOklA6%E2eY>o^[@-SZV28[7:8"hDVH:(]A\gXOVq^JB-l8Y\90\L*:[)pdG8am\b(Af9"\&a)I]A)OqJHX%S2k&[f,FT/o +,mNoh:IBu:'N("\HpZF=I7t+&`^\N!@rVPjn(Ft5i!$-t,S/^[j)p-4<%BdDf&;q\Efk.in[ +,bBr024OK?1%+Nl(Oaub3!Wm=hOii;;_rl;%^S5*S\B-57*BFCF&\2@-M+)2b4tZRIj:g.qh +(P,8MH@!b=S_d7:3%3]A'2mX"+d.[mB,A9;.X@g'3sCI?$/\*Wi!;X'"'$E@(9JMY@X@@A'p? +1"m-Ml.RON@o0P^,c&UC0DV]A>kGR&M5Xl5OlW$2M18]AMl-X(:sOJaf_Tke$!q_6`_cEPDdc* +1Z..QIMG0-f%#FK;?=@_it6n#W7Wnn+`c1GjeG5QW,MV"$2ffCC/%#nVp71Vr`>r%u/:>G)_ +1'6!.JnT9NPMT$*S=>KJ;7*a9'g6*6AIfBs%G-[TsI%06oUDEeL6`04M]AQ57=%F7XiC]A!\q! +UXBM+0_3(.4'"9ZPJe)deSRr=opG/!jCS/OF^N[$aRhkM]ACdb%K+=lGH@o"B.*e044Wto<#D +]A3C$E4pGl_#_12DSZY\L'U5gGA@j/=\QeB;eW>\f^"T''\B)(3'7%W?dgj;sb>Vsm98C0I8f +^L$;FRh#08Q\i\a?)XFhMqaK!Yu:R6!An,q)']AsN$bXXYT8Y8C,]A4-9-pR?%j9HtYR3^'cXSPijB2@cpGRU\me>kp(@52U4h?m,IFMGZTfm?#%lY6WMl'.SSg +rcU(<@<#P2O`FItiofoS2/3Yt>Cd_n^;g@^^I`-?5$u`aU0W`b4#WEFYI3%uj3>ku`;:/iT@ +u0'36+NW&OXSOp7rqQ(Y`GPn(SfP>S6N30+iKMo70OMOY8Z#!8D&GPhWDjNXXXWoGS/MJT70 +-6EY#e!<0Ghd=?"O_aC`GT_f_8$);9GR,.tSmG::Y%HZS;aYA%`=;QS%&Q)[RYet;rKHraX5 +V5.Vpl"6l>33)%V"\&2Q7D^uuCWadjJQ:.(@/tRE_^\fJU@3pLiY!Tg>WqCO'L&5,KA)1fbNo\T?%&lXp>i +U?T\WW-`NVp/*.+tZfdQ#7??`;EtA=VlrIDhg6)9JTf*@/[4/Ymdb$;52hXo+UEP)u1kA99K +7+H2mHOVPEXN3,'q!%:UXH9s4c:C0%BFHPYI8;kV&j6$IFJ!V9O2pDmehFIA/b7b=j/qL;SO +8l6*Nqi]A'fK#8k[85M7Q6sJ2$YT^%mb,;a$if>E*la:dV!!_p2D +/AYhr=QH#1@3sIbbXY06p&,'5%q"/hjg8dP.e:`S8-:\f&`23F`Z?UuG>"`/[R#LbmVHkB<-LXi9U@^"AT(Y^-qa$DB_F/5ED@L##dGu39Xkm)Z+.Au[ +"rG>3Ho?1ULeSPBK88*()"?m^V$bDj*&?0asu2]A-VL@-*W*8/T]AY%Os,CNXT2=:d20cXBq;3 +uZS?Nh5*3?%2%r@(!\.9WpXJheVR.IH='QS*MMtBg,6fb"#?!i(IX&4*Z(#)Ha@==eE?>PNH +Gr=2G#h9/R-nd(ipCRS9\Dh-\/ku$C8doR=M9-rU/q>6W-!W<-Pnh]A$"\GK2[NP*>f!3uK,M +2SR-D,gO$e(QBeCTMXg) +7,5g?u;=-Q[)mme3=?d':9Lh3-s,ATY?>@[;JqilLC6K'T0^Yq!h'JUGdgaHBiJ2"s4[)3RK +M.Xg>Ss')j%MAOD#h<"1T>35/=.(Gr$'S:CQ5"bq6fKQAVG^?sis&LhF#H9cJPugns)OfMG3 +D6fEU_+%[%t[1#Xh::;M[I*m:SHH#r1+aA,L,66G+!5fF(OC/@CO3A3i@ZZItA2O+el +e`Nt5S?&EJ%sTa7\>5T@N$i)Lh>?1uUP?-Dfms$8*e*\C@t7,gF0m#tYto$M(T@6b2G-]A>d[ +Kb*m+ZBtX0WKB7DG>0HDRSQdBHk58RXqtD*[AI>kb&he_W\P1s'=+q"0f-8k$PN0\o&"B0DF +O%bI_$QZ`IWQHUiWb&8@^X07ND/GCPZ@M:G)'2N++_nlY1C2T$6` +?7et@)jRdr^Ee*LOj0uA[n)u*lqW\IQ)hl?e006>KDT=MRk`1otp"2S^CJ=mK4eSYHp=eND +6q=Np`((Rm6C!q1Sgh02lnYV*15+!9o/+'%k>:F@@\PRnK?P:j[7lG%h#p!ol%rti@%&8+TB +]Aj+d?:`II7qfeAa3?qn8j$sT[&,H]A(%;%jf%s?E4n%S&:U3=%`.o)&!F+BP(fhn@*AQuFnik +B"+$*7-N=n1+I'K?gX=.6l#YSO=2rnHm5qbUn#ij@27<28Gs("`fkBsknrNjK7fX#6rk7VI, +3O!.X4a!1>$r`!6=[RYd8KcllJ]Af?X*M91Z)3(8EcX:ZZB/6,A,8BCZI0ch'2jhGU0Qf@1GP +Cm+lQ4X63Z8&K`Un91)^)'=@e>XU:%Sl-R*92n?9V=QoGj&o."7=s&#i8/Y38r=9"R\&WU=[ +fSqST$''^X[mm!]A*\9j\?a1$j&<,rBdZ81;5MbPT#0pEgiurb2_6"_.a*PsSjA5^m!i8JrKR +U]ADC;.aHo_q\#-uZ<%!$q$Pkq&!:G:5YR),j"%]AZPp'p+9%e"8X^.@'X'JIQj&d`KbfTK)a1 +eRZ7SnJ(OmbLS(Pqh4aE/X0Z<3[Q9O,p-BB^j]A*B]A(,i?6dR:W*&PYB@7=2c-8;[6[u!5X4E'[;:D\nX(IXhCE-3s2/>nfIc.f1XC; +4PF>utjR>G.2?.i0gW9.=u,`FFNQ7f\Goa'R+$XYQV8^Y;EX^/f1IA4=;bW/OpmOsI`CLD]A^2o>DQ^\,!5a]AN#)Rid&W*[8 +8-0c=E0kBZZCj64ZlK)4SWr%OmP8+*ukNUA2':Z"bEcQ1@m2h:f+Yo6$L)<49',,jri)Zl=B +JD%ESlpACK(W>2#p`ZS$VP/s>[-d)G%I20rSQN-_0(t%#Ne"LkRiP0.n"j&SRlj]A(1e.#/p2 +PUg.\CW+HUrmm>.&d;nb*q$rbmg[neQ'!Pd;Go0nROBPE(8$j+#S<]AX*[+.&<_Z_=n/#@bj0 +>EX!U&[`b=;ifhGG%"ZGK##o,n^n<[Q]Am0Ee5=V\[!c)WqjNa +9n4GO?CD..&pnC]A]A(>Q\ti1mE=B_qG3[H(2ma&qD+4.Es5cXA';k+i_\1(FMDk:2!s6riOpT +#(LaH@LVs-;iW>*#@jKOlBpB=8S?D+8aC[.Zl0nsXL\qsr-gRjYj;b: +=bp&S[-E/:h6u]A*@hId/i[=K/:A=>):Ke%e-?JMY:J_]AhUF)ScinUEeg`g<`0<3V?%u.NKqQ +Y4qX.L,MI+W$JO=9E)qG+-L*rKOL4(%5rN#KWYGr:Ek(2_Y!>j!^6QQ,lXP$4 +p"KS50FR:oWk)'a0?38aa_9@iVX1'E;82).ED'6;QA]A;qnIM^;3M; +lqQE-_\=;sHW/P"KKPeT.OoV$o%F'aj%(fKr`VCD[`2T=/K^YmS\CVMo"8&jdQ?`GP5R;_Sa +,0jDh+CZ=!bH@fJ4UO_?BbSP,M,Zece8 +PS8gl"!p&G&j3&GtSK]ABAIcA43`0Bqh$'bS)$FUV;!U@_D93'.(`-nX-b*1li]A`7`sR-gSK! +(bBf8"_J[(0Q(kr>,7,e!^QBA$1_YV6SH`&frn-i?QsqblP5M)*Pk\VOPY +#6Q^c>[043\YFup)=)7l;A#XAr1H82M.]AgDp1cb5BSnB4)-#Et7E22A]As2WtE"JUfcOi;e4) +eUsa^'a`3B@)1?.GOCO6_cZk+5MDekb5Q^!P,M;j9Nk+,knHX,GHh!nfs6%`br+-V(I*+PP\ +m+$./i]A'b#Jl_VSh:]Ae`0#LD'Vm'6#Z]AB9SSXC8#s*-'U(_Z#8b +qV5Xgo\`DNr@S5kW]A0>MpW#P%.G^*0KbJcE6m#U/of_I3#g43MmM^;.U9_oTLYWOY!(qQ*Z% +Q*I^Pq2(goipm?;DSWGfTHofnE-Z7X+JF"g_X3J$b]A<-OL;Hm5J-!=_X:TPP"Kq6rX>&-m4h +emqOI3QH9Z;?Gb:PAp>0,GXfGT=F'i*boq#CP#j.f0M#)`noOdXlbKONMN1#0N>t_\=,q*,X +03+6l;.0,H[ti!(*T_\.gKZ=f9p1H8-ho2Ii$sM6X1*Rjk.?@?mu*P;c)e1J50=hl?F07UuS:;)Zs$s=OnjD!`.DH0:5bTI6)='i>N!a\%S3 +dQMJIEoj"Z]As%?P&Jc +@DY`UCK&hVW0HJaI8kTJtOQ;5Td#;&TV:*_TE9F@nTmj"^k<`7AP9T@Nlk*Yil0]A29IoT)r/ +#1=PKLM]Ab?1=It$42+s,SqDR/1-0T&`kYL?+U"XBhPD4bIoQ*BlRE6l0p8D%VIh2R&!ss]AO< +4$`j;al4lnYi49[qFf\tRGXKtQqLp,ka99mbZ;`%UWe> +;02:!>sa"@ImRJ[('9&bj&snFf$\%BuM]Aho&4M0X<`Q/Sk6"cm?u]A5#9ku'L:dTZ +2FdQ%D,3del]AXG9c'p"ij6"q=uRM8We*;QD%J/nU06ITB0$fP-1daGZ+,1n4^#nHqjuk\/\* +pjI'R]AGG;;"GI^39j2lgc.Qp`>Q2&nWdp5>MD>Y=W^\_Z^_VtQIk!2"=FB@+O+"=ElaMB1n" +^p_nWnO"WGb(4Fs.0j>[m"0#iS;ODI3a<24$T((^m]AUQOLUcB&Xmg)s?D6tGN\i-Z:G]AN\B/ +TTg[@2mlVKP7@/I;oW3>iO03\`mhdK^okT^jR#/kG?nngo(.2) +$STJ3a5J8r&qd]AH=FG[l9Q@LJS5`!"_6p3:S"$&0_Mn"dCXeWKebR2K:PLt$X4Lk'&J&H/^q +i#aJ+'!@Y#mLMKQd\d*[X*tF[p$NLDCu`7$L<^nhPg9]A_8LiaV3*b6W +gX21a*5\<*maIpQmUR@o1:;JpGIn;6M2%L[)[uK'H?9@0t>+Y7D\:OtCbQRe"%NYm9BMC.mP +NN:1K,@aK!%I"K)/:Ffn3SC):p&#k?#^?0_`i"#BpY0-Io]A!-Y;^&B:%hNs>,"K->eCMaNY1FOo +WW3CLG?JR@,E!"A;*nTi[CoXRGLO#)`Tt^2rXl#jlA!0+$:m[!6i$Ldct/3O$UY7@bq#-5>KGjR30eqXM+kOqJ2'=`bpU4O8!SaYY_@_*gmtC +qs]Ah-8_\k9r1V%a#bQe@,`c8aBMBd[-[s(fD_?1VL*[=jOG=S( +i,7jDfB^fddu-bH.eGOP^T,Q<_tl`l1/K/;EXlT`uIZ(&06\"J[EMrUH +O+eS`)/'bMQ0,$UpCmK?p[JUNYCZ;E-7e0j8GKpc1A&Z4]Ac@(FR+:/8CJ6p1b,%+P]A\/r'T\ +,guBD3+*>U"b1^Cbo!GT_s[[Q`)d4+@Jc-`8$TX%Pl'orBiHOJ+*#fLUktu8+QQ'+%i7>UT3 +BU?'CrZ+Z:26n+4R4C=."`2dfk4)MRu_2s9e3;OLPV*E0I/A-/XC.]AedVIkUZMa-Y6L^Wb\c +JWmbL&G8I02f$f/$&.G_OS6b23,pruO(#d[c2&]A"o2I!B7uj`pbM9?,jkI*cN>C8`\dXhprh&5Fi">B,Fb(Q0"'[@g +0of,!U?OraW*I?k6!:Q^s!7^ui+F+"#:aj%,/HI@0B-b19rUnD@8Q6P+##EaOt&GuR'A(sR5 +abceln<<@Qd?u0kpRSYQN-T8]A]ALR"G,^!SRf8^2AFLs>fhZ"koq8Xs70boWd4Lt +di$1ON3E1X'nA>'+js#0U9[Znr5G@[W.(MBJ_`Cju.@)3`a"CgIqNfih_g!J0NeH'Bk8$(1) +Mmg)&n'aY1Xg_gtY@?,8Kg>EBDY0g[mT*?&.2j2)aRCi6Bi:Nb&W/fejBh]AcWXmt=47?HRB3 +(D5j`BCo3NG"TQeSNG446P)Ej=Y2%?mH'VCp"k`XN&MMR4MB-T/k"\HSib/`,iW4Je@$Q +=fYloI.mjl>;C&WrUND)H?PibVaVFsZ.#1(`Z)5'r_9>K=Wn,$R+T9S1a60H_= +-cY7q"R +Kk[D$Y&)*s#mhsUs^r@Fgo0"&<3T=7WR)k?eA56s0&B":q^=@L' +p\FNfWL(kW%>@0>&c\UhP@.Hdne(7sSR[4/SQ76sZZ]AK,c/2!X/GZkD?+prK[+S#hA\"Mij. +4&0okT?gD&-4NS&f8\POsb1U%1;Nm_tZ9`)if9]A9:*ID:pED%DjeGK3@\?=B^[%kApcrfhFH +dll5.<_M8UtO*H9d.'B^;nUpQ?9+kCD'/HS".["W'3&'X]A-OKMpD6Kf/RFq((!Kf]AZSjsqefX!60C.Gjbgi[=DibPr;h?70_SZ,@o>?0#J5AO#2eko0Y +NOOo=QTD1^)&ORA*g-MQoX1]AIkKU>;R!$+0NWL'N<)\F3ej]AYCJonffMU%0LJI&7]AL@/f6-o +BOEHuoG;3+1I=6k@0^A;Nof50dj.^n_%T\JFJp]A67(UK(,sbiRnuKpF7Sc_!S/'hdk$,u!pu +V6iWVcjk9\0`?@P$..E#&2=;Bi=/)fn4:31"p1csE%2in4>C6j3qP*?NffBm$cpo/1_g&gX^"g#pE740&B4I;<)A+h*0bX+GDj'mG$_&)@_1E?aK'_^12Zti(p\5 +Pp]A.h*Mc7D[6:]A&8`#fi%X@job`^K8WiMZ*=+M?Yp`&>Tkfs'ciMm0;-"6E7Ja#kL]A8.X'on +Z\k"Ydp*^adtCJ:V1eLG[k"`pH*WKQX5CB;!?>k+48O0 +lGZQ4fo9=bKg\G7l/[,$4Y[C,@3'V'WX^#XV4k>:UZcEWPG2UF6G.3Eoo1nFsEL=:sjP'k@D +etXtmS1A,c]ABBp1s3jiV$9>crl&8.,+[K.HV))`Vr#kFD?XT]AK%B`5i>Bi")<=)MA(j+U:Jl +aV'h`PdZ"#`/Y*qi0Y)[']A40:>@X`#0HQbaR38-6O"hrFs_P +V8_X+G:3B:nm^9eB$.k5`OMQ1!If;_)B=Jmj*HkKj]A]A"oNn?L4RV)9uOUYG+#'6.XqPMkP.h +4Pht3,C+#MntKhc\MHe$4!9t`M^:rc[1R\$IaNtSkgFNLOVEI7-`'b]AQ^^/U8d%QqWrpSR)* +L&K24\4[b+or]AM0MNTKZZSL's1..d62tpio#WJ6g"2=-R3i<\C,_B8lFo!45>;bcq\Dhi(L> +Unmkc@sMUCcg-ANUJtt@eX\f[^@m>Qn!r3&1$nV?,)3`/Oa:p7j0/)G#&"[gl&g +RCu+iZMRD]A4Oik-fPY_:F,G +;qn&d(4-?FlVsVMla;)bHU\1RJ&s6WG5AMg+, +XA<<=U)l7O^p%ioBJEF_U2]A!?F@@d]Aa3IFnYYL7fi.jL;pqIE4J@598MdC<(>PGnfTfns6JV +.l9!tQG#c$m#bDN1ld`U?Rpg.&+J=2qDfQGjrdNL#4UVtWo0nk\RF-T$lt_&o:qboW/.i_T+ +ib>4JheL-I5k/Y\-n]A*pqptcJa*'1Y$nb<$.dh4lU%]AS8qj]Aq5^aB[!Lf9=t7Vn507,Gqkc1 +dR[:@l]A$B[0n]ASgu`C5TdS]AYV]Aq8X5A+8apL9-$ZY*$X(KIFmgALlu-JDeXqWF:)DK\Rdp7g +K?"@)I`mcA%Fgj;:bG8/$lnMm9+Z@"&c'1i6U;Eag_)\r!9?3,ST!P!8Ge=n+\B6trEIT(@* +iKTNPcUmn%B0C%KdB?XKqc%Oe6=@.s:!0#Vn6LLte!7H-`aebs,KZ.Zs"4AtSBgP.]A?.&b[% +"`_@Kcb7)u5XFKp=WT3oBT6n7i666Ih:[Z[_T/W^!>9f5chX5oSK:&u.92V3A89Yn$Q/h+[> +&I6p3AU#^.SESR2(:#\t/\ZIu2gWM^kpQ42gcJ=/cM%@S$@U7mN/KZ""@)"aI?p12cYRNS^` +W@(KAj9!a2[0,s!7.*B=S&PB9f#jWXg:%7Nh;*s>O@4X`4Skr +j0bXpF<:IhNh);Lh#DAS[!BCCT'Q\&X#KH$jm:A_L3]APFKAOMi(F8c3d`Tg*/-bNj]A7Y6%]A+ +j+u*3:=*'rd.,#"\\k\)64'ji68U(45->W%AT+u]A=C*2tJ*u!^,!sf+m\nsohe:gAPW#mCBF +RW&<^RTL]A=1Ou7>5h>.FqrJ8$-Q"M?_nume^7AZ-L-;C4k]Aof1&H2t&t_H@-fU'i+bUX;5>-D+J-BiFM)B +`9b&TWb2al;'+UhYIC+B_$F.pO%NVF*8Ie9ilpf?nuS*-qn&]A1 +^lu-2GquDne;;5!gO64HBg")*>p0RN50/%FT($V2RJ(:#rTj6uTHf83:M +m`b*4n@pb07HP>dE8`_Ecu<)+thBq&YWGj!GX2h80&HINB+W]A6&6)j"5RIt +4ZKk[/5>P/lQUO7mjH$L>'o,C)ac,Zo(@ +K&6UgQP39K+"^a%hoIA-BB;D6?`dB;9!$gLq;**kX>1q=.b/UW0NV<9)un8AY$JQL+]AKM!`f +"FSGZEH5iu1F.8S246n2:ktjK%HbWGI4=6k\^_DC>%`pW6!l`i_dsZUB&&++)'+1_=q(oIBi +U^a?Sp"P>ms^pN<+-b%`:O==7nGDLW`Ym;FVPhA=\dm)JTQUbRVc$]AbB('uC+'0+glFX0Kc` +0sjKO19_$mi9j%/E$=Ui2+/']AhW?kfn<>rE1o[DH)XNFU&hC<:C\0C,,-@g#-[9!Yr.!o8(6[$H2p`=*8G%Ij^ +JWGodMjK^:Z[JB3-Rtb_Jb5?g$`KY*1\LUoT:&%/AYht\ZaBoQ +Y3'j%9pD$c[T#")+l:TFI&jT_R`:Nu\EY0p-(KON`Z\!Tjak:_$AB((_\Ic44HBB]A0b^l2-J +]AkE2LZ=#*7F9IY&_cOf\O6RH$^I>DPa\".eQQS_gDcF`TM.EP>9>RN\-VuhBP)\gI*S)6@2f`4Ug%d7o;T'XY'eXTf5.2HO_,+KKT?N/CSl+;ienBoeAa6-e;!=` +CSQUbo0+uPM[PcrSl5;PY4aH1%-(PMpAV$-&K%ShSIr$1in`,_es)VoU$MYr$dGCC`6!0:MX +f)sQ=NP4cS(E'j[U_'3n.'Ue\n$DV!S$9IA&1-Bs+07/SOBAiV81!hb/VleoA<<>4),`RF@Ft%VfaBCaq"I:N,Z;mRDSoBDd]AEg%OZg/aY_"&;R7(li)g#Rt9XBD$Srk4;"s'SJQ/t9KpOM2Ua,-XhP]AhW +NLe.VbCbJ9pkW*r2k!k5+X#]Aa$;]A'_9`[=gOsO]AaO-=h*e,;A=9rD0TOV_^,pA*muc5Q0rCR +d81LjsIa!"1e.3r!0_\O[C&0^Y0%*I`BoGVr4_F>mP:I5I6'5Nd:Dk5/.$(j=UA_FO?MtC-EqVFal5oX=V*khI2FegN0&jk1EZ +.@ne`VDL0F/eXo0db9Dpr;1]AiD74T%Ih.YH_3&IPC5OoDK-s,po&rN6(c,Pt:e&nQK=B@Qua +.Rl6mEMtGYtM%iU#>XL]A"JKr03J,A".):q8[c\Tf.RD,oM% +nY_3em.0.H<6Ku@SYHCM)Z%bQs"Uo$SBL14PGtK4A54/3#oJ>4L$-K4FNY +Ek=N.#1u.KNIBsi7!<#U#NEtF4j?b+5Y0a#a"W_O,PTu1GX:;>E1.Sp6KF=QX>Ea!M^Iisfr +Z1\4T>.QKYLE)RibYCi_-Sd4.+$+c64HP&%1>(g +d6/MqG4^(*5H?A1l:ITBQmG;X:h#kjF[(ojCpSk8peL0N.faZ52:]A3N`d[bK"%-_lPQ'jeuj +_81g7Gafb#4+mT43lst\DSfOf[(=UEZ%1hc66gJ<(!)HdDagU5(4V@(`>o(eCjG;=KI)R9C/d#Y^\ckKa?3+V\#Ud[teK7glB'%[1)ZGno@DbC(SSE$@\S2E68;` +ToH-?6`hNnX;$gRg^b5a,dHn&]A5T-Qhh=mu +`8XDg3V345kDjI[PInH8tF546,?o">7Hd&+8PpFhDU1kIinV#DW_WA?)#K&?oh +fJk3NS`VHqMmP^dQVN/^V$9s6p>XG%t\,PGGdH/IWCmkjjT[__]A[lW9ElpoB\"*4kV*13Cr* +=p"`.)c1";(N>[+:A\7()KpGC)Kl@k(j6*]A!C*cLY8n'BX]AD%39^>':bWY6@RXR?W`6;`qI(WdO0eo@^II^I-V[&nnCDE?9Oh2d,EP;H3k#A +m-4V>DNXSedC2.B2+`3/saH%Gf2;4^'-iQ +R[=an]A&p?o +2cl?l,I2!j!9MdSPdfmY!@L5MC!$1[>ah@o9`158qnrU*d8_4g90ioOir5Q3=9g58BT365[M +IA-@g0Ap,O8b^t;GGE0_$9[:#*>g"O!Z(V!i*1SEJl&2Op10"ikcY@nZM.j>JcFT^G5dd +Z&3iWI\h"NJN1B_OLECt&2e_u!bgD[L@^O#7CTj'B22d8Rf:?QVYV(Tf.'&e,l"a6\jBU69e +DTlD"ZMof]A'6pL-sYcCjRXUXr?WrOu@g"B'ptFNMCi2OBI2,LW9W&&\uuRT>lVjpQgVLDnR: +&#GpnB?V_%Y'P-8OUh<(o-5!jjLL1FFLuR=qF5o'N$^+d#7A1jb*E*7S>MoK>!?t)qiO7kuc +kqS[f@U6s#=HXa`9uhrMP[]AmPc-C;s"&+b+15EJGJXC0dX=/:+lbd=\;^ISU"_8rHL1quQ-b +Qe`,n!7$o-U)T:'Q5]A\/"2d1sO530NN#^Z3pWRtf0*JR"NXCIV#*.1<9cKVnZF^0q)lL%gL3 +b.")@-20H0j.GS3S8]AV*P@\+@Ahu4aDp4+W/LdI9&F+"Wih=bmW"AX>KV(chp34b8c3uRnp4 +NW6<==%YoTa_eo_ekk9s^*4/^o.3T@Y*kCdX0gbQCLF,E+Y7SD+EZSOAqjg&.Cir=^jn-G!T +g=(=`Z'9ec1p7?>IQ&'/XocmIcD[ORg^;2u[gh-fr%fMle^>%D;lg^#dj,^9QPrL=XX-Ef,l(5V%E*;"?1CitT:Gb +SrB,mXfcYug?ZKZTJ*BWYR'nHm/gUYT40frc`-C[DW[o)e,LTW;Tg@\eNOQPJ:E"sHa5fh2Lp>Ze@Dap+;bESu +M#jj5Cp_RXDTPk`;DHEQ8/$3-*#;N9]A"H;(d&E<2>ZOW[O9 +:t8X6r*l:Np-L=K6@X,1"5?#;eY,Fk]A*H'PJ`[:S1OoE`M'l,]AukLA7FKQ5_dS>-4J?S52>W +>c9bhP;8U`(S"o397"^&p-?HRc`#L:2rEdUUFO6[/iaWh:ZM/.hF!B'We7eh&R_Y_mOmcL#M +IrEQqmg/`E"![6:\IA`%BP7!qq<1Q@j2_LUDqRZ7>4r;ZI)X)R5.D;>9`^S8!K""/BJ6AaYA +A7n-b.%T2F-D6,(2_HWI%E=dtC@#l$@Op_KRGsjG2Q#TH-Jod%Oo(EL>'l.[f"%8jp:U9:-h +d&fBK$83ErTSrh'GdNOTV>0g&L=XJ&F5\NYDN!"mToKbEW=N+F2750hbZ6Tg._^=0S-#BZ0^ +=?6sIRI#BpY-"oJ"(WF[lZi624lJOp95kF3&A0!A'SeQ:_t)bO)r<$rtD]A:f6>j"Z=J5Ol\?n%4&JH4C.MFBJIo*7efC8O.hD1S5iRn!ggf7>$S%5F?U2RR=@7b0Pu +gDp,sDFnO*Z$[Z[[@&QqSDCc*P`MC6"dLZ1l`]AHS +HB9+8R5%]Ai!K5i?teZ+Z:eM6W70]AR"YQCl4&<\"8I7jd?SZR7kK(G7HF3!5bbc-X+u1dMT9[ +jn;KN;46D\&>&`k4i/0NC$PRbN$Mrp[3lDV]AF+H=BF@]AEdUB_F'c2WFSoq"rDO[?s$2kLQQe +ajZ1^GA:@m(*3`00$g8/(IgeZ4RT9==<:V-_.'D<5BCH@M03Gm6jUd(SFK<0:i1\)q]AUBEj> +;cZ(O18g*($_3q6)en\nMcf$tm0l`^-uoSihAoedliCNeaMeq->F2C=sBiT8sHKhK$((;h[r +d9%68&_MK=[kkcc.-/O>/Qrc?jQ1o2V_k@cZ[ +\\WmPLZF"<]Aar9LJ$+R`^d\4T_,ZBc7cL@=juq--`=IY;>LTjkk +?@=[$7)EJ,]A*nKO.l863U3hMp-/.r%DlD8.E!]AKa,N^XPN2id=r&]A1b3HX]AXrHCf +A%93cZlQK%slE/>aA/Y2g.FQ6$0C_b.2oh=s=TbNp@9d(_`5R(l*QTrnfPYn,R]As0;WE:Jd0 +./XLJ%7TZJpXuCjo"Mt1fS"i@BUE@_Z,:HoM7uR!"o\(r&=hC)X&1;q^nHp`$.#cd1;N+leY +'8C9<8.laD:/AuWcijo$)jF)ZV4#qS\fi);5-)-Gf$:pk`4eR[i%RS3p*iCF?a@M>:[UqcO. +B[s4Y*F<3Vr&I%^;Ve/%,-?6mR#Pc,bE`(?bE9`Q4t3>*\]A$Shu;B8Z]Ag'DTC#1:Og_* +!GN&'b)RbCSf2,%7.j?$*'aa*ra?/1e;+OtR3M76*45$gCrO5s?[uVBW:#K:=L_Y>Khs02h? +i@f-OS5rmib&R9=q,35i/sGu-5=Y_>>A7F'V8N8?#;=Udo=ITnHUPL9o?blPputR15U@.^_ +<)?ej(hGJd0TRL)5T;ELI(R+K4uO78KXj693/_uX=_Mj^hY+8RRSJ!#.2>+nbFDZ6.<&A +rGg8-q*WcsZLsd#*j$dJ*5;_/`#*%/7DgaH(&=K^phpH[q9Gg-7-P0M3?!r=@[TD&/^m-Tce +[H*+MBO@dCTg=gLVoMY2-B4q9S70bDWh7QJ/1=4lL!DA%2jPqH9l!IBcF@;4'dsTSD/0XKO6 +&oK&+UB/,KEZPk=:R)oN@Y$MF#jd_8XfRgZJ+1]A$4OA;8q&@);,l(:qZ?a?Y@(LY/!SeNG]A]A%N&";B,)5SM1%Zco4,"O!QaPcMIP80gXTEt6"*'S4"HJ. +e#^qY&tgXX)b*q8T/feY#VgL8T(6F>Z'qj`V!5b30"'Z[+.C!&mZ]Ap4b'\q5fN693k`+=EgV9K_EW.m04''FTgE-Qp6QmTLs"jqWVQV +>,jXBMA`g_m=*/Qqf,/4k`"+m'BD!AKkn1;Vd?(."J"EMDM6b#A#JnB@$kS,>u)k6o+kl##* +nAXdnK07bojhl>64fUC/(LJX-PO:7@N5X.$=O^ht\2XR5$AYl?]Acq=QlAlfZ$beA6*uqDS<8 ++^Xp+\(%D'-6j*.jB`?=EGh2:'_(esu&7bp,)Zj>Kc5h##pe^a*"i@"N5D.!GN2/#LZ%$J]A% +'5-/eJA7S>6rBq`lG15$h"ZhPAUe"N)`-0Y$XG+Ag+J_#4RH/,TP-06Vk.S*FLPG1n=bu"+(P`(o7]Ap7C9oU2Rks_sYD5N'\Z4bAVDou&G"l`UEnci$lH@ +c;pV(cT/X7aB;ONC!J6R$EV%N(_84%1-M**pZrqf1rShl/T;28O3)#e:9g6Tt!nSVn!biKW$ +lQ?EtcSrFA9.Q2^3]A?N]Ad`N(\dA#%Iq92A7:gG@*r7D`YlqDI(")[^HhE[fc=g691KH>X]ASc +cZG_:Y6qpSQM1@KI@B(TAt1$6B;CC\SlWPpH8;t\=CTP14"%Vn`WEQ>%'uUT>>4dFF@8]A7AY +D<`D\rO1(04"SmNkPWqqIbl94_]A/rOQ%l4G7r?R0=Eg^8V#A"!(U(7VEZ^(gb1ielu$eU"#7&$6aprcdnUT9nO@@WO*SsM)NEc0) +TVJ14F!=Lpru6bBG0KXX1*;>YdPu5eaZ%T"3S+D^#dqO,U&+!7hgCbV!hXgIXaT)EWT/Eq-gYst_ZeWc!WQc"Taec+T@l+)UAbGt*3KG +;`DJjE#%M<2gMp[mJ@dim-,?C#=r=a\"$`Q2rq/J^Y0+?qocL,0m!i&skP2A`*`IFUUEZoQH +-E_2mWQK/LpYHY@SB%tq>,7PL4(;(hMYiqN;SIuUV]AG,l`1Ih!RiJEnbZ:]A7RW8=jeA`jFhm +Jr%"5$5/KWa:+0$+c^jBhcin&gqhoYq#`r@d!BGs#d/1)g*]AWl7.E^Vb74RoH\C0dRPqHQc) +-P^@OaciKr/SVgQ%?"/Dk`^h^lGH$NUeqRMGl^'Tb5u%si,'\&@?%<)iB:?auCG:%`R([U#`),?u1%u[r3q9JV[>Se=gs3p_7&Hn#g6>HMs&Gn;iD(F72u +Wn"A,sJDC`>\>-cRi8!'\&4L;\WM-&bYWdIQ/R#5M$\)1+EY8=[JWnkRK67#!kU*/t'LWHoe +!V3cCC'k*=a3FiTT-,)2Ja#p(m9\Zp^aaE7VS7tt/5dSZ&a!=]Am)*=%K!tS"^GI@GYd$TCCH +L07qA!gfm^#'IGbnr:j:B[or[IUpRhr2sV[QiQlaX7>ils\pG-i4Alh!(*K`<0H2ENJ;7^W3c!;ALN-6+:W*4?VK!c6;scech5-Okm\kL.`JcAZ +KUe`7Uf6JW=N1\A99eXR9s\f-ZJfg7;39+?3>.UKQR&ZU`\e&kNmVTi&4WI?-j*-r>e#0:Ub +9"1[pkAmLLgX0qa12EU'j*#M?@-#g4U^WC24_jbZ?qeEsf)f,[j`/r)!2j,j@oL*IPIUWhql +T`PP,O+$imiF]Auf75$F"@\ti1U3$(=hZ)*)YaN0GB..h?]Ag$B)FESi,^MPRO+L;aYR>!Nb=' +>)WqE(Yr`n7s$h?@T"jh*Xo)/GI!b(rThqR*cT8m]A)S<6k?BSghu>Xof)"#A4r +$9-1:klIX13MkUgcRZ6E/UKQ"'KSa$f\QIA1,p#P#P;@$]A[dZAI-e7Fh"gg)JEE\@!Y%>KV' +n]A-W3``THHZLgVYGDB7V3gq6T^9PbK7kDuk+mi_fWKYCgN&7E0L2cq8B:7695$o/G/LqmGV% +(R8PpkZi@H40]AcRiFQT5\]AW/d5flAeC&n'T1IpZ;H5nD@g;[^3I`g.Cr]AGdpK!OE\q$`Y%[s +Mm_5']A8CUMi0kC.n#@^c(2j73',d9O1'`hTm'"6Fma6_dZBVKRmka!%m:1U.&DA%aE2^84sQ +U+$AU"?/rL4<(KV2^B]A_E`_5(g.ND$s$_Xi`N=(6-DJ2XSe:QY$ShA=oX1d*M@d0"[1_@n*B +\cY'!,!_BW:i7&6V4/=oYn+O.2X_b$epJH&kuNPt9;nPZlmI.^fjoh%*X8NYj7kpb.$u(Srn +-W-aR3iks.6r::0$F;UGhpVi,FlUnafP#SDX7[PTgj`'uK#$]A(/mpPiOJ":'eYY!fn49Y]AVM)2q:^2n5\oo+W2*^5/S/`+7N/l>2*@bePA,gs/]A)qV8N+Zl[)9<^@a:DfS:Q(P>%Yu4ib5A:9l$X^Y/NqLZ>hNMr;e +,pkqbkrG[01-sN#P;6VJOG6VDP$/a;rY` +%E%'[j*r;Ic$m$IrrjW_3kt/&,R3;!h/<#b_]A?K2^l?*KRAc+.*R5&*H))VFD*s9b1_3D[QcX#fG)I7/>4`c#H"!'jJ>4)Kd:Odq?2SatL +\"nJL9u5"j6CFDtXM11_iqP"-7rpG\4<&JZ4g[ob>\q069$%uEu#5 +mL-:W/C<>sCn?X^/F]A4Fd;8*Cp`6'1hk_O%nf1,hnG%t'-cFQAnBULs4QjUNPU#j\#A,aN3[ +i#L6B&bPNAceA`+:"`*6!,b?l2DYE2i`DUPeYmV`/U(H7!"l!QV`2'mW]ABFR6jYU]AOVD>N`% +eG1oo4lRN$[=Ms0.gP(k4VrSdN1Jqg/%EIJ=)7nd6BnekY;0;Ff[D=hKd;Ks>";m@">8.iH- +?$c/3fH,^Dr\"Z,#7^UA[5s?6Pgip_W>kTOo4/f^=#\> +cS\MUHldg[rPP;8n@$mUBE'%IDo6U(T%=lB +dg`FSXi52*S->:IuT&tOgRka:J8*B9R,"=oHIZXQct0o-afEaM)0e%Ue]A8@ND +8[MGj.i\ +!Q)9bZmr=\-0HfUH?KgB1?r6N?\",KC&GI+j,(&JN:S2roN'BuW\P:'tBF4LU%*"lg&s0MU1 +XusIlWtq-4"l1nN%5(;8NQ.F=XN;lNMlSWuIJ6cKh5&X+I/-4CokjFpNF9hW9CjJCfBSgNm>a.V]As)Pbr0A[D8kJ7/g.^>h*7d<_A3r!A: +eQG;5)eeF&0J3R6-b/tHls0k=SHfMW-*!HQ/%BNJd&=^nIRmNs8JF*S/t5>[YG-aE,F(kh=N +2KrF^S)k[mlscdXmZbrg/91,%g]AEr\FLF'4&=`n*Fa6D$-gOl%dM[<(bi&L8oN>et-n^#UkY +Sf!HmNg)/V:rTJO>4%!>4cuf5Ls.A5``Q(g0@`X`LX=8K*T_3NFYsgH'5FL[/Ff_%L958'N$ +'QD7G?-_5Cq2UCDmgZ-=/qik.uFs1*OOl:F_$!+U;;CdI+o<3D0=@?ga>!C4KK.3SIb$h9?a +DP2h!QrlTB\>mJ:Dd0#ES.']AB,p8Y-#G;-)#0D3N8P)39d@&n;]A[$ +)jG"t>"F]ADT^k"cBX.Nkr`?SXH^u`+%6?(X3@@NMn/%XRA,fhc\He_4e!Zra,E=R6:b7;Q4B +jdhgK[(>0%b>?[iUC!ZA$a/9tNab;\PEc@,]AmhC07$E.r<#R>hX4eB;4)6IlU]A1a<77nPC3/ +FNR:Zc.A\`IhIKe26DUGUFC`WV?=K.5YL*iS`i+p_l??5KNXY1E"ALnK12km$B@QgV/;0<5W +@i9KUqhJ/+!;X(aKG3R^=q"A:^#/sRTu`>:[%:=,^qV`8#j'2.k_=:KD!ti#o0*l$l^mb*od +GcGO@\PFnJX5Ss`8`5i9(6L)<)uWu'49+7rJN/2-2,,q)up`mJ:FcOn,cp23LO2(`ffja;Mb +K)shG)o`@uaneu![FqO!'"b#_l7R-V'[DQ]A6!aJp"]AA'Y.-Sg4:ejjPd%0qU6Cb.A`@A)9j[ +Kal3=2N*g=!XubHj*e"%s*4@kB!hFh,8eE6b&Pc<,.G5hJ$*nL.Y[7)f;l(sEW[1eq6.qn\)9oI(OZ`s6*Zhm-NCQXPI +G1-Xj1FHt^JZX4nm_iJp[slQ2RG(fnD<1;P9XUQ;e"m6VOAu.mpL:2R@IVl?t(C" +:7.=YajZk$iN]AYb2VIH"@[/S7,OlK]AGo\!Z%ZLWNn"kA7VZ3u/(hj1k*tS?E:+no(hNq!Y"J +GE(8te_XL?bh1TH\PD-dYW7#)iRN:6+o4eWP?$q/8-bgUit1bE2VFh8;A5n7(tiR +0(LcZaJp($jJ +iE%RLB]AY1B>7ojG<5eT_<Z8Ql&c4C27eVQ$SCJo[SH`L-UQAb`<4J$D\ad1Xi`2IGHe)%0 +bqiBXK?a-EpU%YDAb)ajqk+4H@0#OQ=-$!.0N-MRC*?.1Bd'$DY^V\YcGn>]AQ61X*<&8B5H7=.IU+g?%dueS^.B4sV*>]AF"Gn2GC%IO)tb6$a``k;B6VHRt:r2h1SYXAid9+ICCu/*+]A&=WH\uWOq[/e2/";HnD5:[mi(ALHS`Gg!m +h#1JGc!8!eO1*7n,@NirK=`X6ce`+m$HK\AYe"d%f$G:"g$oNQ,.8(K@5leS>2"3`HWfRgg) +V5?dib-D@ZHE\b9qA%gU?`@eCYp/VMhY<7UKg5k6i.j%j.+.[_Q,0^H:skX(!4L>n2b_Parh +erRIQfPT$IgD0nr$?0;mXVdV6Gj;(4CR*I04M.A*`V`J2:m-4P.p"a/+hmE>r9m6*k]AQQ^Bg +c>h/I#8,iP/N#2m6l%B(s?P"FQ4T_m+lgok#GG$g"DfjBWWo!PC\%G>2[A#A"kopCam!?>:Q +$ca.@VU)mSZ@a'q(Mb&Q+CC0S,]ApEI3GO6@tcOW&J5XaI"W-L +[uA$AW=fWB$@U\MArnFSb#3FHfaKR,PF?QQ2TO%^);r=Ou@5U4Xcr7`MqIAdj"%+Z(eQtH0> +tX +tVq#FERDV=!7sKehebMDG$HRJ6/+0WD"L7a"[/#TATAU^Ie#Kli,'\R5-^gXU#NC2h/@FL#\62sT`>1(S:?h1LASUlJ +NlaZ)kaf*ID5t9\n+2.<:?tAO3e7r<;]A]AhnQ"%f*td4qbZ07>(]A.qJ;*hZ.+V2L.Q$Ql"5CB +Q5obM=I2,:<(:@)pQ8eeNiVF6(d#>n[YQ(? +c-dajK@F$:u:L?*&216RRkRdTt.*3JJnhOg;l"NX_$'):V/.@ddBil2Dk"bU<@PNt:K/_(1F +"AW3fG%]A=q+6rLp@hoDp/aJU;$Uo`L7D`;,7K@H+Y^',9q&7i#Q9M"EP;3__./DDLhVbo^-m +lolZ+!(iXL&'knpNSe!)hk^7W^-cH@_%6*m+662fF_KGP1Dn^'K!j*[IAl%XQ3E)X>ens6d_\/j'fgoZZ[tAQSFZ +B6RAq0\A;E=.`=Ln5e#ga\qOL=.XaidZ!"PcoOUSBFrWR]A`2#[2oBXp]Al<2jiMqhZ6X7.u^5;k]A(E:'t0&G`/O8O8NODIG:)biNjBA3T'*G<_R/_Gsaj$!C0 +P+O`?c*)#EWFkdS-5gb=__?^4o=^'+B(IC`$]AH[hp:f.4CnelmPsT8KB +oQji_B2@0rnBX)'Gk4o&:[Do'OSI>mN:WN+`"\M-,2OP8[k-kJ#\ibBQ6HOf`&'bRNV"MB@7 +F*3N4"T^W`8/-ucor`a>?$oYS&HPX\n.RXKdiPt;pQK_stM!Jg']AtdRa!KpWnHjqQA05&1#3 +r9e2hu!f%D[U!(-/)Aqc11"qs/:KB@QF\u"dA]AhF.fJ_0%"`E.rnhKEbfdc:r2%qZ7mQ/9M" +4C'Cj6tdFJM2PlNYbZm#Mo's3%[:/MVOI;m-A5>;o8^;km>B5OOFaV8-m_Fd5'KC" +Vj^:$o[$8^K.i"Me>UVHHD)O6e@hWqma$0GCF@D5Uh`!jH7R0eb6B#MkgM]Ai(ZUaa0l)Q5UO`!?d7o0hO+hbr=4)Ja*3) +H+6XE.EU=dYgrpfk-e5Hd2W[=Q6;iRZSI(7Ko1bkt\+es;@5@WoXB'`d;PYMnj9^T]AlA6erA +8n)id,?D8"+iX@]AJe`^opNH(^_k\B/eU3R\Nb[^SL`\9i"IS*j(!0_k +!3 +FQ$A-H98/ro.QZTaQf8^!6kLjj+2EEiSOSLd(L.%$Nril%,$;T,;&#'ktTl/YfOMJ1&!g8B) +en4so^Ha&hBc,6$LlZBGG6UMI5=o3UO%e^e$h_!#@.-OnaS`+nm0EL(.H-Z7h_+UhBXr''UU9&@f_` +=&bm)&dL+?0o[$+7)n)jqFih5.o +4BOnCZ-#%KXX(?H&"mtu,4+YW^HBKV@jQ_CH^.a5?fK&+2Q^[JTAEg9@k"AHQpf=5C"O3,<< +ej`gYXru"B\)Wr49,pQWL`[rSBp4S!0`*6V2s/'QYe%uC;dY\G^=eTl"e%SY45MB7`6kjGhk ++>/>YSOB%lTkT9V6b_kJu?$s17agn[UaJ1T`UM=DQK*ZGqje;D7ojF-V,Lqs,'RIr"P?(jll +U>YSI&TABB$>Nkbd"F,J$l.;=UVB?scoi3,tg`)bt6r/4.]A+G`)+Ln;*%BAG\MZ.M1>4E%/$ +iX&hH8Hj+e4A;BqT/HdV]ARcD+b_'OFQcg.D+\i(^Fb?)&hi+^q:LdHCL+;tr7%]ArHZ)5`6!0 ++f;.iF5^01]A^.qgq1_P<8386K-n]ARpde@td[2Y7#jW%79HWe(]AlrXSQ\.q@irbA*YI3qjC8= +PgJ>`"&L6G_pqfPG*,W0?d^8cMqPU0pn^$g"dl3u]Ai'#gVC+W@D`^Pfm8P93"*fiNi\Y$X3#gQ_5]Aj5g*"seX,apO*+$2($/^RC4jr1If>b7!2k1-`@F,!bH5KG49 +o5/P01Osp7kQY+YI,o]ATsn<19_n7+"?VT19A2-__nM+>bNEkUU4=9+-DG;Y>; +0^j]A`"c:Ck[+98>uqWX*FVJDk5L5)_iQ=S2?!1Q/T==qXR`n*;#!_dAq%An"'-p0V61`WhG^u$:VB_Hk7O3_m]Ar_9.E]A-tMT^N%lME]AkatDN7]Atgj@7D\oMnZWuIc+/7-.& +[fW';&Ei;cHqnW/JK^B2Lo-DEu'Bat&)MnuJ>g/C&Tc4@?MR3oadU:[B?K)rMH*LNomb,<]As +]AD`,b"Trl+M]AfQE_SF2HL>)3VJN:m>nBSBp'mefA.)om>nC +eO?ac)mKaJ&4<@jl+BcX_2oXSor0*upM;aj(S>$i#:j<) +FN]A02"[ES2\H-DcM'nlB+P*:u.9s-OrF\Qu\:]AW<\4aaT>8,>SUCqs3\&a9ca_);H/C"&.4p +PlM>HaE"LWFA7=9.'`j$sF!V4V]A>-m]Am=mCja0)l((8nf45+VhN3CdCL]AL&_&,K)kPa+'^Q" +?Ch'j^,%pT**/tTUuG^Ad/ULDG!b!>HGOerqHSV'@QV2&?*#g>nO5YC6==*+pF'DM-&*BoM/ +**F^mn-F`UR5ed0r'k/>*\GZ4[#@r<7MHA;%ldXNTsoUBT/j;j89eg8KYfZQVp+lpjEV??od +PX@,.aUrS-VWRLEnPcVmVRX>^q2hDOJAW1o-ofe$q'_Y\'ZD)"/J=2_U[!mnGD@V$hKMs!_"6\\"c:*VcZKU6D^ +"[[Hkp_16VSE5+s++j!J9J)V&=FVJ,O;=XP^lY\.MVo+Aj!ds7*/Q>hB,89AZO4:kjH(3b$*8NF;C&&dG(SBN[rS4bh7#60>&=k +I6j`BNPM>RVrJ=5QEpkA(rY4)&]Aga+Jk@0R7b25!e3L`IJL?4*Z0$Sf.t!Q*h5o``IClcjRP +u2H&)89GCj%1/mOJ9LNA%Q3//+.-,<[XtGD2W.^!99G;2=2Ea-c6Y&f$XuU$GFg_ma'VXJn2 +_aeJ9h2#8[YR]A+)iN?rEA7KmATIq!!p=jIhM7K3g8C8]AD.-j;S>g9YNdS;^RXk^(u%KT73tc +1_.IcO1C<%M0&n]A:peaE3+bsQNEX"!h1SQF[5'W(=sQN@J]A*X6M^@O1Q>[qj28'*W%*Ns3Pe +/fiom'i[7EmI*ng.#.ua-%[$1fa_>0\Tj20N$Su\)cI]AuN[kps7$WYE96G(2sdP'n#`"TdHu +,;"FJUG%-Y@cG>o5bY0)^r0R'3U9Sf-.sBNZ?6u&WW4n'M"d3S;mq9U5gkf<%L#5;aR$W]A"U +Gt`g#m/O0_%]A0R+uFBT(.[ra6Y^IJc+e(RN'Dfb[d>reV>.^l*9 +A6g0V"_<%-MTuRae;0k`B\/L:Km]A0;)mDh=dVH.MN+-/ulW5LQ;Pn%^.c$&FRDpl"TLnm48< +hu-WP-"W'J+Hc4Z;m6+H`+W9BOEr9iITo]AMIU3^:.=m?hIp!;))e8m,Nph"u_a$Yq7pij>gL +`Zuq[*b/h@%.dMn-HgdY7&h/bWck!I"ALB8)51_\j9RuonqeF`aG<(2LEA1 +J'3@\sl3r!?NZ+VF84.+=Ltp$Q_Vu;5 +.I!4smY;85[!iP]Al,&bG%V7M$\R]A^4=lsd/XD'*EMP(:GZb;R&-_o"J@>fOcR!0hO@@-)DV)NF="bT.G]AueWIAdHJa%Uc +h87rY_FWI8iK).@,2X'9jpSdoC/KMo:R.kcP1=(,j-MDKK'pYr/WQ=\NRV^4g^6L0@iV]A)-d +?^]A[YdIj2R*Gqp'bVF_NF$Ep)b[gUBmuXUXhff=A^Kt+%a?\L`).eb&.e&MLqQZG6Qi>iu`< +jl$55.ok)OpZQ?F`E$A;EH:N)>Gi&&Liuhs_?%L)YKdCqT6.Uh.% +C#?t8i&@\525N&f-YltT@T1'J^iIYea%?gKNSmNJRd_=#>9g)`6o8$'oS\>Pd"%#)6jRQI#/ +qE%c6t7:>oH"SiQ7\K]A6=rR,+E\rWqLV/-Zi4F]ALQXO`T&[urr-2Xp;m#(L$F4F.Lpg\hF;X\#Qg@Bm3\^ +?K;Q-Gl,%H!g_VMY4FE*'Iel'[e\4V48AeSQX`=;$F8it)L"2c!I^_'>'cdp)H@,]A@9U#?/b +Qfi8Q.AIh0Vk&WM5"k[pUK"Ts%faaNL_5!09-25_1d,=!012A:s:eF\o5%Gc^Eb;23[7A@D# +(re?DR)6!!c>5L+sh<5nAn[_D'i35>^dd&/$#PqW!lBkq30]AZje"'7@!W6VhZT\s^=MeRJ5g +se;qK9dqu=$F^18!I:Z?\:@O:*b**r';H%_qgUa<%=5*t*2+Bmhg7Q>=69;peskD/B$frYH< +B>Y:UN4p))h9)j%m7/g'pEnoTnCX[Yc7mTQnP\>qI)O2e/",%8)bWj"V"(RIl.91R4BV3Nc) +=huik3oVK;cn,R]AH^eqmmkPGj)7o*4apLOg.!W#NW\%h39n'FdpDCr$HB,BKGW5N^#OJ-q-; +hp1qX*9qf3O+sFgEP,uSuKu3gQg"spp[jP3R1m-*iA.k2Z +qZ,VLjF9aH@n7@#F#o:J`Wek3/k?'!c5eVf7=Q3/mcUO7h/nQCVok +4(?Mphr1G[:dQ4]A%[]A%\s8!L;bP(R&aZSApQoGMCmF:e+k@&W3LkA8A8*dMj&+@jScjaIP"m +-mNmAPtpJOaC6Uq]A*(lTJ,Z@rV'6*mWDmfmH!3nP[ha;,BkKUMht)'!Rp<.2X.>_(5bHGl$! +Kq6M.-]AD+rV.bW.F"is#b[J9b9a;uCq!Bf*Ia^Fo;F>^p7gY#pSd+mF#n%+S<"^0!)Ar_e%B +P>X&TeA`4Dln`uZ+>1h#6FJq:,T5]A5%F@?%/0ROX?3*%'Lebj,r')$7kj[-gg!:'$3ltR/?%0b6X1*0HhaN]A1&,R?fKkoRoSZu).!%p +dWaY%lmNKROQr[K+8IC+dHCZCK*0^g'+Ze-5D`Vp,JN-.;.'dO^aGsFibK"fjRj-f_!A7f]A]A +Y!:2]A@R7LHCRS)T=k.]AT91^H7YNC[&85:a.[,n\B*nOmGOn+ZUgFmKgb6:5%Dn_cGF2oFDu\ +>?[&bKHT[bOQ[#iF2:*\d +7P]AmgpabNHUJ?_2@3m0r%uL*WW^WdL;F+0pZM%_8l!cY#q/J2-Q>@\a"?6##/CW"n<"p)`0# +ueJaO"f:LgnnXM3;,sDb_GpUVka=S:OeI0^7Bh8Zn"_E?f_';@:hb5 +#N2(\pb6$+VJtGr70TXbhJ@IOt;JIc9M3]A$VUTYa:m'ZqbD9N[9"ZL(9XLFkA?q$:)N#%TZn*WcbS2 +j5fqbZi4YK)Z(^COaSch"R>;U7/Ka!hT`l?%@Rs6lLm%&gb16GHd`bYblmf3ei&Dd:D8sPq9./t;S8%sdUmiC8Mu>@< +5X]AnJG^+0i2t]Ai!e=IoB9S'QsoQ$@FSGRCbe@ldR.SC@enFeG^oT33$P&\i(%Z*!rckeO&gT +D/6K^:5k!F7X#DA5e##iEiQ96bib>&7o2fL7V$qf.p^Ls,lT0D@&iF_1I6N6sT0mi$Huu>CJ +3A+LX_n6P9]A_)sVZO7fi2^&ap\T0M>4hI;8^A:R*eK2-39hJ2 +-Z#Yhh9,pbiZmV,=("Y$YI3Q7dc'9`jSi\1q_]A12ni8`E.%/nOeki('j<0>.&eD`^i(`:%!]A +Fq^O5gj_^)%!%1MfHR/IPY[24PCceaM?nY!o]Aah0H)Kt2[X9BmJ)M^?ft/>PZ]A3S0)b>o&*J +`@7/9M(DABCX3q/gIOpEJiZM:W_>W.n_7bVPM^E&ts-;4JlAF?]A`AbBRg^<:3LRc]A%/,M)[t +eD!RtWJ_(?IAc9HbPIutlN3$.bJ!:\2TN4=ZkTAfl!'$+OR:f(`q7*h/`,:_Gn$$6K3"4E+G_.U-@m8LiN?Fn"q?R:4XGr:O_aWd5%;Kdh+rk*Y,k=]ABk_9iYXd'lPGsh1p#t^V +i)D5Zp+!-n"md-BbY=(9CK9#p@4c*:Qj4:']AHaOA$)[h_/&G$tUCrSso<25J&';J$Xk?\5,h,mkOA2&XC]A +uCD7eVEq=R:oC."5QD\6FY^":1#%$`D<.RpZI($#6<@)F<#W5mJ.9fgNjd0,PUcgmEri/JFC +8o#[SJ]AMim8<8uAY(Ra@e8^hRo4i$X07`tSAmAe"$RkHUq10%O+=L>A+fYd8EPhQ%QQ%9ME% +4/\rb9D&X.3]A@Z:cbG&(VrqI\WC^35rcP;R5K50G*fNi'PR7M]AQsuerlEH-Hh;7OGi%Ed;-#f?G:ei#!X"'L,A\as06bhi,McKg*Sb.&jd& +@Rq?sW,U@rrPacu;$IrNX0;eJ=BJsb<)iVTBgZm&KZDqJ=[O#(if27s`o\TK/qq'P23sPqn& +nEOY4RD7TN(7s_flauT[?MmI0).<^l@Ch[/;tEcJF7u>I@I=dkEjd*^@Fb;-E:lO-g);qqs`L&#E8GGfkcu/PtaGfNq$?nY==0A:aYsKTl3Ib/>/'Y3$B +G2#g@+fbO^;*T7i60VM8T/'h.CQHcqmIuk0l*e*l-U$[3hRAX^oIp0W/C]A#%IpiG$]An_k.N74[+qR%<6]A9+H)DHO5@KdZ:j";=Qu39g +;WBm^@*[2JqV*8mb'4oH_kLTOM52[+Zf:@Mb7NO=,"@!9rjGUW/EA9Y4GX.p6t[bm&^3L=5u +k@=:[B.b7ZFuA^03>8UbH3fRKqd7RkRtc96r!H)?4Gb\3/PTD#3d@s1#P%5p77c-o+9^BrJY +10T_ncU\gW(5J#q#25Bm(oDkC6J-Bs2rgk9rKjWE4aJd6d`Z +*]AD4G)m4,\Vg\Epb04Wm!b)\?I%l_`>W$oZpJ`7NW"e$mAfV +Uodc)?[._Jb9K\)*.0rMZ+Dj>ESEGc"^4s0W?/ki]A5i,L?dmOL.q4J-nZF.a!qlSiVqF.KKC4^ +V05]AY+*pS&4f$R]Ae59a-mSF,W5??o@oj^pNFu![-Lg>r[Dnp]AJ?AZjKT_> +q[N(;mo`L#Yr<(I?=2L;I$Cpq@&8n(pi79E0S=]Ak"M\+#lQ1ds&nXSn.7%e,uCdTiIGH'!Ed +inEP,H^E5i&:gghb*AWFP-,E_Rjc6_>/>UjKE6=DMK$3XK6^W2eE"'nTAo8fs_hpV>^fPpYH +B;3`'8.^ro0]A`PVk/_BZ%p6)1Cf)RUXBI9J@&(X-*>`!or/Zs*/2ILLRNildcTh?4\ZfGU4Z +j6'[^I_?:$=O?$OZ_jTh"9RNF?OVH`i&:ggheZ6;$fF`>*q#UY&@8_e4I?LpdY.rR*C?7O)N +5*#_n+q7E*6+In,3JRaX:OGo13!CkdJUr_)>O+T>VIYi6WDd;3G$b%XU>I!mag\$ ++&*t`Af=jc=(RA54?$HqhS$-[\TP$0VI"'K-Mm3#h*qXF"OM%K5g^_<-KSI5\8@;R+`qCr]A/ +]A(97e8'+)poUk2W&eO[App!(1iLZV*=eiujr=ingQm#-HrIL&T:'#ktn$l(Tq,t76\ZicboaKEq=&q[V#K7YD@dCgq:T;JE`%FD*,e`%/(ZG'c.4_CMg=5gf'osjY-Ak\[uNp2IF@lf$%I;'_I? +L6XRRuB3[Eaqm4V^,l085MXB_FjT14fm'@cQCUY/?pcsO-FLeWaG!(IQH'OZqb1rUrVFXgS +;-9)D4QV$9TSj5q2-)X1=sS(Umt+K97UXh(#U^^S8B,WTAY+HDg2RD<:Ictp:m'A\Q$4s1Rg +t(#o9$7i>mf2Lit726#"UtD5!'[FRY@t]AXm#*<6r/"G\p@(Ie*g(`h\>j6/&AFDd>,7os+\S +:0?/?u0;)pM"F[k-Uc*^YQZpY?6JZ,3BXZiM9u"XDH_*K0YSWQl-$V@nd:8<8i*PKa6:$b".M!W\F)8iquAs/d +ZuC*lf1K#.9LN`U>TiPUHG=4J.o2>+$.X^W41oK-*V6ADusB>A"9dE@gnPMm3%Lcjm$HOIE/ +Y\2_^Fj%b`@gZo7F>JW=1]ACD?5AmVR0@.7\+4>oW.7\NcgLE\D\qk&;2&`n]A`]Af.*[uK\sII+I^7=NBT!kU/]An_2:Nq[@ +r/`sdD*JAV'*jq(TP2]APV4(Ra-3gQbKZfmNM=]AC$?:0HQ4OdaXKLh:pO7qHJOnpC[:\ag!"]A +:\KjtmnCGsReJT4naH"8B(100g#kdJ@Ac'RPlu:CCT0T-ornYnH6;R5X2jjVp>EU6.\-7L+> +.!&_2gf#`:UN_in@tO\Gj/g>kW%e/m@+go2cF[dT&FiJ'APMI]AjF"=Aj_J/qOj?(j<5WjiiN:Q344"A$$_@;e/hF2/>CmqsT"Wap5;WX^8\1]ARK=_eQB6EI:;-;*)ElBV8\#XA +X.gF=MBpnM-8"[*`Gj@,PZ0om\Q?7fRQj!Bjpg**^]AC8.oTh(K<-&k_Xgk*)9Oc[T4O`Z=i% +;JY7"[3(QiIdpLnKOV4Ir`A(Lho3Tm]A8e6 +9`?[J)W.93B+TKDc0-,16?f&-=M@I[h\>j6/&AF,DS`'q]A.nfUm:c7'+Y%@2Gi6QLrY2H5HN +Wfl"dkkV>K$7e6$[r?$JW$u6,fUd?$7fk./l$foVE`]ABRd2qrPg#)=nFW'Y$DQnh(pZ^:Y,0 +[+>7Qj`TE_-qT5U.lt=.<4q7b@hdrEErZ7P[nE3a.2[+ZfAFT2/]AbI`I_\(,*!$aWK!!U,g- +iPMRP"l6SDZOUFJhQ'c@-;oFq\-dAF5bf"3c0rp,J*Pm@Hsgj&#$%"02+MTq"8_>Thhfi<([ +s1('un`[;t?bi^e#(\672q;cN]A^XYIi7_n/6Jt&db6^!nDj@:0]AerT1 +0ORE2/<=_8e&%Y4U)7)*]ApA"P?M%!P'RF`r-Jj$lmKpUbo4j16K;]AgOLCQ3Uf!oD'#TZfFgt +t-$SMC^:MBF(>h+glhqEY]A?+C>I<5?O;^gl'8\9_!]AY5N#F(G0OCH#$Bh@-o)>>#9sTFr/rJ +&\+D(bcYs\(fFRl_BWN+Z3F?u;T_P7lmp/rl#_h+1jnE%5)+N9:je>3L.\SJ;O3C_IQ?Pd## +I=`^So4]A-PFA;_U1akS8]AFgK-gnjdSKL#C]A!2/KFBc7oHBffK=_3pIMrY(l4A=`))1/X!GhT +n#U]AN`Y5%VHa?1N;%At>9E!F0`NWqD4Kb<&9I%.kUDpj]A"p2;qX=HVLee$9/5rPN:jBS/q58 +$D16HJK;19nD32'E!0(HG#gAB=qGj'/]A]A;`.IWc_%::Z`h&b)`9g]AZACWdnY'_3)oYVIO+?U +:S*dnfqcbCM3jnoU8[A>SNgX+EK7^ofBF-k1gg5R2lk1kGI#<(sWP9oqmW339=-bk%tc%Sqb +3PsLNYJ)L#a#U!K%tL@7YPe>Jn='KoD_h*AZHiX4^P@r]AF.l1:R'*=e8`,4`mCs6)S-EgO]Ao +PCC,dut,-do+0/qPHr)Unp<,*k4u%UHb%ok^J8fe]A9:i2>iY&3bQFh;+igI6S$j/iA,NN?;r +53#\Y.=HqrD'4D6eJiJ?+JPM4qL-OdkVJL=Qn`+W5^H#rp4?WY$J:GQ`R.'c^+%<91=82hdjO>dPebi*l*9/Y/WoRp>WjEYJp=\lYsZFmJ,Ao1)0A*# +gd8224:/Cg;c@*A5NPc&hl`@0#$1rC[=??95dn#I^KC2^1<@qZZi;J(8+rRVhaD +/%-1Go:^F/VTIMLcef0[#CaMX[m+sZFbr#4''['U_02%9XNbCROf!u6<@F8%4nqb7>qr>kn6 +59O,i"4<:bL_W'Bs*cUF27Fc7IODuo*Y:Mbct^t-!a9;eGH4_WkoHYpka;Le.Id4HK:b9Fi_ +pqeaHZokP=pP[9CKj#,r77=h$\_N9/d!d!@P=Tij#cKF_k_sJ<`3fL;qc%TJHXV^k>cX5l+D#lj2BY_L!"EUC]Ag/q +HYRd,RTY(10V1kIiA]A*p0G59eILP&`TKJ;<47#kh"YFNY9gDasim-R"dr.fAgLdbe@X":Q1! +>]A-JqJ!AIRI8Or"f(a7@a6("'-rV:gEKNFm$oeZ!XSM$HTKDT;',%T,i!9BRSR4c"e.EsAok +oFr4nBM]AE#UdGQl1&TYDI!rmDDm/4BtW3_KX.>p;(L;qO#N(%@cQa![JW'`7f%6WCc$R@)s8+Y +fi%*h@>cdh1i5@&hJA/*R)$'Q@K1$&"9R+?)SV1G;JM<[4o +.BTH5IpR>$CWV$h;Idc7_^;U_6BcP!<6hbb;hS2b^? +77W#9WNX+BH--n\NBb(&kqkRE/4HVY+c:/R9;T.P[D6bJOIZJ+=:59nD1\(AtNd%:1Kp+)gP +Z(W2qI\-!d?!e;Z^`jW]AOChS82M7nhP]A)2_6r'hf&rs.oChS0NG'`W'ci2uuS\J_sLU#d81e!T9-eI=H"Ff^QY4NNt!l) +i_=DPo[5NO5pe4P3s:_7IC"am:^MU9l3jMJdAi!\k"_(TS."gYUS_hO-midn]A`6ra\5(^," +?.W/E"NHP@S#D&A2+N"d7(a7kS6(8=7J]A/BoJ:qeBf>A@j:KKJIZV&4./R%r[B&7[>!'dH"< +3F\BXi>%$48+54:0oPb5OpMj03eL8S%qgq`/k$EXb/OtBWrI([=^Di@p%2%4riO&F>[nn*IFFU_=U#.bRHn`/00Y/J_Gc?2K1$CcNC/Bid]AHZDNm_XhjM> +6D=\"ULC"!N$`h[]A(k)F(A@Rq=GN4`J_!,(56dil2N=1tK[)gj`'(e8-HK#XV$JKn7\[\:^M +nAl"fZ)2(-a7;]A@Go+bn=,!]A@m_ZBt]A5ZlK12LeFK[]A ++9Nn_f>3A_pXM^VrU\KkO3R3LghdXP8cK77,"=J_Fk1?HbKBJ_*Z&!b`\[`W!Y(s[-rk$.;1 +B[3\!i'ZqY.P*gP097:F]A51Wi.7O"jAWcct3J?JOOH")hC]AQ +H34BQj`39O]A8+^93A!9]AC4rNck('["snWT(>57d[VIK87>Lu87;;]A3;Rl$.^tZ(!JX/asfmEpkkJ5P#(\[_$n900ZB[aqWV\8 +?\i2?KhZ@^uY\(utk>`#+s#@-BqG\dh.kkDlhh$q,m(4kE_pkEt. +YHC9p59Bt:3N-Yj_WnXUr;Dp#d+D.sQ\YMI*W$#TKWVXqXPF2(B-(4`ha;(e"9Eo_K#:$5%[ +FnDYCN,-'[`6kU+JZAGWTB3.YJ72L`!0I@W$aP\l!)F3nepWRT"s8_D9>>3X<"Z]AN^nF.g9" +NhkJO59S-Vh?@`*kLECpIMjH&Ih&dQ[KkR^ti0$BH3(^^16#3&tMjUXdrkSf=HQAi8HE(a$! +h*m!#-3S]Ab5cYeU8hK);gVrOSg]Al\S(lomLAjWJ+b_a!pt^DrmF\^UM_G="^4:7Ah&lEgV5< ++94)[OX[QK-f^deAF[Hdhk?6VG1>CR^EW>*]AY;*DI-NARdW`Tu0l??co*eBb\0G@\M;;3&e9 +7C`5T7odgH)Z5!EG&4(a_ +*Pn\#A]A)M>GkmWV`G*s`iDf*s!e-Y%SGQ3Q$&plFPf"$!* +&6(c&U6hXG<((Nr,@f1l>T6]AZ+GT5jSRkYEUrOJd.CF3K&aUWGZ">).DbHp[$4mP/m;_NiQlQlh4?]A@nIl0p'jMEq(W5g!Y'_Nfpo3fgGA!_GUC./V>9,EERp2#&NoT`C-T<_c39KObK$h2? +bbn8mC@b"(16buXEMj`MLC4_K>"I%@d8]A,pM#D_OY^*4DAHFT/dA;N)S\,5D?8<_ +j#*HHs87S5PoPI$SI/cm6'#WNeV>io`ST(qm7?8#C[YCkI0,_6[X9ofN]A`t8`8>Fpgn?f`U. +m*L3*JT)so4SNs=I\q/@&I!=%iH5h=?PAl-c')!3X5jRG!248gI#Z>*.l]AGp`1V.Zn@+qs0&XSrf +l-$``kQd2(GRA+Hg\%_XTGe;U2,D5iX$P>XX`.K58rd(th(dL4%Mcs'Vd6R7=>fdZj4D(:e='J1)K1;O7-Y^d&bg8Ekc*>_g(m.!) +T74G%UW*NR:H=P>t'YK]A@\=Is$[>Ya1mY@[PEIa*RX8,d^8q#)!Dq7#q.no(>]A0!B8b#?;*& +8nGk=R0(-A*;EZQ6[60$(>Mi--.Z&.J0A,)>TP+.FiASJp#jt*ZOlA,9C[#HgMl\.+G]AoSL< +si&_2C<4Nm#pN.EG')+&@'gY@bR[P>3_cJLbO1Uj4>;``bTUcbWm(pfJKVY<+iG)7`IU18fN +%"AN44=nU+OIb7>EoDGi7jCBmE($3#IS[l!#!e8KC=hGnPJ`#'Lj2VB7@tjjZ7YNXF?ss!c]A +*E3`-t9X$.)Y>6cmhE]AEtARQ[ +J#_-PL:5k=ZJ:pY'8!Q'[@,*6mLJgioL,i]A`O[i>e-QBMnPT*BYt;&J!a?R2!\"b5P6Uh,m& +k)@@.s[jG!1Ijf,&tXJQ>eBE#_liGgkNk*Fk#B1P-+,B:cNEube;3Z8MHLEKXf=&]Ao^ +L`LhH@J7=R4oV7<+)CeMO5KNibONBM*$M[0*Y6M)EsLK32iU9;d.l59DS`aJ'TnKXGK4>flA`pZD%BKQZqJSAOAFsEBh`NfRdIZfRa'*=bSsQXX!K%+1;@CPD))[em_.fm +t&f$KL:l"j^=Q4nsEBG-'l8R'*3TqL@QKBYMlSY;r78L"@)#,3Bo1?Ed[h[,/;$F-W=;AbH& +_bIaS@alQtkrK\!EZ0k8sJ]AYSa)#`PT5-+=Eb51a9o\B>T]AIA=W>!t`+BHTUXE]A+"-D56.gp +)4ghZT;;O3DS6JK:%OH,\.S7:o3fQ\,1.!358Q?_20`d.S`;Ku<(>K('8g/Kltm;Zq4nlUC\ +3kF4haMojK$f0n_\:lX["#u.GpN=Em3YLKbl^,dGPZZknG\,%'hTjMf`?mTu,oCc6o-08i6d +$?QY7LCN,ON(R:o-T>0XV?oI7W1[/>G@O#=/C=:PFdH*^h^PLErZo(Gn=0]AY#8PEPiH'fNSHQf*eK4\6n_ElDu:?s49TYkMSCP<;O;(6\Rua +Rf"DASjMr=4bP_A#Hjlo&Li28f^gpdfiKAfE!Z*XLB6+&3.)c(WZ$t+YSAHQgTc.F.boORKA +mqM&5sp>Q[U:]AChoMrlH/99)#W%,n,3bt_\jbo`p=WRf&@l>cXqmf)M[-]AKX3TXhT_sUE9E@ +Jdh,;;NNT0'S4ipP`7Hg'90*^bPTR`3IMPCfAck,e6n%(H=>j$GQ!aKhr+WGhT*9\Fq;]A_bf +6h;t3?I\5cd'?i1]AEF4g]AC<=!9t2K]ALrO3^Iqs\)M6)/,*[=1+pmF13cC +fA\,/UeANhs@=2:I+?a+-LMQ4>`YcFW3%S'o3Jq8kAb(V^%')\%H=b8#=]A+]A#as"6eY0gd`j +"i#^Di(dg5M>J"/0((mJ:kk=UZ_b]A>>([;`h +9T)6sd,#DG'(5'T&l5_\%"SS[`f:)=gs)[$(S&`9#q$3AidC5s6i,d=Kd0<9&S,XghnQVg(@ +Q5m+99UC__$X`-[ZV$1_WXOdf;!f,/0O3'O6p(1P/H&kq%V4":!lR1"G[^9HN,md=R[Ag&:H +N)B<"e66gUC&g8.+;9EGmt&Yt6&VKPGNE1cO5!u0>jk-ESG6KM\>6^lCc8&lY7KIFh4jQ6oSE7Cc'*k=F%c0K9.YTS1VTLK4P +J#`2q5-DOoN4g@$m0G2qk==>D>.MK1=*J1o-O'c$b0qt61iCr0cVWT(bF<2E+:P17p>51!L7 +k"=@(fF.a2ZIEof=cq.E!['o7Yl_(D;cK@I8$kGrs3WQ96&F_%q9J+*b^Bc7!-EHJDXbH$BB +K8^Q%+uka2i!h'\A3!eK8dpsK[?0^^EQ;p&>$(&g<[>i`@lN +e\X4^;83&;WE&!;4:XBWkD(8C@egl>&6@%&)2jb.7Yg^!@i]APY[d,+0bIU[Hdi%`?1.Cfq1a +ckg'5n:7WN&HErSRRn'cFT?P85?LUV6ah_gQrs@B3\ZgBh(f;(^0OI6HHmH@/0#1$KTqd`d' +98n>CNb1eC@8Y2(6%U.LSg@@M"kB7]A*A!$MdXcA)V'N`TVb!aYC6?5*2L$KX1NR_E#28(o\d +sjd+mFWRYHV9gL)K,)1lQm&<'pdA)SuK[SDT*rA4P+meC:#9Xk(WU-%=IhZ10U&-N#3HQil& +0>p]A@FL^$3BmteEFIV33q@<;slLZ%S[Wp/s%\Sh)An/.L_(b)\%Bo6SMg+o_nQ''O(74`'AU +-3Mj>UONq#D1pX"f+%*m^'Q&@\PVN#LfqIP_NQ`-g+`)WPcVr.@Kg:U"([etd^<$:fW2$0^' +r7]A'UU#I%RCNuu]AartPC:EsdSce)&fuJ'm=!C`bm$[s_/#LDhJ"*^&lHa^ +QM&c04Qus3g24$U'C +J2GWhCnY<3m/*f3DZ%-`DS=?4bH!UBf\^A?\-STF5b5*M'-=5T\CnR$9!f`Ep."O5L<48,S@ +8&QI.#]A1obZ=0.J:;/'!M^X74JgpP:qaas`k(6NO%!_a.Lki:l0rLI;V%B8kD?]Abc]A;c@r.9 +OO[%_8!!$o_V;U*T#@B1P/]A'W?A\Ulm!R]Ak_]AqZr2s8_.fM<*8lfFl9c&2KENG4k,>jT=]A +q_o\T8t(Hhp!r!`SQ.u(qk<_:_.1[qt/:#hFOl;E\]Aa+-Xe:\A0C2;!pao`Nb/@44G(s'fK+ +,A="pfuBRU#+Jl5*eL?M:DLG^!T"2;L\e96s`U=X3JVbr/Y-%.1T0qk=?M[IuW&fUGqd\+Y7 +)D*kV\Fn/ZDYl,BSO'2+^.GSZn3/H^IUh!7M1 +@fs#N?Cp"Sf5K8f95QWrSp"rdFh2^0&*Z(ES(c)-$%(rmZMEA;\S\jhi`DQgsO?[eRL7(h;N +$VYlTtl.8?Y0NG!cDnhKh#;SgFPCfD4mU@n\C$CPc-g,6W]AkaL$ltHc.YfBau)&^1UI-Y5el +K7()[-R6Jm40I3B[Q-__TS@R0Y?[!G^dgElnqe990WiMb)#!W%GlC-s9M%t8eAC66>'cJ?B(O6Q0B.[%?cB@t]Ad1HX5PP*!ir/I%]AJ?J09/$<4eFg)e +T,%aO-+H`M!oM<*(?N:?%@ba$d#62`0(c)sdG(ij(C>#NII67`)aJ'90KKHgB^P1W)o&<&*W +:WS)HJ^nBaDen_r=.$%2=NXd^R\_b]A9dt\Q +;<*4r"K"8kjPVX[U+OSjqA'rc6iVf5.k*[6b)J[''N>Og"KlakJ?=t`^hch4*)')&@L'jgE/ +^0q'>`i$Xb+bkj@RWW5q7jE>b&q?&!\I\:5UqNBR5@_Pg/k^u/:uX[kkQAFNg:jobA["FVU8 +:C\msS.(n`M,R$V820d\XFi`g^aX7A!V;AN*">]Ah"`SX'5f=6J5(Fti&OD9VTjS:kOaq,NfK +_>7gFf/^^2BQ.U`=0mi%A^]Al-r54$Q,-8fLLk[;s=oY2n2Lm2K$7hAea>=p]AU^)'@:`g`KJn +uo-=@l^5_:uZL_YdA*6eB+J;=24<"!oXo!CiAeS$A(;cnt7%j0RfMSjRokeiUfOOs4*9)E\C +[W%\i&R/0LO&'I)ssbEE-R"klFZ$$^(_g^7hISML-Xa4_"pFV.@j2(Y"-8u!d3sYoX\065X3 +@"4s#E41'5>-_bO]ACh%g7'>9j&$3=5P5?9e*@+%um6#k$,MNT'"1GN7KSpNV\26^ZNkdAj3_J_.f$eF_l) +7JY#fg3(?VD78D.S#VttCjs9*,)W$7LWp;k16[(5B4Fidin+04-Vohu,!l$ApIN7]A_+8CuFP +h`VOY8%!IhC/:XMEBEtHW)+d=r6/Vbb&=ccH!2qm86!1Go[[fHiSkK)j/PC*aZq%J\^_XUsu +M5Qa;q[`Zatt%mrFS`km">@/]Ar0+tqDUJLVu@.=D:FMoJEd*%Dtl-VL&%K3`"_hsR(iD>=>PBq.i +3o`KkGO+f+C<;?$50%*oGBVuT6"`4m,r$hhtmBg9L6KoABX6g!Kdsh_VV@sN>HOb<)4)s;^S +'Y!F(G:K0TZ=cRnE]ACV7Ps9HN$KKrB`'US-_1InSgOMd3ShVBpZWplL^7B$H#WOnX!Q-**JV +'G*.78!3!Di:'p810_36_c_.Elb'32>tlJ;QO7h>t#+\8ge9KbI<_4>p5FRfAAZ/WMNg'Ift@K5K<-(<7Eh6_(s;X"9/]A&Ki:b`g. +9ET^JfP!&.;?`!^%N;-p#laKmaMAK;0@)Z3T=F6uAPS*JV"-$sH=Me8n$o".tUoBHtS@&/cN +17[#iaqr8T7iPK>7Yd,:9YAVD".iWKMW[<&JMCUl('A#n7CW8dn)T9D\pF]AUH_7@bDEUE[@a +Q^"I)%71[0^(L1p#'JjR`4!ZV)C4kWBGW8R!f)o*ZK2rZWLR&/k)g0*1l\#X>tHnYgUmc"41 +5!<*[e<3@GNV,Q/*VG&SBr,l$mN`.sH)2>%$Z-A0:$Ej&BX.'G^r+o'8\R0(-A,kqi4D!8.3 +A'aXFPkJu\FakRC2s4\+.KdYY%4LVe^ij3?1/r6AfAr[31CmJk"XkE_8)!GZFIMKf[]A-5L#G +LE&JmLTjKaZeTLMK,K74`]A14'q/2XL&A-/DrJr]Ad/FLmbcKCUl9)XS9!FR;OB)ceF/gh+$&Z)fGUOq_mC;cBFs]A'0bUkp`[Zq34bZ/<3PlU%@"Y(/jWku-:ghK*#k +!,0W5Ls*%/>e;n=PL<&! +UYMG%KTU4B)[:t,@-2kF]AD>l_\G7CQm;mE7/R=oPNKS!RTcm-=:#tH5'Fp?K\`hD9`c)KZ-) +I@ImI.gUZ87$94["qh,E0pJ?Q3:sONJCsgog0K6atRLL_e'8g"K2jDO.XT+-c$">?c0)UDs$ +fR(J?5tnN5KFq7Q)SBCT;u[AY!V^K\&5os=mLE;oD4;(c!VM2U5m_PM=_j3G&Z:i?WWjU8q9 +1;N&CId=gGB]As7@Cc)/c7VI`MZ*(;WQ'$]A9R6@0FlkZcQ-A,Hgk1f9(fPO+S9M>Dg'6D-#FW +V1aj+Bl_Y7Gg84^@,pQ;Kg@b'W5L3eaOg"b'h9MYd;P!.Y&@6pXcRr018/q!k*0g?HDWcATL +^*VXki]A9'G6U9:!s5&ITp'u2OFUL`>ok;_0X2DPB(1Z3Q +q;Sc-eATi3M7KPW.fmE"5'RIO;?>.O9V`kgCcrE^ZtTfq'#]AGT0_1t%0bXQRL*$Nap'%B6&^ +'o$r*/C^)5dMW56Mms6Vcc=!l#UdC`l#-(kC1Gg:tY2Wu_20+!ZsHI=t2M&*3Zt+^I!.\i17 +CqE;6BqYEUKRjbpgp:Uc:d]A"'dG7:_KXFh"3cEtK>c-q3]A+!OPW+C\+>I#Nm^?5?2'fMb*K4 +/*3"CjR4RAb-F_UsflKR"eGRT+3pW719)"crEr6]Al8Z7E1#r'Fn^FB2kpsJbgeA_Q>d\2akn +CP4Vu2N(,^@Z@s?1(fR1[@%XqhjOjH42IbUNdrR+n`*8#p&f[r8%`f3J3RRZ5+Fu[@ZRg1gj(d>#U@8:5Q?I*?'X+^Y#.DHBH(T>:F`OoMShCdF=l) +j>tV4\S'T^TV,?%_OE+<35S=;,7&;VSg]A^i,%_e4T;!S,-GU7.O-g!@@kabFf<)5qC&X?-ql +KTf;\^@-SD,rbP-SNrD<_.h4^/:)!T>%PF4TG,#E@@22'Mbqg8='+'+MVOr,(=_oapg_[):1 +@1(MglnqShJaDao-I.sWA4X+?R!"<=K"d;:kE$^2*bMU5C2%pT^(o7VlCR#"*EoJ^d,A`5d( +^sh1J$]ATN2Z[FgaZdeUaD8qYP1/W90bD^=T-tn:6fIYQkOOcGeL[)rU?V-]AKS:=PNDM.KSj[ +lc>u/&cuY6QDo`$H/T9c-g=GHpJ"fbuEqM +)@Rd@)b*ZsuXBUZ-enmmb(G#.<#,^i.L[F+oG`$h#iB[iDRVgrJm/HVfs=%;8lMDphJgUn.S +,QI?Dd\JCmM2d"a's656*@ZW2-BW[4Rc%te:Q/Lc9#c/MnkiV=V>5]Aji1+I7l*HqhZZZob$# +TNIFIbc$0Lh9p9@"cud\-PS%-%>rA1;Wj>M`1nSoOEQE_3$-.\cd89Iu]AZ$;\7Z-i^!ga8.n +Ga4<2b0Vo-(,&m23,7PLisRp+"o'8e8m7s"kd3X"/<_j,BSJ`"RgD)r<7r4a:pnFKM,8,)qD +i3-U3s5Q82lO>XD"C/4g3&oC5JM#shlK>JcbN5[oS$BT:&QYgiJ:Sf3H8>7U$[r-c[fCkpas +cj04$)qsC=(FJ;Y"(8YH\,sJBt[9ue>#u.9>C()7bdGOW-_f1;sE-pq\:"3 +9t'+00sI.QL8.pNW2BH:pYj7\_1a+8:K8EI\UPRKBKVSI,%_,#f/mi1I5!N-/@K"]A#"!>3k@ +I?AieLG75Y(C=qY6c8+1.-r!O#n-BL;.d4K!iL&bUHT>18!57@Ifj^@`llW?]A<73K`.\/2E$/;0 +/r6Ql2L`&<)]A,C?%N?=kL$^3pdj<]A.\ZUeS\5IoF\mSh_Gc1(s0(Jii?LKG&cbd)S?NErJN0 +s)rCs#f:QU[>9Km8??"5.\9*PjWm5,:-.Us2mVZVG`rY(P]AInK,P]AGA''An#70HEuW5@X^+D +;bfMprLbO?FW:GW>Wk-QuZ=rBUZQGOggQ903@7ME;BX[NJ1h0jFBu,9H&n6aX70AD<_abPJs +"XMp'HN9Y8JfN$H(LH@8bi5\$1^8ssk(#1+DknI5-DEpTs7s/m08=j)!53M./5gc349g0TsK +HJ%%G6nI7F.p&.i3^ngBKknlcuiruM"YW2$prM$!_mSL#(&GZhqa<&lB\;rBE2VSI*O^e +[Ao;h,rCP\eXqdG6IkY.\TN6RiI#4]AW2?%-[%UTrj6J!,BkM!8-'o?oVOZ8"Y>r+/7'dd5S! +A"iDAr]A).9$qZR@o?iu%RFn40uoA[l]A"#&Y]AjhcjJ%sHo10&B9(i/m1@j@S-kWTV$Ng/eJI) +4Qk51)=#"\Uc7ui_L9`I?s\fe1;@Pf4%UrNHcrCQWRAb.b<-%`nZ`lj2K7.Y\`K$po+!W4I? +%K4I,gl]ATi(J]ATi@24Ic=3]ATW/A=P*(&nd=rmGj1C=TEJ_3+5bSr%.DLHm7EWk""U!,"(rgO=u]Ag_gBpT+*%d"#RY5_!f:tDF=AoHE +e(7h6-^.hb\5;@X2%lT6Ps<5GT?Td$>at]A^\rhnpa<:[!U;8/kBcbWs`TJ"7OgAi(H'5Z1NY +jgkBh,q)35q_o&Go#_G"+"@q1nE)o1pp$Ntid>5Gf0FT,[p]A._bG6n+A,k*l/Jb#iP3r"EXc +6Rp()ue'V&DVUKU?3*B&C$t9F@(WLm!Y"hl5J;R%RhY.!-d0TfTi(_h/s`W#:;X7V`43V7(4 +-Z'$L13:SB]AF/t?W'_Rf]Al^i5huq=Lr*0st5qm3T9j/ql1E"AXb)4?I??fnG@!%[GrY +'Fl:^B]ABQr@3+2i9^9e75CC.-G&NC(BI2iCR>6KBpp%nX;*sn?KlJR#h9S)((J=k>WN!6u1F +tMDSi&\7DB^4i:7]A"-jlMu6X3maj?'`L99oO2^C$ba70kb3ufUB(k'B_1Gf,7s3/[sEQ_N@k +eM?DTR:a)&&Sc50BAXbQ(OZNg[K"?7WC*hpAm?]ADq^^(qLl8*@fbcImc,\n +qP8CooTB$^[#`F@.Et#dmKX*qPgRmg]ApA#6)ipn(LDP"2MB1PWoKeQ4>9Ca]A=kDWmY*I*#I" +]APGDSg0(pL<1PgK<8%0V0fj$QdFh24c5k/SaV;Yk#J-_T,Ftju-@+!MutH\-kh"bV.0Cg>7K +qdgm&DFcE>Y['6'uuTE +r0]AegY2e-dk/G5ml.aLgMRTPd[0`W]A$L-7[sgl0EBa;i#UVJP!a!ru#TL4h'*uJ0[3!Wcmif +&p[XsI]Ai*Lol_2mlliHR`sMHi_C_tMiD7DO4/!f>fcZf5kQ"Dp-0i2_),"8S_j+%[fp:H/R+S6o[u[T)U-f` +S"m5,$mNd<,cbMekQsrkt#ZNB8#OK]Ac_[AU.RYhV1e==Zq!!C+cF:=VbY'*)o4FmFI?47886),G7V5LL1> +.khif<<#[Dp5+>8a@/bTp>IuJEf=3[#(G1%^Yb2%t88[;u"Ns*'/0[]Am)E8+.'Z>O.WL3ief +$L\9rQRY#nOKb*=LC`K`["CtW-"]A!MZkI"+)(nR3q#>1%rFh^QSBPq#nR0j"if\1Eqa(&34P +d0>`-M=\b[9:mYXR4;.npE,!Ze2U"g;^OF$ndFJB'1;A6E/6B#n)C+MlU=q8M9<[/H-&.g$G +FSmVols!I$GX_c-G#IkDI\l\o5DcBSMF'U9R";@A`QVJ1 +W[>'!okr*+0tk-2`ugVZ_q;NedX%l91$D,*X00Aj3a)uiViIq-ljeX,C.&BWZSSkCOm[]AaW8\N7/'$u/>.#!7VZPQ?hk=()WtP +)Gs7sFY6-YC,?4:sGW>0t_3QtUG[MX74ptAm7u+1?AF(_h`LPQB@.lsKM7#n"_6NT1H2,4(\ +YEUmEiCWMEVb+Xcc3!Zef`njB`HQQ=BmcJF:S)612SMn]A!k#8omB/Oru%cI#D(%NnEbN(Sio +le=n=&,fgMSSi+cI)IF[qFm@e^H]A`uk9LV^Co(rT&H8'FI`:O1dT[6Z-Yk<@m(qS2t$7MHW' +_;buRC(247]AZIR?f;kY*mG`&A;_i@=N8'G`^CqY9#NdIh2X0C\(As'dqITHr4q:rEA"n4J*i +8U,:d;]A'FM()HT;'[#6SSC]A"SjF_T5k3rKtg)Or`[h%Fi!.HrYtHA'M@'/+Y+oZgNSlll1/D +qp$S6H-P3Sn_seUhTr7B0pa[sbAGC(I=ZW_p720H&9mTXB8qm`78Cqr!qLIXLqhl>(59'kS,>&ADr3/p); +]A_e:l%J_rkG+2@7d(rEr]A$O-=q!qp1e:4g:E-!cj(M;/*NqX5k!Ja:F#jK$f(9uO$hQRTR-1 +%7@%e8o(dQKFd]AB9dGS-]Ac[n>,LFi@>dF0^FT6bPoI+D#aCb]AV&pWU*cGpI*&KO^UU@3s'Y/ +e;pC3+a,T-4BK5"m;-*0Zo%1/X>8sQV.o#oFeo5AX-;g);I819gIi;.DTiLV>@Yi*XL4I,)K +s55i>l7"hunctBiDoP&8$aq1;+*/CP\'DhDNYV23(*:]A0'WZF?M1Xk@ChqmZ3>jbaf!^M,E: +GTD>8N>08K2(r3;7urek1#28or9oRkThuS@dRS$olp#"[_hO^gm,6,WcB"ogYlPILJ%GFLAc +@@.PoaBANi5!n'M$*-"6fgTi$bH>GHL&@`QfCA3K08T:'\N\3I,!T#/Be6W(CsHiR4Q]Af[A+Wm>6n!1(EPpc*/!#).ek5tQ$:U"WD+9;8t,c'lANZ[&SlWU+EfA,RbgBQLER,OY62`!T +,O$.bMZHCVSNOf\Kjhk9k2Zi<7W"6GA$`VtF;->#6XH'HCmtqa\U%[A2n612Yr2WU+JELZ+Dl1dG6*9p2KF7]ADFe^kM9k1;J0t$ +%hK)Yu[f?QglI\(d+XEe#tL6CF:ZMm\q55l%>`IEQG3<9>:"2iVa-AUt=ZSlK5C;[ZAQfI$p +T"sA^4d^jTf7))$99qH +pde>hCq3lb;[(I-?]AN^BQYA:s1'cnW7_C3e4lW\1MZTNhno_/A-C-t$!h4?(bRt@!+1'N,j( +]A5OHEA3b?F69sD)H+L0.nr8W>W]AYjqp6$c!gb,,DPu$=@PJ@6jr-a$b +Q(9Q8J&^*aX?:K#?WZ,92F/)_,`p.I;:\7SV$'sCEu\2=[0?JtnfIA9b'W`Fs,EY5n&N31%n +-*tPk$c2_!gm2DsiY_nNtX*d)=X(@P38kON;cMX@pE6&l:+.q04Ol%qt]A;T\jY*O@+_-RNt" +#oIE%%n/LFI,[s^;AlqcFf\()XAeO$7[('O!=XQTV+V+q@F0Gk=!N3<+!rmND:#m\_!3SfdX +(T8;EB2gr(W)AT4@X?d5V2_Q6rM?a04c'=RHG`TFr%s:V\-_7%;\$/f"=5`;K3cu4W?-Em2% +JJhFFfJW_?<>!3t:&R'B%2!%F0o2 +W18T5rcB9Im472eeN^6%@tduP$JeN-qm'Y]A +J?*/?`U3m`*/=.:kgpkcH#eB6F_V(1i5;Kl<]A3ja#.PO4pabD(?)bJ&PG*L?Cub1`8g(SnNb +7=U?IJpLO&3BeF(fD.D?XjVO+Q*d@9?5d)'PkNU'tLRaNtdBlsUo()I;7eu`)CGlEh,:g_rX +2Z`W.I1WZTq662l#@7$`(bRogrhO&^9DfAk1/AL9hfB+#;B<)=Kd5uoE2Qus=NTIZh>7`4DV +p8!K+S2D0+8oJf'Zr`!-#7dKDanNK#^Dr5mO\05pqNBL+.%,e& +-:X"TK>^2k0hV-c5+V&b39Tb*kldftu\RpCp'6qaB6WU>6/54TB"tar(7_Vp)_3Kq&i0Ps;i +qiBfE92Eu\9q:aCgWCnTk+39(PjX%=&l5RtU?3n6d$_ +Zn_?\W@)U`8lJ>.]A^b`@dq0_3BO[\$SU$.3aY!7^eG;`M:1]A#r\VM_bQ\@86!tOiPJW>4Y$3 +g?rMtH,ichP+`gNNuagR=N\rgheAK"*W@;eduH]AgZZ:g5PiOpg3lf/At.H7,FEjF5cRBM":N +>qcqcQM$7JAElq>E.Id4Dn6<2F(1&W'"bWCY32<#;+=%"uPR]A'MID\^V*6c=$q(i9_N?SU6L +mFKICGd0UrZe!erWD`V'A-fE%BSd^&]AU%+>`N78F1Q(n]AXf\eKh-t,-uI]Asl>`/$+I@"K]A:UCYE06b(Z[-#BgnqiTV^r`9^!# +`"7nO'1&dh@-NTt^[O+)D]Ae85lS7$h#$#^_>4s9el5G>*=Gs7ScePF,U"lW?*-7 +6qOc#L,pCbF]Aeq2F$_n3@JbhD9QdmMTK=NQsE#RKhd^R)3l@IjF#FHD@1fr/@f>(m47DROW^ +TA(Xf.bDO@T),s@@-]AuL2pT6q#2hC4o!C!@LZdt>A=Cgh3#RZ>]AZ,QgA*aRXlFQ%]AJ9`X2UB +9uN=.H$E$NGlg=_6Wf7=N4-_aB4>t^)(6#/Q0-E80\GL5&8YM0U+k_?^X%agSGfUGM'rk!+/ +\JO*gf-'H"*n.X7B_7s41ee;RR-ra0.C=QCV'T6Rk\XiEk/#uN[]Am^^F\niHol)h?dg%@IW8 +G.1mHk&8c(b!4c>IDJ%-hR9rdXXe"3epIm/)7h>JB/m0`e8..S[0:;`1Fc1l6/#6j;ft#Y=D +Q5cQ5<.FS)OG*hU004ih50?a'8HLH:.QN&oeD-:b9:3eap'bVM'$bl+$CQ%d+TP +DIXca)QA$C)f4C)g,u0$r"40,3U&4e4aD6(@J]AlOAmK@UA/#?mW<`a31Ok=!r1Lkl?ufpgl< +0(F/Y'$B86s=a.gPrGb!F/;3)Gc7G1I*A[rPW`mLrn/B_S)#r3ThH)M&e!V'nnYF\rh(6'+ +Zr3W0Bf,@)rOp(Y_F^Ho1)j%]AG1l$)?RIZ*(;\,S.#S%*XI/3;AW:-R +h*@`gsoK4_">bo26Q'd+fmjc^)*SO3^$TL;M+JqZ8b4-kWX*$CKp(C9VS4QGt`@'u[A)o]AbnaXZSGaTG/6-g6jq/)=DPZ@"2&6",'QrD(cO2nN]Aq +g%.IYLh#5Hkh9BVY&Q3XDP$lC^)4[J[Uqk-:Oi=!D[td:Pb9uHNm'@0h=lp_YTP`0l#coloB +1G"ul4`!%@\2$<-#/8/?0,J0^W?;oR@l6*4-QDe4E6Y@l8`NLAV_"p;4j2\`?S.&PDSTt]A!\ +mkM8X=mlK?)chk%-3i$J9*=K]A+3[ai5W191R!qX$0)[uE?Aj/l%V:6D:[g5Wf^Mac9b:V6@V +qFV6NMOCY0qI>+WRU)8WdWtIj,[*&+%4,Yl.-:lO\uH(^!qpBqH1tke=:OVI<=>5uOuM1c!79EZ6?\<+(flE.Xq6DoZ55PPeRVbH8+OAa_p\ +uO259F;kE_<lKXP0BN(JB*(+7)n`)#\tF!OLRIQ)j4cgrhnYL9pn18f0GXZH1Mh^bh.--1@u'r +NM".=A,;-Er&;]AS+C\41cL@(rK+=jM*;)0*$I1#/:VF-=KL"#aCg^^kX7]AWVA=Q]AH +#a!m('>-)3ou&8I'=3(6)8o]AqG`^HO6"1)2j>+6P379'L>U4*;mmp-Nu`?!4Gt>%V_XY;CDi +.BRV:=`8Y;o,k;;b:fY\&CXob)1:6Xro_[%4S48E +:EX"*`"_%[G7k@Utu6/L2/bSP_[W<'1e$GM1i)mIX%[9b$gSdU"=O_4-=bcjKd\O=_e/R. +UXI"sroTDCM0bXJ#..0^I@HI:iMAo5-dm6`g;cX:C$HYr>p8mt\6fkaM*tl`D\I,h1`qF*o5 +:A\hotgPOk<@O?1FC2PDPX6E3Xa`AoGJ3nM1O*<.LY]Ao'k+F`H[PshN6!K0P&X$DXet@)nP\ +T#-H4hcZWX8Z>;CA(Khli"&#C>Yq\lTVo&`k;b/M&J?*;_?31`>^\\T?-o7^p52&7ob::$&- +\3A1*4M8T/!M49$7X5C-ZtC]A(-]A!"&g5QaC%8'DP+*/rKTIL:*i[Na]AbEM!Uit*V-+Q@"p.I +3)MTpm?4b>j1![n+(JgTc,Br3Tso-hk^.3:q?6uq#r/n%0GJ`W1RJf>,]Aq>`d,3;$/A\?B;[e36/\j#h-K_5@ML9OdR!Jh3Vhpa'#d)a2rC%ZfVbKKSeRr:5+.CsLsA5:i91_Sag.U!EE>p;5H57F*oJF.UblKk.;q':<6R;qA.iqC6b!c"P&M>;o +!=FFRuI,@B+]AVG$Y_U]A8BT"=C3DLUcC@<=>LX:Kd4Y7UU)7di1b!g2k +%^NDsOcbc\\>2NgUa>WbWT2%9Y[G9Kr;FmT@eZH7YZb9jADe3KV6NtIm(#HfV=uAZQn7\t.E +U@#'c.[AK_SXp;RqUZ,c%>NEpIsR=rO]AQ16@]Ajre4l,2_th%l.J%eFTsitAOoU)O-t:7:+sE +IS9)co@_e-EK7rI0esK[@=29uq/+Ci?1&R,fefnjqE5-;VPp&;bO&#[GZ$3:-;iDQjUDLKXOC*'Wa)U7 +@@qdO4&!Kb]A[Zl6muUPb&J6YS]AGVIeQ3g+70rq2M+2nKj8s!piT"D3[&WIDN/eG10mRlK?Kq +JV(SW5>fM\KoC;P24T'&/!WMi/'teO^&8rZ*NnI(,.r*_$NIU8r@As&Nb6)b#!U..@ +9lJW)V@)Ub*5f9fb=G$!5&F[!.OYapf5oo>/-,9=GlWQ]Ak/;Y+#jC%44Nea-6s077.8Uh-(T +E^X9b@hdj@MQ(Ms4?8J7rH,5\,86BNgM5I+#_?Ad6Q.G?>4N=dd$FBrGMU=4:kR"\$uEs56> +r5:%rE2sVo^GHL-.$5]AF"MkoU-X#'Bi^er9"&o-^Uf=ip>0`9NKXPYV4skG +@U<"F'Ju;B3/o\s$>5l1:^(d!(M<]A:(S\PFc!-<%OP3BGY,'8E_!fk4pW:B'(`,=P8+W( +A:k''VT#_o-5P6!D/ +,&LlMp1Ggp.Q?FU=U`[nrjM9Bo(e1%mj9UXA?\8.\hWP0Mk9"6%%G&\OX")?'bSBbNW +'cG+-r*ZDS+$`lf)4XB[5YN'u/d@d**_<^'&m;i0;W?AVn]A8e/6!?`/NZAGGJpAk$C@kUZ=> +GkegGsMKNNI3EdY(/#Xck5]A!_2F^Yf'AtNK%/O+=JM&_d5f),-oYM@k'cb4;-WdOdsJm2*$9 +i@4M.J$3S.e,UP<$8VgsF@K;V/5+CbnhCb!U7j"1sM.,fdn\&56WL*R16-Q&fWoI*3 +AU@p46uZBDQ(S-V-4H#mV.d^[Dd0mNfFS]Aur?_8adbA)i;*\ppZl']AV^+!@;r`I>\ReCLqXE +a?"p:$!@[io=ntVBa3%+LeBaYfH`?k;q\aJOG%k%%J2c:&uAFA'\;]AcHhZR6=nD1WplS\Vd3 +;PgX.ZrSq7WO\)kjMb42g,KIGWtC;q^I$8WU5s:gH<>_oZtt-!m3919&t*QA%\]AK>-Ogk7*i +e`EmjTA6"r(8L/;>-LJ?JOm4#tJ!G?@BT.+JN@oI7>0+*dXNN$3Q9lrCCOFcacA5aBp"3E?` +PJT%m(]A@8h@")b]A;3KMo/c6NTLWs-"#c`Li0)'7GE]A1<9pQb_SJu0Z4m]Ab1X(ME=!YPLJY5s +)]AYnG3d!'cV)Z9@L.L^]AP#a^(pW;L\,^Z%$dUr&Q#95`nfH>Sm>k\N3/77?!J&f[s;R\8jIQ +7cn-;VC2k$Y:#plBY(%-F\L33R\2R+Tk'?c@29I&2]Al7r00^Z7: +AnS:\4M&>U'n@JQ"rnd,K#D1#=;\s54TA_C)jP(MSKK$fsK3>fpq?U;*5Lag9]A.!DItIf(k( +]ACHV'bBG3,qB7]A2_ABulpgM*`m)YfM$*h65>lHG\-QIic`i`1ZJBYsMCurX^n&1sK*eg$(\k +B<+A6J%@!8)]Aq=Y8m#1+u,;`c.X7iK4^3Gk_j$XBUVWVbc?7o)?"!gi=]A@?q!33S[\_.7?Z4 +]A3d@@9$VKk_#:J"Z+i9AJb6a6$pIXJS64*N&"[qo5\W,)RHJQ"I(Z8f:J`LZjj'Kp3SVk< +@nZ/_Mt2!L*[KPKf"\5M)"3/<0@o&B>7Ctuf:Xf,SU3>Ql^ckt[)f\VJ3_'8P*Q-Q&r:ciB= +Bg0q>FR87S%cun8./o@[C2+^\Tl>^P*_<_p]A;3]AieeMAh%;]A?Tl5A:rrY[ePlq+U5.!j6^br +MNH#aH>i(/';E#(t'OpYo%6!=Iq4eLI^#=pU7IgmIS:)Ha7c:'6C4)7H!M.7=]A3,02`"b63I +K9aG!;u7%r1qI^.B*H!A8.ad5'ejZq7j(gg,\eRPi7a"'e*JU^qld).)'%iKXF^f/W/"sqH_ +h=;c6MTOcdIi?)Gr8`AZNmlroAg9ZR\'?;E\(Mn>7Ac"8RbQ?oYC#+ZfY7QYLO*H&bZ^5%pj +=q%D"/h'7ViLm\"l?auPM*gF]A;THLMDe'FCBZ\>/@?^Y)hDoI"8PDjpd\Y,@D;#D'\o\)sO, +kg`7eZ^Y)pH*]A*N3C%ZG0n6VIu!*0XY#29K"E(QWIJKD0:eIDp^qVs%B!UK8)oh +rS;#UOPB_$DBWPCF#\KQt-eL+-\@\#f$^SW-J^pnh@:91GA"o'TR"AnmQ=8+R>rT]AI8iK8>` +UoW8;;>>'Rj&`21bSH5i5b.KI:8hHIhV)9V'S:Yh@I)I^RKf3a8$)s-1NuH9m?nc(+lTt4Xq +F?QlGQ&G$Wd]AFAim^V0n*3l`]A>\Oc#S:1uiZ\BVH58_FM%`:R+P0qOo`6RNqh.*6W +Ia`^'0k` +=C<5^HHBYG@RPUUc)(s8E`'n3OP.+8T7+0Da>[aVXa>I;Zn%t>mRW\G/>WE\oR8#:-]A#dDJB@n-*NoXD',,cJ:eJ.U9PgN+HfI(\`r'X6OBN +bA6:h+F^b1Q$IE2!td;N4eCWl4J()QZPpF'4f2NMZ01Xm`Ae=(#(3#7I8`nG-W7`Z;gSD7OC +`.DAV3K@/ffJ6r:_!YPLJY6TLXS4Mk@U)HXg230XPg+_tb-m8nnpnjDY;@4i7Kjr$TbMjmD, +:u&%V+lj!Jn*_)<[Y3Lc'^X8lTY04Vk^+`n:%V:h%"8Bji:c8Zt'7ql!#:NU?=kN\3ujWO:88so9fSf'Ahd)iTEbVK9goW7G'1J21H]A`6*%Cr_PV]AFZdIETA#.fZcnT9lN?uf]A +;*]A7"g>(/5tV]ANZ\AA=tOV6t;"C@>Cn-4Vm`i%#IMr'k[?Qll[c-"PbY7sQ44e#SP6?7.H.V/bJeSg=%+#^W=,[V%i-?C#2\@BR +M69't*F06N&;.NV\cpQIC3A4rSDrP4'.XI5E>9GA&O\)kABhI5aLa?@]A7.q*P$P=[RHm7FiM +pgEF";cku6)\!ORfg.,1/g;Bk+o_65)>rp!m2?2m&XINg@-F[%p>8h,mDgF%u!'M]Af.pW7:3 +Vi7pM)4>@A'3#`gn"2_l>6aD`qMCsKs\)_WQ#)mMCljn+(k#RI?/4u`SgD* +1$%@fG\k84%,H.CO)HN/O,na1RD7X#o2Q4UP_Wmp>X?,i)-ELWK>lf&e"DB2j:6]AI@#bC9!. +J8qr1o2s$+U8&Wt&]ANUTB=EGW.s,5dP(Kk9nu*b"T&^Pa.@h7oCu+gq4[!0QRl6!m8 +s]A-PU-Y_Zp+XnObpkhoLVHT^i*B)O<8XCt)#5dr/kAd5:?W6>[]A//m#@eZE^TZl"tfN0H>b9 +p=@n8AUB'8/AAA_Q)[=R%`*]A6,aOh3ZWh\M[LueB+^CKLWIt!9UddFCKGomS(Yc_H:A*qo\= +$Pn`Mqb;cjIhnnEiu@-"S!(395W>#8*ubkn"`IXCeT_=2YuL0U(*.:LZ`2n9d_^<*]AT-d1$^`%51A2Ea7BRp>P@B$"O3ULO)^a&qM_I*W2,$4,*9P2QL?qQ)3#Zdi0:iq;A +n22p-&5j2\RX'uMtN!mHg-tcceTXLCY^_W_po+MeGh/1Qc"[p]AVTVTGBu4k5Y!(Q+]A&b*C'% +"]AKjDV,$O\,7a:Ka6rO2Cqmag)C/4m^Y.=RW[9A5DqMlX6t)jMhE"=GJeSGH%"m#".9OgS0" +k1jhE&HUH,"#KV8-m_.G,GFhXR*tcX,J?V-0)Alm.nP4@XQStJ/jL>a/A*FMF8?p)Qh4PTPr +-+K86R=j!oY0H*Yq]AB#&g_d-,uTZZ[5X^]A?S49ST)ma[f4a);C8G2BjG<9A%B5jf;m(k?-XR +sXINJr.FAN!dT0G-]AQ:"'?9X@$T@D"2mNlSQQ[`eiP3q.%We76]AIB<0PA$ueAYKt.;bu`8)o +6!1+WsFc8HC;qi40NWAZL&9kU"cb[_!WBTfiNcs>:sC3`m`RaQ*%0+p74r'C)p"Ln-d$)5Q]A +mLdH*UUaQ@?dXp.Z=3/pR*\"E95mSbB+YY&ITJU!>l\[MLV,22G,9itPQQsSq6r$Je +GPS&!m0%lET:]A?bmK`6fQlWXMWWAsJZUIX4'ML)WeobfQZsRXL<_'3[)1<=o0``BhZRFa,cq +OnELbFr=8YQ-X":#8`kfeRKPUR>GW^s'h'g:,F;-sE +uZ8JB%m6n?^ce?=kaZtqs]AumA@GVTYanN1^J!8`$K33&uo\T4R@ingd8LFlIYASP?oIYbO<]ALp +Bj?Jtpe/\3$+ui9UHJr^Y3a!Gb$lDTUaJjFBu':=&0e(3u(/pM\7[gbsfISJ8l:qbL>Y`:jQ +!pLZ*3k@280DB +o@s<*soVNj"88J3]A<]A86$l`3UmY98<1P[X-d'#%]AsP3Z(' +BPU:9`=>cj-j56a&gC)a1qQ)H*rUU!S0+0-nkr3<\0$$hdO[FJG[<%(UDV*nm?%J&-i[#1tO +A76:WWR?a-2`lilG8*(HZd>D":(N'+JK1'k$R2e400?K/]A?bNel^\3(DV'15pri'f\30fe"o +NQ4Ac-H''tgh4*\Vu2J_ts##"t-@.'Whk)o_fW;/>Y)^b5[@!==;6gJtbP#oJPSS6T)_M"(`?J+bJZW.c@e]ANn3nGs[f +PNpRh1SsiKuXRgD/>DIRgGYHW_JN)N/'65"FMC4-UBDN@A*B7Z4`"J;OV9P'TR2s@!=Q)_4_ +!jf)\5bFN#&i\Xj&fPmjHX#9tlH%S]A\]AgdX<:AgNuD3qt6UrnOV,@r9R[l#icL7YRDd=E)HU +P:$PW9.Rh#JKJ%mC2.M)]AK1$9LFT%c,YD^g%;WiQ8Y-nJ\af.7fQG\n6/=Sel?_^H;mY*D_)$#q:'t7qTUo!Xn?!02@4@)G>7JTZa1Q&pncm.J +DPBK".TK,a)8'+!:C48)0HtuV,WN3?>r,)^k;QJ[iB.W`jcGQ*pM)^g9"efR0,H+udetp$5_ +jApsqSHmtPViJ':=$l#;nEX*[g*kXhSo2H;fPt]AKO\GGY^>g[(`D\p)#TN>/\**)iUi-15Ns +(/d^2[EPX&#HJHPr[:_7"WX?Qcn"?:k\EYDu7Q*+p&J5>bG1!*<1&B_\j'F=qHRa&<)XJ)@_ +_V-9;Vg0ed5,3Ri*aV\CM>*hqnYOhcI]AGU_Iaj,Se>-l.94,-C]APs\_DUeg\7<0baM3NU?Ha +lt2CDH>+lYtU[b>K1CQ6)3Tj,e`(m30DRm4[%V,[(n/CXU\J9M9X3[@QukcbUa@"",,AW!qJ +YJjcZd_5K*YkAk`/eJ^"h2(Fi)jH(8O]AH1X5c4qn#]AThkF@QmB8(MR$KIrAce<6OEW>/PkZN +]AOUD1iJ%Cldrt"!KQ(E>gK>c.XWTGO+NC^jAp>qE./]A"8Z`C[b6"\E +>>aX`7_,E02+@e9g-WkT%[<>6UI8+7C:++#V@%"lX=[$Z;ZbJt1R+W^>R$bBL97(ciX(gi,& +La\NnL4<^SBm^,UeRY8#:!f\eYXG&[fR2.aV'Y&P7/!#cl.>-N=Y8-7s/a2WhMdrD;aGcs`; +DCBYtU/OXe)@q<+5S\1RG>bL.b75,[nZpShAl>RDYN/55F!m3lQ$lfM9AN@>acjYO= +aP[u']At(V:=MXr-?TrLf%'mNge\0M$WlB^!)mpu,jW()Z?g7i@+XHuU=*>+e(P3UPoiG8`A, +:G+%/H[@4q2BhP]AOn]Aff%#tLq[lbL'\S@3<*LkL=BpH'1HsaoN7::!$EjKLZGik0\+]A!WM;#g]Ab`fT(VMI3]A4^#"ZJ.3d>K-n*U-7=f)+n<:[Zq*8jC!BTX#!P +QZFZ9;'oWKOWof4+Nc1=Mk)oVW1s5,MrMg3s!/.ZIdu&IE2r0pd6.adWjcln-/iB^ZQ(&4rd +)-%pW4m7RJbsDd^B4"H,RhZ[J.hPrsaXcgEki@lusM`V'(SB0'iTU%Qja3WDSa_B7Q7m%Q!:N^lnM7>0D:!#\^EoUH;4@Dm +r$0ORioG2*Hp8e#(".F6CleN*.r@mt[C_h':PcKp.4uO0#g4b"f4J<2WGoj7$+-f2aVDXYY+ +Qb8*)A9''&$0977U;F=h)dYsQ;jQd>)qSl3@\Q#<)q(;;pF#?1Lft,:&'+f4 +s"W60"qJeP\`j*A.W8Lk.si.9bRlB!%_$Z78:n4=]AM;H+O(0Cb&9g,(#FeJWVF1\MlF@Wi\0 +(?V19g6YrrWSUbQab=4fT;ImsCob\A[=$DfIp;RgJ&qb.pof%*PqN*G&S^UDL81FSCbD0rd= +MRH+F@FLFI5h@!9Q]AQkoQ=k+;K$,)UR&9N`]AS/Y)L1i$ZP1hd3QElF?S@g#5D'`L]A-6Rt_WbKdPhuL'Rc#n]ATlVpL_XC +".f?ZYHLSM*lq?A`tohO!K`+dGoB&D^T>>V2]Aj)S!WMMeUtlErsCPa/!,H3o?jE`Eab1.,kk("C1HjI`i+,.G\+NSm'`eAu7d*T0*C3t%le\Id'55Ys#5Q2-BJ'o:ITD +U(\%m:2$T)hd^l3-c%IfjoR"dkaKHrK"T'r)Z2)-N=aHS40(HT9l.CDb'NRt015(@[\cZ7H8 +8Q@aY/BnW\ZF4`esd"V.G,O.kQ@_W!m"$H%WB7LY$iJZoQ`gH53Fn>\O6QQIb/I.I=%da0*3 +0&-55Q2sR9EloH?LCRa[VL.^$.X_Ba^+W.h93X<]AV::UJ9'iuG?_`n.2eOEM+r]A$/02utI2I +2m"TS!uE1Q3I`fTY^0t\$eTnD8/l+qoBHY>J0hlqn/LTB>Bpb'gAi>;[J6Nhp,+MX4oR+*," +r9tB4^L1)X3J=gG&Zm\&E]A&4Q6=!%g'=Im[+Eg"ee@2qZl0YsEC0Nj&Aj:*H1Mgk`Y-DX_\! +`rN0r4I^3bb@`GZf(%-!+?/`M=>6)B5YkU9qQ>[?!SVXSg(ARWNM2STB\em6$o\454L5s"`N +BSRPC6QqPW&^\AfeYMVd0oNlC*WjT8O]Agp&2`G9cP=(njIj&VbR;X/i]A[A!g_Q[f5"hMGG%J +XPnJ.^fT4P'apV!S.#ZbR+8)eg8X-VE>0]Ab,`$SFUDn^Vda8h$^d7P9?bM("d?6aa1SeB0fS +&k9M9U?;j763RHZA67J[tE/;hH)-1eX%M23mQHJJ^gEn`gD[1ER+A-j$,GdKEb9("OV6//p' +Imrk%bdbi^YMrt$Jc-l;m<*o98%RSK5GLgR'OF0$WlO/1!W9Zj]A)ppbu[gf@^l_.JU0siHt62f2'pcmU@oD4MU?*bIB+0qAcob(prXFr/d#,kP;mAbr\lpR+ +s/V7.Xb%n$iF#&3t_5@M]AY1=,S_$?LR(qV:e_hY&=@sq#O:.JTg!K&-Ei +WFnW4=+?FkM!-_k,^`?ZcW%YkQ:jU"3;rQVGlJ`:d[[8rfcc'd"nn4*,%5NIS.YeH1paDMF]A +Sj`1,s+'iSB=O$%(er&_!9nudX8E+uCq;Lh$db".2[52rd@C+^mY34#GZqqEC.Ajeg^a7H3X +(\q1QWT?ndk3tl[jkahXEr*JGCICcHon5d2ls\r*SrHIh25*YFr.FG=tW(P:89k94;7ZfFZa +W\r'B2Vd.0QjU3bTp9`S+T8-0hXB&:>$qr[e6:EN*:)D+_!rX#fC^/??Ku_IUbg7670\H'b]A +@:fRN3HIo4B8ts,#N%d9"75T0"D+5[fSd?h%AR8Q:1RUOZeroCsm[;n4BaA]ARY(2XL4?1.4q +n-;]ARuXV%op*631f((o;`c,Tq;>0kK[1=dTfsCFm\V)3a)f`Ot:3`U*6S@Xd$8R%*V99M9^9do'Pio$kE!]A-nO=/6ESd^T +V#_DO^Fa:?5/:?)/MKU(6G&Wl:%aG`nPB!;Zcf9n4=N*O_>;t?OE^+$A!bK^n+Qr990Ym%V +8d`S;!DL0OAZOA6@hh-A4O\[+dnZ2@n_KOP%/HdG3.:37/_YJF4MER_>s(PYb +(VQN3U-Ls84.XEX@_3p7#li\]AE:fOeXq:2j!__#2J[(Z[T[e9[J^2N).5MYbG5W-0BV6V1'RsPEJncpD%@P"mlAhEoMW9P;-jGl-Ruk +7ZeC@LO2L8+Ur4Zn7,ClOXNZJAR&`D&`oNIKB&.g6re%a9s8]A@q@r1krud^Z-hjq1D>7p,uO+tekhBD\RR??oiING0`oPXhST/h04 +9+Sl^3h),,V6P_Ht!9Q0BNTdhm)t4Nl52,$b>VjL:,5>#PelAb8id5t +OquY='pEgo0PC?!/Bh?(5qoS0sEi-G$IfWWs]A88h(+.eEBPWn[iE:O8CF/Hf3\3G';#/\p(- +Z&_dTP?`1BEerulK&hU(c;ZND[_89`&gd+GnR9_r?2-bX/MB:E;)DY_[V[KL$Ir<`$H`#KGl +&0+t:^9f<""Tr']Ao'2\(:;%h&mE.-UocS?lA34<:bUpfLXE4:Kj(oe9]AGL,1"Z1<5MdA$+Hu?lCYfsA[e7-55#Ddh$1[*B+ktq]AIB/(>WpUU*LjDbgdaAr8U>\0eu +nrWUIL=-ef0[ZTsa\%Uh+*^/Nt3/ndI?DoL%Vi+G4F"*dTN@ +i'Fs%J!?jX4%+C[iS#1[KaP"BOF**7"*oS\Dm?P=WNRQKQJbKZil;!cFGP%OaF"GAr"?.O(N +eb/2@Ds%N?mdm#\gg0[S_667BH\Q'4dl+4[aog3c`'q5;Rq\2HBO:QhY7k-XBZ0lkc']AK:*? +rr2'L(*21B5H5-'p`O--5!H:QEteS,=g>_/ABc`3[HCq7l6s:aq^c>kr#,)>?bu* +q5@?tOCRC^`4Jl`g!Ulrb*ilW%iETq(Q7lJa!5G_!rDb*gP00=Ba1Dus?9Ijas,,`Ym!'p3; +:T"C_Z:("<;.SbM`e;d99/Qnd(fC(^&[qV'2n71$?l,W.)u0*QFq/bf7*cpf8">4aep7'2ur +Z':SMarUF73D'^j58!LF*fO-tQL%+iM5&'I>2;"`JeR.@H=!Rqg-jeUNZKaa+.8K@Lf]A!>MpYZNG=`_U%d-[56*)tg>kVfh:8X66%npn_S7+Z1mS(&Z/4f,39J^69)FRJ@>]Ae2_no2n0^cR7h +dS1j\QUc=:<7@.WOL0LgI4ob#NUn$nCbPYB;)1'b-%cFkh);+t=iXXc>c5-N\cY1&ABY8L'g +C3V?,>DgI1K\O=,b?tqK[i,ROfj[fK2'R/pWUhRd&Codp\,S.OIiGY,o;C6GEt9[26(1>9\d +6^'ee,'VeMSr98b7^pbKJs=Sd(hP&(5NQ;U+VE'c4/*PL+AsT0>WFT)0$dpc\'b_-cDI-":ket9gVh"NN`o$:F*odU3QcthcIp9/mY6+Q0rP+:Kg+`llEIrrMs-"#lL +JU3V%r0UQ0r$/U+- +@=E83lCND2A^D"n:;pi$sQDD,'d`J4%[$5IEcg[2Y^RGR=C5idO7C4LcM<9PFh$<:+ZRMeX +R<*Y0da-/4Nk_YbR5=Tpj-XbT8'?E]AHenm]Aqk?]AhN)8`Pc5Ld@gJSFEt0Jt]A)A>E(+l'5NM\q"ndE?oG#<>$M\"\bukCOXFe-/T[@ +77PIC`m`kn;;.\%k-J2ahS)A?Iq"[=IB9GYB)"[BOe`aeq"X!\.eYV&WGUFE?!^qP`p0>$$I +LE`(u/nDn=O4AWAcj4bt` +Nm1NHg!_Q`_;H]A+J5+&PAp>;n7G +Ve)rH(_0jIu3sRQScbf;lZZ+j\@@jlh#$'12qBeXBFM_plA1B(-SPJBCjFaX+h5Kj?FmY(_2 +>[Dk"Y;aE_>6D]A=Pk/#:Y]ArWUE\Y,97d%h531`NiR3D*?:`S]A!ch#u_K@!#jfR(W#Jm +_G5Z1Q[&"#]AW8!#ijnl:XbX>-cH3r&aIYUqV_iS2pJiWFh"MjJA=T,%9[kW?k1S +Xjskqod@?G9=UA'/:jj)6Bo0aWYq9B)S?qQT^@EYlkB/M5ooQs0U%g\Xmm,6<78mg+hY>O]A7 +'fF*5em7nr*7MsDb5i9*[FF1Kl@_s*%7_[+]AHlj9Ej.LhZ\%"2t2k7PcU87)tW9::953Nh7g +K-bkV^I_BHG_rA"aDk8:q7"]Ag<>Y*XLt&'N"+,OoMDPf:oKW6.RnqVFl[4Um"c<"!^F#R1-6 +tYYh=8PF0!KCMUCHl):4uV9,)LF\)D/t!AON4:U!kT\7tZQj)6,O-r?[k@e<(@ne(sl#tc%N +a;uB&e!PnaDUpU\N\9;pVRS1M+5L.%tj@@#U50 +ualJ\?Fi4H-e/I($Z?`%lAB:I#D&r`o4cqZ+GsjIhKC<_3,I; +_-f_4Z!Z_#"&hVWV\95/u,@h]A(WP92e2G9Joe[O8il5"koFM^ABEQ]AKHC\e\0HV8^RZ&s.Y!U]A&_OK[lm\lRa+i\o\ttITNa-k:`3ip^ +3=b%)_?\j"N"Lp60e,J/6K2 +1!.Gr%/\IM@bhQPN#SXI]AFNBqqmK1tBqZMhD0"If0>.b7O(Oa(^2^fC!IKi"DO'&a^j+"A-" +sb>K'_o)\kSXB8p=bm]AX"TT-5]AE[(i:n(/I_>fgA2C:nE8('<.$^p +WL`_PHMJ(UDAq_oPB)lLPVCd"rj@ia9E/25X'<_80UWN&c9ZUb%J3)2R;%2eMhqPGVkHgqd: +S3:R9UiIg)!q'!tUK7L7uXDJB]A).HbdpmKdiC8Ru-B)NhE4!Rc8m?oB'>1+f +G/q#rC1L<$hu"p-K7kQPI<2rF +tRD9aefb9Me17md?,T,nI7#1V+T:]A!"c6&u$)?/UQg(q0!O,cAWQ)H.%,/\?FO(R5akQQ%tC +K6&]Ar6tDeMfO7U"*t$aI5D$?@1XHRJ"NB<%cjoCCD;W1.)=S%a#Q5>o4o5<8O$QcF#S[ug\7 +,ZdSbp72EB@,.;_<#1#;bXh!^BQ&Ns`):QoPt`f;u`\(/ru4N,/bjaZ9QN-+C%aQUA+Y- +JMJbiVUTh9jOS*sj-k7j>D8]AP#7#Z/5"jXH$0Shk%%#euBaG#P=iUaB5hpR\G`Pg=bg4sKV' +riiuYrlFt-7&U(#;=EDATnL4k)[?*;85HijWIN*Y2HrR$2%$;W:u\,bZm3^= +_aq0c`U26%3`$Ss`P3"YE'\9i]AFThV>GlUGZ@aJna['C.nl@YA0YB%hie91)3X%th_I.S;g- +kk*,^j>2Mj@9`Tae_DYdOhESZ6%7o1GnG3Wg`7PmEl`m:-X:-o*qo^HQeV?3cu_\DOeT,T,( +!!+&Yb(3$FO>(f$?5K0QjNr*eK:0B2j;UAbDB8,`niclT9LpTQh_ET#hh+,W/b>>sHC4qu!]A +>o8t-%kO]AtiAK1PD0)p9E58@A0a0q"ZC36QIS!+&*;nY7p'rQ%X1?2LJ7#ju$>DM?84l[4k! +BRU-QWAM4bVt%T'up`J3djEk^pC@WF,m;QG`-5[^OcdE)n-I&mi!@n,KnV]Ag"Cg'@HtO74D^WlL]A_VVb3`q@%tE^"*_X% +=>ReE,FG:2pZP[LATFW./]A-$0^V(17tV&SNgARq%%(Se,:/1O4mA(e[;Q0B8Pd=Dl[WI#EM? +9Es246okD=IWO)uJm^"s@(lKsfc4")eK*@j3qmDdh#H-hpPd$e/K#g?I6XC_iT*7qD=Gp;*> +q]A-G!]AnT=gk$_`smk?WlpW0:+J-C7(et:s`Ep1jVJ(ANOns8j6i>?@n-[gf +B?*31Q)AX9[hC>6Jjl,2@^gOnKd#(6[%<\TiS,K\@Q%>Z()#0(HB!>LpN=h#H<10pjur;)13 +7^MDH("i0RG05Sclf#MZCm- +uFkj99:Vn<7Omqttpl4:qQ:S;UA1gp>)>T3AsS3,:'+bsKoZ4KcL/\?JO4H-o]A="Zg"k]A,h_ +on<(GNUW*eO=;IS^H$![XC`U?! +,?L,!9jgb?V`(BjDe)/Kg=i9H2rODW[k$[6q8&_0sK_=HZjiA\(2Eu:T_aq.]AnC+JSZM^Le4 +=^+E&r5]AW$mI@Yjl!4kku2FqX +m5CT7.0cci*o4"TbOMiCZ;QZ_'.tb+\)\"O9d@@9L&SPdFS0[cEWGf1N3!";q=Z++LR6gHOH +HC*=/?/g0LY@KZ[+[60/Ig(&YhdK3(!C!@`pu>_:1[S=IZc3"\LZ,l=)9eLeTg%LVp +`_bm+g`2-p]A33^N'rk5%@snuJKFtf,?p\?8lS>jr:]AU:J(#7L3i.S_h93r4LSd0?lM*m-:ON +?TB4$6RiHWBF()c#+5&_8D,!r)M-:G-=G'MGO`t70mNYV\$0]AEWd>5)GG7& +f:[mU'TNHE>>e,0o4"3GCE>EHHh\,&Crrg?H@qFNpKfBYVc3k2!NGQn-4YY>.Ur/0Y6QR#^& +&Yb1048D3o2qCX.Yk`PEIYdgMFba3AmDL[j04<97^gK$!&jl&EWlK_o%o"+gLN'V7FYTh*J"\KV6G3ZN1i5l&deBPSeRQ%!GN)6,@/f0[W:2]AZJlZ8 +'qqe5Np3e!!;LtP_XPg8SIJ$^Y&O."#L22I;*JXne6S\9foq%c2f9h>"q6'*fK6m;Fmq&VO( +QlBCAsQ==-UN"ljL%sF:::!OCI[c5ZOT=f`ndg:NP`pXAr3VT?/[6?=+paj>mA?1hJC_)Ehn +;,@h!A0/qiGBOQ1!*'=aSKl.18m.H"qZ"K`o3=scU6Q#_bbtD3(NgYc^d8Q,cF![:!(:`u_- +t**bq8oBcY296p)g8JWe&"hWY9JN'D9*pXO$Jb6=6^j#j&S\YA.D5]AGnd93hk2.m?(bpo>bt +XB@-n3%7KM&3!r3onaC1-rR9\JQ>lOr0`4+Y7H5;86rrq#RpX,Ya6#Z?[D)3jLK5)3k:g0T1 +"i&m*G@T^40aqSBDZIOe\J?(QGt:Y(7pTO=K?cE,;[bLd/7H;9!"Hp62lej1\U5J$^AW#8YC +irf",#,k5huG`p0"mm^B\]A0s.Jo3YG!I<6tSmq<\.L0)%5<9/bm`'=<24:Zu"d/lCh3>TO,, +:n@>2s0G!`gDž:H3[nJ`=9P5rNaC)U=t0Q)p5RhK/m?]Ac,agW\Fr,%8Y':,9+piX5#?Le+`:P?RMC#CAm3[; +7l%1ZKG(6k7`@k'VW9G0r0(1CeM&>V5'2`sRX=HUr+FQR[qtFER'MQJ0-ha?d]A4 +XC_"8k]AK-4?iRCBNMH@Ac+d1E:\<;),![D#FT(q_44bK@&ENf?e\e#hJHg7X`U\E:)mU0L#= +MC)J_UY$MRTm%pY_/V[V=%F\+FK:0"Q\lr?%%5nmL[;,'_HO++!3/V5oIsL^0T'8k;Sp*RBJ +rV9qH3QeJZN3\#!D]AC#*X6WHG@s84?l,%:lj(GD-W)\XEKp/9"O.I(_7=A'gN;P-8'_CkM?]A +i0%;Z]AH.kdQmpEQX%efBcf>L:SPA)[8LO2BmHRkY48md)qA>2;<[_Cg7QdP`k:^4:t10lTPQ +Kg!!P$n"*R*qgTYFq;A)ee=Y5:2gC:!3W!?n:gRjqfmA:heeKZWY6en&Cj0k:hf]AnRXZi"Tq +47MB+;:.b"Y0Su5'[5\^hCQ13<'*)#_*/%Pg4n(Ql'T&$&jKK``h,l`JHOhSn%nHfeon<"8G*%hDr)#jLIa$ +Ep:>cS3?[^dT7ulhZeQu!mE`dU&K9>]AT!shWp?=+ne\MY[2f)Y"u?KKO4AkuKdAhheFjopZ#e +N'Ctee9Y?<*%R60EX>\UJ5`%D1AP]A>2\C>`YDN,(AHTPn2I++=pU]AD"Vei29uHrreklY;_ti +O+^S[&_2#*@'.*DHUS67KpUa,57D>Z5,dbs$eF>C@;kf."e$2n;?j*q*6!sNo[.eZ7Sh0[7I +blELL5@R7T,pii95C#B"A=N>s/$BEH%-f^g7W_G?G3OcgHPYl64dpO`8m+_cm]AWDb1cal=/\ +MNC8ui//iAjlm?Fsb,T%2-\ofG%u\DYb"(sr;`;/@Y'^&BJ)B*VTN_bb@BK_hSn=Z7WUHQ#Pi7&R0-B-3jM +Ld5[8=JQ:tY:q$Ufj(At*FL/ql?g1#flXFu4WW-@JU=CHr4mR#Dcp`QSdpBhHGa3/;OS$Zkc +I0^X\Igr?e#1**Hagr<:iD4V'8KG2fm.!"#'-Qo]A(=T9E/S4CKrO,^B-.J=hYTQ +@c]Ah")u#V+4@i"]A$H3m`./!ODSaY,1iqK;^ot8X(q$cZ>_`c=h`#-:o6J`NFrKWN]A0S>c#a@ +[nnFc72U;rlqd1\[9A<32)5Cr;!d=BIC'eI#+7O,koQlY[qC7o"nkKo\XphAA'WXKf5Pt#'i +JJ9DM!\"R^m\l+:`?F8IRr +?4=k&gCtG:?d8NJ@E)8W^XY*bsP]A(YT[T"2g-6n=,Zh=jafWdqS6D_oFLjh8sn[nha[qiJkU +cNQG+r\%6]AQ?#Ws`IF]AI)dfQB%!LFC;X+8'Ff+=::N9H4!R($f4p'-5eluBr1pV:7E_X=F:^ +[6`sh$g3a*bM/PFddV)D&VX*.e]A;^O\/k//OXu64AYCNC"&q[n>!(V_Sg?=W,X:I'8^A>Z0f +IAN0uX8iULQRJ-32sVEciKOkQ`&(ngE*G5Kp^G5/kr1qFT5eH&@1!RkV!U#7\d-70l[/JLii +cH#2b$Z6?$#-.iLUDGtH*Ccq:oa2?dDZq%mSrK3Dm:3m3b"B1UPPOKTPYW/+a2%[&I^h&rcR +-O-a\amAfel\0"?58@@dna.-n>0&aF2>2\&hN80";&FoLLUFjECIKqMk54pdki"#@dW!SPU) +(RQiX$aP'.>$2;>oHiX*4:Kao@0uCe'^uK9bhT?OE[P'[X9s?)d?rkgqg!Bjj]AcQNWG[,,7* +'.?Vf#"@d6`\b4`#qRP]Aa?Nc',=[k<2rPi=DFM8aDdia)J^+ka,6iq_hQN"3F +j8Xo!ilpCmj[U*ReX"F`2:`.BCA"!UoLl1iHaRTq<.e?s!Bl"h)fiKbhTbNN1^Gc64b@Cjt,dt9LqW!.A2:OW[OSY&< +,Zi3^OLKS/XNP*34/+c26sR=0H(SXKF%KYmL:iceIX4ku4KTgj?_]AXnAiHs*#1WnRCSYk64E +Qe*dn?qu9":Q'\9BmNH9AbMsukqCqI^IgAKh4Gi%u%jGlg'Heb4-*=S2+j$`u6@(s&,"!QYB +laD$[VSG.VN"]AfBSinB;-d,`.5q,t2p=V=i`M95^h;ZU +*b_lC)9qjVgRaA_K5d3PfjWjX92a0pe+$@W(?b_d:^L2GWp#-Rm3;W^V&ZKm)bu<2sTOQ%f/ +#Etj6W7)lPHOEC0gW8"oqG\]A',IWm4RroI30qVqa8]ABV^>h;05VDiI6HGI,]An`E]A&["81nMa +Bl@WAW?!S'UO'?Vb-XhWT-KX5'>R`IYhE0Ee]A18r37dUlQDAc;7tkS,(`/3 +m7M$YfE^8BFm#8jO%EZ3ubcmQu)oHDf1AO]Ap+fe@[j8\J0>BBo#JILlAtd*''PL+ki[?I"Lj +Z%@-o]AL`c"\Wd;Z4,b7cPc\?b;c3!DK7be0niWj1X^1;5es'H +'CMl*6OllNfq/96J`A#O>Ct]AErRm5\^TF?p?b:QFX_>]A8l/?\85XXqiaS+UHMon+gTV`-)oK +)#flPKSLp,ukUZ6WLWEM"4)IdDg1e?bV_'"1Rq3,sHh[j6EA54D=V9$9_k3W;ubfu6s4tamp +-Ynl3,"40E47@XV+fsZdQ#i(6Hj&![KE,WFj."\^7Z:/SB=.A71"9,0%[=OfOG +=<9CU-J$8$Y%&_=tP%#*7.WIO9aCnX)m;8WNRof#V?7n$$G3e:rfOC/'sL3W;\K8S89Er0aF'1:(T$do7=nOlX!4G!8^!L^lEh"XsTA(OIKr6? +6KIYoJ$U<[P2T1*B)5P>I):gdf8b5j=CSa@02V\mRes$2fd=4o4t3L$t;m8@R6hVQsMMj#O4 +[X?*@Zd1c0rpBN7[#`l6lG8LF,Xc97@8H.h,U_3CB7<))dP>er2$Hi+#tRWgI<8@&&e`YM3) +H*5P(WCk>\'bpX+'q"i_lK^SX>6.UhiIHo8oQ5NMEa-pu(OXYq:!_a/5"#)#HL!iciZ]A^Jnd +O]A5$WX;V-H1b#4I)kFnX'V$qhid%H?fee1rkQ(bcl&Xk`sWp<:-s/OGudB.C.:OL>cQn*_%NL +l_Z&g0g'REolBUL1Tm*qlgT7l2p@q-DW'(V0U;kQclXB?L<#p>'H6[EEf$MflhJ-CWZp"^8Z +ijak=ophWb*fAB`F*daJs86pH*BFmaIK)[J%Ae,;r9,Tjn$@QS$4b[`B\Dt,R/?\AmChScE* +EtJNkf_rnOaXpW0ojBQY6!eo:3e+/*,8,8bAV*AY\N:dl,DY1VYZRIr7 +sb0RQh0b6F2RZn%@$W6Vdu;/l8a%CbLjOMLF%E4:$CGE:U+_/r%'meprQnes!Ju.loUSe9J8 +1hN&aEdDYsWr*qM-6:RS*7Yh6H2cb;JnpiSt)4%$[A<7'0qQ9XOpfuFE#E?CQ"Aq&kB#l@g! +\S9/G30KSgjP1)AkHpp3pCNc#@o;EH771B4C.bd.=dXc?U28LUUXJTXgd(#)-NYq5FO`:'3BIT01gcZGknW#!?P9us9477qD +3;G2n0YDtiZX:,9tHq4_T),aS2aARjMjB]A/A.]A>[771mrt>Y$:o6&quIop*e#.]AgGbK*SV1+ +rD8NK+K"@U?Bk;0H>#UGT4mZD'uu,B7cXi7rWX#cI"*^/ufg!G2>%a.I'7:7dh.M`O+kcoXW +CXPk10Q8#HA:H&u9k3YJL2'"Lf(_B9F)@`T-9nQM*C;5KK8Z[@%=Eq=;7n.>eYKP@Mn]A,'GH +NPje;5H]AfFLb]A_aoQCZ9,k7'<3!u5'lc5-"P!=sbbPn&CO7Cj*QRQZ:_FW+qF/Df$;T7G2UX +AU\4asQN@O;]A(0?,./Sca,3.r0W:"XgNrJPmjS%ek]AKXpi[`;sX]A;Ps,roLn +Vhn9uOs3r&lfCVPse^ku9pQm-'pXc,>W**2B5qL&_^8kLgqqg"]Aeq6XAN)H0j<3-*_i\bMkZ;!.#iHWog`Yi[O;Ti$2 +KBQ8k3?,%,Q;I#3L@4X[fWql6qN:JIV:Z`:'3BIP-rpeS8DpUe!b%1;F8t7oWZi__oVCoL+s +[YQb\:=BpO]A=/@6o`T7PJdHac2f%2c'^K_Af@b#ahf-3C:%R2TB5ps1G>eN`]A0@]A(dVSDX:. +jO7QX"0C\4lRqB+R&uZ-uqnM30)K\*C"kcQp\lt*6Di8bB^^@$`0!U-CrB\1WP-=504YTLa8 +5W.+/Bo!H:"J7fRu,^&s7g*E9so%sI?sX%>lrfLC!7Rh-8RWms3RHKZMGS2a@ncSE7r0,Zp% +KFeN;pk6!@^`>g,;-m]AFESqBIUYi:a!:ePj%$t!'#-#&,;o#GZZ!#nIch$WN +dFc]AHCA;CQM=UQ.e2PF&j=>W'uahZ!Kr?nU1e-GJSb3VH"(TM?O)=$qZ+&6%m76r:UC'8i^Y +96B-Ak/!"B)::`F[ElBhDN)LkSefTNuS^AB;-/cH8;/GUm_^]A-1V^\\b7(]A>,/97MTJA\US! +l#.nOp&96r@GS$; +68!mTO1iH3"B/0*$hpPp1N"J7U%gqW9K8.n=HGX\_hsJN?jQ$?Ae%?_k,IC-eFaOW:c78RW4 +FSF[U>Gj%FU2Y:uOn^Nc4mIl*u1%QEpWhc=Tp.I4n*HapP4FY"2?Xt1:5nXS=-5&K\M"I37g +kBnKbj\)iRuN;nj!VtJ'(RKIO5U"/Y(UUG(F17O7&tK/]Ae_YCph+pL55k+P4Sn9:Gj;9+[(m +&@+2)b)pSQ?>P&)bLC_m*3CTI"/$P*/?]A1QW/p#ZIVHd%R'/?*d"oZb2$H-%>"s +nLH1C7U\S($?L8bYAQT]A7i2V+;-d:T)HX=QXt3PE?0/"b2lEO)iLqRoHY$qu;G`,%l3;CF7; +s\2=K9GMEG:9@BiW7!cGRYX9aD(4f"$8%6lh8IeHA9$ZXdr5o3KG=01C=a!KK$=TrF^tD/):H +Xbmh$24t3aaFuCH'_5(]Ao!W/;.`,:j?]A1YE3`OY[l9UBqr&iK:2rN]A?jStFlODqV#,?"2f&/b(o`L`aO:/b-129]AB]AJ"*rLhb(Ab`RCR`Ye5:9"5?Z&+TJO[N\aK! +o_ChB,mc(4ZCukAfB#c,V2$)h'CQTS.8$oD_L74sR7`ht96HP+76c7((UADo[6JJeq!`o5KW +;6.:TmG,$U41>jC7>T.[-US%pu-/<\E6\^0FUMj`Q1kHM,2*T2a5:6o=smmc'VgBo:<:n`:) +J+I]AiAgMY5NB#VSJ98NsF1bE-)14u:Tp8tift3E>1^.5+[Lf'8fO'e\R5(MU'[IYeFi2&&2N +UrHDjMQ08_Pa8&>Z3GF\M?$UWTr+tnkFjUPbq1VIoo"eXGp@g1NhtAe9]A@F+139!C'Jp*[L& +9'Bcf(!VT?t"Dm_7ib9n\1%Z(j4jHZDg._)i%;oDeGb0s$S\r[\X9@H)&>20qA52F5[CX097 +;'g!d:R"1;D8)i37T@IJ5T"^OtH3oKG01J]As,5(X%aNH6dMOkN3&J?Uf7Pa8JhqkVZYP)!p8 +79(S3$uY)HPp>6NlRMAj"PfO=<5Q,S@L#>)Q&RPSjFL)KXT#`Fm(F%/jOiAl8[>&q%XTjWR\ +PTY0n5!'UBrHgo^LB;6$e(WsX!['rkb?`3m)nXa.=3ck`@_WYY,a[7F/mFe5 +^5`UB+aGDC-L%9+cT6OI:^0Pigkq\@iYSkFX"NRsOHaF8hg%WfVuS3U\sE+oF9_:,IVrj[.B-4.^g]A;42"t[FgNB^a.(.J- +44W0Ls6d`LD0js1>-s8J7NB;js3F;jP$\40rBFXBbih_'#Q+[?VdrLS@ObAt[h3]Am+1;<^)T +uSeGTY-\ZC5JQ/Ici9P3tkltAk7d3!HgkPpo-S@@OBoh=&*chbkQ;ZT?@Z9,QX]A+$HWJU+m9 +B2!FR7u4%F3N<#%:-5"SkT84d_77:THGM$/efRf#ja&q]Aq%r-alF#W/eiaJgFG;ac/-9DK$K +^IuX\rpRP8cGIW.5LZ4=KZ)A`6's,t\3uZJ@qDJbF;5rE/6(5aUr^p6aDDbMDChY[TB8.?ah +JO`"^Z8MJa,?"FY+F_auOMr8H>]Apa3[[^[IeR";O`>8$pSN,rUSlS$f=1t=?[[E5jUa%f;ZP +1c8g:1?_%]A-Hnqhme:BuTItZX51Cp_!(--@>P&.[QG3U+nGbe>CDij&aqa +_F7,lT>]AKUDB%eVYo.%BtPhB,Dg/Fbf]AL5C#21q86i;#E_%*kDtH-E4UiHEqdcB!"6T(d)Cg +>%["#&je#Y.c*<4*.g/C*J)^EjHA>6Q1KeW;PD +BdkBQR=5pB]Au2cHX\aj[?%"]A4K_tCtg"fEA*BnoJb[s$p8LSF#HTMlRDCREo`PFU7Cg26Yu" +4jo7c&iH,Yr\Y!n*m>-/A@-"8+RdeLIEjgW&Z0ejkYA4g#Ngc +d6W;?@/E+J(6!S:(Sa%2G+mQsTN4q\4NODlTYY=tT6k01OAM7N2"$5@>nG=WgG%7/AXS*Ul]A!fbaFZLhb4pu[",hG#K%g36COGd;\9";a@%0&?G +]AI^0N;[%OQh2d[SEu^0)C#D)8p*_852mtJoAE?jO^8:dZhk@p;V2+2Y?^Tn,+GI:X5RXT$![ +4c2.^;IeKV`"X)GpHoUF*O9eZ:``]AI=ZTATE;o&:UHY\V@XsrPL&82q$OS@j1Dd.M"pAY$]A? +s#Uf5M0>1#-K8$k7:[IOg]Ao70;dZc,o2%D^S=p/1#+i8Ed3bR?k\f7/^EjHZ[(Gou]AD?AP?&7fZ!Q=uHkE.m4"A);.R+cUN;((8am"C5JQ/ +I[9bOA`lEJRtOS5o-nFkcoPk@\dH[MP+q$=X(7*RLj)P*GROa3'f`,+0nL4C;#gT-9h@`=<) +_uAM/\?675M,#d#QdQ\/2CePI-`Hi6<0-JU!F'0Mh4HR7_M6+QQP:-fd,2h`oqqX)HL5V(?6 +Yb,Z3Gps:DYQ`#VtR:4EMejm&0`gD#MjI5Rc8Gk^KpeuV0?[M_\mH%hj5393:3olR$\__?D: +IgBhP'@RdTOR16F$9iB$HuGU3.6lbC=]A5W_QH#YB8^36j5fgKE,7]Ak4;S%Q-[UnM%;Zh_[R\ +4%Gtn+Y]AJO)V*WT`_D]A6,t)$`h4c@(c2rW?#h^85pV$eVX@CYtrsY]AA#4hMgcZ=ZUKtsAm:pT(F:gO^-m)r#>Uh(Yq/f +JY%IDlg`9Dg@2lcN%"HHo'e#TDKge(Z4T^0LngnlS,;iXQsA'2g&]A(hpX-r64?!C*X6VP!G0 +o)N9h8-3Qnr>9Jo`>T_G$,[N_j,0\D0dq]Ab5k9B)!$4k5W!qf*QSj.:%=$L%CB[?5m%?8V9c +'/8g'Gnp:/'nX$ju##W+? +X]A2YS`G?gta8k.m%GVfao)YOjgEfjWXR#_WB=r1I&7#rsYsT+AYg1`gpJq>'V8^=Lo(lY,p[ +q7gM\d?3.i-%>"eQj:p*]A4O9B%[pSucTgrX8P)9I?4n1*&#"*imsp*.Td&ko1aT=j8^VF?Kj +9B/+9,)u]ABMT'1=W;b[]AHZ0Qglqj[bd("N>J:-on=esr,8McMF(oq*Km^KOd(uZ)3b&7M4Z) +CQM>S;,\0duHt=qR>mVGJ/85$e8pdE=C5LU609Dg@2lRGGR3skN>S7/#-RGdT[nREfhS1d`R'CV!,AEX&gZ6`L0fpHaNG +N,FMp%R[D&W\$#c&m8N`230\g.p'nMpWmIHor0#ln_JU<61u!2t#!#:[6"d0amV7]Ao,3Rc32 +$e#d"YJ*ijs;MD8r0:n"1`Ln5/q0p[NHHQ0L[*CcUkg,_;EMpl$G8d9.nSNU3BN(H"?ZS[3> +)tk>FqXp+3cl +rH0llLo4DuToAoP:fR*fH?&`MiRj[m8^r_#>d]A>Q,Qu0C"7W,o<=fq&`I3YSMrWYt.R3`4ia +Vph8B'9Dg@2Zc'&J?@3[A1sG2i,LN7+Kg^f+,LD\u;.I*?F1[ei6fKKPI\t/El>7eq6_ATAp +HS/'Y31#T]AasD^G0ZP)-K,<]AYV8F"c!3Fm(,Kt.A.;H\5c2DpOP5`[4`t9tQslV"b4?ofRh@ +L@*0Ku=>t(ha4DmJ,j]AOH(S>S0%b7"gq"(%#8QT*Kio?+U7DQ_c=)2pQpLpmf0aM,^u#Db-3NM[)DDY`@Im=2YZfg*qdH)^KQ/+^A4p)n`.K_\lKhAmn!APJ?soG# +]AUKB:3nIjjN4.^<./;[+pk?(MKRu/ZEQ;e4(_h@?[Ib`:=Wit3ao4s-%9.!"AFlKPPEgo%_` +5l#QH+(lUXK#nhXQb:>Ll'F]AY>XRC]AaUrWQ#Srs*,Ys&4@F[85`8Mp_CWs$bn8)pt/kMYsht +,\Nnq-7Jso?i.bS^TL=#-na!0O*V1RnVLG&n&UV9aNVl8`:$rcPXAj=aH0#o'oJG$F6)2,qq +WmD47@WkM;M[ts2^tp.,HoQrgC4FJDfkP\@XR +mE4=cnmVY=B]A=YZZG6lRB&>X;i&(\86b;ofJqL4V)BE3Y*bV3j5,U>#u9/`3'm^mEuoCKG7-X)(RasAZ@TF;(c< +[\%^0JdL`ks$Lf.kfBD#-M;0Y?@#BbuCB[$&co_r!2D$[OGPPqF&NS"1Nfj-a!]AC25f9hmG&Z(krr$ttRG(eY\80^P'["iK"UQ6Yl+VG1a"RPUGV`j+4<*?d(mQ:g- +eLe1Z+94K^/@&YMMi;'4qU"Z/`bbQolNM5@$#2;P&Cquk)*+Ldm6YNp=8T`erOdQ'>pFA5%f +ulm?PXT:);#KH@5O]Ag)hqCD5(Uj<',#EH`$:\,-CH0u4:7@tL9\fZfMF*_,c%9)-1"kD(\FQ +!U;8RHN]AK7n?dOJF>[AcIG:Xa:[^PcY.*5Y![6/4BN.(-/9h@``_tR[Q=%N'tF'X_Pn2?!uM +fm(#d=)JHU(IMGM!FgQc_[(bP2(t)^kFHEd*VLjmj^-<&$&Tt/j`TQ+E?fgTTk1_"8FS`?U^ +D97RC"]A;5qL(c6^@N@O["%K'9K&S!dD.,oniO8,7DI5@06VbQL8l>Ibsf5mOe0Occ@Z*d>fG +a4B7(INaEe/pUn@hh6%Ap!*7(^G^M^i=huT3QL@]AbNN]A*L2aEEY!!'EYoE(S8ipJ+2uT)GS- +=#pCiPsEQB>b?@makIL#S%*`)+m;SK2]A.+XoX9d@B0g"KR>Y@fg_CRgrYKN;4eU[+bt-?q/. +8O&jA(3T=B@C1^67A;.:NoCT5GoQ._Vr"FntCicah$dp.OR$*.,If8rm,/,H>WoR1u$D7D1^Fg0 +?4BU(P!.#Y<:64^lSVJN(3Qr$\f5pa8d=e)WP._Gu&M7#X)(2A!j.EiQM6L@h6-kZF-s*,hW3"()D?M/M/!2R$_fjWi +W;G)B'Y?f\g(gf;oAQ7[d+(nP+D,Y%Kl:*4DRC,MQqrH.]A:B@P00a2of]A:U0bA\?1 +?@Zqo/&"bsGjm%tUXqIMf+P0N;FYfJ]AWd2mp"G(m=Y%CWh`=QDK_ltbD$&UnB\G(DIZiH1L\ +_i-<-_S9gQY4qmNal8nf'.JQq(3BGMW-c83;f%^'`A)Fl:?;f?So*qg!k.=J7+&Q^=T]A2jp[ +f_p"97d`A%O"V%l]A]Ahp05bMRZ]A7-29^"Q?IV6F5$MISuGo@&9a^U7Hje*$$-QBTUg7\5P5VL +SF1C4Imfc[;!0Ck'V4c5.h%(.se%`SrE6Bt7&h)e8-pGo +(tQE,B45jkA\NuW_s=8)bFWS_b]ACjupX5WIf(>5%Fl3?\418%D.'8*B$@Is>X2Y:hAoGegc. +Z,`E'\LakYH0/&U8?P"k8K&[2"t%CaHhoDRd]Aq=/P +a:tbJ(8=VrFaMdmDR`M91'9+\+ih>0:5[?^m-_p^GLLd%*&5khYSELc54Sp9>9o:9Qlf]AJu9 +oM)3rBau58\f4UCLdtV$[P\"eu4l+G$e;pZ*9PN")^YU/!7pl&5\QH*Ai^\!_6bTdO4D8?dZ +L8ILYSb/C6qb_2Q=$4FT0dl+k@(It[$n<)2+2Soe`HZh"-j(7X6!L.V9Ji.4U,BDI&4)D*F8e +1+Br7.V?3A_OF.rQn:J:Z.Lrrap^8U-RUtId&),42]AcEOroq!b1O,9#mAIfbk,pk+K5aZF^O +#G/$Pe-9H26pf<,AS,!A3AW+ijI=*WNZ+fn7'sg)#cSi+mmk:-8BMEKpb-!q7mXe^#$Y>no< +l^NGWl8E56hkTf_*E6hMP?7]AOG=PSA?B.>f"6c!a?^m4DU$FnSh7@5GP"&`d&42':.F?Xs@, +J)0VuZS7XoA@ehH%-%Z0gH6kJSXD8tuW4O-^Z7'O;Z+X4cI-WlQI0I]Ah3QOjX6l(h!lrW$1( +bmHiUG2#l9f"3W$]AWIEPsR"G0k;sbi*.NZ>+#04hugb#g5r$Wf_^NMV/Gnk2['laj>m<\^>X +I7#n$Q$G3?&Qru<4'$]AXZKB6e3:%I"%.!t%(Q%JLT4Ae*+S)%I+CK_!(Bm!=hK:UaOf'R^/5 +Jfs4.\>qRi^>L0S?Nt*?Yc>SXdHN)!e%6=#$"&SI18bg4[ +*W8HeBXRn:?YKUS?-\F>X1+p79(7W.+eoLZuio>Md1c0COMAgoR?))L]A#DA[r/CQGsXVoAQj8CsKHGa6$1[lKcrG^ +B]AZdW7RH.kMS!\6.:8X$Bffm"sjfdQ&8%<)4ZLO-fSB2\_4t+b[7V#^^:ls2Z$\<4d`s'1]APJfT",L2N! +XM(L:9N["XSkKsF^J26'`Aj*d(*UFj^-pHui%/puf;"@SVK$_edfhL84o&ea\THMC2K)lLOI +>&jn\W79I\B,l.1o`DGURHaW9,ZE/lMqh5\h7hq[AeFa1(\_W6QNbtedh3amp2^'+65[Q.rVC;Z$-/5,0ALb?sA%KB'-<WeB@R1>jE2_rrpX$J&%/s2W[CpqoQd_dA;/9QjW>dRV+>(-'PN$`1oY5-Srt=S@E +CkK[uk\kHVCC`PE2q\S'6<;\gml2&\WI]AQ1tar$hGo=ko@Nhiu^#e)95tb^$Kf,p0SYFL78X +mD\Z>@NCY4^ke>s2=@+Xt<9'ciW:"`p'4IUrh[Cgk^-Gg2m0KiZ,L]AeVV/,KMVXI-8K0@<%K +NEJh0o*JfXRqo37b'9L<@q4:'nPp% +rX&FejNm!]AnG5Rh9r+GH.+CR5j$%@/T/%8V%3&$u+IVVf'2R8C]AreJid1@+989G9h3g]A^R_, +G;=I6c!;NtV7G:HX"a#OUbkDa#RD,`$M.VlT.fQte;JLCc$q%c"%ZkP3i*.""b"E@l"Y$Yc0>L0lS)"2^PfF]ALR:.L:d$m,8a_.8,'#,O&o_HA +l[Y(7ue%DlDOfMfXDhBm?jnsbr\ZA^,n4?l)Hfo/r8qL!UDF?gdH.a!HF&'C`#?DEk&NS9ig +f4Y&&[=rW@Kil&8,2o8M!bmb;1m?-X]AXFr,I&Qu4t6&?0q4l#@p#/1^QGKC[)Gpn[KAMnVi) +X$L^lU\6O^D40"(a9/Ul5(N*i<'hoc4""^\iQJB(UEFJV0W[LJDfM\s;6gL;g_9k\sN!I@1d +!Ic(4Blqg[?R5De0*0:`a\GHP+-B#egQV,4/7#(qN'$8q"rE"!c#/dhCKmb2 +l!RqiBBS<-n_5(6O!mFD,Pt+"Hd,^AZ-YHtY(PJrN2Y(-iaX]AHjZNn>D/u_n]AC@5`UV4_^%_)PdRXq-g@U]AZ]ABX<:j3BVR1nZE+'46<3emKc +rK6='0L_3XR.#=#rT+@U@Vk\5+]A8MJa`jrIm".hIit2aHg'gPU::L7:b(CG?aBZeH0dZKi95 +V#JK\e7d$Z`N2k!pCIXkDQF(l4cd9n6c3OMcY+Xo-f'j1pncI%95A4LhN)U8#gPp/_HZ@iBl +5tY#9=fs/9,,IC0F,/5Oq=88,`P\>BOUS6tgsWd[khh_:ZMuqk8prm=G!E]A7FP68h!?1W2F( +1S#WEhPu:H"L#EXWok]A[\)]A=M/H^;/hpCX)]AZ8!iDW4WL4 +b=b0PSi).3$6/X64K/5naZ-`I[h?d>$G4[Lr@C0CbIAOInM]ARWB^_nob!Noc",R8,F+.Lels +fTkfJ(`HNXMg_"jB`ncXZf)s.-;6p9%dVW'G;7(X3/1^^=8.7Q$srT9/q;QCV[e2aRG\F\Uj +]AH.WC-lJ,7qTUZT)qcbHa%`Pd%_XO$S=A[F=)am4Rak'Rb/jfI@'o`q7j]A@b&3Z9_`4Db8Hn +VSV@3)>gMgn3Z%g9ul'3[_2/W"f7jCAJ^dc;9#7sEPaU^@Z.Io+5n+V1em.V26-r5Da30E0D +`')fhi,ZsKu-[,DaI&S=1,N1?P?p*N0pN6;3qmp.7;ZVs>aZP<.%EB1<;hI=J\LDLpY#2lG1 +RL>LMQH,\iFP!2+@H\RlNUbAb05!$,\Q2Q7V98tY\_jq\0M(Wb0!`D`ahV$2GW/AV8h77!H? +c9EEARi9]A*F1H6daC/fci:\_oqqJ+H,R_I^klFbd[Ba,b]ARLD@$CjR=3o%Q*3tb#n%._`hKK +n2G;h$%K9cY!Hu;,9irE[W]AeUiO4fZ8-#CZbe=f9p\+o?giOO_ZOB$.lEFSL=:NbpqqTGDo> +4Nl/jHk`5)qNCUuf@7 +Zo)=JYnL@IJaiu);KcYBi&3-91/LJ(ld2bLGGVPAKoa]A8cnqCR"l'deTo[EM0#.jG4;&dRuY +1Ffnu/nrR5GJ#X%L#"g"K3WG=7/Z9iA]AUH22Ik^(&Y^V?al8@;/,Qe.mUjpBWZ16"En+#oB7 +HdH,%b$9epH9cPLB[+Q70,)Gq;nlk'P*uMQ1`M2K^@Y/6[CZf-[9Nnp.UfZZUN-(9NV +@2m_[MjI`Ln[=p-F@ta8:d@@J^3FNtkFA]AAD9eUk%2P-u5j5_&!m&LL@a0#AG`Q*><(9c5@) +!%Kod`=OPGHjt6U(/:nf6):]A>QX1#,Z-9)S[$_-VH:IPl;9l;Vqio_X"&PL;A0)Q]AZS-ED8"'Kk*]A0b\s9qU@OHc80]AS"(gSCi,]AA8]Ar7t`@[9bicP=Y(iMN +jg0Stjgde:7;q\#*i]Af&0tn?8nS5GpI>,'l631!]ACMhfkPUOhg;QWP,IA<[2/A8t4m?n5uV* +Zbf-JU9naFD?7Cm2FRpNaTqVMkJp0LIK]AS'"I83Khftl5ES]A2"76 +PG(OO(OArr)W4jKP't'aa0#pf-X(#>%_-aVRahVmC13#tBCp\mn#k_+$/MaGOFU2jhC=$h@5 +)Y7J?kB1$fn>n*ZhMKYI0]A/4mq(?H0#G9RgJY; +#mNQ7V$:d>gh:EJhkNoHtan,]Ahk-Qc%W[*rYqNJ]AW^34SVG_D,gM_)K+(1e#s5=)/%j0ei&& +oOX7JuklFHAO1-bP_*LolE/::"$7FdT\+4S[_RYiBoC(#40bHJ^Fq/ZC?C5omT&m,c;_3PKQ +P?Lb7^%Y)>3TcI9k(tI_-h-DCJf%Q>-S&AMR3`b><'(Y,L@uJn>>ENQcPd'?@?RIaPXl2W>U +5L$"Sk5cW,YdH&DZP>S$@>B:,M5GA[\NQX_'r2AhpNR`1is8j&F$4__B7@77%(=`Vn*6g$$> +Sn:c!D\P.9@d,=4+r^K8(oHC/Rdd^J*48G7!0nM]A);FOPj$2I:`I3>3b$4cdGROHf3J#<.5Y;O,2bH"''908;Qd'#!KB6joY[> +/^qQ:2AlGU_NsX7""&PD^Y;Z`jNEd=RJKZ;61@j7u3od$QEZAk.uJZe\8H2hflPIc@D)(PXD +_*N=s-:Z?h<5t.16S_">l;7&0?bKlaO1H@cbJ.LT`0^1b!=4a52^C$rKUOUZu99$iNjh0kij +u)ST2sQ%LtJZ> +-N7?JqB'A!K_f3_J'KpsagU^d:5)-/+m0M6d`!2WAqOX<AUK_M5'1h^=]A'-qQW(R`@tn19lSX0BKAnW@j+FnJeFg28)ugWHfOWGr,` +o,,5?gITNAHSu8!IDTc%e$h_."(=Vsbh59&&nNq0ZLS<0EIm!=q#fQhO^F0)gL;_si2n3+63 +@GANmMFs^3V;i`CDU2U@\=TmfiKR>Q1S,s%6ZdI1.h\%!(ol0UDMcORrYq'#@KHdacnEH9%/ +17>Bi^8BltC-h[[3O3&+tgARr(HlfbGY_f&1Tl0LPl^<"M$p@tj'gfV(u4q!/7A?9NPTml4e +X1_7FXKr00r>b64mnt=o_*:A!gOCP@r#H:OaS +(pFTeD<^cC2Ss7kU@4s(*qnB-7f(O*#"?\"C,a_*TVr_T&b):_Oer6^P]AH[%ZO4Y(%u"XkQ% +N$qgR'=E>6P#cQ.1S>.EFp-WJqV-jp&'1mj3K^"n12VG8RA4o$2C%F)']A5.4eq'I:_+-27"m +ltl,NfP9fa^lM>:m_W+!('i_F4&$FQ,q6K+9`'+uA\G1_(5Sh0M[3p)]A>ik7L>Lr\XUK3:RUX1)MG'%aNteNCr$ZWkDnWZWpLNQRbFERed$eO47\u;@ +9%S[]A7;O71Aql#Tf$Yk3VL+93]ApM#K`X;c2b\!15MN6AiX)p]A4C"Y>N=P@NhN_]A]A?]AWF]ABE_ +Rf#K"UmT"eb,U/oTNb,b:hNCr2Y+ks$fQHPCW)Q70,U@uS"%LVTCXdc^'C<9-MsbL=cRjtCjhb%nP +XIsY]A%!%[4IDiB<=\Ff:Z8I.le#KdHU?dJg6hFo5YpDi?"Q`]Arq&+jYcll2d6n0YF_W3)_%3 +0FuE6>%K?g#-'0"(=/K*EI$Q1ueU +nJ-`X.j'%pB[5R*Na@-,G-3+8<1b5?Ts-JYJp$=P)]AaJQAXpD&QHR-;%-l@/e=nX.9Wq=Cip +D[O-8OJ&%SCY,*CrBU/&.t8n&n0adZJ +X3;97@]AT;i]A%1g^g+`ep+!;MW-(im6fH1D6lWB8_FA0r#N\t!fu,8-+ +,R9]AI.63SJ_B^qm8jNcP5pck+B6B7`M00p;N!Z!$ioq)b1HmK!cdO@^<12=Em"dH%FpeQY?N +>Lm5:NU,nked\YqdKs>US9LOgKPE;p(<6R?!'EHC3=jZqDJEc?i0&2oXJ7#VmAcNPT32+;KY +CA8TVag8jA[\M2N[J(CUj`3TFM@2P7uH[oshXlUi2pB+W$m<8;kBI'$11T!k$ +jgd$/"KF<&I9ei@VR<2XV/an70W+^lLpKL]A]Ap^$*bN,sm]A2Nr@YoYN:r`JQth00kdeSZPFM= +E$Kf:(m>r1g:,N-:/XdCpA8;MHRTk[GSn(pZ%`#SZ%R!=7AM;S"7r2l9lH,=e^4#Bde]AEJP9g9%D(1(U?]AbEBo>-7ps]A8k#9@#S:IF9.`":4jO:S^B_kf5 +P'#r0i$)B#*!EoE=8r[Y)6JDE]A*?BUh>$rR\_;-c?jjA^^8$j) +CSM)9_W_b-Y7^fk^Fq@@oe:]ATre!qH>ku`FZZB&:'JjGK?/b2'rQ>3/!6kUe[n.Pc/dj+dJN +[:TX(VA8XA*Fj1,tgU3l0u[*45VT]A0@g($ULdRYIH$"B>5o/T]AJs*leXK)sK<+UH; +7g's+toW?DXXCe%s)5cd,\t\ZJ3NOHKdX^VUuj_`ih_H[s,;K5"Fr`f9@U\#0UGeY0s-EW)'a^N$N0l:4NTUVub==_CeT18P@7`8?69":0X`0i5b0ONEXNKoGch;+2W6- +8/'0Jf$]APo`c;`+,\^/7Z&:4'(WYY+%:i(sU'["kVhgYVKm4P6r1$`3'-VFprenP1IQp4g6_ +4;I]Ah)VnN%:$5JQJT6)b4WmD%hn%LVMdOIY)*J#W>Cd,Q%A*=RWr&I\P&CNhRVB8RUX.[on2 +)bL^M"&6u/:)WbnmQoV1[Cl6Ita>!*k5^/1;fg*% +:U=%^VpX/*dM'lOnnP`&+`4`:M0OGqlji]A$'$b2Qd;dn_MsqM=S$Idl`SC3NkkAh_$"_TF2O +i\cW&[`9M*Ki3HJ71\\)a[W,fDl]At/rQNZRIsV%\%0PNkrO.X/%I3X]AAGI'>>b0#66r-rfWXF7>bpH^VCb\0u/##&OMaRo'`c%UcN#pbOWNEMH<'+*,RZDgp%/YE68# +EJZL['G8./#D&!"HSI,Z2X4=0/6U3a;KfYRR#),`-I*<:PBsZ`2p>482fb]AL?csbeYjZaY2( +WW4k:\T)tT'YBFjHPpMc#A3u=40>d.&"N$K5[ACh+*.Qr?c8M,]AgANg)9$`n??5f4"R[A;d' +qT&]A;0&Mr9.`2#\Hm2oUTc4Tk]A0RQ9,^(k8WN6ojZ_Zb_ji;<;-F'=8joRJ-buAACKe]Ar$;b +^O-n>m>;m1(:cA)=`Guf4sR$LCm:L*3\DG#%`+U31Ela@9b/nlW3bdsb=7:dV7"4q.j$R]AS7 +&]A]AGFee*TtYBW;jNIIH%g(8?\^129QU7k%WC20@&2f^'If7QH98/ML]A2gH;]AJL9tk-asnD*>_9!b/,K +l[71ocYR`TlRUhQ@cQA-bM(ZF)n*AtVWDMAoPD#K0Bi%EM&/jKF,RNS6Z(RlQ0\qs]A6f8:QP +SK*@7K.>o5I?IAkj&NItDQ1!t45Ue4[2Z)Zbc*X*UEao`'?=\`%\([UAZ,I8\O7qp,k:+0oO4c,@Br>9GNX +n#=N`V:Z8(&0AE-fYe0W>;5F +(]A`F&br]A93?OV5B#M^epVu>_k\d4n4>%r%ON&?Gg1V#o_l[ur9-kr>r)kLU(dQBb35>N=7Eb +.in%3)N]AaH>@;;etE[IYmrI-q>mg`qq0;nI)bNL:UiT +)2>E'PoZ68@R^Xq&FfCB(VDN%LNtQ;AYp$J4u/]A#%6)>Xr8=k)VuuG#'p7!q%)g1JIB^T3&8]A`<9=d,jN[ZO-!9f!Qqn=B39G%FtKe;Ys@G +HMsg6+5FQ'qFE?8rr=]A;-Vrob&g4cdY`hQ[IJ`fp:lIU/aCQCfij6mH473V;-fa2^oShkF.e +B>F0Kd]A*]A4,ebWBh[oJS*EpLSL$+D]A,mJ(=Rh"cJ#@DenbH0]Au+cE?9X!C)n +fVX(+D,]AKp\'Wa0f-c<9`=LHIjo-?\46?_SW=JaeD\BEq/Mb/3S7X*:9%u@Xu0bf54*p[>Z` +5`=m"%e12m5YRshh(a17WC#NIH($qUW)rTT<,NYA]AQ5Q.@BTejd&.d9u4P6[Pd5lBj:*d'j# +=^loeWI4=<7XZ)V\,j70.?g,0,BO^O":8Ncf9>+B`+gAJ:_3[J;K+bP"ugJb/4k'9j_-OX)+ +i%FUa7k;KYko;LG2MRLVkYM'L,Y@?W;^(9eAMb[S$8hAa+B99[I7C:Mkf(%fra(bP)5K'H'S +^hX!KfrQ<]ADGM&q(qMW#"d.jZ"U_7nk:0<@Z")37(s6=7.%edq1i480lkTe+P1?%*"e36ZSS +Mg\?$e>42I0uWJ@%JJ6S1SBFXJ[Kh8k1h!%7,Yj:R+r0i2Z,KCf)/QX;(&?d`q0;219<$FMp +_j\:M2ct]AqVctu-RNT[X8Q5UTZp@fpal@mD^4,uBScJ%Aj(^:Ibi>U?l5&eD#8i[oce=^[^[ +qm/`P%Q_Xo7!tcBJip7Q52UDTA7D)&XX:+e=E9-H[BosFdN,X\Z;f2Y]AOkP8u@m((J0q0O]AqRh/XE$$N,(7&P+?l)> +,p?\;)+'I&qQc;Koa=YrPu.c@d'QU5)#1[4o#P(AqhQIa)&58 +o;Gj-tCXcK#%`E$4oee`Bc<.02P+oUkeY`B1p%1e7B@Pf=u8P1!7oU"rgV$>3OkF;C\Q6G`L +.jRmh^i%\TgKe8X9+]A%E^CNIbnaQhrJ3![:_@bpg?mG2/s4PgJ3>EmLO63O@Xp,5W'o!;&#X +=iOdm<)7Ap7&*A!^Y_g0G6[l!HUubi?:qV\a-Ns%QP/`mhYX?K46BrPdtb)j_:.XU7SN;*_6pkFKYd?Gb-0;]Aa390s]A]A%,[*GdP +[(BbbI)2H+;r1W=;1i::bOU!X?h9\VVARe_n/?X%NmW"N4=0"lKhsd_/tTKp2n +Vh/=tT?-Jm4AQ,)F>QGDf)0@K/']AKfooIDs@&)FS;^leC`l7D[$PlLpG@_[E\R*>h`n3<*f3 +<@]ArX^b>4eZQaO,[qSS.+!j\b>lIrk-1@5]A7ic+a\s^^6Bl]A\3[]A.eEn=N4Fb/t#9/NA_HmK +#@NJb&B[i_s8\N;AN@):If*W_uV2>_`#`Yo1&%r'QMds.kPKG[Km__kV%dm-WK"Z=+LH"U'k +k'cP1u>LQ#07C`TC=]Agp=8P!6Jbb2(aSr/+0V!TuaEFd//n$I9<,k_+ZH'*QL4Vu!9Yps]A06 +Lqt`FU_'IR2'l$@b2:-Ud9oF/dVY^U0Gpu"5Rn+)]A('VXoUh38GrK+ntXf(OAFhU +3MS*ll+=pOrT/CMI^#%m@-?q>]AqG]AF)\91UHegrqUU5)8d>^X&LWM%s1uMIiJu9B*AmGaa6M!G5JiM6ms6V^TBd6]A!IkMGpZh,;B(#iW: +A@#KlT9/ApURL`T*W99fAT^\]A(am>0giX"lFNShoO`9]AhmD9hf5m,eG(]AXtHs,JsGt&h>FHp +e1l38.W%g.V::Z,5),7IpJ)@;:n>QF8Pl"k5?f]A]APdj2A')5CUos8W%P:LH> +S2n,e5;XS2f3Zs8N#a^n+WUY8aNs>p=Z;mOek,:+rdNd0PiuPBXC*K8/;((qGE(gU;ZT.O`R +2:\dUk1=E]AH-%*O0sLJeNpq17:]A@6gg`XV[40-GX.I4itJ:5\1YSF#]A3LB9Ako[@h4P5Xt(+ja6Wh6^]A&pH"XEJM"Q/STBo\(*+OUG4E>U5L[C&6X13VIqQJAm%l8qeh +G="Sho!cF_uA(#F6mmKMil$)^&2diLT+,bMutIrs/baGeL!_TS[#Vo@$2d7j^F)&VF^58=tN +F!6p5OJRh8@`bY.q*[iiP\:B!:BY$@Ch_lfk&)>aYTlmcZLM\-as72?"M#ca3Z=n:GfiCZM+ +AjALm/Hsa3;c8&MDWQ,%/$YmfXaY=&ThmT?2_ +Bm!.opP`Pan;&"ck'bqHbF$>NkLg*%X]A9-m2Lms>6*t]A"bj*X1h\Si[pV)oT[hg%8[MM7&NttKh +h>4;LM8/nS)n,CqJ'_DHjmITS@%?9>2B$i]AFIpa:0.Nuc]Al*1!cl(H>InJ6r%se]A*9W2.R4l +>((E#@$]A6(3Pue\(3:d(DH#hH32EL>$YXdG,"f5O]A$e4r'9.3AmT-mfCX4lW-&OTc9@tNB_m +gd`lB]Aim<,l5SVD93XgWUB`f4S>)WiPVuPC(j*.huSV29U/`e]AJN_sNq6gOgq"q>rD\"RmTI +`,sVr3F5-`G]AFY\f39^?(4*3bUFP24J8:LZQ>Y;bj#pp,@F*m-)-! +T*T`/(W[&4d>0IdQJqZg2j;L+[!;G@XDUTf3MQK,5/b=@R4%BN4*Tkb]A25CjFW(-I2nk8qUG +V+0+oeHVYER\a5@2DuP&L/E'<^*a1"XJ8KY_+VQP]Ae&PE1BQ\4lk%d-gBl_u)3[%559dad&0 +UgGeZ5L5UCr=Jsb/LKG*V90LU5:/L&WQZimoAT.*ePDWe_>$%?sGTscEA:%]A4KDQ)QPu-E9g +R%]ASc25?-pn1!0i5P'%iQ^!O[_T]A'6cTcKZN1*pkfKK8@G(G"cG(/u"&?;DbJ$4h[tT;J`6r]APq;32+.Y?;\=4pi\)7S]AQH_qnSufu[o[Gr.?!6qoq.C+ +Eakf9er$94oH2:(ENR_"8_ftp8&?)+.?!)A>"3S^gU:/GgRD7ZQ)Pa%(Tm(HN/N13l]Ae +1C]A'mrhB9=3'o=+MD(*4Ljsg8qIFcf/dTdP;gA5MtN?qp5?'(nuqqn9V3Bc;RbIq90J<( +TdLF1\OV4:FLkJm7m4jbN78JHR.Is>*GIe>o^h541kPCM-V1CjTA34QQO+7 +TbJo6I%kd6hhJ<,Hb.gCp4/b:ih%r6P#kcgS^g!\aNRq6s0kP\`O5@ +0PXMjOJjJ0o772F;]A>:(8bW3lEE4Lp018n++,]AUlhADKHHuL"T/m;MFa!6FAT]A(!(W>8r#N8#t7IO$t60=(rTPit;$6"Xn%,q5S\,9n$Li_qjYr +S[gNSL=dH9hJ,-i:'kZm0>B=O_3=[ +dQYU,\1RV'LW3j>at?O%)rZ.-LG6P=kd')DB=NK53=W6S%]AjGf9:OC48 +`/a?C1HZa=F!*1@\[nD.:H(\?oM(]AKWi=8"Y&-AN<;V`d:t3AcL*%3/hY/d]A^O,oK[mOC@n3 +3"KeW\U/k4gRElnGl9pe!#,J9c,Fo._r[H)K8Ao%!F2r\6b(Akb6EJ&4?^j#q8fqWoE=mlB? +2ZfjSlbEq\!/kFWcjqmeH3TBo@@OHr/SWK?]A&fgi6Cmf=S\uooo6od__Wai-QJ#5ae8j2^bf +nqF`ht&^Ke\R1YYXerl=\a3$R:di7;P"QK8?M8ANW-/Z[7a.0F5E([%oCa=@8WGaA +MTY;iWTT9^O.q#(:c3h3dknM@bZ*gT7,;`^FJ>pV$aO1#4qDK +??tVopq;an#jMF=_)65!k%3u:(6uBPRA9+=`2T#"F=($W4Lo\RZ$mO[&"0GPjD'hN@dDk_/J +R>-#$t]A@8W[RZYH3Fl;U\KfYG:Jnc0p2-$Z-qVDE?XqDhp'nE9`S(A]At=9G-BQllI)54T5"f +N;'^!@nAX+;L.PNod@2Zg\!]Ahc`q;bU5kUD-U?UW;c^@ccS;eZ0&V;-J33'C4S*PTX?l%D2# +![-s1";G%n/:[%jFVZ_,ED>co8C'='X#WE$Wj+(X$D8`a.p*RG&lW^>$?\3CjJV,-i+fV^5e +g2,Q%S2EDi"Z*KmE:ibr4\Sj`cl4A\jNTB5/4RI@g97c)A;Jt*&OpXnG!i6Bl9pPsZ4Ro=a5 +>Au!1]A]A,qCoXlYY:L7BK3]AYnKddYa2*:Wh_j*pZT33TOSOHKXgo:a\#i@+/Wut9X9Sf-J2?;;h[-OS-H`g^?i\^&sDFmic`Bd^8#\hGZBhX,MOGOgFhd(?NAc@F2RI> +#hA,UJH.UTbGc$\e*HPRN&6FjNEbh+FAh8H9L,!2`JGN_M#LAr@$9\OndfqOoN*3&WJ.Q(Z[ +At3ERT8hFUN=B7=glWqbJ)?q>`VpH2:[#cJe.C+R5pU(W2Nf+Wp?f9&H8-mUG(k(X3^/nk+\ +1Pdi.HIWpciUM2U]Af_e30/GY<9hnBQqVDX'?'iS24:t/`rHbuLq+HTko2aR[hJ[U'5a5-/>9 +2^8A9@#5,)L:0!uiMWrSX@-3=GKV3!$J\OKm2++F89PSs1S?Vk\'q`hqHS7$@2r;]A[8o6ZVb +fodL:s^S8/c[_fI^Z(eO-6:6<^^5?79T^kj)@cn63F4e975FMPeijC.Mpq+/"I@`N:\iK735 +LKBuk[Nd)Em+99,@9arj:bg:s4M6Z[HiP0)n,Qk7:k!N/IRcP[<&,in[kK`>5=_lLd5nQ_!K?$o(DGXCoLEg6?FT"(a7-!VJWp,\rKCdrD)82"s$\aqB941L]AgnpcLXjiem\tE +#`!)/G`qe'aP.]AlH\]AQKjY7?ZOR4cTW^B3fD^W[c`D:Ra!DP>%kn?)0)nJ%.8GDlO(]A.QjFo +?aOXE9K7+_^/0sT>$+p^Q`lKUdBt+r"S/2#IRPrk'd9gKSXS4VbWF;$&We7Q:<$asJ.7A2I* +eU^oN-L,oP[^I!"#f:e%Nd>4d<*_\.4Ru=Kr%h(V:RQBnI>'8Oj0$'gS.9=?48a0"I[n;;iu +"*Q3^71kCFOAMn6%`,i)Grs0V_=i#kNLdWo`BM1!14%na8B]A/0QAGT\hAosiAE'd,/bcjP5;_m',quoKFRt$"jRQbOnb+C:>2a-R[FJ_6\56 +45h-CG4&r;t+>qK2b2[.*!Pd%:^Yim&jptsnVe\=J! +0]A[V26Y1dWj0IXd.^L-G`J"AV2Pk;ILS$67A+k@/(RsILsjac$af.*Y`"ci&cM91M"5NP5/T +EkF%>LV\/pFu,,cZq3.9kshF!lBE2:V#RccT2[UY1;`4PF952h9/s(QPcG\&V0q1Tb]A +@i>2>GnCkCCO^W0QJs4<*-`C8a.>8?BGV,J;.#,Jjs)Pj0a/d[XY;IBL(!9$E0-#4U +qts&^6;>`1FP01\ND18#%i%27A,^5CKF=U*cI+Pk^-0:E]AY[Fm6]AZr=[FR"N"q4Jq&%k0H+( +7D:P21h$Y,/B(6dNfdEW1O:cbkESsb/lJBcQpYps@+:6;?JTq6IO(\;X(^!P#A=6I:_:<\Rq +q)MUB&*K&7M>DX#ofacJYE@!Qc4BSH:n?o'c*J&gPZAof7)/q>ss4r$`CnsmG,!4nV\ErdV@ +C%;+XGAIq.AaB\sXQ]ABu['l?GjD2*I,!%-UAJ+#[W;rM3sI=)$:)NZJnsiGFBl1cAc2TTS +ZnJ)7'4*$iQA:"ah\&s3,G@M_]ACqL@f0GItU_[("7BK/@oR]AbqU5b>CZt$2lg +:K@"+K^?.=i"tBqj<^J]AKjFF-`(,iI\\tMl\;dVS6Zttf.Vl1Wjjtr7Taj)mnb2mg3:eVkm4 +`i7H?est6M&bDaf,l&Wf0&5bj&I&WlIrDk[0X@'/cp(DP.pQOm6j +>qUYnVRZ0GWg`b0]Ae7-cJ(fbmGTi2OmH072?AO)k_>3p+S8/!dTo%gn5_r8P,C5a[I>RW--Q +mtY=mqoW:k9G)KjE"2B5_S2J)i2"S7SaFTP>7Y_q(`:u!q/\64gtbsQkhbngiq:U`_dC-%j3]AG\cU< +dL'd2=7$C;6t2"J32'ZR9RfaWt;>nN0hQGuut*=Wk4BA6l^65"8"`&Q2K^WOQ +A2@dZ1GE3\Y@]A@9jU)pqBC<'ML6EIStRNTC:32rR+/;.K4$[6o^U>+mHL)rJB0--qg +6te29`5&ic??1R\W5FZa?IY[`iRE*a6:>C,2(G@5Ij3putRph7t(mD)uJN[bCQL]AB(""/i[D +eA4S=E1Qr&mUtPJG[#S.P#'3GbFe?mG@5,6jRoERBLNG/N68Rsb;(*+j^8is-OYL^sh7gtkGs/jcH[$#P!9=GJdai;9fUQhtB_5N +)Nf@73JS@jq^)uMI'aetq8I"'$Z;#7T&;OQMcP5aF`14,PPrm/O&I\D,fLT/O]AUS%5k'cnr\ +u&`$)fTO=B';`=GL"!-W!tr:nr_R`I-73Mp`G#>Ymn8)W]AWOGPgG'O +f(2Lr3U4?kXq3o:^MPI6:VFl]Akm8Q9YTA=JgQ!i;hN7(j,8:(!UiRaB`c[]Aq[#ga_&;*=,;u +8JpjZWh1iEC_(RfbqmN!o=Aa^Rom$ErZ408$TJbm8.3k.1!5cKj;7Ts,a`8nl-);ql"d#55.$73KD]Ak&]AT1C&#L;AEma +EkL:N^Y+U_\B._+PYT;nIC^QdPF@6[FttqB\mLE/Zgu+RfHr% +k1P,,5?\M!I76*ragoUYfcKLn.umI!uVa$5oD2boV7bre4DB/4'ui;DKNl1Mj,Y#4MBYIj%* +iOA(hPV5gD>D6Vii4ZKn]Abc3E2ubh"uP*kOqN<"pJU`*<4cn8mA4c>PXgAOG)[#T'&Ph;bp` +I+#?Z]A)P?=,VcGY>^5404ZSE.U+:Xldqb0?NrVa8SU0;lfTXJ@d>WU7T=(/5t3BTtN_I>JVB +)X8g+D!o!pc=p)G(Xj`,cB6QZ=j+bZaRd>jJ78iTr^]A#+*[a8N1jLZ_LL`=h/``5Es:a5JCJ +:Sii%38VL]A*#dj\ojaZp%9S%VblaTGZ`-P@/@Su?n6P/pkmWa823>hS_lG/4>qYJYE#<"u\! +VOcshZgSAI+ao'Wnt(9plkD43lD1(Z?U1I8J>hG()`-"E(4Ou_BA/_<)SF6DTbPSRQ8F*#70 +9rh9MQ@W^t#)3)$lt?h!Q0YLeJKsbIef.RCGQKo+i:2H +Sl'$qpqJF:UTso:.h_\r%aaPtqS=PA!KT_e5Y:OUTi)4<(DKp5]AEe=%O.Bq6ZH0D-t'ZSEtX +Y/[8'=2/*c[AAP$62d>4=;1o:!6FZ1dM`Vm@c+3EVB1F\0O@g[C(9(A%@lsa-)1R5[\hWP3(0f8T7L!alC>m +0/AfR+2lF'ZBm`lo,5Kf8/`+:]Au/YW3UXMGd6D""HF4bhFYP+`l?g\5`Q@nqF>56;A%Kpu`, +kS0$iit1-c!c(dVE^FHloBhntqs+CRe)QF$$LRNCnmA+ZU\=IQq\;Kc@E['Xq$.LfDoI:lW$ +_QZ(4o;XU86JN91pNIh?D,rr*PWXPBWUBK$/J37MOQ#pCVB]A@3h-b@TZ.KUhtkUC"nWP*,r( +\4H:H2`%k`nb:Rnfst6R1eP=COn;M@rjf?2.q6VZ]A=JK908eFsRdulH%9P4:DoHDe?[R,j()W.JkaWo%e*m/EY&ra%g\3Jg4kYS\B*:KX3VH5#i +99-u`mHD/b1L"2BL)-FGN3"dl69Lqp##pWS]A_pq?@R2Pn]A!iSZd_#2XdBc!.[Z7(-GNj_!#% +(a@l?G:B.sgX)5Ngi;'>m:bDL!68NcauB,7`QI&rc3-h-EV>c^OC6U5=[u.)p*&Z9(ebF97Q +tprSD?ZO01BQd";Ma%OPf`d?8,V!$[<9Yk6RF6JU7\]A\Q%mnEQLWks"kNu;s2a,$EIY9-`i& +p=%D`4=5d)gs#cKeekK^!(k?d->/X6`i92($V]As>[rZFdt*KMk;f\UJl0N9&@)hFl1\F4h?Z +KJJ*q]AhD6;BY0Z$r[=a2+@`3VL)h+'pU>Y=mic)sk5\M3F2AeR55=]A.T,N4jIELAhd5c(5^s[cZmAsuDgIJ/0/u +[H%S9f9H3lI\<_6(F+lg>a1\dqI$2mEa@'OVbq:A6oV$F7IH!p6.RHM&g'q]A&frMK9]Ah/b@&EX$^TJtK.b[]A&S@[IXa=s=+hfiY@1HJQg9A&sYo<_YNTQ[E +B\/,W]Aq?ZC!to*3Bbt/($*4gcjN6qN[A;_=DsH2LM>k.g(APuF$:E!?YY>.`GC5(JXhpWNjG +f%/a"('Pf$f^5o'O7_c?fek)A=YV3>%?ZsIVB_Xgoai@kkBLsGdkfjEYB=/M4o +e'8-QEhUo.F$bGo7SYPUQ[!SA=U3h)XU/S'>,2e>>9$CAo?I8i^9Qo^d1i+e.$P*0uk#iAXh +@ifH1QN(Bt\Y>[Hq0@T\a<$_XP"BSCH0b&TQTNoMf+sED2Xn]AHnfW?gc[l-,;Y4C?/hS$5,^ +A>9QQMYV.&X2SP[B/*On/80Pl]A,LGK]AWXi=CDQ3^^$D?g07dqIKJH%Hpap6aO+9-g0Zu?:p<=]A76Z/%1P'A$EW?tI +@ap%KS`)d/tp]Au5mIhB^"uQ0kF["%UFt&92Mq?&Ee"-.R-%mY3u$t=f&UFYG4eniZa=`c1-& +?@+rrGD_GU5e>ru,M:#A^Bn)k^L-i2Z2hYknsM'INpZ@m=GpB)4oX +YDLuD$drf!:cF<-:cV]AV@G1s%R'[W#iKAh_Snc4CQlnD,p.\-V\8UP=2"'Su>^l+=qP_*7I" +b.cQ".`;4bIh-G-#'U07oM;1"5/hdgpC99Kl;TFf#t+@9QbAErW@oBS086fWEds:k*??hug? +C8^\+WCJ@HE4m)\R)?J%f<@q5?^=a#d[#BH^0+7LT07Z?=5Wlj"G'U1h#E9!Wag1TkLK\8ES +D>p4Y"(ikhZu#B;Lh"C_422O-`K&F--Y58Aj:m\7J%NYXOXm=O21G5]AlrZo@;5Ih7W.hQnIB +AVV*)_E_ZX16/@_5?d/DZ^Sa'er&"$qQma59Tbm13ZZd)"\a$c[neI;XJP$q]A%`(;7Jnp6jg +oV(3[2aC.gguH&,mBZ'nFLdW+I@jZI.A"4D)c^-s/eofP$3q@j8^.3n=Z$]Aa1cL^Z7:jt>V4 +DdKi3eg%\&[C(=m4knX*X\3)<$c!@?IdsqJZu9i!Gp\ZUL)$p2C;J5Sb'N"I$.RS.P=9G"]A" +qAErf1VGtWGXV$j=Wc,S##MXW^0rDbeU*2`gM*'FYaWbT_rOhkbZ^\qsNL7-"K> +*;6;:hOHCmm*4;]Ah!"E(?_M#-0j@c'BW(,"]AaB?-&G>1Z'uZ!mB$7Zli!@6l(5%"'N?$/]AD!O +gc54sQ(u>I6qUSq)I3J-p`9c[=k8"Pq-NI?;FFmB+d&)=p+e7gKS0^?nG2Y[87u1gN4uS?.m +mZ\0u+GEK'cb-ha=*U]A"W"&%D9Aco/$_$X?S&$"kcfP9gD(:>*l]AOQ"QFam_[`6fc04G*1$# +/C]A3`0Xog&A.7qKg5#gsmkXMhd-Sr73el$GC/Zrh?otRGA)>)Y)IjhM`X>Wb9fE[u-qA'"Pn +b[XW"oQtn?)l(3YHq8pneN]AiQnfp7qb1;(*\2YPYguI"amu+/[pUfBEs%(i*h0l5pI?FQm"P +m+[\\`Jm[5`'f/Oh1rH+3$q)J"Dlr2un#=DS#8ndppN;K>rr\6pn2'EETq_o?GOSsE1n02SU(lYPG'2`nij%oR'V[ +ctWB5(j-1:faQac>]ABO*;@>%>k?#cgOFQZ#I(GM3B/*qaSq&+pM)[V)(J7$F7d+$q*N9B+KM +-O:)ZI.IH?V[D..#pYGOI]A.d&JD&DTsGi]A,@BY?\ocibknP;QaNO%-g(f9&i0l]A/TW#&'oHb +1B^Jf#NiQ$`HUJs5(Co!)-l;Qp"ZJT@Cs$i8r4'G14 +gRD=qL5$*iOUh7=[>=1:m,+>-G_E02HL5J#YFnmd+*7RhUS/[&al\uF31]AC)7_fFE-$MsFrn +(UPYPP+uK"&#GfT'C?/]A.bb9cLbsIRJ4bj,L]A$ma6ZCM\h]AR(c-V!Nf`G90^5*te`sBAgHs% +sIrem=>lBdYH%=!L&EQO>DRM3X=rK$*@4)j2eo&Mq,/t;K_gl^'^,q/L,/5VhR +ZsBkW!-2W9"*X"aT4?-Fg0$bY +2l;W:pRc*itC_l.5*(%O\d'&G>_l,oLqIhIki@EUjTMI31gMqje"o9snC7.+?"u3^@=Lt;M^ +TMliUW7#d_ZV9g+.&YG3b/qX[,n1.49Sn*qu6@NasSK_8h[',=.qX-fV@$PIA4q&kIG_MU\u +KW#\PW.B81HCL$pWHgE3QSN]A>+)Zi+=8Qr+rpN=aJ,_Y4Y3C:&9oDc/ptdj"#>7I8H:kC:`>r9=S6SuH[F^)BKqU +4XT#M%UuRq7\rjO0Ok*1o^-m./\+0jP8a?U9:5$c<$*J'"Nr7f%N^n6%R0#;HsKUAm.Z2C?P +^Q]At!E1h'0(KFbnWmX7/[_,Rm3H)XL-g"-)I3r<5['KLBdg'KI72%@>.FX_NU2q2(Ns^n!&1 +Pl^5XN]A"k78'!XS]A?EFBe'%_jIU<9l"kN>`gCKsG`%VKm_Z!o0X'C2-+"D2+C<]Ai-n<`:$o( +:SSpM[b)M;o3n6!Qe=pnk'F4/&0i@7 +GilP,JGi[mV'B!N[QBG:QR.Zi'n7>pHk_7SL@pOok[mu.(Fa&K*?]A8b0kLeUS*]A>`b$eVQgM +1LrM$_k-Oq:&sE1.'7T'FD@PY]Al[.I>D=Z`5c:s%*puRQpatGLf<;bUUdj97"h$VmUXP'NiT +bKdsK.+foSp&Q]AK#l)itb0+'Zk+'-G!9%DWW:+P0lO/^U@s8a#>e,pWUS@_FV5m5DN;?uE7c +ggB^+"e;ElS6\S2*tm!cE.f)_Tq4>]A8k0r:$rGL?neI3lrTU=Y:oY0?T47`B4;ch!I6Po*^> +/Fc[t=CEWrpf,P.)b`,`%028]AA]Agkuepq%2nEp]ApkD92_['Vrbch#Ed$mV>bdAai0o=t=!2t]A`nU#M"r8h:Z9,OiNUg3p^2h=e8bc +04]Af)k+;`Ra?SS6<0u&7e/B"+1e2Dk'm)9c"D0jMjsUc8Ufa3Ksu7n4Zg^h`qOE)W7KG!c[: +/e/:H3@nqVWS(G!gf>1qk=^IrI9qoncHi+Ug_2r`#Hd8J)X*J2C0L>8miADJh?<.c5N`UHEDb-qR`.L*4[*Y'7Qd^bRs_6s#Q0(NPq-_c' +6W-apTSp+RYl4ZXt3(*H:*LO+f+si]Ada^MWbN`>(-qV24:j"hV#t0iQG>6k[oEA(?lqDlQ8` +_4E.pFJ$ni.Y%i-pWV>9FIA5Io@.KS"qfs0AC=L#I&o\Jd:f@t>(@Ya5m>,%OYs'RfR1/f2< +d54bXp8PC\ll-p_P($YagO,"K9Ve03g$sSO:A-mVr-<;&b4ZS#qf_El-9aCCH6HL"Ls&?2@L +$TMthD\dhoWW5IaL;6bOVWq$Jm(5]A1#8&JpZMpQ2"HnA_Uu$5oM87K'FN!tO;=bji<8qOIY) +lfi_f,Wc?2G99C1iLK$MaD/uWVJNU8VMgM+=dgf1_>M%-m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +6"P($^`qq@b +5o!Zd3nE;H`NQ"tD>W*#orQN3oB1*#q'Xpq% +FZZ4*f!VE:4.Z^s_+_U9qAs/rS>#eKGg!QR)k;d.b^QY,O[l:`,RVcT3V3J@QlF5ehR=&-I4 +7ZRZfOlC7_4KZ'j#N:^rFs0\gt?I-&nWXG6/8]A9a6$*>n&=J)l8!\CeLc+$^\-=)Je.S;o_M +F0m+O769Y]A+tSJ*=fSB-b8^cqrYi,9/NljkukG_lk*he!44\Gp7Q0OC[Phi;Y=nGdFIs)5PP +*SgZ8s5O&8s-r%5bm8!1gYW'>P5IIL]A)Ga)OStMNfZTPg*s(T5JMAMJr%L40Y1OCT`&W/:pM +XB4n\eVgn)(l)NLoV$dTpnmXmqZD5eq.T+[Ya$qe;D+n$tB+U,0hA[tIB-g"BN+KS0Jtj-pk +b3nAXbT?u%XK4U`NnW!MG[&?.3k=i'P5VcnH[E#eTB; +LP+C3uDQ8PBAp>+ESht6_W2cf?J@4bs/;V)Epe?tPT1?r5tCi+QMY2-+FOMl5%8[F"T:#\.8t/"$TR +]AJuT=^p%V(]A1nfjC*`t>'\G'`9i8r.K%bf74V8HfsU7*&&-hel$.$stqk#]Aj"j`fN"cct_Q4 +5i$G:eqGi]AG702C>!in#WZ+2LPX5eo#.X=VO)-jem\A8Bg4W%&g4E]Aj:!?55h3Ij8-0K*.Nt07+iY0pP7Hn_gT +lbEVc*Y%kJa?E7d*B_B+$+Fn.Dq +9$-0m2mV_Ld(K)5R"pn&7=Lm)O^?.^pL9UaPLe*B>LcNm!/N#RBN`Vd0HJd>+6g6!E\SNt@M +:EV;\g#7`?i9Ui>h:asGj:MC[Z;Z2I`2t\IJo(c<#jQa+Y?ED&b6CfXB)qr(snG2Z^W&0PZL +Th3XP(\W4nAcEZNS2Y!5VET2eiSB7r-+"1Z$+8gD$OrRMWSF39j895s!".!dHDUK4cM(d$H3.u42$!M85LR/ +*"L3dIH?bXm;UV9Ae(fW/mt?U@\j4uX[M8WoF/lKp80onI@=!"ea_K2 +&dV'95+R>g5rFa6rSclk1@Ye'BmaaVWE,[<;=q:K*VjslXmMM$V1&FC177WF6mnRk"fN +H]AHRN"@*Qm=R_g`Q']AP);F0#fmD$FS2%o4ELN6fN!n,9RR;@Kid9Sn,F2e+bi6;,H,(e +;q0[,,Ync]AT8BUt]Ab*ru@nUIT.!^eD$Z+t!#0%puVGoF[Io.@/Vu^.^*&Ej;H"8hsS+"nuk2 +'Hf7gkg*uPF2#5<_l:jE#n_OB%B4,AK[ekO!QZ%0fE(6d&TKh#h#4/$U+^Y(99=-9<@r.E90 +aZu",k=*mq29KGPCIO&2fAe;dO-7A\N0c2IDj55X@rjP<(W8rQ?T\C5Q_8`H#[FE/mZJFWdK +-:l38^ImD-XfGGAuMT6!n?bcdg=D5"/o'8Sm,F?S$l9^%^kZqK0FZC0DaG0p!0KP6PF9W"\4 +b/k*RkN]AaSU4$i%JamjQcF$6G]Ao*+%m%CS@jj$+A.)d]Aqouda\`p64D.`\T&STAk5R@nfFXA +Ek1ps^d2,)$j>\)1b@SBJ>&N#55]AP$b\-tEVGJdD<9l-EomLk]Ali^HPYlnu/G'_9q7o^%Q87 +#6VjV.RIgU,H>.@7D97^d=qubJdhuh4G`"B>"i"WY9+hRZWRhBhV?P"0@t"e<)jRjWDdA,5+ +I#*4!m"G'!Abm0YndSrs%n4YPF!!@N'>J7b=OFSEbQjTXi$0df,1ET*>WQ"3*Ptfj_1\ +82-A1>eE +diB$0G583\p+O2S9Y,L1=6=RQQl7;&a%M/=EP]AE"P)Jr*lqoJW5fAmP=>sW?IrXg'._D"0et +T&b6.X8gG5d2$)_Mto=SC,7_V5t`\i64iSpsELFIm+h!^ +Y[oVc=>l=N7YksW_:8Ka0pC?=?5WXM'ON_t8kSW*jMueBSt;;>m]AV.!Eta` +HIc@SUS2?[.ctrnf9Z+g8(sX]A$'Ka*b^&F$`*+Wr![T,iZoZt+r"GWR2HSJs3_0=D)Hluh'\ +ke+k!aXcca+J\J$:^;ERu'*VEjUqZ$/^s6[:.t3!3ha)N;tcW#C98TJ:.j%0_O@mB!t%NkbMB#Fe.dZURaeR)<^7M`&aq*s']A +"C9P<@l+GT.@,9n02BJi%W7&s\YK.@j:1n)Rg))N? +f@K$REOMd8?@qbae)-9/gE@2;T(]Ar92NQpCXs1-8YfLIhI=DCh<>^/?JH'QE(^N\I[p>n1)c)ge7j8t)]ASgsn2(_q(J/(H.E5,ZKBd +FVW-m'\Bf_YZ:f'E]A'oPtcC+2?]A2A7_I?UE;Z3r3GU(C1L^(;0JL&lR/CRY0s[aj?Fr:F&'B +L3Et#beT86?5[LYLl!d6lgY:V5eKuNKk?>3h_*bN+C_XO;p64Q`Ppr[!)]Aoq`7sRe,mug`_J +h3NW\lNkhk!u#2:V,>M8@C%*O6##&emus/ONZT9ogI*Pm8kcpDRih;jWX"[(!hHGo&)O3?a@ +g9Wh^RRrtl+/7C"$Tt4Rd6BqPQNoc*Q'q+Z\"Sar5^)1"t7Km:j#+7sGo'=k.m%#"2_=OQlN +'Z48;.3p+3=I?m!%_>8?e8%!R7LTVX#I@R>Ib3;0P]AFg\e_!hq,+e6;Z%Vijetd`5AeN+(5' +mc@l*&i$DM;t[59cBIZFpZ&*]A2)Qsm5jnaVaJ.k45Y-"?[kY-RfCA,WM4=`K%2d=+^R+=R*m +*,Q*4,aKrRUqje"#%+OVfN;j4-iFbB[K!*[Xc#B*(8hF6mC`6EMt0p()PJNh$lV_B#%ZMs67 +K?+02"sf.b8Jef>7hr?`'-A?XXgj`8/p\8N[]AGSB#!%^8=#R#5*ql5R9P+d45sAl3o\1&o#tc8E)jK) +=1Ep@7MS!4)]AQZU3?^>GaISgujAq6pU-ln2]A\d=bLuISP=2r6;g.G7&SGl;>&H(7i2G.$5o( +s'r]Ar!=g]AoT9,2O&h"N1ST?X<3U-Pf(^.+.g>1]A17(-=W3R/[M/,_l_#T`Dln:gbil+XH]AAe +lBTj'q/UpR'H>kMG.H]AC#)lInpe;UX1iHsY`BObkn0XJkS-?N=, +Ys$#WFO@pQ?KCK$*2[YT(BI\%:RRH@LO:)sL8-C(Jd/s:]AK'd@6@1mfm5oNBGG8Q892(q:(! +1T_g*]Am5G!_QM(-BYM$4VWXfYYfO`).WXA.Vc3t3BR'jJVbE=h[e%P_<_AIE*\2:$]Ak[$$kQ +gZSJECSC3(6S4@^u_8^HW%4XdZZ6GJB[>p9>Xi9!SIU/D[LB072+cO@#9Ht6W>&rgB +Ie,q!#!gV$]AF4kNijP*C%AA8%-8kb%ot.6rXS6;>8kWF@HsO`V"q3uH=^>=pZlUH96&9'G"B +Ild4R1FndH-g0f2R#!p['!F\!$WQ&D]A"@po6SBNQ8aq@/4s=G^rBX;eNptFmQY8I&Z\V'& +S7BMAMjEc_'P[kcl^nn%88Cm2/R3IhS7I$89\X"@ikRaE7$V6T'oAmE[iN"I_*9iSGtF/Wd? +6t.Y?t+*#spu)Da>orX//kWbP^oj%;lg;u_=4UnmhD)o0VRL^FLtOj<6\dcl:A(kh\;GY`S4 +%oqQn/jBW/%$h3&[*-Mj=2TiL*hH+mr>S!=Cp5(\l-C1_o_/XkrK4ZbYq0H+idX/9YQLO#VC +@c*T1J/_+t7?EMCg(Ma2c%]A`$>@Pq1;5/p6CIQ6V+\AJPM6jcq4MLro!figEBG-9rn*9k*pp +7TRRlmAS453#0p/o=?8Wc]AO_'_qi0;-FS.AA%\n&/e+aT%d(]AiFPgY_XP&baJ_d3EGOp1=o2 +)R6W51"dgmSe3r?l:GU%q%2E\=Ch28YVDD^GCfRrV;^Ps,>Ni!/r76kMj)N^9pC>5!hZJ?E3:DOq&J+Pgj.B.^asAn_Hgf +J2bD";1[ThY7TBlK]Ac86cN7RBZ@.2\HUfEB8i9=#S +!df^c=qr="3)&9m7$;0I'1h8[O.J7%:k;JK:s6P;jAp51g^iD:]A6-$Cp3AK*4hfe0;j58*dI +FAR&oF8YrFB!rCM(!^b#&DFN'FY\Wf;nWY/eHW89$(eYt4 +>@ai1+IW,(cRV#kTM&,??BIHfk,2're]ACEJKId^RE(n%0T(Sq*LUD-npeY)'1MOC7M2,K55O(uZhF^HT<+Z<=k,rqu-n,A%"NOJUl0q7Y2Y*Iod>5#b-VGbj,0?((I.W!eGP/"#X^RZ*XF`u@%`&b3Ua +LC`A3-A91T4P-^-?g"B",=Sq'PrmZ"s@j8U4 +[;)[TNW;VgIumqi0%(8[rjSIl_M[VtS*FX9s)go9!!(=R0,@-W6Lgd&l^Phl?OYtSU/SnPnI +;3f=VMdQ/C\uPch3`,59!_Z9QuQ@MUHM%e1.9]AW8\%t57q9u!nBNmqh&9VD%F:"/(TWp+"&T ++q1Ps]A"R!W,7%KWi/8PP!5^q"&eE0t>n"KdQ_@8E(Z4uS]A^8RslV(lSlp/F'$mT]Amd(6517! +Wl9m>li(/\!aAIEIT5gQ%<^gfZ"9@CN$7FrL:[>k4OF]Arh['`BD&sW?f&_\=6QZ!r,MWX0p5 +BKCY!ordCX>]A&[9(Pn[(h9\ASC!>mj(E&ALW6TP?;O?(K2$&.JZ59rr,Jqum9P=I)8Y=h*1* +!hSu"T"6hgX(F"#PgXP1.!D)1>q[^9:tsQD&;`V,2*&,E!>oDQKtJ":h,A^GRe:!8/>_oVd/ +pM!Eo>'4V^u +5_=@T^$K=^@',,_X1.dKYfP=)Pc:H&a?C^$e2QqOf_eIh0S%PJ!f4W[Km.@%$NVr9ldHe"&- +ad*!=K!HEkr'X1C5CgdS/I)R*F#nC_,G#sf#W0@+[R!MoQ<%q1TB_Z?Z7(o,*3JqPP\Z9O_c +,E@nZ0RkZfQ@Bh`6jcdKkod=Yg]A3Rd0+q(l&n<^Iot7$M2(E9R0N1Rm`_2F9,(,u*o,_/jDr +#+;\@+]AfC"'of+X^J@]A=173E_1+9Or22#a;'"G1lr(RA%[[Ag!``7-G:K,@p,b2INUH>h4pk +J4lHt-o!%'C-"1T'Y.3ECB87kLVmdheTi`'X[BgF_[E<*>Wf9[Yd>V!AKn7SGab/t2Z(iDu#r<%XLpA +=&lHrlS9\BK7/:JCj2s4nVhE=a_G:;Pp4EZ[J3qH-UL1Wt.td'!2XF.+>3LAUMc\=nfUMkUr +Uc!9MiuW6bp7FKVIcn&!4QGigu]A(=="3EQ3R%5%/eZM6Etnqjn0QL7oGm6K.:_>`!O>k9-rau,o%0B8&K^?@@+b0[CpVUR_G^-4) +r:$\aRKKad`)g27p'(mSC.3)M^(=`5r9#]A2rXGFBg)8B3R^]AHW9S@o'DNeNfK. +gd4#[SpbXVWS?Ul>3B!3mU^B/)SGdgfYLTl'>4I:81LW]AYZF1i4(hn`'-l(n%5$`AV=#E["M +S6emRO-CHRVj85#S.GQ's2tu +6P*tu@pcJJBLI@aWS>a)q'+0(Fun[.>&eN4inI9UoGc'iCIWn26oI-Z=SQ64a6Z7d(7-7.R' +%Q/&hTffiL`t-iZQ!2N(LGeHHmu,&te#'eNR+9c%9HB]A=TXZYuL#R3Rhj?-iplbG@(r,k0Gr +6GJeYqEOb1SaM,\no9j`?Qtp/%7UE:;_3W)oCgVWN44O-3kU."%H++f/'/K!;M^6"2CUiq+K +D&#gW3S_OYPKIo%i,m8CtV.*\rjCOpteCL4O6tq/dMj4Pi3?Jp<@ltT<=1!*no8[W'<`Ym(&Lrg#E_em5:!)Aj&b +c>EW<;"cIGD2$B"D]ALLbP0"W.J&r2#e,0<&t/al<##j:5]AW@rA[8->Tr;Y/($NVg^Sn*@o6IT2E0PC56M:QD`TB.7"5nM:SXWE +O@?;AraNIJ=t#->iT>oaN55]A^D9")M9+]Ao]ALDSA&3dlZS[iJ@^e0/RuZ&Ul +!$igg:UHQ@%`aq"%B/"$9;4cEN-D4dXBGH>U4V8fO_hG +5?j>["WP)O@B'A3-_P#?ILd(dJKH`50G52EoY83"f5m7Kn>Y$RTP3CD\5LT.or53g@r:OJ^@TJo)WTUcoDdVPqZnuZNg_oD&8XkG/5@.(7 +fAb4$7(2;*NbW%p"V&k8Y.UEB806Oc9EnUC#TN\n?C(^dB^=.LgfT]AQ7ULK#1g<\_!8#Se!T +gd)b8ak-`hV`=5$misdK0l&I:$2BV#43iA74bWZlu8K;0)G5cRsAKX^cA+fNf-$Pii#laZ13 +A'DKg`$L"S5n2&5"HP@)VNKK$(Ne^=_'>q+G%6.ANVOYo'2GHC%gja`DW4GONF7a;(sn19U_ +MrB-dB.IR38NIE3\)<@M%R4&M@1ARAg6MVDV*BN=`D7Wb\9\C(W`5G`B4os:#fg^Q=G7fVYk +F.(&ukbkMfC/KVY*8`t]A)@A(6?*`_g%frO@Iba]AaLd*so>Rss[Ssb*m:Kh?ApSQAr-XF;B]A +%4KR7U#'#cJ/TgHL#g>QmC`Lq`0GP)#-hU'&+5(=nbfhuJ\V'`pdq--fa>W+b8o-?8-ZDMOF +qKnW/dUHno4a@t*1K#,R%]A^+mU`R]Al\e4)f68XqOg+'&L_=/^=5$=guesQc,hpD7R;kHQMZa +^Mlg;6,gghs7iP@OI+i_'oNaMh2jat+W'Wt6(I9m3rY1FC,aaOMk8b\i\^5OV8]Ab<;12');p +5Yo3@;)5ckBD4_.`G&bjFj>MfhjU*JDe2TZ(,7fX6_!5)h:E<&_Q85A=e7itYPa#;;1mdTi]A +j3QO`>1\F?]ApEM!kl)7HM(V1:.RjKqT8GgLrF.-\k-2pS`qUQ)HkL5[C-LOG"&[".4%".n_h +e"ask6g+&:-XO4dsG*,'a)5Jq +_>J"6Qfi65'Ql#^0^oT*??a!R3!2nV03^gd1Mf/"L`"DP7Q&4G*4dBLX15Id# +K:;V&Bstt\6P,tf%2E`rm--d+L?asWEF]A-3o"-@8A*9?R:MmI7QX$;/XCI/0^Vg +/aD?jo4'.='_-4SXBd=7EZF@#QEQL(GdZQVXfG-FA7u3Yj"i=B7e1<0-c,I+*"DL"8rY;GOL +:$$gdE)c<7k67$^!n4X=TfoY+>3?(Z856E>%o\iLsHeSkC"&YCZ64.>Q`FXoWFP_cHGJIF$W +qTIVQjJk7@U4*S)qjDB6Wm:>tm/1_2iiCTtWVI*ehoY&:BDo+XYGOeX)Bo6Upp8;r,Q'?-o4 +'?l^CK[S1nnoV1r6m@GR6SQr_=VhOHTl=/_4=KC%qPq+fp4#ZnJMei$Nq!mVh9Tbq,205!>J +5IWI%XX%NRRNDL+s]A>\9eiEBS"kWS\hNapo\L&_"6Q'\pEZ-jgM@!JIW=/:hs`^?V2jL''m@ +'7%(`jZrF]A%fCVh*"tTgBR.@6p\tY4L@@G(T^Gp&jI4dZ?^h]A/1UDZktglb,SS1Cd")`M<^OT%5'X>S^$`j%U:]AV5C#KjEL_Mf@rY=+ +hUkFSer*-D;#EcUoE@oQ4'jhA?ZRjkjX[>VcB<<=EKWLJ#[#JJ!p\.&WtS5a2X0MTcil;f1u +/e@r$V'(2%ga`rtn/a:*o8[0V>eA^IBddb0g[*7^c1_a7?%Je`]AW*`M7s']ANC8JC(`IB`J<_V!* +6i`6956'XhT9s1lZaF'S[^Q9h^]AejSh##?L&_!CYLDfPbf?EtJXR2/+OWa:1[aqX&*_%t/r^ +Wu]A@`El:F:]AQ#ug?]AMJMD\]A&guJ@@K/cP*$=Ec7_LD8S4&F$s'pYCr)Y +iXQO/"`*;m)nM3C/a$ETZstn#&?-^O"\,+QF87k'BA^FMAKUr-S$9p_\P2'$" +Tl^.$k.m,0(cH^J6?%51$X6C\$RWLa4fa%oXi+@uI%)7fW%\2$p'ppZ<,hH:u9$=0hjET$M/ +:)HPAD_j[o!k2;m&_0D#0c'I0R"B*L>)Uild$_DD'.(Yf="Llq4,Y^^VbI2j]AYP:H"=Wapgh +%+0jq_103-0hlcM&%5]AUO`_N19^.IL>l0c%MP@n$^k9K!JD$^>kf"U"Iplk4t;ID)q_N1fCN +q;LD/cYr-5+T.4[GoX@uF8/`-FXDN6V?Pb.e&&r:9fEtlD!(PJ1GU?k^Y$;pX=7$B/$(@KRd +H)0e<'$n&h"T&YsPaQ+?42C-FfAMbbI+KMBdcQn2.'rKQcjhZ_+AiOaRe$&_*3R2rL_$3&]Ae +]AT?WF^;__>VD;:]ACFa@E8KbJ')cpAW8EDT/Vc(AW%qa1rfW0HGMni&`KO+W,akheHSI&q]A=;EjcQf4nPR1 +CV=:lTfd.#c\ +#([[?-74b@$qljS5urqqlAV- +'/@\9VdeQTY7I#/4G.3gJbncmDN!n\eMs!aM)8*nBo:Nq:(W=S5#Mm"L(l24&tMYgF9#eoEp +Y[e?3s%DlD3&n6FNj7D-$P0!%A<5%86]A*DgAhZqaT-Nm:mi(9mo=NFBEq*+a3c9L[]AK4G7uA +'$#$odpe[1)O(_I!msr')`Hrj$$.0B85.5pid$[WB%ZEZ0qJJAi&:NX'8:ei_cN(j66?k)NH +c9bdVNJOI5n#>7GX-D_o/Gj1If^MiLS,9WS]A4c8i>+o_<_L"61-!`=j1ZHRi7S2K:S'C_o/X +pKGUC,CQB6&7Sel#Q&"DPDIA10mK=K%1_kt`!-ld%@I-3Zn/ +"0$BLcI\dWQK5AB3:n;(iV:mpmO#G0K%RO]ApM@ds9jD8U'YlG:mI5!M=XTuXT%UY9m']A_8a3 +HF_H-%Aid]A[p'j56pqE2ob$mg?b!OH;fnOrlrnei1l^SEVJ:(c+7(u@fu6.$Z@jc86priF[J +^5s87e1ZC"H,og9>"mmpTlk((0=OSXoVF*Z.OqD6b49.U>kRH2RR6DgRHBc&;cPL?)OZMPFn +((EoH+dG.$JG5k5"c*6tF"e;go17r;b1T?uU9!D6=n?^ma)J45\Dcn.7/@7HT`nR=GrU>aO4 +p/,.(F#UjGF]AsS*"jmbOHK:gEAqj*YaY+u?9f[]A,*rs`_8_'&kc+k<@_o0*'2ZbaP\]Ap?_+^ +\TM08Ugl94m3rWSd6\C%uoY/e]AISc"@\aNU?SAutdVFh^bE:N/2U +\Vh4n4!nf1l0nUR`k^f/+#8R%$bBl\>>m!R:p0R/YD,5L*QH4(DU]AS9E_\jE'#4!Wodj$H?6-,VF?h%l'"&Y$'@rX>D:fn%-Z;Dc#pZ^iajq05=S&5VF +ch(HN?iiA-q.,reatq_7ILOt8:2EWHkW,:I=:s72c%W4kCh*(?V^7iEUg@'+keo=i\XQ&d9p +RHKgXAo]AP)sNiRn[q]A\VK$$.sl&&*b_Z?fhkPre_nQLhB"9-hAUXb9F>&4h%&P$k&_iU![,]A +;BLLWPYo.#dG^[gS/[]A]AK--RrnYaKZ:>H+LIJD-!Wij<6fH$Wd9[8]AEeIbG-IjM(X>=@l927 +oW?(W&mY6qh__E$!(a\=,CS71>P/c<]AWfChn?@>8MVb^u4T>Cl>_HXq:$:Ut5OXe1cIepV,F +@;dY*sjaR2GpW#DBSSUoX=6>0m9C0I5T<9[RlHuN38,ajslg&?dl!_D_:M1Wu;jrWOrS>Q9#ALV>flln[K8G.#-26#6I\V-6D[HMY5:&_%,:u[ +0*d7g3W3597X3$d/oD1H^`4X:TDM"g$BjP?,E*KblSYMn#(u=uinhFg5DkbW^\ZcNF8HSCkg +)DgUdild\^flXVjUBaK!.*QHTQW46"pLq+OSQ+&Q4m6NPaL"(hC__$o2#uX/$)lCG_Jq/&=9hga&]Ai,=EVoIL%VT +WgmW/2!<2?bFMC*WC4D.n'>c*dA\)ok.7C.ZE3-O@Y9QDh/f9:Y2MML +W$)o(^[h1eZPF;_/sh0gCPq936U,[X3-3E"G6!h#Z.WVXKD:sL@(Z='n=Dm>XaU(BRO12CZ< +UH5B!uulcMVVFOt*K_kZ60(fp@3(1.X:/g*7ks&6`fAn[Oi:>%HHWA5\>Onsq"k>bc.hM4"j +PZJbP7;l7aKf0P/3#W@kOE:"6nP6`Csr_hX0MrEh*f.,Kc!DeQF8P;L*0+j;jda5983YZq]Au`e2l +o?'9&%r['Zn3WkkBnJ-p`-DoNb3ig)fN4mke]AYdcE.C:XTNk\<(d4N--7)Sj]AVp$02H*mR*V=ETuPB)0CQe/+8<^\JfZ#hM +U?Ne+ZM;e7+q@_;*h8rQXN/D=)^I275SI7q=/A%0dAE<8cKJ9gu1]AeDcM4YTR,%O50E4?bA!:p<^+R`#!,6+>K>$]A.(<^B":n(MsWi=318B)\B' +q#J??-_P)&X6KM$hXFX8Yi(oK.ku7 +r((1=2aosk/[*u[\[[i,?eR8rF>BXnB1p?$P=k";1jPYSAX"9E`:Z ++jm..]A1aSh2Nen*HF,6(C8:FYo5eZ%#QdF4-0lcZuYpa='e#4LWq_m2TMlrbtK1D_29%8:g^ +C\G$>ej#R.?!Y)I]A*DBT]A-f8S"2.)T8^CkZ:HPaqH#2Xa^U8`$[2miRO3:;ks87`<=OVe!lL +jGnpenF]AG5Rr[8]A=rK3W$:F\`/NfUfdMIo($fhOY*&VrV"imcj3a-TYKXH?p2\FleSj;^Ga^ +'57mVh>&K:`[DJgCc>X-&4/r"o%c(%MrOH$)>39Fr,DjR&<2,;>c]A6H&Q4d?t;8^bZCE$,<* +\RXVZ7hZ^8H(K)DUY1Ff!*md\hi`+lWPCep/]AP5ek?tsGE^5,>a+kC]APVR!.es +M0]AC-6Dm4g@!L?Gn@[:A@.`AWAVti&ab4gjj!tb!Vh)SW=ihdg=BLr@i.:3ZCZk'Zpp_G3Y0 +=tM%EH\p.O(KV*'2Bd>LSmQESCsQ.M^JR",qTH2J/5h%*XP+i3I#nPW2A[\!aAXL[IaPi64a +ZfV;hAFNAk/oQ47S3c#>(^/nG!3]AHmrO1qjaZOoddoqOO&CdcsqWQU(\9;F:7KL.TC$;TQon +g9M1#0p+clC[5,BQ*D.:HEOQF'G^7b0s79.o!'?It%,cBNi)AVjk>*ou9mmP6L1Ma+X_=H>+ +'cm3#qe)a^KN3P03hkJ[qq)>aaT;5N2kI-B90?Kgk.)EY]AJVcTUp#oZK2FCPT-%i@Y5_rI/*),Q?!n=u#%T^6/u<1".:'Pg>*EBt&rVko!KF9Ji +3S%C"n0;*T0IhtO?it%+ZfWU/_[u6ou^<%PS.K3\;&V?gJ;rZ^@V&s%UIr:+naMV-O=F(Fe_/LSO1cp!HO;cR[U[kYK_+F@Gj +"mo[o&S#X`pWM_G01mE-BBtoB"h:F),Ql`f*\MdePYbQ)\]AoE\TL#^W9:6-0k^=NCq:Q[Br> +jH-^;M16"IiNVC?I +Q3_(nl)4LJ_I&\2S't`Y#n8s]A.9=M:"q3^HYdBFboN=G5*l`Ib0ou!W:qp7FM7ZM4T3rAN9F +THTINn>Dem#NMu#<=4tR^XA!cMa>hT1$dn--0=4>" +$P,tf$9p\#b'/bi\Bo5bZC-9:VWZLXZ'6_Ne/'W)'n4Q]AeQY2WX(E6]AZ/nk%W4V]A_?DrS2^U +2p55Wq\`/8[G9[*oo'Jf]AeeMt;Q&T2+P72npbIm,4$qIGoLs.Zf*==8Nt_bIsakj@u+9pF#= +:kQ)4Z'0TGPkE)R]AZX.9R%$<&5n'58+=lN#K]AitM6%q +h$LgJ*Rb)3BL%6-\qbMe=:$6_2i2,&kBbNTVd#HS8%;koebI\Ihj&c-IKK]A-YE?2nHTn*C:, +a5qF\mb2r%MD22J#iTq)7iCJVm(:P8)kA]AdPgkATO,"fk`cP\4S]AKa2_ClZLS''e.(;7-0-P +RG7oAu*Jg%GWh04]A0^c>ul,8(!83:no#'Z3V`CT56N&iDLfas#uj)]A>UjZHMP$"Y7eYq!a/92Wq`(r&RUOQnejcf$cR4(lO3]A2`58#bKM?U=h'sKd(.qP&1jUQi-A1#53ACVYoGR&1,_#:Fm0Hr%hc=jqq;\8ptqX'O5Y&ih4A6e5LPQ*9lOT9eR_d\*K +iVuG$:cb`pM\6]A^MSNN8#4Yfe4Vh_fFs/4U\"m=TeXo?;T^d-d^9sj0:@*0*HCiK,lH"gShm +%fK6g]A4*-B2=[7j]A/B:$:=HZY+UdbG0`d#dBJTicdI#gaKN>^@.arB9!(%7sg4F^@a<)6&L/5C%Dme&)=Ub!-=OE2C\ +<1Kc7a!?B=,pFKE1hOSZ$<6=dUI&Y'X(`ttWqY"V[^,8t,5[XPKYR)H`JH1/r6@)]A]ARH]A)*Z +9Y/;hL@I7YF4jKkj1b,&^TOHg-ldfZ`@m4MU[cqs.dY4Y]Aa0:8\Rd3lTRVD_LP0BjT#.Wm\N +AIUmZ#*fW1T\3=)r9-9k7T<,d>U*Rc5>cT'#lABMjqe+u(nhs(9(oCMTlIL\SmQ1/p4ZfNDIKT]A=9/! +\.]AdU6(tDRi2(V/$MdV6R3jTRj473LjL%fAX*oB]Aa.]Ar@Ua:d`mKO-:_AHl4=ejGNS6M^[dg +C<>)D[Q'6[>H$Xd_rP_t_:=)3<<(LOj:&,Y:[1)Ad2(Zd`cPuCLgUY%O& +X>E/#V$Dde7:=)g[eb6nmFfL!n[XVo>$*$(GXo1GU(5^Y5G+`82E:(/gBOVIDE#'1 +]ARA\!umU)(FXF-_mD:2AZU*AEh`g>:$1NTki*ZBKoTY>^m$DZAGK3p<2XBM$;]Af +qppKk$9XATLR$iBiZ;ac>Om1X>@5[L[g!lcVeW;7M\sn(8i)acgA04ZlP# +Dd0Q\Kd3ZAJ%Cn]A1L`sh&-L7V'D$!Ljpp(d5om?ed]Auu@S2_S>,S1WDhHr"nnI,Vl-Bs8dG\ +q$FqaRYiC7tm7(\s\>81$(l&)7*e2;=G\f;.S8MC=rZSGP5BGeG=o.Am/c0=:8so/@/Nm!3c +&K2VY=PXLi.;%UD_SbS$;4bP>%O_jBTLnZ$Dr^*+k2K>)=lAk_1i$&Pb"L=iqc"kS_Bt':<:nTmm>I2\]AP:AXXo>)m\a"ka%OnEO0AA?\!\m+bQo9GcI(gXhuHYF1 +VpX:(5VYnj7CNoG9gWJ\!H6?dS$.3q514k/UO:F=LeOA3KbD*f6eA-#FOU=mX_k4D3l;>-GN ++_Abm9eMCq8="0/2%LWM`^$arN9e/ft&S\AXMU8>:WSu:fhZDiTiJ.U1\pb.;(d^2iA,bGFj +5H=uC0$WG[o +JLd)Pu7n,,ZTNA%l-pBJQ0@J>ApcU+Ynt/6606h;=,[;(<9NjO^B,KhG-mOpZ;@MVu",r_^?*5=6mBEh_0<6'ei +8L$iXZK\)D[/frfMRVCl0kKZ=Oa#%ZH@&@cs@aKhVHKXZ]AM'k.oAK:"& +Wp7A.cjM1RNLjIu/dj5Xo^1MBQa +L!(1Z7Apbnd5%TB,B%YK)/@WNP@mli)9S?fkJGJ&YnX.mWHY\;)d3!Z-CDZ-Zr5nt@lU3FQ[ +u\R".0Ot7:dmp&1B'FNce1HAR0^ib!p/+&+O6[=MXSu"p)hOr8Ol2_M'Rr5L251]A&>Q+r[_; +f[KMTXO!5-tUdo?=2+UsO.BL&IB6m,%aRZ@oKBV9!O.@uK\`S$DFY"pmY';.2"5,)cdpOte/;R:MXq7$ONL.6C\haI6CtAWm! +NO8&KVfC/Qas7uZi>gIKZF3]A3kkJ#8fcMdQ43\IdSqf'F`:;_R;PS?P`5)bD&hoq+07UrRkm +7=]ARm"E#UZr0l:(+F\Y='%3cGF9jNp62lV[_M4/?FuQUDtq/(B>DKBSpPPWD?kABn\B`)EGq +o*CR6GfP+Xn(3R;b(eZRT%c$p%06K%&L2%#B#S2G/RRbrSM)J*nS&@j?M(*d8OasheF%&,\]A +F-)!Z>TVcDDMPqLN9h,idX#K1*/uJV/>R;'XftHb^I"KcVI +#(1PDV=40gY%s0NsN36-MBJT6UL&PLN-[Ep6I?j2^lk@j^K4;@2`@;Y+b;02EW.3s"l?7RU8 +Ka#]AU0V,UF1dG%Oh-MS&tJCtpZR3j[2+-fDlLakQ9pYe.M_qrbH%MM/P95C:Uqp"a1NWf6`s +b+)`e'9[%U=i+P9mt"ZkW*(e9PKs:@\A#E?I_?)]AjZ'XOUlQSYg5Ob+\VMQ8"&gQ'C<6@>'A +'g!;Hfc8bCO`\]A%6e9^ej(l))cd8]AC%(Uj]A&:UoPoVX-,.`^)a#P5c*NsE*oYHEZ^q+c#1&f +9H"TAHte5#52b'8O'-YcaG^F2U?IcXp-EJ6olYU;(GC*+I++_I6>U0AJ\aN'\M4_6%bc?oP +KbGNN6bGG/l"'1+f\5M(it4?'%N0g&NO9lbC`a^t9o2*g8T7qU?)$.Y;4UU^)2H2nG_48%"Q +bq"%4-h?KrJ)Z[#bET]A#;&7_6XMF"WD1cH*WZU[2Q/67;hf*m?eBOGG$9".Coj#LPR1s,L^9 +_R/f9l=#-"EDJ>0Q%9GG?T_@!Elm2i_mKq@WsGZb)>Xk,C$K915R-< +A40smjU0KMA,K5*1:Y2PqQV`hN"qLp?N23`7rsq4]AWr[@,:(lh.[QERYud9.gNN&I^@42*MM +X^D`+5mc0n.@?n$ei[NBaLi,$eDN=uYW:"s=m/lS_-@0[.6sh.#onGfIs.l=;:BDM:n;,MfU +02)h,Sb3LBt\'+6nVUTeuZdlrW4jCT&an#QQRp5p>_l+29Fb=%Kq&g`(HoE-$pUbD-FM@g>e +_sMI,YNgp'*kHj7gDX*.QK9/ZMm8<]A2]AFRaY+_f35e\fP"G\j6OAP'.8:"-3Xs-=,9naaRJX +Z[R*YUGk#TK8O/7i\T3lC5.d_X3!G^_5n>P&f"j7(L_R[/ujR5i<,HOH.eP= +6l\5Tk^2h]AkOV7'RIe)*P]AMEkXYqW7GaTC(BkmH&!M0#`8]AOZk4%jM:'ua=-Q=61@)Pe^Q'V +7fOU.Un4Q]ACm#RUX*h.Lcc[Dnj:,h+YAtd1:pHXhGlKH<5(mln"+f,n5U@boQpJSV$+US3Iki +:HO4m\M?>I;piBl@pZY(q(Chkl@rHl@Dn6%oqcO'\3CQ-\KU%Viir#-X#IK003mP\Er"FS`8 +5J6R_D,2Pf/**&CFDjM\4u*(SnuGWWAHoVM&+cjJYWfdEPsn*-G),IDRiio,/-?MT[j[P!(3 +*DGfEa:%R@/','UXt-mcka_7`C;4]AGMo&p61urIR>F-T/NI9Jjeu=7G?DYNQ.Vl,]A:/:\Ra+ +DW,>SLM-=UGPhj0u]A0JP&*m4nqo[i2WqrHI)-o[O8TYZN5*Xp1$8EnR)'U54VJ +B*U_q]A^mTT@kn-i_5W;DX;Sc.>6mj-+o5mJ4n7$1\%2p0cS9Y!)%+oAi-rD%jGgs[c@-:8!h +-09)!l<=>RVqT`__%X=U#cO$9.#FbfA?ssC9VV>F16<+1]ANuO:ptO*QkrPoPeB<>tCC)cX1E +fsu`L)SGf,>MY1=/g\8<1b0@G,m9N*,k]Aq.A@:%T^Z0Y`]A1sg`g;7j7/D#Wb07ZbdGh>[Q;IB_%-O)a@De;br>7$edL@"!'ff;K%.m@B.'3 +L:44I0eS8Gfk3b6T!s&B5RBY(W/;"+f"CQM3V)56@HR`frmZG4K?Wb/nj.<]AuPEohJDF^nUh +1HE/o-)B@jh>^lLVQ2$:e`/!/('FW>_H`n_%t5O51MV#VD"I;3c0Q(:b5>5`'c3i`D'8;S9C +DntXc2#OdO<&N)LWjl-MMDi)` +0<$$'9XoY1WDN6#6?7/(WL0`S-;IKra3kP7tH>P)(#iAB7SFsAg4&#:Z4C1A3M@6r:,ofT3S +Q"/!/-_jr"'.o3!I%A_m4)e!dc>qS^_DG$ +i!TAs^OS[e*Sn"3+9S,J>*'LEJ1b5.D>o&#U(@k-%&@;(\?H'c;N8eUK8#!_iHs2g\PjIFFLaJHH"fk)bbF7&["s[.2LsnKIQ8YT'XlL<4P87]Ag31 +d`_i1@aJe9#jn'O:@^r&NOJhaB9.!6^tpm)21-J\Bi$m^: +X.(e#2H`?9pN+eX-,>a*_J*G(q!^rprfP3Q*@&?$.BPAK_*66kS03uooNi^m0A+2<\RL\fRm +l^4SPK^`X!MAm4TrEHKUMN;+^T.9$Jk7k2I)/W4']AX-nVYK9"ePB)D,j),_A0;<"jF%H@8Ad:@EM??H-u6"r.iKbp-`SO?H-5SU +K^DgF2>OW6]Al_L+E8/A.p869/j4D2QYV!9[$@[E(CLr)W2fgn&:46GC-!q7!,(a^Q.Rq8.:7oJK#bQCq.F/phL.0 +C9W@n=(>HJ,$eA/MpE41f__p2po)tANJAkuLb0_cjdq1#KHN_U@MlnS"#=As;NUL;_Y3cN>8 +>cPD"8jJj,I"'#E<4"N1BPR[f\C=[@FM4a<<]AO7]Ap,`PT,G"XlKf!d:k'%Eb:?%WiFQN7F8oM&Me8Em`aeo8`c`T#l\sDMcMqgr8F,c.p.-HKp/J<4R)bHZq@1UO?[GR(GNS/8(8Cno[-=*&jh4W,qJi+ +3Ue,M$+YTNY!F'&gpdjK!D0`1iJS0JVC67\@Ni%Ed.%JZa0B1quG_K>H:oCp'bP4tdA%W7\/ +'BNN.$WUHl!0!s6of=gtoLE[(%#D71StK:\d#tO2Q5K*RQ,7Ln5WOSs.Ch\_X9]AdsU;'jp(> +3&1^kLW,?9a/jC2O16iYi8o(j^Do$,a$c4AtXYFEkaG-KNZkhIbWmBDSg91KN6:5[N + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +?A8rl$ +oIXQli2Ki>V67Q%^KYK<_c\]A--K=s5Ya6 +]AP9:0`3JpCb@O=D%7*[u/!s]A&IJKQCsIQ^eGJJTGJERXa=mga!&q_IfKP^C2d3h9$B;Q;\/U +\LC,qLDpJUs^u2ktE('/hNpi(DDYDo($f`*f&!ua.nJZ$l]A$[hG5J^n0Zn7[LCKd3qtA2!T/ +[Q1A>2RMdK0>*r(ot(KRr&%DE1On2R4_,N1YRLu)1S!T3>;h:40[E)33u,DHf1L4 +S%*[P[J2>$+9*&cLM(74-RL0XhRkj,2E!hbOf>o9D +^>kKcLp_P"o<>X[K`H'"brt_3HEa?*6p69orhr&P0^d$JJnda,[$SH9(J+[tgMU7MC.LVf4FA?_,hLn:tDLU8=EY8ib +rYIa&s+U+J(N?;AG?),*F]A,Cg5q6,tqh +kTqo8AA7L8JOf7=]AV>*p#L&;;RbHg\W*3;pfh6%."&t_Fou>5XY;_]AS'p2n.HEKoGmcQC +*/_l_t>5c9:d*4:(VePmUb%%.m+*:En%u3l_!Z6Yl+uFj_05VJGRdF'_Lu92f8WX)B'MV*`# +R-chR8p.URF4aCFrKrmn+'')p*U8Nh;3I^.[.>N%>C_]A>66"mf;5&D4C+(XT:m[MGeH$]ABq$ +kKfcUSOLZHmK`M=KRV&Bi6lDXpWI21&ncU^3.kE;-4E-Sq2@t&lm0J8c1i@oA/KnY4@B^dZg^d7_q2)`R#Tnb=M7s/8 +\)->p:)22D"V9?r54S;@i)F]A +DYd-*o`R%Z9(-0fb%GnpSr,5X.gZlP>L\`mdJuD(Z,2NLEBo"i>oF4*'&%ma^fe]A%D6V +7+.<0haIGEO/cTs\*DrMe(aS3@cm.SpXmF!aYeT/5_hmiY!f1]A5qbD<,`cUE&rOp>M8Ge70D +jfS0T9=N>(G9%IT]Ai=g'D8j2'YE +:BMNVfGGjTC0dbNjL+6Xc\HZOXE3ZM9&!iFDag',G3%*m2C9[1jXK+^QW5Cru5"4NE,%$iXU +d)aHn!I5'^n>tfPa.il@KjR,:iCi$n/EuA0mRS$Rb`g"NI`4#ZhSlIW[/;OUd(,*]Am"tfOQh +aW]Ac-(\-,9d%*4?$BKhWi;b#0QNS?L4?g:,eamIF##pjgF%PX +skZKE>]A+sC,p%kpcjK5&;.n2>;=UaUV02!fYIW +84QC6&+N8%m%\EJ7n&+YpARkuoD($E.$$1]AQNb]Ak-=r_ltS%NPJOX0ej/#R[]Aq4's$.6\D3h +7@7BZO'."m-cXPF/D$D,U,[4PlV4l9?[d_X_s5_ZM^`6TYd"#]AC40X4tk@_us&#i')Fm<1s8 +s:%NJ5;tKbP6?:Z$EIlU)YIb&j3:8\>mGO2E +^tpX#U$E9]A/kHgot0'.6Q!bfg&/EV$uqKk3FT?VUa+%3j=JJ#nNR]AH?rf)bPp8rKB'DhA/=L=?lJ]Ak +fV/q\6Z]AiO$Fj:6tt(MVSJ_&/l)kBF)K%iKP7/DQni8D@Fe6:4N`U6TCKk7\[`Wip?$e,eQ- +#Eu1E6,f6a<_XjHt&30e4O!W[<@>1$sT6=<,g-T>c-_ZH--j'dmj+CEVG^+Ld\q2l3B-P(pS +oOO`nC&rUObGks^V\jdXm*[<60&N6(bh4YP'UoU0=#LNF+/:Uf&uY]A7CUp;4 +ZJ^\oXoSj06?6^]AI%Uoc-FU<:[p$&+KQUF!3cnHM0Dq)7Hr]A^aJP=?:YGZ4"G/\0\V%h81hNp%*0jHPJ>JSAd>ff?gN<)&YGWl4iGV%)Ki +2kND#rdOaX+W*oV+-\tVC_l5CG/!tJ08;,.8X4!PBNgRdlg(hN/eKgoS'[H`l;m5t4n^.b74 +Z3u_rHcgla2`+r1\&SdgAiZJSP@JK1U7EWTAhO*jp:2k-Bs(c^c.1RhC<1=G0!(,MeGSXgIb +.L\!6rU^@,jGpCDB$\ig290?Cgd9n%Zm#4,Q!>\"O!$jUE!PIXqk%6cL04jAMB.XEf!_ib@P +K^msZItCa7]AUKEj%j!8'M]AZ?cj)Sk^.UOGtYP*&LMph2NIi'%1RJ7CBK[cT\9YF +$$4=r^W-Fi>'9'Fe\Y>NSQNe12D$WLeDd*fY2pJ!JMf;/#u7e15flINn'ZGd^4n(e9*""]A0* +l]AmD,u#UbdDDhA/-#7Y2^&Tj$aYYaNiP"nnsU9)<9IJHOU +@X1GLTbPan22)BU'9R:X*0@*?^9jl.mB=HNhR.hc[_$^7?j4ZR5%^%1G+qDZ_ +E0KP>SO+A@,f<(q:L2b1/6bVL>o:o6fJhf!'Fu^Ah1@(HTl%=[/%*jKfgYU= +%.op>/Ta0"!LHM')'dO7Z%\%9iB6^c>-J$)LkW=(t3!)0d#AK!)AD_tRb)4GY27L!$Jgh"j! +Q4t.^s9pXXuTTpLN(UoFNIs"BUZaRq91Vn1JHRi[g,GY\]A8Mg_uWf'/6.\/,g8_g<5lnp_?+ +Huph<"eFnu)cp\4D,0#tuO-7:2"A+0MD`me?28;3$+4s;pl(h&qo($h\T`Y;bk>V +e07M.G\ec!`l/:#MOfP*&"e>.)k`#Js3=2umduH&>N.9sWBgZ7'L)@\$MtKa,`i)5l5B=G3$ +n?l@f+qq(5?4.UO\Y_GK\Z*=mr6NL0jnd"4m%EN/1$.1#2_g..\_!hi$ME'CKfoHCcG1eTk' +t')PI2Zft-C$X2qt5410U[dV;.Lu5"\,ejnIE26r9Aj;9LN,A:%dX% +kRR?V4%!Ip$\p^F.&N@O:or;^>+rsP037BRB+Fm1e>qqf +iR9k*&a7J(3B]AMCN@b>NB,s_ZW/%f5:"IdG`5<]Aec;.J;.ttTa,\WB56]AM!. +W@'+br^cdj=g;%5g"EkN?L@k%9QA4W'64K7dP]A;AkYBZU&)+76OX;#(2@!$^DFlk=@irg.[c +Qb9EF'Pls:rbJl=PM<-&98=$KS.__"dW5kFd0B0`#-Oqg>8rtD@^T)XDWQ4aJgeBW.q-Yqp+ +5>]A'-?cL^]AkS81WhL[`HejS/>LAgD/bN.<4=hOG<%^IZ<>K[Jnb>bThMR0>e\I1u1P[t(9YO +LJcc@pW$Z>%rk+\Zc5^5J\MDhqgJU/0O5`Zu8H5O0-A^4Q2U!Kkq`*pI-i%j3*k-[:mGRqDR +FLau3$g`Z)0#IdM`6$,8=oj.i(HXCrr%(%\!"kkFMl?3!$<5tlhEidVaY"VFVt,!G?[;Pd2> +.YgP>#&`5V5>3/;&X\3R=I@YjrV$W5^f&d?IjV_"u*sp91&(X/`R/o)>b3>?<9Jb5"DRTiuB +*e75m@f\N%SRZc0q?S!%Y7dW]A>),$(m'oTDdV*nC/!"<(RkG_XFGM*ZGeqaaYk4+inf8g)#E +o/H6,l%H1)qpf7);#abL3n9Z'h.ZirO6\#=^2@;p]A,D0I.:B6oiPI("B,nJV''$#MkQH;%T) +-XYi85_2R83djT\71ab_'+GR;kuD!FHmh#!U"e`I(fF!t +bi_Y17-OR@T_5RBkL^/sg?uG]A[h@+VKW/l=KPo=YunLe.77"RA+-&jhff@;RN2JI&5W[`D]AP +i>([>*Z^:$+1".'d0U8X3bC>bO?:k%Va.QbLf^[9Y]AkYRAQLbNLN;9Un&#le4^URss3\=T1P +sBh\C:MfoW(/)C),a0^3"q9'/r!s=7Ms&lk#]AZk,g_*03-'>,[G2!d?9]AGI\Ni<^F$]A>UN"3 +_n)NB'(a4&p13&<>qdZ*c,e#FqRmeEB.1T&?JR=b3%lJ6+s[kV5^ba=,n`5TqYLX-Y]Aj:>8?g[TeY?F6F9AMZ$P;$:h5IKfp*ZW=H +EbX%C@CJR>[cLfss\9H]A:3*C-A.nKbg_?7ik/ZFTQUoIsOdp@Emc:^jkTFh*',)&(nOWQZ@>SW-?Q0("QX'?a#&Wo,!Oc]AV>4--2!d'B2__B=@k&i=J> +L["mY34fA_WT/0%f[S@Sf5/?3^K%:%b!VjGY[QCQ5/S"=iT&'qW+7.M0 +fGGI9^]A_#`Oa=ueO87BElhTO2.iq(.Ki63rXn$dLlRAtgaJpLbK8buC.p#GU4`pHrWE3trb, +VJ/r6hO1rb3H#_eX$I>ec(,C#pZc=Y9XY>P)elRDicQC'Na*19gs6P +?t,.:7&%Zaq@`/:ln>g8QY@_:hdE(1ZL8[jmYmnRP,G;Gh2X3X_ct!kGhh*KLGR#HE&!b0`9 +s;;6RJPi&[k3isEEl<*fLlOa98RYQT5?^oXGs=/K@D5fGpQGD +8[OB`>2mH6rH*L%Hem")O0'ppes;k/SsMAfrT?!A$8,hE(Q$^L?E4n,B98X(H+eFZrE`A#Z> +Sf.W&.(%NMK4+<8U/srT2nu;6"c&43Rr9S*s=sg>V#Z-T+%C@h&]AU\W'2HjrYTH74.2F3t=4 +]ATk77P"#^jg_2)T*fj;le.guTUs>:"(JjsU;nd^da>5cJ1+QHHb44Q]AK&2@%srpE/hXB^^DU +prs4T)Zob=i7?&g5/`2k`IC;mR1H^M!<+o?bs`C6fsb-+imQ7FFd/jm/(L6XQhf5o;r(&^;C +E@"sm3GiYfMnHQ[j=d7iauuGiWn)I;9<_%R0oj34d9ppBG&B(+M-h@iV0/N<,;`L<*Zq08'9 +A8hHn22ho'FPc0H^H^5Yf0,Ku.o?mu//Zg90kPOcc?*R2Lt?K%sl#H>KBlR[X\4[F[eM(9Fj +@pH#]AI"VFr6_Hk',#cje.Wr-@,e11dQC*pZo-?sj?W)p9,hKj(''s=1ghRt!/X.#IUh\>b+b +n[MsonqGCMiL1b]AJq]A''oRk0jsM0E)mjG@ENTL3Nd>u9LJ;gQq'Og<.Q\H/VbgT"VKO]Aa#', +IiSahhe,%rfI)B)mE4^I+.[hfhsl%Bmf(fkD9aa[BPH<"!+c'0-O\)qt5mLAh=gp^?BaLRi,^"h8!b1,I+TV +nR4nE_^*o:AWE)B/!F@5P%[BP);1WM^YM5r!$(jcN'4#F6o!Q)Q:sLUA!2J"ZQt3h)J%@r@> +Oad,1ro@28X0Gm2Z*?C6-_?*G*SFV;C=0),I0Ykq!^A1-._(tKN9[Jr1 +T%IS]AXA60kP%C&QZVMpJ_I+5k,V8T%+M=oXfSY36a;o]A>3`?o7hgG`5VAJrCi2 +"nNjc>S@sLpJHrsqj-dtmh%pP?A>[tiBl65rdJr)=QeI64<:iunh/(K7N[=]A['m_ot/Vqc*:+PWO\.$m/*`D+("OIXiMlS#Bt]A[RcLk!e;lTgbEEUFa;(n+`^&ict#uYn\C3i"6#S3!gj)c/ +(4_E[DE==2d8-p&#$S@E%GZdGJSGG$.bGN8*[=R+c21qX94#%M-K$4Wl@q;I1==aNjoB+;e+ +o:+ij/nVMPnhsjr,EIG)-,fi=!!Q%_$XM6"Sfr6DoGpLPr)`AcbZNb8LmVU[2, +p&h*7lGY;kSBhGUP/Z`/99@Fo'ZR8U$&jOB_k1cW6(ATnE%%Nl.>2WLdW#sGDLQrCC*e0?FR +WJ8BWuc!)Es)*VCp7p#TWkg7i'jC1(SqijVt1WrG +\S@_N/KieRfUfgW%*;Om]ABf[7pKhEb`bW!Z_r\22.n0r2CUX7/+pfoilc?.@fB!U`/-I4Y9k +>EY7]AEE^mXbg">R>SjfAC>JgG)#qO;BiH;8lOfIQf/`0&=7@9:"Tk8=9UU3$&>a\1]A55-p9C +FV[j%)8`Kpp;W%+ik7E)a1TIX/`Y55*TqCV-CH.LQM]A.8-k=675s9\"JF54<-Z?:ia.?-(?A +`bL;b[iK6W[)^XLV0%/e*s-Z@c[FuVo7oQ%nVZH=d]AHU`I'mOG/*?fKeD4u +4;&-%g7>Y;B6U&5@_ak#aaqeEh&G2tcfchmn)\4u`ciMZY@=C;n]AG`/CUm.ND9JH:XniV-\V +XEXK#Rn6&@G_[jW0VdsZ/;)LXU*]A&q72#.S19`C=7+`99AJ/uD1 +_4OqR0u4i?\VcaG0"ZlCgq!J2'SDJV_VKdm1lb$V;+AQ`\"C5=1'NU9a.e)3A?i2(Lp4_C!R +mOcE0dR.QuAu2C;@)JaFh]A?HIShau*D'fRd[`@W0i-EhWC>OP&(sKe:7j9B9k7!WKllS=Q4J +Y.\OfK*19:sY`XH?urh]Adq.J*>$0"hm:pfQ&1@S4ZW++m`* +p3,.VZ+rLEk6Nb;o=\?K/Ml0LY<18\:MB7#-KKY@WY$coo3boEWj6<;;Pg[*Gd&NP_eOMDre +Z2]AB0BYX)0OJ#V^;:3qk?^SY5ZC`3%#*SCqZJ1q:BCSX?traG\!2Ys^^B0(uJK90FcXRhl&B(#/jmEQY=-rJ)=Sg*Emop;7Asls"8[p`iIZL6e_LFE#cK-*V88kkitHVQ6P6'b +_"^Qu\0@ndg4k.>Xj1e'WlKfYUl;'Ma>_HuSt>`thUYE&o$`at?-+VS\A +r$SuMDJai[A?Z-[L4eA(8R?rbZ9f+@YXAe<.cbg.c&r^qLTehBV`HDn:Y:<`Dm]AkJ-&ml0;os\2ZiOnSg+(O>Sft<%6%N)NLg=[$b<:`Bl$r>3.0*J1/9CZ5q8$G +%ea\kdOb]A:#k(!N@[f2ZK6lB1TU>\uZRr`i\IBK`/_b:S&[S3RF"UW6h"GBS2d]AR=RE@1d_h +3iA'c95CCGJJdb=dLnZP"85UKAY48/@<=@:Z7M-8.LjVRF>BH1:"M\o@,e+T^m?!&NE0d@Q< +9.oQ6RhlRDnrAKY1QI7+9Os-4rtj_r8Z331_U27K+"B@fsusMfnkFYWH9!2`eKV\d@".i +83kI@,.Wq\OqlgRda[H6NO\s\V%tVOba@S+TYp>AB]AS +YAo/&%,8LO<<5o54Y&9@OY0F)%f(5Y2DN'PE/Fdpf6i61oORq"C[GB>aTg`d3')U&s+!KbL! +U)po)<_L,2fn+V)5(;?Z9OtsWGQG3QS'LF5DVl=k`^9qDr(FRa4>\oY)[_59!Nh]Af9Ki$s(! +D\JlB-lPNN;2\M,?nclC5^7D`1*28\dhZH42J&Hoa4tYs]AR2(_L5^"BaYl:sNI2':3!f:bMj +V:4[\[$-+fpE9Q`Gl*6r@p?$Orcn$%9Z6>n)>&8<^8INeH(n)K-jp&)k]AlECNhou#cBOW-N% +)S@I$A[(?^G7_iS=H%9S!scikhX.e&^6b<:erUfTED>3.=d=lY)5!Nt?Y#)gab4e0gmPF]Ac4*HTS`XW!70 +#68C3]Ac_'-o9YUa;(asK72B>@nq:Gja6\X">$RnIV72[ +be:F1HaRdr+CF7Okq+^M'_c:n$bl/PF89Zdn,Y]A>2M$1HkhF4Y*BXoajW@r4:Ot/M[,5k4bU ++92kj0TDh/D%5I-9Mc%nkYq;m5bA$O480eDS"o"K_-kn!=Jt$^9'MCiF8+^C]A[Kn-<1urR/Z +uC6Kf&/f;8"d-'AWr*2MZ/B#bE[U&X[BVHD7_VIHp9$,GMRT0]A(*C=m<>,@X6i6Ef2cN#2/m +*-MH4hgh(;6lgNS(AkO.DJpdIO+V.E!)GUO16Jd.a7T*!7IY_D\,N`rpsi4Klghk;aJ0Vc-s +NkL&*-W\="jNs$P*N\g>WT#)"2>-COOj?4B'ZXSn3*dR\Up;Q)u1Y4,+P$+'(X* +T9Go4G(]AHB`:Nfa5.s=#N,%LrHs8!70"*i"BC#:(m9>8@J^XG%tc$G\!Jdhe74iMOh9'Ck>N +Kb_SB+-:9+>.^>rq6%Yd6b0P+OV=0\HSkAG4n<]AbL;Y;]A50UF1[LD8Zc,tSt2Jk]AeRsafA565AG=0.SS2Q3?15"'oa4b]A*4=V^ +pB0E/!Rp9V_`*3*qo7ppO'UR_oBP2+Mu1+]An*0]AJGd$@e2Q>Qr0Xs8Xa^qh?FB5jO(@3X]Af` +&TSG?^!?h;:7LI5_k3UK\ccZ!_lBRpVPSRNA)mStndpJoK&R>9NGB7RF?Xgkg4r7Yc@>-*rf-*R]A%f[Q>"aW%]AYF9ZS\Mf3-B +FF&*W!^`3;Pu")rYA.ds>V-i<+=KqE)faM=Q87DE#q96`>oN>!W-1pJ'f;TdLcVbE_3cNRN. +jiDa\j=S$4"JTG:%3LpU0m%4>*hsE63u)PT;Z4PiU1O*VE1l8qV*)D`uuq3mhk.HG+dbfX5! +0kI98.qn^A45E5#ZD;^?8q`]AM7CZhbT*Nq@Cgt$oH7%<^.O6*Yme/3jS8u#O(1s6pb#ms7ML +MV,_U>%;'bW;b^mB(qoJ\gcRkrZ0FimMiK<$kiS!'sG2+9RHZ0Jj#"`!4p,Y8N9>do"D<[9D +FFP+CM?+8d\*R8T:lbKY'UDlL2i#c\cUYc>@n<=NSG6TTF[Rqn87/Zg]Ar]A,]Ar_a#AHFl;b!U +:lY$VRY?PW)N+U\iPZNt3k2nVMmKm1O7r9i[.kS*-%R6?\likS^^%Z8RZ1@:Jk'P_!9W3fXC +dE6o\eEi'ls"[M-4hDb>cHdEn"$e3NSt![="2`>GIE8A"jBD/.[dN6t2&m?+nGAllR47R$n0 +G`2IS6><\N(SX1e*+@a(p1??iY*=T/a>:N7(_51*f%YedZ%/5u'q)Qf!iHPEC#g6Te_OHJBi +:t5BfY"Z<(<(!qMIaA*Y*bjc`#TkBXLF%/ML;hR?0;m8D)Ihs\[&j/lpn0JrY4#V;TI'7]AfV +kNs*2HNp*U($IsBnbL\h#@E8UB6XkU;X*.IpBk/]Al>)-p9 +.Q3&uFZRWHAul%A7gr=Gi7)smqM.T;kN9l3:iL[[`.<#LKcgD)JNtp%a;RASae"34!lNLO$C +\-7B\X>D("ST-Z)ThgR4?A9r*7b3,>NJ^.EV=I_iQYh9/.2D#?K(5q2$ZXb'lM(B@>JdJg0E +JKDl2/EBFj$l0Sb`2,U*1`[3]Au5(Jna8I31A`>Q:-e<_Z\%c/IG:1SE+lM)@1ll9`&OddgZT +5gURCT<^NV]AHepb>XIcGXaTpdf_:Y=3L"TjY4qqmJ +DDI+cK2jSWXe=fmZGu;jOldno-b%95P0I&7DJhV6_.3 +p(qC5Q-3B_Y%^0/[fE?ttP`r@fbsIE3G/Yr\MFnoIamOh1d/g96;N42Xlnb/IX#o$\rc@&sV +q\Xsl@/3lOnTp-n_W`3[Qf6$]Aa&G)r5A7=+1^q;1S^R\*;\`YJM3U0qsq;5n\5Lr:@q.9NOE +$"XL!g']A<&E`onl]AR2QnOZM]At.b::HWYD;GX$>+U[",h*Ku/r<>OB7gCX!8Jeb#0tHLKrYJb +JT1)%9pIY%2)R6O3B9/_]A=>?fV2kn1^]AFT^T,q+_MHk/0K6pLuUk0QUB*Vec,>^/-RuItjeD +kI'Q0T#]A.+V9O]A6eBt/3di*K,;*9d%L')da0MNY*iCrYJ1aP=+dbA4-q1Z3B0%iK^S<(&'Nh-;qJf*l=bXFrdZpS6hQJ:F=MVnQeRt>"9D88,[KSXX$KDs.I=ER:%:hHZH!1@&P6q/pJ9cXp0 +NR6)SraMRVI!TQ0`8%\LG>Gs2l3[PV.S`M%8]Ai@BEW[A+P5>CX.iS:RSj)jMbDYK +>TPSi+23-G/)o6h@k)sHtm-FL)\kgn,)E6W\>1tj%/c>3)q +DQg+=YBt;9C1/iqRZ8/iF%Gd]A&]AM=4=J5`O%0l"3I"Q(#`Kj6Y5as\PN_W8C?QZu7gt&H +I6^UU(Od=!tP^fUUQhL)O]Atf%k>beb5QhI)4NU_;m;^>Ahb=BWRN#RMsP!MUQ=Ie/GI@9X\^ +($fF2=B1VdBe+N@dtP,#WT +(H'e9'fX2!Z[FOBN%bMN(c1GD0hS&$`p9X.b,lS#q"&9r\1jP)b)ZQ0# +;RYkndImjZ47fN/pYaeXcX]Ah.iI_t$T(Gt:I53_'=N\?YX,0,,,JE^HIs\!40qZ9g"![@S.m +:EM@^'gn(t_[rJcf2K0'+rk[=\JR@*!?Pq9PjKB1)=4&L8Us4mLG9f[Wf0* +)]AR"Q9k2Q)>Y^j-I8t;nF#IkN:t"q>A)!"Epa%,= +[K>MPF+2hJlf<&0'G&8nj_(LqJZ2C&o<#XoLRYqWlK`)sA_*Ij<.A7.AX<,!.Nk!r;bN\&DP +hjYp&L^72`TJ=T,VDieC$)@Xk?sm,EMsFuIEPa]A.$4h3,1(4C&./;NK+8/O^'Rq\2G@!B#78 +kVa[\n]A1k2o*p^ACl^Q7S>.`kDQaG:>:R4^?4]Ai6!%(0DZITr"11).hn/]A\CC?4UhX18:J7N +rELRI2qp]A3U/&XYS'9jauX!:"'BWo_e,[mXaq='BQV8RTs!fAMoFcK22mJ&d%_W'pQnZeeH*ac7E9KhgL3'F"l,q9C-Zn#0G&Nt#i\)D\U +o<%(8/[^$P"SU>*5Ii';q6]A\BUUoX_lX)ZT5^W*eoC^"uf=ntH6J'k=.sS3l.sUH-McObroe +nes%aib`<8r(u]A_YF-54n;.HLu\&5CYT\eZ19o^YH9tXc]A(N?)EepdKSnNkf#(MHou_ +hN6XP??XkQ2N5uNl$%U"g#HJn/feF`+Gm/5(TE%Vt9U*7aIo>/SWr.#t0>9]AUraT^L'S[@B2 ++Vb68-/"YJ,U!_dYkMkb9_h'C?n(g>ms7mJM@nAOZQW4B>HItQ'aG=o/M`=7Qo1Y_1h:@'>M+hgOB+!hC!uF'>]Ab,7?,fVbq2FG5DA9NI +f+3mM9/r[sc'DdHg)`Ds.\@L:b-I/V_)"6a,BdVd3R"=\$g+o=XU(s'I_YCjWhfZ_u.LrjV> +[n6b(%r9rHa-OtX3jg@VYdlY>?&"<6aG40\,p[M;Ac50!SI+Cjp/nFo0=176O$6pLD_#WQ,7q%,9 +K3:SJFYQ@LU"mr^l_MDXB(RB#K*mIV23`9#AcC`2Tc`.or+Xf4s.&K=YD2rGg@C+]An.*(Cd>%b-nh& +BkOC8oZO%sEZ2sW7YUl1r*$O6dEl^W5O^CVD+_m\/430KsTM3H\asIlu7]AVqS:K=S%^&i`,@ +&t@ikm&YM1hf6XNSPEQhN=N1a[dZq>R\jY&>9?;"rcF;<`*dd/X4MCh(%._^]Aa"[`E&%B%0X +9>U;LT./H@tmdp9"2J+9Z*?Ot]AcI_Y=HIHD=Vaj9@@Sj2F`kubjcrU.p#r/^5^fR1>[oAShu +Nqo:&:$gZ$nXuT'f@\p5g>hMaCMIO'JEXV@\ba#=l;c#mMtNu!dLQcrog@R/lQ+Q=?N!]AEh- +bTcm5F!`;]AF4nYeRoGn&*E++$J#Wj2k6GrTZ'1s-NI=rj0)rkkQl:IjWf'J-h;.HqHnCrX^@n&*7q^s20tRG7"/i%E-RNa6!PoPkbSYF*;@S +Fbh[pQVahe9I(!2=nHKc1,Dc52[XB\ug?;XM[O(/0!`b*WfgUt.Qe/Y6Z>?kE`j+`=!QB?gi +gk.8XUcNh%@1fHc9%H^6WP;oa>a]Ao:;X^YklDp:u31)6u#Gjhk2F!!1qDfuhR0q9aO.0uifj +Va.0tbiM2/O)nBV^6c/5&-fHeE3sZr4_FKuU'X:JX8?,-;!M5cCRs6k^&8P@Q0]A\43hH=bE! +nUd1bcl='_//O9a(J$Ych9dGD]A[H5hME^:E\5>Hj,Ze-iJm?Pu"(,?LR&H\pAc]A_;:!HVQ&! +AJsgb/&g@=!U,\@3HsXONsl6=S4L6s*mUm#T2X^amq<:gB]A_i;pIe032pilaXc\qPdHKK/FqN([UlNdHjo[Zs9HX>t6A4,P#)nHNl5--clC:`[ +A/LJjL.TIbDX&m5T!'Z0)4F0?>)-RS2U?Ad@CQ\mpl5AM^E$*C?Ig0ug66.sQ@DX_=7!+C'O +ggh=YfdLq1gcHY]AqYbVcKso86B1`"QR" +kiQL87Y3Z>#G/57&gJDI]AMu&*-pIuj*k*^!$UYeWhXU7fGeYCdq;cshZVl[CM*llVZDrEk\% +2=%7Q;;k>#'87pu,,7lp`\^)"mZL/PtaF&5_kQ>cUCYD)V6Qoa9ej\@LppoK"7g7B%Z[q]AZE +7`FSRGLf87dAhrZ511p);0c]Al-3"=f4b:Rm[qa&ImVZLi=R%m&*o"7?!,N9OfT0uPE29%@+" +.Kb:;_]A1ZK>D.$VOeSCG?hGeE3T>PUXHL+1d6B(qp^bjViM"1\(gMmTthlXgGb]AFr0KR+:E0 +g+G/1KhPi1s[*=L'A^jt2Qn?t0*d.90-+5cY-DkDK'di6Ut\FkD[Dtoel2u]AGADVs+7rhdrS +\%Q3oX(Q(WrMr-DfPUN)KX\+,cbBgjhgbUrBDOi@;LIg0$d\e=Z"JN.q!#OX]ABO7KH0E"Jg[ +l$5\"4Gk\Z,&r#PrU+hS/<0iL6NIQn$#3l`Qr;8)WE0`]AMkN,n/ +6\cPGCn.njf*F"_QI\;a-7&%1g0+`=*R6G8# +Sq5hpSC!*^;,T'PZK*WL">RSM\]A(KfY8c\5n6R+NXX)9P\_!PNJs#B0jqD5RigFp++5HBngfRE+bKBA06)E&T05B4dEkl)o*H&j"_]Aml[Sa]A&.6SF#*YTmt +Ojjt2@R9qPb^h-&7g:m7P`=ItKGj]AnLdG+&D +dSo&K%36L(g,!-o479]AtCY)8FO'(:b\Gu/u]A)MQ\[eG76J,dW^04+,Hm.J)006I5*j1pFSa$ +/@+C\rkP+8g"ik;+,c^>/\Sf56sLDNeB>/MoctB;CQX)X:u\^0QbFq>;D]A_naI/P'+POB1u[ +=]A1t76!hbeCj]ApRC5Eh!8e)Fji$Ys9t*)2[6Tf$BC:PT\@)F-QtFcG2oR$t`&$I>NrTEO<6a +?6h+GRgbZc7_inrc"5YqRPg7i>Bh-NTULOWk$3[qWR>Ju+0csd;@9I/#70he+; +I-!(dBdnZlFioqe=_9B"(&b[j,8t7<<2"F7@ +_k"7Aj8lC^BXVIdiWfqO=Oj"Cidl9+f:[.%.gZ#lWJ38)%)VR%<"]AptqXL6^E&/::/BTqbAe +uM&!YQmn.(:9Z>11%4h^2s&Z>'uBYEpgn&Xs]A81o`>-*ViGq:3S!lFJ^u3/G2L's72 +HGfE'%Q]A8\K3eN:g;O'crggP1*X*M*IR6]A:^<-Q`&\-[pF/o#[6THh";O?@1uk&+/9Q<3p._ +AEn_&[DD`N,m(>C0=u5WX=SMOXqS1ec&O>d!df7]A>[ruZ'^3t(k[MO9SGd7"FNM +@S5*WBa65d-TiN:"ft8A:2.F[,mdpo#LT-iJ4I-EZe#B5:3)#.(&5m?T8 +eCWATWN53mca#m368nZ;B/k&&HX6am,NG2:(tUGj$,lHQhQO%U&j?s"iI]AMTDGglVcj0l[)m +L>H1"4'a)iLDO%dkpp%3C=4EaT12E&0q/KW"DWa63pF*^7B5%#QWJ`NXD.d\kuO8O +N<@dZJUi[;q04Ya$ecpu$@XCZ3N?a#_i&Inbbt(LMJ0*N_,!:Wi/[sbj&1=QZ6JT(FXC)\-]A +7*U@$(e&:ZcCkOGZN+6?@uG7-b#oZZ[-VN]A#RuSjlO-[D_.e`]A;BR3nrg(c>5rM+'O&Z+`%n +dZr(/VZrJ@T'ma&`o'12TP:Y9W6B*8?OXm$c,ho+5Rgc*nQ^i2K4KBKQS$0,arH1/:)Y'JWF +Y"u1RC^a20pEi&DCotnS.$1TT,:3r<42=-q!'rr_,3lG,-EogpXk" +uOK$^i[f1]A)E8ZW$Z=VS2.2V!]A9C[U>'K[rZ&T6^F'ID_buL\E\iH*H[m"+f@sC3XQes-_nq +:E42'2`D_2pPFV$r9damE;,kY>J-LYmCbZrrc-GJ*I,&-$"+\,=LEh9 +U8cHU7gI(4-NWRqt1?+au<"ENR9(ES@UYp:M`erQsK#cO=aH%/R,Fq^^9B^=i2If'`:)le)2 +/dg%N15(1nfrCtK/[rl%oqf_/C5-s)r=_+Si!MDAY,6nJ!]AOET$+S6'nF,2i";Z'`:>NR2_]ANP9&OOkR'H7nS!L3n<'.c/RWM;VC.q +5QV#r=H4?,+0L[s_+ao_*dt0nUCWq"Y'p[ac&"t=i +14Oh:-Fc#:LXo^_urskH[EeT'4TD@.<&FJosk:M)EZ2s&@0#h%=t';6\HL^-Rp'4Om;PsM]AD +E\SIMg"E)&PKLF/Y.,3]A7s$dTq/9KDAmD]Ak7!fFW>p?b,(B1%8nd(SP1N_P;`*rDtraZ[@>:(M0nfDOulm`if,T0M$.jBhZX6c'4XXu +JngkKU_EU![UnD!gH9RWMb@ft-4E:]AL:e8&'B>=20%Q=&2!PruTnmLCWG0W:+u8qoj<6Tf26 +"f6ugO\dX2lj/lp'DsbsK2]AiEDJ%jrq(]A8c2Z1XQ4s*Wo]An"0='> +A(EnET"a*q``c0YLPZZ;7,U6X2\bNO_f?*"%L+CZ$Ld=ghLc&\t*XU=aDa.cBn"WVIPqA\MJ$C+CF_4;Fd\kqOSoMZO[GCdoaQIu9= ++]AnS\)?MRlgn=(/u6o2c+[D;gj"Z+4(4,-DsL-U[EI;(1eGH%N6INaZt(tb:X[b-V>/P9D15 +gg,o5aL\dmFa.on.fLK+:4bS)LkQ/W'5j%iO2951jJ0dre+_K8.2WM*]A_7?`t.BudE!??O(* +V=r'2AhR-?R=ee9;/o+K*7.:_R/P(nXF.0XFs%62%!f.lTXplPCW/UH/;p+o_dL_+B)GhL +3]A^o3UtEdGTg6DbhY(0_7qZH&d\7[X$u9;\"<4D69)CMl5`[KllRSPk7$ZBDJ"XYD1_o]A1Lu +q3i;G!.pNZq39OPNRQa]Aiu/I*Gu]A7;mBBSd$RRn@Ur_W*"dDHTd@Gb:Z(R6(l6Sfl5R>q4?5PGM(PTk'#6+rRc.pn0cYl,#.?3VB +t2!p@0B!8JL/@&k#rt10X3a2?=IZ<:Q?SQgi=^Lb70Klmk[)s:jh9]A6WCrh]AQn8qp;CXD8%A +j0"YE1B7/WjCCs*2EOsVjbopEl8\@Hf`lR+t,`P@7`g#->.$qR=0PNrCK%a9!P8;pf[U]Ap8P-% +f5T?'CM*FlMO:cFnHjgjDrPXrBIMP!#D]Ar8G0K6HAZ_B:Jr!6e=nZm),9p\'N/4I!u")fFLa +Wc>P>h)Va)!cIT^9B=#(HZPB(f9o\!-IEbLCme4ZWHE943a$)<`8ed".c>d:B;iU94;6RQpAQoXi +Z!2'E,i7P=Crs7;>huO!M=bh>7oYTrff0ng.Ghm?n*03>j8kMGH,)KQBGSElZtN% +n^LA*$mY60beVk!%_sl[+b8WkSD1m384*[V\YE?Er!.5tQ_q,KhLd0GnaWfICQcBRSZ`PHkI +<]A^GAeMmL1gMG'VKdq%_)0/&3]A,?@\QV(?pE`%n"f;=;npTU4G08&o;YWHE+@,FmE:sAnE3X +Yd2:)I3LE-K]AMj5i-BL4(e=MEpeV +FdD?d?a2eic(8W.C=96r]AUpr+fW^e +Br-)>/fJ/*[P;<\J,CMX@Lqqe3P*s.^qO^$XZ^'+o +ihXs>'ep$*M/RdJNi&@jb"Xm5J2ErdE`=Dq!uY,]A2!gbpXD93Sc8,?m\OcehVN1"l\P?,*o5 +R@Kf?`[pa;E#G`<<94)cRj_B,!N9XC"su-EBtg1`B3ZS(+`tB=p[Gbfh4DN`M.TgP1IF(kS_&mM?r.ltk=N?I;.p(LtR%q?O2#7h"+%%2&_rpP?YS,lb_ +el4Z(;L9ci;tUs/S:b%mVDt22DoinHeNDq)%/(B`"ShT.[!?>QA;fS(UKAR83DRL7N+qXE'm +[>%GdB9BLZEFbYj-tQW0PRpb:9aK!PHT%>=]A@e/^NnaE<-G%e^%d*qX:fehjIH]A2V:`?j4uK2UYhs*BZEb2=M+O09()[@NAl[cM#BB:V_D8R2o/J/6 +qOsR.F=R0D'NqQA\qNn\;W#pB*0c'2ph+$n7nl>Z+%\7+X\pI0=pS'Oqo]A)Jh:1Xn!g5F:[clKIA-2@BB%I:]A!J!"_568RQKC,LT +DLq>Z?P/%g3OcVIWqjEe`:Q8l*.d*?%)\@litY-UTprG44rH?d;QMk#\FolAF,jC1`-(%mI#`tdjs0O*@"t\SO=17VZR`]A1e!(,@\jFPdd,knSG=b$/7FF,VoZ,Jei\_nNWF)T<1%bB<[AuttQ7seHMB6.:Lhq; +E+*pE1'1d:TLk21'$n?$PG?.8f2n_&6..Bi1k[X*$Eg1UtASmpL=2r6t +*64ZL,4CcSOLrkDAAB+u=l:"&rRC-'7n<"+uQXm/7.=mB@k\RqPEu=a-n`VWg_E9+(PreT3) +j=%0YctXI#W`0j+[Ch+NL*2?P5>)m9#]A;t=t.#;i&D2tK:`7&#;RUPf#1/u_TnD":V*YhC#nYL(jNsYI`"1e0jM=@"I\?\u +L4LQWE=:Gb_kq#VCcj..G5!=sB8g`GT&RD5Mc;gV![@!Fe]Ao&4!ZtK##&>oSK#qETL*Q;o=Z +EMoBRZEN]A0tG",R[#^jr7g!S"^a>#SAgeZ0N*mc&Xl/===>V[]AiB4eRF]A!/6m?h(S&o6Q[$e ++SSaP8Zq+j.nsNPSF?htM(QSBo7iQCY9'i\?A&W +GFFLi;>WYf(VFQ;MWiI8!ifbCFL%AZ=F4CA1O1XA6AFc3:)Y]A3TDJe0F4!EB/G+I(U6>84[L +/;=UQHPG\V3+N3A-\,%_%!F%R,=&lV"["ou#8Sps_tXl77kS^_KB7oFD+i'UTqGm"0<>U$1( +M)i/?PEcN#`7\Y-J$5NZH%L0NEC;!/]AS5)QUnRX*0qFr=O9En9Wo-D/F]ALIFHZoe-91[r(Tp +]A_Eig.qo[Fm.pI3NZ\1>+,bhtG/*d65QBoG9#b@68e(s>!cm8-21dSc(9CVKZBK+:[0&_/R3qj&lgDa%QSHGBC#g%J,Fgfk9"T&(t\HcWJ +fOT!:L_Udc(=&-=*E(o;Q/q7-dqniI5gW(jXV1)o^f\4d4Ch`;Zm]A4lCH#hr?%mL!NK24^Ps +5lhCHi'Y#^A.3@I35(FJ'cdkFEMgh>$\f^X`dk3ke;L?Dgui_TmG>[Z+@AfNsa5%Wr&m#mtF +-S_qrAMT#jJe5's`sk!#pIpH--R\eb%2[=#0Q%Y*L%+ghF1%OYcp.ql2D!8_k";Bg<@b +T-;.9qR$=E.a6-C!(2-*6E[J,_KRO9OdrT_[#pm10?2#oi8 +MlG#O3`(MG"9ugbMl5Js1'\#uKZ0\h1EDlo+hcU'1H@9-LB_Yq`1(8c3c$jDBQ/eh7AqT$PA +?\G`Z`qq`>Y(fL"`Pn4Mh92%Fj/:Q[%@3T(<8$Rt[%X[UXdPOb!+Thmb1Er3W#(Y,D!,hQ-, +;>^iIBdOTb'5+&M<8]A#(n*e&s+%-/\=u.c&Jt=Wj:lDm/^cT'1bVlTN;GYGe$7;menWG +-dc:RW)4ke/9*7(0hh/^`Skt(E3UQ(b(Gd\Ub5'O;Po81KM:UsdpAWisXhn@tCj#=j@LJ9i_ +aMs6ENp^=OHi'4hkFR*>dsE1LoC8uE^Xlc"2CkXodGULrR,bB>V@(;D;:t9EPLJ#:G;\*lak]A^XS]AoUhnARMf`UC +G)WEh4$P"tTFZ*(@oJr7._J7gJi+Uc3:ldlGOF"n!70T)E>a('aL1mn2H1l&ALC*WckR1%/l +O)qRPb=VN\FG\94t?Ub4%;B1A[pFXMH`9n%B#PDL(fF%>U&[mi,s4Mqo;10:JK[H\m`#cFP0 +bIJqG'*k@_W,6i=2T,@p:[,#"rE'SAqq&d7:+)Q`FrC]Ar1(">cPP<=&.@`F +aU]A%QI&BIiug*`a[':nCR_ +\Il^91N0;jDgMDbtU6nNT(28)qK2gF@C:\SDhP'0",U-+GOKUZ1`(:d$d^P4a\L-R*?TJd\N +X!EhmGbs*iTiDFQ^u,l3cuNqNpEZkVl05a?.WEO]A);Gs9/$!FGcq)EQ@X+H#0q,!IeLmWZO` ++gH[+c@6iH1+oNZg>g[q=L4R3]Ar#GYCcXs*I?iX#*MV!6.W$8,f=DIpcppsH^p6$8BM3N\X3 +DeSrUdPWsH3=G?*%A5`6)"jeZV21g84oJudQAkI?eRKUOGU>f>7@h`*Ko=rRi;<)Nj/F%8!B +hRtT%N(Lr^=fH"26?W=uIJrD:n0#iH4BA#K0]A(Rn^AYs)?3Q_LBt"?+"Sm1YMV;oY)rW\YZR +=aXWZ=HNFi8eJi%;=$u"5CWF]A9X+F4>]A=a]AK^,u9cZbtc743!"l/T%r)Tku1B[siZ&[:@'0H +V@WR41?8Gq#/%kB0R3i52#l!!TDjumT7.]AloLr=J@#`>),%/ulF0Hbr`NE]A.=&_%L$PNF)3j&OPQZ_Z/b% +624b@W1]AFaI.<%6"a2!-2mX4>9r(5F3)9=\'t6hZ3@1"jpA#V1>+3%63^uVp60eR*=P=dW%Y +Goi5TKI)&=cm,:+_-25c-CsK/PLfmr71f4PM.64KHZ+5\#Ep<7GF&+rGY&4#!3/.>H-^P/tO +++-+ND;6TJQq%,7OoHE[j1D(BV%"b#dP6CF&J_\.r(qA4/]A.bs^(K;9.4-RWg;ci:,]A)mN`f +XtAPPq2]A71.rKQ297qR?Ab'*,-ga`17=XnPE*ZI\Dl-B*&Re0.S[$aJ/k:`&Zi9l(6UI_,+D +`]AXA3mo%>AcRqD2phmU;E[\qUN7Ao72*qT)Ch-YN:n+>30Z1fa3 +\1R[:D7ol8PCr$?)nPOWn@+I=S:,)CoE.$J5C!(tmr"bCi6L$Qa3X\[mb**(IJ2:.^4@A4ma +H)m[iY4rc7@J(1o=,'g[is&+%c^"VA\H +^pjf.:P^,bi!\c/%j]AjS@_qr@dAcQff>2Va\qlAGN!Xrj7mCO#5Wdo0U&0-"YSo2+ag]A,^8Z +oXqo]Ar9aUMp!:"[s6/1;+'a9TUPge=^&Lt^Ql3#0PLV!NNK$X:K7PH1_XZ,lQDf1_UadCg8D +c/_WMi$HMj<6^.!^>OG+\n\KLFHdKc/K-rE +(;!l<5g0XTbRDS0.omGau21cd3bYJ7jP`f1pYF*%(UY5;CsJmL4H6q?10Mj1lhPbIae182cu ++r,mN$:fbO\F`7'G$)s@.qh(3Z:L_C+e(dNJL)hf(FAsf%bFjElV*N@N*eX%DEZHWqkd$Af4 +E^eC#%+=J$63XXfgABG$f[.p[WAgQ_*XFDStCd7u,FjDX?.sDOp[&]A4ZSHD;t2kVG@-Xm&@a +h48l5U1OfpPQ9>3'gppcdSbr<=kC,MjrT6E5Hek!9/]A&C'm33rNQW)p`dLpAl&0%#m!_DM4R +QX_U=_0jt*)+<\%!f(GF/Rp22r7H=_D4!R$.4FmJ2WinW5ZP,T;g"'J.Q:&Y-Zgj)O!`CHbZ +sFrF+,F'%OLB$`8,Q'Ap4S=3*/TA=ks'c'VqP#Z2#Y:X<9ec= +d-:2s3-0qNbJ9du)rr<2,?"4.u5+X6e-JE"G,_BQTDacn94s->+\3g-pXh_c\93h-+q +]AZ*p0)h9apS8,?5VRt/mnY-fNa*@[8Nl\'i!gt&:Vk-Wp@oZ[0m" +RaOONoFikWm^`5Ti/#"%62&ZM:*VIl:aZlhJ>HB[5?m4NP#Yu$>?+#2)-=:P!,:uG8meTP"k +#dG:W2HC)":nbMG[p?*!(2hnK!354T[_ZaO/hMs]AZ_/I'VgBPTG01QSUB62/A.%%&%F;dZ.< +J8`%:K!(5gk*"X@iM-VAQSs,;c3FmK+^VT5'=W`/Ba1hr%YpaaZ08f5L'tepJZafkqIsaq)S +Ha5HFN@'^5I;eT?Kbd<2-BN8j1Y3,>PrK:77e2qO!F8u5=Yh8(*pkCDo%*GPHbs +aFjl+5:7iQmqX8cU5oZ\E(QhNn?:C5?0'V'Whs)=QRClrpdM$mgIH[(fsBUsKhK6MR2GBB*s +FGY?TQ$6bmIr&!Oi?R=7]A+)MLo]A1t00n'5.?WV/#[G/o2<\ndG%I&VsOnHD"IBOB2$c6G!1X +^r"*kcjr:?97G<((+% +8alK#N!S=B:9?jm\m6ED4'X_32=s0=f+N[5PAG5NqdN)B+=s?-PNi%ZOVn2X9%m'$jC)h^mnI$^>7gbc!A0qb/ +&l,rff5:DFPs1Mg+Mt2c',@e1Mm^HJQS:gtVKP]Ak^:hR8-h[Hh*Of,:*%Q>jd!HT%G4 +9KI>b^=f1nqr]AFAE[X.SC(s7;*h]AJXm"iJ&/bTFV3lH1S>fn!H&.oYZ5YS&Hls,6^8Z7(P!N +0-UeR7d'p!&&:!^&_=[Blr;8\DfDEStQoc5_+S)tsXM? +ngcd5>7Lh:.4rP>9+n955_n4M3l;/>MRR(LS^*il`mY3tdm4+%sO7n%F>bIu%b^EUkQP7VE> +)JZo?,/-)f\2Z,=F[G`\V!s/OU@4tt?VcTpS/-PP5]AGkjkd/=(1J^E2bjmuekFYr=*a@\F?K +QX>_EG9K4g<5f^WG0D_)o$Dr;^eUJU;X0GBB7&@R1"%hIOO-@pN4;XF;Cl?RLH=H\Q^RSJoa +`U#1D8SJX6K!:hBXcm1QU.)U^[V'%(EkY!blQip-IFp-g)ntnuIXm8DaLNXTZ1`]A+i(3NO>J +Q7Vao1CYsDl;01,NjC/aHl6(P`h0Up:u975L5`XLJDB$O.9BkegY(q2$7I(nt$#a@$*)[C*[`a0L)i-Dm=KQ<`ZrX[c=L$]A5X +%$H3@u"A8S$Pf2fMZO%1GE!a!0>cGrWr8*B[J_$W5YJR6UDLsnC%2YFrL#c5_mS1J[9#ClL$ +cYL\fbFp(sQ3m-cDb]A7sc5RUQ,j-@,n^fN=N,)qWmsso6$U,.qfLB3=Lq0X44+6@QQV3 +HLK_(g"BN$nc86P5(3:2^L'XH)gl<.2cB2@ld)Nc+Q>hrkmr*u#`D+b=n;n.;*$;kN]ApBST; +KT,D"=Vq5m9+g.JL3I"?S5p[/Du4nFaHaA?a"G"@ko?A/mC:P!9jnklcL"$n!(?3GWeGs/B/=XWZ8bBe<2(59'3f[!RiS\N!9 +TIA*L9YXF0IO$t(`&TGJghG!KFL!L4]A_`VEI:D_h/^p52X"1N`4Y`"a;p'"A1%i)44@;JRc_ +/095Tg[1$?C&aPkI+S6lMX^`q2?o'ILB'VQ?l1h!T?Eg`@IQo_A>-S'>fVp^2%Vo.mR^"`3P +ML8&5Vbm[3E2Q\lm;3a_l?DA2)):T:"C!&#T$)'2V\n?,QB-OQ]AITeU? +2`(j_7$onAf7=c:=:dYPCG+>3l%/n*m1!raqfQMT%KjP]A,WM9:;P:;#*!$guU +cu0qAdGI7'*TqY8\pa<+.[GCZ6q.!:d9^Cbbm9@fD8sAQ(M&r?o8ekh6[al[?SCW-FBKVBgH +Zk%C8[r+()@[o[^Oc=fDf^u2jS["[frHgOAPZp<\CUoqg@`*b@aW5*gnR*.%$.qUh2FXX7Vi +T?%=\YqDO,3Bi$/eBUD08Wc1IOW;bD*qCh;q:-TA^S/$H3006ch3jTt*CmGSd2p_M;NdH/6F +Vk7CFb!gLimU0&J_V$Z*:H8U+R]AGD+7Jt3s6.&PaL^;^)$LL=gpd;Mb)NDlVX)UPU)`:K$YCZ)Z;V9TQPUmAd +_8I+tW`UICXjPOd8-=_jRY*qKf=;+1Tr=0]A*\l +a$]ACHoEk+3^La6`qd.!jQgun5(Dbo6/P:9cm)3rHG>6(6@">6NT-RWjM6nZ*?6;cEP#026E) +!Z;T"p;bAG97R_goS5MFW#RD*/UrL/ge"9>OUWY0%Dja?-9sboEoApc)#EGA/,X/#)H@iGXY +K0+iLc(\-lQEK+;))IYHW*PA/bdRW`YTh+E:-Yb2(YdV,aF2Q?TZ0Hi!'Ca4c#.uG>]AMZPEK +Z@D&hh_S*$Q"XG]AN;1@KbqCV +);b66*Ae.;$:U&odUNWMN(*d\oLf;1+0XgW/*D6D"GFg#)AS]AZk=\ch1+7(mUE7YHXclmiAW +Z]A:'>2A]A%8+o[kd:nq\3KRW\RP$fIT/U'DQh[EnF%d54BN-h#oXasB_&X0o"QBJT\M\U?[ogLA9Wcd;@f>0"lB`=&+FIHC\@MHX^K5*Sdn.p"8,Q]A7:A&r"7#Oug7< +sFYE&'Ohu]AGQiMNZbL#5Q35+:LR=lOq8+ug"P"o,L@5Ihp3&--KsIsdB&"QZT+a@B;8a&YVV +!6u@5-^M[m/rMoH;N>r@"Cr_VkSjIT:jLujbC[Y'JtmDb@fUo"U5qR`$I2>%^E77(&F.OJCU +&L=U!:qne?o@[#A8(::rhf/OZ$\o*"Ppk2b#&Ui*Bm8,dM%qrHlF*$?VrX+9T[e&e"d_/DtF +G]Ak(jdIXCU="Dp/Z\>SP;d0Cb@^mUH;'>U5.WpPs`\mS=>8Z&u6-NfP08jU$3=7n%#;HQsUk +`cFV#(4d*f;`ZpQ/,gg-En4dEbH=j4_^2PX/3L$V:+G!cEr2#_X"?"\a5al_7bu]AdVFfYFCo +)]Aj/kFm;&6n2(3o"Nf+SRF-PLkaH/&V=9Bn4srEc&@CE=C.OR%3eG)^o(1caY< +)YORD**,/(*)huLo<)`-Mq]ADjMlLhQeo#,GC(7.uDXSX^jOEmG=brp,:0u+SE87HP%_<\=h[ +'K,H?Sb[Q3"(qF,$lt^p4^X+rerIm?/ +1>^A1SWB'>+Ou#R$#;&2c;C(9>seI7tp^)(C&.X:]A$I/"*,5$%oKVNCVR.#D?18G!'?+h?oA +s@2TnoV#kSn*ODE2lWY[TNe[P9p.'uU!e`[hi(nDY9>F5Tj%]ADM.p@th^qf)QIHooQ3Qt/['[n5%\e[;uINBRI!/$&`j;j]AP+'K@FZiM'tF7q8.^l=+8XDe]AOnFeI +(%P7/]Abju?t$l>X7G[aZl*2LK56siX=s#AdL+'.7h(q;J0UKQ2XdW`JV/OI,Vg5N'!.1>bO& +1VrG\m6-*]A7qqGM`M#l\&bFM\O%eK!A;1"Dp>#il,&F%QGKk]A(:$W9OeMZ)1rpXhP`R3qHE& +/fp.47M8sKO4?DfQJ%!o#cc>nJtC7GJUikXGaPh9Lu#'ID=7opE?#kA?AY2qP&kI5'#$Oa8Z +H-+:1I.<1)8j0/%IXDl;`2h$i'8d^/ZT2#GV!8"d^Wu98F1VW=6_Q642`)'_SmG[h!j;]AY:A +_`:FnO",V1I#]A]AjS\h]A_(<(U]A"[]A;_&(u?:kgAjMEJ +t8Q&nBd'+f*eN@7tgXNAN!/prN.Ot1C +b!TA(i-2R%R=NH/l;\`Cpu`Ug7\/#qo(]AkulYB:g5?"MFCbDW^[9Y8KR4Mt%TR1/=p;58;k0 +pGl/a,.o4l(>Wlht1u*pU9CoGpbR!-s+&:S2P*Ta.&mc#A=I)'m_KGsdJs2WCc!%4X>#jtYB +kF;/Xh;6VKe6M0;*_&8?,Y4E-Anitdb*s)-=iXSfRM=BR>iGh+G!'!5)^q40o4uDE4n'/3=]A +teo3Oo,+jkMIe[pK"j%!<.Ko>id#/jhALHH[gm]A&&)c.XdqH.(E1tf1d!*`\SJ_o?CGdjNOF#iAWKVj>UrFf?>% +D5L\#"l5eOf(C+gj+EnaV>"b"TgW%+_OShQ72Pc*bPq.GU@c@9"e8Qn,=3-$<*HT&/-5<&EX +@f_BPpAJ,lE8ZL(9knS=M>2A/qR*FbOoF6gSc",\0BM`GZ7#f?_Z'9"/0)VA3/A5*-`U^TG, +EMM@59T$;@rTf_Re2YPr/iDf[i65cgi?Fi3_%:K(S&*G'fmW4I,J\A-L-Qh7 +]AW3[?:?(7i`ceY;_MFN?`WjK5.VTk[(Ed^k"h6c"OqG=&8FgIV8:<=:XXDW;A:U8g6'CCe:ZY]AKHPIi$-JaU$toJCMGnob/i`/"%E",R,YLQ +6PN$$,[eG>f#h/WP;/=J:NL%,4ZZ*DLJ"Y*=_QZUGCH$$\PqFdajN\&\1"dDN_*^Rfa*h9aZ +miUV>AV+MK<:7oiS"NUZe"k6c6KSJ%)"[B6nmU-!M]A\Ne8n4OnYP+D^<]AmL$khWjqMl@Wh;M +Fr;FHD==D+6&_1fFFWk)pm1ANSLbD-J4bFbl@JKpPTpW7n_WIX.7']A\<6D!W4t@O7mQLY"I= +OJOh6)\@G.(L`Y/=MAaXp'h,XHg2?%sg]A_=>Zqq&>"J,o@Kjo$,$"J=TpL_]A?OFoJ(/%f#88 +"i9F.U+[m`IMqS!$L5\7#!N$ZO'RPinGCmd=iDKE+ +jP*!fl1'ANN#OctWdM\tRLQhFW9C1MSdNO<:NFYhZ@4cTVV4WE+d*cd6g8#LkZ4e7@euRCWe +6OfX8b`2R9GMFf\IA[p6)@Ks8!\ZR9I=Hc@Z948Aepm;aR2MFk#kMqcZKG51NP6[g?M:bqZn +FFlRQC:QH)N0]Aq`[C[sEq)3V +3qHs2H,1SV/bipfPM.TIg1:VD6>AD,9dUUFa]A8':SEk9qq-A)HEGs(>=:]A0%n?t"/)lDt^=D +uB,2&O*Y,4c;'r]ATpt]AXrMK@s8UWSl6N3U\MH8\Dpd]A=8GD@Mm4mBR"-$(0]A-/s$b5m?Mtb$J#;)7WYs-S4[UdbrrafiI<, +k.fXQ?B%/__CP)oS[Cc7hR,6<92`9"M@:Z""-kCtgHd@Prp`_1LZhotRR!C@=4DN/uG]ANsKg +=:q',(4NP7qIE0:H<'afRde3Pr_]AWPf^H$8p2(*HY4;4:*-RU^Im\gil']AZS;EN.`29S#d9+gO]ALh('1FM\2L+J3l`SXk$$B8r6"\eZ1QXG8ckV4Q"C=K,MtsR +r'o:m$mFkWLK/FYuFiKA!BlJGm&L1%[0qO9uGu=EL>fjCiUgZ'2-Une0X)[),+iR'9g5I`\Y +[bCf1=oP";JtdIC;[ZqN)[+!u\6c_nOLr_#^YZa*$L,X*N26d&jM1[t#U'YE)XF,"Q1!N"2C +llTcFFNYZ\jBDc1pgRhM8*7HODV!c8&n[&,lgOq/('o\ChSEWM0\Gj[i3_B6.Dob*aN7P-3g +l8YTkEl\Y#7gT9L:):/e,_3_9)L!O&O3=UuQD3(f.=uXR(.QbO&K8;5;ViAHoQt%.\V\"P\` +K"H+(=7AXGKB?92\>l`?0@d8jIUb=47S8VCl<^\MmNF +4pV7R=^`)CO$N&a2n&W)ufS8lTCdM``!!5G6U`PVH5QHC((hu55O_*A]A^s.!3T^)&9_5Gc!0 +.,t6$FM2bQ.6orh6#j$oV-e%CS.ldMCdWbJ;0mTK,jEoH8C'PI6.GqO9IJg*Aj_T.5XZ+Wgjgc`ko)E/I\o2!["AH\Dt[R82Y70m;j4%E_FX]A,2c#Q-m^-G^OZd2SBHi +=[u$'OOE[;1d!4@8B[Y^dcmPQ4?J7")@EtUqAs_/V.+faSX`?P]AMa;TU0te29k+:Ne +tq(TlL>27XEI#C+D4'mck'XAZq?$+0h"cskKAFk[;^[gb_M(40 +t`mN:,[N>Zet6u8>c9KVn7.?=G21Kh/!]AWiF.*[?Ydk9.3T;*X#AUWpQG;)@S&JrZhGTZAoX +Mp_QYd#1'UgQD*I^:S$NW'[e"F>?pMk./B>5tdgN)<97:h;MkY9/N'm;9.IqCljXQb;'cNX1\2uR_Yd1h4iml6(cU%Eh9[E?;F#eY)4dkW3k_:;$\u@>7faXWV_?qFJ6-\>, +:6s.F(Dk5,,0u5d2B:V$ER-!7Xq?V6.U(*f7e6@oI;C.>;;Q*eB]A<`FiW\k&@<-R)H#YpaU; +&JW`d(VNM5TGhcjM-'87J7Ynr:dYX>AQ%4M:$oTi*>oQ:DB%PK4ob&/'.jT!>S!D2C-dYBaG +tB!'#)A:/qt&Z[6#e\ET#jSWhSWM-kjD\no +CJ!3TOpf7ZaYin/()HgK7*$ZaZKd*#bV!L[[S:@8)4c)C=f0_l.njuk7B+h\j/N,DMa^>MPh/Lla@X#A8_]AuYZ9eS%MYH:#p>Mn5iHiY2OTJP)%]ASjoq<:Tnp[8;^>(fP[( +2cLq%fR\s_VpCtYi-W&Gp%fEufUp>[$_F$Ck35t%FF(PbUQtRVZmN31A^_e1/%YRO/M8Vb87 +"@4IW_[TLW?,FO#a*R"K,n"`te^?p]Am.rmt&]A)SUUWq3$@#-H,nM2LR3]A"QA,3;6jMpp_%L\D*9V`8aa)IRFZu<^HR:j8:YQBc\1BTtcTNI7X!m*ITu(n9mSAtun:DOnjFJEEPt6b#YG_\Q9q8jP=^U!:)8bZ67 +4.B5nL13R-A_P'eD4naN`_q>lsb2:m+qf,W7NO6'#[,Y;/(/>j><=%S[?l#Q'-@hSB4_clJYGh]AYuRZS*(oVUebcf9BRDY.RY2Es5eI7s3o>&='ZnebE)`0qE +hfa+N0;OG1TL<"ZJ&C9l!=`H@DC>U,*'Bp&n'/B0?f4^*\>dG8_X=lGA*:%*G"8KSQW(@ +JoTlJ;DO7G_H8qZ7_Dc=dgC[YnLojFbU\.$cRt`_A%urh_\k&IUA`*ZqkH;>3kZNqLaEju9i6+7>G'#Jf$2E$![;K1I^Z;XMp:@*8U=qtV;? +$/\m6OjUCSG2>$b?!:@XGEE%`De%`E.9FFW]A>O8O4O6iC!25k4UH"nZL4)(q/6lWZ#$T2+5a +pC@K6a8A!-7FMKGPk>s*h5%iFXehQ]A)l@6dC4nMl<"+7YB9#`d.9:X&>>__+11_+haCO:0BSO"WG>reU=5V!s/%Y3_5Wld^!Gg'5%#a_>GR1 +Pec&-B5E'Bn>@OnAOP>Zj^X5qfO*p?L1WM]A!MnV]AqE]AmYo#H4^!NEh0kn5#3X#csGV3^a[H]A +Xb*&[&IWSp8!cLlnt!TA?CFg"gp;g(]A(;MrXrb->Y_@OdM)J>4D'kXf;S1/r<;BSdE7`&Jqc +Pu7'E"Z;.Z8nW]AjC,-Z'O-r>R?,Qa97o*XF?GlnJ7uX2S/s4i/OE]A3t1u^qZ1PnUrAC4:7p]A +RUlE=bs-Q-1>I^otXJA[%>sN+cbP`"$2>2C0`tXH=^.4u6S-"d$ZW\h3as7e;aKSJ1F2lV6N9t1RU7LQbMoHTTI"kC2>7fp8[]A(&TH>bL57L^-\;V7IuH= +k.!j"p=LljY%HkIY7$W$A\XKF?2de"(oC1$U;jlhs!>G#2mC_AdhpFN;SuKMnUQmtNt`VmN=H"[11eCpheLVk$`hO&N1-/o-9sh5+R#5aSU'bb=ZAMhOn=IKim-sE[ +9dKefS@>;]AD(bWR@@L:=Pqu,NjP^#,OZ_QpQ$1E>0Y^VRITJ35@OB]A2<#iA5P',AFP&Yf$p> +GON-_V?rdL1C]AN!T:#(p(d10g$Ga(9...r_ZRPi;J2+#\SQ;#fcBn)Nece6Y1Bo`U&#mb?Y@gYs3$%['ld^.$n@"nBWo3N$M8B:"-:N9odVsc--N?d\i"#RRbXfM=qj<0]A[a%GZ)D5GNC9]A/dV*r7k +FGAKeuHNn?JD=.^a63G[7mK]Ald[J;7Vsjsc/;AHLD(E1fi=8A!]A>l=,T\h2#`qPPU,#[2X:u +F+R0hpk24ht8i\OJ8S4jFl$I!I?iiBah%D[b2JfuM(J.a+QOYLj#>WeFF`?W?#a]ABpe.qDg' +%9ro+#@nr/SO5t]A%4`ea8"R!Vfn:%P,FqS$,1.#pj?u*W^4r"Dls]ASflM4^/QeUsJ*O,kJk7 +Zgh]A^X\/F$CGi<9BF1AD\g1l-_6a&RSqukOZ=*a27gApK2Aci!]Ac0,=RHc[2E(_15:r`_C!d +&PbSiq +GtK=\C!mj`_&[6pWGCRJ(\Snn+YAJ_W-Rdf[`HRcHUO!;A6%,[Dtb6mT%&[8$J@RInLj+ofr +Mb1O:THBIf;m54q,,>DIE`TN,+CMEo*Ns[.u_j8L:gdMe9KMINpM6H=0&,>Pq^=i*[T\#RQfGEm_7WGSDa +#@mpco%JkmQ_G_ak(#<#!I=8D_YhR^]A/J311C0D9s$e@Z@=J:WoCdZPdU[*Oj=\1NU +'X68:'WM7nQi>U@d[)D3>(%eOD/sJ,^<'mU +pR@\hTb70pbNsCWbt7s5[i^1JlPoD$8<(O6naW"RY(/;^ipd2C6U@ns^ci_Tn_+)S"8BuZC9 +SR8=uJfkSI_[>aIqPPlAR7r^PG,,mOnL6`$=m&MOEh#4RfeKf&N'@ES7-/L7DGk1,nlk-WW$ +\R'io9e]AB]A0>RDeuHi7tVl.$a*C`Fmr9J3%pDQndo!\(%VS(laH\(FXqVq%bE!"`7D.Q&K8: +9TFn:hMI"[:[,#XOd+0e5hjO/:pEFe-h9iAmFT(a$e^>9C`OM#D9tdLVHPc?u +e1:5TRsY$Z.JC,+N\q;kqm5-q01.PE#l+$A<9p7-Mm;,;mJ1$sJ'Q\q4k.s1dUtfG$EdZeNl +eon+L-;N1Tf(R=WD$T:T%6sZ1[j:I,<9*'@S))?!W$3L$-dR]Am(U1q^o6P"g)D'\btVBVlA> +KU;iqke1Ks_#Oo3V/8##fn&b4oh=6VXh]A3X0&!"6V,>RaZ(Nt.Rc2i^NC=Ig9"AmFI'%u"i9 +XI%(`P9ZR^OO4p!A,id]AF7kROb]AM%]A2>-e"ij0k]A:EFY+5@+]ADVH3LU1'I79/JDX7]At; +lFRTg@Z!([=CQFaBLTO<$-`:BU=]ACdC,+,,Q12$u9&<%k]A.tp\$2lG$+Y4?ODM%>R+,4M7UR\I+g*92f-GJmHTo>bf.G`2$Ra#(`"5->&CUO,$go+0pBDLc`%La$YOo;"mN9S_TDi' +G76jaX?:X'Sl-^(b`l!cI(kQ'BZ'6S4hHMq>JG2"0fmutKAeD"k)Pt.a;d+K\;Z=dbkg?^/n +WZ1>=Gun9_LU2*P'HUWl[;L`_1hf=p!?`OO/f>Ms2n(\bq4+mRf9_13rW>r8Id>G[ +&Lc5(EA0m3d001#:,i,IIniMcm,QkW_ls2T(O1\[f,U"X1C\n_j-9R*RQPjIVn2ND4YM_[bR +#Is>MNkAuT:rEbh#^sR)ObM;q@K=I_VpoK\SmBkf`jn`oY\Y%3R5$?fm$;Ed27ooEko!nPto +p0mDf=<7epr?Eh#F>Sj(AS3.!9>-Wi14-6*.>^(E(Y@eVW7DF6iN7[^e=QE9:nH'F)anKjbV +j\^[-6,\h;3"/l2&PGV&i/?M)njn&#=SnMT835eVI:&Yog2bWXg4m^-L5.klU%Y$KrCco6;. +,+kCalc/e4/%f0,^5bm:>Ja5&ePPSndFJ]A7>CO9AnABqC]AA!cZNn9m2M(e^pdl\Z&#F5(5*Q +tN#CA!R$>q>7nf#Rmei8Kft)sQpWRIl%,C84(-1?sj&SQ;moG:GIe8hie3SPk2V$+`G +^bk]A?u5(QpFQ&o07[Z;^?Nc<^GBj0([1J+\$?JApX7$]ATBu@Gf.FBQRou3&'W=L+RFmD/'M/ +*RDuC!pY>d%PG"=g`,V"G5WTKI"U$9LOB.iK8^,4TB3,^\H7icZjNJFJ4;mhRA16k]A+%0'B:[sf(YbI9/dVT\"=aq0*JqFEG]AX3^ +]AX<`1+L.nf$=Cl<.AT5jp"B3I]Aq5,M;mZ(:BNC$p4e^'GdJ^flM7/u*7^ZRhq!B$cU#WMbJa +Pip2m,[+oT3nbeI-K@daQft]Aio^Pkg@>iS\]Alt_qrL$l\*;@mPRcCqX4j)a+CIN@K4E1hs^. +rCg*<5m-Gm;31i?BSQXm!Zmn&L`]Aq,QH%26g*rp2@HOP'K$]Acru& +'g(,bm=m(o+(l8#0=2#3;,m^I&d1P-^"jQQJtof9deu!78;Y!c@g2b\M\Nt>]A7VtHe"mW\C^ +/k+Qh`9s2u_IBCfqq]AJYf6nrGC0O3\+sH6i:N:;]ALCjZIj0T8k^8WqU;]A"3kDkVS$;(.aW:R +qOb[uhi?9;2,XD8SbfOelG'tZq!:3EZYAB";o8"D"i#`0nc%*EY7b?s0G*M,_r_]AI;Q%uX[; +)\P;ke,mC#S>pKr+rXAII=g1u2?;e8D[E8#E"PH8G@$2?Q=gTE#2D'3U8>J35a"L^#qn=8N4 +GB-;(2',g^p02rYJS6:U"2jZ:fAdpGRU[;A +<:MN[#f%dq7RU>$p6P66I0,idb3P/P7hP^6n8-RMi^XI@>"ZNJ$=DV*"(C)CuoeN=446X9oh +C5rF`%RIL)%%Im)BsFG'3D4R2MCgdA;Gg#MZ,#G&]A8CV2F!U>j7B,s$uAAelMeulKu+E?:/ +Q"kf.77c(UiZa<*U;6Cm>fiSW]Ak?ZSO/JiVY/QO=N8$7jm<*T.`XJ#c*m8t-hh,@`ONVed@*e!GGkr`hQG+CIVr6= +dZEMe)-VYnB!n^<3`'7$RcHPk)Y),>Fk9"'m**V;B6JXnnGgLD@:4-_EZu8G'r[`R!'*$#ki +1TT/N9KKcf$>H4r3E9GI-N-SEIPXR*X<67`r#Fhi6lC2h7C87MuWX]AXtYh7G_Z+WCAlb*S1!q(.d+rF4Aub*R#7[:h(8$%" +3rMVEkl^p_1V>Mb_CoPThqdJq3%hcVCs<56WZ2q78^CIRRoGhOkU)s%.@&7C7:C`0k\:dr*R +Y*XB7`UHEb1_+X&*p3BKJ'tae^lZ(gIE1#.mH/e9D0DNXc+qck;^"P*ri'6sd;%!?Y[.=')# +tA7dO\ip1L]AEMKM-Z&?tus7>p'ZF5KlXk3cZW\d.GhK6:]A!Cmg?8Q]A9CQj2sf?s0aG9o:O?:"E-bs%&K +m,LO)f>.\+u#8/L/_[TcU1p>KHbq`=h_$GhW,R.P8eL9gob2B!X;m4.c[@1ZGdstSU-HHt/d +1!5an7d\UI#+%B]A$hG"aObunE&;8@[0VnmZUER?,$c>T.G2pCXdBOkrt"D^B\_@m8[EX(ar[ +^[=p7M]AE/iSuD^W(W4)&.c';Kj@[cgX?Fn3>PIrT>al)QE*9%qqK^uD]A4Utod<#)"Af^&Md2 +_9CrMV8^^BcaI.B7m2eC)rim3c1e#?,hm_Poq'1A>?VPf&)@3l4rM#B[BU&4"TA.DD/j061j +IX.2q=hp(Ga]A:F%rIaY-PpQZ@]A\X`>s`uIaC5"dQ-0@3Uu(]Aq?+'urU[mYX25C=efS*0*Ej/,n@7H,]A +nXj&L#3"nhhKcjO)ht*@"3NmrPMn3jT+`?;&Uf"8]A;Q +AKF*PAu8U=U6XC8ZBN,/(9?"'_+J!uM*D,@@9u5cGQV,R33WR@XK47pou6X+.=MV*HKMaJ)a +BWWY`%EP@C'_^W?&8'PG*;]A*"p,Tn$tnK^^>$!&Y+aOim3TM.Th=,As^&5NE_#%h*b(Ts3D^`1G +$4pP&RK:`$;_rMT;1PcEM[f?17\!VTO6JSZ5lc6Rr@h\VW>a/@oF=_(DkU#pBedule.T=OYg2D%Nd$3mg-_BQ<6=V7;Bs +R1na]A3/sAc,8]A.[On-URU:'"2EIPd[5ZRn9pXZ[WK7Hf37EaS2=;X.rD_]AMChL^@,HSpD+J+ +EQlJE*V,+4I*I7TQV,bu[Zc$aG(q&1=8$bpld_\:dMcj[^2 +YC17A_p$Z%pYC%Q(iUWFBX2`SR/4F`u7!%,U7QrgCsX5#lA$,1tq]A9h=.+qlFWu>/u/I=(F,q>eo7F/u-)s'6sjIFS.5s +eeX>W8?1d2'no[;C_VG6mV(":@!bLb3'?lt+lM2IqAN1U!-qe)d!PTO5;\lurnBlT2bm;$6b +ShBb(K:%04"_F!MKaoht(LHO/L#Gr<(5Q!Dc5!JR&)^[pr:dp!fcq&Sfg[\f"<$Ltt&Mm2mA +>9TB@JrL1>Alf+kR^TjfJqEe9Jf5:=*p(SLuh)H"DHoW_PDOu&qM0!E+!6kcj;YD\^5FQ/UG +euU#-U+cgFDR`BfK0&Z1@sBB_L3rOrNj?c%n%Mrje&+)I"%.NjWia9:E$s8k+3S>Sm#k,rA" +&Y8"=Mfe`eecfP+2ba`?s08jg461uV]AZrO9h +'Pt<8%\$S6F,RVLrnJ86;`pTNR#H3EiN!%SI?,6N+6qO._j)MG"!2M=[k$W2@]AiIa@tbp5sh-^".qnRV@_3J\4g]Al[sN4)B\X7>)]ABV%%=1AD!-@,HJ8< +LD)@d1:"har'%nUe3a+hIK!PdMR4?W!)Kl.FY$hb*D?b2PM+g3`:[.r)BP)IqMIOi!Tl"5'I +Fnt-'J:L%L>\=U6`lc@FZa0\WWK]AB"pmRS95iVoP-]AeA+CG/\=m$Nr-EjlO_$^m$`IRZ%l_3 +SQ:0mBaDC=B3*0:+ANW,B^b$`Oe@^ehL";_D#cjOYd:BIai/r^PCCAG%<(*!p_2\nL.[A+0P +rmh3m2.WA^kkcRahM,\=!=e3aa(Xa%oAn/0Q?dn2$CLOta^T;-Gg+[.(%OdfuWl?3)K23q:a +n]AgcK2^Um[7D8AM+Q<76!VL(T9)JD,b\K"ME9[2$ui2V(0PO1Y'ARaPi+7r/]A.,uE"*>s/'(Eqc_3]At_*t=+,AWh@-5aL9?G" +2[?#X&/eVL6sZ6Y[jVrui2;/G'D4*\4)g*UdquO-mm!2lI'GCdFU*^a14pca&;%"7BJ[2Hmc +![jJ@rkOQ*m_gR+MIO#M\BIrKl#\;q]AfeH7rVgL%4a0NWB)JqcB@RIu.9hK(&DBCNJUom6K< +@R1$WS?&dZ!$T'f"h7/p)e:\tGbJY[_Z)SRX#Od^uK5Oo?B-/"2HX+.d>rEeQO/]AWEI$2#/X +3S"he5]Aj)925oHS:8\9oo0.3a(t?\f0sK#=8dDGB8/csX&$pCkeq4M]AgC/KQ?VQRh)\,'T3?)n-qq<(CTlUC@o,' +3eP5=HDKd>98PmSX(Qms9[$lZJWf*/(^YF]AIDlN7=jFQq=jLdbAOlE?rI%pZu!3JbM,D$:g% +;#eP'8Hh0Xl=^[-'^nkB!F)opra@@&efXMGb8M%24[4[TEcraCIm+!T0Pq +)RTM.^c_KRhI%CLS'0HNL&?;B>O`)*'6*6dn\oOfhQ!``96]An6)SM'jWC=aY=)=K>:T2kn^b +:[@(eQ@(IssXXg@(3&Vb\HWSTc1,_oGI^W1>DF?7[hK-,r"s-Z +/'+nBe$R*:=q#)p?Ts!5&L%"IB,k?2:4k+-Y8:GPO?QGitD3AOuo?Lq;h[mVTkfL29J#W%$4 +q5%Es!trGoSkg\oV'$agUI)r,e=\/>o(i)0!^jA*Hc0&>X +Mefd@UkQJ6TgECj$J:"^PH(J,X33koOMTDr^D6*F54*ZY@5:o_NueU#;-Ffp/sFZo@(aP1]Aa +CmrhNGLNCTZe9glO1Dm<%+?!3(i-Q>E%g:Wf?6M32YJDf3ZO]AESJaoCC3oFt"ef1Tu!/Kth@ +.,oXe^ZU4`Rtn_c,5WYaDJXU*qXgUL;L+J\,H'A?%u,2ZqLD6g$S.E#]AKVd/3'E'pdTc!'3E +`K#Fo^Fq-W$SSXa,:]AZ0b`Q$%D(I:S?I*CJHRLS&SsD_^.!`qeMi]A`6Y!*aBL'"2]A#:H[:>9 +iB$Gk!rma/gHN,CrI8.\J$d'W$9affLY"pa2sQI,M@V?J%m^S$_(gJQ'uB,\!K_,i:CFoTC\ +T.0R1#"F%D3i)44m]AdO$>iqs)jKImZH`-LVhs:OM>$:s5s^Kb[]AUuPO-U:2>f9WqCtP:@\u4 +N=T;Tu/^Dq7C@Amu2i7F^9h%]AYT15O=m4cYYDOjY^et[/LFu*@tPoPmG@C#Be!lhA;8o,9J1 +9hai6)_G$%ZjZhb7.W!$#*UPU=EI)[ft8k,d@CC5[Z8(aU(pm$6>qF+OG:Cn.m*9K&qds/g6 +?H:1V4tB999XT`IFtPEATf,iK'/3-m4MiP:)tO']A/N3V7(q;Ao_27&Hb8#t\Z4&u"YaA]A_p> +P.6[\ba\A)'=S&g6QXRpE5:MALOkW[]A=gD[:rqf)H*,[Y4;%pRI=R'&J7IWu5emW?k5qC)l0 +i>KQK;+W>ft8QT6VZljP'(U7@+C&I`X5;,JX"O;;q>`r*OJ^?7;h`>Z1Dk;=,*7m:?@]A&u"R +l#6+*@N2fP'b)<[G'IkGl8B@H)>cf;_d:tr3S]Ae*/+^j:9b\U&Au';P5]A>fGCX+MSAmIbE3+&$__8EgR9XkQZ([ +?2!1/H)'n_C@:jn>2m'7Ro&n^3aZL]AH_V0A@Y*_T*!V6gO8CL#EJ=#>5&SN`gs%cj*KVH.oX +%M^tCe#TgsPsFlmPfR<\3!Q:i.[Bkekk8O8#/Q!nNomd#H>jMtP57V9Gb\)n3oe7O\_+_,\0 +&ViNjZ`b:8GjPs.TdW[4gB8g&4Wdhk&?P^/d\7PSG\4q!A['aJ."2-Fp'66'UWt584!aW4sB +Wn?qs/60dt)os;X!3K)-1'T72;ITo=ShIs.dpAs>L4d]APZ=[kLDd.W]A;`>0N[rRYp9In)ZcM +i?`%0nJuor<8NsJ8b,Wp$7qt?Gj&)(N@&aBZPOIbWdj>0GPZ$WI*CcardWpcN\4/-EY$Oge" +RbEu;pqp;mp@mB@rX)"@=t?!d-qJlGk\G:I9Q3+Nr:GBoF3L8p/+2h1&%rjfK0'79OF,NR1K +"lISo^KP)r"i.Uc412jg$=qtmi:mNNkW352(AE>4Kp7uZmOYE.QXdX2ul__"XdCI+0Q$s/Cf7?5kO`?qX^KLR:.C +RfZXdDGp=f%ZM*H85An1opFf2494PphmAFS[8[G.4:RWoK[[03r8K;@@rn:(O2cgKuVASO3q +7CPKAE:H_`HEtPD5 +.9&dt;Ib'2]A^qnfa3OsWMkFKpO]AU2oDWT`&s\V7e_QMbp4kZmZN?Z4`2:]A[`"j +6C@mYh\Og;AKq4#(BEkC*'iFM#^(:8nHAtg$n>`RmS^+`tXGQF#Zber(A>qfdodUI$3f!D]Aa +H,8"Gg9H[&9G]AL8&$[G#VX+b=d9]A%*proD3i'Hi*<5CJCrr#X.EgGq+h]A:$3B'RK7!sKL04Q +9(\HW(ok12/j2.RM[rco(a^L2$&Lr_ejMn$<"EiYM_QCj%4g07o$4I>#Np7^YSBWC1TIO,E2 +jtM9%.^@Raa*f>%(=NNA?p)gL,ZOE+j+sY__jFDcMG!YsY^W"1oDjWp&1*BNoMAIBeP"dJPq +H*[<0&:s/-=T"J^BFOW$V:[7>GiM(jd.=-Ui?aN6^g97F&9$kEYZ8tI3b[>,3(#sV8`p'p-h +AuX^oujUsiNAbI(5LSug*2_2D12,Od.%"5#IAIZ5iSIqaAIeLnd`A.mk'Y$R[ +m-eD")TpAEU9oCImL-Up4iI]AqKeI60D/*`Rtu&lK`/2m]Aod[&'qLU$-_`3A_LpLA_"F!N4+Y +kj3$]Ac`^^TqX`;KZZ=-$)K?]A;h]AA-lBnqX6.4qU.oKSoBB=kI0QuAN6kPk6Ir::TaQg=RQ6+ +/j&r9saQn-nW8(&kINiY1YUrG09"0+%>(nFeMSNimD`DfLeTEqZ[Bhd7)q%fkAln,3^3_+c' +?f`0e>*7thj>8Ou^Ngp#<]Ac+%/p&IZ.PmW_ZQl!tT,B.LKh9bLKcMJ3/G3N9qacdMXKK.Yk0!#.X?9b=c._ +eo))AZSAH3MR[D5+U>Z^:9L]Al_(ftu`+/ouOa,nN2h3`CNas7K +F;0!CLu:YI4U!1Cpa\a#oT(S2H_*#c-[4D(KsA!8`mZS9Vog +p5_Fm-KYp3L;LArl>'p&.$);Q]A$D-/H!2Sk^;?sT5tBi/\6DF,l_,sc&7j0aTV)K+HN&;!n7 +lhDnQ)@9u]A%C0oK>$8up%q?8$-)P0M1I(k/ONV-B7(F\W;1cf/nu>`l4_2=N\!.XUseWrdGO +6&P%8jtTQc6[r\;*JL%-#emn4`+mm'9Adt@V4IBD4tMj(YH\88NNi[[T%6J_s'ARNq#6_cqm:`_j:"7cahX'k1@u:LKY/6`mi; +nW+VdEhiWdS`uXe`ToE+U?#fkhGY@E-Ucf%ObAu(S>U.c1]A+#DF,*O8(p;6P"MV;h&<+m"Yk +GH7pG+e.>j/P_dV)N8UoTog99]A"N8@o'[h83#;pq +5j=cgQA[p$hIl@5f8Km0#d +oZWXgT_O__O"+'(3?@"[DeqJ,J,L4&'I\Q%N@A^WUZZbIdSk;Z3ls#&2Zk"dX@5 +uOo=8!\DL.$0IOeb,h76FQ*R1d]AEW96)K12@+)/Um)WI#GTp9::B#&36Y2Mm_tX[rphsr>Jp +%/fLhVCX$\\bj4K=mi*^P",klqcpQ%C(!u2j,K.["7gMZ0oWa:a5e@'L7HGT++$^lEPFFEpb +G0%!!BNa8-(Ot)iITdHm^,9#@S^W/?Z5'lGBt&SV3RQB->0g<,ZVSb5C^E=XL#:/5/"ZWV5? +,^"aJ@ZS>N<^MRq$3o$l[=OudW3Mcm*9S1_PeLCnm_h?)++YdrS-!'\3+5S+1)oAHk-"+_'< +nOgg@;j4#o!gdlSP:V80+$f3]A;bK!PniP;<>d*JWJ +*4/V02$f29?Rj$0=<=SP?)CPrC3t;Hl`WmA.,7emrf&:-[+$[-CM#4a3QP2GhEYWT;Zr#o^F +aZ8sne\^"*=M_r1Efm&V6Te%;+;jjM7=cBGpgUQ;rT^+XOr$=0u3SW435"TBh&ugaNL*WY-D +fJ-VhVR$"0:2rYi:^D?.F$Z[HdnPHY.J_(+RPgPp3'70@=L&\Hj+@_E;*ts4#?8P74q2dC8@ +EKfdBmd:TULJ/*c@No;9g>Y&c6FSXXqI9l$)!SEjAGL.Wf%W&N8]A@]A`2&h?)i+W.`Wj;GV\/ +`;)uQ +)0kaVSLTkDZ2iHrMrdP5[-m);/lH_67qth8@N.=]Agn*(tT28ma>gnqfd#_OW +M!R@\Ip.t<5q44H-^=`t$V#V?0<:#9+^A*NWGNQc:9G!"K#"b)M-2s=5Mu`6"&dG)nGnIT^^ +!/#n>tO17USa%%m]A?9DH@%l_f,mK?XS5s7g!a6]AdVrm+>8UiVa&R9D3MZ@e:K!kUnlpS-a_3;%N]AC\e^R/[A +%d([b\[LAS,uS;AgZcaXd1iXH:tFQ!D +@3m.1B[Yqc!c^,1842PB)\CBS_R9[iK>Z(gX)j)\`d[&R8VWJH]A*nE.hZctb:96g?r$#Ze=Z).q*!C+FJA87fG'Ec*Znjr)o-ZR; +@a?.pY$%-IS'KBT;b76%m]A!f_-;c>XZ+*mLq +=!ObJI7o"hcksi4(Dsr%\1SHtG^s@&FGl*T#[2410;MZ"&O8JK$oa]A- +/P>QTb]AnNhHmgUN3+oA%C^d9'o]AcQ8@ZpF$&/mpSVKg9jB"hq'OGDS,Dj6oG>QsB20eg3p(m +?_YE_Dee`9#?U#9Qr`JYM&N)'54IXUoB'^&Dq%EMoK)bLq(m4$-rb&D;?bVsg96?bqqNfc_4 +EkXd3@c5Po;JWHnIR=JYBQnu8(*LXS+`G[?KUA-`!mCAcN2;oib"cJIfoocuM(IJ:D*(p>9gVua!Qi&jlmO.0Vq%G&8PLPglC<^E:ATSIsF6 +Or()H3)?&fYRa>AI0llI*a*R9crZm7k^Im29d6M:I%9h#JY$,q[ZXooPS6tuPM'7V?X'#U>a/JjTAQ5_X/[S%>`^t-S5.2/S^-VgV"Vs[ +BZ>^6Es@<28NnURD2HXC^F#;+h#.=!]A!nT_^kdo1c,>mlCW9%nU$+=OeB"enH28Z[(gQY%0Bi)prndX]Ad<4=DVbpp)Y$M>$/Z +Y8!UWYUi1-1H^g\"YYi5qb:$6E/a@WC-rC_XGAre:i725\.bs!Y]A-t&7fsr*=*d\>n=KIAs: +eVeE@?0JV;=IP!g4S9%>#W(>\0ZFCMU=ZV7^%2MtMGFe))T"\R:;PUN@8NEU2GaH_E,,I5-# +.lno;+&8V!X1+g[10T;eRY2#cV2EN2-U0;46.BRF7okU,]AD5%W:5pSB^NAeJrn(n?S^djeP'msm]AkX@2XN +FK+"!m\lD+aVX`/L04PlnsK'@>-;GC!P`#bl$$+NAh!MBl`FQ0bnQL\;XW^DTtP0gq5>Fd[) +2[q*Ee]A?.OHj<<&iro@i#WRjXD$*_]AqR2u1^\nB@$Q.j4JU$,:m5r8nIObYn^b\:8h?s6L&a +#YtZSMaid0lFdu2T@`-'oh,!d08+fT%elfMLuE\0r;,Z&Uc%rBf0Dl]Ak7`JPQ!X,;/7f'O64 +L!Lc-3d]ASoKO6m@N8$rIon)s8:!_GPg1AmrC''EGt9)>WH?NguVcNYV$+"iWJ3e1F9=(_VC` +9XRY"^BMiMKOS0Er;G+N$W,j36K>q'%C0UhQ)nb9sE('V)^76E*:)`tMqhGN6JVYQC>$g)O# +o,]A:-pE0oTo=FmH=)/JB1I7e.C6E.LX_h]AC^0LATDd9G&bPE\:8T*[D4jpd-&3\5g<&b%JBn*Tt>bu5Cab8 +XDSi-fjPg&@@Wb82@"hVq)OQ. +0Ep!DSQh/oZ8jUBcgfc\jh)k/5)E+Flod%,&GH"^GO;opi7O#l)n?bq9\!d3?P!?F9D3<_2#MgSNM-"/8_aMpZWKU@./ +[3qqJcr;`"9"6+t%N+$mT$Ksnbo)Pu=]A^/p[eu?0< +RuD9eb:j94p54RhHLp@'s3"VAD/91gaI%]A!tpf`nGbO)>NWMoAdsR[CbJV+7[YYNV6oF]A-kJ +%&)!R8H[Z-W4=E;[igpDY52+&%.\5]AHP8prt&Gji!c['%-MStV+ZhLmL8q@gHPj#Xc73ljm0`9_qFI8*=>APu6F;LMhC@r!!>S4 +.27W,'\YX\5k!9I[/;YA23ulDj1hD5GKT-T8JmRKYF?[+oh[r@YQ^Wt4Y%"!R-N`t'kS0p=D +LpgLL=a6Rk8Nnn(CEOl/*HrpA9nD2o+`:(Qp/c[u_irTpI_6"4O"/n4He)>0u!:p,LHI6AV4 +9Sgu:_/onT_lMhM&3[1+S>RQ2]As+q;&FRQAG_9*6Xda]A#?V>Dga\RX0Y'M[bq*e$'F'&&2kM +fOg6R$9[o'+5n*M+d@<^IpW;/IH=W)?NA\C+#PcS%h64Nrah=RPtKe%#7DsN]ABZu02`,m\au +Fn9(')Gon7DW;H]A*5cgS@bP`1ag4HJV:=$:g7hG\nui$'5k2Um,GSdj?#6Gaakmm6@AW^)?f +$QP11'\QLX"]AQPk5KL_5FVMGCRGI)^?H#@kMenY-VT=\qJMc72]AB70cn`N4k2kdeMLMokKTZ +6#*h\9PF=VRb)k'#ZNV)'XAq#W.n7Rcaj"\(Q2uFDD6em[?*g[R>`n\r.n=`j8Y'^%D4QgSq +.ff.aulTM0.Bk97^GF`h9m6R^s++0d1\2Xe0DDu7.'+cSj'"-.Ir;b\#U;EQ?n$N^lK!"^S;jsHA((#q^U"po$*_PLICT +NUKV)(Wi[1YI?;StC:2K%ZZs,20L$lu[buTLjAeNqUNbT0fN03Zc+G%Tg+jAX/Z=Xq+(PaKV +AFNQS:TtF@_jmJI;<.7>3bQn?Cp8]Ac*Bfcl@S`3#MAbHE1pqnB=fsC^$_Dtrc;o66C@<'Z1. +V3puUQ+mnUmK4VA=1Mfd_Kdpq?ju3hH=& +-af+0j*5$beX^T=[1-bKimKRC17t"F`oE4eG+ml5V8?k>\^c75RIO*=06]AHHnd)hb_]A#]A7r% +Bco52r!C6!FC[9+/kf`1':M_Au2)S[BmCGaSNbRrTm-[[6D,2:`,dc&Je2M!H2J'?Uk-Ya&a +L[>-L:"sT[/-*d]A)IGEYs-1MfUQhJk)ediC4"$TmTMdN:-<2WEO-kq"8G-!Qcj,$K1jM;U\d +e6"9Eq+qVF+Y^SP5>0P-:UJB=CU;iI.MB!VrU>5g=<(>*uefF\'0> +&b.l:Uq5e>mgG\_MZKD$Z[]A]AGQ8MrA',6DMeVu5FelB(//R;iH +89?tnDUN(QQE-=&eC'h_!,^XZ!B]AD_0qoN)%AB0<(NfQP#`RGAO;ZgTjFLeN*XA#[Nt64Q2B +jCJLG0eO=QXRk?'#fB6`8BMaXE1RaZtM1J7g_d"jhlDH]AJ07B9WK"C5aXM@Q]Ak>/hkWRgtHQ[8-"nfBdG\*m\;I/OImg'QG_1C$NSAl'$V[VD)QT\& +Eb8u3M@h#SY644f@G^3W!Ap% +,.9mW8C%PDM(\qE5_r)X'/Tf:%3i+4,E9F&+t;:PEGQO.QG+4!=aeq31>eO/IH^SPJf1Q?qW +pY_$R*1BIoreC2N;r?D@SNGeXs'0g1JG/.2]AJ&`7J%a/k+64]AWB +I.F'A]A#BSbX+'2[t@O<6HQ.uk"qH\>ZrS_,GTUY@'D/^ZTG(k3=3d?AllE1&8o@lI+.t3gBB=O>bk_+#+.>Wb8;c_=lH` +*+f3>+.ahl?N7@hZhPK5I:`SXl3DMl-ZI,ha4k.Se#&"DTS)K.cR^@e/pqI.;':ug*^Y*8oH +-/=oFOgD0\'e@Ndm#M(JmP,>KAA/"O6kO+"2eLKLA+5suW]AYt^T("n$Vp2S?h5"n3(2YROGV +Qb*ZZ_Sg2c\VO:E,nMThM=qhYQ,:o9W.ImTR#dsNGmLdIceGM_A?4_?cO`\KWdfZ<,!q.2?R(8bVjTX&&Q +/KN6';[Q]AT-&-jFusLrg.XEWTe\*a[t2r`P\Ja7#(j1sZkAs0,M/mUC:OJ?:T#HNW`R.NR?<(Y+8cD*HIRLM7h+[6aVAC8=b_T!D5l_e/^G7acK%lBOHJ(]A_:*;r=2QJAh?VP +6h;'ItPE(1G=RD1Lbm4J._ueHoCNfbDEQ5J3-0QkiDPpj51hP>i$48pu_-pP$Ui(E6&lF*Qu +ASF>DnF9dN#pMKpE@nH%hN'B-DJ@qQkSI^mGnk(VaA"4ikRmcQ7c0'k@>Kt)td'@#:6Q-ATX +Oo/6lj^;GEcX8JePh&RSk\Wq,CX;9\88`06Df&*`,\OToA2Mj_PW,Ml25eudZQ&3CbH#)E.U +sqHdp)+c)JZSsRL2UQ,jl?BQ`qPQlu\TlD2efPSO]A:(KUPe*]APm%a8\ZROqs+IG\j +&0NrCaX`krP^]AiEQEkgGu[TJ!(nP[%P6=#\h@ePMn]AAYi7%Fs2)VGXLo%eNOko2(JWo0[-Zm +;TfPo%EL7jPYS@GR+Ji/t_$X@h+`r*ZfD.Jt=C`J:-tcE1[XG[L;#P.+.]At4s*H,06e9*riZ +79C]A&X"`;(&.(FTt.mW.?2\(_Jtcb_QD6d?^3L)3`j;QJW@J +gMnIO-*+DfW1;;i`[\$&K/)9OiIT/]A3sb#^C\?Q8U%^-#n+;0T;Y2DR'5eVBM[-//XJFWf'& +7;ps06b;Auk-!ds=@XH@3''Ec=dXTTH?-JoZR@V,Eh5_cIcr/H+O&c./$SRh$HJmT0=3;LA? +k.IMI_ncNpLh2^Q(F8QLs2:u8Jkc/2q%-1j/ic1=pJ^s,h`h*uTt7M!0h)7#NQ.bhb`:.4UJpcJbV=E4D4/\N +_#gRgATG@&^!rX`j;9!J!VK\/ptQG4ThsAPhCk6u;oc:(huK9dctUC>#.miQg6=+R1l=/mCs +B&EC*f?]AV-G\.2QA#@q6iU=N[hQ;NK#RB8ep+=(9#WZ^5K_`diHh(,ZeLs)*DANk^bFHp36]A +KM+mO>o_@YqE#me"49-`&q28>%KQa(JiqJ/X:T=*C-fFkLi^A/^.i,pT_;/=K;HDGjtYRoL/_.C2%G*0)Y<0()k#9=uY,aK@ +.7`tCM]A\.FYEg,%C)jYK!0)Ae]Am5jkneUDs;]AO@IWb%&&;:bQhsPl#mn,n/)ZVZKIUl1"j6: +(TZmp+eE(XG'RLp-IqCgAqq+Um3l +^>&K?=)&[rbb[M2)*+J$;e3,GP:l#XAO2TK*]Ao>GHp@'i&)fPg*J:GH\+BRG@-<]AFRo:/j9^ +\2ggeQYLqN^oE+#)CSgrE_)6BN6cc(eE4!HG62qp=CcD-(,b_Q4b"-:=*b:H?)K=Y^^'ZtL_ +'$14T5=8UBJj^JnT[YIN/bY69S^jrI-0Y!sA&qS9_s?!8[k\5(CrBot)phYoF2M)N]A2M0,4, +,687c8\Aec@,>A8-2$5uf]Ad!t+?K_6pcie-EjQj1u88)-W#^"hDJom68U@MAFSO>*"Y;r07!add1UTMkNE_[L7l]A-oo]AKY)a +e)k5n`/-rbLXQAi'^k%ioB6_>hjME08^ln"or+Y#RC>7mZHhVr/UEZf_j5T`iHA`8h]A3pHI< +p=_[NFi9GJBO8RYR9k$/qPt,nJ_k+d3UAD0[uOQ[HtJKX#FYLcIXJYe> +q8X\'h).j[fq9VrqUXoL#CjsNY"(\,Ai`-cR#VsVO'<2j>4,[CMH%qn=JDQ=DMOr;taXs8L+aVQpXW1lo(etVbrb^Z>ngc,!<*WB> +B:Z&`sK0;\r?^Lg0JX3`*OaO46X9aVP(ru"L"HEcS1kdX83k&-o^QbQuJC?jf.1X?1rKgVf1@#>^49'Fj0XNJF`*a +cl&YXO4O"Xp#JcCrqrV(K&5RQhTV.cm$`t4VO"mGgAGElbE4U@!dFH?12['=im.AlfA;Q +:#10`]Au>bj"gpPl)uB(EQ:kl[IR@9tf(e:GdE(3I>Uqp&'S$3RUK"DHgiN@etj3o&;c-/k;; +`\)::G0 +8q-)s;+/^R9O.2W[j7bqlsa=[4ioW*4l:R!3WkNjX]Aa]A@*KYG<5D#SPlN?!:#+9O9^"8n4/" +).7-2#ke?0BVWcoQJVg'VJk)R6i;atOXU]A3T4]A!sd*Z.<7i;ni$VdJ2p_KogJ=MK?hA +9c)&:)%8=`.a2nE/V@K^N3pj0MT1X4*+o]A3S]A(9!O1B>rjuf*,7]A7Dp@U&V; +Fl;5c`&,Q'QrmJ!_iEFG.<%2J@mNVEPK$$rp%eI[Ct6%FM8`Yp:-@)%b7df2(3$I\0plk-IRL)CZ3[apqSmss#G;t3 +EOC*cK6o:q&:.G)`-_06A[YqV5Sa!k8T>*do.2!e!`)`lS;)41WsR>WuLWqRu<^rWnP8A_Pc +r?GdGh0Yu,7(bc&kLG<>_Y'aFh]AGTd?Sc>S=t7ON#'0jnf+G/RcS/9Yu-HOqT52)u6RCt*2R +fFD&++fFG)bN<,bMd.9YY*X8PJ[%>n8oQc6%HGk]ACQQVL4"*>uN#qG$)8g +f]Ag\iGJ(>T^9,*3j*NGVAf*D@W-l-A)V0,aMr#AT"BO\:kp\MQ=<8.VuT5A57\!38MSFL(hs7tbN38&i;(k'qknnlB]ARfeJa&Dfth,4BTo6-Ch<9booj?qhAT[J +"udn,D1tER@,PdEuqSlA]AlY-5\i)Q/i'>Hho5&OBn:'P+#46Q::5_;Xd6;n8:>cEdL(9#b!SFrN]A\b2T4lhbq5pMmHh58Z"!mihf+::b +OY5d6)Ps3_Oj3)`I$#B`u%7u;kr_.?c]Ajn?#WG>OJ"6tZKA#$;f=WNY$3Z!==^`/Wf!7nF"4 +5:i[[NKW8_/2/`%CF`DQ#:@t@an/!0o]AF5V:toB%_H91KZ+eoZK,H>e0'7!mZV-&J+$#VBjS +fg9Cgj2`f^O@s3(HB)&c/OMn3`FRcmG[,*GK)4jBLkr1W9;%"BE1AHY\t?!Bo +""p%#tgVE_".4GY;94NT>ggfnOHhEc?-)L/^+@[9uBSn=F8fZ@"e[p>"3e&opntQ`"\<8+7X +Wn)3U6mdS"MbQS6V:0Pu'bd^;[\$R2\;,_aUB5MEqVK8;D@5n4fS%:]A5*Lc=oNn/nY.m(6^o +9_+QK?g+oY`!6ZE$n7C$#m_b2-S^R)LQL-i,RK62qe^H@h;)`AH9[S#!a7)n)0[;CrVZoa$= +?%HLf]A1%.#&W4Fd1dp"MDn+kSG47CkPZ'#!l[dLP=9qmV'aFSd^H#Yqea5GoP>dJYgBGO#.t +rpBSA7#UNK]AY/`;:F+`rIo8*?Mib5*,#Lj=P05HBAX-fV?sYO6HBuf99Q^]A_&^0cO*t)CdqJ +V>Pa\6WuQnOBd8n%"jkc23#$V.`P_&f"rO)2WW=(k\(Z<:$PGZ.n8'+b_R"2YqL0ESit@a5n +%-^PWSi\>MqA))\o%rgorE_=jsipOecRhG*t-B^G<=g$?t]A00^)>IE7=;3W<)-S +1d[JB9.>q4qq7H.(fi*KCSD+"Q)A6]AR2hjna>$?@HJ(Ak)YgjCMH>-Fh,IDTitu#LP"P#;cb +C#P+ctT2+c>F9A=Yhf,(LR9@WX3BKO[CmHG7(g*S7Se5N*9\*>>qFgGS8q+:8UMH-cFXU^Bo ++dQ9%^l!Ck@)-U:j5u)53.RRKmWU[8S?>![FC9_2D:"Cc\jn;?3:E;A`s20ehYUFCH*HYJ4_ +<:chM1ln/U]AFT%`XZ*Mc`XYC3An\NQ:U,9.tQN-V[a,02G51MMmVP>[r.D\@&-.\;SP;8SQb +G6:YIL+u.,9<#b%rs"$#Y@fiU_V1]Atq%gW`rb,9?Z)Eo:*hNg!sk,eV +SFEO`bqU(KHEI-asLR8!q>e%+sNcOR43%I#_@$4#QbDF8+5gaDe&fV-9"RXY7cDVStU=1,j7 +5=ddC6H"FC+"$)@2\-Bdoeqs"K_TO4hffINk(=@?ndMmi(Ga^LLkt;r2''S&=KB"uIrX(qs1 +I&WER+obUC#c'!c=Af\J*\/e=\Cd414#^EkXl4-Y*g//5B;t%>i%kCC`Gu_V<"YXMfuQJ&%U +Hr(X\*R-\>[\Ia:_rl%D&U4Q(W@>KIGVu\9:o'G4 +n*N0L/uRGq=C&l-%c_6DD8rY&9&"Qp(M`h=g%Ap!4Y7JRI@#'K%'m]A*1[7.`(TkC(b0CD1^% +S-imR'r-C&l[5\n#flF;nMtLfU=BG-d/t&"GP)4&(]A!D3P'S*WVh[U5geqb4R)=:jdSaAo2& +.([qKI$*XLaQN!QG_5!4W0;#q*rSl)6f0J*lh?!,ZIJ`ls]A/P68,UVH!'#*p4*U^s*>[VT%N +r7OCV`!u(_9[K$roMHJIYt:%8'@Bs6_Y8de7,sc+Yp'`e`nG:bgYKMj8*Sp/U7ba)$AC[hrF +u[YsRu^SOAeR)?[#L<]A!bW5\[CUinCZ9TfpKh/=,FLI9>e"9frMaPdJ0*C6`AhZ=gc>_cM[D5Ho%DSidg"qBHREI7/`9j,7b<'hmD8XnV6P%s/^@7_mjcV*A>Zn8P'o@D]A7i[EC8rd= +-!XK-jqX:_1.,'$qQ'`oHgblNV5h()OBX'5BG`>'SYIl=>AB#O1ULo=j_@Zsp&lELbAno6>f +?b(B5hY.IS]A)d[dMqW"+BET7pRT6:sY-tE$PKB4L/G^o>0A@+a2)h7/^98isjpQU(RPu^e"o +q7gpI@e0"1r!NY+[nh=;CmC>UN]A#h\Q@AmV8dEOpG5,l0 +bmFE<:8--d(FA$IdX8:nLJGqhplVbp$,JTdd +QLKaom?6$fp0tb"dCdf6CorA4HO=V9tR0rlNfDWAs0ZHLF6o#=!KYZ)DG#*PA89=3s-75ijs +%&++O>kM8G>`u\JD^aT9/$NL7L9e=/52o=]A6m2^nc8A7;bgqY2/Iaip1OWA7:,J'1]AZ]A@*Pm +">\Q.*X4\65X7_O+9lic##DL9Mc;"n#U(qZgo'X)@&=+V8UBl?VS+Xf!c,^6s +0)G^J)KNn>VUgMARE:4o?;H_ecJJ8"N0K-2kY^UH@h714Phm+_M=m[]ABZ&kB>)pM'5(\]AnR6 +)g)XW*KUc@9n5>+_1UM>;=FV7!B`ese,BuNj85HJj8Rd:NW4g9$i`[IAJ!hj5G)[R+S:[9hq +sa$S#j2W.#k\2:l#i!?qt9ZeV7,4DR.TXn=FbJLM]AUk5d=#W9t'pG`tL8kN>i8FY]Ajujr,I+ +6lkl&2GA$HmoFXGK9gP@l:7:h+TgtSqO7V;Niq#XKM0]A"_LVnZdBYa'G#6!K(J_VmI:?-fQi +uukII!/fJTfL-bGALLO%Am[CC:`rd#5S+-lZmX9H&R%9BJT;,`3n@4Mhbf/G*s0F,8\bD$a. +2cm!T[dI@"bu(G,NO>f1P^8rSUI90X,cV'UsHMulliJUXE +P]AKTd).:fALqU66D)YP:bsM*3""\`5Ws'\#1W67_Bt'B%5.j_kP)KCIR>.r>doLjO+7lM\U[CAh9_08 +'Q=5!*IA`A&[dKP:sQV8Dq+.:=o'P,X)$TmQ$_p]A?+K"?Ntmbt^-)>1qLHX<,G@b6>75qU(IB]A^EB +=WAYbJqL9l+C\>7b6$G2SX!3OF-!1fJ0d4=6_/CaR`K&"IEm-f,L#/<_cq=i$FPA'1h4f?.l +'&afUM\hXS6r5rs-HF)X1F=)bL(IskiNK//o&W(1,AUs.qafP-=4.Fju'-;8/ra`5(R381;5 +o+9IXpNc^d5I#+o_dLtce76#)0h6UW2c'_:=1>alrid1HTIZ1*0Kf5=n%MS/<9gR=/a::/p5 +7.i!qK0+f:X;2N0kMF)_,#@MAs^ahmde%o!d4g?>QR]A2JrjY_G2hn**qc/EuR'+X`!O[5lbp +bFD?d\>*!ZlB,+^W"\dR`*<[_`pP+d8aD.X>Djt'&H=KDkpjg_L5Z%B`bA`-+O_l6KPMKoZ) +71a8hSIL<2pWR1I0@?pJ%57:ahs0Bb4"5;>,(n.&Bd:li4n*UpE.1+8#]A!pO,h/E^AI0^qk) +aHLMMZ^d;J$m56h&Ni:+ifC5'JLeS-s!g'nG0=*^g![LB#hDA8(AisB4?r"p'e7;m0.2qalD +m-k`JIZ9?C?t&S!1nBWgEh.KNg)S6r8*/4d4]A_FQD7^%UE#=tAd/Imc07[IPPXmck'R]Ac4_" +iQeHsY#+fn66p[`bd*g4;(`Di2%PBsT1,Mite0R'fU>;,6jPZ?]AD"#$:esb6!L^2bSeSc +.fJ`/uh*c<4`Y%Na3O.C]A+`+\8">gKAC-[64O:j)Y]A]AV!PLRj`V.jOJ_7OaE?6Njqc`G5^&P +(KrFj)gGM[_g'&s(p&8B9ba]A0-3<4Sdp%%8`4.Sle;PDAf[<.,\0R)uS11*!P-q^nu:$I^!8 +2;K6S:F>[X$VJC()Vp_=;j5CmC%@d9]AVXjAP@;\[eRrL]AeC4S?k:J*19^2tN<;F_;6VT/`dW +/oJ^9Y-?9Xm>gkN(lILlXCGHPnK'(Ms"[%"[Qp6$&9k5Eh>XsgiOjDJ+N+k5 +4LZ\(NX)HTYm(nI;..ne')[N+.3s7RVB#$Sq4YQ*T7J=U\I +;1Wlh_IhXk:t/)PUtO)e&#c.SXN#Zk-N]Ao**+e\RaQ+$k7Z3#uniK=0Hc` +[GHt=>93J6AfUC0MmoNUt,!m3oC0/pG*);ib5*>2s^-??_D7?m&j2HIZ0AF8kk;u]AO4k@?)c +NQ"nS(S/&en8ud"A-fouHQJW(#C76>nj<]A#6QUR[f'O]A:-R!<;VdiN83E_gD9X[&aR*7#(&[ +o1+LO9Vp4[BTo8[rND"T%?J-031$HIgV]A>"h(BVOeZ401]Aan:MOEHY@tUPQ(QTm?-o0Bg)6C +;HF8i^WOi+M)s_+N0YVHfDKme/Pnc)/P78N"n7"u`G]A$N*r:nur*g6B:0Mm$Ck(I,(Nk5Ao, +.H)iHsm0.!%I%\%]AhGbFn#-/eY>6$k&+5f##pVUCo5< +1(M7Gkk0q=(.POl"'E%tJuaB7M'1ADb(UG@bM<3,m9T)"9H +dB8>[RE5/T'!:_DCB%<]A_)H,2[6[?si(+kn#f7gHiM=D_Mm)Gf&6"Y:gU^m=7j#5Np)(*^# ++m^le[CmD7M)<-dP)Sp1uB62O8]AhK7ecjjqV\Y"RL:mu9Kff`j*tH[dmF?J"qkl["cEI;/!G +9Jn,#8^3Uo(J';'")X+Y$K4-IGmCa3CmHc:-5MBgDYH4dI_0@PD$W*1!SHaoc! +K&`7>]A\e"GLT"_,_dL\7!X]AfMP4g(Z&CDI:;F@V]A'\(Q3M'uBTpTcGm"oQN-Jb7a2o^$Ek-^8r0.HQEi +kX9ZTtA&X,IaO=RYBH8L*;91b$fseLYN'k%H9?&q6iDOWJ%Del?Dop-T:uGjS,?S +jHOsUkXFY,E'i?j?%.jp'C+PK:sXiK*)<+0nN/kK$_tFd4fk%#%[AeoFd#0Q1eK)p:bLZ?Z? +\moWQGNZ%UDoN*s3"^Ls%Fb0QWZ;67sXHbquM'h'Qg4ZPmHikam7rjhAj5mhJ +6TS&Fb4It*A8YHF=HarU9j[.DZXaWP?D'ja?4L:NDg-1hU.4fD0+ICQgF8ABVkj(rj4`q2M- +itmu"$*f*p#!$kq!O^a`sfS/qkH6%;J@1)h\sd9hH:j8f&Sfg\[*=;TNJqCWLRkmSF.HHD^l +KB]A+Mb/K9([X[!P\K7@d1l*)3LS9WINAYA,ZW,%nCGVcCdu2oOf:-PWs7'XV,Jkl*B++P_oD>EmW[Y4G"0($ETu3dL#J`22_LSKcLY%<.4ac61dgBh#%7"4S)GiB1f,sC`XJ<-sN2,9oQYEqbWlCo.!dI`!'Bc;5_9iatF2`+]Af('tumI +nIE#-qE`8Z;f/Y1B-u$\e +9Jr\frUHss4=?63JJ1#O30#SV#N+P:Y&O>@\DE_8JQP4r#29g;ok'0[ds5'4LaJIh9,h3>'o +E/![pe`Vd=7hdIi3UVmRF@lm@qJ%1J=PGOY+0_P&qT +DSVE6P/lfCLSg

              AR%ilB(M=khV8^'FZo +6_L57cR=kc7R<(+A=-(/dDh.Dkg:W$?XFmh=sY"\pocQgfs1q6oRcs"o(r%/L<<+q;RNqSp' +ok65PudnMtOjZAVdJ/>ETuM(sr4t(RXN(8P)LBPnb$lFfbQH;,c+ss-$pHJpa\=V@Yi8@:bm@>]AmXJ`_LI +;\E5HF;pRG-!Mm1"+2S/=s"YB'IA9`pH5.cn(p"7MTX"BeFr\Y:&k!-k7Vm45SZ2unJu.c#. +2]ATmE(F@rGP)?D#6:P$"Y3+1=#`6*I0CeqnmLoo'9<:K +p@ZQN)J8oK*B,=FVWd(=2+=G4]As5nEi+?Qp+$%=LuoPaX@&rI0YVfVG#n+`9*ij\B7':bV#T_qq/T^%'sOpm+%E@*?09KVflYTZ?nIhO>$24$#EUL+:'[DOt +K06:#!-Ni6o;'nGS[\8+5s2TEPS\dQ9f4>Hl:2'/]ACpMLk[H,ira;q%e&3#C`-Zp(:+HQ2]Ac!CFg%o$=Ze7VYlQn*O'f[s2Hsu?cOk>'h_6tS +`TJP*bg@h]AVcDQS2&i3j`jq>p+1;q8$AD3;G.1tV,/*UfmjYP`%NmG!0]Apj,7eZdXcXIFq9n +Q@_ed(t@-P0?YY(g?jeqo/V[R/,V]AVEY_:A@+?DhrLf0aZV?53416?Lrq@d).JBT[I'" +36kkY2SVts4C?`rd?rN@dpHn93/&A+sBWZVCh('JEKXV$n\kJ,!(D4LrNJKHu9)YoQ/2Yf@6 +:Pc6Cq8cD4B10+[/auSo2]A4*IeY&M*mS#";)nnF<5Y^esng"H<[>ad0.Bn+^dqX9 +Ke,ikC)0VaK&cBo**V$u@D&)PZgW\M)\s)kg8.s>]AV:k0Ng"f+A+)qeYXPCJKj_SDa2jn/O5Tn@r)D\"F*[r;-0=&N?n36R +)%ITOiV4oePAUs9K!88,$a&pVS]A,-.cJ-]ARe6LOn$Dn9-D@08N&p+@aB42>C]APhgS`-DXN^H +fJYg^r"StAB;3[SZ5X`%\Z=bkX/fTB3;8fA=S'LL5i649lpFtWCWtF$Ch4F8"P<.g +58L]A`aA*?1r*#3d*>TZR&X"4V2]A%.pA6DZ:@UeVOe8`'"0KYBj(7uX$@.<'(SgW ++A\h@t6nc70!Z4*V[)ulgob\[--NHco/7Ib6qG-8$m`+G2IliYU_s_Lsi +AR'"Wh[dI44sSI,7ORXbKY,1JT)f#r4g!pbLV#F_\J?V:675%)@(gpg]A\0nUC^/.fLeQLrn2 +r!oQoH=-,=5j`WOQ]AKf'4AR7'"18?E]A?LlCkj@Ih;7_5T2K$7qFmAgW0t8!sjVd[-Z6!4F,A +Kf;j)gVM]AmbPuaCGTYct(F0e_QR"@#<M&:Ma1eP.>l;ASPpRSh!mk%O>As8O +-"nWB@\'br%#K*e+@!*R;>3XgIF^s="3o"\sDbEjkL$T#9+4E^>hnqu%ipbrrB:I#0%M;QL+ +ASLZlItS:mPA0=jJ=2)p8XZgUhs44"q>R-^qtEJ*Tf"`@Y6&_3qicH#TcXa:NR*r^]ACFhZ!! +~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Q!ahTP,7KMeHW6qt$c6^/-no\R39?G^)l&mb.TBVTdG'>9ar]A`um=*WPm4E515pH' +gC#n%JGOX8gc(8!p<^*'OiI%MBBerWd^_2'aGX'-nh;<@eQsSJhnA8L,RCr!-rXcQ3Hal+U! +mXk"0`PUtCM2^+-Lkhji3s'jA^kN!IM;LNM(S2.G9nSmTQ<@Q;jnD9FilJnI`)%F.k_pLoYJ +A#Z2J(`?k)F@/fr.6A,l1!3ki\g7PegSbrlqF4V?,663RtZW=Nqtj/UK3#+qO#%;lXgou-^J +<[^4)h)(HJu>>^C'S8B41f84Wa!&g?_7?O_S3MZr2HZp]AtJ#ci#P2RUKSrp*[HT@pLjF5 +L@&#&a0K`+gl[_]AH?4&sU!i*NFRkW6W0d_LL@(%I0EWbgpCFA.ifBul\/2;G;GoRo^6eH[Sk +4FH*\r+*'*^B,03R%9\UiLbr:j,b"VubRqMb0b6XqO,Z:LG,ZOhf,t-s-P[15Lm\OPT& +s>8`<_St`qJ#l*DZE`^TurI)[=rk%s1RRletb`FJqV)nVe+]Ak672g!FNkc$'4rEj0`j,AD%Z +YHccs_r`kbD1f^OlIDoBBWEO1qk#_F8L@?E1A`NlDlQ`@/j+*aa*cT!3XY5"M;KN/=(^IP1h +YXKsI?RZ6Gp>XQX`S% +e<'Ls_\DDUE?M"f`&0R^3u/Fiussd=*W%RnQP,,dOhP>Xu*I_J2b\Dm"T":j[0Aa"bHn-*:I +D"nMqhI$4DXOJP`IUe:S')*?MAP8Vs-I"D'kO@*mhBNi`\q#^?HG%&F:/Rqcr25!'N=rD7'G +%(EN+P9t<*d`?ichOH]A<6%1iEZTt1YlX2\>/c8$aLmEMd>9(PA#DR1[#D3ZZ)$+)7B$)hIiq +BD-s!1,=jLThI/)\IqU"N:4:C'E8kk*Q`^o3kVP*NX^5Wc9latSj33Sos(Dhk5"#!Q%>+^#p +iN.Go$jUb:8g"'O[R_\P7F#AocmcV4(bCN/q9shVm_\V>iau6knTPZOP'tP,Gtj.=C4VjE)Y +rYY]ALcI9jOQ/>idm-#gcGVB=8 +t=eudEE_tiINA#2a\VG5'E/@;rr4n%C]Aj#0'%]ATQc&\Lke%@PD1_+=-1k-%oiH?HC8nIZJ?f +BsJM/a7I@3SnbL8^OeOBj("4!@if9\Gr6:9B,0K`^ +G37TT=1Sqo-[68(O'2Iq%0,dV+1bpgDIa\F5WRJYZ&M*r&$Ot@Dp=^f[')il'*YrmK=I +jB2Y.P!o/c,o[dZa^H#efe&G<[ctiU1o:2pqu\#H%mVsMM`2oK=g"D*1AY]AqEO6!Y[rFtl.?!/XL^<"MYE##_) +$2O)alAI0@#;7>@[9;IDpcDHnbPXf8.6h1OlYA9dR$ce=62!$+T1"r%sp[:R@(4#_`:UL>T +;oNp:G5h*YX;K.1"9rTr]AsNJ97"I"g']AMWDcsj)7W/c;OR#?T"Q.qp_#aaOZdqXi6'SPUgYs +7%\3(URN$b8Q<]Al[sGajBM=oh=dr83nhAG$Z''"C>*^cB^PeDeMYNi!B-<*!RQUp[@P<6@;[ +=16$Y[#X3&;j4uusH@%:q?YohIP`'(^ocsU-BLTf6jM=_jA9eV5.$7(dhPm]ALb&/@dJh9^_G +B4X3_*Zsc5J?e^&0WqS62&bH&Dh/W]ARfXTYGD>gRc"kKU+WGJFaO +eeh/7lZlX2'NQO5#uZ4u+RICQsuQ?mK9o +Ui'[`_Hco'%E5?eq0W0sUlE&A^1%D#unsG]Ac]AuNqrp +/,E6u.Kh4!4+uZ#rg)0d&n09hXHWQ>I=IFX:cKKR>E)]ABfAK.Rq';sE8X*_bh+\m+n%fa:R@ +q0icD^naqKO(8h_LT]A1)p631k_?;`Y+Gtgu,/bAI ++@9IND39AHZU+>Ro&9J30[.Uq+X[1bP`#A!<*LXJH=k#66CEO>F_Tbqci=Zh;5XsnQ+1>aSs +Ur]A2"^W:f8[./p^ZB<2+VN!#qu[AmM78r"sWj;fD$/gq=)8(2D0ZG:8Quqp%nMgGpXmR7%bo +fQseSIlN\X'OMGE#MJ[Re<:gb0j<[[:a)]ABjEVgf^GgY='\&>./,2blrV#Z#[\8?f(qngVE# +88o@-Z5HB4RI*_rRQos+s\.eTCEh_iOV-:jZe7+U6$YCH"?[]A1Gn`RT?L24X1WR>?"H8P#RC +X%h%`nCcHDVj`j7']AF(52#,^kYegcmTBW9QY5ngA_XdL*+q?'"6#7&DDXiOiPb-k +(""F>a2;H3Z+H?E^SP%*2T.'e[)ILsjGkQWi7[ugj&k[8Q:iKF.qjZC`+U]A8eSbh,B8r4:Nr +#p007J;bSp:64Qd:kRGE_@a(st<2]A8%L9]A9adIGN_*SK<5h%R!e['Z_'02T*A'4-cjEG;,7W +0@Sk*>)l7H[=#2DfP]A(j +0!+_pac`g=[QR@&RZNd+f^C)Wh10.SJ1f3K9W!bAMl1Y\-in%f$ZV$=rO'LkP\*N^2e-W0.X +lLeKp-*#a7;Q=GMt,%VEg,)A*\6a +p-<@:+C`jJsX#%R'gnYHh3nA[NaXGZ/&G')4ci*\:p$Kl:Vo(38Z>!dh.rKIR,S;W(q)Y+>Y +6kn:K3)/2f>F)pk*A.W([DrNfrltD#ODhnDh!C;lH1W(JYUaAYrO\+,6gKHn>YiAE@WjV2dm +DuC]Ark\-jdh.P!7Gp?kL#'P;(FNp'+#iWaPPl-Ios%;=XE07%>,G9B>]A(Hb9L?St]A +grrfM8jXC6M;1(0L#"G*%+Q:Q(qXe[fI5E7Ws0>1X6qtoas'd_R"sn:4ae.<,@4*W1fIKb@nKRML(ju?k:W4UqM]A ++UiV.d'OiPG*aF?Xi205.Db\NFSf=mBF655@9oD^RJe[VpMeB?<1='<# +ZS`T$Q3h,6mg0XV)47Pms8pT_:Wp=Wr.i;@cDfLVKNhlhL]A&'Zg:@5BQI`n!I>YHtdW^'0)fn +dEFm%l6U7k>q_k2-jD(=3"OBI^2T#B$3^KlLCX1=IC2GcF>X=Es_rN4pXIeC&E`u>s<_SdDjDN:RIe',iWCe'O`;)/"Sch"aAO"6>0DV3o +p[1PA\1tM+TMs).^]AkQjMeS/Q]ASdVjek't>6c$f$+Ob_BYQ&ZH+et?@G/::d\_?`PKX9?_9: +\Z1jrup'gbjlOC<:Vjb,k9:2rQr4p=8qGX_L.*Q<&tj=c-Lr8c&u&gL>o9pEdD:B6.$"k("> +.c3F(sXRqG15N8CDU59G@_*Hl1+;\sEo]AAk")G80.U!tpibgR@*:_WH\V+1Kg#u0L;,B#h(7 +.AA4Wg(Qak**uArX)=Zbt=mUmum-$2s3:%F/;E.;N41hMoU\cNtXb8Bg%(8=0(,`UnAZLckm +3NNgDRZG[@FrdaH#6B2(KB?ZV2`?)tl^qNFNVTJFlW&fdcN6Rn*q8:i5(KZ8FW-Fh5XPAj-(JDEei;:47sOs/.S>aQO!<411ks1K^m`G.)-oN70a +j^ARWOIHcukfOi>%8!aXjTQ516ehMo_8oa4`h_*dJ1@n.\XG3Y`E/@[7T!rXQ(b[EsN7!#bo ++'15fC-%%h.O%VqA3/q+Bd;nTPRLbEndIbpQZPMYsUcKV1#WT0^\Iii^^Q$ju*^]A#CUdG>P< +jG@7>@R3Du3do#t00[l:,uD7?iEQE=`]AgV[b)`gZ!/>6Y.VNU.LLR,!d)Pd4*uC!B7,+^=no +NDF]AV>(iS5UHh?:L#a/)R0M>FXr>Qjkk7p!1,&'!PX)_cYkH7> +BFOhU`n*Y]A3Dgb>(:iWrIj$JEBn\Wsg-7jgsKfCOLH!-Z%kdpejmM_@i*of.4"&*k?I55ae1 +p!5U1Xsc(2IBOL@l]AV;8SQs@?S$;AFYSMcMaZG"(8:'6EXp&F>Pf./>.;F>ITc!\jTE9&Ti+PFRK"\mIg>6V7R'=L09H\Ws?kaDYG"qqBKc,rMl3aH'g7=C63! +1L"99?MlZO"&,#/`>J0cASoa$5pOC-q/aE0i[^V":M]AN:!"_kh\T.HcBeUA#os\*=\#_gr1. +2nkK_L=@]AOlM1YTUAtaY@CUUG'WLd1jQs"Ir&fVGC_"sldb=gJq+80!K9O4,5SK_B=j*4.(cXhCR56KH+?1dcqbHCEZ1+Xd''/j3S +rDN&-1u3_?Q<'&'MQ"nElKC_/uMPN3-gt;F(9C$3Ua^hlG%q6Nn'9_0K*g]AYK(Y$o7rF/iK\ +1Fbp6P"pQ>%WICUKiIUJ(5!@k<-rlDM;J8%S"Hia>=KjXsMf$=H"'UR]AjYbJXdEgV95E9j^% +:TRNM[A&NJRW`I`kSP?$J+LKS/6be>Y(JrAQbRA]Alb1l_rUTA')>8['"'d3majc_,ua(/9:_ +g)WXp^&&>!X^,&#;2R&SjF-!):3M0-bYC:7As1sJ)f'^$'P^fEOeLeB^J*j'uM6,PO+[De\- +V`U]A-?.G8*2:OcJmRE5Ph4NJmP3%/X\@n\_'mQZ*;(p"6J:M`pY_)Y^g"sR"MZ]A4GTo7h7_J +:@VBB41sg43!''*r.SO:0G^I3^g +CZfg>hhi8$\gkN`=q:\D(]A[_SsR2!7=5:ObHXWm+`&;9H?"ONUh4IbAP0/TMukP:3i(scP$^ +Tu0R+dC;3-Y/JL"jZ[7eeid]ANPBGpVZQsuH0/YE`gld9InJnC6$TYk("[,9-NCDiRCMpmP>X[)0%]As2eCg>2/oI?E +W"fA_8lBfRp475LmH3A3e'E/<"MSA+1D6NE?*LH8=/`_1)*p5oFKn&98FTNQ-F;:&*B9u.!M +C>CU%Sa7"?\6Dmd/EiB+E64XkEIqF]AMK!M;UEN)#).Mk;F<1as^+"A`4lcpd]Ao6UL[oqWeB- +MoXP`]Ap$QBBBE\=M&"D>g=Nkkf&^=1>),D;`4>KXr'&fe +4+2;;okS?._IY$ipu_O[d;p6TW'ZV9O+"5>8e;DFqd(EaVr+N=hME)PhIh6]AtF5($Q.85e!Z +g@.%%3f?"LbCE+[=-GpH:_7KG/&U4LC7D/P^u\c3*^Dp)_9-NeXXt.)jQsTe#%#s;?q006^q +8_0/UdJ^KEG8BD8mA'KJMK0]AVqI%b.&rinEg-;@Na6CNOa73/lK(+I(@5FIrNd?)i0'!f#Y@ +hC;bBN?Mb\(23]A?uGT`AjoR_`258u8W0Z.[uf$1\LETL'"U-/R.M?YM\:[&)7rXF:!NZ:*]Ac +fLUPs0$(Q"6$pe:/:MelNns)6R;62":1Qkl]A*iN.(*dc +T1`/K0c`_PqTFDUJiF$N_M1"%>)u`t>=0nlkPSjZ;ZBVlQGR:&_9Eca?P)e86l,ibibUUoA7 +$.YaQkYJ6hI$D:Q)a'qr1 +_EfIqX?Ptr&eW#^K9;8mo^eWk/X-^Sk#11F<;q +JQX5.)d%RWmR&_4i^od;j6;bZn\a1T041Hf*$J"g,;,j2SiH77nf*HL;GBX[+f[Q(f"UBHX\ +<%e"a86gOgA[Ko!ph0Wd#*VjZbGHZdno9?VHi4\$RBgeDtf"km'#YJOHl%[plcm/t4Tu%;Mu +a#G0=o@(`!/j3rBuh'8o$lt7m +jp5IUJ!LYEZQ';E_9t2<*o9EQIp`&FZaLEJJu*0)ptE-!a^p;"8Q0eo%\_n'XWP:`N/t +3l[@/P_gTQIkD#S[J3^24XcZnW%S>eo&rW[q&c8*%nD[]Akeo]Amc/ht``#&&?UrWH>kFeZ1>T"p`tk0/Or/;%`B&?cp.8(DSOp\VG?f +h6&3YZ%Pp8"lO"-@u:$0JUSbaCs*o:b+@h,+XmOk.X&e2c'/3d;>'Ee?%eiJWM,[ma_OfKN=]Ai[CF8mK!%MO:p?,l1CkM'!#j/Io9#]A*&,9iGhY%%,i$mHDW(u'A=8hp*6 +odP2g`ThklX:C8nprmghV2E6&D1'4c5$r?IA*]A!?aUjLV4)SHBf^&09"#uXe\**#Db;XSO>q2Nk+X?fq[ +:hf6m\-#HS3Oc,ac*J,<&Pp+BZ4.Ec-,(BoOP<1&eN3OGKZi>?ncj5$BN!0&:7V*I=]A/'kdL +[DSO+n-Mc.Ft>1`0!2aQ5UKf=^_UTmj>o.I\p-k+N@B@dBI(qOj5NN0:FY_`^ST#MR"cEJc= +/HM+\/,fT)7I`R&etcr^F#D2=H!aA+.P5+T"H*MZ\ksX;8[MoR&oD1M9WJ/A_M(V&OKIq!;p$20[Wo$a4 ++9u<-X4.U!l:3MOaM:?WU8nfFlTnNZThRGX+r-gB.E#:T5ZD:?lFmO%5p?D4b".*F!n1 +8n>6>=njW;QXrKp0P,G+\."DCXj7'u=^;qs4/g4aE+\Tp?ln;oo:\R#b#be#hKWD]AR4J'Zp[U]AuWX,Y[! +i3>60VO*G4?M&?^ROP#]A7rI:?kFd&;;,\39T;jC'3T1H2U%fp?J%_k[%m*P(0'!CZcd`u[)j[ZcGPr +)%G<9fQH^LR9K\!8ci@^k7SJ)qu'BQl"Gqr,/iif?g@-c!@5A_ +a6RXqULX62?W+`#PI:c\ah75g>4f>>]A;sn=@MQVtXl0^7A5Ik=tVCpZY/>i8p#i&1i&"Ye@\ +GJ1KLn-1g_Ueek\:[[R-D/Simc?5$LAcslkk4GqI2tml,J4[R=*msZJ=\Z_U"<(T +<:7#^Ub7ecRfS"ieH&N*Y1ue9\=@XdlMHY>FZE)SV)=Y/mjVeO'3jG/X^,/(I_#R(qMSB/-p +/3^V[+#C[*nAVP>S-@e]A\Ah\p-2cbn!Z^Rcu@/H,1DfB(mB:eLg:WNW*Z59&.n#BDp,A"`gaS0CVdAR]AamrSIu!I^`=dq.gs,6Q +lj2kKU+2=A=^Dp6@.A>r5T1JO4Df"J;iF-EibLFb4?/iSmPBi13VP*=e"i4)A5/Ur7:b>ES5 +p2ra[$[-eW>;+&QDg^?3b%+MXRp0[:Q!q:;S8cHgt_YR\89g2(@JI[_QF)L(=%G.^9tME=?V +OIZp+FKCY`K8"[-V,X!Oq-0D-q[r3mDsq.#f8Vq%_aWUmc +Z0CGFmAgo-?u9%qQF7OblF\Q^VF']A>bsHO7u%``p.SRQ.+Wjs!4r^eEJsGYn=3C.+p"&a3Bf +#_%b(Cg)I%s2.W8E"YHM6g<2>W8,&jSK@.NtADD$=/roBf5C<^JkO-8lth!Ok0!dp)?IIdBu +h2_B%F)dSlf5q+sMU@2E5j6OTi`lK:="q'YI$l:B3?;Ur5S,cniYemJ'd$P$#,9Q^XHVtWGb +!W)Qj[TnkT/A(s71^'ThC\KWnXKnVnRQQQ'$iG!o3Kj)p%\ +`hq)"\D"kk#QX)GC"M8jmM]A+d'lG%[`]A\'dW:/h]Alrd]AjbK^n[+Y:J,;`_CO$"7 +ki^U_4::r*4fjP<=n;ZdF=GVkm$e=HSoX/]AeeV1GWaM.;;PSs$c[r,Z8OFZreB?4uWHf-Y[p +EgArCm/m`=o)MjJ=\[H]A`j')LYG[gL#ZY'e5.+;mH;qc?.lNZCU:D"/.p7T.<. +&\L'EmSip<28^k__GVVFa^0`&4U+[:_"6_kG+V,.#Q)-8":EB,KE:N>G3Rj9=iP9m38:_Nk;/X$=QL#s=jTJfti +_0Sscc_p[!Nb?Q8$WI)-qpq%h1BRHb\LeHR0-2&#*_Eoqn:IW6TLjmB\;aW24JNQB>[(#gU% ++0$A@_B9Z%Q/CT54(!-e\0!bs2<+:NUcn!fK3"i7kO+GP*_Y)-D$QLKhBk8*-"2++$H"R?F]A +grpl<'B1BHpM(FIKfJr4NRs*,3NIT3S0iNZ!d[T7YA3B#6T$kVe2Aa8e:!9``h6jg&np+7b:?[anjN'S +]AEc?d%t$_k_B!PtIVUIpPHN>Que3N4,@sEP=9_cl&99T!KVeKlF<$O=Ka*-`c6U+KBnB%sK5 +ja4bTW$)6mk9d3I7[`cbY2u9`#QTi6Gk()M-#a'Z9j=-e +5]AAEZAb]AXpPN)m8p>7Mki@ofgH%O2O_Y+&!Qjg09g^9VPAEah0%b_Qt8tk]AY+ +I]ArpQIQZh^&_&"acBOK.]AdPZGrJAY*/?h=S/XRe&o2j9\N8`TO?mIT4[7P@PPY'`3(C'T6;N +_+mb\KUr%#.CI%lO8"<=e=#7?Q0Vbm=)/]A#K!W3LV%+ +)`!4lgd]A7UD^dNlm;'mc@+55JZPk]AC+S\qch3!;-(D$QKG3Zm)o&Z4=pSBHXh+!* +bTr>j1+2bU`1V5[MhmNc0''tdp*!8e,L)Yi+^([cCcSnNh;n8$Hs#?kAo`%;`Je^65D>O!Ci +u7Fe`6p,UQ/]AfS$^L!_[dHE!F%o_RB3iET+Yb%>J8c%9L4,r5%I3%i8:SZ=UP*hI\hFV,JRi +]AUn,>5Q8dpfnOp@`>]A@=/K":tro1@[WAt/M.>@Vj-_Q\LPR77&b[fQ1a"4M6oVhJ`qjlCX$Z +ne@TJF9HFAJV_;2lGo^aWA30`Gj06f8Jp1RCX'dMSt_6SuPguWfE>[;4]A>iTD7luT:EH4+J< +BZYB13`E+ZrGmU*M"m=+A&0g5.4T<^+K;JE6_aeKQ%9phGhF9epta:)!H*qV=8mM?['Ne_(o +B#n@K_(uf+7B89<6QI6Bj!A\gL5k$Z>k_V>V,VFFK`6m*cT[-DU9hTB[MATn<[dM9Ic3H)^Y +MPk7dF'>#gpKlEQ(JtKdJdj/VXEG'\BeB*$;:?bq:!l7DKJ.^"e8grAGP_788Ln,'sbhH/mS +!rHNPG&&O\,nY0QgHnJtF-*>sm-+3Vp$aOO`WQH2X6ljS#B)^GBTW:Qt9gJu42$5?s/n0UK) +K\'.Gqck3kKY#f'M_Cq9$; +//1.L)$42.QYq`/7u-tJ_34P>5Hn'gnfkUJ$jigjcPVOJbK5\5+ +pM`?CK0QIb#LD3j]AuM.giSN*Oea=3:@9B<@b4?L#`oobmFem?E>ZVtJ&epc)*o"'6a,XLIcU +*VRmj*utohKS=pBc[E,&+e)MqmOZ>i7#Rc,qPC-4#UFTLRY`c]ApJp!1F,0(IuW:+`^IO*]A +f_f$8lCVI>LJiBaS_M@EMQBcFVh+Q_0$Zs3-CLC1(9PX+I['M1TQ&bP^3q:\!+)e$oj +#SXW89";&6@>UUsIa.,M+1@%!8BplK2&4rEZ\rk9H%P<>qN;OC`VrK$PO_;L.L(=/-dD@"a) +(MPJ:bVE0GT!9m"F_hkD2dd``uHM(*)T`cK1F:%AVQAgA:`0dbCu_O;T#K\/2GM6e@RekqUS +l^CLbJdDp4V5B:8XXmY,5Mk7(*f=W0s$'!s0-4M\@np$KjCYurtkmFNRuP;ZopVi5:)[O9g< +4/M:\9foH>&9;%uE49\^g."lO82L+k)9dRI"X'cOdH&ZRg"i`JIlP#TGj97oc/."5;4HgS2* +Btf3*/EtT'PM-Cb*,k,aW@jo*_jc^K%B-DU:3G=p:;[KiYMT4&^dc&IQK4[An9 +mrX=@AYJc/RVjNJ7F@B,HKR:odo[dh^b-]AQkeZMI?;X9GA?9@^_hH"9c;H&j2Z5RJ/ASlMtq +hTb`!J^8&V\@1D=73fj%k0#=L01qn9Q+*'lUr'r^\0+012uVMc4DnNOafI/6Ochn2_U&D:SS +I9qO**Z"<`)CG26htZijbp=p;,SNDQ58B(J4`KP.uJ(_\FC,:D*`^3c,27GOdc4bJ@KUZdg3 +p%oc[&%^B@:^,,8o0?TB25OX:OTG=Sq$QEsMI2:g]A/,k&:/IKS"0Q+SXAO.a-n1-9o/+nU6 +k!j(!&P6ZmODc&LLtlIAV(D$/b_B"O.K[4-/?Z$uaanWUC=XpfY=kC.lgX6R-WX;$XS3Zi\r +UoK4&UrDR2V3qqbbG +bG1USUR%D!*I[t7a"hT-t'((-)&bH5b-ur'^qA)RHqN\"Gs-_Ha[TcAMc+DZY +,Q&nT%^@%"8_*XJS&^N+/4=S('_1fOU<_tOoXi?.t]A/SI081Bp7Y +d8\5b:mQT]AIC.43AD:1(`FA3?4hYT[HJf:@RE!4kcFIelB.?/+lhf*gEC@Sqc9VX3Ha!0dhR +n7Zr%e-13s56l+1BY[8TG>1LG-cQ[%DL2bXK4&R,I22Y--'g:B)PC6Z6'n0Y;Bd4j0,&s-7r +CXgukG9lZCc$46Y>N[1D$,CCajn1W9R[2r4k(`8bF-7sTf^u?p(,9c80JNY2(h43@PU:i^>Z63Edi$gnd$)mrK:H3k8KrV:L)lE.*j%a;4=cHf.#AQF`,Ot_ +-@^8f:IO,ctXa5*jSKQ#K.UVCJVS75VNdU)3(!onMLR6AlsLUK*8IPr0RJI)@Haj]A:fb'tNT +(2PDA]AZIThY>TuW7b8f,;\jY4`P]A/X(S_r%qtJU7CWrbP)ORHOfge"qDHg>P+B`VAmnu1E9Bdk(DDrC3I+1n%Imn_(o_]AE.&12JeN3l!1*\>eLL&5j +Rr2)-qfKg-LZPmhCN"WA(#sY(t:I>^Na!Q!_^&KAkk`j_$`'Eh;[Un6paY09BE"&3CG^N8K^ +pfeS`le92Kd0LObdcE^LT16c!G0Si:h=o/&Y#,j,!aNTbB_H"(DV/CB[*L_InuG6Mu'n=#c5!P<]A!(O%'6lQad#2[^;R;q"/($WIi%*85;=*@o7&l(l/uoW^\%\= +/ltT&Abi6jFp/k!O2`A%.ltkIuH#c'EjJgr,14f5V"[WBZSS3EPHf<."IUeo&C-?jo9.W$mH +qB\>&QJ?n_t\)\;7!#sMkF._")'o/r@1]A6h7pq:/415-FJkC.0lI.:V]Ak+dBe,Hgq(c9Np:g +7"7EPJi^Qn+s4#(NnIT`qaq>D +-:WFYhUY@'-Sj[oG?dWI@fLm]A'/-!oVS<>n&j\oV&eY5]AZu4Q4X:pW#f_UW$.$W3]AOqQ6_.u +bIN!MB6saOEr<]A_,MgTX$Q\7-_"0fC6M>\!R>"H&h+We.7-HT/k6mM!AOnP%Z_ID52L(CE%US7(RM3#D(IQ!'BV#[`tK'7FoU^@q";5IIU +[)N.(;!lLqfdE<$9ad>fkK1[oL_es%/;u3PG3klgSjml4sB`GqtRBkbs0Z.YZqSj2:QVfKZ/ +"4U:"Ihd1ehqEol&kn\$O:_.(CVpao@=A^K,3F:6BHq1I*9;O[RDY9R\^g09[0`jFkb4i4_C +99N(0>rVWhUjC8Y4H]AV6u4^Bq./1@(To/@nF9D,>fO?V"qOEnUT\X$cN'1gI'Z/qr_G\UE$? +q;OX5E2tRqh\[NS+u?"cU.++.(.:MLFd@^f([S*86DVjQ"ZY<9/Y: +(iR<:2(TA,-pSXt!5kq><71AfT7T;PtSu3IBeN(>iSdds&PpTs_o(`8^U@O-R]ALAZMcn\SjQ6rd\8q[Tr3!.8OJ@-W`7G`Z\1T#\O_F7+XTQKrX"qr&Kk?F +N]AR&rH"3u\5IYFcI%WFP^mB/V0\?8ZE&`13m-[XOd^;%h*&i?.-ec=rZT-q/[1s6s/n-RdGo&X+'_9D\RbgHJ,>We_Ekcd=5ZcMqHol^s?ZR:1+jGJ_]AZ)T.Y\ +TRN"nZh@fV?p3XIfnQc'P:/!g_%0qZsXsU_t6rlug:9"@h,bU]ATW,.mAbbt0?M(\$U,j3q"GQ&NU<_DS80Pr6E-2lebWa&R5 +:?@nL=PaLk)j">+G//_J%jFgo7d/etXY%E[5O*D\-@haSLR!k'&rmiSYdU0fH">bJBhMnY&7 +4!9\(83FKpgV+s5V"&qn-d9@eGp[A+fi6Z1&GX^3SE!-41NL#B>Y_^EK!R"n@i5MB7UXJk/& +:6KK>NiiGko1q>Y^?H_d(Roe7X&2]ACVlaZ[X;g!%aZ$<_?UP+5<1)",\dd%uAQG-MV,T:O&c ++Ob/8qiNP.J+Kq>nM+@:^LTprXYQ5='H(pVG1qa%;b;B/UZ-#$tdcl&ARm +CT5iHV:+jcn`(4Z3uDAPl%2,=-/=U%eB5]AWuL0%L_DXLW*%GZWp*fJY.78HS::<,`m^bFg!/ +4[5FLlEjoh&`_$h."RQk.q)J!Yk3*-+Q5pKm;rEKJk`$COKi$1u2F0GmU;6jgiQ-n4YB3/.` +GT&sp;"h@(ZiLV]AN+jQ&.;m?TnY5.$2.W>!]A5N6_?5/t1$GfI[IY +$$,mIgd;41AUQf(l#Pa+03"TVAsLj-UHRlcC:s_VlC.)MO[<;kUrknH32& +;"FP(igktSPAqRZX2c=_WjHXqH!nr+QSF0h#3\YL@-b/F#-2VH.b[W(i,Y2-8DG8@CNdGoOUEi#,"SeYJS*%d#\fM/_8dHqbZSj/0:T?Q&2=^2H[*=Ld62UDJ2tk=t`mVE +LPoT$L,0b`md5p^LVIpj"cX+5r@>s/\NHo-9lbSLBO'MM[h3YdZ3KuWiGaokn-]A +84]AB9uR]A=2ttLlBj>Kl41o^nCbXJ6WaM*"d]A-P/QscdcWiNTep1HA.blLcS)3>!pdf$UP->2 +5>M?mO]A2E>n\*3HY`XGK*S;7aLn2V[FMAAt8Jr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +bt#'N>2\Um,bm6'RImcI"X[oOoLLUq8oZ5e:I#,ZM?B2OXrhBLH517f::#4n +&3;GCSs!4reh8kIIen]A!(GQ]Agtk?V7X3NDZ]AuY=8@ig2?8h,"2Ko1>K$:a8(^4:!!iUijlLT +4kB:m#OqrCC'c()'g2'ZB/QB29L&TkW<$3V5X;-$.YlCn#":5L]A%pp=N`*KFu@^=_1&4Dm)^%`7`u00JlrVUig#MT*+1 +j5s"=_3_'57MCs.+OV17p9TD5X,H)[VN2nNAIQZQ%6jWO?Hi!%mW-Z71ACoRJsm6jt#Q+< +YMnJiBi!HSGA)YEgI^pqT\OuF&b)A"Ep=8&I=+AKka+N6AUukI3\7mm[go#Qdc'\SK>6^X2# +C2Z*H1f8Qh.-",%4dt`"n*"1Pd'Q; +8d/!4)8lR#S=ht,]A<8uik?"fZh^n6.%]A>d$S]A^n*c^jfSfkXaBZb(L4]AT.*Y*UPUSgN^k1Qn2b:q*DgnREPY`fBOj +Xk+)Gkcb7V4r=`at`.7%Z_Ve3H[u^q#+^DLe:%Mi^s!$Z:@T#\0"m,c/jE&h8"uG1XPUmY5& +E.f9TH^e*%cu;H:Xff+8%irTlabbjVGcZj$[X"P#tq:5St,1J28:*&Xc>q$GX5iV%hi@B.G!5 +rh+4/nF(h\*p/FQZ1+)k)"BKmjiulSS.c(#9Mrd>1(Eu[KW&uRp42J(Ic'^[ +;-MFC`0'7.[-@"qs05l3F<[;(EC71-@ctG1#:Co5b6?Fe?@)9]An48p5niDbBA&Yc:YW1@sWK +1p)35]A6_^`j(#lCOk*7?jZIooK]A*0ANc0D.$G0+*K>P.+7/bE=hMklAARRMeJ'*7^M.po(]A@3V;64Z +X7$8Di]Am-%"HWKP[gAZl^c.n%"SD'o:2X_l"a2umG4W$Z?n_]AWON)dH:=!OG$=npJ +hh\e&id?/O*L)qjXjqj>X4;O3fdmZ^qWUT@?j1)a8\PDILjS1?[X,@T?"aWVGm2)f +q,=reXYG'*Fa>rYkd;5fC>/J?otnBu8bHM0Uki&Xd%s,"*bjZ!.9:P24d)oJ]AgoZ_3QbA4d! +/=Lr&flkXq@LV3X.,%!%75Vgsh,=C)0JrfAc&?.]AMQ+L;\H7tMKBMWTL]AV=KNt!RoeMj;(g` +&sZUUEQ9REIOr6.'ghB*m7#Q.Y*j0riTupF8,CNMgg1Yer9Knd +X)6#V#3jMV_H"]A`dI&dq46b%-bj>a4g.PFVRV+WCM._iDhUUR,q=lE\@rp)JHc-<7Jd7!HfE +3XfN69_KO@M__-r5SF+HY4"lrl_l>;P^\6h +S3#ChQuK^Pqu;lJo]AM_,J=(SKPrrkrI5b)X2KnCfRJpU_`j&mu5:!c-K/u$d$e2Mr_n`p?b( +Eq,BP-a`EW5iAYjYRZrM8G/k7'd%E3#We=bIqEoicda.k(6IK8^ +MdM]AjO)BC\7ZGXD4`([Er)G)e`:n'Y+B=/?]AH +S0S%SN@^)lmuQdIh48lGWp1Bk7!$ZF5@@+T$MS\*!HrLquMmDP0560`]A/EK@?)+>"UU,:>3b +W`/"-&hF=lP5KYBLbQGY!AWOhN>Qs`2?i@6#Rc#g'i(`pUkP7mBgR;dR"3r5_8hNM2O,OHgm +BV_;/&sb*JA-WL;d/$F;Lnhu.M[>V^.D9'oeo)P%Jrk&SfB@(i=\]AW;S.I%=P_#'s-m:(k#3 +):)!`m$5=e3pp.#+1*cl0A.K8gQdUR&fk*84*?/(oe)2Bum,4l]A4 +bPF!Ek-=WVm?i)VXRXDGcfr".Rn#"l=GW,dFh4Wca69XC$Lq)Zo"BK0/K,l\K9t'B4dnSJ]Ag +lN4&O"u:WP*e)R\d=0+N)^'%'(RZeMRFdhu[1jRg8+8B-,_%/&//>i_&U@0>\2S>udCiH> +<&k;V?FP`@P)lOC[&;f-$eI(SrH<7GP3jLSPh4np_gBn5Vlp)WXpP.P$'k/,2/tZ-Mi(;[Fo +J3%C"993hG_WDsoZT4@*]A#np@1/r1$86+YcD9#]A#6o +IQq6(+AdSnf/9ag]AWCE>0\q%IT-Q*dJtQbj]AlA\sh%!8ZM\NmNZNU[g7D/Zs"TmlDQH$490@ +#e[89"d-S_*_d)K3Wi*.I7LL`gnf;p#dUN;V>5[`-NFkqssPo&:C;1f +`V7%Z-P/S51@t*rQ&BO/rRX%9LkcLttQ-b+30W]AZf[j'W15fL4&ag#.=8l#VLsr-8D +jT4)aO?:?s,LO4qr-'*WDjJ,shYp%hA7GV\XQdbg1Pom>2i?C21Z"#+s:X,Mug!brJ1L.SJj +ali9Y?fXm/i[%`9d>J+]AH^D1gGJ2qF_6gc6_&.3\Tu`CXo?"")60F)YY5?"N3lOgS;-RehI@DYj.X#Q[8E6?u=!&rYk9mi9)eLQ=fD5%[ao%gl-Ij=5&aG"@-nP[/V[j2 +F2>*KTulrSUOdR_G.6D-Xp)?D!taNF1nPD8L*G3Za#Zaa:LP_=I30gsY.)$`t/pmZb#i/T1q +q@0\Qs.4Y2EQ+A`d42KPa[p?^(I?$i1?0>KL3R"VU`lSIc9XUFgAAjF;8Bq4K!i]A$cF[f)fGBU(9BYn:.CC*1bP0,U-J8iCUjm6VbX-,G4Z\aCe$Dn0iR.sU)M(3n%j&_V3J +\p;+dMamM=B(VLAuXnN`;aBPNKbm5mHd^DM=qH:Qhi\HTSQa>O=!OPAH"\U@KL;aMUs+Hg!K +RhmR^!%*o)f%7>:cEd/TfPVE11Z3\Er(\-GA)KNW.nA-d?.$LV?=62Rt=0MSMnOldd(#ad0f0VI$l +GZp(CD+om3iSP1H(d\H8'%jC,Ai+%esY_#Ai+gC'pH*'bQaAX[#Lts2T*`Xb_h.H&+F/c$!F +e1t#.!U,Jna0nX&-3iFKac7ObiIW0ceh\ruKT' +n`@]A++Ba'RD,e<_'MM&GW#j.Ql8;*lYRp(lSZ_No%3`>;qquC%Jo(J@P[1Aid,("tK1N.VPr +-F'R7\_=?QT0PA(Wm_5g=Rm;d;f(1+"n,<3\^eD7siKKLsO:lt5dDmDT34h1+&mYn-=rou\h +1"s\mQY_1qY:(-A;Lg68iu19^l6%Z8)#l95+Zk1WJ3UHtWWAs-$4k"Vj3]AAdC%+P.@a3;,R,ddu@Hs8j.2.V& +1cHklsLgOMXN@9BRIZ)-B*:PGMenLM'?Ubj(%u0)RCm\q.Z9ZMXCJd$u#A8Z1YU7@eoBNYGr ++i&Ag8-@5D8['q[HmlY0iDSQDY#BHZ1-taUC,mH]A[$b.cY=R%'0b\d_D+QeX3J=Z&nYbQJ/([fu<>;P_4$g?KZ0g0aI!?Zj&=&^:P +ur`fjY\]A[6A,K[(7(pXT#ircZ*&Vf`GI+"2\+m_!LuJr6(6:a_80M99*85EK!##B6a7Va[s3 +!%B\FP>_Icq]A\-]A0,MdB1:J(sWX`=QK'q4L$G]A$1P2KNjTNK1)+D\:,hCHuKPd)@-M049bQ. +BI0IOl4Hhn@7ZSK0J6D"2o2"Z+ctOFRQO/lbRZqT,l+B'feMfG%Vd%;f)(3nV6Tb]AM&fd.0H +WL[T"+ZmuOM%%/fn9>mb?LBNQ0"R4+W=1A/`45Al<]A2Lijc2DE#g>]A.VjV.R_PS!+qV2M)6G +OrgRdab^Dk>3EDE*F5.r]AZON]A/-JkGqBnEqHAL9bjSm5?gU_5aBVETN=`W;0tQo/d1*=UDi +INIMGG^;V$rD.>+AbN>l`4oS;PK_*b_:1sPo^/C')!i%Ur;WlGApB0A*tM1_MaC4q@=Q" +9?!.?_r(AKWp3P7gSoEg[C\MQS%ne/Md=u1;JYZC0jVAUl[G"=Q\lgWf +D9)-I?M^CX2BK;KT)ZkH`Yd88b4.>L_`(=# +]AU`XQY=Xrst+a4#1mJ%^'ga"(WqZ:bdq_s)lF%UkJ8<$5nG70#il[4$Y(YGYYI9i?4G76h$P +=s#1/b$#+pjVYpfsc&eF-#biYS3/R(19Y_f)BD0LuUZHga^.nM^f6uW.bK4A3"Z8L20_)b3"pC +m]A*\,`1nmE5nhfhYD\lU"e1qF3`K0H]A0cDQoKZjVm[BIa[rkp&2ia/1C^9P_%BU8EY9qu28@ +F_J9+s;Qu58^B&C57g3pk,=)Uu\.#jB)PoH]AY9KYAcq5;'jkd%q\K[V0d*V:JfU+,&d.4-d4 +Aum4(GN*[]Arm;UB<\CO#\Emg +OLglu>9\`$4,*p,JM-GtbsLT74MIIU\/mJ/Jk@8%AY)`)^)N+co'?'*7rH +^MHPZ%B4-QCeJ1>S2J'1Q!Fa:pI:jMhT>,2cdKg)t6m,)lDTHAXl/Ik3;6kcem2*tL#X/V@/ +4g4'=_ZZeEmU+*u_f'p03-L%u6=E +6@ELI0iB`bcp$(8u/X;04_0T\-m8:DB:Z!4AI=fk:XocN`QcC_Gbtb?#K!]A*WWFi0*_ZBp?K;!cb6*5%'%TH`\7<8B:Bfh,0b_( +$L)^L3A&QO*tIcOX.$OeDR+X6:3X>JPH7W"h,4)hNQPR.fT(0m\LrsW@bSAb3;Y46+fAmGbs +N,c7Z6q%-gH:ns8Dje6pqSMbiJ?.[R[%lm.J.:,4`?+^.n'R4$l-CEH3qk0i#0iOjaNldj+r +\[R5B1&h)S]AfjW9W4:o-g;^/HKkS^5VPkl&2,HjLU5S:Jm[G?hC`bp>_-k53J8>8@5la;/!3 +6"b.fU$D8'I^OIn&<#BGQ?2#mFPE('k[!Llb1hm]A#Up#$NOOCV$UYZr`$sIJV,K%[tX=lJp= +dMpn-K8;iqY.ebfU]A1[gbK.X)+q=MPJUCjS@i,g`(0;^HrU=cLbnS]AH2\F^H.NCYNujS[16. +HKs&h)m/Akc&HfN7N6dVobDYQq/\@9idY*F4X%hW90`icIK;t#*WSeANBKlYmhQ'#Oi*gHNT +\*QGRNOY>nFXBFKK;U11a/Ql5feWQP6ai[dh0;ALnc&SepT]AYK=t@F[5Lc7FI+gC93.J7:s94JWC%@Y5-aVk@-lc3RB)flspL"nt:^HY5rdi*jg +VtCDLS\F&A@m6"\J=!L,+)Z:EM"c1Wah4$\VfR'jVaFO[A\0$s,"#82i#fl!J`V;j-i+qQL0#_rBm=b` +U8\b3HX$E"H-@p$o&snLuA/J2$+PB]AQ0NM@GF"c0Ii`lX[g"\P9-)ITVKVo1s&<S,`]A#6>BmBWqHgRKZI9a-2ArdFcp!9o"\DQdp +7mV[HmU-u&tj+_%0$TN8$^8e*JGCrf)YHX&`L"8Sl&>2eJ3mWPs?N%TPIY') +%E@Ot=Kl;V]A!B0:u^C[GCKLk&Ds4jr@6!j0oE(bk't'N>G800WDsOt^qe(j5#^qW +oDIXl;[L844*'DRnRdb)U#E'JUDNn8ENbMJ%Z&AgS'B_HhQ%4a9RsEHS@ar4m6N^S:\M +F/e`G425-Z*C".MK\e::Iddr,q]A9f1mEb)h#m$$RYQMLq2_+NqQLQ"D]A#6q^r1l/*1`=f@1- +Y3MZaf+ekkEjR-:m33&b5bcH'[*ao8_)V#$ZcfaYWA-"Xc9I:%.DEScf!2k)UOb/AXJg8 +TF;\\F%WN)?kM#<;$O(Sp)mYjsWJ8p45fedtmk&:7N(#^(sYV)k?MlY]AT(&,>QQ#X]AB;WJtEO+2t^3?moNtQ4oM)h"(A*U+I +F>:g%dS28bDUlM\i0hon=rSD/[\kA?bRaV'.*;6qdcs!r)F^r2qWS/B%>3WJKc`7Z[/.b]AJ)G>rT]ANcBRO__h.U4O0]AqlZX.M)Nh: +ML.??nOR/Pb(shM0JkZ;kp8i[IoP[9?[*^EY!)iQaVM+gAHT+]A'UL5M#hEr@KKQqsP.;Sm;h +OY`?Y^7E]AEBA'YeEeQKAX_CHhf:V7UL2N/OTQDK^:l605;9WfXEg8&HNa%?d==bIShd36Y,* +j<\uc%_DRbW?jaQodde^PNb.euc$oCld^i!=]AifVu5d7XImQtg[>V#BM%ch^APqXm@bhn^H7 +]Au7hrkN9%+\Q'1e["/J347!'?^?.Hk%@c4\eDZ_4uU[,I[Q'?i7$(I.Im +DTSGaqcV-qkK?lMVl[(DL"BCQ-Np<=;+U^=Z:W.5'WelbN8fqo_(62;6a`1:*i-i/JMU9s(X +9>meN@Nh%FAo6V3QH;_b=rYA]ALNVq!k>c^I7qa+jq""LQ(1I)G4nUi6D8ii!@AkIgX=GS#tM +o9/Tsfg5ECm2JRO(G"MVZH[FRrpL^I.UcgbZtpAWCK[b&4O!,'bHX,I[NO4PUhiOq'ar`*:i +lXZ0S+g[tRma^UfLoW&4FT-)O=6WL1b^G]A&<&*UHVA/25$jS+e'jEPr#emJNMeD693o:(\.T +L._3fAdSUQ7tH[),qDo\_3-A+bpRJYS(,g.dVP3SVe5d%0=25Ne'UktX16,[kXt\+rT-._Ji +mF-H:,oSri?)>%[VXPGi:?idq_9`TS")@Y@m4D7RtlcVJnCGI`0#h+90MA_l/ic6n>PDW+7m +<.+qgNaZFY>O?VDOiP+3jflrOXA&ToPC$4j<;Y^f7_gn$K;@k&:A5m#cDg]Ase@_XGQG +8ob7$WT"4c0i.mp1)Bd,M7SI#^[`M@^,%MkXRROTBd%<\F/b[^[r9c$5,_[Ctn;9eU[f.h"7(Xm0!n6"-/)J=D/nmB!A.V)HAjmHFa%l:K-!JE?MS#b$e#j ++2BJLU$o_VLT(-BBM`_gQsceGCCpt!@kdh4X#I8.EZ)@&mrm!4@M@1-<*U_id[uL$F=m\J!U +>-YcNe>o1VZ$<4shId-LTZSn)V:H`J +%$L(ij7:3?dF'UtnuTSOXK9J3/EKL.,'4Vh4nReh8n>.k2XhTBmDF +H,PHlS207[1o\p[')ebTQ@3caOC54H@WeiS"9tim1q +qCT'!3L?,'Fqm&$AE4VW8@^X_qWcKW-j=C<0,;0=6!DJ-WfZakY,>`-`i26Nr3u7"9C/6JB* +6S0+,_IhX#2#V#mn**Y8S24("/7s$g!`MP\-A4H04nS)8Ob,mVR"mhhD]Ac@5$#73.c@-n_G= +;Tkn.T/91r;B)qD,+s@qhQ1#LlmKG^O*=47>o\JjN%\:c7SS[N-CS)iK=.CpNGY,R(jt)#f0 +-R"*n7:;(V/_E:dkt=&VOd]A1]A@aZ.HZbu-2V7Znm&O2)@Xk9l&9d5oboW92]APhp0lhLN'l'# +*O')Bkngd64k>a]A^[5W_#QO_%E]ArJu7^p!<$8,2':q\K]AK+I3Hc(HdQ*.Y_HR%$eFs@Y>@r& ++Zpb+4=V!DQVS(I-LM4\D8RVaD1n?H%Bi7c/Ts:0H:H!;Add/i1C`F"R@s1/jeFe_W +hD4pU@uPK6Y(MEd/B]A*XH5)#.O_F:G=nUl3mGBK3M(bp"^Wufs/SG]AZp"6aJ:[[Q.".SdWpq +T%!!*q2!H$R4BgZC='`Ss*;%4CF7>;aE;MN]A0#N/GBt_L4k0f6h3WC\t#'X'*kr/N?)Dc*3V +L=9;Ki>i2Io`h+FsYM`SSU&U)RN#CJC[GV>"MRk;T=Xq9($9@,cnoLJ&LY(%q^;e<_A`]A8>V +*o\P,*#m&QDUAh.iFRp1bV+2fDQ=1?Or5(/3HIbh"otm$qPffY:,R +`hW8[PX*U%1tlE5[cJl5L-UrA5?2ghr\<+5DWPq>UIS'">kX(#R#[qs-snEcc'c?\f&ibPLX +ho"3L0P:43Rg&&.^2-p\D]Ar2-[#+;3ptWg^"tWOTmiT_Pn!96ga&56L,g^25Put$7j-7ouXL +Cga)\[g04KiSrC+Xp%.D3q^l3K5]An?:Ee@]A3YC$.-XYNY\052i70s6=B7 +l=BC?4W=b'^sXnu&Q&`5C1GHB6)^6SZFlS:,HdX^s`IT&Pk(Zs$AchZ<',_0d$dKk.M[1(Z- +f]AoL3Wo@p7`tWoQd)GU6Vc*5iB-g8NL^THG8B(C2o_[pq_m%.]AkiHYga$G]A%Bk(@**m7hRl: +jVGFb45mHDINS@C#:uq]A!Q4U0Q2XO.kR9g1h25cO1S;3/]AbE'guW;1JYt*0R:`uLC7[J*8[L +'r&>!8r:qh/XJfr*-XFRKRI\6dFQicC9k9!/Uk1?\PsbIi)Uu[Mm$mHp)=-q:078\3H*PMbF +jS1oBM&9p+:h@5r7Cl3fURmOS$HdGj\4\gE.GJIa:#r5&D_$B6lRApFW_D=XOP=^]AVUZ)A9^]A*@9'cXc6/)_)h +9-KokM?>'Ua0o/(CZ>S("/%U0!R8$DFr3;QWn;(VhQN]AKWYc8AXCr1p=nc"@:,`)DJ)'r[WoN14hoX!^_qGiEr]A4'I>rP2BY+"=3BUsFd!7tTIW +sFM!BjV!LL14LU6e2PQ#0*on6"_0*pa>>+9c-(Cl;\gs!M_FQ:)_Tge"A&+l1!fOP^U/SgPr +N+%U[@K,:<.e['n#9E)*,+fgci8fu[29=Jl:%@,;!1N]AX;-Hsc]A`F,7j)R'!a;FkB09.e>Sc +64Eb"Xns)!8D2;k&:7/T[/f;?!.W8,F77u!IC*jIOCeSa)'*gsH*f]A[;+gm\u+YL%Ci^^F5=+PclMQ&s3.GK%XB7/uDU"6e-C&0'7'jK6;cT\NPh6UTa +AagAF<58XqRds\/h$GPF5N>$+b`]A_=\?^OA$Y_[u9AoF7tht,[mL^3^s>EYk`4"0[bXrZe+2 +c>QOO^G]A[ajgm\$`Q.p!rCZoJU3ckfbkO7=--d*n,_k=O(iPf2_hP3^"[3$G5KXZ>!;]AfC^YhjiFq-`h/Lmhn2K#$Y,c$ +f#K:EgBt1^m#XF866OKG_b_-c?I`G[@Y#@bh@gXfB;,IGIH89q>iW0*__aMV4GNWr4kSH,oX +XKG(F-T,Dmt5hTe>*2%-f$A-T:PDPXSE&+0IE=g_*R!ZVpI170H]A"lKTG!A`t#]A,i^-@//>9 +.5aQpH,8i(m`KgZrW#ADC\Z;lhWNsBhQi,/UA5)lZ_=g9&rn2a3l+%Isfa2iu>8OHc*O[@(_ +oA@?`9HY)9lc1VLpQ"M6D$]A5&W^<*$DBpAT1"2&DbZK6hj:uIY3W:!i:Br<)DQ!tOYW9.h[%r;NsH[]AYA$6Z7C3.'^9f"dT6Tpf9s +]AV8g3:J*'!J!7.r$J`J#B]A>N(l+fecqm]AcNXV\RW).^M7le=n/V"QM.mqKNERH85QD=/H;o; +Fjbq*)FjF2g$V"WeFj60sIm_1]Ac^25K>Yl%).S^XOU0I>MV+L)VUWDeg-GFoa7XV.%#7$_rI +V\k&L6PQa6Y'_q,9qs5.@Wk\Idna,M$tLZ_rja/7-e#WoFB/h5U`rNG3girs/+%'*hpfXo0c +nT$hfcuUPM,g/ZC,>cB>Y:s'o>HS*o:SQXWF]AcF?gCqEH/#WqE"I"* +K7+!ugo4$Zg/1D.:ID@lOqh?Nl8%LK2V=:S3.DB<=a9S!"t<5l +9I8De3N]AVYYPo)W\@g2L2R*S05E_L3q_fCB5joPNVB>K\;f\9uNroN_=SJup0h(!V3.c_S0s +DlQr5V/O!4aS9<;R;8jIa8*KDK%GqX4TsjD]A[uQ=,>_k3MHGGCNML_aE'B5(mC^4;Z;ChG+e +F9L3aV;7WW,#+FiXT*olL#Dp`X]AXgGC@^G=[XYi1fhp]A\-j5g&Jcg0MpO1:ul=K?D2lLKQGTma-Z@g@YL2qY1BnOlmIkps0kN +9o(#mBnr.Q5*G6@\"3U1+1d^j13rccZ9BJbA@>X-hm<,PpB*"59'&:+'$N'Ba\EAQ2P46#MU +4/9JcBfA"gt=N;!T5O[\iHd6q@L^u'!<]A)AhN-_]ATX_]AJGWa1[!0:8:K!9\C)bi'.$sTE?S1$;L<9j?@X2jQ,O +8IK[Pm\Cc5oFr:['$.HY4(U[K:('L2(g'addAXlqnT30nkk?X1=%l?N"S$:,p9->5_hgM<&j +W[&R'oWa1A-C5AXnF%8QES*`\0`>U2Rha/,TtEB3=MEUJk( +]AJ$fY*iU)3>d'9I'NA>`Fs!RRVHR?B+J'oHp6.PU4^ODpmndD^)n/I^3U>9^$)M3p$5d'Dr, +5!kcd@';#5H;r5=a4N;.[B+jl`K=SOL1_I&O'Y(Q%t5N2%qQp`tMTOJt^K[INd,Z2tqP +PdI?Su:^GY_*b[<=]A8=\M[u[MD>(ChrqF!SMGtStqJ^),;70loeq?ZO[.aibJ]AU.Y+Ss_+#Q +"_tpW[dnMrI^gP+7BD6!F/JJ;t+886[oOq56p^?T$EEi4fd@T)O*p>a1_P'M#m//`u +cA.I_bn>Q6c4Tgn[-h>-LHgA>npL%R=68a@U6Z6D`^J^bunVhSGh\MQp9dSJsksRd&$2:)5(`N2S*XsdP.iZouGn*LCf,:`h*5 +R?%:V9gjj"`J8I5P2(u/^g>-_CibW=%+sCrtq4VQjEV&%glkGGgNkP66AHnMhLdkg6_t-KSr +UP.lA(847G&ItZI_'BF2>I"k8qiYkOHqGtHYN;'>r9-=U?FZAhah8_5Br31 +e6)mN)kp_GZ,a,UW88Y2qAY7skhQGn,5=P!9;\Ns=hclud;*>IbMpM\dCLb91JH:uu@1eFE[ +@s2^lZX'et!6%XU!2[pM6(Fh@A$>'Rq>TCHG4pXFdK +#B1jjE[<8mHQQ.@iPd:r^^iTJ\o(7pd%(lbC.T3h4CEjDR(d'M*#8/,,AQK^ELLG8b"ONo$f +]Ad<0`IGYiY7@.RQeSP#\@350i%>@AoX*>N/X>+ti:(Jm5[S/_p?nVut1W+Ve>"j:6XjBbkcO +!>M\V_@Z>2g^`F('=%b[?`"Qk9L8C0#ehoG'LQo61hU"n+6l*EWn5(Q/ZSH$Dpcu:VYZ(ZYN +>t"Y"Y;ORZQhaq"M[m!-_B&b/\R1P?:-iEP=SJ6*5ZYOA]AR5,OsR5/-Y-%m<_frjYmtVBLt( +^XsQIqA3`ffAB\s'3>qp3`nK\?qg#^,NOX`s,5j5n]AI`:;]ADI +;;XLtXPD3-og6/CbhW8f8gR.!IWNKsEX:?,QlS:7^%7`:cT2EjU5VL=pOnIK]A@AG"#FRF;%O +!_CgMRuaWZrY8NKYhX^*-fX)-B;RoD.X.gf^.?ZJb0i1(+P+K+RtY_g8oO_9-#iKc771'a-hTj? +?^gCSN#WB!]AHW3F+en*Fl\aP33D5:(-"d>apipD[9uEWEQe5I8R_]AF>4FN'#lF0Ghf*S-6g+ +8:Xqhiu&.gafN`p&V'@\U6UuDTH5H;QM.M513MQ[[Q)cRZsV:/;`?[_.BGC%i:[E9<5#t@]Ah +6j_G333P@QXr.3^cR_iehqf=M9I)<46AjlJaRnr`:UMe#3Mg^!,['bo?`3? +A5Ra'g0ds8ib_($fEq&E\]A&B\,Yu3=%\)jR[\X?GmiI,WjS0&6OKi3Na_5_Yk^4M'2'dh8-3 +orLOLW58Fc1>#Tn8B.1rk::h9:-eD]AJm>aLaLX'>pO%c"kI!6/b&M;-Ba&@=&5JYF\"O +`Vb!4`gkE@aiOJU]AI3RG^@StPR`XBlp*E1@do1]Ak`[r_G#:r\NM$Dh;]AaQb>[J^WI1%G)kF0 +g]AcG:piF%"`V>1m-U3pJ9]A+Yn_6.U,&7@0?aCgC,j-N!KR2HpL;RCqK(%mFeDO-/%2pL3fj! +@"JZ*,)1U=>hOrO#-Q,eX3u9M:@go6i0=6BE^0bmCl(."0_Ol$@N]A.fo8^T\?1[t/\)^,G/]A +3cS/g.3g::\iohqFC\]Arl,5!=Mh;n%7$^MF>\1PY9XNc\U9?+U$gEWOl-0-6 +h%T`u\aoV&[Ds^Bki,8=dp"tQA,dMD$.$_C2Z1$l,InBeUt@?!A-n@UG]AAd +]Ahi`q6dEgl"`D)a'"&gS=;WN#%a;2AfR"h7-;STA)Db1`GUTB-)K!WaP@-KnFP+aWgU;?3,1 +:g[At*f@8Gco^/67\oEVgo'K_eYf0Jt_pRD+h]ArV;JEJGR=1HQ6o;TCG`c>e1larNf*]A@MT# +Lr?s8&#C-HT[o;B5LXmp53J12?1?RW_TioS<61:"Hri1)eUnWd4Zl73PNsubS25%A:DEc4#d +m>4?umlYXZl-&)!kfNhRL?9clMiD-kp[2p<+5Ff,k]A'F+#"VcC@Q\k&r]A0t?DSo8%`-9Pg^L +rONMta;2'_-#SB#]A(q@-_AS]ACo""t5"KGhMgNLl3rgV@T%%uh@E5/n73-fberLF>b.:N1nZ) +PTS;*FT"Qs98m\:TgK(6hJBXA/Je^JiYlpqsnS)h75soHC36$4:r6DW3M[jF[I:@)9&4U1%& +tP1Q=6VYrf4#AQSn=PV/EnQ,2AhI-CbqZr]AQ;]Ao=L0WpjI>pMDg0deuWO&iRT>Rr^&PJO]Amc +MPp8nlD_GJi7XE2S+GU7kHeum(j]AFL&H'>L^RPZ&pfRYr&b4f+inrA82P&oa4:RagT7"^GZ* +Qb/?C7^0)ce;*8Qd7,6:9KRpZ.f0<&q/5]AtIZ&$B&+Q6R1[^T]Aaf3iU@>OGCeX6\F7+7$<8Xfm*`!gr<'W`f-.f7V/Ilp5 +l@rU*2D&l4uo;VF]Ai3,[5oD"-8;C5EGPA"CS9dMLo0^0J2[4qL_q0+EeBK?5%3]AE$/6F9q+H*.B.k?8D'5_0sib-0Z2,lQI^[EolR1WN;)PI:/=BaOs +;&3lL6=R,FAotQ5a"gXZ\n\@2!WPkHTD'.?[@:/VPh[*'8lp(V-=pEFKfIl.g@;*hY3Ykk:P6?V=)dYll.aSL?-X29pP+go%$IAEGak%IY#HKK!Nmc^n.#C"nl! +r$'+;D8-r-kPTd\3:Oue=<"RoSEhZ&c2&21p:Co76t,TJH;OPlc"b!E.2cfX0tkO!aZdK?QW +sRNfKc.P\u!CCc2Gtc80$9HW?6l28,)d3perOBY'b+S/)>Nb7.-)c?^*f;^71m_$YgX7cmeO +7aO!9jip=+d'QB+hgp,JWn@Tmm2E3N_3%*LZ0bW[K19cr+12P":WF<)h2r#^kpKX%nJc%9`[ +a6ZVN0%nk@G:!Q<_!SB;>N/p$4U??7p6N*;41tesWPK/?-j'NYLZkhVeA*'Y!:3>k?_LB4GN ++jNDaCm>1gBd[9d:900iJ*8*ooaSeWR=lVkTpVaq_l("[m+tZb=rOI7#l\f]A;+^"6gj5\(Mh +[F79Jr;?ISD#bf2-t#LQ`mBY7#FuIif)oQ'O="kb!18Y,b[b>p7%!NT;,&;bl\:0Pq?J.GJk +qJZaF7AXo"^%Dn_4M-MHu+Q&ZmV"T/&l%Yjto=:(qqEt+3c(cZp0N%]AK)l2Z==n,S@aKfs::]AV4)f=`&8O1g^nm4mV!0GETmO +076l/YVPT&Lg5gnaVVE#69]A(fdqZ7Re!%;cNJ8[^W@D*C(.eX?=GW2]Ac84K.L*H61TP\G+d8 +jT)qcaprC0UpTA?XdbQEm$(\S0qT&1WG4lDh6Ti.OkdiCYq6a,.bo:nO0lXu4HnMA)'hu6f?9^NHA0c.<%dkibFng8LmQiW4H54.C=3:`qMT9O_Vl9JWePNY7Hleb +Bh%aOEjT6W`S4_6Y[%W1I5Y-h#5Q0;G?ULWipTL`s%IgdNP>Bl,5!l>_6j5)Z/X>U0T +\Qr4J'K7DodspS2%i::m=34Cj]AjKKM[b,IkN^)\ +kOtbnY&RN\.TMK3(s5_fdWu*8/#g/g(.HGO^aHmNGAqN&Rk$HZSJ`23UdpdcQMdjmaMG'aC'"C.mPd +Fuho]Ah1Vc7?dK-`\U0u81PQI!n'`[WPc;_RiS-Jd'FmI+rf;c!lk=D><_b3"7t\%[P9SDW6' +00NTR%JOfO$uXGq9R[Q@\aboc3mfJ3$lZp2[_9A0o$T1GjSeZe@9[6liK[YdiG+EN&[hJIL5 +/">),k"0.>Oc"W7oY>]AQS\PgoW)Z"%ScX04Bl:bli?'^?="j%U"V5Qo%Ape62N05XSV=99:> +'VaXOXGr%oLoXK)<*8nS:4er'TjSc,G!!p^+4$gXF;m2r5Bqhd^\[tX:;^9B-k4i&Sp1CC4p +Vj%b:jR7T`"kZkd%+FDPpO"Kro-[iEk<[/0SNBt1b"0fXaS:f2QK1+>&84&6sC\HI(`Qn>lE +!<\1r_R-VR17fjc4cmN'Zs^?/O&AG`W]Aj*IKpS!(lE:4bKtn%QPIa@7#-UtuK]A*?1SGE)rVf +n=s;3*a3D`n4.^Rlq4l$j!C'CRDX<9KC7JT>UB$TGU[AD@Qu,]A,E7Z=V+_VM6/oF)1=mW#KW +s&+G:6V'V)blq;ITNZi:'D@erg=P9PGrGT8gkRW +^ak!e;.d%L]A!V2IE'NR,kNAordlE/;7pQ&]A"Ii0XN2J6*.OiE\" +bhZJ?Hn8&g#qj4c054T9n9:)BS*J +Gfc"!U%2m3%PMOFeNGTOit`\,4^"qA+1pa->fhn")?GFZ1SaA6sAqK7(1nX$%he!^0_2IC8? +d/3f,K./`!Hf*c;j(fSX!nY5(M;+p/jj;/VTX>+rR(6kG'U!@%205gC7^>ZO;N';B!UZhJO_ +#T.D9lnHn1(<<7()5sQ(rRSlQ'*GhS)7BYh=iZ&d+*87W-IuPl)eo*T7b%sLS6V +U)m<#5gZQt20:SZ?q"7YGc2b`^^Ib+q/23fg/+8X?2C/3`Ueh2O'K#F^`kd7D"J:XI7(U/j- +dl4?2k]A(C(m)Q`_jnH)<>MaQ+#JgpZbpgB[Jdj90E*W>NRP$2EAa^DIr9nG&f$_h'_a0UlW# +.8$:&[&D#t=/Cqickc8rfC5T=iSephZAgK:-8\d;:)R8_m]AFVI-g5"BZmbQRh4Upb,?h$:I! +<*PKC$QTuqg*%4r&O%OC\)bZF'GKXN>l184m8U:k+ro/:N_Oq2Q8H/?GRHh0@sZ9+YJ^B +26Ru\I-'CRlN%e`UVLl9/59Jh[^lRPp3G`;q44*otdjd?njIjnECYP"u7aH9#LtW9fp\Lo1: ++G/#K)%Ppu*c*L66nMB]A%$rS'2Rk038d7spdLMa/(`lJHqpC@^[fg6eG5DLM;#2c"'Ok14`[ +h!Q$8[O4e4=<*\bB.2ep6h)%g25kf&p\N4N.HinmdIB6W+2I%8ZeL\Ck'X\.cg.j1PE^fun" +#?09LDZi'[9G^D0h^\o&DOh6JSoj\I"G,23G^fGIdcjR$cX+%nStDD=pj@P*T$]Ak(, +Dgl6V^Th#OnLt+7%.blkn3^0mS&,U^sVilnFKF2D/k;I;^<#DhCh_Ulp".,B\#$bJfs:0!JQ(^eqG`3!bTK6VGeb8-2O"H4=\bZV:3]Acet2>hYR`[W=ea:o?Pg/G?DRqTB=Kn54=A92SD-$9XDRlECZn!;N:s?N +9Uf1->cK9$Iku6-ht*qesqia7h+fjFo:+:SQb1Lk?iA9\nIoGUAfe+\c8+Lk_qTZ)J\;M\Z=\,jRu>c:]AHP<4"^9oNBA6(p@0-'Dn-% +BLNMLY8hBV\cI($tM2Z/S3$`!P0j=-V(naMBon^g&0Uo($r9\U4'Z%j"#YDKeJ!D!U\*4[++ +\./G#/Aj'PMB?:@gp,IEY$)V=EUB2maU:n/hM!@&\dZt.Ph7b*AHgDI_Y*`\RN;GA+ohg`D\ +,.eOL(8#Ib4H%1A\tr+9tDfEs.LYOpOgNSN9Xr`\KfdK*'spW@pMKVUa<<#)ufC0hH&=!h#K +[jZ@V(V#oVi9VV-o4*fCQHDFop$Xc^j"%k_k.b,4'*dkCr]AGA8@lp'=N?pDdr:O#0G;1s>R@ +fhPEs93O3I[CZ8]A.E(k(5a>dN@K;Y\gnOrr4r3KV%9.Mkc=@>SSpJIh#F_"cKB2_n!V2,2:D +L)NSg;hQgT&WpuKSD2-W`4Al!^H)[E[LG2ILEK\`.3.auX76%gFr%`k$MRJd/lGg-T(LO8[3 +&BB(>pI9A'JbRBTtOL5r82?T$/n@.,r>m`4GAi1B$n>JgJcXVB_qkO\=^IBZ_\?f#s(Goa_k +Rc>d-^P5_cm^q[Je9L1:eG$uG"4VNi@TqVFJsYCbiMXdj@;f=uSoX,qO0;4["]AWfR`>gLG%e*5nU]AL +ne8KppQt?a]A:O:t-^qF'sp`pk-i"T]AOe:[P'67j_&0/BGB\^k/mTe-;*j3V^HB")q\"S7EMm +$S1M6"UjUZ?0MY_4phZ_(3>mAl09k]AnHs8?W,#@f6h)Pd)D" +$"f'Zd3bJP15sQpC./U&s$bLLf=k_Cg%Oo``Wb+HJUJ>s9BKqFO+cG`GW;sD@*&V2P"*Lm%A +HiKY1]AAK77^MZ#1:&,n*1mZ^o>X/hAL5=DB5FTI`Q*pEaM2/A&F^`=Yn30sT\4-`45*KJ.Q>kM3kHUC0^iqQ4/oKRGQ=7Ztm>bF#84q+jYY9 +"lKtXiA$loYPAWq=ZeY"Tn"9\k)_kiIup"Ujs:+Me%m7e$TX!S?rl;XF!8t +"j#44.h#ftcb2+jq+=gTYj/P!lPEE?/tH\LcE0]AKKr6AC3/,O4Z>C<_OcegP+SlYk&3k.MB: +%aFi(blJ>m=@(fDM3*C8-c[p6Q*/7(m[08/UhcJi1q9^RC&rn2i_mrP+4>\tS'$+uQad_ihQ ++B>[q($qEH,BGmbc8'MGdZ=$3+?Tlcj7g/s0?XV3e'.-r9$u*4IUkaCsKW>Ka_A +e#c8k<66NJ)+T;QFGkQJ3/E?1596n4[+*!+kJ_p!2Z]Am]ACcL(o):8M/7A<\k?X]Ame7`Y-Ypi*,%W\[Y6_Uo'L#WBlpYQA1HJ$VH/0uUpX1_X +%cAY1g4U9)QSdC=SRk:Z8I\A*?62n=I:>kbf[\:=F=*ep[s$T1aeT=8.!5:JXU/j/7`^9,hh ++TTaC.K=3\=IioRV6W%?-N)T8?4UTrc"_kp/D\WmRbqNM6!qd,/9#6#riDO?p2h'^gYU:/f. +CtQI`GP'!%9Ai(L>0[SgANf)"3aDgP$n!ZqO94J;?hA'U-WI#;9+Hfi:cZD?98!D)p?%`=FC +$+Dtk"pWY&3d$Q\Cnc:\o'K[/O1!=#tG,H!\pBUSdP"un@lGc0=V%A#s!A.uKbVg!DGUpNUS +b:Z7[G`J6^d_!_CM/&e&fGDG-`n`b-Tl.$7lt?_8t]AB,G8coDF#A?3-m9L8))WZApjr`sk-UO#oP3Y(oc^48RBZ;XrN[Wg-9CEq5/(#?^Q%.Y84l[!OKq7,AX)1/F;eRB +tegbaFZd6rcH0VJa^DW>dc@>[u.I6`SOLH<+=r8K5o*@(nDY]A4!^>8l$P)Ju2ln0J?-FjTBV +8[O[/Q%XR=++rpW#=%I%YT-SR$OE +0BcZr'Y"M_^P2o6j6Da*ZZCRH,YY?RIZdWi?7\?'/>pY9G<1D"X-FiTe'WN$'Z)ZQnu +b%RXtMXUCIH0lHd[tr@^=^+1l+oTe;@QJW/n1?@G"7pjuF/b5'rlWHo\.LYt`AMll(C]ASuQt +h]AmM">s%^MuXheGc=S:$$,,Hc5ke.NM.f8Ef?oOZ90OU`s\MP,j6n;ae3^]A*X;U$\,p<2eoe +7CNd7R8rfi)oq_bSZ>.5q<,Op1\%nVopO3YcoTH1ckC7$Ib;fdeIL:?)[j`=7E?DQXeR30?d +p-nDJCY(-ihG_Tkc\I-PDFXHfUZ0Cm6r_XqPVR45Vbfk(!#M4>CjST"!6gA,SQ@Jn;ZX.CFZ +/Go@r.5XGr'>rNS$It+??@?_!qrlXU-YapWl[kUO*T(>Ec+Q:Qb,Jp\bK06W>0,pJ\_(O_b' +F]AV)-+h!WW6s?.mG:TXlgPeSBh+-B>IO0W7B*]A/RX;9c&#`*Q[*G_X$:%!,hhG +YmS/Bgp+#4W78/`o8S9o%(/>P4>Joj.uGG#pX_leVX_6n>i+02boofCelWUmp>r"r_IO84f)oR&4/,_0+fDIk.]A=5B?8b(HJ5Y<0QX\+H +_YR\d1:-(,P91*Xgt>PtXOMb;[5@\4e#qU5]Ag#QqA?E4;'kgKjsW[=2(h"!igS'mC)Y8+,,M^@@gY(c.86WtYXF+29qUiV(G4[4*r0p>^!PTA"sX&?riLES:4+UX\plV>er/s-#ZJ9" +EL;b?D89q+'SC+^=gk-Q9V*%GYn+?*bJkdrn]A);XKRV4?>C9(9dZ+c>@Hn8aY>So60/,'r51 +54nqO3(]AT>[!ZT6+m7`>Kq7k+B4lS0l$36GD3^%iFARCtsOr3[a_U!eKK%^jd=SmrBkbl4Ua +QbC"h(d,-(OW9bZuZ?`[+*B85DgO@QU/F%'I!,IJE7pSJ;F!nXZ`+]A0f+;e[t(j8.VAA/B$e +t7!]A4j'/An_15=OU,WJm*>dXt'X3u(7u2tYa&_f%R!X>3-RpICAk8rk<\d=7S[mQEf6G".s! +9`%\f]AP-^2_&>3"?\d[=^:F50Y>Y^WdIYNN%KK=<^Tl8oN9E%_&8^K-K<1W31_rr&LMh+nmg +_VC$-Xm/_Y2l6)F!]AkJ#D?GkRF2UkP.A0fh8CK*,i\T=NaA#=rH;XJa*7^:_Rjjk(1b792#0 +]A^V>X^a'aY7#'mNskDlZ))2Y*092ts80tN.HBaUDo%1H8"b\/F,:\nb:YP@9R'iaaahtekm[ +5lP>J]AjX>LYH3*s"'80.egV.k3M^<3(>A_#R`"uM[E*;(hWCeTgruEL&QX5;+o9t)>)XkJXo +7^j7cB9`H1dilT^SROQ13@TZNh05CQeA0I4m%#MB"#,R7;)RE9_.`6Z,hk;ZX +kKf:Hp[a5d1b+U@nP)38;MlSB6g.h/j,W"5/pD@qL,X;m3oh0LdKu++ZjPMd5%d^a)(:[_5H27P"(:!G%lq;$KCbCo2M6qp +R@%Ti>.$Su&uqYjG:YelBKA!iX!p7-lRa(biMuaSpef(\>O2lj[-^Y3W$oEV(Q@BS$Z&6]AOH2Gl['H]A\6N,HZE?^?,`6!f/2oIfsG[8NQI:P'gA?@fBP%)Ag(ci`1>uB$Gr@3,eR9c`5 +nS\m=(^ntBs@/,SuV;#\7^OAIA:g*1I1(%?kPPY[Z6-)$,=_+p"3MMe.j +]A_Q>%CMS6[">]AUrs+dc`$0b,pNcIl>+*#RgnQJg";?1M6aC0Rq/%f@CsH_U2$/(P-!=gFp\f +0$79rHG@PW&KDJFL$\hKuS=SM`]AET)FbAMpnk>_BbD!n2kF^m.Q:PI3.,/o]A^`l,Y^"fq(CM +hmn`sqf^s:Ka&f@ +$EF"W'9D)IB^3ROKjm:/V*or[aL0=lRoH=#litArX89kT8[#jjL9_-Go:4Vu<3562prmMk.o +^l/IJXlNaeRE"R6Tj\umL&qD:J%\dV06S`.!/k<`cuf28[:gZiU]A%0E=3bZG2)W>AgeYn12e +$fSR(Fjkj'_EV-O$[8ZS==Gh7(==M^HT*;%?o)tWAL/Y,5s9rfOb/,7kPG9DF^.d"#<-fV`]Ap_3 +s@IIt#lj$aLOmiD#k8$&^[:i]A`K=O=1_]AP2/)k5A9AO_P^=T# +SEo90'NPQG)4<^'#h4#`9WlZ.M.D!G_;L)X$c.!thQ]Ae4W?n(5Ma4bH#j'fYrgNaDL@H/6TmDhEc0HtEl=CE4m5-Y$\Lem$!A]A[%9)k^54?/ +_ZW(=R3.2=J&W#]A0jU+`PuddqH/:jNu7l8L>drq#=.uM%cCEL>[-, +*J\=5A9cgsGZF`QQ&^T>!i[(PG=ekA7,Xs3'-Dj25WsaYS68!s$+]AB$)LeSB->i<8#Y6(hKO +#f/EtSb&P+A4!n<#OJ.9[m[ci4A\dDqn'O!@Za%\,[cK^KpdWH:O@pg,enn]A(qg5b$<[g&IGKo0ktl@3]A)1g`U[\l[j_f_c&V2R!`*HUN' +dEZatj2H$6#OG2Xh'bFjj`dr!j]AHSP@IJ]A/K4prDlC1/]A;0jdVNX^7k8:4NA5hDr4o#.!"^c +#lLZ20TTV1L8/PJ7ZSu4ip7m@$Q6P`%,@=C:CY]AC5^[G*p=kBmA7#tJH*7P@n-dC>%^43nMFZCSa`KQ;bgX7D"nc#<_>&giCGh8#I +Pqr]A-W26g+0X-9'c#@X1\5UIRDC6HdAB^UQ\fCEFcP +(Um/dN/,hiAZB&c3*_P&G:mD8k!b'Sc +%Ufb>mFDFB]AZA2eZBum1BWK&bR??\XPK":ZSY4g<9"5LPA##g;$&d:1&s$S@SBIo6FJKAk,(>ADAI94FN8'^ +Qf+Nl[;G:0qH:91Rb"'4J6YD-l0a%u.^\3K,ZB#O"X^ +S)V=+Xb$Egl#T8S5.Z-K2r[P+uQV-P`D"<@U/Kb<((o(>2`J]AC]AL<"uErXCKhtQUdc_or!Gs-r_ut8!OLm`oN'L%s?,IE0s>$E& +$9^1,dn7;ooS_%K#FY[Eq]A!3(sFY>[;liiAcVmN;,M!P!82DW +gCq"/T@;lbOXj",$cIt"Rj\cGWl3TsJJNFsI>,Bb<9_]AV-Bu3LFItu_\\pnfbgpP45;c5cJm +%qMpHqFN-dmh5FP^S@8cqpTM%Z^j'^e&!\m)oe7m&"Lb0Ii>F@V3g^3/dAMr8lrUY?iHZRg@ +d=uJ*FeAV:k$WM8NdP)V$Qlh--V9BQQG2"Jc9Uo&\ZM/g]A"k08+'N;:pRG%\X@:8D6(pTGN< +ls5f@?mJ66]AEFM,*hDVB*DXI/e(,24A2 +ra[HMe<>Ian/O#h.R;ViGZe9i>R+fGR-W]AcL(&,THYo-\4Zp8sa4+>Xo"j/j6*.4kP:p\fh@ +3?La^8/l^_7OTN)uKAoSt4TBrCfgbRC)Y/Kr?9rloCDqjT4H`cbcH0'_[.*tIS'UU@(BE +4h2dfXM;$fTUb-qCfM!bc^dm*jMEeT>0'W;:N>Fb'n$B32Wo!u[@1kk[a\VJ?^:6\"9gAbfd +sc)YFh"1=`j$%^j^a;l4^(TPgDL"l@!Oh9,NIb,VXg/UUsX4ENn\I/W +@5+".WD':l`K39bDK]A2j&"H0L:oM%rD7Ksi&537jn>\4Vr&I//eF/LLU5,G4sbe1[%%MXAl0 +f7'=Ol6q#u5JIFTga@:^%L&17Vf&>3GD&qCPf&_DW[<]Ai]AaSA4/SRb!#>oro/YJOegClbWg[ +e.U7;6UVS?q8982fYueDG,6XLF-\W]A5f'G8OOOO/sD'4Wstc49M:lR4ZIk-!O`W2B+g(fMOu +P8-:f'-.dZ.7@k!LV/In5r,?Slb=O2@;lNnKi]Ab;N-lDG%c?\bf=WG*.?Mst@1nHK)!,TAu\ +1OkPoFk.[F%ANE=^]ApF[biS5E9p683U%+(T?88'=!$'n0X5$eQQ'rO2N'"AC9Qr\YC@%.37A +V#dYe%2TIf.f[5L2;GuX?=e5]A*e^Tq)>aMq7:Ie)HH"qeSOOB3k,'3m\s(McVKn?gK)YBUkI +?Rn>!Y+XdoiG-%4MIS;[NX&F8m&6452DeoP*N>BoG0$l-1s+6iWa!WO-]AF:@`6XBY=an6#C, +oNC>5@K,b!RIk`;n;=oAkF`9]A2&=ggRFT<50*hISOFraBa![oumF"c@"\BA>f7UMGA@cj0eA +e$DUJY2MV781]A/r74r"\Xd:.%#P&V"(r]Ak +[Ft6_9R(;#Z&?q:k;[:72u,WemqfaH.KLKJ*q,iZA*uG\f341`0.Q8="Rc\(G_b,*('c2E5C +d.p^uPcaCF<@VQ-PAH*uaI\rSBBS*F2V)lBg3(B=-P8Y0(M:d)9R?)=Pb`SllH?.Y8"9)sjK +=eE'qUC3C.S-L"bP&I`Zh$66Qqom8Wu +JO0'p6FC`imrHFCX,.a1!UK6-j!,+^WYue3jd*><[!?J[m0N$:YjS-&4>4Feb"SR#VP:*)YV +\ZqF.hI^9YM:ge'&+G+\3<`%^O6l9;]A3X\5Kp8[R*H8]A1o2U*PM>#IfKb926G^L,sRi-Ur\-8)bTql +Bt>%_I4f:Ge]A=8$eK63QB"@m6#-"$H[.[ps2n;rSn"HZ:6fiuNJ6X[URZ#0&;kYQcCJi/&lF +`#EI+DI%UK.(ZrY[&Qo2r@"rHSq^aW)(DT&86qR/%i)&.fuo1ZP^MG]Ah/a$gmuLD<(eD%%L# +r!*C:4RUj2`2CfZcQ=Sg03c0P4`\UJ^o*2no"l7)Y6Eu3_)8sTPZI>\(]Au7tprL*NI?D^>q^ +b$+tf[]A`AV0%JX,\@r1pRGEr101>$^E]A#f +6od+R4emlIF$"0Rj=DY,VGs[cK9!.hH?a +h+)#\;SKbU3'_>QZ=ruHGWZp:TE9tg'Jd3N7K#TP?k2!s07MQnF/3Up6uL?PB?aoh>l2IQoG +0JXpr@-/d^br0,tN$H%SEA1Y@:Pn'g?QnE[S*B3VIK8lSTGgnZ"CLBq)L0l3D1Dh1jb9&HtW +?#[6ZUmdU&X^U(A'!=`@kK(pp(ruaN@!ofAe=Z9GUJeq'!$]ADg7-bS/OWpIcoiKFMAen/,H) ++g_5K%!AM<@S^FMs3Z\F"WVI*n?R[8@3Haj(_+\5XpM^j9[L3S7%&A3rTr1#BT7[3k[oZ(=l +prYaCdR5`>3DO]A0#@&aQWhUEn_;5b>F_;Ps=h-OA +$93=:397/;p"AjqXW,j:dfImVt]AhU6FA^gXj?cs68[`_`W7&7K<6jRXCSk8N6pt6VFABQalm +UOA2QVNl@e.d3do5>[5&OU/NpJXAuErOV:?tc*caV3e`8%$J\qeHd%(. +V.);[.@Z`-Rb#mZ&oEduY.#l&3bj#;#X/q+$):cpYI[^h.2$5*dq#R@L52?l(")qru9g*EsQ1(*3+?We+7=56(]A*;0Lh\ZsG2=>Fe8pY\fCQL!-F!#lg?6;n> +kAOM\"Ha(dUUdCVU*18*g)#qt1m5_EZ=mC[O;nf>/LgjEV_`H'4/gaUO`C)HkRMB=OlrOF*5 +c3J43B^4>a%/:X3;'(;nS1tc./]AgQl'1k'E2/&rcEt/;YHVhtspms\+C;3^4:Oi`4<-$li_J +(L$Ne2uL'XI[SFH=2=X5LK/f3Wp14@Bh1o@FeTcq9IQ/d)L9;aUhb,(7)GL%ZeI/UI?2AnC5(`kJ_?N$n`E.mOBhq0s=A(4Jd'rIUsa>(nrVq# +820sCX5'1$Tm\IOb2`kVA\LNR=aq9)%Q0K:(uMtc2X8?RDH#>(VTA]Au)k5+1<9-D:7:[XRPd +>T\+p"*Y:"2s\`'REkM%Y,CDoJ3A60Q\q[KO>E>K%#@S@df)1jIrh7`&V[;Ya\"i@SS$E[^'GpR)ZpUV-LQUMK'0@j[C)+jmhbRdMF6fq!hKpVDgqUnmf&N!fmjVqZ +Di*%@Y*Y(3^eYW3FQ1(\f2`AAjFo3UIXU[ih!O0$Ca1XHFp=V#+ifq +K9>N>2hpHqgQ.ZhWV=a!Z7]A4PNje!-M2r;&hapW5D\p?7/fhseJ\7DCF,gLRV_T.5TJS92@@ +?dG2IAUpcpOcl'g+ei"\WO]Alcdc*AS]ARkb3%`2;`.7#3[l=,/E*`AA>iFT@";1@^g\Jd^s]A?Q^GUO+V+fDX9Ajd2^&m!1ZVRk-r^QJdD6;3O94S5&C,(tX)pqI#I;gpqCR5j +/85V1R@"n)LK,Y)KiD*4>#km;]A2_)Y+PJCrVN_bB!?QQmD@0aS\&@GP"]A#l\D7aC0%7'+@i^ +h_9XJH9e2'NgWNKJ&[5Oo&5K(>8W:AgJS16qK80H6?=8h,$27kt"pVmVtQsEL;0l8i&*RQ+$ +Bc_S8pCG!Hh^I.rlB#KIA)HXTG#&kW+))!;>DFRc3=&Jp>GB2cjI\GVF`ju0[r>W-!Ib_Drf +_HJF[&"MjIW2J`_Ud(o`(!L0tb26gpFrm_[;`"s1T'!DE2G_mE2Ti^jI&qB;Dno&YJc.MrBc +KZ3,hBZksTr^R=D2k._TmV9XE$8:2DbENlI56k+ +fAC?88*cT4=05OMP&/[,&>33V8g#JsSKH.\aZ8Z9U.<$0r&gW0ZtqaNgPCBLe_'T$&.16uRO +O?`K0q=(lgN*fjbi4"M*HmKru%MNuKLUlEN(B:!kBL>k?en8uL6DRAj:Rp?+L+rZnaOZ!Wa- +K-__(m;[S4A%Qo[bSid=X8Y;*)E"9;fNSa/*4)olgIWCqlnKrUHVBRo[6:P"=.CSgD#j!&%M +54KF.61ijb.I1Q3Jj-`RD3"3n(,1KWSmh#tY@DhG3sr)[d>`\$iWTP$#Bi`ck[L4JmN&E4PjXt(cN4_^>l!,.SGW9u +u")OWKTJ2Ch*1K0=*btrrV$IIHNYQu(oYg,SWdfZ'-05&/H!bL[*H^\Cg;cmOmr/^gGR\)IQ:I>&L#Hi:"Z +6c;c,N`rFkEa-^4=hVloX6o?B:P]Am`Hs7-D')Ha=0V@hJ@[-p7=D-alr;\UB.a?s6+gh@(q^ +i%)e,NGLTDaeh9Mf#qr&%FYRT$OOQkkd&%hM+n1KS=Op.V\DIS2u8:E?^B8rWP9gX:+Ll3;&9-j3@%*YE>Eftl]AJ)QH"=Dk'0fiRt:/fJo!h/ZU:%95D4.Y7G8/)`9;+DJO?&fTDOeeCDg9CP)R +8@DTdrnUV3pZ[Y%T/@d>!:NgjX/rk16)A'C-rH22Sl&"0\'@sE:'u$k>EP#Yoga +l4RYWrP032I;lg-F"B=%\7_U+9-at0W7O8MtDkN0U[4rO1'XgX-n,r93je +*1,u$buBI:NFrW1QjJYUtQXSq@)MR]AppNMm5YHbeMo>Omf)W@g!0N:Tu7Ko@Y(7GsL +%QUU#Rk7aA;`hB1.)u?:P"+s)$]A;JV!WTs5lpY/ERa8RX89n1K\DUDY@PW/KNq&W#Q$.b-2m +I$B6[b9MeT!.upUn+F$2f;Qs_8",bRck:5ZrI+S*.8RBnCi_ZR;Vs($rF+(F=4ri-*,0dcB-NuO(XoS#sQ)1&%_&i,G$e.>M<_' +hn8n$RpZDj>?HN0QE,nIhcW9aT/P4'5N4TTWs8 +5!9@$01O&Mi'sBP'1WPBF$#.9U-&n3Phd)Xf?l^:?S;.m5a!9rm=X3dc$qH5>5B?D^VDHZCE +f#m7>Smqsid>C0S@Efa8(6""rE,2Na'Ll5okg[tHYgMIqm"%,nlU,L_2T/;MjlO(F1c]ARgV+ +1+XhYTOG.gf+fg=5&rer!UWdG#$J%2Kd"OUa.C7:F"\QP@#^3X=k$!%KuoTp4#E$*u&.Xae_ +Rlsd-Yqb?8Q`!'[S++RqEVdk;#QWe\p+Ka/5WghEh26'f&s&UB![bhT7K6>.XeoTu7[urWjI +]AhNL`A&EJYO_cP%>J"URU6686/$PfqOQ[4t_"%0(6h@K5@k6?AS#iiHRs]Ab_aMkI-`k-#cj_ +$Qh6]AB2LS'4bnTGC]Aq@%W@tJ\=GJjoHNinBarugG^4MlLqn1Trb?pW*q98eIGYY68@0Wj5NMk^`C+*No4K$ +cS+39E:cHHZ!bF`oV[2[?h>:!)`Cl:C-^Bm0WQ=?"NZ^-gK:C!,H:V`Ya84+MBRLf*^2f&q1PGY+,jRGf,#i4+sEFNGupg1[Ou^rZ;PRI9$-C0/b]AII35m+6EN +A2-/0'D>7WebICFX`,XU:R#qctTKSjc]A"oW1:epR(7/ras8):r>^FKD1&qW$D4J0Q/XQ$paR +G?FZG:o:hL,e=KS%,mWgb0\]AF3%k=2pgB6Gp!W<4VV<$ER=XN5HZOh+itb+NpG2IZh2uMQ&: +s3(.9C[^:QG,>=\5San^4Jkg=Q`X&.R7=[8P(/0ak0bHgQua:3e9bGN4P>ERRZ$)^r+\kbj< +295PnZ`e>MM'b&&'T_"KouB=%1nUFUbm?^g)Tojl+-8_*dlX[nopnjUN5l-[)C3M6o5.rTY/ +hb>k/+,G$5]AU$\.L'c\14]A*Q1R[k+^gMc@:d%1DtK1nB*Z5H*oW:EG9ka`2!nn^WWO +UB9=*Me3:uAZP7Zguf6I&A;2kUBcYH3kcA%P;J#hm"$\W=5eMK`>j2b]Ao@l7s5Kj?jj"9YLp +_qWE2ukKT]AJFJ#caa@QUpblQM;ar9Sad12C,#=bV\*FGQl2(/>`iN..KD"#aJZVOu;cYG.2n +dfk66^eLR`'6PH8>=`"-,8m-*UN6_!((lXBqqLZ-oYO46Q/s=;2;U1@_L^1C'7eEA5(3aTE7X\KQ7hBWqGMpP'-Fed)CVjlT%M& +3m7a:qjH9@')oOG"WSAREJadZU.?&WE3;[u8l"Y=Frr--?F8!R>1JdSd_L$Fq4#DR$UWI5F'lf=r;IoBM"n687-s&]A*-dB?kr +.6sCS>o0/r;9#*Y7HD_jJ1WLo2r2S.;A(f0gMKOPpUkq1885i`B61sg4g!XBi%BqkK*HRS5, +(/(^(%7fH*r9gcDZ]AE0*nl5icMAM(3X%CRHDUMtXt'+*9`ggi`uTM8D)u,n6#Xr7+56.2/lV +`7[.Gr$SI8gS6Fta4Z9a]AV$Yk893#FZ9A6_2d]A[(`WqK)rPMN:j8:Zu]Ar8pIt\D*1oW_IrY` +:klG`>kP+B[Sam?:Z[J[B^Od34*<5-d73MiQ@fN8m+0_AB-EZ;K'akeeS^:B%R?@Ds+uR#L! +Z'^4/H5%QoR7c]At7Fl?S^cXc14YF&-Nj%'_WT)_P!*<"$ZtP-Y@RV@n7fB^WHPlB2iR(AZL[ +L7E.06r2)q%_HpmOmL#VELEioF=M*u+<'rDpGSkj?Y(Y]AiP]A'q.K@r8AJeB.gheZ*Dq]Aau:$ +YaRaC&S^J;JhQWE`VYb+dfEDc$r;kXj"KQ2#l3M7*YdCB3jf42_*Bl;+5>Vbkj26+'=U$_\N +6rDH(gDD1=Xu3Q_Bp=oo +HilKE:is7hofkk_PemK:P+f=[&jFbZh9klYPY/K^q;7Ari,C&'E2[m>a;dF1U)+n4_/$*"rj +ig]AUKs]A@'u;UIoLgNnMe>WrpqfDS4QT'$&Y^:$OR0WR(klILJ?1NAFFX1(@1.dZL@+fY$3]AP'W-48/;$qk?K6(Ek_M]A3un +PR8N]A#PYiB$=Ba:-SO&#Aha"#o<(r.Ip#CIpVglOpkU_%0]A[[kNVl +i9S)sk"2t5EjX.l#lc=OMUo"Z&e\-^Q;3fdG\(d4&Cf,P,i>'ZV#?n.`[&lo-,1T:>*tl)r9 +NXRi2%Fb##DfEZ/,-[(sB#IA!bZG[+N=8q%(P+EePl6CmRhqbHk*\X\OAhGbDmL7C<))l+?! +/I)#ENWnp@u/o%aN92MrqkV=VW;0u>9&3G%X/YJ+dr?]Aum8GCmk1kG^bVrfNh +e%Chikc9P)dI2&DJ&Zc[WV[KE'd'1O1"BbfG;j67kgF1>(Qr?gb:kEXChS3[QW(T*J1$ftI]A +T:X'PWSG)2%Og4ImYp5]A]A!M*?S8/E>Y;rLJL\Pc'qAe-=8T`@X4!IG3(mK7j^2rVoF.:t,mW +-L`O)i%M7m%hfW+.QR%Rc=ZH^tXUaE\jn<"A@rg>C3[DTADUjNLklOdi!7ofLp&r]ACQo7p5.Q)--cq31b"pV^ +t\c8q7Zp%NqCrP2edWN +)@h;)T3kp,XA8I6O+"d>C"fC1:8Q(SGO<]A.m186dT*mENI&k_r'12:m&+$iH%<^pB02+e2PF +HjRr#,+p;Vj-naVm*Bn;[95P]A2SX/YjRY,j*+U]A[TXY2^c%V2)8fGYHQ>C!(qcl9d@g>pZ1; +HVR1SlmFG3q0HCbJJrj2$,m]A-CZbP2(nj`tDJs30Yj@5X;VAJ:1KJ4R5r['FJH\o)q\b-WR( +:#?!PS"U+:KG/7U;+7mo(IF=CM1Q)Z+gd4.>)JZW-@sLVeFEWJ`Ia:cL +>G?]AZ:\b+km5WNOr,FPY9PbFr;DO1)=:D^E*.YBN&>ceFi"K^P>*bN<@j9TOaQ^J=,E[KN1 +oS?F+*%$k;oQ(^c&2D_nlA]AaCEh`,6$lTHKr&__*PHl9.d$l;G,;BTV9N0n2"jC/#D<(.Ye1 +MNF0*.,2V&Fs%85\HA&YTH@m\OP^s>5r!ulA;KN`b8u8YGWP`B/FNUf2J_$(B:3"]AaKO^k\e +J-dLVEA0ZK-a3J?&j),:fA@Lo>SqdV!1Zs[l&jVr?aU]A]AS4h+$UV7Ioh+F4Ek#Xg4;B-2)1, +L^3Jm2eZX5bhK:CjYQ3\maDo7:D`.doHW#i!6:PsTr0&pYB@0?^XNil=A]AfQ/W!'`M_\-o>P +Y!LYBI2(YY$j-4*5&gE*r=AG8aQXHKkLL%Y1k.T4)NZ;eJgR99ou--E=d4q2CNol),=7;u^$ +ijU*#cq]AP\N=n2.sGNOFscEP%LLlRE;a/aR#o@==!G:4jdkpoM5+'4@TIp=17cdiVL_Pu@/m +C_5uH+H)d_IYW9;68')4ZA,G=:h(QD`ViqfNpo9L[8"OZ'sIt8AqnDk#ADZhIJMdc>k+(Yp3 +Q'VqK6FF/huQIOHbZ>1Z#NRcn/fJQJtM3PB[T- +i.gC*Ie.M(hq-`7QK'UQ.L,$m"#^/HHil0XD#%ZJ@%0*=Mp;B>um,i"\m&>/(=M[:-C-Y:@o +CAf2OEQ$9YWTYKg;j%W_HeW\&q21D0JndcB&H]AJ2XYuT1gTq(hlO&p^Nl5Lc!e*gLY.&?[Lf +)Uqt&"POI=rHV\#a6B]ALN^;(:T(KGZBiq(8lhc]A9H'P#*]AHEu4rf!pc[pQ>['ma`4)Hr;]A^- +>kDCFRNM;Qp]Aal]APS9OkO-Jdheg:?8kfF2qhL'5U[4GaL.Yb6KPAuPUqG^D-/16,P&m,5igB,1$$JR +k/pn-tP7s-ofQG^dZ.FS`#E#MLN:1.=PN-(#k5L$jr7M`ZrH:j'Y&>b>*rh/4C6JF/?;n0-! +d]Aoj"VIYc7Z-u0Ig=,sm-G:+^]A%292.`6);YZSB)cA@J![o*Ig:7!XV^g^jD'%YD^=$Z(@Dh +'q3E@ZCDf[-T8+!4H7+7\)A:]A9P^$"4iDK?`+d']Ar3\?2\E\7HCVQ#NKXGapWO^neieO4B!@ +-^;!1B5DWdY#n;S,Lneap&mW$d3s$f7c;,QS,Wb$(\5")M^hf%oD2^gra1OnuaG?DSjWU5J- +Q(s\R:NKfI5TBuAITGrq#0"(6a:j;h+t50eI<"c9KpW*FO%W5#^8!DBKZBkmE:; +I@XJ&+,>!*r`^Zc40@3-B@rP&-"-`q1Us/RU,"e;%Z(H!VM=\-8a7f;d +NnJX0Z=-VL7L?3TWKVi>W`E='7aD-cE=C>2(=>-?3:e9-/J!0u:ddF$;`ob(@(jCA(Mb'C&! +Uii30P<0%,'*F['+/?FZ\;q[Y8:W]ArIO20`cFD;A8s.l=%M+Cf_ToE6c"YT\I]Ai:_.pbk4K2 +[2s_^cntA&iDL1W8PSUE)FH\pRiis.lVq'A,5qH +QGeK?G7V[XA150\Bp1a8rr\Y ++LTalr+?5(2cTkOAP`]AQ^`l?fo?AejYSne+5eH9oDr'Fq6el[:icg?>T[*>OV_ajU:&r(j6m +>=FktD%nZ"DNbnk$T#NRrYbQP.1CIc%I6^(tGkGp$3MP-NPk;U +?rJ2McQLAooQjr5dd&92/MLkk +k0:*^i=/Xm67]A39jl]AoR>C+rnXcZKc>n*4rI*^"$R.WrkrS9cJ@ +_,&9F<@^&E;aL@#raDqeqB:\7'$8Z5g3;_G-[1f"B@X;;GZlD@5$5$%Po-3Et1KY9F8upQi0 +4_B)Y4Rl%(lp&'Khf/ZER)4_JLjHlKrc1TN>U;tClE9+5ABOua)$7D-4&%PPggkUA9&8MR3) +)dpmc%6`[RigO=fot>2C`/B-_gK6+?r!luTh1mq5d\\bbcM7lQ[Wi/:9oS?nQ`Ua07"\[7KR +@GSrOUjq`$6ocrESB;f@^Fq9t9K_"Ste[>&s\A#/tbZ+j6Ym\tL`C]Ac(H:c*>o2qN\i_:RT, +>!k7^&>XObCMuW5>Y*DC+_]A-YNNWn8!hON:[QbD1\<5fh1F[_E.^5r_XK41[Nlrj@(Fj@a;Z +Y&q;+qrLU/eOs@CmOU)Z`LL>R<@VfK;]A>\`PTAUn,2I&cQH?E6cW2M5?niEOb!Ip(/ESfGG]Aci"Np)T^i/YEHgoJr%s$8d3[a_pjn*h +VAAL_$.KL.f$2;mqq:s46*_qD+4s.Nb'AJqb]AY'3QE"fgZ.0$O6!`,g>";uM"ZJl3,J]A48[q +$[IlWKCbJ1J?>=u'%%V5KXV/,VJKK$T^MB1rC!HIFITF-`n%EaDihg>JNb[+.K4Zo04J%06!d`X#:63a +kK,boMXREWHGCE[QIU\%*Zl4=\.X`=(h$%:PnF/W>T4opfjaP +88Y)Tqj\sp+99uV^WP]A;_qlG-*,CUL=>o^E_7l]AMq?>iM`dHV8I!q,]A%r'f%&jY@9_qeSR%]A,bL&oh,m +MlAc2BR"K&)Lp_Xo`1q%CiJWb-Z+@]AXq`P:CXAVup^8gjf[gt&orci2db]A5<#-d,YPrPR)VKAAY2mj6H=_U#jK-Aj+blN[f1!4DQNRi2u( +#K$UiWRc&Qpm)bb3![SR^&rBeWQ4r3WW\+mXdo.:=9;_Bk=L%fpPUO9)I9>/+oP&/=G4WG5I +V4qi%T)\6q&3s[lhZB^i]AnD'8_RfFA=&Vp?,8H>3K@Z?&VYJ_12u-p"0RZ^Ym54A'p1a,#T\,6cmbL@H$n!f&[5Fq!!nuck_Al[uTP@ +$eAcj^P!8&H(Hl@o9C!TUe.#`'J%j/%]A%Gssc$`T[Tp.(*kO>%T8pF4!,oR-C3CAcj3H1u<\ +be`cr<1_[K*>;a.\^2H2lFH=bN%rAk`jlR,)bY4"T5!8>'Zn$U,U]ABpF4kqL9s8'6S%qI)Q! +OEY61%,f+k)r2d"4$od,FF/^(XB-SkXWiUQPm*WL6 +_]AWqYig+75=fmYYQ-FCAH*hQcpDLXXJ%jaO85U0:(I"]A02UcC[=%eOBS#YYp^>C>;2$3EYrd3Mu:oHQ!!5Re[13Q`@;4lP&hc@B%?Is +LAUN-((e5BklhA +/*"o2_)F-+a@JA[m:""YhHka5e&EOj4N?tI0Ft\`fYCITQ[Ub:cq5Ti(;U=6K/)!+DTVo/6( +9eAlam-HWa`F1EtUh`i!ai!$aO41)PAkohh.K*\*1%VOUu)Rqm1e`W8S4c(nhJ5s@ +p6#fq),Eh:kRTJh;1O63RM![Da/:YR"G>%NN?!Bt-4Y?MG>]AEn^pK+2]A"(/r@rUkNS)c9O0!jjThtdIZ`@VVKgSJnhh3rlj*WV8/[HhGm+,cC=d +JLr)W9O$$^8a4gWjBBe'_eD!+K4!8p_h'#+%&me$l-.L!pcW&Ui9e>pJ,+k/-j5 +eeU;2CV=#hD2(6elbb]AjjQlZEUf=i4R_-?H?VI>/U%?dnd*YH,5,2K0d@+l*`N4FZ!Wip8bW +@V!+bP]AXXR8L@C9a(&V)hOLf38l&-^l/=-W4=*NiLnu@nNZ +kr>``gB#'>Jf)WX@T+#o^ds.gAP1TZn)POPn3><3B7\SFC$eQ(!rI8inhE87.hg"RqOYj8W#rc&1M4ZWQ ++cYL<@Cn5a*`@4rE#BPad/u^mCU<_t8g1"&0T +e0ARTl@b!+!ORucS@Z.[[h=U41WC%c>?60"P6b'f0`WhiJHBM=U9R^id;^3_ue>mBb;tTBXb +@3$/+.q3`q".3qbkf.49X$AF9D,'TJJcetJLc^[A>n&Q)Q-$a9hF1:C!2^ZnQpOdSV-N:r9W +4@/mr,qfNM6L;pCBs4]Ak@"G`kl;">CfA":WkX]A]AjH!2nQhKL`Y;BNrma\K +KS7/,eb@X.%c/nnnWjOK/3_Q]A[?ofOM$;Le=-9!J$\?g8IEK_)4DPuF"]ASi;QURZO6Sc^=8mm3KUD;cPWX)1$SUbfere56['``28d\Nie5H"pPA)*@>"A +mm3%unQ,)fV"F%'dNX"Vd.UWOV:G1DIm))6Q-Vdn/bK+e]A'm,Kn7qLN#NtUYWDo++J6Li;V9BX/B&8,p@.!S(&0'D\9%Rm:[LoZ%K7IXceCk;1KrC);FI:L +2e.OQT-:+]AWiMk;a?'CG(/BL"ZW;tp'-iY0]A&^u)cf^mo?o;WdS?k/$ +mEf*>s&L._Mc)k)UlBX4nj#p,iJ'hH_oPUk44I6.n!Kq8DMLTQ_mOJG?l0L%Eh%d-CAS7E.* +IISqZ=HjK/?PW_s34VUi@RqJd=Qi3K*D>Sl$e9*kk^EI2f3%SK!s"g]Ae4na;dZnVJ:'Y7,'# +hG%ir@s.AN2+H%Kc]AqL$p_l,Pjo[+r5!2=p-A2#ajkWPI`-$RTH:m!:R_Cel1d)_5jdM.oQb +ZSN7':eg(g%pCmQacFjhdh3%alblOS.r'Q&LMWW/#6)7ble2gYh\WRN."?-HN2=0_>4ZKTOq +AN030^iNh846geP%?r".;Bf+Y]A=$ip0\`sVQ)tiA<*NUC&7]Anj;ZMYHiL^Gr/\\fZ<^@l-K!@j/I.jVpTuc1hVp@5aCf+Tif'Fimj]A\[OLS +.-"uOqku-?O;0p4f^>R/P*iSdPJ&>pH$C9tQt;55.tc02*A5lJF?AH!\usQ!nU!e@XQ<48Hn +n>DLU?--;X6Zb=@S2%L2\fb!oGU03*C0@cLu[m1IYkie@2;)_c>BVnK"CJNs>LNmTii$(R[B +aiiQt,ZIju9`fV<"r4Cu?1CU#4I=:Y!AC)sOgi7/aUn@cd*5-C0Lr#&g&!tcbB?1m,Il!(aH +bYWZ&@-qm?+to<9.YVAMN58-Vg:A-jK/gi_p*2>Bi#!(b7Ur>9b!3@]AR7C$a'>pRG&"b3#\/ +ZL,!jed,fBDnq-a&/"'ikK3t=&1kK%\[gas]A:*V'uL!,4-C#c^HsoPgC(@nrW6B2s+rh#[Rs +pa"b&L`(;F+>Z$!dEFN:FId>1:>Yem,R%[6UBdKf)F2KQs576&ZS<>ZT;`PtL(]A/6<8B7Bo#;92//PjBMDp"DuZ@$$2KDk,DLA`46KeEu!iT;E6[0q"e(IGJ!iSYU*uZaSCtb4` +@1h'f6N[1(\'>Ol=tkQnW(513!u-8etF\!Ws:H&"8PfnYW3,JuDf +No!g5Gq]A.@Suf<.,pciA[^2]AgV[f)gQ9QcOT-SE42C`-iE;&Q2bD(3meWL1h)M:!R9+*n9ed +DD$`)p>QmQo8?1Edj0G2Ib(Jn7&ASZ,'>8'P1Bg[9*e]A?V:\a+nT4'4sP\KQAfuKDF6q91b3 +W@c")$+g&sT\0n3+;4ncQ#)@]Arb&8BqHOHPF9^I4I.OepVSH#b5oYF*DH"K_#^Ku;*pOmWFX +UY8D=['ItGnEM1JbXEH3kD^K8L-=4U9Fo)R5N5a)&[;LpYgG5LJ]AYuoD2,bN:"p)%:/4\JEa +q%f6_`%bsu?ddO'D[=X?B?coJ>KFijge"BX3W"&g.E?u.,n]ANseS96Pa9Hn4c0VtI'Rds/=.KqLk +3g]A2<_9Lk?M'C=:L&0n]AD).8N!r:EcUYI55uY(8[O3Me('M=9O9am&4?/4S>@8M`8WErcktO +CbO=*1tieoVpTI9\S&`g"`4K[W'YEs88k[Vjb(HIn=9]A[+"6CkV%4m-o!e8+?jmcm%R-8PW#S/fg^A)64=Il28BK[CQ2I +X%#_rN4O+>1_g+p#4Sp-#)5hkbkn7V\*5,;VD6,`hYlm3gS)Z/[RR_l3SoWY +-N$G=PP-'S)o5_n0sf36h-Ohdus>KLa\rP;8i3uZH'aiGPMt(FGo.LaM",(G)jk^\Gf#Tk'. +lA,IurM2qX^AO/7K*OirPLENXe5^Ta?Nm-V$WM0:_%r2rL9lNql8D(LLiBPp`1_&G05)4]AnK +JaK:.dHA@b"hqA4qV6W#]ASR?mMG+:tM-u!6-We6$YN6A09Y#?GF*JB;f/9tkk`LgI>J9R@6K +4XAH1@6*E5&"ZA=?)Q9%Jtb[Zo&&HccC,o#@q/n5eV-m^Fkl(lnOlq-Z6T/)?5/[l+;r\1(d +uHQQ.jOjrDsI;9k>)Q#`q`"&J(rkl-a1Z@gUq&nN#cq\(i,2Ru'Je_!IVF#A$E7//1un2/V)bbP'6.5Y#RmT#gXpArlt$4[\kACXR$5;0.s]A>4h +9[F^&6d#>0^9Pr=OgMcP#J2;D-4;449=B_ZcYOWfnf."C?uO9f]A2SE1*'Y"Y!(HmP +^mEk0Ga9bW@4?^c\lE3YD8Go.T7(/&"@7+pu(O-XBtks]AM?";>`=XQ07'b/lAhd+dG'KM-:- +W&BPXU$HH&D^fP2)`b/*=::.Spao$1.VsUu%+l9\3i/YKonC0OW@`EY!cH^)4Y5tYh6]A#?N,Mr +DL8Bi`%I$Wfe2,N3FYuRN2f$G^mcg5I2`H)VLnBL,d!F>h7G1N*`X8LOWfB]A(JIH`AZ8@iOh +!$g[62LAjPoMNea?Viq>JIG-+0970(m.rR1a\$d?EII<'T(+0f9AfZLqK_)o9KdTMcL;]ABj. +KU0'&4_PL=krEB(79->tKQbDE?3s-^8LfR7q@d8nC6C/V8uDebF$l'3ehXAiV;XlfDC0.^Tj +l8u^rXT)\G0Xr5#cEJH%?O]A'rk6.boL#A$ssnHX63=_5nZJCBR,k'=%_$nJA_9=8I1\=7$+4 +:&h0Q.nL]Ao3E=,H]Aq[)+!%8'W]A76Id&;QA%>Ea9L4AbEY63W%lWYXiHSD[:NP_Ob,GJ?i7k).nVh< +F4V$OTm+J0/f*^4]A[dV";DXBmNB)p&?ki1VU.1#*Gdh]A1^b^&?+`Im\ULpe@)l_)Pa9\_o(O +tml;0J!0'JV(Sm,5!&%d;In,3:4-u\!CaWl:>&4.MZ;CpY1m%++pK4$1\(1%e/!u*^Z=^.N5 +9RY=lhG@%o$2I1gKq$MP#)(RoVLeVNksSBI2(U&aEpoE'FMoMG00j5K'n +n>E?pqs!V7iBnm3D+SchR?uQ'9%WN0XK<9I':W]A=]AicieCmMi<2tJ>rh+VN$Q49<;]A^09.W_ +cj#?Tan0]A3La!'iD@h8;H9De)C&#t8)BhoI5@X#CatOK7ce^%DmFD?dD[0.5:MUp@,2>VShuXk+a%?0H/P-=t?E!?3l*hY03HofV,_c?XYCS'JR8u2R.'\i*O()G+8;^@<11tn +52W(`7J:\JtU;gH(F;H`^3(6=)I/rUikf`U#1="04&4%>FqY)LEt.b+Z`7$"_3As)i-*QS;7 +:f7L'\UlkEJ_#Fh#:,:G,(]AVKb546"*NNc_,NeT_;`;$6W6!qM_hW5#V'WQt^R0M2hm6jCF5 +_o,T1"lu4eY@3@6:8:2ZG[a6kp%u$riaC$ckB3'NR=).0'X<4bLX'qk#fZ2KE/3,%+'JXBaY +P(($*Z95a_!3l(1:fGMT&6[L2K.f/=H>ti[/=:?Zd&@**:n1Mu\aio3UK:3\ +OIPEt4g0S%0B2DUL/->tQO_d/;d6#$`+t+"="]A7E#O0obIe?_?N +Bn0O3l=B/u`0j=aDUuS#2#;`,I5BqV\U5d<`@:-_-]AQST,,gin_DpA)aPATVn"Zss4#Heh%c +7)lR!Qqi!#%MT"`O"Z)Z'@?h-!.C8"heBacop_FP5Fk5d'or +I.W9bZ`/QG[?`D4,71Z/La\"nWD]ASlB2\)1QI26Y9g-?S&OIfW5:-GgH7MS?#?\`3m[B#QQB +E@C7i>Ik`aY.9Wl>p0_-:[Q>8N,jdpA_kO_GN8bP%hh0,k0$o"kTkeH$!R40m5\"biHL2<4% +Q!?S=]A@qe8]A5T,!hZ:DWCMQ7:K)TcD&Hr4$ek&"@XJpiR$7J^fQXA346d$;\!+-^)$G&j^9[^%E@W,RYb->h2WXkN@P8B7fFdl)J`jQNkR*D7ec,dYh)f +^G+.^!lZ4VO(CeVaQ4J7SW]A#S:"6rI!/:?@XTe%-fO3)p@#.44d3mqHeT\8>2Oa@qlg*L:dA +'It?)GM!UUr\]Akud?45^!6P*!qeG0>lkoHj>>FLu_VGbi-fc4aV$R%k`(3s"M ++3J>@UZPpF#o-pDF2\@DeOt-;&cL8J#GXRF`:p&91*i=PMN$o`-VA%-U1&31,]A]ADJ"aNfCrg4R(5BsZVU*qT\VnP6rX)3a'8b9a]A;& +Y*l8s$[c3F_Cd%Q?D@'F^m.c(NsIc@q@d&iX[EQQGVP/G[]A_b- +O0Hp'@?PPKG>qr(JFR!e^)MX=L?Qli43W/.sb3FUo:[DGCcT05:lMX"cW$>\J1]AOLm<^fU\c +Er#c)F*m:.MhUEndl9bJgp9>0N0a1F$ZZUZm+.B31q*T):1L,mD +Ye)mp[_U0(N&=V0>7e*!kF_/1+FSAQY[W7uaU!H^A^Q$>YphkD*.EdJW)9GmM-.ntX +2M7,b-`Y]Ac^u&h>@e"tiR$Fl]AI0Pmo@o@.@HOe+Vgs[HPF5NiU`Er@Yt&dZ*NiMKfgs@'&Y% +C\fC0V8AV;$oIGTpeF]A=@I`MOPBd+LL&3gGf"\ikYFO1KPei>-[sA)EkW:Yn$3Wo`XTPNg%? +E'mVZ:g$"gPSnlB\2?1emk4'8rJMosT*f2`\8Mj*)n`-i=h1`EQkLsH7$2kKloSE(rU^u$\3)Ap.mAbU+&_E+El3^8rfM6,Mg\'Ub*=q>'_^JH<8,3e?7%A5L:;qsp[",2rJ=pkG?-[$J9;D? +,OK:)[%D?k-NPe'Ho%g1V8lm4WfCuNk4#@+u,S2Q`D\$9uh,9"Wh7([u0*->UT,^coE=\g)k:@iXoYHm$U0e=LP'b^W!-hVjbWhRb`/I +\B?DEi&-ql!SGOBrm^CUJd(aksZ2;-r@'[9MN8m!dY\B,\S]Ae(%HTs%Ta(AJa`(JGAG;]Amr3 +@&pJV(RU<;HrY0h`r4k3)YZIS;/&Z[jE;j>PLTA8c]A]A>Dem$rKeU-;%Iur; +p6`t(hgg4HX$/<0,&q"rU"Xq67U9Y_dqUji,.P[qKX^[R#LHOQA25PEKt*Y-D.VTpOM:Ejr0QJKC"tI8]A"dDS;pZ+`a=8g64N$UQ./dGn +bY(i[HBg$_>?*C1;)#IBYb6@RrL-+2-39Uo_AR&e=iQk'dm6Jf^)L#gg&Q\2BV13JA)%(U3;>pF-o5:p@DI$dPSLQjXiHLj +Ng#Ei=M#+=2adK,I9d./Iu:;EA9UOooB&t_#q!G +g)bY.;j0mO+'hcheRdqn_\UMG$og4AR.jCqkRXm[=giVdoPfR?YZWUd-mk.GseT46DULr\_d +8[#rWd*@7/"Pm>=3CNe"sn?26$\LPnQ`PObb1LoJhqE9_K+otbEC=uqVZUJncA=MS3>LC0?&j[F#.o(,.`c<7W*5*Xl1VY>AJ-@j+o&ZWFHelIA2+3;):8@4_JoXc+H_ZIi +efL*(XG,of:lT`)UFNd0hs)T(pAGp1R;%Hee*t]AO(bNVcq?l9JE@V`uM5-r>p1oM;C1F\%ZR +h:NDmOfc_9Q7VG%Dff*cd!B!Y\L=cbAcHd!"Dim*!iDOa2(Bq(EZgJ8Z^1i4fnmPk62)rSnZ +F<$_YC2L/KDtX+[E^\ko5kiio$(lXU;BO55R/$u+>U;fCZ1rC&9k-iAdNbL+p6p_SeI'k-^l$%&CokBC^"qM +NjfbrII0b5@`55hg[89?unAp((+&;cHK%\mRXJBW=u661bqr&s`3gI%*@Zp[XGjW`g9K@s42 +IO\aO'/:D7\4k@cq'Xrc2QsnO=rts4%aCNW%AKq0LVF>W%g*[UF:u8jir,:+kgYp9@MM3^h2 +,#lfbo'7^g#aNoQIQd$b1-$"fN7Nji\8Sf3Z9:MN^KBiMi(]An7$^h7+6$6A5s'El[C>k'8Ws +S+=\AYPp[bF+"?_RKpikFLD(Slf$9M^EbnVn*$MBJING!RM5HUX]A*Qj^uELQnR*YY\?bSM[UDYL$8D"6?)]A9is_oU+PK?rd!CO+#[52SPe$\3Q@R7Y"d" +9J4XdZGTogM[MoL`Ni3WAgD:@"m+mu?9k9&]Anp4A\dqetkG8$(K=$W*s-Yf2okr`RDXe+=^n ++1_?f8WrW>oWr6[a]AcY1iRhM\B6B:JFl[pcSWCeS.c0[2=7b?ge7ldN#b*trp-V_Vg +sAG;aZZ7,;]AQHsEkB[7h=]AJUglF4>-LW$nRYB#8iF$s/Xl(:'<#&` +/]Ah7MDk"mNaj6m!eYJh^u6591fX%(b4_ip;9sZP!5Bs67Ru=#ZbcaD^b"ERSKqpM'hCd_f8c +'iP![$knqnB$)oXl>2tiECR7n,5a)9-./+g2/tDo[^^^32PDR(4WUakpfN`G'%?E'10HF&E- +%PI,'9s"(=]A2DqF +LNk;+P?&Bkd@cs;5=$599E#G,-heQ'?F85#h"NQha%0(l1r`Qm?O,,"iO&g(o\$Y5\4PtrThDGj,7jKVZtu>WCM3[V0BCD4=d2FVW$W3TLV*L#8B$c3pVt. +2a2]Aj9_j_D5I_fIP*\\%+&$X?g2\i;j#P8*cBkrY/]A15t#jg1[[Z`45"#M&3d!M&.a^ph:JQ +`2:[\0tHpL%33a6aJ+G<(;dc0b5N&@X+[13+5$2+tQ,Q+7a^l'86o3oYJ,1O]A8rQh'GR6^@7`kLAKE\,bopUL%[rTU`)kd>qCR#S\ +co"qIb:[70\_^N(0T-Lp>&k1jm'=TpW"LbHOMj/2I<0T[tZ9[rt`jsdnuj':=E;&H!eBsO5mO\(grng-3=WLPDkKIt\9#k!G6TD*4H]A?KK=X29 +n\Yd=5hemqAsaDr]A]A#/3O/eE8oJ]A$L6.OYS'qVqYdh)g"p!fph#s&t9$u+NjXrNTD?^s,T>E +s'6M%(FWDf+>1@c\508O74R0N*4EU%W#jVIhOe(1#V185X10<2UO6)`0[*.F=4 +g3^8GY=trjk[L&F76(?Q`*s/\O20DQ)iuC +0]AXRdns_g0aDcj]AamAq +,`rFULS!B,IBG^29)%q:Mu)&/G8^d7r^^&*nnh"lM/E1i4)A-gWtnp^C]ACUfZ<]AKeTb#k.B6:L1cO=QR.ET8XLu#89Pp'>JNt[r'p4-$3"el@W8X3g>Vlm=9]A3_1 +qR)Z2`J*adMkNANVI,VG*GSRS[.^=/gsaS)8\2Z0MafpZ6XPdO^j=\O7*"5C@jg5F(E<3i[O +Q[m"?tX8qP(1)$KC7Rp:QoPq=)!IoENLqdWu^;mm9ME\ +Th_GY-ppq*)=nl1MU2@>fLSpZ>OO)sWGK\`7=h>f[:30lQ-_0q%Le;V*@hOjEa- +)Go*ld_ALVTf=."jhC,5X"40fjnc8qN18V*hX'D),h1QK(T8@n)r.(^h;P_bQGK7\bupC +\[CUnDg%Vo04bd\(]AKKQME^\&9o4/0H(C1a91$dN@uW^\`B?RHMe^1NVa9.j/*Y@!@0/KrP% +p1,AgP85`^Bqq9oLJq5*^NB@m']A,7%C"8+l6Nb1o5&%1md/&sK6LJanukCCi_(g;hMYDOot8 +)NoOF==)KBu#,/-_#Qo>OP`7o4pROOL:cfGcfZ]A(Yb`4c@NoT0s]A1^DFJYICjOh9a![t)eQ]A +p"rfRad*fk3eZm[$&ndIL=n%=#Dk!UC5Zg+N.)Dp2t&2H$^M/#@eF"FGO*a$^7qVF1&cWU:_27md) +=Fr1VX\6LJ=MD%>Gr[G,ci4Ygg-]A<@-H0F?Z2p3Qq[r'Ud`Q9LNot(+Pd7VAaER\%$[Bpcs9#Xc!9g:scL0Ck+n@><4\4V3$(R1 +_:BqqTFB))_1D#-+<7B9nXim>dh]AEbh5[lJQ"%,IN)[P*a]AL-O^M]A7*@Y&/L%snsFN1*%(bK +@+ptY7T5K7m",4kW(Xn]A.jWE,6[ZtQ.sn@C050E@0VCdX6*dBHjT-03A3)CZP[R+-93LT0`; ++]Apqn[U"93\IkjgT.(#+s!-a^$R_8!&j3hjCK/("to8heQV;0Z;PJY,UD:QgQ[/Z$^J``IOH +s1lKAee.(!5's)KY,B<::lr#[I1KS:SmS:K$>;Z^3i%r,:]AqWNU9d/782h#Lng-q>MkB.jE9 +*>2o29AH8E]AIQJ2cT8VhU`I3H>S.'#QJY#TkiOmeLf]AO?Ki<#&B5Ju=tsG!?>kX.10d[NmPC +WD=.#(ReK8jI.s]AHhCIp/KBeTYVWl]A?7A_r\q(,,UU5@)K^l84Wiic_Th\3gI>)0H.^Vt&Rr +qEm\6[?Db1K.6d"D:em'1F6D=Y3p\iL?:iWM5KAm3?HKO>?c=\Y! +A,e[Kb5SF11La97:4Hjtk6B,BR!09dfj4#JZ:OY0m9aIYJTBC<6I"_olq/X\6%2I[OSRPN8& +845mbnI*G&?o+>%*1\G)sN@lAhh"7R>Y&/[3KjC!gM%gJ>r*-\'(A%O8\@P]ApHG3Sc-7+60< +9UM-0`18%9nDT=FD-W2($bhX"UIEN5C[`tnctLYJ'-m)kV)T=Iu$mO;i&Gr'E__gFMVfDf$l +qVOQeLTi8NSq^#1C8NQGC.hBU52@gQ_mUnRTC0kc]Ae#.g;Dqs>,kG48d]AROmWcJ:,_J-I1&P +R7l)`\H^JKc*fD4c@;WUgjOBl^@)@X>N-^-]AD_E6EileFZsh`@qVt=!VKj_"phQ`r/!i5#8K +-AMme:"Y;.#J\gPLEso&B'8%On:iA0>;GZ[p?h_qTq7u_a.dJW(d"eJWO +\ZWS?6IEV@4Z>s[e-W6^MG/'\AH?K]ANPhR0k33"0?,oJ.>4@VVGY\^Q%4@g6*3OCOF@$iIqs?q3"XWS<5BJu\8X(_bTukM/tR(@ +uB89"td_?aYN3]A_toWN/E=8F^]A +/cqm8L88pHHdAI=B#%c@m/hnRh8)"9C9Q3ZJ;-H\(2$s_,)W-]AuDu&%R +$<"Q'WuAR';)\DF[DammjTjQSE_Oiua_^6KPpWMREN.?N2]Ah#LCXqt0MFPsX?=mek$*m&i%/ +;d.Un/YR7$nm/meRJQgI!o;kFBKo9>D.6dakg]AVVO2ec=5Mr8(F_GPY"[NFA$k"+._Pgi]Aee +hl]AO2G^"R\Ap<(Dr'(=76(`:A;g0&iU`aje$F>bZK&BQ(@2EJH.H$S)JqUDqMA\W]AY0nb@KIE/:_2"eb2gUW +GJhfN3ciI+J0e4*L/qnh=qR_B#bdKaF)&]A^J%^($b8m6Uu*A'@VLq+#0DM=ic"@l1>;?%`Zs +JqE;QPI.S'*JF.DIV3PK+Qdfgrot-2()#g@h +Lm@bQgI4*'$qOrm`VAfBH1.f/cQN[148oXpCCjPJM!kd&`Q5 +K.iTg1hq6-^C3Ad1?$.MJ5LIZT>d(\\KCnZ]Am+n`7H@*.^EP#AS?NBILbSflF-i=@[[A:-HK +`S4ilP=VW*B=F/nB+A0f#,?6Bmf]AB<'D>2SPYoc +O%3Z[IN`s/Xp.hj;jU#\hmsHGl/p]Ae%?S@jsi*;41%WkdoH)pI"_KhWj>V]A>cZ$HTl8V'DR/ +5L0TrN.=ulok_i2r1N>=a^(GEDXa'9cF4KW&c?oHU)/]AMO,;SStG6RW>)S69o=Y!8^@1&R!9 +$G38_"@f<-AfA*!/H*c2aWsF)5K,aS4Il +oNI58+3%)N`"4f)=b/#`T*7cbSM*o'Z:a'O?T.[6oO&j?&n@c>bc2;k,X`!NmBVO9#W=2T,5CA.Hq(JZoVN.H.8a=XeJQj1F]APO=V*nV;i +ce#t(:,nAk2m2M5hf^rY7>8N,3Y0[[YbSeZbo%Q'bY(eJn]ApD@*GX^L;+@^HC3cEu:Jo?"U[ +P&:.*/u6:[pCWgdbLJ3:.hb^`#$knpTZ+=_BKM-U"2gJ!6)%qdGk^g.,S)>Ll]AlrX9`4Pmop +#jMXrKY2A?rc7+4SNrSQ_p$PjQR;8NB<6Y/,=I(=XgW9:7G(6\C]A1 +31A\]A)D?^<2j+3(]AAhTD8\P8m+^X^CqH_:5Ol"pa+6l`?(1A>VmGrPaC0R +7!Bp]A8ln0@d=YG''d_1B:g3iT#+rWspPk4Tm(?)np8-&M*83GaGYR=E##\ZH`sV2N`B%9BFG +p&<(PE/:6o4Ke:GGj$2TiRsuBZ\U<[+1$Y<4ji*.Y(J$_Ado;_5NR+9ugW,>QTFK24LHFO/B^5o +.pkR4V<2nOX`4EA:_RAK]AJqA\Sl0r2o`\,@B<;s).BPl8^qPq5"48_P.$FA!Rb?0@g'V?@/` +#O[cj4FZ.Y,br.kO-?sGX8>pcr$YE;kOW;HQK(o^Ru<4SQgf9B3u,X;tCO?0ueZ;epPPP<:, +1K_=3R^,g?ODOp(p>D?teN#LlCoE(=s=S=o2 +p@uYN9i^L3l4TKBKJG\0,i:9Y1<-Gb&aPp=a^,Aoch8di_RMUZ0mK=61?/@fLI0Ao +de;\%qfma=,1daM1GUS!NPOBBaBtYJG2f9_6h,K2!mW:WE?K%^kgBu-ug\9:^S +4>tA.snlGGPPJ`V*BpZ;dYD;>M1+2+N7H[cq;d=V\-"b/WUbq:R$.(J<$LQ-r>r[,SoI%d:) +7'aALrjrZ(GH'OcRPN&T\R"i`%g& +aW%R-e[=4p`O8VSQ-.2F2emAWWUkhV-T_5oa/;2oEp4Og.kGMupO@aQV"R87Q-0BZ2e%h32i +LFp7"u.+1#&h(Kc%4B1,;oOiSVCjBDbESVG%eK3W&#c!_jU%HNaLW_$SP8Tcok9h8(lC>^@! +^$bAn`4coO%0sZ<-3K7c1NVtLki$_JG6HBI\3/U]AtRpL!BPp^$H*kn_U>A3TK6AFG_$3WFSh +X^N`rCG/ld1dURQBs>ZJ+16L,T,,:etb!c8Z5skO'06[l6+9?Sc1u4#&6ZhD_'`UK/Epa$0\ +c_(a5HD?u^qILX]AmiXa%RNh%5c66-e-4W@8s,Vi!0YL+ML-q8mhV/C#.GaB(.`ac+/-lnm>L,2u1S@l"li +qQIS"P%Xi.?r7pB$guS7o-%$8Sg@XaGqL.IV[C`q0?*to!]AXurQe@IgL5QAd;j7b9aqS>dB` +ml1R]A[jQf[dT$IkZZ,N^1=j5\953aLb[s7mF;!,@'\_=W%S@715%ajAU>SJPH73)t=In(5h1#Z(tJWsHZUTlr-G*cNX)Srt4Z3O +$N+GhL3m^d$G^8D*M3XneZm6\"Gt^+AIA4FA;DgjAA&\Hjk]Am\m*5DVT>OY>uZ%A,S.6eJ\* +ME2?@[adpI-&(M5@H>KJb]AGG77ob-h+?E?`]Ai)f +k\H9/0f'e-_^q%a*SI#V",Y1FnDUt@^i=\L^E>.D\FDGOa?nJ[l^Z"VmLDe]Aksb8j*U'>U.q +Xq.2N:BiOf5P5;<+(Jt34@o&t?_HrCVZ+PL`3f[`q\/#e(oe^+?5LG.F!")k32YC(0Bro6GI +s8;(?OA>1jltB>$iXX7H0DoA09=QhL4C)u%I$4SC78Q?,W^KDdbQ,$u3)R>!II*4mIF99TDA6LFg.QGk:rJPus'_lGehpXD?Z1Jp@(d^I +GnmU`BIk%=WaW:JNpnXgrh&-p<:rGqO")\`I.r#SlND@>HT/L)2*Ul8[O(jI(%6?W=M2L(+2 +Zf+GSKFNnN`il>@oSqP+KHC`-u9A2aUqqTrDqXCMkf+1gl5YTpQoI=:8cucZCr^IAa56jB]A; +k9=:no.cF%30i^!PJDipK/Ce^VIHa#iO-8osU_G$c[%?eb_Q`)r"@H>*s!f-3!#ESN&]A1=`Pcu:p3[f;54\?#(dG[pHI8#)]AK`EaJO)q^^( +[9pXrmXC"@n`e#!H1_Nq%k7DdKfB9/BbaD)`4i-(l8B05?QSIZ)p@leCj[fRjPo7;71I]AXrs +$n"->#3%52n&M?@\I=qmJOp"&L?#hOd0#@\L6<";?Bge&;hbaoKGmfK%Q?l_Ae.>.YGPdLe+ +Mi'f6ie]AF4,B/Hircim:YqiqaM(PDjp3YZ>Gk[Vn%+&g;XYtF.Fl@.PZd#TL%$GEa/.>;L3Q +q\d;_llR%GuC@-Idg,oaWYlL-)]A,AU%j/eC-nX^$@RZIQ+JcBmY]Ac%Z52;G^JLoML%4?rNrQ +qtZfuAD2ia`KYPj4j)19c[hOUjmqo<47_1S`/2V"@::sNUKnRnIsdk<,aKLj@l0\k:(?h."0 +$T7UX"$;SD4RF[TZGau%ODKi;^A+PMh'`eR?pQTfiuB/cj\mW[Se!m0ZX-b0(("#qQ1G8FWm +=iQ;1"blg>JB!_)UGN +DOU.,N?08>69:mD_[),VFHnKW$TABW;*d\7c?TUj")]ABIJIlO_;2_:OYfR;enlj.s.LBB@ol +8#[kYr!^rP^lh#Y:T$!:6gP^;??A23l05L@A0!D;4(/)=dCkYE;iFf+'f]A\tjPUQBh/` +J["*Sm(YP$'/K=nn/+B3-T%flnBQ43fG,cH1XHg!rH?!)oqm9SX.,(38B&He^j!Z:Uf.jdid +)lsPM+kt@MW>a*#p;M\,S=BYH"%s!>N`9W0HrMqAa)kE[Q.X;$:Cs!Iit7UE1Nur!_@F5l_o +Y;UPc1&j;!*rH@iU/d]A6N6>;R[jVtq[>ILV2l:NI5pL<%)-F"!)Oaeggh&8*ugAGtLA;tP##nm>n>^a`h'$_ +rBe/!Uh+ZXNl]APUh%50(T@t4oHjn55uj2HdfGkK4S?"pXS,O3ep!gG=k/-2urXe48sh\s*Q0 +jp1tB3cGBpEh1BLACAM'IIjOqDp@Nba:_(h+nXN39_k,c07-M+9d9,oPdmkKll)0S*<&gFV* +h@'-6V(juJ3gR\I*$uI\pl>//l@?ZZ4qJcGuJoW#r7n`TPVaqn[H^fM([M)5<1Bd0>/ +*?&%)s1,BC]A9rWh(:oS;CJIL-hCTS(*>Dc6o"oLAHLW#UfX(s40HJo8ZJ!9YCms;bc(T +EU-eNHBr&l^7KPg!"KGastEP&8&@Z5(h/lWaYL8.2Id:e#AEdB9OjPZE=2g)__Ck"Jk:6@ +"b@fc-#RA:L]A5RlBu*WNK1oU%qTXi\Mf)`4&L;JMq3iMYqj6H4eaOoI1;YJ9,W30RHTa'.T" +8fT\(Q0#FQj^'l0S.A[O!W]A+o=JG.XKds&2lk6!\LMHra?C`[8+8R%'Y=ika&[Q0O&$B!D@l +W3Q06-kZ'9IaPn@T`DC1ji +pCuSC/;)!sgnbLaIQfR@om7bU#GV;OPrEdN6_`At]A2hS_#SY@)q.B148`Qc-m)$ +V'd(%Odq*o;k5jQ$Tk$Or8k1'9KKpOJX=gJ3s=C:U.ZYk4oA#KLeY$"a]A@`;S0l+K5\#]A2[":(&QMV0Or,^TCP=9k0W,1C)t_ho0P&S!UR\S9STU'XWW-R?giS%?,m#MQ; +';<>0^00gIjn,)%#+pa?&@2F,i5a]A%W?9qILuiS/5o?mbgEJm5q^o;bVlKa.N:J=[u]AOqPi8 +Ech-rW/s(i]Af,3,UM>831Yq0+5[j)G?Nt`3lPR*=$SO2\4foGK':ZeZWlTC0ENqp+"q6X.+' +,`"7h\`bSoeoY&GrKLLNg(*XX-d&Ag8-=1pWkF+3gokWA;OQo]Ain,c0LoV +@Fq.RI(&JOUtcGkMHf-\g4!O8_L#;]At+LR0@!8&,]AP.;Xio@`!X3_VD/Ah'"A=AROL?RH65Q +'oT/^VCJP7k.qb!c2?B3^XX0]A_mN#]AVRaX#K:Nq;UB#C$$i))OF1q_ELKJbmh(.T8mFV1]AP0 +j/&,oEs_.+ZT!KZVW[X$3EplRX=Ui2FPiSZ?Yq8K4bC47A85CDOIo?>59cZ!!\MDTgCqoF&I +3iQo2e_'r2fm>$$M*njeI%5!m'd(\a<0ucpFJM1)nIO^DH7:uPW1AUU-$8)mk49!CI`q9F]A9 +G>#ICNu0hA_aseUM*[=Y^6igb-RiHe-s9:^.fnSO!P*\dW8`WbkN2hUZVOqo'YXOFF@q^0Zh +3fQs+-HPQUObP;u7$4$XSS0$rdDNjK\Gj)K7h>?4P#`E$Q/o5!4 +CLS!&N3$P%Deg>8uf0AX8l?cJ]AO'UHsrcYT^5h;(71PS;k">mbq!2PH#U\,!s>k>LZ\9hFbA +a8:[lQaMg;4'h]A7[9oJ'ZXs4[\Mku!<2j\PV@C^IJ'Oi[U69]A=5V#tC.OXhX(BTjLFn2'`mH +@tGKB5/E/aiZ`nj0Zk$54Ot]ABVd>D/";`j/PE@CdG*[c]A'*9BL?N7oK7.;,Kl>;Jc)_H'.PG +slB7131ZPo2^42F%ojcSP>OJdpeYN^Qs(h0!^L$CVV2&9EHr%q4UNDnd!Bn:dq/sM">6SgSk +N`fgPbtM$E6T\bVLJ-PrCOfEGM383/RQJuI!l7n,e?I]AW\^ +iu]A&F]A]AB5_G23GDGh`EE6uJ738Mg!UeFC_kWe9@S&MdIuRsK/)djgCQZn*,7:T:2d;-$:8\n +`FkCj"`nsZliHWGR.*4RAStY3GJcN?BW/@1Xf0flhE!^)@XqrEjqmk&QCnY24Xug-l>Z&RS1 +#1-9,334UAj)-g?U)_daj9jLUcPrUBNFp$)JLqPLA@t`B=*Srho&e2bi_FU@l!jIA1%;ES6H +bpKG/(K.6ak&\>)GId;SgGpA"s4NI'%L^b0/H96g5Bg'jK\WS(WjVRIu[TbiS+Y30cMZp#.P +]Ae*KW2(nb>Y46(goMGeQ +:iHM_KH>"DnARhOmoKCX/^s"6k?6t5]A%QPEN!H@F)m>I)fUjjHqN149BI8nuo\nAD2jr'$+n +1I:f2>rD[uCB!!76ELBZ`d=AA4_hJQm7mm*D(oe)='@c]A>NqNIIr7+4h]A#5_HjI:6aVsc\@` +Iqbtnf82NSsgs(Ycf;>uNPmO]AQh&;eO@c+T^^NZt5cPh1,ed'r\:>m-gYW5VX_%Rc'j;HEKU +]AmU@._#tYi.9b**%oS)Wp5nL4_H&A[?TO$/NDTlaU1K(f*:TuD0Wml?WPM;X5oC<3(!n9Zap +VHA?Wf5_>^/AkPSdfK-"Uc-Xo>:,#U3[A&D+,Y1a.Sm^V!L"Y0`OoZ/V:)L'!LF*aV3)sBo3 +deV".'W-I##jf>(=\&r+?hHR@eB!.LJ$I.3rN:*E+@tqmS0`)[I=DZg:X71fFL4E`I.'L9(o +$I-iW19XA5cGMap;)EJfD!9C.Coh*\Ll4k!Mn/*<\>d%?Q:ATJ)Groj*FFke_R5/*,/[[=H5Gi<@=F[ofI?gh@90JVS@@0DM\C<4cKPp#A8=f@&9na1++EdFKAU7_XAB[3t +7=%P@UuKG#sgcD3R)jl3Sa#CsfEl]A#PS^gt]ASf]A3VmbQH^+!8s$]Ad/s!WIP='q98g?6`O/K* +G:oi#[`Z2`W5f'JFZ5FU$cf*4n!MB +kFQ/ektWhlUB;9I>=?Wnqjl,35g^LpEJaG6iTDS"fn*Hl7VL>ums=+Rr +@_:8/Xkt?+#NeEnZ!#spIW3TEc<>5^!+"r]ARLB6$67^A.<$_c5%9a^pcT5tt;)gFj]A.Nh>%o +h=pPeb?Is%$Y2r*orpi.l378d=9dPlFIL`n)gYK['!8+QY$HEB`@>l[I1G]AkWG)opGcCGLYp +(cXk+FC>d[1Q:(0e6iWOAgp.Iq7j<#`oN#s<8ZtFL+\6Iu6PXu?6FFfudHi%4sICR*J+*!o" +jaZ=WCkd>92n)itGX(>s-Af_X*0oRt[Cmd\nO)fDbf*l2Hb#Og2Jur:UNn:oc(f&#@'2D4g" +95)SP;69JU$`s)b3iX'K/7YiX!]AQh+F\QAH5Mce,FeLZaoS49f.mkDrg"T'01^4H;#LeXgC@ +)?eNQfpH?0E_/f,W`jogXm*H+kmakH7'=#PJh:k-SRg?triMQOM:m+)#R6R,b@[%s9'0X8JQ +C(@7a2A0NuBf\JJ^T!7p`V/*RgQ6\@G*^Up9?g.HIl1*9`bC:As4@gVnIa:V,Pd'caLIp8P# +$i@rC'6dL_WAJ02a3__cX5cDFTroE^o$29-Q3!coeoHY>tRbVpP3Pt64?mms;9)_5L.pR17;4!f&!3cNa:_tPNC7lf +V2Q+d3^@1b]AY>4PS*/W>[9^RW^3?oC+O,ILK04WmeFlD4*Bq6+a8Y^-?1?d5s-n@BQhpI<_, +DPIYa4F9`I27[:'=)p6t\S>4#O'=pnI)TF\Nm'aNc\IoG3icmCZcgBui6pk(j!IqgLtTGKO_ +&"6TEiMVir"d`bh=WcV[GBeq_^@]A2j]AG.e8ZhF;YH.J]ArW:*OqIAL;i<.lf:.t!rs)3X\IR,Krl\8D>".HD8<,On)Hu\,PQ +*r\P\%%]AP^iVqH#.X/.[\d4a`_oVtJq;RGu3J-m`birsjE^Vm?l!d]AiYADM0D?3i=l#kI-%? +()#(J\I_OeF=Dl"jdWgkU]A,*ZA#<_n:(b)b]AGh0p9g8EKfo:uN4jL>B3&>ops,A&^C:b[l/l +ER]AG\ZoJ5He'h#T4#Lrk]Apj`ZE9[pu'sWOU*LZ))"2WgoMW5/K#6)s@)@a)WpE[Eh-)P +6X5R4+FsL%t$D6I:qIR[U[QF=ELqm7ouU92OOSf@tGd\Ag"&E=f$65NfUX34smq=Bj +`mVgc$QAbn:J/m-Q+go(74<#Jh_qF@fGph31$'"]A-d<61g`=c'-^T/A4tN+s[7FVh!6afk=AeInOZDhpD+=fZjj3 +PRj8DD7h-#2$`g(no.5nnTfNI6"kd@ +A@qpe6[TKOJGm"HkO0dVB#pkVCTF6HpNaO?b"L_i$T'IqCBQQq,\E:+#gNbl%]A$f!US@/\`B;BS#(iGS/F]A@EeL#9WXQ=k/WM0 +7.P?p0=rCe_8$nIOJr>QhW_8J/^]AS5\I74@t=neP[A-L.CY2nuieGb=ZXld$HT_M,ap[WaQ? +9`g`L8@HqfK'!u=equ3_PB-#;R53TBjKhfmYY(%oM1Pk0+X0CXKRWB[Mqnti*UtQMUQ1@XLT +q_93M.;\/c#nm)nG+#-+m +'VI4OHO&t3d$EF'>iD?X=$saK6SgB13X?Zlee;r*Q3iU?Q\0gSgXG'H9&G8fY9bA$M9_XuX9 +fS:F9iN4KNj=LSb6SYnLDHXH6tQd\ahE=FDr4>pg*g[]A:$.KkO1qAgG2(GRB%*DUKp_,Q@@S +Ug[,_Z[E6Q+.j/]A;(g*&t9L;E7@\s"iX-hl5F(er-F4tQ!ED>SNfs**PgCb$d@ro\BU1gQ:W +nX/>P/[0q#=ELHb]A,_t]Age)uY:t@0Y7O?p]ANI?pQ^r3UmRmLOC@HDfot#:Pj`Zog*Y#>>gHZ +il/Gr:4id89#L,pm6(_2q?"3tGSP5,"\q7SD[dIGp=s1nPIU6A\?'e+$+mCR:?:oGsZJ(9c0 +>WqZ +I)@.Iq$mbKXBKFj;P&Ec#TD]AS\uaUDVfAj,NPC#_C,FIM^3BH2[R^XSht1"M%M'k5kS14rit +q&\`lbrK-h]AhHVpqV[3U.gP*&>2o#5'OOEj:jfq;o9l[uZ>in`6n+7p%0-?8"q&";m185_g. +ot)sRWc7%c=;B-d.[SMj@3@^9]A2.@cVkT-(kHVb9QmkS*\1G4e![$LF"17C$grm\@TN7+`(h +'^(eGh@:&ZDQj?0n^6<-BII*]An_ciN%_,U4A&i-+)L9g"CZ@<_L#nnoNUkH_]AK1#jFE*OcAfihS!RR>< +MngmhK0p/d_`,&t*PI^N'Vprm*_9P4A]AfIJgTd#OZ0K[u+)O*kMG(eG^cilhYEZ_j0q!m^4( +.jP/F/&Z:nS]AC$da)>m-^Mg[Df^*e^[(?'br]AZL=$]AR[5o%/6XPmi0q!Qmp'%K1<\.NUq&q4 +lRW+g!,Kfs*se>5Hp)MK%dl;/f/Yj1:s9-aSlfjG'?*PEm&AXru4);V)SE?NRPQR;Jc_X4a+ +J6"/(u]AATjtSidd%r0PI="i;>"8]A"P\=$+djbd5;+'02Q>#hXm0tnP+ +B[g/_]AG+R=^ZjLbGhpaEB&M^#+3rdYEkXVXPTQ`[Rp$!hcEu`38YJ#I8,9)2'Btb3M&tINJ) +0pVT^*;.Cetr,,h:CraihO"=bHKNhPsnXYki,7(+CJ]A4%obH_'q(dZK0cmLZ&=k>XRVPlaK2 +o8V%7U"I?eZ,J7``^PT',p'^Bj-p=LHN\ERV$Y21>i@Q'6X^:m_aZ_%ahEL\dqU[;8XM#(LE +D)YYGB6.C]A>6Y-angd]A,g/NP%p2h[i#f7r&^/.Q2BEX>Y)+b1^:RW@0lTfdYcTpp-=Ck-*IUL&u&g(Ah_j%##[d2?om.$od?SegFhY8fDqDV\o>\O]Aq07!7;9ptW9)Zu +ABupup94@1MRD0UPoHcE[MN5')^RlUA`rTS%oR$X7u&SHj'_/SpX0PTo^_/e1&'DY*l]AETqTp)RDW#Q/A<$I^5P(8--4"XiH_fTRZ_>jB*Nqf( +U[qMA"qC*W9>KH.7N)_q@!3d&E[@_D\cd>7O[Mc:,<$"At`P'=qm5\W]A3EU1J(D`Z6`57$N. +*Xo5)55.eJNQ,Ur#:#R[sJM7e4-INPiT0n;,Z]A2%QeR5XdICipFbaCU60k^/a_5*ZpaW%cl< +,=^5&^/"-I`fFl>9,G=?[4/`t;HG($!61W9h`f=;Tr#J1DSV5)c]A]A@#dFJ?@h!>5^H +ia[]AJjLbUmA9HOBLXW+6bSCm%cXrM6ho.8D(?&i\q;E7Rle9M=<@.[f[9(Rs#Xd'Y6?(IHZC +b(O&-MCJ4b.458J5b%^gd_o2,QT67'X`(V!H/D3kCHcd,qUPO'53K(Z^(? +uCr+g$H":_J:cK4ER4pe[2b:8D"4=I02oAB!jolbDS^f+#W$U@$]AF3$=9l34uZqW'a%kp$I4 +uAmXFr(!qD[uasQf2VCQMe^[5PeX>Uok9p?&XbP56D_s:S!p:`%+H[jOVC2eVo:Oh<.$0>Kr +KBZ=kV0p\F^5Ka1WUjf+nD4FTYa?Bg`mmFpg<-KHKR#b!i?V[EelfiE6ZBW-/b'c+CXW-;T" +jqS,JcMW;QL/i]A%H4,YnT7,Mk>?V'XSk`V*<&) +ms#T9)r,m_=(Z5p_BZ:^XX?lVs4,o:=4C.uTQ1S`RSf)3VopftMhbH;K_(a%%E30BqQjQYDE +GJJCCZVA93!;Gf1g]AkTj#>6RD!9;B"5Xne_udIH47KF,.@46K<<)Quqf8jNjTT&?#?]A"ln$+ +U4P9lnil'fi%"LChJZ2nruJY6/2.3rE]ADK9^n@NSLoNUoF(!F%?qJ0-GQi6/N74iM52OV6X.c)W'Js:Z[MUIM+D?i_(qP9rI +o0X8NA[7!BF\52hll.*c"0O$i=nS.A;sFE-i8+c"NpMmWloRhFhC7]AaFok-LVnDm]ATniF:[C +S18TbkoPKd@%HrVG/cVnha/FLG%[^*+33G2QU50,a8p'""/JNTudc.+PWDUTr]Asl".#Hk^jj +P!3nkREErAX/ol(q$Q5WRC+:_6&Zo7Ku."J/k9T7)s^8pMsa1DSipHrl7]Ab;b?4Qc#p\bK6h +4!BO.3EFTT'mC5!24/VE^DgpCt:!N1SWHn9uk#F4Q&*J +9*'H*?BFo285]AHVHg6MQ2iS4&?,_d:R,5K9A?;V=f>&[+p`#OP5LcfA`$YXfi/unr,3ZP8rD=^C0,'cj-c]A6l%Mad''-b\=a`Z+*2A#AAW:lj18I$WO`^Dk\&5?rL2#j +:PH>SrJs*kft$d-IOBNI>mF!7Fqu6^O>nkZ!$,3X::I?3V7e"g^,a:hB!E?\ZRRd#,eZB"CN +kF/d[cpD^^>;sQU`Le#XFGmO]AlPU]AhhEPqGW),j!lI5YYYStg#A!cis`YaV21?IDpcY8$!,6 +]AUQFN77)EK-g@WP]A?&-r$nX(Po(ubeYKVeQu=sbg6:=&$$8sE2JkR0+.tXq"JUC3nGWf3]Al& +WDPYF##On"T-rgBQV"se]Ab+[?P[?n):tH9se4'1LHg^#Qd)V<>HHs`!TLosEMr0WiaWYI3EJ +)*a.a;J)D\?.';@UNU-50J-,?#'k94[U&F=,C\HF!bOr:fc2nM(Xp'gYjN_=+o)X-KkABjB` +pV7if]A@>22iX,k>!e)"e6,s5?5GmnrDDOnWGaT8s!e90E->PL&<6TZLE@a/l:,hR6+J)SMGb +J9A2(HFk=Xp/MT,*75]A3EHARP-dDkO8.13YJnrUSc.E*2:X41trQKTg^k$l@8QLSVE5bV$mm +FAa6`E.rR_.uiq&"M$/Q,;T!h=h=d[;tVS(0m4D59+pi_'-\2Hi;?TF!kfs.+&<`_&LW=7&b +M/FB/)Z@`NIrJlCM=YKWY+mY0g=J=s>!*jLcB^(2u%oPa<;uI=poIgF?S.,W4hk"rQ$`Mu%\ +rF?Fa2mWH1O1H6>ni5n9VW*MnaoIo[_8-R/&E39>0g>;Y]AnC1[LM04gd2]AO]Af.Qe"pP(Xtk`o:H\me_*j7ig^BGQEbR(>No2MUM;6K(%X1'k+Zo/C6RGOUE@ +2b2q]A_Hp,5%KaMF:4O7c5cHlJW.8bl0]AA(le""9S`)#sVS,&iZnf,BR%t8(.\U1&L3BWYlq) +\0QTo'`.us@V?]A`A`0$$#p0"Y^,5U\ +BD6Oq9c?N^0"82o3V4ORiN2]A0i\fuPtW.L:h!U(,s,Pk,/$t6GO[[+0ZM+0)UU!7JHS=J*(* +OD<&ipeO*fb=,M&[l"QT0flF1O`0&WTMZEN5.>THQ6U(!.Y( +>P#pBEhK1tIAI/]A3=e9q`Qj;(Pc$jU6P,K_8d[NP%S_SQAVos#m8@fWI-?ohp!N:b&0^q2$<,N%Z]A0:PYKKG<1 +/c7iP:8O@B.,C-(?c/^Zh>HOu[rS(b)fQDn_]Al=\kg+*VOhMAVH1"ZJT6[UQ[Ws%\;1<5rcb +]A-VdAGVP=0kE"g,c6^oMZ$?SLV:A3bN`'<_'mTHBSh.4k3U;\E+lmnZdH6@srg*t8G(I'i +&CmQUOtc*@?KjC^b.\kHf\&!s1_2R6!c]AF>_p?@@R59JLZ_gKVlp9icS,?oPV9d8KUXe@d1> +/E/W`,>=9[EGqX#/5\_rl4mQ.Y5@fdLLW>fIT032ArhL;BF\"C[MZD8M51HWpMO@^=+'M+B. +-lQs4I413"@mC"`=/`i*0e"to>\T0!@Vk%eETT>LW +J>!WA6gQ)U1l2_rbP3HK><9E(<(=QbV7=Lgjt.B+9L7+j$3-U[fdoR\H0%c-Qg`5eUa=X7A: +9lj<2fJ>lB60u6F40D5P(MQS_JGDr756%"%2a(/h"%D+/#P-l?LlEh& +^o4ThYq36kTIY70&qC;$\U'=^IF"-_i!L`7#/i +OEDu3q\J%250E`5)1e\-)cQXLP-b^'-HT,QjjkK<1_R[-GcToj:NK$nE6O/KC^MF*g^["%IV +2i,5@rp=6^&pgb/@T`3:d7VR+gh<]A42bQtEG;N5ZC(gYe>!'5#4VPeO."D7Rk%eH!1pJjR6I +gnjuU^!@^Zl&%Mil$KP%X`4-biWXtSO6B!1P*8S*J<4Its"Lg+3H)Ws92Z@#l#X(;ci^*\:/ +04=sfVrWN\f)-$E6uuCGJ:@)]AA>^3hF6L"$_*X7\caseTlMAe=-m&tI/!/AYWYQ9&X/_IIhDBgY +Ra\+??Qo>D[/4]AqK[@=*bj(C1\j$4#?Ot'>_F>h#R(#0)K-]A>;JB1gZ8!5M&e.W&jsF/Y4dR +VXR(7')Kp_to-5Oo'F9(su\E$k7PCB'#fVdIm[2RD +BYbPS=5CN[qhS%nlYQd+`^i?\3p&j8H@nGn)<:]AX)0#UE/&M.PqhT5qNC*4VQ77pJpAKg$8> +$b)i,653An#ikY.?1r(95VP(1"RIEEOl@ZgT30:;F2K^h5YK7Q0^R*`I9ZtHC.]A0&#Jr8DJf +h+>gD]AYpZ.pej]A5n;PpHM7=%U<(*'i(pA/K%IZ@IBD?.3/<1oYjWT9)[JM,0\J(Vg@=C[/+J +sb#,A:?++2c.HR5[.EGFL/i``[>]A^3l'a#!njZ-p('g*5TYC%%!\,Ju()f;B!`R-)@SI_o!h +;YC_@JX3),ROr!WSJM#U4H3aBDe-p?0q4dL:dZE\7Ibu'-!T$$NP+&W`?\9O7Xp,GQ*XCs5A +mT2qsauDhCaWesr_.5D;ZAs!M\C)4rA,)T*Ib#E!eJLi)QuJs&\+\Vr*g--`("g_]AX_%:MDY +EFXnq<0<9PWS.a+%1]A[s)_$CAbW@'2g4_j?2"/.W)4qVs"^VPO-Q:khj]Ard?7-ZP$/ue#XE[ +WF\8u6"A%."Ad8j&oMO0Qq.e[6)"MeU3PU@(dchk",!)BaT+T%h*B"q807eOW)T=H\lk=o,p\g`)TegW, +Zabqh`:0($g,[(H(J[.bXXU^$941kB08%\]AfPU*$]A'+X.c'l'%#Ob +uA6iEbfcVf]A=1FTpgQW@Y9QPXjY&2RhkI)oioHnE4cJJ>Zkg9N^^OZ1>="5Z4;fhS3,=kup_ +1mIH[)O[3umiWe(I6&!tDQ`R,;0:CL6u"TM;+;.*SEMpu-[_[:S6jFVkeH +ONI1"B,fK/V4#,*@jQ;6B=^h-`ODtr:lB7YM'*q+P=U +aK=qoVQg'cF&L$')4e8NI6`MOJjt>Kg5"\]AD\9%>!(@]AmZI*@?3`7?]Au]A.Me`RD;c8XoE0U: +(R0II8o1QJMJjh?RDG>!IiUo/.:UA<0SrTFjF^ji5WBR_efP2jq%R&=*kC=LXeU)8`j63M5[ ++UQC*:soG_EK>WmYHIV7.>lD/l=j#C7%_1;66<9=ONMmb=0UcFDigq!5Qgg_jL.2\2k.Y7(. +P9jYf/a'<8XF3jVr]A4lcPb@_2OqiK_Uo$kgmuk;5C>0XJYG:7>!\D5e,X%pqA!!DD?;VfI1[ +c`YaA3rC5M25db:2[-=)WJ\&>'#&6tP-uV3Uk6rrH%H-?!cAZc%#ELuB5ZpdU)ke[o@>fh1B +9_NbA31rWl8BiCh[Q92jq,6lB4WBfs[jfR9XETCQuuj4ba3E7uO5FlDfLo.N6SeIq.,;p+]A)UFn3AZh`qBSV!%`idH4ChP& +79"g;)&hD0+*Vj@eJDfam$nTca)X!&qb[XIh,QIk$^]AC1C*!?r*p[6`(L90;:Ice2AaNG;#( +JL@m+eYdY]A:D+7%+<31ETpOhMAk( +iG<7ej#ZaTKq-cX(T<^#GS%ZS&Da4oXHuU`2D]A";[hbOQk211i(DQbSa;7mLq5(1;qpL(^bT +RZp03;bB.D[RLUqG9nMGho05=BNfTmLmE6:'`Y$BK#GX-g^kafHFHj<-&XRn'+ek'5:Q(ddQ +4[IIOE$36c\bMj44%3b`kCh+-W4]AVIA=Pqhie)sS>6L#9E9'*SW%^ugX>%:[c0uLY+. +4n+Dk'siDM0U!E"1dE9#^;MQ21Vo[F.i^al0,s7fO.*5ZFAPZ*mh0T)ld>gTrcL]AF=iMsoXX +Q;_PRFa/.u*3&L/<_4]A#Ck"p(QA\;u%0\2k1cM&PN='92qY(gdH\ncFgbXq5RBG;m&ToJ?cr +gW'oVRTN&k$h]A$`N:HVktX_q/k9Cho'*E;M[5iK>sKB=!q)A\lYiML9R@43kqq"^1/B[!^3@ +YrMqdeSK20Aa/)l>>\(68;bi\tIFiiImlp8_BW`g!^fF'EbD/J;\WCq05GM6[[[-c^& +N/A&cCb^TKrTUa56%=2[%hIFJ#;p!k[7#'Li@iO;i`$K3h4*Km/O+hGglm)X+LVJ"S:r+qK.HX8rJBCE@j+jhTrTbCp +_U3V7\Q6\=4B5)4:,omV1="KSM^FQ5U/TV:\*'SM]A^a^jlT5;Cgj::P^Mt`l,DjrK32i'+?2 +0K2Mm^MEb38M7Wr=L?#!,KV7Rk##hIDEeN;7'h +Uk*ho_glLF='UDe^^tmuhp?^ciEm$LT?`_>d2rKVim'0^?L-9Pl+&/@IT2up:5oun'kI2VB`,b]AfGObm?kt4dK;GqU?bF_TDR4 +6d*2VWG$qEB5d,$T>5BL-bB_'k0ijQQ+&R"@(1qoS3-g%&UX!8rl)OQ7?huN`1Ikm4`.7+3I\taRM4mIA0+&D@IC5DTHnDU=9*bK+:j&iC!VRg+sDTFP)K>(M& +01#XhV'fSABH`p%)lA"G#g]AOQV\-P4!@CQ4r[h`)"j1d[%6c!7'H%;X)aM`bIoJpreO +!b0.p74TmM]AnML8\S)mLO;\%nLa,tJDA*W@XhA^+PS%c?Rg(kY%nE=]A(aE?j9hpqK@:ai33k +-eXQ,29BEH[;V?s0ITq>c990,-$*Qf_tD<.ro3RC%U\`IOW)'kt5a;6_G[O[4@BeR[^LKctV +K1_J=59rs7BK_,>r27%bG[UjM0nOP<6(+o($^U[5dkZ5s7"Gh1[Jkr!DP^V_+;@3/qu]A-7(j +/eB>>11.INl%X7iPPkA=qto+b'B:J%E1(=rfJ.RCO;rZ)n*\,1c"n*-\EQl/$8N +hd^ZR`F7dOs.%5b[Z@6mf5/dHKG7r+GHn7b5NL,gpZQZRr+'X_m4NP+9S8'0T048flL!sR8F +oIr"--1W/HSFHi1J"B$\m[[H41"k +.NR7!pHN2GN%?bg-qiBa!EkT_07slVh2Mm4fatrCgZ9RA]A;(/H[=s#6c`s9L+9+grc_b`E!T +qs"bbN^A5Tjnc.(D=&-lkQ'6,a_W6#rD)HZbeu:a19IqU"hugi/B#EL3rrJ-mO@39T@-eFnh +1'-C]A[4'D`Q!.P0$itVd]A`>Kc?/:\28EZeJt=gSm?j_hk(akdqpXET3F`H`gFAj"EgB:8?u\ +LsHYKMT^;ER=pZF_:P4&gi/IHqs1,1C*N*jd.P`p[]A[@$iJmV6j57D@kGUaH-XcjF?aeFW:1 +ip`nq)cMoYk>5*h:su6#K>c>h1>;#=nrA[ +TqRa?ANRWLUYCmH.Y+dracbCba_<>&_!2>;Zoblb*KSM?:g9Q5oi9&h&Z#,Rd&IC\m-nZ)/M6p^5> +#HHKRaT>Q<5!]Af/sk9r/#kE1eo$9auQHqH(J93Q6aR9B!oGgc5WrZa) +/&R;ghGN>Ac,cL('Fmf!JdG,T-=tkuMs*oQ"LTUZ*n]A_a,BV;8TTsb*+U+GE/eu56SG`6[dB +'l&ZQ!q=3lSG&E1o8AQ<[t3JKY'%Y#\s5c!+Pj +]A/BJ:brFn:lo@md2^sT*<+iR?I+WBlm`*uV095Nlu"MuN!rYUQ.k_+kmTagPkB=G'ZRh%G@` +>_QZ#4Der)$'J&meoLr=qpPIE*gqA\N\$bF*lO=,U;&?HnpFuL\#NUH_]Ap=\q]AJqn_lJIFk7 +o$BF]AoR"qu0r4e>U*^(+ClGY:1)c`,P*Cg8p$p?"lPI8d5sc4a;6qU:'YG$u%32'^bXA_?X% +?gXC3^afDQ&;QgUuU5U!]A@1UTI$0G=Oo;nCo=JLConE%l-uN@dd'.\cbFmb5L(ojF@*sX1pb +g4.2=ib!Qh9Oh,;Z53+jaP?3cc_YO(mq7Q3(57P2_.UI1#PpNm,FiNjAri=\+Iqtq4E,!pGQ +]A(9r)qf-4_-?d2(ZjD0\eNAr)c';gJA:9>H5,#$B1'oP"HjB,Bm?RHa:qlp/0k:fr[q0`mD,p/.^2 +RSjpA;He>4edu`"cViiMRtp&j2iIK[=+\nrBrkdO*d2M!=hRrN7DfrEDZ!@1X6FT3XC@o51K +n=oVe%09,X;USi#0&Si<*W=4NhL&>2m4oWiM7QYnIk7?@Ecbb#An$9U.B5jBlcWqo-b.,KA1 +eCTY?q#m"D.i?'N;M.;;`r%YL@5ni&(uN?Dh^0t6"[Odid&UC_"li;^2'QS+t/l`!5>Foal7 +V9PSaXG;B+CdPaR'.0ZTHZq!i!NU3lLX,"^I=mnb=%lK=8mNG")rER;Xnh#3rknu^h$kN()G +)Y6@m8-Qi6?WF@#jKO_J*0$\J-Ao_e=*u"7/!MVEH,jp42nJ=]A+*kAW4>MT[Nu]A1cUAb>oGu +,N+a]AuqS]Ajjl(m-,%U*:aXh2AYp(d'>[!29bZ?UR:uBg_DJT#]Ab\.fpn>OjG'jaT7!:/LRFrJ^D-d:/-/FJ39daBkuRuM5A*cL0bhQPhkAk0=dDpu>Aj@qjg[ZLcNQi`k$uTFe$` +4squ28H>=UZIPA++Dn9TNj>4+&15:Y7#Tp(bpUQ9"tECnE!Mf8?spMYa]A$5,OnVBOJL#$Kge +JA9L=%0"4h]A.kns(5nfsg[Te:VmOY>[j)1tK?BF/qd*2ha;_7O/i?Sl"hrl`V-OkW>3LO6Zr +FP1N_TP>;mi`#;E<32X&P,@e7q#l1OOUtM8+"ia1JP7]AArV4\(WUFCeX#c/kNr&5GZ4"iKKS +f-+NQ?So%452aBX"/eL%T!%$ZcJ/2G6HFlS+@,t)Pj33Gd?]A3#@^0mkcY +\"Y@lX@+iJWMrA'DaP/kS1VV.#! +`b.=rJp(.Cq8lW84+<>*FbC?R4?XpKu)BEmMVo*CAJQH(9KhI![HhCs<>G/B[DP7DZ6?bB:Gr<9ut0/kW`X0rC^#IP27T'B,@ijK+uo?Xa8QB4?3A$p"=OpRI@j!Ha`GqV'Lr_YCT&Y1Ib;4pj;G +;f4qQ>13`N#ahpO\>,/q_+E[eE;U$.=#[1Yt<9&j[)PAf[hecA)YhS7%tI9@1IP/ARs(*``J +0'<>ANIZ!@N-7WkDc8nU66C8/iQSOT+NFI%DY/`7<=]A7HPP7WudK/gKP^:8TgYJ]Ar-Lh9>"k +P0%LNh@tIoBJT:_JSoe+PMXH]A`SBX^P'RKDGs +0=)FV>F_$[Ko"F@N^68rs0B`a_I(SPW>b^QJM!+X,LPk&GQfDrD;<#Z +=e3Z'4:Mpf@W_LCpkZ<^Om4pn]AA;R1,=;rN +;U_J/hBs`+t(:L/*USr9M-?Q+)$go!Ge.ME3.cD;pX+"EjRmc]ADr"5[$LI)c=T++s/pWKac+Hp'(rUqFE[W#pXd#t+]AcC^>53fBu_lh"e +oHs;(.Akmm,.<,0he%T2RsXNFjYm[V=VRD;!"FjilXd/[aA:RZCtp0;l(k;)O(0"/$\f"A1[ +ohuE(Y:(D:>':17G(\`(?t2hYYPt4mi7d28&7boj(:f`o-rnb*g&n]Aa&*RR7ut.k'EH#q:!9 +Gng_:\V.6S;HOlBr0Ut%WD*"l!.fDrN@LVss6$?J":g3gDqYKVD]A29C@7r(D^5Jio9H`'&k" +n?NofP:l'?KYk'j6ua;O(F*_;eg]Aq0gkNcq=h&u!thSZ4XDj;_seP]AR42I_9U]Ajn`I\@*Pc& +0&+?csg(3QGZD2g/-Ha`lkg'UUVXRiaHJ=le!"l>!lA;iXUM@tr%VSAbh?f#lU0r00LCn(Y6oB#2I/ro_Yn_qU:hA:.XI+?%6O-q/cRourNk8u2 +DgtJrs-od#"Ab@n8JMKO1;e1-2D2L)`\a*jr?qRkj>CO;;umsq0Kq()`sh@o^AthD&$[5@-C +?\J]AG:/>;[Uk+Br=h3\VR=b*LsgkU>VijuD8eb1JjD(_fCX81:X-HG(I3SaH40/TNcUfoW*k +,]AclIIU_]AtHEp\CYCN)tSJ+6rBq+U%Xd5LM&DNR_[,=9u#5QcN*kbFUU[f$BE^+p1G*->kF^ +EK2OP^uD&uDu:j?3WQoTi<8DcO'kE[MT@]AXhk20du,nT$k*]AQi%9rFlYqGN+$40J*3pdC/=7 +WPZ\[0:dj8aP6W,-84*LB&YLBXGY +c!rhbbqTI^>Z]AP68IbA*uSPP#K*T&9:I. +a5)C@_r"nR?4')RM!m+q2iESAbmRFrJ/lEFu3f'I)u=#D9F8eb`J?8LYOkb$O2Cu[.\d-S2oY>se^eo4b +RTS+"njUaO?Z4`M6URJC!5&'@_dLo5=hR;"%AHS?lJY5,p56F/rF_1Z.r[a;h18CIRuhm7PW +N59E.'*-`tT^OQn?-qQGnF%fL0><8lDKne'<%BP1!d*9u7*Ln1r8-rrg@U=.kJ7P1AT-%1R]A +X$WSLHpH2O[(.1Ag6)rjF2s*u[]As!@g= +i)cR1@CU[KZiV/b:.'m".3eR#]A.D-#aBKnt62H?S=@qfU_lP)Cn[HRUr^c`KjFUI75p*2ML; +,Q8hNe(^AJbNVN/i:m./Fgi7I#U"omhcU"SU3:-k6E1dTE(-LM)KZ_r(#,OZFd9.(s?lTIEa/ +!kUQVINL52HOcA?KT[c(He"doOf`BR-n5676XunU1q+%nf=dUFm\X65D3&k4-RUpo3'E^?YL +D7Y[:#]AD71X.n+JH"aWqf^K%REhjUud_*7D6Of"S+j\icjHIq519nhIn"RM,]AhMlRTJ$;:$# +7kD&C^BVNSUj5"@MAEDkRNgh9)>s0arO%u0UFGFPucD"l[VBu[CCKHL7)Ppf6_e5hF92.1V2cOGj[MQ\4 +N:mMC@TlXqs)P@gjY6hPX.UJg35_uRJujUHqpq#C7L_r^Qf:\0L(?I9_K=RMp8<70:EamNM0 +3o_$Qq3+)W_f#5gAIW-["q/l@'#t_3,OXf6`dfe$XBEKmlLC&i`?O@C\nq>^%)H%oY&#ANUN,t +.pAZ0+^@6?G34`]A@((4SFpYFApcd"]Aj5l5F-Z6UN@`u1<+r[W]A(Bk=fZj[W+q.rq/B,hb>p< +l*sM+^Gl8/6Z&$):r!RXBTIC3f_iutE:Q#7 +p'K-)9)VP!28&#-[?fkKs/fUn,khtC0(JTJrB.Z!c1+Y,MSA@Ab@^qn^e3o-'ZJ5hg#V\be? +*TW4-6TLkKWI#X+t:,prg2Rl5iE/kF?HKqY2!h&?bZ3e9+f&m`j%.UcS!qWu"CYF*H70fkYr +AKW49L3PjSfpUte,A=C`DURj"Yn"@r!,E&O\JN-*="- +fB0,@sN'[U9'',8IUWiYjSNHDPb,/SSf!ITKdV*<,W$GRMi2AbdS4FrF#9mmR"]A*&[eLnele7d=8WFFOh\a-,GPPlr=b +MCLRK]AgfMqpA#8.7PM=AusD\qQkjE-06OQWkG%Rgj[t*Y,=_[I_/gDoSXaJZ0[+Ue5 +tFUQOJFnIlBp-R#2e]A>bTiGAmfqaNu!^14$8Xe8 +k07F3:'q_/#kQ@i;X%\.>5TW)U<4=D?80F"XRkaZ*de#JNtq5/#+I,-;VC!WW:]A''#HnF;bn +N+qkHGh?MV^[C`riA9Lp]Ar_Ec7h1@RkV0%hT0mrJ@i?T)gRr/'WfIOY$7Dlt(l7BZS?*mHgc +eL->?F=\g3DXRe9*QeXp"*'Ec>`Uk5Y=&YZ`Y!m?srR0_6N[C&A4ITg$sNh>:UpSm!`&D*<% +8K#Q_5kZtbcZp'"Y.A&nJXi7Uo?s+6&<9g9=9kS[":(_Q`Rl]ALK_#'&)mh5Db=]ABJta*\;W:_kf!S3#;:*@!.fQ#+"4[+[,34;>q&"SP'qlD0?>NfIK8KS!? ++=M-.pC'OIZX`MFab-.CY^Mco^EmYlqPffW@84)J^)]AFoDe(H_@lB[`qJY&C9lnsKjEk3n(F +T/CMCn79;>kneBH0@l$62)p0j]Aq!CM`2Gibh025;$oN2!bpVR0?T=Xc> +)n:!#)$MSdZa +/.!YFUbo^G.I>/$Em-s'U*_AHL/[V,4HMHe(?T%ETOD1S/FJ^RoF!-^Xp.FoB#9CA:9A#ms@ +G"`70[*''Z1bT:N`!hV7`H3VH8##B2=,p[%*-nh[Z`E;bX*g2"p<<3-Ugcpa3!876Hk&8^rQ +SJ#fkm+IF`=2TGO\6;A9+a/fQV".Z(]AL,=HK+Z"g'A&1#e#L\R%8Mr8hY!9o$BRTg/=\Kaf> +Ol+IE3q."hWEUQVOGTj'-BWdV[pg@=4oRLA#jkG2:o-!Fss:%V*$K/#pY&a$7G8%FK#ak3:1 +NSn+(X$Nk\gR8d[0!+W&l)1Ch3Cl3Q442IZ9k[9&!..:@6DQ9aZh3F6CkbTHqZ*"YN[)%gg- +J\E[@k8*hf&tXRlSR$A$]AbL)'FB?]AWjg"2.?h3T"R`eR2OCVrlcrB->7Q-\12XG[O'BEH!2A +`9)a=BLqEZ=Uk%/JK?T+#5SR6jTVnbq#krVRg:gQiA8\>db. +B7?N%YuUB&U':qfqB&ggK'Nn!;BX?*TlnB=7#G"9a#d]AsU)5/j\*V/7+36gq3p6H_A6"pMSP +;=^[r"]At;Ql-G/Dd!]AP=?mE:0dNhiN=iBh=0KJ-&!R0a-G+_Cf+`?FnqlV[r$a`:I7X"r`cC +kI8>54n9_d:cW8\8!nJ:ZA]Ag)sP7jWK@S0\S@.I*Nl]A,n;9/pc;=*8BX]Ah9B\2dMdE`]Aj^sp +S+I8%=p"s,;Q"gfX?1A(8H>X[P+H&=SJ$dI^m)07t@&sB,'[,LoP*@`+XSL[&`_(WM?;oVNJ +U)UFI5@7&+`oUhho9jW3Qn1hTIcjj9;f_c>Hq7$i:,H%n":PKdrGJ56%?M,-L,4aAs\&-0qd +mMlCe7'C52`0ZCbbWiKeA\s%/Qcn&2ieF;5i/ujh?GRAu?1/ET4]A8^-[3fg./q!>`WP'XIiY +,XA0?Ct9QBTM7BhtoFfl,5:%*0QT%+7Y3hV=k]A'"5i_>W'WPk+Pi%G[?\1+[T/3_ea:0>e-\ +Za3@Cs"_5FK)]AO$U$'`W-JP4Ad\kF0R@CETgUBohoU9%qk&H08483!P0+B6K;6h6+jLOY;F@T4Y.CFVko/9u8H1+BMhGic&eI_ +Md8VLJsD+=_FVMlBLMoDEFCQXSW,tBiEMg*Ah&!,tGhb,^X):s0$VNm!a2WQX(aCE`pL=Z::r:VoepPCbZBcoIft%iRdsrK.&P`tu`?kA +Z\C[^O&9+Kj&RK;qs;I@A5/OJXXF:OBYp.m +);uf1WOqX#5qmX[D68TZ/B3N`u]AG.^D@6h*,AqZ^0:g4]Au4=(kI(YEL(m/t/4$?JVfNun:8L +gY"iJ(C@lm2(6Wf)/qicEfWbI<#c4\hkiGK&!KH$emJ0;K;d!'m#OVo_IjWi[/ij9niVk62# +C')$*U`XBXI@@:3#r2(^GV;6ZZ7E%*_MM==rSc(?DSqZ +;^_>S,9AB=*(AK+_k:k#1L8q^>s9nV+a;IT]AZUVFkA.>d>-Bkr>:l"lU$u6GZ,6SpQIc)[H[ +b!TcHU\$^[TB@%7)auUD_G!^+AHK86X)!nF?,IDT5<>ZAa,%&)_#96'\m\Q*eH3m"9>YRi<"B:cUb=-D^eDQb:G.r^\e3UPdXYb:(WhMjmnJScQ2mE/r/J7A +L@PV&ct2LI@6]A;\8jgl0QAfoCJ#60!c*0(G_TB+o%=mA3j%eIWWotPNc9,VC'!YpR/)jBL!< +Ch*MCU2c`/A1n_9),oB68@``7"'qo^GRnE91fVs`#h#Da:/`kBhi2O<&gUGTE'b4,S1Kpr=N'`>'uif +=BiojKqG-P*f!_mb:tm%j97>Db- +`]Ah0+$36WXNfBn1@#e#"<`?">orKYeH(b,1I7Ut%k4lUAI6%'E,]AfrE6-\^suF)sUOB1DttO +JJJ/#9(pu%S%gBhkhe.ZP,:/UM/?`s8C'-'7(JWKi/Obi;,6c#De,R:iprY^V?0+BrnIPOKc +[U<=\-6,tU7@U0lfKWdZO&7pD;0L\KO>2=lS!';%Gg*6$d>JoKdc<"m?-`14Z +3`o!W<#Ji7,mrAlqD.$siQ?A +74*WbeY(U2A11L*fARgJ>5p_"'HY>-KAaOIgEn2)T$`.`?4jDL#rK$qHL"fHbq*@s4X[&gU"&d"g7k47!-ll?p+ +>NiZ,>q8)U3UR_;3q>K*R8,QQ(%p3+Hg(F&rSX&)5pFXsof]A`+]Ar4;;LAN%Z.JqTZdJ'$d;8 +LHEH[1a60!U&Vq^Q"#t%M5t!T7A4iD4$/gM^kk'=\tqBW)n-R\-qD?WpRBo#Y +^`D/1i!?(9)G?SdK?-eiqE3]AfJ>>tS]ASBH]A*=J`7`f"E=@^t\I.(%2XI^V4^,@,R2Dg,g7nr +-\f`&1fH/LTGJIX[-?MJg;-.i'2Zu0C5U^m44dcu5*;h!fqBuJcnV%G'mZAADE,Y`O>l@46a +mW6$b`U4#gr0iJP2FbCfLmN'`FKK`[Md+Cqqj/D?0@,Y58U'!\VI7Ei4VkDQXTf[_r;5`OaV +U"-dh23]A(%G%D'epgVWWU +<+Vhr,\FLFBqhO?5,CYF-GK[rV@')j_ZSA';N*,S9/2Reh`9YK'ca#+'N#`bd>aQ_ +&36_!))@2^m/cS_RG.eoOJV(0"n'#"d19QDTp`ADsfO>6qA#,0.VZl\?+I;47PNK@jn]A`^iG +L)6e/JgIbJ+d(D%WN(q>9(IFtnreA0`FRW:N/G524qJaJnH.6b2J[E7C\tA3XobE@)R-%0a# +IjG]A&)1M%iXTO$XmL2_-pe4;`-ce^\Za#@u[S;::q*d<4p>TWV.D2:TZCbX5)3EM#Ds%bk2/ +)qSE'3TenPqG`^%_S^+[pSbPQ3`$[aWg!>s-FA>3I*?XU +(7jWFee5LsEa`[U#7Wmnb5V!lT+&\mVaePF3!mH#Ef11bmHD,TP$)DP1e8=K"Jak-j$E9uq& +Nf]A8aR)QMH4)N\FLG$[&UWgOdG#)V0X19g`-L1F9h&aoj3!HK)g^N&?CT`KNmjpUoXW,sbQ$ +F@%PTO\`EPG';((K`Xg`"!a1Z^GuI(Qs%XRQ'&V>Xnb[Ot*Z4XOEk9[ +bKYXc6t_5H'267n*[rIbSk/&ak/6rqr36+[LXZ(iU0q>T9D0lK/mLXRjbK67m`NJLY=#<'jU +c]Aerip2rZ(P0Uu?N?(c[Xl59mAh(/eu*DO?-s3Q6o=$Ej2ur]A_3&Wg?$^SO71epE^aC3m@kN +i`CK\/W"!7NP<%N!VC]AjIGfhT61qpd"bY\p1>FA2fc"1u-A`&">Xem8)8%qB%E!r^>bY$!:6 +4:V:d/YD()"1Rq*&I=C/3,bF;[5l+f+H3[m]A +gn+aN#%:Xs#NpgjE+G,ck61g1MjQ:544"7*r_J.I;#ieEk9M^KEIbT@CgGjp?k"j=A0Onsg);TP_%1:W\_#lu@+mXZgJ^s?3J? +00^]A#$nrQeqjq^Q'gGPM:aVrS_lHd;9ACVSf67r;,`.Z8a<;=+YVmiU=oUGsG?QSO@Psn[hl3]AeO1H=S9E+apOa[X_!1>L$2S6>B4WoYZg)q +:84r`CkBLQpb_Dd:Wnn!>7egg+uE=@;67+\4M=2ZI&hL'ESC%>U$ENi@AC?_#c]A7lTWlYUmQ +6%B\\N6=N0hi''C8H_u6PV^k5"0Of6f6Bp[/l6##MP'Kq[eeec/j]AW74UO8>GP\(=rn +S4T[Mqr397#PSSD]Ae6;OTFC"hdCTop:;FdjrtY=)>?]Ar#hq=5N_j]A\WF9FEPe5YKdQHOg?W\ +BuD;Z:>TBc?be(A0mc?bmj?tm3q6o+X!H1n3NhgsSjJV=j;qj^_c?DbHjo/OO.qJ^rTG.lja +g-Mng0oR.(!"I*d3?^T#Y.(1?P)4gWc=N]AAGuH%^r)`P\'FK4%_pqonEoX*QW +?13Zc=uL%>.L5`JU*PYra/]A'Q(78Ra%_L,`"qtO-U*rQH_aH)R;!mt3MR'KFirl]A +65Sb(eJiLa4aa^RTQ:Y=kX^$S0?T*3d3m7fj6CqEtM=7i,itcqh.)7*,P(A:B0ESV3,Q*D.$T::i9h +`bn>DR>%Rm/:ZbPADm.[f-&"("B@(X9$Efgg/Us&fZe>97a4TG;IpE$]A(Ii^ga>Rl4b=[%m> +b[ICqI'3]ApMWIO/TrQ=B5oO;C'93'.e.g"`//a,[2bh5lB*S\&JOo3N4s-"WdRKnhi[KPa(* +5eSgF`?h@\:"+98F0BSn3.FJ;[ic>\R:8d]AebE\3"9!c?;6MH[Y&)n,)t2CATL?3G<;10Y +l<2Hh(;r5)so2WA'()\^d]AI4q\!Gg`ZB!8'X7sZ\^Z2O]AqBZMD?BR4bN<8iJSF_eb2T6lEru +G5k6F]Aj3*1P/Zd&UVZZ[ooRjnAQQS>L1L(YF%)eM.in9IP#o"j>fAPV[`cB$+=+$H/0ST +#o9RX.V[R67/ZnV]Ah("`h*+$i:K:$i[:m>_u+O>:!nqQ6iG4`qV8qG3cQbBmYT%al0D=6+m^ +"tq+tT*Pb]Ao5MOlPidIW3ClB;-#C*Te\1C.YQF" +MUC;27M%eo%q56M.W"N->\Vd'Z%ClLY";n7W]A&AI^ABIe4*0WD+"g(T(V_-,OGe:M(VaR: +K:0a0e"WHfB%R5&)%;&7Qn+V:Ii*NS#OHDtTC"#%98J;RntZ$02"8qT_ +llj"RKBW:_uFMGZ\:&$O?F"UP^&rYTG4ktc#-&]A<.#&O@9Q%(:5-'F0IR[jPLSpMYhr+J2!= +!e@7S@H#]AK_grUS^>dXZg&cbQXpQ=efPQTP/+ +[m,mJD!>XYLDsin?\4.E@^`]As_dE6,6fkD5oA?5m5%a:))F1T[96m?n[=2)Ek+b(DZQ)sFaX +Z<)__BC!BNp+(<31/L-CH]AnLq +LXo.o-]ARU_OR`aP2ZO<5ssHZ+=Xuu5`@dC5ime,aOMBR_U5G).Y()"iP +SKJNZN3(-:.^%UKH($b@p:D>"Mm,W1=]Ar!5XN>gU@`[\L2`%0U3ES)hY3^,gOoZRUqHRnd.; +gI\Plj(?b-nS\f(XtSn?^-\p.Bb7$')W)Qs[+>G^)am? +Mq'T/GD#TJhm6*NI+r>^A6oqGc,T&>IVq08\9(gV&U;`;9016htAce.967Y*10#fo:QcFlVb +urq(q!ec5Wb66Gto`-rlf9(>W"$abcR!g>=Y]AYQ%d\It/Hsr_Pq6Mg0uggeXp,60HZDlGUL" +F9.fMgmY?5!%%Q/1Q']A4C7bKAbEU>4,aa8a*]A7H^cAh-rcg^)1f\DUJr'hN&\ft4;2[srfm^ +%DeF="lVRplJ.#9W!K#<)M+Nja1uhqQ=$ZL.[T.W4F=&K0nO9=XnK330afH#NmI$E[Jj4d:@ +#f'-b+^%-?XadMd+p^=)sE/ueg.GqYr&t1lR@:WRT!4RtSB$[-dK$^*(\&j-=G6$=[p +6Xt#Ha#U6%5S>S_[+pdgn3]A#i<"Q3o"?i:PTWEo<9SXs_9WWf!0,J-:#fh3aTYoipT^AsT6Jd<>q(IU]AW9_EG":Hd"<8!!++M1\u]AI]A^5[):ljZS +5!+<`h9B;IGu+&(/>64-YtTt.dJQB!Ug0oQYD'%Y0:b0Q>GVRb`$JPU9hIO6!j0]A0H&tS]ASuiFHK\D`rL7>2'ch)8cj3/#`No0NG-3D%n%T;"..V6npH+3gR0'dTYS%p#:Fm$>*uqei5"IX"8]A`$4j- +=X.#V^reldC(Gi+p0T$eMDj!BUkhmYhe2p&TahA([.aS[j^W6WhWQff1;[s_J[bJ&\R%H>JR +%k*#*1Me6.+Bk):NfgQ,nAWMu#-'`$eHrN7qA%AYqe?e#j4d;WT0R6npMJgUm+7l"hM3+h/\ +\4Pgl6V\oCKXMQ^ab0;B,h*5_F%@C@5"sbu_rVfr7b+TX^M8/1:PLJ'8uROY/Pn4oD<#4(7@ +$3N/PkpS4"X/ZDLe,Q.icNMrt2//LK.b)5@]A0Q8%bfO#N4P'B-9^5Qi;fo;e`<7@s0d$`K$b +$.g\HW79TB_eTm5?1]A) +luFc^/jaZ';$.2/tq)skk'!lHf1Wj0&13n+Bq1T:)_^5G&QD9D6FHOJ`9GD"#_2q*1#?VN;Q +r^@K1/RNq'#N5Z +sAbJ_dYW[R]A<8dK2LR3(DEB5DNEaC@s.&e"/=iI@VgOSQ*i"Y7>9m:7q<]A.gXA/iQ?q0!s/P +,A03g!6FC"qik5)L +Khp)n0h]AsDZ0k?F!mY977DS#?f0M0KH@#.F`rX?c:/\S?7UBYXD3B]AW<6.K0+G@_ZJc[r?_H +cme3gm[^?"FbeQC#94QL.k1(pIpQi)[dJVEp2:(kU^5F6_[86tQ=#q0Y`%&"@kKhe*9GCMb3 +K]A"tB.0F!c\3E#M3i.IiHQ<'6^qB+1jl@j5%mXj]AdZ'hSs,sHhT!5e6QJoEW&/_qhIs; ++7k#V=V3r59'r&0o/;0Uc@^>-ln=JI8XOCXrYC4grYo#N3(cIr5Tn:9.Iu@UHTkhi4s7Y35X +g#db_7!Q-T%dg72)TP[583++om6.@s.VfYejE08^QTs%-D\(WH1&E#l+$g&.kuoS8#Hb_mVs+j\$t5i +`;dm+FiQlJs7$Ud8sCN1Q'h\Z@kQj2^oaqs +tkiqr@?p^L-$sI)"6QO7$eXXeUhjmoJuU$tqtUh]A;,:P7Y55r7YSomhpKCjVC]AZ\V1/%Y#,' +tI#[j[[nBEH7]AuSl"a1e)3c:j5Z^C)X%XKa!n[-CEYTTW#k0BSaBmR=6o!;VD4?,N[eUs'oj +I>51[;K[jBnjAS2.h79m1n[0WAqODSa2Eq'k_u!XlH`$2"!a3WJX_9'uVKU+_?>An"V8smRMk9Y%"5tC%i`R=I\%G0_(MLehGA43.9Gtb!@ +S.3*ZBe0Ofp+J0Up=TVM997\M/2jYFZO\^hFq<(tL+%!8H6Y[3,@'YLP*n9r"4PMS?ach?dh +nMe$Cos!`>eY%kQ-;;J\l>E4lCm42TmtnLtql0Vl6;S=oJXb1&$V8AZaFg,*+eWgelK%F46c +aRZ%G4SsdNH/An@E151[8<6TBX7!>;XM>gthB3S&!:[G>O*N%j5C"BnDI:fbBAV?9qb5&.N7]A2+9as7_D\g=tnBQ/ki +5D6Wr2VKFC`mVr><6BM+*cd60=T&?$[SlqR/DS.4U1F5kC^@k85s&Z_)WP,mB[_0G=?FK`BK +e6G@Hr))c50m>Zi]A35OEQ"a`*Ngdre&j;=22Xj'[2qTHHH`0kV5X(\3p^&c#X+3'U`1XRGQG +]AmI&2RA0*Ep1Wc'cSpEfgYNQ2dZ7R"#G7.*IS&gN?6S=-[(%:mk:@#DntqNus&Bds-0Pd.f_ +gi]A3^l:D!$No^mG=?RQnAZm]AOT^XM0=EoI1q@u(FXZ4P)bP=IjLA.J+U@'[Pa&^kTmW%jlj> +A$+e1cdhKg,k"Edg7'(7&pC_*acb>GM-)n!FZMJ2 +.8_>Gk3u8MMIW(Y_5uorl^14^ct5T>IRl:6:.3`f_79<&Au.T4[R(Q;X +S&dB/9N*;;io!qn!Ys#nE/eC+>2T5/ToXnJ,`"Fu]A&gu_kI&r>2OkE&:X2oO@DbE*[hRn;4D +-6VtIofej87qS^T[X-0T"alM8SPh(e):*;b\*U>-lBK\DMp1F;MCiEj"cG;\Y1^_Aq8a,\:_Y/(ZEQE,0*jcfMD=W4,[ld03oK#gQ(8lYoPmr2;_nb4 +d#W1ER700++Ba.L8s;PN2=.j1tF/1pGKGHSOOirrT"22cn>6e +28/SO+Wg.k2SDFkSNPJE0*rO!o?=,6-bfM]AXKkkoEkP4PI[9W(MW$[aK!RE"AmqZhafqtJP9 +%)5miAN0jW54Pr%>Z7'ih_]A?5Ibe:-\SD4/2:$:L.MNXdf_jI%]A7YP"-(hA7?]A>JjY'G6^1, +#Y^ifk?rL9?RD0k!k>-@:"aH,7ikS10@!+AVkXj#L8HOuh[Oju%9J+?AhnEZT#_A5HQm%&3F +5D.76A2kD;Tnq&[%&Tr38TkN7h9;IRl+o)o7(WN-+Qj0br9`U+VWt]AS(MIVn.h2KiJFK9O"! +oWgFRbHVmt1hYp/CPgs7N07j-U#D9Q)0@.p;qik,PI +H(e=*smHsUE/kX57;?E1n0D*1k)u/nc$o`_=h1@7h7o#m\:AD=B+<=K6Q.+JKkMjG;mYVqI. +q:5.i6/^*3fNZKF`3^:>JWbij2*W2H@Nl#-3)=pmK2+230pank?-&Fq4RC)"ZWlsB^ZSO\F5 +Zf,$#S3q."16^8Y(]Aj4ZD96g_cRdKp-O(jYq6%+\rg@K='4;IRJ93*4'QG?b=>Y0:ki)$RVb +%2k;XI;YTZHna7k*$A-KD5goRMOe:+0o34MX6SJn>!]Ac:s'.+S0?-0"HWG*$F\3Z%^['C(b^]Ag!S8+Z7K3rZ"E6/V^% +hdsF6CcRR1Qeg3n!PuH<6/a=&apMo49W<'r7@DV6sC/2RsiUd!._i$_e#T1_!=/ck;K;=JOU +<0SYZJH&O4Q=",`A-o4%#*c:50+]Am0P2^l\-+>F(K'SG2u";ml+naYRsI2raPqN,f>?@ZS(+ +`CWquT#t'O^C8X./kk>8?0 +$802V)pR?pm*SB.LUK$&$+jYLcXjD]AE6HG_"/EU.#s[@cBd&+>R8ahM*[_O0)??GJaY=QUcVAi[jHrDVnE#-?M[J-m.u2b`LcAMKUmkQimD +g[!5QkU?3jDuCD,Df9_DN6du0,6g5On(8MSeD5^dM#32@dATPi6.96iUuWLU`[g'7fQoGUs( +jEi>i482RLYbNq@Z2D8ZN$,rNaLn:YpU*N<`R:GDkDub&^Ya\-o3U"U4,oYhW/\@#s4odaYM +:6+[=b^btY5k6[^:I0Q%`g\Wb#MtA1+VDmG3,1 +&FSQB.8CnJ(915=W0!mI5&sn6Gf7)16;dV"pbE/S5jbsIRc`,^<)Cckm^6$;s7[>K:l5@Bo18%[WCAu7`+2"g3]A]ASFR34)9l3df +"oS^jPK-hLdi0Em0>b^?"P)@(dBR9\UPs,M8"D +2-mj@GXi[!91l&\,q]A8)c*X$\CN8oSfW)6,q,2k/ok$qR3TQpB!'FlECGc]A,W/,jZH4+qu>+ +(;)3hh?k7/705:I-Pk=rVladWd\=rY.h8fI76VcdL9g4;`P<_[4c*7 +@<`aMCkJ'+8Pp6_1nG)#UR#7bHW>-c`RZ>,jeTR/iLZcIj@.Tr,!rL5po'e$*Vc\=i$OLL3W +%\6p7;lBb&!msFeg]AR&$mUfN=U/X,G&\o^YrjFP^,ag5To!h1:+c;XM(_lq\le511=]A^d13! +dIH>?DJ^QM+QPJ26caD"MmW>)2j"OW@S*dG;"Cq16(C[okKgb[-h7_On0e*'EFNGB\!U3HYk +8%CQf+WGFTnC1]A%QWG+j8:XN4+0G=oH5M9m+Nnh9Faef)=RS$aV1bkd?5$3il]AhO0)@(5<".LSHOq(qSFcA'CHtnnM\ +2/uJb)a^hXKb(Ws/T]AU%-keIo1kA$hF>3iC +opD/NjQH)ZFku/m(irSg%(LP_iS9@XQc/'bst-WIl5RE#7V4Z41ZJ/9KhE=4]A/AnGYdVa)[+dk +[8p?RXIO`+^ed[S=$&B'hd6^Bla+!`XYW>[2r_=5Cs1(er8'aMbX&AX0DW5N<;jW!j!p,\" +6i=m0#^NmBa1D.KMiH%aIlK4X1)gaS>4Ga&!Cg[uY$!,0rI88]A1785kCS]A(2BnD`FLW!EBHe +4pa?R1jY:W@qq[\^Le9EL$\;JsDQdLmt:Vn5+TXl)sB +$jL/dWP+)[-:>4^.o@l=iQ'T@`8F!:]A+P`M2YFSAl65[hTC*DR6'j"J9[^S]A*3@#Mf0dkF#$ +GT/]A8@hEhuh-\S3nAOf.>DcoLV9tk0lsY`$ZU;LU25uR9P;l@:+>]AB-TC5A5f8Bu8S^7am'?IMW!-T0F^OnX3PuXYXis>Y\fYdJg\_NH01l(c<),3"@q)R=49R7kr +g621.-:8_uj;KUe[RHokCq=*\4j?pBie>=9F84McJq/>Z'tnbOofQVXq'YH +SqKV:Q!ue:2O@e.gs#i#f-slK0&U/AQj +08u==fi^++73(b)K1GM2Z"R@`G=>TRP$J3;D +LKbr2XY]A+t=FfBWC!hc/U8ftXfb&9J+ZGPi,CeAD7df\4jM8bEB?kB^;$[D0!;#3?783.nM$ +e,9RV`+?5k"7(u9,/)YeLT#O-V))&LZ3.O:d]A)YZhO)Lg0-2h79g)*f8]AJB:V8*3%1`epFK2 +ncc4HA/(!7h=.lhRPt.m(J)qF!^(((A=Z9oPQ",2+urq+m@C%Yb0"cU;J=X(h1V5oEbBDi7R +d9nJQ@3+YGnqk^r6!]Ai+=:]AA)WqR`m%X\V;^L'E;?*1,MEJWqj5ecjjI]Aa7jn)j$gKo-NPO% +FTc=kq"7T8ZtHc^i_u1DVINq:N*i#o7U1aU%garqgp@!t5ID<[>4H)O'V6fRfMhQoFDITMr`\3V2XWCmO+3Y1?I/,Lhh'mg.7XF +;02K7!F`rlb0&R$5@ec/K=]A]ActQAGcq[hQ8ogrBe#0.ghB.fZVaPaA"(WlWHVHa[q",&_eQC +t^H^=%/*%CJ'E8hFlm7raJ4hW1=B%pI:^#J;"haKYG?[K9(?;-7\q#$_L&%r%I$l%<4MZ*Nj(p!$[K_tLg@!Y9+u65]AU +0+hN"oj7MZpIco0?;pC+E*./'_HY^e2_h_.plp'R0'=Xo(Ka5!^[[0-8hW)uJYe/,)+1]AthO +_!.=_S4VjE[*F3^R6-I\*;c>GrmuZF]AQ"E1O&HPOri6qh/E36$0lRR'@Su-o;@J*5,Y`N +mHhnfC8T&Qm.`Y3'+]AtQ#f.s'r;%Zf'mM#IJ?QU;1"'I.r\"=*j`KCA%ia,L=q/]Aru>a@tWu +N2e+``)s&26*W=7.t +'i!LJ8kcE;-fH%:dBBW'8II7B\=u^C^MV1q/.3EntIKQDlsNr&T2(0d*t)jF`GVnpL@(l\Y7]AZ +Hl+9Ci4HGWh=Cgk4Td:Y$T0"2JHn%4p/e4> +5d*%%YlbuK58IL7]A*UVVZ8sGqo&;0B(kd8Z9@cMIs7$J +J$-h&Mjs7>rKiqi54^GbT!qSl=)ctOr3if*0*WDY?/[`QU-\V6n+ZG/!k@KN!Vbad@Yd7`4S +'0gQagtIH9->n"3g*Gd6N0+^WS<&ea'.:fRf.X2_4Nl(u.:4mou-9kljZ,8WQLtbK;MAON-< +S5:LOsg[:eZS6GPhIS/5&KJ8APm>DJ\FR8%+;>m?YC[VV=bYnBH]A\FdQOC@k8BLfBHa+Pp!"h2TK?Q^=,>'%`i5\9eY3WT'9'$A;YfAcJ):]AkCV6kMcIL63C5^"2u50u'X@=H/s-d7?+2G.&eWj]A>`gSFu0P\$/TY7Zr\ +9+9<)l]ACT,h;G[eHC?^m-%RQRPZjCI\BE6fBqY9q(KAC^q,'.\QWF5?.(5<6cF5/1HhGh_eW +HMV$(kjag"c]A*gogUI*Am7bkU`md]AG[&1]AKIY-6co4CQ.8GE[XQ["$ld@47e(?0:&9S#_:!( +MbcEeNPR04oA%Jd%K0L$LICDZ+8k>[3=@rE'Uh( +/E+u6d[(oWHqePo0;;H2U.Yc6%Y)N*Sp(T?[8d/,Q`bffW'XU0n8rFU`EAbYOS+SP^K0(IG[ +9mP,=fU8EL>`dtpBLQK458Or4T?SFk*/2(@HI'(<]Ao;d/GMo +<'i^N2HH)]A_\/m7rL2'WVAaKmd2hPKE:W;NKrbd&Fklm:V.fAeL&ij\R6;MA\qcY:Hi+/o>KU;",5Sq#U304LmXB__tgYoFSPZW%u;uaJkkF.0$%$-!q3$,3Lu-^ +0WEnn"h2;faXb'9(2JP2%*Ep9(t:\;INDH7@HOq&o\;41+4?TR^j_*\$Aog"O=dd./l7s)d@ +_(ECC76Fca]AgZ.G7k0*WZ\[>63XrC>&5^>q3Q3>EY'40:jW3gJ.@Lq33(h8dt`cI^hEk22Lb +b5+:s*HmG'C7M7jYcG[sW,S=+QJZZ]A;d/cqsQ_k#U(,>FteNZTL@ +)^EF(]AP%Kcn2aU#9SC?nsnfnjg6&dmCI7j2m;Vo]AhkN*;OA1m2L1pb`rr*cMnUd<7:+4!Z.= +"^ZuO5orYQRWe0g5=Bdj*d3SOYs+D'uqsTJtfqqp+YgKKE-*&/Uas$-+qH[8Ym-ToW9.)1)K +PB([-@P>DVo"8(JrW[DQmR!``9\0;_!;CS(\LsFepboVXm^5[$dc!Z=MA# +_[DZqd\E?+8q\q=5AcrGS(4OMIh2Cun-q*^lmo*g%J"`IA'Oc$/Tt)J"fubI3FKS;TuEJW!1 +,=?EU`4CCSUoUqS/de-Z(C!ZO*_Ahh2r(=2YgJYTLm^oG@X +:2[g8YL%o?q!$js<[%VCt!$L813eh<-/5#.:/5+dd$RZ8>^[n@GAfQjo0[37pQm`Brl:Z92W +mgd8St>?FIbD'B4_`KjLSGqiXZTkEQ<%rt!8coLo)p +@Y/M4WMX$c"LOsg5lfiU7)3j#,uba +l6jC0-I361cesW]Aq,1%[MOPkDKbnH%q.>`EE>#,l\beIe[Q-(f-6E1tLr?9^Ks#^Mc&phYg1 +:kYm_-!`-Vag^%(aH%TjqbOk")=Xd-A_Yu;bh<8Rk*`X7=YtcilR)3?l/=@4X2HBo&X;KEU0 +:sha!V:os"BDR8IA?O1FQ`?H5Ls5POXLl?^b=lNfVfEF/`aq);Xbfj7[%1Ar9@OJAYjbsU_B +9Hna:iXK!S1g7OTIr!og'kU]A.WrEQHj;gp67'8#H06kh(TqUlgmT=LJ^0)_=f-@)qR`%BFVp +YEs2/ul.rMWYH&fQTpo#XKVP]AS"-RHI&M6klZ+1+hK>X!&?L:BOIJ*O4*)D7Fa3]A(lJ'SP3H +nY`G)Jd`mMXLFkXfc8.J1BQ?!C&DH\bf?=DZ]ALDb3?:&*i5b5JX+35 +-%,:;#>_L)WR#\+ZVtN0+BpT`_$kJBY$P1)_Ub$sS&Z)jk1A&:<)(`F?lshO)XWFL"fd3D[j +!LIrS<#L/lJ]Aqc>T2&?>BdslG6a.9-]AsWl-[X,V.kQXK$XT8SAHYPEh6%^R:le1@iZt8q$t= ++:g/iKDnHm^0!5PS.Xg\V)*,Fms$#FmSKSFl#$`,;ZjTZ0p8TN>'+o,%0'X@M7"`GR\dL?t4 +:2X`K%,6.K7@uMf.P0QRr&7R#!G:OuHo^03Ms\uT;0IqueO9j#dE6[B$((Q&m+lu=UgA,-6jKC)o>?9;$Nef: +`^*K-VQQ]A*:G#=40-&bZP1-5NYdZI4)eu8&^8NTp!^"I7=d)H=3&RSjA6]A`?91DdZ9MsKO1hg-Ai^K +5i9R0@EP?,ef?Q_dXoERbS(F8$Dd]Aj,&Z8DR)`t+l!@@P,"R-P%b@k(I)BlPMe$4fb0H/F$9 +)sc`sMI2kJlW3R`1-ZWDfG5,s=aq,^#6;(XcVq1B5qrnL9N:;`L$VbQmmlu0)uog4Rn31tSP +QZPNt/GZ[@4kZT@OOJd%.LSk_,L+1O-BsaZ9=-sLlfE7+`P!h80uP"W$*KJZ<^'lcH!DGU8ePr4n&-(tF^B@s&_"4jMpGJ6A)b$d$ih5M,Wkbg +eJ9bFFaK(^96A10^Q._t2AAb0&s1lf2<1=39ZYi$4(>l]AstuIB']A&r[&N&Z',99]A+!9qg`P9B5pU-aU=4N<5R$ml:[e) +Q<=G'gKp3Yi?TBP/^T6kA^T3<''l^hE2q0CK]A)(A=Z]ADPB"XeKjPMJ="!mRegU$^&RPmhR5. +NV"c$HuZ%<0c<5VY@3L+W+OM/g)ZeI"_E_=D[e@9X5q7&9th:s6eTOA(:kZQ9Rs.9RedGP4q +tq.n&-I*k:4jpL7tUS!6+$Q>Jpb2Ob"ILokSc'\;h88\-4TGEaGF*&"mGQso6BVi?e7pgB+c +h67pebMH^@F$rjWGdNO-`Ss::NP!_2IH2=d<$.6oM(gaN.dZ3 +7&]AX>]Ae$KRV>J<&_hG2j+:*[cqeiER$-(>-_'ID[hM??Oo*-Y3<4H]A#Fl?3?'[E.7B)q8078 +OMN*NBo[:ABB*BToOoSY>c5Jn,G#G-4\;W]A'C61TXl)BB&W@Uf+rpn(''<=2Wm]AYL)f[m#%u +L^B;q=+[_C"o-p:QZFXlpS2gaMITl,FD?8Hlr0eG_;g$LTu;n:nH9b_PgR^`GmfmnEFaU#ao +<_+/TU5G@>G"mM9D?>lL$7dFnF8X$Kg+r7G$;h*rdUi0;)H8U(!cL@?SQDa_DL?M[mE'?`[F +"b:PdthMd%HTWUtIP@5+$7r]At:nnlAV&L&KjU,BG7]AI`2#Vmf,(R0$$"U#@f0p/-$*S3`3+1 +oWh87;!nQ!#9Z\h1oP_2]Ap[E,g2WW_HeNB:/T837f:.drW5U\q\^9jI'C(Q#_]ADSV4)l*;bg +-`.,Ph_5Vh>B>>:eu03mK20*T%W0'oV58ga +3GVqa,*Ka\I3oTKGNjAK;4Q3qGKqsP=hg13RtFV@g0U!5'q!g1B2t;kaNtaInPk^*k +5AAnha54Jpbdh*""j!A.K=Wi^g9=hTr3)b/D_X$:'>emP;ri0?kUZ/)lRe&ZP:'@Jf5+hnID +d^7s&'l>0S_3N;)GXM&-D3X[bX[pQcIiF]A3[Ob.IC]A!8(-7(E>GZJ!<>)7$j@n)9h,jGM7b:0?kB$5^j^D]A:N+LGR!qn?eA`93UO#q*[A6,W-1:::GHTM(e<$`t +tJ`Rc(sGeDNY +)$@+9s%05bsY7f.7lnH[`O,3Am.k0/#&-2[D?4Rm_C;M9(kkR&!#F17,m:QT4q+0C/cMW+,rEJ,GL_0",,k7JirA3)G[, +.RKaA#Y[.HQF>YcaC7i`aLj`#M$?kfV0d[bKPKh(BT/H;W_1'hac0#elME^`j^$S[ruBElW/ +:Vb/WCPa4am+e'L@K?btKqnoW\=;[ +)"0-/q;)^(nAq.k;8g*`N*IlN*]ApGjMVijf@pkSNgbR;eHNX>$Fi%4I*_9Z5W:BQ+N5gC:K==7,YaFnCD[L7.%3U`6n8r^FNaC!>/ElS?(/bUUIV+4q +4hp^b.H?tHj"$GO!Q#E'YGa)T,-@7eCaX;Qcf6k^#S>lP6iQnnA`V7"ISM2B"Grbig:@osS: +';F(iQ?EtP2,C/!.RXA!9b+;9o0c/ik@Z:Y!u]AJZ"*d*0M>rU\N!egRTdjNQ\?Y%Fi:Ib,bt +^7.iHRc"-!YS\E8/@,n0mH!5a(+(]A`kV$T1P +C(4HBX_Hs8/H^Q'Bk'T3K/(XuX$5j+gqt+p7MlWWK<[)(\O8>iMSshg;A[H=p6LAiXk2<\6mj8bt4lg+7gAoDZCc7TK>k4(t]A3E-A&`i +Wpn^H<@GAmC*jjh!G!.mBsf;J^dpc<1YTW7kdm-JP)69!@>ig$(1_Y5SbnaYktOjEVg]ALBTB +)]AC6%HT-USqAT.k2kO79]Aut\cM_[?9kLR'g]Ad6Nb"Ft%pHD,JX=h6,+<7T>j6R^a@ZZIP;J_ +@I16^i'r%fUG=7d+I8[/&b>-#5.UE!1<^,U2_G'*HuoW@(NRDeeP>aJsf@ +f23n=-%"!&$j4HroL52SQQ>s:T*ID_\@]AJ:]AWh9M/U6O1[KL70'(gX7S +no;"Gta@NOVZ$%\mFZKKY-?Y5]A:00)ca1P%d?rcpp9D$BKiU?-?:VEn(k/GF6R0NZdoZF$"& +[oP@5RBP63I%5_B5DH#MVF,H0^n?hlEo[aZE98TM_[MMR$=O)GbGY)i6 +cM%m6*3Vdk'@XDk/p_h_n)PO_d1S%,p5l.&D>nhH3+WS\&H^gfJZqQlAn?'t2IQZ\sBBdoU? +k-Xfr3c#Cs$%3N#)%i@D_lAEqin\%'\+?Jl?K)1AcfAt[V6HLY6WVkXQfNhob,ksDk!+S%ijXX^55f.2eJ!+^^/iaP_Yo +=sr0[Zem5K(Ib>25<8P#c;.c8_qDGXNDh:T^P`t)7qAE@7F#$V[Hi,oG\QL=+Mc'G/VUo/"='`O4 +32Fp_paI&?N,n$8A5@1Dp?Ph!:%FA+hrN\ +l7n:7d"J'5Di>DKXb8#T)$1MGIaZLR$4AC^gFemP8!S6/[5GO^\ZM"\rld#nPM\ijGMt>a`G +1T>b$S$DtRJOc_`i=%@bPD1:7uI,.&M%`*1GZF`r_W`IX0f]Acl0-loF#i/6qtgDi._6VG)b! +@^.0=M4^.ZbI,*:k=KYY^m7^poUF+ZN5iXgF+\_$XO>TAlb(GFF;qFkqE9k +@sp@SR=3qYhG\#;kM^I:KU/*'i#IWaDET@snPg!1_Mh +]AAsA?U"P^_,bTEr2Y=)Q,(_$XBU<=qlUamk#'/W[_!P;0&S?7GI,hnb@52BXW_jbX"O`MW1k +>qE5!]A)njH"^$,=eaNb9Ncm2 +f67$T&c$pOX[Jj)2/NlpFf$#8*`47>M#ZlT29GUmc8#)ST0WT!3^XdcNbWUX;EY;Q1(GCJ]A+ +2.knj8K6is`F8[blrbdH'`)`-Oj?kKF+_QlOK>hJfJL5E5UL>Lll/XM]A,1X/uSaW#n53<&03RkktPl#%".Mp +-8P(&/VD?;5KbrZaHQoaSqRjQ[.C\Z +m"rpVPn9N86?=3>$^*0![8)3XdgsfK8cqoVcN;(Oi?W]AEmsb-2AH<_POQD(cmcAO?iS;XZt? +g(jNH[dp!(]AgQFVel:69>Or35?4o;Y,7\FCr2B22bHDdC&V!VpcP!k*hH;QuoILPg<2pKoB- +!E("0#L<("nR4[HM3;A*n)@oIWF\dFg"27R3!XuT'B>=d1G>9GEoJrb6/Am,%&U0)T%LWUQO +L(F%Y@B^[JQNIL7GUd11@;R4Is&R/aO3T(G!?lgol_+#YO2=Z?nt.d.?BA=g1ME?f$s5=RHh +q\NPB(LQ2XqHkJcQ9`*k,:d,`XrQF?/re.:>VV\K0mt*J/@#/f?%i2==i-t=GTQcu9TY&g-B +4;AKS=@2F94U*&SFm3h\k(26imA1moAQPTI-q:i9>jW^q:J_LCe.KAo`u6mlQMM_;HKeJ>S8 +(eR^MCqJat_,BrmG8K,3O8"X('gmBL=b5Io&[NMNiG^K1cd%!T?hVjs>N.J$bD@9DF(n$Xsp +c'e?4ou++<0L#1jU9:Q65gg^X]AQiAKdUg$Ib*Za.;7YM5P.r;!jensc +dAPHYr9oKPG".``RI\T_(V[F$K%&4[/q[:)`63**[a`s@Ub^2V+^C +Z9%G""I0QP$0`5K_7%1W`h?ca9>jb9-e`l3Z9`dl.WX@lUV,]A74H1k?%O\g-K6'+'[sut+Q<:*d]Arr]A>n:-k.",&H4H'H4_>\'W$4kb(OCEp +jn@f>u4>_Y_Y5]ABg3'Rtq/fZj+uq-"SKkkr5Wlg%1OiCtf4DPjELo8kKL^UD:$,X683Oa^(m ++YR$T9/$gGbH-e]ATL61B$hmTu@:ZjKp.N]A3=MegY[GR[+AEJWt$+W1m,p<=@0eM#-EH6h_)l +pgR`NL)Vf$>B6NOB6q`EP?ebVZ$PE<7ori9bWT8;K1$HX.;?s/#\]Ak5NA6+Q)=Q31KWXBVE= +CLE@D8;P;QN0@FBi\mUfoA"UqTAuS]AtI9-X8?"bX@\<6Od+c,n%TANaK#OfA_-J8KOV$63CZ +H+90XME=3^=mZ5SK9dVhFk).Dj,DFn>0@g.N`G>3`$3Q&7HhFrHEAgFPK-[WV(^nnBf17`aD +]A*g,h.+3+U8<7\;Z?qX>0nN^->]AnsQ-KKaeG!kX=3<<1+;iRO,@7kIQ!Am?><4*EIe?7U<#n +bc8k46a0?nLpRT3"J0_X!C0r@jg@g$7G_,_PC.KjK#aU0%Kk.Mk?%/_Y)J@^?G +27?"uOJ'q?P`m3p4]Ajdp-aUAA0MEc#!j_bU\[.;nu,6oPC7BU-$*_PD*GcGEMF'lb9NB-_to +`9D[N1O07bE?=2!'$?$2Tq>o6WQM:i9b:IPLT30a!WJ0ijH%>'#DL`J+flIjY$MXg&q@$eNj +8`gXNg5K+GfK=!rFP#Ur%>#as\U);S? +:j;I/8LXRR*BbV>1IerXuQ="L65Wa)fS/N)h"agL=k8cfBI::ps6(d-G`i123r$45>QH634B +2HR^r1Yt:RF'4RnQ2u'RDt+T_RIRK1pJ\?N"3U&"?@85D?c_K<'nfjIqW`82MJUQqA*[pnhJ +1fhNOPoSp:Gf&,L>jhUu*;=#WG(oC'H30QOWp`[7JmD=/\K[\7Sl@?q$H^-<=C3\SD%&TJJ% +&Kha"4;!pea7r@:f:5RVrdR$dB'42:+9"'B9Gh&`hPUWDQ*D1%^&T*d +@c),\g)n^gd^bLD<>5U[f[>4!leZj +CMl:`CKRrVR'1*O!jObMj.K7-s-br"24D-r%>%J#c6RjO%[CiF4h#Z$_^ZPVN-Z-1d@KgUis +LYk.q0Q=esi3fq04WYj7>k3Oue;PF:-3V:#W\g>8hZB*WhKA^1Yu,r0J4);$RI<&K;rSC8m. +7`uXnNCc[8;9.>46)0#1=#7l/dru<8#f3]A@iXIY1e9-K)9,F40=5'U2fJ>Tu4+7i[X&B/=SD=##?A*dTBi]A>aiNJ^CZVD +48.s8?%1=)C)_+'Qg)Bs<<4r=4Ga?'2+*-rH4j5A1A +!H"pMb&I]A%'o;N>-^$d5;,-P9,1JC=!*f=*6E)S*guOMeb\eRIo46Mi@02!'')J6N5'5%OQ0 +en4gtWKO%CAC`7('M8H8bbDTB0DMbtM4@RMs2'"lUK_S^#'@?3YF\8ZdM('6`>5P_([QR]A7g +osl3,cl,I;SK6fpdg+No36*C4hj$;We:ceaO%;Dh-HE7j(*hJ\"#\nmdpnW&XJKcpMk6f7m2 +:Yi#\:l_SkL+N_3Z:.A8WCm3O+:!7f:S0"(sq=riZ!,sQK]AFNU'n\[J +:8tu[T?aCM#G0f8T0Qp[*q+9N2/$X1;7E/tkY/Km9gG?G%iKTNTKV"H\p$S(n^46HhJo;S'D +0sLNq,LJpe$:[.0V1fJZon%Oc$T;j,_m/tR[$**r]AFs0_EhN.B(2N_lk4Q30`-jG"nP!_&1p +HLMI5guq[S`R3Ic*Q8l^YsgH0p*\DqnJ3`*bi5dk"QOIR3?Ca9j;2g-5PFS%B`_StE3QFQp7"WHS#HdJ +,h2G6#&+%#LnYlKoN&%Z5We.(Rgp&S\-^!r;k1 +,NLK,[&.IFB1gV*(?2nJ.$[r3pp_j1*dS]AH=Wr+Xc9_d+N70VP/[M,b<:6tg(6l:,t4#ep":Xp`i>gt6 +!iN`d,]AVo!g\IrATT0K&5p>dm4@m3-jFNlcP,5$3IhL(T#H6g(sq<0Oc0Z%;.kc_Di(e4]Ah^ +dWIN9rP.l`X@,H&>EY.41(HgDH_,MkZ]A[IM7d@'#A=W%GZSKZ_,OXn9LVo6o39-@>^V +A^uI,<1q]Aq4D45ArW/V(.,lcC_gnG1LSM:Y+`9I>E6$@fZS_-(QiDY'OBln+QM; +Ks&?+i^eLf;A,S+kJtDZPQb7OP5X*p*ep,3YWhj'6d7[eE+`a9qCgmj#e`btW>O%?gUSpZB& +*A6H!_G!ZB,0,+`+#FX_u*jbclQ$A%"W@f*;j1Lpd5`/P,Q+Ihg/n/j_Sn,iEW#[a&fng+qO +3GBYAbp_m%Jg(i!r;!LNT$e0Xpnf*Sm58RDP*D. +FFpf#ofW!FeiGU>b&4HV<+ROX%O,o,p[=Bn6ZRa$ruB^?mT=$iX6P$ic`P$-BHY0gpfJIg#c +E%%"T]A":4ZHRR@[K+,$;%*?T5j"3s[,#_LYs4YmiQJH=lPnEkTW=q$\Vo46-je7$+q=.5U>r +,N.Q108@dpJjHp#]A^P2BXPep@-Kpur+#LhkStDU9M8Un/JF_q]A-RbUM4m\h)dL928l= +P,_Y_^DRrmX7o2QIp$0hW2pJYQYo]A#(.EdFD2a0_ +oA**\VWE64s/C-qXeo2EE8c_^RO7l]A+)IoktsEN0^'+?Gl3steK`2MrKnUsq]Aa1C%%_mbimQH0SJ+k')kif;C2_!JZ;U; +<'-DLa[EjIAk.>?HN\b'D, +EF/O'3o,PL+ZN2[gF59"0lT%62KC)]A(+_fDn=I8'M2.gYsk[XH<;%2.md>t46*+2:l8VdOsm +qg:HXmi-K.ZlSU`LJt$,W4DWkYs5fUXEaiBW5g&7p57L%_lrh6P$)kQnPcI$K8p0b\2_SipB +hYihR^!-n!@nT@.8`*noZ(.fjZB]A`uUBhYUi?NJ-t?kbF$CnDOHZ`9-X9\&%:=(jqH0GimQ[ +Ir-[*g8F6.@5XN&8o"F>75?m6*K<`SI3D>!50#G(fdUQlH="8E&qlRNAqsS(u_%0hRS="U,% +5n:#E97rkN:csGm,V.NFJC;Mpa+^_hNkD__+rTb^$s\bs-JU<(+J83dH;MGLp/c7Y3Ii+Kl@ +Z$T#ZG.q(E+.^'iPLXY-.3iJGf!H")bOqMWB=Xd0,_i>:aKIofZ?;#o;)CJj66#k"5G(IBDK +-SaL;MA19@1.H5+9L=oc;$!3W68ln>mg-E%0 +LEF.rit%)E7/X]AngIM8pJVbIou=_7YB4fkP;)U-L2`/q#+_SUiIV?8o[P,:@Moi'"_A/1bEJ +YZb5r(Z2MTK.m")TZRMtZHJ>oWlPc\[O$bXg^BP';S[W=tq11We]AML)gn^r;aBb@28j[2IgguR +bB`qc_V@68+b[_)d3^JFrrKDtBk7f)4J9'#cX@\pcfAtX-]AET"uKO_J.a7hU;pGq?mS@%)s3 +&$)kWBGBjP-1'T%qK&2\ClC=upkfL`cU$0!GY\h==YJ!l7,\j9RcB!K%T"IOZet-X)S(qD#g +FiHk<(a\HM'aBk-`o%(EQdAR/nK#O>\#Y]A>a0D#W>`:Rln2!0_'$mnF-aFJrnY3"o5Ga+'-OL,i;@n,pAh +_(G+F="R-_4r\^Zct8>E'\Qg5$X:8Y)[5Ip;EIMX"P(n/4S?9@a1bRKeL]AoPD8fgP]AM9M#9[ +hb`(:5A)LJ.]AdhAOs"H&Dtq`K/lraQPC=,!3LaDZro<9Z\lBR1mAbL$D?*sn:928 +Z*\H_-!\[5T#Fi$S0E<:EFj8SCHX@O'4nSlh9NF$nSd%l^N6N\'kOo_k79X[jnUJ0Mq6nuehkioQ#$W`&,DS#T-!hj5-'QSGKce7ej3@=U3+hWi!jnY_\>H>h +H[adl`Yl7Y/^Q.C/a@"rp<-,;BH8nKRQH00lst/sWaD5UMdP!n\pEdBgOh86kJO+&K'&20`O +GOs)-",;P,AlDiB9&]A.%oD1+bF>oLKu]A[emi[Pk;HWsW$)3ddA5d)`^WcHe6:(VK+S85$jW_ +Shh$IP<4Ak_efn9&t,[$i36X^sjo3i%U@.fGMP2LKeCtL2d#agUe]AtH/d`2X(/n?^AE'92tT +3rV*UFe!(,\G_tcV5[4MX/[=kkEcuJC*.15MiUu+^/Z4uf;U:cab=W%52S#*)7q)kdi1#?@^ +^IP9A-g5bt@jLl$D"#IT+kF$M0@^]Ah*58er6q5o3j^AM7hrnltmi'>g0g:#6"`.o!KK(([l' +1+Ydo%l0=k.>Ya6:3pT5R;?!.Yo$>+3Sc^TXF<4c?%'?#)X\Rn2,cP,;PNDu\D#Z+YC2MD3f +_cA`FObrN)qk/M^o9+[aipY.n#`0%U@\&V$?JfJL%=c-oR@XU9djs#t^COK*@*V40H:HQgR- +R+Tn1_X8DeT;^j#W&Q:)Ek*Fo;kC@c$*IEY11>"8X$ +FpHK8'p:=KD^hI$Pm@b5E@/%A@cRtAR":5j/sjb6hYQ]Ag_B]A;m/F]AKmKu=5C)9^;O8'TX:e7 +VbM5Qcop"c>m74=Pd#%/6OE47b,MFR4XLU[s+[r2]A1g[LlA83(<8RTA3Sm7t8`CDn3K[%#lDHUI'lXMjpJtot9QEU_38CHJ.MY_uu.hJR.HN't(I0?'s2qou; +gdoYcXE7#l\-j^1$gP/bAoA'4"q?FT*V)Oe>&+MVE]A$4W3H)O"c*!$Hu$"^G6g4o+Z]Alk)%( +U@"OAo\CC!@lLWrOiX<@o6ihPLb"Ipq1cas!s<[T\$)\7K5)42-5&i;-0M]Aq4qgVjdV]A8)<4:KLg:J`,8`' +pTk#9Z$_[Stil-FPegGG4>gD0KJ-SNpjN4jrn]A;:'7`In?\>NPpaLi9Lqn:ht-BI"?N.$ +]Ad)59a>7HV:0OT\*qr_=`r9K&>%E_Sa$SpM,%GQG/A4M8=0<22o +f_.`VO*XS`5?%q)55ASW4h%"@5\M&l/WBQIMS8tK.V(WNK%1P*GVDWXr>0(>FJml_.Qd3T>1]A=n[GCb0)V?(C/i0QF[N$"jLsFTG,c#G53'`?'+ZSL4lc_&D/iq:mPgk +e4escjDmR<70]AsBsZ73R9n>rfQG1m(j.3I4P'h?:3kf'BW?eC\EGVF!$OTishTpqJ5R!1`m< +)d)N%f:!9AV'@b8A3H'CJ?L]AV=VW/,Qti!/&V#PnNc5V9sX&lpsG1(]AgrEjCG4-Q +`i6[qquOtglT#LK7d_99'VWZnf=Fa5!dT +8uSd]AqU]A!%SsWA%YVa!&gffL30N_7(^ZW@o`i.K5LT^9`h"E,pH0V@l:`>+o>Pe?`DZ*19"b>p%rt^%a1Zdak0>38W$ +oDmu'\'Md,X;4WQ5_KnrI$8,EP*2k\*=(-fS_S%5.O6PR+]A>0cbKt`Y:=K4"e-C*Z0T+5O\4 +K\6XCF]A.+p-h;JFR%JCo&S2E9"b1C$DTgPbIYmIR!"O&Q>(pA&j8Xs#2H=h@%P1ud>-6+`XB +7.=u<&0V>X;,4-5M@f2SKHpGQm%d3#mUae2O_Iq'r5+hFe"3Va_J^E4nBoh]A;e5&Q1a`_>g5 ++7iGS/"\W'BTg!_6)n4XhH<-_liK'jt$(.o'E`2%g_H6ChIVO&O6H/Brlj9IuYcl5lEs$?.N(3?sfl[)r0q?kPoEK&")pb#baIdRGr]Ar%MP!PT8I/3.P\u8:/>o5M +e[d_Goj@2]A6'hl8?5=cHCIN!0"U:Er7pU2$+$-^KnhiJFY<%?Qij5A:7,#pnc4eWQ<-uTD=9._)gohEdFDqIBAC"?Ne^a5Eig+S4)H>Y +9V9>sb$VJ)=g2;i)R=F]AlZ=XuadULSdU +,odiEVB>Z\HZE@dh$N2,iX0Rcc*]AbtPA!(f\udnu;MZ+E$)]AqU,<)-.r]A&!) +cUp*g!(2>2NN5Tps#hW+tBl2LC7\uMT2[2PfZQmJulnUs&u`6Bf-fIcRJ31Rq37G(t%>jNnC +4jCTR3"I)*3'+E0k-f![:D+I_H@##3\Zog+u6"ABH8i>e3VpB^75Rlu[$(oU +h,BL>p#7:%U\A\BNVY9VC=;!1\C271ho[;\Gd6.="#Y!)!i#/fX9'ERB>D+E&f,4Vl0;Bb>- +:Qr^1^$.gT-Bria/D$J,K3_JPri1(74fEZhPC\=7 +KgDL*N[eE*+4D`"Npi?hZ*?3;:i:b0Wb`gh*m%$bcqk4R/)#`gGG56>G-@n[FZ@G.5n]ALjD! +mcJuI1Xc??M!8)^3mBsJs@Dlr7rF96an1.3\)G[X+eg!80fc903fm(b!h'CE?kWmn[DB)9V# +!F^S\Yd/!a/U<\r(3KL.J[f$hqC`%4CO(Ae_^'_.Lp]Ad!=VH57;-*L?dO`(SE_P&_d6S6;Hd +Z*5C7_uDcP%+,YC@A=Y0lh[I7MAeW`V0iEVM?jUjgdW6dah2:rB'nO\4R%fhJm=qtA!PYBYm +G*"H&!jj2QS4VcX3Eqd"NRL1s`^HBR0foNi^jhgnj71m%R=8Y9C[""^Z2BU,rd/C%HIQBu8a ++rhS!tn2L^2kF&OQ@7%BN\?dLHBFAb4j$AoM9TCo?'@GCL^%@"u'p3[8h%>>#(`gYNB9\Opu +Q2qU%CPSEWg#Z-4qZH)^nr;t<+%0C/37M1dqM6cD6(]A4oF*[1X&E[D6%T?0QeSdsLld?)H(< +!qOQ"k;^cD@K:T6c5s[YK,LX`12(F#D44"b5>8KtET[CRcE7;Z^+%9m8ulCo2^bE;F6`CL&& +GVrM@7?&=)L7Skak2#1m2K-`k`K]Ao!u3L$q!+rP#pe;u00bu1\uTXgAa]Aj,imHF6F1[5;0GeM82 +.F@9@&c^_/"%.#dFQ`#DsrpJYR3V"khLV8,1\;XZ5_pd@'_IA0NiJ'M/,eY'N"CC>7R`KPkYeq^^DQ6`2=4r='Rj(LjeWfPfY;\ul9+Q*Hi01`Co_L!T2*MNQpQn.a=$-Dq*49LR5u0?\q +#VkD.aiI[-N:T:;q+\##H=\[7>kV*6&4XkW7!@VhpnRpgn\f"Jt*=*=DD#:!GV"$"UQp/pc8 +d_\>-[O+;-3^G@0iCd_$10).,b!l0k:Za9?CJBt[5:Jlm%RI:L\K$oin?@IUq6XX8M4qWrgg +hjh4`L>VN)`+dRe`8GM5u]A(0c5/8d0D[e3-Fb*#B2AX]Age4Q1>#.XK#(&`km*R5#^W%!,%C5 +N$YP[b;`VdrMRLVRH4X=E$mSL`b88 +iMBgc?'!2'f4;GM<*%(DT6p=o96nZC`S9?@B3/?U^&C%+r3b0Hf%?=VU,&VqrJ1`6H*2iVg$ +N[P/nH*t0c")u^lg7f#uH5'@Rdsu6tG<'AtQ6tIR)!H>2P)Y"Lt%DkeKl]AkVRPU4RS-$\Dk-en@CW)\[cI5O"\NZ3>#9Q<%1LO62^N,jO\H&qCiE3WcSW-3N`:IMQ +k=9^+#BHFYpOJ>/%E[g@h.,H,O-)Z"B^nnji1:Zpg$8fur%,of>LspaG/@ +)2O)k$:Zg9F>FFnOe)\K#a8D/F"c4)A5E*5S&DsR-lhAr5an)EB7:'PEW,YCL47;1K0^?`;B +1Z&f1RTHGM=h@IUob;_ko=-^.-5Cm>`8X*XSH=V_cpS=r`5s9q*>Mcs3h9"/!$NY#P5O&*70 +c4Z%P9WlN6Aan8canNWi0)>=0T%CorM"$pgr&'DNJ)r!JOnY'3]A+&FEA/+dVo':07N9W[X[c +J>lD%_d:cIn56*L7hHOZ'S"iJOH*E!YF.;__[9nt#69TeHn`)n\ntRO(tuM**-k +;5D>IMfp,Mm-DS1Ql8Q[lQ6rG%@A^.%KKla1]AI!i6c"O;eKmbsI/]A6k<92h;hqIJ_*ek6I-0 +fsJKcjCom=MI$*r7BHm'iNGpN%kfHAN&B10Zpm&E\'NUTrmbD08#r98mN%)7jtpMO$t+E:lh,-UMX8Yi.7L-8$2POo.Kek +q(lLVn"@&`fch)uokCGa%3o\=!'n_TT3EMldJ3mU\IfF?Z^F/[?m1Z^)@-7B(XZ_0(Y+0)qA +aRFea;o8*k)&mrd%g@G0=7dQ#US_Gna;A2-5jK>3r]A`1m#*=A?KpJ1,#BbE?p63%J'9\0^H* +,`F?q9BmuA@3&.f:]AQcLJ[t@QacP/9n3hq-`\pn=^q*ZFW4kTrgFSD@_!kZoZ2>?BGpt,KuE +IVI.\(]A-.@<+Rj=10#/;XA;,a@cqo/+i]A[f0qZTYX/H%0$QVM(^HFBXi%6/"QD0PLXhuMoOk +.6YnZ*-eDo0LLDZO`oj=HA%C[n+:[*ln&mt&0JI!3u2Y-IJLImDgd?P#hl\-;m5ckq&^B9(+ +T*6V7;VQI9c7BD*H-s;2bcVAhb[(8/DOD97Q7P1\h6;U6,?gC6_B.68b=!"sd"l&9hT8uXkb +2X=)KN9Xd]AGbt[PCG +?8^A:5>TSC3]AVHR!!Xa@U]AE'8onY'Z[P_F+n.,(UHa;=g"t!lGCnBZY,WhZCanDUea]AD7q%DVm^66$O55>.6u8FO[`]Ah]A( +7+<@pfgluV=q8]A`,j>SRuJ9C^YMj'Kr3'AE,P=^lC5)n2(oTHgqr\XO_amR.u\BM#LM4jTZ" +2s3qgQQbH1%H9:[1pjT0N/QKQ2DTl#"#i&KQEt*CKctoaeJJC/0ma3h?d7>gAc6Tgks!KCuR +`^q%>f"Ya7-:'5P9B^P!iJ$Z?cXkD8q9A%M(jUNm=rqE[U%-da/[7.U'GR?^'I3BiPA_/hce +pM1mi8#Z;q`0Ve1PsDK&Zd3$-d'N:Yc@[X\rIZ.33WncQ#.=p,p3oP%W2R8$5U>E,"u*alEUK)GA5mn!l"b[=k'1)q76`>Ku +/dJsBKOcbd/@okFT7;3s3I<5PB4P99O(cA07n5p/h'!t.J^';RKh`tmX7]A%hh?CP%jSEFc:C +NZI,Ms5(4/.^A.o4B6+n;4i%.r'hB&b.DB#8W$21UK7Tc"f4n(i/UaAkK2^]A_1tQKCmejT?O +CFfc#=8qnCsR58Sb47h_80!*:Zd5FKFIV;CEGjBt7MAElVTaW[AOh$D'gP[YO225U4(JV9\G +puO$Dk1:tqB=NDUHnKB156n9h@@kpQ#46S\Z^3A15;%2MM@P,l0J`U&f8u'_&_r;c6<[Z>]AO +9C%/*T+6['@SmiINsBp"9kr +PF[?7%ith?67TXHXGBXE)5*B!'=m?ofGdOsTMSd3>UBhK1_$S?JbCokY10"lh;GG8C`s]A8AH +E:fC5rB;GX/`URg4jobJnsoI[3o(\nU^e*U]AI5<4cVb(!aX3+I%ZK$T5k"WC)EDru./.J_(3#$\WK-%^6NUlP1YK#J=f +;0IRln/ig8/5'g^sfEf/`KphBNO/rlIRB_dB.ahf"0CLN=,-(M[;;K@uR4t;.L'MjV?_,5q5eQc*FXZTiLoQ[mBd:TU@%'G[r9+'/'T#URa>djG(oaOP_A'G.h^ +6">jF;i-RJ7&=q]A?hcBC#MUU6fq^qH4Ijj95rEOf"PsI9PrH/@=ZM_!B=-8fsaJmln*R_#a- +ft_R[@3T.5We_s%K<:Perj=,9OqiPm19egXFU:Yr!=g" +N6=5E`W6Z+o@-@%k(KY1PojmDoOCgo:_'[K"OihGOVI,;k8)^=(g9Cqn^?R;+!hL9Ys(1CmK +h5M-Z*rJ\&cA<(GBW3F/P[1#9Kb&D.Y,:Ag0hLEg]A%>:hLao:l` +Y1HV\*4LjdrWqtLGe;7f'rU\+s%M>*-/eD:c6Sdr(TFa@Hg57s"!OPVUTfqBEUnN-mciZ:[l +&*E9V-L)Y"qj&naDo1n!h^lIh:q^bFV-T?uH`0%(`Ia4X"u/8@B(Jn2VsA\-W+]AYeWIH6($3 +u'(a+1,W$&Cl/8m@H'WtB=42:P4WW#\-f)Yp.LkHEqAOaa>/h%%r`P+\On[:#&Ak-haT@:K+ +jW'!!4.8>]AY(LSjTa,i%-e8R5Hd!+8\RW5`eq$)@i8U'"EkricG,pub([GI59rD(FUgsV*pL +5tbL"/K@jEom((Ym?9VUL>k[,,nUHKdug`B#\9s?1M%aQ5C,N5u/#Z$Hn.Y07/[B5pAqusRF +k773iZdhXK`O3;KOKNNEl#'0RH1jEm?]A+6SSXMd)']A?h$p:s&Mp=A4dZaq%%MK:NToq-4G!E +\j1EMB'T`U&]A,bqnVkW81;IV"#ek6,$L4G(X$JRDCqAT]AH$Z]A>]Au6'!gU8@InRW*WqU[ksf@ +c6n%6\VE.P-\C5"kgY&iKLdi#!P3h="*(YJ6DZ/T<1Mr8f6WO@X2<%%NSXF3]AE)[(WFU\sW5 +HRuR4X=iT1h*9X;jAnX4E4X)Wiq%[<`8I9Xa*8c&R#Nf(NU[jZhDRD;eLUdZ"u!f*cIX]An79 +Z0($N`Ea/2VSTF6c.kG<1Xdrd>% +cN[K'ZIU'G(i+BC+01(GGj!8S[c$uf$7js[,!J%0LY42Q"WaNRu`3L6QeI+Slfdtrll?.@k4 +s[l_6H>7l>KOn(&Ari7O`\?GEMI*9"Z1&I5aO>TW-;E-JkOh`!.3NG#nJBW-OT?Y:Z)"b9TS\%,FCR4(#K>2GW=p;&Da^I5:B'O.ag +q('!FFca?(DO5q^_WC%'V>5AMkUt4Q#0cHUU*:)VPV$mS%j!f(mR>GEVa!B0Ip2'+mb%$^h9 +5_%f-hg!foTn<@t5mo!u_$/ks1QV +@5:j=3S]AA2)J*o\`U\bQq'hIOZXs@>D,N1N-F6hH-"+"0 +'J6WjVY-QSm,7D1>lk=Y!CY"CYD$?a7\@d`rqjpAUIX%*%]AqGjf@@B\(aMQ/HjeX7$d>.ePS +]A0bfpX,J+SIMa?m2`7#CZ-hARhdp9 +S[QRYk-;br>CP\K@ALg&Z'8M,sjZ6Dgfk[WssO&X?[!gX*)r'*1o3QfGpE2N!>7' +7JIheSB-eQYNS]AeBi(&Ie,$B=4u'qF$:AN#EW&EfqPr!L'ZZbB\PS4IGKoPW +)"V95c:,P6fD*ptLYo76BadE5`ihJC#M2.#RX3(12ICu]Ar@t6<3C5\c#IAm;mk%2J6J>f4CZ +mp7*O=14Qm'N^NTP"B8D/@]A%'Xf>4N0*_[JgqO%kKf2X@>WRk*j*Ajm`ZiX`qU"n=K0Jq[87 +`ZL=WK4E-AK3`_)]AM;[ck!A?:SEgXE$>Z/nAN!o)=2IJZ0$N'F>tW`K +*cV+5hHYCc[->b&')*L:)#gRike)6C*Yo5k*4lW]A>5`B'OFdfD2cOGBt8_'f"cmr]ALM#JO_^ +'T/4lEj'qo9g#RXa1!'GqJFt*W-G56;te,:!dH]AGDCTO(a6=r;Es_30(>!Vs<_q[l%ACLO12 +2jsC"AFh?adJ9W: +b[)7Cs[=#06hL[)K.cn)bfAtSQ?%(`C_'J9.%\nV-'!+AA!Qb6n@;Xi]A9nTtXMo/C"W5)c=/)acY-T[OSq +X53>N3@GCpMiag6S$$XLS2qt%KdO_W_k*BZK4`WQ)/NqapXD/i,9kW^:X&Rc&b"k@uI1Z-nP +o%7$-L;_kNLPPba +^g2TMfc+l/q>+c:Z=6A%90tViG+Pa^1ht_;2;^\c9_\M@&\0cTi0:u=RCudiuF-*U^IfU +(;+$:V8[84LPDt/]A/?WX_BsSqZrOiIF/)G"0pE+%f-8&ZfU8;X\Nb,j\,^<]A-1g8J>fVc'=j';=I=FO' +H#-VC)@=8@3Rh5^o/KYmF?=ES>oc;^DLc@-WQT.IP=UCm'WH]AFQp;bUhGL$r)9iq:YPa's0; +YI[aEm[m6;P&qRep`^=YtNmPdeoUSYB'\4g)1T00D>f9h?I1*EK&AiQaIZ)#H`'n'ZET^aGZ +N"/#@7,J?4*jMT7U;6E9[E1QAudo/m[$4 +QY_5KLDV!\+o_DC-C:_47*A;Of,bV1DAtfsTsfSYsb>.-ZOo1?,;g6pe:F4m)U;fK^&up!go +RPJD(,dOF3'kOs3]A.Vu,fQ236&@?(f/7E"J+i+J8E9SD#HI(`05MY#3R`3.ll8XL4`>Ype9BBiB1$*7'8RtG64 +;^Z9\@_b'j=bFX%/#LJ>QtQA,r?bA@e]A$N_E,!sP#sRT'\Q:Wsj7 +TI7<,Y81EAR8jL>r-#5;EiK/?'G`\gr:Baea9Ro);IAi=4ZgSZqT7Ie`f"o[l"#XZWMaYmsG +'!u[Wr*VosYl;6p6#`MSKB..I^(qr,G'0'(feY(9/lBG@1^t^+ZbHOKLMM5MJD.ok.;?>?K9 +fhhiX_RXC=Jt\DLWu/;7Osu$,DgO.F#A=2d,Q_ci+r/'[Qj840)A37T+M0eNmfe(FuL8m'#u +C"XQ5(L`oH?J:ADg(#),R/k4&38rbaCL`X4,fE0`B +[/"4X1q37dB*8`-(2B>]A'8Sr=K\,$/"M((GaLu1HJd[&(PrL_AQ5HiCU6jV**(n2VJ,H\%c^ +mb-)bTQ0IVkBMpu-KK#Wo)@jjP\jYQL@XRb8_fA4]AIYA'Va/6Y1nVI'9HofeA8+?^sh7%g(b +kL[dRT+]A]AU4uPdj$^@1tZ-S:BiU)Dh;igZ?M@CZ^%Rb^bH`qnIc_*cT+ZGU#jo[M7 +b<9>*ga;lHCSmKR*Mr?nLmj"%)[(0$V1d`V4]A7^D'GXm=WC0t4i1/Ej9 +NER.oUNjOpU&?[DFK1&]A1EmjL=9D6s%D83Ii;h(N=LF#O5jZ\RPf6QtLo-F,*1e.=h\W>DAN +7^)@@%f4W.2^R!.dNarRU;nGbD-fCQW_WF0Tp<`Rr12SriV_6=?jQ5SBsq1QnKQ1rhmOi`qQ +5OBj5qRRq69[@I;br%3=lID"!hO=+YY31&Nlj7sLeGgq/mJ"4*8)`"'uC2c0-%]A^NJr&pYm!UYFJri''o9Gqb+QY?PT2No_UiL/8 +E91q<#P&\O80X*YXbE62TtJ^KC!#$7R7jrWBL(YkQnb&"dXkVIbZSs%/XMXn)FtRc^TI*_') +e"*CQ>b@s(pQ%"rup0l3[W3$!1[Soef=@SA%cEr/L6ZfU6A6YJp9qn<)1q`jr\^KlX#N]A5bf +sb&S5Jgd3)#EnLdOXZJcnBgNakO-ZCC9Pmbj;;:hVXi]AS4P^u(U\aq&khe`]AF7?tqKMmr'm` +Gm"qs-&L54c(5>aK^3A7Jj5I\*Z]A19oI.SL:&jP#ThZ[_t+/:g<=bYrB`gZsP3-QFKe2^\,F +BQ^\dJF3T":XD;B-W14@cC+@3&o?/.FhUZLJ(<5lEk97#RR*NFh)[qohf7u +Z'<8)e_Am">;FfPBJ_p:pp*'!!g-"(:/=ng>`cUifp[(9pAtioRkJ/3pO2#&gL>ll(otMdPCnp6gDLW#D,/%JqC9D@;@sTb>Q=ZbWoZl4qcj0o*TgHWhBF:5` +r=pL@4j'98<"Q5YS04L7DL'BK?/DbU_k+A_\3*W=Z4p?7s0Je^fk.&Xo\"qF!25>>T#s4pKk.lTU1jG\O[2ATe>bdfVSGe8%O7Ej"dj +a*W=HPG?]A2QkX9J3Ld8AkbOFjUjg;g=irS(1:VDW7F +:?HsF)r>,]A?lgVH4N8L&\VgX!drCE>!&*+%Lk"NF!5*S%46B4h.tS@^(K4)/Q9(t#enEg(9; +TtpRcmia7,XT\Dh&!R-GuP6+HqoO"EGprFQaU,I2YYmGTkclFN!0VX%(5rN,p2N,#`YHtTi. +rN[Js=tZlg.c;Zfb^Up3cE*4;hcR5UQV!g2?`(u(,VJ;&'UFi5WDr;"JtPA"iKDGMXDg=o.Y +1mJk<%#eXe*l\S_muF*OgpV`oP+o-5Td2QpA]AWPnIP%oIVT"_.+XcYK3YKTIUgcG.0uUf07) +4#^0TKhl77Cp[htWbmX<[1gQtj#[X%i:lqDq$t2XV`_C*Vjh"![TDab0.t4[2lf4PcO>$&md.k'U& +%R=($o^.S6pD9q\d:(gX,SSjtVG0KK>\7oF5Pc%leZlh%,l5BO`_OfVuJ)R=p$F\OsOkR7q2Xd,X%>fW'kTfAkm/,pp2"+bI%i7M^eI +8gc]A7JUJX2`W$;0[<%D>*p):CfhFOj*__Wa`Cqi^BW_&a4U"5XP'>qf@ZGKaQK=`"/5CD9BZ +cn?kXu7R"[3hia^lT[[SKpl +E)4P\`UjP/gHhPMbSDE1'.QQXT,/V!I\+1pPS5oca*fTH/dhR*m6Kh0o8u<+H2[YO +qUrEe29RRBNZmXB)$keR]A(fp4D\"[3*E]A7hi"<-;^g"i8;]AY,Z"4G)Peg*ihJ4T.4s"$W;Fe +(ZjO>ZS0P$8E,GeWNb:d6"nqIS;sd#9,PAbB\'W_A&:_Ur>kX3AiWO\@Eie]ANa)$ptq&O2^, +3kW^->cM3&IYj-d0Ki+7r?c:BL:olu%-R89e[YpK<4U`n6ZKnt2/*8I-VXHuY64eahbUdb?g +-DmAm=]A2^1g*n5cMJiD2Be=#^"2`IJ"i@jh@^V:i\j$A>U!H2C$l^QQN:9`O(^''J;!B`bJX5 +4`&o68p(qf'E$h_7lh5P`[BS-5LqR.G`g0o0O@#*'!bN-BCT\A.Ek*/?q-ZbaIaa.<#\-%*7 +91q>f/9tu%0A'iV@B*j(MXCGVIJH,3+=fcerPAudj$MsUthf6U=@LT^:q>$$V)nQRHa)Ns&' +I=&<[#Ps6#TPit2=>\Orm%5qYD%dW=1)a]AE=hY>%@>Kd-\jn*"dFoV@=VFcW')(OU:'W$lHF +N=(09U",bVnReW3%#abN54.bRD0D9@/4b!Fae-PD?Sh]A-qG#id7u`%Zn]A,U,0me65f#ROG+O +Qh*:@RkGF[SRb.]AV="BNJLlN"Kd4*q\3@X:,fY1M(h"(m\9^9mJ^43(qpg?HDY8?s)7]ALs.n +,"eUt=9LPBd0/ZPjZk9=h#FULs,3rijJLR>Z+#"/7$S1@6C)u<@;]AD,>,]AhdbrXaOd$&3+I8 +Ttd6EPPj>a3(j^5_;Hh83)9'>K&,(UUs47:G\n-<^I:H'ef.C(8rLl'-*L^jZnAl'=Q/++c1%-0rDt-[Z:_SG1 +fkPL-@Ue?.i+*if_P:]AQ9kQe7JE,bd`;VMk:O#ehV8e3B+jH=dlT!n9bh*= +;M+rulm]AqU?d*[nt^hn&"eC0,UeGrAn>XBeR-XY$]Af+J"6W)gPD7fgiBm(W?M;5pC]Aq"HojN +@_!4A$.oD[GS'.>@"Op1)dU9n)3S^e=aUEnsUKlE%tp>:T;k.G;[\WZs\4[\tN_.r5RY&?X9 +`t#Q@-P-pumhp6DMQ0[Q"`HW/+`XO]A(5LZdq%Gl#]AN31KC(HP%E)&:u;BObd><>9X[m/J>a@ +Mq*/Y/OH25Lu'A.W2m&WHge&m=^;0BdJl?)^$gF(:G[(<>]A\25STAD_Hj6r;m;/27X*K"t.d +&O,^@F!4IV:k=XX?nT=n'c#*mQ;[oqMH32fEg9f(jge_\o!uP)5/;1[+)->q-o^GNa$o'CTG +)r$8QA?-#BJgnsR"C_Pu7eaL^")Fa1]A*P.+64,g"HXpit/Ng*71&?&rt:,iPO^R,cMqDDuk_J:10kmDl]Ak8/>lScQH$.UDUQ\s.7_%R=ASq- +TsT?tK;3:%#D?G(./,Tk2\\ec-MsU4,_2)Wu?Us+m0/2DEVjqJD:\^=Vs]Ao#!,3&gP([2"U" +&",(RYSd9lkmmriDVWQG(SmX@f*@lPo\:X8b*rf46&eRZX83fQ +0j&)7t@f0=pKFnBeh6"FHR4W0o_`HjqJiG,O.)$TAa/Z1rXp_rQ@4FHS=/7F]A[2j.+YDe)MM +gF>]AhK.;6fLU*X^V"ZH^]A\SlD03V7"3(c7lk@]A-K;'nsnL7BS?pVBXA91k2"A&V>m7jPQ$2d +'tU-ZEg1"Z:P"4P@qY*t@il9;f@$rm,T<>^a5X(tPNIkGA$0F-3UMF\SghGh5`;Nua# +gOqH=BsA"+'6f6GH,- +V/q.nAbH!;M_qa?5Q?VXcV-l1k2DY,IrpQ:^uNL"p!c7o`)cKrn^.QS#CWKFIe"S-+eSR%\C +Y@pZ.RXBu;OWY_LVk8Wh0!"nD(ojm?1q:n%bfeLU>d<#ol2+1n>Q0FG5&)hmTV0f`1plW1KM +jCG48q9WgUV[2U#_tT5`5#LS83EU/HP<(eZ<3>B13dF4W^li\N9dR)\Xb;B$I9mdsp)T^L_( +Yn?9`P"iSG?tNA2$_b;Ps>R^"n?rIB/Sc!Xq"26:hY&@\)M?AO"EI[V7!4=Z_uI!i<'FUMge +Ifh[JdmPa@HSMk!L2Qm'*RVX$+Vi5rb^"9l=9,b?^3)cjWqH86Y$"RuLMunfVi3h:/rmCN?l +7`Sjkd?N#PVsNVc;fI36MpJmSgT-MR/9@$29\2u6]Aa#orr*@AdQ3Wh:Vs`e%?G8tEOo/>LLn +'!mQ:-4ese7oa&m=C5$g+/(:hJ3DBDn.GDD8@+*$b:'YqFFN(;iB=qGX8?TiGJqH3:pqiWhN +X.oRrI;=%I,n?UU=Z)#4L[RC!hZnGkWU=gZLJ%[IX>-3u@eYN*"mOo,^rZBoY4lSXpm>IsnD +nN0,DJG4c'MGoZ(>Z;5N8ij'%(!+$sC64A&c;j4mf5QC7_tLB;S_UllV77W\PZ)Oi-e(M=_R +mH'Up_*>.jN'Eb.oR1&,c.-1&?R_i.V-G.?[jRY2[pFrrNRW'jtoZ$irNqqQ?"Zhbh=p<2!a +!a=$@aK<;F2&d-)XFbB<]Ao\Y`ps-=)jH1WCc9oHZ=K:%c'56OM)2G"'*VC+J;Aror%69(K,m*]Ad(bh%$U.D'"?ZZ84c2q)d +VPXTrmZMT/K#E]A*c5WN,4F,SMVc83=EV!omoR=HZc5Sa2#Tn[Ci)Tr.us1h;k2iAb(#H.Jh6/&m`[K$q*)eqY5JC7&P% +<..)%[oa\ZuXFH3qqTSF)66i0LTQ:0fQ<"JJd0ld=?Net;p8bQ*u#C//s/"# +rEImJBNID8G+U,kcTCLg['?S/Q-$0'OF>YV4#Tk4?0hiuC&/U\&h&,@e$KJg>,IBK7W]A)$55 +*\^3L/MHh7iHC$ +/$OWbt-^`3!8\=pV(eb#^>c+q'0HTLQ$G5%J@WVrY>`SCYAtFo%:/r"ef#2cS8M@>8ZNgVna +Fd/K4natkUmuaD#tN\Vd^T8WBcWkY)-O;kF"Bagb"NtP_Q/c+=?]Ac+`_k^r2b,cq$fIYU_Ba +h`YgYdCYkh?^[(Tf&IYLn/,q]A!bAE#Ec#Di2YW7E&29#kCGBatg]AqAa:;,!Vlu_RN3#W+Yb9 +j0C(&^aQi^eK4]A6BtsO5HY-6e9tuR$nZNsdmWZe)JrbAc"P?JpFRAP^)9OA2d.WhYJ;CE3G[ +FHjD[Tk>=ToQ,&(d"FEA9'6R!H0?iV+#'hnUMEmD)O2l]AP(1h69hq.(t\p)4c$lL-TS@b66R +deh$:.+`8J6b7j?@``>fLV(l%!_G-Se/IPJ#`7]Aoh,!\&B60Q<5i#IO7m37$2IPDoN1tpu3B;j-+?u +XE8/O_8QJ^57YbGX1Sn14f\u=7X>;WR?qtg1B9nJFQ+[)LX.I8$huk_8FA`tU\<8V?+EeASne^7Go'TaqpInAbb7&rUB*g=(<8c#qQbMc='gsnO_U& +/i$+SqC]A-bPn]Aq]A]AMi?'MqM^c(5a)Oh^f@!.;I-eAkT&\`\2@UYDY?3fF8Nhg3oFA"lAIarh +R^5-@?eC1BT&]A\%6ZPi[O;j)i-,@j.^1ZUc_$4`3;6cj;Tm=W'n"[gQ5'O/*/jb3Jt7<$DrT +m;nb;0OT`nn/g*\_t-Z(i'q\501/Yi1^>0Dll=YC'cm!u*5\kSqfC8cI>I!oVh!Amd_S>k$t +9aIsc"K;`B&X`sGR18SP^Ji5!*1gDpo8BY!K$!.5bs(pN7f(L!!Csi9DX]A:q,]A;cM5G%M'"[ +bZ/<,st^qm=_bddla/>[gO]ATQum)a'/(+W$CJFWLe"Zt4a5Y:VP +\gVhk^oueddmPBI%FGdtOhQ_N/CfETL!7@cZ_Y93(#e(AJ9Scc(l6$G"Ig\LICO5U`\Ysk5f +EpBhS*DUPb<'j4<[aiKI`5:H*^]AThc(F7[9mA0N=2+?oj5CAZhCFMBZiL3_-\">9VI* +R]AhS.hh9oBh4Mo[<5:SlSUX)JmCcL`uG7<2kMWn+;@<:V_c7 +&l`rc=tumZQp1e\qdhZ6U&ogWF5?Y:k*Hlbjf$TRb.tTK_H?Wd&EaC'B:PJj[f`K=;n:g'AI +K-&#pj0Uk0jq(gb7`lKohJB]ATFpnRVYq3Ji=^@'fM+@&@=@Fs`uP'!bu::he&K41QWGqMZeW +HaXI9oI()>S@2?3Y+#/3#l\e-0Qg.7.Y<881GTs^Q5M(mX0E:I'<^D+io/t*Hjp+7fpRiD*T +q-@+q^6g*i1d2fd:ZF!I2FU27=)cCJCnJUC0GC!IY"o+Y8L.U:FJP#!)Za_d!F+bO/Sf,c/' +Mc+mO2PFphB`,nNk??]A_&bOS91p&N@q#r,VcM:YUUQ1\n<:nlBpk2'>0[V%InAF9QQU0E%7Ko@#!=@?JGT +o>qZ*ar%Eg(]A%VUo?^qEi3D=QNG.r:2jXUt@^nZrk.K@rC?;uErc'iM=JY3YnZJH=YkFFlYK +XS4CPt&JC?$Bkjf<8D#ik&"C+ZdeEJcPTS&:T;QA*1RP0(`OfKSc^!4U66\.WF66=>\7F[Vf +u0Ot4m0]AVP9*8gA^e/2@^sc(Uk^"XeHpW*A^=DZVce?2I5_XnqgYd&0-<43Sk7^G1auAg6?. +EHPD^kr>:P^*/_io6N),@R&(JPZ?3>\>U>hlJ#8BR1$ +dZkMXh7iN)e#]AhrtIS$!G;.OTgu]A'dsIsk)stR-.!H.69?!mp"7%@`P/E/W#\_[br_gUqQqQ +]A]A=9U*XO]A=_-oUAXa1O@7T_7t#UD@D$J&uAa+'kouo_hpg[TI".[1ku#rX:J>$.mXe.3,7FN +V>0b>]ANiKNRk9lL89+brT?]ARn?lW$OeFrhr3\22\s!:m:[9&J?.Jg-OMCSe1B$RcRKB6.+Mn ++%KjK"0;dnh+P4]AWr$pr_e2Vsk);H)X7?`$PQ"M9cs>jSjr,ooO_oMpbp_5Y`/g>[oiHi)fp +U!Gj^9q8d(hDXNR;:kKO3#-fFj92X0]AmSL9QSTrk&=YiX:XD/$HTc&:p/Q'"1hh%mQnlUb ++.[_R5eSZZu2UH;,S".jeS'k:tsiN-t=$09e'^a]ADNP*FHcc8j`BB8HE.@miH'^j!CilH0!bb +dj7fa_!Z!M%d7PS6\S;"FB)Uq]Au2Pa7536Mal,Vs%K:YMO2afqG.'69Tu)F`1lQ$E[bVVl8fJ-. +"U-la8Rc%TJ&E@^]A:gc72*!)lZFFp5R&'35@MSWNA`>7U)d3/5nWOb9^R"CkA#L)]ABATI4ej +ElC^#Q8l!U:1=isObLE!G&3VK'cl@!d$LS)C\%ScmK1p&:*YTd3V?2gP5&/&(`hGB,QXV8bu +B+03[]A0P!VcT5&,2:Y27dGJY;&D8+[I]Asl41iu7;=)VY&8&pifUQQpQ@eRl7T+pJ!b9fKZBT&\c_DrOMiks:gNMo\r"31qltbq(-;U?rT:Y([_=d +6`$1>@*'Tatt';HRY/1@Pu"XLV)[u0P]A\iD[)U0_//#,dYhmnk4QtZK;)F2/K,Ykt=kMUdkBWbf@S??nAq0hkKSS-2W8\E0/XB +CHq4&iYYI9g3o3W0Y+$LG(03CN,Z:S(qLJn)'F*/:rR;HDk-7fDFs@i;XOcn-]ADRfEGSddk% +joi&PI`#laY$Z0/)3@@;`Wt\6P(&AG\Pn1I`@YZmI.pm*; +:jn'\&E2n(W_im![YK#iEX;C1ZHiLk'-M>qT8^J&,j!eDAmN<]Aq"^ +c2`cic+Y2GQg="3k@=aZj5>Q@$olpOg\Bl"%%m@7DU?MPnN8BIL*X$s12>qa`;cV[:q''jFD +XTs0YN6IV>0TXHWC/iPN`c:b?mhhMia8Y)5>b5dp&#"(*QfAeFRFa)\$d*'T2Va>BALl&WX0 +-,Q)0T#t`i='SmCug,\IL^2_!"a%]At@&CDo'^Pqg\e%"FU]AgLUm.r=%ri81S5cgU0hlH7!tI0=L8 +ad.$7[%B;2)&HC.ZMki0/<_uY0<4V?"Bk9"e=h`Q(/[RguBiGK@*&/p_J]ApBt0ilEqXV-%8E +X5DcJj6YC_aca!af%/DTf[XKC`UrS8=JX"?dVBBL"qJY%S,$/4QoD831edG,FZ(%I\)hZn13 +b(Il]AsJkA'p?#d!DIb".>6P3V1TTfZlh[jN]Aef`RX7o]Aoj\34EY<6Z[SgI`*o#(:`CXRYi.\ +'BrNK[OU1aM+Se5?n>+AbdFYs@M1%VI<\#i>U;lTpWI/:991m=:a?HjeeOHK4f`T;"nK +k;`+72K0GcOXqSPFJ?F?QH#Glc83O22\a1VE`#,l,6fOX-RjM7^GT"$@X[)r$2TRZHjApVld +So)`P%JasVY1YgN2NWp,%7QFt'm9U=o6!p/kpkMbH@NtcVkpS%()%:rkgs-T@0BFDSLcpU=F +OFTlnrjTB#M,nIK'qB&?"o`6n/!+.EDDO^F7)p"m,3k^IJ:221@YR3%^'5)ZTem:^aMWqtTR +jjgU\9]AbU,/6@g7>4E/UNat:6.q)VDWtMO%`@"9RdD4:1XOZEl +t4OU/C`<20LJW,Mc!GRea.\oKgG9VPK!#t*_?B6`oMJp;iZq[WC6+a^Yet?rMDX.=Xd3s7YTI-cDQO-b>rJB,jII*1MW\tT%Yemtk]AVWnqRlQ +C49<1d:-:En0cp3r;N#1!Alr93X.Cl5i\A$)!^aAK[cM9>nqq.,dq.mb?c_*XBm2hZRYE?V4hN\&4dPL&%tpunGO +,ua5(*B;D:@q#eVnILKPJYp_X_$5ss)7M^Ff.r0K6B[$H-LB42oea\W=!N=m,T\SFUHo6jQn +RM6TH[5g,P0s$6?Ng49Dp/1?Cp7WTu7c]A'eK/6^2i=6">^ +XZH;n6E53XDCiecj8p\3rjK.^W(/S/%%,/gSB@]A6b(f2ZQ*2a^??jCIAZO02E4cJ]AOg1nOa3*R1L:"i%>uB0tQ3Z?\.u\]AO@GO05P^Mj+?51dlc?U88Pi/a]AP(OVmo +681uDI2D4`X-cM]A40-j<#S!8YZJ=`r37r,g.3IW.60!.4@KKjd+I'.ssM3sFS#-ZnZWCs3*H +\d-`mVua!2EI!^9ZCXmaZ2gA4__X6d*!O7`4V;==RQ"RaDHAq"=C6dBYJBq^pa`f&`X<%Xg` +*'FZP$G2j;CB#:K!2;Q-=+q*Z;t#QWtCW`4kWiZA6^C^^l7Vi@l\W?4:Q,?$i*4eEOkO"k*Br\2]A1^c*q)n-OS((iE;F#P6rKWdD_;o6TJ#Sj9%f"nOK\Gj;m^k\bjbp6>]Aqq,Y97Ws*T!6dbakmGa +Uf[3+>pk&I1&k\RD>LNoYc"FOKEQ"'Tks_7;]AJ,$HE$2:'PEp^e`tY8m&QR-59)pr]ANtEPA" +$:WZX%[eE_os7Kbpu++EL9O`PK(fU-pnAc9XIl=^_R@)krtp2/,eIZh^MN +obpl,f.(^0l,JjX55"N5^S3gl'PcQ+4hI!05;`PcEEXWC58kk>Kf2OG*89UBl7ccFLk7:$^$Ilq/>a +UJs#o1T^_Xn7S1Eo.7-':'(?g--V#p-@dbm[0#lYX;i9e +WlrXpS'$e7,Os7`[+Y7Cc(G;jPui +r]A@hY;cN'MF]A'u&?$_C:0XXV/l^)"*>GlJ\30)JFUtd[ML:dpZ2+jA5)DpURC%]Au>73lH.sZ%RYO[t/\T.2$TW?e/2 +g_LOa:iY.A$-U]Am2199p,X(JN`2*_,n/#W8[>f,6S[sVX7T>7U'hn=&87%?N9,'a^C&;a8b\ +a>?,ZDd#J:4<8rJKB,.rj+'bq!B7cUBNGbkSE''A,naO<+BAGisokE5e.8Ybps<>_5R_VqD, +7&&FdP@9h,R:R[9?%Wo\%u^S-Gm'tu4/"PWS +X.2Xj>u%1K;6q6I(mGA/f,,s>o;PGEs3!bj;7[I*F*nBgCBr3a@DL7WfLL@MpF>g2>+6'pr; +D5OW52Q2_mCKj'@7j%/rc'67L-'i_!F`H>Us>L.DO't[ji%m(M2)2Y0;Bidq[2X1$rANehX) +it=+GRk#fgkIAKtRP7X>^7G=BXmII!8[Nd:2@=Z-0eDBS&B2X:`k?O +B=@iT[HEq.@^;h3J^Z3nKn-sk5g`)J=)_m+lU^$SW*Z`46ts^*e9H_E,S>s&1^IdSVhea:&H +rlAE0O9`6Fj>rFD>?4LOX\c@1154dJcSgQrA"JX';kHYZdKAq&Q[5*d-&Q8D;DAcO@[,Te1- +pBrC.#$gD#-[.:]At[Wf1)hP76MF,d0M5gT7@XX<^H9e2L8NSGUL2PH`g7t"$`#FnU`O>mJK;dZl7iL$n3C- +89"^@*ck)$lO"hj:Z7rtsh6.GQgf/\^I=d?mYR^Q`f'=N^!FZo7 +c&o(OTmDDnnJJr;m;aEcaBnE(T@_lN*lhL\/\t7b&L5AAWPg]A3[p+2Y>I.*$G\HuCH0\siQ9 +gDUpof2D%M$nknk%&fr@\hUaY4q^l3["oV[*,'O#^,Gq*ud`/1bD?(HA.)WLWt1X5'r7Y7rY +PLdVUPR7iPncEI[nB!>APqL,C81M-u').oRhJ]AIZ,r500WXbhk1R`>Z`fq$)J-C)PR6m@nS, +R_&D6lfFY?8W25Msnq2o,DCDgW+e+SJtd&@86ce]A6*Zdkl+,A%g=ds@N3"T5Y]A=VdDXMYi%- +%^"A4ADDPDE<]A+L&VE.D*H0?q5_U-[o[rsLeW]Ad,6]AP0pY&[IEt?#r)J[H[2adTC^ki;s.8K +[o+]A-PaTr)a@Em/&]AT"V_@YH"&mAp9j^*$E"^86BXbL6r,j_H,%s?m**g0uDT6Eu/`/jW^X/ +I$PRq^Oq[4jgVfgpn!Au$`"6pFg4IU&QOJ8fd^keb4GH0n:rg@Dag@cVr=,LnGZrEU"7Se\;;qo,csc8N^Dqr]A>jAL#`SE3i.!EF! +"Ln#@4]A:OSADUo=q-b]A!@%ef1jOt8PB42"OrIQ-?nr./V7=r#0>sR2W1[#^cD+Eb2/1VZdr&bkU3E[p$I +!A^FXD8[T;J=^T?V;;9$r):TUmFKrEq+9(g.Vlp@.5UlXO%dM9$+[D>t7adH2mK-^IBs9*qV +oq\.iF@h?X/PZG@8k0>j;HPKrUkR,pUp3=b0bLWoc/*O^/Ff#/E0D&^HO4\M;`n,mLmFhIr0 +)Be!@%A)E)etl4Y[1@ubhSh%?iM$B]A3mW'm;JRs]A=Wp)]A9dIB!dgq<*t83;hlutcIRHI?G@M +t)Z-?NHPmb<=:T/(!pn/:P;+:^BE$;dO>)&sZFfh!kWG>q+j&ghde8*C=b +Op-ej3khAS$Q(B"^%W7J7RorGqK@4m7+aRnS?upX>&l]AT$&1\MRH#oCYP1%BtiE2Ms3,(kT35(imNm^.pm>=`<;q$8ZV$>'7scX^JuSo=C?OI0C_.RV2 +60P0,*Qo?-%F?8Mc1%28k;jn,0[^*.mkGSA2o!V(X\HlC`l:=5hfjYL9elk"NQqZ(mF]A/UN> +hU#&^q,`^_.;.MlV;Z]Ag^sGUe;^\[>'X3h9Z)cXNpF +6dq]A9nQ)dSmn;^3)*ujJ_]A'Y"@A&QouhuAu$D8VS8M%KtFQ`8NpI=qS?M]A]A\?p.!O]AN5)JCc +#XrsB^=FqR9-'KV\;&(FksKUHINn@Rj:)`q)/+Bhr3?l3(hW^-2fet+Ghal>=.tZGD-9)=#> +X5As3tb%r@#8^TSUSbTR3R85]Aa%Yu'r1q?aDc*(>A6LX!ogo1:)Xq>uT5Ei'^Ukad6iSu2fA +61TpqE80]A]A(oqtiX3eVFFtR5gG1ee9[&n(m]AqF%[-$Xtodd6iAmr;4BJfdCimdX6>MC5h*4n +H-c_9$3j!aSmhK@GUuGs7S2.g%;^KV'8-h$LQ>e#8/bMtq$Z?lET[%Z_C<3;$#f@m.g[af_- +0K2lom[Xd0%2#3nkI_(N#;J0bt_@p?O'>$PW+iu-=E/t5&]A4YG4V-t6dKLG_/oqi6#UEjB<9 +<(1pb?"V!do;IOSuG>9JVAC@?cVaFd*i;W\>mTHq?*i,3R0!'[+B>sB>=!%dS-u.kmL,\_U$ +Ar.^X0O=mO>Np7To8MV[3'/RjL$ZMt8:J=$R(/0c^R*c2Ab:!P]Au<]A>>t"$RqhRj7:#XepTG +Xjj`K^1:)m!,h,B2Cm9\EEuoA>jL2jq'C"LV#ef4Pr")1;OI6_qM +U2=2goJIeN6P-#C6oIS'H[depE7]A/&5I:3V"XZD2UonrU5W$3;8RH^4^:LZNQ(h-5Z+i8OR_ +M%qdI.->'8E:D140\enNko+CX8D'`MM!'kNXT&))/2>M#SJRmf,/a%\hSD(LA.k"j.G0pk3> ++^EZp=`cE#e_oO]Acu>tdeQ;1UB/_7%/tIk.59fRpU>,jV_5)T+[b9TBW368h+&uYE0]A2WhTk +MG?W.lsWh$I26osWY)31ZTOEOUBCP*/K`&>#(=49F/CTb)uKti(eJ?/>=g*s)CDeJQP%l$R< +\"4-+b7`lbdOO+Hii(Ki]AdrZ(aTptp]Aq/(Z/+dnlcfJ%XhFsK?4d&*Ei,]AW+RQpD4N]A(YL87 +mPdU&?3-K&-:5j41c#VH52 +B(I),moNKFr>*_BN5&7H*S^l[p\POhuXrZj +]A($cn^T$TN4Pp.?Z[D-dn?8Db@t8JWKHkHV9,M,_5@A5?hTk*Q_\:SkNH5%&jH%kA/dMU)04 +8r/`.=:EkkFfHgOF!5@K^1+-4P*jIAp>-0.VFF;L4>b36mH7_""/`DOm,KbM]AfBS?Q`@lim1 +=(@ub:Ss4ATq9UocMR?Tq(V2Nl#.XjcQNSsL$_Yuls/!ZdUSnNUb^3/eiMDhpthd:pBq8B'KJd7QZpM4o#\;;*7T:,n.+$jT4j<4@%,[UWb&=/eU4s +ASW=;Mps[#?hYsh34J(AYUfO\mtC2MU[Ys.07Jg_Gr#j;c3!XXYg=i:qF4J"4_HIYS +3qi.*A0oQFc9!fJiH$j&KRsN1h+JDZ,dc9c#NVu?sqnC,pe7^8IU\OcQAL?!LU1Wn"J%([F> +hmAs:a/8Wd9Wo9d;0ma'!MVJ0h`_SQWlqhhF7I^joLQ)$lrjD6OI=c-mc&F>B2+7[a+-=M\> +;?,ZsINlQ55fk>d/ub/O5CG/odFW??OrqPJ=;^`ju?P$RL7T!=M%/9*2) +D!&j_#c11:lh]A'nKT@;RZhCOpDBH@MY+_!$uh5QD$Jn!Oo4(hfjS<1HU86rb7tKLYYU*L1p9 +49$Bqb&4!oC!BdEm2g'L]A*n0L,^o9Ccgr7#:B-&`0GOZAW;JN%f=Vbc +lP)Po/ho=3XmS1B9H?)FgJ)rZ%@LF&n.(OdfEW]A'J\ +TZNh)?dD4e&_lm4Jb9?h'Ypo2'#iuR*Ei)DB-qo-8eafNLc&He_L#aDSDmt8Z8rJo`!:D*(J +b,a[2!bI=$KXlnj!DYj0(2"-YEaH9?Y'PE.= +Y5WV1gi(eoRd)'MS)drmUVH06'XANrT,O'&\%f["gY:I%3RVJc8q&PMg"BMQ('"/M/68YM*8 +E5=0^fKkA?\rj>[\l082K0*RKA?X#eB\sl6fqZ3ij."\cFK2$h3$N:6&U.lGq1548_!@pX\]A +IDhQm3;;.Qr44`rG4n$d3aH,qt;VfU$SXc5F>4[4_WQj%XVCQo2$F3=3eQG_nWlK.*k=7ls, +1@Oa3EMZtefEMLNRE_]A;"rh,PIA\F^F<*q;[Z5[`F/sScDd,i +NCLSqlYV#[\Bp@<6b"CqWbNBU)sJ=\5lX2d]A$K577*J:09\FaC#$8tDsGOitba`=#953-UJk +(lU64K&a_-LGJ_YXLf2"!b[<(2?6.Kj98ZgB92DrW5'"8rgGcIN]A3DTQ%:.(P#C#sSW"k`DK +Xg9a\KY!oZK,emndb$0qK@aH)d`[I6hch(9T754N&:C!YMFW.GN`5`IBWr0_/0R=!H2doj3gW\B@0Clh6hgi]A'ZDF@WmH9"=ihAtpJ8_P3g&b\Mb.;Km#*K,NXqZBG"U5CR8;#V[-60V ++uV'6t7R^p"07Go;J-_36QiqNb_c,-raSPl@JPp65YkR!De@oTJOInC'Ob.)qrf#J^r8Pa(om +7j#5mFhD`]Ab'8Q&)l)^^C2uZBAL77H"eCGcO;^3Y5=t-!DB">Tt(=)`6(Kr2FU,aF+QGUR75 +$TIC8Q:118B;7n3I?,l]Ar>dJaZfP1]Ab;i;3HWmFU`O[Gnh7T!9GT%3'Dk[%2S9`"jHNdYAVt +Rpn'UsA6nNSKmo)El,4ru4Ids@=+m?qW=^.rBGD2C87KEaF(VG +,U$/*G0S5UD:aI)UF/qtjqmSK13A%5g8uoB7I%9(k8h9;_/R!g;Li^:$]Acf#Xt!3l+nsaVD\ +'KY6c\Bp-52?/)0\*A"n>_U'2[efHut1neu,uJ;tT.; +;7lq*Y"(OlG^ntr#pTlC-ngN:hmfM)q?.Xps"8n<\.`1LErK)[Xrl5>H%%^iX^@rtS< +NDbJB%/6$&K)Z='SOoaP:78#+ACS<#7lS&T%0L`eUZ5/`QMqJ5>S:3)Y+&:SE[NAI;b5ft-' +,4-)/1FdU?5;YgJW,7ZTuRX=.qGlRdAH",\U4.bFC=N-dlH>1n]Akj<,_XEDT!@i3fmI."N!RItJ8GPr>6IH]Akni#@A_t"Fr*73go1srlY![M,aXZW4 +'SSDK>mr53q[Zk_%TI4`%+n8RP.0m$rJpeg4r0@_:P9WdEq3oEB.Zb`+;>O7&!9XJkej7sVS +NStZ`[@$Qfp9,o1qL0h6k1Bk\4@PZS>@Rlo?DDsZ2TX>'A$&]Ak@Wblsf4\Zr'TV +abbE/&H;$oU/GF/P<%VWrqN:WbO[7XFa[Q&\2iWohk=!2J18#P43;^]ASb-9e"bA$;4FSUDL$ +<@qNWG[f&-&jX\:#D:(/nX=b1`[kYEk/+nbW^QeOBj._GEha+U%]A^+7UIWWff>p-9?lLgLVh +?oVBiM3jXSRORSu?lrY25@a5ocLW6(Y4%%pFku:_o8.Zg]A.7te7!5tS?uV1!F("+s$(=XS1Y +>B]AY">?TfE30+iELD6Wu=nb[40-!2s8\b7hghp@n+r;Lp+8u*R8!s='*3els`2u89/Qt1RG4 +S`>qas4+8)tC0iNX(^SV(kB0\COa?m&&\C\qX/J,;RAs4&Ni&@0`6)Cr:f1hK@p26U"*ZqEV +[=mA+l]AJ#hp>b*?pq]Ac>.maL0YtG)@5s\rF/UtfZ^60c1rY++O5q37g:7u`n-$,bUpbI(-kc +DH#lo3A$tHL5?>A$hA/I*[ngC\&r;E+o)nRY"'Q#o[fQV.CK3I9k+4W^5^>8r6l`!DE2o@nn +i5"G3g6lAQhG`dqIuShj=!59]A`D8^k$$h9_!=PlMFZW-]ADloR0:N:`#3-?cn$OF]AF\#QF0e` +HUEU-7N!l013U=!2!u$@qBu1m'LHo9;!gnQsr.6P7IdKkEq1Fc4A9^pU^$FJ"=]A0;-&!4Cd_ +@Zac'-2,*c39_c,V30i$t5kk"C(jc!*7V!bgoP+t,7F1MH@>LC!5,@"2k2KAFo[%WmY/+^G: +'q;p1oATCGEl]AhF9D:(UGSZGhCbt:^\K:DR1a`FdGTX!ghe:OmK+:0?Whu9L(Er)t0HO3c;:(^Ac!kI5bS"Yn,CreC0ST9atUC$C +g]AZp,L8I(7PC.T)\eC`F?H3_ISmEKFrr!1#)"'<2*+qRec!E"sG\u)QV/J@?MrR4Ztr[cma- +NU+&U\o<')hTIFPs[V6;fSuNJWrT%$*=/Y`nMm2_;'CIGd^7c'5bW8b::,ldKkqo@`<#O0"U +4;m+(8:-dU`JXR;)8.5]AunN@ON=gg"o;iIDCE"S)U)ib9t +79+CuGG3/F\Ec3fh:7u<0HkP$'I3tjW';*K4OKrje9nO^"=+T!0`=]Ap#tp?1-]ASmLcST:`GP +XGBW%SQb`JN;4:=!(K_HaaY1S4kj9:*9&3@'&.Ct.>SW=^uckZ4%*DtJmVFqr=QVWkF#t'-[spPLR*Uoke&gZ`fuA6#Ij9PM`jB%"7:!OW)kJko=QSF]AD&c7K:*VN +V+OaJf."R(DOllY'C3$^o?SY*I0&_k):[]A]A6YJ1J(\P$LRX9C.b.dL"gnrW<8+gGCLK5 +I.;p/YBT6PAD%bEGoQsNRNO8k!TE1"n1QZiL;8&)^WB!d9::psdu^YBCsArfl.2^(+dOhG+G +8sXQ87.X,eqp_;,22s2dG*J=n%DI?))EYN9*-qC'\emCfk9rPL\u*[Dh*?)+:tN!]Ap-Zc38o +jsn^u1mCUiD9fPpAhiBe6*?TYo`#JT[iTNRAkf%Xd.`'8VWigfP:dL[$YO0k)o/'muTI\0X0 +,F?uFq!$`m)P5 +BSn>S5%VHRBE/'$dlN,V^ZHqm46nA6"e'O_K7aV@s8%;R8Hh/p"8p_D5)t7EF*lQ.?bUN<:" +f"h$a^ObZ%/+3q8;d]AWrk7JMa"!Bu%Z,5]Am''sc56H#)RfuAkLgV7Bh-m`^#a$n/,dnW8f3(K1B^RInXFl3A1 +obm0etLZ_"'%ZKUg"V[9$D:5sU#;UiuKte!'6[8LfF*&MqQZ3Mu'*UH$c_jiIo)[C?e"p)J,S)5C>S+Vf[WYi\IHaLL&*59T0%4P5 +)&g!_W6*[K9Pe;L7Sa6WBEnQ%#H.\iPObm4PpS<=KYLQ\^AG1S.'P:C@LVO%]AK*fD.J1f/9]AYEi_GG!F(1 +EGeP`d7t$ceVb@692*i]A\b\gA]A:H,!0mZ,e4l:eC]A4O;>[1Sk$6RHci(\j>N&e4T5Z\&m(L; +smalV&Ed1(&_)!fCabH)KB)kcXMiOXfn:eet@=;CQ!:7PJ"K9cqI+'m0H/cb +=a@7gaedRe*do8+_M-o/DFIUO,,isQ!h2hAJmG'o4rK4ife#jr)T`.`)EM&9[-fg#Dr/>7'Q +Xd8d#Tc%mon&$'##1'W#nF(MXeu%0*drtVkf@Q;Nbd@k/;N;gbJ;2Y&A,%'?_-e<%P?4WF,X +jBif,AE+im,F8OH^R]A;4r<%Xg+8ANTfi&TYf(XJ'n*Mj3s31\F;lrEFb8m(;GnmkLD.^q:.4 +GF8LG,K]A4Ss7nSr`/[93If&'YACjkf5AX]AEPA`e7eYJ3TBQd1ZH*eN0,TD#E;C!5D:`[aL.A +&JpI3oJ-Cc!ZID1b6b_(D\k!gfaYW(9gcU_$XFSE$JITReanEKK5naED5^6!Mdc1t^X@C=E9 +$mr2a20XH1-=\n@,HDD3m6V8n5]A(Q,lT&Xi\:?`efREODm!Vr;;bIhmVB6LL5nK9T7uC7pd]A +6Zb8s_/)5X:9]A)O^^W#`/*u":HCrTh.%^"Jc3s(a(Y$LsuEu"UNnsF)H9;Dti5QM,3liXBFX +ls-c),gS.QUf19SA`5urAOUL?8g1E4$0%h]AIH7Z]A\2-Ep-BP3dEg8e2YaPm>8BB\1kA["hk& +/GmNH1,@m/]ARi.?J#3IfJM_piqP*DoJFV4f-(i7`jd[ie;G&co^q\H:"6oA,j`_e7l_F$&Y3 +H&(rg"eC(g-o']A:+ZTW@X$=95Z:1SA^A:Z1fJpYm0C>\X?1c.e1N1G.4oX@P-%/hT>J]A0bEM +'>tt.23"Hj#7=ioMtKt_`sdGq.$U7ZbJVTRg3B3GcrrN+_7]A;pM$^X_n^3T*k1SEm#E&lU#2 +tj^6e=8K?\\e4YNBNn3/m0AtmeJ$&neG]A+:QfW<,3fK +KB5FYGHi;_!k%")QP!TSJVAg57;bFP9mg=SE4=O@[KV+V#54;d%R,Huacd-r3V-67br-igZjOM#_'R2_Yq +b]AjWc7PGXJg,Vm@WKnO*'1huenhooG^2*%F]A0p*qNXdc]AkS@$3e +98U1$E0LjYljrT5I`F_Z/PR:?UbdSK>qGp%r2AFii,&D@C15,&JiEnRfJ%\bam5N;nJGfj1L +a<+Pe9XDJ:Nk#]A[I=)Ofd?k8h:l2WCBVG;I9jNh8RV)iMsrtgJjaepS0+]AKu,]A8I\s$u&eeB +_6aeqKGR1(O==g\ok?n+]A4g#h:5P;_J182i:r+IcDp5V.s3t,GZDp]Ah-pAa6IWt.GmE,Pm6l8R8]AZ;L"90MY0cm)]A*3$KrfPbD< +b>Dm5:>)7)@*]AIh:>Z#@P"6Woo7&S9Vi=FCLh6PoEgaFFoW1/(fKnODjVq.DiO6G[Su+./Em +rpfG)5#B/1^]AfF=M=O5)aVrS1kXTBaFUPZUu5=CH;:[`Wr[8+2(KA7=l'f:<_#<)3LJ5H\h7 +@X*9>9YOtJ-o[!s=_B)H5q1-$NQc;Z,#"+klf_B87YNNtmge/%]A#WNLjPJYEJa@.$]AKp]Aq$2 +b/j7RHTJb,pI/f=+ZET&sq.91HqU.SXnX9b0PDB3VBeDVlBr>EBBu3=nmhI+c@5!PmTN>3t- +[B^;6[>#!J'M%cW\^'F;CrOo&,abk\;Lc]A:"LL_ +tBn>-YQ5BP1Aif84>t%iW*,i%5GIs5BlLG2^5q8&]AJ>k+K#@cUh_$/*KrG +01,U,FdB0K'JBAmZ@.1d8JgDijao@iiU$(G3&8Nf2 +7R<(/L*u)j6eK+[+>/G?<`S7ehZ8mfLMdJJjt.,M0)pj$ejt37GaN+0-2^bht']AAA(S]APgY9 +VW+#(^Ymp/'sIg,mjY3bQ\P@#rA/^%mIQ%iHr#(KAhY;m;$@]A0eJ%gcB,]AYR[8<-K5nsi^X6uhT'4mJ>;\^:5A,N[FD`<"FWDOWs@I=p$c`4n(ngGqtQ)f3,TtTr)-1q +h2Hf!<'p$=NCGqAQc,?M-![)V%a/KR5VQTtieA-P4k4&JBX8"P4IdR`2d1G6=qJJFgaqBcXJ +U2Sj!WF'K7XnFQobKDi*!AR.[/"(`]Ais=+)q%(=ZLq9d<_r87QHn8TO]AA=bK6tfgdV=@GPZo +TlhB^ItK:;+P]A4G#^K22B^:YZ\,)`OVE7)hQ^JVA4$sFR%l_;0HdZ +NEO#!i5L?8Na-_^bY-7kJ,!Oosh/i1SZ%\>]Ah2)MLe+K91Q1;9)I\A2t\d)\,Y5j-V%Gf;pA-\;J)GX4i[^\MVT?VdZ5Di_0>*m9g[P't`Od^b:>GRF&m"^n[D1u=b"H= +NE3#7cO$"T'NQ)88jtdJW4TXKhEF%R=n^E_S3W4?p#n9b+r*!uXk'?T1s;%ja0uZC8jg8sHl +"CunX9S:a!\q@M89WQHt1QWPlT/s +s`fFnB_]APNOc!)IY?Ph'dP/M'a^/8!a4>aGE.cMgKrU'5!)k.HnEcU]AC'S#D9=BR_*]AD7:N^ +c4P$H,PHEK8EMYBfeGa@BsKnuD7qi\dAh"1ELd`.HH$2Dn?gfprV(hclGCN-r.:FZ.4U4c&Z +Z*QB$*d6M^!t^Z#%IL*mt:B8?@(gb2&eAkKkta<7%.pkii53F)A/A2>55fs/B7Xfti2t1:+P +6a*,Q(DA*;Aa-m(a*?`gc._ODr5#J;?UN%'?\!H":HgU3L)U*2&r9Oh]AQbNAY%6/MqDd?*+- +J-i!H2Ma4^^;?@=#%nHfZ:M^?>9?/4hb7kb*Je_B46r^lH%GHPVG^LVQM&gVJjGY[n3/`l#m +/sl!q7_ll238IXHin>NLfcD[28&G?VEe+>i2(r**Eb[@nXrg(WjW$\pe'Qm7'#n[:DJ9=o*V +hkf'HA>bf^-FL\j=Uj^u.f6g<:UDmL]A&@McfmSSa?fSWOq9M\M"(-f6qKVUPmo^Rm$d*!KN3D^KqP2PS14DqU.:9=hUd0j#l@\]A(l-uq +@c7uK-GXt7>ZS6.n`mAB7[8GmmCOW?Ll62XW5,X=&i7#KQVG".WMJ"J#*Fm[b&YsGR@q\J8UE<7q(ZT'L@sRJCMOBW[Z4,('gOD/CZeGS9,!qurU +en#c"h>)gKou%lPVTlA!a?1`>L"(Yt#qmcNM`,W;^*,e&&4K.+7ber`C.Yc7K*K:aZ]A_R3$s +9E\Yj\=k9\WO2q8uiM0O]AK7Nd@ZV"ka^^f/#&'N6F)Wm[\BY;>*)5`AC2Ddth*0X%hqTs[2Q +k>O"=e&a8YfEe098Gg^+)6TpO&\m_pp+4Sr)b>U5i-Ou88=ULpWZlGHi&FW.q^%9`[<.OK2+ +;Wc3D%Ced(8RR&@6f>qDl?F#FNW"$hf%o'!#m\cAon8dfP$5>"]A!HfZgo=iA/!2o-4o3:_sc +nM0e9>BbF70JZ&6-VO$,Ti>Ck\'sR:/$& +5G$A8WlUT*)"0%_\A"MMDHqW_bd,N&m%Tuk/.%YW.lPc;@T#gda_$+eNWIke>V]As +3/f-l5G'[>=/Vn<#%UJfNu'[`(LRI]AB$LtN8>D!f?#;kpchLaag,Ff[M"2qZ#O`*GNd^<@`[ +q-Fc9Y`5"_JZj)V\]ABP1G/R-1#:bGIL"V!HU%STInulePA9=?.4LW)IsZ`3YFJRr'H:0:@`> +L3n*]A!RYHRA,_u4^@;gfGdpG2ar7'>WHl08;Q(tN"12q!UXYi:MI3/[A)4Nu&G>?R3k`C^[0 +A<$8HR&4Ps"/-FB2D2 +C=Ri[WCp#'IZ`Y%:;-h +/,F9")hUu+U3#q#\1Z+Z?k-bU+G-DX.6G9`DrloR!'9fo>gTe#g+5-rMS@8j#QOQj%:7b@Zr +\l-+LZhb_Sq&FX*u4$pPS.MhZSr=(a"r)$3LKobj)+gSm.'0U]A7')/1Toka[=*`b2F>-8!C4 +Xmj5n.VFLcH5STn*cIUrp9K-)Q9:r0q@nM!pcR +cF'MHj1LfIZJ3Pq&l2"`6UUK[V;m?ia/\l+T\o:Y(3ZZs9?KJD,54=$SWhBdXikmXcptaN,T +reZ=)HK6\DPD^T&COE3;V.`hJ8njmnQ.4pV!f-Tn"9^9>KTS/dR/qRN@?H1<=2Gb_nn89a4E +)5Ptb$J$A8T(`GWE5lF6,E>qX^2.O]AVAoCIoML_5&4Ps[RV/F8kL\bh(ODE`7EM/F7Mp]A#S8 +M49:.)PErRHh:;^JRc)R4Y)"WdSkT6)b +.@3EI9o/`k"nb1;Nr]AJ;]Al.Qs10UH^?=9`qXV&UaTgnX]A\OhMN<*ps*,=marfu%6oL(Sd7qG +1F7G,.e'\_>3jh2IW3p*+;`^\@9a:G^@Mh%<4kMaEBg/*^4,D*#PR4bOC(_!PV(/sS +f%/=5%Lc?>-,<3>G[oM3pSg1%gg'l7T7Bk)YZh?9QDI)C:48$NYTL9(t0q6;7i`t(qaB+JW)IupmFs,N!84j5<1J;Or;9&%CB$*cf%@,M"mCm)(:"9!6'nX +jSh&:FL<>W`9WsIYPCFe!=$ruc:@\8P9k[(!(K.f>GWZ8\d@=Y[A9Y$4l5P1`+Q=]A&np1iZ5@l36@YR' +$W`)rM5_@pXfKXV)[^e^&^=U6uc4V+\(u4-be#%j.Go9ag_?Wb_7h8QS4D&_j$&:-?peCF_k +_F=SpQ_JC;,7CCm(Tg@P-XK/^RiU,)]A"<:[jp9&;hllTS6p%/Li*@rnY^>NAUVPdmcapis'0 +QJj[MH5/RI?rH@D*R[m8YShn5Ys*ikKJ@s,*^p9f,2fYEuLh!Rhl>i8lK4sSQupcj*YI[@/R +T9u-JJi55GFg8TH-+?fZn.=:VP[41hqnV$_GJL>g@3>$frQ.ouBG_8P+*X@MB!mD"=ramd4Y +KtGD(/h3nUpT"%!'WAs0fqJApYtT'oe&-.&64RQN!kl6eU^Z9')1h]A-[r&;;QC2-A.-RHjLI1#hP;I4,1(f+_hNB,UrJLoF!4_J +.GK&Nh=c2`h:l:sCI6-kF_S8(FtF:P++ACjt"#Y15$n8OM9LHINIf"b1=Ch[TTU"*ui1'&AQ +F)uCY*%AQFLA%D=2kSo[^,)V!*N2"l6'&M+Ln;KgeV;Ng*QjG^f6&j!Z'aILT&H>TouMQ@d- +oHak'`ig/5uf3S1fBd?MfTJS,kjC,TL_S\6P0pdR)I.]A0R9]A<=6m=2q>%KY=e20!%rgmPJKe,^VmgDEC**JohQMC+6HP +,W4:,,*8!8:ADpX=0JId1l8@Lq#t5s'MkoV1@q=EE!F>c&JCZVu$aZp>pVDDO/K^,Bg +ol"eQ"lX7!K32tjJZ6G3$1=T/9c%Qis,>4:j`C\NS\=j6n? +mSfrQHUhdUOn[-a'kDTjH$2!-gA(9d5'Rc`$,7RMX\*u9GoJoT,3O7sjI+NR:I4_DBY*:#"b +hZ`PIZWREJ7uukLe_?FZb'1T8LhLB'(["YBUQ4Zk(9nX9s_:o/rr`X@nVWLW$O#P_9+W/4rB +WVlFM5'ZsC-LUO_E?1(elngSQV;dE7Ih(jVA:PWjk(2)2>Pjpop8fS]AKhUedE +Dm*4a2hYaq!2@K`!j`qCpST9BjFYmLpIW]A@#38iZ%qg&=q`2/:7CnfK\TFLW]A?W"eB\8U_D3 +g"Y9IcjXuY#9"OO^YCQfHW!*iV:)dIa#6WneHsDi$,m^:"IP3>j%?T$Zqpqhj%Cf.-&A1+epQYb-8p="`97,1&O/*sK`h,;sONZ]AUL$u +5$EhATEcn1bW2J.2dH*ZE=[7FGO&-.>3cF5I+0E@,`2%-\[D.YGA4fFXr"qnr`%Il[Kcf'>% +n#d'8o\=lcAg+['aKn*NaA<.U"FPTF)\+,P;*]AP48Sj@C6QcVH)E/iG^0Y +--oW4M;K2=,eH2`nF:]A_DG_\TQ;F@.B^[q)]A?YFo@<`ee'j5$n&pa\e$c^I?EukR`Y'Vi)?+ +-I,jZN4[WKe)YTQaQ9e?FT7S(N7s"V%,Fq2e($FJ9u+f#G6^ci +J%V?mZ9\-kkmCpYM[?ioQ!>\).4;)(7er`lC9PB$4duo"+H^;DX#lBhE'_p\#O%T?l.K4k`C +2M+cd,bonjT`XqTphi;$lj"cKoONW<7H_hlb6Y\',5AHC$JY1q]AmtV""4WM`M`uWD(NK8(I+ +H0D@s?Y3CV9e.hP62^skeUR"M]As$'&TZt@9iX@0Kl'6k4IEB>^qET +nE$mT4Wr;Ibl*h#R@+TFd"sTnf1QAG?YZ4e:k^04FDE'Ob!M4RNmOXkBC/@NF+KT6&1QQtpW +gt^%ZFD;H.9pKg`!?@PZfM>\0iUt&!G7Yj/mRjm,GQ1)]ASKaf[Au]APd5*Dq/&.tk[$q#b`1s +!"*]A`6r<\Hm9l!eSdpn4_'+P<6`Ju$)I`p0AMa6![]A9MPa=Asom0j`Pj&'aa)5!n3V5l+tbKC\=dhJWlVR66)f107)7Q36s"RsjVZJd\#gLtF:`r2B%:T^4qjsGZ?/fh&dh5m]AuK[aEmf35F7urtO8$#>XWJmLs"G" +^$f>YHrXUn)YOhD`R6s(c5'MLo/Pg4f&bce"/d9Wc+N!aiR%9eP%tsWEo_-SUc;*k.A[.j8_X>LQn)'?kY&c)BC0$Zq:m&+-+,,(%kBho(&Qn^3UHBC_H:,N?A +$"^U14EWhBUS^jpm)5,9Odm5mA[62PVc#*#!Z.cK]AlQMS3!=o]Ao(W8D6K)9;7#&T=:Y]AXpSb/mV*>NrRB,f"n]A9uR&q?iGt(X&qLQ?50"rEt"e$P*r +QPnjgdS]AZeMgD5t`O4`deU'\M^iWl>8TZ]A#-XN.Mh(r-d-A]AX'-PriX3=P,3;ol@.-ao4sUW +?Rs_Yr0M6^-FuQX\"Ue,Vef!eJn)KQ^X\lHKA.as+#+OR3\3]AlEcJ['07m1\X\OG[[C]AZ$GI +F!'&`=L=f_bDs;;Pp):pSpEbYRWn[nNIA!1jqjo6:*='+7;iu*pusQKqjBj>BpA*)\+ca +rH2ss$'[fQ7UcX+i5dE^:qk\*mhNcj7DDd+l^h%-+r +YTNb-A*0naXL#<&celjCEo^6Zc>Y:eG`H_3;n[\VBcnNHoO@*gg:NG8=*Mc_9WEbR`&,*-&L +AE1^Oi%IoVFG1`In$uRpeD?KqFDTMIos[R1-"1b]A9P"1Eem'fO!Cg;iX<@j<6r^!Sc*al&^9 +Z'\(Fu^7'JRHe')[=cF\AJON&"/fn/8`s',5G"_LQ"Vm2e:o(4;bL/Qd52Um3(O27d&p>f3I +'Qd_7/UbK`+b?j(1u5BA7l@o5mST\ +h%p!\PE)A84*r$pHmF.o-(U_:1-UX&j!VjY=##%T&]A8A,bAfb7Z,%NP^&#GN1;hgH\Gf09aQ +3W:o$'iP/\!Jt?k]Ae?s\)KEqeb3I+IdUs!GP@S)MUDA";b'Hi>0Dr#H2TZTC-@tYc5*+/d3i +K]A([MrLX!M#kH'gPg<58tN>%a8&X/uj0VP&I2<0e/(7*T+P8X&2p61=(7am]A5eRdSd;Y,/6@ +p?:g;JXM#;FCClmlf%Gs!n[XrNW]AQ^B)7`.<`:T#D5d!9W:9t!!H%!u`OC/:l2L8EjmY!:>4E#pKB +0!gVm91*UJo0ctJ?C1m(nB7:aN2G?)YGj`+==:W!=2Ft[.)<24*qEr9AW=\R#?\_ko/f<<$: +pT/i9=K0^udVOAh\=lgX3/o@DQl$*e3/1mU&`!KPk/Gn2Ls<+O;"jfds"Y(L,EQ?orgS)5KJ +-X:IG+*Nj#rg7A0kqS42$]Ar\A;6RDl3FWRXSJ%\Ll9l-lkr?bnfg$&]A-Lk4/00"V^>o-(RLY +M00Hc^U8#fL`gAFt[kBJ!mb"E_u%H/G7*OB.V!?^]ACYWYu,q/'u83H`"mlR7qSjMje*m`\e: +M5QC$;7fV?Y!N725d+$Jn\jeqfU)G.V=mX28^Z%FE8dd!`cR>S8.;p<+J%LP90a[m`8o&3U^l8:l6O$Kir<$5%-O#2uWoiIZf:6e+Y0rV`+'Am^I<_S(BJd` +G9hVs<([mCN/ji+B4%rF5JqVQOeBXLJEWV*:FOm3p&V'#7hM9HYc`a+7MsGVLL#:E,YU2(b"TWJiZieOhGJW1\@ +@uB?ee@2Z9;#I*2I2,;7XKZHQ%_RYJeHK8 +3KW[L`C9:Rc!dND[69&hd[f"!TWe3B)9&dRe/Jl"GLde_(H +&P+lb+KXr-7Qt@-IV_;SZ@2#RIN7'&20qKqkO=WP.6q'^#H\+84^U2jMrU$`W.U`6_km:)'s!F^9`s5I%r5a*UGj]A9#3BVaOoF^Xb>2g +LF)Hbk!6"<@]AU*!hB>]A'_n9^U-;._QXHoO!88Z9j]A$PiOs3VHk+"f%qOWC5g@'GnL`&6A_Go +A4']Ae;u^$Cl=j5dP2$2]A$84:'5C%!D]A/!'l>_KMCqE5a-fC\h\HaS1lJp1D%hMHQX7s*!rdU +CTCm;0r\/B1rE5KNF_W5*^B=HY1)r5=81%m!S[Z;6j"iZa1BUg<*;G5A$]Ac?+XmdVq`%quB^p7k%/=qRni!!VGUo=O0UjTQI6n]AQml9L +PCQ;3Jl&-qOm4%hFHoQ*"I785d(Xqg>phi1?qA"VPihOB*$h3Y`u6sdsU>Fq>jfp.XA2[d/: +/NCB:_UXuubJW=b,m8l&5i]ARpm/-=h.^15G(92B&"`Wi)EdQu7MjBi$!m%R6VLIO-%Q&UbIH +YOIa2]A8OYF)QsTPg:Vir)NQ=i;U:%\N)^mtLNWFj#"-N#VoQ+gD;g8WJ4g^C]AtC-oKT):n"= +r,3_@02pJ+jN1N[kT6A8\/sgbfnndI'?W2'=Q\$23gH5T&W)E +<$5Yo.EHZ]Ahm&&@'@)t0Z+`5t`'q(i>FbYF?m`aXfgt3F+f*Btb\4$\X*au +G]AVt_Ct#&mBM`iMST2?n'l+`07LDo%j\rtN:U+YaGUM@,=]ATA6Krh@@oqP^kraXV65[mYI%. +e)Q'8GhC`JT#2*B_Ci8/@`!n,g!7#']A]A!'#3[hMdC]A0/c5&`+h"!d=bUE-.?5WQ1N,M%/I)7 +49(OlR2)]A#]A^GVc/1:?8kU`JG&7,,44Ma0W9Z`/E2:c3]A`&2"f@]AWWI_%@YrRC"hG/M*\kbe +OQ,`k)P5uat=2i97]A"+P?'eFjid5Onr#,mFJr)hZ-WG*#.]AVN5tZ*B(XF=_bCq1<,Or`]A3ef +^GYdNN6n5eikg4:f3uMTPenh&!s=D[Dt^OV51B8%CNS_b^FJ=6Di#o0Ale&(U4n$)9*I;n,' +?0/.,'8DeDRF3&KJ`b>Aj(//uIb<=Yh$Z%jYtgD_(RfB1=Uoe0Eglo=?_=`J),`DLU4($1u2GLj(md#;N7[K17)O6mg.7q3e)q-6QKhP +>A.C<;F>)qP.!=Mou=(PhF_/+6\\j=R-##-_Y;#f6oYaoFj/._0EOuRUX0[/FEU)BE_Ueqqu +s(_]A%,FU=hFp+nU!.KM[s2%YIR,N-_14p`rARi_7[la_0A.b4UY/+oN2/f@kn3MMLTaFPURD +0`W(EQDDDb6M:mSSjcjdnI_i;"gI%EO]AVHA9eC:YHLjeZ*%Z.U0BI=Y^#2+*KLp8N*lmr[ +7[(gHq?Fa%[!VR5@"?bXd"FT9>Uu0]Aoan+`dVMYD9%JWnIWJ6%C\,U]AI1qAb:XjG_FGW`^s_ +8.:B^TR0'H_nTPKR;+=bOf*`Cu`j>]AV)dPq&Shg4AO9+=UGLHNk0t"_icW9qS0[sqDj$YMI* +:F5iU1@]AXRoN_B?,7D1;!3?P+hoo]A-/fjJ3F&s8I%tI,=_W?bfO$rt#Cqp#l=T35?CfZN'qW +ru^M]AioD/:9+?YlmD>'QKrO_01<9%eWXHkiK=/Ye0>9KSO$l$^,J19!!',]A!D6VXm.E1H1+o +1VX]ALSZ[hk[#*.l7:Lo$Y@oJGR5="Cd2DEQJsZh;jp6\iLAuSRKE;s0&;1f]AH>a:T%TK-_^N +(CdJ/m#?(39s29PUdc`/[LJIe/VI5=?l(t=RW:V7S.>CgdD&MPShra:$4+p`YdQk>RItdX"9 +^hA&]AV^`@G`oPtd$O*_2JQ)<(EoZQHi*DUmYe7i>a9M,3dK[_p\I*?B8*WYF@8!(>tf_=]A%# +9287B8L-iqoja+^oYC# +C7`=6LkXGBF8n^tH,,@[3<5b&EgF`UW!/OaGl`53Y(LjX=I4[C-/t:83X6J,/`:\;/t(\oBb-d2]AW]A\H?=;q# +7VW*d0U=^f@KYpn(%Dgd7/@M[5g'srFZ*j?"eUBaP_p!;6[6]AR4sV_ei/VA;^qep6D6R\6:Y-@L'Blr8\I,NZg5+QN(N+g\22`l&"0E< +i2*[_:9:%=2*2LKA[%0);C=o]A/#Lt>'PqGSFX_`'"]A/hu6b5Zf\/fU7u=o\!\6NVk1;>`(Fq +DX^#;2V;ul[UlLo-">/Nn&"&P_./usH_2j$XQ:Rp6=BU[fXZ=IL8q;[oW!BpF;1@2fN^* +;MHq4,cSrU#sC96t)ectq,7JT"HWI*t6_*'HW/[rZKoTmtGDnHNNCBplYa/3is94<\=FUcR0 +IS!Z0W1E)=u_m^]A9igHG!Y0<`Ta-2\eHF>=a""?EN*J=F_,UDXr45c6=[O[qVkD[nE@ZMh9+6uS[#l_gpj,s#UIh%GC]A,g;B2VHfLtobpgSVmY4X +\^\`V`Q6i.]A2Tq4A2i7d5KDXCki[b!o,_X(QnYuN.JQSU\qnN%HF-Be]Ag7GmK4Ri2$g*lQuj1sm&VY#U_7<*Y.C*Q5':DWRPI5O7PqHnR4T/LVFF.pkX#389\!`KP7d: +/br?X0@0`NFa.+?$/4P$<-UpH`eGHb2jU?J_*gf,YB2:`g6A2B8/FZ%l_RSgAr\T2*:5=HVI +k8r*!?iieDn"-$ATbb/#KE_8CO#6M?7kWOg'/k$41S9*F^j]A:R#@k@-ZU"&b5:S2M9^>Hp]AF +ne1Ho%o3(LoC22&RK728W/b?d,]AIkij;VG;cH- +^L31O()NJc]A;Xn13f^9S0C3Ni'Q4X-:pQa37nQub$0DQa!9GB-ZTr=E@HA,?gLT,eIYL4oiU +'e)^;\(!A'EeI)]AaO+p!2B-B(^0pa_ZTqhODqOc!$H%EH2m`h)>N>P,Z<+cS^:0Esg*S'l\u +RhG![V1\$ObdPM&U-SZUmg,R4f-iP[T]AJGVdIC1mcO0=m![Mq)N1Lq70-aa!ec_q_cBTd[8_ +tgR^1.ApuHc;,'_(a\tnl%u%odGBPl'.i]A9(3N79;d>RmkMZgMDJV=ZeZ@foA5?g@XCap1(r +bOSdWdud`G[m<%b)MT1O44fPisj9_O_=$lXr;6@muB%*?iDO$G9m6[Fc[47di5N%!J"Rd[n> +5>!*MU&DiZb[8M0c"F2Jf,:lN2]A/AnjU:fbm%KL`Dt0,p8fZsuAUh4WW8]A'SEUJ"+-XUbuie +2)R7+q06fb@o85HlVdRiG\6kl>>gkoN(9dLH>h(>0-hBe^"NpWZfQAMEWXWLmTn'A?(EGn$"=XAN68V\%&nuAe'k>Z49as)t3=#MD9fsJ_"FUKq +7[nk=8;)RQ#mR:AV[T.jhc4`2PM.VcZ#PjJ +sP#@dKmg:>]A"^gEFlL@,t7AqpTk0'!&,O&YiWU=_i3-(jS5(_1qo6M>f?\Zl%oiZ>T1;I<%W +._bH=Wr98n)/r0>Q)]AZ8-0D46A&fS!3`[a>8CQM%<<[rhW+@s)LDI77U4p_9KEQeSd49-0#g +a+B9BI4e*_V'U$h#:%hX^@m^WkKJ0C#q4s_fqU*>=.mL#/&nG_*?H%7W-g;LKAFj?_3S3B)2Nbo>iDobtMu1SLD^d]A_oinSi(@s< +p?AUs9cbugZ#*0ql)=OeGl+N4g%J"L$0r&R&7Sj:d9[h2IfLY&KfJ4'WbgnS8eR8PPN(o?q2 +%8cXg+r&+YBgu3(!cqZA5$`sO0CS?c&+.QD=e6dQ]A&a,4Slr)cT'EHmmHYcU<5kf!YKCcr(1 +Lqn#/$gO/L,XIKX#i>eicr-<"H5rBp9BC9-SirYYCt@fGKI=_rQVafaq[Ie!F.!9/5IiY!L1 ++osb"6q[\\m(bOP=NNp<;IrSjEft_=&Kipb;&)\l\?)-M'Z3&:IFs5+XalgS5h[W%RQcp*0)TI@AJp@[(H`MuS6P4LJEC5BB(8uFm +3L.SerMI+1`Yo]AH-.AmJW`DsiEqc!=ULE7JW"DgXq*iOQM[4ABEu9.b*^=W]A2BuBpNXZd^^a +,gW]AYT=cZ=*l@*jp>G"]AjS[UWlSUNj:%Mb"SD5VLfT@56Tbcet5=h_bAi`F#P)Y[nc5XB7RJ +i*sUEn#":iKD$OuDZuCC;AchulDct9^PWnoYLhG!T)foP#6-eS'V5,MMQ(GV:Xn_#h'A;pLM +SX<(dF#pDWYsV#/2-a<-I\d2toAI1kl/Tj5ROCD;!W-ou<3G;p^_:%a-Q8[5(FHkctBNj/rC +J`/YUTn_R;3;JN!hCX17_(=c`?mYb1NVEX;Y@k5o.Dm3EmR:(TVR*:_:mcN-MJ%\QTWK5^"3 +:a$@_Mh%fSQ)uRFZe2L[^CIYUW-d3*XO\^$bOn"?C0k93Dh6=Mp$?&Qdi,B01?;\>QEha,dbS]AI/**YOVDZ=-pFKb3j"J6[d4D!h!\9) +b=M>;r-Ljq;E>@0/3Hm=kO36r"EcNs*8m':gjMXXcIf+3/>ndNn8,4hM_#C,dXgZS9"#U%$E +J'80iUX_?"=0[#JNW%pQ$iI,77`97%%eI&!_2$SX/I1e[oTc#-_cZqcg&chW^8r)AGVn<5\5 +Kd"Y_NVk<,/%qi)I3rR.tk-sQ$,nD\R\O#4sQ\9L*9O[BIh]A>lF@ZCPNQD09RYEWoRT1.*\n +d=r$m9bLl]AQfTgO^CUYX7=)I`s)h?mQQEaQYbJkb`G">fqHSP=SD3@Sb]A=P +RO%7D\T2-GK==*+6gI6I>B+#eMnSs?>[leUeLVJ;A":2A-aEQA5p\in_,VQC&l!,eD8t_, +.pLF@2pNP\KjkYD+na"a33;h8$b""[]AKaj.UmNa?pnYD,PMnt))W@Db7J%^6hgnq/(> +(VHsBNJPBZ0g,PPi'bRV/O:[?-B;3DENPgWnI_XhW'eS0;tC!mmIBjHCCJUpU`2X[iQTY;2tC'mBp&%g'4UDXq7j2p==r%;4f;5%-bgeHMYVL`4SM'*a`6r3j+ +o/f:.mc$5"i6QZa;sWO01<*Ag$+KF6Gl8%1X3FXhNY)=3KAV[u`>F6H;k1'kBJmnOU-,$\9n +4GV%1Fc^a(SjhpS3oYIHQras^e#7BAZJk+sp>VX,)<5^H'lo^!:DAt?:,UeZ>W4?@8chNj55 +_Rt1ERCR)YdE3lGk,M9r2/VAkoP8CplmYR+.!JHHO]AiFia+q@7lGZ>*)Z4,OI&`fj?5A&*3W +kFf>1+:L-hB4%gRf[A0r&V(^Q>f+S +`L'V)#=Wk,rZ[X<>&8VE`k?Z"TBY*J/h4-G&/XR?+8H\!CSD-QnbUD_q>C8=T7 +9:K]A97+ifARdn*7)L(*`I\N%VcT"RQ>Zb>mKV/`V9=;"dko7?uVJH[GY60jsd4\M9__jgMO9 +LI^KN@/!@:k&r",83.U"D@\"h*lbcJbODu--sHFd'Il>4QnNRd,u\'t7B0o_n2Ys8SC]A]A"'` +Uskrr,:/04Pal'Q/+1N8efd-B'$gb*sP@A[rYCSLnV=b\EK:9qdYpd8Yd7)2$nMe,jJE236R +72)d*k/,UF]A:A7^Frn8*@eDhn.aRTb1P(TC;f%WIm$`G,h.(jXn(m'qY;,K&g\8Z!t/Ba&2h +^eRSs*!9V^%I%^07!g>p`KC.P8QUBq#A94ffRC,:K1Cshi9_PrllT]A`EqAKPo#4/Ypn>15r4 +QS[d'=9:jD`i!DVrd7YY]A9N;L,<%VP[k7[MHVB>JP4!^lsu]A:>M%D + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EVD\PkB,g1VM5.-^"F3P,p]AlkSHeaJ;r5 +iHKIYm\S(O7+jrZqhMVem/Cn`u-1D#6Fm#?#idZlrkd"VB1;+>O10fmV6@"l$eDDnnd^FT$K +J$bT<;mRJJ!M)c.K"oIH+A)uUkJ)1;r?7UK_Gd+;M2eE)n6'@^$>m4mlu%n1tA#l;=9r;ZFM +C)K@nTUUWM6QVHRe+VUuV3UrLL6X\]ALPp[(,4sInU(S!GIi28k\D2CZI"(A?l0[!BWp'c_Lah9Gfk;95M&b6?LE7j9H">ETLuKpqi.=he>B'CAl3'EAsWq<4"> +9S3_mqm?7j5M=^'?Bf+>=gOXS]A=2_.mT16J%(KO#L3!(V?0G87-Y3&6kNB&1[Di)iK%?)m$q +<3h\dboR(aeER/d6#G-ar]A6pr/uJ_Wfa_5;IfkDsFUM/^Ol@0\_NI>q=Tj4X5DOXEr^.gu^% +oJZ&cL%I[KDBST.k-)/Atp3E)[8h<g^RNt7mj((0:,Pflmt&"21^< +3mL.82&Tr82\MN/2L%oV58=^AP-A`'P%6r2*OJI_`-Lk7g`^LY,9@ja6.,P9?lJPqc_Dc7Xl +/h]Ad)A]AJ,f(B.X^SKn#`D3GAq[Tjb>pA"34:G,$4@#1X)N=f@[201iHdS@ntE3Lrie-^/S+Y +!.@8-D]A:IqgFcGE>gUm";a+=_PrE,hkMT`>6[?njqH3VrA*&Vn+aii5X2f^Q6$d4NeB4F8N; +`D/>kqgTB2;0j]A>7dVa$-ljr*Z4hM,U=@:UsUp5JPpU"9&B4O?i,d&6+8>+,IKIHBk +6M<)Omi$!HUR1Ibec4QI>=hlB)$#$\4a%TN<7$N95C3 +@0u=8-34Trt3<6'7nO0@\\eO=_fA.SWWO5QYEfl[*4bt87/E(R?u_$3-1WTYu4okkUB:#$^= +H76bgUjrPscAQjZB(Qk+A/B9o1?iT7s$\rEE3P>-B:g1bU((&'-oR;GI:E.&m!SD6rjIR8nC +1`6u:dm"u6_GONod@eBh)7L,<)`!1b$]Aa=;-Iltik@aM.i__#gA?;TX=D?TQmSNBa@"cFGL83P_8/k-QdLA)jS$_cKEUs&RlX:kq"(rCMaRgs<,)?/6+7QZW;A7jP&$nK:_oBY +OW'&sH^>CM>a$f`W'V!VY/aGC0)l_Gs?dl6!K`i$t8Q_^hS$a?V_J/ju>Kp_TL>dWVL/!(VZ +mSWmO=A;;.;PCZP\`e^pNOKm)KJeR;(;R_re7qMi-AT.B:U7,8N>)2:+S0S[.@OMg4A\ +^$6Z^R(B-M8iFWe!bMA'T"br!2sn-52L8nSG\lc[Bdd%BGl.U0k2rO+kbfq&%)^4^ +,?u@@:_%Bg03%-PDqkd)UD8NT^hc&Iug4=`>Em+d1S$,b*[hQLb4%G*7VAr"Y0`W4RE3 +hV?;9k8+mLQEBhuMLdbh6#nVo%A)9LQg-')W+L:7OJN_Jb)s7q^L=(+Y,(cW0:^9$Z; +4-)eoSGMtJne!fl'mri<,=k5!0%e:/dUjp32@[%XX%'&SKZ8VVE/Fa%73nj9^%D:CSZJ*B[V +1*hP9)[K>D-EK,ai&DJ(emDP5V8]A-#4BRO@*='c4A'P2Caq\fVZ+HPApe.-p)WhS.2SQoGp* +aZpOIM1U\04)+WYb.6W;AoY!$Xq_49&o]AL1/B2jKAQ)0Dg@6>HDf:+DKe.=hMGE!&&8TjbE_ +GsqPJ?M<.Rh!s2crRf?:`7Tc"H\"Y9!mK*1McUR3O'skIB\Sa%.3;2)Ah4Z3i[=dc1)*GeA` +u+N*#c*FlDVi(]ADtXi'!R^O/2/08,Xd8C,'kBudgWj3iN:l).agcB8k?MS9If6#cgS#"8<$6 +!qjjne@/?NK=oFe%&gJ)"bm4`rH[!"]A3G.K.ZY"rBbt((*Em".KDEm70'_e4NPS\Z4R;n/sZ +t;q>p\4VD=aaYo)9m1sb42n&?ct#mlEVnD-,3EtALskD6Gn&eLY[P;U8,86M[$;[/ojlERr# +ZILMEV-P+mdF)Z7J&bG6?dJBQRQ6)2bu$!OZC0"=8:bm/uFQNjm$a;Len5>hVKS"AaqD=j9QP)Zj5 +2R4nQ0$+(n:du]Ajoe/LLdleh3Kl>Is8\8\OODSD?f$,"b@*jYices)T.)Dgot3P9-G!_4Q>8 +$@BX0Dne`*+$:".$`>sqAi3LPVWL/;]A,N[4:3S4q9`B7Q=1l(GVgZC%d]A#]AZXqa<( +uRX(HX<(#(u(I7(7YjU1Pr?(spFE3\>hjU^T"?oTVZ&A7^^n1n=V^-rCS_#HFF]AZc59I +$]A.G=5c91c:pk^AN2 +RU194UGB81RhA2q8C$Wo2smAj=VIDY]AbmlY9UjUnf%tY_L\(3F-.=!0ju@O77m]AHpcE?"9@59dJ>[S=c4 +;BqMZ>)P^,^s4hp-n+^tm%%HQ8%]AJe7gN(eedj9U6"E[]A]A5L\'_,;o>^,FYe +B=;jBV8E`>-ZQ?bE!D`gc>r,5ZXD8n1F>=Bi6nY[^8e8s$0))ioA_U&).aT.ViWMJba'4Db]A +R\N..e]A&=)GQfYPnaZk5h>il1iK7D)-g96kdG?*6LQ`]ATFT_7!Rj\>[1MRXgB;aLbn'JF*;e +%\c2L+@/?.PbKKXBr"Hop1JoK&DOgsN6<$-C]ANr_H?/4PV3/Hl\J(iMoh.YuQ&L +Y;I^3R81fpTbE1a6d&Xt&3A8N_i0&s'7Xu/P@'0J*KO4LnR*Jhm$W8g\c.[@:&h"7I8iRgSu +=lD)M)m2d39]AON4"p1>QJ5C4]A_TRn^bfXtTp3YDUg*OQ1e1Q8o;?*i[',5Xj,LfX`GgH#pTs +$^1l(54KQ?l&nEOCKrDN7m +RQWm_/nF5b12/a_^Z;`5I@3S +qDe7Pn_`"T._DPpZ5JgrUE*089sYZT_[\N25Gr*Ci$^IcWHO6XL#+F-]A# +UobO;JNqU>q%&`9Qkk2!Sr(>0OM^/0*n/F]AQ%-XAn%?a[!O0MArL:]AjUPk,^YDrZ;3V=n?A+ +(rD+3aof:8_.H0W6-2A'M5-DCG'CL&NfjP#'@5k^LK%^gps3bDlM)6;08!J*526<\iNU*jbeuiEW\6QqF6+2,Q\>\ +;T5(QjF;CITA;/dI"M4O5"45a;jC&8"1YR>eufZ"_;H3ApSY';KL=,+4-kRMZ`\Z<-[$m'rE +G@mJrOur%[aDh$(5"N..R3rHie0S`X&P'F.$;CG$OXtb:FTJAH=oF[->grE7bUc7=KJhUGh% +FaG0Le=Vm0YjiW@V1m@J).@/%3YHA$HWT&H)8&(RMp\l-uhEXN_ZXM-*"Y7DK.\Y\]ALnoOs` +F5>Af@c0s:RC<1r(+QG!%^-$?u-=m;V1/%V50oOEC[`4X1(?c/b8o/B'&('7V[9bST:.LDjA +g>2_B'<-<$[JGSJ$)p-K%KQGeK7;Npii'39g)@iLoqL,T +&&4G=1/hm*2#!Fl7K^m?V.cid/&Q%"JV^luj/=gG"-n`3s8?4e4-j8cL'"m,P.L[&ToT!p"% +l*,H2C+">_#f*@sW3;e"Mb+5t-]AK-\-#H=Pt(^-\$([!KjTIs&W6(.!uB+%qZp[A`dC2\+c# +Q*Eq6Q`o]AM\WP2)I$u+d-L7X>k0nMFI8kO?P9*Cr%9DcOcV6U;-#/(Hh1UT2'a#*"N"b?Im9St:fI9;Rl7FY3H)DfHhS +lqe=Sg>4'9D6>(I0#>l5)3*0q!*:4@gd/gWqaaH;WEH*.VtPs_U5NQkMrgE8=fGAFc]A,%B3A +b`aS8#Bhb7:aC=[,MN8sjg*=c9*C^'F,sie2>iK[lY:1_el.aeAX'J1CR<4=E_P)b!cH<&O` +3bMU5(VfZ.Jt)0hAh2=#-(S'S&AXdu-W'LbIuo2VBHaIncEf2dBme7qMuQbq1O;j,[N@9^n7 +c!6#[d;r@WP3SU,_]A:tFO--"sKF:\r4qI8I?f!<^qb$Wk6'l`TeSV8Zr.'hkCl,fhS8f+IU0rKc1u"3'r#;;<(q+^^tJue+WadJ^*q +I6PfWaqOfgHIB*.5$)"_dFYif!m:<,WJ:M\#2U5c/KRsC`bM2>T(PBHLjSj8Go/^M->6.]AI. +W$U<0?nA(p`(]A;?O64OXJ%8&An)RZ!>AYU,#`mC+F9?NPk&`8:A;U,$RC:pti@nEBY\,IM3' +0.V3=&XI_hGmGMLV7lmOV1EUOE%0:SR<0Q^!gUW$8*$FBi$U*9$YPe)T&iGaA"3%70+t)s7S +]A%lqBWf&^ZdlcmP:n"'nETQdA))"U#VI_^,/X>bKT@q[o9X!1GJ`VQ:RDL-'=fg\F"s\<0/qnSU07+,GN3NVCEa0?,GUMULm +j\RA'N$L5QuGm.\4s-8"'Z"\[M348V7>\g*_qZpo?mGE0hgK@BN(^DG^PBcdBlS/P)&i*A!% +8iU><'QM;u+Ct<(;&EspEM&1Ac)AY@ZX4%K)MLR1<cuF+p;t +[aL'AH]AdrR,U./'\:li.ePC]AhgDYZgLjk[]AEX,JfKbYJ1*F[?f"`B$*AXmc5,<:(%UutKe"d +_R1H;u';KT;'Wrb0HNg%G?7W0I!$H)5Pk]A%-na1u`bc3KKXh4Mj!@"uDiRnnfg?OXSj;K?Q4 +3br0OG$gHi*oGHfsU8t2Z-CN1E+K1cQ_5N"e:T'#dDM=/@Rs/eb,#g!nL`=[-9;4meXWEBIj +d5`K*-1s"5;+1iAnlDol8&6)V.PhZ/o8ZVH;eIH*Q@B1Po +a7b]AOCX"(aP*1sR)m;,!3LY8mL_NE_<#RuC(8H+kZb7ZkDGk"a!SV[-X.naO*dCJ5X=1la9K +9+Se4-Adnq6d#(`219m@9HlZ*M/o3/^qQEPcP/FKhBdjjk]A-Wj\*E*e:jUMMq$<=G+7F +@b39E;[pNH,ZB,Ak/#/\tf=(JKLYe#9l)0(:DP'[Js7VbJ%qVZ!2"+?%TA0:R+`@mcL +6lHua7JCVI34#$n%"-X%Pei%VPhQe6<6;biTk2H,8922eUVo3C'Ck1P2C-j,@"j]ApXLJb@Zf +]A<9djN-p&kb)'Ut!oV'tG#74TI,su@S,#ta:8+=JY3orM*ggI/)%KpUU:'ZSAC4u$;3*8NWm +\8Fa4OIS1hfSPNYRgf8eL=S_=I3L\/&%c*u#c.jin@/r9*3)UZ/F.?&gr"YR+LiRtbN(T:VW +8p5;k-JS9U:cRE+c@.<$VY%!KY$GRo0PWH%**2X,bf2=78]ATdN4Hk\SWF_8h)lc9-^Aq@[D* +"6UuOT?k'&!$j[`"OlI)^jj0?o2K16o*H/[F19?4Jmn^Df!T8Q]A+>K63!3mB57\F$-.mAENq +cJ_kJI:gKpEq[_34\=&dlm>'_X_()Pa$nb7M,1>IUiCVF*kI; +Qci[.n!Z)`98P^.ACu!(D,st4"nH!7FmkK)BNm>aPF7RHW!#uF)l:"P-u +CZ<0idl2g-g:p73-`;(gXTqKuo"CKfWK]A-[S[!=fBF@SlM=k7k@Ufjn+9oi/X9i!r`WlNf/n +;o[6Aod9Ja.-9Y/OHg515AuYpXM6T@^W@WDTfPAsE2k-kR`\ +*6Id#ZFgQ%19E8f:An14klZ"D74kPTX^3VH72BX2jkReI`-O^T<^21bgo&V$NN*D``P4N?7- +K:bX87Sd50=(e5:nqJe/-nckY;$hjG]AcI46O*:Gl/!3+W?^M*sZ@NBXLH;Nq[_L3=HB",m3p8\pf$;a.b* +o]A"$cFtdI)#+s1Gt8D1A2"li:a'!mmaX6R6GqF)N`Nb)q'jC)WiWTEQ.]A`GHh^/'f+fTOZ7( +DRa&j!t.t(PO!K_#l:Bt!bn)O]At-Oai`'=9A]Ar5eZ^[P*kA]AR!\f[YM/&q&1R^S#Zm![%NP! +/`!jPDoFidMQ_@@i=]ANY)Ym:\HHA\6'&QW[KZV,/[aKY)Bh&Dnf"+8iU9jqOe*d%ke<]AQqNb>5hJ)?:DC%"R.6B1u&pe[Ti3>"Qq,V_=58#;ot>Ah +l0Y2@=2ADWZgOOF91:4YjiU\s%Q#Qg-uU&EmoB_]A6[n06;\lZ@(=.(\NEH*9sphTh)jp64NI +J@"fg=25]A-(E\?IpeaPSe!MuB_,*s7l]AH +De;`D?ZrOap)n"cHc>"3-Mj-=Tl.rpN*]A@aqt^sp/[WbVN0Ks8V +XaZ"nE%N4&Q"KQS5jUp_*rOT8tNgjN'?QrfP#B]A"Y,]AGG37pD4l"r5(KR.P\&\(j)i7o;+Jd +T2;kuHdfXn[j\MU('8jP3$[FnV!`(jLi?Rpjl`s*6:`%*G7-Q6AGX>2fS)HU,*\k/+RrI$sX +\8D"[J*3OnS]AMQTELKC!Aq&os.BUkq)k-GoRE@Y8.s`p/0FqL6GY554Dh`#;Y3g+FIiK_\.F +k5JUW:R@"Es),o&?N0M+.*KZ8a[QH<)Q$"!H3j*dEjd9!)VaG%n`6$9!YN#Ls57UC25uS+2T +4*^=eeG`XcJ%)mi"J"UuZO?4l.Y2%0QJkU>#OBHonq2)l$bW[,or:fHc!nT'ugDK[^@2']A,) +K&$_?4>oF`p1,/#5(&PsDqDmuRaPl$,Mku=:H"Lk-_,s<\9hmnOJEt\ZO:BX`.X +.s>L>>s`.0H>R7W=E.V+6CQT*e2N?R>jG%C*guS-]A$9%q##V8p[6.b*lVM_?]AKtm[TA.FCE; +:T^L_kd(&UA;aEEgXXEh>[R0ERZ6o?8$4pI[aniZagCeL3K&f:l35!fR(Q7DDlFCh:V"aWIm +(p9o\*%dd-RQFu5Ylb?m:;V&@aBiUHMoEr>4:/&gPHt$CZE,n^Un`4f!&oQSQEZNR",sN]A+]A +JdJkQ!s_]A4@c^qaD_T)[-;T\JKo&JO9biSdoNf[+BCqN8\b%S0&\;HoFg\6.5=uuM5dXaRA[3J6k +kG-2p/@_QjUfRM.n&9)\S[^EK"eMT6s."#h%(J/jn[=)M7YA3o$50;C>s)J=-1kM+@R$7,;= +kIOu?7\]AEmV=A[9@Bp5rp4lEKn0KLPB>>;F`C9@-%99f&`nNb,70\POOH143q4G$'MHmT0%UIoXD`jAG-&9PX7Uoi\f0*n9ijH;MoSO(k=7&i +ajgtJTSh1Xl&)^n7^YAl.CP8gE$i&q4ImY`dYUJ+7N(NCm%g<:F2M!Hi6tQ,ZBtt8FDjW:ZT +"DLDJP`T!pbYo.9V1.4PSReAt]A/Ebj8#GF&e,Snnh(qWP5]A)c`TYLPA^tpKob3V +NcfA#2W\G1/JsS13Jd"]AGi\9&h +J\jPo=#]Ac^PDUgik,48\TnstDoRqTr=ei[gU^_BP&lpmi[1TYgIo^pp,2m/o>01]AeRsbT_3#6.IP!HRcG)[>DqM3<$pi9jO5"1PV^*3%4on\Q;YAn1t +Wj'$iWq4Srp+-F=P-uK#*@.cD`=o*janG.6qZrtT< +m?FB=i&,G?49Zn8GOh2OQbj&dQ+od#[7MULr.%bK*1ekdpdg88i[-+DO1XLj0V^uKc;tA]A]AR +6*,qCXQ`1i%$D4i=mU4G+b>=A6(%(mg-j-3A.<8oal%iI.%p$fYc?:W(B%cjdKgqC:I3cWA +XP>\q_s3EUJ.id?:-Ri`F5,)QVaHT!s4t]AFEI?.-Us#!$50LZndFV.bT(LE +WksqMN8->t21-uNoj(oW'4GJRp#3Bt3:nCe?*Mt(`PQ$*P.fp4D5+:Jn)VOB"dr4rG1(?7W1*\,-J>^@e_j\W3U4ScQo75@\q/kb!g>T)@[m,*@Q&$\&('\RpV?5eK$0lUfph;; +PL'`I`591epIq/_s#"%b+a7#_>[7;lGs&5KbaF;&!ZO%RJ2?`SKtr'eE?+9$-fqrp=OC^\,3 +XduT]AH]A*TsclDJPIOKP0T(:R2:u/sMnBo7FT_hqY/U([_IY2L+7)3pupj/kcXf,`^/J1h8NP +6cB8fj7*M-H9C`imse0UCU>m$g?FCg_aqg;8V(7?uD=naV#B.L&&Th&XTVr7K3:6C-T-Z:8^U&2q +b@Q:keotWkgf(L(+Hh\cOqEpQ00m3gFTj?7`SL>C9;4@:Ohj7_^s)b"AM^Z4$K$ +Y(R*;qO3I<[<ip"EgY:*:h0YS)3P5\TeJVoAO@5#MJ>C,99FQ]AgK\1 +'0XaOW:dBH\L\:[("DQCE"+Sr]AY6F%O;=H,t?)lJqQ*H8R.00>;sanR;IVYA +?I?PoFLs.p%6]AW8?CW=I.DR5=P8iU]AWppTjQ]A`D&V14+$$@Uab9kB(J@jI]AFu+j2V&S]A]A_PfZr.oR3I>##ZQ<@gs +rd2fh@Xn9"jZD4Lt5<$8PWVknp2FXARXN5K=_ed"km(78!F5XdeNeQ@8]Ar"j6Q;/WUmcED +t^s1AajYnS"$PJ!ql^e3j1fTKQ`(m'Dg?7/c(V/#Xn:_XuZEI3HRbOju?.C$oF/M2h(=Y@k' +WfW9:'_e_:*j5a,)I*b*\,$EXKsNg:NAe!4#qusCZ7U6m;d#7AW*Dc^".2tGP\jdN:\q,A's +%]AuOTSph*o,#AQQ'Ou372ndl)U!?G_ppZ_\I@jEQHK\K? +Ash*o<&K$?&a!%Gm78c.'cH[2]Ab"jrS-\eSLnpek/5fN"%VC!Y4gJlU:35B3%)[FK2W\#]AfT#6$I0r*q).<2?X)Z);+2"jk4^=JO3=jtV:A(2? +'ko7\A,TB(jLH]A3Jg>-( +$%6hkS!g_:m(=NrDB1 +qp!sr.+1iK)OV"kh4?6Ge&,oA`T46n'MFql!S9d$0=V[g"^]A?R[q:(#2hbmkFAlJPUr:9rQ/ +=@<*bMW=]Ag0Gclm7ROpbq1ua;'17Uc<6HW<;b,g*)S:oUJ5AXmP +eFo5mI@,8;3HCR%c'DVAA0]AI9nR>$>ZhR]AH&7lpiL%-*uEYD9,!F7s6k>Qi2qJrMflP4A=E:[Z%]AqS\1(2I(X-*^> +>3D@uX;A,HlR1>:314qd!'+IhkQA`G^glb@;>5?rZg>j42bGR@[Ir\ttJDf#^?6ac,r,7Pce +T.er,'a2c6V&nU?Xik7mi@TPF"LV?G]AKG^(D"FK-\DV)2\BrFVb;',Er_>2BCMkp6E.Eq(%! ++C;Li7/&sb.Uk`&d]Ak=p)76R0U%;!?:ZRsit]AD0^ob=`M4J@VaD\M*mF2e`F1Vl"3sLj.+*9 +0mRBs5J%@029Qb:(tkeYN_QtE1KrD'#l06Kt)eX35:F$MY,)At,W_/$l3!g^uF-('?$M/Q7b +A1.B\NXS[\giC7Ubt#EO;I2c5,@*0C8$cV'Uog/[qs&+dFOMY/ke/_$\!pX +L,a.L2gD[P^\)F",cL^J%agG:.UqgSI"P3>;AD4iG5gQ6%&W +[F`ocH*"`WIOd&!2)VntUJ)s0VDMFM!"I7V-nTot-K>G?O(n6\=uphfVfC*QO[dom5XAY6:^C.$`-\++%ai%=[uI1HA239chXS$`EP[/&#o>Bm$mX +Kj1Cu-hr1HpEF7obhk4Hq?,.mdJ5dd@%HD7oc!9)<*A)Zm(1ISo@4^+JCrs_(raNSK-J)N7W +Df>).Z[G3!V6*l^-jnF.6cJI.-+&GRjoHF;/rd5L^O0155@AL2,2OfgfCD0Ap_[qmqsa!MNT +\YU:DI7kVu`FrJjn%\&;;j!?%^^rc2n"LEI$R%R@i4L/gjQ3M5atjY3*:'Oo[A#5/abN%.lGDP>L\"Pg.s +$C/0fCQeQhecp)>77rHrXQ;WH,=T\NT.bk.AuP?M)Ic[hel4rL\0m(6=Y7Q\=HFP=7#n6>"E +Fl4FVoj.rGOM_;R-FWm)QdHCUtUlT3GRm(KbkKLG6@(h>$pfXU3F>?ko=_PrCPN87K%)0XIWkl!aT5f[`H#o_Ik61d'p0JYs/$E_:#& +4tfVmao@dKR(.X#NZjG_U3/I#T&7"$V' +?%-1m%K1iUtTQQA##TVU!++PV6,D.*3Bdp>qm!h0ser"?*EA6F[o1/QEJ+_@9p)7-q>13P+< ++h$lRhA!Mp$2k8X6Kc#k.C5=#BbYV6$+OnjP\9A\(jY9`EC"#ZA1f15bB4b[0t:@1ctYAULF +FV?CZP\JM3!uUKFZRJRpI)Cr]AOe,DWK4:Z1e->\rC&EL+936'(uh0A8KI['430'(K>X3`Y/0 +2]A/"+^i8VDRgAt`;J[PFSN/=C0;Gg+U'.Uks$P&XY3.?;VcXV+KaG=rmpn:mH17 +GcM)Tn-PCG6b`+)NOBJnHV3j--,GXhO8Lm;flK6OV#$.;dN/]As1W!#Xj1m.G'p%@!0A=DT/]A +$G$.+b[0[YnNLp*L?&9)eo4N"*F?Y7,Y'U*=H_MT4Rfr*/RB8(h8&1&iBb'[U[,dJ[Z^i4)M +EIQbNLopG2de.Qm]AKb%BKiS:L#KltVZIBln&Oa.LqV(K#gip=:FL.;r3XCY2d&s?ZVj(=M0fX&fd*Y,lb\e^Mak);1BJ+qDgYHh]A9/!1T +BW.\.@1Zk3bMrEX`/W[[?R;8h867e=:)d*l"CCQLF +CP!($oG,9Gq/:cTNT4&>iK*6]AB'X$m\b,Ad +Uo"+V#NJeN8,%j8&]A_F3Sf2t3_1BJj_+!;jC229tYV0g%cf\\"/@3!!lNLodI83qSXSI61q6PTsuGPIksY1nLD7r's,! +9J=64G;0o"1l.o_F&CAj#pEkLT@WjJBW:ser/u=VkLd;nq:[jdVQV>.d&a2K1/qA>s9kS[GV +mAKQ<+8t/L2W(>0-!*>h[/9b`6M56hT_%@+7%U8Bt<@Djfn&Obreq^/'sXRnaI)<.Ao"9%#D +RnM+Up(iLo5f).)li!,Sh95d//!/s4D4Uas!m(`baoG,##%A8C."e-I>Lc_Fl$:7Z^@:c/pD +ok64obRE/"mR;qLeE?*\mY(k3LH*0QUm7e2B#pXTCH-*1=*\9BqT26^#F%&o +S8/hY9t.:C1to7dfD9eX3[T`M#u1F68tZ[G9*uolX;^SZ]Ae2.6ESA'F;qWlPdUe;jPTI2ZN%$f:7R*-12aV6fO='=339'tE$X1>%f`8CagOX +dlbFA%k>RN(#>I`B9LXpq\?49YTj+$j05fA0m-#X@5@^14!!cg6LNq]AS\rKnQ(VI<.r*4Rh;nNB)Neg:#S"!$%Eu[%>=!LkoH!dih&14;u@.FKXhd.`TH9bn#_umA0p"OZq*t$J!m +nC:Lj7Ig\8OD@dnmcV`IH88\b?CuD_(0+Ic`UGeZR5^Q'8kjn!cmG+Jb>e@FK7/.\m!YU@:L +Fjh+Xr$eTj-"Ji\`g?"0iJnXN3jS'GMZ6p//u+9c[?t@*Tpe93n +2T49S>C09"T'(u)1,mMg9_V66666sT0]A'_?P6.9m(kaF)_j(d0ppfN2BKpDk(TqQjT8pCbF9 +&_tI<#$pA&Yq)Zdo?r5,42=]AV?@N4PsAdD.N&@Tn(\4jE?;]A"j[bEHOdm#:^k3;^`_NW;KQ\ +2^5TX\@"5/pLUp%J!ZdTVBAqdj?A$3sTD"a#oA)&#OYoqf$-"TE?A?Y*>hl+DVA9`oZ'r[Uj7q/(9oY6B7gtDDE60PNbreS0`3C8(XP1*cc=;h$D<,s +LYr58Kh"1YXJ5W:`"@MCuM=WjWZH/!n^q5#[>kq\U,%%nQU]AJ16E1Kh@UWS4j!t +B%\1joJ5E#N%*N,c`+oM'0Qn]AC6n(O@o]Af4>e"FH5Z>H!"09n[J8tSFY^n1-#]A_XS_Q22eRi +4e99l-9/fASLX@X#;fDG,.;B%Qe:UL2$g)A#"Y1clp0OX$/'oiDl3P.#,YRH:S5h,PlhBHYE8O"u,DIN#CdFhq'ZjG(=a +j.1XDdR`KT^;2(W1&EhL3E +1@gT]AP0W\7'^heu%iR=;J3OMiQ77scEQG?GMWj:j6=^aVd#F?M6E\T'Y_p>A]A-:I9(p[7m:e%T06TYSoZN"GV[QEg='L*7e,fWtYF/*ALBP32aA?=ktRnMU7 +&i#nq4N#p^9X1\6o(u7Yp^45kAj"Etd/o#`+VdMT.;d,M:/PYT0g*9=P[^,PEF*P%#e#'bBF +n>?]AJf;Kd`rfmW^J>aqP[u'ER8R3u<>@H4@Y^:?pA!4,Y?fkbrg"nsfK3kn&j&/M+MQB2O#Q +=i%=VC>L,U[$/4mE[?o(GjKR9,)*nQEEgfTT%(N(!3g:i*ds1JIf2JdiX=L3BImG%h!p?+>o +HKnd2QhG(ZHo0K4'd +hF[GLIj9_#!S6W+qcmN1XiDdA?$0RfE)WrnM%*):cX$n96A)hn:lXO1M!V[Vl-uRqA_( +K8]A9gB..eElem[1WlWibujALpAVT=e@d[_>s7Ya;m3`G/@%9*69%XY'\NO3@\&\cYrDuN'.B +.l@:GT<7o*5neRpYtE_n"0_ZFbJ=P&+)3a?B)KHB/X5-ALI:X(pWdDR8u#<7"'ald5aI0aP1 +dnKtk(sQBL$CO)BbI`"C7Akj5$)\L*Q^gEY7-O+pImY%U$*(Z#",o'\W5D--g!CkgG%LI1>5 +[%(pG>.M2W>iM0C0`qnf+LND7(mQ956@od)H/G_KR21ek%1OflRQ%k@6sN\eRSjcQ,.0=cV+ +Q.rK%#!BOn<[JBS52Du[n`X'n,8cX+KW"Vqn@cWgo!bOq +'\X^B'_[WlP:Ro%*\V-MA!ULDu@hh0="6Td`Kj7mpWhkQnRiB5%(Rp[A83c[$t_1PW-JK=lm +D!n?1"+@<6;@KuUkE3IBMAX#'TSdk>K9&&8hc3MK88^*:]Ak^djaElHNT_U'G5]Aq`CjkI4L4j +]AL`QSSN!fM"CU;)jIIIWTX'+]A4cFY>M7sR+SIh:d$%FNGFPU6iKF0lPDHLquD)KN2qT%0Xe? +"jK!%7=@k#Gf.>3+5&i4TIFK\5L#?%gN2N[R96+q,:9S'm*[ptW7ZkITCsH9k-k +Dh0_\2YY9;1>'d(LGHCj2\Q6CVMNRtM#3kZ$%Hr-%N'C%3l5@:@TjXZijaik(EI*#LMD*=D/ +Ai?nM7blIqA*-MLaf9I7roRV_b]ADn6BI'-Fq&QSl\[/mT;2kO5.^+AOX+"u!:^]AlL?,QBZ +u#Z8cn![`nMLA_+gFFH;1IGDjad"mSV&?Vm\IQi>m;Ne#2c.CM/Sek.gA143XH9_!%4n7"Sq +0(nNHoi-H3TfXOR/88`03k'*)N4VQ(Fm+6#\8:59.#ub&3'A<_nM3EgNc_P=C@$8aaWrEgMi +lq0oQZ:c]Ag:>eZVJIYatlh_ClcIB\T]A>LKA(6>#$:<"^QBsYWj%cDKDo[i- +I0(*4m9.1krR/)5S%F)i'$QZWt:/H+\8;5\_8XFBbKTM(6TWi1:\=keKXpW#&I#7JI\TR\LT +=dR>b?uc\P\J=Kh"+#'X,G/e45h8QA2tFaR,He"5:\A`Nec-k(46Ag[1(NXeHC@8k^'oc.(Z +q13Z]ACqR]A/7$:GW,@FM`icl&NBr&9Fh:tfG.3-Z80P0._W!2!+]Al0P<_U%AaGK'h!eM?[n8)&+Npd>% +p0#ML=MR?UKIV`+`nCqjI`R17TY6;8tQ')/=M]AAC2@Z"'UnIq^.0*6le=!!)fm#rQZHb%KUtX4mM&m+B\T>P?`=2H\CPbrRRNaHUM4b9&[D +Mk<^(htYe[O2p9L6^49sBi!JLO)7T&3Z1Yfj9aJ^fi$B@4l^h1j +m.URR;`G(_HI6BFP[?]Aj[4N,X!/t]AD/^dTJHcu3[$)6TS9'!'Se&,V)))6W24J\A4&7%jh/6 +)!DPB6J,3O(!mK_EM\Do;AS4^j,g?G%@7!\mfZC%G=Zos*lc-=piW'H+_.lUTM=\TZ=\_9Gd +UjaPsHU)beblJ!Y-;#[L%=-(;,hPGfaKJ/kHd/DG +*A5ea>>!GeTA\csRiF.:"j9:a_!7gM=/h]Aa4-jcQ1Buo'r>@&(Zsr4d2!Ik0!@(rgQ_f\7lV +Esa^H]A1'rG/2%s&=1'nPD\^Ik5*S2Af*8d#>u-CdX&J`]Af^.DU:`$/D3t=@)uN16--cY`FQ7 +h=gM_XUT(>,.T(BYlAn$kh6oIGOFrQ%.)A_AYsl[Z5B_rNdUl>+5"Kc?^j5@/f>6H[8H_ZCc*^^UAU7Pk/q +.k6'&!',2E;Y*Y%PD-gZjf9E]A#=H4!r+ZoA/`R2r<[[e-?+L,eBC-;:-TcU&34<+JWr7@G"O^&WU-;bd'="0;+(=8<#p$B8mlfEm\goI4T;[m:63CmqG]AfI!Q'q=!?^ +enkoQoLl+g-q3UD=YWd:&LqOe<3K)K]A),'kUU$.d3CYkC +=eMe%2q>JYAK_oI8!mnfH^4X.-#X+muW0,,mDRPlZaQ10]A*N,%O>QT^GbB!5'r8,NP*If'W\ +g;DaQON,No"Ug1H&s=6^k'aHL'<7E$!Lma/'7cLk2"j%"$%DTqT'oom_*5mW<^5]AN%AK$.9? +ZZ*g'UU+0?Kr.B#*8MkoD!dm;;hM(JR2@ij>iRE:+>&Cn:JmI-T$D%k]Ac+C"]AlZhA18slY(s +Q8'S@jLCj;9ppCC\q0lcu:S4+8S>f:Bl(esKqk5;K9oS)lK("q6'beJR]AC]A"%pej +c[:Got!(j[U)u\YOhf_S_45.K\T:*I9A2'Eg,H+>6s5ugQuQQk;5*,qF]A=0[DR24g.9+nJ"F +htloJik*Y4p[$+hZo42YIN_tE1o8@pTAi>RFkjtc.&kOYN[ahCNaC!=Y!&o$sa@BA*ha[qWl +k*,(c;\\DGCM+63*3%Y4q0&)&haQM#5A_k+JlV!-Sk\\[h,btT3C.c@dsiDmS?2%d.rV-W); +(_'HU>XmSXEYF0/Hun;BrSt1Ko:,`-TcG;38pr%7^b5.,HKOSDed`%VIOJ\?9+`egZn;:%)k +*A%ml_,3q`0mRJJDMc&sE'tD=gR3Kq+*,rd[c7u_>e#^O*!89VZ3UYITdEo6(]A1l8?njj_'C +b0F,AtC4KHt/:Ag`HC5I`h1&P[s7DiVgXeT'%+3VIOaeJG#!4(hke:QnOl1\P3sr";NRJK-o +3,;n-7/Z1m5EK2glIeJ#W!3]A>>_TV/#=^l%lUA^g1@dJ,Rm)V1dS<6V0FMF[TV6bM-K_i8PFnnN^Gqd:BR1Im]AQjKORf4s+ +-BSAt>Cc/5Z&.6*U\\#+1t+LAH4CB0"U@2TBQ;2I0!Ci4co!N`Bd_f-<<)bLTgGLI8,+2T,5 +m*mi-9+.3>PBQG@:$"e(3E9bUJ;5`c!4YU4X+IsifP!oSh0,LML25ASVjqMI*4,qs5#R,f?U +6>EXb\W)a#*;9;,5ajYl%G:h)?G<#b8bB:7in7.70+MR6]A(,.!ee`e@S#P*Z?T_FCb'_@efY7cpRnGrsk;u,a>l)a13CT;Nl!F>ZpCs#`jcWGY" +sl?Irf#)Gb9MJAd2j.sZVmXY/K(cHU@%onki5A2s'dfEMdBn!g\hoTchQ/oPFU:VKm6N`-:C +Q&P%P=&m08l7CRj?_)+HMB_8gk:a!)UM'J7$>'^A0n!J.T%5nJ'`YL'D)uo=6>8L^G:WLJ_h +SO&-pI-$FQWatB:L,(&Xef,_gBb\^:I>lN-$d=C=`qpl(:RHI9Os+ME/kK/.(VDVLb/*sh4 +BJeih]AK>$nPH!Bk*Is[Zi4Y!A6f/n^m/=IOMujWWm9:*!=]A^5%4A]AOk""jkrukZ-fLgIS5.2 +5T\s*IiIqO#^or,ClHhuU2_>AID'to#HCV-T!>WB$uPonW96B7'n(mPAgO9kF6R!_emsBhiAOW`R!Q]A$7o9]A;HV(e]A(r+&j9 +KL>>%J8iTKP;1$tuFi$*=.YRBI;PW@KPu5Y_^2r=*?h@1e9sSn@3Oc'\2\_3-2M'-Wc@$(f\dm.nEX;En5$R(B0JZ(FsLC11h]A8o+) +B"'s>t/>F1TkoodI/=;I'm1ZhS]Am:OiB?P,c2eFot]ATKks#SXQ7I-[fBLZfpLmQJLiHMW'DQ ++%$\\eS&kZQC6eRZ-8:J9X9QVMrguT'Y>8O,*q0&c>MT*"@[PHZaurrl')MLGJm +o@^Hqf?tg6iCka^6kIrlX?j`4f:cf-+Efaq@B*KJ6<'b@(PMao]A:F8q!ogA2H7+ +%_VA`EY(MP2Y5k@J5(c:bg"ZX+$ +U.XZkr,EX>39&hb_HBpt4!=r7LNpA(j35-2;UlXYS9YLk6X'JQT<(g>b1_Pq*[3. +PE!DkraM$:Q5s!"hfbaI4[PD4gMQ'd1kl#_kjjXh/hk3FZDa+BR#Rf8gf63V-l>)a'%Q]AVnG +]AO-:2=lg.1VVV5]Al^.r2ZTlJRNgK(^Z\<+1gm>CF:1t#ONK>$(F%Iq1B<$M]AjqFlnaT>+B>Y +[Ab.7/JWUen#93>KpJj/n+K7:n9V"YK;6spm/PQS.=H9";>#Re:%QR&6#8CTO"RWECY79CJ,fGp%6 +58lbn?3gM5IYr(^#MR8qO?B"q%@59D3bj^O$E,e4PQEN7`.fXl5OY;?9J'jQ2aGK]AE:&!^*l +e`\WdARtG]AToC+-E4>auIX>Xa)[B;5n_[te(RV.oJ?pjC(Csm$57+'.>NffE.?]ArQ6Suc]A>Y +CjUuF4+6.QtO>pQBf"$IUt30!.8V?[`c+VK+Nc5"<<^.Ju'oQQOg9i+Ak7dTWeC"crtfO06< +J7IgJ3%cK'&4M<:SJ\``;OT&P_*b2DRpLTJp3&>-;U\2jjJ_bBo/!/ZI0\be1mNMm/3[T#fMZmij':s`IM0ZD\hnW>bG;nCp^h5qY9k +Ohujbm,?I99"s2gM(p2^g&!GoZ2//X=B[/BKMHE;5J&B7on;V:0U +WkGVQ5fai_3gmjT^#;\LCTok4K'j@M.kS/`obDgDddllW1Jb58P3qGgYo`1O!!-_h(p^5Klj +.[WT*a^)ka>tf]A)7BkGpi9NMjK/@,:C'ug_k)*+^Z*,]AT?6U)fd&$Ir1%F`R_ +DQn?=47SC.e7)'9rM@tUB/:4(Q!uOd$(W0S"m'-HVk+e]A%Y#rD#749fK^1\8^lg-sMFV +a]AEW6BA+3m\L0PO,WQ%;b#8OBj_n8:gK/I]AJW8TMPPE +@!akdp7$&eIBOtGFn1CCrp6Oa+a)?#E74[L8[g-R6'HR=pF7^-;4"ITeDNBTKjY^QE13Y^T& +p"B=W*+WBhJ>02WJ=$D2G=I$K$6=^G39%ID,$O_S.d3f[TS0A1X5b[o8l1[o +&?94D68e++X"6HI8?GG]A[Z_.=n%sMRD6BX9:YO)qUm5%L94NHYCjjUJ4s\6]AN&$0(>o%e)AN_\OmqW>2Z6n61 +\G\O=(u3>%4:iKZLRL< +quk+KseAq%l:4F9c*?5]A..OmJu7WU]A4K^P!&?SkL:0Q`4(6,M>F3CX16#Yl7^dgkWM7W_EQn +T\;q"`6^-LtQlKqCA@:&pR8u:NRulUZA)jCuraoS(RL=!M$9Fj@s%H4HLK._PVZA.6%V)]A;fO*ngDYB_ +.X^odo2F8em&kHF=kriakkN3<:96TdoZie@\$'$r41d^OA)4rJ@/AVTk:jYP5"-XA(/tG%@b +RN6@$T(>4ea&i)7ESO$G;aQ2GD)>\F(R'VFZD0TAFhO2h*oA66(*gFt'aCXT,GcPT,Pt,*>Q +Tk*,1(^nE^bOG[WJ\=R?^bm!@k8Rr(OiK4!1?RD_70BXqIjn4W5P'dH%(2$O.#=T,2sdMm"t +q3F4-gZXq$9YpU_hJ'.6EfdfItKZoS1d@Qt*$) +,AUr&ObC1S'Zt!9TVXp$e`t\ +$(H,H>1$%m5/#8Dh6rqE"bdrcIK>o-(HA(-'@YifOF="*l&bRj';(ognmU\m.^S&s.EA:BFeC#!bl +HG0BUrD+b`;+kZ=ngAjt<8B!i:b(a2s/.]A+H2I"]AA%b8Y22^3bm1.$O +Jd12.jkZFA5eq)>iDn^i;(Y<'>%Bh>>;o6rZdBJ)_0Nf))=**'fW-d$Q%F6>\PVM5!;%<>,! +,TXXpo^60ID7uE)dcL9f=7d/-*[3;V!)hK\NfH$4g)*/^0>8A($BWW!-'IS^r+_oJXX^:VNJRB7MM+l7i&=:M[-Sr[Yti0&EXs +I)pR$U3pCeSE.@J#(,:%rU^^_hb`qLQ%A'r?7Dk.[[;W65;BeR5MA.acZ]A#m:lX:XrUaK,@f +rSgT(OR,Pf=_RQmGQ%mFq4EMg,o%\@@9YmMSZ-f#lYi'i8=_72J1b=@BsC3LX5:s]AR=fZhN% +[CpKd2PJ<+9=+irQH1C08D]AqDQQ4WEh:/E5tn3&.>c\"ZW;LBTpV50#3q^=*d=gJkm?!Sd;; +"oOa4n6Emr0h'-cki1m^G`ToK!2Kbh%huc:j#;.$LH&D#Jr-9RFCC#CBkgbSEY6VB^<9*jiX0\&XrHD((,G)5g/08\9lJ7o*OmH>$a!>4M9qtcP@V$qK'V1pG +Q$LYlRn:B"lY?4Q@>C1i]AH8&Fl&0Y.ejJZ;rWJk8`@5,P#X0RbXmYB&O'jdYuPhs4lQ.mqN6 +$Mae9[,33o!Lpl3$; +5L]A,fPZ+*:+Pc6s]AYCanCMQ?<*^Bi,g>`4A+'lk-m?77FW>pKE"P6uff`r$\`LWn\NJKY\O?tfE61smeJ$/Z24[$T0`T)`0AQ?+>2X +-qd._?RjG(2Z:$Lh:(I[?1A*Q'UI9`t%m!jacJBsZ9[TpJg#)cZ4bfEWnN[Kj&DO&Z)2H&eJ +2)cVpOd]A0,Z03/Zt,V<2-X%Q45A"2pFXZ^\;$LbQtl"IC!;A<9b3qZcAr9k`f3_c'\`8jSRJ +/r[X-SH$tkSMY-i^G&q/$nG'F"Q@(9,Sm'JmIr>Zk)hZS`r0;Hgu?i.QpB'Gg!"!*Q)!_9&C +EYM>MP>R]A.J-I@7p`.EksMa*u5)'0MdLoN;[V7aWKu:b3S&5?f%29XCHN\gBQFp?WHW^*]A*3ZCbok,O +DOf4CAOFMO71tZ!ah+:MFQK7f!?UrJ#XT;]APFD?U&QA':^[8=*A3nJ4W]At_M7@uP_hSCEAn= +KG^Fkd%E5a81Vq*B4AE&T%"ahLL@cF'>=a%AtRSMeg!llN%4;,<4[^IN'+_Z:tA&^R`/b_nK +T6P-t0,hsZF[)INPR1/kr\l:a5[9:bl23ph3e0[H-qn)"a9_2:54\;K-4IN7_f!l9'*Vm)bZ +24\PDPQ\:HG#*Pqp`1Bkgs!m6kT7"`0 +/u^[]Andh@+!bO/'2DX,GZ$#repI&-6J2IN^fnT(bh9$2s4]A[.4T44q +[g/:@g24SS72<"d1 +O-5NDFjrDHB4&Fq6?hOqf"U2P!2P@@e8fT("uHGW7pS%Jn6or*Af.5OZf#,n5dXZ>1',^f!U0O^4(r#(G;g+-^K<,5KT?Og!4:!sf,At&9Cp +$p76#W3qh*+jNmlle3QIqL)$@=&OTGmg"AJ,Q/OMb/?e`l\$TfQJf8[3iVoG_,*"<(HqtYqt +IaXaNs3)QrlEr(!cg).HO?"^&QDU+!+nM(YZSXU"mf=tG%N=u/G!:!!FWhpuO7jWWLcNc+(S_4*jKE@p\TZMh[P +G$a0Wp3/I<&CZ+R96QbH&_8$nqatXA#+FuPVJ)'R*\f?&I!GD3Z.RK!c^8mSBfL4G:V^s/HQ +Hf-&Zi]A\a4-Gu*RVCob[G1IZcL'`;B.^[;e/dqnhCcP2_=[=/MJ]A4lh_)+8Wge;sM,h7EAE% +cb,?iriqIro]A*,UuOB1;oDh'*X1Ap([agXK4e%>`J$CBS7\p4-L-b5re`,\R^m1G^m0YP@F; +pN,V?[Y+5Z)W"9ofP^jHdLGSFh,T'6XeZ224%[P!.W:8R%]A05_FKl]A=qW_u\?c.5Zh&#iA8D +Xqt#CDru#\hGG1i*=h`JfQBWA +E%G$q;,N5nVQO,jZGd5$:\h +R`eX5P7NImR?h-44i+a;frEca-L[b(?ZFc^=]A;bD!0/P +na6#_">$UJWM/oQDH/X(P6.cCKB$q@ZTD(=^f6o@Yjd +jC:ml!hEVc4?WCMnjX[Mrk=OT+OLK#H"m!)q?CWh09M6U7`i.o:OpJlT>?ER8KAac!rl!kLI +oj$B1.3pRgTE9FYVXPp6VZ0ne?VqRil*s(?W!u#$MTU/[k%gPXQ425%_m;`sltgLP<7a-ud, +^_Ap[up$`!39+,,@[;M:c+0RC!H:Hp\AZ"?r_'QB6j]AQqC*:ijK'f:*dl$$l&@Z1E0J)K8jI +YA1"eEf0f_a1$?$mu?(l@u.$B6j[HNV,1mOiFP2b?`4f"TS]A^8:O&eO$=llI_a?s]ABLGk?V_ +GKY:jl*jXCa4N[,u7B/;dS8%ZUCqU)BeHa$I.4(@j7Ml@Yr\jXuc]AZ?*i* +PJWVdka_QoR8Fo\[1mZUYe&Cf8[%3A(.\/bVJ+PW`?HTi:$p^cJ%H,s"XK)nn@t./"nr!=4]A +;ENH]A6]ADUsr#5i()F3S6udb267cUeigWU7<`&c8Q9\QQRp4U.H4MJL<=9Mm2U?_!)o(G1&&> +$Ara)c/,=I'0)^($5N07T*4RplkI\#!a;:Jeaes8)2dRCWk+OM6ISFh7g5"6ko4:]AefTat!IC6J5KR";@Y?++fP'P,/em`Y5 +tNV6:dO3H#1^(]A((i!mH_5gbJ[,QMW.*hn#Yp*NG_@a.-Ld5T%Nek'Z`=[$r>!F8N>O267'0 +03m0+XG,LSs>i<304=N?0J]ACtcO" +7\nLgJ.5qL'DPo.Ud>%,7.2DJSD9$rq\nqhT;314k^KD#7iWm:Y+[%75n)bT!PT!*=*p!740 +H[rj?FA0'6@W"U5(B~ +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@;]AJ:OG;_k$UOhfJ8bk< +.qoIEk%Bm(MD,f3Tgs6X>9$.Fh?*$k*1``OB"f(msP)(g+qj32i-C&?ZlTL6AI_>A5+]Aq>KZ +q=M:^##8J5\#l="NE@&l5Sl1I(RSg&Cdc3MDB&o6>-VC-mZ7ZLjqok]AmM9B=:ECV(%0\V*(L +V-TS0?hq.;6/!Qi;*"jn2;:j$'oS3hNjYg_k[n0,L%%SsG*jfd4]At%Gs_qt +=Qs1@ZmF_'e>#Vp,/`C:0!?A4;g&HkUp+gE^T+p%`$#sARSs.0(3bPs^kht$e3FK&q_Z4b,4 +C$^:*^f:[sr#,r)\I=3l@PEU&X(O1:Kl*g9^AQ!1,`Nnr"9Ka^(S"BA'?1Qi]AIV5\)KL +Wn*Z/FQui5EcP;^fYc.$Wi91ZI'qT5S:P]A.=14W:saB9ttm,inF@^dIGTSl-lOg6LiOP``&A +=`kL9V_htArNM#IB]A@]ANeTF[gVj`0`"MDeK>=`eFRE?)4mBWD$ej57 +17?:kLm'c8UD.a_t0q2?n3id+hG5FhQ'=11GiAf14.m'q:mrQ/lIFiX1H?gBL:>a>/lokk1h +'>8=>?F"R9AfjbfVL!Z4GAkZ;%V8[mC*nX&-&.0O&k2que:0k$fHs\$I'jTmSOc\,Biq\rF` +Z4*n:A`'QK4T=F]Ame,f"M,Y"eNTU#NXNk7I(3I66`E?;=P^PSG6`" +?_`;f[un=u1_>[/3;rgU6kr;?53@WX$#Yq5TgR5%>$-!&Ne/Z/=!l@![`\*Qm/<+]Ah5;U:KI +J1^HO>bGUSZ:_KO^;!V$b<*hI]Ajan*QbrZo$(%i5V8[>H0_Yj-r[dG)96-C#hr'=1U0NE!h: +FbW&*KLbU_L-`8V24-*+L4>4>,.dP2a2Qo,aog2"0(6m'teO@p"%qQl#.Q$/h;rm(?E?Y*:G +L5[nFif3'rW+nMBZH=6*EqXsXf>Ih.n1]AP=QWSbCKkP&?hU&E*>JH6#HoqXD81IYcqAjn$X" +t5q.d"Wc:2&Q]A>Sumd3:>'AjqRc-8Hl?0f!K_A0qWmD/WpFI;Ok#$V/LUSTW*35iUXXB`g>+ +3J1Pu#(7qotUorEtAK"ef*Gln()\q>$Zl&KGe5M3it6)FB&SAY;8)2i#$U4]A*SHSXNPS^D-$U=]AJS[o6,"Mgoj75'ns(]AF7_ +M54qu$AadK2/ZXMN0"LOsMdc[eAXc0d6"E(oG>.pDnS,fiA'+AKo,bKJ)C$8je)e1T[_q3fu +F;e(o(;p3PXjJL*4SIh[1G[N2Chgbs.Z2*2r?%Vso7Wio-dmj/2OK_=V9T_4:6uWm^2#DVIW9KoR#LT +2mY/$'_Cm;"30!0^\Hc6l"fh#X/K;^$STAM#[%">e"4J?&LZc?o:Hkb26]AC!g]AppLSN.Ql<$ +-fa.8P#pgmkAahYb;RaX(=(I!aPT/_ZM4Vcbnp$$k!7HPZeLQ@iQn1WOQ_R;bouVE*9dIZIM +YmN..S([b]A0/:7Rj*1%K6f<>1n>"XuR60Wb#ujhd +4\;mS]A/0]A-\IFK"s9mX>s>Vk%g2c(IB`^Iq(hq.^HG; +aYq]A7+=2#Ra!\Wa*]Ab&\%q3]AYUG^".+:S*:>=N('J?)8tlusUX=/q]A1Wfl*\O`&I8DeR!AeM +QS6-^7ul5):u/ +EErqLJ/f0aS#)mtKP\@j4^HZaH%>7!TEB4WFhZIB2!&W^]ARb#GSYcQoXsoi/`T1(a0V[uen4 +Rso_[S[%Z.K'L)#&+]Ap&,5P0Ms-2c=r)6t#^jbg1.,S/DI'bRAd$mU="g.T$M310#RP%1)_5 +c#Bc3irA5s+]AMPAeET?0Z2mX:JdY)g]A3tm.[KJ[.\BPeW!=2(Xq&%e0`,t4pSC6$H?N)F)4V +j#!Pc%u@n>t9:]A)aQ.5h)B!Y7n@NZ-C+Fe;H^Dqc\h=>&-".u"Rf1uF#R7ZZ#7oc,(RYmQACC +WHs0#_[OeT,JOEXEU;71#jU[`'A'sAZ?OM9C'LVbn!MYqEr4R1LO4H2PE"_MU +M9iU@s/2BBC)NaK&HT:,uLi2,J;?g0Gr+gIE=26+Jg>p\mO8BGL\1u5NlPZ+hY>':X%-]A/O6 +`kI"(gU9kEA0XVC>o:C;>o:pl99:me7MW8#;%uF7L*V6D7XB#A/YW"rNWi:h_&pqtV_f.6_+ +N)q"SZ#U_o5+Y4'hGl>iIficA\01?/RO1#QNUCMo/A$NJZ>8)\FBCFlf`83=(F(d(fh* +mPNY%hp\/Fl]A0<^c\!Sf^R*UN8P^oWAY?.>' +m!aUf.ZRcHlap/l>EQpb[Fm8A+PV.'=h%I9tNj_.dN8/kZCgEr0JJ8Ji)mWHLEf72/4%O-%mU02N1,r%<6lCZk1sbub4? +#T$f0Xd"Nj;D_LcliFt;'feI +V8iGAqYa5kB5"b%`]A7&$^G$),ZW?<5?c>>9nB-h)4`@c3KohiGMU"Ie/)"Kc\rZkp8C*6\h# +]AS%AHViQgc"bo+ZIHC`S24W8?`)4_.Ms.s#+TD8!h*oQON+!J6n+J!aY8n>k"=,U5:=LCAHR +#$6dj=.jm2mQS$TDOuKinO>RAkQhXmWN[6tQ#e@UNe)#APS!$N;;9.n0GG5&.G6qm41!X>dR +ZKT6bKKDMRe#.ZgU'e:bj\6QWeL.+IR"bJUE4rEiFf8%X+KOcBD4+/lE*TMYJ"l%(4?SO5SLQ*]At9Tq=IlTS2mZm]A0t7p?]A0C[Wui]AFd$Hqd<2r($bG&`!;%\B +c&dp[_dC/k"i?jWEl2UTlUXmK!(:=q?)2E;q!(!B@RF,.si(PERg,OCV9=/s8/q(1Ds]AED%I +"qa1*/42oA*1Wn_gAI4.o(l=UE/@uXkk9TAK!PmZ>G*QR+>j74r05jin.Z%;8qh#)>Npe:W7 +BO"pmgF.jMsnk[WEr0o+!mJ6P,!@':)&QWdMP*1L+lsaVgUYb&s`(PZL/?u5LH4VWX6dL1VR +3KZg<[b2[O#a.9u/JrY0sto.Ko7IGk%RdPF4>eck\-DY$QKZZ:ofp>g +>:YlJY*Kb$B`"O^V[GHJSB>J\_V$-GEa90ErNS]AeJeIIFp2\2)T,H0r,i +c$G@n[V#-k^KA0kua+j*ig(r9+H(`M!B:1Y_sXbpE6iMGBMmf6=<^Re^Cs+%jHBA^g5-9#P4 +=&QmW>Rs?WscY,,Q`44#OVm68DUBua9_tM$>ZO$?k;h)3_oM,_Bph);Z6(ZfT`b%kRg[7bpa +5tU0VI(lL73l9H5UC,:9AD_bt@(3\kBh/$J1tBAqGI01Pl)6Zsie*peh;=]An6_cS.1U-,Ua;>kf +4S_PIkOC"4FQ*-l\(oHaL$]APF!\)T*KLN:0hN=iQqp1\ZNsP(1b,MY`IKeq=,hsqH +DDCB]AJ>Q0ZVTLDhg_*@gc]A@ogQ>IBjBjWJ4i7r[p<'"7W%Ur_#Q1&ot4J=W9fG^2YL6j1/An +W]Aao4$jbQ-p#)j!kHGApSTC=-gS-;$Z$#hZ/)+'(j+#5Y?:cIn.r+f*gZ'J%M`e53Bb4T@j@Mdf2-C!8d_tA(KPRmcjQok_alY4)\N2M(0'Uo6lH@;NSQT4)Yj +)O=PA<)eR5M"J4!-S,ZE%]ADs;UO(3=AM-;F=C]A\T0U(/I72WOqnHLbq#oXQH>lHM5_*,OL9% +2OEVY@GjJ4bOe!c%[dYi0oLDHQD\hCmE1?fT'92;!K^EYDgn"mIW`F'>fo7Ekud;9'>[!SrA +>r(/u:W6G=WNJPb*?KbdCaU8u5_rWn1G,*3WGVpuGt$jP_s/X.!YMa@#(%U$>^Y2g+-:*R"3 +G^[uHBQJ7o.P4KOJ$HB&!a91b&3K:shQMk/&pl.ct&J:3#XjfGV"=]A:G2)97L?6"b3g]A^W8R +C-V4rfE-C#]A+ud<#J$BYNO1$Q^SSPqtDl^3)ZS2BG&9J\W;4QR.KQ"DG7W?a[X\FQYogZ:bD?'b]A7TNIBm&s!ElQ;$@F2o[YLRAML*;AK(=P +Kr"f4kscc!=]AL%HQY>SUXJ,/b''np9FH'[[ +C)J@E1XR?bMZ\'a_Le2[2gR +C8Z91A7GU@D-,sabl"74sW2d>Zb*cS>bATe+"8ee0Z\Jii0DgHCX-nliG)g*l:8`<+p=SM7M +jbagC3qYhbY2\!?&+7JX:J/fb\S(g/[A:1>MPA>NiIq3,^+`G"f8(jUc)VAP]A!:XhbT<&;oC +Y$!Z>YU-Ik[L@l'ck0Eq$GXObd<(HfOO+nQqFj9NNmE+?]A3`8;2BgVftobN't*+$u)CS5gIR +m06r$r@W<^V4`&'fH2&mlYrhDkX=`W"98QCFg:;I+(V)7)>UNZYRFNjFP`c'V$Ej2S0=KL), +/V=[":u`.-DPH&2S[#l++Ih3:1GuVhlA6`CslE-#7%ZTINJ#aK`8QMqT=#,;b>9@Batlp)\E +YWe9GHgpVq3"CEuR60Y[5@cQ3Tfi'eS^g;1Tk(PN-o5,D`[?[gfscGbXXMs=rVLq)%U,P:hZ +M+e8Zoblk_e82kIF@[WFDCT]Ac.9N1TiOE5>H,R2/J:f$f*g^'3DOWjQ +T,,`0dW=ijIj_Wp3QcE2II@YI(=U"-V'SIK>s1rrG#`-oI`rn/0Jf/2$S"'('op5^42Bt4Od?9E-K*F!XqMf6U-+(urSqq`[^gWngnk?b>T*rNG(9>4U(J^)m[nMb3Bs^(Yrb[VPP&C0N+5\dE1WRP8VeeN[ +JJS#Eb*B"7iI$EdSlP77!(S##%=BpPp#^XjdXGL*kO4k@\!`<\n"gF'd3EcDpqalJot>d`0X +`ui7k]A!bR,P1/N?Yij,(j-q*58l?.]A?]AranHNJZ===Y6)^&_O%?s4cY,G+,%mFcWZCMFL1]AX +)KVOV]AU0APW51Oj'j`A=2Q?)Ca$<*#j`lkj=)4Ho,/a;AfcFrD+&,.(P=>*L^AIbA/:HjP[% +Ig4WF[%a>inT]A4`W[\='oZ<9-@6?Abh"lASnc&=ea$DS4VX*I#&,ck`ME5:n3*YV_tRK(I[n +4n:8[R/).fgkZb/3$\`Xch;h+Q*#\k>=p@MdAIAs#.m!+%B->),TV#S4pag``4;DAc]Ao#iFc +AqFm[d7!g2i"68W2,8]AcEP?+f;QhC^[fQO)[H?*b/Cc&V8!n@j +EBk>FCQ/DM6m"L&mat\B@$m'+)3!CGre3)o/X<*q;l"!AsP^=b]AK;0("eRY@?Ig(RI:tYZ\s +,Hur"03T3Q!mN8!1@pRO*_$\\\=MIBdUfqlY!I)$.3VhMX=,bq*&3%/]AH@MZF=4^M[[ajlOn +HKnALh2aR:5LgsM4'+*R?rVuS4b[BaE4ZpMbN;fIW.NR#cUdI97TDjL8eT +OqO,I3tCm2BK/Y<:d%n>maE`%%]Aa?a^GT;FUU,0&((ZKd#*q-ca.f<&4QZe:TD:3>bn#+qG' +:USjS8LP%tASc`ZeQpH/IVds)WC]A1,/*-0-))p>LRM^/5mTU7+F"?o<6TO`XZF,Q'qGpm1C$ +NAoC!GJp8l&DY?u?put+bm)s;(CbpWE[Z97O\.7V8B?bl;E\Q@k\XDYi+R_r&`]AR+d]AM2RD1 +U:RUQ;K0r7KO9Z;b8Z-d'XT\jRst$^50De.QZdm'UnA!gmK^5q8J=QIbZsp>Za(b:M +VQpA.0YmmFQ\3 +%qd4"ba[VCRmWUZ4;)&Tob:_8^ilg&IVXlFe6]Act8,"!a`3[4f`bP"P[G(VeSO(>M)e7=#T,_B]A`U]AkQ$'$m'Lg+8A&bV_ +Ul(%g>-grH,kE'=IgeIQ1:AYm7&IYAp23qq!fDk@K=KeIod62D?ctP6r5()H'EWI?M#5U]A=F +EhYj#2Qf`-K%8)Cir(Gq4t\<.c`uig,5,%V,8>&7/>EM*<)YotuJ)4i1.V5#h@dUus4hn5g. +EiO;]A+4NVb"Fnk'iqVti1GmaSmj!gPcOnU^`84V\eh5Y-]AO1^2$'2`^`^91&['WI61>isM&< +e0']AOi&$fBtN'K*2%RnOU#XK6M#%:VLdd0]A_/,j. +@:UsS%(=T_lnkN6dcM0%Wi_j"`'Q^j^*nJY7%'+SqARP7nc["g% +15Qlt[DRI9;.cei")AE[QWG!Y3Ckue.^u%H<(EqWF%?IMAG;ZBm-X"e9>JE8G?BQ@N";^u&PFX4V& +S9%Y\5KAB$Rd;J_AQLeMOe!/BfU;a=^D(2L)@qT2$N9B67`?QICp)A(6s7hsCa8MtJXBWgI> +\:D)VSd&3!frEkM^#-=3GcI()g;d,5/0/3lBn$0q^X'R=eQU/lmPLS@[CA(hbHjg-9QjOl@# +s`=0:`QMe@n$PDSi7<<%8tde(;e7Y\^$5i56r]A^=;i-=!K;&t2AWNoKB!7^>H9N;T#s794$mp$c0ZenlmrIIR*MfmgKeN8=uaj;Q +F,?ASLn!0S%/:63:Q?0/rgbnC!gcc4E+m/UB@G8B^E.hE*aW2VB:'F;8tLd,^N?jD5i`HC-. +^tGUc+^/Li&Y,jL33>\Qb),MJXKYQ.]AM(9Lc[)hJ74j:Pg9)kF_C"a_^kQG-l\p6nD;+^'Zm,Fm;!$o< +pj^]A%B"e>Oe[M,TBD4%H3Ri'hg:XH$oW(-=Yb>00F.Xr)GVlOo+7nD#=(V\,)-RL0jf3Bl"V +jHFa5X4uNG&)[))3k%?-,e,/D+iQmqse$^E1JZ31RHE&60s?`"Krjp5VV>Iq54X1NZZLY*_@oY@hOMHlLam3-K1)M6RqV?)Z_Ns>-#oq1HZXdDU>=pRp$c13dVY +4NBb[WK-^.?N3meUb\ZVJH7,)mnF/X9gpMV2mWZ-G!AIiK47k+2X$D>SeQ7uAX)++ifCf^.A +7lHRqfX4PPOSF;@k15lu0euP.tIX:i_/bGfI]Aee&+=VOt7^3Ikn/=$J,NNW*+IXbCdlZh\Mh +;Zot9ubX[Q)#'lBD+.:VY7CV&a(V*JEtXi[:UdXQIhPVASQd0?j,28On)*'@ZdQefI4r>;/4 +G\c2RoRg+L3\'Jk`^%8q=m6A+2\rf-0U`5S-\6$tTR+pKrJ*tr-8mR4'o8Pb.!Bm*tFNl+rW +,*=A/f@SUq>1sh\2>0tF->kTPp!5=e8EtL_tAXO)EuKJPd't4Y+QplrB4"%Ho3:MVL"]A]A?mMCl<>r^5G2Gp8kfdb +pL4SmrYNis-?H^Pe"!#mnfW`,l14nH.oR!-V%Vo;C;GqU5V7V4FJGj_&1,%4U +7*RRLa.26K#tt+cX,lAVSBY#dpfPi(bPWo[(Q5%.]A"D,,k=p;0er-TZ9DagFg:F+Klb+:Q,l +rP:t*tl(b1<=;[qZbPX1#@-8HSgmRR>T3%brUjX+([Y+1HX?T\rt&kOA3:H"qkKftjJWoc[Y +q]A*au00:a_pkHuZB@idEEZk=N1=n8"cR:h%rKnAs>m=sPNHikJ6I1Ea/eH:UVQld6;m'DZJ- +piqPR>;MmVc@-@-$N`Thh?k1oo$GD!qkt8arBK&3]AU;`^oDch8E+SI6U84r<1T%$FBrA9rs* +9*/`dJ#ta0WYT*GSY`W*Q<;b78gNhpTq:PY!\L3/SnclQXq8^KK+KHGsSe(X"DVLrDT:G$q# +MeY^eTj7&LBYEkb&5BsP]Aj]AU<^/b0bC.db,nLM]A@*u$cl+Ani1B/F!gA.@nC4umRn)h +;,LQqdH7J<-FeoE)aauPm@UI=s=CuBD,Z;-@,+aU:;JFX]A),%$f89(.hK]AMtE"kX!+n^V?+- +Ho7Eib(+DSGiu*lL>(phJA!S'D%0_o7Hm+K(3%/U.d]A0Ooh@H@T$E2)\K)dlNn7m"\Bk]At09 +0^5@/ZsoSekI/K5'".n.0J&5_"_*ik64@3k`W5PhL!Dq8^D< +[:rNd<:YJGH\&@pc?7:\8`EpkCk;99bV//#_37ep]A%E4AZ%bdF=G:+5V4F+a7hI;;L+GR4FgTr +S7Q7_%_2KMC*t,L;OX_Jd??&O3j+um_k6@m+I,]A!BX.H(lW-ZFsIo-NTh\fpW=?8e:5FnLl[ +%BsS><9_#DsPm45=XE(]A$T_D$FDq@HI1h2&@^W@c/G`3!$VhF@;eW"hG@G-gt]AQDA1^s4=2E +#hr1f#pXWp1CKVII<>k>eV6-E]Ae@%Mbp!X_)_3)A^4/1gS-jOf_e!jZ1\o0`=I8jcAL2B!f" +6-/\YgHR@;3.BI_%l]A!-NAu/a]A-iDOijguU*H*U:[VL$69@/9]A\UZ.>B<*U:[^Rka:VT6b@. +YSJ*oh*V*5(^J$DI-m5W`qS3n5&[eTZGMRsT@<)E!&g?+<@_KqFPY(!c`]AT4sKF[rFM@/+(F +(?e;=2F\@W-6*S^0/hpBj-B0!nBhbSt4]AcWupO0*oOb9$2+RQclRpT2Z)bJ,H#30(QlAN&Mk ++OiV9V@_.&_h6K5rGOTN;h/6H1Iplr6YsQ$dU8j%St%i)MkUaDB`TAt4ta@sg/FDJNX\A6aG_NdSAc&pu(e +/C9U-)b]AER2ubR/);VE"D#41>eaYhWDW(B;l1fr0ufPBncbILdA9oi_@#BZ;a6^( +IdJjiK:sYDg%'m%$HacY"Yf`(p#kINs=Ef5-3KNHSCVi7U,G>Vm*592"Tf]Ah!GkS0_g +oLJPE`.r<(_\rbf.iO18rJaY.SH"7E-Id@5i-?6_4dpMbO^&..SFQBV?P7O?r/I=r`)Y32Tk +jCLcJgD4KWk7IdYd%f-eEhF7JcZFJTqF;@l[_G^-rZ,r@i&P1$S1MP5_@c/QuaZ\7\&2<]AG> +1*[s()Vg^bZ*C&J%5?#!2qmTVm\5>Gr9)K#DIqb2b^YbNGVhOV99#qX%d.s3,3jI#nm.bk=@ +1nAO!4C,(?R(Wq3EFtc!;@C,M0;:.*O!_]AOP=BKEXZA9erK[SY739ldI>3f;7n.kjZ4f4q#G +Ce]AU&(/?NUs6mAARMr*RP9,G@E8!a:gKNB03^/4([HEUXIT9?!VF<&uOi^E1t#$&n\hG8l]Aq +%\<"Z-R[T^9`@<_5iaA):.of\H;8<;/SWTc_Sp+H^71j'S3]AB'\4&7Tqg$+Qig>6\V +tQaqA"Um;>C\a9s'XHF!g@%A\91Vk#kCok*.k/3P%3cq+H#9O;jA_fV3Ke$U?J:[V_+E:iPH +8IW>[ZKehbh.8c/>=!a%lN.G3sX +[>7c^60'\i&?K3P[id26>+$DXN2pXWEOC._g`AY(+WaNk:HuhO#ZBA=NHJt2N&Fe4lJbp1A7 +tC5Oj2e&i'SZlRW#oV;5Cln;Edfq^0hK?IXC9niR<\b\:%WgZ]Ac?V*iYU^e]ALo'sc=6hI23A +,L:K3[e[@=gS./sc:^82iKY,7XbI!l;?%[mI=.?P\(`@HB`JrimAi.m*T9dkne7qQ*Irg#-V +aF7.i7*qq,^-i!LgOuBeQc40V]A3-rOXCmU?((JL/f9rB_^p>3OE-J/b:E26q'O5HdsZ +335iD4;HWB?kF/1]A3\3,:C/d/#+,HH>`k8&iMh1<7%f$5&TM +MfdUifZORnlF%=fKYBXO+3#X$-d???O^9 +9K%,e7Kt[pZemgJj1S91RVrGF"61qTG%(U/7.dID7QXD$i:GoB5lJdVkY*s9N!-OIXsU$KAp9r&IKBo2-5CO[FE=EU +4KGKSt7V?/k`B>eP]AT2R2J0j#Bu5<-o70:G??(?O]AR!c*9['I%VCeB*X?UTGJ1r*9#KjKB:,EIg+Ct;#u0>D);aBq]A8L\EA +B6/C$Cp6-SbAGb(MLlrF1P'.?$Zu)1OmV'JP*/L(ig@&4T7t!@^ckII$O39IWAI@DIjg%-]Ao +YuX2^V)4M3i\D@%&oa)66hYrh'$V\Qi7>C/$fe%_,ekE0]AWC3fUqKL_g5%b((Pl;Z.0\(fTe +;2kmS+h[qGQgp/PVP`E=nmM*E@_KY[iUED4]A`_7!8mBa5D(8p@h:ZOEWkj#Vb@!=\L#[4>e[ +!3Tn7nK7(_Umo*-S[,c@6-]A^P)6\j2/n2IX_s`FVW0af_h:g'0VN)D;Id:*KRGqia3*5'qrV +jdZ(1SU?(quXfXa+D98ee@D9C.BbdD16jSc!5?=^_>G%4$Q"cRb;uHQaELb"_/-#9\iUBpSK +[#Q\-fqob<=:Er9o:"bXiF)k&-'[..Nmks[F9Ss$2IY9Ti(_H3"NYdL5@'e1eLH`O?OC,Z@' +2mHhV0c=5rl5(CKE>G5=7;"$PW\VC"nW#I&Ip/rOrQeD0L6=C,>%Orm`1)ACt%GZi%`K.bqi'^&L>1W4EIrB@7G/X+F_nX;a]AT>3O%#6$AN4f& +X]AfdHT\)om6"[*OKOnJbfWm&:9*hZGNOD-cqc1'H:N6;,.MRON9]Ako0;"Vc0\@_O6&V^jt@r +ZEltr1r>)EYN^ki.[`Fsm[#>g_ +k(fnlP8A!laZYh6g+/h[IrC;HUoY\qhf$R7JptA0+Fp^K>%SMSXMRK_^6b<)7/gg\;\@QWheZ`0r0=f +>*hN.3bQV=kSGNntE-A\FYqcd:)X`6TXdkE6h5pjqFFM>ZnEM8<0*X0\l\loZIH%MI"2P@Bp +Sk):r&1A<5BihR6e@!J)&3eelE:N"4CDBl0/aiXWnp?Y;IH[6KifUnm6,cPD#XVS,>o7S,N^ +t8R2Tlo4h=KG@O9-C#ANHJNEPQSC)+HmI)_YHSLnV:hiH-07?A@]A1/FOGlHkhNX@7R.mj2%o +.\j'Z0k@/LPRNX&ij)6:kia&uQSLpg+++5O"BLhk-OO4ghTkoc;%>eoBmuN3cn=t>_1n]A^72 +SWGUpA9^Y:a(RR/e(,/i;a(U^l>G2l7+R/06T:T&R>;__5KUa+7rZI=2F7m&H-m4p&BQCVp' +(I&AlQn\u4oK.h,LRDp--7&=k=*@nh7)o>'ndX(s%Y5JS`Oj*9W7DmDu_,-n.C"AS'V$%c$2 +"p!>mHnH%,Z5IFh?aOB!l2Pa(ihDm.8'\^LZW?K3N(F),Ub;&;RL_KDp:P$q"\2RJsJaQ_i\ +@6T$Chd:JEd_bdEp>(P#o`3p!hs!S;TVq/8c_QDi+WH3K"E`YaW6djSK=3,nFZJ61Ss=1-T: +DbCr1"'XocOr8n&dB5XZX^B-5M]A[LZ/oDF8RTfq:b<.T>)5^W'(]A +QY&\ddT^mNk_8G@>%J*df,VcVU-G8g=O`rCs_l2#C`Ko%@K9PB+OM0C;f>,M^)[n.8mIrh\& +JTml_WlD6A%t9^_*N%gH2I"NNfPS0,rkq(_<;nl.UT3.j##!,Kq*)XrS\:.'H5gGT^ra2kW# +:87fl8@Y:QYC`NKM;$-!:YgG*?5BgIHf-ca25B7+@&a]A`_"?F!3i^r%p%#snXY12QR./X%Q_ +T*Qr(mAj]Al*_Net)R=1iNE\&ib'tl>]A]Ana1$OMZ-[*3t<22,V/S"$SmImEMt90Ad+I2k;L>! +`2^T,!D(_`a8)E[L7^8Z!diZ1mVf2`+.fKJZa-6e@$N-\-PC%WoX:h0<< +_9GadqAp:`eVC#5(RlY[%rT+HHi>!UJT5BrkY\kJ$01aS;\8ToGo+h*NgXZ!'b[ku]AsMI*i0 +Sa9/(8YK+bD-5omjsh.^b,t0egY(N&bn%epF=('DCtaCo4!%ObT!0)k%trp#!cVg`dim?Sea +F:L5*E9/^-.qo75eb]AR(-_7cdW*IEI8!Dg*Ic/sq">EHB>`N\5$ldd`$)mbCK^gTa@O51>-kVp&^.b-`;27j6bGSBp=d'9h +NtKkC!*k+-f:8e%A+%WH>dJpY\KRX*t$H>ok4IZ-Te1*[L^&H-1Voem*UN%NHfg@@L.T9\JN +QR/:O.P`6=K7aiZ3pUo!)R)?LI$?kLQ?,@j5@i-LnaKnXb%pIA7e& +nk6*3ZE6+<>faFi9]AW>cpBkN]Ai+-"ZV-O#CNaOIC+Du66oO?(KBY[jP,iOi*l5i`.)D!<\tD +DEr9aAjQGKf,cZ#kY9_7JF.e6+1Lee?jUl%5*l!Yc^9QUD16Bn@PTM`Yq?sWTk,3%m%BP1q* +R_XIfWPZLF^.U&L`18RK-ER1g^upRUPZg1eEtWWed1?1Kf5rrIpoaf6bEkW]A`A)]AR18J_JqJ +or3Ek)Wp2KT6Z/7&qi`u,_#$+haH7IKl:`$AK`7]AK,tgTaRjZr54^$J>+j!'2NA?2+tEnajB +:,$"PKkR?0pgJP2Z^qLVdN>1Re+h3Ft>+k6P+j3s_L`&(6n9;Co^$EbCHkn\d<0'g/TguDM% +GLL3Ls5%9EE0c`d]AgC+D$.r.si$W +@$1V-+@Gh*SJU67B79SRhcZ&ZJqB9_5N?LK()lD:ae@9e,usk?Dep&4U>V(=ms8jX=-LZ=jA +@DS-#I,u0jcdm'*.PG_La$kS.-?%;o.$BOXbsX]A=:\]AnJ"Z1s)?AtBJ(R]AT-kFL1Qa./VcEB +^B2fZFbX!/S!]AIgl[%7$>CUbJOQb9E)8)O5S"H,Zj@KO.q'6GeFe;5sfR6L +_b\iOLcT6FE%[ZX4WTEhW$RW/KUMZRgAX,)3,/68:2-E/ +['j86E2fpH>?1^COC95?(JI5a_=.]A0QNo>kg]AgcZ(GHea!=rOZ`cIe)a^u'r&P!pTE5]ANgr* +:Mj\e2'Ys,OeDBUR']AT:n';hPXij(Y,HbdrXEbL,Ua.XcbR&:hKUTc*n71QI=^[jnR:)5B:N +L#*>''l?'pkbY8G@rnlH&D8i1pTn#$(&b&.!\/0A#gOF8[SPq9WO/tk?Y65/6O6#(f36?m`& +c"oTo-(>pJ1b=kEid7bVl-G>LV(/+kc##CHdRs.UB7n./E4Kk#[NHH\$RF;kcSU[eX6;9ZI928'?Z`oM?-rdq$19 +gVgPgN2I9mp\4?$g:_9IYo +WTGb^-7jWQFF-P8oRs&Q]A`q"BRo4;BsH^?/(a([I^t#+(6'32'$Oir>E\M`p1f091U,;QBYMbk->UfIa`Zp?/3@O:MPE4B2ep=6.hE6[[IS+TS^eC_\K +S^.pq!mTVc1/*@0dt8iE[*>&dKa91j1FCt.;X&@P-f9sU\#Om'Kl>f55Jd`F6u'gP38l&e%i +1YqRX[iS"^FZJ_<:3j:>tAb7e>memm[,?WCukcQ[+bY1<5fQ'i2`No=OGc4RoM",:lVFT5RQL#?NMl$]AfV#N"D+e +]AA0H31*@Z;WS!$;*(#IMokjV$l)dS+,aAGSD%$2Yn8N6l*C[@@4p"G8N59EMcc2gPDCe86S3 +Y>T\[-H^;lekWIKD+Cjl/Jge<5CQe)`h+T)\-QQ@5+SoGdn_mX3`\f9cdD`$t42>F]A[m?nmg +kg$-5_X"\FMUg2_OiRl]A#NZoC(b=2nbL^u@G/8%#lja"DO2U8p;2#W`UW9hI`#CRIb>X?bs# +^,[3)^N!]A#_cQESmSkX!ip%rNd&Ft]AK +.E2<;?D@Bu8]A^oYR:<1S8c4ss"#Q>,Z(ibQ(1il@?]A0V!?V4,$IdaPE^_g7XIaO#)nbW??d4 +-#W#c&,%a!GapVnQ>@Tg#u7+B[j>VFY_2ENd+2ibEE)>jk?Y$'[60`kY#H4]A[$T%=N?:ul'r +/>YDjTq-^_:b\:%>C'ESl[r+bg9",_9:*\`A)K*!;&j47j%E,JBi1:)F;1 +#E;KA9ik:3#g^HphQArV(sqF%BqlEGHSMZEb@9]A+n)$o-3n"n4:eV##`%\g3Z;!tT%k[j1S! +:@L-:*SRc9+DeqfpsoPk0ugXO[H3h]AM/Q1R3m0erY$eo"RART76cHO7idDG-"]A7Z7ec^$K;8 +;7+VRZ?:^eYM?F3N[S!^$A&BCI-h\Fs1]AY;RKF!Z)b\)pO<,WU>Gdm3ObC; +1Rm$3&I^e0V.\!*T:Cb/P2)@LtE!Q@GKU`gT=.j?)?!rN!Us6g[()Ztun^Wf12r8,LC2NQh# +Y>;B!L6%dqI/u:\Rs0":UA3X/FC8U;F/1/;? +$r)o)IUoiE-30H]Aj3?Y"b3(90@,\C!$#-A&$7?0'LU8>CjX\dnkXGF-8o(l_nmd>t,V3FOr^ +i2b1W#Em0U3pD1nu,taN9.=IM;GbLSP@^orB`APF=WdKiDPhIQ;M1c":J^=`aC=j*ui?:=IG +D63l=5TFMJ,]A@+_13d=KiM./Y8YEW+der\*L>dm533ks;]AP5TLok$LD^%!$YgK-UDJLGaeja +&qKXGlA13:KStoaL_N!H='tKi(]AqF>&eb<15N1dBh;92E[T`APko6?Z&Cq-#`QM"7Ao;&beF +KF@,s&uEf<1;'Y]AgE37B3H[WoEop2;pcHG$]AeF"-9'X,]Aq:I\W6\d3]A-.hIAeT#V`-uZ@Y78 +k[s&HWAsOT"JE4FcCTmTJ;UuKa2O&jVC/a?0;6Ik^*1EI0M\G?!\[_;C)[Cm\PhrA_AJ0AL> +4FfVn]A#fV<1aB;%oD9a#\Au&=8hGmO/u(LI3IB.o(WP*MT1SIYZr25Ps]AI(\Jd^)8``LqG"X\V%;m5 +:#G-.GGQ\4N$,TkXfaqQpFHo&&12R=967H0dl"A45uAi'2sGe+;fA]AAbRp]A0%.t8mC\RSt_n +&*I6iNM`,)X0V4nODM-KopM$B97YZ="6']A,>M>YD]AmCMLd$b-RJq?E7n:)MWJh5M`t6Dd`DE*D0]A`1.j!lI>;YGmbM0(V;nT9c>79/)j''j^`%? +(?7HdT7-u_*AZBRYd+'PaHuTLh&;CAm1D8a35pjA'7[\+3V]AHIC(G<<]Ao^^Ln`IhJXZDU@(j +M,Bqh#p9sR*76pO:CJpY>3tpRf?OcT5cX]AfFue0((Mt#/;sF +OTiL=oD!Ka<_C=WZMU-bl8+o0?i&IoWF(dh\#VpRr%\/k3?K[4#\o:q/E1a?f*=o<*^qN +-W*&b)L^u/KTnAeO@50m.Z:P)[D;+>Ql&<;IrH%pueZTUh^)M8]AA^&n(fM4Ck%UpK;qRj:XE +-Htc'&ECRp7ak?j8rCS``rHV_,P9mAH1CNZ=XTqoh +VPUpfku+XeKJL07&oEp:(oXK2?r:N<(I]AfP5W\JKe6_;XIgTpcTu#6#`OdWPB0N`ZiZ3Y=79 +#F%MgMU$D]AfgHCXg>7*g_=jacWlmLh:!@L*.Xu+=d/2G:"F?qehL, +LNaiJ6/7Y=7pQ##ZELOWeoO38C$A?JQtODVUg?e]Ahh_;bW+8gfF[AV-2^12@Sia$^oGMUg"\ +W(7H5hOWoqV[e2rKra>7V6J1`ka+KA"S(RIe,#QRF(L!7nONK`4rhm[]Afr[]AmtJ#j$!fL^$a +8[(W6%NbmD'%,6hMF!&lY1?2^=J^o%PU@]A^t7m7L>J"=c;GC?.DdVpN2mfBQ[e\>iONL/M.j +Bg1RoSJ=r7-2l=gUIc`sdNSN4HQl9&tq9t)@n@J@^^B8[$(uNU0D^-e+hDag`9+Yk'3a^fU3 +i9.s"-'(3S-IR.C!(-c/^^rPQgr,91I./JPG<;BA5@'#@b>fPVDkr%lT46-SdT:4OJVNp>L% +s\`UF0/A[H7@3=lb%Y.G)$@KS^mQJ:/d6MlVjG?gYt#h)XXs5RnEijLCtG.QCVJ6q>]A%p&-`Y*2$mc6ch@CV/N-$*)Ad#`.)%W+:o?AbgA0"2H!+Mi+MGgh%Lh"i#DR/=VW:+dBHP>kO&>L=2ILaUNC3o.\5f+TXo< +*Hu:RCX@Z&u1O'[RYa3\ZlfG$2H!rU_Z+nVUZ&Md?WTT3oqd6bA3&bB4T+*h5[;E#/D3,FG' +0B4Ebq*29hK8R2k8I50HArT^W5$flLjdX`c-6Sj=DVcG0GD&`1Lg956oZsCtR-\.`kLRs?kn +UA5*m#TK0#iLA4^*H8ZA:(PR^=Z*X,QPejCX.5i"cl:B:NrGSD$'rT2Q$M4PV>KNG6.sgKp0 +P3cAo5F]AE$47_N1=Xjp@BJheG*M\^a0=a:7%)iXI;2'BQDn>qc;:#m;O[g(#'N6#eQ8qD^0E +AFUi611Ost$3iBX:`!AY94;m)IZBUOB+tCu^`9R?4%:-@.W#DI!]AW.Ec?TQ<9$>&\bT%%6Ts +C3(Bm;k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'S:V+X3C?q+<:)X3QR"t=6t.1qj5"pmR%`I%6jp[dJSr# +!^CHgg.NC]A,&^-<hhKQ"pjq!nFBLf8Hog1 +D5^%$8AP:&>QE"[VmPjA0GOJ=(F"9&p//X&RC^9Q4GWn<,u$II=&dP*(DMfRNWb6/q*;4`Ga +jbc\qZk&f:n[ouCs0TB5O&753 +p,MPM1OATdKbbL/CG>RgH'U>HoU:2^Pm7ZOY*9=>Oa:FT5SoRa3[8sEFL%ljRuWJ!]A*7"cN +PBTtQTa@2%?Br&i%Y//%T2$tT!D<123ONb)BPgg&>^$ra +O_5k_1MB-Pm2'P[UQaqQZ,I_`) +ed9S2fNA.Cj)OaT7+VDjdBN:jKZWAIUA!#&,>VmuQc`.f>;[YR\Lj'23r;;tY4f8&OhlC6iX +M;:9#,6spo-h/odFblPTcX4CHiXquM<;so`CsE/r,V3%F^uR%1[BO;a'L<.`_iNoj76p=\+9 +;1,cR<(/Fq@'/1GoB^&M(dKrrZjk9 +qRd-_a7iL-Qs',=LL#/3,)CJAp&OF0A"-aOLrL^E&!5ZLX2,D2mP8apf&-/cW6>2&Q[hNsZt +c)VHBQ'%E$jMRH$N'UeHu3f[iHj@C1.)qURgI9Z@/V*%V&\[JN/06=gjj(7o7ht?]A`1"]A*NM +rHk/4/DehNPZal4;7FP%ruP=IZpiS)B.nMo0GG4@P;IC]A-?N(0b!p"ne(olHrEI<)tb:oA)j +1AX1ug7bt8KT$mZ'2c)CQpQr-P4jOsLe)c?2b:Ka;!jK`FnIT`Nh\^n.A`5Ddr<)H_`"hNM) +/t5M29_Mg*A?G-h/G(k'__e`Cf +r<\iUWoH^G1DHYcu3VL`Bp%G!#Zs;^-GI9g(4>s(8Wl)H\(5,oT,t,UE-i"E:hWYATp^SXj%2; +kUS5^-L1nE[[M_o[cW%`4`&D>d[(ds4u.4OFeE'ir"4;iqbjiUQ+EuAl,V.LrfB=o:M]A3aZN +`S1GE^28dQEApqL#Tdqs0.8r=Ok9c?To,%^;G0flDcY;cl:FtiGs2,mKD&f9XpMdlX'dUVfd +.'$dnpX)jJV5:$D!L,(Jf".3)eb);cg[DaQcAbK,ThZfbKur`TM>pksfXlIh/`jUM-(jWMp= +<`Y2&@Y#bFpI`>i`ROLS&@#O.)rgAOkA'$Kp5$:?+Th2`5j_dqs?a="Wbh+h`Or^+m*^XK:d`q"P3"%p:SF2s8j`c\Ze4WqKUgmdoeHkTth^%c9>DnQ&Wb5NQfo+cB@A*;)NJ +.Ooc7i^K_eQunb$%+A1<@e='$oI7"Tc_^?'h='Y1;@J*enk;2=U>TWX:7BbbWta>+Ve(FMZ; +Un[s%UN=@XE;YAc`qlA`]AV+c(*_M@'.'HN\+jSH(R,aY0WTDEEN&dC+;(>Q/@:g@[8p$aPh? +uqYGN"9\>E$q32T!b]A3?=\GSOa$+R'm87Xk\oK^L;^[dGC5uZ=nLJhqEgu_#C`/rMP5O=;0( +jHkrCVO!b!o-V_K$X+5S&:)iSgNL2>7CPEXZ0R?.HrX2rX,n.267H3IgZ0T3ucD"?m-dBcC* +=a0uAQBQp`2!q`RBibj.n5PcM0kWiDr!hlVTb$r8MJT7/kt1e\TQcZmYm3guB!J?^g8P`,QY +,)6i)oe'\YCTno$Mj_UcZqm.jP9+ab&GFB9D+b`-R);Fl-;E;;%p2AZ%eRM;s$V3,a`roX?' +<5=eJLG-dVt78UIefC`Xh`\9DlE^/,j"T9Oq^[ljP-W['3+B.= +I(i@IWZ+PD_5LZ@=5c[)TZ$GNc[d/^e9KOa$2aoI?nF0bYWhfcbVdt+*"`-f4kaE2-EZSmK/ +RYHA!gthsr_a.k:OU^33KSSdSgLk;6i*F&H4Io>Ed#<^WciW!!gFjZ*=Z)C!D]AB:4@[UKp& +"#NL6`6H!UF6S]A*&'<7E'$c+t4,^=I81RZU"kW;@l56KH&FO/EcZM1gZkETb2b;\+.+:5#qt +gX#u2C''r)2c:&J_:;?-E)9+)n6OCW<&24l[#EY``(+\A`+m%(`4Y-fT5/cjRMqI^EpO_Y]AY +7M]A(EsJ&JKI(EH/?sLi\SoWBaAjWanFJ&;Q!!TQ3TS>XYd]A1;&f6RqnRY\.'c4P;8G6Z+^)u$WZYCT+NA>rW'-=B&EX-J?=ZVdlbHXV/@bG/IIkprqa4.<93D+#WdY('hL-b +^Q'8!e!m?eotJAR;A$e9krLY%ou?O.5@CCM,kW=V*a%qL,O>MJLNg([V(hiXaC2tCZsus!?pQ) +"H@!K!&bs<0mbe[`e;B5@YoI3IV3lun=::tdTR%gZ`b4#(oQsg"He0#Ne]A3i6l.PYCAIM'poA +t]AOc`DCI\6gW(/>-:8l+1L;0@fa,@n;LQ#K:#f$j:Z)hc.crJPe>+blO"fFZ5EoN!5P;oame +=oS'+$]A**PUgcOq!8.&*4jh4kS@d-s]AQ+0mL]Ahrnm]A9D[tD"u6_c*?uXnGRu__B"*Tq^")[& +?'')PorLf:VCX.=RDqXgfRTbO*[(b0sDU5-oLD5r5oLQ='/_1NK?ek=]A:n$BIEt +X<%R[FP#e'roGd@c#q]Aq"JB,AGH#[V+9!G]A135M@QS/,&rB6-N=170'(++t!fN%+c?G.K@#6@@Wm1rq@5 +\tXW)UX*R$]Aki1r=CRi"nR0S8jFC4`tRRa!n#akj`:L2*2V3Hc-W".fHY^0Z7RhoIhjHL.Qe +VTL3G(9obS@X]AfB]A!*YL:qeJ"X2H3s.7R$Mp#Ft,N9BTt<^o8s+1l8#CA=g9[o*i?W:[5^AK +2KFmd@gZp(:3(,-#s'ug/''<(e(1-DNFLaHN:Y9U:(+b+ULK;Yn#+)/:?>fN%g#kpm'NQ.TS +".Np]ApHXO5P=cWPL`*62^obS<0Z+\i.C%/`@]AEJ!)ZkZ]AfE,O9k=.mX8VTX:>s<8a508BP)k +J[rm3D/A(4SkM!&@SuDJYa%G4lmnU^:MYqe>sEFlJ"+`]A%#]AE(Lso4HkUbUcm]Ai3"gRhP"1e +EDhk;"bH[dTcP$=Q&7+.GB&Xq>o(1s-I,$5qT::g#&iDj\ab7b#LbKO]AKk^`-.J.5[ZH9d.? +W\0%Ed3FrW.%[`/r,j'HPef=>/*\QI=ieG#me?*L6+'\sR@lJsqc);i,bV9r9`@6\m +q>2BMK_dKo>$X\#bad-3r*GOi[N23%G$clWk-uUK")k++W1DW]A=jBLJ&_qULs/?4!u22 +SI,i595/amIJM58$\?QbhhmXh-C-K_J:UFI/GOs_J8]A1:ZE@E8*8AP://]A1Dk9jG: +iK=@YH&O,,(,Y'TVD^q%'StQ(1l88o=:3=1.K2G\(dd8u +dkc(Z*e6]Auf2'NMQ\!G-?!jL.3tMSdEFHX8[J4^4=EHFmfM6eE9AcoDtA6rER.\[5a2DL(ig +:eH_C%TD7C0nZ5`+(n*pE.ns[aQpn@iUSlih*F`sIXXFO#-L"prk5mm([YHLH^C9qeebI@.]A +hntq--ake'JOBoUVb]AB,DqME>G7'O,eV.]A94$DFJrIS=Ok^a/&XQViO +8#cV]AQc!"]AirA*#nj$BRid$N*Ebp@n:^NqJ%!r:m\$'&k`;'1l&7_I$% +*WhG';Be6ri!0sM`63Crm&q^uh)t//LT:Fk(Gb9OTO%*dbZRL8Ak6O-3Qqq=$:3IS/K%"%<7Qn&K5^5dsP +@tgF:;"?VW +mJ=*?k1/&2dQgj6#FG![6^>fiW.IH<*h'QfG:2V-B(#2NhfJTFN]A +epbj,m;_.Ch#6(c=GVEB3FD4F=R7B&%2uF>nr,8IWrJ@aL)Qa-B3bW_ocA5+!T=H@IFT!2bc5MY +Y!\LKl(MtZ`\!E\Cdr*fZAB4+M-D[PVKt]Aa0drACA-^aoMSD7;@ffZ7.QMd@EmL,kI?Tg^'%]A5LRPNhhbm"i5r1\K2i<#Lc;t +:uf&./L5+D8X+0*E38r>PYGo(ICsKXK0^bAV4%Wi)lb\K7L<+l'R9I&'4BH=Zr<9q:>?# +4K8Y$6A+tKaV(XfchHIXg.EhJ8KT#eJdtDP'r4VE#OL\+pR)40g$jep70S'UBhgE:dUfO<8V +cq^8MFuf)ES;7Jr_cKO)1)U(1)u3PSV\-uMZ,(D/j^ER5V6`Ns,DajoqP-'@Ae:01TbEs]ALT +^HGL?<%gHN73\JS6Lj_+baq_Ns5n_jmh.toT5SFG+\ZgqDk!E.n[7t=&4D@K77@ANe<%`H\a +n]AB5j-0pW^Al]A,UcU8erERd6:DNK[n>;5<5*8E1IB);ppDS>AL##tGNYC-V7nB=5f@lOj+1D +-nMJ2o\1]A!!BQP1#P8tBmO+%]A$7euFHMUN.7:#?Bmf?%k&plm6+hPhM7L&*tn!g!YsF@13\' +RYJ@ld&:AV(g2ku3gi]AH"Ln^Vo:Dk45#q5?T7If!O1qa#2>?g4u +C%=IA-5'oLK5dZ`V2`8]AB/>AIX4aolQ:NTeWdmQ\a*Ji2pS37(/M8ZIm's7";\R4rI82f0=e +\FK"Oi9tiVU4Y&>E\B2ZrXV0*FM#WH9A$I4t`Tr:Yf3u3pHa;/l#`3?B:QPnjQGC_K3GRI@$3(J-J!el +S8p338.k#9#6K4\\&4H*GUO..M\p'#*t*YO/0G?5O-`T;oY]A1?)Uq9SV&?RDCmM*frW69;=* +J+e\$OkDlgh$JN#jrgI^=9HKh$qE&r6rh)1u*me<`?ujXtu0*;2JH +'7283@'>Ta^h"t<2\Yb`1JbML(GrfDm$r(Yl6`i1D6d1^FF% +ZP9PAX(8*/@`/qFKfMo$T`HlLn3T-WQDhK:.*I8;>+l(.[TA%gkQc[SD&rHN\/VX+Rb)PYZ" +LJ2e'AGJCW9s8.=Ea8Y";8_ZG +(CaYl.mI=-'E]ASccUP*.]A]AFN"Tcdt;tAC.^WO5oL@NGXR4DhHZ?B:AaT@D^bb*Ar!XUc_$3D +l%Sg'`1*G*EEQDHAhm%OY>R+$YIX2IE$%oJ6oD]AJMh:as0aN%U)8kE]A+P\BU!ppWG?9gU#aD +TS'Ls=/fS0hQJNl^,&3&UBrP>s+P^pBO!M6!A$6)%'03mEd*6?jp93G]AHS@?@Zj?k1gi;oG7 +T?(Or4^gY7XpllX"66";>%*,Acim^:od? +h-\cEod]AhMHXls%!qmM:oEj:sP$X+@fg"3sKZbYbGXA*2:Y$Sa6F2@HBHd3g)-TVPfV*SGrM +?o?-.+&o&2"!,lD3W/9?FDbJJ1T7eCUsVl/dIle,OE;#s*5#Z)t<3P;.+OL^4CjJDD0_K1i'aS)ffV,.Co; +T5D[7OYO)[Ok80.U4qa(#B"!b%8jY'2CAD?8j$J"MV_@K>dQ>%uT7JnN_XuL:p73D"\snTcH +Bk/d)`fMH!G1,[9uuhSI#4"!HLS'N-3SAZ%.:g40aI:mBC4HEZt'PV@tPG#.(uR_PVj;+sln +a]A]AppWdM',fiO>I^QR\p_6!kFH1Yb.3&%B$>puBKbXMc!dQW2)TkeZGTq<;'CF&iApinkW)> +eH4ZkW5jN98NI!cD/rgJ(T`EAiDYB9InU\E^R.l%&6Jpe.=GQbQAeQd;:PoeadD\uHb:=XZL +l!RY:cdmj`gOGRm7l66G-6k.dT@+0YO,+le7`6[j%.2H!)R&-b`O^hUC\B1U$ZI0+&(SBV%_ +-T=UV1Vo2m)JlH1EKi+(u::G82`fu^0C\YY9!]An*oIC^K>5=@AI+-'P[J8o3<(%6re]A"\8t5 +ZL*^@T.`*j1\[6BbNj9ab6)/3gRAt93^5HRM)rqtHL4#e7^AiC_AeQ4/PD>K_24*eh7lk]Aj= +4hbdB`JAttTkGKDg:'JE`.Nu+lRlTU1k(%Y3ogm&hq>LE*L6[U&R"mZFI-WYe9s9a@Qm@o2P%OGQ\-\A\0u"gerSC$GLu8M,g$.=d"klCg>nTLs.-iB +g3gWNoQZj +'pA(14XL53*7r\)^PI^T)C=B8&%(e.$e*Tr'KQ7lQUj:]Ap`oO#a\@@Am*heJbk:(XMb_Jh>\ +]A\O:?W_b!8M9l's$9Y]A+i3W8@t-i!0DPnmJW+/hqieAu74gY5?%/!t8cN98[hI(jtCuBYduH +?[G!?bDJ;-SUbdHg'D716t^^m8sMlal7,f/B_o&F>_kn\'3'k6W6BO/Z/,hBBn:79eR&gXDF +@Wc5t"NNnV%^5-Fu.H(8g,h&DKM"\,Q7X#jI,04@?='UE9[]AX`a5;Tsi6u=HZdN#2`(fA[PD +Q>Z2+j7_DFJc%;/rMIbV_k5mgeN;=#are()Q!mUXrfKhu+\\eEZn8n@6Y>+/C?GmJ+CTH!5Ls8joMr]Af9OR4=b_?@UK +Je9$S`a#$os8F'Rn00&9C^ms"K`4`0j:6$c!XjcDS!ak$q+hH?o&^Y'Q6K[7- +6HT;)Ic"K$[a5jk+,NmWT8l4%mhXkhe,SepQL9a.l(urF3u:DdZP;!CfOC%@)48"*[VI)lN` +0C>PNH,?ZuuB#=c6YHma*MG/955!oi,0>oQEZP]A0r>L/4p2HI351up7-M_Gf9MA.V-@D*Q2p +E-gW?Fc\[`Q)!'h]A.J,TgA3#2Y)I1kJ>;4q8-UQnP`kEdaWJQOkgZY +jSNYWL9@.aZQ0Y_@!G;"%<]A*8G,3'ch'32+R6]A5m8bn*A@c+.:kW)[n^)h';1FMs=fg:*/:V +^\tk'G>t@o]A'^$c6@6q-RLm%D7RfE*SQ?]A1f.J?XK"?#"PSkc'o +H3[>i +[Q!ar^o3#bnP-En#J1@IVhjR=&qP&%;n[.S9^!\Um/_1sTsnGZfUfncb&M+MKD/6/GQ2go\G +Y=i)uu_;/QW@f/<%P@mYr2gp9;SXS[]A7!r%?J]ASrL6c7Y_'#A=D==AZQKo9IdoqH"]A0#d&_9 +FVsH%Wq9>..&7i5a%#H1@$U\CG@GaXKCe=GU&h?s*_o01+W>H4!bq[G=2eSM8Gm?3nlLl*FR +33SrU5IrTi`"Zt+(si%Zl;MI<-eNnPdlL)jNq_"uHTS'ON2#2@PB/?rCr\==;?C/7LK=1Y%& +r:]A-h$fKcD$\:F_PE1.2[P+V6C_&L60apCV\79r\c3^U3o5=^@(VP-1^Jsf.T`u/3OVAmM$u +B-BMuQ\QaYJbn#9)ISg3R^`E.S#,s!7<]Al7+RqRjhd/'C`N%M.'L:Eca6[LpMU*HcNGT[jQ" +1.[rAU7+$'nRe=VaT+K;n'`osW!4C"\/aeMViG&lD?5>'.pkaf_2IdnknA$-eTb(P/$ +IbQK[I)E9q+c+?4-bC+GJP3ueGs&BBL)apo/_:bPNe*u07Z7J1$S6/bc:7p"9lGs6[N/hitB +fSt9!F)rRMHR((VGr.Q#PP%pEs-)TVLFHisc0_Y*KEg6*\NC^O@3\g_G^'Pi"[P&`fEdqQin +7qIYTZp3ee*"9kNDTQD)L\5pRMU5Q)GpH&"TT]A"I.iG$!57GG'8eu^AAnoaVI<,aiP4&!XSC.qYEV]At;nXio)UNCELZ>IN>-b"),eBA0&]AW" +>+1+Stm`aK(c,;B.QQ7"CQ7VC5:]Aj#&R:hYh-V_=lSC0H!c#3^4aMX)Y#St#03a.lm2\SKMs +DqCP2T,qET/<:78tk^8cDQ'N#ArKe;cPF-,V5=9Yh%fMl3%f'>R)`'ae#m_eft+`B8[XZd)* +\9)_R_^hNU$kVA-^XV_Dd)E9RB9&mf- +me1Y@]A*R1g2VfZOIR^kR&]Aj_G6Dn@$e7ID%"8"B9lRb4,,f#r-=^ZL@XBQ]Ai;QOM9 +0B'8KjaWQdN0HHT'YGs=9Q/6UeH<\OQLbu>.eZsq^02u%O"PlKSs0Ti&lVd!ib+30;Z1*0-/ +#N)`:.#KMH+cc:7FNWtoV=+V3!KAl,'fcY2O@u!crt4&20N3^O*g<2iBj`FgmQ9@4HQU7U4- +rZGKH$6"m4Gm.@?KV\fmth2_U1hH?u\OOmYR]A8k+%HL,+J)Gd+AZ&Z/[68DBY=GL[%ug8SV+PcKJ&qblQ"%ae_C8F +<%<`2d"^%`egY0_iV$jL#]A8`2DkEe5&5]A5$!e%PQ;E^fhphfa1OGqN1O=2o5NcA.7iAhKM1) +V!aA6VEQ)j\87?]ANV@0Kdo5OWPK#4O+IE7>2F&\0gCmT[#aQX6Rq*Y@j5dbW,gZf1q,9kT;G +0,i>08'r=XL@]Af1$*_pB#Y'J)if_GD<.9(3t3'8HFLUnsVgh +>JgU4\B\')`n'/93eYN:X<.o@9]ANcIE4#?;j0gl#9tGfO_,s!Vder(+.bPNDd,ChKQN-?%o7 +M7/((db0iSh*\AKCQ*Q1Dsl(A%V2=Uf7$jP(2?-.9n?Bg4j_/f2!JkT#4$*$?YaNQ[rCs5!1 +AcW+(eQDOFMhk-5M_H&nPmHbcce00[[YcA=WR[PsNOG!K49sM4`O0A9SZc[HbKR98bF98>?G +_r'8P&3HBqa'@h]A$iUg+f^IA8A&u^(h1Bd0g,0R.`G\3.@/5l4'0E=".@i#-S2&Y;?sd$mu\ +((kdfV`M/VnmQU%R*4%^U/1nbMfnKD95p?q[WR>bL)[LgWOKfE(=`J/NRTGu(@hMV_m@5$ni +3Q8^,aZ=]AmH#J%dCVk1!:gu18mLhP.NiFg[(>ZeYHhKGr!js;]A$2r6@'d(H&NFA-:X.FF:,647J>EAcA@BAU+h(,XQ4+eaVT? +c(Z#N?SkW69r!DRa&mS%FLbrZOH8g9m3,:r3m@o`1QoOa13;LNWSnRHo=Nt.2hM3e]AR&[:i5 +e`/gIrSDKW@/)5%n4@E*]A81cWgo1//S/Fk=TPts?Z(TM%>=5^%J!s`1Gc@UJ>>&TnO3*I>RZ +RCMqs!_-$&cp#^j^W1sB#8jnC!05=^nG!EQ.]A.DS1DGiUk4 +B$+:m=^3!Z[kl'i"^dSlh-B=$NN8D]A,DCD8n$@K+$_p?oTrMO&nc<2kaROk,0OHP1`Q71f/W +5&(O*Tn]Ab7k9&.m0TloS+a^\Y)jGQ)5(==,G=WC,3"M6X7EG"$?,.,*R`:=*qN:MsXPl6C!I +M+:0-[r6@bRc#K'W.mP3,M3'!E3<&k@j@dLJ6-LIZMOpEOX0^'j)pVtP<[KDj(X^Wh7/*79$ +qc]Au\0s7_kok%q4!1brJ+'@[&L0qSgtgHA,(9aMOh6NS*k1;"oFWrbRcohKu1%]A&nRG6K0,N@0i&g\&ss\u#PL_d9l97[C3[SfDY/i'1^aS= +'eqb6bNnHY<$@&0$cs>$5#uY="4ENB&iofTP9FttlYT3^]A)Yu7b`96d>k1-!3XIrGirqt+I( +gUi@Tfu&NksI/kGQUObToAtI_1f0%EqU3>eGY9Ku(!bZ-fk\VrMM[7p3sPlkKSRa+_/9qmCn#.-Q8!-oCjR_FRdFX!C.\EDK>q""!]ALP +NotSbUo_G'TMeZ#DX;Ls`&+@LA0RCn`pRb9\=KMf/Tl2 +aDD#2g9%S36V;RAoN\_R!fZZ=s@KCFK:/Nk0UP^*XV_9BNh,e3t*ck_^XVe-)TTh^Q0+=n@/ +DIi_IR^iC75K^)%4BRgAV-Z8-FKISGFQi36.WqIXsO]AP-V+FJ/%KjL0/)dAHu/W +;HeZWn^-Tcl)kX2N:E!@5Lj:ZDe-uL8kbCd8[BSF:6q3);$sS#,MrG/mcHC0 +qlh,js8IF3F,@ICaphR5MBJ[1F]A0nnO&!ZRK$G?*!A,OaTTD]AQI +cWS0#[QT_2$RN#X?9GAppRJ6?B0h*5*4p=B.565Y5:JXc_4CE6E3=9;XrQ'0-W;s*D-)9mBW +D/uH1GR3"3>OrauIVZXk3hbuGa0D9& +G34RB*p>p39HDMRRVckX4R)[@MO^.S$(hR:HhI1Yc6!ggX`VKfB!3kN=hhX=STqHKfST427q +fQaT/\VTJj3"V=b&XZHNtKXUP*Fh4J/%YW4fF')>joYP.o:a>+?gB`@.JJo#"Yr;2_u2.FAL:VKsoI4CfWd-=nZ8,+1: +'0L.R!#S[[4.#QHO5)*[Mb7?EHh+=fio#pkb%KO21_sPB@WDI^l2-'?0a74_3_87STg_ +'XrT;u-_c!H(0L6XD2]A^#)%<%_\6,I4?+U8"r+M)R(?!$qJ4?h^@XJ)SlC.Djp^A'abUQ$4W +7X^)(jW>k6I1",pm[emPfE.Ci/Fq9d-3a&!A$NlAS*F>VkhrA.mnYq:-Y8&!rRj\ +Qmi^8WqS$FpWK8*,:uTj&'.qBK%?,R)AgJW:#TnVb1$Viip\?4\OuYZi[N[" +H<1'D^.YkG>TN5Q;Z0&t]A[r\/1),JJQf_YkN5^O7Eg_8r>M0=V%,18=#C7$eZ +%(UlL:cfffW/at/!fBmN?M0q2Gb4W)5HZF(q&;ei"VjkF3`WkRgK\XNp?(CLU$A]A,NBHG%mR +HZLG(p!_^O";;=tNh_Elf%>RL'jJH[(I0\,>R"VHr`(Og1D#j!PRN!"0M#g;Q;/:)d/7\d7/ +?AIE3=FNOf,.V"RVrbKcDf-BP;'=rf6U8rCpja0K.4(D2Rsp?t-$,"DIg2N`Qbcc>D"3:"pj +GG^O.VpNlkVK%X\,4O&Pb==m*O/U=SkbPbZbTtSWWiLolB_P%G1^Q0/L<)Rf\C*t8]A,j]A""X +o'jT*/dL`2NG8t1o[&H9C,@hQ"ae.7<8?gEr^Fc]AHSG8hO'+WMmKai,tU#sP1&U>_-AirP3V +l$ZrpSLBq=j+Y,b+eYSS&Mq1EJdXG97[/YcOMOQJU0L*DKh-1uQGe7;b^S5ZU!XG4RgI#%[I +T*k]AX=(:sWCg03S.Z?Jml0`A&,%l9aS3Y85<$N.O9.K]ANh]AV.pd?lXWY2PP9f3M1!TK82T4lb&I^BsfH`@\OL(JY^o>V5ept@,k@P@ +NH:#+QQ+$3k'DfK>jV^f]AWrT(>oY:qn0/;nF7a#2![beDcM46FLXHu7jQO-`MMC/pZ7^Gs2g +-L_n=?C!5SjE'nI#=H#Gp=>4?F44q(HP&Yl0.T>XM%(FH$a\343._).2I5:V0>AnNOb=1k)AsC +Qb(kcNP0F_kCuj&+JEJ9_F,4I#ln;9lE]AESuC/^64*s&\bULG'&s!qs4QLo +8AQSmVWO)j9&30q>c+E^H3d"hQ3g":HnngrZj@ZArnQ06<^cguupUo`3J#OABrj+oH$P- +lnEt,r.eFEZo?X)sP_5C9fBgd'6:R;g@olZ2'7g&Pf+@3$`+rCiI:aAA64m(nkc$mX[JEa;\YQ[T@B3n@Vbp.c?)h's62l6G3b3T!,")o]AE]AV#$q:9AD:.]A9r) +)]A0SM(7UMK"gI'dc^js8$:\^3^=q,5iKZe_9kpXnVRp"*9dpZe"8`4!:fYGFcc?UDEopTNM6 +J@.M.9L!&YR#:oZHOElbRTi"5PF!r=N1nM&+$Tfglrd9-9'>$l!fp$6^>O7K%6E5D,#Aq$-TA +*Df'\B$.6.%h*lRF%k08:;1E[1Gb]A:7<@F!01'a8#.l\4`?g[>0[!Ob6T"\\90.lFs$Zg?!a +5G[Wr0SE_qBc>ulQJ9Rf:+iM+EXZ./3Js07MhFano@qCF(cDu +HcoWnYbO>&\AV#=)Q_MK\uO!&q^=E.jhD8:"#0YbpD=1MBP5r:V1`Hu0(Ek1e/*%H+ +LO\%P]Aqh`h,+'OOLKd1\jIW+^'D?h6Z[%IY&;(j5."R/MV?T7Da=aOka1O4#c8f6\A<_85N1 +F)+ompJJ$/>3U?*??5]A&755?i^)\8bSB*oXG9D4?bu1%(@S]A&/bq.uTc:7#2\^T1SqE.=2Lp +<2!1'J7?^l!jO.m_tpp]AQl(+B@13'EGM.V32nsHnU7TL&M;"l-Zu8E4H%RflG>tM7C9d/^;O +Y4PDCP.PoWFAh%1;"0fN,i1l$hiN;t%JA]A]AL8MU8oU,_W)U^naKN1.k(P61P[Og.eBR+)fN- +;e4o_A"0RlL(6Zk9(^iErh*j"N+dXWgLH?3\_]AV,RsaO0?mCtXH_s5)@6&(& +NMQ6QE%0bClPH7ZL"j@]A;TT5X`i-2s)jG@pg?\-:MW6@+K4kAe6YlI_l]A`)L77T)4"c)t6s. +1D.b+GlL-^I!Aoik'3br2HiO&V:rT4I6Qs!aAc5::W0Ukdk5D*:/.)\$E&k*@Z?(3b#VMD+. +eu:8C3hna[iW(N9`%)X'C-Z?>AmB6HS^84Ec9\H>9X-dX*lG&&]A8)qfjUii3OTlq+8rckCRM +8@*i_i%aC^D)5S`7d=='er#JV)62n@C8G3&$;2;]A-cqH#B=GW!aL7,a5=3$[1=h`'),Z,tLg +sbUYFqeiT!EnTdO^,s4k*7["]Acb6Z7Q$%eG^gf`EqLH7/it773>?WH7T;j2k4>q%RMlDhdP^ +7o$q+6A.ptLJYhIh*CYu^>!Y(fJ$:96dkP"o39Tjm&MkDs7,/d8YCFNWh[3Gu+Rfs`Ye@^%G +`R$<0's*^ET'RIJ^V&sc\I>QaCmTi9oKq0[FWWTSo5O%ph=:%*U5'J7;8Ou=A=00\G`,sUA6 +]AF%>RjL"NQXLbnO%EjoNu?,;uNLaf7*a)($+JYY,mT/n+>F:2plO+bPpS6d-?`\(O*09407- +p[`1>L+MShYM;5DBhqr9R<#hK7 +H!<`Csf.2)1]AICINQ,N7$`_H6P$Y>+&XE!"4)q78Ko/<2T2:E<=KUAd$V-=\ +bpr9c!T:>FGN>S69\S^2c9d04Co!6m4eJl%9m[.q#-\!L7dA/*98`8(>qQ0IP+NK=2g9QNR* +LcpQ!r_.8U)"jg\H74JIndpd@b!t:laMcsGh3PW&H +^2A-;5^X'C08_hh)"/?8V>MSA0R0WF!)j]A@e55ne#O^ZfS,$fhGp?WP+Stb;_CBF;jJ5sFZ0 +L*P)FB+;/^./:O%Vsf=DW1Zi5g1nimqlH^Y-[3^GU<'Ke\E[9K>5!nuT)JNYFc=:KZg0/T5tFUdM8]A6;-L-`ZA\':)"*"i/pkI@G*6X]Am:kr98pa +-g,fZlC`@hh"VA[:,/silVPX?X,l[QJ<+-+FMRb3(5lJe<`Kt;W,pfTLX8rZJUPbT`YQ! +(Kke+>IiACqfNRk-.e=FVNqWI/eZilPP90p(b/A#,;uh^<"CfhOL*=qUo``r\N90l.,oDr^Z +Db_b1pcjLfoogr!nBiUFWbY7;;51D$L/X`F3fBJ!C#L@i=jZS!s'-^KW-0O!@5+`=SK[3k]A0 +(4TX#(Cl*^,25Ncb0H+RU2<"1Gs`*4c%gP%QO*++4J/<[p9/^[)$[D3Qro.^l1HCA.+9RLS( +3%KB?_&C@[WLmsnl0[Y1I;B(1a\&Wo7+XPFLC55m*M2HC6d,i@p/a$BWg.>=-CaQ'+^:O"H+ +3!8A+C0Uu18T( +bN6^+e3VIj3>FMf&TNciZ/Th&HcDdA,-8Tmop\VD@H"q@Xp1J?RBc5O\f+%db6@)2')F2e92 +N#rd6qf@@)dK3]AA#(H@Y>^3p&$k;F\(cs_"iHP +l4p^,OKBC/o]A%\%+2<7E0*2X%e*:-5q6SHc2>693+hTNULW"K;o*?g)EpjUk$QcT@cY:A@O_ +F'Tip$H:jM;(GdF(9<4AG*B/^n!hh_l3r5p6]AEcX4IJ%e%*bL^3Lna,_;i-ac4C!"4UtVoCO +e;V)#l4+=f*[FNef%n+oF7,1N^*GPh;-&Q>A1G&MfrUb*b`JHIo66J'P-(tX_!8\;f*ZG==_ +K%>`XK=]Au$-n[5WMp1,_"!%`+JEm:N26Ls8`2HX5V6C6:2K$qd"fU?5 +i%)VY/JB-DYCD9YOI0oFpA2JdQmgYmNRM03EQ2+\Ya3VIqn3m3&PSh>tS+=2U`+It#*+Pj#I +\9(>9G=smC+O\]Aoh;&Og/R?dId]AqjpqgZBU6.ie*kFV:8hfEGuE,:A$S1/KR1Mg,3g4p[6 +-rhC5T-)EEU:$;tX*^]A,-UN)pJf%1hI$^4EE1'JeqVd',>aPr(s^-5jF*0cuR?[3^;DUWVM% +LCYqqRth/iqWV([I+K')3\gR9edQ6tu9b"\'H$oUJ]AnZI5E'K +`Q$5h8]AaT[8d+pIe?R"6c[UEichBaZgGb%/Z/A55s*cY'1j2XaE;Rj+lY`o6U)OWM?PqB-Vm7EB4_'%)5Hq'oONf]AQ?Xb'.1L''VT=tW*_Z4^GSXTrk'qJbk=NbP@9*QrsQ95^j*88h$?[ +n(,7SeA\.ZPM#Zb++g[#;(`iQlT3.=5'Qt^gY,]Ahj__3.\i2KYJaC\JqKh">HsE +pmrH\h9deWiu16dd^ks,2^`9$)lOB@J%im:OlS[Q-p]AqK>k05G?=q)#(b&HGU7>cj$fZ_:Rb +"24tVUR(LsM5UF-ea<Zl""'p%YQCM4tSM;6Qka +fe1R#Q@,88b\QMj+'tL[.Kc540)V=YLO=5Ykna,GbT0JTuQ3u4:iC[Q<#ug7G +$a"Zc4Z?(>,92sIaYH:9g_$;OsqKC4Gst$7QHVYW(B0GFddH_:b-)i`J.!HdBMMfi'!kAND#G:h,VOD$WE7&"0o(U$("Cn6Y,7&,MhKEKVnb*OX1C-2Y7eO&N8. +8:OW:g,o$rW`Ac@kq,Cc^i2OPZ<664;gKf^MdjaQkUN0sKA +kX@>u\2[:oV)s^R_*P*"i74SFL1EM#I]A'qqT^?2_d^uo%?QUm,MZlA5%H:tJ!ln(O0a%e:(I +%)sLs@74#Gs++/l#F$28IluEp6ej]AKl(Yo;\^gL;q+*35X8Scmn>G\2#(cg!>Uj.N*=%9G%* +C7.EISTngkL$8bj"O6693"^2-1HMN^p+d1 +GWo-u-ciVJIGCmI>&_=PaJS`AaJll_Ea$\J:mG*jiW>YMtmc`"jhDQ(QAnFtj+l0pn#^mZk&2QT;9.R9D2I!Ro*7j5q8pns@ +PUo=^T5gXk8j'U:JFRE8A\[bX6S'ujop@tg43B([f/e>Z=e1To2_h-;)`dcV&V_@2-TWFRhtpEPB\t1E`h9D#[3cH9A`NW[]AK<-<`PJjfMe' +[M1hWT5?KY.0@lH]A5_<'@p,chXejOZEsB8NP,2!JI*:C(EIW12p\3?VVAqE2Ltr"/544K&Ae +8Aq,GR*lbhCbg;i^=K4RpWV?7\hED3^A6Ib7!Xld,G9V?&uepW.2iArA&]A<3EF-gWEI_iAKg +!a`1ua)i4$s]AkiC>-VJdB!XS[/Y*6Tk+f!J1/1hUsWm0k$D_oO@.S;>\;sRES2AY"T/Es7[&l4-MEE#5Tn$YKW_hG0p&q*Arm"&T^6_F@M +s"I+2UG95.EP:01.N!Ik+4a6SQ +Hpg%dL$[CuXo.VQ7^S//#(5nW1pAKbk^A._,2T`,cO\:7i1:/;saaqWFYY1(AB3%/^sXtbp) +\+I8HQp&'N]ANT;.YH(U4YQ!Sjr,XT2-hgjCJ5'7>;k5oeEuG*R!8X`PFHeKVXhiZ%*BU]A(ct +g\@!Mg6O'?a3@d4mH'NdI(WQ^bK--tlQQlEeJ=oRpB(>e7`Pc!j68"&u4/UnFgU@DB="o-(0 +IrLq=5[r>Op*(9/i=RZ'kq6g`TOZX=^r0`FjInX'T@3MiKK>8'3-#Ci*q/#`g-2=-VZ]AiqqD +&-F<070bbGmJ!mm!ME#[6uT&pZ7(2XoYr@!]A33%/T@lTOE&ZMAe,h7$m +?[3H")0LT&q[ta)E\NQRoS9%#%o=ei@5!\^LO3)X_tbc,@$3WSp^D-#93;ml'-F2[%P/9TOC +1V;?L]A@7CG,ri?MQDYfK +Z&?F+lTibk6p/`elfWVOQ8^66kg<-&:G=GnJ@TJ=VIYH0/@VsaX`B$-Bt5'L7r9)K88<4S[s +>=J_*S^VU73+O&P5$JO4H+.63HqZEjI[s.<#:g,1OI7"ZsZ.37_+dnEjS+=Y5iJfD]A%4`NsE<)bMp6e1:3=%i=Qbm +oT]A:=7?/LIgRPX1Gs<+D8ji2IPdVF.")&J'scoA6Q74=PphXOpVB/F@6gDZN*74bPWh/lH1W +Kc!J+FDLT@;Lk$VE6'OEZiM2MTeBOL<0Uh!iFjR-0[c11),BW*>I;,Ys[8@o:UI(3ppf-oJ: +#9"8CjgH6"HCE%U-Pf3KYC>IjRq]A%U`[0OEXf"68+?U,OLJIch)%RbSn!KMMcTo+nO8HeM)< +g=9O!>hq?8#DVNK0%MXLCA*msL8DOL)[(f21FXRVhEY/Z`798ca2e&"PC;s1b&iHresBePX` +m6)7c@iEdgUHiP?jl#NM:RLLOsK'n +eGVU#!NjZ0?a#S=#hZJJDX*D\dtT0>qJo[95rOlWqK4MJKV\.cG8mOf1XmB;8;:$-MED#E)49PfmQVt``bHT+2,8O:M47PhiSZTh^h$_ +./np?Tp>gG**W'iDmX$V,l/]ArYp^\QcFTIol@qU43:#-olhlA6_QlK-?sV;K(3LcJ1)HSU$F +kqo/8Uc#,SX28D8[5MdJBHF+1$]AfXm&*Ud-o/s8`VI#AfcVH0^;O`O:fFCR"jTie^mWNK@E@ +K^7sGTAEn>UJ#!_mC.iUQJRiA'TC(hg`5N?dVIaV`k3Da]Al3JT+0W=OPg]A(r +ZN9c3g#5]A]AVn;j5!AaHI[n8qF#^,+&nq?-er6T9n]AW>08rc,=&dHk?/.p4klVO*TP!3KiF&P +LS$D*KiH^2iq]A]A&&7IfUD1&47S]A"7Lnun=",08TLK%2Da)`!q1V!Cf<<^)l&`0P[)ITK(Z"a +,p>7lC98cu>*KkstR/gI?+7FA:Z>%I^WlEB?Wrn,cP4"`N-g3elGZ4U_-Vh,,$b@jlBF6$kD +n^$;IFkh%`C!TU')BO8h]AE%SN8U_4Om'C6WHB\dUUFX7J9.4#9:Nu6Yt'@5/f]AG_]A/'GB`l4]A%.k<,aBk3f=6a&al +r!?s655SeC;DLT.EmAXcj[-oD$[lTB,%]A^HCN;IqN/3IWL=N&oK*+@"Y%QA$Bk:5_8" +OnCBX`9V1*$G]A:%TQDF8Yqr[YSXg)3e8#h,(^?bn%dZqo_E)>k1SuL&t!C;\JaM(apd\`u0n +07I+5JUM9%[AMf5Au,YJT(`p:%h/:fETeQjS]AVQVr6Pt=SSi<-P>[0kLW)%s%jS1;/2_QV:Nr"8s'TJ&KK1:I_l!C+t>?G^D'0eos3>ei; +cN&jIKSuLO2H%A@(/1,C$3Q?AOnIq8p0W1l8qoK-@_So4hjtnajq[i=L4Pj^VDcf'3@`V!*-k%r'":a%nGa.-PE8.HfO/%'Z*nCu9gSpV2frcKofR3\hX:P +8[%VEWYOVo!XbHWo)^`!2"HhA>k+5;725CLsZ>O*]AcY1ieNi9'_kF,tN:T!E<+;eFPsI7g/n +djH\#pU=62H.7b_[gBVT3E^3f<)N+@j^CS5U8"Aad=6\&2Fq0tT<+$0rm"@%io]A+fjq)2k&" +:_r\q?PV=]AoIGA(3mN4F=b[g%Q([MQjbs0\&s!W)3?C\udg8=@h@+8*j6TXk9_:RL[1g0e2+ +05aX->CkP)0!RmIO6LD/-(C%hJ#rbTncF>J7\C6Q9Eqgj!&cu^*Q)VCu8,Q2co9$ILT.h;H? +af;KM#<3a1-af1i,`Afd?MNArFs_NVrlLWT,840hVSIR-u5W%YML2hSBr>)H!GfGg@CX6P;O +kXLka^Fpd7nnE/$!pjCRZLiZe;Z%]A1mR23I#l(_i#5V4_V-hb?61Grh2cBfuhiFr&2\mie1J5'M! +tJf<9*rP!&!XA0^ejDi,"e:5R_RbH1#P3`Qc(t+Uu9)iaVf&c,"plmEPHuSFA\^@eZMg3(A$ +K:gZI25XYCrm'JC/58B>QUdH)V8&8&-<4"fYBRb7)Fb#u9)nl9]AlP]A:tLoDpnnG[gX.BD-0%joDW[.[]A*Xb$92?#&?!&T[Vi%RHI@X;;)Ri!]Al!# +SI9gFP9h>V=`ti#T^r9mKj8LpgW,$[_i@=dpX5H9A0A-!-(g$eTJa<,>"G>UT^[5kfk"0h,! +K\J-7ZC+Phb">@@T>@tPeUG[Ue0P#JQWSlOliU/<=NX^i/+$@dVF?BDnJ*ptT4@j +jf:"^.<_bV=>81cADhPB(W.mcVn.kE[7hVM;9mLR:t%fS`lVe#Xk,*#gh!J"DILV3Ili1d=T +9LsHr+>J$ZHlZF7XM(!Gd4.4+,Zq!49i7:HU!)"Qr,h0lI2''f'4@18j5Ui/$/@X*F"8bO+_ +(5*C6<@^j]AP_ch:1niman_WjmPC'?X?da%>aBF:0]A*l>8TiA7NL?_!Rf%hUW,-i>R\RG2qNtKoHs`R7$^T_ITi0cJ]AtGXo4pYTP-QT-Z +e,6E.<5_2CN^0iFoXI6>4eZ3g'*RdS1cE$JMiL?tXuq`^QhijW?LUf'_&q*M>LD'*`TT?>YY +a&r9HY2sM(0gNW,URS\KLr?VY"'u!i8`f3U&?b\@Pge1At[DqTC5;+[..%^7-apdF[Fs=N,P +O9IJ=(fm@[7_IHIjJ9XP8bkZNfKMgCVY\m1FZs.j71[0MGdsjkOHn75#]A9$C2JuU +M4PbRF+AB]AH+:E&l#!O.)pHa(O39o&iP[+7.=%?E"[IY-BK6R'MKQM_8nn;cqj5T(VkJJR@( +pY1r[6Z`[]A?EU!c8OQ[Ki"eVm[l>dF8o^P5#P.PO*@BgA3T<-@?Rg9 +*"##XYco".ZZ[(u^^`Q'&kLY$XjTN[Z0PZK11JN='ga-i]AEe!qNmX$I+mkl!?#=LSkc.GIde +o@28hS8aYGX.sc;!u-YCj/k&lN.@Kf4p67)Zt3;mRE//VQ'V#AJG+GXBiGt)?lZ`"a^H-OaB +eiTn\LjJnRqjq#^YEVTVi@sWtBVL1[JC+2/OmE6T1HrSf1r8EN_4&)`(1"4WD1"c7:KLn@&t +IgU=SNJ#jPi]A>@>%gW-O\T.D!P^[o2-->17-28EKq1o4X:>h]Aa:/dCU)+QA(5h\e*e-WHZFk +j;OK5^4;S^Rh";1?/0Wqi>S>nG'.-0iu#)YhP#J;/u#dSLmPUMI`ql0.;]AMl3Irf>4-2>![es8)gs`.OZb1TaQpm9f,Fgq7ok. ++9[N=\>I_^IVsojgj:0G144-'@SR\iH;?#<&cimthFr4`MI;[L:*HcfKlDMEq5i01"g]AlBkc>Z>'pq#Pq0*Z$3eH>fA),*R1 +C_@U[EpWO+["25s]Aj?b0(/SN9F?bW=rVC>VM*K";6qD0:CeekR(@%e@^I`[;"o +R,Vgi#?u5=D*FP)^4_M@qgPHYQ]AsUg6rqO<*>PLr6V@pHbem[M-FUic4A>)-'[<>Qrl#B=ea +`p(]A,*qJd3(omr\*[#\WEmE=oho`$$0.]ADPs\HB[I=:*JPC\:GZR`9:!nXP)@Oo+dlQcD?rk?Rd4u.?HV3$h2;?%\?OZs5!iDUV&)]AoU +-6k+"/2g[=CHTk'#eAuV-XYZ#9=f/.r9pPUFl>r*#4*u@kZHBB%bgs7M1Rm?,2+A"^qMRCW& +"\FF7W5nA0Th*NgW&S_oa,_G`nXY@4@`\t?tl49?G5WiGgjsWH;KutaG_97oXSb.A\L%>ICP +NRp*,G>5EIm*Q2tFGFagWP[m$f(``hBq=>"`T^#5#39tSM=^'MI?!V``ukT>t#.=i)V\r43 +MJG-+p.bAEnJS$3H(48c0:iO14LH:%41/E\P5Y'Ie4BN(8FI?6QmDB<`AXA#&_T\Er+SWUMA*oRC%B5(.t4D2$ +*slA31POKo+5/(,$*gX!D7HeGKO<.N6X5d*;NSE4H3Oq4/8c[fM,&GE;+H5l[:uZ4T&]A*`uR +"T$[,d6]At#"aP?ru/%Xlk?2j_7.T05^.0qDnf&KL8%I(gp&2E(+9*74BrlJ +GLVO'p/;?2"_GNlJhg`6N9$;r>F<=0MM2iQmXpGDM,gMA?`gS0]AIZX_5N/qp`JVE^$1+P6lK +jS